• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Lua How to use more than one addEvent in a script?

gabriel28

Member
Joined
Mar 16, 2012
Messages
199
Solutions
6
Reaction score
24
As the title says, my question is on how to run more of an addEvent without returning error in the console.
I use script spells with more than one attack, and to effect right out on the target I get his pos, and, as expected, if the target dies before the spell finishes, it returns an error on the console.

This is a exemple of one spell I use:

Lua:
local combat1 = createCombatObject()
setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
function onGetFormulaValues(cid, level, maglevel)
    min = -(level * 9 + maglevel * 12) * 1.5
    max = -(level * 12 + maglevel * 15) * 2.5

    return min, max
end

setCombatCallback(combat1, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

local combat2 = createCombatObject()
setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
function onGetFormulaValues(cid, level, maglevel)
    min = -(level * 9 + maglevel * 12) * 1.5
    max = -(level * 12 + maglevel * 15) * 2.5

    return min, max
end

setCombatCallback(combat2, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

local combat3 = createCombatObject()
setCombatParam(combat3, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
function onGetFormulaValues(cid, level, maglevel)
    min = -(level * 9 + maglevel * 12) * 1.5
    max = -(level * 12 + maglevel * 15) * 2.5

    return min, max
end

setCombatCallback(combat3, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

local combat4 = createCombatObject()
setCombatParam(combat4, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
function onGetFormulaValues(cid, level, maglevel)
    min = -(level * 9 + maglevel * 12) * 1.5
    max = -(level * 12 + maglevel * 15) * 2.5

    return min, max
end

setCombatCallback(combat4, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

local combat5 = createCombatObject()
setCombatParam(combat5, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
function onGetFormulaValues(cid, level, maglevel)
    min = -(level * 9 + maglevel * 12) * 1.5
    max = -(level * 12 + maglevel * 15) * 2.5

    return min, max
end

setCombatCallback(combat5, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

local combat6 = createCombatObject()
setCombatParam(combat6, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
function onGetFormulaValues(cid, level, maglevel)
    min = -(level * 9 + maglevel * 12) * 1.5
    max = -(level * 12 + maglevel * 15) * 2.5

    return min, max
end

setCombatCallback(combat6, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

local function onCastSpell1(cid, var)
local fromPos = getCreaturePosition(cid)
local target = getCreatureTarget(cid)
local monsterpos = getCreaturePosition(target)
local position = {x=monsterpos.x+1, y=monsterpos.y+1, z=monsterpos.z}
    doSendDistanceShoot(fromPos, position, 9)
    doSendMagicEffect(position, 15)
    return doCombat(cid, combat1, var)
end

local function onCastSpell2(cid, var)
local fromPos1 = getCreaturePosition(cid)
local target = getCreatureTarget(cid)
local monsterpos = getCreaturePosition(target)
local position1 = {x=monsterpos.x, y=monsterpos.y+1, z=monsterpos.z}
    doSendDistanceShoot(fromPos1, position1, 9)
    doSendMagicEffect(position1, 15)
    return doCombat(cid, combat2, var)
end

local function onCastSpell3(cid, var)
local fromPos2 = getCreaturePosition(cid)
local target = getCreatureTarget(cid)
local monsterpos = getCreaturePosition(target)
local position2 = {x=monsterpos.x+1, y=monsterpos.y-1, z=monsterpos.z}
    doSendDistanceShoot(fromPos2, position2, 9)
    doSendMagicEffect(position2, 15)
    return doCombat(cid, combat3, var)
end

local function onCastSpell4(cid, var)
local fromPos3 = getCreaturePosition(cid)
local target = getCreatureTarget(cid)
local monsterpos = getCreaturePosition(target)
local position3 = {x=monsterpos.x+1, y=monsterpos.y, z=monsterpos.z}
    doSendDistanceShoot(fromPos3, position3, 9)
    doSendMagicEffect(position3, 15)
     return doCombat(cid, combat4, var)
end

local function onCastSpell5(cid, var)
local fromPos4 = getCreaturePosition(cid)
local target = getCreatureTarget(cid)
local monsterpos = getCreaturePosition(target)
local position4 = {x=monsterpos.x, y=monsterpos.y, z=monsterpos.z}
    doSendDistanceShoot(fromPos4, position4, 9)
    doSendMagicEffect(position4, 15)
     return doCombat(cid, combat5, var)
end

local function onCastSpell6(cid, var)
local fromPos5 = getCreaturePosition(cid)
local target = getCreatureTarget(cid)
local monsterpos = getCreaturePosition(target)
local position5 = {x=monsterpos.x, y=monsterpos.y, z=monsterpos.z}
    doSendDistanceShoot(fromPos5, position5, 9)
    doSendMagicEffect(position5, 15)
     return doCombat(cid, combat6, var)
end

function onCastSpell(cid, var)
local waittime = 2
local storage = 5870

if exhaustion.check(cid, storage) then
return false
end
addEvent(onCastSpell1, 0, cid, var)   
addEvent(onCastSpell2, 400, cid, var)       
addEvent(onCastSpell3, 800, cid, var)       
addEvent(onCastSpell4, 1200, cid, var)
addEvent(onCastSpell5, 1600, cid, var)
addEvent(onCastSpell6, 2000, cid, var)

exhaustion.set(cid, storage, waittime)
return true       
  
end

Thank you in advance and sorry for my English.
 
Not tested
Also to answer your question use tables.
Edit: made a change to stop the events if there is no target
Lua:
local posChanges = {
    [1] = {x = 1,     y = 1,      time = 0},
    [2] = {x = nil, y = 1,      time = 400},
    [3] = {x = 1,     y = -1,  time = 800},
    [4] = {x = 1,     y = nil, time = 1200},
    [5] = {x = nil, y = nil, time = 1600},
    [6] = {x = nil, y = nil, time = 2000},
}


local combat, events = {}, {}

for i = 1, #posChanges do
    combat[i] = createCombatObject()
    setCombatParam(combat[i], COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
    _G['onGetFormulaValues'..i] = function(cid, level, maglevel)
            min = -(level * 9 + maglevel * 12) * 1.5
            max = -(level * 12 + maglevel * 15) * 2.5
            return min, max
    end
    setCombatCallback(combat[i], CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues"..i)
end

-- 1 by itself would mean to add 1, -1 (negative 1) tells the script to subtract 1
function executeSpell(cid, combat, var, x, y)
    if isCreature(cid) then
        local fromPos = getCreaturePosition(cid)
        local target = getCreatureTarget(cid)
        if isCreature(target) then
            local monsterpos = getCreaturePosition(target)
            if x then
                monsterpos.x = x > 0 and (monsterpos.x + x) or (monsterpos.x - (0 - x))
            end
            if y then
                monsterpos.y = y > 0 and (monsterpos.y + y) or (monsterpos.y - (0 - y))
            end
            doSendDistanceShoot(fromPos, monsterpos, 9)
            doSendMagicEffect(monsterpos, 15)
            doCombat(cid, combat, var)
        else
            if events and next(events) then
                for n = 1, #events do
                    stopEvent(events[n])
                end
                events = {}
            end
        end
    end
end

local waittime = 2
local storage = 5870

function onCastSpell(cid, var)
    if exhaustion.check(cid, storage) then
        return false
    end
    for x = 1, #posChanges do
        events[x] = addEvent(executeSpell, posChanges[x].time, cid, combat[x], var, posChanges[x].x, posChanges[x].y) 
    end
    exhaustion.set(cid, storage, waittime)
    return true     
end
 
Last edited:
@Steve Albert
Ok. But now, I think I made it. I did some tests and got no errors on console and no crash.

But I need your opinion.
Here is the script:

Lua:
local combat1 = createCombatObject()
setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
function onGetFormulaValues(cid, level, maglevel)
    min = -(level * 9 + maglevel * 12) * 1.5
    max = -(level * 12 + maglevel * 15) * 2.5

    return min, max
end

setCombatCallback(combat1, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

local combat2 = createCombatObject()
setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
function onGetFormulaValues(cid, level, maglevel)
    min = -(level * 9 + maglevel * 12) * 1.5
    max = -(level * 12 + maglevel * 15) * 2.5

    return min, max
end

setCombatCallback(combat2, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

local combat3 = createCombatObject()
setCombatParam(combat3, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
function onGetFormulaValues(cid, level, maglevel)
    min = -(level * 9 + maglevel * 12) * 1.5
    max = -(level * 12 + maglevel * 15) * 2.5

    return min, max
end

setCombatCallback(combat3, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

local combat4 = createCombatObject()
setCombatParam(combat4, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
function onGetFormulaValues(cid, level, maglevel)
    min = -(level * 9 + maglevel * 12) * 1.5
    max = -(level * 12 + maglevel * 15) * 2.5

    return min, max
end

setCombatCallback(combat4, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

local combat5 = createCombatObject()
setCombatParam(combat5, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
function onGetFormulaValues(cid, level, maglevel)
    min = -(level * 9 + maglevel * 12) * 1.5
    max = -(level * 12 + maglevel * 15) * 2.5

    return min, max
end

setCombatCallback(combat5, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

local combat6 = createCombatObject()
setCombatParam(combat6, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
function onGetFormulaValues(cid, level, maglevel)
    min = -(level * 9 + maglevel * 12) * 1.5
    max = -(level * 12 + maglevel * 15) * 2.5

    return min, max
end

setCombatCallback(combat6, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

local function onCastSpell1(cid, var)
local fromPos = getCreaturePosition(cid)
local target = getCreatureTarget(cid)
local monsterpos = getCreaturePosition(target)
local position = {x=monsterpos.x+1, y=monsterpos.y+1, z=monsterpos.z}
    doSendDistanceShoot(fromPos, position, 9)
    doSendMagicEffect(position, 15)
    return doCombat(cid, combat1, var)
end

local function onCastSpell2(cid, var)
local fromPos1 = getCreaturePosition(cid)
local target = getCreatureTarget(cid)
local monsterpos = getCreaturePosition(target)
local position1 = {x=monsterpos.x, y=monsterpos.y+1, z=monsterpos.z}
    doSendDistanceShoot(fromPos1, position1, 9)
    doSendMagicEffect(position1, 15)
    return doCombat(cid, combat2, var)
end

local function onCastSpell3(cid, var)
local fromPos2 = getCreaturePosition(cid)
local target = getCreatureTarget(cid)
local monsterpos = getCreaturePosition(target)
local position2 = {x=monsterpos.x+1, y=monsterpos.y-1, z=monsterpos.z}
    doSendDistanceShoot(fromPos2, position2, 9)
    doSendMagicEffect(position2, 15)
    return doCombat(cid, combat3, var)
end

local function onCastSpell4(cid, var)
local fromPos3 = getCreaturePosition(cid)
local target = getCreatureTarget(cid)
local monsterpos = getCreaturePosition(target)
local position3 = {x=monsterpos.x+1, y=monsterpos.y, z=monsterpos.z}
    doSendDistanceShoot(fromPos3, position3, 9)
    doSendMagicEffect(position3, 15)
     return doCombat(cid, combat4, var)
end

local function onCastSpell5(cid, var)
local fromPos4 = getCreaturePosition(cid)
local target = getCreatureTarget(cid)
local monsterpos = getCreaturePosition(target)
local position4 = {x=monsterpos.x, y=monsterpos.y, z=monsterpos.z}
    doSendDistanceShoot(fromPos4, position4, 9)
    doSendMagicEffect(position4, 15)
     return doCombat(cid, combat5, var)
end

local function onCastSpell6(cid, var)
local fromPos5 = getCreaturePosition(cid)
local target = getCreatureTarget(cid)
local monsterpos = getCreaturePosition(target)
local position5 = {x=monsterpos.x, y=monsterpos.y, z=monsterpos.z}
    doSendDistanceShoot(fromPos5, position5, 9)
    doSendMagicEffect(position5, 15)
     return doCombat(cid, combat6, var)
end

function onCastSpell(cid, var)
local waittime = 2
local storage = 5870

if exhaustion.check(cid, storage) then
return false
end
addEvent(function()
local target = getCreatureTarget(cid)
    if isCreature(target) then
    onCastSpell1(cid, var)
    end
end, 100) 
addEvent(function()
    local target = getCreatureTarget(cid)
    if isCreature(target) then
            onCastSpell2(cid, var)
            end
end, 400) 
addEvent(function()
    local target = getCreatureTarget(cid)
    if isCreature(target) then
            onCastSpell3(cid, var)
            end
end, 800) 
addEvent(function()
    local target = getCreatureTarget(cid)
    if isCreature(target) then
            onCastSpell4(cid, var)
            end
end, 1200) 
addEvent(function()
    local target = getCreatureTarget(cid)
    if isCreature(target) then
            onCastSpell5(cid, var)
            end
end, 1600) 
addEvent(function()
local target = getCreatureTarget(cid)
if isCreature(target) then
            onCastSpell6(cid, var)
            end
end, 2000) 

exhaustion.set(cid, storage, waittime)
return true     

end

Do you think it will force the TFS too much? Like, too many people casting it, this script will be a trouble? (I don't know if I expressed well)
Edit: TFS 0.4 rev 3884
 
@Steve Albert
Ok. But now, I think I made it. I did some tests and got no errors on console and no crash.

But I need your opinion.
Here is the script:

Lua:
local combat1 = createCombatObject()
setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
function onGetFormulaValues(cid, level, maglevel)
    min = -(level * 9 + maglevel * 12) * 1.5
    max = -(level * 12 + maglevel * 15) * 2.5

    return min, max
end

setCombatCallback(combat1, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

local combat2 = createCombatObject()
setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
function onGetFormulaValues(cid, level, maglevel)
    min = -(level * 9 + maglevel * 12) * 1.5
    max = -(level * 12 + maglevel * 15) * 2.5

    return min, max
end

setCombatCallback(combat2, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

local combat3 = createCombatObject()
setCombatParam(combat3, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
function onGetFormulaValues(cid, level, maglevel)
    min = -(level * 9 + maglevel * 12) * 1.5
    max = -(level * 12 + maglevel * 15) * 2.5

    return min, max
end

setCombatCallback(combat3, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

local combat4 = createCombatObject()
setCombatParam(combat4, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
function onGetFormulaValues(cid, level, maglevel)
    min = -(level * 9 + maglevel * 12) * 1.5
    max = -(level * 12 + maglevel * 15) * 2.5

    return min, max
end

setCombatCallback(combat4, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

local combat5 = createCombatObject()
setCombatParam(combat5, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
function onGetFormulaValues(cid, level, maglevel)
    min = -(level * 9 + maglevel * 12) * 1.5
    max = -(level * 12 + maglevel * 15) * 2.5

    return min, max
end

setCombatCallback(combat5, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

local combat6 = createCombatObject()
setCombatParam(combat6, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
function onGetFormulaValues(cid, level, maglevel)
    min = -(level * 9 + maglevel * 12) * 1.5
    max = -(level * 12 + maglevel * 15) * 2.5

    return min, max
end

setCombatCallback(combat6, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

local function onCastSpell1(cid, var)
local fromPos = getCreaturePosition(cid)
local target = getCreatureTarget(cid)
local monsterpos = getCreaturePosition(target)
local position = {x=monsterpos.x+1, y=monsterpos.y+1, z=monsterpos.z}
    doSendDistanceShoot(fromPos, position, 9)
    doSendMagicEffect(position, 15)
    return doCombat(cid, combat1, var)
end

local function onCastSpell2(cid, var)
local fromPos1 = getCreaturePosition(cid)
local target = getCreatureTarget(cid)
local monsterpos = getCreaturePosition(target)
local position1 = {x=monsterpos.x, y=monsterpos.y+1, z=monsterpos.z}
    doSendDistanceShoot(fromPos1, position1, 9)
    doSendMagicEffect(position1, 15)
    return doCombat(cid, combat2, var)
end

local function onCastSpell3(cid, var)
local fromPos2 = getCreaturePosition(cid)
local target = getCreatureTarget(cid)
local monsterpos = getCreaturePosition(target)
local position2 = {x=monsterpos.x+1, y=monsterpos.y-1, z=monsterpos.z}
    doSendDistanceShoot(fromPos2, position2, 9)
    doSendMagicEffect(position2, 15)
    return doCombat(cid, combat3, var)
end

local function onCastSpell4(cid, var)
local fromPos3 = getCreaturePosition(cid)
local target = getCreatureTarget(cid)
local monsterpos = getCreaturePosition(target)
local position3 = {x=monsterpos.x+1, y=monsterpos.y, z=monsterpos.z}
    doSendDistanceShoot(fromPos3, position3, 9)
    doSendMagicEffect(position3, 15)
     return doCombat(cid, combat4, var)
end

local function onCastSpell5(cid, var)
local fromPos4 = getCreaturePosition(cid)
local target = getCreatureTarget(cid)
local monsterpos = getCreaturePosition(target)
local position4 = {x=monsterpos.x, y=monsterpos.y, z=monsterpos.z}
    doSendDistanceShoot(fromPos4, position4, 9)
    doSendMagicEffect(position4, 15)
     return doCombat(cid, combat5, var)
end

local function onCastSpell6(cid, var)
local fromPos5 = getCreaturePosition(cid)
local target = getCreatureTarget(cid)
local monsterpos = getCreaturePosition(target)
local position5 = {x=monsterpos.x, y=monsterpos.y, z=monsterpos.z}
    doSendDistanceShoot(fromPos5, position5, 9)
    doSendMagicEffect(position5, 15)
     return doCombat(cid, combat6, var)
end

function onCastSpell(cid, var)
local waittime = 2
local storage = 5870

if exhaustion.check(cid, storage) then
return false
end
addEvent(function()
local target = getCreatureTarget(cid)
    if isCreature(target) then
    onCastSpell1(cid, var)
    end
end, 100)
addEvent(function()
    local target = getCreatureTarget(cid)
    if isCreature(target) then
            onCastSpell2(cid, var)
            end
end, 400)
addEvent(function()
    local target = getCreatureTarget(cid)
    if isCreature(target) then
            onCastSpell3(cid, var)
            end
end, 800)
addEvent(function()
    local target = getCreatureTarget(cid)
    if isCreature(target) then
            onCastSpell4(cid, var)
            end
end, 1200)
addEvent(function()
    local target = getCreatureTarget(cid)
    if isCreature(target) then
            onCastSpell5(cid, var)
            end
end, 1600)
addEvent(function()
local target = getCreatureTarget(cid)
if isCreature(target) then
            onCastSpell6(cid, var)
            end
end, 2000)

exhaustion.set(cid, storage, waittime)
return true    

end

Do you think it will force the TFS too much? Like, too many people casting it, this script will be a trouble? (I don't know if I expressed well)
Edit: TFS 0.4 rev 3884
The code in the script in general is too much and doesn't look fully functional. All you're doing is copying the same function over and over. The idea behind programming is to construct the source so that it is well structured and executes in an intelligent & logical manner.
 
The reason it was spamming errors before is because it was running an action on a creature that no longer exists, this happens in many different situations, the general rule is that if you are using addEvent to run an action on something, you should always check that the thing still exists when the function is executed.

An example:
Lua:
function myAddEvent(cid)
    local player = Player(cid)
    if(not player) then return false end
    
    print(player:getName())
    return true
end

addEvent(myAddEvent, 1000, player:getId())

If you were to remove the player check on line 3 and the player were to log out before the function runs, it would fail causing an error with line 5 where it's trying to get the players name.
 
@Steve Albert
I'm a beginner in scripting, this is the best I can do, without get error or crashes.

@Xagul
I know that this is the problem. What I don't know to do is how I can get the info if the target exist before each addEvent without get the errors. And I did it, but I needed to call a addEvent (function() all the time (as in the script in my previous comment).
 
@Steve Albert
I'm a beginner in scripting, this is the best I can do, without get error or crashes.

@Xagul
I know that this is the problem. What I don't know to do is how I can get the info if the target exist before each addEvent without get the errors. And I did it, but I needed to call a addEvent (function() all the time (as in the script in my previous comment).
Lua:
-- our combat object
local combat = createCombatObject()
-- parameters for the combat object
-- setCombatParam(combat object, arguments)
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)

-- the call back function, this functions does the actual damage
function onGetFormulaValues(cid, level, maglevel)
    -- min, max will not exist once this function is done executing
    local min = -(level * 9 + maglevel * 12) * 1.5
    local max = -(level * 12 + maglevel * 15) * 2.5
    return min, max
end

--[[
   this is a generatic function that can be reused if needed
   if we set this function to local, example:
   local function executeSpell(cid, var)
   then we would only be able to call it within this script
]]
function executeSpell(cid, var)
  -- determine if the creature exists passing isCreature the creature id
  if isCreature(cid) then
    -- if it does store the creature's position in fromPos
    -- the local keyword makes fromPos exist only within this function
    local fromPos = getCreaturePosition(cid)
    -- same thing with target
    local target = getCreatureTarget(cid)
    -- now check if the creature (cid) has a target and if that target is another creature
    if target and isCreature(target) then
      -- monsterpos is a table with properties of x, y, z & the stackpos
      local monsterpos = getCreaturePosition(target)
      -- you do not need to create a new table
      -- local position5 = {x=monsterpos.x, y=monsterpos.y, z=monsterpos.z}
      -- you can just update the monsterpos properties
      -- this says to get monsterpos's property of x and add 1 to it and assign it to monsterpos's x property
      -- in this case since monsterpos.x has a value it will write over it
      monsterpos.x = monsterpos.x + 1
      -- pass fromPos & monsterpos to doSendDistanceShoot with the effect value of 9
      -- doSendDistanceShoot(start position, end position, effect)
      doSendDistanceShoot(fromPos, monsterpos, 9)
      -- send doSendMagicEffect 2 arguments the 1st is the position and the 2nd is the effect
      -- doSendMagicEffect(position, effect)
      doSendMagicEffect(monsterpos, 15)
      -- no need to return anything you can just execute doCombat
      -- return doCombat(cid, combat, var)
      -- doCombat(creature id, combat object, variant)
      doCombat(cid, combat, var)
      -- when this function executes anything within it that was declared local
      -- fromPos, target, monsterpos no longer exists
    end
end

-- wait time & storage should be defined outside of onCastSpell
-- other wise everytime you cast the spell these 2 variables are recreated
local waittime = 2
local storage = 5870

-- our main function onCastSpell and its arguments cid, var
function onCastSpell(cid, var)
  -- check if the player is exhausted
  -- pass cid & storage to exhaustion.check
  if exhaustion.check(cid, storage) then
    -- if they are exhausted then return false and end the script
    return false
end
  -- addEvent(function name, time, arguments)
  -- if this function were to return a value then it would be lost
  -- because we aren't assigning it to anything
  addEvent(executeSpell, 0, cid, var)
  -- set the storage value of the exhaust with exhaustion.set
  -- exhaustion.set(creature id, storage, value)
  exhaustion.set(cid, storage, waittime)
  -- end the script & show the text above the player & possibly in the default console if emotes is disabled
  return true
end

--[[
  The difference between returning true or false within onCastSpell is that
  returning false will not show the text or emote above the player's head or in the console
  where as returning true will
]]

I hope this helped you understand the script better.
 
Last edited:
Back
Top