• 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

its slot of item(if you have it in hand, on head or something it contains number of that slot)
Code:
setField(L, "slotPosition", item->slotPosition);

@down: no, I want where it is now, not where it can be used as eq

but it works, it sets transform to true if used pot is in hand or arrow slot(and is last one from stack)
 
Last edited:
you must use getItemInfo(item.itemid).slotPosition

also, only armors/weapons/shields etc have slotPosition.

nqGVM.png


@up streamThing doesn't push slotPosition

both item.slotPosition and slots.i are nil, so it would always set it to true.
 
Last edited:
no, it doesnt transform if its in another position
Code:
if transform then
		doCreatureSay(cid, "lol", 1)
		return doTransformItem(item.uid, potion.empty, 1)
	else
single pot in bp, says nothing, single pot in hand
Code:
18:24 Zakius: lol
tested it experimentally, I can even record a video if you want
 
as long as local transform = false is outside function, it's going to stay true once it's set to true. what's the point of it then? :p
 
no, it doesnt transform if its in another position
Code:
if transform then
        doCreatureSay(cid, "lol", 1)
        return doTransformItem(item.uid, potion.empty, 1)
    else
single pot in bp, says nothing, single pot in hand
Code:
18:24 Zakius: lol
tested it experimentally, I can even record a video if you want

tja kompis
 
damn, it was working fine before I fixed that declaring transform...
anyway, going back to work

why the hell even
Code:
if(getPlayerSlotItem(cid, 5).uid==item.uid or getPlayerSlotItem(cid, 6).uid==item.uid or getPlayerSlotItem(cid, 10).uid==item.uid) and item.type==1 then
doesnt work?

ok, I think its good now
Code:
local config = 
{
	removeOnUse = "no",
	usableOnTarget = "yes", -- can be used on target? (fe. healing friend)
	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.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 = 7635, 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, (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 = 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)
	local v = getItemParent(item.uid)
	if not v or v.uid==0 or v.uid==cid then
		if item.type==1 then
			doTransformItem(item.uid, potion.empty, 1)
			return true
		end
	end
	doChangeTypeItem(item.uid, item.type - 1)
	if(not potion.empty or  config.removeOnUse) then
		return true
	end
	if not v or v.uid == 0 then
		doPlayerAddItem(cid, potion.empty, 1)
		return true
	end
	local size = getContainerSize(v.uid)
	for i = 0, size-1 do
		local tmp = getContainerItem(v.uid, i)
		if tmp.itemid == potion.empty and tmp.type < 100 then
			return getPlayerFreeCap(cid) >= getItemInfo(potion.empty).weight and doChangeTypeItem(tmp.uid, tmp.type + 1) or doPlayerAddItem(cid, potion.empty, 1)
		end
	end
	if getContainerSize(v.uid) < getContainerCap(v.uid) then
		doAddContainerItem(v.uid, potion.empty)
	else
		doPlayerAddItem(cid, potion.empty, 1)
	end
	return true
end
wasted all day on such a noob thing...
 
Last edited:
uhm, added some more useless code:
Lua:
local config = {
	removeOnUse = "no",
	usableOnTarget = "yes", -- can be used on target? (fe. healing friend)
	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.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 = 7635, 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, (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 = 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)

	local v = getItemParent(item.uid)
	if(not potion.empty or config.removeOnUse) then
		return true
	end

	if fromPosition.x == CONTAINER_POSITION then
		for _, slot in ipairs({CONST_SLOT_LEFT, CONST_SLOT_RIGHT, CONST_SLOT_AMMO}) do
			local tmp = getPlayerSlotItem(cid, slot)
			if tmp.itemid == potion.empty and tmp.type < 100 then
				doChangeTypeItem(item.uid, item.type - 1)
				return getPlayerFreeCap(cid) >= getItemInfo(potion.empty).weight and doChangeTypeItem(tmp.uid, tmp.type + 1) or doPlayerAddItem(cid, potion.empty, 1)
			end
		end
	else
		doChangeTypeItem(item.uid, item.type - 1)
		doCreateItem(potion.empty, 1, fromPosition)
		return true
	end

	if v.uid == 0 then
		if item.type == 1 and isInArray({CONST_SLOT_LEFT, CONST_SLOT_RIGHT, CONST_SLOT_AMMO}, fromPosition.y) then
			doTransformItem(item.uid, potion.empty)
		else
			-- serversided autostack should take care of this
			doPlayerAddItem(cid, potion.empty, 1)
			doChangeTypeItem(item.uid, item.type - 1)
		end
		return true
	else
		doChangeTypeItem(item.uid, item.type - 1)
		local size = getContainerSize(v.uid)
		for i = 0, size-1 do
			local tmp = getContainerItem(v.uid, i)
			if tmp.itemid == potion.empty and tmp.type < 100 then
				return getPlayerFreeCap(cid) >= getItemInfo(potion.empty).weight and doChangeTypeItem(tmp.uid, tmp.type + 1) or doPlayerAddItem(cid, potion.empty, 1)
			end
		end

		if getContainerSize(v.uid) < getContainerCap(v.uid) then
			doAddContainerItem(v.uid, potion.empty)
		else
			doPlayerAddItem(cid, potion.empty, 1)
		end
	end
	return true
end
it should now properly stack when it's in one of those 3 slots (hands, ammo)
 
Last edited:
Code:
doPlayerAddItem(cid, potion.empty, 1)
			doChangeTypeItem(item.uid, item.type - 1)
should be reversed(in extreme cases can cause problems if you add vial before deleting potion)
anyway, I can see a lot of new code, but cannot see difference in effects between my and your code(even if last pot is transformed it moves to first slot in bp cause of autostack), trying to analyze it deeper, step by step
Code:
for _, slot in ipairs({CONST_SLOT_LEFT, CONST_SLOT_RIGHT, CONST_SLOT_AMMO}) do
		local tmp = getPlayerSlotItem(cid, slot)
		if tmp.itemid == potion.empty and tmp.type < 100 then
			doChangeTypeItem(item.uid, item.type - 1)
			return getPlayerFreeCap(cid) >= getItemInfo(potion.empty).weight and doChangeTypeItem(tmp.uid, tmp.type + 1) or doPlayerAddItem(cid, potion.empty, 1)
		end
	end
is executed by doPlayerAddItem and autostack system, so its not needed

also why position.y contains slot? it is strange...

ahh, ok, only difference between my and your script is what happens if I use single pot from ground: my leaves vial on fromPos and your adds vial to bp

EDIT: and both scripts drop vial on ground when you have pots(more than one) in one of that slots, two other slots are full (with one vial in it) is full, another damn hack?(tested on global, in this caseit stack properly on cip code..., I wonder how they got that result answering "its impossible" for most of ideas that are already implemented in ot ...)
 
Last edited:
what is wrong?

[29/07/2010 12:40:47] Failed connecting to database - MYSQL ERROR: Can't connect to MySQL server on 'localhost' (10061) (2003)

[29/07/2010 12:40:47] > ERROR: Couldn't estabilish connection to SQL database!

Other engines normally works.
If Someone Could give a finished source code I'll be very grateful
 
i got problem when i buy 100 sd it cost 32.5k but it shuld 10k~ how to fix that?

You must change npc to selling runes witch 1 "charges" (now it's count, not charges)...

Example:
Code:
shopModule:addBuyableItem({'light magic missile'}, 2287, 40, [COLOR="Red"]10[/COLOR], 'light magic missile rune')
to
Code:
shopModule:addBuyableItem({'light magic missile'}, 2287, 40, [COLOR="Red"]1[/COLOR], 'light magic missile rune')
 
You must change npc to selling runes witch 1 "charges" (now it's count, not charges)...

Example:
Code:
shopModule:addBuyableItem({'light magic missile'}, 2287, 40, [COLOR="Red"]10[/COLOR], 'light magic missile rune')
to
Code:
shopModule:addBuyableItem({'light magic missile'}, 2287, 40, [COLOR="Red"]1[/COLOR], 'light magic missile rune')

but on real you buy 3x sd for 325gp and exemple i buy 3x sd and got 9 shoots.

@edit
sorry my wrong now can buy 1 shoot :)
 
I have one error in compiler :

../luascript.cpp:10412: error: no `int32_t LuaInterface::luaGetItemParent(lua_State*)' member function declared in class `LuaInterface'

make.exe: *** [obj//luascript.o] Error 1

what could be the problem?

Thanks !!! :thumbup:
 
I have one error in compiler :

../luascript.cpp:10412: error: no `int32_t LuaInterface::luaGetItemParent(lua_State*)' member function declared in class `LuaInterface'

make.exe: *** [obj//luascript.o] Error 1

what could be the problem?

Thanks !!! :thumbup:
0.4_dev :
Code:
int32_t LuaInterface::luaGetItemParent(lua_State* L)
older version:
Code:
int32_t LuaScriptInterface::luaGetItemParent(lua_State* L)
 
0.4_dev :
Code:
int32_t LuaInterface::luaGetItemParent(lua_State* L)
older version:
Code:
int32_t LuaScriptInterface::luaGetItemParent(lua_State* L)

Yes, i use 0.4 > int32_t LuaInterface::luaGetItemParent(lua_State* L)

And not work ;S
 
compile errors?


Yes, This:

../luascript.cpp:10412: error: no `int32_t LuaInterface::luaGetItemParent(lua_State*)' member function declared in class `LuaInterface'

make.exe: *** [obj//luascript.o] Error 1

Execution terminated
 
1. Go to "source directory"/dev-cpp/obj/ and delete all files...
2. Compile...
 
Back
Top