Raised This Month: $51 Target: $400
 12% 

Gang Prefix Chat Color


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
alferd
Veteran Member
Join Date: Dec 2019
Location: Iran is Always Eternal
Old 05-21-2020 , 01:02   Gang Prefix Chat Color
Reply With Quote #1

Can anyone add Chat prefix to this plugin?

(Colored)
say:
Code:
(Owner\Leader\Member) (Gang Name) PlayerName : Message
say_team:
Code:
[TeamName] (Owner\Leader\Member) (Gang Name) PlayerName : Message
PHP Code:
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <nvault>
#include <hamsandwich>
#include <jailbreak_core>
#include <cs_player_models_api>
#include <fakemeta>

#define PLUGIN "[JB] Gang System"
#define VERSION "1.0"
#define AUTHOR "Natsheh"

#define set_flag(%1,%2)        (%1 |= (1<<(31&%2)))
#define remove_flag(%1,%2)    (%1 &= ~(1<<(31&%2)))
#define check_flag(%1,%2)    (%1 & (1<<(31&%2)))

#define MENU_KEYS    (MENU_KEY_0|MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_5|MENU_KEY_7|MENU_KEY_8)

#define SHOW_TOP_GANGS    10

#define NO_ACCESS    (1<<26)

#if !defined EOS
#define EOS 0
#endif

new const gang_file[] = "jailbreak_gangs.ini";
new const 
gang_skins_file[] = "jailbreak_gang_skins.ini";

enum (+=1)
{
    
NOT_INGANG 0,
    
GANG_MEMBER,
    
GANG_LEADER,
    
GANG_OWNER
}

new const 
USER_STATUS[][] = {
    
"",
    
"Member",
    
"Leader",
    
"Owner"
}

enum GANG_ACCESS(+=1)
{
    
INFO_ACTION[24] = 0,
    
INFO_ACCESS,
    
INFO_POSITION
}

new const 
leadermenu_items[][GANG_ACCESS] = {
    { 
"Add a leader!",    (1<<GANG_OWNER),    GANG_MEMBER },
    { 
"Remove a leader!",    (1<<GANG_OWNER),    GANG_LEADER },
    { 
"Kick a member!",    (1<<GANG_OWNER)|(1<<GANG_LEADER), GANG_MEMBER }
}

enum (+=1)
{
    
KEY_SKIN_MDL 0,
    
KEY_SKIN_ACCESS
}

new const 
szKEYS[][] = {
    
"SKIN",
    
"ACCESS"
}

enum USER_GANG_INFO(+=1)
{
    
USER_GANG_NAME[32] = 0,
    
USER_GANG_SKIN[32],
    
USER_GANG_STATUS,
    
USER_GANG_ID
}

enum _:GANGS_INFO(+=1)
{
    
GANG_NAME[32] = 0,
    
GANG_SKIN[32],
    
GANG_KILLS,
    Array:
GANG_ARRAY_MEMBERS,
    
Trie:GANG_TRIE_MSTATUS,
    
Trie:GANG_TRIE_NAMES
}

enum _:GANG_SKINS_INFO(+=1)
{
    
GANG_SKIN_NAME[32] = 0,
    
GANG_SKIN_MDL[32],
    
GANG_SKIN_ACCESS
}

new 
mm_itemid_gang;

new 
user_find_members[33][32], g_user_rejected_req[33], g_user_rejected_inv[33], g_userpage[33];
new 
g_user_ingang_creationg_user_cant_create_agangg_user_alive;

new 
gang_name_edition[33][32], user_gang_data[33][USER_GANG_INFO];

new Array:
garray_gangs, Array:garray_gang_skinsTrie:gtrie_gang_skin_mdlsTrie:gtrie_gang_maxslots;

new 
g_cvar_gang_costg_cvar_gang_skin_costg_msgStatusTextg_cvar_show_gang_infocvar_maxmembers_slots;

new 
GANGS_FILE[64], GANG_SKINS_FILE[64];

public 
plugin_end()
{
    
ArrayDestroy(garray_gangs);
    
ArrayDestroy(garray_gang_skins);
    
TrieDestroy(gtrie_gang_skin_mdls);
    
TrieDestroy(gtrie_gang_maxslots);
}

public 
plugin_precache()
{
    
garray_gangs ArrayCreate(681);
    
garray_gang_skins ArrayCreate(651);
    
gtrie_gang_skin_mdls TrieCreate();
    
gtrie_gang_maxslots TrieCreate();
    
    new 
sFile[64];
    
get_configsdir(sFilecharsmax(sFile))
    
formatex(GANG_SKINS_FILEcharsmax(GANG_SKINS_FILE), "%s/%s"sFilegang_skins_file)
    
    if(!
file_exists(GANG_SKINS_FILE))
    {
        
write_file(GANG_SKINS_FILE"; [Very Important Prisoner]");
        
write_file(GANG_SKINS_FILE"; SKIN = ^"viprisoner^"");
        
write_file(GANG_SKINS_FILE"; SKIN_ACCESS = ^"abcdefghijklmnopqrstu^"^n");
    }
    
    new 
fp fopen(GANG_SKINS_FILE"rt");
    
    if(
fp)
    {
        new 
xArray[GANG_SKINS_INFO], sBuffer[256], iItemIndex = -1szKey[14], iKey;
        
        while(!
feof(fp))
        {
            
fgets(fpsBuffercharsmax(sBuffer));
            
trim(sBuffer);
            
            if(
sBuffer[0] == EOS || sBuffer[0] == ';' || strlen(sBuffer) <= || (sBuffer[0] == '/' && sBuffer[1] == '/'))
                continue;
            
            if(
sBuffer[0] == '[')
            {
                
iKey 0;
                
copyc(xArray[GANG_SKIN_NAME], charsmax(xArray[GANG_SKIN_NAME]), sBuffer[1], ']');
                
iItemIndex ArraySize(garray_gang_skins);
                
ArrayPushArray(garray_gang_skinsxArray);
                continue;
            }
            
            if(
xArray[GANG_SKIN_NAME][0] != EOS && iItemIndex > -1)
            {
                
strtok(sBufferszKeycharsmax(szKey), sBuffercharsmax(sBuffer), '=');
                
trim(szKey);
                
trim(sBuffer);
                
remove_quotes(szKey);
                
remove_quotes(sBuffer);
                
                if(
equali(szKEYS[KEY_SKIN_MDL], szKeystrlen(szKey)) && !(iKey & (1<<KEY_SKIN_MDL)))
                {
                    
iKey |= (1<<KEY_SKIN_MDL);
                    
TrieSetString(gtrie_gang_skin_mdlsxArray[GANG_SKIN_NAME], sBuffer);
                    
formatex(xArray[GANG_SKIN_MDL], charsmax(xArray[GANG_SKIN_MDL]), sBuffer);
                    
ArraySetArray(garray_gang_skinsiItemIndexxArray);
                    
                    
formatex(sBuffercharsmax(sBuffer), "models/player/%s/%s.mdl"xArray[GANG_SKIN_MDL], xArray[GANG_SKIN_MDL]);
                    
precache_model(sBuffer);
                    
formatex(sBuffercharsmax(sBuffer), "models/player/%s/%sT.mdl"xArray[GANG_SKIN_MDL], xArray[GANG_SKIN_MDL]);
                    if(
file_exists(sBuffer)) precache_model(sBuffer);
                    continue;
                }
                if(
equali(szKEYS[KEY_SKIN_ACCESS], szKeystrlen(szKey)) && !(iKey & (1<<KEY_SKIN_ACCESS)))
                {
                    
iKey |= (1<<KEY_SKIN_ACCESS);
                    
xArray[GANG_SKIN_ACCESS] = read_flags(sBuffer);
                    
ArraySetArray(garray_gang_skinsiItemIndexxArray);
                }
            }
        }
        
fclose(fp);
    }
    
    
get_configsdir(sFilecharsmax(sFile))
    
formatex(GANGS_FILEcharsmax(GANGS_FILE), "%s/%s"sFilegang_file)
    
    if(!
file_exists(GANGS_FILE))
    {
        
write_file(GANGS_FILE"; [Gang name] ^"Gang Skin^"");
        
write_file(GANGS_FILE"; ^"Member Steamid^" ^"Member ingang status^" ^"Member nickname^"^n");
    }
    
    
fp fopen(GANGS_FILE"rt");
    
    if(
fp)
    {
        new 
xArray[GANGS_INFO], sBuffer[256], szAuthid[32], szGangStatus[8], szName[32];
        
        while(!
feof(fp))
        {
            
fgets(fpsBuffercharsmax(sBuffer));
            
trim(sBuffer);
            
            if(
sBuffer[0] == EOS || sBuffer[0] == ';' || strlen(sBuffer) <= || (sBuffer[0] == '/' && sBuffer[1] == '/'))
                continue;
            
            if(
sBuffer[0] == '[')
            {
                
copyc(xArray[GANG_NAME], charsmax(xArray[GANG_NAME]), sBuffer[1], ']');
                
                
strtok(sBuffer""0sBuffercharsmax(sBuffer), ']');
                
parse(sBufferszNamecharsmax(szName), sBuffercharsmax(sBuffer));
                
remove_quotes(szName);
                
remove_quotes(sBuffer);
                
                
xArray[GANG_KILLS] = str_to_num(sBuffer);
                
copy(xArray[GANG_SKIN], charsmax(xArray[GANG_SKIN]), szName);
                
                
xArray[GANG_ARRAY_MEMBERS] = _:ArrayCreate(32,1);
                
xArray[GANG_TRIE_MSTATUS] = _:TrieCreate();
                
xArray[GANG_TRIE_NAMES] = _:TrieCreate();
                
                
ArrayPushArray(garray_gangsxArray);
                continue;
            }
            
            if(
xArray[GANG_NAME][0] != EOS)
            {
                if(
parse(sBufferszAuthidcharsmax(szAuthid), szGangStatuscharsmax(szGangStatus), szNamecharsmax(szName)) == 3)
                {
                    
ArrayPushString(xArray[GANG_ARRAY_MEMBERS], szAuthid);
                    
TrieSetString(xArray[GANG_TRIE_MSTATUS], szAuthidszGangStatus)
                    
TrieSetString(xArray[GANG_TRIE_NAMES], szAuthidszName)
                }
            }
        }
        
fclose(fp);
    }
}

public 
plugin_init()
{
    
register_plugin(PLUGINVERSIONAUTHOR)
    
    
g_cvar_gang_cost register_cvar("jb_gang_creating_cost""100000");
    
g_cvar_gang_skin_cost register_cvar("jb_gang_skin_cost""20000");
    
g_cvar_show_gang_info register_cvar("jb_gang_show_info_len""0");
    
    
mm_itemid_gang register_jailbreak_mmitem("Gang Menu"_TEAM_PRISONERS)
    
    
register_event("StatusValue""fw_statusvalue""be""1=2");
    
    
register_menucmd(register_menuid("GANG_MAIN_MENU"), MENU_KEYS"gang_mainmenu_handler")
    
    
register_clcmd("enter_gang_name""clcmd_enter_gang_name")
    
register_clcmd("search_for""clcmd_search_for")
    
    
RegisterHam(Ham_Spawn"player""fw_player_respawn_post"1)
    
RegisterHam(Ham_Killed"player""fw_player_killed_post"1)
    
    
register_clcmd("amx_gangsmenu""clcmd_gangsmenu"ADMIN_ALL|ADMIN_IMMUNITY"show all gangs")
    
    
cvar_maxmembers_slots register_cvar("jb_gang_max_memberslots""5");
    
    
g_msgStatusText get_user_msgid("StatusText");
}

public 
plugin_cfg()
{
    new 
maxslots get_pcvar_num(cvar_maxmembers_slots);
    
    for(new 
imaxloop ArraySize(garray_gangs), xArray[GANGS_INFO]; maxloopi++)
    {
        
ArrayGetArray(garray_gangsixArray);
        
TrieSetCell(gtrie_gang_maxslotsxArray[GANG_NAME], maxslots);
    }
}

public 
fw_statusvalue(id)
{
    new 
target read_data(2);
    
    if(!
target && read_data(1) > 0)
    {
        
show_gang_info(ididget_pcvar_num(g_cvar_show_gang_info))
        return;
    }
    
    if(!
check_flag(g_user_alive,id) ||
          !
check_flag(g_user_alive,target) ||
             
user_gang_data[target][USER_GANG_STATUS] == NOT_INGANG)
         return;
    
    if(
get_user_team(target) == TEAM_PRISONERS && get_user_team(id) == TEAM_PRISONERS)
    {
        
show_gang_info(idtargetget_pcvar_num(g_cvar_show_gang_info))
    }
}

public 
clcmd_gangsmenu(idlevelcid)
{
    if(!
cmd_access(idlevelcid1))
        return 
PLUGIN_HANDLED;
    
    new 
total_gangs;
    if(!(
total_gangs=ArraySize(garray_gangs)))
    {
        
console_print(id"No gangs were found!")
        return 
PLUGIN_HANDLED;
    }
    
    new 
menu menu_create("\rADMIN GANGS PANEL\y!""gangsmenu_handler")
    
    for(new 
iszGangID[10], xArray[GANGS_INFO]; total_gangsi++)
    {
        
ArrayGetArray(garray_gangsixArray);
        
num_to_str(iszGangIDcharsmax(szGangID));
        
menu_additem(menuxArray[GANG_NAME], szGangID);
    }
    
    
menu_display(idmenu)
    return 
PLUGIN_HANDLED;
}

public 
gangsmenu_handler(idmenuitem)
{
    if(
item == MENU_EXIT)
    {
        
menu_destroy(menu)
        return 
PLUGIN_HANDLED;
    }
    
    new 
paccesscallbacksData[10];
    
menu_item_getinfo(menuitempaccesssDatacharsmax(sData), ""0callback)
    
menu_destroy(menu);
    
    
apanel_gang_info(idstr_to_num(sData));
    return 
PLUGIN_HANDLED;
}

apanel_gang_info(idgangid)
{
    new 
sText[196], xArray[GANGS_INFO], szOwner[32];
    
ArrayGetArray(garray_gangsgangidxArray);
    
    
formatex(gang_name_edition[id], charsmax(gang_name_edition[]), xArray[GANG_NAME])
    
    
// seeking for the gang owner name...
    
for(new iszStatus[8], maxloop ArraySize(xArray[GANG_ARRAY_MEMBERS]); maxloopi++)
    {
        
ArrayGetString(xArray[GANG_ARRAY_MEMBERS], iszOwnercharsmax(szOwner))
        
TrieGetString(xArray[GANG_TRIE_MSTATUS], szOwnerszStatuscharsmax(szStatus))
        if(
equali(USER_STATUS[GANG_OWNER], szStatus))
        {
            break;
        }
    }
    
    new 
iOwner// getting the owner name;
    
if((iOwner find_player("c"szOwner)) > 0)
    {
        
get_user_name(iOwnerszOwnercharsmax(szOwner));
    }
    else
    {
        
TrieGetString(xArray[GANG_TRIE_NAMES], szOwnerszOwnercharsmax(szOwner))
    }
    
    
formatex(sTextcharsmax(sText), "\
    \y-=[\rGANG INFORMATION\y]=-\
    ^n\rGANG-NAME: \y%s^n\
    \rGANG-SKIN: \y%s^n\
    \rGANG-OWNER: \y%s^n\
    \rGANG-MEMBERS: \y%d\
    \rGANG-KILLS: \y%d"
,
    
xArray[GANG_NAME], xArray[GANG_SKIN], szOwnerArraySize(xArray[GANG_ARRAY_MEMBERS]), xArray[GANG_KILLS])
    new 
menu menu_create(sText"apanel_handler")
    
    new 
szGangID[10]; num_to_str(gangidszGangIDcharsmax(szGangID));
    
menu_additem(menu"Delete the Gang!"szGangID)
    
menu_additem(menu"Reset Gang Kills!"szGangID)
    
    
menu_display(idmenu)
}

public 
apanel_handler(idmenuitem)
{
    if(
item == MENU_EXIT)
    {
        
menu_destroy(menu);
        return 
PLUGIN_HANDLED;
    }
    
    new 
sData[10], paccesscallback;
    
    if(
menu > -1000)
    {
        
menu_item_getinfo(menuitempaccesssDatacharsmax(sData), ""0callback);
        
menu_destroy(menu);
    }
    else
    {
        
num_to_str(-(menu 1000), sDatacharsmax(sData))
    }
    
    new 
iGangID str_to_num(sData), xArray[GANGS_INFO];
    
    if((
<= iGangID ArraySize(garray_gangs)))
    {
        
ArrayGetArray(garray_gangsiGangIDxArray);
    }
    
    if(!
equal(gang_name_edition[id], xArray[GANG_NAME]) && menu > -1000)
    {
        
cprint_chat(id_"The !g%s !ygang is not !texisted!g!"gang_name_edition[id])
        return 
PLUGIN_HANDLED;
    }
    
    new 
szAdminName[32];
    
get_user_name(idszAdminNamecharsmax(szAdminName))
    
    new 
sBuffer[256], szGangname[32];
    
    new 
fp fopen(GANGS_FILE"rt"), sFile2[128];
    
    
formatex(sFile2charsmax(sFile2), "%s2"GANGS_FILE)
    new 
fp2 fopen(sFile2"wt");
    
    if(!
fp2 || !fp)
    {
        
log_error(AMX_ERR_GENERAL"failed to create a file '%s'"sFile2)
        return 
PLUGIN_HANDLED;
    }
    
    switch( 
item )
    {
        case 
0:
        {
            new 
bool:bRemoval=false;
            
            
fseek(fp0SEEK_SET);
            while(!
feof(fp))
            {
                
fgets(fpsBuffercharsmax(sBuffer));
                
trim(sBuffer);
                
                if(
sBuffer[0] == EOS || sBuffer[0] == ';' || strlen(sBuffer) <= || (sBuffer[0] == '/' && sBuffer[1] == '/'))
                {
                    
fputs(fp2sBuffer);
                    
fputc(fp2'^n');
                    continue;
                }
                
                if(
sBuffer[0] == '[')
                {
                    
bRemoval false;
                    
                    
copyc(szGangnamecharsmax(szGangname), sBuffer[1], ']');
                    if(
equal(szGangnamexArray[GANG_NAME]))
                    {
                        
bRemoval true;
                    }
                }
                
                if(
bRemoval)
                {
                    
format(sBuffercharsmax(sBuffer), "; %s"sBuffer);
                    
fputs(fp2sBuffer);
                    
fputc(fp2'^n');
                    continue;
                }
                
                
fputs(fp2sBuffer);
                
fputc(fp2'^n');
            }
            
fclose(fp);
            
fclose(fp2);
            
            
delete_file(GANGS_FILE);
            
            if(!
rename_file(sFile2GANGS_FILE1))
            {
                
delete_file(sFile2);
            }
            
            
            
ArrayDeleteItem(garray_gangsiGangID);
            
ArrayDestroy(xArray[GANG_ARRAY_MEMBERS]);
            
TrieDestroy(xArray[GANG_TRIE_MSTATUS]);
            
TrieDestroy(xArray[GANG_TRIE_NAMES]);
            
            new 
players[32],pnum;
            
get_players(playerspnum"ch")
            
            for(new 
iplayerpnumi++)
            {
                
player players[i];
                
                if(
equal(xArray[GANG_NAME], user_gang_data[player][USER_GANG_NAME]))
                {
                    
user_gang_data[player][USER_GANG_STATUS] = NOT_INGANG;
                    
user_gang_data[player][USER_GANG_ID] = -1;
                    
user_gang_data[player][USER_GANG_NAME][0] = EOS;
                    
user_gang_data[player][USER_GANG_SKIN][0] = EOS;
                }
            }
            
            if(
menu > -1000)
            {
                
cprint_chat(0_"!gAdmin !t%s !yhas deleted the !g%s !tGang!y."szAdminNamexArray[GANG_NAME]);
                
formatex(sBuffercharsmax(sBuffer), "ADMIN %s HAS DELETED THE %s GANG"szAdminNamexArray[GANG_NAME])
            }
            else
            {
                
cprint_chat(0_"!g%s !tGang !yhas been !gdestroyed!"xArray[GANG_NAME])
                
formatex(sBuffercharsmax(sBuffer), "OWNER %s HAS LEFT THE %s GANG AND THEREFORE ITS BEEN REMOVED!"szAdminNamexArray[GANG_NAME])
            }
            
            
log_amx(sBuffer);
            
jb_logmessage(sBuffer);
        }
        default:
        {
            
fseek(fp0SEEK_SET);
            while(!
feof(fp))
            {
                
fgets(fpsBuffercharsmax(sBuffer));
                
trim(sBuffer);
                
                if(
sBuffer[0] == EOS || sBuffer[0] == ';' || strlen(sBuffer) <= || (sBuffer[0] == '/' && sBuffer[1] == '/'))
                {
                    
fputs(fp2sBuffer);
                    
fputc(fp2'^n');
                    continue;
                }
                
                if(
sBuffer[0] == '[')
                {
                    
copyc(szGangnamecharsmax(szGangname), sBuffer[1], ']')
                    if(
equal(szGangnamexArray[GANG_NAME]))
                    {
                        
formatex(sBuffercharsmax(sBuffer), "[%s] ^"%s^" ^"0^""xArray[GANG_NAME], xArray[GANG_SKIN])
                        
xArray[GANG_KILLS] = 0;
                        
                        
cprint_chat(0_"!gAdmin !t%s !yhas reset the !g%s !tGang kills!y."szAdminNamexArray[GANG_NAME])
                        
                        
formatex(sBuffercharsmax(sBuffer), "ADMIN %s HAS RESET THE %s GANG KILLS"szAdminNamexArray[GANG_NAME])
                        
log_amx(sBuffer);
                        
jb_logmessage(sBuffer);
                    }
                }
                
                
fputs(fp2sBuffer);
                
fputc(fp2'^n');
            }
            
fclose(fp);
            
fclose(fp2);
            
            
delete_file(GANGS_FILE);
            
            if(!
rename_file(sFile2GANGS_FILE1))
            {
                
delete_file(sFile2);
            }
                
            
ArraySetArray(garray_gangsiGangIDxArray);
        }
    }
    return 
PLUGIN_HANDLED;
}

public 
fw_player_killed_post(victimattackershouldgib)
{
    
// attacker is connected and its not a suicide and the victim is not from the gang...
    
if(!is_user_connected(attacker) || victim == attacker) return;
    
    static 
killer_gangkiller_gang user_gang_data[attacker][USER_GANG_ID];
    if(
killer_gang != user_gang_data[victim][USER_GANG_ID] &&
          
user_gang_data[attacker][USER_GANG_STATUS] != NOT_INGANG)
    {
        static 
xArray[GANGS_INFO];
        
ArrayGetArray(garray_gangskiller_gangxArray);
        
xArray[GANG_KILLS] ++;
        
ArraySetArray(garray_gangskiller_gangxArray);
        
        static 
fpfp2sFile2[128];
        
fp fopen(GANGS_FILE"rt");
        
        
formatex(sFile2charsmax(sFile2), "%s2"GANGS_FILE)
        
fp2 fopen(sFile2"wt");
        
        if(!
fp2 || !fp)
        {
            
log_error(AMX_ERR_GENERAL"failed to create a file '%s'"sFile2)
            return;
        }
        
        static 
sBuffer[196], szGangname[32];
        
        
fseek(fp0SEEK_SET);
        while(!
feof(fp))
        {
            
fgets(fpsBuffercharsmax(sBuffer));
            
trim(sBuffer);
            
            if(
sBuffer[0] == EOS || sBuffer[0] == ';' || strlen(sBuffer) <= || (sBuffer[0] == '/' && sBuffer[1] == '/'))
            {
                
fprintf(fp2"%s^n"sBuffer);
                continue;
            }
            
            if(
sBuffer[0] == '[')
            {
                
copyc(szGangnamecharsmax(szGangname), sBuffer[1], ']')
                if(
equal(szGangnamexArray[GANG_NAME]))
                {
                    
formatex(sBuffercharsmax(sBuffer), "[%s] ^"%s^" ^"%d^""xArray[GANG_NAME], xArray[GANG_SKIN], xArray[GANG_KILLS])
                }
            }
            
            
fputs(fp2sBuffer);
            
fputc(fp2'^n');
        }
        
fclose(fp);
        
fclose(fp2);
        
        
delete_file(GANGS_FILE);
        
        if(!
rename_file(sFile2GANGS_FILE1)) delete_file(sFile2);
    }
}

public 
fw_player_respawn_post(id)
{
    if(!
is_user_alive(id)) return;
    
    
set_flag(g_user_alive,id);
    
    if(
user_gang_data[id][USER_GANG_STATUS] == NOT_INGANG || get_user_team(id) != TEAM_PRISONERS)
    {
        return;
    }
    
    new 
sString[32], szModel[32];
    
copy(sStringcharsmax(sString), user_gang_data[id][USER_GANG_SKIN]);
    if(!
equali(sString"None") && sString[0] != EOS)
    {
        
TrieGetString(gtrie_gang_skin_mdlssStringszModelcharsmax(szModel));
        
cs_set_player_model(idszModel)
    }
}

public 
plugin_natives()
{
    
register_native("jb_get_user_gang_status""_get_user_gang_status");
    
register_native("jb_get_user_gang_name""_get_user_gang_name");
    
register_native("jb_get_user_gang_kills""_get_user_gang_kills");
    
register_native("jb_set_user_gang""_set_user_gang");
    
register_native("jb_remove_user_fromgang""_remove_user_fromgang");
    
register_native("jb_set_gang_maxslots""_set_gang_maxslots")
    
register_native("jb_get_gang_maxslots""_get_gang_maxslots")
}

public 
_set_gang_maxslots(pluginarg)
{
    new 
xArray[GANGS_INFO];
    
ArrayGetArray(garray_gangsget_param(1), xArray);
    
TrieSetCell(gtrie_gang_maxslotsxArray[GANG_NAME], get_param(2));
}

public 
_get_gang_maxslots(pluginarg)
{
    new 
xArray[GANGS_INFO], iValue;
    
ArrayGetArray(garray_gangsget_param(1), xArray);
    
TrieGetCell(gtrie_gang_maxslotsxArray[GANG_NAME], iValue);
    return 
iValue
}

public 
_get_user_gang_kills(pluginarg)
{
    new 
xArray[GANGS_INFO];
    
ArrayGetArray(garray_gangsuser_gang_data[get_param(1)][USER_GANG_ID], xArray);
    return 
xArray[GANG_KILLS];
}

public 
_get_user_gang_status(pluginarg) return user_gang_data[get_param(1)][USER_GANG_STATUS];

public 
_get_user_gang_name(pluginargset_string(2user_gang_data[get_param(1)][USER_GANG_NAME], get_param(3));

public 
_set_user_gang(pluginarg)
{
    new 
szAuthid[32];
    
get_string(1szAuthidcharsmax(szAuthid));
    
set_user_gang(szAuthidget_param(2), get_param(3));
}

public 
_remove_user_fromgang(pluginargc)
{
    new 
szAuthid[32];
    
get_string(1szAuthidcharsmax(szAuthid));
    
remove_user_fromgang(szAuthidget_param(2));
}

public 
client_authorized(id)
{
    
load_user_gang(id)
    
    
g_user_rejected_inv[id] = 0;
    
g_user_rejected_req[id] = 0;
}

public 
client_disconnect(id)
{
    
remove_flag(g_user_alive,id);
}

load_user_gang(id)
{
    
user_gang_data[id][USER_GANG_STATUS] = NOT_INGANG;
    
user_gang_data[id][USER_GANG_ID] = -1;
    
user_gang_data[id][USER_GANG_NAME][0] = EOS;
    
user_gang_data[id][USER_GANG_SKIN][0] = EOS;
    
    new 
xArray[GANGS_INFO], szAuthid[32];
    
get_user_authid(idszAuthidcharsmax(szAuthid))
    for(new 
imaxloop ArraySize(garray_gangs); maxloopi++)
    {
        
ArrayGetArray(garray_gangsixArray)
        if(
TrieKeyExists(xArray[GANG_TRIE_MSTATUS], szAuthid))
        {
            new 
szStatus[10];
            
TrieGetString(xArray[GANG_TRIE_MSTATUS], szAuthidszStatuscharsmax(szStatus))
            
user_gang_data[id][USER_GANG_ID] = i;
            
copy(user_gang_data[id][USER_GANG_NAME], charsmax(user_gang_data[][USER_GANG_NAME]), xArray[GANG_NAME])
            
copy(user_gang_data[id][USER_GANG_SKIN], charsmax(user_gang_data[][USER_GANG_SKIN]), xArray[GANG_SKIN])
            
            switch( 
szStatus[0] )
            {
                case 
'm','M'user_gang_data[id][USER_GANG_STATUS] = GANG_MEMBER;
                case 
'o','O'user_gang_data[id][USER_GANG_STATUS] = GANG_OWNER;
                case 
'l','L'user_gang_data[id][USER_GANG_STATUS] = GANG_LEADER;
            }
            
            break;
        }
    }
}

set_user_gang(const szAuthid[], gangstatus)
{
    
    new 
xArray[GANGS_INFO], szName[32];
    
ArrayGetArray(garray_gangsgangxArray);
    
    if(
TrieKeyExists(xArray[GANG_TRIE_NAMES],szAuthid))
    {
        
TrieGetString(xArray[GANG_TRIE_NAMES], szAuthidszNamecharsmax(szName))
    }
    
    new 
id find_player("c"szAuthid);
    if(
id 0get_user_name(idszNamecharsmax(szName));
    
    
remove_user_fromgang(szAuthidgang);
    
    new 
fp fopen(GANGS_FILE"rt"), sFile2[128];
    
    
formatex(sFile2charsmax(sFile2), "%s2"GANGS_FILE)
    new 
fp2 fopen(sFile2"wt");
    
    if(!
fp || !fp2)
    {
        
fclose(fp);
        
fclose(fp2);
        return;
    }
    new 
szGangname[32], sBuffer[256];
    
    while(!
feof(fp))
    {
        
fgets(fpsBuffercharsmax(sBuffer));
        
trim(sBuffer);
        
        if(
sBuffer[0] == EOS || 
               
sBuffer[0] == ';' || 
                 (
sBuffer[0] == '/' && sBuffer[1] == '/') || 
                
strlen(sBuffer) <= 3)
        {
            
fprintf(fp2"%s^n"sBuffer);
            continue;
        }
        
        if(
sBuffer[0] == '[')
        {
            
copyc(szGangnamecharsmax(szGangname), sBuffer[1], ']');
            
            if(
equal(szGangnamexArray[GANG_NAME]))
            {
                
format(sBuffercharsmax(sBuffer), "%s^n\
                ^"
%s^" ^"%s^" ^"%s^""sBufferszAuthidUSER_STATUS[status], szName);
                
                
ArrayPushString(xArray[GANG_ARRAY_MEMBERS], szAuthid);
                
TrieSetString(xArray[GANG_TRIE_NAMES], szAuthidszName);
                
TrieSetString(xArray[GANG_TRIE_MSTATUS], szAuthidUSER_STATUS[status]);
                if(
id 0)
                {
                    
user_gang_data[id][USER_GANG_ID] = gang;
                    
copy(user_gang_data[id][USER_GANG_NAME], charsmax(user_gang_data[][USER_GANG_NAME]), xArray[GANG_NAME]);
                    
copy(user_gang_data[id][USER_GANG_SKIN], charsmax(user_gang_data[][USER_GANG_SKIN]), xArray[GANG_SKIN]);
                    
user_gang_data[id][USER_GANG_STATUS] = status;
                }
            }
        }
        
        
fputs(fp2sBuffer);
        
fputc(fp2'^n');
    }
    
fclose(fp);
    
fclose(fp2);
    
    
delete_file(GANGS_FILE)
    
    if(!
rename_file(sFile2GANGS_FILE1))
    {
        
delete_file(sFile2);
    }
}

remove_user_fromgang(const szAuthid[], gangid)
{
    new 
xArray[GANGS_INFO];
    
ArrayGetArray(garray_gangsgangidxArray);
    
    new 
fp fopen(GANGS_FILE"rt"), sFile2[128];
    
    
formatex(sFile2charsmax(sFile2), "%s2"GANGS_FILE)
    new 
fp2 fopen(sFile2"wt");
    
    if(!
fp || !fp2)
    {
        
fclose(fp);
        
fclose(fp2);
        return;
    }
    
    new 
szAuthid2[32], sBuffer[256];
    
    while(!
feof(fp))
    {
        
fgets(fpsBuffercharsmax(sBuffer));
        
trim(sBuffer);
        
        if(
sBuffer[0] == EOS || 
               
sBuffer[0] == ';' || 
                 (
sBuffer[0] == '/' && sBuffer[1] == '/') || 
                
strlen(sBuffer) <= 3)
        {
            
fprintf(fp2"%s^n"sBuffer);
            continue;
        }
        
        
parse(sBufferszAuthid2charsmax(szAuthid2));
        
remove_quotes(szAuthid2);
        
        if(
equal(szAuthid2szAuthid))
        {
            
format(sBuffercharsmax(sBuffer), "; %s"sBuffer);
        }
        
        
fputs(fp2sBuffer);
        
fputc(fp2'^n');
    }
    
fclose(fp);
    
fclose(fp2);
    
    
delete_file(GANGS_FILE)
    
    if(!
rename_file(sFile2GANGS_FILE1))
    {
        
delete_file(sFile2);
    }
    
    for(new 
iszString[32], maxloop ArraySize(xArray[GANG_ARRAY_MEMBERS]); maxloopi++)
    {
        
ArrayGetString(xArray[GANG_ARRAY_MEMBERS], iszStringcharsmax(szString))
        if(
equal(szStringszAuthid))
        {
            
ArrayDeleteItem(xArray[GANG_ARRAY_MEMBERS], i);
            break;
        }
    }
    
    
TrieDeleteKey(xArray[GANG_TRIE_NAMES], szAuthid);
    
TrieDeleteKey(xArray[GANG_TRIE_MSTATUS], szAuthid);
    
    new 
id find_player("c"szAuthid);
    
    if(!
ArraySize(xArray[GANG_ARRAY_MEMBERS]) || (id && user_gang_data[id][USER_GANG_STATUS] == GANG_OWNER))
    {
        
apanel_handler(id, ((-gangid) - 1000), 0)
    }
    
    if(
id 0)
    {
        
user_gang_data[id][USER_GANG_ID] = -1;
        
user_gang_data[id][USER_GANG_NAME][0] = EOS;
        
user_gang_data[id][USER_GANG_SKIN][0] = EOS;
        
user_gang_data[id][USER_GANG_STATUS] = NOT_INGANG;
    }
}

public 
clcmd_search_for(id)
{
    if(
user_gang_data[id][USER_GANG_STATUS] == NOT_INGANG) return PLUGIN_HANDLED;
    
    new 
sString[32];
    
read_args(sStringcharsmax(sString))
    
remove_quotes(sString)
    
    
formatex(user_find_members[id], charsmax(user_find_members[]), sString)
    
gang_members_menu(idg_userpage[id])
    return 
PLUGIN_HANDLED;
}

public 
clcmd_enter_gang_name(id)
{
    if(!(
check_flag(g_user_ingang_creation,id)) || user_gang_data[id][USER_GANG_STATUS] != NOT_INGANG)
    {
        return 
PLUGIN_HANDLED;
    }
    
    new 
sString[32];
    
read_args(sStringcharsmax(sString))
    
remove_quotes(sString)
    
    if(
strlen(sString) <= 3)
    {
        
formatex(user_gang_data[id][USER_GANG_NAME], charsmax(user_gang_data[][USER_GANG_NAME]), "Gang name is too short!")
        
set_flag(g_user_cant_create_agang,id)
        
gang_creation(id);
        return 
PLUGIN_HANDLED;
    }
    
    for(new 
ixArray[GANGS_INFO], maxloop ArraySize(garray_gangs); maxloopi++)
    {
        
ArrayGetArray(garray_gangsixArray)
        if(
equali(xArray[GANG_NAME], sString))
        {
            
formatex(user_gang_data[id][USER_GANG_NAME], charsmax(user_gang_data[][USER_GANG_NAME]), "Gang name is not valid!")
            
set_flag(g_user_cant_create_agang,id)
            
gang_creation(id);
            return 
PLUGIN_HANDLED;
        }
    }
    
    
remove_flag(g_user_cant_create_agang,id)
    
formatex(user_gang_data[id][USER_GANG_NAME], charsmax(user_gang_data[][USER_GANG_NAME]), sString)
    
gang_creation(id)
    return 
PLUGIN_HANDLED;
}

show_gang_info(idtargetlen)
{
    if(
user_gang_data[target][USER_GANG_STATUS] == NOT_INGANG)
    {
        return;
    }
    
    new 
xArray[GANGS_INFO], sString[196];
    
ArrayGetArray(garray_gangsuser_gang_data[target][USER_GANG_ID], xArray);
    
    
formatex(sStringcharsmax(sString), "%s of %s Gang.",
        
USER_STATUS[user_gang_data[target][USER_GANG_STATUS]], xArray[GANG_NAME])
    
message_begin(MSG_ONE_UNRELIABLEg_msgStatusText, {0,0,0}, id)
    
write_byte(len
    
write_string(sString)
    
message_end()
}

public 
jb_mm_itemselected(iditemid)
{
    if(
itemid == mm_itemid_gang)
    {
        
gang_mainmenu(id);
    }
}

public 
gang_mainmenu(id)
{
    new 
sMenu[256], iLeniKeys;
    
    if(
user_gang_data[id][USER_GANG_STATUS] == NOT_INGANG)
    {
        
iLen formatex(sMenucharsmax(sMenu), "You're currently not participating in any gang!^n^n")
        
        if(
jb_get_user_cash(id) > get_pcvar_num(g_cvar_gang_cost))
        {
            
iKeys |= MENU_KEY_1;
            
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\w1\r. \wCREATE A GANG \r( \y%d$ \r)^n^n"get_pcvar_num(g_cvar_gang_cost))
        }
        else
            
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\d1. CREATE A GANG ( %d$ )^n^n"get_pcvar_num(g_cvar_gang_cost))
        
        
iKeys |= MENU_KEY_3;
        
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\w3\r. \wJOIN A GANG\r!^n")
    }
    else
    {
        
iLen formatex(sMenu[iLen], charsmax(sMenu), "You're participating in \r[%s] \yGANG!^n\rPosition: \w%s^n^n",
            
user_gang_data[id][USER_GANG_NAME], USER_STATUS[user_gang_data[id][USER_GANG_STATUS]])
        
        if(
user_gang_data[id][USER_GANG_STATUS] > GANG_MEMBER)
        {
            
iKeys |= MENU_KEY_1;
            
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\w1\y. \rLeaders Only^n");
        }
        else 
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\d1. Leaders Only^n")
        
        
iKeys |= MENU_KEY_2;
        
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\w2\y. \rInvite a person!^n")
        
        
iKeys |= MENU_KEY_3;
        
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\w3\y. \rGANG \yMembers!^n^n")
        
        
iKeys |= MENU_KEY_5;
        
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\w5\y. \rLeave The GANG!^n")
    }
    
    
iKeys |= MENU_KEY_7;
    
iLen += formatex(sMenu[iLen], charsmax(sMenu), "^n\r7. \wAVAILABLE GANGS \r!^n")
    
    
iKeys |= MENU_KEY_8;
    
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\r8. \wTOP \y%d \rGANGS!^n^n"SHOW_TOP_GANGS)
    
    
iKeys |= MENU_KEY_0;
    
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\w0\y. \rExit!")
    
    
show_menu(idiKeyssMenu_"GANG_MAIN_MENU")
}

public 
gang_mainmenu_handler(idkey)
{
    if(
key == 9)
    {
        return 
PLUGIN_HANDLED;
    }
    if(
key == 6)
    {
        
g_userpage[id] = 0;
        
available_gangmenu(id0);
        return 
PLUGIN_HANDLED;
    }
    if(
key == 7)
    {
        
show_top_gangs(id)
        return 
PLUGIN_HANDLED;
    }
    
    if(
user_gang_data[id][USER_GANG_STATUS] == NOT_INGANG)
    {
        switch( 
key )
        {
            case 
0// key number 1
            
{
                
formatex(user_gang_data[id][USER_GANG_SKIN], charsmax(user_gang_data[][USER_GANG_SKIN]), "None")
                
formatex(user_gang_data[id][USER_GANG_NAME], charsmax(user_gang_data[][USER_GANG_NAME]), "Type in your gang name!")
                
set_flag(g_user_cant_create_agang,id);
                
gang_creation(id)
            }
            case 
2// key number 3
            
{
                
join_gang_menu(id);
            }
        }
    }
    else
    {
        switch( 
key )
        {
            case 
0// key number 1
            
{
                
g_userpage[id] = 0;
                
leader_menu(id0);
            }
            case 
1// key number 2
            
{
                
invite_gang_menu(id)
            }
            case 
2// key number 3
            
{
                
g_userpage[id] = 0;
                
formatex(user_find_members[id], charsmax(user_find_members[]), "")
                
gang_members_menu(id0)
            }
            case 
4// key number 5
            
{
                
confirmation_menu(id"Are you sure you want to \rleave the gang!?""player_left_gang")
            }
        }
    }
    
    return 
PLUGIN_HANDLED;
}

show_top_gangs(id)
{
    new 
maxloop ArraySize(garray_gangs);
    if(!
maxloop)
    {
        
cprint_chat(id_"There's no gangs available yet!")
        return;
    }
    
    new Array:
array_topgangs ArrayCreate(68,1), xArray[GANGS_INFO], count;
    
    if(
count maxloop <= SHOW_TOP_GANGScount maxloop;
    
    for(new 
imaxloopi++)
    {
        
ArrayGetArray(garray_gangsixArray);
        
ArrayPushArray(array_topgangsxArray);
    }
    
    
ArraySort(array_topgangs"SortTopGangs");
    
    new 
sBuffer[1536], iLen;
    
    
iLen formatex(sBuffercharsmax(sBuffer), "<html><head><style>.TITLES {color:black;font-size:8pt;font-weight:600;text-align:center;vertical-align:middle;background:#EFC929;}")
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"tr{color:black;font-size:8pt;font-weight:400;text-align:center;vertical-align:middle;}")
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"tr:nth-child(even){background-color: #C2D69A;}tr:nth-child(odd){background-color: #B6DDE8;}</style></head>")
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"<body><table align=center border='3' width=^"100%%^" style=^"border-collapse:collapse;^">")
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"<tr><td class=TITLES width=16px>ID</td><td class=TITLES>GANG NAME</td><td class=TITLES>GANG MEMBERS</td><td class=TITLES>GANG KILLS</td></tr>")
    
    for(new 
icounti++)
    {
        
ArrayGetArray(array_topgangsixArray);
        
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"<tr><td>%d</td><td>%s</td><td>%d</td><td>%d</td></tr>",
            (
i+1), xArray[GANG_NAME], ArraySize(xArray[GANG_ARRAY_MEMBERS]), xArray[GANG_KILLS])
    }
    
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"</table></body></html>")
    
    new 
sTitle[32]; formatex(sTitlecharsmax(sTitle), "TOP %d GANG!"count)
    
show_motd(idsBuffersTitle)
    
    
ArrayDestroy(array_topgangs);
}

public 
SortTopGangs(Array:array, item1item2, const data[], data_size)
{
    new 
xArray[GANGS_INFO], xArray2[GANGS_INFO];
    
ArrayGetArray(array,item1,xArray)
    
ArrayGetArray(array,item2,xArray2)
    
    if(
xArray[GANG_KILLS] > xArray2[GANG_KILLS])
        return -
1;
    
    if(
xArray[GANG_KILLS] < xArray2[GANG_KILLS])
        return 
1;
    
    return 
0;
}

public 
player_left_gang(id)
{
    if(
user_gang_data[id][USER_GANG_STATUS] == NOT_INGANG)
    {
        return;
    }
    
    new 
szName[32];
    
get_user_name(idszNamecharsmax(szName));
    
cprint_chat(0_"^4%s ^1has ^3left the ^4%s ^1gang^3!"szNameuser_gang_data[id][USER_GANG_NAME]);
    
    
get_user_authid(idszNamecharsmax(szName))
    
remove_user_fromgang(szNameuser_gang_data[id][USER_GANG_ID])
}

confirmation_menu(id, const reason[], const function[])
{
    new 
zmenu menu_create(reason"confirm_respone")
    
    
menu_additem(zmenu"\yYes!", function)
    
menu_additem(zmenu"\rNo!""")
    
    
menu_display(idzmenu)
}

public 
confirm_respone(idmenuitem)
{
    if(
item == MENU_EXIT)
    {
        
menu_destroy(menu)
        return;
    }
    
    if(
item == 0// key 1(yes)..
    
{
        new 
sData[32], paccesscallback;
        
menu_item_getinfo(menuitempaccesssDatacharsmax(sData), ""0callback)
        
        
callfunc_begin(sData"")
        
callfunc_push_int(id)
        
callfunc_end()
    }
    
    
menu_destroy(menu)
}

public 
gang_creation(id)
{
    
set_flag(g_user_ingang_creation,id);
    
    new 
sText[98], menu menu_create("Fill out the blankets!""gang_creation_handle"),
    
sInfo[20], gang_skin_cost get_pcvar_num(g_cvar_gang_skin_cost), szSkin[32];
    
copy(szSkincharsmax(szSkin), user_gang_data[id][USER_GANG_SKIN]);
    
    new 
total_costs get_pcvar_num(g_cvar_gang_cost) + (equali(szSkin"None") ? 0:gang_skin_cost);
    
    
formatex(sTextcharsmax(sText), "\r[GANG NAME]: \y%s"user_gang_data[id][USER_GANG_NAME])
    
menu_additem(menusText"1")
    
    if(
ArraySize(garray_gang_skins) && jb_get_user_cash(id) >= total_costs)
    {
        
formatex(sTextcharsmax(sText), "\r[GANG SKIN]: \y%s^nSkin Cost: \r%d$"szSkingang_skin_cost)
        
menu_additem(menusText"2")
    }
    else
    {
        
formatex(sTextcharsmax(sText), "\d[GANG SKIN]: %s^n\rSkin Cost: \d%d$"szSkingang_skin_cost)
        
menu_additem(menusText""NO_ACCESS)
    }
    
    
num_to_str(total_costssInfocharsmax(sInfo))
    
formatex(sTextcharsmax(sText), "%sSubmit!^n\wTotal \yCosts: \r%d$"check_flag(g_user_cant_create_agang,id) ? "\d":"\r"total_costs)
    
menu_additem(menusTextsInfocheck_flag(g_user_cant_create_agang,id) ? NO_ACCESS:0)
    
    
menu_display(idmenu)
}

public 
gang_creation_handle(idmenuitem)
{
    if(
item == MENU_EXIT)
    {
        
remove_flag(g_user_ingang_creation,id)
        
menu_destroy(menu);
        return 
PLUGIN_HANDLED;
    }
    
    new 
sData[15], paccessiCallback
    menu_item_getinfo
(menuitempaccesssDatacharsmax(sData), ""0iCallback)
    
    
menu_destroy(menu);
    
    new 
iValue str_to_num(sData);
    
    switch( 
iValue )
    {
        case 
1:
        {
            
client_cmd(id"messagemode enter_gang_name")
            return 
PLUGIN_HANDLED;
        }
        case 
2:
        {
            
skins_menu(id);
            return 
PLUGIN_HANDLED;
        }
        case 
3:
        {
            
gang_creation(id)
            return 
PLUGIN_HANDLED;
        }
    }
    
    if(
check_flag(g_user_cant_create_agang,id))
    {
        
gang_creation(id)
        return 
PLUGIN_HANDLED;
    }
    
    for(new 
ijmaxloop ArraySize(garray_gangs), 
            
xArray[GANGS_INFO]; maxloopi++)
    {
        
ArrayGetArray(garray_gangsjxArray);
        if(
equal(xArray[GANG_SKIN_MDL], user_gang_data[id][USER_GANG_SKIN]))
        {
            
iValue -= get_pcvar_num(g_cvar_gang_skin_cost);
            
copy(user_gang_data[id][USER_GANG_SKIN], charsmax(user_gang_data[][USER_GANG_SKIN]), "None");
            
gang_creation(id);
            return 
PLUGIN_HANDLED;
        }
    }
    
    if(
jb_get_user_cash(id) < iValue)
    {
        
cprint_chat(id_"You don't have enough cash to create a gang!")
        return 
PLUGIN_HANDLED;
    }
    
    
jb_set_user_cash(id, (jb_get_user_cash(id)-iValue))
    
    new 
sBuffer[196], ilensAuthid[32], sName[32];
    
get_user_name(idsNamecharsmax(sName))
    
get_user_authid(idsAuthidcharsmax(sAuthid))
    
ilen formatex(sBuffercharsmax(sBuffer), "^n[%s] ^"%s^" ^"0^"^n"
            
user_gang_data[id][USER_GANG_NAME], user_gang_data[id][USER_GANG_SKIN])
    
ilen += formatex(sBuffer[ilen], charsmax(sBuffer)-ilen"^"%s^" ^"%s^" ^"%s^""sAuthidUSER_STATUS[GANG_OWNER], sName)
    
write_file(GANGS_FILEsBuffer)
    
    new 
xArray[GANGS_INFO];
    
copy(xArray[GANG_NAME], charsmax(xArray[GANG_NAME]), user_gang_data[id][USER_GANG_NAME]);
    
copy(xArray[GANG_SKIN], charsmax(xArray[GANG_SKIN]), user_gang_data[id][USER_GANG_SKIN]);
    
user_gang_data[id][USER_GANG_ID] = ArraySize(garray_gangs);
    
user_gang_data[id][USER_GANG_STATUS] = GANG_OWNER;
    
    
xArray[GANG_KILLS] = 0;
    
ArrayPushString((xArray[GANG_ARRAY_MEMBERS] = _:ArrayCreate(32,1)), sAuthid);
    
TrieSetString((xArray[GANG_TRIE_MSTATUS] = _:TrieCreate()), sAuthidUSER_STATUS[GANG_OWNER]);
    
TrieSetString((xArray[GANG_TRIE_NAMES] = _:TrieCreate()), sAuthidsName);
    
ArrayPushArray(garray_gangsxArray);
    
    
TrieSetCell(gtrie_gang_maxslotsxArray[GANG_NAME], get_pcvar_num(cvar_maxmembers_slots));
    
    
log_amx("^n[JB GANG SYSTEM] .:GANG has been Created!:.^n \
                (Gang name): %s^n \
                (Skin): %s^n \
                (Owner): %s"
xArray[GANG_NAME], xArray[GANG_SKIN], sName)
    
cprint_chat(id_"your gang has been successfully created, you're now the owner of ^4%s^3!"xArray[GANG_NAME])
    
cprint_chat(0_"^3new gang has been created ^4(%s)^3, by ^4%s^3."xArray[GANG_NAME], sName)
    return 
PLUGIN_HANDLED;
}

skins_menu(id)
{
    if(!
check_flag(g_user_ingang_creation,id))
    {
        return;
    }
    
    new 
sText[64], menu menu_create("Choose out your gang skin!""skins_menu_handle"),
    
szSkin[32]; copy(szSkincharsmax(szSkin), user_gang_data[id][USER_GANG_SKIN]);
    
    
formatex(sTextcharsmax(sText), "%sNone"equal(szSkin"None") ? "\y":"\r")
    
menu_additem(menusText"None")
    
    for(new 
ijmaxloop2 ArraySize(garray_gangs),
        
maxloop ArraySize(garray_gang_skins), 
            
xArray2[GANGS_INFO], xArray[GANG_SKINS_INFO]; maxloopi++)
    {
        
ArrayGetArray(garray_gang_skinsixArray)
        
        for(
0maxloop2j++)
        {
            
ArrayGetArray(garray_gangsjxArray2);
            if(
equal(xArray2[GANG_SKIN], xArray[GANG_SKIN_NAME]))
            {
                
xArray[GANG_SKIN_ACCESS] = NO_ACCESS;
                
maxloop2;
            }
        }
        
        
formatex(sTextcharsmax(sText), xArray[GANG_SKIN_NAME]);
        if((
get_user_flags(id) & xArray[GANG_SKIN_ACCESS]) || !xArray[GANG_SKIN_ACCESS])
            
formatex(sTextcharsmax(sText), "%s%s"equal(szSkinxArray[GANG_SKIN_NAME]) ? "\y":"\r"xArray[GANG_SKIN_NAME]);
        
menu_additem(menusTextxArray[GANG_SKIN_NAME], 
            ((
get_user_flags(id) & xArray[GANG_SKIN_ACCESS]) || !xArray[GANG_SKIN_ACCESS]) ? 0:NO_ACCESS)
    }
    
    
menu_display(idmenu)
}

public 
skins_menu_handle(idmenuitem)
{
    if(
item == MENU_EXIT)
    {
        
menu_destroy(menu);
        return 
PLUGIN_HANDLED;
    }
    
    new 
sData[32], paccessiCallback
    menu_item_getinfo
(menuitempaccesssDatacharsmax(sData), ""0iCallback)
    
menu_destroy(menu);
    
    
copy(user_gang_data[id][USER_GANG_SKIN], charsmax(user_gang_data[][USER_GANG_SKIN]), sData)
    
gang_creation(id)
    return 
PLUGIN_HANDLED;
}

available_gangmenu(const id, const page)
{
    new 
total_gangs;
    if(!(
total_gangs=ArraySize(garray_gangs)))
    {
        
cprint_chat(id_"^3There's no available gangs!")
        return;
    }
    
    new 
pages floatround((total_gangs 10.0), floatround_ceil);
    
    new 
sText[64];
    
    
formatex(sTextcharsmax(sText), "\yCurrent \wpage : \r%d\y/\r%d", (page 1), pages)
    new 
menu menu_create(sText"available_gmenu_handler")
    
    
menu_additem(menu"\rShow !^n^n")
    
    
menu_additem(menu"Next page"_, ((page ) < pages) ? 0:NO_ACCESS)
    
menu_additem(menu"Previous page"_, !page NO_ACCESS:0)
    
    
menu_setprop(menuMPROP_NOCOLORS"\w")
    
menu_setprop(menuMPROP_EXITNAME"Return")
    
    
menu_display(idmenu)
}

public 
available_gmenu_handler(idmenuitem)
{
    switch( 
item )
    {
        case 
0available_gangs(idg_userpage[id]);
        case 
1available_gangmenu(id, ++g_userpage[id]);
        case 
2available_gangmenu(id, --g_userpage[id]);
        case 
MENU_EXITgang_mainmenu(id);
    }
    
    
menu_destroy(menu);
    return 
PLUGIN_HANDLED;
}

available_gangs(const id, const page)
{
    new 
total_gangs ArraySize(garray_gangs);
    if(!
total_gangs || (floatround((total_gangs 10.0), floatround_ceil)) <= page)
    {
        return;
    }
    
    new 
sBuffer[1536], iLen;
    
    
iLen formatex(sBuffercharsmax(sBuffer), "<html><head><style id=^"XXX_12835_Styles^">")
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"tr {padding-top:1px;padding-right:1px;padding-left:1px;mso-ignore:padding;color:black;font-size:12.0pt;")
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"font-weight:700;font-family:Calibri, sans-serif;text-align:center;vertical-align:bottom;border-top:1.0pt solid windowtext;")
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"border-right:.5pt solid windowtext;border-bottom:none;border-left:1.0pt solid windowtext;background:#FFC819;")
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"mso-pattern:black none;white-space:nowrap;}")
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"td {width:100pt;} .xID {width:30pt;height:15.0pt;}</style></head>")
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"<body><div id=^"XXX_12835^" align=^"center^"><table border=^"1^" style=^"border-collapse:collapse;table-layout:fixedwidth:100%;^">")
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"<tr><td class=^"xID^">ID</td><td>GANG NAME</td><td>MEMBERS</td><td>GANG SKIN</td><td>OWNER</td></tr>")
    
    new 
count;
    for(new 
= (page 10), xArray[GANGS_INFO], iOwnerjszOwner[32], szStatus[8], maxlooptotal_gangs && count 10i++)
    {
        
ArrayGetArray(garray_gangsixArray);
        
        
// seeking for the gang owner name...
        
for(0maxloop ArraySize(xArray[GANG_ARRAY_MEMBERS]); maxloopj++)
        {
            
ArrayGetString(xArray[GANG_ARRAY_MEMBERS], jszOwnercharsmax(szOwner))
            
TrieGetString(xArray[GANG_TRIE_MSTATUS], szOwnerszStatuscharsmax(szStatus))
            if(
equali(USER_STATUS[GANG_OWNER], szStatus))
            {
                if((
iOwner find_player("c"szOwner)) > 0)
                {
                    
get_user_name(iOwnerszOwnercharsmax(szOwner));
                    
maxloop; continue;
                }
                
                
TrieGetString(xArray[GANG_TRIE_NAMES], szOwnerszOwnercharsmax(szOwner))
                
maxloop;
            }
        }
        
        
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"<tr><td>%d</td><td>%s</td><td>%d</td><td>%s</td><td>%s</td></tr>"
            (
i+1), xArray[GANG_NAME], ArraySize(xArray[GANG_ARRAY_MEMBERS]), xArray[GANG_SKIN], szOwner)
        
count++;
    }
    
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"</table></div></body></html>")
    
    
show_motd(idsBuffer"Available Gangs.")
}

gang_members_menu(const idpage)
{
    if(
user_gang_data[id][USER_GANG_STATUS] == NOT_INGANG) return;
    
    new 
menu menu_create("\r~(\yGang Members\r)~""gmembers_menu_handler"), szText[196], sInfo[8];
    
    
formatex(szTextcharsmax(szText), "Search for: %s"user_find_members[id])
    
menu_additem(menuszText"1")
    
    new 
xArray[GANGS_INFO], found;
    
ArrayGetArray(garray_gangsuser_gang_data[id][USER_GANG_ID], xArray)
    
    for(new 
iplayerszAuthid[32], szStatus[10], count,
        
szName[32], maxloop ArraySize(xArray[GANG_ARRAY_MEMBERS]); maxloopi++)
    {
        
ArrayGetString(xArray[GANG_ARRAY_MEMBERS], iszAuthidcharsmax(szAuthid));
        
TrieGetString(xArray[GANG_TRIE_MSTATUS], szAuthidszStatuscharsmax(szStatus))
        
TrieGetString(xArray[GANG_TRIE_NAMES], szAuthidszNamecharsmax(szName))
        
        if((
player=find_player("c"szAuthid)) > 0)
        {
            
get_user_name(playerszNamecharsmax(szName))
        }
        
        
// not match...!
        
if(user_find_members[id][0] != EOS &&
            
containi(szName,user_find_members[id]) == -1)
                continue;
        
        if(
page <= found && count 7)
        {
            
formatex(szTextcharsmax(szText), "\r%s \w(\y%s\w) \w[%s\w]"szNameszStatus, !player "\rOffline":"\yOnline")
            
menu_addtext(menuszText0)
            
count++;
        }
        
        
found++;
    }
    
    new 
maxpages clamp(floatround((found 7.0), floatround_ceil), 1999999);
    
    
num_to_str(page 1sInfocharsmax(sInfo));
    
formatex(szTextcharsmax(szText), "Next Page!")
    
menu_additem(menuszTextsInfo, (page 1) < maxpages 0:NO_ACCESS)
    
    
num_to_str(page 1sInfocharsmax(sInfo));
    
formatex(szTextcharsmax(szText), "Previous Page!^n\rPage: (%d/%d)"page+1maxpages)
    
menu_additem(menuszTextsInfo, !page NO_ACCESS:0)
    
    
menu_setprop(menuMPROP_EXITNAME"Return")
    
menu_display(idmenu)
}

public 
gmembers_menu_handler(idmenuitem)
{
    new 
sData[8], iGnore;
    
menu_item_getinfo(menuitemiGnoresDatacharsmax(sData), __iGnore);
    
    switch( 
item )
    {
        case 
1gang_members_menuid, ++g_userpage[id])
        case 
2gang_members_menuid, --g_userpage[id])
        case 
0client_cmd(id"messagemode search_for")
        case 
MENU_EXITgang_mainmenu(id);
    }
    
    
menu_destroy(menu)
    return 
PLUGIN_HANDLED;
}

join_gang_menu(const id)
{
    if(
user_gang_data[id][USER_GANG_STATUS] != NOT_INGANG)
    {
        return;
    }
    
    new 
sText[96];
    new 
menu menu_create("\rRequest to join a gang...",  "jgang_menu_handler")
    
    new 
players[32], pnumsInfo[32], sName[32], g_items;
    
get_players(playerspnum"ch")
    
    for(new 
ixArray[GANGS_INFO], maxslotsplayerpnumi++)
    {
        
player players[i];
        
        if(
user_gang_data[player][USER_GANG_STATUS] <= GANG_MEMBER ||
            
check_flag(g_user_rejected_req[player],id))
        {
            continue;
        }
        
        
ArrayGetArray(garray_gangsuser_gang_data[player][USER_GANG_ID], xArray)
        
TrieGetCell(gtrie_gang_maxslotsxArray[GANG_NAME], maxslots);
        if(
ArraySize(xArray[GANG_ARRAY_MEMBERS]) >= maxslots) continue;
        
        
num_to_str(get_user_userid(player), sInfocharsmax(sInfo))
        
get_user_name(playersNamecharsmax(sName))
        
formatex(sTextcharsmax(sText), "\w%s \r%s of \y%s \rGang",
        
sNameUSER_STATUS[user_gang_data[player][USER_GANG_STATUS]], user_gang_data[player][USER_GANG_NAME])
        
menu_additem(menusTextsInfo)
        
g_items++;
    }
    
    if(!
g_items)
    {
        
menu_destroy(menu)
        return;
    }
    
    
menu_display(idmenu)
}

public 
jgang_menu_handler(idmenuitem)
{
    if(
item == MENU_EXIT)
    {
        
menu_destroy(menu)
        return 
PLUGIN_HANDLED;
    }
    
    new 
sData[32], sName[32], paccessicallback;
    
menu_item_getinfo(menuitempaccesssDatacharsmax(sData), ""0icallback)
    
menu_destroy(menu)
    
    new 
player find_player("k"str_to_num(sData));
    if(!
player || user_gang_data[player][USER_GANG_STATUS] == NOT_INGANG)
    {
        
join_gang_menu(id);
        return 
PLUGIN_HANDLED;
    }
    
    
get_user_name(idsNamecharsmax(sName))
    
gang_jrequest_menu(playerget_user_userid(id))
    
    
cprint_chat(id_"^4The request ^1has been ^3sent!")
    
cprint_chat(player_"^3[^1WARNING^3] ^4: ^3%s ^1wants to ^4join ^1the ^3gang^4!"sName)
    
client_cmd(player"spk warning")
    return 
PLUGIN_HANDLED;
}

gang_jrequest_menu(const id, const requesterUID)
{
    new 
requester find_player("k"requesterUID);
    
    if(!
requester ||
       
user_gang_data[requester][USER_GANG_STATUS] != NOT_INGANG ||
               
user_gang_data[id][USER_GANG_STATUS] <= GANG_MEMBER)
          {
        return;
          }
    
    new 
sName[32], sText[64]; get_user_name(requestersNamecharsmax(sName));
    
formatex(sTextcharsmax(sText), "\r%s \yRequest to join the gang\r!"sName)
    new 
menu menu_create(sText"gang_jrequest_menu_handler")
    
    
num_to_str(requesterUIDsNamecharsmax(sName))
    
menu_additem(menu"\yAccept!"sName)
    
menu_additem(menu"\rReject!"sName)
    
    
menu_display(idmenu)
}

public 
gang_jrequest_menu_handler(idmenuitem)
{
    if(
item == MENU_EXIT)
    {
        
menu_destroy(menu)
        return;
    }
    
    new 
sData[32], paccessicallback;
    
menu_item_getinfo(menuitempaccesssDatacharsmax(sData), ""0icallback)
    
    
menu_destroy(menu)
    
    new 
uid find_player("k"str_to_num(sData));
    if(!
uid || user_gang_data[uid][USER_GANG_STATUS] != NOT_INGANG ||
        
user_gang_data[id][USER_GANG_STATUS] <= GANG_MEMBER)
    {
        return;
    }
    
    
get_user_authid(uidsDatacharsmax(sData));
    
    switch( 
item )
    {
        case 
0:  // Accept!
        
{
            
set_user_gang(sDatauser_gang_data[id][USER_GANG_ID], GANG_MEMBER);
            
get_user_name(uidsDatacharsmax(sData))
            
cprint_chat(0_"!t%s !yhas joined the !g%s !tgang!g!"sDatauser_gang_data[id][USER_GANG_NAME])
        }
        case 
1:  // Reject!
        
{
            
set_flag(g_user_rejected_req[id],uid)
            
get_user_name(idsDatacharsmax(sData))
            
cprint_chat(uid_"^4%s ^1has ^3Rejected ^1your request!"sData)
        }
    }
}

invite_gang_menu(const id)
{
    if(
user_gang_data[id][USER_GANG_STATUS] == NOT_INGANG) return;
    if(
user_gang_data[id][USER_GANG_STATUS] < GANG_LEADER)
    {
        
cprint_chat(id_"You have to be a leader or higher inorder to invite players to the gang!")
        return;
    }
    
    new 
xArray[GANGS_INFO], maxslotscurrentslots;
    
ArrayGetArray(garray_gangsuser_gang_data[id][USER_GANG_ID], xArray);
    
TrieGetCell(gtrie_gang_maxslotsxArray[GANG_NAME], maxslots);
    if((
currentslots=ArraySize(xArray[GANG_ARRAY_MEMBERS])) >= maxslots)
    {
        
cprint_chat(id_"Your gang have reached the !tmaximum members !gslots(%d/%d)! "currentslotsmaxslots)
        return;
    }
    
    new 
menu menu_create("Invite a player to the gang!""invgang_menu")
    
    new 
players[32], pnumsInfo[32], sName[32], g_items;
    
get_players(playerspnum"ch")
    
    for(new 
iuidpnumi++)
    {
        
uid players[i];
        
        if(
user_gang_data[uid][USER_GANG_STATUS] != NOT_INGANG || uid == id|| check_flag(g_user_rejected_inv[uid],id))
        {
            continue;
        }
        
        
num_to_str(get_user_userid(uid), sInfocharsmax(sInfo))
        
get_user_name(uidsNamecharsmax(sName))
        
menu_additem(menusNamesInfo)
        
g_items ++;
    }
    
    if(!
g_items)
    {
        
menu_destroy(menu)
        return;
    }
    
    
menu_display(idmenu)
}

public 
invgang_menu(idmenuitem)
{
    if(
item == MENU_EXIT || (user_gang_data[id][USER_GANG_STATUS] < GANG_LEADER))
    {
        
menu_destroy(menu)
        return 
PLUGIN_HANDLED;
    }
    
    new 
sData[32], icallbackpaccess;
    
menu_item_getinfo(menuitempaccesssDatacharsmax(sData), ""0icallback)
    
    
menu_destroy(menu)
    
    new 
player find_player("k"str_to_num(sData));
    if(!
player || user_gang_data[player][USER_GANG_STATUS] != NOT_INGANG)
    {
        
invite_gang_menu(id)
        return 
PLUGIN_HANDLED;
    }
    
    
gang_invitation_menu(playerget_user_userid(id));
    
    
cprint_chat(id_"^4Gang Invitation ^1has been ^3sent!")
    
cprint_chat(player_"^3[^1WARNING^3] ^4: ^1You received a ^4gang ^3invitation!")
    
client_cmd(player"spk warning")
    return 
PLUGIN_HANDLED;
}

leader_menu(const id, const page)
{
    if(
user_gang_data[id][USER_GANG_STATUS] < GANG_LEADER)
    {
        
gang_mainmenu(id);
        return;
    }
    
    new 
menu menu_create("\r~(\yLeader Menu\r)~""leadermenu_handler")
    
    new 
sText[64], status user_gang_data[id][USER_GANG_STATUS], sPName[32], g_items;
    
formatex(sTextcharsmax(sText), leadermenu_items[page][INFO_ACTION])
    
menu_additem(menusText"#")
    
    new 
xArray[GANGS_INFO], player;
    
ArrayGetArray(garray_gangsuser_gang_data[id][USER_GANG_ID], xArray);
    
    for(new 
ipaccessszString[32],
        
szPStatus[32], maxloop ArraySize(xArray[GANG_ARRAY_MEMBERS]); maxloopi++)
    {
        
paccess 0;
        
ArrayGetString(xArray[GANG_ARRAY_MEMBERS], iszStringcharsmax(szString));
        
TrieGetString(xArray[GANG_TRIE_MSTATUS], szStringszPStatuscharsmax(szPStatus));
        
TrieGetString(xArray[GANG_TRIE_NAMES], szStringsPNamecharsmax(sPName))
        
        if(!((
1<<status) & leadermenu_items[page][INFO_ACCESS]) ||
                !
equal(szPStatusUSER_STATUS[leadermenu_items[page][INFO_POSITION]]))
        {
            
paccess NO_ACCESS;
        }
        
        if((
player find_player("c"szString)) > 0)
        {
            
get_user_name(playersPNamecharsmax(sPName));
        }
        
        
formatex(sTextcharsmax(sText), "\r%s \w- \yPosition: \r%s"sPNameszPStatus)
        if(
paccess == NO_ACCESS)
        {
            
formatex(sTextcharsmax(sText), "%s - Position: %s"sPNameszPStatus)
        }
        
        
menu_additem(menusTextszStringpaccess)
        
g_items ++;
    }
    
    if(!
g_items)
    {
        
menu_destroy(menu)
        return;
    }
    
    
menu_display(idmenu)
}

public 
leadermenu_handler(idmenuitem)
{
    if(
item == MENU_EXIT || user_gang_data[id][USER_GANG_STATUS] < GANG_LEADER)
    {
        
menu_destroy(menu)
        return 
PLUGIN_HANDLED;
    }
    
    new 
sData[32], paccessicallback;
    
menu_item_getinfo(menuitempaccesssDatacharsmax(sData), ""0icallback)
    
    
menu_destroy(menu);
    
    new 
xID find_player("c"str_to_num(sData));
    
    if(
sData[0] == '#')
    {
        if(
g_userpage[id] < sizeof leadermenu_items-1)
            
g_userpage[id] ++;
        else
            
g_userpage[id] = 0;
        
        
leader_menu(idg_userpage[id])
        return 
PLUGIN_HANDLED;
    }
    
    new 
sName[32], sName2[32];
    
get_user_name(idsName2charsmax(sName2));
    
    new 
xArray[GANGS_INFO];
    
ArrayGetArray(garray_gangsuser_gang_data[id][USER_GANG_ID], xArray);
    
TrieGetString(xArray[GANG_TRIE_NAMES], sDatasNamecharsmax(sName))
    
    if(
xID 0get_user_name(xIDsNamecharsmax(sName));
    
    switch( 
g_userpage[id] )
    {
        case 
0:
        {
            
set_user_gang(sDatauser_gang_data[id][USER_GANG_ID], GANG_LEADER);
            if(
xID 0cprint_chat(xID_"^4You have been promoted to a gang leader position by ^3%s^4!"sName2);
            
cprint_chat(id_"You have successfully promoted ^4%s^3!"sName);
        }
        case 
1:
        {
            
set_user_gang(sDatauser_gang_data[id][USER_GANG_ID], GANG_MEMBER);
            if(
xID 0cprint_chat(xID_"^3You have been demoted to a gang member position by ^4%s^3!"sName2);
            
cprint_chat(id_"You have successfully demoted ^4%s^3!"sName);
        }
        case 
2:
        {
            if(
xID 0cprint_chat(xID_"^3You have been kicked out of the gang by ^4%s^3!"sName2);
            
cprint_chat(id_"You have successfully kicked ^4%s ^1out of the gang^3!"sName);
            
remove_user_fromgang(sDatauser_gang_data[id][USER_GANG_ID]);
        }
    }
    
    
leader_menu(idg_userpage[id]);
    return 
PLUGIN_HANDLED;
}

gang_invitation_menu(const id, const iUID)
{
    new 
sText[64], uid find_player("k"iUID);
    
    new 
name[32]; get_user_name(uidnamecharsmax(name));
    
formatex(sTextcharsmax(sText), "\r[GANG Invitation] \wSent from \y%s^n\wto join \r%s \ygang!"
    
nameuser_gang_data[uid][USER_GANG_NAME])
    new 
menu menu_create(sText"ginvitation_menu_handler")
    
    new 
szUID[32]; num_to_str(iUIDszUIDcharsmax(szUID));
    
menu_additem(menu"\yAccept!"szUID)
    
menu_additem(menu"\rReject!"szUID)
    
    
menu_display(idmenu)
}

public 
ginvitation_menu_handler(idmenuitem)
{
    if(
item == MENU_EXIT)
    {
        
menu_destroy(menu)
        return 
PLUGIN_HANDLED;
    }
    
    new 
sData[32], paccessicallback;
    
menu_item_getinfo(menuitempaccesssDatacharsmax(sData), ""0icallback)
    
menu_destroy(menu)
    
    new 
uid find_player("k"str_to_num(sData));
    if(!
uid || user_gang_data[uid][USER_GANG_STATUS] < GANG_LEADER || user_gang_data[id][USER_GANG_STATUS] != NOT_INGANG)
    {
        return 
PLUGIN_HANDLED;
    }
    
    
get_user_authid(idsDatacharsmax(sData))
    
    switch( 
item )
    {
        case 
0:  // Accept!
        
{
            
set_user_gang(sDatauser_gang_data[uid][USER_GANG_ID], GANG_MEMBER);
            
get_user_name(idsDatacharsmax(sData))
            
cprint_chat(0_"!t%s !yhas joined the !g%s !tgang!g!"sDatauser_gang_data[uid][USER_GANG_NAME])
        }
        case 
1:  // Reject!
        
{
            
set_flag(g_user_rejected_inv[id],uid)
            
get_user_name(idsDatacharsmax(sData))
            
cprint_chat(uid_"^4%s ^1has ^3Rejected ^1the gang ^4invitation!"sData)
        }
    }
    
    return 
PLUGIN_HANDLED;

alferd is offline
alferd
Veteran Member
Join Date: Dec 2019
Location: Iran is Always Eternal
Old 05-21-2020 , 05:33   Re: Gang Prefix Chat Color
Reply With Quote #2

PHP Code:
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <nvault>
#include <hamsandwich>
#include <jailbreak_core>
#include <cs_player_models_api>
#include <fakemeta>
#include <cromchat>

#define PLUGIN "[JB] Gang System"
#define VERSION "1.0"
#define AUTHOR "Natsheh"

#define set_flag(%1,%2)        (%1 |= (1<<(31&%2)))
#define remove_flag(%1,%2)    (%1 &= ~(1<<(31&%2)))
#define check_flag(%1,%2)    (%1 & (1<<(31&%2)))

#define MENU_KEYS    (MENU_KEY_0|MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_5|MENU_KEY_7|MENU_KEY_8)

#define SHOW_TOP_GANGS    10

#define NO_ACCESS    (1<<26)

#if !defined EOS
#define EOS 0
#endif

new const gang_file[] = "jailbreak_gangs.ini";
new const 
gang_skins_file[] = "jailbreak_gang_skins.ini";

enum (+=1)
{
    
NOT_INGANG 0,
    
GANG_MEMBER,
    
GANG_LEADER,
    
GANG_OWNER
}

new const 
USER_STATUS[][] = {
    
"",
    
"Member",
    
"Leader",
    
"Owner"
}

enum GANG_ACCESS(+=1)
{
    
INFO_ACTION[24] = 0,
    
INFO_ACCESS,
    
INFO_POSITION
}

new const 
leadermenu_items[][GANG_ACCESS] = {
    { 
"Add a leader!",    (1<<GANG_OWNER),    GANG_MEMBER },
    { 
"Remove a leader!",    (1<<GANG_OWNER),    GANG_LEADER },
    { 
"Kick a member!",    (1<<GANG_OWNER)|(1<<GANG_LEADER), GANG_MEMBER }
}

enum (+=1)
{
    
KEY_SKIN_MDL 0,
    
KEY_SKIN_ACCESS
}

new const 
szKEYS[][] = {
    
"SKIN",
    
"ACCESS"
}

enum USER_GANG_INFO(+=1)
{
    
USER_GANG_NAME[32] = 0,
    
USER_GANG_SKIN[32],
    
USER_GANG_STATUS,
    
USER_GANG_ID
}

enum _:GANGS_INFO(+=1)
{
    
GANG_NAME[32] = 0,
    
GANG_SKIN[32],
    
GANG_KILLS,
    Array:
GANG_ARRAY_MEMBERS,
    
Trie:GANG_TRIE_MSTATUS,
    
Trie:GANG_TRIE_NAMES
}

enum _:GANG_SKINS_INFO(+=1)
{
    
GANG_SKIN_NAME[32] = 0,
    
GANG_SKIN_MDL[32],
    
GANG_SKIN_ACCESS
}

new 
mm_itemid_gang;

new 
user_find_members[33][32], g_user_rejected_req[33], g_user_rejected_inv[33], g_userpage[33];
new 
g_user_ingang_creationg_user_cant_create_agangg_user_alive;

new 
gang_name_edition[33][32], user_gang_data[33][USER_GANG_INFO];

new Array:
garray_gangs, Array:garray_gang_skinsTrie:gtrie_gang_skin_mdlsTrie:gtrie_gang_maxslots;

new 
g_cvar_gang_costg_cvar_gang_skin_costg_msgStatusTextg_cvar_show_gang_infocvar_maxmembers_slots;

new 
GANGS_FILE[64], GANG_SKINS_FILE[64];

#define MAXSLOTS 32

enum Color
{
    
YELLOW 1// Yellow
    
GREEN// Green Color
    
TEAM_COLOR// Red, grey, blue
    
GREY// grey
    
RED// Red
    
BLUE// Blue
}

new 
TeamInfo;
new 
SayText;
new 
MaxSlots;

new 
bool:IsConnected[MAXSLOTS 1];

new 
TeamName[][] = 
{
    
"",
    
"TERRORIST",
    
"CT",
    
"SPECTATOR"
}

new 
ColorMode;

public 
plugin_end()
{
    
ArrayDestroy(garray_gangs);
    
ArrayDestroy(garray_gang_skins);
    
TrieDestroy(gtrie_gang_skin_mdls);
    
TrieDestroy(gtrie_gang_maxslots);
}

public 
plugin_precache()
{
    
garray_gangs ArrayCreate(681);
    
garray_gang_skins ArrayCreate(651);
    
gtrie_gang_skin_mdls TrieCreate();
    
gtrie_gang_maxslots TrieCreate();
    
    new 
sFile[64];
    
get_configsdir(sFilecharsmax(sFile))
    
formatex(GANG_SKINS_FILEcharsmax(GANG_SKINS_FILE), "%s/%s"sFilegang_skins_file)
    
    if(!
file_exists(GANG_SKINS_FILE))
    {
        
write_file(GANG_SKINS_FILE"; [Very Important Prisoner]");
        
write_file(GANG_SKINS_FILE"; SKIN = ^"viprisoner^"");
        
write_file(GANG_SKINS_FILE"; SKIN_ACCESS = ^"abcdefghijklmnopqrstu^"^n");
    }
    
    new 
fp fopen(GANG_SKINS_FILE"rt");
    
    if(
fp)
    {
        new 
xArray[GANG_SKINS_INFO], sBuffer[256], iItemIndex = -1szKey[14], iKey;
        
        while(!
feof(fp))
        {
            
fgets(fpsBuffercharsmax(sBuffer));
            
trim(sBuffer);
            
            if(
sBuffer[0] == EOS || sBuffer[0] == ';' || strlen(sBuffer) <= || (sBuffer[0] == '/' && sBuffer[1] == '/'))
                continue;
            
            if(
sBuffer[0] == '[')
            {
                
iKey 0;
                
copyc(xArray[GANG_SKIN_NAME], charsmax(xArray[GANG_SKIN_NAME]), sBuffer[1], ']');
                
iItemIndex ArraySize(garray_gang_skins);
                
ArrayPushArray(garray_gang_skinsxArray);
                continue;
            }
            
            if(
xArray[GANG_SKIN_NAME][0] != EOS && iItemIndex > -1)
            {
                
strtok(sBufferszKeycharsmax(szKey), sBuffercharsmax(sBuffer), '=');
                
trim(szKey);
                
trim(sBuffer);
                
remove_quotes(szKey);
                
remove_quotes(sBuffer);
                
                if(
equali(szKEYS[KEY_SKIN_MDL], szKeystrlen(szKey)) && !(iKey & (1<<KEY_SKIN_MDL)))
                {
                    
iKey |= (1<<KEY_SKIN_MDL);
                    
TrieSetString(gtrie_gang_skin_mdlsxArray[GANG_SKIN_NAME], sBuffer);
                    
formatex(xArray[GANG_SKIN_MDL], charsmax(xArray[GANG_SKIN_MDL]), sBuffer);
                    
ArraySetArray(garray_gang_skinsiItemIndexxArray);
                    
                    
formatex(sBuffercharsmax(sBuffer), "models/player/%s/%s.mdl"xArray[GANG_SKIN_MDL], xArray[GANG_SKIN_MDL]);
                    
precache_model(sBuffer);
                    
formatex(sBuffercharsmax(sBuffer), "models/player/%s/%sT.mdl"xArray[GANG_SKIN_MDL], xArray[GANG_SKIN_MDL]);
                    if(
file_exists(sBuffer)) precache_model(sBuffer);
                    continue;
                }
                if(
equali(szKEYS[KEY_SKIN_ACCESS], szKeystrlen(szKey)) && !(iKey & (1<<KEY_SKIN_ACCESS)))
                {
                    
iKey |= (1<<KEY_SKIN_ACCESS);
                    
xArray[GANG_SKIN_ACCESS] = read_flags(sBuffer);
                    
ArraySetArray(garray_gang_skinsiItemIndexxArray);
                }
            }
        }
        
fclose(fp);
    }
    
    
get_configsdir(sFilecharsmax(sFile))
    
formatex(GANGS_FILEcharsmax(GANGS_FILE), "%s/%s"sFilegang_file)
    
    if(!
file_exists(GANGS_FILE))
    {
        
write_file(GANGS_FILE"; [Gang name] ^"Gang Skin^"");
        
write_file(GANGS_FILE"; ^"Member Steamid^" ^"Member ingang status^" ^"Member nickname^"^n");
    }
    
    
fp fopen(GANGS_FILE"rt");
    
    if(
fp)
    {
        new 
xArray[GANGS_INFO], sBuffer[256], szAuthid[32], szGangStatus[8], szName[32];
        
        while(!
feof(fp))
        {
            
fgets(fpsBuffercharsmax(sBuffer));
            
trim(sBuffer);
            
            if(
sBuffer[0] == EOS || sBuffer[0] == ';' || strlen(sBuffer) <= || (sBuffer[0] == '/' && sBuffer[1] == '/'))
                continue;
            
            if(
sBuffer[0] == '[')
            {
                
copyc(xArray[GANG_NAME], charsmax(xArray[GANG_NAME]), sBuffer[1], ']');
                
                
strtok(sBuffer""0sBuffercharsmax(sBuffer), ']');
                
parse(sBufferszNamecharsmax(szName), sBuffercharsmax(sBuffer));
                
remove_quotes(szName);
                
remove_quotes(sBuffer);
                
                
xArray[GANG_KILLS] = str_to_num(sBuffer);
                
copy(xArray[GANG_SKIN], charsmax(xArray[GANG_SKIN]), szName);
                
                
xArray[GANG_ARRAY_MEMBERS] = _:ArrayCreate(32,1);
                
xArray[GANG_TRIE_MSTATUS] = _:TrieCreate();
                
xArray[GANG_TRIE_NAMES] = _:TrieCreate();
                
                
ArrayPushArray(garray_gangsxArray);
                continue;
            }
            
            if(
xArray[GANG_NAME][0] != EOS)
            {
                if(
parse(sBufferszAuthidcharsmax(szAuthid), szGangStatuscharsmax(szGangStatus), szNamecharsmax(szName)) == 3)
                {
                    
ArrayPushString(xArray[GANG_ARRAY_MEMBERS], szAuthid);
                    
TrieSetString(xArray[GANG_TRIE_MSTATUS], szAuthidszGangStatus)
                    
TrieSetString(xArray[GANG_TRIE_NAMES], szAuthidszName)
                }
            }
        }
        
fclose(fp);
    }
}

public 
plugin_init()
{
    
register_plugin(PLUGINVERSIONAUTHOR)
    
    
g_cvar_gang_cost register_cvar("jb_gang_creating_cost""100000");
    
g_cvar_gang_skin_cost register_cvar("jb_gang_skin_cost""20000");
    
g_cvar_show_gang_info register_cvar("jb_gang_show_info_len""0");
    
    
mm_itemid_gang register_jailbreak_mmitem("Gang Menu"_TEAM_PRISONERS)
    
    
register_event("StatusValue""fw_statusvalue""be""1=2");
    
    
register_menucmd(register_menuid("GANG_MAIN_MENU"), MENU_KEYS"gang_mainmenu_handler")
    
    
register_clcmd("enter_gang_name""clcmd_enter_gang_name")
    
register_clcmd("search_for""clcmd_search_for")
    
    
register_clcmd("say /mygang""ShowGang")
    
    
RegisterHam(Ham_Spawn"player""fw_player_respawn_post"1)
    
RegisterHam(Ham_Killed"player""fw_player_killed_post"1)
    
    
register_clcmd("amx_gangsmenu""clcmd_gangsmenu"ADMIN_ALL|ADMIN_IMMUNITY"show all gangs")
    
    
cvar_maxmembers_slots register_cvar("jb_gang_max_memberslots""5");
    
    
g_msgStatusText get_user_msgid("StatusText");
    
    
ColorMode register_cvar("colorchat_mode""1");
    
    
register_clcmd("say""hook_say");
    
register_clcmd("say_team""hook_team_say");
    
    
TeamInfo get_user_msgid("TeamInfo");
    
SayText get_user_msgid("SayText");
    
MaxSlots get_maxplayers();
}

public 
plugin_cfg()
{
    new 
maxslots get_pcvar_num(cvar_maxmembers_slots);
    
    for(new 
imaxloop ArraySize(garray_gangs), xArray[GANGS_INFO]; maxloopi++)
    {
        
ArrayGetArray(garray_gangsixArray);
        
TrieSetCell(gtrie_gang_maxslotsxArray[GANG_NAME], maxslots);
    }
}

public 
fw_statusvalue(id)
{
    new 
target read_data(2);
    
    if(!
target && read_data(1) > 0)
    {
        
show_gang_info(ididget_pcvar_num(g_cvar_show_gang_info))
        return;
    }
    
    if(!
check_flag(g_user_alive,id) ||
          !
check_flag(g_user_alive,target) ||
             
user_gang_data[target][USER_GANG_STATUS] == NOT_INGANG)
         return;
    
    if(
get_user_team(target) == TEAM_PRISONERS && get_user_team(id) == TEAM_PRISONERS)
    {
        
show_gang_info(idtargetget_pcvar_num(g_cvar_show_gang_info))
    }
}

public 
ShowGang(id)
{
    
CC_SendMessage(id"Your Gangs: %s"user_gang_data[id][USER_GANG_NAME])
    
CC_SendMessage(id"Your Gangs: %s"USER_STATUS[user_gang_data[id][USER_GANG_STATUS]])
}

public 
hook_say(id) {

    static 
text2[200];
    
read_args(text2199);
    
remove_quotes(text2);
    
trim(text2);
    
    new 
name[32];
    
get_user_name(idname31);
    
    if(
equal(text2""))
        return 
PLUGIN_HANDLED;
        
    if(
user_gang_data[id][USER_GANG_STATUS] == NOT_INGANG)
    {
        return;
    }

    switch(
get_pcvar_num(ColorMode)) {
        case 
1
        {
            if(
is_user_alive(id))
                
ColorChat(0RED"(%s) [%s]^x01%s : ^x03%s"USER_STATUS[user_gang_data[id][USER_GANG_STATUS]], user_gang_data[id][USER_GANG_NAME], nametext2);
            else
                
ColorChat(0RED"^x01*DEAD* (%s) [%s] %s : ^x03%s"USER_STATUS[user_gang_data[id][USER_GANG_STATUS]], user_gang_data[id][USER_GANG_NAME], nametext2);
        }
        case 
2
        {
            if(
is_user_alive(id))
                
ColorChat(0GREEN"(%s) [%s]^x01%s : ^x04%s"USER_STATUS[user_gang_data[id][USER_GANG_STATUS]], user_gang_data[id][USER_GANG_NAME], nametext2);
            else
                
ColorChat(0GREEN"^x01*DEAD* (%s) [%s] %s : ^x04%s"USER_STATUS[user_gang_data[id][USER_GANG_STATUS]], user_gang_data[id][USER_GANG_NAME], nametext2);
        }
        case 
3
        {
            if(
is_user_alive(id))
                
ColorChat(0BLUE"(%s) [%s]^x01%s : ^x03%s"USER_STATUS[user_gang_data[id][USER_GANG_STATUS]], user_gang_data[id][USER_GANG_NAME], nametext2);
            else
                
ColorChat(0BLUE"^x01*DEAD* (%s) [%s] %s : ^x03%s"USER_STATUS[user_gang_data[id][USER_GANG_STATUS]], user_gang_data[id][USER_GANG_NAME], nametext2);
        }
    }
    
    return 
PLUGIN_HANDLED;
}

public 
hook_team_say(id) {
    if(!
get_pcvar_num(ColorMode))
        return 
PLUGIN_CONTINUE;
        
    static 
text2[200];
    
read_args(text2199);
    
remove_quotes(text2);
    
trim(text2);
    
    new 
name[32];
    
get_user_name(idname31);
    
    if(
equal(text2""))
        return 
PLUGIN_HANDLED;

    switch(
get_pcvar_num(ColorMode)) {
        case 
1
        {
            if((
is_user_alive(id) == 0))
                
ColorChat(0RED"^x01*DEAD* (%s) [ %s %s : ^x03%s"nametext2);
            else
                
ColorChat(0RED"%s : %s"nametext2);
        }
        case 
2
        {
            if((
is_user_alive(id) == 0))
                
ColorChat(0GREEN"^x01*DEAD* %s : ^x04%s"nametext2);
            else
                
ColorChat(0GREEN"%s : %s"nametext2);
        }
        case 
3
        {
            if((
is_user_alive(id) == 0))
                
ColorChat(0BLUE"^x01*DEAD* %s : ^x03%s"nametext2);
            else
                
ColorChat(0BLUE"%s : %s"nametext2);
        }
    }
    
    return 
PLUGIN_HANDLED;
}

public 
ColorChat(idColor:type, const msg[], {Float,Sql,Result,_}:...)
{
    static 
message[256];

    switch(
type)
    {
        case 
YELLOW// Yellow
        
{
            
message[0] = 0x01;
        }
        case 
GREEN// Green
        
{
            
message[0] = 0x04;
        }
        default: 
// White, Red, Blue
        
{
            
message[0] = 0x03;
        }
    }

    
vformat(message[1], 251msg4);

    
// Make sure message is not longer than 192 character. Will crash the server.
    
message[192] = '^0';

    new 
teamColorChangeindexMSG_Type;
    
    if(!
id)
    {
        
index FindPlayer();
        
MSG_Type MSG_ALL;
    
    } else {
        
MSG_Type MSG_ONE;
        
index id;
    }
    
    
team get_user_team(index);    
    
ColorChange ColorSelection(indexMSG_Typetype);

    
ShowColorMessage(indexMSG_Typemessage);
        
    if(
ColorChange)
    {
        
Team_Info(indexMSG_TypeTeamName[team]);
    }
}

ShowColorMessage(idtypemessage[])
{
    
emessage_begin(typeSayText_id);
    
ewrite_byte(id)        
    
ewrite_string(message);
    
emessage_end();    
}

Team_Info(idtypeteam[])
{
    
emessage_begin(typeTeamInfo_id);
    
ewrite_byte(id);
    
ewrite_string(team);
    
emessage_end();

    return 
1;
}

ColorSelection(indextypeColor:Type)
{
    switch(
Type)
    {
        case 
RED:
        {
            return 
Team_Info(indextypeTeamName[1]);
        }
        case 
BLUE:
        {
            return 
Team_Info(indextypeTeamName[2]);
        }
        case 
GREY:
        {
            return 
Team_Info(indextypeTeamName[0]);
        }
    }

    return 
0;
}

FindPlayer()
{
    new 
= -1;

    while(
<= MaxSlots)
    {
        if(
IsConnected[++i])
        {
            return 
i;
        }
    }

    return -
1;
}

public 
clcmd_gangsmenu(idlevelcid)
{
    if(!
cmd_access(idlevelcid1))
        return 
PLUGIN_HANDLED;
    
    new 
total_gangs;
    if(!(
total_gangs=ArraySize(garray_gangs)))
    {
        
console_print(id"No gangs were found!")
        return 
PLUGIN_HANDLED;
    }
    
    new 
menu menu_create("\rADMIN GANGS PANEL\y!""gangsmenu_handler")
    
    for(new 
iszGangID[10], xArray[GANGS_INFO]; total_gangsi++)
    {
        
ArrayGetArray(garray_gangsixArray);
        
num_to_str(iszGangIDcharsmax(szGangID));
        
menu_additem(menuxArray[GANG_NAME], szGangID);
    }
    
    
menu_display(idmenu)
    return 
PLUGIN_HANDLED;
}

public 
gangsmenu_handler(idmenuitem)
{
    if(
item == MENU_EXIT)
    {
        
menu_destroy(menu)
        return 
PLUGIN_HANDLED;
    }
    
    new 
paccesscallbacksData[10];
    
menu_item_getinfo(menuitempaccesssDatacharsmax(sData), ""0callback)
    
menu_destroy(menu);
    
    
apanel_gang_info(idstr_to_num(sData));
    return 
PLUGIN_HANDLED;
}

apanel_gang_info(idgangid)
{
    new 
sText[196], xArray[GANGS_INFO], szOwner[32];
    
ArrayGetArray(garray_gangsgangidxArray);
    
    
formatex(gang_name_edition[id], charsmax(gang_name_edition[]), xArray[GANG_NAME])
    
    
// seeking for the gang owner name...
    
for(new iszStatus[8], maxloop ArraySize(xArray[GANG_ARRAY_MEMBERS]); maxloopi++)
    {
        
ArrayGetString(xArray[GANG_ARRAY_MEMBERS], iszOwnercharsmax(szOwner))
        
TrieGetString(xArray[GANG_TRIE_MSTATUS], szOwnerszStatuscharsmax(szStatus))
        if(
equali(USER_STATUS[GANG_OWNER], szStatus))
        {
            break;
        }
    }
    
    new 
iOwner// getting the owner name;
    
if((iOwner find_player("c"szOwner)) > 0)
    {
        
get_user_name(iOwnerszOwnercharsmax(szOwner));
    }
    else
    {
        
TrieGetString(xArray[GANG_TRIE_NAMES], szOwnerszOwnercharsmax(szOwner))
    }
    
    
formatex(sTextcharsmax(sText), "\
    \y-=[\rGANG INFORMATION\y]=-\
    ^n\rGANG-NAME: \y%s^n\
    \rGANG-SKIN: \y%s^n\
    \rGANG-OWNER: \y%s^n\
    \rGANG-MEMBERS: \y%d\
    \rGANG-KILLS: \y%d"
,
    
xArray[GANG_NAME], xArray[GANG_SKIN], szOwnerArraySize(xArray[GANG_ARRAY_MEMBERS]), xArray[GANG_KILLS])
    new 
menu menu_create(sText"apanel_handler")
    
    new 
szGangID[10]; num_to_str(gangidszGangIDcharsmax(szGangID));
    
menu_additem(menu"Delete the Gang!"szGangID)
    
menu_additem(menu"Reset Gang Kills!"szGangID)
    
    
menu_display(idmenu)
}

public 
apanel_handler(idmenuitem)
{
    if(
item == MENU_EXIT)
    {
        
menu_destroy(menu);
        return 
PLUGIN_HANDLED;
    }
    
    new 
sData[10], paccesscallback;
    
    if(
menu > -1000)
    {
        
menu_item_getinfo(menuitempaccesssDatacharsmax(sData), ""0callback);
        
menu_destroy(menu);
    }
    else
    {
        
num_to_str(-(menu 1000), sDatacharsmax(sData))
    }
    
    new 
iGangID str_to_num(sData), xArray[GANGS_INFO];
    
    if((
<= iGangID ArraySize(garray_gangs)))
    {
        
ArrayGetArray(garray_gangsiGangIDxArray);
    }
    
    if(!
equal(gang_name_edition[id], xArray[GANG_NAME]) && menu > -1000)
    {
        
cprint_chat(id_"The !g%s !ygang is not !texisted!g!"gang_name_edition[id])
        return 
PLUGIN_HANDLED;
    }
    
    new 
szAdminName[32];
    
get_user_name(idszAdminNamecharsmax(szAdminName))
    
    new 
sBuffer[256], szGangname[32];
    
    new 
fp fopen(GANGS_FILE"rt"), sFile2[128];
    
    
formatex(sFile2charsmax(sFile2), "%s2"GANGS_FILE)
    new 
fp2 fopen(sFile2"wt");
    
    if(!
fp2 || !fp)
    {
        
log_error(AMX_ERR_GENERAL"failed to create a file '%s'"sFile2)
        return 
PLUGIN_HANDLED;
    }
    
    switch( 
item )
    {
        case 
0:
        {
            new 
bool:bRemoval=false;
            
            
fseek(fp0SEEK_SET);
            while(!
feof(fp))
            {
                
fgets(fpsBuffercharsmax(sBuffer));
                
trim(sBuffer);
                
                if(
sBuffer[0] == EOS || sBuffer[0] == ';' || strlen(sBuffer) <= || (sBuffer[0] == '/' && sBuffer[1] == '/'))
                {
                    
fputs(fp2sBuffer);
                    
fputc(fp2'^n');
                    continue;
                }
                
                if(
sBuffer[0] == '[')
                {
                    
bRemoval false;
                    
                    
copyc(szGangnamecharsmax(szGangname), sBuffer[1], ']');
                    if(
equal(szGangnamexArray[GANG_NAME]))
                    {
                        
bRemoval true;
                    }
                }
                
                if(
bRemoval)
                {
                    
format(sBuffercharsmax(sBuffer), "; %s"sBuffer);
                    
fputs(fp2sBuffer);
                    
fputc(fp2'^n');
                    continue;
                }
                
                
fputs(fp2sBuffer);
                
fputc(fp2'^n');
            }
            
fclose(fp);
            
fclose(fp2);
            
            
delete_file(GANGS_FILE);
            
            if(!
rename_file(sFile2GANGS_FILE1))
            {
                
delete_file(sFile2);
            }
            
            
            
ArrayDeleteItem(garray_gangsiGangID);
            
ArrayDestroy(xArray[GANG_ARRAY_MEMBERS]);
            
TrieDestroy(xArray[GANG_TRIE_MSTATUS]);
            
TrieDestroy(xArray[GANG_TRIE_NAMES]);
            
            new 
players[32],pnum;
            
get_players(playerspnum"ch")
            
            for(new 
iplayerpnumi++)
            {
                
player players[i];
                
                if(
equal(xArray[GANG_NAME], user_gang_data[player][USER_GANG_NAME]))
                {
                    
user_gang_data[player][USER_GANG_STATUS] = NOT_INGANG;
                    
user_gang_data[player][USER_GANG_ID] = -1;
                    
user_gang_data[player][USER_GANG_NAME][0] = EOS;
                    
user_gang_data[player][USER_GANG_SKIN][0] = EOS;
                }
            }
            
            if(
menu > -1000)
            {
                
cprint_chat(0_"!gAdmin !t%s !yhas deleted the !g%s !tGang!y."szAdminNamexArray[GANG_NAME]);
                
formatex(sBuffercharsmax(sBuffer), "ADMIN %s HAS DELETED THE %s GANG"szAdminNamexArray[GANG_NAME])
            }
            else
            {
                
cprint_chat(0_"!g%s !tGang !yhas been !gdestroyed!"xArray[GANG_NAME])
                
formatex(sBuffercharsmax(sBuffer), "OWNER %s HAS LEFT THE %s GANG AND THEREFORE ITS BEEN REMOVED!"szAdminNamexArray[GANG_NAME])
            }
            
            
log_amx(sBuffer);
            
jb_logmessage(sBuffer);
        }
        default:
        {
            
fseek(fp0SEEK_SET);
            while(!
feof(fp))
            {
                
fgets(fpsBuffercharsmax(sBuffer));
                
trim(sBuffer);
                
                if(
sBuffer[0] == EOS || sBuffer[0] == ';' || strlen(sBuffer) <= || (sBuffer[0] == '/' && sBuffer[1] == '/'))
                {
                    
fputs(fp2sBuffer);
                    
fputc(fp2'^n');
                    continue;
                }
                
                if(
sBuffer[0] == '[')
                {
                    
copyc(szGangnamecharsmax(szGangname), sBuffer[1], ']')
                    if(
equal(szGangnamexArray[GANG_NAME]))
                    {
                        
formatex(sBuffercharsmax(sBuffer), "[%s] ^"%s^" ^"0^""xArray[GANG_NAME], xArray[GANG_SKIN])
                        
xArray[GANG_KILLS] = 0;
                        
                        
cprint_chat(0_"!gAdmin !t%s !yhas reset the !g%s !tGang kills!y."szAdminNamexArray[GANG_NAME])
                        
                        
formatex(sBuffercharsmax(sBuffer), "ADMIN %s HAS RESET THE %s GANG KILLS"szAdminNamexArray[GANG_NAME])
                        
log_amx(sBuffer);
                        
jb_logmessage(sBuffer);
                    }
                }
                
                
fputs(fp2sBuffer);
                
fputc(fp2'^n');
            }
            
fclose(fp);
            
fclose(fp2);
            
            
delete_file(GANGS_FILE);
            
            if(!
rename_file(sFile2GANGS_FILE1))
            {
                
delete_file(sFile2);
            }
                
            
ArraySetArray(garray_gangsiGangIDxArray);
        }
    }
    return 
PLUGIN_HANDLED;
}

public 
fw_player_killed_post(victimattackershouldgib)
{
    
// attacker is connected and its not a suicide and the victim is not from the gang...
    
if(!is_user_connected(attacker) || victim == attacker) return;
    
    static 
killer_gangkiller_gang user_gang_data[attacker][USER_GANG_ID];
    if(
killer_gang != user_gang_data[victim][USER_GANG_ID] &&
          
user_gang_data[attacker][USER_GANG_STATUS] != NOT_INGANG)
    {
        static 
xArray[GANGS_INFO];
        
ArrayGetArray(garray_gangskiller_gangxArray);
        
xArray[GANG_KILLS] ++;
        
ArraySetArray(garray_gangskiller_gangxArray);
        
        static 
fpfp2sFile2[128];
        
fp fopen(GANGS_FILE"rt");
        
        
formatex(sFile2charsmax(sFile2), "%s2"GANGS_FILE)
        
fp2 fopen(sFile2"wt");
        
        if(!
fp2 || !fp)
        {
            
log_error(AMX_ERR_GENERAL"failed to create a file '%s'"sFile2)
            return;
        }
        
        static 
sBuffer[196], szGangname[32];
        
        
fseek(fp0SEEK_SET);
        while(!
feof(fp))
        {
            
fgets(fpsBuffercharsmax(sBuffer));
            
trim(sBuffer);
            
            if(
sBuffer[0] == EOS || sBuffer[0] == ';' || strlen(sBuffer) <= || (sBuffer[0] == '/' && sBuffer[1] == '/'))
            {
                
fprintf(fp2"%s^n"sBuffer);
                continue;
            }
            
            if(
sBuffer[0] == '[')
            {
                
copyc(szGangnamecharsmax(szGangname), sBuffer[1], ']')
                if(
equal(szGangnamexArray[GANG_NAME]))
                {
                    
formatex(sBuffercharsmax(sBuffer), "[%s] ^"%s^" ^"%d^""xArray[GANG_NAME], xArray[GANG_SKIN], xArray[GANG_KILLS])
                }
            }
            
            
fputs(fp2sBuffer);
            
fputc(fp2'^n');
        }
        
fclose(fp);
        
fclose(fp2);
        
        
delete_file(GANGS_FILE);
        
        if(!
rename_file(sFile2GANGS_FILE1)) delete_file(sFile2);
    }
}

public 
fw_player_respawn_post(id)
{
    if(!
is_user_alive(id)) return;
    
    
set_flag(g_user_alive,id);
    
    if(
user_gang_data[id][USER_GANG_STATUS] == NOT_INGANG || get_user_team(id) != TEAM_PRISONERS)
    {
        return;
    }
    
    new 
sString[32], szModel[32];
    
copy(sStringcharsmax(sString), user_gang_data[id][USER_GANG_SKIN]);
    if(!
equali(sString"None") && sString[0] != EOS)
    {
        
TrieGetString(gtrie_gang_skin_mdlssStringszModelcharsmax(szModel));
        
cs_set_player_model(idszModel)
    }
}

public 
plugin_natives()
{
    
register_native("jb_get_user_gang_status""_get_user_gang_status");
    
register_native("jb_get_user_gang_name""_get_user_gang_name");
    
register_native("jb_get_user_gang_kills""_get_user_gang_kills");
    
register_native("jb_set_user_gang""_set_user_gang");
    
register_native("jb_remove_user_fromgang""_remove_user_fromgang");
    
register_native("jb_set_gang_maxslots""_set_gang_maxslots")
    
register_native("jb_get_gang_maxslots""_get_gang_maxslots")
}

public 
_set_gang_maxslots(pluginarg)
{
    new 
xArray[GANGS_INFO];
    
ArrayGetArray(garray_gangsget_param(1), xArray);
    
TrieSetCell(gtrie_gang_maxslotsxArray[GANG_NAME], get_param(2));
}

public 
_get_gang_maxslots(pluginarg)
{
    new 
xArray[GANGS_INFO], iValue;
    
ArrayGetArray(garray_gangsget_param(1), xArray);
    
TrieGetCell(gtrie_gang_maxslotsxArray[GANG_NAME], iValue);
    return 
iValue
}

public 
_get_user_gang_kills(pluginarg)
{
    new 
xArray[GANGS_INFO];
    
ArrayGetArray(garray_gangsuser_gang_data[get_param(1)][USER_GANG_ID], xArray);
    return 
xArray[GANG_KILLS];
}

public 
_get_user_gang_status(pluginarg) return user_gang_data[get_param(1)][USER_GANG_STATUS];

public 
_get_user_gang_name(pluginargset_string(2user_gang_data[get_param(1)][USER_GANG_NAME], get_param(3));

public 
_set_user_gang(pluginarg)
{
    new 
szAuthid[32];
    
get_string(1szAuthidcharsmax(szAuthid));
    
set_user_gang(szAuthidget_param(2), get_param(3));
}

public 
_remove_user_fromgang(pluginargc)
{
    new 
szAuthid[32];
    
get_string(1szAuthidcharsmax(szAuthid));
    
remove_user_fromgang(szAuthidget_param(2));
}

public 
client_authorized(id)
{
    
load_user_gang(id)
    
    
g_user_rejected_inv[id] = 0;
    
g_user_rejected_req[id] = 0;
}

public 
client_disconnect(id)
{
    
remove_flag(g_user_alive,id);
}

load_user_gang(id)
{
    
user_gang_data[id][USER_GANG_STATUS] = NOT_INGANG;
    
user_gang_data[id][USER_GANG_ID] = -1;
    
user_gang_data[id][USER_GANG_NAME][0] = EOS;
    
user_gang_data[id][USER_GANG_SKIN][0] = EOS;
    
    new 
xArray[GANGS_INFO], szAuthid[32];
    
get_user_authid(idszAuthidcharsmax(szAuthid))
    for(new 
imaxloop ArraySize(garray_gangs); maxloopi++)
    {
        
ArrayGetArray(garray_gangsixArray)
        if(
TrieKeyExists(xArray[GANG_TRIE_MSTATUS], szAuthid))
        {
            new 
szStatus[10];
            
TrieGetString(xArray[GANG_TRIE_MSTATUS], szAuthidszStatuscharsmax(szStatus))
            
user_gang_data[id][USER_GANG_ID] = i;
            
copy(user_gang_data[id][USER_GANG_NAME], charsmax(user_gang_data[][USER_GANG_NAME]), xArray[GANG_NAME])
            
copy(user_gang_data[id][USER_GANG_SKIN], charsmax(user_gang_data[][USER_GANG_SKIN]), xArray[GANG_SKIN])
            
            switch( 
szStatus[0] )
            {
                case 
'm','M'user_gang_data[id][USER_GANG_STATUS] = GANG_MEMBER;
                case 
'o','O'user_gang_data[id][USER_GANG_STATUS] = GANG_OWNER;
                case 
'l','L'user_gang_data[id][USER_GANG_STATUS] = GANG_LEADER;
            }
            
            break;
        }
    }
}

set_user_gang(const szAuthid[], gangstatus)
{
        
    new 
xArray[GANGS_INFO], szName[32];
    
ArrayGetArray(garray_gangsgangxArray);
    
    if(
TrieKeyExists(xArray[GANG_TRIE_NAMES],szAuthid))
    {
        
TrieGetString(xArray[GANG_TRIE_NAMES], szAuthidszNamecharsmax(szName))
    }
    
    new 
id find_player("c"szAuthid);
    if(
id 0get_user_name(idszNamecharsmax(szName));
    
    
remove_user_fromgang(szAuthidgang);
    
    new 
fp fopen(GANGS_FILE"rt"), sFile2[128];
    
    
formatex(sFile2charsmax(sFile2), "%s2"GANGS_FILE)
    new 
fp2 fopen(sFile2"wt");
    
    if(!
fp || !fp2)
    {
        
fclose(fp);
        
fclose(fp2);
        return;
    }
    new 
szGangname[32], sBuffer[256];
    
    while(!
feof(fp))
    {
        
fgets(fpsBuffercharsmax(sBuffer));
        
trim(sBuffer);
        
        if(
sBuffer[0] == EOS || 
               
sBuffer[0] == ';' || 
                 (
sBuffer[0] == '/' && sBuffer[1] == '/') || 
                
strlen(sBuffer) <= 3)
        {
            
fprintf(fp2"%s^n"sBuffer);
            continue;
        }
        
        if(
sBuffer[0] == '[')
        {
            
copyc(szGangnamecharsmax(szGangname), sBuffer[1], ']');
            
            if(
equal(szGangnamexArray[GANG_NAME]))
            {
                
format(sBuffercharsmax(sBuffer), "%s^n\
                ^"
%s^" ^"%s^" ^"%s^""sBufferszAuthidUSER_STATUS[status], szName);
                
                
ArrayPushString(xArray[GANG_ARRAY_MEMBERS], szAuthid);
                
TrieSetString(xArray[GANG_TRIE_NAMES], szAuthidszName);
                
TrieSetString(xArray[GANG_TRIE_MSTATUS], szAuthidUSER_STATUS[status]);
                if(
id 0)
                {
                    
user_gang_data[id][USER_GANG_ID] = gang;
                    
copy(user_gang_data[id][USER_GANG_NAME], charsmax(user_gang_data[][USER_GANG_NAME]), xArray[GANG_NAME]);
                    
copy(user_gang_data[id][USER_GANG_SKIN], charsmax(user_gang_data[][USER_GANG_SKIN]), xArray[GANG_SKIN]);
                    
user_gang_data[id][USER_GANG_STATUS] = status;
                }
            }
        }
        
        
fputs(fp2sBuffer);
        
fputc(fp2'^n');
    }
    
fclose(fp);
    
fclose(fp2);
    
    
delete_file(GANGS_FILE)
    
    if(!
rename_file(sFile2GANGS_FILE1))
    {
        
delete_file(sFile2);
    }
}

remove_user_fromgang(const szAuthid[], gangid)
{
    new 
xArray[GANGS_INFO];
    
ArrayGetArray(garray_gangsgangidxArray);
    
    new 
fp fopen(GANGS_FILE"rt"), sFile2[128];
    
    
formatex(sFile2charsmax(sFile2), "%s2"GANGS_FILE)
    new 
fp2 fopen(sFile2"wt");
    
    if(!
fp || !fp2)
    {
        
fclose(fp);
        
fclose(fp2);
        return;
    }
    
    new 
szAuthid2[32], sBuffer[256];
    
    while(!
feof(fp))
    {
        
fgets(fpsBuffercharsmax(sBuffer));
        
trim(sBuffer);
        
        if(
sBuffer[0] == EOS || 
               
sBuffer[0] == ';' || 
                 (
sBuffer[0] == '/' && sBuffer[1] == '/') || 
                
strlen(sBuffer) <= 3)
        {
            
fprintf(fp2"%s^n"sBuffer);
            continue;
        }
        
        
parse(sBufferszAuthid2charsmax(szAuthid2));
        
remove_quotes(szAuthid2);
        
        if(
equal(szAuthid2szAuthid))
        {
            
format(sBuffercharsmax(sBuffer), "; %s"sBuffer);
        }
        
        
fputs(fp2sBuffer);
        
fputc(fp2'^n');
    }
    
fclose(fp);
    
fclose(fp2);
    
    
delete_file(GANGS_FILE)
    
    if(!
rename_file(sFile2GANGS_FILE1))
    {
        
delete_file(sFile2);
    }
    
    for(new 
iszString[32], maxloop ArraySize(xArray[GANG_ARRAY_MEMBERS]); maxloopi++)
    {
        
ArrayGetString(xArray[GANG_ARRAY_MEMBERS], iszStringcharsmax(szString))
        if(
equal(szStringszAuthid))
        {
            
ArrayDeleteItem(xArray[GANG_ARRAY_MEMBERS], i);
            break;
        }
    }
    
    
TrieDeleteKey(xArray[GANG_TRIE_NAMES], szAuthid);
    
TrieDeleteKey(xArray[GANG_TRIE_MSTATUS], szAuthid);
    
    new 
id find_player("c"szAuthid);
    
    if(!
ArraySize(xArray[GANG_ARRAY_MEMBERS]) || (id && user_gang_data[id][USER_GANG_STATUS] == GANG_OWNER))
    {
        
apanel_handler(id, ((-gangid) - 1000), 0)
    }
    
    if(
id 0)
    {
        
user_gang_data[id][USER_GANG_ID] = -1;
        
user_gang_data[id][USER_GANG_NAME][0] = EOS;
        
user_gang_data[id][USER_GANG_SKIN][0] = EOS;
        
user_gang_data[id][USER_GANG_STATUS] = NOT_INGANG;
    }
}

public 
clcmd_search_for(id)
{
    if(
user_gang_data[id][USER_GANG_STATUS] == NOT_INGANG) return PLUGIN_HANDLED;
    
    new 
sString[32];
    
read_args(sStringcharsmax(sString))
    
remove_quotes(sString)
    
    
formatex(user_find_members[id], charsmax(user_find_members[]), sString)
    
gang_members_menu(idg_userpage[id])
    return 
PLUGIN_HANDLED;
}

public 
clcmd_enter_gang_name(id)
{
    if(!(
check_flag(g_user_ingang_creation,id)) || user_gang_data[id][USER_GANG_STATUS] != NOT_INGANG)
    {
        return 
PLUGIN_HANDLED;
    }
    
    new 
sString[32];
    
read_args(sStringcharsmax(sString))
    
remove_quotes(sString)
    
    if(
strlen(sString) <= 3)
    {
        
formatex(user_gang_data[id][USER_GANG_NAME], charsmax(user_gang_data[][USER_GANG_NAME]), "Gang name is too short!")
        
set_flag(g_user_cant_create_agang,id)
        
gang_creation(id);
        return 
PLUGIN_HANDLED;
    }
    
    for(new 
ixArray[GANGS_INFO], maxloop ArraySize(garray_gangs); maxloopi++)
    {
        
ArrayGetArray(garray_gangsixArray)
        if(
equali(xArray[GANG_NAME], sString))
        {
            
formatex(user_gang_data[id][USER_GANG_NAME], charsmax(user_gang_data[][USER_GANG_NAME]), "Gang name is not valid!")
            
set_flag(g_user_cant_create_agang,id)
            
gang_creation(id);
            return 
PLUGIN_HANDLED;
        }
    }
    
    
remove_flag(g_user_cant_create_agang,id)
    
formatex(user_gang_data[id][USER_GANG_NAME], charsmax(user_gang_data[][USER_GANG_NAME]), sString)
    
gang_creation(id)
    return 
PLUGIN_HANDLED;
}

show_gang_info(idtargetlen)
{
    if(
user_gang_data[target][USER_GANG_STATUS] == NOT_INGANG)
    {
        return;
    }
    
    new 
xArray[GANGS_INFO], sString[196];
    
ArrayGetArray(garray_gangsuser_gang_data[target][USER_GANG_ID], xArray);
    
    
formatex(sStringcharsmax(sString), "%s of %s Gang.",
        
USER_STATUS[user_gang_data[target][USER_GANG_STATUS]], xArray[GANG_NAME])
    
message_begin(MSG_ONE_UNRELIABLEg_msgStatusText, {0,0,0}, id)
    
write_byte(len
    
write_string(sString)
    
message_end()
}

public 
jb_mm_itemselected(iditemid)
{
    if(
itemid == mm_itemid_gang)
    {
        
gang_mainmenu(id);
    }
}

public 
gang_mainmenu(id)
{
    new 
sMenu[256], iLeniKeys;
    
    if(
user_gang_data[id][USER_GANG_STATUS] == NOT_INGANG)
    {
        
iLen formatex(sMenucharsmax(sMenu), "You're currently not participating in any gang!^n^n")
        
        if(
jb_get_user_cash(id) > get_pcvar_num(g_cvar_gang_cost))
        {
            
iKeys |= MENU_KEY_1;
            
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\w1\r. \wCREATE A GANG \r( \y%d$ \r)^n^n"get_pcvar_num(g_cvar_gang_cost))
        }
        else
            
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\d1. CREATE A GANG ( %d$ )^n^n"get_pcvar_num(g_cvar_gang_cost))
        
        
iKeys |= MENU_KEY_3;
        
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\w3\r. \wJOIN A GANG\r!^n")
    }
    else
    {
        
iLen formatex(sMenu[iLen], charsmax(sMenu), "You're participating in \r[%s] \yGANG!^n\rPosition: \w%s^n^n",
            
user_gang_data[id][USER_GANG_NAME], USER_STATUS[user_gang_data[id][USER_GANG_STATUS]])
        
        if(
user_gang_data[id][USER_GANG_STATUS] > GANG_MEMBER)
        {
            
iKeys |= MENU_KEY_1;
            
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\w1\y. \rLeaders Only^n");
        }
        else 
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\d1. Leaders Only^n")
        
        
iKeys |= MENU_KEY_2;
        
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\w2\y. \rInvite a person!^n")
        
        
iKeys |= MENU_KEY_3;
        
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\w3\y. \rGANG \yMembers!^n^n")
        
        
iKeys |= MENU_KEY_5;
        
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\w5\y. \rLeave The GANG!^n")
    }
    
    
iKeys |= MENU_KEY_7;
    
iLen += formatex(sMenu[iLen], charsmax(sMenu), "^n\r7. \wAVAILABLE GANGS \r!^n")
    
    
iKeys |= MENU_KEY_8;
    
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\r8. \wTOP \y%d \rGANGS!^n^n"SHOW_TOP_GANGS)
    
    
iKeys |= MENU_KEY_0;
    
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\w0\y. \rExit!")
    
    
show_menu(idiKeyssMenu_"GANG_MAIN_MENU")
}

public 
gang_mainmenu_handler(idkey)
{
    if(
key == 9)
    {
        return 
PLUGIN_HANDLED;
    }
    if(
key == 6)
    {
        
g_userpage[id] = 0;
        
available_gangmenu(id0);
        return 
PLUGIN_HANDLED;
    }
    if(
key == 7)
    {
        
show_top_gangs(id)
        return 
PLUGIN_HANDLED;
    }
    
    if(
user_gang_data[id][USER_GANG_STATUS] == NOT_INGANG)
    {
        switch( 
key )
        {
            case 
0// key number 1
            
{
                
formatex(user_gang_data[id][USER_GANG_SKIN], charsmax(user_gang_data[][USER_GANG_SKIN]), "None")
                
formatex(user_gang_data[id][USER_GANG_NAME], charsmax(user_gang_data[][USER_GANG_NAME]), "Type in your gang name!")
                
set_flag(g_user_cant_create_agang,id);
                
gang_creation(id)
            }
            case 
2// key number 3
            
{
                
join_gang_menu(id);
            }
        }
    }
    else
    {
        switch( 
key )
        {
            case 
0// key number 1
            
{
                
g_userpage[id] = 0;
                
leader_menu(id0);
            }
            case 
1// key number 2
            
{
                
invite_gang_menu(id)
            }
            case 
2// key number 3
            
{
                
g_userpage[id] = 0;
                
formatex(user_find_members[id], charsmax(user_find_members[]), "")
                
gang_members_menu(id0)
            }
            case 
4// key number 5
            
{
                
confirmation_menu(id"Are you sure you want to \rleave the gang!?""player_left_gang")
            }
        }
    }
    
    return 
PLUGIN_HANDLED;
}

show_top_gangs(id)
{
    new 
maxloop ArraySize(garray_gangs);
    if(!
maxloop)
    {
        
cprint_chat(id_"There's no gangs available yet!")
        return;
    }
    
    new Array:
array_topgangs ArrayCreate(68,1), xArray[GANGS_INFO], count;
    
    if(
count maxloop <= SHOW_TOP_GANGScount maxloop;
    
    for(new 
imaxloopi++)
    {
        
ArrayGetArray(garray_gangsixArray);
        
ArrayPushArray(array_topgangsxArray);
    }
    
    
ArraySort(array_topgangs"SortTopGangs");
    
    new 
sBuffer[1536], iLen;
    
    
iLen formatex(sBuffercharsmax(sBuffer), "<html><head><style>.TITLES {color:black;font-size:8pt;font-weight:600;text-align:center;vertical-align:middle;background:#EFC929;}")
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"tr{color:black;font-size:8pt;font-weight:400;text-align:center;vertical-align:middle;}")
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"tr:nth-child(even){background-color: #C2D69A;}tr:nth-child(odd){background-color: #B6DDE8;}</style></head>")
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"<body><table align=center border='3' width=^"100%%^" style=^"border-collapse:collapse;^">")
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"<tr><td class=TITLES width=16px>ID</td><td class=TITLES>GANG NAME</td><td class=TITLES>GANG MEMBERS</td><td class=TITLES>GANG KILLS</td></tr>")
    
    for(new 
icounti++)
    {
        
ArrayGetArray(array_topgangsixArray);
        
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"<tr><td>%d</td><td>%s</td><td>%d</td><td>%d</td></tr>",
            (
i+1), xArray[GANG_NAME], ArraySize(xArray[GANG_ARRAY_MEMBERS]), xArray[GANG_KILLS])
    }
    
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"</table></body></html>")
    
    new 
sTitle[32]; formatex(sTitlecharsmax(sTitle), "TOP %d GANG!"count)
    
show_motd(idsBuffersTitle)
    
    
ArrayDestroy(array_topgangs);
}

public 
SortTopGangs(Array:array, item1item2, const data[], data_size)
{
    new 
xArray[GANGS_INFO], xArray2[GANGS_INFO];
    
ArrayGetArray(array,item1,xArray)
    
ArrayGetArray(array,item2,xArray2)
    
    if(
xArray[GANG_KILLS] > xArray2[GANG_KILLS])
        return -
1;
    
    if(
xArray[GANG_KILLS] < xArray2[GANG_KILLS])
        return 
1;
    
    return 
0;
}

public 
player_left_gang(id)
{
    if(
user_gang_data[id][USER_GANG_STATUS] == NOT_INGANG)
    {
        return;
    }
    
    new 
szName[32];
    
get_user_name(idszNamecharsmax(szName));
    
cprint_chat(0_"^4%s ^1has ^3left the ^4%s ^1gang^3!"szNameuser_gang_data[id][USER_GANG_NAME]);
    
    
get_user_authid(idszNamecharsmax(szName))
    
remove_user_fromgang(szNameuser_gang_data[id][USER_GANG_ID])
}

confirmation_menu(id, const reason[], const function[])
{
    new 
zmenu menu_create(reason"confirm_respone")
    
    
menu_additem(zmenu"\yYes!", function)
    
menu_additem(zmenu"\rNo!""")
    
    
menu_display(idzmenu)
}

public 
confirm_respone(idmenuitem)
{
    if(
item == MENU_EXIT)
    {
        
menu_destroy(menu)
        return;
    }
    
    if(
item == 0// key 1(yes)..
    
{
        new 
sData[32], paccesscallback;
        
menu_item_getinfo(menuitempaccesssDatacharsmax(sData), ""0callback)
        
        
callfunc_begin(sData"")
        
callfunc_push_int(id)
        
callfunc_end()
    }
    
    
menu_destroy(menu)
}

public 
gang_creation(id)
{
    
set_flag(g_user_ingang_creation,id);
    
    new 
sText[98], menu menu_create("Fill out the blankets!""gang_creation_handle"),
    
sInfo[20], gang_skin_cost get_pcvar_num(g_cvar_gang_skin_cost), szSkin[32];
    
copy(szSkincharsmax(szSkin), user_gang_data[id][USER_GANG_SKIN]);
    
    new 
total_costs get_pcvar_num(g_cvar_gang_cost) + (equali(szSkin"None") ? 0:gang_skin_cost);
    
    
formatex(sTextcharsmax(sText), "\r[GANG NAME]: \y%s"user_gang_data[id][USER_GANG_NAME])
    
menu_additem(menusText"1")
    
    if(
ArraySize(garray_gang_skins) && jb_get_user_cash(id) >= total_costs)
    {
        
formatex(sTextcharsmax(sText), "\r[GANG SKIN]: \y%s^nSkin Cost: \r%d$"szSkingang_skin_cost)
        
menu_additem(menusText"2")
    }
    else
    {
        
formatex(sTextcharsmax(sText), "\d[GANG SKIN]: %s^n\rSkin Cost: \d%d$"szSkingang_skin_cost)
        
menu_additem(menusText""NO_ACCESS)
    }
    
    
num_to_str(total_costssInfocharsmax(sInfo))
    
formatex(sTextcharsmax(sText), "%sSubmit!^n\wTotal \yCosts: \r%d$"check_flag(g_user_cant_create_agang,id) ? "\d":"\r"total_costs)
    
menu_additem(menusTextsInfocheck_flag(g_user_cant_create_agang,id) ? NO_ACCESS:0)
    
    
menu_display(idmenu)
}

public 
gang_creation_handle(idmenuitem)
{
    if(
item == MENU_EXIT)
    {
        
remove_flag(g_user_ingang_creation,id)
        
menu_destroy(menu);
        return 
PLUGIN_HANDLED;
    }
    
    new 
sData[15], paccessiCallback
    menu_item_getinfo
(menuitempaccesssDatacharsmax(sData), ""0iCallback)
    
    
menu_destroy(menu);
    
    new 
iValue str_to_num(sData);
    
    switch( 
iValue )
    {
        case 
1:
        {
            
client_cmd(id"messagemode enter_gang_name")
            return 
PLUGIN_HANDLED;
        }
        case 
2:
        {
            
skins_menu(id);
            return 
PLUGIN_HANDLED;
        }
        case 
3:
        {
            
gang_creation(id)
            return 
PLUGIN_HANDLED;
        }
    }
    
    if(
check_flag(g_user_cant_create_agang,id))
    {
        
gang_creation(id)
        return 
PLUGIN_HANDLED;
    }
    
    for(new 
ijmaxloop ArraySize(garray_gangs), 
            
xArray[GANGS_INFO]; maxloopi++)
    {
        
ArrayGetArray(garray_gangsjxArray);
        if(
equal(xArray[GANG_SKIN_MDL], user_gang_data[id][USER_GANG_SKIN]))
        {
            
iValue -= get_pcvar_num(g_cvar_gang_skin_cost);
            
copy(user_gang_data[id][USER_GANG_SKIN], charsmax(user_gang_data[][USER_GANG_SKIN]), "None");
            
gang_creation(id);
            return 
PLUGIN_HANDLED;
        }
    }
    
    if(
jb_get_user_cash(id) < iValue)
    {
        
cprint_chat(id_"You don't have enough cash to create a gang!")
        return 
PLUGIN_HANDLED;
    }
    
    
jb_set_user_cash(id, (jb_get_user_cash(id)-iValue))
    
    new 
sBuffer[196], ilensAuthid[32], sName[32];
    
get_user_name(idsNamecharsmax(sName))
    
get_user_authid(idsAuthidcharsmax(sAuthid))
    
ilen formatex(sBuffercharsmax(sBuffer), "^n[%s] ^"%s^" ^"0^"^n"
            
user_gang_data[id][USER_GANG_NAME], user_gang_data[id][USER_GANG_SKIN])
    
ilen += formatex(sBuffer[ilen], charsmax(sBuffer)-ilen"^"%s^" ^"%s^" ^"%s^""sAuthidUSER_STATUS[GANG_OWNER], sName)
    
write_file(GANGS_FILEsBuffer)
    
    new 
xArray[GANGS_INFO];
    
copy(xArray[GANG_NAME], charsmax(xArray[GANG_NAME]), user_gang_data[id][USER_GANG_NAME]);
    
copy(xArray[GANG_SKIN], charsmax(xArray[GANG_SKIN]), user_gang_data[id][USER_GANG_SKIN]);
    
user_gang_data[id][USER_GANG_ID] = ArraySize(garray_gangs);
    
user_gang_data[id][USER_GANG_STATUS] = GANG_OWNER;
    
    
xArray[GANG_KILLS] = 0;
    
ArrayPushString((xArray[GANG_ARRAY_MEMBERS] = _:ArrayCreate(32,1)), sAuthid);
    
TrieSetString((xArray[GANG_TRIE_MSTATUS] = _:TrieCreate()), sAuthidUSER_STATUS[GANG_OWNER]);
    
TrieSetString((xArray[GANG_TRIE_NAMES] = _:TrieCreate()), sAuthidsName);
    
ArrayPushArray(garray_gangsxArray);
    
    
TrieSetCell(gtrie_gang_maxslotsxArray[GANG_NAME], get_pcvar_num(cvar_maxmembers_slots));
    
    
log_amx("^n[JB GANG SYSTEM] .:GANG has been Created!:.^n \
                (Gang name): %s^n \
                (Skin): %s^n \
                (Owner): %s"
xArray[GANG_NAME], xArray[GANG_SKIN], sName)
    
cprint_chat(id_"your gang has been successfully created, you're now the owner of ^4%s^3!"xArray[GANG_NAME])
    
cprint_chat(0_"^3new gang has been created ^4(%s)^3, by ^4%s^3."xArray[GANG_NAME], sName)
    return 
PLUGIN_HANDLED;
}

skins_menu(id)
{
    if(!
check_flag(g_user_ingang_creation,id))
    {
        return;
    }
    
    new 
sText[64], menu menu_create("Choose out your gang skin!""skins_menu_handle"),
    
szSkin[32]; copy(szSkincharsmax(szSkin), user_gang_data[id][USER_GANG_SKIN]);
    
    
formatex(sTextcharsmax(sText), "%sNone"equal(szSkin"None") ? "\y":"\r")
    
menu_additem(menusText"None")
    
    for(new 
ijmaxloop2 ArraySize(garray_gangs),
        
maxloop ArraySize(garray_gang_skins), 
            
xArray2[GANGS_INFO], xArray[GANG_SKINS_INFO]; maxloopi++)
    {
        
ArrayGetArray(garray_gang_skinsixArray)
        
        for(
0maxloop2j++)
        {
            
ArrayGetArray(garray_gangsjxArray2);
            if(
equal(xArray2[GANG_SKIN], xArray[GANG_SKIN_NAME]))
            {
                
xArray[GANG_SKIN_ACCESS] = NO_ACCESS;
                
maxloop2;
            }
        }
        
        
formatex(sTextcharsmax(sText), xArray[GANG_SKIN_NAME]);
        if((
get_user_flags(id) & xArray[GANG_SKIN_ACCESS]) || !xArray[GANG_SKIN_ACCESS])
            
formatex(sTextcharsmax(sText), "%s%s"equal(szSkinxArray[GANG_SKIN_NAME]) ? "\y":"\r"xArray[GANG_SKIN_NAME]);
        
menu_additem(menusTextxArray[GANG_SKIN_NAME], 
            ((
get_user_flags(id) & xArray[GANG_SKIN_ACCESS]) || !xArray[GANG_SKIN_ACCESS]) ? 0:NO_ACCESS)
    }
    
    
menu_display(idmenu)
}

public 
skins_menu_handle(idmenuitem)
{
    if(
item == MENU_EXIT)
    {
        
menu_destroy(menu);
        return 
PLUGIN_HANDLED;
    }
    
    new 
sData[32], paccessiCallback
    menu_item_getinfo
(menuitempaccesssDatacharsmax(sData), ""0iCallback)
    
menu_destroy(menu);
    
    
copy(user_gang_data[id][USER_GANG_SKIN], charsmax(user_gang_data[][USER_GANG_SKIN]), sData)
    
gang_creation(id)
    return 
PLUGIN_HANDLED;
}

available_gangmenu(const id, const page)
{
    new 
total_gangs;
    if(!(
total_gangs=ArraySize(garray_gangs)))
    {
        
cprint_chat(id_"^3There's no available gangs!")
        return;
    }
    
    new 
pages floatround((total_gangs 10.0), floatround_ceil);
    
    new 
sText[64];
    
    
formatex(sTextcharsmax(sText), "\yCurrent \wpage : \r%d\y/\r%d", (page 1), pages)
    new 
menu menu_create(sText"available_gmenu_handler")
    
    
menu_additem(menu"\rShow !^n^n")
    
    
menu_additem(menu"Next page"_, ((page ) < pages) ? 0:NO_ACCESS)
    
menu_additem(menu"Previous page"_, !page NO_ACCESS:0)
    
    
menu_setprop(menuMPROP_NOCOLORS"\w")
    
menu_setprop(menuMPROP_EXITNAME"Return")
    
    
menu_display(idmenu)
}

public 
available_gmenu_handler(idmenuitem)
{
    switch( 
item )
    {
        case 
0available_gangs(idg_userpage[id]);
        case 
1available_gangmenu(id, ++g_userpage[id]);
        case 
2available_gangmenu(id, --g_userpage[id]);
        case 
MENU_EXITgang_mainmenu(id);
    }
    
    
menu_destroy(menu);
    return 
PLUGIN_HANDLED;
}

available_gangs(const id, const page)
{
    new 
total_gangs ArraySize(garray_gangs);
    if(!
total_gangs || (floatround((total_gangs 10.0), floatround_ceil)) <= page)
    {
        return;
    }
    
    new 
sBuffer[1536], iLen;
    
    
iLen formatex(sBuffercharsmax(sBuffer), "<html><head><style id=^"XXX_12835_Styles^">")
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"tr {padding-top:1px;padding-right:1px;padding-left:1px;mso-ignore:padding;color:black;font-size:12.0pt;")
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"font-weight:700;font-family:Calibri, sans-serif;text-align:center;vertical-align:bottom;border-top:1.0pt solid windowtext;")
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"border-right:.5pt solid windowtext;border-bottom:none;border-left:1.0pt solid windowtext;background:#FFC819;")
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"mso-pattern:black none;white-space:nowrap;}")
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"td {width:100pt;} .xID {width:30pt;height:15.0pt;}</style></head>")
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"<body><div id=^"XXX_12835^" align=^"center^"><table border=^"1^" style=^"border-collapse:collapse;table-layout:fixedwidth:100%;^">")
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"<tr><td class=^"xID^">ID</td><td>GANG NAME</td><td>MEMBERS</td><td>GANG SKIN</td><td>OWNER</td></tr>")
    
    new 
count;
    for(new 
= (page 10), xArray[GANGS_INFO], iOwnerjszOwner[32], szStatus[8], maxlooptotal_gangs && count 10i++)
    {
        
ArrayGetArray(garray_gangsixArray);
        
        
// seeking for the gang owner name...
        
for(0maxloop ArraySize(xArray[GANG_ARRAY_MEMBERS]); maxloopj++)
        {
            
ArrayGetString(xArray[GANG_ARRAY_MEMBERS], jszOwnercharsmax(szOwner))
            
TrieGetString(xArray[GANG_TRIE_MSTATUS], szOwnerszStatuscharsmax(szStatus))
            if(
equali(USER_STATUS[GANG_OWNER], szStatus))
            {
                if((
iOwner find_player("c"szOwner)) > 0)
                {
                    
get_user_name(iOwnerszOwnercharsmax(szOwner));
                    
maxloop; continue;
                }
                
                
TrieGetString(xArray[GANG_TRIE_NAMES], szOwnerszOwnercharsmax(szOwner))
                
maxloop;
            }
        }
        
        
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"<tr><td>%d</td><td>%s</td><td>%d</td><td>%s</td><td>%s</td></tr>"
            (
i+1), xArray[GANG_NAME], ArraySize(xArray[GANG_ARRAY_MEMBERS]), xArray[GANG_SKIN], szOwner)
        
count++;
    }
    
    
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen"</table></div></body></html>")
    
    
show_motd(idsBuffer"Available Gangs.")
}

gang_members_menu(const idpage)
{
    if(
user_gang_data[id][USER_GANG_STATUS] == NOT_INGANG) return;
    
    new 
menu menu_create("\r~(\yGang Members\r)~""gmembers_menu_handler"), szText[196], sInfo[8];
    
    
formatex(szTextcharsmax(szText), "Search for: %s"user_find_members[id])
    
menu_additem(menuszText"1")
    
    new 
xArray[GANGS_INFO], found;
    
ArrayGetArray(garray_gangsuser_gang_data[id][USER_GANG_ID], xArray)
    
    for(new 
iplayerszAuthid[32], szStatus[10], count,
        
szName[32], maxloop ArraySize(xArray[GANG_ARRAY_MEMBERS]); maxloopi++)
    {
        
ArrayGetString(xArray[GANG_ARRAY_MEMBERS], iszAuthidcharsmax(szAuthid));
        
TrieGetString(xArray[GANG_TRIE_MSTATUS], szAuthidszStatuscharsmax(szStatus))
        
TrieGetString(xArray[GANG_TRIE_NAMES], szAuthidszNamecharsmax(szName))
        
        if((
player=find_player("c"szAuthid)) > 0)
        {
            
get_user_name(playerszNamecharsmax(szName))
        }
        
        
// not match...!
        
if(user_find_members[id][0] != EOS &&
            
containi(szName,user_find_members[id]) == -1)
                continue;
        
        if(
page <= found && count 7)
        {
            
formatex(szTextcharsmax(szText), "\r%s \w(\y%s\w) \w[%s\w]"szNameszStatus, !player "\rOffline":"\yOnline")
            
menu_addtext(menuszText0)
            
count++;
        }
        
        
found++;
    }
    
    new 
maxpages clamp(floatround((found 7.0), floatround_ceil), 1999999);
    
    
num_to_str(page 1sInfocharsmax(sInfo));
    
formatex(szTextcharsmax(szText), "Next Page!")
    
menu_additem(menuszTextsInfo, (page 1) < maxpages 0:NO_ACCESS)
    
    
num_to_str(page 1sInfocharsmax(sInfo));
    
formatex(szTextcharsmax(szText), "Previous Page!^n\rPage: (%d/%d)"page+1maxpages)
    
menu_additem(menuszTextsInfo, !page NO_ACCESS:0)
    
    
menu_setprop(menuMPROP_EXITNAME"Return")
    
menu_display(idmenu)
}

public 
gmembers_menu_handler(idmenuitem)
{
    new 
sData[8], iGnore;
    
menu_item_getinfo(menuitemiGnoresDatacharsmax(sData), __iGnore);
    
    switch( 
item )
    {
        case 
1gang_members_menuid, ++g_userpage[id])
        case 
2gang_members_menuid, --g_userpage[id])
        case 
0client_cmd(id"messagemode search_for")
        case 
MENU_EXITgang_mainmenu(id);
    }
    
    
menu_destroy(menu)
    return 
PLUGIN_HANDLED;
}

join_gang_menu(const id)
{
    if(
user_gang_data[id][USER_GANG_STATUS] != NOT_INGANG)
    {
        return;
    }
    
    new 
sText[96];
    new 
menu menu_create("\rRequest to join a gang...",  "jgang_menu_handler")
    
    new 
players[32], pnumsInfo[32], sName[32], g_items;
    
get_players(playerspnum"ch")
    
    for(new 
ixArray[GANGS_INFO], maxslotsplayerpnumi++)
    {
        
player players[i];
        
        if(
user_gang_data[player][USER_GANG_STATUS] <= GANG_MEMBER ||
            
check_flag(g_user_rejected_req[player],id))
        {
            continue;
        }
        
        
ArrayGetArray(garray_gangsuser_gang_data[player][USER_GANG_ID], xArray)
        
TrieGetCell(gtrie_gang_maxslotsxArray[GANG_NAME], maxslots);
        if(
ArraySize(xArray[GANG_ARRAY_MEMBERS]) >= maxslots) continue;
        
        
num_to_str(get_user_userid(player), sInfocharsmax(sInfo))
        
get_user_name(playersNamecharsmax(sName))
        
formatex(sTextcharsmax(sText), "\w%s \r%s of \y%s \rGang",
        
sNameUSER_STATUS[user_gang_data[player][USER_GANG_STATUS]], user_gang_data[player][USER_GANG_NAME])
        
menu_additem(menusTextsInfo)
        
g_items++;
    }
    
    if(!
g_items)
    {
        
menu_destroy(menu)
        return;
    }
    
    
menu_display(idmenu)
}

public 
jgang_menu_handler(idmenuitem)
{
    if(
item == MENU_EXIT)
    {
        
menu_destroy(menu)
        return 
PLUGIN_HANDLED;
    }
    
    new 
sData[32], sName[32], paccessicallback;
    
menu_item_getinfo(menuitempaccesssDatacharsmax(sData), ""0icallback)
    
menu_destroy(menu)
    
    new 
player find_player("k"str_to_num(sData));
    if(!
player || user_gang_data[player][USER_GANG_STATUS] == NOT_INGANG)
    {
        
join_gang_menu(id);
        return 
PLUGIN_HANDLED;
    }
    
    
get_user_name(idsNamecharsmax(sName))
    
gang_jrequest_menu(playerget_user_userid(id))
    
    
cprint_chat(id_"^4The request ^1has been ^3sent!")
    
cprint_chat(player_"^3[^1WARNING^3] ^4: ^3%s ^1wants to ^4join ^1the ^3gang^4!"sName)
    
client_cmd(player"spk warning")
    return 
PLUGIN_HANDLED;
}

gang_jrequest_menu(const id, const requesterUID)
{
    new 
requester find_player("k"requesterUID);
    
    if(!
requester ||
       
user_gang_data[requester][USER_GANG_STATUS] != NOT_INGANG ||
               
user_gang_data[id][USER_GANG_STATUS] <= GANG_MEMBER)
          {
        return;
          }
    
    new 
sName[32], sText[64]; get_user_name(requestersNamecharsmax(sName));
    
formatex(sTextcharsmax(sText), "\r%s \yRequest to join the gang\r!"sName)
    new 
menu menu_create(sText"gang_jrequest_menu_handler")
    
    
num_to_str(requesterUIDsNamecharsmax(sName))
    
menu_additem(menu"\yAccept!"sName)
    
menu_additem(menu"\rReject!"sName)
    
    
menu_display(idmenu)
}

public 
gang_jrequest_menu_handler(idmenuitem)
{
    if(
item == MENU_EXIT)
    {
        
menu_destroy(menu)
        return;
    }
    
    new 
sData[32], paccessicallback;
    
menu_item_getinfo(menuitempaccesssDatacharsmax(sData), ""0icallback)
    
    
menu_destroy(menu)
    
    new 
uid find_player("k"str_to_num(sData));
    if(!
uid || user_gang_data[uid][USER_GANG_STATUS] != NOT_INGANG ||
        
user_gang_data[id][USER_GANG_STATUS] <= GANG_MEMBER)
    {
        return;
    }
    
    
get_user_authid(uidsDatacharsmax(sData));
    
    switch( 
item )
    {
        case 
0:  // Accept!
        
{
            
set_user_gang(sDatauser_gang_data[id][USER_GANG_ID], GANG_MEMBER);
            
get_user_name(uidsDatacharsmax(sData))
            
cprint_chat(0_"!t%s !yhas joined the !g%s !tgang!g!"sDatauser_gang_data[id][USER_GANG_NAME])
        }
        case 
1:  // Reject!
        
{
            
set_flag(g_user_rejected_req[id],uid)
            
get_user_name(idsDatacharsmax(sData))
            
cprint_chat(uid_"^4%s ^1has ^3Rejected ^1your request!"sData)
        }
    }
}

invite_gang_menu(const id)
{
    if(
user_gang_data[id][USER_GANG_STATUS] == NOT_INGANG) return;
    if(
user_gang_data[id][USER_GANG_STATUS] < GANG_LEADER)
    {
        
cprint_chat(id_"You have to be a leader or higher inorder to invite players to the gang!")
        return;
    }
    
    new 
xArray[GANGS_INFO], maxslotscurrentslots;
    
ArrayGetArray(garray_gangsuser_gang_data[id][USER_GANG_ID], xArray);
    
TrieGetCell(gtrie_gang_maxslotsxArray[GANG_NAME], maxslots);
    if((
currentslots=ArraySize(xArray[GANG_ARRAY_MEMBERS])) >= maxslots)
    {
        
cprint_chat(id_"Your gang have reached the !tmaximum members !gslots(%d/%d)! "currentslotsmaxslots)
        return;
    }
    
    new 
menu menu_create("Invite a player to the gang!""invgang_menu")
    
    new 
players[32], pnumsInfo[32], sName[32], g_items;
    
get_players(playerspnum"ch")
    
    for(new 
iuidpnumi++)
    {
        
uid players[i];
        
        if(
user_gang_data[uid][USER_GANG_STATUS] != NOT_INGANG || uid == id|| check_flag(g_user_rejected_inv[uid],id))
        {
            continue;
        }
        
        
num_to_str(get_user_userid(uid), sInfocharsmax(sInfo))
        
get_user_name(uidsNamecharsmax(sName))
        
menu_additem(menusNamesInfo)
        
g_items ++;
    }
    
    if(!
g_items)
    {
        
menu_destroy(menu)
        return;
    }
    
    
menu_display(idmenu)
}

public 
invgang_menu(idmenuitem)
{
    if(
item == MENU_EXIT || (user_gang_data[id][USER_GANG_STATUS] < GANG_LEADER))
    {
        
menu_destroy(menu)
        return 
PLUGIN_HANDLED;
    }
    
    new 
sData[32], icallbackpaccess;
    
menu_item_getinfo(menuitempaccesssDatacharsmax(sData), ""0icallback)
    
    
menu_destroy(menu)
    
    new 
player find_player("k"str_to_num(sData));
    if(!
player || user_gang_data[player][USER_GANG_STATUS] != NOT_INGANG)
    {
        
invite_gang_menu(id)
        return 
PLUGIN_HANDLED;
    }
    
    
gang_invitation_menu(playerget_user_userid(id));
    
    
cprint_chat(id_"^4Gang Invitation ^1has been ^3sent!")
    
cprint_chat(player_"^3[^1WARNING^3] ^4: ^1You received a ^4gang ^3invitation!")
    
client_cmd(player"spk warning")
    return 
PLUGIN_HANDLED;
}

leader_menu(const id, const page)
{
    if(
user_gang_data[id][USER_GANG_STATUS] < GANG_LEADER)
    {
        
gang_mainmenu(id);
        return;
    }
    
    new 
menu menu_create("\r~(\yLeader Menu\r)~""leadermenu_handler")
    
    new 
sText[64], status user_gang_data[id][USER_GANG_STATUS], sPName[32], g_items;
    
formatex(sTextcharsmax(sText), leadermenu_items[page][INFO_ACTION])
    
menu_additem(menusText"#")
    
    new 
xArray[GANGS_INFO], player;
    
ArrayGetArray(garray_gangsuser_gang_data[id][USER_GANG_ID], xArray);
    
    for(new 
ipaccessszString[32],
        
szPStatus[32], maxloop ArraySize(xArray[GANG_ARRAY_MEMBERS]); maxloopi++)
    {
        
paccess 0;
        
ArrayGetString(xArray[GANG_ARRAY_MEMBERS], iszStringcharsmax(szString));
        
TrieGetString(xArray[GANG_TRIE_MSTATUS], szStringszPStatuscharsmax(szPStatus));
        
TrieGetString(xArray[GANG_TRIE_NAMES], szStringsPNamecharsmax(sPName))
        
        if(!((
1<<status) & leadermenu_items[page][INFO_ACCESS]) ||
                !
equal(szPStatusUSER_STATUS[leadermenu_items[page][INFO_POSITION]]))
        {
            
paccess NO_ACCESS;
        }
        
        if((
player find_player("c"szString)) > 0)
        {
            
get_user_name(playersPNamecharsmax(sPName));
        }
        
        
formatex(sTextcharsmax(sText), "\r%s \w- \yPosition: \r%s"sPNameszPStatus)
        if(
paccess == NO_ACCESS)
        {
            
formatex(sTextcharsmax(sText), "%s - Position: %s"sPNameszPStatus)
        }
        
        
menu_additem(menusTextszStringpaccess)
        
g_items ++;
    }
    
    if(!
g_items)
    {
        
menu_destroy(menu)
        return;
    }
    
    
menu_display(idmenu)
}

public 
leadermenu_handler(idmenuitem)
{
    if(
item == MENU_EXIT || user_gang_data[id][USER_GANG_STATUS] < GANG_LEADER)
    {
        
menu_destroy(menu)
        return 
PLUGIN_HANDLED;
    }
    
    new 
sData[32], paccessicallback;
    
menu_item_getinfo(menuitempaccesssDatacharsmax(sData), ""0icallback)
    
    
menu_destroy(menu);
    
    new 
xID find_player("c"str_to_num(sData));
    
    if(
sData[0] == '#')
    {
        if(
g_userpage[id] < sizeof leadermenu_items-1)
            
g_userpage[id] ++;
        else
            
g_userpage[id] = 0;
        
        
leader_menu(idg_userpage[id])
        return 
PLUGIN_HANDLED;
    }
    
    new 
sName[32], sName2[32];
    
get_user_name(idsName2charsmax(sName2));
    
    new 
xArray[GANGS_INFO];
    
ArrayGetArray(garray_gangsuser_gang_data[id][USER_GANG_ID], xArray);
    
TrieGetString(xArray[GANG_TRIE_NAMES], sDatasNamecharsmax(sName))
    
    if(
xID 0get_user_name(xIDsNamecharsmax(sName));
    
    switch( 
g_userpage[id] )
    {
        case 
0:
        {
            
set_user_gang(sDatauser_gang_data[id][USER_GANG_ID], GANG_LEADER);
            if(
xID 0cprint_chat(xID_"^4You have been promoted to a gang leader position by ^3%s^4!"sName2);
            
cprint_chat(id_"You have successfully promoted ^4%s^3!"sName);
        }
        case 
1:
        {
            
set_user_gang(sDatauser_gang_data[id][USER_GANG_ID], GANG_MEMBER);
            if(
xID 0cprint_chat(xID_"^3You have been demoted to a gang member position by ^4%s^3!"sName2);
            
cprint_chat(id_"You have successfully demoted ^4%s^3!"sName);
        }
        case 
2:
        {
            if(
xID 0cprint_chat(xID_"^3You have been kicked out of the gang by ^4%s^3!"sName2);
            
cprint_chat(id_"You have successfully kicked ^4%s ^1out of the gang^3!"sName);
            
remove_user_fromgang(sDatauser_gang_data[id][USER_GANG_ID]);
        }
    }
    
    
leader_menu(idg_userpage[id]);
    return 
PLUGIN_HANDLED;
}

gang_invitation_menu(const id, const iUID)
{
    new 
sText[64], uid find_player("k"iUID);
    
    new 
name[32]; get_user_name(uidnamecharsmax(name));
    
formatex(sTextcharsmax(sText), "\r[GANG Invitation] \wSent from \y%s^n\wto join \r%s \ygang!"
    
nameuser_gang_data[uid][USER_GANG_NAME])
    new 
menu menu_create(sText"ginvitation_menu_handler")
    
    new 
szUID[32]; num_to_str(iUIDszUIDcharsmax(szUID));
    
menu_additem(menu"\yAccept!"szUID)
    
menu_additem(menu"\rReject!"szUID)
    
    
menu_display(idmenu)
}

public 
ginvitation_menu_handler(idmenuitem)
{
    if(
item == MENU_EXIT)
    {
        
menu_destroy(menu)
        return 
PLUGIN_HANDLED;
    }
    
    new 
sData[32], paccessicallback;
    
menu_item_getinfo(menuitempaccesssDatacharsmax(sData), ""0icallback)
    
menu_destroy(menu)
    
    new 
uid find_player("k"str_to_num(sData));
    if(!
uid || user_gang_data[uid][USER_GANG_STATUS] < GANG_LEADER || user_gang_data[id][USER_GANG_STATUS] != NOT_INGANG)
    {
        return 
PLUGIN_HANDLED;
    }
    
    
get_user_authid(idsDatacharsmax(sData))
    
    switch( 
item )
    {
        case 
0:  // Accept!
        
{
            
set_user_gang(sDatauser_gang_data[uid][USER_GANG_ID], GANG_MEMBER);
            
get_user_name(idsDatacharsmax(sData))
            
cprint_chat(0_"!t%s !yhas joined the !g%s !tgang!g!"sDatauser_gang_data[uid][USER_GANG_NAME])
        }
        case 
1:  // Reject!
        
{
            
set_flag(g_user_rejected_inv[id],uid)
            
get_user_name(idsDatacharsmax(sData))
            
cprint_chat(uid_"^4%s ^1has ^3Rejected ^1the gang ^4invitation!"sData)
        }
    }
    
    return 
PLUGIN_HANDLED;

I went a little further, but I had a problem

Line 394
Line 439
Line 440

3 Errors

Last edited by alferd; 05-21-2020 at 05:36.
alferd is offline
Fuck For Fun
Veteran Member
Join Date: Nov 2013
Old 05-21-2020 , 07:57   Re: Gang Prefix Chat Color
Reply With Quote #3

@alfred
HTML Code:
return PLUGIN_HANDLED;
->
PHP Code:
return; 
Everything you've change.


- Next please ask for help from the creator
Fuck For Fun is offline
Send a message via Skype™ to Fuck For Fun
alferd
Veteran Member
Join Date: Dec 2019
Location: Iran is Always Eternal
Old 05-21-2020 , 09:14   Re: Gang Prefix Chat Color
Reply With Quote #4

Quote:
Originally Posted by Fuck For Fun View Post
@alfred
HTML Code:
return PLUGIN_HANDLED;
->
PHP Code:
return; 
Everything you've change.
Tnx

But Prefix Chat doesn't work
alferd is offline
alferd
Veteran Member
Join Date: Dec 2019
Location: Iran is Always Eternal
Old 05-23-2020 , 10:12   Re: Gang Prefix Chat Color
Reply With Quote #5

Does anyone help?
alferd is offline
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 03:48.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode