# PlayDrop 游戏服务器：Colyseus、MongoDB 和服务器 SDK

PlayDrop 游戏的可选托管多人功能：上传使用 MongoDB 存储的 Colyseus server.js，用测试玩家进行测试，并可使用可选的服务器 SDK 实现好友和 AI 功能。

Source: https://www.playdrop.ai/zh-hans/docs/server-sdk

游戏服务器是可选的。你的游戏可以调用你自己运行的任何服务器。如果你愿意，PlayDrop 也可以为你的游戏托管一个带 MongoDB 数据库的标准 Colyseus 服务器：通过 [PlayDrop Connector](https://www.playdrop.ai/zh-hans/docs/connectors) 将它作为 `server.js` 与 `index.html` 放在一起上传，或让 [PlayDrop Cloud](https://www.playdrop.ai/zh-hans/create) 为你构建。`@playdrop/server` 包同样是可选的。

## 编写标准 Colyseus 服务器

从 `server.js` 导出 `rooms` 映射，并在 [catalogue.json](https://www.playdrop.ai/zh-hans/docs/catalogue-json) 中以 `"server": { "rooms": ["game"] }` 列出房间名称。服务器由 PlayDrop 运行，请不要自行启动。在房间生命周期内，通过 `PLAYDROP_MONGO_URL` 使用标准 MongoDB 驱动存储数据。

```js
import { Room, defineRoom } from "colyseus";
import { MongoClient } from "mongodb";

class GameRoom extends Room {
  async onCreate() {
    this.mongo = new MongoClient(process.env.PLAYDROP_MONGO_URL);
    await this.mongo.connect();
  }
  onJoin(client) {
    // client.auth is the verified PlayDrop player, for example client.auth.userId.
  }
  async onDispose() { await this.mongo?.close(); }
}

export const rooms = { game: defineRoom(GameRoom) };
```

## 托管服务器规则

- Colyseus 0.17（`colyseus` 0.17.10、`@colyseus/schema` 4.0.30）、MongoDB 驱动 7.5 和 Node 22。
- 一个自包含的 ES 模块，最大 2 MiB。只能导入 `colyseus`、`@colyseus/core`、`@colyseus/schema`、`mongodb` 和 `@playdrop/server`；其他代码请打包进该文件。
- 最多 2 种房间类型，每个房间 8 名玩家、每个房间 4 小时、每位玩家每秒 30 条消息、每条消息 512 KiB。
- 服务器无法访问互联网：只能访问 MongoDB 和 PlayDrop 服务。
- 玩家必须登录。PlayDrop 会在每位玩家加入时进行验证；不要实现 `onAuth`。
- 每个游戏一个 MongoDB 数据库，跨版本保留，并计入你的存储配额。切勿将其凭据发送到浏览器。

## 连接浏览器并测试

在浏览器中，[客户端 SDK](https://www.playdrop.ai/zh-hans/docs/sdk) 的 `sdk.multiplayer.getConnection()` 会返回服务器地址和玩家的令牌；请使用 Colyseus 客户端（`@colyseus/sdk` 0.17）加入。开发期间，请在本地运行 Colyseus 0.17 和 MongoDB 8，并直接连接本地服务器。要测试托管服务器，请上传一个私人版本，然后打开 `https://www.playdrop.ai/create/games/<slug>/test?v=<version>&player=1`，并在第二个窗口中打开改为 `player=2` 的同一链接：每个窗口都会以不同的测试账户游玩。运行正常后，在游戏页面将该版本设为公开。

## 可选的服务器 SDK：好友和 AI

`@playdrop/server` 提供 `playdrop.social`（正在玩这个游戏的好友，以及 PlayDrop Chat 中的游戏卡片）和 `playdrop.ai`（由创作者付费的文本、图像、3D、视频、音效、语音和音乐生成）。这些调用仅适用于已上传的游戏，不适用于本地开发。请在服务器上使用 `playdrop.ai.tasks.downloadFile` 下载私有生成媒体，并仅将字节数据发送给目标玩家；语音请求最多接受 40 个单词。
