• 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+ Problem with function addHealth in Potions.lua

damian00912

Member
Joined
Sep 11, 2009
Messages
90
Reaction score
6
Hi! I need help with this script, idk why but sometime is problem with script. Someone have soluttion for this, please?

Lua:
[2021-23-06 18:49:14.480] [error] Lua script error: /home/abcd/data/scripts/actions/other/potions.lua:callback 
[2021-23-06 18:49:14.480] [error] /home/abcd/data/scripts/actions/other/potions.lua:251: attempt to call method 'addHealth' (a nil value)
stack traceback:
    [C]: in function 'addHealth'
    /home/abcd/data/scripts/actions/other/potions.lua:251: in function </home/abcd/data/scripts/actions/other/potions.lua:224>



This script looks like that, it,s OTBR Engine 12.64 tfs 1.3

Lua:
local berserk = Condition(CONDITION_ATTRIBUTES)
berserk:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000)
berserk:setParameter(CONDITION_PARAM_SKILL_MELEE, 5)
berserk:setParameter(CONDITION_PARAM_SKILL_SHIELD, -10)
berserk:setParameter(CONDITION_PARAM_BUFF_SPELL, true)

local mastermind = Condition(CONDITION_ATTRIBUTES)
mastermind:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000)
mastermind:setParameter(CONDITION_PARAM_STAT_MAGICPOINTS, 3)
mastermind:setParameter(CONDITION_PARAM_BUFF_SPELL, true)

local bullseye = Condition(CONDITION_ATTRIBUTES)
bullseye:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000)
bullseye:setParameter(CONDITION_PARAM_SKILL_DISTANCE, 5)
bullseye:setParameter(CONDITION_PARAM_SKILL_SHIELD, -10)
bullseye:setParameter(CONDITION_PARAM_BUFF_SPELL, true)

local antidote = Combat()
antidote:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING)
antidote:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)
antidote:setParameter(COMBAT_PARAM_DISPEL, CONDITION_POISON)
antidote:setParameter(COMBAT_PARAM_AGGRESSIVE, false)
antidote:setParameter(COMBAT_PARAM_TARGETCASTERORTOPMOST, true)

local exhaust = Condition(CONDITION_EXHAUST_HEAL)
exhaust:setParameter(CONDITION_PARAM_TICKS, (configManager.getNumber(configKeys.EX_ACTIONS_DELAY_INTERVAL) - 1000))
-- 1000 - 100 due to exact condition timing. -100 doesn't hurt us, and players don't have reminding ~50ms exhaustion.

local function magicshield(player)
local condition = Condition(CONDITION_MANASHIELD)
condition:setParameter(CONDITION_PARAM_TICKS, 60000)
condition:setParameter(CONDITION_PARAM_MANASHIELD, math.min(player:getMaxMana(), 300 + 7.6 * player:getLevel() + 7 * player:getMagicLevel()))
player:addCondition(condition)
end

local potions = {
    [6558] = {
        transform = {
            id = {7588, 7589}
        },
        effect = CONST_ME_DRAWBLOOD
    },
    [7439] = {
        vocations = {
            VOCATION.CLIENT_ID.KNIGHT
        },
        condition = berserk,
        effect = CONST_ME_MAGIC_RED,
        description = "Only knights may drink this potion.",
        text = "You feel stronger."
    },
    [7440] = {
        vocations = {
            VOCATION.CLIENT_ID.SORCERER,
            VOCATION.CLIENT_ID.DRUID
        },
        condition = mastermind,
        effect = CONST_ME_MAGIC_BLUE,
        description = "Only sorcerers and druids may drink this potion.",
        text = "You feel smarter."
    },
    [7443] = {
        vocations = {
            VOCATION.CLIENT_ID.PALADIN
        },
        condition = bullseye,
        effect = CONST_ME_MAGIC_GREEN,
        description = "Only paladins may drink this potion.",
        text = "You feel more accurate."
    },
    [40398] = {
        vocations = {
            VOCATION.CLIENT_ID.SORCERER,
            VOCATION.CLIENT_ID.DRUID
        },
        level = 14,
        func = magicshield,
        effect = CONST_ME_ENERGYAREA,
        description = "Only sorcerers and druids of level 14 or above may drink this potion.",
    },
    [7588] = {
        health = {
            250,
            350
        },
        vocations = {
            VOCATION.CLIENT_ID.PALADIN,
            VOCATION.CLIENT_ID.KNIGHT
        },
        level = 50,
        flask = 7634,
        description = "Only knights and paladins of level 50 or above may drink this fluid."
    },
    [7589] = {
        mana = {
            170,
            265
        },
        level = 50,
        flask = 7634,
        description = "Only players of level 50 or above may drink this fluid."
    },
    [7590] = {
        mana = {
            230,
            390
        },
        vocations = {
            VOCATION.CLIENT_ID.SORCERER,
            VOCATION.CLIENT_ID.DRUID,
            VOCATION.CLIENT_ID.PALADIN
        },
        level = 80,
        flask = 7635,
        description = "Only sorcerers, druids and paladins of level 80 or above may drink this fluid."
    },
    [7591] = {
        health = {
            525,
            675
        },
        vocations = {
            VOCATION.CLIENT_ID.KNIGHT
        },
        level = 80,
        flask = 7635,
        description = "Only knights of level 80 or above may drink this fluid."
    },
    [7618] = {
        health = {
            125,
            175
        },
        flask = 7636
    },
    [7620] = {
        mana = {
            110,
            190
        },
        flask = 7636
    },
    [8472] = {
        health = {
            250,
            350
        },
        mana = {
            100,
            200
        },
        vocations = {
            VOCATION.CLIENT_ID.PALADIN
        },
        level = 80,
        flask = 7635,
        description = "Only paladins of level 80 or above may drink this fluid."
    },
    [8473] = {
        health = {750, 980},
        vocations = {
            VOCATION.CLIENT_ID.KNIGHT
        },
        level = 130,
        flask = 7635,
        description = "Only knights of level 130 or above may drink this fluid."
    },
    [8474] = {
        combat = antidote,
        flask = 7636
    },
    [8704] = {
        health = {
            60,
            90
        },
        flask = 7636
    },
    [26029] = {
        mana = {
            640,
            840
        },
        vocations = {
            VOCATION.CLIENT_ID.SORCERER,
            VOCATION.CLIENT_ID.DRUID
        },
        level = 130,
        flask = 7635,
        description = "Only druids and sorcerers of level 130 or above may drink this fluid."
    },
    [26030] = {
        health = {
            420,
            580
        },
        mana = {
            250,
            350
        },
        vocations = {
            VOCATION.CLIENT_ID.PALADIN
        },
        level = 130,
        flask = 7635,
        description = "Only paladins of level 130 or above may drink this fluid."
    },
    [26031] = {
        health = {
            1025,
            1380
        },
        vocations = {
            VOCATION.CLIENT_ID.KNIGHT
        },
        level = 200,
        flask = 7635,
        description = "Only knights of level 200 or above may drink this fluid."
    }
}

local flaskPotion = Action()

function flaskPotion.onUse(player, item, fromPosition, target, toPosition, isHotkey)
    if type(target) == "userdata" and not target:isPlayer() then
        return false
    end

    -- Delay potion
    if not playerDelayPotion[player:getId()] then
        playerDelayPotion[player:getId()] = 0
    end
    if playerDelayPotion[player:getId()] > os.mtime() then
        player:sendTextMessage(MESSAGE_FAILURE, Game.getReturnMessage(RETURNVALUE_YOUAREEXHAUSTED))
        return true
    end

    local potion = potions[item:getId()]
    if potion.level and player:getLevel() < potion.level or potion.vocations and not table.contains(potion.vocations, player:getVocation():getClientId()) and not (player:getGroup():getId() >= 2) then
        player:say(potion.description, MESSAGE_POTION)
        return true
    end

    if player:getCondition(CONDITION_EXHAUST_HEAL) then
        player:sendTextMessage(MESSAGE_FAILURE, Game.getReturnMessage(RETURNVALUE_YOUAREEXHAUSTED))
        return true
    end

    if potion.health or potion.mana or potion.combat then
        if potion.health then
            target:addHealth(math.random(potion.health[1], potion.health[2]))
            
        end

        if potion.mana then
            target:addMana(math.random(potion.mana[1], potion.mana[2]))
        end

        if potion.combat then
            potion.combat:execute(target, Variant(target:getId()))
        end

        player:addAchievementProgress('Potion Addict', 100000)
        target:say("Aaaah...", MESSAGE_POTION)
        player:addCondition(exhaust)
        player:setStorageValue(38412, player:getStorageValue(38412)+1)
    end

    -- Delay potion
    playerDelayPotion[player:getId()] = os.mtime() + 500
    
    if potion.func then
        potion.func(player)
        if potion.text then
            player:say(potion.text, MESSAGE_POTION)
        end
        player:getPosition():sendMagicEffect(potion.effect)
    end

    if potion.condition then
        player:addCondition(potion.condition)
        player:say(potion.text, MESSAGE_POTION)
        player:getPosition():sendMagicEffect(potion.effect)
    end

    if potion.transform then
        if item:getCount() >= 1 then
            item:remove(1)
            player:addItem(potion.transform.id[math.random(#potion.transform.id)], 1)
            item:getPosition():sendMagicEffect(potion.effect)
            return true
        end
    end

    if not configManager.getBoolean(configKeys.REMOVE_POTION_CHARGES) then
        return true
    end

    player:updateSupplyTracker(item)
    item:remove(1)
    return true
end

for index, value in pairs(potions) do
    flaskPotion:id(index)
end

flaskPotion:register()


Thanks you for help :)
 
Try this one

Lua:
local config = {
    -- strong health potion
    [7588] = {health = {min = 250, max = 350}, vocations = {3, 4}, text = 'paladins and knights', level = 50, emptyId = 0},
    -- strong mana potion
    [7589] = {mana = {min = 250, max = 350}, vocations = {1, 2, 3}, text = 'sorcerers, druids and paladins', level = 50, emptyId = 0},
    -- great mana potion
    [7590] = {mana = {min = 400, max = 620}, vocations = {1, 2}, text = 'sorcerers and druids', level = 80, emptyId = 0},
    -- great health potion
    [7591] = {health = {min = 425, max = 575}, vocations = {4}, text = 'knights', level = 80, emptyId = 0},
    -- health potion
    [7618] = {health = {min = 125, max = 175}, emptyId = 0},
    -- mana potion
    [7620] = {mana = {min = 75, max = 125}, emptyId = 0},
    -- great spirit potion
    [8472] = {health = {min = 250, max = 350}, mana = {min = 100, max = 200}, vocations = {3}, text = 'paladins', level = 80, emptyId = 0},
    -- ultimate health potion
    [8473] = {health = {min = 450, max = 600}, vocations = {4}, text = 'knights', level = 130, emptyId = 0},
   
    -- POT NOVOS
   
    -- ultimate mana potion 26029
    [26029] = {mana = {min = 310, max = 320}, vocations = {1, 2}, text = 'sorcerers and druids', level = 130, emptyId = 7635},
   
    -- Supreme Health Potion 26031
    [26031] = {health = {min = 650, max = 780}, vocations = {4}, text = 'knights', level = 200, emptyId = 7635},
   
    -- Ultimate Spirit Potion 26030
    [26030] = {health = {min = 400, max = 430}, mana = {min = 140, max = 250}, vocations = {3}, text = 'paladins', level = 130, emptyId = 7635},
   
   
    -- antidote potion
    [8474] = {antidote = true, emptyId = 7636},
    -- small health potion
    [8704] = {health = {min = 60, max = 85}, emptyId = 7636}
}

local berserk = Condition(CONDITION_ATTRIBUTES)
berserk:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000)
berserk:setParameter(CONDITION_PARAM_SKILL_MELEE, 5)
berserk:setParameter(CONDITION_PARAM_SKILL_SHIELD, -10)
berserk:setParameter(CONDITION_PARAM_BUFF_SPELL, true)

local mastermind = Condition(CONDITION_ATTRIBUTES)
mastermind:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000)
mastermind:setParameter(CONDITION_PARAM_STAT_MAGICPOINTS, 3)
mastermind:setParameter(CONDITION_PARAM_BUFF_SPELL, true)

local bullseye = Condition(CONDITION_ATTRIBUTES)
bullseye:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000)
bullseye:setParameter(CONDITION_PARAM_SKILL_DISTANCE, 5)
bullseye:setParameter(CONDITION_PARAM_SKILL_SHIELD, -10)
bullseye:setParameter(CONDITION_PARAM_BUFF_SPELL, true)

local antidote = Combat()
antidote:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING)
antidote:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)
antidote:setParameter(COMBAT_PARAM_TARGETCASTERORTOPMOST, true)
antidote:setParameter(COMBAT_PARAM_AGGRESSIVE, false)
antidote:setParameter(COMBAT_PARAM_DISPEL, CONDITION_POISON)

local exhaust = Condition(CONDITION_EXHAUST_HEAL)
exhaust:setParameter(CONDITION_PARAM_TICKS, (configManager.getNumber(configKeys.EX_ACTIONS_DELAY_INTERVAL) - 1000))
-- 1000 - 100 due to exact condition timing. -100 doesn't hurt us, and players don't have reminding ~50ms exhaustion.

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
    local potion = config[item.itemid]
    if not potion then
        return true
    end

    if target.itemid ~= 1 or target.type ~= THING_TYPE_PLAYER then
        return false
    end

    if player:getCondition(CONDITION_EXHAUST_HEAL) then
        player:sendTextMessage(MESSAGE_STATUS_SMALL, Game.getReturnMessage(RETURNVALUE_YOUAREEXHAUSTED))
        return true
    end

    if potion.antidote and not antidote:execute(target, Variant(target.uid)) then
        return false
    end

    if (potion.level and player:getLevel() < potion.level)
            or (type(potion.vocations) == 'table' and not isInArray(potion.vocations, player:getVocation():getBase():getId()))
            and not (player:getGroup():getId() >= 2) then
        player:say(string.format('This potion can only be consumed by %s of level %d or higher.', potion.text, potion.level), TALKTYPE_MONSTER_SAY)
        return true
    end

    if type(potion.health) == 'table' and not doTargetCombatHealth(0, target, COMBAT_HEALING, potion.health.min, potion.health.max, CONST_ME_MAGIC_BLUE) then
        return false
    end

    if type(potion.mana) == 'table' and not doTargetCombatMana(0, target, potion.mana.min, potion.mana.max, CONST_ME_MAGIC_BLUE) then
        return false
    end

    player:addAchievementProgress('Potion Addict', 100000)

    player:addCondition(exhaust)
    doCreatureSayWithRadius(target, 'Aaaah...', TALKTYPE_MONSTER_SAY, 2, 2)

    local topParent = item:getTopParent()
    if topParent.isItem and (not topParent:isItem() or topParent.itemid ~= 460) then
            local parent = item:getParent()
               if not parent:isTile() and (parent:addItem(potion.emptyId, 1) or topParent:addItem(potion.emptyId, 1)) then
             item:remove(1)
            return true
        end
    end

    Game.createItem(potion.emptyId, 1, item:getPosition())
    item:remove(1)
   
    return true
end
 
Back
Top