Postado Outubro 10, 2012 12 anos 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 Editado Outubro 10, 2012 12 anos por leo420 (veja o histórico de edições)
Postado Dezembro 15, 2012 12 anos Ae cara .. me manda ela pronto.. pq aki ese ai nao pega .. mais Nao sei o pq. vlw
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.