Witajcie. Mam plugin na mapchooser, i na początku rundy podczas votowania map włącza się również plugin na vipa, przez co mapchooser się buguje i nie mogę wybrać mapy.
Potrzebuję wyłączyć vip.amxx na czas votowania, a po vote go wznowić. Niżej .sma pluginu:
Spoiler
#include <amxmodx> #include <colorchat> new const PLUGIN[] = "Mapchooser" new const VERSION[] = "1.0" new const AUTHOR[] = "WINDOWS" new g_teamScore[2] new nextmap, vote_answers, maxspeed new mp_timelimit, mp_winlimit, mp_maxrounds, mp_roundtime new extendmapmax_pcvar, extendmapstep_pcvar, votetime_pcvar, votemaps_pcvar new result_red_pcvar, result_green_pcvar, result_blue_pcvar #define TASK_PLUGIN_ID 44747477 #define TASK_SCREEN_ID 979699 #define TASK_RESULT_ID 12111 const HudLen = 512 new msg[128] new Array:g_mapName new g_mapNums new g_saveids[10] new g_voteCount[10] new g_nextName[10] new g_lastMap[32] new g_currentMap[32] new g_mapVoteNum new g_votemaps new g_maxspeed = 320 new Float:f_timelimit = 0.0 new bool:willbevote = false new bool:voteStarted = false new bool:forceBlock = true new bool:hasExtend = false new bool:lastRound = false new bool:forceChange = true new bool:hasBlind[33] = { false, ... } new g_msgScreenFade new g_PlayersVoted = 0 new g_PlayersNum = 0 new g_result_red, g_result_green, g_result_blue public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_cvar("super_mapchooser",VERSION,FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED) register_dictionary_colored("super_mapchooser.txt") extendmapmax_pcvar = register_cvar("amx_extendmap_max", "90") extendmapstep_pcvar = register_cvar("amx_extendmap_step", "15") register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0") register_event("TextMsg", "Event_RestartRound", "a", "2&#Game_C", "2&#Game_w") register_event("ScreenFade", "Event_ScreenFade", "be") register_event("TeamScore", "team_score", "a") register_logevent("Event_RoundEnd", 2, "0=World triggered","1=Round_End") votetime_pcvar = register_cvar("mapchooser_votetime", "15") votemaps_pcvar = register_cvar("mapchooser_votemaps", "5") result_red_pcvar = register_cvar("mapchooser_result_red", "0") result_green_pcvar = register_cvar("mapchooser_result_green", "255") result_blue_pcvar = register_cvar("mapchooser_result_blue", "100") g_msgScreenFade = get_user_msgid("ScreenFade") set_task(8.0, "taskListening", TASK_PLUGIN_ID, "", 0, "b") } public plugin_cfg() { nextmap = get_cvar_pointer("amx_nextmap") vote_answers = get_cvar_pointer("amx_vote_answers") maxspeed = get_cvar_pointer("sv_maxspeed") mp_timelimit = get_cvar_pointer("mp_timelimit") mp_winlimit = get_cvar_pointer("mp_winlimit") mp_maxrounds = get_cvar_pointer("mp_maxrounds") mp_roundtime = get_cvar_pointer("mp_roundtime") g_votemaps = get_pcvar_num(votemaps_pcvar) if(g_votemaps > 8) g_votemaps = 8 else if(g_votemaps < 1) g_votemaps = 1 register_menucmd(register_menuid("MapChooserMenu"), (-1^(-1<<(g_votemaps + 1))), "countVote") g_mapName = ArrayCreate(32) get_localinfo("lastMap", g_lastMap, sizeof g_lastMap -1) set_localinfo("lastMap", "") new maps_ini_file[64] get_localinfo("amxx_configsdir", maps_ini_file, sizeof maps_ini_file -1) format(maps_ini_file, sizeof maps_ini_file -1, "%s/maps.ini", maps_ini_file) if(!file_exists(maps_ini_file)) get_cvar_string("mapcyclefile", maps_ini_file, sizeof maps_ini_file -1) if(loadSettings(maps_ini_file)) Reset() g_maxspeed = get_pcvar_num(maxspeed) get_mapname(g_currentMap, sizeof g_currentMap -1) } public client_disconnect(id) { remove_task(id+TASK_SCREEN_ID) remove_task(id+TASK_RESULT_ID) hasBlind[id] = false } public Event_RestartRound() Reset() public Event_RoundEnd() { if(lastRound && forceChange) set_task(4.5,"ForceChangeMap") } public ForceChangeMap() { set_pcvar_float(mp_timelimit, get_gametime() / 60.0 - 0.3) } public Reset() { g_PlayersVoted = 0 g_PlayersNum = 0 if(voteStarted) { voteStarted = false forceBlock = true remove_task(TASK_PLUGIN_ID) if(!hasExtend) { formatex(msg, 127, "%L", LANG_PLAYER, "INTERRUPTED") ColorChat(0, GREEN, msg) } else hasExtend = false } if(willbevote) { set_task(8.0, "taskListening", TASK_PLUGIN_ID, "", 0, "b") if(f_timelimit > 0.0) set_pcvar_float(mp_timelimit, f_timelimit) } willbevote = false lastRound = false forceChange = true } public PauseGame() { new players[32], pid get_players(players, g_PlayersNum) for(new i=0;i<g_PlayersNum;i++) { pid = players[i] hasBlind[pid] = true message_begin(MSG_ONE, g_msgScreenFade, _, pid) write_short(1<<12) // Duration write_short(1<<9) // Hold time write_short(1<<0) // Fade type write_byte(0) // Red write_byte(0) // Green write_byte(0) // Blue write_byte(255) // Alpha message_end() set_task(1.0, "cmdFadeScreen", pid+TASK_SCREEN_ID, "", 0, "b") } set_pcvar_num(maxspeed, 0) } public ContinueGame() { new players[32], num, pid get_players(players, num) for(new i=0;i<num;i++) { pid = players[i] hasBlind[pid] = false remove_task(pid+TASK_SCREEN_ID) remove_task(pid+TASK_RESULT_ID) message_begin(MSG_ONE, g_msgScreenFade, _, pid) write_short(1<<0) write_short(1<<0) write_short(1<<0) write_byte(0) write_byte(0) write_byte(0) write_byte(0) message_end() } set_pcvar_num(maxspeed, g_maxspeed) } public taskListening() { new winlimit = get_pcvar_num(mp_winlimit) if(winlimit) { new c = winlimit - 2 if(!((c > g_teamScore[0]) && (c > g_teamScore[1]))) { forceChange = false willbevote = true } } new maxrounds = get_pcvar_num(mp_maxrounds) if(maxrounds) { if(!((maxrounds - 2) > (g_teamScore[0] + g_teamScore[1]))) { forceChange = false willbevote = true } } new Float:f_timeleft new Float:f_diff new Float:f_roundtime f_timeleft = float(get_timeleft()) if (f_timeleft) { f_roundtime = get_pcvar_float(mp_roundtime) * 60.0 f_diff = f_roundtime - f_timeleft + get_pcvar_float(votetime_pcvar) + 15.0 if(!(f_timeleft < 1.0 || f_timeleft > f_diff)) willbevote = true } if(!willbevote) return remove_task(TASK_PLUGIN_ID) // remove 'taskListening' task formatex(msg, 127, "%L", LANG_PLAYER, "VOTE_NEXT_ROUND") ColorChat(0, GREEN, msg) if (f_timeleft) { f_timelimit = get_pcvar_float(mp_timelimit) // save current timelimit set_pcvar_float(mp_timelimit, f_timelimit + f_diff / 60.0) } } public Event_NewRound() { if(willbevote && !lastRound) { forceBlock = false hasExtend = false g_result_red = get_pcvar_num(result_red_pcvar) g_result_green = get_pcvar_num(result_green_pcvar) g_result_blue = get_pcvar_num(result_blue_pcvar) cmdVoteNextmap() } } public cmdVoteNextmap() { new mkeys = ((1<<g_votemaps) + 1), menu[HudLen], a new pos = format(menu, HudLen -1, " \r%L:^n^n", LANG_PLAYER, "VOTE_TITLE") new dmax = (g_mapNums > g_votemaps) ? g_votemaps : g_mapNums new unki = 0 for(g_mapVoteNum = 0; g_mapVoteNum < dmax; g_mapVoteNum++) { a = random_num(0, g_mapNums -1) while(isInMenu(a)) { if(++a >= g_mapNums) { a = 0 } } g_nextName[g_mapVoteNum] = a new map[32] ArrayGetString(g_mapName, a, map, sizeof map -1) pos += format(menu[pos], HudLen -1, " \y%d.\w %s^n", g_mapVoteNum + 1, map) g_saveids[unki] = a unki++ mkeys |= (1<<g_mapVoteNum) g_voteCount[g_mapVoteNum] = 0 } g_voteCount[g_votemaps] = 0 g_voteCount[g_votemaps + 1] = 0 new winlimit = get_pcvar_num(mp_winlimit) new maxrounds = get_pcvar_num(mp_maxrounds) if((winlimit + maxrounds) == 0 && f_timelimit < get_pcvar_float(extendmapmax_pcvar)) { pos += format(menu[pos], HudLen -1, " \y%d.\w %s \y[%L]", g_votemaps + 1, g_currentMap, LANG_PLAYER, "PROLONG") mkeys |= (1<<g_votemaps) } show_menu(0, mkeys, menu, get_pcvar_num(votetime_pcvar), "superMapChooserMenu") formatex(msg, 127, "%L", LANG_PLAYER, "VOTE_STARTED") ColorChat(0, GREEN, msg) client_cmd(0, "spk gman/gman_choose2") set_task(get_pcvar_float(votetime_pcvar), "checkVotes", TASK_PLUGIN_ID) PauseGame() voteStarted = true log_amx("Mapchooser: Glosowanie na nastepna mape rozpoczete") } public checkVotes() { voteStarted = false new bolt = 0 for(new a = 0; a < g_mapVoteNum; a++) { if(g_voteCount[bolt] < g_voteCount[a]) bolt = a } set_hudmessage(.channel=2) show_hudmessage(0, "") set_hudmessage(255, 127, 0, -1.0, 0.42, 2, 0.1, 10.0, 0.05, 1.0, 2) if((g_voteCount[g_votemaps] > g_voteCount[bolt]) && (g_voteCount[g_votemaps] > g_voteCount[g_votemaps + 1])) { new Float:steptime = get_pcvar_float(extendmapstep_pcvar) f_timelimit = f_timelimit + steptime formatex(msg, 127, "%L", LANG_PLAYER, "MAP_EXTENDING", steptime) ColorChat(0, TEAM_COLOR, msg) show_hudmessage(0, "%L", LANG_PLAYER, "MAP_EXTENDING_HUD", steptime) log_amx("Mapchooser: Glosowanie na nastepna mape zakonczone. Mapa %s za %.0f minutes", g_currentMap, steptime) hasExtend = true Reset() ContinueGame() return } new smap[32] if(g_voteCount[bolt] && (g_voteCount[g_votemaps + 1] <= g_voteCount[bolt])) { ArrayGetString(g_mapName, g_nextName[bolt], smap, sizeof smap -1) set_pcvar_string(nextmap, smap) } else get_pcvar_string(nextmap, smap, sizeof smap -1) formatex(msg, 127, "%L", LANG_PLAYER, "NEXT_MAP_CHOSEN", smap) ColorChat(0, TEAM_COLOR, msg) show_hudmessage(0, "%L", LANG_PLAYER, "NEXT_MAP_CHOSEN_HUD", smap) if(forceChange) { formatex(msg, 127, "%L", LANG_PLAYER, "LAST_ROUND") ColorChat(0, TEAM_COLOR, msg) set_hudmessage(255, 0, 0, -1.0, 0.58, 2, 0.1, 10.0, 0.05, 1.0, 1) show_hudmessage(0, "%L", LANG_PLAYER, "LAST_ROUND_HUD") } new players[32], num, pid get_players(players, num) for(new i=0;i<num;i++) { pid = players[i] remove_task(pid+TASK_RESULT_ID) } log_amx("Mapchooser, glosowanie zakonczone. Nastepna mapa %s", smap) lastRound = true new Float:f_timeleft = float(get_timeleft()) if(f_timeleft) set_pcvar_float(mp_timelimit, get_gametime() / 60.0 + get_pcvar_float(mp_roundtime)) ContinueGame() } public countVote(id, key) { if(!voteStarted && forceBlock) return PLUGIN_HANDLED if(get_pcvar_float(vote_answers)) { new name[32] get_user_name(id, name, sizeof name -1) if(key == g_votemaps) { formatex(msg, 127, "%L", LANG_PLAYER, "VOTED_EXTEND", name) ColorChat(0, DontChange, msg) } else if(key < g_votemaps) { new map[32] ArrayGetString(g_mapName, g_nextName[key], map, sizeof map -1) formatex(msg, 127, "%L", LANG_PLAYER, "VOTED", name, map) ColorChat(0, DontChange, msg) } cmdShowResults(id+TASK_RESULT_ID) set_task(0.8, "cmdShowResults", id+TASK_RESULT_ID, "", 0, "b") } client_cmd(id, "spk UI/buttonclickrelease") g_voteCount[key]++ g_PlayersVoted++ return PLUGIN_HANDLED } public cmdShowResults(pid) { static id id = pid-TASK_RESULT_ID if(is_user_connected(id)) { static i, len, message[HudLen] len = format(message, sizeof message -1, "%L^n^n", LANG_PLAYER, "VOTE_RESULTS") for(i=0;i<g_votemaps;i++) { new map[32] ArrayGetString(g_mapName, g_saveids[i], map, sizeof map -1) len += format(message[len], HudLen -1, "[%d] | %s^n", g_voteCount[i], map) } len += format(message[len], HudLen -1, "[%d] | %s [%L]^n^n", g_voteCount[i], g_currentMap, LANG_PLAYER, "PROLONGED") len += format(message[len], HudLen -1, "%L", LANG_PLAYER, "VOTE_TOTAL", g_PlayersVoted, g_PlayersNum) set_hudmessage(g_result_red, g_result_green, g_result_blue, 0.36, 0.3, 0, 1.0, 4.0, 0.1, 0.2, 2) show_hudmessage(id, message) } } public Event_ScreenFade(id) { if(hasBlind[id]) { set_task(0.6, "cmdFadeScreen", id+TASK_SCREEN_ID) } } public cmdFadeScreen(pid) { new id = pid-TASK_SCREEN_ID if(is_user_connected(id)) { message_begin(MSG_ONE, g_msgScreenFade, _, id) write_short(1<<0) // Duration write_short(1<<0) // Hold time write_short(1<<2) // Fade type write_byte(0) // Red write_byte(0) // Green write_byte(0) // Blue write_byte(255) // Alpha message_end() } } public plugin_end() { new current_map[32] set_pcvar_num(maxspeed, g_maxspeed) get_mapname(current_map, sizeof current_map -1) set_localinfo("lastMap", current_map) } stock bool:ValidMap(mapname[]) { if(is_map_valid(mapname)) { return true } new len = strlen(mapname) -4 if(len < 0) { return false } if(equali(mapname[len], ".bsp")) { mapname[len] = '^0' if(is_map_valid(mapname)) { return true } } return false } loadSettings(filename[]) { if(!file_exists(filename)) return 0 new currentMap[32], szText[32], buff[256] get_mapname(currentMap, sizeof currentMap -1) new fp = fopen(filename, "r") while(!feof(fp)) { buff[0] = '^0' fgets(fp, buff, sizeof buff -1) parse(buff, szText, sizeof szText -1) if((szText[0] != ';') && ValidMap(szText) && !equali(szText, g_lastMap) && !equali(szText, currentMap)) { ArrayPushString(g_mapName, szText) g_mapNums++ } } fclose(fp) return g_mapNums } bool:isInMenu(id) { for(new a = 0; a < g_mapVoteNum; a++) { if(id == g_nextName[a]) { return true } } return false } public team_score() { new team[2] read_data(1,team,1) g_teamScore[(team[0]=='C') ? 0 : 1] = read_data(2) }
Użytkownik Jaszczurek edytował ten post 18.07.2016 14:01