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

Solved Item Infinite Potions

arti1194

New Member
Joined
Jun 6, 2009
Messages
96
Reaction score
3
Hi, I would like to make an item after which the potions does not finish for 3 hours.
I found old script in other datapack but not working in my ots.
When use this item time is ok but potions are not infinite. When logout and login i see this " Time remaining of infinite pots: 2 hours and 49 minutes." it is ok but potions are not infinite.


login.lua
Code:
    local storage = getPlayerStorageValue(cid, 17652)  
    local now_time = os.time()
  
    if storage < now_time then
        setPlayerStorageValue(cid, 17652, 0)
    end

    storage = getPlayerStorageValue(cid, 17652)
    if storage > 0 then
        local storages = storage - now_time
        local hours = math.floor(storages / 3600)
        local minutes = math.floor((storages % 3600) / 60)
          
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_DEFAULT, "Time remaining of infinite pots: " .. hours .." hours and " .. minutes .." minutes.")
    end

crest.lua
Code:
function onUse(cid, item)
    local storage = getPlayerStorageValue(cid, 17652)
    if(storage == 0) then
        setPlayerStorageValue(cid, 17652, os.time()+10800)
    elseif(storage < os.time()) then
        setPlayerStorageValue(cid, 17652, os.time()+10800)
    else
        setPlayerStorageValue(cid, 17652, storage+10800)
    end
    local storage_new = getPlayerStorageValue(cid, 17652)
    local storages = storage_new - os.time()
    local hours = math.floor(storages / 3600)
    local minutes = math.floor((storages % 3600) / 60)
      
    doPlayerSendTextMessage(cid, MESSAGE_STATUS_DEFAULT, "Time remaining of infinite pots and stronger healing Manrune - Health Rune: " .. hours .." hours and " .. minutes .." minutes.")
    doRemoveItem(item.uid)
end

potions.lua
Code:
local config = {
    removeOnUse = "yes",
    usableOnTarget = "yes", -- can be used on target? (fe. healing friend)
    splashable = "no",
    range = -1,
    realAnimation = "yes", -- make text effect visible only for players in range 1x1
    healthMultiplier = 1.0,
    manaMultiplier = 1.0
}

config.removeOnUse = getBooleanFromString(config.removeOnUse)
config.usableOnTarget = getBooleanFromString(config.usableOnTarget)
config.splashable = getBooleanFromString(config.splashable)
config.realAnimation = getBooleanFromString(config.realAnimation)

local POTIONS = {
    [8704] = {empty = 7636, splash = 42, health = {60, 85}}, -- small health potion
    [7618] = {empty = 7636, splash = 42, health = {125, 175}}, -- health potion
    [7588] = {empty = 7634, splash = 42, health = {250, 350}, level = 50, vocations = {3, 4, 7, 8}, vocStr = "knights and paladins"}, -- strong health potion
    [7591] = {empty = 7635, splash = 42, health = {425, 575}, level = 80, vocations = {4, 8}, vocStr = "knights"}, -- great health potion
    [8473] = {empty = 7635, splash = 42, health = {650, 850}, level = 130, vocations = {4, 8}, vocStr = "knights"}, -- ultimate health potion

    [7620] = {empty = 7636, splash = 47, mana = {75, 125}}, -- mana potion
    [7589] = {empty = 7634, splash = 47, mana = {115, 185}, level = 50, vocations = {1, 2, 3, 5, 6, 7}, vocStr = "sorcerers, druids and paladins"}, -- strong mana potion
    [7590] = {empty = 7635, splash = 47, mana = {250, 300}, level = 80, vocations = {1, 2, 5, 6}, vocStr = "sorcerers and druids"}, -- great mana potion

    [8472] = {empty = 7635, splash = 43, health = {250, 350}, mana = {100, 200}, level = 80, vocations = {3, 7}, vocStr = "paladins"} -- great spirit potion
}

local exhaust = createConditionObject(CONDITION_EXHAUST)
setConditionParam(exhaust, CONDITION_PARAM_TICKS, (getConfigInfo('timeBetweenExActions') - 100))

function onUse(cid, item, fromPosition, itemEx, toPosition)
    local potion = POTIONS[item.itemid]
    if(not potion) then
        return false
    end

    if(not isPlayer(itemEx.uid) or (not config.usableOnTarget and cid ~= itemEx.uid)) then
        if(not config.splashable) then
            return false
        end

        if(toPosition.x == CONTAINER_POSITION) then
            toPosition = getThingPos(item.uid)
        end

        doDecayItem(doCreateItem(2016, potion.splash, toPosition))
        doRemoveItem(item.uid, 1)

        doPlayerAddItem(cid, potion.empty, 1)
        return true
    end

    if(hasCondition(cid, CONDITION_EXHAUST)) then
        doPlayerSendDefaultCancel(cid, RETURNVALUE_YOUAREEXHAUSTED)
        return true
    end

    if(((potion.level and getPlayerLevel(cid) < potion.level) or (potion.vocations and not isInArray(potion.vocations, getPlayerVocation(cid)))) and
        not getPlayerCustomFlagValue(cid, PLAYERCUSTOMFLAG_GAMEMASTERPRIVILEGES))
    then
        doCreatureSay(itemEx.uid, "Only " .. potion.vocStr .. (potion.level and (" of level " .. potion.level) or "") .. " or above may drink this fluid.", TALKTYPE_ORANGE_1)
        return true
    end

    if(config.range > 0 and cid ~= itemEx.uid and getDistanceBetween(getCreaturePosition(cid), getCreaturePosition(itemEx.uid)) > config.range) then
        return false
    end

    local health = potion.health
    if(health and not doCreatureAddHealth(itemEx.uid, math.ceil(math.random(health[1], health[2]) * config.healthMultiplier))) then
        return false
    end

    local mana = potion.mana
    if(mana and not doPlayerAddMana(itemEx.uid, math.ceil(math.random(mana[1], mana[2]) * config.manaMultiplier))) then
        return false
    end

    doSendMagicEffect(getThingPos(itemEx.uid), CONST_ME_MAGIC_BLUE)
    if(not config.realAnimation) then
        doCreatureSay(itemEx.uid, "Aaaah...", TALKTYPE_ORANGE_1)
    else
        for i, tid in ipairs(getSpectators(getCreaturePosition(cid), 1, 1)) do
            if(isPlayer(tid)) then
                doCreatureSay(itemEx.uid, "Aaaah...", TALKTYPE_ORANGE_1, false, tid)
            end
        end
    end

    doAddCondition(cid, exhaust)
    doRemoveItem(item.uid, 1)
    if(not potion.empty or config.removeOnUse) then
        return true
    end

    doPlayerAddItem(cid, potion.empty, 1)
    return true
end
 
Last edited:
Solution
Lua:
local config = {
    removeOnUse = "yes",
    usableOnTarget = "yes", -- can be used on target? (fe. healing friend)
    splashable = "no",
    range = -1,
    realAnimation = "yes", -- make text effect visible only for players in range 1x1
    healthMultiplier = 1.0,
    manaMultiplier = 1.0
}

config.removeOnUse = getBooleanFromString(config.removeOnUse)
config.usableOnTarget = getBooleanFromString(config.usableOnTarget)
config.splashable = getBooleanFromString(config.splashable)
config.realAnimation = getBooleanFromString(config.realAnimation)

local POTIONS = {
    [8704] = {empty = 7636, splash = 42, health = {60, 85}}, -- small health potion
    [7618] = {empty = 7636, splash = 42, health = {125, 175}}, -- health potion
    [7588] =...
freaked1 this code is for remove crest item not potion

Not working
you don't want it to remove the potion when you use it?
in that case that's the solution, the one he gave you.
you didn't provide the potion script, it was safe to assume crest.lua was it, so why post it in the first place if that isn't the potion?
 
you don't want it to remove the potion when you use it?
in that case that's the solution, the one he gave you.
you didn't provide the potion script, it was safe to assume crest.lua was it, so why post it in the first place if that isn't the potion?

I want item "Crest" when i use this item then potions are infinite for 3 houres.
 
If I understand you correctly now, when you use any potion you should get an item called crest? Does this item have an itemid?
EDIT: Sorry, after reading again I now understand what you want :)
 
Last edited:
Lua:
local config = {
    removeOnUse = "yes",
    usableOnTarget = "yes", -- can be used on target? (fe. healing friend)
    splashable = "no",
    range = -1,
    realAnimation = "yes", -- make text effect visible only for players in range 1x1
    healthMultiplier = 1.0,
    manaMultiplier = 1.0
}

config.removeOnUse = getBooleanFromString(config.removeOnUse)
config.usableOnTarget = getBooleanFromString(config.usableOnTarget)
config.splashable = getBooleanFromString(config.splashable)
config.realAnimation = getBooleanFromString(config.realAnimation)

local POTIONS = {
    [8704] = {empty = 7636, splash = 42, health = {60, 85}}, -- small health potion
    [7618] = {empty = 7636, splash = 42, health = {125, 175}}, -- health potion
    [7588] = {empty = 7634, splash = 42, health = {250, 350}, level = 50, vocations = {3, 4, 7, 8}, vocStr = "knights and paladins"}, -- strong health potion
    [7591] = {empty = 7635, splash = 42, health = {425, 575}, level = 80, vocations = {4, 8}, vocStr = "knights"}, -- great health potion
    [8473] = {empty = 7635, splash = 42, health = {650, 850}, level = 130, vocations = {4, 8}, vocStr = "knights"}, -- ultimate health potion

    [7620] = {empty = 7636, splash = 47, mana = {75, 125}}, -- mana potion
    [7589] = {empty = 7634, splash = 47, mana = {115, 185}, level = 50, vocations = {1, 2, 3, 5, 6, 7}, vocStr = "sorcerers, druids and paladins"}, -- strong mana potion
    [7590] = {empty = 7635, splash = 47, mana = {250, 300}, level = 80, vocations = {1, 2, 5, 6}, vocStr = "sorcerers and druids"}, -- great mana potion

    [8472] = {empty = 7635, splash = 43, health = {250, 350}, mana = {100, 200}, level = 80, vocations = {3, 7}, vocStr = "paladins"} -- great spirit potion
}

local exhaust = createConditionObject(CONDITION_EXHAUST)
setConditionParam(exhaust, CONDITION_PARAM_TICKS, (getConfigInfo('timeBetweenExActions') - 100))

function onUse(cid, item, fromPosition, itemEx, toPosition)
    local potion = POTIONS[item.itemid]
    if(not potion) then
        return false
    end

    if(not isPlayer(itemEx.uid) or (not config.usableOnTarget and cid ~= itemEx.uid)) then
        if(not config.splashable) then
            return false
        end

        if(toPosition.x == CONTAINER_POSITION) then
            toPosition = getThingPos(item.uid)
        end

        doDecayItem(doCreateItem(2016, potion.splash, toPosition))
        doRemoveItem(item.uid, 1)

        doPlayerAddItem(cid, potion.empty, 1)
        return true
    end

    if(hasCondition(cid, CONDITION_EXHAUST)) then
        doPlayerSendDefaultCancel(cid, RETURNVALUE_YOUAREEXHAUSTED)
        return true
    end

    if(((potion.level and getPlayerLevel(cid) < potion.level) or (potion.vocations and not isInArray(potion.vocations, getPlayerVocation(cid)))) and
        not getPlayerCustomFlagValue(cid, PLAYERCUSTOMFLAG_GAMEMASTERPRIVILEGES))
    then
        doCreatureSay(itemEx.uid, "Only " .. potion.vocStr .. (potion.level and (" of level " .. potion.level) or "") .. " or above may drink this fluid.", TALKTYPE_ORANGE_1)
        return true
    end

    if(config.range > 0 and cid ~= itemEx.uid and getDistanceBetween(getCreaturePosition(cid), getCreaturePosition(itemEx.uid)) > config.range) then
        return false
    end

    local health = potion.health
    if(health and not doCreatureAddHealth(itemEx.uid, math.ceil(math.random(health[1], health[2]) * config.healthMultiplier))) then
        return false
    end

    local mana = potion.mana
    if(mana and not doPlayerAddMana(itemEx.uid, math.ceil(math.random(mana[1], mana[2]) * config.manaMultiplier))) then
        return false
    end

    doSendMagicEffect(getThingPos(itemEx.uid), CONST_ME_MAGIC_BLUE)
    if(not config.realAnimation) then
        doCreatureSay(itemEx.uid, "Aaaah...", TALKTYPE_ORANGE_1)
    else
        for i, tid in ipairs(getSpectators(getCreaturePosition(cid), 1, 1)) do
            if(isPlayer(tid)) then
                doCreatureSay(itemEx.uid, "Aaaah...", TALKTYPE_ORANGE_1, false, tid)
            end
        end
    end

    doAddCondition(cid, exhaust)
    if (getPlayerStorageValue(cid, 17652) <= 0) then
        doRemoveItem(item.uid, 1)
        if(not potion.empty or config.removeOnUse) then
            return true
        end
     
        doPlayerAddItem(cid, potion.empty, 1)
    end
    return true
end
 
Solution
If I understand you correctly now, when you use any potion you should get an item called crest? Does this item have an itemid?
No, for example i have item crest and potions, potions are not infinte but when i use crest then potions are infinite per 3 houres.
Lua:
local config = {
    removeOnUse = "yes",
    usableOnTarget = "yes", -- can be used on target? (fe. healing friend)
    splashable = "no",
    range = -1,
    realAnimation = "yes", -- make text effect visible only for players in range 1x1
    healthMultiplier = 1.0,
    manaMultiplier = 1.0
}

config.removeOnUse = getBooleanFromString(config.removeOnUse)
config.usableOnTarget = getBooleanFromString(config.usableOnTarget)
config.splashable = getBooleanFromString(config.splashable)
config.realAnimation = getBooleanFromString(config.realAnimation)

local POTIONS = {
    [8704] = {empty = 7636, splash = 42, health = {60, 85}}, -- small health potion
    [7618] = {empty = 7636, splash = 42, health = {125, 175}}, -- health potion
    [7588] = {empty = 7634, splash = 42, health = {250, 350}, level = 50, vocations = {3, 4, 7, 8}, vocStr = "knights and paladins"}, -- strong health potion
    [7591] = {empty = 7635, splash = 42, health = {425, 575}, level = 80, vocations = {4, 8}, vocStr = "knights"}, -- great health potion
    [8473] = {empty = 7635, splash = 42, health = {650, 850}, level = 130, vocations = {4, 8}, vocStr = "knights"}, -- ultimate health potion

    [7620] = {empty = 7636, splash = 47, mana = {75, 125}}, -- mana potion
    [7589] = {empty = 7634, splash = 47, mana = {115, 185}, level = 50, vocations = {1, 2, 3, 5, 6, 7}, vocStr = "sorcerers, druids and paladins"}, -- strong mana potion
    [7590] = {empty = 7635, splash = 47, mana = {250, 300}, level = 80, vocations = {1, 2, 5, 6}, vocStr = "sorcerers and druids"}, -- great mana potion

    [8472] = {empty = 7635, splash = 43, health = {250, 350}, mana = {100, 200}, level = 80, vocations = {3, 7}, vocStr = "paladins"} -- great spirit potion
}

local exhaust = createConditionObject(CONDITION_EXHAUST)
setConditionParam(exhaust, CONDITION_PARAM_TICKS, (getConfigInfo('timeBetweenExActions') - 100))

function onUse(cid, item, fromPosition, itemEx, toPosition)
    local potion = POTIONS[item.itemid]
    if(not potion) then
        return false
    end

    if(not isPlayer(itemEx.uid) or (not config.usableOnTarget and cid ~= itemEx.uid)) then
        if(not config.splashable) then
            return false
        end

        if(toPosition.x == CONTAINER_POSITION) then
            toPosition = getThingPos(item.uid)
        end

        doDecayItem(doCreateItem(2016, potion.splash, toPosition))
        doRemoveItem(item.uid, 1)

        doPlayerAddItem(cid, potion.empty, 1)
        return true
    end

    if(hasCondition(cid, CONDITION_EXHAUST)) then
        doPlayerSendDefaultCancel(cid, RETURNVALUE_YOUAREEXHAUSTED)
        return true
    end

    if(((potion.level and getPlayerLevel(cid) < potion.level) or (potion.vocations and not isInArray(potion.vocations, getPlayerVocation(cid)))) and
        not getPlayerCustomFlagValue(cid, PLAYERCUSTOMFLAG_GAMEMASTERPRIVILEGES))
    then
        doCreatureSay(itemEx.uid, "Only " .. potion.vocStr .. (potion.level and (" of level " .. potion.level) or "") .. " or above may drink this fluid.", TALKTYPE_ORANGE_1)
        return true
    end

    if(config.range > 0 and cid ~= itemEx.uid and getDistanceBetween(getCreaturePosition(cid), getCreaturePosition(itemEx.uid)) > config.range) then
        return false
    end

    local health = potion.health
    if(health and not doCreatureAddHealth(itemEx.uid, math.ceil(math.random(health[1], health[2]) * config.healthMultiplier))) then
        return false
    end

    local mana = potion.mana
    if(mana and not doPlayerAddMana(itemEx.uid, math.ceil(math.random(mana[1], mana[2]) * config.manaMultiplier))) then
        return false
    end

    doSendMagicEffect(getThingPos(itemEx.uid), CONST_ME_MAGIC_BLUE)
    if(not config.realAnimation) then
        doCreatureSay(itemEx.uid, "Aaaah...", TALKTYPE_ORANGE_1)
    else
        for i, tid in ipairs(getSpectators(getCreaturePosition(cid), 1, 1)) do
            if(isPlayer(tid)) then
                doCreatureSay(itemEx.uid, "Aaaah...", TALKTYPE_ORANGE_1, false, tid)
            end
        end
    end

    doAddCondition(cid, exhaust)
    if (getPlayerStorageValue(cid, 17652) <= 0) then
        doRemoveItem(item.uid, 1)
        if(not potion.empty or config.removeOnUse) then
            return true
        end
   
        doPlayerAddItem(cid, potion.empty, 1)
    end
    return true
end

I think it works, I will test it all later but mana potion and health potion works great. Thanks man.
 
Above will make all pots infinite when you have used a crest, but you have custom runes that you also want to work with this don't you?
If so post the custom runes scripts :)
 
Back
Top