
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