using Content.Server.Popups;
-using Content.Shared.Popups;
+using Content.Shared.ActionBlocker;
+using Content.Shared.Input;
+using Content.Shared.Interaction;
using Content.Shared.Rotatable;
using Content.Shared.Verbs;
+using Robust.Shared.Input.Binding;
+using Robust.Shared.Map;
+using Robust.Shared.Player;
using Robust.Shared.Physics;
using Robust.Shared.Physics.Components;
using Robust.Shared.Utility;
public sealed class RotatableSystem : EntitySystem
{
[Dependency] private readonly PopupSystem _popup = default!;
+ [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!;
+ [Dependency] private readonly SharedInteractionSystem _interaction = default!;
public override void Initialize()
{
SubscribeLocalEvent<FlippableComponent, GetVerbsEvent<Verb>>(AddFlipVerb);
SubscribeLocalEvent<RotatableComponent, GetVerbsEvent<Verb>>(AddRotateVerbs);
+
+ CommandBinds.Builder
+ .Bind(ContentKeyFunctions.RotateObjectClockwise, new PointerInputCmdHandler(HandleRotateObjectClockwise))
+ .Bind(ContentKeyFunctions.RotateObjectCounterclockwise, new PointerInputCmdHandler(HandleRotateObjectCounterclockwise))
+ .Bind(ContentKeyFunctions.FlipObject, new PointerInputCmdHandler(HandleFlipObject))
+ .Register<RotatableSystem>();
}
private void AddFlipVerb(EntityUid uid, FlippableComponent component, GetVerbsEvent<Verb> args)
if (!args.CanAccess || !args.CanInteract)
return;
+ // Check if the object is anchored.
+ if (EntityManager.TryGetComponent(uid, out PhysicsComponent? physics) && physics.BodyType == BodyType.Static)
+ return;
+
Verb verb = new()
{
- Act = () => TryFlip(uid, component, args.User),
+ Act = () => Flip(uid, component),
Text = Loc.GetString("flippable-verb-get-data-text"),
Category = VerbCategory.Rotate,
- Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/flip.svg.192dpi.png")),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/flip.svg.192dpi.png")),
Priority = -3, // show flip last
DoContactInteraction = true
};
physics.BodyType == BodyType.Static)
return;
- Verb resetRotation = new ()
+ Verb resetRotation = new()
{
DoContactInteraction = true,
Act = () => EntityManager.GetComponent<TransformComponent>(uid).LocalRotation = Angle.Zero,
Category = VerbCategory.Rotate,
- Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/refresh.svg.192dpi.png")),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/refresh.svg.192dpi.png")),
Text = "Reset",
Priority = -2, // show CCW, then CW, then reset
CloseMenu = false,
{
Act = () => EntityManager.GetComponent<TransformComponent>(uid).LocalRotation -= component.Increment,
Category = VerbCategory.Rotate,
- Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/rotate_cw.svg.192dpi.png")),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/rotate_cw.svg.192dpi.png")),
Priority = -1,
CloseMenu = false, // allow for easy double rotations.
};
{
Act = () => EntityManager.GetComponent<TransformComponent>(uid).LocalRotation += component.Increment,
Category = VerbCategory.Rotate,
- Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/rotate_ccw.svg.192dpi.png")),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/rotate_ccw.svg.192dpi.png")),
Priority = 0,
CloseMenu = false, // allow for easy double rotations.
};
/// <summary>
/// Replace a flippable entity with it's flipped / mirror-symmetric entity.
/// </summary>
- public void TryFlip(EntityUid uid, FlippableComponent component, EntityUid user)
+ public void Flip(EntityUid uid, FlippableComponent component)
{
- if (EntityManager.TryGetComponent(uid, out PhysicsComponent? physics) &&
- physics.BodyType == BodyType.Static)
- {
- _popup.PopupEntity(Loc.GetString("flippable-component-try-flip-is-stuck"), uid, user);
- return;
- }
-
var oldTransform = EntityManager.GetComponent<TransformComponent>(uid);
var entity = EntityManager.SpawnEntity(component.MirrorEntity, oldTransform.Coordinates);
var newTransform = EntityManager.GetComponent<TransformComponent>(entity);
newTransform.Anchored = false;
EntityManager.DeleteEntity(uid);
}
+
+ public bool HandleRotateObjectClockwise(ICommonSession? playerSession, EntityCoordinates coordinates, EntityUid entity)
+ {
+ if (playerSession?.AttachedEntity is not { Valid: true } player || !Exists(player))
+ return false;
+
+ if (!TryComp<RotatableComponent>(entity, out var rotatableComp))
+ return false;
+
+ if (!_actionBlocker.CanInteract(player, entity) || !_interaction.InRangeAndAccessible(player, entity))
+ return false;
+
+ // Check if the object is anchored, and whether we are still allowed to rotate it.
+ if (!rotatableComp.RotateWhileAnchored && EntityManager.TryGetComponent(entity, out PhysicsComponent? physics) &&
+ physics.BodyType == BodyType.Static)
+ {
+ _popup.PopupEntity(Loc.GetString("rotatable-component-try-rotate-stuck"), entity, player);
+ return false;
+ }
+
+ Transform(entity).LocalRotation -= rotatableComp.Increment;
+ return true;
+ }
+
+ public bool HandleRotateObjectCounterclockwise(ICommonSession? playerSession, EntityCoordinates coordinates, EntityUid entity)
+ {
+ if (playerSession?.AttachedEntity is not { Valid: true } player || !Exists(player))
+ return false;
+
+ if (!TryComp<RotatableComponent>(entity, out var rotatableComp))
+ return false;
+
+ if (!_actionBlocker.CanInteract(player, entity) || !_interaction.InRangeAndAccessible(player, entity))
+ return false;
+
+ // Check if the object is anchored, and whether we are still allowed to rotate it.
+ if (!rotatableComp.RotateWhileAnchored && EntityManager.TryGetComponent(entity, out PhysicsComponent? physics) &&
+ physics.BodyType == BodyType.Static)
+ {
+ _popup.PopupEntity(Loc.GetString("rotatable-component-try-rotate-stuck"), entity, player);
+ return false;
+ }
+
+ Transform(entity).LocalRotation += rotatableComp.Increment;
+ return true;
+ }
+
+ public bool HandleFlipObject(ICommonSession? playerSession, EntityCoordinates coordinates, EntityUid entity)
+ {
+ if (playerSession?.AttachedEntity is not { Valid: true } player || !Exists(player))
+ return false;
+
+ if (!TryComp<FlippableComponent>(entity, out var flippableComp))
+ return false;
+
+ if (!_actionBlocker.CanInteract(player, entity) || !_interaction.InRangeAndAccessible(player, entity))
+ return false;
+
+ // Check if the object is anchored.
+ if (EntityManager.TryGetComponent(entity, out PhysicsComponent? physics) && physics.BodyType == BodyType.Static)
+ {
+ _popup.PopupEntity(Loc.GetString("flippable-component-try-flip-is-stuck"), entity, player);
+ return false;
+ }
+
+ Flip(entity, flippableComp);
+ return true;
+ }
}
}