--- title: Windows type: docs weight: 3 --- Windows are UI panels for displaying and managing inventory containers, crafting interfaces, and other item-based interactions. **Package:** `com.hypixel.hytale.server.core.entity.entities.player.windows` ## Window Types | Type | Description | |------|-------------| | `WindowType.Container` | Standard inventory/container view | | `WindowType.PocketCrafting` | Small crafting grid (2x2) | | `WindowType.BasicCrafting` | Basic crafting table (3x3) | | `WindowType.DiagramCrafting` | Diagram-based crafting | | `WindowType.StructuralCrafting` | Structural/building crafting | | `WindowType.Processing` | Processing/smelting interface | | `WindowType.Memories` | Memories storage interface | ## Window Manager Each player has a `WindowManager` that handles open windows: ```java Player player = ...; WindowManager windowManager = player.getWindowManager(); ``` ## Window Classes ### ContainerWindow For standard container interfaces: ```java import com.hypixel.hytale.server.core.entity.entities.player.windows.ContainerWindow; import com.hypixel.hytale.server.core.inventory.container.ItemContainer; // Open a container window - takes just the ItemContainer ContainerWindow window = new ContainerWindow(itemContainer); ``` {{< callout type="info" >}} `ContainerWindow` automatically uses `WindowType.Container`. The window ID is assigned internally. {{< /callout >}} ### BlockWindow `BlockWindow` is an abstract class for block-based containers. It's typically used through built-in interactions rather than instantiated directly. ```java // BlockWindow is abstract - used internally by block interactions // Constructor: BlockWindow(WindowType, x, y, z, rotationIndex, BlockType) ``` ### ItemStackContainerWindow For ItemStack-based containers: ```java import com.hypixel.hytale.server.core.entity.entities.player.windows.ItemStackContainerWindow; import com.hypixel.hytale.server.core.inventory.container.ItemStackItemContainer; // Takes an ItemStackItemContainer ItemStackContainerWindow window = new ItemStackContainerWindow(itemStackItemContainer); ``` ## Opening Windows Use `PageManager.setPageWithWindows()` or `openCustomPageWithWindows()`: ```java Player player = ...; PageManager pageManager = player.getPageManager(); Ref ref = player.getReference(); Store store = ref.getStore(); // Open page with inventory windows ContainerWindow chestWindow = new ContainerWindow(chestContainer); boolean success = pageManager.setPageWithWindows( ref, store, Page.None, // or Page.Bench, Page.Inventory, etc. true, // canCloseThroughInteraction chestWindow ); ``` ## With Custom Pages Combine windows with custom UI pages: ```java // Custom crafting UI with windows CraftingPage craftingPage = new CraftingPage(player.getPlayerRef()); ContainerWindow inputWindow = new ContainerWindow(1, WindowType.BasicCrafting, inputContainer); ContainerWindow outputWindow = new ContainerWindow(2, WindowType.Container, outputContainer); pageManager.openCustomPageWithWindows( ref, store, craftingPage, inputWindow, outputWindow ); ``` ## Window Events Windows interact with the inventory system. Handle inventory changes through the appropriate events and handlers. ## Practical Example ### Chest Container UI ```java public void openChest(Player player, ItemContainer chestContainer) { PageManager pageManager = player.getPageManager(); Ref ref = player.getReference(); Store store = ref.getStore(); ContainerWindow window = new ContainerWindow(chestContainer); pageManager.setPageWithWindows( ref, store, Page.Bench, // Use Bench page for container UI true, // Allow closing via interaction window ); } ``` ### Opening Multiple Windows ```java public void openCraftingUI(Player player, ItemContainer inputContainer, ItemContainer outputContainer) { PageManager pageManager = player.getPageManager(); Ref ref = player.getReference(); Store store = ref.getStore(); // Create multiple windows ContainerWindow inputWindow = new ContainerWindow(inputContainer); ContainerWindow outputWindow = new ContainerWindow(outputContainer); pageManager.setPageWithWindows( ref, store, Page.Bench, true, inputWindow, outputWindow ); } ``` {{< callout type="info" >}} **Note:** `BlockWindow` is abstract and used internally by block interactions. For custom crafting UIs, use `ContainerWindow` with your own containers. {{< /callout >}} ## Best Practices {{< callout type="info" >}} **Window Guidelines:** - Use unique window IDs for each open window - Match `WindowType` to the intended interface - Clean up containers when windows are closed - Use `canCloseThroughInteraction` appropriately {{< /callout >}} {{< callout type="warning" >}} **Important:** Windows are tied to container state. Ensure containers persist for the duration the window is open. {{< /callout >}}