MA

Classe Position[EagleLib]

Por MaXwEllDeN, 01 de jan. de 2013 em Mods, funções e outros

tibia
script
otserv
7
1.4k
MaXwEllDeNM
01 de janeiro de 2013 às 19:16

Introdução

 

divisor.png

O script postado aqui é uma parte de uma Biblioteca que eu estou desenvolvendo para Open Tibia, a EagleLib. Esta biblioteca terá várias funções que são muito úteis e funcionais, funções que tornará mais prático o desenvolvimento de scripts.

 

 

A `classe` Position

divisor.png

Como muitos sabem, Lua não tem uma Orientação a Objetos nativa, mas possui uma poderosa ferramenta que nos permite simular a Orientação a Objetos, a ferramenta a qual me refiro são as metatabelas. Para tornar mais prático o desenvolvimento de scripts que necessitam manipular posições, foi criada uma `classe` nomeada Position.

 

 

separador.gif

Como declarar um objeto Position

separador.gif

 

Para declarar um objeto Position você deve chamar o método Position:new e atribuir como parâmetro uma tabela contendo as coordenadas da posição.

 

local pos = Position:new({x = 160, y = 54, z = 7})

 

 

separador.gif

Comparação entre posições

separador.gif

Creio que em algum momento você já precisou, ou pensou em fazer algo como mostra o exemplo abaixo, não?

 

local pos = {x = 160, y = 54, z = 7}
local player_pos = getCreaturePosition(cid)

if pos == player_pos then
  return doPlayerSendCancel(cid, "Você não pode fazer isso nessa posição!")
end

 

Isso não funcionaria do modo desejado, pois quando a verificação fosse feita não seria verificado se os conteúdos da tabela são iguais, mas se uma tabela é a outra(tem uma enorme diferença entre ser como ela e ser ela). Mas se você tentasse fazer desse modo, em vez do mostrado anteriormente, resultado seria satisfatório.

 

local pos = Position:new({x = 160, y = 54, z = 7})
local player_pos = Position:new(getCreaturePosition(cid))

if pos == player_pos then
  return doPlayerSendCancel(cid, "Você não pode fazer isso nessa posição!")
end

 

Desse modo, se o player estivesse na posição especificada, quando o script fosse executado ele receberia a mensagem do doPlayerSendCancel.

 

separador.gif

Métodos existentes atualmente

separador.gif

 

Position:getItemsThere(items[, start_stack])
Position:isCreatureThere(uid)
Position:doTeleportThing(uid)
Position:doCreateItem(itemid, amount)
Position:doRemoveCreatureThere()
Position:doRemoveItemById(itemid[, amount])
Position:doSendMagicEffect(id)
Position:isItemThere(itemid)

 

 

Download

divisor.png

A biblioteca está anexada ao tópico.

EagleLib.tar.gz

Editado Janeiro 1 por MaXwEllDeN

caoticC
01 de janeiro de 2013 às 19:21

Biblioteca interessante.

 

Usar orientação a objetos deixa o codigo bem mais clen

Vou dar uma olhada

Yan OliveiraY
01 de janeiro de 2013 às 19:38

Bem legal essa ideia de biblioteca.

MaXwEllDeNM
04 de janeiro de 2013 às 16:24

Verdade, orientação a objetos deixa tudo mais clean. Alguém teria mais alguma sugestão para métodos que eu posso implementar na `classe` Position?

1 mês depois...
VincV
23 de fevereiro de 2013 às 18:05

__add,__sub e __unm (pra inverter x por y e y por x,ou simplesmente troca o sinal deles)

2 meses depois...
MaXwEllDeNM
30 de abril de 2013 às 13:57

__add,__sub e __unm (pra inverter x por y e y por x,ou simplesmente troca o sinal deles)

A do add e sub achei legal, mas as __unm não ví muita utilidade, xD. Valeu.

 

Adicionei aqui, mais tarde upo o arquivo ;_)

VincV
01 de maio de 2013 às 16:39

eu tbm n,mas me parecia muito vazio o post,tive que enche liguiça.