
GriefPrevention3D
Форк популярного GriefPrevention с поддержкой 3D-субделений. Создавайте участки с точными границами по высоте - идеально для многоуровневых построек и сложных приватов на сервере Minecraft.
Список изменений
GriefPrevention3D v18.3.2
Wiki: https://github.com/castledking/GriefPrevention3D/wiki
Overview
v18.3.0 restored manage trust as its own track: a manager may edit a claim's trust list but does not implicitly receive build, container, or access trust. That change was correct, but the storage underneath it was not. A claim kept exactly one trust value per player, so granting manage trust overwrote whatever build, container, or access trust that player already had. Before v18.3.0 the overwrite was invisible, because manage trust used to imply every lower permission. After v18.3.0 it silently locked trusted players out of chests, doors, and blocks.
This release separates the two tracks in storage so they can be held at the same time, and finishes
the /permissiontrust split that v18.3.0 started: /permissiontrust is now the command for granting
trust to a permission node, and manage trust lives entirely under /managetrust.
Manage trust no longer erases interaction trust
A claim now tracks manage trust in its own set, alongside the build/container/access map.
/managetrust <player>adds manage trust and leaves existing trust untouched./trust,/containertrust, and/accesstrustno longer remove manage trust.- The order the commands are run in no longer matters.
/untrust <player>still removes everything, as before.
The same defect existed on every path that wrote trust, and all of them are fixed:
- Loading a claim.
Builders,Containers,Accessors, andManagerswere applied in that order, so anyone listed underManagershad their interaction trust stripped on every server start. The lists are now independent. - Saving a claim. A player who holds both is written to both lists and round-trips correctly. The cross-platform document writer had a second copy of the same defect and dropped the build/container/access trust of anyone who was also a manager on its way to disk.
- Creating a subdivision. The creating player was force-set to manage trust, discarding the build or container trust that had just been copied down from the parent claim.
- Clearing inherited trust. Dropping an inherited copy of one kind of trust also dropped the other. Each track is now dropped on its own.
- Permission-node trust. A
[permission.node]entry granted manage trust is now evaluated against both tracks, so a node can carry manage trust and interaction trust together.
Two related storage bugs are fixed in the same pass:
- Neighbor trust entries were written into the
Accessorslist, which quietly promoted neighbors to access trust the next time the claim loaded. Neighbor trust has its own list and is no longer written to a bucket that does not belong to it. - The shared claim codec used by the Fabric platform stripped interaction trust from anyone listed
under
Managers, mirroring the Bukkit bug.
Existing claims are not migrated
If a player lost trust after upgrading to v18.3.0 or v18.3.1, the data on disk already lost it — the
old code overwrote the value before it was ever saved. This release stops the overwrite but does not
grant anything back. Claim owners should re-run /trust, /containertrust, or /accesstrust once
for anyone who is missing access. It will stick this time, in any command order.
Permission-node trust is its own command
/permissiontrust no longer aliases /managetrust. It now grants a permission node trust in a
claim:
/permissiontrust <permission> <access|container|build|manage>
/aclaim trust permission <permission> <type>
Both the bare dotted form and the Bukkit bracketed form are accepted, and the bracketed form is what gets stored:
/permissiontrust myserver.vip container
/permissiontrust [myserver.vip] container
A target without a dot and without brackets is rejected, so a mistyped player name cannot silently become a permission node.
inventory is accepted as a synonym for container, and manager for manage.
Command and permission changes
| Before | Now |
|---|---|
/permissiontrust <player> (alias /pt) | /managetrust <player> (alias /mt) |
/claim trust <player> permission | /claim trust <player> manage (also manager) |
| — | /permissiontrust <permission> <type> (new, alias /pt) |
| — | /aclaim trust permission <permission> <type> (new) |
| Permission | Default | Purpose |
|---|---|---|
griefprevention.managetrust | everyone | Use /managetrust. Child of griefprevention.claims. |
griefprevention.permissiontrust | operators | Grant trust to a permission node. Child of griefprevention.adminclaims. |
Read this before upgrading if you manage permissions explicitly.
griefprevention.permissiontrust previously granted /managetrust and defaulted to true. It now
means something different and defaults to false. Manage trust moved to the new
griefprevention.managetrust node, which defaults to true and is inherited from
griefprevention.claims, so ordinary players keep /managetrust with no configuration change.
If your permission plugin grants griefprevention.permissiontrust to a non-staff group, revoke it
or those players will be able to hand out trust to arbitrary permission nodes. If you explicitly
denied griefprevention.permissiontrust to stop players using the old /permissiontrust, that
denial no longer affects /managetrust; deny griefprevention.managetrust instead.
/managetrust keeps /mt but no longer answers to /pt or /permissiontrust. Both of those names
now belong to the new permission-node command, so a player who typed /pt <player> out of habit will
get a permission error instead of granting manage trust.
alias.yml upgrades no longer drop sibling entries
Merging a server's existing alias.yml against the shipped defaults recreated user-owned parent
sections, which erased default entries added by an upgrade. Adding aclaim.trust beside an existing
aclaim.restore would have removed one of them.
The merge is now leaf-level: every default value is written first, then every user value is overlaid
on top. Customizations still win, and new shipped entries survive the upgrade. This is what allows
the new /permissiontrust and /aclaim trust permission entries to appear in an alias.yml that
already exists.
Upgrade notes
- No claim-data migration is required and no claim files are rewritten on upgrade.
- No message keys were added. The existing
InvalidPermissionIDandCantGrantThatPermissionmessages cover the new command's failures. griefprevention.permissiontrustchanged meaning and default — see the table above.- A player may now appear in more than one section of
/trustlist; a manager who also has build trust is listed in both. That is the intended display. - Trust granted to a permission node still requires the target player to actually hold that node at the time of the check, exactly as before.
Verification
The full ./gradlew check pipeline passes: 434 tests, 0 failures, 0 errors — 245 in the Bukkit
plugin, 136 in the shared core, 51 on the Fabric platform, and 2 in the Fabric bootstrap. This
includes the universal JAR audit, legacy class loading, shaded-core isolation, and the Fabric boot
smoke test.
New regression coverage asserts that manage trust and interaction trust survive each other through
loading, both grant orders, both drop paths, and a save round trip; that neighbor trust is never
written as access trust; that the permission-node identifier rules reject bare player names; that
/permissiontrust and /managetrust require their own permission nodes; that the shipped permission
layout keeps them separate; and that an alias.yml merge preserves both user entries and newly
shipped siblings.
Files Changed
M gp3d-core/src/main/java/com/griefprevention/claims/ClaimTrustLevel.java
M gp3d-core/src/main/java/com/griefprevention/claims/ClaimTrustSnapshot.java
M gp3d-core/src/main/java/com/griefprevention/persistence/ClaimDocumentCodec.java
M src/main/java/com/griefprevention/commands/CommandAliasConfiguration.java
M src/main/java/com/griefprevention/commands/UnifiedAdminClaimCommand.java
M src/main/java/com/griefprevention/commands/UnifiedClaimCommand.java
M src/main/java/me/ryanhamshire/GriefPrevention/Alias.java
M src/main/java/me/ryanhamshire/GriefPrevention/Claim.java
M src/main/java/me/ryanhamshire/GriefPrevention/ClaimPermission.java
M src/main/java/me/ryanhamshire/GriefPrevention/DataStore.java
M src/main/java/me/ryanhamshire/GriefPrevention/FlatFileDataStore.java
M src/main/java/me/ryanhamshire/GriefPrevention/GriefPrevention.java
M src/main/resources/alias.yml
M src/main/resources/plugin.yml
M src/test/java/com/griefprevention/commands/UnifiedCommandAliasBehaviorTest.java
M src/test/java/me/ryanhamshire/GriefPrevention/ClaimPermissionTest.java
M src/test/java/me/ryanhamshire/GriefPrevention/FlatFileClaimMigrationParityTest.java
M gp3d-core/src/test/java/com/griefprevention/claims/ClaimTrustLevelTest.java
M gp3d-core/src/test/java/com/griefprevention/claims/ClaimTrustSnapshotTest.java
M gp3d-core/src/test/java/com/griefprevention/persistence/ClaimDocumentCodecTest.java
A gp3d-core/src/main/java/com/griefprevention/claims/ClaimTrustCommandPermissions.java
A gp3d-core/src/main/java/com/griefprevention/claims/ClaimTrustIdentifier.java
A gp3d-core/src/test/java/com/griefprevention/claims/ClaimTrustIdentifierTest.java
A src/test/java/com/griefprevention/commands/UnifiedAdminClaimPermissionTrustTest.java
A src/test/java/me/ryanhamshire/GriefPrevention/TrustCommandPermissionTest.java
A src/test/java/me/ryanhamshire/GriefPrevention/TrustPermissionLayoutTest.java
