Ir para conteúdo
Dark Skyllen

Reset System - 1.0

Recommended Posts

Dark Skyllen    7
Dark Skyllen

DSystem - Reset v1.0

 

 

Irei ensiná-los, como adicionar um sistemas de resets no seu servidor. O sistema funciona da seguinte forma: É adicionada uma nova coluna no seu banco de dados, na tabela player, denominada resets. Nessa tabela irão conter os resets do jogador. No jogo, ao dar look em um jogador, os resets são mostrados.

 

 

 

reset.png

 

 

Também, irei disponibilizar novas funções LUA que possibilitarão o uso dos resets por scripts.

 

 

 

 

  • Alterando seu banco de dados

Primeiramente, usarei o SQLite para demonstrar como alterar a tabela de players, onde o mesmo código, também pode ser usado no phpMyAdmin para os usuários de MySQL.

Abra seu SQLite e após selecionar seu banco de dados, abra o editor de SQL Query. Para quem não sabe abrir, basta seguir a imagem:

 

img01u.png

 

 

Digite o seguinte código no seu SQL Query editor:

ALTER TABLE players ADD resets INTEGER not null default 0

Execute este código, apertando F9.

Pode ser que ao executar o código, demore um pouco, aguarde.

 

 

  • Alterando as sources

Pra quem tem as sources e deseja alterar, aqui vai o tutorial. Bom, em primeiro lugar, o tutorial foi feito com a versão 0.3.6 do The Forgotten Server, que seu download pode ser encontrado aqui no fórum, junto das sources.

 

 

  • Player.h

Na suas sources, vá ao arquivo player.h e procure (ctrl+f) por:

uint32_t level;

Após o texto encontrado, adicione o seguinte:

uint32_t resets;

  • Iologindata.cpp

Vá até o arquivo iologindata.cpp e procure por:

 


query << "SELECT `id`, `account_id`, `group_id`, `world_id`, `sex`, `vocation`, `experience`, `level`, `maglevel`, ";
query << "`health`, `healthmax`, `blessings`, `mana`, `manamax`, `manaspent`, `soul`, `lookbody`, `lookfeet`, ";
query << "`lookhead`, `looklegs`, `looktype`, `lookaddons`, `posx`, `posy`, `posz`, `cap`, `lastlogin`, ";
query << "`lastlogout`, `lastip`, `conditions`, `skull`, `skulltime`, `guildnick`, `rank_id`, `town_id`, ";
query << "`balance`, `stamina`, `direction`, `loss_experience`, `loss_mana`, `loss_skills`, `loss_containers`, ";
query << "`loss_items`, `marriage`, `promotion`, `description` FROM `players` WHERE `name` ";
query << db->getStringComparison() << db->escapeString(name) << " AND `world_id` = ";
query << g_config.getNumber(ConfigManager::WORLD_ID) << " AND `deleted` = 0 LIMIT 1";

Altere todo este código para:

    query << "SELECT `id`, `account_id`, `group_id`, `world_id`, `sex`, `vocation`, `experience`, `level`, `resets`, `maglevel`, ";
   query << "`health`, `healthmax`, `blessings`, `mana`, `manamax`, `manaspent`, `soul`, `lookbody`, `lookfeet`, ";
   query << "`lookhead`, `looklegs`, `looktype`, `lookaddons`, `posx`, `posy`, `posz`, `cap`, `lastlogin`, ";
   query << "`lastlogout`, `lastip`, `conditions`, `skull`, `skulltime`, `guildnick`, `rank_id`, `town_id`, ";
   query << "`balance`, `stamina`, `direction`, `loss_experience`, `loss_mana`, `loss_skills`, `loss_containers`, ";
   query << "`loss_items`, `marriage`, `promotion`, `description` FROM `players` WHERE `name` ";
   query << db->getStringComparison() << db->escapeString(name) << " AND `world_id` = ";
   query << g_config.getNumber(ConfigManager::WORLD_ID) << " AND `deleted` = 0 LIMIT 1";

Ainda em iologindata.cpp, procure por:

player->level = std::max((uint32_t)1, (uint32_t)result->getDataInt("level"));

Após o código encontrado, adicione o seguinte código:

player->resets = (uint32_t)result->getDataInt("resets");

Ainda em iologindata.cpp, procure por:

query << "`maglevel` = " << player->magLevel << ", ";

Após o código acima, adicione:

query << "`resets` = " << player->resets << ", ";

  • Player.cpp

Vá até o arquivo player.cpp e procure pelo seguinte código:

s << " (Level " << level << ")";

Altere para:

s << " (Level " << level << " [Resets: " << resets << "])";

  • Adicionando comandos LUA

 

Vamos adicionar os comandos LUA que poderão trabalhar com nosso sistema de resets:

 

 

- getResets(cid)

 

Vá até player.h e procure por:

void setPromotionLevel(uint32_t pLevel);

Após isso, adicione:

uint32_t getResets() { return resets }

Agora vá em luascript.cpp e procure por:

int32_t LuaScriptInterface::luaDoPlayerSetIdleTime(lua_State* L)
{
   //doPlayerSetIdleTime(cid, amount)
   int64_t amount = popNumber(L);
   ScriptEnviroment* env = getEnv();
   if(Player* player = env->getPlayerByUID(popNumber(L)))
   {
       player->setIdleTime(amount);
       lua_pushboolean(L, true);
   }
   else
   {
       errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));
       lua_pushboolean(L, false);
   }
   return 1;
}

Após o código, adicione:

int32_t LuaScriptInterface::luaGetResets(lua_State* L)
{
   //getResets(cid)
   ScriptEnviroment* env = getEnv();
   if(Player* player = env->getPlayerByUID(popNumber(L)))
       lua_pushnumber(L, player->getResets());
   else
   {
       errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));
       lua_pushboolean(L, false);
   }
   return 1;
}

Ainda em luascript.cpp procure por:

    //doPlayerSetIdleTime(cid, amount)
   lua_register(m_luaState, "doPlayerSetIdleTime", LuaScriptInterface::luaDoPlayerSetIdleTime);

Após o código, adicione:

    //getResets(cid)
   lua_register(m_luaState, "getResets", LuaScriptInterface::luaGetResets);

Agora em luascript.h procure por:

static int32_t luaDoPlayerSetIdleTime(lua_State* L);

Após isso, adicione:

static int32_t luaGetResets(lua_State* L);

- setResets(cid, amount)

 

Vá em luascript.h e procure por:

static int32_t luaGetResets(lua_State* L);

Após isso, adicione:

static int32_t luaSetResets(lua_State* L);

Agora vá até luascript.cpp e procure por:

int32_t LuaScriptInterface::luaGetResets(lua_State* L)
{
   //getResets(cid)
   ScriptEnviroment* env = getEnv();
   if(Player* player = env->getPlayerByUID(popNumber(L)))
       lua_pushnumber(L, player->getResets());
   else
   {
       errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));
       lua_pushboolean(L, false);
   }
   return 1;
}

Após isso, adicione:

int32_t LuaScriptInterface::luaSetResets(lua_State* L)
{
   //setResets(cid, amount)
   int32_t amount = popNumber(L);
   ScriptEnviroment* env = getEnv();
   if(Player* player = env->getPlayerByUID(popNumber(L)))
   {
       player->setResets(amount);
       lua_pushboolean(L, true);
   }
   else
   {
       errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));
       lua_pushboolean(L, false);
   }
   return 1;
}

Ainda em luascript.cpp, procure por:

    //getResets(cid)
   lua_register(m_luaState, "getResets", LuaScriptInterface::luaGetResets);

 

Após isso, adicione:

//setResets(cid, amount)
lua_register(m_luaState, "setResets", LuaScriptInterface::luaSetResets);

 

Agora vá até player.h e procure por:

uint32_t getResets() { return resets; }

Após isso, adicione:

void setResets(int32_t amount) { resets += amount; if (resets < 0) {resets = 0;} }

Pronto, agora é só usar os comandos no seu script:

 

getResets(cid) - Retorna o número de resets

setResets(cid, amount) - Aumenta ou diminui os resets conforme a quantidade.

 

Para quem quiser, segue em anexo o servidor já compilado, versão 0.3.6 do The Forgotten Server.

 

 

Segue em anexo o servidor já compilado:

Editado por Dark Skyllen

Compartilhar este post


Link para o post
Tyladron    1
Tyladron

Wow! Testei aqui não é que deu certo?! :o

Sempre procurei como colocar o sistema de resets e aparecer os resets do player ao dar look, e agora com esse sistema, podemos adicionar também no site, legal!

 

Parabéns Dark Skyllenght como sempre você e os outros moderadores (só tem mais o Piikachu né :fist:), mas como os contribuintes para seção sempre fazendo um ótimo trabalho aqui!

 

:bye:

Compartilhar este post


Link para o post
Dark Skyllen    7
Dark Skyllen

Sim, da pra adicionar no site e fazer muitos scripts em relação aos resets. Prometo que em alguns dias apresento a versão 2.0, onde os resets modificarão a força dos hits e das magias, ou seja, quanto mais resets, mais forte.

Compartilhar este post


Link para o post
Jojow    0
Jojow

num entendu muito disso...mas vi que teve trabalho, tks por traze pra galera :) Reset System?! MU ?! *-*

Compartilhar este post


Link para o post
Nido.    0
Nido.

Consegui botar aqui , só que nem vou usar... resete?! coisa de MU :P

Compartilhar este post


Link para o post
Dark Skyllen    7
Dark Skyllen
Consegui botar aqui , só que nem vou usar... resete?! coisa de MU :P

 

Sim, é parecido com os resets de mu. É ótimo para servidores high rate, agora, o que irão fazer com os resets, vai depender de cada um.

Compartilhar este post


Link para o post
Gabrivil    0
Gabrivil

Muito bom esse sistema!!!

Compartilhar este post


Link para o post
Pedro    1
Pedro

Gostei pacas ein Dark Skyllen, parabéns. Díficil o pessoal postar abertamente esse tipo de conteúdo mais complexo, assim que vai movimentar a seção programação. Acho que com a versão 2.0 então, o sistema vai ficar bem útil em qualquer servidor.

Compartilhar este post


Link para o post
Augustocsm    0
Augustocsm

Massa mesmo valeu!!!

Compartilhar este post


Link para o post
Fantom    1
Fantom

Manow desde a versão 7.6 eu via os GODs fazendo os resets manualmente quando um player chegava lvl 350, e sempre axei muito legal...

Agora com essa evolução, ficou muito massa.

Eu tinha visto esse sistema parecido no RadBr.

Sempre vi esse sistema sendo muito útil, pois torna o RPG mais agradável (na minha opinião)...

Parabéns pelo script...

Agora se a V2 tiver do jeito que vc falou, quanto mais reset mais forte, eu vou até chorar.

Parabéns man.

 

Att.

Compartilhar este post


Link para o post
Tyladron    1
Tyladron

Humm...como Pedro e Fantom disse, apenas servidores que tenham um equipe eficiente consegue fazer sistemas desse tipo entre outros...

Agora, fica mais aberto para praticamente qualquer um fazer um sistema avançado desse e ser feliz :D

Então faz com que os servidores avançados de hoje em dia vão evoluindo e tentando colocar um diferencial em seu servidor a cada dia para não ficar comum.

Compartilhar este post


Link para o post
D u k e e H    0
D u k e e H

2.0 por favoor.

é tenso ficar com players 'imortais' :/

Compartilhar este post


Link para o post
Dark Skyllen    7
Dark Skyllen
2.0 por favoor.

é tenso ficar com players 'imortais' :/

 

A versão 2.0 sairá em breve. Quando ao fato dos players imortais, criei a função LUA exatamente para que possam ajustar as coisas de acordo com as necessidades.

Compartilhar este post


Link para o post
Raphael Carnaúba    1
Raphael Carnaúba

Eaí Dark, tudo beleza?

Cara, eu lí seu codigo, porque voce não usa luaSQL pra puxar as informações de reset, ao invés de modificar as sources? é apenas uma sugestão.

Fora isso, parabéns :)

Compartilhar este post


Link para o post
nogareD    0
nogareD
Eaí Dark, tudo beleza?

Cara, eu lí seu codigo, porque voce não usa luaSQL pra puxar as informações de reset, ao invés de modificar as sources? é apenas uma sugestão.

Fora isso, parabéns :)

 

db.executeQuery(query)

mas já foi feito pelo mock

Compartilhar este post


Link para o post
Chê.    1
Chê.

Independente do code, só o fato de postar algo mais complexo aqui na otnet já merece meus parabéns (:

Compartilhar este post


Link para o post
Dark Skyllen    7
Dark Skyllen
Eaí Dark, tudo beleza?

Cara, eu lí seu codigo, porque voce não usa luaSQL pra puxar as informações de reset, ao invés de modificar as sources? é apenas uma sugestão.

Fora isso, parabéns :)

 

Pois com a implementação no code, não é necessário usar query toda hora pra verificar o número de resets OiaeuMae

Compartilhar este post


Link para o post
Master Viciado    3
Master Viciado

@Sobre sua resposta no boletim:

 

Na verdade o RadBR teve a idéia de usar o sistema de resets que é baseado no jogo MU (pirata) primeiro e também foi o servidor que deu certo quanto a usar esse sistema de resetar etc até hoje...

 

O sistema que você criou, é sim bastante parecido com o atual do RadBR que alias conseguimos fazer um sistema parecido com o seu a mais de 4 meses atrás, que foi aparecer look no reset dentre outros. Se tiver duvidando basta olhar em nosso site a notícia do mês de abril.

 

Então, não vejo motivos para você dizer que o sistema não tem nada haver com o RadBR.

 

Mesmo assim, parabéns pela iniciativa.

 

Você consegue fazer com que apareça o reset junto com o chat que nem o level?

 

Ex: 16:50 Player (33) [22]: E ae galera

Compartilhar este post


Link para o post
Dark Skyllen    7
Dark Skyllen
@Sobre sua resposta no boletim:

 

Na verdade o RadBR teve a idéia de usar o sistema de resets que é baseado no jogo MU (pirata) primeiro e também foi o servidor que deu certo quanto a usar esse sistema de resetar etc até hoje...

 

O sistema que você criou, é sim bastante parecido com o atual do RadBR que alias conseguimos fazer um sistema parecido com o seu a mais de 4 meses atrás, que foi aparecer look no reset dentre outros. Se tiver duvidando basta olhar em nosso site a notícia do mês de abril.

 

Então, não vejo motivos para você dizer que o sistema não tem nada haver com o RadBR.

 

Mesmo assim, parabéns pela iniciativa.

 

Você consegue fazer com que apareça o reset junto com o chat que nem o level?

 

Ex: 16:50 Player (33) [22]: E ae galera

 

Sim, eu não disse que meu sistema veio primeiro que os seus ou algo ao contrário. Só tenho a admirar o sistema de vocês, é um ótimo sistema. O meu trabalho é disponibilizar conteúdos e cuidar da seção de programação, foi o que fiz. Fiz um sistema que pode ser usado para muitos.

 

Quanto aos resets nas falas, posso fazer sim.

Compartilhar este post


Link para o post
lucasde12    0
lucasde12

Script de um membro do forum rival,ele merece os creditor não adianta só mudar a foto e falar que o script é seu

Compartilhar este post


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

    Nenhum usuário registrado visualizando esta página.

×