Thanks for visiting this page! This is one of my first large public plugins, so please do take the time to leave feedback or ratings!
What is StandShop?
StandShop is a suite of tools that allows you to spice up your lobby or other server-whatever with an ingame wand, powerful API, and dedicated Armor Stand animator program.
A picture is worth a thousand words, and a video is worth a thousand pictures! If you want all the words, a video showcase of this plugin is linked here.
Commands
All commands use the permission standshop.standshop. Giving this permission allows players to use all of the commands below, so be careful!
/standshop :: Gives Help
/standshop run <name> [speed] :: Runs an animation test
/standshop getsamples :: Downloads some sample animations
/standshop reload :: Reloads all animations
/standshop sequences :: Lists all loaded animations
/standshop wand :: Gives you the Wand!
Selection Wand
When you have the wand, you can click on any Armor Stand to bring up this in-depth menu:
Features include changing the active animation, the equipped armor which is able to add dyed leather, custom heads and more, as well as whether the arms are shown, baseplate toggling, invisibility, and more.
Animations
All animation files (ending in .yml) go into
<server root>/plugins/StandShop/
How do you make animation files? Well, it's simple! Just download "Stand Viewer", a program I made specifically for this purpose. It's not exactly the holy grail of animation softwares, but it works like a treat. You can download it
here.
To run Stand Viewer, you will need
Python 3.9 and all dependencies. To install this, just go into your computer's terminal or command prompt or what have you and type in
this,
after installing Python. To start it up, just go into the extracted folder and run the file called "index.pyw". Whenever you save or load an animation, it will read or write to "sequence.yml" in the same folder. When you're ready to use it in the game, rename it to whatever you want (keeping .yml at the end), and run /standshop reload
Developer API
cx.wasabi.standshop.api.Sequence
Represents a Sequence (Animation). Using the constructor to instantiate this is ill-advised.
void Sequence#play(ArmorStand target, float speed, Runnable callback, Predicate<Object> cancel)
Plays this sequence on the designated Armor Stand. Once this is done, the provided callback is ran. If the given predicate is met, the sequence will stop.
void Sequence#loop(ArmorStand target, float speed, Predicate<Integer> cancel)
Similar to the play method, but loops forever until the predicate is met. Now, the predicate holds an integer representing the amount of times the sequence has looped so far, allowing for things like playing the animation x times. The cx.wasabi.standshop.util.Canceller class is great to use as the predicate for this function.
cx.wasabi.standshop.api.SequenceLoader
Loads sequences in a practical way.
static Sequence SequenceLoader#fromFile(Path f) throws IOException, SequenceMalformedException
Returns a Sequence constructed from data from the given filepath. Calls fromString internally.
static Sequence SequenceLoader#fromString(String s) throws SequenceMalformedException
Returns a Sequence reconstructed from a string.
cx.wasabi.standshop.api.Sequences
Holds all loaded sequences, maintained by the plugin.
static List<Sequence> getAll()
Returns a list of all loaded Sequences, including the "idle" sequence which is always present
static List<String> getNames()
Returns a list of all Sequence names
static Sequence fromName(String name)
Gets the Sequence associated to a given name, or null if no such sequence is exists or loaded
static boolean hasName(String name)
Simple check if #fromName(name) != null
static void add(String name, Sequence sequence)
Adds a sequence to the loaded list, making it accessible to the Wand and other parts of the API
cx.wasabi.standshop.util.WandFactory
Creates functional Wands that can be used by players to access Armor Stand menus
static ItemStack create()
Creates a new Wand ItemStack
static boolean isWand(ItemStack stack)
Checks if a given ItemStack is a wand
cx.wasabi.standshop.util.ArmorStandMenu
Manages the menu brought up when the Wand is used on an armor stand. This is a very set-it-and-forget-it class, it handles all events and even garbage-collects itself.
new ArmorStandMenu(Player ply, ArmorStand stand)
Creates a linkage between a player that can edit the Armor Stand, and the Armor Stand receiving the editing. The constructor will automatically bring up the inventory and handle everything from here.
cx.wasabi.standshop.util.ProfileLookup
Although mostly just for internal use, may be helpful for people using this API. Generates skinned GameProfiles, ready to be used on a player head
static GameProfile fromName(String name) throws GatewayException
Generates a skinned GameProfile given a username. Has to access Mojang apis, so it will take a while and possibly throw exceptions
static GameProfile getAlex()
Creates a GameProfile with the Alex skin
static GameProfile getSteve()
Creates a GameProfile with the Steve skin
Acknowledgements
This is a very early plugin! There may be some issues I haven't worked out, and general weirdness. Be cautious.