Tags
Creators
Details
All versions
Changelog:
1.0.0
Release
Distant Decorations 1.0.02 weeks ago 34
Uploaded by
Compatibility
Minecraft: Java Edition
26.2
Platform
Fabric
Supported environments
Client and server
Required content
Any compatible version
Changes
Changelog: v0.2.0...v1.0.0
[1.0.0] - 2026-09-13
Security & Access Control
- Restricted Server Toggle Permission:
/dd togglenow strictly requires operator level 2 (Commands.LEVEL_GAMEMASTERS), preventing non-operators and moderators from toggling the mod. Public telemetry access (/dd stats) remains open to all players. - Decoupled Client Rendering Switch: Added
clientRenderingEnabledtoDistantDecorationsConfig. Executing/ddc toggleviaDistantDecorationsClientnow toggles local client-side rendering only, eliminating accidental mutation of the servermasterEnabledflag during singleplayer / integrated-server play.
Storage Safety & Persistence
- Diagnosed Corruption Quarantine:
- Region files with corrupt magic bytes (
0x4445434F), invalid format versions, payload length mismatches, or truncated streams are moved to unique, collision-safe quarantine files (r.X.Z.dat.corrupt.<timestamp>.<uuid>) to preserve raw data for forensic recovery. - Invalid stored identifiers in
DecorationId.readFromStream()translateIdentifierExceptionintoIOException, allowingServerDecorationWorldIndexto quarantine malformed files rather than propagating unhandled runtime errors into chunk reconciliation.
- Region files with corrupt magic bytes (
- Quarantine Failure Overwrite Protection:
- If moving a corrupted region file to quarantine fails (e.g., due to file locks or filesystem permission denials), the region key is added to
blockedRegionsand throws a storage exception. getOrCreateRegion()andsaveRegionToFile()strictly refuse to create or overwrite blocked regions, guaranteeing that locked or unmovable files are never overwritten with blank regions.
- If moving a corrupted region file to quarantine fails (e.g., due to file locks or filesystem permission denials), the region key is added to
- Read-Error vs. Missing File Classification:
- Replaced indeterminate
Files.exists()checks with direct stream opening. - Non-corruption I/O errors (e.g.,
AccessDeniedException) are classified asREAD_ERRORwithout quarantining, and the region is blocked from overwrite. Only confirmed file absence (NoSuchFileException/Files.notExists()) triggers new region creation.
- Replaced indeterminate
- Atomic Move Fallback: Added fallback to
StandardCopyOption.REPLACE_EXISTINGwhenAtomicMoveNotSupportedExceptionis encountered across different storage filesystems.
Lifecycle & Single-Writer Protection
- Storage-Keyed Recovery Queue:
ServerDecorationManagertracks failed unloads by normalizedPath storageDirinpendingRecoveryByStoragerather than dimension ID alone.- Prevents cross-session contamination: cleanly unloading an index in one world session does not evict pending recovery state for the same dimension in another directory.
- Single-Writer Safety Guard:
ServerDecorationManager.openIndex()verifies whether pending recovery exists for the target directory. If flushing the pending index fails, opening a new writable index is refused (returns null), preventing split-brain data corruption.
- Server Stopping Flush:
ServerDecorationManager.handleServerStopping()attempts to flush all active and pending recovery indices, returningtrueonly when all paths persist cleanly.
Network Streaming & Synchronization
- Network Tick Exception Containment:
- Wrapped snapshot resolution in
ServerNetworkManager.tick()with dedicated exception handling. Storage failures cannot crash the network tick, do not stream empty snapshots, and do not falsely mark regions as synced.
- Wrapped snapshot resolution in
- Work Budget Accounting & Retry Backoff:
- Failed snapshot loading attempts increment
materializedRegions++, ensuring faulty storage calls consume the per-tick region budget (limit: 2/tick) and prevent starvation of other network tasks. - Failed region jobs are deferred with a 3-second retry backoff delay (
FAILED_JOB_RETRY_BACKOFF_MS = 3000L) for up to 3 retries (MAX_REGION_JOB_RETRIES = 3) before abandonment.
- Failed snapshot loading attempts increment
- Subscription Eviction Cleanup:
- When out-of-range regions are removed from
desiredRegions, retry counters and timestamps are purged so that re-subscribed regions begin with a clean retry budget.
- When out-of-range regions are removed from
Build & Publication Hygiene
- Benchmark Dependency Isolation:
- Gated optional benchmark mods (
voxy,sodium,spark) into a dedicatedbenchmarkRuntimeconfiguration (canBeResolved = true, canBeConsumed = false) inbuild.gradle, used exclusively byrunIntegrationClient.
- Gated optional benchmark mods (
- Publication Metadata Assertions:
- Added validation in
build.gradleasserting published Maven POM (pom-default.xml) and Gradle module metadata (module.json) strictly expose onlyfabric-loaderandfabric-api, with zero benchmark dependency leakage regardless of whether-PenableBenchmarkModsis enabled.
- Added validation in
Testing & Verification
- Test Suite Expansion (53 total automated tests):
CommandAuthorizationRegressionTest(6 tests): Validates permission level enforcement on/dd toggleand verifies client/ddc toggleindependence from server state.StorageSafetyRegressionTest(13 tests): Validates dirty region retention, quarantine mechanics, quarantine-failure overwrite blocking, permission/access-denied handling, storage-path isolation, single-writer guards, shutdown flushes, and malformed identifier containment.ServerStorageAndNetworkTest(8 tests): Validates per-tick work budget consumption and retry backoff delay across multi-region streaming queues.DistantDecorationsIntegrationGameTest(4 GameTests): StrengthenedtestProviderCaptureAndPublishto verify real container block entity capture (Blocks.BARREL), payload decoding, bounding box accuracy, and revision invariance.
Full Changelog: https://github.com/justbecauseph/distant-decorations/compare/v0.2.0...v1.0.0
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:BTxCZXDZ:yBpuUdLY"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:BTxCZXDZ:yBpuUdLY"
}

