🔐 PrivateChest - Complete Container Protection System
PrivateChest is a lightweight yet powerful container protection plugin that lets players secure their chests, barrels, and shulker boxes with personal passwords. No complicated land-claim systems needed — just simple, secure, and optimized protection for survival servers, SMPs, and factions!
✨ Core Features
🔒 Password Protection System
Lock chests, trapped chests, barrels, and all 17 shulker box variants
Secure SHA-256 password encryption with salt
Only the owner can access protected containers
Automatic double chest detection and protection
🛡️ Advanced Security
Explosion Protection: TNT, Creepers, and other explosions cannot destroy locked containers
Hopper Protection: Blocks hoppers, droppers, and dispensers from bypassing security
Block Placement Protection: Prevents players from placing automated extraction blocks near protected containers
Configurable Hopper Access: Optional setting for servers that want automated sorting systems
🤝 Trust System
Share container access with other players without revealing your password
/trust <player> - Grant access to specific players
/trust list - View all trusted players
/untrust <player> - Remove access from a player
/untrust all - Remove all trusted players at once
Trusted players receive notifications when accessing shared containers
🏷️ Container Renaming
Give your locked containers custom names (up to 16 characters)
/renamecontainer <name> - Set a custom name
/renamecontainer remove - Remove custom name
Smart validation for name compatibility
📊 Flexible Limit System
Basic Limits: Set a global limit for all container types
Granular Limits: Configure different limits per container type (chests, barrels, shulker boxes)
Permission-Based: Fine-tune limits with permissions like privatechest.limit.chest.10
Unlimited option available for VIP players
🪧 Sign Protection (Alternative Method)
Lock containers by placing a sign with [Private] on the first line
No password required — ownership-based protection
Works alongside password protection
🌐 Cross-Platform Compatibility
Minecraft Versions
Supported: 1.16.5 → 1.21.x (and future updates)
Server Software
Standard (Single-threaded):
CraftBukkit, Spigot, Paper
Purpur, Pufferfish
Any Spigot/Paper fork
Regionized (Multi-threaded):
Folia, Luminol, LightingLuminol
LeafMC, Kaiiju
Any Folia-based fork
Bedrock Edition Support
Full compatibility via Geyser and Floodgate
Automatic detection of Bedrock players
Messages adapted for optimal display on each platform
Java and Bedrock players can seamlessly interact with the same protected containers
SQLite: Database storage for large servers with many locked containers
Key Settings
# Storage system
storage-type: yaml # or 'sqlite'
# Message prefix
use-prefix: true
prefix: "&7[&6PrivateChest&7] "
# Sign protection
enable-sign-protection: true
# Container limits
enable-chest-limits: false
default-chest-limit: 5
# Granular limits per container type
container-limits:
enabled: false
types:
chest: 10
barrel: 5
shulker_box: 2
# Notifications
notify-owner-on-open: true
notify-admin-on-open: true
notify-trusted-on-open: true
# Auto-cleanup of orphaned data
auto-cleanup:
periodic-enabled: true
# Hopper protection (configurable for sorting systems)
hopper-protection:
allow-hopper-access: false # true for automated systems
🧩 Developer API
PrivateChest offers a simple API for developers to integrate with protected containers:
import me.tuplugin.privatechest.api.PrivateChestAPI;
// Check if a block is locked
boolean isLocked = PrivateChestAPI.isLocked(block);
// Check if a player owns a block
boolean isOwner = PrivateChestAPI.isOwner(block, player);
// Lock a container programmatically
PrivateChestAPI.lockBlock(block, player, "password");
// Unlock a container
PrivateChestAPI.unlockBlock(block);
// Get the owner UUID
UUID owner = PrivateChestAPI.getOwner(block);
🛠️ Installation
Download the JAR and place it in your /plugins folder
Start or reload your server
Edit config.yml and messages.yml to customize
Done! All players can start protecting their containers
🌍 Multilingual Support
PrivateChest is fully translatable! Edit messages.yml and config.yml to translate all messages to any language. The default language is English, but you can easily adapt it to fit your server's style and community.
# PrivateChest 3.0
The largest release so far. Every part of the plugin was reworked: storage, protection, threading,
version support and translation. Several features that were configurable in 2.x but did nothing are now
connected, and several ways to lose data or bypass protection are closed.
---
## Updating from 2.x
**Back up your `plugins/PrivateChest/` folder.** Then drop in the new jar and restart. No manual
conversion, no downtime, no data file changes.
### Done for you
| | |
|:---|:---|
| Backups | `data.yml.v2-backup`, or `privatechest.db.v2-backup` plus a `privatechest_data_v2_backup` table |
| Data format | Unchanged, read as-is |
| Passwords | Old formats still work, upgraded to PBKDF2 as each is entered correctly |
| Plain text passwords | Hashed at first startup (pre-2.0 data only) |
| New config options | Added to `config.yml`, your values untouched |
| New messages | Added to `messages.yml`, your wording untouched |
### Needs your attention
**1. SQLite users: trust and container names were never saved by 2.x.** The SQLite backend accepted
them and discarded them, so they vanished on every restart. 3.0 stores them properly but cannot recover
what earlier versions threw away. Your players may need to run `/trust` again once.
**2. Per-shulker-colour limits are gone.** If you configured
`container-limits.types.white_shulker_box` and friends, replace them with the single `shulker_box`
entry. Old keys and the old per-colour permission nodes are ignored.
**3. Four behaviour changes.** All of them make the plugin stricter or fix something broken:
| Change | Why |
|:---|:---|
| Trusted players can no longer **break** containers, only use them | Trust granted destruction rights by accident |
| Breaking half a double chest no longer unlocks the other half | It used to leave the surviving chest open |
| Hoppers **can** be placed next to containers you have access to | 2.x refused next to your own chests, breaking players' own sorting systems |
| `/privatechest` requires a valid subcommand | It used to reload on any argument, including typos |
**4. Optional:** set `language: es` (or your own translation) and delete `messages.yml` if you want it
recreated in another language.
---
## Data safety
Four ways to lose protections, all closed.
- **Worlds not loaded at startup lost every protection inside them.** Records were dropped from memory
and the next save wrote that loss to disk permanently. Affects anyone unmounting a world or using a
world manager that loads after plugins.
- **An interrupted save could truncate `data.yml`** and destroy every protection on the server. Writes
are now atomic: a temp file moved into place.
- **Worlds with a dot in the name** (`world.old`) had their records silently mangled.
- **A pre-2.0 plain text password containing `:`** was mistaken for a hash, never upgraded, and could
never be verified again, permanently locking its owner out.
Also: unreadable records are now counted and reported at startup instead of vanishing, and a double
chest that fails to lock halfway through is rolled back instead of leaving one protected half.
---
## Performance
- **Saves no longer happen per action.** Every lock, unlock, break, `/trust` and rename used to rewrite
the entire dataset on the main thread. Changes are now collected and written by a background thread on
an interval. Ten players locking chests in one second produce one write, not ten full rewrites.
- **`InventoryMoveItemEvent` was the plugin's biggest per-tick cost.** It fires for every item transfer
on the server, and 2.x built a full container snapshot, including a copy of its inventory, for both
the source and the destination of each one. Handlers now start with one lookup in a per-chunk index.
- **Chunk loads removed from hot paths.** Limit checks read every one of a player's recorded positions
out of the world on each lock attempt. `/clearchests` did the same for every record on the server.
Neither does now, and cleanup only examines chunks that are already loaded.
- Double chest detection reads block data instead of block state.
- SQLite writes only changed rows, in a transaction, with WAL and an indexed owner column. It also
falls back to YAML instead of starting with no protection if it cannot open.
```yaml
save-interval-seconds: 5 # a clean shutdown always writes everything
```
---
## Protection gaps closed
| Gap | Detail |
|:---|:---|
| **Pistons** | Barrels and shulker boxes are pushable. A griefer could shove a locked barrel one block: the record stayed at the old coordinates and the container came to rest unprotected |
| **Only right-clicks were checked** | Any other route into a container's contents went straight through. Opening is now guarded at the inventory level too |
| **Fire and mobs** | Nothing stopped a protected container burning or being removed by a mob |
| **Hopper minecarts** | Item pickup into a protected container was not covered |
| **Duplicate messages** | A right-click fires once per hand and the handler did not check which, so every message arrived twice |
### Passwords
Stored as **PBKDF2-HMAC-SHA256** with a random salt, instead of one pass of SHA-256 which is fast enough
to brute force offline. Raising the iteration count later strengthens existing passwords as they are
used, with no migration step. Measured cost at the default: about 9 ms per `/unlockchest`.
Guessing was also unlimited and invisible. Now rate limited and optionally logged with the player name
and container position.
```yaml
security:
password-hash-iterations: 20000
max-password-attempts: 5
attempt-window-seconds: 60
lockout-seconds: 300
log-failed-attempts: true
```
---
## Minecraft version support
**One jar for 1.16.5 through 26.2.** Everything version-specific resolves at startup.
- **Copper chests can be protected**, all oxidation and waxed stages, and **crafters** too. Neither was
possible in 2.x, whose container list was twenty types written into the code.
- **An oxidizing copper chest stays yours.** Its block type changes as it weathers; every stage counts
as the same container, so it stays locked and your count does not shift.
- **`[Private]` signs read both sides.** Signs have had a writable back since 1.20, and a tag written
there locked nothing while appearing to.
- **The container list is yours**, and future containers work without a plugin update:
```yaml
containers:
auto-discover: true # protect containers added by future versions
discovery-patterns: ["*_CHEST", "*_SHULKER_BOX"]
additional: [] # e.g. FURNACE, BLAST_FURNACE, BREWING_STAND
excluded: ["ENDER_CHEST"]
disabled: [] # stop new locks, keep existing ones
```
`disabled` never deletes existing data: the cleanup treats a disabled type as still being a container.
### Folia
Folia support was advertised in 2.x and did not exist. `/renamecontainer` failed outright, the cleanup
read blocks from an async timer, `/clearchests` read across regions, and repeating tasks could not be
cancelled so they survived plugin disable.
Block access now runs on the thread that owns the chunk, on Folia, Luminol, LightingLuminol, LeafMC and
Kaiiju. Two side benefits on regular servers: cleanup is spread over ticks instead of running in one
block, and it no longer forces chunks to load.
---
## Features that did nothing
Three subsystems were fully written in 2.x and never called.
- **Per-container-type limits.** The whole `container-limits` section and every per-type permission node
had no effect. `/lockchest` and `[Private]` signs now share one limit check, so they cannot disagree.
- **Container names.** `/renamecontainer` stored a name that was never displayed. Names now appear in
access and denial messages through `{container}`, alongside `{owner}`.
- **Bedrock message adaptation.** Not one message ever reached it, so Bedrock players got identical
text. It now runs for every message, and three bugs in it were fixed: it truncated at 100 characters
(shorter than several of the plugin's own messages), it re-resolved Floodgate on every call, and its
symbol list did not cover the characters the plugin actually uses.
### Limit fixes
- **A limit permission now beats the default.** `default-chest-limit` was applied first and the larger
of the two won, so `privatechest.limit.1` on a server with a default of 5 granted **5**. Permissions
below the default could not restrict anyone.
- **Any number works.** Only eleven values were ever checked, so `privatechest.limit.7` silently did
nothing.
Limits and permissions now key off a container *family*: `chest`, `trapped_chest`, `copper_chest`,
`barrel`, `shulker_box`, `crafter`, `other`. A per-material limit can never work for a container whose
material changes on its own.
---
## Commands
`/privatechest` gained real subcommands, all under `privatechest.admin`:
| Command | Description |
|:---|:---|
| `reload` | Reload configuration and messages |
| `status` | Backend in use, protected containers, trust relations, protectable types, unsaved changes |
| `save` | Write pending changes now |
| `migrate <yaml\|sqlite>` | Move all data to the other backend and switch live |
`migrate` was documented in 2.x `config.yml` but did not exist. It updates `storage-type` for you
without stripping your comments, and leaves the old files as a backup. If it fails at any point the
current backend stays in use, untouched.
### Tab completion
Every command and subcommand completes, filtered by permission: a player who cannot run something is
offered nothing for it.
- **Passwords are never suggested.** A command with no completer falls back to the server default, which
suggests player names, so 2.x offered your players' names as password candidates.
- **Vanish is respected.** Players you cannot see are not listed.
- `/untrust` suggests only the players you actually trusted; `/trust` leaves out those you already have.
### Smaller fixes
- Breaking your own `[Private]` sign said it was an admin action, because ownership was checked after
the record had already been removed.
- `/lockchest` and `/unlockchest` used a hardcoded English message from console.
- Unresolvable player names in `/trust list` use a message key instead of a hardcoded word.
- A missing message key is logged with its name and shown as `[key_name]`, instead of English prose.
---
## Cleanup no longer deletes trust lists
2.x wiped a player's entire trusted list on every pass if they owned no containers at that moment. A
player who ran `/trust` before locking their first container lost it within half an hour, and so did
anyone who temporarily broke all their containers. Now off by default, and the rest is configurable
instead of fixed in code:
```yaml
auto-cleanup:
startup-enabled: true
startup-delay-seconds: 10 # let world managers mount their worlds
periodic-enabled: true
interval-minutes: 30 # 0 disables
max-chunks-per-pass: 200
chunks-per-tick: 20
remove-unused-trust: false
```
Positions in unloaded chunks are never touched, on any setting.
---
## Translation
**Nothing shown to a player is hardcoded.** These were baked into the code: the `[Private]` sign tag,
container type names, "Unlimited", the hopper/dropper/dispenser names, the console-only refusal, the
forbidden container names, and the missing-key placeholder.
```yaml
# messages.yml
sign_tag: "[Private]"
sign_tag_aliases: ["[Private]", "[Privado]"]
sign_tag_locked: "&4[&cPrivate&4]"
```
Tag matching ignores case, colour codes and spaces. The aliases list lets you change language without
invalidating signs your players already placed.
**Accented characters work in container names.** The rule was `a-zA-Z0-9`, which rejected every accent,
so players on a Spanish, French, German or Portuguese server could not use their own language. The
default is now Unicode-aware and the whole rule is configurable, along with the forbidden word list.
**English and Spanish are bundled**, in `plugins/PrivateChest/lang/`:
```yaml
language: en # which translation seeds messages.yml and supplies new keys
use-player-locale: false # or match each player by their Minecraft language
```
Previously an update always injected English into a translated file. With `use-player-locale`, missing
entries fall back to `messages.yml`, so a partial translation is safe. Copy a file in `lang/` to add a
language.
Nothing changes for a single-language server: `messages.yml` is still your file and your edits stand.
---
## Known gap: copper golems
Copper golems (1.21.9+) carry items out of copper chests on their own. If your server reports that as a
normal item transfer, existing protection already blocks it, since transfers involving a protected
container are cancelled whatever starts them. If it is implemented purely as mob behaviour, there is no
event to intercept and no plugin can stop it.
This could not be verified, so it is not claimed as covered. Test it before relying on it.
**Also not included:** a native Bedrock input form for passwords. Bedrock players use every feature by
typing commands, and `[Private]` signs need no command at all.
---
## New configuration
`security`, `containers`, `container-names`, `language`, `use-player-locale`, `save-interval-seconds`,
and an expanded `auto-cleanup`. Every option is documented inline in `config.yml`.
## New message keys
Added automatically, your existing wording kept:
```
sign_tag, sign_tag_aliases, sign_tag_locked, unknown_player, limit_unlimited,
container_generic_name, container_type_*, block_name_*, too_many_attempts,
limit_exceeded_type, sign_limit_exceeded_type, clean_skipped_unloaded,
cleanup_already_running, usage_privatechest, usage_migrate, migrate_*, save_*, status_*
```
Removed, because they could never be reached: `limit_error`, `sign_not_your_chest`.
Reworded defaults, which your file keeps unless you delete the key: `locked`, `not_your_chest`,
`sign_chest_locked`, the `limit_*` messages, and the access and break notices, all of which now support
`{container}` and `{owner}`.
---
## Compatibility
| | |
|:---|:---|
| Minecraft | 1.16.5 – 26.2 |
| Java | 8 or newer |
| Single-threaded | CraftBukkit, Spigot, Paper, Purpur, Pufferfish, forks |
| Regionised | Folia, Luminol, LightingLuminol, LeafMC, Kaiiju, forks |
| Cross-platform | Java and Bedrock, via Geyser and Floodgate |
# 📜 PrivateChest - Version 2.3.1 Release Notes
**Release Date:** 20/03/2026
---
## [2.3.1] - 2026-03-20
### Added
- **Granular Command Permissions**
- New individual permission nodes for each player command:
- `privatechest.lock` — Controls access to `/lockchest`
- `privatechest.unlock` — Controls access to `/unlockchest`
- `privatechest.trust` — Controls access to `/trust`
- `privatechest.untrust` — Controls access to `/untrust`
- `privatechest.rename` — Controls access to `/renamecontainer`
- `privatechest.sign` — Controls access to `[Private]` sign-based locking
- `privatechest.use` now acts as a **parent permission** that grants all of the above
- Server admins can now deny specific commands per player or group without affecting the rest
- Sign protection (`privatechest.sign`) is independent from the command (`privatechest.lock`), so blocking `/lockchest` does not block `[Private]` signs
- **Shared Container Utility Class (`ContainerUtils`)**
- Centralized double chest detection, container validation, and location serialization
- Eliminates code duplication across 6 files (listeners and commands)
- Single source of truth for container logic — easier to maintain and less error-prone
### Fixed
- **Explosion protection now covers both halves of double chests**
- Previously, if only one half of a double chest had the lock record, the other half could be destroyed by TNT/creepers
- Both `EntityExplodeEvent` and `BlockExplodeEvent` now check all container parts
- **Sign protection now uses its own permission (`privatechest.sign`)**
- Previously shared permission with `/lockchest`, meaning blocking the command also blocked `[Private]` signs
- Now uses a dedicated `privatechest.sign` permission, independent from `privatechest.lock`
- **Null safety in `ChestLocker.serializeLocation()`**
- Previously could throw `NullPointerException` if a world was unloaded
- Now delegates to `ContainerUtils.serializeLocation()` with proper null checks
- **Sign-based protection password is now cryptographically secure**
- Previously used deterministic `hashCode()` based on player UUID and location (predictable)
- Now uses `SecureRandom` to generate unpredictable 32-character hex passwords
### Improved
- **Thread Safety**
- `ChestLocker`: `chestOwners` and `chestPasswords` maps changed from `HashMap` to `ConcurrentHashMap`
- `TrustManager`: `trustRelations` map changed from `HashMap` to `ConcurrentHashMap`, inner sets use `ConcurrentHashMap.newKeySet()`
- Prevents `ConcurrentModificationException` when async cleanup runs alongside main thread operations
- **Timing-safe password comparison**
- `PasswordManager.verifyPassword()` now uses `MessageDigest.isEqual()` instead of `String.equals()`
- Prevents timing attacks that could leak password hash information
### How Granular Permissions Work
- By default, nothing changes for existing servers. `privatechest.use` still grants all commands.
- To block a specific command, negate its permission in your permissions plugin:
```yaml
# LuckPerms example — block only /lockchest but keep [Private] signs working
permissions:
- privatechest.lock: false
```
- The remaining commands will continue working normally.
### Migration Notes
- **Fully backwards compatible** — no configuration changes required
- Existing permission setups using `privatechest.use` will continue to work identically
- Thread safety improvements are transparent — no action needed
### Compatibility
- Minecraft 1.16.x – 1.21.11
- Tested on Paper, Purpur, Pufferfish, and Spigot
---
## Support & Feedback
- Report issues on GitHub: [PrivateChest Issues](https://github.com/anthropics/claude-code/issues)
- SpigotMC Resource: https://www.spigotmc.org/resources/privatechest.124359/
Thank you for using PrivateChest!
# PrivateChest v2.3 - Changelog
**Release Date:** January 2026
---
## New Features
### Shulker Box Support
- Lock all 17 shulker box variants (including colored ones)
- Same protection as chests and barrels
- Configurable limits per shulker box type
### Expanded Server Compatibility
- Full support for Folia and its forks (Luminol, LightingLuminol, LeafMC, Kaiiju)
- Works on all major server software
### Improved Bedrock Support
- Better Geyser and Floodgate detection
- Seamless experience for Bedrock Edition players
---
## Compatibility
**Minecraft:** 1.16.5 - 1.21.x
**Servers:**
- Spigot, Paper, Purpur, Pufferfish
- Folia, Luminol, LightingLuminol, LeafMC, Kaiiju
**Cross-Platform:**
- Java Edition
- Bedrock Edition (via Geyser/Floodgate)
---
## Bug Fixes
- Fixed shulker boxes not being recognized as lockable containers
- Improved password security handling
---
## Migration
No action required. Update and enjoy the new features!
# 📜 PrivateChest - Version 2.2 Release Notes
**Release Date:** December 1st, 2025
---
## [2.2] - 2025-12-01
### Added
- **Configurable Hopper Protection System**
- New `hopper-protection.allow-hopper-access` option in `config.yml`
- Allows players to enable hopper access for automated sorting systems with locked containers
- Includes comprehensive security warnings and documentation in configuration file
- Default setting remains secure (false) - blocks all automated item movement
### Improvements
- Enhanced `HopperProtectionListener` with configurable behavior
- Added detailed JavaDoc documentation for hopper protection logic
- Improved security transparency with clear warnings about enabling hopper access
### Configuration Changes
- New section `hopper-protection` added to `config.yml`
- `allow-hopper-access: false` (default - maximum security)
- Detailed documentation on security implications and recommended use cases
### Use Cases
This update is designed for:
- Servers with automated sorting/storage systems
- Private or trusted servers where theft is not a concern
- Servers with additional claim/protection plugins
### Security Notes
- **Default behavior unchanged:** Hoppers remain blocked from protected containers
- When enabled, ANY hopper can access locked containers (including those placed by other players)
- Recommended only for trusted environments or servers with additional protection layers
- Admin bypass permissions remain unaffected
### Compatibility
- Minecraft 1.16.x – 1.21.10
- Tested on Paper, Purpur, Pufferfish, and Spigot
---
## Installation & Configuration
1. **Update:** Replace your old PrivateChest JAR with version 2.2
2. **Reload or Restart:** Run `/privatechest reload` or restart your server
3. **Configure (Optional):** Edit `config.yml` to enable hopper access if needed:
```yaml
hopper-protection:
allow-hopper-access: true # Set to true to enable
```
---
## Known Issues
None reported for this version.
---
## Support & Feedback
- Report issues on GitHub: [PrivateChest Issues](https://github.com/anthropics/claude-code/issues)
- SpigotMC Resource: https://www.spigotmc.org/resources/privatechest.124359/
Thank you for using PrivateChest!
# PrivateChest v2.1 - Major Update Release
## 🆕 What's New
### 🔒 Enhanced Security System
- **Complete Hopper Protection**: Hoppers, droppers, and dispensers can no longer bypass chest protection
- **Block Placement Protection**: Players cannot place blocks adjacent to protected containers to bypass security
- **Automatic Cleanup**: Orphaned data from removed containers is automatically cleaned up to maintain performance
### 🏷️ Container Renaming System
- **Custom Names**: Give your locked containers custom names up to 16 characters
- **Easy Commands**: Use `/renamecontainer <name>` or `/renamecontainer remove`
- **Smart Validation**: Names are automatically validated for compatibility
### 📊 Advanced Limit System
- **Container-Specific Limits**: Set different limits for chests, barrels, and shulker boxes
- **Granular Permissions**: Fine-tune exactly how many of each container type players can lock
- **Backward Compatible**: Existing limit configurations continue to work unchanged
### 🌐 Cross-Platform Support
- **Bedrock Edition**: Full compatibility with Bedrock Edition players via Floodgate/Geyser
- **Smart Messages**: Messages automatically adapt for optimal display on each platform
- **Universal Access**: Java and Bedrock players can seamlessly interact with the same protected containers
## 🚀 How to Install
1. **Stop your server**
2. **Replace** the old PrivateChest.jar with the new v2.1 file
3. **Start your server** - all configurations will be automatically updated
4. **No data loss** - all existing locked containers remain protected
## ⚙️ New Commands
- `/renamecontainer <name>` - Set a custom name for the container you're looking at
- `/renamecontainer remove` - Remove the custom name from a container
## 🔧 New Configuration Options
Add these to your `config.yml` if you want to customize the new features:
```yaml
# Container-specific limits (optional)
container-limits:
enabled: false # Set to true to use granular limits
types:
chest: 10
barrel: 5
shulker_box: 2
# Automatic cleanup (enabled by default)
auto-cleanup:
periodic-enabled: true
```
## 📋 New Permissions
- `privatechest.limit.chest.X` - Allows locking X chests
- `privatechest.limit.barrel.X` - Allows locking X barrels
- `privatechest.limit.shulker_box.X` - Allows locking X shulker boxes
## 🔄 Compatibility
- **Minecraft**: 1.16+ (Spigot/Paper)
- **Java**: 8+
- **Bedrock**: Supported via Floodgate/Geyser
- **Existing Data**: Fully compatible - no migration needed
## 📝 Notes for Server Owners
- All existing locked containers continue working without any changes
- Configuration files are automatically updated while preserving your custom settings
- The new features are **optional** - enable only what you need
- Performance improvements through automatic cleanup system
- Full backward compatibility with existing permissions and configurations
## 🐛 Bug Fixes
- Fixed rare cases where hoppers could access protected containers
- Improved double chest detection and protection
- Enhanced permission checking for edge cases
- Better error handling for corrupted data files
---
**Download PrivateChest v2.1** and enjoy enhanced security with powerful new features! 🎉
# 🔐 PrivateChest 2.0 - Major Update!
## 🚀 What's New
### 🔒 Enhanced Security
- **Password Encryption:** All passwords are now securely hashed using SHA-256 with salt. Your old passwords will work and be automatically upgraded when used.
- **Better Data Protection:** Significantly improved security against potential data breaches.
### 👥 Trust System
- **Share Access Safely:** Give other players access to your locked chests without sharing passwords
- **New Commands:** `/trust <player>` and `/untrust <player>`
- **Easy Management:** Use `/trust list` to see who you trust, `/untrust all` to remove everyone
### 📋 Sign Protection
- **Visual Locking:** Place a sign with `[Private]` on the first line near your chest to lock it
- **No Commands Needed:** Perfect for players who prefer visual interactions over typing commands
- **Break to Unlock:** Simply break the sign to unlock your chest
### 📊 Chest Limits
- **Permission-Based Limits:** Control how many chests players can lock based on their rank/permissions
- **Perfect for Economy Servers:** Reward VIP players with more chest locks
- **Admin Control:** Set custom limits from 1 to unlimited chests per player
### ⚡ Performance Improvements
- **SQLite Support:** Optional database storage for servers with many locked chests (better performance)
- **Optimized Code:** Faster chest interactions and reduced memory usage
- **Smart Caching:** Improved response times for large servers
### 🔧 Developer API
- **Public API:** Other plugins can now safely interact with PrivateChest
- **Better Integration:** Perfect for custom plugins and advanced server setups
## 📥 Migration from v1.x
### ✅ Fully Automatic Migration
- All your existing locked chests will continue working normally
- Passwords are automatically upgraded to secure format when used
- No manual configuration needed - just replace the plugin file
- All new features are disabled by default for compatibility
### Migration Steps:
1. Backup your `plugins/PrivateChest/` folder (recommended)
2. Stop your server
3. Replace the old PrivateChest.jar with v2.0.0
4. Start your server
5. Enable new features in `config.yml` if desired
## ⚙️ Configuration
New options in `config.yml`:
- `storage-type: yaml` (or "sqlite" for better performance)
- `enable-sign-protection: true`
- `enable-chest-limits: false`
- `default-chest-limit: 5`
## 🎯 Permission Examples
```yaml
# Chest Limits (when enabled)
privatechest.limit.unlimited # No limits
privatechest.limit.100 # Up to 100 chests
privatechest.limit.25 # Up to 25 chests
privatechest.limit.10 # Up to 10 chests
privatechest.limit.5 # Up to 5 chests
```
## 🐛 Bug Fixes
- Fixed rare double chest synchronization issues
- Improved hopper protection reliability
- Better error handling for corrupted data
- Enhanced explosion protection
---
## 🔥 This is our biggest update yet! 🔥
Perfect for survival servers, economy servers, and any server that wants secure, user-friendly chest protection!
---
*Compatible with Minecraft 1.16.x - 1.21.5 | Tested on Paper, Purpur, Pufferfish*
## PrivateChest v1.6.3 - Changelog
This update focuses on fixing the long-standing double chest protection issue and brings several improvements to stability and usability.
### 🐛 Fixed
- Critical Double Chest Bug: Resolved the major issue where only one half of a double chest (large chest) would be protected. Now, both halves are correctly identified and secured during locking, interaction (/unlockchest), block breaking, and hopper interactions. This ensures complete protection for double chests and barrels.
### ✨ Changed / Improved
- Enhanced Hopper Protection: Hoppers are now reliably prevented from both pulling items from and pushing items into any protected container (single chests, double chests, barrels).
- Corrected /clearchests Logic: The /clearchests command now functions as intended, specifically targeting and removing only "orphaned" entries from data.yml (protections for containers that no longer exist or are invalid). It no longer affects valid, existing protections.
- Improved DataManager: Added more robust error handling and console logging when loading data.yml. This will help server administrators diagnose issues with corrupted or invalid location entries.
- Auto-Updating messages.yml: The messages.yml file will now automatically add any new message keys from future plugin updates, preserving existing user customizations.
- Refined Configuration Files:
config.yml: Removed non-functional options (allow-double-chests, unlock-duration-seconds, allow-shared-access) to prevent confusion. Added clearer comments.
messages.yml: Added new messages for recent changes, improved wording on existing ones, and added detailed comments to explain each message's purpose.
- Updated plugin.yml: Corrected version number and added /pc as an alias for /privatechest.
- Code Refinements: General internal code improvements for stability and maintainability.
# 📢 PrivateChest 1.6.2 – Hopper Exploit Patch & Full Container Protection
## 🛡️ New Protections:
- 🚫 Hoppers can no longer extract items from any protected container.
- 🔐 Applies not only to chests and barrels, but automatically supports any future container types added to PrivateChest (like furnaces, droppers, shulkers, etc.).
- 🧠 Uses smart event handling via InventoryMoveItemEvent to detect and cancel unauthorized item transfers.
## 🔧 Technical Improvements:
Protection now checks container ownership via ChestLocker.isChestLocked(...), ensuring consistent behavior.
No performance impact; event runs only when hoppers are in use.
## ✅ Recommended For:
Any server using hoppers, redstone automation, or container protection systems.
Servers upgrading from 1.6.1 or earlier.
### Thank you for using PrivateChest Free!
If you find the plugin helpful, please consider leaving a ⭐ review or joining our support community.
Support available in English and Spanish.
# 📢 PrivateChest 1.6.1 – Admin Bypass Fix
##🔧 Fixes:
- ✅ Fixed: Admins with the privatechest.admin permission could not open locked chests they did not own.
- 🔓 Admins can now access any protected chest without being the owner, as originally intended.
- 🔔 Optionally shows a message when an admin accesses a chest (notify-admin-on-open in config).
## 🧰 Notes:
This fix improves the reliability of admin control over protected containers.
No changes were made to the core protection or chest data structure.
## ✅ Suggested for:
Server owners, admins, moderators, and anyone with admin permissions.
Thank you for using PrivateChest Free!
If you enjoy the plugin, consider leaving a review and reporting bugs or suggestions.
Support is available in English or Spanish. 💬
📦 PrivateChest v1.6
🧹 New Feature: Smart Auto-Cleanup on Startup
• The plugin now detects and removes invalid chest entries from data.yml when the server starts.
• If a chest no longer exists in the world (e.g., was broken externally or by other plugins), it will be skipped and cleaned.
• Keep your data file clean and accurate without running manual cleanup commands.
🛠 Configurable Option:
• Toggle this behavior in `config.yml`:
auto-cleanup-on-start: true
📋 Console Feedback:
• [PrivateChest] Loaded locked chests: 48
• [PrivateChest] Auto-cleaned 3 invalid chest entries.
---
🌐 Multilingual Ready
• All messages and settings remain fully translatable via `messages.yml` and `config.yml`.
✅ Compatibility
• Minecraft Versions: 1.16.x → 1.21.5
• Supported Forks: Paper, Pufferfish, Purpur
📊 Plugin Statistics:
https://bstats.org/plugin/bukkit/PrivateChest
---
✨ Looking for More Power?
🔒 [[PrivateChest Plus](https://builtbybit.com/resources/privatechest-plus.65969/)] is now available!
💎 Features include:
• Shared chest access with trusted players
• Timed auto-unlock
• GUI-based password input
• Holograms and visual effects
• Separate storage for Plus chests
• And much more...
Upgrade your protection system now 👉 [View Premium Version](https://builtbybit.com/resources/privatechest-plus.65969/)