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:
@@ -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));
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
- type: entity
|
||||||
|
name: hover entity
|
||||||
|
id: hoverentity
|
||||||
|
components:
|
||||||
|
- type: Sprite
|
||||||
|
layers:
|
||||||
|
- shader: unshaded
|
||||||
Reference in New Issue
Block a user