From 9f3e89514d7a3faaacb065ccaf56a34889faf4a3 Mon Sep 17 00:00:00 2001 From: zaCade Date: Sun, 2 Dec 2018 16:03:11 +0100 Subject: [PATCH] Hlstats: Update server modules. Add a ZE module, and change the ZR one slightly to be more similiar. --- hlstatsx/scripting/hlstatsx_ze.sp | 226 ++++++++++++++++++++++++++++++ hlstatsx/scripting/hlstatsx_zr.sp | 6 +- 2 files changed, 229 insertions(+), 3 deletions(-) create mode 100644 hlstatsx/scripting/hlstatsx_ze.sp diff --git a/hlstatsx/scripting/hlstatsx_ze.sp b/hlstatsx/scripting/hlstatsx_ze.sp new file mode 100644 index 00000000..a14a39ea --- /dev/null +++ b/hlstatsx/scripting/hlstatsx_ze.sp @@ -0,0 +1,226 @@ +#include +#include +#include +#include + +#pragma semicolon 1 +#pragma newdecls required + +/* CONVARS */ +ConVar g_cvarStreakInterval = null; +ConVar g_cvarMinimumStreak = null; +ConVar g_cvarMaximumStreak = null; + +ConVar g_cvarDifficultyHuman = null; +ConVar g_cvarDifficultyZombie = null; +ConVar g_cvarDifficultyDuration = null; + +/* HANDLES */ +Handle g_tMinimalRoundDuration = INVALID_HANDLE; + +/* INTERGERS */ +int g_iKillCount[MAXPLAYERS+1] = 0; + +/* BOOLEANS */ +bool g_bMotherZM[MAXPLAYERS+1] = false; + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public Plugin myinfo = +{ + name = "HLstatsX CE - Zombie Escape", + author = "zaCade", + description = "Create additional actions for the default HLstatsX", + version = "1.0.0" +}; + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void OnPluginStart() +{ + g_cvarStreakInterval = CreateConVar("hlx_ze_killstreaks_interval", "1", "amount of kills required to progress to the next killstreak", 0, true, 1.0); + g_cvarMinimumStreak = CreateConVar("hlx_ze_killstreaks_minimal", "2", "amount of kills required for the lowest killstreak", 0, true, 0.0); + g_cvarMaximumStreak = CreateConVar("hlx_ze_killstreaks_maximal", "12", "amount of kills required for the highest killstreak", 0, true, 0.0); + + g_cvarDifficultyHuman = CreateConVar("hlx_ze_difficulty_human", "0", "the difficulty level of the current map for humans", 0, true, 0.0); + g_cvarDifficultyZombie = CreateConVar("hlx_ze_difficulty_zombie", "0", "the difficulty level of the current map for zombies", 0, true, 0.0); + g_cvarDifficultyDuration = CreateConVar("hlx_ze_difficulty_duration", "60", "the minumum amount of time a round has to last in seconds", 0, true, 0.0, true, 180.0); + + HookEvent("round_start", OnRoundStarting, EventHookMode_Pre); + HookEvent("round_end", OnRoundEnding, EventHookMode_Pre); + HookEvent("player_spawn", OnClientSpawn, EventHookMode_Pre); + HookEvent("player_death", OnClientDeath, EventHookMode_Pre); + + AutoExecConfig(); + GetTeams(); +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void OnMapStart() +{ + GetTeams(); +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void OnMapEnd() +{ + if (g_tMinimalRoundDuration != INVALID_HANDLE && CloseHandle(g_tMinimalRoundDuration)) + g_tMinimalRoundDuration = INVALID_HANDLE; +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void OnRoundStarting(Event hEvent, const char[] sEvent, bool bDontBroadcast) +{ + if (g_tMinimalRoundDuration != INVALID_HANDLE && CloseHandle(g_tMinimalRoundDuration)) + g_tMinimalRoundDuration = INVALID_HANDLE; + + g_tMinimalRoundDuration = CreateTimer(g_cvarDifficultyDuration.FloatValue, OnRoundMinimalDuration); +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public Action OnRoundMinimalDuration(Handle timer) +{ + g_tMinimalRoundDuration = INVALID_HANDLE; +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void ZR_OnClientInfected(int client, int attacker, bool motherInfect, bool respawnOverride, bool respawn) +{ + g_bMotherZM[client] = motherInfect; +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void OnRoundEnding(Event hEvent, const char[] sEvent, bool bDontBroadcast) +{ + bool bAwardHumans = ((g_tMinimalRoundDuration == INVALID_HANDLE) && (hEvent.GetInt("winner") == CS_TEAM_CT)); + bool bAwardZombies = ((g_tMinimalRoundDuration == INVALID_HANDLE) && (hEvent.GetInt("winner") == CS_TEAM_T)); + + for (int client = 1; client <= MaxClients; client++) + { + if (IsValidClient(client)) + { + if (bAwardHumans && ZR_IsClientHuman(client)) + { + char sPlayerEvent[32]; + Format(sPlayerEvent, sizeof(sPlayerEvent), "ze_h_win_%d", g_cvarDifficultyHuman.IntValue); + + LogPlayerEvent(client, "triggered", sPlayerEvent); + } + else if (bAwardZombies && ZR_IsClientZombie(client)) + { + if (g_bMotherZM[client]) + { + char sPlayerEvent[32]; + Format(sPlayerEvent, sizeof(sPlayerEvent), "ze_m_win_%d", g_cvarDifficultyZombie.IntValue); + + LogPlayerEvent(client, "triggered", sPlayerEvent); + } + else + { + char sPlayerEvent[32]; + Format(sPlayerEvent, sizeof(sPlayerEvent), "ze_z_win_%d", g_cvarDifficultyZombie.IntValue); + + LogPlayerEvent(client, "triggered", sPlayerEvent); + } + } + + EndKillStreak(client); + } + } +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void OnClientSpawn(Event hEvent, const char[] sEvent, bool bDontBroadcast) +{ + int client = GetClientOfUserId(hEvent.GetInt("userid")); + + ResetClient(client); +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void OnClientDeath(Event hEvent, const char[] sEvent, bool bDontBroadcast) +{ + int client = GetClientOfUserId(hEvent.GetInt("userid")); + int killer = GetClientOfUserId(hEvent.GetInt("attacker")); + + EndKillStreak(client); + + if (IsValidClient(killer)) + { + g_iKillCount[killer] += 1; + } +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void EndKillStreak(int client) +{ + if (g_iKillCount[client] >= g_cvarMinimumStreak.IntValue) + { + if (g_iKillCount[client] > g_cvarMaximumStreak.IntValue) + g_iKillCount[client] = g_cvarMaximumStreak.IntValue; + + if (ZR_IsClientHuman(client)) + { + char sPlayerEvent[32]; + Format(sPlayerEvent, sizeof(sPlayerEvent), "ze_h_kill_streak_%d", RoundToFloor(float(g_iKillCount[client]) / float(g_cvarStreakInterval.IntValue)) * g_cvarStreakInterval.IntValue); + + LogPlayerEvent(client, "triggered", sPlayerEvent); + } + else if (ZR_IsClientZombie(client)) + { + if (g_bMotherZM[client]) + { + char sPlayerEvent[32]; + Format(sPlayerEvent, sizeof(sPlayerEvent), "ze_m_kill_streak_%d", RoundToFloor(float(g_iKillCount[client]) / float(g_cvarStreakInterval.IntValue)) * g_cvarStreakInterval.IntValue); + + LogPlayerEvent(client, "triggered", sPlayerEvent); + } + else + { + char sPlayerEvent[32]; + Format(sPlayerEvent, sizeof(sPlayerEvent), "ze_z_kill_streak_%d", RoundToFloor(float(g_iKillCount[client]) / float(g_cvarStreakInterval.IntValue)) * g_cvarStreakInterval.IntValue); + + LogPlayerEvent(client, "triggered", sPlayerEvent); + } + } + } + + ResetClient(client); +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +stock void ResetClient(int client) +{ + g_iKillCount[client] = 0; + g_bMotherZM[client] = false; +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +stock bool IsValidClient(int client) +{ + return (client > 0 && client <= MaxClients && IsClientInGame(client) && IsPlayerAlive(client)); +} diff --git a/hlstatsx/scripting/hlstatsx_zr.sp b/hlstatsx/scripting/hlstatsx_zr.sp index 01d886ec..50acbe1f 100644 --- a/hlstatsx/scripting/hlstatsx_zr.sp +++ b/hlstatsx/scripting/hlstatsx_zr.sp @@ -107,10 +107,10 @@ public void EndKillStreak(int client) if (g_iKillCount[client] > g_cvarMaximumStreak.IntValue) g_iKillCount[client] = g_cvarMaximumStreak.IntValue; - char sEvent[32]; - Format(sEvent, sizeof(sEvent), "zr_kill_streak_%d", RoundToFloor(float(g_iKillCount[client]) / float(g_cvarStreakInterval.IntValue)) * g_cvarStreakInterval.IntValue); + char sPlayerEvent[32]; + Format(sPlayerEvent, sizeof(sPlayerEvent), "zr_kill_streak_%d", RoundToFloor(float(g_iKillCount[client]) / float(g_cvarStreakInterval.IntValue)) * g_cvarStreakInterval.IntValue); - LogPlayerEvent(client, "triggered", sEvent); + LogPlayerEvent(client, "triggered", sPlayerEvent); } ResetClient(client);