static void ReadVelocities(BitStream stream, MyEntity entity, float simulationRatio,bool movingOnServer, ref Vector3 outLinearVelocity, ref Vector3 outAngularVelocity) { Vector3 linear = Vector3.Zero; Vector3 angular = Vector3.Zero; if (movingOnServer) { linear = stream.ReadHalfVector3(); // 6B angular = stream.ReadHalfVector3(); // 6B } outLinearVelocity = linear / simulationRatio; outAngularVelocity = angular / simulationRatio; }
static bool ReadTransform(BitStream stream, MyEntity entity, Vector3D? deltaPosBase, bool applyWhenReading, bool movingOnServer, ref Vector3D outPosition, ref Quaternion outOrientation, ref MatrixD outWorldMartix, Func<MyEntity, Vector3D, bool> posValidation = null, MovedDelegate moveHandler = null) { Vector3D position; if (stream.ReadBool()) { position = stream.ReadVector3D(); // 24 B } else { HalfVector3 pos = stream.ReadHalfVector3(); // 6 B if (deltaPosBase != null) position = pos + deltaPosBase.Value; else position = pos.ToVector3(); } Quaternion orientation; bool lowPrecisionOrientation = stream.ReadBool(); if (lowPrecisionOrientation) { orientation = stream.ReadQuaternionNormCompressed(); // 29b } else { orientation = stream.ReadQuaternionNorm(); // 52b } if (entity != null) { movingOnServer |= (entity.PositionComp.GetPosition() - position).LengthSquared() > epsilonSq; } if (movingOnServer && applyWhenReading && (posValidation == null || posValidation(entity, position))) { var old = entity.PositionComp.WorldMatrix; MatrixD matrix = MatrixD.CreateFromQuaternion(orientation); if (matrix.IsValid()) { matrix.Translation = Vector3D.Round(position, NUM_DECIMAL_PRECISION + 1); outPosition = matrix.Translation; outOrientation = orientation; outWorldMartix = matrix; return true; } return false; } return false; }