def deleteChunksInBox(self, box): """ Deletes all chunks in a given box. :param box pymclevel.box.BoundingBox :return: None """ logger.info(u"Deleting {0} chunks in {1}".format( (box.maxcx - box.mincx) * (box.maxcz - box.mincz), ((box.mincx, box.mincz), (box.maxcx, box.maxcz)))) i = 0 ret = [] batch = leveldb_mcpe.WriteBatch() for cx, cz in itertools.product(xrange(box.mincx, box.maxcx), xrange(box.mincz, box.maxcz)): i += 1 if self.containsChunk(cx, cz): self.deleteChunk(cx, cz, batch=batch) ret.append((cx, cz)) assert not self.containsChunk( cx, cz), "Just deleted {0} but it didn't take".format((cx, cz)) if i % 100 == 0: logger.info(u"Chunk {0}...".format(i)) with self.worldFile.world_db() as db: wop = self.worldFile.writeOptions db.Write(wop, batch) del batch return ret
def saveInPlaceGen(self): """ Save all chunks to the database, and write the root_tag back to level.dat. """ if DEBUG_PE: print "*** saveInPlaceGen" open(dump_fName, 'a').write("*** saveInPlaceGen\n") self.saving = True batch = leveldb_mcpe.WriteBatch() dirtyChunkCount = 0 for c in self.chunksNeedingLighting: self.getChunk(*c).genFastLights() for chunk in self._loadedChunks.itervalues(): if chunk.dirty: dirtyChunkCount += 1 self.worldFile.saveChunk(chunk, batch=batch) chunk.dirty = False yield with nbt.littleEndianNBT(): for p in self.players: playerData = self.playerTagCache[p] if playerData is not None: playerData = playerData.save( compressed=False ) # It will get compressed in the DB itself self.worldFile.savePlayer(p, playerData, batch=batch) with self.worldFile.world_db() as db: wop = self.worldFile.writeOptions db.Write(wop, batch) self.saving = False logger.info( u"Saved {0} chunks to the database".format(dirtyChunkCount)) path = os.path.join(self.worldFile.path, 'level.dat') with nbt.littleEndianNBT(): rootTagData = self.root_tag.save(compressed=False) rootTagData = struct.Struct('<i').pack(4) + struct.Struct( '<i').pack(len(rootTagData)) + rootTagData with open(path, 'w') as f: f.write(rootTagData)