Ir para conteúdo
Entre para seguir isso  
Miltonhit

Função lua, checar x player em y área.

Recommended Posts

Miltonhit    4
Miltonhit

Olá a todos, primeiramente quero agradecer á oportunidade de me tornar um scripter e membro da equipe OTBR, antiga otnet, que me ensinou tudo que eu sei de script até hoje, para comemorar isso, vou postar uma função muito útil e simplês que eu imagino que possa ajudar muita gente.

 

[spoiler=Padrão]

Autor: MiltonHit, Mirto
Testada: sim, tfs 0.3.6 (8.54)
Versão: 1.0

 

A função faz o seguinte, você vai fazer um "quadrado imaginário" setando 2 posições e checando se o player ou creature cid está lá dentro, primeiro vá até á pasta lib/050-function.lua e adicione isso na ultima linha:

 

function getPlayerInPos(cid, posinicial, posfinal, andar) --by mirto
        local player_pos = getPlayerPosition(cid)
        local pos = {inicial = posinicial, final = posfinal}
        for s = 1, #pos do
            if pos.inicial[s] == nil or pos.final[s] == nil then
               return print('error in getPlayerInPos, parametros invalidos')
            end
        end
        if (player_pos.x <= pos.inicial.x and player_pos.y <= pos.inicial.y) and (player_pos.x >= pos.final.x and player_pos.y >= pos.final.y) then
           if not(andar == nil) then
              if player_pos.z == andar then
                 return true
              else
                 return false
              end
           else
              return true
           end
        else
           return false
        end
end

 

Pronto, seu script está instalado no servidor, agora para usar você deverar fazer o seguinte, ex:

getPlayerInPos(cid, {x=2040,y=375}, {x=1914,y=208}, 7), esse numero no final só deve ser usado se você deseja fazer a checagem de um determinado andar, se não for colocado nada, ele vai checar a área x e y..., em todos os andares possíveis, o script retornará true se o cid estiver na pos e false se não estiver, como configurar o "quadrado":

 

scri.jpg

 

pronto, agora que você já sabe como instalar e usar a função divirta-se! De bônus vai um exemplo de como utilizar essa função:

function onThink(cid, interval)
[i]         if getPlayerInPos(cid, {x=2040,y=375}, {x=1914,y=208}) == true then
           doTeleportThing(cid, pos)
        end[/i]
end

 

Obrigado a todos, espero que todos tenham gostado da minha primeira contribuição como "sub-moderador", qualquer duvida estou aqui, abraços.

Editado por Miltonhit
melhorias no code.

Compartilhar este post


Link para o post
LsM    2
LsM

Ah, legal, o único problema é que pode reproduzí-la de uma forma muito mais simples.

Compartilhar este post


Link para o post
Criticoo    4
Criticoo

poderia fazer assim tbm:

 

      function getPlayerInPos(cid, posinicial, posfinal, andar) --by mirto
       local pos = getPlayerPosition(cid)
for x = posinicial[1], posfinal[1] do
	for y = posinicial[2], posfinal[2] do
                       if pos.x == x and pos.y == y and pos.z == andar then
                       return true
		end
	end
end
      return false
end

 

ai no caso vc usaria assim:

 

getPlayerInPos(cid, {245,73}, {249,80}, 7)

 

{começo x, começo y} , {final x, final y}, andar

 

por exemplo:

 

if getPlayerInPos(cid, {245,73}, {249,80}, 7) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"vc esta na pos")
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"vc nao esta na pos")
end

Compartilhar este post


Link para o post
Miltonhit    4
Miltonhit
poderia fazer assim tbm:

 

      function getPlayerInPos(cid, posinicial, posfinal, andar) --by mirto
       local pos = getPlayerPosition(cid)
for x = posinicial[1], posfinal[1] do
	for y = posinicial[2], posfinal[2] do
                       if pos.x == x and pos.y == y and pos.z == andar then
                       return true
		end
	end
end
      return false
end

 

ai no caso vc usaria assim:

 

getPlayerInPos(cid, {245,73}, {249,80}, 7)

 

{começo x, começo y} , {final x, final y}, andar

 

por exemplo:

 

if getPlayerInPos(cid, {245,73}, {249,80}, 7) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"vc esta na pos")
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"vc nao esta na pos")
end

 

essa é uma boa alternativa, porém pra quem quer checar todos os andares ficaria chato ter q colocar isso varias vezes, vou dar uma melhorada e diminuida no meu.., mais valeu pela dica.

Compartilhar este post


Link para o post
Criticoo    4
Criticoo
essa é uma boa alternativa, porém pra quem quer checar todos os andares ficaria chato ter q colocar isso varias vezes, vou dar uma melhorada e diminuida no meu.., mais valeu pela dica.

 

acho que assim vai com andar ou sem andar:

 

      function getPlayerInPos(cid, posinicial, posfinal, andar) --by mirto
       local pos = getPlayerPosition(cid)
   for x = posinicial[1], posfinal[1] do
       for y = posinicial[2], posfinal[2] do
                       if andar ~= nil then 
                       if pos.x == x and pos.y == y and pos.z == andar then
                       return true
           end
                       else
                       if pos.x == x and pos.y == y then
                       return true
           end
                    end
             end
   end
      return false
end

 

ai vc poderia usar para checar de um determinado andar,por exemplo o 7:

 

if getPlayerInPos(cid, {153,50}, {156,55}, 7) then 

 

ou para todos os andares:

 

if getPlayerInPos(cid, {153,50}, {156,55}) then

Compartilhar este post


Link para o post
Miltonhit    4
Miltonhit

criticoo valeu pela dica, já fiz uma nova versão da função bem menor, rep +.

Compartilhar este post


Link para o post
Criticoo    4
Criticoo

rlx cara

a função é sua,acho que da pra diminuir ainda a minha...

mas a função em si é ótima mesmo xD

da pra fazer com mob dps tbm neh?

Compartilhar este post


Link para o post
Conde2    0
Conde2

o TFS tem uma função muito boa pra isso, o bom dela é que não usa loops ai é mais rapido a checagem.

 

Se quiser dar uma olhada nela vo postar aqui.

 

function isInRange(position, fromPosition, toPosition)
   return (position.x >= fromPosition.x and position.y >= fromPosition.y and position.z >= fromPosition.z
       and position.x <= toPosition.x and position.y <= toPosition.y and position.z <= toPosition.z)
end

Compartilhar este post


Link para o post
Miltonhit    4
Miltonhit
o TFS tem uma função muito boa pra isso, o bom dela é que não usa loops ai é mais rapido a checagem.

 

Se quiser dar uma olhada nela vo postar aqui.

 

function isInRange(position, fromPosition, toPosition)
   return (position.x >= fromPosition.x and position.y >= fromPosition.y and position.z >= fromPosition.z
       and position.x <= toPosition.x and position.y <= toPosition.y and position.z <= toPosition.z)
end

 

hm, não conhecia essa função ainda,...

Compartilhar este post


Link para o post
bepokemon    0
bepokemon

Eu criei uma parecida recentemente:

function getPlayersOnArea(frompos, topos)
   local ret = {}
   for _,pid in pairs(getPlayersOnline()) do
       local pos = getThingPos(pid)
       if isInRange(pos, frompos, topos) then
           table.insert(ret, pid, pos)
       end
   end
return ret
end

No caso seria:

function isPlayerInArea(cid, frompos, topos)
return(getPlayersOnArea(frompos, topos)[cid])
end

Editado por bepokemon
loca

Compartilhar este post


Link para o post
dalvorsn    46
dalvorsn

Boa função, mas já existe há um tempo a função no proprio tfs a unica diferença é que ela não procura em stackpos diferentes.

Mas quando se trata de loops, prefira usar c++, é muito mais eficiente, principalmente para iterações grandes.

A função é essa: isInRange(pos, fromPos, toPos).

Editado por dalvorsn

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.

×