File Details
claimmyland-1.20.1-2.5.0.jar
- R
- Apr 6, 2026
- 826.12 KB
- 48
- 1.20.1
- Forge
File Name
claimmyland-1.20.1-2.5.0.jar
Supported Versions
- 1.20.1
Curse Maven Snippet
Changelog for Claim My Land 1.20.1
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
> ⚠️ IMPORTANT — Breaking Change & Backup Warning > > v2.x is not save-compatible with v1.x. Parcel data saved by any v1 release will not load in v2. If you are upgrading an existing world, your claimed parcels will be lost. > > Back up your world before installing v2. Copy your entire world folder to a safe location before upgrading. Once you have loaded the world in v2, downgrading back to v1 is not supported.
> 💡 Recommended: Since this mod is heavily command-based, we recommend using 🔗 Chat Plus for a better command history and larger chat window.
[2.5.0] - 2026-03-28
🎉 Highlights
- Backup config hot-reload — changes to backup settings in
claimmyland-server.tomlnow take effect immediately without a server restart. - Claim celebration fireworks — committing a claim now launches firework rockets at the parcel centre, visible to all nearby players. Rocket count and color scale with parcel type.
- Foundation Stone centering — the Foundation Stone is now placed at the XZ centre of the parcel by default, making claim placement more intuitive.
- Farmland trample & chorus fruit protection — two new protection gaps closed: players and mobs can no longer trample farmland inside foreign parcels, and chorus fruit teleportation into protected parcels is blocked.
- CML OpsList — specific players can now be granted CML ops-level permission via UUID list in config, without requiring server op status.
- Deeds as Loot — Deed items now appear in vanilla dungeon, stronghold, nether, and end loot tables, and in Treasure2 chest tiers, allowing land claiming to emerge organically through gameplay.
➕ Added
Backup Config Hot-Reload
RollingJsonSaveris now reinitialized whenclaimmyland-server.tomlis reloaded at runtime.ModConfigEvent.Reloadinghandler added toClaimMyLand— callsreinitBackup()when the CML config is reloaded.- If backup is disabled in config the saver is set to null; existing null-guards in
BackupSubCommandand the tick handler handle this safely.
Claim Celebration Fireworks
- Committing a claim now spawns firework rockets at the parcel centre, visible to all nearby players via standard entity replication.
- Rocket count scales with parcel type: 1 for CITIZEN/PLAYER, 2 for ZONE, 3 for NATION.
- Rocket burst color is type-coded: NATION → blue (
0x00AAFF), CITIZEN → purple (0xAA55FF), ZONE → yellow (0xFFFF55), PLAYER → green (0x55FF55). - Rockets spawn at the surface heightmap position above the parcel centre (not at the parcel floor) to ensure visibility.
- New config toggle:
Config.SERVER.celebration.fireworksEnabled(default:true). Disable on busy servers where fireworks are unwanted. - New class:
CelebrationHelperincore.util.
Foundation Stone Centering
- The Foundation Stone is now placed at the XZ centre of the parcel box by default.
- Odd-sized deeds floor the half-offset (e.g. a 15-wide deed places 7 blocks left of stone, 8 right).
- Legacy behaviour (stone = min corner) is available via
Config.SERVER.general.foundationStoneCentered = false. - Single change point:
FoundationStoneBlockEntity.getAbsoluteBox()— all deed types benefit automatically. - Existing committed parcels are unaffected — their absolute coords are already stored and are not recalculated.
Deed.useOn()updated: aftergetAbsoluteBox(), the parcel's coords and size are synced to the centered absolute box viaapplyWorldPosition()before claim validation.handleClaim()andhandleEmbeddedClaim()Boxparameter removed — callers now useparcel.getBox()internally. Call sites simplified.
Additional Protection Events
- Farmland trample:
BlockEvent.FarmlandTrampleEventhandler added toModEvents. Prevents players and mobs from trampling farmland inside protected parcels. Config flag:enableFarmlandTrampleEvent(default:true). - Chorus fruit teleport:
EntityTeleportEvent.ChorusFruithandler added toModEvents. Prevents players from teleporting into protected parcels via chorus fruit. Config flag:enableChorusFruitTeleport(default:true).
CML OpsList
- New config entry
opsListinConfig.SERVER.general— a list of player UUID strings granted CML ops-level permission without requiring server op status. ModEvents.hasOpsPermission()updated to check the list./cml-opsBrigadierrequires()predicate updated to check the list.- Management command (
/cml-ops opslist) deferred to v2.6 — direct config file editing is sufficient for v2.5.
Deeds as Loot — Vanilla
- Deed items now appear in 10 vanilla loot tables via Forge Global Loot Modifier.
- Loot is gated by
Config.SERVER.general.enableDeedLoot(default:true). - Four tiers with tuned chance and deed pool:
- Common (chance 0.15): simple dungeon, nether bridge, village weaponsmith, fishing treasure →
player_deed_10/16/32 - Uncommon (chance 0.12): stronghold corridor, bastion treasure →
player_deed_10/16/32 - Rare (chance 0.08): stronghold library, woodland mansion →
player_deed_16/32,nation_deed_100 - Epic (chance 0.05): end city treasure, ancient city →
player_deed_32,nation_deed_100
- Common (chance 0.15): simple dungeon, nether bridge, village weaponsmith, fishing treasure →
- Higher tier chests have higher deed chances (harder to find = more reliable reward when opened).
- Loot deeds have no owner set — the using player becomes the owner at claim time.
- New classes:
DeedLootModifier,ModLootModifiersincore.loot. - New data files:
deed_loot_common/uncommon/rare/epic.jsonunderdata/claimmyland/loot_modifiers/. DeedFactory.createTieredDeed(RandomSource, String tier)added.DeedFactory.createNationDeedForLoot()added — creates a full world-height nation deed without requiring aLevelreference.
Deeds as Loot — Treasure2 Integration
- Deed items now inject into Treasure2 chest loot tables for servers running Treasure2.
- Six tiers mapped to CML deed pools (Treasure2
commonexcluded — too low tier for deeds):uncommon→ common pool (chance tuned)scarce→ uncommon poolrare→ rare poolepic→ epic poollegendary→ epic pool (higher chance than standard epic)mythical→ epic pool (highest chance)
- Inject files under
data/treasure2/loot_tables/injects/chests/prefixed withcml_(e.g.cml_uncommon.json).
⚙️ Changed
@Deprecated(since="2.4")dimension-blindParcelRegistryoverloads removed — all call sites now use dimension-aware signatures. Affected methods:find(),findBuffer(),findBoxes(),intersectsParcel(),resolveConflictState(),findLeastSignificant(),findMostSignificant(),isFireSpreadPrevented(),findRaw(),findBufferRaw(),resolveParcelAt().FoundationStoneBlockEntity.getAbsoluteBox()— centering logic added, guarded byConfig.SERVER.general.foundationStoneCentered.Deed.useOn()—applyWorldPosition()called aftergetAbsoluteBox()to sync parcel coords/size to the centered absolute box before claim validation.handleClaim()/handleEmbeddedClaim()no longer receive aBoxparameter.ModEvents.onLivingDestroyBlock()— fixed missingevent.setCanceled(true)call. Previously the dimension and intersection checks ran but never actually cancelled the event.ModEvents.onSpawnEntity()—isEntityWhitelisted()extracted as a private helper method for clarity and reuse.ClaimMyLandconstructor —ModLootModifiers.register(modEventBus)added.- Conflict resolution centralized into
ParcelConflictResolver.isConflict()— single authoritative conflict determination replaces duplicated logic across five code paths (handleClaim(),resolveConflictState(),ClientParcelRegistry.findConflicting(),FoundationStoneEvents, andDemolishParcelSubCommand). Four-rule priority: hierarchical → foreign owner → same-owner sibling → same-owner cross-type. - Buffer conflict checks are now bidirectional — both "does existing parcel's buffer reach proposed box" (Rule 2a) and "does proposed parcel's buffer reach existing parcel box" (Rule 2b) are checked during claim and conflict state resolution.
- Nation tenant cleanup on demolish centralized into
CommandHelper.cleanupNationTenants()—DemolishEstateSubCommandandDemolishParcelSubCommandnow use a shared helper that finds tenants viaParcelRegistry.findAllByNationEstateId()and properly unregisters both parcels and estates.
🐛 Fixed
ModEvents.onLivingDestroyBlock()— event was never cancelled even when a mob attempted to destroy a block inside a protected parcel.event.setCanceled(true)now called correctly.- Nation Foundation Stone placement blocked in wilderness —
NationParcel.canPlaceAt()now checks for empty wilderness directly, bypassing the default embedded placement check that always failed for Nations. - Nation parcel not removed from registry on demolish —
DeedFactory.createNationDeed()mutated the live parcel's size Box in-place, shifting thePARCELS_BY_COORDSmap key sounregisterCoords()silently failed. Fixed by creating a defensive copy of the size Box before modifying Y values. - Nation demolish did not remove tenant parcels (Citizens, Zones) —
DemolishEstateSubCommand.demolish()only iterated the Nation estate's own parcels, leaving orphaned tenants in the registry and NBT. - Foundation Stone preview inside foreign Nation/Zone could not be broken by the placing player —
ModEvents.onBlockBreak()now exempts Foundation Stones when the breaker is the block entity's owner.
[2.4.0] - 2026-03-26
- 🔗 Requires GottschCore v2.6 or later.*
🎉 Highlights
- Multi-dimension support — parcels are now fully dimension-aware. Protection works correctly in the Nether, End, and modded dimensions.
- Parcel entry title — a title overlay announces the estate name when crossing into a Nation, Citizen, or Player parcel, with a configurable cooldown to prevent spam.
- Claim celebration — committing a claim triggers a perimeter particle wave visible only to the claiming player.
- Foundation Stone particles — placing a Foundation Stone emits a dust displacement effect radiating outward from the stone.
- Nation player blacklist — nation owners can now block specific players from claiming land within their nation, with a generic denial message that protects the owner's privacy.
➕ Added
Multi-Dimension Support (BST Dimension Refactor)
- Parcels are now fully dimension-aware in the internal spatial index (BST). Previously all parcel lookups were dimension-blind and relied on post-filtering, which could cause cross-dimension false-positives.
- The Foundation Stone, Border Stone, and all protection events now correctly resolve parcels per-dimension, enabling reliable parcel protection in the Nether, End, and modded dimensions.
- GottschCore
CoordsIntervalupdated:dimensionis now a first-class field and the primary sort key in the BST. - Fixed a pre-existing bug in
CoordsIntervalTreeNBTSerializerwhere the RIGHT child was incorrectly wired to the LEFT slot during deserialization.
Parcel Entry Title Display
- When crossing into a Nation, Citizen, or Player parcel, a title overlay is now displayed using Minecraft's vanilla title system.
- Nation parcels show the estate name as a large bold title with type and owner as a subtitle.
- Citizen and Player parcels show a smaller subtitle only, visually distinguishing them from Nation announcements.
- Zone parcel boundaries and wilderness transitions are silent.
- A per-parcel cooldown (default 30 seconds) prevents repeated title spam when crossing the same border multiple times.
- Server master switch:
enableParcelEntryTitleinclaimmyland-server.toml(default:true). - Client opt-out:
enableParcelEntryTitleinclaimmyland-client.toml(default:true). - Timing is configurable: fade-in, stay, and fade-out ticks all adjustable in client config.
- Cooldown clears on dimension change and logout so familiar parcels re-announce after a context switch.
Foundation Stone Placement Particles
- Placing a Foundation Stone now emits a dust displacement particle effect.
- Phase 1: 24
POOFparticles radiate outward at ground level from the stone's position. - Phase 2: 10
SMOKEparticles rise from the stone's centre, simulating displaced air.
Claim Celebration Effects
- Successfully committing a claim now triggers a perimeter particle wave visible only to the claiming player (intentionally private — avoids revealing position on PvP servers).
- For small parcels (perimeter ≤ 128 blocks): particles emit along the full XZ perimeter.
- For large parcels (perimeter > 128 blocks): particles emit for up to 12 blocks outward from the Foundation Stone along each of the four edges.
- Each perimeter position emits
HAPPY_VILLAGER(rising) andPOOF(radiating outward) particles.
Nation Player Blacklist
- Nation owners can now blacklist specific players from claiming land within their nation, even if those players possess a valid Deed.
- Blacklisted players receive a generic denial message that does not reveal they are blacklisted or identify the nation, preserving the nation owner's privacy.
- The nation owner is always exempt from their own blacklist.
- Blacklist blocks all claim paths: Deed use on a Foundation Stone, CitizenTool parcel creation, and ZoningTool zone creation.
- New commands:
/cml estate blacklist add <estateName> <playerName>— add a player to the blacklist/cml estate blacklist remove <estateName> <playerName>— remove a player from the blacklist/cml estate blacklist list <estateName>— view the blacklist (output sent privately to the command sender only)
- Blacklist is displayed in estate details (
/cml estate details) for nation owners. - Blacklist count and add/remove icons shown in the estate list view for nation estates.
Server Config Sync
- A new
ServerConfigSyncPacketnow syncs selected server config values to clients on login and dimension change. - Currently synced values:
parcelBufferRadius,nationParcelBufferRadius,enableParcelEntryTitle. - Ensures client-side features (JourneyMap buffer overlay, parcel entry title) always reflect the current server configuration.
⚙️ Changed
EstateDisplayFormatter: Nation estate entries now show a Blacklisted Players section in the detailed view, and a blacklist count with add icon in the list view.FormatterConstants: Fixed/cml-opsicon builders — they were incorrectly using/cmlcommands instead of/cml-opscommands.FormatterConstants: FixedplayerWhitelistAddIcon()andplayerWhitelistRemoveIcon()— command paths were incorrect (whitelist add player→whitelist friends add/remove).FormatterConstants: Added ops variants for all estate icon builders (estateRenameIconOps,estateDemolishIconOps,estateRemoveIconOps,estateTransferIconOps,playerWhitelistAddIconOps,playerWhitelistRemoveIconOps).FormatterConstants: Added blacklist icon builders (playerBlacklistAddIcon,playerBlacklistRemoveIcon, and their ops variants).FormatterConstants: Teleport icon changed from↗(small, hard to read) to➤(solid arrowhead, more visible at Minecraft chat font size).WhitelistFormatter: AddedformatEstateListPlayerBlacklist()to display blacklisted players with correct remove icons and ops/non-ops command variants.ParcelRegistry: Allfind(),findBuffer(),findBoxes(),intersectsParcel(),resolveConflictState(),findLeastSignificant(),findMostSignificant(),isFireSpreadPrevented(),resolveParcelCached(), andsyncParcelToClient()methods now have dimension-aware overloads. Old dimension-blind signatures are retained but deprecated.
🐛 Fixed
- Fixed
CoordsIntervalTreeNBTSerializerRIGHT child deserialization bug — the RIGHT child was being wired to the LEFT slot, corrupting the in-memory BST structure after a world load. - Fixed
/cml-opsestate action icons firing/cmlcommands instead of/cml-opscommands. - Fixed Friends Whitelist add/remove icon commands using wrong command path.
- Fixed cross-dimension parcel false-positives — parcels in the Nether/End could incorrectly match queries in the Overworld due to the dimension-blind BST.
🔧 Technical Notes
BlockEvent.EntityPlaceEventis server-side only in Forge 1.20.1 — Foundation Stone placement particles are triggered viaSyncParcelPacket.handle()instead (on new preview arrival).- Fluid spread prevention was investigated but no reliable cancellable Forge 1.20.1 event exists for fluid flow — deferred to v2.5.
- Fire and lava-ignited fire prevention was confirmed already working via the existing
BlockEvent.EntityPlaceEvent+isFireSpreadPrevented()path andModTags.Blocks.FIRE_BLOCKS.
- 🔗 Requires GottschCore v2.6 or later.*

