Jump to content

Olá Tibiano! Notamos que você está com um adblocker ligado... 

Nós promovemos servidores dentro da comunidade, para que eles tenham visibilidade.

Por favor, nos ajude a continuar promovendo esses servidores. Adicione nosso domínio na whitelist de seu adblocker, ok? :)

Oneshot

sistema Perfect Upgrade System

Recommended Posts

Nome: Perfect Upgrade System

Tipo: Biblioteca, Action, Sistema

Autor: Oneshot

 


 

Essa é a versão final do Perfect Refine System ou Perfect Upgrade System criado por mim.

 

É um sistema construído em cima de funções em POO (orientação a objetos), o que o torna muito versátil, possibilitando a outros programadores/scripters criarem seus próprios sistemas com base na biblioteca.

 

A função do sistema é simples. Não passa de um sistema de refino, presente em todos os servidores, onde você usa um item em um equipamento e este fica mais forte e ganha um nome caracterizando o nível de força - bem clichê - mas muito interessante.

 

Meu sistema é um pouco diferente dos outros, pois possui algumas características exclusivas, listadas abaixo:

  • O nível máximo configurável é praticamente ilimitado
  • O sistema funciona com armas de combate corpo-a-corpo, bows e crossbows.
  • O refino pode falhar, não acontecendo nada, regredindo o nível ou resetando ele.
  • Há um sistema nativo de broadcasts, que são enviados quando um jogador consegue refinar um equipamento até um certo nível ou maior.
  • As chances são configuradas manualmente e sua randomização é muito precisa.


 

Há dois modos de instalar o sistema em seu servidor, o primeiro é baixar a pasta com os scripts necessários e apenas copiar as chaves nos arquivos XMLs ou então seguir o curto tutorial de instalação.

 

 

Crie um arquivo chamado upgradesystem.lua na pasta data/lib e copie o conteúdo abaixo:

 

--[[

PERFECT UPGRADE SYSTEM
			2.0

Criado por Oneshot

É proibido a venda ou a cópia sem os devidos créditos desse script.

]]--

UpgradeHandler = {
levels = {
	[1] = {100, false, false},
	[2] = {90, false, false},
	[3] = {75, false, false},
	[4] = {60, true, false},
	[5] = {45, true, false},
	[6] = {30, true, false},
	[7] = {25, true, false},
	[8] = {20, true, true},
	[9] = {15, true, true},
	[10] = {10, true, true},
	[11] = {10, true, true},
	[12] = {5, true, true}
},
broadcast = 7,
attributes = {
	["attack"] = 2,
	["defense"] = 1,
	["armor"] = 1
},
message = {
	console = "Trying to refine %s to level +%s with %s%% success rate.",
	success = "You have upgraded %s to level +%s",
	fail = "You have failed in upgrade of %s to level +%s",
	downgrade = "The upgrade level of %s has downgraded to +%s",
	erase = "The upgrade level of %s has been erased.",
	maxlevel = "The targeted %s is already on max upgrade level.",
	notupgradeable = "This item is not upgradeable.",
	broadcast = "The player %s was successful in upgrading %s to level +%s.\nCongratulations!!",
	invalidtool = "This is not a valid upgrade tool.",
	toolrange = "This upgrade tool can only be used in items with level between +%s and +%s"
},
tools = {
	[8306] = {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

 

Crie um arquivo chamado upgrade.lua em data/actions/scripts e cole o conteúdo abaixo:

 

function onUse(cid, item, fromPosition, itemEx, toPosition)
if isCreature(itemEx.uid) then	
	return doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTPOSSIBLE)
end

local obj = UpgradeHandler:new(itemEx)

if(obj == false) then
	return doPlayerSendCancel(cid, UpgradeHandler.message.notupgradeable)
end

local status = obj:refine(cid, item)
if status == "success" then
	--doSendAnimatedText(toPosition, "Success!", COLOR_GREEN)
	doSendMagicEffect(toPosition, CONST_ME_MAGIC_GREEN)
elseif status == "fail" then
	--doSendAnimatedText(toPosition, "Fail!", COLOR_RED)
	doSendMagicEffect(toPosition, CONST_ME_POFF)
else
	doSendMagicEffect(toPosition, CONST_ME_POFF)
end
return true
end

 

No arquivo actions.xml, cole a seguinte linha:

 

<action itemid="8306" event="script" value="upgrade.lua"/>

 

Para adicionar mais níveis de refino no sistema, edite a seguinte tabela:

 

levels = {
	[1] = {100, false, false},
	[2] = {90, false, false},
	[3] = {75, false, false},
	[4] = {60, true, false},
	[5] = {45, true, false},
	[6] = {30, true, false},
	[7] = {25, true, false},
	[8] = {20, true, true},
	[9] = {15, true, true},
	[10] = {10, true, true}
},

 

Por padrão, ela já está configurado como na maioria dos MMORPGs, 10 níveis de refino, com chances de sucesso, regressão e "quebra".

 

Mas se você quiser, por exemplo, adicionar mais dois níveis, siga o modelo, sempre colocando uma vírgula no final com exceção da última linha da tabela:

 

levels = {
	[1] = {100, false, false},
	[2] = {90, false, false},
	[3] = {75, false, false},
	[4] = {60, true, false},
	[5] = {45, true, false},
	[6] = {30, true, false},
	[7] = {25, true, false},
	[8] = {20, true, true},
	[9] = {15, true, true},
	[10] = {10, true, true},
	[11] = {10, true, true},
	[12] = {5, true, true}
},

 

O primeiro valor é chance de sucesso, o segundo se o item pode regredir na tentativa e o terceiro é se o item para "quebrar" (perder todo o nível de refino).

 

Para criar novas ferramentas (itens) de refinar, configure a tabela abaixo:

 

tools = {
	[8306] = {range = {0, 10}, info = {chance = 0, removeable = true}},
},

 

Seguindo o mesmo esquema da tabela anterior, vírgulas em todas as linhas com exceção da última, seguindo o modelo abaixo.

 

Por exemplo, uma ferramenta de ID 8303 que refine do level +6 ao +10, que dê 10% de chance bônus e que seja finita, eu faço assim:

 

tools = {
	[8306] = {range = {0, 10}, info = {chance = 0, removeable = true}},
	[8310] = {range = {6, 10}, info = {chance = 10, removeable = true}}
},

 


 

Em breve vídeo de demonstração com sistema em funcionamento.

Please login or register to see this link.

Edited by Oneshot

Share this post


Link to post
Share on other sites

eu testei aqui e não ta passando do +1...

 

ta dando esse error aqui

 

 

 

 

[Error - Action Interface ]

data/actions/scripts/refine.lua:onUse

Description:

<luaDoItemSetAttribute> Invalid data type

Edited by karanzinho123

Share this post


Link to post
Share on other sites

Desculpe, fiz inúmeros testes antes de liberar o sistema e ele está totalmente funcional. Você pode comprovar isso assistindo o vídeo.

 

Testei em duas revisões do TheForgottenServer 0.4.0_DEV: rev3884 e rev5639.

Edited by Oneshot

Share this post


Link to post
Share on other sites

Testei no Snowz Thyranic 3.1 e continua dando esse erro... ele funciona digamos que parcialmente, voce usa o item para refinar no item que deseja refinar, ele refina só até +1, voce pode usar quantas vezes quizer que ele não sai do +1

Share this post


Link to post
Share on other sites

Como algumas pessoas já pediram um sistema de refino com base no Bronson OT Server, adicionei duas novas opções ao Perfect Refine System com a função de simular não-fielmente o funcionamento do sistema desse servidor.

 

As duas opções são reagent e amountbylevel, no caso, você pode configurar uma ferramenta que precisa de um item secundário para funcionar. Deixei um exemplo base pré-configurado, um Iron Hammer que precisa de uma quantidade variável de iron ores.

 

Um grande abraço.

Edited by Oneshot

Share this post


Link to post
Share on other sites

Muito bom o 2 ta bem mais configuravel considerando que o script e de alto nivel.

 

Gostou muito de lib fez varias funçoes.

 

Parabens

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

  • Similar Content

    • By davidsanto195
      Recentemente adicionei um site ao meu servidor Baiak, mas dentro do OT o uniqueid que é fornecido ao player que tem acesso a área vip etc é diferente do uniqueid que o player ganha quando compra pelo site. 
      Gostaria de saber se alguém sabe onde fica o arquivo para eu mudar o uniqueid que o player ganha quando compra pelo site?
    • By Marcos VMA
      Boa noite comunidade XTibia , vim perguntar se alguem pode disponibilizar um script que os pokemons selvagens tenham sexo M/F no nome deles como OTP , se esse script for pago peço que alguem diga nas Respostas , Agradeço e desculpem qualquer coisa
    • By luizg33
      Por gentileza. alguém pode fazer uma script com talckaction em que o player fale !attackguild ON/OFF, assim ativa e desativa o ataque em player da guild aliada. 
    • By robson Matheus
      oi gostaria da ajuda de vcs para consertar um erro do meu otnaruto quando eu ligo o server e logo no cliente aparece a list mais não entra. e aparece esse erro.
       
      [19/12/2019 02:56:07] Lee Tonkou has logged in.
      [19/12/2019 02:56:07] [Error - CreatureScript Interface] 
      [19/12/2019 02:56:07] data/creaturescripts/scripts/Exame Chunin.lua:onLogin
      [19/12/2019 02:56:07] Description: 
      [19/12/2019 02:56:07] data/creaturescripts/scripts/Exame Chunin.lua:87: attempt to index global 'exame' (a nil value)
      [19/12/2019 02:56:07] stack traceback:
      [19/12/2019 02:56:07]     data/creaturescripts/scripts/Exame Chunin.lua:87: in function <data/creaturescripts/scripts/Exame Chunin.lua:79>
      [19/12/2019 02:56:07] [Error - CreatureScript Interface] 
      [19/12/2019 02:56:07] data/creaturescripts/scripts/Exame Chunin Fase 2.lua:onLogin
      [19/12/2019 02:56:07] Description: 
      [19/12/2019 02:56:07] data/creaturescripts/scripts/Exame Chunin Fase 2.lua:37: attempt to index global 'exame' (a nil value)
      [19/12/2019 02:56:07] stack traceback:
      [19/12/2019 02:56:07]     data/creaturescripts/scripts/Exame Chunin Fase 2.lua:37: in function <data/creaturescripts/scripts/Exame Chunin Fase 2.lua:35>
      [19/12/2019 02:56:07] [Error - CreatureScript Interface] 
      [19/12/2019 02:56:07] data/creaturescripts/scripts/stamina.lua:onLogin
      [19/12/2019 02:56:07] Description: 
      [19/12/2019 02:56:07] data/creaturescripts/scripts/stamina.lua:16: attempt to call global 'regen' (a nil value)
      [19/12/2019 02:56:07] stack traceback:
      [19/12/2019 02:56:07]     data/creaturescripts/scripts/stamina.lua:16: in function <data/creaturescripts/scripts/stamina.lua:1>
      [19/12/2019 02:56:07] [Error - CreatureScript Interface] 
      [19/12/2019 02:56:07] data/creaturescripts/scripts/login.lua:onLogout
      [19/12/2019 02:56:07] Description: 
      [19/12/2019 02:56:07] data/creaturescripts/scripts/login.lua:76: attempt to call global 'cleanKagemaneTargetList' (a nil value)
      [19/12/2019 02:56:07] stack traceback:
      [19/12/2019 02:56:07]     data/creaturescripts/scripts/login.lua:76: in function <data/creaturescripts/scripts/login.lua:75>
      [19/12/2019 02:56:08] Lee Tonkou has logged out.
       
      no server ser alguem souber como consertar comenta.
       
       
    • By jeanshamayin
      Versão do Servidor: TFS - 0.3.5 Tipo de Script: actions Código: Please login or register to see this spoiler.
       
×
×
  • Create New...