Cooldown Para Spells

  • 1
  • 2

Demonbholder

avatar
Infante
Infante

INFOS

Grupo: InfanteRegistrado: 13/10/08Posts: 1551Char no Tibia: Demonbholder

Faaala galera! Tudo bom? Eu estava olhando uns tutoriais por ai, os quais ensinavam como colocar cooldown, ou tempo de exaustão, entre as magias. O problema é que, em todos estes, utilizava-se 1 storage para cada spell. Você pode vir a me perguntar: "qual o problema disso?". O problema é que, quanto mais storages você utiliza, mais são as chances de ocorrer bugs em seu servidor graças ao mesmo storage sendo usado ao mesmo tempo.

 

Agora que eu já expliquei as vantagens de usar apenas 1 storage, podemos começar a explicar as funções. Antes de mais nada, vamos a elas:

 

Lib

 

 

function getCooldown(cid, spellname)

local storage = tostring(getPlayerStorageValue(cid, 40001))
local spellname = '"' .. spellname .. '"'

return string.find(storage, spellname) and tonumber(string.match(storage, "%d+", string.find(storage, spellname) + #spellname)) - os.time() or 0
end

function setCooldown(cid, spellname, seconds)

local storage = getPlayerStorageValue(cid, 40001) == -1 and "" or tostring(getPlayerStorageValue(cid, 40001))
local spellname = '"' .. spellname .. '"'

if string.find(storage, spellname) then
local gsub = string.gsub(storage, string.match(storage, "%d+", string.find(storage, spellname) + #spellname), tostring(os.time() + seconds))
setPlayerStorageValue(cid, 40001, gsub)
else
setPlayerStorageValue(cid, 40001, storage .. spellname .. " " .. tostring(seconds + os.time()) .. " ")
end

end

function isExhausted(cid, spellname)

return getCooldown(cid, spellname) > 0
end

 

Certo, você pode adicionar isto em data/lib/function.lua, ou, pode criar um arquivo com o formato .lua nesta mesma pasta e nomeá-lo para qualquer coisa.

 

--

 

Agora vamos explicar as funções:

 

*As informações em itálico são apenas por curiosidade:

 

function getCooldown - Bom, esta função vai retornar o tempo, em segundos, do cooldown da mágia. Seus argumentos são o uid do jogador e o nome da mágia. Cuidado, Exura é diferente de exura. Se não houver cooldown para a magia no jogador, retorna 0.

 

Utilizei o storage 40001 para colocar os cooldowns. Você pode perceber que ele adiciona uma string ao storage, ficando, por exemplo, assim: "Exura" 1308376293 "Exori" 1308376393

 

As aspas são para precaver bugs como Exura e Exura gran. O número ao lado é o cooldown somado a função os.time() que é o segundos retornados pela CPU na hora que o cooldown foi adicionado.

 

function setCooldown - Aqui teremos a função que vai adicionar o cooldown ao jogador. Seus argumentos são o uid do jogador, o nome da magia e os segundos de cooldown.

 

A função vai checar se já há o cooldown no storage do jogador. Se já houver, a função simplesmente troca este velho tempo pelo novo. Se não houver, ela simplesmente adicionar no final da string o nome da spell e o tempo mais a função os.time.

 

function isExhausted - Por ultimo, temos a função que retorna se o jogador está, ou não, exausto de usar aquela magia.

 

Retorna TRUE se o cooldown for acima e zero, caso contrário, retorna FALSE.

 

--

 

Simples não? Vamos a um exemplo, usaremos o script do exevo mas san (Divine Caldera):

 

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

 

Para adicionar o cooldown, simplesmente fazemos algumas alterações, deste jeito:

 

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)

if isExhausted(cid, "exevo mas san") == FALSE then
return doCombat(cid, combat, var), setCooldown(cid, "exevo mas san", 10)
end

return FALSE, doPlayerSendCancel(cid, "You are exhausted.")
end

 

Observe o que muda:

 

function onCastSpell(cid, var)

if isExhausted(cid, "exevo mas san") == FALSE then
return doCombat(cid, combat, var), setCooldown(cid, "exevo mas san", 10)
end

return FALSE, doPlayerSendCancel(cid, "You are exhausted.")
end

 

Esta será a base de todas as spells, você só tem que trocar o nome e o tempo.

 

--

 

Avisem se encontrarem algum bug comprometedor. Abraços.

Oie :D

douguera

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 25/05/08Posts: 69

Parabens muito bom. +REP

Rajas

avatar
Artesão
Artesão

INFOS

Grupo: ArtesãoRegistrado: 30/12/07Posts: 132Gênero: MasculinoChar no Tibia: Hannibol

noh muitoo bom esse post! +Rep

othereality

avatar
Visconde
Visconde

INFOS

Grupo: ViscondeRegistrado: 18/01/11Posts: 343Char no Tibia: Zodriac

Mto bom,

nunca tinha visto cooldown usando apenas um storage =O

 

Porem,

eu tenho uma duvida, tem como eu adicionar este cooldown,

em uma magia com mais de um effect?

 

 

local function onCastSpell5(parameters)
doCombat(parameters.cid, combat5, parameters.var)
end

function onCastSpell(cid, var)
local parameters = { cid = cid, var = var}
addEvent(onCastSpell1, 1000, parameters)
addEvent(onCastSpell2, 3000, parameters)
addEvent(onCastSpell3, 5000, parameters)
addEvent(onCastSpell4, 7000, parameters)
addEvent(onCastSpell5, 9000, parameters)

return TRUE
end

 

eu tentei adc mas não consegui..

como devo fazer?

 

------------------------

 

E uma outra coisinha,

teem como no lugar de "You are exhausted."

o script dizer quantos segundos faltam?

 

ou por ser o mesmo storage não da?

 

 

vlw Demonb. :winksmiley02:

não me dê rep

apenas leia abaixo

###motivos pra você clicar aqui agora e entrar no Uwnia99 OT###

 

Temos 15 classes e está sempre lançando mais.
A classe Assassin fica invisível até pra
 players :rip:

A classe Cake Guardian tem uma magia de refletir dano

Temos Eventos próprios acontecendo todo momento

Temos várias sprites únicas do OT

 A classe Feral Druid se transforma em vários bichos e tem magias diferentes dependendo da forma que está  :beurk:

Temos um contato muito grande entre desenvolvedor e jogador

 Temos uma classe chamada CAKE GUARDIAN! ELE ATIRA BOLOS!!!!! :love:

Não temos sistema vip e não vamos ter

Não vendemos nenhum tipo de vantagem na loja do site e nem vamos vender (apenas cosméticos)

 24h  :ph34r:

 

Entre no site clicando aqui!

Demonbholder

avatar
Infante
Infante

INFOS

Grupo: InfanteRegistrado: 13/10/08Posts: 1551Char no Tibia: Demonbholder

Ta ai:

 

local function onCastSpell5(parameters)
doCombat(parameters.cid, combat5, parameters.var)
end

function onCastSpell(cid, var)

if isExhausted(cid, "exevo mas san") == FALSE then
local parameters = { cid = cid, var = var}
addEvent(onCastSpell1, 1000, parameters)
addEvent(onCastSpell2, 3000, parameters)
addEvent(onCastSpell3, 5000, parameters)
addEvent(onCastSpell4, 7000, parameters)
addEvent(onCastSpell5, 9000, parameters)
setCooldown(cid, "exevo mas san", 10)
else
doPlayerSendCancel(cid, "You are exhausted. Wait more " .. math.ceil(getCooldown(cid, "exevo mas san")) .. " seconds.")
end

return TRUE
end

 

Não testei, mas deve funcionar. Só mudar o nome da spell e o tempo.

Oie :D

othereality

avatar
Visconde
Visconde

INFOS

Grupo: ViscondeRegistrado: 18/01/11Posts: 343Char no Tibia: Zodriac

Não ta funcionando =/

Ja no momento que eu uso ele fala "You are exhausted. Wait more [0] seconds."

e simplesmente ignora o cooldown, assim que acaba o exhausted do spells.xml ele da a magia dinovo.

 

ah..

e a magia parou de funcionar ainda o.O

ela não ta executando nada, só fala o nome da spell e gasta mana.

 

ou seja não deu erro na spell.

 

Eu estou tentando de alguns geitos aqui,

se conseguir eu edito...

 

EDIT:

 

eu tentei varias coisas,

mas desisto não adianta não consigo.

 

tentei assim:

 

function onCastSpell(cid, var)

if isExhausted(cid, "nature regrow") == TRUE then
doPlayerSendCancel(cid, "You are exhausted. Wait more " .. math.ceil(getCooldown(cid, "nature regrow")) .. " seconds.")
else
local parameters = { cid = cid, var = var}
addEvent(onCastSpell1, 1000, parameters)
addEvent(onCastSpell2, 3000, parameters)
addEvent(onCastSpell3, 5000, parameters)
addEvent(onCastSpell4, 7000, parameters)
addEvent(onCastSpell5, 9000, parameters)
setCooldown(cid, "nature regrow", 12)
end

return TRUE
end

 

jurei que ia funcionar mas não =/

não me dê rep

apenas leia abaixo

###motivos pra você clicar aqui agora e entrar no Uwnia99 OT###

 

Temos 15 classes e está sempre lançando mais.
A classe Assassin fica invisível até pra
 players :rip:

A classe Cake Guardian tem uma magia de refletir dano

Temos Eventos próprios acontecendo todo momento

Temos várias sprites únicas do OT

 A classe Feral Druid se transforma em vários bichos e tem magias diferentes dependendo da forma que está  :beurk:

Temos um contato muito grande entre desenvolvedor e jogador

 Temos uma classe chamada CAKE GUARDIAN! ELE ATIRA BOLOS!!!!! :love:

Não temos sistema vip e não vamos ter

Não vendemos nenhum tipo de vantagem na loja do site e nem vamos vender (apenas cosméticos)

 24h  :ph34r:

 

Entre no site clicando aqui!

Demonbholder

avatar
Infante
Infante

INFOS

Grupo: InfanteRegistrado: 13/10/08Posts: 1551Char no Tibia: Demonbholder

Ah, já entendi o problema, seu otserver não deve aceitar string no storage.

 

É com todas spells que acontece isso né?

 

Se for só com essa, me passa ela toda pra eu fazer as alterações.

Oie :D

othereality

avatar
Visconde
Visconde

INFOS

Grupo: ViscondeRegistrado: 18/01/11Posts: 343Char no Tibia: Zodriac

Na verdade eu não testei em outras,

e agora que você falou eu fui testar mas não soube fazer as edições porque eu uso um sistema de spell diferente.

Ele termina assim:

 

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

Não sei se adianta pra você, mas no memento que eu uso a spell não da nenhum erro no console.

 

 

Caso meu otserver não aceite string no storage, existe outro modo de fazer cooldown?

 

EDIT:

olha só, eu testei esse sistema:

 

function onCastSpell(cid, var)
       local storage = 23010
       local spellname = "Ignite"
       local time = 30

       if exhaustion.check(cid, storage) == false then
               exhaustion.set(cid, storage, time)
               return doCombat(cid, combat, var)
       else
               doPlayerSendCancel(cid, "You are exhausted in " .. spellname .. " for: " ..exhaustion.get(cid, storage).." seconds.")
       end
end

 

E quando eu uso a spell pela segunda vez,

ela é usada normalmente ignorando o cooldawn e ainda assim informa o "SendCancel".

talvez te esclareça alguma coisa, seila.. =P

 

EDIT²:

 

Agora consegui fazer funcionar na magia exura gran esse sistem:

 

function onCastSpell(cid, var)
       local storage = 23010
       local spellname = "exura gran"
       local time = 2

       if exhaustion.check(cid, storage) == false then
               exhaustion.set(cid, storage, time)
               return doCombat(cid, combat, var)
       else
               doPlayerSendCancel(cid, "You are exhausted in " .. spellname .. " for: " ..exhaustion.get(cid, storage).." seconds.")
       end
end

 

Porem nas magias que são feitas com outro sistema,

um feito pelo "Tibi4ee" eu não consigo por o sistema.

=S

 

 

Eu vou postar minha magia aqui pra você ver se consegue por =S

 

 

local combat1 = createCombatObject()

setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_HEALING)

setCombatParam(combat1, COMBAT_PARAM_TARGETPLAYERSORSUMMONS, true)

setCombatParam(combat1, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)

setCombatParam(combat1, COMBAT_PARAM_AGGRESSIVE, FALSE)

setCombatParam(combat1, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE)

 

function getCombatFormulas(cid, lv, maglv)

local formula_min = lv*15/10

local formula_max = lv*15/10

 

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(combat1, CALLBACK_PARAM_LEVELMAGICVALUE, "getCombatFormulas")

 

local combat2 = createCombatObject()

setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_HEALING)

setCombatParam(combat2, COMBAT_PARAM_TARGETPLAYERSORSUMMONS, true)

setCombatParam(combat2, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)

setCombatParam(combat2, COMBAT_PARAM_AGGRESSIVE, FALSE)

setCombatParam(combat2, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE)

 

function getCombatFormulas(cid, lv, maglv)

local formula_min = lv*15/10

local formula_max = lv*15/10

 

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(combat2, CALLBACK_PARAM_LEVELMAGICVALUE, "getCombatFormulas")

 

local combat3 = createCombatObject()

setCombatParam(combat3, COMBAT_PARAM_TYPE, COMBAT_HEALING)

setCombatParam(combat3, COMBAT_PARAM_TARGETPLAYERSORSUMMONS, true)

setCombatParam(combat3, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)

setCombatParam(combat3, COMBAT_PARAM_AGGRESSIVE, FALSE)

setCombatParam(combat3, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE)

 

function getCombatFormulas(cid, lv, maglv)

local formula_min = lv*15/10

local formula_max = lv*15/10

 

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(combat3, CALLBACK_PARAM_LEVELMAGICVALUE, "getCombatFormulas")

 

local combat4 = createCombatObject()

setCombatParam(combat4, COMBAT_PARAM_TYPE, COMBAT_HEALING)

setCombatParam(combat4, COMBAT_PARAM_TARGETPLAYERSORSUMMONS, true)

setCombatParam(combat4, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)

setCombatParam(combat4, COMBAT_PARAM_AGGRESSIVE, FALSE)

setCombatParam(combat4, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE)

 

function getCombatFormulas(cid, lv, maglv)

local formula_min = lv*15/10

local formula_max = lv*15/10

 

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(combat4, CALLBACK_PARAM_LEVELMAGICVALUE, "getCombatFormulas")

 

local combat5 = createCombatObject()

setCombatParam(combat5, COMBAT_PARAM_TYPE, COMBAT_HEALING)

setCombatParam(combat5, COMBAT_PARAM_TARGETPLAYERSORSUMMONS, true)

setCombatParam(combat5, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)

setCombatParam(combat5, COMBAT_PARAM_AGGRESSIVE, FALSE)

setCombatParam(combat5, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE)

 

function getCombatFormulas(cid, lv, maglv)

local formula_min = lv*15/10

local formula_max = lv*15/10

 

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(combat5, CALLBACK_PARAM_LEVELMAGICVALUE, "getCombatFormulas")

 

arr1 = {

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},

{0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},

{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},

{0, 0, 1, 1, 1, 3, 1, 1, 1, 0, 0},

{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},

{0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},

{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

}

 

arr2 = {

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},

{0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},

{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},

{0, 0, 1, 1, 1, 3, 1, 1, 1, 0, 0},

{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},

{0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},

{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

}

 

arr3 = {

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},

{0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},

{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},

{0, 0, 1, 1, 1, 3, 1, 1, 1, 0, 0},

{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},

{0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},

{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

}

 

arr4 = {

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},

{0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},

{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},

{0, 0, 1, 1, 1, 3, 1, 1, 1, 0, 0},

{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},

{0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},

{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

}

 

arr5 = {

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},

{0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},

{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},

{0, 0, 1, 1, 1, 3, 1, 1, 1, 0, 0},

{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},

{0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},

{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 1, 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(combat1, area1)

setCombatArea(combat2, area2)

setCombatArea(combat3, area3)

setCombatArea(combat4, area4)

setCombatArea(combat5, area5)

 

 

local function onCastSpell1(parameters)

doCombat(parameters.cid, combat1, parameters.var)

end

 

local function onCastSpell2(parameters)

doCombat(parameters.cid, combat2, parameters.var)

end

 

local function onCastSpell3(parameters)

doCombat(parameters.cid, combat3, parameters.var)

end

 

local function onCastSpell4(parameters)

doCombat(parameters.cid, combat4, parameters.var)

end

 

local function onCastSpell5(parameters)

doCombat(parameters.cid, combat5, parameters.var)

end

 

function onCastSpell(cid, var)

local parameters = { cid = cid, var = var}

addEvent(onCastSpell1, 1000, parameters)

addEvent(onCastSpell2, 3000, parameters)

addEvent(onCastSpell3, 5000, parameters)

addEvent(onCastSpell4, 7000, parameters)

addEvent(onCastSpell5, 9000, parameters)

 

return TRUE

end

 

 

 

# quero cooldown :worriedsmiley:

suahsaua

não me dê rep

apenas leia abaixo

###motivos pra você clicar aqui agora e entrar no Uwnia99 OT###

 

Temos 15 classes e está sempre lançando mais.
A classe Assassin fica invisível até pra
 players :rip:

A classe Cake Guardian tem uma magia de refletir dano

Temos Eventos próprios acontecendo todo momento

Temos várias sprites únicas do OT

 A classe Feral Druid se transforma em vários bichos e tem magias diferentes dependendo da forma que está  :beurk:

Temos um contato muito grande entre desenvolvedor e jogador

 Temos uma classe chamada CAKE GUARDIAN! ELE ATIRA BOLOS!!!!! :love:

Não temos sistema vip e não vamos ter

Não vendemos nenhum tipo de vantagem na loja do site e nem vamos vender (apenas cosméticos)

 24h  :ph34r:

 

Entre no site clicando aqui!

Demonbholder

avatar
Infante
Infante

INFOS

Grupo: InfanteRegistrado: 13/10/08Posts: 1551Char no Tibia: Demonbholder

 

local combat1 = createCombatObject()
setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_HEALING)
setCombatParam(combat1, COMBAT_PARAM_TARGETPLAYERSORSUMMONS, true)
setCombatParam(combat1, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)
setCombatParam(combat1, COMBAT_PARAM_AGGRESSIVE, FALSE)
setCombatParam(combat1, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE)

function getCombatFormulas(cid, lv, maglv)
local formula_min = lv*15/10
local formula_max = lv*15/10

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(combat1, CALLBACK_PARAM_LEVELMAGICVALUE, "getCombatFormulas")

local combat2 = createCombatObject()
setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_HEALING)
setCombatParam(combat2, COMBAT_PARAM_TARGETPLAYERSORSUMMONS, true)
setCombatParam(combat2, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)
setCombatParam(combat2, COMBAT_PARAM_AGGRESSIVE, FALSE)
setCombatParam(combat2, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE)

function getCombatFormulas(cid, lv, maglv)
local formula_min = lv*15/10
local formula_max = lv*15/10

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(combat2, CALLBACK_PARAM_LEVELMAGICVALUE, "getCombatFormulas")

local combat3 = createCombatObject()
setCombatParam(combat3, COMBAT_PARAM_TYPE, COMBAT_HEALING)
setCombatParam(combat3, COMBAT_PARAM_TARGETPLAYERSORSUMMONS, true)
setCombatParam(combat3, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)
setCombatParam(combat3, COMBAT_PARAM_AGGRESSIVE, FALSE)
setCombatParam(combat3, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE)

function getCombatFormulas(cid, lv, maglv)
local formula_min = lv*15/10
local formula_max = lv*15/10

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(combat3, CALLBACK_PARAM_LEVELMAGICVALUE, "getCombatFormulas")

local combat4 = createCombatObject()
setCombatParam(combat4, COMBAT_PARAM_TYPE, COMBAT_HEALING)
setCombatParam(combat4, COMBAT_PARAM_TARGETPLAYERSORSUMMONS, true)
setCombatParam(combat4, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)
setCombatParam(combat4, COMBAT_PARAM_AGGRESSIVE, FALSE)
setCombatParam(combat4, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE)

function getCombatFormulas(cid, lv, maglv)
local formula_min = lv*15/10
local formula_max = lv*15/10

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(combat4, CALLBACK_PARAM_LEVELMAGICVALUE, "getCombatFormulas")

local combat5 = createCombatObject()
setCombatParam(combat5, COMBAT_PARAM_TYPE, COMBAT_HEALING)
setCombatParam(combat5, COMBAT_PARAM_TARGETPLAYERSORSUMMONS, true)
setCombatParam(combat5, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)
setCombatParam(combat5, COMBAT_PARAM_AGGRESSIVE, FALSE)
setCombatParam(combat5, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE)

function getCombatFormulas(cid, lv, maglv)
local formula_min = lv*15/10
local formula_max = lv*15/10

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(combat5, CALLBACK_PARAM_LEVELMAGICVALUE, "getCombatFormulas")

arr1 = {
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 1, 1, 1, 3, 1, 1, 1, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
}

arr2 = {
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 1, 1, 1, 3, 1, 1, 1, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
}

arr3 = {
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 1, 1, 1, 3, 1, 1, 1, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
}

arr4 = {
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 1, 1, 1, 3, 1, 1, 1, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
}

arr5 = {
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 1, 1, 1, 3, 1, 1, 1, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 1, 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(combat1, area1)
setCombatArea(combat2, area2)
setCombatArea(combat3, area3)
setCombatArea(combat4, area4)
setCombatArea(combat5, area5)


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

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

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

local function onCastSpell4(parameters)
doCombat(parameters.cid, combat4, parameters.var)
end

local function onCastSpell5(parameters)
doCombat(parameters.cid, combat5, parameters.var)
end

function onCastSpell(cid, var)

if isExhausted(cid, "teste") == FALSE then
local parameters = { cid = cid, var = var}
addEvent(onCastSpell1, 1000, parameters)
addEvent(onCastSpell2, 3000, parameters)
addEvent(onCastSpell3, 5000, parameters)
addEvent(onCastSpell4, 7000, parameters)
addEvent(onCastSpell5, 9000, parameters)
setCooldown(cid, "teste", 10)
else
doPlayerSendCancel(cid, "Você está exausto. Espere " .. math.ceil(getCooldown(cid, "teste")) .. " segundos.")
end

return TRUE
end

 

 

Aqui funcionou, se ai não funcionar você vai precisar usar o outro sistema que usar vários storages.

Oie :D

othereality

avatar
Visconde
Visconde

INFOS

Grupo: ViscondeRegistrado: 18/01/11Posts: 343Char no Tibia: Zodriac

blz..

vlw pela ajuda, Demonb.

amanhã dou te dou rep ;)

não me dê rep

apenas leia abaixo

###motivos pra você clicar aqui agora e entrar no Uwnia99 OT###

 

Temos 15 classes e está sempre lançando mais.
A classe Assassin fica invisível até pra
 players :rip:

A classe Cake Guardian tem uma magia de refletir dano

Temos Eventos próprios acontecendo todo momento

Temos várias sprites únicas do OT

 A classe Feral Druid se transforma em vários bichos e tem magias diferentes dependendo da forma que está  :beurk:

Temos um contato muito grande entre desenvolvedor e jogador

 Temos uma classe chamada CAKE GUARDIAN! ELE ATIRA BOLOS!!!!! :love:

Não temos sistema vip e não vamos ter

Não vendemos nenhum tipo de vantagem na loja do site e nem vamos vender (apenas cosméticos)

 24h  :ph34r:

 

Entre no site clicando aqui!

Demonbholder

avatar
Infante
Infante

INFOS

Grupo: InfanteRegistrado: 13/10/08Posts: 1551Char no Tibia: Demonbholder

Isso quer dizer que funcionou, certo?

 

O erro meu no primeiro script foi que eu esqueci dos parâmetros da função isExhausted.

Oie :D

othereality

avatar
Visconde
Visconde

INFOS

Grupo: ViscondeRegistrado: 18/01/11Posts: 343Char no Tibia: Zodriac

Não na verdade não funcionou,

o eu percebi que voce esqueceu, ja tinho posto..

mas não funcionou do mesmo jeito.

 

Mas mesmo assim rep pela boa vontade e pelo script que foi uma otima idéia ;)

 

vou tentar do jeito que voce disse com um sistema com varias storages....

 

 

_________________________

 

 

EDIT:

Olha só da uma ajudinha,

eu fiz assim:

 

function onCastSpell(cid, var)
if exhaustion.check(cid, 23006) == false then
local parameters = { cid = cid, var = var}
addEvent(onCastSpell1, 1000, parameters)
addEvent(onCastSpell2, 3000, parameters)
addEvent(onCastSpell3, 5000, parameters)
addEvent(onCastSpell4, 7000, parameters)
addEvent(onCastSpell5, 9000, parameters)
exhaustion.set(cid, 23006, 12)

else
    doPlayerSendCancel(cid, "Cooldown[" ..exhaustion.get(cid, 23006).."]")
       end

return TRUE
end

 

ele informa o cooldown direitinha só que se voce usar a magia,

ela funciona normalmente.

 

eu sinto que quase funciona \o/

não me dê rep

apenas leia abaixo

###motivos pra você clicar aqui agora e entrar no Uwnia99 OT###

 

Temos 15 classes e está sempre lançando mais.
A classe Assassin fica invisível até pra
 players :rip:

A classe Cake Guardian tem uma magia de refletir dano

Temos Eventos próprios acontecendo todo momento

Temos várias sprites únicas do OT

 A classe Feral Druid se transforma em vários bichos e tem magias diferentes dependendo da forma que está  :beurk:

Temos um contato muito grande entre desenvolvedor e jogador

 Temos uma classe chamada CAKE GUARDIAN! ELE ATIRA BOLOS!!!!! :love:

Não temos sistema vip e não vamos ter

Não vendemos nenhum tipo de vantagem na loja do site e nem vamos vender (apenas cosméticos)

 24h  :ph34r:

 

Entre no site clicando aqui!

Demonbholder

avatar
Infante
Infante

INFOS

Grupo: InfanteRegistrado: 13/10/08Posts: 1551Char no Tibia: Demonbholder

Tenta assim:

 

function onCastSpell(cid, var)

if exhaustion.check(cid, 23006) == FALSE then
local parameters = { cid = cid, var = var}
addEvent(onCastSpell1, 1000, parameters)
addEvent(onCastSpell2, 3000, parameters)
addEvent(onCastSpell3, 5000, parameters)
addEvent(onCastSpell4, 7000, parameters)
addEvent(onCastSpell5, 9000, parameters)
exhaustion.set(cid, 23006, 12)
else
return doPlayerSendCancel(cid, "Cooldown[" ..exhaustion.get(cid, 23006).."]")
end

return TRUE
end

 

Sempre usa FALSE e TRUE ao invés de false e true. Mas não era esse o problema, já arrumei o verdadeiro problema.

Oie :D

othereality

avatar
Visconde
Visconde

INFOS

Grupo: ViscondeRegistrado: 18/01/11Posts: 343Char no Tibia: Zodriac

=D

agora o player não usa a magia só depois que acaba o cooldown tudo certinho mas,

mesmo quando o cooldown impede o player ele gasta mana ainda assim... =S

 

EDIT:

 

acabei de acordar e ta dizendo que eu ja exedi o limiti de rep que lixo -.-

não me dê rep

apenas leia abaixo

###motivos pra você clicar aqui agora e entrar no Uwnia99 OT###

 

Temos 15 classes e está sempre lançando mais.
A classe Assassin fica invisível até pra
 players :rip:

A classe Cake Guardian tem uma magia de refletir dano

Temos Eventos próprios acontecendo todo momento

Temos várias sprites únicas do OT

 A classe Feral Druid se transforma em vários bichos e tem magias diferentes dependendo da forma que está  :beurk:

Temos um contato muito grande entre desenvolvedor e jogador

 Temos uma classe chamada CAKE GUARDIAN! ELE ATIRA BOLOS!!!!! :love:

Não temos sistema vip e não vamos ter

Não vendemos nenhum tipo de vantagem na loja do site e nem vamos vender (apenas cosméticos)

 24h  :ph34r:

 

Entre no site clicando aqui!

  • 1
  • 2