Ir para conteúdo

Trocar +1,+2,+3 por nomes nesse script refin [10 reps]

Featured Replies

Postado
  • Autor
Em 05/02/2016 at 11:12, xWhiteWolf disse:

Testa assim, acredito que possa dar erro ao tentar dar upgrade em um item Épico caso as outras checagens do script falhem, mas a lógica tá impecável:
 

  Mostrar conteúdo oculto


--PERFECT UPGRADE SYSTEM

    UpgradeHandler = {
		nameLv = {
		    [1] = "UNIQ",
		    [2] = "RARE",
		    [3] = "EPIC"
	    },
        levels = {
              [1] = {50, false, false},
              [2] = {20, false, false},
              [3] = {10, true, true}
        },
        broadcast = 3,
        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 = 0, removeable = true}}
        },
        isEquipment = function(self)
            local weaponType = self:getItemWeaponType()
            return ((weaponType > 0 and weaponType < 7) 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(self.item.level < tool.range[1] or 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

 




Edit: entra nesse site aqui https://repl.it/languages/Lua/
e coloca esse código na caixa à esquerda e clica em Run ►

 


local itemname = "UNIQ KATANA"

nameLv = {
		    [1] = "UNIQ",
		    [2] = "RARE",
		    [3] = "EPIC"
	    }

lvl = 0
		for r, v in ipairs(nameLv) do
		    if itemname:find(v) then
		        lvl = r
		    end
	end
	
print("O level atual do item é: "..lvl)

if lvl >= #nameLv then print("O item não pode ser mais customizado.") else
local a = lvl > 0 and nameLv[lvl + 1].." "..itemname:gsub((nameLv[lvl].." "), "") or nameLv[1].." "..itemname
print("Após a customização o item ficará como: ".. a)
end

Apenas mudando o nome do item ali em cima vc consegue simular oque aconteceria no script;

 

 

White, depois de todo esse tempo testando o ot sozinho, ontem testando com uns amigos todo mundo refinando uma hora deu um erro e depois ninguem mais conseguiu refinar...

 

Pelo que eu entendi o problema é no return "sucess", mas ta certinho não ta?


Sabe me dizer o que pode ser?

 

Error

[23:57:13.709] [Error - Action Interface]
[23:57:13.709] data/actions/scripts/upgrade.lua:onUse
[23:57:13.709] Description:
[23:57:13.709] data/lib/upgradesystem.lua:108: attempt to index a boolean value
[23:57:13.709] stack traceback:
[23:57:13.710]    data/lib/upgradesystem.lua:108: in function 'refine'
[23:57:13.710]    data/actions/scripts/upgrade.lua:12: in function <data/actions/scripts/upgrade.lua:1>

[23:57:19.666] [Error - Action Interface]
[23:57:19.666] data/actions/scripts/upgrade.lua:onUse
[23:57:19.666] Description:
[23:57:19.667] data/lib/upgradesystem.lua:108: attempt to index a boolean value
[23:57:19.667] stack traceback:
[23:57:19.667]    data/lib/upgradesystem.lua:108: in function 'refine'
[23:57:19.667]    data/actions/scripts/upgrade.lua:12: in function <data/actions/scripts/upgrade.lua:1>

[23:57:28.575] [Error - Action Interface]
[23:57:28.575] data/actions/scripts/upgrade.lua:onUse
[23:57:28.575] Description:
[23:57:28.575] data/lib/upgradesystem.lua:108: attempt to index a boolean value
[23:57:28.575] stack traceback:
[23:57:28.575]    data/lib/upgradesystem.lua:108: in function 'refine'
[23:57:28.575]    data/actions/scripts/upgrade.lua:12: in function <data/actions/scripts/upgrade.lua:1>

[23:57:43.396] [Error - Action Interface]
[23:57:43.397] data/actions/scripts/upgrade.lua:onUse
[23:57:43.397] Description:
[23:57:43.397] data/lib/upgradesystem.lua:108: attempt to index a boolean value
[23:57:43.397] stack traceback:
[23:57:43.397]    data/lib/upgradesystem.lua:108: in function 'refine'
[23:57:43.397]    data/actions/scripts/upgrade.lua:12: in function <data/actions/scripts/upgrade.lua:1>

[23:57:45.493] [Error - Action Interface]
[23:57:45.493] data/actions/scripts/upgrade.lua:onUse
[23:57:45.493] Description:
[23:57:45.493] data/lib/upgradesystem.lua:108: attempt to index a boolean value
[23:57:45.493] stack traceback:
[23:57:45.493]    data/lib/upgradesystem.lua:108: in function 'refine'
[23:57:45.493]    data/actions/scripts/upgrade.lua:12: in function <data/actions/scripts/upgrade.lua:1>

 

 

data/lib/upgradesystem.lua

  --PERFECT UPGRADE SYSTEM
  UpgradeHandler = {
  nameLv = {
  [1] = "UNIQ",
  [2] = "RARE",
  [3] = "EPIC"
  },
  levels = {
  [1] = {50, false, false},
  [2] = {30, false, false},
  [3] = {15, true, true}
  },
  broadcast = 4, -- não quero broad
  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 = 1, removeable = true}},
  [8300] = {range = {0, 10}, info = {chance = 2, 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 (self.item.level >= 3) then
  return true
  end
   
  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(self.item.level < tool.range[1] or 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

 

data/actions/scripts/upgrade.lua

 

function onUse(cid, item, fromPosition, itemEx, toPosition)
  if isCreature(itemEx.uid) then   
  return doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTPOSSIBLE)
  end

  local obj = UpgradeHandler:new(itemEx)

  if(obj == false) then
  return doPlayerSendCancel(cid, UpgradeHandler.message.notupgradeable)
  end

  local status = obj:refine(cid, item)
  if status == "success" then
  --doSendAnimatedText(toPosition, "Success!", COLOR_GREEN)
  doSendMagicEffect(toPosition, CONST_ME_MAGIC_GREEN)
  elseif status == "fail" then
  --doSendAnimatedText(toPosition, "Fail!", COLOR_RED)
  doSendMagicEffect(toPosition, CONST_ME_POFF)
  else
  doSendMagicEffect(toPosition, CONST_ME_POFF)
  end
  return true
end

 

 

Editado por gmstrikker (veja o histórico de edições)

  • Respostas 37
  • Visualizações 2.4k
  • Created
  • Última resposta

Top Posters In This Topic

Most Popular Posts

  • q erro bizarro.. enfim, tenta assim:   

  • o script não é meu, só fiz uma modificação pra ficar do jeito q vc queria. Não mexi em nada dessa parte de atributos então deve tar como era pra ser. Se ele tá aumentando algo errado verifica se é a c

  • Testa assim, acredito que possa dar erro ao tentar dar upgrade em um item Épico caso as outras checagens do script falhem, mas a lógica tá impecável:   Edit: entra nesse site aqui https:

Postado

q erro bizarro.. enfim, tenta assim: 

Spoiler

--PERFECT UPGRADE SYSTEM

    UpgradeHandler = {
		nameLv = {
		    [1] = "UNIQ",
		    [2] = "RARE",
		    [3] = "EPIC"
	    },
        levels = {
              [1] = {50, false, false},
              [2] = {20, false, false},
              [3] = {10, true, true}
        },
        broadcast = 3,
        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 = 0, removeable = true}}
        },
        isEquipment = function(self)
            local weaponType = self:getItemWeaponType()
            return ((weaponType > 0 and weaponType < 7) 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

 

 

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Postado
  • Autor
8 horas atrás, xWhiteWolf disse:

 

 

Não sei como te agradecer, muito obrigado mesmo... Não sei se ta funcionando ou se vai bugar, demorou muito pra esse bug aparecer...

Mas vlw por tudo aí!

 

Esse sistema de refinamento é mt compelxo pra mim, só faço scripts onsay tipo comprar algum item, um movemment, uma porta, não entendo mt ele...

Me tira uma dúvida...

 

Seria possivel integrar ele com esse sistema de trade offline de 8.6? O que eu precisaria saber pra poder fazer isso? Qlqr material q souber ou puder, script relacionado...

 

  --[[
        Offline player to player item trader (Auction System) by vDk
                Script version: 1.2a [ -- FIXED CLONE ITEMS BUG -- ]
]]--
local config = {
        levelRequiredToAdd = 50,
        maxOffersPerPlayer = 5,
        SendOffersOnlyInPZ = true,
        blocked_items = {2165, 2152, 2148, 2160, 2166, 2167, 2168, 2169, 2202, 2203, 2204, 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2343, 2433, 2640, 6132, 6300, 6301, 9932, 9933}
        }
function onSay(cid, words, param, channel)
        if(param == '') then
                doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command requires param.")
                return true
        end
 
        local t = string.explode(param, ",")
        if(t[1] == "add") then
                if((not t[2]) or (not t[3]) or (not t[4])) then
                        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command requires param.")
                        return true
                end          

                if(not tonumber(t[3]) or (not tonumber(t[4]))) then
                        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You don't set valid price or items count.")
                        return true
                end
 
                if(string.len(t[3]) > 7 or (string.len(t[4]) > 3)) then
                        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "This price or item count is too high.")
                        return true
                end
 
                local item = getItemIdByName(t[2], false)
                if(not item) then
                        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Item wich such name does not exists.")
                        return true
                end
 
                if(getPlayerLevel(cid) < config.levelRequiredToAdd) then
                        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You don't have required (" .. config.levelRequiredToAdd .. ") level.")
                        return true
                end
 
                if(getPlayerVocation(cid) == 0) then
                        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You don't have the profession to do that action!")
                        return true
                end

                if(isInArray(config.blocked_items, item)) then
                        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "This item is blocked.")
                        return true
                end
 
                if(getPlayerItemCount(cid, item) < (tonumber(t[4]))) then
                        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sorry, you don't have this item(s).")
                        return true
                end
 
                local check = db.getResult("SELECT `id` FROM `auction_system` WHERE `player` = " .. getPlayerGUID(cid) .. ";")
                if(check:getID() == -1) then
                elseif(check:getRows(true) >= config.maxOffersPerPlayer) then
                        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sorry you can't add more offers (max. " .. config.maxOffersPerPlayer .. ")")
                        return true
                end
 
                if(config.SendOffersOnlyInPZ) then    
                        if(not getTilePzInfo(getPlayerPosition(cid))) then
                                doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You must be in PZ area when you add offert to database.")
                                return true
                        end
                end
 
                if(tonumber(t[4]) < 1 or (tonumber(t[3]) < 1)) then
                        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You have to type a number higher than 0.")
                        return true
                end
 
                local itemcount, costgp = math.floor(t[4]), math.floor(t[3])
                doPlayerRemoveItem(cid, item, itemcount)
                db.executeQuery("INSERT INTO `auction_system` (`player`, `item_name`, `item_id`, `count`, `cost`, `date`) VALUES (" .. getPlayerGUID(cid) .. ", \"" .. t[2] .. "\", " .. getItemIdByName(t[2]) .. ", " .. itemcount .. ", " .. costgp ..", " .. os.time() .. ")")
                doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You successfully add " .. itemcount .." " .. t[2] .." for " .. costgp .. " gps to offerts database.")
        end
 
        if(t[1] == "buy") then
                if(not tonumber(t[2])) then
                        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Wrong ID.")
                        return true
                end
 
                local buy = db.getResult("SELECT * FROM `auction_system` WHERE `id` = " .. (tonumber(t[2])) .. ";")
                if(buy:getID() ~= -1) then
                        if(getPlayerMoney(cid) < buy:getDataInt("cost")) then
                                doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You don't have enoguh GP.")
                                buy:free()
                                return true
                        end
 
                        if(getPlayerName(cid) == getPlayerNameByGUID(buy:getDataInt("player"))) then
                                doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sorry, you can't buy your own items.")
                                buy:free()
                                return true
                        end
 
                        if(getPlayerFreeCap(cid) < getItemWeightById(buy:getDataInt("item_id"), buy:getDataInt("count")))then
                                doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You try to buy a " .. buy:getDataString("item_name") .. ". It weight " .. getItemWeightById(buy:getDataInt("item_id"), buy:getDataInt("count")) .. " cap oz. and you have only " .. getPlayerFreeCap(cid) .. " oz. free capacity. Put some items to depot and try again.")
                                buy:free()
                                return true
                        end

                        if(getPlayerVocation(cid) == 0 or getPlayerVocation(cid) == 13 or getPlayerVocation(cid) == 14) then
                                doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You don't have the profession to do that action!")
                                return true
                        end
 
                        if(isItemStackable((buy:getDataString("item_id")))) then
                                doPlayerAddItem(cid, buy:getDataString("item_id"), buy:getDataInt("count"))
                        else
                                for i = 1, buy:getDataInt("count") do
                                        doPlayerAddItem(cid, buy:getDataString("item_id"), 1)
                                end
                        end
 
                        doPlayerRemoveMoney(cid, buy:getDataInt("cost"))
                        db.executeQuery("DELETE FROM `auction_system` WHERE `id` = " .. t[2] .. ";")
                        doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You bought " .. buy:getDataInt("count") .. " ".. buy:getDataString("item_name") .. " for " .. buy:getDataInt("cost") .. " gps!")
                        db.executeQuery("UPDATE `players` SET `auction_balance` = `auction_balance` + " .. buy:getDataInt("cost") .. " WHERE `id` = " .. buy:getDataInt("player") .. ";")
                        buy:free()
                else
                        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Wrong ID.")
                end
        end
 
        if(t[1] == "remove") then
                if((not tonumber(t[2]))) then
                        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Wrong ID.")
                        return true
                end
 
                                if(config.SendOffersOnlyInPZ) then    
                                        if(not getTilePzInfo(getPlayerPosition(cid))) then
                                                doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You must be in PZ area when you remove offerts from database.")
                                                return true
                                        end
                end
 
                local delete = db.getResult("SELECT * FROM `auction_system` WHERE `id` = " .. (tonumber(t[2])) .. ";")        
                if(delete:getID() ~= -1) then
                        if(getPlayerGUID(cid) == delete:getDataInt("player")) then
                                db.executeQuery("DELETE FROM `auction_system` WHERE `id` = " .. t[2] .. ";")
                                if(isItemStackable(delete:getDataString("item_id"))) then
                                        doPlayerAddItem(cid, delete:getDataString("item_id"), delete:getDataInt("count"))
                                else
                                        for i = 1, delete:getDataInt("count") do
                                                doPlayerAddItem(cid, delete:getDataString("item_id"), 1)
                                        end
                                end
 
                                doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Your offert has been deleted from offerts database.")
                        else
                                doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "This is not your offert!")
                        end
                delete:free()
                else
                        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Wrong ID.")
                end
        end
 
        if(t[1] == "withdraw") then
                local balance = db.getResult("SELECT `auction_balance` FROM `players` WHERE `id` = " .. getPlayerGUID(cid) .. ";")
                if(balance:getDataInt("auction_balance") < 1) then
                        doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You don't have money on your auction balance.")
                        balance:free()
                        return true
                end
 
                doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You got " .. balance:getDataInt("auction_balance") .. " gps from auction system!")
                doPlayerAddMoney(cid, balance:getDataInt("auction_balance"))
                db.executeQuery("UPDATE `players` SET `auction_balance` = '0' WHERE `id` = " .. getPlayerGUID(cid) .. ";")
                balance:free()
        end
        return true
end 

 

 

m1m4mJw.png

Postado

vc quer q ele possa colocar e comprar itens UNIQ, EPIC e RARE?

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Postado
  • Autor
Em 15/06/2016 at 10:30, xWhiteWolf disse:

vc quer q ele possa colocar e comprar itens UNIQ, EPIC e RARE?

 

Uhun... isso seria possivel ou daria algum problema? Pq esses itens refinados precisam ser salvos em algum lugar.. Sei lá não entendo quase nada, to começando ainda estudando logica de programação...

 

Esse ultimo script vc tirou aquela rates?

Tipo que configurava chance = 1, chance = 2

E multiplicava a chance em 2 vezes?

 

Pq eu tentei

 



--PERFECT UPGRADE SYSTEM UpgradeHandler = { nameLv = { [1] = "UNIQ", [2] = "RARE", [3] = "EPIC" }, 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 = 1, removeable = true}}, [8300] = {range = {0, 10}, info = {chance = 2, removeable = true}} }, isEquipment = function(self) local weaponType = self:getItemWeaponType() return ((weaponType > 0 and weaponType < 7) 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

 

 

E o item 8300 em vez de começar como 100% de chance (50 * 2, [1] = {50, false, false},)  parece que somou as porcentagens e ficou 52%

O outro item [8306] = {range = {0, 10}, info = {chance = 1, removeable = true}}, também, em vez de começar com 50%: [1] = {50, false, false}, começou com 51%

Editado por gmstrikker (veja o histórico de edições)

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo