void ObjectActionOffset::deserialize(QByteArray serializedArguments) { QDataStream dataStream(serializedArguments); EntityActionType type; dataStream >> type; assert(type == getType()); QUuid id; dataStream >> id; assert(id == getID()); uint16_t serializationVersion; dataStream >> serializationVersion; if (serializationVersion != ObjectActionOffset::offsetVersion) { return; } withWriteLock([&] { dataStream >> _pointToOffsetFrom; dataStream >> _linearDistance; dataStream >> _linearTimeScale; dataStream >> _positionalTargetSet; dataStream >> _expires; _expires -= getEntityServerClockSkew(); dataStream >> _tag; _active = true; });
quint64 ObjectDynamic::serverTimeToLocalTime(quint64 timeValue) const { // 0 indicates no expiration if (timeValue == 0) { return 0; } qint64 serverClockSkew = getEntityServerClockSkew(); if (serverClockSkew > 0 && timeValue <= (quint64)serverClockSkew) { return 1; // non-zero but long-expired value to avoid negative roll-over } return timeValue - serverClockSkew; }
quint64 ObjectAction::localTimeToServerTime(quint64 timeValue) const { // 0 indicates no expiration if (timeValue == 0) { return 0; } int serverClockSkew = getEntityServerClockSkew(); if (serverClockSkew < 0 && timeValue <= (quint64)(-serverClockSkew)) { return 1; // non-zero but long-expired value to avoid negative roll-over } return timeValue + serverClockSkew; }
QByteArray ObjectActionOffset::serialize() const { QByteArray ba; QDataStream dataStream(&ba, QIODevice::WriteOnly); dataStream << ACTION_TYPE_OFFSET; dataStream << getID(); dataStream << ObjectActionOffset::offsetVersion; withReadLock([&] { dataStream << _pointToOffsetFrom; dataStream << _linearDistance; dataStream << _linearTimeScale; dataStream << _positionalTargetSet; dataStream << _expires + getEntityServerClockSkew(); dataStream << _tag; }); return ba; }