v1.4.1 — Full rebuild of v1.4 (replaces the broken release)
v1.4.0 is buggy. v1.4.1 is v1.4 done right — every feature re-implemented on top of v1.3 with per-step testing so the PAPI regression that hit v1.4.0 cannot reoccur. If you already upgraded to v1.4.0 and saw external placeholders break, replace the JAR with this one. No config or data migration is required — existing image files from v1.2 / v1.3 / v1.4.0 deserialize cleanly.
What went wrong in v1.4.0
v1.4.0 called
File.renameTo(plugins/Images → plugins/ImagesPlus) inside
onLoad() so the folder name would match the new plugin identity. The rename ran during Paper's plugin-discovery pass and raced with
PlaceholderAPI's external-expansion scan. Downstream: PAPI silently stopped registering its external expansions (luckperms, essentials, vault, statistic, math, player, server, worldguard, …), placeholders resolved to their literal text, and any task that wrote a PAPI value back into LuckPerms persisted that literal into the meta store. Several servers corrupted event counters and scoreboard-backed meta fields.
The fix
• Plugin name stays
Images in
/pl and in log prefixes —
zero rename, ever.
• Data folder stays
plugins/Images/ forever.
• No
onLoad() filesystem operations of any kind.
• If you're upgrading from v1.4.0 and already have a
plugins/ImagesPlus/ folder, move it back to
plugins/Images/ manually before the first start. Fresh installs and upgrades from v1.2 / v1.3 do nothing.
Everything v1.4 promised — now stable
Management GUI — /image gui
• Paginated chest browser unified for everyone. Opens with
/image gui (alias
/image menu,
/imagen menu).
• Personal scope by default — everyone can browse and manage their own images. Admins with
images.gui.admin also get "browse all".
• Clean user / admin row split: user actions (Info, Delete own, Move own, Alias) live on one row; admin tools (Teleport, Hide / Unhide, Ban URL) on the bottom row. Non-admin viewers see light-blue glass-pane crystals in the admin band — admin actions never leak into the user UI.
Moderation
•
Hide / Unhide — soft flag. Image stops rendering for every viewer but metadata and frames stay in the DB, fully reversible.
•
Ban URL — global blacklist stored at
plugins/Images/banned_urls.txt. Bans the URL
and deletes every sibling image that uses it, across every world. Future
/image create calls for that URL are rejected with a clear message. Use
/image unbanurl to list or lift entries.
•
Delete — owners can delete their own via the Delete button in the user row; admins with
images.gui.delete.any can delete any image.
•
Move (true relocate) — keeps the same database id, creator,
placedAt, and source. Click Move → right-click the new destination block → image rebuilds in place. 40-million-pixel safety cap on scaled bitmaps so oversized images can't OOM the server during the rebuild.
•
Bulk actions — toggle "Bulk" in the browser, click images to select (enchant-glint marker), apply Delete / Hide / Ban-URL to the whole selection with a single confirmation. Respects per-image ownership gating.
Discovery and housekeeping
•
Search — chat-based text capture that filters by imageName, sourceUrl, owner alias, or resolved creator name. Admin-scope.
•
Filter menu — quick presets: one icon per loaded world + Hidden + last-24h recent.
•
Leaderboard — top creators by placed-image count; click a row to open the browser filtered to that creator.
•
Orphan scan — lists images whose anchor references a world the server no longer has loaded, with single-click delete.
•
CSV export — async dump to
plugins/Images/exports/images-YYYYMMDD-HHMMSS.csv (17 columns: id, imageName, ownerAlias, creator UUID / name, world, xyz, direction, placedAt, scale, source, sourceUrl, hidden, banned, banReason).
Personalization
•
Owner alias — set a personal label (max 32 chars) via chat capture. The alias takes precedence over the filename in the browser icon title; the filename stays in the lore for traceability. Admins can override any alias.
•
Safe teleport — the TP button computes a 3-block view-point in front of the image and scans for two stacked air blocks so you don't land in lava or inside a wall. Yaw aligns you to face the image.
•
Confirmation dialogs on every destructive action — yes/no stained-glass panes on a full sub-menu, so destructive clicks always require a deliberate second step.
Audit log
• Every GUI action is written to
plugins/Images/images.log with its own tag:
HIDE,
UNHIDE,
BAN_URL,
UNBAN_URL,
MOVE,
ALIAS,
BULK,
GUI_TP. GUI-driven deletes carry
method=GUI_DELETE so you can tell them apart from
/image delete.
• Format stays
key=value per line, grep-friendly.
Quality-of-life fixes
•
/image create <url> now works with Cloudflare-fronted CDNs. Java's default User-Agent gets served bot-detection HTML by Pexels, Discord, Imgur and others; v1.4.1 downloads with a browser-like UA and follows HTTPS redirects manually. No more "Invalid or unreadable image file" on valid URLs.
•
CustomImage serialization is fully additive — new moderation and alias fields are written in their own EOF-guarded blocks. Old v1.2 / v1.3 image saves deserialize cleanly with safe defaults; v1.4.0 saves also round-trip.
Localization
• 100% translatable via
lang/en.yml /
lang/es.yml. 200+ GUI message keys covering every title, button, lore line, click hint and audit message. Drop a
pt.yml /
fr.yml / any language code and run
/image reload.
Permissions added in v1.4.1
- images.command.gui — open the GUI (default true)
- images.gui.admin — admin scope in menus (default op)
- images.gui.teleport — TP from detail menu (default op)
- images.gui.delete.own / .any — self / any
- images.gui.move.own / .any — self / any
- images.gui.alias.own / .any — self / any
- images.gui.hide, images.gui.ban — moderation (op)
- images.gui.search, .filter, .leaderboard, .orphan-scan, .export — admin tools (op)
- images.command.ban — manage URL ban list (op)
- images.command.create.banned-bypass — create images from a banned URL (default false)
How to upgrade
Stop the server, replace any
CustomImages-Plus*.jar in
plugins/ with
CustomImages-Plus-v1.4.1.jar, start. If you were on v1.4.0 and have a
plugins/ImagesPlus/ folder, move its contents back under
plugins/Images/ before starting.
Tested on
Paper 1.21.11 (production, 133 images loaded, PAPI 16 external expansions). NMS shim covers 1.8 → 1.21.11 as before. Full changelog and source:
https://github.com/michumichifu/CustomImagesPlus/releases/tag/v1.4.1