• 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 How to set this text in the end?

leol

New Member
Joined
Apr 2, 2017
Messages
17
Reaction score
0
I found this Upgrade System here on forum...
It change weapon atk/def and change the name...
It's almost perfect to me but i would like to change one thing:

When you upgrade a item, for example Rapier:

When you upgrade de rapier it name change to:
Bronze Rapier

I would like to change to:
Rapier Bronze

You know? Atribute in the end!

Upgrade script (/lib):
Code:
--PERFECT UPGRADE SYSTEM
    UpgradeHandler = {
        nameLv = {
            [1] = "bronze",
            [2] = "silver",
            [3] = "gold"
        },
        levels = {
              [1] = {50, false, false},
              [2] = {20, false, false},
              [3] = {10, true, true}
        },
        broadcast = 4,
        attributes = {
              ["attack"] = 3,
              ["defense"] = 2,
              ["armor"] = 1
        },
        message = {
              console = "Trying to refine %s to level +%s with %s%% success rate.",
              success = "You have upgraded %s to level +%s",
              fail = "You have failed in upgrade of %s to level +%s",
              downgrade = "The upgrade level of %s has downgraded to +%s",
              erase = "The upgrade level of %s has been erased.",
              maxlevel = "The targeted %s is already on max upgrade level.",
              notupgradeable = "This item is not upgradeable.",
              broadcast = "The player %s was successful in upgrading %s to level +%s.\nCongratulations!!",
              invalidtool = "This is not a valid upgrade tool.",
              toolrange = "This upgrade tool can only be used in items with level between +%s and +%s"
        },
        tools = {
            [8306] = {range = {0, 10}, info = {chance = 0, removeable = true}},
            [8300] = {range = {0, 10}, info = {chance = 20, removeable = true}}
        },
        isEquipment = function(self)
            local weaponType = self:getItemWeaponType()
            return ((weaponType > 0 and weaponType < 8) or self.item.armor ~= 0)
        end,
        setItemName = function(self, name)
            return doItemSetAttribute(self.item.uid, "name", name)
        end,
        chance = function(self)
            local chances = {}
            chances.upgrade = (self.levels[self.item.level + 1][1] or 100)
            chances.downgrade = (self.item.level * 5)
            chances.erase = (self.item.level * 3)
            return chances
        end
    }
    function UpgradeHandler:new(item)
        local obj, ret = {}
        obj.item = {}
        obj.item.level = 0
        obj.item.uid = item.uid
        for key, value in pairs(getItemInfo(item.itemid)) do
            obj.item[key] = value
        end
        ret = setmetatable(obj, {
            __index = function(self, index)
                if _G[index] then
                    return (setmetatable({callback = _G[index]},
                        {__call = function(self, ...)
                            return self.callback(item.uid, ...)
                        end}
                    ))
                else
                    return UpgradeHandler[index]
                end
        end})
        if ret:isEquipment() then
            ret:update()
            return ret
        end
        return false
    end
    function UpgradeHandler:update()
       -- this will return the level by the quality or 0 if it has no quality.
        self.item.level = 0
        for r, v in ipairs(self.nameLv) do
            if self:getItemName():find(v) then
                self.item.level = r
            end
        end
    end
    function UpgradeHandler:refine(uid, item)
        if not self.item then
            doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_BLUE, self.message.notupgradeable)
            return "miss"
        end
        local tool = self.tools[item.itemid]
        if(tool == nil) then
            doPlayerSendTextMessage(uid, MESSAGE_EVENT_DEFAULT, self.message.invalidtool)
            return "miss"
        end
        if(self.item.level > #self.levels) then
            doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.maxlevel:format(self.item.name))
            return "miss"
        end
        if(tool.range[1] and self.item.level < tool.range[1]) or (tool.range[2] and self.item.level >= tool.range[2]) then
            doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.toolrange:format(unpack(tool.range)))
            return "miss"
        end
        local chance = (self:chance().upgrade + tool.info.chance)
        doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_BLUE, self.message.console:format(self.item.name, (self.item.level + 1), math.min(100, chance)))
        if(tool.info.removeable == true) then
            doRemoveItem(item.uid, 1)
        end
        if chance * 100 > math.random(1, 10000) then
            doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_ORANGE, self.message.success:format(self.item.name, (self.item.level + 1)))
            if (self.item.level + 1) >= self.broadcast then
                doBroadcastMessage(self.message.broadcast:format(getCreatureName(uid), self.item.name, (self.item.level + 1)))
            end
            -- it says if the item's level is greater then 0 (meaning is level equal to 1 or more) if it is add 1 more
            -- if the current level equals 0 add 1 to it
            self:setItemName(self.item.level > 0 and self.nameLv[self.item.level + 1].." "..(self:getItemName():gsub(self.nameLv[self.item.level].." ", "")) or self.nameLv[1].." "..self:getItemName())
            for key, value in pairs(self.attributes) do
                if getItemAttribute(self.item.uid, key) ~= nil or self.item[key] ~= 0 then
                    doItemSetAttribute(self.item.uid, key, (self.item.level > 0 and getItemAttribute(self.item.uid, key) or self.item[key]) + value)
                end
            end
            return "success"
        else
            if item.itemid == 8300 then
                if self.item.level > 0 then
                    -- this will remove any number with a + sign in front of it from the string
                    self:setItemName(self:getItemName():gsub((self.nameLv[self.item.level].." "), ""))
                    for key, value in pairs(self.attributes) do
                        if getItemAttribute(self.item.uid, key) ~= nil or self.item[key] ~= 0 then
                            doItemSetAttribute(self.item.uid, key, getItemAttribute(self.item.uid, key) - self.item.level * value)
                        end
                    end
                end
            else
                doRemoveItem(self.item.uid, 1)
            end
            doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_BLUE, item.itemid == 8300 and "Your item level has been reseted." or "You have broken your item while trying to upgrade it.")
        end
    end

Is this something i need to change here?
Code:
self:setItemName(self:getItemName():gsub((self.nameLv[self.item.level].." "), ""))

Anybody know this?
 
Last edited:
self:setItemName(self.item.level > 0 and self.nameLv[self.item.level + 1].." "..(self:getItemName():gsub(self.nameLv[self.item.level].." ", "")) or self.nameLv[1].." "..self:getItemName())

Try changing that for this:
Code:
self:setItemName(((self:getItemName():gsub(" "..self.nameLv[self.item.level], "")) or self:getItemName().." "..self.nameLv[1]).." "..self.item.level > 0 and self.nameLv[self.item.level + 1])
 
Try changing that for this:
Code:
self:setItemName(((self:getItemName():gsub(" "..self.nameLv[self.item.level], "")) or self:getItemName().." "..self.nameLv[1]).." "..self.item.level > 0 and self.nameLv[self.item.level + 1])

Is not working bro
Code:
[20:16:34.862] [Error - Action Interface]
[20:16:34.862] data/actions/scripts/upgrade.lua:onUse
[20:16:34.862] Description:
[20:16:34.862] data/lib/upgradesystem.lua:126: attempt to concatenate field '?' (a nil value)
[20:16:34.862] stack traceback:
[20:16:34.862]    data/lib/upgradesystem.lua:126: in function 'refine'
[20:16:34.862]    data/actions/scripts/upgrade.lua:11: in function <data/actions/scripts/upgrade.lua:1>
 
Untested.
Replace this line:
Code:
self:setItemName(self.item.level > 0 and self.nameLv[self.item.level + 1].." "..(self:getItemName():gsub(self.nameLv[self.item.level].." ", "")) or self.nameLv[1].." "..self:getItemName())


With this:
Code:
self:setItemName(self.item.level > 0 and (self:getItemName():gsub(self.nameLv[self.item.level].." ", "")).." "..self.nameLv[self.item.level + 1] or self:getItemName().." "..self.nameLv[1])

And this line:
Code:
self:setItemName(self:getItemName():gsub((self.nameLv[self.item.level].." "), ""))

With this:
Code:
self:setItemName(self:getItemName():gsub((" "..self.nameLv[self.item.level]), ""))
 
Untested.
Replace this line:
Code:
self:setItemName(self.item.level > 0 and self.nameLv[self.item.level + 1].." "..(self:getItemName():gsub(self.nameLv[self.item.level].." ", "")) or self.nameLv[1].." "..self:getItemName())


With this:
Code:
self:setItemName(self.item.level > 0 and (self:getItemName():gsub(self.nameLv[self.item.level].." ", "")).." "..self.nameLv[self.item.level + 1] or self:getItemName().." "..self.nameLv[1])

And this line:
Code:
self:setItemName(self:getItemName():gsub((self.nameLv[self.item.level].." "), ""))

With this:
Code:
self:setItemName(self:getItemName():gsub((" "..self.nameLv[self.item.level]), ""))


Now it's working only one time, for example:
If I upgrade 1 time show:
rapier bronze

but if i do 2 times, not is showing
rapier silver

is showing rapier bronze silver
 
lol woops

Replace
Code:
self:setItemName(self.item.level > 0 and (self:getItemName():gsub(self.nameLv[self.item.level].." ", "")).." "..self.nameLv[self.item.level + 1] or self:getItemName().." "..self.nameLv[1])

with:
Code:
self:setItemName(self.item.level > 0 and (self:getItemName():gsub(..self.nameLv[self.item.level]" ", "")).." "..self.nameLv[self.item.level + 1] or self:getItemName().." "..self.nameLv[1])
 
lol woops

Replace
Code:
self:setItemName(self.item.level > 0 and (self:getItemName():gsub(self.nameLv[self.item.level].." ", "")).." "..self.nameLv[self.item.level + 1] or self:getItemName().." "..self.nameLv[1])

with:
Code:
self:setItemName(self.item.level > 0 and (self:getItemName():gsub(..self.nameLv[self.item.level]" ", "")).." "..self.nameLv[self.item.level + 1] or self:getItemName().." "..self.nameLv[1])

Code:
[10:56:31.631] >> Opening logs
[Error - LuaInterface::loadFile] data/lib/upgradesystem.lua:115: unexpected symbol near '..'

115 is
Code:
self:setItemName(self.item.level > 0 and (self:getItemName():gsub(..self.nameLv[self.item.level]" ", "")).." "..self.nameLv[self.item.level + 1] or self:getItemName().." "..self.nameLv[1])
 
Code:
[10:56:31.631] >> Opening logs
[Error - LuaInterface::loadFile] data/lib/upgradesystem.lua:115: unexpected symbol near '..'

115 is
Code:
self:setItemName(self.item.level > 0 and (self:getItemName():gsub(..self.nameLv[self.item.level]" ", "")).." "..self.nameLv[self.item.level + 1] or self:getItemName().." "..self.nameLv[1])

bump
 
So in the end it should all look like this.
You really need to be trying to learn this yourself, as the errors I'm wasting time correcting here are pretty basic.

Replace this line (116):
Code:
self:setItemName(self.item.level > 0 and self.nameLv[self.item.level + 1].." "..(self:getItemName():gsub(self.nameLv[self.item.level].." ", "")) or self.nameLv[1].." "..self:getItemName())

With this:
Code:
self:setItemName(self.item.level > 0 and (self:getItemName():gsub(self.nameLv[self.item.level], ""))..self.nameLv[self.item.level + 1] or self:getItemName().." "..self.nameLv[1])


And this line (127):
Code:
self:setItemName(self:getItemName():gsub((self.nameLv[self.item.level].." "), ""))

With this:
Code:
self:setItemName(self:getItemName():gsub((" "..self.nameLv[self.item.level]), ""))


Tested and working fine.
Run this code on the LUA DEMO website to simulate how the script works to try and get your head around it:
Code:
-- SIMULATION OF OPS SCRIPT
-- set currentLevel to a value between 0-2
currentLevel = 0
nameLv = {[1] = "bronze", [2] = "silver",[3] = "gold"}
itemName = (currentLevel > 0 and "weapon".." "..nameLv[currentLevel] or "weapon")

if currentLevel <= 2 then
     result = (currentLevel > 0 and (itemName:gsub(nameLv[currentLevel],""))..nameLv[currentLevel + 1] or itemName.." "..nameLv[1])
else
     return print("You cannot upgrade this item past gold.")
end

print("Previous item name:\t"..itemName)
print("New item name:\t\t"..result)

The a and b or c operator probably confuses you a little.

self.item.level > 0 and self:getItemName():gsub(self.nameLv[self.item.level], ""))..self.nameLv[self.item.level + 1] or self:getItemName().." "..self.nameLv[1]
If you read and understand how it works:

Then this script will be a lot easier for you to edit in the future.
 
Last edited:
So in the end it should all look like this.
You really need to be trying to learn this yourself, as the errors I'm wasting time correcting here are pretty basic.

Replace this line (116):
Code:
self:setItemName(self.item.level > 0 and self.nameLv[self.item.level + 1].." "..(self:getItemName():gsub(self.nameLv[self.item.level].." ", "")) or self.nameLv[1].." "..self:getItemName())

With this:
Code:
self:setItemName(self.item.level > 0 and (self:getItemName():gsub(self.nameLv[self.item.level], ""))..self.nameLv[self.item.level + 1] or self:getItemName().." "..self.nameLv[1])


And this line (127):
Code:
self:setItemName(self:getItemName():gsub((self.nameLv[self.item.level].." "), ""))

With this:
Code:
self:setItemName(self:getItemName():gsub((" "..self.nameLv[self.item.level]), ""))


Tested and working fine.
Run this code on the LUA DEMO website to simulate how the script works to try and get your head around it:
Code:
-- SIMULATION OF OPS SCRIPT
-- set currentLevel to a value between 0-2
currentLevel = 0
nameLv = {[1] = "bronze", [2] = "silver",[3] = "gold"}
itemName = (currentLevel > 0 and "weapon".." "..nameLv[currentLevel] or "weapon")

if currentLevel <= 2 then
     result = (currentLevel > 0 and (itemName:gsub(nameLv[currentLevel],""))..nameLv[currentLevel + 1] or itemName.." "..nameLv[1])
else
     return print("You cannot upgrade this item past gold.")
end

print("Previous item name:\t"..itemName)
print("New item name:\t\t"..result)

The a and b or c operator probably confuses you a little.

self.item.level > 0 and self:getItemName():gsub(self.nameLv[self.item.level], ""))..self.nameLv[self.item.level + 1] or self:getItemName().." "..self.nameLv[1]
If you read and understand how it works:

Then this script will be a lot easier for you to edit in the future.


Thank you so much!

Edit:
@Leo32 i've tried to use so many times to test if any error would print in console...
Script is working fine:
But it printing this error on console after using stones 8306 and 8300 so many times...
Did u know what would be this error?

Code:
[14:6:29.562] [Error - Action Interface]
[14:6:29.562] data/actions/scripts/upgrade.lua:onUse
[14:6:29.562] Description:
[14:6:29.562] data/lib/upgradesystem.lua:44: attempt to index field '?' (a nil value)
[14:6:29.562] stack traceback:
[14:6:29.562]    data/lib/upgradesystem.lua:44: in function 'chance'
[14:6:29.562]    data/lib/upgradesystem.lua:103: in function 'refine'
[14:6:29.562]    data/actions/scripts/upgrade.lua:11: in function <data/actions/scripts/upgrade.lua:1>

[14:6:30.515] [Error - Action Interface]
[14:6:30.515] data/actions/scripts/upgrade.lua:onUse
[14:6:30.515] Description:
[14:6:30.515] data/lib/upgradesystem.lua:44: attempt to index field '?' (a nil value)
[14:6:30.515] stack traceback:
[14:6:30.515]    data/lib/upgradesystem.lua:44: in function 'chance'
[14:6:30.515]    data/lib/upgradesystem.lua:103: in function 'refine'
[14:6:30.515]    data/actions/scripts/upgrade.lua:11: in function <data/actions/scripts/upgrade.lua:1>

44
Code:
chances.upgrade = (self.levels[self.item.level + 1][1] or 100)

103
Code:
local chance = (self:chance().upgrade + tool.info.chance)

11
Code:
[3] = {10, true, true}
 
Last edited:
Thank you so much!

Edit:
@Leo32 i've tried to use so many times to test if any error would print in console...
Script is working fine:
But it printing this error on console after using stones 8306 and 8300 so many times...
Did u know what would be this error?

Code:
[14:6:29.562] [Error - Action Interface]
[14:6:29.562] data/actions/scripts/upgrade.lua:onUse
[14:6:29.562] Description:
[14:6:29.562] data/lib/upgradesystem.lua:44: attempt to index field '?' (a nil value)
[14:6:29.562] stack traceback:
[14:6:29.562]    data/lib/upgradesystem.lua:44: in function 'chance'
[14:6:29.562]    data/lib/upgradesystem.lua:103: in function 'refine'
[14:6:29.562]    data/actions/scripts/upgrade.lua:11: in function <data/actions/scripts/upgrade.lua:1>

[14:6:30.515] [Error - Action Interface]
[14:6:30.515] data/actions/scripts/upgrade.lua:onUse
[14:6:30.515] Description:
[14:6:30.515] data/lib/upgradesystem.lua:44: attempt to index field '?' (a nil value)
[14:6:30.515] stack traceback:
[14:6:30.515]    data/lib/upgradesystem.lua:44: in function 'chance'
[14:6:30.515]    data/lib/upgradesystem.lua:103: in function 'refine'
[14:6:30.515]    data/actions/scripts/upgrade.lua:11: in function <data/actions/scripts/upgrade.lua:1>

44
Code:
chances.upgrade = (self.levels[self.item.level + 1][1] or 100)

103
Code:
local chance = (self:chance().upgrade + tool.info.chance)

11
Code:
[3] = {10, true, true}


@Leo32 is this errors because of this 2 true's, i dont got what is this trues/falses...
[3] = {10, true, true}

Did u know?

(thank you to your helps)
 
Back
Top