Commit 4e3e54ae64c23c62d860514b105283e96c61d780
1 parent
95b3fc7d
LiteLoader 1.5.2
+ Added paginated "Controls" GUI based on the Macros one + Added new interfaces GameLoopListener and ChatRenderListener + Added sanity check for profiler hook + Added more descriptive exception for when mods screw up the profiler stack so that it's clearer that it's not LiteLoader's fault
Showing
8 changed files
with
542 additions
and
50 deletions
java/com/mumfrey/liteloader/ChatRenderListener.java
0 → 100644
1 | +package com.mumfrey.liteloader; | ||
2 | + | ||
3 | +import net.minecraft.src.GuiNewChat; | ||
4 | + | ||
5 | +/** | ||
6 | + * Interface for mods which want to alter the chat display | ||
7 | + * | ||
8 | + * @author Adam Mummery-Smith | ||
9 | + */ | ||
10 | +public interface ChatRenderListener extends LiteMod | ||
11 | +{ | ||
12 | + public abstract void onPreRenderChat(int screenWidth, int screenHeight, GuiNewChat chat); | ||
13 | + | ||
14 | + public abstract void onPostRenderChat(int screenWidth, int screenHeight, GuiNewChat chat); | ||
15 | +} |
java/com/mumfrey/liteloader/GameLoopListener.java
0 → 100644
1 | +package com.mumfrey.liteloader; | ||
2 | + | ||
3 | +import net.minecraft.client.Minecraft; | ||
4 | + | ||
5 | +/** | ||
6 | + * Interface for mods which want a frame notification every single game loop | ||
7 | + * | ||
8 | + * @author Adam Mummery-Smith | ||
9 | + */ | ||
10 | +public interface GameLoopListener | ||
11 | +{ | ||
12 | + /** | ||
13 | + * Called every frame, before the world is ticked | ||
14 | + * | ||
15 | + * @param minecraft | ||
16 | + */ | ||
17 | + public abstract void onRunGameLoop(Minecraft minecraft); | ||
18 | +} |
java/com/mumfrey/liteloader/core/HookProfiler.java
@@ -3,6 +3,7 @@ package com.mumfrey.liteloader.core; | @@ -3,6 +3,7 @@ package com.mumfrey.liteloader.core; | ||
3 | import java.lang.reflect.Field; | 3 | import java.lang.reflect.Field; |
4 | import java.lang.reflect.Method; | 4 | import java.lang.reflect.Method; |
5 | import java.util.LinkedList; | 5 | import java.util.LinkedList; |
6 | +import java.util.NoSuchElementException; | ||
6 | import java.util.logging.Logger; | 7 | import java.util.logging.Logger; |
7 | 8 | ||
8 | import net.minecraft.client.Minecraft; | 9 | import net.minecraft.client.Minecraft; |
@@ -65,7 +66,7 @@ public class HookProfiler extends Profiler | @@ -65,7 +66,7 @@ public class HookProfiler extends Profiler | ||
65 | this.logger = logger; | 66 | this.logger = logger; |
66 | 67 | ||
67 | // Detect optifine (duh!) | 68 | // Detect optifine (duh!) |
68 | - detectOptifine(); | 69 | + this.detectOptifine(); |
69 | } | 70 | } |
70 | 71 | ||
71 | /** | 72 | /** |
@@ -77,18 +78,18 @@ public class HookProfiler extends Profiler | @@ -77,18 +78,18 @@ public class HookProfiler extends Profiler | ||
77 | { | 78 | { |
78 | try | 79 | try |
79 | { | 80 | { |
80 | - ofProfiler = GameSettings.class.getDeclaredField("ofProfiler"); | 81 | + this.ofProfiler = GameSettings.class.getDeclaredField("ofProfiler"); |
81 | } | 82 | } |
82 | catch (SecurityException ex) {} | 83 | catch (SecurityException ex) {} |
83 | catch (NoSuchFieldException ex) | 84 | catch (NoSuchFieldException ex) |
84 | { | 85 | { |
85 | - logger.info("Optifine not detected"); | 86 | + this.logger.info("Optifine not detected"); |
86 | } | 87 | } |
87 | finally | 88 | finally |
88 | { | 89 | { |
89 | - if (ofProfiler != null) | 90 | + if (this.ofProfiler != null) |
90 | { | 91 | { |
91 | - logger.info(String.format("Optifine version %s detected, enabling compatibility check", getOptifineVersion())); | 92 | + this.logger.info(String.format("Optifine version %s detected, enabling compatibility check", this.getOptifineVersion())); |
92 | } | 93 | } |
93 | } | 94 | } |
94 | } | 95 | } |
@@ -125,44 +126,54 @@ public class HookProfiler extends Profiler | @@ -125,44 +126,54 @@ public class HookProfiler extends Profiler | ||
125 | @Override | 126 | @Override |
126 | public void startSection(String sectionName) | 127 | public void startSection(String sectionName) |
127 | { | 128 | { |
128 | - if (!initDone) | 129 | + if (!this.initDone) |
129 | { | 130 | { |
130 | - initDone = true; | ||
131 | - loader.onInit(); | 131 | + this.initDone = true; |
132 | + this.loader.onInit(); | ||
132 | } | 133 | } |
133 | 134 | ||
134 | - if ("gameRenderer".equals(sectionName) && "root".equals(sectionStack.getLast())) | 135 | + if ("gameRenderer".equals(sectionName) && "root".equals(this.sectionStack.getLast())) |
135 | { | 136 | { |
136 | - loader.onRender(); | 137 | + this.loader.onRender(); |
137 | } | 138 | } |
138 | 139 | ||
139 | - if ("frustrum".equals(sectionName) && "level".equals(sectionStack.getLast())) | 140 | + if ("frustrum".equals(sectionName) && "level".equals(this.sectionStack.getLast())) |
140 | { | 141 | { |
141 | - loader.onSetupCameraTransform(); | 142 | + this.loader.onSetupCameraTransform(); |
142 | } | 143 | } |
143 | 144 | ||
144 | if ("litParticles".equals(sectionName)) | 145 | if ("litParticles".equals(sectionName)) |
145 | { | 146 | { |
146 | - loader.postRenderEntities(); | 147 | + this.loader.postRenderEntities(); |
147 | } | 148 | } |
148 | 149 | ||
149 | - if ("animateTick".equals(sectionName)) tick = true; | ||
150 | - sectionStack.add(sectionName); | 150 | + if ("tick".equals(sectionName) && "root".equals(this.sectionStack.getLast())) |
151 | + { | ||
152 | + this.loader.onTimerUpdate(); | ||
153 | + } | ||
154 | + | ||
155 | + if ("chat".equals(sectionName)) | ||
156 | + { | ||
157 | + this.loader.onBeforeChatRender(); | ||
158 | + } | ||
159 | + | ||
160 | + if ("animateTick".equals(sectionName)) this.tick = true; | ||
161 | + this.sectionStack.add(sectionName); | ||
151 | super.startSection(sectionName); | 162 | super.startSection(sectionName); |
152 | 163 | ||
153 | - if (ofProfiler != null) | 164 | + if (this.ofProfiler != null) |
154 | { | 165 | { |
155 | try | 166 | try |
156 | { | 167 | { |
157 | - ofProfiler.set(mc.gameSettings, true); | 168 | + this.ofProfiler.set(this.mc.gameSettings, true); |
158 | } | 169 | } |
159 | catch (IllegalArgumentException ex) | 170 | catch (IllegalArgumentException ex) |
160 | { | 171 | { |
161 | - ofProfiler = null; | 172 | + this.ofProfiler = null; |
162 | } | 173 | } |
163 | catch (IllegalAccessException ex) | 174 | catch (IllegalAccessException ex) |
164 | { | 175 | { |
165 | - ofProfiler = null; | 176 | + this.ofProfiler = null; |
166 | } | 177 | } |
167 | } | 178 | } |
168 | } | 179 | } |
@@ -175,25 +186,37 @@ public class HookProfiler extends Profiler | @@ -175,25 +186,37 @@ public class HookProfiler extends Profiler | ||
175 | { | 186 | { |
176 | super.endSection(); | 187 | super.endSection(); |
177 | 188 | ||
178 | - String endingSection = sectionStack.size() > 0 ? sectionStack.removeLast() : null; | ||
179 | - String nextSection = sectionStack.size() > 0 ? sectionStack.getLast() : null; | ||
180 | - | ||
181 | - if ("gameRenderer".equals(endingSection) && "root".equals(sectionStack.getLast())) | 189 | + try |
182 | { | 190 | { |
183 | - super.startSection("litetick"); | ||
184 | - | ||
185 | - loader.onTick(this, tick); | ||
186 | - tick = false; | 191 | + String endingSection = this.sectionStack.size() > 0 ? this.sectionStack.removeLast() : null; |
192 | + String nextSection = this.sectionStack.size() > 0 ? this.sectionStack.getLast() : null; | ||
187 | 193 | ||
188 | - super.endSection(); | ||
189 | - } | ||
190 | - else if (("mouse".equals(endingSection) && "gameRenderer".equals(nextSection) && (mc.skipRenderWorld || mc.theWorld == null)) || ("gui".equals(endingSection) && "gameRenderer".equals(nextSection) && mc.theWorld != null)) | ||
191 | - { | ||
192 | - loader.onBeforeGuiRender(); | 194 | + if ("gameRenderer".equals(endingSection) && "root".equals(this.sectionStack.getLast())) |
195 | + { | ||
196 | + super.startSection("litetick"); | ||
197 | + | ||
198 | + this.loader.onTick(this, this.tick); | ||
199 | + this.tick = false; | ||
200 | + | ||
201 | + super.endSection(); | ||
202 | + } | ||
203 | + else if (("mouse".equals(endingSection) && "gameRenderer".equals(nextSection) && (this.mc.skipRenderWorld || this.mc.theWorld == null)) || ("gui".equals(endingSection) && "gameRenderer".equals(nextSection) && this.mc.theWorld != null)) | ||
204 | + { | ||
205 | + this.loader.onBeforeGuiRender(); | ||
206 | + } | ||
207 | + else if ("hand".equals(endingSection) && "level".equals(this.sectionStack.getLast())) | ||
208 | + { | ||
209 | + this.loader.postRender(); | ||
210 | + } | ||
211 | + else if ("chat".equals(endingSection)) | ||
212 | + { | ||
213 | + this.loader.onAfterChatRender(); | ||
214 | + } | ||
193 | } | 215 | } |
194 | - else if ("hand".equals(endingSection) && "level".equals(sectionStack.getLast())) | 216 | + catch (NoSuchElementException ex) |
195 | { | 217 | { |
196 | - loader.postRender(); | 218 | + this.logger.severe("Corrupted Profiler stack detected, this indicates an error with one of your mods."); |
219 | + throw new ProfilerStackCorruptionException("Corrupted Profiler stack detected"); | ||
197 | } | 220 | } |
198 | } | 221 | } |
199 | } | 222 | } |
java/com/mumfrey/liteloader/core/LiteLoader.java
@@ -34,14 +34,23 @@ import java.util.zip.ZipInputStream; | @@ -34,14 +34,23 @@ import java.util.zip.ZipInputStream; | ||
34 | import javax.activity.InvalidActivityException; | 34 | import javax.activity.InvalidActivityException; |
35 | 35 | ||
36 | import net.minecraft.client.Minecraft; | 36 | import net.minecraft.client.Minecraft; |
37 | +import net.minecraft.src.GuiControls; | ||
38 | +import net.minecraft.src.GuiNewChat; | ||
39 | +import net.minecraft.src.GuiScreen; | ||
40 | +import net.minecraft.src.ILogAgent; | ||
41 | +import net.minecraft.src.IPlayerUsage; | ||
37 | import net.minecraft.src.NetHandler; | 42 | import net.minecraft.src.NetHandler; |
38 | import net.minecraft.src.Packet1Login; | 43 | import net.minecraft.src.Packet1Login; |
39 | import net.minecraft.src.Packet3Chat; | 44 | import net.minecraft.src.Packet3Chat; |
45 | +import net.minecraft.src.PlayerUsageSnooper; | ||
40 | import net.minecraft.src.Profiler; | 46 | import net.minecraft.src.Profiler; |
47 | +import net.minecraft.src.ScaledResolution; | ||
41 | import net.minecraft.src.Timer; | 48 | import net.minecraft.src.Timer; |
42 | 49 | ||
43 | import com.mumfrey.liteloader.ChatFilter; | 50 | import com.mumfrey.liteloader.ChatFilter; |
44 | import com.mumfrey.liteloader.ChatListener; | 51 | import com.mumfrey.liteloader.ChatListener; |
52 | +import com.mumfrey.liteloader.ChatRenderListener; | ||
53 | +import com.mumfrey.liteloader.GameLoopListener; | ||
45 | import com.mumfrey.liteloader.InitCompleteListener; | 54 | import com.mumfrey.liteloader.InitCompleteListener; |
46 | import com.mumfrey.liteloader.LiteMod; | 55 | import com.mumfrey.liteloader.LiteMod; |
47 | import com.mumfrey.liteloader.LoginListener; | 56 | import com.mumfrey.liteloader.LoginListener; |
@@ -50,34 +59,35 @@ import com.mumfrey.liteloader.PostRenderListener; | @@ -50,34 +59,35 @@ import com.mumfrey.liteloader.PostRenderListener; | ||
50 | import com.mumfrey.liteloader.PreLoginListener; | 59 | import com.mumfrey.liteloader.PreLoginListener; |
51 | import com.mumfrey.liteloader.RenderListener; | 60 | import com.mumfrey.liteloader.RenderListener; |
52 | import com.mumfrey.liteloader.Tickable; | 61 | import com.mumfrey.liteloader.Tickable; |
62 | +import com.mumfrey.liteloader.gui.GuiControlsPaginated; | ||
53 | import com.mumfrey.liteloader.util.ModUtilities; | 63 | import com.mumfrey.liteloader.util.ModUtilities; |
54 | import com.mumfrey.liteloader.util.PrivateFields; | 64 | import com.mumfrey.liteloader.util.PrivateFields; |
55 | 65 | ||
56 | /** | 66 | /** |
57 | - * LiteLoader is a simple loader which provides tick events to loaded mods | 67 | + * LiteLoader is a simple loader which loads and provides useful callbacks to lightweight mods |
58 | * | 68 | * |
59 | * @author Adam Mummery-Smith | 69 | * @author Adam Mummery-Smith |
60 | - * @version 1.5.1 | 70 | + * @version 1.5.2 |
61 | */ | 71 | */ |
62 | @SuppressWarnings("rawtypes") | 72 | @SuppressWarnings("rawtypes") |
63 | -public final class LiteLoader implements FilenameFilter | 73 | +public final class LiteLoader implements FilenameFilter, IPlayerUsage |
64 | { | 74 | { |
65 | /** | 75 | /** |
66 | * Liteloader version | 76 | * Liteloader version |
67 | */ | 77 | */ |
68 | - private static final String LOADER_VERSION = "1.5.1"; | 78 | + private static final String LOADER_VERSION = "1.5.2"; |
69 | 79 | ||
70 | /** | 80 | /** |
71 | * Loader revision, can be used by mods to determine whether the loader is sufficiently up-to-date | 81 | * Loader revision, can be used by mods to determine whether the loader is sufficiently up-to-date |
72 | */ | 82 | */ |
73 | - private static final int LOADER_REVISION = 8; | 83 | + private static final int LOADER_REVISION = 9; |
74 | 84 | ||
75 | /** | 85 | /** |
76 | * Minecraft versions that we will load mods for, this will be compared | 86 | * Minecraft versions that we will load mods for, this will be compared |
77 | * against the version.txt value in mod files to prevent outdated mods being | 87 | * against the version.txt value in mod files to prevent outdated mods being |
78 | * loaded!!! | 88 | * loaded!!! |
79 | */ | 89 | */ |
80 | - private static final String[] SUPPORTED_VERSIONS = { "1.5.1", "1.5.r2" }; | 90 | + private static final String[] SUPPORTED_VERSIONS = { "1.5.2", "1.5.r1" }; |
81 | 91 | ||
82 | /** | 92 | /** |
83 | * Maximum recursion depth for mod discovery | 93 | * Maximum recursion depth for mod discovery |
@@ -130,6 +140,11 @@ public final class LiteLoader implements FilenameFilter | @@ -130,6 +140,11 @@ public final class LiteLoader implements FilenameFilter | ||
130 | private String branding = null; | 140 | private String branding = null; |
131 | 141 | ||
132 | /** | 142 | /** |
143 | + * Setting value, if true we will swap out the MC "Controls" GUI for our custom, paginated one | ||
144 | + */ | ||
145 | + private boolean paginateControls = true; | ||
146 | + | ||
147 | + /** | ||
133 | * Reference to the minecraft timer | 148 | * Reference to the minecraft timer |
134 | */ | 149 | */ |
135 | private Timer minecraftTimer; | 150 | private Timer minecraftTimer; |
@@ -151,6 +166,11 @@ public final class LiteLoader implements FilenameFilter | @@ -151,6 +166,11 @@ public final class LiteLoader implements FilenameFilter | ||
151 | private LinkedList<Tickable> tickListeners = new LinkedList<Tickable>(); | 166 | private LinkedList<Tickable> tickListeners = new LinkedList<Tickable>(); |
152 | 167 | ||
153 | /** | 168 | /** |
169 | + * List of mods which implement the GameLoopListener interface and will receive loop events | ||
170 | + */ | ||
171 | + private LinkedList<GameLoopListener> loopListeners = new LinkedList<GameLoopListener>(); | ||
172 | + | ||
173 | + /** | ||
154 | * | 174 | * |
155 | */ | 175 | */ |
156 | private LinkedList<InitCompleteListener> initListeners = new LinkedList<InitCompleteListener>(); | 176 | private LinkedList<InitCompleteListener> initListeners = new LinkedList<InitCompleteListener>(); |
@@ -167,6 +187,11 @@ public final class LiteLoader implements FilenameFilter | @@ -167,6 +187,11 @@ public final class LiteLoader implements FilenameFilter | ||
167 | private LinkedList<PostRenderListener> postRenderListeners = new LinkedList<PostRenderListener>(); | 187 | private LinkedList<PostRenderListener> postRenderListeners = new LinkedList<PostRenderListener>(); |
168 | 188 | ||
169 | /** | 189 | /** |
190 | + * List of mods which implement ChatRenderListener and want to know when chat is rendered | ||
191 | + */ | ||
192 | + private LinkedList<ChatRenderListener> chatRenderListeners = new LinkedList<ChatRenderListener>(); | ||
193 | + | ||
194 | + /** | ||
170 | * List of mods which implement ChatListener interface and will receive chat | 195 | * List of mods which implement ChatListener interface and will receive chat |
171 | * events | 196 | * events |
172 | */ | 197 | */ |
@@ -212,6 +237,16 @@ public final class LiteLoader implements FilenameFilter | @@ -212,6 +237,16 @@ public final class LiteLoader implements FilenameFilter | ||
212 | * Flags which keep track of whether hooks have been applied | 237 | * Flags which keep track of whether hooks have been applied |
213 | */ | 238 | */ |
214 | private boolean chatHooked, loginHooked, pluginChannelHooked, tickHooked; | 239 | private boolean chatHooked, loginHooked, pluginChannelHooked, tickHooked; |
240 | + | ||
241 | + /** | ||
242 | + * Profiler hook objects | ||
243 | + */ | ||
244 | + private HookProfiler profilerHook = new HookProfiler(this, logger); | ||
245 | + | ||
246 | + /** | ||
247 | + * ScaledResolution used by the pre-chat and post-chat render callbacks | ||
248 | + */ | ||
249 | + private ScaledResolution currentResolution; | ||
215 | 250 | ||
216 | /** | 251 | /** |
217 | * Get the singleton instance of LiteLoader, initialises the loader if necessary | 252 | * Get the singleton instance of LiteLoader, initialises the loader if necessary |
@@ -399,6 +434,9 @@ public final class LiteLoader implements FilenameFilter | @@ -399,6 +434,9 @@ public final class LiteLoader implements FilenameFilter | ||
399 | // Prepare the log writer | 434 | // Prepare the log writer |
400 | this.prepareLogger(); | 435 | this.prepareLogger(); |
401 | 436 | ||
437 | + this.paginateControls = this.localProperties.getProperty("controls.pages", "true").equalsIgnoreCase("true"); | ||
438 | + this.localProperties.setProperty("controls.pages", String.valueOf(this.paginateControls)); | ||
439 | + | ||
402 | this.branding = this.internalProperties.getProperty("brand", null); | 440 | this.branding = this.internalProperties.getProperty("brand", null); |
403 | if (this.branding != null && this.branding.length() < 1) this.branding = null; | 441 | if (this.branding != null && this.branding.length() < 1) this.branding = null; |
404 | 442 | ||
@@ -652,7 +690,7 @@ public final class LiteLoader implements FilenameFilter | @@ -652,7 +690,7 @@ public final class LiteLoader implements FilenameFilter | ||
652 | versionReader.close(); | 690 | versionReader.close(); |
653 | 691 | ||
654 | // Only add the mod if the version matches and we were able to successfully add it to the class path | 692 | // Only add the mod if the version matches and we were able to successfully add it to the class path |
655 | - if (supportedVerions.contains(strVersion) && addURLToClassPath(modFile.toURI().toURL())) | 693 | + if (supportedVerions.contains(strVersion) && this.addURLToClassPath(modFile.toURI().toURL())) |
656 | { | 694 | { |
657 | modFiles.add(modFile); | 695 | modFiles.add(modFile); |
658 | } | 696 | } |
@@ -834,7 +872,7 @@ public final class LiteLoader implements FilenameFilter | @@ -834,7 +872,7 @@ public final class LiteLoader implements FilenameFilter | ||
834 | this.loadedModsList = ""; | 872 | this.loadedModsList = ""; |
835 | int loadedModsCount = 0; | 873 | int loadedModsCount = 0; |
836 | 874 | ||
837 | - for (Iterator<LiteMod> iter = mods.iterator(); iter.hasNext();) | 875 | + for (Iterator<LiteMod> iter = this.mods.iterator(); iter.hasNext();) |
838 | { | 876 | { |
839 | LiteMod mod = iter.next(); | 877 | LiteMod mod = iter.next(); |
840 | 878 | ||
@@ -848,6 +886,11 @@ public final class LiteLoader implements FilenameFilter | @@ -848,6 +886,11 @@ public final class LiteLoader implements FilenameFilter | ||
848 | { | 886 | { |
849 | this.addTickListener((Tickable)mod); | 887 | this.addTickListener((Tickable)mod); |
850 | } | 888 | } |
889 | + | ||
890 | + if (mod instanceof GameLoopListener) | ||
891 | + { | ||
892 | + this.addLoopListener((GameLoopListener)mod); | ||
893 | + } | ||
851 | 894 | ||
852 | if (mod instanceof InitCompleteListener) | 895 | if (mod instanceof InitCompleteListener) |
853 | { | 896 | { |
@@ -881,6 +924,11 @@ public final class LiteLoader implements FilenameFilter | @@ -881,6 +924,11 @@ public final class LiteLoader implements FilenameFilter | ||
881 | } | 924 | } |
882 | } | 925 | } |
883 | 926 | ||
927 | + if (mod instanceof ChatRenderListener) | ||
928 | + { | ||
929 | + this.addChatRenderListener((ChatRenderListener)mod); | ||
930 | + } | ||
931 | + | ||
884 | if (mod instanceof PreLoginListener) | 932 | if (mod instanceof PreLoginListener) |
885 | { | 933 | { |
886 | this.addPreLoginListener((PreLoginListener)mod); | 934 | this.addPreLoginListener((PreLoginListener)mod); |
@@ -944,8 +992,12 @@ public final class LiteLoader implements FilenameFilter | @@ -944,8 +992,12 @@ public final class LiteLoader implements FilenameFilter | ||
944 | if (!this.tickHooked) | 992 | if (!this.tickHooked) |
945 | { | 993 | { |
946 | this.tickHooked = true; | 994 | this.tickHooked = true; |
947 | - PrivateFields.minecraftProfiler.setFinal(this.minecraft, new HookProfiler(this, logger)); | 995 | + PrivateFields.minecraftProfiler.setFinal(this.minecraft, this.profilerHook); |
948 | } | 996 | } |
997 | + | ||
998 | + // Sanity hook | ||
999 | + PlayerUsageSnooper snooper = this.minecraft.getPlayerUsageSnooper(); | ||
1000 | + PrivateFields.playerStatsCollector.setFinal(snooper, this); | ||
949 | } | 1001 | } |
950 | catch (Exception ex) | 1002 | catch (Exception ex) |
951 | { | 1003 | { |
@@ -967,6 +1019,18 @@ public final class LiteLoader implements FilenameFilter | @@ -967,6 +1019,18 @@ public final class LiteLoader implements FilenameFilter | ||
967 | } | 1019 | } |
968 | 1020 | ||
969 | /** | 1021 | /** |
1022 | + * @param loopListener | ||
1023 | + */ | ||
1024 | + public void addLoopListener(GameLoopListener loopListener) | ||
1025 | + { | ||
1026 | + if (!this.loopListeners.contains(loopListener)) | ||
1027 | + { | ||
1028 | + this.loopListeners.add(loopListener); | ||
1029 | + if (this.loaderStartupComplete) this.initHooks(); | ||
1030 | + } | ||
1031 | + } | ||
1032 | + | ||
1033 | + /** | ||
970 | * @param initCompleteListener | 1034 | * @param initCompleteListener |
971 | */ | 1035 | */ |
972 | public void addInitListener(InitCompleteListener initCompleteListener) | 1036 | public void addInitListener(InitCompleteListener initCompleteListener) |
@@ -1025,6 +1089,18 @@ public final class LiteLoader implements FilenameFilter | @@ -1025,6 +1089,18 @@ public final class LiteLoader implements FilenameFilter | ||
1025 | if (this.loaderStartupComplete) this.initHooks(); | 1089 | if (this.loaderStartupComplete) this.initHooks(); |
1026 | } | 1090 | } |
1027 | } | 1091 | } |
1092 | + | ||
1093 | + /** | ||
1094 | + * @param chatRenderListener | ||
1095 | + */ | ||
1096 | + public void addChatRenderListener(ChatRenderListener chatRenderListener) | ||
1097 | + { | ||
1098 | + if (!this.chatRenderListeners.contains(chatRenderListener)) | ||
1099 | + { | ||
1100 | + this.chatRenderListeners.add(chatRenderListener); | ||
1101 | + if (this.loaderStartupComplete) this.initHooks(); | ||
1102 | + } | ||
1103 | + } | ||
1028 | 1104 | ||
1029 | /** | 1105 | /** |
1030 | * @param loginListener | 1106 | * @param loginListener |
@@ -1261,6 +1337,17 @@ public final class LiteLoader implements FilenameFilter | @@ -1261,6 +1337,17 @@ public final class LiteLoader implements FilenameFilter | ||
1261 | */ | 1337 | */ |
1262 | public void onRender() | 1338 | public void onRender() |
1263 | { | 1339 | { |
1340 | + if (this.paginateControls && this.minecraft.currentScreen != null && this.minecraft.currentScreen.getClass().equals(GuiControls.class)) | ||
1341 | + { | ||
1342 | + try | ||
1343 | + { | ||
1344 | + // Try to get the parent screen entry from the existing screen | ||
1345 | + GuiScreen parentScreen = PrivateFields.guiControlsParentScreen.get((GuiControls)this.minecraft.currentScreen); | ||
1346 | + this.minecraft.displayGuiScreen(new GuiControlsPaginated(parentScreen, this.minecraft.gameSettings)); | ||
1347 | + } | ||
1348 | + catch (Exception ex) { } | ||
1349 | + } | ||
1350 | + | ||
1264 | for (RenderListener renderListener : this.renderListeners) | 1351 | for (RenderListener renderListener : this.renderListeners) |
1265 | renderListener.onRender(); | 1352 | renderListener.onRender(); |
1266 | } | 1353 | } |
@@ -1304,6 +1391,44 @@ public final class LiteLoader implements FilenameFilter | @@ -1304,6 +1391,44 @@ public final class LiteLoader implements FilenameFilter | ||
1304 | for (RenderListener renderListener : this.renderListeners) | 1391 | for (RenderListener renderListener : this.renderListeners) |
1305 | renderListener.onSetupCameraTransform(); | 1392 | renderListener.onSetupCameraTransform(); |
1306 | } | 1393 | } |
1394 | + | ||
1395 | + /** | ||
1396 | + * Called immediately before the chat log is rendered | ||
1397 | + */ | ||
1398 | + public void onBeforeChatRender() | ||
1399 | + { | ||
1400 | + this.currentResolution = new ScaledResolution(this.minecraft.gameSettings, this.minecraft.displayWidth, this.minecraft.displayHeight); | ||
1401 | + int screenWidth = this.currentResolution.getScaledWidth(); | ||
1402 | + int screenHeight = this.currentResolution.getScaledHeight(); | ||
1403 | + | ||
1404 | + GuiNewChat chat = this.minecraft.ingameGUI.getChatGUI(); | ||
1405 | + | ||
1406 | + for (ChatRenderListener chatRenderListener : this.chatRenderListeners) | ||
1407 | + chatRenderListener.onPreRenderChat(screenWidth, screenHeight, chat); | ||
1408 | + } | ||
1409 | + | ||
1410 | + /** | ||
1411 | + * Called immediately after the chat log is rendered | ||
1412 | + */ | ||
1413 | + public void onAfterChatRender() | ||
1414 | + { | ||
1415 | + int screenWidth = this.currentResolution.getScaledWidth(); | ||
1416 | + int screenHeight = this.currentResolution.getScaledHeight(); | ||
1417 | + | ||
1418 | + GuiNewChat chat = this.minecraft.ingameGUI.getChatGUI(); | ||
1419 | + | ||
1420 | + for (ChatRenderListener chatRenderListener : this.chatRenderListeners) | ||
1421 | + chatRenderListener.onPostRenderChat(screenWidth, screenHeight, chat); | ||
1422 | + } | ||
1423 | + | ||
1424 | + /** | ||
1425 | + * Callback from the tick hook, called every frame when the timer is updated | ||
1426 | + */ | ||
1427 | + public void onTimerUpdate() | ||
1428 | + { | ||
1429 | + for (GameLoopListener loopListener : this.loopListeners) | ||
1430 | + loopListener.onRunGameLoop(this.minecraft); | ||
1431 | + } | ||
1307 | 1432 | ||
1308 | /** | 1433 | /** |
1309 | * Callback from the tick hook, ticks all tickable mods | 1434 | * Callback from the tick hook, ticks all tickable mods |
@@ -1323,7 +1448,7 @@ public final class LiteLoader implements FilenameFilter | @@ -1323,7 +1448,7 @@ public final class LiteLoader implements FilenameFilter | ||
1323 | // Hooray, we got the timer reference | 1448 | // Hooray, we got the timer reference |
1324 | if (this.minecraftTimer != null) | 1449 | if (this.minecraftTimer != null) |
1325 | { | 1450 | { |
1326 | - partialTicks = this.minecraftTimer.elapsedPartialTicks; | 1451 | + partialTicks = this.minecraftTimer.renderPartialTicks; |
1327 | tick = this.minecraftTimer.elapsedTicks > 0; | 1452 | tick = this.minecraftTimer.elapsedTicks > 0; |
1328 | } | 1453 | } |
1329 | 1454 | ||
@@ -1389,7 +1514,7 @@ public final class LiteLoader implements FilenameFilter | @@ -1389,7 +1514,7 @@ public final class LiteLoader implements FilenameFilter | ||
1389 | for (LoginListener loginListener : this.loginListeners) | 1514 | for (LoginListener loginListener : this.loginListeners) |
1390 | loginListener.onLogin(netHandler, loginPacket); | 1515 | loginListener.onLogin(netHandler, loginPacket); |
1391 | 1516 | ||
1392 | - setupPluginChannels(); | 1517 | + this.setupPluginChannels(); |
1393 | } | 1518 | } |
1394 | 1519 | ||
1395 | /** | 1520 | /** |
@@ -1468,7 +1593,55 @@ public final class LiteLoader implements FilenameFilter | @@ -1468,7 +1593,55 @@ public final class LiteLoader implements FilenameFilter | ||
1468 | 1593 | ||
1469 | byte[] registrationData = channelList.toString().getBytes(Charset.forName("UTF8")); | 1594 | byte[] registrationData = channelList.toString().getBytes(Charset.forName("UTF8")); |
1470 | 1595 | ||
1471 | - sendPluginChannelMessage("REGISTER", registrationData); | 1596 | + this.sendPluginChannelMessage("REGISTER", registrationData); |
1597 | + } | ||
1598 | + } | ||
1599 | + | ||
1600 | + /* (non-Javadoc) | ||
1601 | + * @see net.minecraft.src.IPlayerUsage#addServerStatsToSnooper(net.minecraft.src.PlayerUsageSnooper) | ||
1602 | + */ | ||
1603 | + @Override | ||
1604 | + public void addServerStatsToSnooper(PlayerUsageSnooper var1) | ||
1605 | + { | ||
1606 | + this.minecraft.addServerStatsToSnooper(var1); | ||
1607 | + } | ||
1608 | + | ||
1609 | + /* (non-Javadoc) | ||
1610 | + * @see net.minecraft.src.IPlayerUsage#addServerTypeToSnooper(net.minecraft.src.PlayerUsageSnooper) | ||
1611 | + */ | ||
1612 | + @Override | ||
1613 | + public void addServerTypeToSnooper(PlayerUsageSnooper var1) | ||
1614 | + { | ||
1615 | + this.sanityCheck(); | ||
1616 | + this.minecraft.addServerTypeToSnooper(var1); | ||
1617 | + } | ||
1618 | + | ||
1619 | + /* (non-Javadoc) | ||
1620 | + * @see net.minecraft.src.IPlayerUsage#isSnooperEnabled() | ||
1621 | + */ | ||
1622 | + @Override | ||
1623 | + public boolean isSnooperEnabled() | ||
1624 | + { | ||
1625 | + return this.minecraft.isSnooperEnabled(); | ||
1626 | + } | ||
1627 | + | ||
1628 | + /* (non-Javadoc) | ||
1629 | + * @see net.minecraft.src.IPlayerUsage#getLogAgent() | ||
1630 | + */ | ||
1631 | + @Override | ||
1632 | + public ILogAgent getLogAgent() | ||
1633 | + { | ||
1634 | + return this.minecraft.getLogAgent(); | ||
1635 | + } | ||
1636 | + | ||
1637 | + /** | ||
1638 | + * Check that the profiler hook hasn't been overridden by something else | ||
1639 | + */ | ||
1640 | + private void sanityCheck() | ||
1641 | + { | ||
1642 | + if (this.tickHooked && this.minecraft.mcProfiler != this.profilerHook) | ||
1643 | + { | ||
1644 | + PrivateFields.minecraftProfiler.setFinal(this.minecraft, this.profilerHook); | ||
1472 | } | 1645 | } |
1473 | } | 1646 | } |
1474 | } | 1647 | } |
1475 | \ No newline at end of file | 1648 | \ No newline at end of file |
java/com/mumfrey/liteloader/core/ProfilerStackCorruptionException.java
0 → 100644
1 | +package com.mumfrey.liteloader.core; | ||
2 | + | ||
3 | +/** | ||
4 | + * Exception to throw when a mod corrupts the profiler stack, this avoids throwing a | ||
5 | + * (somewhat cryptic) NoSuchElementException inside HookProfiler | ||
6 | + * | ||
7 | + * @author Adam Mummery-Smith | ||
8 | + */ | ||
9 | +public class ProfilerStackCorruptionException extends RuntimeException | ||
10 | +{ | ||
11 | + /** | ||
12 | + * | ||
13 | + */ | ||
14 | + private static final long serialVersionUID = -7745831270297368169L; | ||
15 | + | ||
16 | + public ProfilerStackCorruptionException(String message) | ||
17 | + { | ||
18 | + super(message); | ||
19 | + } | ||
20 | +} |
java/com/mumfrey/liteloader/gui/GuiControlsPaginated.java
0 → 100644
1 | +package com.mumfrey.liteloader.gui; | ||
2 | + | ||
3 | +import java.util.List; | ||
4 | + | ||
5 | +import net.minecraft.src.GameSettings; | ||
6 | +import net.minecraft.src.GuiButton; | ||
7 | +import net.minecraft.src.GuiScreen; | ||
8 | +import net.minecraft.src.GuiSmallButton; | ||
9 | +import net.minecraft.src.KeyBinding; | ||
10 | +import net.minecraft.src.StringTranslate; | ||
11 | + | ||
12 | +/** | ||
13 | + * Extended "Controls" screen with pages | ||
14 | + * | ||
15 | + * @author Adam Mummery-Smith | ||
16 | + */ | ||
17 | +public class GuiControlsPaginated extends GuiScreen | ||
18 | +{ | ||
19 | + /** | ||
20 | + * Pagination variables | ||
21 | + */ | ||
22 | + protected int controlsPerPage, startIndex, endIndex; | ||
23 | + | ||
24 | + /** | ||
25 | + * Parent screen which will be displayed when this screen is closed | ||
26 | + */ | ||
27 | + protected GuiScreen parentScreen; | ||
28 | + | ||
29 | + /** | ||
30 | + * Game settings | ||
31 | + */ | ||
32 | + protected GameSettings gameSettings; | ||
33 | + | ||
34 | + /** | ||
35 | + * Additional buttons | ||
36 | + */ | ||
37 | + protected GuiButton btnNext, btnPrevious; | ||
38 | + | ||
39 | + /** | ||
40 | + * Title to display | ||
41 | + */ | ||
42 | + protected String screenTitle = "Controls"; | ||
43 | + | ||
44 | + /** | ||
45 | + * ID of the button currently being edited | ||
46 | + */ | ||
47 | + protected int activeButtonId = -1; | ||
48 | + | ||
49 | + public GuiControlsPaginated(GuiScreen parentScreen, GameSettings gameSettings) | ||
50 | + { | ||
51 | + this.parentScreen = parentScreen; | ||
52 | + this.gameSettings = gameSettings; | ||
53 | + | ||
54 | + // Pagination defaults | ||
55 | + this.controlsPerPage = 14; | ||
56 | + this.endIndex = this.gameSettings.keyBindings.length - (this.gameSettings.keyBindings.length % this.controlsPerPage == 0 ? this.controlsPerPage : this.gameSettings.keyBindings.length % this.controlsPerPage); | ||
57 | + } | ||
58 | + | ||
59 | + @SuppressWarnings("unchecked") | ||
60 | + protected List<GuiButton> getLegacyControlList() | ||
61 | + { | ||
62 | + return this.buttonList; | ||
63 | + } | ||
64 | + | ||
65 | + protected final int getHeight() | ||
66 | + { | ||
67 | + return this.height; | ||
68 | + } | ||
69 | + | ||
70 | + protected final int getWidth() | ||
71 | + { | ||
72 | + return this.width; | ||
73 | + } | ||
74 | + | ||
75 | + public GuiScreen getParentScreen() | ||
76 | + { | ||
77 | + return this.parentScreen; | ||
78 | + } | ||
79 | + | ||
80 | + /** | ||
81 | + * Initialise this GUI, called when the GUI is created | ||
82 | + */ | ||
83 | + @Override | ||
84 | + public void initGui() | ||
85 | + { | ||
86 | + StringTranslate stringtranslate = StringTranslate.getInstance(); | ||
87 | + this.getLegacyControlList().clear(); | ||
88 | + | ||
89 | + int oldControlsPerPage = this.controlsPerPage; | ||
90 | + this.controlsPerPage = ((this.getHeight() - 70) / 24) * 2; | ||
91 | + this.endIndex = this.gameSettings.keyBindings.length - (this.gameSettings.keyBindings.length % this.controlsPerPage == 0 ? this.controlsPerPage : this.gameSettings.keyBindings.length % this.controlsPerPage); | ||
92 | + if (oldControlsPerPage != this.controlsPerPage) this.startIndex = 0; | ||
93 | + | ||
94 | + for (int controlId = 0; controlId < this.gameSettings.keyBindings.length; controlId++) | ||
95 | + { | ||
96 | + boolean buttonVisible = controlId >= this.startIndex && controlId < this.startIndex + this.controlsPerPage; | ||
97 | + int left = buttonVisible ? this.getWidth() / 2 - 155 : this.getWidth() + 10000; | ||
98 | + int top = this.getHeight() / 6 + 24 * ((controlId - this.startIndex) >> 1); | ||
99 | + this.getLegacyControlList().add(new GuiSmallButton(controlId, left + ((controlId - this.startIndex) % 2) * 160, top, 70, 20, this.gameSettings.getOptionDisplayString(controlId))); | ||
100 | + } | ||
101 | + | ||
102 | + int buttonY = this.getHeight() / 6 + (this.controlsPerPage >> 1) * 24; | ||
103 | + | ||
104 | + // Only bother paginating if there are too many controls to display | ||
105 | + if (this.gameSettings.keyBindings.length > this.controlsPerPage) | ||
106 | + { | ||
107 | + this.getLegacyControlList().add(this.btnNext = new GuiButton(201, this.getWidth() / 2 - 51, buttonY, 50, 20, ">>")); | ||
108 | + this.getLegacyControlList().add(this.btnPrevious = new GuiButton(202, this.getWidth() / 2 - 103, buttonY, 50, 20, "<<")); | ||
109 | + this.getLegacyControlList().add(new GuiButton(200, this.getWidth() / 2 + 1, buttonY, 100, 20, stringtranslate.translateKey("gui.done"))); | ||
110 | + | ||
111 | + this.btnNext.enabled = this.startIndex < this.endIndex; | ||
112 | + this.btnPrevious.enabled = this.startIndex > 0; | ||
113 | + } | ||
114 | + else | ||
115 | + { | ||
116 | + this.getLegacyControlList().add(new GuiButton(200, this.getWidth() / 2 - 100, buttonY, stringtranslate.translateKey("gui.done"))); | ||
117 | + } | ||
118 | + | ||
119 | + this.screenTitle = stringtranslate.translateKey("controls.title"); | ||
120 | + } | ||
121 | + | ||
122 | + /** | ||
123 | + * @param controlId | ||
124 | + * @return | ||
125 | + */ | ||
126 | + protected String getKeybindDescription(int controlId) | ||
127 | + { | ||
128 | + return this.gameSettings.getKeyBindingDescription(controlId); | ||
129 | + } | ||
130 | + | ||
131 | + /** | ||
132 | + * A button was clicked, deal with it | ||
133 | + * | ||
134 | + * @param guibutton Button which was clicked | ||
135 | + */ | ||
136 | + @Override | ||
137 | + protected void actionPerformed(GuiButton guibutton) | ||
138 | + { | ||
139 | + // Update the button labels with the appropriate key names | ||
140 | + for(int i = 0; i < this.gameSettings.keyBindings.length; i++) | ||
141 | + { | ||
142 | + this.getLegacyControlList().get(i).displayString = this.gameSettings.getOptionDisplayString(i); | ||
143 | + } | ||
144 | + | ||
145 | + if (guibutton.id == 200) // Done button | ||
146 | + { | ||
147 | + this.mc.displayGuiScreen(this.parentScreen); | ||
148 | + } | ||
149 | + else if (guibutton.id == 201) // Next button | ||
150 | + { | ||
151 | + this.startIndex += this.controlsPerPage; | ||
152 | + this.startIndex = Math.min(this.endIndex, this.startIndex); | ||
153 | + this.initGui(); | ||
154 | + } | ||
155 | + else if (guibutton.id == 202) // Previous button | ||
156 | + { | ||
157 | + this.startIndex -= this.controlsPerPage; | ||
158 | + this.startIndex = Math.max(0, this.startIndex); | ||
159 | + this.initGui(); | ||
160 | + } | ||
161 | + else | ||
162 | + { | ||
163 | + this.activeButtonId = guibutton.id; | ||
164 | + guibutton.displayString = String.format("> %s <", this.gameSettings.getOptionDisplayString(guibutton.id)); | ||
165 | + } | ||
166 | + } | ||
167 | + | ||
168 | + @Override | ||
169 | + protected void mouseClicked(int mouseX, int mouseY, int mouseButton) | ||
170 | + { | ||
171 | + if (this.activeButtonId >= 0) | ||
172 | + { | ||
173 | + this.gameSettings.setKeyBinding(this.activeButtonId, -100 + mouseButton); | ||
174 | + this.getLegacyControlList().get(this.activeButtonId).displayString = this.gameSettings.getOptionDisplayString(this.activeButtonId); | ||
175 | + this.activeButtonId = -1; | ||
176 | + KeyBinding.resetKeyBindingArrayAndHash(); | ||
177 | + } | ||
178 | + else | ||
179 | + { | ||
180 | + super.mouseClicked(mouseX, mouseY, mouseButton); | ||
181 | + } | ||
182 | + } | ||
183 | + | ||
184 | + @Override | ||
185 | + protected void keyTyped(char keyChar, int keyCode) | ||
186 | + { | ||
187 | + if (this.activeButtonId >= 0) | ||
188 | + { | ||
189 | + this.gameSettings.setKeyBinding(this.activeButtonId, keyCode); | ||
190 | + this.getLegacyControlList().get(this.activeButtonId).displayString = this.gameSettings.getOptionDisplayString(this.activeButtonId); | ||
191 | + this.activeButtonId = -1; | ||
192 | + KeyBinding.resetKeyBindingArrayAndHash(); | ||
193 | + } | ||
194 | + else | ||
195 | + { | ||
196 | + super.keyTyped(keyChar, keyCode); | ||
197 | + } | ||
198 | + } | ||
199 | + | ||
200 | + @Override | ||
201 | + public void drawScreen(int mouseX, int mouseY, float partialTick) | ||
202 | + { | ||
203 | + this.drawDefaultBackground(); | ||
204 | + this.drawCenteredString(this.fontRenderer, this.screenTitle, this.width / 2, 20, 0xffffff); | ||
205 | + | ||
206 | + // Draw key labels | ||
207 | + for (int controlId = 0; controlId < this.gameSettings.keyBindings.length; controlId++) | ||
208 | + { | ||
209 | + boolean conflict = false; | ||
210 | + | ||
211 | + for (int id = 0; id < this.gameSettings.keyBindings.length; id++) | ||
212 | + { | ||
213 | + if (id != controlId && this.gameSettings.keyBindings[controlId].keyCode == this.gameSettings.keyBindings[id].keyCode) | ||
214 | + { | ||
215 | + conflict = true; | ||
216 | + break; | ||
217 | + } | ||
218 | + } | ||
219 | + | ||
220 | + if (this.activeButtonId == controlId) | ||
221 | + { | ||
222 | + this.getLegacyControlList().get(controlId).displayString = "\247f> \247e??? \247f<"; | ||
223 | + } | ||
224 | + else if (conflict) | ||
225 | + { | ||
226 | + this.getLegacyControlList().get(controlId).displayString = "\247c" + this.gameSettings.getOptionDisplayString(controlId); | ||
227 | + } | ||
228 | + else | ||
229 | + { | ||
230 | + this.getLegacyControlList().get(controlId).displayString = this.gameSettings.getOptionDisplayString(controlId); | ||
231 | + } | ||
232 | + | ||
233 | + int left = (controlId >= this.startIndex && controlId < this.startIndex + this.controlsPerPage) ? this.getWidth() / 2 - 155 : this.getWidth() + 10000; | ||
234 | + this.drawString(this.fontRenderer, this.getKeybindDescription(controlId), left + ((controlId - this.startIndex) % 2) * 160 + 70 + 6, this.getHeight() / 6 + 24 * ((controlId - this.startIndex) >> 1) + 7, 0xFFFFFF); | ||
235 | + } | ||
236 | + | ||
237 | + super.drawScreen(mouseX, mouseY, partialTick); | ||
238 | + } | ||
239 | +} | ||
0 | \ No newline at end of file | 240 | \ No newline at end of file |
java/com/mumfrey/liteloader/util/PrivateFields.java
@@ -15,7 +15,7 @@ import net.minecraft.src.*; | @@ -15,7 +15,7 @@ import net.minecraft.src.*; | ||
15 | * @param <P> Parent class type, the type of the class that owns the field | 15 | * @param <P> Parent class type, the type of the class that owns the field |
16 | * @param <T> Field type, the type of the field value | 16 | * @param <T> Field type, the type of the field value |
17 | * | 17 | * |
18 | - * TODO Obfuscation - updated 1.5.1 | 18 | + * TODO Obfuscation - updated 1.5.2 |
19 | */ | 19 | */ |
20 | @SuppressWarnings("rawtypes") | 20 | @SuppressWarnings("rawtypes") |
21 | public class PrivateFields<P, T> | 21 | public class PrivateFields<P, T> |
@@ -132,6 +132,7 @@ public class PrivateFields<P, T> | @@ -132,6 +132,7 @@ public class PrivateFields<P, T> | ||
132 | */ | 132 | */ |
133 | public static final class StaticFields<P, T> extends PrivateFields<P, T> | 133 | public static final class StaticFields<P, T> extends PrivateFields<P, T> |
134 | { | 134 | { |
135 | + @SuppressWarnings("synthetic-access") | ||
135 | public StaticFields(Class<P> owner, String mcpName, String name, String fmlName) { super(owner, mcpName, name, fmlName); } | 136 | public StaticFields(Class<P> owner, String mcpName, String name, String fmlName) { super(owner, mcpName, name, fmlName); } |
136 | public T get() { return get(null); } | 137 | public T get() { return get(null); } |
137 | public void set(T value) { set(null, value); } | 138 | public void set(T value) { set(null, value); } |
@@ -140,8 +141,10 @@ public class PrivateFields<P, T> | @@ -140,8 +141,10 @@ public class PrivateFields<P, T> | ||
140 | public static final StaticFields<TileEntity, Map> tileEntityNameToClassMap = new StaticFields<TileEntity, Map> (TileEntity.class, "nameToClassMap", "a", "field_70326_a"); // TileEntity/nameToClassMap | 141 | public static final StaticFields<TileEntity, Map> tileEntityNameToClassMap = new StaticFields<TileEntity, Map> (TileEntity.class, "nameToClassMap", "a", "field_70326_a"); // TileEntity/nameToClassMap |
141 | } | 142 | } |
142 | 143 | ||
143 | - public static final PrivateFields<Minecraft, Timer> minecraftTimer = new PrivateFields<Minecraft, Timer> (Minecraft.class, "timer", "V", "field_71428_T"); // Minecraft/timer | ||
144 | - public static final PrivateFields<Minecraft, Profiler> minecraftProfiler = new PrivateFields<Minecraft, Profiler> (Minecraft.class, "mcProfiler", "J", "field_71424_I"); // Minecraft/mcProfiler | ||
145 | - public static final PrivateFields<RenderManager, Map> entityRenderMap = new PrivateFields<RenderManager, Map> (RenderManager.class, "entityRenderMap", "q", "field_78729_o"); // RenderManager/entityRenderMap | 144 | + public static final PrivateFields<Minecraft, Timer> minecraftTimer = new PrivateFields<Minecraft, Timer> (Minecraft.class, "timer", "V", "field_71428_T"); // Minecraft/timer |
145 | + public static final PrivateFields<Minecraft, Profiler> minecraftProfiler = new PrivateFields<Minecraft, Profiler> (Minecraft.class, "mcProfiler", "J", "field_71424_I"); // Minecraft/mcProfiler | ||
146 | + public static final PrivateFields<RenderManager, Map> entityRenderMap = new PrivateFields<RenderManager, Map> (RenderManager.class, "entityRenderMap", "q", "field_78729_o"); // RenderManager/entityRenderMap | ||
147 | + public static final PrivateFields<GuiControls, GuiScreen> guiControlsParentScreen = new PrivateFields<GuiControls, GuiScreen> (GuiControls.class, "parentScreen", "b", "field_73909_b"); // GuiControls/parentScreen | ||
148 | + public static final PrivateFields<PlayerUsageSnooper, IPlayerUsage> playerStatsCollector = new PrivateFields<PlayerUsageSnooper, IPlayerUsage>(PlayerUsageSnooper.class, "playerStatsCollector", "d", "field_76478_d"); // PlayerUsageSnooper/playerStatsCollector | ||
146 | } | 149 | } |
147 | 150 |