DisguiseListeners
Per design Q6 the only auto-undisguise trigger is player logout — death, damage, and world change all preserve the disguise. The plugin-disable path goes through DisguiseManager.shutdown() called from the main plugin onDisable.
Also forwards arm-swing events to the per-disguise animation controller so the disguise model plays its 'attack' animation in sync with the player's swing. Sneak / walk / jump are read each tick from the player's cached state and don't need event listeners.
PlayerJoinEvent / PlayerChangedWorldEvent re-send the empty-equipment override to fresh viewers so a player who comes online (or warps in from another world) doesn't see armor / held items clipping through an in-progress disguise. setVisibleByDefault(false) already hides the body for future viewers, but Minecraft renders worn equipment independently of body visibility — without this re-broadcast the disguise's armor would show on every newly-arrived viewer.