Ir para conteúdo

Featured Replies

Postado
  • Este é um post popular.

Conforme tive uma dúvida outro dia, consegui obter uma solução satisfatória e, sabendo que pode ser a dúvida de mais gente, resolvi compartilhar na forma deste pequeno tutorial.

A ideia é muito simples: fazer com que uma spell de área atinga apenas alguns alvos conforme uma característica específica.  Isso pode ser bastante útil para diversas ideias, além do script base servir para tantos outros efeitos interessantes. 

 

Atenção, fiz os scripts para: TFS 0.4.0

 

Teremos como base para esse exemplo a magia "divine caldera", o famoso "exevo mas san".

 

Nela teremos o seguinte script:

 

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_HOLYAREA)
setAttackFormula(combat, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 4, 6)

local area = createCombatArea(AREA_CIRCLE3X3)
setCombatArea(combat, area)

function onCastSpell(cid, var)
	return doCombat(cid, combat, var)
end

 

Desta forma, a magia atingirá todos os alvos em sua área de alcance. Mas queremos mudar isso, queremos que ela atinja alvos específicos, e aqui entram algumas ideias, por exemplo: podemos fazer com que ela acerte apenas players de um determinado level, players de uma determinada vocação, players com um determinado access, ou mesmo uma storage, ou ainda, como no exemplo que darei a seguir, fazer com que a magia acerte apenas alvos com um determinado nome (no caso, serão criaturas e não players).

 

 

Para isso, utilizaremos uma função, "onTargetCreature(cid, target)" e depois a chamaremos como parâmetro de um "setCombatCallback(combat, key, function_name)".

 

Na função onTargetCreature nós faremos a verificação desejada. Por exemplo, no código a seguir eu quero que a minha spell atinja apenas criaturas com o nome de "rat" ou "cave rat", então ficaria assim:

 

function onTargetCreature(cid, target)
	local creatures = {"rat", "cave rat"}
	if isMonster(target) and isInArray(creatures, getCreatureName(target)) then
	doTargetCombatHealth(cid, target, type, min, max, effect)
	end
end

Traduzindo: eu criei uma tabela local com os nomes desejados, verifiquei se o alvo era um monstro e se o nome do monstro constava na minha tabela recém criada. Sendo verdadeiro, acionei a função doTargetCombatHealth(cid, target, type, min, max, effect). -- Lembrando que conforme o tipo da sua magia você vai alterar os parâmetros dessa função para que ela tenha as animações e o dano compatíveis com o seu gosto/objetivo.

 

Outro detalhe é que nesse trecho de código acima é que é feita a verificação que eu desejo. Eu poderia ao invés disso verificar se é um jogador e se a vocação dele tem o id 1 ou 2, por exemplo. Ficaria:

function onTargetCreature(cid, target)
	local vocations = {1, 2}
	if isPlayer(target) and isInArray(vocations, getPlayerVocation(target)) then
	doTargetCombatHealth(cid, target, type, min, max, effect)
	end
end

Ou verificar um level, para que a magia só funcione em alvos acima do level X, etc. Exemplo:

 

function onTargetCreature(cid, target)
	local level = 80
	if isPlayer(target) and getPlayerLevel(target) >= 80 then
	doTargetCombatHealth(cid, target, type, min, max, effect)
	end
end

 

Feita a função, faremos aquilo que mencionei: a chamaremos como parâmetro da função "setCombatCallback" para o nosso "combat". Fica assim:

 

setCombatCallback(combat, CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature")

 

Feito isso, pronto! Basta chamarmos a spell normalmente.

 

Exemplo de tudo pronto para uma magia "exevo mas san" que só acerte os ratos e tira de 10 a 20 de vida:

 

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_HOLYAREA)
 
local area = createCombatArea(AREA_CIRCLE3X3)
setCombatArea(combat, area)
 
function onTargetCreature(cid, target)
	local creatures = {"rat", "cave rat"}
	if isMonster(target) and isInArray(creatures, getCreatureName(target)) then
	doTargetCombatHealth(cid, target, COMBAT_HOLYDAMAGE, -10, -20, CONST_ME_HOLYAREA)
	end
end
 
setCombatCallback(combat, CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature")
 
function onCastSpell(cid, var)
    return doCombat(cid, combat, var)
end

Agora é com a criatividade de vocês!

Até a próxima!

Editado por Tadelho (veja o histórico de edições)

Postado

Parabéns, seu tópico de conteúdo foi aprovado!
Muito obrigado pela sua contribuição, nós do Tibia King agradecemos.
Seu conteúdo com certeza ajudará à muitos outros, você recebeu +1 REP.

Spoiler

Congratulations, your content has been approved!
Thank you for your contribution, we of Tibia King we are grateful.
Your content will help many other users, you received +1 REP.

 

                                                              ezgif-1-98aab239f3.gif.1a897c9c3225228909e7b356a5cfb8e4.gif

  • 1 month later...
  • 5 months later...
Postado
Em 03/02/2019 em 03:53, Grotthiago disse:

Tem como colocar para atingir apenas players/criatura com tal  storage? E quando atingir, remove esta storage?

 

function onTargetCreature(cid, target)
	if isCreature(target) and getCreatureStorage(target, chaveStorage) > 0 then
	   doTargetCombatHealth(cid, target, COMBAT_HOLYDAMAGE, -10, -20, CONST_ME_HOLYAREA)
           doCreatureSetStorage(target, chaveStorage, -1)
	end
end

Toda terça-feira um tópico novo:

Descanso para curar mana (Spell): https://tibiaking.com/forums/topic/94615-spell-descanso-para-curar-mana/

Peça sua spell (Suporte):                https://tibiaking.com/forums/topic/84162-peça-sua-spell/                        

Chuva de flechas (Spell):                https://tibiaking.com/forums/topic/72232-chuva-de-flechas-spell/

Doom (Spell):                                https://tibiaking.com/forums/topic/51622-doom-spell/

Utilização do VS Code (Infra)       https://tibiaking.com/forums/topic/94463-utilizando-o-visual-studio-code-notepad-nunca-mais/

SD com Combo (Spell):                 https://tibiaking.com/forums/topic/94520-sd-modificada/

Alteração attack speed (C++):        https://tibiaking.com/forums/topic/94714-c-attack-speed-spells-itens-e-onde-você-quiser/  

Bônus de Speed (NPC)                  https://tibiaking.com/forums/topic/94809-npc-concede-bônus-aos-players/
 

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.

Conteúdo Similar

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo