175 lines
5.4 KiB
Markdown
175 lines
5.4 KiB
Markdown
---
|
|
title: Fenêtres
|
|
type: docs
|
|
weight: 3
|
|
---
|
|
|
|
Les fenêtres sont des panneaux UI pour afficher et gérer les conteneurs d'inventaire, les interfaces de crafting et autres interactions basées sur les objets.
|
|
|
|
**Package:** `com.hypixel.hytale.server.core.entity.entities.player.windows`
|
|
|
|
## Types de Fenêtres
|
|
|
|
| Type | Description |
|
|
|------|-------------|
|
|
| `WindowType.Container` | Vue standard inventaire/conteneur |
|
|
| `WindowType.PocketCrafting` | Petite grille de crafting (2x2) |
|
|
| `WindowType.BasicCrafting` | Table de crafting basique (3x3) |
|
|
| `WindowType.DiagramCrafting` | Crafting basé sur des diagrammes |
|
|
| `WindowType.StructuralCrafting` | Crafting structurel/construction |
|
|
| `WindowType.Processing` | Interface de traitement/fonte |
|
|
| `WindowType.Memories` | Interface de stockage des Mémoires |
|
|
|
|
## Gestionnaire de Fenêtres
|
|
|
|
Chaque joueur a un `WindowManager` qui gère les fenêtres ouvertes :
|
|
|
|
```java
|
|
Player player = ...;
|
|
WindowManager windowManager = player.getWindowManager();
|
|
```
|
|
|
|
## Classes de Fenêtres
|
|
|
|
### ContainerWindow
|
|
|
|
Pour les interfaces de conteneur standard :
|
|
|
|
```java
|
|
import com.hypixel.hytale.server.core.entity.entities.player.windows.ContainerWindow;
|
|
import com.hypixel.hytale.server.core.inventory.container.ItemContainer;
|
|
|
|
// Ouvrir une fenêtre de conteneur - prend juste l'ItemContainer
|
|
ContainerWindow window = new ContainerWindow(itemContainer);
|
|
```
|
|
|
|
{{< callout type="info" >}}
|
|
`ContainerWindow` utilise automatiquement `WindowType.Container`. L'ID de fenêtre est assigné en interne.
|
|
{{< /callout >}}
|
|
|
|
### BlockWindow
|
|
|
|
`BlockWindow` est une classe abstraite pour les conteneurs liés aux blocs. Elle est typiquement utilisée via les interactions intégrées plutôt qu'instanciée directement.
|
|
|
|
```java
|
|
// BlockWindow est abstraite - utilisée en interne par les interactions de blocs
|
|
// Constructeur: BlockWindow(WindowType, x, y, z, rotationIndex, BlockType)
|
|
```
|
|
|
|
### ItemStackContainerWindow
|
|
|
|
Pour les conteneurs basés sur ItemStack :
|
|
|
|
```java
|
|
import com.hypixel.hytale.server.core.entity.entities.player.windows.ItemStackContainerWindow;
|
|
import com.hypixel.hytale.server.core.inventory.container.ItemStackItemContainer;
|
|
|
|
// Prend un ItemStackItemContainer
|
|
ItemStackContainerWindow window = new ItemStackContainerWindow(itemStackItemContainer);
|
|
```
|
|
|
|
## Ouvrir des Fenêtres
|
|
|
|
Utilisez `PageManager.setPageWithWindows()` ou `openCustomPageWithWindows()` :
|
|
|
|
```java
|
|
Player player = ...;
|
|
PageManager pageManager = player.getPageManager();
|
|
Ref<EntityStore> ref = player.getReference();
|
|
Store<EntityStore> store = ref.getStore();
|
|
|
|
// Ouvrir une page avec des fenêtres d'inventaire
|
|
ContainerWindow chestWindow = new ContainerWindow(chestContainer);
|
|
|
|
boolean success = pageManager.setPageWithWindows(
|
|
ref, store,
|
|
Page.None, // ou Page.Bench, Page.Inventory, etc.
|
|
true, // canCloseThroughInteraction
|
|
chestWindow
|
|
);
|
|
```
|
|
|
|
## Avec des Pages Personnalisées
|
|
|
|
Combiner les fenêtres avec des pages UI personnalisées :
|
|
|
|
```java
|
|
// UI de crafting personnalisée avec fenêtres
|
|
CraftingPage craftingPage = new CraftingPage(player.getPlayerRef());
|
|
ContainerWindow inputWindow = new ContainerWindow(inputContainer);
|
|
ContainerWindow outputWindow = new ContainerWindow(outputContainer);
|
|
|
|
pageManager.openCustomPageWithWindows(
|
|
ref, store,
|
|
craftingPage,
|
|
inputWindow,
|
|
outputWindow
|
|
);
|
|
```
|
|
|
|
## Événements de Fenêtre
|
|
|
|
Les fenêtres interagissent avec le système d'inventaire. Gérez les changements d'inventaire via les événements et handlers appropriés.
|
|
|
|
## Exemple Pratique
|
|
|
|
### UI de Conteneur Coffre
|
|
|
|
```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, // Utiliser Page.Bench pour l'UI de conteneur
|
|
true, // Permettre la fermeture via interaction
|
|
window
|
|
);
|
|
}
|
|
```
|
|
|
|
### Ouvrir Plusieurs Fenêtres
|
|
|
|
```java
|
|
public void openCraftingUI(Player player, ItemContainer inputContainer,
|
|
ItemContainer outputContainer) {
|
|
PageManager pageManager = player.getPageManager();
|
|
Ref<EntityStore> ref = player.getReference();
|
|
Store<EntityStore> store = ref.getStore();
|
|
|
|
// Créer plusieurs fenêtres
|
|
ContainerWindow inputWindow = new ContainerWindow(inputContainer);
|
|
ContainerWindow outputWindow = new ContainerWindow(outputContainer);
|
|
|
|
pageManager.setPageWithWindows(
|
|
ref, store,
|
|
Page.Bench,
|
|
true,
|
|
inputWindow,
|
|
outputWindow
|
|
);
|
|
}
|
|
```
|
|
|
|
{{< callout type="info" >}}
|
|
**Note :** `BlockWindow` est abstraite et utilisée en interne par les interactions de blocs. Pour des UI de crafting personnalisées, utilisez `ContainerWindow` avec vos propres conteneurs.
|
|
{{< /callout >}}
|
|
|
|
## Bonnes Pratiques
|
|
|
|
{{< callout type="info" >}}
|
|
**Directives des Fenêtres :**
|
|
- Utilisez des IDs de fenêtre uniques pour chaque fenêtre ouverte
|
|
- Faites correspondre `WindowType` à l'interface prévue
|
|
- Nettoyez les conteneurs quand les fenêtres sont fermées
|
|
- Utilisez `canCloseThroughInteraction` de manière appropriée
|
|
{{< /callout >}}
|
|
|
|
{{< callout type="warning" >}}
|
|
**Important :** Les fenêtres sont liées à l'état du conteneur. Assurez-vous que les conteneurs persistent pendant toute la durée d'ouverture de la fenêtre.
|
|
{{< /callout >}}
|