plugin for jump king
This commit is contained in:
parent
e2e0a0829b
commit
b18d551cf1
679
ze_jump_king/jump_king_plus.sp
Normal file
679
ze_jump_king/jump_king_plus.sp
Normal file
@ -0,0 +1,679 @@
|
||||
#pragma semicolon 1
|
||||
#pragma newdecls required
|
||||
|
||||
#include <sdkhooks>
|
||||
#include <clientprefs>
|
||||
#include <multicolors>
|
||||
#include <sdktools>
|
||||
|
||||
#define DATA_CONFIG_PATH "addons/sourcemod/configs/jump_king_records.cfg"
|
||||
#define SKIN_FOR_TOP "models/microrost/player_solaire1.mdl"
|
||||
#define CROWN "models/microrost/jumpking/star.mdl"
|
||||
|
||||
#define Entity_GetTargetName(%1,%2,%3) GetEntPropString(%1, Prop_Data, "m_iName", %2, %3)
|
||||
|
||||
#define RECORD_LIMIT 20
|
||||
#define MAX_TOP_PLAYERS 4
|
||||
#define MAX_DISPLAY 4
|
||||
|
||||
public Plugin myinfo =
|
||||
{
|
||||
name = "[MAP] Jump King Plus",
|
||||
author = "Kotya",
|
||||
version = "0.1.0"
|
||||
};
|
||||
|
||||
char g_szString[256];
|
||||
|
||||
float g_fRoundStart;
|
||||
|
||||
enum struct class_record
|
||||
{
|
||||
char szName[128];
|
||||
char szSteam[32];
|
||||
|
||||
float fTime;
|
||||
}
|
||||
|
||||
enum struct class_cookie
|
||||
{
|
||||
Cookie PassMain;
|
||||
}
|
||||
|
||||
enum struct class_player
|
||||
{
|
||||
int iDisplayID;
|
||||
bool bPassMain;
|
||||
bool bTop;
|
||||
}
|
||||
|
||||
class_cookie g_Cookie;
|
||||
class_player g_PlayerData[MAXPLAYERS+1];
|
||||
|
||||
ArrayList g_alRecords;
|
||||
ArrayList g_alSteamAcces;
|
||||
|
||||
class_record g_rLastRun;
|
||||
|
||||
Handle g_hTimerSkin;
|
||||
|
||||
float g_fRecord;
|
||||
|
||||
bool g_bAddRecord;
|
||||
|
||||
bool g_bDisplay;
|
||||
bool g_bRecord;
|
||||
bool g_bEnding;
|
||||
|
||||
public void OnPluginStart()
|
||||
{
|
||||
g_hTimerSkin = INVALID_HANDLE;
|
||||
g_alSteamAcces = new ArrayList(ByteCountToCells(32));
|
||||
g_alRecords = new ArrayList(sizeof(class_record));
|
||||
|
||||
// Cookie
|
||||
g_Cookie.PassMain = RegClientCookie("jump_king_plus_passmain", "Jump King beat map", CookieAccess_Private);
|
||||
|
||||
// Commands
|
||||
RegAdminCmd("sm_af_remove", Command_Remove, ADMFLAG_BAN);
|
||||
|
||||
// Hooks
|
||||
HookEvent("round_freeze_end", Event_FreezeEnd);
|
||||
HookEvent("round_end", Event_RoundEnd);
|
||||
HookEvent("round_start", Event_RoundStart);
|
||||
|
||||
for (int iClient = 1; iClient <= MaxClients; iClient++)
|
||||
{
|
||||
if (AreClientCookiesCached(iClient))
|
||||
{
|
||||
OnClientCookiesCached(iClient);
|
||||
}
|
||||
else
|
||||
{
|
||||
OnClientDisconnect(iClient);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void OnClientCookiesCached(int iClient)
|
||||
{
|
||||
if (IsFakeClient(iClient))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
GetClientCookie(iClient, g_Cookie.PassMain, g_szString, sizeof(g_szString));
|
||||
g_PlayerData[iClient].bPassMain = false;
|
||||
if (g_szString[0] != '\0')
|
||||
{
|
||||
g_PlayerData[iClient].bPassMain = view_as<bool>(StringToInt(g_szString));
|
||||
}
|
||||
|
||||
g_PlayerData[iClient].bTop = false;
|
||||
if (g_alSteamAcces.Length > 0)
|
||||
{
|
||||
GetClientAuthId(iClient, AuthId_Steam2, g_szString, sizeof(g_szString));
|
||||
|
||||
int ID = g_alSteamAcces.FindString(g_szString);
|
||||
if (ID != -1)
|
||||
{
|
||||
g_PlayerData[iClient].bTop = true;
|
||||
|
||||
g_alSteamAcces.Erase(ID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void OnClientDisconnect(int iClient)
|
||||
{
|
||||
g_PlayerData[iClient].iDisplayID = 0;
|
||||
g_PlayerData[iClient].bPassMain = false;
|
||||
g_PlayerData[iClient].bTop = false;
|
||||
}
|
||||
|
||||
public void Event_FreezeEnd(Event hEvent, const char[] sEvName, bool bDontBroadcast)
|
||||
{
|
||||
if (g_alRecords.Length > 0)
|
||||
{
|
||||
class_record Record;
|
||||
g_alRecords.GetArray(0, Record, sizeof(Record));
|
||||
g_fRecord = Record.fTime;
|
||||
|
||||
int iM = RoundToFloor(g_fRecord / 60);
|
||||
int iS = RoundToFloor(g_fRecord - (iM * 60));
|
||||
char szD[4];
|
||||
|
||||
FormatEx(g_szString, sizeof(g_szString), "%.3f", (g_fRecord - RoundToFloor(g_fRecord)));
|
||||
strcopy(szD, sizeof(szD), g_szString[2]);
|
||||
|
||||
CPrintToChatAll(" {default}[{red}MAP{default}] {green}%s{default} {{purple}%s{default}} map record: {orange}%i:%i:%s", Record.szName, Record.szSteam, iM, iS, szD);
|
||||
}
|
||||
}
|
||||
|
||||
public void Event_RoundEnd(Event hEvent, const char[] sEvName, bool bDontBroadcast)
|
||||
{
|
||||
if (g_bEnding)
|
||||
{
|
||||
for (int iClient = 1; iClient <= MaxClients; iClient++)
|
||||
{
|
||||
if (!IsClientInGame(iClient) ||
|
||||
IsFakeClient(iClient) ||
|
||||
!IsPlayerAlive(iClient) ||
|
||||
GetClientTeam(iClient) != 3)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
g_PlayerData[iClient].bPassMain = true;
|
||||
SetClientCookie(iClient, g_Cookie.PassMain, "1");
|
||||
}
|
||||
}
|
||||
|
||||
Reset();
|
||||
}
|
||||
|
||||
public void Event_RoundStart(Event hEvent, const char[] sEvName, bool bDontBroadcast)
|
||||
{
|
||||
if (g_bAddRecord)
|
||||
{
|
||||
TryInsert(g_rLastRun);
|
||||
g_bAddRecord = false;
|
||||
}
|
||||
|
||||
if (g_alRecords.Length > 0)
|
||||
{
|
||||
g_alSteamAcces.Clear();
|
||||
|
||||
class_record Record;
|
||||
for (int i = 0; i < g_alRecords.Length; i++)
|
||||
{
|
||||
if (i >= MAX_TOP_PLAYERS)
|
||||
{
|
||||
break;
|
||||
}
|
||||
g_alRecords.GetArray(i, Record, sizeof(Record));
|
||||
g_alSteamAcces.PushString(Record.szSteam);
|
||||
}
|
||||
|
||||
for (int iClient = 1, ID; iClient <= MaxClients; iClient++)
|
||||
{
|
||||
if (!IsClientInGame(iClient) ||
|
||||
IsFakeClient(iClient))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
g_PlayerData[iClient].iDisplayID = 0;
|
||||
g_PlayerData[iClient].bTop = false;
|
||||
|
||||
if (g_alSteamAcces.Length > 0)
|
||||
{
|
||||
GetClientAuthId(iClient, AuthId_Steam2, g_szString, sizeof(g_szString));
|
||||
|
||||
ID = g_alSteamAcces.FindString(g_szString);
|
||||
if (ID != -1)
|
||||
{
|
||||
g_PlayerData[iClient].bTop = true;
|
||||
|
||||
g_alSteamAcces.Erase(ID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (g_hTimerSkin != INVALID_HANDLE)
|
||||
{
|
||||
KillTimer(g_hTimerSkin);
|
||||
}
|
||||
g_hTimerSkin = CreateTimer(34.0, Timer_SetSkin);
|
||||
}
|
||||
|
||||
Reset();
|
||||
}
|
||||
|
||||
public Action Timer_SetSkin(Handle hTimer)
|
||||
{
|
||||
g_hTimerSkin = INVALID_HANDLE;
|
||||
|
||||
for (int iClient = 1; iClient <= MaxClients; iClient++)
|
||||
{
|
||||
if (!IsClientInGame(iClient) ||
|
||||
IsFakeClient(iClient) ||
|
||||
!IsPlayerAlive(iClient) ||
|
||||
GetClientTeam(iClient) != 3)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (g_PlayerData[iClient].bTop)
|
||||
{
|
||||
SetEntityModel(iClient, SKIN_FOR_TOP);
|
||||
}
|
||||
|
||||
if (g_PlayerData[iClient].bPassMain)
|
||||
{
|
||||
SetCrown(iClient);
|
||||
}
|
||||
}
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
public void SetCrown(int iClient)
|
||||
{
|
||||
float vecPos[3];
|
||||
int iEntity = CreateEntityByName("prop_dynamic");
|
||||
if (iEntity)
|
||||
{
|
||||
DispatchKeyValue(iEntity, "model", CROWN);
|
||||
// DispatchKeyValue(iEntity, "rendermode", "1");
|
||||
// DispatchKeyValue(iEntity, "renderamt", "192");
|
||||
DispatchKeyValue(iEntity, "disableshadows", "1");
|
||||
DispatchKeyValue(iEntity, "disableflashlight", "1");
|
||||
if (DispatchSpawn(iEntity))
|
||||
{
|
||||
|
||||
GetClientAbsOrigin(iClient, vecPos);
|
||||
vecPos[2] += 73.0;
|
||||
|
||||
TeleportEntity(iEntity, vecPos);
|
||||
|
||||
|
||||
SetVariantString("!activator");
|
||||
AcceptEntityInput(iEntity, "SetParent", iClient, iEntity, 0);
|
||||
}
|
||||
}
|
||||
int iEntity1 = CreateEntityByName("env_spritetrail");
|
||||
if (iEntity1)
|
||||
{
|
||||
DispatchKeyValue(iEntity1, "rendermode", "5");
|
||||
DispatchKeyValue(iEntity1, "spritename", "sprites/physbeam.vmt");
|
||||
DispatchKeyValue(iEntity1, "startwidth", "16");
|
||||
DispatchKeyValue(iEntity1, "rendercolor", "255 223 0");
|
||||
DispatchKeyValue(iEntity1, "lifetime", "40");
|
||||
if (DispatchSpawn(iEntity1))
|
||||
{
|
||||
GetClientAbsOrigin(iClient, vecPos);
|
||||
vecPos[2] += 24.0;
|
||||
|
||||
TeleportEntity(iEntity1, vecPos);
|
||||
|
||||
SetVariantString("!activator");
|
||||
AcceptEntityInput(iEntity1, "SetParent", iClient, iEntity1, 0);
|
||||
|
||||
SetVariantString("OnUser1 !self,SetScale,1.0,2.0,1");
|
||||
AcceptEntityInput(iEntity1, "AddOutPut");
|
||||
AcceptEntityInput(iEntity1, "FireUser1");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Reset()
|
||||
{
|
||||
g_bDisplay = false;
|
||||
g_bEnding = false;
|
||||
}
|
||||
|
||||
public void OnMapEnd()
|
||||
{
|
||||
Save_Config();
|
||||
|
||||
if (g_hTimerSkin != INVALID_HANDLE)
|
||||
{
|
||||
KillTimer(g_hTimerSkin);
|
||||
}
|
||||
g_hTimerSkin = INVALID_HANDLE;
|
||||
}
|
||||
|
||||
public void OnMapStart()
|
||||
{
|
||||
GetCurrentMap(g_szString, sizeof(g_szString));
|
||||
if (StrContains(g_szString, "ze_jump_king") == -1)
|
||||
{
|
||||
GetPluginFilename(INVALID_HANDLE, g_szString, sizeof(g_szString));
|
||||
return;
|
||||
}
|
||||
|
||||
g_alRecords.Clear();
|
||||
|
||||
KeyValues kv = new KeyValues("");
|
||||
|
||||
if (FileExists(DATA_CONFIG_PATH) &&
|
||||
kv.ImportFromFile(DATA_CONFIG_PATH) &&
|
||||
kv.GotoFirstSubKey()) // Has Config
|
||||
{
|
||||
int iCount = 0;
|
||||
class_record Record;
|
||||
|
||||
do
|
||||
{
|
||||
kv.GetString("name", Record.szName, sizeof(Record.szName));
|
||||
kv.GetString("steam", Record.szSteam, sizeof(Record.szSteam));
|
||||
Record.fTime = kv.GetFloat("time", 5000.000);
|
||||
|
||||
g_alRecords.PushArray(Record, sizeof(Record));
|
||||
iCount++;
|
||||
}
|
||||
while (kv.GotoNextKey() &&
|
||||
RECORD_LIMIT > iCount);
|
||||
}
|
||||
|
||||
delete kv;
|
||||
|
||||
PrecacheModel(SKIN_FOR_TOP);
|
||||
PrecacheModel(CROWN);
|
||||
}
|
||||
|
||||
|
||||
public void TryInsert(class_record newRecord)
|
||||
{
|
||||
bool bSave = false;
|
||||
int Index = -1;
|
||||
class_record Record;
|
||||
|
||||
for (int i = 0; i < g_alRecords.Length; i++)
|
||||
{
|
||||
g_alRecords.GetArray(i, Record, sizeof(Record));
|
||||
if (!strcmp(newRecord.szSteam, Record.szSteam))
|
||||
{
|
||||
if (Record.fTime > newRecord.fTime)
|
||||
{
|
||||
g_alRecords.Erase(i);
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < g_alRecords.Length; i++)
|
||||
{
|
||||
g_alRecords.GetArray(i, Record, sizeof(Record));
|
||||
if (Record.fTime > newRecord.fTime)
|
||||
{
|
||||
Index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (g_alRecords.Length < RECORD_LIMIT)
|
||||
{
|
||||
bSave = true;
|
||||
g_alRecords.PushArray(newRecord, sizeof(newRecord));
|
||||
}
|
||||
|
||||
if (Index != -1)
|
||||
{
|
||||
for (int i = g_alRecords.Length - 2; i >= Index; i--)
|
||||
{
|
||||
g_alRecords.GetArray(i, Record, sizeof(Record));
|
||||
g_alRecords.SetArray(i + 1, Record, sizeof(Record));
|
||||
}
|
||||
g_alRecords.SetArray(Index, newRecord, sizeof(newRecord));
|
||||
}
|
||||
|
||||
if (bSave)
|
||||
{
|
||||
Save_Config();
|
||||
}
|
||||
}
|
||||
|
||||
public void Save_Config()
|
||||
{
|
||||
KeyValues kv = new KeyValues("Data");
|
||||
class_record Record;
|
||||
|
||||
for (int i = 0; i < g_alRecords.Length; i++)
|
||||
{
|
||||
FormatEx(g_szString, sizeof(g_szString), "%i", i);
|
||||
kv.JumpToKey(g_szString, true);
|
||||
|
||||
g_alRecords.GetArray(i, Record, sizeof(Record));
|
||||
|
||||
kv.SetString("name", Record.szName);
|
||||
kv.SetString("steam", Record.szSteam);
|
||||
|
||||
FormatEx(g_szString, sizeof(g_szString), "%.3f", Record.fTime);
|
||||
kv.SetString("time", g_szString);
|
||||
|
||||
kv.GoBack();
|
||||
}
|
||||
|
||||
kv.ExportToFile(DATA_CONFIG_PATH);
|
||||
delete kv;
|
||||
}
|
||||
|
||||
public void OnGameFrame()
|
||||
{
|
||||
if (!g_bDisplay)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
float fTottal;
|
||||
|
||||
if (g_bEnding)
|
||||
{
|
||||
fTottal = g_rLastRun.fTime;
|
||||
}
|
||||
else
|
||||
{
|
||||
fTottal = GetGameTime() - g_fRoundStart;
|
||||
}
|
||||
|
||||
g_bRecord = (fTottal < g_fRecord);
|
||||
|
||||
int iM = RoundToFloor(fTottal / 60);
|
||||
int iS = RoundToFloor(fTottal - (iM * 60));
|
||||
|
||||
char szD[4];
|
||||
FormatEx(g_szString, sizeof(g_szString), "%.3f", (fTottal - RoundToFloor(fTottal)));
|
||||
strcopy(szD, sizeof(szD), g_szString[2]);
|
||||
|
||||
|
||||
int iColor[3] = {255, 255, 255};
|
||||
|
||||
if (g_alRecords.Length > 0)
|
||||
{
|
||||
if (g_bRecord)
|
||||
{
|
||||
FormatEx(g_szString, sizeof(g_szString), "%i:%i:%s -%.3f", iM, iS, szD, (g_fRecord - fTottal));
|
||||
iColor = {255, 215, 0};
|
||||
}
|
||||
else
|
||||
{
|
||||
FormatEx(g_szString, sizeof(g_szString), "%i:%i:%s +%.3f", iM, iS, szD, (fTottal - g_fRecord));
|
||||
|
||||
if (fTottal - g_fRecord < 20.0)
|
||||
{
|
||||
iColor = {0, 255, 0};
|
||||
}
|
||||
else
|
||||
{
|
||||
iColor = {255, 0, 0};
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
FormatEx(g_szString, sizeof(g_szString), "%i:%i:%s", iM, iS, szD);
|
||||
iColor = {255, 215, 0};
|
||||
}
|
||||
|
||||
SetHudTextParams(-1.0, 0.15, 1.5, iColor[0], iColor[1], iColor[2], 0, 0, 0.25, 0.0, 0.0);
|
||||
|
||||
for (int iClient = 1; iClient <= MaxClients; iClient++)
|
||||
{
|
||||
if (IsClientInGame(iClient))
|
||||
{
|
||||
ShowHudText(iClient, 1, g_szString);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Action Command_Remove(int iClient, int iArgs)
|
||||
{
|
||||
// Hook_EndTimer("123", 0, iClient, 0.00);
|
||||
|
||||
// return Plugin_Handled;
|
||||
GetCmdArgString(g_szString, sizeof(g_szString));
|
||||
class_record Record;
|
||||
|
||||
for (int i = 0; i < g_alRecords.Length; i++)
|
||||
{
|
||||
g_alRecords.GetArray(i, Record, sizeof(Record));
|
||||
if (!strcmp(Record.szSteam, g_szString))
|
||||
{
|
||||
g_alRecords.Erase(i);
|
||||
Save_Config();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
public void OnEntityCreated(int iEntity, const char[] szClassName)
|
||||
{
|
||||
if (!strcmp(szClassName, "trigger_once") ||
|
||||
!strcmp(szClassName, "trigger_multiple") ||
|
||||
!strcmp(szClassName, "logic_relay"))
|
||||
{
|
||||
SDKHook(iEntity, SDKHook_SpawnPost, Hook_SpawnPost);
|
||||
}
|
||||
}
|
||||
public void Hook_SpawnPost(int iEntity)
|
||||
{
|
||||
SDKUnhook(iEntity, SDKHook_SpawnPost, Hook_SpawnPost);
|
||||
|
||||
if (!IsValidEntity(iEntity))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Entity_GetTargetName(iEntity, g_szString, sizeof(g_szString));
|
||||
|
||||
if (g_szString[0] == '\0')
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!strcmp(g_szString, "speedrun_timer_start"))
|
||||
{
|
||||
HookSingleEntityOutput(iEntity, "OnStartTouch", Hook_StartTimer, true);
|
||||
}
|
||||
else if (!strcmp(g_szString, "speedrun_stop_timer"))
|
||||
{
|
||||
HookSingleEntityOutput(iEntity, "OnTrigger", Hook_EndTimer, true);
|
||||
}
|
||||
else if (!strcmp(g_szString, "nigger"))
|
||||
{
|
||||
HookSingleEntityOutput(iEntity, "OnStartTouch", Hook_ShowTop);
|
||||
}
|
||||
}
|
||||
|
||||
public void Hook_ShowTop(const char[] szOutput, int iCaller, int iClient, float fDelay)
|
||||
{
|
||||
SetHudTextParams(-1.0, 0.6, 4.0, 0, 255, 255, 0, 0, 0.25, 0.0, 0.0);
|
||||
if (g_alRecords.Length < 1)
|
||||
{
|
||||
ShowHudText(iClient, 1, "No records");
|
||||
return;
|
||||
}
|
||||
|
||||
class_record Record;
|
||||
char szString[512];
|
||||
|
||||
int iM;
|
||||
int iS;
|
||||
char szD[4];
|
||||
|
||||
int iStart = g_PlayerData[iClient].iDisplayID * MAX_DISPLAY;
|
||||
int iEnd = iStart + MAX_DISPLAY;
|
||||
if (iEnd > g_alRecords.Length)
|
||||
{
|
||||
iEnd = g_alRecords.Length;
|
||||
}
|
||||
|
||||
bool bFind;
|
||||
|
||||
for (int i = iStart; i < iEnd; i++)
|
||||
{
|
||||
g_alRecords.GetArray(i, Record, sizeof(Record));
|
||||
|
||||
GetClientAuthId(iClient, AuthId_Steam2, g_szString, sizeof(g_szString));
|
||||
bFind = (!strcmp(g_szString, Record.szSteam));
|
||||
|
||||
iM = RoundToFloor(Record.fTime / 60);
|
||||
iS = RoundToFloor(Record.fTime - (iM * 60));
|
||||
FormatEx(g_szString, sizeof(g_szString), "%.3f", (Record.fTime - RoundToFloor(Record.fTime)));
|
||||
strcopy(szD, sizeof(szD), g_szString[2]);
|
||||
|
||||
if (bFind)
|
||||
{
|
||||
Format(szString, sizeof(szString), "%s>>> %i. %s {%s} - %im %is %sms <<<", szString, i+1, Record.szName, Record.szSteam[6], iM, iS, szD);
|
||||
}
|
||||
else
|
||||
{
|
||||
Format(szString, sizeof(szString), "%s%i. %s {%s} - %im %is %sms", szString, i+1, Record.szName, Record.szSteam[6], iM, iS, szD);
|
||||
}
|
||||
|
||||
if (i + 1 < iEnd)
|
||||
{
|
||||
StrCat(szString, sizeof(szString), "\n");
|
||||
}
|
||||
}
|
||||
|
||||
ShowHudText(iClient, 1, szString);
|
||||
|
||||
g_PlayerData[iClient].iDisplayID++;
|
||||
if (g_PlayerData[iClient].iDisplayID >= RoundToCeil(float(g_alRecords.Length) / MAX_TOP_PLAYERS))
|
||||
{
|
||||
g_PlayerData[iClient].iDisplayID = 0;
|
||||
}
|
||||
}
|
||||
|
||||
public void Hook_StartTimer(const char[] szOutput, int iCaller, int iActivator, float fDelay)
|
||||
{
|
||||
g_fRoundStart = GetGameTime();
|
||||
g_bDisplay = true;
|
||||
}
|
||||
|
||||
public void Hook_EndTimer(const char[] szOutput, int iCaller, int iClient, float fDelay)
|
||||
{
|
||||
g_bEnding = true;
|
||||
g_bAddRecord = true;
|
||||
|
||||
char szSteam[32];
|
||||
GetClientAuthId(iClient, AuthId_Steam2, szSteam, sizeof(szSteam));
|
||||
|
||||
FormatEx(g_rLastRun.szName, sizeof(g_rLastRun.szName), "%N", iClient);
|
||||
FormatEx(g_rLastRun.szSteam, sizeof(g_rLastRun.szSteam), szSteam);
|
||||
g_rLastRun.fTime = GetGameTime() - g_fRoundStart;
|
||||
|
||||
g_bRecord = (g_rLastRun.fTime < g_fRecord);
|
||||
|
||||
int iM = RoundToFloor(g_rLastRun.fTime / 60);
|
||||
int iS = RoundToFloor(g_rLastRun.fTime - (iM * 60));
|
||||
char szD[4];
|
||||
FormatEx(g_szString, sizeof(g_szString), "%.3f", (g_rLastRun.fTime - RoundToFloor(g_rLastRun.fTime)));
|
||||
strcopy(szD, sizeof(szD), g_szString[2]);
|
||||
|
||||
if (g_alRecords.Length > 0)
|
||||
{
|
||||
if (g_bRecord)
|
||||
{
|
||||
FormatEx(g_szString, sizeof(g_szString), " {default}[{red}MAP{default}] {green}%N{default} {{purple}%s{default}} new record map: {orange}%i:%i:%s {green}-%.3f", iClient, szSteam, iM, iS, szD, (g_fRecord - g_rLastRun.fTime));
|
||||
}
|
||||
else
|
||||
{
|
||||
FormatEx(g_szString, sizeof(g_szString), " {default}[{red}MAP{default}] {green}%N{default} {{purple}%s{default}} complete map: %i:%i:%s {red}+%.3f", iClient, szSteam, iM, iS, szD, (g_rLastRun.fTime - g_fRecord));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
FormatEx(g_szString, sizeof(g_szString), " {default}[{red}MAP{default}] {green}%N{default} {{purple}%s{default}} new record map: {orange}%i:%i:%s", iClient, szSteam, iM, iS, szD);
|
||||
}
|
||||
|
||||
CPrintToChatAll(g_szString);
|
||||
}
|
Loading…
Reference in New Issue
Block a user