- 版权类型
- 原创
- 插件中文名称
- 我的世界与腾讯企鹅机器人通信桥
- 插件英文名称
- MC-BngeuitBridge
- 原帖地址
- #
- 支持的核心(服务端)
- Spigot
- Paper
- Purpur
- 语言支持
- 中文(简体)
- 前置组件
- CraneCore (可选)
- 适配版本(Java)
- 26.x
- 1.21
- 1.20
- 1.19
- 1.18
- 1.17
- 1.16
- 1.15
- 1.14
- 1.13
- 1.12
提示
仅支持QQ官方机器人,需要通过 QQ开放平台 创建机器人这是什么
Bngeuit QQ 机器人 ↔ Minecraft 服务器的双向通信桥两个插件配合使用,通过 WebSocket 在 Bngeuit QQ 机器人和 Minecraft 服务器之间建立双向消息通道。
插件 | 运行环境 | 角色 |
|---|---|---|
BngeuitBridge | Bngeuit(Java) | WebSocket 服务端,接受多个客户端连接 |
MC-BngeuitBridge | Bukkit(Kotlin + TabooLib) | WebSocket 客户端,连接到 BngeuitBridge |
不绑定任何具体业务,只提供通道。你可以用它做任何事:QQ 群接收玩家上下线通知、QQ 指令操控服务器、查状态、远程执行命令……
点击查看什么是 Bngeuit
架构
代码:
MC服务器-1 (client-id:1) ──┐
MC服务器-2 (client-id:2) ──┤──→ BngeuitBridge (ws://ip:8765) ──→ QQ群
MC服务器-3 (client-id:3) ──┘
BngeuitBridge 是服务端,支持多个 MC 客户端同时连接
每个 MC 服务器用 client-id 区分
消息可以广播给所有客户端,也可以定向发给某个客户端
示例
emm...安装 CraneCore + MC-BngeuitBridge 时,可使用 CraneCore 提供的脚本系统,并在插件文件夹中生成示例文件。也可以在群文件中下载到 Bngeuit 侧的示例脚本。
Bngeuit 侧示例
JavaScript:
const plugin = {
name: 'BridgeEventListener',
version: '1.0.0',
description: '监听 MC-BngeuitBridge 消息:玩家加入/退出通知、状态查询',
author: 'bngeuit',
depend: ['BngeuitBridge'],
softdepend: [],
};
const BridgeMessageReceiveEvent = Packages.cn.org.bukkit.bngeuit.bridge.event.BridgeMessageReceiveEvent;
const BngeuitBridge = Packages.cn.org.bukkit.bngeuit.bridge.BngeuitBridge;
const GroupAtMessageEvent = Packages.cn.org.bukkit.bngeuit.event.receive.GroupAtMessageEvent;
// 在此填写要接收信息的group_openid
// 若不知道,可以在群内 @机器人 后在控制台查看 log 中 (群: xxxx) 字眼
const GROUP_ID = '';
function onLoad() {
// lifecycle start
}
function onEnable() {
bngeuit.info('[BngeuitBridge] 事件监听已启用');
bngeuit.on(BridgeMessageReceiveEvent, (event) => {
var type = String(event.getType());
var action = event.getAction() ? String(event.getAction()) : '';
if (type === 'bridge') {
handleBridgeStatus(event, action);
} else if (type === 'mc_event') {
handleMcEvent(event, action);
}
});
// 群聊 @ 事件,若不需要,可删除 37~42 行
bngeuit.on(GroupAtMessageEvent, (e) => {
const text = String(e.getContent()).trim();
bngeuit.info('GroupAtMessageEvent: ' + text + ' (群: ' + e.getGroupOpenid() + ')');
});
}
function handleBridgeStatus(event, action) {
if (action !== 'status') return;
var msg = event.getMessage();
var requestId = msg.getRequestId();
if (!requestId) {
bngeuit.warn('[BngeuitBridge] 收到 bridge/status 请求但 requestId 为 null,跳过回复');
return;
}
var instance = BngeuitBridge.getInstance();
var uptimeMs = java.lang.System.currentTimeMillis() - instance.getStartTime();
var uptimeSec = Math.floor(uptimeMs / 1000);
var status = new java.util.LinkedHashMap();
status.put('version', instance.getDescription().getVersion());
status.put('uptimeSeconds', uptimeSec);
status.put('connectedClients', instance.getChannel().getConnectedClients().size());
status.put('clientIds', instance.getChannel().getConnectedClients());
instance.getChannel().send(event.getClientId(), msg.reply(status));
bngeuit.info('[BngeuitBridge] 已回复状态查询: clientId=' + event.getClientId() + ', requestId=' + requestId + ', uptime=' + uptimeSec + 's');
}
function handleMcEvent(event, action) {
var data = event.getData();
if (!(data instanceof java.util.Map)) {
bngeuit.warn('[BngeuitBridge] mc_event 的 data 不是 Map: ' + data);
return;
}
var playerName = data.get('player') ? String(data.get('player')) : '未知玩家';
var uuid = data.get('uuid') ? String(data.get('uuid')) : '';
if (action === 'player_join') {
var msg = playerName + ' 加入了游戏';
bngeuit.info('[BngeuitBridge] 发送加入游戏信息: ' + msg + ' (uuid=' + uuid + ')');
Bngeuit.sendGroupText(GROUP_ID, msg);
} else if (action === 'player_quit') {
var msg = playerName + ' 离开了游戏';
bngeuit.info('[BngeuitBridge] 发送离开游戏信息: ' + msg + ' (uuid=' + uuid + ')');
Bngeuit.sendGroupText(GROUP_ID, msg);
} else {
bngeuit.info('[BngeuitBridge] 未知 mc_event action: ' + action);
}
}
function onDisable() {
bngeuit.info('BridgeEventListener unloaded');
}
MC侧
JavaScript:
const MCBngeuitBridge = Packages.cn.org.bukkit.bngeuit.bridge.MCBngeuitBridge.INSTANCE
function enable() {
ListenerUtils.registerListener("MCBngeuitBridge:加入信息", "org.bukkit.event.player.PlayerJoinEvent", "HIGHEST", false, function (event) {
let channel = MCBngeuitBridge.getChannel();
if (channel == null || !channel.isConnected()) return
let player = event.getPlayer();
let data = new java.util.HashMap()
data.put("player", player.getName())
channel.send("mc_event", "player_join", data)
})
ListenerUtils.registerListener("MCBngeuitBridge:离开信息", "org.bukkit.event.player.PlayerQuitEvent", "HIGHEST", false, function (event) {
let channel = MCBngeuitBridge.getChannel();
if (channel == null || !channel.isConnected()) return
let player = event.getPlayer();
let data = new java.util.HashMap()
data.put("player", player.getName())
channel.send("mc_event", "player_quit", data)
})
}
function disable() {
ListenerUtils.unregisterListener("MCBngeuitBridge:加入信息")
ListenerUtils.unregisterListener("MCBngeuitBridge:离开信息")
}
适用场景
QQ 群实时显示玩家上下线QQ 指令远程操控 MC 服务器(白名单、踢人、广播)
查询服务器在线人数、TPS、运行状态
跨多个 MC 服务器的消息中转
任何需要 QQ ↔ MC 双向通信的场景