From af0e2306af168871f0155f6df93ca9858071c2ed Mon Sep 17 00:00:00 2001 From: Jackz Date: Mon, 26 Apr 2021 11:07:13 -0500 Subject: [PATCH] l4d2_rollback: Add save reason --- plugins/l4d2_rollback.smx | Bin 8671 -> 9188 bytes scripting/l4d2_rollback.sp | 43 ++++++++++++++++++++++++++----------- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/plugins/l4d2_rollback.smx b/plugins/l4d2_rollback.smx index 1db970e2e8d232b050883159e4178213cbedafce..4bbc33f485a1b3ceff7be001890c8d292744cefa 100644 GIT binary patch literal 9188 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 delta 8483 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 diff --git a/scripting/l4d2_rollback.sp b/scripting/l4d2_rollback.sp index 0e5033d..c7eb571 100644 --- a/scripting/l4d2_rollback.sp +++ b/scripting/l4d2_rollback.sp @@ -39,9 +39,13 @@ enum struct PlayerState { float position[3]; float angles[3]; + + char recordType[32]; + int timeRecorded; } static PlayerState[MAXPLAYERS+1] playerStates; + static bool isHealing[MAXPLAYERS+1]; //Is player healing (self, or other) static ConVar hMaxIncapCount, hDecayRate; @@ -73,6 +77,7 @@ public void OnPluginStart() { HookEvent("player_hurt", Event_PlayerHurt); RegAdminCmd("sm_sstate", Command_SaveGlobalState, ADMFLAG_ROOT, "Saves all players state"); + RegAdminCmd("sm_istate", Command_ViewStateInfo, ADMFLAG_ROOT, "Views the current state info"); RegAdminCmd("sm_rstate", Command_RestoreState, ADMFLAG_ROOT, "Restores a certain player's state"); } @@ -81,8 +86,19 @@ public void OnPluginStart() { // ///////////////////////////////////////////////////////////////////////////// public Action Command_SaveGlobalState(int client, int args) { - RecordGlobalState(); - ReplyToCommand(client, "Saved global state."); + RecordGlobalState("MANUAL"); +} +public Action Command_ViewStateInfo(int client, int args) { + ReplyToCommand(client, "---== Recorded Player States ==---"); + int index = 0; + int time = GetTime(); + + for(int i = 1; i <= MaxClients; i++) { + if(playerStates[i].timeRecorded > 0) { + int minutes = RoundToNearest((time - playerStates[i].timeRecorded) / 1000.0 / 60.0); + ReplyToCommand(client, "%d. %16.16N - %20s - %-3d min. ago", ++index, i, playerStates[i].recordType, minutes); + } + } } public Action Command_RestoreState(int client, int args) { if(args < 1) { @@ -124,11 +140,14 @@ public Action Command_RestoreState(int client, int args) { // ///////////////////////////////////////////////////////////////////////////// public Action Event_PlayerFirstSpawn(Event event, const char[] name, bool dontBroadcast) { - float time = GetGameTime(); - if(time - lastSpawnTime >= LAST_PLAYER_JOIN_THRESHOLD) { - RecordGlobalState(); - PrintToConsoleAll("[Rollback] Saving global state."); - lastSpawnTime = time; + int client = GetClientOfUserId(event.GetInt("userid")); + //Ignore admins + if(!IsFakeClient(client) && GetClientTeam(client) == 2 && GetUserAdmin(client) == INVALID_ADMIN_ID) { + float time = GetGameTime(); + if(time - lastSpawnTime >= LAST_PLAYER_JOIN_THRESHOLD) { + RecordGlobalState("JOIN"); + lastSpawnTime = time; + } } } @@ -151,13 +170,11 @@ public Action Event_PlayerHurt(Event event, const char[] name, bool dontBroadcas int client = GetClientOfUserId(event.GetInt("userid")); int attackerID = event.GetInt("attacker"); int damage = event.GetInt("dmg_health"); - PrintToChatAll("PLAYER_HURT | V %N | A #%d | DMG %d", client, attackerID, damage); if(client && GetClientTeam(client) == 2 && attackerID > 0 && damage > 0) { int attacker = GetClientOfUserId(attackerID); if(GetClientTeam(attacker) == 2) { lastDamageTime = GetGameTime(); - RecordGlobalState(); - PrintToConsoleAll("[Rollback] Saving global state due to FF damage"); + RecordGlobalState("FRIENDLY_FIRE"); } } @@ -176,7 +193,7 @@ public Action Event_HealStop(Event event, const char[] name, bool dontBroadcast) // ///////////////////////////////////////////////////////////////////////////// // METHODS // ///////////////////////////////////////////////////////////////////////////// -void RecordGlobalState() { +void RecordGlobalState(const char[] type) { char item[32]; for(int i = 1; i <= MaxClients; i++) { if(IsClientConnected(i) && IsClientInGame(i) && GetClientTeam(i) == 2) { @@ -188,13 +205,15 @@ void RecordGlobalState() { playerStates[i].permHealth = GetClientHealth(i); playerStates[i].tempHealth = GetClientHealthBuffer(i); - GetClientAbsOrigin(i, playerStates[i].position); GetClientAbsAngles(i, playerStates[i].angles); + strcopy(playerStates[i].recordType, 32, type); + playerStates[i].timeRecorded = GetTime(); } } + PrintToConsoleAll("[Rollback] Recorded all player states for: %s", type); } void RestoreState(int client) {