一个让玩家创建聊天域并通过外部服务器进行消息转发的 Minecraft Fabric 客户端 Mod。
Minecraft 原版聊天依赖加入的 Minecraft 服务器,玩家脱离服务器后无法与朋友持续聊天。ChatLink 提供一个不依赖 Minecraft 服务器的聊天域系统,让玩家通过外部聊天服务器进行消息转发,但聊天体验仍在游戏内。
- Minecraft 1.21.11
- Fabric Loader 0.19.3+
- Fabric API 0.141.4+
- Java 21+
- 下载 最新版本 的
chatlink-*.jar - 放入 Minecraft 的
mods文件夹 - 启动游戏
| 按键 | 功能 |
|---|---|
| 右 Alt(默认) | 打开 GUI |
可在「选项 → 按键控制 → 按键绑定」中自定义。
所有指令以 /chatlink 开头:
| 指令 | 说明 |
|---|---|
connect <IP:Port> |
连接聊天服务器 |
disconnect |
断开连接 |
status |
查看连接状态、服务器地址、已加入的域 |
name <备注名> |
设置服务器备注名 |
domains |
列出公开域列表 |
create <名称> [public|private] [show|hide] |
创建聊天域 |
join <域ID> |
加入指定域 |
leave |
离开活跃域 |
delete <域ID> |
删除指定域(仅创建者) |
gui |
打开 GUI 界面 |
chat |
切换域聊天模式 |
switch <域ID> |
切换活跃域 |
msg <玩家名> <消息> |
发送私聊消息 |
role <域ID> <玩家名> <角色> |
设置域内角色(CREATOR/ADMIN/MEMBER) |
kick <域ID> <玩家名> |
踢出域内玩家 |
mute <域ID> <玩家名> [秒数] |
禁言玩家(默认 300 秒) |
unmute <域ID> <玩家名> |
解除禁言 |
desc set <域ID> <描述> |
设置域描述 |
desc show <域ID> |
查看域描述 |
使用 /chatlink chat 切换域聊天模式。开启后,所有在聊天栏发送的消息将发送到活跃域而非 Minecraft 服务器。
- 聊天域系统 — 创建公开/私密聊天域,通过分享域 ID 邀请其他玩家加入
- 多域同时在线 — 可同时加入多个域,自由切换活跃域,不同域消息互不干扰
- 私聊 — 向指定玩家发送私密消息,不经过任何域
- 域内角色 — 创建者/管理员/成员三级角色,支持禁言和踢人
- 域描述 — 为域设置描述信息,方便玩家了解域主题
- 消息历史 — 加入域时自动推送最近 20 条消息,快速了解上下文
- 未读提醒 — 非活跃域收到消息时显示未读计数,切换域时自动清零
- 外部服务器连接 — TCP 长连接 + JSON 协议,断线自动重连(最多 3 次,间隔 5 秒)
- 用户认证 — 使用 Minecraft UUID + 玩家名自动认证
- Discord 风格 GUI — 深色毛玻璃面板、三栏布局、流畅动画、圆角设计
- Windows 系统通知 — 托盘图标 + 系统通知气泡,非活跃域消息实时推送
- HUD 未读角标 — 游戏画面右上角显示未读消息计数,一目了然
- 玩家头像 — 动态生成首字母彩色头像,玩家角色彩色徽章
- 右键菜单 — 右键玩家名弹出操作菜单(私聊、@、禁言、踢出)
- 通知配置 — 面板位置、系统通知、消息音效均可自定义
- 国际化 — 支持中文(简体)和英文,根据游戏语言自动切换
- 音效通知 — 连接成功和创建域成功时播放提示音
src/main/java/com/xingdu/chatlink/
├── ChatLinkMod.java # Mod 主入口
├── mixin/
│ └── ChatHudMixin.java # 聊天 HUD Mixin
└── client/
├── ChatLinkClient.java # 客户端入口
├── chat/
│ ├── ChatMessageHandler.java # 域聊天模式切换
│ └── UnreadManager.java # 未读消息管理
├── command/
│ └── ModCommands.java # 指令系统(19 个子命令)
├── config/
│ └── ModConfig.java # 配置持久化(多域支持)
├── gui/
│ ├── ChatLinkScreen.java # 基类(毛玻璃、动画)
│ ├── ConnectScreen.java # 连接服务器界面
│ ├── MainScreen.java # 主界面(三栏 Discord 风格)
│ ├── DomainListScreen.java # 域列表界面
│ ├── CreateDomainScreen.java # 创建域界面
│ ├── SettingsScreen.java # 设置界面
│ ├── theme/
│ │ └── DiscordTheme.java # Discord 风格颜色常量
│ ├── panels/
│ │ ├── ServerListPanel.java # 左侧服务器栏
│ │ ├── DomainListPanel.java # 中间域列表栏
│ │ └── ChatPanel.java # 右侧聊天面板
│ └── widgets/
│ ├── PlayerAvatar.java # 玩家头像
│ └── ContextMenu.java # 右键菜单
├── keybind/
│ └── ModKeyBindings.java # 按键绑定(右 Alt)
├── network/
│ ├── ChatServerClient.java # TCP 网络客户端
│ ├── MessageProtocol.java # 消息协议构建
│ └── NetworkEventHandler.java # 网络事件处理
├── notification/
│ ├── NotificationManager.java # 统一通知分发
│ ├── TrayManager.java # Windows 托盘图标
│ └── WindowsNotification.java # 系统通知
├── mixin/
│ ├── ChatHudMixin.java # 聊天 HUD Mixin
│ └── InGameHudMixin.java # HUD 角标 Mixin
└── sound/
└── SoundManager.java # 音效管理
客户端与服务器通过 TCP 长连接通信,消息格式为 JSON(以 \n 分隔)。
{"type": "<类型>", "data": { ... }}| 类型 | 方向 | 说明 |
|---|---|---|
auth |
客户端→服务端 | 认证(UUID + 用户名) |
heartbeat |
双向 | 心跳(30s 间隔) |
list_domains |
客户端→服务端 | 查询公开域列表 |
create_domain |
客户端→服务端 | 创建域(自动加入) |
join_domain |
客户端→服务端 | 加入域 |
leave_domain |
客户端→服务端 | 离开域 |
chat_message |
双向 | 域内聊天消息广播 |
delete_domain |
客户端→服务端 | 删除域(仅创建者) |
player_joined |
服务端推送 | 玩家加入域通知 |
player_left |
服务端推送 | 玩家离开域通知 |
private_message |
双向 | 私聊消息 |
private_message_sent |
服务端推送 | 私聊发送确认 |
message_history |
服务端推送 | 消息历史 |
set_role |
客户端→服务端 | 设置角色 |
kick_player |
客户端→服务端 | 踢出玩家 |
mute_player |
客户端→服务端 | 禁言玩家 |
unmute_player |
客户端→服务端 | 解除禁言 |
set_description |
客户端→服务端 | 设置域描述 |
domain_description |
服务端推送 | 域描述变更通知 |
domain_joined_list |
服务端推送 | 已加入域列表 |
TCP 连接 → 认证 → 心跳循环(30s)→ 获取域列表/已加入域列表 → 正常通信
超时配置: 连接超时 5s,心跳超时 60s,断线自动重连 3 次(间隔 5s)
详细 JSON 格式见 docs/protocol-spec.md。
git clone https://github.com/AlsoLate/chatlink.git
cd chatlink
./gradlew build编译产物在 build/libs/chatlink-0.2.0+mc1.21.11.jar。
QQ 群:950162690
MIT License
星渡