public override void SerializePhysics(BitStream stream, MyNetworkClient sender, bool highOrientationCompression = false) { // Serialize base base.SerializePhysics(stream, sender); Vector3D pos = Entity.WorldMatrix.Translation; if (stream.Writing) { var g = MyCubeGridGroups.Static.Physical.GetGroup(Entity); stream.WriteByte((byte)(g.Nodes.Count - 1)); // Ignoring self foreach (var node in g.Nodes) { // Ignore self, already serialized if (node.NodeData != Entity) { var target = MyMultiplayer.Static.ReplicationLayer.GetProxyTarget((IMyEventProxy)node.NodeData); // ~26.5 bytes per grid, not bad NetworkId networkId = MyMultiplayer.Static.ReplicationLayer.GetNetworkIdByObject(target); PositionUpdateMsg msg = CreatePositionMsg(node.NodeData); stream.WriteNetworkId(networkId); // ~2 bytes HalfVector3 posDelta = (HalfVector3)(Vector3)(msg.Position - pos); stream.Serialize(ref posDelta); // 6 bytes stream.SerializeNorm(ref msg.Orientation); // 6.5 bytes stream.Serialize(ref msg.LinearVelocity); // 6 bytes stream.Serialize(ref msg.AngularVelocity); // 6 bytes } } } else { byte numRecords = stream.ReadByte(); for (int i = 0; i < numRecords; i++) { PositionUpdateMsg msg = default(PositionUpdateMsg); NetworkId networkId = stream.ReadNetworkId(); HalfVector3 posDelta = default(HalfVector3); stream.Serialize(ref posDelta); msg.Position = posDelta + pos; stream.SerializeNorm(ref msg.Orientation); stream.Serialize(ref msg.LinearVelocity); stream.Serialize(ref msg.AngularVelocity); MyCubeGrid grid = MyMultiplayer.Static.ReplicationLayer.GetObjectByNetworkId(networkId) as MyCubeGrid; if (grid != null) { grid.SyncObject.OnPositionUpdate(ref msg, sender); } } } }
/// <summary> /// Serializes sync entity physics, default implementation serializes position, orientation, linear and angular velocity. /// </summary> public virtual void SerializePhysics(BitStream stream, MyNetworkClient sender, bool highOrientationCompression = false) { PositionUpdateMsg msg = stream.Writing ? CreatePositionMsg(Entity) : default(PositionUpdateMsg); stream.Serialize(ref msg.Position); // 24B if (highOrientationCompression) stream.SerializeNormCompressed(ref msg.Orientation); // 29b else stream.SerializeNorm(ref msg.Orientation); // 52b stream.Serialize(ref msg.LinearVelocity); // 6B stream.Serialize(ref msg.AngularVelocity); // 6B if (stream.Reading) { OnPositionUpdate(ref msg, sender); } }