Show if items can be placed in a slot when hovering (#1480)

Co-authored-by: Pieter-Jan Briers <pieterjan.briers@gmail.com>
This commit is contained in:
Moses
2020-07-26 07:25:38 -05:00
committed by GitHub
parent bab1345b87
commit 8e08c64fcf
9 changed files with 135 additions and 4 deletions

View File

@@ -91,6 +91,14 @@ namespace Content.Client.GameObjects
doneSlots.Add(slot); doneSlots.Add(slot);
} }
if (cast.HoverEntity != null)
{
var (slot, (entityUid, fits)) = cast.HoverEntity.Value;
var entity = Owner.EntityManager.GetEntity(entityUid);
InterfaceController?.HoverInSlot(slot, entity, fits);
}
foreach (var slot in _slots.Keys.ToList()) foreach (var slot in _slots.Keys.ToList())
{ {
if (!doneSlots.Contains(slot)) if (!doneSlots.Contains(slot))
@@ -171,6 +179,11 @@ namespace Content.Client.GameObjects
SendNetworkMessage(equipmessage); SendNetworkMessage(equipmessage);
} }
public void SendHoverMessage(Slots slot)
{
SendNetworkMessage(new ClientInventoryMessage(slot, ClientInventoryUpdate.Hover));
}
public void SendOpenStorageUIMessage(Slots slot) public void SendOpenStorageUIMessage(Slots slot)
{ {
SendNetworkMessage(new OpenSlotStorageUIMessage(slot)); SendNetworkMessage(new OpenSlotStorageUIMessage(slot));

View File

@@ -48,6 +48,7 @@ namespace Content.Client.GameObjects
{ {
button.OnPressed = (e) => AddToInventory(e, slot); button.OnPressed = (e) => AddToInventory(e, slot);
button.OnStoragePressed = (e) => OpenStorage(e, slot); button.OnStoragePressed = (e) => OpenStorage(e, slot);
button.OnHover = (e) => RequestItemHover(slot);
_inventoryButtons.Add(slot, new List<ItemSlotButton> {button}); _inventoryButtons.Add(slot, new List<ItemSlotButton> {button});
} }
@@ -58,7 +59,8 @@ namespace Content.Client.GameObjects
variable = new ItemSlotButton(texture, storageTexture) variable = new ItemSlotButton(texture, storageTexture)
{ {
OnPressed = (e) => AddToInventory(e, slot), OnPressed = (e) => AddToInventory(e, slot),
OnStoragePressed = (e) => OpenStorage(e, slot) OnStoragePressed = (e) => OpenStorage(e, slot),
OnHover = (e) => RequestItemHover(slot)
}; };
_inventoryButtons[slot].Add(variable); _inventoryButtons[slot].Add(variable);
} }
@@ -114,6 +116,21 @@ namespace Content.Client.GameObjects
} }
} }
public override void HoverInSlot(Slots slot, IEntity entity, bool fits)
{
base.HoverInSlot(slot, entity, fits);
if (!_inventoryButtons.TryGetValue(slot, out var buttons))
{
return;
}
foreach (var button in buttons)
{
_itemSlotManager.HoverInSlot(button, entity, fits);
}
}
protected override void HandleInventoryKeybind(GUIBoundKeyEventArgs args, Slots slot) protected override void HandleInventoryKeybind(GUIBoundKeyEventArgs args, Slots slot)
{ {
if (!_inventoryButtons.TryGetValue(slot, out var buttons)) if (!_inventoryButtons.TryGetValue(slot, out var buttons))

View File

@@ -59,6 +59,10 @@ namespace Content.Client.GameObjects
{ {
} }
public virtual void HoverInSlot(EquipmentSlotDefines.Slots slot, IEntity entity, bool fits)
{
}
public virtual void RemoveFromSlot(EquipmentSlotDefines.Slots slot) public virtual void RemoveFromSlot(EquipmentSlotDefines.Slots slot)
{ {
} }
@@ -95,5 +99,10 @@ namespace Content.Client.GameObjects
Owner.SendOpenStorageUIMessage(slot); Owner.SendOpenStorageUIMessage(slot);
} }
protected void RequestItemHover(EquipmentSlotDefines.Slots slot)
{
Owner.SendHoverMessage(slot);
}
} }
} }

View File

@@ -9,5 +9,6 @@ namespace Content.Client.UserInterface
bool OnButtonPressed(GUIBoundKeyEventArgs args, IEntity item); bool OnButtonPressed(GUIBoundKeyEventArgs args, IEntity item);
void UpdateCooldown(ItemSlotButton cooldownTexture, IEntity entity); void UpdateCooldown(ItemSlotButton cooldownTexture, IEntity entity);
bool SetItemSlot(ItemSlotButton button, IEntity entity); bool SetItemSlot(ItemSlotButton button, IEntity entity);
void HoverInSlot(ItemSlotButton button, IEntity entity, bool fits);
} }
} }

View File

@@ -17,6 +17,10 @@ namespace Content.Client.UserInterface
public Action<GUIBoundKeyEventArgs> OnPressed { get; set; } public Action<GUIBoundKeyEventArgs> OnPressed { get; set; }
public Action<GUIBoundKeyEventArgs> OnStoragePressed { get; set; } public Action<GUIBoundKeyEventArgs> OnStoragePressed { get; set; }
public Action<GUIMouseHoverEventArgs> OnHover { get; set; }
public bool EntityHover { get; set; } = false;
public bool MouseIsHovering = false;
public ItemSlotButton(Texture texture, Texture storageTexture) public ItemSlotButton(Texture texture, Texture storageTexture)
{ {
@@ -56,6 +60,24 @@ namespace Content.Client.UserInterface
StorageButton.OnPressed += OnStorageButtonPressed; StorageButton.OnPressed += OnStorageButtonPressed;
Button.OnMouseEntered += _ =>
{
MouseIsHovering = true;
};
Button.OnMouseEntered += OnButtonHover;
Button.OnMouseExited += _ =>
{
MouseIsHovering = false;
if (EntityHover)
{
SpriteView.Sprite?.Owner.Delete();
EntityHover = false;
SpriteView.Sprite = null;
StorageButton.Visible = false;
}
};
AddChild(CooldownDisplay = new CooldownGraphic AddChild(CooldownDisplay = new CooldownGraphic
{ {
SizeFlagsHorizontal = SizeFlags.Fill, SizeFlagsHorizontal = SizeFlags.Fill,
@@ -80,5 +102,10 @@ namespace Content.Client.UserInterface
OnPressed?.Invoke(args.Event); OnPressed?.Invoke(args.Event);
} }
} }
private void OnButtonHover(GUIMouseHoverEventArgs args)
{
OnHover?.Invoke(args);
}
} }
} }

View File

@@ -5,6 +5,7 @@ using Content.Client.GameObjects.EntitySystems;
using Content.Client.Utility; using Content.Client.Utility;
using Content.Shared.GameObjects.Components.Items; using Content.Shared.GameObjects.Components.Items;
using Content.Shared.Input; using Content.Shared.Input;
using Robust.Client.GameObjects;
using Robust.Client.GameObjects.EntitySystems; using Robust.Client.GameObjects.EntitySystems;
using Robust.Client.Graphics; using Robust.Client.Graphics;
using Robust.Client.Interfaces.GameObjects.Components; using Robust.Client.Interfaces.GameObjects.Components;
@@ -30,6 +31,7 @@ namespace Content.Client.UserInterface
[Dependency] private readonly IGameTiming _gameTiming; [Dependency] private readonly IGameTiming _gameTiming;
[Dependency] private readonly IInputManager _inputManager; [Dependency] private readonly IInputManager _inputManager;
[Dependency] private readonly IEntitySystemManager _entitySystemManager; [Dependency] private readonly IEntitySystemManager _entitySystemManager;
[Dependency] private readonly IEntityManager _entityManager;
[Dependency] private readonly IEyeManager _eyeManager; [Dependency] private readonly IEyeManager _eyeManager;
[Dependency] private readonly IMapManager _mapManager; [Dependency] private readonly IMapManager _mapManager;
#pragma warning restore 0649 #pragma warning restore 0649
@@ -45,6 +47,7 @@ namespace Content.Client.UserInterface
{ {
if (!entity.TryGetComponent(out ISpriteComponent sprite)) if (!entity.TryGetComponent(out ISpriteComponent sprite))
return false; return false;
button.EntityHover = false;
button.SpriteView.Sprite = sprite; button.SpriteView.Sprite = sprite;
button.StorageButton.Visible = entity.HasComponent<ClientStorageComponent>(); button.StorageButton.Visible = entity.HasComponent<ClientStorageComponent>();
} }
@@ -124,5 +127,31 @@ namespace Content.Client.UserInterface
cooldownDisplay.Visible = false; cooldownDisplay.Visible = false;
} }
} }
public void HoverInSlot(ItemSlotButton button, IEntity entity, bool fits)
{
if (entity == null || !button.MouseIsHovering)
{
button.SpriteView.Sprite?.Owner.Delete();
button.SpriteView.Sprite = null;
button.StorageButton.Visible = false;
return;
}
if (!entity.HasComponent<SpriteComponent>())
{
return;
}
// Set green / red overlay at 50% transparency
var hoverEntity = _entityManager.SpawnEntity("hoverentity", MapCoordinates.Nullspace);
var hoverSprite = hoverEntity.GetComponent<SpriteComponent>();
hoverSprite.CopyFrom(entity.GetComponent<SpriteComponent>());
hoverSprite.Color = fits ? new Color(0, 255, 0, 127) : new Color(255, 0, 0, 127);
button.EntityHover = true;
button.SpriteView.Sprite = hoverSprite;
button.StorageButton.Visible = entity.HasComponent<ClientStorageComponent>();
}
} }
} }

View File

@@ -36,6 +36,8 @@ namespace Content.Server.GameObjects
[ViewVariables] [ViewVariables]
private readonly Dictionary<Slots, ContainerSlot> SlotContainers = new Dictionary<Slots, ContainerSlot>(); private readonly Dictionary<Slots, ContainerSlot> SlotContainers = new Dictionary<Slots, ContainerSlot>();
private KeyValuePair<Slots, (EntityUid entity, bool fits)>? HoverEntity;
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
@@ -93,6 +95,11 @@ namespace Content.Server.GameObjects
} }
public T GetSlotItem<T>(Slots slot) where T : ItemComponent public T GetSlotItem<T>(Slots slot) where T : ItemComponent
{ {
if (!SlotContainers.ContainsKey(slot))
{
return null;
}
var containedEntity = SlotContainers[slot].ContainedEntity; var containedEntity = SlotContainers[slot].ContainedEntity;
if (containedEntity?.Deleted == true) if (containedEntity?.Deleted == true)
{ {
@@ -358,6 +365,20 @@ namespace Content.Server.GameObjects
} }
break; break;
} }
case ClientInventoryUpdate.Hover:
{
var hands = Owner.GetComponent<HandsComponent>();
var activeHand = hands.GetActiveHand;
if (activeHand != null && GetSlotItem(msg.Inventoryslot) == null)
{
var canEquip = CanEquip(msg.Inventoryslot, activeHand, out var reason);
HoverEntity = new KeyValuePair<Slots, (EntityUid entity, bool fits)>(msg.Inventoryslot, (activeHand.Owner.Uid, canEquip));
Dirty();
}
break;
}
} }
} }
@@ -417,7 +438,11 @@ namespace Content.Server.GameObjects
list.Add(new KeyValuePair<Slots, EntityUid>(slot, container.ContainedEntity.Uid)); list.Add(new KeyValuePair<Slots, EntityUid>(slot, container.ContainedEntity.Uid));
} }
} }
return new InventoryComponentState(list);
var hover = HoverEntity;
HoverEntity = null;
return new InventoryComponentState(list, hover);
} }
void IExAct.OnExplosion(ExplosionEventArgs eventArgs) void IExAct.OnExplosion(ExplosionEventArgs eventArgs)

View File

@@ -51,10 +51,12 @@ namespace Content.Shared.GameObjects
protected class InventoryComponentState : ComponentState protected class InventoryComponentState : ComponentState
{ {
public List<KeyValuePair<Slots, EntityUid>> Entities { get; } public List<KeyValuePair<Slots, EntityUid>> Entities { get; }
public KeyValuePair<Slots, (EntityUid entity, bool fits)>? HoverEntity { get; }
public InventoryComponentState(List<KeyValuePair<Slots, EntityUid>> entities) : base(ContentNetIDs.STORAGE) public InventoryComponentState(List<KeyValuePair<Slots, EntityUid>> entities, KeyValuePair<Slots, (EntityUid entity, bool fits)>? hoverEntity = null) : base(ContentNetIDs.STORAGE)
{ {
Entities = entities; Entities = entities;
HoverEntity = hoverEntity;
} }
} }
@@ -74,7 +76,8 @@ namespace Content.Shared.GameObjects
public enum ClientInventoryUpdate public enum ClientInventoryUpdate
{ {
Equip = 0, Equip = 0,
Use = 1 Use = 1,
Hover = 2
} }
} }

View File

@@ -0,0 +1,7 @@
- type: entity
name: hover entity
id: hoverentity
components:
- type: Sprite
layers:
- shader: unshaded