using System; using System.Collections.Generic; using Content.Shared.GameObjects; using Content.Shared.GameObjects.EntitySystemMessages; using Content.Shared.Input; using Robust.Client.GameObjects.EntitySystems; using Robust.Client.Interfaces.Input; using Robust.Client.Interfaces.State; using Robust.Client.Interfaces.UserInterface; using Robust.Client.Player; using Robust.Client.State.States; using Robust.Client.UserInterface.Controls; using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Systems; using Robust.Shared.Input; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.Network; using Robust.Shared.IoC; using Robust.Shared.Log; using Robust.Shared.Map; using Robust.Shared.Maths; using Robust.Shared.Utility; namespace Content.Client.GameObjects.EntitySystems { public class VerbSystem : EntitySystem { #pragma warning disable 649 [Dependency] private readonly IStateManager _stateManager; [Dependency] private readonly IEntityManager _entityManager; [Dependency] private readonly IPlayerManager _playerManager; [Dependency] private readonly IInputManager _inputManager; [Dependency] private readonly IUserInterfaceManager _userInterfaceManager; #pragma warning restore 649 private Popup _currentPopup; private EntityUid _currentEntity; public override void Initialize() { base.Initialize(); IoCManager.InjectDependencies(this); var input = EntitySystemManager.GetEntitySystem(); input.BindMap.BindFunction(ContentKeyFunctions.OpenContextMenu, new PointerInputCmdHandler(OnOpenContextMenu)); } public override void RegisterMessageTypes() { base.RegisterMessageTypes(); RegisterMessageType(); } public void OpenContextMenu(IEntity entity, ScreenCoordinates screenCoordinates) { if (_currentPopup != null) { _closeContextMenu(); } _currentEntity = entity.Uid; _currentPopup = new Popup(); _currentPopup.UserInterfaceManager.StateRoot.AddChild(_currentPopup); _currentPopup.OnPopupHide += _closeContextMenu; var vBox = new VBoxContainer(); _currentPopup.AddChild(vBox); vBox.AddChild(new Label {Text = "Waiting on Server..."}); RaiseNetworkEvent(new VerbSystemMessages.RequestVerbsMessage(_currentEntity)); var size = vBox.CombinedMinimumSize; var box = UIBox2.FromDimensions(screenCoordinates.Position, size); _currentPopup.Open(box); } private void OnOpenContextMenu(in PointerInputCmdHandler.PointerInputCmdArgs args) { if (_currentPopup != null) { _closeContextMenu(); return; } if (!(_stateManager.CurrentState is GameScreen gameScreen)) { return; } var entities = gameScreen.GetEntitiesUnderPosition(args.Coordinates); _currentPopup = new Popup(); _currentPopup.OnPopupHide += _closeContextMenu; var vBox = new VBoxContainer(); _currentPopup.AddChild(vBox); foreach (var entity in entities) { var button = new Button {Text = entity.Name}; vBox.AddChild(button); button.OnPressed += _ => OnContextButtonPressed(entity); } _currentPopup.UserInterfaceManager.StateRoot.AddChild(_currentPopup); var size = vBox.CombinedMinimumSize; var box = UIBox2.FromDimensions(args.ScreenCoordinates.Position, size); _currentPopup.Open(box); } private void OnContextButtonPressed(IEntity entity) { OpenContextMenu(entity, new ScreenCoordinates(_inputManager.MouseScreenPosition)); } public override void HandleNetMessage(INetChannel channel, EntitySystemMessage message) { base.HandleNetMessage(channel, message); switch (message) { case VerbSystemMessages.VerbsResponseMessage resp: _fillEntityPopup(resp); break; } } private void _fillEntityPopup(VerbSystemMessages.VerbsResponseMessage msg) { if (_currentEntity != msg.Entity || !_entityManager.TryGetEntity(_currentEntity, out var entity)) { return; } DebugTools.AssertNotNull(_currentPopup); var buttons = new List