The ResourceLoader created when loading a world now tries to find a "mods" folder alongside the "saves" folder.
This commit is contained in:
parent
ca801027c3
commit
83f2d1ca46
@ -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:
|
||||
|
@ -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))
|
||||
|
Reference in New Issue
Block a user