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

Lua Potions --- Mana-/HealthAmount + PlayerLevel

Pnurt

New Member
Joined
Apr 22, 2009
Messages
205
Reaction score
0
Hey,

How can I make my potions add a specified amount of mana/health and then + the players level.

Example: A level 200 player uses a mana potion that gives him 100 mana, then he gets 100 + 200 = 300 mana.

I tried using the getPlayerLevel but I failed. I'm guessing because I used it wrong.

Here is my potion.lua

potion.lua
Lua:
local config = {
	removeOnUse = "yes",
	usableOnTarget = "yes", -- can be used on target? (fe. healing friend)
	splashable = "yes",
	range = -1,
	area = {1, 1} -- if not set correctly, the message will be sent only to user of the item
}

local multiplier = {
	health = 1.0,
	mana = 1.0
}

local POTIONS = {
	[8704] = {empty = 7636, splash = 42, health = {100, 200}}, -- small health potion
	[7618] = {empty = 7636, splash = 42, health = {190, 300}}, -- health potion
	[7588] = {empty = 7634, splash = 42, health = {350, 500}, level = 50, vocations = {3, 4, 7, 8}, vocStr = "knights and paladins"}, -- strong health potion
	[7591] = {empty = 7635, splash = 42, health = {700, 900}, level = 80, vocations = {4, 8}, vocStr = "knights"}, -- great health potion
	[8473] = {empty = 7635, splash = 42, health = {900, 1100}, level = 130, vocations = {4, 8}, vocStr = "knights"}, -- ultimate health potion

	[7620] = {empty = 7636, splash = 47, mana = {100, 130}}, -- mana potion
	[7589] = {empty = 7634, splash = 47, mana = {210, 390}, level = 50, vocations = {1, 2, 3, 5, 6, 7}, vocStr = "sorcerers, druids and paladins"}, -- strong mana potion
	[7590] = {empty = 7635, splash = 47, mana = {500, 700}, level = 80, vocations = {1, 2, 5, 6}, vocStr = "sorcerers and druids"}, -- great mana potion

	[8472] = {empty = 7635, splash = 43, health = {200, 300}, mana = {370, 590}, 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(type(potion.health) == 'table' and table.maxn(potion.health) > 1) then
			potion.health[1] = math.ceil(potion.health[1] * multiplier.health)
			potion.health[2] = math.ceil(potion.health[2] * multiplier.health)
		else
			potion.health = nil
		end


		if(type(potion.mana) == 'table' and table.maxn(potion.mana) > 1) then
			potion.mana[1] = math.ceil(potion.mana[1] * multiplier.mana)
			potion.mana[2] = math.ceil(potion.mana[2] * multiplier.mana)
		else
			potion.mana = nil
		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_MONSTER, false, cid)
		return true
	end

	if(potion.range > 0 and cid ~= itemEx.uid and getDistanceBetween(getThingPosition(cid), getThingPosition(itemEx.uid)) > potion.range and not getPlayerCustomFlagValue(cid, PLAYERCUSTOMFLAG_CANUSEFAR)) then
		doPlayerSendDefaultCancel(cid, RETURNVALUE_TOOFARAWAY)
		return true
	end

	if(potion.health and not doTargetCombatHealth(cid, itemEx.uid, COMBAT_HEALING, potion.health[1], potion.health[2], CONST_ME_MAGIC_BLUE, false)) then
		return false
	end

	if(potion.mana and not doTargetCombatMana(cid, itemEx.uid, potion.mana[1], potion.mana[2], CONST_ME_MAGIC_BLUE, false)) then
		return false
	end

	if(type(potion.area) == 'table' and table.maxn(potion.area) > 1) then
		for i, tid in ipairs(getSpectators(getThingPosition(itemEx.uid), potion.area[1], potion.area[2])) do
			if(isPlayer(tid)) then
				doCreatureSay(itemEx.uid, "Aaaah...", TALKTYPE_MONSTER, false, tid)
			end
		end
	else
		doCreatureSay(itemEx.uid, "Aaaah...", TALKTYPE_MONSTER, false, itemEx.uid)
		if(itemEx.uid ~= cid) then
			doCreatureSay(itemEx.uid, "Aaaah...", TALKTYPE_MONSTER, false, cid)
		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
 
Why would you do that? Instead of just adjusting so it's healing a percentage instead, of the maximum mana points. Would be far better in my opinion.
 
You can do something like
Lua:
local l = getPlayerLevel(cid)
Then in the amount + l
You do have to move the local POTIONS part and the rest under it under function onUse(cid, item, fromPosition, itemEx, toPosition) then, because of the cid in getPlayerLevel(cid), which should be inside a function with the parameter cid.
 
Back
Top