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.ReadVector3(); // 6B angular = stream.ReadVector3(); // 6B } outLinearVelocity = linear / simulationRatio; outAngularVelocity = angular / simulationRatio; }
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 { Vector3 pos = stream.ReadVector3(); // 6 B if (deltaPosBase != null) { position = pos + deltaPosBase.Value; } else { position = pos; } } 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))) { MatrixD matrix = MatrixD.CreateFromQuaternion(orientation); if (matrix.IsValid()) { matrix.Translation = position; outPosition = matrix.Translation; outOrientation = orientation; outWorldMartix = matrix; return true; } return false; } } return false; }