Ir para conteúdo

Pasta Data - Spells


tibiaa4e

Posts Recomendados

Pasta Enciclopedia com todos os links de outros tutoriais !

http://www.xtibia.com/forum/Pasta-Data-Enc...r-E-t99746.html

 

Parte IV– Spells

 

Olá depois de um tempinho (5 meses) sem tutoriais , que por varios fatores não consegui terminar no meu primeiro prazo...

Essa aqui eu acredito ser um dos mais essenciais, pois algumas pessoas não compreendem bem isso, e sempre era uma dúvida constante no msn

que eu não consegui sanar , por falta de material...

 

 

Começaremos pelo spells.xml

 

	<spells>
<!-- Attack Runes -->
<rune name="Poison Field" id="2285" allowfaruse="1" charges="3" lvl="14" maglv="0" exhaustion="2000" blocktype="solid" script="attack/poison field.lua"/>

<!-- Attack Spells -->
<instant name="Death Strike" words="exori mort" lvl="16" mana="20" prem="1" range="3" casterTargetOrDirection="1" blockwalls="1" exhaustion="2000" needlearn="0" script="attack/death strike.lua">
	<vocation name="Sorcerer"/>
	<vocation name="Master Sorcerer"/>
	<vocation name="Druid"/>
	<vocation name="Elder Druid"/>
</instant>

<!-- Summon Spells -->
<instant name="Summon Creature" words="utevo res" lvl="25" params="1" exhaustion="2000" needlearn="0" function="summonMonster">
	<vocation name="Sorcerer"/>
	<vocation name="Druid"/>
	<vocation name="Master Sorcerer"/>
	<vocation name="Elder Druid"/>
</instant>

<!--Conjure Runes -->

<conjure name="Conjure Arrow" words="exevo con" lvl="13" mana="100" soul="1" conjureId="2544" conjureCount="10" exhaustion="1000" needlearn="0" function="conjureItem">
	<vocation name="Paladin"/>
	<vocation name="Royal Paladin"/>
</conjure>

<conjure name="Enchant Spear" words="exeta con" lvl="45" mana="350" soul="3" prem="1" conjureId="7367" reagentId="2389" exhaustion="1000" needlearn="0" function="conjureItem">
	<vocation name="Paladin"/>
	<vocation name="Royal Paladin"/>
</conjure>

<conjure name="Energybomb" words="adevo mas vis" lvl="37" mana="880" soul="5" prem="1" reagentId="2260" conjureId="2262" conjureCount="2" exhaustion="1000" needlearn="0" function="conjureRune">
	<vocation name="Sorcerer"/>
	<vocation name="Master Sorcerer"/>
</conjure>

</spells>

 

Ai está a base de cada spell para esse arquivo.

 

As runas são divididas em duas partes, o script da runa e de transformação da pedra em runa. Começaremos pela runa :

 

 
	<rune name="Poison Field" id="2285" allowfaruse="1" charges="3" lvl="14" maglv="0" exhaustion="2000" blocktype="solid" script="attack/poison field.lua"/>

 

Essa linha acima indica o que a runa fará ao ser usada em algo, sendo os parametros :

 

name: Isso indica o nome da runa. Esse nome é o que aparece na runa ao se dar use nela.

id: Isso indica o id da runa.

allowfaruse : Se a runa pode ser usada em objetos a distancia.

charges: A quantidade de cargas iniciais dela

lvl: Nivel minimo para ela ser usada.

maglv: Nivel magico minimo para usar ela

exhaustion: Tempo de exaustão para poder usar a proxima runa.

blocktype: Tipo do item que será jogado.

script: Arquivo que terá o script.

 

A criação da pedra é mais simples :

 

	<conjure name="Energybomb" words="adevo mas vis" lvl="37" mana="880" soul="5" prem="1" reagentId="2260" conjureId="2262" conjureCount="2" exhaustion="1000" needlearn="0" function="conjureRune">
	<vocation name="Sorcerer"/>
	<vocation name="Master Sorcerer"/>
</conjure>

 

name: O nome dela, para ser sincero não se prescisa ser o mesmo do arquivo acima.

words: A palavra (macumba) que você diz para fazer a transformação.

lvl: Nivel para poder cria-la.

mana: mana usada para conjura-la.

c

reagentId: Id da runa base, no caso 2260 é a blank rune.

conjureId: Id da runa "magica".

conjureCOunt: Quantidade de cargas da runa.

exausthion: O tempo de exaustão que ela dará em milessegundos (1000 = 1 segundo) (nem sei se tem isso hj em dia ainda).

needlearn: Se o player prescisará aprender ela, no caso comprar de um npc.

function: No caso deixe assim, essa função que transforma agua em vinho :).

 

Lembrando que pode se usar esse tipo para transformar outros itens, como enchatted staff e depois para fazer volta-lo ao normal é só fazer ele decair. Para faze-lo mude a function para conjureItem

 

 

Bem a parte de script LUA , explicarei mais abaixo, vamos continuar com as tags, porque o script LUA é mais facil

 

Magias Espontaneas

 

<instant name="Death Strike" words="exori mort" lvl="16" mana="20" prem="1" range="3" casterTargetOrDirection="1" blockwalls="1" exhaustion="2000" needlearn="0" script="attack/death strike.lua">
	<vocation name="Sorcerer"/>
	<vocation name="Master Sorcerer"/>
	<vocation name="Druid"/>
	<vocation name="Elder Druid"/>
</instant>

 

name: Nome dela.

words: A palavra (macumba) que você diz para fazer o trabalho.

lvl: Nivel para poder solta-la.

mana: mana usada para solta-la.

prem: Se o conjurador prescisará ser premmium ou não.

range: Quantos sqm ela poderia ir de distancia.

Se ativado elá irá acertar o alvo que está em ataque.

blockwalls: Se ativado ela não passará por obstaculos.

exhaustion: tempo de exaustão em milessgundos.

selftarget: Se irá atingir ele mesmo, no caso magias de cura.

needtarget: Se ativado, prescisará o player está atacando alguem.

direction: Se ativado, a magia sempre sairá pela frente do player.

casterTargetOrDirection: Se ativado, a magia irá em quem o player está atacando senão elas sairá pela frente do player

agressive: Se elá tirará danos ou não.

needlearn: Se ele prescisará aprender ou não.

event: O evento delá, vocês só usarão script (ao não ser que sejam muito criativos).

script: Local do arquivo de configuração.

vocation name : Nome da vocação que poderá usar a magia (coloque suas promoções tbm)

 

 

Ai explicamos como fazer a tag dessas magias, existem outras funções que para ser sincero são inuteis, ou necessarias apenas para 1 magia

 

Scripts LUA

 

Se você é uma pessoa normal, sem problemas mentais ou hiperatividade concerteza o que tiver aqui vai suprir suas necessidades, mas se você for igual eu, vai querer aprender mais. Eu costumo dizer que spells você tem ter um calculadora e paciencia para achar aquela forma e efeito. O resto é só copiar uma ja existente.

 

 

O pessoal do TFS, adora fazer uns atalhos, variaveis e coisas para facilitarem a vida deles (e complicar a nossa). Se você olhar o arquivo lib da pasta spells/lib verá que tem varias formas lá... Para ser mais exato todas

que eles usam nas spells do ot. Portanto memorize todas :) (ou como uma pessoa normal, verifique quando for fazer elas).

 

Depois de muito bla bla bla, vamos ao que interessa.

Vamos começar com nossa maravilhosa death strike

 

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SUDDENDEATH)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -0.5, 0, -0.6, 0)

local distanceCombat = createCombatObject()
setCombatParam(distanceCombat, COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE)
setCombatParam(distanceCombat, COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA)
setCombatParam(distanceCombat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SUDDENDEATH)
setCombatFormula(distanceCombat, COMBAT_FORMULA_LEVELMAGIC, -0.5, 0, -0.6, 0)

function onCastSpell(cid, var)
if(variantToNumber(var) ~= 0) then
	return doCombat(cid, distanceCombat, var)
end
return doCombat(cid, combat, var)
end

 

Eu sinceramente não entendo 100% das funções vou explicar as necessarias. Nesse momento abra seu global.lua

e se não tiver vá em lib/constants.lua e sempre verifique quando tiver a palavra arquivo abaixo :

 

setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE) : O tipo dela, se é dano fisico, fogo ou sei lá o que.

São eles :

COMBAT_NONE = 0
COMBAT_PHYSICALDAMAGE = 1
COMBAT_ENERGYDAMAGE = 2
COMBAT_EARTHDAMAGE = 4
COMBAT_POISONDAMAGE = 4
COMBAT_FIREDAMAGE = 8
COMBAT_UNDEFINEDDAMAGE = 16
COMBAT_LIFEDRAIN = 32
COMBAT_MANADRAIN = 64
COMBAT_HEALING = 128
COMBAT_DROWNDAMAGE = 256
COMBAT_ICEDAMAGE = 512
COMBAT_HOLYDAMAGE = 1024
COMBAT_DEATHDAMAGE = 2048

 

setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA) : O tipo de efeito que sairão delá, pelo amor de deus olhem no arquivo porque tem 68. (Procurem CONST_ME_MORTAREA)

 

setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SUDDENDEATH) : Esse é o efeito que faz ao ser disparada, ela. Ou seja, o efeito do trajeto dela. Proure no arquivo tem 37.

 

setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -0.5, 0, -0.6, 0) : Esse é a grande sacada. Calculo certo !? + -

 

A sintaxe disto é :

COMBAT_FORMULA_LEVELMAGIC, -minA,Min , MaxB, mAx

Sendo :

 

MinA : Minimo calculado, ou seja valor minimo que sera calculado.

Min : Minimo que a magia tirará ou dará.

MaxB : Maximo de dano ao ser calculado.

Max : Dano maximo fixo que dará a magia.

 

O calculo é assim:

(lvl * 2 + ml *3) * MinA ou MaxB´

 

Ai da um valor magico que será seu dano, oscilando entre o Min e o Max.

Porém desde o tibia 7.8 o tibia mudou sua formula, e eu fazendo uns calculos criei uma nova com a função do Pedro B.

 

function getCombatFormulas(cid, lv, maglv)
local formula_min = -((lv*0.25 + maglv*3) * 0.52)
local formula_max = -((lv*0.25 + maglv*3) * 0.68)

if(formula_max < formula_min) then
	local tmp = formula_max
	formula_max = formula_min
	formula_min = tmp
end
return formula_min, formula_max
end

 

Agora você pensa que filho de uma mãe é o Ta4e, ferrou meu cerebro...

Use a que bem entender...

Em tese a death strike ta feita.

 

Se você é observador percebeu que ela tem 2 funções porém são iguais. Isso porque para o servidor ela sendo jogada no inimigo ou ela sendo falada em frente são diferentes... (Sim da para fazer ela tirar + dano de perto).

 

Bem para quem gostou do meu metodo, a diferença fica apenas no calculo de dano.

 

--Calculed by ta4e--
--For tibia 8.31--
--Made in 07/11/08--

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA)


function getCombatFormulas(cid, lv, maglv)
local formula_min = -((lv*0.25 + maglv*3) * 0.52)
local formula_max = -((lv*0.25 + maglv*3) * 0.68)

if(formula_max < formula_min) then
	local tmp = formula_max
	formula_max = formula_min
	formula_min = tmp
end
return formula_min, formula_max
end

setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, "getCombatFormulas")

local distanceCombat = createCombatObject()
setCombatParam(distanceCombat, COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE)
setCombatParam(distanceCombat, COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA)
setCombatParam(distanceCombat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_DEATH)


function getCombatFormulas(cid, lv, maglv)
local formula_min = -((lv*0.25 + maglv*3) * 0.52)
local formula_max = -((lv*0.25 + maglv*3) * 0.68)

if(formula_max < formula_min) then
	local tmp = formula_max
	formula_max = formula_min
	formula_min = tmp
end
return formula_min, formula_max
end

setCombatCallback(distanceCombat, CALLBACK_PARAM_LEVELMAGICVALUE, "getCombatFormulas")

function onCastSpell(cid, var)
if(variantToNumber(var) ~= 0) then
	return doCombat(cid, distanceCombat, var)
end
return doCombat(cid, combat, var)
end

 

Em formula_min seria o MinA e o formula Max o maxB

O resto é igual...

 

setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, "getCombatFormulas")

Ao invés de indicarmos os valores, falamos que o resultado estará na função getCombatFormulas.

 

Dicas :

- Nos valores sempre use o -, senão ela healará o inimigo

- Depois de fazer a magia, teste exaustivamente ela, para ver se o dano fico certo.

- Sempre teste ela com um char com lvl minimo e um com lvl alto. Pois as vezes ela fica desproporcional.

 

 

Bem essa é a magia em tese + simples, vou mostrar uma magia de healing

 

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HEALING)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)
setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, FALSE)
setCombatParam(combat, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE)

function getCombatFormulas(cid, lv, maglv)
local formula_min = ((lv*0.25 + maglv*3) * 0.7)
local formula_max = ((lv*0.25 + maglv*3) * 0.92)

if(formula_max < formula_min) then
	local tmp = formula_max
	formula_max = formula_min
	formula_min = tmp
end
return formula_min, formula_max
end

setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, "getCombatFormulas")

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



end

 

Perceba que na formula ela não tem o sinal de - antes do calculo, pois ela heala e não ferra o player.

Dois novos parametros apareceram

 

setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, FALSE) : Sendo false, a magia não é de ataque portanto pode ser usada em protection zones (e não tirará dano).

setCombatParam(combat, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) Nesse caso ela cura a condição paralyze, se você olhar no arquivo verá as condition que as magias poderão retirar (até umas versoes atrás, não era possivel remover + de 1 condição por magia.

 

Agora uma spell que cria algo, que tal poison field ?

 

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_EARTHDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_GREEN_RINGS)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_POISON)
setCombatParam(combat, COMBAT_PARAM_CREATEITEM, 1496)

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

 

Simples não ?

setCombatParam(combat, COMBAT_PARAM_CREATEITEM, 1496) Id do item a ser criado no local de saida.

 

Até agora só vimos magia que atigem 1 local certo, vamos evoluir e ver a com areas.

 

 

Magias com aréas

A mesma poison field pode ser mudada para poison bomb facilmente :

 

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_EARTHDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_GREEN_RINGS)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_POISON)
setCombatParam(combat, COMBAT_PARAM_CREATEITEM, 1496)

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

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

 

Apenas adicionado a linha do createcombatArea ja faz ela criar em varios locais.

Lembra do lib ? Abra ele e veja o fomrato do AREA_SQUARE1X1,

 

AREA_SQUARE1X1 = {
{1, 1, 1},
{1, 3, 1},
{1, 1, 1}
}

 

0 - Nada

1 - Area que criará

3 - Local "base"

 

Lembra da magia de healing ? vejamos uma mass healing

 

--Calculed by ta4e--
--For tibia 8.22--
--Made in 12/09/08--
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HEALING)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)
setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, FALSE)
setCombatParam(combat, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE)

function getCombatFormulas(cid, lv, maglv)
local formula_min = ((lv*0.25 + maglv*3) * 3.7)
local formula_max = ((lv*0.25 + maglv*3) * 4.1)

if(formula_max < formula_min) then
	local tmp = formula_max
	formula_max = formula_min
	formula_min = tmp
end
return formula_min, formula_max
end


setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, "getCombatFormulas")

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

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

 

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

 

Mesma coisa... Só se adiciona isso.

 

Que tal uma magia do tipo beam

 

--Calculed by ta4e--
--For tibia 8.31--
--Made in 07/11/08--
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA)

function getCombatFormulas(cid, lv, maglv)
local formula_min = -((lv*0.25 + maglv*3) * 0.5)
local formula_max = -((lv*0.25 + maglv*3) * 0.8)

if(formula_max < formula_min) then
	local tmp = formula_max
	formula_max = formula_min
	formula_min = tmp
end
return formula_min, formula_max
end

local area = createCombatArea(AREA_BEAM5, AREADIAGONAL_BEAM5)
setCombatArea(combat, area)

setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, "getCombatFormulas")

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

 

Se você comparar ela com uma ULTIMATE EXPLOSION VERÁ que só muda o efeitos.

Mais aonde faz ela em frente ao player e a outra não ?

No spells.xml, veja por que aprendemos ele primeiro...

 

Em tese vocês com um pouco de pratica já serão grande spells makers.

 

Para quem tem mais dificuldade (Quem acha que eu sou bom..., se você soubessem o que eu demoro para aprender)

 

As magias de runas, são iguais a essas na criação, o que muda é no spells.xml, 80% dos erros de spells acontecem lá.

 

 

Magia com danos fisicos

Eu dou a cara limpa, para dizer que não abro um otserver a 4 meses, devido ao meu pc reiniciar devido ao uso de muita memoria ¬¬. Então até a ultima vez a função padrão do TFS estava falha em relação aos danos.

Ai novamente o Pedro B. fez uma...

 

--Calculed by ta4e--
--For tibia 8.31--
--Made in 07/11/08--

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_HITAREA)
local area = createCombatArea(AREA_SQUARE1X1)
setCombatArea(combat, area)

function getSpellDamage(cid, weaponSkill, weaponAttack)
damage_min = (weaponSkill * weaponAttack / 30) * 2.5
damage_max = (weaponSkill * weaponAttack / 30) * 3.7

if(damage_max < damage_min) then
	local tmp = damage_max
  damage_max = damage_min
  damage_min = tmp
end
return -damage_min, -damage_max
end

setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "getSpellDamage")

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

 

Em tese ela é a mesma coisa que a do ot.

Se preferirem testem ela, e vejam...

 

Essa parte da formula é igual a outra, ela calcular o skill e o ataque da arma. Igual no tibia global.

Portanto se o individuo ta sem arma, ela nem funciona...

 

A base dela é a mesma só muda a função :

 

setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "getSpellDamage")

 

 

Bem eu acho que fico por aqui, esse tutorial não é grande coisa, mas espero que ajude muita gente com duvidas simples, e se quiser evoluir, estude as spells que vocês conhecerão mais (As de party são legais, apesar de terem coisas para mim desnecessarias.

 

Deem sugestões, dúvidas, criticas e o que desejaram. Falem mal, mas falem de mim!!!

Link para o comentário
Compartilhar em outros sites

  • 2 months later...
  • 4 months later...
Eaw mano adorei esse tutorial para eu que estou :construction: me ajuda e muito obrigada mesmo :button_ok:
:thumbsupsmiley2:


:XTibia_smile:
se quiserem me dar alguns conselhos me add ai no msn Plx
ou no Skype Vlw!!!! Tutorial Muito Xtibia!
MSN:
:button_ok:
SKYPE :||•●Os Big's Sexý●•||Chuck Norris 36Cm◘ bico largo



:heart: " target="_blank">I Love Tibia OtServ!!!!!!!! :heart:
Link para o comentário
Compartilhar em outros sites

  • 1 year later...
  • 2 weeks later...

@Up

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HEALING)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)
setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, FALSE)
setCombatParam(combat, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE)

function getCombatFormulas(cid, lv, maglv)
       local formula_min = lv
       local formula_max = lv

       if(formula_max < formula_min) then
               local tmp = formula_max
               formula_max = formula_min
               formula_min = tmp
       end
       return formula_min, formula_max
end

setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, "getCombatFormulas")

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

end

 

isso ai

 

Link para o comentário
Compartilhar em outros sites

  • 1 month later...

nossa, Parabens kra realmente esse negocio de quanto que vai hitar eu nao sabia como configurar, eu sempre testava almentando e diminuindo ate chegar no valor esperado mais sempre era as cegas

 

 

arrumando uns erros D;
Editado por sens
Link para o comentário
Compartilhar em outros sites

  • 10 months later...
×
×
  • Criar Novo...