✦━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━✦
New features
Audit log — plugins/Images/images.log
Every image placement and removal is logged with full context. Plain-text, grep-friendly, append-only.
Code (Text):
[2026-04-14 16:25:03] PLACE player=Steve uuid=... world=world x=100 y=64 z=200 direction=NORTH player_x=99.50 player_y=64.00 player_z=200.30 source=URL name=foo.png url=https://cdn.discordapp.com/... scale=1.00
[2026-04-14 16:30:15] REMOVE player=Steve uuid=... method=COMMAND_DELETE confidence=EXACT world=world x=100 y=64 z=200 image_name=foo.png creator=OtherPlayer
- Toggle with logging.enabled: true in config (auto-added on first run)
- Tracks confidence levels: EXACT (single click) vs PROBABLE (area delete)
- Thread-safe writes, one event per line
- Great for: anti-grief investigations, staff activity audits, content moderation
Click-to-inspect — /imagen quien / /images who
Run the command, click any image, see a full info panel:
Code (Text):
--- Image Info ---
Name: foo.png
Placed by: Steve
UUID: 1b4bb76f-1bd9-45f1-9d08-f017a1c14b08
Date: 2026-04-14 16:25:03
World: world
Coordinates: 100, 64, 200
Direction: NORTH
Source: URL
URL: https://cdn.discordapp.com/...
Scale: 1.00x
----------------------
Permission:
images.command.who (default op). Aliases:
quien,
info.
DB-backed metadata per image
Every image now stores its own placedAt, source (
URL/
SERVER_FILE), full URL, and scale directly in the plugin database. No schema change — backward-compatible with pre-v1.2 images (handled via EOFException in the Serializable format).
/images who reads from the DB first (O(1)), only falls back to the log for older images.
✦━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━✦
"Just works" defaults (for new installs)
If you were about to download this plugin for the first time, v1.2 makes the first-run experience painless:
- place-mode: OP by default — the server owner can place immediately without any LP configuration
- Command permissions with default: true for read-only / basic actions (manage, list, create, delete) — non-ops see clean "can't place" messages instead of "unknown command"
- Destructive/staff commands still default: op (delete.near, placed, who, import, transfer, reload)
- Generic example groups in config instead of random server-specific names
- region-restricted: false by default — no more "nobody can place anywhere" gotcha on fresh installs
✦━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━✦
Fixes & improvements
- Lang auto-merge — when a new version adds new message keys, they get merged into your existing lang/*.yml files automatically. No more <placeholder.key> appearing on screen after an update
- images.command.placed is now its own permission (was sharing images.command.list in v1.1). Staff audit tools can now be granted separately from file listing
- Fixed: NoSuchMethodError: CustomImage.getLocation() that happened on /images placed when the JAR was built with an incorrect merge process. v1.2 ships with a correct merge (docs included for anyone building from source)
- Config migration cleaned up to use generic groups (admin, moderator, builder, vip) instead of server-specific names
✦━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━✦
⬆️ Upgrading from v1.1
- Stop your server
- Replace the old JAR with ImagesPlus-1.2.jar
- Start the server — config gets logging.enabled: true added automatically, lang files get new who.* keys merged automatically
- Existing images are fully compatible. They'll show up fine, but /images who will display "Before logging (v1.2)" as the date since the metadata wasn't captured at placement time. All new placements will have full info.
Breaking change: if you had non-OP staff using
/images placed via the shared
images.command.list permission, you'll need to grant them
images.command.placed too. OPs are unaffected.
✦━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━✦
Downloads
Tested on Paper 1.21.11. Compatible with 1.8 → 1.21.11, 26.1, 26.2. Thank you to everyone downloading and testing!
───────────────────────────────────────────────────────────────
SHORT CHANGELOG (for the version description field, <500 chars):
───────────────────────────────────────────────────────────────
v1.2 — Major update:
NEW:
• /images who /imagen quien — click-to-inspect any image (creator, date, URL, scale)
• images.log — detailed audit log of every PLACE and REMOVE
• DB metadata per image (placedAt, source, URL, scale) — backward compatible
IMPROVED:
• Works out of the box (place-mode: OP + true defaults for basic commands)
• Auto-merges new lang keys on update (no more <placeholder> messages)
• images.command.placed is now its own permission (was sharing with .list)
• Generic example groups in config (no more server-specific names)
FIXED:
• NoSuchMethodError CustomImage.getLocation() on /images placed