RSSy MYGO.pl Opublikowano Maj 21, 2020 o 05:02 RSSy Udostępnij Opublikowano Maj 21, 2020 o 05:02 Can anyone add Chat prefix to this plugin? (Colored) say: Code: (Owner\Leader\Member) (Gang Name) PlayerName : Message say_team: Code: [TeamName] (Owner\Leader\Member) (Gang Name) PlayerName : Message PHP Code: /* Plugin generated by AMXX-Studio */ #include <amxmodx> #include <amxmisc> #include <nvault> #include <hamsandwich> #include <jailbreak_core> #include <cs_player_models_api> #include <fakemeta> #define PLUGIN "[JB] Gang System" #define VERSION "1.0" #define AUTHOR "Natsheh" #define set_flag(%1,%2) (%1 |= (1<<(31&%2))) #define remove_flag(%1,%2) (%1 &= ~(1<<(31&%2))) #define check_flag(%1,%2) (%1 & (1<<(31&%2))) #define MENU_KEYS (MENU_KEY_0|MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_5|MENU_KEY_7|MENU_KEY_8) #define SHOW_TOP_GANGS 10 #define NO_ACCESS (1<<26) #if !defined EOS #define EOS 0 #endif new const gang_file[] = "jailbreak_gangs.ini"; new const gang_skins_file[] = "jailbreak_gang_skins.ini"; enum (+=1) { NOT_INGANG = 0, GANG_MEMBER, GANG_LEADER, GANG_OWNER } new const USER_STATUS[][] = { "", "Member", "Leader", "Owner" } enum GANG_ACCESS(+=1) { INFO_ACTION[24] = 0, INFO_ACCESS, INFO_POSITION } new const leadermenu_items[][GANG_ACCESS] = { { "Add a leader!", (1<<GANG_OWNER), GANG_MEMBER }, { "Remove a leader!", (1<<GANG_OWNER), GANG_LEADER }, { "Kick a member!", (1<<GANG_OWNER)|(1<<GANG_LEADER), GANG_MEMBER } } enum (+=1) { KEY_SKIN_MDL = 0, KEY_SKIN_ACCESS } new const szKEYS[][] = { "SKIN", "ACCESS" } enum USER_GANG_INFO(+=1) { USER_GANG_NAME[32] = 0, USER_GANG_SKIN[32], USER_GANG_STATUS, USER_GANG_ID } enum _:GANGS_INFO(+=1) { GANG_NAME[32] = 0, GANG_SKIN[32], GANG_KILLS, Array:GANG_ARRAY_MEMBERS, Trie:GANG_TRIE_MSTATUS, Trie:GANG_TRIE_NAMES } enum _:GANG_SKINS_INFO(+=1) { GANG_SKIN_NAME[32] = 0, GANG_SKIN_MDL[32], GANG_SKIN_ACCESS } new mm_itemid_gang; new user_find_members[33][32], g_user_rejected_req[33], g_user_rejected_inv[33], g_userpage[33]; new g_user_ingang_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]; 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") RegisterHam(Ham_Spawn, "player", "fw_player_respawn_post", 1) RegisterHam(Ham_Killed, "player", "fw_player_killed_post", 1) register_clcmd("amx_gangsmenu", "clcmd_gangsmenu", ADMIN_ALL|ADMIN_IMMUNITY, "show all gangs") cvar_maxmembers_slots = register_cvar("jb_gang_max_memberslots", "5"); g_msgStatusText = get_user_msgid("StatusText"); } public plugin_cfg() { new maxslots = get_pcvar_num(cvar_maxmembers_slots); for(new 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 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; } Przeczytaj cały wpis Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi