Commit 189931b8aae31a0b6aca5704340600fb35499d27
1 parent
d34ad93d
added 2 new listeners, some refactoring and minor bugfixes
Showing
29 changed files
with
398 additions
and
209 deletions
debug/obfuscation.properties
| @@ -24,4 +24,8 @@ func_147612_c=bindFramebufferTexture | @@ -24,4 +24,8 @@ func_147612_c=bindFramebufferTexture | ||
| 24 | func_146230_a=drawChat | 24 | func_146230_a=drawChat |
| 25 | func_179086_m=clear | 25 | func_179086_m=clear |
| 26 | func_175068_a=renderWorldPass | 26 | func_175068_a=renderWorldPass |
| 27 | -func_148256_e=getProfile | ||
| 28 | \ No newline at end of file | 27 | \ No newline at end of file |
| 28 | +func_148256_e=getProfile | ||
| 29 | +func_148260_a=saveScreenshot | ||
| 30 | +func_148822_b=isFramebufferEnabled | ||
| 31 | +func_147939_a=doRenderEntity | ||
| 32 | +func_76986_a=doRender | ||
| 29 | \ No newline at end of file | 33 | \ No newline at end of file |
java/client/com/mumfrey/liteloader/ChatFilter.java
| 1 | package com.mumfrey.liteloader; | 1 | package com.mumfrey.liteloader; |
| 2 | 2 | ||
| 3 | -import net.minecraft.network.play.server.S02PacketChat; | 3 | +import com.mumfrey.liteloader.core.LiteLoaderEventBroker.ReturnValue; |
| 4 | + | ||
| 4 | import net.minecraft.util.IChatComponent; | 5 | import net.minecraft.util.IChatComponent; |
| 5 | 6 | ||
| 6 | 7 | ||
| @@ -14,10 +15,11 @@ public interface ChatFilter extends LiteMod | @@ -14,10 +15,11 @@ public interface ChatFilter extends LiteMod | ||
| 14 | /** | 15 | /** |
| 15 | * Chat filter function, return false to filter this packet, true to pass the packet | 16 | * Chat filter function, return false to filter this packet, true to pass the packet |
| 16 | * | 17 | * |
| 17 | - * @param chatPacket Chat packet to examine | ||
| 18 | * @param chat ChatMessageComponent parsed from the chat packet | 18 | * @param chat ChatMessageComponent parsed from the chat packet |
| 19 | * @param message Chat message parsed from the chat message component | 19 | * @param message Chat message parsed from the chat message component |
| 20 | + * @param newMessage If you wish to mutate the message, set the value using newMessage.set() | ||
| 21 | + * | ||
| 20 | * @return True to keep the packet, false to discard | 22 | * @return True to keep the packet, false to discard |
| 21 | */ | 23 | */ |
| 22 | - public abstract boolean onChat(S02PacketChat chatPacket, IChatComponent chat, String message); | 24 | + public abstract boolean onChat(IChatComponent chat, String message, ReturnValue<IChatComponent> newMessage); |
| 23 | } | 25 | } |
java/client/com/mumfrey/liteloader/ChatListener.java
| @@ -13,7 +13,7 @@ public interface ChatListener extends LiteMod | @@ -13,7 +13,7 @@ public interface ChatListener extends LiteMod | ||
| 13 | /** | 13 | /** |
| 14 | * Handle an inbound message | 14 | * Handle an inbound message |
| 15 | * | 15 | * |
| 16 | - * @param chat ChatMessageComponent parsed from the chat packet | 16 | + * @param chat IChatComponent parsed from the chat packet |
| 17 | * @param message Chat message parsed from the chat message component | 17 | * @param message Chat message parsed from the chat message component |
| 18 | */ | 18 | */ |
| 19 | public abstract void onChat(IChatComponent chat, String message); | 19 | public abstract void onChat(IChatComponent chat, String message); |
java/client/com/mumfrey/liteloader/EntityRenderListener.java
0 → 100644
| 1 | +package com.mumfrey.liteloader; | ||
| 2 | + | ||
| 3 | +import net.minecraft.client.renderer.entity.Render; | ||
| 4 | +import net.minecraft.entity.Entity; | ||
| 5 | + | ||
| 6 | +/** | ||
| 7 | + * Interface for mods which want to receive callbacks when entities are rendered into the world | ||
| 8 | + * | ||
| 9 | + * @author Adam Mummery-Smith | ||
| 10 | + */ | ||
| 11 | +public interface EntityRenderListener extends LiteMod | ||
| 12 | +{ | ||
| 13 | + /** | ||
| 14 | + * Called immediately prior to an entity being rendered | ||
| 15 | + * | ||
| 16 | + * @param render | ||
| 17 | + * @param entity | ||
| 18 | + * @param xPos | ||
| 19 | + * @param yPos | ||
| 20 | + * @param zPos | ||
| 21 | + * @param yaw | ||
| 22 | + * @param partialTicks | ||
| 23 | + */ | ||
| 24 | + public abstract void onRenderEntity(Render render, Entity entity, double xPos, double yPos, double zPos, float yaw, float partialTicks); | ||
| 25 | + | ||
| 26 | + /** | ||
| 27 | + * Called immediately following an entity being rendered | ||
| 28 | + * | ||
| 29 | + * @param render | ||
| 30 | + * @param entity | ||
| 31 | + * @param xPos | ||
| 32 | + * @param yPos | ||
| 33 | + * @param zPos | ||
| 34 | + * @param yaw | ||
| 35 | + * @param partialTicks | ||
| 36 | + */ | ||
| 37 | + public abstract void onPostRenderEntity(Render render, Entity entity, double xPos, double yPos, double zPos, float yaw, float partialTicks); | ||
| 38 | +} |
java/client/com/mumfrey/liteloader/ScreenshotListener.java
0 → 100644
| 1 | +package com.mumfrey.liteloader; | ||
| 2 | + | ||
| 3 | +import net.minecraft.client.shader.Framebuffer; | ||
| 4 | +import net.minecraft.util.IChatComponent; | ||
| 5 | + | ||
| 6 | +import com.mumfrey.liteloader.core.LiteLoaderEventBroker.ReturnValue; | ||
| 7 | + | ||
| 8 | +/** | ||
| 9 | + * Interface for mods which want to handle or inhibit the saving of screenshots | ||
| 10 | + * | ||
| 11 | + * @author Adam Mummery-Smith | ||
| 12 | + */ | ||
| 13 | +public interface ScreenshotListener extends LiteMod | ||
| 14 | +{ | ||
| 15 | + /** | ||
| 16 | + * Called when a screenshot is taken, mods should return FALSE to suspend further processing, or TRUE to allow | ||
| 17 | + * processing to continue normally | ||
| 18 | + * | ||
| 19 | + * @param screenshotName | ||
| 20 | + * @param width | ||
| 21 | + * @param height | ||
| 22 | + * @param fbo | ||
| 23 | + * @param message Message to return if the event is cancelled | ||
| 24 | + * @return FALSE to suspend further processing, or TRUE to allow processing to continue normally | ||
| 25 | + */ | ||
| 26 | + public boolean onSaveScreenshot(String screenshotName, int width, int height, Framebuffer fbo, ReturnValue<IChatComponent> message); | ||
| 27 | +} |
java/client/com/mumfrey/liteloader/client/CallbackProxyClient.java
| 1 | package com.mumfrey.liteloader.client; | 1 | package com.mumfrey.liteloader.client; |
| 2 | 2 | ||
| 3 | +import java.io.File; | ||
| 3 | import java.util.UUID; | 4 | import java.util.UUID; |
| 4 | 5 | ||
| 5 | import net.minecraft.client.Minecraft; | 6 | import net.minecraft.client.Minecraft; |
| @@ -7,12 +8,17 @@ import net.minecraft.client.entity.EntityPlayerSP; | @@ -7,12 +8,17 @@ import net.minecraft.client.entity.EntityPlayerSP; | ||
| 7 | import net.minecraft.client.gui.GuiIngame; | 8 | import net.minecraft.client.gui.GuiIngame; |
| 8 | import net.minecraft.client.renderer.EntityRenderer; | 9 | import net.minecraft.client.renderer.EntityRenderer; |
| 9 | import net.minecraft.client.renderer.OpenGlHelper; | 10 | import net.minecraft.client.renderer.OpenGlHelper; |
| 11 | +import net.minecraft.client.renderer.entity.Render; | ||
| 12 | +import net.minecraft.client.renderer.entity.RenderManager; | ||
| 10 | import net.minecraft.client.shader.Framebuffer; | 13 | import net.minecraft.client.shader.Framebuffer; |
| 14 | +import net.minecraft.entity.Entity; | ||
| 11 | import net.minecraft.entity.player.EntityPlayer; | 15 | import net.minecraft.entity.player.EntityPlayer; |
| 12 | import net.minecraft.entity.player.EntityPlayerMP; | 16 | import net.minecraft.entity.player.EntityPlayerMP; |
| 13 | import net.minecraft.network.NetworkManager; | 17 | import net.minecraft.network.NetworkManager; |
| 14 | import net.minecraft.server.integrated.IntegratedServer; | 18 | import net.minecraft.server.integrated.IntegratedServer; |
| 15 | import net.minecraft.server.management.ServerConfigurationManager; | 19 | import net.minecraft.server.management.ServerConfigurationManager; |
| 20 | +import net.minecraft.util.IChatComponent; | ||
| 21 | +import net.minecraft.util.ScreenShotHelper; | ||
| 16 | import net.minecraft.util.Session; | 22 | import net.minecraft.util.Session; |
| 17 | import net.minecraft.world.WorldSettings; | 23 | import net.minecraft.world.WorldSettings; |
| 18 | 24 | ||
| @@ -29,12 +35,7 @@ import com.mumfrey.liteloader.transformers.event.ReturnEventInfo; | @@ -29,12 +35,7 @@ import com.mumfrey.liteloader.transformers.event.ReturnEventInfo; | ||
| 29 | */ | 35 | */ |
| 30 | public class CallbackProxyClient | 36 | public class CallbackProxyClient |
| 31 | { | 37 | { |
| 32 | - /** | ||
| 33 | - * Tick clock, sent as a flag to the core onTick so that mods know it's a new tick | ||
| 34 | - */ | ||
| 35 | - private static boolean clock = false; | ||
| 36 | - | ||
| 37 | - private static EventsClient events; | 38 | + private static LiteLoaderEventBrokerClient eventBroker; |
| 38 | 39 | ||
| 39 | private static boolean fboEnabled; | 40 | private static boolean fboEnabled; |
| 40 | 41 | ||
| @@ -42,147 +43,145 @@ public class CallbackProxyClient | @@ -42,147 +43,145 @@ public class CallbackProxyClient | ||
| 42 | 43 | ||
| 43 | public static void onStartupComplete(EventInfo<Minecraft> e) | 44 | public static void onStartupComplete(EventInfo<Minecraft> e) |
| 44 | { | 45 | { |
| 45 | - CallbackProxyClient.events = EventsClient.getInstance(); | 46 | + CallbackProxyClient.eventBroker = LiteLoaderEventBrokerClient.getInstance(); |
| 46 | 47 | ||
| 47 | - if (CallbackProxyClient.events == null) | 48 | + if (CallbackProxyClient.eventBroker == null) |
| 48 | { | 49 | { |
| 49 | throw new RuntimeException("LiteLoader failed to start up properly. The game is in an unstable state and must shut down now. Check the developer log for startup errors"); | 50 | throw new RuntimeException("LiteLoader failed to start up properly. The game is in an unstable state and must shut down now. Check the developer log for startup errors"); |
| 50 | } | 51 | } |
| 51 | 52 | ||
| 52 | - CallbackProxyClient.events.onStartupComplete(); | 53 | + CallbackProxyClient.eventBroker.onStartupComplete(); |
| 53 | } | 54 | } |
| 54 | 55 | ||
| 55 | public static void onTimerUpdate(EventInfo<Minecraft> e) | 56 | public static void onTimerUpdate(EventInfo<Minecraft> e) |
| 56 | { | 57 | { |
| 57 | - CallbackProxyClient.events.onTimerUpdate(); | 58 | + CallbackProxyClient.eventBroker.onTimerUpdate(); |
| 58 | } | 59 | } |
| 59 | 60 | ||
| 60 | public static void newTick(EventInfo<Minecraft> e) | 61 | public static void newTick(EventInfo<Minecraft> e) |
| 61 | { | 62 | { |
| 62 | - CallbackProxyClient.clock = true; | ||
| 63 | } | 63 | } |
| 64 | 64 | ||
| 65 | public static void onTick(EventInfo<Minecraft> e) | 65 | public static void onTick(EventInfo<Minecraft> e) |
| 66 | { | 66 | { |
| 67 | - CallbackProxyClient.events.onTick(CallbackProxyClient.clock); | ||
| 68 | - CallbackProxyClient.clock = false; | 67 | + CallbackProxyClient.eventBroker.onTick(); |
| 69 | } | 68 | } |
| 70 | 69 | ||
| 71 | public static void onRender(EventInfo<Minecraft> e) | 70 | public static void onRender(EventInfo<Minecraft> e) |
| 72 | { | 71 | { |
| 73 | - CallbackProxyClient.events.onRender(); | 72 | + CallbackProxyClient.eventBroker.onRender(); |
| 74 | } | 73 | } |
| 75 | 74 | ||
| 76 | public static void preRenderGUI(EventInfo<EntityRenderer> e, float partialTicks) | 75 | public static void preRenderGUI(EventInfo<EntityRenderer> e, float partialTicks) |
| 77 | { | 76 | { |
| 78 | - CallbackProxyClient.events.preRenderGUI(partialTicks); | 77 | + CallbackProxyClient.eventBroker.preRenderGUI(partialTicks); |
| 79 | } | 78 | } |
| 80 | 79 | ||
| 81 | public static void onSetupCameraTransform(EventInfo<EntityRenderer> e, int pass, float partialTicks, long timeSlice) | 80 | public static void onSetupCameraTransform(EventInfo<EntityRenderer> e, int pass, float partialTicks, long timeSlice) |
| 82 | { | 81 | { |
| 83 | - CallbackProxyClient.events.onSetupCameraTransform(partialTicks, timeSlice); | 82 | + CallbackProxyClient.eventBroker.onSetupCameraTransform(partialTicks, timeSlice); |
| 84 | } | 83 | } |
| 85 | 84 | ||
| 86 | public static void postRenderEntities(EventInfo<EntityRenderer> e, int pass, float partialTicks, long timeSlice) | 85 | public static void postRenderEntities(EventInfo<EntityRenderer> e, int pass, float partialTicks, long timeSlice) |
| 87 | { | 86 | { |
| 88 | - CallbackProxyClient.events.postRenderEntities(partialTicks, timeSlice); | 87 | + CallbackProxyClient.eventBroker.postRenderEntities(partialTicks, timeSlice); |
| 89 | } | 88 | } |
| 90 | 89 | ||
| 91 | public static void postRender(EventInfo<EntityRenderer> e, float partialTicks, long timeSlice) | 90 | public static void postRender(EventInfo<EntityRenderer> e, float partialTicks, long timeSlice) |
| 92 | { | 91 | { |
| 93 | - CallbackProxyClient.events.postRender(partialTicks, timeSlice); | 92 | + CallbackProxyClient.eventBroker.postRender(partialTicks, timeSlice); |
| 94 | } | 93 | } |
| 95 | 94 | ||
| 96 | public static void onRenderHUD(EventInfo<EntityRenderer> e, float partialTicks) | 95 | public static void onRenderHUD(EventInfo<EntityRenderer> e, float partialTicks) |
| 97 | { | 96 | { |
| 98 | - CallbackProxyClient.events.onRenderHUD(partialTicks); | 97 | + CallbackProxyClient.eventBroker.onRenderHUD(partialTicks); |
| 99 | } | 98 | } |
| 100 | 99 | ||
| 101 | public static void onRenderChat(EventInfo<GuiIngame> e, float partialTicks) | 100 | public static void onRenderChat(EventInfo<GuiIngame> e, float partialTicks) |
| 102 | { | 101 | { |
| 103 | - CallbackProxyClient.events.onRenderChat(e.getSource().getChatGUI(), partialTicks); | 102 | + CallbackProxyClient.eventBroker.onRenderChat(e.getSource().getChatGUI(), partialTicks); |
| 104 | } | 103 | } |
| 105 | 104 | ||
| 106 | public static void postRenderChat(EventInfo<GuiIngame> e, float partialTicks) | 105 | public static void postRenderChat(EventInfo<GuiIngame> e, float partialTicks) |
| 107 | { | 106 | { |
| 108 | - CallbackProxyClient.events.postRenderChat(e.getSource().getChatGUI(), partialTicks); | 107 | + CallbackProxyClient.eventBroker.postRenderChat(e.getSource().getChatGUI(), partialTicks); |
| 109 | } | 108 | } |
| 110 | 109 | ||
| 111 | public static void postRenderHUD(EventInfo<EntityRenderer> e, float partialTicks) | 110 | public static void postRenderHUD(EventInfo<EntityRenderer> e, float partialTicks) |
| 112 | { | 111 | { |
| 113 | - CallbackProxyClient.events.postRenderHUD(partialTicks); | 112 | + CallbackProxyClient.eventBroker.postRenderHUD(partialTicks); |
| 114 | } | 113 | } |
| 115 | 114 | ||
| 116 | public static void IntegratedServerCtor(EventInfo<IntegratedServer> e, Minecraft minecraft, String folderName, String worldName, WorldSettings worldSettings) | 115 | public static void IntegratedServerCtor(EventInfo<IntegratedServer> e, Minecraft minecraft, String folderName, String worldName, WorldSettings worldSettings) |
| 117 | { | 116 | { |
| 118 | - CallbackProxyClient.events.onStartServer(e.getSource(), folderName, worldName, worldSettings); | 117 | + CallbackProxyClient.eventBroker.onStartServer(e.getSource(), folderName, worldName, worldSettings); |
| 119 | } | 118 | } |
| 120 | 119 | ||
| 121 | public static void onInitializePlayerConnection(EventInfo<ServerConfigurationManager> e, NetworkManager netManager, EntityPlayerMP player) | 120 | public static void onInitializePlayerConnection(EventInfo<ServerConfigurationManager> e, NetworkManager netManager, EntityPlayerMP player) |
| 122 | { | 121 | { |
| 123 | - CallbackProxyClient.events.onInitializePlayerConnection(e.getSource(), netManager, player); | 122 | + CallbackProxyClient.eventBroker.onInitializePlayerConnection(e.getSource(), netManager, player); |
| 124 | } | 123 | } |
| 125 | 124 | ||
| 126 | public static void onPlayerLogin(EventInfo<ServerConfigurationManager> e, EntityPlayerMP player) | 125 | public static void onPlayerLogin(EventInfo<ServerConfigurationManager> e, EntityPlayerMP player) |
| 127 | { | 126 | { |
| 128 | - CallbackProxyClient.events.onPlayerLogin(e.getSource(), player); | 127 | + CallbackProxyClient.eventBroker.onPlayerLogin(e.getSource(), player); |
| 129 | } | 128 | } |
| 130 | 129 | ||
| 131 | public static void onPlayerLogout(EventInfo<ServerConfigurationManager> e, EntityPlayerMP player) | 130 | public static void onPlayerLogout(EventInfo<ServerConfigurationManager> e, EntityPlayerMP player) |
| 132 | { | 131 | { |
| 133 | - CallbackProxyClient.events.onPlayerLogout(e.getSource(), player); | 132 | + CallbackProxyClient.eventBroker.onPlayerLogout(e.getSource(), player); |
| 134 | } | 133 | } |
| 135 | 134 | ||
| 136 | public static void onSpawnPlayer(ReturnEventInfo<ServerConfigurationManager, EntityPlayerMP> e, GameProfile profile) | 135 | public static void onSpawnPlayer(ReturnEventInfo<ServerConfigurationManager, EntityPlayerMP> e, GameProfile profile) |
| 137 | { | 136 | { |
| 138 | - CallbackProxyClient.events.onSpawnPlayer(e.getSource(), e.getReturnValue(), profile); | 137 | + CallbackProxyClient.eventBroker.onSpawnPlayer(e.getSource(), e.getReturnValue(), profile); |
| 139 | } | 138 | } |
| 140 | 139 | ||
| 141 | public static void onRespawnPlayer(ReturnEventInfo<ServerConfigurationManager, EntityPlayerMP> e, EntityPlayerMP oldPlayer, int dimension, boolean won) | 140 | public static void onRespawnPlayer(ReturnEventInfo<ServerConfigurationManager, EntityPlayerMP> e, EntityPlayerMP oldPlayer, int dimension, boolean won) |
| 142 | { | 141 | { |
| 143 | - CallbackProxyClient.events.onRespawnPlayer(e.getSource(), e.getReturnValue(), oldPlayer, dimension, won); | 142 | + CallbackProxyClient.eventBroker.onRespawnPlayer(e.getSource(), e.getReturnValue(), oldPlayer, dimension, won); |
| 144 | } | 143 | } |
| 145 | 144 | ||
| 146 | public static void onOutboundChat(EventInfo<EntityPlayerSP> e, String message) | 145 | public static void onOutboundChat(EventInfo<EntityPlayerSP> e, String message) |
| 147 | { | 146 | { |
| 148 | - CallbackProxyClient.events.onSendChatMessage(e, message); | 147 | + CallbackProxyClient.eventBroker.onSendChatMessage(e, message); |
| 149 | } | 148 | } |
| 150 | 149 | ||
| 151 | public static void onResize(EventInfo<Minecraft> e) | 150 | public static void onResize(EventInfo<Minecraft> e) |
| 152 | { | 151 | { |
| 153 | - if (CallbackProxyClient.events == null) return; | ||
| 154 | - CallbackProxyClient.events.onResize(e.getSource()); | 152 | + if (CallbackProxyClient.eventBroker == null) return; |
| 153 | + CallbackProxyClient.eventBroker.onResize(e.getSource()); | ||
| 155 | } | 154 | } |
| 156 | 155 | ||
| 157 | public static void preRenderFBO(EventInfo<Minecraft> e) | 156 | public static void preRenderFBO(EventInfo<Minecraft> e) |
| 158 | { | 157 | { |
| 159 | - if (CallbackProxyClient.events == null) return; | 158 | + if (CallbackProxyClient.eventBroker == null) return; |
| 160 | CallbackProxyClient.fboEnabled = OpenGlHelper.isFramebufferEnabled(); | 159 | CallbackProxyClient.fboEnabled = OpenGlHelper.isFramebufferEnabled(); |
| 161 | 160 | ||
| 162 | if (CallbackProxyClient.fboEnabled) | 161 | if (CallbackProxyClient.fboEnabled) |
| 163 | { | 162 | { |
| 164 | CallbackProxyClient.renderingFBO = true; | 163 | CallbackProxyClient.renderingFBO = true; |
| 165 | - CallbackProxyClient.events.preRenderFBO(e.getSource().getFramebuffer()); | 164 | + CallbackProxyClient.eventBroker.preRenderFBO(e.getSource().getFramebuffer()); |
| 166 | } | 165 | } |
| 167 | } | 166 | } |
| 168 | 167 | ||
| 169 | public static void postRenderFBO(EventInfo<Minecraft> e) | 168 | public static void postRenderFBO(EventInfo<Minecraft> e) |
| 170 | { | 169 | { |
| 171 | - if (CallbackProxyClient.events == null) return; | 170 | + if (CallbackProxyClient.eventBroker == null) return; |
| 172 | CallbackProxyClient.renderingFBO = false; | 171 | CallbackProxyClient.renderingFBO = false; |
| 173 | 172 | ||
| 174 | if (CallbackProxyClient.fboEnabled) | 173 | if (CallbackProxyClient.fboEnabled) |
| 175 | { | 174 | { |
| 176 | - CallbackProxyClient.events.postRenderFBO(e.getSource().getFramebuffer()); | 175 | + CallbackProxyClient.eventBroker.postRenderFBO(e.getSource().getFramebuffer()); |
| 177 | } | 176 | } |
| 178 | } | 177 | } |
| 179 | 178 | ||
| 180 | public static void renderFBO(EventInfo<Framebuffer> e, int width, int height, boolean flag) | 179 | public static void renderFBO(EventInfo<Framebuffer> e, int width, int height, boolean flag) |
| 181 | { | 180 | { |
| 182 | - if (CallbackProxyClient.events == null) return; | 181 | + if (CallbackProxyClient.eventBroker == null) return; |
| 183 | if (CallbackProxyClient.renderingFBO) | 182 | if (CallbackProxyClient.renderingFBO) |
| 184 | { | 183 | { |
| 185 | - CallbackProxyClient.events.onRenderFBO(e.getSource(), width, height); | 184 | + CallbackProxyClient.eventBroker.onRenderFBO(e.getSource(), width, height); |
| 186 | } | 185 | } |
| 187 | 186 | ||
| 188 | CallbackProxyClient.renderingFBO = false; | 187 | CallbackProxyClient.renderingFBO = false; |
| @@ -190,7 +189,22 @@ public class CallbackProxyClient | @@ -190,7 +189,22 @@ public class CallbackProxyClient | ||
| 190 | 189 | ||
| 191 | public static void onRenderWorld(EventInfo<EntityRenderer> e, float partialTicks, long timeSlice) | 190 | public static void onRenderWorld(EventInfo<EntityRenderer> e, float partialTicks, long timeSlice) |
| 192 | { | 191 | { |
| 193 | - CallbackProxyClient.events.onRenderWorld(partialTicks, timeSlice); | 192 | + CallbackProxyClient.eventBroker.onRenderWorld(partialTicks, timeSlice); |
| 193 | + } | ||
| 194 | + | ||
| 195 | + public static void onSaveScreenshot(ReturnEventInfo<ScreenShotHelper, IChatComponent> e, File gameDir, String name, int width, int height, Framebuffer fbo) | ||
| 196 | + { | ||
| 197 | + CallbackProxyClient.eventBroker.onScreenshot(e, name, width, height, fbo); | ||
| 198 | + } | ||
| 199 | + | ||
| 200 | + public static void onRenderEntity(ReturnEventInfo<RenderManager, Boolean> e, Entity entity, double xPos, double yPos, double zPos, float yaw, float partialTicks, boolean hideBoundingBox, Render render) | ||
| 201 | + { | ||
| 202 | + CallbackProxyClient.eventBroker.onRenderEntity(e.getSource(), entity, xPos, yPos, zPos, yaw, partialTicks, render); | ||
| 203 | + } | ||
| 204 | + | ||
| 205 | + public static void onPostRenderEntity(ReturnEventInfo<RenderManager, Boolean> e, Entity entity, double xPos, double yPos, double zPos, float yaw, float partialTicks, boolean hideBoundingBox, Render render) | ||
| 206 | + { | ||
| 207 | + CallbackProxyClient.eventBroker.onPostRenderEntity(e.getSource(), entity, xPos, yPos, zPos, yaw, partialTicks, render); | ||
| 194 | } | 208 | } |
| 195 | 209 | ||
| 196 | /** | 210 | /** |
java/client/com/mumfrey/liteloader/client/EventsClient.java renamed to java/client/com/mumfrey/liteloader/client/LiteLoaderEventBrokerClient.java
| @@ -4,28 +4,22 @@ import net.minecraft.client.Minecraft; | @@ -4,28 +4,22 @@ import net.minecraft.client.Minecraft; | ||
| 4 | import net.minecraft.client.entity.EntityPlayerSP; | 4 | import net.minecraft.client.entity.EntityPlayerSP; |
| 5 | import net.minecraft.client.gui.GuiNewChat; | 5 | import net.minecraft.client.gui.GuiNewChat; |
| 6 | import net.minecraft.client.gui.ScaledResolution; | 6 | import net.minecraft.client.gui.ScaledResolution; |
| 7 | +import net.minecraft.client.renderer.entity.Render; | ||
| 8 | +import net.minecraft.client.renderer.entity.RenderManager; | ||
| 7 | import net.minecraft.client.shader.Framebuffer; | 9 | import net.minecraft.client.shader.Framebuffer; |
| 8 | import net.minecraft.entity.Entity; | 10 | import net.minecraft.entity.Entity; |
| 9 | import net.minecraft.network.play.client.C01PacketChatMessage; | 11 | import net.minecraft.network.play.client.C01PacketChatMessage; |
| 10 | import net.minecraft.server.integrated.IntegratedServer; | 12 | import net.minecraft.server.integrated.IntegratedServer; |
| 13 | +import net.minecraft.util.IChatComponent; | ||
| 14 | +import net.minecraft.util.ScreenShotHelper; | ||
| 11 | import net.minecraft.util.Timer; | 15 | import net.minecraft.util.Timer; |
| 12 | 16 | ||
| 13 | import org.lwjgl.input.Mouse; | 17 | import org.lwjgl.input.Mouse; |
| 14 | 18 | ||
| 15 | -import com.mumfrey.liteloader.ChatRenderListener; | ||
| 16 | -import com.mumfrey.liteloader.FrameBufferListener; | ||
| 17 | -import com.mumfrey.liteloader.GameLoopListener; | ||
| 18 | -import com.mumfrey.liteloader.HUDRenderListener; | ||
| 19 | -import com.mumfrey.liteloader.InitCompleteListener; | ||
| 20 | -import com.mumfrey.liteloader.OutboundChatFilter; | ||
| 21 | -import com.mumfrey.liteloader.OutboundChatListener; | ||
| 22 | -import com.mumfrey.liteloader.PostRenderListener; | ||
| 23 | -import com.mumfrey.liteloader.RenderListener; | ||
| 24 | -import com.mumfrey.liteloader.Tickable; | ||
| 25 | -import com.mumfrey.liteloader.ViewportListener; | 19 | +import com.mumfrey.liteloader.*; |
| 26 | import com.mumfrey.liteloader.client.overlays.IMinecraft; | 20 | import com.mumfrey.liteloader.client.overlays.IMinecraft; |
| 27 | import com.mumfrey.liteloader.common.LoadingProgress; | 21 | import com.mumfrey.liteloader.common.LoadingProgress; |
| 28 | -import com.mumfrey.liteloader.core.Events; | 22 | +import com.mumfrey.liteloader.core.LiteLoaderEventBroker; |
| 29 | import com.mumfrey.liteloader.core.InterfaceRegistrationDelegate; | 23 | import com.mumfrey.liteloader.core.InterfaceRegistrationDelegate; |
| 30 | import com.mumfrey.liteloader.core.LiteLoader; | 24 | import com.mumfrey.liteloader.core.LiteLoader; |
| 31 | import com.mumfrey.liteloader.core.event.HandlerList; | 25 | import com.mumfrey.liteloader.core.event.HandlerList; |
| @@ -33,11 +27,12 @@ import com.mumfrey.liteloader.core.event.HandlerList.ReturnLogicOp; | @@ -33,11 +27,12 @@ import com.mumfrey.liteloader.core.event.HandlerList.ReturnLogicOp; | ||
| 33 | import com.mumfrey.liteloader.interfaces.FastIterableDeque; | 27 | import com.mumfrey.liteloader.interfaces.FastIterableDeque; |
| 34 | import com.mumfrey.liteloader.launch.LoaderProperties; | 28 | import com.mumfrey.liteloader.launch.LoaderProperties; |
| 35 | import com.mumfrey.liteloader.transformers.event.EventInfo; | 29 | import com.mumfrey.liteloader.transformers.event.EventInfo; |
| 30 | +import com.mumfrey.liteloader.transformers.event.ReturnEventInfo; | ||
| 36 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; | 31 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; |
| 37 | 32 | ||
| 38 | -public class EventsClient extends Events<Minecraft, IntegratedServer> | 33 | +public class LiteLoaderEventBrokerClient extends LiteLoaderEventBroker<Minecraft, IntegratedServer> |
| 39 | { | 34 | { |
| 40 | - private static EventsClient instance; | 35 | + private static LiteLoaderEventBrokerClient instance; |
| 41 | 36 | ||
| 42 | /** | 37 | /** |
| 43 | * Reference to the game | 38 | * Reference to the game |
| @@ -45,21 +40,6 @@ public class EventsClient extends Events<Minecraft, IntegratedServer> | @@ -45,21 +40,6 @@ public class EventsClient extends Events<Minecraft, IntegratedServer> | ||
| 45 | protected final GameEngineClient engineClient; | 40 | protected final GameEngineClient engineClient; |
| 46 | 41 | ||
| 47 | /** | 42 | /** |
| 48 | - * Reference to the minecraft timer | ||
| 49 | - */ | ||
| 50 | - private Timer minecraftTimer; | ||
| 51 | - | ||
| 52 | - /** | ||
| 53 | - * Flags which keep track of whether hooks have been applied | ||
| 54 | - */ | ||
| 55 | - private boolean lateInitDone; | ||
| 56 | - | ||
| 57 | - /** | ||
| 58 | - * ScaledResolution used by the pre-chat and post-chat render callbacks | ||
| 59 | - */ | ||
| 60 | - private ScaledResolution currentResolution; | ||
| 61 | - | ||
| 62 | - /** | ||
| 63 | * Current screen width | 43 | * Current screen width |
| 64 | */ | 44 | */ |
| 65 | private int screenWidth = 854; | 45 | private int screenWidth = 854; |
| @@ -91,20 +71,22 @@ public class EventsClient extends Events<Minecraft, IntegratedServer> | @@ -91,20 +71,22 @@ public class EventsClient extends Events<Minecraft, IntegratedServer> | ||
| 91 | private FastIterableDeque<FrameBufferListener> frameBufferListeners = new HandlerList<FrameBufferListener>(FrameBufferListener.class); | 71 | private FastIterableDeque<FrameBufferListener> frameBufferListeners = new HandlerList<FrameBufferListener>(FrameBufferListener.class); |
| 92 | private FastIterableDeque<InitCompleteListener> initListeners = new HandlerList<InitCompleteListener>(InitCompleteListener.class); | 72 | private FastIterableDeque<InitCompleteListener> initListeners = new HandlerList<InitCompleteListener>(InitCompleteListener.class); |
| 93 | private FastIterableDeque<OutboundChatFilter> outboundChatFilters = new HandlerList<OutboundChatFilter>(OutboundChatFilter.class, ReturnLogicOp.AND); | 73 | private FastIterableDeque<OutboundChatFilter> outboundChatFilters = new HandlerList<OutboundChatFilter>(OutboundChatFilter.class, ReturnLogicOp.AND); |
| 74 | + private FastIterableDeque<ScreenshotListener> screenshotListeners = new HandlerList<ScreenshotListener>(ScreenshotListener.class, ReturnLogicOp.AND_BREAK_ON_FALSE); | ||
| 75 | + private FastIterableDeque<EntityRenderListener> entityRenderListeners = new HandlerList<EntityRenderListener>(EntityRenderListener.class); | ||
| 94 | 76 | ||
| 95 | @SuppressWarnings("cast") | 77 | @SuppressWarnings("cast") |
| 96 | - public EventsClient(LiteLoader loader, GameEngineClient engine, LoaderProperties properties) | 78 | + public LiteLoaderEventBrokerClient(LiteLoader loader, GameEngineClient engine, LoaderProperties properties) |
| 97 | { | 79 | { |
| 98 | super(loader, engine, properties); | 80 | super(loader, engine, properties); |
| 99 | 81 | ||
| 100 | - EventsClient.instance = this; | 82 | + LiteLoaderEventBrokerClient.instance = this; |
| 101 | 83 | ||
| 102 | this.engineClient = (GameEngineClient)engine; | 84 | this.engineClient = (GameEngineClient)engine; |
| 103 | } | 85 | } |
| 104 | 86 | ||
| 105 | - static EventsClient getInstance() | 87 | + static LiteLoaderEventBrokerClient getInstance() |
| 106 | { | 88 | { |
| 107 | - return EventsClient.instance; | 89 | + return LiteLoaderEventBrokerClient.instance; |
| 108 | } | 90 | } |
| 109 | 91 | ||
| 110 | /* (non-Javadoc) | 92 | /* (non-Javadoc) |
| @@ -126,6 +108,8 @@ public class EventsClient extends Events<Minecraft, IntegratedServer> | @@ -126,6 +108,8 @@ public class EventsClient extends Events<Minecraft, IntegratedServer> | ||
| 126 | delegate.registerInterface(FrameBufferListener.class); | 108 | delegate.registerInterface(FrameBufferListener.class); |
| 127 | delegate.registerInterface(InitCompleteListener.class); | 109 | delegate.registerInterface(InitCompleteListener.class); |
| 128 | delegate.registerInterface(OutboundChatFilter.class); | 110 | delegate.registerInterface(OutboundChatFilter.class); |
| 111 | + delegate.registerInterface(ScreenshotListener.class); | ||
| 112 | + delegate.registerInterface(EntityRenderListener.class); | ||
| 129 | } | 113 | } |
| 130 | 114 | ||
| 131 | /* (non-Javadoc) | 115 | /* (non-Javadoc) |
| @@ -223,6 +207,22 @@ public class EventsClient extends Events<Minecraft, IntegratedServer> | @@ -223,6 +207,22 @@ public class EventsClient extends Events<Minecraft, IntegratedServer> | ||
| 223 | { | 207 | { |
| 224 | this.frameBufferListeners.add(frameBufferListener); | 208 | this.frameBufferListeners.add(frameBufferListener); |
| 225 | } | 209 | } |
| 210 | + | ||
| 211 | + /** | ||
| 212 | + * @param screenshotListener | ||
| 213 | + */ | ||
| 214 | + public void addScreenshotListener(ScreenshotListener screenshotListener) | ||
| 215 | + { | ||
| 216 | + this.screenshotListeners.add(screenshotListener); | ||
| 217 | + } | ||
| 218 | + | ||
| 219 | + /** | ||
| 220 | + * @param entityRenderListener | ||
| 221 | + */ | ||
| 222 | + public void addEntityRenderListener(EntityRenderListener entityRenderListener) | ||
| 223 | + { | ||
| 224 | + this.entityRenderListeners.add(entityRenderListener); | ||
| 225 | + } | ||
| 226 | 226 | ||
| 227 | /** | 227 | /** |
| 228 | * Late initialisation callback | 228 | * Late initialisation callback |
| @@ -232,23 +232,18 @@ public class EventsClient extends Events<Minecraft, IntegratedServer> | @@ -232,23 +232,18 @@ public class EventsClient extends Events<Minecraft, IntegratedServer> | ||
| 232 | { | 232 | { |
| 233 | this.engine.refreshResources(false); | 233 | this.engine.refreshResources(false); |
| 234 | 234 | ||
| 235 | - if (!this.lateInitDone) | 235 | + for (InitCompleteListener initMod : this.initListeners) |
| 236 | { | 236 | { |
| 237 | - this.lateInitDone = true; | ||
| 238 | - | ||
| 239 | - for (InitCompleteListener initMod : this.initListeners) | 237 | + try |
| 240 | { | 238 | { |
| 241 | - try | ||
| 242 | - { | ||
| 243 | - LoadingProgress.setMessage("Calling late init for mod %s...", initMod.getName()); | ||
| 244 | - LiteLoaderLogger.info("Calling late init for mod %s", initMod.getName()); | ||
| 245 | - initMod.onInitCompleted(this.engine.getClient(), this.loader); | ||
| 246 | - } | ||
| 247 | - catch (Throwable th) | ||
| 248 | - { | ||
| 249 | - this.mods.onLateInitFailed(initMod, th); | ||
| 250 | - LiteLoaderLogger.warning(th, "Error calling late init for mod %s", initMod.getName()); | ||
| 251 | - } | 239 | + LoadingProgress.setMessage("Calling late init for mod %s...", initMod.getName()); |
| 240 | + LiteLoaderLogger.info("Calling late init for mod %s", initMod.getName()); | ||
| 241 | + initMod.onInitCompleted(this.engine.getClient(), this.loader); | ||
| 242 | + } | ||
| 243 | + catch (Throwable th) | ||
| 244 | + { | ||
| 245 | + this.mods.onLateInitFailed(initMod, th); | ||
| 246 | + LiteLoaderLogger.warning(th, "Error calling late init for mod %s", initMod.getName()); | ||
| 252 | } | 247 | } |
| 253 | } | 248 | } |
| 254 | 249 | ||
| @@ -259,9 +254,9 @@ public class EventsClient extends Events<Minecraft, IntegratedServer> | @@ -259,9 +254,9 @@ public class EventsClient extends Events<Minecraft, IntegratedServer> | ||
| 259 | 254 | ||
| 260 | public void onResize(Minecraft minecraft) | 255 | public void onResize(Minecraft minecraft) |
| 261 | { | 256 | { |
| 262 | - this.currentResolution = this.engineClient.getScaledResolution(); | ||
| 263 | - this.screenWidth = this.currentResolution.getScaledWidth(); | ||
| 264 | - this.screenHeight = this.currentResolution.getScaledHeight(); | 257 | + ScaledResolution currentResolution = this.engineClient.getScaledResolution(); |
| 258 | + this.screenWidth = currentResolution.getScaledWidth(); | ||
| 259 | + this.screenHeight = currentResolution.getScaledHeight(); | ||
| 265 | 260 | ||
| 266 | if (this.wasFullScreen != minecraft.isFullScreen()) | 261 | if (this.wasFullScreen != minecraft.isFullScreen()) |
| 267 | { | 262 | { |
| @@ -269,7 +264,7 @@ public class EventsClient extends Events<Minecraft, IntegratedServer> | @@ -269,7 +264,7 @@ public class EventsClient extends Events<Minecraft, IntegratedServer> | ||
| 269 | } | 264 | } |
| 270 | 265 | ||
| 271 | this.wasFullScreen = minecraft.isFullScreen(); | 266 | this.wasFullScreen = minecraft.isFullScreen(); |
| 272 | - this.viewportListeners.all().onViewportResized(this.currentResolution, minecraft.displayWidth, minecraft.displayHeight); | 267 | + this.viewportListeners.all().onViewportResized(currentResolution, minecraft.displayWidth, minecraft.displayHeight); |
| 273 | } | 268 | } |
| 274 | 269 | ||
| 275 | /** | 270 | /** |
| @@ -286,9 +281,8 @@ public class EventsClient extends Events<Minecraft, IntegratedServer> | @@ -286,9 +281,8 @@ public class EventsClient extends Events<Minecraft, IntegratedServer> | ||
| 286 | * @param timeSlice | 281 | * @param timeSlice |
| 287 | * @param partialTicks2 | 282 | * @param partialTicks2 |
| 288 | */ | 283 | */ |
| 289 | - void postRenderEntities(float partialTicks2, long timeSlice) | 284 | + void postRenderEntities(float partialTicks, long timeSlice) |
| 290 | { | 285 | { |
| 291 | - float partialTicks = (this.minecraftTimer != null) ? this.minecraftTimer.elapsedPartialTicks : 0.0F; | ||
| 292 | this.postRenderListeners.all().onPostRenderEntities(partialTicks); | 286 | this.postRenderListeners.all().onPostRenderEntities(partialTicks); |
| 293 | } | 287 | } |
| 294 | 288 | ||
| @@ -298,9 +292,8 @@ public class EventsClient extends Events<Minecraft, IntegratedServer> | @@ -298,9 +292,8 @@ public class EventsClient extends Events<Minecraft, IntegratedServer> | ||
| 298 | * @param timeSlice | 292 | * @param timeSlice |
| 299 | * @param partialTicks2 | 293 | * @param partialTicks2 |
| 300 | */ | 294 | */ |
| 301 | - void postRender(float partialTicks2, long timeSlice) | 295 | + void postRender(float partialTicks, long timeSlice) |
| 302 | { | 296 | { |
| 303 | - float partialTicks = (this.minecraftTimer != null) ? this.minecraftTimer.elapsedPartialTicks : 0.0F; | ||
| 304 | this.postRenderListeners.all().onPostRender(partialTicks); | 297 | this.postRenderListeners.all().onPostRender(partialTicks); |
| 305 | } | 298 | } |
| 306 | 299 | ||
| @@ -376,24 +369,13 @@ public class EventsClient extends Events<Minecraft, IntegratedServer> | @@ -376,24 +369,13 @@ public class EventsClient extends Events<Minecraft, IntegratedServer> | ||
| 376 | * | 369 | * |
| 377 | * @param clock True if this is a new tick (otherwise it's just a new frame) | 370 | * @param clock True if this is a new tick (otherwise it's just a new frame) |
| 378 | */ | 371 | */ |
| 379 | - void onTick(boolean clock) | 372 | + void onTick() |
| 380 | { | 373 | { |
| 381 | this.profiler.startSection("litemods"); | 374 | this.profiler.startSection("litemods"); |
| 382 | - float partialTicks = 0.0F; | ||
| 383 | - | ||
| 384 | - // Try to get the minecraft timer object and determine the value of the | ||
| 385 | - // partialTicks | ||
| 386 | - if (clock || this.minecraftTimer == null) | ||
| 387 | - { | ||
| 388 | - this.minecraftTimer = ((IMinecraft)this.engine.getClient()).getTimer(); | ||
| 389 | - } | ||
| 390 | 375 | ||
| 391 | - // Hooray, we got the timer reference | ||
| 392 | - if (this.minecraftTimer != null) | ||
| 393 | - { | ||
| 394 | - partialTicks = this.minecraftTimer.renderPartialTicks; | ||
| 395 | - clock = this.minecraftTimer.elapsedTicks > 0; | ||
| 396 | - } | 376 | + Timer minecraftTimer = ((IMinecraft)this.engine.getClient()).getTimer(); |
| 377 | + float partialTicks = minecraftTimer.renderPartialTicks; | ||
| 378 | + boolean clock = minecraftTimer.elapsedTicks > 0; | ||
| 397 | 379 | ||
| 398 | Minecraft minecraft = this.engine.getClient(); | 380 | Minecraft minecraft = this.engine.getClient(); |
| 399 | 381 | ||
| @@ -414,18 +396,11 @@ public class EventsClient extends Events<Minecraft, IntegratedServer> | @@ -414,18 +396,11 @@ public class EventsClient extends Events<Minecraft, IntegratedServer> | ||
| 414 | this.tickListeners.all().onTick(minecraft, partialTicks, inGame, clock); | 396 | this.tickListeners.all().onTick(minecraft, partialTicks, inGame, clock); |
| 415 | 397 | ||
| 416 | // Detected world change | 398 | // Detected world change |
| 417 | - if (minecraft.theWorld != null) | 399 | + int worldHashCode = (minecraft.theWorld != null) ? minecraft.theWorld.hashCode() : 0; |
| 400 | + if (worldHashCode != this.worldHashCode) | ||
| 418 | { | 401 | { |
| 419 | - if (minecraft.theWorld.hashCode() != this.worldHashCode) | ||
| 420 | - { | ||
| 421 | - this.worldHashCode = minecraft.theWorld.hashCode(); | ||
| 422 | - super.onWorldChanged(minecraft.theWorld); | ||
| 423 | - } | ||
| 424 | - } | ||
| 425 | - else | ||
| 426 | - { | ||
| 427 | - this.worldHashCode = 0; | ||
| 428 | - super.onWorldChanged(null); | 402 | + this.worldHashCode = worldHashCode; |
| 403 | + super.onWorldChanged(minecraft.theWorld); | ||
| 429 | } | 404 | } |
| 430 | 405 | ||
| 431 | this.profiler.endSection(); | 406 | this.profiler.endSection(); |
| @@ -481,8 +456,55 @@ public class EventsClient extends Events<Minecraft, IntegratedServer> | @@ -481,8 +456,55 @@ public class EventsClient extends Events<Minecraft, IntegratedServer> | ||
| 481 | * @param partialTicks | 456 | * @param partialTicks |
| 482 | * @param timeSlice | 457 | * @param timeSlice |
| 483 | */ | 458 | */ |
| 484 | - public void onRenderWorld(float partialTicks, long timeSlice) | 459 | + void onRenderWorld(float partialTicks, long timeSlice) |
| 485 | { | 460 | { |
| 486 | this.renderListeners.all().onRenderWorld(); | 461 | this.renderListeners.all().onRenderWorld(); |
| 487 | } | 462 | } |
| 463 | + | ||
| 464 | + /** | ||
| 465 | + * @param e | ||
| 466 | + * @param name | ||
| 467 | + * @param width | ||
| 468 | + * @param height | ||
| 469 | + * @param fbo | ||
| 470 | + */ | ||
| 471 | + void onScreenshot(ReturnEventInfo<ScreenShotHelper, IChatComponent> e, String name, int width, int height, Framebuffer fbo) | ||
| 472 | + { | ||
| 473 | + ReturnValue<IChatComponent> ret = new ReturnValue<IChatComponent>(e.getReturnValue()); | ||
| 474 | + | ||
| 475 | + if (!this.screenshotListeners.all().onSaveScreenshot(name, width, height, fbo, ret)) | ||
| 476 | + { | ||
| 477 | + e.setReturnValue(ret.get()); | ||
| 478 | + } | ||
| 479 | + } | ||
| 480 | + | ||
| 481 | + /** | ||
| 482 | + * @param source | ||
| 483 | + * @param entity | ||
| 484 | + * @param xPos | ||
| 485 | + * @param yPos | ||
| 486 | + * @param zPos | ||
| 487 | + * @param yaw | ||
| 488 | + * @param partialTicks | ||
| 489 | + * @param render | ||
| 490 | + */ | ||
| 491 | + public void onRenderEntity(RenderManager source, Entity entity, double xPos, double yPos, double zPos, float yaw, float partialTicks, Render render) | ||
| 492 | + { | ||
| 493 | + this.entityRenderListeners.all().onRenderEntity(render, entity, xPos, yPos, zPos, yaw, partialTicks); | ||
| 494 | + } | ||
| 495 | + | ||
| 496 | + /** | ||
| 497 | + * @param source | ||
| 498 | + * @param entity | ||
| 499 | + * @param xPos | ||
| 500 | + * @param yPos | ||
| 501 | + * @param zPos | ||
| 502 | + * @param yaw | ||
| 503 | + * @param partialTicks | ||
| 504 | + * @param render | ||
| 505 | + */ | ||
| 506 | + public void onPostRenderEntity(RenderManager source, Entity entity, double xPos, double yPos, double zPos, float yaw, float partialTicks, Render render) | ||
| 507 | + { | ||
| 508 | + this.entityRenderListeners.all().onPostRenderEntity(render, entity, xPos, yPos, zPos, yaw, partialTicks); | ||
| 509 | + } | ||
| 488 | } | 510 | } |
java/client/com/mumfrey/liteloader/client/PacketEventsClient.java
| @@ -7,6 +7,7 @@ import net.minecraft.network.login.server.S02PacketLoginSuccess; | @@ -7,6 +7,7 @@ import net.minecraft.network.login.server.S02PacketLoginSuccess; | ||
| 7 | import net.minecraft.network.play.INetHandlerPlayClient; | 7 | import net.minecraft.network.play.INetHandlerPlayClient; |
| 8 | import net.minecraft.network.play.server.S01PacketJoinGame; | 8 | import net.minecraft.network.play.server.S01PacketJoinGame; |
| 9 | import net.minecraft.network.play.server.S02PacketChat; | 9 | import net.minecraft.network.play.server.S02PacketChat; |
| 10 | +import net.minecraft.util.ChatComponentText; | ||
| 10 | import net.minecraft.util.IChatComponent; | 11 | import net.minecraft.util.IChatComponent; |
| 11 | 12 | ||
| 12 | import com.mumfrey.liteloader.ChatFilter; | 13 | import com.mumfrey.liteloader.ChatFilter; |
| @@ -15,6 +16,7 @@ import com.mumfrey.liteloader.PostLoginListener; | @@ -15,6 +16,7 @@ import com.mumfrey.liteloader.PostLoginListener; | ||
| 15 | import com.mumfrey.liteloader.PreJoinGameListener; | 16 | import com.mumfrey.liteloader.PreJoinGameListener; |
| 16 | import com.mumfrey.liteloader.common.transformers.PacketEventInfo; | 17 | import com.mumfrey.liteloader.common.transformers.PacketEventInfo; |
| 17 | import com.mumfrey.liteloader.core.ClientPluginChannels; | 18 | import com.mumfrey.liteloader.core.ClientPluginChannels; |
| 19 | +import com.mumfrey.liteloader.core.LiteLoaderEventBroker.ReturnValue; | ||
| 18 | import com.mumfrey.liteloader.core.InterfaceRegistrationDelegate; | 20 | import com.mumfrey.liteloader.core.InterfaceRegistrationDelegate; |
| 19 | import com.mumfrey.liteloader.core.LiteLoader; | 21 | import com.mumfrey.liteloader.core.LiteLoader; |
| 20 | import com.mumfrey.liteloader.core.PacketEvents; | 22 | import com.mumfrey.liteloader.core.PacketEvents; |
| @@ -146,14 +148,22 @@ public class PacketEventsClient extends PacketEvents | @@ -146,14 +148,22 @@ public class PacketEventsClient extends PacketEvents | ||
| 146 | IChatComponent chat = packet.func_148915_c(); | 148 | IChatComponent chat = packet.func_148915_c(); |
| 147 | String message = chat.getFormattedText(); | 149 | String message = chat.getFormattedText(); |
| 148 | 150 | ||
| 149 | - // Chat filters get a stab at the chat first, if any filter returns | ||
| 150 | - // false the chat is discarded | 151 | + // Chat filters get a stab at the chat first, if any filter returns false the chat is discarded |
| 151 | for (ChatFilter chatFilter : this.chatFilters) | 152 | for (ChatFilter chatFilter : this.chatFilters) |
| 152 | { | 153 | { |
| 153 | - if (chatFilter.onChat(packet, chat, message)) | 154 | + ReturnValue<IChatComponent> ret = new ReturnValue<IChatComponent>(); |
| 155 | + | ||
| 156 | + if (chatFilter.onChat(chat, message, ret)) | ||
| 154 | { | 157 | { |
| 155 | - chat = packet.func_148915_c(); | ||
| 156 | - message = chat.getFormattedText(); | 158 | + if (ret.isSet()) |
| 159 | + { | ||
| 160 | + chat = ret.get(); | ||
| 161 | + if (chat == null) | ||
| 162 | + { | ||
| 163 | + chat = new ChatComponentText(""); | ||
| 164 | + } | ||
| 165 | + message = chat.getFormattedText(); | ||
| 166 | + } | ||
| 157 | } | 167 | } |
| 158 | else | 168 | else |
| 159 | { | 169 | { |
java/client/com/mumfrey/liteloader/client/api/ObjectFactoryClient.java
| @@ -4,7 +4,7 @@ import net.minecraft.client.Minecraft; | @@ -4,7 +4,7 @@ import net.minecraft.client.Minecraft; | ||
| 4 | import net.minecraft.client.gui.GuiScreen; | 4 | import net.minecraft.client.gui.GuiScreen; |
| 5 | import net.minecraft.server.integrated.IntegratedServer; | 5 | import net.minecraft.server.integrated.IntegratedServer; |
| 6 | 6 | ||
| 7 | -import com.mumfrey.liteloader.client.EventsClient; | 7 | +import com.mumfrey.liteloader.client.LiteLoaderEventBrokerClient; |
| 8 | import com.mumfrey.liteloader.client.ClientPluginChannelsClient; | 8 | import com.mumfrey.liteloader.client.ClientPluginChannelsClient; |
| 9 | import com.mumfrey.liteloader.client.GameEngineClient; | 9 | import com.mumfrey.liteloader.client.GameEngineClient; |
| 10 | import com.mumfrey.liteloader.client.LiteLoaderPanelManager; | 10 | import com.mumfrey.liteloader.client.LiteLoaderPanelManager; |
| @@ -12,7 +12,7 @@ import com.mumfrey.liteloader.client.PacketEventsClient; | @@ -12,7 +12,7 @@ import com.mumfrey.liteloader.client.PacketEventsClient; | ||
| 12 | import com.mumfrey.liteloader.client.gui.startup.LoadingBar; | 12 | import com.mumfrey.liteloader.client.gui.startup.LoadingBar; |
| 13 | import com.mumfrey.liteloader.common.GameEngine; | 13 | import com.mumfrey.liteloader.common.GameEngine; |
| 14 | import com.mumfrey.liteloader.core.ClientPluginChannels; | 14 | import com.mumfrey.liteloader.core.ClientPluginChannels; |
| 15 | -import com.mumfrey.liteloader.core.Events; | 15 | +import com.mumfrey.liteloader.core.LiteLoaderEventBroker; |
| 16 | import com.mumfrey.liteloader.core.LiteLoader; | 16 | import com.mumfrey.liteloader.core.LiteLoader; |
| 17 | import com.mumfrey.liteloader.core.PacketEvents; | 17 | import com.mumfrey.liteloader.core.PacketEvents; |
| 18 | import com.mumfrey.liteloader.core.ServerPluginChannels; | 18 | import com.mumfrey.liteloader.core.ServerPluginChannels; |
| @@ -34,7 +34,7 @@ class ObjectFactoryClient implements ObjectFactory<Minecraft, IntegratedServer> | @@ -34,7 +34,7 @@ class ObjectFactoryClient implements ObjectFactory<Minecraft, IntegratedServer> | ||
| 34 | 34 | ||
| 35 | private LoaderProperties properties; | 35 | private LoaderProperties properties; |
| 36 | 36 | ||
| 37 | - private EventsClient clientEvents; | 37 | + private LiteLoaderEventBrokerClient clientEvents; |
| 38 | 38 | ||
| 39 | private PacketEventsClient clientPacketEvents; | 39 | private PacketEventsClient clientPacketEvents; |
| 40 | 40 | ||
| @@ -53,11 +53,11 @@ class ObjectFactoryClient implements ObjectFactory<Minecraft, IntegratedServer> | @@ -53,11 +53,11 @@ class ObjectFactoryClient implements ObjectFactory<Minecraft, IntegratedServer> | ||
| 53 | } | 53 | } |
| 54 | 54 | ||
| 55 | @Override | 55 | @Override |
| 56 | - public Events<Minecraft, IntegratedServer> getEventBroker() | 56 | + public LiteLoaderEventBroker<Minecraft, IntegratedServer> getEventBroker() |
| 57 | { | 57 | { |
| 58 | if (this.clientEvents == null) | 58 | if (this.clientEvents == null) |
| 59 | { | 59 | { |
| 60 | - this.clientEvents = new EventsClient(LiteLoader.getInstance(), (GameEngineClient)this.getGameEngine(), this.properties); | 60 | + this.clientEvents = new LiteLoaderEventBrokerClient(LiteLoader.getInstance(), (GameEngineClient)this.getGameEngine(), this.properties); |
| 61 | } | 61 | } |
| 62 | 62 | ||
| 63 | return this.clientEvents; | 63 | return this.clientEvents; |
java/client/com/mumfrey/liteloader/client/gui/GuiPanel.java
| @@ -2,7 +2,6 @@ package com.mumfrey.liteloader.client.gui; | @@ -2,7 +2,6 @@ package com.mumfrey.liteloader.client.gui; | ||
| 2 | 2 | ||
| 3 | import static com.mumfrey.liteloader.gl.GL.*; | 3 | import static com.mumfrey.liteloader.gl.GL.*; |
| 4 | 4 | ||
| 5 | -import java.io.IOException; | ||
| 6 | import java.util.LinkedList; | 5 | import java.util.LinkedList; |
| 7 | import java.util.List; | 6 | import java.util.List; |
| 8 | 7 | ||
| @@ -125,7 +124,7 @@ public abstract class GuiPanel extends Gui | @@ -125,7 +124,7 @@ public abstract class GuiPanel extends Gui | ||
| 125 | * @param mouseY | 124 | * @param mouseY |
| 126 | * @param mouseButton | 125 | * @param mouseButton |
| 127 | */ | 126 | */ |
| 128 | - void mousePressed(int mouseX, int mouseY, int mouseButton) throws IOException | 127 | + void mousePressed(int mouseX, int mouseY, int mouseButton) |
| 129 | { | 128 | { |
| 130 | if (mouseButton == 0) | 129 | if (mouseButton == 0) |
| 131 | { | 130 | { |
java/client/com/mumfrey/liteloader/client/gui/GuiPanelAbout.java
| 1 | package com.mumfrey.liteloader.client.gui; | 1 | package com.mumfrey.liteloader.client.gui; |
| 2 | 2 | ||
| 3 | -import java.io.IOException; | ||
| 4 | import java.net.URI; | 3 | import java.net.URI; |
| 5 | import java.util.ArrayList; | 4 | import java.util.ArrayList; |
| 6 | import java.util.List; | 5 | import java.util.List; |
| @@ -216,7 +215,7 @@ class GuiPanelAbout extends GuiPanel implements ScrollPanelContent | @@ -216,7 +215,7 @@ class GuiPanelAbout extends GuiPanel implements ScrollPanelContent | ||
| 216 | } | 215 | } |
| 217 | 216 | ||
| 218 | @Override | 217 | @Override |
| 219 | - void mousePressed(int mouseX, int mouseY, int mouseButton) throws IOException | 218 | + void mousePressed(int mouseX, int mouseY, int mouseButton) |
| 220 | { | 219 | { |
| 221 | this.scrollPane.mousePressed(mouseX, mouseY, mouseButton); | 220 | this.scrollPane.mousePressed(mouseX, mouseY, mouseButton); |
| 222 | 221 |
java/client/com/mumfrey/liteloader/client/gui/GuiPanelConfigContainer.java
| @@ -2,9 +2,6 @@ package com.mumfrey.liteloader.client.gui; | @@ -2,9 +2,6 @@ package com.mumfrey.liteloader.client.gui; | ||
| 2 | 2 | ||
| 3 | import static com.mumfrey.liteloader.gl.GL.*; | 3 | import static com.mumfrey.liteloader.gl.GL.*; |
| 4 | import static com.mumfrey.liteloader.gl.GLClippingPlanes.*; | 4 | import static com.mumfrey.liteloader.gl.GLClippingPlanes.*; |
| 5 | - | ||
| 6 | -import java.io.IOException; | ||
| 7 | - | ||
| 8 | import net.minecraft.client.Minecraft; | 5 | import net.minecraft.client.Minecraft; |
| 9 | import net.minecraft.client.gui.GuiButton; | 6 | import net.minecraft.client.gui.GuiButton; |
| 10 | import net.minecraft.client.resources.I18n; | 7 | import net.minecraft.client.resources.I18n; |
| @@ -218,10 +215,9 @@ class GuiPanelConfigContainer extends GuiPanel implements ConfigPanelHost | @@ -218,10 +215,9 @@ class GuiPanelConfigContainer extends GuiPanel implements ConfigPanelHost | ||
| 218 | * @param mouseX | 215 | * @param mouseX |
| 219 | * @param mouseY | 216 | * @param mouseY |
| 220 | * @param mouseButton | 217 | * @param mouseButton |
| 221 | - * @throws IOException | ||
| 222 | */ | 218 | */ |
| 223 | @Override | 219 | @Override |
| 224 | - void mousePressed(int mouseX, int mouseY, int mouseButton) throws IOException | 220 | + void mousePressed(int mouseX, int mouseY, int mouseButton) |
| 225 | { | 221 | { |
| 226 | if (mouseButton == 0) | 222 | if (mouseButton == 0) |
| 227 | { | 223 | { |
java/client/com/mumfrey/liteloader/client/gui/GuiPanelError.java
| 1 | package com.mumfrey.liteloader.client.gui; | 1 | package com.mumfrey.liteloader.client.gui; |
| 2 | 2 | ||
| 3 | -import java.io.IOException; | ||
| 4 | import java.io.PrintWriter; | 3 | import java.io.PrintWriter; |
| 5 | import java.io.StringWriter; | 4 | import java.io.StringWriter; |
| 6 | import java.util.ArrayList; | 5 | import java.util.ArrayList; |
| @@ -131,7 +130,7 @@ public class GuiPanelError extends GuiPanel implements ScrollPanelContent | @@ -131,7 +130,7 @@ public class GuiPanelError extends GuiPanel implements ScrollPanelContent | ||
| 131 | } | 130 | } |
| 132 | 131 | ||
| 133 | @Override | 132 | @Override |
| 134 | - void mousePressed(int mouseX, int mouseY, int mouseButton) throws IOException | 133 | + void mousePressed(int mouseX, int mouseY, int mouseButton) |
| 135 | { | 134 | { |
| 136 | this.scrollPane.mousePressed(mouseX, mouseY, mouseButton); | 135 | this.scrollPane.mousePressed(mouseX, mouseY, mouseButton); |
| 137 | super.mousePressed(mouseX, mouseY, mouseButton); | 136 | super.mousePressed(mouseX, mouseY, mouseButton); |
java/client/com/mumfrey/liteloader/client/gui/GuiPanelLiteLoaderLog.java
| @@ -2,7 +2,6 @@ package com.mumfrey.liteloader.client.gui; | @@ -2,7 +2,6 @@ package com.mumfrey.liteloader.client.gui; | ||
| 2 | 2 | ||
| 3 | import static com.mumfrey.liteloader.gl.GL.*; | 3 | import static com.mumfrey.liteloader.gl.GL.*; |
| 4 | 4 | ||
| 5 | -import java.io.IOException; | ||
| 6 | import java.net.URI; | 5 | import java.net.URI; |
| 7 | import java.util.ArrayList; | 6 | import java.util.ArrayList; |
| 8 | import java.util.List; | 7 | import java.util.List; |
| @@ -333,10 +332,9 @@ class GuiPanelLiteLoaderLog extends GuiPanel implements ScrollPanelContent | @@ -333,10 +332,9 @@ class GuiPanelLiteLoaderLog extends GuiPanel implements ScrollPanelContent | ||
| 333 | * @param mouseX | 332 | * @param mouseX |
| 334 | * @param mouseY | 333 | * @param mouseY |
| 335 | * @param mouseButton | 334 | * @param mouseButton |
| 336 | - * @throws IOException | ||
| 337 | */ | 335 | */ |
| 338 | @Override | 336 | @Override |
| 339 | - void mousePressed(int mouseX, int mouseY, int mouseButton) throws IOException | 337 | + void mousePressed(int mouseX, int mouseY, int mouseButton) |
| 340 | { | 338 | { |
| 341 | this.scrollPane.mousePressed(mouseX, mouseY, mouseButton); | 339 | this.scrollPane.mousePressed(mouseX, mouseY, mouseButton); |
| 342 | 340 |
java/client/com/mumfrey/liteloader/client/gui/GuiPanelMods.java
| @@ -3,7 +3,6 @@ package com.mumfrey.liteloader.client.gui; | @@ -3,7 +3,6 @@ package com.mumfrey.liteloader.client.gui; | ||
| 3 | import static com.mumfrey.liteloader.gl.GL.*; | 3 | import static com.mumfrey.liteloader.gl.GL.*; |
| 4 | import static com.mumfrey.liteloader.gl.GLClippingPlanes.*; | 4 | import static com.mumfrey.liteloader.gl.GLClippingPlanes.*; |
| 5 | 5 | ||
| 6 | -import java.io.IOException; | ||
| 7 | import java.util.ArrayList; | 6 | import java.util.ArrayList; |
| 8 | import java.util.List; | 7 | import java.util.List; |
| 9 | import java.util.Map; | 8 | import java.util.Map; |
| @@ -164,7 +163,7 @@ public class GuiPanelMods extends GuiPanel | @@ -164,7 +163,7 @@ public class GuiPanelMods extends GuiPanel | ||
| 164 | } | 163 | } |
| 165 | 164 | ||
| 166 | @Override | 165 | @Override |
| 167 | - void mousePressed(int mouseX, int mouseY, int mouseButton) throws IOException | 166 | + void mousePressed(int mouseX, int mouseY, int mouseButton) |
| 168 | { | 167 | { |
| 169 | if (mouseButton == 0) | 168 | if (mouseButton == 0) |
| 170 | { | 169 | { |
java/client/com/mumfrey/liteloader/client/gui/GuiScrollPanel.java
| @@ -2,9 +2,6 @@ package com.mumfrey.liteloader.client.gui; | @@ -2,9 +2,6 @@ package com.mumfrey.liteloader.client.gui; | ||
| 2 | 2 | ||
| 3 | import static com.mumfrey.liteloader.gl.GL.*; | 3 | import static com.mumfrey.liteloader.gl.GL.*; |
| 4 | import static com.mumfrey.liteloader.gl.GLClippingPlanes.*; | 4 | import static com.mumfrey.liteloader.gl.GLClippingPlanes.*; |
| 5 | - | ||
| 6 | -import java.io.IOException; | ||
| 7 | - | ||
| 8 | import net.minecraft.client.Minecraft; | 5 | import net.minecraft.client.Minecraft; |
| 9 | import net.minecraft.client.gui.GuiButton; | 6 | import net.minecraft.client.gui.GuiButton; |
| 10 | 7 | ||
| @@ -142,7 +139,7 @@ class GuiScrollPanel extends GuiPanel | @@ -142,7 +139,7 @@ class GuiScrollPanel extends GuiPanel | ||
| 142 | } | 139 | } |
| 143 | 140 | ||
| 144 | @Override | 141 | @Override |
| 145 | - public void mousePressed(int mouseX, int mouseY, int mouseButton) throws IOException | 142 | + public void mousePressed(int mouseX, int mouseY, int mouseButton) |
| 146 | { | 143 | { |
| 147 | mouseY += this.scrollBar.getValue() - this.top; | 144 | mouseY += this.scrollBar.getValue() - this.top; |
| 148 | mouseX -= this.left; | 145 | mouseX -= this.left; |
java/client/com/mumfrey/liteloader/client/transformers/LiteLoaderEventInjectionTransformer.java
| @@ -51,6 +51,9 @@ public class LiteLoaderEventInjectionTransformer extends EventInjectionTransform | @@ -51,6 +51,9 @@ public class LiteLoaderEventInjectionTransformer extends EventInjectionTransform | ||
| 51 | Event onRespawnPlayer = Event.getOrCreate("onRespawnPlayer", false); | 51 | Event onRespawnPlayer = Event.getOrCreate("onRespawnPlayer", false); |
| 52 | Event onStartupComplete = Event.getOrCreate("onStartupComplete", false); | 52 | Event onStartupComplete = Event.getOrCreate("onStartupComplete", false); |
| 53 | Event onSessionProfileBad = Event.getOrCreate("onSessionProfileBad", true); | 53 | Event onSessionProfileBad = Event.getOrCreate("onSessionProfileBad", true); |
| 54 | + Event onSaveScreenshot = Event.getOrCreate("onSaveScreenshot", true); | ||
| 55 | + Event onRenderEntity = Event.getOrCreate("onRenderEntity", false); | ||
| 56 | + Event onPostRenderEntity = Event.getOrCreate("onPostRenderEntity", false); | ||
| 54 | 57 | ||
| 55 | // Injection Points | 58 | // Injection Points |
| 56 | InjectionPoint methodHead = new MethodHead(); | 59 | InjectionPoint methodHead = new MethodHead(); |
| @@ -62,6 +65,8 @@ public class LiteLoaderEventInjectionTransformer extends EventInjectionTransform | @@ -62,6 +65,8 @@ public class LiteLoaderEventInjectionTransformer extends EventInjectionTransform | ||
| 62 | InjectionPoint beforeRender = new BeforeInvoke(updateCameraAndRender); | 65 | InjectionPoint beforeRender = new BeforeInvoke(updateCameraAndRender); |
| 63 | InjectionPoint beforeDrawChat = new BeforeInvoke(drawChat); | 66 | InjectionPoint beforeDrawChat = new BeforeInvoke(drawChat); |
| 64 | InjectionPoint beforeEndProfiler = new BeforeInvoke(endSection); | 67 | InjectionPoint beforeEndProfiler = new BeforeInvoke(endSection); |
| 68 | + InjectionPoint beforeIsFBOEnabled = new BeforeInvoke(isFramebufferEnabled); | ||
| 69 | + InjectionPoint beforeRenderEntity = new BeforeInvoke(doRender).setCaptureLocals(true); | ||
| 65 | InjectionPoint beforeTickProfiler = new BeforeStringInvoke("tick", startSection); | 70 | InjectionPoint beforeTickProfiler = new BeforeStringInvoke("tick", startSection); |
| 66 | InjectionPoint beforeCenterProfiler = new BeforeStringInvoke("center", startSection); | 71 | InjectionPoint beforeCenterProfiler = new BeforeStringInvoke("center", startSection); |
| 67 | InjectionPoint beforeRenderProfiler = new BeforeStringInvoke("gameRenderer", endStartSection); | 72 | InjectionPoint beforeRenderProfiler = new BeforeStringInvoke("gameRenderer", endStartSection); |
| @@ -95,6 +100,9 @@ public class LiteLoaderEventInjectionTransformer extends EventInjectionTransform | @@ -95,6 +100,9 @@ public class LiteLoaderEventInjectionTransformer extends EventInjectionTransform | ||
| 95 | this.add(onSpawnPlayer, spawnPlayer, (methodReturn), "onSpawnPlayer"); | 100 | this.add(onSpawnPlayer, spawnPlayer, (methodReturn), "onSpawnPlayer"); |
| 96 | this.add(onRespawnPlayer, respawnPlayer, (methodReturn), "onRespawnPlayer"); | 101 | this.add(onRespawnPlayer, respawnPlayer, (methodReturn), "onRespawnPlayer"); |
| 97 | this.add(onStartupComplete, startGame, (methodReturn), "onStartupComplete"); | 102 | this.add(onStartupComplete, startGame, (methodReturn), "onStartupComplete"); |
| 103 | + this.add(onSaveScreenshot, saveScreenshot, (beforeIsFBOEnabled), "onSaveScreenshot"); | ||
| 104 | + this.add(onRenderEntity, doRenderEntity, (beforeRenderEntity), "onRenderEntity"); | ||
| 105 | + this.add(onPostRenderEntity, doRenderEntity, after(beforeRenderEntity), "onPostRenderEntity"); | ||
| 98 | 106 | ||
| 99 | // Compatibility handlers | 107 | // Compatibility handlers |
| 100 | this.add(onSessionProfileBad, getProfile, (beforeNewGameProfile), "generateOfflineUUID"); | 108 | this.add(onSessionProfileBad, getProfile, (beforeNewGameProfile), "generateOfflineUUID"); |
java/common/com/mumfrey/liteloader/core/LiteLoader.java
| @@ -143,7 +143,7 @@ public final class LiteLoader | @@ -143,7 +143,7 @@ public final class LiteLoader | ||
| 143 | /** | 143 | /** |
| 144 | * Event manager | 144 | * Event manager |
| 145 | */ | 145 | */ |
| 146 | - private Events<?, ?> events; | 146 | + private LiteLoaderEventBroker<?, ?> events; |
| 147 | 147 | ||
| 148 | /** | 148 | /** |
| 149 | * Plugin channel manager | 149 | * Plugin channel manager |
java/common/com/mumfrey/liteloader/core/Events.java renamed to java/common/com/mumfrey/liteloader/core/LiteLoaderEventBroker.java
| @@ -33,9 +33,45 @@ import com.mumfrey.liteloader.util.log.LiteLoaderLogger; | @@ -33,9 +33,45 @@ import com.mumfrey.liteloader.util.log.LiteLoaderLogger; | ||
| 33 | * @param <TClient> Type of the client runtime, "Minecraft" on client and null on the server | 33 | * @param <TClient> Type of the client runtime, "Minecraft" on client and null on the server |
| 34 | * @param <TServer> Type of the server runtime, "IntegratedServer" on the client, "MinecraftServer" on the server | 34 | * @param <TServer> Type of the server runtime, "IntegratedServer" on the client, "MinecraftServer" on the server |
| 35 | */ | 35 | */ |
| 36 | -public abstract class Events<TClient, TServer extends MinecraftServer> implements InterfaceProvider, IResourceManagerReloadListener | 36 | +public abstract class LiteLoaderEventBroker<TClient, TServer extends MinecraftServer> implements InterfaceProvider, IResourceManagerReloadListener |
| 37 | { | 37 | { |
| 38 | /** | 38 | /** |
| 39 | + * @author Adam Mummery-Smith | ||
| 40 | + * | ||
| 41 | + * @param <T> | ||
| 42 | + */ | ||
| 43 | + public static class ReturnValue<T> | ||
| 44 | + { | ||
| 45 | + private T value; | ||
| 46 | + private boolean isSet; | ||
| 47 | + | ||
| 48 | + public ReturnValue(T value) | ||
| 49 | + { | ||
| 50 | + this.value = value; | ||
| 51 | + } | ||
| 52 | + | ||
| 53 | + public ReturnValue() | ||
| 54 | + { | ||
| 55 | + } | ||
| 56 | + | ||
| 57 | + public boolean isSet() | ||
| 58 | + { | ||
| 59 | + return this.isSet; | ||
| 60 | + } | ||
| 61 | + | ||
| 62 | + public T get() | ||
| 63 | + { | ||
| 64 | + return this.value; | ||
| 65 | + } | ||
| 66 | + | ||
| 67 | + public void set(T value) | ||
| 68 | + { | ||
| 69 | + this.isSet = true; | ||
| 70 | + this.value = value; | ||
| 71 | + } | ||
| 72 | + } | ||
| 73 | + | ||
| 74 | + /** | ||
| 39 | * Reference to the loader instance | 75 | * Reference to the loader instance |
| 40 | */ | 76 | */ |
| 41 | protected final LiteLoader loader; | 77 | protected final LiteLoader loader; |
| @@ -61,14 +97,14 @@ public abstract class Events<TClient, TServer extends MinecraftServer> implement | @@ -61,14 +97,14 @@ public abstract class Events<TClient, TServer extends MinecraftServer> implement | ||
| 61 | * List of mods which monitor server player events | 97 | * List of mods which monitor server player events |
| 62 | */ | 98 | */ |
| 63 | private FastIterable<ServerPlayerListener> serverPlayerListeners = new HandlerList<ServerPlayerListener>(ServerPlayerListener.class); | 99 | private FastIterable<ServerPlayerListener> serverPlayerListeners = new HandlerList<ServerPlayerListener>(ServerPlayerListener.class); |
| 64 | - | 100 | + |
| 65 | /** | 101 | /** |
| 66 | * Package private ctor | 102 | * Package private ctor |
| 67 | * | 103 | * |
| 68 | * @param loader | 104 | * @param loader |
| 69 | * @param minecraft | 105 | * @param minecraft |
| 70 | */ | 106 | */ |
| 71 | - public Events(LiteLoader loader, GameEngine<TClient, TServer> engine, LoaderProperties properties) | 107 | + public LiteLoaderEventBroker(LiteLoader loader, GameEngine<TClient, TServer> engine, LoaderProperties properties) |
| 72 | { | 108 | { |
| 73 | this.loader = loader; | 109 | this.loader = loader; |
| 74 | this.engine = engine; | 110 | this.engine = engine; |
java/common/com/mumfrey/liteloader/core/LiteLoaderVersion.java
| @@ -37,7 +37,7 @@ public enum LiteLoaderVersion | @@ -37,7 +37,7 @@ public enum LiteLoaderVersion | ||
| 37 | MC_1_7_10_R1(28, 1404673785, "1.7.10", "1.7.10_01", "1.7.10"), | 37 | MC_1_7_10_R1(28, 1404673785, "1.7.10", "1.7.10_01", "1.7.10"), |
| 38 | MC_1_7_10_R2(29, 1405369406, "1.7.10", "1.7.10_02", "1.7.10"), | 38 | MC_1_7_10_R2(29, 1405369406, "1.7.10", "1.7.10_02", "1.7.10"), |
| 39 | MC_1_7_10_R3(30, 1407687918, "1.7.10", "1.7.10_03", "1.7.10", "1.7.10_03"), | 39 | MC_1_7_10_R3(30, 1407687918, "1.7.10", "1.7.10_03", "1.7.10", "1.7.10_03"), |
| 40 | - MC_1_7_10_R4(31, 0, "1.7.10", "1.7.10_04", "1.7.10", "1.7.10_03", "1.7.10_04"), | 40 | + MC_1_7_10_R4(31, 1412718533, "1.7.10", "1.7.10_04", "1.7.10", "1.7.10_03", "1.7.10_04"), |
| 41 | MC_1_8_0_R0(32, 0, "1.8.0", "1.8.0", "1.8", "1.8.0"); | 41 | MC_1_8_0_R0(32, 0, "1.8.0", "1.8.0", "1.8", "1.8.0"); |
| 42 | 42 | ||
| 43 | /** | 43 | /** |
java/common/com/mumfrey/liteloader/core/event/EventProxy.java
| @@ -146,7 +146,12 @@ public final class EventProxy | @@ -146,7 +146,12 @@ public final class EventProxy | ||
| 146 | } | 146 | } |
| 147 | tpl.append(")\n\t {\n\t // handler code here\n\t }"); | 147 | tpl.append(")\n\t {\n\t // handler code here\n\t }"); |
| 148 | 148 | ||
| 149 | - return tpl.toString(); | 149 | + String template = tpl.toString(); |
| 150 | + if (template.contains(", ReturnType>")) | ||
| 151 | + { | ||
| 152 | + template = template.replace("static void", "static <ReturnType> void"); | ||
| 153 | + } | ||
| 154 | + return template; | ||
| 150 | } | 155 | } |
| 151 | 156 | ||
| 152 | private static boolean appendTypeName(StringBuilder tpl, Type type, String sourceClass) | 157 | private static boolean appendTypeName(StringBuilder tpl, Type type, String sourceClass) |
| @@ -160,7 +165,7 @@ public final class EventProxy | @@ -160,7 +165,7 @@ public final class EventProxy | ||
| 160 | String typeName = type.getClassName(); | 165 | String typeName = type.getClassName(); |
| 161 | typeName = typeName.substring(typeName.lastIndexOf('.') + 1); | 166 | typeName = typeName.substring(typeName.lastIndexOf('.') + 1); |
| 162 | tpl.append(typeName); | 167 | tpl.append(typeName); |
| 163 | - if (typeName.endsWith("ReturnEventInfo")) tpl.append('<').append(sourceClass).append(", ?>"); | 168 | + if (typeName.endsWith("ReturnEventInfo")) tpl.append('<').append(sourceClass).append(", ReturnType>"); |
| 164 | else if (typeName.endsWith("EventInfo")) tpl.append('<').append(sourceClass).append('>'); | 169 | else if (typeName.endsWith("EventInfo")) tpl.append('<').append(sourceClass).append('>'); |
| 165 | return false; | 170 | return false; |
| 166 | default: | 171 | default: |
java/common/com/mumfrey/liteloader/core/event/HandlerList.java
| @@ -25,6 +25,7 @@ import org.objectweb.asm.tree.*; | @@ -25,6 +25,7 @@ import org.objectweb.asm.tree.*; | ||
| 25 | import com.mumfrey.liteloader.Priority; | 25 | import com.mumfrey.liteloader.Priority; |
| 26 | import com.mumfrey.liteloader.core.runtime.Obf; | 26 | import com.mumfrey.liteloader.core.runtime.Obf; |
| 27 | import com.mumfrey.liteloader.interfaces.FastIterableDeque; | 27 | import com.mumfrey.liteloader.interfaces.FastIterableDeque; |
| 28 | +import com.mumfrey.liteloader.transformers.ByteCodeUtilities; | ||
| 28 | import com.mumfrey.liteloader.util.SortableValue; | 29 | import com.mumfrey.liteloader.util.SortableValue; |
| 29 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; | 30 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; |
| 30 | 31 | ||
| @@ -923,7 +924,7 @@ public class HandlerList<T> extends LinkedList<T> implements FastIterableDeque<T | @@ -923,7 +924,7 @@ public class HandlerList<T> extends LinkedList<T> implements FastIterableDeque<T | ||
| 923 | boolean isOrOperation = this.logicOp.isOr(); | 924 | boolean isOrOperation = this.logicOp.isOr(); |
| 924 | boolean breakOnMatch = this.logicOp.breakOnMatch(); | 925 | boolean breakOnMatch = this.logicOp.breakOnMatch(); |
| 925 | int initialValue = isOrOperation && (!this.logicOp.assumeTrue() || this.size > 0) ? Opcodes.ICONST_0 : Opcodes.ICONST_1; | 926 | int initialValue = isOrOperation && (!this.logicOp.assumeTrue() || this.size > 0) ? Opcodes.ICONST_0 : Opcodes.ICONST_1; |
| 926 | - int localIndex = this.getFirstLocalIndex(args); | 927 | + int localIndex = ByteCodeUtilities.getArgsSize(args); |
| 927 | 928 | ||
| 928 | method.instructions.add(new InsnNode(initialValue)); | 929 | method.instructions.add(new InsnNode(initialValue)); |
| 929 | method.instructions.add(new VarInsnNode(Opcodes.ISTORE, localIndex)); | 930 | method.instructions.add(new VarInsnNode(Opcodes.ISTORE, localIndex)); |
| @@ -984,13 +985,6 @@ public class HandlerList<T> extends LinkedList<T> implements FastIterableDeque<T | @@ -984,13 +985,6 @@ public class HandlerList<T> extends LinkedList<T> implements FastIterableDeque<T | ||
| 984 | return argNumber; | 985 | return argNumber; |
| 985 | } | 986 | } |
| 986 | 987 | ||
| 987 | - private int getFirstLocalIndex(Type[] args) | ||
| 988 | - { | ||
| 989 | - int argNumber = 1; | ||
| 990 | - for (Type type : args) argNumber += type.getSize(); | ||
| 991 | - return argNumber; | ||
| 992 | - } | ||
| 993 | - | ||
| 994 | /** | 988 | /** |
| 995 | * @param baseName | 989 | * @param baseName |
| 996 | * @param typeName | 990 | * @param typeName |
java/common/com/mumfrey/liteloader/core/runtime/Methods.java
| 1 | package com.mumfrey.liteloader.core.runtime; | 1 | package com.mumfrey.liteloader.core.runtime; |
| 2 | 2 | ||
| 3 | +import java.io.File; | ||
| 4 | + | ||
| 3 | import com.mumfrey.liteloader.transformers.event.MethodInfo; | 5 | import com.mumfrey.liteloader.transformers.event.MethodInfo; |
| 4 | 6 | ||
| 5 | /** | 7 | /** |
| @@ -29,6 +31,11 @@ public abstract class Methods | @@ -29,6 +31,11 @@ public abstract class Methods | ||
| 29 | public static final MethodInfo respawnPlayer = new MethodInfo(Obf.ServerConfigurationManager, Obf.respawnPlayer, Obf.EntityPlayerMP, Obf.EntityPlayerMP, Integer.TYPE, Boolean.TYPE); | 31 | public static final MethodInfo respawnPlayer = new MethodInfo(Obf.ServerConfigurationManager, Obf.respawnPlayer, Obf.EntityPlayerMP, Obf.EntityPlayerMP, Integer.TYPE, Boolean.TYPE); |
| 30 | public static final MethodInfo glClear = new MethodInfo(Obf.GlStateManager, Obf.clear, Void.TYPE, Integer.TYPE); | 32 | public static final MethodInfo glClear = new MethodInfo(Obf.GlStateManager, Obf.clear, Void.TYPE, Integer.TYPE); |
| 31 | public static final MethodInfo getProfile = new MethodInfo(Obf.Session, Obf.getProfile, Obf.GameProfile); | 33 | public static final MethodInfo getProfile = new MethodInfo(Obf.Session, Obf.getProfile, Obf.GameProfile); |
| 34 | + public static final MethodInfo saveScreenshot = new MethodInfo(Obf.ScreenShotHelper, Obf.saveScreenshot, Obf.IChatComponent, File.class, String.class, Integer.TYPE, Integer.TYPE, Obf.FrameBuffer); | ||
| 35 | + public static final MethodInfo isFramebufferEnabled = new MethodInfo(Obf.OpenGlHelper, Obf.isFramebufferEnabled, Boolean.TYPE); | ||
| 36 | + public static final MethodInfo doRenderEntity = new MethodInfo(Obf.RenderManager, Obf.doRenderEntity, Boolean.TYPE, Obf.Entity, Double.TYPE, Double.TYPE, Double.TYPE, Float.TYPE, Float.TYPE, Boolean.TYPE); | ||
| 37 | + public static final MethodInfo doRender = new MethodInfo(Obf.Render, Obf.doRender, Void.TYPE, Obf.Entity, Double.TYPE, Double.TYPE, Double.TYPE, Float.TYPE, Float.TYPE); | ||
| 38 | + public static final MethodInfo doRenderShadowAndFire = new MethodInfo(Obf.Render, Obf.doRenderShadowAndFire, Void.TYPE, Obf.Entity, Double.TYPE, Double.TYPE, Double.TYPE, Float.TYPE, Float.TYPE); | ||
| 32 | 39 | ||
| 33 | public static final MethodInfo startSection = new MethodInfo(Obf.Profiler, Obf.startSection, Void.TYPE, String.class); | 40 | public static final MethodInfo startSection = new MethodInfo(Obf.Profiler, Obf.startSection, Void.TYPE, String.class); |
| 34 | public static final MethodInfo endSection = new MethodInfo(Obf.Profiler, Obf.endSection, Void.TYPE); | 41 | public static final MethodInfo endSection = new MethodInfo(Obf.Profiler, Obf.endSection, Void.TYPE); |
java/common/com/mumfrey/liteloader/core/runtime/Obf.java
| @@ -51,6 +51,12 @@ public class Obf | @@ -51,6 +51,12 @@ public class Obf | ||
| 51 | public static final Obf GuiNewChat = new Obf("net.minecraft.client.gui.GuiNewChat", "buh" ); | 51 | public static final Obf GuiNewChat = new Obf("net.minecraft.client.gui.GuiNewChat", "buh" ); |
| 52 | public static final Obf GlStateManager = new Obf("net.minecraft.client.renderer.GlStateManager", "cjm" ); | 52 | public static final Obf GlStateManager = new Obf("net.minecraft.client.renderer.GlStateManager", "cjm" ); |
| 53 | public static final Obf Session = new Obf("net.minecraft.util.Session", "btw" ); | 53 | public static final Obf Session = new Obf("net.minecraft.util.Session", "btw" ); |
| 54 | + public static final Obf IChatComponent = new Obf("net.minecraft.util.IChatComponent", "ho" ); | ||
| 55 | + public static final Obf ScreenShotHelper = new Obf("net.minecraft.util.ScreenShotHelper", "btt" ); | ||
| 56 | + public static final Obf OpenGlHelper = new Obf("net.minecraft.client.renderer.OpenGlHelper", "dax" ); | ||
| 57 | + public static final Obf Entity = new Obf("net.minecraft.entity.Entity", "wv" ); | ||
| 58 | + public static final Obf RenderManager = new Obf("net.minecraft.client.renderer.entity.RenderManager", "cpt" ); | ||
| 59 | + public static final Obf Render = new Obf("net.minecraft.client.renderer.entity.Render", "cpu" ); | ||
| 54 | 60 | ||
| 55 | // Fields | 61 | // Fields |
| 56 | // ----------------------------------------------------------------------------------------- | 62 | // ----------------------------------------------------------------------------------------- |
| @@ -94,6 +100,11 @@ public class Obf | @@ -94,6 +100,11 @@ public class Obf | ||
| 94 | public static final Obf clear = new Obf("func_179086_m", "m" ); | 100 | public static final Obf clear = new Obf("func_179086_m", "m" ); |
| 95 | public static final Obf renderWorldPass = new Obf("func_175068_a", "a" ); | 101 | public static final Obf renderWorldPass = new Obf("func_175068_a", "a" ); |
| 96 | public static final Obf getProfile = new Obf("func_148256_e", "a" ); | 102 | public static final Obf getProfile = new Obf("func_148256_e", "a" ); |
| 103 | + public static final Obf saveScreenshot = new Obf("func_148260_a", "a" ); | ||
| 104 | + public static final Obf isFramebufferEnabled = new Obf("func_148822_b", "i" ); | ||
| 105 | + public static final Obf doRenderEntity = new Obf("func_147939_a", "a" ); | ||
| 106 | + public static final Obf doRender = new Obf("func_76986_a", "a" ); | ||
| 107 | + public static final Obf doRenderShadowAndFire = new Obf("func_76979_b", "b" ); | ||
| 97 | 108 | ||
| 98 | public static final int MCP = 0; | 109 | public static final int MCP = 0; |
| 99 | public static final int SRG = 1; | 110 | public static final int SRG = 1; |
java/common/com/mumfrey/liteloader/interfaces/ObjectFactory.java
| @@ -4,7 +4,7 @@ import net.minecraft.server.MinecraftServer; | @@ -4,7 +4,7 @@ import net.minecraft.server.MinecraftServer; | ||
| 4 | 4 | ||
| 5 | import com.mumfrey.liteloader.common.GameEngine; | 5 | import com.mumfrey.liteloader.common.GameEngine; |
| 6 | import com.mumfrey.liteloader.core.ClientPluginChannels; | 6 | import com.mumfrey.liteloader.core.ClientPluginChannels; |
| 7 | -import com.mumfrey.liteloader.core.Events; | 7 | +import com.mumfrey.liteloader.core.LiteLoaderEventBroker; |
| 8 | import com.mumfrey.liteloader.core.PacketEvents; | 8 | import com.mumfrey.liteloader.core.PacketEvents; |
| 9 | import com.mumfrey.liteloader.core.ServerPluginChannels; | 9 | import com.mumfrey.liteloader.core.ServerPluginChannels; |
| 10 | import com.mumfrey.liteloader.permissions.PermissionsManagerClient; | 10 | import com.mumfrey.liteloader.permissions.PermissionsManagerClient; |
| @@ -20,7 +20,7 @@ import com.mumfrey.liteloader.permissions.PermissionsManagerServer; | @@ -20,7 +20,7 @@ import com.mumfrey.liteloader.permissions.PermissionsManagerServer; | ||
| 20 | */ | 20 | */ |
| 21 | public interface ObjectFactory<TClient, TServer extends MinecraftServer> | 21 | public interface ObjectFactory<TClient, TServer extends MinecraftServer> |
| 22 | { | 22 | { |
| 23 | - public abstract Events<TClient, TServer> getEventBroker(); | 23 | + public abstract LiteLoaderEventBroker<TClient, TServer> getEventBroker(); |
| 24 | 24 | ||
| 25 | public abstract PacketEvents getPacketEventBroker(); | 25 | public abstract PacketEvents getPacketEventBroker(); |
| 26 | 26 |
java/common/com/mumfrey/liteloader/modconfig/ConfigPanel.java
| 1 | package com.mumfrey.liteloader.modconfig; | 1 | package com.mumfrey.liteloader.modconfig; |
| 2 | 2 | ||
| 3 | -import java.io.IOException; | ||
| 4 | 3 | ||
| 5 | /** | 4 | /** |
| 6 | * Interface for mod config panels to implement | 5 | * Interface for mod config panels to implement |
| @@ -61,7 +60,7 @@ public interface ConfigPanel | @@ -61,7 +60,7 @@ public interface ConfigPanel | ||
| 61 | * @param mouseY | 60 | * @param mouseY |
| 62 | * @param mouseButton | 61 | * @param mouseButton |
| 63 | */ | 62 | */ |
| 64 | - public abstract void mousePressed(ConfigPanelHost host, int mouseX, int mouseY, int mouseButton) throws IOException; | 63 | + public abstract void mousePressed(ConfigPanelHost host, int mouseX, int mouseY, int mouseButton); |
| 65 | 64 | ||
| 66 | /** | 65 | /** |
| 67 | * Called when a mouse button is released | 66 | * Called when a mouse button is released |
java/common/com/mumfrey/liteloader/transformers/ByteCodeUtilities.java
| @@ -74,6 +74,49 @@ public abstract class ByteCodeUtilities | @@ -74,6 +74,49 @@ public abstract class ByteCodeUtilities | ||
| 74 | } | 74 | } |
| 75 | } | 75 | } |
| 76 | } | 76 | } |
| 77 | + | ||
| 78 | + /** | ||
| 79 | + * Get the first variable index in the supplied method which is not an argument or "this" reference, this corresponds | ||
| 80 | + * to the size of the arguments passed in to the method plus an extra spot for "this" if the method is non-static | ||
| 81 | + * | ||
| 82 | + * @param method | ||
| 83 | + * @return | ||
| 84 | + */ | ||
| 85 | + public static int getFirstNonArgLocalIndex(MethodNode method) | ||
| 86 | + { | ||
| 87 | + return ByteCodeUtilities.getFirstNonArgLocalIndex(Type.getArgumentTypes(method.desc), (method.access & Opcodes.ACC_STATIC) == 0); | ||
| 88 | + } | ||
| 89 | + | ||
| 90 | + /** | ||
| 91 | + * Get the first non-arg variable index based on the supplied arg array and whether to include the "this" reference, | ||
| 92 | + * this corresponds to the size of the arguments passed in to the method plus an extra spot for "this" is specified | ||
| 93 | + | ||
| 94 | + * @param args | ||
| 95 | + * @param includeThis | ||
| 96 | + * @return | ||
| 97 | + */ | ||
| 98 | + public static int getFirstNonArgLocalIndex(Type[] args, boolean includeThis) | ||
| 99 | + { | ||
| 100 | + return ByteCodeUtilities.getArgsSize(args) + (includeThis ? 1 : 0); | ||
| 101 | + } | ||
| 102 | + | ||
| 103 | + /** | ||
| 104 | + * Get the size of the specified args array in local variable terms (eg. doubles and longs take two spaces) | ||
| 105 | + * | ||
| 106 | + * @param args | ||
| 107 | + * @return | ||
| 108 | + */ | ||
| 109 | + public static int getArgsSize(Type[] args) | ||
| 110 | + { | ||
| 111 | + int size = 0; | ||
| 112 | + | ||
| 113 | + for (Type type : args) | ||
| 114 | + { | ||
| 115 | + size += type.getSize(); | ||
| 116 | + } | ||
| 117 | + | ||
| 118 | + return size; | ||
| 119 | + } | ||
| 77 | 120 | ||
| 78 | /** | 121 | /** |
| 79 | * Attempts to identify available locals at an arbitrary point in the bytecode specified by node. | 122 | * Attempts to identify available locals at an arbitrary point in the bytecode specified by node. |
| @@ -121,8 +164,7 @@ public abstract class ByteCodeUtilities | @@ -121,8 +164,7 @@ public abstract class ByteCodeUtilities | ||
| 121 | FrameNode frameNode = (FrameNode)insn; | 164 | FrameNode frameNode = (FrameNode)insn; |
| 122 | 165 | ||
| 123 | // localPos tracks the location in the frame node's locals list, which doesn't leave space for TOP entries | 166 | // localPos tracks the location in the frame node's locals list, which doesn't leave space for TOP entries |
| 124 | - int localPos = 0; | ||
| 125 | - for (int framePos = 0; framePos < frame.length; framePos++) | 167 | + for (int localPos = 0, framePos = 0; framePos < frame.length; framePos++, localPos++) |
| 126 | { | 168 | { |
| 127 | // Get the local at the current position in the FrameNode's locals list | 169 | // Get the local at the current position in the FrameNode's locals list |
| 128 | final Object localType = (localPos < frameNode.local.size()) ? frameNode.local.get(localPos) : null; | 170 | final Object localType = (localPos < frameNode.local.size()) ? frameNode.local.get(localPos) : null; |
| @@ -163,8 +205,6 @@ public abstract class ByteCodeUtilities | @@ -163,8 +205,6 @@ public abstract class ByteCodeUtilities | ||
| 163 | { | 205 | { |
| 164 | throw new RuntimeException("Invalid value " + localType + " in locals array at position " + localPos + " in " + classNode.name + "." + method.name + method.desc); | 206 | throw new RuntimeException("Invalid value " + localType + " in locals array at position " + localPos + " in " + classNode.name + "." + method.name + method.desc); |
| 165 | } | 207 | } |
| 166 | - | ||
| 167 | - localPos++; | ||
| 168 | } | 208 | } |
| 169 | } | 209 | } |
| 170 | else if (insn instanceof VarInsnNode) | 210 | else if (insn instanceof VarInsnNode) |
java/common/com/mumfrey/liteloader/transformers/event/Event.java
| @@ -312,11 +312,11 @@ public class Event implements Comparable<Event> | @@ -312,11 +312,11 @@ public class Event implements Comparable<Event> | ||
| 312 | // Pre-flight checks | 312 | // Pre-flight checks |
| 313 | this.validate(injectionPoint, cancellable, globalEventID); | 313 | this.validate(injectionPoint, cancellable, globalEventID); |
| 314 | 314 | ||
| 315 | - Type[] argumentTypes = Type.getArgumentTypes(this.method.desc); | ||
| 316 | - int initialFrameSize = argumentTypes.length + (this.methodIsStatic ? 0 : 1); | 315 | + Type[] arguments = Type.getArgumentTypes(this.method.desc); |
| 316 | + int initialFrameSize = ByteCodeUtilities.getFirstNonArgLocalIndex(arguments, !this.methodIsStatic); | ||
| 317 | 317 | ||
| 318 | boolean doCaptureLocals = captureLocals && locals != null && locals.length > initialFrameSize; | 318 | boolean doCaptureLocals = captureLocals && locals != null && locals.length > initialFrameSize; |
| 319 | - String eventDescriptor = this.generateEventDescriptor(doCaptureLocals, locals, argumentTypes, initialFrameSize); | 319 | + String eventDescriptor = this.generateEventDescriptor(doCaptureLocals, locals, arguments, initialFrameSize); |
| 320 | 320 | ||
| 321 | // Create the handler delegate method | 321 | // Create the handler delegate method |
| 322 | MethodNode handler = new MethodNode(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC | Opcodes.ACC_SYNTHETIC, Event.getHandlerName(globalEventID), eventDescriptor, null, null); | 322 | MethodNode handler = new MethodNode(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC | Opcodes.ACC_SYNTHETIC, Event.getHandlerName(globalEventID), eventDescriptor, null, null); |
| @@ -324,7 +324,7 @@ public class Event implements Comparable<Event> | @@ -324,7 +324,7 @@ public class Event implements Comparable<Event> | ||
| 324 | 324 | ||
| 325 | LiteLoaderLogger.debug("Event %s is spawning handler %s in class %s", this.name, handler.name, Event.getActiveProxyRef()); | 325 | LiteLoaderLogger.debug("Event %s is spawning handler %s in class %s", this.name, handler.name, Event.getActiveProxyRef()); |
| 326 | 326 | ||
| 327 | - int ctorMAXS = 0, invokeMAXS = argumentTypes.length + (doCaptureLocals ? locals.length - initialFrameSize : 0); | 327 | + int ctorMAXS = 0, invokeMAXS = arguments.length + (doCaptureLocals ? locals.length - initialFrameSize : 0); |
| 328 | int eventInfoVar = this.method.maxLocals++; | 328 | int eventInfoVar = this.method.maxLocals++; |
| 329 | 329 | ||
| 330 | InsnList insns = new InsnList(); | 330 | InsnList insns = new InsnList(); |
| @@ -332,12 +332,12 @@ public class Event implements Comparable<Event> | @@ -332,12 +332,12 @@ public class Event implements Comparable<Event> | ||
| 332 | // Instance the EventInfo for this event | 332 | // Instance the EventInfo for this event |
| 333 | insns.add(new TypeInsnNode(Opcodes.NEW, this.eventInfoClass)); ctorMAXS++; | 333 | insns.add(new TypeInsnNode(Opcodes.NEW, this.eventInfoClass)); ctorMAXS++; |
| 334 | insns.add(new InsnNode(Opcodes.DUP)); ctorMAXS++; invokeMAXS++; | 334 | insns.add(new InsnNode(Opcodes.DUP)); ctorMAXS++; invokeMAXS++; |
| 335 | - ctorMAXS += invokeEventInfoConstructor(insns, cancellable); | 335 | + ctorMAXS += this.invokeEventInfoConstructor(insns, cancellable); |
| 336 | insns.add(new VarInsnNode(Opcodes.ASTORE, eventInfoVar)); | 336 | insns.add(new VarInsnNode(Opcodes.ASTORE, eventInfoVar)); |
| 337 | 337 | ||
| 338 | // Call the event handler method in the proxy | 338 | // Call the event handler method in the proxy |
| 339 | insns.add(new VarInsnNode(Opcodes.ALOAD, eventInfoVar)); | 339 | insns.add(new VarInsnNode(Opcodes.ALOAD, eventInfoVar)); |
| 340 | - ByteCodeUtilities.loadArgs(argumentTypes, insns, this.methodIsStatic ? 0 : 1); | 340 | + ByteCodeUtilities.loadArgs(arguments, insns, this.methodIsStatic ? 0 : 1); |
| 341 | if (doCaptureLocals) | 341 | if (doCaptureLocals) |
| 342 | { | 342 | { |
| 343 | ByteCodeUtilities.loadLocals(locals, insns, initialFrameSize); | 343 | ByteCodeUtilities.loadLocals(locals, insns, initialFrameSize); |
| @@ -474,6 +474,14 @@ public class Event implements Comparable<Event> | @@ -474,6 +474,14 @@ public class Event implements Comparable<Event> | ||
| 474 | } | 474 | } |
| 475 | 475 | ||
| 476 | /** | 476 | /** |
| 477 | + * Get currently registered listeners for this event | ||
| 478 | + */ | ||
| 479 | + public Set<MethodInfo> getListeners() | ||
| 480 | + { | ||
| 481 | + return Collections.<MethodInfo>unmodifiableSet(this.listeners); | ||
| 482 | + } | ||
| 483 | + | ||
| 484 | + /** | ||
| 477 | * Get an event by name (case insensitive) | 485 | * Get an event by name (case insensitive) |
| 478 | * | 486 | * |
| 479 | * @param eventName | 487 | * @param eventName |
| @@ -487,28 +495,6 @@ public class Event implements Comparable<Event> | @@ -487,28 +495,6 @@ public class Event implements Comparable<Event> | ||
| 487 | 495 | ||
| 488 | return null; | 496 | return null; |
| 489 | } | 497 | } |
| 490 | - | ||
| 491 | - /** | ||
| 492 | - * Get all of the listeners for an event by name | ||
| 493 | - * | ||
| 494 | - * @param eventName | ||
| 495 | - * @return | ||
| 496 | - */ | ||
| 497 | - static Set<MethodInfo> getEventListeners(String eventName) | ||
| 498 | - { | ||
| 499 | - return Event.getEventListeners(Event.getEvent(eventName)); | ||
| 500 | - } | ||
| 501 | - | ||
| 502 | - /** | ||
| 503 | - * Get all of an event's listeners | ||
| 504 | - * | ||
| 505 | - * @param event | ||
| 506 | - * @return | ||
| 507 | - */ | ||
| 508 | - static Set<MethodInfo> getEventListeners(Event event) | ||
| 509 | - { | ||
| 510 | - return event == null ? null : Collections.unmodifiableSet(event.listeners); | ||
| 511 | - } | ||
| 512 | 498 | ||
| 513 | /** | 499 | /** |
| 514 | * Populates the event proxy class with delegating methods for all injected events | 500 | * Populates the event proxy class with delegating methods for all injected events |
java/common/com/mumfrey/liteloader/transformers/event/EventTransformer.java
| @@ -10,7 +10,6 @@ import java.util.Set; | @@ -10,7 +10,6 @@ import java.util.Set; | ||
| 10 | import java.util.TreeSet; | 10 | import java.util.TreeSet; |
| 11 | 11 | ||
| 12 | import org.objectweb.asm.ClassWriter; | 12 | import org.objectweb.asm.ClassWriter; |
| 13 | -import org.objectweb.asm.Opcodes; | ||
| 14 | import org.objectweb.asm.Type; | 13 | import org.objectweb.asm.Type; |
| 15 | import org.objectweb.asm.tree.AbstractInsnNode; | 14 | import org.objectweb.asm.tree.AbstractInsnNode; |
| 16 | import org.objectweb.asm.tree.ClassNode; | 15 | import org.objectweb.asm.tree.ClassNode; |
| @@ -283,7 +282,7 @@ public final class EventTransformer extends ClassTransformer | @@ -283,7 +282,7 @@ public final class EventTransformer extends ClassTransformer | ||
| 283 | injection.setLocals(locals); | 282 | injection.setLocals(locals); |
| 284 | if (injectionPoint.logLocals()) | 283 | if (injectionPoint.logLocals()) |
| 285 | { | 284 | { |
| 286 | - int startPos = ((method.access & Opcodes.ACC_STATIC) == 0 ? 1 : 0) + Type.getArgumentTypes(method.desc).length; | 285 | + int startPos = ByteCodeUtilities.getFirstNonArgLocalIndex(method); |
| 287 | 286 | ||
| 288 | LiteLoaderLogger.debug(ClassTransformer.HORIZONTAL_RULE); | 287 | LiteLoaderLogger.debug(ClassTransformer.HORIZONTAL_RULE); |
| 289 | LiteLoaderLogger.debug("Logging local variables for " + injectionPoint.getClass().getSimpleName()); | 288 | LiteLoaderLogger.debug("Logging local variables for " + injectionPoint.getClass().getSimpleName()); |