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 () {
|
(async function () {
|
||||||
setGameMetrics(1920, 1080, 1);
|
setGameMetrics(1920, 1080, 1);
|
||||||
|
|
||||||
if (settings.logName) {
|
if (settings.logName) {
|
||||||
await processArtifacts();
|
await processArtifacts();
|
||||||
}
|
}
|
||||||
@@ -48,6 +49,7 @@ let TMthreshold = +settings.TMthreshold || 0.9;
|
|||||||
//构造加入idx号世界的autoEnter的settings
|
//构造加入idx号世界的autoEnter的settings
|
||||||
let autoEnterSettings;
|
let autoEnterSettings;
|
||||||
if (idx === yourIndex) {
|
if (idx === yourIndex) {
|
||||||
|
settings.forceGroupNumber = 1;//将房主强制指定为房主
|
||||||
// 1. 先收集真实存在的白名单
|
// 1. 先收集真实存在的白名单
|
||||||
const permits = {};
|
const permits = {};
|
||||||
let permitIndex = 1;
|
let permitIndex = 1;
|
||||||
@@ -73,6 +75,7 @@ let TMthreshold = +settings.TMthreshold || 0.9;
|
|||||||
log.info(`等待他人进入自己世界,目标人数:${autoEnterSettings.maxEnterCount}`);
|
log.info(`等待他人进入自己世界,目标人数:${autoEnterSettings.maxEnterCount}`);
|
||||||
notification.send(`等待他人进入自己世界,目标人数:${autoEnterSettings.maxEnterCount}`);
|
notification.send(`等待他人进入自己世界,目标人数:${autoEnterSettings.maxEnterCount}`);
|
||||||
} else {
|
} else {
|
||||||
|
settings.forceGroupNumber = 0;//取消强制指定
|
||||||
// 构造队员配置
|
// 构造队员配置
|
||||||
autoEnterSettings = {
|
autoEnterSettings = {
|
||||||
enterMode: "进入他人世界",
|
enterMode: "进入他人世界",
|
||||||
@@ -113,6 +116,7 @@ let TMthreshold = +settings.TMthreshold || 0.9;
|
|||||||
}
|
}
|
||||||
//执行对应的联机狗粮
|
//执行对应的联机狗粮
|
||||||
await runGroupPurchasing(false);
|
await runGroupPurchasing(false);
|
||||||
|
settings.forceGroupNumber = 0;//解除强制指定
|
||||||
}
|
}
|
||||||
//如果勾选了额外,在结束后再执行一次额外路线
|
//如果勾选了额外,在结束后再执行一次额外路线
|
||||||
if (settings.runExtra) {
|
if (settings.runExtra) {
|
||||||
@@ -130,27 +134,52 @@ let TMthreshold = +settings.TMthreshold || 0.9;
|
|||||||
)();
|
)();
|
||||||
|
|
||||||
async function checkP1Name(p1Name) {
|
async function checkP1Name(p1Name) {
|
||||||
await genshin.returnMainUi();
|
if (true) {
|
||||||
await keyPress("F2");
|
//log.info("禁用了房主名称校验,直接视为通过");
|
||||||
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},与预期相符`);
|
|
||||||
return true;
|
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,
|
"manifest_version": 1,
|
||||||
"name": "AAA狗粮联机团购",
|
"name": "AAA狗粮联机团购",
|
||||||
"version": "1.5.6",
|
"version": "1.5.9",
|
||||||
"tags": [
|
"tags": [
|
||||||
"狗粮"
|
"狗粮"
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -96,6 +96,12 @@
|
|||||||
"type": "input-text",
|
"type": "input-text",
|
||||||
"label": "运行时使用角色的序号\n将在进入联机模式前尝试切换到对应序号的角色"
|
"label": "运行时使用角色的序号\n将在进入联机模式前尝试切换到对应序号的角色"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "TMthreshold",
|
||||||
|
"type": "input-text",
|
||||||
|
"label": "拾取使用的匹配阈值\n观察到误捡可适当调高\n观察到漏捡可适当调低",
|
||||||
|
"default": "0.9"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "p1EndingRoute",
|
"name": "p1EndingRoute",
|
||||||
"type": "select",
|
"type": "select",
|
||||||
@@ -143,11 +149,5 @@
|
|||||||
"踏鞴砂"
|
"踏鞴砂"
|
||||||
],
|
],
|
||||||
"default": "踏鞴砂"
|
"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 targetItemPath = "assets/targetItems";
|
||||||
let mainUITemplate = file.ReadImageMatSync("assets/MainUI.png");
|
let mainUITemplate = file.ReadImageMatSync("assets/MainUI.png");
|
||||||
let itemFullTemplate = file.ReadImageMatSync("assets/itemFull.png");
|
let itemFullTemplate = file.ReadImageMatSync("assets/itemFull.png");
|
||||||
|
let frozenTemplate = file.ReadImageMatSync("assets/解除冰冻.png");
|
||||||
let targetItems;
|
let targetItems;
|
||||||
|
|
||||||
let rollingDelay = (+settings.rollingDelay || 25);
|
let rollingDelay = (+settings.rollingDelay || 25);
|
||||||
@@ -559,8 +560,38 @@ async function runPath(fullPath, map_name) {
|
|||||||
})();
|
})();
|
||||||
|
|
||||||
const errorProcessTask = (async () => {
|
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) {
|
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,
|
"manifest_version": 1,
|
||||||
"name": "锄地一条龙",
|
"name": "锄地一条龙",
|
||||||
"version": "1.9.6",
|
"version": "1.9.7",
|
||||||
"description": "一站式解决自动化锄地,支持只拾取狗粮,请仔细阅读README.md后使用",
|
"description": "一站式解决自动化锄地,支持只拾取狗粮,请仔细阅读README.md后使用",
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
|
|||||||