YourCustomPaintings - upload your own custom paintings!

YourCustomPaintings is a Sponge plugin for uploading your own custom paintings to server. Paintings are implemented through minecraft maps+item frames. You can upload paintings spanning across multiple maps/frames, with convenient tool for automatic placing of them. Image will be either scaled automatically, or placed on center, with or without dithering. Various options of scaling and dithering modes are available. Once you uploaded a painting, it will be always available to you from the list. Players in survival will be required to have needed items, like item frames and empty maps (Can be turned off with permissions). Permissions and Permission Options are supported, and simple config file too.

Commands
List of available commands and their parameters (parameters in square brackets are optional):
/uploadpainting [Player] <Name> <URL> [<MapsX> <MapsY>] [ScaleMode] [DitherMode] [ColorBleedReductionPercent] - Uploads a painting and gives you either a filled map (for 1x1 painting) or painting placer (more about painting placer is in itā€™s own section)
Player - optional parameter for uploading in lieu of given player, if user have permission to do so. Useful for console.
Name - ID of the map. Should be unique per user. Is used for getting painting again with command /getpainting if needed.
URL - url of image to upload.
MapsX, MapsY - image size in maps. 1 1 by default. For example, 3 2 means painting will be occupy 3x2 blocks when placed in a world.
ScaleMode - scale mode. Lanczos3 by default. Use Mitchell if Lanczos3 gives artifacts. Use NoScale to place image to center without scaling. Possible values: NoScale, BSpline, Bell, BiCubic, BiCubicHighFreqResponse, BoxFilter, Hermite, Lanczos3, Mitchell, Triangle.
DitherMode - dither mode. FloydSteinberg by default. More about that below. Possible values: NoDither, FloydSteinberg, JarvisJudiceNinke, Stucki, Atkinson, Burkes, Sierra3, TwoRowSierra, SierraLite, OrderedBayer2x2, OrderedBayer4x4, OrderedBayer8x8, OrderedBayer16x16.
ColorBleedReductionPercent - applicable only to unordered dither. Possible values: 0-100. Zero percent by default. More about that below.
Examples:
/uploadpainting Lenna1 https://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png
/uploadpainting Lenna2 https://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png 4 4
/uploadpainting Lenna3 https://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png 4 4 Mitchell NoDither

/getpainting [Player] <Name> - Gets painting by given name. If user have permission, user can specify owner player.
Player - optional parameter for getting paiting owned of given player, if user have permission to do so.
Name - name of a painting that was specified in /uploadpainting command.
Examples:
/getpainting BeautifulSunset
/getpainting Notch MobPoker

/paintingslist [all|Player] [page] - Displays a list of paintings and info about them. You can click ā€œ>GET<ā€ links to get paintings.
all - specify this parameter for viewing a list of all paintings of all players, if you have permission to do so.
Player - specify this parameter for viewing a list of paintings of given player, if you have permission to do so.
If neither of those parameters are present, a list of your own paintings will be displayed.
page - page
Examples:
/paintingslist
/paintingslist 2
/paintingslist all
/paintingslist Player123

Dither
Maps have limited palette in Minecraft, so it canā€™t recreate all the colors, especially in gradients. To mitigate this, you can use dither. Disther adds noise to simulate colors in between palette values. There are two types of dither: unordered and ordered. Supported unordered dither: FloydSteinberg, JarvisJudiceNinke, Stucki, Atkinson, Burkes, Sierra3, TwoRowSierra, SierraLite. Supported ordered dither: OrderedBayer2x2, OrderedBayer4x4, OrderedBayer8x8, OrderedBayer16x16. Please note that OrderedBayer algorithm used here is not intended for images with indexed palette, so it wonā€™t work as effectively.

Comparison (original):
No dither (NoDither):
img

Ordered dither (OrderedBayer16x16):
img

Unordered dither (FloydSteinberg):
img

ColorBleedReductionPercent parameter is intended for reduction of ā€œcolor bleedā€ (unordered dither sometimes causes color to ā€œbleedā€ below and left) and lead to increasing areas of solid color. Only for unordered dither.

Color bleed reduction at 75% (Atkinson):
img

Sometimes dither isnā€™t needed and image would look better without it, primarily where only bright primary colors were used, or when image have lots of gray colors.

Painting placer
When user executes command /uploadpainting or command /getpainting user will receive: filled map, if painting is 1x1 size, just place it in item frame; or painting placer for bigger paintings. Painting placer is just a stick; click with it any wall with sufficient empty space to place a painting. Painting will automatically fit to any available space, but if you need to place it more precisely, just know that click point will become upper left corner of a painting, if space allows.

Permissions
List of available permissions and description of what they do:
yourcustompaintings.commands.uploadpainting.execute - Allows the user to execute the /uploadpainting command.
yourcustompaintings.commands.uploadpainting.others - Allows the Operator to upload painting under guise of another user account
yourcustompaintings.commands.getpainting.execute - Allows the user to execute the uploadpainting command.
yourcustompaintings.commands.getpainting.others - Allows the user to get paintings of other users with /getpainting
yourcustompaintings.commands.paintingslist.execute - Allows the user to execute the paintingslist command.
yourcustompaintings.commands.paintingslist.all - Allows the user to get list of all paintings
yourcustompaintings.commands.paintingslist.others - Allows the user to get list of paintings of other users
yourcustompaintings.paintingplacer.place - Allows the user place paintings with painting placer. Usually admins allow all users to have it by default
yourcustompaintings.paintingplacer.dontselfdestruct - Allows the user to place paintings with painting placer any times they want in Survival. Please note that even if they donā€™t have this permission, they can still copy individual maps thatā€™s contains painting with vanilla method. Users in Creative donā€™t need this permission.
yourcustompaintings.bypasssurvival - Users who have this permission do not need any items for getting/placing paintings in Survival. Users who donā€™t have this permission will need to have Empty Map to get 1x1 painting, Stick to get Painting Placer, Empty Maps and Item Frames in quantity of MapsX*MapsY each for placing a painting with painting placer.

Permission Options
List of available permission options and description of what they do:
yourcustompaintings.commands.uploadpainting.max.maps.x - max allowed width of a painting for player in blocks/maps
yourcustompaintings.commands.uploadpainting.max.maps.y - max allowed height of a painting for player in blocks/maps
yourcustompaintings.commands.uploadpainting.max.imgfilesize - max allowed size of image to upload for player in bytes
yourcustompaintings.commands.uploadpainting.max.imgwidth - max allowed width of image to upload for player in pixels
yourcustompaintings.commands.uploadpainting.max.imgheight - max allowed height of image to upload for player in pixels

Config
debug-mode - Debug mode. Will write some trash info in pluginā€™s config folder, so not recommended. false by default.
max-img-file-size - Maximal size of image file to upload in bytes. 1048576 by default.
progress-report-time - Report progress of operation where possible every X milliseconds (currently only upload progress). 30000 by default.

Limitations
Uploading image with too big dimensions, or too big in-game size in blocks will cause OutOfMemoryError, so make sure to adjust limits according to your server capacity. Minecraft support only ~32000 maps, so be sure to not upload too much, and only give permission to players who have a sense of limit. If you upload too much, regular maps and uploaded paintings will start overwriting each other, which is not pretty. Thereā€™s no guarantee that future versions of Minecraft/Sponge will like those paintings-maps, so I take no responsibility for anything.

Screenshots
img img img

Quick video demonstration

Resources used in screenshots and video
ā€œFennec Foxā€ by Keith Roper is licensed under CC BY 2.0
ā€œThe End of Wordsā€ by busangane is licensed under CC BY SA 3.0
ā€œbridgeā€ by busangane is licensed under CC BY 3.0
ā€œAdira Portraitā€ by Twokinds is licensed under CC BY SA 3.0
ā€œDSC_0794ā€ by Rachid H is licensed under CC BY NC 2.0
ā€œEpic KItty Battleā€ by Andrew McFarlane is licensed under CC BY NC 2.0

Sponge Version
Tested on:

  • SpongeForge 1.12.2-2705-7.1.0-BETA-3440
  • SpongeVanilla 1.12.2-7.1.0-BETA-116

Download links
Stable:
Latest Stable Version
Dev:

16 Likes

Insane ! You bring a whole new dimension to vanilla customisation :scream:
I need to try this on API 6.

Do you think that you could add /placepainting <painting> <world> <X,Y,Z> and /deletepainting <name> ? We could even automate a ā€œscreenā€ by refreshing every X times an image :joy:

Do you think that you could add /placepainting <painting> <world> <X,Y,Z>

Yes, I can add that command. Also, for 1x1 paintings itā€™s already possible to do that with /spawn command.

/deletepainting <name> ?

Deleting a map when youā€™re not sure if itā€™s placed somewhere already would lead to empty/overwritten maps. Currently itā€™s not possible to do that at all (only with NMS). Or you mean delete item frames in certain coordinates?

We could even automate a ā€œscreenā€ by refreshing every X times an image :joy:

Well, itā€™s better to wait for Maps API for that. Itā€™s been progressing nicely lately.

edit:

I need to try this on API 6.

This plugin is only for API 7/Minecraft 1.12.1, sorry. Thereā€™s been breaking changes since API 6, so it wonā€™t be compatible with it.

Oh nice for 1x1 !

Deleting would be to use with caution, my main goal was to make a refreshing screen but Maps API looks interesting. I hope it will be added to API 6 as well.

Had something like this on bukkit to put photos of my late wife - the real owner and heart & soul of the community - in a memorial garden setup, and have been waiting for the Maps API stuff to do the same in sponge. Definitely will give this a go.

This plugin is simple amazing, but my server run in 1.10.2 version, some1 possibility of this plugin run in this version? I tested this, but not work :sob:

2 Likes

Yeah Iā€™d like to second the motion for a 1.10.2 version of this plugin.

1 Like

Add 1.10.2 compatibility

1 Like

Does this work on 1.12.2, because I cant get my placer to work

1 Like

I may be being a noob, but im not sure where to upload the pictures that i want to use ingame. every picture iv tried it throws an error ā€˜not an image or unsupported formatā€™ ive used jpg and png formats. thankyou

Having problems placing any maps bigger than 1x1, running the plugin in 1.12.2. Wondering if anyone else has the same issue

2 Likes

Send me a msg on discord and Iā€™ll provide you with a working version of 1.12.2. Iā€™m not sure iā€™d have permission to upload it to mediafire or something and post in this thread but if a staff member says that its ok Iā€™ll post here aswell. (Not fixed by me but someone else within the pixelmon community)
FrostEffects#9011

Itā€™s licensed under the MIT License.
Youā€™re fine to post it here.

3 Likes

It does not work in spongeforge-1.12.2-2768-7.1.5

Just incase your using this as an admin and for like showing your in-game logo. For me the plugin does partially work. When you run the command it will save the image to the multiple map files, BUT it will not auto place them. So you can manually look in the world file and spawn in each map to place.

Hello!
Could you show clearly how to do it? I do not speak English, but I find interesting what you mention

So if you follow the steps of the plugin to generate the map files it will make them. It just wont place them on the wall when you run that command.

After you make the map using /uploadpainting look inside the data folder in your world folder (world/data/). Inside there scroll down and there should be some map files like map_30000. If there are then the plugin worked and generated the maps. To obtain the maps you then have to run this command /give [playername] minecraft:filled_map [amount of maps] [number of map]. Where the number of map is 30000

I have followed your instructions and it has worked for me, thanks for your support. :star_struck:

@Heberon Just download the latest version.