private void HandleDynelNameEvent(Provider sender, RKNTracker.AoHook.Events.DynelNameEventArgs e)
        {
            if (!e.IsSelf) { return; }
            bool changed = false;
            PlayerInfoKey key = new PlayerInfoKey(e.ServerID, e.DynelID);

            lock (API.State.PlayerInfo)
            {
                if (!API.State.PlayerInfo.ContainsKey(key))
                {
                    API.State.PlayerInfo[key] = new PlayerInfo();
                }

                var info = API.State.PlayerInfo[key];

                if (e.DynelID != uint.MinValue && e.DynelID != uint.MaxValue)
                {
                    if (info.ID != e.DynelID)
                    {
                        changed = true;
                    }
                    info.ID = e.DynelID;
                }
                if (e.DynelName != "NoName")
                {
                    if (e.DynelName != info.Name)
                    {
                        changed = true;
                    }
                    info.Name = e.DynelName;
                }
                if (e.ServerID != 0)
                {
                    if (e.ServerID != info.ServerID)
                    {
                        changed = true;
                    }
                    info.ServerID = e.ServerID;
                    info.Identity.Dimension = PlayerInfoKey.GetDimension(e.ServerID);
                }
            }
            if (changed)
            {
            }
        }
 private void HandleCharacterLogoutEvent(Provider sender, AoHook.Events.CharacterLogoutEventArgs e)
 {
     PlayerInfoKey key = new PlayerInfoKey(e.ServerID, e.CharacterID);
     lock (this.ProcessCharacterMap)
     {
         if (!this.ProcessCharacterMap.ContainsKey(e.ProcessID))
         {
             return;
         }
         else
         {
             if (API.State.PlayerInfo.ContainsKey(this.ProcessCharacterMap[e.ProcessID]))
             {
                 API.State.PlayerInfo[this.ProcessCharacterMap[e.ProcessID]].IsHooked = false;
             }
             this.ProcessCharacterMap.Remove(e.ProcessID);
         }
     }
 }
        private void HandleCharacterPositionEvent(Provider sender, RKNTracker.AoHook.Events.CharacterPositionEventArgs e)
        {
            // Ignore anything which isn't player characters.
            if (e.DynelType != 50000) { return; }

            // Don't update if we have invalid data (such as while zoning)
            if (e.ZoneID == 0) { return; }

            var update = false;
            var fireEvent = false;

            lock (API.State.PlayerInfo)
            {
                PlayerInfoKey key = new PlayerInfoKey(e.ServerID, e.DynelID);
                var info = API.State.PlayerInfo[key];

                if (info.Position.X != e.X || info.Position.Y != e.Y || info.Position.Z != e.Z)
                {
                    fireEvent = true;
                }

                info.Position = new Vector3(e.X, e.Y, e.Z);
                info.Zone.ID = e.ZoneID;
                info.Zone.Name = e.ZoneName;

                if (info.InShadowlands != e.InShadowlands)
                {
                    update = true;
                }

                info.InShadowlands = e.InShadowlands;

                if (info.ServerID != e.ServerID)
                {
                    info.ServerID = e.ServerID;
                    update = true;
                    this.UpdateTrackedDimension();
                }

                if (!info.IsHooked)
                {
                    info.IsHooked = true;
                    update = true;
                }
            }
            if (update)
            {
            }

            if (fireEvent)
            {
                FireDisplayEvent();
            }
        }
        private void HandleCharacterLoginEvent(Provider sender, RKNTracker.AoHook.Events.CharacterLoginEventArgs e)
        {
            PlayerInfoKey key = new PlayerInfoKey(e.ServerID, e.CharacterID);

            lock (this.ProcessCharacterMap)
            {
                if (!this.ProcessCharacterMap.ContainsKey(e.ProcessID))
                {
                    this.ProcessCharacterMap[e.ProcessID] = key;
                }
                else if (this.ProcessCharacterMap[e.ProcessID] != key)
                {
                    API.State.PlayerInfo[this.ProcessCharacterMap[e.ProcessID]].IsHooked = false;
                    this.ProcessCharacterMap[e.ProcessID] = key;
                }
            }

            lock(API.State.PlayerInfo)
            {
                if (API.State.PlayerInfo.ContainsKey(key))
                {
                    API.State.PlayerInfo[key].IsHooked = true;
                }
            }
        }