PHP Code:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <amxmisc>
#include <nvault>
#include <hamsandwich>
#include <jailbreak_core>
#include <cs_player_models_api>
#include <fakemeta>
#include <cromchat>
#define PLUGIN "[JB] Gang System"
#define VERSION "1.0"
#define AUTHOR "Natsheh"
#define set_flag(%1,%2) (%1 |= (1<<(31&%2)))
#define remove_flag(%1,%2) (%1 &= ~(1<<(31&%2)))
#define check_flag(%1,%2) (%1 & (1<<(31&%2)))
#define MENU_KEYS (MENU_KEY_0|MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_5|MENU_KEY_7|MENU_KEY_8)
#define SHOW_TOP_GANGS 10
#define NO_ACCESS (1<<26)
#if !defined EOS
#define EOS 0
#endif
new const gang_file[] = "jailbreak_gangs.ini";
new const gang_skins_file[] = "jailbreak_gang_skins.ini";
enum (+=1)
{
NOT_INGANG = 0,
GANG_MEMBER,
GANG_LEADER,
GANG_OWNER
}
new const USER_STATUS[][] = {
"",
"Member",
"Leader",
"Owner"
}
enum GANG_ACCESS(+=1)
{
INFO_ACTION[24] = 0,
INFO_ACCESS,
INFO_POSITION
}
new const leadermenu_items[][GANG_ACCESS] = {
{ "Add a leader!", (1<<GANG_OWNER), GANG_MEMBER },
{ "Remove a leader!", (1<<GANG_OWNER), GANG_LEADER },
{ "Kick a member!", (1<<GANG_OWNER)|(1<<GANG_LEADER), GANG_MEMBER }
}
enum (+=1)
{
KEY_SKIN_MDL = 0,
KEY_SKIN_ACCESS
}
new const szKEYS[][] = {
"SKIN",
"ACCESS"
}
enum USER_GANG_INFO(+=1)
{
USER_GANG_NAME[32] = 0,
USER_GANG_SKIN[32],
USER_GANG_STATUS,
USER_GANG_ID
}
enum _:GANGS_INFO(+=1)
{
GANG_NAME[32] = 0,
GANG_SKIN[32],
GANG_KILLS,
Array:GANG_ARRAY_MEMBERS,
Trie:GANG_TRIE_MSTATUS,
Trie:GANG_TRIE_NAMES
}
enum _:GANG_SKINS_INFO(+=1)
{
GANG_SKIN_NAME[32] = 0,
GANG_SKIN_MDL[32],
GANG_SKIN_ACCESS
}
new mm_itemid_gang;
new user_find_members[33][32], g_user_rejected_req[33], g_user_rejected_inv[33], g_userpage[33];
new g_user_ingang_creation, g_user_cant_create_agang, g_user_alive;
new gang_name_edition[33][32], user_gang_data[33][USER_GANG_INFO];
new Array:garray_gangs, Array:garray_gang_skins, Trie:gtrie_gang_skin_mdls, Trie:gtrie_gang_maxslots;
new g_cvar_gang_cost, g_cvar_gang_skin_cost, g_msgStatusText, g_cvar_show_gang_info, cvar_maxmembers_slots;
new GANGS_FILE[64], GANG_SKINS_FILE[64];
#define MAXSLOTS 32
enum Color
{
YELLOW = 1, // Yellow
GREEN, // Green Color
TEAM_COLOR, // Red, grey, blue
GREY, // grey
RED, // Red
BLUE, // Blue
}
new TeamInfo;
new SayText;
new MaxSlots;
new bool:IsConnected[MAXSLOTS + 1];
new TeamName[][] =
{
"",
"TERRORIST",
"CT",
"SPECTATOR"
}
new ColorMode;
public plugin_end()
{
ArrayDestroy(garray_gangs);
ArrayDestroy(garray_gang_skins);
TrieDestroy(gtrie_gang_skin_mdls);
TrieDestroy(gtrie_gang_maxslots);
}
public plugin_precache()
{
garray_gangs = ArrayCreate(68, 1);
garray_gang_skins = ArrayCreate(65, 1);
gtrie_gang_skin_mdls = TrieCreate();
gtrie_gang_maxslots = TrieCreate();
new sFile[64];
get_configsdir(sFile, charsmax(sFile))
formatex(GANG_SKINS_FILE, charsmax(GANG_SKINS_FILE), "%s/%s", sFile, gang_skins_file)
if(!file_exists(GANG_SKINS_FILE))
{
write_file(GANG_SKINS_FILE, "; [Very Important Prisoner]");
write_file(GANG_SKINS_FILE, "; SKIN = ^"viprisoner^"");
write_file(GANG_SKINS_FILE, "; SKIN_ACCESS = ^"abcdefghijklmnopqrstu^"^n");
}
new fp = fopen(GANG_SKINS_FILE, "rt");
if(fp)
{
new xArray[GANG_SKINS_INFO], sBuffer[256], iItemIndex = -1, szKey[14], iKey;
while(!feof(fp))
{
fgets(fp, sBuffer, charsmax(sBuffer));
trim(sBuffer);
if(sBuffer[0] == EOS || sBuffer[0] == ';' || strlen(sBuffer) <= 3 || (sBuffer[0] == '/' && sBuffer[1] == '/'))
continue;
if(sBuffer[0] == '[')
{
iKey = 0;
copyc(xArray[GANG_SKIN_NAME], charsmax(xArray[GANG_SKIN_NAME]), sBuffer[1], ']');
iItemIndex = ArraySize(garray_gang_skins);
ArrayPushArray(garray_gang_skins, xArray);
continue;
}
if(xArray[GANG_SKIN_NAME][0] != EOS && iItemIndex > -1)
{
strtok(sBuffer, szKey, charsmax(szKey), sBuffer, charsmax(sBuffer), '=');
trim(szKey);
trim(sBuffer);
remove_quotes(szKey);
remove_quotes(sBuffer);
if(equali(szKEYS[KEY_SKIN_MDL], szKey, strlen(szKey)) && !(iKey & (1<<KEY_SKIN_MDL)))
{
iKey |= (1<<KEY_SKIN_MDL);
TrieSetString(gtrie_gang_skin_mdls, xArray[GANG_SKIN_NAME], sBuffer);
formatex(xArray[GANG_SKIN_MDL], charsmax(xArray[GANG_SKIN_MDL]), sBuffer);
ArraySetArray(garray_gang_skins, iItemIndex, xArray);
formatex(sBuffer, charsmax(sBuffer), "models/player/%s/%s.mdl", xArray[GANG_SKIN_MDL], xArray[GANG_SKIN_MDL]);
precache_model(sBuffer);
formatex(sBuffer, charsmax(sBuffer), "models/player/%s/%sT.mdl", xArray[GANG_SKIN_MDL], xArray[GANG_SKIN_MDL]);
if(file_exists(sBuffer)) precache_model(sBuffer);
continue;
}
if(equali(szKEYS[KEY_SKIN_ACCESS], szKey, strlen(szKey)) && !(iKey & (1<<KEY_SKIN_ACCESS)))
{
iKey |= (1<<KEY_SKIN_ACCESS);
xArray[GANG_SKIN_ACCESS] = read_flags(sBuffer);
ArraySetArray(garray_gang_skins, iItemIndex, xArray);
}
}
}
fclose(fp);
}
get_configsdir(sFile, charsmax(sFile))
formatex(GANGS_FILE, charsmax(GANGS_FILE), "%s/%s", sFile, gang_file)
if(!file_exists(GANGS_FILE))
{
write_file(GANGS_FILE, "; [Gang name] ^"Gang Skin^"");
write_file(GANGS_FILE, "; ^"Member Steamid^" ^"Member ingang status^" ^"Member nickname^"^n");
}
fp = fopen(GANGS_FILE, "rt");
if(fp)
{
new xArray[GANGS_INFO], sBuffer[256], szAuthid[32], szGangStatus[8], szName[32];
while(!feof(fp))
{
fgets(fp, sBuffer, charsmax(sBuffer));
trim(sBuffer);
if(sBuffer[0] == EOS || sBuffer[0] == ';' || strlen(sBuffer) <= 3 || (sBuffer[0] == '/' && sBuffer[1] == '/'))
continue;
if(sBuffer[0] == '[')
{
copyc(xArray[GANG_NAME], charsmax(xArray[GANG_NAME]), sBuffer[1], ']');
strtok(sBuffer, "", 0, sBuffer, charsmax(sBuffer), ']');
parse(sBuffer, szName, charsmax(szName), sBuffer, charsmax(sBuffer));
remove_quotes(szName);
remove_quotes(sBuffer);
xArray[GANG_KILLS] = str_to_num(sBuffer);
copy(xArray[GANG_SKIN], charsmax(xArray[GANG_SKIN]), szName);
xArray[GANG_ARRAY_MEMBERS] = _:ArrayCreate(32,1);
xArray[GANG_TRIE_MSTATUS] = _:TrieCreate();
xArray[GANG_TRIE_NAMES] = _:TrieCreate();
ArrayPushArray(garray_gangs, xArray);
continue;
}
if(xArray[GANG_NAME][0] != EOS)
{
if(parse(sBuffer, szAuthid, charsmax(szAuthid), szGangStatus, charsmax(szGangStatus), szName, charsmax(szName)) == 3)
{
ArrayPushString(xArray[GANG_ARRAY_MEMBERS], szAuthid);
TrieSetString(xArray[GANG_TRIE_MSTATUS], szAuthid, szGangStatus)
TrieSetString(xArray[GANG_TRIE_NAMES], szAuthid, szName)
}
}
}
fclose(fp);
}
}
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
g_cvar_gang_cost = register_cvar("jb_gang_creating_cost", "100000");
g_cvar_gang_skin_cost = register_cvar("jb_gang_skin_cost", "20000");
g_cvar_show_gang_info = register_cvar("jb_gang_show_info_len", "0");
mm_itemid_gang = register_jailbreak_mmitem("Gang Menu", _, TEAM_PRISONERS)
register_event("StatusValue", "fw_statusvalue", "be", "1=2");
register_menucmd(register_menuid("GANG_MAIN_MENU"), MENU_KEYS, "gang_mainmenu_handler")
register_clcmd("enter_gang_name", "clcmd_enter_gang_name")
register_clcmd("search_for", "clcmd_search_for")
register_clcmd("say /mygang", "ShowGang")
RegisterHam(Ham_Spawn, "player", "fw_player_respawn_post", 1)
RegisterHam(Ham_Killed, "player", "fw_player_killed_post", 1)
register_clcmd("amx_gangsmenu", "clcmd_gangsmenu", ADMIN_ALL|ADMIN_IMMUNITY, "show all gangs")
cvar_maxmembers_slots = register_cvar("jb_gang_max_memberslots", "5");
g_msgStatusText = get_user_msgid("StatusText");
ColorMode = register_cvar("colorchat_mode", "1");
register_clcmd("say", "hook_say");
register_clcmd("say_team", "hook_team_say");
TeamInfo = get_user_msgid("TeamInfo");
SayText = get_user_msgid("SayText");
MaxSlots = get_maxplayers();
}
public plugin_cfg()
{
new maxslots = get_pcvar_num(cvar_maxmembers_slots);
for(new i, maxloop = ArraySize(garray_gangs), xArray[GANGS_INFO]; i < maxloop; i++)
{
ArrayGetArray(garray_gangs, i, xArray);
TrieSetCell(gtrie_gang_maxslots, xArray[GANG_NAME], maxslots);
}
}
public fw_statusvalue(id)
{
new target = read_data(2);
if(!target && read_data(1) > 0)
{
show_gang_info(id, id, get_pcvar_num(g_cvar_show_gang_info))
return;
}
if(!check_flag(g_user_alive,id) ||
!check_flag(g_user_alive,target) ||
user_gang_data[target][USER_GANG_STATUS] == NOT_INGANG)
return;
if(get_user_team(target) == TEAM_PRISONERS && get_user_team(id) == TEAM_PRISONERS)
{
show_gang_info(id, target, get_pcvar_num(g_cvar_show_gang_info))
}
}
public ShowGang(id)
{
CC_SendMessage(id, "Your Gangs: %s", user_gang_data[id][USER_GANG_NAME])
CC_SendMessage(id, "Your Gangs: %s", USER_STATUS[user_gang_data[id][USER_GANG_STATUS]])
}
public hook_say(id) {
static text2[200];
read_args(text2, 199);
remove_quotes(text2);
trim(text2);
new name[32];
get_user_name(id, name, 31);
if(equal(text2, ""))
return PLUGIN_HANDLED;
if(user_gang_data[id][USER_GANG_STATUS] == NOT_INGANG)
{
return;
}
switch(get_pcvar_num(ColorMode)) {
case 1:
{
if(is_user_alive(id))
ColorChat(0, RED, "(%s) [%s]^x01%s : ^x03%s", USER_STATUS[user_gang_data[id][USER_GANG_STATUS]], user_gang_data[id][USER_GANG_NAME], name, text2);
else
ColorChat(0, RED, "^x01*DEAD* (%s) [%s] %s : ^x03%s", USER_STATUS[user_gang_data[id][USER_GANG_STATUS]], user_gang_data[id][USER_GANG_NAME], name, text2);
}
case 2:
{
if(is_user_alive(id))
ColorChat(0, GREEN, "(%s) [%s]^x01%s : ^x04%s", USER_STATUS[user_gang_data[id][USER_GANG_STATUS]], user_gang_data[id][USER_GANG_NAME], name, text2);
else
ColorChat(0, GREEN, "^x01*DEAD* (%s) [%s] %s : ^x04%s", USER_STATUS[user_gang_data[id][USER_GANG_STATUS]], user_gang_data[id][USER_GANG_NAME], name, text2);
}
case 3:
{
if(is_user_alive(id))
ColorChat(0, BLUE, "(%s) [%s]^x01%s : ^x03%s", USER_STATUS[user_gang_data[id][USER_GANG_STATUS]], user_gang_data[id][USER_GANG_NAME], name, text2);
else
ColorChat(0, BLUE, "^x01*DEAD* (%s) [%s] %s : ^x03%s", USER_STATUS[user_gang_data[id][USER_GANG_STATUS]], user_gang_data[id][USER_GANG_NAME], name, text2);
}
}
return PLUGIN_HANDLED;
}
public hook_team_say(id) {
if(!get_pcvar_num(ColorMode))
return PLUGIN_CONTINUE;
static text2[200];
read_args(text2, 199);
remove_quotes(text2);
trim(text2);
new name[32];
get_user_name(id, name, 31);
if(equal(text2, ""))
return PLUGIN_HANDLED;
switch(get_pcvar_num(ColorMode)) {
case 1:
{
if((is_user_alive(id) == 0))
ColorChat(0, RED, "^x01*DEAD* (%s) [ %s %s : ^x03%s", name, text2);
else
ColorChat(0, RED, "%s : %s", name, text2);
}
case 2:
{
if((is_user_alive(id) == 0))
ColorChat(0, GREEN, "^x01*DEAD* %s : ^x04%s", name, text2);
else
ColorChat(0, GREEN, "%s : %s", name, text2);
}
case 3:
{
if((is_user_alive(id) == 0))
ColorChat(0, BLUE, "^x01*DEAD* %s : ^x03%s", name, text2);
else
ColorChat(0, BLUE, "%s : %s", name, text2);
}
}
return PLUGIN_HANDLED;
}
public ColorChat(id, Color:type, const msg[], {Float,Sql,Result,_}:...)
{
static message[256];
switch(type)
{
case YELLOW: // Yellow
{
message[0] = 0x01;
}
case GREEN: // Green
{
message[0] = 0x04;
}
default: // White, Red, Blue
{
message[0] = 0x03;
}
}
vformat(message[1], 251, msg, 4);
// Make sure message is not longer than 192 character. Will crash the server.
message[192] = '^0';
new team, ColorChange, index, MSG_Type;
if(!id)
{
index = FindPlayer();
MSG_Type = MSG_ALL;
} else {
MSG_Type = MSG_ONE;
index = id;
}
team = get_user_team(index);
ColorChange = ColorSelection(index, MSG_Type, type);
ShowColorMessage(index, MSG_Type, message);
if(ColorChange)
{
Team_Info(index, MSG_Type, TeamName[team]);
}
}
ShowColorMessage(id, type, message[])
{
emessage_begin(type, SayText, _, id);
ewrite_byte(id)
ewrite_string(message);
emessage_end();
}
Team_Info(id, type, team[])
{
emessage_begin(type, TeamInfo, _, id);
ewrite_byte(id);
ewrite_string(team);
emessage_end();
return 1;
}
ColorSelection(index, type, Color:Type)
{
switch(Type)
{
case RED:
{
return Team_Info(index, type, TeamName[1]);
}
case BLUE:
{
return Team_Info(index, type, TeamName[2]);
}
case GREY:
{
return Team_Info(index, type, TeamName[0]);
}
}
return 0;
}
FindPlayer()
{
new i = -1;
while(i <= MaxSlots)
{
if(IsConnected[++i])
{
return i;
}
}
return -1;
}
public clcmd_gangsmenu(id, level, cid)
{
if(!cmd_access(id, level, cid, 1))
return PLUGIN_HANDLED;
new total_gangs;
if(!(total_gangs=ArraySize(garray_gangs)))
{
console_print(id, "No gangs were found!")
return PLUGIN_HANDLED;
}
new menu = menu_create("\rADMIN GANGS PANEL\y!", "gangsmenu_handler")
for(new i, szGangID[10], xArray[GANGS_INFO]; i < total_gangs; i++)
{
ArrayGetArray(garray_gangs, i, xArray);
num_to_str(i, szGangID, charsmax(szGangID));
menu_additem(menu, xArray[GANG_NAME], szGangID);
}
menu_display(id, menu)
return PLUGIN_HANDLED;
}
public gangsmenu_handler(id, menu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(menu)
return PLUGIN_HANDLED;
}
new paccess, callback, sData[10];
menu_item_getinfo(menu, item, paccess, sData, charsmax(sData), "", 0, callback)
menu_destroy(menu);
apanel_gang_info(id, str_to_num(sData));
return PLUGIN_HANDLED;
}
apanel_gang_info(id, gangid)
{
new sText[196], xArray[GANGS_INFO], szOwner[32];
ArrayGetArray(garray_gangs, gangid, xArray);
formatex(gang_name_edition[id], charsmax(gang_name_edition[]), xArray[GANG_NAME])
// seeking for the gang owner name...
for(new i, szStatus[8], maxloop = ArraySize(xArray[GANG_ARRAY_MEMBERS]); i < maxloop; i++)
{
ArrayGetString(xArray[GANG_ARRAY_MEMBERS], i, szOwner, charsmax(szOwner))
TrieGetString(xArray[GANG_TRIE_MSTATUS], szOwner, szStatus, charsmax(szStatus))
if(equali(USER_STATUS[GANG_OWNER], szStatus))
{
break;
}
}
new iOwner; // getting the owner name;
if((iOwner = find_player("c", szOwner)) > 0)
{
get_user_name(iOwner, szOwner, charsmax(szOwner));
}
else
{
TrieGetString(xArray[GANG_TRIE_NAMES], szOwner, szOwner, charsmax(szOwner))
}
formatex(sText, charsmax(sText), "\
\y-=[\rGANG INFORMATION\y]=-\
^n\rGANG-NAME: \y%s^n\
\rGANG-SKIN: \y%s^n\
\rGANG-OWNER: \y%s^n\
\rGANG-MEMBERS: \y%d\
\rGANG-KILLS: \y%d",
xArray[GANG_NAME], xArray[GANG_SKIN], szOwner, ArraySize(xArray[GANG_ARRAY_MEMBERS]), xArray[GANG_KILLS])
new menu = menu_create(sText, "apanel_handler")
new szGangID[10]; num_to_str(gangid, szGangID, charsmax(szGangID));
menu_additem(menu, "Delete the Gang!", szGangID)
menu_additem(menu, "Reset Gang Kills!", szGangID)
menu_display(id, menu)
}
public apanel_handler(id, menu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(menu);
return PLUGIN_HANDLED;
}
new sData[10], paccess, callback;
if(menu > -1000)
{
menu_item_getinfo(menu, item, paccess, sData, charsmax(sData), "", 0, callback);
menu_destroy(menu);
}
else
{
num_to_str(-(menu + 1000), sData, charsmax(sData))
}
new iGangID = str_to_num(sData), xArray[GANGS_INFO];
if((0 <= iGangID < ArraySize(garray_gangs)))
{
ArrayGetArray(garray_gangs, iGangID, xArray);
}
if(!equal(gang_name_edition[id], xArray[GANG_NAME]) && menu > -1000)
{
cprint_chat(id, _, "The !g%s !ygang is not !texisted!g!", gang_name_edition[id])
return PLUGIN_HANDLED;
}
new szAdminName[32];
get_user_name(id, szAdminName, charsmax(szAdminName))
new sBuffer[256], szGangname[32];
new fp = fopen(GANGS_FILE, "rt"), sFile2[128];
formatex(sFile2, charsmax(sFile2), "%s2", GANGS_FILE)
new fp2 = fopen(sFile2, "wt");
if(!fp2 || !fp)
{
log_error(AMX_ERR_GENERAL, "failed to create a file '%s'", sFile2)
return PLUGIN_HANDLED;
}
switch( item )
{
case 0:
{
new bool:bRemoval=false;
fseek(fp, 0, SEEK_SET);
while(!feof(fp))
{
fgets(fp, sBuffer, charsmax(sBuffer));
trim(sBuffer);
if(sBuffer[0] == EOS || sBuffer[0] == ';' || strlen(sBuffer) <= 3 || (sBuffer[0] == '/' && sBuffer[1] == '/'))
{
fputs(fp2, sBuffer);
fputc(fp2, '^n');
continue;
}
if(sBuffer[0] == '[')
{
bRemoval = false;
copyc(szGangname, charsmax(szGangname), sBuffer[1], ']');
if(equal(szGangname, xArray[GANG_NAME]))
{
bRemoval = true;
}
}
if(bRemoval)
{
format(sBuffer, charsmax(sBuffer), "; %s", sBuffer);
fputs(fp2, sBuffer);
fputc(fp2, '^n');
continue;
}
fputs(fp2, sBuffer);
fputc(fp2, '^n');
}
fclose(fp);
fclose(fp2);
delete_file(GANGS_FILE);
if(!rename_file(sFile2, GANGS_FILE, 1))
{
delete_file(sFile2);
}
ArrayDeleteItem(garray_gangs, iGangID);
ArrayDestroy(xArray[GANG_ARRAY_MEMBERS]);
TrieDestroy(xArray[GANG_TRIE_MSTATUS]);
TrieDestroy(xArray[GANG_TRIE_NAMES]);
new players[32],pnum;
get_players(players, pnum, "ch")
for(new i, player; i < pnum; i++)
{
player = players[i];
if(equal(xArray[GANG_NAME], user_gang_data[player][USER_GANG_NAME]))
{
user_gang_data[player][USER_GANG_STATUS] = NOT_INGANG;
user_gang_data[player][USER_GANG_ID] = -1;
user_gang_data[player][USER_GANG_NAME][0] = EOS;
user_gang_data[player][USER_GANG_SKIN][0] = EOS;
}
}
if(menu > -1000)
{
cprint_chat(0, _, "!gAdmin !t%s !yhas deleted the !g%s !tGang!y.", szAdminName, xArray[GANG_NAME]);
formatex(sBuffer, charsmax(sBuffer), "ADMIN %s HAS DELETED THE %s GANG", szAdminName, xArray[GANG_NAME])
}
else
{
cprint_chat(0, _, "!g%s !tGang !yhas been !gdestroyed!", xArray[GANG_NAME])
formatex(sBuffer, charsmax(sBuffer), "OWNER %s HAS LEFT THE %s GANG AND THEREFORE ITS BEEN REMOVED!", szAdminName, xArray[GANG_NAME])
}
log_amx(sBuffer);
jb_logmessage(sBuffer);
}
default:
{
fseek(fp, 0, SEEK_SET);
while(!feof(fp))
{
fgets(fp, sBuffer, charsmax(sBuffer));
trim(sBuffer);
if(sBuffer[0] == EOS || sBuffer[0] == ';' || strlen(sBuffer) <= 3 || (sBuffer[0] == '/' && sBuffer[1] == '/'))
{
fputs(fp2, sBuffer);
fputc(fp2, '^n');
continue;
}
if(sBuffer[0] == '[')
{
copyc(szGangname, charsmax(szGangname), sBuffer[1], ']')
if(equal(szGangname, xArray[GANG_NAME]))
{
formatex(sBuffer, charsmax(sBuffer), "[%s] ^"%s^" ^"0^"", xArray[GANG_NAME], xArray[GANG_SKIN])
xArray[GANG_KILLS] = 0;
cprint_chat(0, _, "!gAdmin !t%s !yhas reset the !g%s !tGang kills!y.", szAdminName, xArray[GANG_NAME])
formatex(sBuffer, charsmax(sBuffer), "ADMIN %s HAS RESET THE %s GANG KILLS", szAdminName, xArray[GANG_NAME])
log_amx(sBuffer);
jb_logmessage(sBuffer);
}
}
fputs(fp2, sBuffer);
fputc(fp2, '^n');
}
fclose(fp);
fclose(fp2);
delete_file(GANGS_FILE);
if(!rename_file(sFile2, GANGS_FILE, 1))
{
delete_file(sFile2);
}
ArraySetArray(garray_gangs, iGangID, xArray);
}
}
return PLUGIN_HANDLED;
}
public fw_player_killed_post(victim, attacker, shouldgib)
{
// attacker is connected and its not a suicide and the victim is not from the gang...
if(!is_user_connected(attacker) || victim == attacker) return;
static killer_gang; killer_gang = user_gang_data[attacker][USER_GANG_ID];
if(killer_gang != user_gang_data[victim][USER_GANG_ID] &&
user_gang_data[attacker][USER_GANG_STATUS] != NOT_INGANG)
{
static xArray[GANGS_INFO];
ArrayGetArray(garray_gangs, killer_gang, xArray);
xArray[GANG_KILLS] ++;
ArraySetArray(garray_gangs, killer_gang, xArray);
static fp, fp2, sFile2[128];
fp = fopen(GANGS_FILE, "rt");
formatex(sFile2, charsmax(sFile2), "%s2", GANGS_FILE)
fp2 = fopen(sFile2, "wt");
if(!fp2 || !fp)
{
log_error(AMX_ERR_GENERAL, "failed to create a file '%s'", sFile2)
return;
}
static sBuffer[196], szGangname[32];
fseek(fp, 0, SEEK_SET);
while(!feof(fp))
{
fgets(fp, sBuffer, charsmax(sBuffer));
trim(sBuffer);
if(sBuffer[0] == EOS || sBuffer[0] == ';' || strlen(sBuffer) <= 3 || (sBuffer[0] == '/' && sBuffer[1] == '/'))
{
fprintf(fp2, "%s^n", sBuffer);
continue;
}
if(sBuffer[0] == '[')
{
copyc(szGangname, charsmax(szGangname), sBuffer[1], ']')
if(equal(szGangname, xArray[GANG_NAME]))
{
formatex(sBuffer, charsmax(sBuffer), "[%s] ^"%s^" ^"%d^"", xArray[GANG_NAME], xArray[GANG_SKIN], xArray[GANG_KILLS])
}
}
fputs(fp2, sBuffer);
fputc(fp2, '^n');
}
fclose(fp);
fclose(fp2);
delete_file(GANGS_FILE);
if(!rename_file(sFile2, GANGS_FILE, 1)) delete_file(sFile2);
}
}
public fw_player_respawn_post(id)
{
if(!is_user_alive(id)) return;
set_flag(g_user_alive,id);
if(user_gang_data[id][USER_GANG_STATUS] == NOT_INGANG || get_user_team(id) != TEAM_PRISONERS)
{
return;
}
new sString[32], szModel[32];
copy(sString, charsmax(sString), user_gang_data[id][USER_GANG_SKIN]);
if(!equali(sString, "None") && sString[0] != EOS)
{
TrieGetString(gtrie_gang_skin_mdls, sString, szModel, charsmax(szModel));
cs_set_player_model(id, szModel)
}
}
public plugin_natives()
{
register_native("jb_get_user_gang_status", "_get_user_gang_status");
register_native("jb_get_user_gang_name", "_get_user_gang_name");
register_native("jb_get_user_gang_kills", "_get_user_gang_kills");
register_native("jb_set_user_gang", "_set_user_gang");
register_native("jb_remove_user_fromgang", "_remove_user_fromgang");
register_native("jb_set_gang_maxslots", "_set_gang_maxslots")
register_native("jb_get_gang_maxslots", "_get_gang_maxslots")
}
public _set_gang_maxslots(plugin, arg)
{
new xArray[GANGS_INFO];
ArrayGetArray(garray_gangs, get_param(1), xArray);
TrieSetCell(gtrie_gang_maxslots, xArray[GANG_NAME], get_param(2));
}
public _get_gang_maxslots(plugin, arg)
{
new xArray[GANGS_INFO], iValue;
ArrayGetArray(garray_gangs, get_param(1), xArray);
TrieGetCell(gtrie_gang_maxslots, xArray[GANG_NAME], iValue);
return iValue
}
public _get_user_gang_kills(plugin, arg)
{
new xArray[GANGS_INFO];
ArrayGetArray(garray_gangs, user_gang_data[get_param(1)][USER_GANG_ID], xArray);
return xArray[GANG_KILLS];
}
public _get_user_gang_status(plugin, arg) return user_gang_data[get_param(1)][USER_GANG_STATUS];
public _get_user_gang_name(plugin, arg) set_string(2, user_gang_data[get_param(1)][USER_GANG_NAME], get_param(3));
public _set_user_gang(plugin, arg)
{
new szAuthid[32];
get_string(1, szAuthid, charsmax(szAuthid));
set_user_gang(szAuthid, get_param(2), get_param(3));
}
public _remove_user_fromgang(plugin, argc)
{
new szAuthid[32];
get_string(1, szAuthid, charsmax(szAuthid));
remove_user_fromgang(szAuthid, get_param(2));
}
public client_authorized(id)
{
load_user_gang(id)
g_user_rejected_inv[id] = 0;
g_user_rejected_req[id] = 0;
}
public client_disconnect(id)
{
remove_flag(g_user_alive,id);
}
load_user_gang(id)
{
user_gang_data[id][USER_GANG_STATUS] = NOT_INGANG;
user_gang_data[id][USER_GANG_ID] = -1;
user_gang_data[id][USER_GANG_NAME][0] = EOS;
user_gang_data[id][USER_GANG_SKIN][0] = EOS;
new xArray[GANGS_INFO], szAuthid[32];
get_user_authid(id, szAuthid, charsmax(szAuthid))
for(new i, maxloop = ArraySize(garray_gangs); i < maxloop; i++)
{
ArrayGetArray(garray_gangs, i, xArray)
if(TrieKeyExists(xArray[GANG_TRIE_MSTATUS], szAuthid))
{
new szStatus[10];
TrieGetString(xArray[GANG_TRIE_MSTATUS], szAuthid, szStatus, charsmax(szStatus))
user_gang_data[id][USER_GANG_ID] = i;
copy(user_gang_data[id][USER_GANG_NAME], charsmax(user_gang_data[][USER_GANG_NAME]), xArray[GANG_NAME])
copy(user_gang_data[id][USER_GANG_SKIN], charsmax(user_gang_data[][USER_GANG_SKIN]), xArray[GANG_SKIN])
switch( szStatus[0] )
{
case 'm','M': user_gang_data[id][USER_GANG_STATUS] = GANG_MEMBER;
case 'o','O': user_gang_data[id][USER_GANG_STATUS] = GANG_OWNER;
case 'l','L': user_gang_data[id][USER_GANG_STATUS] = GANG_LEADER;
}
break;
}
}
}
set_user_gang(const szAuthid[], gang, status)
{
new xArray[GANGS_INFO], szName[32];
ArrayGetArray(garray_gangs, gang, xArray);
if(TrieKeyExists(xArray[GANG_TRIE_NAMES],szAuthid))
{
TrieGetString(xArray[GANG_TRIE_NAMES], szAuthid, szName, charsmax(szName))
}
new id = find_player("c", szAuthid);
if(id > 0) get_user_name(id, szName, charsmax(szName));
remove_user_fromgang(szAuthid, gang);
new fp = fopen(GANGS_FILE, "rt"), sFile2[128];
formatex(sFile2, charsmax(sFile2), "%s2", GANGS_FILE)
new fp2 = fopen(sFile2, "wt");
if(!fp || !fp2)
{
fclose(fp);
fclose(fp2);
return;
}
new szGangname[32], sBuffer[256];
while(!feof(fp))
{
fgets(fp, sBuffer, charsmax(sBuffer));
trim(sBuffer);
if(sBuffer[0] == EOS ||
sBuffer[0] == ';' ||
(sBuffer[0] == '/' && sBuffer[1] == '/') ||
strlen(sBuffer) <= 3)
{
fprintf(fp2, "%s^n", sBuffer);
continue;
}
if(sBuffer[0] == '[')
{
copyc(szGangname, charsmax(szGangname), sBuffer[1], ']');
if(equal(szGangname, xArray[GANG_NAME]))
{
format(sBuffer, charsmax(sBuffer), "%s^n\
^"%s^" ^"%s^" ^"%s^"", sBuffer, szAuthid, USER_STATUS[status], szName);
ArrayPushString(xArray[GANG_ARRAY_MEMBERS], szAuthid);
TrieSetString(xArray[GANG_TRIE_NAMES], szAuthid, szName);
TrieSetString(xArray[GANG_TRIE_MSTATUS], szAuthid, USER_STATUS[status]);
if(id > 0)
{
user_gang_data[id][USER_GANG_ID] = gang;
copy(user_gang_data[id][USER_GANG_NAME], charsmax(user_gang_data[][USER_GANG_NAME]), xArray[GANG_NAME]);
copy(user_gang_data[id][USER_GANG_SKIN], charsmax(user_gang_data[][USER_GANG_SKIN]), xArray[GANG_SKIN]);
user_gang_data[id][USER_GANG_STATUS] = status;
}
}
}
fputs(fp2, sBuffer);
fputc(fp2, '^n');
}
fclose(fp);
fclose(fp2);
delete_file(GANGS_FILE)
if(!rename_file(sFile2, GANGS_FILE, 1))
{
delete_file(sFile2);
}
}
remove_user_fromgang(const szAuthid[], gangid)
{
new xArray[GANGS_INFO];
ArrayGetArray(garray_gangs, gangid, xArray);
new fp = fopen(GANGS_FILE, "rt"), sFile2[128];
formatex(sFile2, charsmax(sFile2), "%s2", GANGS_FILE)
new fp2 = fopen(sFile2, "wt");
if(!fp || !fp2)
{
fclose(fp);
fclose(fp2);
return;
}
new szAuthid2[32], sBuffer[256];
while(!feof(fp))
{
fgets(fp, sBuffer, charsmax(sBuffer));
trim(sBuffer);
if(sBuffer[0] == EOS ||
sBuffer[0] == ';' ||
(sBuffer[0] == '/' && sBuffer[1] == '/') ||
strlen(sBuffer) <= 3)
{
fprintf(fp2, "%s^n", sBuffer);
continue;
}
parse(sBuffer, szAuthid2, charsmax(szAuthid2));
remove_quotes(szAuthid2);
if(equal(szAuthid2, szAuthid))
{
format(sBuffer, charsmax(sBuffer), "; %s", sBuffer);
}
fputs(fp2, sBuffer);
fputc(fp2, '^n');
}
fclose(fp);
fclose(fp2);
delete_file(GANGS_FILE)
if(!rename_file(sFile2, GANGS_FILE, 1))
{
delete_file(sFile2);
}
for(new i, szString[32], maxloop = ArraySize(xArray[GANG_ARRAY_MEMBERS]); i < maxloop; i++)
{
ArrayGetString(xArray[GANG_ARRAY_MEMBERS], i, szString, charsmax(szString))
if(equal(szString, szAuthid))
{
ArrayDeleteItem(xArray[GANG_ARRAY_MEMBERS], i);
break;
}
}
TrieDeleteKey(xArray[GANG_TRIE_NAMES], szAuthid);
TrieDeleteKey(xArray[GANG_TRIE_MSTATUS], szAuthid);
new id = find_player("c", szAuthid);
if(!ArraySize(xArray[GANG_ARRAY_MEMBERS]) || (id > 0 && user_gang_data[id][USER_GANG_STATUS] == GANG_OWNER))
{
apanel_handler(id, ((-1 * gangid) - 1000), 0)
}
if(id > 0)
{
user_gang_data[id][USER_GANG_ID] = -1;
user_gang_data[id][USER_GANG_NAME][0] = EOS;
user_gang_data[id][USER_GANG_SKIN][0] = EOS;
user_gang_data[id][USER_GANG_STATUS] = NOT_INGANG;
}
}
public clcmd_search_for(id)
{
if(user_gang_data[id][USER_GANG_STATUS] == NOT_INGANG) return PLUGIN_HANDLED;
new sString[32];
read_args(sString, charsmax(sString))
remove_quotes(sString)
formatex(user_find_members[id], charsmax(user_find_members[]), sString)
gang_members_menu(id, g_userpage[id])
return PLUGIN_HANDLED;
}
public clcmd_enter_gang_name(id)
{
if(!(check_flag(g_user_ingang_creation,id)) || user_gang_data[id][USER_GANG_STATUS] != NOT_INGANG)
{
return PLUGIN_HANDLED;
}
new sString[32];
read_args(sString, charsmax(sString))
remove_quotes(sString)
if(strlen(sString) <= 3)
{
formatex(user_gang_data[id][USER_GANG_NAME], charsmax(user_gang_data[][USER_GANG_NAME]), "Gang name is too short!")
set_flag(g_user_cant_create_agang,id)
gang_creation(id);
return PLUGIN_HANDLED;
}
for(new i, xArray[GANGS_INFO], maxloop = ArraySize(garray_gangs); i < maxloop; i++)
{
ArrayGetArray(garray_gangs, i, xArray)
if(equali(xArray[GANG_NAME], sString))
{
formatex(user_gang_data[id][USER_GANG_NAME], charsmax(user_gang_data[][USER_GANG_NAME]), "Gang name is not valid!")
set_flag(g_user_cant_create_agang,id)
gang_creation(id);
return PLUGIN_HANDLED;
}
}
remove_flag(g_user_cant_create_agang,id)
formatex(user_gang_data[id][USER_GANG_NAME], charsmax(user_gang_data[][USER_GANG_NAME]), sString)
gang_creation(id)
return PLUGIN_HANDLED;
}
show_gang_info(id, target, len)
{
if(user_gang_data[target][USER_GANG_STATUS] == NOT_INGANG)
{
return;
}
new xArray[GANGS_INFO], sString[196];
ArrayGetArray(garray_gangs, user_gang_data[target][USER_GANG_ID], xArray);
formatex(sString, charsmax(sString), "%s of %s Gang.",
USER_STATUS[user_gang_data[target][USER_GANG_STATUS]], xArray[GANG_NAME])
message_begin(MSG_ONE_UNRELIABLE, g_msgStatusText, {0,0,0}, id)
write_byte(len)
write_string(sString)
message_end()
}
public jb_mm_itemselected(id, itemid)
{
if(itemid == mm_itemid_gang)
{
gang_mainmenu(id);
}
}
public gang_mainmenu(id)
{
new sMenu[256], iLen, iKeys;
if(user_gang_data[id][USER_GANG_STATUS] == NOT_INGANG)
{
iLen = formatex(sMenu, charsmax(sMenu), "You're currently not participating in any gang!^n^n")
if(jb_get_user_cash(id) > get_pcvar_num(g_cvar_gang_cost))
{
iKeys |= MENU_KEY_1;
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\w1\r. \wCREATE A GANG \r( \y%d$ \r)^n^n", get_pcvar_num(g_cvar_gang_cost))
}
else
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\d1. CREATE A GANG ( %d$ )^n^n", get_pcvar_num(g_cvar_gang_cost))
iKeys |= MENU_KEY_3;
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\w3\r. \wJOIN A GANG\r!^n")
}
else
{
iLen = formatex(sMenu[iLen], charsmax(sMenu), "You're participating in \r[%s] \yGANG!^n\rPosition: \w%s^n^n",
user_gang_data[id][USER_GANG_NAME], USER_STATUS[user_gang_data[id][USER_GANG_STATUS]])
if(user_gang_data[id][USER_GANG_STATUS] > GANG_MEMBER)
{
iKeys |= MENU_KEY_1;
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\w1\y. \rLeaders Only^n");
}
else iLen += formatex(sMenu[iLen], charsmax(sMenu), "\d1. Leaders Only^n")
iKeys |= MENU_KEY_2;
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\w2\y. \rInvite a person!^n")
iKeys |= MENU_KEY_3;
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\w3\y. \rGANG \yMembers!^n^n")
iKeys |= MENU_KEY_5;
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\w5\y. \rLeave The GANG!^n")
}
iKeys |= MENU_KEY_7;
iLen += formatex(sMenu[iLen], charsmax(sMenu), "^n\r7. \wAVAILABLE GANGS \r!^n")
iKeys |= MENU_KEY_8;
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\r8. \wTOP \y%d \rGANGS!^n^n", SHOW_TOP_GANGS)
iKeys |= MENU_KEY_0;
iLen += formatex(sMenu[iLen], charsmax(sMenu), "\w0\y. \rExit!")
show_menu(id, iKeys, sMenu, _, "GANG_MAIN_MENU")
}
public gang_mainmenu_handler(id, key)
{
if(key == 9)
{
return PLUGIN_HANDLED;
}
if(key == 6)
{
g_userpage[id] = 0;
available_gangmenu(id, 0);
return PLUGIN_HANDLED;
}
if(key == 7)
{
show_top_gangs(id)
return PLUGIN_HANDLED;
}
if(user_gang_data[id][USER_GANG_STATUS] == NOT_INGANG)
{
switch( key )
{
case 0: // key number 1
{
formatex(user_gang_data[id][USER_GANG_SKIN], charsmax(user_gang_data[][USER_GANG_SKIN]), "None")
formatex(user_gang_data[id][USER_GANG_NAME], charsmax(user_gang_data[][USER_GANG_NAME]), "Type in your gang name!")
set_flag(g_user_cant_create_agang,id);
gang_creation(id)
}
case 2: // key number 3
{
join_gang_menu(id);
}
}
}
else
{
switch( key )
{
case 0: // key number 1
{
g_userpage[id] = 0;
leader_menu(id, 0);
}
case 1: // key number 2
{
invite_gang_menu(id)
}
case 2: // key number 3
{
g_userpage[id] = 0;
formatex(user_find_members[id], charsmax(user_find_members[]), "")
gang_members_menu(id, 0)
}
case 4: // key number 5
{
confirmation_menu(id, "Are you sure you want to \rleave the gang!?", "player_left_gang")
}
}
}
return PLUGIN_HANDLED;
}
show_top_gangs(id)
{
new maxloop = ArraySize(garray_gangs);
if(!maxloop)
{
cprint_chat(id, _, "There's no gangs available yet!")
return;
}
new Array:array_topgangs = ArrayCreate(68,1), xArray[GANGS_INFO], count;
if(count < maxloop <= SHOW_TOP_GANGS) count = maxloop;
for(new i; i < maxloop; i++)
{
ArrayGetArray(garray_gangs, i, xArray);
ArrayPushArray(array_topgangs, xArray);
}
ArraySort(array_topgangs, "SortTopGangs");
new sBuffer[1536], iLen;
iLen = formatex(sBuffer, charsmax(sBuffer), "<html><head><style>.TITLES {color:black;font-size:8pt;font-weight:600;text-align:center;vertical-align:middle;background:#EFC929;}")
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen, "tr{color:black;font-size:8pt;font-weight:400;text-align:center;vertical-align:middle;}")
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen, "tr:nth-child(even){background-color: #C2D69A;}tr:nth-child(odd){background-color: #B6DDE8;}</style></head>")
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen, "<body><table align=center border='3' width=^"100%%^" style=^"border-collapse:collapse;^">")
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen, "<tr><td class=TITLES width=16px>ID</td><td class=TITLES>GANG NAME</td><td class=TITLES>GANG MEMBERS</td><td class=TITLES>GANG KILLS</td></tr>")
for(new i; i < count; i++)
{
ArrayGetArray(array_topgangs, i, xArray);
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen, "<tr><td>%d</td><td>%s</td><td>%d</td><td>%d</td></tr>",
(i+1), xArray[GANG_NAME], ArraySize(xArray[GANG_ARRAY_MEMBERS]), xArray[GANG_KILLS])
}
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen, "</table></body></html>")
new sTitle[32]; formatex(sTitle, charsmax(sTitle), "TOP %d GANG!", count)
show_motd(id, sBuffer, sTitle)
ArrayDestroy(array_topgangs);
}
public SortTopGangs(Array:array, item1, item2, const data[], data_size)
{
new xArray[GANGS_INFO], xArray2[GANGS_INFO];
ArrayGetArray(array,item1,xArray)
ArrayGetArray(array,item2,xArray2)
if(xArray[GANG_KILLS] > xArray2[GANG_KILLS])
return -1;
if(xArray[GANG_KILLS] < xArray2[GANG_KILLS])
return 1;
return 0;
}
public player_left_gang(id)
{
if(user_gang_data[id][USER_GANG_STATUS] == NOT_INGANG)
{
return;
}
new szName[32];
get_user_name(id, szName, charsmax(szName));
cprint_chat(0, _, "^4%s ^1has ^3left the ^4%s ^1gang^3!", szName, user_gang_data[id][USER_GANG_NAME]);
get_user_authid(id, szName, charsmax(szName))
remove_user_fromgang(szName, user_gang_data[id][USER_GANG_ID])
}
confirmation_menu(id, const reason[], const function[])
{
new zmenu = menu_create(reason, "confirm_respone")
menu_additem(zmenu, "\yYes!", function)
menu_additem(zmenu, "\rNo!", "")
menu_display(id, zmenu)
}
public confirm_respone(id, menu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(menu)
return;
}
if(item == 0) // key 1(yes)..
{
new sData[32], paccess, callback;
menu_item_getinfo(menu, item, paccess, sData, charsmax(sData), "", 0, callback)
callfunc_begin(sData, "")
callfunc_push_int(id)
callfunc_end()
}
menu_destroy(menu)
}
public gang_creation(id)
{
set_flag(g_user_ingang_creation,id);
new sText[98], menu = menu_create("Fill out the blankets!", "gang_creation_handle"),
sInfo[20], gang_skin_cost = get_pcvar_num(g_cvar_gang_skin_cost), szSkin[32];
copy(szSkin, charsmax(szSkin), user_gang_data[id][USER_GANG_SKIN]);
new total_costs = get_pcvar_num(g_cvar_gang_cost) + (equali(szSkin, "None") ? 0:gang_skin_cost);
formatex(sText, charsmax(sText), "\r[GANG NAME]: \y%s", user_gang_data[id][USER_GANG_NAME])
menu_additem(menu, sText, "1")
if(ArraySize(garray_gang_skins) && jb_get_user_cash(id) >= total_costs)
{
formatex(sText, charsmax(sText), "\r[GANG SKIN]: \y%s^nSkin Cost: \r%d$", szSkin, gang_skin_cost)
menu_additem(menu, sText, "2")
}
else
{
formatex(sText, charsmax(sText), "\d[GANG SKIN]: %s^n\rSkin Cost: \d%d$", szSkin, gang_skin_cost)
menu_additem(menu, sText, "", NO_ACCESS)
}
num_to_str(total_costs, sInfo, charsmax(sInfo))
formatex(sText, charsmax(sText), "%sSubmit!^n\wTotal \yCosts: \r%d$", check_flag(g_user_cant_create_agang,id) ? "\d":"\r", total_costs)
menu_additem(menu, sText, sInfo, check_flag(g_user_cant_create_agang,id) ? NO_ACCESS:0)
menu_display(id, menu)
}
public gang_creation_handle(id, menu, item)
{
if(item == MENU_EXIT)
{
remove_flag(g_user_ingang_creation,id)
menu_destroy(menu);
return PLUGIN_HANDLED;
}
new sData[15], paccess, iCallback
menu_item_getinfo(menu, item, paccess, sData, charsmax(sData), "", 0, iCallback)
menu_destroy(menu);
new iValue = str_to_num(sData);
switch( iValue )
{
case 1:
{
client_cmd(id, "messagemode enter_gang_name")
return PLUGIN_HANDLED;
}
case 2:
{
skins_menu(id);
return PLUGIN_HANDLED;
}
case 3:
{
gang_creation(id)
return PLUGIN_HANDLED;
}
}
if(check_flag(g_user_cant_create_agang,id))
{
gang_creation(id)
return PLUGIN_HANDLED;
}
for(new i, j, maxloop = ArraySize(garray_gangs),
xArray[GANGS_INFO]; i < maxloop; i++)
{
ArrayGetArray(garray_gangs, j, xArray);
if(equal(xArray[GANG_SKIN_MDL], user_gang_data[id][USER_GANG_SKIN]))
{
iValue -= get_pcvar_num(g_cvar_gang_skin_cost);
copy(user_gang_data[id][USER_GANG_SKIN], charsmax(user_gang_data[][USER_GANG_SKIN]), "None");
gang_creation(id);
return PLUGIN_HANDLED;
}
}
if(jb_get_user_cash(id) < iValue)
{
cprint_chat(id, _, "You don't have enough cash to create a gang!")
return PLUGIN_HANDLED;
}
jb_set_user_cash(id, (jb_get_user_cash(id)-iValue))
new sBuffer[196], ilen, sAuthid[32], sName[32];
get_user_name(id, sName, charsmax(sName))
get_user_authid(id, sAuthid, charsmax(sAuthid))
ilen = formatex(sBuffer, charsmax(sBuffer), "^n[%s] ^"%s^" ^"0^"^n",
user_gang_data[id][USER_GANG_NAME], user_gang_data[id][USER_GANG_SKIN])
ilen += formatex(sBuffer[ilen], charsmax(sBuffer)-ilen, "^"%s^" ^"%s^" ^"%s^"", sAuthid, USER_STATUS[GANG_OWNER], sName)
write_file(GANGS_FILE, sBuffer)
new xArray[GANGS_INFO];
copy(xArray[GANG_NAME], charsmax(xArray[GANG_NAME]), user_gang_data[id][USER_GANG_NAME]);
copy(xArray[GANG_SKIN], charsmax(xArray[GANG_SKIN]), user_gang_data[id][USER_GANG_SKIN]);
user_gang_data[id][USER_GANG_ID] = ArraySize(garray_gangs);
user_gang_data[id][USER_GANG_STATUS] = GANG_OWNER;
xArray[GANG_KILLS] = 0;
ArrayPushString((xArray[GANG_ARRAY_MEMBERS] = _:ArrayCreate(32,1)), sAuthid);
TrieSetString((xArray[GANG_TRIE_MSTATUS] = _:TrieCreate()), sAuthid, USER_STATUS[GANG_OWNER]);
TrieSetString((xArray[GANG_TRIE_NAMES] = _:TrieCreate()), sAuthid, sName);
ArrayPushArray(garray_gangs, xArray);
TrieSetCell(gtrie_gang_maxslots, xArray[GANG_NAME], get_pcvar_num(cvar_maxmembers_slots));
log_amx("^n[JB GANG SYSTEM] .:GANG has been Created!:.^n \
(Gang name): %s^n \
(Skin): %s^n \
(Owner): %s", xArray[GANG_NAME], xArray[GANG_SKIN], sName)
cprint_chat(id, _, "your gang has been successfully created, you're now the owner of ^4%s^3!", xArray[GANG_NAME])
cprint_chat(0, _, "^3new gang has been created ^4(%s)^3, by ^4%s^3.", xArray[GANG_NAME], sName)
return PLUGIN_HANDLED;
}
skins_menu(id)
{
if(!check_flag(g_user_ingang_creation,id))
{
return;
}
new sText[64], menu = menu_create("Choose out your gang skin!", "skins_menu_handle"),
szSkin[32]; copy(szSkin, charsmax(szSkin), user_gang_data[id][USER_GANG_SKIN]);
formatex(sText, charsmax(sText), "%sNone", equal(szSkin, "None") ? "\y":"\r")
menu_additem(menu, sText, "None")
for(new i, j, maxloop2 = ArraySize(garray_gangs),
maxloop = ArraySize(garray_gang_skins),
xArray2[GANGS_INFO], xArray[GANG_SKINS_INFO]; i < maxloop; i++)
{
ArrayGetArray(garray_gang_skins, i, xArray)
for(j = 0; j < maxloop2; j++)
{
ArrayGetArray(garray_gangs, j, xArray2);
if(equal(xArray2[GANG_SKIN], xArray[GANG_SKIN_NAME]))
{
xArray[GANG_SKIN_ACCESS] = NO_ACCESS;
j = maxloop2;
}
}
formatex(sText, charsmax(sText), xArray[GANG_SKIN_NAME]);
if((get_user_flags(id) & xArray[GANG_SKIN_ACCESS]) || !xArray[GANG_SKIN_ACCESS])
formatex(sText, charsmax(sText), "%s%s", equal(szSkin, xArray[GANG_SKIN_NAME]) ? "\y":"\r", xArray[GANG_SKIN_NAME]);
menu_additem(menu, sText, xArray[GANG_SKIN_NAME],
((get_user_flags(id) & xArray[GANG_SKIN_ACCESS]) || !xArray[GANG_SKIN_ACCESS]) ? 0:NO_ACCESS)
}
menu_display(id, menu)
}
public skins_menu_handle(id, menu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(menu);
return PLUGIN_HANDLED;
}
new sData[32], paccess, iCallback
menu_item_getinfo(menu, item, paccess, sData, charsmax(sData), "", 0, iCallback)
menu_destroy(menu);
copy(user_gang_data[id][USER_GANG_SKIN], charsmax(user_gang_data[][USER_GANG_SKIN]), sData)
gang_creation(id)
return PLUGIN_HANDLED;
}
available_gangmenu(const id, const page)
{
new total_gangs;
if(!(total_gangs=ArraySize(garray_gangs)))
{
cprint_chat(id, _, "^3There's no available gangs!")
return;
}
new pages = floatround((total_gangs / 10.0), floatround_ceil);
new sText[64];
formatex(sText, charsmax(sText), "\yCurrent \wpage : \r%d\y/\r%d", (page + 1), pages)
new menu = menu_create(sText, "available_gmenu_handler")
menu_additem(menu, "\rShow !^n^n")
menu_additem(menu, "Next page", _, ((page + 1 ) < pages) ? 0:NO_ACCESS)
menu_additem(menu, "Previous page", _, !page ? NO_ACCESS:0)
menu_setprop(menu, MPROP_NOCOLORS, "\w")
menu_setprop(menu, MPROP_EXITNAME, "Return")
menu_display(id, menu)
}
public available_gmenu_handler(id, menu, item)
{
switch( item )
{
case 0: available_gangs(id, g_userpage[id]);
case 1: available_gangmenu(id, ++g_userpage[id]);
case 2: available_gangmenu(id, --g_userpage[id]);
case MENU_EXIT: gang_mainmenu(id);
}
menu_destroy(menu);
return PLUGIN_HANDLED;
}
available_gangs(const id, const page)
{
new total_gangs = ArraySize(garray_gangs);
if(!total_gangs || (floatround((total_gangs / 10.0), floatround_ceil)) <= page)
{
return;
}
new sBuffer[1536], iLen;
iLen = formatex(sBuffer, charsmax(sBuffer), "<html><head><style id=^"XXX_12835_Styles^">")
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen, "tr {padding-top:1px;padding-right:1px;padding-left:1px;mso-ignore:padding;color:black;font-size:12.0pt;")
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen, "font-weight:700;font-family:Calibri, sans-serif;text-align:center;vertical-align:bottom;border-top:1.0pt solid windowtext;")
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen, "border-right:.5pt solid windowtext;border-bottom:none;border-left:1.0pt solid windowtext;background:#FFC819;")
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen, "mso-pattern:black none;white-space:nowrap;}")
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen, "td {width:100pt;} .xID {width:30pt;height:15.0pt;}</style></head>")
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen, "<body><div id=^"XXX_12835^" align=^"center^"><table border=^"1^" style=^"border-collapse:collapse;table-layout:fixed; width:100%;^">")
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen, "<tr><td class=^"xID^">ID</td><td>GANG NAME</td><td>MEMBERS</td><td>GANG SKIN</td><td>OWNER</td></tr>")
new count;
for(new i = (page * 10), xArray[GANGS_INFO], iOwner, j, szOwner[32], szStatus[8], maxloop; i < total_gangs && count < 10; i++)
{
ArrayGetArray(garray_gangs, i, xArray);
// seeking for the gang owner name...
for(j = 0, maxloop = ArraySize(xArray[GANG_ARRAY_MEMBERS]); j < maxloop; j++)
{
ArrayGetString(xArray[GANG_ARRAY_MEMBERS], j, szOwner, charsmax(szOwner))
TrieGetString(xArray[GANG_TRIE_MSTATUS], szOwner, szStatus, charsmax(szStatus))
if(equali(USER_STATUS[GANG_OWNER], szStatus))
{
if((iOwner = find_player("c", szOwner)) > 0)
{
get_user_name(iOwner, szOwner, charsmax(szOwner));
j = maxloop; continue;
}
TrieGetString(xArray[GANG_TRIE_NAMES], szOwner, szOwner, charsmax(szOwner))
j = maxloop;
}
}
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen, "<tr><td>%d</td><td>%s</td><td>%d</td><td>%s</td><td>%s</td></tr>",
(i+1), xArray[GANG_NAME], ArraySize(xArray[GANG_ARRAY_MEMBERS]), xArray[GANG_SKIN], szOwner)
count++;
}
iLen += formatex(sBuffer[iLen], charsmax(sBuffer)-iLen, "</table></div></body></html>")
show_motd(id, sBuffer, "Available Gangs.")
}
gang_members_menu(const id, page)
{
if(user_gang_data[id][USER_GANG_STATUS] == NOT_INGANG) return;
new menu = menu_create("\r~(\yGang Members\r)~", "gmembers_menu_handler"), szText[196], sInfo[8];
formatex(szText, charsmax(szText), "Search for: %s", user_find_members[id])
menu_additem(menu, szText, "1")
new xArray[GANGS_INFO], found;
ArrayGetArray(garray_gangs, user_gang_data[id][USER_GANG_ID], xArray)
for(new i, player, szAuthid[32], szStatus[10], count,
szName[32], maxloop = ArraySize(xArray[GANG_ARRAY_MEMBERS]); i < maxloop; i++)
{
ArrayGetString(xArray[GANG_ARRAY_MEMBERS], i, szAuthid, charsmax(szAuthid));
TrieGetString(xArray[GANG_TRIE_MSTATUS], szAuthid, szStatus, charsmax(szStatus))
TrieGetString(xArray[GANG_TRIE_NAMES], szAuthid, szName, charsmax(szName))
if((player=find_player("c", szAuthid)) > 0)
{
get_user_name(player, szName, charsmax(szName))
}
// not match...!
if(user_find_members[id][0] != EOS &&
containi(szName,user_find_members[id]) == -1)
continue;
if(page * 7 <= found && count < 7)
{
formatex(szText, charsmax(szText), "\r%s \w(\y%s\w) \w[%s\w]", szName, szStatus, !player ? "\rOffline":"\yOnline")
menu_addtext(menu, szText, 0)
count++;
}
found++;
}
new maxpages = clamp(floatround((found / 7.0), floatround_ceil), 1, 999999);
num_to_str(page + 1, sInfo, charsmax(sInfo));
formatex(szText, charsmax(szText), "Next Page!")
menu_additem(menu, szText, sInfo, (page + 1) < maxpages ? 0:NO_ACCESS)
num_to_str(page - 1, sInfo, charsmax(sInfo));
formatex(szText, charsmax(szText), "Previous Page!^n\rPage: (%d/%d)", page+1, maxpages)
menu_additem(menu, szText, sInfo, !page ? NO_ACCESS:0)
menu_setprop(menu, MPROP_EXITNAME, "Return")
menu_display(id, menu)
}
public gmembers_menu_handler(id, menu, item)
{
new sData[8], iGnore;
menu_item_getinfo(menu, item, iGnore, sData, charsmax(sData), _, _, iGnore);
switch( item )
{
case 1: gang_members_menu( id, ++g_userpage[id])
case 2: gang_members_menu( id, --g_userpage[id])
case 0: client_cmd(id, "messagemode search_for")
case MENU_EXIT: gang_mainmenu(id);
}
menu_destroy(menu)
return PLUGIN_HANDLED;
}
join_gang_menu(const id)
{
if(user_gang_data[id][USER_GANG_STATUS] != NOT_INGANG)
{
return;
}
new sText[96];
new menu = menu_create("\rRequest to join a gang...", "jgang_menu_handler")
new players[32], pnum, sInfo[32], sName[32], g_items;
get_players(players, pnum, "ch")
for(new i, xArray[GANGS_INFO], maxslots, player; i < pnum; i++)
{
player = players[i];
if(user_gang_data[player][USER_GANG_STATUS] <= GANG_MEMBER ||
check_flag(g_user_rejected_req[player],id))
{
continue;
}
ArrayGetArray(garray_gangs, user_gang_data[player][USER_GANG_ID], xArray)
TrieGetCell(gtrie_gang_maxslots, xArray[GANG_NAME], maxslots);
if(ArraySize(xArray[GANG_ARRAY_MEMBERS]) >= maxslots) continue;
num_to_str(get_user_userid(player), sInfo, charsmax(sInfo))
get_user_name(player, sName, charsmax(sName))
formatex(sText, charsmax(sText), "\w%s \r%s of \y%s \rGang",
sName, USER_STATUS[user_gang_data[player][USER_GANG_STATUS]], user_gang_data[player][USER_GANG_NAME])
menu_additem(menu, sText, sInfo)
g_items++;
}
if(!g_items)
{
menu_destroy(menu)
return;
}
menu_display(id, menu)
}
public jgang_menu_handler(id, menu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(menu)
return PLUGIN_HANDLED;
}
new sData[32], sName[32], paccess, icallback;
menu_item_getinfo(menu, item, paccess, sData, charsmax(sData), "", 0, icallback)
menu_destroy(menu)
new player = find_player("k", str_to_num(sData));
if(!player || user_gang_data[player][USER_GANG_STATUS] == NOT_INGANG)
{
join_gang_menu(id);
return PLUGIN_HANDLED;
}
get_user_name(id, sName, charsmax(sName))
gang_jrequest_menu(player, get_user_userid(id))
cprint_chat(id, _, "^4The request ^1has been ^3sent!")
cprint_chat(player, _, "^3[^1WARNING^3] ^4: ^3%s ^1wants to ^4join ^1the ^3gang^4!", sName)
client_cmd(player, "spk warning")
return PLUGIN_HANDLED;
}
gang_jrequest_menu(const id, const requesterUID)
{
new requester = find_player("k", requesterUID);
if(!requester ||
user_gang_data[requester][USER_GANG_STATUS] != NOT_INGANG ||
user_gang_data[id][USER_GANG_STATUS] <= GANG_MEMBER)
{
return;
}
new sName[32], sText[64]; get_user_name(requester, sName, charsmax(sName));
formatex(sText, charsmax(sText), "\r%s \yRequest to join the gang\r!", sName)
new menu = menu_create(sText, "gang_jrequest_menu_handler")
num_to_str(requesterUID, sName, charsmax(sName))
menu_additem(menu, "\yAccept!", sName)
menu_additem(menu, "\rReject!", sName)
menu_display(id, menu)
}
public gang_jrequest_menu_handler(id, menu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(menu)
return;
}
new sData[32], paccess, icallback;
menu_item_getinfo(menu, item, paccess, sData, charsmax(sData), "", 0, icallback)
menu_destroy(menu)
new uid = find_player("k", str_to_num(sData));
if(!uid || user_gang_data[uid][USER_GANG_STATUS] != NOT_INGANG ||
user_gang_data[id][USER_GANG_STATUS] <= GANG_MEMBER)
{
return;
}
get_user_authid(uid, sData, charsmax(sData));
switch( item )
{
case 0: // Accept!
{
set_user_gang(sData, user_gang_data[id][USER_GANG_ID], GANG_MEMBER);
get_user_name(uid, sData, charsmax(sData))
cprint_chat(0, _, "!t%s !yhas joined the !g%s !tgang!g!", sData, user_gang_data[id][USER_GANG_NAME])
}
case 1: // Reject!
{
set_flag(g_user_rejected_req[id],uid)
get_user_name(id, sData, charsmax(sData))
cprint_chat(uid, _, "^4%s ^1has ^3Rejected ^1your request!", sData)
}
}
}
invite_gang_menu(const id)
{
if(user_gang_data[id][USER_GANG_STATUS] == NOT_INGANG) return;
if(user_gang_data[id][USER_GANG_STATUS] < GANG_LEADER)
{
cprint_chat(id, _, "You have to be a leader or higher inorder to invite players to the gang!")
return;
}
new xArray[GANGS_INFO], maxslots, currentslots;
ArrayGetArray(garray_gangs, user_gang_data[id][USER_GANG_ID], xArray);
TrieGetCell(gtrie_gang_maxslots, xArray[GANG_NAME], maxslots);
if((currentslots=ArraySize(xArray[GANG_ARRAY_MEMBERS])) >= maxslots)
{
cprint_chat(id, _, "Your gang have reached the !tmaximum members !gslots(%d/%d)! ", currentslots, maxslots)
return;
}
new menu = menu_create("Invite a player to the gang!", "invgang_menu")
new players[32], pnum, sInfo[32], sName[32], g_items;
get_players(players, pnum, "ch")
for(new i, uid; i < pnum; i++)
{
uid = players[i];
if(user_gang_data[uid][USER_GANG_STATUS] != NOT_INGANG || uid == id|| check_flag(g_user_rejected_inv[uid],id))
{
continue;
}
num_to_str(get_user_userid(uid), sInfo, charsmax(sInfo))
get_user_name(uid, sName, charsmax(sName))
menu_additem(menu, sName, sInfo)
g_items ++;
}
if(!g_items)
{
menu_destroy(menu)
return;
}
menu_display(id, menu)
}
public invgang_menu(id, menu, item)
{
if(item == MENU_EXIT || (user_gang_data[id][USER_GANG_STATUS] < GANG_LEADER))
{
menu_destroy(menu)
return PLUGIN_HANDLED;
}
new sData[32], icallback, paccess;
menu_item_getinfo(menu, item, paccess, sData, charsmax(sData), "", 0, icallback)
menu_destroy(menu)
new player = find_player("k", str_to_num(sData));
if(!player || user_gang_data[player][USER_GANG_STATUS] != NOT_INGANG)
{
invite_gang_menu(id)
return PLUGIN_HANDLED;
}
gang_invitation_menu(player, get_user_userid(id));
cprint_chat(id, _, "^4Gang Invitation ^1has been ^3sent!")
cprint_chat(player, _, "^3[^1WARNING^3] ^4: ^1You received a ^4gang ^3invitation!")
client_cmd(player, "spk warning")
return PLUGIN_HANDLED;
}
leader_menu(const id, const page)
{
if(user_gang_data[id][USER_GANG_STATUS] < GANG_LEADER)
{
gang_mainmenu(id);
return;
}
new menu = menu_create("\r~(\yLeader Menu\r)~", "leadermenu_handler")
new sText[64], status = user_gang_data[id][USER_GANG_STATUS], sPName[32], g_items;
formatex(sText, charsmax(sText), leadermenu_items[page][INFO_ACTION])
menu_additem(menu, sText, "#")
new xArray[GANGS_INFO], player;
ArrayGetArray(garray_gangs, user_gang_data[id][USER_GANG_ID], xArray);
for(new i, paccess, szString[32],
szPStatus[32], maxloop = ArraySize(xArray[GANG_ARRAY_MEMBERS]); i < maxloop; i++)
{
paccess = 0;
ArrayGetString(xArray[GANG_ARRAY_MEMBERS], i, szString, charsmax(szString));
TrieGetString(xArray[GANG_TRIE_MSTATUS], szString, szPStatus, charsmax(szPStatus));
TrieGetString(xArray[GANG_TRIE_NAMES], szString, sPName, charsmax(sPName))
if(!((1<<status) & leadermenu_items[page][INFO_ACCESS]) ||
!equal(szPStatus, USER_STATUS[leadermenu_items[page][INFO_POSITION]]))
{
paccess = NO_ACCESS;
}
if((player = find_player("c", szString)) > 0)
{
get_user_name(player, sPName, charsmax(sPName));
}
formatex(sText, charsmax(sText), "\r%s \w- \yPosition: \r%s", sPName, szPStatus)
if(paccess == NO_ACCESS)
{
formatex(sText, charsmax(sText), "%s - Position: %s", sPName, szPStatus)
}
menu_additem(menu, sText, szString, paccess)
g_items ++;
}
if(!g_items)
{
menu_destroy(menu)
return;
}
menu_display(id, menu)
}
public leadermenu_handler(id, menu, item)
{
if(item == MENU_EXIT || user_gang_data[id][USER_GANG_STATUS] < GANG_LEADER)
{
menu_destroy(menu)
return PLUGIN_HANDLED;
}
new sData[32], paccess, icallback;
menu_item_getinfo(menu, item, paccess, sData, charsmax(sData), "", 0, icallback)
menu_destroy(menu);
new xID = find_player("c", str_to_num(sData));
if(sData[0] == '#')
{
if(g_userpage[id] < sizeof leadermenu_items-1)
g_userpage[id] ++;
else
g_userpage[id] = 0;
leader_menu(id, g_userpage[id])
return PLUGIN_HANDLED;
}
new sName[32], sName2[32];
get_user_name(id, sName2, charsmax(sName2));
new xArray[GANGS_INFO];
ArrayGetArray(garray_gangs, user_gang_data[id][USER_GANG_ID], xArray);
TrieGetString(xArray[GANG_TRIE_NAMES], sData, sName, charsmax(sName))
if(xID > 0) get_user_name(xID, sName, charsmax(sName));
switch( g_userpage[id] )
{
case 0:
{
set_user_gang(sData, user_gang_data[id][USER_GANG_ID], GANG_LEADER);
if(xID > 0) cprint_chat(xID, _, "^4You have been promoted to a gang leader position by ^3%s^4!", sName2);
cprint_chat(id, _, "You have successfully promoted ^4%s^3!", sName);
}
case 1:
{
set_user_gang(sData, user_gang_data[id][USER_GANG_ID], GANG_MEMBER);
if(xID > 0) cprint_chat(xID, _, "^3You have been demoted to a gang member position by ^4%s^3!", sName2);
cprint_chat(id, _, "You have successfully demoted ^4%s^3!", sName);
}
case 2:
{
if(xID > 0) cprint_chat(xID, _, "^3You have been kicked out of the gang by ^4%s^3!", sName2);
cprint_chat(id, _, "You have successfully kicked ^4%s ^1out of the gang^3!", sName);
remove_user_fromgang(sData, user_gang_data[id][USER_GANG_ID]);
}
}
leader_menu(id, g_userpage[id]);
return PLUGIN_HANDLED;
}
gang_invitation_menu(const id, const iUID)
{
new sText[64], uid = find_player("k", iUID);
new name[32]; get_user_name(uid, name, charsmax(name));
formatex(sText, charsmax(sText), "\r[GANG Invitation] \wSent from \y%s^n\wto join \r%s \ygang!",
name, user_gang_data[uid][USER_GANG_NAME])
new menu = menu_create(sText, "ginvitation_menu_handler")
new szUID[32]; num_to_str(iUID, szUID, charsmax(szUID));
menu_additem(menu, "\yAccept!", szUID)
menu_additem(menu, "\rReject!", szUID)
menu_display(id, menu)
}
public ginvitation_menu_handler(id, menu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(menu)
return PLUGIN_HANDLED;
}
new sData[32], paccess, icallback;
menu_item_getinfo(menu, item, paccess, sData, charsmax(sData), "", 0, icallback)
menu_destroy(menu)
new uid = find_player("k", str_to_num(sData));
if(!uid || user_gang_data[uid][USER_GANG_STATUS] < GANG_LEADER || user_gang_data[id][USER_GANG_STATUS] != NOT_INGANG)
{
return PLUGIN_HANDLED;
}
get_user_authid(id, sData, charsmax(sData))
switch( item )
{
case 0: // Accept!
{
set_user_gang(sData, user_gang_data[uid][USER_GANG_ID], GANG_MEMBER);
get_user_name(id, sData, charsmax(sData))
cprint_chat(0, _, "!t%s !yhas joined the !g%s !tgang!g!", sData, user_gang_data[uid][USER_GANG_NAME])
}
case 1: // Reject!
{
set_flag(g_user_rejected_inv[id],uid)
get_user_name(id, sData, charsmax(sData))
cprint_chat(uid, _, "^4%s ^1has ^3Rejected ^1the gang ^4invitation!", sData)
}
}
return PLUGIN_HANDLED;
}