Ir para conteúdo

Featured Replies

Postado

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:

spacer.png


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.

Resolvido por gabrielsaintz

Ir para solução
  • Respostas 5
  • Visualizações 770
  • Created
  • Última resposta

Top Posters In This Topic

Most Popular Posts

  • gabrielsaintz
    gabrielsaintz

    Consegui arrumar uma solução!! Depois de muito tempo fazendo testes cheguei a esse resultado:   local combat = Combat() combat:setArea(createCombatArea(AREA_CIRCLE5X5)) function getRandomP

Postado
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
  • 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:

spacer.png

Editado por gabrielsaintz
ficou oculto (veja o histórico de edições)

Postado
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
  • 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.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo