Update players based on navigating NPC's. Update player when NPC navigates into players field of view.
Moved skin update tracker code to own class (SkinUpdateTracker)
fix use incorrect setting for tab list
rename PlayerListRemover to TabListRemover
rename recently added NMS#sendPlayerListRemove, #sendPlayerListAdd methods to #sendTabList*
fixed client sometimes disconnects for: Internal Exception: io.netty.handler.codec.DecoderException: java.io.IOException: Packet 0/56 (ki) was larger than I expected, found 917 bytes extra whilst reading packet 56;
changes in Skin#setNPCTexture
Allow retrieving Skin instance by skin name instead of entity so it can be retrieved without a spawned entity instance. Changes in Skin and SkinPacketTracker.
add SkinPacketTracker#onSpawnNPC
remove redundant scheduled skin update tasks in CitizensNPC and EventListen; provide no benefit
reset current SkinUpdateTracker instance if exists instead of creating a new one for all players in EventListen#onCitizensReload
reset rotation count in EventListen when player teleports/changes world/etc
reset update trackers for players nearby NPC's that spawn in case they are not looking at the NPC.
reset skin and profile fetcher cache on citizens reload
fix -p flag in skin command not implemented
use latest skin by default
fix Property created for cached skins uses incorrect name
fix rotation based skin update in EventListen.SkinUpdateTracker
remove redundant skin update on first move in EventListen.SkinUpdateTracker
re-implement skin fetch retry; re-add settings (since reloading can cause too many requests)
...Fixed invisible NPC's by allowing new update tasks to cancel current
tasks instead of cancelling the new task in SkinPacketTracker#updateViewer
cancel packets in SkinPacketTracker#updateViewer after getting PlayerEntry to ensure current scheduled tasks are cancelled.
remove LinkedList, replace with ArrayDeque
ensure EventListen#recalculatePlayer does not execute for NPC's
do a little less work in EventListen.SkinUpdateTracker#shouldUpdate
don't add skinnable entity to pending map if using cache skin - Skin#apply
remove redundant fetch per NPC in Skin; Skin can already fetch once for itself
fix and improve thread safety for profile fetcher; prevent external access
to threads Runnable interface; honor subscriber always invoked from main
thread.
rename ProfileFetchSubscriber to ProfileFetchHandler since subscriber implies the handler will be used continuously
add skin packages with skin classes
add profile package with profile fetcher classes
update commands
update EventListen
update NMS
fix radius squared
fix exception message
fix npc sometimes not removed from playerlist
fix cannot add npc to playerlist
code/comment cleanup and refactoring
remove unused skin settings
removed NPC_SKIN_RETRY_DELAY, MAX_NPC_SKIN_RETRIES
current code uses cached textures if a skin profile request fails.
add setting for updating skin
added NPC_SKIN_UPDATE: true to always get the latest skin, false to use cached skin if available, default is false.
minor code fixes, refactoring, add settings
removed assert
removed thread checks
added setting: NPC_SKIN_VIEW_DISTANCE
added setting: NPC_SKIN_UPDATE_DISTANCE
added setting: MAX_PACKET_ENTRIES
invoke EventListen#SkinUpdateTracker#reset from within #shouldUpdate instead of requiring it to be invoked manually.
fix cached locations not used in EventListen#getNearbySkinnableNPCs
clamp yaw in EventListen.SkinUpdateTracker
use static constants
rename EntitySkinnable to SkinnableEntity
add SkinnableEntity interface to PlayerNPC (CraftPlayer)
remove unused code from PlayerListRemover
replace Subscriber with direct notification to entity via method
Undo EntityController interface changes
moved skin code from HumanController to CitizensNPC
fix npcs sometimes do not show
... due to packet tracker not being notified that remove packets have been cancelled
fix imports rearranged by incorrect IDE settings