js:狗粮和锄地修修bug,加点功能 (#2234)
* js:锄地一条龙1.9.7 新增异常处理,检测到被冻结时连点空格挣脱 * js:联机狗粮1.5.9 1.自动进入时将房主强制指定为1号,队员强制指定为0号(不指定) 2.禁用房主名称检测
@@ -12,6 +12,7 @@ let TMthreshold = +settings.TMthreshold || 0.9;
|
||||
|
||||
(async function () {
|
||||
setGameMetrics(1920, 1080, 1);
|
||||
|
||||
if (settings.logName) {
|
||||
await processArtifacts();
|
||||
}
|
||||
@@ -48,6 +49,7 @@ let TMthreshold = +settings.TMthreshold || 0.9;
|
||||
//构造加入idx号世界的autoEnter的settings
|
||||
let autoEnterSettings;
|
||||
if (idx === yourIndex) {
|
||||
settings.forceGroupNumber = 1;//将房主强制指定为房主
|
||||
// 1. 先收集真实存在的白名单
|
||||
const permits = {};
|
||||
let permitIndex = 1;
|
||||
@@ -73,6 +75,7 @@ let TMthreshold = +settings.TMthreshold || 0.9;
|
||||
log.info(`等待他人进入自己世界,目标人数:${autoEnterSettings.maxEnterCount}`);
|
||||
notification.send(`等待他人进入自己世界,目标人数:${autoEnterSettings.maxEnterCount}`);
|
||||
} else {
|
||||
settings.forceGroupNumber = 0;//取消强制指定
|
||||
// 构造队员配置
|
||||
autoEnterSettings = {
|
||||
enterMode: "进入他人世界",
|
||||
@@ -113,6 +116,7 @@ let TMthreshold = +settings.TMthreshold || 0.9;
|
||||
}
|
||||
//执行对应的联机狗粮
|
||||
await runGroupPurchasing(false);
|
||||
settings.forceGroupNumber = 0;//解除强制指定
|
||||
}
|
||||
//如果勾选了额外,在结束后再执行一次额外路线
|
||||
if (settings.runExtra) {
|
||||
@@ -130,27 +134,52 @@ let TMthreshold = +settings.TMthreshold || 0.9;
|
||||
)();
|
||||
|
||||
async function checkP1Name(p1Name) {
|
||||
await genshin.returnMainUi();
|
||||
await keyPress("F2");
|
||||
await sleep(2000);
|
||||
const gameRegion = captureGameRegion();
|
||||
const resList = gameRegion.findMulti(RecognitionObject.ocr(400, 170, 300, 55));
|
||||
gameRegion.dispose();
|
||||
let hit = null;
|
||||
let txt;
|
||||
for (const res of resList) {
|
||||
txt = res.text.trim();
|
||||
if (txt === p1Name) { hit = txt; break; }
|
||||
}
|
||||
if (hit) {
|
||||
log.info(`识别到房主为${hit},与预期相符`);
|
||||
if (true) {
|
||||
//log.info("禁用了房主名称校验,直接视为通过");
|
||||
//强制禁用房主检测
|
||||
return true;
|
||||
} else {
|
||||
log.warn(`识别结果为${txt},与预期的${p1Name}不符,重试`);
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
// 加载目标 PNG
|
||||
const targetPngs = await readFolder(targetsPath, false);
|
||||
for (const f of targetPngs) {
|
||||
if (!f.fullPath.endsWith('.png')) continue;
|
||||
const mat = file.ReadImageMatSync(f.fullPath);
|
||||
const ro = RecognitionObject.TemplateMatch(mat, 395, 158, 588, 65);
|
||||
const baseName = f.fileName.replace(/\.png$/i, '');
|
||||
targetsRo.push({ ro, baseName });
|
||||
}
|
||||
log.info(`加载完成共 ${targetsRo.length} 个目标`);
|
||||
await genshin.returnMainUi();
|
||||
await keyPress("F2");
|
||||
await sleep(2000);
|
||||
const gameRegion = captureGameRegion();
|
||||
for (const { ro, baseName } of targetsRo) {
|
||||
if (gameRegion.find(ro).isExist()) { gameRegion.dispose(); log.info(`找到房主为${baseName}`); return true; }
|
||||
}
|
||||
gameRegion.dispose();
|
||||
} catch { }
|
||||
try {
|
||||
const gameRegion = captureGameRegion();
|
||||
const resList = gameRegion.findMulti(RecognitionObject.ocr(400, 170, 300, 55));
|
||||
gameRegion.dispose();
|
||||
let hit = null;
|
||||
let txt;
|
||||
for (const res of resList) {
|
||||
txt = res.text.trim();
|
||||
if (txt === p1Name) { hit = txt; break; }
|
||||
}
|
||||
if (hit) {
|
||||
log.info(`识别到房主为${hit},与预期相符`);
|
||||
return true;
|
||||
} else {
|
||||
log.warn(`识别结果为${txt},与预期的${p1Name}不符,重试`);
|
||||
return false;
|
||||
}
|
||||
} catch { return false; }
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 群收尾 / 额外路线统一入口
|
||||
*
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"manifest_version": 1,
|
||||
"name": "AAA狗粮联机团购",
|
||||
"version": "1.5.6",
|
||||
"version": "1.5.9",
|
||||
"tags": [
|
||||
"狗粮"
|
||||
],
|
||||
|
||||
@@ -96,6 +96,12 @@
|
||||
"type": "input-text",
|
||||
"label": "运行时使用角色的序号\n将在进入联机模式前尝试切换到对应序号的角色"
|
||||
},
|
||||
{
|
||||
"name": "TMthreshold",
|
||||
"type": "input-text",
|
||||
"label": "拾取使用的匹配阈值\n观察到误捡可适当调高\n观察到漏捡可适当调低",
|
||||
"default": "0.9"
|
||||
},
|
||||
{
|
||||
"name": "p1EndingRoute",
|
||||
"type": "select",
|
||||
@@ -143,11 +149,5 @@
|
||||
"踏鞴砂"
|
||||
],
|
||||
"default": "踏鞴砂"
|
||||
},
|
||||
{
|
||||
"name": "TMthreshold",
|
||||
"type": "input-text",
|
||||
"label": "拾取使用的匹配阈值\n观察到误捡可适当调高\n观察到漏捡可适当调低",
|
||||
"default": "0.9"
|
||||
}
|
||||
]
|
||||
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
BIN
repo/js/AutoHoeingOneDragon/assets/解除冰冻.png
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
@@ -13,6 +13,7 @@ let gameRegion;
|
||||
let targetItemPath = "assets/targetItems";
|
||||
let mainUITemplate = file.ReadImageMatSync("assets/MainUI.png");
|
||||
let itemFullTemplate = file.ReadImageMatSync("assets/itemFull.png");
|
||||
let frozenTemplate = file.ReadImageMatSync("assets/解除冰冻.png");
|
||||
let targetItems;
|
||||
|
||||
let rollingDelay = (+settings.rollingDelay || 25);
|
||||
@@ -559,8 +560,38 @@ async function runPath(fullPath, map_name) {
|
||||
})();
|
||||
|
||||
const errorProcessTask = (async () => {
|
||||
async function checkFrozen() {
|
||||
const maxAttempts = 1;
|
||||
let attempts = 0;
|
||||
let frozenGameRegion;
|
||||
while (attempts < maxAttempts && state.running) {
|
||||
try {
|
||||
const recognitionObject = RecognitionObject.TemplateMatch(frozenTemplate, 1379, 574, 1463 - 1379, 613 - 574);
|
||||
frozenGameRegion = captureGameRegion();
|
||||
const result = frozenGameRegion.find(recognitionObject);
|
||||
frozenGameRegion.dispose();
|
||||
if (result.isExist()) {
|
||||
return true;
|
||||
}
|
||||
} catch (error) {
|
||||
log.error(`识别图像时发生异常: ${error.message}`);
|
||||
if (!state.running) break;
|
||||
return false;
|
||||
}
|
||||
attempts++;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
while (state.running) {
|
||||
await sleep(1000);
|
||||
if (await checkFrozen()) {
|
||||
log.info("检测到冻结,尝试挣脱");
|
||||
for (let m = 0; m < 3; m++) {
|
||||
keyPress("VK_SPACE");
|
||||
await sleep(30);
|
||||
}
|
||||
} else {
|
||||
await sleep(500);
|
||||
}
|
||||
}
|
||||
})();
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"manifest_version": 1,
|
||||
"name": "锄地一条龙",
|
||||
"version": "1.9.6",
|
||||
"version": "1.9.7",
|
||||
"description": "一站式解决自动化锄地,支持只拾取狗粮,请仔细阅读README.md后使用",
|
||||
"authors": [
|
||||
{
|
||||
|
||||