• 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 upgrade system (return nill)

darkmu

Well-Known Member
Joined
Aug 26, 2007
Messages
274
Solutions
1
Reaction score
50
Location
Paraná,Brazil
TFS 1.3

Lua:
local conf = {
   ["level"] = { [36038] = {  [1] = {successPercent = 99, downgradeLevel = 0, lossItem = false },
                             [2] = {successPercent = 99, downgradeLevel = 1, lossItem = false },
                             [3] = {successPercent = 99, downgradeLevel = 2, lossItem = false },
                             [4] = {successPercent = 99, downgradeLevel = 3, lossItem = true },
                             [5] = {successPercent = 99, downgradeLevel = 4, lossItem = true },
                             [6] = {successPercent = 99, downgradeLevel = 5, lossItem = true },
                             [7] = {successPercent = 99, downgradeLevel = 0, lossItem = true },
                             [8] = {successPercent = 99, downgradeLevel = 0, lossItem = true },
                             [9] = {successPercent = 99, downgradeLevel = 0, lossItem = true }, },
                          
                 [2164] = {  [1] = {successPercent = 99, downgradeLevel = 0, lossItem = false},
                             [2] = {successPercent = 99, downgradeLevel = 1, lossItem = false},
                             [3] = {successPercent = 99, downgradeLevel = 2, lossItem = false},
                             [4] = {successPercent = 99, downgradeLevel = 3, lossItem = false},
                             [5] = {successPercent = 99, downgradeLevel = 4, lossItem = false},
                             [6] = {successPercent = 99, downgradeLevel = 5, lossItem = true},
                             [7] = {successPercent = 99, downgradeLevel = 0, lossItem = true},
                             [8] = {successPercent = 99, downgradeLevel = 0, lossItem = true},
                             [9] = {successPercent = 99, downgradeLevel = 0, lossItem = true}, },
                            
                 [2166] = {  [1] = {successPercent = 99, downgradeLevel = 0, lossItem = false},
                             [2] = {successPercent = 99, downgradeLevel = 1, lossItem = false},
                             [3] = {successPercent = 99, downgradeLevel = 2, lossItem = false},
                             [4] = {successPercent = 99, downgradeLevel = 3, lossItem = false},
                             [5] = {successPercent = 99, downgradeLevel = 4, lossItem = false},
                             [6] = {successPercent = 99, downgradeLevel = 5, lossItem = false},
                             [7] = {successPercent = 99, downgradeLevel = 0, lossItem = true},
                             [8] = {successPercent = 99, downgradeLevel = 0, lossItem = true},
                             [9] = {successPercent = 99, downgradeLevel = 0, lossItem = true}, },
                            
  
 
    },
   ["upgrade"] = { -- how many percent attributes are rised?
     attack = 1, -- attack %
     defense = 1, -- defense %
     extraDefense = 1, -- extra defense %
     armor = 1, -- armor %
   }
}



-- // do not touch // --
-- Upgrading system by Azi [Ersiu] --
-- Edited for TFS 1.1 by Zbizu --

local upgrading = {
  upValue = function (value, level, percent)
  if value < 0 then return 0 end
     if level == 0 then return value end
     local nVal = value
     for i = 1, level do
       nVal = nVal + (math.ceil((nVal/100*percent)))
     end
  return nVal > 0 and nVal or value
  end,

  getLevel = function (item)
  local name = Item(item):getName():split('+')
     if (#name == 1) then
       return 0
     end
 
     return math.abs(name[2])
  end,
}
function onUse(cid, item, fromPosition, itemEx, toPosition)
  local it = conf["level"][itemEx.itemid]
  print(it)
  if not it then
    return false
  end
 
  if((it:getWeaponType() > 0 or getItemAttribute(itemEx.uid, ITEM_ATTRIBUTE_ARMOR) > 0))then
    local level = upgrading.getLevel(itemEx.uid)
    
    if(level < #conf["level"])then
    
    local nLevel = (conf["level"][(level+1)].successPercent >= math.random(1,100)) and (level+1) or conf["level"][level].downgradeLevel
    
        if(nLevel > level)then
            doSendMagicEffect(toPosition, CONST_ME_MAGIC_GREEN)
            doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Upgrade to level " .. nLevel .. " successful!")
        else
            doSendMagicEffect(toPosition, CONST_ME_BLOCKHIT)
            doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Upgrade failed. Your " .. it:getName() .. " is now on level " .. nLevel .. "")
        end
 
        doItemSetAttribute(itemEx.uid, ITEM_ATTRIBUTE_NAME, it:getName()..((nLevel>0) and "+"..nLevel or ""))
        doItemSetAttribute(itemEx.uid, ITEM_ATTRIBUTE_ATTACK,  upgrading.upValue(it:getAttack(), nLevel, conf["upgrade"].attack))
        doItemSetAttribute(itemEx.uid, ITEM_ATTRIBUTE_HITCHANCE, upgrading.upValue(it:getHitChance(), nLevel, conf["upgrade"].hitChance))
        doRemoveItem(item.uid, 1)
    else
        doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Your " .. it:getName() .. " is on max level alredy.")
    end
  else
    doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You cannot upgrade this item.")
  end
end

PRINT(it)
Return NILL why?
 
Solution
I think you should use item variable instead of itemEx.
item is a source item (stone)
itemEx is a target item (shield)


longer answer:
you have added action script to the stone (id 36038). When you use the stone on some item (here the shield) then the script upgrading.lua is executed. In the script, item variable is the source item (stone with id 36038) and itemEx is target item (in your example - shield). Shield for sure has different ItemID than the stone so you should decide what you want to keep in conf table.
  • If you would like to use it like conf["level"][shieldID] then you have to set proper id in conf table (not 36038 which is id of upgrading stone) and...
TFS 1.3

Lua:
local conf = {
   ["level"] = { [36038] = {  [1] = {successPercent = 99, downgradeLevel = 0, lossItem = false },
                             [2] = {successPercent = 99, downgradeLevel = 1, lossItem = false },
                             [3] = {successPercent = 99, downgradeLevel = 2, lossItem = false },
                             [4] = {successPercent = 99, downgradeLevel = 3, lossItem = true },
                             [5] = {successPercent = 99, downgradeLevel = 4, lossItem = true },
                             [6] = {successPercent = 99, downgradeLevel = 5, lossItem = true },
                             [7] = {successPercent = 99, downgradeLevel = 0, lossItem = true },
                             [8] = {successPercent = 99, downgradeLevel = 0, lossItem = true },
                             [9] = {successPercent = 99, downgradeLevel = 0, lossItem = true }, },
                        
                 [2164] = {  [1] = {successPercent = 99, downgradeLevel = 0, lossItem = false},
                             [2] = {successPercent = 99, downgradeLevel = 1, lossItem = false},
                             [3] = {successPercent = 99, downgradeLevel = 2, lossItem = false},
                             [4] = {successPercent = 99, downgradeLevel = 3, lossItem = false},
                             [5] = {successPercent = 99, downgradeLevel = 4, lossItem = false},
                             [6] = {successPercent = 99, downgradeLevel = 5, lossItem = true},
                             [7] = {successPercent = 99, downgradeLevel = 0, lossItem = true},
                             [8] = {successPercent = 99, downgradeLevel = 0, lossItem = true},
                             [9] = {successPercent = 99, downgradeLevel = 0, lossItem = true}, },
                          
                 [2166] = {  [1] = {successPercent = 99, downgradeLevel = 0, lossItem = false},
                             [2] = {successPercent = 99, downgradeLevel = 1, lossItem = false},
                             [3] = {successPercent = 99, downgradeLevel = 2, lossItem = false},
                             [4] = {successPercent = 99, downgradeLevel = 3, lossItem = false},
                             [5] = {successPercent = 99, downgradeLevel = 4, lossItem = false},
                             [6] = {successPercent = 99, downgradeLevel = 5, lossItem = false},
                             [7] = {successPercent = 99, downgradeLevel = 0, lossItem = true},
                             [8] = {successPercent = 99, downgradeLevel = 0, lossItem = true},
                             [9] = {successPercent = 99, downgradeLevel = 0, lossItem = true}, },
                          


    },
   ["upgrade"] = { -- how many percent attributes are rised?
     attack = 1, -- attack %
     defense = 1, -- defense %
     extraDefense = 1, -- extra defense %
     armor = 1, -- armor %
   }
}



-- // do not touch // --
-- Upgrading system by Azi [Ersiu] --
-- Edited for TFS 1.1 by Zbizu --

local upgrading = {
  upValue = function (value, level, percent)
  if value < 0 then return 0 end
     if level == 0 then return value end
     local nVal = value
     for i = 1, level do
       nVal = nVal + (math.ceil((nVal/100*percent)))
     end
  return nVal > 0 and nVal or value
  end,

  getLevel = function (item)
  local name = Item(item):getName():split('+')
     if (#name == 1) then
       return 0
     end

     return math.abs(name[2])
  end,
}
function onUse(cid, item, fromPosition, itemEx, toPosition)
  local it = conf["level"][itemEx.itemid]
  print(it)
  if not it then
    return false
  end

  if((it:getWeaponType() > 0 or getItemAttribute(itemEx.uid, ITEM_ATTRIBUTE_ARMOR) > 0))then
    local level = upgrading.getLevel(itemEx.uid)
  
    if(level < #conf["level"])then
  
    local nLevel = (conf["level"][(level+1)].successPercent >= math.random(1,100)) and (level+1) or conf["level"][level].downgradeLevel
  
        if(nLevel > level)then
            doSendMagicEffect(toPosition, CONST_ME_MAGIC_GREEN)
            doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Upgrade to level " .. nLevel .. " successful!")
        else
            doSendMagicEffect(toPosition, CONST_ME_BLOCKHIT)
            doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Upgrade failed. Your " .. it:getName() .. " is now on level " .. nLevel .. "")
        end

        doItemSetAttribute(itemEx.uid, ITEM_ATTRIBUTE_NAME, it:getName()..((nLevel>0) and "+"..nLevel or ""))
        doItemSetAttribute(itemEx.uid, ITEM_ATTRIBUTE_ATTACK,  upgrading.upValue(it:getAttack(), nLevel, conf["upgrade"].attack))
        doItemSetAttribute(itemEx.uid, ITEM_ATTRIBUTE_HITCHANCE, upgrading.upValue(it:getHitChance(), nLevel, conf["upgrade"].hitChance))
        doRemoveItem(item.uid, 1)
    else
        doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Your " .. it:getName() .. " is on max level alredy.")
    end
  else
    doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You cannot upgrade this item.")
  end
end

PRINT(it)
Return NILL why?
Not sure why it's printing nil. (unless the item you're using it on isn't in your table)

But if you bring the scope of the table down to exactly what you're printing, you'll see why it fails.

Lua:
local conf = {
    ["level"] = {
        [36038] = {
            [1] = {
                successPercent = 99,
                downgradeLevel = 0,
                lossItem = false
            }
        }
    }
}

print(conf["level"][36038])
Lua:
-- Console Output
table: 0xabc870
 
Not sure why it's printing nil. (unless the item you're using it on isn't in your table)

But if you bring the scope of the table down to exactly what you're printing, you'll see why it fails.

Lua:
local conf = {
    ["level"] = {
        [36038] = {
            [1] = {
                successPercent = 99,
                downgradeLevel = 0,
                lossItem = false
            }
        }
    }
}

print(conf["level"][36038])
Lua:
-- Console Output
table: 0xabc870
1611924525663.png


BUT..
1611924608107.png

1611924572693.png
1611924542754.png
USE WITH ON SHIELD
1611924673003.png
1611924632251.png
 
I think you should use item variable instead of itemEx.
item is a source item (stone)
itemEx is a target item (shield)


longer answer:
you have added action script to the stone (id 36038). When you use the stone on some item (here the shield) then the script upgrading.lua is executed. In the script, item variable is the source item (stone with id 36038) and itemEx is target item (in your example - shield). Shield for sure has different ItemID than the stone so you should decide what you want to keep in conf table.
  • If you would like to use it like conf["level"][shieldID] then you have to set proper id in conf table (not 36038 which is id of upgrading stone) and conf["level"][itemEx.itemid] will work properly.
  • Otherwise if you decided to keep stone id in conf table (36038) then you can access it using item variable, like that conf["level"][item.itemid].
Both versions are different. In the first case your config will be base on target item and will look like this:
Code:
local conf = {
    "level" = {
        [SWORD_ID] = { ... },
        [AXE_ID] = { ... },
        [SHIELD_ID] = { ... },
        [BOW_ID] = { ... }
    }
}

The second option will be based on upgrading stone you use:
Code:
local conf = {
    "level" = {
        [STONE_X_ID] = { ... },
        [STONE_Y_ID] = { ... }
    }
}
 
Last edited:
Solution
Back
Top