• 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 Error on my upgrade system

golaf

New Member
Joined
Jul 17, 2013
Messages
3
Reaction score
0
I have the Mock the bear upgrade system for my server (8.60), i tried to make some mods but when i 'finish' it tells me that something is wrong with my arguments (the third argument) on the function gsub, please, if you can, some help would be appreciated, i know its something very basic.

Code:
--- Perfect refine system by Mock the bear (MTB).
--- Email: <a href="mailto:[email protected]">[email protected]</a>
-- &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)',
gainBowAtt='&t+(3)',loseBowAtt='&t-(3)',
[COLOR="#FF0000"][B]gainAtt='&u+(1)',loseAtt='&u-(1)',[/B][/COLOR]
gainShield='&s+2',loseShield='&s-(2)',
gainAttack='&a+(2)',loseAttack='&a-(2)',
gainDefense='&d+(2)',loseDefense='&d-(2)',
chance='(100/math.sqrt((((@/4)+(#*2))/@)*#))',
maxlvl = 10,
blocked_ids = {8881}
}
local it = {
--[itemid] = [percent]
[2149] = 0, -- 0% additional
[8305] = 100, -- 50%
}

    function setItemName(uid,name)
                return doItemSetAttribute(uid,'name',name)
    end
    function setItemArmor(uid,name)
                return doItemSetAttribute(uid,'armor',name)
    end
[COLOR="#FF0000"][B]    function setItemAbsorbPercent(uid,name)
                return doItemSetAttribute(uid,'absorbPercentAll',name)
    end[/B][/COLOR]
        function setItemDefense(uid,name)
                return doItemSetAttribute(uid,'defense',name)
        end
        function setItemHitChance(uid,name)
                return doItemSetAttribute(uid,'maxHitChance',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
[COLOR="#FF0000"][B]        function getItemAbsorbPercent(uid)
                return getItemAttribute(uid,'absorbPercentAll')
		end[/B][/COLOR]
        function getItemHitChance(uid)
                return getItemAttribute(uid,'maxHitChance')
        end
function getItemArmor(uid)
   if type(uid) == 'number' then
      return getItemAttribute(uid,'armor')
   else
      return getItemInfo(uid.itemid).armor
   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,'&t',(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))
[COLOR="#FF0000"][B]    local c = string.gsub(c,'&u',(getItemAbsorbPercent(i.uid) ~= 0 and getItemAbsorbPercent(i.uid) or getItemInfo(i.itemid).absorbPercentAll))[/B][/COLOR]
    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, 24,"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, 24,"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 success!")
        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, 24,"Your item has been upgraded to +"..(level+1)..slot..".")
            doSendMagicEffect(toPosition, 12)
            if isArmor(itemEx) then
                                local get = doTransform(gain.gainArmor,itemEx)
                                setItemArmor(itemEx.uid,get)
[COLOR="#FF0000"][B]                                setItemAbsorbPercent(itemEx.uid,doTransform(gain.gainAtt,itemEx))[/B]
[/COLOR]                        elseif isBow(itemEx.uid) then
                                setItemAttack(itemEx.uid, doTransform(gain.gainBowAtt,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, 24,"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, 24,"Your item back to normal.")
                                else
                                        setItemName(itemEx.uid, getItemNameById(itemEx.itemid)..' +'..(level-1)..slot)
                                        addEvent(doPlayerSendTextMessage,500,cid, 24,"Your item back to +"..(level-1)..slot..".")
                                end
                                if isArmor(itemEx) then
                                        setItemArmor(itemEx.uid,doTransform(gain.loseArmor,itemEx))
[COLOR="#FF0000"][B]                                        setItemAbsorbPercent(itemEx.uid,doTransform(gain.loseAtt,itemEx))[/B]
[/COLOR]                                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.loseBowAtt,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

I remarked all the new functions i added to make this thing work, the idea is, for each upgrade, upgrade the absorb percentile of all elements in +1%.
 
Last edited:
Hey dchampag, what about getItemInfo ? (it won't workout neither), that is what i get from an attribute at some armor at my items.xml

<attribute key="absorbPercentAll" value="5" />

So it does exists, but i don't know how to 'trigger it' or it's just impossible at 8.60?
 
No it only exists for items.xml it is not possible with lua functions unless you source edit the attributes function for lua and add it like the other attributes. I'm not sure why it wasnt added, maybe because the server may not save that attribute to blob of item conditions/attributes so it just reads it from items.xml and that's how it works that way.
 
Back
Top