using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using HarmonyLib; using Mirror; using TMPro; using UnityEngine; using YAPYAP; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("deathcounter")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("deathcounter")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("ca6473a1-f5a5-4c21-a7ef-0783d800e9a8")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] namespace Xemotal; public static class DeathCounterManager { private static readonly Dictionary DeathCounts = new Dictionary(); private static readonly Dictionary RealNames = new Dictionary(); private static Pawn localPawn; private static Font gameFont; private static bool initialized; public static void Initialize() { if (!initialized) { initialized = true; Debug.Log((object)"[Xemotal] Death Counter initialisé."); } } private static int GetId(Pawn pawn) { if ((Object)(object)pawn == (Object)null) { return -1; } return pawn.PlayerNetId; } public static int GetDeathCount(Pawn pawn) { if ((Object)(object)pawn == (Object)null) { return 0; } return GetDeathCount(GetId(pawn)); } private static int GetDeathCount(int id) { if (id < 0) { return 0; } if (DeathCounts.TryGetValue(id, out var value)) { return value; } return 0; } public static void RegisterDeath(Pawn pawn) { if (!((Object)(object)pawn == (Object)null)) { int id = GetId(pawn); if (id >= 0) { int deathCount = GetDeathCount(id); deathCount++; DeathCounts[id] = deathCount; string realName = GetRealName(pawn); Debug.Log((object)("[Xemotal] " + realName + " - mort n°" + deathCount)); } } } private static string GetRealName(Pawn pawn) { if ((Object)(object)pawn == (Object)null) { return ""; } int id = GetId(pawn); if (RealNames.TryGetValue(id, out var value)) { return value; } string text = pawn.PlayerName; if (string.IsNullOrEmpty(text)) { text = "Player"; } RealNames[id] = text; return text; } public static void RegisterPawn(Pawn pawn) { if ((Object)(object)pawn == (Object)null) { return; } int id = GetId(pawn); if (id < 0) { return; } string playerName = pawn.PlayerName; if (!string.IsNullOrEmpty(playerName)) { RealNames[id] = playerName; } if (!DeathCounts.ContainsKey(id)) { DeathCounts[id] = 0; } if (!((NetworkBehaviour)pawn).isLocalPlayer) { return; } localPawn = pawn; PawnView view = pawn.View; if ((Object)(object)view != (Object)null) { TMP_Text playerNameText = view.PlayerNameText; if ((Object)(object)playerNameText != (Object)null && (Object)(object)playerNameText.font != (Object)null) { gameFont = playerNameText.font.sourceFontFile; if ((Object)(object)gameFont != (Object)null) { Debug.Log((object)("[Xemotal] Police du jeu récupérée : " + ((Object)gameFont).name)); } } } Debug.Log((object)"[Xemotal] Joueur local enregistré pour le Death Counter."); } public static void OnGUI() { //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Expected O, but got Unknown //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Expected O, but got Unknown //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)localPawn == (Object)null) && ((NetworkBehaviour)localPawn).isLocalPlayer) { int deathCount = GetDeathCount(localPawn); GUIStyle val = new GUIStyle(GUI.skin.label); if ((Object)(object)gameFont != (Object)null) { val.font = gameFont; } val.alignment = (TextAnchor)1; val.fontSize = 28; val.fontStyle = (FontStyle)1; val.normal.textColor = Color.white; val.richText = false; GUIStyle val2 = new GUIStyle(val); val2.normal.textColor = Color.black; float num = (float)Screen.width * 0.5f; Rect val3 = default(Rect); ((Rect)(ref val3))..ctor(num - 200f + 2f, 20f, 400f, 50f); Rect val4 = default(Rect); ((Rect)(ref val4))..ctor(num - 200f, 18f, 400f, 50f); string text = "Deaths: " + deathCount; GUI.Label(val3, text, val2); GUI.Label(val4, text, val); } } public static void Reset() { DeathCounts.Clear(); RealNames.Clear(); localPawn = null; gameFont = null; Debug.Log((object)"[Xemotal] Death Counter reset."); } } [BepInPlugin("Xemotal.DeathCounter", "Xemotal Death Counter", "1.0.0")] public class XemotalDeathCounterPlugin : BaseUnityPlugin { private Harmony harmony; private void Awake() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown DeathCounterManager.Initialize(); harmony = new Harmony("Xemotal.DeathCounter"); harmony.PatchAll(); Debug.Log((object)"[Xemotal] Death Counter chargé."); } private void OnGUI() { DeathCounterManager.OnGUI(); } private void OnDestroy() { if (harmony != null) { harmony.UnpatchSelf(); } DeathCounterManager.Reset(); } } [HarmonyPatch(typeof(Pawn), "OnIsDeadChanged")] public static class PawnDeathPatch { [HarmonyPostfix] private static void Postfix(Pawn __instance, bool oldValue, bool newValue) { if (!((Object)(object)__instance == (Object)null) && !oldValue && newValue) { Debug.Log((object)("[Xemotal] OnIsDeadChanged détecté pour " + __instance.PlayerName + " / local=" + ((NetworkBehaviour)__instance).isLocalPlayer + " / server=" + ((NetworkBehaviour)__instance).isServer)); if (((NetworkBehaviour)__instance).isLocalPlayer) { DeathCounterManager.RegisterDeath(__instance); } } } } [HarmonyPatch(typeof(Pawn), "OnStartClient")] public static class PawnStartClientPatch { [HarmonyPostfix] private static void Postfix(Pawn __instance) { if (!((Object)(object)__instance == (Object)null)) { DeathCounterManager.RegisterPawn(__instance); } } } [HarmonyPatch(typeof(Pawn), "OnStartAuthority")] public static class PawnAuthorityPatch { [HarmonyPostfix] private static void Postfix(Pawn __instance) { if (!((Object)(object)__instance == (Object)null)) { DeathCounterManager.RegisterPawn(__instance); } } }