Ir para conteúdo
Entre para seguir isso  
Dokmos

Dinastias - Fórmula Posição & Direção

Recommended Posts

Dokmos    1
Dokmos

logo-d10.jpg

 

 

 

Fórmula Posição & Direção

by Dokmos

 

 

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

 

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!

 

:fist:

 

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

 

Fórmula

 

 

d = getPlayerLookDir(cid)

[u]{math.fmod(d,2)*(-(d-2)),(d-1)*(d-1-(d-1)*math.abs(d-2))}[/u]

 

 

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

 

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

 

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) == 2 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 = {math.fmod(d,2)*(-(d-2)),(d-1)*(d-1-(d-1)*math.abs(d-2))}
newpos = {x=pos.x+(dir[1]),y=pos.y+(dir[2]),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 = {math.fmod(d,2)*(-(d-2)),(d-1)*(d-1-(d-1)*math.abs(d-2))}
newpos = {x=pos.x+(dir[1])*squares,y=pos.y+(dir[2])*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!!!

 

:bye:

 

Atenciosamente,

Dokmos

Editado por Dokmos

Compartilhar este post


Link para o post
Jonny249    0
Jonny249

puts cara

mando muito

me lembro ainda de ter que fazer esses 4 look dir

para fazer um script

chato demais

boa cara! continua assim!

falous

By Jonny~

Compartilhar este post


Link para o post
Dokmos    1
Dokmos

Opa Valeu, que bom que entendeu onde usá-la (Y)

Compartilhar este post


Link para o post
PoSo    0
PoSo

Muito bacana, com essa função, dá pra fazer um movement do tipo: "vidente"

Se tiver uma bomba ali no chao, você é avisado há alguns sqm de distancia ! Haha

Viajei :P

Mas dá pra fazer.

Parabéns,

Abraços.

Compartilhar este post


Link para o post
Laweit    0
Laweit

Como você falou tinha outro jeito de fazer isso, mas desse jeito o script fica menor, mais leve e agradável para quem for trabalhar.

 

Esse Dinastias vai fica ótimo!

Compartilhar este post


Link para o post
Balder    23
Balder

Uhull, mto chique, seja lá pra que isso sirvaa!

 

Dokmos ajudando bastante na comunidade ;D

 

gogo

Compartilhar este post


Link para o post
[ B a l i l l o ]    0
[ B a l i l l o ]

É boa esta formula, para fazer em scripts independentes e tals. Mas ainda prefiro aquele exemplo de mais linhas que vc deu se aplicando a uma função, intende? :P

 

É mais 'intendivel' auehuae :D

Em todo caso, ficou excelente!

 

bjs ;*

Compartilhar este post


Link para o post
PoSo    0
PoSo

Mas, se você tiver usando um script que dependa dessa função várias vezes, como foi dito, o que for mais rápido prevalece. =P

Compartilhar este post


Link para o post
MotoBoy    0
MotoBoy

poisé xD

ficou excelentemente bom mesmo

bem explicado

exemplos

tudo que se precisa =O~~

fica mais facil e rápido

até porque muitos troneios, o script é avaliada quanto ao tamanho do script também..

até porque assim, o script fica mais leve e mais complexo ^^

 

thnxxx

 

flws~~

Compartilhar este post


Link para o post
Caiobr    0
Caiobr

Muito bom!

Compartilhar este post


Link para o post
Mock    32
Mock

Dexa eu ver se entendir direito...

Se e uto na pos pos e virado pra direção 2 e usar essa função ela vai retornar a posição do sqm na frente do player??

 

se for isso ja existe uma função que faz algo igual:

getPosByDir(dir,pos)

porem o seu ele pelo q eu vi no script ele pega não o sqm da frente mais 2 sqm afrete ou 5 ou o tanto que vc quiser.

ainda prefiro do jeito q vc fez e mais pratico qdo se presisa pegar 4 sqms a frente xD

 

----

Caso nao seje oq eu falei anule meu comentario xD

Compartilhar este post


Link para o post
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  
  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×