175 lines
5.0 KiB
Markdown
175 lines
5.0 KiB
Markdown
---
|
|
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<EntityStore> ref = player.getReference();
|
|
Store<EntityStore> 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<EntityStore> ref = player.getReference();
|
|
Store<EntityStore> 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<EntityStore> ref = player.getReference();
|
|
Store<EntityStore> 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 >}}
|