Ir para conteúdo
  • 0

Spell doMoveCreature


161996

Pergunta

Olá pessoal, estou precisando urgente de uma spell com doMoveCreature que é igual esta abaixo porém sem o bug de atravessar rios e paredes... (obs: ja coloquei blockwalls="1" e tentei de tudo). Ela é controlada pelo ctrl+setas do teclado e é muito legal para usar em servidores derivados.



Spell:





local area = {

{0,0,0},

{0,3,0},

{0,0,0},

}


function onDash(cid)

local poslook = getCreatureLookPosition(cid)

poslook.stackpos = STACKPOS_TOP_MOVEABLE_ITEM_OR_CREATURE

if isWalkable(poslook, false, false, false) then

if not isCreature(getThingfromPos(poslook).uid) then

doMoveCreature(cid, getPlayerLookDirection(cid))

doSendMagicEffect(getPlayerPosition(cid), 2)

return TRUE

else

doMoveCreature(cid, getPlayerLookDirection(cid))

doAreaCombatHealth(0, 1, poslook, area, -getCreatureSpeed(cid)*2/(getCreatureHealth(cid)/300), -getCreatureSpeed(cid)*3/(getCreatureHealth(cid)/30), 9)

doCreatureSay(getThingfromPos(poslook).uid, 'Auch', TALKTYPE_MONSTER)

doSetItemOutfit(getThingfromPos(poslook).uid, 2317, 1*1000)

doSendMagicEffect(getCreaturePosition(getThingfromPos(poslook).uid), 31)

return TRUE

end

end

end


function onCastSpell(cid, var)local distance = 40


for i = 0, distance do

addEvent(onDash,90*i,cid)

end

return TRUE

end

function isWalkable(pos, creature, proj, pz)-- by Nord

if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end

if getTopCreature(pos).uid > 0 and creature then return false end

if getTileInfo(pos).protection and pz then return false, true end

local n = not proj and 3 or 2

for i = 0, 255 do

pos.stackpos = i

local tile = getTileThingByPos(pos)

if tile.itemid ~= 0 and not isCreature(tile.uid) then

if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then

return false

end

end

end

return true

end






Alguém poderia fazer outra??! Aguardando.

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

Posts Recomendados

  • 0

O problema está no bloco depois do else, na condição do isWalkable, localizado na função onDash. Mesmo se não for "andável", o jogador será teleportado para frente. Com isso, obviamente, ele vai atravessar paredes, rios e etc. Portanto, lhe pergunto: qual a necessidade disso?

doMoveCreature(cid, getPlayerLookDirection(cid))
doAreaCombatHealth(0, 1, poslook, area, -getCreatureSpeed(cid)*2/(getCreatureHealth(cid)/300), -getCreatureSpeed(cid)*3/(getCreatureHealth(cid)/30), 9)
doCreatureSay(getThingfromPos(poslook).uid, 'Auch', TALKTYPE_MONSTER)
doSetItemOutfit(getThingfromPos(poslook).uid, 2317, 1*1000)
doSendMagicEffect(getCreaturePosition(getThingfromPos(poslook).uid), 31)

Se esta parte fosse removido do código, iria funcionar perfeitamente.

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

  • 0

Também pensei nisso zip, só que essa spell atravessa alguns tipos de paredes somente, exemplo: shallow water e wall de cave ela atravessa. O resto de paredes comuns ele não atravessa... sabe qual o problema? (Obs: tenho outra spell que funciona perfeitamente mas ela está perdendo a storage ao morrer, se quiser eu posto ela aqui).

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

  • 0

Hm, poderia tentar com este código? Qualquer coisa, podemos fazer uma tabela com os IDs dos items que a spell atravessa. Aí, complementamos o código com uma condição envolvendo-os.

local area = {
    {0, 0, 0},
    {0, 3, 0},
    {0, 0, 0},
}
function isWalkable(pos)-- by Nord / editado por Omega
    if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then
        return false
    elseif isCreature(getTopCreature(pos).uid) then
        return false
    elseif getTileInfo(pos).protection then
        return false
    elseif hasProperty(getThingFromPos(pos).uid, 3) or hasProperty(getThingFromPos(pos).uid, 7) then
        return false
    end
    return true
end
function onDash(cid)
    if not isCreature(cid) then return true end
    local poslook = getCreatureLookPosition(cid)
    poslook.stackpos = STACKPOS_TOP_MOVEABLE_ITEM_OR_CREATURE
    if isWalkable(poslook) then
        doMoveCreature(cid, getPlayerLookDirection(cid))
        doSendMagicEffect(getPlayerPosition(cid), 2)
    else
        doMoveCreature(cid, getPlayerLookDirection(cid))
        doAreaCombatHealth(0, 1, poslook, area, -getCreatureSpeed(cid)*2/(getCreatureHealth(cid)/300), -getCreatureSpeed(cid)*3/(getCreatureHealth(cid)/30), 9)
        doCreatureSay(getThingfromPos(poslook).uid, 'Auch', TALKTYPE_MONSTER)
        doSetItemOutfit(getThingfromPos(poslook).uid, 2317, 1*1000)
        doSendMagicEffect(getCreaturePosition(getThingfromPos(poslook).uid), 31)
    end
    return true
end
function onCastSpell(cid, var)
    local distance = 40
    for i = 0, distance do
        addEvent(onDash, 90*i, cid)
    end
    return true
end
Editado por zipter98
Link para o comentário
Compartilhar em outros sites

  • 0

Não da erro no console mas a spell não funciona.

 

Aqui vai outra spell que funciona perfeitamente porém como ela é baseada em storage, ao morrer com ela ativada, o player perde o storage e não consegue mais usar a spell para sempre.

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

  • 0

pq simplismente n tiram a funçao doMoveCreature do else? -deixando o resto como ta- ;x n achu q seja necessario ela ali...

 

Então, isso não interfere em nada tanto que achei q era esse o problema... pode me ajudar em refazer a spell com seus poderes de script Slicer?

Link para o comentário
Compartilhar em outros sites

  • 0

eu diria q a do zip ta perfeita ;x soh tem q tirar o doMove do else... ;x

 

ah sim, tem q verificar se o cid ainda ta online ;x e seria bom fazer a funçao ms da addEvent... melhor q deixar 40 addEvent programados...

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

  • 0

Valeu por lembrar, Slicer. Sobre o doMoveCreature dentro do else, não removi pois não sabia qual a intenção do cara quando não fosse "andável" a próxima posição. Se ele puder responder tal dúvida, poderá ajudar a "corrigir" essa parte.

Link para o comentário
Compartilhar em outros sites

  • 0

eu diria q a do zip ta perfeita ;x soh tem q tirar o doMove do else... ;x

 

ah sim, tem q verificar se o cid ainda ta online ;x e seria bom fazer a funçao ms da addEvent... melhor q deixar 40 addEvent programados...

 

Olha ai como deixei... mesma coisa

 

 

local area = {
{0, 0, 0},
{0, 3, 0},
{0, 0, 0},
}
function isWalkable(pos)-- by Nord / editado por Omega
if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then
return false
elseif isCreature(getTopCreature(pos).uid) then
return false
elseif getTileInfo(pos).protection then
return false
elseif hasProperty(getThingFromPos(pos).uid, 3) or hasProperty(getThingFromPos(pos).uid, 7) then
return false
end
return true
end
function onDash(cid)
local poslook = getCreatureLookPosition(cid)
poslook.stackpos = STACKPOS_TOP_MOVEABLE_ITEM_OR_CREATURE
if isWalkable(poslook) then
doMoveCreature(cid, getPlayerLookDirection(cid))
doSendMagicEffect(getPlayerPosition(cid), 2)
return true
end
end
function onCastSpell(cid, var)
addEvent(onDash, 700, cid)
addEvent(onDash, 800, cid)
addEvent(onDash, 900, cid)
addEvent(onDash, 1000, cid)
addEvent(onDash, 1100, cid)
addEvent(onDash, 1200, cid)
addEvent(onDash, 1300, cid)
addEvent(onDash, 1400, cid)
addEvent(onDash, 1500, cid)
addEvent(onDash, 1600, cid)
addEvent(onDash, 1700, cid)
addEvent(onDash, 1800, cid)
addEvent(onDash, 1900, cid)
addEvent(onDash, 2000, cid)
addEvent(onDash, 2100, cid)
addEvent(onDash, 2200, cid)
addEvent(onDash, 2300, cid)
addEvent(onDash, 2400, cid)
addEvent(onDash, 2500, cid)
addEvent(onDash, 2600, cid)
addEvent(onDash, 2700, cid)
addEvent(onDash, 2800, cid)
addEvent(onDash, 2900, cid)
addEvent(onDash, 3000, cid)
addEvent(onDash, 3100, cid)
addEvent(onDash, 3200, cid)
addEvent(onDash, 3300, cid)
addEvent(onDash, 3400, cid)
addEvent(onDash, 3500, cid)
addEvent(onDash, 3600, cid)
addEvent(onDash, 3700, cid)
return true
end

Respondendo o zip:
Acho que foi um erro aquele move depois do else... no entanto ele não interfere em nada... pode ver que eu testei a spell a cima e está atravessando alguns pisos ainda como poison, water e caves.
Editado por walquer
Link para o comentário
Compartilhar em outros sites

  • 0

/\ tu n intendeu oq eu quis dizer com botar o addEvent n funçao kk'

e sobre oq tu flo de ainda andar sobre poison, water e afins, isso eh BEMMMM complicado de arrumar kk' achu q o jeito mais simples eh pegar os tiles q ele ta andando e checar eles na funçao isWalkable tb... ;x

 

@zip

eh tb n intendi a ideia daquilo... se n eh andavel, pq ele vai tentar andar denovo? kk'

Link para o comentário
Compartilhar em outros sites

  • 0

/\ tu n intendeu oq eu quis dizer com botar o addEvent n funçao kk'

e sobre oq tu flo de ainda andar sobre poison, water e afins, isso eh BEMMMM complicado de arrumar kk' achu q o jeito mais simples eh pegar os tiles q ele ta andando e checar eles na funçao isWalkable tb... ;x

 

@zip

eh tb n intendi a ideia daquilo... se n eh andavel, pq ele vai tentar andar denovo? kk'

 

Mas sli... a segunda spell q eu postei funciona perfeitamente, no entanto quando o player morre com ela ativada o storage some e nunca mais volta. E detalhe: nao usa iswalkable.

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

  • 0

estranhu.. era pra essa 2* spell ae passar por cima de tudo ;x ate paredes e afins ;/

 

o real problema dessa funçao eh isso:

lua_pushnumber(L, g_game.internalMoveCreature(creature, (Direction)direction, FLAG_NOLIMIT));

essa FLAG_NOLIMIT q faz as sources n checarem a pos antes de mover a criatura ;x n intendo pq foi feito assim mas... se tu tiver as sources pode tirar essa flag dali e tudo deve da certo ;p

Link para o comentário
Compartilhar em outros sites

  • 0

Pior que nesse pc não consigo compilar as sources... meio tenso isso. Mas falando sobre a segunda spell, vc saberia como salvar o storage no player quando ele morresse? Tipo um creaturescript onDeath. Ai daria certo também.

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...