Fix VerbSystem crash.

Fixes #317
This commit is contained in:
Pieter-Jan Briers
2019-08-25 12:54:55 +02:00
parent 77216af44e
commit 7306bcc35a

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using Content.Shared.GameObjects; using Content.Shared.GameObjects;
using Content.Shared.GameObjects.EntitySystemMessages; using Content.Shared.GameObjects.EntitySystemMessages;
using Content.Shared.Input; using Content.Shared.Input;
using JetBrains.Annotations;
using Robust.Client.GameObjects.EntitySystems; using Robust.Client.GameObjects.EntitySystems;
using Robust.Client.Interfaces.Input; using Robust.Client.Interfaces.Input;
using Robust.Client.Interfaces.State; using Robust.Client.Interfaces.State;
@@ -23,7 +24,8 @@ using Robust.Shared.Utility;
namespace Content.Client.GameObjects.EntitySystems namespace Content.Client.GameObjects.EntitySystems
{ {
public class VerbSystem : EntitySystem [UsedImplicitly]
public sealed class VerbSystem : EntitySystem
{ {
#pragma warning disable 649 #pragma warning disable 649
[Dependency] private readonly IStateManager _stateManager; [Dependency] private readonly IStateManager _stateManager;
@@ -33,7 +35,7 @@ namespace Content.Client.GameObjects.EntitySystems
[Dependency] private readonly IUserInterfaceManager _userInterfaceManager; [Dependency] private readonly IUserInterfaceManager _userInterfaceManager;
#pragma warning restore 649 #pragma warning restore 649
private Popup _currentPopup; private VerbPopup _currentPopup;
private EntityUid _currentEntity; private EntityUid _currentEntity;
public override void Initialize() public override void Initialize()
@@ -62,16 +64,14 @@ namespace Content.Client.GameObjects.EntitySystems
} }
_currentEntity = entity.Uid; _currentEntity = entity.Uid;
_currentPopup = new Popup(); _currentPopup = new VerbPopup();
_currentPopup.UserInterfaceManager.StateRoot.AddChild(_currentPopup); _currentPopup.UserInterfaceManager.StateRoot.AddChild(_currentPopup);
_currentPopup.OnPopupHide += _closeContextMenu; _currentPopup.OnPopupHide += _closeContextMenu;
var vBox = new VBoxContainer();
_currentPopup.AddChild(vBox);
vBox.AddChild(new Label {Text = "Waiting on Server..."}); _currentPopup.List.AddChild(new Label {Text = "Waiting on Server..."});
RaiseNetworkEvent(new VerbSystemMessages.RequestVerbsMessage(_currentEntity)); RaiseNetworkEvent(new VerbSystemMessages.RequestVerbsMessage(_currentEntity));
var size = vBox.CombinedMinimumSize; var size = _currentPopup.List.CombinedMinimumSize;
var box = UIBox2.FromDimensions(screenCoordinates.Position, size); var box = UIBox2.FromDimensions(screenCoordinates.Position, size);
_currentPopup.Open(box); _currentPopup.Open(box);
} }
@@ -91,20 +91,18 @@ namespace Content.Client.GameObjects.EntitySystems
var entities = gameScreen.GetEntitiesUnderPosition(args.Coordinates); var entities = gameScreen.GetEntitiesUnderPosition(args.Coordinates);
_currentPopup = new Popup(); _currentPopup = new VerbPopup();
_currentPopup.OnPopupHide += _closeContextMenu; _currentPopup.OnPopupHide += _closeContextMenu;
var vBox = new VBoxContainer();
_currentPopup.AddChild(vBox);
foreach (var entity in entities) foreach (var entity in entities)
{ {
var button = new Button {Text = entity.Name}; var button = new Button {Text = entity.Name};
vBox.AddChild(button); _currentPopup.List.AddChild(button);
button.OnPressed += _ => OnContextButtonPressed(entity); button.OnPressed += _ => OnContextButtonPressed(entity);
} }
_currentPopup.UserInterfaceManager.StateRoot.AddChild(_currentPopup); _currentPopup.UserInterfaceManager.StateRoot.AddChild(_currentPopup);
var size = vBox.CombinedMinimumSize; var size = _currentPopup.List.CombinedMinimumSize;
var box = UIBox2.FromDimensions(args.ScreenCoordinates.Position, size); var box = UIBox2.FromDimensions(args.ScreenCoordinates.Position, size);
_currentPopup.Open(box); _currentPopup.Open(box);
} }
@@ -137,7 +135,7 @@ namespace Content.Client.GameObjects.EntitySystems
var buttons = new List<Button>(); var buttons = new List<Button>();
var vBox = _currentPopup.GetChild<VBoxContainer>("ButtonBox"); var vBox = _currentPopup.List;
vBox.DisposeAllChildren(); vBox.DisposeAllChildren();
foreach (var data in msg.Verbs) foreach (var data in msg.Verbs)
{ {
@@ -212,8 +210,8 @@ namespace Content.Client.GameObjects.EntitySystems
// If we're at the bottom of the window and the menu would go below the bottom of the window, // If we're at the bottom of the window and the menu would go below the bottom of the window,
// shift it up so it extends UP. // shift it up so it extends UP.
var bottomCoord = vBox.CombinedMinimumSize.Y + _currentPopup.Position.Y; var bottomCoords = vBox.CombinedMinimumSize.Y + _currentPopup.Position.Y;
if (bottomCoord > _userInterfaceManager.StateRoot.Size.Y) if (bottomCoords > _userInterfaceManager.StateRoot.Size.Y)
{ {
_currentPopup.Position = _currentPopup.Position - new Vector2(0, vBox.CombinedMinimumSize.Y); _currentPopup.Position = _currentPopup.Position - new Vector2(0, vBox.CombinedMinimumSize.Y);
} }
@@ -230,5 +228,15 @@ namespace Content.Client.GameObjects.EntitySystems
{ {
return _playerManager.LocalPlayer.ControlledEntity; return _playerManager.LocalPlayer.ControlledEntity;
} }
private sealed class VerbPopup : Popup
{
public VBoxContainer List { get; }
public VerbPopup()
{
AddChild(List = new VBoxContainer());
}
}
} }
} }