using System.Collections.Generic; using System.Reflection; using System.Reflection.Emit; using HarmonyLib; using NitroxClient.Communication.Abstract; using NitroxClient.GameLogic; using NitroxModel.DataStructures; using NitroxModel.Helper; using NitroxModel.Packets; namespace NitroxPatcher.Patches.Dynamic; /// /// Syncs fish deletion once it ages to adult state. /// public sealed partial class WaterParkCreature_ManagedUpdate_Patch : NitroxPatch, IDynamicPatch { public static readonly MethodInfo TARGET_METHOD = Reflect.Method((WaterParkCreature t) => t.ManagedUpdate()); /* * MODIFIED: * WaterParkCreature.Born(adultPrefab, this.currentWaterPark, base.transform.position); * base.SetWaterPark(null); * WaterParkCreature_ManagedUpdate_Patch.CreatureDestroyedCallback(this); <--- INSERTED * UnityEngine.Object.Destroy(base.gameObject); */ public static IEnumerable Transpiler(IEnumerable instructions) { return new CodeMatcher(instructions).MatchEndForward([ new CodeMatch(OpCodes.Ldarg_0), new CodeMatch(OpCodes.Ldnull), new CodeMatch(OpCodes.Call, Reflect.Method((WaterParkItem t) => t.SetWaterPark(default))), ]) .Advance(1) .InsertAndAdvance([ new CodeInstruction(OpCodes.Ldarg_0), new CodeInstruction(OpCodes.Call, Reflect.Method(() => CreatureDestroyedCallback(default))) ]) .InstructionEnumeration(); } public static void CreatureDestroyedCallback(WaterParkCreature waterParkCreature) { // We don't manage eggs with no id here if (!waterParkCreature.TryGetNitroxId(out NitroxId creatureId)) { return; } // It is VERY IMPORTANT to check for simulation ownership on the water park and not on the egg // since that's the convention we chose if (waterParkCreature.currentWaterPark.TryGetNitroxId(out NitroxId waterParkId) && Resolve().HasAnyLockType(waterParkId)) { Resolve().Send(new EntityDestroyed(creatureId)); } } }