Commit e01dd5f516a16a01fc088c54e7fb450d45184c3f
1 parent
53506bde
propagate event injection through to the mod list, and provide help screens for …
…tweak/transformer/event icons
Showing
13 changed files
with
219 additions
and
28 deletions
java/client/com/mumfrey/liteloader/client/api/LiteLoaderModInfoDecorator.java
... | ... | @@ -6,6 +6,7 @@ import net.minecraft.client.resources.I18n; |
6 | 6 | |
7 | 7 | import com.mumfrey.liteloader.api.ModInfoDecorator; |
8 | 8 | import com.mumfrey.liteloader.client.gui.GuiLiteLoaderPanel; |
9 | +import com.mumfrey.liteloader.client.gui.modlist.GuiModListPanel; | |
9 | 10 | import com.mumfrey.liteloader.client.util.render.IconAbsolute; |
10 | 11 | import com.mumfrey.liteloader.client.util.render.IconAbsoluteClickable; |
11 | 12 | import com.mumfrey.liteloader.core.ModInfo; |
... | ... | @@ -26,12 +27,44 @@ public class LiteLoaderModInfoDecorator implements ModInfoDecorator |
26 | 27 | { |
27 | 28 | if (mod.hasTweakClass()) |
28 | 29 | { |
29 | - icons.add(new IconAbsolute(LiteLoaderBrandingProvider.ABOUT_TEXTURE, I18n.format("gui.mod.providestweak"), 12, 12, 158, 80, 170, 92)); | |
30 | + icons.add(new IconAbsoluteClickable(LiteLoaderBrandingProvider.ABOUT_TEXTURE, I18n.format("gui.mod.providestweak"), 12, 12, 158, 80, 170, 92){ | |
31 | + @Override | |
32 | + public void onClicked(Object source, Object container) | |
33 | + { | |
34 | + if (container instanceof GuiModListPanel) | |
35 | + { | |
36 | + ((GuiModListPanel)container).displayModHelpMessage(mod, "gui.mod.providestweak", "gui.mod.help.tweak"); | |
37 | + } | |
38 | + } | |
39 | + }); | |
40 | + } | |
41 | + | |
42 | + if (mod.hasEventTransformers()) | |
43 | + { | |
44 | + icons.add(new IconAbsoluteClickable(LiteLoaderBrandingProvider.ABOUT_TEXTURE, I18n.format("gui.mod.providesevents"), 12, 12, 170, 92, 182, 104){ | |
45 | + @Override | |
46 | + public void onClicked(Object source, Object container) | |
47 | + { | |
48 | + if (container instanceof GuiModListPanel) | |
49 | + { | |
50 | + ((GuiModListPanel)container).displayModHelpMessage(mod, "gui.mod.providesevents", "gui.mod.help.events"); | |
51 | + } | |
52 | + } | |
53 | + }); | |
30 | 54 | } |
31 | 55 | |
32 | 56 | if (mod.hasClassTransformers()) |
33 | 57 | { |
34 | - icons.add(new IconAbsolute(LiteLoaderBrandingProvider.ABOUT_TEXTURE, I18n.format("gui.mod.providestransformer"), 12, 12, 170, 80, 182, 92)); | |
58 | + icons.add(new IconAbsoluteClickable(LiteLoaderBrandingProvider.ABOUT_TEXTURE, I18n.format("gui.mod.providestransformer"), 12, 12, 170, 80, 182, 92){ | |
59 | + @Override | |
60 | + public void onClicked(Object source, Object container) | |
61 | + { | |
62 | + if (container instanceof GuiModListPanel) | |
63 | + { | |
64 | + ((GuiModListPanel)container).displayModHelpMessage(mod, "gui.mod.providestransformer", "gui.mod.help.transformer"); | |
65 | + } | |
66 | + } | |
67 | + }); | |
35 | 68 | } |
36 | 69 | |
37 | 70 | if (mod.usesAPI()) | ... | ... |
java/client/com/mumfrey/liteloader/client/gui/modlist/GuiModInfoPanel.java
1 | 1 | package com.mumfrey.liteloader.client.gui.modlist; |
2 | 2 | |
3 | +import static com.mumfrey.liteloader.gl.GL.*; | |
3 | 4 | import static com.mumfrey.liteloader.gl.GLClippingPlanes.*; |
5 | +import net.minecraft.client.Minecraft; | |
4 | 6 | import net.minecraft.client.gui.FontRenderer; |
5 | 7 | import net.minecraft.client.gui.Gui; |
6 | 8 | import net.minecraft.client.resources.I18n; |
7 | 9 | |
8 | 10 | import com.google.common.base.Strings; |
11 | +import com.mumfrey.liteloader.client.api.LiteLoaderBrandingProvider; | |
9 | 12 | import com.mumfrey.liteloader.client.gui.GuiSimpleScrollBar; |
13 | +import com.mumfrey.liteloader.client.util.render.IconAbsolute; | |
10 | 14 | import com.mumfrey.liteloader.core.ModInfo; |
15 | +import com.mumfrey.liteloader.util.render.IconTextured; | |
11 | 16 | |
12 | 17 | public class GuiModInfoPanel extends Gui |
13 | 18 | { |
... | ... | @@ -16,6 +21,8 @@ public class GuiModInfoPanel extends Gui |
16 | 21 | private static final int DIVIDER_COLOUR = GuiModListPanel.GREY; |
17 | 22 | private static final int DESCRIPTION_COLOUR = GuiModListPanel.WHITE; |
18 | 23 | |
24 | + private static final IconAbsolute infoIcon = new IconAbsolute(LiteLoaderBrandingProvider.ABOUT_TEXTURE, "Info", 12, 12, 146, 92, 158, 104); | |
25 | + | |
19 | 26 | private final ModListEntry owner; |
20 | 27 | |
21 | 28 | private final FontRenderer fontRenderer; |
... | ... | @@ -27,6 +34,10 @@ public class GuiModInfoPanel extends Gui |
27 | 34 | private GuiSimpleScrollBar scrollBar = new GuiSimpleScrollBar(); |
28 | 35 | |
29 | 36 | private boolean mouseOverPanel, mouseOverScrollBar; |
37 | + | |
38 | + private boolean showHelp; | |
39 | + | |
40 | + private String helpTitle, helpText; | |
30 | 41 | |
31 | 42 | public GuiModInfoPanel(ModListEntry owner, FontRenderer fontRenderer, int brandColour, ModInfo<?> modInfo) |
32 | 43 | { |
... | ... | @@ -57,18 +68,48 @@ public class GuiModInfoPanel extends Gui |
57 | 68 | drawRect(xPosition + 5, yPos, xPosition + width, yPos + 1, GuiModInfoPanel.DIVIDER_COLOUR); yPos += 4; // divider |
58 | 69 | drawRect(xPosition + 5, bottom - 1, xPosition + width, bottom, GuiModInfoPanel.DIVIDER_COLOUR); // divider |
59 | 70 | |
71 | + glEnableClipping(-1, -1, yPos, bottom - 3); | |
72 | + | |
60 | 73 | int scrollHeight = bottom - yPos - 3; |
61 | - int totalHeight = this.fontRenderer.splitStringWidth(this.modInfo.getDescription(), width - 11); | |
74 | + int contentHeight = this.drawContent(xPosition, width, yPos); | |
62 | 75 | |
63 | - this.scrollBar.setMaxValue(totalHeight - scrollHeight); | |
64 | - this.scrollBar.drawScrollBar(mouseX, mouseY, partialTicks, xPosition + width - 5, yPos, 5, scrollHeight, totalHeight); | |
76 | + this.scrollBar.setMaxValue(contentHeight - scrollHeight); | |
77 | + this.scrollBar.drawScrollBar(mouseX, mouseY, partialTicks, xPosition + width - 5, yPos, 5, scrollHeight, contentHeight); | |
65 | 78 | |
66 | 79 | this.mouseOverScrollBar = this.isMouseOver(mouseX, mouseY, xPosition + width - 5, yPos, 5, scrollHeight); |
80 | + } | |
67 | 81 | |
68 | - glEnableClipping(-1, -1, yPos, bottom - 3); | |
69 | - this.fontRenderer.drawSplitString(this.modInfo.getDescription(), xPosition + 5, yPos - this.scrollBar.getValue(), width - 11, GuiModInfoPanel.DESCRIPTION_COLOUR); | |
82 | + private int drawContent(int xPosition, int width, int yPos) | |
83 | + { | |
84 | + yPos -= this.scrollBar.getValue(); | |
85 | + | |
86 | + if (this.showHelp) | |
87 | + { | |
88 | + this.drawIcon(xPosition + 3, yPos, GuiModInfoPanel.infoIcon); yPos += 2; | |
89 | + this.fontRenderer.drawString(this.helpTitle, xPosition + 17, yPos, this.brandColour); yPos += 12; | |
90 | + return this.drawText(xPosition + 17, width - 24, yPos, this.helpText, GuiModInfoPanel.DESCRIPTION_COLOUR) + 15; | |
91 | + } | |
92 | + | |
93 | + return this.drawText(xPosition + 5, width - 11, yPos, this.modInfo.getDescription(), GuiModInfoPanel.DESCRIPTION_COLOUR); | |
70 | 94 | } |
71 | 95 | |
96 | + protected void drawIcon(int xPosition, int yPosition, IconTextured icon) | |
97 | + { | |
98 | + glColor4f(1.0F, 1.0F, 1.0F, 1.0F); | |
99 | + Minecraft.getMinecraft().getTextureManager().bindTexture(icon.getTextureResource()); | |
100 | + | |
101 | + glEnableBlend(); | |
102 | + this.drawTexturedModalRect(xPosition, yPosition, icon.getUPos(), icon.getVPos(), icon.getIconWidth(), icon.getIconHeight()); | |
103 | + glDisableBlend(); | |
104 | + } | |
105 | + | |
106 | + private int drawText(int xPosition, int width, int yPos, String text, int colour) | |
107 | + { | |
108 | + int totalHeight = this.fontRenderer.splitStringWidth(text, width); | |
109 | + this.fontRenderer.drawSplitString(text, xPosition, yPos, width, colour); | |
110 | + return totalHeight; | |
111 | + } | |
112 | + | |
72 | 113 | private boolean isMouseOver(int mouseX, int mouseY, int x, int y, int width, int height) |
73 | 114 | { |
74 | 115 | return mouseX > x && mouseX < x + width && mouseY > y && mouseY < y + height; |
... | ... | @@ -97,4 +138,17 @@ public class GuiModInfoPanel extends Gui |
97 | 138 | |
98 | 139 | return false; |
99 | 140 | } |
141 | + | |
142 | + public void displayHelpMessage(String title, String text) | |
143 | + { | |
144 | + this.showHelp = true; | |
145 | + this.helpTitle = I18n.format(title); | |
146 | + this.helpText = I18n.format(text); | |
147 | + this.scrollBar.setValue(0); | |
148 | + } | |
149 | + | |
150 | + public void clearHelpMessage() | |
151 | + { | |
152 | + this.showHelp = false; | |
153 | + } | |
100 | 154 | } | ... | ... |
java/client/com/mumfrey/liteloader/client/gui/modlist/GuiModListPanel.java
... | ... | @@ -252,4 +252,14 @@ public class GuiModListPanel extends Gui |
252 | 252 | this.mouseOverIcon.onClicked(source, this); |
253 | 253 | } |
254 | 254 | } |
255 | + | |
256 | + public void mousePressed(int mouseX, int mouseY, int mouseButton) | |
257 | + { | |
258 | + this.owner.clearHelpMessage(); | |
259 | + } | |
260 | + | |
261 | + public void displayModHelpMessage(ModInfo<?> mod, String title, String text) | |
262 | + { | |
263 | + this.owner.displayHelpMessage(title, text); | |
264 | + } | |
255 | 265 | } | ... | ... |
java/client/com/mumfrey/liteloader/client/gui/modlist/ModListEntry.java
... | ... | @@ -149,6 +149,11 @@ public class ModListEntry |
149 | 149 | { |
150 | 150 | this.modList.selectMod(this); |
151 | 151 | |
152 | + if (this.getListPanel().isMouseOver()) | |
153 | + { | |
154 | + this.getListPanel().mousePressed(mouseX, mouseY, mouseButton); | |
155 | + } | |
156 | + | |
152 | 157 | if (this.getListPanel().isMouseOverIcon()) |
153 | 158 | { |
154 | 159 | this.getListPanel().iconClick(this.modList.getParentScreen()); |
... | ... | @@ -221,6 +226,16 @@ public class ModListEntry |
221 | 226 | } |
222 | 227 | } |
223 | 228 | |
229 | + protected void displayHelpMessage(String title, String text) | |
230 | + { | |
231 | + this.infoPanel.displayHelpMessage(title, text); | |
232 | + } | |
233 | + | |
234 | + public void clearHelpMessage() | |
235 | + { | |
236 | + this.infoPanel.clearHelpMessage(); | |
237 | + } | |
238 | + | |
224 | 239 | public String getKey() |
225 | 240 | { |
226 | 241 | return (this.isErrored ? "0000" : "") + this.modInfo.getIdentifier() + Integer.toHexString(this.hashCode()); | ... | ... |
java/common/com/mumfrey/liteloader/core/LiteLoaderVersion.java
... | ... | @@ -37,7 +37,7 @@ public enum LiteLoaderVersion |
37 | 37 | MC_1_7_10_R1(28, 1404673785, "1.7.10", "1.7.10_01", "1.7.10"), |
38 | 38 | MC_1_7_10_R2(29, 1405369406, "1.7.10", "1.7.10_02", "1.7.10"), |
39 | 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, 1412718533, "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, 1414368553, "1.7.10", "1.7.10_04", "1.7.10", "1.7.10_03", "1.7.10_04"), | |
41 | 41 | MC_1_8_0_R0(32, 0, "1.8", "1.8.0", "1.8", "1.8.0"); |
42 | 42 | |
43 | 43 | /** | ... | ... |
java/common/com/mumfrey/liteloader/core/ModInfo.java
... | ... | @@ -172,6 +172,14 @@ public abstract class ModInfo<TContainer extends Loadable<?>> |
172 | 172 | } |
173 | 173 | |
174 | 174 | /** |
175 | + * If this has JSON event transformers | |
176 | + */ | |
177 | + public boolean hasEventTransformers() | |
178 | + { | |
179 | + return (this.container instanceof TweakContainer && ((TweakContainer<?>)this.container).hasEventTransformers()); | |
180 | + } | |
181 | + | |
182 | + /** | |
175 | 183 | * Get whether this mod uses external (3rd-party) API |
176 | 184 | */ |
177 | 185 | public boolean usesAPI() | ... | ... |
java/common/com/mumfrey/liteloader/interfaces/LoadableFile.java
... | ... | @@ -71,6 +71,8 @@ public class LoadableFile extends File implements TweakContainer<File> |
71 | 71 | |
72 | 72 | protected String author = "Unknown"; |
73 | 73 | |
74 | + protected boolean hasEventTransformers; | |
75 | + | |
74 | 76 | /** |
75 | 77 | * Create a new tweak container wrapping the specified file |
76 | 78 | */ |
... | ... | @@ -297,6 +299,17 @@ public class LoadableFile extends File implements TweakContainer<File> |
297 | 299 | { |
298 | 300 | return new ArrayList<String>(); |
299 | 301 | } |
302 | + | |
303 | + @Override | |
304 | + public boolean hasEventTransformers() | |
305 | + { | |
306 | + return this.hasEventTransformers; | |
307 | + } | |
308 | + | |
309 | + public void onEventsInjected() | |
310 | + { | |
311 | + this.hasEventTransformers = true; | |
312 | + } | |
300 | 313 | |
301 | 314 | public boolean isInjectionForced() |
302 | 315 | { | ... | ... |
java/common/com/mumfrey/liteloader/interfaces/TweakContainer.java
... | ... | @@ -38,4 +38,9 @@ public interface TweakContainer<L> extends Loadable<L>, Injectable |
38 | 38 | * Get class transformers defined in the metadata |
39 | 39 | */ |
40 | 40 | public abstract List<String> getClassTransformerClassNames(); |
41 | + | |
42 | + /** | |
43 | + * True if this container defines event transformers via JSON | |
44 | + */ | |
45 | + public abstract boolean hasEventTransformers(); | |
41 | 46 | } |
42 | 47 | \ No newline at end of file | ... | ... |
java/common/com/mumfrey/liteloader/transformers/event/Event.java
... | ... | @@ -98,12 +98,15 @@ public class Event implements Comparable<Event> |
98 | 98 | |
99 | 99 | private int injectionCount = 0; |
100 | 100 | |
101 | + protected boolean verbose; | |
102 | + | |
101 | 103 | protected Event(String name, boolean cancellable, int priority) |
102 | 104 | { |
103 | 105 | this.name = name.toLowerCase(); |
104 | 106 | this.priority = priority; |
105 | 107 | this.order = Event.eventOrder++; |
106 | 108 | this.cancellable = cancellable; |
109 | + this.verbose = true; | |
107 | 110 | |
108 | 111 | if (Event.events.contains(this)) |
109 | 112 | { |
... | ... | @@ -191,6 +194,23 @@ public class Event implements Comparable<Event> |
191 | 194 | { |
192 | 195 | return this.priority; |
193 | 196 | } |
197 | + | |
198 | + /** | |
199 | + * Set whether to log at INFO or DEBUG | |
200 | + */ | |
201 | + public Event setVerbose(boolean verbose) | |
202 | + { | |
203 | + this.verbose = verbose; | |
204 | + return this; | |
205 | + } | |
206 | + | |
207 | + /** | |
208 | + * Get whether to log at INFO or DEBUG | |
209 | + */ | |
210 | + public boolean isVerbose() | |
211 | + { | |
212 | + return this.verbose; | |
213 | + } | |
194 | 214 | |
195 | 215 | /** |
196 | 216 | * Get whether this event is currently attached to a method | ... | ... |
java/common/com/mumfrey/liteloader/transformers/event/json/ModEventInjectionTransformer.java
1 | 1 | package com.mumfrey.liteloader.transformers.event.json; |
2 | 2 | |
3 | -import java.util.Map.Entry; | |
4 | - | |
5 | 3 | import com.mumfrey.liteloader.transformers.ClassTransformer; |
6 | 4 | import com.mumfrey.liteloader.transformers.ObfProvider; |
7 | 5 | import com.mumfrey.liteloader.transformers.event.Event; |
8 | 6 | import com.mumfrey.liteloader.transformers.event.EventInjectionTransformer; |
9 | 7 | import com.mumfrey.liteloader.transformers.event.InjectionPoint; |
10 | 8 | import com.mumfrey.liteloader.transformers.event.MethodInfo; |
9 | +import com.mumfrey.liteloader.transformers.event.json.ModEvents.ModEventDefinition; | |
11 | 10 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; |
12 | 11 | |
13 | 12 | /** |
... | ... | @@ -20,12 +19,9 @@ public class ModEventInjectionTransformer extends EventInjectionTransformer |
20 | 19 | @Override |
21 | 20 | protected void addEvents() |
22 | 21 | { |
23 | - for (Entry<String, String> eventsDefinition : ModEvents.getEvents().entrySet()) | |
22 | + for (ModEventDefinition eventsDefinition : ModEvents.getEvents().values()) | |
24 | 23 | { |
25 | - String identifier = eventsDefinition.getKey(); | |
26 | - String json = eventsDefinition.getValue(); | |
27 | - | |
28 | - this.addEvents(identifier, json); | |
24 | + this.addEvents(eventsDefinition); | |
29 | 25 | } |
30 | 26 | } |
31 | 27 | |
... | ... | @@ -33,41 +29,42 @@ public class ModEventInjectionTransformer extends EventInjectionTransformer |
33 | 29 | * @param identifier |
34 | 30 | * @param json |
35 | 31 | */ |
36 | - private void addEvents(String identifier, String json) | |
32 | + private void addEvents(ModEventDefinition def) | |
37 | 33 | { |
38 | 34 | JsonEvents events = null; |
39 | 35 | |
40 | 36 | try |
41 | 37 | { |
42 | - LiteLoaderLogger.info("Parsing events for mod with id %s", identifier); | |
43 | - events = JsonEvents.parse(json); | |
38 | + LiteLoaderLogger.info("Parsing events for mod with id %s", def.getIdentifier()); | |
39 | + events = JsonEvents.parse(def.getJson()); | |
44 | 40 | events.register(this); |
41 | + def.onEventsInjected(); | |
45 | 42 | } |
46 | 43 | catch (InvalidEventJsonException ex) |
47 | 44 | { |
48 | 45 | LiteLoaderLogger.debug(ClassTransformer.HORIZONTAL_RULE); |
49 | 46 | LiteLoaderLogger.debug(ex.getMessage()); |
50 | 47 | LiteLoaderLogger.debug(ClassTransformer.HORIZONTAL_RULE); |
51 | - LiteLoaderLogger.debug(json); | |
48 | + LiteLoaderLogger.debug(def.getJson()); | |
52 | 49 | LiteLoaderLogger.debug(ClassTransformer.HORIZONTAL_RULE); |
53 | - LiteLoaderLogger.severe(ex, "Invalid JSON event declarations for mod with id %s", identifier); | |
50 | + LiteLoaderLogger.severe(ex, "Invalid JSON event declarations for mod with id %s", def.getIdentifier()); | |
54 | 51 | } |
55 | 52 | catch (Throwable ex) |
56 | 53 | { |
57 | - LiteLoaderLogger.severe(ex, "Error whilst parsing event declarations for mod with id %s", identifier); | |
54 | + LiteLoaderLogger.severe(ex, "Error whilst parsing event declarations for mod with id %s", def.getIdentifier()); | |
58 | 55 | } |
59 | 56 | |
60 | 57 | try |
61 | 58 | { |
62 | 59 | if (events != null) |
63 | 60 | { |
64 | - LiteLoaderLogger.info("Registering events for mod with id %s", identifier); | |
61 | + LiteLoaderLogger.info("Registering events for mod with id %s", def.getIdentifier()); | |
65 | 62 | events.register(this); |
66 | 63 | } |
67 | 64 | } |
68 | 65 | catch (Throwable ex) |
69 | 66 | { |
70 | - LiteLoaderLogger.severe(ex, "Error whilst parsing event declarations for mod with id %s", identifier); | |
67 | + LiteLoaderLogger.severe(ex, "Error whilst parsing event declarations for mod with id %s", def.getIdentifier()); | |
71 | 68 | } |
72 | 69 | } |
73 | 70 | ... | ... |
java/common/com/mumfrey/liteloader/transformers/event/json/ModEvents.java
... | ... | @@ -16,9 +16,40 @@ import com.mumfrey.liteloader.util.log.LiteLoaderLogger; |
16 | 16 | |
17 | 17 | public class ModEvents implements EnumerationObserver |
18 | 18 | { |
19 | + public static class ModEventDefinition | |
20 | + { | |
21 | + private final LoadableModFile file; | |
22 | + | |
23 | + private final String identifier; | |
24 | + | |
25 | + private final String json; | |
26 | + | |
27 | + public ModEventDefinition(LoadableModFile file, String json) | |
28 | + { | |
29 | + this.file = file; | |
30 | + this.identifier = file.getIdentifier(); | |
31 | + this.json = json; | |
32 | + } | |
33 | + | |
34 | + public String getIdentifier() | |
35 | + { | |
36 | + return this.identifier; | |
37 | + } | |
38 | + | |
39 | + public String getJson() | |
40 | + { | |
41 | + return this.json; | |
42 | + } | |
43 | + | |
44 | + public void onEventsInjected() | |
45 | + { | |
46 | + this.file.onEventsInjected(); | |
47 | + } | |
48 | + } | |
49 | + | |
19 | 50 | private static final String DEFINITION_FILENAME = "events.json"; |
20 | 51 | |
21 | - private static Map<String, String> events = new HashMap<String, String>(); | |
52 | + private static Map<String, ModEventDefinition> events = new HashMap<String, ModEventDefinition>(); | |
22 | 53 | |
23 | 54 | @Override |
24 | 55 | public void onRegisterEnabledContainer(LoaderEnumerator enumerator, LoadableMod<?> container) |
... | ... | @@ -32,7 +63,7 @@ public class ModEvents implements EnumerationObserver |
32 | 63 | if (json == null) return; |
33 | 64 | |
34 | 65 | LiteLoaderLogger.info("Registering %s for mod with id %s", ModEvents.DEFINITION_FILENAME, file.getIdentifier()); |
35 | - ModEvents.events.put(file.getIdentifier(), json); | |
66 | + ModEvents.events.put(file.getIdentifier(), new ModEventDefinition(file, json)); | |
36 | 67 | } |
37 | 68 | } |
38 | 69 | |
... | ... | @@ -51,7 +82,7 @@ public class ModEvents implements EnumerationObserver |
51 | 82 | { |
52 | 83 | } |
53 | 84 | |
54 | - static Map<String, String> getEvents() | |
85 | + static Map<String, ModEventDefinition> getEvents() | |
55 | 86 | { |
56 | 87 | return events; |
57 | 88 | } | ... | ... |
resources/assets/liteloader/lang/en_US.lang
... | ... | @@ -38,11 +38,16 @@ gui.status.startuperror=Startup errors detected |
38 | 38 | gui.description.missingdeps=Missing dependencies: %s |
39 | 39 | gui.description.missingapis=Missing APIs: %s |
40 | 40 | |
41 | -gui.mod.providestweak=Provides Tweak | |
42 | -gui.mod.providestransformer=Provides Transformer | |
41 | +gui.mod.providestweak=Tweak | |
42 | +gui.mod.providestransformer=Transformer | |
43 | +gui.mod.providesevents=Injector | |
43 | 44 | gui.mod.usingapi=Uses additional API |
44 | 45 | gui.mod.startuperror=%d startup error(s) |
45 | 46 | |
47 | +gui.mod.help.tweak=A tweaker is a special type of mod. Tweakers have almost unlimited control of the game and are usually mods which alter the game engine fundamentally, for example APIs or performance-enhancement mods like Optifine. Because they have the greatest amount of control, they are also the most likely to cause instability when not compatible with each other, if you are experiencing crashes or serious problems, you should always try disabling tweak mods first. | |
48 | +gui.mod.help.transformer=A transformer mod uses bytecode injection to hook extra functionality within the game which LiteLoader does not normally provide. Because transformers access functionality outside of LiteLoader's core, it is possible for them to have unforseen side-effects when combined with other mods. If you are experiencing crashes or other unexpected behaviour, you should disable transformer mods before regular mods to determine whether they are the source of the issue. | |
49 | +gui.mod.help.events=An injector mod uses a restricted form of bytecode injection which makes it somewhat safer than a full transformer mod, but can still cause instability under some circumstances. If you are experiencing crashes or other issues, then you should disable injector mods before regular mods to determine whether they are the source of the issue. | |
50 | + | |
46 | 51 | gui.settings.title=%s Settings |
47 | 52 | gui.saveandclose=Save & Close |
48 | 53 | ... | ... |
resources/assets/liteloader/textures/gui/about.png