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); } }
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; } } }