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

Action Perfect items upgrade 2.0 -- Slot sytem

it seems to add only ATK for shields, any possible fixes for that
 
Hmm.. what TFS and what client version? I use it on TFS 0.3.6pl1 with 8.54 client and work perfect! Thanks Mock!!
 
Well, here I use TFS 0.4dev exe 4069 + data 4029, cliente 8.7, the tibia.exe crashes '-'
 
Fix for tfs 0.4 and 0.2.9...

Code:
--- Perfect refine system by Mock the bear (MTB).
--- Email: [email][email protected][/email]
-- &a = weapon attack
-- &d = weapon defense
-- &s = shield defense
-- &p = armor defense
-- # = nivel do item
-- @ = max level
local gain = {
gainArmor='&p+(1)',loseArmor='&p-(1)',
gainShield='&s+#',loseShield='&s-(#+1)',
gainAttack='&a+(1*(#))',loseAttack='&a-(1*(#+1))',
gainDefense='&d+(1*(#))',loseDefense='&d-(1*(#+1))',
chance='(100/math.sqrt((((@/4)+(#*2))/@)*#))',
maxlvl = 17,
blocked_ids = {8881}
}
local it = {
--[itemid] = [percent]
[8306] = 0, -- 0% additional
[8305] = 100, -- 50%
}
if not setItemName then
    function setItemName(uid,name)
		return doItemSetAttribute(uid,'name',name)
    end
    function setItemArmor(uid,name)
		return doItemSetAttribute(uid,'armor',name)
    end
	function setItemDefense(uid,name)
		return doItemSetAttribute(uid,'defense',name)
	end
	function setItemAttack(uid,name)
		return doItemSetAttribute(uid,'attack',name)
	end
	function getItemAttack(uid)
		return getItemAttribute(uid,'attack')
	end
	function getItemDefense(uid)
		return getItemAttribute(uid,'defense')
	end
function getItemArmor(uid)
   if type(uid) == 'number' then
      return getItemAttribute(uid,'armor')
   else
      return getItemInfo(uid.itemid).armor
   end
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 then
		return true
	end
	return false
end
local function getWeaponLevel(uid) -- Function by Mock the bear.
   uid = uid or 0
   local name = getItemName(uid.uid) or getItemInfo(uid.itemid).name or ''
   local lvl = string.match(name,'%s%+(%d+)%s*')
   return tonumber(lvl) or 0
end
local function doTransform(s,i) -- Function by Mock the bear.
    local c = string.gsub(s,'@',gain.maxlvl)
    local c = string.gsub(c,'&a',(getItemAttack(i.uid) ~= 0 and getItemAttack(i.uid) or getItemInfo(i.itemid).attack))
    local c = string.gsub(c,'&d',(getItemDefense(i.uid) ~= 0 and getItemDefense(i.uid) or getItemInfo(i.itemid).defense))
    local c = string.gsub(c,'&s',(getItemDefense(i.uid) ~= 0 and getItemDefense(i.uid) or getItemInfo(i.itemid).defense))
    local c = string.gsub(c,'&p',(getItemArmor(i.uid) ~= 0 and getItemArmor(i.uid) or getItemInfo(i.itemid).armor))
    local c = string.gsub(c,'#',getWeaponLevel(i))
    local q = assert(loadstring('return '..c))
    return math.floor(assert(q()))
end
function onUse(cid, item, fromPosition, itemEx, toPosition)
         if item.uid == 0 or item.itemid == 0 then return false end
		 toPosition.stackpos = 255
         if isInArray(gain.blocked_ids, 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,22,"You cant refine this item.")
                return TRUE
         end
         if isCreature(itemEx.uid) == TRUE then
            return FALSE
         end
        local level = getWeaponLevel(itemEx)
        local chance = doTransform(gain.chance,itemEx)
		if level == gain.maxlvl then
			doSendMagicEffect(toPosition, 2)
            return doPlayerSendTextMessage(cid,22,"Your item is on max level, you can't upgrade it.")
		end
		doPlayerSendTextMessage(cid,22,"Trying refine with "..(chance+it[item.itemid] > 100 and 100 or chance+it[item.itemid]).."% of sucess!")
        if chance+it[item.itemid] >= math.random(0,100) then
			local nm = getItemName(itemEx.uid)
			local slot = nm:match('(%[.+%])') or '' ---If you server use slot system dont change it ^^
			slot = slot~='' and ' '..slot or slot
            setItemName(itemEx.uid, getItemNameById(itemEx.itemid)..' +'..(level+1)..slot)
            addEvent(doPlayerSendTextMessage,500,cid,22,"Your item has been upgrated to +"..(level+1)..slot..".")
            doSendMagicEffect(toPosition, 12)
            if isArmor(itemEx) then
				local get = doTransform(gain.gainArmor,itemEx)
				setItemArmor(itemEx.uid,get)
			elseif isBow(itemEx.uid) then
				setItemDefense(itemEx.uid, doTransform(gain.gainDefense,itemEx))
			elseif isWeapon(itemEx.uid) then
				setItemAttack(itemEx.uid, doTransform(gain.gainAttack,itemEx))
				setItemDefense(itemEx.uid, doTransform(gain.gainDefense,itemEx))
            elseif isShield(itemEx.uid) then
				setItemAttack(itemEx.uid, doTransform(gain.gainAttack,itemEx))
			end
        else
			if level == 0 then
				addEvent(doPlayerSendTextMessage,500,cid,22,"No effect.")
				doSendMagicEffect(toPosition, 2)
			elseif level > 0 then
			local nm = getItemName(itemEx.uid)
			local slot = nm:match('(%[.+%])') or '' ---If you server use slot system dont change it ^^
				slot = slot~='' and ' '..slot or slot
				if level == 1 then
					setItemName(itemEx.uid, getItemNameById(itemEx.itemid)..slot)
					addEvent(doPlayerSendTextMessage,500,cid,22,"Your item back to normal.")
				else
					setItemName(itemEx.uid, getItemNameById(itemEx.itemid)..' +'..(level-1)..slot)
					addEvent(doPlayerSendTextMessage,500,cid,22,"Your item back to +"..(level-1)..slot..".")
				end
				if isArmor(itemEx) then
					setItemArmor(itemEx.uid,doTransform(gain.loseArmor  ,itemEx))
				elseif isWeapon(itemEx.uid) then
					setItemAttack(itemEx.uid, doTransform(gain.loseAttack,itemEx))
					setItemDefense(itemEx.uid, doTransform(gain.loseDefense,itemEx))
				elseif isBow(itemEx.uid) then
					setItemAttack(itemEx.uid, doTransform(gain.loseAttack,itemEx))
				elseif isShield(itemEx.uid) then
					setItemDefense(itemEx.uid, doTransform(gain.loseShield,itemEx))
				end
			end
			doSendMagicEffect(toPosition, 9)
        end
	doRemoveItem(item.uid,1)
	return true
end

Fix:
- Client Error
- Bug Defence
 
Last edited:
Great script but original version doesn't work well. There are bugs in shield, ammunation and the others.
Now I've fixed version from man @2x up. Thanks and regards.

PS This script is really fuckin awesome, I'll use in my OT. ;)
 
When i upgrade an assassin star or any kind of spear then if I put it on the ground or take to the hand or backpack the upgrade lvl reset to 0 :(

Can someone fix it?
 
When i upgrade an assassin star or any kind of spear then if I put it on the ground or take to the hand or backpack the upgrade lvl reset to 0 :(

Can someone fix it?
it's a limitation of server engine :p stackable items can't keep attributes
 
Mock, can You remake it for 0.4 please? On 0.4 it's debugging
 
Test, if work msg me
Lua:
--- Perfect refine system by Mock the bear (MTB).
--- Email: [email][email protected][/email]
-- &a = weapon attack
-- &d = weapon defense
-- &s = shield defense
-- &p = armor defense
-- # = nivel do item
-- @ = max level
local gain = {
gainArmor='&p+(1)',loseArmor='&p-(1)',
gainShield='&s+#',loseShield='&s-(#+1)',
gainAttack='&a+(1*(#))',loseAttack='&a-(1*(#+1))',
gainDefense='&d+(1*(#))',loseDefense='&d-(1*(#+1))',
chance='(100/math.sqrt((((@/4)+(#*2))/@)*#))',
maxlvl = 17,
blocked_ids = {8881}
}
local it = {
--[itemid] = [percent]
[8306] = 0, -- 0% additional
[8305] = 100, -- 50%
}
if not setItemName then
    function setItemName(uid,name)
		return doItemSetAttribute(uid,'name',name)
    end
    function setItemArmor(uid,name)
		return doItemSetAttribute(uid,'armor',name)
    end
	function setItemDefense(uid,name)
		return doItemSetAttribute(uid,'defense',name)
	end
	function setItemAttack(uid,name)
		return doItemSetAttribute(uid,'attack',name)
	end
	function getItemAttack(uid)
		return getItemAttribute(uid,'attack')
	end
	function getItemDefense(uid)
		return getItemAttribute(uid,'defense')
	end
function getItemArmor(uid)
   if type(uid) == 'number' then
      return getItemAttribute(uid,'armor')
   else
      return getItemInfo(uid.itemid).armor
   end
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 then
		return true
	end
	return false
end
local function getWeaponLevel(uid) -- Function by Mock the bear.
   uid = uid or 0
   local name = getItemName(uid.uid) or getItemInfo(uid.itemid).name or ''
   local lvl = string.match(name,'%s%+(%d+)%s*')
   return tonumber(lvl) or 0
end
local function doTransform(s,i) -- Function by Mock the bear.
    local c = string.gsub(s,'@',gain.maxlvl)
    local c = string.gsub(c,'&a',(getItemAttack(i.uid) ~= 0 and getItemAttack(i.uid) or getItemInfo(i.itemid).attack))
    local c = string.gsub(c,'&d',(getItemDefense(i.uid) ~= 0 and getItemDefense(i.uid) or getItemInfo(i.itemid).defense))
    local c = string.gsub(c,'&s',(getItemDefense(i.uid) ~= 0 and getItemDefense(i.uid) or getItemInfo(i.itemid).defense))
    local c = string.gsub(c,'&p',(getItemArmor(i.uid) ~= 0 and getItemArmor(i.uid) or getItemInfo(i.itemid).armor))
    local c = string.gsub(c,'#',getWeaponLevel(i))
    local q = assert(loadstring('return '..c))
    return math.floor(assert(q()))
end
function onUse(cid, item, fromPosition, itemEx, toPosition)
         if item.uid == 0 or item.itemid == 0 then return false end
		 toPosition.stackpos = 255
         if isInArray(gain.blocked_ids, 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, MESSAGE_STATUS_WARNING,"You cant refine this item.")
                return TRUE
         end
         if isCreature(itemEx.uid) == TRUE then
            return FALSE
         end
        local level = getWeaponLevel(itemEx)
        local chance = doTransform(gain.chance,itemEx)
		if level == gain.maxlvl then
			doSendMagicEffect(toPosition, 2)
            return doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING,"Your item is on max level, you can't upgrade it.")
		end
		doPlayerSendTextMessage(cid, 24,"Trying refine with "..(chance+it[item.itemid] > 100 and 100 or chance+it[item.itemid]).."% of sucess!")
        if chance+it[item.itemid] >= math.random(0,100) then
			local nm = getItemName(itemEx.uid)
			local slot = nm:match('(%[.+%])') or '' ---If you server use slot system dont change it ^^
			slot = slot~='' and ' '..slot or slot
            setItemName(itemEx.uid, getItemNameById(itemEx.itemid)..' +'..(level+1)..slot)
            addEvent(doPlayerSendTextMessage,500,cid, MESSAGE_STATUS_WARNING,"Your item has been upgrated to +"..(level+1)..slot..".")
            doSendMagicEffect(toPosition, 12)
            if isArmor(itemEx) then
				local get = doTransform(gain.gainArmor,itemEx)
				setItemArmor(itemEx.uid,get)
			elseif isBow(itemEx.uid) then
				setItemAttack(itemEx.uid, doTransform(gain.gainAttack,itemEx))
			elseif isWeapon(itemEx.uid) then
				setItemAttack(itemEx.uid, doTransform(gain.gainAttack,itemEx))
				setItemDefense(itemEx.uid, doTransform(gain.gainDefense,itemEx))
            elseif isShield(itemEx.uid) then
				setItemDefense(itemEx.uid, doTransform(gain.gainShield,itemEx))
			end
        else
			if level == 0 then
				addEvent(doPlayerSendTextMessage,500,cid, MESSAGE_STATUS_WARNING,"No effect.")
				doSendMagicEffect(toPosition, 2)
			elseif level > 0 then
			local nm = getItemName(itemEx.uid)
			local slot = nm:match('(%[.+%])') or '' ---If you server use slot system dont change it ^^
				slot = slot~='' and ' '..slot or slot
				if level == 1 then
					setItemName(itemEx.uid, getItemNameById(itemEx.itemid)..slot)
					addEvent(doPlayerSendTextMessage,500,cid, MESSAGE_STATUS_WARNING,"Your item back to normal.")
				else
					setItemName(itemEx.uid, getItemNameById(itemEx.itemid)..' +'..(level-1)..slot)
					addEvent(doPlayerSendTextMessage,500,cid, MESSAGE_STATUS_WARNING,"Your item back to +"..(level-1)..slot..".")
				end
				if isArmor(itemEx) then
					setItemArmor(itemEx.uid,doTransform(gain.loseArmor  ,itemEx))
				elseif isWeapon(itemEx.uid) then
					setItemAttack(itemEx.uid, doTransform(gain.loseAttack,itemEx))
					setItemDefense(itemEx.uid, doTransform(gain.loseDefense,itemEx))
				elseif isBow(itemEx.uid) then
					setItemAttack(itemEx.uid, doTransform(gain.loseAttack,itemEx))
				elseif isShield(itemEx.uid) then
					setItemDefense(itemEx.uid, doTransform(gain.loseShield,itemEx))
				end
			end
			doSendMagicEffect(toPosition, 9)
        end
	doRemoveItem(item.uid,1)
	return true
end
 
Not working with shields on 0.4

Original:
22:27 You see a dragon shield (Def:31).
It weighs 60.00 oz.

Upgraded:
22:27 You see a dragon shield +3 (Atk:3, Def:31).
It weighs 60.00 oz.


EDIT:


Neverming, the problem was here:
---------------------------------------------------------------------------
local function isShield(uid) -- Function by Mock the bear.
uid = uid or 0
if getItemWeaponType(uid) == 5 (was 4, in new distro it changed) then
return true
end
return false
end
---------------------------------------------------------------------------
 
Last edited:
Back
Top