From 83f2d1ca466e49f0499d33b6c3915605ee44062c Mon Sep 17 00:00:00 2001 From: David Vierra Date: Wed, 18 Nov 2015 02:50:19 -1000 Subject: [PATCH] The ResourceLoader created when loading a world now tries to find a "mods" folder alongside the "saves" folder. --- src/mcedit2/resourceloader.py | 21 +++++++++++++++++++++ src/mcedit2/util/minecraftinstall.py | 27 ++++++++++++++++----------- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/src/mcedit2/resourceloader.py b/src/mcedit2/resourceloader.py index f8e1d27..cb38a54 100644 --- a/src/mcedit2/resourceloader.py +++ b/src/mcedit2/resourceloader.py @@ -3,6 +3,7 @@ """ from __future__ import absolute_import, division, print_function, unicode_literals import logging +import os import zipfile import re @@ -15,6 +16,7 @@ class ResourceLoader(object): def __init__(self): super(ResourceLoader, self).__init__() self.zipFiles = [] + self.modsDirs = [] def addZipFile(self, zipPath): try: @@ -23,6 +25,25 @@ class ResourceLoader(object): raise IOError("Could not read %s as a zip file." % zipPath) self.zipFiles.append(zf) + def addModsFolder(self, modsDir): + modsDir = os.path.normpath(modsDir) + if modsDir in self.modsDirs: + return + self.modsDirs.append(modsDir) + + for modName in os.listdir(modsDir): + mod = os.path.join(modsDir, modName) + if not os.path.isfile(mod): + continue + if not zipfile.is_zipfile(mod): + continue + + try: + self.addZipFile(mod) + except EnvironmentError as e: + log.exception("Failed to add mod %s to resource loader.", modName) + continue + def openStream(self, path): for zipFile in self.zipFiles: try: diff --git a/src/mcedit2/util/minecraftinstall.py b/src/mcedit2/util/minecraftinstall.py index 42587a9..756c317 100644 --- a/src/mcedit2/util/minecraftinstall.py +++ b/src/mcedit2/util/minecraftinstall.py @@ -32,6 +32,7 @@ def getResourceLoaderForFilename(filename): # Is this world inside a MultiMC instance? filename = os.path.normpath(filename) installs = GetInstalls() + for instance in installs.instances: savesFolder = os.path.normpath(instance.saveFileDir) if filename.startswith(savesFolder): @@ -39,7 +40,19 @@ def getResourceLoaderForFilename(filename): # Nope. Use the version and respack chosen in the world list. # ... should search for installs matching this one, but vanilla installs are still multi-version... - return getSelectedResourceLoader() + loader = getSelectedResourceLoader() + if not os.path.isdir(filename): + worldFolder = os.path.dirname(filename) + else: + worldFolder = filename + savesFolder = os.path.dirname(worldFolder) + mcFolder = os.path.dirname(savesFolder) + modsFolder = os.path.join(mcFolder, "mods") + if os.path.isdir(modsFolder): + log.info("Loading mods from %s", modsFolder) + loader.addModsFolder(modsFolder) + + return loader def getSelectedResourceLoader(): i = currentInstallOption.value() @@ -184,7 +197,6 @@ class MCInstallGroup(object): for instance in mmcInstall.instances: yield instance - def findVersion1_8(self): def matchVersion(version): major, minor, rev = splitVersion(version) @@ -324,14 +336,7 @@ class MMCInstance(object): v1_8 = self.install.installGroup.findVersion1_8() loader.addZipFile(v1_8) - for mod in os.listdir(self.modsDir): - if not os.path.isfile(mod): - continue - try: - loader.addZipFile(os.path.join(self.modsDir, mod)) - except EnvironmentError as e: - log.exception("Failed to add mod %s to resource loader.", mod) - continue + loader.addModsFolder(self.modsDir) info = ["%s (%s)" % (z.filename, md5hash(z.filename)) for z in loader.zipFiles] log.info("Created ResourceLoader with search path:\n%s", ",\n".join(info)) @@ -564,7 +569,7 @@ class MinecraftInstallsDialog(QtGui.QDialog): def addMMCInstall(self): result = QtGui.QFileDialog.getOpenFileName(self, "Choose a MultiMC configuration file (multimc.cfg)", - filter="MultiMC configuration files (multimc.cfg)") + filter="MultiMC configuration files (multimc.cfg)") installs = GetInstalls() if not result: return