Ir para conteúdo
  • 0

Script de spell bem simples.


Douglasga03

Pergunta

Preciso fazer uma magia que ao ser usada faz com que a spear que o player estiver usando ricocheteie em mais dois alvos. Pode ser um script de arma ou uma magia que da essa propriedade.

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0
local combat = Combat()
combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)  -- Tipo de dano físico para simular spear
combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HITAREA)  -- Efeito visual
combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SPEAR)  -- Animação da spear arremessada

-- Configurações de ricochete
local bounceCount = 2  -- Número de ricochetes
local bounceRange = 5  -- Alcance de cada ricochete

function onCastSpell(creature, var)
    local target = creature:getTarget()  -- Obtém o alvo principal
    
    if not target or target:getHealth() <= 0 then
        creature:sendCancelMessage("Você precisa de um alvo válido para essa magia!")
        return false
    end
    
    -- Confirma que o jogador está usando uma spear
    local weapon = creature:getSlotItem(CONST_SLOT_LEFT)
    if not weapon or weapon:getType():getName():lower() ~= "spear" then
        creature:sendCancelMessage("Você precisa estar usando uma spear para lançar esta magia.")
        return false
    end

    -- Aplica dano no alvo principal
    combat:execute(creature, var)
    
    -- Função para encontrar alvos adicionais para o ricochete
    local function getNearbyTarget(currentTarget, excludeList)
        local spectators = Game.getSpectators(currentTarget:getPosition(), false, true, bounceRange, bounceRange, bounceRange, bounceRange)
        for _, spectator in ipairs(spectators) do
            if spectator:isMonster() and spectator ~= currentTarget and not excludeList[spectator:getId()] then
                return spectator
            end
        end
        return nil
    end

    -- Aplica ricochete nos alvos próximos
    local ricochetTarget = target
    local excludeList = {[target:getId()] = true}
    
    for i = 1, bounceCount do
        ricochetTarget = getNearbyTarget(ricochetTarget, excludeList)
        if not ricochetTarget then break end  -- Para o ricochete se não houver alvo próximo
        
        -- Atualiza a variável de alvo para o próximo ricochete
        local bounceVar = Position(ricochetTarget:getPosition())
        combat:execute(creature, Variant(bounceVar))
        
        -- Adiciona o alvo à lista de excluídos para não ser alvo novamente
        excludeList[ricochetTarget:getId()] = true
    end

    return true
end

 

Link para o comentário
Compartilhar em outros sites

  • 0
Em 31/10/2024 em 10:08, El Rusher disse:
local combat = Combat()
combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)  -- Tipo de dano físico para simular spear
combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HITAREA)  -- Efeito visual
combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SPEAR)  -- Animação da spear arremessada

-- Configurações de ricochete
local bounceCount = 2  -- Número de ricochetes
local bounceRange = 5  -- Alcance de cada ricochete

function onCastSpell(creature, var)
    local target = creature:getTarget()  -- Obtém o alvo principal
    
    if not target or target:getHealth() <= 0 then
        creature:sendCancelMessage("Você precisa de um alvo válido para essa magia!")
        return false
    end
    
    -- Confirma que o jogador está usando uma spear
    local weapon = creature:getSlotItem(CONST_SLOT_LEFT)
    if not weapon or weapon:getType():getName():lower() ~= "spear" then
        creature:sendCancelMessage("Você precisa estar usando uma spear para lançar esta magia.")
        return false
    end

    -- Aplica dano no alvo principal
    combat:execute(creature, var)
    
    -- Função para encontrar alvos adicionais para o ricochete
    local function getNearbyTarget(currentTarget, excludeList)
        local spectators = Game.getSpectators(currentTarget:getPosition(), false, true, bounceRange, bounceRange, bounceRange, bounceRange)
        for _, spectator in ipairs(spectators) do
            if spectator:isMonster() and spectator ~= currentTarget and not excludeList[spectator:getId()] then
                return spectator
            end
        end
        return nil
    end

    -- Aplica ricochete nos alvos próximos
    local ricochetTarget = target
    local excludeList = {[target:getId()] = true}
    
    for i = 1, bounceCount do
        ricochetTarget = getNearbyTarget(ricochetTarget, excludeList)
        if not ricochetTarget then break end  -- Para o ricochete se não houver alvo próximo
        
        -- Atualiza a variável de alvo para o próximo ricochete
        local bounceVar = Position(ricochetTarget:getPosition())
        combat:execute(creature, Variant(bounceVar))
        
        -- Adiciona o alvo à lista de excluídos para não ser alvo novamente
        excludeList[ricochetTarget:getId()] = true
    end

    return true
end

 

Esse script foi testado?

 

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...