The ResourceLoader created when loading a world now tries to find a "mods" folder alongside the "saves" folder.

This commit is contained in:
David Vierra 2015-11-18 02:50:19 -10:00
parent ca801027c3
commit 83f2d1ca46
2 changed files with 37 additions and 11 deletions

View File

@ -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:

View File

@ -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))