forked from chinosk/gkms-local
增加Toast提醒,优化手柄控制
This commit is contained in:
parent
7345a4bbe6
commit
b5b433beb5
|
@ -100,4 +100,30 @@ 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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ namespace GKCamera {
|
||||||
int followCharaIndex = 0;
|
int followCharaIndex = 0;
|
||||||
float l_sensitivity = 0.5f;
|
float l_sensitivity = 0.5f;
|
||||||
float r_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;
|
||||||
|
@ -251,6 +252,142 @@ 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("重置镜头");
|
||||||
|
}
|
||||||
|
|
||||||
|
void JDadDown(){
|
||||||
|
ShowToast("关闭通知,再次点击开启");
|
||||||
|
showToast = !showToast;
|
||||||
|
}
|
||||||
|
|
||||||
|
void JDadLeft(){
|
||||||
|
l_sensitivity = 1.0f;
|
||||||
|
ShowToast("重置移动灵敏度");
|
||||||
|
}
|
||||||
|
|
||||||
|
void JDadRight(){
|
||||||
|
r_sensitivity = 1.0f;
|
||||||
|
ShowToast("重置镜头灵敏度");
|
||||||
|
}
|
||||||
|
|
||||||
|
void JAKeyDown() {
|
||||||
|
if (cameraMode == CameraMode::FOLLOW) {
|
||||||
|
const auto currPart = bodyPartsEnum.Next();
|
||||||
|
if (showToast) {
|
||||||
|
GakumasLocal::Log::ShowToastFmt("看向:%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("看向:%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("注视:%d", followCharaIndex);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
l_sensitivity *= 0.8f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JYKeyDown() {
|
||||||
|
if (cameraMode == CameraMode::FOLLOW) {
|
||||||
|
OnRightDown();
|
||||||
|
if (showToast) {
|
||||||
|
GakumasLocal::Log::ShowToastFmt("注视:%d", followCharaIndex);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
l_sensitivity *= 1.2f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JSelectKeyDown() {
|
||||||
|
switch (cameraMode) {
|
||||||
|
case CameraMode::FREE: {
|
||||||
|
cameraMode = CameraMode::FOLLOW;
|
||||||
|
ShowToast("跟随模式");
|
||||||
|
} break;
|
||||||
|
case CameraMode::FOLLOW: {
|
||||||
|
cameraMode = CameraMode::FIRST_PERSON;
|
||||||
|
ShowToast("第一人称模式");
|
||||||
|
} break;
|
||||||
|
case CameraMode::FIRST_PERSON: {
|
||||||
|
cameraMode = CameraMode::FREE;
|
||||||
|
ShowToast("无人机模式");
|
||||||
|
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JStartKeyDown() {
|
||||||
|
switch (cameraMode) {
|
||||||
|
case CameraMode::FIRST_PERSON: {
|
||||||
|
if (firstPersonRoll == FirstPersonRoll::ENABLE_ROLL) {
|
||||||
|
firstPersonRoll = FirstPersonRoll::DISABLE_ROLL;
|
||||||
|
ShowToast("镜头水平固定");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
firstPersonRoll = FirstPersonRoll::ENABLE_ROLL;
|
||||||
|
ShowToast("镜头水平摇动");
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case CameraMode::FOLLOW: {
|
||||||
|
if (followModeY == FollowModeY::APPLY_Y) {
|
||||||
|
followModeY = FollowModeY::SMOOTH_Y;
|
||||||
|
ShowToast("平滑升降");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
followModeY = FollowModeY::APPLY_Y;
|
||||||
|
ShowToast("即时升降");
|
||||||
|
}
|
||||||
|
} 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角度
|
||||||
|
@ -423,24 +560,32 @@ 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)
|
if (std::abs(cameraMoveState.thumb_l_right) > 0.1f)
|
||||||
camera_right(cameraMoveState.thumb_l_right * l_sensitivity);
|
JLThumbRight(cameraMoveState.thumb_l_right);
|
||||||
if (std::abs(cameraMoveState.thumb_l_down) > 0.1f)
|
if (std::abs(cameraMoveState.thumb_l_down) > 0.1f)
|
||||||
camera_back(cameraMoveState.thumb_l_down * l_sensitivity);
|
JLThumbDown(cameraMoveState.thumb_l_down);
|
||||||
|
// 右摇杆
|
||||||
if (std::abs(cameraMoveState.thumb_r_right) > 0.1f)
|
if (std::abs(cameraMoveState.thumb_r_right) > 0.1f)
|
||||||
cameraLookat_right(cameraMoveState.thumb_r_right * r_sensitivity);
|
JRThumbRight(cameraMoveState.thumb_r_right);
|
||||||
if (std::abs(cameraMoveState.thumb_r_down) > 0.1f)
|
if (std::abs(cameraMoveState.thumb_r_down) > 0.1f)
|
||||||
cameraLookat_down(cameraMoveState.thumb_r_down * r_sensitivity);
|
JRThumbDown(cameraMoveState.thumb_r_down);
|
||||||
|
// 左扳机
|
||||||
if (std::abs(cameraMoveState.lt_button) > 0.1f)
|
if (std::abs(cameraMoveState.lt_button) > 0.1f)
|
||||||
camera_down(cameraMoveState.lt_button * 0.5f);
|
camera_down(cameraMoveState.lt_button * l_sensitivity * baseCamera.fov / 60);
|
||||||
|
// 右扳机
|
||||||
if (std::abs(cameraMoveState.rt_button) > 0.1f)
|
if (std::abs(cameraMoveState.rt_button) > 0.1f)
|
||||||
camera_up(cameraMoveState.rt_button * 0.5f);
|
camera_up(cameraMoveState.rt_button * l_sensitivity * baseCamera.fov / 60);
|
||||||
if (cameraMoveState.dpad_up) ChangeLiveFollowCameraOffsetY(offsetMoveStep);
|
// 左肩键
|
||||||
if (cameraMoveState.dpad_down) ChangeLiveFollowCameraOffsetY(-offsetMoveStep);
|
if (cameraMoveState.lb_button) changeCameraFOV(0.5f * r_sensitivity);
|
||||||
if (cameraMoveState.dpad_left) ChangeLiveFollowCameraOffsetX(offsetMoveStep);
|
// 右肩键
|
||||||
if (cameraMoveState.dpad_right) ChangeLiveFollowCameraOffsetX(-offsetMoveStep);
|
if (cameraMoveState.rb_button) changeCameraFOV(-0.5f * r_sensitivity);
|
||||||
if (cameraMoveState.lb_button) changeCameraFOV(0.5f);
|
// 十字键
|
||||||
if (cameraMoveState.rb_button) changeCameraFOV(-0.5f);
|
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();
|
||||||
|
@ -502,21 +647,22 @@ 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:
|
case BTN_A:
|
||||||
cameraMoveState.a_button = message == WM_KEYDOWN;
|
cameraMoveState.a_button = message == WM_KEYDOWN;
|
||||||
if (message == WM_KEYDOWN) r_sensitivity *= 0.8f;
|
if (message == WM_KEYDOWN) JAKeyDown();
|
||||||
break;
|
break;
|
||||||
case BTN_B:
|
case BTN_B:
|
||||||
cameraMoveState.b_button = message == WM_KEYDOWN;
|
cameraMoveState.b_button = message == WM_KEYDOWN;
|
||||||
if (message == WM_KEYDOWN) r_sensitivity *= 1.2f;
|
if (message == WM_KEYDOWN) JBKeyDown();
|
||||||
break;
|
break;
|
||||||
case BTN_X:
|
case BTN_X:
|
||||||
cameraMoveState.x_button = message == WM_KEYDOWN;
|
cameraMoveState.x_button = message == WM_KEYDOWN;
|
||||||
if (message == WM_KEYDOWN) l_sensitivity *= 0.8f;
|
if (message == WM_KEYDOWN) JXKeyDown();
|
||||||
break;
|
break;
|
||||||
case BTN_Y:
|
case BTN_Y:
|
||||||
cameraMoveState.y_button = message == WM_KEYDOWN;
|
cameraMoveState.y_button = message == WM_KEYDOWN;
|
||||||
if (message == WM_KEYDOWN) l_sensitivity *= 1.2f;
|
if (message == WM_KEYDOWN) JYKeyDown();
|
||||||
break;
|
break;
|
||||||
case BTN_LB:
|
case BTN_LB:
|
||||||
cameraMoveState.lb_button = message == WM_KEYDOWN;
|
cameraMoveState.lb_button = message == WM_KEYDOWN;
|
||||||
|
@ -526,22 +672,17 @@ namespace GKCamera {
|
||||||
break;
|
break;
|
||||||
case BTN_THUMBL:
|
case BTN_THUMBL:
|
||||||
cameraMoveState.thumb_l_button = message == WM_KEYDOWN;
|
cameraMoveState.thumb_l_button = message == WM_KEYDOWN;
|
||||||
if (message == WM_KEYDOWN) reset_camera();
|
|
||||||
break;
|
break;
|
||||||
case BTN_THUMBR:
|
case BTN_THUMBR:
|
||||||
cameraMoveState.thumb_r_button = message == WM_KEYDOWN;
|
cameraMoveState.thumb_r_button = message == WM_KEYDOWN;
|
||||||
if (message == WM_KEYDOWN) {
|
|
||||||
l_sensitivity = 1.0f;
|
|
||||||
r_sensitivity = 1.0f;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case BTN_SELECT:
|
case BTN_SELECT:
|
||||||
cameraMoveState.select_button = message == WM_KEYDOWN;
|
cameraMoveState.select_button = message == WM_KEYDOWN;
|
||||||
if (message == WM_KEYDOWN) SwitchCameraMode();
|
if (message == WM_KEYDOWN) JSelectKeyDown();
|
||||||
break;
|
break;
|
||||||
case BTN_START:
|
case BTN_START:
|
||||||
cameraMoveState.start_button = message == WM_KEYDOWN;
|
cameraMoveState.start_button = message == WM_KEYDOWN;
|
||||||
if (message == WM_KEYDOWN) SwitchCameraSubMode();
|
if (message == WM_KEYDOWN) JStartKeyDown();
|
||||||
break;
|
break;
|
||||||
case BTN_SHARE:
|
case BTN_SHARE:
|
||||||
cameraMoveState.share_button = message == WM_KEYDOWN;
|
cameraMoveState.share_button = message == WM_KEYDOWN;
|
||||||
|
@ -578,16 +719,8 @@ namespace GKCamera {
|
||||||
cameraMoveState.dpad_left = hatX == -1.0f;
|
cameraMoveState.dpad_left = hatX == -1.0f;
|
||||||
cameraMoveState.dpad_right = hatX == 1.0f;
|
cameraMoveState.dpad_right = hatX == 1.0f;
|
||||||
|
|
||||||
if (rightStickX == 1.0f) {
|
if (cameraMoveState.dpad_down) {
|
||||||
OnRightDown();
|
JDadDown();
|
||||||
} else if (rightStickX == -1.0f) {
|
|
||||||
OnLeftDown();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rightStickY == 1.0f) {
|
|
||||||
OnDownDown();
|
|
||||||
} else if (rightStickY == -1.0f) {
|
|
||||||
OnUpDown();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GakumasLocal::Log::InfoFmt(
|
// GakumasLocal::Log::InfoFmt(
|
||||||
|
|
|
@ -315,6 +315,9 @@ class GakumasHookMain : IXposedHookLoadPackage, IXposedHookZygoteInit {
|
||||||
@JvmStatic
|
@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()
|
||||||
|
@ -322,7 +325,12 @@ 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.makeText(context, message, Toast.LENGTH_SHORT).show()
|
// 取消之前的 Toast
|
||||||
|
toast?.cancel()
|
||||||
|
// 创建新的 Toast
|
||||||
|
toast = Toast.makeText(context, message, Toast.LENGTH_SHORT)
|
||||||
|
// 展示新的 Toast
|
||||||
|
toast?.show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
Loading…
Reference in New Issue