public async Task <bool> SavePlayerSkillsAsync(IPlayerController player) { var state = player.BuildPlayerState(); if (state == null || string.IsNullOrEmpty(state.UserId)) { return(false); } return(await Task.Run(() => { if (client.Desynchronized) { return false; } var characterUpdate = new CharacterSkillUpdate { Level = state.Level, Experience = state.Experience, UserId = state.UserId, CharacterId = state.CharacterId }; if (lastSavedSkills.TryGetValue(player.UserId, out var lastUpdate)) { if (!RequiresUpdate(lastUpdate, characterUpdate)) { return true; // return true so we dont get a red name in the player list just because the exp hasnt changed. } } connection.SendNoAwait("update_character_skills", characterUpdate); lastSavedSkills[player.UserId] = characterUpdate; lastSavedSkillsTime[player.UserId] = DateTime.UtcNow; return true; })); }