Jump to content
Close
Tadelho

Scripting Alvos específicos em spells de área!

Recommended Posts

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!


Edited by Tadelho (see edit history)



Share this post


Link to post
Share on other sites

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.

 



Não esqueçam de me marca quando eu responder em seu tópico, assim recebo a notificação e volto em seu tópico.
Não dou suporte em mensagem privada ou fora do fórum.
Não esqueça de reputa e agradecer a pessoa que lhe ajudou em algum tópico seu.
"Só ajudo quem eu vejo ajudando." xD

Não esqueça de reputa alguém que lhe ajudou ou tentou lhe ajudar, e agradeça com suas palavras. Seja grato por alguém ter lhe ajudado ou tentado lhe ajudar!

O coitadismo e o conformismo potencializado é a arte de sentir compaixão de si mesmo para você não utilize ferramentas capazes de transformar
sua história!!

-- Augusto Cury

 

                                                               ezgif-1-98aab239f3.gif




Share this post


Link to post
Share on other sites

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





Share this post


Link to post
Share on other sites
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/
 




Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


Open Tibia Server

Quer aprender a criar seu próprio servidor de Tibia? Então está no lugar certo, aqui você encontrará milhares de tutorias, scripts, códigos, mapas e utilitários para que você possa fazer o seu próprio servidor de Tibia começando do zero.

Redes Sociais

Anuncie no Tibia King

Precisa de mais visibilidade em seus projetos? Quer fazer um plano publicitário para o seu servidor? Anuncie no Tibia King e faça sua divulgação, possuímos centenas de acessos simultâneos e milhares diários, com certeza será a sua solução!

×
×
  • Create New...