• 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!
  • New resources must be posted under Resources tab. A discussion thread will be created automatically, you can't open threads manually anymore.

Action Potions Based on Experience Level

J.Dre

Unity Games
Joined
May 18, 2011
Messages
2,647
Solutions
3
Reaction score
648
Location
United States
I made this a while ago for someone who wanted something different on their server.
I figured someone else out there might find it more useful than my external HDD.

Thoroughly tested & working on the latest Subversion (0.4_SVN)

Enjoy! :thumbup:

Update Log:


  • Initial Release: v1.0.0
    Adjusted the config within the script to better suit beginners.
  • Patch: v1.0.1
    Fixed small problem with potions. (They were unlimited)
    Updated script with latest changes made by TFS developers.
  • Patch: v1.0.2
    Script cleanup - config & variables. (min, max, min_, max_)
    Unable to find solution for the required minimum. (Read logs below)

data/actions/actions.xml
Lua:
<action itemid="7588-7591;8472-8473;7618;7620;8704" event="script" value="potions.lua"/>

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

local min, max = 0, 0
local POTIONS = {
	[8704] = {empty = 7636, splash = 42, health = {1.0, 1.25}, min = 50, max = 100}, -- small health potion
	[7618] = {empty = 7636, splash = 42, health = {1.25, 1.75}, min = 50, max = 150}, -- health potion
	[7588] = {empty = 7634, splash = 42, health = {1.75, 2.25}, min = 0, max = 350, level = 50, vocations = {3, 4, 7, 8}, vocStr = "knights and paladins"}, -- strong health potion
	[7591] = {empty = 7635, splash = 42, health = {2.25, 2.5}, min = 0, max = 500, level = 80, vocations = {4, 8}, vocStr = "knights"}, -- great health potion
	[8473] = {empty = 7635, splash = 42, health = {2.5, 3.0}, min = 0, max = 800, level = 130, vocations = {4, 8}, vocStr = "knights"}, -- ultimate health potion
 
	[7620] = {empty = 7636, splash = 47, mana = {1.0, 1.5}, min = 50, max = 150}, -- mana potion
	[7589] = {empty = 7634, splash = 47, mana = {1.5, 2.0}, min = 0, max = 250, level = 50, vocations = {1, 2, 3, 5, 6, 7}, vocStr = "sorcerers, druids and paladins"}, -- strong mana potion
	[7590] = {empty = 7635, splash = 47, mana = {2.0, 2.5}, min = 0, max = 350, level = 80, vocations = {1, 2, 5, 6}, vocStr = "sorcerers and druids"}, -- great mana potion
 
	[8472] = {empty = 7635, splash = 43, health = {1.25, 2.25}, mana = {1.25, 2.25}, min = 0, max = 320, level = 80, vocations = {3, 7}, vocStr = "paladins"} -- great spirit potion
}
 
for index, potion in pairs(POTIONS) do
	if(type(index) == "number")then
		for k, v in pairs(config) do
			if(not potion[k]) then
				potion[k] = v
			end
		end
 
		if(potion.removeOnUse) then
			potion.removeOnUse = getBooleanFromString(potion.removeOnUse)
		end
 
		if(potion.usableOnTarget) then
			potion.usableOnTarget = getBooleanFromString(potion.usableOnTarget)
		end
 
		if(potion.splashable) then
			potion.splashable = getBooleanFromString(potion.splashable)
		end
 
		if(potion.realAnimation) then
			potion.realAnimation = getBooleanFromString(potion.realAnimation)
		end
 
		POTIONS[index] = potion
	end
end
 
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 potion.usableOnTarget and cid ~= itemEx.uid)) then
		if(not potion.splashable or not potion.splash) then
			return false
		end
 
		if(toPosition.x == CONTAINER_POSITION) then
			toPosition = getThingPosition(item.uid)
		end
 
		doDecayItem(doCreateItem(POOL, potion.splash, toPosition))
		doRemoveItem(item.uid, 1)
		if(not potion.empty or potion.removeOnUse) then
			return true
		end
 
		if(fromPosition.x ~= CONTAINER_POSITION) then
			doCreateItem(potion.empty, fromPosition)
		else
			doPlayerAddItem(cid, potion.empty, 1)
		end
 
		return true
	end
 
	if(((potion.level and getPlayerLevel(itemEx.uid) < potion.level) or (potion.vocations and not isInArray(potion.vocations, getPlayerVocation(itemEx.uid)))) 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(potion.range > 0 and cid ~= itemEx.uid and getDistanceBetween(getThingPosition(cid), getThingPosition(itemEx.uid)) > potion.range) then
		return false
	end
	
	local x = getPlayerLevel(cid)
	local min_, max_ = potion.min, potion.max
	
	local health = potion.health
	if health then
		local hp = math.ceil(math.random(health[1] * x, health[2] * x))
		if hp < min_ then
			hp = math.random(min_, max_)
		elseif hp > max_ then
			hp = math.random(max_, max_ + 100)
		end
 
		doCreatureAddHealth(itemEx.uid, hp)
	end
 
	local mana = potion.mana
	if mana then
		local mp = math.ceil(math.random(mana[1] * x, mana[2] * x))
		if mp < min_ then
			mp = math.random(min_, max_)
		elseif mp > max_ then
			mp = math.random(max_, max_ + 100)
		end
 
		doPlayerAddMana(itemEx.uid, mp)
	end
 
	doSendMagicEffect(getThingPosition(itemEx.uid), CONST_ME_MAGIC_BLUE)
	if(not potion.realAnimation) then
		doCreatureSay(itemEx.uid, "Aaaah...", TALKTYPE_ORANGE_1)
	else
		for i, tid in ipairs(getSpectators(getThingPosition(itemEx.uid), 1, 1)) do
			if(isPlayer(tid)) then
				doCreatureSay(itemEx.uid, "Aaaah...", TALKTYPE_ORANGE_1, false, tid)
			end
		end
	end
 
	doRemoveItem(item.uid, 1)
	if(not potion.empty or potion.removeOnUse) then
		return true
	end
 
	if(fromPosition.x ~= CONTAINER_POSITION) then
		doCreateItem(potion.empty, fromPosition)
	else
		doPlayerAddItem(cid, potion.empty, 1)
	end
 
	return true
end

Upcoming Changes & Known Problems:


  • ̶#̶0̶1̶ ̶-̶ ̶[̶v̶1̶.̶0̶ ̶B̶e̶t̶a̶]̶ There needs to be a minimum on the weaker potions, you cannot have it set at "0" because it may not refill enough. (Low level players)
    Status: No known solution found; keep the minimum above 0.
 
Last edited:
which is the maximum amount that receives the character?

I wrote the code to work differently than to just have a set maximum. Nobody wants to refill "150, 150, 150, 150".

The base max:
Lua:
min = 100, max = 150

If the player goes over the max, it will give a random amount from the maximum up to another 100. (completely configurable)
 
You made that script for me J.dRe, Do you remember the evolution server! :)
 
hey i've a problem, i proof it and just heal like 100 and 150 withouth + level or magic level.. just heal 100 to 150 how you make it in the script.. soo i don't se any change...
 
hey i've a problem, i proof it and just heal like 100 and 150 withouth + level or magic level.. just heal 100 to 150 how you make it in the script.. soo i don't se any change...

I'm having a hard time understanding what you said. Are you stating that you don't see any changes? Or are you perhaps saying that you would like to only heal, 100 - 150?

You made that script for me J.dRe, Do you remember the evolution server! :)

Yes, I do remember. Though, that was quite some time ago.

J.Dre
 
hey i've a problem, i proof it and just heal like 100 and 150 withouth + level or magic level.. just heal 100 to 150 how you make it in the script.. soo i don't se any change...

The script is designed that way. It keeps lower levels from dying because they don't have any skill advances. You can change the minimum amount by editing the "min" on each potion.
 
Back
Top