All versions
0.1.0
Release
InventoryBackup 0.1.02 months ago 201
Compatibility
Minecraft: Java Edition
26.3
26.2
26.1.x
1.21.x
1.20.x
Platforms
Bukkit
Paper
Purpur
Spigot
Changes
[0.1.0] - 2026-08-11
New Features
- Public Developer API (
com.zfzfg:InventoryBackup-API):- Standalone API module allowing other plugins to create, list, load, restore, and delete backups, open the preview GUI, and resolve names to UUIDs.
- Retrieved via
InventoryBackupProvider.get()orgetOptional(), backed by Bukkit'sServicesManager(softdepend: [InventoryBackup]is sufficient). - All
CompletableFutures complete directly on the Bukkit main thread, allowing callers to interact with Bukkit methods safely without manual scheduler hops. - Detailed documentation and integration examples in API.md.
- Custom Bukkit Events:
- Five custom events shipped inside the plugin JAR, usable with or without compiling against the API module:
BackupCreateEvent(cancellable, allows retyping backups and attaching custom metadata).BackupCreatedEvent(fired after a backup is successfully saved to disk).InventoryRestoreEvent(cancellable, allows inspecting or modifying snapshot items before applying).InventoryRestoredEvent(fired after a restore is successfully applied).BackupDeletedEvent(fired with reasonAPI,COMMAND, orEXPIRED).
- The plugin's internal death handler and admin commands route through the same service, ensuring uniform event dispatching.
- Five custom events shipped inside the plugin JAR, usable with or without compiling against the API module:
- Offline Player Restores:
- Aiming a restore or missing items command at an offline player automatically queues it in
pending-restores.yml. - Automatically applied on the player's next join with a 1-tick delay to prevent overwriting by other login listeners; persists across server restarts.
- Added
/inv <player> pendingto inspect queued restores and/inv <player> cancelpendingto discard them (permissioninventorybackup.pending). - Added
pending-restore-expiry-daysconfiguration setting (default: 30 days) to automatically purge expired pending entries.
- Aiming a restore or missing items command at an offline player automatically queues it in
- Native Multi-Language Support (i18n):
- Complete English (
en) and German (de) translations for all player messages, GUI titles, list headers, and console logs. - Message texts decoupled into dedicated bundles:
messages_en.yml(master fallback) andmessages_de.yml. - Added
/inv lang [en|de]to view or change language on the fly (rewritesconfig.ymland reloads immediately without a server restart; permissioninventorybackup.lang). - Added
/inv reloadto reload configuration and message bundles on demand (permissioninventorybackup.reload). - Layered fallback system: missing keys in custom translations seamlessly fall back to English defaults without breaking plugin execution.
- Complete English (
- UUID-Based Storage & Player Index:
- Backups are stored in
inventories/<owner-uuid>/rather than player names, preventing orphaned backups when players change their username. - Implemented
names.ymlindex cache populated on player join and backup operations, eliminating blocking Mojang API requests during commands and tab completion. - Automatic migration on first startup (
StorageMigrator) moves legacy player-name folders to UUIDs; unrecognized folders are safely parked ininventories/_unmigrated/with zero data loss.
- Backups are stored in
- Free-Form Backup Types & Key-Value Metadata:
- Backup types are no longer restricted to
deathandmanual. Custom types (e.g.quest,dungeon,pvp) are normalized to[a-z0-9-]for filename safety. - Arbitrary string metadata stored alongside backups in the YAML header and accessible via
BackupHandle.metadata(key).
- Backup types are no longer restricted to
- Dupe-Proof Preview GUI:
- Implemented
PreviewHolderandPreviewGuiListenerto block all inventory clicks, drags, and hotbar swaps in/inv <player> show, preventing item duplication exploits regardless of window titles or translations.
- Implemented
Bugfixes & Improvements
- Fixed
restoreInventoryreporting false positives: Previously returnedtrueas soon as the task was scheduled; storage operations are now fully blocking internally with completion handled asynchronously. - Fixed corrupted backup handling: A failed Base64 decode previously produced an empty item array that wiped player inventories upon restore. Unreadable backups are now safely logged, skipped, and left untouched.
- Fixed armor & offhand overwrite during partial restores: Contents array slot bounds are strictly enforced so that restoring main inventory items does not inadvertently alter armor or offhand slots.
- Fixed same-second backup filename collisions: When multiple backups are created for a player within the same second, an incremental numeric suffix (e.g.
-2) is appended to prevent overwrites. - Fixed custom backup type timestamp parsing: The cleanup parser now matches fixed-width timestamp prefixes rather than cutting at the last underscore.
- Fixed unbounded lock map memory leak:
InventoryManagerreleases player write locks upon player disconnect (PlayerQuitEvent). - Fixed mixed-language outputs: Eliminated remaining hardcoded German and English strings across console logging, update checking, list headers, GUI titles, and missing-key indicators (
&c[missing: messages.<key>]). - Enhanced tab completion: Now completes subcommands (
backup,version,lang,reload), actions (restore,show,givemissing,list,delete,pending,cancelpending), online players, known offline players from the local index, and backup filenames.
Breaking Changes
- Storage Layout Migration: Backup directory changed from
inventories/<PlayerName>/toinventories/<owner-uuid>/. Existing directories are migrated automatically on first startup. InventoryManagerRefactoring: Deprecated name-keyed methods in favor of UUID-keyed methods returningBackupHandle/BackupSnapshot. External integrations must migrate toInventoryBackupAPI.
Build & Testing
- Multi-module Maven architecture:
InventoryBackup-parentcontainingapi(packaged as standalone JAR with sources and javadoc) andplugin(shading API classes without relocation). - Added comprehensive JUnit 5 test suite with 18 automated tests:
BundleParityTest: Verifies full translation parity, placeholder integrity, and missing key detection.StorageMigratorTest: Tests folder migration, merging, and unmigrated folder parking against real temporary directories.BackupFileNameTest: Tests timestamp formatting, UUID parsing, and suffix handling.BackupTypeTest: Tests type normalization and validation.InventorySerializerTest: Tests Base64 serialization and deserialization across Minecraft inventory structures.
[0.0.7] - 2026-08-08
New Features
- Added Modrinth Update Checker (
UpdateChecker.java) - Asynchronous update checking with Modrinth v2 API integration (https://modrinth.com/project/rpKY25cW). - Added
/inv versioncommand - On-demand version check and update lookup with direct download links and live feedback. - Added
UpdateNotifyListener- Notifies administrators with permissioninventorybackup.update.notifyon join using cached check results (zero HTTP requests during login). - Added tab completion support for
versionsubcommand in/inv.
Bugfixes & Improvements
- Fixed
NoClassDefFoundError: Base64Coder: Replaced deprecatedorg.yaml.snakeyaml.external.biz.base64Coder.Base64Coderwith standardjava.util.Base64(Base64.getEncoder()andBase64.getMimeDecoder()) for full compatibility with modern Paper/Purpur/Spigot 1.20+ and SnakeYAML 2.x runtimes. - Fixed URL formatting corruption in
colorize(): Switched frommessage.replace("&", "ยง")toChatColor.translateAlternateColorCodes('&', message)to ensure URLs with query parameters remain intact. - Fixed missing message fallback in
getMessage(): Missing keys in existing configurations return a fallback (&c[fehlt: messages.<path>]) instead of returning raw key strings. - Unified version definition: Switched
plugin.ymlto${project.version}so that Maven (pom.xml) is the single source of truth for the plugin version. - Robust version comparison:
UpdateCheckerhandles numeric parts, pre-release suffixes, and numeric overflows safely.
Configuration Updates
- Added
update-checkconfiguration section inconfig.yml(enabled,check-on-startup,notify-admins-on-join,modrinth-project-id,contact,stable-only,startup-delay-ticks). - Added message templates for update checking (
update-available,update-download,update-current,update-up-to-date,update-checking,update-failed,update-disabled). - Updated
plugin.ymlwithinventorybackup.update.notifypermission and updated command usage description.
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:rpKY25cW:MQ58tRSt"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:rpKY25cW:MQ58tRSt"
}

