Oneshot 732 Postado Janeiro 12, 2013 Share Postado Janeiro 12, 2013 (editado) Account Manager Adicionando "Escolha de Cidade" Fala, minha galera do Éks. Vocês sabem que é minoria servidores que possuem site, uma vez que quando queremos criar um servidor (mais por lazer), é meio que inviável hostear um site junto. Os account makers, assim como são chamados os sites de servidores, dão ao jogador a opção de escolher a cidade que ele vai morar. Já o Account Manager, aquele sistema interno de administração da conta de um jogador, não possue uma opção de escolha de cidade, o que o deixa muito limitado. Principalmente para servidores derivados, onde é quase que necessário, que o jogador possa escolher sua cidade. Pensando nisso, desenvolvi uma série de modificações que irão adicionar ao seu servidor, a opção de "escolher uma cidade" no sistema do Account Manager. Instalação Você precisa seguir todos os passos abaixo com atenção o bastante para não pular nenhum, senão poderá ocorrer algum erro na compilação. Vale lembrar que não basta modificar os arquivos passados, você precisa re-compilar seu servidor e, após, substituir o executável. Vamos começar. No arquivo config.lua de seu servidor, procure por: newPlayerSpawnPosX = 95 newPlayerSpawnPosY = 117 newPlayerSpawnPosZ = 7 newPlayerTownId = 1 Apague, substituindo pelas linhas abaixo: newPlayerChooseTown = true newPlayerDefaultTownId = 1 A partir daqui, você irá precisar das sources de seu servidor. No arquivo configmanager.h e procure pelas seguintes linhas: SPAWNPOS_X, SPAWNPOS_Y, SPAWNPOS_Z, SPAWNTOWN_ID, Substitua por: DEFAULT_TOWN_ID, Procure por: START_CHOOSEVOC, Logo abaixo adicione: START_CHOOSETOWN, No arquivo configmanager.cpp, procure por: m_confNumber[sPAWNPOS_X] = getGlobalNumber("newPlayerSpawnPosX", 100); m_confNumber[sPAWNPOS_Y] = getGlobalNumber("newPlayerSpawnPosY", 100); m_confNumber[sPAWNPOS_Z] = getGlobalNumber("newPlayerSpawnPosZ", 7); m_confNumber[sPAWNTOWN_ID] = getGlobalNumber("newPlayerTownId", 1); Substitua por: m_confNumber[DEFAULT_TOWN_ID] = getGlobalNumber("newPlayerDefaultTownId", 1); Procure por: m_confBool[sTART_CHOOSEVOC] = getGlobalBool("newPlayerChooseVoc", false); Adicione logo abaixo: m_confBool[sTART_CHOOSETOWN] = getGlobalBool("newPlayerChooseTown", true); No arquivo iologindata.h, procure por: bool createCharacter(uint32_t accountId, std::string characterName, int32_t vocationId, uint16_t sex); Substitua por: bool createCharacter(uint32_t accountId, std::string characterName, int32_t vocationId, uint16_t sex, uint32_t townId); No arquivo iologindata.cpp, procure por: bool IOLoginData::createCharacter(uint32_t accountId, std::string characterName, int32_t vocationId, uint16_t sex) { if(playerExists(characterName)) return false; Vocation* vocation = Vocations::getInstance()->getVocation(vocationId); Vocation* rookVoc = Vocations::getInstance()->getVocation(0); uint16_t healthMax = 150, manaMax = 0, capMax = 400, lookType = 136; if(sex % 2) lookType = 128; uint32_t level = g_config.getNumber(ConfigManager::START_LEVEL), tmpLevel = std::min((uint32_t)7, (level - 1)); uint64_t exp = 0; if(level > 1) exp = Player::getExpForLevel(level); if(tmpLevel > 0) { healthMax += rookVoc->getGain(GAIN_HEALTH) * tmpLevel; manaMax += rookVoc->getGain(GAIN_MANA) * tmpLevel; capMax += rookVoc->getGainCap() * tmpLevel; if(level > 8) { tmpLevel = level - 8; healthMax += vocation->getGain(GAIN_HEALTH) * tmpLevel; manaMax += vocation->getGain(GAIN_MANA) * tmpLevel; capMax += vocation->getGainCap() * tmpLevel; } } Database* db = Database::getInstance(); DBQuery query; query << "INSERT INTO `players` (`id`, `name`, `world_id`, `group_id`, `account_id`, `level`, `vocation`, `health`, `healthmax`, `experience`, `lookbody`, `lookfeet`, `lookhead`, `looklegs`, `looktype`, `lookaddons`, `maglevel`, `mana`, `manamax`, `manaspent`, `soul`, `town_id`, `posx`, `posy`, `posz`, `conditions`, `cap`, `sex`, `lastlogin`, `lastip`, `skull`, `skulltime`, `save`, `rank_id`, `guildnick`, `lastlogout`, `blessings`, `online`) VALUES (NULL, " << db->escapeString(characterName) << ", " << g_config.getNumber(ConfigManager::WORLD_ID) << ", 1, " << accountId << ", " << level << ", " << vocationId << ", " << healthMax << ", " << healthMax << ", " << exp << ", 68, 76, 78, 39, " << lookType << ", 0, " << g_config.getNumber(ConfigManager::START_MAGICLEVEL) << ", " << manaMax << ", " << manaMax << ", 0, 100, " << g_config.getNumber(ConfigManager::SPAWNTOWN_ID) << ", " << g_config.getNumber(ConfigManager::SPAWNPOS_X) << ", " << g_config.getNumber(ConfigManager::SPAWNPOS_Y) << ", " << g_config.getNumber(ConfigManager::SPAWNPOS_Z) << ", 0, " << capMax << ", " << sex << ", 0, 0, 0, 0, 1, 0, '', 0, 0, 0)"; return db->query(query.str()); } Substitua por: bool IOLoginData::createCharacter(uint32_t accountId, std::string characterName, int32_t vocationId, uint16_t sex, uint32_t townId) { if(playerExists(characterName)) return false; Vocation* vocation = Vocations::getInstance()->getVocation(vocationId); Vocation* rookVoc = Vocations::getInstance()->getVocation(0); Town* town = Towns::getInstance()->getTown(townId); uint16_t healthMax = 150, manaMax = 0, capMax = 400, lookType = 136; if(sex % 2) lookType = 128; uint32_t level = g_config.getNumber(ConfigManager::START_LEVEL), tmpLevel = std::min((uint32_t)7, (level - 1)); uint64_t exp = 0; if(level > 1) exp = Player::getExpForLevel(level); if(tmpLevel > 0) { healthMax += rookVoc->getGain(GAIN_HEALTH) * tmpLevel; manaMax += rookVoc->getGain(GAIN_MANA) * tmpLevel; capMax += rookVoc->getGainCap() * tmpLevel; if(level > 8) { tmpLevel = level - 8; healthMax += vocation->getGain(GAIN_HEALTH) * tmpLevel; manaMax += vocation->getGain(GAIN_MANA) * tmpLevel; capMax += vocation->getGainCap() * tmpLevel; } } Database* db = Database::getInstance(); DBQuery query; query << "INSERT INTO `players` (`id`, `name`, `world_id`, `group_id`, `account_id`, `level`, `vocation`, `health`, `healthmax`, `experience`, `lookbody`, `lookfeet`, `lookhead`, `looklegs`, `looktype`, `lookaddons`, `maglevel`, `mana`, `manamax`, `manaspent`, `soul`, `town_id`, `posx`, `posy`, `posz`, `conditions`, `cap`, `sex`, `lastlogin`, `lastip`, `skull`, `skulltime`, `save`, `rank_id`, `guildnick`, `lastlogout`, `blessings`, `online`) VALUES (NULL, " << db->escapeString(characterName) << ", " << g_config.getNumber(ConfigManager::WORLD_ID) << ", 1, " << accountId << ", " << level << ", " << vocationId << ", " << healthMax << ", " << healthMax << ", " << exp << ", 68, 76, 78, 39, " << lookType << ", 0, " << g_config.getNumber(ConfigManager::START_MAGICLEVEL) << ", " << manaMax << ", " << manaMax << ", 0, 100, " << townId << ", " << town->getPosition().x << ", " << town->getPosition().y << ", " << town->getPosition().z << ", 0, " << capMax << ", " << sex << ", 0, 0, 0, 0, 1, 0, '', 0, 0, 0)"; return db->query(query.str()); } No arquivo player.h, procure por: int32_t managerNumber, managerNumber2; Substitua por: int32_t managerNumber, managerNumber2, managerNumber3; No arquivo player.cpp, procure por: editListId = maxWriteLen = windowTextId = rankId = 0; Adicione logo abaixo: managerNumber3 = g_config.getNumber(ConfigManager::DEFAULT_TOWN_ID); Procure por: case MANAGER_ACCOUNT: Muita atenção neste passo. Você precisará substituir todo o conteúdo do case pelo conteúdo abaixo, ou seja: Substitua isso: case MANAGER_ACCOUNT: { ... } Por isso: ZD3xYbg4[/pastebin] Demonstração Testado em The Forgotten Server 0.4 rev3884. Pode não funcionar em versões anteriores. Editado Janeiro 14, 2013 por Oneshot Link para o comentário Compartilhar em outros sites More sharing options...
fredpadua 65 Postado Janeiro 12, 2013 Share Postado Janeiro 12, 2013 Esse foi um pedido desses dias Vai ajudar mta gente Parabens Oneshot . Link para o comentário Compartilhar em outros sites More sharing options...
Gabriel Couto 293 Postado Janeiro 12, 2013 Share Postado Janeiro 12, 2013 Cara, parabéns, incrível! Reputado e Postado no Portal e no Facebook =) Link para o comentário Compartilhar em outros sites More sharing options...
bisosonho 2 Postado Janeiro 12, 2013 Share Postado Janeiro 12, 2013 muuito bom, sera q funciona na versoes 981? e teria diferença entre citys premium e free? Link para o comentário Compartilhar em outros sites More sharing options...
JustinnoTibianno 71 Postado Janeiro 12, 2013 Share Postado Janeiro 12, 2013 Era o que faltava no account manager, vai da um RPG a mais no servidor parabéns cara Link para o comentário Compartilhar em outros sites More sharing options...
Oneshot 732 Postado Janeiro 12, 2013 Autor Share Postado Janeiro 12, 2013 Este é o problema, não existe uma função nos headers para diferir entre uma cidade premium e uma cidade free. Mas irei desenvolver algo assim que puder sobre isso. Abraços. Link para o comentário Compartilhar em outros sites More sharing options...
bisosonho 2 Postado Janeiro 12, 2013 Share Postado Janeiro 12, 2013 aaah entendi, entao ele vai dar a opção de TODAS as citys? e se for o caso, teria como fazer uma modificação de blocked ids? ai no caso usar em um global Link para o comentário Compartilhar em outros sites More sharing options...
Oneshot 732 Postado Janeiro 12, 2013 Autor Share Postado Janeiro 12, 2013 (editado) Vou fazer algo sobre as cidades premium assim que eu puder. Abraços. Editado Janeiro 12, 2013 por Oneshot Link para o comentário Compartilhar em outros sites More sharing options...
bisosonho 2 Postado Janeiro 12, 2013 Share Postado Janeiro 12, 2013 de booa, qnd eu voltar pra casa irei testar seu codigo, valeu! Link para o comentário Compartilhar em outros sites More sharing options...
TheSlayer 22 Postado Janeiro 12, 2013 Share Postado Janeiro 12, 2013 Uma vez eu fiz assim: Eu deixei o acc manager pro player nascer num lugar que n tinha nada so umas decoraçoes,e dai eu eu coloquei os tps das cidades so que foi uma ideia inutil,porque n deu certo oque eu queria faze mas enfim,mt bom cara adorei. Link para o comentário Compartilhar em outros sites More sharing options...
Plfmoura 6 Postado Janeiro 15, 2013 Share Postado Janeiro 15, 2013 Té q fim achei kkk Obrigado man ajudou bastante aqui :] Link para o comentário Compartilhar em outros sites More sharing options...
AlexandreKG 134 Postado Janeiro 15, 2013 Share Postado Janeiro 15, 2013 Muito bom,parabéns pelo código Oneshot. Continue assim... Link para o comentário Compartilhar em outros sites More sharing options...
MaryGirl13 9 Postado Maio 21, 2013 Share Postado Maio 21, 2013 Se eu trocar as falas de inglês, para o português, dá algum problema? Link para o comentário Compartilhar em outros sites More sharing options...
AlexandreKG 134 Postado Maio 21, 2013 Share Postado Maio 21, 2013 Se eu trocar as falas de inglês, para o português, dá algum problema? É bem provável que não, mas se der algum erro crie um tópico pedindo ajuda. Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados