{"id":119336,"date":"2026-06-07T03:27:01","date_gmt":"2026-06-07T00:27:01","guid":{"rendered":"https:\/\/vpesports.com\/minecraft\/mods\/paperui\/"},"modified":"2026-06-07T03:27:01","modified_gmt":"2026-06-07T00:27:01","slug":"paperui","status":"publish","type":"mod","link":"https:\/\/vpesports.com\/minecraft\/mods\/paperui\/","title":{"rendered":"PaperUI"},"content":{"rendered":"<p># PaperUI<br \/>\nA Java\/Kotlin library for creating user interfaces on Paper servers<\/p>\n<p>## How to use<br \/>\nEither: Add PaperUI as a plugin to your Paper server and add PaperUI to your dependencies in `plugin.yml` or `paper-plugin.yml`<br \/>\nOr: Include PaperUI in your plugin<\/p>\n<p>### Maven<br \/>\n&#8220;`xml<br \/>\n<repositories><br \/>\n    <repository><br \/>\n        <id>DiruptioPublic<\/id><br \/>\n        <url>https:\/\/repo.diruptio.de\/repository\/maven-public<\/url><br \/>\n    <\/repository><br \/>\n<\/repositories><br \/>\n&#8220;`<br \/>\n&#8220;`xml<br \/>\n<dependencies><br \/>\n    <dependency><br \/>\n        <groupId>de.fabiexe<\/groupId><br \/>\n        <artifactId>PaperUI<\/artifactId><br \/>\n        <version>VERSION<\/version><br \/>\n    <\/dependency><br \/>\n<\/dependencies><br \/>\n&#8220;`<\/p>\n<p>### Gradle<br \/>\n&#8220;`kotlin<br \/>\nrepositories {<br \/>\n    maven(&#8220;https:\/\/repo.diruptio.de\/repository\/maven-public&#8221;)<br \/>\n}<br \/>\n&#8220;`<br \/>\n&#8220;`kotlin<br \/>\ndependencies {<br \/>\n    compileOnly(&#8220;de.fabiexe:PaperUI:VERSION&#8221;)<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>## DialogUI<br \/>\nA dialog user interface can have properties\/inputs, buttons and action buttons.<br \/>\nExample:<br \/>\n<img decoding=\"async\" src=\".github\/assets\/OrderPizzaUI.png\" alt=\"OrderPizzaUI\"><\/p>\n<p>### Kotlin<br \/>\n&#8220;`kotlin<br \/>\nenum class PizzaType {<br \/>\n    MARGHERITA, FUNGHI, PROSCIUTTO<br \/>\n}<\/p>\n<p>fun create(audience: Audience) = DialogUI(audience).apply {<br \/>\n    title(&#8220;Order a Pizza&#8221;)<br \/>\n    val type by enumProperty(&#8220;Type&#8221;, PizzaType::class.java)<br \/>\n    val extraCheese by booleanProperty(&#8220;Add Extra Cheese&#8221;)<br \/>\n    val radius by doubleProperty(&#8220;Radius (cm)&#8221;, 15.0, 20.0)<br \/>\n    val amount by integerProperty(&#8220;Amount&#8221;, 1, 10, 1)<br \/>\n    val address by stringProperty(&#8220;Address&#8221;)<\/p>\n<p>    actionButton(&#8220;Order&#8221;) {<br \/>\n        var pizza = &#8220;$type with radius ${radius}cm&#8221;<br \/>\n        if (extraCheese.get()) {<br \/>\n            pizza += &#8221; with extra cheese&#8221;<br \/>\n        }<br \/>\n        val message = &#8220;We will deliver $amount $pizza to $address&#8221;<br \/>\n        audience.sendMessage(Component.text(message))<br \/>\n    }<br \/>\n    actionButton(&#8220;Cancel&#8221;)<br \/>\n}<br \/>\n&#8220;`<br \/>\n&#8220;`kotlin<br \/>\nfun doSomething() {<br \/>\n    create(player).open()<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>### Java (short)<br \/>\n&#8220;`java<br \/>\npublic class OrderDrugsUI {<br \/>\n    public static DialogUI<Audience> create(@NotNull Audience audience) {<br \/>\n        DialogUI<Audience> ui = new DialogUI<>(audience);<\/p>\n<p>        ui.title(&#8220;Order drugs&#8221;);<\/p>\n<p>        Property<DrugType> type = ui.enumProperty(&#8220;Type&#8221;, DrugType.class);<br \/>\n        Property<Double> dosis = ui.doubleProperty(&#8220;Dosis (%)&#8221;, 50, 120, 100);<br \/>\n        Property<Integer> amount = ui.integerProperty(&#8220;Amount&#8221;, 1, 10);<br \/>\n        Property<String> address = ui.stringProperty(&#8220;Address&#8221;);<\/p>\n<p>        ui.actionButton(&#8220;Order&#8221;, () -> {<br \/>\n            String drug = type.get() + &#8221; with dosis &#8221; + dosis.get() + &#8220;%&#8221;;<br \/>\n            String message = &#8220;We will deliver &#8221; + amount.get() + &#8221; &#8221; + drug + &#8221; to &#8221; + address.get();<br \/>\n            audience.sendMessage(Component.text(message));<br \/>\n        });<br \/>\n        ui.actionButton(&#8220;Cancel&#8221;);<\/p>\n<p>        return ui;<br \/>\n    }<\/p>\n<p>    private enum DrugType {<br \/>\n        CANNABIS, COCAINE, HEROIN, FENTANYL<br \/>\n    }<br \/>\n}<br \/>\n&#8220;`<br \/>\n&#8220;`java<br \/>\npublic void doSomething() {<br \/>\n    OrderDrugsUI.create(player).open();<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>### Java (long)<br \/>\n&#8220;`java<br \/>\npublic class OrderCoffeeUI extends DialogUI<Audience> {<br \/>\n    private final Property<CoffeeType> type;<br \/>\n    private final Property<Double> size;<br \/>\n    private final Property<Boolean> milk;<br \/>\n    private final Property<Integer> amount;<br \/>\n    private final Property<String> address;<\/p>\n<p>    public OrderCoffeeUI(@NotNull Audience audience) {<br \/>\n        super(audience);<\/p>\n<p>        title(&#8220;Order a Coffee&#8221;);<br \/>\n        type = enumProperty(&#8220;Type&#8221;, CoffeeType.class);<br \/>\n        size = doubleProperty(&#8220;Size (liters)&#8221;, 0.25, 1, 0.33);<br \/>\n        milk = booleanProperty(&#8220;Add milk&#8221;);<br \/>\n        amount = integerProperty(&#8220;Amount&#8221;, 1, 10);<br \/>\n        address = stringProperty(&#8220;Address&#8221;);<\/p>\n<p>        actionButton(&#8220;Order&#8221;, this::order);<br \/>\n        actionButton(&#8220;Cancel&#8221;);<br \/>\n    }<\/p>\n<p>    private void order() {<br \/>\n        String coffee = type.get() + &#8221; with size &#8221; + size.get() + &#8220;l&#8221;;<br \/>\n        if (milk.get()) {<br \/>\n            coffee += &#8221; with milk&#8221;;<br \/>\n        }<br \/>\n        String message = &#8220;We will deliver &#8221; + amount.get() + &#8221; &#8221; + coffee + &#8221; to &#8221; + address.get();<br \/>\n        audience.sendMessage(Component.text(message));<br \/>\n    }<\/p>\n<p>    private enum CoffeeType {<br \/>\n        COFFEE, ESPRESSO, CHOCOLATE_COFFEE, DOUBLE_CHOCOLATE_COFFEE<br \/>\n    }<br \/>\n}<br \/>\n&#8220;`<br \/>\n&#8220;`java<br \/>\npublic void doSomething() {<br \/>\n    new OrderCoffeUI(player).open();<br \/>\n}<br \/>\n&#8220;`<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A Java\/Kotlin library for creating user interfaces on Paper servers<\/p>\n","protected":false},"featured_media":0,"template":"","meta":{"_minecraft_slug":"paperui","_minecraft_project_id":"JdoLDo8L","_minecraft_author":"FabiPunktExe","_minecraft_license":"MIT","_minecraft_downloads":354,"_minecraft_follows":4,"_minecraft_client_side":"unsupported","_minecraft_server_side":"required","_minecraft_storage_type":"zip","_minecraft_archive_name":"paperui.zip","_minecraft_size_bytes":17322717,"_minecraft_version_count":10,"_minecraft_updated_at":"2026-05-16T11:20:08.037144Z","_minecraft_date_created":"2025-09-04T01:06:53.576829Z","_minecraft_date_modified":"2025-11-26T22:02:36.457119Z","_minecraft_project_url":"https:\/\/modrinth.com\/mod\/paperui","_minecraft_icon_attachment_id":0,"_minecraft_imported_at":"2026-06-07T00:27:02+00:00","_minecraft_import_hash":"358d1a82326e8516013efbe1f4568e70","_minecraft_versions":"","_minecraft_links":"","_minecraft_gallery":"","_minecraft_api_metadata":""},"mod_category":[873,126,127,128,123,92],"mod_loader":[132,133],"minecraft_version":[40,81,82],"class_list":["post-119336","mod","type-mod","status-publish","hentry","mod_category-library","mod_category-management","mod_category-paper","mod_category-purpur","mod_category-technology","mod_category-utility","mod_loader-paper","mod_loader-purpur","minecraft_version-1-21-10","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>PaperUI - 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\/paperui\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PaperUI - Minecraft\" \/>\n<meta property=\"og:description\" content=\"A Java\/Kotlin library for creating user interfaces on Paper servers\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vpesports.com\/minecraft\/mods\/paperui\/\" \/>\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=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/paperui\\\/\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/paperui\\\/\",\"name\":\"PaperUI - Minecraft\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\"},\"datePublished\":\"2026-06-07T00:27:01+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/paperui\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/paperui\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/paperui\\\/#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\":\"PaperUI\"}]},{\"@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":"PaperUI - 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\/paperui\/","og_locale":"en_US","og_type":"article","og_title":"PaperUI - Minecraft","og_description":"A Java\/Kotlin library for creating user interfaces on Paper servers","og_url":"https:\/\/vpesports.com\/minecraft\/mods\/paperui\/","og_site_name":"Minecraft","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/vpesports.com\/minecraft\/mods\/paperui\/","url":"https:\/\/vpesports.com\/minecraft\/mods\/paperui\/","name":"PaperUI - Minecraft","isPartOf":{"@id":"https:\/\/vpesports.com\/minecraft\/#website"},"datePublished":"2026-06-07T00:27:01+00:00","breadcrumb":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/paperui\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vpesports.com\/minecraft\/mods\/paperui\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/vpesports.com\/minecraft\/mods\/paperui\/#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":"PaperUI"}]},{"@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\/119336","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:attachment":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media?parent=119336"}],"wp:term":[{"taxonomy":"mod_category","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_category?post=119336"},{"taxonomy":"mod_loader","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_loader?post=119336"},{"taxonomy":"minecraft_version","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/minecraft_version?post=119336"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}