diff --git a/client/cpw/mods/fml/client/modloader/ModLoaderClientHelper.java b/client/cpw/mods/fml/client/modloader/ModLoaderClientHelper.java index e1926a8ad4..bd0451a07d 100644 --- a/client/cpw/mods/fml/client/modloader/ModLoaderClientHelper.java +++ b/client/cpw/mods/fml/client/modloader/ModLoaderClientHelper.java @@ -22,6 +22,7 @@ import com.google.common.collect.Multimaps; import cpw.mods.fml.client.registry.KeyBindingRegistry; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.modloader.BaseModProxy; import cpw.mods.fml.common.modloader.IModLoaderSidedHelper; import cpw.mods.fml.common.modloader.ModLoaderHelper; import cpw.mods.fml.common.modloader.ModLoaderModContainer; @@ -83,7 +84,7 @@ public class ModLoaderClientHelper implements IModLoaderSidedHelper } - public static void registerKeyBinding(BaseMod mod, KeyBinding keyHandler, boolean allowRepeat) + public static void registerKeyBinding(BaseModProxy mod, KeyBinding keyHandler, boolean allowRepeat) { ModLoaderModContainer mlmc = (ModLoaderModContainer) Loader.instance().activeModContainer(); ModLoaderKeyBindingHandler handler = Iterables.getOnlyElement(keyBindingContainers.get(mlmc)); diff --git a/client/net/minecraft/src/BaseMod.java b/client/net/minecraft/src/BaseMod.java index a8df11bd3d..b9ac07c40a 100644 --- a/client/net/minecraft/src/BaseMod.java +++ b/client/net/minecraft/src/BaseMod.java @@ -223,7 +223,23 @@ public abstract class BaseMod implements cpw.mods.fml.common.modloader.BaseModPr public void generateSurface(World world, Random random, int chunkX, int chunkZ) { } - + + /** + * Callback to return a gui screen to display + * @param player + * @param containerID + * @param x + * @param y + * @param z + * @return + */ + @SideOnly(CLIENT) + @Override + public GuiScreen getContainerGUI(EntityPlayer player, int containerID, int x, int y, int z) + { + return null; + } + /** * Return the name of your mod. Defaults to the class name * diff --git a/client/net/minecraft/src/ModLoader.java b/client/net/minecraft/src/ModLoader.java index 8759050f65..830e1bd010 100644 --- a/client/net/minecraft/src/ModLoader.java +++ b/client/net/minecraft/src/ModLoader.java @@ -35,6 +35,7 @@ import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.ObfuscationReflectionHelper; import cpw.mods.fml.common.asm.SideOnly; +import cpw.mods.fml.common.modloader.BaseModProxy; import cpw.mods.fml.common.modloader.ModLoaderHelper; import cpw.mods.fml.common.modloader.ModLoaderModContainer; import cpw.mods.fml.common.network.NetworkRegistry; @@ -572,6 +573,10 @@ public class ModLoader GameRegistry.registerBlock(block, itemclass); } + public static void registerContainerID(BaseModProxy mod, int id) + { + ModLoaderHelper.buildGuiHelper(mod, id); + } /** * Register a new entity ID * @@ -599,7 +604,7 @@ public class ModLoader } @SideOnly(CLIENT) - public static void registerKey(BaseMod mod, KeyBinding keyHandler, boolean allowRepeat) + public static void registerKey(BaseModProxy mod, KeyBinding keyHandler, boolean allowRepeat) { ModLoaderClientHelper.registerKeyBinding(mod, keyHandler, allowRepeat); } @@ -611,7 +616,7 @@ public class ModLoader * @param mod * @param channel */ - public static void registerPacketChannel(BaseMod mod, String channel) + public static void registerPacketChannel(BaseModProxy mod, String channel) { NetworkRegistry.instance().registerChannel(ModLoaderHelper.buildPacketHandlerFor(mod), channel); } @@ -746,6 +751,11 @@ public class ModLoader //TODO } + public static void serverOpenWindow(EntityPlayer player, Container container, int ID, int x, int y, int z) + { + ModLoaderHelper.openGui(ID, player, container, x, y, z); + } + /** * Indicate that you want to receive ticks * @@ -753,13 +763,13 @@ public class ModLoader * @param enable indicates whether you want to recieve them or not * @param useClock don't receive render subticks, just world ticks */ - public static void setInGameHook(BaseMod mod, boolean enable, boolean useClock) + public static void setInGameHook(BaseModProxy mod, boolean enable, boolean useClock) { ModLoaderHelper.updateStandardTicks(mod, enable, useClock); } - public static void setInGUIHook(BaseMod mod, boolean enable, boolean useClock) + public static void setInGUIHook(BaseModProxy mod, boolean enable, boolean useClock) { ModLoaderHelper.updateGUITicks(mod, enable, useClock); } diff --git a/common/cpw/mods/fml/common/modloader/BaseModProxy.java b/common/cpw/mods/fml/common/modloader/BaseModProxy.java index 04fcc49ac5..66791ab4ee 100644 --- a/common/cpw/mods/fml/common/modloader/BaseModProxy.java +++ b/common/cpw/mods/fml/common/modloader/BaseModProxy.java @@ -17,13 +17,16 @@ package cpw.mods.fml.common.modloader; import java.util.Random; import net.minecraft.src.EntityPlayer; +import net.minecraft.src.GuiScreen; import net.minecraft.src.IInventory; import net.minecraft.src.ItemStack; import net.minecraft.src.NetHandler; import net.minecraft.src.NetworkManager; import net.minecraft.src.Packet250CustomPayload; import net.minecraft.src.World; +import cpw.mods.fml.common.Side; import cpw.mods.fml.common.TickType; +import cpw.mods.fml.common.asm.SideOnly; /** * @@ -82,4 +85,7 @@ public interface BaseModProxy public abstract void receiveChatPacket(String text); public abstract void onItemPickup(EntityPlayer player, ItemStack item); + + @SideOnly(Side.CLIENT) + public abstract GuiScreen getContainerGUI(EntityPlayer player, int containerID, int x, int y, int z); } diff --git a/common/cpw/mods/fml/common/modloader/ModLoaderGuiHelper.java b/common/cpw/mods/fml/common/modloader/ModLoaderGuiHelper.java new file mode 100644 index 0000000000..db17bc7554 --- /dev/null +++ b/common/cpw/mods/fml/common/modloader/ModLoaderGuiHelper.java @@ -0,0 +1,43 @@ +package cpw.mods.fml.common.modloader; + +import net.minecraft.src.Container; +import net.minecraft.src.EntityPlayer; +import net.minecraft.src.World; +import cpw.mods.fml.common.network.IGuiHandler; + +public class ModLoaderGuiHelper implements IGuiHandler +{ + + private BaseModProxy mod; + private int id; + private Container container; + + ModLoaderGuiHelper(BaseModProxy mod, int id) + { + this.mod = mod; + this.id = id; + } + + @Override + public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) + { + return container; + } + + @Override + public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) + { + return mod.getContainerGUI(player, ID, x, y, z); + } + + public void injectContainer(Container container) + { + this.container = container; + } + + public Object getMod() + { + return mod; + } + +} diff --git a/common/cpw/mods/fml/common/modloader/ModLoaderHelper.java b/common/cpw/mods/fml/common/modloader/ModLoaderHelper.java index c4c09d1fe4..49c7fac735 100644 --- a/common/cpw/mods/fml/common/modloader/ModLoaderHelper.java +++ b/common/cpw/mods/fml/common/modloader/ModLoaderHelper.java @@ -18,7 +18,10 @@ import java.util.EnumSet; import java.util.HashMap; import java.util.Map; -import net.minecraft.src.BaseMod; +import com.google.common.collect.Maps; + +import net.minecraft.src.Container; +import net.minecraft.src.EntityPlayer; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.ICraftingHandler; import cpw.mods.fml.common.IFuelHandler; @@ -27,7 +30,9 @@ import cpw.mods.fml.common.IWorldGenerator; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.TickType; import cpw.mods.fml.common.network.IConnectionHandler; +import cpw.mods.fml.common.network.IGuiHandler; import cpw.mods.fml.common.network.IPacketHandler; +import cpw.mods.fml.common.network.NetworkRegistry; /** * @author cpw @@ -35,10 +40,11 @@ import cpw.mods.fml.common.network.IPacketHandler; */ public class ModLoaderHelper { - private static Map notModCallbacks=new HashMap(); - public static IModLoaderSidedHelper sidedHelper; - public static void updateStandardTicks(BaseMod mod, boolean enable, boolean useClock) + + private static Map guiHelpers = Maps.newHashMap(); + + public static void updateStandardTicks(BaseModProxy mod, boolean enable, boolean useClock) { ModLoaderModContainer mlmc = (ModLoaderModContainer) Loader.instance().activeModContainer(); BaseModTicker ticker = mlmc.getGameTickHandler(); @@ -59,9 +65,9 @@ public class ModLoaderHelper } } - public static void updateGUITicks(BaseMod mod, boolean enable, boolean useClock) + public static void updateGUITicks(BaseModProxy mod, boolean enable, boolean useClock) { - ModLoaderModContainer mlmc = findOrBuildModContainer(mod); + ModLoaderModContainer mlmc = (ModLoaderModContainer) Loader.instance().activeModContainer(); EnumSet ticks = mlmc.getGUITickHandler().ticks(); // If we're enabled and we don't want clock ticks we get render ticks if (enable && !useClock) { @@ -79,34 +85,7 @@ public class ModLoaderHelper } } - /** - * @param mod - * @return - */ - private static ModLoaderModContainer findOrBuildModContainer(BaseMod mod) - { - ModLoaderModContainer mlmc=(ModLoaderModContainer) FMLCommonHandler.instance().findContainerFor(mod); - if (mlmc==null) { - mlmc=notModCallbacks.get(mod); - if (mlmc==null) { - mlmc=new ModLoaderModContainer(mod); - notModCallbacks.put(mod, mlmc); - } - } - return mlmc; - } - - /** - * @param mod - * @return - */ - public static ModLoaderModContainer registerKeyHelper(BaseMod mod) - { - ModLoaderModContainer mlmc=findOrBuildModContainer(mod); - return mlmc; - } - - public static IPacketHandler buildPacketHandlerFor(BaseMod mod) + public static IPacketHandler buildPacketHandlerFor(BaseModProxy mod) { return new ModLoaderPacketHandler(mod); } @@ -143,4 +122,17 @@ public class ModLoaderHelper { return new ModLoaderPickupNotifier(mod); } + + public static void buildGuiHelper(BaseModProxy mod, int id) + { + ModLoaderGuiHelper handler = new ModLoaderGuiHelper(mod, id); + guiHelpers.put(id, handler); + NetworkRegistry.instance().registerGuiHandler(Loader.instance().activeModContainer(), handler); + } + + public static void openGui(int id, EntityPlayer player, Container container, int x, int y, int z) + { + guiHelpers.get(id).injectContainer(container); + player.openGui(guiHelpers.get(id).getMod(), id, player.field_70170_p, x, y, z); + } } diff --git a/common/cpw/mods/fml/common/modloader/ModLoaderPacketHandler.java b/common/cpw/mods/fml/common/modloader/ModLoaderPacketHandler.java index 6b03a97501..018581b8a1 100644 --- a/common/cpw/mods/fml/common/modloader/ModLoaderPacketHandler.java +++ b/common/cpw/mods/fml/common/modloader/ModLoaderPacketHandler.java @@ -1,6 +1,5 @@ package cpw.mods.fml.common.modloader; -import net.minecraft.src.BaseMod; import net.minecraft.src.EntityPlayer; import net.minecraft.src.EntityPlayerMP; import net.minecraft.src.NetworkManager; @@ -10,9 +9,9 @@ import cpw.mods.fml.common.network.Player; public class ModLoaderPacketHandler implements IPacketHandler { - private BaseMod mod; + private BaseModProxy mod; - public ModLoaderPacketHandler(BaseMod mod) + public ModLoaderPacketHandler(BaseModProxy mod) { this.mod = mod; }