Please disclose if any significant portion of your mod was created 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 MultiBossSpawner v1.0.12
MultiBossSpawner.dll
Decompiled 8 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; using Zeitsurfer.MultiBoss.Patches; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.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 Zeitsurfer.MultiBoss { [BepInPlugin("com.zeitsurfer.multiboss", "MultiBoss", "1.0.12")] public class MultiBossPlugin : BaseUnityPlugin { internal static MultiBossPlugin Instance; private Harmony _harmony; internal static ConfigEntry<float> PlayerRadius; internal static ConfigEntry<float> PlayersPerBoss; internal static ConfigEntry<int> MaxExtraBosses; internal static ConfigEntry<string> BossPrefabNamesCsv; internal static ConfigEntry<bool> EndFightOnAnyPlayerDeath; internal static readonly HashSet<GameObject> ActiveBosses = new HashSet<GameObject>(); internal static readonly HashSet<int> SpawnProcessedIDs = new HashSet<int>(); internal static readonly HashSet<Vector3> RecentSpawnCenters = new HashSet<Vector3>(); internal static readonly Dictionary<Vector3, HashSet<long>> FightParticipantsByCenter = new Dictionary<Vector3, HashSet<long>>(); internal static readonly Dictionary<long, Vector3> PlayerParticipationCenters = new Dictionary<long, Vector3>(); internal static float RecentCenterMergeRadius = 40f; private static bool _networkSpawnWarningShown; private void Awake() { //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Expected O, but got Unknown Instance = this; PlayerRadius = ((BaseUnityPlugin)this).Config.Bind<float>("Spawning", "PlayerRadius", 40f, "Radius um den Boss, in dem Spieler gezählt werden."); PlayersPerBoss = ((BaseUnityPlugin)this).Config.Bind<float>("Spawning", "PlayersPerBoss", 2f, "Spieler pro Boss-Gruppe: floor(spieler / n)."); MaxExtraBosses = ((BaseUnityPlugin)this).Config.Bind<int>("Spawning", "MaxExtraBosses", 4, "Maximal zusätzliche Bosse (oberhalb des ersten, also insgesamt bis 1+X)."); BossPrefabNamesCsv = ((BaseUnityPlugin)this).Config.Bind<string>("General", "BossPrefabs", "Eikthyr,TheElder,Bonemass,Dragon,Moder,GoblinKing,Yagluth,SeekerQueen,TheQueen", "CSV der Boss-Prefab-Namen (Teiltreffer erlaubt)."); EndFightOnAnyPlayerDeath = ((BaseUnityPlugin)this).Config.Bind<bool>("Fight", "EndFightOnAnyPlayerDeath", true, "Beende Bosskampf, wenn irgendein Spieler stirbt."); _harmony = new Harmony("com.zeitsurfer.multiboss"); _harmony.PatchAll(typeof(MultiBossPlugin)); _harmony.PatchAll(typeof(CharacterBossSpawnPatches)); _harmony.PatchAll(typeof(CharacterBossCleanup)); _harmony.PatchAll(typeof(PlayerDeathPatches)); _harmony.PatchAll(typeof(ConsoleCommands)); if (ZRoutedRpc.instance != null) { try { ZRoutedRpc.instance.Register<long, string>("MB_PlayerDied", (Action<long, long, string>)RPC_PlayerDied); } catch { } try { ZRoutedRpc.instance.Register("MB_DespawnAll", (Action<long>)RPC_DespawnAll); } catch { } try { ZRoutedRpc.instance.Register<string>("MB_ShowParticipantDeath", (Action<long, string>)RPC_ShowParticipantDeath); } catch { } } ((BaseUnityPlugin)this).Logger.LogInfo((object)"[MultiBoss] 1.0.12 geladen. Server-authoritativ (Dedicated + Host/Singleplayer)."); } private void OnDestroy() { Harmony harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } } internal static bool IsServerDedicated() { if (Object.op_Implicit((Object)(object)ZNet.instance) && ZNet.instance.IsServer()) { return ZNet.instance.IsDedicated(); } return false; } internal static List<Player> GetPlayersInRadius(Vector3 center, float radius) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) List<Player> list = new List<Player>(); Player.GetPlayersInRange(center, radius, list); return list; } internal static bool NameMatches(string prefabOrObjectName, string csv) { if (string.IsNullOrWhiteSpace(prefabOrObjectName)) { return false; } string i = prefabOrObjectName.Trim().ToLowerInvariant(); return (from s in csv.Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries) select s.Trim().ToLowerInvariant()).Any((string token) => i.Contains(token)); } internal static Vector3 FindOrMergeCenter(Vector3 center) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0028: 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) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) foreach (Vector3 item in RecentSpawnCenters.ToList()) { if (Vector3.Distance(item, center) <= RecentCenterMergeRadius) { return item; } } RecentSpawnCenters.Add(center); return center; } internal static void RegisterFightParticipants(Vector3 center) { //IL_001e: 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_0091: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)ZNet.instance) || !ZNet.instance.IsServer() || FightParticipantsByCenter.ContainsKey(center)) { return; } HashSet<long> hashSet = new HashSet<long>(); foreach (Player item in GetPlayersInRadius(center, PlayerRadius.Value)) { if (Object.op_Implicit((Object)(object)item)) { long playerID = item.GetPlayerID(); if (playerID != 0L) { hashSet.Add(playerID); PlayerParticipationCenters[playerID] = center; } } } FightParticipantsByCenter[center] = hashSet; } internal static bool HandleParticipantDeath(long playerId, string playerName) { //IL_0030: 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.op_Implicit((Object)(object)ZNet.instance) || !ZNet.instance.IsServer()) { return false; } if (!PlayerParticipationCenters.TryGetValue(playerId, out var value)) { return false; } if (!FightParticipantsByCenter.TryGetValue(value, out var value2) || value2.Count == 0) { return false; } string text = "Schildbruder " + playerName + " ist gefallen – die Bosse ziehen sich knurrend in den Nebel zurück!"; long num = (((Object)(object)Player.m_localPlayer != (Object)null) ? Player.m_localPlayer.GetPlayerID() : 0); foreach (long item in value2.ToList()) { if (item != 0L) { if (num != 0L && item == num) { ((Character)Player.m_localPlayer).Message((MessageType)2, text, 0, (Sprite)null); } else if (ZRoutedRpc.instance != null) { ZRoutedRpc.instance.InvokeRoutedRPC(item, "MB_ShowParticipantDeath", new object[1] { text }); } } } foreach (long item2 in value2) { PlayerParticipationCenters.Remove(item2); } FightParticipantsByCenter.Remove(value); return true; } internal static void RegisterBoss(GameObject go) { if (Object.op_Implicit((Object)(object)go)) { ActiveBosses.Add(go); } } internal static bool MarkSpawnProcessed(Component c) { if (!Object.op_Implicit((Object)(object)c)) { return false; } int instanceID = ((Object)c.gameObject).GetInstanceID(); if (SpawnProcessedIDs.Contains(instanceID)) { return false; } SpawnProcessedIDs.Add(instanceID); return true; } private void EndAllBossesDelayed() { EndAllBossFights("Delay"); } internal static void EndAllBossFights(string reason = "") { if (!Object.op_Implicit((Object)(object)ZNet.instance) || !ZNet.instance.IsServer()) { return; } foreach (GameObject item in ActiveBosses.ToList()) { if (Object.op_Implicit((Object)(object)item)) { ZNetView component = item.GetComponent<ZNetView>(); if (Object.op_Implicit((Object)(object)component) && component.IsValid() && (Object)(object)ZNetScene.instance != (Object)null) { ZNetScene.instance.Destroy(item); } else { Object.Destroy((Object)(object)item); } } } ActiveBosses.Clear(); RecentSpawnCenters.Clear(); FightParticipantsByCenter.Clear(); PlayerParticipationCenters.Clear(); if (!string.IsNullOrEmpty(reason)) { Debug.Log((object)("[MultiBoss] Bosskampf beendet: " + reason)); } } private void RPC_PlayerDied(long sender, long playerId, string playerName) { if (Object.op_Implicit((Object)(object)ZNet.instance) && ZNet.instance.IsServer() && EndFightOnAnyPlayerDeath.Value && HandleParticipantDeath(playerId, playerName)) { ((MonoBehaviour)this).Invoke("EndAllBossesDelayed", 0.1f); } } private void RPC_DespawnAll(long sender) { if (Object.op_Implicit((Object)(object)ZNet.instance) && ZNet.instance.IsServer()) { ((MonoBehaviour)this).Invoke("EndAllBossesDelayed", 0.05f); } } private void RPC_ShowParticipantDeath(long sender, string message) { if ((Object)(object)Player.m_localPlayer != (Object)null) { ((Character)Player.m_localPlayer).Message((MessageType)2, message, 0, (Sprite)null); } } internal static void TrySpawnExtraBossesNear(Vector3 center, Character original = null) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: 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) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Unknown result type (might be due to invalid IL or missing references) //IL_0194: Unknown result type (might be due to invalid IL or missing references) //IL_0199: Unknown result type (might be due to invalid IL or missing references) //IL_019d: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_0200: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)ZNet.instance) || !ZNet.instance.IsServer()) { return; } int num = Mathf.Max(GetPlayersInRadius(center, PlayerRadius.Value).Count, 1); int num2 = Mathf.Clamp(Mathf.FloorToInt((float)num / PlayersPerBoss.Value), 1, 1 + MaxExtraBosses.Value); int num3 = ActiveBosses.Count((GameObject go) => Object.op_Implicit((Object)(object)go) && Vector3.Distance(go.transform.position, center) <= PlayerRadius.Value * 1.2f); int num4 = Mathf.Max(0, num2 - num3); if (num4 <= 0) { Debug.Log((object)$"[MultiBoss] Spieler:{num} → SollGesamt:{num2}, Existierend:{num3}, Neu:0 @ {center}"); return; } if (!Object.op_Implicit((Object)(object)original)) { GameObject val = ((IEnumerable<GameObject>)ActiveBosses).FirstOrDefault((Func<GameObject, bool>)((GameObject go) => Object.op_Implicit((Object)(object)go) && Vector3.Distance(go.transform.position, center) <= PlayerRadius.Value * 1.2f)); if (Object.op_Implicit((Object)(object)val)) { original = val.GetComponent<Character>(); } } if (!Object.op_Implicit((Object)(object)original)) { return; } string prefabName = Utils.GetPrefabName(((Component)original).gameObject); GameObject prefab = ZNetScene.instance.GetPrefab(prefabName); if (!Object.op_Implicit((Object)(object)prefab)) { Debug.LogWarning((object)("[MultiBoss] Prefab '" + prefabName + "' nicht gefunden.")); return; } float num5 = 8f; for (int i = 0; i < num4; i++) { float num6 = 360f / (float)Mathf.Max(num4, 1) * (float)i * ((float)Math.PI / 180f); Vector3 position = center + new Vector3(Mathf.Cos(num6), 0f, Mathf.Sin(num6)) * num5; GameObject val2 = SpawnBossPrefab(prefab, position, Quaternion.identity); if (Object.op_Implicit((Object)(object)val2)) { ActiveBosses.Add(val2); } } Debug.Log((object)$"[MultiBoss] Spieler:{num} → SollGesamt:{num2}, Existierend:{num3}, Neu:{num4} @ {center}"); } internal static GameObject SpawnBossPrefab(GameObject prefab, Vector3 position, Quaternion rotation) { //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_006e: 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_0030: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)prefab)) { return null; } if ((Object)(object)ZNetScene.instance != (Object)null && ZDOMan.instance != null) { try { string prefabName = Utils.GetPrefabName(prefab); int stableHashCode = StringExtensionMethods.GetStableHashCode(prefabName); GameObject val = TrySpawnWithNetwork(prefab, prefabName, stableHashCode, position, rotation); if (Object.op_Implicit((Object)(object)val)) { return val; } } catch (Exception ex) { if (!_networkSpawnWarningShown) { Debug.LogWarning((object)("[MultiBoss] Netzwerk-Spawn fehlgeschlagen, fallback auf lokale Instanziierung. Fehler: " + ex.Message)); _networkSpawnWarningShown = true; } } } return Object.Instantiate<GameObject>(prefab, position, rotation); } private static GameObject TrySpawnWithNetwork(GameObject prefab, string prefabName, int prefabHash, Vector3 position, Quaternion rotation) { //IL_0000: 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) //IL_001d: 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_0132: Unknown result type (might be due to invalid IL or missing references) ZDO val = CreateNewZDOCompat(position, prefabHash); if (val == null) { return null; } val.SetRotation(rotation); val.SetPrefab(prefabHash); val.SetPosition(position); MethodInfo[] methods = typeof(ZNetScene).GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); foreach (MethodInfo methodInfo in methods) { if (methodInfo.Name != "CreateObject") { continue; } ParameterInfo[] parameters = methodInfo.GetParameters(); object[] array = new object[parameters.Length]; bool flag = true; for (int j = 0; j < parameters.Length; j++) { Type parameterType = parameters[j].ParameterType; if (parameterType == typeof(ZDO)) { array[j] = val; continue; } if (parameterType == typeof(int)) { array[j] = prefabHash; continue; } if (parameterType == typeof(bool)) { array[j] = true; continue; } if (parameterType == typeof(GameObject)) { array[j] = prefab; continue; } if (parameterType == typeof(Vector3)) { array[j] = position; continue; } if (parameterType == typeof(Quaternion)) { array[j] = rotation; continue; } if (parameterType == typeof(string)) { array[j] = prefabName; continue; } flag = false; break; } if (!flag) { continue; } try { object? obj = methodInfo.Invoke(ZNetScene.instance, array); GameObject val2 = (GameObject)((obj is GameObject) ? obj : null); if (val2 != null && Object.op_Implicit((Object)(object)val2)) { return val2; } } catch { } } return null; } private static ZDO CreateNewZDOCompat(Vector3 position, int prefabHash) { //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) ZDOMan instance = ZDOMan.instance; if (instance == null) { return null; } MethodInfo[] methods = ((object)instance).GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); foreach (MethodInfo methodInfo in methods) { if (methodInfo.Name != "CreateNewZDO" || methodInfo.ReturnType != typeof(ZDO)) { continue; } ParameterInfo[] parameters = methodInfo.GetParameters(); try { if (parameters.Length == 2 && parameters[0].ParameterType == typeof(Vector3) && parameters[1].ParameterType == typeof(int)) { object? obj = methodInfo.Invoke(instance, new object[2] { position, prefabHash }); return (ZDO)((obj is ZDO) ? obj : null); } if (parameters.Length == 1 && parameters[0].ParameterType == typeof(Vector3)) { object? obj2 = methodInfo.Invoke(instance, new object[1] { position }); return (ZDO)((obj2 is ZDO) ? obj2 : null); } } catch { } } return null; } internal static Character[] FindAllBossCharacters() { return (from ch in Object.FindObjectsByType<Character>((FindObjectsInactive)0, (FindObjectsSortMode)0) where NameMatches(Utils.GetPrefabName(((Component)ch).gameObject), BossPrefabNamesCsv.Value) select ch).ToArray(); } } internal static class PluginInfo { internal const string GUID = "com.zeitsurfer.multiboss"; internal const string NAME = "MultiBoss"; internal const string VERSION = "1.0.12"; } } namespace Zeitsurfer.MultiBoss.Patches { [HarmonyPatch(typeof(Character))] public static class CharacterBossCleanup { [HarmonyPostfix] [HarmonyPatch("OnDestroy")] private static void Character_OnDestroy_Postfix(Character __instance) { if (Object.op_Implicit((Object)(object)__instance)) { GameObject gameObject = ((Component)__instance).gameObject; if (MultiBossPlugin.ActiveBosses.Contains(gameObject)) { MultiBossPlugin.ActiveBosses.Remove(gameObject); } } } } [HarmonyPatch(typeof(Character))] public static class CharacterBossSpawnPatches { [HarmonyPostfix] [HarmonyPatch("Awake")] private static void Character_Awake_Postfix(Character __instance) { TryHandleBossSpawn(__instance); } [HarmonyPostfix] [HarmonyPatch("Start")] private static void Character_Start_Postfix(Character __instance) { TryHandleBossSpawn(__instance); } private static void TryHandleBossSpawn(Character ch) { //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)ch) || !Object.op_Implicit((Object)(object)ZNet.instance) || !ZNet.instance.IsServer()) { return; } ZNetView component = ((Component)ch).GetComponent<ZNetView>(); if (Object.op_Implicit((Object)(object)component) && component.IsValid()) { GameObject gameObject = ((Component)ch).gameObject; if (MultiBossPlugin.NameMatches(Utils.GetPrefabName(gameObject), MultiBossPlugin.BossPrefabNamesCsv.Value) && MultiBossPlugin.MarkSpawnProcessed((Component)(object)ch)) { MultiBossPlugin.RegisterBoss(gameObject); Vector3 center = MultiBossPlugin.FindOrMergeCenter(((Component)ch).transform.position); MultiBossPlugin.TrySpawnExtraBossesNear(center, ch); MultiBossPlugin.RegisterFightParticipants(center); } } } } [HarmonyPatch(typeof(Terminal))] public static class ConsoleCommands { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static ConsoleEvent <>9__0_0; public static ConsoleEvent <>9__0_1; internal void <Terminal_InitTerminal_Postfix>b__0_0(ConsoleEventArgs args) { //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: 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_0145: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)ZNet.instance)) { Debug.Log((object)"[MultiBoss] [MultiBoss] no ZNet"); } else if (ZNet.instance.IsServer()) { if (MultiBossPlugin.ActiveBosses.Count == 0) { Debug.Log((object)"[MultiBoss] [MultiBoss] no active boss in memory"); return; } Player localPlayer = Player.m_localPlayer; Vector3 val = (Object.op_Implicit((Object)(object)localPlayer) ? ((Component)localPlayer).transform.position : Vector3.zero); Vector3 val2 = val; float num = 1E+09f; foreach (GameObject activeBoss in MultiBossPlugin.ActiveBosses) { if (Object.op_Implicit((Object)(object)activeBoss)) { float num2 = Vector3.Distance(activeBoss.transform.position, val); if (num2 < num) { num = num2; val2 = activeBoss.transform.position; } } } Character val3 = null; foreach (GameObject activeBoss2 in MultiBossPlugin.ActiveBosses) { if (Object.op_Implicit((Object)(object)activeBoss2) && Vector3.Distance(activeBoss2.transform.position, val2) <= MultiBossPlugin.PlayerRadius.Value * 1.2f) { val3 = activeBoss2.GetComponent<Character>(); if (Object.op_Implicit((Object)(object)val3)) { break; } } } if (Object.op_Implicit((Object)(object)val3)) { MultiBossPlugin.TrySpawnExtraBossesNear(val2, val3); Vector3 val4 = val2; Debug.Log((object)("[MultiBoss] [MultiBoss] mb_test: spawned near center " + ((object)(Vector3)(ref val4)).ToString())); } else { Debug.Log((object)"[MultiBoss] [MultiBoss] mb_test: no original found"); } } else { Debug.Log((object)"[MultiBoss] [MultiBoss] mb_test only on server/host"); } } internal void <Terminal_InitTerminal_Postfix>b__0_1(ConsoleEventArgs args) { if (!Object.op_Implicit((Object)(object)ZNet.instance)) { Debug.Log((object)"[MultiBoss] [MultiBoss] no ZNet"); return; } if (ZNet.instance.IsServer()) { ((MonoBehaviour)MultiBossPlugin.Instance).Invoke("EndAllBossesDelayed", 0.1f); Debug.Log((object)"[MultiBoss] [MultiBoss] mb_test2: requested despawn (server)"); return; } ZNetPeer serverPeer = ZNet.instance.GetServerPeer(); if (serverPeer != null && ZRoutedRpc.instance != null) { ZRoutedRpc.instance.InvokeRoutedRPC(serverPeer.m_uid, "MB_DespawnAll", Array.Empty<object>()); Debug.Log((object)"[MultiBoss] [MultiBoss] mb_test2: requested despawn (client->server)"); } else { Debug.Log((object)"[MultiBoss] [MultiBoss] mb_test2: no server peer"); } } } [HarmonyPostfix] [HarmonyPatch("InitTerminal")] private static void Terminal_InitTerminal_Postfix(Terminal __instance) { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Expected O, but got Unknown //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Expected O, but got Unknown object obj = <>c.<>9__0_0; if (obj == null) { ConsoleEvent val = delegate { //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: 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_0145: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)ZNet.instance)) { Debug.Log((object)"[MultiBoss] [MultiBoss] no ZNet"); } else if (ZNet.instance.IsServer()) { if (MultiBossPlugin.ActiveBosses.Count == 0) { Debug.Log((object)"[MultiBoss] [MultiBoss] no active boss in memory"); } else { Player localPlayer = Player.m_localPlayer; Vector3 val3 = (Object.op_Implicit((Object)(object)localPlayer) ? ((Component)localPlayer).transform.position : Vector3.zero); Vector3 val4 = val3; float num = 1E+09f; foreach (GameObject activeBoss in MultiBossPlugin.ActiveBosses) { if (Object.op_Implicit((Object)(object)activeBoss)) { float num2 = Vector3.Distance(activeBoss.transform.position, val3); if (num2 < num) { num = num2; val4 = activeBoss.transform.position; } } } Character val5 = null; foreach (GameObject activeBoss2 in MultiBossPlugin.ActiveBosses) { if (Object.op_Implicit((Object)(object)activeBoss2) && Vector3.Distance(activeBoss2.transform.position, val4) <= MultiBossPlugin.PlayerRadius.Value * 1.2f) { val5 = activeBoss2.GetComponent<Character>(); if (Object.op_Implicit((Object)(object)val5)) { break; } } } if (Object.op_Implicit((Object)(object)val5)) { MultiBossPlugin.TrySpawnExtraBossesNear(val4, val5); Vector3 val6 = val4; Debug.Log((object)("[MultiBoss] [MultiBoss] mb_test: spawned near center " + ((object)(Vector3)(ref val6)).ToString())); } else { Debug.Log((object)"[MultiBoss] [MultiBoss] mb_test: no original found"); } } } else { Debug.Log((object)"[MultiBoss] [MultiBoss] mb_test only on server/host"); } }; <>c.<>9__0_0 = val; obj = (object)val; } new ConsoleCommand("mb_test", "Spawn extra bosses near nearest active boss center (server/host only).", (ConsoleEvent)obj, false, false, false, false, false, (ConsoleOptionsFetcher)null, false, false, false); object obj2 = <>c.<>9__0_1; if (obj2 == null) { ConsoleEvent val2 = delegate { if (!Object.op_Implicit((Object)(object)ZNet.instance)) { Debug.Log((object)"[MultiBoss] [MultiBoss] no ZNet"); } else if (ZNet.instance.IsServer()) { ((MonoBehaviour)MultiBossPlugin.Instance).Invoke("EndAllBossesDelayed", 0.1f); Debug.Log((object)"[MultiBoss] [MultiBoss] mb_test2: requested despawn (server)"); } else { ZNetPeer serverPeer = ZNet.instance.GetServerPeer(); if (serverPeer != null && ZRoutedRpc.instance != null) { ZRoutedRpc.instance.InvokeRoutedRPC(serverPeer.m_uid, "MB_DespawnAll", Array.Empty<object>()); Debug.Log((object)"[MultiBoss] [MultiBoss] mb_test2: requested despawn (client->server)"); } else { Debug.Log((object)"[MultiBoss] [MultiBoss] mb_test2: no server peer"); } } }; <>c.<>9__0_1 = val2; obj2 = (object)val2; } new ConsoleCommand("mb_test2", "Despawn all active bosses (server authoritative).", (ConsoleEvent)obj2, false, false, false, false, false, (ConsoleOptionsFetcher)null, false, false, false); } } [HarmonyPatch(typeof(Player))] public static class PlayerDeathPatches { [HarmonyPostfix] [HarmonyPatch("OnDeath")] private static void Player_OnDeath_Postfix(Player __instance) { if (!Object.op_Implicit((Object)(object)ZNet.instance) || !MultiBossPlugin.EndFightOnAnyPlayerDeath.Value) { return; } long playerID = __instance.GetPlayerID(); string playerName = __instance.GetPlayerName(); if (ZNet.instance.IsServer()) { if (MultiBossPlugin.HandleParticipantDeath(playerID, playerName)) { ((MonoBehaviour)MultiBossPlugin.Instance).Invoke("EndAllBossesDelayed", 0.1f); } return; } ZNetPeer serverPeer = ZNet.instance.GetServerPeer(); if (serverPeer != null && ZRoutedRpc.instance != null) { ZRoutedRpc.instance.InvokeRoutedRPC(serverPeer.m_uid, "MB_PlayerDied", new object[2] { playerID, playerName }); } } } }