private void UpdateData([NotNull] IGameObjectBehaviourDataServiceClient <TBehaviourTransportType> client) { if (client == null) { throw new ArgumentNullException(nameof(client)); } DisplayProgressBar($"Saving {nameof(TBehaviourType)} Data", "Saving", 0.25f); UnityAsyncHelper.UnityMainThreadContext.Post(async o => { try { int objectInstanceId = GetTarget().gameObject.GetComponent <GameObjectStaticSpawnPointDefinition>().GameObjectInstanceId; await client.UpdateBehaviourInstance(objectInstanceId, BehaviourToTransportConverter.Convert(GetTarget())); await RefreshLocalDataAsync(client); } catch (Exception e) { Debug.LogError($"Failed to update remote data. Reason: {e.Message}"); throw; } finally { ClearProgressBar(); } }, null); }
private void RefresheData([NotNull] IGameObjectBehaviourDataServiceClient <TBehaviourTransportType> client) { if (client == null) { throw new ArgumentNullException(nameof(client)); } DisplayProgressBar($"Querying {typeof(TBehaviourType).Name} Data", "Querying", 0.5f); UnityAsyncHelper.UnityMainThreadContext.Post(async o => { await RefreshLocalDataAsync(client); }, null); }
//[AuthorizeJwt(GuardianApplicationRole.ZoneServer)] //TODO: Eventually we'll need to auth these zoneservers. public async Task <IActionResult> WorldTeleportCharacter([FromBody][NotNull] ZoneServerWorldTeleportCharacterRequest requestModel, [FromServices][NotNull] ICharacterLocationRepository characterLocationRepository, [FromServices][NotNull] IGameObjectBehaviourDataServiceClient <WorldTeleporterInstanceModel> worldTelporterDataClient, [FromServices][NotNull] IPlayerSpawnPointDataServiceClient playerSpawnDataClient) { if (requestModel == null) { throw new ArgumentNullException(nameof(requestModel)); } if (characterLocationRepository == null) { throw new ArgumentNullException(nameof(characterLocationRepository)); } if (worldTelporterDataClient == null) { throw new ArgumentNullException(nameof(worldTelporterDataClient)); } if (playerSpawnDataClient == null) { throw new ArgumentNullException(nameof(playerSpawnDataClient)); } //TODO: Right now there is no verification of WHO/WHAT is actually teleporting the player. //We need an authorization system with player-owned zone servers. So that we can determine //who is requesting to transfer the session and then verify that a player is even on //that zone server. ProjectVersionStage.AssertBeta(); //We don't await so that we can get rolling on this VERY async multi-part process. //TODO: Handle failure ResponseModel <WorldTeleporterInstanceModel, SceneContentQueryResponseCode> teleporterInstanceResponse = await worldTelporterDataClient.GetBehaviourInstance(requestModel.WorldTeleporterId); //TODO: Handle failure ResponseModel <PlayerSpawnPointInstanceModel, SceneContentQueryResponseCode> pointInstanceResponse = await playerSpawnDataClient.GetSpawnPointInstance(teleporterInstanceResponse.Result.RemoteSpawnPointId); //Remove current location and update the new location. await characterLocationRepository.TryDeleteAsync(requestModel.CharacterGuid.EntityId); await characterLocationRepository.TryCreateAsync(new CharacterLocationModel(requestModel.CharacterGuid.EntityId, pointInstanceResponse.Result.InitialPosition.x, pointInstanceResponse.Result.InitialPosition.y, pointInstanceResponse.Result.InitialPosition.z, pointInstanceResponse.Result.WorldId)); //TODO: Better indicate reason for failure. return(Ok()); }
private async Task RefreshLocalDataAsync(IGameObjectBehaviourDataServiceClient <TBehaviourTransportType> client) { try { var responseModel = await client.GetBehaviourInstance(GetTarget().gameObject.GetComponent <GameObjectStaticSpawnPointDefinition>().GameObjectInstanceId); //TODO: Handle failure GetTarget().UpdateModel(responseModel.Result); } catch (Exception e) { Debug.LogError($"Failed to refresh local data. Reason: {e.Message}"); throw; } finally { ClearProgressBar(); } }
private void AuthenticatedOnGUI() { UnityAsyncHelper.InitializeSyncContext(); GatherConfigurableData(GetTarget()); if (GUILayout.Button($"Refresh Behaviour Data")) { IGameObjectBehaviourDataServiceClient <TBehaviourTransportType> client = BehaviourDataClientFactory.Create(EmptyFactoryContext.Instance); RefresheData(client); } if (GUILayout.Button("Save Updates")) { IGameObjectBehaviourDataServiceClient <TBehaviourTransportType> client = BehaviourDataClientFactory.Create(EmptyFactoryContext.Instance); UpdateData(client); } }
public RemoteGameObjectDataService( [NotNull] IEntityGuidMappable <GameObjectTemplateModel> gameObjectTemplateMappable, [NotNull] IEntityGuidMappable <GameObjectInstanceModel> gameObjectInstanceMappable, [NotNull] IGameObjectDataServiceClient dataServiceClient, [NotNull] WorldConfiguration worldConfiguration, [NotNull] ILog logger, [NotNull] IGameObjectBehaviourDataServiceClient <WorldTeleporterInstanceModel> teleporterDataServiceClient, [NotNull] IGameObjectBehaviourDataServiceClient <AvatarPedestalInstanceModel> avatarPedestalDataServiceClient) { _GameObjectTemplateMappable = gameObjectTemplateMappable ?? throw new ArgumentNullException(nameof(gameObjectTemplateMappable)); _GameObjectInstanceMappable = gameObjectInstanceMappable ?? throw new ArgumentNullException(nameof(gameObjectInstanceMappable)); DataServiceClient = dataServiceClient ?? throw new ArgumentNullException(nameof(dataServiceClient)); WorldConfiguration = worldConfiguration ?? throw new ArgumentNullException(nameof(worldConfiguration)); Logger = logger ?? throw new ArgumentNullException(nameof(logger)); TeleporterDataServiceClient = teleporterDataServiceClient ?? throw new ArgumentNullException(nameof(teleporterDataServiceClient)); AvatarPedestalDataServiceClient = avatarPedestalDataServiceClient; BehaviourInstanceDataMappable = new Dictionary <Type, IEntityGuidMappable <object> >(5); }
//[AuthorizeJwt(GuardianApplicationRole.ZoneServer)] //TODO: Eventually we'll need to auth these zoneservers. public async Task <IActionResult> UpdatePlayerAvatar([FromBody][NotNull] ZoneServerAvatarPedestalInteractionCharacterRequest requestModel, [FromServices][NotNull] IGameObjectBehaviourDataServiceClient <AvatarPedestalInstanceModel> avatarPedestalModel, [FromServices][NotNull] ICharacterAppearanceRepository characterAppearanceRepository) { if (avatarPedestalModel == null) { throw new ArgumentNullException(nameof(avatarPedestalModel)); } if (characterAppearanceRepository == null) { throw new ArgumentNullException(nameof(characterAppearanceRepository)); } //If this fails we have problems that can be mitigated. CharacterAppearanceModel appearanceModel = await characterAppearanceRepository.RetrieveAsync(requestModel.CharacterGuid.EntityId); try { var behaviourInstanceResponse = await avatarPedestalModel.GetBehaviourInstance(requestModel.AvatarPedestalId); if (behaviourInstanceResponse.isSuccessful) { //we can properly change. appearanceModel.AvatarModelId = behaviourInstanceResponse.Result.AvatarModelId; await characterAppearanceRepository.UpdateAsync(requestModel.CharacterGuid.EntityId, appearanceModel); //return BadRequest($"Cannot query data for Avatar Pedestal: {requestModel.AvatarPedestalId} Reason: {behaviourInstanceResponse.ResultCode.ToString()}"); } } catch (Exception e) { if (Logger.IsEnabled(LogLevel.Error)) { Logger.LogError($"Encountered exception: {e.Message} in {nameof(UpdatePlayerAvatar)}.\n\nStack: {e.StackTrace}"); } } //No matter what we should return the current. return(Json(new AvatarPedestalChangeResponse((int)appearanceModel.AvatarModelId))); }