Ir para conteúdo

Advanced Spell System


Oneshot

Posts Recomendados

scriptingd.png

 

Bem-vindos, Ékstibianos.

Este é um dos tutoriais que explicam os Advanced Systems que eu criei



para um projeto de servidor alternativo que não se efetivou.

Além de mostrar-lhes o sistema, explicarei cada função usada e como

configurar cada magia no seu servidor.

 

1 - Requisitos

 

Ékstibiano, você irá precisar de:

- Uma dose de conhecimento em LUA.

- Uma dose de funções.

- E... senso de localização... os scripts das magias irão ficar grandes.

 

2 - O corpo do script

 

 

local combat_lv1 = createCombatObject()
setCombatParam(combat_lv1, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE)
setCombatParam(combat_lv1, COMBAT_PARAM_EFFECT, CONST_ME_ICEATTACK)

local combat_lv2 = createCombatObject()
setCombatParam(combat_lv2, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE)
setCombatParam(combat_lv2, COMBAT_PARAM_EFFECT, CONST_ME_ICEATTACK)

local combat_lv3 = createCombatObject()
setCombatParam(combat_lv3, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE)
setCombatParam(combat_lv3, COMBAT_PARAM_EFFECT, CONST_ME_ICEATTACK)

local area_lv1 = createCombatArea({
{3}
})

local area_lv2 = createCombatArea({
{1},
{3}
})

local area_lv3 = createCombatArea({
{0, 1, 0},
{1, 3, 1}
})

setCombatArea(combat_lv1, area_lv1)
setCombatArea(combat_lv2, area_lv2)
setCombatArea(combat_lv3, area_lv3)

function onGetFormulaValues_lv1(cid, level, maglevel)
local magDamage, levelDamage = maglevel, level / 5
	return -(magDamage * 1 + levelDamage), -(magDamage * 2 + levelDamage)
end

function onGetFormulaValues_lv2(cid, level, maglevel)
local magDamage, levelDamage = maglevel, level / 5
	return -(magDamage * 1.5 + levelDamage), -(magDamage * 3 + levelDamage)
end

function onGetFormulaValues_lv3(cid, level, maglevel)
local magDamage, levelDamage = maglevel, level / 5
	return -(magDamage * 2.25 + levelDamage), -(magDamage * 4.5 + levelDamage)
end

setCombatCallback(combat_lv1, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues_lv1")
setCombatCallback(combat_lv2, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues_lv2")
setCombatCallback(combat_lv3, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues_lv3")

local function onCastSpell1(parameters)
   doCombat(parameters.cid, combat_lv1, parameters.var)
end

local function onCastSpell2(parameters)
   doCombat(parameters.cid, combat_lv2, parameters.var)
end

local function onCastSpell3(parameters)
   doCombat(parameters.cid, combat_lv3, parameters.var)
end

function onCastSpell(cid, var)
local parameters = { cid = cid, var = var}
local spell_storage = 48502

if getPlayerStorageValue(cid, spell_storage) < 20 then
addEvent(onCastSpell1, 0, parameters)
setPlayerStorageValue(cid, spell_storage, getPlayerStorageValue(cid, spell_storage)+1)
elseif getPlayerStorageValue(cid, spell_storage) == 20 then
addEvent(onCastSpell2, 0, parameters)
setPlayerStorageValue(cid, spell_storage, getPlayerStorageValue(cid, spell_storage)+1)
doPlayerSendTextMessage(cid, 22, "Your Ice Strike advanced to level 2")
elseif getPlayerStorageValue(cid, spell_storage) > 20 and getPlayerStorageValue(cid, spell_storage) < 40 then
addEvent(onCastSpell2, 0, parameters)
setPlayerStorageValue(cid, spell_storage, getPlayerStorageValue(cid, spell_storage)+1)
elseif getPlayerStorageValue(cid, spell_storage) == 40 then
addEvent(onCastSpell3, 0, parameters)
setPlayerStorageValue(cid, spell_storage, getPlayerStorageValue(cid, spell_storage)+1)
doPlayerSendTextMessage(cid, 22, "Your Ice Strike advanced to level 3")
elseif getPlayerStorageValue(cid, spell_storage) > 40 then
addEvent(onCastSpell3, 0, parameters)
setPlayerStorageValue(cid, spell_storage, getPlayerStorageValue(cid, spell_storage)+1)
end
return TRUE
end

 

 

Esse é o script mais básico de Spell System que criei, ele permite que a magia Ice Strike possa avançar do nível 1 (básico) ao nível 3 (ótimo)

 

Irei explicar o script em blocos, exatamente abaixo:

 

3 - Explicações

3.1 - Bloco 1

local combat_lv1 = createCombatObject()
setCombatParam(combat_lv1, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE)
setCombatParam(combat_lv1, COMBAT_PARAM_EFFECT, CONST_ME_ICEATTACK)

local combat_lv2 = createCombatObject()
setCombatParam(combat_lv2, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE)
setCombatParam(combat_lv2, COMBAT_PARAM_EFFECT, CONST_ME_ICEATTACK)

local combat_lv3 = createCombatObject()
setCombatParam(combat_lv3, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE)
setCombatParam(combat_lv3, COMBAT_PARAM_EFFECT, CONST_ME_ICEATTACK)

 

Este é o bloco do script que irá determinar como é o "rosto" da sua magia, veja que eu criei três variáveis
local
nomeadas de
combat_lv1
,
combat_lv2
e
combat_lv3
, o efeito delas é determinado pela função
SetCombatParam
, e as três tem efeitos idênticos com duas diferenças, uma é o dano e a outra é a área.

 

3.2 - Bloco 2, Áreas

local area_lv1 = createCombatArea({
{3}
})

local area_lv2 = createCombatArea({
{1},
{3}
})

local area_lv3 = createCombatArea({
{0, 1, 0},
{1, 3, 1}
})

setCombatArea(combat_lv1, area_lv1)
setCombatArea(combat_lv2, area_lv2)
setCombatArea(combat_lv3, area_lv3)

Veja no Bloco 2, que eu crei três váriaveis
local
nomeadas de
area_lv1
,
area_lv2
e
area_lv3
.

Cada uma dessas variáveis, cria uma área pela função
createCombatArea
, perceba também que as três áreas são diferentes, é o nosso objetivo não, quanto mais nível, mas poder de magia! Ah, e a função
setCombarArea
é responsável por associar cada área ao seu respectivo combat. Vamos ao Bloco 3, de Danos.

 

3.3 Bloco 3, Danos.

function onGetFormulaValues_lv1(cid, level, maglevel)
local magDamage, levelDamage = maglevel, level / 5
	return -(magDamage * 1 + levelDamage), -(magDamage * 2 + levelDamage)
end

function onGetFormulaValues_lv2(cid, level, maglevel)
local magDamage, levelDamage = maglevel, level / 5
	return -(magDamage * 1.5 + levelDamage), -(magDamage * 3 + levelDamage)
end

function onGetFormulaValues_lv3(cid, level, maglevel)
local magDamage, levelDamage = maglevel, level / 5
	return -(magDamage * 2.25 + levelDamage), -(magDamage * 4.5 + levelDamage)
end

setCombatCallback(combat_lv1, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues_lv1")
setCombatCallback(combat_lv2, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues_lv2")
setCombatCallback(combat_lv3, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues_lv3")

 

Essa é uma parte complicadinha (hehe), agora não são mais variavéis locais e sim três funções
onGetFormulaValues
, elas são responsáveis por definir o dano que o jogador irá fazer quando utilizar a magia. A estrutura é a mesma, você pode criar quantos
onGetFormulaValues
quiser para cada nível de magia, mas deve colocar um sufixo _lvX para evitar erros, onde X é o level que cada função é relacionada.

 

A magia Ice Strike causa dano conforme o
level
e o
maglevel
do usuário, as fórmulas de dano tem o prefixo
return
. Veja abaixo:

 

return -(magDamage * 1 + levelDamage), -(magDamage * 2 + levelDamage) --Ice Strike Nv1, dano 40~60

return -(magDamage * 1.5 + levelDamage), -(magDamage * 3 + levelDamage) --Ice Strike Nv2, dano 30~80

return -(magDamage * 2.25 + levelDamage), -(magDamage * 4.5 + levelDamage) --Ice Strike Nv3, dano 45~110

 

Cada fórmula de cada função
onGetFormulaValues
faz danos diferentes. A função
setCombatCallback
, associa cada
onGetFormulaValues
ao seu respectivo
combat
. Ou seja, cada dano ao seu respectivo nível. Agora, vamos, ao último bloco e o mais complicadinho.

 

Bloco 4, Avançando o nível

local function onCastSpell1(parameters)
   doCombat(parameters.cid, combat_lv1, parameters.var)
end

local function onCastSpell2(parameters)
   doCombat(parameters.cid, combat_lv2, parameters.var)
end

local function onCastSpell3(parameters)
   doCombat(parameters.cid, combat_lv3, parameters.var)
end

function onCastSpell(cid, var)
local parameters = { cid = cid, var = var}

local SPELL_LEVEL_STORAGE = 70000
local SPELL_TRIES_STORAGE = 70001
local spell_level = getPlayerStorageValue(cid, SPELL_LEVEL_STORAGE)
local spell_tries = getPlayerStorageValue(cid, SPELL_TRIES_STORAGE)

if spell_level == -1 then
spell_level = 1
end

if spell_level == 1 then
addEvent(onCastSpell1, 0, parameters)
if spell_tries >= 1 then
	setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, spell_tries+1)
else
	setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, 1)
end
elseif spell_level == 2 then
addEvent(onCastSpell2, 0, parameters)
if spell_tries >= 1 then
	setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, spell_tries+1)
else
	setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, 1)
end
elseif spell_level == 3 then
addEvent(onCastSpell3, 0, parameters)
end

if spell_tries >= ((spell_level)*12) then
if spell_level < 3 then
	setPlayerStorageValue(cid, SPELL_LEVEL_STORAGE, spell_level + 1)
	setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, 0)
	doPlayerSendTextMessage(cid, 22, "You advanced from level " .. spell_level .. " to level " .. spell_level + 1 .. " in Ice Strike spell")
	doSendMagicEffect(getCreaturePosition(cid),14)
	doSendAnimatedText(getCreaturePosition(cid), 'Advanced!', 18)
end
end
return TRUE
end

 

Okay, você está saturado de informação se leu até aqui, descanse um pouco, respire e vamos lá:

 

- Observe no Bloco 4, as funções locais
onCastSpell1
,
onCastSpell2
e
onCastSpell3
, elas são responsáveis para que quando o personagem invocar a magia
Ice Strike
, ela seja realmente invocada. E há abaixo da última função local, a
onCastSpell
mais importante, ela que irá nos trazer a sintaxe geral do script de magia.

 

- O código abaixo é responsável por duas coisas, ele irá determinar dois Storages onde serão armazenados os pontos de uso da magia e onde será armazenado o valor do nível da magia.
LEMBRE-SE
que os Storages que você usar aqui não deverão ser usadas em Quests e cada magia deve ter dois Storages distintos.

local SPELL_LEVEL_STORAGE = 70000
local SPELL_TRIES_STORAGE = 70001
local spell_level = getPlayerStorageValue(cid, SPELL_LEVEL_STORAGE)
local spell_tries = getPlayerStorageValue(cid, SPELL_TRIES_STORAGE)

 

- Este outro código abaixo é responsável pela invocação da magia conforme o nível da magia que o personagem detêm.

if spell_level == -1 then
spell_level = 1
end

if spell_level == 1 then
addEvent(onCastSpell1, 0, parameters)
if spell_tries >= 1 then
	setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, spell_tries+1)
else
	setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, 1)
end
elseif spell_level == 2 then
addEvent(onCastSpell2, 0, parameters)
if spell_tries >= 1 then
	setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, spell_tries+1)
else
	setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, 1)
end
elseif spell_level == 3 then
addEvent(onCastSpell3, 0, parameters)
end

 

Veja que o verificador
[if spell_level == -1 then]
é necessário, porque todo Storage começa em -1, então se o Storage que você atribuiu para ser responsável pelo nível da magia em questão estiver em -1, então o script mudará seu valor para 1.

 

O verificador
[if spell_level == 1 then]
faz a função de,
SE
o nível da magia é 1, invocar a
sintaxe do nível 1
e adicionar 1 ponto de uso. O mesmo acontece para os dois outros verificadores
[if spell_level == 2 then]
e
[if spell_level == 3 then]
, com exceção de quê quando a magia estiver no nível 3, você não ganhará mais pontos de uso.

 

E o último código:

 

if spell_tries >= ((spell_level)*12) then
if spell_level < 3 then
	setPlayerStorageValue(cid, SPELL_LEVEL_STORAGE, spell_level + 1)
	setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, 0)
	doPlayerSendTextMessage(cid, 22, "You advanced from level " .. spell_level .. " to level " .. spell_level + 1 .. " in Ice Strike spell")
	doSendMagicEffect(getCreaturePosition(cid),14)
	doSendAnimatedText(getCreaturePosition(cid), 'Advanced!', 18)
end
end
return TRUE
end

 

Querendo ou não esse é o código mais importante do script, ele verifica que quando os pontos de uso forem maiores iguais a 12 vezes o nível atual da magia em questão, e se o nível da magia for menor que 3, eles adicionem +1 no
SPELL_LEVEL_STORAGE
e zerem o contador de pontos de uso da magia. Mandando uma mensagem de "
Sua magia avançou de nível
" com um "
Advanced!
" bonitinho em cor verde.

 

 

 

 

 

Até mais, te vejo no próximo tutorial de Advanced System.

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

@editado, 18-maio-2010

 

Decidi fazer algo mais interativo com vocês,

Vocês podem escolher o tema do próximo tutorial da série Scripting, o que vocês gostariam de ver e aprender sobre a linguagem LUA? Fale comigo ;)

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

  • 2 years later...
×
×
  • Criar Novo...