Files
LuaCsForBarotraumaEP/Barotrauma/BarotraumaServer/ServerSource/Items/Components/Machines/Steering.cs
2025-03-12 12:56:27 +00:00

136 lines
4.5 KiB
C#

using Barotrauma.Networking;
using Microsoft.Xna.Framework;
namespace Barotrauma.Items.Components
{
partial class Steering : Powered, IServerSerializable, IClientSerializable
{
private readonly struct EventData : IEventData
{
public readonly bool DockingButtonClicked;
public EventData(bool dockingButtonClicked)
{
DockingButtonClicked = dockingButtonClicked;
}
}
[Serialize(defaultValue: false, isSaveable: IsPropertySaveable.Yes, AlwaysUseInstanceValues = true)]
public bool MaintainPos { get; set; }
[Serialize(defaultValue: false, isSaveable: IsPropertySaveable.Yes, AlwaysUseInstanceValues = true)]
public bool LevelStartSelected { get; set; }
[Serialize(defaultValue: false, isSaveable: IsPropertySaveable.Yes, AlwaysUseInstanceValues = true)]
public bool LevelEndSelected { get; set; }
public bool UnsentChanges
{
get { return unsentChanges; }
set { unsentChanges = value; }
}
protected override void RemoveComponentSpecific()
{
base.RemoveComponentSpecific();
pathFinder = null;
}
public void ServerEventRead(IReadMessage msg, Client c)
{
bool autoPilot = msg.ReadBoolean();
bool dockingButtonClicked = msg.ReadBoolean();
Vector2 newSteeringInput = targetVelocity;
Vector2? newPosToMaintain = null;
bool headingToStart = false;
if (autoPilot)
{
bool maintainPos = msg.ReadBoolean();
if (maintainPos)
{
newPosToMaintain = new Vector2(
msg.ReadSingle(),
msg.ReadSingle());
}
else
{
headingToStart = msg.ReadBoolean();
}
}
else
{
newSteeringInput = new Vector2(msg.ReadSingle(), msg.ReadSingle());
}
if (!item.CanClientAccess(c)) { return; }
user = c.Character;
AutoPilot = autoPilot;
if (dockingButtonClicked)
{
item.SendSignal(new Signal("1", sender: c.Character), "toggle_docking");
item.CreateServerEvent(this, new EventData(dockingButtonClicked: true));
}
if (!AutoPilot)
{
steeringInput = newSteeringInput;
steeringAdjustSpeed = MathHelper.Lerp(0.2f, 1.0f, c.Character.GetSkillLevel(Tags.HelmSkill) / 100.0f);
}
else
{
MaintainPos = newPosToMaintain != null;
posToMaintain = newPosToMaintain;
if (posToMaintain == null)
{
LevelStartSelected = headingToStart;
LevelEndSelected = !headingToStart;
UpdatePath();
}
else
{
LevelStartSelected = false;
LevelEndSelected = false;
}
}
//notify all clients of the changed state
unsentChanges = true;
}
public void ServerEventWrite(IWriteMessage msg, Barotrauma.Networking.Client c, NetEntityEvent.IData extraData = null)
{
msg.WriteBoolean(autoPilot);
msg.WriteBoolean(TryExtractEventData<EventData>(extraData, out var eventData) && eventData.DockingButtonClicked);
msg.WriteUInt16(user?.ID ?? Entity.NullEntityID);
if (!autoPilot)
{
//no need to write steering info if autopilot is controlling
msg.WriteSingle(steeringInput.X);
msg.WriteSingle(steeringInput.Y);
msg.WriteSingle(targetVelocity.X);
msg.WriteSingle(targetVelocity.Y);
msg.WriteSingle(steeringAdjustSpeed);
}
else
{
msg.WriteBoolean(posToMaintain != null);
if (posToMaintain != null)
{
msg.WriteSingle(((Vector2)posToMaintain).X);
msg.WriteSingle(((Vector2)posToMaintain).Y);
}
else
{
msg.WriteBoolean(LevelStartSelected);
}
}
}
}
}