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; }