Jump to content

[Dúvida] OOP em LUA


Recommended Posts

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 by iPollo
Link to comment
  • Other Languages Moderators

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. xD

Edited by andreisrw
  • Thanks 2
Link to comment
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. xD

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 by iPollo
Link to comment
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.

  • Like 1
Link to comment

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...