← All plugins
GlymeraArmorStand icon

GlymeraArmorStand

Collectible armor stands with endless variations! Every placed block spawns a unique NPC. Equip them with weapons and armor and build your personal gallery. Craftable, persistent, update-proof.

v10.0.0 Hytale 0.6.x ArmorCharactersQuality of LifeUtilityFurniture

Gallery

Description

GlymeraArmorStand - Collectible Armor Stands with Endless Variations

Craftable armor stands that spawn unique, randomized player-looking NPCs. Every stand is a one-of-a-kind collectible - equip them with armor and weapons to build your personal gallery.


What is GlymeraArmorStand?

GlymeraArmorStand adds craftable blocks that, when placed, spawn a unique NPC with a randomized player appearance. Every armor stand looks different - different hair, face, body type, clothing and more. You can equip them with any armor piece or weapon, rotate them freely, and pick them up to place them somewhere else. The appearance is permanently tied to each block, so your collection stays intact no matter how often you move them.

Craft, collect, equip, display.


How It Works

  1. Craft an Armor Stand block at a Workbench
  2. Place the block - a unique NPC appears, facing you
  3. Equip it by hitting the stand with armor or weapons
  4. Rotate it by hitting with a stick (45-degree steps)
  5. Unequip by hitting with an empty hand (strips all equipment)
  6. Pick up by hitting a naked stand with an empty hand (returns the block with its identity)
  7. Place again anywhere - the exact same NPC appears

Commands

Command Who Description
/armorstand Everyone Show plugin info and usage help
/armorstand list Everyone List all your placed armor stands with locations and equipment
/armorstand equip Everyone Equip your held item on the nearest armor stand (within 5 blocks)
/armorstand give [player] OP Give 8 armor stand blocks to yourself or a player
/armorstand removeall OP Remove all armor stands from the world
/armorstand reload OP Reload the config file

Crafting Recipe

Crafted at a Workbench (Survival category):

  • 2x Gold Bar
  • 1x Bone Fragment
  • 1x Raw Pork

The recipe can be disabled in the config file (requires server restart).


Equipment Slots

Armor stands support 6 equipment slots. The slot is automatically detected from the item name:

Slot Detected Keywords
Head _head, _helmet, _hat, _mask, _hood, _cap, _crown
Chest _chest, _torso, _body, _robe, _tunic, _vest
Hands _hands, _gloves, _gauntlet
Legs _legs, _pants, _leggings, _boots, _feet, _greaves
Right Hand weapon_*, tool_*, or any unrecognized item
Left Hand Via /armorstand equip when right hand is occupied

Swapping: If a slot is already occupied, the old item is returned to your inventory before the new one is applied.


Features

  • Endless variations - Every armor stand gets a unique, randomized player appearance from Hytale's full cosmetics pool
  • True collectibles - Each block carries a unique seed; the same block always produces the same NPC
  • Stable appearances - NPC looks are permanently saved and survive server updates that change the cosmetics pool
  • Full equipment support - Head, chest, hands, legs, right hand and left hand slots
  • Rotation - Hit with a stick to rotate in 45-degree steps; stands snap to face you when first placed
  • Ownership protection - Only the owner (or an OP) can interact with a stand
  • Per-player limit - Configurable maximum number of stands per player (default: 50)
  • Persistent - Stands survive server restarts with all equipment and appearance intact
  • Chunk-aware - NPCs only spawn when their chunk is loaded, no wasted resources
  • Craftable - Recipe can be enabled or disabled in the config

Configuration

The config file is automatically created at first startup in the plugin data directory.

{
  "maxStandsPerPlayer": 50,
  "recipeEnabled": true
}
Setting Default Description
maxStandsPerPlayer 50 Maximum number of placed armor stands per player
recipeEnabled true Whether the crafting recipe is available (requires restart)

Installation

  1. Place GlymeraArmorStand-1.0.0.jar in your server's mods/ folder
  2. Start (or restart) the server
  3. Done!

Data Files

The plugin stores its data in the plugin data directory:

File Purpose
config.json Plugin settings
stands.json All placed stands (positions, equipment, owners)
skins.json Permanent seed-to-appearance registry (ensures stability across updates)

Good to Know

  • Armor stands are invulnerable - they cannot be killed by damage, only picked up by the owner
  • Stands are immobile - they cannot be pushed or moved by any game mechanic
  • When you reach your stand limit, you'll see a message: "Maximum armor stands reached! (50/50)"
  • Interacting with someone else's stand shows: "This is not your armor stand!"
  • OPs can interact with any stand regardless of ownership
  • Picking up a stand returns all equipped items to your inventory first, then gives you the block
  • The block can be safely stored in chests and containers

Performance

  • Chunk-aware spawning - NPCs are only spawned when their chunk is loaded by a player
  • Periodic cleanup - Stale or duplicate NPCs are automatically removed every second
  • Cached skins - Generated models are cached in memory to avoid repeated computation
  • Minimal tick cost - One lightweight check per second, no per-tick processing

Made with care by Glymera for the Hytale community

Changelog

GlymeraArmorStand - Changelog

v10.0.0 (2026-08-30) — Stands vanishing on Hytale 0.6 fixed

Fixed

  • Armor stands no longer disappear when you leave the area or after a server restart.
    Hytale 0.6 loads and ticks the world in 32-block cubes (sections), each on its own. When no
    player is near, a section stops ticking and the engine drops every non-persistent entity in
    it - which is exactly what stands are since v8 (so they can never duplicate). Nothing tells
    the plugin when that section wakes up again, so the old "re-create on chunk load" path never
    ran and the stand stayed gone - most visible for stands placed underground or far from where
    you usually walk. The saved stand data was never lost; only the visible NPC was missing.

Changed

  • New presence keeper: every 2 seconds the plugin checks each saved stand whose NPC is missing
    and re-creates it as soon as a player is within 64 blocks and its section is loaded and
    ticking. A stand that comes back from the engine without its look is replaced as well.
  • Stands are no longer spawned while nobody is near them (on chunk load or at server start).
    That only made the engine park them and log Entity has moved into a chunk that isn't currently loaded! every few seconds until someone showed up. The keeper handles it instead.
  • Cost is negligible: a handful of distance checks per saved stand every 2 seconds, no world
    scans; the actual spawn work happens exactly as often as before, just at the right moment.

Notes

  • Existing stands.json / skins.json data are untouched; stands that went missing on 0.6
    reappear automatically the next time you walk up to them.
  • v8's ghost cleanup (duplicate / naked stand removal) is unchanged and still runs.

v9.0.0 (2026-08-28) — Hytale 0.6.0 (Update 6)

  • Rebuilt for Hytale 0.6.0 (Update 6). Requires server 0.6.0 or newer; this version does not run on 0.5.x, and older versions of this plugin do not run on 0.6.0.
  • Migrated to the 0.6.0 APIs (network protocol hytale/3, new command-permission API, block/chunk/entity API changes). Everything that was open to players before is open to players again.
  • Upgrade: delete the old jar from mods/, drop in the new one and keep the plugin's data folder — configs and saved data carry over unchanged. Restart the server.

v8.0.0 (2026-06-04)

Fixed

  • Armor stands no longer duplicate or leave "naked ghost" copies. Previously the Hytale
    engine persisted every spawned stand NPC to the world. On each restart a saved copy was
    rehydrated by the engine and a fresh one was spawned from stands.json, so stands could
    multiply over time and stale copies sometimes appeared without their skin/equipment.

Changed

  • Stand NPCs are now spawned non-persistent: the engine never writes them to the chunk,
    so no copy can ever be rehydrated on restart. Each stand is re-created from stands.json
    when its chunk loads — exactly one per saved stand, every time. Skin, equipment and rotation
    are unaffected (they are re-applied from the plugin's own data on every spawn).
  • The previous position/appearance-based ghost cleanup is kept as an extra safeguard and to
    remove any stand copies left over from older versions.

Notes

  • This release is purely the duplication fix. Crafting, equipping/unequipping, durability
    handling, commands and config are unchanged. Existing stands.json and skins.json data
    are fully compatible.

v7.0.0 (2026-05-26)

  • Compatibility build for Hytale Stable-5.

v6.0.0 (2026-05-16)

Bug Fixes

  • Free-repair exploit closed: Equipping a damaged item (armor, weapon, or tool) onto an armor stand and then unequipping it no longer returns a fully-repaired item. Players could previously place a near-broken iron chestpiece on a stand, hit the stand with an empty hand, and recover the same piece at full durability — effectively turning every armor stand into a free repair bench. Reported by user_1bj5dukinaiflsam on CurseForge (2026-05-13). Verified reproducible in v5.0.0; fixed and confirmed by in-game testing in v6.0.0.

Root Cause

  • StandData only stored each equipped slot as a String (the item ID), so the original ItemStack's durability was discarded when the item was placed on the stand. When the player took the item back, the plugin built a brand-new ItemStack(itemId, 1) via the regular constructor, which produces a stack at full max-durability for that item type.
  • The Hytale ItemStack API exposes durability as the only stack-level property a player can meaningfully change for armor/weapons/tools today (no enchantments, no per-stack subtypes, no custom names in vanilla Hytale Dev Preview). Preserving it is enough to fix the exploit completely.

Changes

  • Per-slot durability tracking in StandData: Added six new double fields — headDur, chestDur, handsDur, legsDur, rightHandDur, leftHandDur — that mirror the existing six item-ID slots.
  • setEquipSlot(StandData, int, String, double): signature extended with a durability parameter. Both equip code paths (hit-with-item in StandInteractSystem, and the /armorstand equip command) now pass heldItem.getDurability() when storing.
  • New getEquipSlotDur(StandData, int) helper for symmetry.
  • popAllEquipment now returns List<StoredEquip> instead of List<String>. StoredEquip is a small static inner record carrying slot, itemId, and dur, so the strip-all path (empty-hand hit) can rebuild each item with its saved durability.
  • giveItemDirect overloaded: the legacy 4-argument signature delegates to a new 5-argument variant that accepts a durability and applies ItemStack.withDurability(dur) when dur > 0. Callers that didn't change behavior keep working unchanged.
  • Header comment + manifest bumped to v6.0.0.

Migration / Legacy Stands

  • Armor stands persisted under v5.0.0 (or earlier) deserialize cleanly: Gson populates the new *Dur fields with the Java default 0.0. The restore logic treats dur <= 0 as a "no stored value" sentinel and returns a fresh, fully-durable stack — no exception, no data loss. The next time a player equips an item on that stand, the actual durability begins to be tracked. No migration step is required.

Coverage

  • All six slots are covered: helmet, chest, gauntlets, pants, right hand (weapons + tools), left hand. detectSlot() already routes tools (Tool_Pickaxe_*, Tool_Hammer_*) and weapons (Weapon_*) into the right-hand slot; their durability is now preserved like armor's.

v5.0.0 (2026-04-29)

Changes

  • Asset-based slot detection: detectSlot() now reads the item's declared Armor.ArmorSlot field via Item.getAssetStore().getAssetMap().getAsset(itemId).getArmor().getArmorSlot() and maps it directly to Head/Chest/Hands/Legs. The previous behavior — guessing the slot from substrings in the item ID (_head, _helmet, _hat, _chest, _torso, _hands, _gloves, _legs, _pants, ...) — is kept as a fallback for items without an Armor block (weapons, tools, sticks).
  • Result: Custom plugin armor items (e.g. GlymeraHelm_Bunny from GlymeraHeads, or any third-party armor with non-standard naming) now land in the correct slot when equipped via /armorstand equip instead of falling through to the right hand. Vanilla helmets, chestpieces and gauntlets are unaffected — they declare Armor.ArmorSlot and are simply detected faster now.

No Functional Changes

  • All commands, equipment mechanics, skin generation, persistence, and recipes remain identical to v4.0.0.

v4.0.0 (2026-04-22)

Bug Fixes

  • Naked Player Ghost Fix: Resolved the long-standing issue where naked player-model NPCs would appear next to (and sometimes inside) armor stands after players moved away and returned, after server restarts, or when chunks reloaded. Ghosts kept reappearing even after repeated rejoins, accumulating over days of play. Root cause: Hytale persists the NPCEntity in chunk data during chunk unload, but not the plugin's runtime ModelComponent and PlayerSkinComponent. On chunk reload Hytale rehydrates the entity with an old UUID and the DEFAULT_PLAYER_MODEL but no skin — visible as a "naked player". Critically, this rehydration happens 0.5 to 3 seconds after the ChunkPreLoadProcessEvent fires, so a synchronous cleanup at that event finds nothing.

Changes

  • New lifecycle architecture: Replaced the entire runtime detection system (periodic checkStandSkins tick, skin-drift checks, position-drift checks, respawn cooldowns, initial-cleanup lockout, player-join hooks) with a single event-driven flow:
  • On ChunkPreLoadProcessEvent: immediately spawn the fresh stand NPCs at their registered positions.
  • Three delayed sweep tasks at 1s, 3s, and 5s after the event catch the late-rehydrating ghost entities that Hytale adds to the chunk afterward.
  • Precise ghost criteria (all four must match): (a) entity sits on the exact block coordinates of a registered stand, (b) has no valid PlayerSkinComponent (or bodyCharacteristic is null), (c) is not in the plugin's entityLookup (i.e. not a freshly-spawned tracked stand), (d) lies in the chunk that was just reloaded. This prevents false positives for legitimate other NPCs (Farmers, Companions, Merchants) that might be near a stand — they have their own skin components and won't be in stand-block positions.
  • Role config change: ApplySeparation: false in GlymeraArmorStandStatic.json. Without this, rehydrated ghost entities drift 2-3 blocks away from the stand block within milliseconds (Hytale's built-in separation physics) and escape the exact-block cleanup. SeparationDistance must be set to 1, not 0 — Hytale rejects 0 at role load time.
  • Stripped complexity: Removed the periodic checkStandSkins tick entirely, along with initialCleanupDone, cleanupCyclesRemaining, respawnCooldowns, onPlayerJoin hook, GhostSuppressorSystem (the NewSpawnComponent approach doesn't work on rehydrated entities — Hytale only marks true fresh spawns), and all related bookkeeping. The plugin is now about 250 lines shorter and considerably simpler.

Notes

  • Old ghost entities that accumulated in chunk data over previous sessions are cleaned up automatically on the next chunk load (observed cleanup of 17+ ghosts in a 13-stand cluster during testing).
  • The 1s delay means newly loaded stand chunks show a very brief (<1 second) window where ghosts are visible before being removed. Acceptable for the functional fix.
  • All commands, equipment mechanics, skin generation, item metadata, persistence, and recipes remain identical to v3.0.0.

v3.0.0 (2026-04-15)

Bug Fixes

  • Duplicate NPC Fix: Resolved issue where armor stands would duplicate (sometimes 100+) when players switched between worlds/instances and returned. Duplicates appeared as skinless NPCs that walked around. Root cause: the plugin respawned NPCs immediately when getEntityRef briefly returned null during chunk transitions, while Hytale simultaneously restored its own persisted copies from chunk data.

Changes

  • Cleanup-first architecture: Adopted the proven approach from GlymeraFarmer. On first player join after server start, all stand NPCs are deleted and entity tracking is reset. A 3-cycle lockout prevents any respawning until cleanup completes.
  • Respawn cooldown (3 seconds per stand): When a stand NPC is detected as missing, the plugin now waits 3 seconds before respawning. This prevents rapid-fire duplication when entity references are briefly invalid during chunk loading.
  • Pre-spawn position cleanup: Before spawning a new stand NPC, all untracked NPCs at the same position are removed first.
  • Spawn lockout during cleanup: No stand NPCs are respawned while any cleanup cycle is active.
  • Periodic cleanup reduced: Duplicate scan interval changed from every 1 second to every 5 seconds to reduce unnecessary overhead.

No Functional Changes

  • All commands, equipment mechanics, skin generation, persistence, and recipes remain identical to v2.0.0.

v2.0.0 (2026-04-11)

Bug Fixes

  • Skin Persistence Fix: Armor Stand appearances no longer randomize after chunk persistence cycles (auto-save, player disconnect/reconnect). Previously, ApplyRandomSkinPersistedComponent caused Hytale to re-randomize the NPC skin on every persistence cycle, overriding the seed-based deterministic skin set by the plugin. This was hidden before because chunk unloading triggered a respawn cycle that re-applied the correct skin. With GlymeraChunkLoader keeping chunks permanently loaded, the respawn cycle never triggered, making the bug visible.

Technical Details

  • Removed ApplyRandomSkinPersistedComponent from NPC spawn logic (was line 535-536)
  • The plugin's own persistence system (seed in item durability + skins.json registry + ModelComponent/PlayerSkinComponent) is sufficient and correct
  • Removed unused ApplyRandomSkinPersistedComponent import

v1.0.0 (2026-04-10)

  • Initial release: Craftable armor stand blocks that spawn random player-looking NPCs
  • Seed-based deterministic appearance (stored in item durability)
  • Equipment system (hit with armor/weapon to equip, empty hand to unequip/break)
  • Persistent across server restarts (position, equipment, appearance)
  • Chunk load/unload handling with duplicate cleanup
  • /armorstand give|list|removeall|reload commands
Public — visible to everyone. No account needed.

Only Marc can read this.