#include amxmodx
#if AMXX_VERSION_NUM < 183
#define engine_changelevel(%0) server_cmd("changelevel %s", %0)
#endif
new g_pTimeLimit, g_iOldTime, Float:g_flResetTime;
new bool:g_bNight;
enum _:DATA
{
NAME[32],
FROM,
TO
}
new g_aMaps[128][DATA];
new g_iCountMaps;
public plugin_init()
{
#define VERSION "1.1"
register_plugin("Night MapList", VERSION, "neygomon");
register_cvar("light_maplist", VERSION, FCVAR_SERVER | FCVAR_SPONLY);
register_event("TextMsg", "eGameCommencing", "a", "2=#Game_Commencing", "2=#Game_will_restart_in");
register_event("HLTV", "eRoundStart", "a", "1=0", "2=0");
register_clcmd("say rtv", "RtvHook");
register_clcmd("say_team rtv", "RtvHook");
register_clcmd("say /rtv", "RtvHook");
register_clcmd("say_team rtv", "RtvHook");
register_clcmd("amx_rtv", "RtvHook");
g_pTimeLimit = get_cvar_pointer("mp_timelimit");
}
public plugin_cfg()
{
new fHand = fopen("addons/amxmodx/configs/night_maps.ini", "rt");
if(!fHand) set_fail_state("File ^"addons/amxmodx/configs/night_maps.ini^" not found OR not read!");
new buffer[64], sFrom[6], sTo[6];
new sTemp[4][3];
new iFrom, iTo;
while(!feof(fHand))
{
fgets(fHand, buffer, charsmax(buffer)); trim(buffer);
if(!buffer[0] || buffer[0] == ';') continue;
if(parse(buffer, g_aMaps[g_iCountMaps][NAME], charsmax(g_aMaps[][NAME]), sFrom, charsmax(sFrom), sTo, charsmax(sTo)))
{
replace_all(sFrom, charsmax(sFrom), ":", " ");
replace_all(sTo, charsmax(sTo), ":", " ");
if(parse(sFrom, sTemp[0], charsmax(sTemp[]), sTemp[1], charsmax(sTemp[])) &&
parse(sTo, sTemp[2], charsmax(sTemp[]), sTemp[3], charsmax(sTemp[])))
{
iFrom = str_to_num(sTemp[0]) * 60 * 60 + str_to_num(sTemp[1]) * 60;
iTo = str_to_num(sTemp[2]) * 60 * 60 + str_to_num(sTemp[3]) * 60;
g_aMaps[g_iCountMaps][FROM] = iFrom;
g_aMaps[g_iCountMaps][TO] = (iFrom > iTo) ? (86400 - iFrom) + iFrom + iTo : iTo;
g_iCountMaps++;
}
}
}
if(!g_iCountMaps) set_fail_state("Maps not found OR invalid syntax file! Check ^"addons/amxmodx/configs/night_maps.ini^"");
}
public plugin_end()
if(g_iOldTime)
set_pcvar_num(g_pTimeLimit, g_iOldTime);
public client_putinserver(id)
if(g_bNight)
remove_user_flags(id, ADMIN_MAP|ADMIN_VOTE);
public eGameCommencing()
g_flResetTime = get_gametime();
public eRoundStart()
{
static CurHour, CurMinute; time(CurHour, CurMinute);
new CurTime = CurHour * 60 * 60 + CurMinute * 60;
if(g_aMaps[0][FROM] <= CurTime || CurTime < g_aMaps[g_iCountMaps-1][TO])
{
new IdMap = CheckMaps(CurTime); if(IdMap == -1) return;
static map[32]; if(!map[0]) get_mapname(map, charsmax(map));
if(!equal(map, g_aMaps[IdMap][NAME]))
{
engine_changelevel(g_aMaps[IdMap][NAME]);
return;
}
else if(!g_bNight)
{
g_bNight = true;
RemovePlayersFlags();
g_iOldTime = get_pcvar_num(g_pTimeLimit);
set_pcvar_num(g_pTimeLimit, 0);
}
}
else if(g_bNight)
{
set_pcvar_num(g_pTimeLimit, floatround(get_gametime() - g_flResetTime) / 60 + 5);
g_bNight = false;
}
}
public RtvHook(id)
{
if(g_bNight)
{
ChatColor(id, "^1[^4INFO^1] ^4RTV не работает в ^3Ночном режиме!");
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
RemovePlayersFlags()
{
static players[32], pcount;
get_players(players, pcount, "ch");
for(new i; i < pcount; i++)
remove_user_flags(players[i], ADMIN_MAP|ADMIN_VOTE);
}
stock CheckMaps(cTime)
{
for(new i; i < g_iCountMaps; i++)
{
if(cTime >= g_aMaps[i][FROM] && cTime < g_aMaps[i][TO])
return i;
}
return -1;
}
/*
stock CheckMaps(cTime)
{
new iTemp;
for(new i; i < g_iCountMaps; i++)
{
if(cTime >= g_aMaps[i][FROM] && cTime < g_aMaps[i][TO])
iTemp = i;
}
return (iTemp > 0) ? iTemp : -1;
}
*/
stock ChatColor(const id, const szMessage[], any:...)
{
static pnum, players[32], szMsg[190], IdMsg;
vformat(szMsg, charsmax(szMsg), szMessage, 3);
if(!IdMsg) IdMsg = get_user_msgid("SayText");
if(id)
{
if(!is_user_connected(id)) return;
players[0] = id;
pnum = 1;
}
else get_players(players, pnum, "ch");
for(new i; i < pnum; i++)
{
message_begin(MSG_ONE, IdMsg, .player = players[i]);
write_byte(players[i]);
write_string(szMsg);
message_end();
}
}