Dark Skyllen 7 #1 Posted June 25, 2010 (edited) 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. 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: 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: Edited July 2, 2010 by Dark Skyllen 1 boxxer321 reacted to this Share this post Link to post
Tyladron 1 #2 Posted June 25, 2010 Wow! Testei aqui não é que deu certo?! 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! Share this post Link to post
Dark Skyllen 7 #3 Posted June 26, 2010 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. Share this post Link to post
Jojow 0 #4 Posted June 26, 2010 num entendu muito disso...mas vi que teve trabalho, tks por traze pra galera Reset System?! MU ?! *-* Share this post Link to post
Nido. 0 #5 Posted June 26, 2010 Consegui botar aqui , só que nem vou usar... resete?! coisa de MU Share this post Link to post
Dark Skyllen 7 #6 Posted June 26, 2010 Consegui botar aqui , só que nem vou usar... resete?! coisa de MU 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. Share this post Link to post
Pedro 1 #8 Posted June 27, 2010 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. Share this post Link to post
Fantom 1 #10 Posted June 28, 2010 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. Share this post Link to post
Tyladron 1 #11 Posted June 28, 2010 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 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. Share this post Link to post
D u k e e H 0 #12 Posted July 18, 2010 2.0 por favoor. é tenso ficar com players 'imortais' :/ Share this post Link to post
Dark Skyllen 7 #13 Posted July 22, 2010 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. Share this post Link to post
Raphael Carnaúba 1 #14 Posted July 26, 2010 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 Share this post Link to post
nogareD 0 #15 Posted July 26, 2010 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 Share this post Link to post
Chê. 1 #16 Posted July 27, 2010 Independente do code, só o fato de postar algo mais complexo aqui na otnet já merece meus parabéns (: Share this post Link to post
Dark Skyllen 7 #17 Posted July 27, 2010 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 Share this post Link to post
Master Viciado 3 #18 Posted July 28, 2010 @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 Share this post Link to post
Dark Skyllen 7 #19 Posted July 28, 2010 @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. Share this post Link to post
lucasde12 0 #20 Posted August 8, 2010 Script de um membro do forum rival,ele merece os creditor não adianta só mudar a foto e falar que o script é seu Share this post Link to post