16
pedido

Spell doMoveCreature

Por 161996, 05 de abr. de 2014 em Scripts

spell do movecreature
resolvido
23
3.7k
1619961
05 de abril de 2014 às 11:25

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 Abril 5 por walquer

zipter98Z
05 de abril de 2014 às 11:56

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 Abril 5 por zipter98

1619961
05 de abril de 2014 às 12:08

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 Abril 5 por walquer

zipter98Z
05 de abril de 2014 às 12:16

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 Abril 5 por zipter98

1619961
05 de abril de 2014 às 12:27

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 Abril 7 por walquer

DuuhzinhowD
05 de abril de 2014 às 14:38

A funçao da spell seria controlar seu alvo pelo ctrl+setas?

1619961
05 de abril de 2014 às 15:25

Exato. As duas spells que eu postei fazem isso, no entanto cada uma tem um tipo de bug.

Editado Abril 5 por walquer

SlicerS
05 de abril de 2014 às 16:22

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

1619961
05 de abril de 2014 às 16:25

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?

SlicerS
05 de abril de 2014 às 16:35

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 Abril 5 por Slicer

zipter98Z
05 de abril de 2014 às 17:16

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.

1619961
05 de abril de 2014 às 17:34

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 Abril 5 por walquer

SlicerS
05 de abril de 2014 às 18:26

/\ 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'

1619961
05 de abril de 2014 às 18:33

/\ 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 Abril 7 por walquer

SlicerS
05 de abril de 2014 às 20:07

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