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

How to make your server client 8.61 Tutorial

About auto stacking: well, I just replaced tfs functions with updated otserv ones and it works without any changes o_O
didnt tried rest of update, cause I'm lazy a bit but well...

explain better, you change you player.cpp, items.cpp and container.cpp, and tfs work with any changes? o_O
 
About auto stacking: well, I just replaced tfs functions with updated otserv ones and it works without any changes o_O
didnt tried rest of update, cause I'm lazy a bit but well...

Haha :D ... you can add here any proof:blink:
 
Yes, it will work like 90% :p

Note that you will have plenty of bugs without editing items.cpp, items.h, and items.xml with a new way to identify runes (hotkey etc). Also description of items need to be changed a bit.
 
doRemoveItem(item.uid, 1) can shorten your script...

SORRY... spam ;/

negative, doRemoveItem doesn't work properly with stackable items.
doChangeTypeItem(item.uid, item.type - 1) is recommended
 
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
	healthMultiplier = 1.0,
	manaMultiplier = 1.0
}

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

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

	[7620] = {empty = 7636, splash = 7, mana = {70, 130}}, -- mana potion
	[7589] = {empty = 7634, splash = 7, mana = {110, 190}, level = 50, vocations = {1, 2, 3, 5, 6, 7}, vocStr = "sorcerers, druids and paladins"}, -- strong mana potion
	[7590] = {empty = 7590, splash = 7, mana = {200, 300}, level = 80, vocations = {1, 2, 5, 6}, vocStr = "sorcerers and druids"}, -- great mana potion

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

local exhaust = createConditionObject(CONDITION_EXHAUST)
setConditionParam(exhaust, CONDITION_PARAM_TICKS, (1000))

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))
		doTransformItem(item.uid, potion.empty)
		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
-- By Delton Begin
	if (config.removeOnUse == "no") then
		doTransformItem(item.uid, item.itemid, item.type)
	else if (config.removeOnUse == "yes") then
			doRemoveItem(item.uid,1)
		end		
	end
-- By Delton End	
	doAddCondition(cid, exhaust)
	return true
end

Small Fix ? :X
 
I wonder how to add vial in the same container(and if full in main bp) not normally starting from main
 
tfs have {doAddContainerItem(uid, itemid[, count/subtype])}, but tfs don't have function which check container ;(
 
Last edited:
you mean that i cannot get uid of container that some item is in right? and probably its impossible to transform only one item from stack I guess?

EDIT: I got some idea, is there something checking what items are in container? like: get first container of player, remember its uid, check if it contains itemused.uid and if so we have that container, else check next container(probably slow and can be used to lag serv by some people, tons of bps one in another and use potion in last of them, but writing this function in source would help a bit I guess)
 
Last edited:
So why work with me?

impossible, it will remove the entire stack
you mean that i cannot get uid of container that some item is in right? and probably its impossible to transform only one item from stack I guess?

EDIT: I got some idea, is there something checking what items are in container? like: get first container of player, remember its uid, check if it contains itemused.uid and if so we have that container, else check next container(probably slow and can be used to lag serv by some people, tons of bps one in another and use potion in last of them, but writing this function in source would help a bit I guess)

unfortunately, that's how most container operations work in source. and it's not slow at all.
on today's modern server hardware, much more resources than that can be spared.
 
yeah, but if I'd like to test in on my home pc(that cant use over ~20% of cpu time cause of heat here xD)

and it IS slow, just not noticable

anyway, so it would be like
if getParent(item.uid) isnt null/0 /whateva and getParent(item.uid)isnt full(even more than in old days, check not only slots but also if it can add something to existing stack) add it to that container, else just add item to player in any place as always right?

damn, doesnt seem to be easy enough for me -.-
 
how would you execute the event?
or you only thought of making for potions?
 
Back
Top