Fixed
- CRITICAL — NullPointerException on Interaction: Fixed a crash when players interacted with NORMAL-type NPCs caused by a null model ID being passed into the placeholder selector. Null values are now safely redirected to "none".
- Component String Leak in Placeholder: Fixed {player_display} displaying raw component output (TextComponentImpl{...}) on Paper 1.20+. Now correctly serialized to plain text.
- Async Location Safety: Added null-checks for {npc_x}, {npc_y}, and {npc_z} placeholders to prevent interaction loop breaks when world or location data is temporarily unloaded between ticks.
Fixed
- CRITICAL — Normal NPC Persistence: NPC data of type NORMAL was being silently wiped on every server restart or plugin reload.
- CRITICAL — Mass Disconnect on NPC Spawn: Corrected an invalid entity metadata index that caused an IllegalStateException, disconnecting all online players when an NPC was spawned.
- CRITICAL — NPC Skin Not Appearing: All NPC skins were rendering as default Steve. Fixed by properly delaying PlayerInfoRemove to allow skin textures to load on the client side.
- Interaction De-duplication: Interaction messages were triggering multiple times per click on Normal NPCs.
- Profile Name Sanitation: Added validation on NPC profile names to prevent native protocol failures.
- Vanilla Nametag Visibility: Default Minecraft nametags on NPCs are now properly hidden, ensuring full compatibility with FancyHolograms.
Improved
- Mineskin API Retry Logic: Added retry-with-backoff support when Mineskin returns a timeout, with up to 3 automatic retries.
- HTTP Request Timeout: Async threads no longer hang indefinitely when Mineskin or Mojang API is unresponsive.
Added
- Native Packet NPC System: Completely replaced the third-party FancyNpcs dependency with a robust, native NPC rendering system using PacketEvents. The plugin now directly handles all aspects of normal (player-shaped) NPCs at the protocol level.
- Packet-Based Interactions: Added NativeNPCInteractionListener which securely intercepts LEFT and RIGHT click packets locally without relying on Bukkit's Entity API, enabling instant interactive responses.
- Per-Player Look Tracking: The LookCloseTask now natively sends WrapperPlayServerEntityHeadLook and WrapperPlayServerEntityRotation packets dynamically to nearby players for Normal NPCs, delivering smooth and efficient head tracking.
- Background Player Tracking: Integrated NPCTrackerTask which loops asynchronously to actively track player distances up to 48 blocks and intelligently sends spawn/despawn entity packets to maintain network efficiency.
Changed
- Removed FancyNpcs Dependency: Completely stripped FancyNpcs code and legacy requirements from the pom.xml, significantly making the plugin more reliable, isolated, and lightweight.
- Advanced NPCManager and NPCSpawner integrations to properly utilize our new custom packet processing logic.
Added
- NPC Display Name Toggle (/menpc name <id> <true|false>): Control the visibility of the primary display name (hologram) for normal-type NPCs. Default is false (hidden) to prevent conflict with custom FancyHolograms displays.
Changed
- FancyNpcsIntegration now dynamically injects <empty> as the display name if the NPC is configured to hide its name natively.
Added
- NPC Cloning (/menpc copy <source> <new-id>): Full deep-copy of any NPC including model, skin, animations, interactions, and hologram settings. Clone spawns at the player's current location.
- Universal LookClose System: Complete rewrite of LookCloseTask to support both MODEL_ENGINE and NORMAL NPC types. No longer dependent on FancyNpcs for look-at-player behavior on normal NPCs.
- NPC Type Conversion(/menpc setnpctype <id> <type>): Convert existing NPCs between model and normal types at runtime. Handles full despawn → type transition → respawn cycle automatically.
- model → normal: NPC becomes a player entity (Steve default). Skin can be set separately via /menpc setskin.
- normal → model: Requires a valid modelId parameter. Animation config is auto-applied.
- Set Skin Command (/menpc setskin <id> <player-name|url>): Dedicated command to set or change the skin of a normal-type NPC at any time.
- Mojang API Skin Support: Normal NPCs can now use a Minecraft player name (e.g., Notch) as the skin source. Skins are fetched from Mojang's session server (~100ms, no strict rate limits). Works in both /menpc create and /menpc setskin.
- Smart Skin Detection: SkinManager auto-detects input type — URLs (starting with http:// or https://) route to Mineskin API; everything else routes to Mojang API.
Changed
- Async Skin Fetching: Replaced synchronous FancyNpcs skin fetch with async-first approach. NPCs now spawn instantly and skin loads in the background via SkinManager. Eliminates SocketTimeoutException from Mineskin API timeouts.
- Texture Caching: Skin textures (value + signature) are cached after first fetch. Subsequent spawns (reload, restart) apply skins instantly with zero network calls.
- FancyNpcs Integration (v2.9.x): Updated SkinData construction to use SkinData.SkinVariant.AUTO instead of CLASSIC — fixes compatibility with FancyNpcs 2.9.x API.
- LookClose Decoupling: LookCloseTask now manages turnToPlayer state on FancyNpc instances at runtime instead of setting it once at spawn. This is a step toward fully removing the FancyNpcs dependency.
Fixed
- SocketTimeoutException on NPC Creation: Skin fetching no longer blocks the spawn process. FancyNpcs' synchronous setSkin(url) was replaced with our own async skin pipeline.
- No enum constant SkinData.SkinVariant.CLASSIC: Fixed SkinVariant enum resolution for FancyNpcs 2.9.x. Now uses AUTO which is guaranteed to exist.
- LookClose Not Working for Normal NPCs: The lookclose command now correctly syncs the look-at-player state to live FancyNpc instances, not just at spawn time.
Added
- Normal NPC Support (NPCType.NORMAL): Create standard Minecraft player NPCs alongside ModelEngine entities.
- FancyNpcs Integration: Integration with FancyNpcs API (v2.9.x) for rendering normal-type NPCs.
- Mineskin API Support: SkinManager fetches and processes skin URLs asynchronously through the Mineskin API.
- Dynamic Commands: The /menpc create command now accepts a type parameter (normal or model) with context-aware tab completion.
- Context-Aware GUI: NPCEditorGUI dynamically switches between model ID and skin URL editing based on NPC type.
Changed
- Refactored NPCManager to route spawning behaviors to the appropriate spawner layer (NPCSpawner for model, FancyNpcsIntegration for normal).
- Normal NPCs safely bypass ModelEngine-specific checks to prevent console exceptions.
Added:
- Public Developer API (ModelEngineNPCAPI): Full programmatic access to create, remove, and manage NPCs.
- Maven Repository: Plugin artifacts hosted on repo.minekarta.com for dependency management.
- YAML persistence architecture (YamlNPCRepository).
- Interactive clicking system with configurable interaction commands.
- Hologram settings and formatting integration via FancyHolograms API.
