Files
Nitrox/NitroxClient/MonoBehaviours/PlayerMovementBroadcaster.cs
2025-07-06 00:23:46 +02:00

75 lines
2.7 KiB
C#

using NitroxClient.Communication.Abstract;
using NitroxClient.GameLogic;
using NitroxModel.Packets;
using NitroxModel_Subnautica.DataStructures;
using UnityEngine;
namespace NitroxClient.MonoBehaviours;
public class PlayerMovementBroadcaster : MonoBehaviour
{
private LocalPlayer localPlayer;
public void Awake()
{
localPlayer = this.Resolve<LocalPlayer>();
}
public void Update()
{
// Freecam does disable main camera control
// But it's also disabled when driving the cyclops through a cyclops camera (content.activeSelf is only true when controlling through a cyclops camera)
if (!MainCameraControl.main.isActiveAndEnabled &&
!uGUI_CameraCyclops.main.content.activeSelf)
{
return;
}
if (BroadcastPlayerInCyclopsMovement())
{
return;
}
if (Player.main.isPiloting)
{
return;
}
Vector3 currentPosition = Player.main.transform.position;
Vector3 playerVelocity = Player.main.playerController.velocity;
// IDEA: possibly only CameraRotation is of interest, because bodyrotation is extracted from that.
Quaternion bodyRotation = MainCameraControl.main.viewModel.transform.rotation;
Quaternion aimingRotation = Player.main.camRoot.GetAimingTransform().rotation;
SubRoot subRoot = Player.main.GetCurrentSub();
// If in a subroot the position will be relative to the subroot
if (subRoot)
{
// Rotate relative player position relative to the subroot (else there are problems with respawning)
Transform subRootTransform = subRoot.transform;
Quaternion undoVehicleAngle = subRootTransform.rotation.GetInverse();
currentPosition = currentPosition - subRootTransform.position;
currentPosition = undoVehicleAngle * currentPosition;
bodyRotation = undoVehicleAngle * bodyRotation;
aimingRotation = undoVehicleAngle * aimingRotation;
currentPosition = subRootTransform.TransformPoint(currentPosition);
}
localPlayer.BroadcastLocation(currentPosition, playerVelocity, bodyRotation, aimingRotation);
}
private bool BroadcastPlayerInCyclopsMovement()
{
if (!Player.main.isPiloting && Player.main.TryGetComponent(out CyclopsMotor cyclopsMotor) && cyclopsMotor.Pawn != null)
{
Transform pawnTransform = cyclopsMotor.Pawn.Handle.transform;
PlayerInCyclopsMovement packet = new(this.Resolve<LocalPlayer>().PlayerId.Value, pawnTransform.localPosition.ToDto(), pawnTransform.localRotation.ToDto());
this.Resolve<IPacketSender>().Send(packet);
return true;
}
return false;
}
}