• 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!

Spell help! Easy!

Aeronx

Intermediate OT User
Joined
Dec 17, 2015
Messages
736
Solutions
9
Reaction score
121
Hello all! I have this spell, that hits twice. But i cant make it to hit more than twice! I've tried, adding more events, but it doesnt work. I know it might be super easy, but can't get it solved! Anyone that could lend me a hand please? Thanks for you time!

Code:
local combat = Combat()
local time_between_hits = 0.1 --seconds
combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HITAREA)
combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_THROWINGSTAR)
combat:setParameter(COMBAT_PARAM_BLOCKARMOR, 1)

function onGetFormulaValues(player, attack, factor)
  local skillTotal = 2 * player:getEffectiveSkillLevel(SKILL_SWORD)
  local levelTotal = player:getLevel() / 5
  return -(((skillTotal + attack / 3500) * 0.35) + (levelTotal) + 0), -(((skillTotal + attack / 3125) * 0.5) + (levelTotal) + 5)
end

combat:setCallback(CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")
function onCastSpell(creature, var)
   combat:execute(creature, var)
  addEvent(function()  combat:execute(creature, var) end, time_between_hits * 1000)
  return true
end
 
Try this:

Code:
local function executeCombat(cid, var)
    local creature = Creature(cid)
    if creature then
        combat:execute(creature, var)
    end
end

local hitCount = 5
function onCastSpell(creature, var)
    combat:execute(creature, var)
    for i = 1, hitCount - 1 do
        addEvent(executeCombat, i * time_between_hits * 1000, creature:getId(), var)
    end
    return true
end
 
Sorry for double post.

Try this..

Code:
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYHIT)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY)

local condition = createConditionObject(CONDITION_ENERGY)
setConditionParam(condition, CONDITION_PARAM_DELAYED, 1)
-- addDamageCondition(condition, rounds, time, value)
addDamageCondition(condition, 5, 0, -100)
setCombatCondition(combat, condition)

function onCastSpell(cid, var)
    return doCombat(cid, combat, var)
end

It's not suppost to be done like this but I think it will work...
Will hit 5 times in a row -100 damage
 
Still unsolved! Anyone with some spare time to lend me a hand? I'd be thankfull!
Use addEvent function. Here's my example of a triple attack:

Code:
local combat1 = createCombatObject()
setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE)
setCombatParam(combat1, COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA)
setCombatParam(combat1, COMBAT_PARAM_DISTANCEEFFECT, 10)
setCombatFormula(combat1, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 5, 5, 1.4, 2.1)

local combat2 = createCombatObject()
setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)
setCombatParam(combat2, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYHIT)
setCombatParam(combat2, COMBAT_PARAM_DISTANCEEFFECT, 4)
setCombatFormula(combat2, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 5, 5, 1.4, 2.1)

local combat3 = createCombatObject()
setCombatParam(combat3, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE)
setCombatParam(combat3, COMBAT_PARAM_EFFECT, CONST_ME_ICEATTACK)
setCombatParam(combat3, COMBAT_PARAM_DISTANCEEFFECT, 28)
setCombatFormula(combat3, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 5, 5, 1.4, 2.1)



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

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

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

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

addEvent(onCastSpell1, 1, parameters) 
addEvent(onCastSpell2, 200, parameters) 
addEvent(onCastSpell3, 400, parameters) 
return true
end
 
Try this in your case:

Code:
local combat1 = createCombatObject()
setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat1, COMBAT_PARAM_EFFECT, CONST_ME_HITAREA)
setCombatParam(combat1, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_THROWINGSTAR)
setCombatParam(COMBAT_PARAM_BLOCKARMOR, 1)

local combat2 = createCombatObject()
setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat2, COMBAT_PARAM_EFFECT, CONST_ME_HITAREA)
setCombatParam(combat2, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_THROWINGSTAR)
setCombatParam(COMBAT_PARAM_BLOCKARMOR, 1)

function onGetFormulaValues(cid, level, skill, attack, factor)
  local skillTotal = 2 * skill
  local levelTotal = level / 5
  return -(((skillTotal + attack / 3500) * 0.35) + (levelTotal) + 0), -(((skillTotal + attack / 3125) * 0.5) + (levelTotal) + 5)
end

setCombatCallback(combat1, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")
setCombatCallback(combat2, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")



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

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


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

addEvent(onCastSpell1, 1, parameters) 
addEvent(onCastSpell2, 2000, parameters)  
return true
end
 
Try this in your case:

Code:
local combat1 = createCombatObject()
setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat1, COMBAT_PARAM_EFFECT, CONST_ME_HITAREA)
setCombatParam(combat1, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_THROWINGSTAR)
setCombatParam(COMBAT_PARAM_BLOCKARMOR, 1)

local combat2 = createCombatObject()
setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat2, COMBAT_PARAM_EFFECT, CONST_ME_HITAREA)
setCombatParam(combat2, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_THROWINGSTAR)
setCombatParam(COMBAT_PARAM_BLOCKARMOR, 1)

function onGetFormulaValues(cid, level, skill, attack, factor)
  local skillTotal = 2 * skill
  local levelTotal = level / 5
  return -(((skillTotal + attack / 3500) * 0.35) + (levelTotal) + 0), -(((skillTotal + attack / 3125) * 0.5) + (levelTotal) + 5)
end

setCombatCallback(combat1, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")
setCombatCallback(combat2, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")



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

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


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

addEvent(onCastSpell1, 1, parameters)
addEvent(onCastSpell2, 2000, parameters) 
return true
end
Use a table it is easier to execute or add more hits
Code:
local hits = 2
local combat = {}

for i = 1, hits do  
    combat[i] = createCombatObject()
    setCombatParam(combat[i], COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
    setCombatParam(combat[i], COMBAT_PARAM_EFFECT, CONST_ME_HITAREA)
    setCombatParam(combat[i], COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_THROWINGSTAR)
    setCombatParam(COMBAT_PARAM_BLOCKARMOR, 1)
end

function onGetFormulaValues(cid, level, skill, attack, factor)
  local skillTotal = 2 * skill
  local levelTotal = level / 5
  return -(((skillTotal + attack / 3500) * 0.35) + (levelTotal) + 0), -(((skillTotal + attack / 3125) * 0.5) + (levelTotal) + 5)
end

for x = 1, hits do
    setCombatCallback(combat[x], CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")
end

function onCastSpell(cid, var)
    for n = 1, hits do
        addEvent(doCombat, n * 1000, cid, combat[n], var)
    end      
    return true
end
 
Hello all! I have this spell, that hits twice. But i cant make it to hit more than twice! I've tried, adding more events, but it doesnt work. I know it might be super easy, but can't get it solved! Anyone that could lend me a hand please? Thanks for you time!

Code:
local combat = Combat()
local time_between_hits = 0.1 --seconds
combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HITAREA)
combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_THROWINGSTAR)
combat:setParameter(COMBAT_PARAM_BLOCKARMOR, 1)

function onGetFormulaValues(player, attack, factor)
  local skillTotal = 2 * player:getEffectiveSkillLevel(SKILL_SWORD)
  local levelTotal = player:getLevel() / 5
  return -(((skillTotal + attack / 3500) * 0.35) + (levelTotal) + 0), -(((skillTotal + attack / 3125) * 0.5) + (levelTotal) + 5)
end

combat:setCallback(CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")
function onCastSpell(creature, var)
   combat:execute(creature, var)
  addEvent(function()  combat:execute(creature, var) end, time_between_hits * 1000)
  return true
end
Try this:

Code:
local function executeCombat(cid, var)
    local creature = Creature(cid)
    if creature then
        combat:execute(creature, var)
    end
end

local hitCount = 5
function onCastSpell(creature, var)
    combat:execute(creature, var)
    for i = 1, hitCount - 1 do
        addEvent(executeCombat, i * time_between_hits * 1000, creature:getId(), var)
    end
    return true
end

Code:
local combat = {}
local hitCount = 5
local time_between_hits = 100 -- 0.1 seconds

for i = 1, hitCount do
    combat[i] = Combat()
    combat[i]:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
    combat[i]:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HITAREA)
    combat[i]:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_THROWINGSTAR)
    combat[i]:setParameter(COMBAT_PARAM_BLOCKARMOR, 1)
end

function onGetFormulaValues(player, attack, factor)
  local skillTotal = 2 * player:getEffectiveSkillLevel(SKILL_SWORD)
  local levelTotal = player:getLevel() / 5
  return -(((skillTotal + attack / 3500) * 0.35) + (levelTotal) + 0), -(((skillTotal + attack / 3125) * 0.5) + (levelTotal) + 5)
end

for n = 1, hitCount do
    combat[n]:setCallback(CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")
end

local function executeCombat(cid, combat, var)
    local creature = Creature(cid)
    if creature then
        combat:execute(creature, var)
    end
end


function onCastSpell(creature, var)
    for x = 1, hitCount do
        addEvent(executeCombat, x * time_between_hits, creature:getId(), combat[x], var)
    end
    return true
end
 
Use a table it is easier to execute or add more hits
Code:
local hits = 2
local combat = {}

for i = 1, hits do 
    combat[i] = createCombatObject()
    setCombatParam(combat[i], COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
    setCombatParam(combat[i], COMBAT_PARAM_EFFECT, CONST_ME_HITAREA)
    setCombatParam(combat[i], COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_THROWINGSTAR)
    setCombatParam(COMBAT_PARAM_BLOCKARMOR, 1)
end

function onGetFormulaValues(cid, level, skill, attack, factor)
  local skillTotal = 2 * skill
  local levelTotal = level / 5
  return -(((skillTotal + attack / 3500) * 0.35) + (levelTotal) + 0), -(((skillTotal + attack / 3125) * 0.5) + (levelTotal) + 5)
end

for x = 1, hits do
    setCombatCallback(combat[x], CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")
end

function onCastSpell(cid, var)
    for n = 1, hits do
        addEvent(doCombat, n * 1000, cid, combat[n], var)
    end     
    return true
end
Thank you, I will upgrade my code as well :)
 
Back
Top