Postado Abril 19, 2023 2 anos Eai galera! Tenho uma Spell porém queria que ela seguisse meu personagem, alguém pode me dizer uma forma de fazer isso? A magia ta assim: function spellCallback(cid, position, count) if Creature(cid) 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, position, count) end end end function onTargetTile(creature, position) spellCallback(creature:getId(), position, 0) end local combat = Combat() combat:setArea(createCombatArea(AREA_CIRCLE5X5)) combat:setCallback(CALLBACK_PARAM_TARGETTILE, "onTargetTile") function onCastSpell(creature, variant, isHotkey) return combat:execute(creature, variant) end Dentro do game: Quando ando para a esquerda ela continua na posição de onde eu fiz o cast dela. Até entendo o porque disso, ela só esta sendo executada 1 vez, com isso ela só registra a posição do meu personagem na hora que é castada. Meu objetivo é manter essa aleatoriedade nos hits porém quero que ela acompanhe meu personagem.
Postado Abril 19, 2023 2 anos 15 minutos atrás, gabrielsaintz disse: addEvent(spellCallback, math.random(1000, 4000), cid, position, count) vc chama um evento chamando a "position" que ja foi passada la atras, ou seja, ela é fixa. troque pra: addEvent(spellCallback, math.random(1000, 4000), cid, cid:getPosition(), count) lembrando que "cid" era usado na OTX, recomendo vc trocar cid por player. 16 minutos atrás, gabrielsaintz disse: function onTargetTile(creature, position) spellCallback(creature:getId(), position, 0) end creio que você não precisa da função onTargetTile mas caso precisa troque position por creature:getPosition()
Postado Abril 19, 2023 2 anos Autor Em 19/04/2023 em 18:09, FeeTads disse: vc chama um evento chamando a "position" que ja foi passada la atras, ou seja, ela é fixa. troque pra: addEvent(spellCallback, math.random(1000, 4000), cid, cid:getPosition(), count) lembrando que "cid" era usado na OTX, recomendo vc trocar cid por player. creio que você não precisa da função onTargetTile mas caso precisa troque position por creature:getPosition() Bom... a magia ficou me seguindo, porém ela deixou de ser em area e ficou dando hits no meu sqm function spellCallback(cid, position, count) if Creature(cid) then local player = Player(cid) if count > 0 or math.random(0, 1) == 1 then position:sendMagicEffect(CONST_ME_HITBYFIRE) doAreaCombat(cid, COMBAT_FIREDAMAGE, player:getPosition(), 0, -100, -100, CONST_ME_EXPLOSIONHIT) end if count < 5 then count = count + 1 addEvent(spellCallback, math.random(1000, 4000), cid, player:getPosition(), count) end end end function onTargetTile(creature, position) spellCallback(creature:getId(), creature:getPosition() , 0) end local combat = Combat() combat:setArea(createCombatArea(AREA_CIRCLE5X5)) combat:setCallback(CALLBACK_PARAM_TARGETTILE, "onTargetTile") function onCastSpell(creature, variant, isHotkey) return combat:execute(creature, variant) end no game: Editado Abril 21, 2023 2 anos por gabrielsaintz ficou oculto (veja o histórico de edições)
Postado Abril 25, 2023 2 anos Em 19/04/2023 em 19:06, gabrielsaintz disse: ficou dando hits no meu sqm tenta colocar assim então function spellCallback(cid, position, count) if Creature(cid) 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, cid:getPosition(), count) end end end function onTargetTile(creature, position) spellCallback(creature:getId(), position, 0) end local combat = Combat() combat:setArea(createCombatArea(AREA_CIRCLE5X5)) combat:setCallback(CALLBACK_PARAM_TARGETTILE, "onTargetTile") function onCastSpell(creature, variant, isHotkey) return combat:execute(creature, variant) end
Postado Abril 25, 2023 2 anos Autor 11 horas atrás, FeeTads disse: tenta colocar assim então function spellCallback(cid, position, count) if Creature(cid) 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, cid:getPosition(), count) end end end function onTargetTile(creature, position) spellCallback(creature:getId(), position, 0) end local combat = Combat() combat:setArea(createCombatArea(AREA_CIRCLE5X5)) combat:setCallback(CALLBACK_PARAM_TARGETTILE, "onTargetTile") function onCastSpell(creature, variant, isHotkey) return combat:execute(creature, variant) 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 cid:getPosition() e nem assim player: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.
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.