• 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.2] 10.92+ New Potions.

Efren

Lua Scripter
Joined
Apr 18, 2010
Messages
81
Reaction score
4
Hello, the new TFS 1.2 does not have the new potions implemented by tibia in patch 10.92.
So I decided to implement one for the community. :)

Which potions? these potions:
latest
latest
latest

Here's how you do it.

add to actions.xml
Code:
<action itemid="26029" script="other/potions.lua" />
<action itemid="26030" script="other/potions.lua" />
<action itemid="26031" script="other/potions.lua" />

add to items.xml
Code:
    <item id="26029" article="a" name="ultimate mana potion">
        <attribute key="weight" value="310" />
        <attribute key="description" value="This potion can only be consumed by sorcerers and druids of level 130 or higher." />
    </item>
    <item id="26030" article="a" name="ultimate spirit potion">
        <attribute key="weight" value="310" />
        <attribute key="description" value="This potion can only be consumed by paladins of level 130 or higher." />
    </item>
    <item id="26031" article="a" name="supreme health potion">
        <attribute key="weight" value="310" />
        <attribute key="description" value="This potion can only be consumed by knights of level 200 or higher." />
    </item>

replace the scipt of potion.lua (located at: actions/scripts/other) with:
Code:
local supremeHealthPot = 26031
local ultimateSpiritPot = 26030
local ultimateManaPot = 26029
local ultimateHealthPot = 8473
local greatHealthPot = 7591
local greatManaPot = 7590
local greatSpiritPot = 8472
local strongHealthPot = 7588
local strongManaPot = 7589
local healthPot = 7618
local manaPot = 7620
local smallHealthPot = 8704
local antidotePot = 8474
local greatEmptyPot = 7635
local strongEmptyPot = 7634
local emptyPot = 7636

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) - 100))
-- 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)
    if target == nil or not target:isPlayer() then
        return true
    end

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

    local itemId = item:getId()
    if itemId == antidotePot then
        if not antidote:execute(target, numberToVariant(target:getId())) then
            return false
        end

        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
        item:remove(1)
        player:addItem(emptyPot, 1)
    elseif itemId == smallHealthPot then
        if not doTargetCombatHealth(0, target, COMBAT_HEALING, 60, 90, CONST_ME_MAGIC_BLUE) then
            return false
        end

        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
        item:remove(1)
        player:addItem(emptyPot, 1)
    elseif itemId == healthPot then
        if not doTargetCombatHealth(0, target, COMBAT_HEALING, 125, 175, CONST_ME_MAGIC_BLUE) then
            return false
        end

        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
        item:remove(1)
        player:addItem(emptyPot, 1)
    elseif itemId == manaPot then
        if not doTargetCombatMana(0, target, 75, 125, CONST_ME_MAGIC_BLUE) then
            return false
        end

        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
        item:remove(1)
        player:addItem(emptyPot, 1)
    elseif itemId == strongHealthPot then
        if (not isInArray({3, 4, 7, 8}, target:getVocation():getId()) or target:getLevel() < 50) and not getPlayerFlagValue(player, PlayerFlag_IgnoreSpellCheck) then
            player:say("This potion can only be consumed by paladins and knights of level 50 or higher.", TALKTYPE_MONSTER_SAY)
            return true
        end

        if not doTargetCombatHealth(0, target, COMBAT_HEALING, 250, 350, CONST_ME_MAGIC_BLUE) then
            return false
        end

        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
        item:remove(1)
        player:addItem(strongEmptyPot, 1)
    elseif itemId == strongManaPot then
        if (not isInArray({1, 2, 3, 5, 6, 7}, target:getVocation():getId()) or target:getLevel() < 50) and not getPlayerFlagValue(player, PlayerFlag_IgnoreSpellCheck) then
            player:say("This potion can only be consumed by sorcerers, druids and paladins of level 50 or higher.", TALKTYPE_MONSTER_SAY)
            return true
        end

        if not doTargetCombatMana(0, target, 115, 185, CONST_ME_MAGIC_BLUE) then
            return false
        end

        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
        item:remove(1)
        player:addItem(strongEmptyPot, 1)
    elseif itemId == greatSpiritPot then
        if (not isInArray({3, 7}, target:getVocation():getId()) or target:getLevel() < 80) and not getPlayerFlagValue(player, PlayerFlag_IgnoreSpellCheck) then
            player:say("This potion can only be consumed by paladins of level 80 or higher.", TALKTYPE_MONSTER_SAY)
            return true
        end

        if not doTargetCombatHealth(0, target, COMBAT_HEALING, 250, 350, CONST_ME_MAGIC_BLUE) or not doTargetCombatMana(0, target, 100, 200, CONST_ME_MAGIC_BLUE) then
            return false
        end

        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
        item:remove(1)
        player:addItem(greatEmptyPot, 1)
    elseif itemId == greatHealthPot then
        if (not isInArray({4, 8}, target:getVocation():getId()) or target:getLevel() < 80) and not getPlayerFlagValue(player, PlayerFlag_IgnoreSpellCheck) then
            player:say("This potion can only be consumed by knights of level 80 or higher.", TALKTYPE_MONSTER_SAY)
            return true
        end

        if not doTargetCombatHealth(0, target, COMBAT_HEALING, 425, 575, CONST_ME_MAGIC_BLUE) then
            return false
        end

        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
        item:remove(1)
        player:addItem(greatEmptyPot, 1)
    elseif itemId == greatManaPot then
        if (not isInArray({1,2,5,6}, target:getVocation():getId()) or target:getLevel() < 80) and not getPlayerFlagValue(player, PlayerFlag_IgnoreSpellCheck) then
            player:say("This potion can only be consumed by sorcerers and druids of level 80 or higher.", TALKTYPE_MONSTER_SAY)
            return true
        end

        if not doTargetCombatMana(0, target, 150, 250, CONST_ME_MAGIC_BLUE) then
            return false
        end
        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
        item:remove(1)
        player:addItem(greatEmptyPot, 1)
    elseif itemId == ultimateHealthPot then
        if (not isInArray({4, 8}, target:getVocation():getId()) or target:getLevel() < 130) and not getPlayerFlagValue(player, PlayerFlag_IgnoreSpellCheck) then
            player:say("This potion can only be consumed by knights of level 130 or higher.", TALKTYPE_MONSTER_SAY)
            return true
        end

        if not doTargetCombatHealth(0, target, COMBAT_HEALING, 650, 850, CONST_ME_MAGIC_BLUE) then
            return false
        end

        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
        item:remove(1)
        player:addItem(greatEmptyPot, 1)
    elseif itemId == ultimateManaPot then
        if (not isInArray({1,2,5,6}, target:getVocation():getId()) or target:getLevel() < 130) and not getPlayerFlagValue(player, PlayerFlag_IgnoreSpellCheck) then
            player:say("This potion can only be consumed by sorcerers and druids of level 130 or higher.", TALKTYPE_MONSTER_SAY)
            return true
        end

        if not doTargetCombatMana(0, target, 425, 575, CONST_ME_MAGIC_BLUE) then
            return false
        end
        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
        item:remove(1)
        player:addItem(greatEmptyPot, 1)
    elseif itemId == ultimateSpiritPot then
        if (not isInArray({3, 7}, target:getVocation():getId()) or target:getLevel() < 130) and not getPlayerFlagValue(player, PlayerFlag_IgnoreSpellCheck) then
            player:say("This potion can only be consumed by paladins of level 130 or higher.", TALKTYPE_MONSTER_SAY)
            return true
        end

        if not doTargetCombatHealth(0, target, COMBAT_HEALING, 420, 580, CONST_ME_MAGIC_BLUE) or not doTargetCombatMana(0, target, 150, 250, CONST_ME_MAGIC_BLUE) then
            return false
        end
        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
        item:remove(1)
        player:addItem(greatEmptyPot, 1)
    elseif itemId == supremeHealthPot then
        if (not isInArray({4, 8}, target:getVocation():getId()) or target:getLevel() < 200) and not getPlayerFlagValue(player, PlayerFlag_IgnoreSpellCheck) then
            player:say("This potion can only be consumed by knights of level 200 or higher.", TALKTYPE_MONSTER_SAY)
            return true
        end

        if not doTargetCombatHealth(0, target, COMBAT_HEALING, 875, 1125, CONST_ME_MAGIC_BLUE) then
            return false
        end

        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
        item:remove(1)
        player:addItem(greatEmptyPot, 1)
    end
    return true
end

Enjoy!
Rep if you like lmao. ;)
 
Last edited:
tables are a beautiful thing
Code:
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) - 100))

local t = {
    -- Supreme health potion
    [26031] = {empty = 7635, vocArray = {4, 8}, level = 200, str = "knights", func = function(p) return doTargetCombatHealth(0, p, COMBAT_HEALING, 875, 1125, CONST_ME_MAGIC_BLUE) end},
    -- Ultimate spirit potion
    [26030] = {empty = 7635, vocArray = {3, 7}, level = 130, str = "paladins", func = function(p) return doTargetCombatHealth(0, p, COMBAT_HEALING, 420, 680, CONST_ME_MAGIC_BLUE), doTargetCombatMana(0, p, 150, 250, CONST_ME_MAGIC_BLUE) end},
    -- Ultimate health potion
    [8473]  = {empty = 7635, vocArray = {4, 8}, level = 130, str = "knights", func = function(p) return doTargetCombatHealth(0, p, COMBAT_HEALING, 650, 860, CONST_ME_MAGIC_BLUE) end},
    -- Great health potion
    [7591]  = {empty = 7635, vocArray = {3, 4, 7, 8}, level = 80, str = "knights", func = function(p) return doTargetCombatHealth(0, p, COMBAT_HEALING, 425, 575, CONST_ME_MAGIC_BLUE) end},
    -- Great spirit potion
    [8472]  = {empty = 7635, vocArray = {3, 7}, level = 80, str = "paladins", func = function(p) return doTargetCombatHealth(0, p, COMBAT_HEALING, 250, 350, CONST_ME_MAGIC_BLUE), doTargetCombatMana(0, p, 100, 200, CONST_ME_MAGIC_BLUE) end},
    -- Strong health potion
    [7588]  = {empty = 7634, vocArray = {3, 4, 7, 8}, level = 80, str = "paladins and knights", func = function(p) return doTargetCombatHealth(0, p, COMBAT_HEALING, 250, 350, CONST_ME_MAGIC_BLUE) end},
    -- Ultimate mana potion
    [26029] = {empty = 7635, vocArray = {1, 2, 5, 6}, level = 130, str = "sorcerers and druids", func = function(p) return doTargetCombatMana(0, p, 425, 575, CONST_ME_MAGIC_BLUE) end},
    -- Great mana potion
    [7590]  = {empty = 7635, vocArray = {1, 2, 5, 6}, level = 80, str = "sorcerers and druids", func = function(p) return doTargetCombatMana(0, p, 150, 250, CONST_ME_MAGIC_BLUE) end},
    -- Strong mana potion
    [7589]  = {empty = 7634, vocArray = {1, 2, 3, 5, 6, 7}, level = 50, str = "sorcerers and druids", func = function(p) return doTargetCombatMana(0, p, 115, 185, CONST_ME_MAGIC_BLUE) end},
    -- Mana potion
    [7620]  = {empty = 7636, func = function(p) return doTargetCombatMana(0, p, 75, 125, CONST_ME_MAGIC_BLUE) end},
    -- Health potion
    [7618]  = {empty = 7636, func = function(p) return doTargetCombatHealth(0, p, COMBAT_HEALING, 125, 175, CONST_ME_MAGIC_BLUE) end},
    -- Small health potion
    [8704]  = {empty = 7636, func = function(p) return doTargetCombatHealth(0, p, COMBAT_HEALING, 60, 90, CONST_ME_MAGIC_BLUE) end},
    -- Antidote potion
    [8474]  = {empty = 7636, func = function(p) return antidote:execute(p, numberToVariant(p:getId())) end}
}

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
    if not target:getPlayer() then
        return true
    end
    if player:getCondition(CONDITION_EXHAUST_HEAL) then
        player:sendTextMessage(MESSAGE_STATUS_SMALL, Game.getReturnMessage(RETURNVALUE_YOUAREEXHAUSTED))
        return true
    end

    local tmp = t[item.itemid]
    if tmp then
        local level = tmp.level or 0
        if tmp.vocArray and (not isInArray(tmp.vocArray, target:getVocation():getId()) or target:getLevel() < level) and not getPlayerFlagValue(player, PlayerFlag_IgnoreSpellCheck) then
            player:say(string.format("This potion can only be consumed by %s of level %d or higher.", tmp.str, level), TALKTYPE_MONSTER_SAY)
            return true
        end
        if not tmp.func(target) then
            return false
        end
        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
        item:remove(1)
        player:addItem(tmp.empty, 1)
    end
    return true
end
you can of course make a table index for the healing numbers but i preferred not to since it would have looked weird with spirit potions (using doTargetCombatHealth & doTargetCombatMana) so i figured i would use functions instead
 
Last edited:
@Xeraphus
Yea I'm pretty much aware of it, I just edited their outdated script as alike as posible.

@RazorBlade
:eek: LMAO, shit did not notice!
 
Back
Top