mirror of
https://github.com/lubosz/overte.git
synced 2025-08-07 17:41:12 +02:00
ignore remote update younger than recent bid
This commit is contained in:
parent
15a5464bab
commit
8d19395b0a
1 changed files with 20 additions and 12 deletions
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue