Jump to content
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.

 


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

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.


  • Similar Content

    • By FearWar
      Olá Tks,
      Estou com um problema, adicionei uma nova moeda no meu servidor (source), porém o change gold não está funcionando.
       

       
      local config = { [ITEM_GOLD_COIN] = {changeTo = ITEM_PLATINUM_COIN}, [ITEM_PLATINUM_COIN] = {changeBack = ITEM_GOLD_COIN, changeTo = ITEM_CRYSTAL_COIN}, [ITEM_CRYSTAL_COIN] = {changeBack = ITEM_PLATINUM_COIN, changeTo = ITEM_GOLDEN_BAR}, [ITEM_GOLDEN_BAR] = {changeBack = ITEM_CRYSTAL_COIN} } function onUse(player, item, fromPosition, target, toPosition, isHotkey) local coin = config[item:getId()] if coin.changeTo and item.type == 100 then item:remove() player:addItem(coin.changeTo, 1) elseif coin.changeBack then item:remove(1) player:addItem(coin.changeBack, 100) else return false end return true end  
    • By Biel Oliveira
      .tenho um servidor que estou com sistema de reset sem storage, e estou tentando criar magias de acordo com o reset do player, consegui criar a magia mas quando o player com "1" resets solta a magia não sai nada
       
      alguem poderia me ajudar por favor ?
       
      Esta é a magia me ajudem plizzz
         
       
       
    • By victor4312
      TFS EXCLUSIVE EDTION 0.5
      tentei varios scripts do forum e nenhum funciona, o problema é que também não aparece erros na distro,
      se alguem puder me ajudar a fazer esse script funcionar agradeço
       
       
       
    • By Pvp Easy
      .Qual servidor ou website você utiliza como base? 
      Baiak Wake
      Qual o motivo deste tópico? 
       
      Está surgindo algum erro? Se sim coloque-o aqui. 
      Estou com problema no meu systema de vip, ele está todo perfeito em relação adicionar [VIP] name, e Tirar [VIP] quando acabar a vip, só estou com problema em uma scripts que peguei de checkvip, ela server como uma proteção de criações de chares exemplo se meu nick é [VIP] roberto, se eu criar Roberto, a scripts vai perdir para Mudar de Nome através de !unlock Name
      Só se eu criar o char Roberto e não logar, o char dar erro na distro, e depois que der SS ou servidor reiniciar, consigo entrar no char e andar normalmente. no caso eu queria que esta scripts desse uma opção de mudança de 1 minuto, se caso ele não mudasse de nome e passe 1minuto se tivesse off ou não, o char seria deletado

      @Storm
      Data/Creaturescripts/Checkname.lua
       
      local tempo = 30 -- em segundos para kickar o player
      function onLogin(cid)
      if isVipName(cid) then
      doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Your name is invalid. Use !unlock NewCharName to unlock your char name. You will be kicked in ".. tempo .." seconds.") 
      doCreatureSetNoMove(cid, true)
      addEvent(doRemoveCreature, tempo*1000, cid, true)
      end
      return true
      end

      function isVipName(cid)
      local list = {}
      local query = db.getResult("SELECT `name` FROM `players` WHERE `group_id` < 2 ")
      if (query:getID() == -1) then
          return true 
      end
      repeat
      local name = query:getDataString("name")
      table.insert(list, name)
      until not query:next()
      for _, names in pairs(list) do
         if names:find("[VIP]") then
              names = names:gsub("%[VIP] ", "")
              if getPlayerName(cid) == names then
                  return true
              end
          end
      end
      query:free()
      return false
      end
       
      Você tem alguma imagem que possa auxiliar no problema? Se sim, coloque-a aqui. 
       
    • By DarkRed
      .Qual servidor ou website você utiliza como base? 
      Poke Skyfall
       
      Qual o motivo deste tópico? 
      scripting que teleporta o player ao clica no items
       
      Está surgindo algum erro? Se sim coloque-o aqui. 
      [09/07/2020 11:37:31] [Error - LuaScriptInterface::loadFile] data/actions/scripts/Corda.lua:3: '(' expected near 'onUse'
      [09/07/2020 11:37:31] [Warning - Event::loadScript] Cannot load script (data/actions/scripts/Corda.lua)
      [09/07/2020 11:37:31] data/actions/scripts/Corda.lua:3: '(' expected near 'onUse'
       
       
      Você tem o código disponível? Se tiver publique-o aqui: 
      local newpos= {x = 1153, y = 954, z = 7}, -- posicao que o player deve ir ao clica na corda --
      function onUse(cid, newPosition,  toPosition)
      getPlayerStorage(cid,12345) =1 then
      doPlayerTeleportThing(cid, newpos),
      doplayerItemsTeleportitems(cid,12716) then -- 12716 id do items --
      end 
      end
       
      Você tem alguma imagem que possa auxiliar no problema? Se sim, coloque-a aqui. 

  • Recently Browsing   0 members

    No registered users viewing this page.


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