From 6a462221ff0eb89df52df7265b194dd6d2533357 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Tue, 13 Aug 2024 15:36:41 +0200 Subject: [PATCH] Add keybinds for rotating and flipping objects (#30540) * add keybinds for rotating and flipping objects * no popup for verbs --- Content.Client/Input/ContentContexts.cs | 3 + .../Options/UI/Tabs/KeyRebindTab.xaml.cs | 3 + Content.Server/Rotatable/RotatableSystem.cs | 108 +++++++++++++++--- Content.Shared/Input/ContentKeyFunctions.cs | 3 + .../en-US/escape-menu/ui/options-menu.ftl | 3 + Resources/keybinds.yml | 10 ++ 6 files changed, 115 insertions(+), 15 deletions(-) diff --git a/Content.Client/Input/ContentContexts.cs b/Content.Client/Input/ContentContexts.cs index 7a8a993854..639f326f7f 100644 --- a/Content.Client/Input/ContentContexts.cs +++ b/Content.Client/Input/ContentContexts.cs @@ -74,6 +74,9 @@ namespace Content.Client.Input human.AddFunction(ContentKeyFunctions.OpenBackpack); human.AddFunction(ContentKeyFunctions.OpenBelt); human.AddFunction(ContentKeyFunctions.MouseMiddle); + human.AddFunction(ContentKeyFunctions.RotateObjectClockwise); + human.AddFunction(ContentKeyFunctions.RotateObjectCounterclockwise); + human.AddFunction(ContentKeyFunctions.FlipObject); human.AddFunction(ContentKeyFunctions.ArcadeUp); human.AddFunction(ContentKeyFunctions.ArcadeDown); human.AddFunction(ContentKeyFunctions.ArcadeLeft); diff --git a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs index 6fa416ed59..24be904e06 100644 --- a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs +++ b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs @@ -195,6 +195,9 @@ namespace Content.Client.Options.UI.Tabs AddButton(ContentKeyFunctions.MovePulledObject); AddButton(ContentKeyFunctions.ReleasePulledObject); AddButton(ContentKeyFunctions.Point); + AddButton(ContentKeyFunctions.RotateObjectClockwise); + AddButton(ContentKeyFunctions.RotateObjectCounterclockwise); + AddButton(ContentKeyFunctions.FlipObject); AddHeader("ui-options-header-ui"); AddButton(ContentKeyFunctions.FocusChat); diff --git a/Content.Server/Rotatable/RotatableSystem.cs b/Content.Server/Rotatable/RotatableSystem.cs index a9df60c45b..63b5e44c3d 100644 --- a/Content.Server/Rotatable/RotatableSystem.cs +++ b/Content.Server/Rotatable/RotatableSystem.cs @@ -1,7 +1,12 @@ 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; @@ -14,11 +19,19 @@ namespace Content.Server.Rotatable 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>(AddFlipVerb); SubscribeLocalEvent>(AddRotateVerbs); + + CommandBinds.Builder + .Bind(ContentKeyFunctions.RotateObjectClockwise, new PointerInputCmdHandler(HandleRotateObjectClockwise)) + .Bind(ContentKeyFunctions.RotateObjectCounterclockwise, new PointerInputCmdHandler(HandleRotateObjectCounterclockwise)) + .Bind(ContentKeyFunctions.FlipObject, new PointerInputCmdHandler(HandleFlipObject)) + .Register(); } private void AddFlipVerb(EntityUid uid, FlippableComponent component, GetVerbsEvent args) @@ -26,12 +39,16 @@ namespace Content.Server.Rotatable 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 }; @@ -51,12 +68,12 @@ namespace Content.Server.Rotatable physics.BodyType == BodyType.Static) return; - Verb resetRotation = new () + Verb resetRotation = new() { DoContactInteraction = true, Act = () => EntityManager.GetComponent(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, @@ -68,7 +85,7 @@ namespace Content.Server.Rotatable { Act = () => EntityManager.GetComponent(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. }; @@ -79,7 +96,7 @@ namespace Content.Server.Rotatable { Act = () => EntityManager.GetComponent(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. }; @@ -89,15 +106,8 @@ namespace Content.Server.Rotatable /// /// Replace a flippable entity with it's flipped / mirror-symmetric entity. /// - 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(uid); var entity = EntityManager.SpawnEntity(component.MirrorEntity, oldTransform.Coordinates); var newTransform = EntityManager.GetComponent(entity); @@ -105,5 +115,73 @@ namespace Content.Server.Rotatable 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(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(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(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; + } } } diff --git a/Content.Shared/Input/ContentKeyFunctions.cs b/Content.Shared/Input/ContentKeyFunctions.cs index 97b3f9ea04..863d9da970 100644 --- a/Content.Shared/Input/ContentKeyFunctions.cs +++ b/Content.Shared/Input/ContentKeyFunctions.cs @@ -43,6 +43,9 @@ namespace Content.Shared.Input public static readonly BoundKeyFunction MovePulledObject = "MovePulledObject"; public static readonly BoundKeyFunction ReleasePulledObject = "ReleasePulledObject"; public static readonly BoundKeyFunction MouseMiddle = "MouseMiddle"; + public static readonly BoundKeyFunction RotateObjectClockwise = "RotateObjectClockwise"; + public static readonly BoundKeyFunction RotateObjectCounterclockwise = "RotateObjectCounterclockwise"; + public static readonly BoundKeyFunction FlipObject = "FlipObject"; public static readonly BoundKeyFunction ToggleRoundEndSummaryWindow = "ToggleRoundEndSummaryWindow"; public static readonly BoundKeyFunction OpenEntitySpawnWindow = "OpenEntitySpawnWindow"; public static readonly BoundKeyFunction OpenSandboxWindow = "OpenSandboxWindow"; diff --git a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl index 39a72260e2..384b369101 100644 --- a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl +++ b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl @@ -156,6 +156,9 @@ ui-options-function-try-pull-object = Pull object ui-options-function-move-pulled-object = Move pulled object ui-options-function-release-pulled-object = Release pulled object ui-options-function-point = Point at location +ui-options-function-rotate-object-clockwise = Rotate clockwise +ui-options-function-rotate-object-counterclockwise = Rotate counterclockwise +ui-options-function-flip-object = Flip ui-options-function-focus-chat-input-window = Focus chat ui-options-function-focus-local-chat-window = Focus chat (IC) diff --git a/Resources/keybinds.yml b/Resources/keybinds.yml index e9d63c2a90..43deb8d89b 100644 --- a/Resources/keybinds.yml +++ b/Resources/keybinds.yml @@ -269,6 +269,16 @@ binds: type: State key: MouseMiddle canFocus: true +- function: RotateObjectClockwise + type: State + key: R +- function: RotateObjectCounterclockwise + type: State + key: R + mod1: Shift +- function: FlipObject + type: State + key: F - function: TextCursorLeft type: State key: Left -- 2.52.0