Skip to content
This repository was archived by the owner on Apr 21, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions Content.Client/Input/ContentContexts.cs
Original file line number Diff line number Diff line change
Expand Up @@ -79,11 +79,32 @@ public static void SetupContexts(IInputContextContainer contexts)
human.AddFunction(ContentKeyFunctions.OpenInventoryMenu);
human.AddFunction(ContentKeyFunctions.SmartEquipBackpack);
human.AddFunction(ContentKeyFunctions.SmartEquipBelt);
human.AddFunction(ContentKeyFunctions.SmartEquipPocket1);
human.AddFunction(ContentKeyFunctions.SmartEquipPocket2);
human.AddFunction(ContentKeyFunctions.SmartEquipSuitStorage);
human.AddFunction(ContentKeyFunctions.SmartEquipWallet); // Frontier
// Mono Edit
human.AddFunction(ContentKeyFunctions.SmartEquipID);
human.AddFunction(ContentKeyFunctions.SmartEquipShoes);
human.AddFunction(ContentKeyFunctions.SmartEquipOuterClothing);
human.AddFunction(ContentKeyFunctions.EquipBackpack);
human.AddFunction(ContentKeyFunctions.EquipBelt);
human.AddFunction(ContentKeyFunctions.EquipPocket1);
human.AddFunction(ContentKeyFunctions.EquipPocket2);
human.AddFunction(ContentKeyFunctions.EquipSuitStorage);
human.AddFunction(ContentKeyFunctions.EquipWallet);
human.AddFunction(ContentKeyFunctions.EquipID);
// Mono End
human.AddFunction(ContentKeyFunctions.OpenBackpack);
human.AddFunction(ContentKeyFunctions.OpenBelt);
human.AddFunction(ContentKeyFunctions.ToggleStanding); // EE
human.AddFunction(ContentKeyFunctions.ToggleCrawlingUnder); // EE
// Mono
human.AddFunction(ContentKeyFunctions.OpenPocket1);
human.AddFunction(ContentKeyFunctions.OpenPocket2);
human.AddFunction(ContentKeyFunctions.OpenSuitStorage);
human.AddFunction(ContentKeyFunctions.OpenOuterClothing);
// Mono End
human.AddFunction(ContentKeyFunctions.OpenWallet); // Frontier
human.AddFunction(ContentKeyFunctions.MouseMiddle);
human.AddFunction(ContentKeyFunctions.RotateObjectClockwise);
Expand Down
21 changes: 21 additions & 0 deletions Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -212,9 +212,30 @@ void AddCheckBox(string checkBoxName, bool currentState, Action<BaseButton.Butto
AddHeader("ui-options-header-interaction-adv");
AddButton(ContentKeyFunctions.SmartEquipBackpack);
AddButton(ContentKeyFunctions.SmartEquipBelt);
AddButton(ContentKeyFunctions.SmartEquipPocket1);
AddButton(ContentKeyFunctions.SmartEquipPocket2);
AddButton(ContentKeyFunctions.SmartEquipSuitStorage);
AddButton(ContentKeyFunctions.SmartEquipWallet); // Frontier
// Mono Edit
AddButton(ContentKeyFunctions.SmartEquipID);
AddButton(ContentKeyFunctions.SmartEquipShoes);
AddButton(ContentKeyFunctions.SmartEquipOuterClothing);
AddButton(ContentKeyFunctions.EquipBackpack);
AddButton(ContentKeyFunctions.EquipBelt);
AddButton(ContentKeyFunctions.EquipPocket1);
AddButton(ContentKeyFunctions.EquipPocket2);
AddButton(ContentKeyFunctions.EquipSuitStorage);
AddButton(ContentKeyFunctions.EquipWallet);
AddButton(ContentKeyFunctions.EquipID);
// Mono End
AddButton(ContentKeyFunctions.OpenBackpack);
AddButton(ContentKeyFunctions.OpenBelt);
// Mono
AddButton(ContentKeyFunctions.OpenPocket1);
AddButton(ContentKeyFunctions.OpenPocket2);
AddButton(ContentKeyFunctions.OpenSuitStorage);
AddButton(ContentKeyFunctions.OpenOuterClothing);
// Mono End
AddButton(ContentKeyFunctions.OpenWallet); // Frontier
AddButton(ContentKeyFunctions.ThrowItemInHand);
AddButton(ContentKeyFunctions.TryPullObject);
Expand Down
21 changes: 21 additions & 0 deletions Content.Shared/Input/ContentKeyFunctions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,30 @@ public static class ContentKeyFunctions
public static readonly BoundKeyFunction OpenInventoryMenu = "OpenInventoryMenu";
public static readonly BoundKeyFunction SmartEquipBackpack = "SmartEquipBackpack";
public static readonly BoundKeyFunction SmartEquipBelt = "SmartEquipBelt";
public static readonly BoundKeyFunction SmartEquipPocket1 = "SmartEquipPocket1";
public static readonly BoundKeyFunction SmartEquipPocket2 = "SmartEquipPocket2";
public static readonly BoundKeyFunction SmartEquipSuitStorage = "SmartEquipSuitStorage";
public static readonly BoundKeyFunction SmartEquipWallet = "SmartEquipWallet"; // Frontier
// Mono Edit
public static readonly BoundKeyFunction SmartEquipID = "SmartEquipID"; // Mono - Smart equip to PDA slot
public static readonly BoundKeyFunction SmartEquipShoes = "SmartEquipShoes";
public static readonly BoundKeyFunction SmartEquipOuterClothing = "SmartEquipOuterClothing";
public static readonly BoundKeyFunction EquipBackpack = "EquipBackpack";
public static readonly BoundKeyFunction EquipBelt = "EquipBelt";
public static readonly BoundKeyFunction EquipPocket1 = "EquipPocket1";
public static readonly BoundKeyFunction EquipPocket2 = "EquipPocket2";
public static readonly BoundKeyFunction EquipSuitStorage = "EquipSuitStorage";
public static readonly BoundKeyFunction EquipWallet = "EquipWallet";
public static readonly BoundKeyFunction EquipID = "EquipID";
// Mono End
public static readonly BoundKeyFunction OpenBackpack = "OpenBackpack";
public static readonly BoundKeyFunction OpenBelt = "OpenBelt";
// Mono Edit
public static readonly BoundKeyFunction OpenPocket1 = "OpenPocket1";
public static readonly BoundKeyFunction OpenPocket2 = "OpenPocket2";
public static readonly BoundKeyFunction OpenSuitStorage = "OpenSuitStorage";
public static readonly BoundKeyFunction OpenOuterClothing = "OpenOuterClothing";
// Mono End
public static readonly BoundKeyFunction OpenWallet = "OpenWallet"; // Frontier
public static readonly BoundKeyFunction OpenAHelp = "OpenAHelp";
public static readonly BoundKeyFunction SwapHands = "SwapHands";
Expand Down
33 changes: 15 additions & 18 deletions Content.Shared/Interaction/SmartEquipSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,17 @@ public sealed class SmartEquipSystem : EntitySystem
public override void Initialize()
{
CommandBinds.Builder
.Bind(ContentKeyFunctions.SmartEquipBackpack, InputCmdHandler.FromDelegate(HandleSmartEquipBackpack, handle: false, outsidePrediction: false))
.Bind(ContentKeyFunctions.SmartEquipBelt, InputCmdHandler.FromDelegate(HandleSmartEquipBelt, handle: false, outsidePrediction: false))
.Bind(ContentKeyFunctions.SmartEquipWallet, InputCmdHandler.FromDelegate(HandleSmartEquipWallet, handle: false, outsidePrediction: false)) // Frontier
// Mono
.Bind(ContentKeyFunctions.SmartEquipBackpack, InputCmdHandler.FromDelegate(HandleSmartEquipPartial("back"), handle: false, outsidePrediction: false))
.Bind(ContentKeyFunctions.SmartEquipBelt, InputCmdHandler.FromDelegate(HandleSmartEquipPartial("belt"), handle: false, outsidePrediction: false))
.Bind(ContentKeyFunctions.SmartEquipPocket1, InputCmdHandler.FromDelegate(HandleSmartEquipPartial("pocket1"), handle: false, outsidePrediction: false))
.Bind(ContentKeyFunctions.SmartEquipPocket2, InputCmdHandler.FromDelegate(HandleSmartEquipPartial("pocket2"), handle: false, outsidePrediction: false))
.Bind(ContentKeyFunctions.SmartEquipSuitStorage, InputCmdHandler.FromDelegate(HandleSmartEquipPartial("suitstorage"), handle: false, outsidePrediction: false))
.Bind(ContentKeyFunctions.SmartEquipWallet, InputCmdHandler.FromDelegate(HandleSmartEquipPartial("wallet"), handle: false, outsidePrediction: false)) // Frontier
.Bind(ContentKeyFunctions.SmartEquipID, InputCmdHandler.FromDelegate(HandleSmartEquipPartial("id"), handle: false, outsidePrediction: false))
.Bind(ContentKeyFunctions.SmartEquipShoes, InputCmdHandler.FromDelegate(HandleSmartEquipPartial("shoes"), handle: false, outsidePrediction: false))
.Bind(ContentKeyFunctions.SmartEquipOuterClothing, InputCmdHandler.FromDelegate(HandleSmartEquipPartial("outerClothing"), handle: false, outsidePrediction: false))
// Mono End
.Register<SmartEquipSystem>();
}

Expand All @@ -45,22 +53,11 @@ public override void Shutdown()

CommandBinds.Unregister<SmartEquipSystem>();
}

private void HandleSmartEquipBackpack(ICommonSession? session)
{
HandleSmartEquip(session, "back");
}

private void HandleSmartEquipBelt(ICommonSession? session)
{
HandleSmartEquip(session, "belt");
}
// Frontier: smart-equip to wallet
private void HandleSmartEquipWallet(ICommonSession? session)
{
HandleSmartEquip(session, "wallet");
// Mono, Partial Application of 2nd Argument
private StateInputCmdDelegate HandleSmartEquipPartial(string equipmentSlot) {
return (x) => HandleSmartEquip(x, equipmentSlot);
}
// End Frontier: smart-equip to wallet
// Mono End
private void HandleSmartEquip(ICommonSession? session, string equipmentSlot)
{
if (session is not { } playerSession)
Expand Down
27 changes: 27 additions & 0 deletions Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,12 @@ public override void Initialize()
.Bind(ContentKeyFunctions.OpenBackpack, InputCmdHandler.FromDelegate(HandleOpenBackpack, handle: false))
.Bind(ContentKeyFunctions.OpenBelt, InputCmdHandler.FromDelegate(HandleOpenBelt, handle: false))
.Bind(ContentKeyFunctions.OpenWallet, InputCmdHandler.FromDelegate(HandleOpenWallet, handle: false)) // Frontier
// Mono
.Bind(ContentKeyFunctions.OpenPocket1, InputCmdHandler.FromDelegate(HandleOpenPocket1, handle: false))
.Bind(ContentKeyFunctions.OpenPocket2, InputCmdHandler.FromDelegate(HandleOpenPocket2, handle: false))
.Bind(ContentKeyFunctions.OpenSuitStorage, InputCmdHandler.FromDelegate(HandleOpenSuitStorage, handle: false))
.Bind(ContentKeyFunctions.OpenOuterClothing, InputCmdHandler.FromDelegate(HandleOuterClothing, handle: false))
// Mono End
.Register<SharedStorageSystem>();

Subs.CVar(_cfg, CCVars.NestedStorage, OnNestedStorageCvar, true);
Expand Down Expand Up @@ -1698,6 +1704,27 @@ private void HandleOpenWallet(ICommonSession? session)
HandleToggleSlotUI(session, "wallet");
}
// End Frontier: open wallet
// Mono Edit
private void HandleOpenPocket1(ICommonSession? session)
{
HandleToggleSlotUI(session, "pocket1");
}

private void HandleOpenPocket2(ICommonSession? session)
{
HandleToggleSlotUI(session, "pocket2");
}

private void HandleOpenSuitStorage(ICommonSession? session)
{
HandleToggleSlotUI(session, "suitstorage");
}

private void HandleOuterClothing(ICommonSession? session)
{
HandleToggleSlotUI(session, "outerClothing");
}
// Mono End
private void HandleToggleSlotUI(ICommonSession? session, string slot)
{
if (session is not { } playerSession)
Expand Down
116 changes: 116 additions & 0 deletions Content.Shared/_Goobstation/Interaction/BackEquipSystem.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
// SPDX-FileCopyrightText: 2025 Ark
// SPDX-FileCopyrightText: 2025 Daniel Lenrd
//
// SPDX-License-Identifier: MPL-2.0

using Content.Shared.ActionBlocker;
using Content.Shared.Containers.ItemSlots;
using Content.Shared.Hands.Components;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Input;
using Content.Shared.Interaction;
using Content.Shared.Inventory;
using Content.Shared.Popups;
using Content.Shared.Storage.EntitySystems;
using Content.Shared.Whitelist;
using Robust.Shared.Containers;
using Robust.Shared.Input.Binding;
using Robust.Shared.Player;

namespace Content.Shared._Goobstation.Interaction;

public sealed class BackEquipSystem : EntitySystem
{
[Dependency] private readonly SharedHandsSystem _hands = default!;
[Dependency] private readonly InventorySystem _inventory = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly ActionBlockerSystem _actionBlocker = default!;

public override void Initialize()
{
CommandBinds.Builder
// Mono, Partial Application of 2nd Argument
.Bind(ContentKeyFunctions.EquipBackpack, InputCmdHandler.FromDelegate(HandleEquipToSlotPartial("back"), handle: false, outsidePrediction: false))
.Bind(ContentKeyFunctions.EquipBelt, InputCmdHandler.FromDelegate(HandleEquipToSlotPartial("belt"), handle: false, outsidePrediction: false))
.Bind(ContentKeyFunctions.EquipPocket1, InputCmdHandler.FromDelegate(HandleEquipToSlotPartial("pocket1"), handle: false, outsidePrediction: false))
.Bind(ContentKeyFunctions.EquipPocket2, InputCmdHandler.FromDelegate(HandleEquipToSlotPartial("pocket2"), handle: false, outsidePrediction: false))
.Bind(ContentKeyFunctions.EquipSuitStorage, InputCmdHandler.FromDelegate(HandleEquipToSlotPartial("suitstorage"), handle: false, outsidePrediction: false))
.Bind(ContentKeyFunctions.EquipWallet, InputCmdHandler.FromDelegate(HandleEquipToSlotPartial("wallet"), handle: false, outsidePrediction: false))
.Bind(ContentKeyFunctions.EquipID, InputCmdHandler.FromDelegate(HandleEquipToSlotPartial("id"), handle: false, outsidePrediction: false))
// Mono End
.Register<BackEquipSystem>();
}

public override void Shutdown()
{
base.Shutdown();

CommandBinds.Unregister<BackEquipSystem>();
}
// Mono, Partial Application of 2nd Argument
private StateInputCmdDelegate HandleEquipToSlotPartial(string equipmentSlot) {
return (x) => HandleEquipToSlot(x, equipmentSlot);
}
// Mono End
private void HandleEquipToSlot(ICommonSession? session, string equipmentSlot)
{
if (session is not { } playerSession)
return;

if (playerSession.AttachedEntity is not { Valid: true } uid || !Exists(uid))
return;

if (!TryComp<HandsComponent>(uid, out var hands) || hands.ActiveHand == null)
return;

var handItem = hands.ActiveHand.HeldEntity;

if (!_actionBlocker.CanInteract(uid, handItem))
return;

if (!TryComp<InventoryComponent>(uid, out var inventory) || !_inventory.HasSlot(uid, equipmentSlot, inventory))
{
_popup.PopupClient(Loc.GetString("smart-equip-missing-equipment-slot", ("slotName", equipmentSlot)),
uid,
uid);
return;
}

if (handItem != null && !_hands.CanDropHeld(uid, hands.ActiveHand))
{
_popup.PopupClient(Loc.GetString("smart-equip-cant-drop"), uid, uid);
return;
}

_inventory.TryGetSlotEntity(uid, equipmentSlot, out var slotEntity);
var emptyEquipmentSlotString = Loc.GetString("smart-equip-empty-equipment-slot", ("slotName", equipmentSlot));
if (slotEntity is not { } slotItem)
{
if (handItem == null)
{
_popup.PopupClient(emptyEquipmentSlotString, uid, uid);
return;
}

if (!_inventory.CanEquip(uid, handItem.Value, equipmentSlot, out var reason))
{
_popup.PopupClient(Loc.GetString(reason), uid, uid);
return;
}

_hands.TryDrop(uid, hands.ActiveHand, handsComp: hands);
_inventory.TryEquip(uid, handItem.Value, equipmentSlot, predicted: true, checkDoafter: true);
return;
}
if (handItem != null)
return;

if (!_inventory.CanUnequip(uid, equipmentSlot, out var inventoryReason))
{
_popup.PopupClient(Loc.GetString(inventoryReason), uid, uid);
return;
}
_inventory.TryUnequip(uid, equipmentSlot, inventory: inventory, predicted: true, checkDoafter: true);
_hands.TryPickup(uid, slotItem, handsComp: hands);
}
}
21 changes: 21 additions & 0 deletions Resources/Locale/en-US/_Mono/escape-menu/ui/options-menu.ftl
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
## Controls menu

ui-options-function-smart-equip-pocket1 = Smart-equip to 1st pocket
ui-options-function-smart-equip-pocket2 = Smart-equip to 2nd pocket
ui-options-function-smart-equip-suit-storage = Smart-equip to shoulder
ui-options-function-smart-equip-id = Smart-equip to PDA slot
ui-options-function-smart-equip-shoes = Smart-equip to boots
ui-options-function-smart-equip-outer-clothing = Smart-equip to armor storage

ui-options-function-equip-backpack = Quick-equip to backpack
ui-options-function-equip-belt = Quick-equip to belt
ui-options-function-equip-suit-storage = Quick-equip to shoulder
ui-options-function-equip-pocket1 = Quick-equip to 1st pocket
ui-options-function-equip-pocket2 = Quick-equip to 2nd pocket
ui-options-function-equip-id = Quick-equip to PDA slot
ui-options-function-equip-wallet = Quick-equip to wallet

ui-options-function-open-pocket1 = Open 1st pocket
ui-options-function-open-pocket2 = Open 2nd pocket
ui-options-function-open-suit-storage = Open shoulder storage
ui-options-function-open-outer-clothing = Open armor storage
Loading
Loading