<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Recent changes to Key Features</title><link>https://sourceforge.net/p/griefprevention3d/wiki/Key%2520Features/</link><description>Recent changes to Key Features</description><atom:link href="https://sourceforge.net/p/griefprevention3d/wiki/Key%20Features/feed" rel="self"/><language>en</language><lastBuildDate>Thu, 02 Jul 2026 13:04:32 -0000</lastBuildDate><atom:link href="https://sourceforge.net/p/griefprevention3d/wiki/Key%20Features/feed" rel="self" type="application/rss+xml"/><item><title>Key Features modified by Jack Korte</title><link>https://sourceforge.net/p/griefprevention3d/wiki/Key%2520Features/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v7
+++ v8
@@ -12,6 +12,7 @@

 - [Visualization Glow](#visualization-glow)
 - [Unified Command Handler](#unified-command-handler)
 - [Wither Explosion Toggle](#wither-explosion-toggle)
+- [Per-Claim PvP Toggle](#per-claim-pvp-toggle)
 - [Minimum Distance Between Claims](#minimum-distance-between-claims)
 - [Neighbor Trust](#neighbor-trust)
 - [Claim Selection](#claim-selection)
@@ -187,6 +188,49 @@
     /witherexplosions

 Works the same way as `/claimexplosions` — stand in (or have selected) the claim, run the command. Gated by `griefprevention.witherexplosions` (default: `true`).
+
+---
+
+## Per-Claim PvP Toggle
+
+Toggle whether PvP is enabled inside a specific claim or subdivision.
+

+    /claimpvp &amp;lt;true|false&amp;gt; confirm
+
+Also available as `/claim pvp &amp;lt;true|false&amp;gt; confirm` through the unified command handler.
+
+### Configuration
+
+PvP toggling is disabled by default and can be enabled independently for main claims and subdivisions:
+
+    :::yaml
+    # config.yml
+    GriefPrevention:
+      Claims:
+        PvPToggle:
+          Claim:
+            Enabled: true
+            Price: 0.0
+          Subdivision:
+            Enabled: true
+            Price: 0.0
+            DefaultState: INHERIT
+
+- **`Claim.Enabled`**: Whether players can toggle PvP in top-level claims (default: `false`)
+- **`Claim.Price`**: Cost to toggle PvP in top-level claims (requires Vault, default: `0.0`)
+- **`Subdivision.Enabled`**: Whether players can toggle PvP in subdivisions (default: `false`)
+- **`Subdivision.Price`**: Cost to toggle PvP in subdivisions (requires Vault, default: `0.0`)
+- **`Subdivision.DefaultState`**: How new subdivisions inherit PvP state — `INHERIT` (from parent claim) or `DEFAULT` (uses the subdivision's own setting)
+
+### Usage
+
+1. Stand in (or have selected) the claim you want to modify.
+2. Run `/claimpvp true confirm` to enable PvP, or `/claimpvp false confirm` to disable it.
+3. If a price is configured, the command checks for Vault and withdraws the fee from your balance before applying the change.
+
+### Persistence
+
+The PvP state is persisted across server restarts in both flatfile and database storage.

 ---

&amp;lt;/true|false&amp;gt;&amp;lt;/true|false&amp;gt;&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jack Korte</dc:creator><pubDate>Thu, 02 Jul 2026 13:04:32 -0000</pubDate><guid>https://sourceforge.net5db8d3b467acb1bdc7884a9c529cfd670aa7c7f4</guid></item><item><title>Key Features modified by Jack Korte</title><link>https://sourceforge.net/p/griefprevention3d/wiki/Key%2520Features/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v6
+++ v7
@@ -6,6 +6,8 @@


 - [3D Subdivisions](#3d-subdivisions)
 - [Shaped Claims](#shaped-claims)
+- [Merge Claims](#merge-claims)
+- [Per-Player Locale](#per-player-locale)
 - [Nested Subclaims](#nested-subclaims)
 - [Visualization Glow](#visualization-glow)
 - [Unified Command Handler](#unified-command-handler)
@@ -61,6 +63,67 @@
 - Shaped-only helper behavior stays dormant and falls back to basic mode.

 See also: [Administrator's Guide](Administrator-Guide) for how shaped claims interact with admin tools.
+
+---
+
+## Merge Claims
+
+Merge two of your top-level claims into a single larger claim. The resulting claim captures both original areas plus everything in between.
+
+### Method 1 — `/mergeclaims` (Simple)
+
+1. Stand in the **first claim** and run `/mergeclaims`.
+2. Walk or fly to your **second claim**.
+3. Run `/mergeclaims` again or **right-click** with your golden shovel on the second claim.
+
+Both claims and the area between them are combined into one claim. Subdivisions from the second claim are moved into the merged claim automatically.
+
+### Method 2 — Shaped Path Merge
+
+While in shaped claims mode (`/shapedclaims`), you can reshape a claim so its boundary extends toward and overlaps another claim you own. The claims merge automatically, keeping the connecting path you shaped as part of the resulting claim.
+
+1. Enable shaped claims: `AllowShapedClaims: true` in config.yml.
+2. Run `/shapedclaims` to enter shaped mode.
+3. Extend a corridor or path from your first claim toward the second using the shaped editing tools.
+4. When the extension overlaps or touches the other claim, the merge happens automatically.
+
+The result is a single non-rectangular claim that includes both original rectangles plus the path you drew between them.
+
+### Limitations
+
+- Both claims must be in the same world.
+- Both claims must be owned by you (or you must have edit permission).
+- Only top-level claims can be merged (subdivisions are moved automatically).
+- Merged claims consume additional claim blocks for the area between them.
+- Overlapping another player's claim blocks the merge and shows a conflict zone.
+
+### Command
+

+    /mergeclaims
+    /mergeclaim
+
+Permission: `griefprevention.mergeclaims` (default: `true`).
+
+---
+
+## Per-Player Locale
+
+GriefPrevention3D can send messages in the player's own language based on their Minecraft client locale — no administrator effort required.
+
+    :::yaml
+    # config.yml
+    GriefPrevention:
+      PerPlayerLocale: true   # enabled by default
+
+When enabled:
+- Players with a **Spanish** client locale (`es_*`) receive Spanish messages.
+- Players with a **Portuguese** client locale (`pt_*`) receive Brazilian Portuguese messages.
+- Players with any other locale (including English) receive messages in the server's configured language (`GriefPrevention.Locale`, default `en`).
+- Console output always uses the server's configured language.
+
+No additional locale files need to be copied — the plugin bundles all supported translations. Disable with `PerPlayerLocale: false` to revert to the old behavior where every player sees the same language.
+
+See [Locale](Locale) for details on configuring locale files and the full language setup.

 ---

@@ -243,4 +306,5 @@

 - **`/expandclaim` on shaped segments** operates on the segmented subsection rather than the whole side, when a shift-click segment marker exists.
 - **Selected-claim commands**: resize-oriented command variants respect the current selection context instead of only the player's block position.
 - **Temporary basic-mode segment previews**: shift-clicking a claim boundary in basic claims mode creates a temporary segment preview for convenience. These previews do not persist across visualization refreshes and disappear if the player does nothing with them. Only deliberate `/shapedclaim` shift-click segmentation persists to the claim.
+- **Per-Player Locale**: Enabled by default (`PerPlayerLocale: true`). Players with a Spanish or Portuguese client locale receive messages in their language automatically, while others use the server's configured locale. See [Per-Player Locale](#per-player-locale).
 - **Older-version compatibility fixes** shipped for `COPPER_GOLEM_STATUES`, `CHAINS`, and chain-material lookups.
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jack Korte</dc:creator><pubDate>Thu, 02 Jul 2026 13:04:32 -0000</pubDate><guid>https://sourceforge.net2f6a86d770550cbb7c733a091d5553a070912d16</guid></item><item><title>Key Features modified by Jack Korte</title><link>https://sourceforge.net/p/griefprevention3d/wiki/Key%2520Features/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v5
+++ v6
@@ -1,1341 +1,3 @@
-
-# Release work
-!wiki/
-.release/old/
-.modrinth/
-

-  [View Docs](https://github.com/castledking/GriefPrevention3D/blob/master/src/main/resources/alias.yml)
-
-- **Neighbor Trust &amp;amp; Minimum Distance**
-  ```
-  GriefPrevention:
-    Claims:
-      MinimumDistance: 0
-  ```
-  Enforce a minimum distance between top-level claims to prevent claim spam and overcrowding. When set, players cannot create claims within the configured distance of another player's claim.
-  - `/claim trust &amp;lt;player&amp;gt; neighbor` — Grant a player neighbor trust so they can bypass minimum distance checks for your claims.
-  - `/neighbortrust &amp;lt;player&amp;gt;` (alias: `/distancetrust &amp;lt;player&amp;gt;`) — Standalone command for the same purpose.
-  - `/claim distance check` — Show the configured minimum distance and list nearby claims.
-  - `/claim distance toggle` — While standing in your own claim, toggle whether ALL players can bypass minimum distance for that claim.
-  - Existing nearby claims auto-grant neighbor trust to each other, cleaned up automatically when claims are abandoned.
-
-- **Wither Explosion Toggle**
-  `/witherexplosions`
-  Use this command to toggle wither explosions inside your claim.
-                || cmd.getName().equalsIgnoreCase("expandclaim")
-                || cmd.getName().equalsIgnoreCase("resizeclaim")) &amp;amp;&amp;amp; player != null) {
-            if (!player.hasPermission("griefprevention.extendclaim")) {
-                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
-                return true;
-            }
-            return this.handleExtendClaimCommand(player, args);
-        }
-
-        // abandonclaim
-        if (cmd.getName().equalsIgnoreCase("abandonclaim") &amp;amp;&amp;amp; player != null) {
-            if (!player.hasPermission("griefprevention.abandonclaim")) {
-                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
-                return true;
-            }
-            return this.abandonClaimHandler(player, false);
-        }
-
-        // abandontoplevelclaim
-        if (cmd.getName().equalsIgnoreCase("abandontoplevelclaim") &amp;amp;&amp;amp; player != null) {
-            if (!player.hasPermission("griefprevention.abandontoplevelclaim")) {
-                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
-                return true;
-            }
-            return this.abandonClaimHandler(player, true);
-        }
-
-        // abandonallclaims
-        else if (cmd.getName().equalsIgnoreCase("abandonallclaims") &amp;amp;&amp;amp; player != null) {
-            if (!player.hasPermission("griefprevention.abandonallclaims")) {
-                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
-                return true;
-            }
-            if (args.length &amp;gt; 1)
-                return false;
-
-        // trust &amp;lt;player&amp;gt;
-        else if (cmd.getName().equalsIgnoreCase("trust") &amp;amp;&amp;amp; player != null) {
-            if (!player.hasPermission("griefprevention.trust")) {
-                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
-                return true;
-            }
-            // requires exactly one parameter, the other player's name
-            if (args.length != 1)
-                return false;
-        // untrust &amp;lt;player&amp;gt; or untrust [&amp;lt;group&amp;gt;]
-        else if (cmd.getName().equalsIgnoreCase("untrust") &amp;amp;&amp;amp; player != null) {
-            if (!player.hasPermission("griefprevention.untrust")) {
-                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
-                return true;
-            }
-            // requires exactly one parameter, the other player's name
-            if (args.length != 1)
-                return false;
-        // accesstrust &amp;lt;player&amp;gt;
-        else if (cmd.getName().equalsIgnoreCase("accesstrust") &amp;amp;&amp;amp; player != null) {
-            if (!player.hasPermission("griefprevention.accesstrust")) {
-                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
-                return true;
-            }
-            // requires exactly one parameter, the other player's name
-            if (args.length != 1)
-                return false;
-        // containertrust &amp;lt;player&amp;gt;
-        else if (cmd.getName().equalsIgnoreCase("containertrust") &amp;amp;&amp;amp; player != null) {
-            if (!player.hasPermission("griefprevention.containertrust")) {
-                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
-                return true;
-            }
-            // requires exactly one parameter, the other player's name
-            if (args.length != 1)
-                return false;
-        // permissiontrust &amp;lt;player&amp;gt;
-        else if (cmd.getName().equalsIgnoreCase("permissiontrust") &amp;amp;&amp;amp; player != null) {
-            if (!player.hasPermission("griefprevention.permissiontrust")) {
-                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
-                return true;
-            }
-            // requires exactly one parameter, the other player's name
-            if (args.length != 1) return false;
-
-        // restrictsubclaim
-        else if (cmd.getName().equalsIgnoreCase("restrictsubclaim") &amp;amp;&amp;amp; player != null) {
-            if (!player.hasPermission("griefprevention.restrictsubclaim")) {
-                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
-                return true;
-            }
-            return this.handleRestrictSubclaimCommand(player, new String[]{});
-        }
-
-        // basicclaims
-        else if (cmd.getName().equalsIgnoreCase("basicclaims") &amp;amp;&amp;amp; player != null) {
-            if (!player.hasPermission("griefprevention.basicclaims")) {
-                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
-                return true;
-            }
-            PlayerData playerData = this.dataStore.getPlayerData(player.getUniqueId());
-            playerData.shovelMode = ShovelMode.Basic;
-            playerData.claimSubdividing = null;
-        // subdivideclaims
-        else if (cmd.getName().equalsIgnoreCase("subdivideclaims") &amp;amp;&amp;amp; player != null) {
-            if (!player.hasPermission("griefprevention.subdivideclaims")) {
-                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
-                return true;
-            }
-            PlayerData playerData = this.dataStore.getPlayerData(player.getUniqueId());
-            playerData.shovelMode = ShovelMode.Subdivide;
-            playerData.claimSubdividing = null;
-            return true;
-        } else if (cmd.getName().equalsIgnoreCase("claimexplosions") &amp;amp;&amp;amp; player != null) {
-            if (!player.hasPermission("griefprevention.claimexplosions")) {
-                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
-                return true;
-            }
-            return this.handleClaimExplosionsCommand(sender, args);
-        } else if (cmd.getName().equalsIgnoreCase("witherexplosions") &amp;amp;&amp;amp; player != null) {
-            if (!player.hasPermission("griefprevention.witherexplosions")) {
-                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
-                return true;
-            }
-            return this.handleWitherExplosionsCommand(sender, args);
-        }
-
-        // neighbortrust &amp;lt;player&amp;gt;
-        else if (cmd.getName().equalsIgnoreCase("neighbortrust") &amp;amp;&amp;amp; player != null) {
-            if (!player.hasPermission("griefprevention.neighbortrust")) {
-                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
-                return true;
-            }
-            if (args.length != 1)
-                return false;
-            return this.handleNeighborTrustCommand(sender, args);
-        // checkclaimdistance
-        else if (cmd.getName().equalsIgnoreCase("checkclaimdistance") &amp;amp;&amp;amp; player != null) {
-            if (!player.hasPermission("griefprevention.checkclaimdistance")) {
-                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
-                return true;
-            }
-            return this.handleCheckClaimDistanceCommand(sender, args);
-        }
-
-        // toggleclaimdistance
-        else if (cmd.getName().equalsIgnoreCase("toggleclaimdistance") &amp;amp;&amp;amp; player != null) {
-            if (!player.hasPermission("griefprevention.toggleclaimdistance")) {
-                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
-                return true;
-            }
-            return this.handleToggleClaimDistanceCommand(sender, args);
-        }
-
-        // givepet
-        else if (cmd.getName().equalsIgnoreCase("givepet") &amp;amp;&amp;amp; player != null) {
-            if (!player.hasPermission("griefprevention.givepet")) {
-                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
-                return true;
-            }
-            //requires one parameter
-            if (args.length &amp;lt; 1) return false;
-
-        // ignoreplayer
-        else if (cmd.getName().equalsIgnoreCase("ignoreplayer") &amp;amp;&amp;amp; player != null) {
-            if (!player.hasPermission("griefprevention.ignore")) {
-                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
-                return true;
-            }
-            // requires target player name
-            if (args.length &amp;lt; 1)
-                return false;
-        // unignoreplayer
-        else if (cmd.getName().equalsIgnoreCase("unignoreplayer") &amp;amp;&amp;amp; player != null) {
-            if (!player.hasPermission("griefprevention.ignore")) {
-                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
-                return true;
-            }
-            // requires target player name
-            if (args.length &amp;lt; 1)
-                return false;
-        // ignoredplayerlist
-        else if (cmd.getName().equalsIgnoreCase("ignoredplayerlist") &amp;amp;&amp;amp; player != null) {
-            if (!player.hasPermission("griefprevention.ignore")) {
-                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
-                return true;
-            }
-            PlayerData playerData = this.dataStore.getPlayerData(player.getUniqueId());
-            StringBuilder builder = new StringBuilder();
-            for (Entry&amp;lt;uuid, boolean=""&amp;gt; entry : playerData.ignoredPlayers.entrySet()) {
-
-    public boolean handleClaimsListCommand(CommandSender sender, String[] args) {
-        if (!(sender instanceof Player))
-            return false;
-        Player player = (Player) sender;
-        if (!player.hasPermission("griefprevention.claimslist")) {
-            GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
-            return true;
-        }
-
-        OfflinePlayer otherPlayer = player;
-        if (args.length &amp;gt; 0 &amp;amp;&amp;amp; player.hasPermission("griefprevention.claimslistother")) {
-                    return true;
-                }
-                if (!player.hasPermission("griefprevention.3dsubdivideclaims")) {
-                    GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
-                    return true;
-                }
-            return false;
-        Player player = (Player) sender;
-        if (!player.hasPermission("griefprevention.unlockdrops")) {
-            GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
-            return true;
-        }
-
-        PlayerData playerData = this.dataStore.getPlayerData(player.getUniqueId());
-
-            return false;
-        Player player = (Player) sender;
-        if (!player.hasPermission("griefprevention.trapped")) {
-            GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
-            return true;
-        }
-
-        PlayerData playerData = this.dataStore.getPlayerData(player.getUniqueId());
-        Claim claim = this.dataStore.getClaimAt(player.getLocation(), false, playerData.lastClaim);
-&lt;p align="center"&gt;
-&lt;img alt="GriefPrevention3D" height="auto" rel="nofollow" src="https://repository-images.githubusercontent.com/1022939485/98eef4fa-4d0c-47c8-83f6-78f2e2112927" width="100%"/&gt;
-&lt;/p&gt;
-
-# &lt;p align="center"&gt;The self-service anti-griefing plugin for Minecraft servers — now with full 3D subdivisions&lt;/p&gt;
-
-&lt;p align="center"&gt;
-  &lt;a href="https://discord.com/invite/pCKdCX6nYr" rel="nofollow"&gt;&lt;img alt="Discord" rel="nofollow" src="https://img.shields.io/badge/Discord-Community-5865F2?style=for-the-badge&amp;amp;logo=discord&amp;amp;logoColor=white"/&gt;&lt;/a&gt;
-  &lt;a href="https://github.com/castledking/GriefPrevention3D" rel="nofollow"&gt;&lt;img alt="GitHub Repository" rel="nofollow" src="https://img.shields.io/badge/GitHub-Repository-181717?style=for-the-badge&amp;amp;logo=github"/&gt;&lt;/a&gt;
-  &lt;a href="https://github.com/castledking/GriefPrevention3D/issues" rel="nofollow"&gt;&lt;img alt="GitHub Issues" rel="nofollow" src="https://img.shields.io/badge/GitHub-Issues-181717?style=for-the-badge&amp;amp;logo=github"/&gt;&lt;/a&gt;
-  &lt;a href="https://github.com/castledking/GriefPrevention3D/wiki" rel="nofollow"&gt;&lt;img alt="GitHub Wiki" rel="nofollow" src="https://img.shields.io/badge/GitHub-Wiki-181717?style=for-the-badge&amp;amp;logo=github"/&gt;&lt;/a&gt;
-&lt;/p&gt;
-
-Stop _responding_ to grief and prevent it instead. GriefPrevention stops grief before it starts automatically without any effort from administrators, and with very little (self service) effort from players.
-
-**GriefPrevention3D** is a fork of the popular **GriefPrevention** plugin that adds full 3D subdivision support to land claims. Players can now create subdivisions with precise height boundaries for more complex builds.
-
-##### [Watch this video](https://www.youtube.com/watch?v=hKrA6NXn7Sc) to learn more how GriefPrevention works in-game.
-[![GriefPrevention Youtube Tutorial](https://img.youtube.com/vi/hKrA6NXn7Sc/0.jpg)](https://www.youtube.com/watch?v=hKrA6NXn7Sc)
-
----
-
-## Key Features
-
-- **3D Subdivisions**
-  Create subdivisions with exact Y-level boundaries.
-  `/3dsubdivideclaims`
-  Use this command to switch to 3D subdivision mode.
-
-- **3D Admin Claims**
-  Create free, height-bounded administrative claims with exact Y coordinates.
-  `/3dadminclaims`
-  Use this command or `/aclaim mode admin3d` to switch to 3D admin claim mode.
-  Requires the `griefprevention.adminclaims` permission.
-
-- **Shaped Claims**
-  ```
-  AllowShapedClaims: false
-  ```
-  Set to **true** to enable non-rectangular claims.
-  `/shapedclaims`
-  Use this command to switch to the shaped claims mode.
-
-- **Nested Subclaims**
-  ```
-  AllowNestedSubClaims: false
-  ```
-  Set to **true** to allow subdivisions inside other subdivisions.
-
-- **Visualization Glow**
-  ```
-  VisualizationGlow: false
-  ```
-  Set to **true** to enable glowing claim boundary visualization. (Requires 1.19.3+)
-
-- **Unified Command Handler**
-  In **GriefPreventionData/alias.yml**:
-  ```
-  enabled: true
-  ```
-  Provides unified commands like:
-  `/claim create`
-  `/claim trust`
-  `/claim abandon`
-  [View Docs](https://github.com/castledking/GriefPrevention3D/blob/master/src/main/resources/alias.yml)
-
-- **Neighbor Trust &amp;amp; Minimum Distance**
-  ```
-  GriefPrevention:
-    Claims:
-      MinimumDistance: 0
-  ```
-  Enforce a minimum distance between top-level claims to prevent claim spam and overcrowding. When set, players cannot create claims within the configured distance of another player's claim.
-  - `/claim trust &amp;lt;player&amp;gt; neighbor` — Grant a player neighbor trust so they can bypass minimum distance checks for your claims.
-  - `/neighbortrust &amp;lt;player&amp;gt;` (alias: `/distancetrust &amp;lt;player&amp;gt;`) — Standalone command for the same purpose.
-  - `/claim distance check` — Show the configured minimum distance and list nearby claims.
-  - `/claim distance toggle` — While standing in your own claim, toggle whether ALL players can bypass minimum distance for that claim.
-  - Existing nearby claims auto-grant neighbor trust to each other, cleaned up automatically when claims are abandoned.
-
-- **Wither Explosion Toggle**
-  `/witherexplosions`
-  Use this command to toggle wither explosions inside your claim.
-
-- **Subtle Changes**
-  - Resizing a claim now selects it and is accessible using common commands like `/claim abandon` or `/claim trust` during that resize session
-  - `/restrictsubclaim` while standing in main claims now instantly restricts all subdivisions inside
-  - `/trustlist` now shows inherited permissions
-  - Split the `griefprevention.eavesdrop` permission to `griefprevention.eavesdrop.pm` &amp;amp; `griefprevention.eavesdrop.softmute` for more granular permission control
-  - Various bug fixes and quality-of-life improvements
-  - Full compatibility with original GriefPrevention features
-  - Works with Spigot, Paper, Purpur, and Folia
-  - Maintains all anti-grief protections
-
-## Supported Platforms: Spigot, Paper, Purpur, and Folia.
-### GriefPrevention3D targets and supports 1.8 - latest available version of these platforms.
-
-## Download
-### [⬇ Download the GriefPrevention3D.jar plugin here.](https://github.com/castledking/GriefPrevention3D/releases)
-
-## Documentation
-For usage instructions, see the official [GriefPrevention3D Documentation](https://github.com/castledking/GriefPrevention3D/wiki).
-
-
-## Addons
-### [Addons](https://r.griefprevention.com/addons) provide additional features to GriefPrevention. Some of these addons are listed in [GitHub Discussions](https://r.griefprevention.com/addons)
-
-## Support
-- [📖 Documentation](https://github.com/castledking/GriefPrevention3D/wiki) - Learn how GriefPrevention3D works. Contains answers to most questions.
-- [Issue Tracker](https://github.com/castledking/GriefPrevention3D/issues) - Report problems or bugs on the issue tracker. Check if someone else reported your issue before posting.
-- [GitHub Discussions](https://github.com/castledking/GriefPrevention3D/discussions) - New ideas, feature requests, or other general discussions.
-- [Discord Community](https://discord.com/invite/pCKdCX6nYr)
-
-## Original Plugin
-This is a fork of [GriefPrevention](https://www.spigotmc.org/resources/griefprevention.1884/) by RoboMWM.
-
----
-
-[![Weird flex but ok](https://bstats.org/signatures/bukkit/GriefPrevention-legacy.svg)](https://bstats.org/plugin/bukkit/GriefPrevention-legacy)
-
-# API Documentation
-
-Documentation for developers working with the GriefPrevention3D API. Please feel free to help add to this page.
-
-## Table of Contents
-
-- [Adding GriefPrevention3D as a Dependency](#adding-griefprevention3d-as-a-dependency)
-- [Common Operations](#common-operations)
-  - [Getting the Claim at a Location](#getting-the-claim-at-a-location)
-  - [Managing Permissions in a Claim](#managing-permissions-in-a-claim)
-  - [Creating a New Claim](#creating-a-new-claim)
-  - [Resizing or Moving a Claim](#resizing-or-moving-a-claim)
-  - [Extending a Claim Downward](#extending-a-claim-downward)
-  - [Changing a Claim's Owner](#changing-a-claims-owner)
-  - [Uniquely Identifying a Claim](#uniquely-identifying-a-claim)
-  - [Getting / Updating Player Data](#getting--updating-player-data)
-- [3D Subdivisions API](#3d-subdivisions-api)
-  - [World Y Boundaries](#world-y-boundaries)
-  - [Claim Y Boundaries](#claim-y-boundaries)
-  - [Detailed Claim Y Information (`ClaimYInfo`)](#detailed-claim-y-information-claimyinfo)
-  - [Checking Y Containment](#checking-y-containment)
-- [Command Addon API](#command-addon-api)
-  - [`ClaimCommandAddon` Interface](#claimcommandaddon-interface)
-  - [`ClaimCommandContext`](#claimcommandcontext)
-  - [Registering Your Addon](#registering-your-addon)
-  - [Full Example](#full-example)
-- [Events](#events)
-
----
-
-## Adding GriefPrevention3D as a Dependency
-
-GriefPrevention3D is hosted on JitPack, which exposes the repo as a public Maven artifact on demand.
-
-### Maven
-
-    :::xml
-    &amp;lt;repositories&amp;gt;
-        &amp;lt;repository&amp;gt;
-            &amp;lt;id&amp;gt;jitpack.io&amp;lt;/id&amp;gt;
-            &amp;lt;url&amp;gt;https://jitpack.io&amp;lt;/url&amp;gt;
-        &amp;lt;/repository&amp;gt;
-    &amp;lt;/repositories&amp;gt;
-    
-    &amp;lt;dependency&amp;gt;
-        &amp;lt;groupid&amp;gt;com.github.castledking&amp;lt;/groupid&amp;gt;
-        &amp;lt;artifactid&amp;gt;GriefPrevention3D&amp;lt;/artifactid&amp;gt;
-        &amp;lt;version&amp;gt;17.3.6&amp;lt;/version&amp;gt;
-        &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
-    &amp;lt;/dependency&amp;gt;
-
-&amp;gt; Replace `17.3.6` with the release tag you want to build against, or with a short commit hash for snapshot-style builds. See the JitPack page for the full list of buildable versions.
-
-### Gradle (Groovy)
-
-    :::groovy
-    repositories {
-        maven { url 'https://jitpack.io' }
-    }
-    
-    dependencies {
-        compileOnly 'com.github.castledking:GriefPrevention3D:17.3.6'
-    }
-
-### Gradle (Kotlin DSL)
-
-    :::kotlin
-    repositories {
-        maven("https://jitpack.io")
-    }
-    
-    dependencies {
-        compileOnly("com.github.castledking:GriefPrevention3D:17.3.6")
-    }
-
-### SBT / Leiningen
-
-See the JitPack page for the project: `https://jitpack.io/#castledking/GriefPrevention3D/`
-
-### plugin.yml
-
-Always declare `GriefPrevention` as either a `depend` or `softdepend` in your addon's `plugin.yml`:
-
-    :::yaml
-    softdepend: [GriefPrevention]
-
-Use `depend` only if your plugin cannot load without it.
-
----
-
-## Common Operations
-
-&amp;gt; These operations all exist on upstream GriefPrevention too, and work the same way on GP3D. The notable GP3D-specific additions are the 3D subdivision API below.
-
-### Getting the Claim at a Location
-
-    :::java
-    import me.ryanhamshire.GriefPrevention.Claim;
-    import me.ryanhamshire.GriefPrevention.GriefPrevention;
-    
-    Claim claim = GriefPrevention.instance.dataStore.getClaimAt(
-            location,
-            /* ignoreHeight = */ false,
-            /* cachedClaim = */ null);
-
-- `ignoreHeight = false` makes Y matter (needed for 3D subdivisions).
-- Pass a previously-returned `Claim` as `cachedClaim` to speed up repeated lookups in the same area.
-- Returns `null` if the location is in wilderness.
-
-### Managing Permissions in a Claim
-
-Permissions are expressed as `ClaimPermission` values:
-
-    :::java
-    import me.ryanhamshire.GriefPrevention.ClaimPermission;
-    import java.util.function.Supplier;
-    
-    Supplier&amp;lt;string&amp;gt; denialReason = claim.checkPermission(player, ClaimPermission.Build, event);
-    if (denialReason != null) {
-        player.sendMessage(denialReason.get());
-        event.setCancelled(true);
-    }
-
-`ClaimPermission.Edit &amp;gt; Manage &amp;gt; Build &amp;gt; Container &amp;gt; Access` — higher levels grant all lower levels.
-
-For unified location-based permission checks (the same logic GriefPrevention uses internally), prefer:
-
-    :::java
-    import com.griefprevention.protection.ProtectionHelper;
-    
-    Supplier&amp;lt;string&amp;gt; denial = ProtectionHelper.checkPermission(
-            player, location, ClaimPermission.Build, event);
-
-### Creating a New Claim
-
-    :::java
-    GriefPrevention.instance.dataStore.createClaim(
-            world,
-            x1, z1, x2, z2,              // corners
-            minY, maxY,                  // Y bounds (use world min/max for 2D)
-            ownerUuid,                   // null for admin claims
-            /* parent = */ null,
-            /* id = */ null,
-            /* creatingPlayer = */ player);
-
-Use `parent = someTopLevelClaim` to create a subdivision. Pass `id = null` to let the data store assign one.
-
-### Resizing or Moving a Claim
-
-    :::java
-    GriefPrevention.instance.dataStore.resizeClaim(
-            claim,
-            newX1, newZ1, newX2, newZ2,
-            newMinY, newMaxY,
-            resizingPlayer);
-
-Claim-block math is applied automatically for the owner.
-
-### Extending a Claim Downward
-
-    :::java
-    GriefPrevention.instance.dataStore.extendClaim(claim, newMinY);
-
-Useful for plugins that want to auto-extend a claim when players build below it.
-
-### Changing a Claim's Owner
-
-    :::java
-    GriefPrevention.instance.dataStore.changeClaimOwner(claim, newOwnerUuid);
-
-Pass `null` as the new owner to convert the claim to an administrative claim.
-
-### Uniquely Identifying a Claim
-
-    :::java
-    Long id = claim.getID();
-    Claim sameClaim = GriefPrevention.instance.dataStore.getClaim(id);
-
-Claim IDs are stable across reloads.
-
-### Getting / Updating Player Data
-
-    :::java
-    import me.ryanhamshire.GriefPrevention.PlayerData;
-    
-    PlayerData data = GriefPrevention.instance.dataStore.getPlayerData(player.getUniqueId());
-    int total = data.getAccruedClaimBlocks() + data.getBonusClaimBlocks();
-    
-    // Save after changes:
-    GriefPrevention.instance.dataStore.savePlayerData(player.getUniqueId(), data);
-
----
-
-## 3D Subdivisions API
-
-GP3D extends the `Claim` object with Y-aware accessors so addons can query vertical boundaries uniformly, whether the claim is a full-height 2D claim or a Y-bounded 3D subdivision.
-
-### World Y Boundaries
-
-    :::java
-    int minY = GriefPrevention.getWorldMinY(world);  // e.g., -64 in 1.18+
-    int maxY = GriefPrevention.getWorldMaxY(world);  // e.g., 320 in 1.21
-
-These exist so you don't have to care about the 1.17→1.18 world-height change.
-
-### Claim Y Boundaries
-
-    :::java
-    int minY   = claim.getMinY();       // lowest Y the claim protects
-    int maxY   = claim.getMaxY();       // highest Y the claim protects
-    int height = claim.getYHeight();    // maxY - minY, in blocks
-    boolean is3D = claim.is3D();        // true if this claim has custom Y bounds
-    boolean inside = claim.containsY(y);
-
-Behavior by claim type:
-
-| Claim type | Y range |
-|---|---|
-| Top-level (basic) claim | Full world min → max Y |
-| Admin claim | Full world min → max Y |
-| 2D subdivision | Inherits parent's (world) Y range |
-| **3D subdivision** | **Own defined Y bounds** |
-
-### Detailed Claim Y Information (`ClaimYInfo`)
-
-For a richer description of the claim's Y shape, use `ClaimYInfo`:
-
-    :::java
-    Claim.ClaimYInfo yInfo = claim.getYInfo();
-    
-    yInfo.getMinY();       // int
-    yInfo.getMaxY();       // int
-    yInfo.getHeight();     // int
-    yInfo.is3D();          // boolean
-    yInfo.isSubdivision(); // boolean, true if this has a parent
-    yInfo.isAdminClaim();  // boolean
-    yInfo.getClaimType();  // human-readable, e.g. "3D Subdivision"
-
-`getClaimType()` returns one of:
-
-- `"Main Claim"`
-- `"Admin Claim"`
-- `"2D Subdivision"`
-- `"3D Subdivision"`
-- `"Admin 2D Subdivision"`
-- `"Admin 3D Subdivision"`
-
-`toString()` is implemented for quick debugging:
-
-    ClaimYInfo{type=3D Subdivision, minY=60, maxY=80, height=21}
-
-### Checking Y Containment
-
-    :::java
-    if (claim.containsY(block.getY())) {
-        // y is inside this claim's vertical range
-    }
-
-For non-3D claims this always returns `true`. For 3D claims it enforces the actual Y bounds.
-
----
-
-## Command Addon API
-
-GP3D exposes a narrow addon seam that lets other plugins extend `/claim` and `/aclaim` tab completions and add their own subcommands — without having to fight the core for command ownership.
-
-The relevant classes live in `com.griefprevention.api`:
-
-- `ClaimCommandAddon` — the interface your addon implements.
-- `ClaimCommandAddonRegistry` — static entry point for registering addons.
-- `ClaimCommandContext` — the command-execution context passed to your handler.
-
-### `ClaimCommandAddon` Interface
-
-    :::java
-    package com.griefprevention.api;
-    
-    public interface ClaimCommandAddon {
-    
-        /**
-         * Additional tab completions for a known subcommand.
-         * Merged additively with GP3D's native completions.
-         */
-        List&amp;lt;string&amp;gt; getTabCompletions(
-                CommandSender sender,
-                String rootCommand,  // "claim" or "aclaim"
-                String subcommand,   // canonical name, e.g. "trust"
-                String[] args);      // args AFTER the subcommand
-    
-        /**
-         * Additional subcommand names shown when the user types just `/claim `.
-         * Use this to surface addon-provided subcommands in tab completion.
-         */
-        default List&amp;lt;string&amp;gt; getSubcommandCompletions(
-                CommandSender sender, String rootCommand) {
-            return List.of();
-        }
-    
-        /**
-         * Handle an addon-defined subcommand.
-         * Only called if GP3D does NOT already own the subcommand — core always wins.
-         *
-         * @return true if your addon handled the command; false to fall through.
-         */
-        default boolean handleSubcommand(ClaimCommandContext context) {
-            return false;
-        }
-    }
-
-### `ClaimCommandContext`
-
-Passed to `handleSubcommand`. Provides:
-
-    :::java
-    context.getSender();                  // CommandSender (usually Player)
-    context.getRootCommand();             // "claim" or "aclaim"
-    context.getSubcommand();              // the subcommand the user typed
-    context.getArgs();                    // args AFTER the subcommand (defensive copy)
-    context.getSelectedOrCurrentClaim();  // @Nullable Claim — selected claim or the
-                                          //                  claim the player is standing in
-
-`getSelectedOrCurrentClaim()` is the key piece — GP3D has already done the "selected claim, fallback to current claim" resolution for you, so your addon can just operate on that claim if it's non-null.
-
-### Registering Your Addon
-
-    :::java
-    import com.griefprevention.api.ClaimCommandAddonRegistry;
-    
-    public final class MyAddon extends JavaPlugin {
-    
-        private final MyClaimAddon hook = new MyClaimAddon();
-    
-        @Override
-        public void onEnable() {
-            ClaimCommandAddonRegistry.register(hook);
-        }
-    
-        @Override
-        public void onDisable() {
-            ClaimCommandAddonRegistry.unregister(hook);
-        }
-    }
-
-`register()` is idempotent — registering the same instance twice is a no-op. Always `unregister()` on disable to keep reloads clean.
-
-### Full Example
-
-A minimal `/claim sell &amp;lt;price&amp;gt;` addon:
-
-    :::java
-    import com.griefprevention.api.ClaimCommandAddon;
-    import com.griefprevention.api.ClaimCommandAddonRegistry;
-    import com.griefprevention.api.ClaimCommandContext;
-    import me.ryanhamshire.GriefPrevention.Claim;
-    import org.bukkit.ChatColor;
-    import org.bukkit.command.CommandSender;
-    import org.bukkit.entity.Player;
-    
-    import java.util.List;
-    import java.util.Objects;
-    
-    public final class SellClaimAddon implements ClaimCommandAddon {
-    
-        @Override
-        public List&amp;lt;string&amp;gt; getSubcommandCompletions(CommandSender sender, String rootCommand) {
-            // Show "sell" in `/claim &amp;lt;tab&amp;gt;`
-            return rootCommand.equals("claim") ? List.of("sell") : List.of();
-        }
-    
-        @Override
-        public List&amp;lt;string&amp;gt; getTabCompletions(
-                CommandSender sender, String rootCommand, String subcommand, String[] args) {
-            if (!"sell".equalsIgnoreCase(subcommand)) return List.of();
-            if (args.length == 0) {
-                return List.of("100", "500", "1000");
-            }
-            return List.of();
-        }
-    
-        @Override
-        public boolean handleSubcommand(ClaimCommandContext context) {
-            if (!"sell".equalsIgnoreCase(context.getSubcommand())) {
-                return false; // not ours
-            }
-    
-            if (!(context.getSender() instanceof Player player)) {
-                context.getSender().sendMessage("Run this as a player.");
-                return true;
-            }
-    
-            Claim claim = context.getSelectedOrCurrentClaim();
-            if (claim == null) {
-                player.sendMessage(ChatColor.RED + "No selected or current claim.");
-                return true;
-            }
-    
-            if (!Objects.equals(claim.getOwnerID(), player.getUniqueId())) {
-                player.sendMessage(ChatColor.RED + "Only the owner can list this claim for sale.");
-                return true;
-            }
-    
-            String[] args = context.getArgs();
-            if (args.length &amp;lt; 1) {
-                player.sendMessage(ChatColor.RED + "Usage: /claim sell &amp;lt;price&amp;gt;");
-                return true;
-            }
-    
-            long price;
-            try {
-                price = Long.parseLong(args[0]);
-            } catch (NumberFormatException ex) {
-                player.sendMessage(ChatColor.RED + "Price must be a number.");
-                return true;
-            }
-    
-            // ... store the listing, charge a fee, etc.
-            player.sendMessage(ChatColor.GREEN + "Claim listed for sale at " + price);
-            return true;
-        }
-    }
-
-Register it in your plugin's `onEnable`:
-
-    :::java
-    ClaimCommandAddonRegistry.register(new SellClaimAddon());
-
-That's it — `/claim sell 100` now runs your handler with the claim already resolved.
-
-### Ownership Rules
-
-- **GP3D always owns its built-in subcommands.** `trust`, `abandon`, `expand`, etc. cannot be overridden by an addon.
-- **Addons cannot register aliases that collide with built-ins.** Pick unique subcommand names.
-- **One addon at a time handles a given subcommand.** `handleAddonSubcommand` returns on the first addon that reports `true`, so order of registration matters if two addons claim the same subcommand.
-
----
-
-## Events
-
-GriefPrevention fires a number of custom Bukkit events you can listen to. They live under `me.ryanhamshire.GriefPrevention.events`:
-
-| Event | When it fires | Cancellable |
-|---|---|---|
-| `ClaimCreatedEvent` | A new claim is about to be created | Yes |
-| `ClaimDeletedEvent` | A claim is deleted | No |
-| `ClaimResizeEvent` | A claim is being resized | Yes (via `ClaimChangeEvent`) |
-| `ClaimExtendEvent` | A claim is auto-extended downward | Yes (via `ClaimChangeEvent`) |
-| `ClaimModifiedEvent` | A generic "claim shape changed" event | Yes (via `ClaimChangeEvent`) |
-| `ClaimTransferEvent` | Claim ownership changes | Yes |
-| `ClaimExpirationEvent` | A claim is about to expire | Yes |
-| `ClaimPermissionCheckEvent` | Permission check runs against a claim — override to alter the result | Yes |
-| `ClaimInspectionEvent` | Player right-clicks with the investigation tool | Yes |
-| `TrustChangedEvent` | Trust list changes for one or more claims | Yes |
-| `AccrueClaimBlocksEvent` | A player is about to accrue claim blocks | Yes |
-| `PreventBlockBreakEvent` | A block break is being prevented | Yes |
-| `PreventPvPEvent` | PvP is being prevented | Yes |
-| `ProtectDeathDropsEvent` | Death drops are about to be protected | Yes |
-| `SaveTrappedPlayerEvent` | `/trapped` is about to teleport a player | Yes |
-| `PlayerKickBanEvent` | GP is about to kick/ban a player | Yes |
-| `BoundaryVisualizationEvent` | Claim borders are about to be visualized | Yes |
-| `VisualizationEvent` | (legacy) Visualization is about to run | Yes |
-
-Listen to them like any Bukkit event:
-
-    :::java
-    @EventHandler
-    public void onCreate(ClaimCreatedEvent event) {
-        Claim created = event.getClaim();
-        // ...
-    }
-
-See the Javadoc on each class for the exact getters and setters.
-
-# Administrator's Guide
-
-You probably don't need to read this entire document just to get started with GriefPrevention3D. The plugin does almost all the work for you — try it out and come back here when something isn't obvious.
-
-## Table of Contents
-
-- [Administrative Claims](#administrative-claims)
-- [Converting Claims Between Admin and Basic](#converting-claims-between-admin-and-basic)
-- [Changing Player Claims](#changing-player-claims)
-  - [Overriding](#overriding)
-  - [Deleting and Resizing](#deleting-and-resizing)
-- [Creating Claims for Players](#creating-claims-for-players)
-- [Adjusting a Player's Claim Limit](#adjusting-a-players-claim-limit)
-- [Investigating a Player's Claims](#investigating-a-players-claims)
-- [Investigating a Specific Claim](#investigating-a-specific-claim)
-- [Boundary Violation Alerts](#boundary-violation-alerts)
-- [Fighting Wilderness Grief (World Repair)](#fighting-wilderness-grief-world-repair)
-- [Fighting Chat Trolls](#fighting-chat-trolls)
-- [Killing Drama](#killing-drama)
-- [Reviewing Chat Logs Efficiently](#reviewing-chat-logs-efficiently)
-
----
-
-## Administrative Claims
-
-**Required permission:** `griefprevention.adminclaims`
-
-Administrative claims are reserved areas owned by "the administration" rather than a specific player. They don't cost any player claim blocks, and any player with admin claims permission can modify all administrative claims.
-
-- Want to grant all players permissions in admin claims? `/accesstrust public`, `/containertrust public`, or `/trust public` works.
-- Want to prevent players from claiming an area without stopping them from building there? Drop an admin claim and `/trust public` inside it.
-
-Use `/adminclaims` to switch to admin-claim mode and `/basicclaims` to switch back.
-
-### 3D Administrative Claims
-
-**GP3D addition. Required permission:** `griefprevention.adminclaims`
-
-3D admin claims extend the admin claims system with exact vertical control. Instead of the standard ground-extension offset (which extends an admin claim from the clicked Y level down to the world floor), `Admin3D` mode uses the **clicked Y coordinates directly** as the vertical bounds of the claim.
-
-- `/3dadminclaims` (aliases: `adminclaim3d`, `adminclaims3d`, `3dadminclaim`) — switch shovel to 3D admin claim mode.
-- `/aclaim mode admin3d` — same via the unified command handler.
-- `/basicclaims` — switch back to normal mode.
-
-**Behavior:**
-
-- Clicked Y levels become the exact top and bottom of the claim — no automatic ground extension.
-- Free to create (no claim blocks consumed) with `null` owner ID (standard admin claims).
-- Minimum size and claim block checks are bypassed (identical to regular `Admin` mode).
-- Multiple 3D admin claims can **stack** at different Y levels inside the same X/Z footprint, useful for multi-floor admin structures.
-- Claim boundary visualization uses the `ADMIN_CLAIM_3D` visual style (glowstone/pumpkin by default) to distinguish 3D admin claims from other claim types.
-
-**Note:** The existing `/adminclaims` (2D) mode continues to work as before. 3D admin claims are an additional tool, not a replacement.
-
----
-
-## Converting Claims Between Admin and Basic
-
-**GP3D addition. Required permission:** `griefprevention.adminclaims.convert`
-
-Two commands, no shovel dance:
-
-- `/makeadmin` — stand inside a basic (player-owned) claim and run the command. The claim becomes an administrative claim.
-- `/makebasic` — stand inside an administrative claim and run the command. It becomes a basic claim owned by you.
-
-These preserve trust data, subdivisions, and claim geometry. They are safer than the classic `/transferclaim` workflow when you just need to flip the ownership category without handing the claim to another player. For the "hand an admin claim to player X" flow, use `/transferclaim &amp;lt;player&amp;gt;` instead.
-
-Claim-block math notes:
-
-- `/makeadmin` does not refund blocks to the previous basic owner (they have lost the claim).
-- `/makebasic` does not deduct blocks from you beyond what the claim would normally cost. For this reason `/makebasic` is admin-only.
-
----
-
-## Changing Player Claims
-
-### Overriding
-
-**Required permission:** `griefprevention.ignoreclaims`
-
-Any player with this permission can bypass claim protections using `/IgnoreClaims`, allowing them to build, break, and change permissions (trust, untrust, etc.) anywhere. Admin claims still require `griefprevention.adminclaims`. Run `/IgnoreClaims` again to go back to "respecting claims" mode and avoid accidents.
-
-Individual actions taken while ignoring claims are **not** logged, so only grant this to staff you trust 100%.
-
-### Deleting and Resizing
-
-**Required permission:** `griefprevention.deleteclaims`
-
-- `/deleteclaim` — deletes the claim you're standing in, even if it's not yours. Deleting public (admin) claims additionally requires `griefprevention.adminclaims`.
-- `/deleteallclaims &amp;lt;player&amp;gt;` — deletes all of a specific player's claims, useful after permanent bans.
-
-GP3D **does not** auto-remove claims for banned players because many servers have ban-appeal workflows. To do it automatically, alias your `/ban` command in `commands.yml` to also run `/deleteallclaims &amp;lt;player&amp;gt;`.
-
-Anyone with `griefprevention.deleteclaims` may resize another player's claim with the golden shovel as if it were their own. The owner's claim block total is adjusted accordingly. There is no separate resize permission because resize can effectively un-claim any block (same risk surface as delete).
-
-All deletions and resizes (except by the claim owner themselves) are logged.
-
----
-
-## Creating Claims for Players
-
-Anyone with both `griefprevention.adminclaims` **and** `griefprevention.transferclaim` can create a claim for another player by first making an admin claim with `/adminclaims`, then running `/transferclaim &amp;lt;player&amp;gt;`. This is the only way to create a private claim smaller than the minimum claim size.
-
-In GP3D you also have `/makebasic` (with `griefprevention.adminclaims.convert`) as an alternative — create the shape as an admin claim, then `/makebasic` to make it your basic claim, then `/transferclaim` to hand it to the player. Which flow you prefer is up to you.
-
----
-
-## Adjusting a Player's Claim Limit
-
-**Required permission:** `griefprevention.adjustclaimblocks`
-
-- `/adjustbonusclaimblocks &amp;lt;player&amp;gt; &amp;lt;amount&amp;gt;` (alias `/acb`) — add or remove bonus claim blocks. Bonus blocks have no config cap, unlike accrued blocks.
-- `/acb [myservergroups.builders] 5000` — grants 5,000 bonus blocks to everyone with the `myservergroups.builders` permission. This is **not** a one-shot: players who later gain or lose the permission also gain or lose the bonus.
-- `/setaccruedclaimblocks &amp;lt;player&amp;gt; &amp;lt;amount&amp;gt;` (alias `/scb`) — sets a player's accrued block total directly.
-
----
-
-## Investigating a Player's Claims
-
-**Required permission:** `griefprevention.claimslistother`
-
-`/claimslist &amp;lt;player&amp;gt;` lists all of a player's claims with sizes, locations, and the claim-block math.
-
----
-
-## Investigating a Specific Claim
-
-Equip the investigation tool (stick by default) and right-click the claimed area. Shift+right-click shows nearby claims if you have `griefprevention.visualizenearbyclaims`. `griefprevention.seeclaimsize` adds size info and `griefprevention.seeinactivity` shows the owner's offline time on that tooltip.
-
----
-
-## Boundary Violation Alerts
-
-**GP3D addition.** Piston and liquid events that get blocked at a claim boundary now notify the **claim owner** so they understand where the flow is being stopped — no config toggles, no per-claim water/lava permissions.
-
-### What Triggers an Alert
-
-- A piston tries to push a block **into** a claim from outside.
-- A piston inside a claim tries to push a block **out** of that claim into someone else's claim.
-- Water or lava tries to flow **into** a claim from outside it (or fails to flow out into another owner's claim).
-
-### Message Format
-
-When the claim owner is online, they see something like:
-
-    Warning: A piston tried to enter your claim @ x:... y:... z:...!
-    Warning: A liquid tried to enter your claim @ x:... y:... z:...!
-
-If several violations happen in the same burst window (~2 seconds), the plugin condenses them into a single summary line rather than spamming:
-
-    Warning: 12 liquid violations near your claim @ x:... y:... z:...!
-
-### Dedup Behavior
-
-To keep notifications useful and not noisy, the plugin remembers recent violations and suppresses repeats:
-
-- **Pistons**: exact-location dedup. A specific piston pushing repeatedly against the same spot only alerts once per expiry window.
-- **Water**: 8-block radius dedup (water flows up to 7 blocks).
-- **Lava (overworld / end)**: 5-block radius dedup (lava flows up to 4 blocks).
-- **Lava (nether)**: 8-block radius dedup (nether lava flows up to 7 blocks).
-- Entries expire after ~5 minutes of no activity.
-
-### Why Only Alerts, No Toggles
-
-The design intentionally avoids per-claim water/lava permission toggles. Such toggles:
-
-- Enable non-survival placements (holding water/lava in midair by claim boundary rules).
-- Open weird trapping cases (fake water sources held up by claim rules so players fall to their death).
-
-Alerts solve the real problem — player confusion about where flow is happening — without opening those traps. Pistons are treated the same way: no cross-claim toggle, just better feedback.
-
----
-
-## Fighting Wilderness Grief (World Repair)
-
-**Required permission:** `griefprevention.restorenature`
-
-"Public grief" is damage done to the world rather than to a specific player: terrain damage, ugly builds, tree-topping (not possible with GP installed), wildfires (not possible with GP installed). `/restorenature` addresses the rest.
-
-- `/restorenature` (alias `/rn`) — right-click a block with the shovel to revert player changes in that area. Claims are respected.
-- `/restorenaturefill [radius]` (alias `/rnf`, requires `griefprevention.restorenatureaggressive`) — right-click at the level you want to fill to. Huge griefer craters fill in seconds.
-- `/restorenatureaggressive` (alias `/rna`, requires the aggressive permission) — removes even some natural blocks. Use carefully. Only removes blocks at and above the clicked level.
-
-Rule of thumb: try `/rn` first. Only use `/rna` when the griefer used natural-looking blocks.
-
-GriefPrevention does **not** maintain per-block history — it doesn't "roll back" in the WorldEdit sense. Instead, it identifies player-placed blocks and removes them, then smooths unnatural terrain. This is safer than regeneration because:
-
-- Regenerating a chunk after world-seed / worldgen changes can produce mismatched neighbors (snowy squares in deserts).
-- WorldEdit's region regen works at chunk granularity and tries to "undo" outside the selection — subtle bugs can leak.
-- Regeneration can put back things you wanted gone, like depleted dungeons and ore veins.
-
-Always try the safe `/restorenature` first.
-
----
-
-## Fighting Chat Trolls
-
-**Required permission:** `griefprevention.softmute`
-
-Banning a troll often escalates: alt accounts, recruited friends, DDOS attempts. `/softmute &amp;lt;player&amp;gt;` lets the troll see their own messages (and so do other soft-muted players) while nobody else does. The troll thinks their messages are working and loses interest before escalating. Cheap, quiet, effective.
-
----
-
-## Killing Drama
-
-**Required permission:** `griefprevention.separate`
-
-When two players cannot get along, `/separate &lt;a&gt; &lt;b&gt;` forces them to ignore each other in chat without either of them knowing. `/unseparate` reverses it. Neat, fast, stops ambient server drama from spreading.
-
----
-
-## Reviewing Chat Logs Efficiently
-
-Abridged social-interaction logs live under `plugins/GriefPreventionData/Logs`. They are formatted for human reading and auto-delete after 7 days. The `config.yml` log section lets you change the retention period and verbosity.
-
-# Commands
-
-&amp;gt; **Note on the unified `/claim` handler.** GriefPrevention3D ships a unified command surface configured in `plugins/GriefPreventionData/alias.yml`. With it enabled (the default), most commands on this page can also be invoked as `/claim &amp;lt;subcommand&amp;gt;` — for example `/claim trust &amp;lt;player&amp;gt;`, `/claim abandon`, `/claim explosions`. This page documents the **standalone** commands only, since they stay the canonical names. See [Key Features › Unified Command Handler](Key-Features#unified-command-handler) for how the unified form maps onto these standalone commands.
-
-All permissions below start with `griefprevention.`. For example, "restorenature" is `griefprevention.restorenature`. See [Permissions](Permissions) for the full list.
-
-## Player Commands
-
-| Command | Description | Alias | Perm |
-|---|---|---|---|
-| `/AbandonClaim` | Deletes the claim you're standing in (or selected). | | claims |
-| `/AbandonTopLevelClaim` | Deletes a claim and all its subdivisions. | | claims |
-| `/AbandonAllClaims` | Deletes all of your claims. | | abandonallclaims |
-| `/ClaimExplosions` | Toggles if explosions are allowed in the claim. | `/claimexplosion` | claims |
-| `/WitherExplosions` | Toggles if wither explosions may damage blocks in the claim. | `/witherexplosion` | witherexplosions |
-| `/Trust` | Gives another player permission to build in your claim. | `/tr` | claims |
-| `/UnTrust` | Revokes any permissions granted to a player in your claim. | `/ut` | claims |
-| `/AccessTrust` | Gives a player permission to use your buttons, levers, and beds. | `/at` | claims |
-| `/ContainerTrust` | Gives a player permission to use buttons, levers, beds, crafting gear, containers, and animals. | `/ct` | claims |
-| `/PermissionTrust` | Grants a player permission to share their permission level with others. | `/pt`, `/managetrust` | claims |
-| `/TrustList` | Lists the permissions for the claim you're standing in (or selected). Shows inherited permissions too. | | claims |
-| `/SubdivideClaims` | Switches your shovel to subdivision mode. | `/sc`, `/subdivideclaim` | claims |
-| `/3DSubdivideClaims` | Switches your shovel to 3D subdivision mode (Y-bounded subclaims). | `/3dsubdivideclaim` | claims |
-| `/ShapedClaims` | Switches your shovel to shaped-claim mode (orthogonal polygon claims). Requires `AllowShapedClaims: true`. | `/shapedclaim` | claims |
-| `/RestrictSubclaim` | Restricts a subclaim so it inherits no permissions from the parent. If run in a top-level claim, restricts all its subdivisions at once. | `/rsc` | claims |
-| `/BasicClaims` | Puts your shovel back in basic claims mode. | `/bc` | claims |
-| `/ExtendClaim` | Resizes the claim you're standing in (or selected) by pushing its boundary in the direction you're facing. | `/expandclaim`, `/resizeclaim` | claims |
-| `/BuyClaimBlocks` | Converts server currency to claim blocks. | `/buyclaim` | buysellclaimblocks |
-| `/SellClaimBlocks` | Converts claim blocks to server currency. | | buysellclaimblocks |
-| `/GivePet` | Gives away a tamed animal. | | givepet |
-| `/ClaimsList` | Lists your claims and claim-block totals. | `/claimlist`, `/listclaims` | claims |
-| `/IgnorePlayer` | Ignores a player's chat messages. | `/ignore` | ignore |
-| `/UnIgnorePlayer` | Un-ignores a player's chat messages. | `/unignore` | ignore |
-| `/IgnoredPlayerList` | Lists all players currently ignored. | `/ignores`, `/ignored`, `/ignorelist`, `/ignoredlist` | ignore |
-| `/Trapped` | Gets you out of a claim you're stuck inside. | | trapped |
-| `/UnlockDrops` | Allows other players to pick up items you dropped when you died. | | unlockdrops |
-| `/CheckClaimExpiry` | View claim expiration details for a player. | | checkclaimexpiry |
-
-## Admin Commands
-
-| Command | Description | Alias | Perm |
-|---|---|---|---|
-| `/AdminClaims` | Switches the shovel tool to administrative claims mode. | `/ac` | adminclaims |
-| `/3DAdminClaims` | Switches the shovel to 3D admin claim mode (height-bounded, exact Y coordinates). | `adminclaim3d`, `adminclaims3d`, `3dadminclaim` | adminclaims |
-| `/BasicClaims` | Returns the shovel to basic claims mode. | `/bc` | claims |
-| `/AdminClaimsList` | Lists all administrative claims. | | adminclaims |
-| `/DeleteAllAdminClaims` | Deletes all administrative claims. (Console only.) | | adminclaims |
-| `/TransferClaim` | Converts an administrative claim to a private claim. | `/giveclaim` | transferclaim |
-| `/MakeAdmin` | Converts the basic claim you're standing in to an administrative claim. | | adminclaims.convert |
-| `/MakeBasic` | Converts the administrative claim you're standing in to a basic claim you own. | | adminclaims.convert |
-| `/IgnoreClaims` | Toggles ignore-claims mode for admin overrides. | `/ic` | ignoreclaims |
-| `/DeleteClaim` | Deletes the claim you're standing in, even if it's not yours. | | deleteclaims |
-| `/DeleteAllClaims` | Deletes all of another player's claims. | | deleteclaims |
-| `/DeleteClaimsInWorld` | Deletes all claims in a world. (Console only.) | `/deleteallclaimsinworld`, `/clearclaimsinworld` | deleteclaimsinworld |
-| `/DeleteUserClaimsInWorld` | Deletes all non-admin claims in a world. (Console only.) | `/deletealluserclaimsinworld`, `/clearuserclaimsinworld` | deleteclaimsinworld |
-| `/AdjustBonusClaimBlocks` | Adds or subtracts bonus claim blocks for a player (or group with `[bracketed]` syntax). | `/acb` | adjustclaimblocks |
-| `/AdjustBonusClaimBlocksAll` | Adds or subtracts bonus claim blocks for all online players. | `/acball` | adjustclaimblocks |
-| `/SetAccruedClaimBlocks` | Updates a player's accrued claim-block total. | `/scb` | adjustclaimblocks |
-| `/RestoreNature` | Switches the shovel tool to restoration mode. | `/rn` | restorenature |
-| `/RestoreNatureAggressive` | Switches the shovel to aggressive restoration mode. | `/rna` | restorenatureaggressive |
-| `/RestoreNatureFill` | Switches the shovel to fill mode. | `/rnf` | restorenatureaggressive |
-| `/SoftMute` | Toggles whether a player's messages reach only other soft-muted players. | | softmute |
-| `/Separate` | Forces two players to ignore each other in chat. | | separate |
-| `/UnSeparate` | Reverses `/separate`. | | separate |
-| `/GPReload` | Reloads GriefPrevention's configuration settings. | | reload |
-| `/ClaimsList &amp;lt;player&amp;gt;` | Lists information about another player's claim blocks and claims. | | claimslistother |
-| `/ClaimBook` | Gives a player the "How to Claim Land" manual. | | claimbook |
-| `/UnlockDrops &amp;lt;player&amp;gt;` | Unlocks drops for another player. | | unlockothersdrops |
-
-## Notes
-
-- **`/3dadminclaims`** (and its alias `/aclaim mode admin3d`) is a GP3D addition. It uses the existing `griefprevention.adminclaims` permission. See [Administrator's Guide › 3D Administrative Claims](Administrator-Guide#3d-administrative-claims).
-- **`/makeadmin` and `/makebasic`** are GP3D additions. They require `griefprevention.adminclaims.convert` (default `op`). Use them to move an existing claim between the "basic player-owned" and "administrative" pools without losing trust data. See [Administrator's Guide › Converting Claims](Administrator-Guide#converting-claims-between-admin-and-basic).
-- **`/witherexplosions`** is a GP3D addition. It is gated by `griefprevention.witherexplosions` (default `true`).
-- **`/3dsubdivideclaims`, `/shapedclaims`**, and the shaped-mode variants are GP3D additions. Shaped-mode commands hide themselves when `AllowShapedClaims: false`.
-- **`/extendclaim`** has aliases `/expandclaim` and `/resizeclaim`. When a shaped claim has a shift-click segment marker, `/expandclaim` operates on that segmented subsection instead of the whole side.
-- **Selected-claim commands**: if you just resized a claim, most of the "claim-local" commands above (`/trust`, `/trustlist`, `/abandonclaim`, `/claimexplosions`, `/witherexplosions`) run against the **selected claim** even after you walk out of it. See [Key Features › Claim Selection](Key-Features#claim-selection).
-
-# Configuration
-
-GriefPrevention3D configuration lives in `plugins/GriefPreventionData/`:
-
-- `config.yml` — primary plugin configuration.
-- `messages.yml` — all user-facing strings. Edit to localize or reword.
-- `alias.yml` — unified `/claim` / `/aclaim` command surface and standalone aliases.
-
-Reload after edits with `/gpreload`.
-
-## GP3D-Specific Toggles
-
-These are the options you most likely need to know about as a GP3D admin. They live in `config.yml` under the `GriefPrevention:` root.
-
-### `Claims.AllowShapedClaims`
-
-    :::yaml
-    GriefPrevention:
-      Claims:
-        AllowShapedClaims: false
-
-Master switch for orthogonal polygon parent claims.
-
-- `false` (default): `/shapedclaims`, `/shapedclaim`, and `/claim mode shaped` are hidden/disabled. The plugin behaves like rectangle-only GP.
-- `true`: shaped-mode commands are available and players can create orthogonal polygon top-level claims.
-
-See [Key Features › Shaped Claims](Key-Features#shaped-claims).
-
-### `Claims.AllowNestedSubClaims`
-
-    :::yaml
-    GriefPrevention:
-      Claims:
-        AllowNestedSubClaims: false
-
-- `false` (default): subdivisions may only exist inside top-level claims (upstream behavior).
-- `true`: subdivisions may be created inside other subdivisions.
-
-### `Claims.UseClaimSelectSessions`
-
-    :::yaml
-    GriefPrevention:
-      Claims:
-        UseClaimSelectSessions: true
-        UseClaimSelectedMessages: false
-
-Controls what happens when a player right-clicks an existing claim corner with the claim tool.
-
-- `UseClaimSelectSessions: true` (default): the selected claim can be targeted by commands such as `/claim abandon` while waiting for the second resize click.
-- `UseClaimSelectSessions: false`: the shovel can still resize normally, but commands use the claim the player is standing in instead of the selected corner claim.
-- `UseClaimSelectedMessages: false` (default): players see the normal `ResizeStart` message.
-- `UseClaimSelectedMessages: true`: players see the fuller `ClaimSelected`, `ClaimSelectedTopLevel`, or `SubdivisionSelected` guidance.
-
-### `VisualizationGlow`
-
-    :::yaml
-    GriefPrevention:
-      VisualizationGlow: false
-
-- `false` (default): classic fake-block border visualization.
-- `true`: claim borders glow (Minecraft 1.19.3+ required; ignored on older clients/servers).
-
-### `Claims.MinimumDistance`
-
-    :::yaml
-    GriefPrevention:
-      Claims:
-        MinimumDistance: 0
-
-Enforces a minimum distance in blocks between top-level claims to prevent claim spam and overcrowding.
-
-- `0` (default): disabled — no minimum distance check.
-- When set to a positive integer (e.g. `10`), players cannot create a claim within that many blocks of another player's claim boundary.
-- Claim creation is blocked with a denial message identifying the nearby claim owner and the configured distance.
-- The conflicting claim's boundary is visualized as a `CONFLICT_ZONE` (visible from afar, especially with `VisualizationGlow: true`).
-
-**Bypassing minimum distance with neighbor trust:**
-
-Specific players can be granted neighbor trust to bypass the distance check:
-
-- `/claim trust &amp;lt;player&amp;gt; neighbor` — grants neighbor trust on the claim you're standing in (or all your claims if standing outside).
-- `/neighbortrust &amp;lt;player&amp;gt;` (alias: `/distancetrust &amp;lt;player&amp;gt;`) — standalone command for the same purpose.
-- `/claim untrust &amp;lt;player&amp;gt;` — revokes manually-granted neighbor trust.
-- `/claim distance toggle` — while standing in your own claim (or with manager permission), toggles `allowAllNeighbors` for that claim. When enabled, ALL players can bypass minimum distance checks for that claim. Permission: `griefprevention.toggleclaimdistance`.
-- `/claim distance check` — shows the configured minimum distance and lists all nearby claims within range, each visualized with a conflict zone boundary. Permission: `griefprevention.checkclaimdistance`.
-
-**Auto-granted neighbor trust:**
-
-When `MinimumDistance` is set, existing claims that are already too close to each other automatically have their owners added as neighbors to each other's claims. This trust is automatically removed when a claim is abandoned (and no other claims from that owner remain nearby). Auto-granted trust cannot be removed via `/untrust`.
-
-**Trustlist display:**
-
-`/trustlist` shows neighbor-trusted players with a `&amp;amp;d&amp;gt;` (light purple) prefix, and the legend at the bottom includes "Neighbor" when neighbors exist.
-
-**Relevant permissions:**
-
-| Permission | Default | Description |
-|---|---|---|
-| `griefprevention.neighbortrust` | child of `griefprevention.claims` | Allows use of `/neighbortrust` and `/distancetrust`. |
-| `griefprevention.checkclaimdistance` | child of `griefprevention.claims` | Allows use of `/claim distance check`. |
-| `griefprevention.toggleclaimdistance` | child of `griefprevention.claims` | Allows use of `/claim distance toggle`. |
-
-All of the above are children of `griefprevention.claims`, so existing servers with `griefprevention.claims: true` (the default) continue to work without changes.
-
-## Alias File (`alias.yml`)
-
-Located at `plugins/GriefPreventionData/alias.yml`. The important top-level knobs:
-
-    :::yaml
-    enabled: true       # master switch for the alias system
-    standalone: true    # when false, only /claim and /aclaim are registered
-
-- **`enabled: false`** disables the alias system entirely. All commands fall back to their internal English names.
-- **`standalone: false`** keeps `/claim` and `/aclaim` but removes the per-command standalone aliases (`/trust`, `/abandonclaim`, etc.). Useful when another plugin owns those command names.
-
-Each subcommand block under `commands.claim.subcommands` (and `commands.aclaim.subcommands`) controls:
-
-- Whether the subcommand is enabled.
-- What names / aliases it responds to.
-- Its permission node.
-- Tab-completion argument types.
-
-The file itself carries extensive inline documentation; read it directly for the full schema.
-
-## Upstream Options
-
-All upstream GriefPrevention config options still work. If you are migrating from upstream GP, start there — the values you already have will keep doing what they did before. See [Migration](Migration) for the things that changed.
-
-# Getting Started
-
-This page walks through installing GriefPrevention3D and getting it running on a Spigot/Paper/Folia server.
-
-## Requirements
-
-- **Minecraft**: 1.21+ (API level `1.21`).
-- **Server software**: Spigot, Paper, or Folia. GP3D supports Folia's regional scheduling.
-- **Java**: 21+ (same as Minecraft 1.21).
-- **Optional**: Vault for `/buyclaimblocks` and `/sellclaimblocks`.
-
-Older Minecraft versions are not officially supported. Some older-Minecraft compatibility fixes are carried (e.g., for `COPPER_GOLEM_STATUES`, `CHAINS`), but the plugin targets modern server jars.
-
-## Installation
-
-1. Drop the built `GriefPrevention.jar` into your server's `plugins/` directory.
-2. Start the server once so GriefPrevention3D generates the default config under `plugins/GriefPreventionData/`.
-3. Stop the server, edit `config.yml` to taste, and restart. Or use `/gpreload` to pick up config changes without a full restart.
-
-## First-Time Setup Checklist
-
-- **Decide on claim modes per world.** `config.yml` has `GriefPrevention.Claims.WorldModes` — common values are `Survival`, `Creative`, `SurvivalRequiringClaims`, and `Disabled`.
-- **Decide on the shaped-claims toggle.** Shaped polygon claims are **off by default**. Set `GriefPrevention.Claims.AllowShapedClaims: true` in `config.yml` if you want them. See [Key Features › Shaped Claims](Key-Features#shaped-claims).
-- **Decide on nested subclaims.** `GriefPrevention.Claims.AllowNestedSubClaims: true` to allow subdivisions inside other subdivisions.
-- **Decide on visualization style.** `GriefPrevention.VisualizationGlow: true` turns on glowing claim borders (requires 1.19.3+).
-- **Review the alias file.** `plugins/GriefPreventionData/alias.yml` controls the unified `/claim` and `/aclaim` root commands plus standalone aliases. See [Key Features › Unified Command Handler](Key-Features#unified-command-handler).
-
-## Claiming Your First Land
-
-Teach players the basics in this order:
-
-1. **Chest claim**: Place a chest. The plugin auto-creates a small protected claim around it for new players (if `AutomaticNewPlayerClaimsRadius` &amp;gt; -1).
-2. **Golden shovel**: Right-click two opposite corners of the area to claim. The plugin draws a visual border.
-3. **Trust someone**: `/trust &amp;lt;player&amp;gt;` while standing inside the claim.
-4. **Expand a claim**: Right-click a corner with the golden shovel, then right-click the new corner.
-
-Once a claim exists, owners can use `/claim trust`, `/claim abandon`, `/claim explosions`, etc. directly, and shift-click corners to enter shaped-mode edits if enabled.
-
-## Verifying It Works
-
-- `/claimslist` lists your claims.
-- `/trustlist` while standing in a claim lists permissions there, including inherited permissions from parent claims.
-- Admins can `/ignoreclaims` to temporarily override protections while building infrastructure.
-
-## Next Steps
-
-- Read [Migration](Migration) if you are upgrading from upstream GriefPrevention — the behavior differences matter.
-- Read [Key Features](Key-Features) for the detailed feature list.
-- Read the [Administrator's Guide](Administrator-Guide) for day-to-day server operations.
-
-# GriefPrevention3D
-
-GriefPrevention3D is a fork of the original [GriefPrevention](https://dev.bukkit.org/projects/grief-prevention) plugin, extended with features modern survival servers actually need: true 3D subdivisions, non-rectangular (shaped) parent claims, nested subclaims, glowing visualizations, and a unified `/claim` command surface.
-
-This wiki is the reference for server owners moving from upstream GriefPrevention to GriefPrevention3D, or setting up a new server from scratch.
-
-## Quick Links
-
-- **New to the plugin?** Start with [Getting Started](Getting-Started).
-- **Coming from upstream GP?** Read [Migration](Migration) first — it is the fastest way to see what is new, what changed, and what needs attention in your config.
-- **Want the feature list?** See [Key Features](Key-Features).
-- **Looking for a specific command or permission?** See [Commands](Commands) and [Permissions](Permissions).
-- **Running the server?** The [Administrator's Guide](Administrator-Guide) covers day-to-day operations.
-
-## Highlights
-
-- **3D Subdivisions** with real Y-level boundaries (`/3dsubdivideclaims`).
-- **Shaped Claims** — orthogonal polygon parent claims (`/shapedclaims`, gated by `AllowShapedClaims`).
-- **Nested Subclaims** — subdivisions inside other subdivisions (gated by `AllowNestedSubClaims`).
-- **Glowing Visualizations** for easier-to-see claim borders (gated by `VisualizationGlow`, requires Minecraft 1.19.3+).
-- **Unified Command Handler** — `/claim create`, `/claim trust`, `/claim abandon`, and more, all under one root command (configurable in `alias.yml`).
-- **3D Admin Claims** — free, height-limited admin claims with exact Y bounds (`/3dadminclaims`).
-- **Admin ↔ Basic conversion** via `/makeadmin` and `/makebasic`.
-- **Boundary Violation Alerts** — claim owners are notified when pistons or liquids get blocked at their claim boundary, so they know where to resize or why a flow stopped.
-
-## Source and Issues
-
-- Repository: the `GriefPrevention3D` GitHub repo.
-- File issues and feature requests on the GitHub issue tracker.
-
 # Key Features

 This page is the reference for every feature that makes GriefPrevention3D different from upstream GriefPrevention. It is also the page to read first when configuring the plugin for your server.
@@ -1582,495 +244,3 @@

 - **Selected-claim commands**: resize-oriented command variants respect the current selection context instead of only the player's block position.
 - **Temporary basic-mode segment previews**: shift-clicking a claim boundary in basic claims mode creates a temporary segment preview for convenience. These previews do not persist across visualization refreshes and disappear if the player does nothing with them. Only deliberate `/shapedclaim` shift-click segmentation persists to the claim.
 - **Older-version compatibility fixes** shipped for `COPPER_GOLEM_STATUES`, `CHAINS`, and chain-material lookups.
-
-# Locale System
-
-GriefPrevention3D supports localized messages via YAML locale files. The plugin loads messages based on the `GriefPrevention.Locale` config setting.
-
-## Quick Start
-
-1. Set your locale in `config.yml`:
-   ```yaml
-   GriefPrevention:
-     Locale: es
-   ```
-
-2. Copy the desired locale file from `Lang/` to the data folder root:
-   ```
-   GriefPreventionData/
-     Lang/
-       messages_en.yml      &amp;lt;- bundled reference copies (refreshed on restart)
-       messages_es.yml
-       messages_pt_BR.yml
-     messages_es.yml         &amp;lt;- your active locale file (copied here by you)
-     config.yml
-   ```
-
-3. Restart the server or run `/greload`.
-
-## File Locations
-
-| Path | Purpose |
-|------|---------|
-| `GriefPreventionData/messages_{locale}.yml` | Active locale files read by the plugin |
-| `GriefPreventionData/Lang/` | Reference copies extracted from JAR on every restart |
-| `GriefPreventionData/messages.yml` | Legacy file (backward compatibility) |
-
-## Loading Priority
-
-1. **`messages_{locale}.yml`** — matches your `config_locale` setting (e.g., `messages_es.yml` for `Locale: es`)
-2. **`messages.yml`** — legacy fallback for servers migrated from older versions
-3. **Auto-detect** — if neither exists, scans for any `messages_*.yml` and auto-switches
-4. **Extract from JAR** — if nothing found, extracts the matching locale from the JAR
-
-## Auto-Detection
-
-If your config says `Locale: en` but only `messages_es.yml` exists in the data folder, the plugin auto-switches to Spanish and logs:
-
-    Locale 'en' didn't match provided messages_es.yml. Auto-switched to 'es'
-
-The in-memory locale is updated so the startup header and all messages use the detected language.
-
-## Key Merging
-
-On every startup, the plugin compares your deployed locale file against the bundled JAR version. Any missing keys are automatically added and saved to your file. This means:
-
-- New messages added in plugin updates appear automatically after restart
-- You don't need to manually edit your locale file when upgrading
-- Your customizations are preserved (existing keys are never overwritten)
-
-## Supported Locales
-
-| Locale | Language |
-|--------|----------|
-| `en` | English |
-| `es` | Spanish |
-| `pt_BR` | Brazilian Portuguese |
-
-## Adding a New Locale
-
-1. Create `messages_{locale}.yml` in the JAR's resource path (under `src/main/resources/`)
-2. Add the locale to `BUNDLED_LOCALE_FILES` in `DataStore.java`
-3. Add locale entries to `startups.txt` (e.g., `fr1[...`, `fr2[...`, `fr3[...`)
-4. The plugin will extract it to `Lang/` on next restart
-
-## Editing Messages
-
-Each message is stored under a `Messages.` key matching the enum name in `Messages.java`:
-
-    :::yaml
-    Messages:
-      ClaimCreated: "Claims created successfully."
-      NoPermission: "You don't have permission to do that."
-
-You can customize any message by editing the corresponding key in your locale file. The plugin uses `$` or `&amp;amp;` as color code prefixes, and supports `&amp;amp;#RRGGBB` hex colors.
-
-## Startup Header
-
-The startup header respects your locale setting. If you have locale entries in `startups.txt` matching your config (e.g., `es1[...`, `es2[...`, `es3[...`), the plugin displays a localized header on startup.
-
-For locales with a region suffix (e.g., `pt_BR`), the header falls back to the base language (e.g., `pt`) if no exact match is found.
-
-# Migration from Upstream GriefPrevention
-
-This page summarizes what is **new, different, or worth double-checking** when moving from the original GriefPrevention (RoboMWM) to GriefPrevention3D. It is intentionally short — the goal is to help server owners recognize what has changed without reading the whole wiki.
-
-## TL;DR
-
-- Claims are **backwards compatible**. Existing rectangle claims load without modification.
-- Most **commands and permissions are identical** to upstream. GP3D adds a few new ones.
-- Several features are **off by default** and must be opted into in `config.yml`.
-- There is now a **unified `/claim &amp;lt;subcommand&amp;gt;`** surface on top of the existing standalone commands.
-
-## What's New
-
-| Area | What | Default |
-|------|------|---------|
-| 3D Subdivisions | `/3dsubdivideclaims` — subclaims with real Y-level bounds | Available always |
-| 3D Admin Claims | `/3dadminclaims` — free, height-bounded admin claims with exact Y bounds. Also `/aclaim mode admin3d`. | Permission-gated (`griefprevention.adminclaims`) |
-| Shaped Claims | `/shapedclaims`, `/shapedclaim` — orthogonal polygon parent claims | **Off** (`AllowShapedClaims: false`) |
-| Nested Subclaims | Subdivisions inside subdivisions | **Off** (`AllowNestedSubClaims: false`) |
-| Visualization Glow | Glowing claim borders (1.19.3+) | **Off** (`VisualizationGlow: false`) |
-| Unified `/claim` | `/claim create`, `/claim trust`, `/claim abandon`, etc. | **On** in `alias.yml` |
-| `/makeadmin` / `/makebasic` | Convert claims to/from admin | Permission-gated (`griefprevention.adminclaims.convert`) |
-| `/witherexplosions` | Per-claim wither explosion toggle | Permission-gated (`griefprevention.witherexplosions`, default `true`) |
-| Boundary Violation Alerts | Warn claim owners when pistons/liquids are blocked at their border | On (smart deduplication + burst detection) |
-
-## What's Changed
-
-### Claim Selection After Resize
-
-When a player **resizes a claim**, that claim becomes the "selected claim" for their session. Commands like `/trust`, `/untrust`, `/trustlist`, `/abandonclaim`, `/claimexplosions`, and `/witherexplosions` then run against the selected claim even if the player is no longer standing inside it. This removes the old "stand in the claim, then type the command" dance for common admin flows.
-
-### `/restrictsubclaim` from a Parent Claim
-
-Running `/restrictsubclaim` while standing in a **top-level claim** (not inside a subdivision) now instantly restricts **all** subdivisions inside that claim in one go. Previously this had to be done per-subclaim.
-
-### `/trustlist` Shows Inheritance
-
-`/trustlist` now displays **inherited permissions** from the parent claim, not just explicit trusts on the current (sub)claim. This makes it obvious why a player has access somewhere.
-
-### Eavesdrop Permissions Split
-
-The single `griefprevention.eavesdrop` permission has been split for finer control:
-
-- `griefprevention.eavesdrop.pm` — see `/tell`-style private messages.
-- `griefprevention.eavesdrop.softmute` — see soft-muted messages.
-- `griefprevention.eavesdrop.signs` — see sign placements as chat messages (already existed upstream).
-- `griefprevention.eavesdrop.immune` — exempt from being eavesdropped.
-- `griefprevention.eavesdrop` still exists as a blanket/legacy permission.
-
-If you previously granted `griefprevention.eavesdrop` to staff, they will keep the same behavior. If you want only PM eavesdropping or only softmute eavesdropping, use the narrower nodes.
-
-### Boundary Violation Alerts (New)
-
-Pistons and liquids that get blocked at a claim boundary now send a **chat message to the claim owner** (if they're online) explaining where the violation occurred. This covers:
-
-- Piston pushing a block **into** a claim.
-- Piston pushing a block **out of** the owner's own claim into someone else's.
-- Water or lava trying to flow **into** or **out of** a claim.
-
-Messages are deduplicated per-location, with spatial buffers (8 blocks for water, 5 blocks for lava in overworld/end, 8 for lava in the nether). Rapid sequential violations are burst-condensed into a single summary line. See [Administrator's Guide › Boundary Violation Alerts](Administrator-Guide#boundary-violation-alerts).
-
-&amp;gt; **Note**: this is a **feedback-only** system. The goal is helping players understand where flow is being blocked, not adding new protection switches.
-
-## Upgrading Steps
-
-1. **Backup** your `plugins/GriefPreventionData/` folder.
-2. Replace the plugin jar with the GP3D build.
-3. Start the server and watch the console for migration-related log messages.
-4. Review `config.yml` — the new toggles (`AllowShapedClaims`, `AllowNestedSubClaims`, `VisualizationGlow`) will be appended if missing.
-5. Review `alias.yml` for the unified command handler settings.
-6. Restart once more, or run `/gpreload` if you only changed config values.
-
-Existing claims, trust data, and claim block totals are preserved. Rectangle claims continue to work exactly as before; shaped polygon claims are only created when a player explicitly enters shaped mode (and only if `AllowShapedClaims: true`).
-
-## Rollback
-
-The data format is forward-compatible for rectangle claims, so going back to upstream GP will usually work, **but**:
-
-- Any **shaped (polygon) claims** created with GP3D will not round-trip back to upstream GP. Upstream does not understand polygon footprints and will reject or truncate the data.
-- Any **3D subclaims** with Y-level bounds will not round-trip back to upstream GP either.
-
-If you know you might roll back, keep `AllowShapedClaims: false`. Or, more simply, take a full backup of `GriefPreventionData/` before enabling those features.
-
-# Permissions
-
-All permissions start with `griefprevention.` unless noted. Defaults match `plugin.yml`.
-
-## Player Permissions (default: `true`)
-
-| Permission | Default | Description |
-|---|---|---|
-| `griefprevention.claims` | `true` | Required for claim-related slash commands. Parent of all granular claim permissions below. |
-| `griefprevention.createclaims` | `true` | Allows players to create claims with the shovel. |
-| `griefprevention.abandonallclaims` | `true` | Allows `/abandonallclaims`. |
-| `griefprevention.buysellclaimblocks` | `true` | Allows `/buyclaimblocks` and `/sellclaimblocks`. |
-| `griefprevention.trapped` | `true` | Allows `/trapped`. |
-| `griefprevention.givepet` | `true` | Allows `/givepet`. |
-| `griefprevention.unlockdrops` | `true` | Allows `/unlockdrops`. |
-| `griefprevention.ignore` | `true` | Allows `/ignore`, `/unignore`, and `/ignorelist`. |
-| `griefprevention.witherexplosions` | `true` | Allows `/witherexplosions` (**GP3D addition**). |
-
-### Granular Claim Command Permissions
-
-All permissions below are **children of `griefprevention.claims`** in `plugin.yml`. This means granting `griefprevention.claims: true` (the default) automatically grants all of them. To restrict a specific command, explicitly set that child permission to `false` while keeping `griefprevention.claims: true`.
-
-| Permission | Command(s) | Description |
-|---|---|---|
-| `griefprevention.trust` | `/trust` | Grant build trust to a player. |
-| `griefprevention.untrust` | `/untrust` | Revoke trust from a player. |
-| `griefprevention.accesstrust` | `/accesstrust` | Grant access trust (bed, buttons, levers). |
-| `griefprevention.containertrust` | `/containertrust` | Grant container trust (chests, crops, animals). |
-| `griefprevention.permissiontrust` | `/permissiontrust` | Grant permission trust (manage trustlist). |
-| `griefprevention.neighbortrust` | `/neighbortrust`, `/distancetrust` | Grant neighbor trust to bypass minimum distance. |
-| `griefprevention.checkclaimdistance` | `/claim distance check` | Check minimum distance to nearby claims. |
-| `griefprevention.toggleclaimdistance` | `/claim distance toggle` | Toggle whether all players bypass minimum distance for a claim. |
-| `griefprevention.claimslist` | `/claimslist` | List claim blocks and claims. |
-| `griefprevention.abandonclaim` | `/abandonclaim` | Abandon a claim. |
-| `griefprevention.abandontoplevelclaim` | `/abandontoplevelclaim` | Abandon a claim and all its subdivisions. |
-| `griefprevention.extendclaim` | `/extendclaim` | Resize a claim by pushing/pulling a boundary. |
-| `griefprevention.subdivideclaims` | `/subdivideclaims` | Switch to 2D subdivision mode. |
-| `griefprevention.restrictsubclaim` | `/restrictsubclaim` | Restrict a subclaim from inheriting parent permissions. |
-| `griefprevention.basicclaims` | `/basicclaims` | Switch to basic claims mode. |
-| `griefprevention.claimexplosions` | `/claimexplosions` | Toggle explosions in a claim. |
-| `griefprevention.checkclaimexpiry` | `/checkclaimexpiry` | View claim expiration details. |
-| `griefprevention.shapedclaims` | `/shapedclaims` | Switch to shaped (non-rectangular) claims mode. |
-| `griefprevention.3dsubdivideclaims` | `/3dsubdivideclaims` | Switch to 3D subdivision mode. |
-| `griefprevention.buysellclaimblocks` | `/buyclaimblocks`, `/sellclaimblocks` | Buy/sell claim blocks for currency. |
-| `griefprevention.witherexplosions` | `/witherexplosions` | Toggle wither explosions in a claim. |
-| `griefprevention.unlockdrops` | `/unlockdrops` | Allow others to pick up your death drops. |
-| `griefprevention.trapped` | `/trapped` | Teleport out of a claim you can't build in. |
-| `griefprevention.givepet` | `/givepet` | Give away a tamed pet. |
-| `griefprevention.createclaims` | *(shovel)* | Create new claims with the golden shovel. |
-| `griefprevention.accruals` | *(passive)* | Accrue claim blocks at the configured hourly rate. |
-| `griefprevention.ignore` | `/ignore`, `/unignore`, `/ignorelist` | Ignore/unignore players in chat. |
-| `griefprevention.abandonallclaims` | `/abandonallclaims` | Abandon all your claims at once. |
-
-**Example — disable only `/3dsubdivideclaims` for a group:**
-
-    :::yaml
-    # LuckPerms example
-    /lp permission set griefprevention.3dsubdivideclaims false
-Players in that group will still have access to all other claim commands via `griefprevention.claims: true`, but `/3dsubdivideclaims` will be denied.
-
-## Admin Permissions (default: `op`)
-
-| Permission | Default | Description |
-|---|---|---|
-| `griefprevention.adminclaims` | `op` | Create, delete, and build in administrative claims. |
-| `griefprevention.adminclaims.convert` | `op` | **GP3D addition.** Use `/makeadmin` and `/makebasic` to convert claims between basic and admin ownership. |
-| `griefprevention.claimslistother` | `op` | Access `/claimslist &amp;lt;player&amp;gt;` for other players. |
-| `griefprevention.ignoreclaims` | `op` | Allows `/ignoreclaims` admin override mode. |
-| `griefprevention.deleteclaims` | `op` | Delete and resize other players' claims. |
-| `griefprevention.deleteclaimsinworld` | `op` | Allows `/deleteclaimsinworld` and `/deleteuserclaimsinworld`. |
-| `griefprevention.transferclaim` | `op` | Allows `/transferclaim`. |
-| `griefprevention.adjustclaimblocks` | `op` | Adjust bonus claim blocks, set accrued blocks. |
-| `griefprevention.restorenature` | `op` | Allows `/restorenature`. |
-| `griefprevention.restorenatureaggressive` | `op` | Allows `/restorenatureaggressive` and `/restorenaturefill`. |
-| `griefprevention.softmute` | `op` | Allows `/softmute`. |
-| `griefprevention.separate` | `op` | Allows `/separate` and `/unseparate`. |
-| `griefprevention.claimbook` | `op` | Allows `/claimbook`. |
-| `griefprevention.unlockothersdrops` | `op` | Allows `/unlockdrops &amp;lt;player&amp;gt;`. |
-| `griefprevention.reload` | `op` | Allows `/gpreload`. |
-| `griefprevention.visualizenearbyclaims` | `op` | Shift+right-click with the investigation tool to see all nearby claims. |
-| `griefprevention.seeclaimsize` | `op` | See another player's claim size with the investigation tool. |
-| `griefprevention.seeinactivity` | `op` | See how long a claim owner has been offline via the investigation tool. |
-| `griefprevention.overrideclaimcountlimit` | `op` | Bypass the total claim-count limit. |
-| `griefprevention.spam` | `op` | Bypass spam protection. |
-| `griefprevention.lava` | `op` | Place lava where they have build permission (still not near other players). |
-| `griefprevention.notignorable` | `op` | Cannot be ignored via `/ignore`. |
-
-## Eavesdrop Permissions
-
-GP3D splits the single upstream `griefprevention.eavesdrop` permission into finer-grained nodes. All default `op`.
-
-| Permission | Default | Description |
-|---|---|---|
-| `griefprevention.eavesdrop` | `op` | Blanket / legacy permission — grants PM and softmute eavesdropping. |
-| `griefprevention.eavesdrop.pm` | `op` | **GP3D addition.** See private (`/tell`-style) messages only. |
-| `griefprevention.eavesdrop.softmute` | `op` | **GP3D addition.** See soft-muted messages only. |
-| `griefprevention.eavesdrop.signs` | `op` | See newly-placed signs as chat messages. |
-| `griefprevention.eavesdrop.immune` | `op` | Exempt from being eavesdropped (for staff who need privacy). |
-| `griefprevention.eavesdropimmune` | `op` | Legacy alias for the above — players with this can't have their PMs eavesdropped. |
-
-## Other / Feature Permissions
-
-| Permission | Default | Description |
-|---|---|---|
-| `griefprevention.checkclaimexpiry` | `false` | Allows `/checkclaimexpiry`. |
-| `griefprevention.premovementchat` | `false` | Chat before moving (bypasses anti-bot delay). |
-| `griefprevention.extendclaim.toolbypass` | `false` | Use `/extendclaim` without holding the modification tool. |
-| `griefprevention.deathblow` | — | Bundled in `griefprevention.admin.*`. |
-
-## Permission Bundle
-
-`griefprevention.admin.*` is a convenience node that grants the full admin bundle:
-
-- `griefprevention.ignoreclaims`
-- `griefprevention.adminclaims`
-- `griefprevention.adminclaims.convert`
-- `griefprevention.adjustclaimblocks`
-- `griefprevention.deleteclaims`
-- `griefprevention.spam`
-- `griefprevention.lava`
-- `griefprevention.eavesdrop`
-- `griefprevention.deathblow`
-- `griefprevention.softmute`
-- `griefprevention.reload`
-- `griefprevention.visualizenearbyclaims`
-- `griefprevention.overrideclaimcountlimit`
-- `griefprevention.transferclaim`
-- `griefprevention.claimslistother`
-- `griefprevention.separate`
-- `griefprevention.eavesdrop.signs`
-- `griefprevention.eavesdrop.pm`
-- `griefprevention.eavesdrop.softmute`
-- `griefprevention.eavesdrop.immune`
-- `griefprevention.claimbook`
-- `griefprevention.notignorable`
-- `griefprevention.seeinactivity`
-- `griefprevention.deleteclaimsinworld`
-- `griefprevention.unlockothersdrops`
-- `griefprevention.seeclaimsize`
-- `griefprevention.restorenature`
-- `griefprevention.restorenatureaggressive`
-
-Grant this to senior staff who need everything. Use the narrower nodes for junior staff with scoped responsibilities.
-
-# Placeholders (PlaceholderAPI)
-
-GriefPrevention3D provides its own PlaceholderAPI expansion with identifier `gp3d`. These placeholders can be used in any plugin that supports PlaceholderAPI (chat plugins, scoreboards, holograms, TAB, etc.).
-
-In addition, GriefPrevention's official PlaceholderAPI expansion can be installed from the PlaceholderAPI eCloud to provide claim block and owner placeholders.
-
-## Installation
-
-### GriefPrevention3D placeholders
-
-No setup is required. GriefPrevention3D automatically registers its PlaceholderAPI expansion on startup.
-
-* **Expansion ID:** `gp3d`
-* **Persists:** Yes
-
-### Additional GriefPrevention placeholders
-
-Install the official GriefPrevention PlaceholderAPI expansion:
-
-    :::text
-    /papi ecloud download GriefPrevention
-    /papi reload
-
-* **Expansion ID:** `griefprevention`
-
----
-
-# GriefPrevention3D Placeholders
-
-## Available Placeholders
-
-| Placeholder                | Description                                                 | Example Output                                                                 |
-| -------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------ |
-| `%gp3d_in_subdivision%`    | Whether the player is inside a subdivision (child claim)    | `true` / `false`                                                               |
-| `%gp3d_in_3d_subdivision%` | Whether the player is inside a 3D subdivision               | `true` / `false`                                                               |
-| `%gp3d_is_trusted%`        | Whether the player has any trust level in the current claim | `true` / `false`                                                               |
-| `%gp3d_trust_level%`       | The player's trust level in the current claim (localized)   | `Owner`, `Manager`, `Builder`, `Container`, `Access`, `Untrusted`, `Unclaimed` |
-
-## Trust Level Values
-
-The `%gp3d_trust_level%` placeholder returns a localized string based on the player's trust in the current claim.
-
-| Trust Level | Description                                                           |
-| ----------- | --------------------------------------------------------------------- |
-| `Owner`     | Player owns the claim                                                 |
-| `Manager`   | Player has Manage trust (can manage claim settings and trust others)  |
-| `Builder`   | Player has Build trust (can build and break blocks)                   |
-| `Container` | Player has Container trust (can access containers)                    |
-| `Access`    | Player has Access trust (can use doors, buttons, and enter the claim) |
-| `Untrusted` | Player is inside a claim but has no trust                             |
-| `Unclaimed` | Player is not standing inside a claim                                 |
-
----
-
-# GriefPrevention Placeholders
-
-These placeholders are provided by PlaceholderAPI's GriefPrevention expansion.
-
-## Claim Statistics
-
-| Placeholder                                   | Description                                    | Example Output |
-| --------------------------------------------- | ---------------------------------------------- | -------------- |
-| `%griefprevention_claims%`                    | Number of claims the player owns               | `5`            |
-| `%griefprevention_claims_formatted%`          | Formatted claim count                          | `5`            |
-| `%griefprevention_bonusclaims%`               | Player's bonus claim blocks                    | `1000`         |
-| `%griefprevention_bonusclaims_formatted%`     | Formatted bonus claim blocks                   | `1,000`        |
-| `%griefprevention_accruedclaims%`             | Player's accrued claim blocks                  | `2500`         |
-| `%griefprevention_accruedclaims_formatted%`   | Formatted accrued claim blocks                 | `2,500`        |
-| `%griefprevention_remainingclaims%`           | Remaining claim blocks available to the player | `3200`         |
-| `%griefprevention_remainingclaims_formatted%` | Formatted remaining claim blocks               | `3,200`        |
-
-## Current Claim Information
-
-| Placeholder                                      | Description                                            | Example Output |
-| ------------------------------------------------ | ------------------------------------------------------ | -------------- |
-| `%griefprevention_currentclaim_ownername%`       | Owner of the claim the player is currently standing in | `Steve`        |
-| `%griefprevention_currentclaim_ownername_color%` | Owner name with Minecraft colors applied               | `§aSteve`      |
-
----
-
-# Usage Examples
-
-## Chat Plugins
-
-Example (EssentialsChat, ChatControl, etc.):
-
-    :::text
-    Format: "{prefix} &amp;lt;player&amp;gt; %gp3d_trust_level%"
-
-Result:
-
-    :::text
-    [Member] &amp;lt;steve&amp;gt; Builder
-
----
-
-## Holograms
-
-Example (HolographicDisplays):
-
-    :::text
-    Line 1: "&amp;amp;bCurrent Claim Status"
-    Line 2: "&amp;amp;eTrust: &amp;amp;f%gp3d_trust_level%"
-    Line 3: "&amp;amp;eClaim Blocks: &amp;amp;f%griefprevention_remainingclaims_formatted%"
-    Line 4: "&amp;amp;eOwner: &amp;amp;f%griefprevention_currentclaim_ownername%"
-    Line 5: "&amp;amp;eIn Subdivision: &amp;amp;f%gp3d_in_subdivision%"
-    Line 6: "&amp;amp;eIn 3D Subdivision: &amp;amp;f%gp3d_in_3d_subdivision%"
-
----
-
-## Scoreboards
-
-Example:
-
-    :::text
-    Title: "&amp;amp;6Claim Info"
-    Line 1: "&amp;amp;eTrust: &amp;amp;f%gp3d_trust_level%"
-    Line 2: "&amp;amp;eClaim Blocks: &amp;amp;f%griefprevention_remainingclaims_formatted%"
-    Line 3: "&amp;amp;eOwner: &amp;amp;f%griefprevention_currentclaim_ownername%"
-    Line 4: "&amp;amp;eSub: &amp;amp;f%gp3d_in_subdivision%"
-    Line 5: "&amp;amp;e3D Sub: &amp;amp;f%gp3d_in_3d_subdivision%"
-
----
-
-# Localization
-
-The trust level strings returned by `%gp3d_trust_level%` are fully localizable through `messages.yml`:
-
-    :::yaml
-    Messages:
-      PlaceholderTrustLevelUnclaimed: "Unclaimed"
-      PlaceholderTrustLevelOwner: "Owner"
-      PlaceholderTrustLevelManager: "Manager"
-      PlaceholderTrustLevelBuilder: "Builder"
-      PlaceholderTrustLevelContainer: "Container"
-      PlaceholderTrustLevelAccess: "Access"
-      PlaceholderTrustLevelUntrusted: "Untrusted"
-
----
-
-# Notes
-
-* GriefPrevention3D automatically registers its PlaceholderAPI expansion.
-* `%gp3d_trust_level%` uses localized strings from `messages.yml`.
-* Player-specific placeholders require the target player to be online.
-* GriefPrevention3D uses `persist() = true`, allowing placeholders to remain available across PlaceholderAPI reloads.
-* Both `gp3d` and `griefprevention` placeholders can be used together in any PlaceholderAPI-compatible plugin.
-
-### GriefPrevention3D Wiki
-
-**Getting Started**
-- [Home](Home)
-- [Getting Started](Getting-Started)
-- [Migration](Migration)
-- [Locale](Locale)
-
-**Features**
-- [Key Features](Key-Features)
-- [3D Subdivisions](Key-Features#3d-subdivisions)
-- [Shaped Claims](Key-Features#shaped-claims)
-- [Nested Subclaims](Key-Features#nested-subclaims)
-- [Visualization Glow](Key-Features#visualization-glow)
-- [Unified `/claim` Handler](Key-Features#unified-command-handler)
-- [Claim Selection](Key-Features#claim-selection)
-- [Boundary Violation Alerts](Administrator-Guide#boundary-violation-alerts)
-
-**Reference**
-- [Commands](Commands)
-- [Permissions](Permissions)
-- [Configuration](Configuration)
-- [Placeholders](Placeholders)
-- [API Documentation](API)
-
-**Admin**
-- [Administrator's Guide](Administrator-Guide)
-- [`/makeadmin` and `/makebasic`](Administrator-Guide#converting-claims-between-admin-and-basic)
&amp;lt;/steve&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/subcommand&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/subcommand&amp;gt;&lt;/b&gt;&lt;/a&gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/amount&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/amount&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/price&amp;gt;&amp;lt;/string&amp;gt;&amp;lt;/tab&amp;gt;&amp;lt;/string&amp;gt;&amp;lt;/price&amp;gt;&amp;lt;/string&amp;gt;&amp;lt;/string&amp;gt;&amp;lt;/string&amp;gt;&amp;lt;/string&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/uuid,&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/group&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&lt;/pre&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jack Korte</dc:creator><pubDate>Thu, 02 Jul 2026 13:04:31 -0000</pubDate><guid>https://sourceforge.net31c0d672accc977979d358237f57f031b9891f5e</guid></item><item><title>Key Features modified by Jack Korte</title><link>https://sourceforge.net/p/griefprevention3d/wiki/Key%2520Features/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v4
+++ v5
@@ -1,3 +1,1341 @@
+
+# Release work
+!wiki/
+.release/old/
+.modrinth/
+

+  [View Docs](https://github.com/castledking/GriefPrevention3D/blob/master/src/main/resources/alias.yml)
+
+- **Neighbor Trust &amp;amp; Minimum Distance**
+  ```
+  GriefPrevention:
+    Claims:
+      MinimumDistance: 0
+  ```
+  Enforce a minimum distance between top-level claims to prevent claim spam and overcrowding. When set, players cannot create claims within the configured distance of another player's claim.
+  - `/claim trust &amp;lt;player&amp;gt; neighbor` — Grant a player neighbor trust so they can bypass minimum distance checks for your claims.
+  - `/neighbortrust &amp;lt;player&amp;gt;` (alias: `/distancetrust &amp;lt;player&amp;gt;`) — Standalone command for the same purpose.
+  - `/claim distance check` — Show the configured minimum distance and list nearby claims.
+  - `/claim distance toggle` — While standing in your own claim, toggle whether ALL players can bypass minimum distance for that claim.
+  - Existing nearby claims auto-grant neighbor trust to each other, cleaned up automatically when claims are abandoned.
+
+- **Wither Explosion Toggle**
+  `/witherexplosions`
+  Use this command to toggle wither explosions inside your claim.
+                || cmd.getName().equalsIgnoreCase("expandclaim")
+                || cmd.getName().equalsIgnoreCase("resizeclaim")) &amp;amp;&amp;amp; player != null) {
+            if (!player.hasPermission("griefprevention.extendclaim")) {
+                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
+                return true;
+            }
+            return this.handleExtendClaimCommand(player, args);
+        }
+
+        // abandonclaim
+        if (cmd.getName().equalsIgnoreCase("abandonclaim") &amp;amp;&amp;amp; player != null) {
+            if (!player.hasPermission("griefprevention.abandonclaim")) {
+                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
+                return true;
+            }
+            return this.abandonClaimHandler(player, false);
+        }
+
+        // abandontoplevelclaim
+        if (cmd.getName().equalsIgnoreCase("abandontoplevelclaim") &amp;amp;&amp;amp; player != null) {
+            if (!player.hasPermission("griefprevention.abandontoplevelclaim")) {
+                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
+                return true;
+            }
+            return this.abandonClaimHandler(player, true);
+        }
+
+        // abandonallclaims
+        else if (cmd.getName().equalsIgnoreCase("abandonallclaims") &amp;amp;&amp;amp; player != null) {
+            if (!player.hasPermission("griefprevention.abandonallclaims")) {
+                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
+                return true;
+            }
+            if (args.length &amp;gt; 1)
+                return false;
+
+        // trust &amp;lt;player&amp;gt;
+        else if (cmd.getName().equalsIgnoreCase("trust") &amp;amp;&amp;amp; player != null) {
+            if (!player.hasPermission("griefprevention.trust")) {
+                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
+                return true;
+            }
+            // requires exactly one parameter, the other player's name
+            if (args.length != 1)
+                return false;
+        // untrust &amp;lt;player&amp;gt; or untrust [&amp;lt;group&amp;gt;]
+        else if (cmd.getName().equalsIgnoreCase("untrust") &amp;amp;&amp;amp; player != null) {
+            if (!player.hasPermission("griefprevention.untrust")) {
+                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
+                return true;
+            }
+            // requires exactly one parameter, the other player's name
+            if (args.length != 1)
+                return false;
+        // accesstrust &amp;lt;player&amp;gt;
+        else if (cmd.getName().equalsIgnoreCase("accesstrust") &amp;amp;&amp;amp; player != null) {
+            if (!player.hasPermission("griefprevention.accesstrust")) {
+                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
+                return true;
+            }
+            // requires exactly one parameter, the other player's name
+            if (args.length != 1)
+                return false;
+        // containertrust &amp;lt;player&amp;gt;
+        else if (cmd.getName().equalsIgnoreCase("containertrust") &amp;amp;&amp;amp; player != null) {
+            if (!player.hasPermission("griefprevention.containertrust")) {
+                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
+                return true;
+            }
+            // requires exactly one parameter, the other player's name
+            if (args.length != 1)
+                return false;
+        // permissiontrust &amp;lt;player&amp;gt;
+        else if (cmd.getName().equalsIgnoreCase("permissiontrust") &amp;amp;&amp;amp; player != null) {
+            if (!player.hasPermission("griefprevention.permissiontrust")) {
+                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
+                return true;
+            }
+            // requires exactly one parameter, the other player's name
+            if (args.length != 1) return false;
+
+        // restrictsubclaim
+        else if (cmd.getName().equalsIgnoreCase("restrictsubclaim") &amp;amp;&amp;amp; player != null) {
+            if (!player.hasPermission("griefprevention.restrictsubclaim")) {
+                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
+                return true;
+            }
+            return this.handleRestrictSubclaimCommand(player, new String[]{});
+        }
+
+        // basicclaims
+        else if (cmd.getName().equalsIgnoreCase("basicclaims") &amp;amp;&amp;amp; player != null) {
+            if (!player.hasPermission("griefprevention.basicclaims")) {
+                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
+                return true;
+            }
+            PlayerData playerData = this.dataStore.getPlayerData(player.getUniqueId());
+            playerData.shovelMode = ShovelMode.Basic;
+            playerData.claimSubdividing = null;
+        // subdivideclaims
+        else if (cmd.getName().equalsIgnoreCase("subdivideclaims") &amp;amp;&amp;amp; player != null) {
+            if (!player.hasPermission("griefprevention.subdivideclaims")) {
+                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
+                return true;
+            }
+            PlayerData playerData = this.dataStore.getPlayerData(player.getUniqueId());
+            playerData.shovelMode = ShovelMode.Subdivide;
+            playerData.claimSubdividing = null;
+            return true;
+        } else if (cmd.getName().equalsIgnoreCase("claimexplosions") &amp;amp;&amp;amp; player != null) {
+            if (!player.hasPermission("griefprevention.claimexplosions")) {
+                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
+                return true;
+            }
+            return this.handleClaimExplosionsCommand(sender, args);
+        } else if (cmd.getName().equalsIgnoreCase("witherexplosions") &amp;amp;&amp;amp; player != null) {
+            if (!player.hasPermission("griefprevention.witherexplosions")) {
+                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
+                return true;
+            }
+            return this.handleWitherExplosionsCommand(sender, args);
+        }
+
+        // neighbortrust &amp;lt;player&amp;gt;
+        else if (cmd.getName().equalsIgnoreCase("neighbortrust") &amp;amp;&amp;amp; player != null) {
+            if (!player.hasPermission("griefprevention.neighbortrust")) {
+                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
+                return true;
+            }
+            if (args.length != 1)
+                return false;
+            return this.handleNeighborTrustCommand(sender, args);
+        // checkclaimdistance
+        else if (cmd.getName().equalsIgnoreCase("checkclaimdistance") &amp;amp;&amp;amp; player != null) {
+            if (!player.hasPermission("griefprevention.checkclaimdistance")) {
+                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
+                return true;
+            }
+            return this.handleCheckClaimDistanceCommand(sender, args);
+        }
+
+        // toggleclaimdistance
+        else if (cmd.getName().equalsIgnoreCase("toggleclaimdistance") &amp;amp;&amp;amp; player != null) {
+            if (!player.hasPermission("griefprevention.toggleclaimdistance")) {
+                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
+                return true;
+            }
+            return this.handleToggleClaimDistanceCommand(sender, args);
+        }
+
+        // givepet
+        else if (cmd.getName().equalsIgnoreCase("givepet") &amp;amp;&amp;amp; player != null) {
+            if (!player.hasPermission("griefprevention.givepet")) {
+                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
+                return true;
+            }
+            //requires one parameter
+            if (args.length &amp;lt; 1) return false;
+
+        // ignoreplayer
+        else if (cmd.getName().equalsIgnoreCase("ignoreplayer") &amp;amp;&amp;amp; player != null) {
+            if (!player.hasPermission("griefprevention.ignore")) {
+                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
+                return true;
+            }
+            // requires target player name
+            if (args.length &amp;lt; 1)
+                return false;
+        // unignoreplayer
+        else if (cmd.getName().equalsIgnoreCase("unignoreplayer") &amp;amp;&amp;amp; player != null) {
+            if (!player.hasPermission("griefprevention.ignore")) {
+                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
+                return true;
+            }
+            // requires target player name
+            if (args.length &amp;lt; 1)
+                return false;
+        // ignoredplayerlist
+        else if (cmd.getName().equalsIgnoreCase("ignoredplayerlist") &amp;amp;&amp;amp; player != null) {
+            if (!player.hasPermission("griefprevention.ignore")) {
+                GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
+                return true;
+            }
+            PlayerData playerData = this.dataStore.getPlayerData(player.getUniqueId());
+            StringBuilder builder = new StringBuilder();
+            for (Entry&amp;lt;uuid, boolean=""&amp;gt; entry : playerData.ignoredPlayers.entrySet()) {
+
+    public boolean handleClaimsListCommand(CommandSender sender, String[] args) {
+        if (!(sender instanceof Player))
+            return false;
+        Player player = (Player) sender;
+        if (!player.hasPermission("griefprevention.claimslist")) {
+            GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
+            return true;
+        }
+
+        OfflinePlayer otherPlayer = player;
+        if (args.length &amp;gt; 0 &amp;amp;&amp;amp; player.hasPermission("griefprevention.claimslistother")) {
+                    return true;
+                }
+                if (!player.hasPermission("griefprevention.3dsubdivideclaims")) {
+                    GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
+                    return true;
+                }
+            return false;
+        Player player = (Player) sender;
+        if (!player.hasPermission("griefprevention.unlockdrops")) {
+            GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
+            return true;
+        }
+
+        PlayerData playerData = this.dataStore.getPlayerData(player.getUniqueId());
+
+            return false;
+        Player player = (Player) sender;
+        if (!player.hasPermission("griefprevention.trapped")) {
+            GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoPermissionForCommand);
+            return true;
+        }
+
+        PlayerData playerData = this.dataStore.getPlayerData(player.getUniqueId());
+        Claim claim = this.dataStore.getClaimAt(player.getLocation(), false, playerData.lastClaim);
+&lt;p align="center"&gt;
+&lt;img alt="GriefPrevention3D" height="auto" rel="nofollow" src="https://repository-images.githubusercontent.com/1022939485/98eef4fa-4d0c-47c8-83f6-78f2e2112927" width="100%"/&gt;
+&lt;/p&gt;
+
+# &lt;p align="center"&gt;The self-service anti-griefing plugin for Minecraft servers — now with full 3D subdivisions&lt;/p&gt;
+
+&lt;p align="center"&gt;
+  &lt;a href="https://discord.com/invite/pCKdCX6nYr" rel="nofollow"&gt;&lt;img alt="Discord" rel="nofollow" src="https://img.shields.io/badge/Discord-Community-5865F2?style=for-the-badge&amp;amp;logo=discord&amp;amp;logoColor=white"/&gt;&lt;/a&gt;
+  &lt;a href="https://github.com/castledking/GriefPrevention3D" rel="nofollow"&gt;&lt;img alt="GitHub Repository" rel="nofollow" src="https://img.shields.io/badge/GitHub-Repository-181717?style=for-the-badge&amp;amp;logo=github"/&gt;&lt;/a&gt;
+  &lt;a href="https://github.com/castledking/GriefPrevention3D/issues" rel="nofollow"&gt;&lt;img alt="GitHub Issues" rel="nofollow" src="https://img.shields.io/badge/GitHub-Issues-181717?style=for-the-badge&amp;amp;logo=github"/&gt;&lt;/a&gt;
+  &lt;a href="https://github.com/castledking/GriefPrevention3D/wiki" rel="nofollow"&gt;&lt;img alt="GitHub Wiki" rel="nofollow" src="https://img.shields.io/badge/GitHub-Wiki-181717?style=for-the-badge&amp;amp;logo=github"/&gt;&lt;/a&gt;
+&lt;/p&gt;
+
+Stop _responding_ to grief and prevent it instead. GriefPrevention stops grief before it starts automatically without any effort from administrators, and with very little (self service) effort from players.
+
+**GriefPrevention3D** is a fork of the popular **GriefPrevention** plugin that adds full 3D subdivision support to land claims. Players can now create subdivisions with precise height boundaries for more complex builds.
+
+##### [Watch this video](https://www.youtube.com/watch?v=hKrA6NXn7Sc) to learn more how GriefPrevention works in-game.
+[![GriefPrevention Youtube Tutorial](https://img.youtube.com/vi/hKrA6NXn7Sc/0.jpg)](https://www.youtube.com/watch?v=hKrA6NXn7Sc)
+
+---
+
+## Key Features
+
+- **3D Subdivisions**
+  Create subdivisions with exact Y-level boundaries.
+  `/3dsubdivideclaims`
+  Use this command to switch to 3D subdivision mode.
+
+- **3D Admin Claims**
+  Create free, height-bounded administrative claims with exact Y coordinates.
+  `/3dadminclaims`
+  Use this command or `/aclaim mode admin3d` to switch to 3D admin claim mode.
+  Requires the `griefprevention.adminclaims` permission.
+
+- **Shaped Claims**
+  ```
+  AllowShapedClaims: false
+  ```
+  Set to **true** to enable non-rectangular claims.
+  `/shapedclaims`
+  Use this command to switch to the shaped claims mode.
+
+- **Nested Subclaims**
+  ```
+  AllowNestedSubClaims: false
+  ```
+  Set to **true** to allow subdivisions inside other subdivisions.
+
+- **Visualization Glow**
+  ```
+  VisualizationGlow: false
+  ```
+  Set to **true** to enable glowing claim boundary visualization. (Requires 1.19.3+)
+
+- **Unified Command Handler**
+  In **GriefPreventionData/alias.yml**:
+  ```
+  enabled: true
+  ```
+  Provides unified commands like:
+  `/claim create`
+  `/claim trust`
+  `/claim abandon`
+  [View Docs](https://github.com/castledking/GriefPrevention3D/blob/master/src/main/resources/alias.yml)
+
+- **Neighbor Trust &amp;amp; Minimum Distance**
+  ```
+  GriefPrevention:
+    Claims:
+      MinimumDistance: 0
+  ```
+  Enforce a minimum distance between top-level claims to prevent claim spam and overcrowding. When set, players cannot create claims within the configured distance of another player's claim.
+  - `/claim trust &amp;lt;player&amp;gt; neighbor` — Grant a player neighbor trust so they can bypass minimum distance checks for your claims.
+  - `/neighbortrust &amp;lt;player&amp;gt;` (alias: `/distancetrust &amp;lt;player&amp;gt;`) — Standalone command for the same purpose.
+  - `/claim distance check` — Show the configured minimum distance and list nearby claims.
+  - `/claim distance toggle` — While standing in your own claim, toggle whether ALL players can bypass minimum distance for that claim.
+  - Existing nearby claims auto-grant neighbor trust to each other, cleaned up automatically when claims are abandoned.
+
+- **Wither Explosion Toggle**
+  `/witherexplosions`
+  Use this command to toggle wither explosions inside your claim.
+
+- **Subtle Changes**
+  - Resizing a claim now selects it and is accessible using common commands like `/claim abandon` or `/claim trust` during that resize session
+  - `/restrictsubclaim` while standing in main claims now instantly restricts all subdivisions inside
+  - `/trustlist` now shows inherited permissions
+  - Split the `griefprevention.eavesdrop` permission to `griefprevention.eavesdrop.pm` &amp;amp; `griefprevention.eavesdrop.softmute` for more granular permission control
+  - Various bug fixes and quality-of-life improvements
+  - Full compatibility with original GriefPrevention features
+  - Works with Spigot, Paper, Purpur, and Folia
+  - Maintains all anti-grief protections
+
+## Supported Platforms: Spigot, Paper, Purpur, and Folia.
+### GriefPrevention3D targets and supports 1.8 - latest available version of these platforms.
+
+## Download
+### [⬇ Download the GriefPrevention3D.jar plugin here.](https://github.com/castledking/GriefPrevention3D/releases)
+
+## Documentation
+For usage instructions, see the official [GriefPrevention3D Documentation](https://github.com/castledking/GriefPrevention3D/wiki).
+
+
+## Addons
+### [Addons](https://r.griefprevention.com/addons) provide additional features to GriefPrevention. Some of these addons are listed in [GitHub Discussions](https://r.griefprevention.com/addons)
+
+## Support
+- [📖 Documentation](https://github.com/castledking/GriefPrevention3D/wiki) - Learn how GriefPrevention3D works. Contains answers to most questions.
+- [Issue Tracker](https://github.com/castledking/GriefPrevention3D/issues) - Report problems or bugs on the issue tracker. Check if someone else reported your issue before posting.
+- [GitHub Discussions](https://github.com/castledking/GriefPrevention3D/discussions) - New ideas, feature requests, or other general discussions.
+- [Discord Community](https://discord.com/invite/pCKdCX6nYr)
+
+## Original Plugin
+This is a fork of [GriefPrevention](https://www.spigotmc.org/resources/griefprevention.1884/) by RoboMWM.
+
+---
+
+[![Weird flex but ok](https://bstats.org/signatures/bukkit/GriefPrevention-legacy.svg)](https://bstats.org/plugin/bukkit/GriefPrevention-legacy)
+
+# API Documentation
+
+Documentation for developers working with the GriefPrevention3D API. Please feel free to help add to this page.
+
+## Table of Contents
+
+- [Adding GriefPrevention3D as a Dependency](#adding-griefprevention3d-as-a-dependency)
+- [Common Operations](#common-operations)
+  - [Getting the Claim at a Location](#getting-the-claim-at-a-location)
+  - [Managing Permissions in a Claim](#managing-permissions-in-a-claim)
+  - [Creating a New Claim](#creating-a-new-claim)
+  - [Resizing or Moving a Claim](#resizing-or-moving-a-claim)
+  - [Extending a Claim Downward](#extending-a-claim-downward)
+  - [Changing a Claim's Owner](#changing-a-claims-owner)
+  - [Uniquely Identifying a Claim](#uniquely-identifying-a-claim)
+  - [Getting / Updating Player Data](#getting--updating-player-data)
+- [3D Subdivisions API](#3d-subdivisions-api)
+  - [World Y Boundaries](#world-y-boundaries)
+  - [Claim Y Boundaries](#claim-y-boundaries)
+  - [Detailed Claim Y Information (`ClaimYInfo`)](#detailed-claim-y-information-claimyinfo)
+  - [Checking Y Containment](#checking-y-containment)
+- [Command Addon API](#command-addon-api)
+  - [`ClaimCommandAddon` Interface](#claimcommandaddon-interface)
+  - [`ClaimCommandContext`](#claimcommandcontext)
+  - [Registering Your Addon](#registering-your-addon)
+  - [Full Example](#full-example)
+- [Events](#events)
+
+---
+
+## Adding GriefPrevention3D as a Dependency
+
+GriefPrevention3D is hosted on JitPack, which exposes the repo as a public Maven artifact on demand.
+
+### Maven
+
+    :::xml
+    &amp;lt;repositories&amp;gt;
+        &amp;lt;repository&amp;gt;
+            &amp;lt;id&amp;gt;jitpack.io&amp;lt;/id&amp;gt;
+            &amp;lt;url&amp;gt;https://jitpack.io&amp;lt;/url&amp;gt;
+        &amp;lt;/repository&amp;gt;
+    &amp;lt;/repositories&amp;gt;
+    
+    &amp;lt;dependency&amp;gt;
+        &amp;lt;groupid&amp;gt;com.github.castledking&amp;lt;/groupid&amp;gt;
+        &amp;lt;artifactid&amp;gt;GriefPrevention3D&amp;lt;/artifactid&amp;gt;
+        &amp;lt;version&amp;gt;17.3.6&amp;lt;/version&amp;gt;
+        &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
+    &amp;lt;/dependency&amp;gt;
+
+&amp;gt; Replace `17.3.6` with the release tag you want to build against, or with a short commit hash for snapshot-style builds. See the JitPack page for the full list of buildable versions.
+
+### Gradle (Groovy)
+
+    :::groovy
+    repositories {
+        maven { url 'https://jitpack.io' }
+    }
+    
+    dependencies {
+        compileOnly 'com.github.castledking:GriefPrevention3D:17.3.6'
+    }
+
+### Gradle (Kotlin DSL)
+
+    :::kotlin
+    repositories {
+        maven("https://jitpack.io")
+    }
+    
+    dependencies {
+        compileOnly("com.github.castledking:GriefPrevention3D:17.3.6")
+    }
+
+### SBT / Leiningen
+
+See the JitPack page for the project: `https://jitpack.io/#castledking/GriefPrevention3D/`
+
+### plugin.yml
+
+Always declare `GriefPrevention` as either a `depend` or `softdepend` in your addon's `plugin.yml`:
+
+    :::yaml
+    softdepend: [GriefPrevention]
+
+Use `depend` only if your plugin cannot load without it.
+
+---
+
+## Common Operations
+
+&amp;gt; These operations all exist on upstream GriefPrevention too, and work the same way on GP3D. The notable GP3D-specific additions are the 3D subdivision API below.
+
+### Getting the Claim at a Location
+
+    :::java
+    import me.ryanhamshire.GriefPrevention.Claim;
+    import me.ryanhamshire.GriefPrevention.GriefPrevention;
+    
+    Claim claim = GriefPrevention.instance.dataStore.getClaimAt(
+            location,
+            /* ignoreHeight = */ false,
+            /* cachedClaim = */ null);
+
+- `ignoreHeight = false` makes Y matter (needed for 3D subdivisions).
+- Pass a previously-returned `Claim` as `cachedClaim` to speed up repeated lookups in the same area.
+- Returns `null` if the location is in wilderness.
+
+### Managing Permissions in a Claim
+
+Permissions are expressed as `ClaimPermission` values:
+
+    :::java
+    import me.ryanhamshire.GriefPrevention.ClaimPermission;
+    import java.util.function.Supplier;
+    
+    Supplier&amp;lt;string&amp;gt; denialReason = claim.checkPermission(player, ClaimPermission.Build, event);
+    if (denialReason != null) {
+        player.sendMessage(denialReason.get());
+        event.setCancelled(true);
+    }
+
+`ClaimPermission.Edit &amp;gt; Manage &amp;gt; Build &amp;gt; Container &amp;gt; Access` — higher levels grant all lower levels.
+
+For unified location-based permission checks (the same logic GriefPrevention uses internally), prefer:
+
+    :::java
+    import com.griefprevention.protection.ProtectionHelper;
+    
+    Supplier&amp;lt;string&amp;gt; denial = ProtectionHelper.checkPermission(
+            player, location, ClaimPermission.Build, event);
+
+### Creating a New Claim
+
+    :::java
+    GriefPrevention.instance.dataStore.createClaim(
+            world,
+            x1, z1, x2, z2,              // corners
+            minY, maxY,                  // Y bounds (use world min/max for 2D)
+            ownerUuid,                   // null for admin claims
+            /* parent = */ null,
+            /* id = */ null,
+            /* creatingPlayer = */ player);
+
+Use `parent = someTopLevelClaim` to create a subdivision. Pass `id = null` to let the data store assign one.
+
+### Resizing or Moving a Claim
+
+    :::java
+    GriefPrevention.instance.dataStore.resizeClaim(
+            claim,
+            newX1, newZ1, newX2, newZ2,
+            newMinY, newMaxY,
+            resizingPlayer);
+
+Claim-block math is applied automatically for the owner.
+
+### Extending a Claim Downward
+
+    :::java
+    GriefPrevention.instance.dataStore.extendClaim(claim, newMinY);
+
+Useful for plugins that want to auto-extend a claim when players build below it.
+
+### Changing a Claim's Owner
+
+    :::java
+    GriefPrevention.instance.dataStore.changeClaimOwner(claim, newOwnerUuid);
+
+Pass `null` as the new owner to convert the claim to an administrative claim.
+
+### Uniquely Identifying a Claim
+
+    :::java
+    Long id = claim.getID();
+    Claim sameClaim = GriefPrevention.instance.dataStore.getClaim(id);
+
+Claim IDs are stable across reloads.
+
+### Getting / Updating Player Data
+
+    :::java
+    import me.ryanhamshire.GriefPrevention.PlayerData;
+    
+    PlayerData data = GriefPrevention.instance.dataStore.getPlayerData(player.getUniqueId());
+    int total = data.getAccruedClaimBlocks() + data.getBonusClaimBlocks();
+    
+    // Save after changes:
+    GriefPrevention.instance.dataStore.savePlayerData(player.getUniqueId(), data);
+
+---
+
+## 3D Subdivisions API
+
+GP3D extends the `Claim` object with Y-aware accessors so addons can query vertical boundaries uniformly, whether the claim is a full-height 2D claim or a Y-bounded 3D subdivision.
+
+### World Y Boundaries
+
+    :::java
+    int minY = GriefPrevention.getWorldMinY(world);  // e.g., -64 in 1.18+
+    int maxY = GriefPrevention.getWorldMaxY(world);  // e.g., 320 in 1.21
+
+These exist so you don't have to care about the 1.17→1.18 world-height change.
+
+### Claim Y Boundaries
+
+    :::java
+    int minY   = claim.getMinY();       // lowest Y the claim protects
+    int maxY   = claim.getMaxY();       // highest Y the claim protects
+    int height = claim.getYHeight();    // maxY - minY, in blocks
+    boolean is3D = claim.is3D();        // true if this claim has custom Y bounds
+    boolean inside = claim.containsY(y);
+
+Behavior by claim type:
+
+| Claim type | Y range |
+|---|---|
+| Top-level (basic) claim | Full world min → max Y |
+| Admin claim | Full world min → max Y |
+| 2D subdivision | Inherits parent's (world) Y range |
+| **3D subdivision** | **Own defined Y bounds** |
+
+### Detailed Claim Y Information (`ClaimYInfo`)
+
+For a richer description of the claim's Y shape, use `ClaimYInfo`:
+
+    :::java
+    Claim.ClaimYInfo yInfo = claim.getYInfo();
+    
+    yInfo.getMinY();       // int
+    yInfo.getMaxY();       // int
+    yInfo.getHeight();     // int
+    yInfo.is3D();          // boolean
+    yInfo.isSubdivision(); // boolean, true if this has a parent
+    yInfo.isAdminClaim();  // boolean
+    yInfo.getClaimType();  // human-readable, e.g. "3D Subdivision"
+
+`getClaimType()` returns one of:
+
+- `"Main Claim"`
+- `"Admin Claim"`
+- `"2D Subdivision"`
+- `"3D Subdivision"`
+- `"Admin 2D Subdivision"`
+- `"Admin 3D Subdivision"`
+
+`toString()` is implemented for quick debugging:
+
+    ClaimYInfo{type=3D Subdivision, minY=60, maxY=80, height=21}
+
+### Checking Y Containment
+
+    :::java
+    if (claim.containsY(block.getY())) {
+        // y is inside this claim's vertical range
+    }
+
+For non-3D claims this always returns `true`. For 3D claims it enforces the actual Y bounds.
+
+---
+
+## Command Addon API
+
+GP3D exposes a narrow addon seam that lets other plugins extend `/claim` and `/aclaim` tab completions and add their own subcommands — without having to fight the core for command ownership.
+
+The relevant classes live in `com.griefprevention.api`:
+
+- `ClaimCommandAddon` — the interface your addon implements.
+- `ClaimCommandAddonRegistry` — static entry point for registering addons.
+- `ClaimCommandContext` — the command-execution context passed to your handler.
+
+### `ClaimCommandAddon` Interface
+
+    :::java
+    package com.griefprevention.api;
+    
+    public interface ClaimCommandAddon {
+    
+        /**
+         * Additional tab completions for a known subcommand.
+         * Merged additively with GP3D's native completions.
+         */
+        List&amp;lt;string&amp;gt; getTabCompletions(
+                CommandSender sender,
+                String rootCommand,  // "claim" or "aclaim"
+                String subcommand,   // canonical name, e.g. "trust"
+                String[] args);      // args AFTER the subcommand
+    
+        /**
+         * Additional subcommand names shown when the user types just `/claim `.
+         * Use this to surface addon-provided subcommands in tab completion.
+         */
+        default List&amp;lt;string&amp;gt; getSubcommandCompletions(
+                CommandSender sender, String rootCommand) {
+            return List.of();
+        }
+    
+        /**
+         * Handle an addon-defined subcommand.
+         * Only called if GP3D does NOT already own the subcommand — core always wins.
+         *
+         * @return true if your addon handled the command; false to fall through.
+         */
+        default boolean handleSubcommand(ClaimCommandContext context) {
+            return false;
+        }
+    }
+
+### `ClaimCommandContext`
+
+Passed to `handleSubcommand`. Provides:
+
+    :::java
+    context.getSender();                  // CommandSender (usually Player)
+    context.getRootCommand();             // "claim" or "aclaim"
+    context.getSubcommand();              // the subcommand the user typed
+    context.getArgs();                    // args AFTER the subcommand (defensive copy)
+    context.getSelectedOrCurrentClaim();  // @Nullable Claim — selected claim or the
+                                          //                  claim the player is standing in
+
+`getSelectedOrCurrentClaim()` is the key piece — GP3D has already done the "selected claim, fallback to current claim" resolution for you, so your addon can just operate on that claim if it's non-null.
+
+### Registering Your Addon
+
+    :::java
+    import com.griefprevention.api.ClaimCommandAddonRegistry;
+    
+    public final class MyAddon extends JavaPlugin {
+    
+        private final MyClaimAddon hook = new MyClaimAddon();
+    
+        @Override
+        public void onEnable() {
+            ClaimCommandAddonRegistry.register(hook);
+        }
+    
+        @Override
+        public void onDisable() {
+            ClaimCommandAddonRegistry.unregister(hook);
+        }
+    }
+
+`register()` is idempotent — registering the same instance twice is a no-op. Always `unregister()` on disable to keep reloads clean.
+
+### Full Example
+
+A minimal `/claim sell &amp;lt;price&amp;gt;` addon:
+
+    :::java
+    import com.griefprevention.api.ClaimCommandAddon;
+    import com.griefprevention.api.ClaimCommandAddonRegistry;
+    import com.griefprevention.api.ClaimCommandContext;
+    import me.ryanhamshire.GriefPrevention.Claim;
+    import org.bukkit.ChatColor;
+    import org.bukkit.command.CommandSender;
+    import org.bukkit.entity.Player;
+    
+    import java.util.List;
+    import java.util.Objects;
+    
+    public final class SellClaimAddon implements ClaimCommandAddon {
+    
+        @Override
+        public List&amp;lt;string&amp;gt; getSubcommandCompletions(CommandSender sender, String rootCommand) {
+            // Show "sell" in `/claim &amp;lt;tab&amp;gt;`
+            return rootCommand.equals("claim") ? List.of("sell") : List.of();
+        }
+    
+        @Override
+        public List&amp;lt;string&amp;gt; getTabCompletions(
+                CommandSender sender, String rootCommand, String subcommand, String[] args) {
+            if (!"sell".equalsIgnoreCase(subcommand)) return List.of();
+            if (args.length == 0) {
+                return List.of("100", "500", "1000");
+            }
+            return List.of();
+        }
+    
+        @Override
+        public boolean handleSubcommand(ClaimCommandContext context) {
+            if (!"sell".equalsIgnoreCase(context.getSubcommand())) {
+                return false; // not ours
+            }
+    
+            if (!(context.getSender() instanceof Player player)) {
+                context.getSender().sendMessage("Run this as a player.");
+                return true;
+            }
+    
+            Claim claim = context.getSelectedOrCurrentClaim();
+            if (claim == null) {
+                player.sendMessage(ChatColor.RED + "No selected or current claim.");
+                return true;
+            }
+    
+            if (!Objects.equals(claim.getOwnerID(), player.getUniqueId())) {
+                player.sendMessage(ChatColor.RED + "Only the owner can list this claim for sale.");
+                return true;
+            }
+    
+            String[] args = context.getArgs();
+            if (args.length &amp;lt; 1) {
+                player.sendMessage(ChatColor.RED + "Usage: /claim sell &amp;lt;price&amp;gt;");
+                return true;
+            }
+    
+            long price;
+            try {
+                price = Long.parseLong(args[0]);
+            } catch (NumberFormatException ex) {
+                player.sendMessage(ChatColor.RED + "Price must be a number.");
+                return true;
+            }
+    
+            // ... store the listing, charge a fee, etc.
+            player.sendMessage(ChatColor.GREEN + "Claim listed for sale at " + price);
+            return true;
+        }
+    }
+
+Register it in your plugin's `onEnable`:
+
+    :::java
+    ClaimCommandAddonRegistry.register(new SellClaimAddon());
+
+That's it — `/claim sell 100` now runs your handler with the claim already resolved.
+
+### Ownership Rules
+
+- **GP3D always owns its built-in subcommands.** `trust`, `abandon`, `expand`, etc. cannot be overridden by an addon.
+- **Addons cannot register aliases that collide with built-ins.** Pick unique subcommand names.
+- **One addon at a time handles a given subcommand.** `handleAddonSubcommand` returns on the first addon that reports `true`, so order of registration matters if two addons claim the same subcommand.
+
+---
+
+## Events
+
+GriefPrevention fires a number of custom Bukkit events you can listen to. They live under `me.ryanhamshire.GriefPrevention.events`:
+
+| Event | When it fires | Cancellable |
+|---|---|---|
+| `ClaimCreatedEvent` | A new claim is about to be created | Yes |
+| `ClaimDeletedEvent` | A claim is deleted | No |
+| `ClaimResizeEvent` | A claim is being resized | Yes (via `ClaimChangeEvent`) |
+| `ClaimExtendEvent` | A claim is auto-extended downward | Yes (via `ClaimChangeEvent`) |
+| `ClaimModifiedEvent` | A generic "claim shape changed" event | Yes (via `ClaimChangeEvent`) |
+| `ClaimTransferEvent` | Claim ownership changes | Yes |
+| `ClaimExpirationEvent` | A claim is about to expire | Yes |
+| `ClaimPermissionCheckEvent` | Permission check runs against a claim — override to alter the result | Yes |
+| `ClaimInspectionEvent` | Player right-clicks with the investigation tool | Yes |
+| `TrustChangedEvent` | Trust list changes for one or more claims | Yes |
+| `AccrueClaimBlocksEvent` | A player is about to accrue claim blocks | Yes |
+| `PreventBlockBreakEvent` | A block break is being prevented | Yes |
+| `PreventPvPEvent` | PvP is being prevented | Yes |
+| `ProtectDeathDropsEvent` | Death drops are about to be protected | Yes |
+| `SaveTrappedPlayerEvent` | `/trapped` is about to teleport a player | Yes |
+| `PlayerKickBanEvent` | GP is about to kick/ban a player | Yes |
+| `BoundaryVisualizationEvent` | Claim borders are about to be visualized | Yes |
+| `VisualizationEvent` | (legacy) Visualization is about to run | Yes |
+
+Listen to them like any Bukkit event:
+
+    :::java
+    @EventHandler
+    public void onCreate(ClaimCreatedEvent event) {
+        Claim created = event.getClaim();
+        // ...
+    }
+
+See the Javadoc on each class for the exact getters and setters.
+
+# Administrator's Guide
+
+You probably don't need to read this entire document just to get started with GriefPrevention3D. The plugin does almost all the work for you — try it out and come back here when something isn't obvious.
+
+## Table of Contents
+
+- [Administrative Claims](#administrative-claims)
+- [Converting Claims Between Admin and Basic](#converting-claims-between-admin-and-basic)
+- [Changing Player Claims](#changing-player-claims)
+  - [Overriding](#overriding)
+  - [Deleting and Resizing](#deleting-and-resizing)
+- [Creating Claims for Players](#creating-claims-for-players)
+- [Adjusting a Player's Claim Limit](#adjusting-a-players-claim-limit)
+- [Investigating a Player's Claims](#investigating-a-players-claims)
+- [Investigating a Specific Claim](#investigating-a-specific-claim)
+- [Boundary Violation Alerts](#boundary-violation-alerts)
+- [Fighting Wilderness Grief (World Repair)](#fighting-wilderness-grief-world-repair)
+- [Fighting Chat Trolls](#fighting-chat-trolls)
+- [Killing Drama](#killing-drama)
+- [Reviewing Chat Logs Efficiently](#reviewing-chat-logs-efficiently)
+
+---
+
+## Administrative Claims
+
+**Required permission:** `griefprevention.adminclaims`
+
+Administrative claims are reserved areas owned by "the administration" rather than a specific player. They don't cost any player claim blocks, and any player with admin claims permission can modify all administrative claims.
+
+- Want to grant all players permissions in admin claims? `/accesstrust public`, `/containertrust public`, or `/trust public` works.
+- Want to prevent players from claiming an area without stopping them from building there? Drop an admin claim and `/trust public` inside it.
+
+Use `/adminclaims` to switch to admin-claim mode and `/basicclaims` to switch back.
+
+### 3D Administrative Claims
+
+**GP3D addition. Required permission:** `griefprevention.adminclaims`
+
+3D admin claims extend the admin claims system with exact vertical control. Instead of the standard ground-extension offset (which extends an admin claim from the clicked Y level down to the world floor), `Admin3D` mode uses the **clicked Y coordinates directly** as the vertical bounds of the claim.
+
+- `/3dadminclaims` (aliases: `adminclaim3d`, `adminclaims3d`, `3dadminclaim`) — switch shovel to 3D admin claim mode.
+- `/aclaim mode admin3d` — same via the unified command handler.
+- `/basicclaims` — switch back to normal mode.
+
+**Behavior:**
+
+- Clicked Y levels become the exact top and bottom of the claim — no automatic ground extension.
+- Free to create (no claim blocks consumed) with `null` owner ID (standard admin claims).
+- Minimum size and claim block checks are bypassed (identical to regular `Admin` mode).
+- Multiple 3D admin claims can **stack** at different Y levels inside the same X/Z footprint, useful for multi-floor admin structures.
+- Claim boundary visualization uses the `ADMIN_CLAIM_3D` visual style (glowstone/pumpkin by default) to distinguish 3D admin claims from other claim types.
+
+**Note:** The existing `/adminclaims` (2D) mode continues to work as before. 3D admin claims are an additional tool, not a replacement.
+
+---
+
+## Converting Claims Between Admin and Basic
+
+**GP3D addition. Required permission:** `griefprevention.adminclaims.convert`
+
+Two commands, no shovel dance:
+
+- `/makeadmin` — stand inside a basic (player-owned) claim and run the command. The claim becomes an administrative claim.
+- `/makebasic` — stand inside an administrative claim and run the command. It becomes a basic claim owned by you.
+
+These preserve trust data, subdivisions, and claim geometry. They are safer than the classic `/transferclaim` workflow when you just need to flip the ownership category without handing the claim to another player. For the "hand an admin claim to player X" flow, use `/transferclaim &amp;lt;player&amp;gt;` instead.
+
+Claim-block math notes:
+
+- `/makeadmin` does not refund blocks to the previous basic owner (they have lost the claim).
+- `/makebasic` does not deduct blocks from you beyond what the claim would normally cost. For this reason `/makebasic` is admin-only.
+
+---
+
+## Changing Player Claims
+
+### Overriding
+
+**Required permission:** `griefprevention.ignoreclaims`
+
+Any player with this permission can bypass claim protections using `/IgnoreClaims`, allowing them to build, break, and change permissions (trust, untrust, etc.) anywhere. Admin claims still require `griefprevention.adminclaims`. Run `/IgnoreClaims` again to go back to "respecting claims" mode and avoid accidents.
+
+Individual actions taken while ignoring claims are **not** logged, so only grant this to staff you trust 100%.
+
+### Deleting and Resizing
+
+**Required permission:** `griefprevention.deleteclaims`
+
+- `/deleteclaim` — deletes the claim you're standing in, even if it's not yours. Deleting public (admin) claims additionally requires `griefprevention.adminclaims`.
+- `/deleteallclaims &amp;lt;player&amp;gt;` — deletes all of a specific player's claims, useful after permanent bans.
+
+GP3D **does not** auto-remove claims for banned players because many servers have ban-appeal workflows. To do it automatically, alias your `/ban` command in `commands.yml` to also run `/deleteallclaims &amp;lt;player&amp;gt;`.
+
+Anyone with `griefprevention.deleteclaims` may resize another player's claim with the golden shovel as if it were their own. The owner's claim block total is adjusted accordingly. There is no separate resize permission because resize can effectively un-claim any block (same risk surface as delete).
+
+All deletions and resizes (except by the claim owner themselves) are logged.
+
+---
+
+## Creating Claims for Players
+
+Anyone with both `griefprevention.adminclaims` **and** `griefprevention.transferclaim` can create a claim for another player by first making an admin claim with `/adminclaims`, then running `/transferclaim &amp;lt;player&amp;gt;`. This is the only way to create a private claim smaller than the minimum claim size.
+
+In GP3D you also have `/makebasic` (with `griefprevention.adminclaims.convert`) as an alternative — create the shape as an admin claim, then `/makebasic` to make it your basic claim, then `/transferclaim` to hand it to the player. Which flow you prefer is up to you.
+
+---
+
+## Adjusting a Player's Claim Limit
+
+**Required permission:** `griefprevention.adjustclaimblocks`
+
+- `/adjustbonusclaimblocks &amp;lt;player&amp;gt; &amp;lt;amount&amp;gt;` (alias `/acb`) — add or remove bonus claim blocks. Bonus blocks have no config cap, unlike accrued blocks.
+- `/acb [myservergroups.builders] 5000` — grants 5,000 bonus blocks to everyone with the `myservergroups.builders` permission. This is **not** a one-shot: players who later gain or lose the permission also gain or lose the bonus.
+- `/setaccruedclaimblocks &amp;lt;player&amp;gt; &amp;lt;amount&amp;gt;` (alias `/scb`) — sets a player's accrued block total directly.
+
+---
+
+## Investigating a Player's Claims
+
+**Required permission:** `griefprevention.claimslistother`
+
+`/claimslist &amp;lt;player&amp;gt;` lists all of a player's claims with sizes, locations, and the claim-block math.
+
+---
+
+## Investigating a Specific Claim
+
+Equip the investigation tool (stick by default) and right-click the claimed area. Shift+right-click shows nearby claims if you have `griefprevention.visualizenearbyclaims`. `griefprevention.seeclaimsize` adds size info and `griefprevention.seeinactivity` shows the owner's offline time on that tooltip.
+
+---
+
+## Boundary Violation Alerts
+
+**GP3D addition.** Piston and liquid events that get blocked at a claim boundary now notify the **claim owner** so they understand where the flow is being stopped — no config toggles, no per-claim water/lava permissions.
+
+### What Triggers an Alert
+
+- A piston tries to push a block **into** a claim from outside.
+- A piston inside a claim tries to push a block **out** of that claim into someone else's claim.
+- Water or lava tries to flow **into** a claim from outside it (or fails to flow out into another owner's claim).
+
+### Message Format
+
+When the claim owner is online, they see something like:
+
+    Warning: A piston tried to enter your claim @ x:... y:... z:...!
+    Warning: A liquid tried to enter your claim @ x:... y:... z:...!
+
+If several violations happen in the same burst window (~2 seconds), the plugin condenses them into a single summary line rather than spamming:
+
+    Warning: 12 liquid violations near your claim @ x:... y:... z:...!
+
+### Dedup Behavior
+
+To keep notifications useful and not noisy, the plugin remembers recent violations and suppresses repeats:
+
+- **Pistons**: exact-location dedup. A specific piston pushing repeatedly against the same spot only alerts once per expiry window.
+- **Water**: 8-block radius dedup (water flows up to 7 blocks).
+- **Lava (overworld / end)**: 5-block radius dedup (lava flows up to 4 blocks).
+- **Lava (nether)**: 8-block radius dedup (nether lava flows up to 7 blocks).
+- Entries expire after ~5 minutes of no activity.
+
+### Why Only Alerts, No Toggles
+
+The design intentionally avoids per-claim water/lava permission toggles. Such toggles:
+
+- Enable non-survival placements (holding water/lava in midair by claim boundary rules).
+- Open weird trapping cases (fake water sources held up by claim rules so players fall to their death).
+
+Alerts solve the real problem — player confusion about where flow is happening — without opening those traps. Pistons are treated the same way: no cross-claim toggle, just better feedback.
+
+---
+
+## Fighting Wilderness Grief (World Repair)
+
+**Required permission:** `griefprevention.restorenature`
+
+"Public grief" is damage done to the world rather than to a specific player: terrain damage, ugly builds, tree-topping (not possible with GP installed), wildfires (not possible with GP installed). `/restorenature` addresses the rest.
+
+- `/restorenature` (alias `/rn`) — right-click a block with the shovel to revert player changes in that area. Claims are respected.
+- `/restorenaturefill [radius]` (alias `/rnf`, requires `griefprevention.restorenatureaggressive`) — right-click at the level you want to fill to. Huge griefer craters fill in seconds.
+- `/restorenatureaggressive` (alias `/rna`, requires the aggressive permission) — removes even some natural blocks. Use carefully. Only removes blocks at and above the clicked level.
+
+Rule of thumb: try `/rn` first. Only use `/rna` when the griefer used natural-looking blocks.
+
+GriefPrevention does **not** maintain per-block history — it doesn't "roll back" in the WorldEdit sense. Instead, it identifies player-placed blocks and removes them, then smooths unnatural terrain. This is safer than regeneration because:
+
+- Regenerating a chunk after world-seed / worldgen changes can produce mismatched neighbors (snowy squares in deserts).
+- WorldEdit's region regen works at chunk granularity and tries to "undo" outside the selection — subtle bugs can leak.
+- Regeneration can put back things you wanted gone, like depleted dungeons and ore veins.
+
+Always try the safe `/restorenature` first.
+
+---
+
+## Fighting Chat Trolls
+
+**Required permission:** `griefprevention.softmute`
+
+Banning a troll often escalates: alt accounts, recruited friends, DDOS attempts. `/softmute &amp;lt;player&amp;gt;` lets the troll see their own messages (and so do other soft-muted players) while nobody else does. The troll thinks their messages are working and loses interest before escalating. Cheap, quiet, effective.
+
+---
+
+## Killing Drama
+
+**Required permission:** `griefprevention.separate`
+
+When two players cannot get along, `/separate &lt;a&gt; &lt;b&gt;` forces them to ignore each other in chat without either of them knowing. `/unseparate` reverses it. Neat, fast, stops ambient server drama from spreading.
+
+---
+
+## Reviewing Chat Logs Efficiently
+
+Abridged social-interaction logs live under `plugins/GriefPreventionData/Logs`. They are formatted for human reading and auto-delete after 7 days. The `config.yml` log section lets you change the retention period and verbosity.
+
+# Commands
+
+&amp;gt; **Note on the unified `/claim` handler.** GriefPrevention3D ships a unified command surface configured in `plugins/GriefPreventionData/alias.yml`. With it enabled (the default), most commands on this page can also be invoked as `/claim &amp;lt;subcommand&amp;gt;` — for example `/claim trust &amp;lt;player&amp;gt;`, `/claim abandon`, `/claim explosions`. This page documents the **standalone** commands only, since they stay the canonical names. See [Key Features › Unified Command Handler](Key-Features#unified-command-handler) for how the unified form maps onto these standalone commands.
+
+All permissions below start with `griefprevention.`. For example, "restorenature" is `griefprevention.restorenature`. See [Permissions](Permissions) for the full list.
+
+## Player Commands
+
+| Command | Description | Alias | Perm |
+|---|---|---|---|
+| `/AbandonClaim` | Deletes the claim you're standing in (or selected). | | claims |
+| `/AbandonTopLevelClaim` | Deletes a claim and all its subdivisions. | | claims |
+| `/AbandonAllClaims` | Deletes all of your claims. | | abandonallclaims |
+| `/ClaimExplosions` | Toggles if explosions are allowed in the claim. | `/claimexplosion` | claims |
+| `/WitherExplosions` | Toggles if wither explosions may damage blocks in the claim. | `/witherexplosion` | witherexplosions |
+| `/Trust` | Gives another player permission to build in your claim. | `/tr` | claims |
+| `/UnTrust` | Revokes any permissions granted to a player in your claim. | `/ut` | claims |
+| `/AccessTrust` | Gives a player permission to use your buttons, levers, and beds. | `/at` | claims |
+| `/ContainerTrust` | Gives a player permission to use buttons, levers, beds, crafting gear, containers, and animals. | `/ct` | claims |
+| `/PermissionTrust` | Grants a player permission to share their permission level with others. | `/pt`, `/managetrust` | claims |
+| `/TrustList` | Lists the permissions for the claim you're standing in (or selected). Shows inherited permissions too. | | claims |
+| `/SubdivideClaims` | Switches your shovel to subdivision mode. | `/sc`, `/subdivideclaim` | claims |
+| `/3DSubdivideClaims` | Switches your shovel to 3D subdivision mode (Y-bounded subclaims). | `/3dsubdivideclaim` | claims |
+| `/ShapedClaims` | Switches your shovel to shaped-claim mode (orthogonal polygon claims). Requires `AllowShapedClaims: true`. | `/shapedclaim` | claims |
+| `/RestrictSubclaim` | Restricts a subclaim so it inherits no permissions from the parent. If run in a top-level claim, restricts all its subdivisions at once. | `/rsc` | claims |
+| `/BasicClaims` | Puts your shovel back in basic claims mode. | `/bc` | claims |
+| `/ExtendClaim` | Resizes the claim you're standing in (or selected) by pushing its boundary in the direction you're facing. | `/expandclaim`, `/resizeclaim` | claims |
+| `/BuyClaimBlocks` | Converts server currency to claim blocks. | `/buyclaim` | buysellclaimblocks |
+| `/SellClaimBlocks` | Converts claim blocks to server currency. | | buysellclaimblocks |
+| `/GivePet` | Gives away a tamed animal. | | givepet |
+| `/ClaimsList` | Lists your claims and claim-block totals. | `/claimlist`, `/listclaims` | claims |
+| `/IgnorePlayer` | Ignores a player's chat messages. | `/ignore` | ignore |
+| `/UnIgnorePlayer` | Un-ignores a player's chat messages. | `/unignore` | ignore |
+| `/IgnoredPlayerList` | Lists all players currently ignored. | `/ignores`, `/ignored`, `/ignorelist`, `/ignoredlist` | ignore |
+| `/Trapped` | Gets you out of a claim you're stuck inside. | | trapped |
+| `/UnlockDrops` | Allows other players to pick up items you dropped when you died. | | unlockdrops |
+| `/CheckClaimExpiry` | View claim expiration details for a player. | | checkclaimexpiry |
+
+## Admin Commands
+
+| Command | Description | Alias | Perm |
+|---|---|---|---|
+| `/AdminClaims` | Switches the shovel tool to administrative claims mode. | `/ac` | adminclaims |
+| `/3DAdminClaims` | Switches the shovel to 3D admin claim mode (height-bounded, exact Y coordinates). | `adminclaim3d`, `adminclaims3d`, `3dadminclaim` | adminclaims |
+| `/BasicClaims` | Returns the shovel to basic claims mode. | `/bc` | claims |
+| `/AdminClaimsList` | Lists all administrative claims. | | adminclaims |
+| `/DeleteAllAdminClaims` | Deletes all administrative claims. (Console only.) | | adminclaims |
+| `/TransferClaim` | Converts an administrative claim to a private claim. | `/giveclaim` | transferclaim |
+| `/MakeAdmin` | Converts the basic claim you're standing in to an administrative claim. | | adminclaims.convert |
+| `/MakeBasic` | Converts the administrative claim you're standing in to a basic claim you own. | | adminclaims.convert |
+| `/IgnoreClaims` | Toggles ignore-claims mode for admin overrides. | `/ic` | ignoreclaims |
+| `/DeleteClaim` | Deletes the claim you're standing in, even if it's not yours. | | deleteclaims |
+| `/DeleteAllClaims` | Deletes all of another player's claims. | | deleteclaims |
+| `/DeleteClaimsInWorld` | Deletes all claims in a world. (Console only.) | `/deleteallclaimsinworld`, `/clearclaimsinworld` | deleteclaimsinworld |
+| `/DeleteUserClaimsInWorld` | Deletes all non-admin claims in a world. (Console only.) | `/deletealluserclaimsinworld`, `/clearuserclaimsinworld` | deleteclaimsinworld |
+| `/AdjustBonusClaimBlocks` | Adds or subtracts bonus claim blocks for a player (or group with `[bracketed]` syntax). | `/acb` | adjustclaimblocks |
+| `/AdjustBonusClaimBlocksAll` | Adds or subtracts bonus claim blocks for all online players. | `/acball` | adjustclaimblocks |
+| `/SetAccruedClaimBlocks` | Updates a player's accrued claim-block total. | `/scb` | adjustclaimblocks |
+| `/RestoreNature` | Switches the shovel tool to restoration mode. | `/rn` | restorenature |
+| `/RestoreNatureAggressive` | Switches the shovel to aggressive restoration mode. | `/rna` | restorenatureaggressive |
+| `/RestoreNatureFill` | Switches the shovel to fill mode. | `/rnf` | restorenatureaggressive |
+| `/SoftMute` | Toggles whether a player's messages reach only other soft-muted players. | | softmute |
+| `/Separate` | Forces two players to ignore each other in chat. | | separate |
+| `/UnSeparate` | Reverses `/separate`. | | separate |
+| `/GPReload` | Reloads GriefPrevention's configuration settings. | | reload |
+| `/ClaimsList &amp;lt;player&amp;gt;` | Lists information about another player's claim blocks and claims. | | claimslistother |
+| `/ClaimBook` | Gives a player the "How to Claim Land" manual. | | claimbook |
+| `/UnlockDrops &amp;lt;player&amp;gt;` | Unlocks drops for another player. | | unlockothersdrops |
+
+## Notes
+
+- **`/3dadminclaims`** (and its alias `/aclaim mode admin3d`) is a GP3D addition. It uses the existing `griefprevention.adminclaims` permission. See [Administrator's Guide › 3D Administrative Claims](Administrator-Guide#3d-administrative-claims).
+- **`/makeadmin` and `/makebasic`** are GP3D additions. They require `griefprevention.adminclaims.convert` (default `op`). Use them to move an existing claim between the "basic player-owned" and "administrative" pools without losing trust data. See [Administrator's Guide › Converting Claims](Administrator-Guide#converting-claims-between-admin-and-basic).
+- **`/witherexplosions`** is a GP3D addition. It is gated by `griefprevention.witherexplosions` (default `true`).
+- **`/3dsubdivideclaims`, `/shapedclaims`**, and the shaped-mode variants are GP3D additions. Shaped-mode commands hide themselves when `AllowShapedClaims: false`.
+- **`/extendclaim`** has aliases `/expandclaim` and `/resizeclaim`. When a shaped claim has a shift-click segment marker, `/expandclaim` operates on that segmented subsection instead of the whole side.
+- **Selected-claim commands**: if you just resized a claim, most of the "claim-local" commands above (`/trust`, `/trustlist`, `/abandonclaim`, `/claimexplosions`, `/witherexplosions`) run against the **selected claim** even after you walk out of it. See [Key Features › Claim Selection](Key-Features#claim-selection).
+
+# Configuration
+
+GriefPrevention3D configuration lives in `plugins/GriefPreventionData/`:
+
+- `config.yml` — primary plugin configuration.
+- `messages.yml` — all user-facing strings. Edit to localize or reword.
+- `alias.yml` — unified `/claim` / `/aclaim` command surface and standalone aliases.
+
+Reload after edits with `/gpreload`.
+
+## GP3D-Specific Toggles
+
+These are the options you most likely need to know about as a GP3D admin. They live in `config.yml` under the `GriefPrevention:` root.
+
+### `Claims.AllowShapedClaims`
+
+    :::yaml
+    GriefPrevention:
+      Claims:
+        AllowShapedClaims: false
+
+Master switch for orthogonal polygon parent claims.
+
+- `false` (default): `/shapedclaims`, `/shapedclaim`, and `/claim mode shaped` are hidden/disabled. The plugin behaves like rectangle-only GP.
+- `true`: shaped-mode commands are available and players can create orthogonal polygon top-level claims.
+
+See [Key Features › Shaped Claims](Key-Features#shaped-claims).
+
+### `Claims.AllowNestedSubClaims`
+
+    :::yaml
+    GriefPrevention:
+      Claims:
+        AllowNestedSubClaims: false
+
+- `false` (default): subdivisions may only exist inside top-level claims (upstream behavior).
+- `true`: subdivisions may be created inside other subdivisions.
+
+### `Claims.UseClaimSelectSessions`
+
+    :::yaml
+    GriefPrevention:
+      Claims:
+        UseClaimSelectSessions: true
+        UseClaimSelectedMessages: false
+
+Controls what happens when a player right-clicks an existing claim corner with the claim tool.
+
+- `UseClaimSelectSessions: true` (default): the selected claim can be targeted by commands such as `/claim abandon` while waiting for the second resize click.
+- `UseClaimSelectSessions: false`: the shovel can still resize normally, but commands use the claim the player is standing in instead of the selected corner claim.
+- `UseClaimSelectedMessages: false` (default): players see the normal `ResizeStart` message.
+- `UseClaimSelectedMessages: true`: players see the fuller `ClaimSelected`, `ClaimSelectedTopLevel`, or `SubdivisionSelected` guidance.
+
+### `VisualizationGlow`
+
+    :::yaml
+    GriefPrevention:
+      VisualizationGlow: false
+
+- `false` (default): classic fake-block border visualization.
+- `true`: claim borders glow (Minecraft 1.19.3+ required; ignored on older clients/servers).
+
+### `Claims.MinimumDistance`
+
+    :::yaml
+    GriefPrevention:
+      Claims:
+        MinimumDistance: 0
+
+Enforces a minimum distance in blocks between top-level claims to prevent claim spam and overcrowding.
+
+- `0` (default): disabled — no minimum distance check.
+- When set to a positive integer (e.g. `10`), players cannot create a claim within that many blocks of another player's claim boundary.
+- Claim creation is blocked with a denial message identifying the nearby claim owner and the configured distance.
+- The conflicting claim's boundary is visualized as a `CONFLICT_ZONE` (visible from afar, especially with `VisualizationGlow: true`).
+
+**Bypassing minimum distance with neighbor trust:**
+
+Specific players can be granted neighbor trust to bypass the distance check:
+
+- `/claim trust &amp;lt;player&amp;gt; neighbor` — grants neighbor trust on the claim you're standing in (or all your claims if standing outside).
+- `/neighbortrust &amp;lt;player&amp;gt;` (alias: `/distancetrust &amp;lt;player&amp;gt;`) — standalone command for the same purpose.
+- `/claim untrust &amp;lt;player&amp;gt;` — revokes manually-granted neighbor trust.
+- `/claim distance toggle` — while standing in your own claim (or with manager permission), toggles `allowAllNeighbors` for that claim. When enabled, ALL players can bypass minimum distance checks for that claim. Permission: `griefprevention.toggleclaimdistance`.
+- `/claim distance check` — shows the configured minimum distance and lists all nearby claims within range, each visualized with a conflict zone boundary. Permission: `griefprevention.checkclaimdistance`.
+
+**Auto-granted neighbor trust:**
+
+When `MinimumDistance` is set, existing claims that are already too close to each other automatically have their owners added as neighbors to each other's claims. This trust is automatically removed when a claim is abandoned (and no other claims from that owner remain nearby). Auto-granted trust cannot be removed via `/untrust`.
+
+**Trustlist display:**
+
+`/trustlist` shows neighbor-trusted players with a `&amp;amp;d&amp;gt;` (light purple) prefix, and the legend at the bottom includes "Neighbor" when neighbors exist.
+
+**Relevant permissions:**
+
+| Permission | Default | Description |
+|---|---|---|
+| `griefprevention.neighbortrust` | child of `griefprevention.claims` | Allows use of `/neighbortrust` and `/distancetrust`. |
+| `griefprevention.checkclaimdistance` | child of `griefprevention.claims` | Allows use of `/claim distance check`. |
+| `griefprevention.toggleclaimdistance` | child of `griefprevention.claims` | Allows use of `/claim distance toggle`. |
+
+All of the above are children of `griefprevention.claims`, so existing servers with `griefprevention.claims: true` (the default) continue to work without changes.
+
+## Alias File (`alias.yml`)
+
+Located at `plugins/GriefPreventionData/alias.yml`. The important top-level knobs:
+
+    :::yaml
+    enabled: true       # master switch for the alias system
+    standalone: true    # when false, only /claim and /aclaim are registered
+
+- **`enabled: false`** disables the alias system entirely. All commands fall back to their internal English names.
+- **`standalone: false`** keeps `/claim` and `/aclaim` but removes the per-command standalone aliases (`/trust`, `/abandonclaim`, etc.). Useful when another plugin owns those command names.
+
+Each subcommand block under `commands.claim.subcommands` (and `commands.aclaim.subcommands`) controls:
+
+- Whether the subcommand is enabled.
+- What names / aliases it responds to.
+- Its permission node.
+- Tab-completion argument types.
+
+The file itself carries extensive inline documentation; read it directly for the full schema.
+
+## Upstream Options
+
+All upstream GriefPrevention config options still work. If you are migrating from upstream GP, start there — the values you already have will keep doing what they did before. See [Migration](Migration) for the things that changed.
+
+# Getting Started
+
+This page walks through installing GriefPrevention3D and getting it running on a Spigot/Paper/Folia server.
+
+## Requirements
+
+- **Minecraft**: 1.21+ (API level `1.21`).
+- **Server software**: Spigot, Paper, or Folia. GP3D supports Folia's regional scheduling.
+- **Java**: 21+ (same as Minecraft 1.21).
+- **Optional**: Vault for `/buyclaimblocks` and `/sellclaimblocks`.
+
+Older Minecraft versions are not officially supported. Some older-Minecraft compatibility fixes are carried (e.g., for `COPPER_GOLEM_STATUES`, `CHAINS`), but the plugin targets modern server jars.
+
+## Installation
+
+1. Drop the built `GriefPrevention.jar` into your server's `plugins/` directory.
+2. Start the server once so GriefPrevention3D generates the default config under `plugins/GriefPreventionData/`.
+3. Stop the server, edit `config.yml` to taste, and restart. Or use `/gpreload` to pick up config changes without a full restart.
+
+## First-Time Setup Checklist
+
+- **Decide on claim modes per world.** `config.yml` has `GriefPrevention.Claims.WorldModes` — common values are `Survival`, `Creative`, `SurvivalRequiringClaims`, and `Disabled`.
+- **Decide on the shaped-claims toggle.** Shaped polygon claims are **off by default**. Set `GriefPrevention.Claims.AllowShapedClaims: true` in `config.yml` if you want them. See [Key Features › Shaped Claims](Key-Features#shaped-claims).
+- **Decide on nested subclaims.** `GriefPrevention.Claims.AllowNestedSubClaims: true` to allow subdivisions inside other subdivisions.
+- **Decide on visualization style.** `GriefPrevention.VisualizationGlow: true` turns on glowing claim borders (requires 1.19.3+).
+- **Review the alias file.** `plugins/GriefPreventionData/alias.yml` controls the unified `/claim` and `/aclaim` root commands plus standalone aliases. See [Key Features › Unified Command Handler](Key-Features#unified-command-handler).
+
+## Claiming Your First Land
+
+Teach players the basics in this order:
+
+1. **Chest claim**: Place a chest. The plugin auto-creates a small protected claim around it for new players (if `AutomaticNewPlayerClaimsRadius` &amp;gt; -1).
+2. **Golden shovel**: Right-click two opposite corners of the area to claim. The plugin draws a visual border.
+3. **Trust someone**: `/trust &amp;lt;player&amp;gt;` while standing inside the claim.
+4. **Expand a claim**: Right-click a corner with the golden shovel, then right-click the new corner.
+
+Once a claim exists, owners can use `/claim trust`, `/claim abandon`, `/claim explosions`, etc. directly, and shift-click corners to enter shaped-mode edits if enabled.
+
+## Verifying It Works
+
+- `/claimslist` lists your claims.
+- `/trustlist` while standing in a claim lists permissions there, including inherited permissions from parent claims.
+- Admins can `/ignoreclaims` to temporarily override protections while building infrastructure.
+
+## Next Steps
+
+- Read [Migration](Migration) if you are upgrading from upstream GriefPrevention — the behavior differences matter.
+- Read [Key Features](Key-Features) for the detailed feature list.
+- Read the [Administrator's Guide](Administrator-Guide) for day-to-day server operations.
+
+# GriefPrevention3D
+
+GriefPrevention3D is a fork of the original [GriefPrevention](https://dev.bukkit.org/projects/grief-prevention) plugin, extended with features modern survival servers actually need: true 3D subdivisions, non-rectangular (shaped) parent claims, nested subclaims, glowing visualizations, and a unified `/claim` command surface.
+
+This wiki is the reference for server owners moving from upstream GriefPrevention to GriefPrevention3D, or setting up a new server from scratch.
+
+## Quick Links
+
+- **New to the plugin?** Start with [Getting Started](Getting-Started).
+- **Coming from upstream GP?** Read [Migration](Migration) first — it is the fastest way to see what is new, what changed, and what needs attention in your config.
+- **Want the feature list?** See [Key Features](Key-Features).
+- **Looking for a specific command or permission?** See [Commands](Commands) and [Permissions](Permissions).
+- **Running the server?** The [Administrator's Guide](Administrator-Guide) covers day-to-day operations.
+
+## Highlights
+
+- **3D Subdivisions** with real Y-level boundaries (`/3dsubdivideclaims`).
+- **Shaped Claims** — orthogonal polygon parent claims (`/shapedclaims`, gated by `AllowShapedClaims`).
+- **Nested Subclaims** — subdivisions inside other subdivisions (gated by `AllowNestedSubClaims`).
+- **Glowing Visualizations** for easier-to-see claim borders (gated by `VisualizationGlow`, requires Minecraft 1.19.3+).
+- **Unified Command Handler** — `/claim create`, `/claim trust`, `/claim abandon`, and more, all under one root command (configurable in `alias.yml`).
+- **3D Admin Claims** — free, height-limited admin claims with exact Y bounds (`/3dadminclaims`).
+- **Admin ↔ Basic conversion** via `/makeadmin` and `/makebasic`.
+- **Boundary Violation Alerts** — claim owners are notified when pistons or liquids get blocked at their claim boundary, so they know where to resize or why a flow stopped.
+
+## Source and Issues
+
+- Repository: the `GriefPrevention3D` GitHub repo.
+- File issues and feature requests on the GitHub issue tracker.
+
 # Key Features

 This page is the reference for every feature that makes GriefPrevention3D different from upstream GriefPrevention. It is also the page to read first when configuring the plugin for your server.
@@ -10,6 +1348,8 @@

 - [Visualization Glow](#visualization-glow)
 - [Unified Command Handler](#unified-command-handler)
 - [Wither Explosion Toggle](#wither-explosion-toggle)
+- [Minimum Distance Between Claims](#minimum-distance-between-claims)
+- [Neighbor Trust](#neighbor-trust)
 - [Claim Selection](#claim-selection)
 - [Subtle Changes](#subtle-changes)

@@ -122,6 +1462,77 @@
     /witherexplosions

 Works the same way as `/claimexplosions` — stand in (or have selected) the claim, run the command. Gated by `griefprevention.witherexplosions` (default: `true`).
+
+---
+
+## Minimum Distance Between Claims
+
+Enforce a minimum distance between top-level claims to prevent claim spam and overcrowding.
+

+    :::yaml
+    # config.yml
+    GriefPrevention:
+      Claims:
+        MinimumDistance: 0
+
+- `0` (default): disabled — no minimum distance check.
+- When set to a positive integer (e.g. `10`), players cannot create a claim within that many blocks of another player's claim boundary.
+- Claim creation is blocked with a denial message identifying the nearby claim owner and the configured distance.
+- The conflicting claim's boundary is visualized as a `CONFLICT_ZONE` (visible from afar, especially with `VisualizationGlow: true`).
+
+### Distance check command
+
+    /claim distance check
+
+Shows the configured minimum distance and lists all nearby claims within range, each visualized with a conflict zone boundary. Permission: `griefprevention.checkclaimdistance`.
+
+---
+
+## Neighbor Trust
+
+A new trust level that allows specific players to bypass minimum distance checks for a claim.
+
+### Granting neighbor trust
+
+    /claim trust &amp;lt;player&amp;gt; neighbor
+
+Grants a player neighbor trust on the claim you're standing in. If you're standing outside any claim, it grants neighbor trust for **all** your claims.
+
+    /neighbortrust &amp;lt;player&amp;gt;
+
+Standalone alias (also available as `/distancetrust &amp;lt;player&amp;gt;`).
+
+### Revoking neighbor trust
+
+    /claim untrust &amp;lt;player&amp;gt;
+
+Revokes manually-granted neighbor trust. Auto-granted neighbor trust (from existing nearby claims) cannot be removed via `/untrust` — it is automatically cleaned up when the nearby claim is abandoned.
+
+### Allow all neighbors
+
+    /claim distance toggle
+
+While standing in your own claim (or with manager permission), toggles `allowAllNeighbors` for that claim. When enabled, ALL players can bypass minimum distance checks for that claim. Running the command again toggles it off. Permission: `griefprevention.toggleclaimdistance`.
+
+### Auto-granted neighbor trust
+
+When `MinimumDistance` is set, existing claims that are already too close to each other automatically have their owners added as neighbors to each other's claims. This trust is automatically removed when a claim is abandoned (and no other claims from that owner remain nearby).
+
+### Trustlist display
+
+`/trustlist` shows neighbor-trusted players with a `&amp;amp;d&amp;gt;` (light purple) prefix, and the legend at the bottom includes "Neighbor" when neighbors exist.
+
+### Permissions
+
+| Permission | Default | Description |
+|---|---|---|
+| `griefprevention.neighbortrust` | child of `griefprevention.claims` | Allows use of `/neighbortrust` and `/distancetrust`. |
+| `griefprevention.checkclaimdistance` | child of `griefprevention.claims` | Allows use of `/claim distance check`. |
+| `griefprevention.toggleclaimdistance` | child of `griefprevention.claims` | Allows use of `/claim distance toggle`. |
+
+All of the above are children of `griefprevention.claims`, so existing servers with `griefprevention.claims: true` (the default) continue to work without changes.
+
+See also: [Permissions](Permissions#granular-claim-command-permissions) for the full list of granular claim command permissions.

 ---

@@ -171,3 +1582,495 @@

 - **Selected-claim commands**: resize-oriented command variants respect the current selection context instead of only the player's block position.
 - **Temporary basic-mode segment previews**: shift-clicking a claim boundary in basic claims mode creates a temporary segment preview for convenience. These previews do not persist across visualization refreshes and disappear if the player does nothing with them. Only deliberate `/shapedclaim` shift-click segmentation persists to the claim.
 - **Older-version compatibility fixes** shipped for `COPPER_GOLEM_STATUES`, `CHAINS`, and chain-material lookups.
+
+# Locale System
+
+GriefPrevention3D supports localized messages via YAML locale files. The plugin loads messages based on the `GriefPrevention.Locale` config setting.
+
+## Quick Start
+
+1. Set your locale in `config.yml`:
+   ```yaml
+   GriefPrevention:
+     Locale: es
+   ```
+
+2. Copy the desired locale file from `Lang/` to the data folder root:
+   ```
+   GriefPreventionData/
+     Lang/
+       messages_en.yml      &amp;lt;- bundled reference copies (refreshed on restart)
+       messages_es.yml
+       messages_pt_BR.yml
+     messages_es.yml         &amp;lt;- your active locale file (copied here by you)
+     config.yml
+   ```
+
+3. Restart the server or run `/greload`.
+
+## File Locations
+
+| Path | Purpose |
+|------|---------|
+| `GriefPreventionData/messages_{locale}.yml` | Active locale files read by the plugin |
+| `GriefPreventionData/Lang/` | Reference copies extracted from JAR on every restart |
+| `GriefPreventionData/messages.yml` | Legacy file (backward compatibility) |
+
+## Loading Priority
+
+1. **`messages_{locale}.yml`** — matches your `config_locale` setting (e.g., `messages_es.yml` for `Locale: es`)
+2. **`messages.yml`** — legacy fallback for servers migrated from older versions
+3. **Auto-detect** — if neither exists, scans for any `messages_*.yml` and auto-switches
+4. **Extract from JAR** — if nothing found, extracts the matching locale from the JAR
+
+## Auto-Detection
+
+If your config says `Locale: en` but only `messages_es.yml` exists in the data folder, the plugin auto-switches to Spanish and logs:
+
+    Locale 'en' didn't match provided messages_es.yml. Auto-switched to 'es'
+
+The in-memory locale is updated so the startup header and all messages use the detected language.
+
+## Key Merging
+
+On every startup, the plugin compares your deployed locale file against the bundled JAR version. Any missing keys are automatically added and saved to your file. This means:
+
+- New messages added in plugin updates appear automatically after restart
+- You don't need to manually edit your locale file when upgrading
+- Your customizations are preserved (existing keys are never overwritten)
+
+## Supported Locales
+
+| Locale | Language |
+|--------|----------|
+| `en` | English |
+| `es` | Spanish |
+| `pt_BR` | Brazilian Portuguese |
+
+## Adding a New Locale
+
+1. Create `messages_{locale}.yml` in the JAR's resource path (under `src/main/resources/`)
+2. Add the locale to `BUNDLED_LOCALE_FILES` in `DataStore.java`
+3. Add locale entries to `startups.txt` (e.g., `fr1[...`, `fr2[...`, `fr3[...`)
+4. The plugin will extract it to `Lang/` on next restart
+
+## Editing Messages
+
+Each message is stored under a `Messages.` key matching the enum name in `Messages.java`:
+
+    :::yaml
+    Messages:
+      ClaimCreated: "Claims created successfully."
+      NoPermission: "You don't have permission to do that."
+
+You can customize any message by editing the corresponding key in your locale file. The plugin uses `$` or `&amp;amp;` as color code prefixes, and supports `&amp;amp;#RRGGBB` hex colors.
+
+## Startup Header
+
+The startup header respects your locale setting. If you have locale entries in `startups.txt` matching your config (e.g., `es1[...`, `es2[...`, `es3[...`), the plugin displays a localized header on startup.
+
+For locales with a region suffix (e.g., `pt_BR`), the header falls back to the base language (e.g., `pt`) if no exact match is found.
+
+# Migration from Upstream GriefPrevention
+
+This page summarizes what is **new, different, or worth double-checking** when moving from the original GriefPrevention (RoboMWM) to GriefPrevention3D. It is intentionally short — the goal is to help server owners recognize what has changed without reading the whole wiki.
+
+## TL;DR
+
+- Claims are **backwards compatible**. Existing rectangle claims load without modification.
+- Most **commands and permissions are identical** to upstream. GP3D adds a few new ones.
+- Several features are **off by default** and must be opted into in `config.yml`.
+- There is now a **unified `/claim &amp;lt;subcommand&amp;gt;`** surface on top of the existing standalone commands.
+
+## What's New
+
+| Area | What | Default |
+|------|------|---------|
+| 3D Subdivisions | `/3dsubdivideclaims` — subclaims with real Y-level bounds | Available always |
+| 3D Admin Claims | `/3dadminclaims` — free, height-bounded admin claims with exact Y bounds. Also `/aclaim mode admin3d`. | Permission-gated (`griefprevention.adminclaims`) |
+| Shaped Claims | `/shapedclaims`, `/shapedclaim` — orthogonal polygon parent claims | **Off** (`AllowShapedClaims: false`) |
+| Nested Subclaims | Subdivisions inside subdivisions | **Off** (`AllowNestedSubClaims: false`) |
+| Visualization Glow | Glowing claim borders (1.19.3+) | **Off** (`VisualizationGlow: false`) |
+| Unified `/claim` | `/claim create`, `/claim trust`, `/claim abandon`, etc. | **On** in `alias.yml` |
+| `/makeadmin` / `/makebasic` | Convert claims to/from admin | Permission-gated (`griefprevention.adminclaims.convert`) |
+| `/witherexplosions` | Per-claim wither explosion toggle | Permission-gated (`griefprevention.witherexplosions`, default `true`) |
+| Boundary Violation Alerts | Warn claim owners when pistons/liquids are blocked at their border | On (smart deduplication + burst detection) |
+
+## What's Changed
+
+### Claim Selection After Resize
+
+When a player **resizes a claim**, that claim becomes the "selected claim" for their session. Commands like `/trust`, `/untrust`, `/trustlist`, `/abandonclaim`, `/claimexplosions`, and `/witherexplosions` then run against the selected claim even if the player is no longer standing inside it. This removes the old "stand in the claim, then type the command" dance for common admin flows.
+
+### `/restrictsubclaim` from a Parent Claim
+
+Running `/restrictsubclaim` while standing in a **top-level claim** (not inside a subdivision) now instantly restricts **all** subdivisions inside that claim in one go. Previously this had to be done per-subclaim.
+
+### `/trustlist` Shows Inheritance
+
+`/trustlist` now displays **inherited permissions** from the parent claim, not just explicit trusts on the current (sub)claim. This makes it obvious why a player has access somewhere.
+
+### Eavesdrop Permissions Split
+
+The single `griefprevention.eavesdrop` permission has been split for finer control:
+
+- `griefprevention.eavesdrop.pm` — see `/tell`-style private messages.
+- `griefprevention.eavesdrop.softmute` — see soft-muted messages.
+- `griefprevention.eavesdrop.signs` — see sign placements as chat messages (already existed upstream).
+- `griefprevention.eavesdrop.immune` — exempt from being eavesdropped.
+- `griefprevention.eavesdrop` still exists as a blanket/legacy permission.
+
+If you previously granted `griefprevention.eavesdrop` to staff, they will keep the same behavior. If you want only PM eavesdropping or only softmute eavesdropping, use the narrower nodes.
+
+### Boundary Violation Alerts (New)
+
+Pistons and liquids that get blocked at a claim boundary now send a **chat message to the claim owner** (if they're online) explaining where the violation occurred. This covers:
+
+- Piston pushing a block **into** a claim.
+- Piston pushing a block **out of** the owner's own claim into someone else's.
+- Water or lava trying to flow **into** or **out of** a claim.
+
+Messages are deduplicated per-location, with spatial buffers (8 blocks for water, 5 blocks for lava in overworld/end, 8 for lava in the nether). Rapid sequential violations are burst-condensed into a single summary line. See [Administrator's Guide › Boundary Violation Alerts](Administrator-Guide#boundary-violation-alerts).
+
+&amp;gt; **Note**: this is a **feedback-only** system. The goal is helping players understand where flow is being blocked, not adding new protection switches.
+
+## Upgrading Steps
+
+1. **Backup** your `plugins/GriefPreventionData/` folder.
+2. Replace the plugin jar with the GP3D build.
+3. Start the server and watch the console for migration-related log messages.
+4. Review `config.yml` — the new toggles (`AllowShapedClaims`, `AllowNestedSubClaims`, `VisualizationGlow`) will be appended if missing.
+5. Review `alias.yml` for the unified command handler settings.
+6. Restart once more, or run `/gpreload` if you only changed config values.
+
+Existing claims, trust data, and claim block totals are preserved. Rectangle claims continue to work exactly as before; shaped polygon claims are only created when a player explicitly enters shaped mode (and only if `AllowShapedClaims: true`).
+
+## Rollback
+
+The data format is forward-compatible for rectangle claims, so going back to upstream GP will usually work, **but**:
+
+- Any **shaped (polygon) claims** created with GP3D will not round-trip back to upstream GP. Upstream does not understand polygon footprints and will reject or truncate the data.
+- Any **3D subclaims** with Y-level bounds will not round-trip back to upstream GP either.
+
+If you know you might roll back, keep `AllowShapedClaims: false`. Or, more simply, take a full backup of `GriefPreventionData/` before enabling those features.
+
+# Permissions
+
+All permissions start with `griefprevention.` unless noted. Defaults match `plugin.yml`.
+
+## Player Permissions (default: `true`)
+
+| Permission | Default | Description |
+|---|---|---|
+| `griefprevention.claims` | `true` | Required for claim-related slash commands. Parent of all granular claim permissions below. |
+| `griefprevention.createclaims` | `true` | Allows players to create claims with the shovel. |
+| `griefprevention.abandonallclaims` | `true` | Allows `/abandonallclaims`. |
+| `griefprevention.buysellclaimblocks` | `true` | Allows `/buyclaimblocks` and `/sellclaimblocks`. |
+| `griefprevention.trapped` | `true` | Allows `/trapped`. |
+| `griefprevention.givepet` | `true` | Allows `/givepet`. |
+| `griefprevention.unlockdrops` | `true` | Allows `/unlockdrops`. |
+| `griefprevention.ignore` | `true` | Allows `/ignore`, `/unignore`, and `/ignorelist`. |
+| `griefprevention.witherexplosions` | `true` | Allows `/witherexplosions` (**GP3D addition**). |
+
+### Granular Claim Command Permissions
+
+All permissions below are **children of `griefprevention.claims`** in `plugin.yml`. This means granting `griefprevention.claims: true` (the default) automatically grants all of them. To restrict a specific command, explicitly set that child permission to `false` while keeping `griefprevention.claims: true`.
+
+| Permission | Command(s) | Description |
+|---|---|---|
+| `griefprevention.trust` | `/trust` | Grant build trust to a player. |
+| `griefprevention.untrust` | `/untrust` | Revoke trust from a player. |
+| `griefprevention.accesstrust` | `/accesstrust` | Grant access trust (bed, buttons, levers). |
+| `griefprevention.containertrust` | `/containertrust` | Grant container trust (chests, crops, animals). |
+| `griefprevention.permissiontrust` | `/permissiontrust` | Grant permission trust (manage trustlist). |
+| `griefprevention.neighbortrust` | `/neighbortrust`, `/distancetrust` | Grant neighbor trust to bypass minimum distance. |
+| `griefprevention.checkclaimdistance` | `/claim distance check` | Check minimum distance to nearby claims. |
+| `griefprevention.toggleclaimdistance` | `/claim distance toggle` | Toggle whether all players bypass minimum distance for a claim. |
+| `griefprevention.claimslist` | `/claimslist` | List claim blocks and claims. |
+| `griefprevention.abandonclaim` | `/abandonclaim` | Abandon a claim. |
+| `griefprevention.abandontoplevelclaim` | `/abandontoplevelclaim` | Abandon a claim and all its subdivisions. |
+| `griefprevention.extendclaim` | `/extendclaim` | Resize a claim by pushing/pulling a boundary. |
+| `griefprevention.subdivideclaims` | `/subdivideclaims` | Switch to 2D subdivision mode. |
+| `griefprevention.restrictsubclaim` | `/restrictsubclaim` | Restrict a subclaim from inheriting parent permissions. |
+| `griefprevention.basicclaims` | `/basicclaims` | Switch to basic claims mode. |
+| `griefprevention.claimexplosions` | `/claimexplosions` | Toggle explosions in a claim. |
+| `griefprevention.checkclaimexpiry` | `/checkclaimexpiry` | View claim expiration details. |
+| `griefprevention.shapedclaims` | `/shapedclaims` | Switch to shaped (non-rectangular) claims mode. |
+| `griefprevention.3dsubdivideclaims` | `/3dsubdivideclaims` | Switch to 3D subdivision mode. |
+| `griefprevention.buysellclaimblocks` | `/buyclaimblocks`, `/sellclaimblocks` | Buy/sell claim blocks for currency. |
+| `griefprevention.witherexplosions` | `/witherexplosions` | Toggle wither explosions in a claim. |
+| `griefprevention.unlockdrops` | `/unlockdrops` | Allow others to pick up your death drops. |
+| `griefprevention.trapped` | `/trapped` | Teleport out of a claim you can't build in. |
+| `griefprevention.givepet` | `/givepet` | Give away a tamed pet. |
+| `griefprevention.createclaims` | *(shovel)* | Create new claims with the golden shovel. |
+| `griefprevention.accruals` | *(passive)* | Accrue claim blocks at the configured hourly rate. |
+| `griefprevention.ignore` | `/ignore`, `/unignore`, `/ignorelist` | Ignore/unignore players in chat. |
+| `griefprevention.abandonallclaims` | `/abandonallclaims` | Abandon all your claims at once. |
+
+**Example — disable only `/3dsubdivideclaims` for a group:**
+
+    :::yaml
+    # LuckPerms example
+    /lp permission set griefprevention.3dsubdivideclaims false
+Players in that group will still have access to all other claim commands via `griefprevention.claims: true`, but `/3dsubdivideclaims` will be denied.
+
+## Admin Permissions (default: `op`)
+
+| Permission | Default | Description |
+|---|---|---|
+| `griefprevention.adminclaims` | `op` | Create, delete, and build in administrative claims. |
+| `griefprevention.adminclaims.convert` | `op` | **GP3D addition.** Use `/makeadmin` and `/makebasic` to convert claims between basic and admin ownership. |
+| `griefprevention.claimslistother` | `op` | Access `/claimslist &amp;lt;player&amp;gt;` for other players. |
+| `griefprevention.ignoreclaims` | `op` | Allows `/ignoreclaims` admin override mode. |
+| `griefprevention.deleteclaims` | `op` | Delete and resize other players' claims. |
+| `griefprevention.deleteclaimsinworld` | `op` | Allows `/deleteclaimsinworld` and `/deleteuserclaimsinworld`. |
+| `griefprevention.transferclaim` | `op` | Allows `/transferclaim`. |
+| `griefprevention.adjustclaimblocks` | `op` | Adjust bonus claim blocks, set accrued blocks. |
+| `griefprevention.restorenature` | `op` | Allows `/restorenature`. |
+| `griefprevention.restorenatureaggressive` | `op` | Allows `/restorenatureaggressive` and `/restorenaturefill`. |
+| `griefprevention.softmute` | `op` | Allows `/softmute`. |
+| `griefprevention.separate` | `op` | Allows `/separate` and `/unseparate`. |
+| `griefprevention.claimbook` | `op` | Allows `/claimbook`. |
+| `griefprevention.unlockothersdrops` | `op` | Allows `/unlockdrops &amp;lt;player&amp;gt;`. |
+| `griefprevention.reload` | `op` | Allows `/gpreload`. |
+| `griefprevention.visualizenearbyclaims` | `op` | Shift+right-click with the investigation tool to see all nearby claims. |
+| `griefprevention.seeclaimsize` | `op` | See another player's claim size with the investigation tool. |
+| `griefprevention.seeinactivity` | `op` | See how long a claim owner has been offline via the investigation tool. |
+| `griefprevention.overrideclaimcountlimit` | `op` | Bypass the total claim-count limit. |
+| `griefprevention.spam` | `op` | Bypass spam protection. |
+| `griefprevention.lava` | `op` | Place lava where they have build permission (still not near other players). |
+| `griefprevention.notignorable` | `op` | Cannot be ignored via `/ignore`. |
+
+## Eavesdrop Permissions
+
+GP3D splits the single upstream `griefprevention.eavesdrop` permission into finer-grained nodes. All default `op`.
+
+| Permission | Default | Description |
+|---|---|---|
+| `griefprevention.eavesdrop` | `op` | Blanket / legacy permission — grants PM and softmute eavesdropping. |
+| `griefprevention.eavesdrop.pm` | `op` | **GP3D addition.** See private (`/tell`-style) messages only. |
+| `griefprevention.eavesdrop.softmute` | `op` | **GP3D addition.** See soft-muted messages only. |
+| `griefprevention.eavesdrop.signs` | `op` | See newly-placed signs as chat messages. |
+| `griefprevention.eavesdrop.immune` | `op` | Exempt from being eavesdropped (for staff who need privacy). |
+| `griefprevention.eavesdropimmune` | `op` | Legacy alias for the above — players with this can't have their PMs eavesdropped. |
+
+## Other / Feature Permissions
+
+| Permission | Default | Description |
+|---|---|---|
+| `griefprevention.checkclaimexpiry` | `false` | Allows `/checkclaimexpiry`. |
+| `griefprevention.premovementchat` | `false` | Chat before moving (bypasses anti-bot delay). |
+| `griefprevention.extendclaim.toolbypass` | `false` | Use `/extendclaim` without holding the modification tool. |
+| `griefprevention.deathblow` | — | Bundled in `griefprevention.admin.*`. |
+
+## Permission Bundle
+
+`griefprevention.admin.*` is a convenience node that grants the full admin bundle:
+
+- `griefprevention.ignoreclaims`
+- `griefprevention.adminclaims`
+- `griefprevention.adminclaims.convert`
+- `griefprevention.adjustclaimblocks`
+- `griefprevention.deleteclaims`
+- `griefprevention.spam`
+- `griefprevention.lava`
+- `griefprevention.eavesdrop`
+- `griefprevention.deathblow`
+- `griefprevention.softmute`
+- `griefprevention.reload`
+- `griefprevention.visualizenearbyclaims`
+- `griefprevention.overrideclaimcountlimit`
+- `griefprevention.transferclaim`
+- `griefprevention.claimslistother`
+- `griefprevention.separate`
+- `griefprevention.eavesdrop.signs`
+- `griefprevention.eavesdrop.pm`
+- `griefprevention.eavesdrop.softmute`
+- `griefprevention.eavesdrop.immune`
+- `griefprevention.claimbook`
+- `griefprevention.notignorable`
+- `griefprevention.seeinactivity`
+- `griefprevention.deleteclaimsinworld`
+- `griefprevention.unlockothersdrops`
+- `griefprevention.seeclaimsize`
+- `griefprevention.restorenature`
+- `griefprevention.restorenatureaggressive`
+
+Grant this to senior staff who need everything. Use the narrower nodes for junior staff with scoped responsibilities.
+
+# Placeholders (PlaceholderAPI)
+
+GriefPrevention3D provides its own PlaceholderAPI expansion with identifier `gp3d`. These placeholders can be used in any plugin that supports PlaceholderAPI (chat plugins, scoreboards, holograms, TAB, etc.).
+
+In addition, GriefPrevention's official PlaceholderAPI expansion can be installed from the PlaceholderAPI eCloud to provide claim block and owner placeholders.
+
+## Installation
+
+### GriefPrevention3D placeholders
+
+No setup is required. GriefPrevention3D automatically registers its PlaceholderAPI expansion on startup.
+
+* **Expansion ID:** `gp3d`
+* **Persists:** Yes
+
+### Additional GriefPrevention placeholders
+
+Install the official GriefPrevention PlaceholderAPI expansion:
+
+    :::text
+    /papi ecloud download GriefPrevention
+    /papi reload
+
+* **Expansion ID:** `griefprevention`
+
+---
+
+# GriefPrevention3D Placeholders
+
+## Available Placeholders
+
+| Placeholder                | Description                                                 | Example Output                                                                 |
+| -------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------ |
+| `%gp3d_in_subdivision%`    | Whether the player is inside a subdivision (child claim)    | `true` / `false`                                                               |
+| `%gp3d_in_3d_subdivision%` | Whether the player is inside a 3D subdivision               | `true` / `false`                                                               |
+| `%gp3d_is_trusted%`        | Whether the player has any trust level in the current claim | `true` / `false`                                                               |
+| `%gp3d_trust_level%`       | The player's trust level in the current claim (localized)   | `Owner`, `Manager`, `Builder`, `Container`, `Access`, `Untrusted`, `Unclaimed` |
+
+## Trust Level Values
+
+The `%gp3d_trust_level%` placeholder returns a localized string based on the player's trust in the current claim.
+
+| Trust Level | Description                                                           |
+| ----------- | --------------------------------------------------------------------- |
+| `Owner`     | Player owns the claim                                                 |
+| `Manager`   | Player has Manage trust (can manage claim settings and trust others)  |
+| `Builder`   | Player has Build trust (can build and break blocks)                   |
+| `Container` | Player has Container trust (can access containers)                    |
+| `Access`    | Player has Access trust (can use doors, buttons, and enter the claim) |
+| `Untrusted` | Player is inside a claim but has no trust                             |
+| `Unclaimed` | Player is not standing inside a claim                                 |
+
+---
+
+# GriefPrevention Placeholders
+
+These placeholders are provided by PlaceholderAPI's GriefPrevention expansion.
+
+## Claim Statistics
+
+| Placeholder                                   | Description                                    | Example Output |
+| --------------------------------------------- | ---------------------------------------------- | -------------- |
+| `%griefprevention_claims%`                    | Number of claims the player owns               | `5`            |
+| `%griefprevention_claims_formatted%`          | Formatted claim count                          | `5`            |
+| `%griefprevention_bonusclaims%`               | Player's bonus claim blocks                    | `1000`         |
+| `%griefprevention_bonusclaims_formatted%`     | Formatted bonus claim blocks                   | `1,000`        |
+| `%griefprevention_accruedclaims%`             | Player's accrued claim blocks                  | `2500`         |
+| `%griefprevention_accruedclaims_formatted%`   | Formatted accrued claim blocks                 | `2,500`        |
+| `%griefprevention_remainingclaims%`           | Remaining claim blocks available to the player | `3200`         |
+| `%griefprevention_remainingclaims_formatted%` | Formatted remaining claim blocks               | `3,200`        |
+
+## Current Claim Information
+
+| Placeholder                                      | Description                                            | Example Output |
+| ------------------------------------------------ | ------------------------------------------------------ | -------------- |
+| `%griefprevention_currentclaim_ownername%`       | Owner of the claim the player is currently standing in | `Steve`        |
+| `%griefprevention_currentclaim_ownername_color%` | Owner name with Minecraft colors applied               | `§aSteve`      |
+
+---
+
+# Usage Examples
+
+## Chat Plugins
+
+Example (EssentialsChat, ChatControl, etc.):
+
+    :::text
+    Format: "{prefix} &amp;lt;player&amp;gt; %gp3d_trust_level%"
+
+Result:
+
+    :::text
+    [Member] &amp;lt;steve&amp;gt; Builder
+
+---
+
+## Holograms
+
+Example (HolographicDisplays):
+
+    :::text
+    Line 1: "&amp;amp;bCurrent Claim Status"
+    Line 2: "&amp;amp;eTrust: &amp;amp;f%gp3d_trust_level%"
+    Line 3: "&amp;amp;eClaim Blocks: &amp;amp;f%griefprevention_remainingclaims_formatted%"
+    Line 4: "&amp;amp;eOwner: &amp;amp;f%griefprevention_currentclaim_ownername%"
+    Line 5: "&amp;amp;eIn Subdivision: &amp;amp;f%gp3d_in_subdivision%"
+    Line 6: "&amp;amp;eIn 3D Subdivision: &amp;amp;f%gp3d_in_3d_subdivision%"
+
+---
+
+## Scoreboards
+
+Example:
+
+    :::text
+    Title: "&amp;amp;6Claim Info"
+    Line 1: "&amp;amp;eTrust: &amp;amp;f%gp3d_trust_level%"
+    Line 2: "&amp;amp;eClaim Blocks: &amp;amp;f%griefprevention_remainingclaims_formatted%"
+    Line 3: "&amp;amp;eOwner: &amp;amp;f%griefprevention_currentclaim_ownername%"
+    Line 4: "&amp;amp;eSub: &amp;amp;f%gp3d_in_subdivision%"
+    Line 5: "&amp;amp;e3D Sub: &amp;amp;f%gp3d_in_3d_subdivision%"
+
+---
+
+# Localization
+
+The trust level strings returned by `%gp3d_trust_level%` are fully localizable through `messages.yml`:
+
+    :::yaml
+    Messages:
+      PlaceholderTrustLevelUnclaimed: "Unclaimed"
+      PlaceholderTrustLevelOwner: "Owner"
+      PlaceholderTrustLevelManager: "Manager"
+      PlaceholderTrustLevelBuilder: "Builder"
+      PlaceholderTrustLevelContainer: "Container"
+      PlaceholderTrustLevelAccess: "Access"
+      PlaceholderTrustLevelUntrusted: "Untrusted"
+
+---
+
+# Notes
+
+* GriefPrevention3D automatically registers its PlaceholderAPI expansion.
+* `%gp3d_trust_level%` uses localized strings from `messages.yml`.
+* Player-specific placeholders require the target player to be online.
+* GriefPrevention3D uses `persist() = true`, allowing placeholders to remain available across PlaceholderAPI reloads.
+* Both `gp3d` and `griefprevention` placeholders can be used together in any PlaceholderAPI-compatible plugin.
+
+### GriefPrevention3D Wiki
+
+**Getting Started**
+- [Home](Home)
+- [Getting Started](Getting-Started)
+- [Migration](Migration)
+- [Locale](Locale)
+
+**Features**
+- [Key Features](Key-Features)
+- [3D Subdivisions](Key-Features#3d-subdivisions)
+- [Shaped Claims](Key-Features#shaped-claims)
+- [Nested Subclaims](Key-Features#nested-subclaims)
+- [Visualization Glow](Key-Features#visualization-glow)
+- [Unified `/claim` Handler](Key-Features#unified-command-handler)
+- [Claim Selection](Key-Features#claim-selection)
+- [Boundary Violation Alerts](Administrator-Guide#boundary-violation-alerts)
+
+**Reference**
+- [Commands](Commands)
+- [Permissions](Permissions)
+- [Configuration](Configuration)
+- [Placeholders](Placeholders)
+- [API Documentation](API)
+
+**Admin**
+- [Administrator's Guide](Administrator-Guide)
+- [`/makeadmin` and `/makebasic`](Administrator-Guide#converting-claims-between-admin-and-basic)
&amp;lt;/steve&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/subcommand&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/subcommand&amp;gt;&lt;/b&gt;&lt;/a&gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/amount&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/amount&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/price&amp;gt;&amp;lt;/string&amp;gt;&amp;lt;/tab&amp;gt;&amp;lt;/string&amp;gt;&amp;lt;/price&amp;gt;&amp;lt;/string&amp;gt;&amp;lt;/string&amp;gt;&amp;lt;/string&amp;gt;&amp;lt;/string&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/uuid,&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/group&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&amp;lt;/player&amp;gt;&lt;/pre&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jack Korte</dc:creator><pubDate>Thu, 02 Jul 2026 13:04:31 -0000</pubDate><guid>https://sourceforge.net5558ca63ef024edf758a7edbc415b3b12041123f</guid></item><item><title>Key Features modified by Jack Korte</title><link>https://sourceforge.net/p/griefprevention3d/wiki/Key%2520Features/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v3
+++ v4
@@ -143,8 +143,7 @@

 Claim selection is the most ergonomic change in GP3D.

-- **Resizing a claim selects it.** After you start a resize with the golden shovel, the claim becomes your "selected claim" for the session.
-- **Creating a 3D subdivision selects it.** The new subdivision is automatically selected so trust commands target it immediately.
+- **Resizing a claim selects it.** After you right-click a claim corner with the golden shovel, the claim becomes your "selected claim" for the session.

 - While a claim is selected, **claim-local commands run against that claim** even if you walk away:
   - `/trust`, `/untrust`, `/containertrust`, `/accesstrust`, `/permissiontrust`
   - `/trustlist`
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jack Korte</dc:creator><pubDate>Thu, 02 Jul 2026 13:04:31 -0000</pubDate><guid>https://sourceforge.net639e34d04e42923296f5c410007b2fb336fbe462</guid></item><item><title>Key Features modified by Jack Korte</title><link>https://sourceforge.net/p/griefprevention3d/wiki/Key%2520Features/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v2
+++ v3
@@ -26,22 +26,6 @@

 - Available on all servers by default.
 - Nested 3D subdivisions work when `AllowNestedSubClaims: true`.
 - Parent claims remain full-height; the Y-bounding only applies to the subdivision itself.
-
----
-
-## 3D Admin Claims
-
-Create free, height-bounded administrative claims with exact Y-level boundaries.
-
-    /3dadminclaims
-
-Use this command (or `/aclaim mode admin3d`) to switch to 3D admin claim mode. Unlike regular `Admin` mode which extends claims from the clicked Y down to the world floor, `Admin3D` mode uses the clicked Y coordinates directly as the top and bottom bounds.
-
-- Requires the `griefprevention.adminclaims` permission (same as regular admin claims).
-- Claims are free (no claim blocks consumed) with `null` owner ID.
-- Minimum size and claim block checks are bypassed.
-- Multiple admin 3D claims can be **stacked** at different Y levels within the same X/Z area.
-- Visualization uses a distinct `ADMIN_CLAIM_3D` style (glowstone/pumpkin by default).

 ---

@@ -131,8 +115,6 @@

 - With `standalone: true` (default), all the classic standalone commands — `/trust`, `/abandonclaim`, `/trapped`, etc. — are still registered and behave exactly as upstream.
 - With `standalone: false`, **only** `/claim` and `/aclaim` are registered; the per-subcommand standalone entries are ignored. Use this mode if another plugin owns commands like `/trust` and you want to avoid conflicts.

----
-
 ## Wither Explosion Toggle

 Toggle whether wither explosions may damage blocks inside a specific claim.
@@ -143,15 +125,35 @@

 ---

+## 3D Admin Claims
+
+Create free, height-bounded administrative claims with exact Y-level boundaries.
+

+    /3dadminclaims
+
+Use this command (or `/aclaim mode admin3d`) to switch to 3D admin claim mode. Unlike regular `Admin` mode which extends claims from the clicked Y down to the world floor, `Admin3D` mode uses the clicked Y coordinates directly as the top and bottom bounds.
+
+- Requires the `griefprevention.adminclaims` permission (same as regular admin claims).
+- Claims are free (no claim blocks consumed) with `null` owner ID.
+- Minimum size and claim block checks are bypassed.
+- Multiple admin 3D claims can be **stacked** at different Y levels within the same X/Z area.
+- Visualization uses a distinct `ADMIN_CLAIM_3D` style (glowstone/pumpkin by default).
+
 ## Claim Selection

 Claim selection is the most ergonomic change in GP3D.


 - **Resizing a claim selects it.** After you start a resize with the golden shovel, the claim becomes your "selected claim" for the session.
+- **Creating a 3D subdivision selects it.** The new subdivision is automatically selected so trust commands target it immediately.
 - While a claim is selected, **claim-local commands run against that claim** even if you walk away:
   - `/trust`, `/untrust`, `/containertrust`, `/accesstrust`, `/permissiontrust`
   - `/trustlist`
-  - `/abandonclaim`
+  - `/abandonclaim`, `/deleteclaim`
+  - `/transferclaim`
+  - `/checkclaimexpiry`
+  - `/restrictsubclaim`
+  - `/claimexplosions`, `/claimwitherexplosions`
+  - `/extendclaim`
 - This solves the common UX complaint that 1x1x1 3D subdivisions were hard to access — now selecting/resizing a claim is a real gateway into claim management.

 The flow is deliberately claim-local and obvious. The most common owner actions are reachable without memorizing a long command list or constantly walking back and forth.
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jack Korte</dc:creator><pubDate>Thu, 02 Jul 2026 13:04:31 -0000</pubDate><guid>https://sourceforge.netad63fe41185769da9bd6499e6f73865eba6de759</guid></item><item><title>Key Features modified by Jack Korte</title><link>https://sourceforge.net/p/griefprevention3d/wiki/Key%2520Features/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v1
+++ v2
@@ -26,6 +26,22 @@

 - Available on all servers by default.
 - Nested 3D subdivisions work when `AllowNestedSubClaims: true`.
 - Parent claims remain full-height; the Y-bounding only applies to the subdivision itself.
+
+---
+
+## 3D Admin Claims
+
+Create free, height-bounded administrative claims with exact Y-level boundaries.
+
+    /3dadminclaims
+
+Use this command (or `/aclaim mode admin3d`) to switch to 3D admin claim mode. Unlike regular `Admin` mode which extends claims from the clicked Y down to the world floor, `Admin3D` mode uses the clicked Y coordinates directly as the top and bottom bounds.
+
+- Requires the `griefprevention.adminclaims` permission (same as regular admin claims).
+- Claims are free (no claim blocks consumed) with `null` owner ID.
+- Minimum size and claim block checks are bypassed.
+- Multiple admin 3D claims can be **stacked** at different Y levels within the same X/Z area.
+- Visualization uses a distinct `ADMIN_CLAIM_3D` style (glowstone/pumpkin by default).

 ---

@@ -115,6 +131,8 @@

 - With `standalone: true` (default), all the classic standalone commands — `/trust`, `/abandonclaim`, `/trapped`, etc. — are still registered and behave exactly as upstream.
 - With `standalone: false`, **only** `/claim` and `/aclaim` are registered; the per-subcommand standalone entries are ignored. Use this mode if another plugin owns commands like `/trust` and you want to avoid conflicts.

+---
+
 ## Wither Explosion Toggle

 Toggle whether wither explosions may damage blocks inside a specific claim.
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jack Korte</dc:creator><pubDate>Thu, 02 Jul 2026 13:04:30 -0000</pubDate><guid>https://sourceforge.netcf9e7db713f7fd4cb4cd16b8cd9d06900060e7da</guid></item><item><title>Key Features modified by Jack Korte</title><link>https://sourceforge.net/p/griefprevention3d/wiki/Key%2520Features/</link><description>&lt;div class="markdown_content"&gt;&lt;h1 id="h-key-features"&gt;Key Features&lt;/h1&gt;
&lt;p&gt;This page is the reference for every feature that makes GriefPrevention3D different from upstream GriefPrevention. It is also the page to read first when configuring the plugin for your server.&lt;/p&gt;
&lt;h2 id="h-table-of-contents"&gt;Table of Contents&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#3d-subdivisions"&gt;3D Subdivisions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#shaped-claims"&gt;Shaped Claims&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#nested-subclaims"&gt;Nested Subclaims&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#visualization-glow"&gt;Visualization Glow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#unified-command-handler"&gt;Unified Command Handler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#wither-explosion-toggle"&gt;Wither Explosion Toggle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#claim-selection"&gt;Claim Selection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#subtle-changes"&gt;Subtle Changes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="h-3d-subdivisions"&gt;3D Subdivisions&lt;/h2&gt;
&lt;p&gt;Create subdivisions with exact Y-level boundaries.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/3dsubdivideclaims
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Use this command to switch to 3D subdivision mode. Your golden shovel will then set both the X/Z corners &lt;strong&gt;and&lt;/strong&gt; the Y bounds of the subdivision, giving you precise vertical control (useful for apartment buildings, layered storage rooms, sky bases, and tunnel networks under shared surface claims).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Available on all servers by default.&lt;/li&gt;
&lt;li&gt;Nested 3D subdivisions work when &lt;code&gt;AllowNestedSubClaims: true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Parent claims remain full-height; the Y-bounding only applies to the subdivision itself.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="h-shaped-claims"&gt;Shaped Claims&lt;/h2&gt;
&lt;p&gt;Allow non-rectangular, orthogonal polygon parent claims.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# config.yml&lt;/span&gt;
&lt;span class="nt"&gt;GriefPrevention&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;Claims&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;AllowShapedClaims&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class=""&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Set to &lt;code&gt;true&lt;/code&gt; to enable. Reload with &lt;code&gt;/gpreload&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/shapedclaims
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Use this command to switch to shaped claim mode. In shaped mode:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Right-click in unclaimed land&lt;/strong&gt; places orthogonal corners for a new polygon claim. Each corner must be axis-aligned (same X or same Z) as the previous corner. Click the starting corner again once a valid closed loop exists.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Right-click an owned top-level 2D claim's corner&lt;/strong&gt; to resize it the same way basic mode does.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shift-click an owned boundary&lt;/strong&gt; to drop a &lt;strong&gt;segment marker&lt;/strong&gt;. Markers split a side into independently resizable segments, which you can then &lt;code&gt;/expandclaim&lt;/code&gt; individually.&lt;/li&gt;
&lt;li&gt;Shift-clicking a marker again removes it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The plugin enforces the orthogonal rule in the interaction model — diagonal placements are rejected immediately with a chat message, and preview markers show the only valid next directions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;When shaped claims are disabled&lt;/strong&gt; (&lt;code&gt;AllowShapedClaims: false&lt;/code&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/shapedclaims&lt;/code&gt; and &lt;code&gt;/shapedclaim&lt;/code&gt; are hidden / hard-disabled.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/claim mode shaped&lt;/code&gt; is not offered.&lt;/li&gt;
&lt;li&gt;Shaped-only helper behavior stays dormant and falls back to basic mode.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See also: &lt;a href="./Administrator-Guide"&gt;Administrator's Guide&lt;/a&gt; for how shaped claims interact with admin tools.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="h-nested-subclaims"&gt;Nested Subclaims&lt;/h2&gt;
&lt;p&gt;Allow subdivisions inside other subdivisions.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# config.yml&lt;/span&gt;
&lt;span class="nt"&gt;GriefPrevention&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;Claims&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;AllowNestedSubClaims&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class=""&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Set to &lt;code&gt;true&lt;/code&gt; to allow subdivisions inside other subdivisions. Permission inheritance still follows the normal parent → child rules unless a subclaim is restricted with &lt;code&gt;/restrictsubclaim&lt;/code&gt;.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="h-visualization-glow"&gt;Visualization Glow&lt;/h2&gt;
&lt;p&gt;Enable glowing claim boundary visualization.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# config.yml&lt;/span&gt;
&lt;span class="nt"&gt;GriefPrevention&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;VisualizationGlow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class=""&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Set to &lt;code&gt;true&lt;/code&gt; to make claim borders glow when visualized (via the golden shovel, investigation tool, or &lt;code&gt;/trust&lt;/code&gt; feedback).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Requires Minecraft 1.19.3+.&lt;/strong&gt; On older versions the option is simply ignored and fake-block borders are used.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="h-unified-command-handler"&gt;Unified Command Handler&lt;/h2&gt;
&lt;p&gt;GriefPrevention3D ships a unified command surface through &lt;code&gt;alias.yml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# plugins/GriefPreventionData/alias.yml&lt;/span&gt;
&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class=""&gt;true&lt;/span&gt;
&lt;span class="nt"&gt;standalone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class=""&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;With &lt;code&gt;enabled: true&lt;/code&gt;, the following unified form is available:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/claim create
/claim trust &amp;lt;player&amp;gt;
/claim abandon
/claim explosions
/claim expand &amp;lt;amount&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Most claim-local commands that used to require "stand inside the claim, then type the standalone command" can now be reached through &lt;code&gt;/claim &amp;lt;subcommand&amp;gt;&lt;/code&gt; after a claim is selected.&lt;/p&gt;
&lt;h3 id="h-standalone-commands-still-work"&gt;Standalone Commands Still Work&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;With &lt;code&gt;standalone: true&lt;/code&gt; (default), all the classic standalone commands — &lt;code&gt;/trust&lt;/code&gt;, &lt;code&gt;/abandonclaim&lt;/code&gt;, &lt;code&gt;/trapped&lt;/code&gt;, etc. — are still registered and behave exactly as upstream.&lt;/li&gt;
&lt;li&gt;With &lt;code&gt;standalone: false&lt;/code&gt;, &lt;strong&gt;only&lt;/strong&gt; &lt;code&gt;/claim&lt;/code&gt; and &lt;code&gt;/aclaim&lt;/code&gt; are registered; the per-subcommand standalone entries are ignored. Use this mode if another plugin owns commands like &lt;code&gt;/trust&lt;/code&gt; and you want to avoid conflicts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h-wither-explosion-toggle"&gt;Wither Explosion Toggle&lt;/h2&gt;
&lt;p&gt;Toggle whether wither explosions may damage blocks inside a specific claim.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/witherexplosions
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Works the same way as &lt;code&gt;/claimexplosions&lt;/code&gt; — stand in (or have selected) the claim, run the command. Gated by &lt;code&gt;griefprevention.witherexplosions&lt;/code&gt; (default: &lt;code&gt;true&lt;/code&gt;).&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="h-claim-selection"&gt;Claim Selection&lt;/h2&gt;
&lt;p&gt;Claim selection is the most ergonomic change in GP3D.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Resizing a claim selects it.&lt;/strong&gt; After you start a resize with the golden shovel, the claim becomes your "selected claim" for the session.&lt;/li&gt;
&lt;li&gt;While a claim is selected, &lt;strong&gt;claim-local commands run against that claim&lt;/strong&gt; even if you walk away:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/trust&lt;/code&gt;, &lt;code&gt;/untrust&lt;/code&gt;, &lt;code&gt;/containertrust&lt;/code&gt;, &lt;code&gt;/accesstrust&lt;/code&gt;, &lt;code&gt;/permissiontrust&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/trustlist&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/abandonclaim&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;This solves the common UX complaint that 1x1x1 3D subdivisions were hard to access — now selecting/resizing a claim is a real gateway into claim management.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The flow is deliberately claim-local and obvious. The most common owner actions are reachable without memorizing a long command list or constantly walking back and forth.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="h-subtle-changes"&gt;Subtle Changes&lt;/h2&gt;
&lt;p&gt;Small behavior improvements worth knowing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Resize selects the claim.&lt;/strong&gt; See above — commands like &lt;code&gt;/trust&lt;/code&gt; and &lt;code&gt;/abandonclaim&lt;/code&gt; run against the selected claim.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/restrictsubclaim&lt;/code&gt; on a parent claim&lt;/strong&gt; instantly restricts all subdivisions inside that claim in one command, rather than one subclaim at a time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/trustlist&lt;/code&gt; shows inherited permissions&lt;/strong&gt; from the parent claim, not just explicit trusts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eavesdrop permission split&lt;/strong&gt; — &lt;code&gt;griefprevention.eavesdrop.pm&lt;/code&gt; and &lt;code&gt;griefprevention.eavesdrop.softmute&lt;/code&gt; are now separate nodes on top of the blanket &lt;code&gt;griefprevention.eavesdrop&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/expandclaim&lt;/code&gt; on shaped segments&lt;/strong&gt; operates on the segmented subsection rather than the whole side, when a shift-click segment marker exists.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Selected-claim commands&lt;/strong&gt;: resize-oriented command variants respect the current selection context instead of only the player's block position.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Temporary basic-mode segment previews&lt;/strong&gt;: shift-clicking a claim boundary in basic claims mode creates a temporary segment preview for convenience. These previews do not persist across visualization refreshes and disappear if the player does nothing with them. Only deliberate &lt;code&gt;/shapedclaim&lt;/code&gt; shift-click segmentation persists to the claim.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Older-version compatibility fixes&lt;/strong&gt; shipped for &lt;code&gt;COPPER_GOLEM_STATUES&lt;/code&gt;, &lt;code&gt;CHAINS&lt;/code&gt;, and chain-material lookups.&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jack Korte</dc:creator><pubDate>Thu, 02 Jul 2026 13:04:28 -0000</pubDate><guid>https://sourceforge.neta132bc9f3f50a8150c01124d520ef02637b01593</guid></item></channel></rss>