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

75 lines
2.7 KiB
C#

using NitroxClient.Communication.Abstract;
using NitroxClient.MonoBehaviours;
using NitroxClient.Unity.Helper;
using NitroxModel.DataStructures;
using NitroxModel.DataStructures.Unity;
using NitroxModel_Subnautica.DataStructures;
using NitroxModel_Subnautica.Packets;
using UnityEngine;
namespace NitroxClient.GameLogic
{
public class Rockets
{
private readonly IPacketSender packetSender;
private readonly Vehicles vehicles;
private readonly PlayerManager playerManager;
public Rockets(IPacketSender packetSender, Vehicles vehicles, PlayerManager playerManager)
{
this.packetSender = packetSender;
this.vehicles = vehicles;
this.playerManager = playerManager;
}
public void RequestRocketLaunch(Rocket rocket)
{
if (rocket.TryGetNitroxEntity(out NitroxEntity entity))
{
packetSender.Send(new RocketLaunch(entity.Id));
}
else
{
Log.Error($"{nameof(Rockets.RequestRocketLaunch)}: Can't find a NitroxEntity attached to the Rocket: {rocket.name}");
}
}
public void RocketLaunch(NitroxId rocketId)
{
// Avoid useless calculations
if (LaunchRocket.launchStarted)
{
return;
}
GameObject rocketObject = NitroxEntity.RequireObjectFrom(rocketId);
GameObject sphereCenter = rocketObject.FindChild("AtmosphereVolume");
LaunchRocket launchRocket = rocketObject.RequireComponentInChildren<LaunchRocket>(true);
// Only launch if you're in the rocket so
// verify if the distance to a centered point in the middle of the stage 3 of the rocket is inferior to 5.55 (pre-calculated radius)
if (Player.main.IsUnderwater() ||
Player.main.currentSub ||
NitroxVector3.Distance(Player.main.transform.position.ToDto(), sphereCenter.transform.position.ToDto()) > 5.55f)
{
return;
}
// When the server sends this to the client, he should execute the rocket launch
// Code extracted from LaunchRocket::OnHandClick
LaunchRocket.SetLaunchStarted();
PlayerTimeCapsule.main.Submit(null);
launchRocket.StartCoroutine(launchRocket.StartEndCinematic());
HandReticle.main.RequestCrosshairHide();
// We also need to hide the other players
foreach (RemotePlayer player in playerManager.GetAll())
{
player.PlayerModel.SetActive(false);
}
Log.InGame(Language.main.Get("Nitrox_ThankForPlaying"));
}
}
}