From be1a80ebbd5b72bda29f8e90d802e29332f6d899 Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 21 Jun 2012 18:11:40 -0400 Subject: [PATCH] Fix ticking properly - ML world ticks now fire once, properly --- client/net/minecraft/src/BaseMod.java | 2 +- .../fml/common/modloader/BaseModTicker.java | 29 ++++--- .../fml/common/modloader/ModLoaderHelper.java | 2 +- .../src/net/minecraft/src/mod_testMod.java | 75 +++++++++++++------ 4 files changed, 75 insertions(+), 33 deletions(-) diff --git a/client/net/minecraft/src/BaseMod.java b/client/net/minecraft/src/BaseMod.java index 0c98cfbc15..550b26bb08 100644 --- a/client/net/minecraft/src/BaseMod.java +++ b/client/net/minecraft/src/BaseMod.java @@ -44,7 +44,7 @@ public abstract class BaseMod implements cpw.mods.fml.common.modloader.BaseMod Minecraft mc = (Minecraft) minecraftInstance; boolean hasWorld = mc.field_6324_e != null; // World and render ticks - if (((tickEnd && tick==TickType.GAME) || (tickEnd && tick==TickType.RENDER)) && hasWorld) { + if (tickEnd && ( tick==TickType.RENDER || tick==TickType.GAME ) && hasWorld) { return onTickInGame((Float) data[0], mc); } else if (((tickEnd && tick==TickType.WORLDGUI) || (tickEnd && tick==TickType.GUI))) { return onTickInGUI((Float) data[0], mc, (GuiScreen)data[1]); diff --git a/common/cpw/mods/fml/common/modloader/BaseModTicker.java b/common/cpw/mods/fml/common/modloader/BaseModTicker.java index 9d7f349184..94c6ea9a88 100644 --- a/common/cpw/mods/fml/common/modloader/BaseModTicker.java +++ b/common/cpw/mods/fml/common/modloader/BaseModTicker.java @@ -57,17 +57,28 @@ public class BaseModTicker implements ITickHandler private void tickBaseMod(EnumSet types, boolean end, Object... tickData) { - if (end && (types.contains(TickType.GAME) && ticks.contains(TickType.GAME)) || (types.contains(TickType.WORLDLOAD) && ticks.contains(TickType.WORLDLOAD))) + if (FMLCommonHandler.instance().getSide().isServer() || ticks.contains(TickType.RENDER)) { - clockTickTrigger = true; + sendTick(types, end, tickData); + } + else + { + if (end && ticks.contains(TickType.GAME) && (types.contains(TickType.GAME) || types.contains(TickType.WORLDLOAD))) + { + clockTickTrigger = true; + } + + if (end && clockTickTrigger && types.contains(TickType.RENDER)) + { + clockTickTrigger = false; + sendTick(EnumSet.of(TickType.GAME),end,tickData); + } } - if (end && clockTickTrigger && types.contains(TickType.RENDER)) - { - types.add(TickType.GAME); - types.remove(TickType.RENDER); - clockTickTrigger = false; - } + } + + private void sendTick(EnumSet types, boolean end, Object... tickData) + { for (TickType type : types) { if (!ticks.contains(type)) @@ -85,7 +96,7 @@ public class BaseModTicker implements ITickHandler @Override public EnumSet ticks() { - return ticks; + return (clockTickTrigger ? EnumSet.of(TickType.RENDER) : ticks); } @Override diff --git a/common/cpw/mods/fml/common/modloader/ModLoaderHelper.java b/common/cpw/mods/fml/common/modloader/ModLoaderHelper.java index 502137ba4e..9b913d84e6 100644 --- a/common/cpw/mods/fml/common/modloader/ModLoaderHelper.java +++ b/common/cpw/mods/fml/common/modloader/ModLoaderHelper.java @@ -35,7 +35,7 @@ public class ModLoaderHelper BaseModTicker ticker = mlmc.getTickHandler(); EnumSet ticks = ticker.ticks(); // If we're enabled we get render ticks - if (enable) { + if (enable && !useClock) { ticks.add(TickType.RENDER); } else { ticks.remove(TickType.RENDER); diff --git a/eclipse/simpletestmod/src/net/minecraft/src/mod_testMod.java b/eclipse/simpletestmod/src/net/minecraft/src/mod_testMod.java index 43c5c38523..21b4d645c7 100644 --- a/eclipse/simpletestmod/src/net/minecraft/src/mod_testMod.java +++ b/eclipse/simpletestmod/src/net/minecraft/src/mod_testMod.java @@ -1,22 +1,15 @@ package net.minecraft.src; -public class mod_testMod extends BaseMod { +import java.util.EnumSet; - @MLProp - public static byte byteptest = 5; - @MLProp - public static short shortptest = 5; - @MLProp - public static int intptest = 5; - @MLProp - public static long longptest = 5; - @MLProp - public static float floatptest = 5; - @MLProp - public static double doubleptest = 5; - @MLProp - public static boolean booleanptest = false; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.ITickHandler; +import cpw.mods.fml.common.TickType; +import net.minecraft.client.Minecraft; +public class mod_testMod extends BaseMod implements ITickHandler { + private long ts; + private long tsg; @Override public String getVersion() { return "test"; @@ -24,13 +17,51 @@ public class mod_testMod extends BaseMod { @Override public void load() { - System.out.println("byte : "+byteptest); - System.out.println("short : "+shortptest); - System.out.println("int : "+intptest); - System.out.println("long : "+longptest); - System.out.println("float : "+floatptest); - System.out.println("double : "+doubleptest); - System.out.println("bool : "+booleanptest); + ModLoader.setInGameHook(this, true, true); + FMLCommonHandler.instance().registerTickHandler(this); + ts=System.currentTimeMillis(); + tsg=ts; + } + + @Override + public boolean onTickInGame(float time, Minecraft minecraftInstance) + { + long now = System.currentTimeMillis(); + long del=now-ts; + ts=now; + System.out.printf("%d %d %d %d MLTICK\n",del, ts, tsg, now); + return true; + } + + @Override + public void tickStart(EnumSet type, Object... tickData) + { + + } + + @Override + public void tickEnd(EnumSet type, Object... tickData) + { + long now = System.currentTimeMillis(); + long del=now-tsg; + tsg=now; + System.out.printf("%d %d %d %d GAMETICK\n",del, ts, tsg, now); + } + + @Override + public EnumSet ticks() + { + return EnumSet.of(TickType.GAME); + } + + /* (non-Javadoc) + * @see cpw.mods.fml.common.ITickHandler#getLabel() + */ + @Override + public String getLabel() + { + // TODO Auto-generated method stub + return "TickTester"; } } \ No newline at end of file