using System.Reflection; using NitroxClient.Communication.Abstract; using NitroxClient.GameLogic; using NitroxModel.DataStructures; using NitroxModel.DataStructures.Util; using NitroxModel.Helper; using NitroxModel.Packets; using UnityEngine; namespace NitroxPatcher.Patches.Dynamic; public sealed partial class VehicleDockingBay_OnTriggerEnter : NitroxPatch, IDynamicPatch { private static readonly MethodInfo targetMethod = Reflect.Method((VehicleDockingBay t) => t.OnTriggerEnter(default(Collider))); public static bool Prefix(VehicleDockingBay __instance, Collider other, ref Vehicle __state) { Vehicle vehicle = other.GetComponentInParent(); __state = __instance.interpolatingVehicle; Optional opVehicleId = vehicle.GetId(); return !vehicle || (opVehicleId.HasValue && Resolve().HasAnyLockType(opVehicleId.Value)); } public static void Postfix(VehicleDockingBay __instance, ref Vehicle __state) { Vehicle interpolatingVehicle = __instance.interpolatingVehicle; // Only send data, when interpolatingVehicle changes to avoid multiple packages send if (!interpolatingVehicle || interpolatingVehicle == __state) { return; } if (__instance.gameObject.TryGetIdOrWarn(out NitroxId dockId) && interpolatingVehicle.TryGetIdOrWarn(out NitroxId vehicleId) && Resolve().HasAnyLockType(vehicleId)) { Vehicles.EngagePlayerMovementSuppressor(interpolatingVehicle); Resolve().Send(new VehicleDocking(vehicleId, dockId, Resolve().Reservation.PlayerId)); } } }