Skip to content

Commit

Permalink
Add support for per-line fallbacks, added Stun Grenade and Extension …
Browse files Browse the repository at this point in the history
…Ladder deaths.
  • Loading branch information
EliteMasterEric committed Feb 4, 2024
1 parent 91789e9 commit 8c38a5e
Show file tree
Hide file tree
Showing 6 changed files with 147 additions and 73 deletions.
105 changes: 60 additions & 45 deletions Coroner/AdvancedCauseOfDeath.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<int, AdvancedCauseOfDeath> PlayerCauseOfDeath = new Dictionary<int, AdvancedCauseOfDeath>();

Expand Down Expand Up @@ -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))
Expand Down Expand Up @@ -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
{
Expand All @@ -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);
}
}

Expand Down Expand Up @@ -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.
Expand Down
60 changes: 43 additions & 17 deletions Coroner/LanguageHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -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";
Expand All @@ -76,25 +80,27 @@ 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}");
Plugin.Instance.PluginLogger.LogWarning($"{PluginInfo.PLUGIN_NAME} There may be issues loading language data.");
}
}

static void LoadLanguageData(string languageCode) {
void LoadLanguageData(string languageCode) {
try
{
// R2Modman is a weirdo.
Expand All @@ -108,27 +114,47 @@ 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);
}
}

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;
}
}
Expand Down
Loading

0 comments on commit 8c38a5e

Please sign in to comment.