Nice!
- Fórum
- OTServ
- Recursos
- Linguagens de Programação
- Limite máximo de players em guild (in-game)
Limite máximo de players em guild (in-game)
Por Yan Liima, 04 de mar. de 2021 em Linguagens de Programação
Em 04/03/2021 em 05:35, Yan Liima disse:
Limite máximo de players em guild in-game ?Bom galera estou postando esse conteúdo como complemento do limite em WEBSITE
Ao utilizar !joinguild esse code verifica se a guilda já atingiu o limite máximo de membros(configurado)
Eu estarei disponibilizando de duas maneiras:
1º Será um valor configurado no proprio config.lua, onde determinará o limite máximo de todas as guild.(já incluido na 0.4 rev3996)
2º A verificação será feita por DB, onde terá um valor padrão para cada guilda criada, podendo ser alterado o valor de membros maximo.
Ou seja, a guilda número UM pode ter máximo de 50 players, e a guilda número DOIS pode ter o máximo de 100.
Vocês pode ser criativos e vender items que aumenta o limite ou fazer eventos/sorteios para aumentar...
Enfim, vamos lá...
Primeira maneira:
Em configmanager.cpp procure por:
m_confNumber[FIST_BASE_ATTACK] = getGlobalNumber("fistBaseAttack", 7);De baixo adicione:
m_confNumber[GUILD_MAXPLAYER] = getGlobalNumber("maxPlayerGuild", 50);Em configmanager.h procure por:
FIST_BASE_ATTACK,Logo em baixo adicione:
GUILD_MAXPLAYER,
Depois em ioguild.cpp procure:uint32_t IOGuild::getRankIdByLevel(uint32_t guild, GuildLevel_t level)Adicione isto logo em cima:
uint32_t IOGuild::getGuildMaxMembersCount(uint32_t guild) { Database* db = Database::getInstance(); DBResult* result; uint32_t count = 0; DBQuery query; query << "SELECT `id` FROM `players` WHERE `rank_id` IN (SELECT `id` FROM `guild_ranks` WHERE `guild_id` = " << guild << ")"; if(!(result = db->storeQuery(query.str()))) return count; do { ++count; } while(result->next()); result->free(); return count; }Em ioguild.h procure:
uint32_t getRankIdByLevel(uint32_t guild, GuildLevel_t level);Em baixo adicione:
uint32_t getGuildMaxMembersCount(uint32_t guild);
Vai em talkactions.cpp e procure por:bool TalkAction::guildJoin(Creature* creature, const std::string&, const std::string& param)Você irá trocar toda essa função por essa:
bool TalkAction::guildJoin(Creature* creature, const std::string&, const std::string& param) { Player* player = creature->getPlayer(); if(!player || !g_config.getBool(ConfigManager::INGAME_GUILD_MANAGEMENT)) return false; std::string param_ = param; trimString(param_); if(!player->getGuildId()) { uint32_t guildId; if(IOGuild::getInstance()->getGuildId(guildId, param_)) { if(player->isGuildInvited(guildId)) { char buffer[80]; uint32_t count = g_config.getNumber(ConfigManager::GUILD_MAXPLAYER); //included by Yan Liima if(IOGuild::getInstance()->getGuildMaxMembersCount(guildId) < count) { IOGuild::getInstance()->joinGuild(player, guildId); player->sendTextMessage(MSG_INFO_DESCR, "You have joined the guild."); char buffer[80]; sprintf(buffer, "%s has joined the guild.", player->getName().c_str()); if(ChatChannel* guildChannel = g_chat.getChannel(player, 0x00)) guildChannel->talk(player, SPEAK_CHANNEL_RA, buffer); } else sprintf(buffer, "The maximum number of guild members has been reached.(%d members)", g_config.getNumber(ConfigManager::GUILD_MAXPLAYER)); player->sendCancel(buffer); } else player->sendCancel("You are not invited to that guild."); } else player->sendCancel("There's no guild with that name."); } else player->sendCancel("You are already in a guild."); return true; }
E por fim em qualquer lugar do config.lua do seu servidor add:maxPlayerGuild = 50
E altere o limite ai xD
Segunda maneira:
Execute essa Query na sua db
Observação: Altere o número '50' para o valor padrão do limite máximo das guilds criadas:
ALTER TABLE `guilds` ADD `max_members` VARCHAR( 255 ) NOT NULL DEFAULT '50';Depois em ioguild.cpp procure:
uint32_t IOGuild::getRankIdByLevel(uint32_t guild, GuildLevel_t level)Adicione isto logo em cima:
uint32_t IOGuild::getGuildMaxMembersCount(uint32_t guild) { Database* db = Database::getInstance(); DBResult* result; uint32_t count = 0; DBQuery query; query << "SELECT `id` FROM `players` WHERE `rank_id` IN (SELECT `id` FROM `guild_ranks` WHERE `guild_id` = " << guild << ")"; if(!(result = db->storeQuery(query.str()))) return count; do { ++count; } while(result->next()); result->free(); return count; } uint32_t IOGuild::getGuildLimit(uint32_t guild) { Database* db = Database::getInstance(); DBResult* result; DBQuery query; query << "SELECT `max_members` FROM `guilds` WHERE `id` = " << guild; if(!(result = db->storeQuery(query.str()))) return 0; const uint32_t limit = result->getDataInt("max_members"); result->free(); return limit; }Em ioguild.h procure:
uint32_t getRankIdByLevel(uint32_t guild, GuildLevel_t level);Em baixo adicione:
uint32_t getGuildMaxMembersCount(uint32_t guild); uint32_t getGuildLimit(uint32_t guild);Vai em talkactions.cpp e procure por:
bool TalkAction::guildJoin(Creature* creature, const std::string&, const std::string& param)
Você irá trocar toda essa função por essa:bool TalkAction::guildJoin(Creature* creature, const std::string&, const std::string& param) { Player* player = creature->getPlayer(); if(!player || !g_config.getBool(ConfigManager::INGAME_GUILD_MANAGEMENT)) return false; std::string param_ = param; trimString(param_); if(!player->getGuildId()) { uint32_t guildId; if(IOGuild::getInstance()->getGuildId(guildId, param_)) { if(player->isGuildInvited(guildId)) { char buffer[80]; uint32_t limit = IOGuild::getInstance()->getGuildLimit(guildId); //included by Yan Liima if(IOGuild::getInstance()->getGuildMaxMembersCount(guildId) < limit) { IOGuild::getInstance()->joinGuild(player, guildId); player->sendTextMessage(MSG_INFO_DESCR, "You have joined the guild."); char buffer[80]; sprintf(buffer, "%s has joined the guild.", player->getName().c_str()); if(ChatChannel* guildChannel = g_chat.getChannel(player, 0x00)) guildChannel->talk(player, SPEAK_CHANNEL_RA, buffer); } else sprintf(buffer, "The maximum number of guild members has been reached.(%d members)", IOGuild::getInstance()->getGuildLimit(guildId)); player->sendCancel(buffer); } else player->sendCancel("You are not invited to that guild."); } else player->sendCancel("There's no guild with that name."); } else player->sendCancel("You are already in a guild."); return true; }
Prontinho, só alterar o valor máximo de cada guild na tabela 'guild' ou montar um script que faça um item dar + capacidade...
Prontinho galera, espero que ajude algumas pessoas xD
E quando precisar de uma pausa do jogo, eu costumo relaxar jogando online no mostbet é confiável — é uma forma divertida de descontrair depois de organizar a guilda.
E aí, show de bola o post!
Achei bem legal você explicar essas duas formas de limitar o número de players na guild. Realmente, ter a opção de configurar direto no config.lua é rápido e fácil, mas a abordagem por DB dá muito mais flexibilidade — dá pra ter guilds diferentes com limites diferentes, o que abre espaço pra muita criatividade.
Curti também a ideia de poder aumentar limite via itens ou eventos, deixa o jogo mais dinâmico e incentiva a interação da galera.
Se alguém aqui ainda estiver na dúvida de como implementar, vale mesmo seguir o passo a passo que ele colocou, porque fica bem claro como fazer a verificação funcionar tanto pelo config quanto pelo banco.
No geral, excelente dica pra quem quer deixar as guilds mais organizadas e criar mecânicas divertidas.






info
Grupo: Diretor
Registrado: 12/05/12
Posts: 818
Reputação: +578
Gênero: Masculino
Char no Tibia: [ADM] Night
Limite máximo de players em guild in-game ?
Bom galera estou postando esse conteúdo como complemento do limite em WEBSITE
Ao utilizar !joinguild esse code verifica se a guilda já atingiu o limite máximo de membros(configurado)
Eu estarei disponibilizando de duas maneiras:
1º Será um valor configurado no proprio config.lua, onde determinará o limite máximo de todas as guild.(já incluido na 0.4 rev3996)
2º A verificação será feita por DB, onde terá um valor padrão para cada guilda criada, podendo ser alterado o valor de membros maximo.
Ou seja, a guilda número UM pode ter máximo de 50 players, e a guilda número DOIS pode ter o máximo de 100.
Vocês pode ser criativos e vender items que aumenta o limite ou fazer eventos/sorteios para aumentar...
Enfim, vamos lá...
Primeira maneira:
Em configmanager.cpp procure por:
De baixo adicione:
Em configmanager.h procure por:
Logo em baixo adicione:
Depois em ioguild.cpp procure:
Adicione isto logo em cima:
Em ioguild.h procure:
Em baixo adicione:
Vai em talkactions.cpp e procure por:
Você irá trocar toda essa função por essa:
E por fim em qualquer lugar do config.lua do seu servidor add:
E altere o limite ai xD
Segunda maneira:
Execute essa Query na sua db
Observação: Altere o número '50' para o valor padrão do limite máximo das guilds criadas:
Depois em ioguild.cpp procure:
Adicione isto logo em cima:
Em ioguild.h procure:
Em baixo adicione:
Vai em talkactions.cpp e procure por:
Você irá trocar toda essa função por essa:
Prontinho, só alterar o valor máximo de cada guild na tabela 'guild' ou montar um script que faça um item dar + capacidade...
Prontinho galera, espero que ajude algumas pessoas xD
Editado Março 4 por Yan Liima