diff --git a/direct/src/level/DistributedLevelAI.py b/direct/src/level/DistributedLevelAI.py index 7540e34233..899c489d57 100755 --- a/direct/src/level/DistributedLevelAI.py +++ b/direct/src/level/DistributedLevelAI.py @@ -18,7 +18,9 @@ class DistributedLevelAI(DistributedObjectAI.DistributedObjectAI, Level.Level.__init__(self) # this is one of the required fields self.zoneId = zoneId - self.modified = 0 + if __debug__: + self.modified = 0 + self.makeBackup = 1 def generate(self, levelSpec): self.notify.debug('generate') @@ -58,6 +60,12 @@ class DistributedLevelAI(DistributedObjectAI.DistributedObjectAI, Level.Level.initializeLevel(self, self.doId, levelSpec, scenarioIndex) + if __debug__: + # listen for requests to save the spec + editMgrEntId = self.entType2ids['editMgr'][0] + editMgr = self.getEntity(editMgrEntId) + self.accept(editMgr.getSpecSaveEvent(), self.saveSpec) + def createEntityCreator(self): """Create the object that will be used to create Entities. Inheritors, override if desired.""" @@ -98,7 +106,8 @@ class DistributedLevelAI(DistributedObjectAI.DistributedObjectAI, self.modified = 1 self.scheduleSave() - SavePeriod = simbase.config.GetFloat('factory-save-period', 10) + SavePeriod = simbase.config.GetInt('factory-save-period', 10) + BackupPeriod = simbase.config.GetInt('factory-backup-period-minutes',5) def scheduleSave(self): if hasattr(self, 'saveTask'): @@ -112,9 +121,18 @@ class DistributedLevelAI(DistributedObjectAI.DistributedObjectAI, DistributedLevelAI.notify.info('saving spec') if hasattr(self, 'saveTask'): del self.saveTask - if self.modified: - self.levelSpec.saveToDisk() - self.modified = 0 + if not self.modified: + DistributedLevelAI.notify.info('no changes to save') + return + self.levelSpec.saveToDisk(createBackup=self.makeBackup) + self.modified = 0 + self.makeBackup = 0 + def setMakeBackup(task, self=self): + self.makeBackup = 1 + self.backupTask = taskMgr.doMethodLater( + DistributedLevelAI.BackupPeriod * 60, + setMakeBackup, + self.uniqueName('setMakeBackup')) def requestCurrentLevelSpec(self, specHash, entTypeRegHash): senderId = self.air.msgSender diff --git a/direct/src/level/EditMgr.py b/direct/src/level/EditMgr.py index 05b31e814a..4c4e864fc7 100755 --- a/direct/src/level/EditMgr.py +++ b/direct/src/level/EditMgr.py @@ -20,3 +20,8 @@ class EditMgr(Entity.Entity): def setRemoveEntity(self, data): self.level.levelSpec.removeEntity(data['entId'], ) + + def getSpecSaveEvent(self): + return 'requestSave-%s' % self.level.levelId + def setRequestSave(self, data): + messenger.send(self.getSpecSaveEvent()) diff --git a/direct/src/level/EntityTypes.py b/direct/src/level/EntityTypes.py index 9d9ef06283..4cb11e9479 100755 --- a/direct/src/level/EntityTypes.py +++ b/direct/src/level/EntityTypes.py @@ -34,6 +34,7 @@ class LevelMgr(Entity): class EditMgr(Entity): type = 'editMgr' attribs = ( + ('requestSave', None), ('insertEntity', None), ('removeEntity', None), )