\n \u003Ca href=\"https://github.com/WiIIiam278/HuskHomes/actions/workflows/ci.yml\">\n \u003Cimg src=\"https://img.shields.io/github/actions/workflow/status/WiIIiam278/HuskHomes/ci.yml?branch=master&logo=github\"/>\n \u003C/a> \n \u003Ca href=\"https://repo.william278.net/#/releases/net/william278/huskhomes/\">\n \u003Cimg src=\"https://repo.william278.net/api/badge/latest/releases/net/william278/huskhomes/huskhomes-common?color=00fb9a&name=Maven&prefix=v\" />\n \u003C/a> \n \u003Ca href=\"https://discord.gg/tVYhJfyDWG\">\n \u003Cimg src=\"https://img.shields.io/discord/818135932103557162.svg?label=&logo=discord&logoColor=fff&color=7389D8&labelColor=6A7EC2\" />\n \u003C/a> \n \u003Cbr/>\n \u003Cb>\n \u003Ca href=\"https://modrinth.com/plugin/huskhomes\">Modrinth\u003C/a>\n \u003C/b> —\n \u003Cb>\n \u003Ca href=\"https://william278.net/docs/huskhomes/setup\">Setup\u003C/a>\n \u003C/b> — \n \u003Cb>\n \u003Ca href=\"https://william278.net/docs/huskhomes/\">Docs\u003C/a>\n \u003C/b> — \n \u003Cb>\n \u003Ca href=\"https://github.com/WiIIiam278/HuskHomes/issues\">Issues\u003C/a>\n \u003C/b>\n\u003C/p>\n\u003Cbr/>\n\n**HuskHomes** is a powerful, intuitive and flexible teleportation plugin for _Minecraft: Java Edition_ servers. HuskHomes contains a meaty—but not bloated—set of player teleportation features, including set homes, warps, public homes, teleport requests, previous and offline position teleporting—and more. \n\nHuskHomes can be used on your Spigot or Fabric server, and with a MySQL Database even works cross-server, letting players teleport across your proxy (Bungee or Velocity) network! \n\n## Features\n**⭐ Works cross-server** — Let players seamlessly teleport and set homes across your proxies network of servers using MySQL/MariaDB.\n\n**⭐ Zero learning curve** — Your players already know how to use it! /sethome, /home, /tpa, /rtp—among others—are all built-in and easy-to-use.\n\n**⭐ Quick and beautiful menus** — Sometimes, simple is better. No monolithic chest GUIs—instead, robust and beautiful interactive chat menus.\n\n**⭐ Great admin features** — Comes with all the classic admin commands—/tp and /warp—as well as robust tools for managing other players' homes.\n\n**⭐ Plan & Web map plugin hooks** — Stay in touch with your community through home analytics via Plan and display homes on Dynmap or BlueMap.\n\n**⭐ Extensible API & open-source** — Still not enough? Extend the plugin with the HuskHomes API. Or, submit a pull request—we're open-source!\n\n## Development\nTo build HuskHomes, simply run the following in the root of the repository (building requires Java 21):\n\n```bash\n./gradlew clean build\n```\n\n## License\nHuskHomes is licensed under the Apache 2.0 license.\n\n- [License](https://github.com/WiIIiam278/HuskHomes/blob/master/LICENSE)\n\n## Translations\nTranslations of the plugin locales are welcome to help make the plugin more accessible. Please submit a pull request with your translations as a `.yml` file.\n\n- [Locales Directory](https://github.com/WiIIiam278/HuskHomes/tree/master/common/src/main/resources/locales)\n- [English Locales](https://github.com/WiIIiam278/HuskHomes/tree/master/common/src/main/resources/locales/en-gb.yml)\n\n## Links\n- [Docs](https://william278.net/docs/huskhomes/) — Read the plugin documentation!\n- [Modrinth](https://modrinth.com/plugin/huskhomes) — View the plugin Modrinth page (Also: [Spigot](https://www.spigotmc.org/resources/huskhomes.83767/), [Polymart](https://polymart.org/resource/huskhomes.284/), [Hangar](https://hangar.papermc.io/William278/HuskHomes), & [CurseForge](https://www.curseforge.com/minecraft/mc-mods/huskhomes/))\n- [Issues](https://github.com/WiIIiam278/HuskHomes/issues) — File a bug report or feature request\n- [Discord](https://discord.gg/tVYhJfyDWG) — Get help, ask questions\n- [bStats](https://bstats.org/plugin/bukkit/HuskHomes/8430) — View plugin metrics\n\n---\n© [William278](https://william278.net/), 2025. Licensed under the Apache-2.0 License.\n",[23,26,29,32,35,38],{"id":24,"url":25},"spigot","https://www.spigotmc.org/resources/huskhomes.83767/",{"id":27,"url":28},"modrinth","https://modrinth.com/plugin/huskhomes",{"id":30,"url":31},"polymart","https://polymart.org/resource/huskhomes.284",{"id":33,"url":34},"hangar","https://hangar.papermc.io/William278/HuskHomes",{"id":36,"url":37},"curseforge","https://www.curseforge.com/minecraft/mc-mods/huskhomes",{"id":39,"url":40},"bstats","https://bstats.org/plugin/bukkit/HuskHomes/8430",[42],"William278",[24,44,45],"paper","fabric",0,"",[49,99,147,176],{"order":46,"name":50,"children":51},"Setup",[52,61,83,88],{"order":46,"url":53,"title":50,"icon":54,"children":55},"setup","fa6-solid:book",[56],{"order":46,"url":57,"title":58,"icon":59,"children":60},"importing-data","Importing Data","carbon:migrate",[],{"order":62,"url":63,"title":64,"icon":65,"children":66},1,"config-files","Config","fa6-solid:file-code",[67,72,77],{"order":46,"url":68,"title":69,"icon":70,"children":71},"database","Database","fa6-solid:database",[],{"order":62,"url":73,"title":74,"icon":75,"children":76},"redis","Redis","devicon-plain:redis",[],{"order":78,"url":79,"title":80,"icon":81,"children":82},2,"translations","Locales","material-symbols:translate",[],{"order":78,"url":84,"title":85,"icon":86,"children":87},"compatibility","Compatibility","material-symbols:warning-outline-rounded",[],{"order":89,"url":90,"title":91,"icon":92,"children":93},3,"faqs","FAQs","fa6-solid:question",[94],{"order":46,"url":95,"title":96,"icon":97,"children":98},"troubleshooting","Troubleshooting","material-symbols:troubleshoot",[],{"order":62,"name":100,"children":101},"Features",[102,127,137],{"order":46,"url":103,"title":104,"icon":105,"children":106},"commands","Commands","octicon:command-palette-16",[107,112,117,122],{"order":46,"url":108,"title":109,"icon":110,"children":111},"command-conflicts","Command Conflicts","pepicons-pop:no-entry",[],{"order":62,"url":113,"title":114,"icon":115,"children":116},"cooldowns","Command Cooldowns","fa6-solid:clock",[],{"order":78,"url":118,"title":119,"icon":120,"children":121},"back-command","/back Command","lucide:skip-back",[],{"order":89,"url":123,"title":124,"icon":125,"children":126},"strict-tpahere","Strict /tpahere","material-symbols:lock",[],{"order":62,"url":128,"title":129,"icon":130,"children":131},"managing-access","Managing Access","mdi:user-lock",[132],{"order":46,"url":133,"title":134,"icon":135,"children":136},"restricted-warps","Restricted Warps","wpf:restriction-shield",[],{"order":78,"url":138,"title":139,"icon":140,"children":141},"global-spawn","Global Spawn","ri:global-line",[142],{"order":46,"url":143,"title":144,"icon":145,"children":146},"global-respawning","Global Respawning","mdi:bed",[],{"order":78,"name":148,"children":149},"Hooks",[150,155,160,165,170],{"order":46,"url":151,"title":152,"icon":153,"children":154},"placeholders","PlaceholderAPI Hook","fa6-solid:tag",[],{"order":62,"url":156,"title":157,"icon":158,"children":159},"economy-hook","Vault Economy","tdesign:money-filled",[],{"order":78,"url":161,"title":162,"icon":163,"children":164},"plan-hook","Player Analytics","material-symbols:analytics-outline",[],{"order":89,"url":166,"title":167,"icon":168,"children":169},"luckperms-hook","LuckPerms","fa6-solid:clover",[],{"order":171,"url":172,"title":173,"icon":174,"children":175},4,"map-hooks","Dynmap, BlueMap, Pl3xMap","fa6-solid:map",[],{"order":89,"name":177,"children":178},"Developers",[179,194],{"order":46,"url":180,"title":181,"icon":182,"children":183},"api","API","mdi:api",[184,189],{"order":46,"url":185,"title":186,"icon":187,"children":188},"api-examples","API Examples","fa6-solid:lightbulb",[],{"order":62,"url":190,"title":191,"icon":192,"children":193},"api-events","API Events","mingcute:lightning-line",[],{"order":62,"url":19,"title":195,"icon":196,"children":197},"Source Code","fa6-solid:code",[],{"SVG":199,"PNG":200,"PNG_TRANSPARENT":201,"SVG_TRANSPARENT":202},"huskhomes.svg","huskhomes.png","huskhomes-transparent.png","huskhomes-transparent.svg",[],[],{"downloadCount":206,"averageRating":207,"numberOfRatings":208,"interactions":209,"onlinePlayers":210,"onlineServers":211},204686,4.60655737704918,61,192,3626,2389,{"slug":213,"restricted":20,"releaseChannels":214,"metadata":215,"stats":334},"husksync",[9,10],{"name":216,"tagline":217,"license":14,"tags":218,"github":219,"pullReadmeFromGithub":20,"readmeBody":220,"links":221,"maintainers":231,"compatibleSoftware":232,"suggestedRetailPrice":233,"linkedDiscordRole":234,"archived":7,"documentation":20,"documentationNav":235,"listDownloads":20,"hidden":7,"sortWeight":62,"icons":327,"properties":332,"images":333},"HuskSync","A modern, cross-server player data synchronisation system",[16,17,18],"https://github.com/WiIIiam278/HuskSync","\u003C!--suppress ALL -->\n\u003Cp align=\"center\">\n \u003Cimg src=\"images/banner.png\" alt=\"HuskSync\" />\n \u003Ca href=\"https://github.com/WiIIiam278/HuskSync/actions/workflows/ci_master.yml\">\n \u003Cimg src=\"https://img.shields.io/github/actions/workflow/status/WiIIiam278/HuskSync/ci_master.yml?branch=master&logo=github\"/>\n \u003C/a>\n \u003Ca href=\"https://repo.william278.net/#/releases/net/william278/husksync/\">\n \u003Cimg src=\"https://repo.william278.net/api/badge/latest/releases/net/william278/husksync/husksync-common?color=00fb9a&name=Maven&prefix=v\" />\n \u003C/a>\n \u003Ca href=\"https://discord.gg/tVYhJfyDWG\">\n \u003Cimg src=\"https://img.shields.io/discord/818135932103557162.svg?label=&logo=discord&logoColor=fff&color=7389D8&labelColor=6A7EC2\" />\n \u003C/a> \n \u003Cbr/>\n \u003Cb>\n \u003Ca href=\"https://www.spigotmc.org/resources/husksync.97144/\">Spigot\u003C/a>\n \u003C/b> —\n \u003Cb>\n \u003Ca href=\"https://william278.net/docs/husksync/setup\">Setup\u003C/a>\n \u003C/b> — \n \u003Cb>\n \u003Ca href=\"https://william278.net/docs/husksync/\">Docs\u003C/a>\n \u003C/b> — \n \u003Cb>\n \u003Ca href=\"https://github.com/WiIIiam278/HuskSync/issues\">Issues\u003C/a>\n \u003C/b>\n\u003C/p>\n\u003Cbr/>\n\n**HuskSync** is a modern, cross-server player data synchronization system that enables the comprehensive synchronization of your user's data across multiple proxied servers. It does this by making use of Redis and a MySQL/Mongo/PostgreSQL to optimally cache data while players change servers.\n\n## Features\n**⭐ Seamless synchronization** — Utilises optimised Redis caching when players change server to sync player data super quickly for a seamless experience.\n\n**⭐ Complete player synchronization** — Sync inventories, Ender Chests, health, hunger, effects, advancements, statistics, locked maps & [more](https://william278.net/docs/husksync/sync-features)—no data left behind!\n\n**⭐ Backup, restore & rotate** — Something gone wrong? Restore players back to a previous data state. Rotate and manage data snapshots in-game!\n\n**⭐ Import existing data** — Import your MySQLPlayerDataBridge data—or from your existing world data! No server reset needed!\n\n**⭐ Works great with Plan** — Stay in touch with your community through HuskSync analytics on your Plan web panel.\n\n**⭐ Extensible API & open-source** — Need more? Extend the plugin with the Developer API. Or, submit a pull request through our code bounty system!\n\n**Ready?** [It's syncing time!](https://william278.net/docs/husksync/setup)\n\n## Compatibility\nHuskSync supports the following [compatible versions](https://william278.net/docs/husksync/compatibility) of Minecraft. Since v3.7, you must download the correct version of HuskSync for your server:\n\n| Minecraft | Latest HuskSync | Java Version | Platforms | Support Status |\n|:---------------:|:---------------:|:------------:|:--------------|:-----------------------------|\n| 1.21.4 | _latest_ | 21 | Paper, Fabric | ✅ **Active Release** |\n| 1.21.3 | 3.7.1 | 21 | Paper, Fabric | 🗃️ Archived (December 2024) |\n| 1.21.1 | _latest_ | 21 | Paper, Fabric | ✅ **November 2025** (LTS) |\n| 1.20.6 | 3.6.8 | 17 | Paper | 🗃️ Archived (October 2024) |\n| 1.20.4 | 3.6.8 | 17 | Paper | 🗃️ Archived (July 2024) |\n| 1.20.1 | _latest_ | 17 | Paper, Fabric | ✅ **November 2025** (LTS) |\n| 1.17.1 - 1.19.4 | 3.6.8 | 17 | Paper | 🗃️ Archived |\n| 1.16.5 | 3.2.1 | 16 | Paper | 🗃️ Archived |\n\nHuskSync is primarily developed against the latest release. Old Minecraft versions are allocated a support channel based on popularity, mod support, etc:\n\n* Long Term Support (LTS) – Supported for up to 12-18 months\n* Non-Long Term Support (Non-LTS) – Supported for 3-6 months\n\nVerify your purchase on Discord and [Download HuskSync](https://william278.net/project/husksync/download) for your server.\n\n## Setup\nRequires a [MySQL/MariaDB/Mongo/PostgreSQL database](https://william278.net/docs/husksync/database), a [Redis (v5.0+) server]((https://william278.net/docs/husksync/redis)) and a network of [compatible Spigot or Fabric Minecraft servers](https://william278.net/docs/husksync/compatibility).\n\n1. Place the plugin jar file in the `/plugins` or `/mods` directory of each Spigot/Fabric server. You do not need to install HuskSync as a proxy plugin.\n2. Start, then stop every server to let HuskSync generate the config file.\n3. Navigate to the HuskSync config file on each server and fill in both your database and Redis server credentials.\n4. Start every server again and synchronization will begin.\n\n## Development\nTo build HuskSync, simply run the following in the root of the repository (building requires Java 21). Builds will be output in `/target`:\n\n```bash\n./gradlew clean build\n```\n\n### License\nHuskSync is licensed under the Apache 2.0 license.\n\n- [License](https://github.com/WiIIiam278/HuskSync/blob/master/LICENSE)\n\nContributions to the project are welcome—feel free to open a pull request with new features, improvements and/or fixes!\n\n### Support\nDue to its complexity, official binaries and customer support for HuskSync is provided through a paid model. This means that support is only available to users who have purchased a license to the plugin from Spigot, Polymart, or BuiltByBit and have provided proof of purchase. Please join our Discord server if you have done so and need help!\n\n### Translations\nTranslations of the plugin locales are welcome to help make the plugin more accessible. Please submit a pull request with your translations as a `.yml` file.\n\n- [Locales Directory](https://github.com/WiIIiam278/HuskSync/tree/master/common/src/main/resources/locales)\n- [English Locales](https://github.com/WiIIiam278/HuskSync/tree/master/common/src/main/resources/locales/en-gb.yml)\n\n## Links\n- [Docs](https://william278.net/docs/husksync/) — Read the plugin documentation!\n- [Spigot](https://www.spigotmc.org/resources/husksync.97144/) — View the Spigot resource page (Also: [Polymart](https://polymart.org/resource/husksync.1634), [Craftaro](https://craftaro.com/marketplace/product/husksync.758), [BuiltByBit](https://builtbybit.com/resources/husksync.34956/))\n- [Issues](https://github.com/WiIIiam278/HuskSync/issues) — File a bug report or feature request\n- [Discord](https://discord.gg/tVYhJfyDWG) — Get help, ask questions (Purchase required)\n- [bStats](https://bstats.org/plugin/bukkit/HuskSync%20-%20Bukkit/13140) — View plugin metrics\n\n---\n© [William278](https://william278.net/), 2025. Licensed under the Apache-2.0 License.\n",[222,224,226,229],{"id":24,"url":223},"https://www.spigotmc.org/resources/husksync.97144/",{"id":30,"url":225},"https://polymart.org/resource/husksync.1634",{"id":227,"url":228},"builtbybit","https://builtbybit.com/resources/husksync.34956/",{"id":39,"url":230},"https://bstats.org/plugin/bukkit/HuskSync%20-%20Bukkit/13140",[42],[24,44,45],11.99,"901578725487955978",[236,264,286,304],{"order":46,"name":50,"children":237},[238,249,258,260],{"order":46,"url":53,"title":50,"icon":54,"children":239},[240,244],{"order":46,"url":241,"title":242,"icon":59,"children":243},"mpdb-migration","MPDB Migration",[],{"order":62,"url":245,"title":246,"icon":247,"children":248},"legacy-migration","Legacy Migration","material-symbols:upgrade-rounded",[],{"order":62,"url":250,"title":64,"icon":65,"children":251},"config-file",[252,254,256],{"order":46,"url":68,"title":69,"icon":70,"children":253},[],{"order":62,"url":73,"title":74,"icon":75,"children":255},[],{"order":78,"url":79,"title":80,"icon":81,"children":257},[],{"order":78,"url":84,"title":85,"icon":86,"children":259},[],{"order":89,"url":90,"title":91,"icon":92,"children":261},[262],{"order":46,"url":95,"title":96,"icon":97,"children":263},[],{"order":62,"name":100,"children":265},[266,268,283],{"order":46,"url":103,"title":104,"icon":105,"children":267},[],{"order":62,"url":269,"title":270,"icon":271,"children":272},"sync-features","Sync Features","mdi:sync",[273,278],{"order":46,"url":274,"title":275,"icon":276,"children":277},"sync-modes","Sync Modes","mdi:cog-sync",[],{"order":62,"url":279,"title":280,"icon":281,"children":282},"data-rotation","Data Rotation","icon-park-outline:rotate",[],{"order":78,"url":161,"title":284,"icon":163,"children":285},"Player Analytics Hook",[],{"order":78,"name":287,"children":288},"Guides",[289,294,299],{"order":46,"url":290,"title":291,"icon":292,"children":293},"dumping-userdata","Dumping UserData","fa6-solid:file-arrow-down",[],{"order":62,"url":295,"title":296,"icon":297,"children":298},"keep-inventory","Keep Inventory","material-symbols:inventory-2-outline",[],{"order":78,"url":300,"title":301,"icon":302,"children":303},"event-priorities","Event Priorities","ic:round-low-priority",[],{"order":89,"name":177,"children":305},[306,321,325],{"order":46,"url":180,"title":307,"icon":182,"children":308},"API v3",[309,314,319],{"order":46,"url":310,"title":311,"icon":312,"children":313},"data-snapshot-api","Data Snapshot API","carbon:ibm-cloud-vpc-block-storage-snapshots",[],{"order":62,"url":315,"title":316,"icon":317,"children":318},"custom-data-api","Custom Data API","material-symbols:inbox-customize",[],{"order":78,"url":190,"title":191,"icon":192,"children":320},[],{"order":62,"url":322,"title":323,"icon":182,"children":324},"api-v2","API v2 (legacy)",[],{"order":78,"url":219,"title":195,"icon":196,"children":326},[],{"SVG":328,"PNG":329,"PNG_TRANSPARENT":330,"SVG_TRANSPARENT":331},"husksync.svg","husksync.png","husksync-transparent.png","husksync-transparent.svg",[],[],{"downloadCount":335,"averageRating":336,"numberOfRatings":337,"interactions":338,"onlinePlayers":339,"onlineServers":340},3352,4.156862558103075,51,254,2501,818,{"slug":342,"restricted":20,"releaseChannels":343,"metadata":344,"stats":448},"husktowns",[9,10],{"name":345,"tagline":346,"license":14,"tags":347,"github":348,"pullReadmeFromGithub":20,"readmeBody":349,"links":350,"maintainers":357,"compatibleSoftware":358,"suggestedRetailPrice":359,"linkedDiscordRole":360,"archived":7,"documentation":20,"documentationNav":361,"listDownloads":20,"hidden":7,"sortWeight":78,"icons":441,"properties":446,"images":447},"HuskTowns","An intuitive, cross-server Towny-style protection solution",[16,17,18],"https://github.com/WiIIiam278/HuskTowns","\u003C!--suppress ALL -->\n\u003Cp align=\"center\">\n \u003Cimg src=\"images/banner.png\" alt=\"HuskTowns\" />\n \u003Ca href=\"https://github.com/WiIIiam278/HuskTowns/actions/workflows/ci.yml\">\n \u003Cimg src=\"https://img.shields.io/github/actions/workflow/status/WiIIiam278/HuskTowns/ci.yml?branch=master&logo=github\"/>\n \u003C/a> \n \u003Ca href=\"https://repo.william278.net/#/releases/net/william278/husktowns/\">\n \u003Cimg src=\"https://repo.william278.net/api/badge/latest/releases/net/william278/husktowns/husktowns-common?color=00fb9a&name=Maven&prefix=v\" />\n \u003C/a> \n \u003Ca href=\"https://discord.gg/tVYhJfyDWG\">\n \u003Cimg src=\"https://img.shields.io/discord/818135932103557162.svg?label=&logo=discord&logoColor=fff&color=7389D8&labelColor=6A7EC2\" />\n \u003C/a> \n \u003Cbr/>\n \u003Cb>\n \u003Ca href=\"https://www.spigotmc.org/resources/husktowns.92672/\">Spigot\u003C/a>\n \u003C/b> —\n \u003Cb>\n \u003Ca href=\"https://william278.net/docs/husktowns/setup\">Setup\u003C/a>\n \u003C/b> — \n \u003Cb>\n \u003Ca href=\"https://william278.net/docs/husktowns/\">Docs\u003C/a>\n \u003C/b> — \n \u003Cb>\n \u003Ca href=\"http://github.com/WiIIiam278/HuskTowns/issues\">Issues\u003C/a>\n \u003C/b>\n\u003C/p>\n\u003Cbr/>\n\n**HuskTowns** is a simple and elegant proxy-compatible Towny-style protection plugin for Spigot-based Minecraft servers. Let players form towns, claim chunks and carve out a thriving community. Built into HuskTowns is a robust and beautiful chat interface with a plethora of admin tools and config options to let you tailor the plugin to your needs.\n\nAll of this is supported on both standalone setups and across a network of proxied servers—with support for a good range of add-ons to further enhance your experience.\n\n## Features\n**⭐ Works cross-server** — Let players seamlessly manage their towns, claims and teleport to their town spawn across your proxy network!\n\n**⭐ Super intuitive** — Users will pick up how to use it right away! Make a town with /town create and claim a chunk with /town claim to get started.\n\n**⭐ Quick and beautiful menus** — Sometimes, simple is better. No monolithic chest GUIs—instead, robust and beautiful interactive chat menus.\n\n**⭐ Great admin features** — Manage the towns on your server and easily make admin claims. Comes with built-in support for Dynmap, BlueMap, Pl3xMap, Plan, LuckPerms, HuskHomes & more!\n\n**⭐ Easy to configure** — Players can fine-tune town flags and access settings in-game, and admins can easily configure roles and levels through a simple config structure.\n\n**⭐ Extensible API & open-source** — Need more? Extend the plugin with the Developer API. Or, submit a pull request through our code bounty system!\n\n**Ready?** [Let's head down town!](https://william278.net/docs/husktowns/setup)\n\n## Setup\nRequires Java 17+ and a Minecraft 1.17.1+ Spigot-based server. A MySQL database and (optionally) Redis are also needed if you wish to run the plugin across multiple servers on a proxy network.\n\n1. Place the plugin jar file in the `/plugins/` directory of each Spigot server you want to install it on.\n2. Start, then stop every server to let HuskTowns generate the config file.\n3. Navigate to the HuskTowns config file on each server (`~/plugins/HuskTowns/config.yml`) \n4. Configure the plugin to your liking. If you are running HuskTowns across multiple servers, enable `cross_server` mode and fill in your MySQL credentials, remembering to change the database type to `MYSQL` as well.\n5. You can also modify the level requirements in `~/levels.yml`, the default town rule settings in `~/rules.yml` and the town roles in `~/roles.yml`\n6. Start every server again and HuskTowns should have completed installation!\n\n## Development\nTo build HuskTowns, simply run the following in the root of the repository:\n\n```bash\n./gradlew clean build\n```\n\n### License\nHuskTowns is licensed under the Apache 2.0 license.\n\n- [License](https://github.com/WiIIiam278/HuskTowns/blob/master/LICENSE)\n\nContributions to the project are welcome—feel free to open a pull request with new features, improvements and/or fixes!\n\n### Support\nDue to its complexity, official binaries and customer support for HuskTowns is provided through a paid model. This means that support is only available to users who have purchased a license to the plugin from Spigot, Polymart, Craftaro, or BuiltByBit and have provided proof of purchase. Please join our Discord server if you have done so and need help!\n\n## Translations\nTranslations of the plugin locales are welcome to help make the plugin more accessible. Please submit a pull request with your translations as a `.yml` file. ([More info…](https://william278.net/docs/husktowns/translations))\n\n- [Locales Directory](https://github.com/WiIIiam278/HuskTowns/tree/master/common/src/main/resources/locales)\n- [English Locales](https://github.com/WiIIiam278/HuskTowns/tree/master/common/src/main/resources/locales/en-gb.yml)\n\n## Links\n- [Docs](https://william278.net/docs/husktowns) — Read the plugin documentation!\n- [Spigot](https://www.spigotmc.org/resources/husktowns.92672/) — View the Spigot resource page (Also: [Polymart](https://polymart.org/resource/husktowns.1056), [Craftaro](https://craftaro.com/marketplace/product/husktowns.622), [BuiltByBit](https://builtbybit.com/resources/husktowns.34959/))\n- [Issues](https://github.com/WiIIiam278/HuskTowns/issues) — File a bug report or feature request\n- [Discord](https://discord.gg/tVYhJfyDWG) — Get help, ask questions (Proof of purchase required)\n- [bStats](https://bstats.org/plugin/bukkit/HuskTowns/11265) — View plugin metrics\n\n---\n© [William278](https://william278.net/), 2024. Licensed under the Apache-2.0 License.\n",[351,353,355],{"id":24,"url":352},"https://www.spigotmc.org/resources/husktowns.92672/",{"id":30,"url":354},"https://polymart.org/resource/husktowns.1056",{"id":227,"url":356},"https://builtbybit.com/resources/husktowns.34959/",[42],[24,44],9.99,"842728756384759828",[362,377,415],{"order":46,"name":50,"children":363},[364,368],{"order":46,"url":53,"title":50,"icon":54,"children":365},[366],{"order":46,"url":245,"title":246,"icon":247,"children":367},[],{"order":62,"url":63,"title":64,"icon":65,"children":369},[370,372,375],{"order":46,"url":68,"title":69,"icon":70,"children":371},[],{"order":62,"url":373,"title":74,"icon":75,"children":374},"redis-support",[],{"order":78,"url":79,"title":80,"icon":81,"children":376},[],{"order":62,"name":100,"children":378},[379,381,401,406,411],{"order":46,"url":103,"title":104,"icon":105,"children":380},[],{"order":62,"url":382,"title":383,"icon":384,"children":385},"towns","Towns","fa-solid:city",[386,391,396],{"order":46,"url":387,"title":388,"icon":389,"children":390},"roles","Roles","eos-icons:role-binding",[],{"order":62,"url":392,"title":393,"icon":394,"children":395},"relations","Alliances & Enemies","ri:hearts-fill",[],{"order":78,"url":397,"title":398,"icon":399,"children":400},"wars","Wars","healthicons:war",[],{"order":78,"url":402,"title":403,"icon":404,"children":405},"claims","Claims","material-symbols:border-all-outline-rounded",[],{"order":89,"url":407,"title":408,"icon":409,"children":410},"inactive-town-pruning","Inactivity Pruning","icon-park-outline:sleep",[],{"order":171,"url":412,"title":148,"icon":413,"children":414},"hooks","fa6-solid:plug",[],{"order":78,"name":177,"children":416},[417,435,439],{"order":46,"url":180,"title":307,"icon":182,"children":418},[419,423,428,433],{"order":46,"url":420,"title":421,"icon":384,"children":422},"towns-api","Towns API",[],{"order":62,"url":424,"title":425,"icon":426,"children":427},"claims-api","Claims API","mdi:cog-box",[],{"order":78,"url":429,"title":430,"icon":431,"children":432},"operations-api","Operations API","mdi:movie-open-cog",[],{"order":89,"url":190,"title":191,"icon":192,"children":434},[],{"order":62,"url":436,"title":437,"icon":182,"children":438},"api-v1","API v1 (legacy)",[],{"order":78,"url":348,"title":195,"icon":196,"children":440},[],{"SVG":442,"PNG":443,"PNG_TRANSPARENT":444,"SVG_TRANSPARENT":445},"husktowns.svg","husktowns.png","husktowns-transparent.png","husktowns-transparent.svg",[],[],{"downloadCount":449,"averageRating":450,"numberOfRatings":451,"interactions":452,"onlinePlayers":46,"onlineServers":46},493,4.53125,16,82,{"slug":454,"restricted":20,"releaseChannels":455,"metadata":456,"stats":566},"huskclaims",[9,10],{"name":457,"tagline":458,"license":14,"tags":459,"github":460,"pullReadmeFromGithub":20,"readmeBody":461,"links":462,"maintainers":471,"compatibleSoftware":472,"suggestedRetailPrice":359,"linkedDiscordRole":473,"archived":7,"documentation":20,"documentationNav":474,"listDownloads":20,"hidden":7,"sortWeight":89,"icons":559,"properties":564,"images":565},"HuskClaims","A clean, cross-server compatible grief prevention plugin",[16,17,18],"https://github.com/WiIIiam278/HuskClaims","\u003C!--suppress ALL -->\n\u003Cp align=\"center\">\n \u003Cimg src=\"images/banner.png\" alt=\"HuskClaims\" />\n \u003Ca href=\"https://github.com/WiIIiam278/HuskClaims/actions/workflows/ci.yml\">\n \u003Cimg src=\"https://img.shields.io/github/actions/workflow/status/WiIIiam278/HuskClaims/ci.yml?branch=master&logo=github\"/>\n \u003C/a> \n \u003Ca href=\"https://repo.william278.net/#/releases/net/william278/huskclaims/\">\n \u003Cimg src=\"https://repo.william278.net/api/badge/latest/releases/net/william278/huskclaims/huskclaims-common?color=00fb9a&name=Maven&prefix=v\" />\n \u003C/a> \n \u003Ca href=\"https://discord.gg/tVYhJfyDWG\">\n \u003Cimg src=\"https://img.shields.io/discord/818135932103557162.svg?label=&logo=discord&logoColor=fff&color=7389D8&labelColor=6A7EC2\" />\n \u003C/a> \n \u003Cbr/>\n \u003Cb>\n \u003Ca href=\"https://william278.net/docs/huskclaims/setup\">Setup\u003C/a>\n \u003C/b> — \n \u003Cb>\n \u003Ca href=\"https://william278.net/docs/huskclaims/\">Docs\u003C/a>\n \u003C/b> — \n \u003Cb>\n \u003Ca href=\"http://github.com/WiIIiam278/HuskClaims/issues\">Issues\u003C/a>\n \u003C/b>\n\u003C/p>\n\u003Cbr/>\n\n**HuskClaims** is a clean, cross-server compatible grief prevention plugin/mod for Spigot/Paper and Fabric servers that you already know how to use. HuskClaims will bring claiming on your server into the 2020s with intuitive chat menus, cross-server synchronisation support, modern display block visualisation, user group and LuckPerms role trust management, and much more — achieved through a modular, performant design.\n\n## Features\n**⭐ Works cross-server** — Works seamlessly cross-server. Manage/accrue claim blocks and list claims globally.\n\n**⭐ Super intuitive** — Golden shovel claiming plugin, with a nice chat interface. Simple, and everyone knows how to use it!\n\n**⭐ Modular & customizable** — Customise trust levels to suit your server needs. Display claims on BlueMap, Pl3xMap, and Dynmap.\n\n**⭐ Great admin features** — Make admin claims and manage players. Trust LuckPerms permission groups for easy staff access management. \n\n**⭐ Modern conveniences** — Beautiful clickable menus and glowing display entity visualisation. Make groups to manage trust in bulk.\n\n**⭐ Easy to import & configure** — Import existing player claims and profiles from GriefPrevention. Has a robust, [extensible API](https://william278.net/docs/huskclaims/api). \n\n**Ready?** [Let the claims begin!](https://william278.net/docs/huskclaims/setup)\n\n## Development\nTo build HuskClaims, simply run the following in the root of the repository (building requires Java 21):\n\n```bash\n./gradlew clean build\n```\n\n### License\nHuskClaims is licensed under the Apache 2.0 license.\n\n- [License](https://github.com/WiIIiam278/HuskClaims/blob/master/LICENSE)\n\nContributions to the project are welcome—feel free to open a pull request with new features, improvements and/or fixes!\n\n### Support\nDue to its complexity, official binaries and customer support for HuskClaims is provided through a paid model. This means that support is only available to users who have purchased a license to the plugin from Spigot, Polymart, or BuiltByBit and have provided proof of purchase. Please join our Discord server if you have done so and need help!\n\n## Translations\nTranslations of the plugin locales are welcome to help make the plugin more accessible. Please submit a pull request with your translations as a `.yml` file. ([More info…](https://william278.net/docs/huskclaims/translations))\n\n- [Locales Directory](https://github.com/WiIIiam278/HuskClaims/tree/master/common/src/main/resources/locales)\n- [English Locales](https://github.com/WiIIiam278/HuskClaims/tree/master/common/src/main/resources/locales/en-gb.yml)\n\n## Links\n- [Docs](https://william278.net/docs/huskclaims) — Read the plugin documentation!\n- [Spigot](https://www.spigotmc.org/resources/huskclaims.114467/) — View the plugin Modrinth page (Also: [Polymart](https://polymart.org/resource/huskclaims.5336/), & [BuiltByBit](https://builtbybit.com/resources/huskclaims.37536/))\n- [Issues](https://github.com/WiIIiam278/HuskClaims/issues) — File a bug report or feature request\n- [Discord](https://discord.gg/tVYhJfyDWG) — Get help, ask questions (Proof of purchase required)\n- [bStats](https://bstats.org/plugin/bukkit/HuskClaims/20728) — View plugin metrics\n\n---\n© [William278](https://william278.net/), 2025. Licensed under the Apache-2.0 License.\n",[463,465,467,469],{"id":24,"url":464},"https://spigotmc.org/resources/huskclaims.114467",{"id":30,"url":466},"https://polymart.org/resource/huskclaims.5336",{"id":227,"url":468},"https://builtbybit.com/resources/huskclaims.37536",{"id":39,"url":470},"https://bstats.org/plugin/bukkit/HuskClaims/20728",[42],[24,44,45],"1195525277065949286",[475,487,521,537],{"order":46,"name":50,"children":476},[477,482],{"order":46,"url":53,"title":50,"icon":54,"children":478},[479],{"order":46,"url":480,"title":58,"icon":59,"children":481},"importers",[],{"order":62,"url":483,"title":64,"icon":65,"children":484},"config",[485],{"order":46,"url":79,"title":80,"icon":81,"children":486},[],{"order":62,"name":100,"children":488},[489,491,496,514,519],{"order":46,"url":103,"title":104,"icon":105,"children":490},[],{"order":62,"url":492,"title":493,"icon":494,"children":495},"permissions","Permissions","fluent-mdl2:permissions",[],{"order":78,"url":402,"title":403,"icon":497,"children":498},"mdi:shovel",[499,504,509],{"order":46,"url":500,"title":501,"icon":502,"children":503},"trust","Trusting Users","mdi:heart",[],{"order":62,"url":505,"title":506,"icon":507,"children":508},"operation-groups","Operation Groups & Flags","ci:flag",[],{"order":78,"url":510,"title":511,"icon":512,"children":513},"claim-blocks","Claim Blocks","fa6-solid:square",[],{"order":89,"url":515,"title":516,"icon":517,"children":518},"pets","Pet Protection","fa6-solid:dog",[],{"order":171,"url":412,"title":148,"icon":413,"children":520},[],{"order":78,"name":522,"children":523},"Moderation",[524,529,534],{"order":46,"url":525,"title":526,"icon":527,"children":528},"sign-moderation","Sign Moderation","mi:message-alt",[],{"order":62,"url":530,"title":531,"icon":532,"children":533},"drops-moderation","Death Drop Locking","mdi:grave-stone",[],{"order":78,"url":535,"title":408,"icon":409,"children":536},"inactivity-pruning",[],{"order":89,"name":177,"children":538},[539,557],{"order":46,"url":180,"title":181,"icon":182,"children":540},[541,543,548,553,555],{"order":46,"url":424,"title":425,"icon":426,"children":542},[],{"order":62,"url":544,"title":545,"icon":546,"children":547},"trust-api","Trust API","mdi:heart-cog",[],{"order":78,"url":549,"title":550,"icon":551,"children":552},"highlighter-api","Highlighter API","mdi:star-cog",[],{"order":89,"url":429,"title":430,"icon":431,"children":554},[],{"order":171,"url":190,"title":191,"icon":192,"children":556},[],{"order":62,"url":460,"title":195,"icon":196,"children":558},[],{"SVG":560,"PNG":561,"PNG_TRANSPARENT":562,"SVG_TRANSPARENT":563},"huskclaims.svg","huskclaims.png","huskclaims-transparent.png","huskclaims-transparent.svg",[],[],{"downloadCount":567,"averageRating":568,"numberOfRatings":569,"interactions":570,"onlinePlayers":571,"onlineServers":572},476,4.400000095367432,8,44,936,146,{"slug":574,"restricted":7,"releaseChannels":575,"metadata":576,"stats":669},"velocitab",[9,10],{"name":577,"tagline":578,"license":14,"tags":579,"github":580,"pullReadmeFromGithub":20,"readmeBody":581,"links":582,"maintainers":589,"compatibleSoftware":591,"suggestedRetailPrice":46,"linkedDiscordRole":47,"archived":7,"documentation":20,"documentationNav":592,"listDownloads":20,"hidden":7,"sortWeight":661,"icons":662,"properties":667,"images":668},"Velocitab","A beautiful and versatile TAB list plugin for Velocity proxies",[16,17,18],"https://github.com/WiIIiam278/Velocitab","\u003C!--suppress ALL -->\n\u003Cp align=\"center\">\n \u003Cimg src=\"images/banner.png\" alt=\"Velocitab\" />\n \u003Ca href=\"https://github.com/WiIIiam278/Velocitab/actions/workflows/ci.yml\">\n \u003Cimg src=\"https://img.shields.io/github/actions/workflow/status/WiIIiam278/Velocitab/ci.yml?branch=master&logo=github\"/>\n \u003C/a> \n \u003Ca href=\"https://repo.william278.net/#/releases/net/william278/velocitab/\">\n \u003Cimg src=\"https://repo.william278.net/api/badge/latest/releases/net/william278/velocitab?color=00fb9a&name=Maven&prefix=v\" />\n \u003C/a>\n \u003Ca href=\"https://discord.gg/tVYhJfyDWG\">\n \u003Cimg src=\"https://img.shields.io/discord/818135932103557162.svg?label=&logo=discord&logoColor=fff&color=7389D8&labelColor=6A7EC2\" />\n \u003C/a> \n \u003Cbr/>\n \u003Cb>\n \u003Ca href=\"https://modrinth.com/plugin/velocitab\">Modrinth\u003C/a>\n \u003C/b> —\n \u003Cb>\n \u003Ca href=\"https://william278.net/docs/velocitab/setup\">Setup\u003C/a>\n \u003C/b> — \n \u003Cb>\n \u003Ca href=\"https://william278.net/docs/velocitab/\">Docs\u003C/a>\n \u003C/b> — \n \u003Cb>\n \u003Ca href=\"https://github.com/WiIIiam278/Velocitab/issues\">Issues\u003C/a>\n \u003C/b>\n\u003C/p>\n\u003Cbr/>\n\n**Velocitab** is a super-simple Velocity TAB menu plugin that uses scoreboard team client-bound packets to actually sort player lists without the need for a backend plugin. Supporting modern RGB formatting, animations, comprehensive placeholder support and defining multiple TAB menus for different groups of servers, Velocitab is a versatile plugin, useful for any Velocity-based proxy network.\n\n\n\n## Features\n**⭐ Flexible list sorting** — Customizable TAB [list sorting](https://william278.net/docs/velocitab/sorting) based on user role, server, placeholder, and more.\n\n**⭐ Versatile formatting support** — Make your TAB list beautiful with full RGB color support, supporting MiniMessage, MineDown and legacy [formatting modes](https://william278.net/docs/velocitab/formatting).\n\n**⭐ Multiple TAB menus for different servers** — Create [server groups](https://william278.net/docs/velocitab/server-groups) and configure different TAB lists to show for each group!\n\n**⭐ Animations support** — Add extra flair to your TAB list or display additional information by creating pretty looking [animations](https://william278.net/docs/velocitab/animations).\n\n**⭐ Player nametags** — Customize how over-the-head [nametags](https://william278.net/docs/velocitab/nametags) look to help players stand out in-game.\n\n**⭐ Full placeholder support** — Comes with a robust set of built-in [placeholders](https://william278.net/docs/velocitab/placeholders), MiniPlaceholders support, as well as PAPIProxyBridge for PlaceholderAPI support\n\n**Ready?** [Get started in a new TAB…](https://william278.net/docs/velocitab/setup)\n\n## Setup\nWe suggest installing [LuckPerms](https://luckperms.net) on your Velocity proxy and backend (Spigot, Paper, Fabric, etc.) servers for prefix/suffix formatting right out the box.\n\n1. Turn off your Velocity proxy server\n2. [Download](https://github.com/WiIIiam278/Velocitab/releases/latest) and place the plugin jar file in the `/plugins/` folder of your Velocity proxy server.\n3. Start your Velocity proxy, and allow the plugin to generate its config file\n4. Edit the [`config.yml` file](https://william278.net/docs/velocitab/config-file) to your liking\n5. Restart your Velocity proxy again\n\nNeed to make a quick config change? You can use the in-game `/velocitab reload` (permission: `velocitab.command.reload`) command, though we recommend restarting your proxy server for any major changes.\n\n## Building\nTo build Velocitab, run the following in the root of the repository:\n```bash\n./gradlew clean build\n```\nThe build will be output as `/target/Velocitab-x.xx.jar`.\n\n### License\nVelocitab is licensed under the Apache 2.0 license.\n\n- [License](https://github.com/WiIIiam278/Velocitab/blob/master/LICENSE)\n\n## Links\n* **[Website](https://william278.net/project/velocitab)** — Visit my website!\n* **[Docs](https://william278.net/docs/velocitab)** — Read the plugin docs!\n* **[Modrinth](https://modrinth.com/plugin/velocitab)** — View the plugin Modrinth page (Also: [Hangar](https://hangar.papermc.io/William278/Velocitab))\n* **[Issues](https://github.com/WiIIiam278/Velocitab/issues)** — File a bug report or feature request\n* **[Discord](https://discord.com/invite/tVYhJfyDWG)** — Get support, ask questions!\n\n---\n© [William278](https://william278.net/), 2025. Licensed under the Apache-2.0 License.\n",[583,585,587],{"id":27,"url":584},"https://modrinth.com/plugin/Q10irTG0",{"id":33,"url":586},"https://hangar.papermc.io/William278/Velocitab",{"id":39,"url":588},"https://bstats.org/plugin/velocity/Velocitab/18247",[42,590],"AlexDev03",[],[593,604,648],{"order":46,"name":50,"children":594},[595,597,599],{"order":46,"url":53,"title":50,"icon":54,"children":596},[],{"order":62,"url":250,"title":64,"icon":65,"children":598},[],{"order":78,"url":600,"title":601,"icon":602,"children":603},"server-groups","Server Groups","material-symbols:tab-group-outline",[],{"order":62,"name":605,"children":606},"Docs",[607,609,624,638,643],{"order":46,"url":103,"title":104,"icon":105,"children":608},[],{"order":62,"url":610,"title":611,"icon":612,"children":613},"formatting","Formatting","mdi:paint-outline",[614,619],{"order":46,"url":615,"title":616,"icon":617,"children":618},"animations","Animations","material-symbols:animation",[],{"order":62,"url":620,"title":621,"icon":622,"children":623},"custom-logos","Custom Logos","material-symbols:wall-art",[],{"order":78,"url":151,"title":625,"icon":626,"children":627},"Placeholders","mdi:tag",[628,633],{"order":46,"url":629,"title":630,"icon":631,"children":632},"relational-placeholders","Relational Placeholders","mdi:tag-plus",[],{"order":62,"url":634,"title":635,"icon":636,"children":637},"conditional-placeholders","Conditional Placeholders","mdi:tag-edit",[],{"order":89,"url":639,"title":640,"icon":641,"children":642},"nametags","Nametags","gridicons:nametag",[],{"order":171,"url":644,"title":645,"icon":646,"children":647},"server-links","Server Links","fa6-solid:link",[],{"order":78,"name":177,"children":649},[650,659],{"order":46,"url":180,"title":181,"icon":182,"children":651},[652,654],{"order":46,"url":185,"title":186,"icon":187,"children":653},[],{"order":62,"url":655,"title":656,"icon":657,"children":658},"plugin-message-api","Plugin Message API","carbon:hybrid-networking",[],{"order":62,"url":580,"title":195,"icon":196,"children":660},[],5,{"SVG":663,"PNG":664,"PNG_TRANSPARENT":665,"SVG_TRANSPARENT":666},"velocitab.svg","velocitab.png","velocitab-transparent.png","velocitab-transparent.svg",[],[],{"downloadCount":670,"averageRating":46,"numberOfRatings":46,"interactions":671,"onlinePlayers":672,"onlineServers":673},37083,144,2466,695,{"slug":675,"restricted":7,"releaseChannels":676,"metadata":677,"stats":704},"papiproxybridge",[9,10],{"name":678,"tagline":679,"license":14,"tags":680,"github":682,"pullReadmeFromGithub":20,"readmeBody":683,"links":684,"maintainers":693,"compatibleSoftware":694,"suggestedRetailPrice":46,"linkedDiscordRole":47,"archived":7,"documentation":7,"documentationNav":697,"listDownloads":20,"hidden":7,"sortWeight":698,"icons":699,"properties":702,"images":703},"PAPIProxyBridge","A bridge library plugin for using PlaceholderAPI on proxy servers",[16,681,18],"library","https://github.com/WiIIiam278/PAPIProxyBridge","\u003C!--suppress ALL -->\n\u003Cp align=\"center\">\n \u003Cimg src=\"images/banner.png\" alt=\"PAPIProxyBridge\" />\n \u003Ca href=\"https://github.com/WiIIiam278/PAPIProxyBridge/actions/workflows/ci.yml\">\n \u003Cimg src=\"https://img.shields.io/github/actions/workflow/status/WiIIiam278/PAPIProxyBridge/ci.yml?branch=master&logo=github\"/>\n \u003C/a>\n \u003Ca href=\"https://repo.william278.net/#releases/net/william278/papiproxybridge\">\n \u003Cimg src=\"https://repo.william278.net/api/badge/latest/releases/net/william278/papiproxybridge?color=00fb9a&name=Maven&prefix=v\" />\n \u003C/a> \n \u003Ca href=\"https://discord.gg/tVYhJfyDWG\">\n \u003Cimg src=\"https://img.shields.io/discord/818135932103557162.svg?label=&logo=discord&logoColor=fff&color=7389D8&labelColor=6A7EC2\" />\n \u003C/a>\n\u003C/p>\n\u003Cbr/>\n\n**PAPIProxyBridge** is a library bridge plugin you install on both your backend and proxy servers that allows proxy plugins to format text with PlaceholderAPI placeholders.\n\n## For server owners\nThis is a library plugin intended for use with plugins that implement its API. There is nothing to configure.\n\nInstall the latest version of the plugin alongside the [PlaceholderAPI plugin](https://www.spigotmc.org/resources/placeholderapi.6245/) on your Spigot (1.16.5+) or the [PlaceholderAPI mod](https://placeholders.pb4.eu/) on your Fabric (1.20) server, then install the plugin on your BungeeCord or Velocity proxy server.\n\nNote this plugin is not a replacement for PlaceholderAPI. You still need to install PlaceholderAPI on your Spigot/Fabric server.\n\n## For developers\nPAPIProxyBridge exposes a cross-platform API to let you format text with PlaceholderAPI placeholders.\n\n\u003Cdetails>\n\u003Csummary>Adding the library to your project\u003C/summary>\n\nPAPIProxyBridge is available on `repo.william278.net` ([view javadocs here](https://repo.william278.net/javadoc/releases/net/william278/papiproxybridge/latest)). First, add the maven repository to your `build.gradle`:\n```groovy\nrepositories {\n maven { url 'https://repo.william278.net/releases/' }\n}\n```\n\nThen add the dependency:\n```groovy\ndependencies {\n implementation 'net.william278:papiproxybridge:1.7.2\n}\n```\n\n\u003C/details>\n\n\u003Cdetails>\n\u003Csummary>Example usage\u003C/summary>\n\nThe `PlaceholderAPI` class exposes the API for formatting placeholders. At the moment, only singleton non-bracketed placeholders are supported (more in the future).\n\nGet an instance of the class with PlaceholderAPI.getInstance(), then use the `#formatPlaceholders` method to format a string with placeholders on a player (specified with UUID for cross-platform simplicity). \n\nThe method returns a [CompletableFuture](https://www.baeldung.com/java-completablefuture) (since we don't want to lock threads while the proxy networks with players on the backend) that you can use to accept the formatted string.\n\n```java\n// Format a string with placeholders\nfinal PlaceholderAPI api = PlaceholderAPI.createInstance();\nfinal UUID player = player.getUniqueId();\napi.formatPlaceholders(\"Hello %player_name%!\", player).thenAccept(formatted -> {\n player.sendMessage(formatted);\n});\n```\n\nNever invoke `#join()` on calls to `#formatPlaceholders`; this is unsafe.\n\nPAPIProxyBridge caches resolved requests for 30000 milliseconds (30 seconds), to avoid causing excessive traffic over your server's network channels. You can adjust how long to cache requests for using the `PlaceholderAPI#setCacheExpiry(long)` method.\n\nThere also exists `#formatComponentPlaceholders`. This method allows you to supply a string containing placeholders and receive an adventure component containing the formatted text, which may contain formatting and chat events.\n\u003C/details>\n",[685,687,689,691],{"id":24,"url":686},"https://spigotmc.org/resources/papiproxybridge.108415",{"id":30,"url":688},"https://polymart.org/resource/papiproxybridge.3615",{"id":27,"url":690},"https://modrinth.com/plugin/papiproxybridge",{"id":39,"url":692},"https://bstats.org/plugin/velocity/PAPIProxyBridge%20-%20Velocity/17878",[42],[24,44,45,695,696],"waterfall","velocity",[],6,{"SVG":700,"PNG":701},"papiproxybridge.svg","papiproxybridge.png",[],[],{"downloadCount":705,"averageRating":661,"numberOfRatings":78,"interactions":706,"onlinePlayers":707,"onlineServers":708},49597,53,3833,851,{"slug":710,"restricted":7,"releaseChannels":711,"metadata":712,"stats":744},"serial-loops",[],{"name":713,"tagline":714,"license":715,"tags":716,"github":720,"pullReadmeFromGithub":20,"readmeBody":721,"links":722,"maintainers":723,"compatibleSoftware":724,"suggestedRetailPrice":46,"linkedDiscordRole":47,"archived":7,"documentation":7,"documentationNav":728,"listDownloads":7,"hidden":7,"sortWeight":729,"icons":730,"properties":733,"images":734},"Serial Loops","A Suzumiya Haruhi no Chokuretsu (The Series of Haruhi Suzumiya) level editor, by Jonko & me","GPL-3.0",[717,718,719],"c#","nintendo ds","tool","https://github.com/haroohie-club/SerialLoops","\u003Ch1 align=\"center\">\n \u003Cimg alt=\"Serial Loops app icon; the letters 'SL' emblazoned above four translucent gray rings within a rounded square box colored with a blue-to-green gradient along the negative X-Z axis\" src=\"src/SerialLoops/Icons/AppIcon.png\" width=\"135px\" />\n \u003Cbr/>\n Serial Loops\n\u003C/h1>\n\u003Cp align=\"center\">\n \u003Ca href=\"https://dev.azure.com/jonko0493/haroohie-private/_apis/build/status%2FSerialLoops-Official?branchName=main\">\n \u003Cimg alt=\"Azure Pipelines build status badge\" src=\"https://dev.azure.com/jonko0493/haroohie-private/_apis/build/status%2FSerialLoops-Official?branchName=main\" />\n \u003C/a>\n \u003Ca href=\"https://discord.gg/nesRSbpeFM\">\n \u003Cimg alt=\"Haroohie Translation Club Discord Server badge \" src=\"https://img.shields.io/discord/904791358609424436.svg?label=&logo=discord&logoColor=fff&color=7389D8&labelColor=6A7EC2\" />\n \u003C/a>\n \u003Ca href=\"https://haroohie.club/chokuretsu/serial-loops/docs\">\n \u003Cimg alt=\"Serial Loops documentation link badge\" src=\"https://img.shields.io/badge/docs-haroohie.club-00C4F5?logo=github\" />\n \u003C/a>\n\u003C/p>\n\n**Serial Loops** is a fully-fledged editor for the Nintendo DS game _Suzumiya Haruhi no Chokuretsu_ (The Series of Haruhi Suzumiya).\n\n## Screenshots\n\u003Cp align=\"center\">\n \u003Cimg width=\"325px\" src=\"https://haroohie.club/images/chokuretsu/serial-loops/script-editor.png\" alt=\"Screenshot of the Serial Loops script editor, featuring the 'EV2_029' script being edited. A list of commands is displayed in a list view panel, with buttons to add, remove and clear commands, with information about the currently selected command displayed on the right. Haruhi and Tsuruya are displayed on a preview of the Nintendo DS screen.\" />\n \u003Cimg width=\"325px\" src=\"https://haroohie.club/images/chokuretsu/serial-loops/map-editing.png\" alt=\"Screenshot of the Serial Loops map editor, featuring the 'SLD1' map open with checkboxes to show/hide the camera position and collision grid\" />\n \u003Cimg width=\"325px\" src=\"https://haroohie.club/images/chokuretsu/serial-loops/sound-editing.png\" alt=\"Screenshot of the Serial Loops sound editor, featuring a modal widget with a sound wave graph. Buttons to start and stop playback are present, as are sliders and a checkbox to enable looping and adjust the track loop start and end points.\" />\n \u003Cimg width=\"325px\" src=\"https://haroohie.club/images/chokuretsu/serial-loops/home-screen.png\" alt=\"Screenshot of the Serial Loops home screen. The Serial Loops logo and title sits at the top of the menu. Below that, under 'Start' on the left hand side, options to create a project, open an existing project, and modify preferences are present. An empty list of 'Recents' is visible on the right hand side, where recent projects would appear.\" />\n\u003C/p>\n\n## Authors\n### Developers\nSerial Loops is developed by:\n* [Jonko](https://github.com/jonko0493) – Systems architect & reverse engineering work\n* [William278](https://william278.net) – UX architect & design work\n\n### Translators\nSerial Loops is translated into a variety of langauges thanks to the following contributors:\n* Chinese (Simplified/Traditional): [Xzonn](https://xzonn.top) (traditional is auto-generated via [OpenCC](https://github.com/BYVoid/OpenCC))\n* Italian: Oropuro_49 and Fuyuko Ayumu\n* Japanese: Amelia Chaplin\n\n## Documentation\nDocumentation for how to use Serial Loops can be found on [our website](https://haroohie.club/chokuretsu/serial-loops/).\n\n## Installation\n### Prerequisites\n#### A Nintendo DS Emulator\nTo test the game easily, you will want to have a Nintendo DS emulator installed. We recommend using [melonDS](https://melonds.kuribo64.net/) for its accuracy.\n\n#### Installing devkitARM\n[devkitARM](https://devkitpro.org/wiki/Getting_Started) is required to use Serial Loops on all platforms.\n\n* Using the Windows graphical installer, you can simply select the devkitARM (Nintendo DS) workloads\n* On macOS and Linux, run `sudo dkp-pacman -S nds-dev` from the terminal after installing the devkitPro pacman distribution.\n\n#### Installing Make or Docker\nTo assemble ASM hacks you want to apply, you will need to decide whether to use Make or Docker. Make is automatically installed when using the Debian and RPM\npackages we distribute, so you don't need to worry about this step if you're using either of those.\n\nCurrently, the Docker path is **only supported on Windows** due to operating system and framework limitations. It is possible to get Docker running\njust fine on Linux distros by running SerialLoops as root (e.g. `sudo SerialLoops`), but it's easier to just use Make. On macOS, there is no known\nway of getting the Docker path to work, so you will have to use Make.\n\n* [Make](https://www.gnu.org/software/make/) is the software used to assemble assembly hacks. Installing Make allows you to build the hacks\n directly on your system.\n - To install on Windows, you will have to use a terminal and a package manager. Your options are Winget (installed by default on Win10+) or\n [Chocolatey](https://chocolatey.org/). Open an admin PowerShell or Terminal window (Winkey + X + A) and enter `winget install GnuWin32.make`\n for Winget or `choco install make` for Chocolatey. If using Winget, you will then have to go into system preferences and add Make to the path.\n - Installation on macOS can be done through Xcode or Homebrew. If using Xcode, open a terminal and type `xcode-select --install`. If you would\n rather use Homebrew, open a terminal after installing Homebrew and type `brew install make`.\n - Make comes preinstalled on many Linux distributions, and if you're using the Debian or RPM package, it was definitely installed when you installed\n Serial Loops. If you're using the tar.gz it is not installed on yours, you will likely be able to install it as simply as\n `[packagemanger] install make` from a terminal.\n \n To test if make is installed properly, type `make --verison` into a terminal and see if it produces the version of make.\n* If you would rather not install Make, or if it is not working properly, you can instead run it through a Docker container. To do this, you should\n install [Docker Desktop](https://www.docker.com/products/docker-desktop/) or the Docker Engine. Ensure the Docker engine is running and make sure\n to check the \"Use Docker for ASM Hacks\" option in Preferences. You may want to occasionally clean up containers created by Serial Loops, as it will\n create many of them.\n - On Windows, you will additionally need to install [Windows Subsystem for Linux (WSL)](https://learn.microsoft.com/en-us/windows/wsl/install).\n From an admin PowerShell or Terminal window (Winkey + X + A), simply type `wsl --install` to install it.\n\n#### Installing OpenAL (Linux)\nIf you're running on Linux and _not using one of the package releases_ (the `.deb` or `.rpm`), you will also need to install OpenAL which is used for audio processing.\n\n### Download & Install\nOnce you have installed any necessary prerequisites, to install Serial Loops, download the latest release for your platform from the [Releases tab](https://github.com/haroohie-club/SerialLoops/releases).\n\nBe sure to [read the Serial Loops documentation](https://haroohie.club/chokuretsu/serial-loops/docs) for instructions on how to use it!\n\n## Bugs\nPlease file bugs in the Issues tab in this repository. Please include the following information:\n* The platform you are running Serial Loops on\n* The version of the _Chokuretsu_ ROM you are using (Japanese, patched English ROM, etc.)\n* A description of the steps required to reproduce the issue\n* The relevant logs for the issue (can be found in ~/SerialLoops/Logs)\n\n## Development\n### License\nSerial Loops is licensed under the GPLv3. See [LICENSE](LICENSE) for more information.\n\n### Building\nSerial Loops requires the .NET 8.0 SDK to build. You can download it [here](https://dotnet.microsoft.com/download/dotnet/8.0). To build Serial Loops for your platform, run:\n\n```bash\ndotnet build src/PLATFORM\n```\n\nRemember to replace `PLATFORM` with the platform you're on:\n* `SerialLoops.Gtk` for Linux\n* `SerialLoops.Mac` for macOS\n* `SerialLoops.Wpf` for Windows\n\nWe recommend [Visual Studio 2022](https://visualstudio.microsoft.com/) on Windows or [Rider](https://www.jetbrains.com/rider/) on Linux/Mac for development. If you'd like to contribute new features or fixes, we recommend [getting in touch on Discord first](https://discord.gg/nesRSbpeFM) before submitting a pull request!\n\n### Testing\nThe `SerialLoops.Tests` project can be run from inside Visual Studio, Rider, or with `dotnet test` as normal. However, our UI tests (currently only runnable on Windows) are a bit more involved.\n\nOur UI tests rely on [Appium](https://appium.io/).\n#### macOS\n1. You will need to install nodejs and then use it to [install Appium](https://appium.io/docs/en/2.4/quickstart/install/).\n - The easiest way to install nodejs is to first install [nvm](https://github.com/nvm-sh/nvm) and then run `nvm install \u003Cversion>` followed by `nvm use \u003Cversion>` (you can use `16` as the version)\n2. You will then need to install the Mac2 driver with `appium driver install mac2`\n3. Follow [these instructions](https://github.com/appium/appium-mac2-driver?tab=readme-ov-file#requirements) for installing and setting up the necessary prerequisites for the Mac2 driver to work\n\nOnce you've installed the prerequisites, build the `SerialLoops.Mac` and `SerialLoops.Mac.Tests` projects with `dotnet build src/SerialLoops.Mac/SerialLoops.Mac.csproj` and `dotnet build test/ui/SerialLoops.Mac.Tests/SerialLoops.Mac.Tests.csproj`,\nrespectively. Then, inside `test\\ui\\SerialLoops.Mac.Tests\\bin\\Debug\\net8.0`, create a new text file called `ui_vals.json`. Inside this file, place the following text, replacing necessary values:\n```json\n{\n \"AppLoc\": \"PATH/TO/Serial Loops.app\",\n \"ProjectName\": \"MacUITest\",\n \"RomLoc\": \"PATH/TO/HaruhiChokuretsu.nds\",\n \"ArtifactsDir\": \"PATH/TO/artifacts\"\n}\n```\nThe artifacts directory can be any arbitrary directory, but ensure it exists before running the tests. The project name by default is WinUITest, but it can be anything you'd like. Have fun.\n\nFinally, you can then run the tests with `dotnet test test\\ui\\SerialLoops.Mac.Tests\\SerialLoops.Mac.Tests.csproj`. However, it may be better to run `appium` from a different terminal first so you\ncan see the server output as well.\n\n#### Windows\n1. You will need to install nodejs and then use it to [install Appium](https://appium.io/docs/en/2.4/quickstart/install/).\n - The easiest way to install nodejs is to first install [NVM for Windows](https://github.com/coreybutler/nvm-windows) and then run `nvm install latest` followed by `nvm use latest` (you can sub latest for any version)\n2. You will then need to install the [Appium Windows Driver](https://github.com/appium/appium-windows-driver) with `appium driver install --source=npm appium-windows-driver`.\n3. Next, download and install [WinAppDriver](https://github.com/microsoft/WinAppDriver).\n\nOnce you've installed all the prerequisites, build the `SerialLoops.Wpf` and `SerialLoops.Wpf.Tests` projects from Visual Studio or with `dotnet build src\\ui\\SerialLoops.Wpf\\SerialLoops.Wpf.csproj` and\n`dotnet build test\\ui\\SerialLoops.Wpf.Tests\\SerialLoops.Wpf.Tests.csproj`, respectively. Then, inside `test\\ui\\SerialLoops.Wpf.Tests\\bin\\Debug\\net8.0`, create a new text file called `ui_vals.json`.\nInside this file place the following text, replacing necessary values:\n```json\n{\n \"AppLoc\": \"PATH\\\\TO\\\\SerialLoops.exe\",\n \"ProjectName\": \"WinUITest\",\n \"WinAppDriverLoc\": \"PATH\\\\TO\\\\WinAppDriver.exe\",\n \"RomLoc\": \"PATH\\\\TO\\\\HaruhiChokuretsu.nds\",\n \"ArtifactsDir\": \"PATH\\\\TO\\\\artifacts\"\n}\n```\nEnsure you escape your backslashes (`\\\\` rather than `\\`). WinAppDriver is usually installed to `C:\\Program Files (x86)\\Windows Application Driver\\WinAppDriver.exe`. The artifacts directory can\nbe any arbitrary directory, but ensure it exists before running the tests. The project name by default is WinUITest, but it can be anything you'd like. Have fun.\n\nFinally, you can then open the solution inside Visual Studio and run the tests from the Test Explorer. Alternatively, running `dotnet test test\\ui\\SerialLoops.Wpf.Tests\\SerialLoops.Wpf.Tests.csproj`\nmay also work.",[],[42],[725,726,727],"windows","macos","linux",[],7,{"SVG":731,"PNG":732},"serial-loops.svg","serial-loops.png",[],[735,738,741],{"url":736,"description":737},"serial-loops/map-editing.png","Map editing",{"url":739,"description":740},"serial-loops/script-editing.png","Script editing",{"url":742,"description":743},"serial-loops/sound-editing.png","Sound editing",{"downloadCount":745,"averageRating":46,"numberOfRatings":46,"interactions":746,"onlinePlayers":46,"onlineServers":46},2254,20,{"slug":748,"restricted":7,"releaseChannels":749,"metadata":750,"stats":804},"breaking-bad-ds",[9],{"name":751,"tagline":752,"license":14,"tags":753,"github":756,"pullReadmeFromGithub":20,"readmeBody":757,"links":758,"maintainers":765,"compatibleSoftware":766,"suggestedRetailPrice":46,"linkedDiscordRole":47,"archived":7,"documentation":7,"documentationNav":767,"listDownloads":20,"hidden":7,"sortWeight":569,"icons":768,"properties":770,"images":783},"Breaking Bad DS","Breaking Bad, as a Nintendo DS game, complete with 3D graphics and models!",[754,755,718],"game","c++","https://github.com/WiIIiam278/breaking-bad-ds","\u003Ch1 align=\"center\">\n \u003Cimg alt=\"Cover artwork by GardenOwl\" src=\"cover-artwork.png\" width=\"185px\" />\n \u003Cbr/>\n Breaking Bad DS\n\u003C/h1>\n\u003Cp align=\"center\">\n\u003Ca href=\"https://github.com/WiIIiam278/breaking-bad-ds/actions/workflows/ci.yml\">\n \u003Cimg src=\"https://img.shields.io/github/actions/workflow/status/WiIIiam278/breaking-bad-ds/ci.yml?branch=main&logo=github\"/>\n\u003C/a>\n\u003Ca href=\"https://discord.gg/tVYhJfyDWG\">\n \u003Cimg src=\"https://img.shields.io/discord/818135932103557162.svg?label=&logo=discord&logoColor=fff&color=7389D8&labelColor=6A7EC2\" />\n\u003C/a> \n\u003C/p>\n\n*Breaking Bad*, as a Nintendo DS game, complete with 3D graphics and models. Master the art of the cook on your Nintendo DS system and prepare the perfect batch—lest you meet the wrong end of Gus. Hone your cook in both Singleplayer and Local Multiplayer Vs.\n\n## Screenshots\n\u003Ctable>\n\u003Ctr>\n\u003Ctd>\u003Cimg alt=\"Title screen\" src=\"screenshots/brbds-title-screen.png\" width=\"256px\" />\u003C/td>\n\u003Ctd>\u003Cimg alt=\"Story mode\" src=\"screenshots/brbds-story-mode.png\" width=\"256px\" />\u003C/td>\n\u003Ctd>\u003Cimg alt=\"In the lab\" src=\"screenshots/brbds-in-the-lab.png\" width=\"256px\" />\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Cimg alt=\"Pipette minigame\" src=\"screenshots/brbds-minigame.png\" width=\"256px\" />\u003C/td>\n\u003Ctd>\u003Cimg alt=\"Local Multiplayer Vs. mode\" src=\"screenshots/brbds-multiplayer-vs.png\" width=\"256px\" />\u003C/td>\n\u003Ctd>\u003Cimg alt=\"Hank's minerals\" src=\"screenshots/brbds-hank.png\" width=\"256px\" />\u003C/td>\n\u003C/tr>\n\u003C/table>\n\n## Playing\nFor the absolute best experience, pop the ROM on a flashcart and enjoy!\n\n### On an Emulator\nBut if you're not as bothered as Walter is about doing things with the proper gear, [melonDS](https://github.com/melonDS-emu/melonDS/releases/latest) is the recommended emulator for play due to its accuracy and performance. Alternatively, the latest release of [DeSmuME](https://github.com/TASEmulators/desmume/releases/latest) is slightly easier to setup and supports [emulating rumble](#ds-rumble-pak-support).\n\nTo run this on melonDS, you'll need to go into the Emulator Config -> DLDI -> Enable DLDI, since this uses the homebrew nitrofile system. I reccommend the Software video emulator for best results to make the models pop, as the OpenGL backend doesn't quite support the DS's hardware-accellerated outlines just yet.\n\n### On a modded DSi/3DS\nYou can also run this on a modded DSi or 3DS with Twilight Menu++ (other game loaders have not been tested). You can download the game ROM by scanning the QR code below in your loader's menu, if your system supports this. Please make sure you use v1.0.3+, or your game may crash on startup!\n\n\u003Cdetails>\n\u003Csummary>Download ROM QR code (v1.0.5)\u003C/summary>\n\n\n\n\u003C/details>\n\n### Unsupported platforms\nSorry, this *won't work on the Wii U Virtual Console emulator*. I'm sorry to ruin your dreams. If you run this on a cool setup, take a picture and [email me](mailto:will27528+brbads@gmail.com).\n\n## Instructions\n### Tutorial (1P)\nThe Tutorial will teach you how to play! Gale will provide instructions on how to complete each Minigame. To access the Tutorial, select it from the Main Menu.\n\n### Story Mode (1P)\nTo start story mode, start the game. Touch to start, then tap \"Start Game → Story Mode.\"\n\nGus has appointed you Head Cook! Meet his ever-increasing demands by cooking against the clock in the Superlab. Each day, you'll be given a Quota you must complete within a set time limit to progress on to the next day. After each day, you'll receive your pay packet based on your performance and efficiency, which you can spend in Saul's shop!\n\nStory mode lasts five days, and there are two possible endings (\"Good\" and \"Bad\"). Good luck!\n\n**About save data:** Story progress is not saved after powering off the Nintendo DS system or emulator due to LibFAT not working correctly on most flash carts. Some flash carts do support saving, however, and the game will attempt to save your progress to your SD card. Making save states is reccommended if you're using an emulator!\n\n### Local Multiplayer (2P)\nBreaking Bad for Nintendo DS also supports up to two Nintendo DS systems playing together in a Multiplayer Vs. Battle to see who can complete their batches the quickest. You can emulate this through multiple instances on MelonDS currently, or run on hardware with two systems and two flashcarts. To set this up:\n\n* On the first system, launch the game. Touch to start, then tap \"Start Game → Host.\"\n* If you're using MelonDS: On the menu bar, select \"System → Multiplayer → Launch new instance\" and open the ROM.\n* On the second system/new MelonDS instance, launch the game, touch to start, then tap \"Start Game → Join.\"\n* Wait for the systems to establish communications.\n* On the Host console, press the A Button to start the game.\n\nThe Host system will play as Walter, while the guest will play as Jesse. The magic that makes it work is thanks to the incredible [Fewnity](https://github.com/Fewnity/Nintendo-DS-Nifi-Template/)'s amazing NiFi scaffold!\n\n### Hank's Minerals\nBy completing certain challenges, you'll find minerals! Hank will appraise minerals you find in the \"Hank's Minerals\" submenu, located in the Extras Menu. There are twelve minerals to find, and you can view how to get them by tapping on each `[?]` icon in the menu.\n\nOnce you've obtained a mineral, it will be displayed in the menu and selecting it will tell you what it is. Minerals marked with \"??????\" are a secret, so no hints there!\n\n### Music Player\nYou can listen to the game music through the Music Player submenu, located in the Extras menu. Use the left and right buttons on the + Control Pad to change the track.\n\n### DS Rumble Pak support\nThis game supports the [Nintendo DS Rumble Pak](https://en.wikipedia.org/wiki/Rumble_Pak#Nintendo_DS)! DeSMuME (but not Melon, sadly) supports emulating this — or you can insert a physical SLOT-2 DS Rumble Pak accessory on an original DS/DS Lite. If you're shopping for this accessory, you can often find it cheaper bundled with certain games, such as \"actionloop\" in Europe.\n\n## Building\n### General instructions\ndevKitARM, NFLib and Nitro-Engine must be installed. Then, just run `make` following to build a `.nds` ROM file.\n\n### Asset preparation\nThere's scripts for converting the various assets and moving them into the correct nitrofiles directories. Run `bash ./convert.sh` inside `graphics/sprite` for instance to automatically prepare all the sprite images. If you've updated the graphics, delete the `build/` directory before building.\n\n## License\nThe source code for this project is licensed under Apache-2.0, except otherwise stated. For more information, see [LICENSE](https://github.com/WiIIiam278/breaking-bad-ds/blob/main/LICENSE).\n\nFor attribution information on the various resources I used, please see [ATTRIBUTION.md](https://github.com/WiIIiam278/breaking-bad-ds/blob/main/ATTRIBUTION.md).\n",[759,762],{"id":760,"url":761},"itch","https://william278.itch.io/breaking-bad-ds",{"id":763,"url":764},"universaldb","https://db.universal-team.net/ds/breaking-bad-ds",[42],[],[],{"SVG":47,"PNG":769},"breaking-bad-ds.png",[771,774,777,780],{"key":772,"value":773},"emulator_core","melonds",{"key":775,"value":776},"emulator_rom","https://github.com/WiIIiam278/breaking-bad-ds/releases/download/1.0.6/breaking-bad-ds.nds",{"key":778,"value":779},"showcase_image","breaking-bad-ds-boxart-with-ds.png",{"key":781,"value":782},"showcase_alt_text","Breaking Bad DS box art",[784,786,789,792,795,798,801],{"url":779,"description":785},"Game cover with title screen",{"url":787,"description":788},"breaking-bad-ds-title-screen.png","The title screen, with the Breaking Bad logo",{"url":790,"description":791},"breaking-bad-ds-story-mode.png","Gameplay of story mode",{"url":793,"description":794},"breaking-bad-ds-multiplayer-vs.png","Gameplay of the local multiplayer vs. mode",{"url":796,"description":797},"breaking-bad-ds-minigame.png","Gameplay of the pipette reagent minigame",{"url":799,"description":800},"breaking-bad-ds-in-the-lab.png","Gameplay of Walt moving about the lab",{"url":802,"description":803},"breaking-bad-ds-hank.png","Hank's minerals (achievement system)",{"downloadCount":805,"averageRating":46,"numberOfRatings":46,"interactions":806,"onlinePlayers":46,"onlineServers":46},112508,160,{"slug":808,"restricted":7,"releaseChannels":809,"metadata":810,"stats":846},"better-call-saul-ds",[9],{"name":811,"tagline":812,"license":14,"tags":813,"github":814,"pullReadmeFromGithub":20,"readmeBody":815,"links":816,"maintainers":819,"compatibleSoftware":820,"suggestedRetailPrice":46,"linkedDiscordRole":47,"archived":7,"documentation":7,"documentationNav":821,"listDownloads":20,"hidden":7,"sortWeight":822,"icons":823,"properties":825,"images":834},"Better Call Saul DS","Better Call Saul for the Nintendo DS, based on the popular show. Written in NFLib, libnds and C++",[754,755,718],"https://github.com/WiIIiam278/BCSDS","# BCSDS\n[](https://discord.gg/tVYhJfyDWG)\n\nBetter Call Saul for the Nintendo DS.\n\n## Playing\nFor the best experience, copy `bcsds.nds` to a flash cart of your choice and run it on hardware.\n\nYou can emulate it using [No$gba](http://problemkaputt.de/gba.htm), DeSMuME or MelonDS (the latter of which you must enable DLDI mode in the config).\n\nTouch the screen to start the game (once you've had enough of the title screen). To play, you need to move the randomly shuffled spliced numbers into the four slots to match Mesa Verde's address† - 1216 (one after Magna Carta)! Keep sound on for the best experience.\n\n† *Doesn't Jimmy switch the numbers to 1261 in the show?* → I think if you double check you'll see that 1216 is correct!!!\n\n## Compiling\nInstall devkitpro and libnds (On Windows, I reccommend doing this through Msys rather than through the graphical installer). Simply run `make` in the directory to build.\n\n## License\nPlease see `COPYRIGHTS.md`. The rest of BCSDS, including the main source, is licensed under Apache-2.0.\n",[817],{"id":763,"url":818},"https://db.universal-team.net/ds/better-call-saul-ds",[42],[],[],9,{"SVG":47,"PNG":824},"bcsds.png",[826,828,830,832],{"key":772,"value":827},"desmume2015",{"key":775,"value":829},"https://github.com/WiIIiam278/BCSDS/releases/download/1.0/bcsds.nds",{"key":778,"value":831},"https://assets.william278.net/bcsds-cover-with-title.jpg",{"key":781,"value":833},"Cover art for Better Call Saul DS",[835,837,840,843],{"url":836,"description":785},"better-call-saul-ds/cover-with-title.jpg",{"url":838,"description":839},"better-call-saul-ds/ds-foreground-cover.jpg","DS in front of the cover on the title screen",{"url":841,"description":842},"better-call-saul-ds/gameplay-screen-ds.jpg","Close-up of gameplay on the DS screen",{"url":844,"description":845},"better-call-saul-ds/reverse-cover-with-gameplay.jpg","Reverse cover with gameplay on the DS screen",{"downloadCount":847,"averageRating":46,"numberOfRatings":46,"interactions":848,"onlinePlayers":46,"onlineServers":46},41724,29,{"slug":850,"restricted":7,"releaseChannels":851,"metadata":852,"stats":890},"loaded-dice",[],{"name":853,"tagline":854,"license":855,"tags":856,"github":47,"pullReadmeFromGithub":7,"readmeBody":857,"links":858,"maintainers":861,"compatibleSoftware":864,"suggestedRetailPrice":46,"linkedDiscordRole":47,"archived":7,"documentation":7,"documentationNav":865,"listDownloads":7,"hidden":7,"sortWeight":866,"icons":867,"properties":869,"images":874},"Loaded Dice","Play as a dude who lives in a die. A GMTK Game Jam '22 Submission for the theme \"Roll the Dice\"","All Rights Reserved",[717,754],"# Loaded Dice\n\n\u003Ciframe src=\"https://itch.io/embed/1622262\" width=\"500px\" height=\"150px\" frameborder=\"0\">\u003Ca href=\"https://wiiiiam278.itch.io/loaded-dice\">\nLoaded Dice by William278\u003C/a>\u003C/iframe>\n\n_\"Play as a bloke who lives inside a die.\"_\n\nA simple puzzle-platformer game, with a few neat mechanics. Did I mention you play as a dice-person-dude-thing?\n\nThere's only a single level (though with more time, we definitely had more ideas!)\n\nMade for the GMTK 2022 Game Jam with the theme of \"Roll the Dice\".\n\n## Controls\n\n* **Arrow keys / WASD** - Move character left/right\n* **SPACE / Up arrow** - Jump\n* **Number keys 1 / 2 / 3 / 4** - \"Roll\" (choose) die ability.\n * You can also press R to cycle through them\n\n## Credits\n\n* Program/design - William278\n* Level design/sound - Thelordtiktaalik\n* Art/character design - OldGardenOwl\n\n## Legal bits\n\n* Font licensed under the Open Font License via [Google Fonts](https://fonts.google.com/specimen/Rubik+Moonrocks)\n* Fire SFX from [Freesound.org](https://freesound.org/people/leosalom/sounds/234288/)\n* \"Envision\" Kevin MacLeod (incompetech.com) Licensed\n under [Creative Commons: By Attribution 4.0 License](http://creativecommons.org/licenses/by/4.0/)",[859],{"id":760,"url":860},"https://william278.itch.io/loaded-dice",[862,863,42],"GardenOwl","thelordtiktaalik",[725],[],10,{"SVG":47,"PNG":868},"loaded-dice.png",[870,872],{"key":778,"value":871},"https://assets.william278.net/loaded-dice-gameplay-4.png",{"key":781,"value":873},"Loaded Dice gameplay",[875,878,881,884,887],{"url":876,"description":877},"loaded-dice-gameplay-4.png","Loaded Dice gameplay showing the starting area",{"url":879,"description":880},"loaded-dice-gameplay-5.png","Loaded Dice gameplay showing a spike challenge",{"url":882,"description":883},"loaded-dice-gameplay-2.png","Loaded Dice gameplay showing a fire challenge",{"url":885,"description":886},"loaded-dice-gameplay-3.png","Loaded Dice gameplay showing a moving fire challenge",{"url":888,"description":889},"loaded-dice-gameplay-1.png","Loaded Dice gameplay showing a timing/spike challenge",{"downloadCount":46,"averageRating":46,"numberOfRatings":46,"interactions":46,"onlinePlayers":46,"onlineServers":46},{"slug":892,"restricted":7,"releaseChannels":893,"metadata":894,"stats":910},"cloplib",[],{"name":895,"tagline":896,"license":14,"tags":897,"github":898,"pullReadmeFromGithub":20,"readmeBody":899,"links":900,"maintainers":901,"compatibleSoftware":902,"suggestedRetailPrice":46,"linkedDiscordRole":47,"archived":7,"documentation":7,"documentationNav":903,"listDownloads":7,"hidden":7,"sortWeight":904,"icons":905,"properties":908,"images":909},"ClopLib","A library for handling events that take place in varying positions within game worlds",[16,681,17],"https://github.com/WiIIiam278/ClopLib","\u003C!--suppress ALL -->\n\u003Cp align=\"center\">\n \u003Cimg src=\"images/banner.png\" alt=\"Claim Operations Library\" />\n \u003Ca href=\"https://github.com/WiIIiam278/ClopLib/actions/workflows/ci.yml\">\n \u003Cimg src=\"https://img.shields.io/github/actions/workflow/status/WiIIiam278/ClopLib/ci.yml?branch=master&logo=github\"/>\n \u003C/a> \n \u003Ca href=\"https://repo.william278.net/#/releases/net/william278/cloplib/\">\n \u003Cimg src=\"https://repo.william278.net/api/badge/latest/releases/net/william278/cloplib/cloplib-common?color=00fb9a&name=Maven&prefix=v\"/>\n \u003C/a> \n \u003Ca href=\"https://discord.gg/tVYhJfyDWG\">\n \u003Cimg src=\"https://img.shields.io/discord/818135932103557162.svg?label=&logo=discord&logoColor=fff&color=7389D8&labelColor=6A7EC2\" />\n \u003C/a> \n\u003C/p>\n\u003Cbr/>\n\n**ClopLib** (_**C**laim **Op**erations **Lib**rary_) is a Minecraft server library for handling events that take place in varying positions within game worlds, to allow developers to contextually cancel or modify the outcome of operations such as block placement, block breaking, entity spawning, based on whether the type of operation was performed within a claimed region.\n\nCurrently, ClopLib targets `bukkit` servers running **Spigot/Paper 1.17.1+**. ClopLib requires **Java 17**.\n\n## Setup\nClopLib is available [on Maven](https://repo.william278.net/#/releases/net/william278/cloplib/). You can browse the Javadocs [here](https://repo.william278.net/javadoc/releases/net/william278/cloplib/latest).\n\n\u003Cdetails>\n\u003Csummary>Gradle setup instructions\u003C/summary> \n\nFirst, add the Maven repository to your `build.gradle` file:\n```groovy\nrepositories {\n maven { url \"https://repo.william278.net/releases\" }\n}\n```\n\nThen, add the dependency itself. Replace `VERSION` with the latest release version. (e.g., `1.0`) and `PLATFORM` with the platform you are targeting (e.g., `bukkit`). If you want to target pre-release \"snapshot\" versions (not recommended), you should use the `/snapshots` repository instead.\n\n```groovy\ndependencies {\n implementation \"net.william278.cloplib:cloplib-PLATFORM:VERSION\"\n}\n```\n\u003C/details>\n\nUsing Maven/something else? There's instructions on how to include ClopLib on [the repo browser](https://repo.william278.net/#/releases/net/william278/cloplib).\n\n## Building\nTo build ClopLib, run `clean build` in the root directory. The output JARs will be in `target/`.\n\n## License\nClopLib is licensed under Apache-2.0. See [LICENSE](https://github.com/WiIIiam278/ClopLib/raw/master/LICENSE) for more information.\n",[],[42],[],[],12,{"SVG":906,"PNG":907},"cloplib.svg","cloplib.png",[],[],{"downloadCount":46,"averageRating":46,"numberOfRatings":46,"interactions":661,"onlinePlayers":46,"onlineServers":46},{"slug":912,"restricted":7,"releaseChannels":913,"metadata":914,"stats":931},"toilet",[],{"name":915,"tagline":916,"license":14,"tags":917,"github":918,"pullReadmeFromGithub":20,"readmeBody":919,"links":920,"maintainers":921,"compatibleSoftware":922,"suggestedRetailPrice":46,"linkedDiscordRole":47,"archived":7,"documentation":7,"documentationNav":923,"listDownloads":7,"hidden":7,"sortWeight":924,"icons":925,"properties":929,"images":930},"Toilet","Cross-platform library for dumping Minecraft plugin/mod diagnostic information to the web",[16,17,681],"https://github.com/WiIIiam278/Toilet","\u003C!--suppress ALL -->\n\u003Cp align=\"center\">\n \u003Ca href=\"https://github.com/WiIIiam278/Toilet/actions/workflows/ci.yml\">\n \u003Cimg src=\"https://img.shields.io/github/actions/workflow/status/WiIIiam278/Toilet/ci.yml?branch=master&logo=github\"/>\n \u003C/a> \n \u003Ca href=\"https://repo.william278.net/#/releases/net/william278/toilet/\">\n \u003Cimg src=\"https://repo.william278.net/api/badge/latest/releases/net/william278/toilet/toilet-common?color=00fb9a&name=Maven&prefix=v\"/>\n \u003C/a> \n \u003Ca href=\"https://discord.gg/tVYhJfyDWG\">\n \u003Cimg src=\"https://img.shields.io/discord/818135932103557162.svg?label=&logo=discord&logoColor=fff&color=7389D8&labelColor=6A7EC2\" />\n \u003C/a> \n\u003C/p>\n\u003Cbr/>\n\n**Toilet** is a cross-platform library for dumping plugin diagnostic information to the web.\n\n## Setup\nToilet is available [on Maven](https://repo.william278.net/#/releases/net/william278/toilet/). You can browse the Javadocs [here](https://repo.william278.net/javadoc/releases/net/william278/toilet/latest).\n\n\u003Cdetails>\n\u003Csummary>Gradle setup instructions\u003C/summary> \n\nFirst, add the Maven repository to your `build.gradle` file:\n```groovy\nrepositories {\n maven { url \"https://repo.william278.net/releases\" }\n}\n```\n\nThen, add the dependency itself. Replace `VERSION` with the latest release version. (e.g., `1.2.1`) and `PLATFORM` with the platform you are targeting (e.g., `bukkit`). If you want to target pre-release \"snapshot\" versions (not recommended), you should use the `/snapshots` repository instead.\n\n```groovy\ndependencies {\n implementation \"net.william278.toilet:toilet-PLATFORM:VERSION\"\n}\n```\n\u003C/details>\n\nUsing Maven/something else? There's instructions on how to include Toilet on [the repo browser](https://repo.william278.net/#/releases/net/william278/toilet).\n\n## Building\nTo build Toilet, run `clean build` in the root directory. The output JARs will be in `target/`.\n\n## License\nToilet is licensed under the Apache License 2.0. See [LICENSE](https://github.com/WiIIiam278/Toilet/raw/master/LICENSE) for more information.",[],[42],[],[],13,{"SVG":926,"PNG":927,"PNG_TRANSPARENT":928},"toilet.svg","toilet.png",null,[],[],{"downloadCount":46,"averageRating":46,"numberOfRatings":46,"interactions":78,"onlinePlayers":46,"onlineServers":46},{"slug":933,"restricted":7,"releaseChannels":934,"metadata":935,"stats":951},"uniform",[],{"name":936,"tagline":937,"license":938,"tags":939,"github":940,"pullReadmeFromGithub":20,"readmeBody":941,"links":942,"maintainers":943,"compatibleSoftware":944,"suggestedRetailPrice":46,"linkedDiscordRole":47,"archived":7,"documentation":7,"documentationNav":945,"listDownloads":7,"hidden":7,"sortWeight":924,"icons":946,"properties":949,"images":950},"Uniform","A cross-platform wrapper library for making Brigadier commands","GPL3",[16,681,17],"https://github.com/WiIIiam278/Uniform","\u003C!--suppress ALL -->\n\u003Cp align=\"center\">\n \u003Cimg src=\"images/banner.png\" alt=\"Claim Operations Library\" />\n \u003Ca href=\"https://github.com/WiIIiam278/Uniform/actions/workflows/ci.yml\">\n \u003Cimg src=\"https://img.shields.io/github/actions/workflow/status/WiIIiam278/Uniform/ci.yml?branch=master&logo=github\"/>\n \u003C/a> \n \u003Ca href=\"https://repo.william278.net/#/releases/net/william278/uniform/\">\n \u003Cimg src=\"https://repo.william278.net/api/badge/latest/releases/net/william278/uniform/uniform-common?color=00fb9a&name=Maven&prefix=v\"/>\n \u003C/a> \n \u003Ca href=\"https://discord.gg/tVYhJfyDWG\">\n \u003Cimg src=\"https://img.shields.io/discord/818135932103557162.svg?label=&logo=discord&logoColor=fff&color=7389D8&labelColor=6A7EC2\" />\n \u003C/a> \n\u003C/p>\n\u003Cbr/>\n\n**Uniform** is cross-platform wrapper for making Brigadier commands, based on [`BrigadierWrapper` by Tofaa2](https://github.com/Tofaa2/BrigadierWrapper/), which itself was inspired by [EmortalMC's `command-system`](https://github.com/emortalmc/command-system).\n\n## Compatibility\n\nVersions are available on maven in the format `net.william278.uniform:ARTIFACT:VERSION`. See below for a table of supported platforms.\n\nNote that Uniform versions omit the `v` prefix. Fabric versions are suffixed with the target Minecraft version (e.g. `1.2.1+1.21`) and also require Fabric API installed on the server. Sponge versions are suffixed with the target Sponge API version (e.g. `1.2.1+11`).\n\n\u003Ctable align=\"center\">\n \u003Cthead>\n \u003Ctr>\n \u003Cth colspan=\"5\">Uniform Version Table\u003C/th>\n \u003C/tr>\n \u003Ctr>\n \u003Cth>Platform\u003C/th>\n \u003Cth>Artifact\u003C/th>\n \u003Cth>Minecraft ver.\u003C/th>\n \u003Cth>Java ver.\u003C/th>\n \u003Cth>Uniform ver.\u003C/th>\n \u003C/tr>\n \u003C/thead>\n \u003Ctbody>\n \u003Ctr>\n \u003Ctd>Common\u003C/td>\n \u003Ctd>\u003Ccode>uniform-common\u003C/code>\u003C/td>\n \u003Ctd>\u003Ccode>N/A\u003C/code>\u003C/td>\n \u003Ctd align=\"center\">≥\u003Ccode>17\u003C/code>\u003C/td>\n \u003Ctd align=\"center\">\u003Cimg src=\"https://img.shields.io/github/v/tag/WiIIiam278/Uniform?color=000000&label=%20&style=flat\"/>\u003C/td>\n \u003C/tr>\n \u003Ctr>\n \u003Cth colspan=\"5\">Supported Platforms\u003C/th>\n \u003C/tr>\n \u003Ctr>\n \u003Ctd>Bukkit / Spigot\u003C/td>\n \u003Ctd>\u003Ccode>uniform-bukkit\u003C/code>\u003C/td>\n \u003Ctd rowspan=\"2\">≥\u003Ccode>1.17.1\u003C/code>\u003C/td>\n \u003Ctd rowspan=\"3\" align=\"center\">≥\u003Ccode>17\u003C/code>\u003C/td>\n \u003Ctd rowspan=\"6\" align=\"center\">\u003Cimg src=\"https://img.shields.io/github/v/tag/WiIIiam278/Uniform?color=000000&label=%20&style=flat\"/>\u003C/td>\n \u003C/tr>\n \u003Ctr>\n \u003Ctd>Paper\u003C/td>\n \u003Ctd>\u003Ccode>uniform-paper\u003C/code>\u003C/td>\n \u003C/tr>\n \u003Ctr>\n \u003Ctd>Velocity \u003Csmall>(3.3.0)\u003C/small>\u003C/td>\n \u003Ctd>\u003Ccode>uniform-velocity\u003C/code>\u003C/td>\n \u003Ctd>≥\u003Ccode>1.8.9\u003C/code>\u003C/td>\n \u003C/tr>\n \u003Ctr>\n \u003Ctd>Sponge \u003Csmall>(api 11)\u003C/small>\u003C/td>\n \u003Ctd>\u003Ccode>uniform-sponge\u003C/code>\u003C/td>\n \u003Ctd>=\u003Ccode>1.20.6\u003C/code>\u003C/td>\n \u003Ctd rowspan=\"3\" align=\"center\">≥\u003Ccode>21\u003C/code>\u003C/td>\n \u003C/tr>\n \u003Ctr>\n \u003Ctd>Fabric \u003Csmall>(1.20.1)\u003C/small>\u003C/td>\n \u003Ctd rowspan=\"2\">\u003Ccode>uniform-fabric\u003C/code>\u003C/td>\n \u003Ctd>=\u003Ccode>1.20.1\u003C/code>\u003C/td>\n \u003C/tr>\n \u003Ctr>\n \u003Ctd>Fabric \u003Csmall>(1.21)\u003C/small>\u003C/td>\n \u003Ctd>=\u003Ccode>1.21\u003C/code>\u003C/td>\n \u003C/tr>\n \u003Ctr>\n \u003Cth colspan=\"5\">Formerly Supported Platforms\u003C/th>\n \u003C/tr>\n \u003Ctr>\n \u003Ctd>Fabric \u003Csmall>(1.20.6)\u003C/small>\u003C/td>\n \u003Ctd>\u003Ccode>uniform-fabric\u003C/code>\u003C/td>\n \u003Ctd>=\u003Ccode>1.20.6\u003C/code>\u003C/td>\n \u003Ctd align=\"center\">≥\u003Ccode>21\u003C/code>\u003C/td>\n \u003Ctd align=\"center\">\u003Ccode>v1.1.8\u003C/code>\u003C/td>\n \u003C/tr>\n \u003C/tbody>\n\u003C/table>\n\nExample: To target Uniform on Bukkit, the artifact is `net.william278.uniform:uniform-bukkit:1.2.1` (check that this version is up-to-date – make sure you target the latest available!).\n\n## Setup\nUniform is available [on Maven](https://repo.william278.net/#/releases/net/william278/uniform/). You can browse the Javadocs [here](https://repo.william278.net/javadoc/releases/net/william278/uniform/latest).\n\n\u003Cdetails>\n\u003Csummary>Gradle setup instructions\u003C/summary> \n\nFirst, add the Maven repository to your `build.gradle` file:\n```groovy\nrepositories {\n maven { url \"https://repo.william278.net/releases\" }\n}\n```\n\nThen, add the dependency itself. Replace `VERSION` with the latest release version. (e.g., `1.2.1`) and `PLATFORM` with the platform you are targeting (e.g., `paper`). If you want to target pre-release \"snapshot\" versions (not recommended), you should use the `/snapshots` repository instead.\n\n```groovy\ndependencies {\n implementation \"net.william278.uniform:uniform-PLATFORM:VERSION\"\n}\n```\n\u003C/details>\n\nUsing Maven/something else? There's instructions on how to include Uniform on [the repo browser](https://repo.william278.net/#/releases/net/william278/uniform).\n\n## Basic use\nUniform lets you create commands either natively per-platform, or cross-platform (by compiling against `uniform-common` in a common module, then implementing `uniform-PLATFORM` in each platform, getting the platform specific Uniform manager instance and registering your commands).\n\nCheck `example-plugin` for a full example of a cross-platform command being registered on Paper.\n\n### Cross-platform commands\nCross-platform commands can be created by registering `Command` objects; you can create these from `@CommandNode` annotated objects, or by extending `Command` and providing these yourself.\n\n#### Using annotations\nYou can use the `@CommandNode` annotations to easily create cross-platform Brigadier commands (since: v1.2). This is the recommended way to create commands.\n\n```java\n@CommandNode(\n value = \"helloworld\",\n aliases = {\"hello\", \"hi\"},\n description = \"A simple hello world command\",\n permission = @PermissionNode(\n value = \"example.command.helloworld\",\n defaultValue = Permission.Default.TRUE\n )\n)\npublic class AnnotatedCommand {\n\n @Syntax\n public void execute(CommandUser user) {\n user.getAudience().sendMessage(Component.text(\"Hello, world!\"));\n }\n\n @Syntax\n public void pongMessage(\n CommandUser user,\n @Argument(name = \"message\", parser = Argument.StringArg.class) String message\n ) {\n user.getAudience().sendMessage(Component.text(\"Hello, \" + message, NamedTextColor.GREEN));\n }\n \n @CommandNode(\n value = \"subcommand\",\n aliases = {\"sub\", \"hi\"}\n )\n static class SubCommand {\n @Syntax\n public void execute(CommandUser user) {\n user.getAudience().sendMessage(Component.text(\"Subcommand executed!\"));\n }\n }\n\n}\n```\n\n#### By extending the Command class.\nYou can also extend the `Command` class to create a Command object you can register. You'll want to use `BaseCommand#getUser` to get a platform-agnostic User from which you can acquire the adventure `Audience` to send messages to.\n\n```java\npublic class ExampleCrossPlatCommand extends Command {\n public ExampleCrossPlatCommand() {\n super(\"example\", \"cross-platform\");\n }\n\n @Override\n public \u003CS> void provide(@NotNull BaseCommand\u003CS> command) {\n // What gets executed when no args are passed. \n // For tidiness, feel free to delegate this stuff to methods!\n command.setDefaultExecutor((context) -> {\n // Use command.getUser(context.getSource()) to get the user\n final Audience user = command.getUser(context.getSource()).getAudience();\n user.sendMessage(Component.text(\"Hello, world!\"));\n });\n\n // Add syntax to the command\n command.addSyntax((context) -> {\n final Audience user = command.getUser(ctx.getSource()).getAudience();\n user.sendMessage(Component.text(\"Woah!!!!\"));\n String arg = context.getArgument(\"message\", String.class);\n user.sendMessage(MiniMessage.miniMessage().deserialize(arg));\n }, stringArg(\"message\"));\n\n // Sub-commands, too\n command.addSubCommand(\"subcommand\", (sub) -> {\n sub.setDefaultExecutor((context) -> {\n final Audience user = sub.getUser(context.getSource()).getAudience();\n user.sendMessage(Component.text(\"Subcommand executed!\"));\n });\n });\n }\n}\n```\n\n### Platform-specific commands\nIf you need platform-specific features, extend the platform-specific `PlatformCommand` class and add your Brigadier syntax.\n\n```java\npublic class ExampleCommand extends PaperCommand {\n public ExampleCommand() {\n super(\"example\", \"platform-specific\");\n command.setDefaultExecutor((context) -> {\n context.getSource().getBukkitSender().sendMessage(\"Hello, world!\");\n });\n addSyntax((context) -> {\n context.getSource().getBukkitSender().sendMessage(\"Woah!!!!\");\n String arg = context.getArgument(\"message\", String.class);\n context.getSource().getBukkitSender()\n .sendMessage(MiniMessage.miniMessage().deserialize(arg));\n }, stringArg(\"message\"));\n }\n}\n```\n\n\n### Registering\nThen, register the command with the platform-specific Uniform instance (e.g. `FabricUniform.getInstance()`, `PaperUniform.getInstance()`, etc...)\n\n## Building\nTo build Uniform, run `clean build` in the root directory. The output JARs will be in `target/`.\n\n## License\nUniform is licensed under GPL v3 as it derives from BrigadierWrapper. See [LICENSE](https://github.com/WiIIiam278/Uniform/raw/master/LICENSE) for more information.",[],[42],[],[],{"SVG":947,"PNG":948},"uniform.svg","uniform.png",[],[],{"downloadCount":46,"averageRating":46,"numberOfRatings":46,"interactions":866,"onlinePlayers":46,"onlineServers":46},{"slug":953,"restricted":7,"releaseChannels":954,"metadata":955,"stats":969},"desertwell",[],{"name":956,"tagline":957,"license":14,"tags":958,"github":959,"pullReadmeFromGithub":20,"readmeBody":960,"links":961,"maintainers":962,"compatibleSoftware":963,"suggestedRetailPrice":46,"linkedDiscordRole":47,"archived":7,"documentation":7,"documentationNav":964,"listDownloads":7,"hidden":7,"sortWeight":965,"icons":966,"properties":967,"images":968},"DesertWell","A library providing about menus & update checking for Minecraft projects",[16,681,17],"https://github.com/WiIIiam278/DesertWell","# DesertWell\n\n[](https://discord.gg/tVYhJfyDWG)\n[](https://jitpack.io/#net.william278/DesertWell)\n\n**DesertWell** is a simple library providing various utilities to aid Minecraft plugin development on Adventure platforms. Requires Java 11+.\n\n\n\n## Features\n### About menus\n`AboutMenu.class` allows for the generation of plugin about menus, as seen above.\n\nTo create an about menu, use `AboutMenu#create(title)` with the resource name, then use the various builder methods to build out the menu.\n\n\u003Cdetails>\n\u003Csummary>Displaying an AboutMenu\u003C/summary>\n\n```java\npublic class ExamplePlugin extends JavaPlugin {\n \n // Displays the about menu to the player and logs it to console\n public void showAboutMenu(Player player) {\n\n final AboutMenu menu = AboutMenu.builder()\n .title(Component.text(\"Example\"))\n .description(Component.text(\"An example plugin\"))\n .version(plugin.getVersion())\n .credits(\"Author\",\n AboutMenu.Credit.of(\"William278\").description(\"Click to visit website\").url(\"https://william278.net\"))\n .credits(\"Contributors\",\n AboutMenu.Credit.of(\"Contributor 1\").description(\"Code, refactoring\"))\n .credits(\"Translators\",\n AboutMenu.Credit.of(\"FreeMonoid\").description(\"Italian (it-it)\"),\n AboutMenu.Credit.of(\"4drian3d\").description(\"Coding\"))\n .buttons(\n AboutMenu.Link.of(\"https://william278.net/docs/velocitab\").text(\"Docs\").icon(\"⛏\"),\n AboutMenu.Link.of(\"https://discord.gg/tVYhJfyDWG\").text(\"Discord\").icon(\"⭐\").color(TextColor.color(0x6773f5)))\n .build();\n\n\n // Display the menu to the player (Depending on your platform, you may need to get the adventure audience for the Player here instead)\n player.sendMessage(menu.toComponent());\n \n // Use #toString to get a console-friendly version of the menu\n getLogger().info(AboutMenu.toString());\n }\n\n}\n```\n\u003C/details>\n\n### Version\n`Version.class` provides a simple way to compare semantic plugin and Minecraft versions. `VersionChecker.class` provides a utility for querying resources on different marketplaces (`SPIGOT`, `MODRINTH`, `POLYMART` and `GITHUB`) for the latest version of a plugin and comparing with the current version in order to check for updates.\n\n\u003Cdetails>\n\u003Csummary>Checking for updates\u003C/summary>\n\n```java\npublic class ExamplePlugin extends JavaPlugin {\n\n // Checks for updates and logs to console\n public void checkForUpdates() {\n final UpdateChecker checker = UpdateChecker.builder()\n .currentVersion(getVersion())\n .endpoint(UpdateChecker.Endpoint.MODRINTH)\n .resource(\"velocitab\")\n .build();\n checker.check().thenAccept(checked => {\n if (!checked.isUpToDate()) {\n getLogger().info(\"A new update is available: \" + checked.getLatestVersion());\n }\n });\n }\n\n}\n```\n\u003C/details>\n\n## Usage\nDesertWell is available on JitPack and requires Adventure. You can browse the Javadocs [here](https://javadoc.jitpack.io/net/william278/DesertWell/latest/javadoc/).\n\n\u003Cdetails>\n\u003Csummary>Adding the library to your project\u003C/summary>\n\nFirst, add the JitPack repository to your `build.gradle`:\n```groovy\nrepositories {\n maven { url 'https://repo.william278.net/snapshots/' }\n}\n```\n\nThen add the dependency:\n```groovy\ndependencies {\n implementation 'net.william278:desertwell:2.0.4-SNAPSHOT'\n}\n```\n\u003C/details>\n\n### Maven & others\nJitPack has a [handy guide](https://jitpack.io/#net.william278/DesertWell/#How_to) for how to use the dependency with other build platforms.\n\n## License\nDesertWell is licensed under Apache-2.0.\n",[],[42],[],[],14,{"SVG":47,"PNG":47},[],[],{"downloadCount":46,"averageRating":46,"numberOfRatings":46,"interactions":661,"onlinePlayers":46,"onlineServers":46},{"slug":971,"restricted":7,"releaseChannels":972,"metadata":973,"stats":992},"mineget",[],{"name":974,"tagline":975,"license":14,"tags":976,"github":979,"pullReadmeFromGithub":20,"readmeBody":980,"links":981,"maintainers":985,"compatibleSoftware":987,"suggestedRetailPrice":46,"linkedDiscordRole":47,"archived":7,"documentation":7,"documentationNav":988,"listDownloads":7,"hidden":7,"sortWeight":965,"icons":989,"properties":990,"images":991},"Mineget","Node package for aggregating data about Minecraft resources from various marketplaces",[681,977,978],"web","typescript","https://github.com/WiIIiam278/mineget","# mineget\n\n[](https://www.npmjs.com/package/mineget)\n[](https://discord.gg/tVYhJfyDWG)\n\n`mineget` is a node.js wrapper for a number of Minecraft marketplace APIs to easily fetch aggregated resource statistics, with typing support via Typescript .d.ts.\n\nQueries are cached for 10 minutes to prevent excessive API calls.\n\n## Usage\nExample querying total downloads across multiple marketplaces.\n```ts\nimport mineget from \"mineget\";\n\n// Getting the total downloads of a resource\n// Methods accept an object containing mappings of marketplace IDs\nmineget.downloads({ spigot: 97144, polymart: 1634 })\n.then((res) => {\n console.log(result)\n})\n\n```\n\n```js\nconst mineget = require('mineget');\n\n// Getting the total downloads of a resource\n// Methods accept an object containing mappings of marketplace IDs\nmineget.downloads({spigot: 97144, polymart: 1634})\n.then((res) => {\n console.log(result);\n});\n```\nThis example will return a json object with following:\n```json\n{\n \"status\": \"success\",\n \"endpoints\": { \n \"spigot\": { \n \"downloads\": 466 \n }, \n \"polymart\": { \n \"downloads\": 19 \n }\n },\n \"total_downloads\": 485\n}\n```\n\n## Methods\n* `#downloads(ids)` - Get the total downloads of a resource across multiple marketplaces.\n* `#rating(ids)` - Get the average rating and number of ratings of a resource across multiple marketplaces.\n* `#price(ids)` - Get the lowest price and lowest price currency of a resource across multiple marketplaces. \n* `#latest_version(ids)` - Get the latest version name and published timestamp of a resource across multiple marketplaces.\n* `#name(ids)` - Get the name of a resource as it is listed on different marketplaces.\n* `#get(ids)` - Returns all available content from the above methods, and the aggregated data points available from each.\n\n## Supported Marketplaces\nYou can query the following marketplaces with this module. Note that not all marketplaces support returning data for every query.\n\n| id | url | `name` | `downloads` | `latest_version` | `rating` | `price` |\n|------------|----------------------------------------------|--------|-------------|------------------|----------|---------|\n| `spigot` | [Spigot](https://www.spigotmc.org/) † | ✅ | ✅ | ✅ | ✅ | ✅ |\n| `polymart` | [Polymart](https://polymart.com/) | ✅ | ✅ | ✅ | ✅ | ✅ |\n| `modrinth` | [Modrinth](https://www.modrinth.com/) | ✅ | ✅ | ❌ | ❌ | ❌ |\n| `hangar` | [Hangar](https://hangar.papermc.io/) | ✅ | ✅ | ❌ | ❌ | ❌ |\n| `github` | [Github](https://github.com/) | ✅ | ✅ | ✅ | ❌ | ❌ |\n\nModrinth, GitHub and Hangar IDs are alphanumeric and accept a string.\n\nIf you'd like to add support for more marketplaces and additional marketplace API mappings, you can do so by submitting a pull request editing/adding a new marketplace json.\n\n† *Queries are handled via [Spiget](https://spiget.org).*\n\n## License\n`mineget` is licensed under Apache-2.0.\n",[982],{"id":983,"url":984},"npm","https://www.npmjs.com/package/mineget",[986,42],"Iotados",[],[],{"SVG":47,"PNG":47},[],[],{"downloadCount":46,"averageRating":46,"numberOfRatings":46,"interactions":78,"onlinePlayers":46,"onlineServers":46},{"slug":994,"restricted":7,"releaseChannels":995,"metadata":996,"stats":1010},"paginedown",[],{"name":997,"tagline":998,"license":14,"tags":999,"github":1000,"pullReadmeFromGithub":20,"readmeBody":1001,"links":1002,"maintainers":1003,"compatibleSoftware":1004,"suggestedRetailPrice":46,"linkedDiscordRole":47,"archived":7,"documentation":7,"documentationNav":1005,"listDownloads":7,"hidden":7,"sortWeight":1006,"icons":1007,"properties":1008,"images":1009},"PagineDown","A library for generating paginated MineDown-formatted chat menu lists",[16,681,17],"https://github.com/WiIIiam278/PagineDown","# PagineDown\n[](https://discord.gg/tVYhJfyDWG)\n[](https://jitpack.io/#net.william278/PagineDown)\n\nPagineDown is a library for generating paginated [MineDown](https://github.com/Phoenix616/MineDown)-formatted chat menu lists.\n\n\n\nRequires Java 11+. PagineDown is a library that is intended to be used with MineDown-adventure (not standalone) -- your project will need to shade MineDown-adventure to use it.\n\nPagineDown (v1.1+) runs on the [adventure](https://docs.adventure.kyori.net/) platform, or on platforms with adventure adapters.\n\n## Installation\nPagineDown is available on JitPack. You can browse the Javadocs [here](https://javadoc.jitpack.io/net/william278/PagineDown/latest/javadoc/).\n\nNote that your plugin will also need to shade (or shade a library that includes) [MineDown](https://github.com/Phoenix616/MineDown).\n\n### Maven\nTo use the library on Maven, in your `pom.xml` file, first add the JitPack repository:\n```xml\n \u003Crepositories>\n \u003Crepository>\n \u003Cid>jitpack.io\u003C/id>\n \u003Curl>https://jitpack.io\u003C/url>\n \u003C/repository>\n \u003C/repositories>\n```\n\nThen, add the dependency in your `\u003Cdependencies>` section. Remember to replace `Tag` with the current PagineDown version.\n```xml\n \u003Cdependency>\n \u003CgroupId>net.william278\u003C/groupId>\n \u003CartifactId>PagineDown\u003C/artifactId>\n \u003Cversion>Tag\u003C/version>\n \u003Cscope>compile\u003C/scope>\n \u003C/dependency>\n```\n\n### Gradle & others\nJitPack has a [handy guide](https://jitpack.io/#net.william278/PagineDown/#How_to) for how to use the dependency with other build platforms.\n\n## License\nPagineDown is licensed under Apache-2.0.\n",[],[42],[],[],15,{"SVG":47,"PNG":47},[],[],{"downloadCount":46,"averageRating":46,"numberOfRatings":46,"interactions":78,"onlinePlayers":46,"onlineServers":46},{"slug":1012,"restricted":7,"releaseChannels":1013,"metadata":1014,"stats":1028},"annotaml",[],{"name":1015,"tagline":1016,"license":14,"tags":1017,"github":1018,"pullReadmeFromGithub":20,"readmeBody":1019,"links":1020,"maintainers":1021,"compatibleSoftware":1022,"suggestedRetailPrice":46,"linkedDiscordRole":47,"archived":20,"documentation":7,"documentationNav":1023,"listDownloads":7,"hidden":7,"sortWeight":1024,"icons":1025,"properties":1026,"images":1027},"Annotaml","A Java library for generating YAML files from Java classes via annotations",[681,17],"https://github.com/WiIIiam278/Annotaml","# Annotaml\n[](https://github.com/WiIIiam278/Annotaml/actions/workflows/ci.yml)\n[](https://discord.gg/tVYhJfyDWG)\n[](https://repo.william278.net/#/releases/net/william278/annotaml/)\n\n**Annotaml** is a library for reading/writing YAML files to/from Java (11+) classes using annotations—handy for generating simple config files on-the-fly. It's not-so-great great for complex configuration structures, but good enough for [my projects](https://william278.net/).\n\nInternally, this is built atop [dejvokep's boosted-yaml](https://github.com/dejvokep/boosted-yaml); itself built atop SnakeYaml.\n\n## Setup\nAnnotaml is available [on Maven](https://repo.william278.net/#/releases/net/william278/annotaml/). You can browse the Javadocs [here](https://repo.william278.net/javadoc/releases/net/william278/annotaml/latest).\n\n\u003Cdetails>\n\u003Csummary>Gradle setup instructions\u003C/summary> \n\nFirst, add the Maven repository to your `build.gradle` file:\n```groovy\nrepositories {\n maven { url \"https://repo.william278.net/releases\" }\n}\n```\n\nThen, add the dependency itself. Replace `VERSION` with the latest release version. (e.g. `2.0.6`). If you want to target pre-release \"snapshot\" versions (not recommended), you should use the `/snapshots` repository instead.\n\n```groovy\ndependencies {\n implementation \"net.william278:annotaml:VERSION\"\n}\n```\n\u003C/details>\n\nUsing Maven/something else? There's instructions on how to include Annotaml on [the repo browser](https://repo.william278.net/#/releases/net/william278/annotaml).\n\n## Usage\n\nHere's the basic user's manual for working with Annotaml. [Browse the Javadocs](https://repo.william278.net/javadoc/releases/net/william278/annotaml/latest) for all the methods and options at your disposal.\n\n### Creating a config class\n\nAnnotaml is designed to make creating a config as thoughtless as possible. First, you'll need to create a config class as such and annotate it with `@YamlConfig`. Note your class must have a zero-args constructor to facilitate instantiation during reflection:\n\n\u003Cdetails>\n\u003Csummary>Example: MyConfig class\u003C/summary>\n\n```java\nimport net.william278.annotaml.annotations.*;\n\n@YamlConfig\npublic class MyConfig {\n\n // Annotaml supports most basic data structures, but *does not support custom classes for the sake of simplicity*.\n public String myString = \"Hello, world!\";\n public int myInt = 123;\n\n // You can also use arrays, lists, & maps.\n public ArrayList\u003CString> myList = List.of(\"Hello\", \"world!\");\n\n // Members don't have to be public.\n private String privateString = \"Private members are supported too!\";\n\n // Annotate with @YamlIgnore to prevent a member from being read/written to the YAML file.\n @YamlIgnore\n public String ignoredString = \"This string will not be read/written to the YAML file.\";\n\n // Annotate with @YamlKey to change the key used for a member in the YAML file. Use periods (.) to nest keys.\n @YamlKey(\"custom_key_name\")\n public String customKeyName = \"This string will be read/written to the YAML file with the key custom_key_name.\";\n\n // You can add comments to the YAML file to help document it a bit better. They'll be put above the member.\n @YamlComment(\"This is a comment above the member.\")\n public String commentExample = \"This string will be read/written to the YAML file with a comment above it.\";\n\n // You *must* include a zero-args constructor.\n private MyConfig() {\n }\n}\n```\n\n\u003C/details>\n\nThis will generate a file that looks like this:\n\n\u003Cdetails>\n\u003Csummary>Example: Output config\u003C/summary>\n\n```yaml\nmyString: Hello, world!\nmyInt: 123\nmyList:\n - Hello\n - world!\nprivateString: Private members are supported too!\ncustom_key_name: This string will be read/written to the YAML file with the key custom_key_name.\n# This is a comment above the member.\ncommentExample: This string will be read/written to the YAML file with a comment above it.\n```\n\u003C/details>\n\nYou can also specify a header to put at the top of the file by setting the \"header\" annotation parameter of `@YamlFile`:\n\n\u003Cdetails>\n\u003Csummary>Example: Config headers\u003C/summary>\n\n```java\n@YamlFile(header = \"This is a header!\")\npublic class MyConfig {\n // ...\n}\n```\n\nWhich will add the following to the top of the file:\n\n```yaml\n# This is a header!\n```\n\u003C/details>\n\nCalling `new MyConfig()` will now provide us with an instance of the MyConfig object with the default values. We can now use this to read/write YAML files.\n\n### The Annotaml wrapper\nThe Annotaml class provides a wrapper over `@YamlFile`-annotated objects.\n\n\u003Cdetails>\n\u003Csummary>Example: Fetch config or create default if it doesn't exist\u003C/summary>\n\n```java\npublic class AppClass {\n \n private MyConfig config;\n\n /**\n * Load the config file, or create a default config file using the defaults if one is not already present on disk.\n * @throws IllegalStateException if the config fails to load\n */\n public void createConfig() throws IllegalStateException {\n try {\n // Create an annotaml instance. This will read the config file from disk, or create a new one if it doesn't exist.\n final Annotaml\u003CMyConfig> annotaml = Annotaml.create(new File(\"./config.yml\"), new MyConfig());\n \n // Then, get the config object being wrapped by Annotaml.\n this.config = annotaml.get();\n } catch (IOException | InvocationTargetException | InstantiationException | IllegalAccessException e) {\n throw new IllegalStateException(\"Failed to create config\", e);\n }\n }\n\n}\n```\n\u003C/details>\n\nYou can also just pass the class type which will automatically instantiate the defaults for you:\n\n\u003Cdetails>\n\u003Csummary>Example: Automatic instantiation\u003C/summary>\n\n```java\npublic class AppClass {\n\n private MyConfig config;\n\n public void createConfig() throws IllegalStateException {\n try {\n final Annotaml\u003CMyConfig> annotaml = Annotaml.create(new File(\"./config.yml\"), MyConfig.class).get();\n } catch (IOException | InvocationTargetException | InstantiationException | IllegalAccessException e) {\n throw new IllegalStateException(\"Failed to create config\", e);\n }\n }\n\n}\n```\n\u003C/details>\n\n### Updating configs\nLet's say you update the value of your config during the lifecycle of your app. To save the config, create a new Annotaml instance and call `save()`:\n\n\u003Cdetails>\n\u003Csummary>Example: Saving config\u003C/summary>\n\n```java\npublic class AppClass {\n\n private MyConfig config;\n\n public void saveConfig() throws IllegalStateException {\n this.config.myString = \"Save me!\";\n \n try {\n // Create a *new* Annotaml wrapper over the newly modified object...\n final Annotaml\u003CMyConfig> annotaml = Annotaml.create(config);\n \n // Call #save() on it to write the config to disk!\n annotaml.save(new File(\"./saved_config.yml\")); // This will overwrite the file if it already exists.\n } catch (Throwable e) {\n throw new IllegalStateException(\"Failed to save config\", e);\n }\n }\n\n}\n```\n\u003C/details>\n\n### Further examples\nHave a look at the [unit tests](https://github.com/WiIIiam278/Annotaml/tree/master/src/test), which demonstrate (and test) Annotaml's various functionality.\n\n## License\nAnnotaml is licensed under Apache-2.0. See [LICENSE](https://github.com/WiIIiam278/Annotaml/raw/master/LICENSE) for more information.",[],[42],[],[],17,{"SVG":47,"PNG":47},[],[],{"downloadCount":46,"averageRating":46,"numberOfRatings":46,"interactions":866,"onlinePlayers":46,"onlineServers":46},{"slug":1030,"restricted":7,"releaseChannels":1031,"metadata":1032,"stats":1047},"carcass",[],{"name":1033,"tagline":1034,"license":14,"tags":1035,"github":1037,"pullReadmeFromGithub":20,"readmeBody":1038,"links":1039,"maintainers":1040,"compatibleSoftware":1041,"suggestedRetailPrice":46,"linkedDiscordRole":47,"archived":20,"documentation":7,"documentationNav":1042,"listDownloads":7,"hidden":7,"sortWeight":1043,"icons":1044,"properties":1045,"images":1046},"Carcass","A Python CLI tool for quickly spinning up a network of proxied Minecraft servers",[16,1036,719],"python","https://github.com/WiIIiam278/Carcass","# carcass\n\n[](https://discord.gg/tVYhJfyDWG)\n\n`carcass` is a Python CLI tool for spinning up a network of proxied Minecraft servers with configurable parameters and\nplugins.\n\nUseful for rapid testing of plugins that require a server network or that run on the proxy side.\n\n## Usage\n\nTo use carcass, install Python 3.10+ and run `python ./carcass.py --eula true`. Alternatively, you can execute the bundled\nPowershell script, `create_network.ps1`.\n\nThis will create a network of two PaperMC Minecraft servers (`/alpha` and `/beta`) connected to a Waterfall\nproxy (`/proxy`). You can then use the `\\.start_servers.ps1` script to start the servers (or use the individual\nBatch/Powershell scripts generated in each server/the proxy directory).\n\n### Arguments\n\nYou can pass various arguments to customize the network that will be spun up, including specifying the paths of plugins\nand preconfigured data folders to copy over.\n\n| Argument | Name | Description | Example |\n|------------------------------------------|----------------------|---------------------------------------------------|---------------------------------------------|\n| `-h`, `--help` | HELP | Print the help menu | `-h` |\n| `-e`, `--eula` | EULA | Accept the Minecraft EULA | `-e true` |\n| `-bt`, `--type` | TYPE | Set the type of backend (Paper) | `-bt paper` |\n| `-pt`, `--proxy` | PROXY | Set the type of proxy (Waterfall) | `-pt waterfall` |\n| `-b`, `--backends` | BACKENDS | List of backend names | `-b alpha beta gamma` |\n| `-p`, `--ports`, `--backend-ports` | PORTS | List of backend ports (order matters) | `-b 25566 25567 25568` |\n| `-v`, `--version`, `--minecraft-version` | VERSION | Minecraft version to use | `-v 1.19.2` |\n| `-pv`, `--proxy-version` | PROXY VERSION | Proxy version group to use | `-v 1.19` |\n| `-r`, `--ram`, `--backend-ram` | RAM | RAM (in MB) to allocate to each backend | `-r 2048` |\n| `-pr`, `--proxy-ram` | PROXY RAM | RAM (in MB) to allocate the proxy | `-pr 512` |\n| `-pp`, `--proxy-port` | PROXY PORT | Port number to run the proxy on | `-pp 25565` |\n| `-ph`, `--proxy-host` | PROXY HOST | Hostname to run the proxy with | `-ph localhost` |\n| `-pn`, `--proxy-name` | PROXY NAME | Name to call the proxy directory | `-pn proxy` |\n| `-bp`, `--plugins` | PLUGINS | File paths of backend plugin jars to copy in | `-bp path/to/a/plugin.jar also/another.jar` |\n| `-bpf`, `--plugin-folders` | PLUGIN FOLDERS | File paths of backend plugin data folders to copy | `-bpf plugin/data/folder/ and/another/` |\n| `-pp`, `--proxy-plugins` | PROXY PLUGINS | FIle paths of proxy plugin jars to copy in | `-pp path/to/a/plugin.jar also/another.jar` |\n| `-ppf`, `--proxy-plugin-folders` | PROXY PLUGIN FOLDERS | File paths of proxy plugin data folders to copy | `-ppf plugin/data/folder/ and/another/` |\n| `-o`, `--output` | OUTPUT | Output directory; where the servers will be made | `-o ./servers/` |\n\nI recommend writing your own simple script that use carcass to spin up a network of servers and then use the `\\.start_servers.ps1` script (of which you can pass an argument specifying the network directory to start) to start them.\n\n## License\n`carcass` is licensed under Apache-2.0.",[],[42],[],[],18,{"SVG":47,"PNG":47},[],[],{"downloadCount":46,"averageRating":46,"numberOfRatings":46,"interactions":62,"onlinePlayers":46,"onlineServers":46},{"slug":1049,"restricted":7,"releaseChannels":1050,"metadata":1051,"stats":1066},"webschematics",[],{"name":1052,"tagline":1053,"license":14,"tags":1054,"github":1056,"pullReadmeFromGithub":20,"readmeBody":1057,"links":1058,"maintainers":1059,"compatibleSoftware":1060,"suggestedRetailPrice":46,"linkedDiscordRole":47,"archived":20,"documentation":7,"documentationNav":1061,"listDownloads":7,"hidden":7,"sortWeight":1043,"icons":1062,"properties":1064,"images":1065},"WebSchematics","Render Minecraft schematics on the web natively in-browser",[681,977,1055],"javascript","https://github.com/WiIIiam278/WebSchematics","# WebSchematics\n[](https://wiiiiam278.github.io/WebSchematics/)\n[](https://discord.gg/tVYhJfyDWG)\n\nWebSchematics lets you render Minecraft schematic files in the web, completely in the browser. It uses `nbt.js` to parse the schematic and converts block models from a resource pack into `three.js` meshes, before assembling them into a scene.\n\n\n\nStill a work in progress, but it looks pretty neat! Check out the [live demo](https://wiiiiam278.github.io/WebSchematics/)—though note it only currently works with modern Sponge v3 (`.schem`) schematics, like the ones you can generate with WorldEdit.\n\n## License\nWebSchematics is licensed under Apache-2.0. It uses the following libraries:\n* [three.js](https://github.com/mrdoob/three.js/), released under MIT\n* [lodash](https://github.com/lodash/lodash), released under MIT\n* [pako.js](https://github.com/nodeca/pako), released under MIT\n* [nbt.js](https://github.com/sjmulder/nbt-js), released under the public domain\n\nMinecraft textures and models are © Mojang A.B. and are not included in the source. You'll need to provide your own resource pack or fetch them remotely.",[],[42],[],[],{"SVG":47,"PNG":1063},"webschematics.png",[],[],{"downloadCount":46,"averageRating":46,"numberOfRatings":46,"interactions":924,"onlinePlayers":46,"onlineServers":46},{"slug":1068,"restricted":7,"releaseChannels":1069,"metadata":1070,"stats":1130},"website",[],{"name":1071,"tagline":1072,"license":14,"tags":1073,"github":1074,"pullReadmeFromGithub":7,"readmeBody":1075,"links":1076,"maintainers":1077,"compatibleSoftware":1078,"suggestedRetailPrice":46,"linkedDiscordRole":47,"archived":7,"documentation":20,"documentationNav":1079,"listDownloads":7,"hidden":7,"sortWeight":1043,"icons":1123,"properties":1128,"images":1129},"William278.net","The docs & help hub for my various Minecraft plugins & game projects.",[977,1055],"https://github.com/WiIIiam278/flesh","# [](https://github.com/WiIIiam278/flesh)\n\nWelcome to William278.net, the docs & help hub for my various Minecraft plugins & game projects.\n\n## Source code\nThis site is composed of a frontend and backend service, both of which are open-sourced\\* for the community to use in their own sites.\n* 💻 [Site Frontend Code](https://github.com/WiIIiam278/flesh)\n* 🧑💻 [Site Backend Code](https://github.com/WiIIiam278/bones)\n\n\\* The source code to these services are governed by the Apache-2.0 license. Use of brand material (the \"William278.net\" or \"William278\" name and banner graphics) is prohibited. Content hosted on these sites is also not under the jurisdiction of this open-source license.\n\n## Customer support\nPlease get in touch on Discord for enquiries related to using this service, and be sure to review our terms of service.\n* 💬 [Discord Support](https://discord.gg/tVYhJfyDWG)\n* 🔔 [Terms of Service](https://william278.net/terms#terms-and-conditions)\n",[],[42],[],[1080,1091,1109],{"order":46,"name":1081,"children":1082},"Articles",[1083,1087],{"order":46,"url":1084,"title":1085,"icon":75,"children":1086},"redis-hosts","Redis Hosts",[],{"order":62,"url":1088,"title":1089,"icon":81,"children":1090},"translate","Translations",[],{"order":62,"name":1092,"children":1093},"Legal",[1094,1099,1104],{"order":46,"url":1095,"title":1096,"icon":1097,"children":1098},"terms-and-conditions","Terms & Conditions","mdi:legal",[],{"order":62,"url":1100,"title":1101,"icon":1102,"children":1103},"privacy-notice","Privacy Notice","dashicons:privacy",[],{"order":78,"url":1105,"title":1106,"icon":1107,"children":1108},"discord-rules","Discord Rules","fa6-brands:discord",[],{"order":78,"name":1110,"children":1111},"Links",[1112,1115,1119],{"order":46,"url":1074,"title":1113,"icon":196,"children":1114},"Frontend Source Code",[],{"order":62,"url":1116,"title":1117,"icon":196,"children":1118},"https://github.com/WiIIiam278/bones","Backend Source Code",[],{"order":78,"url":1120,"title":1121,"icon":1107,"children":1122},"https://discord.gg/tVYhJfyDWG","Discord Support",[],{"SVG":1124,"PNG":1125,"PNG_TRANSPARENT":1126,"SVG_TRANSPARENT":1127},"william278.svg","william278.png","william278-transparent.png","william278-transparent.svg",[],[],{"downloadCount":46,"averageRating":46,"numberOfRatings":46,"interactions":171,"onlinePlayers":46,"onlineServers":46},{"slug":1132,"restricted":7,"releaseChannels":1133,"metadata":1134,"stats":1208},"huskchat",[9,10],{"name":1135,"tagline":1136,"license":14,"tags":1137,"github":1138,"pullReadmeFromGithub":20,"readmeBody":1139,"links":1140,"maintainers":1147,"compatibleSoftware":1148,"suggestedRetailPrice":46,"linkedDiscordRole":47,"archived":20,"documentation":20,"documentationNav":1149,"listDownloads":20,"hidden":7,"sortWeight":746,"icons":1201,"properties":1206,"images":1207},"HuskChat","A smart, beautiful & customisable proxy chat plugin",[16,17,18],"https://github.com/WiIIiam278/HuskChat","> 🚨 **HuskChat has been discontinued** 🚨 and is no longer actively maintained. It may cease to function with newer versions of Spigot/Paper/Velocity/Waterfall. We no longer provide support for it. Thank you for your understanding.\n\n\u003C!--suppress ALL -->\n\u003Cp align=\"center\">\n \u003Cimg src=\"images/banner.png\" alt=\"HuskChat\" />\n \u003Ca href=\"https://github.com/WiIIiam278/HuskChat/actions/workflows/ci.yml\">\n \u003Cimg src=\"https://img.shields.io/github/actions/workflow/status/WiIIiam278/HuskChat/ci.yml?branch=master&logo=github\"/>\n \u003C/a> \n \u003Ca href=\"https://repo.william278.net/#/releases/net/william278/huskchat/\">\n \u003Cimg src=\"https://repo.william278.net/api/badge/latest/releases/net/william278/huskchat?color=00fb9a&name=Maven&prefix=v\" />\n \u003C/a> \n \u003Ca href=\"https://discord.gg/tVYhJfyDWG\">\n \u003Cimg src=\"https://img.shields.io/discord/818135932103557162.svg?label=&logo=discord&logoColor=fff&color=7389D8&labelColor=6A7EC2\" />\n \u003C/a> \n \u003Cbr/>\n \u003Cb>\n \u003Ca href=\"https://www.spigotmc.org/resources/huskchat.94496/\">Spigot\u003C/a>\n \u003C/b> —\n \u003Cb>\n \u003Ca href=\"https://william278.net/docs/huskchat/setup\">Setup\u003C/a>\n \u003C/b> — \n \u003Cb>\n \u003Ca href=\"https://william278.net/docs/huskchat/\">Docs\u003C/a>\n \u003C/b> — \n \u003Cb>\n \u003Ca href=\"https://github.com/WiIIiam278/HuskChat/issues\">Issues\u003C/a>\n \u003C/b>\n\u003C/p>\n\u003Cbr/>\n\n**HuskChat** is a no-frills, simple and customisable chat system for Minecraft networks. It supports both running on BungeeCord and Velocity frontend servers for cross-server chat, or on a single-server Spigot setup.\n\nIt's designed to be easy to configure with an elegant out-of-box setup, while also being highly configurable, suiting a variety of use cases by allowing you to define channels and manage who can send and receive messages within them.\n\n## Features\n**⭐ Works great out of the box** — Install on your Spigot server or Velocity/BungeeCord-based proxy and use right away\n\n**⭐ Placeholder support** — Hooks with LuckPerms to display user roles, PAPI support via [PAPIProxyBridge](https://william278.net/docs/huskchat/formatting)\n\n**⭐ Private messaging** — Private messages—including group DMs&mdash and replying, admin spy features\n\n**⭐ Fine-tune channels** — Set send/receive permissions for channels, send messages to a discord webhook, filter [& more](https://william278.net/docs/huskchat/channels)!\n\n**⭐ Quick and easy to use** — Super simple set of [commands](https://william278.net/docs/huskchat/commands). Define channel shortcut commands, too!\n\n**⭐ Advanced profanity checking** — Machine learning powered profanity filter\n\n**⭐ Filters & replacers** — Customisable spam limiting filter, anti-advertising & special emoji\n\n**⭐ Modern formatting** — Utilise modern formatting, with RGB and Gradient support via [MineDown](https://github.com/Phoenix616/MineDown)\n\n## Building\nTo build HuskChat, you'll need python (>=`v3.6`) with associated packages installed; `jep` and `alt-profanity-check`. \nYou can install these with `pip install jep` and `pip install alt-profanity-check`. These are needed to run the profanity filter tests.\n\nThen, simply run the following in the root of the repository:\n```\n./gradlew clean build\n```\n\n## License\nHuskChat is licensed under the Apache 2.0 license.\n\n- [License](https://github.com/WiIIiam278/HuskChat/blob/master/LICENSE)\n\n## Translations\nTranslations of the plugin locales are welcome to help make the plugin more accessible. Please submit a pull request with your translations as a `.yml` file.\n\n- [Locales Directory](https://github.com/WiIIiam278/HuskChat/tree/master/common/src/main/resources/locales)\n- [English Locales](https://github.com/WiIIiam278/HuskChat/tree/master/common/src/main/resources/locales/en-gb.yml)\n\n## Links\n- [Docs](https://william278.net/docs/huskchat/) — Read the plugin documentation!\n- [Spigot](https://www.spigotmc.org/resources/huskchat.94496/) — View the Spigot resource page (Also: [Polymart](https://polymart.org/resource/huskchat.1217), [Modrinth](https://modrinth.com/plugin/huskchat))\n- [Issues](https://github.com/WiIIiam278/HuskChat/issues) — File a bug report or feature request\n- [Discord](https://discord.gg/tVYhJfyDWG) — Get help, ask questions\n- [bStats](https://bstats.org/plugin/bungeecord/HuskChat/11882) — View plugin metrics (Also: [Velocity](https://bstats.org/plugin/velocity/HuskChat%20-%20Velocity/14187))\n\n---\n© [William278](https://william278.net/), 2024. Licensed under the Apache-2.0 License.\n",[1141,1143,1145],{"id":24,"url":1142},"https://spigotmc.org/resources/huskchat.94496",{"id":30,"url":1144},"https://polymart.org/resource/huskchat.1217",{"id":27,"url":1146},"https://modrinth.com/plugin/huskchat",[42],[24,44,695,696],[1150,1158,1177,1197],{"order":46,"name":50,"children":1151},[1152,1154],{"order":46,"url":53,"title":50,"icon":54,"children":1153},[],{"order":62,"url":63,"title":64,"icon":65,"children":1155},[1156],{"order":46,"url":79,"title":80,"icon":81,"children":1157},[],{"order":62,"name":100,"children":1159},[1160,1162,1167,1172],{"order":46,"url":103,"title":104,"icon":105,"children":1161},[],{"order":62,"url":1163,"title":1164,"icon":1165,"children":1166},"join-and-quit-messages","Join & Quit Messages","mdi:greeting-outline",[],{"order":78,"url":1168,"title":1169,"icon":1170,"children":1171},"group-messages","Group Private Messages","ic:outline-email",[],{"order":89,"url":1173,"title":1174,"icon":1175,"children":1176},"social-and-local-spy","Social & Local Spy","tabler:spy",[],{"order":78,"name":1178,"children":1179},"Chat",[1180,1185,1187,1192],{"order":46,"url":1181,"title":1182,"icon":1183,"children":1184},"channels","Chat Channels","grommet-icons:channel",[],{"order":62,"url":610,"title":611,"icon":612,"children":1186},[],{"order":78,"url":1188,"title":1189,"icon":1190,"children":1191},"filters-and-replacers","Filters & Replacers","lucide:filter",[],{"order":89,"url":1193,"title":1194,"icon":1195,"children":1196},"discord-hook","Discord Hook","material-symbols:webhook",[],{"order":89,"name":177,"children":1198},[1199],{"order":46,"url":1138,"title":195,"icon":196,"children":1200},[],{"SVG":1202,"PNG":1203,"PNG_TRANSPARENT":1204,"SVG_TRANSPARENT":1205},"huskchat.svg","huskchat.png","huskchat-transparent.png","huskchat-transparent.svg",[],[],{"downloadCount":1209,"averageRating":1210,"numberOfRatings":924,"interactions":1211,"onlinePlayers":46,"onlineServers":46},27652,3.892307692307692,79,{"slug":1213,"restricted":7,"releaseChannels":1214,"metadata":1215,"stats":1236},"huskhomesgui",[9],{"name":1216,"tagline":1217,"license":14,"tags":1218,"github":1219,"pullReadmeFromGithub":20,"readmeBody":1220,"links":1221,"maintainers":1228,"compatibleSoftware":1229,"suggestedRetailPrice":46,"linkedDiscordRole":47,"archived":20,"documentation":7,"documentationNav":1230,"listDownloads":20,"hidden":7,"sortWeight":746,"icons":1231,"properties":1234,"images":1235},"HuskHomesGUI","Show HuskHomes homes and warps in a simple to use menu",[16,17,18],"https://github.com/WiIIiam278/HuskHomesGUI","> 🚨 **HuskHomesGUI has been discontinued** 🚨 and is no longer actively maintained. It may cease to function with newer versions of Minecraft/HuskHomes. We no longer provide support for it. Thank you for your understanding.\n\n\u003C!--suppress ALL -->\n\u003Cp align=\"center\">\n \u003Cimg src=\"images/banner.png\" alt=\"HuskHomesGUI\" />\n \u003Ca href=\"https://github.com/WiIIiam278/HuskHomesGUI/actions/workflows/java_ci.yml\">\n \u003Cimg src=\"https://img.shields.io/github/actions/workflow/status/WiIIiam278/HuskHomesGUI/java_ci.yml?branch=master&logo=github\"/>\n \u003C/a>\n \u003Ca href=\"https://discord.gg/tVYhJfyDWG\">\n \u003Cimg src=\"https://img.shields.io/discord/818135932103557162.svg?label=&logo=discord&logoColor=fff&color=7389D8&labelColor=6A7EC2\" />\n \u003C/a> \n \u003Cbr/>\n \u003Cb>\n \u003Ca href=\"https://www.spigotmc.org/resources/huskhomesgui.91059/\">Spigot\u003C/a>\n \u003C/b> —\n \u003Cb>\n \u003Ca href=\"https://william278.net/docs/huskhomes/gui-add-on\">Docs\u003C/a>\n \u003C/b> — \n \u003Cb>\n \u003Ca href=\"https://github.com/WiIIiam278/HuskHomes/\">Homes\u003C/a>\n \u003C/b> — \n \u003Cb>\n \u003Ca href=\"https://github.com/WiIIiam278/HuskHomes/issues\">Issues\u003C/a>\n \u003C/b>\n\u003C/p>\n\u003C/br>\n\n**HuskHomesGUI** is a GUI add-on plugin for [HuskHomes v4.x](https://github.com/WiIIiam278/HuskHomes2) on Spigot servers. It provides a chest-style graphical user interface (GUI) for browsing home and warp lists as well as editing homes.\n\nIt replaces the chat menu system that is built into HuskHomes when you type `/homelist`, `/phomelist` or `/warplist` and includes anvil-based rename and description editing functionality to allow for easy editing.\n\n\n\nIf you prefer to browse using a menu, or would like better support for Bedrock players connecting over Geyser, then this add-on is for you.\n\n## Setup\n1. Have HuskHomes v4.x+ installed on your server(s)\n2. Download HuskHomesGUI and place it in your server's `~/plugins/` folder\n\n## Usage\nSimply use the list commands you are familiar with to bring up a list of homes or warps.\nThen you can left-click to teleport to a home/warp, right click to edit it, and shift-left click to change the icon of the home in the list to match the type of item in your main hand. Use the page navigation buttons to switch pages.\n",[1222,1224,1226],{"id":24,"url":1223},"https://spigotmc.org/resources/huskhomesgui.91059",{"id":30,"url":1225},"https://polymart.org/resource/huskhomesgui.928",{"id":27,"url":1227},"https://modrinth.com/plugin/huskhomesgui",[42],[24,44],[],{"SVG":1232,"PNG":1233},"huskhomesgui.svg","huskhomesgui.png",[],[],{"downloadCount":1237,"averageRating":1238,"numberOfRatings":569,"interactions":866,"onlinePlayers":46,"onlineServers":46},9873,4.6499999999999995,{"slug":1240,"restricted":7,"releaseChannels":1241,"metadata":1242,"stats":1263},"schematicupload",[9],{"name":1243,"tagline":1244,"license":14,"tags":1245,"github":1246,"pullReadmeFromGithub":20,"readmeBody":1247,"links":1248,"maintainers":1255,"compatibleSoftware":1256,"suggestedRetailPrice":46,"linkedDiscordRole":47,"archived":20,"documentation":7,"documentationNav":1257,"listDownloads":20,"hidden":7,"sortWeight":746,"icons":1258,"properties":1261,"images":1262},"SchematicUpload","Give users a simple web interface to upload schematics",[16,17,18],"https://github.com/WiIIiam278/SchematicUpload","\u003C!--suppress ALL -->\n\u003Cp align=\"center\">\n \u003Cimg src=\"images/banner.png\" alt=\"SchematicUpload\" />\n \u003Ca href=\"https://github.com/WiIIiam278/SchematicUpload/actions/workflows/ci.yml\">\n \u003Cimg src=\"https://img.shields.io/github/actions/workflow/status/WiIIiam278/SchematicUpload/ci.yml?branch=master&logo=github\"/>\n \u003C/a> \n \u003Ca href=\"https://discord.gg/tVYhJfyDWG\">\n \u003Cimg src=\"https://img.shields.io/discord/818135932103557162.svg?label=&logo=discord&logoColor=fff&color=7389D8&labelColor=6A7EC2\" />\n \u003C/a> \n \u003Cbr/>\n \u003Cb>\n \u003Ca href=\"https://www.spigotmc.org/resources/schematicupload.100657/\">Spigot\u003C/a>\n \u003C/b> —\n \u003Cb>\n \u003Ca href=\"https://william278.net/project/schematicupload\">About\u003C/a>\n \u003C/b> — \n \u003Cb>\n \u003Ca href=\"https://github.com/WiIIiam278/SchematicUpload/issues\">Issues\u003C/a>\n \u003C/b>\n\u003C/p>\n\u003Cbr/>\n\n**SchematicUpload** is a plugin that lets players upload schematics to your server through a simple and safe web panel.\nIf you've ever run a build or creative server and have had to respond to annoying requests to import a player's\nschematic, this is the plugin for you.\n\n\n\n## Features\n**⭐ Easy-to-use** — Incredibly simple to use web interface for uploading schematics.\n\n**⭐ Super easy to configure** — Simply set a port and hostname!\n\n**⭐ Downloads, too!** — Let users both download and upload schematics!\n\n**⭐ Less hassle for players** — No more annoying requests to manually upload schematics!\n\n**⭐ Great admin features** — Limit how many schematics a player can upload over a given timeframe.\n\n## How it works\n\nPlayers simply type the `/schematicupload` command in-game that sends them a link to the web panel with a unique\nauthentication code. On the panel, all the player needs to do is choose the file and press \"Upload.\" The schematic will\nbe checked and uploaded to the schematics' folder in-game.\n\n\n\n## Commands\n\nSchematicUpload provides the following commands. By default, only operators are permitted to use the schematic uploader.\nYou'll need a permission plugin such as LuckPerms to let non-operators use these.\n\n| Command | Description | Permission |\n|-----------------------------|---------------------------------------------------|------------------------------------|\n| `/uploadschematic` | Upload a schematic file through the web interface | `schematicupload.command` |\n| `/uploadschematic about` | View plugin information | `schematicupload.command.about` |\n| `/uploadschematic reload` | Reload config and message files | `schematicupload.command.reload` |\n| `/downloadschematic (name)` | Get a download link for a schematic | `schematicupload.command.download` |\n\n## Setup\n\n1. Download the SchematicUpload jar and place it in your `/plugins/` directory\n2. Start the server. The web server will be hosted on port 2780 by default. If you're running the server on your\n computer, you can visit `https://localhost:2780` to view the interface.\n3. Turn off the server, navigate to `/plugins/SchematicUpload` and modify the contents of `config.yml` and\n `messages_xx-xx.yml` as appropriate. Make sure to change `url` to be the IP address or domain of your server.\n\n## License\nSchematicUpload is licensed under the Apache 2.0 license.\n\n- [License](https://github.com/WiIIiam278/SchematicUpload/blob/master/LICENSE)\n\n## Translations\nTranslations of the plugin locales are welcome to help make the plugin more accessible. Please submit a pull request with your translations as a `.yml` file.\n\n- [Locales Directory](https://github.com/WiIIiam278/SchematicUpload/tree/master/src/main/resources/locales)\n- [English Locales](https://github.com/WiIIiam278/SchematicUpload/tree/master/src/main/resources/locales/en-gb.yml)\n\n## Links\n- [Spigot](https://www.spigotmc.org/resources/schematicupload.100657/) — View the plugin Modrinth page (Also: [Modrinth](https://modrinth.com/plugin/schematicupload), [Polymart](https://polymart.org/resource/schematicupload.2125), & [Hangar](https://hangar.papermc.io/William278/SchematicUpload))\n- [Issues](https://github.com/WiIIiam278/SchematicUpload/issues) — File a bug report or feature request\n- [Discord](https://discord.gg/tVYhJfyDWG) — Get help, ask questions\n- [bStats](https://bstats.org/plugin/bukkit/SchematicUpload/14611) — View plugin metrics\n\n---\n© [William278](https://william278.net/), 2023. Licensed under the Apache-2.0 License.",[1249,1251,1253],{"id":24,"url":1250},"https://spigotmc.org/resources/schematicupload.100657",{"id":30,"url":1252},"https://polymart.org/resource/schematicupload.2125",{"id":27,"url":1254},"https://modrinth.com/plugin/schematicupload",[42],[],[],{"SVG":1259,"PNG":1260},"schematicupload.svg","schematicupload.png",[],[],{"downloadCount":1264,"averageRating":661,"numberOfRatings":78,"interactions":1006,"onlinePlayers":46,"onlineServers":46},4554,{"slug":1266,"restricted":7,"releaseChannels":1267,"metadata":1268,"stats":1286},"huskbungeertp",[9],{"name":1269,"tagline":1270,"license":14,"tags":1271,"github":1272,"pullReadmeFromGithub":20,"readmeBody":1273,"links":1274,"maintainers":1277,"compatibleSoftware":1278,"suggestedRetailPrice":46,"linkedDiscordRole":47,"archived":20,"documentation":7,"documentationNav":1279,"listDownloads":20,"hidden":7,"sortWeight":1280,"icons":1281,"properties":1284,"images":1285},"HuskBungeeRTP","A random teleport system that works cross-server. Requires HuskHomes",[16,17,18],"https://github.com/WiIIiam278/HuskBungeeRTP","[](https://github.com/WiIIiam278/HuskBungeeRTP)\n# HuskBungeeRTP\n[](https://discord.gg/tVYhJfyDWG)\n\n**HuskBungeeRTP** is a cross-server random teleport plugin that utilises [HuskHomes](https://github.com/WiIIiam278/HuskHomes), Redis and MySQL to allow players to randomly teleport to Spigot servers on a proxy network.\n\n## Features\nThe system works as follows and requires a mySQL (8.0+) Database and Redis server. Note that I will be referring to the \"origin\" server (the server upon which the player or console runs the /rtp command) and the \"destination\" server (the server the player will be randomly teleported within)\n\n* The plugin on the origin server will pick which server the player will be randomly teleported on.\n * It does this randomly, or if you have the Plan hook enabled it will check which server has the lowest playtime (to load-balance players onto the least populated server on your network).\n * The plugin picks from the servers in the \"destination group\" (a set of servers you define that players can be randomly teleported onto - you can set multiple groups and target which group you want to randomly teleport to onto via the command, as well as pick a target biome)\n* The origin server plugin will communicate over Redis to the chosen server and ask the destination server plugin to find a safe random spot.\n * The plugin doesn't require, but I strongly recommend that you install JakesRTP on destination servers and enable the hook in the config as the destination server will then use the laser-fast and super configurable algorithm and settings provided by that plugin.\n* The destination server will reply back to the origin server using Redis with the chosen random location.\n* The origin server will use HuskHomes' cross-server teleportation functionality to efficiently teleport the player to the randomly chosen spot.\n\nAll that, hopefully, in a fraction of a second! It also makes use of mySQL to track this process and to enable the cool down feature. Usually this will happen very fast, but on slower servers - and very often if you specify a less common / rare / impossible biome, the rtp will \"fail\" and time out.\n\n### Commands\nBungeeRTP for HuskHomes provides one command to do this: `/brtp` (Permission node: `huskrtp.command.rtp`). This command can be run through console, too, allowing you to make some custom setups with other plugins. /rtp will also work for this command, but you will need to disable HuskHomes' built in RTP first.\n\nThere is also a `/huskbungeertp` (Permission node: `huskrtp.command.admin`) command to let you view the groups loaded on the server, Plan play time calculations & lets you reload the config files. You can also fully customise the /rtp command messages using hex color codes via the advanced, powerful MineDown formatting system.\n\n## Setup\n### Requirements\n* A network of proxied Spigot-based game servers\n* [HuskHomes](https://github.com/WiIIiam278/HuskHomes) installed and using Bungee mode on your spigot servers\n* A Redis server\n* A MySQL database (v8.0+)\n\n### Installation\n1. Download and install HuskHomes, HuskBungeeRTP & (Optional) [JakesRTP](https://www.spigotmc.org/resources/jakes-rtp.80201/) on all the spigot servers.\n2. (Optional) Install Plan (Player Analytics) on all your spigot servers and your proxy server. Configure Plan, ensuring the server names are set correctly in the Plan config (e.g /server survival1 has it's server name as survival1 in the Plan config)\n3. Configure HuskHomes as per these instructions if you have not already.\n4. If you have not already, start and stop all of the servers you are installing it onto to let HuskBungeeRTP generate it's config files.\n5. Open up the config.yml file generated in ~/plugins/HuskBungeeRTP/\n6. Fill in your mySQL Database credentials under mysql_credentials and your Redis credentials under redis_credentials (You need a Redis server and mySQL Database for this). MySQL must be Version 8.0+, older versions are not supported and you will get an error.\n7. Set this_server_id to match the ID of the server whose HuskBungeeRTP config you are currently editing (e.g for /server survival1, put survival1 here).\n8. (Optional) If you want to use the Plan hook, set use_plan to true\n9. Now you can set your groups. To start with, to have one group of servers, delete the entire group2 section from the file for now (including the group2: parent key)\n10. Unless you really need to, you can leave the table name alone, but you can change the cooldown (for no cooldown, set it to 0). Groups contain servers_worlds: and your group needs to contain valid destination servers and the worlds within them.\n * For instance,lets say you have three survival servers and a spawn server, where each survival server contains a \"world\" (overworld) as well as a \"world_nether\" and \"world_the_end\".\n * Let's say you want players to be able to randomly teleport to survival1, survival2 or survival3, but not randomly teleport to the spawn server (but possibly from). In each config, you would then have, in your group, something like this.\n ```\n group1:\n table_name: huskrtp_group_1\n cooldown_minutes: 6\n servers_worlds:\n survival1:\n - world\n survival2:\n - world\n survival3:\n - world\n ```\n\n * In this way, a player teleporting to group_1 from any server with HuskBungeeRTP installed on the network will be taken to a random position on the survival1, survival2 or survival3 servers (in the world \"world\")\n * You can define multiple groups, and using the /brtp command you will be able to specify which group you wish to randomly teleport within.\n * You **must** set the default_rtp_group for each server in the config file too. If you only have one group, then that should be it, otherwise it's the group you want players to go to when they run the /rtp command without specifying a group. (e.g set it to group1 with the above example given)\n11. Once you have configured your groups and saved your config files (group definitions should match between servers), you can restart each server and the plugin should function! Test it out with the /brtp command (usage: /brtp [player] [target group] [target biome])\n\n## bStats\nThis plugin uses bStats to provide me with [metrics about its usage](https://bstats.org/plugin/bukkit/HuskBungeeRTP/12830).\n\nYou can turn metric collection off by navigating to `plugins/bStats/config.yml` and editing the config to disable plugin metrics.\n\n## Support\n* Report bugs: [Click here](https://github.com/WiIIiam278/HuskBungeeRTP/issues)\n* Discord support: Join the [HuskHelp Discord](https://discord.gg/tVYhJfyDWG)!\n",[1275],{"id":24,"url":1276},"https://spigotmc.org/resources/huskbungeertp.96352",[42],[24,44],[],21,{"SVG":1282,"PNG":1283},"huskbungeertp.svg","huskbungeertp.png",[],[],{"downloadCount":1287,"averageRating":661,"numberOfRatings":78,"interactions":46,"onlinePlayers":46,"onlineServers":46},813,{"slug":1289,"restricted":7,"releaseChannels":1290,"metadata":1291,"stats":1330},"timetobattle",[],{"name":1292,"tagline":1293,"license":855,"tags":1294,"github":47,"pullReadmeFromGithub":7,"readmeBody":1296,"links":1297,"maintainers":1298,"compatibleSoftware":1300,"suggestedRetailPrice":46,"linkedDiscordRole":47,"archived":20,"documentation":7,"documentationNav":1301,"listDownloads":7,"hidden":7,"sortWeight":1302,"icons":1303,"properties":1306,"images":1311},"TimeToBattle.net","A Minecraft SMP server with custom battle minigames (2020-2022)",[16,1295],"server","# Time to Battle archive\n\nTimeToBattle.net was my public-access Minecraft server I ran for just under two years, between August 2020 and June 2022. The server launched to the public after a period of closed testing on August 9, 2020, and was live-streamed through my [Twitch channel](https://twitch.tv/william278). The server ended operations on June 1, 2022. You can still join TimeToBattle's [archived discord server here](https://discord.gg/xceEsXC).\n\n© William278 2022, All Rights Reserved\n\n## Features\nThe server contained a number of features and game modes through its run.\n* The premiere game mode was **Survival**, which was a Minecraft 1.16 generated world. The server was updated with the release of Minecraft 1.17.\n* The **Battle Bastion**, added in a content update known as the \"adventure update\" ([trailer link](https://youtu.be/KHHwUQ1P53E)) was a dungeon game mode. Players would take their Survival equipment into the Bastion, which comprised a number of randomized floors. Monsters in the Bastion dropped a special currency that could be exchanged for loot on the first floor of the Bastion.\n* **Sphere Battles**, a recreation (with some new elements) of Jeremaster's idea on what was the precursor to the [MCDiamondFire](https://mcdiamondfire.com) coding server, was the first Minigame mode and fairly popular. Players battled it out on floating spherical resource islands on a number of maps. Players had to mine the islands to obtain resources\n* **Battle Royale**, inspired by the [Dogcraft.net Nitro UHC](https://dogcraft.net/wiki/Nitro_UHC) game mode, was a fast-paced PVP mode. Players dropped onto a map (from one of my previous projects, Tales of Firma) and had to battle it out, killing monsters to obtain resources needed to gear up.\n* A hub world, which went through two iterations, allowed players to parkour. The hub closed on November 11, 2021, after which navigation changed to a command-based system.\n\nAdditionally, online leaderboards were available through the server website, detailing play time, Survival stats as well as minigame score rankings.\n\n## Gallery\n### Survival\n\n\n### The Battle Bastion\n\n\nPlayers would walk up to the entrance to start their quest in the Bastion. Behind this picture is the exit back to the Survival world (or players could use the /survival command)\n\n### The Hub\n\n\nThis is the second iteration of the Hub server - based on a clockwork design. Parkour, as well as an Elytra rings challenge were available and the top 10 best times were displayed on the server website.\n\n### Battle Royale\n\n\n### Sphere Battles\n\n\nA few more Sphere Battles maps aren't pictured here.\n\n## The Cutting Room Floor\nA few things planned for Time to Battle never came to fruition. If you're interested, have a read.\n\n* **Island Dreams:** A planned update would have allowed players to create \"islands\" (a-la _Animal Crossing: New Horizons_), which would have shared inventories with the Survival game mode.\n * Players would be free to customise and design their islands as they saw fit, including buying upgrades and special items on them. \n * Island Dreams was fully planned out and a significant number of diverse island templates were completed, though development was halted and never completed.\n* **Battle Bastion updates:** A number of floors were designed by staff, but never implemented in the Battle Bastion, including concepts for additional boss floors. An overhaul of the Battle Bastion plugin was developed planned but not finished.\n\n## Staff\nI was helped in overseeing Time to Battle by these great people:\n* Elliot; \"Pleuvior\" - Administrator\n* googly2002 - Head moderator\n* Iotados - Head moderator\n* misterblue28 - Moderator\n* ZIF - Moderator\n\n### Special Thanks\nA number of folks also provided miscellaneous assistance, so a special thanks goes to thanks to:\n* Maltrug - loads of Sphere Battles maps, Battle Royale map assistance\n* Cookies58 - Battle Royale map assistance\n* dmgdog - Battle Royale map assistance\n* domino - Website (wiki skin) development\n* Rohan McDermott - Website development\n* Jacob May - Promotional video composer\n\n...and everyone else who enjoyed the server through its run!\n\nThank you to everyone for all the memories.\n",[],[1299,986,42],"Pleuvior",[],[],25,{"SVG":1304,"PNG":1305},"timetobattle.svg","timetobattle.png",[1307,1309],{"key":778,"value":1308},"https://assets.william278.net/timetobattle-altenberg-castle.png",{"key":781,"value":1310},"Altenberg Castle on Time to Battle (2019-2022)",[1312,1315,1318,1321,1324,1327],{"url":1313,"description":1314},"timetobattle-altenberg-castle.png","Altenberg Castle",{"url":1316,"description":1317},"timetobattle-spawn.png","The survival spawn area",{"url":1319,"description":1320},"timetobattle-battle-bastion.png","The Battle Bastion",{"url":1322,"description":1323},"timetobattle-harrenhall.png","Harrenhall, by me",{"url":1325,"description":1326},"timetobattle-hub.png","The network hub",{"url":1328,"description":1329},"timetobattle-sphere-battles-nether.png","The Sphere Battles minigame",{"downloadCount":46,"averageRating":46,"numberOfRatings":46,"interactions":46,"onlinePlayers":46,"onlineServers":46},{"data":1332,"body":1333},{},{"type":1334,"children":1335},"root",[1336],{"type":1337,"tag":1338,"props":1339,"children":1340},"element","p",{},[1341],{"type":1342,"value":1343},"text","Welcome! — This site contains information and documentation for my various Minecraft plugins and game projects. I hope you can find what you need here, but if you have a question, feel free to reach out over Discord!",{"content":1345,"page":1423},[1346],{"slug":1347,"timestamp":1348,"category":1349,"imageUrl":928,"associatedProject":1350,"body":1421,"title":1422,"authorName":928,"authorAvatar":928,"versionUpdate":20},"husksync-3.8.7-released","2025-08-12T23:04:23.458878Z","changelogs",{"slug":213,"restricted":20,"releaseChannels":1351,"metadata":1352,"stats":928},[9,10],{"name":216,"tagline":217,"license":14,"tags":1353,"github":219,"pullReadmeFromGithub":20,"readmeBody":220,"links":1354,"maintainers":1359,"compatibleSoftware":1360,"suggestedRetailPrice":233,"linkedDiscordRole":234,"archived":7,"documentation":20,"documentationNav":1361,"listDownloads":20,"hidden":7,"sortWeight":62,"icons":1418,"properties":1419,"images":1420},[16,17,18],[1355,1356,1357,1358],{"id":24,"url":223},{"id":30,"url":225},{"id":227,"url":228},{"id":39,"url":230},[42],[24,44,45],[1362,1384,1396,1404],{"order":46,"name":50,"children":1363},[1364,1370,1378,1380],{"order":46,"url":53,"title":50,"icon":54,"children":1365},[1366,1368],{"order":46,"url":241,"title":242,"icon":59,"children":1367},[],{"order":62,"url":245,"title":246,"icon":247,"children":1369},[],{"order":62,"url":250,"title":64,"icon":65,"children":1371},[1372,1374,1376],{"order":46,"url":68,"title":69,"icon":70,"children":1373},[],{"order":62,"url":73,"title":74,"icon":75,"children":1375},[],{"order":78,"url":79,"title":80,"icon":81,"children":1377},[],{"order":78,"url":84,"title":85,"icon":86,"children":1379},[],{"order":89,"url":90,"title":91,"icon":92,"children":1381},[1382],{"order":46,"url":95,"title":96,"icon":97,"children":1383},[],{"order":62,"name":100,"children":1385},[1386,1388,1394],{"order":46,"url":103,"title":104,"icon":105,"children":1387},[],{"order":62,"url":269,"title":270,"icon":271,"children":1389},[1390,1392],{"order":46,"url":274,"title":275,"icon":276,"children":1391},[],{"order":62,"url":279,"title":280,"icon":281,"children":1393},[],{"order":78,"url":161,"title":284,"icon":163,"children":1395},[],{"order":78,"name":287,"children":1397},[1398,1400,1402],{"order":46,"url":290,"title":291,"icon":292,"children":1399},[],{"order":62,"url":295,"title":296,"icon":297,"children":1401},[],{"order":78,"url":300,"title":301,"icon":302,"children":1403},[],{"order":89,"name":177,"children":1405},[1406,1414,1416],{"order":46,"url":180,"title":307,"icon":182,"children":1407},[1408,1410,1412],{"order":46,"url":310,"title":311,"icon":312,"children":1409},[],{"order":62,"url":315,"title":316,"icon":317,"children":1411},[],{"order":78,"url":190,"title":191,"icon":192,"children":1413},[],{"order":62,"url":322,"title":323,"icon":182,"children":1415},[],{"order":78,"url":219,"title":195,"icon":196,"children":1417},[],{"SVG":328,"PNG":329,"PNG_TRANSPARENT":330,"SVG_TRANSPARENT":331},[],[],"**HuskSync 3.8.7** adds support for MC 1.21.8 and fixes bugs.\r\n\r\n* Minecraft 1.21.8 is now supported on Paper and Fabric in addition to 1.21.7\r\n* Fixed an issue that prevented stat syncing from working properly on Bukkit 1.21.7 (#537)\r\n* Fixed an issue related to data upgrades in NBT-API causing various problems, courtesy of @CatTeaA (#554)\r\n* Add more configuration options for Redis, courtesy of @NightSling (#564)\r\n\r\nTo update from 3.8.6, just drag+drop. Regen your config files to get the new Redis changes.","HuskSync v3.8.7 Released",{"size":62,"number":46,"totalElements":706,"totalPages":706},{"data":1425,"body":1426},{},{"type":1334,"children":1427},[1428],{"type":1337,"tag":1338,"props":1429,"children":1430},{},[1431,1437],{"type":1337,"tag":1432,"props":1433,"children":1434},"strong",{},[1435],{"type":1342,"value":1436},"HuskSync 3.8.7",{"type":1342,"value":1438}," adds support for MC 1.21.8 and fixes bugs.",["Reactive",1440],{"$snuxt-i18n-meta":1441,"$sauth":-1,"$sxsrf":-1},{},["Set"],["ShallowReactive",1444],{"user":1445,"projects":-1,"mdc--jtcuuh-key":-1,"$fwmDYNoY8QRLR4oNAo_jjAAFyOtx5jUCZMQdBdEjGEok":-1,"mdc-mn049c-key":-1},["NuxtError",1446],{"message":1447,"statusCode":1448,"statusMessage":1449,"data":1450},"[GET] \"https://api.william278.net/v1/users/@me\": 401 Unauthorized",401,"Unauthorized",{"error":1451},"You must be logged in to perform this action.","/"]