Ir para conteúdo
Oneshot

sistema Perfect Upgrade System

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.

Please login or register to see this link.

Editado por Oneshot

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está impedido de receber novos posts.

  • Conteúdo Similar

    • Por mixtrop10
      Alguém me ajuda pelo amor de Deus 
      É o executável do pokemon master x 
      Vou explicar 
      Você tá lá jogando de boa 
      E do nada o jogo crasha e aparece isso

      Please login or register to see this attachment.
    • Por Duuhzinhow
      Eae galerinha do xtibia, vim aqui hoje para ensinar uma coisa simples, mas que muitos nao sabem, e queriam aprender de uma forma bem facil. Vou ensinar á criar spells básicas de damage, de area, e alvo unico... Primeiro, irei ensinar uma de alvo unico.
       
      Vá em data/spells/scripts copie um arquivo .lua e renomeie para o que desejar:
       
      Please login or register to see this spoiler.
    • Por jenison06
      Base: PokeStorm
      Bom dia
      Queria um Sistema de Usar Potion na Pokeball ou na Portrait se possivel.
       
      Aqui esta meu Potion.lua
      local potions = { [8783] = {baseHeal = 1800, healTimes = 10, msgColor = 175}, --Full Potion [2112] = {baseHeal = 950, healTimes = 8, msgColor = 181}, --Hyper Potion [2113] = {baseHeal = 600, healTimes = 7, msgColor = 23}, --Ultra Potion [2115] = {baseHeal = 350, healTimes = 6, msgColor = 30}, --Great Potion [2114] = {baseHeal = 200, healTimes = 5, msgColor = 177}, --Small Potion [9270] = {baseHeal = 225, healTimes = 5, msgColor = 177}, --Starter's Small Potion } local texts = { [PORTUGUESE] = {"Use isso em você mesmo ou em seu pokémon.", "Você já está se curando.", "Seu pokémon já está sendo curado."}, [ENGLISH] = {"Use it in your pokemon or in yourself.", "You are already healing yourself.", "Your pokemon is already being healed."}, } local potionState = {} local function potionHeal(cid, heal, healed, maxHeal) if isCreature(cid) and healed <= maxHeal then doCreatureAddHealth(cid, heal) doSendMagicEffect(getCreaturePosition(cid), 12) addEvent(potionHeal, 1000, cid, heal, healed+1, maxHeal) else potionState[cid] = nil end end function onUse (cid,item,frompos,item2,topos) local txt = texts[getPlayerLanguage(cid)] local potion = potions[item.itemid] if not isCreature(item2.uid) or getCreatureMaster(item2.uid) ~= cid then doPlayerSendCancel(cid, txt[1]) return true end if not potionState[item2.uid] then if isPokeballIn(item2.itemid) then healQuant = potion.baseHeal*(1+getPlayerSkillLevel(cid, SKILL_FIRSTAID)*0.05) elseif isSummon(item2.uid) then healQuant = potion.baseHeal*(1+getPlayerSkillLevel(cid, SKILL_FIRSTAID)*0.05) else healQuant = potion.baseHeal*(1+getPlayerSkillLevel(cid, SKILL_FIRSTAID)*0.05/2) end potionState[item2.uid] = true doRemoveItem(item.uid, 1) doSendAnimatedText(getCreaturePosition(item2.uid), 'HEALING!', potion.msgColor) potionHeal(item2.uid, healQuant, 1, potion.healTimes) else if isPlayer(item2.uid) then doPlayerSendCancel(cid, txt[2]) else doPlayerSendCancel(cid, txt[3]) end end return true end  
    • Por RIANLHP
      Versão do Servidor: TFS - 0.4 Tipo de Script: monster Código: Please login or register to see this spoiler.
      Pessoal, como adiciona RACE ao meu Wodbo, Só existe dois tipos, Blood e Energy, Queria encontrar outras, não estou conseguindo nem tirar blood dos treiners, alguém pode ajudar? 
      Encontrei solução, se tiver como fechar o tópico agradeço!
    • Por Pluzetti2104
      Versão do Servidor: TFS - 0.3.5 Tipo de Script: moveevent Código: Please login or register to see this spoiler.
      Opa gente beleza? bom seguinte eu tenho o codigo que quando voce sai da cidade ou entra ele informa se esta saindo ou entrando, como do OtPokemon, segue código.
       
       
       
      Ele está configurado pra quando sair para o lado de celadon do mapa, agora eu queria saber, eu fui colocar na posicao do norte, pensei comigo 1 e 3 é pra celadon, entao cerulean resta 2 e 4, tentei mudar, porém ele só mostra a mensagem de eu saindo e nao entrando. (SIM) ja coloquei uma tag especifica pra ele no xml.
      Resumindo pra oeste (celadon) ele vai normal, pra sair de saffron ao norte aparece tbm a mensagem, agr para entrar nao...alguem poderia me dar uma ajudinha por favor?
      obrigado desde já.
×
×
  • Criar Novo...