19 minutos atrás, GamerGoiano disse:
@gabrielsaintz
local function spellCallback(cid, position, count)
local creature = Creature(cid)
if creature then
if count > 0 or math.random(0, 1) == 1 then
position:sendMagicEffect(CONST_ME_HITBYFIRE)
doAreaCombat(cid, COMBAT_FIREDAMAGE, position, 0, -100, -100, CONST_ME_EXPLOSIONHIT)
end
if count < 5 then
count = count + 1
addEvent(spellCallback, math.random(1000, 4000), cid, creature:getPosition(), count)
end
end
end
function onCastSpell(creature, variant, isHotkey)
spellCallback(creature:getId(), creature:getPosition(), 0)
return true
end
Eu tentei dessa forma também, porém não funcionou... Depois de um tempo printando o que vem de informação em cada parte, eu entendi o que é passado no position da combat:setCallback(CALLBACK_PARAM_TARGETTILE, "onTargetTile").
Explicação:
function spellCallback(cid, position, count)
if Creature(cid) then
--[[
TEXTO 3
Sendo executada 4 vezes ao mesmo tempo e passando uma posição diferente a cada execução.
Ela gera aquela primeira explosão do exemplo gif.
Perceba que no gif a primeira explosão sai de forma aleatoria e não na AREA_CIRCLE5X5 como uma AOE(exevo gran mas frigo).
Explicação: TEXTO 4
--]]
if count > 0 or math.random(0, 1) == 1 then
--[[
TEXTO 4
Esse if torna a primeira explosão aleatoria pois ele só executa a doAreaCombat se o math.random(0, 1) for igual a 1,
assim fazendo com q, mesmo ela sendo executada varias vezes ao mesmo tempo, ele só dispara o dano e o efeito quando
ela entrar aqui, nesse if.
Caso eu mude esse if para:
if count >= 0 then
Ai sim ela vai excutar na AREA_CIRCLE5X5 completa...
EXPLICAÇÃO BASEADA NO GIF.
--]]
position:sendMagicEffect(CONST_ME_MORTAREA)
doAreaCombat(cid, COMBAT_DEATHDAMAGE, position, 0, -100, -100, CONST_ME_EXPLOSIONHIT)
end
if count < 3 then -- QUANTIDADE DE VEZES
count = count + 1
--[[
TEXTO 5
Aqui é gerado os hits aletorios depois da primeira execução. me baseando na area que eu passei
com 4 posições de hit, a partir o momento em que você usar a magia esse addEvent será executado
4 vezes ao mesmo tempo e passando uma posição diferente a cada execução.
Porém como da pra ver a baixo no delay usamos tempo aleatorio que é dado pelo math.random(1000, 4000).
Isso gera um loop de hits aleatorios dentro da area setada, até que o count chegue ao valor desejado.
No caso desse código ele vai ser executado até que o count seja 3, isso faz com que a função spellCallback
seja executada 20 vezes passando as mesmas posições dentro da area passada no inicio, porém o que torna
aleatorio onde vai o efeito e dano é justamente o tempo em que ela vai ser executada.
--]]
addEvent(spellCallback, math.random(1000, 4000), cid, position, count)
end
end
end
function onTargetTile(creature, position)
--[[
TEXTO 2
Aqui recebemos o creature e position da combat:setCallback(CALLBACK_PARAM_TARGETTILE, "onTargetTile").
creature = seu personagem
position = {
{0,1,0}, execução 1
{1,3,0}, execução 2 e 3
{0,1,0} execução 4
}
Sendo assim ele vai executar a função spellCallback 4 vezes, e cada vez que for executada ela vai passar
uma posição diferente, dentro da area que eu passei.
--]]
spellCallback(creature:getId(), position, 0)
end
local combat = Combat()
combat:setArea(createCombatArea(AREA_CIRCLE5X5))
combat:setCallback(CALLBACK_PARAM_TARGETTILE, "onTargetTile")
--[[
TEXTO 1
A CALLBACK_PARAM_TARGETTILE vai executar a onTargetTile varias vezes, isso depende
do tamanho da área que você passou na combat:setArea(createCombatArea(AREA_CIRCLE5X5)).
Exemplo:
Se ao invés de AREA_CIRCLE5X5 eu passar uma área menor como:
local area {
{0,1,0}, <- 1 = posição de dano #1
{1,3,0}, <- 1,3 = posição de dano #2 e #3
{0,1,0} <- 1 = posição de dano #4
}
combat:setArea(createCombatArea(area))
Ela vai ser executada 4 vezes ao mesmo tempo porque na area que eu passei existem 4 posições de dano.
A cada vez que ela executar ela vai passar as areas, uma de cada vez, sendo #1, #2, #3 e por ultimo #4.
--]]
function onCastSpell(creature, variant, isHotkey)
return combat:execute(creature, variant)
end
Então não adianta eu pegar o position assim creature:getPosition() porque a position é a posição onde vai hit se eu usar a posição do meu personagem o hit vai sempre nele mesmo...
Espero que consiga entender, dei meu maximo na explicação...
Para resolver o problema, eu preciso arrumar uma forma de pegar uma posição aleatoria com base na posição do meu personagem toda vez antes de executar a spellCallback.