Ir para conteúdo
Entre para seguir isso  
LsM

Advanced Reset System

Recommended Posts

LsM    2
LsM

Advanced Reset System

divisor.png

 

Nome do sistema : Advanced Reset System

Créditos : LsM

Servidor Testado : TFS 0.4 Dev

Informações adicionais : Este sistema é exclusivo do fórum OTServ Brasil.

 

DedoDireita.png Como funciona

 

O sistema consiste em um Npc de reset, ou seja, caso o player atinja tal level configuravel no sistema, ele pode ser resetado, voltando ao level inicial. Este sistema já é adotado em alguns servidores atuais, mas este é um pouco diferente, pois ele não diferencia players por reset, e sim, por classificação hierárquica provinda dos resets. Exemplo :

 

s0wf3k.png

 

Ou seja, de acordo com a quantidade de resets que o player tiver, ele vai se tornando cada vez mais forte em questão de classificação. (Você pode ter uma ideia de como funciona, usando o princípio de posts e de classificação aqui da OTBR, como por exemplo, os ranks "pescador", "escudeiro", etc. Tendo cada rank, uma quantidade necessária de posts).

 

No caso do exemplo da imagem acima, o player tinha apenas um reset, começando assim, sua carreira em tais classificações. Reparem na imagem que o Player é "Squire [Nv. 0]". Caso ele resete mais uma vez, ele se tornará "Squire [Nv. 1]".

 

Caso o Player esteja com a classificação "Squire [Nv. 3]" e dê mais um reset, ele se torna "Count [Nv. 0]" e assim sucessivamente. Todos estes dados já estão pré montados no sistema e você pode facilmente alterar o nome e a quantidade de "Nvls" por classificação, como também adicinar quantas quiser.

 

No sistema, é possível fazer também, alterações como "Não utilizar o edit na descrição do player" e "Não teleportar para o templo ao resetar". Isso estará à sua disposição. Todas as mensagens do NPC podem ser alteradas facilmente, todas estas etapas serão listadas e explicadas no fim do tópico.

 

DedoDireita.png Instalação

 

Primeiramente, execute o seguinte código em seu banco de dados :

 

ALTER TABLE  `players` ADD  `resetid` INTEGER not null default 0
ALTER TABLE  `players` ADD  `reset_class` INTEGER NOT NULL DEFAULT 0

 

Após a etapa acima, crie um arquivo chamado "reset.lua" em "data/npc/scripts" com o seguinte conteúdo :

 

--[[
((OTBR RESET SYSTEM))
Author : LsM
Version : v1.0
Informations : This system was made by LsM to OTServ Brasil. You can get more information at www.otserv.com.br.
]]--

--[[
           ///// INÍCIO DE CONFIGS ///// 
Here you can change that you know what are you doing. 
]]--

--Do not forget to include the external file :
dofile("data/npc/lib/reset-lib.lua")

-- Level config
local toLevel = 8 -- Return to level.
local focuses = {} -- do not change

-- Config
local showInDescription = TRUE -- change it to FALSE if you don't want the system make changes in player description.
local teleportToTemple = TRUE -- change it to FALSE if you don't want the system teleport player to temple after reset.

-- You can change and add new values in the table, but do not change the number in [brackets].
local tbl = {
             [0] = {premiumLevel = 350, freeLevel = 360, description = "Squire", class = 3},
             [1] = {premiumLevel = 360, freeLevel = 370, description = "Count", class = 3},
             [2] = {premiumLevel = 370, freeLevel = 380, description = "Celestial", class = 3},
             [3] = {premiumLevel = 380, freeLevel = 390, description = "Lord", class = 3},
             [4] = {premiumLevel = 390, freeLevel = 400, description = "Emperor", class = 3},
             [5] = {premiumLevel = 400, freeLevel = 420, description = "Cerberus", class = 100} -- Is necessary a higher number in the last class.                 
            }

function onCreatureSay(cid, type, msg)
-- Database configurations
local dtb_player = getPlayerGUID(cid)          
local db_actions = {
                    -- Set Informations
                    setR_Id = "UPDATE `players` SET `resetid` = "..(getResetId(dtb_player) + 1).." WHERE `id`= " .. dtb_player .. ";",
                    setR_Class_Reset = "UPDATE `players` SET `reset_class` = '0' WHERE `id`= " .. dtb_player .. ";",
                    setR_Class_Add = "UPDATE `players` SET `reset_class` = "..(getResetClass(dtb_player) + 1).." WHERE `id`= " .. dtb_player .. ";",
                    setDesc_0 = "UPDATE `players` SET `description` = '. ".. getSexName(dtb_player) .." is ".. tbl[getResetId(dtb_player)].description .." [Nv. 0]' WHERE `id`= " .. dtb_player .. ";", 
                    setDesc_Plus = "UPDATE `players` SET `description` = '. ".. getSexName(dtb_player) .." is ".. tbl[getResetId(dtb_player)].description .." [Nv. ".. getResetClass(dtb_player) .."]' WHERE `id`= " .. dtb_player .. ";",                    
                   }

-- Talk npc configurations
local t_config = {
                 --PlayerSay = "Npc say"
                    Hi = "Hello ".. getCreatureName(cid) ..", I work with resets, do you want to be reseted?",
                    Yes_1 = "Ok, but before I cannot forget to warn you: You will return to level ".. toLevel ..", your skills, attack, magic power will not be change and YOU CANNOT RECOVER YOUR LEVEL AFTER IT. Do you really want to reset your character?", 
                    No = "Ok, then.",
                    Bye = "Good bye ".. getCreatureName(cid) ..".",
                    Player_withBattle = "You cannot reset because you are in fight.",
                    NoLevel = "Sorry, but you do not have level to reset now, you need to advance to level {".. tbl[getResetId(dtb_player)].freeLevel .."}. But if you are premium, you can reset at level {".. tbl[getResetId(dtb_player)].premiumLevel .."}."
                 }

--[[
           ///// FIM DE CONFIGS ///// 
          Do not change anyThing Below.
]]--                                  

-- Início de Main()
local cid_Say = msg:lower()
     if ((cid_Say == "hi") and not (isFocused(cid, focuses))) then
          selfSay(t_config.Hi, cid)
          addFocus(cid, focuses)
          selfFocus(cid)
          talk_step = 1
     elseif ((cid_Say == "yes") and (talk_step == 1)) then
          selfSay(t_config.Yes_1, cid) 
          talk_step = 2
     elseif ((cid_Say == "yes") and (talk_step == 2)) then
              if (isPlayerPzLocked(cid) == FALSE) then
                 if (isPlayer(cid)) then -- Be shure he is online
                    if (((getPlayerLevel(cid) >= tbl[getResetId(dtb_player)].premiumLevel) and (isPremium(cid) == TRUE)) or ((getPlayerLevel(cid) >= tbl[getResetId(dtb_player)].freeLevel) and (isPremium(cid) == FALSE))) then
                            if (teleportToTemple) then
                               doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))  
                            end
                            if (isInArray(tbl[getResetId(dtb_player)].class, getResetClass(dtb_player))) then
                                 resetPlayer(cid, db_actions, 1)
                            else
                                 resetPlayer(cid, db_actions, 0)         
                            end
                            if (showInDescription) then
                                 setDescription(dtb_player, tbl, db_actions)
                            end                     
                    else
                       selfSay(t_config.NoLevel, cid) 
                    end
                 else
                     print("RESET ERROR: Player not found when request (isPlayer). System Paused, no changes in player.")
                     return 0
                 end
              else
                 selfSay(t_config.Player_withBattle, cid)
                 removeFocus(cid, focuses)
              end
     elseif ((cid_Say == "no") and (isInArray({1,2}, talk_step))) then
          selfSay(t_config.No, cid)
          removeFocus(cid, focuses)
     elseif (cid_Say == "bye") then
          selfSay(t_config.Bye, cid)
          removeFocus(cid, focuses)      
     end
end

function onThink()
   for _, focus in pairs(focuses) do
       if not isCreature(focus) then
        removeFocus(focus, focuses)
       else
        local distance = getDistanceTo(focus) or 5
           if distance > 4 then
               selfSay("Hmpf!", focus)
               removeFocus(focus, focuses)
           end
       end
   end
   setFocus(focuses)
end

 

Em seguida, crie um arquivo chamado "reset-lib.lua" em "data/npc/lib" com o seguinte conteúdo :

 

--[[ 
[OTBR] RESET SYSTEM NPC LIB
Made by LsM

Do not change anything in this file, all the content here is very important.
]]--

local focuses = {}
function isFocused(cid, t)
   for i, v in pairs(t) do
       if(v == cid) then
           return true
       end
   end
   return false
end

function addFocus(cid, t)
   if(not isFocused(cid, t)) then
       table.insert(t, cid)
   end
end

function setFocus(t)
   for i, v in pairs(t) do
       if(isPlayer(v)) then
           doNpcSetCreatureFocus(v)
           return
       end
   end
   doNpcSetCreatureFocus(0)
end

function removeFocus(cid, t)
   for i, v in pairs(t) do
       if(v == cid) then
           table.remove(t, i)
           setFocus(focuses)
           break
       end
   end
end

function onCreatureDisappear(cid)
   if isFocused(cid, focuses) then
    removeFocus(cid, focuses)
       if isPlayer(cid) then
        closeShopWindow(cid)
       end
   end
end

function getResetId(pid)
local r = db.getResult("select `resetid` from players where id = ".. pid .."")
if r:getID() == -1 then
	return 0
end
local ret = r:getDataInt('resetid')
r:free()
return tonumber(ret)
end

function getResetClass(pid)
local r = db.getResult("select `reset_class` from players where id = ".. pid .."")
if r:getID() == -1 then
	return 0
end
local ret = r:getDataInt('reset_class')
r:free()
return tonumber(ret)
end

function getSexName(pid)
local sex = {[0] = "She", [1] = "He"}
local r = db.getResult("select `sex` from players where id = ".. pid .."")
	if r:getID() == -1 then
	return 0
end
local ret = r:getDataInt('sex')
r:free()
return sex[tonumber(ret)]
end  

function getLevelExp(n)
n = n - 1
return ((50 * n^3) - (150 * n^2) + (400 * n)) / 3
end

function setDescription(pid, table, dbr)
 local r = db.getResult("select `description` from players where id = ".. pid .."")
 local ret = tostring(r:getDataString('description'))
     if ((ret == "")) or ((ret == table[getResetId(pid)].class)) then
         db.executeQuery(dbr.setDesc_0)
     else
         db.executeQuery(dbr.setDesc_Plus)
     end
end

function setValues(pid)
local x = io.open('data/npc/scripts/reset.lua', 'r')
local tonvl = x:read(-1):lower():match("tolevel = (%d)")
local set = {
              setlevel = "UPDATE `players` SET `level` = ".. tonvl .." WHERE `id`= " .. pid .. ";",
              setexp = "UPDATE `players` SET `experience` = ".. getLevelExp(tonvl) .." WHERE `id`= " .. pid .. ";"
             }    
  x:close()
 return db.executeQuery(set.setlevel) and db.executeQuery(set.setexp)
end

function resetPlayer(cid, table, t)
local db_cid_id = getPlayerGUID(cid)
local t = t or 0
    if (t > 0) then
       db.executeQuery(table.setR_Id);db.executeQuery(table.setR_Class_Reset)
    else
       db.executeQuery(table.setR_Class_Add) 
    end
 return setPlayerStorageValue(cid, Str_Reset, 1) and doRemoveCreature(cid) and setValues(db_cid_id)
end

 

Agora crie um arquivo XML com um nome qualquer em "data/npc" com o seguinte conteúdo :

 

<?xml version="1.0" encoding="UTF-8"?>
<npc name="Nome do npc" script="reset.lua" walkinterval="2000" floorchange="0">
<health now="100" max="100"/>
<look type="130" head="20" body="39" legs="45" feet="7" addons="2"/>
</npc>

 

E para finalizar, crie um arquivo chamado "reset.lua" em "data/creaturescripts/scripts" com o seguinte conteúdo :

 

--[[
Reset System by LsM.
OTServ Brasil © 2011
Version : v1.0
]]--

function onLogin(cid)
 local r = db.getResult("select `description` from players where id = ".. getPlayerGUID(cid) .."")
 local ret = tostring(r:getDataString('description'))
   if (getPlayerStorageValue(cid, Str_Reset) == 1) then
      doPlayerPopupFYI(cid, "Congratulations ".. getCreatureName(cid) ..", now you are a(n) ".. ret:match("He is (.+)%[") .." [Nv. ".. ret:match("Nv. (.+)%]") .."].")
      setPlayerStorageValue(cid, Str_Reset, -1)
   end
 return true
end    

 

E em "creaturescripts.xml" adicione a seguinte tag :

 

<event type="login" name="Reset" event="script" value="reset.lua"/>

 

Pronto ! o sistema está instalado.

 

DedoDireita.png Explicação

 

O sistema foi criado de forma com que sua edição seja maleável e de diversas formas. Algumas considerações serão aplicadas abaixo :

(Tudo o que pode ser configurado, está contido no arquivo : "data/npc/scripts/reset.lua")

 

Alterando as condições, nome das classes e nível máximo de cada classe:

 

[0] = {premiumLevel = 350, freeLevel = 360, description = "Squire", class = 3},

 

No sistema, como descrito acima, os players premium, podem ou não ter uma certa vantagem em Level para resetar, isso é demonstrado em "premiumLevel = 350, freeLevel = 360," na tabela. Os valores podem ser alterados, e caso não queira esta diferença, apenas iguale os dois valores.

 

Para alterar a descrição das classes, você apenas deve mudar o que está entre aspas em "description = "Squire"", no caso, Squire. E, para alterar o nível máximo o qual um Squire pode chegar, basta alterar o número de "class = 3", para o desejado.

 

*Não altere o número que está em colchetes no início da tabela.

 

Adicionando novas classes :

 

Para adicionar novas classes apenas adicione uma nova linha no fim da tabela "tbl", no caso, ficaria por exemplo :

 

local tbl = {
             [0] = {premiumLevel = 350, freeLevel = 360, description = "Squire", class = 3},
             [1] = {premiumLevel = 360, freeLevel = 370, description = "Count", class = 3},
             [2] = {premiumLevel = 370, freeLevel = 380, description = "Celestial", class = 3},
             [3] = {premiumLevel = 380, freeLevel = 390, description = "Lord", class = 3},
             [4] = {premiumLevel = 390, freeLevel = 400, description = "Emperor", class = 3},
             [5] = {premiumLevel = 400, freeLevel = 420, description = "Cerberus", class = 3}[color="red"],[/color]
             [[color="red"]6[/color]] = {premiumLevel = 430, freeLevel = 450, description = "Class1", class = 3}[color="red"],[/color]
             [[color="red"]7[/color]] = {premiumLevel = 470, freeLevel = 500, description = "Class2", class = [color="red"]100[/color]}                 
            }

 

Não se esqueça de aumentar os números entre colchetes "(exemplo : [6])" a cada classe adicionada, como também as vírgulas no fim de cada tabela, como exemplificado em vermelho no código. Lembre-se de deichar o CLASS da ultima classe como um número grande, para que nela, não exista limite.

 

Alterações complementares :

 

Caso queira que o Player não seja teleportado para o templo após o reset, ou que não seja alterado nada em sua descrição, apenas altere como no exemplo abaixo :

 

local showInDescription = [color="red"]FALSE[/color]
local teleportToTemple = [color="red"]FALSE[/color]

 

Caso queira alterar o level para o qual o player voltará ao ser resetado, altere em :

 

local toLevel = [color="red"]8[/color]

 

E, caso queira alterar as falas do NPC, altere em :

 

local t_config = {
                 --PlayerSay = "Npc say"
                    Hi = "Hello ".. getCreatureName(cid) ..", I work with resets, do you want to be reseted?",
                    Yes_1 = "Ok, but before I cannot forget to warn you: You will return to level ".. toLevel ..", your skills, attack, magic power will not be change and YOU CANNOT RECOVER YOUR LEVEL AFTER IT. Do you really want to reset your character?", 
                    No = "Ok, then.",
                    Bye = "Good bye ".. getCreatureName(cid) ..".",
                    Player_withBattle = "You cannot reset because you are in fight.",
                    NoLevel = "Sorry, but you do not have level to reset now, you need to advance to level {".. tbl[getResetId(dtb_player)].freeLevel .."}. But if you are premium, you can reset at level {".. tbl[getResetId(dtb_player)].premiumLevel .."}."
                 }

 

DedoDireita.png Considerações Finais

 

O sistema foi desenvolvido com base na ideia de um usuário do fórum (Tesch123). Esta, foi postada no tópico "Dê a sua ideia".

 

Tentei explicar as funções do sistema da forma mais organizada possível, mas, caso ainda tenha alguma dúvida, ou alguma sugestão, poste aqui, pois estas, serão avaliadas e usadas na segunda versão do sistema.

Estou a desenvolver este mesmo sistema na forma de talkaction, aguardem.

 

No mais, espero que tenham gostado e façam bom proveito do sistema.

Compartilhar este post


Link para o post
Oneshot    24
Oneshot

Um ótimo sistema, LsM.

 

Você soube construir um código muito bom, usando variadas funções LUA, juntamente com funções Open Tibia. Seu sistema de reset é o único, creio, que possui esse bônus de títulos relacionados com a quantidade de resets de um jogador.

 

Será muito útil para todos que queiram um sistema desses e creio que esse é o melhor que já vi no fórum e por aí.

 

APROVADO!

Você receberá V$ 120, seu script foi avaliado como A+.

Editado por Garou

Compartilhar este post


Link para o post
SubythKiller    2
SubythKiller

nossa, assim ele vai fica rico só postando script hsuiHAIUSAs

 

Amei o script cara, muito bom mesmo. Tem varios que ao dar look apareçe os reset system mais esse é mais completo e sem bugs...

 

E agora o :

[font=Georgia][size=3]ALTER TABLE  `players` ADD  `resetid` INTEGER not null default 0
[/size][/font]

 

Não ta bugado \o/ sempre esquecia NOt + Default ;x agora fez completinho mesmo... Parabéns

Compartilhar este post


Link para o post
iuniX    4
iuniX

Não sou muito fan de resets para tibia, mas tenho que admitir, fico fodelão

Parabens :]

Compartilhar este post


Link para o post
dalvorsn    46
dalvorsn

Magnifico :o

Parabéns cara, fico impecável!

Compartilhar este post


Link para o post
vyctor17    35
vyctor17

otimo script lsm topico fiko 10 tambem

Compartilhar este post


Link para o post
tigerx2    1
tigerx2

Muito bom, bem elaborado,

nunca tinha visto um sistema de resets assim.

 

Parabens :)

Compartilhar este post


Link para o post
LsM    2
LsM

Obrigado à todos pelos comentários.

Compartilhar este post


Link para o post
kacalsilvera    0
kacalsilvera

da para perceber o carinho que ele tem em explicar detalhe por detalhe, cara sem palavras

com certeza tera seu merito,,,, parabenzzz:money:

Compartilhar este post


Link para o post
Sweat Survivor    0
Sweat Survivor

Ficou muito maneiro cara, muito bem feito

Tipo poderia configurar o numero de vezes que pode resetar

A cada reset poderia ganhar uma promotion, vocation +4

Poderia configurar tipo quando voltasse nv 8 voltaria com um tanto de hp e mana pre definidos

pra 2.0

 

tava procurando um script assim ç.ç

Editado por Sweat Survivor

Compartilhar este post


Link para o post
JhonnyMotta    0
JhonnyMotta

Ai ; temos que adimitir .. tá super foda !

AUHEUSHUEHS ! Parabeeens mano *-* tu vai ser rico aki com scripts ! táparei ! *-*

Compartilhar este post


Link para o post
Dann Hell    0
Dann Hell

Sao esses tipos de trabalhos que o forum necessita!

Compartilhar este post


Link para o post
Hevancio    0
Hevancio

Primeiramente, execute o seguinte código em seu banco de dados :

 

Código:

ALTER TABLE `players` ADD `resetid` INTEGER not null default 0

ALTER TABLE `players` ADD `reset_class` INTEGER NOT NULL DEFAULT 0

 

Sinceramente , dá para dizer exatamente onde eu executo isso , não entendi.

Só falta isso o resto eu ja fiz.

 

Compartilhar este post


Link para o post
tesch123    0
tesch123

mae oia eu no topico do LsM!!!

 

fico fodah heim manow!!!

to usando ja!

Compartilhar este post


Link para o post
iuniX    4
iuniX
Primeiramente, execute o seguinte código em seu banco de dados :

 

Código:

ALTER TABLE `players` ADD `resetid` INTEGER not null default 0

ALTER TABLE `players` ADD `reset_class` INTEGER NOT NULL DEFAULT 0

 

Sinceramente , dá para dizer exatamente onde eu executo isso , não entendi.

Só falta isso o resto eu ja fiz.

 

 

Abre o phpadmin, vá na tua database e dps clica em sql e coloca isso... só

Compartilhar este post


Link para o post
tesch123    0
tesch123

LsM to com um problema no reset system!

os caras tao resetando ae o char eles buga!

isso nao acontece com todos mas ta crecendo o numero de player q perde char pq bugo!

tem uns q buga no primeiro reset tem uns q buga no quarto sabe resolver?

Compartilhar este post


Link para o post
LsM    2
LsM

Realmente não faço ideia do que pode ser, já que o sistema tem suas próprias tabelas no BD. Após sua denúncia, eu testei várias e várias vezes no meu servidor (TFS 0.4_DEV [8.70]) e não obtive nenhum erro. Já testou em outro distro?

Compartilhar este post


Link para o post
joaotesch    0
joaotesch

vc ja testo em ot 8.60?

Compartilhar este post


Link para o post
otserv-andrade    0
otserv-andrade

Duas Duvidas:

Primeira: O Script Pega em 8.60?

Segunda: Onde fica o NPC do Reset, não estou conseguindo acha-lo nem por Comando [/goto e /s]

Compartilhar este post


Link para o post
joaotesch    0
joaotesch

o npc tambem nao tava aparecendo no meu ae eu mudei umas coisas no script dele e funfo!

Compartilhar este post


Link para o post
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  
  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×