• 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!

System Refinement

laccc2413

New Member
Joined
May 10, 2009
Messages
10
Reaction score
0
Hello, here to a script that I really want to use on my T, but it has a small bug fixes that do not know you, ve if you guys can help me:

1 - To a system using a stone refining id 8302 (Jewel of Bless) increases to +6 attributes of the items, atk def arm, and a stone id 8303 (Jewel of Soul) which increases to +10 .. but when the stone used in defense and shield it increases (atk), he wanted only adds defense, because the shield with atk not sure '-' ..

2 - In the same script of refinement when used much the jewels sends the following message on the console:

[10/10/2012 00:10:54] [Error - Action Interface]
[10/10/2012 00:10:54] data/actions/scripts/refine.lua:eek:nUse
[10/10/2012 00:10:54] Description:
[10/10/2012 00:10:54] data/lib/RefineSystem.lua:76: attempt to compare number with boolean
[10/10/2012 00:10:54] stack traceback:
[10/10/2012 00:10:54] data/lib/RefineSystem.lua:76: in function 'isEquipment'
[10/10/2012 00:10:54] data/lib/RefineSystem.lua:127: in function 'load'
[10/10/2012 00:10:54] data/actions/scripts/refine.lua:2: in function <data/actions/scripts/refine.lua:1>

Script ( Pasta Lib ):

Code:
-- Perfect Refine System

Refine = {
--[[
Base de todo o sistema de refino
]]--
config = {
max = 10, -- Nível máximo de refino padrão
message = { -- Mensagens enviadas pelo sistema
type = MESSAGE_EVENT_DEFAULT,
onSuccess = "Your %s has upgraded to level +%s",
onFail = "Your %s has downgraded to level +%s",
onBreak = "Your %s has broken",
invalidGem = "This is not a valid refine gem",
gemLevel = "This gem can refine only to level +%s",
maxLevel = "Your %s is already in max level"
},
--[[

O seguinte array controla os diferentes atributos que podem
melhorados no refino.

attributes = {{"attack", false}, {"defense", false}, {"armor", false}}

A configuração dele é realmente simples, os valores booleanos dizem respeito
ao ganho de pontos no referido atributo. Se 'true' o ganho é igual ao nível do item,
se 'false' o ganho é 1.

Note que eu configurei para 'attack', 'defense' como 'true' e 'armor' e 'hitchance' como 'false'.

]]--
attributes = {{"attack", false}, {"defense", false}, {"armor", false}},
--[[
´	 Este array configura o sistema de quebra de equipamento, deixando o sistema muito mais real.

Configurei para que a quebra só fosse possível depois do +7 com uma chance de 20%.

Ou seja se o jogador falhar no refino de um equipamento +7 ou superior, tem 20% de chance de quebrar
e perder este equipamento.
]]--
breakConfig = {level = 7, chance = 20},
--[[
Essa opção ativa o broadcast para quando o jogador refinar um equipamento para +7 ou mais.
]]--
doBroadcast = true,
--[[
Essa função calcula a chance de sucesso do refino, veja a chance de alguns.

+1	 = 100%
+2	 = 91%
+3	 = 81%
...	
+10	 = 10%
]]--
chance = function(level)
return math.floor(100 - (((level * 2 * 3) - (level + 1)) * 2.04))
end
},

gems = {
--[[
Configure aqui as "pedras" que refinam itens.

Você pode configurar quantas pedras quiser e limitar o nível que essa pedra pode fortalecer.

Configurei duas, uma pode fortalecer até +6 e a outra até +10.

Você pode criar também pedras que dão bônus na chance total de refino 
]]--
[8302] = {max = 6, bonus = 0},
[8303] = {max = 10, bonus = 0}
},

isEquipment = function(self)
local weapontype = self:getItemWeaponType()
if (weapontype > 0 and weapontype < 7) or self.item.info.armor ~= 0 then
return true
end
return false
end,

setItemName = function(self, name)
return doItemSetAttribute(self.item.uid, "name", name)
end,

getItemKeyValue = function(self, key)
return getItemAttribute(self.item.uid, key)
end,

setItemKeyValue = function(self, key, value)
return doItemSetAttribute(self.item.uid, key, value)
end,

removeItem = function(self, count)
return doRemoveItem(self.item.uid, count)
end
}

function Refine:load(item)
--[[
Função que carrega o item a ser refinado na forma de um objeto.

E você pode usar qualquer função Lua/Open Tibia que se utilize do uid do item como
um método da classe Refine

Ou seja, é totalmente possível fazer isso em uma Action, por exemplo:

local obj = Refine:load(itemEx)
obj:doRemoveItem(1)

Ao invés de

doRemoveItem(item.uid, 1)

end
]]--
local obj = setmetatable({item = {uid = item.uid, info = getItemInfo(item.itemid)}}, {__index = function(self, index)
if _G[index] then
return setmetatable({callback = _G[index]}, {__call = function(self, ...)
return self.callback(item.uid, ...)
end})
else
return Refine[index]
end
end})

if not obj:isEquipment() then
return false
end
obj:getLevel()
return obj
end

function Refine:getLevel()
local info = self:getItemName():match("%+(%d+)")
self.item.level = (tonumber(info) or 0)
return true
end

function Refine:upgrade(cid, gem)
--[[
Função principal do sistema
]]--
local refineItem = self.gems[gem.itemid]

if not refineItem then
doPlayerSendTextMessage(cid, self.config.message.type, self.config.message.invalidGem)
return false
end

if self.item.level == self.config.maxLevel then
doPlayerSendTextMessage(cid, self.config.message.type, self.config.message.maxLevel)
return false
else
if self.item.level >= refineItem.max then
doPlayerSendTextMessage(cid, self.config.message.type, self.config.message.gemLevel:format(refineItem.max ))
return false
end
end

doRemoveItem(gem.uid, 1)
if math.random(1, 100) <= self.config.chance(self.item.level) + refineItem.bonus then
doPlayerSendTextMessage(cid, self.config.message.type, self.config.message.onSuccess:format(self:getItemN ame(), (self.item.level + 1)))
if self.config.doBroadcast == true and (self.item.level + 1) >= 7 then
doBroadcastMessage("The ".. self:getItemName() .." of ".. getCreatureName(cid) .." is now in level +".. self.item.level + 1 ..".")
end
if self.item.level > 0 then
self:setItemName(self:getItemName():gsub("%+(%d+)" , "+".. (self.item.level + 1)))
local p = self.config.attributes
for i = 1, #p do
if self:getItemKeyValue(p[i][1]) ~= nil then
self:setItemKeyValue(p[i][1], (self:getItemKeyValue(p[i][1]) + (p[i][2] == true and (self.item.level + 1) or 1)))
end
end
else
self:setItemName(self:getItemName() .." +1")
local p = self.config.attributes
for i = 1, #p do
if self.item.info[p[i][1]] ~= 0 or self:getItemWeaponType() ~= 5 then
self:setItemKeyValue(p[i][1], self.item.info[p[i][1]] + 1)
end
end
end
return true
else
doPlayerSendTextMessage(cid, self.config.message.type, self.config.message.onFail:format(self:getItemName (), (self.item.level - 1)))
if self.config.breakConfig.chance > 0 and math.random(1, 100) <= self.config.breakConfig.chance and self.item.level >= self.config.breakConfig.level then
doPlayerSendTextMessage(cid, self.config.message.type, self.config.message.onBreak:format(self:getItemNam e()))
self:removeItem(1)
else
if self.item.level > 1 then
self:setItemName(self:getItemName():gsub("%+(%d+)" , "+".. (self.item.level - 1)))
local p = self.config.attributes
for i = 1, #p do
if self:getItemKeyValue(p[i][1]) ~= nil then
self:setItemKeyValue(p[i][1], (self:getItemKeyValue(p[i][1]) - (p[i][2] == true and self.item.level or 1)))
end
end
else
self:setItemName(self.item.info.name)
local p = self.config.attributes
for i = 1, #p do
if self.item.info[p[i][1]] ~= 0 or self:getItemWeaponType() ~= 5 then
self:setItemKeyValue(p[i][1], self.item.info[p[i][1]])
end
end
end
end
return false
end
end

Action:
<action itemid="8302;8303" event="script" value="refine.lua"/>

function onUse(cid, item, fromPosition, itemEx, toPosition)
local obj = Refine:load(itemEx)
if obj and obj:upgrade(cid, item) then
doSendMagicEffect(toPosition, CONST_ME_MAGIC_GREEN)
else
doSendMagicEffect(toPosition, CONST_ME_POFF)
return false
end
return true
end
 
Back
Top