役次元 Yokonex Hub 开发文档

#工作模式

平台是怎么运转的 —— 从一个游戏事件到设备动作,中间每一层在干什么。


#全链路

① 游戏进程                ② 本机                    ③ 云端                ④ 设备
┌────────────┐      ┌──────────────────┐      ┌──────────────┐      ┌─────────┐
│  游戏       │      │  GameHub 客户端   │      │ api.ycygame  │      │ 役次元App │
│    ↑        │      │                  │      │    .org      │      │    ↓     │
│  你的插件   │─────▶│  本机网关 43002   │      │              │      │  蓝牙设备 │
│            │ HTTP │   ├ 冷却/去重      │◀────▶│ 目录/下载/更新 │      │         │
│            │      │   ├ 事件路由      │      └──────────────┘      └─────────┘
│            │      │   ├ 波形选择      │                                  ▲
│            │      │   └ 设备分发      │──────────────────────────────────┘
└────────────┘      └──────────────────┘         腾讯 IM / 直连蓝牙

关键点:游戏事件不出本机。 插件把事件发到 127.0.0.1:43002, 客户端在本地决定该做什么。云端只负责插件目录、下载和版本更新, 从不接收也不转发你的游戏事件


#四个域名各干什么

域名 角色 有无登录态 谁在用
ycygame.org 门户 + 插件市场 + 波形广场 所有人,浏览器
docs.ycygame.org 这个文档站 开发者,浏览器
developer.ycygame.org 开发者中心:注册/上传/发版/审核 插件开发者
api.ycygame.org
api.ycygmae.app
客户端 API:目录/下载/更新 GameHub 客户端

为什么开发者中心要单独一个域名

它是全平台唯一持有登录 Cookie、唯一接受二进制上传的地方。 放在独立的源上之后,主站或客户端域出任何前端问题都碰不到开发者会话 —— Cookie 只作用于 developer.ycygame.org,不下发到 .ycygame.org 通配。

为什么 API 挂两个域名

api.ycygame.org 主、api.ycygmae.app 备。客户端内置两个地址, 主域名超时或返回异常时自动切换。国内网络环境下单域名被污染是常态, 这不是冗余强迫症。


#插件的生命周期

开发者本地                     平台                          玩家
─────────                    ──────                        ──────
写代码
  ↓
check-plugin  ──────────────▶ (同一份校验代码)
  ↓ 通过
publish-plugin ─────────────▶ 上传
                                ↓
                             安全校验(ZIP结构/炸弹/路径穿越/manifest)
                                ↓ 通过
                             所有权 + 版本 + 去重判定
                                ↓ 通过
                             落 R2 + 写库,状态 pending
                                ↓
                             人工审核 ─── 拒绝 ──▶ 开发者收到理由
                                ↓ 通过
                             指为最新版本 ──────────▶ 出现在市场和客户端
                                                        ↓
                                                     玩家一键安装
                                                        ↓
                                                     SHA-256 校验

审核是硬门禁:未审核的版本永远不会被指为插件的"最新版本", 所以它不会出现在市场列表、不会出现在客户端、不能被下载。

版本不可变:已发布的包永远不覆盖。要改就发新版本号,且必须严格大于所有历史版本。 这是 SHA-256 校验和客户端缓存能成立的前提。


#事件是怎么被处理的

插件发出一个事件后,客户端依次做这些判断:

步骤 判断 不通过会怎样
1 联动总开关开着吗 直接丢弃
2 这个 eventKey 用户启用了吗 直接丢弃
3 occurredAt 是不是超过 3 秒了 丢弃(不为旧事件动作)
4 客户端侧冷却过了吗 丢弃
5 映射到哪个 commandId 用用户配置的,不是插件写死的
6 这个指令绑了什么波形、什么强度 用用户配置的
7 发给哪些设备 按设备类型各自的量程

插件侧也必须做冷却和限流 —— 不能指望客户端兜底。 两层都做的理由是:客户端的配置是给用户调体验的,插件侧的闸门是保证 「就算用户把冷却调到 0,也不会因为一次尸潮把设备刷成常通」。


#采集游戏事件的几种模式

模式 适用 延迟 风险
官方 Mod API 7DTD、Minecraft、星露谷、RimWorld… 极低 无。首选
官方遥测接口 CS2 的 GSI、LOL Live Client、战争雷霆 8111、模拟飞行 SimConnect 无。首选
Mod 加载器 BepInEx / MelonLoader / Harmony(Unity 单机) 极低 单机无风险
日志监听 会写详细日志的游戏
画面识别 上面都没有时的最后手段 无封号风险,准确率一般
音频检测 有特征音效的场景
读内存 / 注入 —— —— 带反作弊必封号,审核不通过

带内核反作弊的游戏(Vanguard / BattlEye / ACE 等)只能用画面识别或音频检测。


#平台的三个不做

不做事件中转。 游戏事件只在本机流转,云端看不到你在玩什么、发生了什么。

不做客户端强制更新。 更新走 api.ycygame.org/v1/client/update, 客户端自己决定什么时候升。只有 minSupported 以下的版本才会被要求必须更新。

不做插件代码执行。 平台只校验包的结构与元数据,不运行包里的任何东西。 可执行文件由人工审核确认来源和用途。