# đŸ–Œïž betterMcGuis [![Java](https://img.shields.io/badge/Java-17%2B%20%2F%2021-orange.svg)](https://www.oracle.com/java/) [![Paper](https://img.shields.io/badge/Paper-1.20.4%2B-blue.svg)](https://papermc.io/) [![Kyori Adventure](https://img.shields.io/badge/Adventure-MiniMessage-purple.svg)](https://docs.advntr.dev/) [![License](https://img.shields.io/badge/License-MIT-green.svg)](#) Une bibliothĂšque Java moderne, fluide et Ă©vĂ©nementielle permettant de crĂ©er, animer et gĂ©rer des interfaces graphiques (GUIs / Menus interactifs / Inventaires) sur serveurs Minecraft Paper et Spigot (1.20.4+). --- ## 📑 Sommaire - [📚 Guides DĂ©taillĂ©s (Dossier `/docs`)](#-guides-dĂ©taillĂ©s-dossier-docs) - [🌟 FonctionnalitĂ©s](#-fonctionnalitĂ©s) - [đŸ—ïž Architecture & Flux d'Interactions](#-architecture--flux-dinteractions) - [📩 Installation & Configuration](#-installation--configuration) - [🚀 Guide de DĂ©marrage Rapide](#-guide-de-dĂ©marrage-rapide) - [💡 Exemples de Menus](#-exemples-de-menus) - [1. Menu Principal Standard (`GuiBuilder`)](#1-menu-principal-standard-guibuilder) - [2. Menu PaginĂ© Dynamique (`PaginatedGui`)](#2-menu-paginĂ©-dynamique-paginatedgui) - [3. Motifs ASCII & Grilles de Disposition (`GuiPattern`)](#3-motifs-ascii--grilles-de-disposition-guipattern) - [4. Menus Ă  Onglets sans RĂ©ouverture (`TabbedGui`)](#4-menus-Ă -onglets-sans-rĂ©ouverture-tabbedgui) - [5. Zones de DĂ©pĂŽt / Poubelle (`StorageGui`)](#5-zones-de-dĂ©pĂŽt--poubelle-storagegui) - [💎 Construction d'Items (`ItemBuilder`)](#-construction-ditems-itembuilder) - [🎯 SystĂšme d'ÉvĂ©nements & Écouteurs AnnotĂ©s](#-systĂšme-dĂ©vĂ©nements--Ă©couteurs-annotĂ©s) - [📂 Organisation des Packages](#-organisation-des-packages) --- ## 📚 Guides DĂ©taillĂ©s (Dossier `/docs`) Pour une exploration approfondie de chaque composant, consultez la documentation modulaire : * 📘 [**01. Guide de DĂ©marrage Rapide**](docs/01_GETTING_STARTED.md) : Installation Gradle/Maven, initialisation dans `JavaPlugin` et cycle de vie. * đŸ—ïž [**02. Fluent GUI Builder DSL**](docs/02_GUI_BUILDER_DSL.md) : MĂ©thodes de placement de slots, dimensions, bordures, remplissages et propriĂ©tĂ©s dynamiques. * 💎 [**03. ItemBuilder & GuiItem**](docs/03_ITEM_BUILDER_AND_ITEMS.md) : Formatage MiniMessage, tĂȘtes personnalisĂ©es, armures teintĂ©es, sons, cooldowns et `GuiClickContext`. * 🎹 [**04. Motifs & Masques ASCII**](docs/04_PATTERNS_AND_MASKS.md) : Conception visuelle de grilles par matrices textuelles (`GuiPattern`, `GuiMask`). * 📚 [**05. Menus PaginĂ©s, Onglets & Animations**](docs/05_PAGINATED_AND_ADVANCED_GUIS.md) : Pagination automatique, onglets commutables sans rĂ©ouverture et frames animĂ©es. * 🎯 [**06. Cycle de Vie & ÉvĂ©nements**](docs/06_LIFECYCLE_AND_EVENTS.md) : Hooks locaux (`.onClick()`, `.onClose()`) et Ă©couteurs globaux annotĂ©s `@GuiEventHandler`. * 📩 [**07. Zones de Stockage & Slots Éditables**](docs/07_STORAGE_AND_EDITABLE_SLOTS.md) : Menus de dĂ©pĂŽts, restitution d'items et sĂ©curitĂ©s anti-glitch. --- ## 🌟 FonctionnalitĂ©s - **DSL Fluide & DĂ©claratif** : Construction rapide et lisible (`BetterMcGuis.builder("Titre", 3)`). - **Formatage Moderne MiniMessage & Adventure** : Prise en charge native des gradients HEX, balises de style et composants texte. - **Grilles & Motifs ASCII (`GuiPattern`)** : Dessinez vos interfaces directement en texte sous forme de matrice avec associations de caractĂšres. - **Pagination Intelligente (`PaginatedGui`)** : Calcul automatique des pages, boutons de navigation dynamiques et indicateurs de progression. - **Onglets Commutables (`TabbedGui`)** : Basculez entre plusieurs vues de menu instantanĂ©ment sans fermer la fenĂȘtre du joueur. - **Animations CadencĂ©es (`AnimatedGui`)** : Lecture de sĂ©quences de frames temporelles (titres animĂ©s, coffres mystĂšres, carrousels). - **Protection Anti-Duplication & SĂ©curitĂ©** : Blocage natif et sĂ©curisĂ© des vols d'items, glisser-dĂ©poser illĂ©gaux, shift-clics et raccourcis de hotbar. - **Moteur d'ÉvĂ©nements Riches** : Bus d'Ă©vĂ©nements global avec prioritĂ©s et annotations `@GuiEventHandler`. --- ## đŸ—ïž Architecture & Flux d'Interactions ```mermaid flowchart TD Player["Joueur en Jeu"] -->|Effectue un Clic / Drag / Fermeture| BukkitEvt["BukkitGuiEventListener (SĂ©curitĂ© & Interception)"] BukkitEvt --> HolderCheck{"Inventaire liĂ© Ă  BetterGuiHolder ?"} HolderCheck -- Non --> Ignore["Ignore l'interaction"] HolderCheck -- Oui --> SlotTypeCheck{"Localisation du Clic"} SlotTypeCheck -- ExtĂ©rieur (-999) --> OutsideHook["gui.handleOutsideClick() & GuiClickEvent"] SlotTypeCheck -- Inventaire Joueur --> BottomCheck{"Shift-Clic ou Hotbar Swap vers slot protĂ©gĂ© ?"} BottomCheck -- Oui --> BlockShift["event.setCancelled(true) & Blocage"] BottomCheck -- Non --> BottomHook["gui.handleBottomClick()"] SlotTypeCheck -- Inventaire SupĂ©rieur (GUI) --> EditCheck{"Le Slot est-il Editable ?"} EditCheck -- Non (DĂ©faut) --> CancelDef["event.setCancelled(true) (EmpĂȘche le vol)"] EditCheck -- Oui --> AllowEdit["event.setCancelled(false) (Autorise le dĂ©pĂŽt)"] CancelDef --> CoolCheck{"Cooldown Actif sur l'Item ?"} AllowEdit --> CoolCheck CoolCheck -- Oui --> CoolBlock["Interruption silencieuse"] CoolCheck -- Non --> SoundTrigger["DĂ©clenchement du Son configurĂ©"] SoundTrigger --> ItemAction["ExĂ©cution de l'Action MĂ©tier (item.handleClick)"] ItemAction --> GuiHook["ExĂ©cution du Hook Local (gui.handleClick)"] GuiHook --> EventBus["Diffusion sur le Bus Global (GuiClickEvent)"] ``` --- ## 📩 Installation & Configuration ### Gradle (Kotlin DSL) ```kotlin repositories { mavenCentral() maven("https://repo.papermc.io/repository/maven-public/") } dependencies { implementation("fr.luc:betterMcGuis:1.0.0-SNAPSHOT") } ``` --- ## 🚀 Guide de DĂ©marrage Rapide ### 1. Initialisation dans votre `JavaPlugin` ```java package fr.luc.monplugin; import fr.luc.bettermcguis.BetterMcGuis; import org.bukkit.plugin.java.JavaPlugin; public class MonPlugin extends JavaPlugin { private BetterMcGuis guiManager; @Override public void onEnable() { // Initialisation de betterMcGuis (enregistre automatiquement les Ă©couteurs Bukkit) this.guiManager = BetterMcGuis.create(this); // Enregistrement d'Ă©couteurs annotĂ©s globaux (optionnel) this.guiManager.registerListeners(new MonEcouteurDeGui()); } @Override public void onDisable() { // Nettoyage complet if (guiManager != null) { guiManager.unregisterAll(); } } } ``` --- ## 💡 Exemples de Menus ### 1. Menu Principal Standard (`GuiBuilder`) ```java BetterMcGuis.builder() .title("Menu Principal") .rows(3) .fillBorder(Material.BLACK_STAINED_GLASS_PANE) // Bouton central interactif .item(13, BetterMcGuis.item(Material.NETHER_STAR) .name("RĂ©compense Quotidienne") .lore( "RĂ©cupĂ©rez votre bonus de connexion !", "", "▶ Cliquez pour rĂ©clamer" ) .glowing(true) .asGuiItem(ctx -> { ctx.playSound(Sound.ENTITY_PLAYER_LEVELUP, 1.0f, 1.2f); ctx.replySuccess("Bonus rĂ©clamĂ© avec succĂšs !"); ctx.close(); }) ) .build() .open(player); ``` --- ### 2. Menu PaginĂ© Dynamique (`PaginatedGui`) ```java var shop = BetterMcGuis.paginated() .title("Boutique du Serveur") .rows(5) .fillBorder(Material.GRAY_STAINED_GLASS_PANE); // Ajout de 50 articles dans le catalogue paginĂ© for (int i = 1; i <= 50; i++) { int id = i; shop.addPageItem(BetterMcGuis.item(Material.DIAMOND) .name("Article #" + id + "") .lore("Prix : 100 $") .asGuiItem(ctx -> { ctx.replySuccess("Achat de l'article #" + id + " validĂ© !"); }) ); } shop.build().open(player); ``` --- ### 3. Motifs ASCII & Grilles de Disposition (`GuiPattern`) ```java BetterMcGuis.builder("Menu QuĂȘtes", 5) .pattern(p -> p .lines( "#########", "# 1 2 3 #", "# #", "# C #", "#########" ) .bindFiller('#', Material.BLACK_STAINED_GLASS_PANE) .bind('1', BetterMcGuis.item(Material.BOOK).name("QuĂȘte Facile").asGuiItem()) .bind('2', BetterMcGuis.item(Material.WRITABLE_BOOK).name("QuĂȘte Moyenne").asGuiItem()) .bind('3', BetterMcGuis.item(Material.ENCHANTED_BOOK).name("QuĂȘte Difficile").asGuiItem()) .bind('C', BetterMcGuis.item(Material.BARRIER).name("Fermer").asGuiItem(GuiClickContext::close)) ) .build() .open(player); ``` --- ### 4. Menus Ă  Onglets sans RĂ©ouverture (`TabbedGui`) ```java BetterMcGuis.tabbed("Menu Profil", 4) // Onglet 1 : Statistiques .tab("stats", 11, BetterMcGuis.item(Material.PAPER).name("Statistiques").asGuiItem(), tab -> { tab.setTabItem("stats", 22, BetterMcGuis.item(Material.EXPERIENCE_BOTTLE).name("Niveau 42").asGuiItem()); }) // Onglet 2 : RĂ©compenses .tab("rewards", 15, BetterMcGuis.item(Material.CHEST).name("RĂ©compenses").asGuiItem(), tab -> { tab.setTabItem("rewards", 22, BetterMcGuis.item(Material.GOLD_INGOT).name("Bonus DĂ©bloquĂ©").asGuiItem()); }) .build() .open(player); ``` --- ### 5. Zones de DĂ©pĂŽt / Poubelle (`StorageGui`) ```java StorageGui trash = new StorageGui("Poubelle Publique", GuiType.CHEST_4_ROWS); trash.fillBorder(Material.RED_STAINED_GLASS_PANE); trash.setStorageSlots(SlotRange.interior(4, 9)); trash.returnItemsOnClose(false); // DĂ©truit dĂ©finitivement les objets dĂ©posĂ©s trash.open(player); ``` --- ## 💎 Construction d'Items (`ItemBuilder`) ```java ItemStack item = BetterMcGuis.item(Material.DIAMOND_HELMET) .name("Casque de Diamant Divin") .lore( "ForgĂ© par les anciens dieux.", "", "Protection : IV" ) .enchant(Enchantment.PROTECTION_ENVIRONMENTAL, 4) .unbreakable(true) .customModelData(2005) .glowing(true) .build(); ``` --- ## 🎯 SystĂšme d'ÉvĂ©nements & Écouteurs AnnotĂ©s ```java package fr.luc.monplugin.listener; import fr.luc.bettermcguis.event.*; import fr.luc.bettermcguis.event.annotation.GuiEventHandler; public class MonEcouteurGlobalGui { @GuiEventHandler(priority = 10) public void onGuiClick(GuiClickEvent event) { var ctx = event.getContext(); System.out.println("[GUI] Clic de " + ctx.getPlayer().getName() + " sur le slot #" + ctx.getSlot()); } @GuiEventHandler public void onGuiClose(GuiCloseEvent event) { System.out.println("[GUI] Fermeture du menu : " + event.getGui().getTitle()); } } ``` --- ## 📂 Organisation des Packages ``` fr.luc.bettermcguis/ ├── BetterMcGuis.java (Façade principale & Enregistrement) ├── api/ (Contrats et modĂšles publics) │ ├── Gui.java (Interface de base de tout GUI) │ ├── GuiType.java (Types de coffres 1-6 et types Bukkit) │ ├── GuiItem.java (Items interactifs, cooldowns, sons, visibilitĂ©) │ ├── GuiClickAction.java (Callback fonctionnel de clic) │ ├── GuiClickContext.java (Contexte complet de clic) │ ├── GuiOpenContext.java (Contexte d'ouverture) │ ├── GuiCloseContext.java (Contexte de fermeture) │ └── slot/ │ ├── SlotPos.java (Position ligne, colonne) │ └── SlotRange.java (Bordures, intĂ©rieurs, plages) ├── builder/ (Constructeurs fluides) │ ├── ItemBuilder.java (CrĂ©ation d'ItemStacks riches avec Adventure) │ ├── GuiBuilder.java (Constructeur de menus standards) │ ├── PaginatedGuiBuilder.java (Constructeur de menus paginĂ©s) │ ├── TabbedGuiBuilder.java (Constructeur de menus Ă  onglets) │ ├── AnimatedGuiBuilder.java (Constructeur de menus animĂ©s) │ └── PatternBuilder.java (Constructeur de motifs ASCII) ├── pattern/ (Moteur de disposition par grilles ASCII) │ ├── GuiPattern.java │ └── GuiMask.java ├── type/ (ImplĂ©mentations de GUIs) │ ├── SimpleGui.java │ ├── PaginatedGui.java │ ├── TabbedGui.java │ ├── AnimatedGui.java │ └── StorageGui.java ├── animation/ (Moteur d'animation) │ └── Frame.java ├── event/ (Bus d'Ă©vĂ©nements & Lifecycle) │ ├── GuiEvent.java │ ├── CancellableGuiEvent.java │ ├── GuiOpenEvent.java │ ├── GuiCloseEvent.java │ ├── GuiClickEvent.java │ ├── GuiPageChangeEvent.java │ ├── GuiRefreshEvent.java │ ├── GuiEventManager.java │ ├── GuiEventListener.java │ └── annotation/ │ └── GuiEventHandler.java ├── holder/ (Liaison avec InventoryHolder de Bukkit) │ └── BetterGuiHolder.java ├── listener/ (Interception Bukkit & SĂ©curitĂ©s anti-glitch) │ └── BukkitGuiEventListener.java └── demo/ (DĂ©monstrations et plugin de test) ├── DemoGuiPlugin.java ├── guis/ │ ├── DemoMainMenuGui.java │ ├── DemoPaginatedShopGui.java │ └── DemoStorageTrashGui.java └── listeners/ └── DemoGuiListener.java ``` --- ## 📄 Licence Ce projet est sous licence [MIT](LICENSE).