From a6211c3c0db40ed15daa5a62eff6056887c0a898 Mon Sep 17 00:00:00 2001 From: overflow65537 Date: Tue, 4 Aug 2026 23:54:11 +0800 Subject: [PATCH 1/7] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E6=89=AB=E6=8F=8F=E7=BC=BA=E5=B0=91=E7=89=A9=E5=93=81=20(#4754?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit IMS 的库存扫描使用了颜色识别 首先识别文字颜色然后进行OCR 文字颜色阈值过窄导致OCR接收到了残缺的roi区 改动前 image 改动后 image 同时扩大了水平方向的识别范围 防止漏掉最后的1 比如1991会被识别成199 另一个问题是,识别物品的模板阈值过高(0.85->0.7) 高级认知载体和武陵精锻助剂这两个除外,他们在模版中容易被混淆,所以仍然保留0.85 ## Summary by Sourcery Bug Fixes: - 通过修正并更新多个 IMS 物品 JSON 资源条目,修复库存扫描中缺失物品的问题。
Original summary in English ## Summary by Sourcery Bug Fixes: - Fix missing items in inventory scan by correcting and updating multiple IMS item JSON resource entries.
## Summary by Sourcery Bug Fixes: - 调整 IMS 项目 JSON 资源条目,使先前缺失的项目能够被库存扫描器正确识别。
Original summary in English ## Summary by Sourcery Bug Fixes: - Adjust IMS item JSON resource entries so previously missing items are correctly recognized by the inventory scanner.
--- .../resource/pipeline/IMS/SyncItemData.json | 37 ++++++++++++++++++- .../IMS/item/ADVANCED_COGNITIVE_CARRIER.json | 15 ++++---- .../IMS/item/ADVANCED_COMBAT_RECORD.json | 14 +++---- .../pipeline/IMS/item/ARMS_INSPECTOR.json | 14 +++---- .../pipeline/IMS/item/ARMS_INSP_KIT.json | 14 +++---- .../pipeline/IMS/item/ARMS_INSP_SET.json | 14 +++---- .../resource/pipeline/IMS/item/CAST_DIE.json | 14 +++---- .../pipeline/IMS/item/COOLANT_GEL.json | 14 +++---- .../pipeline/IMS/item/D96_STEEL_SAMPLE_4.json | 14 +++---- .../item/ELEMENTARY_COGNITIVE_CARRIER.json | 14 +++---- .../IMS/item/ELEMENTARY_COMBAT_RECORD.json | 14 +++---- .../pipeline/IMS/item/HEAVY_CAST_DIE.json | 14 +++---- .../IMS/item/INTERMEDIATE_COMBAT_RECORD.json | 14 +++---- .../IMS/item/MARK_OF_PERSEVERANCE.json | 14 +++---- .../item/METADIASTIMA_PHOTOEMISSION_TUBE.json | 14 +++---- .../resource/pipeline/IMS/item/OROBERYL.json | 23 +++++------- .../resource/pipeline/IMS/item/PROTODISK.json | 14 +++---- .../pipeline/IMS/item/PROTOHEDRON.json | 14 +++---- .../pipeline/IMS/item/PROTOPRISM.json | 14 +++---- .../resource/pipeline/IMS/item/PROTOSET.json | 14 +++---- .../IMS/item/QUADRANT_FITTING_FLUID.json | 14 +++---- .../IMS/item/TACHYON_SCREENING_LATTICE.json | 14 +++---- .../IMS/item/TRIPHASIC_NANOFLAKE.json | 14 +++---- .../resource/pipeline/IMS/item/T_CREDS.json | 29 +++++++-------- .../IMS/item/WULING_ARTIFICING_CATALYST.json | 15 ++++---- 25 files changed, 192 insertions(+), 207 deletions(-) diff --git a/assets/resource/pipeline/IMS/SyncItemData.json b/assets/resource/pipeline/IMS/SyncItemData.json index a711b0c9d0..07178e2a6b 100644 --- a/assets/resource/pipeline/IMS/SyncItemData.json +++ b/assets/resource/pipeline/IMS/SyncItemData.json @@ -58,8 +58,19 @@ ] }, "SyncItemDataRunFull": { - "desc": "A2 初次完整识别(page_dedup=false)。结束后优先 JumpBack 滑动增量,次数由 SyncItemDataScrollPage.max_hit 控制;用尽后走 Lock", + "desc": "A2 初次完整识别(page_dedup=false)。培养素材列表静止后识别;结束后优先 JumpBack 滑动增量,次数由 SyncItemDataScrollPage.max_hit 控制;用尽后走 Lock", "recognition": "DirectHit", + "pre_wait_freezes": { + "target": [ + 30, + 80, + 950, + 560 + ], + "time": 300, + "threshold": 0.97, + "timeout": 1500 + }, "pre_delay": 0, "action": { "type": "Custom", @@ -127,6 +138,17 @@ "end_hold": 300 } }, + "post_wait_freezes": { + "target": [ + 30, + 80, + 950, + 560 + ], + "time": 300, + "threshold": 0.97, + "timeout": 1500 + }, "post_delay": 0, "rate_limit": 0, "next": [ @@ -134,8 +156,19 @@ ] }, "SyncItemDataRunInc": { - "desc": "A2 增量识别(page_dedup=true)。完成后空 next,经 JumpBack 回到 RunFull.next 再决定是否继续滑动", + "desc": "A2 增量识别(page_dedup=true)。列表静止后识别;完成后空 next,经 JumpBack 回到 RunFull.next 再决定是否继续滑动", "recognition": "DirectHit", + "pre_wait_freezes": { + "target": [ + 30, + 80, + 950, + 560 + ], + "time": 300, + "threshold": 0.97, + "timeout": 1500 + }, "pre_delay": 0, "action": { "type": "Custom", diff --git a/assets/resource/pipeline/IMS/item/ADVANCED_COGNITIVE_CARRIER.json b/assets/resource/pipeline/IMS/item/ADVANCED_COGNITIVE_CARRIER.json index 9d4c024060..9d3d7a1997 100644 --- a/assets/resource/pipeline/IMS/item/ADVANCED_COGNITIVE_CARRIER.json +++ b/assets/resource/pipeline/IMS/item/ADVANCED_COGNITIVE_CARRIER.json @@ -31,8 +31,8 @@ "template": [ "IMS/item/ADVANCED_COGNITIVE_CARRIER_TEMPLATE.png" ], + "threshold": 0.85, //分数过低可能会和武陵精锻助剂混淆 "green_mask": true, - "threshold": 0.85, "order_by": "Score" } }, @@ -68,7 +68,6 @@ 0, -64 ], - "method": 4, "lower": [ 74, 74, @@ -76,8 +75,8 @@ ], "upper": [ 119, - 112, - 107 + 145, + 157 ], "count": 10 } @@ -93,10 +92,10 @@ "param": { "roi": "__ADVANCED_COGNITIVE_CARRIER_COUNT_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" diff --git a/assets/resource/pipeline/IMS/item/ADVANCED_COMBAT_RECORD.json b/assets/resource/pipeline/IMS/item/ADVANCED_COMBAT_RECORD.json index 9ce6bb7f24..0c63a5ff38 100644 --- a/assets/resource/pipeline/IMS/item/ADVANCED_COMBAT_RECORD.json +++ b/assets/resource/pipeline/IMS/item/ADVANCED_COMBAT_RECORD.json @@ -32,7 +32,6 @@ "IMS/item/ADVANCED_COMBAT_RECORD_TEMPLATE.png" ], "green_mask": true, - "threshold": 0.85, "order_by": "Score" } }, @@ -68,7 +67,6 @@ 0, -64 ], - "method": 4, "lower": [ 74, 74, @@ -76,8 +74,8 @@ ], "upper": [ 119, - 112, - 107 + 145, + 157 ], "count": 10 } @@ -93,10 +91,10 @@ "param": { "roi": "__ADVANCED_COMBAT_RECORD_COUNT_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" diff --git a/assets/resource/pipeline/IMS/item/ARMS_INSPECTOR.json b/assets/resource/pipeline/IMS/item/ARMS_INSPECTOR.json index 5658fb2392..11325212fb 100644 --- a/assets/resource/pipeline/IMS/item/ARMS_INSPECTOR.json +++ b/assets/resource/pipeline/IMS/item/ARMS_INSPECTOR.json @@ -32,7 +32,6 @@ "IMS/item/ARMS_INSPECTOR_TEMPLATE.png" ], "green_mask": true, - "threshold": 0.85, "order_by": "Score" } }, @@ -68,7 +67,6 @@ 0, -64 ], - "method": 4, "lower": [ 74, 74, @@ -76,8 +74,8 @@ ], "upper": [ 119, - 112, - 107 + 145, + 157 ], "count": 10 } @@ -93,10 +91,10 @@ "param": { "roi": "__ARMS_INSPECTOR_COUNT_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" diff --git a/assets/resource/pipeline/IMS/item/ARMS_INSP_KIT.json b/assets/resource/pipeline/IMS/item/ARMS_INSP_KIT.json index 1c22bb831d..5285c70e69 100644 --- a/assets/resource/pipeline/IMS/item/ARMS_INSP_KIT.json +++ b/assets/resource/pipeline/IMS/item/ARMS_INSP_KIT.json @@ -32,7 +32,6 @@ "IMS/item/ARMS_INSP_KIT_TEMPLATE.png" ], "green_mask": true, - "threshold": 0.85, "order_by": "Score" } }, @@ -68,7 +67,6 @@ 0, -64 ], - "method": 4, "lower": [ 74, 74, @@ -76,8 +74,8 @@ ], "upper": [ 119, - 112, - 107 + 145, + 157 ], "count": 10 } @@ -93,10 +91,10 @@ "param": { "roi": "__ARMS_INSP_KIT_COUNT_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" diff --git a/assets/resource/pipeline/IMS/item/ARMS_INSP_SET.json b/assets/resource/pipeline/IMS/item/ARMS_INSP_SET.json index 2a4dde29dc..de84245265 100644 --- a/assets/resource/pipeline/IMS/item/ARMS_INSP_SET.json +++ b/assets/resource/pipeline/IMS/item/ARMS_INSP_SET.json @@ -32,7 +32,6 @@ "IMS/item/ARMS_INSP_SET_TEMPLATE.png" ], "green_mask": true, - "threshold": 0.85, "order_by": "Score" } }, @@ -68,7 +67,6 @@ 0, -64 ], - "method": 4, "lower": [ 74, 74, @@ -76,8 +74,8 @@ ], "upper": [ 119, - 112, - 107 + 145, + 157 ], "count": 10 } @@ -93,10 +91,10 @@ "param": { "roi": "__ARMS_INSP_SET_COUNT_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" diff --git a/assets/resource/pipeline/IMS/item/CAST_DIE.json b/assets/resource/pipeline/IMS/item/CAST_DIE.json index 52c357ecfe..7101e685ae 100644 --- a/assets/resource/pipeline/IMS/item/CAST_DIE.json +++ b/assets/resource/pipeline/IMS/item/CAST_DIE.json @@ -32,7 +32,6 @@ "IMS/item/CAST_DIE_TEMPLATE.png" ], "green_mask": true, - "threshold": 0.85, "order_by": "Score" } }, @@ -68,7 +67,6 @@ 0, -64 ], - "method": 4, "lower": [ 74, 74, @@ -76,8 +74,8 @@ ], "upper": [ 119, - 112, - 107 + 145, + 157 ], "count": 10 } @@ -93,10 +91,10 @@ "param": { "roi": "__CAST_DIE_COUNT_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" diff --git a/assets/resource/pipeline/IMS/item/COOLANT_GEL.json b/assets/resource/pipeline/IMS/item/COOLANT_GEL.json index 2c672dcfbb..fc570ddff7 100644 --- a/assets/resource/pipeline/IMS/item/COOLANT_GEL.json +++ b/assets/resource/pipeline/IMS/item/COOLANT_GEL.json @@ -32,7 +32,6 @@ "IMS/item/COOLANT_GEL_TEMPLATE.png" ], "green_mask": true, - "threshold": 0.85, "order_by": "Score" } }, @@ -68,7 +67,6 @@ 0, -64 ], - "method": 4, "lower": [ 74, 74, @@ -76,8 +74,8 @@ ], "upper": [ 119, - 112, - 107 + 145, + 157 ], "count": 10 } @@ -93,10 +91,10 @@ "param": { "roi": "__COOLANT_GEL_COUNT_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" diff --git a/assets/resource/pipeline/IMS/item/D96_STEEL_SAMPLE_4.json b/assets/resource/pipeline/IMS/item/D96_STEEL_SAMPLE_4.json index 5d252a00f7..5ffe1561a6 100644 --- a/assets/resource/pipeline/IMS/item/D96_STEEL_SAMPLE_4.json +++ b/assets/resource/pipeline/IMS/item/D96_STEEL_SAMPLE_4.json @@ -32,7 +32,6 @@ "IMS/item/D96_STEEL_SAMPLE_4_TEMPLATE.png" ], "green_mask": true, - "threshold": 0.85, "order_by": "Score" } }, @@ -68,7 +67,6 @@ 0, -64 ], - "method": 4, "lower": [ 74, 74, @@ -76,8 +74,8 @@ ], "upper": [ 119, - 112, - 107 + 145, + 157 ], "count": 10 } @@ -93,10 +91,10 @@ "param": { "roi": "__D96_STEEL_SAMPLE_4_COUNT_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" diff --git a/assets/resource/pipeline/IMS/item/ELEMENTARY_COGNITIVE_CARRIER.json b/assets/resource/pipeline/IMS/item/ELEMENTARY_COGNITIVE_CARRIER.json index e8382e4bf3..29d4a6ecb3 100644 --- a/assets/resource/pipeline/IMS/item/ELEMENTARY_COGNITIVE_CARRIER.json +++ b/assets/resource/pipeline/IMS/item/ELEMENTARY_COGNITIVE_CARRIER.json @@ -32,7 +32,6 @@ "IMS/item/ELEMENTARY_COGNITIVE_CARRIER_TEMPLATE.png" ], "green_mask": true, - "threshold": 0.85, "order_by": "Score" } }, @@ -68,7 +67,6 @@ 0, -64 ], - "method": 4, "lower": [ 74, 74, @@ -76,8 +74,8 @@ ], "upper": [ 119, - 112, - 107 + 145, + 157 ], "count": 10 } @@ -93,10 +91,10 @@ "param": { "roi": "__ELEMENTARY_COGNITIVE_CARRIER_COUNT_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" diff --git a/assets/resource/pipeline/IMS/item/ELEMENTARY_COMBAT_RECORD.json b/assets/resource/pipeline/IMS/item/ELEMENTARY_COMBAT_RECORD.json index 0ad470ff1c..5cf84ce888 100644 --- a/assets/resource/pipeline/IMS/item/ELEMENTARY_COMBAT_RECORD.json +++ b/assets/resource/pipeline/IMS/item/ELEMENTARY_COMBAT_RECORD.json @@ -32,7 +32,6 @@ "IMS/item/ELEMENTARY_COMBAT_RECORD_TEMPLATE.png" ], "green_mask": true, - "threshold": 0.85, "order_by": "Score" } }, @@ -68,7 +67,6 @@ 0, -64 ], - "method": 4, "lower": [ 74, 74, @@ -76,8 +74,8 @@ ], "upper": [ 119, - 112, - 107 + 145, + 157 ], "count": 10 } @@ -93,10 +91,10 @@ "param": { "roi": "__ELEMENTARY_COMBAT_RECORD_COUNT_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" diff --git a/assets/resource/pipeline/IMS/item/HEAVY_CAST_DIE.json b/assets/resource/pipeline/IMS/item/HEAVY_CAST_DIE.json index 2b4eb605bb..0808a338cb 100644 --- a/assets/resource/pipeline/IMS/item/HEAVY_CAST_DIE.json +++ b/assets/resource/pipeline/IMS/item/HEAVY_CAST_DIE.json @@ -32,7 +32,6 @@ "IMS/item/HEAVY_CAST_DIE_TEMPLATE.png" ], "green_mask": true, - "threshold": 0.85, "order_by": "Score" } }, @@ -68,7 +67,6 @@ 0, -64 ], - "method": 4, "lower": [ 74, 74, @@ -76,8 +74,8 @@ ], "upper": [ 119, - 112, - 107 + 145, + 157 ], "count": 10 } @@ -93,10 +91,10 @@ "param": { "roi": "__HEAVY_CAST_DIE_COUNT_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" diff --git a/assets/resource/pipeline/IMS/item/INTERMEDIATE_COMBAT_RECORD.json b/assets/resource/pipeline/IMS/item/INTERMEDIATE_COMBAT_RECORD.json index b1967bf338..2af8f12aac 100644 --- a/assets/resource/pipeline/IMS/item/INTERMEDIATE_COMBAT_RECORD.json +++ b/assets/resource/pipeline/IMS/item/INTERMEDIATE_COMBAT_RECORD.json @@ -32,7 +32,6 @@ "IMS/item/INTERMEDIATE_COMBAT_RECORD_TEMPLATE.png" ], "green_mask": true, - "threshold": 0.85, "order_by": "Score" } }, @@ -68,7 +67,6 @@ 0, -64 ], - "method": 4, "lower": [ 74, 74, @@ -76,8 +74,8 @@ ], "upper": [ 119, - 112, - 107 + 145, + 157 ], "count": 10 } @@ -93,10 +91,10 @@ "param": { "roi": "__INTERMEDIATE_COMBAT_RECORD_COUNT_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" diff --git a/assets/resource/pipeline/IMS/item/MARK_OF_PERSEVERANCE.json b/assets/resource/pipeline/IMS/item/MARK_OF_PERSEVERANCE.json index d769b8f733..d4fa5b7f67 100644 --- a/assets/resource/pipeline/IMS/item/MARK_OF_PERSEVERANCE.json +++ b/assets/resource/pipeline/IMS/item/MARK_OF_PERSEVERANCE.json @@ -32,7 +32,6 @@ "IMS/item/MARK_OF_PERSEVERANCE_TEMPLATE.png" ], "green_mask": true, - "threshold": 0.85, "order_by": "Score" } }, @@ -68,7 +67,6 @@ 0, -64 ], - "method": 4, "lower": [ 74, 74, @@ -76,8 +74,8 @@ ], "upper": [ 119, - 112, - 107 + 145, + 157 ], "count": 10 } @@ -93,10 +91,10 @@ "param": { "roi": "__MARK_OF_PERSEVERANCE_COUNT_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" diff --git a/assets/resource/pipeline/IMS/item/METADIASTIMA_PHOTOEMISSION_TUBE.json b/assets/resource/pipeline/IMS/item/METADIASTIMA_PHOTOEMISSION_TUBE.json index a958d4da41..e977571024 100644 --- a/assets/resource/pipeline/IMS/item/METADIASTIMA_PHOTOEMISSION_TUBE.json +++ b/assets/resource/pipeline/IMS/item/METADIASTIMA_PHOTOEMISSION_TUBE.json @@ -32,7 +32,6 @@ "IMS/item/METADIASTIMA_PHOTOEMISSION_TUBE_TEMPLATE.png" ], "green_mask": true, - "threshold": 0.85, "order_by": "Score" } }, @@ -68,7 +67,6 @@ 0, -64 ], - "method": 4, "lower": [ 74, 74, @@ -76,8 +74,8 @@ ], "upper": [ 119, - 112, - 107 + 145, + 157 ], "count": 10 } @@ -93,10 +91,10 @@ "param": { "roi": "__METADIASTIMA_PHOTOEMISSION_TUBE_COUNT_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" diff --git a/assets/resource/pipeline/IMS/item/OROBERYL.json b/assets/resource/pipeline/IMS/item/OROBERYL.json index 9e3d936628..ae0ea96400 100644 --- a/assets/resource/pipeline/IMS/item/OROBERYL.json +++ b/assets/resource/pipeline/IMS/item/OROBERYL.json @@ -32,7 +32,6 @@ "IMS/item/OROBERYL_TEMPLATE.png" ], "green_mask": true, - "threshold": 0.85, "order_by": "Score" } }, @@ -68,7 +67,6 @@ 0, -64 ], - "method": 4, "lower": [ 74, 74, @@ -76,8 +74,8 @@ ], "upper": [ 119, - 112, - 107 + 145, + 157 ], "count": 10 } @@ -93,10 +91,10 @@ "param": { "roi": "__OROBERYL_COUNT_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" @@ -134,7 +132,6 @@ 92, 56 ], - "method": 4, "lower": [ 200, 200, @@ -159,10 +156,10 @@ "param": { "roi": "__OROBERYL_NUMBER_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" diff --git a/assets/resource/pipeline/IMS/item/PROTODISK.json b/assets/resource/pipeline/IMS/item/PROTODISK.json index 1a52ecfd49..670a29a06a 100644 --- a/assets/resource/pipeline/IMS/item/PROTODISK.json +++ b/assets/resource/pipeline/IMS/item/PROTODISK.json @@ -32,7 +32,6 @@ "IMS/item/PROTODISK_TEMPLATE.png" ], "green_mask": true, - "threshold": 0.85, "order_by": "Score" } }, @@ -68,7 +67,6 @@ 0, -64 ], - "method": 4, "lower": [ 74, 74, @@ -76,8 +74,8 @@ ], "upper": [ 119, - 112, - 107 + 145, + 157 ], "count": 10 } @@ -93,10 +91,10 @@ "param": { "roi": "__PROTODISK_COUNT_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" diff --git a/assets/resource/pipeline/IMS/item/PROTOHEDRON.json b/assets/resource/pipeline/IMS/item/PROTOHEDRON.json index fad9906b15..123381fa22 100644 --- a/assets/resource/pipeline/IMS/item/PROTOHEDRON.json +++ b/assets/resource/pipeline/IMS/item/PROTOHEDRON.json @@ -32,7 +32,6 @@ "IMS/item/PROTOHEDRON_TEMPLATE.png" ], "green_mask": true, - "threshold": 0.85, "order_by": "Score" } }, @@ -68,7 +67,6 @@ 0, -64 ], - "method": 4, "lower": [ 74, 74, @@ -76,8 +74,8 @@ ], "upper": [ 119, - 112, - 107 + 145, + 157 ], "count": 10 } @@ -93,10 +91,10 @@ "param": { "roi": "__PROTOHEDRON_COUNT_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" diff --git a/assets/resource/pipeline/IMS/item/PROTOPRISM.json b/assets/resource/pipeline/IMS/item/PROTOPRISM.json index ec25b802e3..da3a13bea5 100644 --- a/assets/resource/pipeline/IMS/item/PROTOPRISM.json +++ b/assets/resource/pipeline/IMS/item/PROTOPRISM.json @@ -32,7 +32,6 @@ "IMS/item/PROTOPRISM_TEMPLATE.png" ], "green_mask": true, - "threshold": 0.85, "order_by": "Score" } }, @@ -68,7 +67,6 @@ 0, -64 ], - "method": 4, "lower": [ 74, 74, @@ -76,8 +74,8 @@ ], "upper": [ 119, - 112, - 107 + 145, + 157 ], "count": 10 } @@ -93,10 +91,10 @@ "param": { "roi": "__PROTOPRISM_COUNT_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" diff --git a/assets/resource/pipeline/IMS/item/PROTOSET.json b/assets/resource/pipeline/IMS/item/PROTOSET.json index 43048c11b9..4fbe6d348a 100644 --- a/assets/resource/pipeline/IMS/item/PROTOSET.json +++ b/assets/resource/pipeline/IMS/item/PROTOSET.json @@ -32,7 +32,6 @@ "IMS/item/PROTOSET_TEMPLATE.png" ], "green_mask": true, - "threshold": 0.85, "order_by": "Score" } }, @@ -68,7 +67,6 @@ 0, -64 ], - "method": 4, "lower": [ 74, 74, @@ -76,8 +74,8 @@ ], "upper": [ 119, - 112, - 107 + 145, + 157 ], "count": 10 } @@ -93,10 +91,10 @@ "param": { "roi": "__PROTOSET_COUNT_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" diff --git a/assets/resource/pipeline/IMS/item/QUADRANT_FITTING_FLUID.json b/assets/resource/pipeline/IMS/item/QUADRANT_FITTING_FLUID.json index 86e8103e0e..ca39436a5a 100644 --- a/assets/resource/pipeline/IMS/item/QUADRANT_FITTING_FLUID.json +++ b/assets/resource/pipeline/IMS/item/QUADRANT_FITTING_FLUID.json @@ -32,7 +32,6 @@ "IMS/item/QUADRANT_FITTING_FLUID_TEMPLATE.png" ], "green_mask": true, - "threshold": 0.85, "order_by": "Score" } }, @@ -68,7 +67,6 @@ 0, -64 ], - "method": 4, "lower": [ 74, 74, @@ -76,8 +74,8 @@ ], "upper": [ 119, - 112, - 107 + 145, + 157 ], "count": 10 } @@ -93,10 +91,10 @@ "param": { "roi": "__QUADRANT_FITTING_FLUID_COUNT_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" diff --git a/assets/resource/pipeline/IMS/item/TACHYON_SCREENING_LATTICE.json b/assets/resource/pipeline/IMS/item/TACHYON_SCREENING_LATTICE.json index 42e46483b9..3c27ab2dde 100644 --- a/assets/resource/pipeline/IMS/item/TACHYON_SCREENING_LATTICE.json +++ b/assets/resource/pipeline/IMS/item/TACHYON_SCREENING_LATTICE.json @@ -32,7 +32,6 @@ "IMS/item/TACHYON_SCREENING_LATTICE_TEMPLATE.png" ], "green_mask": true, - "threshold": 0.85, "order_by": "Score" } }, @@ -68,7 +67,6 @@ 0, -64 ], - "method": 4, "lower": [ 74, 74, @@ -76,8 +74,8 @@ ], "upper": [ 119, - 112, - 107 + 145, + 157 ], "count": 10 } @@ -93,10 +91,10 @@ "param": { "roi": "__TACHYON_SCREENING_LATTICE_COUNT_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" diff --git a/assets/resource/pipeline/IMS/item/TRIPHASIC_NANOFLAKE.json b/assets/resource/pipeline/IMS/item/TRIPHASIC_NANOFLAKE.json index 08ddccba24..123906a3e7 100644 --- a/assets/resource/pipeline/IMS/item/TRIPHASIC_NANOFLAKE.json +++ b/assets/resource/pipeline/IMS/item/TRIPHASIC_NANOFLAKE.json @@ -32,7 +32,6 @@ "IMS/item/TRIPHASIC_NANOFLAKE_TEMPLATE.png" ], "green_mask": true, - "threshold": 0.85, "order_by": "Score" } }, @@ -68,7 +67,6 @@ 0, -64 ], - "method": 4, "lower": [ 74, 74, @@ -76,8 +74,8 @@ ], "upper": [ 119, - 112, - 107 + 145, + 157 ], "count": 10 } @@ -93,10 +91,10 @@ "param": { "roi": "__TRIPHASIC_NANOFLAKE_COUNT_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" diff --git a/assets/resource/pipeline/IMS/item/T_CREDS.json b/assets/resource/pipeline/IMS/item/T_CREDS.json index d39c912d98..a9c12fd8ad 100644 --- a/assets/resource/pipeline/IMS/item/T_CREDS.json +++ b/assets/resource/pipeline/IMS/item/T_CREDS.json @@ -32,7 +32,6 @@ "IMS/item/T_CREDS_TEMPLATE.png" ], "green_mask": true, - "threshold": 0.85, "order_by": "Score" } }, @@ -68,7 +67,6 @@ 0, -64 ], - "method": 4, "lower": [ 74, 74, @@ -76,8 +74,8 @@ ], "upper": [ 119, - 112, - 107 + 145, + 157 ], "count": 10 } @@ -93,10 +91,10 @@ "param": { "roi": "__T_CREDS_COUNT_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" @@ -134,11 +132,10 @@ 99, 55 ], - "method": 4, "lower": [ - 200, - 200, - 200 + 158, + 158, + 158 ], "upper": [ 255, @@ -159,10 +156,10 @@ "param": { "roi": "__T_CREDS_NUMBER_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" diff --git a/assets/resource/pipeline/IMS/item/WULING_ARTIFICING_CATALYST.json b/assets/resource/pipeline/IMS/item/WULING_ARTIFICING_CATALYST.json index eae3f8d98a..98c0145716 100644 --- a/assets/resource/pipeline/IMS/item/WULING_ARTIFICING_CATALYST.json +++ b/assets/resource/pipeline/IMS/item/WULING_ARTIFICING_CATALYST.json @@ -31,8 +31,8 @@ "template": [ "IMS/item/WULING_ARTIFICING_CATALYST_TEMPLATE.png" ], + "threshold": 0.85, //分数过低可能会和高级认知载体混淆 "green_mask": true, - "threshold": 0.85, "order_by": "Score" } }, @@ -68,7 +68,6 @@ 0, -64 ], - "method": 4, "lower": [ 74, 74, @@ -76,8 +75,8 @@ ], "upper": [ 119, - 112, - 107 + 145, + 157 ], "count": 10 } @@ -93,10 +92,10 @@ "param": { "roi": "__WULING_ARTIFICING_CATALYST_COUNT_TEXT_COLOR", "roi_offset": [ - -1, - -1, - 2, - 2 + -6, + -2, + 12, + 4 ], "expected": [ "^\\d+$" From 7015944078b9001eee8d7608a4347b2ce760d306 Mon Sep 17 00:00:00 2001 From: zmdyy0318 Date: Tue, 4 Aug 2026 23:54:22 +0800 Subject: [PATCH 2/7] =?UTF-8?q?feat:=20=E5=BC=80=E8=8D=92=E8=BE=85?= =?UTF-8?q?=E5=8A=A9=E5=A2=9E=E5=8A=A0=E6=B5=AE=E7=A9=BA=E5=9B=9E=E6=94=B6?= =?UTF-8?q?=20(#4757)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit close #4695 ## Summary by Sourcery 在实时辅助任务和流水线中添加对空中打捞的支持。 新功能: - 在实时辅助任务配置中引入空中打捞(漂浮物回收)功能。 增强内容: - 更新任务和流水线定义,将空中打捞集成到现有的实时工作流中。 文档: - 为新的空中打捞功能在所有支持的语言中添加本地化界面文案。
Original summary in English ## Summary by Sourcery Add support for aerial salvage in realtime assist tasks and pipelines. New Features: - Introduce an aero salvage (floating recovery) capability to the realtime assist task configuration. Enhancements: - Update task and pipeline definitions to integrate aero salvage into existing realtime workflows. Documentation: - Add localized interface strings for the new aero salvage feature across supported languages.
--- assets/locales/interface/en_us.json | 2 ++ assets/locales/interface/ja_jp.json | 2 ++ assets/locales/interface/ko_kr.json | 2 ++ assets/locales/interface/zh_cn.json | 2 ++ assets/locales/interface/zh_tw.json | 2 ++ assets/resource/pipeline/AeroSalvage.json | 41 +++++++++++++++++----- assets/resource/pipeline/RealtimeTask.json | 1 + assets/tasks/RealTimeTask.json | 27 ++++++++++++++ assets/tasks/preset/RealtimeAssist.json | 1 + 9 files changed, 71 insertions(+), 9 deletions(-) diff --git a/assets/locales/interface/en_us.json b/assets/locales/interface/en_us.json index 6d9823665e..778f45b53f 100644 --- a/assets/locales/interface/en_us.json +++ b/assets/locales/interface/en_us.json @@ -136,6 +136,8 @@ "option.QuickTeleport.description": "When selecting a teleport point on the world map (or from a list), automatically click Teleport.", "option.AutoPuzzleSolving.label": "Solve Puzzle", "option.AutoPuzzleSolving.description": "Automatically clears the puzzle minigame for you (equivalent to enabling the ⌈🧩 Solve Puzzle⌋ task in Loop mode).", + "option.AutoAeroSalvage.label": "Aerial Salvage", + "option.AutoAeroSalvage.description": "Automatically clears the Aerial Salvage minigame for you (equivalent to enabling the ⌈🎈 Aerial Salvage⌋ task in Loop mode).", "option.AutoTaskInterval.label": "Real-time Assist Interval", "option.AutoTaskInterval.description": "Too fast a check interval may cause lag. Adjust according to your situation.", "option.AutoTaskInterval.cases.AutoTaskIntervalFast.label": "Fast", diff --git a/assets/locales/interface/ja_jp.json b/assets/locales/interface/ja_jp.json index 24a85a8cb5..2e19406b06 100644 --- a/assets/locales/interface/ja_jp.json +++ b/assets/locales/interface/ja_jp.json @@ -134,6 +134,8 @@ "option.QuickTeleport.description": "ワールドマップ(または一覧)で転送地点を選択した時に、転送を自動でクリックします。", "option.AutoPuzzleSolving.label": "パズル解決", "option.AutoPuzzleSolving.description": "パズルミニゲームを自動でクリアします(⌈🧩 パズル解決⌋タスクの繰り返し実行を有効にするのと同等)。", + "option.AutoAeroSalvage.label": "浮遊回収", + "option.AutoAeroSalvage.description": "浮遊回収ミニゲームを自動でクリアします(⌈🎈 浮遊回収⌋タスクの繰り返し実行を有効にするのと同等)。", "option.AutoTaskInterval.label": "リアルタイム支援間隔", "option.AutoTaskInterval.description": "間隔が速すぎるとカクつく可能性があります。状況に応じて調整してください。", "option.AutoTaskInterval.cases.AutoTaskIntervalFast.label": "速い", diff --git a/assets/locales/interface/ko_kr.json b/assets/locales/interface/ko_kr.json index 067c1f5703..f21edeec60 100644 --- a/assets/locales/interface/ko_kr.json +++ b/assets/locales/interface/ko_kr.json @@ -134,6 +134,8 @@ "option.QuickTeleport.description": "월드맵(또는 목록)에서 텔레포트 지점을 선택할 때 텔레포트를 자동으로 클릭합니다.", "option.AutoPuzzleSolving.label": "퍼즐 해결", "option.AutoPuzzleSolving.description": "퍼즐 미니게임을 자동으로 클리어합니다(⌈🧩 퍼즐 해결⌋ 작업을 반복 실행으로 켜는 것과 동일).", + "option.AutoAeroSalvage.label": "부유 회수", + "option.AutoAeroSalvage.description": "부유 회수 미니게임을 자동으로 클리어합니다(⌈🎈 부유 회수⌋ 작업을 반복 실행으로 켜는 것과 동일).", "option.AutoTaskInterval.label": "실시간 지원 간격", "option.AutoTaskInterval.description": "간격이 너무 빠르면 끊김이 발생할 수 있습니다. 상황에 맞게 조정해 주세요.", "option.AutoTaskInterval.cases.AutoTaskIntervalFast.label": "빠름", diff --git a/assets/locales/interface/zh_cn.json b/assets/locales/interface/zh_cn.json index 5ef51d4be3..60bbda740e 100644 --- a/assets/locales/interface/zh_cn.json +++ b/assets/locales/interface/zh_cn.json @@ -136,6 +136,8 @@ "option.QuickTeleport.description": "在大地图上点击传送点(或列表中有传送点)时,自动点击传送", "option.AutoPuzzleSolving.label": "解拼图", "option.AutoPuzzleSolving.description": "自动帮你通关拼图小游戏(等价于开启⌈🧩解拼图⌋任务的循环执行)", + "option.AutoAeroSalvage.label": "浮空回收", + "option.AutoAeroSalvage.description": "自动帮你完成浮空回收小游戏(等价于开启⌈🎈浮空回收⌋任务的循环执行)", "option.AutoTaskInterval.label": "实时辅助间隔", "option.AutoTaskInterval.description": "过快的检测间隔可能会导致卡顿,请根据实际情况调整", "option.AutoTaskInterval.cases.AutoTaskIntervalFast.label": "快", diff --git a/assets/locales/interface/zh_tw.json b/assets/locales/interface/zh_tw.json index d600f8df21..cfd2ae23a8 100644 --- a/assets/locales/interface/zh_tw.json +++ b/assets/locales/interface/zh_tw.json @@ -136,6 +136,8 @@ "option.QuickTeleport.description": "在大地圖上點擊傳送點(或列表中有傳送點)時,自動點擊傳送", "option.AutoPuzzleSolving.label": "解拼圖", "option.AutoPuzzleSolving.description": "自動幫你通關拼圖小遊戲(等價於開啟⌈🧩解拼圖⌋任務的重複執行)", + "option.AutoAeroSalvage.label": "浮空回收", + "option.AutoAeroSalvage.description": "自動幫你完成浮空回收小遊戲(等價於開啟⌈🎈浮空回收⌋任務的重複執行)", "option.AutoTaskInterval.label": "即時輔助間隔", "option.AutoTaskInterval.description": "過快的檢測間隔可能會導致卡頓,請根據實際情況調整", "option.AutoTaskInterval.cases.AutoTaskIntervalFast.label": "快", diff --git a/assets/resource/pipeline/AeroSalvage.json b/assets/resource/pipeline/AeroSalvage.json index e94e8a7621..a4049aabb9 100644 --- a/assets/resource/pipeline/AeroSalvage.json +++ b/assets/resource/pipeline/AeroSalvage.json @@ -1,19 +1,39 @@ { "AeroSalvageMain": { "desc": "浮空回收入口", - "recognition": "TemplateMatch", - "roi": [ - 942, - 134, - 120, - 119 + "recognition": "And", + "all_of": [ + { + "recognition": "OCR", + "roi": [ + 0, + 0, + 200, + 60 + ], + "expected": [ + "浮空回收" + ] + }, + { + "recognition": "TemplateMatch", + "roi": [ + 942, + 134, + 120, + 119 + ], + "template": "AeroSalvage/Salvage.png" + } ], - "template": "AeroSalvage/Salvage.png", "pre_delay": 0, "post_delay": 0, "next": [ "AeroSalvageResetState" - ] + ], + "focus": { + "Node.Recognition.Succeeded": "🎈 开始浮空回收" + } }, "AeroSalvageResetState": { "desc": "重置", @@ -204,7 +224,10 @@ "next": [ "InWorld", "AeroSalvageMainLoop" - ] + ], + "focus": { + "Node.Recognition.Succeeded": "👌 已完成一轮浮空回收" + } }, // 识别节点 "AeroSalvagePlacementSiteTemplate": { diff --git a/assets/resource/pipeline/RealtimeTask.json b/assets/resource/pipeline/RealtimeTask.json index 8def1940da..a29ec44974 100644 --- a/assets/resource/pipeline/RealtimeTask.json +++ b/assets/resource/pipeline/RealtimeTask.json @@ -19,6 +19,7 @@ "RealTimeQuickTeleportDirect", "PuzzleSolverOnScenePrepare", "PuzzleSolverOnSceneMain", + "AeroSalvageMain", "RealTimeAutoSkip", "AutoFight", "RealTimeSleep" diff --git a/assets/tasks/RealTimeTask.json b/assets/tasks/RealTimeTask.json index d193a67cae..97fe42cabd 100644 --- a/assets/tasks/RealTimeTask.json +++ b/assets/tasks/RealTimeTask.json @@ -14,6 +14,7 @@ "AutoPick", "QuickTeleport", "AutoPuzzleSolving", + "AutoAeroSalvage", "AutoZipline", "AutoPat", "AutoTaskInterval" @@ -976,6 +977,32 @@ } ] }, + "AutoAeroSalvage": { + "type": "switch", + "label": "$option.AutoAeroSalvage.label", + "description": "$option.AutoAeroSalvage.description", + "cases": [ + { + "name": "Yes", + "pipeline_override": { + "AeroSalvageCompleteConfirm": { + "next": [ + "AeroSalvageMainLoop", + "RealTimeTaskMain" + ] + } + } + }, + { + "name": "No", + "pipeline_override": { + "AeroSalvageMain": { + "enabled": false + } + } + } + ] + }, "AutoTaskInterval": { "type": "select", "label": "$option.AutoTaskInterval.label", diff --git a/assets/tasks/preset/RealtimeAssist.json b/assets/tasks/preset/RealtimeAssist.json index 6c3fdecec8..9540e59676 100644 --- a/assets/tasks/preset/RealtimeAssist.json +++ b/assets/tasks/preset/RealtimeAssist.json @@ -17,6 +17,7 @@ "AutoPick": "Yes", "QuickTeleport": "Yes", "AutoPuzzleSolving": "Yes", + "AutoAeroSalvage": "Yes", "AutoZipline": "Yes", "AutoPat": "No" } From ca33e2d474a749696329efa92b53997e4b536dd3 Mon Sep 17 00:00:00 2001 From: zmdyy0318 Date: Tue, 4 Aug 2026 23:54:41 +0800 Subject: [PATCH 3/7] =?UTF-8?q?perf:=20=E5=A2=9E=E5=8A=A0=E6=88=AA?= =?UTF-8?q?=E5=9B=BE=E5=8D=A1=E6=AD=BB=E6=A3=80=E6=B5=8B=20(#4755)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit close #4706 ## Summary by Sourcery 为场景管理器添加截图稳定识别功能,用于检测截图在多个帧中保持稳定,以识别潜在卡顿。 Enhancements: - 引入 `ScreenshotStableRecognition`,用于判断界面在连续三个帧中是否在视觉上保持不变,并上报稳定状态。 - 在场景管理器中注册新的截图稳定识别功能,并将其集成到现有的场景/管线配置以及本地化界面资源中。
Original summary in English ## Summary by Sourcery Add a scene manager recognition to detect when screenshots remain stable over multiple frames to identify potential freezes. Enhancements: - Introduce ScreenshotStableRecognition to determine if the interface remains visually unchanged across three consecutive frames and report a stable state. - Register the new screenshot stability recognition in the scene manager and integrate it into existing scene/pipeline configurations and localized interface resources.
--- agent/go-service/scenemanager/register.go | 1 + .../scenemanager/screenshotstable.go | 108 ++++++++++++++++++ assets/locales/interface/en_us.json | 1 + assets/locales/interface/ja_jp.json | 1 + assets/locales/interface/ko_kr.json | 1 + assets/locales/interface/zh_cn.json | 1 + assets/locales/interface/zh_tw.json | 1 + assets/resource/pipeline/Interface/Scene.json | 1 + .../pipeline/SceneManager/SceneCommon.json | 17 +++ tools/schema/custom.recognition.schema.json | 1 + 10 files changed, 133 insertions(+) create mode 100644 agent/go-service/scenemanager/screenshotstable.go diff --git a/agent/go-service/scenemanager/register.go b/agent/go-service/scenemanager/register.go index 58461cc691..29a2ca3db5 100644 --- a/agent/go-service/scenemanager/register.go +++ b/agent/go-service/scenemanager/register.go @@ -6,4 +6,5 @@ func Register() { maa.AgentServerRegisterCustomAction("SceneManagerMenuListClickItemAction", &SceneManagerMenuListClickItemAction{}) maa.AgentServerRegisterCustomRecognition("ImageCheckNotPassedRecognition", &ImageCheckNotPassedRecognition{}) maa.AgentServerRegisterCustomAction("ImageCheckSetResultAction", &ImageCheckSetResultAction{}) + maa.AgentServerRegisterCustomRecognition("ScreenshotStableRecognition", &ScreenshotStableRecognition{}) } diff --git a/agent/go-service/scenemanager/screenshotstable.go b/agent/go-service/scenemanager/screenshotstable.go new file mode 100644 index 0000000000..f8b43836bb --- /dev/null +++ b/agent/go-service/scenemanager/screenshotstable.go @@ -0,0 +1,108 @@ +package scenemanager + +import ( + "image" + + "github.com/MaaXYZ/MaaEnd/agent/go-service/pkg/minicv" + "github.com/MaaXYZ/MaaEnd/agent/go-service/pkg/pienv" + "github.com/MaaXYZ/MaaEnd/agent/go-service/pretask/gamesetting" + maa "github.com/MaaXYZ/maa-framework-go/v4" + "github.com/rs/zerolog/log" +) + +var screenshotStableDone bool +var screenshotStableCount int // 0=未采;1=已有 baseline;2=第 2 帧已匹配,等待第 3 帧 +var screenshotStableBaseline *image.RGBA + +var _ maa.CustomRecognitionRunner = (*ScreenshotStableRecognition)(nil) + +// ScreenshotStableRecognition 仅在 Win32-Front + 游戏全屏时,于 Agent 进程生命周期内判定一次 +// 画面是否连续三帧稳定。每次调用只用 arg.Img:第 1 次存 baseline;第 2 帧不匹配则结束周期; +// 匹配后再采第 3 帧确认。仅第 3 帧仍相似时命中。 +type ScreenshotStableRecognition struct{} + +func (r *ScreenshotStableRecognition) Run(ctx *maa.Context, arg *maa.CustomRecognitionArg) (*maa.CustomRecognitionResult, bool) { + _ = ctx + if arg == nil || arg.Img == nil { + log.Error().Str("component", "ScreenshotStableRecognition").Msg("nil arg or image") + return nil, false + } + if screenshotStableDone { + return nil, false + } + if !shouldRunScreenshotStable() { + return nil, false + } + + cur := minicv.ImageConvertRGBA(arg.Img) + if cur == nil || cur.Bounds().Empty() { + log.Error().Str("component", "ScreenshotStableRecognition").Msg("empty image") + return nil, false + } + + // 第 1 帧:只存 baseline + if screenshotStableCount == 0 { + screenshotStableBaseline = minicv.ImageCopy(cur) + screenshotStableCount = 1 + return nil, false + } + + // 第 2 帧:与 baseline 比;不匹配则结束,不再需要第 3 帧 + if screenshotStableCount == 1 { + if !imagesSimilar(cur, screenshotStableBaseline, 0.99) { + finishScreenshotStable() + return nil, false + } + screenshotStableCount = 2 + return nil, false + } + + // 第 3 帧:仅在第 2 帧已匹配时才会走到这里 + matched := imagesSimilar(cur, screenshotStableBaseline, 0.99) + finishScreenshotStable() + if !matched { + return nil, false + } + + b := cur.Bounds() + return &maa.CustomRecognitionResult{ + Box: maa.Rect{b.Min.X, b.Min.Y, b.Dx(), b.Dy()}, + Detail: `{"stable":true}`, + }, true +} + +func shouldRunScreenshotStable() bool { + if pienv.ControllerName() != "Win32-Front" { + return false + } + fullScreen, err := gamesetting.GetVideoFullScreen() + if err != nil { + log.Debug(). + Err(err). + Str("component", "ScreenshotStableRecognition"). + Msg("failed to read fullscreen setting, skip") + return false + } + return fullScreen == 1 +} + +func finishScreenshotStable() { + screenshotStableDone = true + screenshotStableBaseline = nil + screenshotStableCount = 0 +} + +func imagesSimilar(cur, baseline *image.RGBA, threshold float64) bool { + if cur == nil || baseline == nil { + return false + } + if cur.Bounds().Dx() != baseline.Bounds().Dx() || cur.Bounds().Dy() != baseline.Bounds().Dy() { + return false + } + stats := minicv.GetImageStats(baseline) + if stats.Std < 1e-6 { + return false + } + score := minicv.ComputeNCC(cur, minicv.GetIntegralArray(cur), baseline, stats, 0, 0) + return score >= threshold +} diff --git a/assets/locales/interface/en_us.json b/assets/locales/interface/en_us.json index 778f45b53f..fdf0af138b 100644 --- a/assets/locales/interface/en_us.json +++ b/assets/locales/interface/en_us.json @@ -1006,6 +1006,7 @@ "task.SceneManager.focus.mod_check_failed_prefix": "UID display is incomplete. Enabling UID-hiding mods removes text in the upper-left corner of the screen, which affects recognition.", "task.SceneManager.focus.osd_check_failed": "Screen overlay detected. Close FPS/hardware monitoring overlays (e.g. FPS, CPU, GPU, Afterburner) and try again", "task.SceneManager.focus.language_not_zh_cn": "The game language is not Simplified Chinese. Compatibility is limited, and tasks may fail.", + "task.SceneManager.focus.screenshot_stable_abnormal": "Environment recognition is abnormal. Please launch the game with D3D11, or switch to windowed mode and retry.", "description.file": "locales/interface/DESCRIPTION/DESCRIPTION.en_us.md", "contact.file": "https://end.maafw.com/CONTACT/CONTACT.en_us.md", "operator.Perlica": "Perlica", diff --git a/assets/locales/interface/ja_jp.json b/assets/locales/interface/ja_jp.json index 2e19406b06..d7fdbe52e6 100644 --- a/assets/locales/interface/ja_jp.json +++ b/assets/locales/interface/ja_jp.json @@ -1006,6 +1006,7 @@ "task.SceneManager.focus.mod_check_failed_prefix": "UIDの表示が不完全です。UID非表示MODを有効にすると、画面左上の文字が欠落し、認識に影響します。", "task.SceneManager.focus.osd_check_failed": "画面にオーバーレイが検出されました。フレームレート/ハードウェア監視オーバーレイ(FPS、CPU、GPU、Afterburner など)を閉じてから再試行してください", "task.SceneManager.focus.language_not_zh_cn": "ゲーム言語が簡体字中国語ではありません。互換性が低く、タスクが失敗する可能性があります。", + "task.SceneManager.focus.screenshot_stable_abnormal": "現在の環境認識に異常があります。D3D11 でゲームを起動するか、ウィンドウモードに切り替えて再試行してください。", "description.file": "locales/interface/DESCRIPTION/DESCRIPTION.ja_jp.md", "contact.file": "https://end.maafw.com/CONTACT/CONTACT.ja_jp.md", "operator.Perlica": "ペリカ", diff --git a/assets/locales/interface/ko_kr.json b/assets/locales/interface/ko_kr.json index f21edeec60..b0d342548c 100644 --- a/assets/locales/interface/ko_kr.json +++ b/assets/locales/interface/ko_kr.json @@ -1006,6 +1006,7 @@ "task.SceneManager.focus.mod_check_failed_prefix": "UID 표시가 불완전합니다. UID 숨김 MOD를 켜면 화면 왼쪽 상단의 문자가 누락되어 인식에 영향을 줍니다.", "task.SceneManager.focus.osd_check_failed": "화면에 오버레이가 감지되었습니다. 프레임레이트/하드웨어 모니터링 오버레이(FPS, CPU, GPU, Afterburner 등)를 끈 후 다시 시도하세요", "task.SceneManager.focus.language_not_zh_cn": "게임 언어가 간체 중국어가 아닙니다. 호환성이 낮아 작업이 실패할 수 있습니다.", + "task.SceneManager.focus.screenshot_stable_abnormal": "현재 환경 인식이 비정상입니다. D3D11로 게임을 실행하거나 창 모드로 전환한 후 다시 시도하세요.", "description.file": "locales/interface/DESCRIPTION/DESCRIPTION.ko_kr.md", "contact.file": "https://end.maafw.com/CONTACT/CONTACT.ko_kr.md", "operator.Perlica": "펠리카", diff --git a/assets/locales/interface/zh_cn.json b/assets/locales/interface/zh_cn.json index 60bbda740e..30db46ffce 100644 --- a/assets/locales/interface/zh_cn.json +++ b/assets/locales/interface/zh_cn.json @@ -1006,6 +1006,7 @@ "task.SceneManager.focus.mod_check_failed_prefix": "UID显示不完整,开启UID隐藏MOD会导致画面左上方文字缺失,影响识别", "task.SceneManager.focus.osd_check_failed": "屏幕存在遮挡,请关闭帧率/硬件监控悬浮窗(如 FPS、CPU、GPU、Afterburner 等)后重试", "task.SceneManager.focus.language_not_zh_cn": "当前游戏语言不是简体中文,兼容性较差,任务可能会失败", + "task.SceneManager.focus.screenshot_stable_abnormal": "当前环境识别异常,请使用 D3D11 启动游戏,或切换到窗口化重试", "description.file": "locales/interface/DESCRIPTION/DESCRIPTION.zh_cn.md", "contact.file": "https://end.maafw.com/CONTACT/CONTACT.zh_cn.md", "operator.Perlica": "佩丽卡", diff --git a/assets/locales/interface/zh_tw.json b/assets/locales/interface/zh_tw.json index cfd2ae23a8..5949679e22 100644 --- a/assets/locales/interface/zh_tw.json +++ b/assets/locales/interface/zh_tw.json @@ -1006,6 +1006,7 @@ "task.SceneManager.focus.mod_check_failed_prefix": "UID顯示不完整,開啟UID隱藏MOD會導致畫面左上方文字缺失,影響識別", "task.SceneManager.focus.osd_check_failed": "螢幕存在遮擋,請關閉幀率/硬體監控懸浮窗(如 FPS、CPU、GPU、Afterburner 等)後重試", "task.SceneManager.focus.language_not_zh_cn": "當前遊戲語言不是簡體中文,相容性較差,任務可能會失敗", + "task.SceneManager.focus.screenshot_stable_abnormal": "當前環境識別異常,請使用 D3D11 啟動遊戲,或切換到視窗化重試", "description.file": "locales/interface/DESCRIPTION/DESCRIPTION.zh_tw.md", "contact.file": "https://end.maafw.com/CONTACT/CONTACT.zh_tw.md", "operator.Perlica": "佩麗卡", diff --git a/assets/resource/pipeline/Interface/Scene.json b/assets/resource/pipeline/Interface/Scene.json index 8bf2c96d6f..1bea8e919d 100644 --- a/assets/resource/pipeline/Interface/Scene.json +++ b/assets/resource/pipeline/Interface/Scene.json @@ -17,6 +17,7 @@ "[JumpBack]__ScenePrivateWorldStorySkip", "[JumpBack]__ScenePrivateLoggedOutConfirm", "[JumpBack]SceneWaitLoadingExit", + "[JumpBack]__ScenePrivateScreenshotStableAbnormal", "[JumpBack]__ScenePrivateAnyExit" ] }, diff --git a/assets/resource/pipeline/SceneManager/SceneCommon.json b/assets/resource/pipeline/SceneManager/SceneCommon.json index 61ed9eda90..71181cd605 100644 --- a/assets/resource/pipeline/SceneManager/SceneCommon.json +++ b/assets/resource/pipeline/SceneManager/SceneCommon.json @@ -13,6 +13,23 @@ }, "post_delay": 3000 }, + "__ScenePrivateScreenshotStableAbnormal": { + "desc": "连续画面不变时判定环境识别异常强制失败,部分用户vulcan全屏游戏时,所有截图api截取到的画面都是不动的", + "recognition": { + "type": "Custom", + "param": { + "custom_recognition": "ScreenshotStableRecognition" + } + }, + "action": "Custom", + "custom_action": "FalseAction", + "focus": { + "Node.Recognition.Succeeded": { + "content": "$task.SceneManager.focus.screenshot_stable_abnormal", + "display": "modal" + } + } + }, "__ScenePrivateLoggedOutConfirm": { "desc": "确认自动登出弹窗", "recognition": "And", diff --git a/tools/schema/custom.recognition.schema.json b/tools/schema/custom.recognition.schema.json index c81638ff3f..56fef8dce4 100644 --- a/tools/schema/custom.recognition.schema.json +++ b/tools/schema/custom.recognition.schema.json @@ -30,6 +30,7 @@ "ReceptionRoomExchangeCountdownWithinThresholdRecognition", "ReceptionRoomWaitExchangeKeepAliveDueRecognition", "ScheduleRecognition", + "ScreenshotStableRecognition", "SellProductCurrentBestOperator", "SellProductCurrentOperatorUncached", "SellProductOperatorCacheReady", From 1ddf0856b92e5970de3b2dddc6fd86e9f2b802c5 Mon Sep 17 00:00:00 2001 From: zmdyy0318 Date: Wed, 5 Aug 2026 01:18:43 +0800 Subject: [PATCH 4/7] =?UTF-8?q?refactor:=20=E5=88=87=E6=8D=A2=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7=E9=80=89=E6=8B=A9=E8=B4=A6=E5=8F=B7=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=20(#4766)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit close #4463 close #4573 close #4310 close #4633 close #4731 close #4217 close #3356 close #3371 close #3677 ## Summary by Sourcery 通过直接发送窗口消息而不是模拟物理光标移动,提升在 Windows 账户切换时点击操作的可靠性。 Bug Fixes: - 修复在 Windows 账户切换过程中选择账户时,由于基于光标的点击不可靠而导致的间歇性失败问题。 Enhancements: - 优化用于账户切换的 Windows 点击处理逻辑,改为使用基于 `PostMessage` 的激活方式,并将鼠标事件定向到目标窗口,而非执行全局光标操作。
Original summary in English ## Summary by Sourcery Improve reliability of Windows account switching clicks by sending window messages directly instead of simulating physical cursor movements. Bug Fixes: - Fix intermittent failures when selecting an account during Windows account switching caused by unreliable cursor-based clicks. Enhancements: - Refine Windows click handling for account switching to use PostMessage-based activation and mouse events targeted at the window rather than global cursor operations.
--- .../accountswitch/action_windows.go | 65 ++++++++---- .../image/AccountSwitch/LoginClose.png | Bin 0 -> 2327 bytes .../image/AccountSwitch/LoginSwitchIcon.png | Bin 0 -> 987 bytes assets/resource/pipeline/AccountSwitch.json | 93 +++++++++++------- 4 files changed, 102 insertions(+), 56 deletions(-) create mode 100644 assets/resource/image/AccountSwitch/LoginClose.png create mode 100644 assets/resource/image/AccountSwitch/LoginSwitchIcon.png diff --git a/agent/go-service/accountswitch/action_windows.go b/agent/go-service/accountswitch/action_windows.go index 91500ab8d1..f9ca5ea739 100644 --- a/agent/go-service/accountswitch/action_windows.go +++ b/agent/go-service/accountswitch/action_windows.go @@ -6,7 +6,6 @@ import ( "encoding/json" "fmt" "strings" - "time" "unsafe" maa "github.com/MaaXYZ/maa-framework-go/v4" @@ -17,10 +16,13 @@ import ( const ( swRestore = 9 - wmClose = 0x0010 - - mouseEventFLeftDown = 0x0002 - mouseEventFLeftUp = 0x0004 + wmClose = 0x0010 + wmActivate = 0x0006 + waActive = 1 + wmMouseMove = 0x0200 + wmLButtonDown = 0x0201 + wmLButtonUp = 0x0202 + mkLButton = 0x0001 awarenessContextPerMonitorAwareV2 = ^uintptr(3) // DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ) @@ -33,12 +35,12 @@ var ( procShowWindow = user32.NewProc("ShowWindow") procBringWindowToTop = user32.NewProc("BringWindowToTop") procSetForegroundWindow = user32.NewProc("SetForegroundWindow") - procSetCursorPos = user32.NewProc("SetCursorPos") - procMouseEvent = user32.NewProc("mouse_event") procSendMessageW = user32.NewProc("SendMessageW") + procPostMessageW = user32.NewProc("PostMessageW") procGetClientRect = user32.NewProc("GetClientRect") procGetWindowRect = user32.NewProc("GetWindowRect") procClientToScreen = user32.NewProc("ClientToScreen") + procScreenToClient = user32.NewProc("ScreenToClient") procSetThreadDpiCtx = user32.NewProc("SetThreadDpiAwarenessContext") ) @@ -242,7 +244,7 @@ func clickWindow(ctx *maa.Context, arg *maa.CustomActionArg, targetHwnd uintptr, Msg("mapped click point is outside target window rect") } - if !cursorClick(screenX, screenY) { + if !postClick(targetHwnd, screenX, screenY) { return false } @@ -400,29 +402,54 @@ func scaleCoord(value int, sourceSize int, targetSize int32) int32 { return int32((int64(value)*int64(targetSize) + int64(sourceSize)/2) / int64(sourceSize)) } -func cursorClick(screenX, screenY int32) bool { - if !setCursorPos(screenX, screenY) { +// PostMessage-style click (no physical cursor): activate + move/down/up on target hwnd. +func postClick(hwnd uintptr, screenX, screenY int32) bool { + pt := winPoint{X: screenX, Y: screenY} + if !screenToClient(hwnd, &pt) { log.Error(). Str("component", componentName). + Uint64("hwnd", uint64(hwnd)). Int32("screen_x", screenX). Int32("screen_y", screenY). - Msg("failed to move cursor for account switch click") + Msg("ScreenToClient failed for account switch click") + return false + } + + lParam := makeMouseLParam(pt.X, pt.Y) + sendMessage(hwnd, wmActivate, waActive, 0) + if !postMessage(hwnd, wmMouseMove, 0, lParam) { + return false + } + if !postMessage(hwnd, wmLButtonDown, mkLButton, lParam) { + return false + } + if !postMessage(hwnd, wmLButtonUp, 0, lParam) { return false } - time.Sleep(30 * time.Millisecond) - mouseEvent(mouseEventFLeftDown, 0, 0, 0, 0) - time.Sleep(50 * time.Millisecond) - mouseEvent(mouseEventFLeftUp, 0, 0, 0, 0) return true } -func setCursorPos(x, y int32) bool { - ret, _, _ := procSetCursorPos.Call(uintptr(x), uintptr(y)) +func makeMouseLParam(x, y int32) uintptr { + return uintptr(uint32(uint16(int16(x))) | uint32(uint16(int16(y)))<<16) +} + +func screenToClient(hwnd uintptr, point *winPoint) bool { + ret, _, _ := procScreenToClient.Call(hwnd, uintptr(unsafe.Pointer(point))) return ret != 0 } -func mouseEvent(flags, dx, dy, data, extraInfo uintptr) { - procMouseEvent.Call(flags, dx, dy, data, extraInfo) +func postMessage(hwnd, msg, wparam, lparam uintptr) bool { + ret, _, err := procPostMessageW.Call(hwnd, msg, wparam, lparam) + if ret != 0 { + return true + } + log.Error(). + Err(err). + Str("component", componentName). + Uint64("hwnd", uint64(hwnd)). + Uint64("msg", uint64(msg)). + Msg("PostMessageW failed for account switch click") + return false } func describeWindowSelector(param windowActionParam) string { diff --git a/assets/resource/image/AccountSwitch/LoginClose.png b/assets/resource/image/AccountSwitch/LoginClose.png new file mode 100644 index 0000000000000000000000000000000000000000..7bf22e2cb40e44820b879073b965f9299900e303 GIT binary patch literal 2327 zcmXw5eN>Y79{1ikuWxB!8JL;Uqm5HD=~0tpItyQ5!HPCBHqGP=Qgo^0AwzRv78sf$ zO-ac0LUm42d5p?S%&QUIHTH0~HPSLQMbT5iOdFbS_xEtm{ey>x-}9XB%jf&~em+Qd zGSip&hWL7Tcr2r3P+8!chE-UBph$`^>>I^t4~i z@+C%&m8W6l2~pA-=!mlgugmOLlf2{!br73>FHx6i!c7m5qohp`i4lYl31Vvq$G%k;lN+cLNiK4z@OfSRz-p z|Ji(1H|$WE%ne40WykMS?HQIY*AyimH*_Qj#{3<~HZ0df0`Q=zZK|Kh9B#%ote?{W zTVP#gDRRBZNTS`g77OV_w5kg(rc;gP+=hJwl@!WSoNgePr8F6-<+4DOHOqz0mpA_ES*iwUxR|HotI~YbwwULog@XsZK?dB9~)w zhKC;df8>*`Mk76_XFc48k90 z$5tPm9bE$9ylcn z{%SsgP%LE8Wu#uCS>j!aP(1_JCS9`jI2_S>y*@NF^v}gP=hVYhqTALPa5ww3%Msy2 zDoinqxHNUl6Xu-b(TUeHH?a8`d1@$F8&{x}k?vK_#iysIs}hCvgH=^txYJ>u z44+)Ph}`U2tOZK4Uv>;)a=7Lx8TfHtcLMqiL6DCZbGaD=LJZummgK4dGXQcbc#1OP z>IzJtP;5g(-(9@8E-d+|*&uRdf&J60Ac%{gMpn;@#^VApkfL$Jh{LAZyI#t{fR)=a zSkVMnGBw(~rF`zq-Pxh)z?t{2Zgw7;AP^&iIsRkim#wwRc7}6}@R7Or4xqH)vO)~< zhBh4s!DePgmTZsDSjt~%?;akh+j4mB&C<~4RY#gyw;U{8oG&-a9s*MSpZ9ev-+ZCa z^}Vv4M%_u@A0aK%W!}i16R+O#ZHxu3ntQ%f>~drW1O!NyuRS^w(Hxy^n;dyWseHcz zXhH^%FRJJB7W_nir{FFWA^jcTkfqH;C7J|t4jw#hN$vt$0iK>*SlCxAWb-K%GYwC3 zM0LW!%4U>B(-XS`0t5GETu^KSa{=0N$kE^V6;SJ2QYe@hNf4(JYYc`@z8#p~WWrUr zUI^z$)+WQIaE&of)_t&R;e@i}Wlwo@_CJl?-RsUJRnkEemM^9|-c4O%4ap1aZZPJU zvQdzR6^TS&cfKW0QSJ%s0m%!~U0@iP6yPL)KVg(1v+`+gU*CSAuz9d*N&Vo#c0l+` z3LNJa?O9)6XPoH=AVk4jQ$9hgz^>YqW4l?kaF8H&{y10PcJ#fpOnz0j*_10AT3ndB zm$)kW>!F?+zt_&Co>+!kF)$ca)Mt4Zj7^oVZU2R00W7`M)n%#vM_}*Zpgk6o0`Nbt z1Nze6IrRbBx!uwRv=5BwBh9S?+L92U>8M;>&;g_vZZ9-%MbA#? zn*`jmQC4zQ1J$_((A}8tR&qqSN9xU@1JUvW-Ez|qWf}6BJi*FdXP4Gx~0md3ikoC{zwDF1m6lg7r_JGfi(`ofT{Idn;t-IB~-v9S%B@9BJOR% zr10y2w9^WI6QS?k!E=^_#>r#XNw8Ta2}g4RFH_>(gW##?o|I#P=js`Fu5H1%P&p1C+rg89i?5Vf*nW{kUbOblA@Q2 z1uisnUm^HkVRY%93BzuBx4D-qOQHJ+d1_@z;W^&o+Gk%RhsS?cdmjAZ@t~zLsW-Oe GivJ7n|670n literal 0 HcmV?d00001 diff --git a/assets/resource/image/AccountSwitch/LoginSwitchIcon.png b/assets/resource/image/AccountSwitch/LoginSwitchIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..1e7be4e05e2504cdc47a99c5cfd4428ec93f8b9a GIT binary patch literal 987 zcmeAS@N?(olHy`uVBq!ia0vp^Qa~)t!3HFg#O7xMDaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9EWB_ParFHODzsG&VGB%&n3*T*V3KUXg?B|j-uuOhbqsG5Pn z#=fE;F*!T6L?J0PJu}Z%{r&F!>I#`Dw(8-gz6QPp&Z!xh9#uuD!Bu`C$yM3OmMQA? zcD!6R6;?nKa#KqZ6)JLb@`|l0Y?Z(UTLIZ1VSOb#o1&C7s~{IQs0tv@Rw<*Tq`*pF zzr4I$uiRKKzbIYb(9+UU-@r)U$VeBcLbtdwuOzWTH?LS3YJf{>adJ^+K}lwQo&w0g z#H9Sv5?iIx(##aAw8S*iq?8m>-K0e06kS8ZltkUc6k|i(6l3EQb5lbLqcp=LC8+f! znP~|7^NOLt01Oa)kc_^eo&m_oAhwl%QD!R86(B3^3~j*jC}KAHAcr71%nl*~^ed1B z4;fG}!9zDS4;ZB7z_8PqGJ_i!C3iht978<3-%hbU{m4P2ExuSR5(1lT^O^uJuuyZ2w!nc4DgJBa1c# zjsTIRVW;<1XrJ1|Gw=DsqMZ+__9}T!ikU0W3eV8W;Uc$y4arXQ1?hZBweRDR6AK|32IM!{@0R za-{=BHmWZ0d9o|-Y4?H0WxEf4uQg*k<#PV{=4+b|O;S0zey&Go=!;!^k<%1CgPu-G zm245%ayxg$s#A4*8q#ehz7K!fH7PjA9B Date: Tue, 4 Aug 2026 17:19:04 +0000 Subject: [PATCH 5/7] chore: Auto Templates Optimization Triggered by 1ddf0856b92e5970de3b2dddc6fd86e9f2b802c5 [skip changelog] --- .../image/AccountSwitch/LoginClose.png | Bin 2327 -> 890 bytes .../image/AccountSwitch/LoginSwitchIcon.png | Bin 987 -> 253 bytes .../optimize_templates/optimize_templates.json | 4 +++- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/resource/image/AccountSwitch/LoginClose.png b/assets/resource/image/AccountSwitch/LoginClose.png index 7bf22e2cb40e44820b879073b965f9299900e303..084da3c40a8e0dec757973ed32c11f35a224289a 100644 GIT binary patch delta 878 zcmV-!1Cjif68Z*^8Gi!+005u9@WcQB0P|2xR7EBxCMPE+EiEl9EG#Q4D=I1~G&D3; zR#s6_QC(eJhK7ZOg@jpIScHUwhlhqqNl1Txeu9F5h=_+=TwH;HfJaA0iHV4Tfq^qK zGfYfOetvyHK|n`GM^aK!OiW8ySXX_0d|6ppVPRlhU0r&5dVfYnMtFF5Jv}{ga&bUF zKu=FkKtMlxdwOhaYgANIDk>>NL_<70JaBMtHa0dvK|xbfQaCs`XJ=-5dU-`fMPOiH zUS3{aUR_2;MR|F6TU%OMT3Jg=OI1}=FfcGqPEA8YLn|vPgM)%nQc+u5TS`hvL_|bN zN=h#;FD@=FDSs&`C@3h?YZFrd00KfuL_t(|+GSIPlCwDslWeEl{%Q zC2Qc6gUa<_6t3D;%p~1t=Cr z3jPw7tfDgA_(@&XxO4znlE4fkCiW$PtOmom4sw_$M(u*eP876`SKU9 zX3Dly1k*-JN$Kb1#~*!o^Yn6?qA%Y1D(u(3{`8Z{2k&38j_#wNp%!Hx%={~t9OsfI7$gu%@~07*qoM6N<$ Eg6tQO3jhEB literal 2327 zcmXw5eN>Y79{1ikuWxB!8JL;Uqm5HD=~0tpItyQ5!HPCBHqGP=Qgo^0AwzRv78sf$ zO-ac0LUm42d5p?S%&QUIHTH0~HPSLQMbT5iOdFbS_xEtm{ey>x-}9XB%jf&~em+Qd zGSip&hWL7Tcr2r3P+8!chE-UBph$`^>>I^t4~i z@+C%&m8W6l2~pA-=!mlgugmOLlf2{!br73>FHx6i!c7m5qohp`i4lYl31Vvq$G%k;lN+cLNiK4z@OfSRz-p z|Ji(1H|$WE%ne40WykMS?HQIY*AyimH*_Qj#{3<~HZ0df0`Q=zZK|Kh9B#%ote?{W zTVP#gDRRBZNTS`g77OV_w5kg(rc;gP+=hJwl@!WSoNgePr8F6-<+4DOHOqz0mpA_ES*iwUxR|HotI~YbwwULog@XsZK?dB9~)w zhKC;df8>*`Mk76_XFc48k90 z$5tPm9bE$9ylcn z{%SsgP%LE8Wu#uCS>j!aP(1_JCS9`jI2_S>y*@NF^v}gP=hVYhqTALPa5ww3%Msy2 zDoinqxHNUl6Xu-b(TUeHH?a8`d1@$F8&{x}k?vK_#iysIs}hCvgH=^txYJ>u z44+)Ph}`U2tOZK4Uv>;)a=7Lx8TfHtcLMqiL6DCZbGaD=LJZummgK4dGXQcbc#1OP z>IzJtP;5g(-(9@8E-d+|*&uRdf&J60Ac%{gMpn;@#^VApkfL$Jh{LAZyI#t{fR)=a zSkVMnGBw(~rF`zq-Pxh)z?t{2Zgw7;AP^&iIsRkim#wwRc7}6}@R7Or4xqH)vO)~< zhBh4s!DePgmTZsDSjt~%?;akh+j4mB&C<~4RY#gyw;U{8oG&-a9s*MSpZ9ev-+ZCa z^}Vv4M%_u@A0aK%W!}i16R+O#ZHxu3ntQ%f>~drW1O!NyuRS^w(Hxy^n;dyWseHcz zXhH^%FRJJB7W_nir{FFWA^jcTkfqH;C7J|t4jw#hN$vt$0iK>*SlCxAWb-K%GYwC3 zM0LW!%4U>B(-XS`0t5GETu^KSa{=0N$kE^V6;SJ2QYe@hNf4(JYYc`@z8#p~WWrUr zUI^z$)+WQIaE&of)_t&R;e@i}Wlwo@_CJl?-RsUJRnkEemM^9|-c4O%4ap1aZZPJU zvQdzR6^TS&cfKW0QSJ%s0m%!~U0@iP6yPL)KVg(1v+`+gU*CSAuz9d*N&Vo#c0l+` z3LNJa?O9)6XPoH=AVk4jQ$9hgz^>YqW4l?kaF8H&{y10PcJ#fpOnz0j*_10AT3ndB zm$)kW>!F?+zt_&Co>+!kF)$ca)Mt4Zj7^oVZU2R00W7`M)n%#vM_}*Zpgk6o0`Nbt z1Nze6IrRbBx!uwRv=5BwBh9S?+L92U>8M;>&;g_vZZ9-%MbA#? zn*`jmQC4zQ1J$_((A}8tR&qqSN9xU@1JUvW-Ez|qWf}6BJi*FdXP4Gx~0md3ikoC{zwDF1m6lg7r_JGfi(`ofT{Idn;t-IB~-v9S%B@9BJOR% zr10y2w9^WI6QS?k!E=^_#>r#XNw8Ta2}g4RFH_>(gW##?o|I#P=js`Fu5H1%P&p1C+rg89i?5Vf*nW{kUbOblA@Q2 z1uisnUm^HkVRY%93BzuBx4D-qOQHJ+d1_@z;W^&o+Gk%RhsS?cdmjAZ@t~zLsW-Oe GivJ7n|670n diff --git a/assets/resource/image/AccountSwitch/LoginSwitchIcon.png b/assets/resource/image/AccountSwitch/LoginSwitchIcon.png index 1e7be4e05e2504cdc47a99c5cfd4428ec93f8b9a..31765c5145b483a8e6f828bbf7d6e2a8841edd24 100644 GIT binary patch delta 217 zcmV;~04D$22mJw%83+IX002jQz_*b;7k>b+Nkl`BztQYaKwaEsH1Pr1j4;FO{~lVNmny@-0ib_HL= zIb*b7KZNchyfDnUlVMEy*TA7QM)%}t9M{`3VH(F_$gI0%jZRMpWn`3BnhHdx3`U*u ziP1g-G*wf8tZRVEY>si T_N;p(00000NkvXXu0mjfwNYrH literal 987 zcmeAS@N?(olHy`uVBq!ia0vp^Qa~)t!3HFg#O7xMDaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9EWB_ParFHODzsG&VGB%&n3*T*V3KUXg?B|j-uuOhbqsG5Pn z#=fE;F*!T6L?J0PJu}Z%{r&F!>I#`Dw(8-gz6QPp&Z!xh9#uuD!Bu`C$yM3OmMQA? zcD!6R6;?nKa#KqZ6)JLb@`|l0Y?Z(UTLIZ1VSOb#o1&C7s~{IQs0tv@Rw<*Tq`*pF zzr4I$uiRKKzbIYb(9+UU-@r)U$VeBcLbtdwuOzWTH?LS3YJf{>adJ^+K}lwQo&w0g z#H9Sv5?iIx(##aAw8S*iq?8m>-K0e06kS8ZltkUc6k|i(6l3EQb5lbLqcp=LC8+f! znP~|7^NOLt01Oa)kc_^eo&m_oAhwl%QD!R86(B3^3~j*jC}KAHAcr71%nl*~^ed1B z4;fG}!9zDS4;ZB7z_8PqGJ_i!C3iht978<3-%hbU{m4P2ExuSR5(1lT^O^uJuuyZ2w!nc4DgJBa1c# zjsTIRVW;<1XrJ1|Gw=DsqMZ+__9}T!ikU0W3eV8W;Uc$y4arXQ1?hZBweRDR6AK|32IM!{@0R za-{=BHmWZ0d9o|-Y4?H0WxEf4uQg*k<#PV{=4+b|O;S0zey&Go=!;!^k<%1CgPu-G zm245%ayxg$s#A4*8q#ehz7K!fH7PjA9B Date: Tue, 4 Aug 2026 17:26:37 +0000 Subject: [PATCH 6/7] chore: generate MacOS keymap Triggered by ac954c1c8e4439098f9acefb43683b0a57211698 [skip changelog] --- assets/resource_macos/pipeline/MacOSKeyMap.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/assets/resource_macos/pipeline/MacOSKeyMap.json b/assets/resource_macos/pipeline/MacOSKeyMap.json index b18d9febfb..13c501d03b 100644 --- a/assets/resource_macos/pipeline/MacOSKeyMap.json +++ b/assets/resource_macos/pipeline/MacOSKeyMap.json @@ -98,6 +98,22 @@ } } }, + "GiftOperatorMoveResetBackward": { + "action": { + "type": "ClickKey", + "param": { + "key": 1 + } + } + }, + "GiftOperatorMoveResetForward": { + "action": { + "type": "ClickKey", + "param": { + "key": 13 + } + } + }, "GiftOperatorShiftToRunMapTracker": { "action": { "type": "ClickKey", From 09cbd73d7e569dac6fd00ed17a4a1f6ddf24cb84 Mon Sep 17 00:00:00 2001 From: "maaendbotapp[bot]" <305547419+maaendbotapp[bot]@users.noreply.github.com> Date: Tue, 4 Aug 2026 17:47:33 +0000 Subject: [PATCH 7/7] style: auto format code https://github.com/MaaEnd/MaaEnd/actions/runs/30935501929 [skip changelog] --- assets/locales/interface/en_us.json | 1 - assets/locales/interface/ja_jp.json | 1 - assets/locales/interface/ko_kr.json | 1 - assets/locales/interface/zh_cn.json | 1 - assets/locales/interface/zh_tw.json | 1 - .../resource/pipeline/IMS/item/ADVANCED_COGNITIVE_CARRIER.json | 2 +- .../resource/pipeline/IMS/item/WULING_ARTIFICING_CATALYST.json | 2 +- 7 files changed, 2 insertions(+), 7 deletions(-) diff --git a/assets/locales/interface/en_us.json b/assets/locales/interface/en_us.json index fdf0af138b..8d423725d4 100644 --- a/assets/locales/interface/en_us.json +++ b/assets/locales/interface/en_us.json @@ -1320,4 +1320,3 @@ "task.ProtocolSpace.focus.supply_plan.override_started.WEAPON_EXP": "Weapon EXP: Protocol Space target switched; start farming", "task.ProtocolSpace.focus.supply_plan.reward_item_met.WEAPON_EXP": "Weapon EXP target met; end current Protocol Space run" } - diff --git a/assets/locales/interface/ja_jp.json b/assets/locales/interface/ja_jp.json index d7fdbe52e6..535d730fed 100644 --- a/assets/locales/interface/ja_jp.json +++ b/assets/locales/interface/ja_jp.json @@ -1320,4 +1320,3 @@ "task.ProtocolSpace.focus.supply_plan.override_started.WEAPON_EXP": "武器経験 のプロトコル空間目標へ切り替え、周回を開始します", "task.ProtocolSpace.focus.supply_plan.reward_item_met.WEAPON_EXP": "武器経験 が目標達成のため、現在のプロトコル空間周回を終了します" } - diff --git a/assets/locales/interface/ko_kr.json b/assets/locales/interface/ko_kr.json index b0d342548c..5517c6a430 100644 --- a/assets/locales/interface/ko_kr.json +++ b/assets/locales/interface/ko_kr.json @@ -1320,4 +1320,3 @@ "task.ProtocolSpace.focus.supply_plan.override_started.WEAPON_EXP": "무기 경험: 프로토콜 공간 목표 전환, 파밍 시작", "task.ProtocolSpace.focus.supply_plan.reward_item_met.WEAPON_EXP": "무기 경험 목표 달성, 현재 프로토콜 공간 종료" } - diff --git a/assets/locales/interface/zh_cn.json b/assets/locales/interface/zh_cn.json index 30db46ffce..d07d673ce3 100644 --- a/assets/locales/interface/zh_cn.json +++ b/assets/locales/interface/zh_cn.json @@ -1320,4 +1320,3 @@ "task.ProtocolSpace.focus.supply_plan.override_started.WEAPON_EXP": "武器经验 协议空间目标已切换,开始刷取", "task.ProtocolSpace.focus.supply_plan.reward_item_met.WEAPON_EXP": "武器经验 目标已达标,结束当前协议空间刷取" } - diff --git a/assets/locales/interface/zh_tw.json b/assets/locales/interface/zh_tw.json index 5949679e22..249a75b454 100644 --- a/assets/locales/interface/zh_tw.json +++ b/assets/locales/interface/zh_tw.json @@ -1320,4 +1320,3 @@ "task.ProtocolSpace.focus.supply_plan.override_started.WEAPON_EXP": "武器經驗 協議空間目標已切換,開始刷取", "task.ProtocolSpace.focus.supply_plan.reward_item_met.WEAPON_EXP": "武器經驗 目標已達標,結束當前協議空間刷取" } - diff --git a/assets/resource/pipeline/IMS/item/ADVANCED_COGNITIVE_CARRIER.json b/assets/resource/pipeline/IMS/item/ADVANCED_COGNITIVE_CARRIER.json index 9d3d7a1997..43a9b403f9 100644 --- a/assets/resource/pipeline/IMS/item/ADVANCED_COGNITIVE_CARRIER.json +++ b/assets/resource/pipeline/IMS/item/ADVANCED_COGNITIVE_CARRIER.json @@ -31,8 +31,8 @@ "template": [ "IMS/item/ADVANCED_COGNITIVE_CARRIER_TEMPLATE.png" ], - "threshold": 0.85, //分数过低可能会和武陵精锻助剂混淆 "green_mask": true, + "threshold": 0.85, //分数过低可能会和武陵精锻助剂混淆 "order_by": "Score" } }, diff --git a/assets/resource/pipeline/IMS/item/WULING_ARTIFICING_CATALYST.json b/assets/resource/pipeline/IMS/item/WULING_ARTIFICING_CATALYST.json index 98c0145716..3c15cca96a 100644 --- a/assets/resource/pipeline/IMS/item/WULING_ARTIFICING_CATALYST.json +++ b/assets/resource/pipeline/IMS/item/WULING_ARTIFICING_CATALYST.json @@ -31,8 +31,8 @@ "template": [ "IMS/item/WULING_ARTIFICING_CATALYST_TEMPLATE.png" ], - "threshold": 0.85, //分数过低可能会和高级认知载体混淆 "green_mask": true, + "threshold": 0.85, //分数过低可能会和高级认知载体混淆 "order_by": "Score" } },