Ir para conteúdo
  • 0

Jump Spell


Fabious

Pergunta

Olá, tudo bem?

Estou tentando fazer uma magia em que quando o player solta ela, ele é teleportado para a posição de cada monstro ao seu redor, da 1 hit em cada um por vez, após terminar isso, volta para a posição inicial de quando soltou a magia.

Olha:

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, true)

function onGetFormulaValues(cid, level, skill, attack, factor)
	local skillTotal, levelTotal = skill + attack, level / 5
	return -(skillTotal / 3 + levelTotal), -(skillTotal + levelTotal)
end

setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")



function attack(cid, pos, toPos, fromPos, var)
    if #validTargets > 0 then
            if doCombat(cid, combat, var) == LUA_NO_ERROR then
                doTeleportThing(cid,validTargets[1])
                doSendMagicEffect(getPlayerPosition(cid), 61)
                table.remove(validTargets, validTargets[1])
                addEvent(attack, 200, cid)
            end
    else
        doTeleportThing(cid, playerfirstpos[1])
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Nenhum alvo valido encontrado.")
        for k in pairs(playerfirstpos) do
            playerfirstpos[k] = nil
        end
    end
return true
end

playerfirstpos = {}
validTargets = {}
function onCastSpell(cid, var)
local pos = getCreaturePosition(cid)  
local creatures = getSpectators(pos, 3, 3, false) 
    if table.insert(playerfirstpos, pos) then
        if creatures then
            for _, target in ipairs(creatures) do
                if isCreature(target) and (isPlayer(target) or isMonster(target)) then
                    table.insert(validTargets, target) 
                end
            end
            addEvent(attack, 1, cid)
        else
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Nenhum alvo valido encontrado.")
        end
    end
return true
end

Mas não consegui... alguém pode me ajudar?

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

O seu script está no caminho certo, mas alguns ajustes são necessários para alcançar o comportamento desejado. Vou ajudá-lo a modificar o código para atingir o objetivo:

 

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, true)

function onGetFormulaValues(cid, level, skill, attack, factor)
    local skillTotal, levelTotal = skill + attack, level / 5
    return -(skillTotal / 3 + levelTotal), -(skillTotal + levelTotal)
end

setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")

function attackCreature(cid, target, var)
    if not isCreature(cid) or not isCreature(target) then
        return false
    end

    local playerPos = getCreaturePosition(cid)
    local targetPos = getCreaturePosition(target)

    if doCombat(cid, combat, var) == LUA_NO_ERROR then
        doTeleportThing(cid, targetPos)
        doSendMagicEffect(targetPos, 61)
    end

    return true
end

function onCastSpell(cid, var)
    local playerPos = getCreaturePosition(cid)
    local creatures = getSpectators(playerPos, 3, 3, false)

    if not creatures or #creatures == 0 then
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Nenhum alvo válido encontrado.")
        return false
    end

    for _, target in ipairs(creatures) do
        if isCreature(target) and (isPlayer(target) or isMonster(target)) then
            addEvent(attackCreature, 100, cid, target, var)
        end
    end

    addEvent(doTeleportThing, 100 * #creatures, cid, playerPos)
    return true
end

Renomeei a função attack para attackCreature para refletir melhor sua função.
Removi a variável validTargets, pois agora estamos atacando um alvo por vez e não armazenando múltiplos alvos.
Adicionei um evento para teleportar o jogador de volta para a posição inicial após atacar todos os alvos.
Corrigi o loop for em onCastSpell para chamar attackCreature para cada alvo, em vez de chamar attack diretamente.
Adicionei uma verificação para garantir que apenas alvos válidos (jogadores ou monstros) sejam atacados.
Adicionei uma verificação para garantir que pelo menos um alvo válido seja encontrado antes de prosseguir com a magia.

Link para o comentário
Compartilhar em outros sites

  • Quem Está Navegando   0 membros estão online

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