• 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 Help change chance to item

maikons

Member
Joined
Aug 1, 2015
Messages
227
Reaction score
17
Someone could help me to change a thing in this script?

If item 8306 changes =
Code:
  levels = {
  [1] = {50, false, false},
  [2] = {20, false, false},
  [3] = {10, true, true}
  },

Else if item 8300 changes =
Code:
  levels = {
  [1] = {100, false, false},
  [2] = {40, false, false},
  [3] = {20, true, true}
  },


script
Code:
--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 (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
 
Code:
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
 
Code:
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

Oh ty so much

I made right?

Code:
--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 (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 item.itemid == 8300 then
  chance = chance * 2
  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
 
@maikons no, actualy nor me knows what the result of this math, you should test by yourself, it include players levels and such, just print the values of math, i'll give you a clue how pseudo random number generator on lua works.
here
Code:
  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 item.itemid == 8300 then
  chance = chance * 2
  end
the result of this whole math will be one factor of the chance.
Code:
if chance * 100 > math.random(1, 10000) then
here we have what metters, it says if chance(value of chance is the first code) * 100 (multiplied to 100) is higher than math.random() then ...
which math.random is lua PNGR, it will pick a number between the parameters (1 and 10000), in resume, the item will be upgraded only if chance variable be bigger than the math.random() function, thats why you need to know the result of chance variable before took on math.ramdon()
just in case if you get interested
http://lua-users.org/wiki/MathLibraryTutorial
 
Last edited:
Back
Top