Ir para conteúdo

doMove(uid, dirs)


Posts Recomendados

Fala ai galera, me vieram muitos pedidos de como mover algum "player, monster ou NPC", em uma certa ROTA prédefinida.

 

Bom, eu criei aqui uma funçao, bem simples de usala.

Basta voce criar uma variavel com as direços que voce quer que o UID se mova

 

bom, aqui vai um exemplo ->

 

passos = {NORTH, NORTH, SOUTH, WEST}

doMove(cid, passos)

O Cid (Player) , iria andar 2x para o norte, 1x para o sul e 1x para o oeste

 

Bom, espero que façam bom uso.

 

-- OrochiElf --

function doMove(uid, dirs)
for _, dir in ipairs(dirs) do
if isCreature(uid) then

addEvent(doMoveCreature, (dirs - 1) * 1000, uid, dir)
end
return true
end
end

Editado por OrochiElf
Link para o comentário
Compartilhar em outros sites

Tu não testou né?

Ta subtraindo numero de table

dirs - 1

e mesmo que fosse #dirs - 1, ainda ficaria errado, porque executaria todos os steps ao mesmo tempo

alem disso tem outro problema, a função doMoveCreature não respeita as flags, ela passa o player por cima de coisas que nao poderia passar, isso pode causar varios bug abuses

Link para o comentário
Compartilhar em outros sites

Bom Dalvorns,

eu aprendi esse negocio de subtrair com um script que o slicer fez.

 

Ele fez essa formula ai , e executou exatamente como criado.

Ele faz o proximo step apos ele andar.

Não sei como explicar, mais assim funcionou '-'

Link para o comentário
Compartilhar em outros sites

vc testou? pq fazendo dirs-1 vaii dar..

attempt to perform arithmetic on local 'dirs'

 

o correto seria..

addEvent(doMoveCreature, _ * 1000, uid, dir) 

 

e ms assim como o dalv flo, com essa sua funçao a criatura vai passar por cima de qlqr coisa...

eu fiz essa funçao esses dias pra brincar... ela funciona tpw o Order... mas clr q ela ta muito longe de estar util.. eh soh pra brincar ms..

 

local function move(cid, finalpos)
if not isCreature(cid) then return true end
if isPosEqual(getThingPos(cid), finalpos) then return true end
if getDistanceBetween(getThingPos(cid), finalpos) <= 1 and not canWalkOnPos(finalpos, false, false, true, true, true) then
return true
end

local dir = getDirectionTo(getThingPos(cid), finalpos)
local newPos = getPosByDir(getThingPos(cid), dir)

if not canWalkOnPos(newPos, false, false, true, true, true) then
  newPos = getClosestFreeTile(cid, newPos)
end

if newPos then
doTeleportThing(cid, newPos, true)
end

addEvent(move, 700, cid, finalpos)
end

function onUse(cid, item, frompos, item2, topos)

move(getCreatureSummons(cid)[1], topos)

return true
end

 

Link para o comentário
Compartilhar em outros sites

function doEmpurrePlayer(cid, player, vez, ultimapos)
               tab = {100, 150, 200, 350, 400, 550, 600, 750, 900, 1000}
			if not isCreature(player) then return true end
			if vez == #tab then return true end
			if isWalkable(getPositionByDirection(getThingPos(player), getCreatureLookDir(cid), 1)) then
			doTeleportThing(player, getPosByDir(ultimapos, getCreatureLookDirection(cid), 1))
			doSendMagicEffect(getThingPos(player), 34)
			ultimapos = getThingPos(player)
			addEvent(executeEmpurro, tab[vez], cid, player, vez + 1, ultimapos)
end
end

 

tab é a velocidade vai aumentando

 

precisa ter a função isWalkable pra funcionar só procurar no google.

Editado por Skymagnum
Link para o comentário
Compartilhar em outros sites

function doEmpurrePlayer(cid, player, vez, ultimapos)
			if not isCreature(player) then return true end
			if vez == #tab then return true end
			tab = {100, 150, 200, 350, 400, 550, 600, 750, 900, 1000}
			if isWalkable(getPositionByDirection(getThingPos(player), getCreatureLookDir(cid), 1)) then
			doTeleportThing(player, getPosByDir(ultimapos, getCreatureLookDirection(cid), 1))
			doSendMagicEffect(getThingPos(player), 34)
			ultimapos = getThingPos(player)
			addEvent(executeEmpurro, tab[vez], cid, player, vez + 1, ultimapos)
end
end

 

tab é a velocidade vai aumentando

 

precisa ter a função isWalkable pra funcionar só procurar no google.

 

Testou isso? Você usou a variável tab numa comparação antes de declarar ela... não sei em otserv, mas lua pura isso não funciona.

Link para o comentário
Compartilhar em outros sites

function doEmpurrePlayer(cid, player, vez, ultimapos)
			if not isCreature(player) then return true end
			if vez == #tab then return true end
			tab = {100, 150, 200, 350, 400, 550, 600, 750, 900, 1000}
			if isWalkable(getPositionByDirection(getThingPos(player), getCreatureLookDir(cid), 1)) then
			doTeleportThing(player, getPosByDir(ultimapos, getCreatureLookDirection(cid), 1))
			doSendMagicEffect(getThingPos(player), 34)
			ultimapos = getThingPos(player)
			addEvent(executeEmpurro, tab[vez], cid, player, vez + 1, ultimapos)
end
end

 

tab é a velocidade vai aumentando

 

precisa ter a função isWalkable pra funcionar só procurar no google.

 

Testou isso? Você usou a variável tab numa comparação antes de declarar ela... não sei em otserv, mas lua pura isso não funciona.

 

Nossa eu também percebi que erro feio.

 

Eheuaheuaheuh'

Link para o comentário
Compartilhar em outros sites

É tinha pensado nisso, mas sou péssimo com formulas então deixei assim mesmo.

Eu particularmente não gostei do que a tua função faz, achei um pouco non-sense se me permite dizer, mas usando apenas a ideia, eu faria assim:


function doPushCreature(cid, target, times, limitPush)
   if not (isCreature(cid) and isCreature(target)) then 
       return false 
   end

   local toPos = getCreatureLookPosition(target)
   if isWalkable(toPos) then
       doTeleportThing(target, toPos)
       doSendMagicEffect(toPos, 34)
       if limitPush > times then
           addEvent(doPushCreature, times * 50, cid, target, times + 1, limitPush)
       end
   end
   return true
end

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...