Olá XTibianos..
Bom, este é meu primeiro tópico então, não achem que vai ser aquela coisa toda.
Vamos ao tutorial.
Este é um exemplo de uma spell que eu fiz, com 5 ataques.. É a mesma coisa, porém, com mais ataques, que vai ajudar a entender como por mais ataques. (Para quem entender né '-')
local scom1 = createCombatObject() local scom2 = createCombatObject() local scom3 = createCombatObject() local scom4 = createCombatObject() local scom5 = createCombatObject() local combat1 = createCombatObject() setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) setCombatParam(combat1, COMBAT_PARAM_EFFECT, 33) setCombatFormula(combat1, COMBAT_FORMULA_LEVELMAGIC, -500, -0, -700, 0) local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) setCombatParam(combat2, COMBAT_PARAM_EFFECT, 1) setCombatFormula(combat2, COMBAT_FORMULA_LEVELMAGIC, -000, -0, -000, 0) local combat3 = createCombatObject() setCombatParam(combat3, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) setCombatParam(combat3, COMBAT_PARAM_EFFECT, 1) setCombatFormula(combat3, COMBAT_FORMULA_LEVELMAGIC, -000, -0, -000, 0) local combat4 = createCombatObject() setCombatParam(combat4, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) setCombatParam(combat4, COMBAT_PARAM_EFFECT, 1) setCombatFormula(combat4, COMBAT_FORMULA_LEVELMAGIC, -000, -0, -000, 0) local combat5 = createCombatObject() setCombatParam(combat5, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) setCombatParam(combat5, COMBAT_PARAM_EFFECT, 52) setCombatFormula(combat5, COMBAT_FORMULA_LEVELMAGIC, -1100, -0, -1300, 0) arr1 = { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, } arr2 = { {0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0}, {0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0}, {0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 1, 0, 1, 3, 1, 0, 1, 0, 1, 0, 0}, {0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0}, {0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0}, {0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0}, } arr3 = { {0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0}, {0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0}, {0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0}, {0, 0, 0, 1, 0, 1, 1, 3, 1, 1, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0}, {0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0}, {0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0}, } arr4 = { {0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0}, {0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0}, {0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 1, 0, 1, 3, 1, 0, 1, 0, 1, 0, 0}, {0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0}, {0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0}, {0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0}, } arr5 = { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 1, 1, 1, 1, 3, 1, 1, 1, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, } local area1 = createCombatArea(arr1) local area2 = createCombatArea(arr2) local area3 = createCombatArea(arr3) local area4 = createCombatArea(arr4) local area5 = createCombatArea(arr5) setCombatArea(scom1, area1) setCombatArea(scom2, area2) setCombatArea(scom3, area3) setCombatArea(scom4, area4) setCombatArea(scom5, area5) function onTargetTile(cid, pos) local p = getThingPos(cid) local basep = {x = p.x + 5, y = p.y - 5, z = p.z} doSendDistanceShoot(basep, pos, 30) doCombat(cid,combat1,positionToVariant(pos)) end function onTargetTile2(cid, pos) local p1 = getThingPos(cid) local basep1 = {x = p1.x - 5, y = p1.y + 5, z = p1.z} doSendDistanceShoot(basep1, pos, 35) doCombat(cid,combat2,positionToVariant(pos)) end function onTargetTile3(cid, pos) local p2 = getThingPos(cid) local basep2 = {x = p2.x - 5, y = p2.y + 5, z = p2.z} local baseep2 = {x = p2.x + 5, y = p2.y - 5, z = p2.z} doSendDistanceShoot(basep2, pos, 35) doSendDistanceShoot(baseep2, pos, 35) doCombat(cid,combat3,positionToVariant(pos)) end function onTargetTile4(cid, pos) local p3 = getThingPos(cid) local basep3 = {x = p3.x - 5, y = p3.y - 5, z = p3.z} local baseep3 = {x = p3.x + 5, y = p3.y + 5, z = p3.z} doSendDistanceShoot(basep3, pos, 30) doSendDistanceShoot(baseep3, pos, 30) doCombat(cid,combat4,positionToVariant(pos)) end function onTargetTile5(cid, pos) local p3 = getThingPos(cid) local basep3 = {x = p3.x - 5, y = p3.y - 5, z = p3.z} local baseep3 = {x = p3.x + 5, y = p3.y + 5, z = p3.z} doSendDistanceShoot(basep3, pos, 30) doSendDistanceShoot(baseep3, pos, 30) doCombat(cid,combat5,positionToVariant(pos)) end setCombatCallback(scom1, CALLBACK_PARAM_TARGETTILE, "onTargetTile") setCombatCallback(scom2, CALLBACK_PARAM_TARGETTILE, "onTargetTile2") setCombatCallback(scom3, CALLBACK_PARAM_TARGETTILE, "onTargetTile3") setCombatCallback(scom4, CALLBACK_PARAM_TARGETTILE, "onTargetTile4") setCombatCallback(scom5, CALLBACK_PARAM_TARGETTILE, "onTargetTile5") local function onCastSpell1(parameters) doCombat(parameters.cid, scom1, parameters.var) end local function onCastSpell2(parameters) doCombat(parameters.cid, scom2, parameters.var) end local function onCastSpell3(parameters) doCombat(parameters.cid, scom3, parameters.var) end local function onCastSpell4(parameters) doCombat(parameters.cid, scom4, parameters.var) end local function onCastSpell5(parameters) doCombat(parameters.cid, scom5, parameters.var) end function onCastSpell(cid, var) local parameters = { cid = cid, var = var} addEvent(onCastSpell1, 100, parameters) addEvent(onCastSpell2, 900, parameters) addEvent(onCastSpell3, 1700, parameters) addEvent(onCastSpell4, 2600, parameters) addEvent(onCastSpell5, 3500, parameters) return TRUE end
Vamos a como fazer.
1° Exemplo :
local scom1 = createCombatObject() local scom2 = createCombatObject()
Neste simples caso você edita a magia pela quantidade de hits que você quer que a magia dê, neste exemplo usei apenas 2, mas você pode editar e adicionar 3, 4, 5, 6, etc...
local combat1 = createCombatObject() setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) setCombatParam(combat1, COMBAT_PARAM_EFFECT, 33) setCombatFormula(combat1, COMBAT_FORMULA_LEVELMAGIC, -500, -0, -700, 0) local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) setCombatParam(combat2, COMBAT_PARAM_EFFECT, 1) setCombatFormula(combat2, COMBAT_FORMULA_LEVELMAGIC, -500, -0, -700, 0)
Bom, aqui eu botei apenas 2 local combat porque a magia inicial só tinha 2. Caso for por mais só copiar e colar mudando os números.
Na segunda linha... Onde está escrito
COMBAT_ENERGYDAMAGE
, Você deve mudar o Damage atual para o que você desejar... Dos quais temos disponíveis os seguintes tipos de Damage:
COMBAT_FIREDAMAGE; COMBAT_ENERGYDAMAGE; COMBAT_EARTHDAMAGE; COMBAT_ICEDAMAGE; COMBAT_HOLYDAMAGE; COMBAT_DEATHDAMAGE; COMBAT_DROWNDAMAGE; COMBAT_PHYSICALDAMAGE
~Elements citados por 20cm
Na terceira linha:
COMBAT_PARAM_EFFECT, 1
Você pode editar o effect, para saber os effects disponíveis, entre com o God e fale /z 1, 2, 3... São os types disponíveis para uso aqui.. Assim você decide o efeito que quer na sua Spell.
Na quarta linha:
LEVELMAGIC, 500, -0, 700, 0
Você define a força da Spell, edite e ponha como desejar..
Assim suas magias sempre estarão de acordo com o ot, e não ficaram muito fortes ou muito fracas.
arr1 = { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, } arr2 = { {0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0}, {0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0}, {0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 1, 0, 1, 3, 1, 0, 1, 0, 1, 0, 0}, {0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0}, {0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0}, {0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0}, }
Esta é a parte mais simples, e particularmente a que eu mais gosto.. É a area da sua spell... Todos esses números que você vê são os sqm.. A area pode ter o tamanho que você desejar... O número 0 significa uma area que não vai ser acertada.. Já o número 1 significa area aonde seu ataque vai acertar.. O número 2 significa aonde o player está e 3 é um misto de 1+2, pois é aonde o player está e aonde acerta a spell (Não, você não toma dano e_e)
local area1 = createCombatArea(arr1) local area2 = createCombatArea(arr2) setCombatArea(scom1, area1) setCombatArea(scom2, area2) function onTargetTile(cid, pos) local p = getThingPos(cid) local basep = {x = p.x + 5, y = p.y - 5, z = p.z} doSendDistanceShoot(basep, pos, 30) doCombat(cid,combat1,positionToVariant(pos)) end function onTargetTile2(cid, pos) local p1 = getThingPos(cid) local basep1 = {x = p1.x - 5, y = p1.y + 5, z = p1.z} doSendDistanceShoot(basep1, pos, 35) doCombat(cid,combat2,positionToVariant(pos)) end
Esta parte serve para a localização das areas usadas.. Lembre-se de que "local area1 = createCombatArea(arr1)" Significa que está localizando a area 1, e assim por diante. E logo embaixo, para localizar aonde você escolheu os effects temos a outra parte "setCombatArea(scom1, area1)"
scom1, area1 significa que está procurando as linhas de inicio:
scom = setCombatParam
area1 = arr1
setCombatCallback(scom1, CALLBACK_PARAM_TARGETTILE, "onTargetTile") setCombatCallback(scom2, CALLBACK_PARAM_TARGETTILE, "onTargetTile2") local function onCastSpell1(parameters) doCombat(parameters.cid, scom1, parameters.var) end local function onCastSpell2(parameters) doCombat(parameters.cid, scom2, parameters.var) end
Assim como explicado acima, está parte também deve ser feita com o scom1 e scom2, pois ele encontra os parâmetros da spell.
function onCastSpell(cid, var) local parameters = { cid = cid, var = var} addEvent(onCastSpell1, 100, parameters) addEvent(onCastSpell2, 900, parameters) return TRUE end
Esta vendo o 100 pro 900? Esta parte muda o intervalo entre um ataque e outro... Recomendo não deixar passar muito de 1000 de diferença.. Não irá bugar, porém, pode ficar estranho pra spell.
Pois como dito pelo 20cm,
No event "(onCastSpell1, 100, parameters)", o número 100 indica 0.1 segundos sendo assim, 500 é 0.5 segundos e assim vai de acordo com o que você resolver por ali.
Foi simples não foi? Sua spell foi criada com sucesso! Agora é só adicionar um nome para salvar o arquivo.. "seuarquivo.lua", e salvar dentro da pasta spells/scripts.
Então após salvar abra o spells.xml e salve assim:
<instant name="seuataque" words="seuataque" lvl="100" mana="150" prem="0" exhaustion="2000" selftarget="1" needlearn="0" event="script" value="attack.lua">
Lembrando também que: ' instant name="seuataque" ' é o que nome que apareceria em um spellbook, assim como "Exura sio" apareceria como "Heal Friend".. E logo após isso.. ' words="seuataque" ' é a palavra que deve ser usada para usar a spell in-game. Caso queira que a magia seja apenas para premium accounts, coloque o numero 1 em prem="0"
E caso for fazer uma magia que vá direto no inimigo, e não em volta de si, coloque 0 em selftarget="1" Assim você usará a spell e ela irá direto para o alvo. E também temos o ' needlearn="0" ' caso você quer que a magia possa ser usada apenas quando comprada de um npc, ou obtida em quest.. Coloque 1.. assim: ' needlearn="1" '
Ajudei? REP+