Ir para conteúdo
  • Cadastre-se

(Resolvido)Corrigir Spell tfs 1.4.2


Ir para solução Resolvido por gabrielsaintz,

Posts Recomendados

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.

Link para o post
Compartilhar em outros sites
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()

Link para o post
Compartilhar em outros sites
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)
Link para o post
Compartilhar em outros sites
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

 

Link para o post
Compartilhar em outros sites
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.
 

Link para o post
Compartilhar em outros sites
  • Solução

 

Consegui arrumar uma solução!!

Depois de muito tempo fazendo testes cheguei a esse resultado:

 

local combat = Combat()
combat:setArea(createCombatArea(AREA_CIRCLE5X5))

function getRandomPositions(cid)
	local player = Player(cid)
	local playerPos = player:getPosition()	

	local areaCircle5x5 = {} -- cria uma nova AREA_CIRCLE5X5 com base na posição do meu personagem
	for i = -5, 5 do
		for j = -5, 5 do
			local dist = math.sqrt(i^2 + j^2)
			if dist <= 5 then
			table.insert(areaCircle5x5, {x=playerPos.x+i, y=playerPos.y+j, z=playerPos.z})
			end
		end
	end

    local randomPosition = {}
    for i = 1, 1 do 
        local index = math.random(1, #areaCircle5x5)
        table.insert(randomPosition, areaCircle5x5[index])
    end
    return randomPosition
end

function spellCallback(cid, position, count, maxCount)
	if Creature(cid) and count < maxCount then
		if count == 0 and math.random(0, 1) == 1 or math.random(0, 15) == 1 then
			position:sendMagicEffect(CONST_ME_MORTAREA)
			doAreaCombat(cid, COMBAT_DEATHDAMAGE, position, 0, -100, -100, CONST_ME_EXPLOSIONHIT)
		end

		count = count + 1
		
		local area = getRandomPositions(cid) -- pega uma nova posição aleatoria com base na posição do meu personagem
		local positionAreaCircle = {x= area[1].x, y= area[1].y, z= area[1].z}
		local position1 = Position(positionAreaCircle)

		if count > 1 and count < 81 or count > 81 and count < 145 then
			addEvent(spellCallback,50, cid, position1, count, maxCount)			
		else	
			addEvent(spellCallback,math.random(1000, 2000) , cid, position1, count, maxCount)		
		end

		if count > 141 then 			
			addEvent(spellCallback,math.random(600, 3000) , cid, position1, count, maxCount)	
		end
	end
end

function onTargetTile(creature, position)
	local maxCount = 145 -- quantidade de execuções
	spellCallback(creature:getId(), position, 0, maxCount)
end

combat:setCallback(CALLBACK_PARAM_TARGETTILE, "onTargetTile") 

function onCastSpell(creature, variant, isHotkey)
	return combat:execute(creature, variant)
end

 

Dentro do game:

 

spacer.png

 

@FeeTads de qualquer forma obrigado pela ajuda!

Link para o post
Compartilhar em outros sites

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

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo