Ir para conteúdo

Posts Recomendados

  • Diretor


Limite máximo de players em guild in-game ?

barrayan01.png

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:

Será um valor configurado no proprio config.lua, onde determinará o limite máximo de todas as guild.(já incluido na 0.4 rev3996)

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...

barrayan02.png

Enfim, vamos lá...

Primeira maneira:

Spoiler

 

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:

Spoiler

 

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

Link para o comentário
https://xtibia.com/forum/topic/252847-limite-m%C3%A1ximo-de-players-em-guild-in-game/
Compartilhar em outros sites

  • 4 years later...
Em 04/03/2021 em 05:35, Yan Liima disse:


Limite máximo de players em guild in-game ?

barrayan01.png

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:

Será um valor configurado no proprio config.lua, onde determinará o limite máximo de todas as guild.(já incluido na 0.4 rev3996)

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...

barrayan02.png

Enfim, vamos lá...

Primeira maneira:

  Mostrar conteúdo oculto

 

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:

  Mostrar conteúdo oculto

 

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.

×
×
  • Criar Novo...