//TODO: Race condition here because it's possible the subsciber hasn't subscribed just yet. /// <inheritdoc /> public async Task OnGameInitialized() { CharacterListResponse listResponse = await CharacterQueryable.GetCharacters(AuthTokenRepository.RetrieveWithType()) .ConfigureAwait(true); if (!listResponse.isSuccessful || listResponse.CharacterIds.Count == 0) { if (Logger.IsErrorEnabled) { Logger.Error($"Failed to query character list. Recieved ResultCode: {listResponse.ResultCode}"); } //We don't have character creation... Soooo, nothing we can do right now. return; } //TODO: Should we make this API spit out network guids? foreach (var characterId in listResponse.CharacterIds) { NetworkEntityGuid entityGuid = new NetworkEntityGuidBuilder() .WithType(EntityType.Player) .WithId(characterId) .Build(); OnCharacterSelectionEntryChanged?.Invoke(this, new CharacterSelectionEntryDataChangeEventArgs(entityGuid)); } }
/// <inheritdoc /> public async Task OnGameInitialized() { try { CharacterListResponse listResponse = await CharacterServiceQueryable.GetCharacters() .ConfigureAwaitFalse(); //TODO: Handle errors foreach (var character in listResponse.CharacterIds) { var entityGuid = new NetworkEntityGuidBuilder() .WithId(character) .WithType(EntityType.Player) .Build(); //TODO: Optimize below awaits. //Do a namequery so it's in the cache for when anything tries to get entities name. await EntityNameQueryable.RetrieveAsync(entityGuid) .ConfigureAwaitFalse(); var appearanceResponse = await CharacterServiceQueryable.GetCharacterAppearance(entityGuid.EntityId) .ConfigureAwaitFalse(); var characterData = await CharacterServiceQueryable.GetCharacterData(entityGuid.EntityId) .ConfigureAwaitFalse(); //Don't throw, because we actually don't want to stop the //character screen from working just because we can't visually display some stuff. if (!appearanceResponse.isSuccessful) { Logger.Error($"Failed to query for Character: {entityGuid.EntityId} appearance. Reason: {appearanceResponse.ResultCode}"); } //TODO: Handle errors. CharacterAppearanceMappable.AddObject(entityGuid, appearanceResponse.Result); InitialCharacterDataInstance.AddObject(entityGuid, characterData.Result); OnCharacterSelectionEntryChanged?.Invoke(this, new CharacterSelectionEntryDataChangeEventArgs(entityGuid)); } } catch (Exception e) { Logger.Error($"Encountered Error: {e.Message}"); throw; } }