• 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 0.X Need some help with potions

samih95

Member
Joined
Dec 11, 2011
Messages
95
Reaction score
6
Hello guys!


I need some help adjusting my potions to fit my server. And I also would need help with the healing spells... I want them all to be nice and "balanced" so all vocations can participate in pvp/rpg

I will share my stages and current potions file for you guys to help me out! If you also want to help me with the spells and runes please tell me what you need and i will serve you.

Stages.xml

Code:
    <world id="0" multiplier="1">
        <stage minlevel="1" maxlevel="200" multiplier="350"/>
        <stage minlevel="201" maxlevel="320" multiplier="250"/>
        <stage minlevel="321" maxlevel="400" multiplier="125"/>
        <stage minlevel="401" maxlevel="460" multiplier="65"/>
        <stage minlevel="461" maxlevel="500" multiplier="35"/>       
        <stage minlevel="501" maxlevel="550" multiplier="20"/>
        <stage minlevel="551" maxlevel="600" multiplier="15"/>
        <stage minlevel="601" maxlevel="650" multiplier="10"/>
        <stage minlevel="651" maxlevel="700" multiplier="8"/>
        <stage minlevel="701" maxlevel="750" multiplier="5"/>
        <stage minlevel="751" maxlevel="800" multiplier="3"/>
        <stage minlevel="801" maxlevel="850" multiplier="2"/>
        <stage minlevel="851" multiplier="1"/>

Potions.lua

Code:
local config = {
    removeOnUse = "no",
    splashable = "no",
    realAnimation = "no", -- make text effect visible only for players in range 1x1
    healthMultiplier = 1.0,
    manaMultiplier = 1.0
}

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

local POTIONS = {
    [8704] = {empty = 7636, splash = 2, health = {50, 150}, level = 8, vocations = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, vocStr = "sorcerers, druids, knights and paladins"}, -- small health potion
    [7618] = {empty = 7636, splash = 2, health = {300, 500}, level = 8, vocations = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, vocStr = "sorcerers, druids, knights and paladins"}, -- health potion
    [7588] = {empty = 7634, splash = 2, health = {500, 600}, level = 50, vocations = {3, 4, 7, 8, 12, 11}, vocStr = "knights and paladins"}, -- strong health potion
    [7591] = {empty = 7635, splash = 2, health = {600, 800}, level = 80, vocations = {4, 8, 12}, vocStr = "knights"}, -- great health potion
    [8473] = {empty = 7635, splash = 42, health = {800, 1000}, level = 130, vocations = {4, 8}, vocStr = "knights"}, -- ultimate health potion
   
    [7620] = {empty = 7636, splash = 7, mana = {70, 130}, level = 8, vocations = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, vocStr = "sorcerers, druids, knights and paladins"}, -- mana potion
    [7589] = {empty = 7634, splash = 7, mana = {110, 190}, level = 50, vocations = {1, 2, 3, 5, 6, 7, 9, 10, 11}, vocStr = "sorcerers, druids and paladins"}, -- strong mana potion
    [7590] = {empty = 7635, splash = 7, mana = {300, 400}, level = 80, vocations = {1, 2, 5, 6, 9, 10}, vocStr = "sorcerers and druids"}, -- great mana potion

    [8472] = {empty = 7635, splash = 3, health = {700, 900}, mana = {310, 710}, level = 80, vocations = {3, 7, 11}, 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)) 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))
        doTransformItem(item.uid, potion.empty)
        return true
    end

    if(hasCondition(cid, CONDITION_EXHAUST_HEAL)) 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

    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 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(not potion.empty or config.removeOnUse) then
        doRemoveItem(item.uid)
        return true
    end

local aidd =
{
  min = 10901,
   max = 10911
    }
     if item.actionid < aidd.min then
      doItemSetAttribute(item.uid, "actionid", aidd.min)
       elseif item.actionid >= aidd.min and item.actionid <= aidd.max then
      doItemSetAttribute(item.uid, "actionid", getItemAttribute(item.uid, "actionid")+1)
     elseif item.actionid >= aidd.max then
    doTransformItem(item.uid, potion.empty)
   return TRUE
  end
return true
end

//Sami
 
The vocation's balance only depends on you. You must search for the "right" number in many forms, for example - itens attack, vocation speed, potions, spell damages, etcetera.
 
Ofc. But the problem is i have never worked with the balancing part before and i need help to make it good.

I dunno where to start but i thought healing is kinda important. Now i have for example lvl 200ms with 80mlvl that only heals 300-390 with GMP and that doesnt feel right

edit: Changed the ms to lvl 300, same mlvl and he heals exactly the same.
 
I did a small changes on your code, changed the config table, I'm need leave now and I didn't edited the others configurable table, so if works like what you want so please add them.

The logic is pure simple, in each items table on config you'll be able to add health / mana and defines the min amount and the max amount for it.

Not sure if that will work as well, didn't tested.

Lua:
local config = {
    removeOnUse = "no",
    splashable = "no",
    realAnimation = "no", -- make text effect visible only for players in range 1x1
    healthMultiplier = 1.0,
    manaMultiplier = 1.0
}
config.removeOnUse = getBooleanFromString(config.removeOnUse)
config.splashable = getBooleanFromString(config.splashable)
config.realAnimation = getBooleanFromString(config.realAnimation)
local POTIONS = {
    [8704] = { -- small health potion
        empty = 7636,
        splash = 2,
        level = {
            [{1, 10}] = { health = {min = 10, max = 20} },
            [{11, 30}] = { health = {min = 50, max = 100} },
            [{31, 999}] = { health = {min = 100, max = 200} },
        },
        vocations = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
        vocStr = "sorcerers, druids, knights and paladins"
    },
    [7620] = { -- mana potion
        empty = 7636,
        splash = 7,
        level = {
            [{1, 10}] = { mana = {min = 70, max = 80} },
            [{11, 30}] = { mana = {min = 80, max = 100} },
            [{31, 999}] = { mana = {min = 100, max = 120} },
        },
        vocations = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
        vocStr = "sorcerers, druids, knights and paladins"
    },
}

local aidd = {
  min = 10901,
  max = 10911
}
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)) 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))
        doTransformItem(item.uid, potion.empty)
        return true
    end
    if(hasCondition(cid, CONDITION_EXHAUST_HEAL)) then
        doPlayerSendDefaultCancel(cid, RETURNVALUE_YOUAREEXHAUSTED)
        return true
    end

    local playerLevel = getPlayerLevel(cid)
    if(((playerLevel < potion.level[1]) 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

    local health, mana = nil, nil
    for v, k in pairs(potion.level) do
        if playerLevel >= v[1] and playerLevel <= v[2] then
            if (k.health) then
                health = {k.health.min, k.health.max}
            end

            if (k.mana) then
                mana = {k.mana.min, k.mana.max}
            end

            break
        end
    end

    if(health and not doCreatureAddHealth(itemEx.uid, math.ceil(math.random(health[1], health[2]) * config.healthMultiplier))) then
        return false
    end
    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 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(not potion.empty or config.removeOnUse) then
        doRemoveItem(item.uid)
        return true
    end
    if item.actionid < aidd.min then
        doItemSetAttribute(item.uid, "actionid", aidd.min)
    elseif item.actionid >= aidd.min and item.actionid <= aidd.max then
        doItemSetAttribute(item.uid, "actionid", getItemAttribute(item.uid, "actionid")+1)
    elseif item.actionid >= aidd.max then
        doTransformItem(item.uid, potion.empty)
        return true
    end

    return true
end
 
Back
Top