From 8c38a5e3c0cf0dd49e7ab0e3ac555f0d9161c329 Mon Sep 17 00:00:00 2001 From: EliteMasterEric Date: Sat, 3 Feb 2024 21:23:03 -0500 Subject: [PATCH] Add support for per-line fallbacks, added Stun Grenade and Extension Ladder deaths. --- Coroner/AdvancedCauseOfDeath.cs | 105 ++++++++++++++++------------- Coroner/LanguageHandler.cs | 60 ++++++++++++----- Coroner/Patch/CauseOfDeathPatch.cs | 35 ++++++++-- Coroner/Patch/HUDManagerPatch.cs | 4 +- Coroner/Plugin.cs | 12 +++- LanguageData/Strings_en.xml | 4 +- 6 files changed, 147 insertions(+), 73 deletions(-) diff --git a/Coroner/AdvancedCauseOfDeath.cs b/Coroner/AdvancedCauseOfDeath.cs index f3dc075..921d019 100644 --- a/Coroner/AdvancedCauseOfDeath.cs +++ b/Coroner/AdvancedCauseOfDeath.cs @@ -8,6 +8,7 @@ namespace Coroner public class AdvancedDeathTracker { public const int PLAYER_CAUSE_OF_DEATH_DROPSHIP = 300; + public const int PLAYER_CAUSE_OF_DEATH_LADDER = 301; private static readonly Dictionary PlayerCauseOfDeath = new Dictionary(); @@ -44,6 +45,16 @@ public static AdvancedCauseOfDeath GetCauseOfDeath(int playerIndex) return GetCauseOfDeath(playerController); } + public static bool HasCauseOfDeath(int playerIndex) + { + return PlayerCauseOfDeath.ContainsKey(playerIndex); + } + + public static bool HasCauseOfDeath(PlayerControllerB playerController) + { + return HasCauseOfDeath((int)playerController.playerClientId); + } + public static AdvancedCauseOfDeath GetCauseOfDeath(PlayerControllerB playerController) { if (!PlayerCauseOfDeath.ContainsKey((int)playerController.playerClientId)) @@ -152,7 +163,8 @@ public static string StringifyCauseOfDeath(AdvancedCauseOfDeath? causeOfDeath, R if (shouldRandomize) { - return result[random.Next(result.Length)]; + var index = random.Next(result.Length); + return result[index]; } else { @@ -162,105 +174,107 @@ public static string StringifyCauseOfDeath(AdvancedCauseOfDeath? causeOfDeath, R public static string[] SelectCauseOfDeath(AdvancedCauseOfDeath? causeOfDeath) { - if (causeOfDeath == null) return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_FUNNY_NOTES); + if (causeOfDeath == null) return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_FUNNY_NOTES); // NOTE: First cause of death in the list should be the "serious" entry. switch (causeOfDeath) { case AdvancedCauseOfDeath.Bludgeoning: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_GENERIC_BLUDGEONING); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_GENERIC_BLUDGEONING); case AdvancedCauseOfDeath.Gravity: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_GENERIC_GRAVITY); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_GENERIC_GRAVITY); case AdvancedCauseOfDeath.Blast: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_GENERIC_BLAST); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_GENERIC_BLAST); case AdvancedCauseOfDeath.Strangulation: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_GENERIC_STRANGULATION); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_GENERIC_STRANGULATION); case AdvancedCauseOfDeath.Suffocation: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_GENERIC_SUFFOCATION); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_GENERIC_SUFFOCATION); case AdvancedCauseOfDeath.Mauling: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_GENERIC_MAULING); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_GENERIC_MAULING); case AdvancedCauseOfDeath.Gunshots: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_GENERIC_GUNSHOTS); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_GENERIC_GUNSHOTS); case AdvancedCauseOfDeath.Crushing: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_GENERIC_CRUSHING); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_GENERIC_CRUSHING); case AdvancedCauseOfDeath.Drowning: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_GENERIC_DROWNING); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_GENERIC_DROWNING); case AdvancedCauseOfDeath.Abandoned: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_GENERIC_ABANDONED); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_GENERIC_ABANDONED); case AdvancedCauseOfDeath.Electrocution: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_GENERIC_ELECTROCUTION); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_GENERIC_ELECTROCUTION); case AdvancedCauseOfDeath.Kicking: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_GENERIC_KICKING); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_GENERIC_KICKING); case AdvancedCauseOfDeath.Enemy_Bracken: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_BRACKEN); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_BRACKEN); case AdvancedCauseOfDeath.Enemy_EyelessDog: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_EYELESS_DOG); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_EYELESS_DOG); case AdvancedCauseOfDeath.Enemy_ForestGiant: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_FOREST_GIANT); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_FOREST_GIANT); case AdvancedCauseOfDeath.Enemy_CircuitBees: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_CIRCUIT_BEES); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_CIRCUIT_BEES); case AdvancedCauseOfDeath.Enemy_GhostGirl: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_GHOST_GIRL); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_GHOST_GIRL); case AdvancedCauseOfDeath.Enemy_EarthLeviathan: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_EARTH_LEVIATHAN); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_EARTH_LEVIATHAN); case AdvancedCauseOfDeath.Enemy_BaboonHawk: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_BABOON_HAWK); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_BABOON_HAWK); case AdvancedCauseOfDeath.Enemy_Jester: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_JESTER); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_JESTER); case AdvancedCauseOfDeath.Enemy_CoilHead: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_COILHEAD); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_COILHEAD); case AdvancedCauseOfDeath.Enemy_SnareFlea: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_SNARE_FLEA); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_SNARE_FLEA); case AdvancedCauseOfDeath.Enemy_Hygrodere: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_HYGRODERE); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_HYGRODERE); case AdvancedCauseOfDeath.Enemy_HoarderBug: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_HOARDER_BUG); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_HOARDER_BUG); case AdvancedCauseOfDeath.Enemy_SporeLizard: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_SPORE_LIZARD); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_SPORE_LIZARD); case AdvancedCauseOfDeath.Enemy_BunkerSpider: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_BUNKER_SPIDER); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_BUNKER_SPIDER); case AdvancedCauseOfDeath.Enemy_Thumper: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_THUMPER); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_THUMPER); case AdvancedCauseOfDeath.Enemy_MaskedPlayer_Wear: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_MASKED_PLAYER_WEAR); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_MASKED_PLAYER_WEAR); case AdvancedCauseOfDeath.Enemy_MaskedPlayer_Victim: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_MASKED_PLAYER_VICTIM); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_MASKED_PLAYER_VICTIM); case AdvancedCauseOfDeath.Enemy_Nutcracker_Kicked: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_NUTCRACKER_KICKED); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_NUTCRACKER_KICKED); case AdvancedCauseOfDeath.Enemy_Nutcracker_Shot: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_NUTCRACKER_SHOT); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_ENEMY_NUTCRACKER_SHOT); case AdvancedCauseOfDeath.Player_Jetpack_Gravity: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_PLAYER_JETPACK_GRAVITY); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_PLAYER_JETPACK_GRAVITY); case AdvancedCauseOfDeath.Player_Jetpack_Blast: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_PLAYER_JETPACK_BLAST); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_PLAYER_JETPACK_BLAST); + case AdvancedCauseOfDeath.Player_Ladder: + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_PLAYER_LADDER); case AdvancedCauseOfDeath.Player_Murder_Melee: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_PLAYER_MURDER_MELEE); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_PLAYER_MURDER_MELEE); case AdvancedCauseOfDeath.Player_Murder_Shotgun: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_PLAYER_MURDER_SHOTGUN); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_PLAYER_MURDER_SHOTGUN); case AdvancedCauseOfDeath.Player_Quicksand: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_PLAYER_QUICKSAND); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_PLAYER_QUICKSAND); case AdvancedCauseOfDeath.Player_StunGrenade: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_PLAYER_STUN_GRENADE); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_PLAYER_STUN_GRENADE); case AdvancedCauseOfDeath.Other_DepositItemsDesk: // NOTE: Since there's no performance report on Gordion this never shows. - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_OTHER_DEPOSIT_ITEMS_DESK); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_OTHER_DEPOSIT_ITEMS_DESK); case AdvancedCauseOfDeath.Other_Dropship: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_OTHER_ITEM_DROPSHIP); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_OTHER_ITEM_DROPSHIP); case AdvancedCauseOfDeath.Other_Landmine: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_OTHER_LANDMINE); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_OTHER_LANDMINE); case AdvancedCauseOfDeath.Other_Turret: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_OTHER_TURRET); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_OTHER_TURRET); case AdvancedCauseOfDeath.Other_Lightning: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_OTHER_LIGHTNING); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_OTHER_LIGHTNING); default: - return LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_UNKNOWN); + return Plugin.Instance.LanguageHandler.GetValuesByTag(LanguageHandler.TAG_DEATH_UNKNOWN); } } @@ -314,6 +328,7 @@ public enum AdvancedCauseOfDeath Player_Jetpack_Gravity, Player_Jetpack_Blast, Player_Quicksand, + Player_Ladder, Player_Murder_Melee, Player_Murder_Shotgun, Player_StunGrenade, // TODO: Implement this. diff --git a/Coroner/LanguageHandler.cs b/Coroner/LanguageHandler.cs index 981eaf9..ffbf845 100644 --- a/Coroner/LanguageHandler.cs +++ b/Coroner/LanguageHandler.cs @@ -3,18 +3,21 @@ using System.Xml.Linq; namespace Coroner { - class LanguageHandler { + public class LanguageHandler { public const string DEFAULT_LANGUAGE = "en"; public static readonly string[] AVAILABLE_LANGUAGES = [ "en", // English - "ru", // Russian - "nl", // Dutch + "de", // German + "es", // Spanish "fr", // French - // "ptbr", // Portuguese (Brazil) - // "de", // German - // "hu", // Hungarian - // "zh-cn", // Chinese (Simplified) + "hu", // Hungarian + "it", // Italian + "ko", // Korean + "nl", // Dutch/Netherlands + "pt-br", // Portuguese (Brazil) + "ru", // Russian + "zh-cn" // Chinese (Simplified) ]; public const string TAG_FUNNY_NOTES = "FunnyNote"; @@ -62,6 +65,7 @@ class LanguageHandler { // Custom causes (player) public const string TAG_DEATH_PLAYER_JETPACK_GRAVITY = "DeathPlayerJetpackGravity"; public const string TAG_DEATH_PLAYER_JETPACK_BLAST = "DeathPlayerJetpackBlast"; + public const string TAG_DEATH_PLAYER_LADDER = "DeathPlayerLadder"; public const string TAG_DEATH_PLAYER_MURDER_MELEE = "DeathPlayerMurderMelee"; public const string TAG_DEATH_PLAYER_MURDER_SHOTGUN = "DeathPlayerMurderShotgun"; public const string TAG_DEATH_PLAYER_QUICKSAND = "DeathPlayerQuicksand"; @@ -76,17 +80,19 @@ class LanguageHandler { public const string TAG_DEATH_UNKNOWN = "DeathUnknown"; - static XDocument languageData; + public string languageCode; + XDocument languageData; - public static void Initialize() { - Plugin.Instance.PluginLogger.LogInfo($"{PluginInfo.PLUGIN_NAME} Language Support: {Plugin.Instance.PluginConfig.GetSelectedLanguage()}"); + public LanguageHandler(string languageCode) { + Plugin.Instance.PluginLogger.LogInfo($"{PluginInfo.PLUGIN_NAME} loading Language Support: {languageCode}"); + this.languageCode = languageCode; - ValidateLanguage(Plugin.Instance.PluginConfig.GetSelectedLanguage()); + ValidateLanguage(languageCode); - LoadLanguageData(Plugin.Instance.PluginConfig.GetSelectedLanguage()); + LoadLanguageData(languageCode); } - static void ValidateLanguage(string languageCode) { + void ValidateLanguage(string languageCode) { if (!AVAILABLE_LANGUAGES.Contains(languageCode)) { // Just throw a warning. Plugin.Instance.PluginLogger.LogWarning($"{PluginInfo.PLUGIN_NAME} Unknown language code: {languageCode}"); @@ -94,7 +100,7 @@ static void ValidateLanguage(string languageCode) { } } - static void LoadLanguageData(string languageCode) { + void LoadLanguageData(string languageCode) { try { // R2Modman is a weirdo. @@ -108,7 +114,6 @@ static void LoadLanguageData(string languageCode) { { Plugin.Instance.PluginLogger.LogError($"{PluginInfo.PLUGIN_NAME} Error loading language data: {ex.Message}"); Plugin.Instance.PluginLogger.LogError(ex.StackTrace); - if (languageCode != DEFAULT_LANGUAGE) LoadLanguageData(DEFAULT_LANGUAGE); } } @@ -116,19 +121,40 @@ public static string GetLanguageList() { return "(" + string.Join(", ", AVAILABLE_LANGUAGES) + ")"; } - public static string GetValueByTag(string tag) { + public string GetValueByTag(string tag) { + if (languageData == null && languageCode != DEFAULT_LANGUAGE) { + return Plugin.Instance.FallbackLanguageHandler.GetValueByTag(tag); + } + var tagElement = languageData.Descendants(tag).FirstOrDefault(); var value = tagElement?.Attribute("text")?.Value; + if (value == null || value.Length == 0) { + Plugin.Instance.PluginLogger.LogWarning($"No values found for tag '{tag}' in language '{languageCode}', displaying error text..."); + return $"{{'{tag}'}}"; + } + return value; } - public static string[] GetValuesByTag(string tag) { + public string[] GetValuesByTag(string tag) { + if (languageData == null && languageCode != DEFAULT_LANGUAGE) { + return Plugin.Instance.FallbackLanguageHandler.GetValuesByTag(tag); + } + var tags = languageData.Descendants(tag); var values = tags.Select(item => item.Attribute("text")?.Value); var filteredValues = values.Where(item => item != null); var valuesArray = filteredValues.ToArray(); + if (valuesArray.Length == 0 && languageCode != DEFAULT_LANGUAGE) { + Plugin.Instance.PluginLogger.LogWarning($"No values found for tag '{tag}' in language '{languageCode}', using fallback..."); + return Plugin.Instance.FallbackLanguageHandler.GetValuesByTag(tag); + } else if (valuesArray.Length == 0) { + Plugin.Instance.PluginLogger.LogWarning($"No values found for tag '{tag}' in language '{languageCode}', displaying error text..."); + return [$"{{'{tag}'}}"]; + } + return valuesArray; } } diff --git a/Coroner/Patch/CauseOfDeathPatch.cs b/Coroner/Patch/CauseOfDeathPatch.cs index a951366..fe0ccd5 100644 --- a/Coroner/Patch/CauseOfDeathPatch.cs +++ b/Coroner/Patch/CauseOfDeathPatch.cs @@ -21,6 +21,12 @@ public static void Prefix(PlayerControllerB __instance, ref CauseOfDeath causeOf { try { + if (AdvancedDeathTracker.HasCauseOfDeath(__instance)) + { + Plugin.Instance.PluginLogger.LogDebug("Player already has a known specific cause of death! Skipping advanced processing..."); + return; + } + // NOTE: Only called on the client of the player who died. if ((int)causeOfDeath == AdvancedDeathTracker.PLAYER_CAUSE_OF_DEATH_DROPSHIP) { @@ -29,6 +35,12 @@ public static void Prefix(PlayerControllerB __instance, ref CauseOfDeath causeOf // Now to fix the jank by adding a normal value! causeOfDeath = CauseOfDeath.Crushing; return; + } else if ((int) causeOfDeath == AdvancedDeathTracker.PLAYER_CAUSE_OF_DEATH_LADDER) { + Plugin.Instance.PluginLogger.LogDebug("Player died from ladder! Setting special cause of death..."); + AdvancedDeathTracker.SetCauseOfDeath(__instance, AdvancedCauseOfDeath.Player_Ladder); + // Now to fix the jank by adding a normal value! + causeOfDeath = CauseOfDeath.Crushing; + return; } if (__instance.isSinking && causeOfDeath == CauseOfDeath.Suffocation) @@ -36,9 +48,22 @@ public static void Prefix(PlayerControllerB __instance, ref CauseOfDeath causeOf Plugin.Instance.PluginLogger.LogDebug("Player died of suffociation while sinking in quicksand! Setting special cause of death..."); AdvancedDeathTracker.SetCauseOfDeath(__instance, AdvancedCauseOfDeath.Player_Quicksand); } else if (causeOfDeath == CauseOfDeath.Blast) { - // Determine what caused the blast. - // WARNING: This code is very janky and may cause mental damage to anyone who reads it. - + // Make a guess at what caused the blast. + var heldObjectServer = __instance.currentlyHeldObjectServer; + if (heldObjectServer != null) { + var heldObjectGameObject = heldObjectServer.gameObject; + if (heldObjectGameObject != null) { + var heldObject = heldObjectGameObject.GetComponent(); + if (heldObject != null) { + if (heldObject is StunGrenadeItem) { + // Players take 20 damage when holding a stun grenade while it explodes. + Plugin.Instance.PluginLogger.LogDebug("Player died from stun grenade explosion! Setting special cause of death..."); + AdvancedDeathTracker.SetCauseOfDeath(__instance, AdvancedCauseOfDeath.Player_StunGrenade); + } + } + } + + } } else { @@ -786,8 +811,8 @@ public static void Postfix(ExtensionLadderItem __instance) Plugin.Instance.PluginLogger.LogError("Could not fetch KillLocalPlayer from KillTrigger GameObject."); } - // Correct the cause of death. - killLocalPlayer.causeOfDeath = CauseOfDeath.Crushing; + // Modify the cause of death in a janky way. + killLocalPlayer.causeOfDeath = (CauseOfDeath)AdvancedDeathTracker.PLAYER_CAUSE_OF_DEATH_LADDER; } catch (System.Exception e) { diff --git a/Coroner/Patch/HUDManagerPatch.cs b/Coroner/Patch/HUDManagerPatch.cs index d961313..9015f67 100644 --- a/Coroner/Patch/HUDManagerPatch.cs +++ b/Coroner/Patch/HUDManagerPatch.cs @@ -46,7 +46,7 @@ static void OverridePerformanceReport(HUDManager __instance) { if (Plugin.Instance.PluginConfig.ShouldDeathReplaceNotes()) { Plugin.Instance.PluginLogger.LogInfo("[REPORT] Player " + playerIndex + " is dead! Replacing notes with Cause of Death..."); // Reset the notes. - textMesh.text = LanguageHandler.GetValueByTag(LanguageHandler.TAG_UI_DEATH) + "\n"; + textMesh.text = Plugin.Instance.LanguageHandler.GetValueByTag(LanguageHandler.TAG_UI_DEATH) + "\n"; } else { Plugin.Instance.PluginLogger.LogInfo("[REPORT] Player " + playerIndex + " is dead! Appending notes with Cause of Death..."); } @@ -61,7 +61,7 @@ static void OverridePerformanceReport(HUDManager __instance) { if (Plugin.Instance.PluginConfig.ShouldDisplayFunnyNotes()) { Plugin.Instance.PluginLogger.LogInfo("[REPORT] Player " + playerIndex + " has no notes! Injecting something funny..."); - textMesh.text = LanguageHandler.GetValueByTag(LanguageHandler.TAG_UI_NOTES) + "\n"; + textMesh.text = Plugin.Instance.LanguageHandler.GetValueByTag(LanguageHandler.TAG_UI_NOTES) + "\n"; textMesh.text += "* " + AdvancedDeathTracker.StringifyCauseOfDeath(null, syncedRandom) + "\n"; } else { Plugin.Instance.PluginLogger.LogInfo("[REPORT] Player " + playerIndex + " has no notes, but Config says leave it be..."); diff --git a/Coroner/Plugin.cs b/Coroner/Plugin.cs index 8feea75..1eb34f6 100644 --- a/Coroner/Plugin.cs +++ b/Coroner/Plugin.cs @@ -30,6 +30,9 @@ public class Plugin : BaseUnityPlugin public PluginConfig PluginConfig; + public LanguageHandler LanguageHandler; // Uses player selected language, default to English + public LanguageHandler FallbackLanguageHandler; // Always uses English + public static string AssemblyDirectory { get @@ -58,15 +61,20 @@ private void Awake() PluginLogger.LogInfo($"Plugin {PluginInfo.PLUGIN_NAME} ({PluginInfo.PLUGIN_GUID}) is loaded!"); LoadConfig(); - LanguageHandler.Initialize(); + LoadLanguageHandlers(); QueryLCAPI(); DeathBroadcaster.Initialize(); } - public String GetConfigPath() { + public string GetConfigPath() { return $"{Paths.ConfigPath}/{PluginInfo.PLUGIN_AUTHOR}-{PluginInfo.PLUGIN_NAME}"; } + public void LoadLanguageHandlers() { + LanguageHandler = new LanguageHandler(PluginConfig.GetSelectedLanguage()); + FallbackLanguageHandler = new LanguageHandler(LanguageHandler.DEFAULT_LANGUAGE); + } + private void QueryLCAPI() { PluginLogger.LogInfo("Checking for LC_API..."); diff --git a/LanguageData/Strings_en.xml b/LanguageData/Strings_en.xml index 47070ed..823ae96 100644 --- a/LanguageData/Strings_en.xml +++ b/LanguageData/Strings_en.xml @@ -184,8 +184,8 @@ - - + +