Ir para conteúdo

Perfect Upgrade System


Oneshot

Posts Recomendados

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.

Perfect Upgrade System.rar

Editado por Oneshot
Link para o comentário
Compartilhar em outros 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

Editado por karanzinho123
Link para o comentário
Compartilhar em outros 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.

Editado por Oneshot
Link para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros sites

simplesmente foda

ta bem mais configurável que a primeira versão, e tem algumas funções extras que são fundamentais.

mto bom bruno

Link para o comentário
Compartilhar em outros sites

acho que seria dahora se tive outros tipos de atributos(tipo pra armor aumenta hp ou mana,aumenta skill,aumenta resistemacia comtra elemnetso especificos,danos elementais)

Link para o comentário
Compartilhar em outros sites

Seria daora sim, principalmente se as funções nativas dos servidores permitissem que eu fizesse isso.

Editado por Oneshot
Link para o comentário
Compartilhar em outros 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.

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

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