{"id":78428,"date":"2026-06-04T15:33:53","date_gmt":"2026-06-04T12:33:53","guid":{"rendered":"https:\/\/vpesports.com\/minecraft\/mods\/gui-engine\/"},"modified":"2026-06-04T15:33:53","modified_gmt":"2026-06-04T12:33:53","slug":"gui-engine","status":"publish","type":"mod","link":"https:\/\/vpesports.com\/minecraft\/mods\/gui-engine\/","title":{"rendered":"GUI Engine"},"content":{"rendered":"<p># GUIEngine<\/p>\n<p>GUIEngine is a lightweight, flexible API for creating interactive GUI menus in Minecraft Paper servers (1.21.4). Instead of writing repetitive inventory code for each menu in your plugins, GUIEngine provides a clean, reusable system to create rich interactive interfaces.<\/p>\n<p>## Purpose<\/p>\n<p>GUIEngine is designed as a dependency for other plugins, providing a standardized way to:<\/p>\n<p>&#8211; Create custom inventory menus with interactive buttons<br \/>\n&#8211; Handle player clicks and interactions<br \/>\n&#8211; Manage menu navigation and state<br \/>\n&#8211; Create dynamic, responsive interfaces<\/p>\n<p>It functions similar to other utility plugins like Vault or ProtocolLib, but focused exclusively on GUI management.<\/p>\n<p>## Key Features<\/p>\n<p>&#8211; **Simple API**: Create complex menus with minimal code<br \/>\n&#8211; **Interactive Buttons**: Add clickable buttons with custom actions<br \/>\n&#8211; **Menu Navigation**: Easily handle sub-menus and menu linking<br \/>\n&#8211; **Dynamic Updates**: Update menu contents in real-time<br \/>\n&#8211; **Builder Pattern**: Create menus using a clean, fluent API<br \/>\n&#8211; **Resource Management**: Automatic cleanup of resources<br \/>\n&#8211; **Event Handling**: Properly integrates with Bukkit&#8217;s event system<br \/>\n&#8211; **Clean Architecture**: Well-organized code for easy extension<\/p>\n<p>## How It Works<\/p>\n<p>GUIEngine consists of five core components:<\/p>\n<p>### 1. GUIEngine (Core)<br \/>\nThe main plugin class that initializes the system, registers event listeners, and provides access points for other plugins.<\/p>\n<p>### 2. GUI (Menu)<br \/>\nRepresents an inventory menu with slots for buttons. Each GUI handles its own layout and button mapping.<\/p>\n<p>### 3. GUIButton (Buttons)<br \/>\nInteractive items within menus that can trigger actions when clicked. Buttons can execute code, send messages, open other menus, etc.<\/p>\n<p>### 4. GUIManager (State Manager)<br \/>\nKeeps track of which menu is open for each player and manages the opening\/closing of menus.<\/p>\n<p>### 5. InventoryListener (Event Handler)<br \/>\nIntercepts inventory events and routes them to the appropriate GUI components.<\/p>\n<p>## How to Use<\/p>\n<p>### Adding as a Dependency<\/p>\n<p>First, add GUIEngine as a dependency in your plugin.yml:<\/p>\n<p>&#8220;`yaml<br \/>\ndepend: [GUIEngine]<br \/>\n&#8220;`<\/p>\n<p>Then, add it to your Maven\/Gradle build file.<\/p>\n<p>For Maven:<br \/>\n&#8220;`xml<br \/>\n<dependencies><br \/>\n<dependency><br \/>\n<groupId>com.gui.engine<\/groupId><br \/>\n<artifactId>gui-engine<\/artifactId><br \/>\n<version>1.0-SNAPSHOT<\/version><br \/>\n<scope>provided<\/scope><br \/>\n<\/dependency><br \/>\n<\/dependencies><br \/>\n&#8220;`<\/p>\n<p>### Creating a Basic Menu<\/p>\n<p>Here&#8217;s a simple example showing how to create and display a menu:<\/p>\n<p>&#8220;`java<br \/>\n\/\/ Create a new GUI with 3 rows (27 slots)<br \/>\nGUI myMenu = new GUI(&#8220;\u00a76\u00a7lMy Menu&#8221;, 3);<\/p>\n<p>\/\/ Add a button that sends a message when clicked<br \/>\nGUIButton messageButton = new GUIButton(<br \/>\nMaterial.PAPER,<br \/>\n&#8220;\u00a7e\u00a7lClick Me&#8221;,<br \/>\nArrays.asList(&#8220;\u00a77Click to receive&#8221;, &#8220;\u00a77a message&#8221;),<br \/>\n(player, gui, button, slot) -> {<br \/>\nplayer.sendMessage(&#8220;\u00a7aYou clicked the button!&#8221;);<br \/>\nreturn true;<br \/>\n}<br \/>\n);<\/p>\n<p>\/\/ Add a button that closes the menu<br \/>\nGUIButton closeButton = new GUIButton(<br \/>\nMaterial.BARRIER,<br \/>\n&#8220;\u00a7c\u00a7lClose&#8221;,<br \/>\n(player, gui, button, slot) -> {<br \/>\nplayer.closeInventory();<br \/>\nreturn true;<br \/>\n}<br \/>\n);<\/p>\n<p>\/\/ Place buttons in specific slots<br \/>\nmyMenu.setButton(13, messageButton);<br \/>\nmyMenu.setButton(26, closeButton);<\/p>\n<p>\/\/ Open the menu for a player<br \/>\nmyMenu.open(player);<br \/>\n&#8220;`<\/p>\n<p>### Using the Builder Pattern<\/p>\n<p>You can also use the builder pattern for cleaner menu creation:<\/p>\n<p>&#8220;`java<br \/>\nGUI menu = new GUI.Builder()<br \/>\n.title(&#8220;\u00a76\u00a7lMy Menu&#8221;)<br \/>\n.rows(3)<br \/>\n.build();<\/p>\n<p>\/\/ Then add buttons and open as normal<br \/>\n&#8220;`<\/p>\n<p>### Dynamic Button Updates<\/p>\n<p>Buttons can update themselves in response to clicks:<\/p>\n<p>&#8220;`java<br \/>\nGUIButton counterButton = new GUIButton(<br \/>\nMaterial.EMERALD,<br \/>\n&#8220;\u00a7a\u00a7lClicks: \u00a7f0&#8221;,<br \/>\n(player, gui, button, slot) -> {<br \/>\n\/\/ Extract current count from name<br \/>\nString name = ChatColor.stripColor(button.getItem().getItemMeta().getDisplayName());<br \/>\nint count = Integer.parseInt(name.split(&#8220;: &#8220;)[1]) + 1;<\/p>\n<p>\/\/ Update button name<br \/>\nbutton.setName(&#8220;\u00a7a\u00a7lClicks: \u00a7f&#8221; + count);<\/p>\n<p>\/\/ Update the inventory display<br \/>\ngui.updateInventory();<\/p>\n<p>return true;<br \/>\n}<br \/>\n);<br \/>\n&#8220;`<\/p>\n<p>### Sub-Menus and Navigation<\/p>\n<p>You can easily create navigation systems between menus:<\/p>\n<p>&#8220;`java<br \/>\n\/\/ In your main menu creation:<br \/>\nGUIButton settingsButton = new GUIButton(<br \/>\nMaterial.REDSTONE_TORCH,<br \/>\n&#8220;\u00a7b\u00a7lSettings&#8221;,<br \/>\n(player, gui, button, slot) -> {<br \/>\nopenSettingsMenu(player); \/\/ Your method to create\/open settings menu<br \/>\nreturn true;<br \/>\n}<br \/>\n);<\/p>\n<p>\/\/ And in your settings menu:<br \/>\nGUIButton backButton = new GUIButton(<br \/>\nMaterial.ARROW,<br \/>\n&#8220;\u00a7e\u00a7lBack&#8221;,<br \/>\n(player, gui, button, slot) -> {<br \/>\nopenMainMenu(player); \/\/ Your method to create\/open main menu<br \/>\nreturn true;<br \/>\n}<br \/>\n);<br \/>\n&#8220;`<\/p>\n<p>## Advanced Features<\/p>\n<p>### Custom Button Actions<\/p>\n<p>You can create different types of button actions:<\/p>\n<p>&#8220;`java<br \/>\n\/\/ Teleport button<br \/>\nGUIButton teleportButton = new GUIButton(<br \/>\nMaterial.ENDER_PEARL,<br \/>\n&#8220;\u00a75\u00a7lTeleport to Spawn&#8221;,<br \/>\n(player, gui, button, slot) -> {<br \/>\nplayer.closeInventory();<br \/>\nplayer.teleport(player.getWorld().getSpawnLocation());<br \/>\nplayer.sendMessage(&#8220;\u00a7aTeleported to spawn!&#8221;);<br \/>\nreturn true;<br \/>\n}<br \/>\n);<\/p>\n<p>\/\/ Command execution button<br \/>\nGUIButton commandButton = new GUIButton(<br \/>\nMaterial.COMMAND_BLOCK,<br \/>\n&#8220;\u00a7c\u00a7lExecute Command&#8221;,<br \/>\n(player, gui, button, slot) -> {<br \/>\nplayer.closeInventory();<br \/>\nplayer.performCommand(&#8220;spawn&#8221;);<br \/>\nreturn true;<br \/>\n}<br \/>\n);<br \/>\n&#8220;`<\/p>\n<p>### Item Builders<\/p>\n<p>Use the GUIButton builder for even cleaner button creation:<\/p>\n<p>&#8220;`java<br \/>\nGUIButton button = new GUIButton.Builder()<br \/>\n.material(Material.DIAMOND)<br \/>\n.name(&#8220;\u00a7b\u00a7lPremium Features&#8221;)<br \/>\n.lore(&#8220;\u00a77Click to view premium options&#8221;)<br \/>\n.lore(&#8220;\u00a77Cost: $10&#8221;)<br \/>\n.onClick((player, gui, button, slot) -> {<br \/>\n\/\/ Handle click<br \/>\nreturn true;<br \/>\n})<br \/>\n.build();<br \/>\n&#8220;`<\/p>\n<p>## Best Practices<\/p>\n<p>1. **Resource Management**: Close GUIs when your plugin disables.<br \/>\n2. **Error Handling**: Check for null values when dealing with inventories.<br \/>\n3. **Performance**: Create menus on-demand rather than pre-creating all possible menus.<br \/>\n4. **Organization**: Create a separate manager class in your plugin for all your GUIs.<br \/>\n5. **Player Data**: Store player-specific data externally, not in the GUI itself.<\/p>\n<p>## Complete Example<\/p>\n<p>See the `ExampleGUI.java` class in the GUIEngine source code for a complete example of creating menus, submenus, and various button types.<\/p>\n<p>## License<\/p>\n<p>GUIEngine is licensed under the MIT License. Feel free to use, modify, and distribute as needed.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>API for creating GUI menus in Minecraft<\/p>\n","protected":false},"featured_media":78429,"template":"","meta":{"_minecraft_slug":"gui-engine","_minecraft_project_id":"WzpSHcB0","_minecraft_author":"sasukelol21","_minecraft_license":"LicenseRef-All-Rights-Reserved","_minecraft_downloads":178,"_minecraft_follows":0,"_minecraft_client_side":"unsupported","_minecraft_server_side":"required","_minecraft_storage_type":"zip","_minecraft_archive_name":"gui-engine.zip","_minecraft_size_bytes":17680,"_minecraft_version_count":1,"_minecraft_updated_at":"2026-05-16T13:03:50.017973Z","_minecraft_date_created":"2025-12-17T23:14:35.834323Z","_minecraft_date_modified":"2025-12-16T21:04:42.546518Z","_minecraft_project_url":"https:\/\/modrinth.com\/mod\/gui-engine","_minecraft_icon_attachment_id":78429,"_minecraft_imported_at":"2026-06-04T12:33:54+00:00","_minecraft_import_hash":"0206db117b8a18c04d9d84de090a782a","_minecraft_versions":"","_minecraft_links":"","_minecraft_gallery":"","_minecraft_api_metadata":""},"mod_category":[124,873,127,129,92],"mod_loader":[130,132,134],"minecraft_version":[62,37,40,41,73,74,38,78,79,80,81,82],"class_list":["post-78428","mod","type-mod","status-publish","has-post-thumbnail","hentry","mod_category-bukkit","mod_category-library","mod_category-paper","mod_category-spigot","mod_category-utility","mod_loader-bukkit","mod_loader-paper","mod_loader-spigot","minecraft_version-1-21","minecraft_version-1-21-1","minecraft_version-1-21-10","minecraft_version-1-21-11","minecraft_version-1-21-2","minecraft_version-1-21-3","minecraft_version-1-21-4","minecraft_version-1-21-5","minecraft_version-1-21-6","minecraft_version-1-21-7","minecraft_version-1-21-8","minecraft_version-1-21-9"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>GUI Engine - Minecraft<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vpesports.com\/minecraft\/mods\/gui-engine\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"GUI Engine - Minecraft\" \/>\n<meta property=\"og:description\" content=\"API for creating GUI menus in Minecraft\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vpesports.com\/minecraft\/mods\/gui-engine\/\" \/>\n<meta property=\"og:site_name\" content=\"Minecraft\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/gui-engine\\\/\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/gui-engine\\\/\",\"name\":\"GUI Engine - Minecraft\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/gui-engine\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/gui-engine\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/gui-engine-icon-d2ebcdacafd6d5b5e9c0a99319764da401d937d7_96.webp\",\"datePublished\":\"2026-06-04T12:33:53+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/gui-engine\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/gui-engine\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/gui-engine\\\/#primaryimage\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/gui-engine-icon-d2ebcdacafd6d5b5e9c0a99319764da401d937d7_96.webp\",\"contentUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/gui-engine-icon-d2ebcdacafd6d5b5e9c0a99319764da401d937d7_96.webp\",\"width\":96,\"height\":72},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/gui-engine\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mods\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"GUI Engine\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\",\"name\":\"Minecraft\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"GUI Engine - Minecraft","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vpesports.com\/minecraft\/mods\/gui-engine\/","og_locale":"en_US","og_type":"article","og_title":"GUI Engine - Minecraft","og_description":"API for creating GUI menus in Minecraft","og_url":"https:\/\/vpesports.com\/minecraft\/mods\/gui-engine\/","og_site_name":"Minecraft","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/vpesports.com\/minecraft\/mods\/gui-engine\/","url":"https:\/\/vpesports.com\/minecraft\/mods\/gui-engine\/","name":"GUI Engine - Minecraft","isPartOf":{"@id":"https:\/\/vpesports.com\/minecraft\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/gui-engine\/#primaryimage"},"image":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/gui-engine\/#primaryimage"},"thumbnailUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/gui-engine-icon-d2ebcdacafd6d5b5e9c0a99319764da401d937d7_96.webp","datePublished":"2026-06-04T12:33:53+00:00","breadcrumb":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/gui-engine\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vpesports.com\/minecraft\/mods\/gui-engine\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/vpesports.com\/minecraft\/mods\/gui-engine\/#primaryimage","url":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/gui-engine-icon-d2ebcdacafd6d5b5e9c0a99319764da401d937d7_96.webp","contentUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/gui-engine-icon-d2ebcdacafd6d5b5e9c0a99319764da401d937d7_96.webp","width":96,"height":72},{"@type":"BreadcrumbList","@id":"https:\/\/vpesports.com\/minecraft\/mods\/gui-engine\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vpesports.com\/minecraft\/"},{"@type":"ListItem","position":2,"name":"Mods","item":"https:\/\/vpesports.com\/minecraft\/mods\/"},{"@type":"ListItem","position":3,"name":"GUI Engine"}]},{"@type":"WebSite","@id":"https:\/\/vpesports.com\/minecraft\/#website","url":"https:\/\/vpesports.com\/minecraft\/","name":"Minecraft","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vpesports.com\/minecraft\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod\/78428","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod"}],"about":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/types\/mod"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media\/78429"}],"wp:attachment":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media?parent=78428"}],"wp:term":[{"taxonomy":"mod_category","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_category?post=78428"},{"taxonomy":"mod_loader","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_loader?post=78428"},{"taxonomy":"minecraft_version","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/minecraft_version?post=78428"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}