예제 #1
0
        static MyCharacterNetState ReadCharacterState(BitStream stream, out Vector3 move)
        {
            MyCharacterNetState charNetState = new MyCharacterNetState();

            charNetState.WorldRealSpeed = stream.ReadHalf();
            // Head and spine stuff
            charNetState.HeadX = stream.ReadHalf();
            if (charNetState.HeadX.IsValid() == false)
            {
                charNetState.HeadX = 0.0f;
            }
            charNetState.HeadY = stream.ReadHalf();
            charNetState.Spine = stream.ReadQuaternionNormCompressedIdentity();
            charNetState.Head  = stream.ReadQuaternionNormCompressedIdentity();
            // Movement state
            charNetState.MovementState = (MyCharacterMovementEnum)stream.ReadUInt16();
            // Movement flag
            charNetState.MovementFlag = (MyCharacterMovementFlags)stream.ReadUInt16();
            //Flags
            charNetState.Jetpack          = stream.ReadBool();
            charNetState.Dampeners        = stream.ReadBool();
            charNetState.Lights           = stream.ReadBool(); // TODO: Remove
            charNetState.Ironsight        = stream.ReadBool();
            charNetState.Broadcast        = stream.ReadBool(); // TODO: Remove
            charNetState.TargetFromCamera = stream.ReadBool();

            move = stream.ReadNormalizedSignedVector3(8);

            return(charNetState);
        }
        public override bool Serialize(BitStream stream, EndpointId forClient, uint timeStamp, byte packetId, int maxBitPosition)
        {
            base.Serialize(stream, forClient, timeStamp, packetId, maxBitPosition);

            if (stream.Writing)
            {
                // Head and spine stuff, 36 - 152b (4.5B - 19 B)
                stream.WriteHalf(Entity.HeadLocalXAngle); // 2B
                stream.WriteHalf(Entity.HeadLocalYAngle); // 2B

                // TODO: Spine has only one angle (bending forward backward)
                // Getting EULER angles from Matrix seems good way to get it (z-component)
                stream.WriteQuaternionNormCompressedIdentity(Entity.GetAdditionalRotation(Entity.Definition.SpineBone)); // 1b / 30b
                stream.WriteQuaternionNormCompressedIdentity(Entity.GetAdditionalRotation(Entity.Definition.HeadBone));  // 1b / 30b

                // Movement state, 2B
                stream.WriteUInt16((ushort)Entity.GetCurrentMovementState());
                // Movement flag.
                stream.WriteUInt16((ushort)Entity.MovementFlags);

                // Flags, 6 bits
                bool hasJetpack = Entity.JetpackComp != null;
                stream.WriteBool(hasJetpack ? Entity.JetpackComp.TurnedOn : false);
                stream.WriteBool(hasJetpack ? Entity.JetpackComp.DampenersTurnedOn : false);
                stream.WriteBool(Entity.LightEnabled);                      // TODO: Remove
                stream.WriteBool(Entity.ZoomMode == MyZoomModeEnum.IronSight);
                stream.WriteBool(Entity.RadioBroadcaster.WantsToBeEnabled); // TODO: Remove
                stream.WriteBool(Entity.TargetFromCamera);

                stream.WriteNormalizedSignedVector3(Entity.MoveIndicator, 8);

                float speed = Entity.Physics.CharacterProxy != null ? Entity.Physics.CharacterProxy.Speed : 0.0f;
                stream.WriteFloat(speed);

                stream.WriteFloat(Entity.RotationIndicator.X);
                stream.WriteFloat(Entity.RotationIndicator.Y);
                stream.WriteFloat(Entity.RollIndicator);
            }
            else
            {
                Vector3             move;
                MyCharacterNetState charNetState = ReadCharacterState(stream);

                if (!IsControlledLocally && !Entity.Closed)
                {
                    Entity.SetStateFromNetwork(ref charNetState);
                }
            }

            m_previousRotationSpeed = Entity.RotationSpeed;
            return(true);
        }
        public void SetStateFromNetwork(ref MyCharacterNetState newStateFromNet)
        {
            if (IsDead)
                return;

            SetHeadLocalXAngle(newStateFromNet.HeadX);
            SetHeadLocalYAngle(newStateFromNet.HeadY);
            m_isFalling = false;

            if (!UseNewAnimationSystem)
            {
                SetSpineAdditionalRotation(newStateFromNet.Spine, newStateFromNet.Spine, false);
            }


            SetHeadAdditionalRotation(newStateFromNet.Head, false);

            m_isFalling = false;
            var jetpack = JetpackComp;
            if (jetpack != null)
            {
                if (newStateFromNet.Jetpack != JetpackComp.TurnedOn)
                {
                    jetpack.TurnOnJetpack(newStateFromNet.Jetpack, true);
                }
                if (newStateFromNet.Dampeners != JetpackComp.DampenersTurnedOn)
                {
                    jetpack.EnableDampeners(newStateFromNet.Dampeners, false);
                }
            }
            if (newStateFromNet.Lights != LightEnabled)
            {
                EnableLights(newStateFromNet.Lights);
            }
            if (newStateFromNet.Ironsight != (m_zoomMode == MyZoomModeEnum.IronSight))
            {
                EnableIronsight(newStateFromNet.Ironsight, true, false);
            }
            if (RadioBroadcaster != null && newStateFromNet.Broadcast != RadioBroadcaster.Enabled)
            {
                EnableBroadcasting(newStateFromNet.Broadcast);
            }
            TargetFromCamera = newStateFromNet.TargetFromCamera;

            // do it fast, dont wait for update, no time.
            UpdateMovementAndFlags(newStateFromNet.MovementState, newStateFromNet.MovementFlag);

            if (newStateFromNet.MovementState == MyCharacterMovementEnum.Jump)
            {
                // Simulate one frame for jump action to be triggered
                Jump();
                MoveAndRotateInternal(MoveIndicator, RotationIndicator, RollIndicator, Vector3.Zero);
            }

            if (Physics.CharacterProxy != null)
            {
                Physics.CharacterProxy.Speed = newStateFromNet.Speed;
            }

            if (IsUsing == null)
            {
                CacheMove(ref newStateFromNet.Movement, ref newStateFromNet.Rotation, ref newStateFromNet.Roll);
            }
        }
예제 #4
0
        public void SetStateFromNetwork(ref MyCharacterNetState newStateFromNet)
        {
            if (IsDead)
                return;

            m_worldRealVelocity = newStateFromNet.WorldRealSpeed;
            SetHeadLocalXAngle(newStateFromNet.HeadX);
            SetHeadLocalYAngle(newStateFromNet.HeadY);


            if (!UseNewAnimationSystem)
            {
                SetSpineAdditionalRotation(newStateFromNet.Spine, newStateFromNet.Spine, false);
            }


            SetHeadAdditionalRotation(newStateFromNet.Head, false);

            var jetpack = JetpackComp;
            if (jetpack != null)
            {
                if (newStateFromNet.Jetpack != JetpackComp.TurnedOn)
                {
                    jetpack.TurnOnJetpack(newStateFromNet.Jetpack, true);
                }
                if (newStateFromNet.Dampeners != JetpackComp.DampenersTurnedOn)
                {
                    jetpack.EnableDampeners(newStateFromNet.Dampeners, false);
                }
            }
            if (newStateFromNet.Lights != LightEnabled)
            {
                EnableLights(newStateFromNet.Lights);
            }
            if (newStateFromNet.Ironsight != (m_zoomMode == MyZoomModeEnum.IronSight))
            {
                EnableIronsight(newStateFromNet.Ironsight, true, false);
            }
            if (RadioBroadcaster != null && newStateFromNet.Broadcast != RadioBroadcaster.Enabled)
            {
                EnableBroadcasting(newStateFromNet.Broadcast);
            }
            TargetFromCamera = newStateFromNet.TargetFromCamera;

            if (MyFakes.CHARACTER_SERVER_SYNC)
            {
                RotationIndicator = newStateFromNet.Rotation;
                RollIndicator = newStateFromNet.Roll;
            }

            // do it fast, dont wait for update, no time.
            UpdateMovementAndFlags(newStateFromNet.MovementState, newStateFromNet.MovementFlag);

            if (newStateFromNet.MovementState == MyCharacterMovementEnum.Jump)
            {
                // Simulate one frame for jump action to be triggered
                this.Jump();
                this.MoveAndRotateInternal(MoveIndicator, RotationIndicator, RollIndicator, Vector3.Zero);
            }
        }
        static MyCharacterNetState ReadCharacterState(BitStream stream, out Vector3 move)
        {
            MyCharacterNetState charNetState = new MyCharacterNetState();

            charNetState.WorldRealSpeed = stream.ReadHalf();
            // Head and spine stuff
            charNetState.HeadX = stream.ReadHalf();
            if (charNetState.HeadX.IsValid() == false)
            {
                charNetState.HeadX = 0.0f;
            }
            charNetState.HeadY = stream.ReadHalf();
            charNetState.Spine = stream.ReadQuaternionNormCompressedIdentity();
            charNetState.Head = stream.ReadQuaternionNormCompressedIdentity();
            // Movement state
            charNetState.MovementState = (MyCharacterMovementEnum)stream.ReadUInt16();
            // Movement flag
            charNetState.MovementFlag = (MyCharacterMovementFlags)stream.ReadUInt16();
            //Flags
            charNetState.Jetpack = stream.ReadBool();
            charNetState.Dampeners = stream.ReadBool();
            charNetState.Lights = stream.ReadBool(); // TODO: Remove
            charNetState.Ironsight = stream.ReadBool();
            charNetState.Broadcast = stream.ReadBool(); // TODO: Remove
            charNetState.TargetFromCamera = stream.ReadBool();

            move = stream.ReadNormalizedSignedVector3(8);

            return charNetState;
        }
        public override void Serialize(BitStream stream, MyClientStateBase forClient, byte packetId, int maxBitPosition)
        {
            base.Serialize(stream, forClient, packetId, maxBitPosition);

            if (stream.Writing)
            {
                stream.WriteHalf(Entity.Physics.LinearVelocity.Length());
                // Head and spine stuff, 36 - 152b (4.5B - 19 B)
                stream.WriteHalf(Entity.HeadLocalXAngle); // 2B
                stream.WriteHalf(Entity.HeadLocalYAngle); // 2B

                // TODO: Spine has only one angle (bending forward backward)
                // Getting EULER angles from Matrix seems good way to get it (z-component)
                stream.WriteQuaternionNormCompressedIdentity(Entity.GetAdditionalRotation(Entity.Definition.SpineBone)); // 1b / 30b
                stream.WriteQuaternionNormCompressedIdentity(Entity.GetAdditionalRotation(Entity.Definition.HeadBone));  // 1b / 30b

                // Movement state, 2B
                stream.WriteUInt16((ushort)Entity.GetCurrentMovementState());
                // Movement flag.
                stream.WriteUInt16((ushort)Entity.MovementFlags);

                // Flags, 6 bits
                bool hasJetpack = Entity.JetpackComp != null;
                stream.WriteBool(hasJetpack ? Entity.JetpackComp.TurnedOn : false);
                stream.WriteBool(hasJetpack ? Entity.JetpackComp.DampenersTurnedOn : false);
                stream.WriteBool(Entity.LightEnabled);                      // TODO: Remove
                stream.WriteBool(Entity.ZoomMode == MyZoomModeEnum.IronSight);
                stream.WriteBool(Entity.RadioBroadcaster.WantsToBeEnabled); // TODO: Remove
                stream.WriteBool(Entity.TargetFromCamera);

                stream.WriteNormalizedSignedVector3(Entity.MoveIndicator, 8);

                if (MyFakes.CHARACTER_SERVER_SYNC)
                {
                    Vector2 rotation = Entity.RotationIndicator;
                    stream.WriteHalf(rotation.X);
                    stream.WriteHalf(rotation.Y);

                    stream.WriteHalf(Entity.RollIndicator);
                }
            }
            else
            {
                Vector3             move;
                MyCharacterNetState charNetState = ReadCharacterState(stream, out move);


                if (MyFakes.CHARACTER_SERVER_SYNC)
                {
                    charNetState.Rotation.X = stream.ReadHalf();
                    charNetState.Rotation.Y = stream.ReadHalf();
                    charNetState.Roll       = stream.ReadHalf();
                }

                if (!IsControlledLocally && !Entity.Closed)
                {
                    Entity.SetStateFromNetwork(ref charNetState);
                    Entity.MoveIndicator = move;
                }
            }
        }