Links
Tags
Creators
Details
Licensed CC-BY-NC-SA-4.0
Published 8 months ago
Updated 5 months ago
All versions
1.3-alpha
Alpha
Improves5 months ago 203
Compatibility
Minecraft: Java Edition
26.1.x
1.21.x
1.20.x
1.19.x
1.18.x
1.17.x
1.16.x
1.15.x
1.14.x
1.13.x
1.12.x
1.11.x
1.10.x
1.9.x
1.8.x
Platforms
Bukkit
Folia
Paper
Purpur
Spigot
Changes
Added
- Transactional file migration using a temporary staging directory to ensure all-or-nothing data transfer
- Non-blocking retry mechanism using
ScheduledExecutorServicewith configurable delay between attempts - Automatic rollback of backup files when the final atomic move operation fails
- Staging directory cleanup on transfer failure to prevent leftover temporary files
FilePairhelper class to encapsulate source, temporary destination, final destination, and critical/optional flag for each migrated file
Fixed
- Thread pool blocking caused by recursive
copyWithRetryconsuming worker threads during retry waits - Data inconsistency when some files succeed and others fail during a single transfer operation (partial transfer no longer possible)
- Backup file not being created before the main data copy, risking loss of the target player's original data
Changed
copyWithRetrynow usesScheduledExecutorServicefor delayed retries instead of recursive calls on the main executor poolcopyFilenow performs a single copy attempt and returns immediately, with retry logic handled externallytransferPlayerDataand related methods replaced bytransferAllFiles,copyAllToTemp, andmoveTempToTargetto support transactional migration- Backup creation and optional file transfers (stats, advancements) integrated into the unified transactional pipeline
ExecutorServicerenamed toexecutorfor clarity; newschedulerfield added for delayed retry scheduling
Removed
- Recursive retry logic (
copyWithRetrycalling itself withthenCompose) that blocked worker threads - Separate
backupIfNeeded,transferMainData,transferExtraData, andtransferFilemethods, consolidated intotransferAllFilesand supporting methods - Direct file overwrite approach that allowed partial transfer states
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:MIMbZFQ8:VBn8waUl"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:MIMbZFQ8:VBn8waUl"
}

