From 0665c93c2b22b618474798bf2b7d5e1017b985f4 Mon Sep 17 00:00:00 2001 From: Christian Weeks Date: Sat, 12 May 2012 00:00:33 -0400 Subject: [PATCH] Gui related ticking --- .../cpw/mods/fml/client/FMLClientHandler.java | 12 ++++++++++++ client/net/minecraft/src/BaseMod.java | 19 ++++++------------- common/cpw/mods/fml/common/ModContainer.java | 12 ++++++++++++ .../modloader/ModLoaderModContainer.java | 16 ++++++++++++---- server/net/minecraft/src/BaseMod.java | 14 +++++++------- 5 files changed, 49 insertions(+), 24 deletions(-) diff --git a/client/cpw/mods/fml/client/FMLClientHandler.java b/client/cpw/mods/fml/client/FMLClientHandler.java index dd2d7fb488..c4d32bdac9 100644 --- a/client/cpw/mods/fml/client/FMLClientHandler.java +++ b/client/cpw/mods/fml/client/FMLClientHandler.java @@ -195,6 +195,9 @@ public class FMLClientHandler implements IFMLSidedHandler public void onPreWorldTick() { FMLCommonHandler.instance().worldTickStart(); + if (client.field_6313_p!=null && client.field_6324_e!=null) { + FMLCommonHandler.instance().tickStart(TickType.WORLDGUI, 0.0f, client.field_6313_p); + } } /** @@ -203,16 +206,25 @@ public class FMLClientHandler implements IFMLSidedHandler public void onPostWorldTick() { FMLCommonHandler.instance().worldTickEnd(); + if (client.field_6313_p!=null && client.field_6324_e!=null) { + FMLCommonHandler.instance().tickEnd(TickType.WORLDGUI, 0.0f, client.field_6313_p); + } } public void onRenderTickStart(float partialTickTime) { FMLCommonHandler.instance().tickStart(TickType.RENDER, partialTickTime); + if (client.field_6313_p!=null && client.field_6324_e!=null) { + FMLCommonHandler.instance().tickStart(TickType.GUI, partialTickTime, client.field_6313_p); + } } public void onRenderTickEnd(float partialTickTime) { FMLCommonHandler.instance().tickEnd(TickType.RENDER, partialTickTime); + if (client.field_6313_p!=null && client.field_6324_e!=null) { + FMLCommonHandler.instance().tickEnd(TickType.GUI, partialTickTime, client.field_6313_p); + } } /** * Get the server instance diff --git a/client/net/minecraft/src/BaseMod.java b/client/net/minecraft/src/BaseMod.java index 8797e1ced7..c3fb73fc51 100644 --- a/client/net/minecraft/src/BaseMod.java +++ b/client/net/minecraft/src/BaseMod.java @@ -23,6 +23,7 @@ import cpw.mods.fml.common.INetworkHandler; import cpw.mods.fml.common.IPickupNotifier; import cpw.mods.fml.common.IPlayerTracker; import cpw.mods.fml.common.IWorldGenerator; +import cpw.mods.fml.common.ModContainer.TickType; public abstract class BaseMod implements IWorldGenerator, IPickupNotifier, IDispenseHandler, ICraftingHandler, INetworkHandler, IConsoleHandler, IPlayerTracker { @@ -32,22 +33,14 @@ public abstract class BaseMod implements IWorldGenerator, IPickupNotifier, IDisp * @param minecraftInstance * @return */ - public final boolean doTickInGame(Object minecraftInstance, Object... data) + public final boolean doTickInGame(TickType tick, boolean tickEnd, Object minecraftInstance, Object... data) { Minecraft mc = (Minecraft) minecraftInstance; - if (mc.field_6324_e != null) - { + // World and render ticks + if ((tickEnd && tick==TickType.WORLD) || (!tickEnd && tick==TickType.RENDER)) { return onTickInGame((Float) data[0], mc); - } - return true; - } - - public final boolean doTickInGui(Object minecraftInstance, Object... data) - { - Minecraft mc = (Minecraft) minecraftInstance; - if (mc.field_40007_r != null) - { - return onTickInGUI((Float)data[0], mc, mc.field_6313_p); + } else if (((tickEnd && tick==TickType.WORLDGUI) || (!tickEnd && tick==TickType.GUI))) { + return onTickInGUI((Float) data[0], mc, (GuiScreen)data[1]); } return true; } diff --git a/common/cpw/mods/fml/common/ModContainer.java b/common/cpw/mods/fml/common/ModContainer.java index 6fb57f2c32..4e45e11e76 100644 --- a/common/cpw/mods/fml/common/ModContainer.java +++ b/common/cpw/mods/fml/common/ModContainer.java @@ -207,6 +207,18 @@ public interface ModContainer public enum TickType { WORLD, RENDER, GUI, WORLDGUI; + + /** + * @return + */ + public TickType partnerTick() + { + if (this==WORLD) return RENDER; + if (this==RENDER) return WORLD; + if (this==GUI) return WORLDGUI; + if (this==WORLDGUI) return GUI; + return null; + } } List getKeys(); diff --git a/common/cpw/mods/fml/common/modloader/ModLoaderModContainer.java b/common/cpw/mods/fml/common/modloader/ModLoaderModContainer.java index 269949bcfc..8d174ef740 100644 --- a/common/cpw/mods/fml/common/modloader/ModLoaderModContainer.java +++ b/common/cpw/mods/fml/common/modloader/ModLoaderModContainer.java @@ -328,16 +328,24 @@ public class ModLoaderModContainer implements ModContainer @Override public void tickStart(TickType tick, Object ... data) { - if (ticks.contains(tick) && tick==TickType.WORLD) { - mod.doTickInGame(FMLCommonHandler.instance().getMinecraftInstance(), data); + if (ticks.contains(tick)) { + boolean keepTicking=mod.doTickInGame(tick, false, FMLCommonHandler.instance().getMinecraftInstance(), data); + if (!keepTicking) { + ticks.remove(tick); + ticks.remove(tick.partnerTick()); + } } } @Override public void tickEnd(TickType tick, Object ... data) { - if (ticks.contains(tick) && tick!=TickType.WORLD) { - mod.doTickInGame(FMLCommonHandler.instance().getMinecraftInstance(), data); + if (ticks.contains(tick)) { + boolean keepTicking=mod.doTickInGame(tick, true, FMLCommonHandler.instance().getMinecraftInstance(), data); + if (!keepTicking) { + ticks.remove(tick); + ticks.remove(tick.partnerTick()); + } } } diff --git a/server/net/minecraft/src/BaseMod.java b/server/net/minecraft/src/BaseMod.java index 1501ff4079..6f869ef465 100644 --- a/server/net/minecraft/src/BaseMod.java +++ b/server/net/minecraft/src/BaseMod.java @@ -23,6 +23,7 @@ import cpw.mods.fml.common.INetworkHandler; import cpw.mods.fml.common.IPickupNotifier; import cpw.mods.fml.common.IPlayerTracker; import cpw.mods.fml.common.IWorldGenerator; +import cpw.mods.fml.common.ModContainer.TickType; public abstract class BaseMod implements IWorldGenerator, IPickupNotifier, IDispenseHandler, ICraftingHandler, INetworkHandler, IConsoleHandler, IPlayerTracker { @@ -32,14 +33,13 @@ public abstract class BaseMod implements IWorldGenerator, IPickupNotifier, IDisp * @param minecraftInstance * @return */ - public final boolean doTickInGame(Object minecraftInstance, Object... data) + public final boolean doTickInGame(TickType tick, boolean tickEnd, Object minecraftInstance, Object... data) { - return onTickInGame((MinecraftServer)minecraftInstance); - } - - public final boolean doTickInGui(Object minecraftInstance, Object... data) - { - return true; + if (tick==TickType.WORLD && tickEnd) { + return onTickInGame((MinecraftServer)minecraftInstance); + } else { + return false; + } } @Override