StandShop 1.0.1

Create animated Armor Stands and give your builders great tools to maximize Armor Stand coolness

  1. Wasabi_Thumbs
    Native Minecraft Version:
    1.16
    Tested Minecraft Versions:
    • 1.13
    • 1.14
    • 1.15
    • 1.16
    [​IMG]
    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:
    upload_2020-11-30_3-28-58.png
    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.
    upload_2020-11-30_3-33-7.png

    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.

Recent Updates

  1. Small patch/QOL improvements