public static void SendDocked(VehicleDockingBay bay, Vehicle vehicle, bool status) { if (bay == null || vehicle == null || Multiplayer.main.blocked) { return; } var sync = vehicle.GetComponent <SyncedVehicle>(); if (sync != null && sync.activePlayer != null) { return; } var res = new ClientVehicleDocking(); res.id = Multiplayer.main.self.id; res.vehicleGuid = GuidHelper.Get(vehicle.gameObject); res.bayGuid = GuidHelper.Get(bay.gameObject); res.subGuid = GuidHelper.Get(bay.subRoot?.gameObject); res.bayPosition = bay.transform.position; res.docked = status; Multiplayer.main.Send(res); }
private void OnVehiclePrefabLoaded(GameObject prefab, string guid, Vector3 spawnPosition, Quaternion spawnRotation, Optional <List <InteractiveChildObjectIdentifier> > interactiveChildIdentifiers, Optional <string> dockingBayGuid) { // Partially copied from SubConsoleCommand.OnSubPrefabLoaded GameObject gameObject = Utils.SpawnPrefabAt(prefab, null, spawnPosition); gameObject.transform.rotation = spawnRotation; gameObject.SetActive(true); gameObject.SendMessage("StartConstruction", SendMessageOptions.DontRequireReceiver); CrafterLogic.NotifyCraftEnd(gameObject, CraftData.GetTechType(gameObject)); Rigidbody rigidBody = gameObject.GetComponent <Rigidbody>(); rigidBody.isKinematic = false; GuidHelper.SetNewGuid(gameObject, guid); if (interactiveChildIdentifiers.IsPresent()) { VehicleChildObjectIdentifierHelper.SetInteractiveChildrenGuids(gameObject, interactiveChildIdentifiers.Get()); //Copy From ConstructorBeginCraftingProcessor } if (dockingBayGuid.IsPresent()) { GameObject dockingBayBase = GuidHelper.RequireObjectFrom(dockingBayGuid.Get()); VehicleDockingBay dockingBay = dockingBayBase.GetComponentInChildren <VehicleDockingBay>(); Vehicle vehicle = gameObject.GetComponent <Vehicle>(); dockingBay.DockVehicle(vehicle); } }
public bool ShouldApplyNextHealthUpdate(LiveMixin reciever, GameObject dealer = null) { NitroxId id = NitroxEntity.GetId(reciever.gameObject); if (!simulationOwnership.HasAnyLockType(id) && !processingRemoteHealthChange) { return(false); } // Check to see if this health change is caused by docked vehicle collisions. If so, we don't want to apply it. if (dealer) { Vehicle dealerVehicle = dealer.GetComponent <Vehicle>(); VehicleDockingBay vehicleDockingBay = reciever.GetComponentInChildren <VehicleDockingBay>(); if (vehicleDockingBay && dealerVehicle) { if (vehicleDockingBay.GetDockedVehicle() == dealerVehicle || vehicleDockingBay.interpolatingVehicle == dealerVehicle || vehicleDockingBay.nearbyVehicle == dealerVehicle) { Log.Debug($"Dealer {dealer} is vehicle and currently docked or nearby {reciever}, do not harm it!"); return(false); } } } return(true); }
public void BroadcastVehicleUndocking(VehicleDockingBay dockingBay, Vehicle vehicle, bool undockingStart) { NitroxId dockId; if (dockingBay.GetSubRoot() is BaseRoot) { dockId = NitroxEntity.GetId(dockingBay.GetComponentInParent <BaseRoot>().gameObject); } else if (dockingBay.GetSubRoot() is SubRoot) { dockId = NitroxEntity.GetId(dockingBay.GetSubRoot().gameObject); } else { dockId = NitroxEntity.GetId(dockingBay.GetComponentInParent <ConstructableBase>().gameObject); } NitroxId vehicleId = NitroxEntity.GetId(vehicle.gameObject); ushort playerId = multiplayerSession.Reservation.PlayerId; PacketSuppressor <Movement> movementSuppressor = packetSender.Suppress <Movement>(); PacketSuppressor <VehicleMovement> vehicleMovementSuppressor = packetSender.Suppress <VehicleMovement>(); if (!undockingStart) { movementSuppressor.Dispose(); vehicleMovementSuppressor.Dispose(); } VehicleUndocking packet = new VehicleUndocking(vehicleId, dockId, playerId, undockingStart); packetSender.Send(packet); }
public static bool Prefix(DockedVehicleHandTarget __instance, GUIHand hand) { vehicleDockingBay = __instance.dockingBay; Vehicle vehicle = vehicleDockingBay.GetDockedVehicle(); if (skipPrefix || vehicle == null) { return(true); } dockedVehicle = __instance; guiHand = hand; SimulationOwnership simulationOwnership = NitroxServiceLocator.LocateService <SimulationOwnership>(); NitroxId id = NitroxEntity.GetId(vehicle.gameObject); if (simulationOwnership.HasExclusiveLock(id)) { Log.Debug($"Already have an exclusive lock on this vehicle: {id}"); return(true); } simulationOwnership.RequestSimulationLock(id, SimulationLockType.EXCLUSIVE, ReceivedSimulationLockResponse); return(false); }
private static void Postfix(VehicleDockingBay __instance) { if (__instance.subRoot is BaseRoot) { __instance.StartCoroutine(CreateConsole(__instance)); } }
public static bool Prefix(VehicleDockingBay __instance, Collider other) { Vehicle vehicle = other.GetComponentInParent <Vehicle>(); prevInterpolatingVehicle = __instance.interpolatingVehicle; return(vehicle == null || NitroxServiceLocator.LocateService <SimulationOwnership>().HasAnyLockType(NitroxEntity.GetId(vehicle.gameObject))); }
private static IEnumerator CreateConsole(VehicleDockingBay __instance) { if (prefab == null) { yield return(CreatePrefab()); } GameObject console = GameObject.Instantiate(prefab); console.transform.SetParent(__instance.transform, false); console.transform.localPosition = new Vector3(4.96f, 1.4f, 3.23f); console.transform.localEulerAngles = new Vector3(0, 42.5f, 0); console.AddComponent <MoonpoolTerminalController>(); var terminalManager = console.GetComponent <CyclopsVehicleStorageTerminalManager>(); terminalManager.dockingBay = __instance; // This resets and then calls the OnDockingChanged event handler console.SetActive(false); console.SetActive(true); CyclopsVehicleStorageTerminalManager_OnDockedChanged.Invoke(terminalManager, new object[] { }); var mesh = console.transform.Find("Mesh").gameObject; var meshRenderer = mesh.GetComponent <MeshRenderer>(); console.SetActive(false); var skyApplier = console.AddComponent <SkyApplier>(); skyApplier.dynamic = true; skyApplier.renderers = new Renderer[] { meshRenderer }; skyApplier.anchorSky = Skies.BaseInterior; console.SetActive(true); }
private static bool Prefix(VehicleDockingBay __instance) { if (__instance != null) { Dockable docked = __instance.GetDockedObject(); if (docked != null) { if (docked.name.Contains("SeaTruck")) { MainPatch.seaTruckIsDocked = true; } else if (docked.name.Contains("Exosuit")) { MainPatch.exoSuitIsDocked = true; } } else { MainPatch.seaTruckIsDocked = false; MainPatch.exoSuitIsDocked = false; } } return(false); }
public void BroadcastVehicleDocking(VehicleDockingBay dockingBay, Vehicle vehicle) { NitroxId dockId; if (dockingBay.GetSubRoot() is BaseRoot) { dockId = NitroxEntity.GetId(dockingBay.GetComponentInParent <BaseRoot>().gameObject); } else if (dockingBay.GetSubRoot() is SubRoot) { dockId = NitroxEntity.GetId(dockingBay.GetSubRoot().gameObject); } else { dockId = NitroxEntity.GetId(dockingBay.GetComponentInParent <ConstructableBase>().gameObject); } NitroxId vehicleId = NitroxEntity.GetId(vehicle.gameObject); ushort playerId = multiplayerSession.Reservation.PlayerId; VehicleDocking packet = new VehicleDocking(vehicleId, dockId, playerId); packetSender.Send(packet); PacketSuppressor <Movement> movementSuppressor = packetSender.Suppress <Movement>(); vehicle.StartCoroutine(AllowMovementPacketsAfterDockingAnimation(movementSuppressor)); }
public static bool Prefix(VehicleDockingBay __instance, GameObject nearby) { SubRoot cyclops = UWE.Utils.GetComponentInHierarchy <SubRoot>(nearby.gameObject); if (cyclops != null && !InceptionManager.DockedCyclopses.Contains(cyclops)) { if ((bool)__instance.GetInstanceField("powered")) { SubRoot main = __instance.GetSubRoot(); main.BroadcastMessage("OnLaunchBayOpening", SendMessageOptions.DontRequireReceiver); main.BroadcastMessage("LockDoors", SendMessageOptions.DontRequireReceiver); if ((bool)__instance.GetInstanceField("soundReset")) { if (__instance.bayDoorsOpenSFX != null) { __instance.bayDoorsOpenSFX.Play(); } __instance.SetInstanceField("soundReset", false); __instance.Invoke("SoundReset", 1f); } } __instance.SetInstanceField("nearbyVehicle", null); return(false); } return(true); }
protected override void SpawnPostProcess(Base latestBase, Int3 latestCell, GameObject finishedPiece) { NitroxId moonpoolId = NitroxEntity.GetId(finishedPiece); VehicleDockingBay dockingBay = finishedPiece.RequireComponentInChildren <VehicleDockingBay>(); NitroxId dockingBayId = moonpoolId.Increment(); NitroxEntity.SetNewId(dockingBay.gameObject, dockingBayId); }
private static void Postfix(VehicleDockingBay __instance) { if (!(__instance.subRoot is BaseRoot)) { return; } (__instance).CancelInvoke("GetDockedObject"); (__instance).InvokeRepeating("GetDockedObject", 0.0f, 1f); }
static void Postfix(VehicleDockingBay __instance) { var CinematicHatchControl = __instance.subRoot.GetComponentInChildren <CinematicHatchControl>(); if (CinematicHatchControl != null) { CinematicHatchControl.hatch.Invoke(nameof(CinematicHatchControl.hatch.Close), 5.5f); } }
IEnumerator WaitBeforePushDown(Vehicle vehicle, VehicleDockingBay vehicleDockingBay) { yield return(new WaitForSeconds(6.0f)); vehicleDockingBay.SetVehicleUndocked(); vehicleDockingBay.ReflectionSet("vehicle_docked_param", false); vehicleDockingBay.ReflectionSet("_dockedVehicle", null); vehicle.docked = false; vehicle.useRigidbody.AddForce(Vector3.down * 5f, ForceMode.VelocityChange); }
public static bool Prefix(VehicleDockingBay __instance, Collider other) { SubRoot cyclops = UWE.Utils.GetComponentInHierarchy <SubRoot>(other.gameObject); if (cyclops == null || InceptionManager.DockedCyclopses.ContainsKey(cyclops) || InceptionManager.GetRecentlyUndocked(cyclops) || __instance.GetDockedVehicle() || (GameModeUtils.RequiresPower() && !(bool)__instance.GetInstanceField("powered")) || (Vehicle)__instance.GetInstanceField("interpolatingVehicle") != null) { return(true); } InceptionManager.DockedCyclopses.Add(cyclops, __instance.GetSubRoot()); return(false); }
private static void Postfix(VehicleDockingBay __instance) { bool flag = __instance.subRoot is BaseRoot; bool flag2 = flag; if (flag2) { __instance.CancelInvoke("OnUndockingStart"); __instance.InvokeRepeating("OnUndockingStart", 0.0f, 1f); } }
/// <summary> /// Indicates if a LiveMixin object should execute TakeDamage or HealthBack method /// </summary> /// <param name="reciever">The one who takes damage or gets health back</param> /// <param name="healthChange">The amount of health it gets back or damage dealt</param> /// <param name="dealer">Damage dealer</param> /// <returns>Tuple where the first item indicates execution and the second indicates if the player has the ownership of the reciever GameObject (if vehicle)</returns> public ExecutionAndOwnership ShouldExecute(LiveMixin reciever, float healthChange, GameObject dealer) { Vehicle vehicle = reciever.GetComponent <Vehicle>(); SubRoot subRoot = reciever.GetComponent <SubRoot>(); if (vehicle != null || subRoot != null && subRoot.isCyclops) { NitroxId id = NitroxEntity.GetId(reciever.gameObject); bool isOutstandingPresent = outstandingChangeHealth.TryGetValue(id, out Tuple <float, float> healthChangeAndTotal) && healthChangeAndTotal.Item1 == healthChange && healthChangeAndTotal.Item2 == reciever.health; bool hasOwnership = simulationOwnership.HasAnyLockType(id); // We either have a lock or an outstanding health change with the same health change and current total health when we execute the code if (!hasOwnership && !isOutstandingPresent) { return(new ExecutionAndOwnership(false, false)); } // Remove the outstandingHealthChange if present. if (isOutstandingPresent) { outstandingChangeHealth.Remove(id); } if (healthChange > 0) { return(new ExecutionAndOwnership(true, hasOwnership)); } // To prevent damage that happens while docking, we check if dealer is the vehicle that is also docked. VehicleDockingBay vehicleDockingBay = reciever.GetComponent <VehicleDockingBay>(); if (!vehicleDockingBay) { vehicleDockingBay = reciever.GetComponentInChildren <VehicleDockingBay>(); } Vehicle dealerVehicle = dealer.GetComponent <Vehicle>(); if (vehicleDockingBay && dealerVehicle) { if (vehicleDockingBay.GetDockedVehicle() == dealerVehicle || (Vehicle)vehicleDockingBay.ReflectionGet("interpolatingVehicle") == dealerVehicle || (Vehicle)vehicleDockingBay.ReflectionGet("nearbyVehicle") == dealerVehicle) { Log.Debug($"Dealer {dealer} is vehicle and currently docked or nearby {reciever}, do not harm it!"); return(new ExecutionAndOwnership(false, false)); } } return(new ExecutionAndOwnership(true, hasOwnership)); } return(new ExecutionAndOwnership(true, false)); }
public static void Postfix(VehicleDockingBay __instance, Collider other) { Vehicle interpolatingVehicle = (Vehicle)__instance.ReflectionGet("interpolatingVehicle"); NitroxId id = NitroxEntity.GetId(interpolatingVehicle.gameObject); // Only send data, when interpolatingVehicle changes to avoid multiple packages send if (interpolatingVehicle && interpolatingVehicle != prevInterpolatingVehicle && NitroxServiceLocator.LocateService <SimulationOwnership>().HasAnyLockType(id)) { Log.Debug($"Will send vehicle docking for {id}"); NitroxServiceLocator.LocateService <Vehicles>().BroadcastVehicleDocking(__instance, interpolatingVehicle); } }
public void BroadcastVehicleUndocking(VehicleDockingBay dockingBay, Vehicle vehicle) { string dockGuid = GuidHelper.GetGuid(dockingBay.gameObject); string vehicleGuid = GuidHelper.GetGuid(vehicle.gameObject); ushort playerId = multiplayerSession.Reservation.PlayerId; VehicleUndocking packet = new VehicleUndocking(vehicleGuid, dockGuid, playerId); packetSender.Send(packet); PacketSuppressor <Movement> movementSuppressor = packetSender.Suppress <Movement>(); vehicle.StartCoroutine(AllowMovementPacketsAfterDockingAnimation(movementSuppressor)); }
public override void Process(VehicleDocking packet) { GameObject vehicleGo = GuidHelper.RequireObjectFrom(packet.VehicleGuid); GameObject vehicleDockingBayGo = GuidHelper.RequireObjectFrom(packet.DockGuid); Vehicle vehicle = vehicleGo.RequireComponent <Vehicle>(); VehicleDockingBay vehicleDockingBay = vehicleDockingBayGo.RequireComponent <VehicleDockingBay>(); using (packetSender.Suppress <VehicleDocking>()) { vehicleDockingBay.DockVehicle(vehicle); } vehicle.StartCoroutine(DisablePilotingAfterAnimation(packet.VehicleGuid, packet.PlayerId)); }
public override void Process(VehicleDocking packet) { GameObject vehicleGo = NitroxEntity.RequireObjectFrom(packet.VehicleId); GameObject vehicleDockingBayGo = NitroxEntity.RequireObjectFrom(packet.DockId); Vehicle vehicle = vehicleGo.RequireComponent <Vehicle>(); VehicleDockingBay vehicleDockingBay = vehicleDockingBayGo.RequireComponentInChildren <VehicleDockingBay>(); using (packetSender.Suppress <VehicleDocking>()) { vehicleDockingBay.SetVehicleDocked(vehicle); } vehicle.StartCoroutine(DisablePilotingAfterAnimation(packet.VehicleId, packet.PlayerId)); }
IEnumerator DelayAnimationAndDisablePiloting(Vehicle vehicle, VehicleDockingBay vehicleDockingBay, NitroxId vehicleId, ushort playerId) { yield return(new WaitForSeconds(1.0f)); // DockVehicle sets the rigid body kinematic of the vehicle to true, we don't want that behaviour // Therefore disable kinematic (again) to remove the bouncing behavior vehicleDockingBay.DockVehicle(vehicle); vehicle.useRigidbody.isKinematic = false; yield return(new WaitForSeconds(2.0f)); vehicles.SetOnPilotMode(vehicleId, playerId, false); if (!vehicle.docked) { Log.Error($"Vehicle {vehicleId} not docked after docking process"); } }
public override void Process(VehicleDocking packet) { GameObject vehicleGo = NitroxEntity.RequireObjectFrom(packet.VehicleId); GameObject vehicleDockingBayGo = NitroxEntity.RequireObjectFrom(packet.DockId); Vehicle vehicle = vehicleGo.RequireComponent <Vehicle>(); VehicleDockingBay vehicleDockingBay = vehicleDockingBayGo.RequireComponent <VehicleDockingBay>(); using (packetSender.Suppress <VehicleDocking>()) { Log.Debug($"Set vehicle docked for {vehicleDockingBay.gameObject.name}"); vehicle.GetComponent <MultiplayerVehicleControl>().SetPositionVelocityRotation(vehicle.transform.position, Vector3.zero, vehicle.transform.rotation, Vector3.zero); vehicle.GetComponent <MultiplayerVehicleControl>().Exit(); } vehicle.StartCoroutine(DelayAnimationAndDisablePiloting(vehicle, vehicleDockingBay, packet.VehicleId, packet.PlayerId)); }
public void BroadcastVehicleDocking(VehicleDockingBay dockingBay, Vehicle vehicle) { NitroxId dockId = NitroxEntity.GetId(dockingBay.gameObject); NitroxId vehicleId = NitroxEntity.GetId(vehicle.gameObject); ushort playerId = multiplayerSession.Reservation.PlayerId; VehicleDocking packet = new VehicleDocking(vehicleId, dockId, playerId); packetSender.Send(packet); PacketSuppressor <Movement> movementSuppressor = packetSender.Suppress <Movement>(); PacketSuppressor <VehicleMovement> vehicleMovementSuppressor = packetSender.Suppress <VehicleMovement>(); vehicle.StartCoroutine(AllowMovementPacketsAfterDockingAnimation(movementSuppressor, vehicleMovementSuppressor)); }
public static void Postfix(VehicleDockingBay __instance) { Vehicle interpolatingVehicle = __instance.interpolatingVehicle; // Only send data, when interpolatingVehicle changes to avoid multiple packages send if (!interpolatingVehicle || interpolatingVehicle == prevInterpolatingVehicle) { return; } NitroxId id = NitroxEntity.GetId(interpolatingVehicle.gameObject); if (NitroxServiceLocator.LocateService <SimulationOwnership>().HasAnyLockType(id)) { Log.Debug($"Will send vehicle docking for {id}"); NitroxServiceLocator.LocateService <Vehicles>().BroadcastVehicleDocking(__instance, interpolatingVehicle); } }
public override void Process(VehicleUndocking packet) { GameObject vehicleGo = GuidHelper.RequireObjectFrom(packet.VehicleGuid); GameObject vehicleDockingBayGo = GuidHelper.RequireObjectFrom(packet.DockGuid); Vehicle vehicle = vehicleGo.RequireComponent <Vehicle>(); VehicleDockingBay vehicleDockingBay = vehicleDockingBayGo.RequireComponentInChildren <VehicleDockingBay>(); using (packetSender.Suppress <VehicleUndocking>()) { vehicles.SetOnPilotMode(packet.VehicleGuid, packet.PlayerId, true); vehicleDockingBay.subRoot.BroadcastMessage("OnLaunchBayOpening", SendMessageOptions.DontRequireReceiver); SkyEnvironmentChanged.Broadcast(vehicleGo, (GameObject)null); vehicleDockingBay.ReflectionSet("_dockedVehicle", null); vehicle.docked = false; vehicle.useRigidbody.AddForce(Vector3.down * 5f, ForceMode.VelocityChange); } }
private static void ReceivedSimulationLockResponse(NitroxId id, bool lockAquired, HandInteraction <DockedVehicleHandTarget> context) { if (lockAquired) { VehicleDockingBay dockingBay = context.Target.dockingBay; NitroxServiceLocator.LocateService <Vehicles>().BroadcastVehicleUndocking(dockingBay, dockingBay.GetDockedVehicle(), true); skipPrefix = true; context.Target.OnHandClick(context.GuiHand); skipPrefix = false; } else { HandReticle.main.SetInteractText("Another player is using this vehicle!"); HandReticle.main.SetIcon(HandReticle.IconType.HandDeny, 1f); context.Target.isValidHandTarget = false; } }
public override void Process(VehicleUndocking packet) { GameObject vehicleGo = NitroxEntity.RequireObjectFrom(packet.VehicleId); GameObject vehicleDockingBayGo = NitroxEntity.RequireObjectFrom(packet.DockId); Vehicle vehicle = vehicleGo.RequireComponent <Vehicle>(); VehicleDockingBay vehicleDockingBay = vehicleDockingBayGo.RequireComponentInChildren <VehicleDockingBay>(); using (packetSender.Suppress <VehicleUndocking>()) { vehicles.SetOnPilotMode(packet.VehicleId, packet.PlayerId, true); vehicleDockingBay.subRoot.BroadcastMessage("OnLaunchBayOpening", SendMessageOptions.DontRequireReceiver); SkyEnvironmentChanged.Broadcast(vehicleGo, (GameObject)null); vehicle.StartCoroutine(WaitBeforePushDown(vehicle, vehicleDockingBay)); } }
public void BroadcastVehicleUndocking(VehicleDockingBay dockingBay, Vehicle vehicle) { string dockGuid = string.Empty; if (dockingBay.GetSubRoot() is BaseRoot) { dockGuid = GuidHelper.GetGuid(dockingBay.GetComponentInParent <BaseRoot>().gameObject); } else { dockGuid = GuidHelper.GetGuid(dockingBay.GetComponentInParent <ConstructableBase>().gameObject); } string vehicleGuid = GuidHelper.GetGuid(vehicle.gameObject); ushort playerId = multiplayerSession.Reservation.PlayerId; VehicleUndocking packet = new VehicleUndocking(vehicleGuid, dockGuid, playerId); packetSender.Send(packet); }