diff --git a/examples/minestom/src/main/kotlin/me/devnatan/inventoryframework/runtime/SampleServer.kt b/examples/minestom/src/main/kotlin/me/devnatan/inventoryframework/runtime/SampleServer.kt index 8d261f44b..9ef601cab 100644 --- a/examples/minestom/src/main/kotlin/me/devnatan/inventoryframework/runtime/SampleServer.kt +++ b/examples/minestom/src/main/kotlin/me/devnatan/inventoryframework/runtime/SampleServer.kt @@ -53,6 +53,7 @@ class SampleServer { val viewFrame = ViewFrame .create(handler) + .enableDebug() .with(Failing(), SimplePagination(), ScheduledView()) .register() diff --git a/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/SamplePlugin.java b/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/SamplePlugin.java index 6bdf9d172..f4f8c4dce 100644 --- a/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/SamplePlugin.java +++ b/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/SamplePlugin.java @@ -17,6 +17,7 @@ public class SamplePlugin extends JavaPlugin { public void onEnable() { ViewFrame viewFrame = ViewFrame.create(this) .install(AnvilInputFeature.AnvilInput) + .enableDebug() .with( new AnvilInputSample(), new Failing(), @@ -24,7 +25,10 @@ public void onEnable() { new AutoUpdate(), new PaginationOrientation(), new TimerSample(), - new RowColumnSample()) + new RowColumnSample(), + new NavigatingBetweenViewsA(), + new NavigatingBetweenViewsB() + ) .register(); IFExampleCommandExecutor command = new IFExampleCommandExecutor(viewFrame); diff --git a/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/commands/IFExampleCommandExecutor.java b/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/commands/IFExampleCommandExecutor.java index 46ac22848..7bd488607 100644 --- a/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/commands/IFExampleCommandExecutor.java +++ b/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/commands/IFExampleCommandExecutor.java @@ -6,13 +6,7 @@ import java.util.Map; import me.devnatan.inventoryframework.View; import me.devnatan.inventoryframework.ViewFrame; -import me.devnatan.inventoryframework.runtime.view.AnvilInputSample; -import me.devnatan.inventoryframework.runtime.view.AutoUpdate; -import me.devnatan.inventoryframework.runtime.view.Failing; -import me.devnatan.inventoryframework.runtime.view.PaginationOrientation; -import me.devnatan.inventoryframework.runtime.view.RowColumnSample; -import me.devnatan.inventoryframework.runtime.view.SimplePagination; -import me.devnatan.inventoryframework.runtime.view.TimerSample; +import me.devnatan.inventoryframework.runtime.view.*; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -34,6 +28,7 @@ public class IFExampleCommandExecutor implements CommandExecutor, TabCompleter { views.put("pagination", PaginationOrientation.class); views.put("timer", TimerSample.class); views.put("row-column", RowColumnSample.class); + views.put("navigation", NavigatingBetweenViewsA.class); } private final ViewFrame viewFrame; diff --git a/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/view/NavigatingBetweenViewsA.java b/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/view/NavigatingBetweenViewsA.java new file mode 100644 index 000000000..3ff98d8bc --- /dev/null +++ b/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/view/NavigatingBetweenViewsA.java @@ -0,0 +1,22 @@ +package me.devnatan.inventoryframework.runtime.view; + +import me.devnatan.inventoryframework.View; +import me.devnatan.inventoryframework.ViewConfigBuilder; +import me.devnatan.inventoryframework.context.RenderContext; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +public class NavigatingBetweenViewsA extends View { + + @Override + public void onInit(ViewConfigBuilder config) { + config.title("A").size(3); + } + + @Override + public void onFirstRender(RenderContext render) { + // Moves player to "B" view on click + render.firstSlot(new ItemStack(Material.DIAMOND)) + .onClick(click -> click.openForPlayer(NavigatingBetweenViewsB.class)); + } +} diff --git a/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/view/NavigatingBetweenViewsB.java b/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/view/NavigatingBetweenViewsB.java new file mode 100644 index 000000000..00ef4a277 --- /dev/null +++ b/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/view/NavigatingBetweenViewsB.java @@ -0,0 +1,22 @@ +package me.devnatan.inventoryframework.runtime.view; + +import me.devnatan.inventoryframework.View; +import me.devnatan.inventoryframework.ViewConfigBuilder; +import me.devnatan.inventoryframework.context.RenderContext; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +public class NavigatingBetweenViewsB extends View { + + @Override + public void onInit(ViewConfigBuilder config) { + config.title("B").size(3); + } + + @Override + public void onFirstRender(RenderContext render) { + // Moves player to back to "A" view on click + render.firstSlot(new ItemStack(Material.REDSTONE)) + .onClick(click -> click.openForPlayer(NavigatingBetweenViewsA.class)); + } +} diff --git a/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/component/ItemComponent.java b/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/component/ItemComponent.java index a5e27d83a..8f6aa557c 100644 --- a/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/component/ItemComponent.java +++ b/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/component/ItemComponent.java @@ -290,7 +290,7 @@ public int hashCode() { @Override public String toString() { - return "ItemComponent{" + ", position=" + return "ItemComponent{position=" + position + ", stack=" + stack + ", cancelOnClick=" + cancelOnClick + ", closeOnClick=" diff --git a/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/pipeline/AvailableSlotInterceptor.java b/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/pipeline/AvailableSlotInterceptor.java index 9b843baa2..7ca4dc170 100644 --- a/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/pipeline/AvailableSlotInterceptor.java +++ b/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/pipeline/AvailableSlotInterceptor.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Optional; import java.util.function.BiFunction; + import me.devnatan.inventoryframework.VirtualView; import me.devnatan.inventoryframework.component.ComponentFactory; import me.devnatan.inventoryframework.component.ItemComponentBuilder; @@ -46,7 +47,7 @@ List resolveFromInitialSlot(IFRenderContext context) { int slot = 0; for (int i = 0; i < context.getContainer().getSize(); i++) { - while (isSlotNotAvailableForAutoFilling(context, slot)) slot++; + while (!isSlotAvailableForAutoFilling(context, slot)) slot++; try { final BiFunction factory = availableSlotFactories.get(i); @@ -97,7 +98,7 @@ List resolveFromLayoutSlot(IFRenderContext context) { // if the selected slot is not available for autofill, move it until // we find the next an available position - while (isSlotNotAvailableForAutoFilling(context, slot)) { + while (!isSlotAvailableForAutoFilling(context, slot)) { try { slot = fillablePositions[i + (++offset)]; } catch (final IndexOutOfBoundsException exception) { @@ -117,17 +118,17 @@ List resolveFromLayoutSlot(IFRenderContext context) { return result; } - static boolean isSlotNotAvailableForAutoFilling(IFRenderContext context, int slot) { - if (!context.getContainer().getType().canPlayerInteractOn(slot)) return true; - if (context.getContainer().getSize() >= slot) return false; + static boolean isSlotAvailableForAutoFilling(IFRenderContext context, int slot) { + if (!context.getContainer().getType().canPlayerInteractOn(slot)) return false; + if (context.getContainer().getSize() < slot) return false; // fast path -- check for already rendered items - if (context.getContainer().hasItem(slot)) return true; + if (context.getContainer().hasItem(slot)) return false; // we need to check component factories since components don't have been yet rendered return context.getComponentFactories().stream() .filter(componentFactory -> componentFactory instanceof ItemComponentBuilder) .map(componentFactory -> (ItemComponentBuilder) componentFactory) - .anyMatch(itemBuilder -> itemBuilder.isContainedWithin(slot)); + .noneMatch(itemBuilder -> itemBuilder.isContainedWithin(slot)); } } diff --git a/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/pipeline/RowColumnSlotInterceptor.java b/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/pipeline/RowColumnSlotInterceptor.java index 9ef8f5f27..8af99b8f9 100644 --- a/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/pipeline/RowColumnSlotInterceptor.java +++ b/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/pipeline/RowColumnSlotInterceptor.java @@ -64,7 +64,7 @@ private void resolveBounded( int cursor = 0; for (int i = 0; i < factories.size(); i++) { while (cursor < candidateSlots.size() - && AvailableSlotInterceptor.isSlotNotAvailableForAutoFilling(context, candidateSlots.get(cursor))) + && !AvailableSlotInterceptor.isSlotAvailableForAutoFilling(context, candidateSlots.get(cursor))) cursor++; if (cursor >= candidateSlots.size()) diff --git a/inventory-framework-platform-minestom/src/main/kotlin/me/devnatan/inventoryframework/ViewFrame.kt b/inventory-framework-platform-minestom/src/main/kotlin/me/devnatan/inventoryframework/ViewFrame.kt index 609edbb22..398f36d18 100644 --- a/inventory-framework-platform-minestom/src/main/kotlin/me/devnatan/inventoryframework/ViewFrame.kt +++ b/inventory-framework-platform-minestom/src/main/kotlin/me/devnatan/inventoryframework/ViewFrame.kt @@ -167,6 +167,9 @@ class ViewFrame private constructor( override fun register(): ViewFrame { check(!isRegistered) { "This view frame is already registered" } + // TODO Missing Minestom specific Inventory Framework logger impl + // Check `debugEnabled` here then set up just like we do on Bukkit side + isRegistered = true PlatformUtils.setFactory(MinestomElementFactory()) pipeline.execute(FRAME_REGISTERED, this)