diff --git a/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/context/IFCloseContext.java b/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/context/IFCloseContext.java
index e65457c59..ff1aa6b74 100644
--- a/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/context/IFCloseContext.java
+++ b/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/context/IFCloseContext.java
@@ -38,4 +38,11 @@ public interface IFCloseContext extends IFConfinedContext {
*/
@NotNull
ViewContainer getContainer();
+
+ /**
+ * This is an internal inventory-framework API that should not be used from outside of
+ * this library. No compatibility guarantees are provided.
+ */
+ @ApiStatus.Internal
+ Object getPlatformEvent();
}
diff --git a/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/internal/ElementFactory.java b/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/internal/ElementFactory.java
index 6bde3f53e..c7c38909c 100644
--- a/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/internal/ElementFactory.java
+++ b/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/internal/ElementFactory.java
@@ -76,7 +76,7 @@ public abstract IFSlotRenderContext createSlotRenderContext(
* @param viewer The viewer that is currently the subject of the event of close.
* @return A new close context instance.
*/
- public abstract IFCloseContext createCloseContext(@NotNull Viewer viewer, @NotNull IFRenderContext parent);
+ public abstract IFCloseContext createCloseContext(@NotNull Viewer viewer, @NotNull IFRenderContext parent, @NotNull Object origin);
/**
* Creates a new platform builder instance.
diff --git a/inventory-framework-platform-bukkit/src/main/java/me/devnatan/inventoryframework/IFInventoryListener.java b/inventory-framework-platform-bukkit/src/main/java/me/devnatan/inventoryframework/IFInventoryListener.java
index cb839b96c..f4f648c0b 100644
--- a/inventory-framework-platform-bukkit/src/main/java/me/devnatan/inventoryframework/IFInventoryListener.java
+++ b/inventory-framework-platform-bukkit/src/main/java/me/devnatan/inventoryframework/IFInventoryListener.java
@@ -74,7 +74,7 @@ public void onInventoryClose(final InventoryCloseEvent event) {
final IFRenderContext context = viewer.getCurrentContext();
final RootView root = context.getRoot();
- final IFCloseContext closeContext = root.getElementFactory().createCloseContext(viewer, context);
+ final IFCloseContext closeContext = root.getElementFactory().createCloseContext(viewer, context, event);
root.getPipeline().execute(StandardPipelinePhases.CLOSE, closeContext);
}
diff --git a/inventory-framework-platform-bukkit/src/main/java/me/devnatan/inventoryframework/context/CloseContext.java b/inventory-framework-platform-bukkit/src/main/java/me/devnatan/inventoryframework/context/CloseContext.java
index ec8d1a354..0902b24b5 100644
--- a/inventory-framework-platform-bukkit/src/main/java/me/devnatan/inventoryframework/context/CloseContext.java
+++ b/inventory-framework-platform-bukkit/src/main/java/me/devnatan/inventoryframework/context/CloseContext.java
@@ -12,6 +12,7 @@
import me.devnatan.inventoryframework.state.StateValue;
import me.devnatan.inventoryframework.state.StateWatcher;
import org.bukkit.entity.Player;
+import org.bukkit.event.inventory.InventoryCloseEvent;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.UnmodifiableView;
@@ -21,16 +22,23 @@ public class CloseContext extends PlatformConfinedContext implements IFCloseCont
private final Viewer subject;
private final Player player;
private final IFRenderContext parent;
+ private final InventoryCloseEvent closeOrigin;
private boolean cancelled;
@ApiStatus.Internal
- public CloseContext(@NotNull Viewer subject, @NotNull IFRenderContext parent) {
+ public CloseContext(@NotNull Viewer subject, @NotNull IFRenderContext parent, @NotNull InventoryCloseEvent closeOrigin) {
this.subject = subject;
this.player = ((BukkitViewer) subject).getPlayer();
this.parent = parent;
+ this.closeOrigin = closeOrigin;
}
+ @Override
+ public Object getPlatformEvent() {
+ return closeOrigin;
+ }
+
// TODO Needs documentation
public final @NotNull Player getPlayer() {
return player;
diff --git a/inventory-framework-platform-bukkit/src/main/java/me/devnatan/inventoryframework/internal/BukkitElementFactory.java b/inventory-framework-platform-bukkit/src/main/java/me/devnatan/inventoryframework/internal/BukkitElementFactory.java
index acb83c7cb..6cb316e9b 100644
--- a/inventory-framework-platform-bukkit/src/main/java/me/devnatan/inventoryframework/internal/BukkitElementFactory.java
+++ b/inventory-framework-platform-bukkit/src/main/java/me/devnatan/inventoryframework/internal/BukkitElementFactory.java
@@ -17,6 +17,7 @@
import me.devnatan.inventoryframework.logging.NoopLogger;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.plugin.Plugin;
@@ -119,8 +120,8 @@ public IFSlotRenderContext createSlotRenderContext(
}
@Override
- public IFCloseContext createCloseContext(@NotNull Viewer viewer, @NotNull IFRenderContext parent) {
- return new CloseContext(viewer, parent);
+ public IFCloseContext createCloseContext(@NotNull Viewer viewer, @NotNull IFRenderContext parent, @NotNull Object closeOrigin) {
+ return new CloseContext(viewer, parent, (InventoryCloseEvent) closeOrigin);
}
@Override
diff --git a/inventory-framework-platform-minestom/src/main/kotlin/me/devnatan/inventoryframework/IFInventoryListener.kt b/inventory-framework-platform-minestom/src/main/kotlin/me/devnatan/inventoryframework/IFInventoryListener.kt
index 5155045bc..b6c853d65 100644
--- a/inventory-framework-platform-minestom/src/main/kotlin/me/devnatan/inventoryframework/IFInventoryListener.kt
+++ b/inventory-framework-platform-minestom/src/main/kotlin/me/devnatan/inventoryframework/IFInventoryListener.kt
@@ -88,7 +88,7 @@ internal class IFInventoryListener(
val context: IFRenderContext = viewer.activeContext
val root: RootView = context.getRoot()
- val closeContext: IFCloseContext = root.elementFactory.createCloseContext(viewer, context)
+ val closeContext: IFCloseContext = root.elementFactory.createCloseContext(viewer, context, event)
root.pipeline.execute(StandardPipelinePhases.CLOSE, closeContext)
}
diff --git a/inventory-framework-platform-minestom/src/main/kotlin/me/devnatan/inventoryframework/context/CloseContext.kt b/inventory-framework-platform-minestom/src/main/kotlin/me/devnatan/inventoryframework/context/CloseContext.kt
index fb4c1a8bf..f4af87f52 100644
--- a/inventory-framework-platform-minestom/src/main/kotlin/me/devnatan/inventoryframework/context/CloseContext.kt
+++ b/inventory-framework-platform-minestom/src/main/kotlin/me/devnatan/inventoryframework/context/CloseContext.kt
@@ -10,6 +10,7 @@ import me.devnatan.inventoryframework.state.StateValue
import me.devnatan.inventoryframework.state.StateWatcher
import net.kyori.adventure.text.Component
import net.minestom.server.entity.Player
+import net.minestom.server.event.inventory.InventoryCloseEvent
import org.jetbrains.annotations.ApiStatus
import org.jetbrains.annotations.UnmodifiableView
import java.util.UUID
@@ -19,6 +20,7 @@ class CloseContext
constructor(
subject: Viewer,
private val parent: IFRenderContext,
+ val origin: InventoryCloseEvent
) : PlatformConfinedContext(),
IFCloseContext,
Context {
@@ -27,6 +29,8 @@ class CloseContext
private var cancelled = false
+ override fun getPlatformEvent(): Any = origin
+
override val allPlayers: List
get() = getParent().allPlayers
diff --git a/inventory-framework-platform-minestom/src/main/kotlin/me/devnatan/inventoryframework/internal/MinestomElementFactory.kt b/inventory-framework-platform-minestom/src/main/kotlin/me/devnatan/inventoryframework/internal/MinestomElementFactory.kt
index 1734ee40e..cabe0fb50 100644
--- a/inventory-framework-platform-minestom/src/main/kotlin/me/devnatan/inventoryframework/internal/MinestomElementFactory.kt
+++ b/inventory-framework-platform-minestom/src/main/kotlin/me/devnatan/inventoryframework/internal/MinestomElementFactory.kt
@@ -28,6 +28,7 @@ import me.devnatan.inventoryframework.logging.Logger
import me.devnatan.inventoryframework.logging.NoopLogger
import net.kyori.adventure.text.Component.text
import net.minestom.server.entity.Player
+import net.minestom.server.event.inventory.InventoryCloseEvent
import net.minestom.server.event.inventory.InventoryPreClickEvent
import net.minestom.server.inventory.Inventory
import net.minestom.server.inventory.InventoryType
@@ -165,10 +166,7 @@ class MinestomElementFactory : ElementFactory() {
viewer: Viewer?,
): IFSlotRenderContext = SlotRenderContext(slot, parent, viewer)
- override fun createCloseContext(
- viewer: Viewer,
- parent: IFRenderContext,
- ): IFCloseContext = CloseContext(viewer, parent)
+ override fun createCloseContext(viewer: Viewer, parent: IFRenderContext, origin: Any): IFCloseContext = CloseContext(viewer, parent,origin as InventoryCloseEvent)
override fun createComponentBuilder(root: VirtualView): ComponentBuilder<*, Context> = MinestomItemComponentBuilder(root)
diff --git a/inventory-framework-test/src/main/java/me/devnatan/inventoryframework/internal/MockElementFactory.java b/inventory-framework-test/src/main/java/me/devnatan/inventoryframework/internal/MockElementFactory.java
index 7750eae1c..d695c1bc5 100644
--- a/inventory-framework-test/src/main/java/me/devnatan/inventoryframework/internal/MockElementFactory.java
+++ b/inventory-framework-test/src/main/java/me/devnatan/inventoryframework/internal/MockElementFactory.java
@@ -96,10 +96,11 @@ public IFSlotRenderContext createSlotRenderContext(
}
@Override
- public IFCloseContext createCloseContext(@NotNull Viewer viewer, @NotNull IFRenderContext parent) {
+ public IFCloseContext createCloseContext(@NotNull Viewer viewer, @NotNull IFRenderContext parent, @NotNull Object origin) {
IFCloseContext mock = mock(IFCloseContext.class);
when(mock.getViewer()).thenReturn(viewer);
when(mock.getParent()).thenReturn(parent);
+ when(mock.getPlatformEvent()).thenReturn(origin);
return mock;
}