Skip to content

Commit d18e1b3

Browse files
committed
Improve mouse override to function with custom screen render methods
1 parent cb602ee commit d18e1b3

File tree

3 files changed

+69
-33
lines changed

3 files changed

+69
-33
lines changed

src/main/java/gg/essential/partnermod/asm/EssentialPartnerClassTransformer.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,14 +97,13 @@ public byte[] transform(String name, String transformedName, byte[] basicClass)
9797
classNode.accept(writer);
9898
return writer.toByteArray();
9999
}
100-
if (transformedName.equals("net.minecraft.client.gui.GuiScreen")) {
100+
if (transformedName.equals("net.minecraftforge.client.ForgeHooksClient")) {
101101
ClassNode classNode = new ClassNode();
102102
ClassReader reader = new ClassReader(basicClass);
103103
reader.accept(classNode, 0);
104104

105105
for (MethodNode method : classNode.methods) {
106-
String methodName = FMLDeobfuscatingRemapper.INSTANCE.mapMethodName(classNode.name, method.name, method.desc);
107-
if (methodName.equals("drawScreen") || methodName.equals("func_73863_a")) {
106+
if (method.name.equals("drawScreen")) {
108107
InsnList list = new InsnList();
109108
list.add(new TypeInsnNode(Opcodes.NEW, DrawEvent));
110109
list.add(new InsnNode(Opcodes.DUP));
@@ -133,6 +132,9 @@ public byte[] transform(String name, String transformedName, byte[] basicClass)
133132
list.add(skipYWrite);
134133
list.add(new FrameNode(Opcodes.F_CHOP, 1, null, 0, null));
135134
method.instructions.insertBefore(method.instructions.getFirst(), list);
135+
// Didn't compute actual need, 16 is just an arbitrary value deemed definitely big enough
136+
method.maxLocals = Math.max(method.maxLocals, 16);
137+
method.maxStack = Math.max(method.maxStack, 16);
136138
}
137139
}
138140

src/main/java/gg/essential/partnermod/modal/ModalManager.java

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ private void resetMousePosition() {
8686
mousePosition = null;
8787
}
8888

89-
private void handlePreDraw(DrawEvent event) {
89+
public void handleMousePos(DrawEvent event) {
9090
if (currentModal == null) return;
9191

9292
setMousePosisiton(FAKE_MOUSE_POS, FAKE_MOUSE_POS);
@@ -160,9 +160,6 @@ private boolean handleKeyTyped(int key) {
160160
//#if FABRIC
161161
//$$ public void registerEvents() {
162162
//$$ ScreenEvents.BEFORE_INIT.register(((client, screen, scaledWidth, scaledHeight) -> {
163-
//$$ ScreenEvents.beforeRender(screen).register((screen1, matrices, mouseX, mouseY, tickDelta) -> {
164-
//$$ handlePreDraw(new DrawEvent(mouseX, mouseY));
165-
//$$ });
166163
//$$ ScreenEvents.afterRender(screen).register((screen1, matrices, mouseX, mouseY, tickDelta) -> {
167164
//$$ handleDraw(matrices);
168165
//$$ });
@@ -186,11 +183,6 @@ private boolean handleKeyTyped(int key) {
186183
//#else
187184
//#if MC>=11900
188185
//$$ @SubscribeEvent
189-
//$$ public void preDraw(ScreenEvent.Render.Pre event) {
190-
//$$ handlePreDraw(new DrawEvent(event.getMouseX(), event.getMouseY()));
191-
//$$ }
192-
//$$
193-
//$$ @SubscribeEvent
194186
//$$ public void draw(ScreenEvent.Render.Post event) {
195187
//#if MC>=12000
196188
//$$ handleDraw(event.getGuiGraphics());
@@ -210,11 +202,6 @@ private boolean handleKeyTyped(int key) {
210202
//$$ }
211203
//#elseif MC>=11800
212204
//$$ @SubscribeEvent
213-
//$$ public void preDraw(ScreenEvent.DrawScreenEvent.Pre event) {
214-
//$$ handlePreDraw(new DrawEvent(event.getMouseX(), event.getMouseY()));
215-
//$$ }
216-
//$$
217-
//$$ @SubscribeEvent
218205
//$$ public void draw(ScreenEvent.DrawScreenEvent.Post event) {
219206
//$$ handleDraw(event.getPoseStack());
220207
//$$ }
@@ -230,11 +217,6 @@ private boolean handleKeyTyped(int key) {
230217
//$$ }
231218
//#elseif MC>=11600
232219
//$$ @SubscribeEvent
233-
//$$ public void preDraw(GuiScreenEvent.DrawScreenEvent.Pre event) {
234-
//$$ handlePreDraw(new DrawEvent(event.getMouseX(), event.getMouseY()));
235-
//$$ }
236-
//$$
237-
//$$ @SubscribeEvent
238220
//$$ public void draw(GuiScreenEvent.DrawScreenEvent.Post event) {
239221
//$$ handleDraw(event.getMatrixStack());
240222
//$$ }
@@ -250,7 +232,7 @@ private boolean handleKeyTyped(int key) {
250232
//$$ }
251233
//#else
252234
public static void preDraw(DrawEvent event) {
253-
INSTANCE.handlePreDraw(event);
235+
INSTANCE.handleMousePos(event);
254236
}
255237

256238
public static void drawScreenPriority(

versions/1.16.5-forge/src/main/java/gg/essential/partnermod/mixins/Mixin_Screen_OverrideMousePosition.java

Lines changed: 62 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,31 +12,83 @@
1212
package gg.essential.partnermod.mixins;
1313

1414
import gg.essential.partnermod.modal.ModalManager;
15-
import net.minecraft.client.gui.screen.Screen;
15+
import net.minecraft.client.renderer.GameRenderer;
1616
import org.spongepowered.asm.mixin.Mixin;
17+
import org.spongepowered.asm.mixin.Unique;
1718
import org.spongepowered.asm.mixin.injection.At;
1819
import org.spongepowered.asm.mixin.injection.ModifyVariable;
20+
import org.spongepowered.asm.mixin.injection.Slice;
1921

20-
@Mixin(Screen.class)
22+
@Mixin(GameRenderer.class)
2123
public class Mixin_Screen_OverrideMousePosition {
2224

25+
@Unique
26+
private ModalManager.DrawEvent event;
27+
28+
@ModifyVariable(
29+
method = "updateCameraAndRender",
30+
at = @At(
31+
value = "FIELD",
32+
target = "Lnet/minecraft/client/Minecraft;currentScreen:Lnet/minecraft/client/gui/screen/Screen;",
33+
ordinal = 0
34+
),
35+
slice = @Slice(from = @At(value = "CONSTANT", args = "stringValue=Rendering overlay")),
36+
ordinal = 0
37+
)
38+
public int captureMouseX(int mouseX) {
39+
event = new ModalManager.DrawEvent(mouseX, -1);
40+
return mouseX;
41+
}
42+
43+
@ModifyVariable(
44+
method = "updateCameraAndRender",
45+
at = @At(
46+
value = "FIELD",
47+
target = "Lnet/minecraft/client/Minecraft;currentScreen:Lnet/minecraft/client/gui/screen/Screen;",
48+
ordinal = 0
49+
),
50+
slice = @Slice(from = @At(value = "CONSTANT", args = "stringValue=Rendering overlay")),
51+
ordinal = 1
52+
)
53+
public int captureMouseY(int mouseY) {
54+
event = new ModalManager.DrawEvent(event.mouseX, mouseY);
55+
ModalManager.INSTANCE.handleMousePos(event);
56+
return mouseY;
57+
}
58+
2359
// FIXME these technically aren't correct, since we don't transform from raw to mc coordinates,
2460
// but that doesn't matter for the FAKE_MOUSE_POS constant
2561

26-
@ModifyVariable(method = "render", at = @At("HEAD"), ordinal = 0, argsOnly = true)
62+
@ModifyVariable(
63+
method = "updateCameraAndRender",
64+
at = @At(
65+
value = "FIELD",
66+
target = "Lnet/minecraft/client/Minecraft;currentScreen:Lnet/minecraft/client/gui/screen/Screen;",
67+
ordinal = 0
68+
),
69+
slice = @Slice(from = @At(value = "CONSTANT", args = "stringValue=Rendering overlay")),
70+
ordinal = 0
71+
)
2772
public int modifyMouseX(int mouseX) {
28-
ModalManager.MousePosition pos = ModalManager.INSTANCE.getMousePosition();
29-
if (pos != null) {
30-
return (int) pos.mouseX;
73+
if (event.mouseXChanged()) {
74+
return event.mouseX;
3175
}
3276
return mouseX;
3377
}
3478

35-
@ModifyVariable(method = "render", at = @At("HEAD"), ordinal = 1, argsOnly = true)
79+
@ModifyVariable(
80+
method = "updateCameraAndRender",
81+
at = @At(
82+
value = "FIELD",
83+
target = "Lnet/minecraft/client/Minecraft;currentScreen:Lnet/minecraft/client/gui/screen/Screen;",
84+
ordinal = 0
85+
),
86+
slice = @Slice(from = @At(value = "CONSTANT", args = "stringValue=Rendering overlay")),
87+
ordinal = 0
88+
)
3689
public int modifyMouseY(int mouseY) {
37-
ModalManager.MousePosition pos = ModalManager.INSTANCE.getMousePosition();
38-
if (pos != null) {
39-
return (int) pos.mouseY;
90+
if (event.mouseYChanged()) {
91+
return event.mouseY;
4092
}
4193
return mouseY;
4294
}

0 commit comments

Comments
 (0)