Advertisement
macquid123560

Top Jailbreak | Gang

Mar 23rd, 2016
1,537
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 69.26 KB | None | 0 0
  1.     /* Includes */
  2.        
  3.         #include < amxmodx >
  4.         #include < amxmisc >
  5.         #include < sqlvault_ex >
  6.         #include < cstrike >
  7.         #include < hamsandwich >
  8.         #include < fakemeta_util >
  9.         #include < regex >
  10.  
  11.     /* Defines */
  12.    
  13.         #define ADMIN_ACCESS        ADMIN_IMMUNITY
  14.         #define TASKID_GLOW     12654
  15.         #define REGEX_STEAMID_PATTERN   "^^STEAM_0:(0|1):\d+$"
  16.         #define MAX_MEMBERS     15
  17.         #define MAX_GANGS       13
  18.         #define MAX_ADMINS      3
  19.         #define GANG_COST       250000 
  20.        
  21.         #define FILE_NAME       "GangSaveFixed"
  22.     /* Natives */
  23.    
  24.         native get_user_cash( const index );
  25.         native set_user_cash( const index, setCash );
  26.         native is_lr_active();
  27.         native is_day();
  28.  
  29.     /* Constants */
  30.    
  31.         new const Info[ 5 ][ ] =
  32.         {
  33.             "Gang System",
  34.             "1.0",
  35.             "Built by Rejack || Edit by @.TheBomB`",
  36.             "Top JailBreak",
  37.             "Top Jailbreak"
  38.         };
  39.        
  40.         enum _:GangInfo
  41.         {
  42.             Trie:GangMembers,
  43.             GangName[ 64 ],
  44.             GangRegen,      // Regen
  45.             GangBoost,      // Cash Boost
  46.             GangGetCash,        // Get Cash
  47.             GangNext,       // Next Cash
  48.             GangCash,       // Cash
  49.             NumMembers
  50.         };
  51.        
  52.         enum
  53.         {
  54.             VALUE_REGEN,    // Regen
  55.             VALUE_BOOST,    // Cash Boost
  56.             VALUE_GETCASH,  // Get Cash
  57.             VALUE_NEXTCASH,
  58.             VALUE_CASH
  59.         }
  60.  
  61.         enum
  62.         {
  63.             STATUS_NONE,
  64.             STATUS_MEMBER,
  65.             STATUS_ADMIN,
  66.             STATUS_LEADER
  67.         };
  68.        
  69.         enum _:enSkills
  70.         {
  71.             skNum,
  72.             skCost
  73.         };
  74.        
  75.         enum _:enBasic
  76.         {
  77.             baseName[ 32 ],
  78.             baseEnum,
  79.             baseCharMax
  80.         };
  81.        
  82.         enum _:enGangColors
  83.         {
  84.             rColor,
  85.             gColor,
  86.             bColor,
  87.             ColorName[ 20 ]
  88.         };
  89.  
  90.         new const g_szGangValues[ ][ ] =
  91.         {
  92.             "Regeneration",     // Regen
  93.             "CashBoost",    // Cash Boost
  94.             "GetCash"// Get Cash
  95.             "NextCash",
  96.             "Cash"
  97.         };
  98.        
  99.         new const gHealth[ ][ enSkills ] =
  100.         {
  101.             { 0,    50000 },
  102.             { 40,   85000 },
  103.             { 35,   140000 },
  104.             { 30,   200000 },
  105.             { 20,   250000 },
  106.             { 15,   0 }
  107.         };
  108.        
  109.         new const gGetCash[ ][ enSkills ] =
  110.         {
  111.             { 0,    50000 },
  112.             { 50,   150000 },
  113.             { 100225000 },
  114.             { 150325000 },
  115.             { 200425000 },
  116.             { 250550000 }
  117.         };
  118.        
  119.         new const gCashBoost[ ][ enSkills ] =
  120.         {
  121.             { 0,    75000 },
  122.             { 25,   140000 },
  123.             { 50,   250000 },
  124.             { 75,   325000 },
  125.             { 1000 }
  126.         };
  127.        
  128.         new const gNextCash[ ][ enSkills ] =
  129.         {
  130.             { 0,    125000 },
  131.             { 100250000 },
  132.             { 250380000 },
  133.             { 325500000 },
  134.             { 5000 }
  135.         };
  136.        
  137.         new const szSkills[ ][ enBasic ] =
  138.         {
  139.             { "Health Regeneration",    GangRegen,          charsmax( gHealth ) },
  140.             { "Get Cash",           GangGetCash,            charsmax( gGetCash ) },
  141.             { "Extra Cash",         GangBoost,          charsmax( gCashBoost ) },
  142.             { "Next Cash",          GangNext,           charsmax( gNextCash ) }
  143.         };
  144.        
  145.         new g_iGangsColors[ MAX_GANGS ][ enGangColors ] =
  146.         {
  147.             { 255, 255, 255,        "White" },      // White
  148.             { 0, 80, 255,                 "Aqua" },
  149.             { 255, 255, 0,      "Yellow" },     // Yellow
  150.             { 39, 25, 255,      "Purple" },     // Purple
  151.             { 255, 127, 0,      "Orange" },     // Orange
  152.             { 255, 0, 0,        "Red" },        // Red
  153.             { 0, 255, 0,        "Green" },      // Green
  154.             { 0, 0, 255,        "Blue" },       // Blue
  155.             { 127, 0, 255,      "Violet" },     // Violet
  156.             { 128, 128, 128,        "Grey" },   // Navajo White 4
  157.             { 46, 210, 125,     "Turquoise" },      // LT Blue
  158.             { 184, 195, 61,     "Green Yellow" },   // Green Yellow     // Aqua
  159.             { 55, 42, 212,      "Pink" }        // Azure 3
  160.         };
  161.        
  162.     /* Tries */
  163.    
  164.    
  165.         new Trie:g_tGangNames;
  166.         new Trie:g_tGangValues;
  167.  
  168.     /* Vault */
  169.    
  170.         new SQLVault:g_hVault;
  171.  
  172.     /* Arrays */
  173.    
  174.         new Array:g_aGangs, szItem[ 256 ];
  175.  
  176.     /* Integers */
  177.    
  178.         new g_iGang[ 33 ];
  179.    
  180.     /* Booleans */
  181.    
  182.         new bool: bGetCash[ 33 ], bool: bGlow;
  183.  
  184.     /* Floats */
  185.    
  186.         new Float: fRegen[ 33 ];
  187.    
  188.     /* Regex */
  189.    
  190.         new Regex:g_SteamID_pattern;
  191.         new g_regex_return;
  192.        
  193.         #define IsValidAuthid(%1) (regex_match_c(%1, g_SteamID_pattern, g_regex_return) > 0)
  194.    
  195.     /* Costume Strings */
  196.    
  197.         enum StrType (<<= 1)
  198.         {
  199.             STRTYPE_NUM = 1,
  200.             STRTYPE_ALPHA,
  201.             STRTYPE_SPACE
  202.         };
  203.         #define is_str_alpha(%1) is_str_type((%1), STRTYPE_ALPHA)
  204.         #define is_char(%1) (0 < (%1) <= 255)
  205.  
  206. public plugin_init()
  207. {
  208.     register_plugin( Info[ 0 ], Info[ 1 ], Info[ 2 ] );
  209.    
  210.     register_clcmd( "say /check", "CmdCheckCmd" );
  211.    
  212.     register_clcmd( "say", "CmdSay" );
  213.     register_clcmd( "say /gang", "CmdGang" );
  214.    
  215.     register_clcmd( "_GangCreate_", "CmdCreateGang" );
  216.     register_clcmd( "_GangDonate_", "CmdGangDonate" );
  217.    
  218.     register_forward( FM_PlayerPreThink, "FwdPreThink" );
  219.    
  220.     register_event( "DeathMsg", "evDeathMsg", "a" );
  221.     register_logevent( "evRoundStart", 2, "1=Round_Start" );
  222.    
  223.     g_aGangs            = ArrayCreate( GangInfo );
  224.  
  225.     g_tGangValues           = TrieCreate();
  226.     g_tGangNames            = TrieCreate();
  227.    
  228.     g_hVault            = sqlv_open_local( FILE_NAME, false );
  229.     sqlv_init_ex( g_hVault );
  230.    
  231.     new error[ 2 ];
  232.     g_SteamID_pattern = regex_compile(REGEX_STEAMID_PATTERN, g_regex_return, error, sizeof(error) - 1);
  233.    
  234.     for( new i; i < sizeof g_szGangValues; i++ )
  235.         TrieSetCell( g_tGangValues, g_szGangValues[ i ], i );
  236.        
  237.     LoadGangs();
  238. }
  239.  
  240. public CmdCheckCmd( index )
  241. {
  242.     if( g_iGang[ index ] > -1 )
  243.     {
  244.         if( is_day() )
  245.             fm_set_user_rendering( index, kRenderFxGlowShell, g_iGangsColors[ g_iGang[ index ] ][ 0 ], g_iGangsColors[ g_iGang[ index ] ][ 1 ], g_iGangsColors[ g_iGang[ index ] ][ 2 ], 48 );
  246.     }
  247.    
  248.     return 1;
  249. }
  250. public plugin_natives()
  251. {
  252.     register_library( "GangLibrary" );
  253.    
  254.     register_native( "set_glow", "_set_glow" );
  255.    
  256.     register_native( "remove_glow", "_remove_glow" );
  257.    
  258.     register_native( "get_user_gang_nextcash", "_get_user_gang_nextcash" );
  259. }
  260.  
  261. public _get_user_gang_nextcash( plugin, params )
  262. {
  263.     static index;
  264.    
  265.     index   = get_param( 1 );
  266.    
  267.     if ( g_iGang[ index ] == -1 )
  268.         return 0;
  269.    
  270.     static aData[ GangInfo ], lvl, cash;
  271.    
  272.     ArrayGetArray( g_aGangs, g_iGang[ index ], aData );
  273.    
  274.     lvl = aData[ GangNext ];
  275.     cash    = gNextCash[ lvl ][ skNum ];
  276.    
  277.     return cash;
  278. }
  279.  
  280. public CmdCreateGang( client )
  281. {
  282.     if ( get_user_cash( client ) < GANG_COST )
  283.         return ColorChat( client, "You don't have enough cash." );
  284.    
  285.     if ( g_iGang[ client ] > -1 )
  286.         return ColorChat( client, "You're already in a gang" );
  287.        
  288.     if ( ArraySize( g_aGangs ) >= MAX_GANGS - 1 )
  289.         return ColorChat( client, "There are too many gangs." );
  290.    
  291.     static szArgs[ 64 ];
  292.    
  293.     read_args( szArgs, charsmax( szArgs ) );
  294.    
  295.     remove_quotes( szArgs );
  296.    
  297.     if ( TrieKeyExists( g_tGangNames, szArgs ) )
  298.     {
  299.         CmdGang( client );
  300.        
  301.         return ColorChat( client, "There's already a gang with that name." );
  302.     }
  303.    
  304.     if ( strlen( szArgs ) < 3 )
  305.         return ColorChat( client, "The name is too short." );
  306.    
  307.     if ( !is_str_alpha( szArgs ) )
  308.         return ColorChat( client, "You need to use letters only." );
  309.    
  310.     static bData[ GangInfo ];
  311.    
  312.     for ( new i; i < ArraySize( g_aGangs ); i++ )
  313.     {
  314.         ArrayGetArray( g_aGangs, i, bData );
  315.        
  316.         if ( equali( bData[ GangName ], szArgs ) )
  317.             return ColorChat( client, "Theres already a gang with that name." );
  318.     }
  319.    
  320.     new aData[ GangInfo ];
  321.    
  322.     aData[ GangName ]       = szArgs;
  323.     aData[ GangRegen ]  = 0;
  324.     aData[ GangBoost ]  = 0;
  325.     aData[ GangGetCash ]    = 0;
  326.     aData[ GangNext ]   = 0;
  327.     aData[ GangCash ]   = 0;
  328.     aData[ NumMembers ]     = 0;
  329.     aData[ GangMembers ]    = _:TrieCreate();
  330.    
  331.     ArrayPushArray( g_aGangs, aData );
  332.    
  333.     set_user_cash( client, get_user_cash( client ) - GANG_COST );
  334.    
  335.     set_user_gang( client, ArraySize( g_aGangs ) - 1, STATUS_LEADER );
  336.    
  337.     log_amx( "%s (%s|%s) opened the gang: %s (%i).", szName( client ), szAuth( client ), szAddress( client ), szArgs, g_iGang[ client ] );
  338.    
  339.     set_task(5.0, "SaveGangs");
  340.    
  341.     return ColorChat( 0, "^3%s^1 created the gang:^4 %s", szName( client ), szArgs );
  342. }
  343.  
  344. public CmdGangDonate( client )
  345. {
  346.     if ( !is_user_connected( client ) )
  347.         return 1;
  348.    
  349.     if ( g_iGang[ client ] == -1 )
  350.         return ColorChat( client, "You need to be in a gang." );
  351.    
  352.     new aData[ GangInfo ];
  353.    
  354.     ArrayGetArray( g_aGangs, g_iGang[ client ], aData );   
  355.    
  356.     static szArgs[ 32 ], iAmount;
  357.    
  358.     read_args( szArgs, charsmax( szArgs ) );
  359.    
  360.     remove_quotes( szArgs );
  361.    
  362.     iAmount = str_to_num( szArgs );
  363.    
  364.     if ( !is_str_num( szArgs ) )
  365.         return 1;
  366.    
  367.     if ( iAmount < 1 )
  368.     {
  369.         client_cmd( client, "messagemode _GangDonate_" );
  370.        
  371.         return ColorChat( client, "You need to depoist at least^4 1 Cash^1." );
  372.     }
  373.    
  374.     if ( iAmount > get_user_cash( client ) )
  375.     {
  376.         client_cmd( client, "messagemode _GangDonate_" );
  377.        
  378.         return ColorChat( client, "You don't have this amount of cash." );
  379.     }
  380.    
  381.     new Players[ 32 ], iNum, iTemp;
  382.    
  383.     get_players( Players, iNum, "ch" );
  384.    
  385.     for ( new i; i < iNum; i++ )
  386.     {
  387.         iTemp = Players[ i ];
  388.        
  389.         if ( g_iGang[ iTemp ] != g_iGang[ client ] || iTemp == client )
  390.             continue;
  391.        
  392.         ColorChat( iTemp, "^4%s^1 donated^3 %i^1 cash to the^3 %s^1 gang.", szName( client ), iAmount, aData[ GangName ]);
  393.        
  394.     }
  395.    
  396.     ColorChat( client, "You donated^3 %i^1 cash to the gang^3 %s^1.", iAmount, aData[ GangName ] );
  397.  
  398.    
  399.     ArrayGetArray( g_aGangs, g_iGang[ client ], aData );
  400.    
  401.     aData[ GangCash ] += iAmount;
  402.    
  403.     ArraySetArray( g_aGangs, g_iGang[ client ], aData );
  404.    
  405.     set_user_cash( client, get_user_cash( client ) - iAmount );
  406.    
  407.     return 1;
  408. }
  409.  
  410. public plugin_end()
  411. {
  412.     SaveGangs();
  413.    
  414.     sqlv_close( g_hVault );
  415. }
  416.  
  417. public client_putinserver( client )
  418. {
  419.     g_iGang[ client ] = get_user_gang( client );
  420.    
  421.     bGetCash[ client ] = true;
  422.    
  423.     fRegen[ client ] = get_gametime();
  424. }
  425.  
  426. public client_disconnect( client )
  427. {
  428.     g_iGang[ client ] = -1;
  429.    
  430. }
  431.  
  432. public CmdGang( client )
  433. {
  434.     static Menu, aData[ GangInfo ], szGangName[ 32 ];
  435.    
  436.     szGangName  = "None";
  437.    
  438.     if ( g_iGang[ client ] > -1 )
  439.     {
  440.         ArrayGetArray( g_aGangs, g_iGang[ client ], aData );
  441.        
  442.         formatex( szGangName, charsmax( szGangName ), aData[ GangName ] );
  443.     }
  444.    
  445.     formatex( szItem, charsmax( szItem ), "\r[\w%s\r]\w Gang Menu\r |\w Main Menu^n", Info[ 3 ])
  446.    
  447.     Menu    = menu_create( szItem, "HandlerGangMenu" );
  448.    
  449.     formatex( szItem, charsmax( szItem ), "%sCreate Gang \r[ 250,000 cash ]", (g_iGang[ client ]>-1) ? "\d" : (get_user_cash( client )<GANG_COST) ? "\d" : "\w" );
  450.    
  451.     menu_additem( Menu, szItem );
  452.    
  453.     formatex( szItem, charsmax( szItem ), "%sLeave Gang", (g_iGang[ client ]==-1) ? "\d" : (getStatus( client, g_iGang[ client ] )==STATUS_LEADER) ? "\d" : "\w" );
  454.    
  455.     menu_additem( Menu, szItem );
  456.    
  457.     formatex( szItem, charsmax( szItem ), "%sMembers Menu", (g_iGang[ client ]==-1) ? "\d" : "\w" );
  458.    
  459.     menu_additem( Menu, szItem );
  460.    
  461.     formatex( szItem, charsmax( szItem ), "%sGang %sAdmins%s Menu ",
  462.     (g_iGang[ client ]==-1) ? "\d" : (getStatus( client, g_iGang[ client ] )>=STATUS_ADMIN) ? "\w" : "\d",
  463.     (g_iGang[ client ]==-1) ? "\d" : (getStatus( client, g_iGang[ client ] )>=STATUS_ADMIN) ? "\y" : "\d",
  464.     (g_iGang[ client ]==-1) ? "\d" : (getStatus( client, g_iGang[ client ] )>=STATUS_ADMIN) ? "\w" : "\d");
  465.    
  466.     menu_additem( Menu, szItem );
  467.    
  468.     formatex( szItem, charsmax( szItem ), "%sGang %sLeader%s Menu",
  469.     (g_iGang[ client ]==-1) ? "\d" : (getStatus( client, g_iGang[ client ] )>=STATUS_LEADER) ? "\w" : "\d",
  470.     (g_iGang[ client ]==-1) ? "\d" : (getStatus( client, g_iGang[ client ] )>=STATUS_LEADER) ? "\r" : "\d",
  471.     (g_iGang[ client ]==-1) ? "\d" : (getStatus( client, g_iGang[ client ] )>=STATUS_LEADER) ? "\w" : "\d");
  472.    
  473.     menu_additem( Menu, szItem );
  474.    
  475.     menu_additem( Menu, "View Server Gangs" );
  476.     if(!(g_iGang[ client ] == -1))
  477.     {
  478.         formatex( szItem, charsmax( szItem ), "^n\dYour Gang Info:^n\r#################^n\wGang Name:\y %s^n\wGang Leader\y %s^n\wGang Color:\y %s^n\wGang Cash:\y %i Cash^n\wGang Members:\y %i/%i^n\wYour Rank:\y %s^n\r#################"
  479.      ,aData[ GangName ], GetGangOwner( g_iGang[ client ] ), g_iGangsColors[ g_iGang[ client] ][ ColorName ], aData[ GangCash ], aData[ NumMembers ], MAX_MEMBERS, getRank( client ));
  480.         menu_addtext(Menu, szItem);
  481.     }
  482.     menu_display( client, Menu );
  483.    
  484.     return 1;
  485. }
  486.  
  487. public HandlerGangMenu( client, Menu, Item )
  488. {
  489.     if ( Item == MENU_EXIT )
  490.     {
  491.         menu_destroy( Menu );
  492.        
  493.         return 1;
  494.     }
  495.    
  496.     static iStatus;
  497.    
  498.     iStatus = getStatus( client, g_iGang[ client ] );
  499.    
  500.     switch ( Item )
  501.     {
  502.         case 0:
  503.         {
  504.             if ( !(g_iGang[ client ] == -1) )
  505.             {
  506.                 ColorChat(client, "You are in a^3 gang^1")
  507.                 return CmdGang( client );
  508.             }
  509.            
  510.             else
  511.                 return CmdGang123( client );
  512.         }
  513.        
  514.         case 1:
  515.         {
  516.             if ( g_iGang[ client ] == -1 )
  517.                 return CmdGang( client );
  518.            
  519.             else if ( iStatus == STATUS_LEADER )
  520.                 return CmdGang( client );
  521.            
  522.             return CmdLeaveConfirm( client );
  523.         }
  524.        
  525.         case 2:
  526.         {
  527.             if ( g_iGang[ client ] == -1 )
  528.                 return CmdGang( client );
  529.            
  530.             return CmdMembersMenu( client );
  531.         }
  532.        
  533.         case 3:
  534.         {
  535.             if ( g_iGang[ client ] == -1 )
  536.                 return CmdGang( client );
  537.            
  538.             else if ( iStatus < STATUS_ADMIN )
  539.                 return CmdGang( client );
  540.            
  541.             return CmdAdminMenu( client );
  542.         }
  543.        
  544.         case 4:
  545.         {
  546.             if ( g_iGang[ client ] == -1 )
  547.                 return CmdGang( client );
  548.            
  549.             else if ( iStatus < STATUS_LEADER )
  550.                 return CmdGang( client );
  551.            
  552.             return CmdOwnerMenu( client );
  553.         }
  554.        
  555.         case 5:
  556.             return CmdGangsInfo( client );
  557.     }
  558.    
  559.     menu_destroy( Menu );
  560.    
  561.     return 1;
  562. }
  563.  
  564. public CmdTopGangs(client, Item)
  565. {
  566.    
  567.     static aData[ GangInfo ];
  568.    
  569.     new buffer[2048]
  570.    
  571.     new len = formatex(buffer, 2047, "<h1 align=center>Titaniums Top Gang</h1> <body bgcolor=#BBBBB><table width=80%% cellpaddinga=2 cellspaci=200 border=9")
  572.     len += formatex(buffer[len], 2047-len, "<tr  align=center bgcolor=#99999><th width=5%%> # <th width=20%% align=left> Name <th width=20%%> Leader") 
  573.    
  574.     new iTotal;
  575.        
  576.     if( iTotal )
  577.     {
  578.                            
  579.         for (new i = 0; i < iTotal; i++)
  580.         {          
  581.            
  582.             len += formatex(buffer[len], 2047-len, "<tr align=center%s><td> %s <td align=center> %s <td> %d - [%s] <td> %d <td> %d <td> ", ((i%2)==0) ? "" : " bgcolor=#6699FF", (i+1), aData[ GangName ],GetGangOwner( Item ) );
  583.         }
  584.     }
  585.     len += formatex(buffer[len], 2047-len, "</table></body>")
  586.    
  587.     new info[21]
  588.     formatex(info,20,"    KnifeGame Top")
  589.     show_motd(client, buffer, info)
  590.    
  591.     return PLUGIN_HANDLED
  592.    
  593. }  
  594.  
  595. public CmdGang123( client )
  596. {
  597.     static Menu1;
  598.    
  599.     formatex( szItem, charsmax( szItem ), "\r[\w%s\r]\w Gang Menu^nMain Menu", Info[ 3 ]);
  600.    
  601.     Menu1   = menu_create( szItem, "HandlerGangMenu1" );
  602.    
  603.     formatex( szItem, charsmax( szItem ), "%sChoose Your Gang Name\d - \wCost Gang\d: \r250,000", (g_iGang[ client ]>-1) ? "\d" : (get_user_cash( client )<GANG_COST) ? "\d" : "\w" );
  604.     menu_additem( Menu1, szItem );
  605.    
  606.     menu_display( client, Menu1 );
  607.    
  608.     return 1;
  609.    
  610. }
  611.  
  612. public HandlerGangMenu1( client, Menu1, Item )
  613. {
  614.     if ( Item == MENU_EXIT )
  615.     {
  616.         menu_destroy( Menu1 );
  617.        
  618.         return 1;
  619.     }
  620.    
  621.     static iStatus;
  622.    
  623.     iStatus = getStatus( client, g_iGang[ client ] );
  624.    
  625.     switch ( Item )
  626.     {
  627.         case 0:
  628.         {  
  629.             if ( g_iGang[ client ] > -1 )
  630.                 return CmdGang( client );
  631.            
  632.             else if ( get_user_cash( client ) < GANG_COST )
  633.                 return CmdGang123( client );
  634.            
  635.             client_cmd( client, "messagemode _GangCreate_" );
  636.         }
  637.        
  638.         case 1:
  639.         {
  640.                 if ( g_iGang[ client ] > -1 )
  641.                 return CmdGang( client );
  642.            
  643.                 else if ( get_user_cash( client ) < GANG_COST )
  644.                 return CmdGang( client );
  645.         }
  646.        
  647.         case 2:
  648.         {
  649.             if ( g_iGang[ client ] == -1 )
  650.                 return CmdGang( client );
  651.            
  652.             return CmdMembersMenu( client );
  653.         }
  654.        
  655.         case 3:
  656.         {
  657.             if ( g_iGang[ client ] == -1 )
  658.                 return CmdGang( client );
  659.            
  660.             else if ( iStatus < STATUS_ADMIN )
  661.                 return CmdGang( client );
  662.            
  663.             return CmdAdminMenu( client );
  664.         }
  665.        
  666.         case 4:
  667.         {
  668.             if ( g_iGang[ client ] == -1 )
  669.                 return CmdGang( client );
  670.            
  671.             else if ( iStatus < STATUS_LEADER )
  672.                 return CmdGang( client );
  673.            
  674.             return CmdOwnerMenu( client );
  675.         }
  676.        
  677.         case 5:
  678.             return CmdGangsInfo( client );
  679.     }
  680.    
  681.     menu_destroy( Menu1 );
  682.    
  683.     return 1;
  684. }
  685. public CmdMembersMenu( client )
  686. {
  687.     if ( g_iGang[ client ] == -1 )
  688.         return ColorChat( client, "You need to be in a gang." );
  689.    
  690.     static aData[ GangInfo ], Menu;
  691.    
  692.     ArrayGetArray( g_aGangs, g_iGang[ client ], aData );
  693.    
  694.     formatex( szItem, charsmax( szItem ), "\r[\w%s\r]\y Gangs Menu^nMembers Menu^n^n\wGang Name:\y %s^n\wGang Leader\y %s^n\wGang Color:\y %s^n\wGang Cash:\y %i Cash^n\wGang Members:\y %i/%i^n\wYour Rank:\r %s",
  695.     Info[ 3 ], aData[ GangName ], GetGangOwner( g_iGang[ client ] ), g_iGangsColors[ g_iGang[ client] ][ ColorName ], aData[ GangCash ], aData[ NumMembers ], MAX_MEMBERS, getRank( client )
  696.     );
  697.    
  698.     Menu = menu_create( szItem, "SubMembersMenu" );
  699.    
  700.     formatex( szItem, charsmax( szItem ), "Online Friends \y[%i]", getOnlineMembers( g_iGang[ client ] ) );
  701.    
  702.     menu_additem( Menu, szItem );
  703.    
  704.     menu_additem( Menu, "View Gang Skills" );
  705.    
  706.     menu_additem( Menu, "Gang Donate" );
  707.    
  708.     menu_display( client, Menu );
  709.    
  710.     return 1;
  711. }
  712.  
  713. stock GetGangOwner( iGang )
  714. {
  715.     static aData[ GangInfo ], szKey1[ 128 ], szKey2[ 128 ], szData[ 128 ], szAuthID[ 35 ], szNameID[ 32 ], iData;
  716.    
  717.     ArrayGetArray( g_aGangs, iGang, aData );
  718.    
  719.     for ( new i; i < sqlv_size_ex( g_hVault ); i++ )
  720.     {
  721.         sqlv_read_ex( g_hVault, i, szKey1, charsmax( szKey1 ), szKey2, charsmax( szKey2 ), szData, charsmax( szData ) );
  722.        
  723.         iData = str_to_num( szData );
  724.        
  725.         if ( equal( szKey2, aData[ GangName ] ) && iData == 3 )
  726.         {
  727.             replace( szKey1, charsmax( szKey1 ), "@", " " );
  728.            
  729.             parse( szKey1, szAuthID, charsmax( szAuthID ), szNameID, charsmax( szNameID ) );
  730.            
  731.             break;
  732.         }
  733.     }
  734.     return szNameID;
  735. }
  736.            
  737.    
  738.  
  739. public SubMembersMenu( client, Menu, Item )
  740. {
  741.     if ( g_iGang[ client ] == -1 )
  742.         return ColorChat( client, "You need to be in a gang." );
  743.    
  744.     if ( Item == MENU_EXIT )
  745.     {
  746.         menu_destroy( Menu );
  747.        
  748.         return CmdGang( client );
  749.     }
  750.    
  751.     switch ( Item )
  752.     {
  753.         case 0:
  754.             return CmdOnlineMembers( client );
  755.        
  756.         case 1:
  757.             return CmdGangSkills( client );
  758.        
  759.         case 2:
  760.             client_cmd( client, "messagemode _GangDonate_" );
  761.     }
  762.    
  763.     menu_destroy( Menu );
  764.    
  765.     return 1;
  766. }
  767.  
  768. public CmdGangSkills( client )
  769. {
  770.     if ( g_iGang[ client ] == -1 )
  771.         return ColorChat( client, "You need to be in a gang." );
  772.    
  773.     static Menu, aData[ GangInfo ], iData;
  774.    
  775.     ArrayGetArray( g_aGangs, g_iGang[ client ], aData );
  776.    
  777.     formatex( szItem, charsmax( szItem ), "\r[\w%s\r]\y Gang Menu^nUpgraded Skills^n\wCurrnet Gang:\y %s", Info[ 3 ], aData[ GangName ] );
  778.    
  779.     Menu = menu_create( szItem, "SubGangSkills" );
  780.    
  781.     /* Health Regen */
  782.    
  783.     iData   = aData[ GangRegen ];
  784.    
  785.     if ( iData == charsmax( gHealth ) )
  786.         formatex( szItem, charsmax( szItem ), "Health Regeneration:\y Max \r(\w%i\d seconds\r)", gHealth[ iData ][ skNum ] );
  787.    
  788.     else
  789.         formatex( szItem, charsmax( szItem ), "Health Regeneration:\y %i \r(\w%i\d seconds\r)", iData, gHealth[ iData ][ skNum ] );
  790.    
  791.     menu_additem( Menu, szItem );
  792.    
  793.     /* Get Cash */
  794.    
  795.     iData   = aData[ GangGetCash ];
  796.    
  797.     if ( iData == charsmax( gGetCash ) )
  798.         formatex( szItem, charsmax( szItem ), "GetCash:\y Max \r(\w%i\d cash\r)", gGetCash[ iData ][ skNum ] );
  799.        
  800.     else
  801.         formatex( szItem, charsmax( szItem ), "GetCash:\y %i \r(\w%i\d cash\r)", iData, gGetCash[ iData ][ skNum ] );
  802.        
  803.     menu_additem( Menu, szItem );
  804.    
  805.     /* Extra Cash */
  806.    
  807.     iData   = aData[ GangBoost ];
  808.    
  809.     if ( iData == charsmax( gCashBoost ) )
  810.         formatex( szItem, charsmax( szItem ), "Extra Cash:\y Max \r(\w%i\d cash\r)", gCashBoost[ iData ][ skNum ] );
  811.        
  812.     else
  813.         formatex( szItem, charsmax( szItem ), "Extra Cash:\y %i \r(\w%i\d cash\r)", iData, gCashBoost[ iData ][ skNum ] );
  814.    
  815.     menu_additem( Menu, szItem );
  816.    
  817.     /* Next cash */
  818.    
  819.     iData   = aData[ GangNext ];
  820.    
  821.     if ( iData == charsmax( gNextCash ) )
  822.         formatex( szItem, charsmax( szItem ), "NextCash:\y Max \r(\w%i\d cash\r)^n", gNextCash[ iData ][ skNum ] );
  823.        
  824.     else
  825.         formatex( szItem, charsmax( szItem ), "NextCash:\y %i \r(\w%i\d cash\r)^n", iData, gNextCash[ iData ][ skNum ] );
  826.        
  827.     menu_additem( Menu, szItem );
  828.    
  829.    
  830.     menu_display( client, Menu );
  831.    
  832.     return 1;
  833. }
  834.  
  835. public SubGangSkills( client, Menu, Item )
  836. {
  837.     if ( g_iGang[ client ] == -1 )
  838.         return ColorChat( client, "You need to be in a gang." );
  839.    
  840.     if ( Item == MENU_EXIT )
  841.     {
  842.         menu_destroy( Menu );
  843.        
  844.         return CmdMembersMenu( client );
  845.     }
  846.    
  847.     menu_destroy( Menu );
  848.    
  849.     return CmdGangSkills( client );
  850. }
  851.  
  852. stock getOnlineMembers( Gang )
  853. {
  854.     static Players[ 32 ], iNum, iPlayer, gNum;
  855.    
  856.     gNum = 0;
  857.    
  858.     get_players( Players, iNum, "ch" );
  859.    
  860.     for ( new i; i < iNum; i++ )
  861.     {
  862.         iPlayer = Players[ i ];
  863.        
  864.         if ( !is_user_connected( iPlayer ) || Gang != g_iGang[ iPlayer ] )
  865.             continue;
  866.        
  867.         gNum++;
  868.     }
  869.    
  870.     return gNum;
  871. }
  872.  
  873. stock getRank( const client )
  874. {
  875.     static szRank[ 7 ];
  876.    
  877.     switch ( getStatus( client, g_iGang[ client ] ) )
  878.     {
  879.         case 1:
  880.             szRank = "Member";
  881.        
  882.         case 2:
  883.             szRank = "Admin";
  884.        
  885.         case 3:
  886.             szRank = "Leader";
  887.     }
  888.    
  889.     return szRank;
  890. }
  891.  
  892. /* Invite Menu */
  893.  
  894. public CmdShowInvite( client )
  895. {
  896.     if ( g_iGang[ client ] == -1 )
  897.         return ColorChat( client, "You need to be in a gang." );
  898.    
  899.     if ( getStatus( client, g_iGang[ client ] ) < STATUS_ADMIN )
  900.         return ColorChat( client, "You have no^x04 access^x01 to this command." );
  901.    
  902.     static aData[ GangInfo ];
  903.    
  904.     ArrayGetArray( g_aGangs, g_iGang[ client ], aData );
  905.    
  906.     if ( aData[ NumMembers ] >= MAX_MEMBERS )
  907.         return ColorChat( client, "The gang has already reached its^3 Maximum Members^1!" );
  908.        
  909.     formatex( szItem, charsmax( szItem ), "\r[\w%s\r]\w Gang Menu^nInvite a Player!", Info[ 3 ] );
  910.    
  911.     new Menu = menu_create( szItem, "SubShowInvite" );
  912.    
  913.     new Players[ 32 ], iNum, iPlayer, szTempid[ 10 ];
  914.    
  915.     get_players( Players, iNum );
  916.    
  917.     for ( new i; i < iNum; i++ )
  918.     {
  919.         iPlayer = Players[ i ];
  920.        
  921.         if ( iPlayer == client || g_iGang[ iPlayer ] == g_iGang[ client ] )
  922.             continue;
  923.        
  924.         num_to_str( iPlayer, szTempid, charsmax( szTempid ) );
  925.        
  926.         menu_additem( Menu, szName( iPlayer ), szTempid );
  927.     }
  928.    
  929.     menu_display( client, Menu );
  930.    
  931.     return 1;
  932. }
  933.  
  934. public SubShowInvite( client, Menu, Item )
  935. {
  936.     if ( g_iGang[ client ] == -1 )
  937.         return ColorChat( client, "You need to be in a gang." );
  938.    
  939.     if ( getStatus( client, g_iGang[ client ] ) < STATUS_ADMIN )
  940.         return ColorChat( client, "You have no^x04 access^x01 to this command." );
  941.    
  942.     static aData[ GangInfo ];
  943.    
  944.     ArrayGetArray( g_aGangs, g_iGang[ client ], aData );
  945.    
  946.     if ( aData[ NumMembers ] >= MAX_MEMBERS )
  947.         return ColorChat( client, "The gang has already reached its^3 Maximum Members^1!" );
  948.        
  949.     if ( Item == MENU_EXIT )
  950.     {
  951.         menu_destroy( Menu );
  952.        
  953.         return 1;
  954.     }
  955.    
  956.     new Trash, mData[ 6 ];
  957.    
  958.     menu_item_getinfo( Menu, Item, Trash, mData, charsmax( mData ), _, _, Trash );
  959.    
  960.     new iPlayer = str_to_num( mData );
  961.    
  962.     if ( !is_user_connected( iPlayer ) )
  963.         return ColorChat( client, "Player is no longer^3 Connected^1." );
  964.    
  965.     if ( g_iGang[ iPlayer ] > -1 )
  966.     {
  967.         CmdShowInvite( client );
  968.        
  969.         return ColorChat( client, "This user is already in a gang." );
  970.     }
  971.    
  972.     ColorChat( client, "You invited^4 %s^1 to the gang^x03 %s^x01.", szName( iPlayer ), aData[ GangName ] );
  973.    
  974.     CmdInviteConfirm( client, iPlayer );
  975.    
  976.     CmdGang( client );
  977.    
  978.     return 1;
  979. }
  980.  
  981. public CmdInviteConfirm( client, iPlayer )
  982. {
  983.     if ( g_iGang[ iPlayer ] > -1 )
  984.         return ColorChat( client, "This player is already in a gang." );
  985.    
  986.     new aData[ GangInfo ], szTempid[ 10 ];
  987.    
  988.     ArrayGetArray( g_aGangs, g_iGang[ client ], aData );
  989.    
  990.     formatex( szItem, charsmax( szItem ), "\r[\w%s\r]\w Gang Menu^n\r%s\w Invited you to\y %s\w gang.", Info[ 3 ], szName( client ), aData[ GangName ] );
  991.    
  992.     new Menu = menu_create( szItem, "SubInviteConfirm" );
  993.    
  994.     num_to_str( g_iGang[ client ], szTempid, charsmax( szTempid ) );
  995.    
  996.     menu_additem( Menu, "Confirm", szTempid );
  997.    
  998.     menu_additem( Menu, "Decline", szTempid );
  999.    
  1000.     menu_display( iPlayer, Menu );
  1001.    
  1002.     return 1;
  1003. }
  1004.    
  1005. public SubInviteConfirm( iPlayer, Menu, Item )
  1006. {
  1007.     if ( g_iGang[ iPlayer ] > -1 )
  1008.         return ColorChat( iPlayer, "You're already in a gang." );
  1009.    
  1010.     if ( Item == MENU_EXIT || Item == 1 )
  1011.     {
  1012.         menu_destroy( Menu );
  1013.        
  1014.         ColorChat( iPlayer, "You^3 declined^1 the invitation." );
  1015.        
  1016.         return 1
  1017.     }
  1018.    
  1019.     new mData[ 6 ], Trash;
  1020.    
  1021.     menu_item_getinfo( Menu, Item, Trash, mData, charsmax( mData ), _,_, Trash );
  1022.    
  1023.     new iGang = str_to_num( mData );
  1024.    
  1025.     if ( iGang == -1 )
  1026.         return 1;
  1027.    
  1028.     if ( g_iGang[ iPlayer ] > -1 )
  1029.         return ColorChat( iPlayer, "You're already in a gang." );
  1030.    
  1031.     set_user_gang( iPlayer, iGang );
  1032.    
  1033.     new aData[ GangInfo ];
  1034.    
  1035.     ArrayGetArray( g_aGangs, iGang, aData );
  1036.    
  1037.     if ( aData[ NumMembers ] >= MAX_MEMBERS )
  1038.         return ColorChat( iPlayer, "This gang has already reached its^3 Max Members^1!" );
  1039.    
  1040.     new Players[ 32 ], iNum, iTemp;
  1041.    
  1042.     get_players( Players, iNum );
  1043.    
  1044.     for ( new i; i < iNum; i++ )
  1045.     {
  1046.         iTemp = Players[ i ];
  1047.        
  1048.         if ( g_iGang[ iTemp ] != g_iGang[ iPlayer ] || iPlayer == iTemp )
  1049.             continue;
  1050.        
  1051.         ColorChat( iTemp, "^x03%s^x01 joined your gang!", szName( iPlayer ) );
  1052.        
  1053.         ArrayGetArray( g_aGangs, g_iGang[ iPlayer ], aData );
  1054.     }
  1055.    
  1056.     return ColorChat( iPlayer, "You joined the gang^x03 %s^x01.", aData[ GangName ] );
  1057.    
  1058. }
  1059.  
  1060. /* Leave Menu */
  1061.  
  1062. public CmdLeaveConfirm( client )
  1063. {
  1064.     if ( g_iGang[ client ] == -1 )
  1065.         return ColorChat( client, "You need to be in a gang." );
  1066.    
  1067.     static aData[ GangInfo ];
  1068.    
  1069.     ArrayGetArray( g_aGangs, g_iGang[ client ], aData );
  1070.    
  1071.     formatex( szItem, charsmax( szItem ), "\r[\w%s\r]\w Gang Menu^nAre you sure you want to leave the\y %s\w gang?", Info[ 3 ], aData[ GangName ] );
  1072.    
  1073.     new Menu = menu_create( szItem, "SubLeaveConfirm" );
  1074.    
  1075.     menu_additem( Menu, "Yes" );
  1076.    
  1077.     menu_additem( Menu, "No, Don't Leave" );
  1078.    
  1079.     menu_display( client, Menu );
  1080.    
  1081.     return 1;
  1082. }
  1083.  
  1084.  
  1085. public SubLeaveConfirm( client, Menu, Item )
  1086. {
  1087.    
  1088.     if ( g_iGang[ client ] == -1 )
  1089.         return ColorChat( client, "You need to be in a gang." );
  1090.    
  1091.     if ( Item == MENU_EXIT )
  1092.     {
  1093.         menu_destroy( Menu );
  1094.        
  1095.         return 1;
  1096.     }
  1097.    
  1098.     switch ( Item )
  1099.     {
  1100.         case 0:
  1101.         {
  1102.            
  1103.             if ( getStatus( client, g_iGang[ client ] ) == STATUS_LEADER )
  1104.                 return ColorChat( client, "You need to transfer the leadership first." );
  1105.            
  1106.             static Players[ 32 ], iNum, iPlayer, aData[ GangInfo ], szKey[ 128 ], szKey1[ 128 ];
  1107.            
  1108.             static szKey2[ 128 ], szData[ 128 ], szAuthID[ 35 ], szNameID[ 32 ];
  1109.            
  1110.             ArrayGetArray( g_aGangs, g_iGang[ client ], aData );
  1111.            
  1112.             for ( new i; i < sqlv_size_ex( g_hVault ); i++ )
  1113.             {
  1114.                 sqlv_read_ex( g_hVault, i, szKey1, charsmax( szKey1 ), szKey2, charsmax( szKey2 ), szData, charsmax( szData ) );
  1115.                
  1116.                 formatex( szKey, charsmax( szKey ), szKey1 );
  1117.                
  1118.                 replace( szKey, charsmax( szKey ), "@", " " );
  1119.                
  1120.                 parse( szKey, szAuthID, charsmax( szAuthID ), szNameID, charsmax( szNameID ) );
  1121.                
  1122.                 if ( !( equal( szAuth( client ), szAuthID ) ) )
  1123.                     continue;
  1124.                
  1125.                 ArrayGetArray( g_aGangs, g_iGang[ client ], aData );
  1126.                
  1127.                 TrieDeleteKey( aData[ GangMembers ], szKey1 );
  1128.                
  1129.                 aData[ NumMembers ]--;
  1130.                
  1131.                 ArraySetArray( g_aGangs, g_iGang[ client ], aData );
  1132.                
  1133.                 sqlv_remove_ex( g_hVault, szKey1, szKey2 );
  1134.                
  1135.                 get_players( Players, iNum );
  1136.                
  1137.                 for ( new i; i < iNum; i++ )
  1138.                 {
  1139.                     iPlayer = Players[ i ];
  1140.                    
  1141.                     if( iPlayer == client || g_iGang[ iPlayer ] != g_iGang[ client ] )
  1142.                         continue;
  1143.                    
  1144.                     ColorChat( 0, "^4%s^1 left the gang^3 %s^1.", szName( client ), aData[ GangName ] );
  1145.                 }
  1146.  
  1147.                 g_iGang[ client ] = -1;
  1148.                
  1149.                 ColorChat( client, "You left the gang." );
  1150.             }
  1151.            
  1152.         }
  1153.     }
  1154.    
  1155.     menu_destroy( Menu );
  1156.    
  1157.     CmdGang( client );
  1158.    
  1159.     return 1;
  1160. }
  1161.  
  1162.  
  1163. /* Online Memebers */
  1164.  
  1165. public CmdOnlineMembers( client )
  1166. {
  1167.     if ( g_iGang[ client ] == -1 )
  1168.         return ColorChat( client, "You need to be in a gang." );
  1169.    
  1170.     formatex( szItem, charsmax( szItem ), "\r[\w%s\r]\w Online Members", Info[ 3 ] );
  1171.    
  1172.     new Menu = menu_create( szItem, "SubOnlineMembers" );
  1173.    
  1174.     new Players[ 32 ], iNum, iPlayer;
  1175.    
  1176.     get_players( Players, iNum );
  1177.    
  1178.     for ( new i; i < iNum; i++ )
  1179.     {
  1180.         iPlayer = Players[ i ];
  1181.        
  1182.         if ( g_iGang[ client ] != g_iGang[ iPlayer ] )
  1183.             continue;
  1184.        
  1185.         formatex( szItem, charsmax( szItem ), "%s - \d[\r%s\d]", szName( iPlayer ), getRank( iPlayer ) );
  1186.        
  1187.         menu_additem( Menu, szItem );
  1188.     }
  1189.    
  1190.     menu_display( client, Menu );
  1191.    
  1192.     return 1;
  1193. }
  1194.  
  1195. public SubOnlineMembers( client, Menu, Item )
  1196. {
  1197.     if ( g_iGang[ client ] == -1 )
  1198.         return ColorChat( client, "You need to be in a gang." );
  1199.    
  1200.     if ( Item == MENU_EXIT )
  1201.     {
  1202.         menu_destroy( Menu );
  1203.        
  1204.         return CmdMembersMenu( client );
  1205.     }
  1206.    
  1207.     menu_destroy( Menu );
  1208.    
  1209.     CmdOnlineMembers( client );
  1210.    
  1211.     return 1;
  1212. }
  1213.  
  1214. /* Disband Menu */
  1215.  
  1216. public CmdDisbandConfirm( client )
  1217. {
  1218.     if ( g_iGang[ client ] == -1 )
  1219.         return ColorChat( client, "You need to be in a gang." );
  1220.    
  1221.     if ( getStatus( client, g_iGang[ client ] ) < STATUS_LEADER )
  1222.         return ColorChat( client, "You have no^x04 access^x01 to this command." );
  1223.    
  1224.     formatex( szItem, charsmax( szItem ), "\r[\w%s\r]\w Gang Menu^nAre you sure you want to\r Disband\w the gang?", Info[ 3 ] );
  1225.    
  1226.     new Menu = menu_create( szItem, "SubDisbandConfirm" );
  1227.    
  1228.     menu_additem( Menu, "Confirm" );
  1229.    
  1230.     menu_additem( Menu, "Decline" );
  1231.    
  1232.     menu_display( client, Menu );
  1233.    
  1234.     return 1;
  1235. }
  1236.    
  1237. public SubDisbandConfirm( client, Menu, Item )
  1238. {
  1239.     if ( g_iGang[ client ] == -1 )
  1240.         return ColorChat( client, "You need to be in a gang." );
  1241.    
  1242.     if ( getStatus( client, g_iGang[ client ] ) < STATUS_LEADER )
  1243.         return ColorChat( client, "You have no^x04 access^x01 to this command." );
  1244.    
  1245.     if ( Item == MENU_EXIT )
  1246.     {
  1247.         menu_destroy( Menu );
  1248.        
  1249.         return 1;
  1250.     }
  1251.    
  1252.     switch ( Item )
  1253.     {
  1254.         case 0:
  1255.         {
  1256.             new aData[ GangInfo ], Players[ 32 ], iNum, iPlayer, iGang;
  1257.            
  1258.             ArrayGetArray( g_aGangs, g_iGang[ client ], aData );
  1259.            
  1260.             ColorChat( 0, "^4%s^1 disabanded the gang:^3 %s^1!", szName( client ), aData[ GangName ] );
  1261.            
  1262.             get_players( Players, iNum );
  1263.            
  1264.             for ( new i; i < iNum; i++ )
  1265.             {
  1266.                 iPlayer = Players[ i ];
  1267.                
  1268.                 if ( iPlayer == client || g_iGang[ client ] != g_iGang[ iPlayer ] )
  1269.                     continue;
  1270.                
  1271.                 ColorChat( iPlayer, "Your gang was disbanded by^4 %s", szName( client ) );
  1272.                
  1273.                 set_user_gang( iPlayer, -1 );
  1274.             }
  1275.            
  1276.             static szKey[ 2 ][ 128 ], szData[ 32 ];
  1277.            
  1278.             for ( new j; j < sqlv_size_ex( g_hVault ); j++ )
  1279.             {
  1280.                 sqlv_read_ex( g_hVault, j, szKey[ 0 ], charsmax( szKey[] ), szKey[ 1 ], charsmax( szKey[] ), szData, charsmax( szData ) );
  1281.                
  1282.                 if ( !( equal( szKey[ 1 ], aData[ GangName ] ) ) )
  1283.                     continue;
  1284.                
  1285.                
  1286.             }
  1287.                
  1288.            
  1289.             iGang = g_iGang[ client ];
  1290.            
  1291.             set_user_gang( client, -1 );
  1292.            
  1293.             ArrayDeleteItem( g_aGangs, iGang );
  1294.         }
  1295.     }
  1296.    
  1297.     menu_destroy( Menu );
  1298.    
  1299.     CmdGang( client );
  1300.    
  1301.     return 1;
  1302. }
  1303.  
  1304. /* Transfer Menu */
  1305.  
  1306. public CmdTransferMenu( client )
  1307. {
  1308.     if ( g_iGang[ client ] == -1 )
  1309.         return ColorChat( client, "You need to be in a gang." );
  1310.    
  1311.     if ( getStatus( client, g_iGang[ client ] ) < STATUS_LEADER )
  1312.         return ColorChat( client, "You have no^x04 access^x01 to this command." );
  1313.    
  1314.     formatex( szItem, charsmax( szItem ), "\r[\w%s\r]\w Gang Menu^nTransfer Leadership to", Info[ 3 ] );
  1315.    
  1316.     new Menu = menu_create( szItem, "SubTransferMenu" );
  1317.    
  1318.     new Players[ 32 ], iNum, iPlayer, szTempid[ 10 ];
  1319.    
  1320.     get_players( Players, iNum );
  1321.    
  1322.     for ( new i; i < iNum; i++ )
  1323.     {
  1324.         iPlayer = Players[ i ];
  1325.        
  1326.         if ( g_iGang[ iPlayer ] != g_iGang[ client ] || client == iPlayer )
  1327.             continue;
  1328.        
  1329.         num_to_str( iPlayer, szTempid, charsmax( szTempid ) );
  1330.        
  1331.         menu_additem( Menu, szName( iPlayer ), szTempid );
  1332.     }
  1333.    
  1334.     menu_display( client, Menu );
  1335.    
  1336.     return 1;
  1337. }
  1338.  
  1339. public SubTransferMenu( client, Menu, Item )
  1340. {
  1341.     if ( g_iGang[ client ] == -1 )
  1342.         return ColorChat( client, "You need to be in a gang." );
  1343.    
  1344.     if ( getStatus( client, g_iGang[ client ] ) < STATUS_LEADER )
  1345.         return ColorChat( client, "You have no^x04 access^x01 to this command." );
  1346.    
  1347.     if ( Item == MENU_EXIT )
  1348.     {
  1349.         menu_destroy( Menu );
  1350.        
  1351.         return 1;
  1352.     }
  1353.    
  1354.     new Trash, mData[ 6 ], aData[ GangInfo ];
  1355.    
  1356.     ArrayGetArray( g_aGangs, g_iGang[ client ], aData );
  1357.    
  1358.     menu_item_getinfo( Menu, Item, Trash, mData, charsmax( mData ), _,_, Trash );
  1359.    
  1360.     new iPlayer = str_to_num( mData );
  1361.    
  1362.     if ( !is_user_connected( iPlayer ) )
  1363.     {
  1364.         CmdTransferMenu( client );
  1365.        
  1366.         return ColorChat( client, "Player is no longer^3 Connected^1." );
  1367.     }
  1368.    
  1369.     set_user_gang( iPlayer, g_iGang[ client ], STATUS_LEADER );
  1370.    
  1371.     set_user_gang( client, g_iGang[ client ], STATUS_ADMIN );
  1372.    
  1373.     CmdGang( client );
  1374.    
  1375.     new Players[ 32 ], iNum, iTemp;
  1376.    
  1377.     get_players( Players, iNum );
  1378.    
  1379.     for ( new i; i < iNum; i++ )
  1380.     {
  1381.         iTemp = Players[ i ];
  1382.        
  1383.         if ( iTemp == iPlayer )
  1384.         {
  1385.             ColorChat( iTemp, "You are the new leader of the gang." );
  1386.            
  1387.             continue;
  1388.         }
  1389.        
  1390.         else if ( g_iGang[ iTemp ] != g_iGang[ client ] )
  1391.             continue;
  1392.        
  1393.         ColorChat( iTemp, "^x04%s^x01 is the new leader of the^x03 %s^x01 gang.", szName( iPlayer ), aData[ GangName ]  );
  1394.     }
  1395.    
  1396.     return 1;
  1397. }
  1398.  
  1399. /* Add Admin */
  1400.  
  1401. stock get_gang_admins( const index )
  1402. {
  1403.     static aData[ GangInfo ], iNum, szKey[ 2 ][ 128 ], szData[ 32 ];
  1404.    
  1405.     iNum = 0;
  1406.    
  1407.     ArrayGetArray( g_aGangs, g_iGang[ index ], aData );
  1408.    
  1409.     for ( new i; i < sqlv_size_ex( g_hVault ); i++ )
  1410.     {
  1411.         sqlv_read_ex( g_hVault, i, szKey[ 0 ], charsmax( szKey[] ), szKey[ 1 ], charsmax( szKey[] ), szData, charsmax( szData ) );
  1412.        
  1413.         if ( !( equali( aData[ GangName ], szKey[ 1 ] ) ) )
  1414.             continue;
  1415.        
  1416.         if ( equali( szData, "2" ) )
  1417.             iNum++;
  1418.     }
  1419.    
  1420.     return iNum;
  1421. }
  1422.  
  1423. public CmdAddAdmin( client )
  1424. {
  1425.     if ( g_iGang[ client ] == -1 )
  1426.         return ColorChat( client, "You need to be in a gang." );
  1427.    
  1428.     if ( getStatus( client, g_iGang[ client ] ) < STATUS_LEADER )
  1429.         return ColorChat( client, "You have no^x04 access^x01 to this command." );
  1430.    
  1431.     if ( get_gang_admins( client ) >= MAX_ADMINS )
  1432.         return ColorChat( client, "The gang has reached it's maximum^4 Admin Members^1." );
  1433.    
  1434.     formatex( szItem, charsmax( szItem ), "\r[\w%s\r]\w Gang Menu^nPromote a Player", Info[ 3 ] );
  1435.    
  1436.     new Menu = menu_create( szItem, "SubAddAdmin" );
  1437.    
  1438.     new Players[ 32 ], iNum, iPlayer, szTempid[ 10 ];
  1439.    
  1440.     get_players( Players, iNum );
  1441.    
  1442.     for ( new i; i < iNum; i++ )
  1443.     {
  1444.         iPlayer = Players[ i ];
  1445.        
  1446.         if ( g_iGang[ client ] != g_iGang[ iPlayer ] || getStatus( iPlayer, g_iGang[ iPlayer ] ) > STATUS_MEMBER )
  1447.             continue;
  1448.        
  1449.         num_to_str( iPlayer, szTempid, charsmax( szTempid ) );
  1450.        
  1451.         menu_additem( Menu, szName( iPlayer ), szTempid );
  1452.     }
  1453.    
  1454.     menu_display( client, Menu );
  1455.    
  1456.     return 1;
  1457. }
  1458.  
  1459. public SubAddAdmin( client, Menu, Item )
  1460. {
  1461.     if ( g_iGang[ client ] == -1 )
  1462.         return ColorChat( client, "You need to be in a gang." );
  1463.    
  1464.     if ( getStatus( client, g_iGang[ client ] ) < STATUS_LEADER )
  1465.         return ColorChat( client, "You have no^x04 access^x01 to this command." );
  1466.    
  1467.     if ( get_gang_admins( client ) >= MAX_ADMINS )
  1468.         return ColorChat( client, "The gang has reached it's maximum^4 Admin Members^1." );
  1469.    
  1470.     if ( Item == MENU_EXIT )
  1471.     {
  1472.         menu_destroy( Menu );
  1473.        
  1474.         return 1;
  1475.     }
  1476.    
  1477.     new Trash, mData[ 6 ];
  1478.    
  1479.     menu_item_getinfo( Menu, Item, Trash, mData, charsmax( mData ), _,_, Trash )
  1480.    
  1481.     new iPlayer = str_to_num( mData );
  1482.    
  1483.     if ( !is_user_connected( iPlayer ) )
  1484.     {
  1485.         ColorChat( client, "Player is no longer^3 Connected^1." );
  1486.        
  1487.         CmdAddAdmin( client );
  1488.        
  1489.         return 1;
  1490.     }
  1491.    
  1492.     set_user_gang( iPlayer, g_iGang[ client ], STATUS_ADMIN );
  1493.    
  1494.     new Players[ 32 ], iNum, iTemp;
  1495.    
  1496.     get_players( Players, iNum );
  1497.    
  1498.     for ( new i; i < iNum; i++ )
  1499.     {
  1500.         iTemp = Players[ i ];
  1501.        
  1502.         if ( g_iGang[ iTemp ] != g_iGang[ client ] || iPlayer == iTemp )
  1503.             continue;
  1504.        
  1505.         ColorChat( iTemp, "^3%s^1 has been^4 promoted^1 to^3 Admin^1 of the gang.", szName( iPlayer ) );
  1506.     }
  1507.    
  1508.     ColorChat( iPlayer, "You have been^4 promoted^1 to^3 Admin^1 of the gang." );
  1509.    
  1510.     ColorChat( client, "You promoted^4 %s^1 to^3 Admin^1 of the gang.", szName( iPlayer ) );
  1511.    
  1512.     menu_destroy( Menu );
  1513.    
  1514.     return 1;
  1515. }
  1516.  
  1517. /* Remove Admin */
  1518.  
  1519. public CmdRemoveAdmin( client )
  1520. {
  1521.     if ( g_iGang[ client ] == -1 )
  1522.         return ColorChat( client, "You need to be in a gang." );
  1523.    
  1524.     if ( getStatus( client, g_iGang[ client ] ) < STATUS_LEADER )
  1525.         return ColorChat( client, "You have no^x04 access^x01 to this command." );
  1526.    
  1527.     formatex( szItem, charsmax( szItem ), "\r[\w%s\r]\w Gang Menu^nDemote a Player", Info[ 3 ] );
  1528.    
  1529.     new Menu = menu_create( szItem, "SubRemoveAdmin" );
  1530.    
  1531.     new Players[ 32 ], iNum, iPlayer, szTempid[ 10 ];
  1532.    
  1533.     get_players( Players, iNum );
  1534.    
  1535.     for ( new i; i < iNum; i++ )
  1536.     {
  1537.         iPlayer = Players[ i ];
  1538.        
  1539.         if ( g_iGang[ client ] != g_iGang[ iPlayer ] || getStatus( iPlayer, g_iGang[ iPlayer ] ) != STATUS_ADMIN )
  1540.             continue;
  1541.        
  1542.         num_to_str( iPlayer, szTempid, charsmax( szTempid ) );
  1543.        
  1544.         menu_additem( Menu, szName( iPlayer ), szTempid );
  1545.     }
  1546.    
  1547.     menu_display( client, Menu );
  1548.    
  1549.     return 1;
  1550. }
  1551.  
  1552. public SubRemoveAdmin( client, Menu, Item )
  1553. {
  1554.     if ( g_iGang[ client ] == -1 )
  1555.         return ColorChat( client, "You need to be in a gang." );
  1556.    
  1557.     if ( getStatus( client, g_iGang[ client ] ) < STATUS_LEADER )
  1558.         return ColorChat( client, "You have no^x04 access^x01 to this command." );
  1559.    
  1560.     if ( Item == MENU_EXIT )
  1561.     {
  1562.         menu_destroy( Menu );
  1563.        
  1564.         return 1;
  1565.     }
  1566.    
  1567.     new Trash, mData[ 6 ];
  1568.    
  1569.     menu_item_getinfo( Menu, Item, Trash, mData, charsmax( mData ), _,_, Trash );
  1570.    
  1571.     new iPlayer = str_to_num( mData );
  1572.    
  1573.     if ( !is_user_connected( iPlayer ) )
  1574.     {
  1575.         CmdRemoveAdmin( client );
  1576.        
  1577.         return ColorChat( client, "Player is no longer^3 Connected^1." );
  1578.     }
  1579.    
  1580.     set_user_gang( iPlayer, g_iGang[ client ], STATUS_MEMBER );
  1581.    
  1582.     new Players[ 32 ], iNum, iTemp;
  1583.    
  1584.     get_players( Players, iNum );
  1585.    
  1586.     for ( new i; i < iNum; i++ )
  1587.     {
  1588.         iTemp = Players[ i ];
  1589.        
  1590.         if ( g_iGang[ iTemp ] != g_iGang[ client ] || iPlayer == iTemp )
  1591.             continue;
  1592.        
  1593.         ColorChat( iTemp, "^3%s^1 has been^4 demoted^1 from being^3 Admin^1 of the gang.", szName( iPlayer ) );
  1594.     }
  1595.    
  1596.     ColorChat( iPlayer, "You've been^4 demoted^1 from being^3 Admin^1 of the gang." );
  1597.    
  1598.     ColorChat( client, "You^4 demoted^3 %s^1 from being^4 Admin^1 of the gang.", szName( iPlayer ) );
  1599.    
  1600.     CmdGang( client );
  1601.    
  1602.     return 1;
  1603. }
  1604.  
  1605. /* Admin Menu */
  1606.  
  1607. public CmdAdminMenu( client )
  1608. {
  1609.     if ( g_iGang[ client ] == -1 )
  1610.         return ColorChat( client, "You need to be in a gang." );
  1611.    
  1612.     if ( getStatus( client, g_iGang[ client ] ) < STATUS_ADMIN )
  1613.         return ColorChat( client, "You have no^x04 access^x01 to this command." );
  1614.    
  1615.     formatex( szItem, charsmax( szItem ), "\r[\w%s\r]\w Gang Main Menu^nAdmin Menu.", Info[ 3 ] );
  1616.    
  1617.     new Menu = menu_create( szItem, "SubAdminMenu" );
  1618.    
  1619.     menu_additem( Menu, "Kick from the Gang" );
  1620.     menu_additem( Menu, "Invite to the Gang" );
  1621.     menu_additem( Menu, "Upgrade Skills" );
  1622.    
  1623.     menu_display( client, Menu );
  1624.    
  1625.     return 1;
  1626. }
  1627.  
  1628. public SubAdminMenu( client, Menu, Item )
  1629. {
  1630.     if ( g_iGang[ client ] == -1 )
  1631.         return ColorChat( client, "You need to be in a gang." );
  1632.    
  1633.     if ( getStatus( client, g_iGang[ client ] ) < STATUS_ADMIN )
  1634.         return ColorChat( client, "You have no^x04 access^x01 to this command." );
  1635.    
  1636.     if ( Item == MENU_EXIT )
  1637.     {
  1638.         menu_destroy( Menu );
  1639.        
  1640.         return 1;
  1641.     }
  1642.    
  1643.     switch ( Item )
  1644.     {
  1645.         case 0: return CmdKickMenu( client );
  1646.        
  1647.         case 1: return CmdShowInvite( client );
  1648.        
  1649.         case 2: return CmdSkillsMenu( client );
  1650.     }
  1651.    
  1652.     menu_destroy( Menu );
  1653.    
  1654.     return 1;
  1655. }
  1656.  
  1657. /* Owner Menu */
  1658.  
  1659. public CmdOwnerMenu( client )
  1660. {
  1661.     if ( g_iGang[ client ] == -1 )
  1662.         return ColorChat( client, "You need to be in a gang." );
  1663.    
  1664.     if ( getStatus( client, g_iGang[ client ] ) < STATUS_LEADER )
  1665.         return ColorChat( client, "You have no^x04 access^x01 to this command." );
  1666.    
  1667.     formatex( szItem, charsmax( szItem ), "\r[\w%s\r]\w Leaders Menu", Info[ 3 ] );
  1668.    
  1669.     new Menu = menu_create( szItem, "SubOwnerMneu" );
  1670.    
  1671.     menu_additem( Menu, "Kick from the Gang" );
  1672.     menu_additem( Menu, "Invite to the Gang" );
  1673.     menu_additem( Menu, "Upgrade Skills" );
  1674.     menu_additem( Menu, "Add an Admin" );
  1675.     menu_additem( Menu, "Remove an Admin" );
  1676.     menu_additem( Menu, "Transfer Leadership" );
  1677.     menu_additem( Menu, "Disband Gang" );
  1678.     //menu_additem( Menu, "Change Gang Name" );
  1679.    
  1680.     menu_display( client, Menu );
  1681.    
  1682.     return 1;
  1683. }
  1684.  
  1685. public SubOwnerMneu( client, Menu, Item )
  1686. {
  1687.     if ( g_iGang[ client ] == -1 )
  1688.         return ColorChat( client, "You need to be in a gang." );
  1689.    
  1690.     if ( getStatus( client, g_iGang[ client ] ) < STATUS_ADMIN )
  1691.         return ColorChat( client, "You have no^x04 access^x01 to this command." );
  1692.    
  1693.     if ( Item == MENU_EXIT )
  1694.     {
  1695.         menu_destroy( Menu );
  1696.        
  1697.         return 1;
  1698.     }
  1699.    
  1700.     switch ( Item )
  1701.     {
  1702.         case 0: return CmdKickMenu( client );
  1703.        
  1704.         case 1: return CmdShowInvite( client );
  1705.        
  1706.         case 2: return CmdSkillsMenu( client );
  1707.        
  1708.         case 3: return CmdAddAdmin( client );
  1709.        
  1710.         case 4: return CmdRemoveAdmin( client );
  1711.        
  1712.         case 5: return CmdTransferMenu( client );
  1713.        
  1714.         case 6: return CmdDisbandConfirm( client );
  1715.     }
  1716.    
  1717.     menu_destroy( Menu );
  1718.    
  1719.     return 1;
  1720. }
  1721.  
  1722. /* Skills Menu */
  1723.  
  1724. public CmdSkillsMenu( client )
  1725. {
  1726.     if ( g_iGang[ client ] == -1 )
  1727.         return ColorChat( client, "You need to be in a gang." );
  1728.    
  1729.     if ( getStatus( client, g_iGang[ client ] ) < STATUS_ADMIN )
  1730.         return ColorChat( client, "You have no^x04 access^x01 to this command." );
  1731.    
  1732.     static aData[ GangInfo ], iData;
  1733.    
  1734.     ArrayGetArray( g_aGangs, g_iGang[ client ], aData );
  1735.    
  1736.     formatex( szItem, charsmax( szItem ), "\r[\w%s\r]\w Skills Menu^n\dCurrent Gang:\y %s^n\dGang Cash:\y %i\w Cash.",
  1737.     Info[ 3 ], aData[ GangName ], aData[ GangCash ] );
  1738.    
  1739.     new Menu = menu_create( szItem, "SubSkillsMenu" );
  1740.    
  1741.     /* Health Regen */
  1742.    
  1743.     iData   = aData[ GangRegen ];
  1744.    
  1745.     if ( iData == charsmax( gHealth ) )
  1746.         formatex( szItem, charsmax( szItem ), "Health Regeneration:\y %i\d Seconds \r(\wMax\r)", gHealth[ iData ][ skNum ] );
  1747.    
  1748.     else if ( iData == 0 )
  1749.         formatex( szItem, charsmax( szItem ), "Health Regeneration:\d Upgdrade for\y %i\w Cash", gHealth[ iData ][ skCost ] );
  1750.    
  1751.     else
  1752.         formatex( szItem, charsmax( szItem ), "Health Regeneration:\y %i\d Seconds \r(\w%i\r)\d Upgrade for\y %i\w Cash", gHealth[ iData ][ skNum ], iData, gHealth[ iData ][ skCost ] );
  1753.    
  1754.     menu_additem( Menu, szItem );
  1755.    
  1756.     /* Get Cash */
  1757.    
  1758.     iData   = aData[ GangGetCash ];
  1759.    
  1760.     if ( iData == charsmax( gGetCash ) )
  1761.         formatex( szItem, charsmax( szItem ), "Get Cash:\y %i\d Cash \r(\wMax\r)", gGetCash[ iData ][ skNum ] );
  1762.    
  1763.     else if ( iData == 0 )
  1764.         formatex( szItem, charsmax( szItem ), "Get Cash:\d Upgdrade for\y %i\w Cash", gGetCash[ iData ][ skCost ] );
  1765.    
  1766.     else
  1767.         formatex( szItem, charsmax( szItem ), "Get Cash:\y %i\d Cash \r(\w%i\r)\d Upgrade for\y %i\w Cash", gGetCash[ iData ][ skNum ], iData, gGetCash[ iData ][ skCost ] );
  1768.    
  1769.     menu_additem( Menu, szItem );
  1770.    
  1771.     /* Cash Booster */
  1772.    
  1773.     iData   = aData[ GangBoost ];
  1774.    
  1775.     if ( iData == charsmax( gCashBoost ) )
  1776.         formatex( szItem, charsmax( szItem ), "ExtraCash:\y %i\d Cash \r(\wMax\r)", gCashBoost[ iData ][ skNum ] );
  1777.    
  1778.     else if ( iData == 0 )
  1779.         formatex( szItem, charsmax( szItem ), "ExtraCash:\d Upgdrade for\y %i\w Cash", gCashBoost[ iData ][ skCost ] );
  1780.    
  1781.     else
  1782.         formatex( szItem, charsmax( szItem ), "ExtraCash:\y %i\d Cash \r(\w%i\r)\d Upgrade for\y %i\w Cash", gCashBoost[ iData ][ skNum ], iData, gCashBoost[ iData ][ skCost ] );
  1783.    
  1784.     menu_additem( Menu, szItem );
  1785.    
  1786.     /* Next Cash */
  1787.    
  1788.     iData   = aData[ GangNext ];
  1789.    
  1790.     if ( iData == charsmax( gNextCash ) )
  1791.         formatex( szItem, charsmax( szItem ), "NextCash:\y %i\d Cash \r(\wMax\r)", gNextCash[ iData ][ skNum ] );
  1792.    
  1793.     else if ( iData == 0 )
  1794.         formatex( szItem, charsmax( szItem ), "NextCash:\d Upgdrade for\y %i\w Cash", gNextCash[ iData ][ skCost ] );
  1795.    
  1796.     else
  1797.         formatex( szItem, charsmax( szItem ), "NextCash:\y %i\d Cash \r(\w%i\r)\d Upgrade for\y %i\w Cash", gNextCash[ iData ][ skNum ], iData, gNextCash[ iData ][ skCost ] );
  1798.    
  1799.     menu_additem( Menu, szItem );
  1800.    
  1801.    
  1802.     menu_display( client, Menu );
  1803.    
  1804.     return 1;
  1805. }
  1806.  
  1807. public SubSkillsMenu( client, Menu, Item )
  1808. {
  1809.     if ( g_iGang[ client ] == -1 )
  1810.         return ColorChat( client, "You need to be in a gang." );
  1811.    
  1812.     if ( getStatus( client, g_iGang[ client ] ) < STATUS_ADMIN )
  1813.         return ColorChat( client, "You have no^x04 access^x01 to this command." );
  1814.    
  1815.     if ( Item == MENU_EXIT )
  1816.     {
  1817.         menu_destroy( Menu );
  1818.        
  1819.         return 1;
  1820.     }
  1821.    
  1822.     static aData[ GangInfo ]//, Cost, Skill, Max;
  1823.    
  1824.     ArrayGetArray( g_aGangs, g_iGang[ client ], aData );
  1825.    
  1826.     if ( aData[ szSkills[ Item ][ baseEnum ] ] == szSkills[ Item ][ baseCharMax ] )
  1827.         return ColorChat( client, "This skill is already^4 Maxed Out^1." );
  1828.    
  1829.     static Cost;
  1830.    
  1831.     switch ( Item )
  1832.     {
  1833.         case 0:
  1834.         {
  1835.             Cost = gHealth[ aData[ GangRegen ] ][ skCost ];
  1836.            
  1837.             if ( aData[ GangCash ] < Cost )
  1838.                 return ColorChat( client, "The gang doesn't have enough cash." );
  1839.         }
  1840.        
  1841.         case 1:
  1842.         {
  1843.             Cost = gGetCash[ aData[ GangGetCash ] ][ skCost ];
  1844.            
  1845.             if ( aData[ GangCash ] < Cost )
  1846.                 return ColorChat( client, "The gang doesn't have enough cash." );
  1847.         }
  1848.        
  1849.         case 2:
  1850.         {
  1851.             Cost = gCashBoost[ aData[ GangBoost ] ][ skCost ];
  1852.            
  1853.             if ( aData[ GangCash ] < Cost )
  1854.                 return ColorChat( client, "The gang doesn't have enough cash." );
  1855.         }
  1856.        
  1857.         case 3:
  1858.         {
  1859.             Cost = gNextCash[ aData[ GangNext ] ][ skCost ];
  1860.            
  1861.             if ( aData[ GangCash ] < Cost )
  1862.                 return ColorChat( client, "The gang doesn't have enough cash." );
  1863.         }
  1864.     }
  1865.    
  1866.     aData[ szSkills[ Item ][ baseEnum ] ]++;
  1867.    
  1868.     aData[ GangCash ] -= Cost;
  1869.  
  1870.     ArraySetArray( g_aGangs, g_iGang[ client ], aData )
  1871.    
  1872.     new Players[ 32 ], iNum, iTemp;
  1873.    
  1874.     get_players( Players, iNum, "ch" );
  1875.    
  1876.     for ( new i; i < iNum; i++ )
  1877.     {
  1878.         iTemp = Players[ i ];
  1879.        
  1880.         if ( g_iGang[ iTemp ] != g_iGang[ client ] || client == iTemp )
  1881.             continue;
  1882.        
  1883.         ColorChat( iTemp, "^3%s^4 upgraded^1 the skill^3 %s^1 to level^3 %i^1!", szName( client ), szSkills[ Item ][ baseName ], aData[ szSkills[ Item ][ baseEnum ] ] );
  1884.     }
  1885.    
  1886.     ColorChat( client, "You^3 upgraded^1 the skill^4 %s^1 to level^3 %i^1!", szSkills[ Item ][ baseName ], aData[ szSkills[ Item ][ baseEnum ] ] );
  1887.    
  1888.     CmdSkillsMenu( client );
  1889.    
  1890.     return 1;
  1891. }
  1892.  
  1893. /* Gangs Info */
  1894.  
  1895. public CmdGangsInfo( client )
  1896. {
  1897.     static aData[ GangInfo ];
  1898.    
  1899.     formatex( szItem, charsmax( szItem ), "\r[\w%s\r]\w Gangs Information", Info[ 3 ] );
  1900.    
  1901.     new Menu = menu_create( szItem, "SubGangsInfo" );
  1902.    
  1903.     for ( new i; i < ArraySize( g_aGangs ); i++ )
  1904.     {
  1905.         ArrayGetArray( g_aGangs, i, aData );
  1906.        
  1907.         formatex( szItem, charsmax( szItem ), "%s%s", aData[ GangName ], (i==g_iGang[ client ]) ? "\r *\d Your Gang \r*" : "" );
  1908.        
  1909.         menu_additem( Menu, szItem );
  1910.     }
  1911.    
  1912.     menu_setprop( Menu, MPROP_EXITNAME, "Back" );
  1913.    
  1914.     menu_display( client, Menu );
  1915.    
  1916.     return 1;
  1917. }
  1918.  
  1919. public SubGangsInfo( client, Menu, Item )
  1920. {
  1921.     if ( Item == MENU_EXIT )
  1922.     {
  1923.         menu_destroy( Menu );
  1924.        
  1925.         return CmdGang( client );
  1926.     }
  1927.    
  1928.     CmdSubInfo( client, Item );
  1929.    
  1930.     return 1;
  1931. }
  1932.  
  1933. public CmdSubInfo( client, Item )
  1934. {
  1935.     static aData[ GangInfo ], mItem[ 6 ], iData;
  1936.    
  1937.     num_to_str( Item, mItem, charsmax( mItem ) );
  1938.    
  1939.     ArrayGetArray( g_aGangs, Item, aData );
  1940.    
  1941.     formatex( szItem, charsmax( szItem ), "\r[\w%s\r]\w Gang Information^n^n\r%s\w Info:", Info[ 3 ], aData[ GangName ] );
  1942.    
  1943.     new Menu = menu_create( szItem, "SubSubInfo" );
  1944.    
  1945.     /*----      Gang Info       ----*/
  1946.    
  1947.     formatex( szItem, charsmax( szItem ), "Gang Leader:\d %s", GetGangOwner( Item ) );
  1948.    
  1949.     menu_additem( Menu, szItem, mItem );
  1950.    
  1951.     formatex( szItem, charsmax( szItem ), "Gang Color:\d %s", g_iGangsColors[ Item ][ ColorName ] );
  1952.    
  1953.     menu_additem( Menu, szItem, mItem );
  1954.    
  1955.     formatex( szItem, charsmax( szItem ), "Gang Members:\d %i/%i", aData[ NumMembers ], MAX_MEMBERS );
  1956.    
  1957.     menu_additem( Menu, szItem, mItem );
  1958.    
  1959.     formatex( szItem, charsmax( szItem ), "Gang Cash:\d %i Cash^n^n\wGang\y Skills\w Info:^n", aData[ GangCash ] );
  1960.    
  1961.     menu_additem( Menu, szItem, mItem );
  1962.    
  1963.     /*----      Gang Skill Info     ----*/
  1964.    
  1965.     /* Health Regen */
  1966.    
  1967.     iData   = aData[ GangRegen ];
  1968.    
  1969.     if ( aData[ GangRegen ] == charsmax( gHealth ) )
  1970.         formatex( szItem, charsmax( szItem ), "Health Regeneration:\y Max \r(\w%i\d seconds\r)", gHealth[ iData ][ skNum ] );
  1971.    
  1972.     else
  1973.         formatex( szItem, charsmax( szItem ), "Health Regeneration:\y %i \r(\w%i\d seconds\r)", iData, gHealth[ iData ][ skNum ] );
  1974.    
  1975.     menu_additem( Menu, szItem, mItem );
  1976.    
  1977.     /* Extra Cash */
  1978.    
  1979.     iData   = aData[ GangBoost ];
  1980.    
  1981.     if ( iData == charsmax( gCashBoost ) )
  1982.         formatex( szItem, charsmax( szItem ), "ExtraCash:\y Max \r(\w%i\d cash\r)", iData, gCashBoost[ iData ][ skNum ] );
  1983.        
  1984.     else
  1985.         formatex( szItem, charsmax( szItem ), "ExtraCash:\y %i \r(\w%i\d cash\r)", iData, gCashBoost[ iData ][ skNum ] );
  1986.    
  1987.     menu_additem( Menu, szItem, mItem );
  1988.    
  1989.     /* Get Cash */
  1990.    
  1991.     iData   = aData[ GangGetCash ];
  1992.    
  1993.     if ( iData == charsmax( gGetCash ) )
  1994.         formatex( szItem, charsmax( szItem ), "Get Cash:\y Max \r(\w%i\d cash\r)", iData, gGetCash[ iData ][ skNum ] );
  1995.        
  1996.     else
  1997.         formatex( szItem, charsmax( szItem ), "Get Cash:\y %i \r(\w%i\d cash\r)", iData, gGetCash[ iData ][ skNum ] );
  1998.    
  1999.     menu_additem( Menu, szItem, mItem );
  2000.    
  2001.     /* Next Cash */
  2002.    
  2003.     iData   = aData[ GangNext ];
  2004.    
  2005.     if ( iData == charsmax( gNextCash ) )
  2006.         formatex( szItem, charsmax( szItem ), "NextCash:\y Max \r(\w%i\d cash\r)^n", gNextCash[ iData ][ skNum ] );
  2007.    
  2008.     else
  2009.         formatex( szItem, charsmax( szItem ), "NextCash:\y %i \r(\w%i\d cash\r)^n", iData, gNextCash[ iData ][ skNum ] );
  2010.    
  2011.     menu_additem( Menu, szItem, mItem );
  2012.    
  2013.     /*----      Server Owner Item       ----*/
  2014.    
  2015.     if ( get_user_flags( client ) & ADMIN_ACCESS )
  2016.     {
  2017.         menu_additem( Menu, "\rRemove This Gang.^n", mItem );
  2018.        
  2019.         menu_additem( Menu, "Back" );
  2020.        
  2021.         menu_setprop( Menu, MPROP_PERPAGE, 0 );
  2022.     }
  2023.    
  2024.     else    menu_setprop( Menu, MPROP_EXITNAME, "Back" );
  2025.    
  2026.     menu_display( client, Menu );
  2027.    
  2028.     return 1;
  2029. }
  2030.  
  2031. public SubSubInfo( client, Menu, Item )
  2032. {
  2033.     if ( Item == MENU_EXIT )
  2034.     {
  2035.         menu_destroy( Menu );
  2036.        
  2037.         return CmdGangsInfo( client );
  2038.     }
  2039.    
  2040.     static mData[ 6 ], Trash, Key;
  2041.    
  2042.     menu_item_getinfo( Menu, Item, Trash, mData, charsmax( mData ), _, _, Trash );
  2043.    
  2044.     Key = str_to_num( mData );
  2045.    
  2046.     if ( get_user_flags( client ) & ADMIN_ACCESS )
  2047.     {
  2048.         if ( Item == 8 )
  2049.             return CmdConfirmDelete( client, Key );
  2050.        
  2051.         if ( Item == 9 )
  2052.         {
  2053.             menu_destroy( Menu );
  2054.            
  2055.             return CmdGangsInfo( client );
  2056.         }
  2057.     }
  2058.    
  2059.     CmdSubInfo( client, Key );
  2060.    
  2061.     return 1;
  2062. }
  2063.  
  2064. /* Owners Manage Disband Gangs */
  2065.  
  2066. public CmdConfirmDelete( client, iGang )
  2067. {
  2068.     if ( !( get_user_flags( client ) & ADMIN_ACCESS ) )
  2069.         return ColorChat( client, "You have no^x04 access^x01 to this command." );
  2070.    
  2071.     static aData[ GangInfo ];
  2072.    
  2073.     ArrayGetArray( g_aGangs, iGang, aData );
  2074.    
  2075.     formatex( szItem, charsmax( szItem ), "\r[\w%s\r]\w Are you sure you want to\r delete\w the gang\y %s?", Info[ 3 ], aData[ GangName ] );
  2076.    
  2077.     new Menu = menu_create( szItem, "SubConfirmDelete" );
  2078.    
  2079.     static szGang[ 6 ];
  2080.    
  2081.     num_to_str( iGang, szGang, charsmax( szGang ) );
  2082.    
  2083.     menu_additem( Menu, "\rYes\w, Delete this gang.", szGang );
  2084.     menu_additem( Menu, "No, \yLeave this gang alone.", szGang );
  2085.    
  2086.     menu_display( client, Menu );
  2087.    
  2088.     return 1;
  2089. }
  2090.  
  2091. public SubConfirmDelete( client, Menu, Item )
  2092. {
  2093.     if ( !( get_user_flags( client ) & ADMIN_ACCESS ) )
  2094.         return ColorChat( client, "You have no^x04 access^x01 to this command." );
  2095.    
  2096.     if ( Item == MENU_EXIT || Item == 1 )
  2097.     {
  2098.         menu_destroy( Menu );
  2099.        
  2100.         return CmdGangsInfo( client );
  2101.     }
  2102.    
  2103.     static mData[ 6 ], Trash, iGang, aData[ GangInfo ], Players[ 32 ], iNum, iPlayer
  2104.    
  2105.     menu_item_getinfo( Menu, Item, Trash, mData, charsmax( mData ), _,_, Trash );
  2106.    
  2107.     iGang = str_to_num( mData );
  2108.    
  2109.     ArrayGetArray( g_aGangs, iGang, aData );
  2110.    
  2111.     ColorChat( 0, "ADMIN:^3 %s^1 deleted^1 the gang^4 %s^1!", szName( client ), aData[ GangName ] );
  2112.    
  2113.     get_players( Players, iNum, "ch" );
  2114.    
  2115.     for ( new i; i < iNum; i++ )
  2116.     {
  2117.         iPlayer = Players[ i ];
  2118.        
  2119.         if ( g_iGang[ iPlayer ] != iGang )
  2120.             continue;
  2121.        
  2122.         set_user_gang( iPlayer, -1 );
  2123.     }
  2124.    
  2125.     ArrayDeleteItem( g_aGangs, iGang );
  2126.    
  2127.     menu_destroy( Menu );
  2128.    
  2129.     return CmdGangsInfo( client );
  2130. }
  2131.  
  2132. /* Kick Menu */
  2133.  
  2134.  
  2135. public CmdMenu( client )
  2136. {
  2137.     static aData[ GangInfo ];
  2138.    
  2139.     ArrayGetArray( g_aGangs, g_iGang[ client ], aData );
  2140.    
  2141.     new szKey1[ 254 ], szKey2[ 256 ], szData[ 512];
  2142.    
  2143.     for ( new i; i < sqlv_size_ex( g_hVault ); i++ )
  2144.     {
  2145.         sqlv_read_ex( g_hVault, i, szKey1, 255, szKey2, 255, szData, 511 );
  2146.        
  2147.         if ( !( equali( szKey2, aData[ GangName ] ) ) )
  2148.             continue;
  2149.        
  2150.         ColorChat( client, "^3%s:^4 %s", szKey2, szKey1 );
  2151.     }
  2152. }
  2153.  
  2154. public CmdKickMenu( client )
  2155. {
  2156.     if ( g_iGang[ client ] == -1 )
  2157.         return ColorChat( client, "You need to be in a gang." );
  2158.    
  2159.     if ( getStatus( client, g_iGang[ client ] ) < STATUS_ADMIN )
  2160.         return ColorChat( client, "You have no^x04 access^x01 to this command." );
  2161.    
  2162.     formatex( szItem, charsmax( szItem ), "\r[\w%s\r]\w Kick Menu", Info[ 3 ] );
  2163.    
  2164.     new Menu = menu_create( szItem, "SubKickMenu" );
  2165.    
  2166.     static aData[ GangInfo ], szKey1[ 254 ], szKey2[ 256 ], szData[ 512 ], szAuthID[ 35 ], szNameID[ 32 ], KeyIndex[ 6 ], Status;
  2167.    
  2168.     ArrayGetArray( g_aGangs, g_iGang[ client ], aData );
  2169.    
  2170.     for ( new i; i < sqlv_size_ex( g_hVault ); i++ )
  2171.     {
  2172.         sqlv_read_ex( g_hVault, i, szKey1, charsmax( szKey1 ), szKey2, charsmax( szKey2 ), szData, charsmax( szData ) );
  2173.        
  2174.         if ( equali( szKey2, aData[ GangName ] ) )
  2175.         {
  2176.             Status = str_to_num( szData );
  2177.            
  2178.             if ( Status > getStatus( client, g_iGang[ client ] ) )
  2179.                 continue;
  2180.            
  2181.             replace( szKey1, charsmax( szKey1 ), "@", " " );
  2182.            
  2183.             parse( szKey1, szAuthID, charsmax( szAuthID ), szNameID, charsmax( szNameID ) );
  2184.            
  2185.             if ( is_auth_online( szAuthID ) )
  2186.                 formatex( szItem, charsmax( szItem ), "\yONLINE\w - %s (%s)", szNameID, szAuthID );
  2187.            
  2188.             else    formatex( szItem, charsmax( szItem ), "\rOFFLINE\d - %s (%s)", szNameID, szAuthID );
  2189.            
  2190.             num_to_str( i, KeyIndex, charsmax( KeyIndex ) );
  2191.            
  2192.             menu_additem( Menu, szItem, KeyIndex );
  2193.         }
  2194.     }
  2195.    
  2196.     menu_display( client, Menu );
  2197.    
  2198.     return 1;
  2199. }
  2200.  
  2201. public SubKickMenu( client, Menu, Item )
  2202. {
  2203.     if ( g_iGang[ client ] == -1 )
  2204.         return ColorChat( client, "You need to be in a gang." );
  2205.    
  2206.     if ( getStatus( client, g_iGang[ client ] ) < STATUS_ADMIN )
  2207.         return ColorChat( client, "You have no^x04 access^x01 to this command." );
  2208.    
  2209.     if ( Item == MENU_EXIT )
  2210.     {
  2211.         menu_destroy( Menu );
  2212.        
  2213.         return 1;
  2214.     }
  2215.    
  2216.     static mData[ 6 ], Trash, KeyIndex, aData[ GangInfo ], szKey1[ 254 ];
  2217.    
  2218.     static szKey2[ 256 ], szData[ 512 ], szAuthID[ 35 ], szNameID[ 32 ], gStatus, iStatus;
  2219.    
  2220.     iStatus = getStatus( client, g_iGang[ client ] );
  2221.    
  2222.     menu_item_getinfo( Menu, Item, Trash, mData, charsmax( mData ), _,_, Trash );
  2223.    
  2224.     KeyIndex = str_to_num( mData );
  2225.    
  2226.     sqlv_read_ex( g_hVault, KeyIndex, szKey1, charsmax( szKey1 ), szKey2, charsmax( szKey2 ), szData, charsmax( szData ) );
  2227.    
  2228.     gStatus = str_to_num( szData );
  2229.    
  2230.     if ( iStatus == STATUS_ADMIN && gStatus != STATUS_MEMBER || iStatus == STATUS_LEADER && gStatus > STATUS_ADMIN )
  2231.         return ColorChat( client, "You canno't kick %s^1!", (gStatus==STATUS_ADMIN) ? "an^4 Admin" : "a^4 Leader" );
  2232.    
  2233.     ArrayGetArray( g_aGangs, g_iGang[ client ], aData );
  2234.    
  2235.     TrieDeleteKey( aData[ GangMembers ], szKey1 );
  2236.    
  2237.     aData[ NumMembers ]--;
  2238.    
  2239.     ArraySetArray( g_aGangs, g_iGang[ client ], aData );
  2240.    
  2241.     sqlv_remove_ex( g_hVault, szKey1, szKey2 );
  2242.    
  2243.     replace( szKey1, charsmax( szKey1 ), "@", " " );
  2244.    
  2245.     parse( szKey1, szAuthID, charsmax( szAuthID ), szNameID, charsmax( szNameID ) );
  2246.    
  2247.     new Players[ 32 ], iNum, iPlayer;
  2248.    
  2249.     get_players( Players, iNum, "ch" );
  2250.    
  2251.     if ( is_auth_online( szAuthID ) )
  2252.     {
  2253.         for ( new i; i < iNum; i++ )
  2254.         {
  2255.             iPlayer = Players[ i ];
  2256.            
  2257.             if ( equali( szAuthID, szAuth( iPlayer ) ) )
  2258.                 g_iGang[ iPlayer ] = -1;
  2259.         }
  2260.     }
  2261.    
  2262.     for( new i; i < iNum; i++ )
  2263.     {
  2264.         new client = read_data( 1 );
  2265.         new iPlayer = read_data( 2 );
  2266.         iPlayer = Players[ i ];
  2267.        
  2268.         if( /*iPlayer == client ||*/ g_iGang[ iPlayer ] != g_iGang[ client ] )
  2269.             continue;
  2270.        
  2271.         set_user_gang( g_iGang[ iPlayer ], -1, STATUS_NONE );
  2272.     }
  2273.    
  2274.     ColorChat( 0, "^x04%s^x01 kicked^x03 %s^x01 from gang.", szName( client ), szNameID );
  2275.    
  2276.     return CmdGang( client );
  2277. }
  2278.  
  2279. /* Events */
  2280.  
  2281. public evRoundStart()
  2282. {
  2283.     static aData[ GangInfo ];
  2284.    
  2285.     for ( new client = 1; client < get_maxplayers(); client++ )
  2286.     {
  2287.         if ( !is_user_connected( client ) || g_iGang[ client ] == -1 )
  2288.             continue;
  2289.        
  2290.         ArrayGetArray( g_aGangs, g_iGang[ client ], aData );
  2291.        
  2292.         if ( aData[ GangGetCash ] == 0 )
  2293.             continue;
  2294.        
  2295.         set_hudmessage( 0, 70, 255, -1.0, 0.0, 0, 0.1, 12.0, 0.1, 0.1, -1 );
  2296.            
  2297.         if( gGetCash[ aData[ GangGetCash ] ][ skNum ] >= sizeof( gGetCash ) && is_user_admin( client ) )
  2298.             show_hudmessage( client, "Type /getcash to get %i Cash!", gGetCash[ aData[ GangGetCash ] ][ skNum ] * 2 );
  2299.         else
  2300.             show_hudmessage( client, "Type /getcash to get %i Cash!", gGetCash[ aData[ GangGetCash ] ][ skNum ] );
  2301.        
  2302.         bGetCash[ client ] = false;
  2303.     }
  2304. }
  2305.  
  2306. public evDeathMsg()
  2307. {
  2308.     static Attacker, Victim, aData[ GangInfo ], Bonus;
  2309.    
  2310.     Attacker    = read_data( 1 );
  2311.     Victim      = read_data( 2 );
  2312.     if ( !is_user_connected( Attacker ) )
  2313.         return 0;
  2314.    
  2315.     if ( cs_get_user_team( Attacker ) != CS_TEAM_T || cs_get_user_team( Victim ) != CS_TEAM_CT || Attacker == Victim || g_iGang[ Attacker ] == -1 )
  2316.         return 0;
  2317.    
  2318.     ArrayGetArray( g_aGangs, g_iGang[ Attacker ], aData );
  2319.    
  2320.     if ( aData[ GangBoost ] == 0 )
  2321.         return 0;
  2322.    
  2323.     Bonus = gCashBoost[ aData[ GangBoost ] ][ skNum ];
  2324.    
  2325.     if ( CountPlayers() < 5 )
  2326.         return 1;
  2327.    
  2328.     set_user_cash( Attacker, get_user_cash( Attacker ) + Bonus );
  2329.    
  2330.     ColorChat( Attacker, "You gained^4 %i^3 bonus cash^1!", Bonus );
  2331.    
  2332.     return 0;
  2333. }
  2334.  
  2335. /* Forwards */
  2336.  
  2337. public FwdPreThink( client )
  2338. {
  2339.     if ( !is_user_alive( client ) || !is_user_connected( client ) || g_iGang[ client ] == -1 )
  2340.         return 1;
  2341.    
  2342.     static aData[ GangInfo ];
  2343.    
  2344.     ArrayGetArray( g_aGangs, g_iGang[ client ], aData );
  2345.    
  2346.     if ( aData[ GangRegen ] == 0 )
  2347.         return 1;
  2348.        
  2349.     if ( is_lr_active() )
  2350.         return 1;
  2351.    
  2352.     if ( fRegen[ client ] + gHealth[ aData[ GangRegen ] ][ skNum ] < get_gametime() )
  2353.     {
  2354.         if ( get_user_health( client ) >= 100 )
  2355.         {
  2356.             fRegen[ client ] = get_gametime();
  2357.            
  2358.             return 1;
  2359.         }
  2360.        
  2361.         else if ( get_user_health( client ) + 20 > 100 )
  2362.             fm_set_user_health( client, 100 );
  2363.        
  2364.         else
  2365.             fm_set_user_health( client, get_user_health( client ) + 20 );
  2366.        
  2367.         fRegen[ client ] = get_gametime();
  2368.     }
  2369.    
  2370.     return 1;
  2371. }
  2372.  
  2373. /* Chat */
  2374.  
  2375. public CmdSay( client )
  2376. {
  2377.     static szMsg[ 512 ];
  2378.    
  2379.     read_args( szMsg, charsmax( szMsg ) );
  2380.    
  2381.     remove_quotes( szMsg );
  2382.    
  2383.     static aData[ GangInfo ], Amount;
  2384.    
  2385.     if ( g_iGang[ client ] > -1 )
  2386.         ArrayGetArray( g_aGangs, g_iGang[ client ], aData );
  2387.    
  2388.     if ( equali( szMsg, "/getcash" ) || equali( szMsg, "/gc" ) )
  2389.     {
  2390.         if ( g_iGang[ client ] == -1 )
  2391.             return ColorChat( client, "You need to be in a gang." );
  2392.        
  2393.         if ( aData[ GangGetCash ] == 0 )
  2394.             return ColorChat( client, "That skill is not yet upgraded in your gang." );
  2395.        
  2396.         if ( bGetCash[ client ] )
  2397.             return ColorChat( client, "You can only use^4 Get cash^1 on time^3 per round^1!" );
  2398.        
  2399.         if ( CountPlayers() < 5 )
  2400.             return ColorChat( client, "You can't use^3 get cash^1 if there are less than^4 5 players^1." );
  2401.        
  2402.         static iData;
  2403.        
  2404.         iData           = aData[ GangGetCash ];
  2405.        
  2406.         bGetCash[ client ]  = true;
  2407.        
  2408.         Amount          = gGetCash[ iData ][ skNum ];
  2409.        
  2410.         Amount += Amount;
  2411.        
  2412.         set_user_cash( client, get_user_cash( client ) + Amount );
  2413.        
  2414.         return ColorChat( client, "You received^4 %i cash^1,^3 good luck^1!", Amount );
  2415.     }  
  2416.    
  2417.     if ( g_iGang[ client ] == -1 )
  2418.         return 0;
  2419.    
  2420.    
  2421.     if ( szMsg[ 0 ] != '~' )
  2422.         return 0;
  2423.    
  2424.     replace( szMsg, charsmax( szMsg ), "~", "" );
  2425.    
  2426.     static Players[ 32 ], iNum, iPlayer, szStatus[ 32 ];
  2427.    
  2428.     get_players( Players, iNum );
  2429.    
  2430.     formatex( szStatus, charsmax( szStatus ), "%s",
  2431.     (getStatus( client, g_iGang[ client ] ) == STATUS_LEADER) ? "Leader" : (getStatus( client, g_iGang[ client ] ) == STATUS_ADMIN) ? "Admin" : "Member" );
  2432.    
  2433.     for ( new i; i < iNum; i++ )
  2434.     {
  2435.         iPlayer = Players[ i ];
  2436.        
  2437.         if ( g_iGang[ iPlayer ] != g_iGang[ client ] )
  2438.             continue;
  2439.        
  2440.         if(getStatus( client, g_iGang[ client ] ) == STATUS_LEADER)
  2441.         {
  2442.             set_hudmessage(255, 255, 255, -1.0, 0.73, 0, 6.0, 12.0)
  2443.             show_hudmessage(iPlayer, "Leader %s : %s",szName( client ), szMsg)
  2444.             ColorChat( iPlayer, "^1%sGang Name:^3 %s^4 |^1 Leader^4 |^3 %s^1 :^1 %s", is_user_alive( client ) ? " " : "DEAD", aData[ GangName ], szName( client ), szMsg );
  2445.  
  2446.         }
  2447.         else
  2448.    
  2449.         ColorChat( iPlayer, "^1%sGang Name:^3 %s^4 |^1 %s^4 |^3 %s^1 :^1 %s", is_user_alive( client ) ? " " : " DEAD ^3|^1 ", aData[ GangName ], szStatus, szName( client ), szMsg );
  2450.     }
  2451.    
  2452.     return 1;
  2453. }
  2454.  
  2455.  
  2456. stock CountPlayers()
  2457. {
  2458.     static Players[ 32 ], iNum;
  2459.    
  2460.     get_players( Players, iNum, "ch" );
  2461.    
  2462.     return iNum;
  2463. }
  2464.  
  2465. /* Gang Glow */
  2466.  
  2467. public _set_glow( plugin, params )
  2468. {
  2469.     bGlow = true;
  2470.    
  2471.     GangGlow();
  2472.    
  2473.     set_task( 20.0, "GangGlow", TASKID_GLOW, _,_, "b" );
  2474. }
  2475.  
  2476. public _remove_glow( plugin, params )
  2477. {
  2478.     remove_task( TASKID_GLOW );
  2479.    
  2480.     bGlow = false;
  2481.    
  2482.     for ( new client = 1; client < get_maxplayers(); client++ )
  2483.     {
  2484.         if ( !is_user_connected( client ) || !is_user_alive( client ) )
  2485.             continue;
  2486.            
  2487.         fm_set_user_rendering( client );
  2488.     }
  2489. }
  2490.  
  2491. public GangGlow()
  2492. {
  2493.     if ( !bGlow )
  2494.         return 1;
  2495.    
  2496.     static red, green, blue;
  2497.    
  2498.     for ( new client = 1; client < get_maxplayers(); client++ )
  2499.     {
  2500.         if ( !is_user_connected( client ) || !is_user_alive( client ) || cs_get_user_team( client ) != CS_TEAM_T || g_iGang[ client ] == -1 )
  2501.             continue;
  2502.        
  2503.         red = g_iGangsColors[ g_iGang[ client ] ][ rColor ];
  2504.         green = g_iGangsColors[ g_iGang[ client ] ][ gColor ];
  2505.         blue = g_iGangsColors[ g_iGang[ client ] ][ bColor ];
  2506.        
  2507.         fm_set_user_rendering( client, kRenderFxGlowShell, red, green, blue, kRenderNormal, 16 );
  2508.     }
  2509.    
  2510.     return 1;
  2511. }
  2512.    
  2513.  
  2514. /* Stocks and Functions */
  2515.  
  2516. public LoadGangs()
  2517. {
  2518.     new szConfigsDir[ 60 ], szFileName[ 32 ];
  2519.    
  2520.     get_configsdir( szConfigsDir, charsmax( szConfigsDir ) );
  2521.    
  2522.     formatex( szFileName, charsmax( szFileName ), "/%s.ini", FILE_NAME );
  2523.    
  2524.     add( szConfigsDir, charsmax( szConfigsDir ), szFileName );
  2525.    
  2526.     new iFile = fopen( szConfigsDir, "rt" );
  2527.    
  2528.     new aData[ GangInfo ];
  2529.    
  2530.     new szBuffer[ 512 ], szData[ 256 ], szValue[ 512 ], i, iCurGang;
  2531.    
  2532.     while( !feof( iFile ) )
  2533.     {
  2534.         fgets( iFile, szBuffer, charsmax( szBuffer ) );
  2535.        
  2536.         trim( szBuffer );
  2537.         remove_quotes( szBuffer );
  2538.        
  2539.         if( !szBuffer[ 0 ] || szBuffer[ 0 ] == ';' )
  2540.         {
  2541.             continue;
  2542.         }
  2543.        
  2544.         if( szBuffer[ 0 ] == '[' && szBuffer[ strlen( szBuffer ) - 1 ] == ']' )
  2545.         {
  2546.             copy( aData[ GangName ], strlen( szBuffer ) - 2, szBuffer[ 1 ] );
  2547.             aData[ GangRegen ]  = 0;
  2548.             aData[ GangBoost ]  = 0;
  2549.             aData[ GangGetCash ]    = 0;
  2550.             aData[ GangNext ]   = 0;
  2551.             aData[ GangCash ]   = 0;
  2552.             aData[ NumMembers ] = 0;
  2553.             aData[ GangMembers ]    = _:TrieCreate();
  2554.            
  2555.            
  2556.             if( TrieKeyExists( g_tGangNames, aData[ GangName ] ) )
  2557.             {
  2558.                 new szError[ 256 ];
  2559.                 formatex( szError, charsmax( szError ), "[JB Gangs] Gang already exists: %s", aData[ GangName ] );
  2560.                 set_fail_state( szError );
  2561.             }
  2562.            
  2563.             ArrayPushArray( g_aGangs, aData );
  2564.            
  2565.             TrieSetCell( g_tGangNames, aData[ GangName ], iCurGang );
  2566.  
  2567.             log_amx( "Gang Created: %s", aData[ GangName ] );
  2568.            
  2569.             iCurGang++;
  2570.            
  2571.             continue;
  2572.         }
  2573.        
  2574.         strtok( szBuffer, szData, charsmax( szData ), szValue, charsmax( szValue ), '=' );
  2575.         trim( szData );
  2576.         trim( szValue );
  2577.            
  2578.         if( TrieGetCell( g_tGangValues, szData, i ) )
  2579.         {
  2580.             ArrayGetArray( g_aGangs, iCurGang - 1, aData );
  2581.            
  2582.             switch( i )
  2583.             {                  
  2584.                 case VALUE_REGEN:
  2585.                     aData[ GangRegen ]  = str_to_num( szValue );
  2586.                
  2587.                 case VALUE_BOOST:
  2588.                     aData[ GangBoost ]  = str_to_num( szValue );
  2589.                
  2590.                 case VALUE_GETCASH:
  2591.                     aData[ GangGetCash ]    = str_to_num( szValue );
  2592.                
  2593.                 case VALUE_NEXTCASH:
  2594.                     aData[ GangNext ]   = str_to_num( szValue );
  2595.                
  2596.                 case VALUE_CASH:
  2597.                     aData[ GangCash ] = str_to_num( szValue );
  2598.             }
  2599.        
  2600.             ArraySetArray( g_aGangs, iCurGang - 1, aData );
  2601.         }
  2602.     }
  2603.    
  2604.     new Array:aSQL;
  2605.     sqlv_read_all_ex( g_hVault, aSQL );
  2606.    
  2607.     new aVaultData[ SQLVaultEntryEx ];
  2608.    
  2609.     new iGang;
  2610.    
  2611.     for( i = 0; i < ArraySize( aSQL ); i++ )
  2612.     {
  2613.         ArrayGetArray( aSQL, i, aVaultData );
  2614.        
  2615.         if( TrieGetCell( g_tGangNames, aVaultData[ SQLVEx_Key2 ], iGang ) )
  2616.         {
  2617.             ArrayGetArray( g_aGangs, iGang, aData );
  2618.            
  2619.             TrieSetCell( aData[ GangMembers ], aVaultData[ SQLVEx_Key1 ], str_to_num( aVaultData[ SQLVEx_Data ] ) );
  2620.            
  2621.             aData[ NumMembers ]++;
  2622.            
  2623.             ArraySetArray( g_aGangs, iGang, aData );
  2624.         }
  2625.     }
  2626.    
  2627.     fclose( iFile );
  2628. }
  2629.  
  2630. public SaveGangs()
  2631. {
  2632.     new szConfigsDir[ 60 ], szFileName[ 32 ];
  2633.    
  2634.     get_configsdir( szConfigsDir, charsmax( szConfigsDir ) );
  2635.    
  2636.     formatex( szFileName, charsmax( szFileName ), "/%s.ini", FILE_NAME );
  2637.    
  2638.     add( szConfigsDir, charsmax( szConfigsDir ), szFileName );
  2639.    
  2640.     if( file_exists( szConfigsDir ) )
  2641.         delete_file( szConfigsDir );
  2642.        
  2643.     new iFile = fopen( szConfigsDir, "wt" );
  2644.        
  2645.     new aData[ GangInfo ];
  2646.    
  2647.     new szBuffer[ 256 ];
  2648.    
  2649.     for( new i = 0; i < ArraySize( g_aGangs ); i++ )
  2650.     {
  2651.         ArrayGetArray( g_aGangs, i, aData );
  2652.        
  2653.         formatex( szBuffer, charsmax( szBuffer ), "[%s]^n", aData[ GangName ] );
  2654.         fputs( iFile, szBuffer );
  2655.        
  2656.         formatex( szBuffer, charsmax( szBuffer ), "Regeneration=%i^n", aData[ GangRegen ] );
  2657.         fputs( iFile, szBuffer );
  2658.        
  2659.         formatex( szBuffer, charsmax( szBuffer ), "CashBoost=%i^n", aData[ GangBoost ] );
  2660.         fputs( iFile, szBuffer );
  2661.        
  2662.         formatex( szBuffer, charsmax( szBuffer ), "GetCash=%i^n", aData[ GangGetCash ] );
  2663.         fputs( iFile, szBuffer );
  2664.        
  2665.         formatex( szBuffer, charsmax( szBuffer ), "NextCash=%i^n", aData[ GangNext ] );
  2666.         fputs( iFile, szBuffer );
  2667.        
  2668.         formatex( szBuffer, charsmax( szBuffer ), "Cash=%i^n^n", aData[ GangCash ] );
  2669.         fputs( iFile, szBuffer );
  2670.     }
  2671.    
  2672.     fclose( iFile );
  2673. }
  2674.  
  2675. set_user_gang( id, iGang, iStatus = STATUS_MEMBER )
  2676. {
  2677.     new szAuthID[ 35 ], szFormat[ 128 ];
  2678.    
  2679.     GetUserAuth( id, szAuthID, charsmax( szAuthID ) );
  2680.    
  2681.     new aData[ GangInfo ];
  2682.    
  2683.     if( g_iGang[ id ] > -1 )
  2684.     {
  2685.         ArrayGetArray( g_aGangs, g_iGang[ id ], aData );
  2686.        
  2687.         TrieDeleteKey( aData[ GangMembers ], szAuthID );
  2688.        
  2689.         aData[ NumMembers ]--;
  2690.        
  2691.         ArraySetArray( g_aGangs, g_iGang[ id ], aData );
  2692.        
  2693.         sqlv_remove_ex( g_hVault, szAuthID, aData[ GangName ] );
  2694.     }
  2695.  
  2696.     if( iGang > -1 )
  2697.     {
  2698.         formatex( szFormat, charsmax( szFormat ), "%s@%s", szAuthID, szName( id ) );
  2699.        
  2700.         ArrayGetArray( g_aGangs, iGang, aData );
  2701.        
  2702.         TrieSetCell( aData[ GangMembers ], szFormat, iStatus );
  2703.        
  2704.         aData[ NumMembers ]++;
  2705.        
  2706.         ArraySetArray( g_aGangs, iGang, aData );
  2707.        
  2708.         sqlv_set_num_ex( g_hVault, szFormat, aData[ GangName ], iStatus );     
  2709.     }
  2710.  
  2711.     g_iGang[ id ] = iGang;
  2712.    
  2713.     return 1;
  2714. }
  2715.  
  2716. get_user_gang( id )
  2717. {
  2718.     static aData[ GangInfo ], szAuthID[ 35 ];
  2719.    
  2720.     GetUserAuth( id, szAuthID, charsmax( szAuthID ) );
  2721.    
  2722.     new szKey1[ 254 ], szKey2[ 256 ], szData[ 512 ], szAuthID2[ 35 ], szNameID[ 32 ];
  2723.    
  2724.     for ( new i; i < sqlv_size_ex( g_hVault ); i++ )
  2725.     {
  2726.         sqlv_read_ex( g_hVault, i, szKey1, 255, szKey2, 255, szData, 511 );
  2727.        
  2728.         replace( szKey1, charsmax( szKey1 ), "@", " " );
  2729.        
  2730.         parse( szKey1, szAuthID2, charsmax( szAuthID2 ), szNameID, charsmax( szNameID ) );
  2731.        
  2732.         if ( equali( szAuthID, szAuthID2 ) )
  2733.         {
  2734.             for( new j; j < ArraySize( g_aGangs ); j++ )
  2735.             {
  2736.                 ArrayGetArray( g_aGangs, j, aData );
  2737.                
  2738.                 if ( equal( aData[ GangName ], szKey2 ) )
  2739.                     return j;
  2740.             }
  2741.         }
  2742.     }
  2743.    
  2744.     return -1;
  2745. }
  2746.  
  2747. getStatus( id, iGang )
  2748. {
  2749.     if ( !is_user_connected( id ) || iGang == -1 )
  2750.         return STATUS_NONE;
  2751.    
  2752.     static aData[ GangInfo ], szAuthID[ 35 ], iStatus;
  2753.    
  2754.     ArrayGetArray( g_aGangs, iGang, aData );
  2755.    
  2756.     GetUserAuth( id, szAuthID, charsmax( szAuthID ) );
  2757.    
  2758.     iStatus = 0;
  2759.    
  2760.     new szKey1[ 254 ], szKey2[ 256 ], szData[ 512 ], szAuthID2[ 35 ], szNameID[ 32 ];
  2761.    
  2762.     for ( new KeyIndex; KeyIndex < sqlv_size_ex( g_hVault ); KeyIndex++ )
  2763.     {
  2764.         sqlv_read_ex( g_hVault, KeyIndex, szKey1, 255, szKey2, 255, szData, 511 );
  2765.        
  2766.         replace( szKey1, charsmax( szKey1 ), "@", " " );
  2767.        
  2768.         parse( szKey1, szAuthID2, charsmax( szAuthID ), szNameID, charsmax( szNameID ) );
  2769.        
  2770.         if ( !( equal( szKey2, aData[ GangName ] ) ) )
  2771.             continue;
  2772.        
  2773.         if ( !( equali( szAuthID, szAuthID2 ) ) )
  2774.             continue;
  2775.        
  2776.         break;
  2777.     }
  2778.    
  2779.     iStatus = str_to_num( szData );
  2780.    
  2781.     TrieGetCell( aData[ GangMembers ], szAuthID, iStatus );
  2782.    
  2783.     return iStatus;
  2784. }
  2785.  
  2786. stock ColorChat( const client, const string[], any:... )
  2787. {
  2788.     new szMsg[ 191 ], Players[ 32 ], PNum = 1;
  2789.    
  2790.     static iLen; iLen = formatex( szMsg, charsmax( szMsg ), "^3[^1 %s^3 ]^1 ", Info[ 4 ] );
  2791.    
  2792.     vformat( szMsg[ iLen ], charsmax( szMsg ) - iLen, string, 3 );
  2793.    
  2794.     if ( client )
  2795.         Players[ 0 ] = client;
  2796.    
  2797.     else
  2798.         get_players( Players, PNum, "ch" );
  2799.    
  2800.     for ( new i; i < PNum; i++ )
  2801.     {
  2802.         if( is_user_connected( Players[ i ] ) )
  2803.         {
  2804.             message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "SayText" ), _, Players[ i ] );
  2805.            
  2806.             write_byte( Players[ i ] );
  2807.            
  2808.             write_string( szMsg );
  2809.            
  2810.             message_end( );
  2811.         }
  2812.     }
  2813.    
  2814.     return 1;
  2815. }
  2816.  
  2817. stock szName( const index )
  2818. {
  2819.     static g_szName[ 32 ]; get_user_name( index, g_szName, charsmax( g_szName ) );
  2820.    
  2821.     return g_szName;
  2822. }
  2823.  
  2824. stock szAuth( const index )
  2825. {
  2826.     static g_szAuthID[ 35 ]; get_user_ip( index, g_szAuthID, charsmax( g_szAuthID ) ,1);
  2827.    
  2828.     return g_szAuthID;
  2829. }
  2830.  
  2831. stock szAddress( const index )
  2832. {
  2833.     static g_szAddress[ 22 ]; get_user_ip( index, g_szAddress, charsmax( g_szAddress ), 1 );
  2834.    
  2835.     return g_szAddress;
  2836. }
  2837.  
  2838. /*stock GetTeamColor( CsTeams:iTeam )
  2839. {
  2840.     switch ( iTeam )
  2841.     {
  2842.         case CS_TEAM_CT:    return BLUE;
  2843.        
  2844.         case CS_TEAM_T:     return RED;
  2845.        
  2846.         case CS_TEAM_SPECTATOR: return GREY;
  2847.     }
  2848.    
  2849.     return GREEN;
  2850. }*/
  2851.  
  2852. stock bool:is_str_type(const string[], StrType:flags, const exceptions[] = "")
  2853. {
  2854.     new c, i, tmp[2];
  2855.     while(is_char(c = string[i++]))
  2856.     {
  2857.         if(flags & STRTYPE_NUM && isdigit(c)
  2858.         || flags & STRTYPE_ALPHA && isalpha(c)
  2859.         || flags & STRTYPE_SPACE && isspace(c))
  2860.         {
  2861.             continue;
  2862.         }
  2863.        
  2864.         tmp[0] = c;
  2865.         if(contain(exceptions, tmp) != -1)
  2866.         {
  2867.             continue;
  2868.         }
  2869.        
  2870.         return false;
  2871.     }
  2872.    
  2873.     return (i > 1);
  2874. }
  2875.  
  2876. stock GetUserAuth( const index, output[], len )
  2877. {
  2878.     //if ( IsValidAuthid( szAuth( index ) ) )
  2879.         //get_user_authid( index, output, len );
  2880.     get_user_ip( index, output, len, 1 )
  2881. }
  2882.  
  2883. stock bool: is_auth_online( Auth[] )
  2884. {
  2885.     static Players[ 32 ], iNum, iPlayer, szAuthID[ 35 ];
  2886.    
  2887.     get_players( Players, iNum, "ch" );
  2888.    
  2889.     for ( new i; i < iNum; i++ )
  2890.     {
  2891.         iPlayer = Players[ i ];
  2892.        
  2893.         if ( IsValidAuthid( Auth ) )
  2894.             formatex( szAuthID, charsmax( szAuthID ), szAuth( iPlayer ) );
  2895.        
  2896.         else    formatex( szAuthID, charsmax( szAuthID ), szAddress( iPlayer ) );
  2897.        
  2898.         if ( equali( Auth, szAuthID ) )
  2899.             return true;
  2900.     }
  2901.    
  2902.     return false;
  2903. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement