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

TFS 1.X+ How to check for specific target?

mackerel

Well-Known Member
Joined
Apr 26, 2017
Messages
398
Solutions
18
Reaction score
72
Hi, I am using TFS 1.0 and here is the spell script I wrote

Lua:
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA)

local condition = createConditionObject(CONDITION_FIRE)
setConditionParam(condition, CONDITION_PARAM_DELAYED, 1)
addDamageCondition(condition, 5, 3000, -100)
setCombatCondition(combat, condition)

function onGetFormulaValues(cid, level, maglevel)
    min = -((level / 5) + (maglevel * 7.5) + 25)
    max = -((level / 5) + (maglevel * 13) + 50)
    return min, max
end
setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

function onCastSpell(cid, var)
    function repeatSpell()
    local target = Player(cid):getTarget()
    print(target);

        if not target then
            print("TARGET NOT FOUND");
            return true
        end
            doCombat(cid, combat, var)
            addEvent(repeatSpell, 1000)
    end
   
    repeatSpell()
    return doCombat(cid, combat, var)
end

The code will execute as long as the player is targetting someone, it does not matter who and it will generate new userdata for that particular target each time. The thing is, it will keep dealing damage to the same monster, even if you have switched the target to someone else (whilst actually maintaing your target, i.e. not unselecting)

I would like someone to help me with this as this is major issue that I could not fix it myself. I want it to deal damage to the other monster, when the player switches its targets
 
Solution
;)
Code:
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA)

local condition = createConditionObject(CONDITION_FIRE)
setConditionParam(condition, CONDITION_PARAM_DELAYED, 1)
addDamageCondition(condition, 5, 3000, -100)
setCombatCondition(combat, condition)

function onGetFormulaValues(cid, level, maglevel)
    min = -((level / 5) + (maglevel * 7.5) + 25)
    max = -((level / 5) + (maglevel * 13) + 50)
    return min, max
end
setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

function repeatSpell(c)
  
    local player = Player(c.id)
if player then
    local target = player:getTarget()
    if not...
Here
Code:
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA)

local condition = createConditionObject(CONDITION_FIRE)
setConditionParam(condition, CONDITION_PARAM_DELAYED, 1)
addDamageCondition(condition, 5, 3000, -100)
setCombatCondition(combat, condition)

function onGetFormulaValues(cid, level, maglevel)
    min = -((level / 5) + (maglevel * 7.5) + 25)
    max = -((level / 5) + (maglevel * 13) + 50)
    return min, max
end
setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

function repeatSpell(c)
   
    local player = Player(c.id)
    local target = player and player:getTarget() or nil
    local oldTarget = c.oid
    if not target then
        return false
    end
    if target:getId() ~= c.oid then
        return false
    end
    doCombat(c.id, c.combat, c.var)
    c.oid = target:getId()
    addEvent(repeatSpell, 1000, c)

    return true
end

-- ;D Luck
function onCastSpell(cid, var)
    local player = Player(cid)
    local target = player and player:getTarget() or nil
    local c = { id = cid, oid = target and target:getId() or 0 }
    c.combat = combat
    c.var = var
    if not target then
        return false
    end
    repeatSpell(c)
    return doCombat(cid, combat, var)
end
 
Here
Code:
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA)

local condition = createConditionObject(CONDITION_FIRE)
setConditionParam(condition, CONDITION_PARAM_DELAYED, 1)
addDamageCondition(condition, 5, 3000, -100)
setCombatCondition(combat, condition)

function onGetFormulaValues(cid, level, maglevel)
    min = -((level / 5) + (maglevel * 7.5) + 25)
    max = -((level / 5) + (maglevel * 13) + 50)
    return min, max
end
setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

function repeatSpell(c)
  
    local player = Player(c.id)
    local target = player and player:getTarget() or nil
    local oldTarget = c.oid
    if not target then
        return false
    end
    if target:getId() ~= c.oid then
        return false
    end
    doCombat(c.id, c.combat, c.var)
    c.oid = target:getId()
    addEvent(repeatSpell, 1000, c)

    return true
end

-- ;D Luck
function onCastSpell(cid, var)
    local player = Player(cid)
    local target = player and player:getTarget() or nil
    local c = { id = cid, oid = target and target:getId() or 0 }
    c.combat = combat
    c.var = var
    if not target then
        return false
    end
    repeatSpell(c)
    return doCombat(cid, combat, var)
end

there is that variable I am confused about as I thought you can only store one value inside each variable, you did something like this

Lua:
local target = player and player:getTarget() or nil

but anyway thanks sarah it works, not necessarily changing the targets but at least stops attacking when its switched and thats the alternative I was willing to go for
 
;)
Code:
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA)

local condition = createConditionObject(CONDITION_FIRE)
setConditionParam(condition, CONDITION_PARAM_DELAYED, 1)
addDamageCondition(condition, 5, 3000, -100)
setCombatCondition(combat, condition)

function onGetFormulaValues(cid, level, maglevel)
    min = -((level / 5) + (maglevel * 7.5) + 25)
    max = -((level / 5) + (maglevel * 13) + 50)
    return min, max
end
setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

function repeatSpell(c)
  
    local player = Player(c.id)
if player then
    local target = player:getTarget()
    if not target then
        return false
    end
    c.var.number = target:getId()
    doCombat(c.id, c.combat, c.var)
    addEvent(repeatSpell, 1000, c)
end

    return true
end

function onCastSpell(cid, var)
    local player = Player(cid)
    local target = player:getTarget()
    local c = {}
    c.id = cid
    c.combat = combat
    c.var = var
    if not target then
        doPlayerSendCancel(cid, "You need target.")
        return false
    end
    repeatSpell(c)
    return true
end
 
Last edited:
Solution
Back
Top