mirror of
https://github.com/MaaAssistantArknights/MaaAssistantArknights.git
synced 2026-07-16 01:40:46 +08:00
Co-authored-by: wlwxj <d1ve_wh4le@outlook.com> Co-authored-by: Rbqwow <55343783+Rbqwow@users.noreply.github.com> Co-authored-by: Constrat <56174894+Constrat@users.noreply.github.com> Co-authored-by: HX3N <scarlet7518@gmail.com> Co-authored-by: Wallsman <63186641+wallsman@users.noreply.github.com> Co-authored-by: Loong <wangl.cc@outlook.com> Co-authored-by: 神代綺凛 <i@loli.best> Co-authored-by: SherkeyXD <57581480+SherkeyXD@users.noreply.github.com>
619 lines
15 KiB
Markdown
619 lines
15 KiB
Markdown
---
|
|
order: 2
|
|
icon: material-symbols:u-turn-left
|
|
---
|
|
|
|
# 콜백 메세지 프로토콜
|
|
|
|
::: info 정보
|
|
콜백 메시지는 버전 업데이트를 통해 빠르게 변경되고 있으며 이 문서는 오래된 것일 수 있습니다. 최신 콘텐츠는 [C# 통합 소스 코드](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/dev/src/MaaWpfGui/Main/AsstProxy.cs)를 참조하세요.
|
|
:::
|
|
|
|
## 프로토타입
|
|
|
|
```cpp
|
|
typedef void(ASST_CALL* AsstCallback)(int msg, const char* details, void* custom_arg);
|
|
```
|
|
|
|
## 개요
|
|
|
|
- `int msg`
|
|
메시지 유형입니다.
|
|
|
|
```cpp
|
|
enum class AsstMsg
|
|
{
|
|
/* 전역 정보 */
|
|
InternalError = 0, // 내부 오류
|
|
InitFailed, // 초기화 실패
|
|
ConnectionInfo, // 연결 정보
|
|
AllTasksCompleted, // 모든 태스크가 완료되었는지 여부
|
|
AsyncCallInfo, // 비동기 호출 정보
|
|
/* TaskChain 정보 */
|
|
TaskChainError = 10000, // 태스크 체인 실행/인식 오류
|
|
TaskChainStart, // 태스크 체인 시작
|
|
TaskChainCompleted, // 태스크 체인 완료
|
|
TaskChainExtraInfo, // 태스크 체인에 대한 추가 정보
|
|
TaskChainStopped, // 태스크 체인 중지
|
|
/* SubTask 정보 */
|
|
SubTaskError = 20000, // 서브태스크 실행/인식 오류
|
|
SubTaskStart, // 서브태스크 시작
|
|
SubTaskCompleted, // 서브태스크 완료
|
|
SubTaskExtraInfo, // 서브태스크에 대한 추가 정보
|
|
SubTaskStopped, // 서브태스크 중지
|
|
};
|
|
```
|
|
|
|
- `const char* details`
|
|
메시지 세부사항, JSON 형식입니다. 또한 [필드 설명](#필드-설명)도 참조하세요.
|
|
- `void* custom_arg`
|
|
호출자의 사용자 정의 인수로, `AsstCreateEx` 인터페이스의 `custom_arg` 인수를 전달합니다. C 언어 기반 언어에서는 이를 통해 `this` 포인터를 전달할 수 있습니다.
|
|
|
|
## 필드 설명
|
|
|
|
### InternalError
|
|
|
|
할일
|
|
|
|
### InitFailed
|
|
|
|
```json
|
|
{
|
|
"what": string, // 오류 유형
|
|
"why": string, // 오류 원인
|
|
"details": object // 오류 세부사항
|
|
}
|
|
```
|
|
|
|
### ConnectionInfo
|
|
|
|
```json
|
|
{
|
|
"what": string, // 정보 유형
|
|
"why": string, // 정보 원인
|
|
"uuid": string, // UUID (연결 실패 시 빈 문자열)
|
|
"details": {
|
|
"adb": string, // AsstConnect 인터페이스의 adb_path 인수
|
|
"address": string, // AsstConnect 인터페이스의 address 인수
|
|
"config": string // AsstConnect 인터페이스의 config 인수
|
|
}
|
|
}
|
|
```
|
|
|
|
### 자주 사용되는 `what` 필드 값
|
|
|
|
- `ConnectFailed`
|
|
연결 실패.
|
|
- `Connected`
|
|
연결됨. 이제 `uuid` 필드는 비어 있습니다 (다음 단계에서 가져올 것입니다).
|
|
- `UuidGot`
|
|
UUID를 가져왔습니다.
|
|
- `UnsupportedResolution`
|
|
해상도가 지원되지 않습니다.
|
|
- `ResolutionError`
|
|
해상도를 가져올 수 없습니다.
|
|
- `Reconnecting`
|
|
연결이 끊어졌습니다 (adb/에뮬레이터 충돌), 재연결 중
|
|
- `Reconnected`
|
|
연결이 끊어졌습니다 (adb/에뮬레이터 충돌), 재연결 성공
|
|
- `Disconnect`
|
|
연결이 끊어졌습니다 (adb/에뮬레이터 충돌), 재연결 실패
|
|
- `ScreencapFailed`
|
|
스크린샷 실패 (adb/에뮬레이터 충돌), 재연결 실패
|
|
- `TouchModeNotAvailable`
|
|
터치 모드를 사용할 수 없습니다
|
|
|
|
### AsyncCallInfo
|
|
|
|
```json
|
|
{
|
|
"uuid": string, // UUID
|
|
"what": string, // 호출 유형, "Connect" | "Click" | "Screencap" | ...
|
|
"async_call_id": int, // 비동기 호출 ID, AsstAsyncXXX API를 호출한 결과 값입니다.
|
|
"details": {
|
|
"ret": bool, // 결과
|
|
"cost": int64, // 경과 시간 (밀리초)
|
|
}
|
|
}
|
|
```
|
|
|
|
### AllTasksCompleted
|
|
|
|
```json
|
|
{
|
|
"taskchain": string, // 마지막 태스크 체인
|
|
"uuid": string, // UUID
|
|
"finished_tasks": [ // 실행된 마지막 태스크의 ID 목록
|
|
int,
|
|
...
|
|
]
|
|
}
|
|
```
|
|
|
|
#### 자주 사용되는 `taskchain` 필드 값
|
|
|
|
- `StartUp`
|
|
시작.
|
|
- `CloseDown`
|
|
게임 클라이언트 닫기
|
|
- `Fight`
|
|
전투.
|
|
- `Mall`
|
|
상점.
|
|
- `Recruit`
|
|
자동 인원 모집.
|
|
- `Infrast`
|
|
시설.
|
|
- `Award`
|
|
일일 보상 받기
|
|
- `Roguelike`
|
|
로그라이크.
|
|
- `Copilot`
|
|
JSON 파일로 자동 전투
|
|
- `SSSCopilot`
|
|
JSON 파일로 자동 전투 for STATIONARY SECURITY SERVICE
|
|
- `Depot`
|
|
창고 인식
|
|
- `OperBox`
|
|
오퍼레이터 박스 인식
|
|
- `ReclamationAlgorithm`
|
|
Reclamation Algorithm (CN 클라이언트의 새로운 모드)
|
|
- `Custom`
|
|
사용자 정의 태스크
|
|
- `SingleStep`
|
|
단일 단계 태스크
|
|
- `VideoRecognition`
|
|
Copilot용 비디오 인식
|
|
- `Debug`
|
|
디버그.
|
|
|
|
### TaskChain과 관련된 정보
|
|
|
|
```json
|
|
{
|
|
"taskchain": string, // 현재 Task Chain
|
|
"taskid": int, // 현재 Task ID
|
|
"uuid": string // UUID
|
|
}
|
|
```
|
|
|
|
### TaskChainExtraInfo
|
|
|
|
할 일
|
|
|
|
### SubTask와 관련된 정보
|
|
|
|
```json
|
|
{
|
|
"subtask": string, // 서브태스크 이름
|
|
"class": string, // 서브태스크 클래스
|
|
"taskchain": string, // 현재 Task Chain
|
|
"taskid": int, // 현재 Task ID
|
|
"details": object, // 상세 정보
|
|
"uuid": string // UUID
|
|
}
|
|
```
|
|
|
|
#### 자주 사용되는 `subtask` 필드 값
|
|
|
|
- `ProcessTask`
|
|
|
|
```json
|
|
// 상세 정보에 대한 예시
|
|
{
|
|
"task": "StartButton2", // 태스크 이름
|
|
"action": 512,
|
|
"exec_times": 1, // 실행 횟수
|
|
"max_times": 999, // 최대 실행 횟수
|
|
"algorithm": 0
|
|
}
|
|
```
|
|
|
|
- 기타 할 일
|
|
|
|
##### 자주 사용되는 `task` 필드 값
|
|
|
|
- `StartButton2`
|
|
시작 중입니다.
|
|
- `MedicineConfirm`
|
|
이성 회복제 사용 확인.
|
|
- `ExpiringMedicineConfirm`
|
|
만료가 임박한 이성 회복 아이템을 사용 확인.
|
|
- `StoneConfirm`
|
|
오리지늄 조각 사용 확인.
|
|
- `RecruitRefreshConfirm`
|
|
공개모집 새로고침 여부 확인.
|
|
- `RecruitConfirm`
|
|
공개모집 확인.
|
|
- `RecruitNowConfirm`
|
|
즉시 완료 허가증 확인.
|
|
- `ReportToPenguinStats`
|
|
펭귄 스텟에 보고합니다.
|
|
- `ReportToYituliu`
|
|
Yituliu 빅데이터에 보고합니다.
|
|
- `InfrastDormDoubleConfirmButton`
|
|
기반시설 더블 확인 버튼입니다. 다른 오퍼레이터와 충돌이 있을 때만 발생합니다.
|
|
- `StartExplore`
|
|
통합전략: 시작 중입니다.
|
|
- `StageTraderInvestConfirm`
|
|
통합전략: 오리지늄 각뿔 아이템 거래.
|
|
- `StageTraderInvestSystemFull`
|
|
통합전략: 투자 시스템이 가득 참.
|
|
- `ExitThenAbandon`
|
|
통합전략: 나가기 확인.
|
|
- `MissionCompletedFlag`
|
|
통합전략: 미션 완료.
|
|
- `MissionFailedFlag`
|
|
통합전략: 미션 실패.
|
|
- `StageTraderEnter`
|
|
통합전략: 교활한 상인 진입.
|
|
- `StageSafeHouseEnter`
|
|
통합전략: 안전가옥 진입.
|
|
- `StageEncounterEnter`
|
|
통합전략: 우연한 만남 진입.
|
|
- `StageCombatDpsEnter`
|
|
통합전략: 작전 진입.
|
|
- `StageEmergencyDps`
|
|
통합전략: 긴급 작전 진입.
|
|
- `StageDreadfulFoe`
|
|
통합전략: 보스 진입.
|
|
- `StartGameTask`
|
|
클라이언트를 시작할 수 없음 (클라이언트 유형과 호환되지 않는 구성 파일).
|
|
- 기타 할 일
|
|
|
|
### SubTaskExtraInfo
|
|
|
|
```json
|
|
{
|
|
"taskchain": string, // 현재 Task Chain
|
|
"class": string, // 서브태스크 클래스
|
|
"what": string, // 정보 유형
|
|
"details": object, // 정보 상세 내용
|
|
"uuid": string, // UUID
|
|
}
|
|
```
|
|
|
|
#### 자주 사용되는 `what`과 `details` 필드 값
|
|
|
|
- `StageDrops`
|
|
스테이지 드롭 정보
|
|
|
|
```json
|
|
// 해당 details 필드 예시
|
|
{
|
|
"drops": [
|
|
// 인식된 드롭 아이템
|
|
{
|
|
"itemId": "3301",
|
|
"quantity": 2,
|
|
"itemName": "技巧概要·卷1"
|
|
},
|
|
{
|
|
"itemId": "3302",
|
|
"quantity": 1,
|
|
"itemName": "技巧概要·卷2"
|
|
},
|
|
{
|
|
"itemId": "3303",
|
|
"quantity": 2,
|
|
"itemName": "技巧概要·卷3"
|
|
}
|
|
],
|
|
"stage": {
|
|
// 스테이지 정보
|
|
"stageCode": "CA-5",
|
|
"stageId": "wk_fly_5"
|
|
},
|
|
"stars": 3, // 행동 종료 시 클리어 별 개수
|
|
"stats": [
|
|
// 해당 실행 기간 동안의 전체 드롭 아이템
|
|
{
|
|
"itemId": "3301",
|
|
"itemName": "技巧概要·卷1",
|
|
"quantity": 4,
|
|
"addQuantity": 2 //이번에 추가된 드롭 수량
|
|
},
|
|
{
|
|
"itemId": "3302",
|
|
"itemName": "技巧概要·卷2",
|
|
"quantity": 3,
|
|
"addQuantity": 1
|
|
},
|
|
{
|
|
"itemId": "3303",
|
|
"itemName": "技巧概要·卷3",
|
|
"quantity": 4,
|
|
"addQuantity": 2
|
|
}
|
|
]
|
|
}
|
|
|
|
```
|
|
|
|
- `RecruitTagsDetected`
|
|
공개모집 태그 감지
|
|
|
|
```json
|
|
// 상세 정보에 대한 예시
|
|
{
|
|
"tags": [
|
|
"费用回复",
|
|
"防护",
|
|
"先锋干员",
|
|
"辅助干员",
|
|
"近战位"
|
|
]
|
|
}
|
|
```
|
|
|
|
- `RecruitSpecialTag`
|
|
고급 특별 채용 감지
|
|
|
|
```json
|
|
// 상세 정보에 대한 예시
|
|
{
|
|
"tag": "高级资深干员" // 고급 특별 채용
|
|
}
|
|
```
|
|
|
|
- `RecruitResult`
|
|
공개모집 결과
|
|
|
|
```json
|
|
// 상세 정보에 대한 예시
|
|
{
|
|
"tags": [ // 모든 태그들, 반드시 5개여야 함
|
|
"削弱",
|
|
"减速",
|
|
"术师干员",
|
|
"辅助干员",
|
|
"近战位"
|
|
],
|
|
"level": 4, // ★ 총합
|
|
"result": [
|
|
{
|
|
"tags": [
|
|
"削弱"
|
|
],
|
|
"level": 4, // 태그의 최소 레어도
|
|
"opers": [
|
|
{
|
|
"name": "初雪",
|
|
"level": 5 // 오퍼레이터의 레어도
|
|
},
|
|
{
|
|
"name": "陨星",
|
|
"level": 5
|
|
},
|
|
{
|
|
"name": "槐琥",
|
|
"level": 5
|
|
},
|
|
{
|
|
"name": "夜烟",
|
|
"level": 4
|
|
},
|
|
{
|
|
"name": "流星",
|
|
"level": 4
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"tags": [
|
|
"减速",
|
|
"术师干员"
|
|
],
|
|
"level": 4,
|
|
"opers": [
|
|
{
|
|
"name": "夜魔",
|
|
"level": 5
|
|
},
|
|
{
|
|
"name": "格雷伊",
|
|
"level": 4
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"tags": [
|
|
"削弱",
|
|
"术师干员"
|
|
],
|
|
"level": 4,
|
|
"opers": [
|
|
{
|
|
"name": "夜烟",
|
|
"level": 4
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
- `RecruitTagsRefreshed`
|
|
공개모집 태그 갱신 완료
|
|
|
|
```json
|
|
// 상세 정보에 대한 예시
|
|
{
|
|
"count": 1, // 갱신된 슬롯의 횟수
|
|
"refresh_limit": 3 // 갱신 횟수 제한
|
|
}
|
|
```
|
|
|
|
- `RecruitNoPermit`
|
|
모집 라이센스가 없습니다
|
|
|
|
```json
|
|
// 상세 정보에 대한 예시
|
|
{
|
|
"continue": true, // 계속 새로고침할지 말지
|
|
}
|
|
```
|
|
|
|
- `RecruitTagsSelected`
|
|
공개모집 태그 선택 완료
|
|
|
|
```json
|
|
// 상세 정보에 대한 예시
|
|
{
|
|
"tags": [
|
|
"减速",
|
|
"术师干员"
|
|
]
|
|
}
|
|
```
|
|
|
|
- `RecruitSlotCompleted`
|
|
모집 슬롯 완료
|
|
- `RecruitError`
|
|
모집 인식 오류
|
|
- `EnterFacility`
|
|
기반시설 입장
|
|
|
|
```json
|
|
// 상세 정보에 대한 예시
|
|
{
|
|
"facility": "Mfg", // 시설 이름
|
|
"index": 0 // 시설 ID
|
|
}
|
|
```
|
|
|
|
- `NotEnoughStaff`
|
|
사용 가능한 오퍼레이터가 부족함
|
|
|
|
```json
|
|
// 상세 정보에 대한 예시
|
|
{
|
|
"facility": "Mfg", // 시설 이름
|
|
"index": 0 // 시설 ID
|
|
}
|
|
```
|
|
|
|
- `ProductOfFacility`
|
|
시설의 생산물
|
|
|
|
```json
|
|
// 상세 정보에 대한 예시
|
|
{
|
|
"product": "Money", // 생산물
|
|
"facility": "Mfg", // 시설 이름
|
|
"index": 0 // 시설 ID
|
|
}
|
|
```
|
|
|
|
- `StageInfo`
|
|
자동 전투 스테이지 정보
|
|
|
|
```json
|
|
// 상세 정보에 대한 예시
|
|
{
|
|
"name": string // 스테이지 이름
|
|
}
|
|
```
|
|
|
|
- `StageInfoError`
|
|
자동 전투 스테이지 정보 오류
|
|
- `PenguinId`
|
|
PenguinStats ID
|
|
|
|
```json
|
|
// 상세 정보에 대한 예시
|
|
{
|
|
"id": string
|
|
}
|
|
```
|
|
|
|
- `DepotInfo`
|
|
창고 인식 결과
|
|
|
|
```json
|
|
// 상세 정보에 대한 예시
|
|
// ArkPlanner 포맷만 지원합니다. 더 많은 포맷이 나중에 지원될 수 있습니다.
|
|
"arkplanner": {
|
|
"object": {
|
|
"items": [
|
|
{
|
|
"id": "2004",
|
|
"have": 4,
|
|
"name": "高级作战记录"
|
|
},
|
|
{
|
|
"id": "mod_unlock_token",
|
|
"have": 25,
|
|
"name": "模组数据块"
|
|
},
|
|
{
|
|
"id": "2003",
|
|
"have": 20,
|
|
"name": "中级作战记录"
|
|
}
|
|
],
|
|
"@type": "@penguin-statistics/depot"
|
|
},
|
|
"data": "{\"@type\":\"@penguin-statistics/depot\",\"items\":[{\"id\":\"2004\",\"have\":4,\"name\":\"高级作战记录\"},{\"id\":\"mod_unlock_token\",\"have\":25,\"name\":\"模组数据块\"},{\"id\":\"2003\",\"have\":20,\"name\":\"中级作战记录\"}]}"
|
|
},
|
|
"lolicon": { // https://arkntools.app/#/material
|
|
"object": {
|
|
"2004" : 4,
|
|
"mod_unlock_token": 25,
|
|
"2003": 20
|
|
|
|
|
|
},
|
|
"data": "{\"2003\":20,\"2004\": 4,\"mod_unlock_token\": 25}"
|
|
}
|
|
// 현재는 ArkPlanner와 Lolicon (Arkntools) 포맷만 지원하며, 미래에 더 많은 웹사이트가 지원될 예정입니다.
|
|
```
|
|
|
|
- `OperBoxInfo`
|
|
오퍼레이터 보유 목록 인식 결과
|
|
|
|
```json
|
|
// 상세 정보에 대한 예시
|
|
"done": bool, // 인식 완료 여부, false는 아직 진행 중임을 의미합니다 (진행 중인 데이터)
|
|
"all_oper": [
|
|
{
|
|
"id": "char_002_amiya",
|
|
"name": "阿米娅",
|
|
"own": true
|
|
},
|
|
{
|
|
"id": "char_003_kalts",
|
|
"name": "凯尔希",
|
|
"own": true
|
|
},
|
|
{
|
|
"id": "char_1020_reed2",
|
|
"name": "焰影苇草",
|
|
"own": false
|
|
},
|
|
]
|
|
"own_opers": [
|
|
{
|
|
"id": "char_002_amiya", // 오퍼레이터 ID
|
|
"name": "阿米娅", // 오퍼레이터 이름
|
|
"own": true, // 보유 여부
|
|
"elite": 2, // 정예화 단계 0, 1, 2
|
|
"level": 50, // 오퍼레이터 레벨
|
|
"potential": 6, // 오퍼레이터 잠재능력 [1, 6]
|
|
"rarity": 5 // [1, 6]
|
|
},
|
|
{
|
|
"id": "char_003_kalts",
|
|
"name": "凯尔希",
|
|
"own": true,
|
|
"elite": 2,
|
|
"level": 50,
|
|
"potential": 1,
|
|
"rarity": 6
|
|
}
|
|
]
|
|
```
|
|
|
|
- `UnsupportedLevel`
|
|
지원되지 않는 레벨 이름
|