iPollo Posted August 24, 2020 Share Posted August 24, 2020 (edited) Olá a todos, gostaria de saber como posso implementar os conceitos de OOP (caso seja possível) para o scripiting no MTA? Por exemplo: Caso eu queira criar uma classe ITEM, que tenha seus atributos e métodos, como eu poderia fazer isso em lua e aplicar no meu servidor? Um exemplo simples feito em java de como funcionaria a classe: public class Item { //Atributos que armazenarão a posição do item int item_POSX; int item_POSY; int item_POSZ; //Método que retornará a posição do meu item public int getItemPosX() return item_POSX; } Então por exemplo, caso eu queira adicionar um item e pegar a coordenada dele, em java ficaria assim: Item novoItem = new Item() novoItem.getItemPosX(); Claro que a estrutura que estou pensando envolve muito mais GETTERS e SETTERS coloquei simplificado apenas para exemplificar. Gostaria muito de saber como implementar isso no MTA usando LUA, também gostaria de saber, caso seja possível, se é recomendado utilizar OOP dessa forma em LUA para o MTA. Edited August 24, 2020 by iPollo Link to comment
nikitafloy Posted August 24, 2020 Share Posted August 24, 2020 https://wiki.multitheftauto.com/wiki/OOP_in_Lua Link to comment
Other Languages Moderators androksi Posted August 25, 2020 Other Languages Moderators Share Posted August 25, 2020 (edited) Olá. Em Lua, geralmente usa-se metatabelas para criar estruturas orientadas à objetos. Há duas maneiras de criá-las; a primeira, separando métodos e atributos em diferentes partes do código; ou, criar apenas uma tabela, que vamos nomear como se fosse o nome da classe, e nela iremos definir tudo. Irei mostrar a segunda opção, onde você cria uma tabela (classe), e já insere os métodos e atributos. Spoiler Item = { new = function(self, name, id, x, y, z) local object = createObject(id or 1337, x or 0, y or 0, z or 0) local newItem = {itemObject = object, itemName = name or "Unknown", itemId = id or 1337, itemX = x or 0, itemY = y or 0, itemZ = z or 0} return setmetatable(newItem, {__index = Item}) end, getPosition = function(self) return self.itemX, self.itemY, self.itemZ end, getID = function(self) return self.itemId end, setPosition = function(self, x, y, z) self.itemX = x self.itemY = y self.itemZ = z setElementPosition(self.itemObject, x, y, z) end } local sandwich = Item:new("X-Bacon", 3437, 0, 0, 3) iprint(sandwich:getID()) iprint(sandwich:getPosition()) sandwich:setPosition(10, 5, 4) A palavra self é referência do objeto criado, nesse caso, dei o nome de sandwich. Basicamente, o que a função setmetatable faz é indexar a variável-objeto (sandwich) à classe Item. Dessa forma, objeto.método ou objeto:função(), irá executar algo da classe. Sempre use a palavra self como primeiro parâmetro da função, uma vez criada dentro da classe. Também, você pode chamar as funções/métodos dentro da classe. Vejo que você tem conhecimento sobre o assunto, sabe do que estou falando. Edited August 25, 2020 by andreisrw 2 Link to comment
iPollo Posted August 25, 2020 Author Share Posted August 25, 2020 (edited) 12 hours ago, andreisrw said: Olá. Em Lua, geralmente usa-se metatabelas para criar estruturas orientadas à objetos. Há duas maneiras de criá-las; a primeira, separando métodos e atributos em diferentes partes do código; ou, criar apenas uma tabela, que vamos nomear como se fosse o nome da classe, e nela iremos definir tudo. Irei mostrar a segunda opção, onde você cria uma tabela (classe), e já insere os métodos e atributos. Hide contents Item = { new = function(self, name, id, x, y, z) local object = createObject(id or 1337, x or 0, y or 0, z or 0) local newItem = {itemObject = object, itemName = name or "Unknown", itemId = id or 1337, itemX = x or 0, itemY = y or 0, itemZ = z or 0} return setmetatable(newItem, {__index = Item}) end, getPosition = function(self) return self.itemX, self.itemY, self.itemZ end, getID = function(self) return self.itemId end, setPosition = function(self, x, y, z) self.itemX = x self.itemY = y self.itemZ = z setElementPosition(self.itemObject, x, y, z) end } local sandwich = Item:new("X-Bacon", 3437, 0, 0, 3) iprint(sandwich:getID()) iprint(sandwich:getPosition()) sandwich:setPosition(10, 5, 4) A palavra self é referência do objeto criado, nesse caso, dei o nome de sandwich. Basicamente, o que a função setmetatable faz é indexar a variável-objeto (sandwich) à classe Item. Dessa forma, objeto.método ou objeto:função(), irá executar algo da classe. Sempre use a palavra self como primeiro parâmetro da função, uma vez criada dentro da classe. Também, você pode chamar as funções/métodos dentro da classe. Vejo que você tem conhecimento sobre o assunto, sabe do que estou falando. Muito obrigado, ajudou muito EDIT: Surgiu outra dúvida, caso eu queira usar as funções de dentro da classe (métodos) em outro script, funcionaria normalmente exportando? Edited August 25, 2020 by iPollo Link to comment
Gw8 Posted August 25, 2020 Share Posted August 25, 2020 item = {} item.__index = item function newItem(x,y) local self = setmetatable({},item) self.x = x self.y = y return self end function newItem:getX() return self.x end function newItem:setX(x) self.x = x end function newItem:getY() return self.y end function newItem:setY(y) self.y = y end local myItem = newItem(50,50) myItem:getX() myItem:setX(500) Em questão de exportação, é complicado, no meu caso só consegui de duas maneiras: 1. criar um controlador dentro do arquivo da 'classe Item' ou .. 2. exporta a classe inteira para o outro resource que é basicamente copiar o arquivo da 'classe' e colocar no outro resource. *Não tem como instanciar o obj em um resource e exportar ele pra outro resource, esse eo ponto. 1 Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now