File Details
GlymeraArmorStand-4.0.0.jar
- R
- Apr 22, 2026
- 74.10 KB
- 67
- Early Access
File Name
GlymeraArmorStand-4.0.0.jar
Supported Versions
- Early Access
GlymeraArmorStand - Changelog
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.
- On
- 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

