feat: 支持会客室快捷置入线索与一键赠送重复线索 (#14966)

* feat: 支持会客室快捷置入线索与一键赠送重复线索

* docs: 更新文档

* chore: Auto update by pre-commit hooks [skip changelog]

* i18n: JP

* chore: Auto update by pre-commit hooks [skip changelog]

* i18n: sourcery ai suggestion

Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com>

* i18n: KR

* chore: 增加被注入的日志记录

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Manicsteiner <Manicsteiner@outlook.com>
Co-authored-by: Constrat <56174894+Constrat@users.noreply.github.com>
Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com>
Co-authored-by: HX3N <scarlet7518@gmail.com>
This commit is contained in:
uye
2025-12-08 19:48:57 +08:00
committed by GitHub
parent b6e236eda0
commit a5dfc573dd
11 changed files with 39 additions and 12 deletions

View File

@@ -21,7 +21,7 @@ icon: material-symbols:view-quilt-rounded
- Unrecognizable examples: `Rosmontis System`, `Pinus Sylvestris Knights`.
- When `Drone Usage` is set to `Trading Post - LMD`, the `Shamare Group` will be prioritized.
- Reception Room selects operators with corresponding clue affinity when only one clue type is missing; otherwise selects generic operators.
- Reception Room only sends clues when your collection is full, and sends only three at a time. To customize the number sent, modify the `ClueSelected` - `maxTimes` field in `resource/tasks/tasks.json` in the MAA directory.
- The Reception Room will attempt to send clues on every rotation. The Official (and Bilibili) clients added a "Oneclick Send Duplicate Clues" feature on 2025-12-05: when MAA detects this button, it will automatically click it to batch-send duplicate clues; EN/JP/KR are expected to support this feature in about 6 months, and TW in about 1 year (TW may get it earlier due to accelerated updates).
- Enabling `Do not place stationed operators in dormitory` prevents operators like `Irene` and `Logos` from being assigned to dormitories when not training in the Training Room, but also prevents operators with low morale in the Processing Station from being moved to dormitories.
- Control Center strategy is complex; currently only considers `Amiya`, `Swire`, `Kal'tsit`, `Team Rainbow`, and other operators with +0.05 morale bonus. This will be gradually optimized.
- You can select which facility types MAA should manage (all are selected by default).

View File

@@ -21,14 +21,14 @@ icon: material-symbols:view-quilt-rounded
- 非対応例:`ローズモンティス体系``レッドパイン騎士団`
- `ドローン用途``貿易所-龍門幣` を選択している場合、`シャマレグループ` を優先して判別・使用します
- 応接室で手がかりの不足が1種類のみの場合は、該当傾向のオペレーターを選択。それ以外は汎用オペレーターを選択します
- 自施設の手がかりが満杯の時のみ手がかりを送付します最大3個。個数は MAA フォルダ内 `resource/tasks/tasks.json``ClueSelected` - `maxTimes` を編集してください
- `配置済みオペレーターを寮に入れない` 設定により、`アイリーニ``ロゴス` などが訓練に未配置の際の寮入りを防止できます(ただし、加工施設でコンディション不足のオペレーターも移動しなくなります)
- 中枢システムの戦略は複雑なため、現時点では `アーミヤ``スワイヤー``ケルシー``レインボー小隊` およびコンディション +0.05 のオペレーターのみを考慮しています。順次最適化予定です
- 応接室は各シフト時に必ず手がかりの送付を試みます。公式Official、およびBilibiliクライアントは2025-12-05に「重複手がかりをワンクリックで送る」機能を追加しました。該当ボタンを検出した場合、MAAは自動でクリックして重複手がかりをまとめて送信します。EN/JP/KRは約6か月後、TWは約1年後に対応予定ですTWは開発進捗により早まる可能性があります
- `配置済みオペレーターを寮に入れない` 設定により、`アイリーニ``ロゴス` などが訓練に未配置の際の寮入りを防止できます(ただし、加工施設で体力不足のオペレーターも移動しなくなります)
- 制御中枢の戦略はあまりにも複雑で、現時点では `アーミヤ``スワイヤー``ケルシー``レインボー小隊` および体力 +0.05 回復のオペレーターのみを考慮しています。順次最適化予定です
- MAA が処理する対象施設は選択可能です(デフォルトは全選択)
## キューのローテーション
## シフト交代
- このモードは、まずゲーム内でプリセットキューを設定しておく必要があります。MAA が自動でローテーションを行います。
- このモードは、まずゲーム内でプリセットシフトを設定しておく必要があります。MAA が自動で交代を行います。
## 基地シフトのカスタマイズ

View File

@@ -21,7 +21,7 @@ icon: material-symbols:view-quilt-rounded
- 인식 불가 예시: `로즈몬티스 체계`, `피누스 실베스트리스`
- `드론 사용처``무역소-용문폐`로 지정되어 있을 경우, `샤마르`를 인식하고 드론을 아껴둘 것입니다.
- 응접실에서 단 한 종류의 단서가 부족하다면 해당 진영의 오퍼레이터가 선택됩니다. 그렇지 않은 경우 일반적인 오퍼레이터가 선택됩니다.
- 응접실이 꽉 차 있을 때만 단서를 내보낼 것입니다. 최대 3개의 단서가 전달니다. `resource/tasks/tasks.json`에서 `ClueSelected`-`maxTimes` 필드를 수정해 단서의 전달 개수를 조절할 수 있습니다.
- 응접실은 매 작업마다 단서를 전달하려고 시도합니다. 공식(Official, Bilibili) 클라이언트는 2025-12-05에 '중복 단서를 한 번에 보내기' 기능을 추가했습니다. 해당 버튼이 감지되면 MAA가 자동으로 클릭하여 중복 단서를 일괄 전달니다. EN/JP/KR은 약 6개월 내 지원될 예정이며, TW는 약 1년 후 지원될 예정입니다. (대만 서버는 진행 상황에 따라 더 빨리 지원될 수 있습니다)
- `아이린`, `로고스`나 다른 오퍼레이터가 당장 업무 중이 아니라는 이유로 숙소로 보내지는 것을 원치 않는다면, `업무중인 오퍼레이터 숙소 배치 제한` 옵션을 활성화할 수 있습니다. 단, 컨디션이 0이 아닌 한 어떤 오퍼레이터도 숙소로 들어오지 못하게 되는 문제를 불러올 수도 있습니다.
- 제어 센터의 복잡성으로 인해서, `아미야`, `스와이어`, `켈시`, `레인보우 팀`과 기타 시간당 컨디션 +0.05 오퍼레이터만이 고려됩니다. 향후 개선될 예정입니다.
- 필요한 시설 유형만 선택해 MAA가 처리하도록 할 수 있습니다. 기본값은 모두 선택되어있습니다

View File

@@ -21,7 +21,7 @@ icon: material-symbols:view-quilt-rounded
- 不可识别并使用的例子:`迷迭香体系``红松骑士团`
-`无人机用途` 选择 `贸易站-龙门币` ,则会额外识别 `巫恋组` 并优先为其使用。
- 会客室仅缺一个线索时,会选择对应线索倾向的干员,其余情况选择通用干员。
- 会客室仅当自有线索满时才会送出线索,并且只送三个。如需自定义单次送线索个数可修改 MAA 文件夹下 `resource/tasks/tasks.json` 中的 `ClueSelected` - `maxTimes` 字段
- 会客室每次换班都会尝试赠送线索。国服Official, BiliBili在 2025-12-05 新增了 「一键赠送重复线索」 功能当检测到该按钮时MAA 会自动点击以批量赠送重复线索EN/JP/KR 预计约 6 个月后会支持该功能TW 预计约 1 年后支持(由于台服正在赶进度可能会更早支持)
- 开启 `不将已进驻的干员放入宿舍` 设置项可避免 `艾丽妮``逻各斯` 等干员在训练室未训练时被进驻到宿舍,但同时也不会将加工站中心情不满的干员进驻宿舍。
- 控制中枢策略太过复杂,目前只考虑 `阿米娅``诗怀雅``凯尔希``彩虹小队` 及其他心情 +0.05 的干员,后续逐步优化。
- 可自行选择需要 MAA 处理的设施类别,默认全选。

View File

@@ -21,7 +21,7 @@ icon: material-symbols:view-quilt-rounded
- 不可識別並使用的例子:`迷迭香體系``紅松騎士團`
-`無人機用途` 選擇 `貿易站-龍門幣`,則會額外識別 `巫戀組` 並優先為其使用。
- 會客室僅缺一個線索時,會選擇對應線索傾向的幹員,其餘情況選擇通用幹員。
- 會客室僅當自有線索滿時才會送出線索,並且只送三個。如需自訂單次送線索個數可修改 MAA 資料夾下 `resource/tasks/tasks.json` 中的 `ClueSelected` - `maxTimes` 欄位
- 會客室每次換班都會嘗試贈送線索。國服Official、Bilibili於 2025-12-05 新增「一鍵贈送重複線索」功能偵測到該按鈕時MAA 會自動點擊以批量贈送重複線索EN/JP/KR 預計約 6 個月後支援TW 預計約 1 年後支援(由於台服正在趕進度,可能會較早支援)
- 開啟 `不將已進駐的幹員放入宿舍` 設定項可避免 `艾麗妮``邏各斯` 等幹員在訓練室未訓練時被進駐到宿舍,但同時也不會將加工站中心情不滿的幹員進駐宿舍。
- 控制中樞策略太過複雜,目前只考慮 `阿米婭``詩懷雅``凱爾希``彩虹小隊` 及其他心情 +0.05 的幹員,後續逐步優化。
- 可自行選擇需要 MAA 處理的設施類別,預設全選。

View File

@@ -3151,6 +3151,17 @@
"templThreshold": 0.9,
"roi": [200, 600, 700, 120]
},
"InfrastClueQuickInsert": {
"Doc": "快速置入:官服新增的批量置入线索按钮模板占位",
"action": "ClickSelf",
"roi": [1058, 572, 148, 148]
},
"InfrastClueQuickSendDuplicates": {
"Doc": "快速传递重复线索:批量传递重复线索按钮模板占位",
"action": "ClickSelf",
"roi": [34, 559, 154, 161],
"next": ["CloseSendClue"]
},
"ReceptionFlag": {
"roi": [350, 0, 200, 100]
},
@@ -3174,10 +3185,10 @@
},
"SendClues": {
"action": "ClickSelf",
"roi": [1157, 346, 84, 81],
"roi": [1160, 320, 80, 90],
"maskRange": [1, 255],
"postDelay": 1000,
"next": ["SelectClue", "CloseSendClue"]
"next": ["InfrastClueQuickSendDuplicates", "SelectClue", "CloseSendClue"]
},
"SelectClue": {
"action": "ClickSelf",

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -37,6 +37,7 @@ bool asst::InfrastReceptionTask::_run()
use_clue();
back_to_reception_main();
send_clue();
if (need_exit()) {
return false;
@@ -145,6 +146,16 @@ bool asst::InfrastReceptionTask::proc_clue_vacancy()
const static std::vector<std::string> clue_suffix = { "No1", "No2", "No3", "No4", "No5", "No6", "No7" };
cv::Mat image = ctrler()->get_image();
// 优先检测官服新增的“快捷置入”按钮,如果存在则点击一次执行批量置入,跳过逐个置入流程
const auto quick_insert_task = Task.get("InfrastClueQuickInsert");
Matcher quick_insert_matcher(image);
quick_insert_matcher.set_task_info(quick_insert_task);
if (quick_insert_matcher.analyze()) {
ctrler()->click(quick_insert_matcher.get_result().rect);
return true;
}
for (const std::string& clue : clue_suffix) {
if (need_exit()) {
return false;
@@ -190,11 +201,13 @@ bool asst::InfrastReceptionTask::unlock_clue_exchange()
bool asst::InfrastReceptionTask::back_to_reception_main()
{
ProcessTask(*this, { "EndOfClueExchange" }).set_retry_times(0).run();
return ProcessTask(*this, { "BackToReceptionMain" }).run();
// 国服有快捷置入后不会进入线索放置页面,不需要返回,多点一次快捷置入也无所谓
return ProcessTask(*this, { "InfrastClueQuickInsert", "BackToReceptionMain" }).run();
}
bool asst::InfrastReceptionTask::send_clue()
{
// 优先检测是否存在“快捷传递重复线索”按钮(官服特性),若存在则点击一次
ProcessTask task(*this, { "SendClues" });
return task.run();
}

View File

@@ -17,12 +17,14 @@ using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using MaaWpfGui.Helper;
using Serilog;
using Windows.Win32;
namespace MaaWpfGui.Utilities;
internal class BadModules
{
private static readonly ILogger _logger = Log.ForContext<BadModules>();
private static readonly string[] _names = [
"NahimicOSD.dll",
"AudioDevProps2.dll",
@@ -97,6 +99,7 @@ internal class BadModules
};
TaskDialog.ShowDialog(new WpfWin32Window(System.Windows.Application.Current.MainWindow), page);
_logger.Warning("Detected bad injected modules:\n{Modules}", sb.ToString());
static string BreakLongPath(string path, int maxLen)
{