#pragma region Sistema de Grupo com Senha
// Comando para criar um grupo com senha
if (strcmp(m->MobName, "grupo") == 0 || strcmp(m->MobName, "party") == 0)
{
if (pMob[conn].Leader != 0)
{
SendClientMessage(conn, "Você já está em um grupo.");
return;
}
// Gerar senha numérica entre 1000-9999
int password = rand() % 9000 + 1000;
sprintf_s(pUser[conn].Ingame.PartyPassword, sizeof(pUser[conn].Ingame.PartyPassword), "%d", password);
// Configurar líder do grupo
pMob[conn].Leader = conn;
pUser[conn].Ingame.GrupoAceitarSolicitação = TRUE;
// Limpar lista do grupo
memset(pMob[conn].PartyList, 0, sizeof(pMob[conn].PartyList));
SendEtc(conn);
SendClientMessage(conn, "| Grupo criado com sucesso!");
SendClientMessage(conn, strFmt("| Senha: %s", pUser[conn].Ingame.PartyPassword));
SendClientMessage(conn, "| Outros jogadores podem entrar com: /entrar <seu_nome> <senha>");
return;
}
// Comando para entrar em um grupo
if (strcmp(m->MobName, "entrar") == 0)
{
if (pMob[conn].Leader != 0)
{
SendClientMessage(conn, "Você já está em um grupo.");
return;
}
char targetName[16] = {0};
char password[7] = {0};
// Parse dos argumentos
if (sscanf_s(m->String, "%15s %6s", targetName, (unsigned)_countof(targetName), password, (unsigned)_countof(password)) < 2)
{
SendClientMessage(conn, "Uso: /entrar <nome_lider> <senha>");
return;
}
int leaderId = GetUserByName(targetName);
// Verificações básicas
if (leaderId <= 0 || pUser[leaderId].Mode != USER_PLAY)
{
SendClientMessage(conn, "Líder não encontrado ou offline.");
return;
}
if (leaderId == conn)
{
SendClientMessage(conn, "Não pode entrar no próprio grupo.");
return;
}
if (pMob[leaderId].Leader != leaderId)
{
SendClientMessage(conn, "O jogador não é líder de um grupo.");
return;
}
if (strcmp(pUser[leaderId].Ingame.PartyPassword, password) != 0)
{
SendClientMessage(conn, "Senha incorreta.");
return;
}
// Verificar se grupo está cheio
int memberCount = 0;
for (int i = 0; i < MAX_PARTY; i++)
{
if (pMob[leaderId].PartyList[i] != 0) memberCount++;
}
if (memberCount >= MAX_PARTY-1)
{
SendClientMessage(conn, "O grupo está cheio.");
return;
}
// Adicionar à lista de party do líder
for (int i = 0; i < MAX_PARTY; i++)
{
if (pMob[leaderId].PartyList[i] == 0)
{
pMob[leaderId].PartyList[i] = conn;
break;
}
}
// Configurar membro
pMob[conn].Leader = leaderId;
memset(pMob[conn].PartyList, 0, sizeof(pMob[conn].PartyList));
// Atualizar clientes
SendEtc(conn);
SendEtc(leaderId);
// Notificar grupo
for (int i = 0; i < MAX_PARTY; i++)
{
int member = pMob[leaderId].PartyList[i];
if (member > 0)
{
SendClientMessage(member, strFmt("%s entrou no grupo.", pMob[conn].MOB.MobName));
}
}
return;
}
#pragma endregion
Conteúdo gratuito para estudos e para testes pode-se pedir as variáveis necessárias na estrutura como:
char PartyPassword[7];
BOOL GrupoAceitarSolicitação;