Commit 89fce7f9c78b43a89fd881d75295be2e7231079f
1 parent
0e3dd41e
add GuiTextField accessor interface
Showing
6 changed files
with
205 additions
and
44 deletions
java/client/com/mumfrey/liteloader/client/overlays/IGuiTextField.java
0 → 100644
1 | +package com.mumfrey.liteloader.client.overlays; | |
2 | + | |
3 | +import com.mumfrey.liteloader.transformers.access.Accessor; | |
4 | + | |
5 | +/** | |
6 | + * Adapter for GuiTextField to expose internal properties, mainly to allow sensible subclassing | |
7 | + * | |
8 | + * @author Adam Mummery-Smith | |
9 | + */ | |
10 | +@Accessor("GuiTextField") | |
11 | +public interface IGuiTextField | |
12 | +{ | |
13 | + @Accessor("#2") public abstract int getXPosition(); | |
14 | + @Accessor("#2") public abstract void setXPosition(int xPosition); | |
15 | + | |
16 | + @Accessor("#3") public abstract int getYPosition(); | |
17 | + @Accessor("#3") public abstract void setYPosition(int yPosition); | |
18 | + | |
19 | + @Accessor("#4") public abstract int getInternalWidth(); | |
20 | + @Accessor("#4") public abstract void setInternalWidth(int width); | |
21 | + | |
22 | + @Accessor("#5") public abstract int getHeight(); | |
23 | + @Accessor("#5") public abstract void setHeight(int height); | |
24 | + | |
25 | + @Accessor("#12") public abstract boolean isEnabled(); | |
26 | +// @Accessor("#12") public abstract void setEnabled(boolean enabled); // built in | |
27 | + | |
28 | + @Accessor("#13") public abstract int getLineScrollOffset(); | |
29 | + | |
30 | + @Accessor("#16") public abstract int getTextColor(); | |
31 | +// @Accessor("#16") public abstract void setTextColor(int color); // built in | |
32 | + | |
33 | + @Accessor("#17") public abstract int getDisabledTextColour(); | |
34 | +// @Accessor("#17") public abstract void setDisabledTextColour(int color); // built in | |
35 | +} | ... | ... |
java/client/com/mumfrey/liteloader/client/transformers/MinecraftTransformer.java
java/client/com/mumfrey/liteloader/gl/GL.java
... | ... | @@ -1272,4 +1272,19 @@ public class GL |
1272 | 1272 | { |
1273 | 1273 | GL11.glPolygonMode(face, mode); |
1274 | 1274 | } |
1275 | + | |
1276 | + public static void glPixelStorei(int pname, int param) | |
1277 | + { | |
1278 | + GL11.glPixelStorei(pname, param); | |
1279 | + } | |
1280 | + | |
1281 | + public static void glReadPixels(int x, int y, int width, int height, int format, int type, ByteBuffer pixels) | |
1282 | + { | |
1283 | + GL11.glReadPixels(x, y, width, height, format, type, pixels); | |
1284 | + } | |
1285 | + | |
1286 | + public static void glGetTexImage(int target, int level, int format, int type, ByteBuffer pixels) | |
1287 | + { | |
1288 | + GL11.glGetTexImage(target, level, format, type, pixels); | |
1289 | + } | |
1275 | 1290 | } | ... | ... |
java/common/com/mumfrey/liteloader/core/runtime/Obf.java
... | ... | @@ -26,6 +26,7 @@ public class Obf |
26 | 26 | public static final Obf PacketEventsClient = new Obf("com.mumfrey.liteloader.client.PacketEventsClient" ); |
27 | 27 | public static final Obf LoadingBar = new Obf("com.mumfrey.liteloader.client.gui.startup.LoadingBar" ); |
28 | 28 | public static final Obf IMinecraft = new Obf("com.mumfrey.liteloader.client.overlays.IMinecraft" ); |
29 | + public static final Obf IGuiTextField = new Obf("com.mumfrey.liteloader.client.overlays.IGuiTextField" ); | |
29 | 30 | public static final Obf GameProfile = new Obf("com.mojang.authlib.GameProfile" ); |
30 | 31 | public static final Obf MinecraftMain = new Obf("net.minecraft.client.main.Main" ); |
31 | 32 | public static final Obf MinecraftServer = new Obf("net.minecraft.server.MinecraftServer" ); |
... | ... | @@ -62,6 +63,7 @@ public class Obf |
62 | 63 | public static final Obf Entity = new Obf("net.minecraft.entity.Entity", "wv" ); |
63 | 64 | public static final Obf RenderManager = new Obf("net.minecraft.client.renderer.entity.RenderManager", "cpt" ); |
64 | 65 | public static final Obf Render = new Obf("net.minecraft.client.renderer.entity.Render", "cpu" ); |
66 | + public static final Obf GuiTextField = new Obf("net.minecraft.client.gui.GuiTextField", "bul" ); | |
65 | 67 | |
66 | 68 | // Fields |
67 | 69 | // ----------------------------------------------------------------------------------------- |
... | ... | @@ -205,6 +207,48 @@ public class Obf |
205 | 207 | { |
206 | 208 | return String.format("L%s;", this.names[type].replace('.', '/')); |
207 | 209 | } |
210 | + | |
211 | + /** | |
212 | + * Test whether any of this Obf's dimensions match the supplied name | |
213 | + * | |
214 | + * @param name | |
215 | + */ | |
216 | + public boolean matches(String name) | |
217 | + { | |
218 | + return this.obf.equals(name) || this.srg.equals(name)|| this.name.equals(name); | |
219 | + } | |
220 | + | |
221 | + /** | |
222 | + * Test whether any of this Obf's dimensions match the supplied name or ordinal | |
223 | + * | |
224 | + * @param name | |
225 | + * @param ordinal | |
226 | + */ | |
227 | + public boolean matches(String name, int ordinal) | |
228 | + { | |
229 | + if (this.isOrdinal() && ordinal > -1) | |
230 | + { | |
231 | + return this.getOrdinal() == ordinal; | |
232 | + } | |
233 | + | |
234 | + return this.matches(name); | |
235 | + } | |
236 | + | |
237 | + /** | |
238 | + * Returns true if this is an ordinal pointer | |
239 | + */ | |
240 | + public boolean isOrdinal() | |
241 | + { | |
242 | + return false; | |
243 | + } | |
244 | + | |
245 | + /** | |
246 | + * Get the ordinal for this entry | |
247 | + */ | |
248 | + public int getOrdinal() | |
249 | + { | |
250 | + return -1; | |
251 | + } | |
208 | 252 | |
209 | 253 | /** |
210 | 254 | * @param seargeName |
... | ... | @@ -269,4 +313,55 @@ public class Obf |
269 | 313 | |
270 | 314 | return Obf.getByName(name); |
271 | 315 | } |
316 | + | |
317 | + /** | |
318 | + * Ordinal reference, can be passed to some methods which accept an {@link Obf} to indicate an offset into a | |
319 | + * class rather than a named reference. | |
320 | + * | |
321 | + * @author Adam Mummery-Smith | |
322 | + */ | |
323 | + public static class Ord extends Obf | |
324 | + { | |
325 | + /** | |
326 | + * Field/method offset | |
327 | + */ | |
328 | + private final int ordinal; | |
329 | + | |
330 | + /** | |
331 | + * @param name Field/method name | |
332 | + * @param ordinal Field/method ordinal | |
333 | + */ | |
334 | + public Ord(String name, int ordinal) | |
335 | + { | |
336 | + super(name); | |
337 | + this.ordinal = ordinal; | |
338 | + } | |
339 | + | |
340 | + /** | |
341 | + * @param ordinal Field ordinal | |
342 | + */ | |
343 | + public Ord(int ordinal) | |
344 | + { | |
345 | + super("ord#" + ordinal); | |
346 | + this.ordinal = ordinal; | |
347 | + } | |
348 | + | |
349 | + /* (non-Javadoc) | |
350 | + * @see com.mumfrey.liteloader.core.runtime.Obf#isOrdinal() | |
351 | + */ | |
352 | + @Override | |
353 | + public boolean isOrdinal() | |
354 | + { | |
355 | + return true; | |
356 | + } | |
357 | + | |
358 | + /* (non-Javadoc) | |
359 | + * @see com.mumfrey.liteloader.core.runtime.Obf#getOrdinal() | |
360 | + */ | |
361 | + @Override | |
362 | + public int getOrdinal() | |
363 | + { | |
364 | + return this.ordinal; | |
365 | + } | |
366 | + } | |
272 | 367 | } | ... | ... |
java/common/com/mumfrey/liteloader/transformers/ByteCodeUtilities.java
... | ... | @@ -526,7 +526,46 @@ public abstract class ByteCodeUtilities |
526 | 526 | |
527 | 527 | return null; |
528 | 528 | } |
529 | - | |
529 | + | |
530 | + /** | |
531 | + * Find a method in the target class which matches the specified method name and descriptor | |
532 | + * | |
533 | + * @param classNode | |
534 | + * @param methodName | |
535 | + * @param desc | |
536 | + */ | |
537 | + public static MethodNode findMethod(ClassNode classNode, Obf obf, String desc) | |
538 | + { | |
539 | + int ordinal = 0; | |
540 | + | |
541 | + for (MethodNode method : classNode.methods) | |
542 | + { | |
543 | + if (obf.matches(method.name, ordinal++) && method.desc.equals(desc)) | |
544 | + return method; | |
545 | + } | |
546 | + | |
547 | + return null; | |
548 | + } | |
549 | + | |
550 | + /** | |
551 | + * Find a field in the target class which matches the specified field name | |
552 | + * | |
553 | + * @param classNode | |
554 | + * @param fieldName | |
555 | + */ | |
556 | + public static FieldNode findField(ClassNode classNode, Obf obf) | |
557 | + { | |
558 | + int ordinal = 0; | |
559 | + | |
560 | + for (FieldNode field : classNode.fields) | |
561 | + { | |
562 | + if (obf.matches(field.name, ordinal++)) | |
563 | + return field; | |
564 | + } | |
565 | + | |
566 | + return null; | |
567 | + } | |
568 | + | |
530 | 569 | public static ClassNode loadClass(String className) throws IOException |
531 | 570 | { |
532 | 571 | return ByteCodeUtilities.loadClass(className, true, null); | ... | ... |
java/common/com/mumfrey/liteloader/transformers/access/AccessorTransformer.java
... | ... | @@ -4,6 +4,8 @@ import java.io.IOException; |
4 | 4 | import java.util.ArrayList; |
5 | 5 | import java.util.Iterator; |
6 | 6 | import java.util.List; |
7 | +import java.util.regex.Matcher; | |
8 | +import java.util.regex.Pattern; | |
7 | 9 | |
8 | 10 | import net.minecraft.launchwrapper.Launch; |
9 | 11 | |
... | ... | @@ -33,6 +35,8 @@ import com.mumfrey.liteloader.util.log.LiteLoaderLogger; |
33 | 35 | */ |
34 | 36 | public abstract class AccessorTransformer extends ClassTransformer |
35 | 37 | { |
38 | + static final Pattern ordinalRefPattern = Pattern.compile("^#([0-9]{1,5})$"); | |
39 | + | |
36 | 40 | /** |
37 | 41 | * An injection record |
38 | 42 | * |
... | ... | @@ -103,6 +107,13 @@ public abstract class AccessorTransformer extends ClassTransformer |
103 | 107 | */ |
104 | 108 | private Obf getObf(String name) |
105 | 109 | { |
110 | + Matcher ordinalPattern = AccessorTransformer.ordinalRefPattern.matcher(name); | |
111 | + if (ordinalPattern.matches()) | |
112 | + { | |
113 | + int ordinal = Integer.parseInt(ordinalPattern.group(1)); | |
114 | + return new Obf.Ord(ordinal); | |
115 | + } | |
116 | + | |
106 | 117 | if (this.obfProvider != null) |
107 | 118 | { |
108 | 119 | Obf obf = this.obfProvider.getByName(name); |
... | ... | @@ -228,14 +239,14 @@ public abstract class AccessorTransformer extends ClassTransformer |
228 | 239 | if (accessor != null) |
229 | 240 | { |
230 | 241 | targetId = ByteCodeUtilities.<String>getAnnotationValue(accessor); |
231 | - Obf targetName = this.getObf(targetId); | |
232 | - if (this.injectAccessor(classNode, method, targetName)) return; | |
242 | + Obf target = this.getObf(targetId); | |
243 | + if (this.injectAccessor(classNode, method, target)) return; | |
233 | 244 | } |
234 | 245 | else if (invoker != null) |
235 | 246 | { |
236 | 247 | targetId = ByteCodeUtilities.<String>getAnnotationValue(invoker); |
237 | - Obf targetName = this.getObf(targetId); | |
238 | - if (this.injectInvoker(classNode, method, targetName)) return; | |
248 | + Obf target = this.getObf(targetId); | |
249 | + if (this.injectInvoker(classNode, method, target)) return; | |
239 | 250 | } |
240 | 251 | else |
241 | 252 | { |
... | ... | @@ -255,9 +266,9 @@ public abstract class AccessorTransformer extends ClassTransformer |
255 | 266 | * @param method |
256 | 267 | * @param targetName |
257 | 268 | */ |
258 | - private boolean injectAccessor(ClassNode classNode, MethodNode method, Obf targetName) | |
269 | + private boolean injectAccessor(ClassNode classNode, MethodNode method, Obf target) | |
259 | 270 | { |
260 | - FieldNode targetField = this.findField(classNode, targetName); | |
271 | + FieldNode targetField = ByteCodeUtilities.findField(classNode, target); | |
261 | 272 | if (targetField != null) |
262 | 273 | { |
263 | 274 | LiteLoaderLogger.debug("[AccessorTransformer] Found field %s for %s", targetField.name, method.name); |
... | ... | @@ -283,9 +294,9 @@ public abstract class AccessorTransformer extends ClassTransformer |
283 | 294 | * @param method |
284 | 295 | * @param targetName |
285 | 296 | */ |
286 | - private boolean injectInvoker(ClassNode classNode, MethodNode method, Obf targetName) | |
297 | + private boolean injectInvoker(ClassNode classNode, MethodNode method, Obf target) | |
287 | 298 | { |
288 | - MethodNode targetMethod = this.findMethod(classNode, targetName, method.desc); | |
299 | + MethodNode targetMethod = ByteCodeUtilities.findMethod(classNode, target, method.desc); | |
289 | 300 | if (targetMethod != null) |
290 | 301 | { |
291 | 302 | LiteLoaderLogger.debug("[AccessorTransformer] Found method %s for %s", targetMethod.name, method.name); |
... | ... | @@ -422,41 +433,6 @@ public abstract class AccessorTransformer extends ClassTransformer |
422 | 433 | } |
423 | 434 | |
424 | 435 | /** |
425 | - * Find a field in the target class which matches the specified field name | |
426 | - * | |
427 | - * @param classNode | |
428 | - * @param fieldName | |
429 | - */ | |
430 | - private FieldNode findField(ClassNode classNode, Obf fieldName) | |
431 | - { | |
432 | - for (FieldNode field : classNode.fields) | |
433 | - { | |
434 | - if (fieldName.obf.equals(field.name) || fieldName.srg.equals(field.name)|| fieldName.name.equals(field.name)) | |
435 | - return field; | |
436 | - } | |
437 | - | |
438 | - return null; | |
439 | - } | |
440 | - | |
441 | - /** | |
442 | - * Find a method in the target class which matches the specified method name and descriptor | |
443 | - * | |
444 | - * @param classNode | |
445 | - * @param methodName | |
446 | - * @param desc | |
447 | - */ | |
448 | - private MethodNode findMethod(ClassNode classNode, Obf methodName, String desc) | |
449 | - { | |
450 | - for (MethodNode method : classNode.methods) | |
451 | - { | |
452 | - if ((methodName.obf.equals(method.name) || methodName.srg.equals(method.name)|| methodName.name.equals(method.name)) && method.desc.equals(desc)) | |
453 | - return method; | |
454 | - } | |
455 | - | |
456 | - return null; | |
457 | - } | |
458 | - | |
459 | - /** | |
460 | 436 | * Add a method from the template interface to the target class |
461 | 437 | * |
462 | 438 | * @param classNode | ... | ... |