JS 脚本: BUG修复和添加问题反馈地址 (#1112)

This commit is contained in:
ftnfurina
2025-06-16 15:48:30 +08:00
committed by GitHub
parent 41628fda31
commit de43b8c3a8
7 changed files with 71 additions and 49 deletions

View File

@@ -4,3 +4,7 @@
1. 修改自定义配置,将好友的 UID 添加到配置中
2. 执行脚本即可
## 问题反馈
[GitHub issues](https://github.com/ftnfurina/bettergi-js-repo/issues)

View File

@@ -1,22 +1,28 @@
// src/index.ts
function autoZoomOcr(x, y, w, h) {
const ratio = genshin.scaleTo1080PRatio;
return RecognitionObject.ocr(x * ratio, y * ratio, w * ratio, h * ratio);
}
function createTimer(timeout) {
let time = Date.now();
return Object.freeze({
reStart() {
time = Date.now();
},
isTimeout() {
return Date.now() - time >= timeout;
}
});
}
// 等待好友确认超时时间 25s
const WAIT_FRIEND_CONFIRM_TIMEOUT = 25 * 1000;
/**
* 创建自适应 16:9 缩放的 OCR 对象
* @param x X 坐标
* @param y Y 坐标
* @param w 宽度
* @param h 高度
*/
function createAutoZoomOcr(x, y, w, h) {
const ratio = genshin.scaleTo1080PRatio;
return RecognitionObject.ocr(x * ratio, y * ratio, w * ratio, h * ratio);
}
/**
* 是否在多人游戏中
*/
function inMultiplayerGame() {
const gameRegion = captureGameRegion();
const playerCountRegin = gameRegion.find(createAutoZoomOcr(340, 18, 53, 53));
const playerCountRegin = gameRegion.find(autoZoomOcr(340, 18, 53, 53));
const playerCountText = playerCountRegin.text.trim().toLocaleLowerCase();
return playerCountText.includes('p');
}
@@ -26,10 +32,10 @@ function inMultiplayerGame() {
if (!uid) {
throw new Error('UID 不能为空');
}
await genshin.returnMainUi();
if (inMultiplayerGame()) {
throw new Error('正在多人游戏中,无法加入好友世界');
}
await genshin.returnMainUi();
log.info(`尝试加入好友世界(UID: ${uid})`);
// 打开好友列表
keyPress('VK_O');
@@ -44,20 +50,20 @@ function inMultiplayerGame() {
await sleep(500);
const gameRegion = captureGameRegion();
// 尝试找到用户卡片的冒险等阶
const levelRegin = gameRegion.find(createAutoZoomOcr(425, 445, 106, 37));
const levelRegin = gameRegion.find(autoZoomOcr(425, 445, 106, 37));
const levelText = levelRegin.text.trim();
if (!levelText.includes('冒险等阶')) {
// 判断是否搜索的用户是否是自己
const yourselfRegin = gameRegion.find(createAutoZoomOcr(660, 495, 601, 88));
const yourselfRegin = gameRegion.find(autoZoomOcr(660, 495, 601, 88));
if (yourselfRegin.text.includes('其他玩家')) {
throw new Error('不能使用自己的UID');
}
throw new Error('UID不存在');
}
const joinOrAddRegin = gameRegion.find(createAutoZoomOcr(1160, 800, 200, 54));
const joinOrAddRegin = gameRegion.find(autoZoomOcr(1160, 800, 200, 54));
const joinOrAddText = joinOrAddRegin.text.trim();
if (joinOrAddText === '') {
throw new Error("你的好友不在线");
throw new Error('你的好友不在线');
}
else if (joinOrAddText === '申请加入') {
log.info(`已经发起加入申请,等待好友同意`);
@@ -66,12 +72,11 @@ function inMultiplayerGame() {
else {
throw new Error('TA不是你的好友');
}
const startTime = new Date().getTime();
const timeout = WAIT_FRIEND_CONFIRM_TIMEOUT + startTime;
const timer = createTimer(WAIT_FRIEND_CONFIRM_TIMEOUT);
while (true) {
// 等待好友回复
const gameRegion = captureGameRegion();
const requestRegin = gameRegion.find(createAutoZoomOcr(725, 195, 465, 45));
const requestRegin = gameRegion.find(autoZoomOcr(725, 195, 465, 45));
const requestText = requestRegin.text.trim();
if (requestText.endsWith('拒绝了多人游戏申请')) {
throw new Error('好友拒绝了多人游戏');
@@ -80,7 +85,7 @@ function inMultiplayerGame() {
log.info('成功加入好友世界');
break;
}
if (new Date().getTime() > timeout) {
if (timer.isTimeout()) {
throw new Error('请求超时');
}
await sleep(50);

View File

@@ -2,7 +2,7 @@
"manifest_version": 1,
"name": "加入好友的世界",
"description": "快让我访问!",
"version": "0.0.1",
"version": "0.0.2",
"main": "index.js",
"settings_ui": "settings.json",
"authors": [
@@ -11,4 +11,4 @@
"link": "https://github.com/ftnfurina"
}
]
}
}