# BuildContest 插件
BuildContest 是一个 Velocity 插件,它简化了为建筑比赛中的每个团队设置专用服务器的过程。该插件使用 Docker Compose 来启动子服务器,并自动将玩家转移到相应的子服务器进行比赛。团队配置和服务器信息持久存储。
## 特性
- **自动子服务器创建**: 使用 HTTP API 调用和 Docker Compose 创建团队服务器,并在 Velocity 中注册它们。
- **自动玩家转移**: 当玩家加入主服务器时,他们将自动转移到相应的子服务器。
- **权限控制**: 使用 Bearer Token 验证 HTTP 请求。
- **防止重复参与**: 在添加团队时,如果玩家已存在于另一个团队中,则他们无法加入其他团队。
## 安装步骤
1. **准备环境**
- 安装 [Velocity](https://velocitypowered.com/) 代理服务器。
- 确保 Docker 和 Docker Compose 已安装且配置正确。
2. **创建 Minecraft 比赛服务器镜像 (子服务器)**
- 建议使用 [Little Wrench](https://www.minebbs.com/resources/1-20-4.8372/) 作为服务器基础。
- 将端口设置为 `25565`,并确保其可以通过代理正确访问,包括适当的 `forwarding-mode` 设置。
- 创建一个 Dockerfile 来构建服务器镜像。
- 构建镜像,例如 `docker build -t minecraft-contest:latest .`
- 创建一个 `docker-compose.yml` 文件来启动子服务器。
3. **下载插件**
- 跳转到 [版本页面](https://github.com/Hanamizu2002/BuildContest/releases)
4. **配置插件**
- 将插件 jar 文件放在 Velocity 的 `plugins/` 目录下。
- 启动 Velocity 服务器一次以生成配置文件,然后停止服务器以调整设置。
5. **配置文件**
- 修改 `plugins/BuilderContest/` 目录下的 `config.yml` 文件来设置端口和其他设置。
- 将 `docker-compose-default.yml` 放在插件目录下作为启动子服务器的模板。
6. **启动服务器**
- 启动服务器,并从生成的 `config.yml` 文件中检索 `bearer-token`。
## 配置文件描述
**config.yml**
```yaml
ktor:
http-port: 8080 # HTTP 服务端口。
port-start: 30000 # 子服务器的起始端口。
bearer-token: # Bearer Token;首次使用时,留空此字段。
allow-host: "*" # 允许的主机地址。
```
**docker-compose-default.yml 示例**
- 使用 `#SERVER_NAME_PLACEHOLDER` 作为 Docker 容器名称的占位符。
- 使用 `#SERVER_PORT_PLACEHOLDER` 作为端口的占位符。
```yaml
version: '3.8'
services:
minecraft_server:
image: minecraft-contest:latest
container_name: "#SERVER_NAME_PLACEHOLDER"
ports:
- #SERVER_PORT_PLACEHOLDER:25565
volumes:
# 将本地世界目录挂载到容器中指定的路径
- ./worlds/#SERVER_NAME_PLACEHOLDER/world:/app/world
environment:
EULA: "TRUE"
restart: unless-stopped
```
## 使用说明
### HTTP API
- 插件启动后,将在端口 `8080` 上启动一个 HTTP 服务(默认)。
- 主要 API 端点:
- **添加团队**: `POST /team/add`,需要 Bearer Token 身份验证,`teamId`、`teamName` 和 `members` 作为有效负载字段。
### 示例请求
```bash
curl --location --request POST 'http://localhost:8080/team/add' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer sSCj4piDoEfV2zIo_C8lD7S4ul0YlVOyBr2BkKpdsTI (从 config.yml 中检索此值)' \
--data-raw '{
"teamId": "team_1",
"teamName": "Team 1",
"members": ["Hanamizu_", "user1"]
}'
```