Commit 86bd548cdcd50809f1e0dd1384f46b2911ebd10d
1 parent
10a436e9
LiteLoader 1.6.4_02 - experimental - commented horrible GUI code, fixed scrollbar visual bug
Showing
3 changed files
with
118 additions
and
43 deletions
java/com/mumfrey/liteloader/core/LiteLoader.java
... | ... | @@ -587,7 +587,7 @@ public final class LiteLoader |
587 | 587 | /** |
588 | 588 | * Get a reference to a loaded mod, if the mod exists |
589 | 589 | * |
590 | - * @param modName Mod's name or class name | |
590 | + * @param modName Mod's name, meta name or class name | |
591 | 591 | * @return |
592 | 592 | * @throws InvalidActivityException |
593 | 593 | */ |
... | ... | @@ -606,7 +606,9 @@ public final class LiteLoader |
606 | 606 | |
607 | 607 | for (LiteMod mod : this.mods) |
608 | 608 | { |
609 | - if (modName.equalsIgnoreCase(mod.getName()) || modName.equalsIgnoreCase(mod.getClass().getSimpleName())) | |
609 | + String metaName = this.getModMetaName(mod.getClass()); | |
610 | + | |
611 | + if (modName.equalsIgnoreCase(mod.getName()) || modName.equalsIgnoreCase(metaName) || modName.equalsIgnoreCase(mod.getClass().getSimpleName())) | |
610 | 612 | return (T)mod; |
611 | 613 | } |
612 | 614 | ... | ... |
java/com/mumfrey/liteloader/gui/GuiScreenModInfo.java
... | ... | @@ -39,50 +39,101 @@ import net.minecraft.src.Tessellator; |
39 | 39 | */ |
40 | 40 | public class GuiScreenModInfo extends GuiScreen |
41 | 41 | { |
42 | - private static final int LEFT_EDGE = 80; | |
43 | - private static final int TAB_WIDTH = 20; | |
44 | - private static final int TAB_HEIGHT = 40; | |
45 | - private static final int TAB_TOP = 20; | |
42 | + private static final int LEFT_EDGE = 80; | |
43 | + private static final int TAB_WIDTH = 20; | |
44 | + private static final int TAB_HEIGHT = 40; | |
45 | + private static final int TAB_TOP = 20; | |
46 | + private static final int PANEL_TOP = 83; | |
47 | + private static final int PANEL_BOTTOM = 26; | |
48 | + | |
49 | + private static final double TWEEN_RATE = 0.08; | |
46 | 50 | |
47 | 51 | /** |
48 | 52 | * Used for clipping |
49 | 53 | */ |
50 | 54 | private static DoubleBuffer doubleBuffer = BufferUtils.createByteBuffer(64).asDoubleBuffer(); |
51 | 55 | |
56 | + // Texture resources for the "about mods" screen, we load the texture directly anyway so it won't be from an RP | |
52 | 57 | public static ResourceLocation aboutTextureResource; |
53 | 58 | private static DynamicTexture aboutTexture; |
54 | 59 | |
60 | + /** | |
61 | + * Reference to the main menu which this screen is either overlaying or using as its background | |
62 | + */ | |
55 | 63 | private GuiMainMenu mainMenu; |
56 | 64 | |
65 | + /** | |
66 | + * Tick number (update counter) used for tweening | |
67 | + */ | |
57 | 68 | private long tickNumber; |
58 | 69 | |
70 | + /** | |
71 | + * Last tick number, for tweening | |
72 | + */ | |
59 | 73 | private double lastTick; |
60 | 74 | |
61 | - private double tweenAmount = 0.0, tweenRate = 0.08; | |
75 | + /** | |
76 | + * Current tween percentage (0.0 -> 1.0) | |
77 | + */ | |
78 | + private double tweenAmount = 0.0; | |
62 | 79 | |
80 | + /** | |
81 | + * Since we don't get real mouse events we have to simulate them by tracking the mouse state | |
82 | + */ | |
63 | 83 | private boolean mouseDown, toggled; |
64 | 84 | |
85 | + /** | |
86 | + * Hover opacity for the tab | |
87 | + */ | |
65 | 88 | private float tabOpacity = 0.0F; |
66 | 89 | |
90 | + /** | |
91 | + * List of enumerated mods | |
92 | + */ | |
67 | 93 | private List<GuiModListEntry> mods = new ArrayList<GuiModListEntry>(); |
68 | 94 | |
95 | + /** | |
96 | + * Currently selected mod | |
97 | + */ | |
69 | 98 | private GuiModListEntry selectedMod = null; |
70 | 99 | |
100 | + /** | |
101 | + * Text to display under the header | |
102 | + */ | |
71 | 103 | private String activeModText = "0 mod(s) loaded"; |
72 | 104 | |
73 | - private int listHeight; | |
105 | + /** | |
106 | + * Height of all the items in the list | |
107 | + */ | |
108 | + private int listHeight = 100; | |
74 | 109 | |
110 | + /** | |
111 | + * Scroll bar control for the mods list | |
112 | + */ | |
75 | 113 | private GuiSimpleScrollBar scrollBar = new GuiSimpleScrollBar(); |
76 | 114 | |
115 | + /** | |
116 | + * Enable / disable button | |
117 | + */ | |
77 | 118 | private GuiButton btnToggle; |
78 | 119 | |
120 | + /** | |
121 | + * Enable the mod info tab checkbox | |
122 | + */ | |
79 | 123 | private GuiCheckbox chkEnabled; |
80 | 124 | |
125 | + /** | |
126 | + * @param minecraft | |
127 | + * @param mainMenu | |
128 | + * @param loader | |
129 | + * @param enabledModsList | |
130 | + */ | |
81 | 131 | public GuiScreenModInfo(Minecraft minecraft, GuiMainMenu mainMenu, LiteLoader loader, EnabledModsList enabledModsList) |
82 | 132 | { |
83 | 133 | this.mc = minecraft; |
84 | 134 | this.mainMenu = mainMenu; |
85 | 135 | |
136 | + // Spawn the texture resource if we haven't already | |
86 | 137 | if (aboutTexture == null) |
87 | 138 | { |
88 | 139 | try |
... | ... | @@ -107,26 +158,29 @@ public class GuiScreenModInfo extends GuiScreen |
107 | 158 | { |
108 | 159 | this.activeModText = String.format("%d mod(s) loaded", loader.getLoadedMods().size()); |
109 | 160 | |
161 | + // Add mods to this treeset first, in order to sort them | |
110 | 162 | Map<String, GuiModListEntry> sortedMods = new TreeMap<String, GuiModListEntry>(); |
111 | 163 | |
164 | + // Active mods | |
112 | 165 | for (LiteMod mod : loader.getLoadedMods()) |
113 | 166 | { |
114 | 167 | GuiModListEntry modListEntry = new GuiModListEntry(loader, enabledModsList, this.mc.fontRenderer, mod); |
115 | 168 | sortedMods.put(modListEntry.getKey(), modListEntry); |
116 | 169 | } |
117 | 170 | |
171 | + // Disabled mods | |
118 | 172 | for (ModFile disabledMod : loader.getDisabledMods()) |
119 | 173 | { |
120 | 174 | GuiModListEntry modListEntry = new GuiModListEntry(loader, enabledModsList, this.mc.fontRenderer, disabledMod); |
121 | 175 | sortedMods.put(modListEntry.getKey(), modListEntry); |
122 | 176 | } |
123 | - | |
177 | + | |
178 | + // Add the sorted mods to the mods list | |
124 | 179 | this.mods.addAll(sortedMods.values()); |
125 | 180 | |
181 | + // Select the first mod in the list | |
126 | 182 | if (this.mods.size() > 0) |
127 | - { | |
128 | 183 | this.selectedMod = this.mods.get(0); |
129 | - } | |
130 | 184 | } |
131 | 185 | |
132 | 186 | /** |
... | ... | @@ -155,8 +209,8 @@ public class GuiScreenModInfo extends GuiScreen |
155 | 209 | int left = LEFT_EDGE + 16 + (this.width - LEFT_EDGE - 28) / 2; |
156 | 210 | |
157 | 211 | this.buttonList.clear(); |
158 | - this.buttonList.add(this.btnToggle = new GuiButton(0, left, this.height - 50, 100, 20, "Enable mod")); | |
159 | - this.buttonList.add(this.chkEnabled = new GuiCheckbox(1, LEFT_EDGE + 12, this.height - 17, "Show LiteLoader tab on main menu")); | |
212 | + this.buttonList.add(this.btnToggle = new GuiButton(0, left, this.height - PANEL_BOTTOM - 24, 100, 20, "Enable mod")); | |
213 | + this.buttonList.add(this.chkEnabled = new GuiCheckbox(1, LEFT_EDGE + 12, this.height - PANEL_BOTTOM + 9, "Show LiteLoader tab on main menu")); | |
160 | 214 | |
161 | 215 | this.selectMod(this.selectedMod); |
162 | 216 | } |
... | ... | @@ -204,23 +258,32 @@ public class GuiScreenModInfo extends GuiScreen |
204 | 258 | { |
205 | 259 | boolean active = this.mc.currentScreen == this; |
206 | 260 | |
207 | - this.width = this.mainMenu.width; | |
208 | - this.height = this.mainMenu.height; | |
209 | - | |
210 | 261 | if (active) |
211 | 262 | { |
263 | + // Draw the parent screen as our background if we are the active screen | |
212 | 264 | glClear(GL_DEPTH_BUFFER_BIT); |
213 | 265 | this.mainMenu.drawScreen(-10, -10, partialTicks); |
214 | 266 | glClear(GL_DEPTH_BUFFER_BIT); |
215 | 267 | } |
216 | - | |
268 | + else | |
269 | + { | |
270 | + // If this is not the active screen, copy the width and height from the parent GUI | |
271 | + this.width = this.mainMenu.width; | |
272 | + this.height = this.mainMenu.height; | |
273 | + } | |
274 | + | |
275 | + // Calculate the current tween position | |
217 | 276 | float xOffset = (this.width - LEFT_EDGE) * this.calcTween(partialTicks, active) + 16.0F + (this.tabOpacity * -32.0F); |
218 | 277 | mouseX -= (int)xOffset; |
219 | 278 | |
279 | + // Handle mouse stuff here since we won't get mouse events when not the active GUI | |
220 | 280 | boolean mouseOverTab = mouseX > LEFT_EDGE - TAB_WIDTH && mouseX < LEFT_EDGE && mouseY > TAB_TOP && mouseY < TAB_TOP + TAB_HEIGHT; |
221 | 281 | this.handleMouseClick(mouseX, mouseY, partialTicks, active, mouseOverTab); |
222 | 282 | |
283 | + // Calculate the tab opacity, not framerate adjusted because we don't really care | |
223 | 284 | this.tabOpacity = mouseOverTab || this.tweenAmount > 0.0 ? 0.5F : Math.max(0.0F, this.tabOpacity - partialTicks * 0.1F); |
285 | + | |
286 | + // Draw the panel contents | |
224 | 287 | this.drawPanel(mouseX, mouseY, partialTicks, active, xOffset); |
225 | 288 | } |
226 | 289 | |
... | ... | @@ -236,31 +299,38 @@ public class GuiScreenModInfo extends GuiScreen |
236 | 299 | glPushMatrix(); |
237 | 300 | glTranslatef(xOffset, 0.0F, 0.0F); |
238 | 301 | |
302 | + // Draw the background and left edge | |
239 | 303 | drawRect(LEFT_EDGE, 0, this.width, this.height, 0xB0000000); |
240 | 304 | drawRect(LEFT_EDGE, 0, LEFT_EDGE + 1, TAB_TOP, 0xFFFFFFFF); |
241 | 305 | drawRect(LEFT_EDGE, TAB_TOP + TAB_HEIGHT, LEFT_EDGE + 1, this.height, 0xFFFFFFFF); |
242 | 306 | |
307 | + // Draw the tab | |
243 | 308 | this.mc.getTextureManager().bindTexture(aboutTextureResource); |
244 | 309 | glDrawTexturedRect(LEFT_EDGE - TAB_WIDTH, TAB_TOP, TAB_WIDTH + 1, TAB_HEIGHT, 80, 80, 122, 160, 0.5F + this.tabOpacity); |
245 | 310 | |
311 | + // Only draw the panel contents if we are actually open | |
246 | 312 | if (this.tweenAmount > 0.0) |
247 | 313 | { |
248 | - glDrawTexturedRect(LEFT_EDGE + 12, 12, 128, 40, 0, 0, 256, 80, 1.0F); | |
249 | - glDrawTexturedRect(this.width - 32 - 12, 12, 32, 45, 0, 80, 64, 170, 1.0F); | |
314 | + // Draw the header pieces | |
315 | + glDrawTexturedRect(LEFT_EDGE + 12, 12, 128, 40, 0, 0, 256, 80, 1.0F); // liteloader logo | |
316 | + glDrawTexturedRect(this.width - 32 - 12, 12, 32, 45, 0, 80, 64, 170, 1.0F); // chicken | |
250 | 317 | |
318 | + // Draw header text | |
251 | 319 | this.fontRenderer.drawString("Version " + LiteLoader.getVersion(), LEFT_EDGE + 12 + 38, 50, 0xFFFFFFFF); |
252 | 320 | this.fontRenderer.drawString(this.activeModText, LEFT_EDGE + 12 + 38, 60, 0xFFAAAAAA); |
253 | 321 | |
322 | + // Draw top and bottom horizontal rules | |
254 | 323 | drawRect(LEFT_EDGE + 12, 80, this.width - 12, 81, 0xFF999999); |
255 | - drawRect(LEFT_EDGE + 12, this.height - 24, this.width - 12, this.height - 23, 0xFF999999); | |
324 | + drawRect(LEFT_EDGE + 12, this.height - PANEL_BOTTOM + 2, this.width - 12, this.height - PANEL_BOTTOM + 3, 0xFF999999); | |
256 | 325 | |
257 | - int panelTop = 83; | |
258 | 326 | int innerWidth = this.width - LEFT_EDGE - 24 - 4; |
259 | - int listWidth = innerWidth / 2; | |
327 | + int panelWidth = innerWidth / 2; | |
328 | + int panelHeight = this.height - PANEL_BOTTOM - PANEL_TOP; | |
260 | 329 | |
261 | - this.drawModsList(mouseX, mouseY, partialTicks, panelTop, listWidth); | |
262 | - this.drawSelectedMod(mouseX, mouseY, partialTicks, panelTop, listWidth); | |
330 | + this.drawModsList(mouseX, mouseY, partialTicks, panelWidth, panelHeight); | |
331 | + this.drawSelectedMod(mouseX, mouseY, partialTicks, panelWidth, panelHeight); | |
263 | 332 | |
333 | + // Draw other controls inside the transform so that they slide properly | |
264 | 334 | super.drawScreen(mouseX, mouseY, partialTicks); |
265 | 335 | } |
266 | 336 | |
... | ... | @@ -271,49 +341,52 @@ public class GuiScreenModInfo extends GuiScreen |
271 | 341 | * @param mouseX |
272 | 342 | * @param mouseY |
273 | 343 | * @param partialTicks |
274 | - * @param panelWidth | |
344 | + * @param width | |
345 | + * @param height | |
275 | 346 | */ |
276 | - public void drawModsList(int mouseX, int mouseY, float partialTicks, int panelTop, int panelWidth) | |
347 | + public void drawModsList(int mouseX, int mouseY, float partialTicks, int width, int height) | |
277 | 348 | { |
278 | - int panelHeight = this.height - 26 - panelTop; | |
279 | - this.scrollBar.drawScrollBar(mouseX, mouseY, partialTicks, LEFT_EDGE + 12 + panelWidth - 5, panelTop, 5, panelHeight, this.listHeight); | |
349 | + this.scrollBar.drawScrollBar(mouseX, mouseY, partialTicks, LEFT_EDGE + 12 + width - 5, PANEL_TOP, 5, height, this.listHeight); | |
280 | 350 | |
281 | - glEnableClipping(LEFT_EDGE + 12, LEFT_EDGE + 12 + panelWidth - 6, panelTop, this.height - 26); | |
351 | + // clip outside of scroll area | |
352 | + glEnableClipping(LEFT_EDGE + 12, LEFT_EDGE + 12 + width - 6, PANEL_TOP, this.height - PANEL_BOTTOM); | |
282 | 353 | |
354 | + // handle scrolling | |
283 | 355 | glPushMatrix(); |
284 | - glTranslatef(0.0F, panelTop - this.scrollBar.getValue(), 0.0F); | |
356 | + glTranslatef(0.0F, PANEL_TOP - this.scrollBar.getValue(), 0.0F); | |
285 | 357 | |
286 | - mouseY -= (panelTop - this.scrollBar.getValue()); | |
358 | + mouseY -= (PANEL_TOP - this.scrollBar.getValue()); | |
287 | 359 | |
288 | 360 | int yPos = 0; |
289 | 361 | for (GuiModListEntry mod : this.mods) |
290 | 362 | { |
291 | - yPos += mod.drawListEntry(mouseX, mouseY, partialTicks, LEFT_EDGE + 12, yPos, panelWidth - 6, mod == this.selectedMod); | |
363 | + // drawListEntry returns a value indicating the height of the item drawn | |
364 | + yPos += mod.drawListEntry(mouseX, mouseY, partialTicks, LEFT_EDGE + 12, yPos, width - 6, mod == this.selectedMod); | |
292 | 365 | } |
293 | 366 | |
294 | 367 | glPopMatrix(); |
295 | 368 | glDisableClipping(); |
296 | 369 | |
297 | 370 | this.listHeight = yPos; |
298 | - this.scrollBar.setMaxValue(this.listHeight - panelHeight); | |
371 | + this.scrollBar.setMaxValue(this.listHeight - height); | |
299 | 372 | } |
300 | 373 | |
301 | 374 | /** |
302 | 375 | * @param mouseX |
303 | 376 | * @param mouseY |
304 | 377 | * @param partialTicks |
305 | - * @param panelTop | |
306 | - * @param listWidth | |
378 | + * @param width | |
379 | + * @param height | |
307 | 380 | */ |
308 | - public void drawSelectedMod(int mouseX, int mouseY, float partialTicks, int panelTop, int listWidth) | |
381 | + public void drawSelectedMod(int mouseX, int mouseY, float partialTicks, int width, int height) | |
309 | 382 | { |
310 | 383 | if (this.selectedMod != null) |
311 | 384 | { |
312 | - int left = LEFT_EDGE + 12 + listWidth; | |
385 | + int left = LEFT_EDGE + 12 + width; | |
313 | 386 | int right = this.width - 12; |
314 | 387 | |
315 | - glEnableClipping(left, right, panelTop, this.height - 54); | |
316 | - this.selectedMod.drawInfo(mouseX, mouseY, partialTicks, left, panelTop, right - left); | |
388 | + glEnableClipping(left, right, PANEL_TOP, this.height - PANEL_BOTTOM - 28); | |
389 | + this.selectedMod.drawInfo(mouseX, mouseY, partialTicks, left, PANEL_TOP, right - left); | |
317 | 390 | glDisableClipping(); |
318 | 391 | } |
319 | 392 | } |
... | ... | @@ -384,7 +457,7 @@ public class GuiScreenModInfo extends GuiScreen |
384 | 457 | this.scrollBar.setDragging(true); |
385 | 458 | } |
386 | 459 | |
387 | - if (mouseY > 83 && mouseY < this.height - 26) | |
460 | + if (mouseY > PANEL_TOP && mouseY < this.height - PANEL_BOTTOM) | |
388 | 461 | { |
389 | 462 | for (GuiModListEntry mod : this.mods) |
390 | 463 | { |
... | ... | @@ -456,11 +529,11 @@ public class GuiScreenModInfo extends GuiScreen |
456 | 529 | |
457 | 530 | if (active && this.tweenAmount < 1.0) |
458 | 531 | { |
459 | - this.tweenAmount = Math.min(1.0, this.tweenAmount + ((tickValue - this.lastTick) * this.tweenRate)); | |
532 | + this.tweenAmount = Math.min(1.0, this.tweenAmount + ((tickValue - this.lastTick) * TWEEN_RATE)); | |
460 | 533 | } |
461 | 534 | else if (!active && this.tweenAmount > 0.0) |
462 | 535 | { |
463 | - this.tweenAmount = Math.max(0.0, this.tweenAmount - ((tickValue - this.lastTick) * this.tweenRate)); | |
536 | + this.tweenAmount = Math.max(0.0, this.tweenAmount - ((tickValue - this.lastTick) * TWEEN_RATE)); | |
464 | 537 | } |
465 | 538 | |
466 | 539 | this.lastTick = tickValue; | ... | ... |
java/com/mumfrey/liteloader/gui/GuiSimpleScrollBar.java
... | ... | @@ -121,7 +121,7 @@ public class GuiSimpleScrollBar extends Gui |
121 | 121 | float pct = Math.min(1.0F, (float)slideHeight / (float)totalHeight); |
122 | 122 | int barHeight = (int)(pct * slideHeight); |
123 | 123 | int barTravel = slideHeight - barHeight; |
124 | - int barPosition = this.maxValue > 0 ? yPosition + 1 + (int)((this.value / (float)this.maxValue) * barTravel) : 0; | |
124 | + int barPosition = yPosition + 1 + (this.maxValue > 0 ? (int)((this.value / (float)this.maxValue) * barTravel) : 0); | |
125 | 125 | |
126 | 126 | drawRect(xPosition + 1, barPosition, xPosition + width - 1, barPosition + barHeight, this.foreColour); |
127 | 127 | ... | ... |