Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
feat(input): add interaction to resource gate (#104)
  • Loading branch information
Xenira committed Jan 27, 2024
1 parent ada64f0 commit 4c867f5
Show file tree
Hide file tree
Showing 7 changed files with 75 additions and 12 deletions.
1 change: 0 additions & 1 deletion .github/workflows/release-please.yml
Expand Up @@ -16,7 +16,6 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Download release artifact
if: ${{ steps.release.outputs.release_created }}
uses: actions/download-artifact@v4
with:
name: release-artifact
Expand Down
22 changes: 15 additions & 7 deletions plugin/src/input/ui/InteractableUi.cs
Expand Up @@ -176,6 +176,7 @@ public class InteractableBuilder
private InteractableIsHitCallback isHitCallback;
private InteractableGetObjectCallback getObjectCallback;
private Func<Rect> recalculateCallback;
private Func<bool> isClickableCallback;

public InteractableBuilder(InteractableUi ui, Rect rect, GameObject gameObject)
{
Expand All @@ -186,12 +187,11 @@ public InteractableBuilder(InteractableUi ui, Rect rect, GameObject gameObject)

public Interactable build()
{
var interactable = new Interactable(ui, rect, gameObject, isHitCallback, getObjectCallback, onClickEvent, onDragEvent, onDropEvent, onCancelDragEvent, onAcceptsDropEvent, onReceiveDropEvent, onHoverEnterEvent, onHoverExitEvent);

if (recalculateCallback != null)
var interactable = new Interactable(ui, rect, gameObject, isHitCallback, getObjectCallback, onClickEvent, onDragEvent, onDropEvent, onCancelDragEvent, onAcceptsDropEvent, onReceiveDropEvent, onHoverEnterEvent, onHoverExitEvent)
{
interactable.recalculateCallback = recalculateCallback;
}
recalculateCallback = recalculateCallback,
isClickableCallback = isClickableCallback
};

return interactable;
}
Expand All @@ -208,9 +208,10 @@ public InteractableBuilder withIsHit(InteractableIsHitCallback isHitCallback)
return this;
}

public InteractableBuilder withClick(InteractableClickEvent onClick)
public InteractableBuilder withClick(InteractableClickEvent onClick, Func<bool> isClickableCallback = null)
{
onClickEvent = onClick;
this.isClickableCallback = isClickableCallback ?? (() => true);
return this;
}

Expand Down Expand Up @@ -262,6 +263,7 @@ public class Interactable
public InteractableIsHitCallback IsHitCallback;
public InteractableGetObjectCallback GetObjectCallback;
public Func<Rect> recalculateCallback;
public Func<bool> isClickableCallback;

// Clickable, Draggable and Drop Target
internal Interactable(InteractableUi ui, Rect rect, GameObject gameObject, InteractableIsHitCallback isHitCallback, InteractableGetObjectCallback getObjectCallback, InteractableClickEvent onClick, InteractableDragEvent onDrag, InteractableDropEvent onDrop, InteractableCancelDragEvent onCancelDrag, InteractableAcceptsDropEvent onAcceptsDrop, InteractableReceiveDropEvent onReceiveDrop, InteractableHoverEnterEvent onHoverEnter, InteractableHoverExitEvent onHoverExit)
Expand Down Expand Up @@ -302,7 +304,7 @@ public bool isHit(Vector2 point)

public bool isClickable()
{
return OnClick != null;
return OnClick != null && isClickableCallback?.Invoke() != false;
}

public void hoverEnter(InteractableUi ui)
Expand All @@ -320,6 +322,12 @@ public void hoverExit(InteractableUi ui)
public void click(InteractableUi ui)
{
Logger.LogDebug($"click {ui.transform.gameObject.name}");
if (!isClickable())
{
Logger.LogDebug($"click {ui.transform.gameObject.name} not clickable");
return;
}

OnClick?.Invoke(ui);
}

Expand Down
2 changes: 0 additions & 2 deletions plugin/src/input/ui/machine/AssemblerInteractableUi.cs
Expand Up @@ -13,8 +13,6 @@ public AssemblerInteractableUi(GameObject gameObject) : base(gameObject)
zIndex = 0.001f;

interactable = GameObjectFinder.FindChildObjectByName("Container", gameObject).GetComponentsInChildren<InventoryResourceSlotUI>().Select(getInteractable).ToList();

Logger.LogDebug($"Interactable: {rectTransform.rect}");
}


Expand Down
1 change: 0 additions & 1 deletion plugin/src/input/ui/machine/PlanterInteractableUi.cs
Expand Up @@ -13,7 +13,6 @@ public PlanterInteractableUi(GameObject gameObject) : base(gameObject)
zIndex = 0.001f;

interactable = gameObject.GetComponentsInChildren<InventoryResourceSlotUI>().Select(getInteractable).ToList();
Logger.LogDebug($"Interactable: {rectTransform.rect}");
}

protected override void init()
Expand Down
52 changes: 52 additions & 0 deletions plugin/src/input/ui/machine/ResourceGateInteractableUi.cs
@@ -0,0 +1,52 @@
using System.Linq;
using TechtonicaVR.Util;
using UnityEngine;

namespace TechtonicaVR.Input.Ui.Machine;

public class ResourceGateInteractableUi : InventoryInteractableUI
{
private static PluginLogger Logger = PluginLogger.GetLogger<ResourceGateInteractableUi>();

public ResourceGateInteractableUi(GameObject gameObject) : base(gameObject)
{
zIndex = 0.001f;

interactable = gameObject.GetComponentsInChildren<InventoryResourceSlotUI>().Select(getInteractable).ToList();

var upgradeButton = gameObject.GetComponentInChildren<ProductionTerminalUpgradeButton>();
var upgradeButtonInteractable = new InteractableBuilder(this, getRect(upgradeButton.GetComponent<RectTransform>()), upgradeButton.gameObject)
.withClick((ui) => onClick(upgradeButton), () => upgradeButton.canUpgrade)
.withHoverEnter((ui) => upgradeButton.mouseEnterCallback?.Invoke())
.withHoverExit((ui) => upgradeButton.mouseExitCallback?.Invoke())
.build();
interactable.Add(upgradeButtonInteractable);
}


protected override void init()
{
}

private Interactable getInteractable(InventoryResourceSlotUI slot)
{
var rectTransform = slot.GetComponent<RectTransform>();
var rect = getRect(rectTransform);
Logger.LogDebug($"Slot rect: {slot} {rect} {rectTransform.localPosition}");

return new InteractableBuilder(this, rect, rectTransform.gameObject)
.withRecalculate(() => getRect(rectTransform))
.withDrag(() => draggedResourceInfo ?? slot.resourceType,
(ui) => onDrag(slot),
(ui, source, target) => onDrop(ui, target, slot),
(ui) => onCancelDrag(slot))
.withDrop(onAcceptsDrop, (ui, source) => onReceiveDrop(source, slot))
.withHoverEnter((ui) => onHoverEnter(slot))
.withHoverExit((ui) => onHoverExit(slot))
.build();
}
private void onClick(ProductionTerminalUpgradeButton upgradeButton)
{
upgradeButton.mouseLeftClickCallback?.Invoke();
}
}
1 change: 0 additions & 1 deletion plugin/src/input/ui/machine/ThresherInteractableUi.cs
Expand Up @@ -13,7 +13,6 @@ public ThresherInteractableUi(GameObject gameObject) : base(gameObject)
zIndex = 0.001f;

interactable = gameObject.GetComponentsInChildren<InventoryResourceSlotUI>().Select(getInteractable).ToList();
Logger.LogDebug($"Interactable: {rectTransform.rect}");
}

protected override void init()
Expand Down
8 changes: 8 additions & 0 deletions plugin/src/ui/patch/UiMenuPatch.cs
Expand Up @@ -116,6 +116,14 @@ private static void addInteractableUi(UIMenu instance)
menu = new UIMenuWrapper(instance)
};
}
else if (instance is ResourceGateUI)
{
var container = GameObjectFinder.FindChildObjectByName("Container", instance.gameObject);
new ResourceGateInteractableUi(container)
{
menu = new UIMenuWrapper(instance)
};
}
}

private static void disableButtonPrompts(UIMenu __instance)
Expand Down

0 comments on commit 4c867f5

Please sign in to comment.