Ir para conteúdo
  • 1

Sistema Upgrade


leonardo macedo

Pergunta

Boa Noite Galerinha do XTibia, alguem poderia estar me ajudando com um sistema de upgrade ?
Como funciona esse sistema?
o player usa um item selecionado em uma arma e o ataque dela almenta, como exemplo
sword (Atk:14, Def:12 +1) -
sword +1 (Atk:15, Def:13 +1)

 

cada upgrade a arma almenta

que vai do +1 ou +10, cada upgrade almenta +1 de atk da arma, sendo isso em wands, rods, crossbows, bows, axes, swords e clubs.

alguem poderia me ajudar ?

 

TFS 0.4

Link para o comentário
Compartilhar em outros sites

13 respostass a esta questão

Posts Recomendados

  • 0

Somente equipamentos e armas podem ser refinados.



crie Killua Upgrading System.lua em data/actions/scripts e coloque:



--- Xtibia
--- Xtibia.

local vocations = {1, 2, 4, 5, 6, 7, 8} -- Vocações que podem refinar itens

local ids_bloqueados = {2160, 5706, 2463} -- Itens que não podem ser refinados

local controle = {
{level = 0, quantOre = 1, chance = 100}, -- Level do item, quantidade de Iron Ore necessaria, chance de sucesso
{level = 1, quantOre = 2, chance = 90},
{level = 2, quantOre = 3, chance = 80},
{level = 3, quantOre = 4, chance = 70},
{level = 4, quantOre = 5, chance = 60},
{level = 5, quantOre = 6, chance = 50},
{level = 6, quantOre = 7, chance = 40},
{level = 7, quantOre = 8, chance = 30},
{level = 8, quantOre = 9, chance = 20},
{level = 9, quantOre = 10, chance = 10}
}

function getItemLevel(uid)
if uid > 0 then
return getItemAttribute(uid, "lvl") or 0
end
return false
end

function doItemAddLevel(uid, count)
if uid > 0 and tonumber(count) > 0 then
return doItemSetAttribute(uid, "lvl", getItemLevel(uid) + count)
end
return false
end

function onUse(cid, item, fromPosition, itemEx, toPosition)
if not isInArray(vocations, getPlayerVocation(cid)) then
return doPlayerSendCancel(cid, "Sua vocacao nao pode refinar.")
elseif isInArray(ids_bloqueados, itemEx.uid) then
return doPlayerSendCancel(cid, "Este item nao pode ser refinado.")
end

if getItemInfo(itemEx.itemid).attack > 0 or getItemInfo(itemEx.itemid).defense > 0 or getItemInfo(itemEx.itemid).armor > 0 then
for _, upgrade in pairs(controle) do
local atk = getItemAttribute(itemEx.uid, "attack") or getItemInfo(itemEx.itemid).attack
local def = getItemAttribute(itemEx.uid, "defense") or getItemInfo(itemEx.itemid).defense
local arm = getItemAttribute(itemEx.uid, "armor") or getItemInfo(itemEx.itemid).armor
local chance = math.random(1, 100)
if getItemLevel(itemEx.uid) == upgrade.level then
if doPlayerRemoveItem(cid, 5880, upgrade.quantOre) then
doSendMagicEffect(getThingPos(itemEx.uid), CONST_ME_CRAPS)
if chance <= upgrade.chance then
if getItemLevel(itemEx.uid) == 0 then
doItemSetAttribute(itemEx.uid, "description", "Esse item foi refinado por" ..getCreatureName(cid))
end
doItemAddLevel(itemEx.uid, 1)
doItemSetAttribute(itemEx.uid, "name", getItemNameById(itemEx.itemid).. " + " ..getItemLevel(itemEx.uid))
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce refinou com sucesso! Agora seu "..getItemNameById(itemEx.itemid).." eh level " ..getItemLevel(itemEx.uid))
if getItemInfo(itemEx.itemid).attack > 0 then
doItemSetAttribute(itemEx.uid, "attack", atk + 1)
return true
elseif getItemInfo(itemEx.itemid).armor > 0 then
doItemSetAttribute(itemEx.uid, "armor", arm + 1)
return true
elseif getItemInfo(itemEx.itemid).defense > 0 and getItemInfo(itemEx.itemid).attack <= 0 then
doItemSetAttribute(itemEx.uid, "defense", def + 1)
return true
end
else
doTransformItem(itemEx.uid, 2256)
doItemSetAttribute(itemEx.uid, 'name', "metal trash")
doItemSetAttribute(itemEx.uid, 'attack', 0)
doItemSetAttribute(itemEx.uid, 'armor', 0)
doItemSetAttribute(itemEx.uid, 'defense', 0)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce falhou.")
return true
end
else
doPlayerSendCancel(cid, "Voce nao tem iron ores o suficiente. Voce precisa de "..upgrade.quantOre.." iron ores.")
end
end
end
else
doPlayerSendCancel(cid, "Esse item nao pode ser refinado.")
end
return true
end

Em data/actions/actions.xml coloque essa TAG:



<action itemid="2422" event="script" value="Killua Upgradin System.lua"/>

Para configurar, leia meus comentários dentro do código.


Link para o comentário
Compartilhar em outros sites

  • 0

 

Somente equipamentos e armas podem ser refinados.

crie Killua Upgrading System.lua em data/actions/scripts e coloque:

--- Xtibia
--- Xtibia.

local vocations = {1, 2, 4, 5, 6, 7, 8} -- Vocações que podem refinar itens

local ids_bloqueados = {2160, 5706, 2463} -- Itens que não podem ser refinados

local controle = {
    {level = 0, quantOre = 1, chance = 100}, -- Level do item, quantidade de Iron Ore necessaria, chance de sucesso
    {level = 1, quantOre = 2, chance = 90},
    {level = 2, quantOre = 3, chance = 80},
    {level = 3, quantOre = 4, chance = 70},
    {level = 4, quantOre = 5, chance = 60},
    {level = 5, quantOre = 6, chance = 50},
    {level = 6, quantOre = 7, chance = 40},
    {level = 7, quantOre = 8, chance = 30},
    {level = 8, quantOre = 9, chance = 20},
    {level = 9, quantOre = 10, chance = 10}
}

function getItemLevel(uid)
    if uid > 0 then
        return getItemAttribute(uid, "lvl") or 0
    end
    return false
end

function doItemAddLevel(uid, count)
    if uid > 0 and tonumber(count) > 0 then
        return doItemSetAttribute(uid, "lvl", getItemLevel(uid) + count)
    end
    return false
end

function onUse(cid, item, fromPosition, itemEx, toPosition)
    if not isInArray(vocations, getPlayerVocation(cid)) then
        return doPlayerSendCancel(cid, "Sua vocacao nao pode refinar.")
    elseif isInArray(ids_bloqueados, itemEx.uid) then
        return doPlayerSendCancel(cid, "Este item nao pode ser refinado.")
    end 
    
    if getItemInfo(itemEx.itemid).attack > 0 or getItemInfo(itemEx.itemid).defense > 0 or getItemInfo(itemEx.itemid).armor > 0 then
        for _, upgrade in pairs(controle) do
            local atk = getItemAttribute(itemEx.uid, "attack") or getItemInfo(itemEx.itemid).attack
            local def = getItemAttribute(itemEx.uid, "defense") or getItemInfo(itemEx.itemid).defense
            local arm = getItemAttribute(itemEx.uid, "armor") or getItemInfo(itemEx.itemid).armor
            local chance = math.random(1, 100)
            if getItemLevel(itemEx.uid) == upgrade.level then
               if doPlayerRemoveItem(cid, 5880, upgrade.quantOre) then
                   doSendMagicEffect(getThingPos(itemEx.uid), CONST_ME_CRAPS)
                  if chance <= upgrade.chance then
                      if getItemLevel(itemEx.uid) == 0 then
                          doItemSetAttribute(itemEx.uid, "description", "Esse item foi refinado por" ..getCreatureName(cid))
                      end
                      doItemAddLevel(itemEx.uid, 1)
                      doItemSetAttribute(itemEx.uid, "name", getItemNameById(itemEx.itemid).. " + " ..getItemLevel(itemEx.uid))
                      doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce refinou com sucesso! Agora seu "..getItemNameById(itemEx.itemid).." eh level " ..getItemLevel(itemEx.uid))
                      if getItemInfo(itemEx.itemid).attack > 0 then
                          doItemSetAttribute(itemEx.uid, "attack", atk + 1)
                          return true
                      elseif getItemInfo(itemEx.itemid).armor > 0 then
                          doItemSetAttribute(itemEx.uid, "armor", arm + 1)
                          return true
                      elseif getItemInfo(itemEx.itemid).defense > 0 and getItemInfo(itemEx.itemid).attack <= 0 then
                          doItemSetAttribute(itemEx.uid, "defense", def + 1)
                          return true
                      end
                  else
                      doTransformItem(itemEx.uid, 2256)
                      doItemSetAttribute(itemEx.uid, 'name', "metal trash")
                      doItemSetAttribute(itemEx.uid, 'attack', 0)
                      doItemSetAttribute(itemEx.uid, 'armor', 0)
                      doItemSetAttribute(itemEx.uid, 'defense', 0)
                      doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce falhou.")
                      return true
                  end
              else
                  doPlayerSendCancel(cid, "Voce nao tem iron ores o suficiente. Voce precisa de "..upgrade.quantOre.." iron ores.")
              end
          end
      end
  else
      doPlayerSendCancel(cid, "Esse item nao pode ser refinado.")
  end
  return true
end   

Em data/actions/actions.xml coloque essa TAG:

<action itemid="2422" event="script" value="Killua Upgradin System.lua"/>

Para configurar, leia meus comentários dentro do código.

 

O Script funcionou direitinho, más ele não funciona em WANDS e RODS, poderia ajudar ? e tipo de vez quebrar o item não poderia ser feito para voltar ? está +3 voltar +2 ?

Editado por Leonardo Macedo
Link para o comentário
Compartilhar em outros sites

  • 0

O Script funcionou direitinho, más ele não funciona em WANDS e RODS, poderia ajudar ? e tipo de vez quebrar o item não poderia ser feito para voltar ? está +3 voltar +2 ?

Olha da para fazer essa parte de voltar sim, porém wands e rods não utilizam atributos para atacar, por isso que esse sistema não funciona nestes items.

Para voltar ao invés de quebrar, tente assim:

 

 

--- Xtibia
--- Xtibia.

local vocations = {1, 2, 4, 5, 6, 7, 8} -- Vocações que podem refinar itens

local ids_bloqueados = {2160, 5706, 2463} -- Itens que não podem ser refinados

local controle = {
    {level = 0, quantOre = 1, chance = 100}, -- Level do item, quantidade de Iron Ore necessaria, chance de sucesso
    {level = 1, quantOre = 2, chance = 90},
    {level = 2, quantOre = 3, chance = 80},
    {level = 3, quantOre = 4, chance = 70},
    {level = 4, quantOre = 5, chance = 60},
    {level = 5, quantOre = 6, chance = 50},
    {level = 6, quantOre = 7, chance = 40},
    {level = 7, quantOre = 8, chance = 30},
    {level = 8, quantOre = 9, chance = 20},
    {level = 9, quantOre = 10, chance = 10}
}

function getItemLevel(uid)
    if uid > 0 then
        return getItemAttribute(uid, "lvl") or 0
    end
    return false
end

function doItemAddLevel(uid, count)
    if uid > 0 and tonumber(count) > 0 then
        return doItemSetAttribute(uid, "lvl", getItemLevel(uid) + count)
    end
    return false
end

function onUse(cid, item, fromPosition, itemEx, toPosition)
    if not isInArray(vocations, getPlayerVocation(cid)) then
        return doPlayerSendCancel(cid, "Sua vocacao nao pode refinar.")
    elseif isInArray(ids_bloqueados, itemEx.uid) then
        return doPlayerSendCancel(cid, "Este item nao pode ser refinado.")
    end 
    
    if getItemInfo(itemEx.itemid).attack > 0 or getItemInfo(itemEx.itemid).defense > 0 or getItemInfo(itemEx.itemid).armor > 0 then
        for _, upgrade in pairs(controle) do
            local atk = getItemAttribute(itemEx.uid, "attack") or getItemInfo(itemEx.itemid).attack
            local def = getItemAttribute(itemEx.uid, "defense") or getItemInfo(itemEx.itemid).defense
            local arm = getItemAttribute(itemEx.uid, "armor") or getItemInfo(itemEx.itemid).armor
            local chance = math.random(1, 100)
            if getItemLevel(itemEx.uid) == upgrade.level then
               if doPlayerRemoveItem(cid, 5880, upgrade.quantOre) then
                   doSendMagicEffect(getThingPos(itemEx.uid), CONST_ME_CRAPS)
                  if chance <= upgrade.chance then
                      if getItemLevel(itemEx.uid) == 0 then
                          doItemSetAttribute(itemEx.uid, "description", "Esse item foi refinado por" ..getCreatureName(cid))
                      end
                      doItemAddLevel(itemEx.uid, 1)
                      doItemSetAttribute(itemEx.uid, "name", getItemNameById(itemEx.itemid).. " + " ..getItemLevel(itemEx.uid))
                      doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce refinou com sucesso! Agora seu "..getItemNameById(itemEx.itemid).." eh level " ..getItemLevel(itemEx.uid))
                      if getItemInfo(itemEx.itemid).attack > 0 then
                          doItemSetAttribute(itemEx.uid, "attack", atk + 1)
                          return true
                      elseif getItemInfo(itemEx.itemid).armor > 0 then
                          doItemSetAttribute(itemEx.uid, "armor", arm + 1)
                          return true
                      elseif getItemInfo(itemEx.itemid).defense > 0 and getItemInfo(itemEx.itemid).attack <= 0 then
                          doItemSetAttribute(itemEx.uid, "defense", def + 1)
                          return true
                      end
                  else
                      doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce falhou.")
                      if getItemInfo(itemEx.itemid).attack > 0 then
                          doItemSetAttribute(itemEx.uid, "attack", atk - 1)
                          return true
                      elseif getItemInfo(itemEx.itemid).armor > 0 then
                          doItemSetAttribute(itemEx.uid, "armor", arm - 1)
                          return true
                      elseif getItemInfo(itemEx.itemid).defense > 0 and getItemInfo(itemEx.itemid).attack <= 0 then
                          doItemSetAttribute(itemEx.uid, "defense", def - 1)
                          return true
                      end
					  return true
                  end
              else
                  doPlayerSendCancel(cid, "Voce nao tem iron ores o suficiente. Voce precisa de "..upgrade.quantOre.." iron ores.")
              end
          end
      end
  else
      doPlayerSendCancel(cid, "Esse item nao pode ser refinado.")
  end
  return true
end  

 

 

Link para o comentário
Compartilhar em outros sites

  • 0

Olha da para fazer essa parte de voltar sim, porém wands e rods não utilizam atributos para atacar, por isso que esse sistema não funciona nestes items.

Para voltar ao invés de quebrar, tente assim:

 

 

--- Xtibia
--- Xtibia.

local vocations = {1, 2, 4, 5, 6, 7, 8} -- Vocações que podem refinar itens

local ids_bloqueados = {2160, 5706, 2463} -- Itens que não podem ser refinados

local controle = {
    {level = 0, quantOre = 1, chance = 100}, -- Level do item, quantidade de Iron Ore necessaria, chance de sucesso
    {level = 1, quantOre = 2, chance = 90},
    {level = 2, quantOre = 3, chance = 80},
    {level = 3, quantOre = 4, chance = 70},
    {level = 4, quantOre = 5, chance = 60},
    {level = 5, quantOre = 6, chance = 50},
    {level = 6, quantOre = 7, chance = 40},
    {level = 7, quantOre = 8, chance = 30},
    {level = 8, quantOre = 9, chance = 20},
    {level = 9, quantOre = 10, chance = 10}
}

function getItemLevel(uid)
    if uid > 0 then
        return getItemAttribute(uid, "lvl") or 0
    end
    return false
end

function doItemAddLevel(uid, count)
    if uid > 0 and tonumber(count) > 0 then
        return doItemSetAttribute(uid, "lvl", getItemLevel(uid) + count)
    end
    return false
end

function onUse(cid, item, fromPosition, itemEx, toPosition)
    if not isInArray(vocations, getPlayerVocation(cid)) then
        return doPlayerSendCancel(cid, "Sua vocacao nao pode refinar.")
    elseif isInArray(ids_bloqueados, itemEx.uid) then
        return doPlayerSendCancel(cid, "Este item nao pode ser refinado.")
    end 
    
    if getItemInfo(itemEx.itemid).attack > 0 or getItemInfo(itemEx.itemid).defense > 0 or getItemInfo(itemEx.itemid).armor > 0 then
        for _, upgrade in pairs(controle) do
            local atk = getItemAttribute(itemEx.uid, "attack") or getItemInfo(itemEx.itemid).attack
            local def = getItemAttribute(itemEx.uid, "defense") or getItemInfo(itemEx.itemid).defense
            local arm = getItemAttribute(itemEx.uid, "armor") or getItemInfo(itemEx.itemid).armor
            local chance = math.random(1, 100)
            if getItemLevel(itemEx.uid) == upgrade.level then
               if doPlayerRemoveItem(cid, 5880, upgrade.quantOre) then
                   doSendMagicEffect(getThingPos(itemEx.uid), CONST_ME_CRAPS)
                  if chance <= upgrade.chance then
                      if getItemLevel(itemEx.uid) == 0 then
                          doItemSetAttribute(itemEx.uid, "description", "Esse item foi refinado por" ..getCreatureName(cid))
                      end
                      doItemAddLevel(itemEx.uid, 1)
                      doItemSetAttribute(itemEx.uid, "name", getItemNameById(itemEx.itemid).. " + " ..getItemLevel(itemEx.uid))
                      doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce refinou com sucesso! Agora seu "..getItemNameById(itemEx.itemid).." eh level " ..getItemLevel(itemEx.uid))
                      if getItemInfo(itemEx.itemid).attack > 0 then
                          doItemSetAttribute(itemEx.uid, "attack", atk + 1)
                          return true
                      elseif getItemInfo(itemEx.itemid).armor > 0 then
                          doItemSetAttribute(itemEx.uid, "armor", arm + 1)
                          return true
                      elseif getItemInfo(itemEx.itemid).defense > 0 and getItemInfo(itemEx.itemid).attack <= 0 then
                          doItemSetAttribute(itemEx.uid, "defense", def + 1)
                          return true
                      end
                  else
                      doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce falhou.")
                      if getItemInfo(itemEx.itemid).attack > 0 then
                          doItemSetAttribute(itemEx.uid, "attack", atk - 1)
                          return true
                      elseif getItemInfo(itemEx.itemid).armor > 0 then
                          doItemSetAttribute(itemEx.uid, "armor", arm - 1)
                          return true
                      elseif getItemInfo(itemEx.itemid).defense > 0 and getItemInfo(itemEx.itemid).attack <= 0 then
                          doItemSetAttribute(itemEx.uid, "defense", def - 1)
                          return true
                      end
					  return true
                  end
              else
                  doPlayerSendCancel(cid, "Voce nao tem iron ores o suficiente. Voce precisa de "..upgrade.quantOre.." iron ores.")
              end
          end
      end
  else
      doPlayerSendCancel(cid, "Esse item nao pode ser refinado.")
  end
  return true
end  

 

 

 

Quando ele falha, não volta do +6 para o +5 continua sendo +6

Link para o comentário
Compartilhar em outros sites

  • 0

ae amigo tenta esse script .... ele só não funciona em wands mais ele regride o nivel de upgrade do iten também pode falhar .... caso você não quiser que seja falhado e volte para o nivel 1 de upgrade apenas tire a função

 

 

 

UpgradeHandler = {

levels = {
[1] = {100, false, false},
[2] = {80, false, false},
[3] = {70, false, false},
[4] = {60, true, false},
[5] = {50, true, false},
[6] = {45, true, false},
[7] = {40, true, false},
[8] = {35, true, true},
[9] = {30, true, true},
[10] = {25, true, true},
[11] = {20, true, true},
[12] = {15, true, true},
[13] = {10, true, true},
[14] = {5, true, true},
[15] = {1, true, true}
},
broadcast = 7,
attributes = {
["attack"] = 100,
["defense"] = 50,
["armor"] = 25
},
message = {
console = "Agora a %s level +%s tem %s%% de sucesso de upar.",
success = "Voce Refinou a %s Para o level +%s",
fail = "O Refinamento Falhou Em Upar A %s Para o level +%s",
downgrade = "A %s Abaixou Para o Level +%s",
erase = "A %s Foi Quebrada.",
maxlevel = "A %s esta no level mais alto nao e possivel upa-la.",
notupgradeable = "este item nao pode ser refinado.",
broadcast = "O Player %s Teve Sucesso Em Refinar %s para o level +%s.\nParabens!!",
invalidtool = "Esta nao e uma ferramenta de refinamento valida.",
toolrange = "Esta ferramenta de atualizacao so pode ser usado em itens com nivel entre +%s e +%s"
},
tools = {
[11440] = {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()
self.item.level = (tonumber(self:getItemName():match("%+(%d+)")) or 0)
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

self:setItemName((self.item.level > 0 and self:getItemName():gsub("%+(%d+)", "+".. (self.item.level + 1)) or (self:getItemName() .." +1")))
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(self.levels[self.item.level][3] == true and (self:chance().erase * 100) > math.random(1, 10000)) then
doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.erase:format(self.item.name))
self:setItemName(self.item.name)
for key, value in pairs(self.attributes) do
if self.item[key] > 0 then
doItemSetAttribute(self.item.uid, key, self.item[key])
end
end
elseif(self.levels[self.item.level][2] == true and (self:chance().downgrade * 100) > math.random(1, 10000)) then
doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.downgrade:format(self.item.name, (self.item.level - 1)))
self:setItemName((self.item.level == 1 and self.item.name or self:getItemName():gsub("%+(%d+)", "+".. (self.item.level - 1))))
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[key] + value * (self.item.level - 1)))
end
end
else
doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.fail:format(self.item.name, (self.item.level + 1)))
end
return "fail"
end
end

 

 

 

[1] = {100, false, false},

 

caso quiser que ele não "quebre" no caso volte todos os upgrades feitos apenas deixe o segundo em false caso queira que ele regrida todos os upgrades feitos deixe o segundo em true

 

o primeiro false não lembro oque é .... mais o script funciona 100% faz tempo que não mexo nele por isso não lembro muito bem essas paradas do true e false ... Pedido para algum scripter poder explicar melhor sobre isso grato desde já

Editado por Brunds
Link para o comentário
Compartilhar em outros sites

  • 0

ae amigo tenta esse script .... ele só não funciona em wands mais ele regride o nivel de upgrade do iten também pode falhar .... caso você não quiser que seja falhado e volte para o nivel 1 de upgrade apenas tire a função

 

 

 

UpgradeHandler = {

levels = {

[1] = {100, false, false},

[2] = {80, false, false},

[3] = {70, false, false},

[4] = {60, true, false},

[5] = {50, true, false},

[6] = {45, true, false},

[7] = {40, true, false},

[8] = {35, true, true},

[9] = {30, true, true},

[10] = {25, true, true},

[11] = {20, true, true},

[12] = {15, true, true},

[13] = {10, true, true},

[14] = {5, true, true},

[15] = {1, true, true}

},

broadcast = 7,

attributes = {

["attack"] = 100,

["defense"] = 50,

["armor"] = 25

},

message = {

console = "Agora a %s level +%s tem %s%% de sucesso de upar.",

success = "Voce Refinou a %s Para o level +%s",

fail = "O Refinamento Falhou Em Upar A %s Para o level +%s",

downgrade = "A %s Abaixou Para o Level +%s",

erase = "A %s Foi Quebrada.",

maxlevel = "A %s esta no level mais alto nao e possivel upa-la.",

notupgradeable = "este item nao pode ser refinado.",

broadcast = "O Player %s Teve Sucesso Em Refinar %s para o level +%s.\nParabens!!",

invalidtool = "Esta nao e uma ferramenta de refinamento valida.",

toolrange = "Esta ferramenta de atualizacao so pode ser usado em itens com nivel entre +%s e +%s"

},

tools = {

[11440] = {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()

self.item.level = (tonumber(self:getItemName():match("%+(%d+)")) or 0)

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

 

self:setItemName((self.item.level > 0 and self:getItemName():gsub("%+(%d+)", "+".. (self.item.level + 1)) or (self:getItemName() .." +1")))

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(self.levels[self.item.level][3] == true and (self:chance().erase * 100) > math.random(1, 10000)) then

doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.erase:format(self.item.name))

self:setItemName(self.item.name)

for key, value in pairs(self.attributes) do

if self.item[key] > 0 then

doItemSetAttribute(self.item.uid, key, self.item[key])

end

end

elseif(self.levels[self.item.level][2] == true and (self:chance().downgrade * 100) > math.random(1, 10000)) then

doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.downgrade:format(self.item.name, (self.item.level - 1)))

self:setItemName((self.item.level == 1 and self.item.name or self:getItemName():gsub("%+(%d+)", "+".. (self.item.level - 1))))

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[key] + value * (self.item.level - 1)))

end

end

else

doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.fail:format(self.item.name, (self.item.level + 1)))

end

return "fail"

end

end

 

 

 

[1] = {100, false, false},

 

caso quiser que ele não "quebre" no caso volte todos os upgrades feitos apenas deixe o segundo em false caso queira que ele regrida todos os upgrades feitos deixe o segundo em true

 

o primeiro false não lembro oque é .... mais o script funciona 100% faz tempo que não mexo nele por isso não lembro muito bem essas paradas do true e false ... Pedido para algum scripter poder explicar melhor sobre isso grato desde já

 

Acabei de dar uma olhada nesse script kkk, bom eu não curti muito, o script passado a cima eu achei melhor, mais valeu ae !

Link para o comentário
Compartilhar em outros sites

  • 0


--- Xtibia

--- Xtibia.

 

local vocations = {1, 2, 4, 5, 6, 7, 8} -- Vocações que podem refinar itens

 

local ids_bloqueados = {2160, 5706, 2463} -- Itens que não podem ser refinados

 

local controle = {

{level = 0, quantOre = 1, chance = 100}, -- Level do item, quantidade de Iron Ore necessaria, chance de sucesso

{level = 1, quantOre = 2, chance = 90},

{level = 2, quantOre = 3, chance = 80},

{level = 3, quantOre = 4, chance = 70},

{level = 4, quantOre = 5, chance = 60},

{level = 5, quantOre = 6, chance = 50},

{level = 6, quantOre = 7, chance = 40},

{level = 7, quantOre = 8, chance = 30},

{level = 8, quantOre = 9, chance = 20},

{level = 9, quantOre = 10, chance = 10}

}

 

function getItemLevel(uid)

if uid > 0 then

return getItemAttribute(uid, "lvl") or 0

end

return false

end

 

function doItemAddLevel(uid, count)

if uid > 0 and tonumber(count) then

return doItemSetAttribute(uid, "lvl", getItemLevel(uid) + count)

end

return false

end

 

function onUse(cid, item, fromPosition, itemEx, toPosition)

if not isInArray(vocations, getPlayerVocation(cid)) then

return doPlayerSendCancel(cid, "Sua vocacao nao pode refinar.")

elseif isInArray(ids_bloqueados, itemEx.uid) then

return doPlayerSendCancel(cid, "Este item nao pode ser refinado.")

end

 

if getItemInfo(itemEx.itemid).attack > 0 or getItemInfo(itemEx.itemid).defense > 0 or getItemInfo(itemEx.itemid).armor > 0 then

for _, upgrade in pairs(controle) do

local atk = getItemAttribute(itemEx.uid, "attack") or getItemInfo(itemEx.itemid).attack

local def = getItemAttribute(itemEx.uid, "defense") or getItemInfo(itemEx.itemid).defense

local arm = getItemAttribute(itemEx.uid, "armor") or getItemInfo(itemEx.itemid).armor

local chance = math.random(1, 100)

if getItemLevel(itemEx.uid) == upgrade.level then

if doPlayerRemoveItem(cid, 5880, upgrade.quantOre) then

doSendMagicEffect(getThingPos(itemEx.uid), CONST_ME_CRAPS)

if chance <= upgrade.chance then

if getItemLevel(itemEx.uid) == 0 then

doItemSetAttribute(itemEx.uid, "description", "Esse item foi refinado por" ..getCreatureName(cid))

end

doItemAddLevel(itemEx.uid, 1)

doItemSetAttribute(itemEx.uid, "name", getItemNameById(itemEx.itemid).. " + " ..getItemLevel(itemEx.uid))

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce refinou com sucesso! Agora seu "..getItemNameById(itemEx.itemid).." eh level " ..getItemLevel(itemEx.uid))

if getItemInfo(itemEx.itemid).attack > 0 then

doItemSetAttribute(itemEx.uid, "attack", atk + 1)

return true

elseif getItemInfo(itemEx.itemid).armor > 0 then

doItemSetAttribute(itemEx.uid, "armor", arm + 1)

return true

elseif getItemInfo(itemEx.itemid).defense > 0 and getItemInfo(itemEx.itemid).attack <= 0 then

doItemSetAttribute(itemEx.uid, "defense", def + 1)

return true

end

else

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce falhou.")

if getItemLevel(itemEx.uid) > 0 then

doItemAddLevel(itemEx.uid, -1)

doItemSetAttribute(itemEx.uid, "name", getItemNameById(itemEx.itemid).. " + " ..getItemLevel(itemEx.uid))

if getItemInfo(itemEx.itemid).attack > 0 then

doItemSetAttribute(itemEx.uid, "attack", atk - 1)

return true

elseif getItemInfo(itemEx.itemid).armor > 0 then

doItemSetAttribute(itemEx.uid, "armor", arm - 1)

return true

elseif getItemInfo(itemEx.itemid).defense > 0 and getItemInfo(itemEx.itemid).attack <= 0 then

doItemSetAttribute(itemEx.uid, "defense", def - 1)

return true

end

end

return true

end

else

doPlayerSendCancel(cid, "Voce nao tem iron ores o suficiente. Voce precisa de "..upgrade.quantOre.." iron ores.")

end

end

end

else

doPlayerSendCancel(cid, "Esse item nao pode ser refinado.")

end

return true

end

Link para o comentário
Compartilhar em outros sites

  • 0
--- Xtibia
--- Xtibia.

local vocations = {1, 2, 4, 5, 6, 7, 8} -- Vocações que podem refinar itens

local ids_bloqueados = {2160, 5706, 2463} -- Itens que não podem ser refinados

local controle = {
    {level = 0, quantOre = 1, chance = 100}, -- Level do item, quantidade de Iron Ore necessaria, chance de sucesso
    {level = 1, quantOre = 2, chance = 90},
    {level = 2, quantOre = 3, chance = 80},
    {level = 3, quantOre = 4, chance = 70},
    {level = 4, quantOre = 5, chance = 60},
    {level = 5, quantOre = 6, chance = 50},
    {level = 6, quantOre = 7, chance = 40},
    {level = 7, quantOre = 8, chance = 30},
    {level = 8, quantOre = 9, chance = 20},
    {level = 9, quantOre = 10, chance = 10}
}

function getItemLevel(uid)
    if uid > 0 then
        return getItemAttribute(uid, "lvl") or 0
    end
    return false
end

function doItemAddLevel(uid, count)
    if uid > 0 and tonumber(count) then
        return doItemSetAttribute(uid, "lvl", getItemLevel(uid) + count)
    end
    return false
end

function onUse(cid, item, fromPosition, itemEx, toPosition)
    if not isInArray(vocations, getPlayerVocation(cid)) then
        return doPlayerSendCancel(cid, "Sua vocacao nao pode refinar.")
    elseif isInArray(ids_bloqueados, itemEx.uid) then
        return doPlayerSendCancel(cid, "Este item nao pode ser refinado.")
    end 
    
    if getItemInfo(itemEx.itemid).attack > 0 or getItemInfo(itemEx.itemid).defense > 0 or getItemInfo(itemEx.itemid).armor > 0 then
        for _, upgrade in pairs(controle) do
            local atk = getItemAttribute(itemEx.uid, "attack") or getItemInfo(itemEx.itemid).attack
            local def = getItemAttribute(itemEx.uid, "defense") or getItemInfo(itemEx.itemid).defense
            local arm = getItemAttribute(itemEx.uid, "armor") or getItemInfo(itemEx.itemid).armor
            local chance = math.random(1, 100)
            if getItemLevel(itemEx.uid) == upgrade.level then
               if doPlayerRemoveItem(cid, 5880, upgrade.quantOre) then
                   doSendMagicEffect(getThingPos(itemEx.uid), CONST_ME_CRAPS)
                  if chance <= upgrade.chance then
                      if getItemLevel(itemEx.uid) == 0 then
                          doItemSetAttribute(itemEx.uid, "description", "Esse item foi refinado por" ..getCreatureName(cid))
                      end
                      doItemAddLevel(itemEx.uid, 1)
                      doItemSetAttribute(itemEx.uid, "name", getItemNameById(itemEx.itemid).. " + " ..getItemLevel(itemEx.uid))
                      doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce refinou com sucesso! Agora seu "..getItemNameById(itemEx.itemid).." eh level " ..getItemLevel(itemEx.uid))
                      if getItemInfo(itemEx.itemid).attack > 0 then
                          doItemSetAttribute(itemEx.uid, "attack", atk + 1)
                          return true
                      elseif getItemInfo(itemEx.itemid).armor > 0 then
                          doItemSetAttribute(itemEx.uid, "armor", arm + 1)
                          return true
                      elseif getItemInfo(itemEx.itemid).defense > 0 and getItemInfo(itemEx.itemid).attack <= 0 then
                          doItemSetAttribute(itemEx.uid, "defense", def + 1)
                          return true
                      end
                  else
                      doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce falhou.")
                      if getItemLevel(itemEx.uid) > 0 then
                          doItemAddLevel(itemEx.uid, -1)
                          doItemSetAttribute(itemEx.uid, "name", getItemNameById(itemEx.itemid).. " + " ..getItemLevel(itemEx.uid))
                          if getItemInfo(itemEx.itemid).attack > 0 then
                              doItemSetAttribute(itemEx.uid, "attack", atk - 1)
                              return true
                          elseif getItemInfo(itemEx.itemid).armor > 0 then
                              doItemSetAttribute(itemEx.uid, "armor", arm - 1)
                              return true
                          elseif getItemInfo(itemEx.itemid).defense > 0 and getItemInfo(itemEx.itemid).attack <= 0 then
                              doItemSetAttribute(itemEx.uid, "defense", def - 1)
                              return true
                          end
                      end
					  return true
                  end
              else
                  doPlayerSendCancel(cid, "Voce nao tem iron ores o suficiente. Voce precisa de "..upgrade.quantOre.." iron ores.")
              end
          end
      end
  else
      doPlayerSendCancel(cid, "Esse item nao pode ser refinado.")
  end
  return true
end  

Funcionou mano! obrigado!

Link para o comentário
Compartilhar em outros sites

  • 0

 

--- Xtibia--- Xtibia.local vocations = {1, 2, 4, 5, 6, 7, 8} -- Vocações que podem refinar itenslocal ids_bloqueados = {2160, 5706, 2463} -- Itens que não podem ser refinadoslocal controle = {    {level = 0, quantOre = 1, chance = 100}, -- Level do item, quantidade de Iron Ore necessaria, chance de sucesso    {level = 1, quantOre = 2, chance = 90},    {level = 2, quantOre = 3, chance = 80},    {level = 3, quantOre = 4, chance = 70},    {level = 4, quantOre = 5, chance = 60},    {level = 5, quantOre = 6, chance = 50},    {level = 6, quantOre = 7, chance = 40},    {level = 7, quantOre = 8, chance = 30},    {level = 8, quantOre = 9, chance = 20},    {level = 9, quantOre = 10, chance = 10}}function getItemLevel(uid)    if uid > 0 then        return getItemAttribute(uid, "lvl") or 0    end    return falseendfunction doItemAddLevel(uid, count)    if uid > 0 and tonumber(count) then        return doItemSetAttribute(uid, "lvl", getItemLevel(uid) + count)    end    return falseendfunction onUse(cid, item, fromPosition, itemEx, toPosition)    if not isInArray(vocations, getPlayerVocation(cid)) then        return doPlayerSendCancel(cid, "Sua vocacao nao pode refinar.")    elseif isInArray(ids_bloqueados, itemEx.uid) then        return doPlayerSendCancel(cid, "Este item nao pode ser refinado.")    end         if getItemInfo(itemEx.itemid).attack > 0 or getItemInfo(itemEx.itemid).defense > 0 or getItemInfo(itemEx.itemid).armor > 0 then        for _, upgrade in pairs(controle) do            local atk = getItemAttribute(itemEx.uid, "attack") or getItemInfo(itemEx.itemid).attack            local def = getItemAttribute(itemEx.uid, "defense") or getItemInfo(itemEx.itemid).defense            local arm = getItemAttribute(itemEx.uid, "armor") or getItemInfo(itemEx.itemid).armor            local chance = math.random(1, 100)            if getItemLevel(itemEx.uid) == upgrade.level then               if doPlayerRemoveItem(cid, 5880, upgrade.quantOre) then                   doSendMagicEffect(getThingPos(itemEx.uid), CONST_ME_CRAPS)                  if chance <= upgrade.chance then                      if getItemLevel(itemEx.uid) == 0 then                          doItemSetAttribute(itemEx.uid, "description", "Esse item foi refinado por" ..getCreatureName(cid))                      end                      doItemAddLevel(itemEx.uid, 1)                      doItemSetAttribute(itemEx.uid, "name", getItemNameById(itemEx.itemid).. " + " ..getItemLevel(itemEx.uid))                      doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce refinou com sucesso! Agora seu "..getItemNameById(itemEx.itemid).." eh level " ..getItemLevel(itemEx.uid))                      if getItemInfo(itemEx.itemid).attack > 0 then                          doItemSetAttribute(itemEx.uid, "attack", atk + 1)                          return true                      elseif getItemInfo(itemEx.itemid).armor > 0 then                          doItemSetAttribute(itemEx.uid, "armor", arm + 1)                          return true                      elseif getItemInfo(itemEx.itemid).defense > 0 and getItemInfo(itemEx.itemid).attack <= 0 then                          doItemSetAttribute(itemEx.uid, "defense", def + 1)                          return true                      end                  else                      doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce falhou.")                      if getItemLevel(itemEx.uid) > 0 then                          doItemAddLevel(itemEx.uid, -1)                          doItemSetAttribute(itemEx.uid, "name", getItemNameById(itemEx.itemid).. " + " ..getItemLevel(itemEx.uid))                          if getItemInfo(itemEx.itemid).attack > 0 then                              doItemSetAttribute(itemEx.uid, "attack", atk - 1)                              return true                          elseif getItemInfo(itemEx.itemid).armor > 0 then                              doItemSetAttribute(itemEx.uid, "armor", arm - 1)                              return true                          elseif getItemInfo(itemEx.itemid).defense > 0 and getItemInfo(itemEx.itemid).attack <= 0 then                              doItemSetAttribute(itemEx.uid, "defense", def - 1)                              return true                          end                      end					  return true                  end              else                  doPlayerSendCancel(cid, "Voce nao tem iron ores o suficiente. Voce precisa de "..upgrade.quantOre.." iron ores.")              end          end      end  else      doPlayerSendCancel(cid, "Esse item nao pode ser refinado.")  end  return trueend

alguém poderia deixa que todas vocation pode usa e no lugar de coloca os id bloqueado coloca os item que pode ser refinados

Editado por Xtudomuito
Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...