# 游戏插件兼容开发指南 TurboSu 通过插件系统支持任意赛车游戏的遥测数据接入。每个插件是 `games/builtin/` 或 `games/user/` 下的独立文件夹。 ## 文件夹结构 ``` games/user/my_game/ ├── manifest.json # 元信息 └── parser.py # 解析逻辑 ``` ## manifest.json 格式 ```json { "id": "my_game", "name": "我的游戏", "parser_type": "forza", "protocol": "udp", "mode": "server", "description": "自定义游戏遥测", "author": "你的名字", "version": "1.0.0", "default_port": 20777 } ``` | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | `id` | string | 是 | 唯一标识,= 文件夹名 | | `name` | string | 是 | 显示名称 | | `parser_type` | string | 是 | 解析器类型标签 | | `protocol` | string | 否 | 传输协议: `udp`(默认) / `tcp` | | `mode` | string | 否 | TCP模式: `server`(框架监听) / `client`(插件自连) | | `description` | string | 否 | 描述文字 | | `author` | string | 否 | 作者 | | `version` | string | 否 | 版本号 | | `default_port` | int | 否 | 默认端口 (UDP默认20777, TCP默认20778) | ## parser.py 规范 必须导出 `get_parser()` 函数,返回的对象必须实现以下接口: ```python class MyParser: def game_id(self) -> str: """返回与 manifest.json 一致的 game id""" return "my_game" def parse(self, data: bytes, addr: tuple) -> TelemetryData: """ 解析 UDP 数据包 data: 原始字节数据 addr: (host, port) 发送方地址 返回: server.telemetry.data.TelemetryData """ ``` ### 完整示例 ```python import struct import time from server.telemetry.data import TelemetryData def get_parser(): return MyGameParser() class MyGameParser: def game_id(self) -> str: return "my_game" def parse(self, data: bytes, addr: tuple) -> TelemetryData: td = TelemetryData( game_id="my_game", timestamp=time.time(), ) td.raw = { "raw_hex": data.hex(), "length": len(data), "addr": f"{addr[0]}:{addr[1]}", } # 解析你的游戏数据协议 # 示例: 简单的二进制格式 try: td.speed_kmh = struct.unpack_from("