/// <summary> /// Handles a message sent to this component. /// </summary> /// <param name="message">Message to be handled</param> /// <returns>True, if handled, otherwise false</returns> /// <exception cref="ArgumentException">Thrown if a <see cref="MessageType"/> is not handled properly."/></exception> public override bool ExecuteMessage(IMessage message) { switch (message.Type) { case MessageType.GetCharacterMovementInfo: { MsgGetCharacterMovement msgGetMovement = message as MsgGetCharacterMovement; message.TypeCheck(msgGetMovement); msgGetMovement.ForwardAmount = this.forwardMovement; msgGetMovement.RightAmount = this.rightMovement; msgGetMovement.ClockwiseAmount = this.clockwiseRotation; msgGetMovement.WantsJump = this.wantsJump; } return(true); case MessageType.SetIsControlled: { MsgSetIsControlled msgSetControlled = message as MsgSetIsControlled; message.TypeCheck(msgSetControlled); // We only enable controls when the character is being controlled, this prevents things like // jumping and moving while something else is being controlled. if (msgSetControlled.Controlled) { ActivateComponent(); } else { DeactivateComponent(); } } return(true); default: return(false); } }
/// <summary> /// Message handler for messages meant only for the scene manager. /// </summary> /// <param name="message">Incoming message</param> /// <exception cref="ArgumentException">Thrown if a <see cref="MessageType"/> is not handled properly."/></exception> public bool ExecuteMessage(IMessage message) { switch (message.Type) { case MessageType.RemoveEntity: { MsgRemoveEntity remEntityMsg = message as MsgRemoveEntity; message.TypeCheck(remEntityMsg); if (remEntityMsg.EntityID != QSGame.UniqueIDEmpty) { BaseEntity entity; if (this.entities.TryGetValue(remEntityMsg.EntityID, out entity)) { ShutdownEntity(entity); } } } return(true); case MessageType.GetEntityIDList: { MsgGetEntityIDList msgGetEntityIDs = message as MsgGetEntityIDList; message.TypeCheck(msgGetEntityIDs); msgGetEntityIDs.EntityIDList = new Int64[this.entities.Count]; this.entities.Keys.CopyTo(msgGetEntityIDs.EntityIDList, 0); } return(true); case MessageType.SetControlledEntity: { MsgSetControlledEntity msgSetControlled = message as MsgSetControlledEntity; message.TypeCheck(msgSetControlled); Int64 oldControlledEntity = this.controlledEntity; this.controlledEntity = msgSetControlled.ControlledEntityID; // Was there a change if (oldControlledEntity != this.controlledEntity) { if (oldControlledEntity != QSGame.UniqueIDEmpty) { MsgRemoveChild msgRemoveChild = ObjectPool.Aquire <MsgRemoveChild>(); msgRemoveChild.Child = this.sceneMgrRootEntity; msgRemoveChild.UniqueTarget = oldControlledEntity; this.Game.SendMessage(msgRemoveChild); MsgSetIsControlled msgControlled = ObjectPool.Aquire <MsgSetIsControlled>(); msgControlled.Controlled = false; msgControlled.UniqueTarget = oldControlledEntity; this.Game.SendMessage(msgControlled); } // If the new ID is empty, there is no more controlled entity if (this.controlledEntity == QSGame.UniqueIDEmpty) { CreateAndStartFreeMovingCamera(); } else { MsgSetIsControlled msgControlled = ObjectPool.Aquire <MsgSetIsControlled>(); msgControlled.Controlled = true; msgControlled.UniqueTarget = this.controlledEntity; this.Game.SendMessage(msgControlled); BaseEntity controlledEntity; if (entities.TryGetValue(this.controlledEntity, out controlledEntity)) { CreateAndStartArcBallCamera(); } } } } return(true); case MessageType.GetControlledEntity: { MsgGetControlledEntity msgGetControlled = message as MsgGetControlledEntity; message.TypeCheck(msgGetControlled); msgGetControlled.ControlledEntityID = this.controlledEntity; } return(true); case MessageType.GetEntityByID: { MsgGetEntityByID msgGetEntity = message as MsgGetEntityByID; message.TypeCheck(msgGetEntity); BaseEntity entity; if (this.entities.TryGetValue(msgGetEntity.EntityID, out entity)) { msgGetEntity.Entity = entity; } } return(true); case MessageType.GetFogSettings: { if (this.activeScene != null) { MsgGetFogSettings msgGetFog = message as MsgGetFogSettings; message.TypeCheck(msgGetFog); msgGetFog.Settings = this.activeScene.FogSettings; } } return(true); default: return(false); } }