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

MoveEvent Slot system - Multi slot (No crashes)

Mock

Mock the bear (MTB)
Joined
Jul 29, 2008
Messages
619
Reaction score
106
Location
Brazil
  • Author: Mock
  • Test on: TFS 0.3.6

Hello. i have made this script 1 year ago, but only now i remake it and posted.

Look old script working.
YouTube - Pharenight Teaser #1

This scripts is like this :p

This versions is better than old, old version you cannot set to upgrade items like focus cape or magma legs because need tag on movements. But this version dont need any tag!
shocked.gif


This system now is PERFECT if you want you can open 1, or 2, or 3, or 500 slots in your item is just config!! :thumbup:
It work in all equips!

You need ONLY add 2 tags end 2 scripts :thumbup:

Dont fotger to rep++

Firs add this tag on actions.xml
Code:
<action itemid="8300" event="script" value="slot.lua"/>
and on slot.lua:
Lua:
--[[
Slot system 100% by mock \o
]]
---Config
local conf = {
maxSlotCount=2,
ignoredIds={}
}
--End
function choose(...) --- Function by mock.
	local arg = {...}
	return arg[math.random(1,#arg)]
end
if not getItemAttack then
	function getItemAttack(uid)
		return getItemAttribute(uid,'attack')
	end
	function getItemDefense(uid)
		return getItemAttribute(uid,'defense')
	end
end
local function isArmor(uid) -- Function by Mock the bear.
    if (getItemInfo(uid.itemid).armor ~= 0) and (getItemWeaponType(uid.uid) == 0) then
		return true
	end
	return false
end
local function isWeapon(uid) -- Function by Mock the bear.
	uid = uid or 0
	local f = getItemWeaponType(uid)
	if f == 1 or f == 2 or f == 3 then
		return true
	end
	return false
end
local function isShield(uid) -- Function by Mock the bear.
	uid = uid or 0
	if getItemWeaponType(uid) == 4 then
		return true
	end
	return false
end
local function isBow(uid) -- Function by Mock the bear.
	uid = uid or 0
	if getItemWeaponType(uid) == 5 and not isItemStackable(uid) then
		return true
	end
	return false
end
function onUse(cid, item, fromPosition, itemEx, toPosition) -- Script by mock the bear (MTB)
	if item.uid == 0 or item.itemid == 0 then return false end
	toPosition.stackpos = 255
	if item.uid == 0 or item.itemid == 0 then return false end
	toPosition.stackpos = 255
    if isInArray(conf.ignoredIds, itemEx.itemid)
        or (not getItemWeaponType(itemEx.uid) or getItemWeaponType(itemEx.uid) > 5)
        or (getItemWeaponType(itemEx.uid) == 0 and not isArmor(itemEx))
        or itemEx.itemid == 0 or itemEx.type > 1 or isItemStackable(itemEx.uid) then
        doPlayerSendTextMessage(cid, 24,"You cant open a slot on this item.")
        return TRUE
    end
    if isCreature(itemEx.uid) then
        return FALSE
    end
	local nam = getItemName(itemEx.uid)
	function getper()
		local n = 1
		for i=1,10 do
			n = n+math.random(0,10)
			if n < 8*i then
				break
			end
		end
		return n
	end
	function getSlotCount(nam)
		local c = 0
		for _ in nam:gmatch('%[(.-)%]') do
			c = c+1
		end
		return c
	end
	if getSlotCount(nam) < conf.maxSlotCount then
		local l = choose('hp','mp','ml','cas','shield','dist')
		local p = getper()

		doSendMagicEffect(toPosition,30)
		nam = nam..' ['..l..'.+'..p..'%]'
		doSendAnimatedText(toPosition,l..' '..p..'%',120)
		doItemSetAttribute(itemEx.uid,'name',nam)
		doRemoveItem(item.uid,1)
	else
		doPlayerSendTextMessage(cid, 24,"You cant open a slot on this item.")
	end
	return true
end
And TO FINISH:
add this tag on creaturescripts.xml
Code:
<event type="login" name="SlotLogin" script="slot.lua"/>
and on creaturescripts/script/slot.lua
add this:
Lua:
 ---Script by mock the bear!
local conditionMP,conditionHP,conditionML,conditionCLUB,conditionSHI,conditionDIST,conditionAMP = {},{},{},{},{},{},{}
for i=1,100 do ---Carrega as conditions
	--- HP
	conditionHP[i] = createConditionObject(CONDITION_ATTRIBUTES)
	setConditionParam(conditionHP[i], CONDITION_PARAM_TICKS, -1)
	setConditionParam(conditionHP[i], CONDITION_PARAM_STAT_MAXHEALTHPERCENT, 100+i)
	setConditionParam(conditionHP[i], CONDITION_PARAM_BUFF, true)
	setConditionParam(conditionHP[i], CONDITION_PARAM_SUBID, 50)
	--MANA
	conditionMP[i] = createConditionObject(CONDITION_ATTRIBUTES)
	setConditionParam(conditionMP[i], CONDITION_PARAM_TICKS, -1)
	setConditionParam(conditionMP[i], CONDITION_PARAM_STAT_MAXMANAPERCENT, 100+i)
	setConditionParam(conditionMP[i], CONDITION_PARAM_BUFF, true)
	setConditionParam(conditionMP[i], CONDITION_PARAM_SUBID, 51)
	--Magic level
	conditionML[i] = createConditionObject(CONDITION_ATTRIBUTES)
	setConditionParam(conditionML[i], CONDITION_PARAM_TICKS, -1)
	setConditionParam(conditionML[i], CONDITION_PARAM_STAT_MAGICLEVELPERCENT, 100+i)
	setConditionParam(conditionML[i], CONDITION_PARAM_BUFF, true)
	setConditionParam(conditionML[i], CONDITION_PARAM_SUBID, 52)
	--club axe sword
	conditionCLUB[i] = createConditionObject(CONDITION_ATTRIBUTES)
	setConditionParam(conditionCLUB[i], CONDITION_PARAM_TICKS, -1)
	setConditionParam(conditionCLUB[i], CONDITION_PARAM_SKILL_CLUBPERCENT, 100+i)
	setConditionParam(conditionCLUB[i], CONDITION_PARAM_SKILL_SWORDPERCENT, 100+i)
	setConditionParam(conditionCLUB[i], CONDITION_PARAM_SKILL_AXEPERCENT, 100+i)
	setConditionParam(conditionCLUB[i], CONDITION_PARAM_BUFF, true)
	setConditionParam(conditionCLUB[i], CONDITION_PARAM_SUBID, 53)
	--- shield
	conditionSHI[i] = createConditionObject(CONDITION_ATTRIBUTES)
	setConditionParam(conditionSHI[i], CONDITION_PARAM_TICKS, -1)
	setConditionParam(conditionSHI[i], CONDITION_PARAM_SKILL_SHIELDPERCENT, 100+i)
	setConditionParam(conditionSHI[i], CONDITION_PARAM_BUFF, true)
	setConditionParam(conditionSHI[i], CONDITION_PARAM_SUBID, 54)
	--- dist
	conditionDIST[i] = createConditionObject(CONDITION_ATTRIBUTES)
	setConditionParam(conditionDIST[i], CONDITION_PARAM_TICKS, -1)
	setConditionParam(conditionDIST[i], CONDITION_PARAM_SKILL_DISTANCEPERCENT, 100+i)
	setConditionParam(conditionDIST[i], CONDITION_PARAM_BUFF, true)
	setConditionParam(conditionDIST[i], CONDITION_PARAM_SUBID, 55)
end
function getSlotType(n) --By mock the bear
	if not n then
		return false
	end
	if n:match('%[(.+)%]') then
		n = n:match('%[(.+)%]')
		if n == '?' then
			return 0,n
		else
			return n:match('(.-)%.([+-])(%d+)%%')
		end
	else
		return false
	end

end
local function loadSet(cid)
	local t = {}
	for slot=1,9 do
		t[slot] = ''

		local s = getPlayerSlotItem(cid,slot).uid
		if s ~= 0  then
			t[slot] = getItemName(s)
		end
	end
	return t
end
function isInArray2(arr,var) -- Because in some servers it return 1 and 0 and others true and false
	for i,b in pairs(arr) do
		if var == b then
			return true
		end
	end
	return false
end
function check2(cid,i)
	if i == 5 or i == 6 then
		if isInArray({'head','necklace','backpack','body','legs','feet','ring'},getItemValue(getPlayerSlotItem(cid,i).itemid,'slotType') or '') then
			return false
		end
	end
	return true
end
function chk(cid,f)
	if not isPlayer(cid) then return end
	local t = loadSet(cid)
	for i=1,#f do
		if f[i] ~= t[i] then
			equip(cid,nil,slot)
			break
		end
	end
	addEvent(chk,2000,cid,t)
end
items = { ---- Only to get attr: slotType because getItemName dont return it -.-'
	_VERSION='1.0 By mock',
	XML_DIR='data/items/items.xml',
	}
do
	local ia = os.clock()
	io.write('Loading items')
	local i = io.open(items.XML_DIR,'r')
	local u = i:read(-1)
	i:close()
	local u = u:match('<items>(.+)</items>')
	for mi,id,mid,name,data,me in u:gmatch('<(%a-)%s*id%s*=%s*"(%d+)"%s*(.-)%s*name%s*=%s*"(.-)"%s*>(.-)</(%a*)>') do
		if mi == 'item' and me == 'item' then
			local td = {name=name,id=id,type=1}
			for key,value in data:gmatch('<attribute key="(.-)" value="(.-)"/>') do
				td[key] = value
			end
			for key,value in mid:gmatch('(.-)="(.-)"') do
				td[key] = value
			end
			items[tonumber(id)] = td
			
			items[name] = td
		end
	end
	for mi,id,mid,name,data in u:gmatch('<(%a-)%s*id%s*=%s*"(%d*)"%s*(.-)%s*name%s*=%s*"(%a+)"%s*/>') do
		if mi == 'item' then
			local td = {name=name,id=id,type=2}
			for key,value in mid:gmatch('(.-)="(.-)"') do
				td[key] = value
			end
			items[tonumber(id)] = td
			items[name] = td
		end
	end
	io.write('[done '..os.clock()-ia..']\n')
end
function getItemValue(item,value)
	return items[item] and items[item][value]
end
function equip(cid,item,slot) --By mock the bear
	local HP = getCreatureHealth(cid)
	local MP = getCreatureMana(cid)
	local t = {}
	if item then
		local mm,sinal,qto = getSlotType(getItemName(item.uid))
		t[mm] = tonumber(qto)
	end
	for i=1,9 do -- Not on slot 10 > arrow
		if i ~= slot then
			if getPlayerSlotItem(cid,i).itemid ~= 0 then
				local aab = getPlayerSlotItem(cid,i).uid
				if aab and check2(cid,i) then
					for _ in getItemName(aab):gmatch('(%[.-%])') do
						local mm,sinal,qto2 = getSlotType(_)
						if mm then
							if not t[mm] then
								t[mm] = 0
							end
							t[mm] = t[mm]+tonumber(qto2)
							
							t[mm] = t[mm] > 100 and 100 or t[mm]
						end
					end
				end
			end
		end
	end
	local fu = 0
	local ca = {}
	local s = ''
	for sl,n in pairs(t) do
		fu = fu+1
		s = s..''..n..'% more of '..sl..'\n'
		if sl == 'hp' then
			doAddCondition(cid,conditionHP[tonumber(n)])
			doCreatureAddHealth(cid,HP-getCreatureHealth(cid))
			ca[50] = 1
			doPlayerSendTutorial(cid,19)
		elseif sl == 'mp' then
			doAddCondition(cid,conditionMP[tonumber(n)])
			doCreatureAddMana(cid,HP-getCreatureMana(cid))
			ca[51] = 1
			doPlayerSendTutorial(cid,19)
		elseif sl == 'ml' then
			doAddCondition(cid,conditionML[tonumber(n)])
			ca[52] = 1
		elseif sl == 'cas' then
			doAddCondition(cid,conditionCLUB[tonumber(n)])
			ca[53] = 1
		elseif sl == 'shield' then
			doAddCondition(cid,conditionSHI[tonumber(n)])
			ca[54] = 1
		elseif sl == 'dist' then
			doAddCondition(cid,conditionDIST[tonumber(n)])
			ca[55] = 1
		end
	end
	if fu > 0 then
		addEvent(doPlayerSendTextMessage,100,cid,24,'You have:\n'..s)
		for i=50,55 do
			if not ca[i] then
				doRemoveCondition(cid,CONDITION_ATTRIBUTES,i)
			end
		end
	else
		for i=50,55 do
			doRemoveCondition(cid,CONDITION_ATTRIBUTES,i)
		end
	end
	return true
end
function onLogin(cid) ---Script by mock the bear!
        equip(cid,nil,slot)
        addEvent(chk,2000,cid,loadSet(cid)) -- Here we check!
        return TRUE
end

Done :D

Bugs fixed.
*15:14 4th july
-Fixed bug of equip an armor in your hand.
-but i have to add a itemlib in script because
-function getItemInfo dont return item key slotType
 
Last edited:
@JuanC
if you refer "effects" to change HP, MANA, yes :p
But "effect" you put item on machine and open slot no.
 
Lua:
function choose(...) --- Function by mock.
        local arg = {...}
        return arg[math.random(1,#arg)]
end

where is this function in topic??
 
when i put an armor into my hand , still giving skills...
hey dude, how can i delete that type of "desc" like [ml.100%] , when i delete that bugs the script without error in the console but don't work
if you can , help pls
ty ,cya
very nice script
 
Lua:
 ---Script by mock the bear!
  local conditionMP,conditionHP,conditionML,conditionCLUB,conditionSHI,conditionDIST,conditionAMP = {},{},{},{},{},{},{}
for i=1,100 do ---Carrega as conditions

heh, where did you get the idea from?
 
@Coca Cola
yes i know, i am tring fix it.
do it:
setItemName(item.uid,getItemInfo(item.itemid).name)
@Cykotitan
all RPG game have slot system ^^
 
@cykotitan
Ahhhh ;D
because not evebody can unlock function
createCombatCondittion() to use insed script and not loading so i done this loop to create lots and lots of condittions to suppor too many combinations :p
@topic

FWT function getItemInfo dont return slotType ._.'

But equip armor on hand bug is fixed.
 
Hey Mock, I found a bug for you again :D

Everything works great, but it gives only the first bonus.
For example:
Code:
You see a magic plate armor [ml.+11%] [hp.+5%] [hp.+3%] (Arm:17).
It can only be wielded properly by mercenarys and archers.
It weighs 85.00 oz.
An enchanted gem glows on the plate armor.
ItemID: [2472].
Position: [X: 1001] [Y: 1009] [Z: 7].

It only gives that 10% mlvl : P
Anyway:
chuck.png


Love that pic : x
 
Last edited:
@mock
setItemName(item.uid,getItemInfo(item.itemid).name )
this don't let the script works
 
@Coca Cola
setItemName(item.uid,getItemInfo(item.itemid).name )
is to reset item
 
@squidy
17:05 You have:
11% more of ml
8% more of hp
17:05 You see a magic plate armor [ml.+11%] [hp.+5%] [hp.+3%] (Arm:17).
It weighs 85.00 oz.
An enchanted gem glows on the plate armor.
o0?
 
Back
Top