forked from chinosk/gkms-local
				
			Compare commits
	
		
			No commits in common. "7fff556cabd31220518889dd72d9ba146cecfbdb" and "64f147586f304ef804f908ebad29b6e5a5fa632f" have entirely different histories.
		
	
	
		
			7fff556cab
			...
			64f147586f
		
	
		| 
						 | 
					@ -24,16 +24,3 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define WM_KEYDOWN 0
 | 
					#define WM_KEYDOWN 0
 | 
				
			||||||
#define WM_KEYUP 1
 | 
					#define WM_KEYUP 1
 | 
				
			||||||
 | 
					 | 
				
			||||||
#define BTN_A 96
 | 
					 | 
				
			||||||
#define BTN_B 97
 | 
					 | 
				
			||||||
#define BTN_X 99
 | 
					 | 
				
			||||||
#define BTN_Y 100
 | 
					 | 
				
			||||||
#define BTN_LB 102
 | 
					 | 
				
			||||||
#define BTN_RB 103
 | 
					 | 
				
			||||||
#define BTN_THUMBL 106
 | 
					 | 
				
			||||||
#define BTN_THUMBR 107
 | 
					 | 
				
			||||||
#define BTN_SELECT 109
 | 
					 | 
				
			||||||
#define BTN_START 108
 | 
					 | 
				
			||||||
#define BTN_SHARE 130
 | 
					 | 
				
			||||||
#define BTN_XBOX 110
 | 
					 | 
				
			||||||
| 
						 | 
					@ -100,30 +100,4 @@ namespace GakumasLocal::Log {
 | 
				
			||||||
        GetParamStringResult(result);
 | 
					        GetParamStringResult(result);
 | 
				
			||||||
        ShowToast(result);
 | 
					        ShowToast(result);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    void ShowToast(const char* text) {
 | 
					 | 
				
			||||||
        DebugFmt("Toast: %s", text);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        std::thread([text](){
 | 
					 | 
				
			||||||
            auto env = Misc::GetJNIEnv();
 | 
					 | 
				
			||||||
            if (!env) {
 | 
					 | 
				
			||||||
                return;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            jclass& kotlinClass = g_gakumasHookMainClass;
 | 
					 | 
				
			||||||
            if (!kotlinClass) {
 | 
					 | 
				
			||||||
                g_javaVM->DetachCurrentThread();
 | 
					 | 
				
			||||||
                return;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            jmethodID& methodId = showToastMethodId;
 | 
					 | 
				
			||||||
            if (!methodId) {
 | 
					 | 
				
			||||||
                g_javaVM->DetachCurrentThread();
 | 
					 | 
				
			||||||
                return;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            jstring param = env->NewStringUTF(text);
 | 
					 | 
				
			||||||
            env->CallStaticVoidMethod(kotlinClass, methodId, param);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            g_javaVM->DetachCurrentThread();
 | 
					 | 
				
			||||||
        }).detach();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -62,14 +62,14 @@ namespace BaseCamera {
 | 
				
			||||||
		return lookAt;
 | 
							return lookAt;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void Camera::set_lon_move(float vertanglePlus, LonMoveHState moveState, float multiplier) {  // 前后移动
 | 
						void Camera::set_lon_move(float vertanglePlus, LonMoveHState moveState) {  // 前后移动
 | 
				
			||||||
		auto radian = (verticalAngle + vertanglePlus) * M_PI / 180;
 | 
							auto radian = (verticalAngle + vertanglePlus) * M_PI / 180;
 | 
				
			||||||
		auto radianH = (double)horizontalAngle * M_PI / 180;
 | 
							auto radianH = (double)horizontalAngle * M_PI / 180;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		auto f_step = cos(radian) * moveStep * cos(radianH) / smoothLevel * multiplier;  // ↑↓
 | 
							auto f_step = cos(radian) * moveStep * cos(radianH) / smoothLevel;  // ↑↓
 | 
				
			||||||
		auto l_step = sin(radian) * moveStep * cos(radianH) / smoothLevel * multiplier;  // ←→
 | 
							auto l_step = sin(radian) * moveStep * cos(radianH) / smoothLevel;  // ←→
 | 
				
			||||||
		// auto h_step = tan(radianH) * sqrt(pow(f_step, 2) + pow(l_step, 2));
 | 
							// auto h_step = tan(radianH) * sqrt(pow(f_step, 2) + pow(l_step, 2));
 | 
				
			||||||
		auto h_step = sin(radianH) * moveStep / smoothLevel * multiplier;
 | 
							auto h_step = sin(radianH) * moveStep / smoothLevel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		switch (moveState)
 | 
							switch (moveState)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,7 +30,7 @@ namespace BaseCamera {
 | 
				
			||||||
		void setPos(float x, float y, float z);
 | 
							void setPos(float x, float y, float z);
 | 
				
			||||||
		void setLookAt(float x, float y, float z);
 | 
							void setLookAt(float x, float y, float z);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		void set_lon_move(float vertanglePlus, LonMoveHState moveState = LonMoveHState::LonMoveLeftAndRight, float multiplier = 1.0f);
 | 
							void set_lon_move(float vertanglePlus, LonMoveHState moveState = LonMoveHState::LonMoveLeftAndRight);
 | 
				
			||||||
		void updateVertLook();
 | 
							void updateVertLook();
 | 
				
			||||||
		void setHoriLook(float vertangle);
 | 
							void setHoriLook(float vertangle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,9 +16,6 @@ namespace GKCamera {
 | 
				
			||||||
    UnityResolve::UnityType::Vector2 followLookAtOffset{0, 0};
 | 
					    UnityResolve::UnityType::Vector2 followLookAtOffset{0, 0};
 | 
				
			||||||
    float offsetMoveStep = 0.008;
 | 
					    float offsetMoveStep = 0.008;
 | 
				
			||||||
    int followCharaIndex = 0;
 | 
					    int followCharaIndex = 0;
 | 
				
			||||||
    float l_sensitivity = 0.5f;
 | 
					 | 
				
			||||||
    float r_sensitivity = 0.5f;
 | 
					 | 
				
			||||||
    bool showToast = true;
 | 
					 | 
				
			||||||
    GakumasLocal::Misc::CSEnum bodyPartsEnum("Head", 0xa);
 | 
					    GakumasLocal::Misc::CSEnum bodyPartsEnum("Head", 0xa);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// bool rMousePressFlg = false;
 | 
						// bool rMousePressFlg = false;
 | 
				
			||||||
| 
						 | 
					@ -62,16 +59,16 @@ namespace GKCamera {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	void camera_back(float multiplier = 1.0f) {  // 后退
 | 
						void camera_back() {  // 后退
 | 
				
			||||||
        switch (cameraMode) {
 | 
					        switch (cameraMode) {
 | 
				
			||||||
            case CameraMode::FREE: {
 | 
					            case CameraMode::FREE: {
 | 
				
			||||||
                baseCamera.set_lon_move(180, LonMoveHState::LonMoveBack, multiplier);
 | 
					                baseCamera.set_lon_move(180, LonMoveHState::LonMoveBack);
 | 
				
			||||||
            } break;
 | 
					            } break;
 | 
				
			||||||
            case CameraMode::FIRST_PERSON: {
 | 
					            case CameraMode::FIRST_PERSON: {
 | 
				
			||||||
                firstPersonPosOffset.z -= offsetMoveStep * multiplier;
 | 
					                firstPersonPosOffset.z -= offsetMoveStep;
 | 
				
			||||||
            } break;
 | 
					            } break;
 | 
				
			||||||
            case CameraMode::FOLLOW: {
 | 
					            case CameraMode::FOLLOW: {
 | 
				
			||||||
                followPosOffset.z += offsetMoveStep * multiplier;
 | 
					                followPosOffset.z += offsetMoveStep;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -89,24 +86,24 @@ namespace GKCamera {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	void camera_right(float multiplier = 1.0f) {  // 向右
 | 
						void camera_right() {  // 向右
 | 
				
			||||||
        switch (cameraMode) {
 | 
					        switch (cameraMode) {
 | 
				
			||||||
            case CameraMode::FREE: {
 | 
					            case CameraMode::FREE: {
 | 
				
			||||||
                baseCamera.set_lon_move(-90, LonMoveLeftAndRight, multiplier);
 | 
					                baseCamera.set_lon_move(-90);
 | 
				
			||||||
            } break;
 | 
					            } break;
 | 
				
			||||||
            case CameraMode::FOLLOW: {
 | 
					            case CameraMode::FOLLOW: {
 | 
				
			||||||
                // followPosOffset.x -= 0.8;
 | 
					                // followPosOffset.x -= 0.8;
 | 
				
			||||||
                followLookAtOffset.x -= offsetMoveStep * multiplier;
 | 
					                followLookAtOffset.x -= offsetMoveStep;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            default:
 | 
					            default:
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void camera_down(float multiplier = 1.0f) {  // 向下
 | 
						void camera_down() {  // 向下
 | 
				
			||||||
        switch (cameraMode) {
 | 
					        switch (cameraMode) {
 | 
				
			||||||
            case CameraMode::FREE: {
 | 
					            case CameraMode::FREE: {
 | 
				
			||||||
                float preStep = BaseCamera::moveStep / BaseCamera::smoothLevel * multiplier;
 | 
					                float preStep = BaseCamera::moveStep / BaseCamera::smoothLevel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                for (int i = 0; i < BaseCamera::smoothLevel; i++) {
 | 
					                for (int i = 0; i < BaseCamera::smoothLevel; i++) {
 | 
				
			||||||
                    baseCamera.pos.y -= preStep;
 | 
					                    baseCamera.pos.y -= preStep;
 | 
				
			||||||
| 
						 | 
					@ -115,19 +112,19 @@ namespace GKCamera {
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } break;
 | 
					            } break;
 | 
				
			||||||
            case CameraMode::FIRST_PERSON: {
 | 
					            case CameraMode::FIRST_PERSON: {
 | 
				
			||||||
                firstPersonPosOffset.y -= offsetMoveStep * multiplier;
 | 
					                firstPersonPosOffset.y -= offsetMoveStep;
 | 
				
			||||||
            } break;
 | 
					            } break;
 | 
				
			||||||
            case CameraMode::FOLLOW: {
 | 
					            case CameraMode::FOLLOW: {
 | 
				
			||||||
                // followPosOffset.y -= offsetMoveStep;
 | 
					                // followPosOffset.y -= offsetMoveStep;
 | 
				
			||||||
                followLookAtOffset.y -= offsetMoveStep * multiplier;
 | 
					                followLookAtOffset.y -= offsetMoveStep;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void camera_up(float multiplier = 1.0f) {  // 向上
 | 
						void camera_up() {  // 向上
 | 
				
			||||||
        switch (cameraMode) {
 | 
					        switch (cameraMode) {
 | 
				
			||||||
            case CameraMode::FREE: {
 | 
					            case CameraMode::FREE: {
 | 
				
			||||||
                float preStep = BaseCamera::moveStep / BaseCamera::smoothLevel * multiplier;
 | 
					                float preStep = BaseCamera::moveStep / BaseCamera::smoothLevel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                for (int i = 0; i < BaseCamera::smoothLevel; i++) {
 | 
					                for (int i = 0; i < BaseCamera::smoothLevel; i++) {
 | 
				
			||||||
                    baseCamera.pos.y += preStep;
 | 
					                    baseCamera.pos.y += preStep;
 | 
				
			||||||
| 
						 | 
					@ -136,11 +133,11 @@ namespace GKCamera {
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } break;
 | 
					            } break;
 | 
				
			||||||
            case CameraMode::FIRST_PERSON: {
 | 
					            case CameraMode::FIRST_PERSON: {
 | 
				
			||||||
                firstPersonPosOffset.y += offsetMoveStep * multiplier;
 | 
					                firstPersonPosOffset.y += offsetMoveStep;
 | 
				
			||||||
            } break;
 | 
					            } break;
 | 
				
			||||||
            case CameraMode::FOLLOW: {
 | 
					            case CameraMode::FOLLOW: {
 | 
				
			||||||
                // followPosOffset.y += offsetMoveStep;
 | 
					                // followPosOffset.y += offsetMoveStep;
 | 
				
			||||||
                followLookAtOffset.y += offsetMoveStep * multiplier;
 | 
					                followLookAtOffset.y += offsetMoveStep;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -252,142 +249,6 @@ namespace GKCamera {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void ShowToast(const char *text) {
 | 
					 | 
				
			||||||
        if (showToast) {
 | 
					 | 
				
			||||||
            GakumasLocal::Log::ShowToast(text);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void JLThumbRight(float value) {
 | 
					 | 
				
			||||||
        camera_right(value * l_sensitivity * baseCamera.fov / 60);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void JLThumbDown(float value) {
 | 
					 | 
				
			||||||
        camera_back(value * l_sensitivity * baseCamera.fov / 60);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void JRThumbRight(float value) {
 | 
					 | 
				
			||||||
        cameraLookat_right(value * r_sensitivity * baseCamera.fov / 60);
 | 
					 | 
				
			||||||
        ChangeLiveFollowCameraOffsetX(-1 * value * r_sensitivity * baseCamera.fov / 60);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void JRThumbDown(float value) {
 | 
					 | 
				
			||||||
        cameraLookat_down(value * r_sensitivity * baseCamera.fov / 60);
 | 
					 | 
				
			||||||
        ChangeLiveFollowCameraOffsetY(-0.1 * value * r_sensitivity * baseCamera.fov / 60);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void JDadUp(){
 | 
					 | 
				
			||||||
        reset_camera();
 | 
					 | 
				
			||||||
        ShowToast("Reset Camera");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void JDadDown(){
 | 
					 | 
				
			||||||
        ShowToast("Notification off, click again to turn it on.");
 | 
					 | 
				
			||||||
        showToast = !showToast;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void JDadLeft(){
 | 
					 | 
				
			||||||
        l_sensitivity = 1.0f;
 | 
					 | 
				
			||||||
        ShowToast("Reset Movement Sensitivity");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void JDadRight(){
 | 
					 | 
				
			||||||
        r_sensitivity = 1.0f;
 | 
					 | 
				
			||||||
        ShowToast("Reset Camera Sensitivity");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void JAKeyDown() {
 | 
					 | 
				
			||||||
        if (cameraMode == CameraMode::FOLLOW) {
 | 
					 | 
				
			||||||
            const auto currPart = bodyPartsEnum.Next();
 | 
					 | 
				
			||||||
            if (showToast) {
 | 
					 | 
				
			||||||
                GakumasLocal::Log::ShowToastFmt("Look at: %s (0x%x)", currPart.first.c_str(),
 | 
					 | 
				
			||||||
                                                currPart.second);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            r_sensitivity *= 0.8f;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void JBKeyDown() {
 | 
					 | 
				
			||||||
        if (cameraMode == CameraMode::FOLLOW) {
 | 
					 | 
				
			||||||
            const auto currPart = bodyPartsEnum.Last();
 | 
					 | 
				
			||||||
            if (showToast) {
 | 
					 | 
				
			||||||
                GakumasLocal::Log::ShowToastFmt("Look at: %s (0x%x)", currPart.first.c_str(),
 | 
					 | 
				
			||||||
                                                currPart.second);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            r_sensitivity *= 1.2f;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void JXKeyDown() {
 | 
					 | 
				
			||||||
        if (cameraMode == CameraMode::FOLLOW) {
 | 
					 | 
				
			||||||
            OnLeftDown();
 | 
					 | 
				
			||||||
            if (showToast) {
 | 
					 | 
				
			||||||
                GakumasLocal::Log::ShowToastFmt("Look at position: %d", followCharaIndex);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            l_sensitivity *= 0.8f;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void JYKeyDown() {
 | 
					 | 
				
			||||||
        if (cameraMode == CameraMode::FOLLOW) {
 | 
					 | 
				
			||||||
            OnRightDown();
 | 
					 | 
				
			||||||
            if (showToast) {
 | 
					 | 
				
			||||||
                GakumasLocal::Log::ShowToastFmt("Look at position: %d", followCharaIndex);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            l_sensitivity *= 1.2f;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void JSelectKeyDown() {
 | 
					 | 
				
			||||||
        switch (cameraMode) {
 | 
					 | 
				
			||||||
            case CameraMode::FREE: {
 | 
					 | 
				
			||||||
                cameraMode = CameraMode::FOLLOW;
 | 
					 | 
				
			||||||
                ShowToast("Follow Mode");
 | 
					 | 
				
			||||||
            } break;
 | 
					 | 
				
			||||||
            case CameraMode::FOLLOW: {
 | 
					 | 
				
			||||||
                cameraMode = CameraMode::FIRST_PERSON;
 | 
					 | 
				
			||||||
                ShowToast("First-person Mode");
 | 
					 | 
				
			||||||
            } break;
 | 
					 | 
				
			||||||
            case CameraMode::FIRST_PERSON: {
 | 
					 | 
				
			||||||
                cameraMode = CameraMode::FREE;
 | 
					 | 
				
			||||||
                ShowToast("Free Mode");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            } break;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void JStartKeyDown() {
 | 
					 | 
				
			||||||
        switch (cameraMode) {
 | 
					 | 
				
			||||||
            case CameraMode::FIRST_PERSON: {
 | 
					 | 
				
			||||||
                if (firstPersonRoll == FirstPersonRoll::ENABLE_ROLL) {
 | 
					 | 
				
			||||||
                    firstPersonRoll = FirstPersonRoll::DISABLE_ROLL;
 | 
					 | 
				
			||||||
                    ShowToast("Camera Horizontal Fixed");
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                else {
 | 
					 | 
				
			||||||
                    firstPersonRoll = FirstPersonRoll::ENABLE_ROLL;
 | 
					 | 
				
			||||||
                    ShowToast("Camera Horizontal Rollable");
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            } break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            case CameraMode::FOLLOW: {
 | 
					 | 
				
			||||||
                if (followModeY == FollowModeY::APPLY_Y) {
 | 
					 | 
				
			||||||
                    followModeY = FollowModeY::SMOOTH_Y;
 | 
					 | 
				
			||||||
                    ShowToast("Smooth Lift");
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                else {
 | 
					 | 
				
			||||||
                    followModeY = FollowModeY::APPLY_Y;
 | 
					 | 
				
			||||||
                    ShowToast("Instant Lift");
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            } break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            default: break;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    UnityResolve::UnityType::Vector3 CalcPositionFromLookAt(const UnityResolve::UnityType::Vector3& target,
 | 
					    UnityResolve::UnityType::Vector3 CalcPositionFromLookAt(const UnityResolve::UnityType::Vector3& target,
 | 
				
			||||||
                                                            const UnityResolve::UnityType::Vector3& offset) {
 | 
					                                                            const UnityResolve::UnityType::Vector3& offset) {
 | 
				
			||||||
        // offset: z 远近, y 高低, x角度
 | 
					        // offset: z 远近, y 高低, x角度
 | 
				
			||||||
| 
						 | 
					@ -489,49 +350,13 @@ namespace GKCamera {
 | 
				
			||||||
		bool k = false;
 | 
							bool k = false;
 | 
				
			||||||
		bool j = false;
 | 
							bool j = false;
 | 
				
			||||||
		bool l = false;
 | 
							bool l = false;
 | 
				
			||||||
        float thumb_l_right = 0.0f;
 | 
					 | 
				
			||||||
        float thumb_l_down = 0.0f;
 | 
					 | 
				
			||||||
        bool thumb_l_button = false;
 | 
					 | 
				
			||||||
        float thumb_r_right = 0.0f;
 | 
					 | 
				
			||||||
        float thumb_r_down = 0.0f;
 | 
					 | 
				
			||||||
        bool thumb_r_button = false;
 | 
					 | 
				
			||||||
        bool dpad_up = false;
 | 
					 | 
				
			||||||
        bool dpad_down = false;
 | 
					 | 
				
			||||||
        bool dpad_left = false;
 | 
					 | 
				
			||||||
        bool dpad_right = false;
 | 
					 | 
				
			||||||
        bool a_button = false;
 | 
					 | 
				
			||||||
        bool b_button = false;
 | 
					 | 
				
			||||||
        bool x_button = false;
 | 
					 | 
				
			||||||
        bool y_button = false;
 | 
					 | 
				
			||||||
        bool lb_button = false;
 | 
					 | 
				
			||||||
        float lt_button = 0.0f;
 | 
					 | 
				
			||||||
        bool rb_button = false;
 | 
					 | 
				
			||||||
        float rt_button = 0.0f;
 | 
					 | 
				
			||||||
        bool select_button = false;
 | 
					 | 
				
			||||||
        bool start_button = false;
 | 
					 | 
				
			||||||
        bool share_button = false;
 | 
					 | 
				
			||||||
        bool xbox_button = false;
 | 
					 | 
				
			||||||
		bool threadRunning = false;
 | 
							bool threadRunning = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		void resetAll() {
 | 
							void resetAll() {
 | 
				
			||||||
            // 获取当前对象的指针并转换为 unsigned char* 类型
 | 
								auto p = reinterpret_cast<bool*>(this);
 | 
				
			||||||
            unsigned char* p = reinterpret_cast<unsigned char*>(this);
 | 
								const auto numMembers = sizeof(*this) / sizeof(bool);
 | 
				
			||||||
 | 
								for (size_t idx = 0; idx < numMembers; ++idx) {
 | 
				
			||||||
            // 遍历对象的每个字节
 | 
									p[idx] = false;
 | 
				
			||||||
            for (size_t offset = 0; offset < sizeof(*this); ) {
 | 
					 | 
				
			||||||
                if (offset + sizeof(bool) <= sizeof(*this) && reinterpret_cast<bool*>(p + offset) == reinterpret_cast<bool*>(this) + offset / sizeof(bool)) {
 | 
					 | 
				
			||||||
                    // 如果当前偏移量适用于 bool 类型,则将其设置为 false
 | 
					 | 
				
			||||||
                    *reinterpret_cast<bool*>(p + offset) = false;
 | 
					 | 
				
			||||||
                    offset += sizeof(bool);
 | 
					 | 
				
			||||||
                } else if (offset + sizeof(float) <= sizeof(*this) && reinterpret_cast<float*>(p + offset) == reinterpret_cast<float*>(this) + offset / sizeof(float)) {
 | 
					 | 
				
			||||||
                    // 如果当前偏移量适用于 float 类型,则将其设置为 0.0
 | 
					 | 
				
			||||||
                    *reinterpret_cast<float*>(p + offset) = 0.0f;
 | 
					 | 
				
			||||||
                    offset += sizeof(float);
 | 
					 | 
				
			||||||
                } else {
 | 
					 | 
				
			||||||
                    // 处理未定义的情况(例如混合类型数组或其他类型成员)
 | 
					 | 
				
			||||||
                    // 可以根据实际情况调整逻辑或添加更多类型检查
 | 
					 | 
				
			||||||
                    offset += 1; // 跳过一个字节
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} cameraMoveState;
 | 
						} cameraMoveState;
 | 
				
			||||||
| 
						 | 
					@ -560,32 +385,6 @@ namespace GKCamera {
 | 
				
			||||||
				if (cameraMoveState.k) ChangeLiveFollowCameraOffsetY(-offsetMoveStep);
 | 
									if (cameraMoveState.k) ChangeLiveFollowCameraOffsetY(-offsetMoveStep);
 | 
				
			||||||
				if (cameraMoveState.j) ChangeLiveFollowCameraOffsetX(0.8);
 | 
									if (cameraMoveState.j) ChangeLiveFollowCameraOffsetX(0.8);
 | 
				
			||||||
				if (cameraMoveState.l) ChangeLiveFollowCameraOffsetX(-0.8);
 | 
									if (cameraMoveState.l) ChangeLiveFollowCameraOffsetX(-0.8);
 | 
				
			||||||
                // 手柄操作响应
 | 
					 | 
				
			||||||
                // 左摇杆
 | 
					 | 
				
			||||||
                if (std::abs(cameraMoveState.thumb_l_right) > 0.1f)
 | 
					 | 
				
			||||||
                    JLThumbRight(cameraMoveState.thumb_l_right);
 | 
					 | 
				
			||||||
                if (std::abs(cameraMoveState.thumb_l_down) > 0.1f)
 | 
					 | 
				
			||||||
                    JLThumbDown(cameraMoveState.thumb_l_down);
 | 
					 | 
				
			||||||
                // 右摇杆
 | 
					 | 
				
			||||||
                if (std::abs(cameraMoveState.thumb_r_right) > 0.1f)
 | 
					 | 
				
			||||||
                    JRThumbRight(cameraMoveState.thumb_r_right);
 | 
					 | 
				
			||||||
                if (std::abs(cameraMoveState.thumb_r_down) > 0.1f)
 | 
					 | 
				
			||||||
                    JRThumbDown(cameraMoveState.thumb_r_down);
 | 
					 | 
				
			||||||
                // 左扳机
 | 
					 | 
				
			||||||
                if (std::abs(cameraMoveState.lt_button) > 0.1f)
 | 
					 | 
				
			||||||
                    camera_down(cameraMoveState.lt_button * l_sensitivity * baseCamera.fov / 60);
 | 
					 | 
				
			||||||
                // 右扳机
 | 
					 | 
				
			||||||
                if (std::abs(cameraMoveState.rt_button) > 0.1f)
 | 
					 | 
				
			||||||
                    camera_up(cameraMoveState.rt_button * l_sensitivity * baseCamera.fov / 60);
 | 
					 | 
				
			||||||
                // 左肩键
 | 
					 | 
				
			||||||
                if (cameraMoveState.lb_button) changeCameraFOV(0.5f * r_sensitivity);
 | 
					 | 
				
			||||||
                // 右肩键
 | 
					 | 
				
			||||||
                if (cameraMoveState.rb_button) changeCameraFOV(-0.5f * r_sensitivity);
 | 
					 | 
				
			||||||
                // 十字键
 | 
					 | 
				
			||||||
                if (cameraMoveState.dpad_up) JDadUp();
 | 
					 | 
				
			||||||
//                if (cameraMoveState.dpad_down) JDadDown();
 | 
					 | 
				
			||||||
                if (cameraMoveState.dpad_left) JDadLeft();
 | 
					 | 
				
			||||||
                if (cameraMoveState.dpad_right) JDadRight();
 | 
					 | 
				
			||||||
                std::this_thread::sleep_for(std::chrono::milliseconds(10));
 | 
					                std::this_thread::sleep_for(std::chrono::milliseconds(10));
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			}).detach();
 | 
								}).detach();
 | 
				
			||||||
| 
						 | 
					@ -647,88 +446,11 @@ namespace GKCamera {
 | 
				
			||||||
			} break;
 | 
								} break;
 | 
				
			||||||
            case KEY_F: if (message == WM_KEYDOWN) SwitchCameraMode(); break;
 | 
					            case KEY_F: if (message == WM_KEYDOWN) SwitchCameraMode(); break;
 | 
				
			||||||
            case KEY_V: if (message == WM_KEYDOWN) SwitchCameraSubMode(); break;
 | 
					            case KEY_V: if (message == WM_KEYDOWN) SwitchCameraSubMode(); break;
 | 
				
			||||||
                // 手柄操作响应
 | 
					 | 
				
			||||||
                case BTN_A:
 | 
					 | 
				
			||||||
                    cameraMoveState.a_button = message == WM_KEYDOWN;
 | 
					 | 
				
			||||||
                    if (message == WM_KEYDOWN) JAKeyDown();
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
                case BTN_B:
 | 
					 | 
				
			||||||
                    cameraMoveState.b_button = message == WM_KEYDOWN;
 | 
					 | 
				
			||||||
                    if (message == WM_KEYDOWN) JBKeyDown();
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
                case BTN_X:
 | 
					 | 
				
			||||||
                    cameraMoveState.x_button = message == WM_KEYDOWN;
 | 
					 | 
				
			||||||
                    if (message == WM_KEYDOWN) JXKeyDown();
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
                case BTN_Y:
 | 
					 | 
				
			||||||
                    cameraMoveState.y_button = message == WM_KEYDOWN;
 | 
					 | 
				
			||||||
                    if (message == WM_KEYDOWN) JYKeyDown();
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
                case BTN_LB:
 | 
					 | 
				
			||||||
                    cameraMoveState.lb_button = message == WM_KEYDOWN;
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
                case BTN_RB:
 | 
					 | 
				
			||||||
                    cameraMoveState.rb_button = message == WM_KEYDOWN;
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
                case BTN_THUMBL:
 | 
					 | 
				
			||||||
                    cameraMoveState.thumb_l_button = message == WM_KEYDOWN;
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
                case BTN_THUMBR:
 | 
					 | 
				
			||||||
                    cameraMoveState.thumb_r_button = message == WM_KEYDOWN;
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
                case BTN_SELECT:
 | 
					 | 
				
			||||||
                    cameraMoveState.select_button = message == WM_KEYDOWN;
 | 
					 | 
				
			||||||
                    if (message == WM_KEYDOWN) JSelectKeyDown();
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
                case BTN_START:
 | 
					 | 
				
			||||||
                    cameraMoveState.start_button = message == WM_KEYDOWN;
 | 
					 | 
				
			||||||
                    if (message == WM_KEYDOWN) JStartKeyDown();
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
                case BTN_SHARE:
 | 
					 | 
				
			||||||
                    cameraMoveState.share_button = message == WM_KEYDOWN;
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
                case BTN_XBOX:
 | 
					 | 
				
			||||||
                    cameraMoveState.xbox_button = message == WM_KEYDOWN;
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			default: break;
 | 
								default: break;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void
 | 
					 | 
				
			||||||
    on_cam_rawinput_joystick(JoystickEvent event) {
 | 
					 | 
				
			||||||
        int message = event.getMessage();
 | 
					 | 
				
			||||||
        float leftStickX = event.getLeftStickX();
 | 
					 | 
				
			||||||
        float leftStickY = event.getLeftStickY();
 | 
					 | 
				
			||||||
        float rightStickX = event.getRightStickX();
 | 
					 | 
				
			||||||
        float rightStickY = event.getRightStickY();
 | 
					 | 
				
			||||||
        float leftTrigger = event.getLeftTrigger();
 | 
					 | 
				
			||||||
        float rightTrigger = event.getRightTrigger();
 | 
					 | 
				
			||||||
        float hatX = event.getHatX();
 | 
					 | 
				
			||||||
        float hatY = event.getHatY();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        cameraMoveState.thumb_l_right = (std::abs(leftStickX) > 0.1f) ? leftStickX : 0;
 | 
					 | 
				
			||||||
        cameraMoveState.thumb_l_down = (std::abs(leftStickY) > 0.1f) ? leftStickY : 0;
 | 
					 | 
				
			||||||
        cameraMoveState.thumb_r_right = (std::abs(rightStickX) > 0.1f) ? rightStickX : 0;
 | 
					 | 
				
			||||||
        cameraMoveState.thumb_r_down = (std::abs(rightStickY) > 0.1f) ? rightStickY : 0;
 | 
					 | 
				
			||||||
        cameraMoveState.lt_button = (std::abs(leftTrigger) > 0.1f) ? leftTrigger : 0;
 | 
					 | 
				
			||||||
        cameraMoveState.rt_button = (std::abs(rightTrigger) > 0.1f) ? rightTrigger : 0;
 | 
					 | 
				
			||||||
        cameraMoveState.dpad_up = hatY == -1.0f;
 | 
					 | 
				
			||||||
        cameraMoveState.dpad_down = hatY == 1.0f;
 | 
					 | 
				
			||||||
        cameraMoveState.dpad_left = hatX == -1.0f;
 | 
					 | 
				
			||||||
        cameraMoveState.dpad_right = hatX == 1.0f;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (cameraMoveState.dpad_down) {
 | 
					 | 
				
			||||||
            JDadDown();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//        GakumasLocal::Log::InfoFmt(
 | 
					 | 
				
			||||||
//                "Motion event: action=%d, leftStickX=%.2f, leftStickY=%.2f, rightStickX=%.2f, rightStickY=%.2f, leftTrigger=%.2f, rightTrigger=%.2f, hatX=%.2f, hatY=%.2f",
 | 
					 | 
				
			||||||
//                message, leftStickX, leftStickY, rightStickX, rightStickY, leftTrigger,
 | 
					 | 
				
			||||||
//                rightTrigger, hatX, hatY);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	void initCameraSettings() {
 | 
						void initCameraSettings() {
 | 
				
			||||||
		reset_camera();
 | 
							reset_camera();
 | 
				
			||||||
		cameraRawInputThread();
 | 
							cameraRawInputThread();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,5 @@
 | 
				
			||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
#include "baseCamera.hpp"
 | 
					#include "baseCamera.hpp"
 | 
				
			||||||
#include "Joystick/JoystickEvent.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace GKCamera {
 | 
					namespace GKCamera {
 | 
				
			||||||
    enum class CameraMode {
 | 
					    enum class CameraMode {
 | 
				
			||||||
| 
						 | 
					@ -45,6 +44,5 @@ namespace GKCamera {
 | 
				
			||||||
                                                          const bool recordY = false);
 | 
					                                                          const bool recordY = false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void on_cam_rawinput_keyboard(int message, int key);
 | 
					    void on_cam_rawinput_keyboard(int message, int key);
 | 
				
			||||||
    void on_cam_rawinput_joystick(JoystickEvent event);
 | 
					 | 
				
			||||||
	void initCameraSettings();
 | 
						void initCameraSettings();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,67 +0,0 @@
 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Created by RanKaeder on 2024/6/18.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef GAKUMAS_LOCALIFY_JOYSTICKEVENT_H
 | 
					 | 
				
			||||||
#define GAKUMAS_LOCALIFY_JOYSTICKEVENT_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class JoystickEvent {
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    JoystickEvent(int message, float leftStickX, float leftStickY, float rightStickX,
 | 
					 | 
				
			||||||
                  float rightStickY, float leftTrigger, float rightTrigger,
 | 
					 | 
				
			||||||
                  float hatX, float hatY)
 | 
					 | 
				
			||||||
            : message(message), leftStickX(leftStickX), leftStickY(leftStickY),
 | 
					 | 
				
			||||||
              rightStickX(rightStickX), rightStickY(rightStickY), leftTrigger(leftTrigger),
 | 
					 | 
				
			||||||
              rightTrigger(rightTrigger), hatX(hatX), hatY(hatY) {
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Getter 方法
 | 
					 | 
				
			||||||
    int getMessage() const {
 | 
					 | 
				
			||||||
        return message;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    float getLeftStickX() const {
 | 
					 | 
				
			||||||
        return leftStickX;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    float getLeftStickY() const {
 | 
					 | 
				
			||||||
        return leftStickY;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    float getRightStickX() const {
 | 
					 | 
				
			||||||
        return rightStickX;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    float getRightStickY() const {
 | 
					 | 
				
			||||||
        return rightStickY;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    float getLeftTrigger() const {
 | 
					 | 
				
			||||||
        return leftTrigger;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    float getRightTrigger() const {
 | 
					 | 
				
			||||||
        return rightTrigger;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    float getHatX() const {
 | 
					 | 
				
			||||||
        return hatX;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    float getHatY() const {
 | 
					 | 
				
			||||||
        return hatY;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    int message;
 | 
					 | 
				
			||||||
    float leftStickX;
 | 
					 | 
				
			||||||
    float leftStickY;
 | 
					 | 
				
			||||||
    float rightStickX;
 | 
					 | 
				
			||||||
    float rightStickY;
 | 
					 | 
				
			||||||
    float leftTrigger;
 | 
					 | 
				
			||||||
    float rightTrigger;
 | 
					 | 
				
			||||||
    float hatX;
 | 
					 | 
				
			||||||
    float hatY;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif //GAKUMAS_LOCALIFY_JOYSTICKEVENT_H
 | 
					 | 
				
			||||||
| 
						 | 
					@ -9,7 +9,6 @@
 | 
				
			||||||
#include "xdl.h"
 | 
					#include "xdl.h"
 | 
				
			||||||
#include "GakumasLocalify/camera/camera.hpp"
 | 
					#include "GakumasLocalify/camera/camera.hpp"
 | 
				
			||||||
#include "GakumasLocalify/config/Config.hpp"
 | 
					#include "GakumasLocalify/config/Config.hpp"
 | 
				
			||||||
#include "Joystick/JoystickEvent.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
JavaVM* g_javaVM = nullptr;
 | 
					JavaVM* g_javaVM = nullptr;
 | 
				
			||||||
jclass g_gakumasHookMainClass = nullptr;
 | 
					jclass g_gakumasHookMainClass = nullptr;
 | 
				
			||||||
| 
						 | 
					@ -88,22 +87,6 @@ Java_io_github_chinosk_gakumas_localify_GakumasHookMain_keyboardEvent(JNIEnv *en
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern "C"
 | 
					 | 
				
			||||||
JNIEXPORT void JNICALL
 | 
					 | 
				
			||||||
Java_io_github_chinosk_gakumas_localify_GakumasHookMain_joystickEvent(JNIEnv *env, jclass clazz,
 | 
					 | 
				
			||||||
                                                                      jint action,
 | 
					 | 
				
			||||||
                                                                      jfloat leftStickX,
 | 
					 | 
				
			||||||
                                                                      jfloat leftStickY,
 | 
					 | 
				
			||||||
                                                                      jfloat rightStickX,
 | 
					 | 
				
			||||||
                                                                      jfloat rightStickY,
 | 
					 | 
				
			||||||
                                                                      jfloat leftTrigger,
 | 
					 | 
				
			||||||
                                                                      jfloat rightTrigger,
 | 
					 | 
				
			||||||
                                                                      jfloat hatX,
 | 
					 | 
				
			||||||
                                                                      jfloat hatY) {
 | 
					 | 
				
			||||||
    JoystickEvent event(action, leftStickX, leftStickY, rightStickX, rightStickY, leftTrigger, rightTrigger, hatX, hatY);
 | 
					 | 
				
			||||||
    GKCamera::on_cam_rawinput_joystick(event);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern "C"
 | 
					extern "C"
 | 
				
			||||||
JNIEXPORT void JNICALL
 | 
					JNIEXPORT void JNICALL
 | 
				
			||||||
Java_io_github_chinosk_gakumas_localify_GakumasHookMain_loadConfig(JNIEnv *env, jclass clazz,
 | 
					Java_io_github_chinosk_gakumas_localify_GakumasHookMain_loadConfig(JNIEnv *env, jclass clazz,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,7 +20,6 @@ import de.robv.android.xposed.XposedHelpers
 | 
				
			||||||
import de.robv.android.xposed.callbacks.XC_LoadPackage
 | 
					import de.robv.android.xposed.callbacks.XC_LoadPackage
 | 
				
			||||||
import io.github.chinosk.gakumas.localify.hookUtils.FilesChecker
 | 
					import io.github.chinosk.gakumas.localify.hookUtils.FilesChecker
 | 
				
			||||||
import android.view.KeyEvent
 | 
					import android.view.KeyEvent
 | 
				
			||||||
import android.view.MotionEvent
 | 
					 | 
				
			||||||
import android.widget.Toast
 | 
					import android.widget.Toast
 | 
				
			||||||
import com.google.gson.Gson
 | 
					import com.google.gson.Gson
 | 
				
			||||||
import de.robv.android.xposed.XposedBridge
 | 
					import de.robv.android.xposed.XposedBridge
 | 
				
			||||||
| 
						 | 
					@ -62,50 +61,6 @@ class GakumasHookMain : IXposedHookLoadPackage, IXposedHookZygoteInit {
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        XposedHelpers.findAndHookMethod(
 | 
					 | 
				
			||||||
            "android.app.Activity",
 | 
					 | 
				
			||||||
            lpparam.classLoader,
 | 
					 | 
				
			||||||
            "dispatchGenericMotionEvent",
 | 
					 | 
				
			||||||
            MotionEvent::class.java,
 | 
					 | 
				
			||||||
            object : XC_MethodHook() {
 | 
					 | 
				
			||||||
                override fun beforeHookedMethod(param: MethodHookParam) {
 | 
					 | 
				
			||||||
                    val motionEvent = param.args[0] as MotionEvent
 | 
					 | 
				
			||||||
                    val action = motionEvent.action
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    // 左摇杆的X和Y轴
 | 
					 | 
				
			||||||
                    val leftStickX = motionEvent.getAxisValue(MotionEvent.AXIS_X)
 | 
					 | 
				
			||||||
                    val leftStickY = motionEvent.getAxisValue(MotionEvent.AXIS_Y)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    // 右摇杆的X和Y轴
 | 
					 | 
				
			||||||
                    val rightStickX = motionEvent.getAxisValue(MotionEvent.AXIS_Z)
 | 
					 | 
				
			||||||
                    val rightStickY = motionEvent.getAxisValue(MotionEvent.AXIS_RZ)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    // 左扳机
 | 
					 | 
				
			||||||
                    val leftTrigger = motionEvent.getAxisValue(MotionEvent.AXIS_LTRIGGER)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    // 右扳机
 | 
					 | 
				
			||||||
                    val rightTrigger = motionEvent.getAxisValue(MotionEvent.AXIS_RTRIGGER)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    // 十字键
 | 
					 | 
				
			||||||
                    val hatX = motionEvent.getAxisValue(MotionEvent.AXIS_HAT_X)
 | 
					 | 
				
			||||||
                    val hatY = motionEvent.getAxisValue(MotionEvent.AXIS_HAT_Y)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    // 处理摇杆和扳机事件
 | 
					 | 
				
			||||||
                    joystickEvent(
 | 
					 | 
				
			||||||
                        action,
 | 
					 | 
				
			||||||
                        leftStickX,
 | 
					 | 
				
			||||||
                        leftStickY,
 | 
					 | 
				
			||||||
                        rightStickX,
 | 
					 | 
				
			||||||
                        rightStickY,
 | 
					 | 
				
			||||||
                        leftTrigger,
 | 
					 | 
				
			||||||
                        rightTrigger,
 | 
					 | 
				
			||||||
                        hatX,
 | 
					 | 
				
			||||||
                        hatY
 | 
					 | 
				
			||||||
                    )
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        val appActivityClass = XposedHelpers.findClass("android.app.Activity", lpparam.classLoader)
 | 
					        val appActivityClass = XposedHelpers.findClass("android.app.Activity", lpparam.classLoader)
 | 
				
			||||||
        XposedBridge.hookAllMethods(appActivityClass, "onStart", object : XC_MethodHook() {
 | 
					        XposedBridge.hookAllMethods(appActivityClass, "onStart", object : XC_MethodHook() {
 | 
				
			||||||
            override fun beforeHookedMethod(param: MethodHookParam) {
 | 
					            override fun beforeHookedMethod(param: MethodHookParam) {
 | 
				
			||||||
| 
						 | 
					@ -301,23 +256,8 @@ class GakumasHookMain : IXposedHookLoadPackage, IXposedHookZygoteInit {
 | 
				
			||||||
        @JvmStatic
 | 
					        @JvmStatic
 | 
				
			||||||
        external fun keyboardEvent(keyCode: Int, action: Int)
 | 
					        external fun keyboardEvent(keyCode: Int, action: Int)
 | 
				
			||||||
        @JvmStatic
 | 
					        @JvmStatic
 | 
				
			||||||
        external fun joystickEvent(
 | 
					 | 
				
			||||||
            action: Int,
 | 
					 | 
				
			||||||
            leftStickX: Float,
 | 
					 | 
				
			||||||
            leftStickY: Float,
 | 
					 | 
				
			||||||
            rightStickX: Float,
 | 
					 | 
				
			||||||
            rightStickY: Float,
 | 
					 | 
				
			||||||
            leftTrigger: Float,
 | 
					 | 
				
			||||||
            rightTrigger: Float,
 | 
					 | 
				
			||||||
            hatX: Float,
 | 
					 | 
				
			||||||
            hatY: Float
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
        @JvmStatic
 | 
					 | 
				
			||||||
        external fun loadConfig(configJsonStr: String)
 | 
					        external fun loadConfig(configJsonStr: String)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Toast快速切换内容
 | 
					 | 
				
			||||||
        private var toast: Toast? = null
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        @JvmStatic
 | 
					        @JvmStatic
 | 
				
			||||||
        fun showToast(message: String) {
 | 
					        fun showToast(message: String) {
 | 
				
			||||||
            val app = AndroidAppHelper.currentApplication()
 | 
					            val app = AndroidAppHelper.currentApplication()
 | 
				
			||||||
| 
						 | 
					@ -325,12 +265,7 @@ class GakumasHookMain : IXposedHookLoadPackage, IXposedHookZygoteInit {
 | 
				
			||||||
            if (context != null) {
 | 
					            if (context != null) {
 | 
				
			||||||
                val handler = Handler(Looper.getMainLooper())
 | 
					                val handler = Handler(Looper.getMainLooper())
 | 
				
			||||||
                handler.post {
 | 
					                handler.post {
 | 
				
			||||||
                    // 取消之前的 Toast
 | 
					                    Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
 | 
				
			||||||
                    toast?.cancel()
 | 
					 | 
				
			||||||
                    // 创建新的 Toast
 | 
					 | 
				
			||||||
                    toast = Toast.makeText(context, message, Toast.LENGTH_SHORT)
 | 
					 | 
				
			||||||
                    // 展示新的 Toast
 | 
					 | 
				
			||||||
                    toast?.show()
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else {
 | 
					            else {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue