• 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 Potion problem

xubeiga

New Member
Joined
Jun 17, 2009
Messages
137
Reaction score
1
hey, so i changed the small health potion to a stamina elixir, and if i have 100 or whatever number of elixirs, it uses all not just one...i think it still happens before when it was just small health potion

here is my potions.lua:
Lua:
local config = {
	
removeOnUse = "no",
	
usableOnTarget = "yes", -- can be used on target? (fe. healing friend)
	
splashable = "no",
	
range = -1,
	
realAnimation = "no", -- make text effect visible only for players in range 1x1
	
multiplier = {
		health = 1.0,
		mana = 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 = {2, 3}}, -- elixir
	[7618] = {empty = 7636, splash = 42, health = {100, 200}}, -- health potion
	[7588] = {empty = 7634, splash = 42, health = {200, 400}, level = 50, vocations = {3, 4, 7, 8}, vocStr = "knights and paladins"}, -- strong health potion
	[7591] = {empty = 7635, splash = 42, health = {500, 700}, level = 80, vocations = {4, 8}, 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 = 47, mana = {70, 130}}, -- mana potion
	[7589] = {empty = 7634, splash = 47, mana = {110, 190}, level = 50, vocations = {1, 2, 3, 5, 6, 7}, vocStr = "sorcerers, druids and paladins"}, -- strong mana potion
	[7590] = {empty = 7635, splash = 47, mana = {200, 300}, level = 80, vocations = {1, 2, 5, 6}, vocStr = "sorcerers and druids"}, -- great mana potion

	[8472] = {empty = 7635, splash = 43, health = {200, 400}, mana = {110, 190}, level = 80, vocations = {3, 7}, vocStr = "paladins"}
}



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 = getThingPosition(item.uid)
		
end

		
doDecayItem(doCreateItem(POOL, potion.splash, toPosition))
		
doRemoveItem(item.uid, 1)
		
if(not potion.empty or config.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(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.multiplier.health))) then
		
return false
	
end

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

	
doSendMagicEffect(getThingPosition(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(getThingPosition(itemEx.uid), 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

	
if(fromPosition.x ~= CONTAINER_POSITION) then
		
doCreateItem(potion.empty, fromPosition)
	
else
		
doPlayerAddItem(cid, potion.empty, 1)
	
end

	
return true

end
any ideas?
 
Last edited by a moderator:
Try using this, it's not the same, but it's dependent on your experience level, more organized:
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
 
You just copied the same info from the small health potion, copy from another, eg. Great Health Potion and add it as another fluid.
 
so, that's what i need:

i changed small health potion ID 8704 to stamina elixir, and doing that i removed small health potions from potions.lua and from actions.xml. so the item ID 8704 is not a potion anymore, that's why when i use 100, it uses all not just 1. so what i need is to put the config of remove just 1 item that is on potions.lua, on my stamina elixir script! but i dont know how to do that...

my scripts:

POTIONS:
Lua:
local config = {
	
removeOnUse = "no",
	
usableOnTarget = "yes", -- can be used on target? (fe. healing friend)
	
splashable = "no",
	
range = -1,
	
realAnimation = "no", -- make text effect visible only for players in range 1x1
	
multiplier = {
		health = 1.0,
		mana = 1.0
	}
}



config.removeOnUse = getBooleanFromString(config.removeOnUse)

config.usableOnTarget = getBooleanFromString(config.usableOnTarget)

config.splashable = getBooleanFromString(config.splashable)

config.realAnimation = getBooleanFromString(config.realAnimation)


local POTIONS = {
	[7618] = {empty = 7636, splash = 42, health = {100, 200}}, -- health potion
	[7588] = {empty = 7634, splash = 42, health = {200, 400}, level = 50, vocations = {3, 4, 7, 8}, vocStr = "knights and paladins"}, -- strong health potion
	[7591] = {empty = 7635, splash = 42, health = {500, 700}, level = 80, vocations = {4, 8}, 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 = 47, mana = {70, 130}}, -- mana potion
	[7589] = {empty = 7634, splash = 47, mana = {110, 190}, level = 50, vocations = {1, 2, 3, 5, 6, 7}, vocStr = "sorcerers, druids and paladins"}, -- strong mana potion
	[7590] = {empty = 7635, splash = 47, mana = {200, 300}, level = 80, vocations = {1, 2, 5, 6}, vocStr = "sorcerers and druids"}, -- great mana potion

	[8472] = {empty = 7635, splash = 43, health = {200, 400}, mana = {110, 190}, level = 80, vocations = {3, 7}, vocStr = "paladins"}
}



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 = getThingPosition(item.uid)
		
end

		
doDecayItem(doCreateItem(POOL, potion.splash, toPosition))
		
doRemoveItem(item.uid, 1)
		
if(not potion.empty or config.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(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.multiplier.health))) then
		
return false
	
end

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

	
doSendMagicEffect(getThingPosition(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(getThingPosition(itemEx.uid), 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

	
if(fromPosition.x ~= CONTAINER_POSITION) then
		
doCreateItem(potion.empty, fromPosition)
	
else
		
doPlayerAddItem(cid, potion.empty, 1)
	
end

	
return true

end

Elixir:
Lua:
function onUse(cid, item, fromPosition, itemEx, toPosition)
            local cfg = {}
            cfg.refuel = 42 * 60 * 1000
            if(getPlayerStamina(cid) >= cfg.refuel) then
                            doPlayerSendCancel(cid, "Your stamina is already full.")
            elseif(not isPremium(cid)) then
                            doPlayerSendCancel(cid, "You must have a premium account.")
            else
                            doPlayerSetStamina(cid, cfg.refuel)
                            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Your stamina has been refilled.")
                            doRemoveItem(item.uid)
            end


            return true
end

did any one understand? :B
 
i cant get a good tfs without being premium. and my problem has nothing to do with what version i'm using.

Yes it does, functions have been removed or edited or something in OTX.. It's a terrible distribution.. That's why nearly everyone on support who has a problem with a script's function is using OTX.
 
Back
Top