kenai 24 Postado 1 de Fevereiro Compartilhar Postado 1 de Fevereiro 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. 2 Link para o comentário https://tibiadevs.com/forums/topic/845-backstep-barrage-spell-de-salto-e-dano/ Compartilhar em outros sites Mais opções de compartilhamento...
Posts Recomendados
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 contaEntrar
Já tem uma conta? Faça o login.
Entrar Agora