def getWorldInfo(filename): worldAdapter = findAdapter(filename, readonly=True) try: displayNameLimit = 40 name = displayName(worldAdapter.filename) if len(name) > displayNameLimit: name = name[:displayNameLimit] + "..." if usefulFilename(worldAdapter) != displayName(worldAdapter.filename): name = "%s (%s)" % (name, usefulFilename(worldAdapter)) lastPlayed = lastPlayedTime(worldAdapter) lastPlayedText = lastPlayed.humanize() if lastPlayed else "Unknown" version = "Unknown Version" try: stackVersion = worldAdapter.blocktypes.itemStackVersion if stackVersion == VERSION_1_7: version = "Minecraft 1.7" if "FML" in worldAdapter.metadata.metadataTag: version = "MinecraftForge 1.7" if stackVersion == VERSION_1_8: version = "Minecraft 1.8" except Exception as e: log.warn("Failed to get version info for %s: %r", filename, e) return name, lastPlayedText, version except Exception as e: log.error("Failed getting world info for %s: %r", filename, e) return str(e), "", ""
def __init__(self, filename=None, create=False, readonly=False, adapterClass=None, adapter=None, resume=None): """ Load a Minecraft level of any format from the given filename. If you try to create an existing world, IOError will be raised. :type filename: str or unknown or unicode :type create: bool :type readonly: bool :type adapter: unknown or mceditlib.anvil.adapter.AnvilWorldAdapter or mceditlib.schematic.SchematicFileAdapter :type adapterClass: class :type resume: None or bool :return: :rtype: WorldEditor """ self.playerCache = {} assert not (create and readonly) assert not create or adapterClass, "create=True requires an adapterClass" if adapter: self.adapter = adapter elif adapterClass: self.adapter = adapterClass(filename, create, readonly, resume=resume) else: self.adapter = findAdapter(filename, readonly, resume=resume) self.filename = filename self.readonly = readonly # maps (cx, cz, dimName) tuples to WorldEditorChunk self._loadedChunks = weakref.WeakValueDictionary() # caches ChunkData from adapter self._chunkDataCache = cachefunc.lru_cache_object( self._getChunkDataRaw, 1000) self._chunkDataCache.should_decache = self._shouldUnloadChunkData self._chunkDataCache.will_decache = self._willUnloadChunkData # caches recently used WorldEditorChunks self.recentChunks = collections.deque(maxlen=100) self._allChunks = None self.recentDirtyChunks = collections.defaultdict(set) self.recentDirtyFiles = set() self.recentDirtySections = collections.defaultdict(set) self.dimensions = {} self.currentRevision = 0
def reloadList(self): self.selectedWorldIndex = -1 self.itemWidgets = [] try: if not os.path.isdir(self.saveFileDir): raise IOError( u"Could not find the Minecraft saves directory!\n\n({0} was not found or is not a directory)" .format(self.saveFileDir)) log.info("Scanning %s for worlds...", self.saveFileDir) potentialWorlds = os.listdir(self.saveFileDir) potentialWorlds = [ os.path.join(self.saveFileDir, p) for p in potentialWorlds ] worldFiles = [ p for p in potentialWorlds if isLevel(AnvilWorldAdapter, p) ] worldAdapters = [] for f in worldFiles: try: adapter = findAdapter(f, readonly=True) except Exception as e: log.exception("Could not find adapter for %s: %r", f, e) continue else: worldAdapters.append(adapter) if len(worldAdapters) == 0: raise IOError( "No worlds found! You should probably play Minecraft to create your first world." ) column = QtGui.QVBoxLayout() column.setContentsMargins(0, 0, 0, 0) column.setSpacing(0) worldGroup = QtGui.QButtonGroup(self) #worldGroup.setExclusive(True) for adapter in worldAdapters: item = WorldListItemWidget(adapter) self.itemWidgets.append(item) self.itemWidgets.sort(key=lambda i: i.lastPlayed, reverse=True) for i, item in enumerate(self.itemWidgets): worldGroup.addButton(item, i) column.addWidget(item) item.doubleClicked.connect(self.worldListItemDoubleClicked) worldGroup.buttonClicked[int].connect(self.worldListItemClicked) self.scrollAreaWidgetContents.setLayout(column) except EnvironmentError as e: setWidgetError(self, e)
def __init__(self, filename=None, create=False, readonly=False, adapterClass=None, adapter=None, resume=None): """ Load a Minecraft level of any format from the given filename. If you try to create an existing world, IOError will be raised. :type filename: str or unknown or unicode :type create: bool :type readonly: bool :type adapter: unknown or mceditlib.anvil.adapter.AnvilWorldAdapter or mceditlib.schematic.SchematicFileAdapter :type adapterClass: class :type resume: None or bool :return: :rtype: WorldEditor """ self.playerCache = {} assert not (create and readonly) assert not create or adapterClass, "create=True requires an adapterClass" if adapter: self.adapter = adapter elif adapterClass: self.adapter = adapterClass(filename, create, readonly, resume=resume) else: self.adapter = findAdapter(filename, readonly, resume=resume) self.filename = filename self.readonly = readonly # maps (cx, cz, dimName) tuples to WorldEditorChunk self._loadedChunks = weakref.WeakValueDictionary() # caches ChunkData from adapter self._chunkDataCache = cachefunc.lru_cache_object(self._getChunkDataRaw, 1000) self._chunkDataCache.should_decache = self._shouldUnloadChunkData self._chunkDataCache.will_decache = self._willUnloadChunkData # caches recently used WorldEditorChunks self.recentChunks = collections.deque(maxlen=100) self._allChunks = None self.recentDirtyChunks = collections.defaultdict(set) self.recentDirtyFiles = set() self.recentDirtySections = collections.defaultdict(set) self.dimensions = {} self.currentRevision = 0
def getWorldInfo(filename): worldAdapter = findAdapter(filename, readonly=True) try: displayNameLimit = 40 name = displayName(worldAdapter.filename) if len(name) > displayNameLimit: name = name[:displayNameLimit] + "..." if usefulFilename(worldAdapter) != displayName(worldAdapter.filename): name = "%s (%s)" % (name, usefulFilename(worldAdapter)) lastPlayed = lastPlayedTime(worldAdapter) lastPlayedText = lastPlayed.humanize() if lastPlayed else "Unknown" return name, lastPlayedText except EnvironmentError as e: log.error("Failed getting world info for %s: %s", filename, e) return str(e), ""
def getWorldInfo(cls, filename): worldInfo = findAdapter(filename, readonly=True, getInfo=True) return worldInfo