Всем привет. Помогите исправить(пофиксить) недочёты в плагине. когда игрока из противоположный команды, убивает пушка голиафа, то отображает(проскакивает) показ урона владельцу пушки, вот:
одну вещь которую нужно добился, но не до конца, хотелось чтобы было вот:
но появилось и другая проблема, ставлю данный исходный код плагина, что выше, а на сервере ещё установлен плагин пушка-голиафа от SMaster'a, данный плагин предоставляется автором без исходного кода, только скомпилированный файл плагина: .amxx (с конфигом), в ЛС могу скинуть)), мод сервера csdm с элементами пушек, лазеров и т.д, то местами проскакивает показ урона (показывает), когда
и ещё в видео показывается момент, как будто дропаются (выкидываются) оружие(летают, падают), до этого на сервере был установлен этот
с ним работало всё как надо и проскакивание(показ) урона, когда игрока убивала пушка-голиафа никакого не было, но он переставал работать, если установить на сервер другой мапменеджар карт (на сервере был установлен:
то дамагер снова работал. Заранее спасибо!)
C-like:
#include <amxmodx>
#include <reapi>
new g_HudSyncMessage;
new g_HudSyncMessage2;
public plugin_init(){
RegisterHookChain(RG_CBasePlayer_TakeDamage, "CPlayer_TakeDamage_Post", .post = true);
g_HudSyncMessage = CreateHudSyncObj();
g_HudSyncMessage2 = CreateHudSyncObj();
}
public CPlayer_TakeDamage_Post(iVictim, iInflictor, iAttacker, Float:flDamage, iBitsDamageType){
if(!is_user_connected(iAttacker))return;
//if(iBitsDamageType & DMG_BLAST)return;
static team;team = get_member(iVictim,m_iTeam);
if(team == get_member(iAttacker, m_iTeam)) return;
static rgb[3];
if(team==1){
rgb[0]=255;rgb[1]=0;rgb[2]=0;
}
else{
rgb[0]=0;rgb[1]=0;rgb[2]=255;
}
set_hudmessage(rgb[0], rgb[1], rgb[2], 0.45, 0.50, 2, 0.1, 4.0, 0.1, 0.1, -1);
ShowSyncHudMsg(iVictim, g_HudSyncMessage2, "%.0f", flDamage);
team = get_member(iAttacker,m_iTeam);
if(team==2){
rgb[0]=255;rgb[1]=0;rgb[2]=0;
}
else{
rgb[0]=0;rgb[1]=0;rgb[2]=255;
}
set_hudmessage(rgb[0], rgb[1], rgb[2], -1.0, 0.55, 2, 0.1, 4.0, 0.02, 0.02, -1);
ShowSyncHudMsg(iAttacker, g_HudSyncMessage, "%.0f", flDamage);
}
но появилось и другая проблема, ставлю данный исходный код плагина, что выше, а на сервере ещё установлен плагин пушка-голиафа от SMaster'a, данный плагин предоставляется автором без исходного кода, только скомпилированный файл плагина: .amxx (с конфигом), в ЛС могу скинуть)), мод сервера csdm с элементами пушек, лазеров и т.д, то местами проскакивает показ урона (показывает), когда
C-like:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta_util>
#define PLUGIN "Advanced Bullet Damage"
#define VERSION "1.0"
#define AUTHOR "Sn!ff3r"
new g_type, g_enabled, g_recieved, bool:g_showrecieved, g_hudmsg1, g_hudmsg2
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_event("Damage", "on_damage", "b", "2!0", "3=0", "4!0")
register_event("HLTV", "on_new_round", "a", "1=0", "2=0")
g_type = register_cvar("amx_bulletdamage","1")
g_recieved = register_cvar("amx_bulletdamage_recieved","1")
g_hudmsg1 = CreateHudSyncObj()
g_hudmsg2 = CreateHudSyncObj()
}
public on_new_round()
{
g_enabled = get_pcvar_num(g_type)
if(get_pcvar_num(g_recieved)) g_showrecieved = true
}
public on_damage(id)
{
if(g_enabled)
{
static attacker; attacker = get_user_attacker(id)
static damage; damage = read_data(2)
new rgb[3];
switch(get_user_team(attacker)){
case 1:{
rgb[0] = 255
rgb[1] = 0
rgb[2] = 0
}
case 2:{
rgb[0] = 0
rgb[1] = 0
rgb[2] = 255
}
}
if(g_showrecieved)
{
set_hudmessage(255, 0, 0, 0.45, 0.50, 2, 0.1, 4.0, 0.1, 0.1, -1)
ShowSyncHudMsg(id, g_hudmsg2, "%i^n", damage)
}
if(is_user_connected(attacker))
{
switch(g_enabled)
{
case 1: {
set_hudmessage(rgb[0], rgb[1], rgb[2], -1.0, 0.55, 2, 0.1, 4.0, 0.02, 0.02, -1)
ShowSyncHudMsg(attacker, g_hudmsg1, "%i^n", damage)
}
case 2: {
if(fm_is_ent_visible(attacker,id))
{
set_hudmessage(rgb[0], rgb[1], rgb[2], -1.0, 0.55, 2, 0.1, 4.0, 0.02, 0.02, -1)
ShowSyncHudMsg(attacker, g_hudmsg1, "%i^n", damage)
}
}
}
}
}
}
Mapmanager 0.5.7 CSDM Mistrick / neygomon
), устанавливал на сервер Advanced MapChooser 1.4
, устанавливал также Map Manager [Modular] 3.0.4
, дамагер переставал работать, отключал amxmodx
и другие модули, оставлял для захода на сервер reunion
и reauthcheck
, дамагер также не работал, стоило отключать выше упомянутые мапменеджеры карт и вернуть какой до этого был установлен:
C-like:
#include <amxmodx>
#include <fakemeta> // Закомментируйте или удалите, если не хотите использовать модуль fakemeta. [Для АМХХ 1.8.3 лучше оставить как есть]
#if (AMXX_VERSION_NUM < 183) || defined NO_NATIVE_COLORCHAT
#include <colorchat>
#else
#define DontChange print_team_default
#define Blue print_team_blue
#define Red print_team_red
#define Grey print_team_grey
#endif
#define PLUGIN "Map Manager"
#define AUTHOR "Mistrick | neygomon"
#pragma semicolon 1
#define SELECT_MAPS 6 // Число карт в голосовании. Максимум 8
#define VOTE_TIME 10 // Время голосования
#define NOMINATE_MAX 3 // Максимальное число номинаций
#define NOMINATE_PLAYER_MAX 1 // Максимальное число карт для номинации одним игроком
#define MAP_BLOCK 10 // Количество последних сыгранных карт, которые не будут предлагаться для голосования
#define HUD_RESULT_COLOR 0, 55, 255 // Цвет результатов голосования
#define MAPSMENU // Включить или выключить say /maps (По дефолту выключен)
#define DEBUG // Сообщения для отладки. Файл mapmanager_debug.log
#define CSDM // Включать на серверах с бесконечными раундами... CSDM/GG/Soccer Jam
// #define MINIMAPS // Включить поддержку второго списка карт (По дефолту выключен)
// [Если включаете, то создайте minimaps.ini в amxmodx/configs] [аля night mode]
#if defined MINIMAPS
#define MINIMAPS_START 1 // Время начала подгрузки карт minimaps [аля night mode]
#define MINIMAPS_END 11 // Время окончания подгрузки карт minimaps [аля night mode]
#endif
#if defined CSDM
#define VERSION "0.5.7 CSDM"
#else
#define VERSION "0.5.7 RND"
#endif
#define TASK_TIMER 978462
#define TASK_VOTEMENU 978162
enum _:BLOCKED_DATA { MAP[33], COUNT }
enum _:NOMINATE_DATA { MAP[33], PLAYER, ID }
new const FILE_BLOCKEDMAPS[] = "addons/amxmodx/data/blockedmaps.ini";
new const PREFIX[] = "^1[^4MapManager^1]";
new Array:g_iMapsArray, Array:g_iNominateArray;
new g_pLoadMapsType, g_pShowSelects, g_pShowResultAfterVote, g_pShowResultType;
new g_pTimeLimit, g_pExendedMax;
new g_pExendedTime, g_pRockEnable, g_pRockPercent, g_pRockDelay, g_pRockShow, g_pNextMap, g_pFriendlyFire, g_pBlockPlayers, g_pAdminVoteWeight, g_pAdminRTVWeight;
new bool:g_bBeInVote, bool:g_bVoteFinished, bool:g_bRockVote, bool:g_bHasVoted[33], bool:g_bRockVoted[33];
new g_iExtendedMax, g_iStartPlugin, g_iLoadMaps;
new g_iInMenu[SELECT_MAPS], g_iVoteItem[SELECT_MAPS + 1], g_iTotal, g_iVoteTime, g_iRockVote;
new g_iNominatedMaps[33];
#if defined MAPSMENU
new g_iPage[33];
#endif
#if !defined CSDM
new pcv_mp_buytime, g_buytime, pcv_mp_roundtime, Float:flt_roundtime, g_pShowHUDLastRound;
new bool:g_buytimeRepare = false;
#endif
new g_msgScreenFade, fade, pcv_mp_freezetime, g_freezetime, g_timelimit;
new bool:g_freezetimeRepare = false, bool:g_timelimitRepare = false, bool:g_Work = false;
new g_szInMenuMapName[SELECT_MAPS][33], g_BlockedMaps[MAP_BLOCK][BLOCKED_DATA], g_szCurrentMap[32];
new const g_szPrefixes[][] = {"cs_", "as_", "de_"};
new const g_szSound[][] = { "", "fvox/one", "fvox/two", "fvox/three" };
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
g_pLoadMapsType = register_cvar("mm_loadmapstype", "1");//0 - load all maps from maps folder, 1 - load maps from file
g_pShowSelects = register_cvar("mm_showselects", "1");//0 - disable, 1 - all, 2 - self
g_pShowResultAfterVote = register_cvar("mm_show_result_aftervote", "1");//0 - disable, 1 - enable
g_pShowResultType = register_cvar("mm_showresulttype", "0");//0 - menu, 1 - hud
g_pBlockPlayers = register_cvar("mm_block_players", "0"); // 1 - yes, 0 - off
g_pExendedTime = register_cvar("mm_extendedtime", "15"); //minutes
g_pExendedMax = register_cvar("mm_extendedmap_max", "2"); // количество продлений
g_pAdminVoteWeight = register_cvar("mm_adminvote_weight", "0"); // вес голоса админа при голосовании [флаг ADMIN_MENU]
g_pAdminRTVWeight = register_cvar("mm_adminrtv_weight", "0"); // вес голоса админа в RTV [флаг ADMIN_MENU]
#if !defined CSDM
g_pShowHUDLastRound = register_cvar("mm_show_lastround", "1"); // показывать HUD последнего раунда или нет
#endif
g_pNextMap = register_cvar("amx_nextmap", "");
g_pRockEnable = register_cvar("mm_rtv_enable", "1");//0 - disable, 1 - enable
g_pRockPercent = register_cvar("mm_rtv_percent", "60");
g_pRockDelay = register_cvar("mm_rtv_delay", "0");//minutes
g_pRockShow = register_cvar("mm_rtv_show", "1");//0 - all, 1 - self
register_concmd("amx_rtv", "Command_StartVote", ADMIN_MAP);
register_clcmd("say ff", "Command_FriendlyFire");
#if defined MAPSMENU
register_clcmd("say maps", "Command_MapsList");
register_clcmd("say /maps", "Command_MapsList");
#endif
register_clcmd("say rtv", "Command_RTV");
register_clcmd("say /rtv", "Command_RTV");
register_clcmd("say nextmap", "Command_Nextmap");
register_clcmd("say timeleft", "Command_Timeleft");
register_clcmd("say thetime", "Command_TheTime");
register_clcmd("say currentmap", "Command_CurrentMap");
register_clcmd("say", "Command_Say");
register_clcmd("say_team", "Command_Say");
#if !defined CSDM
register_event("HLTV", "Event_RoundStart", "a", "1=0", "2=0");
#endif
register_event("TextMsg", "Event_GameRestart", "a", "2=#Game_Commencing", "2=#Game_will_restart_in");
register_cvar ("nmm_version", VERSION, FCVAR_SERVER | FCVAR_SPONLY);
register_menucmd(register_menuid("Vote_Menu"), 1023, "VoteMenu_Handler");
#if defined MAPSMENU
register_menucmd(register_menuid("MapsList_Menu"), 1023, "MapsListMenu_Handler");
#endif
g_iNominateArray = ArrayCreate(NOMINATE_DATA);
g_iStartPlugin = get_systime();
g_msgScreenFade = get_user_msgid ("ScreenFade");
pcv_mp_freezetime = get_cvar_pointer ("mp_freezetime");
#if !defined CSDM
pcv_mp_buytime = get_cvar_pointer ("mp_buytime");
pcv_mp_roundtime = get_cvar_pointer ("mp_roundtime");
#endif
g_pTimeLimit = get_cvar_pointer("mp_timelimit");
g_pFriendlyFire = get_cvar_pointer("mp_friendlyfire");
Load_BlockedMaps();
Load_MapList();
set_task(15.0, "CheckTime", .flags = "b");
// set_cvar_string("mapcyclefile", FILE_MAPS);
#if defined DEBUG
log_to_file("mapmanager_debug.log", "PLUGIN_INIT: %s", g_szCurrentMap);
#endif
}
public plugin_cfg()
{
#if !defined CSDM
flt_roundtime = get_pcvar_float(pcv_mp_roundtime);
#endif
set_cvar_float("sv_restart", 1.0);
#if defined DEBUG
log_to_file("mapmanager_debug.log", "[plugin_cfg] g_pTimeLimit: %d", get_pcvar_num(g_pTimeLimit));
#endif
}
public plugin_end()
{
if(g_freezetimeRepare)
set_pcvar_num(pcv_mp_freezetime, g_freezetime);
#if !defined CSDM
if(g_buytimeRepare)
set_pcvar_num(pcv_mp_buytime, g_buytime);
#endif
if(g_timelimitRepare)
set_pcvar_num(g_pTimeLimit, g_timelimit);
#if defined DEBUG
log_to_file("mapmanager_debug.log", "[plugin_end] g_timelimitRepare: %d | g_pTimeLimit: %d", g_timelimitRepare, get_pcvar_num(g_pTimeLimit));
#endif
new const TEMP_FILE[] = "addons/amxmodx/data/temp.ini";
new iTemp = fopen(TEMP_FILE, "wt");
for(new i = 0; i < MAP_BLOCK; i++)
{
if(g_BlockedMaps[i][COUNT])
fprintf(iTemp, "^"%s^" ^"%d^"^n", g_BlockedMaps[i][MAP], g_BlockedMaps[i][COUNT]);
}
fprintf(iTemp, "^"%s^" ^"%d^"^n", g_szCurrentMap, MAP_BLOCK);
fclose(iTemp);
delete_file(FILE_BLOCKEDMAPS);
#if defined DEBUG
new iRename = rename_file(TEMP_FILE, FILE_BLOCKEDMAPS, 1);
log_to_file("mapmanager_debug.log", "PLUGIN_END: File Renamed? %d", iRename);
log_to_file("mapmanager_debug.log", "- - - - - - - - - - - - - - -");
#else
rename_file(TEMP_FILE, FILE_BLOCKEDMAPS, 1);
#endif
}
public client_disconnect(id)
{
if(task_exists(id + TASK_VOTEMENU)) remove_task(id + TASK_VOTEMENU);
if(g_bRockVoted[id])
{
g_bRockVoted[id] = false;
if(get_user_flags(id) & ADMIN_MENU && get_pcvar_num(g_pAdminRTVWeight) != 0)
g_iRockVote -= get_pcvar_num(g_pAdminRTVWeight);
else
g_iRockVote--;
}
if(g_iNominatedMaps[id])
clear_nominated_maps(id);
}
//***** Commands *****//
public Command_StartVote(id, flag)
{
if(~get_user_flags(id) & flag) return PLUGIN_HANDLED;
if(g_Work)
{
if(id == 0)
console_print(0, "[MapManager] VoteMap has already started");
else
console_print(id, "[MapManager] Голосование уже ^4запущено! ^1Ожидайте.");
}
else
{
if(id == 0)
console_print(0, "[MapManager] VoteMap started");
else
console_print(id, "[MapManager] Голосование за досрочную смену карты ^4запущено");
#if !defined CSDM
g_Work = true;
#else
StartVote(0);
#endif
client_print_color(0, DontChange, "%s^1 Администратор запустил ^4досрочное голосование!", PREFIX);
new name[32];
get_user_name(id, name, charsmax(name));
log_amx("Администратор %s запустил ^4досрочное голосование", name);
#if !defined CSDM
if(get_pcvar_num(g_pShowHUDLastRound))
hud_lastround();
#endif
}
return PLUGIN_HANDLED;
}
public Command_FriendlyFire(id)
client_print_color(0, DontChange, "%s^1 На сервере^3 %s^1 огонь по своим.", PREFIX, get_pcvar_num(g_pFriendlyFire) ? "разрешен" : "запрещен");
public Command_TheTime(id)
{
new time[64];
get_time ("%Y/%m/%d - %H:%M:%S", time, sizeof (time) - 1);
client_print_color(id, DontChange, "%s^1 Текущее время: ^3 %s^1", PREFIX, time);
}
#if defined MAPSMENU
public Command_MapsList(id)
Show_MapsListMenu(id, g_iPage[id] = 0);
public Show_MapsListMenu(id, iPage)
{
#if defined _fakemeta_included
set_pdata_int( id, 205, 0 );
#endif
if(iPage < 0) return PLUGIN_HANDLED;
new iMax = ArraySize(g_iMapsArray);
new i = min(iPage * 8, iMax);
new iStart = i - (i % 8);
new iEnd = min(iStart + 8, iMax);
iPage = iStart / 8;
g_iPage[id] = iPage;
new szMenu[512], iLen = 0, iLen_Max = charsmax(szMenu), szMapName[32];
iLen = formatex(szMenu, iLen_Max, "\yСписок карт \w[%d/%d]:^n", iPage + 1, ((iMax - 1) / 8) + 1);
new Keys, Item, iBlock, iNominator;
for (i = iStart; i < iEnd; i++)
{
ArrayGetString(g_iMapsArray, i, szMapName, charsmax(szMapName));
iBlock = get_blocked_map_count(szMapName);
iNominator = is_map_nominated(szMapName);
if(iBlock)
iLen += formatex(szMenu[iLen], iLen_Max - iLen, "^n\r%d.\d %s[\r%d\d]", ++Item, szMapName, iBlock);
else if(iNominator)
{
if(iNominator == id)
{
Keys |= (1 << Item);
iLen += formatex(szMenu[iLen], iLen_Max - iLen, "^n\r%d.\w %s[\y*\w]", ++Item, szMapName);
}
else
iLen += formatex(szMenu[iLen], iLen_Max - iLen, "^n\r%d.\d %s[\y*\d]", ++Item, szMapName);
}
else
{
Keys |= (1 << Item);
iLen += formatex(szMenu[iLen], iLen_Max - iLen, "^n\r%d.\w %s", ++Item, szMapName);
}
}
while(Item <= 8)
{
Item++;
iLen += formatex(szMenu[iLen], iLen_Max - iLen, "^n");
}
if (iEnd < iMax)
{
Keys |= (1 << 8)|(1 << 9);
formatex(szMenu[iLen], iLen_Max - iLen, "^n\r9.\w %Вперед^n\r0.\w %s", iPage ? "Назад" : "Выход");
}
else
{
Keys |= (1 << 9);
formatex(szMenu[iLen], iLen_Max - iLen, "^n^n\r0.\w %s", iPage ? "Назад" : "Выход");
}
show_menu(id, Keys, szMenu, -1, "MapsList_Menu");
return PLUGIN_HANDLED;
}
public MapsListMenu_Handler(id, key)
{
switch (key)
{
case 8: Show_MapsListMenu(id, ++g_iPage[id]);
case 9: Show_MapsListMenu(id, --g_iPage[id]);
default:
{
new szMapName[33]; ArrayGetString(g_iMapsArray, key + g_iPage[id] * 8, szMapName, charsmax(szMapName));
if(g_iNominatedMaps[id] && is_map_nominated(szMapName))
remove_nominated_map(id, szMapName);
else
NominateMap(id, szMapName);
}
}
return PLUGIN_HANDLED;
}
#endif
public Command_RTV(id)
{
if(g_bVoteFinished || g_bBeInVote) return PLUGIN_HANDLED;
if(!get_pcvar_num(g_pRockEnable)) return PLUGIN_CONTINUE;
if(get_systime() - g_iStartPlugin < get_pcvar_num(g_pRockDelay) * 60)
{
new iMin = 1 + (get_pcvar_num(g_pRockDelay) * 60 - (get_systime() - g_iStartPlugin)) / 60;
new szMin[16]; get_ending(iMin, "минут", "минута", "минуты", szMin, charsmax(szMin));
client_print_color(id, DontChange, "%s^1 Вы не можете голосовать за досрочную ^4смену карты. Осталось: %d %s.", PREFIX, iMin, szMin);
return PLUGIN_HANDLED;
}
if(!g_bRockVoted[id])
{
g_bRockVoted[id] = true;
if(get_user_flags(id) & ADMIN_MENU && get_pcvar_num(g_pAdminRTVWeight) != 0)
g_iRockVote += get_pcvar_num(g_pAdminRTVWeight);
else
g_iRockVote++;
new iVote = floatround(get_players_num() * get_pcvar_num(g_pRockPercent) / 100.0, floatround_ceil) - g_iRockVote;
if(iVote > 0)
{
new szVote[16]; get_ending(iVote, "голосов", "голос", "голоса", szVote, charsmax(szVote));
switch(get_pcvar_num(g_pRockShow))
{
case 0:
{
new szName[33];
get_user_name(id, szName, charsmax(szName));
client_print_color(0, DontChange, "%s^3 %s^1 проголосовал за ^4смену карты. Осталось: %d %s.", PREFIX, szName, iVote, szVote);
#if defined DEBUG
log_to_file("mapmanager_debug.log", "%s проголосовал за ^4смену карты. Осталось: %d %s.", szName, iVote, szVote);
#else
log_amx("%s проголосовал за ^4смену карты. Осталось: %d %s.", szName, iVote, szVote);
#endif
}
case 1: client_print_color(id, DontChange, "%s^1 Ваш голос ^4учтён. Осталось: %d %s.", PREFIX, iVote, szVote);
}
}
else
{
#if !defined CSDM
g_bRockVote = true;
g_Work = true;
client_print_color(0, DontChange, "%s^1 Голосование за смену карты будет в ^4новом раунде.", PREFIX);
#if defined DEBUG
log_to_file("mapmanager_debug.log", "Голосование за смену карты будет в ^4новом раунде.");
#endif
#else
StartVote(0);
#endif
}
}
else
{
new iVote = floatround(get_players_num() * get_pcvar_num(g_pRockPercent) / 100.0, floatround_ceil) - g_iRockVote;
new szVote[16]; get_ending(iVote, "голосов", "голос", "голоса", szVote, charsmax(szVote));
client_print_color(id, DontChange, "%s^1 Вы уже ^4голосовали. Осталось: %d %s.", PREFIX, iVote, szVote);
}
return PLUGIN_HANDLED;
}
public Command_Nextmap(id)
{
new szMap[33]; get_pcvar_string(g_pNextMap, szMap, charsmax(szMap));
client_print_color(0, Blue, "%s^1 Следующая ^4карта: ^3%s^1.", PREFIX, szMap);
}
public Command_Timeleft(id)
{
new a = get_timeleft();
if(a == 0)
client_print_color(0, DontChange, "%s^1 Карта не ограничена по ^4времени.", PREFIX);
else
client_print_color(0, Blue, "%s^1 До конца карты ^4осталось:^3 %d:%02d", PREFIX, (a / 60), (a % 60));
}
public Command_CurrentMap(id)
client_print_color(0, Blue, "%s^1 Текущая карта:^3 %s^1.", PREFIX, g_szCurrentMap);
public Command_Say(id)
{
if(g_bVoteFinished || g_bBeInVote) return;
new szText[33]; read_args(szText, charsmax(szText));
remove_quotes(szText);
trim(szText);
if(in_maps_array(szText))
{
if(g_iNominatedMaps[id] && is_map_nominated(szText))
remove_nominated_map(id, szText);
else
NominateMap(id, szText);
}
else
{
for(new i = 0; i < sizeof(g_szPrefixes); i++)
{
static szFormat[33];
formatex(szFormat, charsmax(szFormat), "%s%s", g_szPrefixes[i], szText);
if(in_maps_array(szFormat))
{
if(g_iNominatedMaps[id] && is_map_nominated(szFormat))
remove_nominated_map(id, szFormat);
else
NominateMap(id, szFormat);
break;
}
}
}
}
NominateMap(id, map[33])
{
if(g_iNominatedMaps[id] == NOMINATE_PLAYER_MAX)
{
client_print_color(id, DontChange, "%s^1 Вы не можете больше ^4номинировать ^1карты.", PREFIX);
return PLUGIN_HANDLED;
}
if(get_blocked_map_count(map))
{
client_print_color(id, DontChange, "%s^1 Эта карта недоступна для ^4номинации.", PREFIX);
return PLUGIN_HANDLED;
}
if(is_map_nominated(map))
{
client_print_color(id, DontChange, "%s^1 Эта карта уже ^4номинирована.", PREFIX);
return PLUGIN_HANDLED;
}
new szMap[33], i;
for(i = 0; i < g_iLoadMaps; i++)
{
ArrayGetString(g_iMapsArray, i, szMap, charsmax(szMap));
if(equal(map, szMap)) break;
}
new Data[NOMINATE_DATA];
Data[MAP] = map;
Data[PLAYER] = id;
Data[ID] = i;
ArrayPushArray(g_iNominateArray, Data);
g_iNominatedMaps[id]++;
new szName[33]; get_user_name(id, szName, charsmax(szName));
client_print_color(0, id, "%s^3 %s^1 номинировал на голосование^3 %s^1.", PREFIX, szName, map);
return PLUGIN_HANDLED;
}
//***** Events *****//
#if !defined CSDM
public Event_RoundStart()
{
if(g_Work)
StartVote(0);
}
#endif
public Event_GameRestart()
g_iStartPlugin = get_systime();
//***** *****//
Load_BlockedMaps()
{
get_mapname(g_szCurrentMap, charsmax(g_szCurrentMap));
if(!file_exists(FILE_BLOCKEDMAPS) || !MAP_BLOCK) return PLUGIN_CONTINUE;
new const TEMP_FILE[] = "addons/amxmodx/data/temp.ini";
new iFile = fopen(FILE_BLOCKEDMAPS, "rt");
new iTemp = fopen(TEMP_FILE, "wt");
new szBuffer[128], szMap[33], szCount[8], iCount, i = 0;
while(!feof(iFile))
{
fgets(iFile, szBuffer, charsmax(szBuffer));
parse(szBuffer, szMap, charsmax(szMap), szCount, charsmax(szCount));
if(get_blocked_map_count(szMap) || !is_map_valid(szMap) || equal(szMap, g_szCurrentMap)) continue;
iCount = str_to_num(szCount) - 1;
if(!iCount) continue;
if(iCount > MAP_BLOCK)
{
fprintf(iTemp, "^"%s^" ^"%d^"^n", szMap, MAP_BLOCK);
iCount = MAP_BLOCK;
}
else
fprintf(iTemp, "^"%s^" ^"%d^"^n", szMap, iCount);
formatex(g_BlockedMaps[i][MAP], charsmax(g_BlockedMaps[][MAP]), szMap);
g_BlockedMaps[i++][COUNT] = iCount;
if(i >= MAP_BLOCK) break;
}
fclose(iFile);
fclose(iTemp);
delete_file(FILE_BLOCKEDMAPS);
#if defined DEBUG
new iRename = rename_file(TEMP_FILE, FILE_BLOCKEDMAPS, 1);
log_to_file("mapmanager_debug.log", "LOAD_BLOCKEDMAPS: File Renamed? %d; Blocked ? %d", iRename, i);
#else
rename_file(TEMP_FILE, FILE_BLOCKEDMAPS, 1);
#endif
return PLUGIN_CONTINUE;
}
Load_MapList()
{
#if defined MINIMAPS
new Hours[3];
get_time("%H", Hours, 2);
new iHours = str_to_num(Hours);
new filemaps[64];
if(MINIMAPS_START <= iHours < MINIMAPS_END)
formatex (filemaps, sizeof(filemaps) - 1, "addons/amxmodx/configs/minimaps.ini");
else
formatex (filemaps, sizeof(filemaps) - 1, "addons/amxmodx/configs/maps.ini");
#else
new filemaps[64];
formatex (filemaps, sizeof(filemaps) - 1, "addons/amxmodx/configs/maps.ini");
#endif
g_iLoadMaps = 0;
g_iMapsArray = ArrayCreate(32);
if(file_exists(filemaps) && get_pcvar_num(g_pLoadMapsType))
{
new szMapName[33];
new f = fopen(filemaps, "rt");
while(!feof(f))
{
fgets(f, szMapName, charsmax(szMapName));
trim(szMapName);
remove_quotes(szMapName);
if(!szMapName[0] || szMapName[0] == ';' || szMapName[0] == '/' && szMapName[1] == '/'
|| !valid_map(szMapName) || in_maps_array(szMapName) || equali(szMapName, g_szCurrentMap))
continue;
g_iLoadMaps++;
ArrayPushString(g_iMapsArray, szMapName);
}
fclose(f);
}
else
{
new iDir, iLen, szFileName[64];
new DirName[] = "maps";
iDir = open_dir(DirName, szFileName, charsmax(szFileName));
if(iDir)
{
while(next_file(iDir, szFileName, charsmax(szFileName)))
{
iLen = strlen(szFileName) - 4;
if(iLen < 0) continue;
if(equali(szFileName[iLen], ".bsp") && !equali(szFileName, g_szCurrentMap))
{
szFileName[iLen] = '^0';
g_iLoadMaps++;
ArrayPushString(g_iMapsArray, szFileName);
}
}
close_dir(iDir);
}
}
if(!g_iLoadMaps)
{
set_fail_state("LOAD_MAPS: Nothing loaded");
return;
}
if(g_iLoadMaps - get_blocked_maps() <= 0)
clear_blocked_maps();
new szMap[33];
do
ArrayGetString(g_iMapsArray, random_num(0, g_iLoadMaps - 1), szMap, charsmax(szMap));
while(get_blocked_map_count(szMap));
set_pcvar_string(g_pNextMap, szMap);
#if defined DEBUG
log_to_file("mapmanager_debug.log", "LOAD_MAPS: Loaded Maps ? %d", g_iLoadMaps);
#endif
}
public CheckTime()
{
if(!g_iLoadMaps || g_bVoteFinished || g_bBeInVote || g_Work) return PLUGIN_CONTINUE;
static iTimeLeft; iTimeLeft = get_timeleft();
static iTimeLimit; iTimeLimit = get_pcvar_num(g_pTimeLimit);
#if defined CSDM
if(iTimeLeft < 60 && iTimeLimit != 0)
{
StartVote(0);
if(!g_timelimitRepare)
{
g_timelimitRepare = true;
g_timelimit = iTimeLimit;
}
set_pcvar_num(g_pTimeLimit, iTimeLimit + 1);
}
#else
if(iTimeLeft < (flt_roundtime * 60) && iTimeLimit != 0)
{
g_Work = true;
if(!g_timelimitRepare)
{
g_timelimitRepare = true;
g_timelimit = iTimeLimit;
}
new iAddTime = floatround(flt_roundtime * 60 * 1.5 / 60.0, floatround_round);
set_pcvar_num(g_pTimeLimit, iTimeLimit + iAddTime);
if(get_pcvar_num(g_pShowHUDLastRound))
hud_lastround();
}
#endif
return PLUGIN_CONTINUE;
}
public StartVote(id)
{
if(!g_iLoadMaps)
{
if(id) client_print_color(id, DontChange, "%s^1 В файле нет ^4валидных ^1карт.", PREFIX);
return PLUGIN_HANDLED;
}
if(g_bBeInVote)
{
if(id) client_print_color(id, DontChange, "%s^1 Голосование ^4запущено.", PREFIX);
return PLUGIN_HANDLED;
}
g_bBeInVote = true;
g_iTotal = 0;
arrayset(g_iVoteItem, 0, SELECT_MAPS + 1);
arrayset(g_iInMenu, -1, SELECT_MAPS);
arrayset(g_bHasVoted, false, 33);
new Num, NomInMenu = 0, Data[NOMINATE_DATA];
new iMax = 8, Limits[2];
Limits[0] = SELECT_MAPS;
Limits[1] = g_iLoadMaps - get_blocked_maps();
for(new i = 0; i < sizeof(Limits); i++)
if(iMax > Limits[i]) iMax = Limits[i];
new iNomMax, iNomNum = ArraySize(g_iNominateArray);
iNomMax = iNomNum > NOMINATE_MAX ? NOMINATE_MAX : iNomNum;
for(new i = 0; i < iMax; i++)
{
if(NomInMenu < iNomMax)
{
Num = random_num(0, ArraySize(g_iNominateArray) - 1);
ArrayGetArray(g_iNominateArray, Num, Data);
formatex(g_szInMenuMapName[i], 32, Data[MAP]);
g_iInMenu[i] = Data[ID];
NomInMenu++;
ArrayDeleteItem(g_iNominateArray, Num);
g_iNominatedMaps[Data[PLAYER]]--;
}
else
{
do Num = random_num(0, g_iLoadMaps - 1);
while(in_menu(Num) || is_blocked(Num));
g_iInMenu[i] = Num;
ArrayGetString(g_iMapsArray, Num, g_szInMenuMapName[i], 32);
}
}
#if defined DEBUG
log_to_file("mapmanager_debug.log", "Голосование началось =)");
#endif
if(get_pcvar_num(g_pBlockPlayers))
{
fade = 1; cmd_screen_fade (fade);
if ( !g_freezetimeRepare )
{
g_freezetime = get_pcvar_num (pcv_mp_freezetime);
g_freezetimeRepare = true;
}
set_pcvar_num ( pcv_mp_freezetime, 15 );
#if !defined CSDM
if (!g_buytimeRepare)
{
g_buytime = get_pcvar_num (pcv_mp_buytime);
g_buytimeRepare = true;
}
set_pcvar_float(pcv_mp_buytime, 0.5);
#endif
}
set_task(1.0, "Show_Timer", _, _, _, "a", 3);
set_task(4.0, "Show_Menu");
#if defined DEBUG
log_to_file("mapmanager_debug.log", "START_VOTE: RTV? %d", g_bRockVote ? 1 : 0);
#endif
return PLUGIN_HANDLED;
}
public Show_Timer()
{
static iTimer; if(iTimer == 0) iTimer = 3;
new szSec[16]; get_ending(iTimer, "секунд", "секунда", "секунды", szSec, charsmax(szSec));
for(new i = 1; i <= 32; i++)
{
if(!is_user_connected(i)) continue;
set_hudmessage(50, 255, 50, -1.0, is_user_alive(i) ? 0.9 : 0.3, 0, 0.0, 1.0, 0.0, 0.0, 1);
show_hudmessage(i, "До голосования осталось %d %s!", iTimer, szSec);
}
client_cmd(0, "spk %s", g_szSound[iTimer--]);
}
public Show_Menu()
{
new Players[32], pNum, iPlayer; get_players(Players, pNum, "ch");
g_iVoteTime = VOTE_TIME;
for(new i = 0; i < pNum; i++)
{
iPlayer = Players[i];
VoteMenu(iPlayer + TASK_VOTEMENU);
set_task(1.0, "VoteMenu", iPlayer + TASK_VOTEMENU, _, _, "a", VOTE_TIME);
}
set_task(1.0, "Timer", TASK_TIMER, _, _, "a", VOTE_TIME+1);
client_cmd(0, "spk Gman/Gman_Choose2");
}
public VoteMenu(id)
{
id -= TASK_VOTEMENU;
#if defined _fakemeta_included
set_pdata_int( id, 205, 0 );
#endif
if(g_iVoteTime == 0)
{
show_menu(0, 0, "^n", 1);
if(task_exists(id+TASK_VOTEMENU)) remove_task(id+TASK_VOTEMENU);
return PLUGIN_HANDLED;
}
new szMenu[512], len = 0;
len = formatex(szMenu[len], charsmax(szMenu) - len, "\y%s:^n^n", g_bHasVoted[id] ? "Результаты голосования" : "Выберите карту");
new Key, iPercent, i, iMax = maps_in_menu();
for(i = 0; i < iMax; i++)
{
iPercent = 0;
if(g_iTotal)
iPercent = floatround(g_iVoteItem[i]*100.0/g_iTotal);
if(!g_bHasVoted[id])
{
len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%d.\w %s\d[\r%d%%\d]^n", i + 1, g_szInMenuMapName[i], iPercent);
Key |= (1 << i);
}
else
len += formatex(szMenu[len], charsmax(szMenu) - len, "\d%s[\r%d%%\d]^n", g_szInMenuMapName[i], iPercent);
}
if(!g_bRockVote && get_pcvar_num(g_pTimeLimit) != 0 && g_iExtendedMax < get_pcvar_num(g_pExendedMax))
{
iPercent = 0;
if(g_iTotal)
iPercent = floatround(g_iVoteItem[i]*100.0/g_iTotal);
if(!g_bHasVoted[id])
{
len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\r%d.\w %s\d[\r%d%%\d]\y[Продлить]^n", i + 1, g_szCurrentMap, iPercent);
Key |= (1 << i);
}
else
len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\d%s[\r%d%%\d]\y[Продлить]^n", g_szCurrentMap, iPercent);
}
new szSec[16]; get_ending(g_iVoteTime, "секунд", "секунда", "секунды", szSec, charsmax(szSec));
len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\dОсталось \r%d\d %s", g_iVoteTime, szSec);
if(!Key) Key |= (1 << 9);
if(get_pcvar_num(g_pShowResultType) == 1 && g_bHasVoted[id])
{
while(replace(szMenu, charsmax(szMenu), "\r", "")){}
while(replace(szMenu, charsmax(szMenu), "\d", "")){}
while(replace(szMenu, charsmax(szMenu), "\w", "")){}
while(replace(szMenu, charsmax(szMenu), "\y", "")){}
set_hudmessage(HUD_RESULT_COLOR, 0.02, -1.0, 0, 6.0, 1.0, 0.1, 0.2, 4);
show_hudmessage(id, "%s", szMenu);
}
else
show_menu(id, Key, szMenu, -1, "Vote_Menu");
return PLUGIN_HANDLED;
}
public VoteMenu_Handler(id, key)
{
if(g_bHasVoted[id])
{
VoteMenu(id + TASK_VOTEMENU);
return PLUGIN_HANDLED;
}
if(get_user_flags(id) & ADMIN_MENU && get_pcvar_num(g_pAdminVoteWeight) != 0)
g_iVoteItem[key] += get_pcvar_num(g_pAdminVoteWeight);
else
g_iVoteItem[key]++;
g_iTotal++;
g_bHasVoted[id] = true;
new iCvar = get_pcvar_num(g_pShowSelects);
if(iCvar)
{
new szName[32];
get_user_name(id, szName, charsmax(szName));
if(key == maps_in_menu())
{
switch(iCvar)
{
#if defined DEBUG
case 1:
{
client_print_color(0, id, "%s^1 ^3%s^1 выбрал ^4продление ^1карты.", PREFIX, szName);
log_to_file("mapmanager_debug.log", "%s выбрал ^4продление ^1карты.", szName);
}
#else
case 1: client_print_color(0, id, "%s^1 ^3%s^1 выбрал ^4продление ^1карты.", PREFIX, szName);
#endif
case 2: client_print_color(id, DontChange, "%s^1 Вы выбрали ^4продление ^1карты.", PREFIX);
}
}
else
{
switch(iCvar)
{
case 1: client_print_color(0, id, "%s^3 %s^1 выбрал^3 %s^1.", PREFIX, szName, g_szInMenuMapName[key]);
case 2: client_print_color(id, DontChange, "%s^1 Вы выбрали^3 %s^1.", PREFIX, g_szInMenuMapName[key]);
}
}
}
if(get_pcvar_num(g_pShowResultAfterVote))
VoteMenu(id + TASK_VOTEMENU);
else
if(task_exists(id + TASK_VOTEMENU)) remove_task(id + TASK_VOTEMENU);
return PLUGIN_HANDLED;
}
public Timer()
{
if(--g_iVoteTime == 0)
{
FinishVote();
show_menu(0, 0, "^n", 1);
if(task_exists(TASK_TIMER)) remove_task(TASK_TIMER);
}
}
FinishVote()
{
new MaxVote = 0, iInMenu = maps_in_menu(), iRandom;
new iMax = g_bRockVote ? iInMenu : iInMenu + 1;
for(new i = 1; i < iMax ; i++)
{
iRandom = random_num(0, 1);
switch(iRandom)
{
case 0: if(g_iVoteItem[MaxVote] < g_iVoteItem[i]) MaxVote = i;
case 1: if(g_iVoteItem[MaxVote] <= g_iVoteItem[i]) MaxVote = i;
}
}
g_bBeInVote = false;
g_bVoteFinished = true;
g_Work = false;
if(!g_iTotal || (MaxVote != iInMenu))
{
if(g_iTotal)
{
client_print_color(0, Blue, "%s^1 Следующая ^4карта:^3 %s^1.", PREFIX, g_szInMenuMapName[MaxVote]);
#if defined DEBUG
log_to_file("mapmanager_debug.log", "Следующая ^4карта: %s", g_szInMenuMapName[MaxVote]);
#else
log_amx("Следующая карта: %s", g_szInMenuMapName[MaxVote]);
#endif
}
else
{
MaxVote = random_num(0, iInMenu - 1);
client_print_color(0, Blue, "%s^1 Никто ^4не голосовал. Следующей ^будет^3 %s^1.", PREFIX, g_szInMenuMapName[MaxVote]);
}
set_pcvar_string(g_pNextMap, g_szInMenuMapName[MaxVote]);
if(g_bRockVote || g_bVoteFinished)
{
ChangeLevel();
#if defined DEBUG
log_to_file("mapmanager_debug.log", "Меняем карту =)");
#endif
}
}
else
{
g_bVoteFinished = false;
g_iExtendedMax++;
new iMin = get_pcvar_num(g_pExendedTime);
new szMin[16]; get_ending(iMin, "минут", "минута", "минуты", szMin, charsmax(szMin));
client_print_color(0, DontChange, "%s^1 Текущая карта ^4продлена ^1на^3 %d^1 %s.", PREFIX, iMin, szMin);
#if defined DEBUG
log_to_file("mapmanager_debug.log", "Текущая карта ^4продлена ^1на %d %s.", iMin, szMin);
#else
log_amx("Текущая карта продлена на %d %s.", iMin, szMin);
#endif
set_pcvar_num(g_pTimeLimit, get_pcvar_num(g_pTimeLimit) + iMin);
if(get_pcvar_num(g_pBlockPlayers))
{
set_pcvar_num ( pcv_mp_freezetime, g_freezetime );
fade = 0; cmd_screen_fade (fade);
}
}
}
public ChangeLevel()
{
message_begin(MSG_ALL, SVC_INTERMISSION);
message_end();
set_task(3.0, "NextMap");
}
public NextMap()
{
new szMap[32]; get_pcvar_string(g_pNextMap, szMap, charsmax(szMap));
server_cmd("changelevel %s", szMap);
}
//***** *****//
bool:valid_map(map[])
{
if(is_map_valid(map)) return true;
new len = strlen(map) - 4;
if(len < 0) return false;
if(equal(map[len], ".bsp"))
{
map[len] = '^0';
if(is_map_valid(map)) return true;
}
return false;
}
bool:in_maps_array(map[])
{
new szMap[33], iMax = ArraySize(g_iMapsArray);
for(new i = 0; i < iMax; i++)
{
ArrayGetString(g_iMapsArray, i, szMap, charsmax(szMap));
if(equal(szMap, map))
return true;
}
return false;
}
get_blocked_maps()
{
new iCount = 0;
for(new i = 0; i < MAP_BLOCK; i++)
if(g_BlockedMaps[i][COUNT]) iCount++;
return iCount;
}
clear_blocked_maps()
{
for(new i = 0; i < MAP_BLOCK; i++)
{
g_BlockedMaps[i][MAP] = "";
g_BlockedMaps[i][COUNT] = 0;
}
delete_file(FILE_BLOCKEDMAPS);
}
get_blocked_map_count(map[])
{
for(new i = 0; i < MAP_BLOCK; i++)
if(equal(g_BlockedMaps[i][MAP], map)) return g_BlockedMaps[i][COUNT];
return 0;
}
clear_nominated_maps(id)
{
new Data[NOMINATE_DATA];
for(new i = 0; i < ArraySize(g_iNominateArray); i++)
{
ArrayGetArray(g_iNominateArray, i, Data);
if(Data[PLAYER] == id)
{
ArrayDeleteItem(g_iNominateArray, i--);
if(!--g_iNominatedMaps[id]) break;
}
}
}
remove_nominated_map(id, map[])
{
new Data[NOMINATE_DATA], iMax = ArraySize(g_iNominateArray);
for(new i = 0; i < iMax; i++)
{
ArrayGetArray(g_iNominateArray, i, Data);
if(Data[PLAYER] == id && equal(Data[MAP], map))
{
new szName[32]; get_user_name(id, szName, charsmax(szName));
g_iNominatedMaps[id]--;
ArrayDeleteItem(g_iNominateArray, i);
client_print_color(0, Blue, "%s^3 %s^1 убрал ^4номинацию ^1с ^4карты^3 %s^1.", PREFIX, szName, map);
break;
}
}
}
is_map_nominated(map[])
{
new Data[NOMINATE_DATA], iMax = ArraySize(g_iNominateArray);
for(new i = 0; i < iMax; i++)
{
ArrayGetArray(g_iNominateArray, i, Data);
if(equal(Data[MAP], map)) return Data[PLAYER];
}
return 0;
}
bool:in_menu(num)
{
for(new i = 0; i < SELECT_MAPS && i < 8; i++)
if(num == g_iInMenu[i]) return true;
return false;
}
bool:is_blocked(num)
{
new szMap[33]; ArrayGetString(g_iMapsArray, num, szMap, charsmax(szMap));
for(new i = 0; i < MAP_BLOCK; i++)
if(equal(g_BlockedMaps[i][MAP], szMap)) return true;
return false;
}
maps_in_menu()
{
new map;
for(new i = 0; i < SELECT_MAPS; i++)
if(g_iInMenu[i] != -1) map++;
return map;
}
stock get_players_num()
{
new iPlayers = 0, iMax = get_maxplayers();
for(new id = 1; id < iMax; id++)
if(is_user_connected(id) && !is_user_bot(id) && !is_user_hltv(id)) iPlayers++;
return iPlayers;
}
stock get_ending(num, const a[], const b[], const c[], output[], lenght)
{
new num100 = num % 100, num10 = num % 10;
if(num100 >=5 && num100 <= 20 || num10 == 0 || num10 >= 5 && num10 <= 9) format(output, lenght, "%s", a);
else if(num10 == 1) format(output, lenght, "%s", b);
else if(num10 >= 2 && num10 <= 4) format(output, lenght, "%s", c);
}
stock cmd_screen_fade (fade)
{
new time, hold, flags;
switch (fade)
{
case 1:
{
time = 1;
hold = 1;
flags = 4;
}
default:
{
time = 4096;
hold = 1024;
flags = 2;
}
}
message_begin ( MSG_BROADCAST, g_msgScreenFade, {0,0,0}, 0 );
write_short ( time );
write_short ( hold );
write_short ( flags );
write_byte ( 0 );
write_byte ( 0 );
write_byte ( 0 );
write_byte ( 255 );
message_end();
return PLUGIN_CONTINUE;
}
#if !defined CSDM
stock hud_lastround()
{
set_hudmessage(127, 127, 127, 0.02, 0.21, 0, 30.0, 15.04, 0.0, 0.5, 3);
show_hudmessage(0, "Последний раунд");
}
#endif
Последнее редактирование: