MiaoChat/src/main/java/pw/yumc/MiaoChat/MiaoChat.java

155 lines
5.6 KiB
Java

package pw.yumc.MiaoChat;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.plugin.messaging.PluginMessageListener;
import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import me.clip.placeholderapi.PlaceholderAPI;
import me.clip.placeholderapi.PlaceholderHook;
import pw.yumc.MiaoChat.config.ChatConfig;
import pw.yumc.MiaoChat.listeners.ChatListener;
import pw.yumc.YumCore.bukkit.Log;
import pw.yumc.YumCore.bukkit.compatible.C;
import pw.yumc.YumCore.commands.CommandSub;
import pw.yumc.YumCore.commands.annotation.Cmd;
import pw.yumc.YumCore.commands.annotation.Help;
import pw.yumc.YumCore.commands.interfaces.Executor;
import pw.yumc.YumCore.config.FileConfig;
import pw.yumc.YumCore.global.L10N;
public class MiaoChat extends JavaPlugin implements Executor, PluginMessageListener, Listener {
private FileConfig cfg;
private ChatConfig chatConfig;
private String ServerName;
public ChatConfig getChatConfig() {
return chatConfig;
}
@Override
public FileConfiguration getConfig() {
return cfg;
}
@Cmd(permission = "MiaoChat.toggle", executor = Cmd.Executor.PLAYER)
@Help("关闭聊天功能")
public void off(Player sender) {
ChatListener.offList.add(sender);
Log.sender(sender, "§c聊天功能已关闭!");
}
@Cmd(permission = "MiaoChat.toggle", executor = Cmd.Executor.PLAYER)
@Help("开启聊天功能")
public void on(Player sender) {
ChatListener.offList.remove(sender);
Log.sender(sender, "§a聊天功能已开启!");
}
@Override
public void onEnable() {
new ChatListener();
new CommandSub("MiaoChat", this);
enableBungeeCord();
hookPlaceholderAPI();
L10N.getName(new ItemStack(Material.AIR));
}
private void enableBungeeCord() {
if (getChatConfig().isBungeeCord()) {
Log.i("已开启 BungeeCord 模式!");
Bukkit.getMessenger().registerIncomingPluginChannel(this, "BungeeCord", this);
Bukkit.getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
Bukkit.getPluginManager().registerEvents(this, this);
Bukkit.getMessenger().registerIncomingPluginChannel(this, MiaoMessage.CHANNEL, this);
Bukkit.getMessenger().registerOutgoingPluginChannel(this, MiaoMessage.CHANNEL);
Bukkit.getMessenger().registerIncomingPluginChannel(this, MiaoMessage.NORMAL_CHANNEL, this);
Bukkit.getMessenger().registerOutgoingPluginChannel(this, MiaoMessage.NORMAL_CHANNEL);
}
}
private void hookPlaceholderAPI() {
PlaceholderAPI.registerPlaceholderHook("mct", new PlaceholderHook() {
@Override
public String onPlaceholderRequest(Player player, String s) {
switch (s.toLowerCase()) {
case "server":
return getChatConfig().getServername();
case "bserver":
return ServerName;
default:
}
return "未知的参数";
}
});
}
@Override
public void onLoad() {
cfg = new FileConfig();
chatConfig = new ChatConfig();
}
@Cmd(permission = "MiaoChat.reload")
@Help("重载配置文件")
public void reload(CommandSender sender) {
cfg.reload();
chatConfig.reload();
Log.sender(sender, "§a配置文件已重载!");
}
public static void send(byte[] in) {
send(MiaoMessage.decode(in).getJson());
}
public static void send(String json) {
for (Player player : C.Player.getOnlinePlayers()) {
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "tellraw " + player.getName() + " " + json);
}
}
@EventHandler
public void onJoin(final PlayerJoinEvent e) {
Bukkit.getScheduler().runTaskLater(this, () -> {
Player p = e.getPlayer();
if (p.isOnline()) {
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeUTF("GetServer");
p.sendPluginMessage(MiaoChat.this, "BungeeCord", out.toByteArray());
}
}, 10);
}
@Override
public void onPluginMessageReceived(String channel, Player player, byte[] message) {
if (MiaoMessage.CHANNEL.equals(channel)) {
send(message);
} else if (MiaoMessage.NORMAL_CHANNEL.equals(channel)) {
for (Player p : C.Player.getOnlinePlayers()) {
p.sendMessage(MiaoMessage.decode(message).getJson());
}
} else if ("BungeeCord".equals(channel)) {
final ByteArrayDataInput input = ByteStreams.newDataInput(message);
if ("GetServer".equals(input.readUTF())) {
ServerName = input.readUTF();
Log.d("获取服务器名称: " + ServerName);
PlayerJoinEvent.getHandlerList().unregister((Listener) this);
Bukkit.getScheduler().runTaskLater(this, () -> {
Bukkit.getMessenger().unregisterIncomingPluginChannel(MiaoChat.this, "BungeeCord");
Bukkit.getMessenger().unregisterOutgoingPluginChannel(MiaoChat.this, "BungeeCord");
}, 20);
}
}
}
}