private async void CheckForExperience() { _running = true; while (_watch) { await Task.Delay(_delay); if (!_watch) { break; } var newRewards = _experienceProvider.GetRewardTrackData(); if (newRewards != null) { if (_rewardTrackData == null || _rewardTrackData.Xp != newRewards.Xp || _rewardTrackData.Level != newRewards.Level || _rewardTrackData.XpNeeded != newRewards.XpNeeded) { NewExperienceHandler?.Invoke(this, new ExperienceEventArgs(newRewards.Xp, newRewards.XpNeeded, newRewards.Level, _rewardTrackData != null ? newRewards.Level - _rewardTrackData.Level : 0, _rewardTrackData != null)); } _rewardTrackData = newRewards; } } _running = false; }
//Difficult to replicate, but there appears to be an issue where the old levels will appear once with level = 0 or level = 1 improperly. //This looks like how it does when it behaves properly and someone just gains a few levels, so it's difficult to parse from this incorrect case. //Therefore this should catch the jumps from 0 levels to a high levels (spamming the player with animations) and high xp gains at low levels. private bool ShouldAnimate(RewardTrackData newRewards) { if (_rewardTrackData == null) { return(false); } if (_rewardTrackData.Level <= 1 && newRewards.Level - _rewardTrackData.Level > 5) { return(false); } return(true); }