ignore remote update younger than recent bid

This commit is contained in:
Andrew Meadows 2017-06-14 16:04:52 -07:00
parent 15a5464bab
commit 8d19395b0a

View file

@ -386,7 +386,13 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef
return 0; return 0;
} }
qint64 clockSkew = args.sourceNode ? args.sourceNode->getClockSkewUsec() : 0; int64_t clockSkew = 0;
uint64_t maxPingRoundTrip = 33333; // two frames periods at 60 fps
if (args.sourceNode) {
clockSkew = args.sourceNode->getClockSkewUsec();
const float MSECS_PER_USEC = 1000;
maxPingRoundTrip += args.sourceNode->getPingMs() * MSECS_PER_USEC;
}
BufferParser parser(data, bytesLeftToRead); BufferParser parser(data, bytesLeftToRead);
@ -653,7 +659,6 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef
const QUuid& myNodeID = nodeList->getSessionUUID(); const QUuid& myNodeID = nodeList->getSessionUUID();
bool weOwnSimulation = _simulationOwner.matchesValidID(myNodeID); bool weOwnSimulation = _simulationOwner.matchesValidID(myNodeID);
// pack SimulationOwner and terse update properties near each other // pack SimulationOwner and terse update properties near each other
// NOTE: the server is authoritative for changes to simOwnerID so we always unpack ownership data // NOTE: the server is authoritative for changes to simOwnerID so we always unpack ownership data
// even when we would otherwise ignore the rest of the packet. // even when we would otherwise ignore the rest of the packet.
@ -678,7 +683,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef
if (newSimOwner.getID().isNull() && !_simulationOwner.pendingRelease(lastEditedFromBufferAdjusted)) { if (newSimOwner.getID().isNull() && !_simulationOwner.pendingRelease(lastEditedFromBufferAdjusted)) {
// entity-server is trying to clear our ownership (probably at our own request) // entity-server is trying to clear our ownership (probably at our own request)
// but we actually want to own it, therefore we ignore this clear event // but we actually want to own it, therefore we ignore this clear event
// and pretend that we own it (we assume we'll recover it soon) // and pretend that we own it (e.g. we assume we'll receive ownership soon)
// However, for now, when the server uses a newer time than what we sent, listen to what we're told. // However, for now, when the server uses a newer time than what we sent, listen to what we're told.
if (overwriteLocalData) { if (overwriteLocalData) {
@ -690,16 +695,19 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef
// recompute weOwnSimulation for later // recompute weOwnSimulation for later
weOwnSimulation = _simulationOwner.matchesValidID(myNodeID); weOwnSimulation = _simulationOwner.matchesValidID(myNodeID);
} }
} else if (newSimOwner.getID().isNull() && _simulationOwner.pendingTake(lastEditedFromBufferAdjusted)) { } else if (_simulationOwner.pendingTake(now - maxPingRoundTrip)) {
// entity-server is trying to clear someone else's ownership // we sent a bid before this packet could have been sent from the server
// but we want to own it, therefore we ignore this clear event // so we ignore it and pretend we own the object's simulation
// and pretend that we own it (we assume we'll get it soon)
weOwnSimulation = true; weOwnSimulation = true;
if (!_simulationOwner.isNull()) { if (newSimOwner.getID().isNull()) {
// someone else really did own it // entity-server is trying to clear someone else's ownership
markDirtyFlags(Simulation::DIRTY_SIMULATOR_ID); // but we want to own it, therefore we ignore this clear event
somethingChanged = true; if (!_simulationOwner.isNull()) {
_simulationOwner.clearCurrentOwner(); // someone else really did own it
markDirtyFlags(Simulation::DIRTY_SIMULATOR_ID);
somethingChanged = true;
_simulationOwner.clearCurrentOwner();
}
} }
} else if (newSimOwner.matchesValidID(myNodeID) && !_hasBidOnSimulation) { } else if (newSimOwner.matchesValidID(myNodeID) && !_hasBidOnSimulation) {
// entity-server tells us that we have simulation ownership while we never requested this for this EntityItem, // entity-server tells us that we have simulation ownership while we never requested this for this EntityItem,