diff --git a/direct/src/distributed/ClientRepository.py b/direct/src/distributed/ClientRepository.py index 10c61cd1c7..0547fa844d 100644 --- a/direct/src/distributed/ClientRepository.py +++ b/direct/src/distributed/ClientRepository.py @@ -236,10 +236,9 @@ class ClientRepository(DirectObject.DirectObject): del(self.doId2cdc[doId]) # Sanity check the dictionaries assert(len(self.doId2do) == len(self.doId2cdc)) - # Disable the object itself - obj.disableAndAnnounce() - # Delete the object itself - obj.delete() + # Disable, announce, and delete the object itself... + # unless delayDelete is on... + obj.deleteOrDelay() # If it is in the cache, remove it. elif self.cache.contains(doId): self.cache.delete(doId) diff --git a/direct/src/distributed/DistributedObject.py b/direct/src/distributed/DistributedObject.py index 52413304e7..b2cc1774aa 100644 --- a/direct/src/distributed/DistributedObject.py +++ b/direct/src/distributed/DistributedObject.py @@ -14,6 +14,13 @@ class DistributedObject(PandaObject): # that lives in the UberZone. This keeps them from being disabled when you change # zones, even to the quiet zone. self.setNeverDisable(0) + + # This flag tells whether the object can be deleted right away, + # or not. + self.delayDeleteFlag = 0 + # This flag tells whether a delete has been requested on this + # object. + self.deleteImminent = 0 return None def setNeverDisable(self, bool): @@ -24,6 +31,35 @@ class DistributedObject(PandaObject): def getNeverDisable(self): return self.neverDisable + def deleteOrDelay(self): + if self.delayDeleteFlag: + self.deleteImminent = 1 + else: + self.disableAnnounceAndDelete() + return None + + def delayDelete(self, flag): + if self.delayDeleteFlag: + if flag: + self.notify.warning("Object: " + str(self.getDoId()) + + " is already in delayDelete mode") + else: + self.delayDeleteFlag = 0 + if self.deleteImminent: + self.disableAnnounceAndDelete() + else: + if flag: + self.delayDeleteFlag = 1 + else: + self.notify.warning("Object: " + str(self.getDoId()) + + " is not in delayDelete mode") + return None + + def disableAnnounceAndDelete(self): + self.disableAndAnnounce() + self.delete() + return None + def disableAndAnnounce(self): """disableAndAnnounce(self) Inheritors should *not* redefine this function.