Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of BrokenLegMod v1.0.0
BepInEx\plugins\BrokenLegMod\BrokenLegMod.dll
Decompiled 2 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using Microsoft.CodeAnalysis; using Unity.Collections; using Unity.Netcode; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("BrokenLegMod")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("Lethal Company Mod: Beinbruch bei schwerem Fallschaden. Spieler muss kriechen, andere koennen ihn tragen.")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("BrokenLegMod")] [assembly: AssemblyTitle("BrokenLegMod")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace BrokenLegMod { internal static class BrokenLegNetwork { [CompilerGenerated] private static class <>O { public static HandleNamedMessageDelegate <0>__OnBreakReceived; public static HandleNamedMessageDelegate <1>__OnCarryReceived; public static HandleNamedMessageDelegate <2>__OnDropReceived; public static HandleNamedMessageDelegate <3>__OnCleanReceived; public static HandleNamedMessageDelegate <4>__OnReqBreakReceived; public static HandleNamedMessageDelegate <5>__OnReqCarryReceived; public static HandleNamedMessageDelegate <6>__OnReqDropReceived; } private const string MSG_BREAK = "BL_Break"; private const string MSG_CARRY = "BL_Carry"; private const string MSG_DROP = "BL_Drop"; private const string MSG_CLEAN = "BL_Clean"; private const string MSG_REQ_BREAK = "BL_ReqBreak"; private const string MSG_REQ_CARRY = "BL_ReqCarry"; private const string MSG_REQ_DROP = "BL_ReqDrop"; private static bool _registered; internal static bool IsHost { get { try { return (Object)(object)NetworkManager.Singleton != (Object)null && (NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsServer); } catch { return true; } } } internal static void Register() { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Expected O, but got Unknown //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Expected O, but got Unknown //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Expected O, but got Unknown //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Expected O, but got Unknown //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Expected O, but got Unknown //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Expected O, but got Unknown //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Expected O, but got Unknown if (_registered) { return; } try { NetworkManager singleton = NetworkManager.Singleton; CustomMessagingManager val = ((singleton != null) ? singleton.CustomMessagingManager : null); if (val != null) { object obj = <>O.<0>__OnBreakReceived; if (obj == null) { HandleNamedMessageDelegate val2 = OnBreakReceived; <>O.<0>__OnBreakReceived = val2; obj = (object)val2; } val.RegisterNamedMessageHandler("BL_Break", (HandleNamedMessageDelegate)obj); object obj2 = <>O.<1>__OnCarryReceived; if (obj2 == null) { HandleNamedMessageDelegate val3 = OnCarryReceived; <>O.<1>__OnCarryReceived = val3; obj2 = (object)val3; } val.RegisterNamedMessageHandler("BL_Carry", (HandleNamedMessageDelegate)obj2); object obj3 = <>O.<2>__OnDropReceived; if (obj3 == null) { HandleNamedMessageDelegate val4 = OnDropReceived; <>O.<2>__OnDropReceived = val4; obj3 = (object)val4; } val.RegisterNamedMessageHandler("BL_Drop", (HandleNamedMessageDelegate)obj3); object obj4 = <>O.<3>__OnCleanReceived; if (obj4 == null) { HandleNamedMessageDelegate val5 = OnCleanReceived; <>O.<3>__OnCleanReceived = val5; obj4 = (object)val5; } val.RegisterNamedMessageHandler("BL_Clean", (HandleNamedMessageDelegate)obj4); object obj5 = <>O.<4>__OnReqBreakReceived; if (obj5 == null) { HandleNamedMessageDelegate val6 = OnReqBreakReceived; <>O.<4>__OnReqBreakReceived = val6; obj5 = (object)val6; } val.RegisterNamedMessageHandler("BL_ReqBreak", (HandleNamedMessageDelegate)obj5); object obj6 = <>O.<5>__OnReqCarryReceived; if (obj6 == null) { HandleNamedMessageDelegate val7 = OnReqCarryReceived; <>O.<5>__OnReqCarryReceived = val7; obj6 = (object)val7; } val.RegisterNamedMessageHandler("BL_ReqCarry", (HandleNamedMessageDelegate)obj6); object obj7 = <>O.<6>__OnReqDropReceived; if (obj7 == null) { HandleNamedMessageDelegate val8 = OnReqDropReceived; <>O.<6>__OnReqDropReceived = val8; obj7 = (object)val8; } val.RegisterNamedMessageHandler("BL_ReqDrop", (HandleNamedMessageDelegate)obj7); _registered = true; Plugin.Logger.LogInfo((object)"[BrokenLegNet] Netzwerk-Handler registriert!"); } } catch (Exception ex) { Plugin.Logger.LogError((object)("[BrokenLegNet] Register Fehler: " + ex.Message)); } } internal static void Unregister() { if (!_registered) { return; } try { NetworkManager singleton = NetworkManager.Singleton; CustomMessagingManager val = ((singleton != null) ? singleton.CustomMessagingManager : null); if (val != null) { val.UnregisterNamedMessageHandler("BL_Break"); val.UnregisterNamedMessageHandler("BL_Carry"); val.UnregisterNamedMessageHandler("BL_Drop"); val.UnregisterNamedMessageHandler("BL_Clean"); val.UnregisterNamedMessageHandler("BL_ReqBreak"); val.UnregisterNamedMessageHandler("BL_ReqCarry"); val.UnregisterNamedMessageHandler("BL_ReqDrop"); } } catch { } _registered = false; Plugin.Logger.LogInfo((object)"[BrokenLegNet] Netzwerk-Handler entfernt."); } internal static void ClientNotifyBreak(ulong clientId) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) if (IsHost) { HostBroadcastBreak(clientId); } else if (_registered) { try { FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(8, (Allocator)2, -1); ((FastBufferWriter)(ref val)).WriteValueSafe<ulong>(ref clientId, default(ForPrimitives)); NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage("BL_ReqBreak", 0uL, val, (NetworkDelivery)3); ((FastBufferWriter)(ref val)).Dispose(); Debug.Log((object)$"[BrokenLegNet] Break-Request an Host: Spieler {clientId}"); } catch (Exception ex) { Debug.LogError((object)("[BrokenLegNet] ClientNotifyBreak Fehler: " + ex.Message)); } } } internal static void ClientNotifyCarry(ulong carrierId, ulong carriedId) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) if (IsHost) { HostBroadcastCarry(carrierId, carriedId); } else if (_registered) { try { FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(16, (Allocator)2, -1); ((FastBufferWriter)(ref val)).WriteValueSafe<ulong>(ref carrierId, default(ForPrimitives)); ((FastBufferWriter)(ref val)).WriteValueSafe<ulong>(ref carriedId, default(ForPrimitives)); NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage("BL_ReqCarry", 0uL, val, (NetworkDelivery)3); ((FastBufferWriter)(ref val)).Dispose(); Debug.Log((object)$"[BrokenLegNet] Carry-Request an Host: {carrierId} → {carriedId}"); } catch (Exception ex) { Debug.LogError((object)("[BrokenLegNet] ClientNotifyCarry Fehler: " + ex.Message)); } } } internal static void ClientNotifyDrop(ulong carrierId, ulong carriedId) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) if (IsHost) { HostBroadcastDrop(carriedId); } else if (_registered) { try { FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(8, (Allocator)2, -1); ((FastBufferWriter)(ref val)).WriteValueSafe<ulong>(ref carriedId, default(ForPrimitives)); NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage("BL_ReqDrop", 0uL, val, (NetworkDelivery)3); ((FastBufferWriter)(ref val)).Dispose(); Debug.Log((object)$"[BrokenLegNet] Drop-Request an Host: Spieler {carriedId}"); } catch (Exception ex) { Debug.LogError((object)("[BrokenLegNet] ClientNotifyDrop Fehler: " + ex.Message)); } } } internal static void HostBroadcastBreak(ulong clientId) { if (IsHost) { SendToAll("BL_Break", delegate(FastBufferWriter w) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) ((FastBufferWriter)(ref w)).WriteValueSafe<ulong>(ref clientId, default(ForPrimitives)); }); Plugin.BreakPlayerLeg(clientId); } } internal static void HostBroadcastCarry(ulong carrierId, ulong carriedId) { if (IsHost) { SendToAll("BL_Carry", delegate(FastBufferWriter w) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) ((FastBufferWriter)(ref w)).WriteValueSafe<ulong>(ref carrierId, default(ForPrimitives)); ((FastBufferWriter)(ref w)).WriteValueSafe<ulong>(ref carriedId, default(ForPrimitives)); }); Plugin.StartCarry(carriedId, carrierId); } } internal static void HostBroadcastDrop(ulong carriedId) { if (IsHost) { SendToAll("BL_Drop", delegate(FastBufferWriter w) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) ((FastBufferWriter)(ref w)).WriteValueSafe<ulong>(ref carriedId, default(ForPrimitives)); }); Plugin.StopCarry(carriedId); } } internal static void HostBroadcastCleanup() { if (IsHost) { SendToAll("BL_Clean", delegate(FastBufferWriter w) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) byte b = 0; ((FastBufferWriter)(ref w)).WriteValueSafe<byte>(ref b, default(ForPrimitives)); }); } } private static void OnBreakReceived(ulong senderId, FastBufferReader reader) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) if (IsHost) { return; } try { ulong num = default(ulong); ((FastBufferReader)(ref reader)).ReadValueSafe<ulong>(ref num, default(ForPrimitives)); Plugin.BreakPlayerLeg(num); Debug.Log((object)$"[BrokenLegNet] Break empfangen: Spieler {num}"); } catch (Exception ex) { Debug.LogError((object)("[BrokenLegNet] OnBreak Fehler: " + ex.Message)); } } private static void OnCarryReceived(ulong senderId, FastBufferReader reader) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) if (IsHost) { return; } try { ulong num = default(ulong); ((FastBufferReader)(ref reader)).ReadValueSafe<ulong>(ref num, default(ForPrimitives)); ulong num2 = default(ulong); ((FastBufferReader)(ref reader)).ReadValueSafe<ulong>(ref num2, default(ForPrimitives)); Plugin.StartCarry(num2, num); Debug.Log((object)$"[BrokenLegNet] Carry empfangen: {num} → {num2}"); } catch (Exception ex) { Debug.LogError((object)("[BrokenLegNet] OnCarry Fehler: " + ex.Message)); } } private static void OnDropReceived(ulong senderId, FastBufferReader reader) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) if (IsHost) { return; } try { ulong num = default(ulong); ((FastBufferReader)(ref reader)).ReadValueSafe<ulong>(ref num, default(ForPrimitives)); Plugin.StopCarry(num); Debug.Log((object)$"[BrokenLegNet] Drop empfangen: Spieler {num}"); } catch (Exception ex) { Debug.LogError((object)("[BrokenLegNet] OnDrop Fehler: " + ex.Message)); } } private static void OnCleanReceived(ulong senderId, FastBufferReader reader) { if (IsHost) { return; } try { Plugin.CleanupAll(); Debug.Log((object)"[BrokenLegNet] Cleanup empfangen"); } catch (Exception ex) { Debug.LogError((object)("[BrokenLegNet] OnClean Fehler: " + ex.Message)); } } private static void OnReqBreakReceived(ulong senderId, FastBufferReader reader) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) if (!IsHost) { return; } try { ulong num = default(ulong); ((FastBufferReader)(ref reader)).ReadValueSafe<ulong>(ref num, default(ForPrimitives)); Debug.Log((object)$"[BrokenLegNet] Break-Request von Client: Spieler {num}"); HostBroadcastBreak(num); } catch (Exception ex) { Debug.LogError((object)("[BrokenLegNet] OnReqBreak Fehler: " + ex.Message)); } } private static void OnReqCarryReceived(ulong senderId, FastBufferReader reader) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) if (!IsHost) { return; } try { ulong num = default(ulong); ((FastBufferReader)(ref reader)).ReadValueSafe<ulong>(ref num, default(ForPrimitives)); ulong num2 = default(ulong); ((FastBufferReader)(ref reader)).ReadValueSafe<ulong>(ref num2, default(ForPrimitives)); Debug.Log((object)$"[BrokenLegNet] Carry-Request: {num} → {num2}"); HostBroadcastCarry(num, num2); } catch (Exception ex) { Debug.LogError((object)("[BrokenLegNet] OnReqCarry Fehler: " + ex.Message)); } } private static void OnReqDropReceived(ulong senderId, FastBufferReader reader) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) if (!IsHost) { return; } try { ulong num = default(ulong); ((FastBufferReader)(ref reader)).ReadValueSafe<ulong>(ref num, default(ForPrimitives)); Debug.Log((object)$"[BrokenLegNet] Drop-Request: Spieler {num}"); HostBroadcastDrop(num); } catch (Exception ex) { Debug.LogError((object)("[BrokenLegNet] OnReqDrop Fehler: " + ex.Message)); } } internal static PlayerControllerB GetPlayerByClientId(ulong clientId) { try { if (StartOfRound.Instance?.allPlayerScripts == null) { return null; } PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if ((Object)(object)val != (Object)null && val.actualClientId == clientId) { return val; } } } catch { } return null; } private static void SendToAll(string msgName, Action<FastBufferWriter> write) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) if (!_registered) { return; } try { FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(256, (Allocator)2, -1); write(val); NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll(msgName, val, (NetworkDelivery)3); ((FastBufferWriter)(ref val)).Dispose(); } catch (Exception ex) { Debug.LogError((object)("[BrokenLegNet] SendToAll(" + msgName + ") Fehler: " + ex.Message)); } } } [BepInPlugin("BrokenLegMod", "BrokenLegMod", "1.0.0")] public class Plugin : BaseUnityPlugin { internal static ManualLogSource Logger; private Harmony _harmony; internal static ConfigEntry<float> cfgLimpSpeed; internal static ConfigEntry<float> cfgCarrierSpeedMult; internal static ConfigEntry<bool> cfgBlockJump; internal static ConfigEntry<bool> cfgBlockSprint; internal static ConfigEntry<float> cfgCarryForward; internal static ConfigEntry<float> cfgCarryDown; internal static ConfigEntry<float> cfgCarryRight; internal static ConfigEntry<float> cfgCarryWeight; internal static ConfigEntry<KeyCode> cfgDropKey; internal static HashSet<ulong> BrokenLegPlayers = new HashSet<ulong>(); internal static Dictionary<ulong, ulong> CarryState = new Dictionary<ulong, ulong>(); internal static float CleanupCooldown = 0f; private void Awake() { //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Expected O, but got Unknown //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected O, but got Unknown //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Expected O, but got Unknown //IL_013f: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Expected O, but got Unknown //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Expected O, but got Unknown //IL_01b9: Unknown result type (might be due to invalid IL or missing references) //IL_01c3: Expected O, but got Unknown //IL_01ef: Unknown result type (might be due to invalid IL or missing references) //IL_01f9: Expected O, but got Unknown Logger = ((BaseUnityPlugin)this).Logger; Logger.LogInfo((object)"BrokenLegMod v1.0.0 geladen!"); cfgLimpSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("Gameplay", "Humpel-Geschwindigkeit", 0.8f, new ConfigDescription("Wie schnell der verletzte Spieler humpelt. Niedriger = langsamer. Normal = 1.0", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 1.5f), Array.Empty<object>())); cfgCarrierSpeedMult = ((BaseUnityPlugin)this).Config.Bind<float>("Gameplay", "Traeger-Geschwindigkeit", 0.6f, new ConfigDescription("Speed-Multiplikator fuer den Spieler der jemanden traegt. 1.0 = volle Geschwindigkeit", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.2f, 1f), Array.Empty<object>())); cfgBlockJump = ((BaseUnityPlugin)this).Config.Bind<bool>("Gameplay", "Springen blockieren", true, "Spieler mit gebrochenem Bein kann nicht springen"); cfgBlockSprint = ((BaseUnityPlugin)this).Config.Bind<bool>("Gameplay", "Sprinten blockieren", true, "Spieler mit gebrochenem Bein kann nicht sprinten"); cfgCarryForward = ((BaseUnityPlugin)this).Config.Bind<float>("Tragen", "Position Vorwaerts", 1.2f, new ConfigDescription("Wie weit vor dem Traeger der getragene Spieler ist (in Metern)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.3f, 2.5f), Array.Empty<object>())); cfgCarryDown = ((BaseUnityPlugin)this).Config.Bind<float>("Tragen", "Position Runter", 0.6f, new ConfigDescription("Wie weit nach unten der getragene Spieler haengt (in Metern)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1.5f), Array.Empty<object>())); cfgCarryRight = ((BaseUnityPlugin)this).Config.Bind<float>("Tragen", "Position Rechts", 0.3f, new ConfigDescription("Seitlicher Versatz nach rechts (damit Sicht nicht blockiert). 0 = mittig", (AcceptableValueBase)(object)new AcceptableValueRange<float>(-1f, 1f), Array.Empty<object>())); cfgCarryWeight = ((BaseUnityPlugin)this).Config.Bind<float>("Tragen", "Trage-Gewicht", 1.5f, new ConfigDescription("Zusaetzliches Gewicht beim Tragen. Hoeher = langsamer + schwerer", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 3f), Array.Empty<object>())); cfgDropKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "Ablegen-Taste", (KeyCode)103, "Taste zum Ablegen des getragenen Spielers (Standard: G)"); _harmony = new Harmony("BrokenLegMod"); _harmony.PatchAll(typeof(MakeCriticallyInjured_Patch)); _harmony.PatchAll(typeof(PlayerUpdate_Patch)); _harmony.PatchAll(typeof(PlayerJump_Patch)); _harmony.PatchAll(typeof(PlayerInteract_Patch)); _harmony.PatchAll(typeof(PlayerDiscard_Patch)); _harmony.PatchAll(typeof(Player_KillPlayer_Patch)); _harmony.PatchAll(typeof(StartOfRound_Start_Patch)); _harmony.PatchAll(typeof(GameNetworkManager_Disconnect_Patch)); _harmony.PatchAll(typeof(StartOfRound_ReviveDeadPlayers_Patch)); _harmony.PatchAll(typeof(StartOfRound_ShipLeave_Patch)); _harmony.PatchAll(typeof(StartOfRound_ResetShip_Patch)); Logger.LogInfo((object)"Alle Harmony-Patches angewendet!"); } internal static bool IsLegBroken(PlayerControllerB player) { if ((Object)(object)player != (Object)null) { return BrokenLegPlayers.Contains(player.actualClientId); } return false; } internal static bool IsBeingCarried(PlayerControllerB player) { if ((Object)(object)player != (Object)null) { return CarryState.ContainsKey(player.actualClientId); } return false; } internal static bool IsCarrying(PlayerControllerB player) { if ((Object)(object)player == (Object)null) { return false; } foreach (KeyValuePair<ulong, ulong> item in CarryState) { if (item.Value == player.actualClientId) { return true; } } return false; } internal static PlayerControllerB GetCarriedPlayer(PlayerControllerB carrier) { if ((Object)(object)carrier == (Object)null) { return null; } foreach (KeyValuePair<ulong, ulong> item in CarryState) { if (item.Value == carrier.actualClientId) { return BrokenLegNetwork.GetPlayerByClientId(item.Key); } } return null; } internal static PlayerControllerB GetCarrier(PlayerControllerB carried) { if ((Object)(object)carried == (Object)null || !CarryState.ContainsKey(carried.actualClientId)) { return null; } return BrokenLegNetwork.GetPlayerByClientId(CarryState[carried.actualClientId]); } internal static PlayerControllerB GetNearbyBrokenPlayer(PlayerControllerB viewer) { //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) if (StartOfRound.Instance?.allPlayerScripts == null) { return null; } Camera gameplayCamera = viewer.gameplayCamera; if ((Object)(object)gameplayCamera == (Object)null) { return null; } PlayerControllerB result = null; float num = float.MaxValue; PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if ((Object)(object)val == (Object)null || !val.isPlayerControlled || val.isPlayerDead || val == viewer || !IsLegBroken(val) || IsBeingCarried(val)) { continue; } float num2 = Vector3.Distance(((Component)gameplayCamera).transform.position, ((Component)val).transform.position); if (!(num2 > 5f)) { Vector3 val2 = ((Component)val).transform.position - ((Component)gameplayCamera).transform.position; Vector3 normalized = ((Vector3)(ref val2)).normalized; if (!(Vector3.Dot(((Component)gameplayCamera).transform.forward, normalized) < 0.5f) && num2 < num) { result = val; num = num2; } } } return result; } internal static void BreakPlayerLeg(ulong clientId) { if (BrokenLegPlayers.Contains(clientId)) { return; } BrokenLegPlayers.Add(clientId); Logger.LogInfo((object)$"[BrokenLeg] Spieler {clientId}: Bein gebrochen! Dauerhaftes Humpeln!"); PlayerControllerB val = GameNetworkManager.Instance?.localPlayerController; if (!((Object)(object)val != (Object)null) || val.actualClientId != clientId) { return; } try { HUDManager instance = HUDManager.Instance; if (instance != null) { instance.DisplayTip("Bein gebrochen!", "Du humpelst jetzt dauerhaft.\nAndere Spieler koennen dich mit [E] aufheben.", true, false, "BL_Break"); } } catch { } } internal static void StartCarry(ulong carriedId, ulong carrierId) { //IL_008f: Unknown result type (might be due to invalid IL or missing references) if (CarryState.ContainsKey(carriedId)) { return; } CarryState[carriedId] = carrierId; Logger.LogInfo((object)$"[BrokenLeg] Spieler {carrierId} traegt Spieler {carriedId}!"); PlayerControllerB playerByClientId = BrokenLegNetwork.GetPlayerByClientId(carrierId); if ((Object)(object)playerByClientId != (Object)null) { SetCarryAnimation(playerByClientId, enable: true); } PlayerControllerB val = GameNetworkManager.Instance?.localPlayerController; if (!((Object)(object)val != (Object)null)) { return; } if (val.actualClientId == carrierId) { try { HUDManager instance = HUDManager.Instance; if (instance != null) { instance.DisplayTip("Spieler aufgehoben", $"Druecke [{cfgDropKey.Value}] zum Ablegen.", false, false, "BL_Carry"); } return; } catch { return; } } if (val.actualClientId != carriedId) { return; } try { HUDManager instance2 = HUDManager.Instance; if (instance2 != null) { instance2.DisplayTip("Du wirst getragen!", "Warte bis du abgelegt wirst.", false, false, "BL_Carried"); } } catch { } } internal static void StopCarry(ulong carriedId) { if (CarryState.ContainsKey(carriedId)) { PlayerControllerB playerByClientId = BrokenLegNetwork.GetPlayerByClientId(CarryState[carriedId]); if ((Object)(object)playerByClientId != (Object)null) { SetCarryAnimation(playerByClientId, enable: false); } CarryState.Remove(carriedId); Logger.LogInfo((object)$"[BrokenLeg] Spieler {carriedId} wurde abgelegt!"); } } internal static void SetCarryAnimation(PlayerControllerB carrier, bool enable) { try { carrier.twoHanded = enable; carrier.twoHandedAnimation = enable; float value = cfgCarryWeight.Value; if (enable) { carrier.carryWeight = Mathf.Clamp(carrier.carryWeight + value, 1f, 4f); } else { carrier.carryWeight = Mathf.Max(carrier.carryWeight - value, 1f); } if ((Object)(object)carrier.playerBodyAnimator != (Object)null) { carrier.playerBodyAnimator.SetBool("Grab", enable); carrier.playerBodyAnimator.SetBool("GrabValidated", enable); carrier.playerBodyAnimator.SetBool("cancelHolding", !enable); carrier.playerBodyAnimator.SetBool("GrabInvalidated", false); try { carrier.playerBodyAnimator.SetBool("holdingTwoHandItem", enable); } catch { } } Logger.LogInfo((object)("[BrokenLeg] Trage-Animation " + (enable ? "AN" : "AUS") + " fuer " + carrier.playerUsername)); } catch (Exception ex) { Logger.LogError((object)("[BrokenLeg] SetCarryAnimation Fehler: " + ex.Message)); } } internal static void HealPlayer(ulong clientId) { BrokenLegPlayers.Remove(clientId); if (CarryState.ContainsKey(clientId)) { CarryState.Remove(clientId); } } internal static void CleanupAll() { try { foreach (KeyValuePair<ulong, ulong> item in CarryState) { PlayerControllerB playerByClientId = BrokenLegNetwork.GetPlayerByClientId(item.Value); if ((Object)(object)playerByClientId != (Object)null) { SetCarryAnimation(playerByClientId, enable: false); } } } catch { } BrokenLegPlayers.Clear(); CarryState.Clear(); CleanupCooldown = 5f; try { if (StartOfRound.Instance?.allPlayerScripts != null) { PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if ((Object)(object)val != (Object)null) { val.criticallyInjured = false; } } } } catch { } Logger.LogInfo((object)"[BrokenLeg] Alle Zustaende zurueckgesetzt."); } } [HarmonyPatch(typeof(PlayerControllerB), "MakeCriticallyInjured")] internal static class MakeCriticallyInjured_Patch { [HarmonyPostfix] private static void Postfix(PlayerControllerB __instance, bool enable) { if (!enable && Plugin.IsLegBroken(__instance)) { __instance.criticallyInjured = true; Plugin.Logger.LogInfo((object)("[BrokenLeg] Heilung blockiert fuer " + __instance.playerUsername + "!")); } } } [HarmonyPatch(typeof(PlayerControllerB), "Update")] internal static class PlayerUpdate_Patch { private const float NORMAL_SPEED = 4.6f; private static FieldInfo _cursorTipField; private static PropertyInfo _cursorTipTextProp; private static bool _cursorTipResolved; private static void SetCursorTip(string text) { try { if ((Object)(object)HUDManager.Instance == (Object)null) { return; } if (!_cursorTipResolved) { _cursorTipResolved = true; BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; string[] array = new string[5] { "cursorTip", "tipText", "cursorTooltip", "interactionText", "hoverTip" }; foreach (string name in array) { _cursorTipField = typeof(HUDManager).GetField(name, bindingAttr); if (_cursorTipField != null) { break; } } if (_cursorTipField == null) { FieldInfo[] fields = typeof(HUDManager).GetFields(bindingAttr); foreach (FieldInfo fieldInfo in fields) { if (fieldInfo.Name.ToLower().Contains("tip") || fieldInfo.Name.ToLower().Contains("cursor")) { object value = fieldInfo.GetValue(HUDManager.Instance); if (value != null && value.GetType().GetProperty("text") != null) { _cursorTipField = fieldInfo; break; } } } } if (_cursorTipField != null) { object value2 = _cursorTipField.GetValue(HUDManager.Instance); if (value2 != null) { _cursorTipTextProp = value2.GetType().GetProperty("text"); } } } if (_cursorTipField != null && _cursorTipTextProp != null) { object value3 = _cursorTipField.GetValue(HUDManager.Instance); if (value3 != null) { _cursorTipTextProp.SetValue(value3, text); } } } catch { } } [HarmonyPostfix] private static void Postfix(PlayerControllerB __instance) { //IL_015c: Unknown result type (might be due to invalid IL or missing references) try { if (__instance.isPlayerDead) { return; } if (Plugin.CleanupCooldown > 0f) { Plugin.CleanupCooldown -= Time.deltaTime; return; } if (__instance.criticallyInjured && !Plugin.IsLegBroken(__instance)) { PlayerControllerB val = GameNetworkManager.Instance?.localPlayerController; if ((Object)(object)val != (Object)null && val == __instance) { Plugin.Logger.LogInfo((object)("[BrokenLeg] " + __instance.playerUsername + " ist kritisch verletzt → Bein bricht!")); BrokenLegNetwork.ClientNotifyBreak(__instance.actualClientId); } } if (Plugin.IsLegBroken(__instance)) { __instance.criticallyInjured = true; try { FieldInfo field = typeof(PlayerControllerB).GetField("limpMultiplier", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { field.SetValue(__instance, Plugin.cfgLimpSpeed.Value); } } catch { } if (Plugin.cfgBlockSprint.Value) { __instance.isSprinting = false; __instance.sprintMeter = 0f; } if (Plugin.IsBeingCarried(__instance)) { __instance.movementSpeed = 0f; } } if (Plugin.IsCarrying(__instance)) { float num = 4.6f * Plugin.cfgCarrierSpeedMult.Value; if (__instance.movementSpeed > num) { __instance.movementSpeed = num; } } PlayerControllerB val2 = GameNetworkManager.Instance?.localPlayerController; if ((Object)(object)val2 == (Object)null || __instance != val2) { return; } if (Plugin.IsCarrying(__instance) && Input.GetKeyDown(Plugin.cfgDropKey.Value)) { PlayerControllerB carriedPlayer = Plugin.GetCarriedPlayer(__instance); if ((Object)(object)carriedPlayer != (Object)null) { Plugin.Logger.LogInfo((object)"[BrokenLeg] Spieler abgelegt (Taste)!"); BrokenLegNetwork.ClientNotifyDrop(__instance.actualClientId, carriedPlayer.actualClientId); } } if (!Plugin.IsLegBroken(__instance) && !Plugin.IsCarrying(__instance)) { PlayerControllerB nearbyBrokenPlayer = Plugin.GetNearbyBrokenPlayer(__instance); if ((Object)(object)nearbyBrokenPlayer != (Object)null) { SetCursorTip("Aufheben (" + nearbyBrokenPlayer.playerUsername + ") : [E]"); } } } catch (Exception ex) { Plugin.Logger.LogError((object)("[BrokenLeg] Update-Patch Fehler: " + ex.Message)); } } } [HarmonyPatch(typeof(PlayerControllerB), "Jump_performed")] internal static class PlayerJump_Patch { [HarmonyPrefix] private static bool Prefix(PlayerControllerB __instance) { if (Plugin.IsBeingCarried(__instance)) { return false; } if (Plugin.IsLegBroken(__instance) && Plugin.cfgBlockJump.Value) { return false; } return true; } } [HarmonyPatch(typeof(PlayerControllerB), "Interact_performed")] internal static class PlayerInteract_Patch { [HarmonyPrefix] private static bool Prefix(PlayerControllerB __instance) { try { PlayerControllerB val = GameNetworkManager.Instance?.localPlayerController; if ((Object)(object)val == (Object)null || __instance != val) { return true; } if (__instance.isPlayerDead) { return true; } if (Plugin.IsLegBroken(__instance)) { return true; } if (Plugin.IsCarrying(__instance)) { return true; } PlayerControllerB nearbyBrokenPlayer = Plugin.GetNearbyBrokenPlayer(__instance); if ((Object)(object)nearbyBrokenPlayer == (Object)null) { return true; } Plugin.Logger.LogInfo((object)("[BrokenLeg] " + __instance.playerUsername + " hebt " + nearbyBrokenPlayer.playerUsername + " auf!")); BrokenLegNetwork.ClientNotifyCarry(__instance.actualClientId, nearbyBrokenPlayer.actualClientId); return false; } catch (Exception ex) { Plugin.Logger.LogError((object)("[BrokenLeg] Interact-Patch Fehler: " + ex.Message)); return true; } } } [HarmonyPatch(typeof(PlayerControllerB), "Discard_performed")] internal static class PlayerDiscard_Patch { [HarmonyPrefix] private static bool Prefix(PlayerControllerB __instance) { try { PlayerControllerB val = GameNetworkManager.Instance?.localPlayerController; if ((Object)(object)val == (Object)null || __instance != val) { return true; } if (__instance.isPlayerDead) { return true; } if (Plugin.IsCarrying(__instance)) { PlayerControllerB carriedPlayer = Plugin.GetCarriedPlayer(__instance); if ((Object)(object)carriedPlayer != (Object)null) { Plugin.Logger.LogInfo((object)"[BrokenLeg] Spieler abgelegt (Discard-Taste)!"); BrokenLegNetwork.ClientNotifyDrop(__instance.actualClientId, carriedPlayer.actualClientId); return false; } } } catch (Exception ex) { Plugin.Logger.LogError((object)("[BrokenLeg] Discard-Patch Fehler: " + ex.Message)); } return true; } } [HarmonyPatch(typeof(PlayerControllerB), "KillPlayer")] internal static class Player_KillPlayer_Patch { [HarmonyPostfix] private static void Postfix(PlayerControllerB __instance) { try { ulong actualClientId = __instance.actualClientId; if (Plugin.IsBeingCarried(__instance)) { Plugin.StopCarry(actualClientId); } PlayerControllerB carriedPlayer = Plugin.GetCarriedPlayer(__instance); if ((Object)(object)carriedPlayer != (Object)null) { Plugin.StopCarry(carriedPlayer.actualClientId); } Plugin.HealPlayer(actualClientId); } catch { } } } [HarmonyPatch(typeof(StartOfRound), "Start")] internal static class StartOfRound_Start_Patch { [HarmonyPostfix] private static void Postfix() { BrokenLegNetwork.Register(); BrokenLegUpdater.EnsureExists(); Plugin.Logger.LogInfo((object)"[BrokenLeg] Netzwerk + Updater initialisiert!"); } } [HarmonyPatch(typeof(GameNetworkManager), "Disconnect")] internal static class GameNetworkManager_Disconnect_Patch { [HarmonyPrefix] private static void Prefix() { try { BrokenLegNetwork.Unregister(); Plugin.CleanupAll(); } catch { } } } [HarmonyPatch(typeof(StartOfRound), "ReviveDeadPlayers")] internal static class StartOfRound_ReviveDeadPlayers_Patch { [HarmonyPostfix] private static void Postfix() { Plugin.Logger.LogInfo((object)"[BrokenLeg] Spieler wiederbelebt → Aufraumen!"); Plugin.CleanupAll(); BrokenLegNetwork.HostBroadcastCleanup(); } } [HarmonyPatch(typeof(StartOfRound), "ShipLeave")] internal static class StartOfRound_ShipLeave_Patch { [HarmonyPostfix] private static void Postfix() { Plugin.Logger.LogInfo((object)"[BrokenLeg] Schiff fliegt ab → Aufraumen!"); Plugin.CleanupAll(); BrokenLegNetwork.HostBroadcastCleanup(); } } [HarmonyPatch(typeof(StartOfRound), "ResetShip")] internal static class StartOfRound_ResetShip_Patch { [HarmonyPostfix] private static void Postfix() { Plugin.Logger.LogInfo((object)"[BrokenLeg] Ship Reset → Aufraumen!"); Plugin.CleanupAll(); BrokenLegNetwork.HostBroadcastCleanup(); } } internal class BrokenLegUpdater : MonoBehaviour { private static BrokenLegUpdater _instance; internal static void EnsureExists() { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown if (!((Object)(object)_instance != (Object)null)) { GameObject val = new GameObject("BrokenLegUpdater"); Object.DontDestroyOnLoad((Object)val); _instance = val.AddComponent<BrokenLegUpdater>(); } } private void LateUpdate() { //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) if (Plugin.CarryState.Count == 0) { return; } try { foreach (ulong item in new List<ulong>(Plugin.CarryState.Keys)) { if (!Plugin.CarryState.ContainsKey(item)) { continue; } ulong clientId = Plugin.CarryState[item]; PlayerControllerB playerByClientId = BrokenLegNetwork.GetPlayerByClientId(item); PlayerControllerB playerByClientId2 = BrokenLegNetwork.GetPlayerByClientId(clientId); if ((Object)(object)playerByClientId == (Object)null || (Object)(object)playerByClientId2 == (Object)null) { continue; } if (playerByClientId2.isPlayerDead || playerByClientId.isPlayerDead) { Plugin.StopCarry(item); continue; } if (!playerByClientId2.twoHandedAnimation) { Plugin.SetCarryAnimation(playerByClientId2, enable: true); } Vector3 val = ((Component)playerByClientId2).transform.forward * Plugin.cfgCarryForward.Value - ((Component)playerByClientId2).transform.up * Plugin.cfgCarryDown.Value + ((Component)playerByClientId2).transform.right * Plugin.cfgCarryRight.Value; ((Component)playerByClientId).transform.position = ((Component)playerByClientId2).transform.position + val; Vector3 eulerAngles = ((Component)playerByClientId2).transform.eulerAngles; ((Component)playerByClientId).transform.eulerAngles = new Vector3(0f, eulerAngles.y, 0f); } } catch (Exception ex) { Plugin.Logger.LogError((object)("[BrokenLeg] Updater Fehler: " + ex.Message)); } } } public static class PluginInfo { public const string PLUGIN_GUID = "BrokenLegMod"; public const string PLUGIN_NAME = "BrokenLegMod"; public const string PLUGIN_VERSION = "1.0.0"; } }