From 5d0d45ea40035a1b42e88570936b1699eac69a61 Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 2 Jul 2013 11:11:50 -0400 Subject: [PATCH] Resource packs, part two. FML mods are now resource packs. Vanilla will scan anything under 'assets' and turn it into a resource prefix. Use resourcelocations to look stuff up. --- .../cpw/mods/fml/client/FMLClientHandler.java | 27 +++++++--- .../mods/fml/client/FMLFileResourcePack.java | 53 +++++++++++++++++++ .../fml/client/FMLFolderResourcePack.java | 52 ++++++++++++++++++ .../mods/fml/common/DummyModContainer.java | 5 ++ .../cpw/mods/fml/common/FMLModContainer.java | 13 +++++ .../mods/fml/common/InjectedModContainer.java | 6 +++ .../cpw/mods/fml/common/ModContainer.java | 2 + .../modloader/ModLoaderModContainer.java | 6 +++ 8 files changed, 157 insertions(+), 7 deletions(-) create mode 100644 fml/client/cpw/mods/fml/client/FMLFileResourcePack.java create mode 100644 fml/client/cpw/mods/fml/client/FMLFolderResourcePack.java diff --git a/fml/client/cpw/mods/fml/client/FMLClientHandler.java b/fml/client/cpw/mods/fml/client/FMLClientHandler.java index c810f434be..15f7e60dad 100644 --- a/fml/client/cpw/mods/fml/client/FMLClientHandler.java +++ b/fml/client/cpw/mods/fml/client/FMLClientHandler.java @@ -13,6 +13,7 @@ package cpw.mods.fml.client; import java.io.File; +import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -169,6 +170,8 @@ public class FMLClientHandler implements IFMLSidedHandler try { Loader.instance().loadMods(); + // Reload resources + client.func_110436_a(); } catch (WrongMinecraftVersionException wrong) { @@ -563,14 +566,24 @@ public class FMLClientHandler implements IFMLSidedHandler @Override public void addModAsResource(ModContainer container) { - File modSource = container.getSource(); - if (modSource.isFile()) + Class resourcePackType = container.getCustomResourcePackClass(); + if (resourcePackType != null) { - resourcePackList.add(new FileResourcePack(modSource)); - } - else if (modSource.isDirectory()) - { - resourcePackList.add(new FolderResourcePack(modSource)); + try + { + ResourcePack pack = (ResourcePack) resourcePackType.getConstructor(ModContainer.class).newInstance(container); + resourcePackList.add(pack); + } + catch (NoSuchMethodException e) + { + FMLLog.log(Level.SEVERE, "The container %s (type %s) returned an invalid class for it's resource pack.", container.getName(), container.getClass().getName()); + return; + } + catch (Exception e) + { + FMLLog.log(Level.SEVERE, e, "An unexpected exception occurred constructing the custom resource pack for %s", container.getName()); + throw Throwables.propagate(e); + } } } } diff --git a/fml/client/cpw/mods/fml/client/FMLFileResourcePack.java b/fml/client/cpw/mods/fml/client/FMLFileResourcePack.java new file mode 100644 index 0000000000..05c32c907b --- /dev/null +++ b/fml/client/cpw/mods/fml/client/FMLFileResourcePack.java @@ -0,0 +1,53 @@ +package cpw.mods.fml.client; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.logging.Level; + +import com.google.common.base.Charsets; + +import cpw.mods.fml.common.FMLLog; +import cpw.mods.fml.common.ModContainer; + +import net.minecraft.client.resources.FileResourcePack; + +public class FMLFileResourcePack extends FileResourcePack { + + private ModContainer container; + + public FMLFileResourcePack(ModContainer container) + { + super(container.getSource()); + this.container = container; + } + + @Override + public String func_130077_b() + { + return "FMLFileResourcePack:"+container.getName(); + } + @Override + protected InputStream func_110591_a(String resourceName) throws IOException + { + try + { + return super.func_110591_a(resourceName); + } + catch (IOException ioe) + { + if ("pack.mcmeta".equals(resourceName)) + { + FMLLog.log(container.getName(), Level.WARNING, "Mod %s is missing a pack.mcmeta file, things may not work well", container.getName()); + return new ByteArrayInputStream(("{\n" + + " \"pack\": {\n"+ + " \"description\": \"dummy FML pack for "+container.getName()+"\",\n"+ + " \"pack_format\": 1\n"+ + "}\n" + + "}").getBytes(Charsets.UTF_8)); + } + else throw ioe; + } + } +} diff --git a/fml/client/cpw/mods/fml/client/FMLFolderResourcePack.java b/fml/client/cpw/mods/fml/client/FMLFolderResourcePack.java new file mode 100644 index 0000000000..5f7debf9b7 --- /dev/null +++ b/fml/client/cpw/mods/fml/client/FMLFolderResourcePack.java @@ -0,0 +1,52 @@ +package cpw.mods.fml.client; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.logging.Level; + +import net.minecraft.client.resources.FolderResourcePack; + +import com.google.common.base.Charsets; + +import cpw.mods.fml.common.FMLLog; +import cpw.mods.fml.common.ModContainer; + +public class FMLFolderResourcePack extends FolderResourcePack { + + private ModContainer container; + + public FMLFolderResourcePack(ModContainer container) + { + super(container.getSource()); + this.container = container; + } + + @Override + public String func_130077_b() + { + return "FMLFileResourcePack:"+container.getName(); + } + @Override + protected InputStream func_110591_a(String resourceName) throws IOException + { + try + { + return super.func_110591_a(resourceName); + } + catch (IOException ioe) + { + if ("pack.mcmeta".equals(resourceName)) + { + FMLLog.log(container.getName(), Level.WARNING, "Mod %s is missing a pack.mcmeta file, things may not work well", container.getName()); + return new ByteArrayInputStream(("{\n" + + " \"pack\": {\n"+ + " \"description\": \"dummy FML pack for "+container.getName()+"\",\n"+ + " \"pack_format\": 1\n"+ + "}\n" + + "}").getBytes(Charsets.UTF_8)); + } + else throw ioe; + } + } +} diff --git a/fml/common/cpw/mods/fml/common/DummyModContainer.java b/fml/common/cpw/mods/fml/common/DummyModContainer.java index 977159569f..30790e8da0 100644 --- a/fml/common/cpw/mods/fml/common/DummyModContainer.java +++ b/fml/common/cpw/mods/fml/common/DummyModContainer.java @@ -175,4 +175,9 @@ public class DummyModContainer implements ModContainer { return EMPTY_PROPERTIES; } + @Override + public Class getCustomResourcePackClass() + { + return null; + } } diff --git a/fml/common/cpw/mods/fml/common/FMLModContainer.java b/fml/common/cpw/mods/fml/common/FMLModContainer.java index 37184e53e2..498226dfdb 100644 --- a/fml/common/cpw/mods/fml/common/FMLModContainer.java +++ b/fml/common/cpw/mods/fml/common/FMLModContainer.java @@ -596,4 +596,17 @@ public class FMLModContainer implements ModContainer { return customModProperties; } + + @Override + public Class getCustomResourcePackClass() + { + try + { + return getSource().isDirectory() ? Class.forName("cpw.mods.fml.client.FMLFolderResourcePack", true, getClass().getClassLoader()) : Class.forName("cpw.mods.fml.client.FMLFileResourcePack",true, getClass().getClassLoader()); + } + catch (ClassNotFoundException e) + { + return null; + } + } } diff --git a/fml/common/cpw/mods/fml/common/InjectedModContainer.java b/fml/common/cpw/mods/fml/common/InjectedModContainer.java index fe6d02645b..df5b7ff4d4 100644 --- a/fml/common/cpw/mods/fml/common/InjectedModContainer.java +++ b/fml/common/cpw/mods/fml/common/InjectedModContainer.java @@ -161,4 +161,10 @@ public class InjectedModContainer implements ModContainer { return wrappedContainer.getCustomModProperties(); } + + @Override + public Class getCustomResourcePackClass() + { + return wrappedContainer.getCustomResourcePackClass(); + } } diff --git a/fml/common/cpw/mods/fml/common/ModContainer.java b/fml/common/cpw/mods/fml/common/ModContainer.java index 132914eadf..5d81d1f616 100644 --- a/fml/common/cpw/mods/fml/common/ModContainer.java +++ b/fml/common/cpw/mods/fml/common/ModContainer.java @@ -136,4 +136,6 @@ public interface ModContainer public static final Map EMPTY_PROPERTIES = ImmutableMap.of(); Map getCustomModProperties(); + + public Class getCustomResourcePackClass(); } diff --git a/fml/common/cpw/mods/fml/common/modloader/ModLoaderModContainer.java b/fml/common/cpw/mods/fml/common/modloader/ModLoaderModContainer.java index ce1a0c114d..050c9d16cd 100644 --- a/fml/common/cpw/mods/fml/common/modloader/ModLoaderModContainer.java +++ b/fml/common/cpw/mods/fml/common/modloader/ModLoaderModContainer.java @@ -621,4 +621,10 @@ public class ModLoaderModContainer implements ModContainer { return EMPTY_PROPERTIES; } + + @Override + public Class getCustomResourcePackClass() + { + return null; + } }