### 🆕 New Features
#### Personal Item Filters (`/trashfilter`)
Players can now manage their own personal item blacklist directly in-game. Items added to the blacklist will be blocked when trying to trash them, giving players full control over what they can accidentally delete.
- `/trashfilter blacklist <material>` — Add a material to your personal blacklist
- `/trashfilter whitelist <material>` — Remove a material from your personal blacklist
- `/trashfilter list` — View all materials currently in your blacklist
- `/trashfilter reload` — Reload filter configuration (admin only)
Tab completion is supported for all material names.
#### Global Trash Toggle
Admins can now enable or disable the trash for all players server-wide without restarting or editing config files.
- `/trash enable` — Enable the trash globally
- `/trash disable` — Disable the trash globally
- `/trash toggle` — Toggle between enabled/disabled
The state persists across server restarts automatically via `config.yml`.
#### Stats Persistence
Player statistics (items trashed, opens, rankings) are now saved to disk in `stats.yml` and survive server restarts. Stats auto-save every N minutes (configurable via `stats.auto-save-minutes`) and also save on plugin shutdown.
---
### 🐛 Bug Fixes
- **Fixed trash being blocked when enabled and open when disabled** — The enable/disable logic in `OpenTrashCommand` was inverted, causing the opposite behaviour of what was intended.
- **Fixed `/trash enable|disable|toggle` crashing** — `setTrashEnabled()` was called but never implemented, causing a runtime error on every toggle attempt.
- **Fixed `/trashfilter list` showing nothing** — The `%materials%` placeholder was never replaced with the actual list of blacklisted materials.
- **Fixed stats not persisting** — `savePlayerStats()` only logged a message but never wrote anything to disk.
- **Fixed trash GUI detection** — Any chest inventory could be mistakenly detected as the trash GUI. Now correctly checks for the `TrashHolder` instance.
- **Fixed cooldown message not sending** — Cooldown remaining time now correctly uses the `%seconds%` placeholder in the message.
- **Fixed placeholder conflicts in MessageManager** — `args[0]` was being applied to multiple named placeholders simultaneously (`%latest_version%`, `%items%`, `%1%`), causing wrong values to appear in messages.
---
### 🔑 New Permissions
| Permission | Description | Default |
|---|---|---|
| `trash.toggle` | Allow enabling/disabling trash globally | `op` |
| `trash.filter.blacklist` | Manage personal item blacklist | `true` |
| `trash.filter.bypass` | Bypass all filters | `op` |
---
### 📄 Config Changes
A new key has been added to `config.yml`. Existing configs will not be overwritten.
```yaml
# Controls whether the trash is enabled for all players.
# Use /trash enable | disable | toggle to change in-game.
trash-disabled: false
```
Developer information
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle.
maven { name = "Modrinth"; url = "https://api.modrinth.com/maven" }