
InventoryBackup
A Minecraft Spigot plugin that automatically saves player inventories on death and provides comprehensive restore functionality.
Оцените первым
120
0
Список изменений
[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.
Файлы
InventoryBackup-0.1.0.jar(104.79 KiB)
ОсновнойМетаданные
Канал релиза
Release
Номер версии
0.1.0
Загрузчики
BukkitPaperPurpurSpigot
Версии игры
1.20–26.2
Загрузок
51
Дата публикации
11.08.2026
