Код:
#include <amxmodx>
#include <hamsandwich>
#include <cstrike>
#include <fakemeta_util>
#include <dhudmessage>
#if AMXX_VERSION_NUM < 183
#include <colorchat>
#endif
#define VERSION "3.0"
// #define DBG // Дебаг сообщение в plugin_end
#define AUTORR // Включить или выключить автоматические рестарты карты [По дефолту включены]
#define AUTORR_ROUNDS 40 // Количество раундов, после которых последует рестарт карты
new g_iMaxPlayers;
new g_szCurrentMap[32];
new pcv_time;
new pcv_map;
new pcv_lastround;
new pcv_mp_timelimit;
new pcv_mp_buytime;
new bool:g_bNightMode;
new bool:g_bNeedChange;
#if defined AUTORR
new bool:isFirstRound = true;
new g_roundCount;
#endif
new g_iOldTimelimit, g_iOldBuytime;
new bool:iSpawn[33] = false, bool:iRespawn[33] = false;
new szParse[4][3];
public plugin_init()
{
register_plugin("Map on Time", VERSION, "Flash | neygomon");
register_event("HLTV", "EventRoundStart", "a", "1=0", "2=0");
RegisterHam(Ham_Spawn,"player","fw_PlayerSpawn_Post",1);
#if defined AUTORR
register_event("TextMsg","eventRoundRestart","a","2&#Game_w");
register_event("TextMsg","eventCommencingRestart","a","2&#Game_C");
#endif
register_event("DeathMsg", "DeathMessg", "a");
// RTV Hook
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");
register_clcmd("joinclass", "Spawn");
register_clcmd("say /csdm", "CheckMode");
// Cvars
pcv_time = register_cvar("mot_time", "21:00 08:00");
pcv_map = register_cvar("mot_map", "de_dust2_2x2");
pcv_lastround = register_cvar("mot_lastround", "1");
pcv_mp_timelimit = get_cvar_pointer("mp_timelimit");
pcv_mp_buytime = get_cvar_pointer("mp_buytime");
g_iMaxPlayers = get_maxplayers();
get_mapname(g_szCurrentMap, 31);
TaskCheckTime();
set_task(2.0, "CheckAndRemoveBomb");
}
public CheckMode(id)
{
if(g_bNightMode)
client_print(id, print_chat, "CSDM мод работает с 21:00 до 9:00 по мск");
else
client_print(id, print_chat, "CSDM мод работает с 21:00 до 9:00 по мск");
}
public client_authorized(id)
{
if(g_bNightMode)
remove_user_flags(id, ADMIN_MAP|ADMIN_VOTE);
}
public DeathMessg()
{
if(g_bNightMode)
{
iRespawn[read_data(2)] = true;
set_task(1.0, "fw_PlayerSpawn", read_data(2));
}
}
public Spawn(id)
{
if(g_bNightMode)
{
iSpawn[id] = true;
set_task(2.0, "fw_PlayerSpawn", id);
}
}
public fw_PlayerSpawn_Post(id)
{
if(g_bNightMode)
{
cs_set_user_money(id, 16000);
set_pev(id, pev_takedamage, DAMAGE_NO);
set_task(2.0, "OffProtection", id);
}
}
public OffProtection(id)
set_pev(id, pev_takedamage, DAMAGE_AIM);
public fw_PlayerSpawn(id)
{
if(is_user_alive(id)) return;
switch(get_user_team(id))
{
case 1, 2:
{
if(iRespawn[id])
ExecuteHamB(Ham_CS_RoundRespawn, id);
else if(iSpawn[id])
ExecuteHamB(Ham_Spawn, id);
iRespawn[id] = iSpawn[id] = false;
}
}
}
public TaskCheckTime()
{
new iHour, iMin;
time(iHour, iMin);
new iCurTime = iHour * 60 * 60 + iMin * 60;
new szTime[12];
get_pcvar_string(pcv_time, szTime, 11);
replace_all(szTime, 11, ":", " ");
if(parse(szTime, szParse[0], 2, szParse[1], 2, szParse[2], 2, szParse[3], 2) != 4)
{
set_fail_state("Invalid time in cvar");
return;
}
new iFrom = str_to_num(szParse[0]) * 60 * 60 + str_to_num(szParse[1]) * 60;
new iTo = str_to_num(szParse[2]) * 60 * 60 + str_to_num(szParse[3]) * 60;
if(iFrom < iCurTime || iCurTime < iTo)
{
log_to_file("nightmode.log", "From: %d | CurTime: %d | To: %d", iFrom, iCurTime, iTo);
new szNightMap[32];
get_pcvar_string(pcv_map, szNightMap, 31);
if(!equal(g_szCurrentMap, szNightMap))
{
if(get_pcvar_num(pcv_lastround))
{
set_hudmessage(127, 127, 127, 0.02, 0.21, 0, 5.0, 15.04, 0.0, 0.5, 3);
show_hudmessage(0, "Последний раунд");
g_bNeedChange = true;
}
else
server_cmd("changelevel %s", szNightMap);
return;
}
if(!g_bNightMode)
{
g_iOldTimelimit = get_pcvar_num(pcv_mp_timelimit);
g_iOldBuytime = get_pcvar_num(pcv_mp_buytime);
set_pcvar_num(pcv_mp_timelimit, 0);
set_pcvar_num(pcv_mp_buytime, 2);
RemovePlayersFlags();
g_bNightMode = true;
}
}
else if(g_bNightMode)
{
g_bNightMode = false;
set_pcvar_num(pcv_mp_timelimit, 5 + floatround(get_gametime()) / 60);
}
return;
}
public RtvHook(id)
{
if(g_bNightMode)
{
client_print_color(id, 0, "^4[CSDM by ^4] ^3* RTV не работает в ^"CSDM режиме^"!");
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
#if defined AUTORR
public eventCommencingRestart()
isFirstRound = true;
public eventRoundRestart()
g_roundCount = 0;
#endif
public EventRoundStart()
{
if(g_bNeedChange)
{
message_begin(MSG_ALL, SVC_INTERMISSION);
message_end();
set_task(3.0, "DelayChangeMap");
}
if(g_bNightMode)
{
#if defined AUTORR
if(isFirstRound)
{
isFirstRound = false;
g_roundCount = 0;
}
g_roundCount++;
new maxrounds = AUTORR_ROUNDS;
new round;
round = maxrounds - g_roundCount;
if(round > 0 && g_roundCount != 0)
client_print_color(0, 0, "^4[CSDM by ^4] ^4До авторестарта карты осталось^3 %d ^4раундов ^1[^4Тек. раунд:^3 %d ^1| ^4Всего:^3 %d^1]", round, g_roundCount, maxrounds);
else if(g_roundCount >= maxrounds)
server_cmd("restart");
#endif
set_task(5.0, "RemoveBombTarget");
hud_message();
}
TaskCheckTime();
}
public DelayChangeMap()
{
new szNightMap[32]; get_pcvar_string(pcv_map, szNightMap, 31);
server_cmd("changelevel %s", szNightMap);
}
public plugin_end()
{
if(g_iOldTimelimit || g_iOldBuytime)
{
set_pcvar_num(pcv_mp_timelimit, g_iOldTimelimit);
set_pcvar_num(pcv_mp_buytime, g_iOldBuytime);
#if defined DBG
log_to_file("nightmode_debug.log", "[plugin_end] g_iOldTimelimit: %d | timelimit: %d", g_iOldTimelimit, get_pcvar_num(pcv_mp_timelimit));
#endif
}
}
RemovePlayersFlags()
{
for(new i = 1; i <= g_iMaxPlayers; i++)
{
if(is_user_connected(i))
remove_user_flags(i, ADMIN_MAP|ADMIN_VOTE);
}
}
public CheckAndRemoveBomb()
{
if(!g_bNightMode) return;
new entList[][] = { "func_bomb_target", "info_bomb_target" };
for(new i; i < sizeof entList; ++i)
{
new ent
while((ent = fm_find_ent_by_class(ent,entList[i])))
{
if(fm_is_valid_ent(ent))
fm_remove_entity(ent)
}
}
}
stock hud_message()
{
set_dhudmessage(random_num(0, 255), random_num(0, 255), random_num(0, 255), -1.0, 0.2, 0, 1.5, 3.0, 0.0, 0.0, false);
show_dhudmessage(0, "C %d:%d до %d:%d CSDM режим!^n[By ",szParse[0], szParse[1], szParse[2], szParse[3]);
}