1local combat = Combat() -- Cria o objeto de combate
2combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) -- Define o tipo de dano (dano sagrado)
3combat:setParameter(COMBAT_PARAM_EFFECT, 127) -- Define o efeito visual do feitiço (ID 123)
4
5-- Fórmula para calcular o dano
6function onGetFormulaValues(player, level, magicLevel)
7 -- Cálculo do dano mínimo:
8 -- (level / 4): Dano que cresce com o nível do jogador
9 -- (magicLevel * 4.6): Multiplicador do nível mágico com valor 4.6
10 -- + 8: Valor base mínimo
11 local min = (level / 4) + (magicLevel * 4.6) + 8
12
13 -- Cálculo do dano máximo:
14 -- (level / 4): Dano que cresce com o nível do jogador
15 -- (magicLevel * 4.2): Multiplicador do nível mágico com valor 4.2
16 -- + 14: Valor base máximo
17 local max = (level / 4) + (magicLevel * 4.2) + 14
18
19 return -min, -max -- Retorna os valores negativos (redução de HP)
20end
21
22combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") -- Associa a função de dano ao combate
23
24-- Tabela com os efeitos visuais para cada direção
25local effects = {
26 [NORTH] = 90, -- Efeito para o Norte (ID 90)
27 [EAST] = 88, -- Efeito para o Leste (ID 88)
28 [SOUTH] = 126, -- Efeito para o Sul (ID 124)
29 [WEST] = 89 -- Efeito para o Oeste (ID 89)
30}
31
32local function applyDamage(creature, startPos, distance)
33 local dir = creature:getDirection() -- Direção do atacante
34 local currentPos = startPos -- Posição inicial do efeito
35 local lastTarget = nil -- Armazena o último alvo que tomou dano
36
37 for i = 0, distance - 1 do
38 -- Cada passo do efeito é executado com um delay de i * 100ms
39 addEvent(function()
40 if not creature or creature:isRemoved() then return end
41
42 -- Percorre os tiles adjacentes (offset de -1 a 1) para efeito de dano em área
43 for offsetX = -1, 1 do
44 local tile
45 if dir == NORTH or dir == SOUTH then
46 tile = Tile(Position(currentPos.x + offsetX, currentPos.y, currentPos.z))
47 else
48 tile = Tile(Position(currentPos.x, currentPos.y + offsetX, currentPos.z))
49 end
50
51 if tile then
52 local target = tile:getTopCreature() -- Procura a criatura presente no tile
53 if target and (target:isMonster() or target:isPlayer()) and target:getId() ~= creature:getId() then
54 -- Ajusta o eixo x e y para o effect 123:
55 local targetPos = target:getPosition()
56 targetPos.x = targetPos.x + 0 -- ajuste no eixo x (modifique se necessário)
57 targetPos.y = targetPos.y + 0 -- ajuste no eixo y (modifique se necessário)
58 combat:execute(creature, Variant(targetPos)) -- Executa o ataque
59
60 -- Cria a condição de paralisia para o alvo
61 local paralysis = Condition(CONDITION_PARALYZE)
62 paralysis:setParameter(CONDITION_PARAM_TICKS, 2000) -- Dura 2000ms (2 segundos)
63 paralysis:setFormula(-0.9, 0, -0.9, 0) -- Parâmetros fixos da paralisia
64 target:addCondition(paralysis)
65
66 -- Envia o efeito visual (ID 85) 10 vezes, com intervalos de 300ms
67 for j = 0, 9 do
68 addEvent(function()
69 if target and not target:isRemoved() then
70 target:getPosition():sendMagicEffect(127)
71 end
72 end, j * 600)
73 end
74
75 lastTarget = target -- Atualiza o último alvo que tomou dano
76 end
77 end
78 end
79
80 -- Atualiza a posição para o próximo tile conforme a direção do atacante
81 if dir == NORTH then
82 currentPos.y = currentPos.y - 1
83 elseif dir == EAST then
84 currentPos.x = currentPos.x + 1
85 elseif dir == SOUTH then
86 currentPos.y = currentPos.y + 1
87 elseif dir == WEST then
88 currentPos.x = currentPos.x - 1
89 end
90 end, i * 100) -- Delay de 100ms entre cada passo
91 end
92
93 -- Após todos os passos, teleporta o último alvo atingido para frente do conjurador
94 addEvent(function()
95 if lastTarget and not lastTarget:isRemoved() and creature and not creature:isRemoved() then
96 local casterPos = creature:getPosition()
97 local teleportPos = Position(casterPos.x, casterPos.y, casterPos.z)
98 if dir == NORTH then
99 teleportPos.y = teleportPos.y - 1
100 elseif dir == EAST then
101 teleportPos.x = teleportPos.x + 1
102 elseif dir == SOUTH then
103 teleportPos.y = teleportPos.y + 1
104 elseif dir == WEST then
105 teleportPos.x = teleportPos.x - 1
106 end
107 lastTarget:teleportTo(teleportPos)
108 teleportPos:sendMagicEffect(127) -- Efeito visual na nova posição do alvo
109 end
110 end, distance * 100 + 50) -- Executa após o último passo do efeito
111end
112
113local function showEffectInFront(creature)
114 local dir = creature:getDirection()
115 local pos = creature:getPosition()
116
117 -- Define os offsets para posicionar o efeito visual "na frente" do personagem
118 if dir == NORTH then
119 pos.x = pos.x + 2 -- Avança 2 tiles no eixo x
120 pos.y = pos.y - 1 -- Retrocede 1 tile no eixo y
121 elseif dir == EAST then
122 pos.x = pos.x + 6 -- Avança 6 tiles no eixo x
123 pos.y = pos.y + 2 -- Avança 2 tiles no eixo y
124 elseif dir == SOUTH then
125 pos.x = pos.x + 0 -- Permanece no mesmo x
126 pos.y = pos.y + 4 -- Avança 2 tiles no eixo y
127 elseif dir == WEST then
128 pos.x = pos.x - 1 -- Retrocede 1 tile no eixo x
129 pos.y = pos.y + 2 -- Avança 2 tiles no eixo y
130 end
131
132 local effect = effects[dir] or CONST_ME_ENERGYAREA -- Seleciona o efeito conforme a direção ou usa padrão
133 pos:sendMagicEffect(effect) -- Envia o efeito visual para a posição calculada
134end
135
136function onCastSpell(creature, var)
137 local waittime = 1 -- Cooldown de 1 segundo entre os lançamentos da magia
138 local storage = 99916 -- Chave de armazenamento para controle do cooldown
139
140 if creature:getStorageValue(storage) > os.time() then
141 creature:sendCancelMessage("Você só pode usar esta magia novamente em [" ..
142 (creature:getStorageValue(storage) - os.time()) .. "] segundos.")
143 return false
144 end
145
146 creature:setStorageValue(storage, os.time() + waittime) -- Atualiza o cooldown para o próximo uso
147
148 local originalOutfit = creature:getOutfit() -- Guarda o visual original do personagem
149 creature:getPosition():sendMagicEffect(127) -- Effect 320 no conjurador
150
151 -- Define a sequência de outfits (lookType de 90 a 101) para a animação
152 local outfits = {
153 {lookType = 90}, -- Look inicial
154 {lookType = 91}, -- Segundo visual
155 {lookType = 92}, -- Terceiro visual
156 {lookType = 93}, -- Quarto visual
157 {lookType = 94}, -- Quinto visual
158 {lookType = 95}, -- Sexto visual
159 {lookType = 96}, -- Sétimo visual
160 {lookType = 97}, -- Oitavo visual
161 {lookType = 98}, -- Nono visual
162 {lookType = 99}, -- Décimo visual
163 {lookType = 100}, -- Décimo primeiro visual
164 {lookType = 101}, -- Décimo segundo visual
165 {lookType = 85}
166 }
167
168 -- Impede o movimento do jogador enquanto a magia é executada (paralisia temporária)
169 local paralysis = Condition(CONDITION_PARALYZE)
170 paralysis:setParameter(CONDITION_PARAM_TICKS, 900) -- Paralisia dura 900ms
171 paralysis:setFormula(-1.0, 0, -1.0, 0) -- Parâmetros fixos da paralisia
172 creature:addCondition(paralysis)
173
174 -- Troca o outfit a cada 80ms para criar a animação
175 for i = 1, #outfits do
176 addEvent(function()
177 if creature and not creature:isRemoved() then
178 creature:setOutfit(outfits[i])
179 end
180 end, (i - 1) * 80)
181 end
182
183 -- Aplica os efeitos visuais e o dano após 380ms
184 addEvent(function()
185 if not creature or creature:isRemoved() then return end
186
187 local startPos = creature:getPosition() -- Posição de início do efeito
188 local distance = 6 -- Distância que o efeito percorre (6 tiles)
189
190 showEffectInFront(creature) -- Mostra o efeito na frente do personagem
191 applyDamage(creature, startPos, distance) -- Aplica o dano e os efeitos aos alvos no caminho
192 end, 380)
193
194 -- Restaura o visual original do personagem após a sequência de animação
195 addEvent(function()
196 if creature and not creature:isRemoved() then
197 creature:setOutfit(originalOutfit)
198 end
199 end, (#outfits * 100) + 300) -- Tempo total com base na sequência de outfits
200
201 return false
202end
203