public override void SerializePhysics(BitStream stream, MyNetworkClient sender, bool highOrientationCompression = false) { // Usually 59 B // Base stuff (position, orientation, velocities) base.SerializePhysics(stream, sender, true); // 50.5 B if (MyFakes.CHARACTER_SERVER_SYNC) { // TODO: Serialize move and rotate when necesary } 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) stream.WriteQuaternionNormCompressedIdentity(Entity.GetAdditionalRotation(Entity.Definition.SpineBone)); // 1b / 30b stream.WriteQuaternionNormCompressedIdentity(Entity.GetAdditionalRotation(Entity.Definition.HeadBone)); // 1b / 30b stream.WriteQuaternionNormCompressedIdentity(Entity.GetAdditionalRotation(Entity.Definition.LeftForearmBone)); // 1b / 30b stream.WriteQuaternionNormCompressedIdentity(Entity.GetAdditionalRotation(Entity.Definition.LeftUpperarmBone)); // 1b / 30b // Movement state, 2B stream.WriteUInt16((ushort)Entity.GetCurrentMovementState()); // Flags, 6 bits stream.WriteBool(Entity.JetpackComp != null); if (Entity.JetpackComp != null) { stream.WriteBool(Entity.JetpackComp.TurnedOn); stream.WriteBool(Entity.JetpackComp.DampenersTurnedOn); } stream.WriteBool(Entity.LightEnabled); // TODO: Remove stream.WriteBool(Entity.ZoomMode == MyZoomModeEnum.IronSight); stream.WriteBool(Entity.RadioBroadcaster.WantsToBeEnabled); // TODO: Remove stream.WriteBool(Entity.TargetFromCamera); if (MyFakes.CHARACTER_SERVER_SYNC) { Vector3 temp = Entity.MoveIndicator; stream.WriteHalf(temp.X); stream.WriteHalf(temp.Y); stream.WriteHalf(temp.Z); Vector2 rotation = Entity.RotationIndicator; stream.WriteHalf(rotation.X); stream.WriteHalf(rotation.Y); stream.WriteHalf(Entity.Roll); } } else { // Head and spine stuff float headX = stream.ReadHalf(); float headY = stream.ReadHalf(); Quaternion spine = stream.ReadQuaternionNormCompressedIdentity(); Quaternion head = stream.ReadQuaternionNormCompressedIdentity(); Quaternion hand = stream.ReadQuaternionNormCompressedIdentity(); Quaternion upperArm = stream.ReadQuaternionNormCompressedIdentity(); var handler0 = HeadOrSpineChanged; if (handler0 != null) handler0(headX, headY, spine, head, hand, upperArm); // Movement state MyCharacterMovementEnum movementState = (MyCharacterMovementEnum)stream.ReadUInt16(); var handler = MovementStateChanged; if (handler != null && Entity.GetCurrentMovementState() != movementState) handler(movementState); // Flags bool hasJetpack = stream.ReadBool(); bool jetpack = false; bool dampeners = false; if (hasJetpack) { jetpack = stream.ReadBool(); dampeners = stream.ReadBool(); } bool lights = stream.ReadBool(); // TODO: Remove bool ironsight = stream.ReadBool(); bool broadcast = stream.ReadBool(); // TODO: Remove bool targetFromCamera = stream.ReadBool(); if (MyFakes.CHARACTER_SERVER_SYNC) { Vector3 temp = Vector3.Zero; temp.X = stream.ReadHalf(); temp.Y = stream.ReadHalf(); temp.Z = stream.ReadHalf(); Entity.MoveIndicator = temp; Vector2 rotation = Vector2.Zero; rotation.X = stream.ReadHalf(); rotation.Y = stream.ReadHalf(); Entity.RotationIndicator = rotation; Entity.Roll = stream.ReadHalf(); } var handler2 = FlagsChanged; if (handler2 != null) handler2(jetpack, dampeners, lights, ironsight, broadcast, targetFromCamera); } }
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; }