Ejemplo n.º 1
0
        /// <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);
            }
        }
Ejemplo n.º 2
0
        /// <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);
            }
        }