Libskinupload shifts the maintenance burden of providing player skins from server administrators to the players who use those skins, by providing an interface through which players can upload their own skins directly in-game.
Features:
- Skin uploading. Players can upload custom skins by converting them to base64 and pasting the result into a form field.
- Skin descriptions support a Markdown knockoff, see below for supported syntax.
- Personal skins. Players can upload skins that only they can use.
- Players have to understand how to convert an image to base64 to upload custom skins.
- Reviewing. Skin requests must be approved by a player with the
skin_review
privilege before they can be used. - As a rate limit, each player can only have one unapproved skin request at a time by default. Subsequent requests will overwrite prior requests.
- The number of maximum concurrent requests can be configured per-player by reviewers.
- Skin reviewers are notified when new requests become available, and skin uploaders are notified when a request is approved or denied.
- Players can be prevented from uploading skins by granting them the
no_skin_upload
privilege. - Skins can be removed using
/skindelete
. - Dynamic allocation. Skins will only take up media space if someone has actually worn them during the server session.
- Generally game-agnostic and future-proof. Libskinupload sets player textures directly and is accessed with chatcommands, and thus ought to work out of the box in most environments.
- As a corollary, UV correctness is not directly enforced. It is up to skin reviewers to decide if the provided skin is acceptable on the player model used.
- Explicit compatibility with 3d_armor, u_skins, and Mineclonia.
- Adds a Unified Inventory page.
'Markdown' syntax:
__text__
=> text**text**
=> text^^text^^
=> <u>text</u>$$text$$
=>text
(Pretend the dollar signs are backticks)
Commands:
/skinupload
| Opens the skin upload dialog./skinreview
| Opens the skin review dialog. Only accessible to reviewers./skinchoose
| Opens the builtin skin selection dialog./skinget <name>
| Print the ID of the skin currently worn by the target player./skinchange <ID>
| Set your skin by ID, bypassing the skin selection dialog./skinforget
| Tells libskinupload to stop tracking your currently worn skin. This will allow you to change your skin to one provided by another mod without conflct./skindelete <ID>
| Removes the specified skin from the filesystem. This will reset the skin of anyone wearing the target skin when they rejoin./skinlimit <name> <limit>
| Set the maximum number of concurrent requests for player <name> to <limit>. Only accessible to reviewers./skinmanage [list | meta <ID>| cull | alter <ID> <changes>]
| Passingmeta <ID>
will print the metadata of the target skin. Passingcull
will remove all image files without an associated meta file, to prevent potential crashes. Passingalter <ID> ...
will override the target skin's metadata using the format<key>=<value>[,<key2>=<value2>]*
. For example,/skinmanage alter 0 name = Altered, description = New description
will set the name of skin 0 to 'Altered' and the description to 'New description'. Passing anything else will do nothing. Only accessible to reviewers.
Caveats:
- Players have to understand how convert an image to base64 to upload custom skins. (There are several web tools for this, however.)
- The
skin_review
privilege is not automatically granted to admins because on_grant is not called that way, breaking the notification mechanism. - The no_skin_upload privilege has potentially undesirable interaction with
/grantme all
. - Because libskinupload knows nothing about other skin libraries and so cannot override their callbacks, by default players must call
/skinforget
before changing their skin to one provided by another mod. For servers, I recommend creating a shim mod to do this automatically, for better player experience. - At the moment, the player model must be named
character.b3d
for previews to work right (with the exception of Mineclonia). - Wieldhands can only be regenerated on server restart. This is a Minetest limitation.
- Must be modded to not add a Unified Inventory page.
- The use of dynamic media will make Multicraft clients explode if optimized media is not disabled. This is only a caveat because Minetest for iOS doesn't exist yet.
- The liberal use of
model[...]
can make the web client explode.