Ir para conteúdo
Propaganda

Backstep barrage. - Spell de "salto e dano"


Posts Recomendados

Olá, este é meu primeiro tópico de magias e espero cativa-los com eles, sem delongas vamos à como ele funciona.
Você usa uma magia virado para uma direção e seu personagem pula na direção oposta deixando uma chuva de flechas onde você estava anteriormente.
Primeiro iremos colocar a tag no seu Spells.XML.

Lembrando que foi testado no TFS 1.4.2


 

	<instant group="attack" spellid="666" name="Backstep Barrage" words="Backstep Barrage" level="80" mana="200" premium="0" needtarget="0" cooldown="8000" groupcooldown="3000" needlearn="0" script="SEU OT/backstepbarrage.lua">
		<vocation name="Paladin" />
		<vocation name="Royal Paladin" />
	</instant>

 

Após ter feito isso, iremos colocar o código em sí.
Iremos até a pasta Scripts e lá dentro criaremos o arquivo BackstepBarrage.LUA
Após criado, cole este codigo dentro.

 

-- Configurações da magia
local teleportDistance = 5 -- Distância do recuo em SQMs
local damageRadius = 2 -- Raio do dano em área (2 = 5x5)
local baseDamage = 200 -- Dano base da magia
local damagePerSkill = 5 -- Dano adicional por nível de Distance Fighting (certifique-se de que está definido)
local speedBoostDuration = 5000 -- Duração do bônus de velocidade (5 segundos)
local speedBoost = 200 -- Valor do bônus de velocidade
local tempItemId = 26409 -- ID do item temporário
local tempItemDuration = 230 -- Tempo que o item fica no chão (230ms)
local blockedEffect = CONST_ME_BLOCKHIT -- Efeito visual ao atingir uma parede
local damageEffect = 181 -- Efeito visual do dano

-- Função para exibir efeito visual nos SQMs internos (removendo apenas as bordas)
local function showEffectAround(centerPosition, radius, effect)
    for x = -radius, radius do
        for y = -radius, radius do
            -- Remove apenas os SQMs das bordas (x ou y no limite do raio)
            if not (math.abs(x) == radius and math.abs(y) == radius) then
                local targetPosition = Position(centerPosition.x + x, centerPosition.y + y, centerPosition.z)
                targetPosition:sendMagicEffect(effect)
            end
        end
    end
end

-- Função para causar dano nos SQMs internos (removendo apenas as bordas)
local function doAreaDamage(centerPosition, radius, damage, caster)
    for x = -radius, radius do
        for y = -radius, radius do
            -- Remove apenas os SQMs das bordas (x ou y no limite do raio)
            if not (math.abs(x) == radius and math.abs(y) == radius) then
                local targetPosition = Position(centerPosition.x + x, centerPosition.y + y, centerPosition.z)
                local tile = Tile(targetPosition)
                if tile then
                    local creatures = tile:getCreatures()
                    if creatures then
                        for _, creature in ipairs(creatures) do
                            -- Verifica se a criatura não é o conjurador da magia
                            if (creature:isMonster() or (creature:isPlayer() and creature ~= caster)) then
                                creature:addHealth(-damage)
                            end
                        end
                    end
                end
            end
        end
    end
end

-- Função principal da magia
function onCastSpell(creature, variant)
    local player = creature:getPlayer()
    if not player then
        return false
    end

    -- Obtém o nível de Distance Fighting do jogador
    local distanceSkill = player:getSkillLevel(SKILL_DISTANCE)
    
    -- Calcula o dano escalado com base na skill de Distance Fighting
    local damage = baseDamage + (distanceSkill * damagePerSkill) -- Certifique-se de que damagePerSkill está definido

    -- Direção que o jogador está olhando
    local direction = player:getDirection()
    
    -- Posição atual do jogador
    local currentPosition = player:getPosition()
    
    -- Calcula a posição de destino com base na direção oposta
    local targetPosition = currentPosition
    for i = 1, teleportDistance do
        local nextPosition = Position(targetPosition) -- Cria uma nova posição baseada na atual
        if direction == NORTH then
            nextPosition.y = nextPosition.y + 1 -- Move para trás (oposto ao norte)
        elseif direction == SOUTH then
            nextPosition.y = nextPosition.y - 1 -- Move para trás (oposto ao sul)
        elseif direction == EAST then
            nextPosition.x = nextPosition.x - 1 -- Move para trás (oposto ao leste)
        elseif direction == WEST then
            nextPosition.x = nextPosition.x + 1 -- Move para trás (oposto ao oeste)
        end
        
        -- Verifica se o próximo quadrado é seguro (não é PZ, não tem paredes, etc.)
        local tile = Tile(nextPosition)
        if tile and not tile:hasProperty(CONST_PROP_IMMOVABLEBLOCKSOLID) and not tile:hasProperty(CONST_PROP_BLOCKSOLID) then
            targetPosition = nextPosition -- Atualiza a posição de destino
        else
            -- Se encontrar um obstáculo, para o loop e usa a última posição segura
            break
        end
    end
    
    -- Verifica se a posição de destino é diferente da atual
    if targetPosition ~= currentPosition then
        -- Exibe o efeito visual 181 nos SQMs internos (removendo apenas as bordas)
        showEffectAround(currentPosition, damageRadius, damageEffect)
        
        -- Causa dano nos SQMs internos (removendo apenas as bordas)
        doAreaDamage(currentPosition, damageRadius, damage, player) -- Passa o jogador como caster
        
        -- Teleporta o jogador para a posição segura após um pequeno atraso
        addEvent(function()
            player:teleportTo(targetPosition)
            
            -- Cria um item temporário no local de destino
            local tempItem = Game.createItem(tempItemId, 1, targetPosition)
            if tempItem then
                -- Remove o item após 230ms
                addEvent(function(pos)
                    local tile = Tile(pos)
                    if tile then
                        local item = tile:getItemById(tempItemId)
                        if item then
                            item:remove()
                        end
                    end
                end, tempItemDuration, targetPosition)
            end
            
            -- Aplica bônus de velocidade ao jogador
            player:addCondition(CONDITION_HASTE, speedBoostDuration, 0, speedBoost)
            
            -- Dispara efeitos visuais de flechas no local original (sem criar itens)
            local arrowCount = 3 -- Número de flechas
            for i = 1, arrowCount do
                addEvent(function()
                    currentPosition:sendMagicEffect(CONST_ME_ARROWATTACK) -- Efeito visual da flecha
                end, i * 200) -- Intervalo entre as flechas (200ms)
            end
        end, 100) -- Atraso de 100ms antes do teleporte
    else
        -- Se não houver movimento, mostra efeito de bloqueio
        currentPosition:sendMagicEffect(blockedEffect)
        player:sendCancelMessage("Não há espaço seguro para recuar.")
    end
    
    return true
end


E estará tudo pronto até aqui.
O script já está funcional? Provavelmente em seu servidor ainda não.
Você precisará criar um item "invisivel" ou "transparente" com elevação 8 no Object builder.


Após isso, coloque o ID do seu item novo aqui nesta linha:
 

local tempItemId = 26409 -- ID do item temporário

e tambem crie um efeito de flechas ou se preferir pode deixar uma explosão, vai da sua imaginação.
entao sabendo disso, mude nesta linha o efeito que deseja que apareça.
 

local damageEffect = 181 -- Efeito visual do dano




Espero que tenham gostado da magia, trarei mais logo logo.

Soul_Forge_9swHBu7ahA-ezgif.com-video-to-gif-converter.gif

  • Like 2
Link para o comentário
https://tibiadevs.com/forums/topic/845-backstep-barrage-spell-de-salto-e-dano/
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
  • Criar Novo...