Skip to content

Commit 81ca207

Browse files
committed
🐛 Fix not able to use mouse + controller combo
1 parent 75e6dd9 commit 81ca207

File tree

9 files changed

+107
-38
lines changed

9 files changed

+107
-38
lines changed

common/src/main/java/com/mrcrayfish/controllable/client/VirtualCursor.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public final class VirtualCursor
3838
private boolean visible;
3939
private boolean snapIfNoMove;
4040
private boolean initialized;
41+
private CursorMode mode = CursorMode.CONTROLLER;
4142

4243
@ApiStatus.Internal
4344
public VirtualCursor()
@@ -71,7 +72,7 @@ public void resetToCenter()
7172
*/
7273
public boolean isVisible()
7374
{
74-
return this.visible;
75+
return this.mode.isController() && this.visible;
7576
}
7677

7778
/**
@@ -153,6 +154,25 @@ public double getRenderScreenY()
153154
return this.renderY * (double) mc.getWindow().getGuiScaledHeight() / (double) mc.getWindow().getHeight();
154155
}
155156

157+
/**
158+
* @return The current cursor mode
159+
*/
160+
public CursorMode getMode()
161+
{
162+
return this.mode;
163+
}
164+
165+
/**
166+
* Sets the cursor mode.
167+
*
168+
* @param mode the new cursor mode
169+
*/
170+
@ApiStatus.Internal
171+
public void setMode(CursorMode mode)
172+
{
173+
this.mode = mode;
174+
}
175+
156176
/**
157177
* Updates the movement of the cursor.
158178
*/
@@ -200,6 +220,7 @@ private void updateMovement()
200220

201221
// Let the next update know to try snapping if no input detected
202222
this.snapIfNoMove = true;
223+
this.mode = CursorMode.CONTROLLER;
203224
}
204225
else if(this.snapIfNoMove)
205226
{
@@ -392,4 +413,19 @@ private void snapToContainerSlot()
392413
}
393414
}
394415
}
416+
417+
public enum CursorMode
418+
{
419+
CONTROLLER, MOUSE;
420+
421+
public boolean isController()
422+
{
423+
return this == CONTROLLER;
424+
}
425+
426+
public boolean isMouse()
427+
{
428+
return this == MOUSE;
429+
}
430+
}
395431
}

common/src/main/java/com/mrcrayfish/controllable/client/input/Controller.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.mrcrayfish.controllable.client.input;
22

33
import com.mrcrayfish.controllable.Config;
4+
import com.mrcrayfish.controllable.Controllable;
45
import com.mrcrayfish.controllable.client.binding.ButtonBinding;
56
import com.mrcrayfish.controllable.client.util.InputHelper;
67
import net.minecraft.Util;
@@ -199,6 +200,14 @@ public final boolean isBeingUsed()
199200
return Util.getMillis() - this.lastInputTime < 4000;
200201
}
201202

203+
/**
204+
* @return True if controller input has been used recently
205+
*/
206+
public final boolean isUsingVirtualCursor()
207+
{
208+
return this.isBeingUsed() && Controllable.getCursor().getMode().isController();
209+
}
210+
202211
/**
203212
* Gets the pressed value of a button. This value ranges from 0 to 1 (inclusive). If the value
204213
* is greater than zero, it is considered pressed. Binary buttons will only be either 0 or 1,

common/src/main/java/com/mrcrayfish/controllable/client/overlay/VirtualCursorOverlay.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class VirtualCursorOverlay implements IOverlay
2323
public boolean isVisible()
2424
{
2525
Controller controller = Controllable.getController();
26-
return Minecraft.getInstance().getOverlay() == null && Minecraft.getInstance().screen != null && controller != null && controller.isBeingUsed() && Controllable.getCursor().isVisible();
26+
return Minecraft.getInstance().getOverlay() == null && Minecraft.getInstance().screen != null && controller != null && controller.isUsingVirtualCursor() && Controllable.getCursor().isVisible();
2727
}
2828

2929
@Override

common/src/main/java/com/mrcrayfish/controllable/mixin/client/GameRendererMixin.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ private void controllableLastRender(DeltaTracker tracker, boolean running, Callb
2929
private int controllableModifyMouseX(int original)
3030
{
3131
Controller controller = Controllable.getController();
32-
if(controller != null && controller.isBeingUsed())
32+
if(controller != null && controller.isUsingVirtualCursor())
3333
{
3434
return (int) Controllable.getCursor().getRenderScreenX();
3535
}
@@ -40,7 +40,7 @@ private int controllableModifyMouseX(int original)
4040
private int controllableModifyMouseY(int original)
4141
{
4242
Controller controller = Controllable.getController();
43-
if(controller != null && controller.isBeingUsed())
43+
if(controller != null && controller.isUsingVirtualCursor())
4444
{
4545
return (int) Controllable.getCursor().getRenderScreenY();
4646
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.mrcrayfish.controllable.mixin.client;
2+
3+
import com.mrcrayfish.controllable.Controllable;
4+
import com.mrcrayfish.controllable.client.VirtualCursor;
5+
import net.minecraft.client.Minecraft;
6+
import net.minecraft.client.MouseHandler;
7+
import org.spongepowered.asm.mixin.Mixin;
8+
import org.spongepowered.asm.mixin.injection.At;
9+
import org.spongepowered.asm.mixin.injection.Inject;
10+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
11+
12+
@Mixin(MouseHandler.class)
13+
public class MouseHandlerMixin
14+
{
15+
@Inject(method = "onMove", at = @At(value = "HEAD"))
16+
private void controllableOnMouseMoved(long windowId, double mouseX, double mouseY, CallbackInfo ci)
17+
{
18+
if(windowId == Minecraft.getInstance().getWindow().getWindow())
19+
{
20+
Controllable.getCursor().setMode(VirtualCursor.CursorMode.MOUSE);
21+
}
22+
}
23+
}

common/src/main/java/com/mrcrayfish/controllable/mixin/client/MouseHelperMixin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ private void controllableBeforeUpdateLook(CallbackInfo ci)
6464
private void controllableGrabCursor(CallbackInfo ci)
6565
{
6666
Controller controller = Controllable.getController();
67-
if(controller != null && controller.isBeingUsed() && !this.controllable$releaseBypass)
67+
if(controller != null && controller.isUsingVirtualCursor() && !this.controllable$releaseBypass)
6868
{
6969
ci.cancel();
7070
}

common/src/main/java/com/mrcrayfish/controllable/mixin/client/jei/MouseUtilMixin.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public class MouseUtilMixin
2525
private static void controllableGetX(CallbackInfoReturnable<Double> cir)
2626
{
2727
Controller controller = Controllable.getController();
28-
if(controller != null && controller.isBeingUsed())
28+
if(controller != null && controller.isUsingVirtualCursor())
2929
{
3030
cir.setReturnValue(Controllable.getCursor().getRenderScreenX());
3131
}
@@ -35,7 +35,7 @@ private static void controllableGetX(CallbackInfoReturnable<Double> cir)
3535
private static void controllableGetY(CallbackInfoReturnable<Double> cir)
3636
{
3737
Controller controller = Controllable.getController();
38-
if(controller != null && controller.isBeingUsed())
38+
if(controller != null && controller.isUsingVirtualCursor())
3939
{
4040
cir.setReturnValue(Controllable.getCursor().getRenderScreenY());
4141
}

common/src/main/java/com/mrcrayfish/controllable/mixin/client/rei/PointHelperMixin.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public class PointHelperMixin
2121
private static void controllableMouse(CallbackInfoReturnable<Point> cir)
2222
{
2323
Controller controller = Controllable.getController();
24-
if(controller != null && controller.isBeingUsed())
24+
if(controller != null && controller.isUsingVirtualCursor())
2525
{
2626
double mouseX = Controllable.getCursor().getRenderScreenX();
2727
double mouseY = Controllable.getCursor().getRenderScreenY();
@@ -33,7 +33,7 @@ private static void controllableMouse(CallbackInfoReturnable<Point> cir)
3333
private static void controllableFloatMouse(CallbackInfoReturnable<FloatingPoint> cir)
3434
{
3535
Controller controller = Controllable.getController();
36-
if(controller != null && controller.isBeingUsed())
36+
if(controller != null && controller.isUsingVirtualCursor())
3737
{
3838
double mouseX = Controllable.getCursor().getRenderScreenX();
3939
double mouseY = Controllable.getCursor().getRenderScreenY();
Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,32 @@
11
{
2-
"required": true,
3-
"package": "com.mrcrayfish.controllable.mixin",
4-
"compatibilityLevel": "JAVA_21",
5-
"minVersion": "0.8",
6-
"refmap": "controllable.refmap.json",
7-
"client": [
8-
"client.ContainerScreenMixin",
9-
"client.GameRendererMixin",
10-
"client.GuiMixin",
11-
"client.LocalPlayerMixin",
12-
"client.MinecraftMixin",
13-
"client.MouseHelperMixin",
14-
"client.OverlayRecipeButtonAccessor",
15-
"client.OverlayRecipeComponentAccessor",
16-
"client.RecipeBookComponentAccessor",
17-
"client.RecipeBookPageAccessor",
18-
"client.RecipeBookPageMixin",
19-
"client.TimerAccessor",
20-
"client.jei.GuiIconToggleButtonMixin",
21-
"client.jei.IngredientGridMixin",
22-
"client.jei.IngredientGridWithNavigationMixin",
23-
"client.jei.IngredientListOverlayMixin",
24-
"client.jei.MouseUtilMixin",
25-
"client.jei.PageNavigationMixin",
26-
"client.rei.PointHelperMixin"
27-
],
28-
"injectors": {
29-
"defaultRequire": 1
30-
}
2+
"required": true,
3+
"package": "com.mrcrayfish.controllable.mixin",
4+
"compatibilityLevel": "JAVA_21",
5+
"minVersion": "0.8",
6+
"refmap": "controllable.refmap.json",
7+
"client": [
8+
"client.ContainerScreenMixin",
9+
"client.GameRendererMixin",
10+
"client.GuiMixin",
11+
"client.LocalPlayerMixin",
12+
"client.MinecraftMixin",
13+
"client.MouseHandlerMixin",
14+
"client.MouseHelperMixin",
15+
"client.OverlayRecipeButtonAccessor",
16+
"client.OverlayRecipeComponentAccessor",
17+
"client.RecipeBookComponentAccessor",
18+
"client.RecipeBookPageAccessor",
19+
"client.RecipeBookPageMixin",
20+
"client.TimerAccessor",
21+
"client.jei.GuiIconToggleButtonMixin",
22+
"client.jei.IngredientGridMixin",
23+
"client.jei.IngredientGridWithNavigationMixin",
24+
"client.jei.IngredientListOverlayMixin",
25+
"client.jei.MouseUtilMixin",
26+
"client.jei.PageNavigationMixin",
27+
"client.rei.PointHelperMixin"
28+
],
29+
"injectors": {
30+
"defaultRequire": 1
31+
}
3132
}

0 commit comments

Comments
 (0)