• 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!
  • 2026 staff recruitment is open! Check it out and consider applying!

Lua Random Area

mackerel

Well-Known Member
Joined
Apr 26, 2017
Messages
398
Solutions
18
Reaction score
74
My spell is just below, and if someone can modify the spell so it does not attack to the specified area every time that would be great.

I should probably give some examples because even I am slightly confused O:

Currently the following effect;
- Player casts spell
- Player shots 4 times, which is fine however every time the spell is executed, it is going to use the following 'myArray', in this case it will be; 9 hits for 1 spell execution (9 is a random number and can vary, dont worry about that)

jdUXlLB.png


I was hoping to create something like this instead:
- Player casts spell
- Players shots 4 times, but this time; only 1 hit for 1 spell execution (the spell is being executed 4 times)

oSoC9fL.png


LUA:
local areaCombat, combat = createCombatObject(), createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, 7)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, 5)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -0.2, 1, -0.3, 1)

local myArray = {
{1, 1, 1},
{1, 3, 1},
{1, 1, 1}
}

local area = createCombatArea(myArray)
setCombatArea(areaCombat, area)

function onTargetTile(cid, pos)
    return math.random(2) == 1 and doCombat(cid, combat, positionToVariant(pos))
end

setCombatCallback(areaCombat, CALLBACK_PARAM_TARGETTILE, "onTargetTile")

function onCastSpell(cid, var)
    addEvent(doCombat, 100, cid, areaCombat, var)
    addEvent(doCombat, 200, cid, areaCombat, var)
    addEvent(doCombat, 300, cid, areaCombat, var)
    return doCombat(cid, areaCombat, var)
end

TFS 1.0 guys, I would appreciate help!
 
Solution
Wrong :D
LUA:
local areaCombat, combat = createCombatObject(), createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, 7)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, 5)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -0.2, 1, -0.3, 1)
local myArray = {{3}}
local area = createCombatArea(myArray)
setCombatArea(areaCombat, area)
function onTargetTile(cid, pos)
    local posx, posy = math.random(-1,1), math.random(-1,1)
    return doCombat(cid, combat, positionToVariant({x = pos.x + posx, y = pos.y + posy, z = pos.z}))
end
setCombatCallback(areaCombat, CALLBACK_PARAM_TARGETTILE, "onTargetTile")
function onCastSpell(cid, var)
    addEvent(doCombat, 100, cid...
What about this :D(?):
LUA:
local areaCombat, combat = createCombatObject(), createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, 7)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, 5)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -0.2, 1, -0.3, 1)
local myArray = {
{1, 1, 1},
{1, 3, 1},
{1, 1, 1}
}
local area = createCombatArea(myArray)
setCombatArea(areaCombat, area)
function onTargetTile(cid, pos)
    return math.random(2) == 1 and doCombat(cid, combat, positionToVariant(pos)) and true
end
setCombatCallback(areaCombat, CALLBACK_PARAM_TARGETTILE, "onTargetTile")
function onCastSpell(cid, var)
    addEvent(doCombat, 100, cid, areaCombat, var)
    addEvent(doCombat, 200, cid, areaCombat, var)
    addEvent(doCombat, 300, cid, areaCombat, var)
    return doCombat(cid, areaCombat, var)
end
 
What about this :D(?):
LUA:
local areaCombat, combat = createCombatObject(), createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, 7)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, 5)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -0.2, 1, -0.3, 1)
local myArray = {
{1, 1, 1},
{1, 3, 1},
{1, 1, 1}
}
local area = createCombatArea(myArray)
setCombatArea(areaCombat, area)
function onTargetTile(cid, pos)
    return math.random(2) == 1 and doCombat(cid, combat, positionToVariant(pos)) and true
end
setCombatCallback(areaCombat, CALLBACK_PARAM_TARGETTILE, "onTargetTile")
function onCastSpell(cid, var)
    addEvent(doCombat, 100, cid, areaCombat, var)
    addEvent(doCombat, 200, cid, areaCombat, var)
    addEvent(doCombat, 300, cid, areaCombat, var)
    return doCombat(cid, areaCombat, var)
end

I see where you going with 'true', but unfortunately it does not work
 
LUA:
local areaCombat, combat = createCombatObject(), createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, 7)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, 5)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -0.2, 1, -0.3, 1)
local myArray = {{3}}
local posx, posy = math.random(-1,1), math.random(-1,1)
local area = createCombatArea(myArray)
setCombatArea(areaCombat, area)
function onTargetTile(cid, pos)
    return doCombat(cid, combat, positionToVariant({x = pos.x + posx, y = pos.y + posy, z = pos.z}))
end
setCombatCallback(areaCombat, CALLBACK_PARAM_TARGETTILE, "onTargetTile")
function onCastSpell(cid, var)
    addEvent(doCombat, 100, cid, areaCombat, var)
    addEvent(doCombat, 200, cid, areaCombat, var)
    addEvent(doCombat, 300, cid, areaCombat, var)
    return doCombat(cid, areaCombat, var)
end
 
LUA:
local areaCombat, combat = createCombatObject(), createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, 7)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, 5)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -0.2, 1, -0.3, 1)
local myArray = {{3}}
local posx, posy = math.random(-1,1), math.random(-1,1)
local area = createCombatArea(myArray)
setCombatArea(areaCombat, area)
function onTargetTile(cid, pos)
    return doCombat(cid, combat, positionToVariant({x = pos.x + posx, y = pos.y + posy, z = pos.z}))
end
setCombatCallback(areaCombat, CALLBACK_PARAM_TARGETTILE, "onTargetTile")
function onCastSpell(cid, var)
    addEvent(doCombat, 100, cid, areaCombat, var)
    addEvent(doCombat, 200, cid, areaCombat, var)
    addEvent(doCombat, 300, cid, areaCombat, var)
    return doCombat(cid, areaCombat, var)
end

Nice, but array will stay the same once loaded. I was trying to add for loop but I've noticed the array is not changing >.<, i.e. we cannot do something like this: myArray[3][1] = 0 - Well, in theory we can, and the array will change when we print the result in console, but the effect will stay on the same position as when loaded.

Which ultimately means; once the spell is loaded and math.random defined, it will hit the same spot over and over again (in your case);

that's why there's: return math.random(2) == 1 and ...

Thank you for your time though, I hope someone can help me with this unless you have better idea
 
So mby move the local posx posy to the function onTargetTile(cid, pos)?

LUA:
local areaCombat, combat = createCombatObject(), createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, 7)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, 5)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -0.2, 1, -0.3, 1)
local myArray = {{3}}

local area = createCombatArea(myArray)
setCombatArea(areaCombat, area)
function onTargetTile(cid, pos)
    return doCombat(cid, combat, positionToVariant({posx = math.random(-1,1), posy =  math.random(-1,1)}))
end
setCombatCallback(areaCombat, CALLBACK_PARAM_TARGETTILE, "onTargetTile")
function onCastSpell(cid, var)
    addEvent(doCombat, 100, cid, areaCombat, var)
    addEvent(doCombat, 200, cid, areaCombat, var)
    addEvent(doCombat, 300, cid, areaCombat, var)
    return doCombat(cid, areaCombat, var)
end

No errors and does not work at all :confused:
 
Wrong :D
LUA:
local areaCombat, combat = createCombatObject(), createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, 7)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, 5)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -0.2, 1, -0.3, 1)
local myArray = {{3}}
local area = createCombatArea(myArray)
setCombatArea(areaCombat, area)
function onTargetTile(cid, pos)
    local posx, posy = math.random(-1,1), math.random(-1,1)
    return doCombat(cid, combat, positionToVariant({x = pos.x + posx, y = pos.y + posy, z = pos.z}))
end
setCombatCallback(areaCombat, CALLBACK_PARAM_TARGETTILE, "onTargetTile")
function onCastSpell(cid, var)
    addEvent(doCombat, 100, cid, areaCombat, var)
    addEvent(doCombat, 200, cid, areaCombat, var)
    addEvent(doCombat, 300, cid, areaCombat, var)
    return doCombat(cid, areaCombat, var)
end
 
Solution
Wrong :D
LUA:
local areaCombat, combat = createCombatObject(), createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, 7)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, 5)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -0.2, 1, -0.3, 1)
local myArray = {{3}}
local area = createCombatArea(myArray)
setCombatArea(areaCombat, area)
function onTargetTile(cid, pos)
    local posx, posy = math.random(-1,1), math.random(-1,1)
    return doCombat(cid, combat, positionToVariant({x = pos.x + posx, y = pos.y + posy, z = pos.z}))
end
setCombatCallback(areaCombat, CALLBACK_PARAM_TARGETTILE, "onTargetTile")
function onCastSpell(cid, var)
    addEvent(doCombat, 100, cid, areaCombat, var)
    addEvent(doCombat, 200, cid, areaCombat, var)
    addEvent(doCombat, 300, cid, areaCombat, var)
    return doCombat(cid, areaCombat, var)
end

OMG THANKS!
 
Back
Top