diff --git a/JavaApp/src/main/java/net/kdt/pojavlaunch/uikit/UIKit.java b/JavaApp/src/main/java/net/kdt/pojavlaunch/uikit/UIKit.java index 1c030fb7..7f3309d5 100644 --- a/JavaApp/src/main/java/net/kdt/pojavlaunch/uikit/UIKit.java +++ b/JavaApp/src/main/java/net/kdt/pojavlaunch/uikit/UIKit.java @@ -8,6 +8,8 @@ public class UIKit { public static final int ACTION_UP = 1; public static final int ACTION_MOVE = 2; + private static int guiScale; + public static void callback_LauncherViewController_installMinecraft() { PLaunchApp.installMinecraft(); } @@ -49,6 +51,18 @@ public class UIKit { CallbackBridge.sendCursorPos(CallbackBridge.mouseX, CallbackBridge.mouseY); } + public static void updateMCGuiScale() { + MCOptionUtils.load(); + String str = MCOptionUtils.get("guiScale"); + guiScale = (str == null ? 0 :Integer.parseInt(str)); + + int scale = Math.max(Math.min(GLFW.mGLFWWindowWidth / 320, GLFW.mGLFWWindowHeight / 240), 1); + if(scale < guiScale || guiScale == 0){ + guiScale = scale; + updateMCGuiScale(guiScale); + } + } + public static boolean updateProgressSafe(final float progress, final String message) { System.out.println(message); return updateProgress(progress, ((int) (progress * 100)) + "% - " + message); @@ -61,6 +75,8 @@ public class UIKit { public static native int launchUI(String[] uiArgs); // public static native void runOnUIThread(UIKitCallback callback); + private static native void updateMCGuiScale(int scale); + // Update progress public static native boolean updateProgress(float progress, String message); diff --git a/JavaApp/src/main/java/net/kdt/pojavlaunch/utils/MCOptionUtils.java b/JavaApp/src/main/java/net/kdt/pojavlaunch/utils/MCOptionUtils.java index 36d11249..a6c8ddc9 100644 --- a/JavaApp/src/main/java/net/kdt/pojavlaunch/utils/MCOptionUtils.java +++ b/JavaApp/src/main/java/net/kdt/pojavlaunch/utils/MCOptionUtils.java @@ -41,6 +41,21 @@ public class MCOptionUtils mLineList.add(key + ":" + value); } + + public static String get(String key){ + if (mLineList == null){ + load(); + } + for (int i = 0; i < mLineList.size(); i++) { + String line = mLineList.get(i); + if (line.startsWith(key + ":")) { + String value = mLineList.get(i); + return value.substring(value.indexOf(":")+1); + } + } + return null; + } + public static void save() { StringBuilder result = new StringBuilder(); for (int i = 0; i < mLineList.size(); i++) { diff --git a/JavaApp/src/main/java/org/lwjgl/glfw/CallbackBridge.java b/JavaApp/src/main/java/org/lwjgl/glfw/CallbackBridge.java index 9c11fe50..2ed6f9d5 100644 --- a/JavaApp/src/main/java/org/lwjgl/glfw/CallbackBridge.java +++ b/JavaApp/src/main/java/org/lwjgl/glfw/CallbackBridge.java @@ -5,6 +5,7 @@ import java.util.*; import android.util.*; import net.kdt.pojavlaunch.*; +import net.kdt.pojavlaunch.uikit.UIKit; public class CallbackBridge { public static final int CLIPBOARD_COPY = 2000; @@ -178,6 +179,10 @@ public class CallbackBridge { public static void sendGrabbing(boolean grab, int xset, int yset) { // sendData(ANDROID_TYPE_GRAB_STATE, Boolean.toString(grab)); + if (grab) { + UIKit.updateMCGuiScale(); + } + mouseX = xset; mouseY = yset; diff --git a/Natives/SurfaceViewController.m b/Natives/SurfaceViewController.m index aa5b8d8d..b06497da 100644 --- a/Natives/SurfaceViewController.m +++ b/Natives/SurfaceViewController.m @@ -47,6 +47,7 @@ int togglableVisibleButtonIndex = -1; UIButton* togglableVisibleButtons[100]; UIView *touchView; UITextField *inputView; +BOOL shouldTriggerClick = NO; // TODO: key modifiers impl @@ -71,6 +72,9 @@ UITextField *inputView; int width = (int) roundf(screenBounds.size.width); int height = (int) roundf(screenBounds.size.height); + savedWidth = roundf(width * screenScale); + savedHeight = roundf(height * screenScale); + touchView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, height)]; UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(surfaceOnClick:)]; @@ -151,27 +155,49 @@ UITextField *inputView; } - (void)surfaceOnClick:(UITapGestureRecognizer *)sender { - if (sender.state == UIGestureRecognizerStateRecognized) { - Java_org_lwjgl_glfw_CallbackBridge_nativeSendMouseButton(NULL, NULL, - isGrabbing == JNI_TRUE ? GLFW_MOUSE_BUTTON_RIGHT : GLFW_MOUSE_BUTTON_LEFT, 1, 0); - Java_org_lwjgl_glfw_CallbackBridge_nativeSendMouseButton(NULL, NULL, - isGrabbing == JNI_TRUE ? GLFW_MOUSE_BUTTON_RIGHT : GLFW_MOUSE_BUTTON_LEFT, 0, 0); + if (sender.state == UIGestureRecognizerStateRecognized && + shouldTriggerClick == YES) { + CGFloat screenScale = [[UIScreen mainScreen] scale]; + CGPoint location = [sender locationInView:[sender.view superview]]; + int hotbarItem = callback_SurfaceViewController_touchHotbar(location.x * screenScale, location.y * screenScale); + + if (hotbarItem == -1) { + Java_org_lwjgl_glfw_CallbackBridge_nativeSendMouseButton(NULL, NULL, + isGrabbing == JNI_TRUE ? GLFW_MOUSE_BUTTON_RIGHT : GLFW_MOUSE_BUTTON_LEFT, 1, 0); + Java_org_lwjgl_glfw_CallbackBridge_nativeSendMouseButton(NULL, NULL, + isGrabbing == JNI_TRUE ? GLFW_MOUSE_BUTTON_RIGHT : GLFW_MOUSE_BUTTON_LEFT, 0, 0); + } else { + Java_org_lwjgl_glfw_CallbackBridge_nativeSendKey(NULL, NULL, hotbarItem, 0, 1, 0); + Java_org_lwjgl_glfw_CallbackBridge_nativeSendKey(NULL, NULL, hotbarItem, 0, 0, 0); + } } } -(void)surfaceOnLongpress:(UILongPressGestureRecognizer *)sender { + CGFloat screenScale = [[UIScreen mainScreen] scale]; + CGPoint location = [sender locationInView:[sender.view superview]]; + int hotbarItem = callback_SurfaceViewController_touchHotbar(location.x * screenScale, location.y * screenScale); if (sender.state == UIGestureRecognizerStateBegan) { - Java_org_lwjgl_glfw_CallbackBridge_nativeSendMouseButton(NULL, NULL, GLFW_MOUSE_BUTTON_LEFT, 1, 0); + if (hotbarItem == -1) { + Java_org_lwjgl_glfw_CallbackBridge_nativeSendMouseButton(NULL, NULL, GLFW_MOUSE_BUTTON_LEFT, 1, 0); + } else { + Java_org_lwjgl_glfw_CallbackBridge_nativeSendKey(NULL, NULL, GLFW_KEY_Q, 0, 1, 0); + } } else if (sender.state == UIGestureRecognizerStateChanged) { - CGPoint locationInView = [sender locationInView:[sender.view superview]]; - [self sendTouchPoint:locationInView withEvent:ACTION_MOVE]; + if (hotbarItem == -1) { + [self sendTouchPoint:location withEvent:ACTION_MOVE]; + } } else { if (sender.state == UIGestureRecognizerStateCancelled || sender.state == UIGestureRecognizerStateFailed || sender.state == UIGestureRecognizerStateEnded) { - Java_org_lwjgl_glfw_CallbackBridge_nativeSendMouseButton(NULL, NULL, GLFW_MOUSE_BUTTON_LEFT, 0, 0); + if (hotbarItem == -1) { + Java_org_lwjgl_glfw_CallbackBridge_nativeSendMouseButton(NULL, NULL, GLFW_MOUSE_BUTTON_LEFT, 0, 0); + } else { + Java_org_lwjgl_glfw_CallbackBridge_nativeSendKey(NULL, NULL, GLFW_KEY_Q, 0, 0, 0); + } } } } @@ -304,7 +330,9 @@ BOOL isNotifRemoved; - (void)sendTouchPoint:(CGPoint)location withEvent:(int)event{ CGFloat screenScale = [[UIScreen mainScreen] scale]; + if (callback_SurfaceViewController_touchHotbar(location.x * screenScale, location.y * screenScale) == -1) { callback_SurfaceViewController_onTouch(event, location.x * screenScale, location.y * screenScale); + } // Java_org_lwjgl_glfw_CallbackBridge_nativeSendCursorPos(NULL, NULL, location.x * screenScale, location.y * screenScale); } @@ -314,6 +342,7 @@ BOOL isNotifRemoved; { [super touchesBegan: touches withEvent: event]; [self sendTouchEvent: touches withEvent: ACTION_DOWN]; + shouldTriggerClick = YES; } // Equals to Android ACTION_MOVE @@ -321,6 +350,7 @@ BOOL isNotifRemoved; { [super touchesMoved: touches withEvent: event]; [self sendTouchEvent: touches withEvent: ACTION_MOVE]; + shouldTriggerClick = NO; } // Equals to Android ACTION_UP diff --git a/Natives/input_bridge_v3.c b/Natives/input_bridge_v3.c index bd38d69e..f83c7458 100644 --- a/Natives/input_bridge_v3.c +++ b/Natives/input_bridge_v3.c @@ -14,6 +14,7 @@ #include #include +#include "glfw_keycodes.h" #include "ios_uikit_bridge.h" #include "log.h" @@ -209,6 +210,34 @@ void callback_SurfaceViewController_onTouch(int event, int x, int y) { ); } +const int hotbarKeys[9] = { + GLFW_KEY_1, GLFW_KEY_2, GLFW_KEY_3, + GLFW_KEY_4, GLFW_KEY_5, GLFW_KEY_6, + GLFW_KEY_7, GLFW_KEY_8, GLFW_KEY_9 +}; +int guiScale = 1, scaleFactor = 1; +int mcscale(int input) { + return (int)((guiScale * input)/scaleFactor); +} +int callback_SurfaceViewController_touchHotbar(int x, int y) { + if (isGrabbing == JNI_FALSE) { + return -1; + } + + int barHeight = mcscale(20); + int barWidth = mcscale(180); + int barX = (savedWidth / 2) - (barWidth / 2); + int barY = savedHeight - barHeight; + if (x < barX || x >= barX + barWidth || y < barY || y >= barY + barHeight) { + return -1; + } + return hotbarKeys[((x - barX) / mcscale(180 / 9)) % 9]; +} + +JNIEXPORT void JNICALL Java_net_kdt_pojavlaunch_uikit_UIKit_updateMCGuiScale(JNIEnv* env, jclass clazz, jint scale) { + guiScale = scale; +} + JNIEXPORT void JNICALL Java_net_kdt_pojavlaunch_uikit_UIKit_setButtonSkippable(JNIEnv* env, jclass clazz) { UIKit_setButtonSkippable(); } diff --git a/Natives/utils.h b/Natives/utils.h index c9e62d27..f4880389 100644 --- a/Natives/utils.h +++ b/Natives/utils.h @@ -48,6 +48,7 @@ void closeGLFWWindow(); void callback_LauncherViewController_installMinecraft(); void callback_SurfaceViewController_launchMinecraft(int width, int height); void callback_SurfaceViewController_onTouch(int event, int x, int y); +int callback_SurfaceViewController_touchHotbar(int x, int y); JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_CallbackBridge_nativeSendChar(JNIEnv* env, jclass clazz, jchar codepoint /* jint codepoint */); JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_CallbackBridge_nativeSendCharMods(JNIEnv* env, jclass clazz, jchar codepoint, jint mods);