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
|
from __future__ import absolute_import, division, print_function, unicode_literals
|
||||||
import logging
|
import logging
|
||||||
|
import os
|
||||||
import zipfile
|
import zipfile
|
||||||
import re
|
import re
|
||||||
|
|
||||||
@ -15,6 +16,7 @@ class ResourceLoader(object):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(ResourceLoader, self).__init__()
|
super(ResourceLoader, self).__init__()
|
||||||
self.zipFiles = []
|
self.zipFiles = []
|
||||||
|
self.modsDirs = []
|
||||||
|
|
||||||
def addZipFile(self, zipPath):
|
def addZipFile(self, zipPath):
|
||||||
try:
|
try:
|
||||||
@ -23,6 +25,25 @@ class ResourceLoader(object):
|
|||||||
raise IOError("Could not read %s as a zip file." % zipPath)
|
raise IOError("Could not read %s as a zip file." % zipPath)
|
||||||
self.zipFiles.append(zf)
|
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):
|
def openStream(self, path):
|
||||||
for zipFile in self.zipFiles:
|
for zipFile in self.zipFiles:
|
||||||
try:
|
try:
|
||||||
|
@ -32,6 +32,7 @@ def getResourceLoaderForFilename(filename):
|
|||||||
# Is this world inside a MultiMC instance?
|
# Is this world inside a MultiMC instance?
|
||||||
filename = os.path.normpath(filename)
|
filename = os.path.normpath(filename)
|
||||||
installs = GetInstalls()
|
installs = GetInstalls()
|
||||||
|
|
||||||
for instance in installs.instances:
|
for instance in installs.instances:
|
||||||
savesFolder = os.path.normpath(instance.saveFileDir)
|
savesFolder = os.path.normpath(instance.saveFileDir)
|
||||||
if filename.startswith(savesFolder):
|
if filename.startswith(savesFolder):
|
||||||
@ -39,7 +40,19 @@ def getResourceLoaderForFilename(filename):
|
|||||||
|
|
||||||
# Nope. Use the version and respack chosen in the world list.
|
# 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...
|
# ... 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():
|
def getSelectedResourceLoader():
|
||||||
i = currentInstallOption.value()
|
i = currentInstallOption.value()
|
||||||
@ -184,7 +197,6 @@ class MCInstallGroup(object):
|
|||||||
for instance in mmcInstall.instances:
|
for instance in mmcInstall.instances:
|
||||||
yield instance
|
yield instance
|
||||||
|
|
||||||
|
|
||||||
def findVersion1_8(self):
|
def findVersion1_8(self):
|
||||||
def matchVersion(version):
|
def matchVersion(version):
|
||||||
major, minor, rev = splitVersion(version)
|
major, minor, rev = splitVersion(version)
|
||||||
@ -324,14 +336,7 @@ class MMCInstance(object):
|
|||||||
v1_8 = self.install.installGroup.findVersion1_8()
|
v1_8 = self.install.installGroup.findVersion1_8()
|
||||||
loader.addZipFile(v1_8)
|
loader.addZipFile(v1_8)
|
||||||
|
|
||||||
for mod in os.listdir(self.modsDir):
|
loader.addModsFolder(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
|
|
||||||
|
|
||||||
info = ["%s (%s)" % (z.filename, md5hash(z.filename)) for z in loader.zipFiles]
|
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))
|
log.info("Created ResourceLoader with search path:\n%s", ",\n".join(info))
|
||||||
|
Reference in New Issue
Block a user