Ir para conteúdo

Posts Recomendados

logo-d10.jpg

 

 

 

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!

 

:surprised:

 

-----------------------------------------------

 

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:

 

NORTE = 0
LESTE = 1
SUL = 2
OESTE = 3
SUDOESTE = 4
SUDESTE = 5
NOROESTE = 6
NORDESTE = 7

 

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:

variação de x = 0
variação de y = -1

 

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:

 

NORTE
x = 0, y = -1
LESTE
x = 1, y = 0
SUL
x = 0, y = 1
OESTE
x = -1, y = 0

 

 

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
end

 

Aqui uma talkaction como exemplo que usa a função:

 

function onSay(cid, words, param)   
newpos = getPosfromSquare(getThingPos(cid),getPlayerLookDir(cid),5)
doTeleportThing(cid,newpos,TRUE)
return TRUE
end

 

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 por Dokmos
Link para o comentário
https://xtibia.com/forum/topic/102993-dinastias-f%C3%B3rmula-posi%C3%A7%C3%A3o-dire%C3%A7%C3%A3o-3001/
Compartilhar em outros sites

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

  • 1 month later...
  • 3 weeks later...
×
×
  • Criar Novo...