* Initial radial menu prototyping for the RCD * Radial UI buttons can send messages to the server * Beginning to update RCDSystem * RCD building system in progress * Further updates * Added extra effects, RCDSystem now reads RCD prototype data * Replacing tiles is instant, multiple constructions are allowed, deconstruction is broken * Added extra functionality to RadialContainers plus documentation * Fixed localization of RCD UI strings * Menu opens near cursor, added basic RCD * Avoiding merge conflict * Implemented atomized construction / deconstruction rules * Increased RCD ammo base charges * Moved input context definition to content * Removed obsoleted code * Updates to system * Switch machine and computer frames for electrical cabling * Added construction ghosts * Fixed issue with keybind detection code * Fixed RCD construction ghost mispredications * Code clean up * Updated deconstruction effects * RCDs effects don't rotate * Code clean up * Balancing for ammo counts * Code clean up * Added missing localized strings * More clean up * Made directional window handling more robust * Added documentation to radial menus and made them no longer dependent on Content * Made radial containers more robust * Further robustness to the radial menu * The RCD submenu buttons are only shown when the destination layer has at least one children * Expanded upon deconstructing plus construction balance * Fixed line endings * Updated list of RCD deconstructable entities. Now needs a component to deconstruct instead of a tag * Bug fixes * Revert unnecessary change * Updated RCD strings * Fixed bug * More fixes * Deconstructed tiles/subflooring convert to lattice instead * Fixed failed tests (Linux doesn't like invalid spritespecifer paths) * Fixing merge conflict * Updated airlock assembly * Fixing merge conflict * Fixing merge conflict * More fixing... * Removed erroneous project file change * Fixed string handling issue * Trying to fix merge conflict * Still fixing merge conflicts * Balancing * Hidden RCD construction ghosts when in 'build' mode * Fixing merge conflict * Implemented requested changes (Part 1) * Added more requested changes * Fix for failed test. Removed sussy null suppression * Made requested changes - custom construction ghost system was replaced * Fixing merge conflict * Fixed merge conflict * Fixed bug in RCD construction ghost validation * Fixing merge conflict * Merge conflict fixed * Made required update * Removed lingering RCD deconstruct tag * Fixing merge conflict * Merge conflict fixed * Made requested changes * Bug fixes and balancing * Made string names more consistent * Can no longer stack catwalks
138 lines
3.9 KiB
C#
138 lines
3.9 KiB
C#
using Content.Client.UserInterface.Controls;
|
|
using Content.Shared.RCD;
|
|
using Content.Shared.RCD.Components;
|
|
using Robust.Client.AutoGenerated;
|
|
using Robust.Client.GameObjects;
|
|
using Robust.Client.UserInterface;
|
|
using Robust.Client.UserInterface.Controls;
|
|
using Robust.Client.UserInterface.XAML;
|
|
using Robust.Shared.Prototypes;
|
|
using System.Numerics;
|
|
|
|
namespace Content.Client.RCD;
|
|
|
|
[GenerateTypedNameReferences]
|
|
public sealed partial class RCDMenu : RadialMenu
|
|
{
|
|
[Dependency] private readonly EntityManager _entManager = default!;
|
|
[Dependency] private readonly IPrototypeManager _protoManager = default!;
|
|
|
|
private readonly SpriteSystem _spriteSystem;
|
|
|
|
public event Action<ProtoId<RCDPrototype>>? SendRCDSystemMessageAction;
|
|
|
|
public RCDMenu(EntityUid owner, RCDMenuBoundUserInterface bui)
|
|
{
|
|
IoCManager.InjectDependencies(this);
|
|
RobustXamlLoader.Load(this);
|
|
|
|
_spriteSystem = _entManager.System<SpriteSystem>();
|
|
|
|
// Find the main radial container
|
|
var main = FindControl<RadialContainer>("Main");
|
|
|
|
if (main == null)
|
|
return;
|
|
|
|
// Populate secondary radial containers
|
|
if (!_entManager.TryGetComponent<RCDComponent>(owner, out var rcd))
|
|
return;
|
|
|
|
foreach (var protoId in rcd.AvailablePrototypes)
|
|
{
|
|
if (!_protoManager.TryIndex(protoId, out var proto))
|
|
continue;
|
|
|
|
if (proto.Mode == RcdMode.Invalid)
|
|
continue;
|
|
|
|
var parent = FindControl<RadialContainer>(proto.Category);
|
|
|
|
if (parent == null)
|
|
continue;
|
|
|
|
var name = Loc.GetString(proto.SetName);
|
|
name = char.ToUpper(name[0]) + name.Remove(0, 1);
|
|
|
|
var button = new RCDMenuButton()
|
|
{
|
|
StyleClasses = { "RadialMenuButton" },
|
|
SetSize = new Vector2(64f, 64f),
|
|
ToolTip = name,
|
|
ProtoId = protoId,
|
|
};
|
|
|
|
if (proto.Sprite != null)
|
|
{
|
|
var tex = new TextureRect()
|
|
{
|
|
VerticalAlignment = VAlignment.Center,
|
|
HorizontalAlignment = HAlignment.Center,
|
|
Texture = _spriteSystem.Frame0(proto.Sprite),
|
|
TextureScale = new Vector2(2f, 2f),
|
|
};
|
|
|
|
button.AddChild(tex);
|
|
}
|
|
|
|
parent.AddChild(button);
|
|
|
|
// Ensure that the button that transitions the menu to the associated category layer
|
|
// is visible in the main radial container (as these all start with Visible = false)
|
|
foreach (var child in main.Children)
|
|
{
|
|
var castChild = child as RadialMenuTextureButton;
|
|
|
|
if (castChild is not RadialMenuTextureButton)
|
|
continue;
|
|
|
|
if (castChild.TargetLayer == proto.Category)
|
|
{
|
|
castChild.Visible = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Set up menu actions
|
|
foreach (var child in Children)
|
|
AddRCDMenuButtonOnClickActions(child);
|
|
|
|
OnChildAdded += AddRCDMenuButtonOnClickActions;
|
|
|
|
SendRCDSystemMessageAction += bui.SendRCDSystemMessage;
|
|
}
|
|
|
|
private void AddRCDMenuButtonOnClickActions(Control control)
|
|
{
|
|
var radialContainer = control as RadialContainer;
|
|
|
|
if (radialContainer == null)
|
|
return;
|
|
|
|
foreach (var child in radialContainer.Children)
|
|
{
|
|
var castChild = child as RCDMenuButton;
|
|
|
|
if (castChild == null)
|
|
continue;
|
|
|
|
castChild.OnButtonUp += _ =>
|
|
{
|
|
SendRCDSystemMessageAction?.Invoke(castChild.ProtoId);
|
|
Close();
|
|
};
|
|
}
|
|
}
|
|
}
|
|
|
|
public sealed class RCDMenuButton : RadialMenuTextureButton
|
|
{
|
|
public ProtoId<RCDPrototype> ProtoId { get; set; }
|
|
|
|
public RCDMenuButton()
|
|
{
|
|
|
|
}
|
|
}
|