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
- Craft an Armor Stand block at a Workbench
- Place the block - a unique NPC appears, facing you
- Equip it by hitting the stand with armor or weapons
- Rotate it by hitting with a stick (45-degree steps)
- Unequip by hitting with an empty hand (strips all equipment)
- Pick up by hitting a naked stand with an empty hand (returns the block with its identity)
- 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
- Place
GlymeraArmorStand-1.0.0.jarin your server'smods/folder - Start (or restart) the server
- 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 logEntity 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.jsondata 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 fromstands.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 fromstands.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. Existingstands.jsonandskins.jsondata
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_1bj5dukinaiflsamon CurseForge (2026-05-13). Verified reproducible in v5.0.0; fixed and confirmed by in-game testing in v6.0.0.
Root Cause
StandDataonly stored each equipped slot as aString(the item ID), so the originalItemStack's durability was discarded when the item was placed on the stand. When the player took the item back, the plugin built a brand-newItemStack(itemId, 1)via the regular constructor, which produces a stack at full max-durability for that item type.- The Hytale
ItemStackAPI 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 newdoublefields —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 inStandInteractSystem, and the/armorstand equipcommand) now passheldItem.getDurability()when storing.- New
getEquipSlotDur(StandData, int)helper for symmetry. popAllEquipmentnow returnsList<StoredEquip>instead ofList<String>.StoredEquipis a small static inner record carryingslot,itemId, anddur, so the strip-all path (empty-hand hit) can rebuild each item with its saved durability.giveItemDirectoverloaded: the legacy 4-argument signature delegates to a new 5-argument variant that accepts a durability and appliesItemStack.withDurability(dur)whendur > 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
*Durfields with the Java default0.0. The restore logic treatsdur <= 0as 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 declaredArmor.ArmorSlotfield viaItem.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 anArmorblock (weapons, tools, sticks). - Result: Custom plugin armor items (e.g.
GlymeraHelm_Bunnyfrom GlymeraHeads, or any third-party armor with non-standard naming) now land in the correct slot when equipped via/armorstand equipinstead of falling through to the right hand. Vanilla helmets, chestpieces and gauntlets are unaffected — they declareArmor.ArmorSlotand 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
NPCEntityin chunk data during chunk unload, but not the plugin's runtimeModelComponentandPlayerSkinComponent. 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 theChunkPreLoadProcessEventfires, so a synchronous cleanup at that event finds nothing.
Changes
- New lifecycle architecture: Replaced the entire runtime detection system (periodic
checkStandSkinstick, 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(orbodyCharacteristicis null), (c) is not in the plugin'sentityLookup(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: falseinGlymeraArmorStandStatic.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.SeparationDistancemust be set to 1, not 0 — Hytale rejects 0 at role load time. - Stripped complexity: Removed the periodic
checkStandSkinstick entirely, along withinitialCleanupDone,cleanupCyclesRemaining,respawnCooldowns,onPlayerJoinhook,GhostSuppressorSystem(theNewSpawnComponentapproach 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
getEntityRefbriefly 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,
ApplyRandomSkinPersistedComponentcaused 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
ApplyRandomSkinPersistedComponentfrom NPC spawn logic (was line 535-536) - The plugin's own persistence system (seed in item durability +
skins.jsonregistry +ModelComponent/PlayerSkinComponent) is sufficient and correct - Removed unused
ApplyRandomSkinPersistedComponentimport
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|reloadcommands
Only Marc can read this.