Ir para conteúdo

[ Spell ] Mini Tutorial De Spells Simples.


Posts Recomendados

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+

Editado por Meunometemvinteletra
Link para o comentário
Compartilhar em outros sites

Interessante, gostei da explicação, pode ajudar muitas pessoas.

 

Obrigado.. Não pensei que fosse bom o suficiente na verdade.. Mas vi que muita gente tinha um pouco de dificuldade com esse tipo de spell..

E acho que este tutorial ajudará a todos criarem suas spells do jeito que desejarem

Link para o comentário
Compartilhar em outros sites

Ficou bom, Vejo que muitos usuários tem dificuldade em criar magias.

 

Melhore os textos com cores e uma fonte mais agradável, um alinhamento ao centro ajuda muito também.

 

Separe o tutorial por partes e deixe em um tamanho confortável os Titulo de cada parte do tutorial..

Editado por eduardobean
Link para o comentário
Compartilhar em outros sites

Confesso que achei um tutorial para pessoas BEM iniciantes no assunto, pois você não se aprofundou muito nas fórmulas das spells ou nas condições possíveis nas spells. Me pareceu que você explicou uma spell sua, não explicou como funciona o sistema de spells.

 

Poderia aprofundar muito usando essas dicas acima, vou aguardar o feedback da galera antes de aprovar.

Link para o comentário
Compartilhar em outros sites

Exatamente, demonb.

Por exemplo, você disse "você muda para o tipo de Damage que você desejar HOLYDAMAGE, etc...", o que eu acho que não é válido considerando que é um tutorial para spells simples, ou seja, se alguém precisa dele é porque está começando e provavelmente não conhece esses tipos de damage.

 

Aliás, nas sources você acha todos eles facilmente:

COMBAT_FIREDAMAGE;

COMBAT_ENERGYDAMAGE;

COMBAT_EARTHDAMAGE;

COMBAT_ICEDAMAGE;

COMBAT_HOLYDAMAGE;

COMBAT_DEATHDAMAGE;

COMBAT_DROWNDAMAGE;

COMBAT_PHYSICALDAMAGE;

 

E também você se prendeu a esse tipo de spell, com área definida na matriz, e tudo mais.

Uma coisa que não gosto também (mas já fiz muito) é usar "addEvent(onCastSpell1, 100, parameters)". Isso faz com que a magia só aconteça depois de 0.1 segundos do jogador falar, o que é desnecessário. Você pode usar onCastSpell1(parameters) direto.

Eu não passaria o tutorial apenas porque há muitos de como fazer uma magia: click aqui rapidao

E ainda dou suporte à ideia de um tutorial definitivo de como criar magias, explicando todos os detalhes.

 

 

Meunometemvinteletras PODERIA ME AJUDAR EM UM PEDIDO QUE EU FIS DE UMA MAGIA ONDE NINGUEM ESTA QUERENDO ME AJUDAR POR FAVOR SE FOR AJUDA O TOPICO ESTA AI

 

http://www.xtibia.co...__fromsearch__1

 

OBRIGADO DESDEJA

VC NAO PERCEBEU QUE ESSA NAO E A AREA CORRETA DI POSTAR ISSU ? POR FAVOR NAUN FASSA ISSU E MUITO FEIO

NINGUEN TEN A OBRIGASAO DE TE AJUDAR ENTAO SE VC QUISER O SCRIPT AO INVES DE CHORAR NOS OUTROS TOPIKOS '' COMESSA A VER TUTORIAIZ

Link para o comentário
Compartilhar em outros sites

Em resposta a vocês 2 tenho apenas que dizer que:

O título do tópico e a segunda linha são Auto-Explicativos, é um pequeno tópico feito apenas para ajudar as pessoas que pretendem criar uma magia simples...

 

Obrigado pelas críticas construtivas.. Logo estarei atualizando o tópico... E postarei também os nomes dos types como você definiu, 20cm. Mas em relação ao "addEvent(onCastSpell1, 100, parameters)"

Eu acho que mesmo não sendo mais simples, é mais facil deste jeito... Não vejo a necessidade de mudar

Link para o comentário
Compartilhar em outros sites

  • 2 weeks later...
  • 8 months later...
  • 1 month later...
  • 2 weeks later...
×
×
  • Criar Novo...