依据游戏客户端Assembly-CSharp.dll反编译代码整理(Net.Packet.Mai2/Net.VO.Mai2命名空间)。 所有请求/响应结构均直接提取自游戏 VO 类定义,JSON 示例由脚本按字段类型自动生成。 对应数据版本:PRiSM PLUS。
1. 协议基础
1.1 传输方式
全部接口为 HTTP POST,请求/响应体均为二进制:
请求体 = AES-256-CBC( 4字节大端长度前缀 + JSON(请求VO) ) # AesKey/AesIV 见 1.3 响应体 = AES-256-CBC( JSON(响应VO) )- 客户端类:
NetHttpClient(加密CipherAES.Encrypt)、NetQuery<TReq, TResp>(VO 载体)。
1.2 URL 规则(端点名混淆)
Api = 端点名 + "MaimaiChn" # NetQuery 构造函数追加国服后缀
URL = {TitleServerBaseUri} + MD5( Api + "8bF76dE9" ) # MD5 小写十六进制, 盐值硬编码- 例:
GetUserMapApi→ 实际请求路径 =MD5("GetUserMapApiMaimaiChn8bF76dE9")。 TitleServerBaseUri由机器配置(OperationManager.GetBaseUri())给出。- 源码位置:
Net.Packet.Packet.Obfuscator()/NetQuery..ctor。
1.3 AES 参数
不知道
1.4 通用机制
- 分页:列表类下载接口的响应带
nextIndex;nextIndex != 0时须以该值再次请求直至为 0。 - 差量上传与 isNew 位图:
UpsertUserAllApi的每个列表只包含与上次服务器快照的差集; 配套的isNewXxxList字符串与数组按位对齐,"1"= 新增条目、"0"= 已有条目被修改 (源码VOExtensions.BuildListData,以 key 字段判重,如userMapList按mapId)。 - 登录流程:
Ping→UserLoginApi(取得loginId)→ 各GetUser*Api拉取数据 → 游玩 → 每曲UploadUserPlaylogApi→ 数据保存时UploadUserPortraitApi/UploadUserPhotoApi(如有)→UpsertUserAllApi→UserLogoutApi。 - 空请求体:部分接口的请求 VO 为空类(如
PingRequestVO、GameNgMusicIdRequestVO、GameWeeklyRequestVO等),示例中的{}即真实请求体。
1.5 请求头、会话与重试
| 项目 | 值 |
|---|---|
| HTTP 方法 | POST |
| Content-Type | application/json(另附加charset: UTF-8头,虽然载荷是加密二进制) |
| User-Agent | MD5(Api+盐值)#userId(userId=0的机器级接口为MD5(Api+盐值)#ClientId,见NetPacketUtil.GetUserAgent) |
| Cookie | UserLoginApi建立会话后由服务器下发,客户端在后续请求中原样携带(OperationManager.GetCookie) |
- 重试:包失败时自动重试;同一包重试次数达到
NetConfig.RetryCountToErrorWithSamePacket后转入错误流程并计入机器备份信息。 - 鉴权:请求 JSON 内携带
userId(UserAllRequestVO等同时带playlogId= 登录时服务器下发的loginId),没有独立签名头。
1.6 图片上传(UserPortrait / UserPhoto)
照片/头像不走独立二进制通道,仍是同一套 AES 加密 JSON:
UploadUserPortraitApi:UploadUserPortraitRequestVO { userPortrait },UserPortrait.divData为 JPG 的 Base64 字符串,大图按divNumber(当前分片号)/divLength(总分片数)分片上传, 另带placeId/clientId/uploadDate/fileName(文件名为{userId}.jpg)。UploadUserPhotoApi:同理携带UserPhoto(JPEG Base64 + trackNo)。
1.7 UpsertUserAll 差量对照表
UpsertUserAllApi 中各列表的差量判定键与 isNew 位图对应关系(源码 VOExtensions.ExportUserAll):
| UserAll 字段 | isNew 位图字段 | 去重键 | 说明 |
|---|---|---|---|
userData | — | — | 恒为单元素数组 |
userExtend | — | — | 恒为单元素数组 |
userOption | — | — | 恒为单元素数组 |
userGhost | — | — | 条件上传(NeedSave 时) |
userRatingList | — | — | 恒为单元素数组 |
userChargeList | — | — | 全量导出 |
userCharacterList | isNewCharacterList | characterId | 差量 |
userMapList | isNewMapList | mapId | 差量(舞里程) |
userLoginBonusList | isNewLoginBonusList | bonusId | 差量 |
userItemList | isNewItemList | itemId+itemKind | 差量(解锁列表) |
userMusicDetailList | isNewMusicDetailList | musicId+level | 差量(成绩) |
userCourseList | isNewCourseList | courseId | 差量 |
userFriendSeasonRankingList | isNewFriendSeasonRankingList | seasonId | 差量 |
userFavoriteList | isNewFavoriteList | 整对象比较 | 差量 |
userGamePlaylogList | — | — | 恒为本局 1 条聚合记录 |
userMissionDataList | — | — | 全量导出 |
userWeeklyData | — | — | 单对象 |
userActivityList | — | — | 恒为单元素数组(活动聚合) |
userIntimateList | isNewUserIntimateList | partnerId | 差量 |
userGetPointList | — | — | 全量导出 |
userTradeItemList | — | — | 全量导出 |
userKaleidxScopeList | isNewKaleidxScopeList | gateId | 差量(万花筒,含 isKeyFound) |
userFavoritemusicList | isNewFavoritemusicList | — | 恒置"0" |
user2pPlaylog | — | — | 2P 对战时才有 |
服务器合并原则:位图 "1" = INSERT(服务器无此 key)、"0" = UPDATE(已有此 key);无位图的字段整体覆盖。
2. API 详解
会话与基础
Ping — Ping(延迟探测)
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 3bae8c1162b3148abcfc38a89c03e3e7(= MD5("PingMaimaiChn8bF76dE9")) |
| Packet 类 | PacketPing |
| 请求 VO | PingRequestVO |
| 响应 VO | PingResponseVO |
| 触发时机 | 联网检测(Main/PingChecker) |
| 调用位置 | Main/PingChecker.cs |
网络连通性探测接口,也是全部接口中开销最小的一个。请求与响应均为(近乎)空对象,客户端 PingChecker 通过测量发出请求到收到响应的耗时得到往返延迟(毫秒),用于判定机器与服务器的在线状态;GameSetting.pingDisable 为 true 时可整体禁用该检测。
请求字段(PingRequestVO)
| 字段 | 类型 | 说明 |
|---|
响应字段(PingResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
result | string | — |
JSON 示例
请求(PingRequestVO):
{}响应(PingResponseVO):
{
"result": ""
}服务器实现要点
- 直接返回
{}或{"result": ""}即可,内容不参与逻辑 - 用于在线判定,延迟过高时客户端会提示网络异常
UserLoginApi — 用户登录
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 04dd218d2070685e728719b974f9b8c0(= MD5("UserLoginApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketUserLogin |
| 请求 VO | UserLoginRequestVO |
| 响应 VO | UserLoginResponseVO |
| 触发时机 | 进场/继续画面(Process.Entry/TryEntry、ContinueProcess) |
| 调用位置 | Process.Entry/TryEntry.cs、Process/ContinueProcess.cs |
玩家刷卡后建立会话的核心接口。请求携带 Aime 卡号(accessCode)、机厅与机器标识(placeId/clientId/regionId)、是否继续游玩(isContinue)等信息;响应中的 loginId 是整个会话的锚点——之后每一首曲子的 UploadUserPlaylogApi 与保存时的 UpsertUserAllApi 都要回传它作为 playlogId。响应同时返回登录统计(累计/连续登录天数),登录奖励(UserLoginBonus)的发放也以本次登录为触发点。
请求字段(UserLoginRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
accessCode | string | Aime 卡号 |
regionId | int | 地域 ID |
placeId | int | 机厅/店铺 ID |
clientId | string | 机器客户端标识 |
dateTime | long | — |
loginDateTime | long | 登录时间(Unix 秒) |
isContinue | bool | 是否为继续游玩(数据已存在) |
genericFlag | int | 通用标志 |
token | string | 会话令牌 |
响应字段(UserLoginResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
returnCode | int | 结果码 |
lastLoginDate | string | 上次登录日期 |
loginCount | int | 累计登录次数 |
consecutiveLoginCount | int | 连续登录次数 |
loginId | ulong | 本局会话 ID(后续所有上传的 playlogId 用它) |
loginDateTime | long | 登录时间(Unix 秒) |
token | string | 会话令牌 |
JSON 示例
请求(UserLoginRequestVO):
{
"userId": 100000000000000001,
"accessCode": "604012345678901234",
"regionId": 0,
"placeId": 0,
"clientId": "",
"dateTime": 0,
"loginDateTime": 0,
"isContinue": false,
"genericFlag": 0,
"token": ""
}响应(UserLoginResponseVO):
{
"returnCode": 1,
"lastLoginDate": "",
"loginCount": 0,
"consecutiveLoginCount": 0,
"loginId": 1,
"loginDateTime": 0,
"token": ""
}服务器实现要点
- 校验 accessCode 后创建会话,生成唯一的 loginId 返回
- isContinue 标记可区分新用户/老用户,决定是否走出块引导
- token 字段原样回填即可(客户端会保存并在预览等请求中回传)
- 响应会话 Cookie 需要下发,客户端后续请求会携带
GetUserPreviewApi — 刷卡预览
| 项目 | 内容 |
|---|---|
| 实际请求路径 | c8879fabbc5690846938b6b4290914bc(= MD5("GetUserPreviewApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserPreview |
| 请求 VO | UserPreviewRequestVO |
| 响应 VO | UserPreviewResponseVO |
| 触发时机 | 刷卡确认画面(Process.Entry/ConfirmPlay) |
| 调用位置 | Process.Entry/ConfirmPlay.cs、DebugGameMainObject.cs |
刷卡瞬间的"预览"接口,发生在 UserLoginApi 之前。以卡号派生的 userId 换取玩家的最小展示信息:昵称、Rating、图标/名牌/相框/搭档、最近游玩日期、封禁状态(banState)等,用于刷卡确认画面显示"欢迎回来"。同时以 isLogin 告知客户端该玩家是否已在别处登录,isInherit 标记是否存在可继承的数据。
请求字段(UserPreviewRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
segaIdAuthKey | string | — |
token | string | 会话令牌 |
clientId | string | 机器客户端标识 |
响应字段(UserPreviewResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
userName | string | 玩家昵称 |
isLogin | bool | 是否已在登录状态 |
lastGameId | string | — |
lastDataVersion | string | — |
lastRomVersion | string | — |
lastLoginDate | string | — |
lastPlayDate | string | — |
playerRating | int | DX Rating |
nameplateId | int | 名牌 ID |
iconId | int | 头像 ID |
trophyId | int | 称号 ID(旧字段) |
partnerId | int | 搭档 ID |
frameId | int | 相框 ID |
dispRate | int | 显示用 Rating |
totalAwake | int | 觉醒角色数 |
isNetMember | int | 是否网络会员 |
dailyBonusDate | string | 每日奖励领取日期 |
headPhoneVolume | int | — |
isInherit | bool | 是否存在可继承数据 |
banState | int | 封禁状态 |
errorId | int | 错误码 |
JSON 示例
请求(UserPreviewRequestVO):
{
"userId": 100000000000000001,
"segaIdAuthKey": "",
"token": "",
"clientId": ""
}响应(UserPreviewResponseVO):
{
"userId": 100000000000000001,
"userName": "玩家昵称",
"isLogin": false,
"lastGameId": "",
"lastDataVersion": "",
"lastRomVersion": "",
"lastLoginDate": "",
"lastPlayDate": "",
"playerRating": 0,
"nameplateId": 0,
"iconId": 0,
"trophyId": 0,
"partnerId": 0,
"frameId": 0,
"dispRate": 0,
"totalAwake": 0,
"isNetMember": 0,
"dailyBonusDate": "",
"headPhoneVolume": 0,
"isInherit": false,
"banState": 0,
"errorId": 0
}服务器实现要点
- 未登录数据时返回 errorId 相应错误码,客户端走出块/错误流程
- banState 非 0 时客户端禁止进入游玩
- 不需要 Cookie,属于登录前接口
UserLogoutApi — 用户登出
| 项目 | 内容 |
|---|---|
| 实际请求路径 | aaa0817a628ae9cc3df35b120ecb33a4(= MD5("UserLogoutApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketUserLogout |
| 请求 VO | UserLogoutRequest2VO/UserLogoutRequestVO |
| 响应 VO | UserLogoutResponseVO |
| 触发时机 | 数据保存末尾(StateULUserLogout);强制登出走 NetPacketUtil.ForcedUserLogout |
| 调用位置 | UserDataULState/StateULUserLogout.cs、Net/NetPacketUtil.cs(强制登出) |
结束会话。在数据保存状态机(StateULUserLogout)的最后调用,也用于服务器触发强制登出(NetPacketUtil.ForcedUserLogout)。请求带卡号、机厅信息与登出类型(LogoutType)。本接口在源码中存在两个请求 VO(UserLogoutRequestVO / UserLogoutRequest2VO),现行保存流程使用 Request2VO,两者字段高度重合。
请求字段(UserLogoutRequest2VO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
accessCode | string | — |
regionId | int | 地域 ID |
placeId | int | 机厅/店铺 ID |
clientId | string | 机器客户端标识 |
loginDateTime | long | 登录时间(Unix 秒) |
type | int | — |
delayLog | DelayLog | 嵌套数据对象 |
响应字段(UserLogoutResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
returnCode | int | 结果码(1 = 成功) |
请求变体字段(UserLogoutRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
accessCode | string | Aime 卡号 |
regionId | int | 地域 ID |
placeId | int | 机厅/店铺 ID |
clientId | string | 机器客户端标识 |
loginDateTime | long | 登录时间(Unix 秒) |
type | int | 登出类型(LogoutType) |
JSON 示例
请求(UserLogoutRequest2VO):
{
"userId": 100000000000000001,
"accessCode": "604012345678901234",
"regionId": 0,
"placeId": 0,
"clientId": "",
"loginDateTime": 0,
"type": 0,
"delayLog": {
"dlRequests": 0,
"dlSize": 0,
"dlRetry": 0,
"loginMsec": 0,
"saveMsec": 0,
"reductionMusic": 0,
"reductionItem": 0
}
}响应(UserLogoutResponseVO):
{
"returnCode": 1
}服务器实现要点
- 清理会话与 Cookie
- LogoutType 枚举见附录 B.2
- returnCode 返回 1 即可
全局配置下载(机器级)
GetGameSettingApi — 全局游戏设定
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 83a5d5a20b062c5c2ad817460b8f7f76(= MD5("GetGameSettingApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetGameSetting |
| 请求 VO | GameSettingRequestVO |
| 响应 VO | GameSettingResponseVO |
| 触发时机 | 开机/联网时(Manager.Operation/DataDownloaderMai2 统一拉取) |
| 调用位置 | Manager.Operation/DataDownloaderMai2.cs |
机器级全局设定接口,开机联网时由 DataDownloaderMai2 拉取。响应中的 GameSetting 共 25 个字段,直接控制客户端行为:维护模式(isMaintenance)、计划重启窗口(rebootStartTime/EndTime)、各功能服务器地址(movieServerUri/deliverServerUri 等)、包超时与重试参数(packetTimeout/packetRetryCount)、照片与改名开关(uploadPhotoDisable/nameEntryDisable)等。
请求字段(GameSettingRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
placeId | int | 机厅/店铺 ID |
clientId | string | 机器客户端标识 |
响应字段(GameSettingResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
isAouAccession | bool | AOU 协作标记 |
gameSetting | GameSetting | 嵌套数据对象 |
JSON 示例
请求(GameSettingRequestVO):
{
"placeId": 0,
"clientId": ""
}响应(GameSettingResponseVO):
{
"isAouAccession": false,
"gameSetting": {
"isMaintenance": false,
"requestInterval": 0,
"rebootStartTime": "",
"rebootEndTime": "",
"movieUploadLimit": 0,
"movieStatus": 0,
"movieServerUri": "",
"deliverServerUri": "",
"oldServerUri": "",
"usbDlServerUri": "",
"rebootInterval": 0,
"pingDisable": false,
"packetTimeout": 0,
"packetTimeoutLong": 0,
"packetRetryCount": 0,
"userDataDlErrTimeout": 0,
"userDataDlErrRetryCount": 0,
"userDataDlErrSamePacketRetryCount": 0,
"userDataUpSkipTimeout": 0,
"userDataUpSkipRetryCount": 0,
"iconPhotoDisable": false,
"uploadPhotoDisable": false,
"nameEntryDisable": false,
"packetRecreateCount": 0,
"collectDelayInfoDisable": false
}
}服务器实现要点
- 这是最优先实现的接口之一,字段值不合理会导致客户端行为异常
- 超时/重试字段建议给宽松值(私有服务器网络延迟波动大)
- isMaintenance=true 时客户端直接进入维护状态,可用于停服维护
备注
- 响应外层的 isAouAccession 为 AOU 协作标记,false 即可
GetGameEventApi — 运营活动列表
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 7d5f84520d9ce62ab1378ba9295ae6c0(= MD5("GetGameEventApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetGameEvent |
| 请求 VO | GameEventRequestVO |
| 响应 VO | GameEventResponseVO |
| 触发时机 | 开机/联网时(DataDownloaderMai2) |
| 调用位置 | Manager.Operation/DataDownloaderMai2.cs |
拉取当前生效的运营活动列表。请求以 type 区分活动大类、isAllEvent 决定是否包含未开始的;响应为 {type, startDate, endDate} 列表。活动驱动游戏内的加点、加成与解禁日程(与 Music.xml 的 eventName 活动体系联动)。
请求字段(GameEventRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
type | int | — |
isAllEvent | bool | — |
响应字段(GameEventResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
type | int | — |
gameEventList | GameEvent[] | GameEvent对象数组 |
JSON 示例
请求(GameEventRequestVO):
{
"type": 0,
"isAllEvent": false
}响应(GameEventResponseVO):
{
"type": 0,
"gameEventList": [
{
"type": 0,
"id": 0,
"startDate": "",
"endDate": ""
}
]
}服务器实现要点
- 返回空列表即表示无活动
- 日期格式为字符串(yyyyMMdd 或带时间,客户端按字符串解析)
GetGameChargeApi — 收费项配置
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 0b76ce1027c131c38dffa0e9df6685e7(= MD5("GetGameChargeApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetGameCharge |
| 请求 VO | GameChargeRequestVO |
| 响应 VO | GameChargeResponseVO |
| 触发时机 | 开机/联网时(DataDownloaderMai2) |
| 调用位置 | Manager.Operation/DataDownloaderMai2.cs |
收费项定义接口:通行证/门票等可购买项目的 orderId、chargeId、price 与销售起止日期。玩家使用收费项后产生的持有状态由 GetUserChargeApi 下载、UserChargelog 上传。
请求字段(GameChargeRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
isAll | bool | 是否拉取全部 |
响应字段(GameChargeResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
length | long | 数据总条数 |
gameChargeList | GameCharge[] | GameCharge对象数组 |
JSON 示例
请求(GameChargeRequestVO):
{
"isAll": false
}响应(GameChargeResponseVO):
{
"length": 30,
"gameChargeList": [
{
"orderId": 0,
"chargeId": 0,
"price": 0,
"startDate": "",
"endDate": ""
}
]
}服务器实现要点
- isAll=true 时返回全部定义
- chargeId 与 UserCharge.chargeId、UserChargelog.chargeId 对应
GetGameRankingApi — 排行数据
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 350eb7653764514aba71e9f05195a114(= MD5("GetGameRankingApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetGameRanking |
| 请求 VO | GameRankingRequestVO |
| 响应 VO | GameRankingResponseVO |
| 触发时机 | 开机/联网时(DataDownloaderMai2) |
| 调用位置 | Manager.Operation/DataDownloaderMai2.cs |
排行榜数据接口,请求参数 type 区分榜单种类(人气曲投票、周排行等),响应为 {id, point, userName} 列表,展示在选曲/大厅的排行界面。
请求字段(GameRankingRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
type | long | — |
响应字段(GameRankingResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
type | long | — |
gameRankingList | GameRanking[] | GameRanking对象数组 |
JSON 示例
请求(GameRankingRequestVO):
{
"type": 0
}响应(GameRankingResponseVO):
{
"type": 0,
"gameRankingList": [
{
"id": 0,
"point": 0,
"userName": "玩家昵称"
}
]
}服务器实现要点
- 可返回空列表隐藏该功能入口
GetGameNgMusicIdApi — 禁用曲目列表
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 56f900a8accd3b0cff452f897673e08b(= MD5("GetGameNgMusicIdApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetGameNgMusicId |
| 请求 VO | GameNgMusicIdRequestVO |
| 响应 VO | GameNgMusicIdResponseVO |
| 触发时机 | 开机/联网时(DataDownloaderMai2) |
| 调用位置 | Manager.Operation/DataDownloaderMai2.cs |
禁用曲目(GameNG)列表接口。请求体为空对象,响应为 musicIdList。列表中的曲目在选曲时被排除(与本地 OperationManager.IsGameNgMusicId 配合)。
请求字段(GameNgMusicIdRequestVO)
| 字段 | 类型 | 说明 |
|---|
响应字段(GameNgMusicIdResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
length | long | 数据总条数 |
musicIdList | int[] | int对象数组 |
JSON 示例
请求(GameNgMusicIdRequestVO):
{}响应(GameNgMusicIdResponseVO):
{
"length": 30,
"musicIdList": [
0
]
}服务器实现要点
- 空列表即可;注意响应外层有 length 字段表示条数
GetGameMusicScoreApi — 谱面成绩数据
| 项目 | 内容 |
|---|---|
| 实际请求路径 | daec756d648d1ef873fdd756af23ce3a(= MD5("GetGameMusicScoreApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetGameMusicScore |
| 请求 VO | GameMusicScoreRequestVO |
| 响应 VO | GameMusicScoreResponseVO |
| 触发时机 | 开机/联网时(DataDownloaderMai2) |
| 调用位置 | Manager.Operation/DataDownloaderMai2.cs |
按 (musicId, level, type) 三元组查询单个谱面的成绩数据,响应为单个 MusicScore(scoreData 为字符串载荷,内容按 type 解释)。用于成绩排行/谱面成绩参考的按需查询。
请求字段(GameMusicScoreRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
musicId | int | — |
level | int | — |
type | int | — |
响应字段(GameMusicScoreResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
gameMusicScore | MusicScore | 嵌套数据对象 |
JSON 示例
请求(GameMusicScoreRequestVO):
{
"musicId": 11820,
"level": 3,
"type": 0
}响应(GameMusicScoreResponseVO):
{
"gameMusicScore": {
"musicId": 11820,
"level": 3,
"type": 0,
"scoreData": ""
}
}服务器实现要点
- 无数据时返回空 scoreData 即可
GetGameTournamentInfoApi — 锦标赛信息
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 0f417a8cb8aedeb91863772524afe742(= MD5("GetGameTournamentInfoApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetGameTournamentInfo |
| 请求 VO | GameTournamentInfoRequestVO |
| 响应 VO | GameTournamentInfoResponseVO |
| 触发时机 | 开机/联网时(DataDownloaderMai2) |
| 调用位置 | Manager.Operation/DataDownloaderMai2.cs |
锦标赛(官方比赛活动)信息接口,返回活动定义列表(含比赛曲目等),供比赛模式使用。
请求字段(GameTournamentInfoRequestVO)
| 字段 | 类型 | 说明 |
|---|
响应字段(GameTournamentInfoResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
length | long | 数据总条数 |
gameTournamentInfoList | GameTournamentInfo[] | GameTournamentInfo对象数组 |
JSON 示例
请求(GameTournamentInfoRequestVO):
{}响应(GameTournamentInfoResponseVO):
{
"length": 30,
"gameTournamentInfoList": [
{
"tournamentId": 0,
"tournamentName": "",
"rankingKind": 0,
"scoreType": 0,
"noticeStartDate": "",
"noticeEndDate": "",
"startDate": "",
"endDate": "",
"entryStartDate": "",
"entryEndDate": "",
"gameTournamentMusicList": [
{}
]
}
]
}服务器实现要点
- 无比赛时返回空列表
GetGameWeeklyDataApi — 每周数据
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 567cb78b9456b5702270f1830af45705(= MD5("GetGameWeeklyDataApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetGameWeeklyData |
| 请求 VO | GameWeeklyRequestVO |
| 响应 VO | GameWeeklyResponseVO |
| 触发时机 | 开机/联网时(DataDownloaderMai2) |
| 调用位置 | Manager.Operation/DataDownloaderMai2.cs |
每周运营数据接口,返回单个 GameWeeklyData 对象(周任务/周排行等每周刷新内容)。
请求字段(GameWeeklyRequestVO)
| 字段 | 类型 | 说明 |
|---|
响应字段(GameWeeklyResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
gameWeeklyData | GameWeeklyData | 嵌套数据对象 |
JSON 示例
请求(GameWeeklyRequestVO):
{}响应(GameWeeklyResponseVO):
{
"gameWeeklyData": {
"missionCategory": 0,
"updateDate": "",
"beforeDate": ""
}
}服务器实现要点
- 可返回默认结构
GetGameKaleidxScopeApi — 万花筒全局配置
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 90e3c71c5c9dad8bcb897cd80878aa2f(= MD5("GetGameKaleidxScopeApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetGameKaleidxScope |
| 请求 VO | GameKaleidxScopeRequestVO |
| 响应 VO | GameKaleidxScopeResponseVO |
| 触发时机 | 开机/联网时(DataDownloaderMai2) |
| 调用位置 | Manager.Operation/DataDownloaderMai2.cs |
万花筒(カレイドスコープ)模式的全局配置:门/钥匙的日程与章节定义。个人进度则由 GetUserKaleidxScopeApi / UpsertUserAll 的 userKaleidxScopeList 承载。
请求字段(GameKaleidxScopeRequestVO)
| 字段 | 类型 | 说明 |
|---|
响应字段(GameKaleidxScopeResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
gameKaleidxScopeList | GameKaleidxScope[] | GameKaleidxScope对象数组 |
JSON 示例
请求(GameKaleidxScopeRequestVO):
{}响应(GameKaleidxScopeResponseVO):
{
"gameKaleidxScopeList": [
{
"gateId": 0,
"phaseId": 0
}
]
}服务器实现要点
- 私有服务器若不开放万花筒玩法可返回空列表
玩家数据下载
GetUserDataApi — 用户主数据
| 项目 | 内容 |
|---|---|
| 实际请求路径 | fd656c2487aa5ed41c6a0012f0000288(= MD5("GetUserDataApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserData |
| 请求 VO | UserDetailRequestVO |
| 响应 VO | UserDetailResponseVO |
| 触发时机 | 刷卡登录后由下载状态机一次性拉取(StateUserDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
用户主数据接口,返回 UserDetail(82 字段)——昵称、当前外观(头像/名牌/称号/相框/搭档)、当前选择的舞里程地图(selectMapId)、Rating 与段位、累计统计(游玩数、各难度 DXScore/达成率合计)、同行角色编成(charaSlot)、舞里程结转(mapStock)等。响应额外带 banState。是所有下载数据中最核心的一份。
请求字段(UserDetailRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
响应字段(UserDetailResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
userData | UserDetail | 嵌套数据对象 |
banState | int | — |
JSON 示例
请求(UserDetailRequestVO):
{
"userId": 100000000000000001
}响应(UserDetailResponseVO):
{
"userId": 100000000000000001,
"userData": {
"accessCode": "604012345678901234",
"userName": "玩家昵称",
"isNetMember": 0,
"point": 0,
"totalPoint": 0,
"iconId": 0,
"plateId": 0,
"titleId": 0,
"partnerId": 0,
"frameId": 0,
"selectMapId": 0,
"totalAwake": 0,
"gradeRating": 0,
"musicRating": 0,
"playerRating": 0,
"highestRating": 0,
"gradeRank": 0,
"classRank": 0,
"courseRank": 0,
"charaSlot": [
0
],
"charaLockSlot": [
0
],
"contentBit": 0,
"playCount": 0,
"currentPlayCount": 0,
"renameCredit": 0,
"mapStock": 0,
"eventWatchedDate": "",
"lastGameId": "",
"lastRomVersion": "",
"lastDataVersion": "",
"lastLoginDate": "",
"lastPlayDate": "",
"lastPlayCredit": 0,
"lastPlayMode": 0,
"lastPlaceId": 0,
"lastPlaceName": "",
"lastAllNetId": 0,
"lastRegionId": 0,
"lastRegionName": "",
"lastClientId": "",
"lastCountryCode": "",
"lastSelectEMoney": 0,
"lastSelectTicket": 0,
"lastSelectCourse": 0,
"lastCountCourse": 0,
"firstGameId": "",
"firstRomVersion": "",
"firstDataVersion": "",
"firstPlayDate": "",
"compatibleCmVersion": "",
"dailyBonusDate": "",
"dailyCourseBonusDate": "",
"lastPairLoginDate": "",
"lastTrialPlayDate": "",
"playVsCount": 0,
"playSyncCount": 0,
"winCount": 0,
"helpCount": 0,
"comboCount": 0,
"totalDeluxscore": 0,
"totalBasicDeluxscore": 0,
"totalAdvancedDeluxscore": 0,
"totalExpertDeluxscore": 0,
"totalMasterDeluxscore": 0,
"totalReMasterDeluxscore": 0,
"totalSync": 0,
"totalBasicSync": 0,
"totalAdvancedSync": 0,
"totalExpertSync": 0,
"totalMasterSync": 0,
"totalReMasterSync": 0,
"totalAchievement": 0,
"totalBasicAchievement": 0,
"totalAdvancedAchievement": 0,
"totalExpertAchievement": 0,
"totalMasterAchievement": 0,
"totalReMasterAchievement": 0,
"playerOldRating": 0,
"playerNewRating": 0,
"banState": 0,
"friendRegistSkip": 0,
"dateTime": 0
},
"banState": 0
}服务器实现要点
- 新用户首次登录时返回按默认值填充的 UserDetail
- charaSlot 为空时客户端会让玩家编成角色
- banState 返回 0
GetUserExtendApi — 用户扩展数据
| 项目 | 内容 |
|---|---|
| 实际请求路径 | e5b07e91061eeac6aa10cb102d02bfc9(= MD5("GetUserExtendApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserExtend |
| 请求 VO | UserExtendRequestVO |
| 响应 VO | UserExtendResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
用户扩展数据:选曲光标位置(selectMusicId/categoryIndex/musicIndex)、排序偏好、拍照条款同意标记(isPhotoAgree)、结算画面设置等 16 个字段。属于"玩家上次离开时的状态"记忆。
请求字段(UserExtendRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
响应字段(UserExtendResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
userExtend | UserExtend | 嵌套数据对象 |
JSON 示例
请求(UserExtendRequestVO):
{
"userId": 100000000000000001
}响应(UserExtendResponseVO):
{
"userId": 100000000000000001,
"userExtend": {
"selectMusicId": 0,
"selectDifficultyId": 0,
"categoryIndex": 0,
"musicIndex": 0,
"extraFlag": 0,
"selectScoreType": 0,
"extendContentBit": 0,
"isPhotoAgree": false,
"isGotoCodeRead": false,
"selectResultDetails": false,
"selectResultScoreViewType": 0,
"sortCategorySetting": "/*SortTabID*/ 0",
"sortMusicSetting": "/*SortMusicID*/ 0",
"playStatusSetting": "/*PlaystatusTabID*/ 0",
"selectedCardList": [
0
],
"encountMapNpcList": [
{
"npcId": 0,
"musicId": 11820
}
]
}
}服务器实现要点
- 新用户返回默认结构即可
GetUserOptionApi — 用户设置
| 项目 | 内容 |
|---|---|
| 实际请求路径 | cf60d62e7801741026a9c2913b5d82d7(= MD5("GetUserOptionApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserOption |
| 请求 VO | UserOptionRequestVO |
| 响应 VO | UserOptionResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
用户设置接口,返回 UserOption(48 字段):音符/滑条/触摸速度、各类设计(tap/hold/slide/star)、判定显示与调整、音量组、镜像模式、排序设置等,即设置菜单里的全部可调项。
请求字段(UserOptionRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
响应字段(UserOptionResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
userOption | UserOption | 嵌套数据对象 |
JSON 示例
请求(UserOptionRequestVO):
{
"userId": 100000000000000001
}响应(UserOptionResponseVO):
{
"userId": 100000000000000001,
"userOption": {
"optionKind": "/*OptionKindID*/ 0",
"noteSpeed": "/*OptionNotespeedID*/ 0",
"slideSpeed": "/*OptionSlidespeedID*/ 0",
"touchSpeed": "/*OptionTouchspeedID*/ 0",
"tapDesign": "/*OptionGametapID*/ 0",
"holdDesign": "/*OptionGameholdID*/ 0",
"slideDesign": "/*OptionGameslideID*/ 0",
"starType": "/*OptionStartypeID*/ 0",
"outlineDesign": "/*OptionGameoutlineID*/ 0",
"noteSize": "/*OptionNotesizeID*/ 0",
"slideSize": "/*OptionSlidesizeID*/ 0",
"touchSize": "/*OptionTouchsizeID*/ 0",
"starRotate": "/*OptionStarrotateID*/ 0",
"dispCenter": "/*OptionCenterdisplayID*/ 0",
"outFrameType": "/*OptionOutframedisplayID*/ 0",
"dispChain": "/*OptionDispchainID*/ 0",
"dispRate": "/*OptionDisprateID*/ 0",
"dispBar": "/*OptionDispbarlineID*/ 0",
"touchEffect": "/*OptionToucheffectID*/ 0",
"submonitorAnimation": "/*OptionSubmonitorID*/ 0",
"submonitorAchive": "/*OptionSubmonAchiveID*/ 0",
"submonitorAppeal": "/*OptionAppealID*/ 0",
"matching": "/*OptionMatchingID*/ 0",
"trackSkip": "/*OptionTrackskipID*/ 0",
"brightness": "/*OptionMoviebrightnessID*/ 0",
"mirrorMode": "/*OptionMirrorID*/ 0",
"dispJudge": "/*OptionDispjudgeID*/ 0",
"dispJudgePos": "/*OptionDispjudgeposID*/ 0",
"dispJudgeTouchPos": "/*OptionDispjudgetouchposID*/ 0",
"adjustTiming": "/*OptionJudgetimingID*/ 0",
"judgeTiming": "/*OptionJudgetimingID*/ 0",
"ansVolume": "/*OptionVolumeAnswerSoundID*/ 0",
"tapHoldVolume": "/*OptionVolumeID*/ 0",
"criticalSe": "/*OptionCriticalID*/ 0",
"tapSe": "/*OptionTapSuccessSeID*/ 0",
"breakSe": "/*OptionBreakseID*/ 0",
"breakVolume": "/*OptionVolumeID*/ 0",
"exSe": "/*OptionExseID*/ 0",
"exVolume": "/*OptionVolumeID*/ 0",
"slideSe": "/*OptionSlideseID*/ 0",
"slideVolume": "/*OptionVolumeID*/ 0",
"breakSlideVolume": "/*OptionVolumeID*/ 0",
"touchVolume": "/*OptionVolumeID*/ 0",
"touchHoldVolume": "/*OptionVolumeID*/ 0",
"damageSeVolume": "/*OptionVolumeID*/ 0",
"headPhoneVolume": "/*OptionHeadphonevolumeID*/ 0",
"sortTab": "/*SortTabID*/ 0",
"sortMusic": "/*SortMusicID*/ 0"
}
}服务器实现要点
- 字段均为枚举值 ID,新用户可全返 0(默认档)
GetUserCharacterApi — 持有角色
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 5a34d0599287aee1fd7c158eb74ec4bd(= MD5("GetUserCharacterApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserCharacter |
| 请求 VO | UserCharacterRequestVO |
| 响应 VO | UserCharacterResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload,分页) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
持有角色列表:characterId、等级(level 高位为转生次数)、觉醒阶段(awakening 0-4 星)、使用次数。角色是舞里程系统的核心——同行角色的队长/同色状态直接决定里程增速。
请求字段(UserCharacterRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
响应字段(UserCharacterResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
userCharacterList | UserCharacter[] | UserCharacter对象数组 |
JSON 示例
请求(UserCharacterRequestVO):
{
"userId": 100000000000000001
}响应(UserCharacterResponseVO):
{
"userId": 100000000000000001,
"userCharacterList": [
{
"characterId": 101,
"level": 3,
"awakening": 0,
"useCount": 0
}
]
}服务器实现要点
- 新用户返回空列表或初始角色(でらっくま family)
GetUserItemApi — 持有物品(解锁列表)
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 4ddc03719f4cb07ad3bd5bef2c25d68b(= MD5("GetUserItemApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserItem |
| 请求 VO | UserItemRequestVO |
| 响应 VO | UserItemResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload,分页) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
持有物品接口——整个解锁体系的数据来源。UserItem 四元组 {itemKind, itemId, stock, isValid},itemKind 遵循 ItemKind 枚举:5=整曲解锁(写入 Base 列表)、6=紫谱解锁、7=白谱解锁、8=Strong 谱解锁、12=门票、15=万花筒钥匙……所有 lockType=1/3/4 曲子的解锁状态、谱面级解锁状态都在这里。支持 nextIndex 分页,且响应带 itemKind(客户端按类型逐类拉取)。
请求字段(UserItemRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
nextIndex | long | 分页游标:响应中非 0 时须以该值继续请求,0 表示已取完 |
响应字段(UserItemResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
nextIndex | long | 分页游标:响应中非 0 时须以该值继续请求,0 表示已取完 |
itemKind | int | 物品类型(ItemKind,见附录 B.1) |
userItemList | UserItem[] | UserItem对象数组 |
JSON 示例
请求(UserItemRequestVO):
{
"userId": 100000000000000001,
"nextIndex": 0
}响应(UserItemResponseVO):
{
"userId": 100000000000000001,
"nextIndex": 0,
"itemKind": 5,
"userItemList": [
{
"itemKind": 5,
"itemId": 5011820,
"stock": 0,
"isValid": false
}
]
}服务器实现要点
- 按 itemKind 分页返回;客户端会循环拉取所有类型
- kind=5 的条目即"已解锁乐曲清单",与 lockType=1 曲子求差即得"未解锁"集合
GetUserMapApi — 舞里程地图进度
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 6928c643503647fc37fbbd64b8d46418(= MD5("GetUserMapApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserMap |
| 请求 VO | UserMapRequestVO |
| 响应 VO | UserMapResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload,分页) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
舞里程地图进度接口,返回 UserMap 列表 {mapId, distance, isLock, isClear, isComplete, unlockFlag},支持分页。客户端据此重建每张地图的推进状态与宝藏领取进度。
请求字段(UserMapRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
nextIndex | long | 分页游标:响应中非 0 时须以该值继续请求,0 表示已取完 |
响应字段(UserMapResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
nextIndex | long | 分页游标:响应中非 0 时须以该值继续请求,0 表示已取完 |
userMapList | UserMap[] | UserMap对象数组 |
JSON 示例
请求(UserMapRequestVO):
{
"userId": 100000000000000001,
"nextIndex": 0
}响应(UserMapResponseVO):
{
"userId": 100000000000000001,
"nextIndex": 0,
"userMapList": [
{
"mapId": 1,
"distance": 12345,
"isLock": false,
"isClear": false,
"isComplete": false,
"unlockFlag": 0
}
]
}服务器实现要点
- distance 为该图累计里程;isComplete 表示已走到终点
- unlockFlag 置 0 即可(开场动画标记)
- 新用户返回空列表
GetUserLoginBonusApi — 登录奖励进度
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 4daff5775171c6fb7e4e46bf92872cf3(= MD5("GetUserLoginBonusApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserLoginBonus |
| 请求 VO | UserLoginBonusRequestVO |
| 响应 VO | UserLoginBonusResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
登录奖励进度:每个奖励活动的 bonusId、当前天数(point)、进行中/已拿满标记。
请求字段(UserLoginBonusRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
nextIndex | long | 分页游标:响应中非 0 时须以该值继续请求,0 表示已取完 |
响应字段(UserLoginBonusResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
nextIndex | long | 分页游标:响应中非 0 时须以该值继续请求,0 表示已取完 |
userLoginBonusList | UserLoginBonus[] | UserLoginBonus对象数组 |
JSON 示例
请求(UserLoginBonusRequestVO):
{
"userId": 100000000000000001,
"nextIndex": 0
}响应(UserLoginBonusResponseVO):
{
"userId": 100000000000000001,
"nextIndex": 0,
"userLoginBonusList": [
{
"bonusId": 0,
"point": 0,
"isCurrent": false,
"isComplete": false
}
]
}服务器实现要点
- 登录奖励的"发放"发生在 UserLoginApi 时由服务器计入
GetUserKaleidxScopeApi — 万花筒个人进度
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 71e6a618242f7380783ec9f158e3cd93(= MD5("GetUserKaleidxScopeApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserKaleidxScope |
| 请求 VO | UserKaleidxScopeRequestVO |
| 响应 VO | UserKaleidxScopeResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
万花筒模式个人进度:每扇门一条 UserKaleidxScope 记录 {gateId, isGateFound, isKeyFound, isClear, 成绩统计…}。钥匙不是独立列表——获得某门钥匙即对应记录的 isKeyFound=true。
请求字段(UserKaleidxScopeRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
响应字段(UserKaleidxScopeResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
userKaleidxScopeList | UserKaleidxScope[] | UserKaleidxScope对象数组 |
JSON 示例
请求(UserKaleidxScopeRequestVO):
{
"userId": 100000000000000001
}响应(UserKaleidxScopeResponseVO):
{
"userId": 100000000000000001,
"userKaleidxScopeList": [
{
"gateId": 0,
"isGateFound": false,
"isKeyFound": false,
"isClear": false,
"totalRestLife": 0,
"totalAchievement": 0,
"totalDeluxscore": 0,
"bestAchievement": 0,
"bestDeluxscore": 0,
"bestAchievementDate": "",
"bestDeluxscoreDate": "",
"playCount": 0,
"clearDate": "",
"lastPlayDate": "",
"isInfoWatched": false
}
]
}服务器实现要点
- 服务器发钥匙 = 按门 upsert 一条 isKeyFound=true 的记录
- 与 UpsertUserAll 的 userKaleidxScopeList(按 gateId 去重)同构
GetUserMissionDataApi — 任务进度
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 472f327d8681bad1aa3da83e5154376b(= MD5("GetUserMissionDataApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserMissionData |
| 请求 VO | UserMissionRequestVO |
| 响应 VO | UserMissionResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
任务进度接口,响应由 userWeeklyData(周数据)与 userMissionDataList(任务定义与达成标记)组成。
请求字段(UserMissionRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
响应字段(UserMissionResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
userWeeklyData | UserWeeklyData | 嵌套数据对象 |
userMissionDataList | UserMissionData[] | UserMissionData对象数组 |
JSON 示例
请求(UserMissionRequestVO):
{
"userId": 100000000000000001
}响应(UserMissionResponseVO):
{
"userId": 100000000000000001,
"userWeeklyData": {
"lastLoginWeek": "",
"beforeLoginWeek": "",
"friendBonusFlag": false
},
"userMissionDataList": [
{
"type": 0,
"difficulty": 0,
"targetGenreId": 0,
"targetGenreTableId": 0,
"conditionGenreId": 0,
"conditionGenreTableId": 0,
"clearFlag": false
}
]
}服务器实现要点
- 无任务活动时返回空列表
GetUserMusicApi — 乐曲成绩明细
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 0b31f4a74d0b4eb07ef53e036625ed89(= MD5("GetUserMusicApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserMusic |
| 请求 VO | UserMusicRequestVO |
| 响应 VO | UserMusicResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload,分页) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
乐曲成绩明细接口,返回 UserMusic 列表(内嵌 UserMusicDetail:曲目×难度的最佳达成率、FC/AP 状态、DXScore、rank 等),支持分页。是玩家成绩库的全量下载。
请求字段(UserMusicRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
nextIndex | int | 分页游标:响应中非 0 时须以该值继续请求,0 表示已取完 |
响应字段(UserMusicResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
nextIndex | int | 分页游标:响应中非 0 时须以该值继续请求,0 表示已取完 |
userMusicList | UserMusic[] | UserMusic对象数组 |
JSON 示例
请求(UserMusicRequestVO):
{
"userId": 100000000000000001,
"nextIndex": 0
}响应(UserMusicResponseVO):
{
"userId": 100000000000000001,
"nextIndex": 0,
"userMusicList": [
{
"userMusicDetailList": [
{}
]
}
]
}服务器实现要点
- 成绩量大的玩家需正确处理分页
- achievement 为万分比整数
GetUserRatingApi — 评级数据
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 44fb2a7ba20b9c000483b9284b7a89d6(= MD5("GetUserRatingApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserRating |
| 请求 VO | UserRatingRequestVO |
| 响应 VO | UserRatingResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
Rating 构成接口:当前 rating 值 + 四个 UserRate 列表(旧曲 Best 35 / 新曲 Best 15 及各自的候选位)+ 段位对象 udemae。
请求字段(UserRatingRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
响应字段(UserRatingResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
userRating | UserRating | 嵌套数据对象 |
JSON 示例
请求(UserRatingRequestVO):
{
"userId": 100000000000000001
}响应(UserRatingResponseVO):
{
"userId": 100000000000000001,
"userRating": {
"rating": 0,
"ratingList": [
{
"musicId": 11820,
"level": 3,
"romVersion": 0,
"achievement": 0
}
],
"newRatingList": [
{
"musicId": 11820,
"level": 3,
"romVersion": 0,
"achievement": 0
}
],
"nextRatingList": [
{
"musicId": 11820,
"level": 3,
"romVersion": 0,
"achievement": 0
}
],
"nextNewRatingList": [
{
"musicId": 11820,
"level": 3,
"romVersion": 0,
"achievement": 0
}
],
"udemae": {
"rate": 0,
"maxRate": 0,
"classValue": 0,
"maxClassValue": 0,
"totalWinNum": 0,
"totalLoseNum": 0,
"maxWinNum": 0,
"maxLoseNum": 0,
"winNum": 0,
"loseNum": 0,
"npcTotalWinNum": 0,
"npcTotalLoseNum": 0,
"npcMaxWinNum": 0,
"npcMaxLoseNum": 0,
"npcWinNum": 0,
"npcLoseNum": 0
}
}
}服务器实现要点
- 新用户各列表为空、rating=0
GetUserActivityApi — 活动日志
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 0934f56db1632b9e233b8e8942944318(= MD5("GetUserActivityApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserActivity |
| 请求 VO | UserActivityRequestVO |
| 响应 VO | UserActivityResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
活动日志接口,返回 UserActivity = {playList, musicList} 两个 UserAct 列表。UserAct.kind 遵循 ActivityCode(100=传导乐曲解锁、120=挑战曲通关等),是"玩家达成史"的流水。
请求字段(UserActivityRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
响应字段(UserActivityResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userActivity | UserActivity | 嵌套数据对象 |
JSON 示例
请求(UserActivityRequestVO):
{
"userId": 100000000000000001
}响应(UserActivityResponseVO):
{
"userActivity": {
"playList": [
{
"kind": 0,
"id": 0,
"sortNumber": 0,
"param1": 0,
"param2": 0,
"param3": 0,
"param4": 0
}
],
"musicList": [
{
"kind": 0,
"id": 0,
"sortNumber": 0,
"param1": 0,
"param2": 0,
"param3": 0,
"param4": 0
}
]
}
}服务器实现要点
- 游戏内"达成/通知"画面据此渲染;返回空列表可隐藏
GetUserFavoriteApi — 收藏乐曲
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 19faf77e2fe1f7fe9356a5ad31c74959(= MD5("GetUserFavoriteApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserFavorite |
| 请求 VO | UserFavoriteRequestVO |
| 响应 VO | UserFavoriteResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
收藏乐曲:一个 {itemKind, itemIdList} 对象(按类别分组收藏的曲目 ID 列表)。
请求字段(UserFavoriteRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
itemKind | int | 物品类型(ItemKind,见附录 B.1) |
响应字段(UserFavoriteResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
userFavorite | UserFavorite | 嵌套数据对象 |
JSON 示例
请求(UserFavoriteRequestVO):
{
"userId": 100000000000000001,
"itemKind": 5
}响应(UserFavoriteResponseVO):
{
"userId": 100000000000000001,
"userFavorite": {
"itemKind": 5,
"itemIdList": [
0
]
}
}服务器实现要点
- 返回空对象即可
GetUserFavoriteItemApi — 收藏物品
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 0fd23ee034286ca52c0f7a0ac54b0e4b(= MD5("GetUserFavoriteItemApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserFavoriteItem |
| 请求 VO | UserFavoriteItemRequestVO |
| 响应 VO | UserFavoriteItemResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
收藏物品接口(按键 kind 分类拉取,支持分页与 isAllFavoriteItem 全量标记)。
请求字段(UserFavoriteItemRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
kind | int | — |
nextIndex | ulong | 分页游标:响应中非 0 时须以该值继续请求,0 表示已取完 |
isAllFavoriteItem | bool | — |
响应字段(UserFavoriteItemResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
kind | int | — |
nextIndex | ulong | 分页游标:响应中非 0 时须以该值继续请求,0 表示已取完 |
userFavoriteItemList | UserFavoriteItem[] | UserFavoriteItem对象数组 |
JSON 示例
请求(UserFavoriteItemRequestVO):
{
"userId": 100000000000000001,
"kind": 0,
"nextIndex": 0,
"isAllFavoriteItem": false
}响应(UserFavoriteItemResponseVO):
{
"userId": 100000000000000001,
"kind": 0,
"nextIndex": 0,
"userFavoriteItemList": [
{
"orderId": 0,
"id": 0
}
]
}服务器实现要点
- 空列表即可
GetUserGhostApi — 幽灵数据
| 项目 | 内容 |
|---|---|
| 实际请求路径 | ee520e1b09d634094632cdfa6e1d8566(= MD5("GetUserGhostApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserGhost |
| 请求 VO | UserGhostRequestVO |
| 响应 VO | UserGhostResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
幽灵数据接口:返回其他玩家(对手)的单曲成绩与档案缩略(UserGhost),选曲时叠加显示"幽灵"成绩线。
请求字段(UserGhostRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
响应字段(UserGhostResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
userGhostList | UserGhost[] | UserGhost对象数组 |
JSON 示例
请求(UserGhostRequestVO):
{
"userId": 100000000000000001
}响应(UserGhostResponseVO):
{
"userId": 100000000000000001,
"userGhostList": [
{
"name": "",
"iconId": 0,
"plateId": 0,
"titleId": 0,
"rate": 0,
"udemaeRate": 0,
"courseRank": 0,
"classRank": 0,
"classValue": 0,
"playDatetime": "",
"shopId": 0,
"regionCode": 0,
"typeId": "/*MusicDifficultyID*/ 0",
"musicId": 11820,
"difficulty": 0,
"version": 0,
"resultBitList": [
0
],
"resultNum": 0,
"achievement": 0
}
]
}服务器实现要点
- 无幽灵功能可返回空列表
GetUserCourseApi — 课程模式进度
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 679e91e6d5bd0f18a2c5ff7c4bb3481f(= MD5("GetUserCourseApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserCourse |
| 请求 VO | UserCourseRequestVO |
| 响应 VO | UserCourseResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
课程模式(段位认定等)进度:courseId、通关标记、剩余命数合计、最佳达成率/DXScore 及日期、挑战次数。支持分页。
请求字段(UserCourseRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
nextIndex | long | 分页游标:响应中非 0 时须以该值继续请求,0 表示已取完 |
响应字段(UserCourseResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
nextIndex | long | 分页游标:响应中非 0 时须以该值继续请求,0 表示已取完 |
userCourseList | UserCourse[] | UserCourse对象数组 |
JSON 示例
请求(UserCourseRequestVO):
{
"userId": 100000000000000001,
"nextIndex": 0
}响应(UserCourseResponseVO):
{
"userId": 100000000000000001,
"nextIndex": 0,
"userCourseList": [
{
"courseId": 0,
"isLastClear": false,
"totalRestlife": 0,
"totalAchievement": 0,
"totalDeluxscore": 0,
"playCount": 0,
"clearDate": "",
"lastPlayDate": "",
"bestAchievement": 0,
"bestAchievementDate": "",
"bestDeluxscore": 0,
"bestDeluxscoreDate": ""
}
]
}服务器实现要点
- 新玩家返回空列表
GetUserChargeApi — 持有收费道具
| 项目 | 内容 |
|---|---|
| 实际请求路径 | adb88244c9f21c6e3aeead25870c1aee(= MD5("GetUserChargeApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserCharge |
| 请求 VO | UserChargeRequestVO |
| 响应 VO | UserChargeResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
持有收费道具:chargeId(对应 GetGameChargeApi 定义)、剩余次数(stock)、购买/失效日期。通行证(有効期限内无限游玩加成)与门票都表现为 UserCharge。
请求字段(UserChargeRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
响应字段(UserChargeResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
length | long | 数据总条数 |
userChargeList | UserCharge[] | UserCharge对象数组 |
JSON 示例
请求(UserChargeRequestVO):
{
"userId": 100000000000000001
}响应(UserChargeResponseVO):
{
"userId": 100000000000000001,
"length": 30,
"userChargeList": [
{
"chargeId": 0,
"stock": 0,
"purchaseDate": "",
"validDate": ""
}
]
}服务器实现要点
- 有效期校验由服务器在结算时执行
GetUserShopStockApi — 商店库存
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 3a22d40097e7c5318addaba430515b65(= MD5("GetUserShopStockApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserShopStock |
| 请求 VO | UserShopStockRequestVO |
| 响应 VO | UserShopStockResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
商店库存:玩家在各商店商品上的已兑换次数(shopItemId + tradeCount),用于限购。
请求字段(UserShopStockRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
响应字段(UserShopStockResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
userShopStockList | UserShopStock[] | UserShopStock对象数组 |
JSON 示例
请求(UserShopStockRequestVO):
{
"userId": 100000000000000001
}响应(UserShopStockResponseVO):
{
"userId": 100000000000000001,
"userShopStockList": [
{
"shopItemId": 0,
"tradeCount": 0
}
]
}服务器实现要点
- 返回空列表即无兑换记录
GetUserFriendSeasonRankingApi — 友情赛季排名
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 014554f7d214262e83e07c8b8343dee9(= MD5("GetUserFriendSeasonRankingApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserFriendSeasonRanking |
| 请求 VO | UserFriendSeasonRankingRequestVO |
| 响应 VO | UserFriendSeasonRankingResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
友情对战赛季排名数据(seasonId 定位赛季),支持分页。
请求字段(UserFriendSeasonRankingRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
nextIndex | long | 分页游标:响应中非 0 时须以该值继续请求,0 表示已取完 |
响应字段(UserFriendSeasonRankingResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
nextIndex | long | 分页游标:响应中非 0 时须以该值继续请求,0 表示已取完 |
userFriendSeasonRankingList | UserFriendSeasonRanking[] | UserFriendSeasonRanking对象数组 |
JSON 示例
请求(UserFriendSeasonRankingRequestVO):
{
"userId": 100000000000000001,
"nextIndex": 0
}响应(UserFriendSeasonRankingResponseVO):
{
"userId": 100000000000000001,
"nextIndex": 0,
"userFriendSeasonRankingList": [
{
"seasonId": 0,
"point": 0,
"rank": 0,
"rewardGet": false,
"userName": "玩家昵称",
"recordDate": ""
}
]
}服务器实现要点
- 无赛季活动时返回空列表
GetUserRegionApi — 游玩地域
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 0bf94ee7a6c0934cd0cba377a5176377(= MD5("GetUserRegionApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserRegion |
| 请求 VO | UserRegionRequestVO |
| 响应 VO | UserRegionResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
玩家游玩过的地域记录(regionId + 游玩次数 + 首次日期),配合地域.collect 玩法。
请求字段(UserRegionRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
响应字段(UserRegionResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
length | ulong | 数据总条数 |
userRegionList | UserRegion[] | UserRegion对象数组 |
JSON 示例
请求(UserRegionRequestVO):
{
"userId": 100000000000000001
}响应(UserRegionResponseVO):
{
"userId": 100000000000000001,
"length": 30,
"userRegionList": [
{
"regionId": 0,
"playCount": 0,
"created": ""
}
]
}服务器实现要点
- 可由 playlog 的 regionId 汇总生成
GetUserPortraitApi — 拉取肖像
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 17b91c10b562af4e48eb4cabd3a26226(= MD5("GetUserPortraitApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserPortrait |
| 请求 VO | GetUserPortraitRequestVO |
| 响应 VO | GetUserPortraitResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
拉取玩家面部肖像。请求仅 {userId},响应 length 为分片信息(数据体量小,实际照片内容按需上传/下载)。
请求字段(GetUserPortraitRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
响应字段(GetUserPortraitResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
length | int | 数据总条数 |
JSON 示例
请求(GetUserPortraitRequestVO):
{
"userId": 100000000000000001
}响应(GetUserPortraitResponseVO):
{
"length": 30
}服务器实现要点
- 未设置肖像时返回空
GetUserNewItemApi — 游玩结算新物品
| 项目 | 内容 |
|---|---|
| 实际请求路径 | b0f03b2ae76e3ab7709ca2e4a5de0e17(= MD5("GetUserNewItemApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserNewItem |
| 请求 VO | UserNewItemRequestVO |
| 响应 VO | UserNewItemResponseVO |
| 触发时机 | 登录下载独立状态(StateUserNewItemDownload,携带本局 playlog) |
| 调用位置 | UserDataDLState.Exist/StateUserNewItemDownload.cs |
由服务器按游玩记录结算解锁的接口:请求携带 version 与本局全部 userPlaylogList,服务器分析后返回一个待解锁物品 {itemKind, itemId}。它是"游玩行为→解锁"的服务器侧结算通道(如条件达成的新曲解锁)。
请求字段(UserNewItemRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
version | int | 数据版本 |
userPlaylogList | UserPlaylog[] | 本局全部游玩记录(服务器据此结算解锁) |
响应字段(UserNewItemResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
itemKind | int | 解锁物品类型 |
itemId | int | 解锁物品 ID |
JSON 示例
请求(UserNewItemRequestVO):
{
"userId": 100000000000000001,
"version": 0,
"userPlaylogList": [
{
"userId": 100000000000000001,
"orderId": 0,
"playlogId": 1,
"version": 0,
"placeId": 0,
"placeName": "",
"loginDate": 0,
"playDate": "",
"userPlayDate": "",
"type": 0,
"musicId": 11820,
"level": 3,
"trackNo": 0,
"vsMode": 0,
"vsUserName": "",
"vsStatus": 0,
"vsUserRating": 0,
"vsUserAchievement": 0,
"vsUserGradeRank": 0,
"vsRank": 0,
"playerNum": 0,
"playedUserId1": 0,
"playedUserName1": "",
"playedMusicLevel1": 0,
"playedUserId2": 0,
"playedUserName2": "",
"playedMusicLevel2": 0,
"playedUserId3": 0,
"playedUserName3": "",
"playedMusicLevel3": 0,
"characterId1": 0,
"characterLevel1": 0,
"characterAwakening1": 0,
"characterId2": 0,
"characterLevel2": 0,
"characterAwakening2": 0,
"characterId3": 0,
"characterLevel3": 0,
"characterAwakening3": 0,
"characterId4": 0,
"characterLevel4": 0,
"characterAwakening4": 0,
"characterId5": 0,
"characterLevel5": 0,
"characterAwakening5": 0,
"achievement": 0,
"deluxscore": 0,
"scoreRank": 0,
"maxCombo": 0,
"totalCombo": 0,
"maxSync": 0,
"totalSync": 0,
"tapCriticalPerfect": 0,
"tapPerfect": 0,
"tapGreat": 0,
"tapGood": 0,
"tapMiss": 0,
"holdCriticalPerfect": 0,
"holdPerfect": 0,
"holdGreat": 0,
"holdGood": 0,
"holdMiss": 0,
"slideCriticalPerfect": 0,
"slidePerfect": 0,
"slideGreat": 0,
"slideGood": 0,
"slideMiss": 0,
"touchCriticalPerfect": 0,
"touchPerfect": 0,
"touchGreat": 0,
"touchGood": 0,
"touchMiss": 0,
"breakCriticalPerfect": 0,
"breakPerfect": 0,
"breakGreat": 0,
"breakGood": 0,
"breakMiss": 0,
"isTap": false,
"isHold": false,
"isSlide": false,
"isTouch": false,
"isBreak": false,
"isCriticalDisp": false,
"isFastLateDisp": false,
"fastCount": 0,
"lateCount": 0,
"isAchieveNewRecord": false,
"isDeluxscoreNewRecord": false,
"comboStatus": 0,
"syncStatus": 0,
"isClear": false,
"beforeRating": 0,
"afterRating": 0,
"beforeGrade": 0,
"afterGrade": 0,
"afterGradeRank": 0,
"beforeDeluxRating": 0,
"afterDeluxRating": 0,
"isPlayTutorial": false,
"isEventMode": false,
"isFreedomMode": false,
"playMode": 0,
"isNewFree": false,
"trialPlayAchievement": 0,
"extNum1": 0,
"extNum2": 0,
"extNum4": 0,
"extBool1": false,
"extBool2": false,
"extBool3": false
}
]
}响应(UserNewItemResponseVO):
{
"userId": 100000000000000001,
"itemKind": 5,
"itemId": 5011820
}服务器实现要点
- 最简单的实现:返回 kind=0/空;如需实现"打 X 首歌解锁 Y"类规则在此结算
GetUserNewItemListApi — 新物品列表
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 90071a7d3dfea84e3a62fdf2e24eadf3(= MD5("GetUserNewItemListApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserNewItemList |
| 请求 VO | UserNewItemListRequestVO |
| 响应 VO | UserNewItemListResponseVO |
| 触发时机 | 登录下载独立状态(StateUserNewItemListDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserNewItemListDownload.cs |
GetUserNewItemApi 的列表版:请求额外携带完整 UserDetail,返回 UserItem 列表(带新获得标记的物品)。
请求字段(UserNewItemListRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
version | int | — |
userData | UserDetail[] | UserDetail对象数组 |
userPlaylogList | UserPlaylog[] | UserPlaylog对象数组 |
响应字段(UserNewItemListResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
userItemList | UserItem[] | UserItem对象数组 |
JSON 示例
请求(UserNewItemListRequestVO):
{
"userId": 100000000000000001,
"version": 0,
"userData": [
{
"accessCode": "604012345678901234",
"userName": "玩家昵称",
"isNetMember": 0,
"point": 0,
"totalPoint": 0,
"iconId": 0,
"plateId": 0,
"titleId": 0,
"partnerId": 0,
"frameId": 0,
"selectMapId": 0,
"totalAwake": 0,
"gradeRating": 0,
"musicRating": 0,
"playerRating": 0,
"highestRating": 0,
"gradeRank": 0,
"classRank": 0,
"courseRank": 0,
"charaSlot": [
0
],
"charaLockSlot": [
0
],
"contentBit": 0,
"playCount": 0,
"currentPlayCount": 0,
"renameCredit": 0,
"mapStock": 0,
"eventWatchedDate": "",
"lastGameId": "",
"lastRomVersion": "",
"lastDataVersion": "",
"lastLoginDate": "",
"lastPlayDate": "",
"lastPlayCredit": 0,
"lastPlayMode": 0,
"lastPlaceId": 0,
"lastPlaceName": "",
"lastAllNetId": 0,
"lastRegionId": 0,
"lastRegionName": "",
"lastClientId": "",
"lastCountryCode": "",
"lastSelectEMoney": 0,
"lastSelectTicket": 0,
"lastSelectCourse": 0,
"lastCountCourse": 0,
"firstGameId": "",
"firstRomVersion": "",
"firstDataVersion": "",
"firstPlayDate": "",
"compatibleCmVersion": "",
"dailyBonusDate": "",
"dailyCourseBonusDate": "",
"lastPairLoginDate": "",
"lastTrialPlayDate": "",
"playVsCount": 0,
"playSyncCount": 0,
"winCount": 0,
"helpCount": 0,
"comboCount": 0,
"totalDeluxscore": 0,
"totalBasicDeluxscore": 0,
"totalAdvancedDeluxscore": 0,
"totalExpertDeluxscore": 0,
"totalMasterDeluxscore": 0,
"totalReMasterDeluxscore": 0,
"totalSync": 0,
"totalBasicSync": 0,
"totalAdvancedSync": 0,
"totalExpertSync": 0,
"totalMasterSync": 0,
"totalReMasterSync": 0,
"totalAchievement": 0,
"totalBasicAchievement": 0,
"totalAdvancedAchievement": 0,
"totalExpertAchievement": 0,
"totalMasterAchievement": 0,
"totalReMasterAchievement": 0,
"playerOldRating": 0,
"playerNewRating": 0,
"banState": 0,
"friendRegistSkip": 0,
"dateTime": 0
}
],
"userPlaylogList": [
{
"userId": 100000000000000001,
"orderId": 0,
"playlogId": 1,
"version": 0,
"placeId": 0,
"placeName": "",
"loginDate": 0,
"playDate": "",
"userPlayDate": "",
"type": 0,
"musicId": 11820,
"level": 3,
"trackNo": 0,
"vsMode": 0,
"vsUserName": "",
"vsStatus": 0,
"vsUserRating": 0,
"vsUserAchievement": 0,
"vsUserGradeRank": 0,
"vsRank": 0,
"playerNum": 0,
"playedUserId1": 0,
"playedUserName1": "",
"playedMusicLevel1": 0,
"playedUserId2": 0,
"playedUserName2": "",
"playedMusicLevel2": 0,
"playedUserId3": 0,
"playedUserName3": "",
"playedMusicLevel3": 0,
"characterId1": 0,
"characterLevel1": 0,
"characterAwakening1": 0,
"characterId2": 0,
"characterLevel2": 0,
"characterAwakening2": 0,
"characterId3": 0,
"characterLevel3": 0,
"characterAwakening3": 0,
"characterId4": 0,
"characterLevel4": 0,
"characterAwakening4": 0,
"characterId5": 0,
"characterLevel5": 0,
"characterAwakening5": 0,
"achievement": 0,
"deluxscore": 0,
"scoreRank": 0,
"maxCombo": 0,
"totalCombo": 0,
"maxSync": 0,
"totalSync": 0,
"tapCriticalPerfect": 0,
"tapPerfect": 0,
"tapGreat": 0,
"tapGood": 0,
"tapMiss": 0,
"holdCriticalPerfect": 0,
"holdPerfect": 0,
"holdGreat": 0,
"holdGood": 0,
"holdMiss": 0,
"slideCriticalPerfect": 0,
"slidePerfect": 0,
"slideGreat": 0,
"slideGood": 0,
"slideMiss": 0,
"touchCriticalPerfect": 0,
"touchPerfect": 0,
"touchGreat": 0,
"touchGood": 0,
"touchMiss": 0,
"breakCriticalPerfect": 0,
"breakPerfect": 0,
"breakGreat": 0,
"breakGood": 0,
"breakMiss": 0,
"isTap": false,
"isHold": false,
"isSlide": false,
"isTouch": false,
"isBreak": false,
"isCriticalDisp": false,
"isFastLateDisp": false,
"fastCount": 0,
"lateCount": 0,
"isAchieveNewRecord": false,
"isDeluxscoreNewRecord": false,
"comboStatus": 0,
"syncStatus": 0,
"isClear": false,
"beforeRating": 0,
"afterRating": 0,
"beforeGrade": 0,
"afterGrade": 0,
"afterGradeRank": 0,
"beforeDeluxRating": 0,
"afterDeluxRating": 0,
"isPlayTutorial": false,
"isEventMode": false,
"isFreedomMode": false,
"playMode": 0,
"isNewFree": false,
"trialPlayAchievement": 0,
"extNum1": 0,
"extNum2": 0,
"extNum4": 0,
"extBool1": false,
"extBool2": false,
"extBool3": false
}
]
}响应(UserNewItemListResponseVO):
{
"userId": 100000000000000001,
"userItemList": [
{
"itemKind": 5,
"itemId": 5011820,
"stock": 0,
"isValid": false
}
]
}服务器实现要点
- 返回空列表即可
GetUserCardApi — 卡片数据
| 项目 | 内容 |
|---|---|
| 实际请求路径 | d01207cf89566d36c729055066ddc26c(= MD5("GetUserCardApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserCard |
| 请求 VO | UserCardRequestVO |
| 响应 VO | UserCardResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
玩家绑定的 Aime 卡信息(UserCard 列表)。
请求字段(UserCardRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
nextIndex | int | 分页游标:响应中非 0 时须以该值继续请求,0 表示已取完 |
响应字段(UserCardResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
nextIndex | int | 分页游标:响应中非 0 时须以该值继续请求,0 表示已取完 |
userCardList | UserCard[] | UserCard对象数组 |
JSON 示例
请求(UserCardRequestVO):
{
"userId": 100000000000000001,
"nextIndex": 0
}响应(UserCardResponseVO):
{
"userId": 100000000000000001,
"nextIndex": 0,
"userCardList": [
{
"cardId": 0,
"cardTypeId": 0,
"charaId": 0,
"mapId": 1,
"startDate": "",
"endDate": ""
}
]
}GetUserIntimateApi — 搭档亲密度
| 项目 | 内容 |
|---|---|
| 实际请求路径 | c9ee09165f4fae205df8afb3014f5a4b(= MD5("GetUserIntimateApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserPartnerCloseness |
| 请求 VO | UserIntimateRequestVO |
| 响应 VO | UserIntimateResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
PartnerCloseness/亲密度数据(UserIntimate 列表)。Packet 类名为 PacketGetUserPartnerCloseness。
请求字段(UserIntimateRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
响应字段(UserIntimateResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
length | int | 数据总条数 |
userIntimateList | UserIntimate[] | UserIntimate对象数组 |
JSON 示例
请求(UserIntimateRequestVO):
{
"userId": 100000000000000001
}响应(UserIntimateResponseVO):
{
"userId": 100000000000000001,
"length": 30,
"userIntimateList": [
{
"partnerId": 0,
"intimateLevel": 0,
"intimateCountRewarded": 0
}
]
}GetUserScoreRankingApi — 谱面成绩排行
| 项目 | 内容 |
|---|---|
| 实际请求路径 | b85d9100437414044af5450039d7751b(= MD5("GetUserScoreRankingApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserScoreRanking |
| 请求 VO | UserScoreRankingRequestVO |
| 响应 VO | UserScoreRankingResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
成绩排行(score ranking)活动的榜单数据。
请求字段(UserScoreRankingRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
competitionId | int | — |
响应字段(UserScoreRankingResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
userScoreRanking | UserScoreRanking | 嵌套数据对象 |
JSON 示例
请求(UserScoreRankingRequestVO):
{
"userId": 100000000000000001,
"competitionId": 0
}响应(UserScoreRankingResponseVO):
{
"userId": 100000000000000001,
"userScoreRanking": {
"tournamentId": 0,
"totalScore": 0,
"ranking": 0,
"rankingDate": ""
}
}GetUserRivalDataApi — 对手档案
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 6d0fbdb911c7598b9d31906474b3fa3e(= MD5("GetUserRivalDataApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserRivalData |
| 请求 VO | UserRivalRequestVO |
| 响应 VO | UserRivalResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
对手(rival)档案接口:请求带 rivalId,返回对手的 UserRivalData。
请求字段(UserRivalRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
rivalId | ulong | — |
响应字段(UserRivalResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
userRivalData | UserRivalData | 嵌套数据对象 |
JSON 示例
请求(UserRivalRequestVO):
{
"userId": 100000000000000001,
"rivalId": 0
}响应(UserRivalResponseVO):
{
"userId": 100000000000000001,
"userRivalData": {
"rivalId": 0,
"rivalName": ""
}
}服务器实现要点
- 无 rival 系统返回默认结构
GetUserRivalMusicApi — 对手乐曲成绩
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 347f15009fe18d96ba645b47d2f40a04(= MD5("GetUserRivalMusicApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserRivalMusic |
| 请求 VO | UserRivalMusicRequestVO |
| 响应 VO | UserRivalMusicResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
对手乐曲成绩:请求带 rivalId,返回该对手的成绩列表,支持分页。
请求字段(UserRivalMusicRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
rivalId | ulong | — |
nextIndex | int | 分页游标:响应中非 0 时须以该值继续请求,0 表示已取完 |
响应字段(UserRivalMusicResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
rivalId | ulong | — |
nextIndex | int | 分页游标:响应中非 0 时须以该值继续请求,0 表示已取完 |
userRivalMusicList | UserRivalMusic[] | UserRivalMusic对象数组 |
JSON 示例
请求(UserRivalMusicRequestVO):
{
"userId": 100000000000000001,
"rivalId": 0,
"nextIndex": 0
}响应(UserRivalMusicResponseVO):
{
"userId": 100000000000000001,
"rivalId": 0,
"nextIndex": 0,
"userRivalMusicList": [
{
"musicId": 11820,
"userRivalMusicDetailList": [
{}
]
}
]
}服务器实现要点
- 空列表即可
GetUserRecommendRateMusicApi — 评级推荐曲
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 2c23bf23cc28cb260751d035038a407e(= MD5("GetUserRecommendRateMusicApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserRecommendRateMusic |
| 请求 VO | UserRecommendRateMusicRequestVO |
| 响应 VO | UserRecommendRateMusicResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
按 Rating 推荐曲目:返回推荐曲目对象列表(升 Rating 建议选曲)。
请求字段(UserRecommendRateMusicRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
响应字段(UserRecommendRateMusicResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
userRecommendRateMusicIdList | UserRecommendRateMusic[] | UserRecommendRateMusic对象数组 |
JSON 示例
请求(UserRecommendRateMusicRequestVO):
{
"userId": 100000000000000001
}响应(UserRecommendRateMusicResponseVO):
{
"userId": 100000000000000001,
"userRecommendRateMusicIdList": [
{
"musicId": 11820,
"level": 3,
"averageAchievement": 0
}
]
}服务器实现要点
- 可由成绩与 ratingList 计算或返回空
GetUserRecommendSelectMusicApi — 选曲推荐
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 62840c42cd6a2b7d6a81f4f2083efe4f(= MD5("GetUserRecommendSelectMusicApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserRecommendSelectionMusic |
| 请求 VO | UserRecommendSelectionMusicRequestVO |
| 响应 VO | UserRecommendSelectionMusicResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
选曲场景的推荐曲目,响应为纯 ID 列表(userRecommendSelectionMusicIdList)。注意端点名是 RecommendSelectMusic(Packet 类名写作 Selection)。
请求字段(UserRecommendSelectionMusicRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
响应字段(UserRecommendSelectionMusicResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
userRecommendSelectionMusicIdList | int[] | int对象数组 |
JSON 示例
请求(UserRecommendSelectionMusicRequestVO):
{
"userId": 100000000000000001
}响应(UserRecommendSelectionMusicResponseVO):
{
"userId": 100000000000000001,
"userRecommendSelectionMusicIdList": [
0
]
}服务器实现要点
- 返回空列表即无推荐
GetUserFriendBonusApi — 好友加成
| 项目 | 内容 |
|---|---|
| 实际请求路径 | c476e4c12928e26ac4a06b10cef8177f(= MD5("GetUserFriendBonusApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserFriendBonus |
| 请求 VO | UserFriendBonusRequestVO |
| 响应 VO | UserFriendBonusResponseVO |
| 触发时机 | 登录下载状态机(StateUserDownload) |
| 调用位置 | UserDataDLState.Exist/StateUserDownload.cs |
好友加成:与好友同玩时获得的额外里程(getMiles)与结果码。
请求字段(UserFriendBonusRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
响应字段(UserFriendBonusResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
returnCode | int | 结果码(1 = 成功) |
getMiles | ulong | — |
JSON 示例
请求(UserFriendBonusRequestVO):
{
"userId": 100000000000000001
}响应(UserFriendBonusResponseVO):
{
"userId": 100000000000000001,
"returnCode": 1,
"getMiles": 0
}服务器实现要点
- 无好友体系返回 getMiles=0
GetUserFriendCheckApi — 好友校验
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 5f8721b81bd9a62d946c51b0fef2e3c3(= MD5("GetUserFriendCheckApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserFriendCheck |
| 请求 VO | UserFriendCheckRequestVO |
| 响应 VO | UserFriendCheckResponseVO |
| 触发时机 | 登录下载流程(UserDataDLProcess) |
| 调用位置 | Process/UserDataDLProcess.cs |
好友校验:请求带双方 userId,返回 returnCode 表示是否可建立好友关系(存在性/已是好友等)。
请求字段(UserFriendCheckRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId1 | ulong | — |
userId2 | ulong | — |
响应字段(UserFriendCheckResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
returnCode | int | 结果码(1 = 成功) |
JSON 示例
请求(UserFriendCheckRequestVO):
{
"userId1": 0,
"userId2": 0
}响应(UserFriendCheckResponseVO):
{
"returnCode": 1
}服务器实现要点
- 简单实现恒返回 1
GetTransferFriendApi — 好友数据列表
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 6e0a39819250294129051df516be187f(= MD5("GetTransferFriendApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetTransferFriend |
| 请求 VO | TransferFriendRequestVO |
| 响应 VO | TransferFriendResponseVO |
| 触发时机 | 未使用(死代码) |
| 调用位置 | (无调用点,保留接口) |
好友数据列表(transferFriendList:同玩玩家、友情点、收藏标记)。当前版本客户端没有任何调用点(0 处),属于保留接口。
请求字段(TransferFriendRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
响应字段(TransferFriendResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
transferFriendList | TransferFriend[] | TransferFriend对象数组 |
JSON 示例
请求(TransferFriendRequestVO):
{
"userId": 100000000000000001
}响应(TransferFriendResponseVO):
{
"userId": 100000000000000001,
"transferFriendList": [
{
"playUserId": 0,
"playUserName": "",
"playDate": "",
"friendPoint": 0,
"isFavorite": false
}
]
}服务器实现要点
- 返回空列表即可
玩家数据上传
UploadUserPlaylogApi — 上传游玩记录
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 524535c1f32eb47b2a818ffa5087c625(= MD5("UploadUserPlaylogApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketUploadUserPlaylog |
| 请求 VO | UserPlaylogRequestVO |
| 响应 VO | UpsertResponseVO |
| 触发时机 | 每曲结算后(PlaylogULProcess/StateUpload 逐曲上传) |
| 调用位置 | PlaylogULState/StateUpload.cs、UserDataULState/StateULUserAime.cs(旧路径) |
单曲游玩记录上传。每首曲目结算后立即调用(PlaylogULProcess/StateUpload),请求体 UserPlaylog 为 110 字段的全量记录:判定明细(TAP/HOLD/SLIDE/TOUCH/BREAK × 五档)、FAST/LATE、达成率、DXScore、前后 Rating、同行角色、对战信息等。旧版本该数据并入 UpsertUserAll,现已拆分独立逐曲上传。
请求字段(UserPlaylogRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
userPlaylog | UserPlaylog | 嵌套数据对象 |
响应字段(UpsertResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
returnCode | int | 结果码(1 = 成功) |
apiName | string | 回显的 API 名 |
JSON 示例
请求(UserPlaylogRequestVO):
{
"userId": 100000000000000001,
"userPlaylog": {
"userId": 100000000000000001,
"orderId": 0,
"playlogId": 1,
"version": 0,
"placeId": 0,
"placeName": "",
"loginDate": 0,
"playDate": "",
"userPlayDate": "",
"type": 0,
"musicId": 11820,
"level": 3,
"trackNo": 0,
"vsMode": 0,
"vsUserName": "",
"vsStatus": 0,
"vsUserRating": 0,
"vsUserAchievement": 0,
"vsUserGradeRank": 0,
"vsRank": 0,
"playerNum": 0,
"playedUserId1": 0,
"playedUserName1": "",
"playedMusicLevel1": 0,
"playedUserId2": 0,
"playedUserName2": "",
"playedMusicLevel2": 0,
"playedUserId3": 0,
"playedUserName3": "",
"playedMusicLevel3": 0,
"characterId1": 0,
"characterLevel1": 0,
"characterAwakening1": 0,
"characterId2": 0,
"characterLevel2": 0,
"characterAwakening2": 0,
"characterId3": 0,
"characterLevel3": 0,
"characterAwakening3": 0,
"characterId4": 0,
"characterLevel4": 0,
"characterAwakening4": 0,
"characterId5": 0,
"characterLevel5": 0,
"characterAwakening5": 0,
"achievement": 0,
"deluxscore": 0,
"scoreRank": 0,
"maxCombo": 0,
"totalCombo": 0,
"maxSync": 0,
"totalSync": 0,
"tapCriticalPerfect": 0,
"tapPerfect": 0,
"tapGreat": 0,
"tapGood": 0,
"tapMiss": 0,
"holdCriticalPerfect": 0,
"holdPerfect": 0,
"holdGreat": 0,
"holdGood": 0,
"holdMiss": 0,
"slideCriticalPerfect": 0,
"slidePerfect": 0,
"slideGreat": 0,
"slideGood": 0,
"slideMiss": 0,
"touchCriticalPerfect": 0,
"touchPerfect": 0,
"touchGreat": 0,
"touchGood": 0,
"touchMiss": 0,
"breakCriticalPerfect": 0,
"breakPerfect": 0,
"breakGreat": 0,
"breakGood": 0,
"breakMiss": 0,
"isTap": false,
"isHold": false,
"isSlide": false,
"isTouch": false,
"isBreak": false,
"isCriticalDisp": false,
"isFastLateDisp": false,
"fastCount": 0,
"lateCount": 0,
"isAchieveNewRecord": false,
"isDeluxscoreNewRecord": false,
"comboStatus": 0,
"syncStatus": 0,
"isClear": false,
"beforeRating": 0,
"afterRating": 0,
"beforeGrade": 0,
"afterGrade": 0,
"afterGradeRank": 0,
"beforeDeluxRating": 0,
"afterDeluxRating": 0,
"isPlayTutorial": false,
"isEventMode": false,
"isFreedomMode": false,
"playMode": 0,
"isNewFree": false,
"trialPlayAchievement": 0,
"extNum1": 0,
"extNum2": 0,
"extNum4": 0,
"extBool1": false,
"extBool2": false,
"extBool3": false
}
}响应(UpsertResponseVO):
{
"returnCode": 1,
"apiName": ""
}服务器实现要点
- 每首曲子一条,按 playlogId+orderId 排序入库
- 是排行榜、统计、"游玩条件解锁"类规则的数据源
- 注意与 UpsertUserAll.userPlaylogList 内容一致(一次保存会重复携带)
UpsertUserAllApi — 全量差量上传(核心)
| 项目 | 内容 |
|---|---|
| 实际请求路径 | af903596d1ee84933292e7b6d0488c54(= MD5("UpsertUserAllApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketUpsertUserAll |
| 请求 VO | UserAllRequestVO |
| 响应 VO | UpsertResponseVO |
| 触发时机 | 数据保存画面(StateULUserAime/StateULUserGuest) |
| 调用位置 | UserDataULState/StateULUserAime.cs、StateULUserGuest.cs |
整个协议的核心落库接口。数据保存画面调用一次,把本局产生的全部状态变化以差量方式提交:约 20 个列表(解锁 userItemList、舞里程 userMapList、角色、成绩、活动、万花筒……)+ 各自的 isNew 位图("1"=新增,"0"=更新)。服务器按 1.7 节的对照表合并即可完整复刻官方存档语义。解锁体系(乐曲/紫白谱/钥匙)的最终持久化都发生在这里。
请求字段(UserAllRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
playlogId | ulong | 本局会话 ID(UserLoginApi 返回的 loginId) |
isEventMode | bool | 是否活动模式 |
isFreePlay | bool | 是否免费玩 |
loginDateTime | long | 登录时间(Unix 秒) |
userPlaylogList | UserPlaylog[] | 本局全部单曲游玩记录(与逐曲上传内容一致) |
upsertUserAll | UserAll | UserAll 聚合数据(差量列表 + isNew 位图,见 1.7) |
响应字段(UpsertResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
returnCode | int | 结果码(1 = 成功) |
apiName | string | 回显的 API 名 |
JSON 示例
请求(UserAllRequestVO):
{
"userId": 100000000000000001,
"playlogId": 1,
"isEventMode": false,
"isFreePlay": false,
"loginDateTime": 0,
"userPlaylogList": [
{
"userId": 100000000000000001,
"orderId": 0,
"playlogId": 1,
"version": 0,
"placeId": 0,
"placeName": "",
"loginDate": 0,
"playDate": "",
"userPlayDate": "",
"type": 0,
"musicId": 11820,
"level": 3,
"trackNo": 0,
"vsMode": 0,
"vsUserName": "",
"vsStatus": 0,
"vsUserRating": 0,
"vsUserAchievement": 0,
"vsUserGradeRank": 0,
"vsRank": 0,
"playerNum": 0,
"playedUserId1": 0,
"playedUserName1": "",
"playedMusicLevel1": 0,
"playedUserId2": 0,
"playedUserName2": "",
"playedMusicLevel2": 0,
"playedUserId3": 0,
"playedUserName3": "",
"playedMusicLevel3": 0,
"characterId1": 0,
"characterLevel1": 0,
"characterAwakening1": 0,
"characterId2": 0,
"characterLevel2": 0,
"characterAwakening2": 0,
"characterId3": 0,
"characterLevel3": 0,
"characterAwakening3": 0,
"characterId4": 0,
"characterLevel4": 0,
"characterAwakening4": 0,
"characterId5": 0,
"characterLevel5": 0,
"characterAwakening5": 0,
"achievement": 0,
"deluxscore": 0,
"scoreRank": 0,
"maxCombo": 0,
"totalCombo": 0,
"maxSync": 0,
"totalSync": 0,
"tapCriticalPerfect": 0,
"tapPerfect": 0,
"tapGreat": 0,
"tapGood": 0,
"tapMiss": 0,
"holdCriticalPerfect": 0,
"holdPerfect": 0,
"holdGreat": 0,
"holdGood": 0,
"holdMiss": 0,
"slideCriticalPerfect": 0,
"slidePerfect": 0,
"slideGreat": 0,
"slideGood": 0,
"slideMiss": 0,
"touchCriticalPerfect": 0,
"touchPerfect": 0,
"touchGreat": 0,
"touchGood": 0,
"touchMiss": 0,
"breakCriticalPerfect": 0,
"breakPerfect": 0,
"breakGreat": 0,
"breakGood": 0,
"breakMiss": 0,
"isTap": false,
"isHold": false,
"isSlide": false,
"isTouch": false,
"isBreak": false,
"isCriticalDisp": false,
"isFastLateDisp": false,
"fastCount": 0,
"lateCount": 0,
"isAchieveNewRecord": false,
"isDeluxscoreNewRecord": false,
"comboStatus": 0,
"syncStatus": 0,
"isClear": false,
"beforeRating": 0,
"afterRating": 0,
"beforeGrade": 0,
"afterGrade": 0,
"afterGradeRank": 0,
"beforeDeluxRating": 0,
"afterDeluxRating": 0,
"isPlayTutorial": false,
"isEventMode": false,
"isFreedomMode": false,
"playMode": 0,
"isNewFree": false,
"trialPlayAchievement": 0,
"extNum1": 0,
"extNum2": 0,
"extNum4": 0,
"extBool1": false,
"extBool2": false,
"extBool3": false
}
],
"upsertUserAll": {
"userData": [
{
"accessCode": "604012345678901234",
"userName": "玩家昵称",
"isNetMember": 0,
"point": 0,
"totalPoint": 0,
"iconId": 0,
"plateId": 0,
"titleId": 0,
"partnerId": 0,
"frameId": 0,
"selectMapId": 0,
"totalAwake": 0,
"gradeRating": 0,
"musicRating": 0,
"playerRating": 0,
"highestRating": 0,
"gradeRank": 0,
"classRank": 0,
"courseRank": 0,
"charaSlot": [],
"charaLockSlot": [],
"contentBit": 0,
"playCount": 0,
"currentPlayCount": 0,
"renameCredit": 0,
"mapStock": 0,
"eventWatchedDate": "",
"lastGameId": "",
"lastRomVersion": "",
"lastDataVersion": "",
"lastLoginDate": "",
"lastPlayDate": "",
"lastPlayCredit": 0,
"lastPlayMode": 0,
"lastPlaceId": 0,
"lastPlaceName": "",
"lastAllNetId": 0,
"lastRegionId": 0,
"lastRegionName": "",
"lastClientId": "",
"lastCountryCode": "",
"lastSelectEMoney": 0,
"lastSelectTicket": 0,
"lastSelectCourse": 0,
"lastCountCourse": 0,
"firstGameId": "",
"firstRomVersion": "",
"firstDataVersion": "",
"firstPlayDate": "",
"compatibleCmVersion": "",
"dailyBonusDate": "",
"dailyCourseBonusDate": "",
"lastPairLoginDate": "",
"lastTrialPlayDate": "",
"playVsCount": 0,
"playSyncCount": 0,
"winCount": 0,
"helpCount": 0,
"comboCount": 0,
"totalDeluxscore": 0,
"totalBasicDeluxscore": 0,
"totalAdvancedDeluxscore": 0,
"totalExpertDeluxscore": 0,
"totalMasterDeluxscore": 0,
"totalReMasterDeluxscore": 0,
"totalSync": 0,
"totalBasicSync": 0,
"totalAdvancedSync": 0,
"totalExpertSync": 0,
"totalMasterSync": 0,
"totalReMasterSync": 0,
"totalAchievement": 0,
"totalBasicAchievement": 0,
"totalAdvancedAchievement": 0,
"totalExpertAchievement": 0,
"totalMasterAchievement": 0,
"totalReMasterAchievement": 0,
"playerOldRating": 0,
"playerNewRating": 0,
"banState": 0,
"friendRegistSkip": 0,
"dateTime": 0
}
],
"userExtend": [
{
"selectMusicId": 0,
"selectDifficultyId": 0,
"categoryIndex": 0,
"musicIndex": 0,
"extraFlag": 0,
"selectScoreType": 0,
"extendContentBit": 0,
"isPhotoAgree": false,
"isGotoCodeRead": false,
"selectResultDetails": false,
"selectResultScoreViewType": 0,
"sortCategorySetting": "/*SortTabID*/ 0",
"sortMusicSetting": "/*SortMusicID*/ 0",
"playStatusSetting": "/*PlaystatusTabID*/ 0",
"selectedCardList": [],
"encountMapNpcList": []
}
],
"userOption": [
{
"optionKind": "/*OptionKindID*/ 0",
"noteSpeed": "/*OptionNotespeedID*/ 0",
"slideSpeed": "/*OptionSlidespeedID*/ 0",
"touchSpeed": "/*OptionTouchspeedID*/ 0",
"tapDesign": "/*OptionGametapID*/ 0",
"holdDesign": "/*OptionGameholdID*/ 0",
"slideDesign": "/*OptionGameslideID*/ 0",
"starType": "/*OptionStartypeID*/ 0",
"outlineDesign": "/*OptionGameoutlineID*/ 0",
"noteSize": "/*OptionNotesizeID*/ 0",
"slideSize": "/*OptionSlidesizeID*/ 0",
"touchSize": "/*OptionTouchsizeID*/ 0",
"starRotate": "/*OptionStarrotateID*/ 0",
"dispCenter": "/*OptionCenterdisplayID*/ 0",
"outFrameType": "/*OptionOutframedisplayID*/ 0",
"dispChain": "/*OptionDispchainID*/ 0",
"dispRate": "/*OptionDisprateID*/ 0",
"dispBar": "/*OptionDispbarlineID*/ 0",
"touchEffect": "/*OptionToucheffectID*/ 0",
"submonitorAnimation": "/*OptionSubmonitorID*/ 0",
"submonitorAchive": "/*OptionSubmonAchiveID*/ 0",
"submonitorAppeal": "/*OptionAppealID*/ 0",
"matching": "/*OptionMatchingID*/ 0",
"trackSkip": "/*OptionTrackskipID*/ 0",
"brightness": "/*OptionMoviebrightnessID*/ 0",
"mirrorMode": "/*OptionMirrorID*/ 0",
"dispJudge": "/*OptionDispjudgeID*/ 0",
"dispJudgePos": "/*OptionDispjudgeposID*/ 0",
"dispJudgeTouchPos": "/*OptionDispjudgetouchposID*/ 0",
"adjustTiming": "/*OptionJudgetimingID*/ 0",
"judgeTiming": "/*OptionJudgetimingID*/ 0",
"ansVolume": "/*OptionVolumeAnswerSoundID*/ 0",
"tapHoldVolume": "/*OptionVolumeID*/ 0",
"criticalSe": "/*OptionCriticalID*/ 0",
"tapSe": "/*OptionTapSuccessSeID*/ 0",
"breakSe": "/*OptionBreakseID*/ 0",
"breakVolume": "/*OptionVolumeID*/ 0",
"exSe": "/*OptionExseID*/ 0",
"exVolume": "/*OptionVolumeID*/ 0",
"slideSe": "/*OptionSlideseID*/ 0",
"slideVolume": "/*OptionVolumeID*/ 0",
"breakSlideVolume": "/*OptionVolumeID*/ 0",
"touchVolume": "/*OptionVolumeID*/ 0",
"touchHoldVolume": "/*OptionVolumeID*/ 0",
"damageSeVolume": "/*OptionVolumeID*/ 0",
"headPhoneVolume": "/*OptionHeadphonevolumeID*/ 0",
"sortTab": "/*SortTabID*/ 0",
"sortMusic": "/*SortMusicID*/ 0"
}
],
"userCharacterList": [
{
"characterId": 101,
"level": 3,
"awakening": 0,
"useCount": 0
}
],
"userGhost": [
{
"name": "",
"iconId": 0,
"plateId": 0,
"titleId": 0,
"rate": 0,
"udemaeRate": 0,
"courseRank": 0,
"classRank": 0,
"classValue": 0,
"playDatetime": "",
"shopId": 0,
"regionCode": 0,
"typeId": "/*MusicDifficultyID*/ 0",
"musicId": 11820,
"difficulty": 0,
"version": 0,
"resultBitList": [],
"resultNum": 0,
"achievement": 0
}
],
"userMapList": [
{
"mapId": 1,
"distance": 12345,
"isLock": false,
"isClear": false,
"isComplete": false,
"unlockFlag": 0
}
],
"userLoginBonusList": [
{
"bonusId": 0,
"point": 0,
"isCurrent": false,
"isComplete": false
}
],
"userRatingList": [
{
"rating": 0,
"ratingList": [],
"newRatingList": [],
"nextRatingList": [],
"nextNewRatingList": [],
"udemae": {}
}
],
"userItemList": [
{
"itemKind": 5,
"itemId": 5011820,
"stock": 0,
"isValid": false
}
],
"userMusicDetailList": [
{
"musicId": 11820,
"level": "/*MusicDifficultyID*/ 0",
"playCount": 0,
"achievement": 0,
"comboStatus": "/*PlayComboflagID*/ 0",
"syncStatus": "/*PlaySyncflagID*/ 0",
"deluxscoreMax": 0,
"scoreRank": "/*MusicClearrankID*/ 0",
"extNum1": 0
}
],
"userCourseList": [
{
"courseId": 0,
"isLastClear": false,
"totalRestlife": 0,
"totalAchievement": 0,
"totalDeluxscore": 0,
"playCount": 0,
"clearDate": "",
"lastPlayDate": "",
"bestAchievement": 0,
"bestAchievementDate": "",
"bestDeluxscore": 0,
"bestDeluxscoreDate": ""
}
],
"userFriendSeasonRankingList": [
{
"seasonId": 0,
"point": 0,
"rank": 0,
"rewardGet": false,
"userName": "玩家昵称",
"recordDate": ""
}
],
"userChargeList": [
{
"chargeId": 0,
"stock": 0,
"purchaseDate": "",
"validDate": ""
}
],
"userFavoriteList": [
{
"itemKind": 5,
"itemIdList": []
}
],
"userActivityList": [
{
"playList": [],
"musicList": []
}
],
"userMissionDataList": [
{
"type": 0,
"difficulty": 0,
"targetGenreId": 0,
"targetGenreTableId": 0,
"conditionGenreId": 0,
"conditionGenreTableId": 0,
"clearFlag": false
}
],
"userWeeklyData": {
"lastLoginWeek": "",
"beforeLoginWeek": "",
"friendBonusFlag": false
},
"userGamePlaylogList": [
{
"playlogId": 1,
"version": "",
"playDate": "",
"playMode": 0,
"useTicketId": 0,
"playCredit": 0,
"playTrack": 0,
"clientId": "",
"isPlayTutorial": false,
"isEventMode": false,
"isNewFree": false,
"playCount": 0,
"playSpecial": 0,
"playOtherUserId": 0
}
],
"user2pPlaylog": {
"userId1": 0,
"userId2": 0,
"userName1": "",
"userName2": "",
"regionId": 0,
"placeId": 0
},
"userIntimateList": [
{
"partnerId": 0,
"intimateLevel": 0,
"intimateCountRewarded": 0
}
],
"userShopItemStockList": [
{
"shopItemId": 0,
"tradeCount": 0
}
],
"userGetPointList": [
{
"getKind": 0,
"point": 0
}
],
"userTradeItemList": [
{
"shopItemId": 0,
"point": 0,
"tradeCount": 0
}
],
"userFavoritemusicList": [
{
"orderId": 0,
"id": 0
}
],
"userKaleidxScopeList": [
{
"gateId": 0,
"isGateFound": false,
"isKeyFound": false,
"isClear": false,
"totalRestLife": 0,
"totalAchievement": 0,
"totalDeluxscore": 0,
"bestAchievement": 0,
"bestDeluxscore": 0,
"bestAchievementDate": "",
"bestDeluxscoreDate": "",
"playCount": 0,
"clearDate": "",
"lastPlayDate": "",
"isInfoWatched": false
}
],
"isNewCharacterList": "10",
"isNewMapList": "10",
"isNewLoginBonusList": "10",
"isNewItemList": "10",
"isNewMusicDetailList": "10",
"isNewCourseList": "10",
"isNewFavoriteList": "10",
"isNewFriendSeasonRankingList": "10",
"isNewUserIntimateList": "10",
"isNewFavoritemusicList": "10",
"isNewKaleidxScopeList": "10"
}
}响应(UpsertResponseVO):
{
"returnCode": 1,
"apiName": ""
}服务器实现要点
- 严格按 isNew 位图 INSERT/UPDATE,位图字符串与数组按位对齐
- userItemList 的 kind=5 条目落库后,下次 GetUserItemApi 要能原样返回
- userMapList 合并时注意 distance 取较大值(断线重传保护)
- 返回 returnCode=1;失败会导致客户端走保存错误流程
UploadUserPortraitApi — 上传面部肖像
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 999544dfe5ce115b0078ba6545833222(= MD5("UploadUserPortraitApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketUploadUserPortrait |
| 请求 VO | UploadUserPortraitRequestVO |
| 响应 VO | UpsertResponseVO |
| 触发时机 | 数据保存画面(StateULUserAime,拍了头像才发) |
| 调用位置 | UserDataULState/StateULUserAime.cs |
面部肖像上传:拍头像功能开启时(TakeFaceIcon),把 {userId}.jpg 以 Base64 分片(divNumber/divLength)放入 UserPortrait 上传,仍走 AES 加密 JSON 通道。
请求字段(UploadUserPortraitRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userPortrait | UserPortrait | 嵌套数据对象 |
响应字段(UpsertResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
returnCode | int | 结果码(1 = 成功) |
apiName | string | 回显的 API 名 |
JSON 示例
请求(UploadUserPortraitRequestVO):
{
"userPortrait": {
"userId": 100000000000000001,
"divNumber": 0,
"divLength": 0,
"divData": "",
"placeId": 0,
"clientId": "",
"uploadDate": "",
"fileName": ""
}
}响应(UpsertResponseVO):
{
"returnCode": 1,
"apiName": ""
}服务器实现要点
- 按 divNumber 拼接分片后 Base64 解码存文件
- 功能未开启时该请求不会发出
UploadUserPhotoApi — 上传游玩照片
| 项目 | 内容 |
|---|---|
| 实际请求路径 | c7f138e34c0ef206cb64f7fd0073f15a(= MD5("UploadUserPhotoApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketUploadUserPhoto |
| 请求 VO | UserPhotoRequestVO |
| 响应 VO | UpsertResponseVO |
| 触发时机 | 数据保存画面(StateULUserAime,拍了照片才发) |
| 调用位置 | UserDataULState/StateULUserAime.cs |
游玩照片上传:结算时拍摄的照片(JPEG Base64 分片)+ 关联的 playlogId/trackNo。
请求字段(UserPhotoRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userPhoto | UserPhoto | 嵌套数据对象 |
响应字段(UpsertResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
returnCode | int | 结果码(1 = 成功) |
apiName | string | 回显的 API 名 |
JSON 示例
请求(UserPhotoRequestVO):
{
"userPhoto": {
"orderId": 0,
"userId": 100000000000000001,
"divNumber": 0,
"divLength": 0,
"divData": "",
"placeId": 0,
"clientId": "",
"uploadDate": "",
"playlogId": 1,
"trackNo": 0
}
}响应(UpsertResponseVO):
{
"returnCode": 1,
"apiName": ""
}服务器实现要点
- 与 Portrait 同样的分片拼接方式
- GameSetting.uploadPhotoDisable=true 时不会发出
UpsertUserChargelogApi — 上传扣费记录
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 4411a4c8f7f5c0e95a3ac17f1746aad3(= MD5("UpsertUserChargelogApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketUploadUserChargelog |
| 请求 VO | UserChargelogRequestVO |
| 响应 VO | UpsertResponseVO |
| 触发时机 | 扣票/扣费时(Manager/TicketManager) |
| 调用位置 | Manager/TicketManager.cs |
扣费记录上传:玩家使用收费项(门票/通行证)时由 TicketManager 调用,请求携带 UserChargelog(扣费流水:chargeId/price/时间/机器)与扣费后的 UserCharge 余量。
请求字段(UserChargelogRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | ulong | 玩家 ID(64 位,由 Aime 卡号派生) |
userChargelog | UserChargelog | 嵌套数据对象 |
userCharge | UserCharge | 嵌套数据对象 |
loginDateTime | long | 登录时间(Unix 秒) |
响应字段(UpsertResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
returnCode | int | 结果码(1 = 成功) |
apiName | string | 回显的 API 名 |
JSON 示例
请求(UserChargelogRequestVO):
{
"userId": 100000000000000001,
"userChargelog": {
"chargeId": 0,
"price": 0,
"purchaseDate": "",
"playCount": 0,
"playerRating": 0,
"placeId": 0,
"regionId": 0,
"clientId": ""
},
"userCharge": {
"chargeId": 0,
"stock": 0,
"purchaseDate": "",
"validDate": ""
},
"loginDateTime": 0
}响应(UpsertResponseVO):
{
"returnCode": 1,
"apiName": ""
}服务器实现要点
- 同时更新 UserCharge.stock 与插入流水记录
UserFriendRegistApi — 注册好友
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 03c57f0a9ab0a73525acbeae5d1c6475(= MD5("UserFriendRegistApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketGetUserFriendRegist |
| 请求 VO | UserFriendRegistRequestVO |
| 响应 VO | UserFriendRegistResponseVO |
| 触发时机 | 加好友画面(AddFriendProcess) |
| 调用位置 | Process/AddFriendProcess.cs |
好友注册:请求带双方 userId(userId1=发起者,userId2=目标),返回两个 returnCode(各自侧的结果)。
请求字段(UserFriendRegistRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
userId1 | ulong | — |
userId2 | ulong | — |
响应字段(UserFriendRegistResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
returnCode1 | int | — |
returnCode2 | int | — |
JSON 示例
请求(UserFriendRegistRequestVO):
{
"userId1": 0,
"userId2": 0
}响应(UserFriendRegistResponseVO):
{
"returnCode1": 0,
"returnCode2": 0
}服务器实现要点
- 校验目标存在性后写好友关系表
机器遥测上传(与玩家数据无关)
UpsertClientPlayTimeApi — 运行时长上报
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 4108f72e2e705d95ca13b110da00a192(= MD5("UpsertClientPlayTimeApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketUpsertClientPlayTime |
| 请求 VO | ClientPlayTimeRequestVO |
| 响应 VO | UpsertResponseVO |
| 触发时机 | 开机/登出(Manager.Operation/DataUploader 统一上报) |
| 调用位置 | Manager.Operation/DataUploader.cs |
机器运行时长上报(ClientPlayTime 对象),用于运营统计,与玩家数据完全无关。
请求字段(ClientPlayTimeRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
clientPlayTime | ClientPlayTime | 嵌套数据对象 |
响应字段(UpsertResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
returnCode | int | 结果码(1 = 成功) |
apiName | string | 回显的 API 名 |
JSON 示例
请求(ClientPlayTimeRequestVO):
{
"clientPlayTime": {
"placeId": 0,
"clientId": "",
"updateDate": "",
"playTimeTrack3": 0,
"playTimeTrack4": 0,
"playTime2P": 0,
"playTrack3Num": 0,
"playTrack4Num": 0,
"play2PNum": 0,
"regionId": 0
}
}响应(UpsertResponseVO):
{
"returnCode": 1,
"apiName": ""
}服务器实现要点
- 收到即返回 returnCode=1,可忽略内容
UpsertClientBookkeepingApi — 记账上报
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 4eb04fbfca108080912b7fe9b5b7d81b(= MD5("UpsertClientBookkeepingApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketUpsertClientBookkeeping |
| 请求 VO | ClientBookkeepingRequestVO |
| 响应 VO | UpsertResponseVO |
| 触发时机 | 开机/登出(DataUploader) |
| 调用位置 | Manager.Operation/DataUploader.cs |
记账上报(ClientBookkeeping:投入金额/计数等经营统计)。
请求字段(ClientBookkeepingRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
clientBookkeeping | ClientBookkeeping | 嵌套数据对象 |
响应字段(UpsertResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
returnCode | int | 结果码(1 = 成功) |
apiName | string | 回显的 API 名 |
JSON 示例
请求(ClientBookkeepingRequestVO):
{
"clientBookkeeping": {
"placeId": 0,
"clientId": "",
"updateDate": "",
"creditSetting0": 0,
"creditSetting1": 0,
"creditSetting2": 0,
"credits1P": 0,
"credits2P": 0,
"creditsFreedom": 0,
"creditsTicket": 0,
"creditCoin": 0,
"creditService": 0,
"creditEmoney": 0,
"timeTotal": 0,
"timeTotalPlay": 0,
"timeLongest1P": 0,
"timeShortest1P": 0,
"timeLongest2P": 0,
"timeShortest2P": 0,
"timeLongestFreedom": 0,
"timeShortestFreedom": 0,
"newFreeUserNum": 0,
"tutorialPlay": 0,
"play1PNum": 0,
"play2PNum": 0,
"playFreedomNum": 0,
"aimeLoginNum": 0,
"guestLoginNum": 0,
"regionId": 0,
"playCount": 0,
"coinToCredit": 0,
"errorNum": [
0
],
"error2Num": [
0
],
"pingResult": [
"/*BackupNetworkInformationRecord.PingResult*/ 0"
]
}
}响应(UpsertResponseVO):
{
"returnCode": 1,
"apiName": ""
}服务器实现要点
- 同上,空落库
UpsertClientSettingApi — 客户端设置上报
| 项目 | 内容 |
|---|---|
| 实际请求路径 | d8993e38905c2f70055526e9374525ab(= MD5("UpsertClientSettingApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketUpsertClientSetting |
| 请求 VO | ClientSettingRequestVO |
| 响应 VO | UpsertResponseVO |
| 触发时机 | 开机(DataUploader) |
| 调用位置 | Manager.Operation/DataUploader.cs |
客户端设置快照上报(ClientSetting)。
请求字段(ClientSettingRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
clientSetting | ClientSetting | 嵌套数据对象 |
响应字段(UpsertResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
returnCode | int | 结果码(1 = 成功) |
apiName | string | 回显的 API 名 |
JSON 示例
请求(ClientSettingRequestVO):
{
"clientSetting": {
"placeId": 0,
"clientId": "",
"placeName": "",
"regionId": 0,
"regionName": "",
"bordId": "",
"romVersion": 0,
"isDevelop": false,
"isAou": false
}
}响应(UpsertResponseVO):
{
"returnCode": 1,
"apiName": ""
}服务器实现要点
- 同上
UpsertClientTestmodeApi — TestMode 上报
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 06077887693dbf9409a313f85ac79e31(= MD5("UpsertClientTestmodeApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketUpsertClientTestmode |
| 请求 VO | ClientTestmodeRequestVO |
| 响应 VO | UpsertResponseVO |
| 触发时机 | 开机(DataUploader) |
| 调用位置 | Manager.Operation/DataUploader.cs |
测试菜单(TestMode)配置快照上报。
请求字段(ClientTestmodeRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
clientTestmode | ClientTestmode | 嵌套数据对象 |
响应字段(UpsertResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
returnCode | int | 结果码(1 = 成功) |
apiName | string | 回显的 API 名 |
JSON 示例
请求(ClientTestmodeRequestVO):
{
"clientTestmode": {
"placeId": 0,
"clientId": "",
"trackSingle": 0,
"trackMulti": 0,
"trackEvent": 0,
"totalMachine": 0,
"satelliteId": 0,
"cameraPosition": 0
}
}响应(UpsertResponseVO):
{
"returnCode": 1,
"apiName": ""
}服务器实现要点
- 同上
UpsertClientUploadApi — 错误/日志上报
| 项目 | 内容 |
|---|---|
| 实际请求路径 | 52bd19660530dc4f9efc31617edf3517(= MD5("UpsertClientUploadApiMaimaiChn8bF76dE9")) |
| Packet 类 | PacketUpsertClientUpload |
| 请求 VO | ClientUploadRequestVO |
| 响应 VO | UpsertResponseVO |
| 触发时机 | 异常时(DataUploader) |
| 调用位置 | Manager.Operation/DataUploader.cs |
客户端错误/诊断信息上报(ClientUpload),对应机器本地 UploadData 目录的收集内容。
请求字段(ClientUploadRequestVO)
| 字段 | 类型 | 说明 |
|---|---|---|
clientUpload | ClientUpload | 嵌套数据对象 |
响应字段(UpsertResponseVO)
| 字段 | 类型 | 说明 |
|---|---|---|
returnCode | int | 结果码(1 = 成功) |
apiName | string | 回显的 API 名 |
JSON 示例
请求(ClientUploadRequestVO):
{
"clientUpload": {
"orderId": 0,
"divNumber": 0,
"divLength": 0,
"divData": "",
"placeId": 0,
"clientId": "",
"uploadDate": "",
"fileName": ""
}
}响应(UpsertResponseVO):
{
"returnCode": 1,
"apiName": ""
}服务器实现要点
- 同上
附录 A:数据类(VO)参考
以下为全部非请求/响应包装的数据类(包装类已在各 API 小节给出示例)。
ClientBookkeeping
| 字段 | C# 类型 |
|---|---|
placeId | int |
clientId | string |
updateDate | string |
creditSetting0 | int |
creditSetting1 | int |
creditSetting2 | int |
credits1P | int |
credits2P | int |
creditsFreedom | int |
creditsTicket | int |
creditCoin | int |
creditService | int |
creditEmoney | int |
timeTotal | int |
timeTotalPlay | int |
timeLongest1P | int |
timeShortest1P | int |
timeLongest2P | int |
timeShortest2P | int |
timeLongestFreedom | int |
timeShortestFreedom | int |
newFreeUserNum | int |
tutorialPlay | int |
play1PNum | int |
play2PNum | int |
playFreedomNum | int |
aimeLoginNum | int |
guestLoginNum | int |
regionId | int |
playCount | int |
coinToCredit | int |
errorNum | int[] |
error2Num | int[] |
pingResult | BackupNetworkInformationRecord.PingResult[] |
{
"placeId": 0,
"clientId": "",
"updateDate": "",
"creditSetting0": 0,
"creditSetting1": 0,
"creditSetting2": 0,
"credits1P": 0,
"credits2P": 0,
"creditsFreedom": 0,
"creditsTicket": 0,
"creditCoin": 0,
"creditService": 0,
"creditEmoney": 0,
"timeTotal": 0,
"timeTotalPlay": 0,
"timeLongest1P": 0,
"timeShortest1P": 0,
"timeLongest2P": 0,
"timeShortest2P": 0,
"timeLongestFreedom": 0,
"timeShortestFreedom": 0,
"newFreeUserNum": 0,
"tutorialPlay": 0,
"play1PNum": 0,
"play2PNum": 0,
"playFreedomNum": 0,
"aimeLoginNum": 0,
"guestLoginNum": 0,
"regionId": 0,
"playCount": 0,
"coinToCredit": 0,
"errorNum": [
0
],
"error2Num": [
0
],
"pingResult": [
"/*BackupNetworkInformationRecord.PingResult*/ 0"
]
}ClientPlayTime
| 字段 | C# 类型 |
|---|---|
placeId | int |
clientId | string |
updateDate | string |
playTimeTrack3 | int |
playTimeTrack4 | int |
playTime2P | int |
playTrack3Num | int |
playTrack4Num | int |
play2PNum | int |
regionId | int |
{
"placeId": 0,
"clientId": "",
"updateDate": "",
"playTimeTrack3": 0,
"playTimeTrack4": 0,
"playTime2P": 0,
"playTrack3Num": 0,
"playTrack4Num": 0,
"play2PNum": 0,
"regionId": 0
}ClientSetting
| 字段 | C# 类型 |
|---|---|
placeId | int |
clientId | string |
placeName | string |
regionId | int |
regionName | string |
bordId | string |
romVersion | int |
isDevelop | bool |
isAou | bool |
{
"placeId": 0,
"clientId": "",
"placeName": "",
"regionId": 0,
"regionName": "",
"bordId": "",
"romVersion": 0,
"isDevelop": false,
"isAou": false
}ClientTestmode
| 字段 | C# 类型 |
|---|---|
placeId | int |
clientId | string |
trackSingle | int |
trackMulti | int |
trackEvent | int |
totalMachine | int |
satelliteId | int |
cameraPosition | int |
{
"placeId": 0,
"clientId": "",
"trackSingle": 0,
"trackMulti": 0,
"trackEvent": 0,
"totalMachine": 0,
"satelliteId": 0,
"cameraPosition": 0
}ClientUpload
| 字段 | C# 类型 |
|---|---|
orderId | int |
divNumber | int |
divLength | int |
divData | string |
placeId | int |
clientId | string |
uploadDate | string |
fileName | string |
{
"orderId": 0,
"divNumber": 0,
"divLength": 0,
"divData": "",
"placeId": 0,
"clientId": "",
"uploadDate": "",
"fileName": ""
}DelayLog
| 字段 | C# 类型 |
|---|---|
dlRequests | int |
dlSize | int |
dlRetry | int |
loginMsec | int |
saveMsec | int |
reductionMusic | int |
reductionItem | int |
{
"dlRequests": 0,
"dlSize": 0,
"dlRetry": 0,
"loginMsec": 0,
"saveMsec": 0,
"reductionMusic": 0,
"reductionItem": 0
}GameCharge
| 字段 | C# 类型 |
|---|---|
orderId | int |
chargeId | int |
price | int |
startDate | string |
endDate | string |
{
"orderId": 0,
"chargeId": 0,
"price": 0,
"startDate": "",
"endDate": ""
}GameEvent
| 字段 | C# 类型 |
|---|---|
type | int |
id | int |
startDate | string |
endDate | string |
{
"type": 0,
"id": 0,
"startDate": "",
"endDate": ""
}GameKaleidxScope
| 字段 | C# 类型 |
|---|---|
gateId | int |
phaseId | int |
{
"gateId": 0,
"phaseId": 0
}GameRanking
| 字段 | C# 类型 |
|---|---|
id | long |
point | long |
userName | string |
{
"id": 0,
"point": 0,
"userName": "玩家昵称"
}GameSetting
| 字段 | C# 类型 |
|---|---|
isMaintenance | bool |
requestInterval | int |
rebootStartTime | string |
rebootEndTime | string |
movieUploadLimit | int |
movieStatus | int |
movieServerUri | string |
deliverServerUri | string |
oldServerUri | string |
usbDlServerUri | string |
rebootInterval | int |
pingDisable | bool |
packetTimeout | int |
packetTimeoutLong | int |
packetRetryCount | int |
userDataDlErrTimeout | int |
userDataDlErrRetryCount | int |
userDataDlErrSamePacketRetryCount | int |
userDataUpSkipTimeout | int |
userDataUpSkipRetryCount | int |
iconPhotoDisable | bool |
uploadPhotoDisable | bool |
nameEntryDisable | bool |
packetRecreateCount | int |
collectDelayInfoDisable | bool |
{
"isMaintenance": false,
"requestInterval": 0,
"rebootStartTime": "",
"rebootEndTime": "",
"movieUploadLimit": 0,
"movieStatus": 0,
"movieServerUri": "",
"deliverServerUri": "",
"oldServerUri": "",
"usbDlServerUri": "",
"rebootInterval": 0,
"pingDisable": false,
"packetTimeout": 0,
"packetTimeoutLong": 0,
"packetRetryCount": 0,
"userDataDlErrTimeout": 0,
"userDataDlErrRetryCount": 0,
"userDataDlErrSamePacketRetryCount": 0,
"userDataUpSkipTimeout": 0,
"userDataUpSkipRetryCount": 0,
"iconPhotoDisable": false,
"uploadPhotoDisable": false,
"nameEntryDisable": false,
"packetRecreateCount": 0,
"collectDelayInfoDisable": false
}GameTournamentInfo
| 字段 | C# 类型 |
|---|---|
tournamentId | int |
tournamentName | string |
rankingKind | int |
scoreType | int |
noticeStartDate | string |
noticeEndDate | string |
startDate | string |
endDate | string |
entryStartDate | string |
entryEndDate | string |
gameTournamentMusicList | GameTournamentMusic[] |
{
"tournamentId": 0,
"tournamentName": "",
"rankingKind": 0,
"scoreType": 0,
"noticeStartDate": "",
"noticeEndDate": "",
"startDate": "",
"endDate": "",
"entryStartDate": "",
"entryEndDate": "",
"gameTournamentMusicList": [
{
"tournamentId": 0,
"musicId": 11820,
"level": 3,
"isFirstLock": false
}
]
}GameTournamentMusic
| 字段 | C# 类型 |
|---|---|
tournamentId | int |
musicId | int |
level | int |
isFirstLock | bool |
{
"tournamentId": 0,
"musicId": 11820,
"level": 3,
"isFirstLock": false
}GameWeeklyData
| 字段 | C# 类型 |
|---|---|
missionCategory | int |
updateDate | string |
beforeDate | string |
{
"missionCategory": 0,
"updateDate": "",
"beforeDate": ""
}MapEncountNpc
| 字段 | C# 类型 |
|---|---|
npcId | int |
musicId | int |
{
"npcId": 0,
"musicId": 11820
}MusicScore
| 字段 | C# 类型 |
|---|---|
musicId | int |
level | int |
type | int |
scoreData | string |
{
"musicId": 11820,
"level": 3,
"type": 0,
"scoreData": ""
}RequestAPI
| 字段 | C# 类型 |
|---|---|
count | int |
size | int |
msec | int |
retry | int |
{
"count": 0,
"size": 0,
"msec": 0,
"retry": 0
}TransferFriend
| 字段 | C# 类型 |
|---|---|
playUserId | ulong |
playUserName | string |
playDate | string |
friendPoint | int |
isFavorite | bool |
{
"playUserId": 0,
"playUserName": "",
"playDate": "",
"friendPoint": 0,
"isFavorite": false
}TransferRequestVO
| 字段 | C# 类型 |
|---|---|
userId | ulong |
userData | UserDetail[] |
userMusicDetailList | UserMusicDetail[] |
isNewMusicDetailList | string |
{
"userId": 100000000000000001,
"userData": [
{
"accessCode": "604012345678901234",
"userName": "玩家昵称",
"isNetMember": 0,
"point": 0,
"totalPoint": 0,
"iconId": 0,
"plateId": 0,
"titleId": 0,
"partnerId": 0,
"frameId": 0,
"selectMapId": 0,
"totalAwake": 0,
"gradeRating": 0,
"musicRating": 0,
"playerRating": 0,
"highestRating": 0,
"gradeRank": 0,
"classRank": 0,
"courseRank": 0,
"charaSlot": [],
"charaLockSlot": [],
"contentBit": 0,
"playCount": 0,
"currentPlayCount": 0,
"renameCredit": 0,
"mapStock": 0,
"eventWatchedDate": "",
"lastGameId": "",
"lastRomVersion": "",
"lastDataVersion": "",
"lastLoginDate": "",
"lastPlayDate": "",
"lastPlayCredit": 0,
"lastPlayMode": 0,
"lastPlaceId": 0,
"lastPlaceName": "",
"lastAllNetId": 0,
"lastRegionId": 0,
"lastRegionName": "",
"lastClientId": "",
"lastCountryCode": "",
"lastSelectEMoney": 0,
"lastSelectTicket": 0,
"lastSelectCourse": 0,
"lastCountCourse": 0,
"firstGameId": "",
"firstRomVersion": "",
"firstDataVersion": "",
"firstPlayDate": "",
"compatibleCmVersion": "",
"dailyBonusDate": "",
"dailyCourseBonusDate": "",
"lastPairLoginDate": "",
"lastTrialPlayDate": "",
"playVsCount": 0,
"playSyncCount": 0,
"winCount": 0,
"helpCount": 0,
"comboCount": 0,
"totalDeluxscore": 0,
"totalBasicDeluxscore": 0,
"totalAdvancedDeluxscore": 0,
"totalExpertDeluxscore": 0,
"totalMasterDeluxscore": 0,
"totalReMasterDeluxscore": 0,
"totalSync": 0,
"totalBasicSync": 0,
"totalAdvancedSync": 0,
"totalExpertSync": 0,
"totalMasterSync": 0,
"totalReMasterSync": 0,
"totalAchievement": 0,
"totalBasicAchievement": 0,
"totalAdvancedAchievement": 0,
"totalExpertAchievement": 0,
"totalMasterAchievement": 0,
"totalReMasterAchievement": 0,
"playerOldRating": 0,
"playerNewRating": 0,
"banState": 0,
"friendRegistSkip": 0,
"dateTime": 0
}
],
"userMusicDetailList": [
{
"musicId": 11820,
"level": "/*MusicDifficultyID*/ 0",
"playCount": 0,
"achievement": 0,
"comboStatus": "/*PlayComboflagID*/ 0",
"syncStatus": "/*PlaySyncflagID*/ 0",
"deluxscoreMax": 0,
"scoreRank": "/*MusicClearrankID*/ 0",
"extNum1": 0
}
],
"isNewMusicDetailList": "10"
}User2pPlaylog
| 字段 | C# 类型 |
|---|---|
userId1 | ulong |
userId2 | ulong |
userName1 | string |
userName2 | string |
regionId | int |
placeId | int |
{
"userId1": 0,
"userId2": 0,
"userName1": "",
"userName2": "",
"regionId": 0,
"placeId": 0
}User2pPlaylogDetail
| 字段 | C# 类型 |
|---|---|
musicId | int |
level | int |
achievement | int |
deluxscore | int |
userPlayDate | string |
{
"musicId": 11820,
"level": 3,
"achievement": 0,
"deluxscore": 0,
"userPlayDate": ""
}UserAct
| 字段 | C# 类型 |
|---|---|
kind | int |
id | int |
sortNumber | long |
param1 | int |
param2 | int |
param3 | int |
param4 | int |
{
"kind": 0,
"id": 0,
"sortNumber": 0,
"param1": 0,
"param2": 0,
"param3": 0,
"param4": 0
}UserActivity
| 字段 | C# 类型 |
|---|---|
playList | UserAct[] |
musicList | UserAct[] |
{
"playList": [
{
"kind": 0,
"id": 0,
"sortNumber": 0,
"param1": 0,
"param2": 0,
"param3": 0,
"param4": 0
}
],
"musicList": [
{
"kind": 0,
"id": 0,
"sortNumber": 0,
"param1": 0,
"param2": 0,
"param3": 0,
"param4": 0
}
]
}UserAll
| 字段 | C# 类型 |
|---|---|
userData | UserDetail[] |
userExtend | UserExtend[] |
userOption | UserOption[] |
userCharacterList | UserCharacter[] |
userGhost | UserGhost[] |
userMapList | UserMap[] |
userLoginBonusList | UserLoginBonus[] |
userRatingList | UserRating[] |
userItemList | UserItem[] |
userMusicDetailList | UserMusicDetail[] |
userCourseList | UserCourse[] |
userFriendSeasonRankingList | UserFriendSeasonRanking[] |
userChargeList | UserCharge[] |
userFavoriteList | UserFavorite[] |
userActivityList | UserActivity[] |
userMissionDataList | UserMissionData[] |
userWeeklyData | UserWeeklyData |
userGamePlaylogList | UserGamePlaylog[] |
user2pPlaylog | User2pPlaylog |
userIntimateList | UserIntimate[] |
userShopItemStockList | UserShopStock[] |
userGetPointList | UserGetPoint[] |
userTradeItemList | UserTradeItem[] |
userFavoritemusicList | UserFavoriteItem[] |
userKaleidxScopeList | UserKaleidxScope[] |
isNewCharacterList | string |
isNewMapList | string |
isNewLoginBonusList | string |
isNewItemList | string |
isNewMusicDetailList | string |
isNewCourseList | string |
isNewFavoriteList | string |
isNewFriendSeasonRankingList | string |
isNewUserIntimateList | string |
isNewFavoritemusicList | string |
isNewKaleidxScopeList | string |
{
"userData": [
{
"accessCode": "604012345678901234",
"userName": "玩家昵称",
"isNetMember": 0,
"point": 0,
"totalPoint": 0,
"iconId": 0,
"plateId": 0,
"titleId": 0,
"partnerId": 0,
"frameId": 0,
"selectMapId": 0,
"totalAwake": 0,
"gradeRating": 0,
"musicRating": 0,
"playerRating": 0,
"highestRating": 0,
"gradeRank": 0,
"classRank": 0,
"courseRank": 0,
"charaSlot": [],
"charaLockSlot": [],
"contentBit": 0,
"playCount": 0,
"currentPlayCount": 0,
"renameCredit": 0,
"mapStock": 0,
"eventWatchedDate": "",
"lastGameId": "",
"lastRomVersion": "",
"lastDataVersion": "",
"lastLoginDate": "",
"lastPlayDate": "",
"lastPlayCredit": 0,
"lastPlayMode": 0,
"lastPlaceId": 0,
"lastPlaceName": "",
"lastAllNetId": 0,
"lastRegionId": 0,
"lastRegionName": "",
"lastClientId": "",
"lastCountryCode": "",
"lastSelectEMoney": 0,
"lastSelectTicket": 0,
"lastSelectCourse": 0,
"lastCountCourse": 0,
"firstGameId": "",
"firstRomVersion": "",
"firstDataVersion": "",
"firstPlayDate": "",
"compatibleCmVersion": "",
"dailyBonusDate": "",
"dailyCourseBonusDate": "",
"lastPairLoginDate": "",
"lastTrialPlayDate": "",
"playVsCount": 0,
"playSyncCount": 0,
"winCount": 0,
"helpCount": 0,
"comboCount": 0,
"totalDeluxscore": 0,
"totalBasicDeluxscore": 0,
"totalAdvancedDeluxscore": 0,
"totalExpertDeluxscore": 0,
"totalMasterDeluxscore": 0,
"totalReMasterDeluxscore": 0,
"totalSync": 0,
"totalBasicSync": 0,
"totalAdvancedSync": 0,
"totalExpertSync": 0,
"totalMasterSync": 0,
"totalReMasterSync": 0,
"totalAchievement": 0,
"totalBasicAchievement": 0,
"totalAdvancedAchievement": 0,
"totalExpertAchievement": 0,
"totalMasterAchievement": 0,
"totalReMasterAchievement": 0,
"playerOldRating": 0,
"playerNewRating": 0,
"banState": 0,
"friendRegistSkip": 0,
"dateTime": 0
}
],
"userExtend": [
{
"selectMusicId": 0,
"selectDifficultyId": 0,
"categoryIndex": 0,
"musicIndex": 0,
"extraFlag": 0,
"selectScoreType": 0,
"extendContentBit": 0,
"isPhotoAgree": false,
"isGotoCodeRead": false,
"selectResultDetails": false,
"selectResultScoreViewType": 0,
"sortCategorySetting": "/*SortTabID*/ 0",
"sortMusicSetting": "/*SortMusicID*/ 0",
"playStatusSetting": "/*PlaystatusTabID*/ 0",
"selectedCardList": [],
"encountMapNpcList": []
}
],
"userOption": [
{
"optionKind": "/*OptionKindID*/ 0",
"noteSpeed": "/*OptionNotespeedID*/ 0",
"slideSpeed": "/*OptionSlidespeedID*/ 0",
"touchSpeed": "/*OptionTouchspeedID*/ 0",
"tapDesign": "/*OptionGametapID*/ 0",
"holdDesign": "/*OptionGameholdID*/ 0",
"slideDesign": "/*OptionGameslideID*/ 0",
"starType": "/*OptionStartypeID*/ 0",
"outlineDesign": "/*OptionGameoutlineID*/ 0",
"noteSize": "/*OptionNotesizeID*/ 0",
"slideSize": "/*OptionSlidesizeID*/ 0",
"touchSize": "/*OptionTouchsizeID*/ 0",
"starRotate": "/*OptionStarrotateID*/ 0",
"dispCenter": "/*OptionCenterdisplayID*/ 0",
"outFrameType": "/*OptionOutframedisplayID*/ 0",
"dispChain": "/*OptionDispchainID*/ 0",
"dispRate": "/*OptionDisprateID*/ 0",
"dispBar": "/*OptionDispbarlineID*/ 0",
"touchEffect": "/*OptionToucheffectID*/ 0",
"submonitorAnimation": "/*OptionSubmonitorID*/ 0",
"submonitorAchive": "/*OptionSubmonAchiveID*/ 0",
"submonitorAppeal": "/*OptionAppealID*/ 0",
"matching": "/*OptionMatchingID*/ 0",
"trackSkip": "/*OptionTrackskipID*/ 0",
"brightness": "/*OptionMoviebrightnessID*/ 0",
"mirrorMode": "/*OptionMirrorID*/ 0",
"dispJudge": "/*OptionDispjudgeID*/ 0",
"dispJudgePos": "/*OptionDispjudgeposID*/ 0",
"dispJudgeTouchPos": "/*OptionDispjudgetouchposID*/ 0",
"adjustTiming": "/*OptionJudgetimingID*/ 0",
"judgeTiming": "/*OptionJudgetimingID*/ 0",
"ansVolume": "/*OptionVolumeAnswerSoundID*/ 0",
"tapHoldVolume": "/*OptionVolumeID*/ 0",
"criticalSe": "/*OptionCriticalID*/ 0",
"tapSe": "/*OptionTapSuccessSeID*/ 0",
"breakSe": "/*OptionBreakseID*/ 0",
"breakVolume": "/*OptionVolumeID*/ 0",
"exSe": "/*OptionExseID*/ 0",
"exVolume": "/*OptionVolumeID*/ 0",
"slideSe": "/*OptionSlideseID*/ 0",
"slideVolume": "/*OptionVolumeID*/ 0",
"breakSlideVolume": "/*OptionVolumeID*/ 0",
"touchVolume": "/*OptionVolumeID*/ 0",
"touchHoldVolume": "/*OptionVolumeID*/ 0",
"damageSeVolume": "/*OptionVolumeID*/ 0",
"headPhoneVolume": "/*OptionHeadphonevolumeID*/ 0",
"sortTab": "/*SortTabID*/ 0",
"sortMusic": "/*SortMusicID*/ 0"
}
],
"userCharacterList": [
{
"characterId": 101,
"level": 3,
"awakening": 0,
"useCount": 0
}
],
"userGhost": [
{
"name": "",
"iconId": 0,
"plateId": 0,
"titleId": 0,
"rate": 0,
"udemaeRate": 0,
"courseRank": 0,
"classRank": 0,
"classValue": 0,
"playDatetime": "",
"shopId": 0,
"regionCode": 0,
"typeId": "/*MusicDifficultyID*/ 0",
"musicId": 11820,
"difficulty": 0,
"version": 0,
"resultBitList": [],
"resultNum": 0,
"achievement": 0
}
],
"userMapList": [
{
"mapId": 1,
"distance": 12345,
"isLock": false,
"isClear": false,
"isComplete": false,
"unlockFlag": 0
}
],
"userLoginBonusList": [
{
"bonusId": 0,
"point": 0,
"isCurrent": false,
"isComplete": false
}
],
"userRatingList": [
{
"rating": 0,
"ratingList": [],
"newRatingList": [],
"nextRatingList": [],
"nextNewRatingList": [],
"udemae": {}
}
],
"userItemList": [
{
"itemKind": 5,
"itemId": 5011820,
"stock": 0,
"isValid": false
}
],
"userMusicDetailList": [
{
"musicId": 11820,
"level": "/*MusicDifficultyID*/ 0",
"playCount": 0,
"achievement": 0,
"comboStatus": "/*PlayComboflagID*/ 0",
"syncStatus": "/*PlaySyncflagID*/ 0",
"deluxscoreMax": 0,
"scoreRank": "/*MusicClearrankID*/ 0",
"extNum1": 0
}
],
"userCourseList": [
{
"courseId": 0,
"isLastClear": false,
"totalRestlife": 0,
"totalAchievement": 0,
"totalDeluxscore": 0,
"playCount": 0,
"clearDate": "",
"lastPlayDate": "",
"bestAchievement": 0,
"bestAchievementDate": "",
"bestDeluxscore": 0,
"bestDeluxscoreDate": ""
}
],
"userFriendSeasonRankingList": [
{
"seasonId": 0,
"point": 0,
"rank": 0,
"rewardGet": false,
"userName": "玩家昵称",
"recordDate": ""
}
],
"userChargeList": [
{
"chargeId": 0,
"stock": 0,
"purchaseDate": "",
"validDate": ""
}
],
"userFavoriteList": [
{
"itemKind": 5,
"itemIdList": []
}
],
"userActivityList": [
{
"playList": [],
"musicList": []
}
],
"userMissionDataList": [
{
"type": 0,
"difficulty": 0,
"targetGenreId": 0,
"targetGenreTableId": 0,
"conditionGenreId": 0,
"conditionGenreTableId": 0,
"clearFlag": false
}
],
"userWeeklyData": {
"lastLoginWeek": "",
"beforeLoginWeek": "",
"friendBonusFlag": false
},
"userGamePlaylogList": [
{
"playlogId": 1,
"version": "",
"playDate": "",
"playMode": 0,
"useTicketId": 0,
"playCredit": 0,
"playTrack": 0,
"clientId": "",
"isPlayTutorial": false,
"isEventMode": false,
"isNewFree": false,
"playCount": 0,
"playSpecial": 0,
"playOtherUserId": 0
}
],
"user2pPlaylog": {
"userId1": 0,
"userId2": 0,
"userName1": "",
"userName2": "",
"regionId": 0,
"placeId": 0
},
"userIntimateList": [
{
"partnerId": 0,
"intimateLevel": 0,
"intimateCountRewarded": 0
}
],
"userShopItemStockList": [
{
"shopItemId": 0,
"tradeCount": 0
}
],
"userGetPointList": [
{
"getKind": 0,
"point": 0
}
],
"userTradeItemList": [
{
"shopItemId": 0,
"point": 0,
"tradeCount": 0
}
],
"userFavoritemusicList": [
{
"orderId": 0,
"id": 0
}
],
"userKaleidxScopeList": [
{
"gateId": 0,
"isGateFound": false,
"isKeyFound": false,
"isClear": false,
"totalRestLife": 0,
"totalAchievement": 0,
"totalDeluxscore": 0,
"bestAchievement": 0,
"bestDeluxscore": 0,
"bestAchievementDate": "",
"bestDeluxscoreDate": "",
"playCount": 0,
"clearDate": "",
"lastPlayDate": "",
"isInfoWatched": false
}
],
"isNewCharacterList": "10",
"isNewMapList": "10",
"isNewLoginBonusList": "10",
"isNewItemList": "10",
"isNewMusicDetailList": "10",
"isNewCourseList": "10",
"isNewFavoriteList": "10",
"isNewFriendSeasonRankingList": "10",
"isNewUserIntimateList": "10",
"isNewFavoritemusicList": "10",
"isNewKaleidxScopeList": "10"
}UserCard
| 字段 | C# 类型 |
|---|---|
cardId | int |
cardTypeId | int |
charaId | int |
mapId | int |
startDate | string |
endDate | string |
{
"cardId": 0,
"cardTypeId": 0,
"charaId": 0,
"mapId": 1,
"startDate": "",
"endDate": ""
}UserCharacter
| 字段 | C# 类型 |
|---|---|
characterId | int |
level | uint |
awakening | uint |
useCount | uint |
{
"characterId": 101,
"level": 3,
"awakening": 0,
"useCount": 0
}UserCharge
| 字段 | C# 类型 |
|---|---|
chargeId | int |
stock | int |
purchaseDate | string |
validDate | string |
{
"chargeId": 0,
"stock": 0,
"purchaseDate": "",
"validDate": ""
}UserChargelog
| 字段 | C# 类型 |
|---|---|
chargeId | int |
price | int |
purchaseDate | string |
playCount | int |
playerRating | int |
placeId | int |
regionId | int |
clientId | string |
{
"chargeId": 0,
"price": 0,
"purchaseDate": "",
"playCount": 0,
"playerRating": 0,
"placeId": 0,
"regionId": 0,
"clientId": ""
}UserCourse
| 字段 | C# 类型 |
|---|---|
courseId | int |
isLastClear | bool |
totalRestlife | uint |
totalAchievement | uint |
totalDeluxscore | uint |
playCount | uint |
clearDate | string |
lastPlayDate | string |
bestAchievement | uint |
bestAchievementDate | string |
bestDeluxscore | uint |
bestDeluxscoreDate | string |
{
"courseId": 0,
"isLastClear": false,
"totalRestlife": 0,
"totalAchievement": 0,
"totalDeluxscore": 0,
"playCount": 0,
"clearDate": "",
"lastPlayDate": "",
"bestAchievement": 0,
"bestAchievementDate": "",
"bestDeluxscore": 0,
"bestDeluxscoreDate": ""
}UserDetail
| 字段 | C# 类型 |
|---|---|
accessCode | string |
userName | string |
isNetMember | int |
point | int |
totalPoint | int |
iconId | int |
plateId | int |
titleId | int |
partnerId | int |
frameId | int |
selectMapId | int |
totalAwake | int |
gradeRating | int |
musicRating | int |
playerRating | int |
highestRating | int |
gradeRank | int |
classRank | int |
courseRank | int |
charaSlot | int[] |
charaLockSlot | int[] |
contentBit | ulong |
playCount | int |
currentPlayCount | int |
renameCredit | int |
mapStock | int |
eventWatchedDate | string |
lastGameId | string |
lastRomVersion | string |
lastDataVersion | string |
lastLoginDate | string |
lastPlayDate | string |
lastPlayCredit | int |
lastPlayMode | int |
lastPlaceId | int |
lastPlaceName | string |
lastAllNetId | int |
lastRegionId | int |
lastRegionName | string |
lastClientId | string |
lastCountryCode | string |
lastSelectEMoney | int |
lastSelectTicket | int |
lastSelectCourse | int |
lastCountCourse | int |
firstGameId | string |
firstRomVersion | string |
firstDataVersion | string |
firstPlayDate | string |
compatibleCmVersion | string |
dailyBonusDate | string |
dailyCourseBonusDate | string |
lastPairLoginDate | string |
lastTrialPlayDate | string |
playVsCount | int |
playSyncCount | int |
winCount | int |
helpCount | int |
comboCount | int |
totalDeluxscore | long |
totalBasicDeluxscore | long |
totalAdvancedDeluxscore | long |
totalExpertDeluxscore | long |
totalMasterDeluxscore | long |
totalReMasterDeluxscore | long |
totalSync | int |
totalBasicSync | int |
totalAdvancedSync | int |
totalExpertSync | int |
totalMasterSync | int |
totalReMasterSync | int |
totalAchievement | long |
totalBasicAchievement | long |
totalAdvancedAchievement | long |
totalExpertAchievement | long |
totalMasterAchievement | long |
totalReMasterAchievement | long |
playerOldRating | long |
playerNewRating | long |
banState | int |
friendRegistSkip | int |
dateTime | long |
{
"accessCode": "604012345678901234",
"userName": "玩家昵称",
"isNetMember": 0,
"point": 0,
"totalPoint": 0,
"iconId": 0,
"plateId": 0,
"titleId": 0,
"partnerId": 0,
"frameId": 0,
"selectMapId": 0,
"totalAwake": 0,
"gradeRating": 0,
"musicRating": 0,
"playerRating": 0,
"highestRating": 0,
"gradeRank": 0,
"classRank": 0,
"courseRank": 0,
"charaSlot": [
0
],
"charaLockSlot": [
0
],
"contentBit": 0,
"playCount": 0,
"currentPlayCount": 0,
"renameCredit": 0,
"mapStock": 0,
"eventWatchedDate": "",
"lastGameId": "",
"lastRomVersion": "",
"lastDataVersion": "",
"lastLoginDate": "",
"lastPlayDate": "",
"lastPlayCredit": 0,
"lastPlayMode": 0,
"lastPlaceId": 0,
"lastPlaceName": "",
"lastAllNetId": 0,
"lastRegionId": 0,
"lastRegionName": "",
"lastClientId": "",
"lastCountryCode": "",
"lastSelectEMoney": 0,
"lastSelectTicket": 0,
"lastSelectCourse": 0,
"lastCountCourse": 0,
"firstGameId": "",
"firstRomVersion": "",
"firstDataVersion": "",
"firstPlayDate": "",
"compatibleCmVersion": "",
"dailyBonusDate": "",
"dailyCourseBonusDate": "",
"lastPairLoginDate": "",
"lastTrialPlayDate": "",
"playVsCount": 0,
"playSyncCount": 0,
"winCount": 0,
"helpCount": 0,
"comboCount": 0,
"totalDeluxscore": 0,
"totalBasicDeluxscore": 0,
"totalAdvancedDeluxscore": 0,
"totalExpertDeluxscore": 0,
"totalMasterDeluxscore": 0,
"totalReMasterDeluxscore": 0,
"totalSync": 0,
"totalBasicSync": 0,
"totalAdvancedSync": 0,
"totalExpertSync": 0,
"totalMasterSync": 0,
"totalReMasterSync": 0,
"totalAchievement": 0,
"totalBasicAchievement": 0,
"totalAdvancedAchievement": 0,
"totalExpertAchievement": 0,
"totalMasterAchievement": 0,
"totalReMasterAchievement": 0,
"playerOldRating": 0,
"playerNewRating": 0,
"banState": 0,
"friendRegistSkip": 0,
"dateTime": 0
}UserExtend
| 字段 | C# 类型 |
|---|---|
selectMusicId | int |
selectDifficultyId | int |
categoryIndex | int |
musicIndex | int |
extraFlag | int |
selectScoreType | int |
extendContentBit | ulong |
isPhotoAgree | bool |
isGotoCodeRead | bool |
selectResultDetails | bool |
selectResultScoreViewType | int |
sortCategorySetting | SortTabID |
sortMusicSetting | SortMusicID |
playStatusSetting | PlaystatusTabID |
selectedCardList | int[] |
encountMapNpcList | MapEncountNpc[] |
{
"selectMusicId": 0,
"selectDifficultyId": 0,
"categoryIndex": 0,
"musicIndex": 0,
"extraFlag": 0,
"selectScoreType": 0,
"extendContentBit": 0,
"isPhotoAgree": false,
"isGotoCodeRead": false,
"selectResultDetails": false,
"selectResultScoreViewType": 0,
"sortCategorySetting": "/*SortTabID*/ 0",
"sortMusicSetting": "/*SortMusicID*/ 0",
"playStatusSetting": "/*PlaystatusTabID*/ 0",
"selectedCardList": [
0
],
"encountMapNpcList": [
{
"npcId": 0,
"musicId": 11820
}
]
}UserFavorite
| 字段 | C# 类型 |
|---|---|
itemKind | int |
itemIdList | int[] |
{
"itemKind": 5,
"itemIdList": [
0
]
}UserFavoriteItem
| 字段 | C# 类型 |
|---|---|
orderId | ulong |
id | ulong |
{
"orderId": 0,
"id": 0
}UserFriendBonus
| 字段 | C# 类型 |
|---|---|
returnCode | int |
getMiles | ulong |
{
"returnCode": 1,
"getMiles": 0
}UserFriendSeasonRanking
| 字段 | C# 类型 |
|---|---|
seasonId | int |
point | int |
rank | int |
rewardGet | bool |
userName | string |
recordDate | string |
{
"seasonId": 0,
"point": 0,
"rank": 0,
"rewardGet": false,
"userName": "玩家昵称",
"recordDate": ""
}UserGamePlaylog
| 字段 | C# 类型 |
|---|---|
playlogId | ulong |
version | string |
playDate | string |
playMode | int |
useTicketId | int |
playCredit | int |
playTrack | int |
clientId | string |
isPlayTutorial | bool |
isEventMode | bool |
isNewFree | bool |
playCount | int |
playSpecial | int |
playOtherUserId | ulong |
{
"playlogId": 1,
"version": "",
"playDate": "",
"playMode": 0,
"useTicketId": 0,
"playCredit": 0,
"playTrack": 0,
"clientId": "",
"isPlayTutorial": false,
"isEventMode": false,
"isNewFree": false,
"playCount": 0,
"playSpecial": 0,
"playOtherUserId": 0
}UserGamePlaylogRequestVO
| 字段 | C# 类型 |
|---|---|
userId | ulong |
userChargelog | UserGamePlaylog |
{
"userId": 100000000000000001,
"userChargelog": {
"playlogId": 1,
"version": "",
"playDate": "",
"playMode": 0,
"useTicketId": 0,
"playCredit": 0,
"playTrack": 0,
"clientId": "",
"isPlayTutorial": false,
"isEventMode": false,
"isNewFree": false,
"playCount": 0,
"playSpecial": 0,
"playOtherUserId": 0
}
}UserGetPoint
| 字段 | C# 类型 |
|---|---|
getKind | int |
point | long |
{
"getKind": 0,
"point": 0
}UserGhost
| 字段 | C# 类型 |
|---|---|
name | string |
iconId | int |
plateId | int |
titleId | int |
rate | int |
udemaeRate | int |
courseRank | uint |
classRank | uint |
classValue | int |
playDatetime | string |
shopId | uint |
regionCode | int |
typeId | MusicDifficultyID |
musicId | int |
difficulty | int |
version | int |
resultBitList | byte[] |
resultNum | int |
achievement | int |
{
"name": "",
"iconId": 0,
"plateId": 0,
"titleId": 0,
"rate": 0,
"udemaeRate": 0,
"courseRank": 0,
"classRank": 0,
"classValue": 0,
"playDatetime": "",
"shopId": 0,
"regionCode": 0,
"typeId": "/*MusicDifficultyID*/ 0",
"musicId": 11820,
"difficulty": 0,
"version": 0,
"resultBitList": [
0
],
"resultNum": 0,
"achievement": 0
}UserIntimate
| 字段 | C# 类型 |
|---|---|
partnerId | int |
intimateLevel | int |
intimateCountRewarded | int |
{
"partnerId": 0,
"intimateLevel": 0,
"intimateCountRewarded": 0
}UserItem
| 字段 | C# 类型 |
|---|---|
itemKind | int |
itemId | int |
stock | int |
isValid | bool |
{
"itemKind": 5,
"itemId": 5011820,
"stock": 0,
"isValid": false
}UserKaleidxScope
| 字段 | C# 类型 |
|---|---|
gateId | int |
isGateFound | bool |
isKeyFound | bool |
isClear | bool |
totalRestLife | int |
totalAchievement | int |
totalDeluxscore | int |
bestAchievement | int |
bestDeluxscore | int |
bestAchievementDate | string |
bestDeluxscoreDate | string |
playCount | int |
clearDate | string |
lastPlayDate | string |
isInfoWatched | bool |
{
"gateId": 0,
"isGateFound": false,
"isKeyFound": false,
"isClear": false,
"totalRestLife": 0,
"totalAchievement": 0,
"totalDeluxscore": 0,
"bestAchievement": 0,
"bestDeluxscore": 0,
"bestAchievementDate": "",
"bestDeluxscoreDate": "",
"playCount": 0,
"clearDate": "",
"lastPlayDate": "",
"isInfoWatched": false
}UserLoginBonus
| 字段 | C# 类型 |
|---|---|
bonusId | int |
point | uint |
isCurrent | bool |
isComplete | bool |
{
"bonusId": 0,
"point": 0,
"isCurrent": false,
"isComplete": false
}UserMap
| 字段 | C# 类型 |
|---|---|
mapId | int |
distance | uint |
isLock | bool |
isClear | bool |
isComplete | bool |
unlockFlag | int |
{
"mapId": 1,
"distance": 12345,
"isLock": false,
"isClear": false,
"isComplete": false,
"unlockFlag": 0
}UserMissionData
| 字段 | C# 类型 |
|---|---|
type | int |
difficulty | int |
targetGenreId | int |
targetGenreTableId | int |
conditionGenreId | int |
conditionGenreTableId | int |
clearFlag | bool |
{
"type": 0,
"difficulty": 0,
"targetGenreId": 0,
"targetGenreTableId": 0,
"conditionGenreId": 0,
"conditionGenreTableId": 0,
"clearFlag": false
}UserMissionResponseData
| 字段 | C# 类型 |
|---|---|
userWeeklyData | UserWeeklyData |
userMissionDataList | UserMissionData[] |
{
"userWeeklyData": {
"lastLoginWeek": "",
"beforeLoginWeek": "",
"friendBonusFlag": false
},
"userMissionDataList": [
{
"type": 0,
"difficulty": 0,
"targetGenreId": 0,
"targetGenreTableId": 0,
"conditionGenreId": 0,
"conditionGenreTableId": 0,
"clearFlag": false
}
]
}UserMusic
| 字段 | C# 类型 |
|---|---|
userMusicDetailList | UserMusicDetail[] |
{
"userMusicDetailList": [
{
"musicId": 11820,
"level": "/*MusicDifficultyID*/ 0",
"playCount": 0,
"achievement": 0,
"comboStatus": "/*PlayComboflagID*/ 0",
"syncStatus": "/*PlaySyncflagID*/ 0",
"deluxscoreMax": 0,
"scoreRank": "/*MusicClearrankID*/ 0",
"extNum1": 0
}
]
}UserMusicDetail
| 字段 | C# 类型 |
|---|---|
musicId | int |
level | MusicDifficultyID |
playCount | uint |
achievement | uint |
comboStatus | PlayComboflagID |
syncStatus | PlaySyncflagID |
deluxscoreMax | uint |
scoreRank | MusicClearrankID |
extNum1 | uint |
{
"musicId": 11820,
"level": "/*MusicDifficultyID*/ 0",
"playCount": 0,
"achievement": 0,
"comboStatus": "/*PlayComboflagID*/ 0",
"syncStatus": "/*PlaySyncflagID*/ 0",
"deluxscoreMax": 0,
"scoreRank": "/*MusicClearrankID*/ 0",
"extNum1": 0
}UserOption
| 字段 | C# 类型 |
|---|---|
optionKind | OptionKindID |
noteSpeed | OptionNotespeedID |
slideSpeed | OptionSlidespeedID |
touchSpeed | OptionTouchspeedID |
tapDesign | OptionGametapID |
holdDesign | OptionGameholdID |
slideDesign | OptionGameslideID |
starType | OptionStartypeID |
outlineDesign | OptionGameoutlineID |
noteSize | OptionNotesizeID |
slideSize | OptionSlidesizeID |
touchSize | OptionTouchsizeID |
starRotate | OptionStarrotateID |
dispCenter | OptionCenterdisplayID |
outFrameType | OptionOutframedisplayID |
dispChain | OptionDispchainID |
dispRate | OptionDisprateID |
dispBar | OptionDispbarlineID |
touchEffect | OptionToucheffectID |
submonitorAnimation | OptionSubmonitorID |
submonitorAchive | OptionSubmonAchiveID |
submonitorAppeal | OptionAppealID |
matching | OptionMatchingID |
trackSkip | OptionTrackskipID |
brightness | OptionMoviebrightnessID |
mirrorMode | OptionMirrorID |
dispJudge | OptionDispjudgeID |
dispJudgePos | OptionDispjudgeposID |
dispJudgeTouchPos | OptionDispjudgetouchposID |
adjustTiming | OptionJudgetimingID |
judgeTiming | OptionJudgetimingID |
ansVolume | OptionVolumeAnswerSoundID |
tapHoldVolume | OptionVolumeID |
criticalSe | OptionCriticalID |
tapSe | OptionTapSuccessSeID |
breakSe | OptionBreakseID |
breakVolume | OptionVolumeID |
exSe | OptionExseID |
exVolume | OptionVolumeID |
slideSe | OptionSlideseID |
slideVolume | OptionVolumeID |
breakSlideVolume | OptionVolumeID |
touchVolume | OptionVolumeID |
touchHoldVolume | OptionVolumeID |
damageSeVolume | OptionVolumeID |
headPhoneVolume | OptionHeadphonevolumeID |
sortTab | SortTabID |
sortMusic | SortMusicID |
{
"optionKind": "/*OptionKindID*/ 0",
"noteSpeed": "/*OptionNotespeedID*/ 0",
"slideSpeed": "/*OptionSlidespeedID*/ 0",
"touchSpeed": "/*OptionTouchspeedID*/ 0",
"tapDesign": "/*OptionGametapID*/ 0",
"holdDesign": "/*OptionGameholdID*/ 0",
"slideDesign": "/*OptionGameslideID*/ 0",
"starType": "/*OptionStartypeID*/ 0",
"outlineDesign": "/*OptionGameoutlineID*/ 0",
"noteSize": "/*OptionNotesizeID*/ 0",
"slideSize": "/*OptionSlidesizeID*/ 0",
"touchSize": "/*OptionTouchsizeID*/ 0",
"starRotate": "/*OptionStarrotateID*/ 0",
"dispCenter": "/*OptionCenterdisplayID*/ 0",
"outFrameType": "/*OptionOutframedisplayID*/ 0",
"dispChain": "/*OptionDispchainID*/ 0",
"dispRate": "/*OptionDisprateID*/ 0",
"dispBar": "/*OptionDispbarlineID*/ 0",
"touchEffect": "/*OptionToucheffectID*/ 0",
"submonitorAnimation": "/*OptionSubmonitorID*/ 0",
"submonitorAchive": "/*OptionSubmonAchiveID*/ 0",
"submonitorAppeal": "/*OptionAppealID*/ 0",
"matching": "/*OptionMatchingID*/ 0",
"trackSkip": "/*OptionTrackskipID*/ 0",
"brightness": "/*OptionMoviebrightnessID*/ 0",
"mirrorMode": "/*OptionMirrorID*/ 0",
"dispJudge": "/*OptionDispjudgeID*/ 0",
"dispJudgePos": "/*OptionDispjudgeposID*/ 0",
"dispJudgeTouchPos": "/*OptionDispjudgetouchposID*/ 0",
"adjustTiming": "/*OptionJudgetimingID*/ 0",
"judgeTiming": "/*OptionJudgetimingID*/ 0",
"ansVolume": "/*OptionVolumeAnswerSoundID*/ 0",
"tapHoldVolume": "/*OptionVolumeID*/ 0",
"criticalSe": "/*OptionCriticalID*/ 0",
"tapSe": "/*OptionTapSuccessSeID*/ 0",
"breakSe": "/*OptionBreakseID*/ 0",
"breakVolume": "/*OptionVolumeID*/ 0",
"exSe": "/*OptionExseID*/ 0",
"exVolume": "/*OptionVolumeID*/ 0",
"slideSe": "/*OptionSlideseID*/ 0",
"slideVolume": "/*OptionVolumeID*/ 0",
"breakSlideVolume": "/*OptionVolumeID*/ 0",
"touchVolume": "/*OptionVolumeID*/ 0",
"touchHoldVolume": "/*OptionVolumeID*/ 0",
"damageSeVolume": "/*OptionVolumeID*/ 0",
"headPhoneVolume": "/*OptionHeadphonevolumeID*/ 0",
"sortTab": "/*SortTabID*/ 0",
"sortMusic": "/*SortMusicID*/ 0"
}UserPhoto
| 字段 | C# 类型 |
|---|---|
orderId | int |
userId | ulong |
divNumber | int |
divLength | int |
divData | string |
placeId | int |
clientId | string |
uploadDate | string |
playlogId | ulong |
trackNo | int |
{
"orderId": 0,
"userId": 100000000000000001,
"divNumber": 0,
"divLength": 0,
"divData": "",
"placeId": 0,
"clientId": "",
"uploadDate": "",
"playlogId": 1,
"trackNo": 0
}UserPlaylog
| 字段 | C# 类型 |
|---|---|
userId | ulong |
orderId | int |
playlogId | ulong |
version | int |
placeId | int |
placeName | string |
loginDate | long |
playDate | string |
userPlayDate | string |
type | int |
musicId | int |
level | int |
trackNo | int |
vsMode | int |
vsUserName | string |
vsStatus | int |
vsUserRating | int |
vsUserAchievement | int |
vsUserGradeRank | int |
vsRank | int |
playerNum | int |
playedUserId1 | ulong |
playedUserName1 | string |
playedMusicLevel1 | int |
playedUserId2 | ulong |
playedUserName2 | string |
playedMusicLevel2 | int |
playedUserId3 | ulong |
playedUserName3 | string |
playedMusicLevel3 | int |
characterId1 | int |
characterLevel1 | int |
characterAwakening1 | int |
characterId2 | int |
characterLevel2 | int |
characterAwakening2 | int |
characterId3 | int |
characterLevel3 | int |
characterAwakening3 | int |
characterId4 | int |
characterLevel4 | int |
characterAwakening4 | int |
characterId5 | int |
characterLevel5 | int |
characterAwakening5 | int |
achievement | int |
deluxscore | int |
scoreRank | int |
maxCombo | int |
totalCombo | int |
maxSync | int |
totalSync | int |
tapCriticalPerfect | int |
tapPerfect | int |
tapGreat | int |
tapGood | int |
tapMiss | int |
holdCriticalPerfect | int |
holdPerfect | int |
holdGreat | int |
holdGood | int |
holdMiss | int |
slideCriticalPerfect | int |
slidePerfect | int |
slideGreat | int |
slideGood | int |
slideMiss | int |
touchCriticalPerfect | int |
touchPerfect | int |
touchGreat | int |
touchGood | int |
touchMiss | int |
breakCriticalPerfect | int |
breakPerfect | int |
breakGreat | int |
breakGood | int |
breakMiss | int |
isTap | bool |
isHold | bool |
isSlide | bool |
isTouch | bool |
isBreak | bool |
isCriticalDisp | bool |
isFastLateDisp | bool |
fastCount | int |
lateCount | int |
isAchieveNewRecord | bool |
isDeluxscoreNewRecord | bool |
comboStatus | int |
syncStatus | int |
isClear | bool |
beforeRating | int |
afterRating | int |
beforeGrade | int |
afterGrade | int |
afterGradeRank | int |
beforeDeluxRating | int |
afterDeluxRating | int |
isPlayTutorial | bool |
isEventMode | bool |
isFreedomMode | bool |
playMode | int |
isNewFree | bool |
trialPlayAchievement | int |
extNum1 | int |
extNum2 | int |
extNum4 | int |
extBool1 | bool |
extBool2 | bool |
extBool3 | bool |
{
"userId": 100000000000000001,
"orderId": 0,
"playlogId": 1,
"version": 0,
"placeId": 0,
"placeName": "",
"loginDate": 0,
"playDate": "",
"userPlayDate": "",
"type": 0,
"musicId": 11820,
"level": 3,
"trackNo": 0,
"vsMode": 0,
"vsUserName": "",
"vsStatus": 0,
"vsUserRating": 0,
"vsUserAchievement": 0,
"vsUserGradeRank": 0,
"vsRank": 0,
"playerNum": 0,
"playedUserId1": 0,
"playedUserName1": "",
"playedMusicLevel1": 0,
"playedUserId2": 0,
"playedUserName2": "",
"playedMusicLevel2": 0,
"playedUserId3": 0,
"playedUserName3": "",
"playedMusicLevel3": 0,
"characterId1": 0,
"characterLevel1": 0,
"characterAwakening1": 0,
"characterId2": 0,
"characterLevel2": 0,
"characterAwakening2": 0,
"characterId3": 0,
"characterLevel3": 0,
"characterAwakening3": 0,
"characterId4": 0,
"characterLevel4": 0,
"characterAwakening4": 0,
"characterId5": 0,
"characterLevel5": 0,
"characterAwakening5": 0,
"achievement": 0,
"deluxscore": 0,
"scoreRank": 0,
"maxCombo": 0,
"totalCombo": 0,
"maxSync": 0,
"totalSync": 0,
"tapCriticalPerfect": 0,
"tapPerfect": 0,
"tapGreat": 0,
"tapGood": 0,
"tapMiss": 0,
"holdCriticalPerfect": 0,
"holdPerfect": 0,
"holdGreat": 0,
"holdGood": 0,
"holdMiss": 0,
"slideCriticalPerfect": 0,
"slidePerfect": 0,
"slideGreat": 0,
"slideGood": 0,
"slideMiss": 0,
"touchCriticalPerfect": 0,
"touchPerfect": 0,
"touchGreat": 0,
"touchGood": 0,
"touchMiss": 0,
"breakCriticalPerfect": 0,
"breakPerfect": 0,
"breakGreat": 0,
"breakGood": 0,
"breakMiss": 0,
"isTap": false,
"isHold": false,
"isSlide": false,
"isTouch": false,
"isBreak": false,
"isCriticalDisp": false,
"isFastLateDisp": false,
"fastCount": 0,
"lateCount": 0,
"isAchieveNewRecord": false,
"isDeluxscoreNewRecord": false,
"comboStatus": 0,
"syncStatus": 0,
"isClear": false,
"beforeRating": 0,
"afterRating": 0,
"beforeGrade": 0,
"afterGrade": 0,
"afterGradeRank": 0,
"beforeDeluxRating": 0,
"afterDeluxRating": 0,
"isPlayTutorial": false,
"isEventMode": false,
"isFreedomMode": false,
"playMode": 0,
"isNewFree": false,
"trialPlayAchievement": 0,
"extNum1": 0,
"extNum2": 0,
"extNum4": 0,
"extBool1": false,
"extBool2": false,
"extBool3": false
}UserPortrait
| 字段 | C# 类型 |
|---|---|
userId | ulong |
divNumber | int |
divLength | int |
divData | string |
placeId | int |
clientId | string |
uploadDate | string |
fileName | string |
{
"userId": 100000000000000001,
"divNumber": 0,
"divLength": 0,
"divData": "",
"placeId": 0,
"clientId": "",
"uploadDate": "",
"fileName": ""
}UserRate
| 字段 | C# 类型 |
|---|---|
musicId | int |
level | int |
romVersion | uint |
achievement | uint |
{
"musicId": 11820,
"level": 3,
"romVersion": 0,
"achievement": 0
}UserRating
| 字段 | C# 类型 |
|---|---|
rating | int |
ratingList | UserRate[] |
newRatingList | UserRate[] |
nextRatingList | UserRate[] |
nextNewRatingList | UserRate[] |
udemae | UserUdemae |
{
"rating": 0,
"ratingList": [
{
"musicId": 11820,
"level": 3,
"romVersion": 0,
"achievement": 0
}
],
"newRatingList": [
{
"musicId": 11820,
"level": 3,
"romVersion": 0,
"achievement": 0
}
],
"nextRatingList": [
{
"musicId": 11820,
"level": 3,
"romVersion": 0,
"achievement": 0
}
],
"nextNewRatingList": [
{
"musicId": 11820,
"level": 3,
"romVersion": 0,
"achievement": 0
}
],
"udemae": {
"rate": 0,
"maxRate": 0,
"classValue": 0,
"maxClassValue": 0,
"totalWinNum": 0,
"totalLoseNum": 0,
"maxWinNum": 0,
"maxLoseNum": 0,
"winNum": 0,
"loseNum": 0,
"npcTotalWinNum": 0,
"npcTotalLoseNum": 0,
"npcMaxWinNum": 0,
"npcMaxLoseNum": 0,
"npcWinNum": 0,
"npcLoseNum": 0
}
}UserRecommendRateMusic
| 字段 | C# 类型 |
|---|---|
musicId | int |
level | int |
averageAchievement | int |
{
"musicId": 11820,
"level": 3,
"averageAchievement": 0
}UserRegion
| 字段 | C# 类型 |
|---|---|
regionId | int |
playCount | int |
created | string |
{
"regionId": 0,
"playCount": 0,
"created": ""
}UserRivalData
| 字段 | C# 类型 |
|---|---|
rivalId | ulong |
rivalName | string |
{
"rivalId": 0,
"rivalName": ""
}UserRivalMusic
| 字段 | C# 类型 |
|---|---|
musicId | int |
userRivalMusicDetailList | UserRivalMusicDetail[] |
{
"musicId": 11820,
"userRivalMusicDetailList": [
{
"level": 3,
"achievement": 0,
"deluxscoreMax": 0
}
]
}UserRivalMusicDetail
| 字段 | C# 类型 |
|---|---|
level | int |
achievement | int |
deluxscoreMax | int |
{
"level": 3,
"achievement": 0,
"deluxscoreMax": 0
}UserRivalMusicLevel
| 字段 | C# 类型 |
|---|---|
level | int |
{
"level": 3
}UserScoreRanking
| 字段 | C# 类型 |
|---|---|
tournamentId | int |
totalScore | long |
ranking | int |
rankingDate | string |
{
"tournamentId": 0,
"totalScore": 0,
"ranking": 0,
"rankingDate": ""
}UserShopStock
| 字段 | C# 类型 |
|---|---|
shopItemId | int |
tradeCount | int |
{
"shopItemId": 0,
"tradeCount": 0
}UserTradeItem
| 字段 | C# 类型 |
|---|---|
shopItemId | long |
point | long |
tradeCount | int |
{
"shopItemId": 0,
"point": 0,
"tradeCount": 0
}UserUdemae
| 字段 | C# 类型 |
|---|---|
rate | int |
maxRate | int |
classValue | int |
maxClassValue | int |
totalWinNum | uint |
totalLoseNum | uint |
maxWinNum | uint |
maxLoseNum | uint |
winNum | uint |
loseNum | uint |
npcTotalWinNum | uint |
npcTotalLoseNum | uint |
npcMaxWinNum | uint |
npcMaxLoseNum | uint |
npcWinNum | uint |
npcLoseNum | uint |
{
"rate": 0,
"maxRate": 0,
"classValue": 0,
"maxClassValue": 0,
"totalWinNum": 0,
"totalLoseNum": 0,
"maxWinNum": 0,
"maxLoseNum": 0,
"winNum": 0,
"loseNum": 0,
"npcTotalWinNum": 0,
"npcTotalLoseNum": 0,
"npcMaxWinNum": 0,
"npcMaxLoseNum": 0,
"npcWinNum": 0,
"npcLoseNum": 0
}UserWeeklyData
| 字段 | C# 类型 |
|---|---|
lastLoginWeek | string |
beforeLoginWeek | string |
friendBonusFlag | bool |
{
"lastLoginWeek": "",
"beforeLoginWeek": "",
"friendBonusFlag": false
}附录 B:枚举参考
B.1 解锁相关核心枚举(游戏侧,Manager.MaiStudio / UserData)
MusicLockType(Music.xml 的 lockType / subLockType;礼物 ItemKind 的对应关系见上表)
| 值 | 枚举名 | 含义 | 普通选曲 |
|---|---|---|---|
| 0 | Unlock | 开放曲 | 直接可玩 |
| 1 | Lock | 常规解禁曲(地图/活动/门票) | 需 Base 解锁列表有该曲 |
| 2 | Challenge | 完美挑战曲 | 随活动开放,无需解锁 |
| 3 | Transmission | 传导曲 | 游玩一次后写入 Base 列表 |
| 4 | KaleidScope | 万花筒模式曲 | 模式内通关后写入 Base 列表 |
subLockType:0 = 白谱启用(受 subEventName 活动控制);非 0 = 白谱槽位禁用(并非“锁定待解锁”)。- 紫/白谱可玩性:曲目 ID < 10000(FiNALE 移植老曲)硬编码永远开放;ID ≥ 10000 查账号
MusicUnlockMasterList/MusicUnlockReMasterList(即 ItemKind 6/7 的物品),客户端只读不写, 由服务器在达成条件后下发。
MapTreasureType(舞里程宝藏类型)
| 值 | 枚举名 | 含义 |
|---|---|---|
| 1 | Character | 收藏角色 |
| 2 | MusicNew | 解锁乐曲(写入 Base 列表) |
| 3 | LevelUpAll | 全员升级 |
| 4 | Otomodachi | 伙伴 |
| 5 | NamePlate | 名牌 |
| 6 | Frame | 相框 |
| 7 | MapTaskMusic | 地图任务曲(解锁乐曲) |
| 8 | Challenge | 完美挑战 |
| 9 | Title | 称号 |
| 10 | Icon | 头像 |
| 11 | Present | 礼物(亲密道具) |
| 12 | Gate | 万花筒之门 |
| 13 | Key | 万花筒钥匙 |
MapTreasureFlag(地图里程碑标记): None / DispCharacter(显示角色)/ ReleaseFlag(解禁)/ End(终点)
UserData.MusicUnlock(账号四个解锁列表): Base(整曲)/ Master(紫谱)/ ReMaster(白谱)/ Strong(Utage 谱)
B.1.7 常用游戏侧枚举补充
MusicDifficultyID(谱面难度索引,Music.xml notesData 的下标)
| 值 | 枚举名 | 难度 |
|---|---|---|
| 0 | Basic | 绿谱 |
| 1 | Advanced | 黄谱 |
| 2 | Expert | 红谱 |
| 3 | Master | 紫谱 |
| 4 | ReMaster | 白谱 |
| 5 | Strong | 宴/特殊谱位(Utage 曲唯一启用的谱位,受 StrongList 管辖) |
PlayComboflagID(连击状态,决定舞里程连击加成)
| 值 | 枚举名 | 含义 | 里程加成 |
|---|---|---|---|
| 0 | None | 无 | — |
| 1 | Silver | FullCombo | +2000 |
| 2 | Gold | FullCombo+ | +2000 |
| 3 | AllPerfect | All Perfect | +3000 |
| 4 | AllPerfectPlus | All Perfect+ | +3000 |
PlaySyncflagID(二人同步状态,决定舞里程同步加成)
| 值 | 枚举名 | 含义 | 里程加成 |
|---|---|---|---|
| 0 | None | 无 | — |
| 1 | ChainLow | Sync | — |
| 2 | ChainHi | Sync+ | — |
| 3 | SyncLow | Full Sync | +4000 |
| 4 | SyncHi | Full Sync+ | +4000 |
| 5 | SyncPlay | Sync Play | 多人加成 +1000 |
GetPresentType(礼物领取过滤,GetPresentProcess)
| 值 | 枚举名 | 含义 |
|---|---|---|
| 0 | None | 不领取 |
| 1 | Ticket | 只领门票 |
| 2 | Music | 只领乐曲 |
| 3 | ALL | 全部领取 |
B.1.5 稀有宝藏类型全量清单(Gate / Key / Present)
自动扫描 1.55 全部资源包:Gate(万花筒之门)7 处、Present(亲密道具)3 处、Key(万花筒钥匙)0 处。
| 宝藏ID | 名称 | 类型 | 关联 | 所在地图 | 地图ID | 里程点 Distance | 里程碑标记 | 来源包 |
|---|---|---|---|---|---|---|---|---|
| 450501 | プレゼント | Present | 亲密道具 ×1 | BUDDiES区域2 | 450005 | 500000 | None | A000 |
| 500199 | 蓝色之门 | Gate | 万花筒之门 GateId=1 | 天空街区域6 | 500001 | 800000 | End | A000 |
| 500299 | 白色之门 | Gate | 万花筒之门 GateId=2 | 天界区域8 | 500002 | 1100000 | End | A000 |
| 500399 | 紫色之门 | Gate | 万花筒之门 GateId=3 | BLACK ROSE区域10 | 500003 | 800000 | End | A000 |
| 500499 | 黑色之门 | Gate | 万花筒之门 GateId=4 | 大都会区域9 | 500004 | 1400000 | End | A000 |
| 500501 | プレゼント | Present | 亲密道具 ×1 | 棱镜区域 | 500005 | 500000 | None | A000 |
| 550199 | 黃色之门 | Gate | 万花筒之门 GateId=5 | 七彩区域 | 550001 | 900000 | End | A000 |
| 550299 | 红色之门 | Gate | 万花筒之门 GateId=6 | 龙之区域4 | 550002 | 1200000 | End | A015 |
| 550399 | 棱镜塔 | Gate | 万花筒之门 GateId=7 | 7sRef区域4 | 550003 | 2000000 | End | A031 |
| 550401 | プレゼント | Present | 亲密道具 ×1 | 棱镜区域2 | 550004 | 500000 | None | A000 |
注:当前版本数据中没有通过舞里程宝藏发放的 Key(万花筒钥匙),钥匙由カレイドスコープ模式自身进度发放。
礼物领取的重要限制:客户端领取代码(
GetPresentProcess.GetCollection)只处理 Music(5)/Ticket(12)/Icon(3)/Plate(1)/Frame(11)/Character(9)/Title(2)/Partner(10)/Mile(13)/IntimateItem(14) 这 10 种类型;MusicMas(6)/MusicRem(7)/MusicSrg(8)/KaleidxScopeKey(15) 没有领取分支(礼物界面展示代码中也是空 case)。这 4 种需由服务器直接写入对应数据:谱面解锁写UserItem(itemKind=6/7/8)(登录时映射到 MusicUnlockMasterList/ReMasterList/StrongList),钥匙写UserKaleidxScope.isKeyFound=true(见 B.1.6)。
B.1.6 万花筒钥匙(KaleidxScopeKey)全量清单
共 10 把钥匙。礼物编码 presentId = 15,000,000 + keyId(ItemKind.KaleidxScopeKey=15,客户端可校验但不能通过礼物盒领取,需按 B.1.5 的说明直接写数据:对应门的 UserKaleidxScope.isKeyFound = true)。
| keyId | 钥匙 | 对应门 | gateId | 解禁活动 (eventName) | releaseTag | 来源包 | 礼物 presentId |
|---|---|---|---|---|---|---|---|
| 1 | 蓝色钥匙 | 蓝色之门 | 1 | 251224\_03\_2:青のカレイドスコープ解禁 | Ver1.50.00 | A000 | 15000001 |
| 2 | 白色钥匙 | 白色之门 | 2 | 260210\_03\_2:白のカレイドスコープ解禁 | Ver1.50.00 | A000 | 15000002 |
| 3 | 紫色钥匙 | 紫色之门 | 3 | 260325\_03\_2:紫のカレイドスコープ解禁 | Ver1.50.00 | A000 | 15000003 |
| 4 | 黑色钥匙 | 黑色之门 | 4 | 260428\_03\_2:黒のカレイドスコープ解禁 | Ver1.50.00 | A000 | 15000004 |
| 5 | 黃色钥匙 | 黃色之门 | 5 | 260610\_03\_2:黄のカレイドスコープ解禁 | Ver1.55.00 | A000 | 15000005 |
| 6 | 红色钥匙 | 红色之门 | 6 | 260805\_03\_2:赤のカレイドスコープ解禁 | Ver1.55.00 | A015 | 15000006 |
| 7 | 万能钥匙 | 棱镜塔 | 7 | 261001\_03\_2:虹のカレイドスコープ解禁 | Ver1.55.00 | A031 | 15000007 |
| 8 | なし | KALEIDXSCOPE | 8 | 261001\_03\_3:カレイドスコープ解禁(イベント1) | Ver1.55.00 | A031 | 15000008 |
| 9 | 希望钥匙 | 希望之门 | 9 | 261001\_03\_4:希望の扉解禁 | Ver1.55.00 | A031 | 15000009 |
| 10 | KALEIDXSCOPEの鍵 | KALEIDXSCOPE | 10 | 261001\_03\_5:カレイドスコープ解禁(イベント2) | Ver1.55.00 | A031 | 15000010 |
钥匙与门一一对应(KaleidxScopeKeyData.gateName);服务器写入时按 gateId 找到该玩家的UserKaleidxScope记录并置isKeyFound = true即视为获得钥匙。
B.2 Net.VO.Mai2 全部枚举(自动提取)
ActivityKind
| 值 | 成员 | 说明 |
|---|---|---|
| 1 | Play | |
| 2 | Music |
ApiKind
| 值 | 成员 | 说明 |
|---|---|---|
| 0 | GetUserDataApi | |
| 1 | GetUserCharacterApi | |
| 2 | GetUserItemApi | |
| 3 | GetUserFavoriteApi | |
| 4 | GetUserGhostApi | |
| 5 | GetUserMapApi | |
| 6 | GetUserLoginBonusApi | |
| 7 | GetUserRegionApi | |
| 8 | GetUserRecommendRateMusicApi | |
| 9 | GetUserRecommendSelectMusicApi | |
| 10 | GetUserOptionApi | |
| 11 | GetUserExtendApi | |
| 12 | GetUserRatingApi | |
| 13 | GetUserMusicApi | |
| 14 | GetUserPortraitApi | |
| 15 | GetUserActivityApi | |
| 16 | GetUserFavoriteItemApi | |
| 17 | GetUserRivalDataApi | |
| 18 | GetUserRivalMusicApi | |
| 19 | GetUserMissionDataApi | |
| 20 | GetUserFriendBonusApi | |
| 21 | GetUserIntimateApi | |
| 22 | GetUserShopStockApi | |
| 23 | GetUserKaleidxScopeApi | |
| 24 | UploadUserPlaylogListApi | |
| 25 | UpsertUserAllApi | |
| 26 | ENUM_MAX |
FavoriteItemKind
| 值 | 成员 | 说明 |
|---|---|---|
| 1 | FavoriteMusic | |
| 2 | RivalScore |
ItemKind
| 值 | 成员 | 说明 |
|---|---|---|
| 1 | Plate | 名牌 Plate |
| 2 | Title | 称号 Title |
| 3 | Icon | 头像 Icon |
| 4 | Present | 礼物(占位) |
| 5 | Music | 整曲解锁 Music → Base列表 |
| 6 | MusicMas | Master紫谱解锁 MusicMas |
| 7 | MusicRem | Re:Master白谱解锁 MusicRem |
| 8 | MusicSrg | Strong谱解锁 MusicSrg |
| 9 | Character | 角色 Character |
| 10 | Partner | 搭档 Partner |
| 11 | Frame | 相框 Frame |
| 12 | Ticket | 门票 Ticket |
| 13 | Mile | 里程 Mile |
| 14 | IntimateItem | 亲密道具 IntimateItem |
| 15 | KaleidxScopeKey | 万花筒钥匙 KaleidxScopeKey |
LogoutType
| 值 | 成员 | 说明 |
|---|---|---|
| 0 | None | |
| 1 | Logout | |
| 2 | Cancel | |
| 3 | Error | |
| 4 | TestIn | |
| 5 | Quit |