CustomPaintings
CustomPaintings lets server admins upload PNG images to the server and give players map-based paintings, including multi-map murals (2x2, 4x4, etc.).
Features
- Upload PNG files directly to the server filesystem
- Import as:
- Single painting (
1x1map) - Multi-map mural (
2x2up to8x8) - Give painting sets to players with one command
- Persistent painting index in
paintings.yml - Tab-complete for commands and painting names
Requirements
- Paper
- Java
21
Build
From plugin source folder:
./gradlew build
Output jar:
build/libs/CustomPaintings-1.0.0.jar
Install
- Stop your Paper server.
- Copy
CustomPaintings-1.0.0.jarinto your serverplugins/folder. - Start the server.
- Confirm plugin is enabled:
- Run
/plugins CustomPaintingsshould be green
Created Folders/Files
After successful startup, plugin creates:
plugins/CustomPaintings/config.ymlplugins/CustomPaintings/uploads/(put upload PNGs here)plugins/CustomPaintings/paintings/(generated map tile PNGs)plugins/CustomPaintings/paintings.yml(painting metadata)
Command Reference
Base command:
/painting
1) List paintings
/painting list
Shows all registered painting names and dimensions (example wallart (4x4)).
2) Import painting
/painting import <name> <upload-file.png> [widthMaps] [heightMaps]
name: painting id (a-z,0-9,_,-, max 32 chars)upload-file.png: filename placed inuploads/widthMaps: optional, default1, range1..8heightMaps: optional, default1, range1..8
Examples:
/painting import mona mona.png
/painting import castle castle.png 2 2
/painting import mega_wall panorama.png 4 3
3) Give painting set(s)
/painting give <name> [player] [sets]
name: registered paintingplayer: optional target playersets: optional number of full sets (default1, clamped1..64)
A set contains all map items required for the mural:
1x1mural = 1 map per set2x2mural = 4 maps per set4x4mural = 16 maps per set
Examples:
/painting give mona
/painting give mona bitz
/painting give castle bitz 3
4) Remove painting
/painting remove <name>
Deletes metadata and generated tile images for that painting.
5) Reload painting index
/painting reload
Reloads paintings.yml without restarting server.
Permissions
custompaintings.use(default:true)custompaintings.admin(default:op)
Admin required for:
/painting import .../painting remove .../painting reload
Full Workflow Example (with username bitz)
- Upload
sunset.pngto:
plugins/CustomPaintings/uploads/sunset.png
- Import as 2x2 mural:
/painting import sunset sunset.png 2 2
- Confirm:
/painting list
- Give one set to yourself:
/painting give sunset bitz 1
- Place maps in item frames in grid order:
- Top row left to right
- Then next row left to right
Notes on Placement Order
Map display names include tile position like:
Painting: sunset [1/2, 1/2]
Meaning:
- first value pair is horizontal position (
x/width) - second pair is vertical position (
y/height)
Use that to place frames correctly for murals.
Troubleshooting
Plugin is red in /plugins
Check console logs on startup for CustomPaintings errors.
Common issue fixed in this project:
- Missing
config.ymlin jar causes: The embedded resource 'config.yml' cannot be found
Upload folder missing
Folder is:
plugins/CustomPaintings/uploads
If it does not exist, plugin likely failed to enable.
"Painting not found"
- Ensure painting was imported first
- Check exact painting name in
/painting list
"Upload file not found"
- Verify file exists in
plugins/CustomPaintings/uploads/ - Use exact filename including
.png
"Only .png files are supported"
Convert source to PNG and retry import.
Mural too large
Max import size is 8x8 maps.
Data Format
paintings.yml stores each painting as:
widthheightprefix(tile filename prefix)
The plugin also supports loading older legacy single-file entries and treating them as 1x1.
Upgrade/Replace Jar Safely
- Stop server.
- Replace plugin jar in
plugins/. - Start server.
- Run
/painting reloadif only metadata changed while running.
Uninstall
- Stop server.
- Remove plugin jar from
plugins/. - (Optional) Delete
plugins/CustomPaintings/data folder.
License
MIT


