All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.handyplus.lib.util.BcUtil Maven / Gradle / Ivy

The newest version!
package cn.handyplus.lib.util;

import cn.handyplus.lib.InitApi;
import cn.handyplus.lib.constants.BaseConstants;
import cn.handyplus.lib.core.JsonUtil;
import cn.handyplus.lib.core.MapUtil;
import cn.handyplus.lib.core.StrUtil;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import lombok.Getter;
import lombok.Setter;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;

import java.util.Map;
import java.util.Optional;

/**
 * BungeeCord 通用方法
 *
 * @author handy
 * @since 3.5.3
 */
public class BcUtil {

    private BcUtil() {
    }

    public final static String CONNECT = "Connect";
    public final static String FORWARD = "Forward";
    public final static String GET_SERVER = "GetServer";
    public final static String PLAYER_COUNT = "PlayerCount";
    public final static String ALL = "ALL";

    /**
     * 注册传出通用通道
     */
    public static void registerOut() {
        // 注册传出插件通道
        Bukkit.getMessenger().registerOutgoingPluginChannel(InitApi.PLUGIN, BaseConstants.BUNGEE_CORD_CHANNEL);
    }

    /**
     * 注销传出通用通道
     */
    public static void unregisterOut() {
        // 注册传出插件通道
        Bukkit.getMessenger().unregisterOutgoingPluginChannel(InitApi.PLUGIN, BaseConstants.BUNGEE_CORD_CHANNEL);
    }

    /**
     * 跨服传送
     *
     * @param player     玩家
     * @param serverName 服务名
     */
    public static void tpConnect(Player player, String serverName) {
        ByteArrayDataOutput out = ByteStreams.newDataOutput();
        out.writeUTF(CONNECT);
        out.writeUTF(serverName);
        player.sendPluginMessage(InitApi.PLUGIN, BaseConstants.BUNGEE_CORD_CHANNEL, out.toByteArray());
    }

    /**
     * 发送自定义插件消息
     *
     * @param player  玩家
     * @param content 消息
     */
    public static void sendForward(Player player, String content) {
        // 这样写BungeeCord就知道要转发它
        ByteArrayDataOutput out = ByteStreams.newDataOutput();
        out.writeUTF(FORWARD);
        out.writeUTF("ALL");
        // 用于检查这是否是你的数据的频道名称
        out.writeUTF(BaseConstants.BUNGEE_CORD_CHANNEL);
        ByteArrayDataOutput dataOut = ByteStreams.newDataOutput();
        // 你可以用dataOutputStream发送任何你想发送的数据
        dataOut.writeUTF(content);
        out.writeShort(dataOut.toByteArray().length);
        out.write(dataOut.toByteArray());
        // 发送自定义插件消息
        player.sendPluginMessage(InitApi.PLUGIN, BaseConstants.BUNGEE_CORD_CHANNEL, out.toByteArray());
    }

    /**
     * 接收自定义插件消息
     *
     * @param message 消息
     * @return 消息
     */
    public static Optional getContentByForward(byte[] message) {
        // 获取插件消息
        ByteArrayDataInput in = ByteStreams.newDataInput(message);
        String subChannel = in.readUTF();
        if (!BaseConstants.BUNGEE_CORD_CHANNEL.equals(subChannel)) {
            return Optional.empty();
        }
        byte[] bytes = new byte[in.readShort()];
        in.readFully(bytes);
        // 获取传送的数据
        ByteArrayDataInput dataInput = ByteStreams.newDataInput(bytes);
        return Optional.of(dataInput.readUTF());
    }

    /**
     * 发送自定义插件消息
     *
     * @param player  玩家
     * @param content 消息
     * @since 3.6.3
     */
    public static void sendParamForward(Player player, BcMessageParam content) {
        sendForward(player, JsonUtil.toJson(content));
    }

    /**
     * 接收自定义插件消息
     *
     * @param message 消息
     * @return BcMessageParam
     * @since 3.6.3
     */
    public static Optional getParamByForward(byte[] message) {
        Optional jsonOpt = getContentByForward(message);
        if (!jsonOpt.isPresent()) {
            return Optional.empty();
        }
        MessageUtil.sendConsoleDebugMessage("消息内容为:" + jsonOpt.get());
        BcMessageParam param = JsonUtil.toBean(jsonOpt.get(), BcMessageParam.class);
        if (param == null || StrUtil.isEmpty(param.getPluginName()) || !InitApi.PLUGIN.getName().equals(param.getPluginName())) {
            return Optional.empty();
        }
        return Optional.of(param);
    }

    /**
     * 发送获取服务器名称消息
     */
    public static void sendGetServer() {
        Player player = Iterables.getFirst(Bukkit.getOnlinePlayers(), null);
        if (player == null) {
            return;
        }
        ByteArrayDataOutput out = ByteStreams.newDataOutput();
        out.writeUTF(GET_SERVER);
        player.sendPluginMessage(InitApi.PLUGIN, BaseConstants.BUNGEE_CORD_CHANNEL, out.toByteArray());
    }

    /**
     * 获取服务器名称
     *
     * @param message 消息
     * @return 服务器名称
     */
    public static Optional getServerName(byte[] message) {
        ByteArrayDataInput in = ByteStreams.newDataInput(message);
        String type = in.readUTF();
        if (!GET_SERVER.equals(type)) {
            return Optional.empty();
        }
        return Optional.of(in.readUTF());
    }

    /**
     * 发送获取玩家数量消息
     *
     * @since 3.6.8
     */
    public static void sendPlayerCount() {
        Player player = Iterables.getFirst(Bukkit.getOnlinePlayers(), null);
        if (player == null) {
            return;
        }
        ByteArrayDataOutput out = ByteStreams.newDataOutput();
        out.writeUTF(PLAYER_COUNT);
        out.writeUTF(ALL);
        player.sendPluginMessage(InitApi.PLUGIN, BaseConstants.BUNGEE_CORD_CHANNEL, out.toByteArray());
    }

    /**
     * 获取获取玩家数量
     *
     * @param message 消息
     * @return 玩家数量
     * @since 3.6.8
     */
    public static Map getPlayerCount(byte[] message) {
        try {
            ByteArrayDataInput in = ByteStreams.newDataInput(message);
            // 消息类型
            String type = in.readUTF();
            if (!PLAYER_COUNT.equals(type)) {
                return MapUtil.of();
            }
            // 服务器的名称,如给定的参数所示
            String server = in.readUTF();
            int count = in.readInt();
            return ImmutableMap.of(server, count);
        } catch (Exception e) {
            return MapUtil.of();
        }
    }

    @Getter
    @Setter
    public static class BcMessageParam {

        /**
         * 插件名
         */
        private String pluginName;

        /**
         * 类型
         */
        private String type;

        /**
         * 消息内容
         */
        private String message;

        /**
         * 发送人
         */
        private String playerName;

        /**
         * 发送时间
         */
        private Long timestamp;

    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy