Commit e01dd5f516a16a01fc088c54e7fb450d45184c3f

Authored by Mumfrey
1 parent 53506bde

propagate event injection through to the mod list, and provide help screens for …

…tweak/transformer/event icons
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&lt;TContainer extends Loadable&lt;?&gt;&gt;
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&lt;File&gt;
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&lt;File&gt;
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&lt;L&gt; extends Loadable&lt;L&gt;, 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&lt;Event&gt;
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&lt;Event&gt;
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

42 KB | W: | H:

42.5 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin