Skocz do zawartości

Nowy szablon forum

mygo.pl

Stworzyliśmy dla Was nowy wygląd forum. Z pewnością znajdziesz rzeczy, które wg Ciebie mogą zostać zmienione - wspomnij o tym w specjalnym wątku.

Czytaj więcej

Jak założyć własną sieć

serwerów CS

Zastanawiasz się nad prowadzeniem własnej sieci serwerów? Przeczytaj podstawowe informacje, na które należy zwrócić uwagę, przy takim projekcie.

Czytaj więcej

Tworzymy spis sieci

dodaj swoją

Dodaj sieć do której należysz, pozwoli to na promocję i budowę ogólnopolskiej bazy sieci CS.

Czytaj więcej

RSSTranslate Please


MYGO.pl
 Udostępnij

Rekomendowane odpowiedzi

  • RSSy
PHP Code:

/*================================================================================
    
        *****************************************************
        ************* [AMXX Clan/Group System] **************
        *****************************************************
    
    ----------------------
    -*- Licensing Info -*-
    ----------------------
    
    Clan/Group System (v1.3 bugfixed)
    Copyright (C) 2016-2017 by Chamo.
    
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
    In addition, as a special exception, the author gives permission to
    link the code of this program with the Half-Life Game Engine ("HL
    Engine") and Modified Game Libraries ("MODs") developed by Valve,
    L.L.C ("Valve"). You must obey the GNU General Public License in all
    respects for all of the code used other than the HL Engine and MODs
    from Valve. If you modify this file, you may extend this exception
    to your version of the file, but you are not obligated to do so. If
    you do not wish to do so, delete this exception statement from your
    version.
    
    ---- CHANGELOG ----
    
    v1.3
    
        v1.3 (bugfixed)
        
        - Corregido error que no permitia invitar jugadores al Clan.
        - Corregidos ciertos errores/bugs menores.
        - Optimizados ciertas partes del codigo.
        - Corregidos errores ortograficos/de tipeo en algunos mensajes.
        - Aumentado limite de caracteres MINIMOS para:
            -- NOMBRE DEL CLAN: 7 caracteres (anterior) -> 10 caracteres (actual).
            -- TAG DEL CLAN: 4 caracteres (anterior) -> 6 caracteres (actual).
        - Aumentado limite de caracteres MAXIMOS para:
            -- NOMBRE DEL CLAN: 25 caracteres (anterior) -> 32 caracteres (actual).
            -- TAG DEL CLAN: 15 caracteres (anterior) -> 24 caracteres (actual).
        - Expandida lista de CARACTERES ESPECIALES permitidos para: NOMBRE/TAG/MENSAJE DE BIENVENIDA DEL CLAN.
    
        v1.3
        
        - Re-estructuración del 85%+ del código original.
        - Mejoradas ciertas partes del código anterior.
        - Ahora si no tienes clan, el chat sera igual el default del juego.
        - Re-estructurado el chat, quedando de la siguiente manera:
            -- El chat GLOBAL (say) -> (TAG/[NOMBRE DEL CLAN]) --- NOMBRE: TEXTO
            -- El chat DE EQUIPOS (say_team/say /cc) -> RANGO NOMBRE: TEXTO (el color del chat depende del rango)
        - Cambiados y reordenados algunas opciones del menú principal del clan.
        - Ahora, los menúes "LISTA DE MIEMBROS", "EXPULSAR MIEMBROS" y "EDITAR RANGO", muestran la lista de miembros, ordenándolos en forma DESCENDENTE según el rango:
            -- LÍDER ([ON/OFF]-LINE)
            -- CO-LÍDER ([ON/OFF]-LINE)
            -- SUB-LÍDER ([ON/OFF]-LINE)
            -- MIEMBRO ([ON/OFF]-LINE)
        - Cambiado la estructura del menú "INFORMACIÓN DEL CLAN".
        - Añadido "TOP DE CLANES" (2) los cuales son de:
            - LA MAYOR CANTIDAD DE TIEMPO DE ACTIVIDAD
            - EL MENOR NUMERO DE MIEMBROS, los cuales están ordenados, respectivamente:
                --- Forma DESCENDENTE
                --- Forma ASCENDENTE.
            
    v1.2
    - Fixeadas algunas cosas pequeñas.
    - Arreglado error de incompatibilidad entre versiones:
    -- (Si se usaba una versión vieja, y luego una actual, los Clanes guardados no eran cargados)
    - Ahora el Chat global (say), muestra el TAG del Clan del jugador que escribe (de no tener Clan,
      mostrará 'SIN CLAN').
    - Ahora el Chat del Clan no muestra TAG, solamente: 'Rango', 'Nombre' y 'Texto', su estructura
    es casi igual a la anterior.
    - Agregado 'Tiempo de actividad del Clan', que sirve para poder invitar miembros:
    +Tiempo de actividad = +cantidad de miembros para poder invitar (idea de totopizza).
    - Agregado al menú del Clan la opción 'VER INFORMACIÓN DEL CLAN.' que muestra diferentes cosas del Clan,
    como: 'Lider', 'Nombre', 'Nº de Miembros', y 'Tiempo de Actividad' (de no tener 'TAG' o 'Tiempo de Actividad',
    mostrará "Sin TAG"/"No hay registros aun", respectivamente).
    - Agregado bloqueo de cambio de nick durante el juego, para evitar bugs con el Guardado/Cargado de datos.
    
    v1.1
    - Fixeados algunos errores que se pasaron por alto
    - Agregado chat para team (puede ser por say_team, o custom, escribiendo /cc)
    -- La estructura del Chat es igual en ambos casos, y depende de quien escriba:
    --- Member = TAG - Name (Team color) - Text (yelow)
    --- Sub-Leader = TAG - Name (green) - Text (yelow)
    --- Co-Leader = TAG - Name (green) - Text (team color)
    --- Leader = TAG - Name (white) - Text (green)
    -- De no tener TAG el Clan, se motrara "[SIN TAG]...."
    - Agregado mensaje de bienvenida custom (editable por el/los Co-LÃ*deres/LÃ*der)
    - Agregado TAG o prefijo custom (editable por el/los Co-LÃ*deres/LÃ*der)
    
    v1.0
    - Lanzamiento oficial
    
    ------- END -------
=================================================================================*/

/*=====================
    LIBRERIAS
=====================*/

#include <amxmodx>
#include <amxmisc>
#include <fvault>
#include <engine>
#include <hamsandwich>
#include <cstrike>
#include <fakemeta>

#if AMXX_VERSION_NUM <= 182
    #include <dhudmessage>
#endif

/*==================
    MACROS
==================*/

#define M_HookTeamSay
#define M_TimerThinkTime            (get_gametime()+1.0)
#define M_HaveClan(%1)            (!bool:(A_PlayerVars[%1][PI_CLAN_ID] == -1))
#define M_ActivityTimeNeed(%1)            ((CI_SecondsInOneMinute * CI_MinutesNeed) + (%1 > 4 ? ((%1 + %1) * CI_ExtraSecondsNeed) : 0))

/*=========================
    ENUMERACIONES
=========================*/

enum _:E_ExtraVars
{
    
PLUGIN_NAMEPLUGIN_VERSIONPLUGIN_AUTHOR,
    
    
DONT_HAVE_CLAN 0CONFIRM_CLAN_NAMEHAVE_CLANINVITE_PLAYERS_TO_CLANCONFIRM_INVITATION_TO_CLAN,
    
SHOW_CLAN_MEMBERSSHOW_KICK_MEMBERSSHOW_EDIT_CLAN_MEMBERS_STATUSCHOOSE_STATUS_TO_CLAN_MEMBER,
    
CONFIRM_CLAN_MEMBER_STATUSSHOW_CLAN_INFOSHOW_CLANES_TOP_ONESHOW_CLANES_TOP_TWO,
    
    
MIN_CLAN_NAME_LEN 10MAX_CLAN_NAME_LEN 32,
    
MIN_CLAN_TAG_LEN 6MAX_CLAN_TAG_LEN 24,
    
MIN_CLAN_WELCOME_LEN 10MAX_CLAN_WELCOME_LEN 35,
    
    
STATUS_MEMBER 0STATUS_SUBLEADERSTATUS_COLEADERSTATUS_LEADER,
    
    
CREATE_NEW_CLAN 0CHANGE_CLAN_TAGCHANGE_CLAN_WELCOME_MESSAGE,
    
    
CHAT_COLOR_GREY 40CHAT_COLOR_REDCHAT_COLOR_BLUE,
    
    
VALIDATE_SAY 0VALIDATE_CLAN_NAMEVALIDATE_CLAN_TAGVALIDATE_CLAN_WELCOME_MESSAGE,
    
    
LOAD_CLANES_DATA 0SAVE_CLANES_DATALOAD_PLAYERS_DATASAVE_PLAYERS_DATA,
    
    
SEARCH_ALL_STATUS = -1,
    
    
SEARCH_ALL_MEMBERS 0SEARCH_ONLINE_MEMBERSSEARCH_OFFLINE_MEMBERS,
    
    
SORT_BY_ACTIVITY_TIME 0SORT_BY_CLAN_MEMBERS,
    
    
SORT_DOWNWARDS 0SORT_UPWARDS
};

enum _:E_GlobalVarsStruct
{
    
GI_MAX_PLAYERS,
    
    Array:
GDA_CLANES,
    
    
Trie:GT_CLANES_NAMES,
    
Trie:GT_CLANES_MEMBERS_NAMES,
    
Trie:GT_CLANES_TAGS,
    
Trie:GT_CLANES_VALUES,
    
    
GSZ_TEXT[300]
};

enum _:E_PlayerVarsStruct
{
    
bool:PBO_IS_CONNECTED,
    
bool:PBO_IS_ALIVE,
    
bool:PBO_IS_BOT,
    
    
PI_CLAN_ID,
    
PI_CLAN_STATUS,
    
PI_CURRENT_TIMER,
    
PI_STATUS,
    
PI_CHOOSE_STATUS_FOR_MEMBER,
    
    
PSZ_CLIENT_NAME[32],
    
PSZ_CLAN_NAME[MAX_CLAN_NAME_LEN]
};

enum _:E_ClanesData
{
    
I_CLAN_ID,
    
I_CLAN_MEMBERS,
    
I_CLAN_ACTIVITY_TIME,
    
    
SZ_CLAN_NAME[MAX_CLAN_NAME_LEN],
    
SZ_CLAN_LEADER[32],
    
SZ_CLAN_TAG[MAX_CLAN_TAG_LEN],
    
SZ_CLAN_WELCOME_MESSAGE[MAX_CLAN_WELCOME_LEN]
};

enum _:E_ClanesValues
{
    
I_VALUE_CLAN_ID,
    
I_VALUE_CLAN_MEMBERS,
    
I_VALUE_CLAN_ACTIVITY_TIME,
    
I_VALUE_CLAN_NAME,
    
I_VALUE_CLAN_LEADER,
    
I_VALUE_CLAN_TAG,
    
I_VALUE_CLAN_WELCOME_MESSAGE
};

/*======================
    CONSTANTES
======================*/

new const CSZ_PluginInfo[(PLUGIN_AUTHOR 1)][] =
{
    
"AMXX CLAN/GROUP SYSTEM",
    
"1.3 (bugfixed)",
    
"Chamo."
};

new const 
CSZ_CsTeamNamesTable[][] =
{
    
"UNASSIGNED",
    
"TERRORIST",
    
"CT",
    
"SPECTATOR"
};

new const 
CSZ_ClanMemberStatus[STATUS_LEADER+1][] =
{
    
"MIEMBRO",
    
"SUB-LÍDER",
    
"CO-LÍDER",
    
"LÍDER"
};

new const 
CSZ_ClanesValuesNames[E_ClanesValues][] =
{
    
"ID",
    
"MEMBERS",
    
"ACTIVITY TIME",
    
"NAME",
    
"LEADER",
    
"TAG",
    
"WELCOME MESSAGE"
};

new const 
CSZ_TimerClassName[] = "Timer";
new const 
CSZ_Prefix[] = "!g[AMXX-CLANES]!y";
new const 
CSZ_AvailableSpecialCharacters[] = "#$&()*+-:<=>@[]{|}~";
new const 
CSZ_ClanesVault[] = "ClanesList.INI";
new const 
CSZ_PlayersVault[] = "ClanesData";

const 
CI_SecondsInOneMinute 60;
const 
CI_MinutesNeed 50;
const 
CI_ExtraSecondsNeed 20;
const 
CI_MaxClanesOnTop 15;

/*=====================
    VARIABLES
=====================*/

new A_GlobalVars[E_GlobalVarsStruct], A_PlayerVars[33][E_PlayerVarsStruct], A_ClanData[E_ClanesData];

/*======================================================================
            FORWARDS DEL PLUGIN (AMXX)
======================================================================*/

public plugin_init()
{
    
register_plugin(CSZ_PluginInfo[PLUGIN_NAME], CSZ_PluginInfo[PLUGIN_VERSION], CSZ_PluginInfo[PLUGIN_AUTHOR]);
    
    
RegisterHam(Ham_Spawn"player""HAM_PLAYER_Spawn_Post"true);
    
RegisterHam(Ham_Killed"player""HAM_PLAYER_Killed_Post"true);
    
    
register_think(CSZ_TimerClassName"THINK_Timer");
    
    
register_forward(FM_ClientUserInfoChanged"FM_ClientUserInfoChanged_Pre");
    
    
register_clcmd("say""CLCOMMAND_Say");
    
register_clcmd("say /clan""CLCOMMAND_Clan");
    
register_clcmd("say clan""CLCOMMAND_Clan");
    
register_clcmd("say_team /clan""CLCOMMAND_Clan");
    
register_clcmd("say_team clan""CLCOMMAND_Clan");
    
register_clcmd("MESSAGEMODE_Clanes""CLCOMMAND_Clanes");
    
    
#if defined M_HookTeamSay
        
register_clcmd("say_team""CLCOMMAND_Say");
    
#else
    
{
        
register_clcmd("say /cc""CLCOMMAND_ClanChat");
        
register_clcmd("say_team /cc""CLCOMMAND_ClanChat");
        
register_clcmd("MESSAGEMODE_ClanChat""CLCOMMAND_Say");
    }
    
#endif
    
    
A_GlobalVars[GI_MAX_PLAYERS] = get_maxplayers();
    
A_GlobalVars[GDA_CLANES] = _:ArrayCreate(E_ClanesData);
    
A_GlobalVars[GT_CLANES_NAMES] = _:TrieCreate();
    
A_GlobalVars[GT_CLANES_MEMBERS_NAMES] = _:TrieCreate();
    
A_GlobalVars[GT_CLANES_TAGS] = _:TrieCreate();
    
A_GlobalVars[GT_CLANES_VALUES] = _:TrieCreate();
    
    for (new 
Isizeof CSZ_ClanesValuesNamesI++)
        
TrieSetCell(A_GlobalVars[GT_CLANES_VALUES], CSZ_ClanesValuesNames[I], I);
    
    
ClanesData(LOAD_CLANES_DATA);
    
    new 
I_Entity;
    
    do
        
I_Entity create_entity("info_target");
    while (!
is_valid_ent(I_Entity))
    
    
entity_set_float(I_EntityEV_FL_nextthinkM_TimerThinkTime);
    
entity_set_string(I_EntityEV_SZ_classnameCSZ_TimerClassName);
}

public 
plugin_end()
{
    
ClanesData(SAVE_CLANES_DATA);
    
    
ArrayDestroy(A_GlobalVars[GDA_CLANES]);
}

/*=======================================================================
            FORWARDS DEL CLIENTE (AMXX)
=======================================================================*/

public client_putinserver(I_Client)
{
    
A_PlayerVars[I_Client][PBO_IS_CONNECTED] = true;
    
    if (
is_user_bot(I_Client))
        
A_PlayerVars[I_Client][PBO_IS_BOT] = true;
    
    
get_user_name(I_ClientA_PlayerVars[I_Client][PSZ_CLIENT_NAME], charsmax(A_PlayerVars[][PSZ_CLIENT_NAME]));
    
    
A_PlayerVars[I_Client][PI_CLAN_ID] = -1;
    
    
PlayersData(I_ClientLOAD_PLAYERS_DATA);
    
    
set_task(0.1"SendTeamInfoChatColor"I_Client);
}

public 
client_disconnected(I_Client)
{
    if (
A_PlayerVars[I_Client][PBO_IS_CONNECTED])
        
PlayersData(I_ClientSAVE_PLAYERS_DATA);
    
    
A_PlayerVars[I_Client][PBO_IS_CONNECTED] = A_PlayerVars[I_Client][PBO_IS_BOT] = false;
}

/*===============================================================================
            CALLBACKS DE LOS COMANDOS HOOKEADOS
===============================================================================*/

/*=============================================
    COMANDOS DE CLIENTE (CLCOMMAND_*)
=============================================*/

public CLCOMMAND_Say(const I_Client)
{
    static 
SZ_SayType[8];
    
    
read_argv(0SZ_SayTypecharsmax(SZ_SayType));
    
    new 
bool:BO_IsSay bool:equal(SZ_SayType"say");
    
    if (!
BO_IsSay && !M_HaveClan(I_Client))
    {
        
UTIL_SendPrint(I_ClientI_Client"%s El !colorCHAT!y de equipo es exclusivo de los !gCLANES!."CSZ_Prefix);
            
        return 
PLUGIN_HANDLED_MAIN;
    }
    
    static 
SZ_Text[190];
    
    
read_argv(1SZ_Textcharsmax(SZ_Text));
    
replace_all(SZ_Textcharsmax(SZ_Text), "%"" ");
    
    if (!
IsValidText(_SZ_TextVALIDATE_SAY))
        return 
PLUGIN_HANDLED_MAIN;
    
    static 
I;
    
    if (
BO_IsSay)
    {
        if (
M_HaveClan(I_Client))
        {
            
GetClanData(A_PlayerVars[I_Client][PI_CLAN_ID]);
            
            
format(SZ_Textcharsmax(SZ_Text), "!color%s!y: %s"A_PlayerVars[I_Client][PSZ_CLIENT_NAME], SZ_Text);
            
            if (
A_ClanData[SZ_CLAN_TAG][0])
                
format(SZ_Textcharsmax(SZ_Text), "!color%s!y --- %s"A_ClanData[SZ_CLAN_TAG], SZ_Text);
            else
                
format(SZ_Textcharsmax(SZ_Text), "!g[%s]!y --- %s"A_ClanData[SZ_CLAN_NAME], SZ_Text);
        }
        else
            
format(SZ_Textcharsmax(SZ_Text), "!color%s!y: %s"A_PlayerVars[I_Client][PSZ_CLIENT_NAME], SZ_Text);
    }
    else
    {
        switch (
A_PlayerVars[I_Client][PI_CLAN_STATUS])
        {
            case 
STATUS_LEADERformat(SZ_Textcharsmax(SZ_Text), "!color[!g%s!color] %s!y: !g%s"CSZ_ClanMemberStatus[A_PlayerVars[I_Client][PI_CLAN_STATUS]], A_PlayerVars[I_Client][PSZ_CLIENT_NAME], SZ_Text);
            
            case 
STATUS_COLEADERformat(SZ_Textcharsmax(SZ_Text), "!color[%s] !g%s!y: !color%s"CSZ_ClanMemberStatus[A_PlayerVars[I_Client][PI_CLAN_STATUS]], A_PlayerVars[I_Client][PSZ_CLIENT_NAME], SZ_Text);
            
            case 
STATUS_SUBLEADERformat(SZ_Textcharsmax(SZ_Text), "!color[!y%s!color] !g%s!y: %s"CSZ_ClanMemberStatus[A_PlayerVars[I_Client][PI_CLAN_STATUS]], A_PlayerVars[I_Client][PSZ_CLIENT_NAME], SZ_Text);
            
            default: 
format(SZ_Textcharsmax(SZ_Text), "!color[!y%s!color] %s!y: %s"CSZ_ClanMemberStatus[A_PlayerVars[I_Client][PI_CLAN_STATUS]], A_PlayerVars[I_Client][PSZ_CLIENT_NAME], SZ_Text);
        }
    }
    
    for (
1<= A_GlobalVars[GI_MAX_PLAYERS]; I++)
    {
        if (!
A_PlayerVars[I][PBO_IS_CONNECTED])
            continue;
        
        if (!
BO_IsSay && A_PlayerVars[I][PI_CLAN_ID] != A_PlayerVars[I_Client][PI_CLAN_ID])
            continue;
    
        
UTIL_SendPrint(I, ((!BO_IsSay && A_PlayerVars[I_Client][PI_CLAN_STATUS] == STATUS_LEADER) ? CHAT_COLOR_GREY I_Client), SZ_Text);
    }
    
    return 
PLUGIN_HANDLED_MAIN;
}

public 
CLCOMMAND_Clan(const I_Client)
{
    
SM_Clan(I_Client_, (M_HaveClan(I_Client) ? HAVE_CLAN DONT_HAVE_CLAN));
    
    return 
PLUGIN_HANDLED_MAIN;
}

public 
CLCOMMAND_Clanes(const I_Client)
{
    static 
SZ_Text[100];
    
    
read_argv(1SZ_Textcharsmax(SZ_Text));
    
    switch (
A_PlayerVars[I_Client][PI_STATUS])
    {
        case 
CREATE_NEW_CLAN:
        {
            if (!
IsValidText(I_ClientSZ_TextVALIDATE_CLAN_NAME))
            {
                
SM_Clan(I_Client_, (M_HaveClan(I_Client) ? HAVE_CLAN DONT_HAVE_CLAN));
                
                return 
PLUGIN_HANDLED_MAIN;
            }
            
            
copy(A_PlayerVars[I_Client][PSZ_CLAN_NAME], charsmax(A_PlayerVars[][PSZ_CLAN_NAME]), SZ_Text);
            
            
SM_Clan(I_Client_CONFIRM_CLAN_NAME);
        }
        
        case 
CHANGE_CLAN_TAG:
        {
            if (!
IsValidText(I_ClientSZ_TextVALIDATE_CLAN_TAG))
            {
                
SM_Clan(I_Client_, (M_HaveClan(I_Client) ? HAVE_CLAN DONT_HAVE_CLAN));
                
                return 
PLUGIN_HANDLED_MAIN;
            }
            
            
GetClanData(A_PlayerVars[I_Client][PI_CLAN_ID]);
            
            
copy(A_ClanData[SZ_CLAN_TAG], charsmax(A_ClanData[SZ_CLAN_TAG]), SZ_Text);
            
            
UpdateClanData(A_PlayerVars[I_Client][PI_CLAN_ID]);
            
            if (
A_ClanData[SZ_CLAN_TAG][0])
            {
                
formatex(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "%s El !g%s !color%s!y edito el !colorTAG!y del !gCLAN:!color %s!g!."CSZ_PrefixCSZ_ClanMemberStatus[A_PlayerVars[I_Client][PI_CLAN_STATUS]], A_PlayerVars[I_Client][PSZ_CLIENT_NAME], SZ_Text);
                
                
UTIL_SendPrint(I_ClientI_Client"%s Cambiaste el !colorTAG!y de%s !gCLAN!y por!color: %s!g!."CSZ_Prefix, (A_PlayerVars[I_Client][PI_STATUS] >= STATUS_LEADER " tu" "l"), SZ_Text);
            }
            else
            {
                
formatex(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "%s El !g%s !color%s!y creo un !colorTAG!y para el !gCLAN:!color %s!g!."CSZ_PrefixCSZ_ClanMemberStatus[A_PlayerVars[I_Client][PI_CLAN_STATUS]], A_PlayerVars[I_Client][PSZ_CLIENT_NAME], SZ_Text);
                
                
UTIL_SendPrint(I_ClientI_Client"%s Creaste el siguiente !colorTAG!y para %s !gCLAN!color: %s!g!."CSZ_Prefix, (A_PlayerVars[I_Client][PI_STATUS] >= STATUS_LEADER " tu" "el"), SZ_Text);
            }
            
            
SendMessageToMembers(I_ClientA_GlobalVars[GSZ_TEXT]);
        }
        
        case 
CHANGE_CLAN_WELCOME_MESSAGE:
        {
            if (!
IsValidText(I_ClientSZ_TextVALIDATE_CLAN_WELCOME_MESSAGE))
            {
                
SM_Clan(I_Client_, (M_HaveClan(I_Client) ? HAVE_CLAN DONT_HAVE_CLAN));
                
                return 
PLUGIN_HANDLED_MAIN;
            }
            
            
GetClanData(A_PlayerVars[I_Client][PI_CLAN_ID]);
            
            
UTIL_SendPrint(I_ClientI_Client"%s El nuevo !colorMENSAJE DE BIENVENIDA!y de%s !gCLAN!y es!color:!g%s!."CSZ_Prefix, (A_PlayerVars[I_Client][PI_CLAN_STATUS] >= STATUS_LEADER " tu" "l"), SZ_Text);
            
            
copy(A_ClanData[SZ_CLAN_WELCOME_MESSAGE], charsmax(A_ClanData[SZ_CLAN_WELCOME_MESSAGE]), SZ_Text);
            
            
UpdateClanData(A_PlayerVars[I_Client][PI_CLAN_ID]);
        }
    }
    
    return 
PLUGIN_HANDLED_MAIN;
}

#if !defined M_HookTeamSay
public CLCOMMAND_ClanChat(const I_Client)
{
    if (!
M_HaveClan(I_Client))
    {
        
UTIL_SendPrint(I_ClientI_Client"%s El !colorCHAT!y de equipo es exclusivo de los !gCLANES!."CSZ_Prefix);
        
        return 
PLUGIN_HANDLED_MAIN;
    }
    
    
UTIL_SendCMDWithHUD(I_Client"messagemode MESSAGEMODE_ClanChat""Escribe tu mensaje para el Clan"_0.00.033.0);
    
    return 
PLUGIN_HANDLED_MAIN;
}
#endif

/*============================================================================
            CALLBACKS DEL MÓDULO HAMSANDWICH
============================================================================*/

public HAM_PLAYER_Spawn_Post(const I_Player)
{
    if (!
is_user_alive(I_Player))
        return;
    
    
A_PlayerVars[I_Player][PBO_IS_ALIVE] = true;
}

public 
HAM_PLAYER_Killed_Post(const I_Player)
    
A_PlayerVars[I_Player][PBO_IS_ALIVE] = false;

/*=========================================================================
            CALLBACKS DEL MÓDULO FAKEMETA
=========================================================================*/

public FM_ClientUserInfoChanged_Pre(const I_Client, const SZ_InfoBuffer[])
{
    if (!
A_PlayerVars[I_Client][PBO_IS_CONNECTED])
        return 
FMRES_IGNORED;
    
    static 
SZ_NewName[32];
    
    
get_user_info(I_Client"name"SZ_NewNamecharsmax(SZ_NewName));
    
    if (
equal(SZ_NewNameA_PlayerVars[I_Client][PSZ_CLIENT_NAME]))
        return 
FMRES_IGNORED;
    
    
UTIL_SendPrint(I_ClientI_Client"%s El cambio de nombre no esta permitido"CSZ_Prefix);
    
    
set_user_info(I_Client"name"A_PlayerVars[I_Client][PSZ_CLIENT_NAME]);
    
    return 
FMRES_SUPERCEDE;
}

/*=======================================================================
            CALLBACKS DEL MÓDULO ENGINE
=======================================================================*/

public THINK_Timer(const I_Entity)
{
    static 
I_Player;
    
    for (
I_Player 1I_Player <= A_GlobalVars[GI_MAX_PLAYERS]; I_Player++)
    {
        if (!
A_PlayerVars[I_Player][PBO_IS_ALIVE] || !M_HaveClan(I_Player))
            continue;
        
        
A_PlayerVars[I_Player][PI_CURRENT_TIMER]++;
    }
    
    
entity_set_float(I_EntityEV_FL_nextthinkM_TimerThinkTime);
}

/*=============================================================================
            MENUS Y SUS RESPECTIVOS CALLBACKS
=============================================================================*/

/*=====================================
        FUNCIONES
=====================================*/

SM_Clan(const I_Player, const I_Value 0, const I_ShowType, const SZ_Text[] = EOS)
{
    new 
bool:BO_IsOnlineI_MenuI_TotalMembersI_OnLineMembersI_OffLineMembersI_FindMembers;
    static 
ISZ_ChoosePlayerID[2], SZ_MemberName[32], SZ_MemberStatus[11];
    
    switch (
I_ShowType)
    {
        case 
DONT_HAVE_CLAN:
        {
            
formatex(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "\r***********************************\y^n\y%s^n\yVERSIÓN\w: \r%s \w| \yBY\w: \r%s^n***********************************^n\yNO PERTENECES A NINGUN CLAN",
            
CSZ_PluginInfo[PLUGIN_NAME], CSZ_PluginInfo[PLUGIN_VERSION], CSZ_PluginInfo[PLUGIN_AUTHOR]);
            
            
I_Menu menu_create(A_GlobalVars[GSZ_TEXT], "HM_Clan");
            
            
menu_additem(I_Menu"\yCREAR UN CLAN\r.");
            
            
menu_setprop(I_MenuMPROP_EXITNAME"\rSALIR\y.");
        }
        
        case 
CONFIRM_CLAN_NAME:
        {
            
formatex(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "\w¿\yQUIERES CREAR EL CLAN LLAMADO\w: \r%s\w?"A_PlayerVars[I_Player][PSZ_CLAN_NAME]);
            
            
I_Menu menu_create(A_GlobalVars[GSZ_TEXT], "HM_ConfirmClanName");
            
            
menu_additem(I_Menu"\ySI, CREAR CLAN\r.");
            
            
menu_setprop(I_MenuMPROP_EXITNAME"\rNO, VOLVER\y.");
        }
        
        case 
HAVE_CLAN:
        {
            
formatex(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "\r***********************************\y^n\y%s^n\yVERSIÓN\w: \r%s \w| \yBY\w: \r%s^n***********************************^n\r\R\w",
            
CSZ_PluginInfo[PLUGIN_NAME], CSZ_PluginInfo[PLUGIN_VERSION], CSZ_PluginInfo[PLUGIN_AUTHOR]);
            
            
I_Menu menu_create(A_GlobalVars[GSZ_TEXT], "HM_Clan");
            
            
menu_additem(I_Menu"\yINVITAR JUGADORES\r.");
            
menu_additem(I_Menu"\yLISTA DE MIEMBROS\r.");
            
            if (
A_PlayerVars[I_Player][PI_CLAN_STATUS] >= STATUS_SUBLEADER)
                
menu_additem(I_Menu"\yEXPULSAR MIEMBRO\r.");
            else
                
menu_additem(I_Menu"\dEXPULSAR MIEMBRO\r.");
            
            if (
A_PlayerVars[I_Player][PI_CLAN_STATUS] >= STATUS_COLEADER)
                
menu_additem(I_Menu"\yEDITAR RANGO\r.");
            else
                
menu_additem(I_Menu"\dEDITAR RANGO\r.");
            
            
menu_additem(I_Menu"\yINFORMACIÓN DEL CLAN\r.");
            
            if (
A_PlayerVars[I_Player][PI_CLAN_STATUS] >= STATUS_COLEADER)
            {
                
menu_additem(I_Menu, (A_ClanData[SZ_CLAN_TAG][0] ? "\yEDITAR TAG" "\yREGISTRAR UN TAG"));
                
menu_additem(I_Menu, (A_ClanData[SZ_CLAN_WELCOME_MESSAGE][0] ? "\yEDITAR MENSAJE DE BIENVENIDA" "\yCREAR MENSAJE DE BIENVENIDA"));
            }
            else
            {
                
menu_additem(I_Menu, (A_ClanData[SZ_CLAN_TAG][0] ? "\dEDITAR TAG" "\dREGISTRAR UN TAG"));
                
menu_additem(I_Menu, (A_ClanData[SZ_CLAN_WELCOME_MESSAGE][0] ? "\dEDITAR MENSAJE DE BIENVENIDA" "\dCREAR MENSAJE DE BIENVENIDA"));
            }
            
            
menu_additem(I_Menu"\yVER TOP DE CLANES \w- \rTIEMPO DE ACTIVIDAD.");
            
menu_additem(I_Menu"\yVER TOP DE CLANES \w- \rCANTIDAD DE MIEMBROS.");
            
            if (
A_PlayerVars[I_Player][PI_CLAN_STATUS] >= STATUS_LEADER)
                
menu_additem(I_Menu"\yDESTRUIR CLAN\r.");
            else
                
menu_additem(I_Menu"\dDESTRUIR CLAN\r.");
            
            
menu_setprop(I_MenuMPROP_BACKNAME"\y<<<\r.");
            
menu_setprop(I_MenuMPROP_NEXTNAME"\y>>>\r.");
            
menu_setprop(I_MenuMPROP_EXITNAME"\rSALIR\y.");
        }
        
        case 
INVITE_PLAYERS_TO_CLAN:
        {
            
I_Menu menu_create("\yINVITAR JUGADORES AL CLAN\w\R""HM_InviteToClan");
            
            for (
1<= A_GlobalVars[GI_MAX_PLAYERS]; I++)
            {
                if (!
IsAvailableToInvite(I_PlayerI))
                    continue;
                
                
SZ_ChoosePlayerID[0] = I;
                
                
menu_additem(I_MenuA_PlayerVars[I][PSZ_CLIENT_NAME], SZ_ChoosePlayerID);
            }
            
            
menu_setprop(I_MenuMPROP_BACKNAME"\y<<<\r.");
            
menu_setprop(I_MenuMPROP_NEXTNAME"\y>>>\r.");
            
menu_setprop(I_MenuMPROP_EXITNAME"\rSALIR\y.");
        }
        
        case 
CONFIRM_INVITATION_TO_CLAN:
        {            
            
GetClanData(A_PlayerVars[I_Value][PI_CLAN_ID]);
            
            
formatex(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "\yEL JUGADOR \r%s \yTE ESTÁ INVITANDO A UNIRTE A SU CLAN^n^n\yNOMBRE\w: \r%s^n\yLÍDER\w: \r%s^n\yNº DE MIEMBROS\w: \r%d^n^n\
            \w¿\rQUIERES ACEPTAR LA INVITACIÓN\w?"
A_PlayerVars[I_Value][PSZ_CLIENT_NAME], A_ClanData[SZ_CLAN_NAME], A_ClanData[SZ_CLAN_LEADER], A_ClanData[I_CLAN_MEMBERS]);
            
            
I_Menu menu_create(A_GlobalVars[GSZ_TEXT], "HM_ConfirmInvitation");
            
            
SZ_ChoosePlayerID[0] = I_Value;
            
            
menu_additem(I_Menu"\ySI, ACEPTAR INVITACIÓN\r."SZ_ChoosePlayerID[0]);
            
            
menu_setprop(I_MenuMPROP_EXITNAME"\rNO, RECHAZAR INVITACIÓN\y.");
        }
        
        case 
SHOW_CLAN_MEMBERS:
        {
            
I_Menu menu_create("\yMIEMBROS DEL CLAN\w\R""HM_ClanMembers");
            
            
GetClanData(A_PlayerVars[I_Player][PI_CLAN_ID]);
            
            for (
STATUS_LEADER>= STATUS_MEMBERI--)
            {
                
I_TotalMembers GetTotalClanMembersOfSameStatus(A_PlayerVars[I_Player][PI_CLAN_ID], II_OffLineMembersI_OffLineMembersA_ClanData[I_CLAN_MEMBERS]);
                
I_FindMembers 0;
                
                while (
I_FindMembers++ < I_TotalMembers)
                {
                    
GetClanMembers(A_PlayerVars[I_Player][PI_CLAN_ID], ISZ_MemberNamecharsmax(SZ_MemberName), SZ_MemberStatuscharsmax(SZ_MemberStatus), BO_IsOnlinebool:(I_FindMembers == I_TotalMembers));
                                        
                    
formatex(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "%s \y[\r%s\y] \w---> %s"SZ_MemberNameSZ_MemberStatus, (BO_IsOnline "\r[\yONLINE\r]" "\y[\dOFFLINE\y]"));
                
                    
menu_additem(I_MenuA_GlobalVars[GSZ_TEXT]);
                }
            }
            
            
menu_setprop(I_MenuMPROP_BACKNAME"\y<<<\r.");
            
menu_setprop(I_MenuMPROP_NEXTNAME"\y>>>\r.");
            
menu_setprop(I_MenuMPROP_EXITNAME"\rSALIR\y.");
        }
        
        case 
SHOW_KICK_MEMBERS:
        {
            
I_Menu menu_create("\yEXPULSAR MIEMBRO DEL CLAN\w\R""HM_KickMembers");
            
            
GetClanData(A_PlayerVars[I_Player][PI_CLAN_ID]);
            
            for (
STATUS_LEADER>= STATUS_MEMBERI--)
            {
                
I_TotalMembers GetTotalClanMembersOfSameStatus(A_PlayerVars[I_Player][PI_CLAN_ID], II_OffLineMembersI_OffLineMembersA_ClanData[I_CLAN_MEMBERS]);
                
I_FindMembers 0;
                
                while (
I_FindMembers++ < I_TotalMembers)
                {
                    
GetClanMembers(A_PlayerVars[I_Player][PI_CLAN_ID], ISZ_MemberNamecharsmax(SZ_MemberName), SZ_MemberStatuscharsmax(SZ_MemberStatus), BO_IsOnlinebool:(I_FindMembers == I_TotalMembers));
                    
                    
formatex(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "%s \y[\r%s\y] \w---> %s"SZ_MemberNameSZ_MemberStatus, (BO_IsOnline "\r[\yONLINE\r]" "\y[\dOFFLINE\y]"));
                
                    
menu_additem(I_MenuA_GlobalVars[GSZ_TEXT], SZ_MemberName);
                }
            }
            
            
menu_setprop(I_MenuMPROP_BACKNAME"\y<<<\r.");
            
menu_setprop(I_MenuMPROP_NEXTNAME"\y>>>\r.");
            
menu_setprop(I_MenuMPROP_EXITNAME"\rSALIR\y.");
        }
        
        case 
SHOW_EDIT_CLAN_MEMBERS_STATUS:
        {
            
I_Menu menu_create("\yEDITAR RANGO DE MIEMBRO DEL CLAN\w\R""HM_EditMemberStatus");
            
            
GetClanData(A_PlayerVars[I_Player][PI_CLAN_ID]);
            
            for (
STATUS_LEADER>= STATUS_MEMBERI--)
            {
                
I_TotalMembers GetTotalClanMembersOfSameStatus(A_PlayerVars[I_Player][PI_CLAN_ID], II_OffLineMembersI_OffLineMembersA_ClanData[I_CLAN_MEMBERS]);
                
I_FindMembers 0;
                
                while (
I_FindMembers++ < I_TotalMembers)
                {
                    
GetClanMembers(A_PlayerVars[I_Player][PI_CLAN_ID], ISZ_MemberNamecharsmax(SZ_MemberName), SZ_MemberStatuscharsmax(SZ_MemberStatus), BO_IsOnlinebool:(I_FindMembers == I_TotalMembers));
                    
                    
formatex(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "%s \y[\r%s\y] \w---> %s"SZ_MemberNameSZ_MemberStatus, (BO_IsOnline "\r[\yONLINE\r]" "\y[\dOFFLINE\y]"));
                
                    
menu_additem(I_MenuA_GlobalVars[GSZ_TEXT], SZ_MemberName);
                }
            }
            
            
menu_setprop(I_MenuMPROP_BACKNAME"\y<<<\r.");
            
menu_setprop(I_MenuMPROP_NEXTNAME"\y>>>\r.");
            
menu_setprop(I_MenuMPROP_EXITNAME"\rSALIR\y.");
        }
        
        case 
SHOW_CLAN_INFO:
        {
            new 
I_HoursI_MinutesI_Seconds;
            
            static 
SZ_ActivityTime[100];
            
            
GetClanActivityTime((I_Value A_PlayerVars[I_Player][PI_CLAN_ID] : I_Value), I_HoursI_MinutesI_Seconds);
                        
            
I_TotalMembers GetTotalClanMembersOfSameStatus((I_Value A_PlayerVars[I_Player][PI_CLAN_ID] : I_Value), SEARCH_ALL_STATUSI_OnLineMembersI_OffLineMembersA_ClanData[I_CLAN_MEMBERS]);
            
            if (!
I_OnLineMembers)
                
formatex(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "^t^t^t^t^t\r•  \y%d (\rOFF-LINE\y)"I_OffLineMembers);
            else
            {
                if (!
I_OffLineMembers)
                    
formatex(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "^t^t^t^t^t\r•  \y%d (\rON-LINE\y)"I_OnLineMembers);
                else
                    
formatex(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "^t^t^t^t^t\r•  \y%d (\rON-LINE\y)^n^t^t^t^t^t\r•  \y%d (\rOFF-LINE\y)"I_OnLineMembersI_OffLineMembers);
            }
            
            
SZ_ActivityTime[0] = EOS;
            
            if (
I_Hours <= && I_Minutes <= && I_Seconds <= 0)
                
formatex(SZ_ActivityTimecharsmax(SZ_ActivityTime), "\rNO HAY REGISTROS AUN");
            else
            {
                if (
I_Hours)
                    
formatex(SZ_ActivityTimecharsmax(SZ_ActivityTime), "\r%d \yH%s"I_Hours, (I_Minutes || I_Seconds " \w| " ""));
                
                if (
I_Minutes)
                    
format(SZ_ActivityTimecharsmax(SZ_ActivityTime), "%s\r%d \yM%s"SZ_ActivityTimeI_Minutes, (I_Seconds " \w| " ""));
                
                if (
I_Seconds)
                    
format(SZ_ActivityTimecharsmax(SZ_ActivityTime), "%s\r%d \yS"SZ_ActivityTimeI_Seconds);
                
                
add(SZ_ActivityTimecharsmax(SZ_ActivityTime), " DE JUEGO");
            }
                
            
            if (!
A_ClanData[SZ_CLAN_TAG][0])
            {
                
format(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "\yINFORMACIÓN DEL CLAN^n^n\yNOMBRE\w: \r%s^n\yNº DE MIEMBROS\w: \r%d ^n%s^n\yLÍDER\w: \r%s^n\yTAG\w: \rSIN TAG^n\yTIEMPO DE ACTIVIDAD\w: %s^n",
                
A_ClanData[SZ_CLAN_NAME], A_ClanData[I_CLAN_MEMBERS], A_GlobalVars[GSZ_TEXT], A_ClanData[SZ_CLAN_LEADER], SZ_ActivityTime);
            }
            else
            {
                
format(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "\yINFORMACIÓN DEL CLAN^n^n\yNOMBRE\w: \r%s^n\yNº DE MIEMBROS\w: \r%d^n%s^n\yLÍDER\w: \r%s^n\yTAG\w: \r%s^n\yTIEMPO DE ACTIVIDAD\w: %s^n",
                
A_ClanData[SZ_CLAN_NAME], A_ClanData[I_CLAN_MEMBERS], A_GlobalVars[GSZ_TEXT], A_ClanData[SZ_CLAN_LEADER], A_ClanData[SZ_CLAN_TAG], SZ_ActivityTime);
            }
            
            
I_Menu menu_create(A_GlobalVars[GSZ_TEXT], "HM_ClanInfo");
            
            
menu_additem(I_Menu"\rVOLVER\y.""1");
            
            
menu_setprop(I_MenuMPROP_EXITMEXIT_NEVER);
        }
        
        case 
CHOOSE_STATUS_TO_CLAN_MEMBER:
        {
            
I_Menu menu_create("\yELIGE UN NUEVO RANGO PARA ESTE MIEMBRO""HM_ChooseStatusToMember");
            
            for (
0charsmax(CSZ_ClanMemberStatus); I++)
            {
                
formatex(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "\r%s"CSZ_ClanMemberStatus[I]);
                
                
menu_additem(I_MenuA_GlobalVars[GSZ_TEXT], SZ_Text);
            }
            
            
menu_setprop(I_MenuMPROP_EXITNAME"\rVOLVER\y.");
        }
        
        case 
CONFIRM_CLAN_MEMBER_STATUS:
        {
            
I_OnLineMembers GetMemberRealID(SZ_Text);
            
            if (
I_OnLineMembers)
            {
                
formatex(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "\w¿\yESTAS SEGURO DE QUERER EDITAR EL RALGO DE\w: \r%s\w?^n^n\
                \yRANGO ACTUAL\w: \r%s^n\yRANGO ELEGIDO\w: \r%s"
A_PlayerVars[I_OnLineMembers][PSZ_CLIENT_NAME], CSZ_ClanMemberStatus[A_PlayerVars[I_OnLineMembers][PI_CLAN_STATUS]],
                
CSZ_ClanMemberStatus[A_PlayerVars[I_Player][PI_CHOOSE_STATUS_FOR_MEMBER]]);
            }
            else
            {
                static 
SZ_Data[10], SZ_Status[2];
                
                
fvault_get_data(CSZ_PlayersVaultSZ_TextSZ_Datacharsmax(SZ_Data));
                
                
parse(SZ_Data00SZ_Statuscharsmax(SZ_Status));
                
                
I_OnLineMembers str_to_num(SZ_Status);
                
                
formatex(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "\w¿\yESTAS SEGURO DE QUERER EDITAR EL RALGO DE\w: \r%s\w?^n^n\
                \yRANGO ACTUAL\w: \r%s^n\yRANGO ELEGIDO\w: \r%s"
SZ_TextCSZ_ClanMemberStatus[I_OnLineMembers],
                
CSZ_ClanMemberStatus[A_PlayerVars[I_Player][PI_CHOOSE_STATUS_FOR_MEMBER]]);
            }
            
            
I_Menu menu_create(A_GlobalVars[GSZ_TEXT], "HM_ConfirmMemberStatus");
            
            
menu_additem(I_Menu"\ySI, EDITAR RANGO\r."SZ_Text);
            
            
menu_setprop(I_MenuMPROP_EXITNAME"\rNO, VOLVER\y.");
        }
        
        case 
SHOW_CLANES_TOP_ONE:
        {
            
I_Menu menu_create("\yTOP DE CLANES (\rDESC\y) \w- \rTIEMPO DE ACTIVIDAD\w\R""HM_ClanesTop");
            
            new 
I_BestClan;
            static 
I_MaxClanes;
            
            
I_MaxClanes ArraySize(A_GlobalVars[GDA_CLANES]);
            
            if (
I_MaxClanes CI_MaxClanesOnTop)
                
I_MaxClanes CI_MaxClanesOnTop;
            
            for (
0I_MaxClanesI++)
            {
                
I_BestClan GetBestClan(SORT_BY_ACTIVITY_TIMESORT_DOWNWARDSbool:(== (I_MaxClanes 1)));
                                
                
formatex(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "\r%s"A_ClanData[SZ_CLAN_NAME]);
                
                
SZ_ChoosePlayerID[0] = I_BestClan;
                
                
menu_additem(I_MenuA_GlobalVars[GSZ_TEXT], SZ_ChoosePlayerID);
            }
            
            
menu_setprop(I_MenuMPROP_BACKNAME"\y<<<\r.");
            
menu_setprop(I_MenuMPROP_NEXTNAME"\y>>>\r.");
            
menu_setprop(I_MenuMPROP_EXITNAME"\rSALIR\y.");
        }
        
        case 
SHOW_CLANES_TOP_TWO:
        {
            
I_Menu menu_create("\yTOP DE CLANES (\rASC\y) \w- \rCANTIDAD DE MIEMBROS\w\R""HM_ClanesTop");
            
            new 
I_BestClan;
            static 
I_MaxClanes;
            
            
I_MaxClanes ArraySize(A_GlobalVars[GDA_CLANES]);
            
            if (
I_MaxClanes CI_MaxClanesOnTop)
                
I_MaxClanes CI_MaxClanesOnTop;
            
            for (
0I_MaxClanesI++)
            {                
                
I_BestClan GetBestClan(SORT_BY_CLAN_MEMBERSSORT_UPWARDSbool:(== (I_MaxClanes 1)));
                                
                
formatex(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "\r%s"A_ClanData[SZ_CLAN_NAME]);
                
                
SZ_ChoosePlayerID[0] = I_BestClan;
                
                
menu_additem(I_MenuA_GlobalVars[GSZ_TEXT], SZ_ChoosePlayerID);
            }
            
            
menu_setprop(I_MenuMPROP_BACKNAME"\y<<<\r.");
            
menu_setprop(I_MenuMPROP_NEXTNAME"\y>>>\r.");
            
menu_setprop(I_MenuMPROP_EXITNAME"\rSALIR\y.");
        }
    }
    
    
menu_display(I_PlayerI_Menu);
}

/*=====================================
        CALLBACKS
=====================================*/

public HM_Clan(const I_Player, const I_Menu, const I_Item)
{
    if (
I_Item == MENU_EXIT)
    {
        
menu_destroy(I_Menu);
        
        return;
    }
    
    switch (
I_Item)
    {
        case 
0:
        {
            if (
M_HaveClan(I_Player))
            {
                new 
I_HoursI_MinutesI_Seconds;
                
                if (
GetClanActivityTime(A_PlayerVars[I_Player][PI_CLAN_ID], I_HoursI_MinutesI_Secondstrue) > A_ClanData[I_CLAN_ACTIVITY_TIME])
                {
                    
A_GlobalVars[GSZ_TEXT][0] = EOS;
                    
                    if (
I_Hours)
                        
formatex(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "!color%d !yhora%s%s"I_Hours, (I_Hours "s" ""), (I_Minutes || I_Seconds " !g| " ""));
                    
                    if (
I_Minutes)
                        
format(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "%s!color%d !yminuto%s%s"A_GlobalVars[GSZ_TEXT], I_Minutes, (I_Minutes "s" ""), (I_Seconds " !g| " ""));
                    
                    if (
I_Seconds)
                        
format(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "%s!color%d !ysegundo%s"A_GlobalVars[GSZ_TEXT], I_Seconds, (I_Seconds "s" ""));
                    
                    
add(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), " de juego");
                    
                    
UTIL_SendPrint(I_PlayerI_Player"%s Para invitar a otro jugador, %s !gCLAN!y necesita acumular!color:!g!."CSZ_Prefix, (A_PlayerVars[I_Player][PI_CLAN_STATUS] >= STATUS_LEADER "tu" "el"));
                    
UTIL_SendPrint(I_PlayerI_Player"%s %s!g!."CSZ_PrefixA_GlobalVars[GSZ_TEXT]);
                }
                else
                    
SM_Clan(I_Player_INVITE_PLAYERS_TO_CLAN);
            }
            else
            {
                
A_PlayerVars[I_Player][PI_STATUS] = CREATE_NEW_CLAN;
                
                
UTIL_SendCMDWithHUD(I_Player"messagemode MESSAGEMODE_Clanes""Ingresa un nombre para tu clan!"_0.00.033.0);
            }
        }
        
        case 
1:
        {
            if (
M_HaveClan(I_Player))
                
SM_Clan(I_Player_SHOW_CLAN_MEMBERS);
        }
        
        case 
2:
        {
            if (
M_HaveClan(I_Player))
            {
                if (
A_PlayerVars[I_Player][PI_CLAN_STATUS] >= STATUS_SUBLEADER)
                    
SM_Clan(I_Player_SHOW_KICK_MEMBERS);
                else
                {
                    
UTIL_SendPrint(I_PlayerI_Player"%s No tienes acceso suficiente, necesitas ser al menos un!color: %s!g!."CSZ_PrefixCSZ_ClanMemberStatus[STATUS_SUBLEADER]);
                    
                    
SM_Clan(I_Player_, (M_HaveClan(I_Player) ? HAVE_CLAN DONT_HAVE_CLAN));
                }
            }
        }
        
        case 
3:
        {
            if (
M_HaveClan(I_Player))
            {
                if (
A_PlayerVars[I_Player][PI_CLAN_STATUS] >= STATUS_COLEADER)
                    
SM_Clan(I_Player_SHOW_EDIT_CLAN_MEMBERS_STATUS);
                else
                {
                    
UTIL_SendPrint(I_PlayerI_Player"%s No tienes acceso suficiente, necesitasr ser al menos un!color: %s!g!."CSZ_PrefixCSZ_ClanMemberStatus[STATUS_COLEADER]);
                    
                    
SM_Clan(I_Player_, (M_HaveClan(I_Player) ? HAVE_CLAN DONT_HAVE_CLAN));
                }
            }
        }
        
        case 
4:
        {
            if (
M_HaveClan(I_Player))
                
SM_Clan(I_Player, -1SHOW_CLAN_INFO);
        }
        
        case 
5:
        {
            if (
M_HaveClan(I_Player))
            {
                if (
A_PlayerVars[I_Player][PI_CLAN_STATUS] >= STATUS_COLEADER)
                {
                    if (
A_PlayerVars[I_Player][PI_CLAN_STATUS] >= STATUS_LEADER)
                        
UTIL_SendCMDWithHUD(I_Player"messagemode MESSAGEMODE_Clanes""Crea y/o edita un TAG para identificar a tu clan!", { 2552550}, 0.00.033.0);
                    else
                        
UTIL_SendCMDWithHUD(I_Player"messagemode MESSAGEMODE_Clanes""Crea y/o edita un TAG para identificar a el clan!", { 2552550}, 0.00.033.0);
                    
                    
A_PlayerVars[I_Player][PI_STATUS] = CHANGE_CLAN_TAG;
                }
                else
                {
                    
UTIL_SendPrint(I_PlayerI_Player"%s No tienes acceso suficiente, necesitas ser al menos un!color: %s!g!."CSZ_PrefixCSZ_ClanMemberStatus[STATUS_COLEADER]);
                    
                    
SM_Clan(I_Player_, (M_HaveClan(I_Player) ? HAVE_CLAN DONT_HAVE_CLAN));
                }
            }
        }
        
        case 
6:
        {
            if (
M_HaveClan(I_Player))
            {
                if (
A_PlayerVars[I_Player][PI_CLAN_STATUS] >= STATUS_COLEADER)
                {
                    
UTIL_SendCMDWithHUD(I_Player"messagemode MESSAGEMODE_Clanes""Crea y/o edita un mensaje de bienvenida^npara los futuros miembros del clan!", { 02550}, 0.00.033.0);
                    
                    
A_PlayerVars[I_Player][PI_STATUS] = CHANGE_CLAN_WELCOME_MESSAGE;
                }
                else
                {
                    
UTIL_SendPrint(I_PlayerI_Player"%s No tienes acceso suficiente, necesitasr ser al menos un!color: %s!g!."CSZ_PrefixCSZ_ClanMemberStatus[STATUS_COLEADER]);
                    
                    
SM_Clan(I_Player_, (M_HaveClan(I_Player) ? HAVE_CLAN DONT_HAVE_CLAN));
                }
            }
        }
        case 
7:
        {
            if (
M_HaveClan(I_Player))
                
SM_Clan(I_Player_SHOW_CLANES_TOP_ONE);
        }
        case 
8:
        {
            if (
M_HaveClan(I_Player))
                
SM_Clan(I_Player_SHOW_CLANES_TOP_TWO);
        }
        case 
9:
        {
            if (
M_HaveClan(I_Player))
            {
                if (
A_PlayerVars[I_Player][PI_CLAN_STATUS] >= STATUS_LEADER)
                {
                    
GetClanData(A_PlayerVars[I_Player][PI_CLAN_ID]);
                        
                    
TrieDeleteKey(A_GlobalVars[GT_CLANES_NAMES], A_ClanData[SZ_CLAN_NAME]);
                    
TrieDeleteKey(A_GlobalVars[GT_CLANES_TAGS], A_ClanData[SZ_CLAN_TAG]);
                        
                    
DestroyClan(I_PlayerA_PlayerVars[I_Player][PI_CLAN_ID]);
                        
                    
ArrayDeleteItem(A_GlobalVars[GDA_CLANES], A_PlayerVars[I_Player][PI_CLAN_ID]);
                        
                    
ChangeAllClanIDs(A_PlayerVars[I_Player][PI_CLAN_ID]);
                        
                    
A_PlayerVars[I_Player][PI_CLAN_ID] = -1;
                    
A_PlayerVars[I_Player][PI_CLAN_STATUS] = A_PlayerVars[I_Player][PI_CURRENT_TIMER] = STATUS_MEMBER;
                        
                    
UTIL_SendPrint(I_PlayerI_Player"%s Acabas de !colorDESTRUIR!y tu !gCLAN!."CSZ_Prefix);
                }
            }
        }    
    }
}

public 
HM_ConfirmClanName(const I_Player, const I_Menu, const I_Item)
{
    if (
I_Item == MENU_EXIT)
    {
        
SM_Clan(I_Player_, (M_HaveClan(I_Player) ? HAVE_CLAN DONT_HAVE_CLAN));
        
        
menu_destroy(I_Menu);
        
        return;
    }
    
    
copy(A_ClanData[SZ_CLAN_NAME], charsmax(A_ClanData[SZ_CLAN_NAME]), A_PlayerVars[I_Player][PSZ_CLAN_NAME]);
    
copy(A_ClanData[SZ_CLAN_LEADER], charsmax(A_ClanData[SZ_CLAN_LEADER]), A_PlayerVars[I_Player][PSZ_CLIENT_NAME]);
    
    
A_ClanData[SZ_CLAN_TAG][0] = A_ClanData[SZ_CLAN_WELCOME_MESSAGE][0] = EOS;
    
A_ClanData[I_CLAN_MEMBERS] = 1;
    
A_ClanData[I_CLAN_ID] = A_PlayerVars[I_Player][PI_CLAN_ID] = ArraySize(A_GlobalVars[GDA_CLANES]);
    
A_PlayerVars[I_Player][PI_CLAN_STATUS] = STATUS_LEADER;
    
    
ArrayPushArray(A_GlobalVars[GDA_CLANES], A_ClanData);
    
    
UTIL_SendPrint(I_PlayerI_Player"%s Creaste el !gCLAN!color: %s!y con Ã©xito!g!."CSZ_PrefixA_ClanData[SZ_CLAN_NAME]);
    
UTIL_SendPrint(0random_num(CHAT_COLOR_REDCHAT_COLOR_BLUE), "%s Un nuevo !gCLAN!y ha surgido, su nombre es!color: %s!g!."CSZ_PrefixA_ClanData[SZ_CLAN_NAME]);
}

public 
HM_InviteToClan(const I_Player, const I_Menu, const I_Item)
{
    if (
I_Item == MENU_EXIT)
    {
        
SM_Clan(I_Player_, (M_HaveClan(I_Player) ? HAVE_CLAN DONT_HAVE_CLAN));
        
        
menu_destroy(I_Menu);
        
        return;
    }
    
    static 
I_TemporalSZ_ChoosePlayerID[2];
    
    
menu_item_getinfo(I_MenuI_ItemI_TemporalSZ_ChoosePlayerIDcharsmax(SZ_ChoosePlayerID), __I_Temporal);
    
    
SM_Clan(SZ_ChoosePlayerID[0], I_PlayerCONFIRM_INVITATION_TO_CLAN);
}

public 
HM_ConfirmInvitation(const I_Player, const I_Menu, const I_Item)
{
    if (
I_Item == MENU_EXIT)
    {
        
menu_destroy(I_Menu);
        
        return;
    }
    
    static 
I_TemporalSZ_InviterPlayerID[2];
    
    
menu_item_getinfo(I_MenuI_ItemI_TemporalSZ_InviterPlayerIDcharsmax(SZ_InviterPlayerID), __I_Temporal);
    
    
GetClanData(A_PlayerVars[SZ_InviterPlayerID[0]][PI_CLAN_ID]);
    
    
A_ClanData[I_CLAN_MEMBERS]++;
    
    
A_PlayerVars[I_Player][PI_CLAN_ID] = A_ClanData[I_CLAN_ID];
    
A_PlayerVars[I_Player][PI_CLAN_STATUS] = STATUS_MEMBER;
    
    
UpdateClanData(A_ClanData[I_CLAN_ID]);
    
    if (
A_ClanData[SZ_CLAN_WELCOME_MESSAGE][0])
        
UTIL_SendPrint(I_PlayerI_Player"%s !color%s!y %s"CSZ_PrefixA_ClanData[SZ_CLAN_WELCOME_MESSAGE], A_PlayerVars[I_Player][PSZ_CLIENT_NAME]);
    else
        
UTIL_SendPrint(I_PlayerI_Player"%s Ahora formas parte del !gCLAN!color: %s!y, bienvenido!g!."CSZ_PrefixA_ClanData[SZ_CLAN_NAME]);
    
    
UTIL_SendPrint(SZ_InviterPlayerID[0], SZ_InviterPlayerID[0], "%s !color%s!y acepto tu invitación al !gCLAN!."CSZ_PrefixA_PlayerVars[I_Player][PSZ_CLIENT_NAME]);
    
    
formatex(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "%s %!color%s!y se ha unido al !gCLAN!g."CSZ_PrefixA_PlayerVars[I_Player][PSZ_CLIENT_NAME]);
    
    
SendMessageToMembers(I_PlayerA_GlobalVars[GSZ_TEXT]);
}

public 
HM_ClanMembers(const I_Player, const I_Menu, const I_Item)
{
    if (
I_Item == MENU_EXIT)
    {
        
menu_destroy(I_Menu);
        
        
SM_Clan(I_Player_, (M_HaveClan(I_Player) ? HAVE_CLAN DONT_HAVE_CLAN));
        
        return;
    }
    
    
SM_Clan(I_Player_SHOW_CLAN_MEMBERS);
}

public 
HM_ClanInfo(const I_Player, const I_Menu, const I_Item)
{
    if (!
I_Item)
    {
        
menu_destroy(I_Menu);
        
        
SM_Clan(I_Player_, (M_HaveClan(I_Player) ? HAVE_CLAN DONT_HAVE_CLAN));
    }
}

public 
HM_KickMembers(const I_Player, const I_Menu, const I_Item)
{
    if (
I_Item == MENU_EXIT)
    {
        
SM_Clan(I_Player_, (M_HaveClan(I_Player) ? HAVE_CLAN DONT_HAVE_CLAN));
        
        
menu_destroy(I_Menu);
        
        return;
    }
    
    new 
I_MemberPlayerID;
    static 
SZ_MemberName[32];
    
    
menu_item_getinfo(I_MenuI_ItemI_MemberPlayerIDSZ_MemberNamecharsmax(SZ_MemberName), __I_MemberPlayerID);
    
    
I_MemberPlayerID GetMemberRealID(SZ_MemberName);
    
    if (
I_MemberPlayerID)
    {
        if (
I_Player != I_MemberPlayerID && A_PlayerVars[I_MemberPlayerID][PI_CLAN_STATUS] >= A_PlayerVars[I_Player][PI_CLAN_STATUS])
        {
            
UTIL_SendPrint(I_PlayerI_Player"%s No puedes kickear a !color%s!y del !gCLAN!y por que es %s!color%s!y%s!g!."CSZ_Prefix,
            
A_PlayerVars[I_MemberPlayerID][PSZ_CLIENT_NAME], (A_PlayerVars[I_MemberPlayerID][PI_CLAN_STATUS] >= STATUS_LEADER "el " ""),
            
CSZ_ClanMemberStatus[A_PlayerVars[I_MemberPlayerID][PI_CLAN_STATUS]],
            (
A_PlayerVars[I_Player][PI_CLAN_STATUS] == A_PlayerVars[I_MemberPlayerID][PI_CLAN_STATUS] ? " al igual que tú" ""));
            
            
SM_Clan(I_Player_, (M_HaveClan(I_Player) ? SHOW_KICK_MEMBERS DONT_HAVE_CLAN));
            
            return;
        }
        else if (
I_Player == I_MemberPlayerID)
        {
            
UTIL_SendPrint(I_PlayerI_Player"%s No puedes kickearte a ti mismo del !gCLAN!."CSZ_Prefix);
            
            
SM_Clan(I_Player_, (M_HaveClan(I_Player) ? SHOW_KICK_MEMBERS DONT_HAVE_CLAN));
            
            return;
        }
        
        
A_PlayerVars[I_MemberPlayerID][PI_CLAN_ID] = -1;
        
A_PlayerVars[I_MemberPlayerID][PI_CLAN_STATUS] = STATUS_MEMBER;
        
        if (
A_PlayerVars[I_Player][PI_CLAN_STATUS] >= STATUS_LEADER)
        {
            
UTIL_SendPrint(I_MemberPlayerIDI_MemberPlayerID"%s El !g%s!color %s!y te acaba de kickear de su !gCLAN!."CSZ_Prefix,
            
CSZ_ClanMemberStatus[A_PlayerVars[I_Player][PI_CLAN_STATUS]], A_PlayerVars[I_Player][PSZ_CLIENT_NAME]);
            
            
UTIL_SendPrint(I_PlayerI_Player"%s Acabas de kickear a !color%s!y de tu !gCLAN!."CSZ_PrefixA_PlayerVars[I_MemberPlayerID][PSZ_CLIENT_NAME])
        }
        else
        {
            
UTIL_SendPrint(I_MemberPlayerIDI_MemberPlayerID"%s El !g%s!color %s!y te acaba de kickear del su !gCLAN!."CSZ_Prefix,
            
CSZ_ClanMemberStatus[A_PlayerVars[I_Player][PI_CLAN_STATUS]], A_PlayerVars[I_Player][PSZ_CLIENT_NAME]);
            
            
UTIL_SendPrint(I_PlayerI_Player"%s Acabas de kickear a !color%s!y del !gCLAN!."CSZ_PrefixA_PlayerVars[I_MemberPlayerID][PSZ_CLIENT_NAME]);
        }
    }
    else
    {
        new 
I_Status;
        static 
SZ_Data[10], SZ_Status[2];
        
        
fvault_get_data(CSZ_PlayersVaultSZ_MemberNameSZ_Datacharsmax(SZ_Data));

        
parse(SZ_Data00SZ_Statuscharsmax(SZ_Status));
        
        
I_Status str_to_num(SZ_Status);
        
        if (
I_Status >= A_PlayerVars[I_Player][PI_CLAN_STATUS])
        {
            
UTIL_SendPrint(I_PlayerI_Player"%s No puedes kickear a !color%s!y por que es %s!color%s!y%s!g!."CSZ_PrefixSZ_MemberName,
            (
I_Status >= STATUS_LEADER "el " ""), CSZ_ClanMemberStatus[I_Status], (I_Status == A_PlayerVars[I_Player][PI_CLAN_STATUS] ? " al igual que tú" ""));
            
            
SM_Clan(I_Player_, (M_HaveClan(I_Player) ? SHOW_KICK_MEMBERS DONT_HAVE_CLAN));
            
            return;
        }
        
        
formatex(SZ_Datacharsmax(SZ_Data), "-1 0");
        
        
fvault_set_data(CSZ_PlayersVaultSZ_MemberNameSZ_Data);
        
        
UTIL_SendPrint(I_PlayerI_Player"%s Acabas de kickear a !color%s!y de%s !gCLAN!."CSZ_PrefixSZ_MemberName, (A_PlayerVars[I_Player][PI_CLAN_STATUS] >= STATUS_LEADER " tu" "l"));
    }    
    
    
GetClanData(A_PlayerVars[I_Player][PI_CLAN_ID]);
    
    
A_ClanData[I_CLAN_MEMBERS]--;
    
    
UpdateClanData(A_PlayerVars[I_Player][PI_CLAN_ID]);
    
    
SM_Clan(I_Player_, (M_HaveClan(I_Player) ? SHOW_KICK_MEMBERS DONT_HAVE_CLAN));
}

public 
HM_EditMemberStatus(const I_Player, const I_Menu, const I_Item)
{
    if (
I_Item == MENU_EXIT)
    {
        
SM_Clan(I_Player_, (M_HaveClan(I_Player) ? HAVE_CLAN DONT_HAVE_CLAN));
        
        
menu_destroy(I_Menu);
        
        return;
    }
    
    new 
I_MemberPlayerID;
    static 
SZ_MemberName[32];
    
    
menu_item_getinfo(I_MenuI_ItemI_MemberPlayerIDSZ_MemberNamecharsmax(SZ_MemberName), __I_MemberPlayerID);
    
    
I_MemberPlayerID GetMemberRealID(SZ_MemberName);
    
    if (
I_MemberPlayerID)
    {
        if (
I_MemberPlayerID != I_Player && A_PlayerVars[I_MemberPlayerID][PI_CLAN_STATUS] >= A_PlayerVars[I_Player][PI_CLAN_STATUS])
        {
            
UTIL_SendPrint(I_PlayerI_Player"%s No puedes editar el rango de !color%s!y por que es %s!color%s!y%s!g!."CSZ_Prefix,
            
A_PlayerVars[I_MemberPlayerID][PSZ_CLIENT_NAME], (A_PlayerVars[I_MemberPlayerID][PI_CLAN_STATUS] >= STATUS_LEADER "el " ""),
            
CSZ_ClanMemberStatus[A_PlayerVars[I_MemberPlayerID][PI_CLAN_STATUS]],
            (
A_PlayerVars[I_MemberPlayerID][PI_CLAN_STATUS] == A_PlayerVars[I_Player][PI_CLAN_STATUS] ? " al igual que tú" ""));
                
            
SM_Clan(I_Player_, (M_HaveClan(I_Player) ? SHOW_EDIT_CLAN_MEMBERS_STATUS DONT_HAVE_CLAN));
            
            return;
        }
        else if (
I_MemberPlayerID == I_Player)
        {
            
UTIL_SendPrint(I_PlayerI_Player"%s No puedes cambiarte tu propio rango!g!."CSZ_Prefix);
            
            
SM_Clan(I_Player_, (M_HaveClan(I_Player) ? SHOW_EDIT_CLAN_MEMBERS_STATUS DONT_HAVE_CLAN));
            
            return;
        }
        else
            
SM_Clan(I_Player_CHOOSE_STATUS_TO_CLAN_MEMBERA_PlayerVars[I_MemberPlayerID][PSZ_CLIENT_NAME]);
    }
    else
    {
        new 
I_Status;
        static 
SZ_Data[10], SZ_Status[2];
        
        
fvault_get_data(CSZ_PlayersVaultSZ_MemberNameSZ_Datacharsmax(SZ_Data));
        
        
parse(SZ_Data00SZ_Statuscharsmax(SZ_Status));
        
        
I_Status str_to_num(SZ_Status);
        
        if (
I_Status >= A_PlayerVars[I_Player][PI_CLAN_STATUS])
        {
            
UTIL_SendPrint(I_PlayerI_Player"%s No puedes editar el rango de !color%s!y por que es %s!color%s!y%s!g!."CSZ_PrefixSZ_MemberName,
            (
I_Status >= STATUS_LEADER "el " ""), CSZ_ClanMemberStatus[I_Status], (I_Status == A_PlayerVars[I_Player][PI_CLAN_STATUS] ? " al igual que tú" ""));
            
            
SM_Clan(I_Player_, (M_HaveClan(I_Player) ? SHOW_EDIT_CLAN_MEMBERS_STATUS DONT_HAVE_CLAN));
            
            return;
        }
        
        
SM_Clan(I_Player_CHOOSE_STATUS_TO_CLAN_MEMBERSZ_MemberName);
    }
}

public 
HM_ChooseStatusToMember(const I_Player, const I_Menu, const I_Item)
{
    if (
I_Item == MENU_EXIT)
    {
        
SM_Clan(I_Player_, (M_HaveClan(I_Player) ? SHOW_EDIT_CLAN_MEMBERS_STATUS DONT_HAVE_CLAN));
        
        
menu_destroy(I_Menu);
        
        return;
    }
    
    new 
I_Temporal;
    static 
SZ_MemberName[32];
    
    
menu_item_getinfo(I_MenuI_ItemI_TemporalSZ_MemberNamecharsmax(SZ_MemberName), __I_Temporal);
    
    if (
A_PlayerVars[I_Player][PI_CLAN_STATUS] < STATUS_LEADER && I_Item == STATUS_COLEADER)
    {
        
UTIL_SendPrint(I_PlayerI_Player"%s No puedes elegir un rango igual al tuyo!g!."CSZ_Prefix);
        
        
SM_Clan(I_Player_, (M_HaveClan(I_Player) ? CHOOSE_STATUS_TO_CLAN_MEMBER DONT_HAVE_CLAN), SZ_MemberName);
        
        return;
    }
    
    
A_PlayerVars[I_Player][PI_CHOOSE_STATUS_FOR_MEMBER] = I_Item;
    
    
SM_Clan(I_Player_CONFIRM_CLAN_MEMBER_STATUSSZ_MemberName);
}

public 
HM_ConfirmMemberStatus(const I_Player, const I_Menu, const I_Item)
{
    if (
I_Item == MENU_EXIT)
    {
        
SM_Clan(I_Player_, (M_HaveClan(I_Player) ? SHOW_EDIT_CLAN_MEMBERS_STATUS DONT_HAVE_CLAN));
        
        
menu_destroy(I_Menu);
        
        return;
    }
    
    new 
I_MemberPlayerID;
    static 
SZ_MemberName[32];
    
    
menu_item_getinfo(I_MenuI_ItemI_MemberPlayerIDSZ_MemberNamecharsmax(SZ_MemberName), __I_MemberPlayerID);
    
    
I_MemberPlayerID GetMemberRealID(SZ_MemberName);
    
    if (
I_MemberPlayerID)
    {
        if (
A_PlayerVars[I_MemberPlayerID][PI_CLAN_STATUS] == A_PlayerVars[I_Player][PI_CHOOSE_STATUS_FOR_MEMBER])
        {
            
UTIL_SendPrint(I_PlayerI_Player"%s No puedes elegir el mismo rango que posee actualmente este miembro!g!."CSZ_Prefix);
            
            if (
M_HaveClan(I_Player))
                
SM_Clan(I_Player_CHOOSE_STATUS_TO_CLAN_MEMBERA_PlayerVars[I_MemberPlayerID][PSZ_CLIENT_NAME]);
            else
                
SM_Clan(I_Player_DONT_HAVE_CLAN);
            
            return;
        }
        
        new 
I_LastStatus A_PlayerVars[I_MemberPlayerID][PI_CLAN_STATUS];
        
        
A_PlayerVars[I_MemberPlayerID][PI_CLAN_STATUS] = A_PlayerVars[I_Player][PI_CHOOSE_STATUS_FOR_MEMBER];
        
        
UTIL_SendPrint(I_MemberPlayerIDI_MemberPlayerID"%s Has sido %s al rango!color: %s!y por cortesia del !g%s!color %s!g!."CSZ_Prefix,
        (
A_PlayerVars[I_MemberPlayerID][PI_CLAN_STATUS] > I_LastStatus "ascendido" "degradado"),
        
CSZ_ClanMemberStatus[A_PlayerVars[I_MemberPlayerID][PI_CLAN_STATUS]], CSZ_ClanMemberStatus[A_PlayerVars[I_Player][PI_CLAN_STATUS]],
        
A_PlayerVars[I_Player][PSZ_CLIENT_NAME]);
        
        
UTIL_SendPrint(I_PlayerI_Player"%s Cambiaste el rango de !color%s!y al de!color: !g%s!."CSZ_PrefixA_PlayerVars[I_MemberPlayerID][PSZ_CLIENT_NAME],
        
CSZ_ClanMemberStatus[A_PlayerVars[I_MemberPlayerID][PI_CLAN_STATUS]]);
    }
    else
    {
        static 
SZ_Data[10], SZ_ClanID[4], SZ_Status[2];
        
        
fvault_get_data(CSZ_PlayersVaultSZ_MemberNameSZ_Datacharsmax(SZ_Data));
        
        
parse(SZ_DataSZ_ClanIDcharsmax(SZ_ClanID), SZ_Statuscharsmax(SZ_Status));
        
        if (
str_to_num(SZ_Status) == A_PlayerVars[I_Player][PI_CHOOSE_STATUS_FOR_MEMBER])
        {
            
UTIL_SendPrint(I_PlayerI_Player"%s No puedes elegir el mismo rango que posee actualmente este miembro!g!."CSZ_Prefix);
            
            if (
M_HaveClan(I_Player))
                
SM_Clan(I_Player_CHOOSE_STATUS_TO_CLAN_MEMBERSZ_MemberName);
            else
                
SM_Clan(I_Player_DONT_HAVE_CLAN);
            
            return;
        }
        
        
formatex(SZ_Datacharsmax(SZ_Data), "%s %d"SZ_ClanIDA_PlayerVars[I_Player][PI_CHOOSE_STATUS_FOR_MEMBER]);
            
        
fvault_set_data(CSZ_PlayersVaultSZ_MemberNameSZ_Data);
            
        
UTIL_SendPrint(I_PlayerI_Player"%s Cambiaste el rango de !color%s!y al de!color: !g%s!."CSZ_PrefixSZ_MemberName,
        
CSZ_ClanMemberStatus[A_PlayerVars[I_Player][PI_CHOOSE_STATUS_FOR_MEMBER]]);
    }
}

public 
HM_ClanesTop(const I_Player, const I_Menu, const I_Item)
{
    if (
I_Item == MENU_EXIT)
    {
        
SM_Clan(I_Player_, (M_HaveClan(I_Player) ? HAVE_CLAN DONT_HAVE_CLAN));
        
        
menu_destroy(I_Menu);
        
        return;
    }
    
    static 
I_TemporalSZ_ClanID[2];
    
    
menu_item_getinfo(I_MenuI_ItemI_TemporalSZ_ClanIDcharsmax(SZ_ClanID), __I_Temporal);
    
    
SM_Clan(I_PlayerSZ_ClanID[0], SHOW_CLAN_INFO);
}

/*==============================================================
            FUNCIONES PUBLICAS
==============================================================*/

public SendTeamInfoChatColor(const I_Player)
{
    if (!
A_PlayerVars[I_Player][PBO_IS_CONNECTED])
        return;
        
    static 
II_TeamInfoID;
    
    if (!
I_TeamInfoID)
        
I_TeamInfoID get_user_msgid("TeamInfo");
    
    for (
CHAT_COLOR_GREY<= CHAT_COLOR_BLUEI++)
    {
        
message_begin(MSG_ONEI_TeamInfoID_I_Player);
        {
            
write_byte(I);
            
write_string(CSZ_CsTeamNamesTable[I-CHAT_COLOR_GREY]);
        }
        
message_end();
    }
}

/*==============================================================
            FUNCIONES PRIVADAS
==============================================================*/

bool:IsValidText(const I_Player 0, const SZ_Text[], const I_ValidateType)
{
    new 
II_CharactersI_Len strlen(SZ_Text);
    new 
SZ_InvalidCharacter[2];
    
    switch (
I_ValidateType)
    {
        case 
VALIDATE_SAY:
        {
            if (!
I_Len)
                return 
false;
            
            for (
0I_LenI++)
            {
                if (!
isspace(SZ_Text[I]))
                    
I_Characters++;
            }
            
            if (
I_Characters 1)
                return 
false;
        }
        
        case 
VALIDATE_CLAN_NAME:
        {
            if (
I_Len MIN_CLAN_NAME_LEN)
            {
                
client_print(I_Playerprint_center"[ERROR]: El nombre del clan debe tener un minimo de %d caracteres!."MIN_CLAN_NAME_LEN);
                
                
UTIL_SendPrint(I_PlayerI_Player"%s !colorERROR!g:!y El !colorNOMBRE!y del !gCLAN!y debe tener un minimo de %d caracteres!g!."CSZ_PrefixMIN_CLAN_NAME_LEN);
                                
                return 
false;
            }
            
            for (
0I_LenI++)
            {
                if (
isalnum(SZ_Text[I]))
                {
                    
I_Characters++;
                    
                    continue;
                }
                else if (
isspace(SZ_Text[I]))
                    continue;
                
                
SZ_InvalidCharacter[0] = SZ_Text[I];
                
                if (
contain(CSZ_AvailableSpecialCharactersSZ_InvalidCharacter[0]) == -1)
                {
                    
client_print(I_Playerprint_center"[ERROR]: El nombre del clan no puede contener caracteres especiales (%s)!."SZ_InvalidCharacter);
                        
                    
UTIL_SendPrint(I_PlayerI_Player"%s !colorERROR!g:!y El !colorNOMBRE!y del !gCLAN!y no puede contener caracteres especiales (!color%s!y)!g!."CSZ_PrefixSZ_InvalidCharacter);
                        
                    return 
false;
                }
                else
                    
I_Characters++;
            }
            
            if (!
I_Characters)
            {
                
client_print(I_Playerprint_center"[ERROR]: El nombre del clan no puede contener solo espacios!.");
                        
                
UTIL_SendPrint(I_PlayerI_Player"%s !colorERROR!g:!y El !colorNOMBRE!y del !gCLAN!y no puede contener solo espacios!g!."CSZ_Prefix);
                    
                return 
false;
            }
            
            if (
TrieKeyExists(A_GlobalVars[GT_CLANES_NAMES], SZ_Text))
            {
                
client_print(I_Playerprint_center"[ERROR]: Ya existe un clan con este nombre!.");
                
                
UTIL_SendPrint(I_PlayerI_Player"%s !colorERROR!g:!y Ya existe un !gCLAN!y con este nombre!g!."CSZ_Prefix);
                
                return 
false;
            }
        }
        
        case 
VALIDATE_CLAN_TAG:
        {
            if (
I_Len MIN_CLAN_TAG_LEN)
            {
                
client_print(I_Playerprint_center"[ERROR]: El TAG del clan debe tener un minimo de %d caracteres!."MIN_CLAN_TAG_LEN);
                
                
UTIL_SendPrint(I_PlayerI_Player"%s !colorERROR!g:!y El !colorTAG!y del !gCLAN!y debe tener un minimo de %d caracteres!g!."CSZ_PrefixMIN_CLAN_TAG_LEN);
                                
                return 
false;
            }
            
            for (
0I_LenI++)
            {
                if (
isalnum(SZ_Text[I]))
                {
                    
I_Characters++;
                    
                    continue;
                }
                else if (
isspace(SZ_Text[I]))
                    continue;
                
                
SZ_InvalidCharacter[0] = SZ_Text[I];
                
                if (
contain(CSZ_AvailableSpecialCharactersSZ_InvalidCharacter[0]) == -1)
                {
                    
client_print(I_Playerprint_center"[ERROR]: El TAG del clan no puede contener caracteres especiales (%s)!."SZ_InvalidCharacter);
                        
                    
UTIL_SendPrint(I_PlayerI_Player"%s !colorERROR!g:!y El !colorTAG!y del !gCLAN!y no puede contener caracteres especiales (!color%s!y)!g!."CSZ_PrefixSZ_InvalidCharacter);
                        
                    return 
false;
                }
                else
                    
I_Characters++;
            }
            
            if (!
I_Characters)
            {
                
client_print(I_Playerprint_center"[ERROR]: El TAG del clan no puede contener solo espacios!.");
                        
                
UTIL_SendPrint(I_PlayerI_Player"%s !colorERROR!g:!y El !colorTAG!y del !gCLAN!y no puede contener solo espacios!g!."CSZ_Prefix);
                    
                return 
false;
            }
            
            if (
TrieKeyExists(A_GlobalVars[GT_CLANES_TAGS], SZ_Text))
            {
                
client_print(I_Playerprint_center"[ERROR]: Ya existe un clan con ese TAG!.");
                
                
UTIL_SendPrint(I_PlayerI_Player"%s !colorERROR!g:!y Ya existe un !gCLAN!y con ese TAG!g!."CSZ_Prefix);
                
                return 
false;
            }
        }
        
        case 
VALIDATE_CLAN_WELCOME_MESSAGE:
        {
            if (
I_Len MIN_CLAN_WELCOME_LEN)
            {
                
client_print(I_Playerprint_center"[ERROR]: El mensaje de bienvenida clan debe tener un minimo de %d caracteres!."MIN_CLAN_WELCOME_LEN);
                
                
UTIL_SendPrint(I_PlayerI_Player"%s !colorERROR!g:!y El !colorMENSAJE DE BIENVENIDA!y del !gCLAN!y debe tener un minimo de %d caracteres!g!."CSZ_PrefixMIN_CLAN_WELCOME_LEN);
                                
                return 
false;
            }
            
            for (
0I_LenI++)
            {
                if (
isalnum(SZ_Text[I]))
                {
                    
I_Characters++;
                    
                    continue;
                }
                else if (
isspace(SZ_Text[I]))
                    continue;
                
                
SZ_InvalidCharacter[0] = SZ_Text[I];
                
                if (
contain(CSZ_AvailableSpecialCharactersSZ_InvalidCharacter[0]) == -1)
                {
                    
client_print(I_Playerprint_center"[ERROR]: El mensaje de bienvenida del clan no puede contener caracteres especiales (%s)!."SZ_InvalidCharacter);
                        
                    
UTIL_SendPrint(I_PlayerI_Player"%s !colorERROR!g:!y El !colorMENSAJE DE BIENVENIDA!y del !gCLAN!y no puede contener caracteres especiales (!color%s!y)!g!."CSZ_PrefixSZ_InvalidCharacter);
                        
                    return 
false;
                }
                else
                    
I_Characters++;
            }
            
            if (!
I_Characters)
            {
                
client_print(I_Playerprint_center"[ERROR]: El TAG del clan no puede contener solo espacios!.");
                        
                
UTIL_SendPrint(I_PlayerI_Player"%s !colorERROR!g:!y El !colorTAG!y del !gCLAN!y no puede contener solo espacios!g!."CSZ_Prefix);
                    
                return 
false;
            }
        }
    }
    
    return 
true;
}

bool:IsAvailableToInvite(const I_InviterID, const I_Player)
{
    if (
I_InviterID == I_Player || !A_PlayerVars[I_Player][PBO_IS_CONNECTED] || M_HaveClan(I_Player))
        return 
false;
    
    return 
true;
}

bool:IsAvailableClanMember(const I_Player, const I_ClanID)
{
    if (!
A_PlayerVars[I_Player][PBO_IS_CONNECTED] || A_PlayerVars[I_Player][PI_CLAN_ID] != I_ClanID)
        return 
false;
    
    return 
true;
}

SendMessageToMembers(const I_Player, const SZ_Message[])
{
    static 
I;
    
    for (
1<= A_GlobalVars[GI_MAX_PLAYERS]; I++)
    {
        if (!
IsAvailableClanMember(IA_PlayerVars[I_Player][PI_CLAN_ID]) || == I_Player)
            continue;
        
        
UTIL_SendPrint(IISZ_Message);
    }
}

GetBestClan(const I_SortByValue, const I_SortType, const bool:BO_StopSort)
{
    static 
I_MaxClanesSZ_ClanName[MAX_CLAN_NAME_LEN], Trie:T_LastClanes;
    
    if (!
T_LastClanes)
        
T_LastClanes TrieCreate();
    
    
I_MaxClanes ArraySize(A_GlobalVars[GDA_CLANES]);
    
    new 
I_ValueToSort = (I_SortByValue == SORT_BY_ACTIVITY_TIME I_CLAN_ACTIVITY_TIME I_CLAN_MEMBERS);
    new 
I_BestClanValue = (I_SortType == SORT_DOWNWARDS 2147483647);
    new 
I_BestClanID = -1;
    
    for (new 
II_MaxClanesI++)
    {
        
GetClanData(I);
                
        if (
TrieKeyExists(T_LastClanesA_ClanData[SZ_CLAN_NAME]))
            continue;
        
        if (
I_SortType == SORT_DOWNWARDS)
        {
            if (
A_ClanData[I_ValueToSort] > I_BestClanValue)
            {
                
I_BestClanID I;
                
I_BestClanValue A_ClanData[I_ValueToSort];
            }
        }
        else
        {
            if (
A_ClanData[I_ValueToSort] < I_BestClanValue)
            {
                
I_BestClanID I;
                
I_BestClanValue A_ClanData[I_ValueToSort];
            }
        }
    }
    
    
GetClanData(I_BestClanID);
    
    
copy(SZ_ClanNamecharsmax(SZ_ClanName), A_ClanData[SZ_CLAN_NAME]);
    
    
TrieSetCell(T_LastClanesSZ_ClanNametrue);
    
    if (
BO_StopSort)
        
TrieClear(T_LastClanes);
    
    return 
I_BestClanID;
}

GetMemberRealID(const SZ_MemberName[])
{
    static 
I;
    
    for (
1<= A_GlobalVars[GI_MAX_PLAYERS]; I++)
    {
        if (!
A_PlayerVars[I][PBO_IS_CONNECTED])
            continue;
        
        if (
equal(SZ_MemberNameA_PlayerVars[I][PSZ_CLIENT_NAME]))
            return 
I;
    }
    
    return 
0;
}

GetClanActivityTime(const I_ClanID, &I_Hours, &I_Minutes, &I_Seconds, const bool:BO_AcvitityNeed false)
{
    new 
I_ActivityTime;
    
    if (
BO_AcvitityNeed)
    {
        
I_ActivityTime GetClanActivityTimeNeed(I_ClanID);
        
        
I_Hours = (I_ActivityTime 3600);
        
I_Minutes = ((I_ActivityTime - (I_Hours 3600)) / 60);
        
I_Seconds = (I_ActivityTime - ((I_Hours 3600) + (I_Minutes 60)));
    }
    else
    {
        
GetClanData(I_ClanID);
        
        
I_ActivityTime A_ClanData[I_CLAN_ACTIVITY_TIME];
        
        
I_Hours = (I_ActivityTime 3600);
        
I_Minutes = ((I_ActivityTime - (I_Hours 3600)) / 60);
        
I_Seconds = (I_ActivityTime - ((I_Hours 3600) + (I_Minutes 60)));
    }
    
    return 
I_ActivityTime;
}

GetTotalClanMembersOfSameStatus(const I_ClanID, const I_StatusToSearch SEARCH_ALL_STATUS, &I_OnLineMembers, &I_OffLineMembersI_MaxClanMembers)
{
    static 
ITrie:T_LastMembers;
    new 
I_TotalMembers;
    
    if (!
T_LastMembers)
        
T_LastMembers TrieCreate();

    for (
1<= A_GlobalVars[GI_MAX_PLAYERS]; I++)
    {
        if (!
IsAvailableClanMember(II_ClanID) || TrieKeyExists(T_LastMembersA_PlayerVars[I][PSZ_CLIENT_NAME]) || (I_StatusToSearch SEARCH_ALL_STATUS && A_PlayerVars[I][PI_CLAN_STATUS] != I_StatusToSearch))
                continue;
            
        
TrieSetCell(T_LastMembersA_PlayerVars[I][PSZ_CLIENT_NAME], true);
            
        
I_TotalMembers++;
        
I_OnLineMembers++;
    }
    
    if (
I_TotalMembers >= I_MaxClanMembers)
    {
        
TrieClear(T_LastMembers);
        
        return 
I_TotalMembers;
    }
    
    new 
I_MemberClanIDI_MemberStatus;
    static 
I_VaultSizeSZ_KeyName[32], SZ_Data[10], SZ_ClanID[4], SZ_Status[2];
        
    
I_VaultSize fvault_size(CSZ_PlayersVault);
        
    for (
0I_VaultSizeI++)
    {
        
fvault_get_keyname(CSZ_PlayersVaultISZ_KeyNamecharsmax(SZ_KeyName));
        
        if (
TrieKeyExists(T_LastMembersSZ_KeyName))
            continue;
        
        
fvault_get_data(CSZ_PlayersVaultSZ_KeyNameSZ_Datacharsmax(SZ_Data));
            
        
parse(SZ_DataSZ_ClanIDcharsmax(SZ_ClanID), SZ_Statuscharsmax(SZ_Status));
            
        
I_MemberClanID str_to_num(SZ_ClanID);
        
I_MemberStatus str_to_num(SZ_Status);
            
        if (
I_MemberClanID != I_ClanID || (I_StatusToSearch SEARCH_ALL_STATUS && I_MemberStatus != I_StatusToSearch))
                continue;
            
        
TrieSetCell(T_LastMembersSZ_KeyNametrue);
            
        
I_TotalMembers++;
        
I_OffLineMembers++;
        
        if (
I_TotalMembers >= I_MaxClanMembers)
        {
            
TrieClear(T_LastMembers);
            
            return 
I_TotalMembers;
        }
    }
    
    
TrieClear(T_LastMembers);
    
    return 
I_TotalMembers;
}

GetClanMembers(const I_ClanID, const I_StatusToSearch SEARCH_ALL_STATUSSZ_MemberName[] = EOS, const I_MemberNameLen 0SZ_MemberStatus[] = EOS, const I_MemberStatusLen 0, &bool:BO_IsOnlinebool:BO_StopSearch)
{
    static 
ITrie:T_LastMembers;
    
    if (!
T_LastMembers)
        
T_LastMembers TrieCreate();
        
    for (
1<= A_GlobalVars[GI_MAX_PLAYERS]; I++)
    {
        if (!
IsAvailableClanMember(II_ClanID) || TrieKeyExists(T_LastMembersA_PlayerVars[I][PSZ_CLIENT_NAME]) || (I_StatusToSearch SEARCH_ALL_STATUS && A_PlayerVars[I][PI_CLAN_STATUS] != I_StatusToSearch))
            continue;
        
        
TrieSetCell(T_LastMembersA_PlayerVars[I][PSZ_CLIENT_NAME], true);
        
        
copy(SZ_MemberNameI_MemberNameLenA_PlayerVars[I][PSZ_CLIENT_NAME]);
        
copy(SZ_MemberStatusI_MemberStatusLenCSZ_ClanMemberStatus[A_PlayerVars[I][PI_CLAN_STATUS]]);
        
        
BO_IsOnline true;
        
        goto 
CheckSearch;
    }
    
    new 
I_MemberClanIDI_MemberStatus;
    static 
I_VaultSizeSZ_KeyName[32], SZ_Data[10], SZ_ClanID[4], SZ_Status[2];
    
    
I_VaultSize fvault_size(CSZ_PlayersVault);
    
    for (
0I_VaultSizeI++)
    {
        
fvault_get_keyname(CSZ_PlayersVaultISZ_KeyNamecharsmax(SZ_KeyName));
        
        if (
TrieKeyExists(T_LastMembersSZ_KeyName))
            continue;
        
        
fvault_get_data(CSZ_PlayersVaultSZ_KeyNameSZ_Datacharsmax(SZ_Data));
        
        
parse(SZ_DataSZ_ClanIDcharsmax(SZ_ClanID), SZ_Statuscharsmax(SZ_Status));
        
        
I_MemberClanID str_to_num(SZ_ClanID);
        
I_MemberStatus str_to_num(SZ_Status);
                
        if (
I_MemberClanID != I_ClanID || (I_StatusToSearch SEARCH_ALL_STATUS && I_MemberStatus != I_StatusToSearch))
            continue;
        
        
TrieSetCell(T_LastMembersSZ_KeyNametrue);
        
        
copy(SZ_MemberNameI_MemberNameLenSZ_KeyName);
        
copy(SZ_MemberStatusI_MemberStatusLenCSZ_ClanMemberStatus[I_MemberStatus]);
        
        
BO_IsOnline false;
        
        break;
    }
    
    
CheckSearch:
    {
        if (
BO_StopSearch)
            
TrieClear(T_LastMembers);
    }
}

GetClanActivityTimeNeed(const I_ClanID)
{
    
GetClanData(I_ClanID);
    
    return (
A_ClanData[I_CLAN_MEMBERS] < M_ActivityTimeNeed(A_ClanData[I_CLAN_MEMBERS]));
}

GetClanData(const I_ClanID)
    
ArrayGetArray(A_GlobalVars[GDA_CLANES], I_ClanIDA_ClanData);
    
ChangeAllClanIDs(const I_ClanID)
{
    new 
I_MemberClanID;
    static 
II_SizeI_MaxClanesSZ_KeyName[32], SZ_Data[10], SZ_ClanID[4], SZ_Status[2];
    
    for (
1<= A_GlobalVars[GI_MAX_PLAYERS]; I++)
    {
        if (!
M_HaveClan(I) || A_PlayerVars[I][PI_CLAN_ID] <= I_ClanID)
            continue;
        
        
A_PlayerVars[I][PI_CLAN_ID]--;
    }
    
    
I_Size fvault_size(CSZ_PlayersVault)
    
    for (
0I_SizeI++)
    {
        
fvault_get_keyname(CSZ_PlayersVaultISZ_KeyNamecharsmax(SZ_KeyName));
        
fvault_get_data(CSZ_PlayersVaultSZ_KeyNameSZ_Datacharsmax(SZ_Data));
        
        
parse(SZ_DataSZ_ClanIDcharsmax(SZ_ClanID), SZ_Statuscharsmax(SZ_Status));
        
        
I_MemberClanID str_to_num(SZ_Data);
        
        if (
I_MemberClanID <= I_ClanID)
            continue;
        
        
formatex(SZ_Datacharsmax(SZ_Data), "%d %s", (I_MemberClanID 1), SZ_Status);
        
        
fvault_set_data(CSZ_PlayersVaultSZ_KeyNameSZ_Data);
    }
    
    
I_MaxClanes ArraySize(A_GlobalVars[GDA_CLANES]);
    
    for (
0I_MaxClanesI++)
    {
        
GetClanData(I);
        
        if (
A_ClanData[I_CLAN_ID] > I_ClanID)
            
A_ClanData[I_CLAN_ID]--;
        
        
UpdateClanData(I);
    }
}
    
DestroyClan(const I_ClanLeader, const I_ClanID)
{
    new 
I_CurrentMembers;
    
    static 
I;
    
    for (
1<= A_GlobalVars[GI_MAX_PLAYERS]; I++)
    {
        if (!
IsAvailableClanMember(II_ClanID) || == I_ClanLeader)
            continue;
        
        
I_CurrentMembers++;
        
        
A_PlayerVars[I][PI_CLAN_STATUS] = A_PlayerVars[I][PI_CURRENT_TIMER] = STATUS_MEMBER;
        
A_PlayerVars[I][PI_CLAN_ID] = -1;
        
        
UTIL_SendPrint(II"%s El !g%s !color%s!y acaba de destruir el !gCLAN!y donde estabas!g!."CSZ_PrefixCSZ_ClanMemberStatus[A_PlayerVars[I_ClanLeader][PI_CLAN_STATUS]], A_PlayerVars[I_ClanLeader][PSZ_CLIENT_NAME]);
    }
    
    if (
I_CurrentMembers A_ClanData[I_CLAN_MEMBERS])
    {
        static 
I_SizeSZ_KeyName[32], SZ_Data[10], SZ_ClanID[4];
        
        
I_Size fvault_size(CSZ_PlayersVault);
        
        for (
0I_SizeI++)
        {
            if (
I_CurrentMembers >= A_ClanData[I_CLAN_MEMBERS])
                break;
            
            
fvault_get_keyname(CSZ_PlayersVaultISZ_KeyNamecharsmax(SZ_KeyName));
            
fvault_get_data(CSZ_PlayersVaultSZ_KeyNameSZ_Datacharsmax(SZ_Data));
            
            
parse(SZ_DataSZ_ClanIDcharsmax(SZ_ClanID));
            
            if (
str_to_num(SZ_ClanID) != I_ClanID)
                continue;
            
            
formatex(SZ_Datacharsmax(SZ_Data), "-1 0");
            
            
fvault_set_data(CSZ_PlayersVaultSZ_KeyNameSZ_Data);
            
            
I_CurrentMembers++;
        }
    }
}
    
UpdateClanData(const I_ClanID, const bool:BO_IsLoadingClanes false)
    
BO_IsLoadingClanes ArrayPushArray(A_GlobalVars[GDA_CLANES], A_ClanData) : ArraySetArray(A_GlobalVars[GDA_CLANES], I_ClanIDA_ClanData);
    
ClanesData(const I_Mode)
{
    new 
I_File;
    
    
get_configsdir(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]));
    
format(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "%s/%s"A_GlobalVars[GSZ_TEXT], CSZ_ClanesVault);
    
    switch (
I_Mode)
    {
        case 
LOAD_CLANES_DATA:
        {
            if (!
file_exists(A_GlobalVars[GSZ_TEXT]))
            {
                
I_File fopen(A_GlobalVars[GSZ_TEXT], "wt");
                
                return;
            }
            
            
I_File fopen(A_GlobalVars[GSZ_TEXT], "rt");
    
            new 
I_ValueSZ_Key[50], SZ_Data[50];
    
            while (!
feof(I_File))
            {
                
fgets(I_FileA_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]));
                
replace(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "^n""");
                
                if (!
A_GlobalVars[GSZ_TEXT][0])
                    continue;
        
                
strtok(A_GlobalVars[GSZ_TEXT], SZ_Keycharsmax(SZ_Key), SZ_Datacharsmax(SZ_Data), '=');
        
                
trim(SZ_Key);
                
trim(SZ_Data);
        
                if (
TrieGetCell(A_GlobalVars[GT_CLANES_VALUES], SZ_KeyI_Value))
                {
                    switch (
I_Value)
                    {
                        case 
I_VALUE_CLAN_IDA_ClanData[I_CLAN_ID] = str_to_num(SZ_Data);
                        
                        case 
I_VALUE_CLAN_MEMBERSA_ClanData[I_CLAN_MEMBERS] = str_to_num(SZ_Data);
                        
                        case 
I_VALUE_CLAN_ACTIVITY_TIMEA_ClanData[I_CLAN_ACTIVITY_TIME] = str_to_num(SZ_Data);
                        
                        case 
I_VALUE_CLAN_NAME:
                        {
                            
copy(A_ClanData[SZ_CLAN_NAME], charsmax(A_ClanData[SZ_CLAN_NAME]), SZ_Data);
                            
                            
TrieSetCell(A_GlobalVars[GT_CLANES_NAMES], A_ClanData[SZ_CLAN_NAME], true);
                        }
                
                        case 
I_VALUE_CLAN_LEADERcopy(A_ClanData[SZ_CLAN_LEADER], charsmax(A_ClanData[SZ_CLAN_LEADER]), SZ_Data);
                        
                        case 
I_VALUE_CLAN_TAG:
                        {
                            
copy(A_ClanData[SZ_CLAN_TAG], charsmax(A_ClanData[SZ_CLAN_TAG]), SZ_Data);
                            
                            
TrieSetCell(A_GlobalVars[GT_CLANES_TAGS], SZ_Datatrue);
                        }
                        
                        case 
I_VALUE_CLAN_WELCOME_MESSAGEcopy(A_ClanData[SZ_CLAN_WELCOME_MESSAGE], charsmax(A_ClanData[SZ_CLAN_WELCOME_MESSAGE]), SZ_Data);
                    }
                }
        
                if (
I_Value >= charsmax(CSZ_ClanesValuesNames))
                    
UpdateClanData(A_ClanData[I_CLAN_ID], true);
            }
    
            
fclose(I_File);
        }
        
        case 
SAVE_CLANES_DATA:
        {
            if (
file_exists(A_GlobalVars[GSZ_TEXT]))
                
delete_file(A_GlobalVars[GSZ_TEXT]);
            
            
I_File fopen(A_GlobalVars[GSZ_TEXT], "wt");
            
            for (new 
IArraySize(A_GlobalVars[GDA_CLANES]); I++)
            {
                
GetClanData(I);
                
                
formatex(A_GlobalVars[GSZ_TEXT], charsmax(A_GlobalVars[GSZ_TEXT]), "ID = %d^nMEMBERS = %d^nACTIVITY TIME = %d^nNAME = %s^nLEADER = %s^nTAG = %s^nWELCOME MESSAGE = %s^n^n",
                
A_ClanData[I_CLAN_ID], A_ClanData[I_CLAN_MEMBERS], A_ClanData[I_CLAN_ACTIVITY_TIME], A_ClanData[SZ_CLAN_NAME], A_ClanData[SZ_CLAN_LEADER], A_ClanData[SZ_CLAN_TAG],
                
A_ClanData[SZ_CLAN_WELCOME_MESSAGE]);
                
                
fputs(I_FileA_GlobalVars[GSZ_TEXT]);
            }
    
            
fclose(I_File);
        }
            
    }
}

PlayersData(const I_Player, const I_Mode)
{
    if (!
A_PlayerVars[I_Player][PBO_IS_CONNECTED] || A_PlayerVars[I_Player][PBO_IS_BOT] || I_Mode == SAVE_PLAYERS_DATA && !M_HaveClan(I_Player))
        return;
    
    static 
SZ_Data[10];
    
    switch (
I_Mode)
    {
        case 
LOAD_PLAYERS_DATA:
        {
            if (
fvault_get_data(CSZ_PlayersVaultA_PlayerVars[I_Player][PSZ_CLIENT_NAME], SZ_Datacharsmax(SZ_Data)))
            {
                static 
SZ_ClanID[4], SZ_Status[2];
                
                
parse(SZ_DataSZ_ClanIDcharsmax(SZ_ClanID), SZ_Statuscharsmax(SZ_Status));
                
                
A_PlayerVars[I_Player][PI_CLAN_ID] = str_to_num(SZ_ClanID);
                
A_PlayerVars[I_Player][PI_CLAN_STATUS] = str_to_num(SZ_Status);
            }
        }
        
        case 
SAVE_PLAYERS_DATA:
        {
            
formatex(SZ_Datacharsmax(SZ_Data), "%d %d"A_PlayerVars[I_Player][PI_CLAN_ID], A_PlayerVars[I_Player][PI_CLAN_STATUS]);
            
            
fvault_set_data(CSZ_PlayersVaultA_PlayerVars[I_Player][PSZ_CLIENT_NAME], SZ_Data);
            
            if (!
M_HaveClan(I_Player))
                return;
            
            
GetClanData(A_PlayerVars[I_Player][PI_CLAN_ID]);
            
            
A_ClanData[I_CLAN_ACTIVITY_TIME] += A_PlayerVars[I_Player][PI_CURRENT_TIMER];
            
            
UpdateClanData(A_PlayerVars[I_Player][PI_CLAN_ID]);
        }
    }
}

/*========================================
        (UTILIDADES)
========================================*/

UTIL_SendPrint(const I_Player 0, const I_ColorChat, const SZ_Text[], any:...)
{
    static 
I_SayTextIDSZ_Message[190];
    
    if (!
I_SayTextID)
        
I_SayTextID get_user_msgid("SayText");
    
    
vformat(SZ_Messagecharsmax(SZ_Message), SZ_Text4);
    
    
replace_all(SZ_Messagecharsmax(SZ_Message), "!y""^1");
    
replace_all(SZ_Messagecharsmax(SZ_Message), "!color""^3");
    
replace_all(SZ_Messagecharsmax(SZ_Message), "!g""^4");
    
    
message_begin((I_Player MSG_ONE MSG_BROADCAST), I_SayTextID_I_Player);
    {
        
write_byte(I_ColorChat);
        
write_string(SZ_Message);
    }
    
message_end();
}

UTIL_SendCMDWithHUD(const I_Player, const SZ_CMD[], const SZ_Text[], A_Color[3] = { 255255255 }, const Float:F_XPosition = -1.0, const Float:F_YPosition 0.65, const Float:F_HoldTime)
{
    if (!
A_PlayerVars[I_Player][PBO_IS_CONNECTED])
            return;
        
    for (new 
Isizeof (A_Color); I++)
    {
        if (
A_Color[I] > 255)
            
A_Color[I] = 255;
    }
    
    
client_cmd(I_Player"%s"SZ_CMD);
    
    
set_dhudmessage(A_Color[0], A_Color[1], A_Color[2], F_XPositionF_YPosition00.0F_HoldTime0.10.1);
    
show_dhudmessage(I_PlayerSZ_Text);


Please help me to translate this, i don't speak Spanish

Przeczytaj cały wpis

Odnośnik do komentarza
Udostępnij na innych stronach

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
 Udostępnij

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...