Jump to content
  • 1

Sistema Upgrade


leonardo macedo

Question

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 to comment
Share on other sites

13 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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.


Link to comment
Share on other 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 ?

Edited by Leonardo Macedo
Link to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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á

Edited by Brunds
Link to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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

Edited by Xtudomuito
Link to comment
Share on other sites

×
×
  • Create New...