* started work * some more work, ui working (somewhat) * stuff * reorganization * some more reorg * conveyors * conveyors working * finalized (dis)connection added linkattempt added feedback text work on conveyors * removed command add rangecheck * fixed inrange check * handling * ui no longer kanser, ship it * adresses reviews * reformats file * reformats file Co-authored-by: Paul <ritter.paul1+git@googlemail.com>
165 lines
4.6 KiB
C#
165 lines
4.6 KiB
C#
using Content.Server.Items;
|
|
using Content.Server.MachineLinking.Components;
|
|
using Content.Server.Power.Components;
|
|
using Content.Shared.Conveyor;
|
|
using Content.Shared.MachineLinking;
|
|
using Robust.Server.GameObjects;
|
|
using Robust.Shared.Containers;
|
|
using Robust.Shared.GameObjects;
|
|
using Robust.Shared.Maths;
|
|
using Robust.Shared.Physics;
|
|
using Robust.Shared.Serialization.Manager.Attributes;
|
|
using Robust.Shared.ViewVariables;
|
|
|
|
namespace Content.Server.Conveyor
|
|
{
|
|
[RegisterComponent]
|
|
public class ConveyorComponent : Component
|
|
{
|
|
public override string Name => "Conveyor";
|
|
|
|
[ViewVariables] private bool Powered => !Owner.TryGetComponent(out ApcPowerReceiverComponent? receiver) || receiver.Powered;
|
|
|
|
/// <summary>
|
|
/// The angle to move entities by in relation to the owner's rotation.
|
|
/// </summary>
|
|
[ViewVariables(VVAccess.ReadWrite)]
|
|
[DataField("angle")]
|
|
private Angle _angle = Angle.Zero;
|
|
|
|
public float Speed => _speed;
|
|
|
|
/// <summary>
|
|
/// The amount of units to move the entity by per second.
|
|
/// </summary>
|
|
[ViewVariables(VVAccess.ReadWrite)]
|
|
[DataField("speed")]
|
|
private float _speed = 2f;
|
|
|
|
private ConveyorState _state;
|
|
/// <summary>
|
|
/// The current state of this conveyor
|
|
/// </summary>
|
|
[ViewVariables(VVAccess.ReadWrite)]
|
|
private ConveyorState State
|
|
{
|
|
get => _state;
|
|
set
|
|
{
|
|
_state = value;
|
|
UpdateAppearance();
|
|
}
|
|
}
|
|
|
|
public override void HandleMessage(ComponentMessage message, IComponent? component)
|
|
{
|
|
base.HandleMessage(message, component);
|
|
switch (message)
|
|
{
|
|
case PowerChangedMessage powerChanged:
|
|
OnPowerChanged(powerChanged);
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void OnPowerChanged(PowerChangedMessage e)
|
|
{
|
|
UpdateAppearance();
|
|
}
|
|
|
|
private void UpdateAppearance()
|
|
{
|
|
if (Owner.TryGetComponent<AppearanceComponent>(out var appearance))
|
|
{
|
|
if (Powered)
|
|
{
|
|
appearance.SetData(ConveyorVisuals.State, _state);
|
|
}
|
|
else
|
|
{
|
|
appearance.SetData(ConveyorVisuals.State, ConveyorState.Off);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Calculates the angle in which entities on top of this conveyor
|
|
/// belt are pushed in
|
|
/// </summary>
|
|
/// <returns>
|
|
/// The angle when taking into account if the conveyor is reversed
|
|
/// </returns>
|
|
public Angle GetAngle()
|
|
{
|
|
var adjustment = _state == ConveyorState.Reversed ? MathHelper.Pi : 0;
|
|
var radians = MathHelper.DegreesToRadians(_angle);
|
|
|
|
return new Angle(Owner.Transform.LocalRotation.Theta + radians + adjustment);
|
|
}
|
|
|
|
public bool CanRun()
|
|
{
|
|
if (State == ConveyorState.Off)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (Owner.TryGetComponent(out ApcPowerReceiverComponent? receiver) &&
|
|
!receiver.Powered)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (Owner.HasComponent<ItemComponent>())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public bool CanMove(IEntity entity)
|
|
{
|
|
// TODO We should only check status InAir or Static or MapGrid or /mayber/ container
|
|
if (entity == Owner)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (!entity.TryGetComponent(out IPhysBody? physics) ||
|
|
physics.BodyType == BodyType.Static)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (entity.HasComponent<ConveyorComponent>())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (entity.HasComponent<IMapGridComponent>())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (entity.IsInContainer())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public void SetState(TwoWayLeverSignal signal)
|
|
{
|
|
State = signal switch
|
|
{
|
|
TwoWayLeverSignal.Left => ConveyorState.Reversed,
|
|
TwoWayLeverSignal.Middle => ConveyorState.Off,
|
|
TwoWayLeverSignal.Right => ConveyorState.Forward,
|
|
_ => ConveyorState.Off
|
|
};
|
|
}
|
|
}
|
|
}
|