\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",[21,24,27],{"id":22,"url":23},"spigot","https://www.spigotmc.org/resources/husktowns.92672/",{"id":25,"url":26},"polymart","https://polymart.org/resource/husktowns.1056",{"id":28,"url":29},"builtbybit","https://builtbybit.com/resources/husktowns.34959/",[31],"William278",[22,33],"paper",9.99,"842728756384759828",false,[38,73,118],{"order":39,"name":40,"children":41},0,"Setup",[42,51],{"order":39,"url":43,"title":40,"icon":44,"children":45},"setup","fa6-solid:book",[46],{"order":39,"url":47,"title":48,"icon":49,"children":50},"legacy-migration","Legacy Migration","material-symbols:upgrade-rounded",[],{"order":52,"url":53,"title":54,"icon":55,"children":56},1,"config-files","Config","fa6-solid:file-code",[57,62,67],{"order":39,"url":58,"title":59,"icon":60,"children":61},"database","Database","fa6-solid:database",[],{"order":52,"url":63,"title":64,"icon":65,"children":66},"redis-support","Redis","devicon-plain:redis",[],{"order":68,"url":69,"title":70,"icon":71,"children":72},2,"translations","Locales","material-symbols:translate",[],{"order":52,"name":74,"children":75},"Features",[76,81,101,106,112],{"order":39,"url":77,"title":78,"icon":79,"children":80},"commands","Commands","octicon:command-palette-16",[],{"order":52,"url":82,"title":83,"icon":84,"children":85},"towns","Towns","fa-solid:city",[86,91,96],{"order":39,"url":87,"title":88,"icon":89,"children":90},"roles","Roles","eos-icons:role-binding",[],{"order":52,"url":92,"title":93,"icon":94,"children":95},"relations","Alliances & Enemies","ri:hearts-fill",[],{"order":68,"url":97,"title":98,"icon":99,"children":100},"wars","Wars","healthicons:war",[],{"order":68,"url":102,"title":103,"icon":104,"children":105},"claims","Claims","material-symbols:border-all-outline-rounded",[],{"order":107,"url":108,"title":109,"icon":110,"children":111},3,"inactive-town-pruning","Inactivity Pruning","icon-park-outline:sleep",[],{"order":113,"url":114,"title":115,"icon":116,"children":117},4,"hooks","Hooks","fa6-solid:plug",[],{"order":68,"name":119,"children":120},"Developers",[121,145,149],{"order":39,"url":122,"title":123,"icon":124,"children":125},"api","API v3","mdi:api",[126,130,135,140],{"order":39,"url":127,"title":128,"icon":84,"children":129},"towns-api","Towns API",[],{"order":52,"url":131,"title":132,"icon":133,"children":134},"claims-api","Claims API","mdi:cog-box",[],{"order":68,"url":136,"title":137,"icon":138,"children":139},"operations-api","Operations API","mdi:movie-open-cog",[],{"order":107,"url":141,"title":142,"icon":143,"children":144},"api-events","API Events","mingcute:lightning-line",[],{"order":52,"url":146,"title":147,"icon":124,"children":148},"api-v1","API v1 (legacy)",[],{"order":68,"url":18,"title":150,"icon":151,"children":152},"Source Code","fa6-solid:code",[],{"SVG":154,"PNG":155,"PNG_TRANSPARENT":156,"SVG_TRANSPARENT":157},"husktowns.svg","husktowns.png","husktowns-transparent.png","husktowns-transparent.svg",[],[],{"downloadCount":161,"averageRating":162,"numberOfRatings":163,"interactions":164,"onlinePlayers":39,"onlineServers":39},492,4.53125,16,82,{"data":166,"body":167},{},{"type":168,"children":169},"root",[170,195,200,207],{"type":171,"tag":172,"props":173,"children":174},"element","p",{},[175,178,185,187,193],{"type":176,"value":177},"text","HuskTowns provides several API events your plugin can listen to when players do certain town-related things. These events deal in HuskTowns class types, so you may want to familiarize yourself with the ",{"type":171,"tag":179,"props":180,"children":182},"a",{"href":181},"API",[183],{"type":176,"value":184},"API basics",{"type":176,"value":186}," first. Note that on cross-server setups, events only fire on the ",{"type":171,"tag":188,"props":189,"children":190},"em",{},[191],{"type":176,"value":192},"server the event occurred on",{"type":176,"value":194}," and will not fire as a result of API calls/updates.",{"type":171,"tag":172,"props":196,"children":197},{},[198],{"type":176,"value":199},"Consult the Javadocs for more information—and don't forget to register your listener when listening for these event calls.",{"type":171,"tag":201,"props":202,"children":204},"h2",{"id":203},"list-of-api-events",[205],{"type":176,"value":206},"List of API Events",{"type":171,"tag":208,"props":209,"children":210},"table",{},[211,241],{"type":171,"tag":212,"props":213,"children":214},"thead",{},[215],{"type":171,"tag":216,"props":217,"children":218},"tr",{},[219,225,231,236],{"type":171,"tag":220,"props":221,"children":222},"th",{},[223],{"type":176,"value":224},"Bukkit Event class",{"type":171,"tag":220,"props":226,"children":228},{"align":227},"center",[229],{"type":176,"value":230},"Since",{"type":171,"tag":220,"props":232,"children":233},{"align":227},[234],{"type":176,"value":235},"Cancellable",{"type":171,"tag":220,"props":237,"children":238},{},[239],{"type":176,"value":240},"Description",{"type":171,"tag":242,"props":243,"children":244},"tbody",{},[245,274,301,327,352,377,402,428,454,479,504,529,554,587],{"type":171,"tag":216,"props":246,"children":247},{},[248,259,264,269],{"type":171,"tag":249,"props":250,"children":251},"td",{},[252],{"type":171,"tag":253,"props":254,"children":256},"code",{"className":255},[],[257],{"type":176,"value":258},"TownCreateEvent",{"type":171,"tag":249,"props":260,"children":261},{"align":227},[262],{"type":176,"value":263},"1.8",{"type":171,"tag":249,"props":265,"children":266},{"align":227},[267],{"type":176,"value":268},"✅",{"type":171,"tag":249,"props":270,"children":271},{},[272],{"type":176,"value":273},"Called when a town is created",{"type":171,"tag":216,"props":275,"children":276},{},[277,286,291,296],{"type":171,"tag":249,"props":278,"children":279},{},[280],{"type":171,"tag":253,"props":281,"children":283},{"className":282},[],[284],{"type":176,"value":285},"PostTownCreateEvent",{"type":171,"tag":249,"props":287,"children":288},{"align":227},[289],{"type":176,"value":290},"2.6",{"type":171,"tag":249,"props":292,"children":293},{"align":227},[294],{"type":176,"value":295},"❌",{"type":171,"tag":249,"props":297,"children":298},{},[299],{"type":176,"value":300},"Called after a town is created",{"type":171,"tag":216,"props":302,"children":303},{},[304,313,318,322],{"type":171,"tag":249,"props":305,"children":306},{},[307],{"type":171,"tag":253,"props":308,"children":310},{"className":309},[],[311],{"type":176,"value":312},"TownUpdateEvent",{"type":171,"tag":249,"props":314,"children":315},{"align":227},[316],{"type":176,"value":317},"3.1.3",{"type":171,"tag":249,"props":319,"children":320},{"align":227},[321],{"type":176,"value":295},{"type":171,"tag":249,"props":323,"children":324},{},[325],{"type":176,"value":326},"Called when a town is updated",{"type":171,"tag":216,"props":328,"children":329},{},[330,339,343,347],{"type":171,"tag":249,"props":331,"children":332},{},[333],{"type":171,"tag":253,"props":334,"children":336},{"className":335},[],[337],{"type":176,"value":338},"TownDisbandEvent",{"type":171,"tag":249,"props":340,"children":341},{"align":227},[342],{"type":176,"value":263},{"type":171,"tag":249,"props":344,"children":345},{"align":227},[346],{"type":176,"value":268},{"type":171,"tag":249,"props":348,"children":349},{},[350],{"type":176,"value":351},"Called when a town is deleted",{"type":171,"tag":216,"props":353,"children":354},{},[355,364,368,372],{"type":171,"tag":249,"props":356,"children":357},{},[358],{"type":171,"tag":253,"props":359,"children":361},{"className":360},[],[362],{"type":176,"value":363},"ClaimEvent",{"type":171,"tag":249,"props":365,"children":366},{"align":227},[367],{"type":176,"value":263},{"type":171,"tag":249,"props":369,"children":370},{"align":227},[371],{"type":176,"value":268},{"type":171,"tag":249,"props":373,"children":374},{},[375],{"type":176,"value":376},"Called when a player claims a chunk for a town",{"type":171,"tag":216,"props":378,"children":379},{},[380,389,393,397],{"type":171,"tag":249,"props":381,"children":382},{},[383],{"type":171,"tag":253,"props":384,"children":386},{"className":385},[],[387],{"type":176,"value":388},"UnClaimEvent",{"type":171,"tag":249,"props":390,"children":391},{"align":227},[392],{"type":176,"value":263},{"type":171,"tag":249,"props":394,"children":395},{"align":227},[396],{"type":176,"value":268},{"type":171,"tag":249,"props":398,"children":399},{},[400],{"type":176,"value":401},"Called when a player deletes a claim",{"type":171,"tag":216,"props":403,"children":404},{},[405,414,419,423],{"type":171,"tag":249,"props":406,"children":407},{},[408],{"type":171,"tag":253,"props":409,"children":411},{"className":410},[],[412],{"type":176,"value":413},"UnClaimAllEvent",{"type":171,"tag":249,"props":415,"children":416},{"align":227},[417],{"type":176,"value":418},"2.1",{"type":171,"tag":249,"props":420,"children":421},{"align":227},[422],{"type":176,"value":268},{"type":171,"tag":249,"props":424,"children":425},{},[426],{"type":176,"value":427},"Called when a player deletes all of a town's claims",{"type":171,"tag":216,"props":429,"children":430},{},[431,440,445,449],{"type":171,"tag":249,"props":432,"children":433},{},[434],{"type":171,"tag":253,"props":435,"children":437},{"className":436},[],[438],{"type":176,"value":439},"PlayerEnterTownEvent",{"type":171,"tag":249,"props":441,"children":442},{"align":227},[443],{"type":176,"value":444},"2.0",{"type":171,"tag":249,"props":446,"children":447},{"align":227},[448],{"type":176,"value":268},{"type":171,"tag":249,"props":450,"children":451},{},[452],{"type":176,"value":453},"Called when a player walks into a town claim from wilderness or another town",{"type":171,"tag":216,"props":455,"children":456},{},[457,466,470,474],{"type":171,"tag":249,"props":458,"children":459},{},[460],{"type":171,"tag":253,"props":461,"children":463},{"className":462},[],[464],{"type":176,"value":465},"PlayerLeaveTownEvent",{"type":171,"tag":249,"props":467,"children":468},{"align":227},[469],{"type":176,"value":444},{"type":171,"tag":249,"props":471,"children":472},{"align":227},[473],{"type":176,"value":268},{"type":171,"tag":249,"props":475,"children":476},{},[477],{"type":176,"value":478},"Called when a player walks out of a town claim into wilderness or another town",{"type":171,"tag":216,"props":480,"children":481},{},[482,491,495,499],{"type":171,"tag":249,"props":483,"children":484},{},[485],{"type":171,"tag":253,"props":486,"children":488},{"className":487},[],[489],{"type":176,"value":490},"MemberJoinEvent",{"type":171,"tag":249,"props":492,"children":493},{"align":227},[494],{"type":176,"value":444},{"type":171,"tag":249,"props":496,"children":497},{"align":227},[498],{"type":176,"value":268},{"type":171,"tag":249,"props":500,"children":501},{},[502],{"type":176,"value":503},"Called when a player joins a town",{"type":171,"tag":216,"props":505,"children":506},{},[507,516,520,524],{"type":171,"tag":249,"props":508,"children":509},{},[510],{"type":171,"tag":253,"props":511,"children":513},{"className":512},[],[514],{"type":176,"value":515},"MemberLeaveEvent",{"type":171,"tag":249,"props":517,"children":518},{"align":227},[519],{"type":176,"value":444},{"type":171,"tag":249,"props":521,"children":522},{"align":227},[523],{"type":176,"value":268},{"type":171,"tag":249,"props":525,"children":526},{},[527],{"type":176,"value":528},"Called when a player leaves or is evicted from a town",{"type":171,"tag":216,"props":530,"children":531},{},[532,541,545,549],{"type":171,"tag":249,"props":533,"children":534},{},[535],{"type":171,"tag":253,"props":536,"children":538},{"className":537},[],[539],{"type":176,"value":540},"MemberRoleChangeEvent",{"type":171,"tag":249,"props":542,"children":543},{"align":227},[544],{"type":176,"value":444},{"type":171,"tag":249,"props":546,"children":547},{"align":227},[548],{"type":176,"value":268},{"type":171,"tag":249,"props":550,"children":551},{},[552],{"type":176,"value":553},"Called when a player is promoted or demoted within a town",{"type":171,"tag":216,"props":555,"children":556},{},[557,566,571,575],{"type":171,"tag":249,"props":558,"children":559},{},[560],{"type":171,"tag":253,"props":561,"children":563},{"className":562},[],[564],{"type":176,"value":565},"TownWarCreateEvent",{"type":171,"tag":249,"props":567,"children":568},{"align":227},[569],{"type":176,"value":570},"3.0.6",{"type":171,"tag":249,"props":572,"children":573},{"align":227},[574],{"type":176,"value":295},{"type":171,"tag":249,"props":576,"children":577},{},[578,580,585],{"type":176,"value":579},"Called when a ",{"type":171,"tag":179,"props":581,"children":582},{"href":98},[583],{"type":176,"value":584},"town war",{"type":176,"value":586}," starts",{"type":171,"tag":216,"props":588,"children":589},{},[590,599,603,607],{"type":171,"tag":249,"props":591,"children":592},{},[593],{"type":171,"tag":253,"props":594,"children":596},{"className":595},[],[597],{"type":176,"value":598},"TownWarEndEvent",{"type":171,"tag":249,"props":600,"children":601},{"align":227},[602],{"type":176,"value":570},{"type":171,"tag":249,"props":604,"children":605},{"align":227},[606],{"type":176,"value":295},{"type":171,"tag":249,"props":608,"children":609},{},[610,611,615],{"type":176,"value":579},{"type":171,"tag":179,"props":612,"children":613},{"href":98},[614],{"type":176,"value":584},{"type":176,"value":616}," ends",["Reactive",618],{"$snuxt-i18n-meta":619,"$sauth":-1,"$sxsrf":-1},{},["Set"],["ShallowReactive",622],{"$fOVQqbkKDBW2_5kdTPxds549I-7C3eysDmtAyEx2dK9c":-1,"user":623,"mdc-1aze5s-key":-1},["NuxtError",624],{"message":625,"statusCode":626,"statusMessage":627,"data":628},"[GET] \"https://api.william278.net/v1/users/@me\": 401 Unauthorized",401,"Unauthorized",{"error":629},"You must be logged in to perform this action.","/docs/husktowns/api-events"]