
Стаж: 11 лет
Сообщений: 457
Благодарностей: 115
Полезность: 456
|
Всем привет! Помогите пожалуйста добавить в этот плагин цифры (проценты или количество голосов) напротив каждого варианта для голосования. Код:
#include <amxmodx> #include <amxmisc> #include <colorchat>
#define PLUGIN "TimeLimit vote rus and colorchat" #define AUTHOR "modernized - wise" #define VERSION "0.7"
#define MAX_RESULTS 5
//thnx pr4er for help
new Float:g_timelimit new menu
new g_voteCount[MAX_RESULTS + 1] new g_tls[MAX_RESULTS] new tls[MAX_RESULTS]
public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) new name[12], string[12] new multiplic = 20 // +++++ for(new i=0;i<MAX_RESULTS;i++) { format(name, sizeof name -1, "amx_tl_%d", i+1) format(string, sizeof string -1, "%d", multiplic) tls[i] = register_cvar(name, string) multiplic += 10 } }
public plugin_cfg() { menu = menu_create("\rСколько минут хотите играть на этой карте?", "menu_handler") for(new i=0;i<MAX_RESULTS;i++) g_tls[i] = get_pcvar_num(tls[i]) set_task(180.0, "start_vote") build_menu() }
build_menu() { new option[64], temp[12] for(new i=0;i<MAX_RESULTS;i++) { format(option, sizeof option -1, "\y%d \dМинут", g_tls[i]) format(temp, sizeof temp -1, "%d", i+1) menu_additem(menu, option, temp, 0) } menu_setprop( menu, MPROP_EXIT, MEXIT_NEVER ) }
public start_vote(id) { new players[32], inum, i get_players(players, inum, "ch") for(i=0;i<inum;i++) menu_display(players[i], menu, 0) set_task(15.0, "finish_vote") for(i=1;i<(MAX_RESULTS+1);i++) g_voteCount[i] = 0 return PLUGIN_CONTINUE }
public menu_handler(id, menu, item) { if( !is_user_connected( id ) ) return PLUGIN_HANDLED
if(item == MENU_EXIT) { menu_cancel(id) return PLUGIN_HANDLED } new data[6], name[32] new access, callback menu_item_getinfo(menu, item, access, data, 5, "", 0, callback) new key = str_to_num(data) get_user_name(id, name, 31) ColorChat(0,GREEN,"^1Игрок ^4%s ^1проголосовал за ^4%d ^1минут.", name, g_tls[key -1]) g_voteCount[key]++ menu_cancel(id) return PLUGIN_HANDLED }
public finish_vote() { g_timelimit = get_cvar_float("mp_timelimit") new best = 0, i for(i=0;i<(MAX_RESULTS+1);i++) { if(g_voteCount[i] > g_voteCount[best]) best = i } new votesNum = 0 for(i=0;i<(MAX_RESULTS+1);i++) votesNum += g_voteCount[i] new iRatio = votesNum ? floatround(get_cvar_float("amx_vote_ratio") * float(votesNum), floatround_ceil) : 1 new iResult = g_voteCount[best] if(iResult >= iRatio) { new new_time = g_tls[best -1] ColorChat(0,GREEN,"^3Голосование прошло успешно. ^1Будем играть ^4%d ^1минут.", new_time) set_cvar_num("mp_timelimit", new_time) } else { ColorChat(0,GREEN,"^4Голосование неудачно.") } new players[32], inum get_players(players, inum, "ch") for(i=0;i<inum;i++) client_cmd(players[i], "slot10") }
public plugin_end() { set_cvar_float("mp_timelimit", g_timelimit) }
Как пример: Код:
/**============================================================================== ============= * * /) -=-=- Версии -=-=- (\ * * 0.1 - Релиз. * 0.2 - Добавлены проценты в меню. * 0.3 - Фиксы. * 0.4 - Добавлены звуки. * 0.5 - Добавлены дхуды. * 0.6 - Добавлено *RTV* * 0.7 - Убраны баги с отсутствующими картами. * 0.8 - Оптимизирован код. * 0.9 - Фиксы. * 1.0 - Добавлен отсчёт в меню голосования. * ================================================================================ =============*/ #include <amxmodx> #include <dhudmessage> #include <fakemeta>
/**============================================================================== ============= Константы ================================================================================ =============*/ new g_szMaps[5][64]; new g_Votes[5]; new g_iTimerVote[33]; new g_szWinMap[64]; new g_iNumRTV; new g_iPlayerProcc; new bool:g_LastRound; new b_HasRTV[33]; new Float:g_iLastSec[33]; new bool:g_Vote; new bool:b_HasAlreadyVoted[33]; new iAllVoted;
new const szSoundTimer[6][] = {"","fvox/one","fvox/two","fvox/three","fvox/four","fvox/five"} new const szSoundVote[3][] = {"sound/MapManager_by_BlackSmoke/g_start.mp3", "sound/MapManager_by_BlackSmoke/g_end.mp3", "sound/MapManager_by_BlackSmoke/g_sps.wav"}
/**============================================================================== ============= Макросы ================================================================================ =============*/ #define TimeVote 30 // Сколько будет длится голосование
/**============================================================================== ============= Инициализация ================================================================================ =============*/ public plugin_init() { register_plugin("MapManager", "1.0", "BlackSmoke"); register_clcmd("say /rtv", "RockTheVote") register_clcmd("say /rockthevote", "RockTheVote") register_clcmd("say rtv", "RockTheVote") register_clcmd("say rockthevote", "RockTheVote") register_clcmd("say nextmap", "Show_Nextmap") register_clcmd("say /nextmap", "Show_Nextmap") register_menucmd(register_menuid("VoteMenu"), 1023, "ActionVoteMenu"); register_logevent("RoundEnd", 2, "1=Round_End") set_task(121.0, "ClCmdVote", _, _, _, "d") register_cvar("amx_nextmap", "[Не определена]"); set_cvar_string("amx_nextmap", "[Не определена]"); LoadMapsInVote(); }
/**============================================================================== ============= Показываем следующую карту. ================================================================================ =============*/ public Show_Nextmap(id) { new cmd[127]; get_cvar_string("amx_nextmap", cmd, 126) ChatColor(0, "!teamСледующая карта: !g%s", cmd) }
/**============================================================================== ============= Конец раунда ================================================================================ =============*/ public RoundEnd() if(g_LastRound) set_task(1.0, "changelevel");
/**============================================================================== ============= Досрочная смена карты ================================================================================ =============*/ public RockTheVote(id) { if(g_Vote) { ChatColor(id, "!teamГолосование уже начато. !g*RTV*") return PLUGIN_CONTINUE; } if(b_HasRTV[id]) { ChatColor(id, "!teamВы уже голосовали. !g*RTV*") return PLUGIN_CONTINUE; } new iNum, szPlayers[32]; get_players(szPlayers, iNum, "hc") g_iNumRTV++; b_HasRTV[id] = true; if(g_iNumRTV == iNum) { ChatColor(0, "!teamВсе игроки !g(%d) !teamзахотели досрочную смену карты. !g*RTV*", g_iNumRTV) set_task(5.0, "ClCmdVote"); } else ChatColor(0, "!teamЧтобы начать досрочное голосование нужно !g%d !teamголосов. !g*RTV*", iNum-g_iNumRTV) return PLUGIN_HANDLED; }
/**============================================================================== ============= Загрузки плагина ================================================================================ =============*/ public plugin_precache() { for(new i; i < sizeof(szSoundVote); i++) precache_generic(szSoundVote[i]) }
/**============================================================================== ============= Ставим карты для голосования ================================================================================ =============*/ public LoadMapsInVote() { new szFileName[64], Len, iNumRandomMap, q, iRepeat, szMapName[32], szDirMaps[127]; get_mapname(szMapName, 31); format(szFileName, 63, "addons/amxmodx/configs/maps.ini") q = random_num(0, file_size(szFileName, 1)-1) while(read_file(szFileName, q ,g_szMaps[iNumRandomMap], 63, Len)) { q = random_num(0, file_size(szFileName, 1)-1) if(iRepeat == q) continue; iRepeat = q; if(g_szMaps[iNumRandomMap][0] == ';' || Len == 0) continue format(szDirMaps, 126, "maps/%s.bsp", g_szMaps[iNumRandomMap]); if(!equali(szMapName, g_szMaps[iNumRandomMap]) && file_exists(szDirMaps)) iNumRandomMap++ if(iNumRandomMap > 4) break; } }
/**============================================================================== ============= Включаем отсчёт до голосования ================================================================================ =============*/ public ClCmdVote() set_task(1.0, "ValueVote", _, _, _, "a", 6);
/**============================================================================== ============= Отсчёт до голосования ================================================================================ =============*/ public ValueVote() { new szSec[32]; set_dhudmessage( 255,255,0, -1.0, -0.80, 0, 6.0, 0.001, 0.1, 1.5 ) static timer = 6 timer-- switch(timer) { case 0: { g_Vote = true; startvote() arrayset(g_Votes, 0, sizeof(g_Votes)); arrayset(g_iTimerVote, TimeVote-10, 33); arrayset(b_HasAlreadyVoted, false, 33); set_task(float(TimeVote), "endvote"); timer = 6; client_cmd(0, "mp3 play %s", szSoundVote[0]) set_cvar_string("amx_nextmap", "[Идёт голосование]"); } default: { get_ending(timer, szSec, "у") show_dhudmessage(0, "Голосование пройдёт через %d %s", timer, szSec) client_cmd(0, "spk %s", szSoundTimer[timer]) } } }
/**============================================================================== ============= Голосование ================================================================================ =============*/ public startvote() { if(!g_Vote) return PLUGIN_CONTINUE; new szPlayers[32], iNum; get_players(szPlayers, iNum); iAllVoted = 0; for(new i; i < iNum; i++) ChooseMap(szPlayers[i]) return PLUGIN_HANDLED; }
/**============================================================================== ============= Меню выбора карт. ================================================================================ =============*/ public ChooseMap(id) { if(!g_Vote) return PLUGIN_CONTINUE; new szMenu[512], iLen, iKey, szSec[32] get_ending(g_iTimerVote[id], szSec, "а"); iLen = format(szMenu[iLen], charsmax(szMenu)-iLen, "\yПора выбирать следующую карту.^n\dУ вас \r%d \dсек, чтобы подумать^n", g_iTimerVote[id], szSec) for(new q; q < 5; q++) { if(!b_HasAlreadyVoted[id]) iLen += format(szMenu[iLen], charsmax(szMenu)-iLen, "^n\r%d. \w%s \d[\y%d%%\d]",q+1, g_szMaps[q], g_Votes[q] * g_iPlayerProcc) else iLen += format(szMenu[iLen], charsmax(szMenu)-iLen, "^n\d%s [\y%d%%\d]", g_szMaps[q], g_Votes[q] * g_iPlayerProcc) } if(!b_HasAlreadyVoted[id]) { iKey |= MENU_KEY_0; iLen += format(szMenu[iLen], charsmax(szMenu)-iLen, "^n^n\r0. \wНичего") } iLen += format(szMenu[iLen], charsmax(szMenu)-iLen, "^n^n\yПроголосовало: \r%d \dчеловек", iAllVoted) iKey |= MENU_KEY_0|MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5 if(b_HasAlreadyVoted[id]) iKey &= ~(MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5); show_menu(id, iKey, szMenu, -1, "VoteMenu"); return PLUGIN_HANDLED; }
/**============================================================================== ============= Игрок голосует ================================================================================ =============*/ public ActionVoteMenu(id, iKey) { if(!g_Vote) return PLUGIN_CONTINUE; new szName[32] get_user_name(id, szName, 31) if(iKey == 9) { if(!b_HasAlreadyVoted[id]) ChatColor(0, "!g%s !teamне принял участие в голосовании.", szName); b_HasAlreadyVoted[id] = true return PLUGIN_CONTINUE; } iAllVoted++; g_Votes[iKey]++, b_HasAlreadyVoted[id] = true; ChatColor(0, "!g%s !teamвыбрал !g%s", szName, g_szMaps[iKey]); return PLUGIN_HANDLED; }
/**============================================================================== ============= Конец голосования ================================================================================ =============*/ public endvote() { g_Vote = false; new win = 0, szDirFile[127]; for(new i; i < sizeof(g_Votes); i++) { if(win < g_Votes[i]) { win = i format(g_szWinMap, 63, g_szMaps[win]) } }
if(win < g_Votes[0]) { win = 0; format(g_szWinMap, 63, g_szMaps[win]); } if(!g_szWinMap[0]) { LoadMapsInVote(); set_task(5.0, "ClCmdVote"); ChatColor(0, "!teamГолосование отложено.") return PLUGIN_CONTINUE; } format(szDirFile, 126, "maps/%s.bsp", g_szWinMap); if(!file_exists(szDirFile)) { LoadMapsInVote(); set_task(5.0, "ClCmdVote"); ChatColor(0, "!teamГолосование отложено из за отсутствующей карты.") return PLUGIN_CONTINUE; } set_dhudmessage( 149,68,0, -1.0, -0.70, 2, 4.0, 11.0, 0.01, 1.5 ) show_dhudmessage(0, "Следующая карта: %s^nКарта сменится по окончанию раунда",g_szWinMap, win) ChatColor(0, "!teamСледующая карта: !g%s", g_szWinMap) set_cvar_string("amx_nextmap", g_szWinMap); set_cvar_float("mp_timelimit", 0.0) g_LastRound = true; client_cmd(0, "mp3 play %s", szSoundVote[1]) return PLUGIN_HANDLED; }
/**============================================================================== ============= Меняем карту. ================================================================================ =============*/ public changelevel() { set_cvar_float("mp_timelimit", 0.0); set_dhudmessage( 0,255,0, -1.0, -0.40, 0, 11.0, 6.0, 0.1, 1.5 ) show_dhudmessage(0, "Всем спасибо^nКарта меняется на %s", g_szWinMap) client_cmd(0, "+showscores;wait;wait;wait;mp3 stop;stopsound;spk %s", szSoundVote[2]) new iNum, szPlayers[32]; get_players(szPlayers, iNum) for(new i; i < iNum; i++) { client_cmd(szPlayers[i], "drop;wait;wait;wait;wait;wait;drop;wait;wait;wait;wait;wait;drop"); set_pev(szPlayers[i], pev_flags, pev(szPlayers[i], pev_flags) | FL_FROZEN) } set_task(4.0, "changelevel1") }
/**============================================================================== ============= Меняем карту ================================================================================ =============*/ public changelevel1() { server_cmd("changelevel %s", g_szWinMap); }
/**============================================================================== ============= Синк ================================================================================ =============*/ public client_PreThink(id) { if(!g_Vote) return; if(g_iTimerVote[id] <= -1) return; if(iAllVoted) g_iPlayerProcc = 100 / iAllVoted; else g_iPlayerProcc = 0; if((get_gametime() - g_iLastSec[id]) >= 1.0) if(g_iTimerVote[id] != 0) g_iTimerVote[id]--, ChooseMap(id), g_iLastSec[id] = get_gametime(); else show_menu(id, 0, "^n"), g_iTimerVote[id] = -1; }
/**============================================================================== == Получение Окончания Секунд ================================================================================ =*/ stock get_ending(num, output[32], const l[]) { new num100=num%100, num10=num%10; if(num100>=5&&num100<=20||num10==0||num10>=5&&num10<=9) format(output, 31, "секунд"); else if(num10==1) format(output, 31, "секунд%s", l); else if(num10>=2&&num10<=4) format(output, 31, "секунды"); }
/**============================================================================== == Цветной чат ================================================================================ ===*/ stock ChatColor(const id, const input[], any:...) { new count = 1, players[32] static msg[191] vformat(msg, 190, input, 3) format(msg, sizeof(msg), "^1[^4Голосование^1] %s", msg) replace_all(msg, 190, "!g", "^4") // Green Color replace_all(msg, 190, "!y", "^1") // Default Color replace_all(msg, 190, "!team", "^3") // Team Color if (id) players[0] = id; else get_players(players, count, "ch") { for (new i = 0; i < count; i++) { if (is_user_connected(players[i])) { message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i]) write_byte(players[i]); write_string(msg); message_end(); } } } }
Спасибо заранее за помощь.

|