using System; using System.Collections.Generic; using System.Reflection; using Content.Client.State; using Content.Shared.GameObjects; using Content.Shared.GameObjects.EntitySystemMessages; using Content.Shared.Input; using JetBrains.Annotations; using Robust.Client.GameObjects.EntitySystems; using Robust.Client.Interfaces.Input; using Robust.Client.Interfaces.State; using Robust.Client.Player; 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.IoC; using Robust.Shared.Log; using Robust.Shared.Map; using Robust.Shared.Maths; using Robust.Shared.Utility; namespace Content.Client.GameObjects.EntitySystems { [UsedImplicitly] public sealed 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; #pragma warning restore 649 private VerbPopup _currentPopup; private EntityUid _currentEntity; public override void Initialize() { base.Initialize(); SubscribeNetworkEvent(FillEntityPopup); IoCManager.InjectDependencies(this); var input = EntitySystemManager.GetEntitySystem(); input.BindMap.BindFunction(ContentKeyFunctions.OpenContextMenu, new PointerInputCmdHandler(OnOpenContextMenu)); } public void OpenContextMenu(IEntity entity, ScreenCoordinates screenCoordinates) { if (_currentPopup != null) { CloseContextMenu(); } _currentEntity = entity.Uid; _currentPopup = new VerbPopup(); _currentPopup.UserInterfaceManager.ModalRoot.AddChild(_currentPopup); _currentPopup.OnPopupHide += CloseContextMenu; _currentPopup.List.AddChild(new Label {Text = "Waiting on Server..."}); RaiseNetworkEvent(new VerbSystemMessages.RequestVerbsMessage(_currentEntity)); var size = _currentPopup.List.CombinedMinimumSize; var box = UIBox2.FromDimensions(screenCoordinates.Position, size); _currentPopup.Open(box); } private bool OnOpenContextMenu(in PointerInputCmdHandler.PointerInputCmdArgs args) { if (_currentPopup != null) { CloseContextMenu(); return true; } if (!(_stateManager.CurrentState is GameScreenBase gameScreen)) { return false; } var entities = gameScreen.GetEntitiesUnderPosition(args.Coordinates); if (entities.Count == 0) { return false; } _currentPopup = new VerbPopup(); _currentPopup.OnPopupHide += CloseContextMenu; foreach (var entity in entities) { var button = new Button {Text = entity.Name}; _currentPopup.List.AddChild(button); button.OnPressed += _ => OnContextButtonPressed(entity); } _currentPopup.UserInterfaceManager.ModalRoot.AddChild(_currentPopup); var size = _currentPopup.List.CombinedMinimumSize; var box = UIBox2.FromDimensions(args.ScreenCoordinates.Position, size); _currentPopup.Open(box); return true; } private void OnContextButtonPressed(IEntity entity) { OpenContextMenu(entity, new ScreenCoordinates(_inputManager.MouseScreenPosition)); } private void FillEntityPopup(VerbSystemMessages.VerbsResponseMessage msg) { if (_currentEntity != msg.Entity || !_entityManager.TryGetEntity(_currentEntity, out var entity)) { return; } DebugTools.AssertNotNull(_currentPopup); var buttons = new List