2024-03-17 01:13:45 +08:00
2024-03-17 01:13:45 +08:00
2024-03-17 01:13:45 +08:00
2024-03-17 01:13:45 +08:00
2022-10-24 02:43:46 +08:00
2024-03-17 01:13:45 +08:00
2022-10-24 02:43:46 +08:00
2022-10-24 02:43:46 +08:00
2023-02-22 07:37:33 +08:00

HamsterBall

仓鼠球:一个基于 Redis 的 Minecraft 服务端通用消息中间件原HamsterService

该插件依赖于 仓鼠核心

手动构建

  1. 将源代码下载或克隆至本地
  2. 在源代码根目录中打开命令行窗口
  3. 命令行窗口中执行./gradlew clean build
  4. 构建成品在 build 文件夹

也可访问我的Jenkins网站获取最新版

安装步骤

  1. 关闭服务器
  2. 安装前置插件 HamsterCore
  3. 将 HamsterBall 放入 plugins 文件夹
  4. 启动服务器并生成默认配置文件
  5. 修改配置文件以符合预期
  6. 重启服务器
  7. 完成

环境变量

为了适配 docker 环境,本插件除了从 config.yml 中配置服务器信息以外,还支持从环境变量中读取

环境变量 描述 对应 config 值
BALL_LOCAL_SERVER_IP 本服务器 IP server-info.host
BALL_LOCAL_SERVER_PORT 本服务器端口 server-info.port
BALL_LOCAL_SERVER_INFO_ID 本服务器唯一识别码,最长 32 字符 server-info.id
BALL_LOCAL_SERVER_INFO_NAME 本服务端名称,用于展示给玩家看 server-info.name

开发

添加依赖

Gradle
// 添加仓库
repositories {
    maven {
        url = uri("https://maven.airgame.net/maven-public/")
    }
}

dependencies {
    // 对于 Bukkit 插件
    compileOnly("cn.hamster3.mc.plugin:ball-bukkit:1.5.7")
    // 对于 BungeeCord 插件
    compileOnly("cn.hamster3.mc.plugin:ball-bungee:1.5.7")
}
Maven

<project>
    <!--添加仓库-->
    <repositories>
        <repository>
            <id>airgame-repo</id>
            <name>AirGame Maven仓库</name>
            <url>https://maven.airgame.net/maven-public</url>
        </repository>
    </repositories>

    <dependencies>
        <!--对于 Bukkit 插件-->
        <dependency>
            <groupId>cn.hamster3.mc.plugin</groupId>
            <artifactId>ball-bukkit</artifactId>
            <version>1.5.7</version>
        </dependency>
        <!--对于 BungeeCord 插件-->
        <dependency>
            <groupId>cn.hamster3.mc.plugin</groupId>
            <artifactId>ball-bungee</artifactId>
            <version>1.5.7</version>
        </dependency>
    </dependencies>
</project>

使用 API

所有 API 相关的方法都位于 cn.hamster3.mc.plugin.ball.common.api.BallAPI 类中
使用方法为:BallAPI.getInstance().xxx

收发消息

若想要消息能够在不同的服务器之间互相正常收发,你必须按照以下步骤来做:

  1. 使用 BallAPI.getInstance().subscribe() 订阅一个消息频道(频道名称通常是你的插件名)
  2. 使用 BallAPI.getInstance().getEventBus().register() 注册一个消息监听器
  3. 在消息监听器中对业务代码使用 @com.google.common.eventbus.Subscribe 注解

所有事件都位于 cn.hamster3.mc.plugin.ball.common.event 包中

示例

在下面这个例子中我将实现一个功能:跨服聊天
插件名称为:GlobalChat

第一步:监听 Bukkit 的聊天事件省略通过BukkitAPI注册该监听器的代码
import cn.hamster3.mc.plugin.ball.common.api.BallAPI;
import com.google.gson.JsonObject;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;

public class ChatListener implements Listener {
    @EventHandler(ignoreCancelled = true)
    public void onAsyncPlayerChat(AsyncPlayerChatEvent event) {
        Player player = event.getPlayer();
        String message = event.getMessage();
        JsonObject object = new JsonObject();
        object.addProperty("name", player.getName());
        object.addProperty("world", player.getWorld().getName());
        object.addProperty("message", message);
        BallAPI.getInstance().sendBallMessage("Chat", "playerChat", object);
        event.setCancelled(true);
    }
}
第二步:监听 MessageReceivedEvent 事件完成业务代码
import cn.hamster3.mc.plugin.ball.common.data.BallMessage;
import cn.hamster3.mc.plugin.ball.common.event.message.MessageReceivedEvent;
import com.google.common.eventbus.Subscribe;
import com.google.gson.JsonObject;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;

public class BallListener {
    @Subscribe
    public void onMessageReceived(MessageReceivedEvent event) {
        if (!"GlobalChat".equals(event.getChannel())) {
            return;
        }
        String action = event.getAction();
        switch (action) {
            case "onPlayerChat": {
                JsonObject object = event.getContentAsJsonObject();
                String name = object.get("name").getAsString();
                String message = object.get("message").getAsString();
                String world = object.get("world").getAsString();
                String format = String.format("[%s][%s]: %s", world, name, message);
                for (Player player : Bukkit.getOnlinePlayers()) {
                    player.sendMessage(format);
                }
                break;
            }
            case "othersAction": {
                // 处理其他业务代码
                break;
            }
        }
    }
}
第三步:在插件启动时注册上述两个监听器,并订阅 `GlobalChat` 频道
import cn.hamster3.mc.plugin.ball.common.api.BallAPI;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;

public class GlobalChatPlugin extends JavaPlugin {
    @Override
    public void onEnable() {
        // 注册 ChatListener 事件监听器
        Bukkit.getPluginManager().registerEvents(new ChatListener(), this);
        // 注册 BallListener 事件监听器
        BallAPI.getInstance().getEventBus().register(new BallListener());
        // 订阅 GlobalChat 频道
        // 只有在需要收到消息的子服中才需要订阅频道
        // 如果一个子服只负责发送消息而不负责处理消息,则可以不用订阅频道
        BallAPI.getInstance().subscribe("GlobalChat");
    }
}
Description
仓鼠球:一个基于 Redis 的 Minecraft 服务端通用消息中间件
https://www.hamster3.cn/docs/minecraft-plugins/free-plugins/HamsterBall
Readme GPL-3.0 786 KiB
1.8.1 Latest
2025-07-10 20:47:03 +08:00
Languages
Java 100%