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