Ir para conteúdo
  • 0

Sistema Refinamento - Oque Falta Pro Ot..


leo420

Pergunta

Galera to com um script aqui que quero muito usar no meu ot, porém ele tem um pequeno bug que nao sei concerta-lo, ve se voces podem me ajudar:

 

1 - To usando um sistema de refinamento que uma pedra id 8302(Jewel of Bless) aumenta até +6 de atributos nos items, atk def arm, e uma pedra id 8303(Jewel of Soul) que aumenta até +10..porém quando usada a pedra em escudo ele aumenta defesa e (atk), queria que ele só acrescenta defesa, porque shield com atk nao da certo '-'..

 

2 - No mesmo script de refinamento, quando usado muito as jewels manda a seguinte mensagem no console:

 

 

[10/10/2012 00:10:54] [Error - Action Interface]

[10/10/2012 00:10:54] data/actions/scripts/refine.lua:onUse

[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 ):

 

 

 

-- 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:getItemName(), (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[1]) ~= nil then

self:setItemKeyValue(p[1], (self:getItemKeyValue(p[1]) + (p[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[1]] ~= 0 or self:getItemWeaponType() ~= 5 then

self:setItemKeyValue(p[1], self.item.info[p[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:getItemName()))

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[1]) ~= nil then

self:setItemKeyValue(p[1], (self:getItemKeyValue(p[1]) - (p[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[1]] ~= 0 or self:getItemWeaponType() ~= 5 then

self:setItemKeyValue(p[1], self.item.info[p[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

 

alguem ai pode me ajudar ?

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

2 respostass a esta questão

Posts Recomendados

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...