|
@@ -1003,6 +1003,11 @@ void RigidShape::setTransform(const MatrixF& newMat)
|
|
mContacts.clear();
|
|
mContacts.clear();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void RigidShape::forceClientTransform()
|
|
|
|
+{
|
|
|
|
+ setMaskBits(ForceMoveMask);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
@@ -1456,6 +1461,8 @@ U32 RigidShape::packUpdate(NetConnection *con, U32 mask, BitStream *stream)
|
|
|
|
|
|
if (stream->writeFlag(mask & PositionMask))
|
|
if (stream->writeFlag(mask & PositionMask))
|
|
{
|
|
{
|
|
|
|
+ stream->writeFlag(mask & ForceMoveMask);
|
|
|
|
+
|
|
stream->writeCompressedPoint(mRigid.linPosition);
|
|
stream->writeCompressedPoint(mRigid.linPosition);
|
|
mathWrite(*stream, mRigid.angPosition);
|
|
mathWrite(*stream, mRigid.angPosition);
|
|
mathWrite(*stream, mRigid.linMomentum);
|
|
mathWrite(*stream, mRigid.linMomentum);
|
|
@@ -1480,6 +1487,10 @@ void RigidShape::unpackUpdate(NetConnection *con, BitStream *stream)
|
|
|
|
|
|
if (stream->readFlag())
|
|
if (stream->readFlag())
|
|
{
|
|
{
|
|
|
|
+ // Check if we need to jump to the given transform
|
|
|
|
+ // rather than interpolate to it.
|
|
|
|
+ bool forceUpdate = stream->readFlag();
|
|
|
|
+
|
|
mPredictionCount = sMaxPredictionTicks;
|
|
mPredictionCount = sMaxPredictionTicks;
|
|
F32 speed = mRigid.linVelocity.len();
|
|
F32 speed = mRigid.linVelocity.len();
|
|
mDelta.warpRot[0] = mRigid.angPosition;
|
|
mDelta.warpRot[0] = mRigid.angPosition;
|
|
@@ -1492,7 +1503,7 @@ void RigidShape::unpackUpdate(NetConnection *con, BitStream *stream)
|
|
mRigid.atRest = stream->readFlag();
|
|
mRigid.atRest = stream->readFlag();
|
|
mRigid.updateVelocity();
|
|
mRigid.updateVelocity();
|
|
|
|
|
|
- if (isProperlyAdded())
|
|
|
|
|
|
+ if (!forceUpdate && isProperlyAdded())
|
|
{
|
|
{
|
|
// Determine number of ticks to warp based on the average
|
|
// Determine number of ticks to warp based on the average
|
|
// of the client and server velocities.
|
|
// of the client and server velocities.
|
|
@@ -1710,3 +1721,12 @@ DefineEngineMethod( RigidShape, freezeSim, void, (bool isFrozen),,
|
|
{
|
|
{
|
|
object->freezeSim(isFrozen);
|
|
object->freezeSim(isFrozen);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+DefineEngineMethod( RigidShape, forceClientTransform, void, (),,
|
|
|
|
+ "@brief Forces the client to jump to the RigidShape's transform rather then warp to it.\n\n")
|
|
|
|
+{
|
|
|
|
+ if(object->isServerObject())
|
|
|
|
+ {
|
|
|
|
+ object->forceClientTransform();
|
|
|
|
+ }
|
|
|
|
+}
|