promotional bannermobile promotional banner

BackpackSSS

Custom tiered backpacks with progression crafting, upgrade system and persistent storage — designed for survival servers.

File Details

BackPackSSS-1.8.jar

  • R
  • Apr 22, 2026
  • 2.09 MB
  • 22
  • 1.21.11+11

File Name

BackPackSSS-1.8.jar

Supported Versions

  • 1.21.11
  • 1.21.10
  • 1.21.9
  • 1.21.8
  • 1.21.7
  • 1.21.6
  • 1.21.5
  • 1.21.4
  • 1.21.3
  • 1.21.2
  • 1.21.1
  • 1.21

[1.8] - 2026-04-21

Fixed

  • 🔴 Critical — onDrop never fired: getSessions() returns a Map<BackpackUUID, Session> but the old code checked getSessions().containsKey(playerUUID). Because the key is a backpack UUID, the check was always false — players could freely drop items while a backpack was open. Fixed by adding BackpackManager.isPlayerHasOpenBackpack(playerUUID) which queries the correct playerToBackpack map.

  • 🔴 Critical — isBackpack() missed freshly crafted items: isBackpack() previously checked for BP_ID_KEY, which is only assigned on the first right-click of a backpack item. Brand-new crafted backpacks had no ID yet, so they were invisible to the pickup/max-backpack limit check. Fixed by checking BP_TIER_KEY instead, which is always present from createBackpack().

  • 🔴 Critical — Data loss race condition in saveAll(): The old saveAll() dispatched async save tasks and then immediately called sessions.clear(). The async lambdas could still be running when the map was cleared, leading to NPE or lost saves on server shutdown/reload. Replaced with a new syncSaveAll() that blocks on the main thread during disable/reload, ensuring all data is written before the connection is closed.

  • 🟡 Task leak on /bp reload: reloadPlugin() created a new BackpackManager (and called startAutoSaveTask() on it) without ever cancelling the previous manager's repeating task. Each reload stacked another permanent 2-minute timer. Fixed by calling cancelAutoSaveTask() before tearing down the old manager.

  • 🟡 Auto-save not restarted after reload: reloadPlugin() built a new BackpackManager but forgot to call startAutoSaveTask() on it — the replacement manager ran with no auto-save at all. Fixed.

  • 🟡 Hardcoded version string in startup log: onEnable() printed "version 1.0" regardless of the actual version. Changed to getDescription().getVersion().

  • 🟢 Config typo — "Week Backpack": Tier-1 display name was "Week Backpack" (a day of the week) instead of "Weak Backpack". Fixed in config.yml.

Improved

  • BackpackCommand now uses backpack.admin permission instead of player.isOp(), allowing server admins to grant give/reload access via any permissions plugin (LuckPerms, etc.).

  • /backpack give <tier> [player]: Admin can now give a backpack directly to another online player: /bp give 2 Steve. Tab-completion lists online player names.

  • Recipe deduplication on reload: registerRecipes() now removes old recipes before re-adding them, preventing "duplicate recipe" warnings in the console on each /bp reload.

  • Safe inventory size mismatch handling: If a backpack's stored item count exceeds the configured size (e.g. after an admin reduces the tier size), the plugin now logs a warning and truncates gracefully instead of throwing an ArrayIndexOutOfBoundsException.

  • plugin.yml: Added backpack.admin permission entry with default: op. Updated description and usage string for the backpack command.