def __init__(self, folder): """ Load a world from disk. :Parameters: folder : str The directory containing the world. """ self.folder = FilePath(folder) if not self.folder.exists(): self.folder.makedirs() self.chunk_cache = weakref.WeakValueDictionary() self.dirty_chunk_cache = dict() self._pending_chunks = dict() self.spawn = (0, 0, 0) self.seed = random.randint(0, sys.maxint) level = self.folder.child("level%s" % extension()) if level.exists() and level.getsize(): self.load_from_tag(read_from_file(level.open("r"))) write_to_file(self.save_to_tag(), level.open("w")) self.chunk_management_loop = LoopingCall(self.sort_chunks) self.chunk_management_loop.start(1)
def save_player(self, username, player): f = self.folder.child("players") if not f.exists(): f.makedirs() f = f.child("%s%s" % (username, extension())) write_to_file(player.save_to_tag(), f.open("w"))
def names_for_chunk(x, z): """ Calculate the folder and file names for given chunk coordinates. """ first = base36(x & 63) second = base36(z & 63) third = "c.%s.%s%s" % (base36(x), base36(z), extension()) return first, second, third
def load_player(self, username): """ Retrieve player data. """ player = self.factory.create_entity(self.spawn[0], self.spawn[1], self.spawn[2], "Player", username=username) player.location.stance = self.spawn[1] player.username = username f = self.folder.child("players") if not f.exists(): f.makedirs() f = f.child("%s%s" % (username, extension())) if f.exists() and f.getsize(): player.load_from_tag(read_from_file(f.open("r"))) return player