Show cara, bem interessanet esse "code".
- Fórum
- OTServ
- Recursos
- Scripting
- Actions e Talkactions
- Dinastias - Fórmula Posição & Direção 30/01
Dinastias - Fórmula Posição & Direção 30/01
Por Dokmos, 18 de dez. de 2008 em Actions e Talkactions
info
Grupo: Visconde
Registrado: 25/05/08
Posts: 1.4k
Reputação: +26
Char no Tibia: Akhumura

info
Grupo: Cavaleiro
Registrado: 02/09/06
Posts: 186
Reputação: +16

Dokmos cada vez mais mostrando a sua capacidade como Scripter!!
Parabéns
info
Grupo: Artesão
Registrado: 07/10/06
Posts: 108
Reputação: 0
Char no Tibia: Vi Vanderlaysk

Muito massa cara ... realmente melhor...
eu li e demorei pra entender isso .. mas tipo
gostei mais desse do q o q ja tinha ;P
Nem eu sei oq eu falei xD
Abraço ;D
info
Grupo: Visconde
Registrado: 05/10/06
Posts: 381
Reputação: +7

Boa, cara pena que não sou scripter, mais você trazendo esse tipo de tutorial é uma excelente iniciativa!
info
Grupo: Campones
Registrado: 29/11/07
Posts: 81
Reputação: +4
Char no Tibia: Dokmos

Obrigado, acabei de atualizar a fórmula e agora ela converte todas as posições!





info
Grupo: Campones
Registrado: 29/11/07
Posts: 81
Reputação: +4
Char no Tibia: Dokmos
Fórmula Posição & Direção
by Dokmos
-----------------------------------------------
Fórmula atualizada 30/01!
Agora a fórmula converte todas as direções: norte, leste, sul, oeste (0, 1, 2, 3) e também as direções sudoeste, sudeste, noroeste e nordeste (4, 5, 6, 7)!
Esta fórmula pode parecer ridícula e inútil, mas se você souber usá-la economizará tempo, linhas, bugs e um sistema mais rápido em seus scripts!
-----------------------------------------------
Fórmula
dir = { x = (math.fmod(d,2)*(-(d-2))+math.floor(d/4)*math.fmod(d,2)*d-math.floor(d/4)), y = (((d-1)*(d-1-(d-1)*math.abs(d-2))*(1-math.floor(d/4)))-(math.floor(d/4)*(math.floor(d/6)*2-1))) }-----------------------------------------------
Funcionamento
Você agora provavelmente deve estar perguntando se o tio Dokmos não tem mais nada para fazer do que vir aqui postar isso.
Bom então vou explicar para que esses números servem. Essa fórmula é baseada nas direções padrões do global:
Essa tabela resulta nas posições x e y de acordo com a posição do jogador, quando variamos a posição de algum jogador para essas direções modicamos os eixos x e y, as vezes um pode ser nulo, negativo ou positivo, por exemplo vamos andar 1 sqm para o norte:
Ou seja, o x atual do jogador permanece e o y atual do jogador subtrai 1.
Vou colocar aqui a variação para as direções em 1 sqm:
Vamos ver agora se essa fórmula funciona mesmo, vamos andar 1 sqm para a direção norte, ou seja, a tabela terá que ser {0,-1}, agora jogando na fórmula:
{math.fmod(0,2)*(-(0-2)),(0-1)*(0-1-(0-1)*math.abs(0-2))} {0*2,-1*(0*2)} {0,-1*(-1-(-1*2))} {0,-1*(-1+2)} {0,-1*1} {0,-1}Good! Se você quiser testar com todas direções vai ver que todas vão sair nas posições desejadas!!!
Agora você deve estar perguntando e para que eu estou lendo isso? Bom na verdade você já precisou, precisa ou precisará disso em algum script seu, por exemplo vamos mover o jogador 1 sqm a frente, fazendo do jeito normal:
pos = getThingPos(cid) if getPlayerLookDir(cid) == 0 then newpos = {x=pos.x,y=pos.y-1,z=pos.z} elseif getPlayerLookDir(cid) == 1 then newpos = {x=pos.x+1,y=pos.y,z=pos.z} elseif getPlayerLookDir(cid) == 2 then newpos = {x=pos.x,y=pos.y+1,z=pos.z} elseif getPlayerLookDir(cid) == 3 then newpos = {x=pos.x-1,y=pos.y,z=pos.z} end doTeleportThing(cid,newpos,TRUE)E se usando a fórmula seria assim:
pos = getThingPos(cid) d = getPlayerLookDir(cid) dir = { x = (math.fmod(d,2)*(-(d-2))+math.floor(d/4)*math.fmod(d,2)*d-math.floor(d/4)), y = (((d-1)*(d-1-(d-1)*math.abs(d-2))*(1-math.floor(d/4)))-(math.floor(d/4)*(math.floor(d/6)*2-1))) } newpos = {x=pos.x+dir.x,y=pos.y+dir.y,z=pos.z} doTeleportThing(cid,newpos,TRUE}Como eu disse pode parecer inútil para alguns e bastante útil para quem sabe usá-lo. Agora é com vocês!!!
E aproveitando o tópico vou colocar um mini-função para vocês baseado nessa fórmula, para instalar é só colocar dentro do seu global.lua e ela server para pegar uma posição quantos sqm's a frente você desejar.
Função getPosfromSquare(pos,direction,squares)
------------------ Function getPosfromSquare(pos,direction,squares) by Dokmos ------------------ function getPosfromSquare(pos,direction,squares) d = direction dir = { x = (math.fmod(d,2)*(-(d-2))+math.floor(d/4)*math.fmod(d,2)*d-math.floor(d/4)), y = (((d-1)*(d-1-(d-1)*math.abs(d-2))*(1-math.floor(d/4)))-(math.floor(d/4)*(math.floor(d/6)*2-1))) } newpos = {x=pos.x+dir.x*squares,y=pos.y+dir.y*squares,z=pos.z} return newpos endAqui uma talkaction como exemplo que usa a função:
Como vocês podem ver essa talkaction teleporta o jogador 5 sqm a frente que ele está olhando, como disse uma mini-função.
Espero que aproveitem a fórmula!!!
:smile_positivo:
Atenciosamente,
Dokmos
Editado Janeiro 30 por Dokmos