protected override void HandleMessage(EntityActorMessageContext messageContext, BehaviourGameObjectState <AvatarPedestalInstanceModel> state, InteractWithEntityActorMessage message) { if (Logger.IsDebugEnabled) { Logger.Debug($"Entity: {message.EntityInteracting} Interacted with Avatar Pedestal: {state.EntityGuid}"); } //Only players should be able to interact with this. if (message.EntityInteracting.EntityType != EntityType.Player) { return; } //Initially, we should make the assumption that they CAN change their avatr with this pedestal //so we will send the change packet BEFORE checking. messageContext.Sender.Tell(new ChangeEntityActorDisplayModelMessage(state.BehaviourData.AvatarModelId)); //Now we REALLY need to be sure. ZoneServerDataClient.UpdatePlayerAvatar(new ZoneServerAvatarPedestalInteractionCharacterRequest(message.EntityInteracting, state.BehaviourData.LinkedGameObjectId)) .ContinueWith((task, o) => { if (task.IsFaulted) { if (Logger.IsErrorEnabled) { Logger.Error($"TODO: Log"); //lazy } return; } //Now, we should verify the response. If the model id differ then it failed //or some race condition externally, the desired result is the player gets changed back. //To prevent exploits if (state.BehaviourData.AvatarModelId != task.Result.PersistedModelId) { messageContext.Sender.Tell(new ChangeEntityActorDisplayModelMessage(task.Result.PersistedModelId)); } }, TaskContinuationOptions.ExecuteSynchronously); }
protected override void HandleMessage(EntityActorMessageContext messageContext, BehaviourGameObjectState <WorldTeleporterInstanceModel> state, InteractWithEntityActorMessage message) { if (Logger.IsDebugEnabled) { Logger.Debug($"Entity: {message.EntityInteracting} Interacted with World Teleporter: {state.EntityGuid}"); } //Only players should be able to interact with this. if (message.EntityInteracting.EntityType != EntityType.Player) { return; } //Right now there is no validation, just teleport them. messageContext.Sender.Tell(new WorldTeleportPlayerEntityActorMessage(state.BehaviourData.RemoteSpawnPointId, state.BehaviourData.LinkedGameObjectId)); }