依据游戏客户端 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 通用机制

  • 分页:列表类下载接口的响应带 nextIndexnextIndex != 0 时须以该值再次请求直至为 0。
  • 差量上传与 isNew 位图UpsertUserAllApi 的每个列表只包含与上次服务器快照的差集 配套的 isNewXxxList 字符串与数组按位对齐,"1" = 新增条目、"0" = 已有条目被修改 (源码 VOExtensions.BuildListData,以 key 字段判重,如 userMapListmapId)。
  • 登录流程PingUserLoginApi(取得 loginId)→ 各 GetUser*Api 拉取数据 → 游玩 → 每曲 UploadUserPlaylogApi → 数据保存时 UploadUserPortraitApi/UploadUserPhotoApi(如有)→ UpsertUserAllApiUserLogoutApi
  • 空请求体:部分接口的请求 VO 为空类(如 PingRequestVOGameNgMusicIdRequestVO GameWeeklyRequestVO 等),示例中的 {} 即真实请求体。

1.5 请求头、会话与重试

项目
HTTP 方法POST
Content-Typeapplication/json(另附加charset: UTF-8头,虽然载荷是加密二进制)
User-AgentMD5(Api+盐值)#userIduserId=0的机器级接口为MD5(Api+盐值)#ClientId,见NetPacketUtil.GetUserAgent
CookieUserLoginApi建立会话后由服务器下发,客户端在后续请求中原样携带(OperationManager.GetCookie
  • 重试:包失败时自动重试;同一包重试次数达到 NetConfig.RetryCountToErrorWithSamePacket 后转入错误流程并计入机器备份信息。
  • 鉴权:请求 JSON 内携带 userIdUserAllRequestVO 等同时带 playlogId = 登录时服务器下发的 loginId),没有独立签名头。

1.6 图片上传(UserPortrait / UserPhoto)

照片/头像不走独立二进制通道,仍是同一套 AES 加密 JSON:

  • UploadUserPortraitApiUploadUserPortraitRequestVO { 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全量导出
userCharacterListisNewCharacterListcharacterId差量
userMapListisNewMapListmapId差量(舞里程)
userLoginBonusListisNewLoginBonusListbonusId差量
userItemListisNewItemListitemId+itemKind差量(解锁列表
userMusicDetailListisNewMusicDetailListmusicId+level差量(成绩)
userCourseListisNewCourseListcourseId差量
userFriendSeasonRankingListisNewFriendSeasonRankingListseasonId差量
userFavoriteListisNewFavoriteList整对象比较差量
userGamePlaylogList恒为本局 1 条聚合记录
userMissionDataList全量导出
userWeeklyData单对象
userActivityList恒为单元素数组(活动聚合)
userIntimateListisNewUserIntimateListpartnerId差量
userGetPointList全量导出
userTradeItemList全量导出
userKaleidxScopeListisNewKaleidxScopeListgateId差量(万花筒,含 isKeyFound)
userFavoritemusicListisNewFavoritemusicList恒置"0"
user2pPlaylog2P 对战时才有

服务器合并原则:位图 "1" = INSERT(服务器无此 key)、"0" = UPDATE(已有此 key);无位图的字段整体覆盖。

2. API 详解

会话与基础

Ping — Ping(延迟探测)

项目内容
实际请求路径3bae8c1162b3148abcfc38a89c03e3e7(= MD5("PingMaimaiChn8bF76dE9"))
Packet 类PacketPing
请求 VOPingRequestVO
响应 VOPingResponseVO
触发时机联网检测(Main/PingChecker)
调用位置Main/PingChecker.cs

网络连通性探测接口,也是全部接口中开销最小的一个。请求与响应均为(近乎)空对象,客户端 PingChecker 通过测量发出请求到收到响应的耗时得到往返延迟(毫秒),用于判定机器与服务器的在线状态;GameSetting.pingDisable 为 true 时可整体禁用该检测。

请求字段(PingRequestVO)

字段类型说明

响应字段(PingResponseVO)

字段类型说明
resultstring

JSON 示例

请求(PingRequestVO):

{}

响应(PingResponseVO):

{
  "result": ""
}

服务器实现要点

  • 直接返回 {}{"result": ""} 即可,内容不参与逻辑
  • 用于在线判定,延迟过高时客户端会提示网络异常

UserLoginApi — 用户登录

项目内容
实际请求路径04dd218d2070685e728719b974f9b8c0(= MD5("UserLoginApiMaimaiChn8bF76dE9"))
Packet 类PacketUserLogin
请求 VOUserLoginRequestVO
响应 VOUserLoginResponseVO
触发时机进场/继续画面(Process.Entry/TryEntry、ContinueProcess)
调用位置Process.Entry/TryEntry.csProcess/ContinueProcess.cs

玩家刷卡后建立会话的核心接口。请求携带 Aime 卡号(accessCode)、机厅与机器标识(placeId/clientId/regionId)、是否继续游玩(isContinue)等信息;响应中的 loginId 是整个会话的锚点——之后每一首曲子的 UploadUserPlaylogApi 与保存时的 UpsertUserAllApi 都要回传它作为 playlogId。响应同时返回登录统计(累计/连续登录天数),登录奖励(UserLoginBonus)的发放也以本次登录为触发点。

请求字段(UserLoginRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
accessCodestringAime 卡号
regionIdint地域 ID
placeIdint机厅/店铺 ID
clientIdstring机器客户端标识
dateTimelong
loginDateTimelong登录时间(Unix 秒)
isContinuebool是否为继续游玩(数据已存在)
genericFlagint通用标志
tokenstring会话令牌

响应字段(UserLoginResponseVO)

字段类型说明
returnCodeint结果码
lastLoginDatestring上次登录日期
loginCountint累计登录次数
consecutiveLoginCountint连续登录次数
loginIdulong本局会话 ID(后续所有上传的 playlogId 用它)
loginDateTimelong登录时间(Unix 秒)
tokenstring会话令牌

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
请求 VOUserPreviewRequestVO
响应 VOUserPreviewResponseVO
触发时机刷卡确认画面(Process.Entry/ConfirmPlay)
调用位置Process.Entry/ConfirmPlay.csDebugGameMainObject.cs

刷卡瞬间的"预览"接口,发生在 UserLoginApi 之前。以卡号派生的 userId 换取玩家的最小展示信息:昵称、Rating、图标/名牌/相框/搭档、最近游玩日期、封禁状态(banState)等,用于刷卡确认画面显示"欢迎回来"。同时以 isLogin 告知客户端该玩家是否已在别处登录,isInherit 标记是否存在可继承的数据。

请求字段(UserPreviewRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
segaIdAuthKeystring
tokenstring会话令牌
clientIdstring机器客户端标识

响应字段(UserPreviewResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
userNamestring玩家昵称
isLoginbool是否已在登录状态
lastGameIdstring
lastDataVersionstring
lastRomVersionstring
lastLoginDatestring
lastPlayDatestring
playerRatingintDX Rating
nameplateIdint名牌 ID
iconIdint头像 ID
trophyIdint称号 ID(旧字段)
partnerIdint搭档 ID
frameIdint相框 ID
dispRateint显示用 Rating
totalAwakeint觉醒角色数
isNetMemberint是否网络会员
dailyBonusDatestring每日奖励领取日期
headPhoneVolumeint
isInheritbool是否存在可继承数据
banStateint封禁状态
errorIdint错误码

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
请求 VOUserLogoutRequest2VO/UserLogoutRequestVO
响应 VOUserLogoutResponseVO
触发时机数据保存末尾(StateULUserLogout);强制登出走 NetPacketUtil.ForcedUserLogout
调用位置UserDataULState/StateULUserLogout.csNet/NetPacketUtil.cs(强制登出)

结束会话。在数据保存状态机(StateULUserLogout)的最后调用,也用于服务器触发强制登出(NetPacketUtil.ForcedUserLogout)。请求带卡号、机厅信息与登出类型(LogoutType)。本接口在源码中存在两个请求 VO(UserLogoutRequestVO / UserLogoutRequest2VO),现行保存流程使用 Request2VO,两者字段高度重合。

请求字段(UserLogoutRequest2VO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
accessCodestring
regionIdint地域 ID
placeIdint机厅/店铺 ID
clientIdstring机器客户端标识
loginDateTimelong登录时间(Unix 秒)
typeint
delayLogDelayLog嵌套数据对象

响应字段(UserLogoutResponseVO)

字段类型说明
returnCodeint结果码(1 = 成功)

请求变体字段(UserLogoutRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
accessCodestringAime 卡号
regionIdint地域 ID
placeIdint机厅/店铺 ID
clientIdstring机器客户端标识
loginDateTimelong登录时间(Unix 秒)
typeint登出类型(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
请求 VOGameSettingRequestVO
响应 VOGameSettingResponseVO
触发时机开机/联网时(Manager.Operation/DataDownloaderMai2 统一拉取)
调用位置Manager.Operation/DataDownloaderMai2.cs

机器级全局设定接口,开机联网时由 DataDownloaderMai2 拉取。响应中的 GameSetting 共 25 个字段,直接控制客户端行为:维护模式(isMaintenance)、计划重启窗口(rebootStartTime/EndTime)、各功能服务器地址(movieServerUri/deliverServerUri 等)、包超时与重试参数(packetTimeout/packetRetryCount)、照片与改名开关(uploadPhotoDisable/nameEntryDisable)等。

请求字段(GameSettingRequestVO)

字段类型说明
placeIdint机厅/店铺 ID
clientIdstring机器客户端标识

响应字段(GameSettingResponseVO)

字段类型说明
isAouAccessionboolAOU 协作标记
gameSettingGameSetting嵌套数据对象

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
请求 VOGameEventRequestVO
响应 VOGameEventResponseVO
触发时机开机/联网时(DataDownloaderMai2)
调用位置Manager.Operation/DataDownloaderMai2.cs

拉取当前生效的运营活动列表。请求以 type 区分活动大类、isAllEvent 决定是否包含未开始的;响应为 {type, startDate, endDate} 列表。活动驱动游戏内的加点、加成与解禁日程(与 Music.xml 的 eventName 活动体系联动)。

请求字段(GameEventRequestVO)

字段类型说明
typeint
isAllEventbool

响应字段(GameEventResponseVO)

字段类型说明
typeint
gameEventListGameEvent[]GameEvent对象数组

JSON 示例

请求(GameEventRequestVO):

{
  "type": 0,
  "isAllEvent": false
}

响应(GameEventResponseVO):

{
  "type": 0,
  "gameEventList": [
    {
      "type": 0,
      "id": 0,
      "startDate": "",
      "endDate": ""
    }
  ]
}

服务器实现要点

  • 返回空列表即表示无活动
  • 日期格式为字符串(yyyyMMdd 或带时间,客户端按字符串解析)

GetGameChargeApi — 收费项配置

项目内容
实际请求路径0b76ce1027c131c38dffa0e9df6685e7(= MD5("GetGameChargeApiMaimaiChn8bF76dE9"))
Packet 类PacketGetGameCharge
请求 VOGameChargeRequestVO
响应 VOGameChargeResponseVO
触发时机开机/联网时(DataDownloaderMai2)
调用位置Manager.Operation/DataDownloaderMai2.cs

收费项定义接口:通行证/门票等可购买项目的 orderId、chargeId、price 与销售起止日期。玩家使用收费项后产生的持有状态由 GetUserChargeApi 下载、UserChargelog 上传。

请求字段(GameChargeRequestVO)

字段类型说明
isAllbool是否拉取全部

响应字段(GameChargeResponseVO)

字段类型说明
lengthlong数据总条数
gameChargeListGameCharge[]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
请求 VOGameRankingRequestVO
响应 VOGameRankingResponseVO
触发时机开机/联网时(DataDownloaderMai2)
调用位置Manager.Operation/DataDownloaderMai2.cs

排行榜数据接口,请求参数 type 区分榜单种类(人气曲投票、周排行等),响应为 {id, point, userName} 列表,展示在选曲/大厅的排行界面。

请求字段(GameRankingRequestVO)

字段类型说明
typelong

响应字段(GameRankingResponseVO)

字段类型说明
typelong
gameRankingListGameRanking[]GameRanking对象数组

JSON 示例

请求(GameRankingRequestVO):

{
  "type": 0
}

响应(GameRankingResponseVO):

{
  "type": 0,
  "gameRankingList": [
    {
      "id": 0,
      "point": 0,
      "userName": "玩家昵称"
    }
  ]
}

服务器实现要点

  • 可返回空列表隐藏该功能入口

GetGameNgMusicIdApi — 禁用曲目列表

项目内容
实际请求路径56f900a8accd3b0cff452f897673e08b(= MD5("GetGameNgMusicIdApiMaimaiChn8bF76dE9"))
Packet 类PacketGetGameNgMusicId
请求 VOGameNgMusicIdRequestVO
响应 VOGameNgMusicIdResponseVO
触发时机开机/联网时(DataDownloaderMai2)
调用位置Manager.Operation/DataDownloaderMai2.cs

禁用曲目(GameNG)列表接口。请求体为空对象,响应为 musicIdList。列表中的曲目在选曲时被排除(与本地 OperationManager.IsGameNgMusicId 配合)。

请求字段(GameNgMusicIdRequestVO)

字段类型说明

响应字段(GameNgMusicIdResponseVO)

字段类型说明
lengthlong数据总条数
musicIdListint[]int对象数组

JSON 示例

请求(GameNgMusicIdRequestVO):

{}

响应(GameNgMusicIdResponseVO):

{
  "length": 30,
  "musicIdList": [
    0
  ]
}

服务器实现要点

  • 空列表即可;注意响应外层有 length 字段表示条数

GetGameMusicScoreApi — 谱面成绩数据

项目内容
实际请求路径daec756d648d1ef873fdd756af23ce3a(= MD5("GetGameMusicScoreApiMaimaiChn8bF76dE9"))
Packet 类PacketGetGameMusicScore
请求 VOGameMusicScoreRequestVO
响应 VOGameMusicScoreResponseVO
触发时机开机/联网时(DataDownloaderMai2)
调用位置Manager.Operation/DataDownloaderMai2.cs

按 (musicId, level, type) 三元组查询单个谱面的成绩数据,响应为单个 MusicScore(scoreData 为字符串载荷,内容按 type 解释)。用于成绩排行/谱面成绩参考的按需查询。

请求字段(GameMusicScoreRequestVO)

字段类型说明
musicIdint
levelint
typeint

响应字段(GameMusicScoreResponseVO)

字段类型说明
gameMusicScoreMusicScore嵌套数据对象

JSON 示例

请求(GameMusicScoreRequestVO):

{
  "musicId": 11820,
  "level": 3,
  "type": 0
}

响应(GameMusicScoreResponseVO):

{
  "gameMusicScore": {
    "musicId": 11820,
    "level": 3,
    "type": 0,
    "scoreData": ""
  }
}

服务器实现要点

  • 无数据时返回空 scoreData 即可

GetGameTournamentInfoApi — 锦标赛信息

项目内容
实际请求路径0f417a8cb8aedeb91863772524afe742(= MD5("GetGameTournamentInfoApiMaimaiChn8bF76dE9"))
Packet 类PacketGetGameTournamentInfo
请求 VOGameTournamentInfoRequestVO
响应 VOGameTournamentInfoResponseVO
触发时机开机/联网时(DataDownloaderMai2)
调用位置Manager.Operation/DataDownloaderMai2.cs

锦标赛(官方比赛活动)信息接口,返回活动定义列表(含比赛曲目等),供比赛模式使用。

请求字段(GameTournamentInfoRequestVO)

字段类型说明

响应字段(GameTournamentInfoResponseVO)

字段类型说明
lengthlong数据总条数
gameTournamentInfoListGameTournamentInfo[]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
请求 VOGameWeeklyRequestVO
响应 VOGameWeeklyResponseVO
触发时机开机/联网时(DataDownloaderMai2)
调用位置Manager.Operation/DataDownloaderMai2.cs

每周运营数据接口,返回单个 GameWeeklyData 对象(周任务/周排行等每周刷新内容)。

请求字段(GameWeeklyRequestVO)

字段类型说明

响应字段(GameWeeklyResponseVO)

字段类型说明
gameWeeklyDataGameWeeklyData嵌套数据对象

JSON 示例

请求(GameWeeklyRequestVO):

{}

响应(GameWeeklyResponseVO):

{
  "gameWeeklyData": {
    "missionCategory": 0,
    "updateDate": "",
    "beforeDate": ""
  }
}

服务器实现要点

  • 可返回默认结构

GetGameKaleidxScopeApi — 万花筒全局配置

项目内容
实际请求路径90e3c71c5c9dad8bcb897cd80878aa2f(= MD5("GetGameKaleidxScopeApiMaimaiChn8bF76dE9"))
Packet 类PacketGetGameKaleidxScope
请求 VOGameKaleidxScopeRequestVO
响应 VOGameKaleidxScopeResponseVO
触发时机开机/联网时(DataDownloaderMai2)
调用位置Manager.Operation/DataDownloaderMai2.cs

万花筒(カレイドスコープ)模式的全局配置:门/钥匙的日程与章节定义。个人进度则由 GetUserKaleidxScopeApi / UpsertUserAll 的 userKaleidxScopeList 承载。

请求字段(GameKaleidxScopeRequestVO)

字段类型说明

响应字段(GameKaleidxScopeResponseVO)

字段类型说明
gameKaleidxScopeListGameKaleidxScope[]GameKaleidxScope对象数组

JSON 示例

请求(GameKaleidxScopeRequestVO):

{}

响应(GameKaleidxScopeResponseVO):

{
  "gameKaleidxScopeList": [
    {
      "gateId": 0,
      "phaseId": 0
    }
  ]
}

服务器实现要点

  • 私有服务器若不开放万花筒玩法可返回空列表

玩家数据下载

GetUserDataApi — 用户主数据

项目内容
实际请求路径fd656c2487aa5ed41c6a0012f0000288(= MD5("GetUserDataApiMaimaiChn8bF76dE9"))
Packet 类PacketGetUserData
请求 VOUserDetailRequestVO
响应 VOUserDetailResponseVO
触发时机刷卡登录后由下载状态机一次性拉取(StateUserDownload)
调用位置UserDataDLState.Exist/StateUserDownload.cs

用户主数据接口,返回 UserDetail(82 字段)——昵称、当前外观(头像/名牌/称号/相框/搭档)、当前选择的舞里程地图(selectMapId)、Rating 与段位、累计统计(游玩数、各难度 DXScore/达成率合计)、同行角色编成(charaSlot)、舞里程结转(mapStock)等。响应额外带 banState。是所有下载数据中最核心的一份。

请求字段(UserDetailRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)

响应字段(UserDetailResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
userDataUserDetail嵌套数据对象
banStateint

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
请求 VOUserExtendRequestVO
响应 VOUserExtendResponseVO
触发时机登录下载状态机(StateUserDownload)
调用位置UserDataDLState.Exist/StateUserDownload.cs

用户扩展数据:选曲光标位置(selectMusicId/categoryIndex/musicIndex)、排序偏好、拍照条款同意标记(isPhotoAgree)、结算画面设置等 16 个字段。属于"玩家上次离开时的状态"记忆。

请求字段(UserExtendRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)

响应字段(UserExtendResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
userExtendUserExtend嵌套数据对象

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
请求 VOUserOptionRequestVO
响应 VOUserOptionResponseVO
触发时机登录下载状态机(StateUserDownload)
调用位置UserDataDLState.Exist/StateUserDownload.cs

用户设置接口,返回 UserOption(48 字段):音符/滑条/触摸速度、各类设计(tap/hold/slide/star)、判定显示与调整、音量组、镜像模式、排序设置等,即设置菜单里的全部可调项。

请求字段(UserOptionRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)

响应字段(UserOptionResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
userOptionUserOption嵌套数据对象

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
请求 VOUserCharacterRequestVO
响应 VOUserCharacterResponseVO
触发时机登录下载状态机(StateUserDownload,分页)
调用位置UserDataDLState.Exist/StateUserDownload.cs

持有角色列表:characterId、等级(level 高位为转生次数)、觉醒阶段(awakening 0-4 星)、使用次数。角色是舞里程系统的核心——同行角色的队长/同色状态直接决定里程增速。

请求字段(UserCharacterRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)

响应字段(UserCharacterResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
userCharacterListUserCharacter[]UserCharacter对象数组

JSON 示例

请求(UserCharacterRequestVO):

{
  "userId": 100000000000000001
}

响应(UserCharacterResponseVO):

{
  "userId": 100000000000000001,
  "userCharacterList": [
    {
      "characterId": 101,
      "level": 3,
      "awakening": 0,
      "useCount": 0
    }
  ]
}

服务器实现要点

  • 新用户返回空列表或初始角色(でらっくま family)

GetUserItemApi — 持有物品(解锁列表)

项目内容
实际请求路径4ddc03719f4cb07ad3bd5bef2c25d68b(= MD5("GetUserItemApiMaimaiChn8bF76dE9"))
Packet 类PacketGetUserItem
请求 VOUserItemRequestVO
响应 VOUserItemResponseVO
触发时机登录下载状态机(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)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
nextIndexlong分页游标:响应中非 0 时须以该值继续请求,0 表示已取完

响应字段(UserItemResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
nextIndexlong分页游标:响应中非 0 时须以该值继续请求,0 表示已取完
itemKindint物品类型(ItemKind,见附录 B.1)
userItemListUserItem[]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
请求 VOUserMapRequestVO
响应 VOUserMapResponseVO
触发时机登录下载状态机(StateUserDownload,分页)
调用位置UserDataDLState.Exist/StateUserDownload.cs

舞里程地图进度接口,返回 UserMap 列表 {mapId, distance, isLock, isClear, isComplete, unlockFlag},支持分页。客户端据此重建每张地图的推进状态与宝藏领取进度。

请求字段(UserMapRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
nextIndexlong分页游标:响应中非 0 时须以该值继续请求,0 表示已取完

响应字段(UserMapResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
nextIndexlong分页游标:响应中非 0 时须以该值继续请求,0 表示已取完
userMapListUserMap[]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
请求 VOUserLoginBonusRequestVO
响应 VOUserLoginBonusResponseVO
触发时机登录下载状态机(StateUserDownload)
调用位置UserDataDLState.Exist/StateUserDownload.cs

登录奖励进度:每个奖励活动的 bonusId、当前天数(point)、进行中/已拿满标记。

请求字段(UserLoginBonusRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
nextIndexlong分页游标:响应中非 0 时须以该值继续请求,0 表示已取完

响应字段(UserLoginBonusResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
nextIndexlong分页游标:响应中非 0 时须以该值继续请求,0 表示已取完
userLoginBonusListUserLoginBonus[]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
请求 VOUserKaleidxScopeRequestVO
响应 VOUserKaleidxScopeResponseVO
触发时机登录下载状态机(StateUserDownload)
调用位置UserDataDLState.Exist/StateUserDownload.cs

万花筒模式个人进度:每扇门一条 UserKaleidxScope 记录 {gateId, isGateFound, isKeyFound, isClear, 成绩统计…}。钥匙不是独立列表——获得某门钥匙即对应记录的 isKeyFound=true。

请求字段(UserKaleidxScopeRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)

响应字段(UserKaleidxScopeResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
userKaleidxScopeListUserKaleidxScope[]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
请求 VOUserMissionRequestVO
响应 VOUserMissionResponseVO
触发时机登录下载状态机(StateUserDownload)
调用位置UserDataDLState.Exist/StateUserDownload.cs

任务进度接口,响应由 userWeeklyData(周数据)与 userMissionDataList(任务定义与达成标记)组成。

请求字段(UserMissionRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)

响应字段(UserMissionResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
userWeeklyDataUserWeeklyData嵌套数据对象
userMissionDataListUserMissionData[]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
请求 VOUserMusicRequestVO
响应 VOUserMusicResponseVO
触发时机登录下载状态机(StateUserDownload,分页)
调用位置UserDataDLState.Exist/StateUserDownload.cs

乐曲成绩明细接口,返回 UserMusic 列表(内嵌 UserMusicDetail:曲目×难度的最佳达成率、FC/AP 状态、DXScore、rank 等),支持分页。是玩家成绩库的全量下载。

请求字段(UserMusicRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
nextIndexint分页游标:响应中非 0 时须以该值继续请求,0 表示已取完

响应字段(UserMusicResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
nextIndexint分页游标:响应中非 0 时须以该值继续请求,0 表示已取完
userMusicListUserMusic[]UserMusic对象数组

JSON 示例

请求(UserMusicRequestVO):

{
  "userId": 100000000000000001,
  "nextIndex": 0
}

响应(UserMusicResponseVO):

{
  "userId": 100000000000000001,
  "nextIndex": 0,
  "userMusicList": [
    {
      "userMusicDetailList": [
        {}
      ]
    }
  ]
}

服务器实现要点

  • 成绩量大的玩家需正确处理分页
  • achievement 为万分比整数

GetUserRatingApi — 评级数据

项目内容
实际请求路径44fb2a7ba20b9c000483b9284b7a89d6(= MD5("GetUserRatingApiMaimaiChn8bF76dE9"))
Packet 类PacketGetUserRating
请求 VOUserRatingRequestVO
响应 VOUserRatingResponseVO
触发时机登录下载状态机(StateUserDownload)
调用位置UserDataDLState.Exist/StateUserDownload.cs

Rating 构成接口:当前 rating 值 + 四个 UserRate 列表(旧曲 Best 35 / 新曲 Best 15 及各自的候选位)+ 段位对象 udemae。

请求字段(UserRatingRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)

响应字段(UserRatingResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
userRatingUserRating嵌套数据对象

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
请求 VOUserActivityRequestVO
响应 VOUserActivityResponseVO
触发时机登录下载状态机(StateUserDownload)
调用位置UserDataDLState.Exist/StateUserDownload.cs

活动日志接口,返回 UserActivity = {playList, musicList} 两个 UserAct 列表。UserAct.kind 遵循 ActivityCode(100=传导乐曲解锁、120=挑战曲通关等),是"玩家达成史"的流水。

请求字段(UserActivityRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)

响应字段(UserActivityResponseVO)

字段类型说明
userActivityUserActivity嵌套数据对象

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
请求 VOUserFavoriteRequestVO
响应 VOUserFavoriteResponseVO
触发时机登录下载状态机(StateUserDownload)
调用位置UserDataDLState.Exist/StateUserDownload.cs

收藏乐曲:一个 {itemKind, itemIdList} 对象(按类别分组收藏的曲目 ID 列表)。

请求字段(UserFavoriteRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
itemKindint物品类型(ItemKind,见附录 B.1)

响应字段(UserFavoriteResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
userFavoriteUserFavorite嵌套数据对象

JSON 示例

请求(UserFavoriteRequestVO):

{
  "userId": 100000000000000001,
  "itemKind": 5
}

响应(UserFavoriteResponseVO):

{
  "userId": 100000000000000001,
  "userFavorite": {
    "itemKind": 5,
    "itemIdList": [
      0
    ]
  }
}

服务器实现要点

  • 返回空对象即可

GetUserFavoriteItemApi — 收藏物品

项目内容
实际请求路径0fd23ee034286ca52c0f7a0ac54b0e4b(= MD5("GetUserFavoriteItemApiMaimaiChn8bF76dE9"))
Packet 类PacketGetUserFavoriteItem
请求 VOUserFavoriteItemRequestVO
响应 VOUserFavoriteItemResponseVO
触发时机登录下载状态机(StateUserDownload)
调用位置UserDataDLState.Exist/StateUserDownload.cs

收藏物品接口(按键 kind 分类拉取,支持分页与 isAllFavoriteItem 全量标记)。

请求字段(UserFavoriteItemRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
kindint
nextIndexulong分页游标:响应中非 0 时须以该值继续请求,0 表示已取完
isAllFavoriteItembool

响应字段(UserFavoriteItemResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
kindint
nextIndexulong分页游标:响应中非 0 时须以该值继续请求,0 表示已取完
userFavoriteItemListUserFavoriteItem[]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
请求 VOUserGhostRequestVO
响应 VOUserGhostResponseVO
触发时机登录下载状态机(StateUserDownload)
调用位置UserDataDLState.Exist/StateUserDownload.cs

幽灵数据接口:返回其他玩家(对手)的单曲成绩与档案缩略(UserGhost),选曲时叠加显示"幽灵"成绩线。

请求字段(UserGhostRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)

响应字段(UserGhostResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
userGhostListUserGhost[]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
请求 VOUserCourseRequestVO
响应 VOUserCourseResponseVO
触发时机登录下载状态机(StateUserDownload)
调用位置UserDataDLState.Exist/StateUserDownload.cs

课程模式(段位认定等)进度:courseId、通关标记、剩余命数合计、最佳达成率/DXScore 及日期、挑战次数。支持分页。

请求字段(UserCourseRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
nextIndexlong分页游标:响应中非 0 时须以该值继续请求,0 表示已取完

响应字段(UserCourseResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
nextIndexlong分页游标:响应中非 0 时须以该值继续请求,0 表示已取完
userCourseListUserCourse[]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
请求 VOUserChargeRequestVO
响应 VOUserChargeResponseVO
触发时机登录下载状态机(StateUserDownload)
调用位置UserDataDLState.Exist/StateUserDownload.cs

持有收费道具:chargeId(对应 GetGameChargeApi 定义)、剩余次数(stock)、购买/失效日期。通行证(有効期限内无限游玩加成)与门票都表现为 UserCharge。

请求字段(UserChargeRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)

响应字段(UserChargeResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
lengthlong数据总条数
userChargeListUserCharge[]UserCharge对象数组

JSON 示例

请求(UserChargeRequestVO):

{
  "userId": 100000000000000001
}

响应(UserChargeResponseVO):

{
  "userId": 100000000000000001,
  "length": 30,
  "userChargeList": [
    {
      "chargeId": 0,
      "stock": 0,
      "purchaseDate": "",
      "validDate": ""
    }
  ]
}

服务器实现要点

  • 有效期校验由服务器在结算时执行

GetUserShopStockApi — 商店库存

项目内容
实际请求路径3a22d40097e7c5318addaba430515b65(= MD5("GetUserShopStockApiMaimaiChn8bF76dE9"))
Packet 类PacketGetUserShopStock
请求 VOUserShopStockRequestVO
响应 VOUserShopStockResponseVO
触发时机登录下载状态机(StateUserDownload)
调用位置UserDataDLState.Exist/StateUserDownload.cs

商店库存:玩家在各商店商品上的已兑换次数(shopItemId + tradeCount),用于限购。

请求字段(UserShopStockRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)

响应字段(UserShopStockResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
userShopStockListUserShopStock[]UserShopStock对象数组

JSON 示例

请求(UserShopStockRequestVO):

{
  "userId": 100000000000000001
}

响应(UserShopStockResponseVO):

{
  "userId": 100000000000000001,
  "userShopStockList": [
    {
      "shopItemId": 0,
      "tradeCount": 0
    }
  ]
}

服务器实现要点

  • 返回空列表即无兑换记录

GetUserFriendSeasonRankingApi — 友情赛季排名

项目内容
实际请求路径014554f7d214262e83e07c8b8343dee9(= MD5("GetUserFriendSeasonRankingApiMaimaiChn8bF76dE9"))
Packet 类PacketGetUserFriendSeasonRanking
请求 VOUserFriendSeasonRankingRequestVO
响应 VOUserFriendSeasonRankingResponseVO
触发时机登录下载状态机(StateUserDownload)
调用位置UserDataDLState.Exist/StateUserDownload.cs

友情对战赛季排名数据(seasonId 定位赛季),支持分页。

请求字段(UserFriendSeasonRankingRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
nextIndexlong分页游标:响应中非 0 时须以该值继续请求,0 表示已取完

响应字段(UserFriendSeasonRankingResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
nextIndexlong分页游标:响应中非 0 时须以该值继续请求,0 表示已取完
userFriendSeasonRankingListUserFriendSeasonRanking[]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
请求 VOUserRegionRequestVO
响应 VOUserRegionResponseVO
触发时机登录下载状态机(StateUserDownload)
调用位置UserDataDLState.Exist/StateUserDownload.cs

玩家游玩过的地域记录(regionId + 游玩次数 + 首次日期),配合地域.collect 玩法。

请求字段(UserRegionRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)

响应字段(UserRegionResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
lengthulong数据总条数
userRegionListUserRegion[]UserRegion对象数组

JSON 示例

请求(UserRegionRequestVO):

{
  "userId": 100000000000000001
}

响应(UserRegionResponseVO):

{
  "userId": 100000000000000001,
  "length": 30,
  "userRegionList": [
    {
      "regionId": 0,
      "playCount": 0,
      "created": ""
    }
  ]
}

服务器实现要点

  • 可由 playlog 的 regionId 汇总生成

GetUserPortraitApi — 拉取肖像

项目内容
实际请求路径17b91c10b562af4e48eb4cabd3a26226(= MD5("GetUserPortraitApiMaimaiChn8bF76dE9"))
Packet 类PacketGetUserPortrait
请求 VOGetUserPortraitRequestVO
响应 VOGetUserPortraitResponseVO
触发时机登录下载状态机(StateUserDownload)
调用位置UserDataDLState.Exist/StateUserDownload.cs

拉取玩家面部肖像。请求仅 {userId},响应 length 为分片信息(数据体量小,实际照片内容按需上传/下载)。

请求字段(GetUserPortraitRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)

响应字段(GetUserPortraitResponseVO)

字段类型说明
lengthint数据总条数

JSON 示例

请求(GetUserPortraitRequestVO):

{
  "userId": 100000000000000001
}

响应(GetUserPortraitResponseVO):

{
  "length": 30
}

服务器实现要点

  • 未设置肖像时返回空

GetUserNewItemApi — 游玩结算新物品

项目内容
实际请求路径b0f03b2ae76e3ab7709ca2e4a5de0e17(= MD5("GetUserNewItemApiMaimaiChn8bF76dE9"))
Packet 类PacketGetUserNewItem
请求 VOUserNewItemRequestVO
响应 VOUserNewItemResponseVO
触发时机登录下载独立状态(StateUserNewItemDownload,携带本局 playlog)
调用位置UserDataDLState.Exist/StateUserNewItemDownload.cs

由服务器按游玩记录结算解锁的接口:请求携带 version 与本局全部 userPlaylogList,服务器分析后返回一个待解锁物品 {itemKind, itemId}。它是"游玩行为→解锁"的服务器侧结算通道(如条件达成的新曲解锁)。

请求字段(UserNewItemRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
versionint数据版本
userPlaylogListUserPlaylog[]本局全部游玩记录(服务器据此结算解锁)

响应字段(UserNewItemResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
itemKindint解锁物品类型
itemIdint解锁物品 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
请求 VOUserNewItemListRequestVO
响应 VOUserNewItemListResponseVO
触发时机登录下载独立状态(StateUserNewItemListDownload)
调用位置UserDataDLState.Exist/StateUserNewItemListDownload.cs

GetUserNewItemApi 的列表版:请求额外携带完整 UserDetail,返回 UserItem 列表(带新获得标记的物品)。

请求字段(UserNewItemListRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
versionint
userDataUserDetail[]UserDetail对象数组
userPlaylogListUserPlaylog[]UserPlaylog对象数组

响应字段(UserNewItemListResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
userItemListUserItem[]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
请求 VOUserCardRequestVO
响应 VOUserCardResponseVO
触发时机登录下载状态机(StateUserDownload)
调用位置UserDataDLState.Exist/StateUserDownload.cs

玩家绑定的 Aime 卡信息(UserCard 列表)。

请求字段(UserCardRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
nextIndexint分页游标:响应中非 0 时须以该值继续请求,0 表示已取完

响应字段(UserCardResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
nextIndexint分页游标:响应中非 0 时须以该值继续请求,0 表示已取完
userCardListUserCard[]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
请求 VOUserIntimateRequestVO
响应 VOUserIntimateResponseVO
触发时机登录下载状态机(StateUserDownload)
调用位置UserDataDLState.Exist/StateUserDownload.cs

PartnerCloseness/亲密度数据(UserIntimate 列表)。Packet 类名为 PacketGetUserPartnerCloseness。

请求字段(UserIntimateRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)

响应字段(UserIntimateResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
lengthint数据总条数
userIntimateListUserIntimate[]UserIntimate对象数组

JSON 示例

请求(UserIntimateRequestVO):

{
  "userId": 100000000000000001
}

响应(UserIntimateResponseVO):

{
  "userId": 100000000000000001,
  "length": 30,
  "userIntimateList": [
    {
      "partnerId": 0,
      "intimateLevel": 0,
      "intimateCountRewarded": 0
    }
  ]
}

GetUserScoreRankingApi — 谱面成绩排行

项目内容
实际请求路径b85d9100437414044af5450039d7751b(= MD5("GetUserScoreRankingApiMaimaiChn8bF76dE9"))
Packet 类PacketGetUserScoreRanking
请求 VOUserScoreRankingRequestVO
响应 VOUserScoreRankingResponseVO
触发时机登录下载状态机(StateUserDownload)
调用位置UserDataDLState.Exist/StateUserDownload.cs

成绩排行(score ranking)活动的榜单数据。

请求字段(UserScoreRankingRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
competitionIdint

响应字段(UserScoreRankingResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
userScoreRankingUserScoreRanking嵌套数据对象

JSON 示例

请求(UserScoreRankingRequestVO):

{
  "userId": 100000000000000001,
  "competitionId": 0
}

响应(UserScoreRankingResponseVO):

{
  "userId": 100000000000000001,
  "userScoreRanking": {
    "tournamentId": 0,
    "totalScore": 0,
    "ranking": 0,
    "rankingDate": ""
  }
}

GetUserRivalDataApi — 对手档案

项目内容
实际请求路径6d0fbdb911c7598b9d31906474b3fa3e(= MD5("GetUserRivalDataApiMaimaiChn8bF76dE9"))
Packet 类PacketGetUserRivalData
请求 VOUserRivalRequestVO
响应 VOUserRivalResponseVO
触发时机登录下载状态机(StateUserDownload)
调用位置UserDataDLState.Exist/StateUserDownload.cs

对手(rival)档案接口:请求带 rivalId,返回对手的 UserRivalData。

请求字段(UserRivalRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
rivalIdulong

响应字段(UserRivalResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
userRivalDataUserRivalData嵌套数据对象

JSON 示例

请求(UserRivalRequestVO):

{
  "userId": 100000000000000001,
  "rivalId": 0
}

响应(UserRivalResponseVO):

{
  "userId": 100000000000000001,
  "userRivalData": {
    "rivalId": 0,
    "rivalName": ""
  }
}

服务器实现要点

  • 无 rival 系统返回默认结构

GetUserRivalMusicApi — 对手乐曲成绩

项目内容
实际请求路径347f15009fe18d96ba645b47d2f40a04(= MD5("GetUserRivalMusicApiMaimaiChn8bF76dE9"))
Packet 类PacketGetUserRivalMusic
请求 VOUserRivalMusicRequestVO
响应 VOUserRivalMusicResponseVO
触发时机登录下载状态机(StateUserDownload)
调用位置UserDataDLState.Exist/StateUserDownload.cs

对手乐曲成绩:请求带 rivalId,返回该对手的成绩列表,支持分页。

请求字段(UserRivalMusicRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
rivalIdulong
nextIndexint分页游标:响应中非 0 时须以该值继续请求,0 表示已取完

响应字段(UserRivalMusicResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
rivalIdulong
nextIndexint分页游标:响应中非 0 时须以该值继续请求,0 表示已取完
userRivalMusicListUserRivalMusic[]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
请求 VOUserRecommendRateMusicRequestVO
响应 VOUserRecommendRateMusicResponseVO
触发时机登录下载状态机(StateUserDownload)
调用位置UserDataDLState.Exist/StateUserDownload.cs

按 Rating 推荐曲目:返回推荐曲目对象列表(升 Rating 建议选曲)。

请求字段(UserRecommendRateMusicRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)

响应字段(UserRecommendRateMusicResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
userRecommendRateMusicIdListUserRecommendRateMusic[]UserRecommendRateMusic对象数组

JSON 示例

请求(UserRecommendRateMusicRequestVO):

{
  "userId": 100000000000000001
}

响应(UserRecommendRateMusicResponseVO):

{
  "userId": 100000000000000001,
  "userRecommendRateMusicIdList": [
    {
      "musicId": 11820,
      "level": 3,
      "averageAchievement": 0
    }
  ]
}

服务器实现要点

  • 可由成绩与 ratingList 计算或返回空

GetUserRecommendSelectMusicApi — 选曲推荐

项目内容
实际请求路径62840c42cd6a2b7d6a81f4f2083efe4f(= MD5("GetUserRecommendSelectMusicApiMaimaiChn8bF76dE9"))
Packet 类PacketGetUserRecommendSelectionMusic
请求 VOUserRecommendSelectionMusicRequestVO
响应 VOUserRecommendSelectionMusicResponseVO
触发时机登录下载状态机(StateUserDownload)
调用位置UserDataDLState.Exist/StateUserDownload.cs

选曲场景的推荐曲目,响应为纯 ID 列表(userRecommendSelectionMusicIdList)。注意端点名是 RecommendSelectMusic(Packet 类名写作 Selection)。

请求字段(UserRecommendSelectionMusicRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)

响应字段(UserRecommendSelectionMusicResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
userRecommendSelectionMusicIdListint[]int对象数组

JSON 示例

请求(UserRecommendSelectionMusicRequestVO):

{
  "userId": 100000000000000001
}

响应(UserRecommendSelectionMusicResponseVO):

{
  "userId": 100000000000000001,
  "userRecommendSelectionMusicIdList": [
    0
  ]
}

服务器实现要点

  • 返回空列表即无推荐

GetUserFriendBonusApi — 好友加成

项目内容
实际请求路径c476e4c12928e26ac4a06b10cef8177f(= MD5("GetUserFriendBonusApiMaimaiChn8bF76dE9"))
Packet 类PacketGetUserFriendBonus
请求 VOUserFriendBonusRequestVO
响应 VOUserFriendBonusResponseVO
触发时机登录下载状态机(StateUserDownload)
调用位置UserDataDLState.Exist/StateUserDownload.cs

好友加成:与好友同玩时获得的额外里程(getMiles)与结果码。

请求字段(UserFriendBonusRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)

响应字段(UserFriendBonusResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
returnCodeint结果码(1 = 成功)
getMilesulong

JSON 示例

请求(UserFriendBonusRequestVO):

{
  "userId": 100000000000000001
}

响应(UserFriendBonusResponseVO):

{
  "userId": 100000000000000001,
  "returnCode": 1,
  "getMiles": 0
}

服务器实现要点

  • 无好友体系返回 getMiles=0

GetUserFriendCheckApi — 好友校验

项目内容
实际请求路径5f8721b81bd9a62d946c51b0fef2e3c3(= MD5("GetUserFriendCheckApiMaimaiChn8bF76dE9"))
Packet 类PacketGetUserFriendCheck
请求 VOUserFriendCheckRequestVO
响应 VOUserFriendCheckResponseVO
触发时机登录下载流程(UserDataDLProcess)
调用位置Process/UserDataDLProcess.cs

好友校验:请求带双方 userId,返回 returnCode 表示是否可建立好友关系(存在性/已是好友等)。

请求字段(UserFriendCheckRequestVO)

字段类型说明
userId1ulong
userId2ulong

响应字段(UserFriendCheckResponseVO)

字段类型说明
returnCodeint结果码(1 = 成功)

JSON 示例

请求(UserFriendCheckRequestVO):

{
  "userId1": 0,
  "userId2": 0
}

响应(UserFriendCheckResponseVO):

{
  "returnCode": 1
}

服务器实现要点

  • 简单实现恒返回 1

GetTransferFriendApi — 好友数据列表

项目内容
实际请求路径6e0a39819250294129051df516be187f(= MD5("GetTransferFriendApiMaimaiChn8bF76dE9"))
Packet 类PacketGetTransferFriend
请求 VOTransferFriendRequestVO
响应 VOTransferFriendResponseVO
触发时机未使用(死代码)
调用位置(无调用点,保留接口)

好友数据列表(transferFriendList:同玩玩家、友情点、收藏标记)。当前版本客户端没有任何调用点(0 处),属于保留接口

请求字段(TransferFriendRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)

响应字段(TransferFriendResponseVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
transferFriendListTransferFriend[]TransferFriend对象数组

JSON 示例

请求(TransferFriendRequestVO):

{
  "userId": 100000000000000001
}

响应(TransferFriendResponseVO):

{
  "userId": 100000000000000001,
  "transferFriendList": [
    {
      "playUserId": 0,
      "playUserName": "",
      "playDate": "",
      "friendPoint": 0,
      "isFavorite": false
    }
  ]
}

服务器实现要点

  • 返回空列表即可

玩家数据上传

UploadUserPlaylogApi — 上传游玩记录

项目内容
实际请求路径524535c1f32eb47b2a818ffa5087c625(= MD5("UploadUserPlaylogApiMaimaiChn8bF76dE9"))
Packet 类PacketUploadUserPlaylog
请求 VOUserPlaylogRequestVO
响应 VOUpsertResponseVO
触发时机每曲结算后(PlaylogULProcess/StateUpload 逐曲上传)
调用位置PlaylogULState/StateUpload.csUserDataULState/StateULUserAime.cs(旧路径)

单曲游玩记录上传。每首曲目结算后立即调用(PlaylogULProcess/StateUpload),请求体 UserPlaylog 为 110 字段的全量记录:判定明细(TAP/HOLD/SLIDE/TOUCH/BREAK × 五档)、FAST/LATE、达成率、DXScore、前后 Rating、同行角色、对战信息等。旧版本该数据并入 UpsertUserAll,现已拆分独立逐曲上传。

请求字段(UserPlaylogRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
userPlaylogUserPlaylog嵌套数据对象

响应字段(UpsertResponseVO)

字段类型说明
returnCodeint结果码(1 = 成功)
apiNamestring回显的 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
请求 VOUserAllRequestVO
响应 VOUpsertResponseVO
触发时机数据保存画面(StateULUserAime/StateULUserGuest)
调用位置UserDataULState/StateULUserAime.csStateULUserGuest.cs

整个协议的核心落库接口。数据保存画面调用一次,把本局产生的全部状态变化以差量方式提交:约 20 个列表(解锁 userItemList、舞里程 userMapList、角色、成绩、活动、万花筒……)+ 各自的 isNew 位图("1"=新增,"0"=更新)。服务器按 1.7 节的对照表合并即可完整复刻官方存档语义。解锁体系(乐曲/紫白谱/钥匙)的最终持久化都发生在这里。

请求字段(UserAllRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
playlogIdulong本局会话 ID(UserLoginApi 返回的 loginId)
isEventModebool是否活动模式
isFreePlaybool是否免费玩
loginDateTimelong登录时间(Unix 秒)
userPlaylogListUserPlaylog[]本局全部单曲游玩记录(与逐曲上传内容一致)
upsertUserAllUserAllUserAll 聚合数据(差量列表 + isNew 位图,见 1.7)

响应字段(UpsertResponseVO)

字段类型说明
returnCodeint结果码(1 = 成功)
apiNamestring回显的 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
请求 VOUploadUserPortraitRequestVO
响应 VOUpsertResponseVO
触发时机数据保存画面(StateULUserAime,拍了头像才发)
调用位置UserDataULState/StateULUserAime.cs

面部肖像上传:拍头像功能开启时(TakeFaceIcon),把 {userId}.jpg 以 Base64 分片(divNumber/divLength)放入 UserPortrait 上传,仍走 AES 加密 JSON 通道。

请求字段(UploadUserPortraitRequestVO)

字段类型说明
userPortraitUserPortrait嵌套数据对象

响应字段(UpsertResponseVO)

字段类型说明
returnCodeint结果码(1 = 成功)
apiNamestring回显的 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
请求 VOUserPhotoRequestVO
响应 VOUpsertResponseVO
触发时机数据保存画面(StateULUserAime,拍了照片才发)
调用位置UserDataULState/StateULUserAime.cs

游玩照片上传:结算时拍摄的照片(JPEG Base64 分片)+ 关联的 playlogId/trackNo。

请求字段(UserPhotoRequestVO)

字段类型说明
userPhotoUserPhoto嵌套数据对象

响应字段(UpsertResponseVO)

字段类型说明
returnCodeint结果码(1 = 成功)
apiNamestring回显的 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
请求 VOUserChargelogRequestVO
响应 VOUpsertResponseVO
触发时机扣票/扣费时(Manager/TicketManager)
调用位置Manager/TicketManager.cs

扣费记录上传:玩家使用收费项(门票/通行证)时由 TicketManager 调用,请求携带 UserChargelog(扣费流水:chargeId/price/时间/机器)与扣费后的 UserCharge 余量。

请求字段(UserChargelogRequestVO)

字段类型说明
userIdulong玩家 ID(64 位,由 Aime 卡号派生)
userChargelogUserChargelog嵌套数据对象
userChargeUserCharge嵌套数据对象
loginDateTimelong登录时间(Unix 秒)

响应字段(UpsertResponseVO)

字段类型说明
returnCodeint结果码(1 = 成功)
apiNamestring回显的 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
请求 VOUserFriendRegistRequestVO
响应 VOUserFriendRegistResponseVO
触发时机加好友画面(AddFriendProcess)
调用位置Process/AddFriendProcess.cs

好友注册:请求带双方 userId(userId1=发起者,userId2=目标),返回两个 returnCode(各自侧的结果)。

请求字段(UserFriendRegistRequestVO)

字段类型说明
userId1ulong
userId2ulong

响应字段(UserFriendRegistResponseVO)

字段类型说明
returnCode1int
returnCode2int

JSON 示例

请求(UserFriendRegistRequestVO):

{
  "userId1": 0,
  "userId2": 0
}

响应(UserFriendRegistResponseVO):

{
  "returnCode1": 0,
  "returnCode2": 0
}

服务器实现要点

  • 校验目标存在性后写好友关系表

机器遥测上传(与玩家数据无关)

UpsertClientPlayTimeApi — 运行时长上报

项目内容
实际请求路径4108f72e2e705d95ca13b110da00a192(= MD5("UpsertClientPlayTimeApiMaimaiChn8bF76dE9"))
Packet 类PacketUpsertClientPlayTime
请求 VOClientPlayTimeRequestVO
响应 VOUpsertResponseVO
触发时机开机/登出(Manager.Operation/DataUploader 统一上报)
调用位置Manager.Operation/DataUploader.cs

机器运行时长上报(ClientPlayTime 对象),用于运营统计,与玩家数据完全无关。

请求字段(ClientPlayTimeRequestVO)

字段类型说明
clientPlayTimeClientPlayTime嵌套数据对象

响应字段(UpsertResponseVO)

字段类型说明
returnCodeint结果码(1 = 成功)
apiNamestring回显的 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
请求 VOClientBookkeepingRequestVO
响应 VOUpsertResponseVO
触发时机开机/登出(DataUploader)
调用位置Manager.Operation/DataUploader.cs

记账上报(ClientBookkeeping:投入金额/计数等经营统计)。

请求字段(ClientBookkeepingRequestVO)

字段类型说明
clientBookkeepingClientBookkeeping嵌套数据对象

响应字段(UpsertResponseVO)

字段类型说明
returnCodeint结果码(1 = 成功)
apiNamestring回显的 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
请求 VOClientSettingRequestVO
响应 VOUpsertResponseVO
触发时机开机(DataUploader)
调用位置Manager.Operation/DataUploader.cs

客户端设置快照上报(ClientSetting)。

请求字段(ClientSettingRequestVO)

字段类型说明
clientSettingClientSetting嵌套数据对象

响应字段(UpsertResponseVO)

字段类型说明
returnCodeint结果码(1 = 成功)
apiNamestring回显的 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
请求 VOClientTestmodeRequestVO
响应 VOUpsertResponseVO
触发时机开机(DataUploader)
调用位置Manager.Operation/DataUploader.cs

测试菜单(TestMode)配置快照上报。

请求字段(ClientTestmodeRequestVO)

字段类型说明
clientTestmodeClientTestmode嵌套数据对象

响应字段(UpsertResponseVO)

字段类型说明
returnCodeint结果码(1 = 成功)
apiNamestring回显的 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
请求 VOClientUploadRequestVO
响应 VOUpsertResponseVO
触发时机异常时(DataUploader)
调用位置Manager.Operation/DataUploader.cs

客户端错误/诊断信息上报(ClientUpload),对应机器本地 UploadData 目录的收集内容。

请求字段(ClientUploadRequestVO)

字段类型说明
clientUploadClientUpload嵌套数据对象

响应字段(UpsertResponseVO)

字段类型说明
returnCodeint结果码(1 = 成功)
apiNamestring回显的 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# 类型
placeIdint
clientIdstring
updateDatestring
creditSetting0int
creditSetting1int
creditSetting2int
credits1Pint
credits2Pint
creditsFreedomint
creditsTicketint
creditCoinint
creditServiceint
creditEmoneyint
timeTotalint
timeTotalPlayint
timeLongest1Pint
timeShortest1Pint
timeLongest2Pint
timeShortest2Pint
timeLongestFreedomint
timeShortestFreedomint
newFreeUserNumint
tutorialPlayint
play1PNumint
play2PNumint
playFreedomNumint
aimeLoginNumint
guestLoginNumint
regionIdint
playCountint
coinToCreditint
errorNumint[]
error2Numint[]
pingResultBackupNetworkInformationRecord.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# 类型
placeIdint
clientIdstring
updateDatestring
playTimeTrack3int
playTimeTrack4int
playTime2Pint
playTrack3Numint
playTrack4Numint
play2PNumint
regionIdint
{
  "placeId": 0,
  "clientId": "",
  "updateDate": "",
  "playTimeTrack3": 0,
  "playTimeTrack4": 0,
  "playTime2P": 0,
  "playTrack3Num": 0,
  "playTrack4Num": 0,
  "play2PNum": 0,
  "regionId": 0
}

ClientSetting

字段C# 类型
placeIdint
clientIdstring
placeNamestring
regionIdint
regionNamestring
bordIdstring
romVersionint
isDevelopbool
isAoubool
{
  "placeId": 0,
  "clientId": "",
  "placeName": "",
  "regionId": 0,
  "regionName": "",
  "bordId": "",
  "romVersion": 0,
  "isDevelop": false,
  "isAou": false
}

ClientTestmode

字段C# 类型
placeIdint
clientIdstring
trackSingleint
trackMultiint
trackEventint
totalMachineint
satelliteIdint
cameraPositionint
{
  "placeId": 0,
  "clientId": "",
  "trackSingle": 0,
  "trackMulti": 0,
  "trackEvent": 0,
  "totalMachine": 0,
  "satelliteId": 0,
  "cameraPosition": 0
}

ClientUpload

字段C# 类型
orderIdint
divNumberint
divLengthint
divDatastring
placeIdint
clientIdstring
uploadDatestring
fileNamestring
{
  "orderId": 0,
  "divNumber": 0,
  "divLength": 0,
  "divData": "",
  "placeId": 0,
  "clientId": "",
  "uploadDate": "",
  "fileName": ""
}

DelayLog

字段C# 类型
dlRequestsint
dlSizeint
dlRetryint
loginMsecint
saveMsecint
reductionMusicint
reductionItemint
{
  "dlRequests": 0,
  "dlSize": 0,
  "dlRetry": 0,
  "loginMsec": 0,
  "saveMsec": 0,
  "reductionMusic": 0,
  "reductionItem": 0
}

GameCharge

字段C# 类型
orderIdint
chargeIdint
priceint
startDatestring
endDatestring
{
  "orderId": 0,
  "chargeId": 0,
  "price": 0,
  "startDate": "",
  "endDate": ""
}

GameEvent

字段C# 类型
typeint
idint
startDatestring
endDatestring
{
  "type": 0,
  "id": 0,
  "startDate": "",
  "endDate": ""
}

GameKaleidxScope

字段C# 类型
gateIdint
phaseIdint
{
  "gateId": 0,
  "phaseId": 0
}

GameRanking

字段C# 类型
idlong
pointlong
userNamestring
{
  "id": 0,
  "point": 0,
  "userName": "玩家昵称"
}

GameSetting

字段C# 类型
isMaintenancebool
requestIntervalint
rebootStartTimestring
rebootEndTimestring
movieUploadLimitint
movieStatusint
movieServerUristring
deliverServerUristring
oldServerUristring
usbDlServerUristring
rebootIntervalint
pingDisablebool
packetTimeoutint
packetTimeoutLongint
packetRetryCountint
userDataDlErrTimeoutint
userDataDlErrRetryCountint
userDataDlErrSamePacketRetryCountint
userDataUpSkipTimeoutint
userDataUpSkipRetryCountint
iconPhotoDisablebool
uploadPhotoDisablebool
nameEntryDisablebool
packetRecreateCountint
collectDelayInfoDisablebool
{
  "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# 类型
tournamentIdint
tournamentNamestring
rankingKindint
scoreTypeint
noticeStartDatestring
noticeEndDatestring
startDatestring
endDatestring
entryStartDatestring
entryEndDatestring
gameTournamentMusicListGameTournamentMusic[]
{
  "tournamentId": 0,
  "tournamentName": "",
  "rankingKind": 0,
  "scoreType": 0,
  "noticeStartDate": "",
  "noticeEndDate": "",
  "startDate": "",
  "endDate": "",
  "entryStartDate": "",
  "entryEndDate": "",
  "gameTournamentMusicList": [
    {
      "tournamentId": 0,
      "musicId": 11820,
      "level": 3,
      "isFirstLock": false
    }
  ]
}

GameTournamentMusic

字段C# 类型
tournamentIdint
musicIdint
levelint
isFirstLockbool
{
  "tournamentId": 0,
  "musicId": 11820,
  "level": 3,
  "isFirstLock": false
}

GameWeeklyData

字段C# 类型
missionCategoryint
updateDatestring
beforeDatestring
{
  "missionCategory": 0,
  "updateDate": "",
  "beforeDate": ""
}

MapEncountNpc

字段C# 类型
npcIdint
musicIdint
{
  "npcId": 0,
  "musicId": 11820
}

MusicScore

字段C# 类型
musicIdint
levelint
typeint
scoreDatastring
{
  "musicId": 11820,
  "level": 3,
  "type": 0,
  "scoreData": ""
}

RequestAPI

字段C# 类型
countint
sizeint
msecint
retryint
{
  "count": 0,
  "size": 0,
  "msec": 0,
  "retry": 0
}

TransferFriend

字段C# 类型
playUserIdulong
playUserNamestring
playDatestring
friendPointint
isFavoritebool
{
  "playUserId": 0,
  "playUserName": "",
  "playDate": "",
  "friendPoint": 0,
  "isFavorite": false
}

TransferRequestVO

字段C# 类型
userIdulong
userDataUserDetail[]
userMusicDetailListUserMusicDetail[]
isNewMusicDetailListstring
{
  "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# 类型
userId1ulong
userId2ulong
userName1string
userName2string
regionIdint
placeIdint
{
  "userId1": 0,
  "userId2": 0,
  "userName1": "",
  "userName2": "",
  "regionId": 0,
  "placeId": 0
}

User2pPlaylogDetail

字段C# 类型
musicIdint
levelint
achievementint
deluxscoreint
userPlayDatestring
{
  "musicId": 11820,
  "level": 3,
  "achievement": 0,
  "deluxscore": 0,
  "userPlayDate": ""
}

UserAct

字段C# 类型
kindint
idint
sortNumberlong
param1int
param2int
param3int
param4int
{
  "kind": 0,
  "id": 0,
  "sortNumber": 0,
  "param1": 0,
  "param2": 0,
  "param3": 0,
  "param4": 0
}

UserActivity

字段C# 类型
playListUserAct[]
musicListUserAct[]
{
  "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# 类型
userDataUserDetail[]
userExtendUserExtend[]
userOptionUserOption[]
userCharacterListUserCharacter[]
userGhostUserGhost[]
userMapListUserMap[]
userLoginBonusListUserLoginBonus[]
userRatingListUserRating[]
userItemListUserItem[]
userMusicDetailListUserMusicDetail[]
userCourseListUserCourse[]
userFriendSeasonRankingListUserFriendSeasonRanking[]
userChargeListUserCharge[]
userFavoriteListUserFavorite[]
userActivityListUserActivity[]
userMissionDataListUserMissionData[]
userWeeklyDataUserWeeklyData
userGamePlaylogListUserGamePlaylog[]
user2pPlaylogUser2pPlaylog
userIntimateListUserIntimate[]
userShopItemStockListUserShopStock[]
userGetPointListUserGetPoint[]
userTradeItemListUserTradeItem[]
userFavoritemusicListUserFavoriteItem[]
userKaleidxScopeListUserKaleidxScope[]
isNewCharacterListstring
isNewMapListstring
isNewLoginBonusListstring
isNewItemListstring
isNewMusicDetailListstring
isNewCourseListstring
isNewFavoriteListstring
isNewFriendSeasonRankingListstring
isNewUserIntimateListstring
isNewFavoritemusicListstring
isNewKaleidxScopeListstring
{
  "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# 类型
cardIdint
cardTypeIdint
charaIdint
mapIdint
startDatestring
endDatestring
{
  "cardId": 0,
  "cardTypeId": 0,
  "charaId": 0,
  "mapId": 1,
  "startDate": "",
  "endDate": ""
}

UserCharacter

字段C# 类型
characterIdint
leveluint
awakeninguint
useCountuint
{
  "characterId": 101,
  "level": 3,
  "awakening": 0,
  "useCount": 0
}

UserCharge

字段C# 类型
chargeIdint
stockint
purchaseDatestring
validDatestring
{
  "chargeId": 0,
  "stock": 0,
  "purchaseDate": "",
  "validDate": ""
}

UserChargelog

字段C# 类型
chargeIdint
priceint
purchaseDatestring
playCountint
playerRatingint
placeIdint
regionIdint
clientIdstring
{
  "chargeId": 0,
  "price": 0,
  "purchaseDate": "",
  "playCount": 0,
  "playerRating": 0,
  "placeId": 0,
  "regionId": 0,
  "clientId": ""
}

UserCourse

字段C# 类型
courseIdint
isLastClearbool
totalRestlifeuint
totalAchievementuint
totalDeluxscoreuint
playCountuint
clearDatestring
lastPlayDatestring
bestAchievementuint
bestAchievementDatestring
bestDeluxscoreuint
bestDeluxscoreDatestring
{
  "courseId": 0,
  "isLastClear": false,
  "totalRestlife": 0,
  "totalAchievement": 0,
  "totalDeluxscore": 0,
  "playCount": 0,
  "clearDate": "",
  "lastPlayDate": "",
  "bestAchievement": 0,
  "bestAchievementDate": "",
  "bestDeluxscore": 0,
  "bestDeluxscoreDate": ""
}

UserDetail

字段C# 类型
accessCodestring
userNamestring
isNetMemberint
pointint
totalPointint
iconIdint
plateIdint
titleIdint
partnerIdint
frameIdint
selectMapIdint
totalAwakeint
gradeRatingint
musicRatingint
playerRatingint
highestRatingint
gradeRankint
classRankint
courseRankint
charaSlotint[]
charaLockSlotint[]
contentBitulong
playCountint
currentPlayCountint
renameCreditint
mapStockint
eventWatchedDatestring
lastGameIdstring
lastRomVersionstring
lastDataVersionstring
lastLoginDatestring
lastPlayDatestring
lastPlayCreditint
lastPlayModeint
lastPlaceIdint
lastPlaceNamestring
lastAllNetIdint
lastRegionIdint
lastRegionNamestring
lastClientIdstring
lastCountryCodestring
lastSelectEMoneyint
lastSelectTicketint
lastSelectCourseint
lastCountCourseint
firstGameIdstring
firstRomVersionstring
firstDataVersionstring
firstPlayDatestring
compatibleCmVersionstring
dailyBonusDatestring
dailyCourseBonusDatestring
lastPairLoginDatestring
lastTrialPlayDatestring
playVsCountint
playSyncCountint
winCountint
helpCountint
comboCountint
totalDeluxscorelong
totalBasicDeluxscorelong
totalAdvancedDeluxscorelong
totalExpertDeluxscorelong
totalMasterDeluxscorelong
totalReMasterDeluxscorelong
totalSyncint
totalBasicSyncint
totalAdvancedSyncint
totalExpertSyncint
totalMasterSyncint
totalReMasterSyncint
totalAchievementlong
totalBasicAchievementlong
totalAdvancedAchievementlong
totalExpertAchievementlong
totalMasterAchievementlong
totalReMasterAchievementlong
playerOldRatinglong
playerNewRatinglong
banStateint
friendRegistSkipint
dateTimelong
{
  "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# 类型
selectMusicIdint
selectDifficultyIdint
categoryIndexint
musicIndexint
extraFlagint
selectScoreTypeint
extendContentBitulong
isPhotoAgreebool
isGotoCodeReadbool
selectResultDetailsbool
selectResultScoreViewTypeint
sortCategorySettingSortTabID
sortMusicSettingSortMusicID
playStatusSettingPlaystatusTabID
selectedCardListint[]
encountMapNpcListMapEncountNpc[]
{
  "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# 类型
itemKindint
itemIdListint[]
{
  "itemKind": 5,
  "itemIdList": [
    0
  ]
}

UserFavoriteItem

字段C# 类型
orderIdulong
idulong
{
  "orderId": 0,
  "id": 0
}

UserFriendBonus

字段C# 类型
returnCodeint
getMilesulong
{
  "returnCode": 1,
  "getMiles": 0
}

UserFriendSeasonRanking

字段C# 类型
seasonIdint
pointint
rankint
rewardGetbool
userNamestring
recordDatestring
{
  "seasonId": 0,
  "point": 0,
  "rank": 0,
  "rewardGet": false,
  "userName": "玩家昵称",
  "recordDate": ""
}

UserGamePlaylog

字段C# 类型
playlogIdulong
versionstring
playDatestring
playModeint
useTicketIdint
playCreditint
playTrackint
clientIdstring
isPlayTutorialbool
isEventModebool
isNewFreebool
playCountint
playSpecialint
playOtherUserIdulong
{
  "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# 类型
userIdulong
userChargelogUserGamePlaylog
{
  "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# 类型
getKindint
pointlong
{
  "getKind": 0,
  "point": 0
}

UserGhost

字段C# 类型
namestring
iconIdint
plateIdint
titleIdint
rateint
udemaeRateint
courseRankuint
classRankuint
classValueint
playDatetimestring
shopIduint
regionCodeint
typeIdMusicDifficultyID
musicIdint
difficultyint
versionint
resultBitListbyte[]
resultNumint
achievementint
{
  "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# 类型
partnerIdint
intimateLevelint
intimateCountRewardedint
{
  "partnerId": 0,
  "intimateLevel": 0,
  "intimateCountRewarded": 0
}

UserItem

字段C# 类型
itemKindint
itemIdint
stockint
isValidbool
{
  "itemKind": 5,
  "itemId": 5011820,
  "stock": 0,
  "isValid": false
}

UserKaleidxScope

字段C# 类型
gateIdint
isGateFoundbool
isKeyFoundbool
isClearbool
totalRestLifeint
totalAchievementint
totalDeluxscoreint
bestAchievementint
bestDeluxscoreint
bestAchievementDatestring
bestDeluxscoreDatestring
playCountint
clearDatestring
lastPlayDatestring
isInfoWatchedbool
{
  "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# 类型
bonusIdint
pointuint
isCurrentbool
isCompletebool
{
  "bonusId": 0,
  "point": 0,
  "isCurrent": false,
  "isComplete": false
}

UserMap

字段C# 类型
mapIdint
distanceuint
isLockbool
isClearbool
isCompletebool
unlockFlagint
{
  "mapId": 1,
  "distance": 12345,
  "isLock": false,
  "isClear": false,
  "isComplete": false,
  "unlockFlag": 0
}

UserMissionData

字段C# 类型
typeint
difficultyint
targetGenreIdint
targetGenreTableIdint
conditionGenreIdint
conditionGenreTableIdint
clearFlagbool
{
  "type": 0,
  "difficulty": 0,
  "targetGenreId": 0,
  "targetGenreTableId": 0,
  "conditionGenreId": 0,
  "conditionGenreTableId": 0,
  "clearFlag": false
}

UserMissionResponseData

字段C# 类型
userWeeklyDataUserWeeklyData
userMissionDataListUserMissionData[]
{
  "userWeeklyData": {
    "lastLoginWeek": "",
    "beforeLoginWeek": "",
    "friendBonusFlag": false
  },
  "userMissionDataList": [
    {
      "type": 0,
      "difficulty": 0,
      "targetGenreId": 0,
      "targetGenreTableId": 0,
      "conditionGenreId": 0,
      "conditionGenreTableId": 0,
      "clearFlag": false
    }
  ]
}

UserMusic

字段C# 类型
userMusicDetailListUserMusicDetail[]
{
  "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# 类型
musicIdint
levelMusicDifficultyID
playCountuint
achievementuint
comboStatusPlayComboflagID
syncStatusPlaySyncflagID
deluxscoreMaxuint
scoreRankMusicClearrankID
extNum1uint
{
  "musicId": 11820,
  "level": "/*MusicDifficultyID*/ 0",
  "playCount": 0,
  "achievement": 0,
  "comboStatus": "/*PlayComboflagID*/ 0",
  "syncStatus": "/*PlaySyncflagID*/ 0",
  "deluxscoreMax": 0,
  "scoreRank": "/*MusicClearrankID*/ 0",
  "extNum1": 0
}

UserOption

字段C# 类型
optionKindOptionKindID
noteSpeedOptionNotespeedID
slideSpeedOptionSlidespeedID
touchSpeedOptionTouchspeedID
tapDesignOptionGametapID
holdDesignOptionGameholdID
slideDesignOptionGameslideID
starTypeOptionStartypeID
outlineDesignOptionGameoutlineID
noteSizeOptionNotesizeID
slideSizeOptionSlidesizeID
touchSizeOptionTouchsizeID
starRotateOptionStarrotateID
dispCenterOptionCenterdisplayID
outFrameTypeOptionOutframedisplayID
dispChainOptionDispchainID
dispRateOptionDisprateID
dispBarOptionDispbarlineID
touchEffectOptionToucheffectID
submonitorAnimationOptionSubmonitorID
submonitorAchiveOptionSubmonAchiveID
submonitorAppealOptionAppealID
matchingOptionMatchingID
trackSkipOptionTrackskipID
brightnessOptionMoviebrightnessID
mirrorModeOptionMirrorID
dispJudgeOptionDispjudgeID
dispJudgePosOptionDispjudgeposID
dispJudgeTouchPosOptionDispjudgetouchposID
adjustTimingOptionJudgetimingID
judgeTimingOptionJudgetimingID
ansVolumeOptionVolumeAnswerSoundID
tapHoldVolumeOptionVolumeID
criticalSeOptionCriticalID
tapSeOptionTapSuccessSeID
breakSeOptionBreakseID
breakVolumeOptionVolumeID
exSeOptionExseID
exVolumeOptionVolumeID
slideSeOptionSlideseID
slideVolumeOptionVolumeID
breakSlideVolumeOptionVolumeID
touchVolumeOptionVolumeID
touchHoldVolumeOptionVolumeID
damageSeVolumeOptionVolumeID
headPhoneVolumeOptionHeadphonevolumeID
sortTabSortTabID
sortMusicSortMusicID
{
  "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# 类型
orderIdint
userIdulong
divNumberint
divLengthint
divDatastring
placeIdint
clientIdstring
uploadDatestring
playlogIdulong
trackNoint
{
  "orderId": 0,
  "userId": 100000000000000001,
  "divNumber": 0,
  "divLength": 0,
  "divData": "",
  "placeId": 0,
  "clientId": "",
  "uploadDate": "",
  "playlogId": 1,
  "trackNo": 0
}

UserPlaylog

字段C# 类型
userIdulong
orderIdint
playlogIdulong
versionint
placeIdint
placeNamestring
loginDatelong
playDatestring
userPlayDatestring
typeint
musicIdint
levelint
trackNoint
vsModeint
vsUserNamestring
vsStatusint
vsUserRatingint
vsUserAchievementint
vsUserGradeRankint
vsRankint
playerNumint
playedUserId1ulong
playedUserName1string
playedMusicLevel1int
playedUserId2ulong
playedUserName2string
playedMusicLevel2int
playedUserId3ulong
playedUserName3string
playedMusicLevel3int
characterId1int
characterLevel1int
characterAwakening1int
characterId2int
characterLevel2int
characterAwakening2int
characterId3int
characterLevel3int
characterAwakening3int
characterId4int
characterLevel4int
characterAwakening4int
characterId5int
characterLevel5int
characterAwakening5int
achievementint
deluxscoreint
scoreRankint
maxComboint
totalComboint
maxSyncint
totalSyncint
tapCriticalPerfectint
tapPerfectint
tapGreatint
tapGoodint
tapMissint
holdCriticalPerfectint
holdPerfectint
holdGreatint
holdGoodint
holdMissint
slideCriticalPerfectint
slidePerfectint
slideGreatint
slideGoodint
slideMissint
touchCriticalPerfectint
touchPerfectint
touchGreatint
touchGoodint
touchMissint
breakCriticalPerfectint
breakPerfectint
breakGreatint
breakGoodint
breakMissint
isTapbool
isHoldbool
isSlidebool
isTouchbool
isBreakbool
isCriticalDispbool
isFastLateDispbool
fastCountint
lateCountint
isAchieveNewRecordbool
isDeluxscoreNewRecordbool
comboStatusint
syncStatusint
isClearbool
beforeRatingint
afterRatingint
beforeGradeint
afterGradeint
afterGradeRankint
beforeDeluxRatingint
afterDeluxRatingint
isPlayTutorialbool
isEventModebool
isFreedomModebool
playModeint
isNewFreebool
trialPlayAchievementint
extNum1int
extNum2int
extNum4int
extBool1bool
extBool2bool
extBool3bool
{
  "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# 类型
userIdulong
divNumberint
divLengthint
divDatastring
placeIdint
clientIdstring
uploadDatestring
fileNamestring
{
  "userId": 100000000000000001,
  "divNumber": 0,
  "divLength": 0,
  "divData": "",
  "placeId": 0,
  "clientId": "",
  "uploadDate": "",
  "fileName": ""
}

UserRate

字段C# 类型
musicIdint
levelint
romVersionuint
achievementuint
{
  "musicId": 11820,
  "level": 3,
  "romVersion": 0,
  "achievement": 0
}

UserRating

字段C# 类型
ratingint
ratingListUserRate[]
newRatingListUserRate[]
nextRatingListUserRate[]
nextNewRatingListUserRate[]
udemaeUserUdemae
{
  "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# 类型
musicIdint
levelint
averageAchievementint
{
  "musicId": 11820,
  "level": 3,
  "averageAchievement": 0
}

UserRegion

字段C# 类型
regionIdint
playCountint
createdstring
{
  "regionId": 0,
  "playCount": 0,
  "created": ""
}

UserRivalData

字段C# 类型
rivalIdulong
rivalNamestring
{
  "rivalId": 0,
  "rivalName": ""
}

UserRivalMusic

字段C# 类型
musicIdint
userRivalMusicDetailListUserRivalMusicDetail[]
{
  "musicId": 11820,
  "userRivalMusicDetailList": [
    {
      "level": 3,
      "achievement": 0,
      "deluxscoreMax": 0
    }
  ]
}

UserRivalMusicDetail

字段C# 类型
levelint
achievementint
deluxscoreMaxint
{
  "level": 3,
  "achievement": 0,
  "deluxscoreMax": 0
}

UserRivalMusicLevel

字段C# 类型
levelint
{
  "level": 3
}

UserScoreRanking

字段C# 类型
tournamentIdint
totalScorelong
rankingint
rankingDatestring
{
  "tournamentId": 0,
  "totalScore": 0,
  "ranking": 0,
  "rankingDate": ""
}

UserShopStock

字段C# 类型
shopItemIdint
tradeCountint
{
  "shopItemId": 0,
  "tradeCount": 0
}

UserTradeItem

字段C# 类型
shopItemIdlong
pointlong
tradeCountint
{
  "shopItemId": 0,
  "point": 0,
  "tradeCount": 0
}

UserUdemae

字段C# 类型
rateint
maxRateint
classValueint
maxClassValueint
totalWinNumuint
totalLoseNumuint
maxWinNumuint
maxLoseNumuint
winNumuint
loseNumuint
npcTotalWinNumuint
npcTotalLoseNumuint
npcMaxWinNumuint
npcMaxLoseNumuint
npcWinNumuint
npcLoseNumuint
{
  "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# 类型
lastLoginWeekstring
beforeLoginWeekstring
friendBonusFlagbool
{
  "lastLoginWeek": "",
  "beforeLoginWeek": "",
  "friendBonusFlag": false
}

附录 B:枚举参考

B.1 解锁相关核心枚举(游戏侧,Manager.MaiStudio / UserData)

MusicLockType(Music.xml 的 lockType / subLockType;礼物 ItemKind 的对应关系见上表)

枚举名含义普通选曲
0Unlock开放曲直接可玩
1Lock常规解禁曲(地图/活动/门票)需 Base 解锁列表有该曲
2Challenge完美挑战曲随活动开放,无需解锁
3Transmission传导曲游玩一次后写入 Base 列表
4KaleidScope万花筒模式曲模式内通关后写入 Base 列表
  • subLockType:0 = 白谱启用(受 subEventName 活动控制);非 0 = 白谱槽位禁用(并非“锁定待解锁”)。
  • 紫/白谱可玩性:曲目 ID < 10000(FiNALE 移植老曲)硬编码永远开放;ID ≥ 10000 查账号 MusicUnlockMasterList / MusicUnlockReMasterList(即 ItemKind 6/7 的物品),客户端只读不写, 由服务器在达成条件后下发。

MapTreasureType(舞里程宝藏类型)

枚举名含义
1Character收藏角色
2MusicNew解锁乐曲(写入 Base 列表)
3LevelUpAll全员升级
4Otomodachi伙伴
5NamePlate名牌
6Frame相框
7MapTaskMusic地图任务曲(解锁乐曲)
8Challenge完美挑战
9Title称号
10Icon头像
11Present礼物(亲密道具)
12Gate万花筒之门
13Key万花筒钥匙

MapTreasureFlag(地图里程碑标记): None / DispCharacter(显示角色)/ ReleaseFlag(解禁)/ End(终点)

UserData.MusicUnlock(账号四个解锁列表): Base(整曲)/ Master(紫谱)/ ReMaster(白谱)/ Strong(Utage 谱)

B.1.7 常用游戏侧枚举补充

MusicDifficultyID(谱面难度索引,Music.xml notesData 的下标)

枚举名难度
0Basic绿谱
1Advanced黄谱
2Expert红谱
3Master紫谱
4ReMaster白谱
5Strong宴/特殊谱位(Utage 曲唯一启用的谱位,受 StrongList 管辖)

PlayComboflagID(连击状态,决定舞里程连击加成)

枚举名含义里程加成
0None
1SilverFullCombo+2000
2GoldFullCombo++2000
3AllPerfectAll Perfect+3000
4AllPerfectPlusAll Perfect++3000

PlaySyncflagID(二人同步状态,决定舞里程同步加成)

枚举名含义里程加成
0None
1ChainLowSync
2ChainHiSync+
3SyncLowFull Sync+4000
4SyncHiFull Sync++4000
5SyncPlaySync Play多人加成 +1000

GetPresentType(礼物领取过滤,GetPresentProcess)

枚举名含义
0None不领取
1Ticket只领门票
2Music只领乐曲
3ALL全部领取

B.1.5 稀有宝藏类型全量清单(Gate / Key / Present)

自动扫描 1.55 全部资源包:Gate(万花筒之门)7 处、Present(亲密道具)3 处、Key(万花筒钥匙)0 处。

宝藏ID名称类型关联所在地图地图ID里程点 Distance里程碑标记来源包
450501プレゼントPresent亲密道具 ×1BUDDiES区域2450005500000NoneA000
500199蓝色之门Gate万花筒之门 GateId=1天空街区域6500001800000EndA000
500299白色之门Gate万花筒之门 GateId=2天界区域85000021100000EndA000
500399紫色之门Gate万花筒之门 GateId=3BLACK ROSE区域10500003800000EndA000
500499黑色之门Gate万花筒之门 GateId=4大都会区域95000041400000EndA000
500501プレゼントPresent亲密道具 ×1棱镜区域500005500000NoneA000
550199黃色之门Gate万花筒之门 GateId=5七彩区域550001900000EndA000
550299红色之门Gate万花筒之门 GateId=6龙之区域45500021200000EndA015
550399棱镜塔Gate万花筒之门 GateId=77sRef区域45500032000000EndA031
550401プレゼントPresent亲密道具 ×1棱镜区域2550004500000NoneA000

注:当前版本数据中没有通过舞里程宝藏发放的 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蓝色钥匙蓝色之门1251224\_03\_2:青のカレイドスコープ解禁Ver1.50.00A00015000001
2白色钥匙白色之门2260210\_03\_2:白のカレイドスコープ解禁Ver1.50.00A00015000002
3紫色钥匙紫色之门3260325\_03\_2:紫のカレイドスコープ解禁Ver1.50.00A00015000003
4黑色钥匙黑色之门4260428\_03\_2:黒のカレイドスコープ解禁Ver1.50.00A00015000004
5黃色钥匙黃色之门5260610\_03\_2:黄のカレイドスコープ解禁Ver1.55.00A00015000005
6红色钥匙红色之门6260805\_03\_2:赤のカレイドスコープ解禁Ver1.55.00A01515000006
7万能钥匙棱镜塔7261001\_03\_2:虹のカレイドスコープ解禁Ver1.55.00A03115000007
8なしKALEIDXSCOPE8261001\_03\_3:カレイドスコープ解禁(イベント1)Ver1.55.00A03115000008
9希望钥匙希望之门9261001\_03\_4:希望の扉解禁Ver1.55.00A03115000009
10KALEIDXSCOPEの鍵KALEIDXSCOPE10261001\_03\_5:カレイドスコープ解禁(イベント2)Ver1.55.00A03115000010
钥匙与门一一对应(KaleidxScopeKeyData.gateName);服务器写入时按 gateId 找到该玩家的 UserKaleidxScope 记录并置 isKeyFound = true 即视为获得钥匙。

B.2 Net.VO.Mai2 全部枚举(自动提取)

ActivityKind

成员说明
1Play
2Music

ApiKind

成员说明
0GetUserDataApi
1GetUserCharacterApi
2GetUserItemApi
3GetUserFavoriteApi
4GetUserGhostApi
5GetUserMapApi
6GetUserLoginBonusApi
7GetUserRegionApi
8GetUserRecommendRateMusicApi
9GetUserRecommendSelectMusicApi
10GetUserOptionApi
11GetUserExtendApi
12GetUserRatingApi
13GetUserMusicApi
14GetUserPortraitApi
15GetUserActivityApi
16GetUserFavoriteItemApi
17GetUserRivalDataApi
18GetUserRivalMusicApi
19GetUserMissionDataApi
20GetUserFriendBonusApi
21GetUserIntimateApi
22GetUserShopStockApi
23GetUserKaleidxScopeApi
24UploadUserPlaylogListApi
25UpsertUserAllApi
26ENUM_MAX

FavoriteItemKind

成员说明
1FavoriteMusic
2RivalScore

ItemKind

成员说明
1Plate名牌 Plate
2Title称号 Title
3Icon头像 Icon
4Present礼物(占位)
5Music整曲解锁 Music → Base列表
6MusicMasMaster紫谱解锁 MusicMas
7MusicRemRe:Master白谱解锁 MusicRem
8MusicSrgStrong谱解锁 MusicSrg
9Character角色 Character
10Partner搭档 Partner
11Frame相框 Frame
12Ticket门票 Ticket
13Mile里程 Mile
14IntimateItem亲密道具 IntimateItem
15KaleidxScopeKey万花筒钥匙 KaleidxScopeKey

LogoutType

成员说明
0None
1Logout
2Cancel
3Error
4TestIn
5Quit
最后修改:2026 年 09 月 19 日
如果觉得我的文章对你有用,请随意赞赏