PHP Code:
#include <sdktools>
public Plugin:myinfo =
{
name = "Timeleft Round End",
author = "AlmazON",
description = "Окончание раунда по истечении времени карты",
version = "2.0.0",
url = "http://www.hlmod.ru"
}
new Float:fFE, Float:fTL, Float:fWP, Handle:hSRT, Handle:hTEG, iEE;
public OnPluginStart()
{
decl String:f[9], Handle:h;
if((h=FindConVar("mp_timelimit")) == INVALID_HANDLE) h = CreateConVar("mp_timelimit", "0", "Game time per map in minutes.\n0 - off.",_, true, 0.0);
fTL = GetConVarFloat(h)*60.0+4.5;
HookConVarChange(h, TL);
HookConVarChange(h=CreateConVar("mp_forced_nextlevel_delay", "1.5", "Delay forced end of the map.",_, true, 0.0), FE);
fFE = GetConVarFloat(h);
StartPrepSDKCall(SDKCall_GameRules);
PrepSDKCall_SetFromConf(GetGameFolderName(f, 9) ?
strcmp(f,"csgo") ==0 ? LoadGameConfigFile("sm-cstrike.games/game.csgo"):
strcmp(f,"cstrike") ==0 ? LoadGameConfigFile(FileExists("addons/sourcemod/gamedata/sm-cstrike.games.txt") ? "sm-cstrike.games":"sm-cstrike.games/game.css"):
strcmp(f,"tf") ==0 ? LoadGameConfigFile("sm-tf2.games"):
INVALID_HANDLE:INVALID_HANDLE, SDKConf_Signature, "TerminateRound");
PrepSDKCall_AddParameter(SDKType_Float, SDKPass_Plain);
PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Plain);
if((hSRT=EndPrepSDKCall()) != INVALID_HANDLE)
{
if((h=FindConVar("mp_chattime")) == INVALID_HANDLE && (h=FindConVar("mp_win_panel_display_time")) == INVALID_HANDLE)
h = CreateConVar("mp_win_panel_display_time", "10", "Time display panel the winner of match.",_, true, 0.0);
fWP = GetConVarFloat(h);
HookConVarChange(h, WP);
}else LogError("The plugin works in forced mode (unable to find \"TerminateRound\" signature).");
CloseHandle(h);
}
public OnConfigsExecuted()
{
decl String:n[20], m, i;
m = GetEntityCount();
for(i=MaxClients+1; i<=m; i++)
{
if(IsValidEdict(i) && GetEdictClassname(i, n, 20))
{
if(strcmp(n, "func_bomb_target") == 0 || strcmp(n, "func_hostage_rescue") == 0) break;
else if(strcmp(n, "game_end") == 0)
{
iEE = i;
for(i++; i<=m; i++)
if(IsValidEdict(i) && GetEdictClassname(i, n, 20) && (strcmp(n, "func_bomb_target") == 0 || strcmp(n, "func_hostage_rescue") == 0)) break;
break;
}
}
}if(i > m)
{
if(iEE == 0) iEE = 1;
if(fTL > 4.5) hTEG = CreateTimer(fTL, EG);
}
}
public OnMapEnd()
{
iEE = 0;
if(hTEG != INVALID_HANDLE)
{
KillTimer(hTEG);
hTEG = INVALID_HANDLE;
}
}
public FE(Handle:c, String:o[], String:n[]) fFE = GetConVarFloat(c);
public TL(Handle:c, const String:o[], String:n[])
{
if(hTEG != INVALID_HANDLE) KillTimer(hTEG);
if((fTL=GetConVarFloat(c)*60.0+4.5) > 4.5 && iEE)
{
decl m;
hTEG = CreateTimer(o[0] != '0' && GetMapTimeLeft(m) ? 0<m ? float(m+1):0.0:fTL, EG);
}else hTEG = INVALID_HANDLE;
}
public WP(Handle:c, String:o[], String:n[]) fWP = GetConVarFloat(c);
public Action:EG(Handle:t)
{
hTEG = INVALID_HANDLE;
decl m;
if(GetMapTimeLeft(m) && m > 1) hTEG = CreateTimer(m == 0 ? 1.0:float(m+2), EG);
else
{
for(m=1; m<=MaxClients; m++) if(IsClientInGame(m) && GetClientTeam(m) > 1) break;
if(m > MaxClients) GMF();
else if(hSRT != INVALID_HANDLE)
{
CreateTimer(fFE+fWP, EM, _, TIMER_FLAG_NO_MAPCHANGE);
SDKCall(hSRT, fWP, 15);
}else GEM();
}return Plugin_Stop;
}
public Action:EM(Handle:t)
{
GEM();
return Plugin_Stop;
}
public Action:MF(Handle:t)
{
GMF();
return Plugin_Stop;
}
GEM()
{
CreateTimer(fFE+fWP, MF, _, TIMER_FLAG_NO_MAPCHANGE);
if(iEE > 1 || (iEE=CreateEntityByName("game_end")) != -1) AcceptEntityInput(iEE, "EndGame");
else for(iEE=1; iEE<=MaxClients; iEE++) if(IsClientInGame(iEE) && IsPlayerAlive(iEE)) ForcePlayerSuicide(iEE);
}
GMF()
{
decl String:m[64];
if(GetNextMap(m, 64)) ForceChangeLevel(m, "Timeleft Round End");
}