first commit

This commit is contained in:
2025-07-06 00:23:46 +02:00
commit 38f50c8819
1788 changed files with 112878 additions and 0 deletions

View File

@@ -0,0 +1,96 @@
using System.Collections;
using NitroxClient.Communication.Packets.Processors.Abstract;
using NitroxClient.GameLogic;
using NitroxClient.MonoBehaviours;
using NitroxClient.Unity.Helper;
using NitroxModel.Packets;
using UnityEngine;
namespace NitroxClient.Communication.Packets.Processors;
public class VehicleUndockingProcessor : ClientPacketProcessor<VehicleUndocking>
{
private readonly Vehicles vehicles;
private readonly PlayerManager remotePlayerManager;
public VehicleUndockingProcessor(Vehicles vehicles, PlayerManager remotePlayerManager)
{
this.vehicles = vehicles;
this.remotePlayerManager = remotePlayerManager;
}
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.RequireComponent<VehicleDockingBay>();
using (PacketSuppressor<VehicleUndocking>.Suppress())
{
if (packet.UndockingStart)
{
StartVehicleUndocking(packet, vehicleGo, vehicle, vehicleDockingBay);
}
else
{
FinishVehicleUndocking(packet, vehicle, vehicleDockingBay);
}
}
}
private void StartVehicleUndocking(VehicleUndocking packet, GameObject vehicleGo, Vehicle vehicle, VehicleDockingBay vehicleDockingBay)
{
vehicleDockingBay.subRoot.BroadcastMessage("OnLaunchBayOpening", SendMessageOptions.DontRequireReceiver);
SkyEnvironmentChanged.Broadcast(vehicleGo, (GameObject)null);
if (remotePlayerManager.TryFind(packet.PlayerId, out RemotePlayer player))
{
// It can happen that the player turns in circles around himself in the vehicle. This stops it.
player.RigidBody.angularVelocity = Vector3.zero;
vehicles.SetOnPilotMode(packet.VehicleId, packet.PlayerId, true);
}
vehicleDockingBay.StartCoroutine(StartUndockingAnimation(vehicleDockingBay));
if (vehicle.TryGetComponent(out MovementReplicator vehicleMovementReplicator))
{
vehicleMovementReplicator.ClearBuffer();
Log.Debug($"[{nameof(VehicleDockingProcessor)}] Clear MovementReplicator on {packet.VehicleId}");
}
}
private static IEnumerator StartUndockingAnimation(VehicleDockingBay vehicleDockingBay)
{
yield return Yielders.WaitFor2Seconds;
vehicleDockingBay.vehicle_docked_param = false;
}
private void FinishVehicleUndocking(VehicleUndocking packet, Vehicle vehicle, VehicleDockingBay vehicleDockingBay)
{
if (vehicleDockingBay.GetSubRoot().isCyclops)
{
vehicleDockingBay.SetVehicleUndocked();
}
vehicleDockingBay.dockedVehicle = null;
vehicleDockingBay.CancelInvoke(nameof(VehicleDockingBay.RepairVehicle));
vehicle.docked = false;
if (remotePlayerManager.TryFind(packet.PlayerId, out RemotePlayer player))
{
// Sometimes the player is not set accordingly which stretches the player's model instead of putting them in place
// after undocking. This fixes it (the player rigid body seems to not be set right sometimes)
player.SetSubRoot(null);
player.SetVehicle(null);
player.SetVehicle(vehicle);
}
vehicles.SetOnPilotMode(packet.VehicleId, packet.PlayerId, true);
if (vehicle.TryGetComponent(out MovementReplicator vehicleMovementReplicator))
{
vehicleMovementReplicator.enabled = true;
Log.Debug($"[{nameof(VehicleDockingProcessor)}] Enabled MovementReplicator on {packet.VehicleId}");
}
Log.Debug("Set vehicle undocking complete");
}
}