From 44691d0ae6250ad447ad30f283e5340f3e87d6c1 Mon Sep 17 00:00:00 2001 From: XiaoLFeng Date: Tue, 10 Oct 2023 23:43:47 +0800 Subject: [PATCH] init commit --- .gitignore | 113 ++++++++++++++++ HowToUse/README.md | 0 pom.xml | 83 ++++++++++++ .../frontleaves/bungeecross/BungeeCross.java | 44 ++++++ .../commands/PluginInfoCommand.java | 28 ++++ .../commands/ProxyServerListCommand.java | 36 +++++ .../commands/ReturnHubCommand.java | 35 +++++ .../commands/SendToServerCommand.java | 92 +++++++++++++ .../configuration/ServerEnable.java | 126 ++++++++++++++++++ .../configuration/VariableStorage.java | 31 +++++ .../events/PlayerJoinProxyEvent.java | 22 +++ .../events/PlayerLeaveProxyEvent.java | 21 +++ src/main/resources/bungee.yml | 5 + src/main/resources/config.yml | 15 +++ 14 files changed, 651 insertions(+) create mode 100644 .gitignore create mode 100644 HowToUse/README.md create mode 100644 pom.xml create mode 100644 src/main/java/com/frontleaves/bungeecross/BungeeCross.java create mode 100644 src/main/java/com/frontleaves/bungeecross/commands/PluginInfoCommand.java create mode 100644 src/main/java/com/frontleaves/bungeecross/commands/ProxyServerListCommand.java create mode 100644 src/main/java/com/frontleaves/bungeecross/commands/ReturnHubCommand.java create mode 100644 src/main/java/com/frontleaves/bungeecross/commands/SendToServerCommand.java create mode 100644 src/main/java/com/frontleaves/bungeecross/configuration/ServerEnable.java create mode 100644 src/main/java/com/frontleaves/bungeecross/configuration/VariableStorage.java create mode 100644 src/main/java/com/frontleaves/bungeecross/events/PlayerJoinProxyEvent.java create mode 100644 src/main/java/com/frontleaves/bungeecross/events/PlayerLeaveProxyEvent.java create mode 100644 src/main/resources/bungee.yml create mode 100644 src/main/resources/config.yml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4788b4b --- /dev/null +++ b/.gitignore @@ -0,0 +1,113 @@ +# User-specific stuff +.idea/ + +*.iml +*.ipr +*.iws + +# IntelliJ +out/ + +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +target/ + +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next + +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +.mvn/wrapper/maven-wrapper.jar +.flattened-pom.xml + +# Common working directory +run/ diff --git a/HowToUse/README.md b/HowToUse/README.md new file mode 100644 index 0000000..e69de29 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..2f00565 --- /dev/null +++ b/pom.xml @@ -0,0 +1,83 @@ + + + 4.0.0 + + com.frontleaves + BungeeCross + 1.0-SNAPSHOT + jar + + BungeeCross + + BungeeCord - 跨服 + + 1.8 + UTF-8 + + + + clean package + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.4 + + + package + + shade + + + false + + + + + + + + src/main/resources + true + + + + + + + aliyun + https://maven.aliyun.com/repository/ + + + + + + net.md-5 + bungeecord-api + 1.20-R0.2-SNAPSHOT + provided + + + org.projectlombok + lombok + 1.18.28 + + + org.jetbrains + annotations + 23.0.0 + compile + + + diff --git a/src/main/java/com/frontleaves/bungeecross/BungeeCross.java b/src/main/java/com/frontleaves/bungeecross/BungeeCross.java new file mode 100644 index 0000000..c0ecb66 --- /dev/null +++ b/src/main/java/com/frontleaves/bungeecross/BungeeCross.java @@ -0,0 +1,44 @@ +package com.frontleaves.bungeecross; + +import com.frontleaves.bungeecross.commands.PluginInfoCommand; +import com.frontleaves.bungeecross.commands.ProxyServerListCommand; +import com.frontleaves.bungeecross.commands.ReturnHubCommand; +import com.frontleaves.bungeecross.commands.SendToServerCommand; +import com.frontleaves.bungeecross.configuration.ServerEnable; +import com.frontleaves.bungeecross.configuration.VariableStorage; +import com.frontleaves.bungeecross.events.PlayerJoinProxyEvent; +import lombok.Getter; +import net.md_5.bungee.api.plugin.Plugin; + +/** + * @version 见 final VERSION 变量 + * @author 筱锋xiao_lfeng + */ +public final class BungeeCross extends Plugin { + @Getter + private final static String VERSION = "v1.0-SNAPSHOT"; + @Getter + private final static String AUTHOR = "筱锋xiao_lfeng"; + + @Override + public void onEnable() { + // 加载配置文件 + ServerEnable serverEnable = new ServerEnable(this); + serverEnable.serverStart(); + // 注册指令 + getProxy().getPluginManager().registerCommand(this, new PluginInfoCommand("bungeecross")); + getProxy().getPluginManager().registerCommand(this, new ProxyServerListCommand("server-list")); + getProxy().getPluginManager().registerCommand(this, new ReturnHubCommand("hub", this)); + getProxy().getPluginManager().registerCommand(this, new SendToServerCommand("serverTo", this)); + // 注册监听器 + getProxy().getPluginManager().registerListener(this, new PlayerJoinProxyEvent()); + } + + @Override + public void onDisable() { + VariableStorage.setLobbyServer(null); + VariableStorage.setLoginServer(null); + VariableStorage.setPrefix(null); + VariableStorage.setProxyServer(null); + } +} diff --git a/src/main/java/com/frontleaves/bungeecross/commands/PluginInfoCommand.java b/src/main/java/com/frontleaves/bungeecross/commands/PluginInfoCommand.java new file mode 100644 index 0000000..290c205 --- /dev/null +++ b/src/main/java/com/frontleaves/bungeecross/commands/PluginInfoCommand.java @@ -0,0 +1,28 @@ +package com.frontleaves.bungeecross.commands; + +import com.frontleaves.bungeecross.BungeeCross; +import com.frontleaves.bungeecross.configuration.VariableStorage; +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.plugin.Command; + +/** + * 输出插件基本信息 + * + * @author 筱锋xiao_lfeng + */ +public class PluginInfoCommand extends Command { + + public PluginInfoCommand(String name) { + super(name); + } + + @Override + public void execute(CommandSender commandSender, String[] strings) { + commandSender.sendMessage("§9§l§m=]=======§2 Bungee§aCross §9§l§m========[="); + commandSender.sendMessage(VariableStorage.getPrefix() + "蹦极插件:§2Bungee§aCross"); + commandSender.sendMessage(VariableStorage.getPrefix() + "作者:" + BungeeCross.getAUTHOR()); + commandSender.sendMessage(VariableStorage.getPrefix() + "版本:" + BungeeCross.getVERSION()); + commandSender.sendMessage(VariableStorage.getPrefix() + "§b您的版本为最新的"); + commandSender.sendMessage("§9§l§m=]=======§2 Bungee§aCross §9§l§m========[="); + } +} diff --git a/src/main/java/com/frontleaves/bungeecross/commands/ProxyServerListCommand.java b/src/main/java/com/frontleaves/bungeecross/commands/ProxyServerListCommand.java new file mode 100644 index 0000000..08b08eb --- /dev/null +++ b/src/main/java/com/frontleaves/bungeecross/commands/ProxyServerListCommand.java @@ -0,0 +1,36 @@ +package com.frontleaves.bungeecross.commands; + +import com.frontleaves.bungeecross.configuration.VariableStorage; +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.plugin.Command; + +/** + * 查询服务器列表 + * + * @author 筱锋xiao_lfeng + * @version v1.0-SNAPSHOT + * @since v1.0-SNAPSHOT + */ +public class ProxyServerListCommand extends Command { + private StringBuilder serverList = null; + + public ProxyServerListCommand(String name) { + super(name); + } + + @Override + public void execute(CommandSender commandSender, String[] strings) { + // 整理数据 + serverList = null; + VariableStorage.getProxyServer().forEach((key, serverInfo) -> { + if (serverList == null) { + serverList = new StringBuilder("\t" + serverInfo.getName()); + } else { + serverList.append(", ").append(serverInfo.getName()); + } + }); + // 返回列表信息 + commandSender.sendMessage(VariableStorage.getPrefix() + "当前服务器如下:"); + commandSender.sendMessage(serverList.toString()); + } +} diff --git a/src/main/java/com/frontleaves/bungeecross/commands/ReturnHubCommand.java b/src/main/java/com/frontleaves/bungeecross/commands/ReturnHubCommand.java new file mode 100644 index 0000000..b0e9c42 --- /dev/null +++ b/src/main/java/com/frontleaves/bungeecross/commands/ReturnHubCommand.java @@ -0,0 +1,35 @@ +package com.frontleaves.bungeecross.commands; + +import com.frontleaves.bungeecross.BungeeCross; +import com.frontleaves.bungeecross.configuration.VariableStorage; +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.config.ServerInfo; +import net.md_5.bungee.api.plugin.Command; +import org.jetbrains.annotations.NotNull; + +/** + * 返回大厅指令 + * + * @author 筱锋xiao_lfeng + * @since v1.0-SNAPSHOT + * @version v1.0-SNAPSHOT + */ +public class ReturnHubCommand extends Command { + private final BungeeCross plugin; + public ReturnHubCommand(String name, BungeeCross bungeeCross) { + super(name); + plugin = bungeeCross; + } + + @Override + public void execute(@NotNull CommandSender commandSender, String[] strings) { + // 检查玩家所属服务器 + String playerName = commandSender.getName(); + ServerInfo serverInfo = plugin.getProxy().getPlayer(playerName).getServer().getInfo(); + if (VariableStorage.getLoginServer().contains(serverInfo.getName())) { + commandSender.sendMessage(VariableStorage.getPrefix() + "登录服无权限传送"); + } else { + plugin.getProxy().getPlayer(playerName).connect(plugin.getProxy().getServerInfo("登陆大厅")); + } + } +} diff --git a/src/main/java/com/frontleaves/bungeecross/commands/SendToServerCommand.java b/src/main/java/com/frontleaves/bungeecross/commands/SendToServerCommand.java new file mode 100644 index 0000000..8332d1f --- /dev/null +++ b/src/main/java/com/frontleaves/bungeecross/commands/SendToServerCommand.java @@ -0,0 +1,92 @@ +package com.frontleaves.bungeecross.commands; + +import com.frontleaves.bungeecross.BungeeCross; +import com.frontleaves.bungeecross.configuration.VariableStorage; +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.config.ServerInfo; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.plugin.Command; +import org.jetbrains.annotations.NotNull; + +/** + * 传送到服务器 + * + * @author 筱锋xiao_lfeng + * @version v1.0-SNAPSHOT + * @since v1.0-SNAPSHOT + */ +public class SendToServerCommand extends Command { + private final BungeeCross plugin; + public SendToServerCommand(String name, BungeeCross bungeeCross) { + super(name); + plugin = bungeeCross; + } + + @Override + public void execute(CommandSender commandSender, String @NotNull [] strings) { + switch (strings.length) { + case 1: { + // 权限检查 + if (commandSender.hasPermission("bungeecross.server.jump")) { + if (commandSender instanceof ProxiedPlayer) { + // 获取内容是否与服务器匹配 + try { + ServerInfo serverInfo = plugin.getProxy().getServers().get(strings[0]); + // 检查是否在登录区 + ServerInfo serverName = plugin.getProxy().getPlayer(commandSender.getName()).getServer().getInfo(); + if (!VariableStorage.getLoginServer().contains(serverName.getName())) { + if (serverName != serverInfo) { + plugin.getProxy().getPlayer(commandSender.getName()).connect(serverInfo); + commandSender.sendMessage(VariableStorage.getPrefix() + "跳转到服务器:" + serverInfo.getName()); + } else { + commandSender.sendMessage(VariableStorage.getPrefix() + "您正处于 " + serverInfo.getName() + " 服务器中"); + } + } else { + commandSender.sendMessage(VariableStorage.getPrefix() + "登录服禁止进行服务器跳转"); + } + } catch (NullPointerException ignore) { + commandSender.sendMessage(VariableStorage.getPrefix() + "服务器不存在"); + } + } else { + commandSender.sendMessage(VariableStorage.getPrefix() + "该指令只允许玩家进行操作"); + } + } else { + commandSender.sendMessage(VariableStorage.getPrefix() + "您没有权限"); + } + } + break; + // 管理员操作 + case 2: { + // 获取内容是否与 + if (commandSender.hasPermission("bungeecross.admin")) { + ServerInfo serverInfo = plugin.getProxy().getServers().get(strings[0]); + if (serverInfo != null) { + ProxiedPlayer player = plugin.getProxy().getPlayer(strings[1]); + // 玩家是否已链接 + if (player != null) { + if (player.isConnected()) { + ServerInfo playerServer = player.getServer().getInfo(); + if (playerServer != serverInfo) { + player.connect(serverInfo); + commandSender.sendMessage(VariableStorage.getPrefix() + "已将 " + player.getName() + " 用户传送到 " + serverInfo.getName() + " 服务器"); + } else { + commandSender.sendMessage(VariableStorage.getPrefix() + "玩家 " + player.getName() + " 正处于 " + playerServer.getName() + " 服务器中"); + } + } else { + commandSender.sendMessage(VariableStorage.getPrefix() + "玩家 " + player.getName() + " 不在线"); + } + } else { + commandSender.sendMessage(VariableStorage.getPrefix() + "玩家 " + strings[1] + " 不在线"); + } + } else { + commandSender.sendMessage(VariableStorage.getPrefix() + "服务器不存在"); + } + } + } + break; + default: { + commandSender.sendMessage(VariableStorage.getPrefix() + "参数无效"); + } + } + } +} diff --git a/src/main/java/com/frontleaves/bungeecross/configuration/ServerEnable.java b/src/main/java/com/frontleaves/bungeecross/configuration/ServerEnable.java new file mode 100644 index 0000000..a3f193d --- /dev/null +++ b/src/main/java/com/frontleaves/bungeecross/configuration/ServerEnable.java @@ -0,0 +1,126 @@ +package com.frontleaves.bungeecross.configuration; + +import com.frontleaves.bungeecross.BungeeCross; +import lombok.RequiredArgsConstructor; +import net.md_5.bungee.config.Configuration; +import net.md_5.bungee.config.ConfigurationProvider; +import net.md_5.bungee.config.YamlConfiguration; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; + +/** + * 服务器启动执行操作 + * + * @author 筱锋xiao_lfeng + */ +@RequiredArgsConstructor +public class ServerEnable { + private final BungeeCross plugin; + + /** + * 服务器启动内容 + */ + public void serverStart() { + this.getConfig(); + this.getProxyServer(); + System.out.println(VariableStorage.getPrefix() + "§c配置文件加载完毕"); + } + + /** + * 获取配置文件,如果没有则自动创建 + */ + private void checkConfigFile() { + if (!plugin.getDataFolder().exists()) { + if (plugin.getDataFolder().mkdir()) { + plugin.getLogger().info("文件夹创建成功"); + } else { + plugin.getLogger().info("文件夹创建失败"); + } + } + File configFile = new File(plugin.getDataFolder(), "config.yml"); + if (!configFile.exists()) { + saveDefaultConfig(configFile); + plugin.getLogger().info("配置文件创建成功"); + } + } + + /** + * 获取配置文件 + */ + private void getConfig() { + this.checkConfigFile(); + Configuration config; + File configFile; + // 读取文件信息 + try { + configFile = new File(plugin.getDataFolder(), "config.yml"); + config = ConfigurationProvider.getProvider(YamlConfiguration.class).load(configFile); + } catch (IOException e) { + throw new RuntimeException(e); + } + + // 读取配置文件 + if (config.getString("server_prefix") != null && !config.getString("server_prefix").isEmpty()) { + VariableStorage.setPrefix(config.getString("server_prefix")); + } else { + VariableStorage.setPrefix("§7[§2Bungee§aCross§7] §r"); + } + // 读取登录服务器 + if (config.getList("server_login").isEmpty()) { + this.reloadTheDefaultConfig(configFile); + return; + } else { + VariableStorage.setLoginServer(config.getList("server_login")); + } + // 读取大厅服务器 + if (config.getList("server_lobby").isEmpty()) { + this.reloadTheDefaultConfig(configFile); + } else { + VariableStorage.setLobbyServer(config.getList("server_login")); + } + } + + /** + * 获取全部服务器 + */ + private void getProxyServer() { + VariableStorage.setProxyServer(plugin.getProxy().getServers()); + } + + /** + * 复制默认配置文件到配置项 + * + * @param configFile File + */ + private void saveDefaultConfig(@NotNull File configFile) { + // 将默认配置文件从资源中复制到插件目录 + try (InputStream inputStream = plugin.getResourceAsStream("config.yml")) { + Files.copy(inputStream, configFile.toPath()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * 重新载入新的配置文件 + * + * @param configFile File + */ + private void reloadTheDefaultConfig(@NotNull File configFile) { + File newConfigFile = new File(plugin.getDataFolder(), "config.old.yml"); + try { + Files.copy(configFile.toPath(), newConfigFile.toPath()); + if (configFile.delete()) { + this.saveDefaultConfig(configFile); + plugin.getLogger().warning("配置文件错误,已重新生成新的文件"); + plugin.getLogger().info("旧配置文件已生成 config.old.yml"); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/com/frontleaves/bungeecross/configuration/VariableStorage.java b/src/main/java/com/frontleaves/bungeecross/configuration/VariableStorage.java new file mode 100644 index 0000000..84235f4 --- /dev/null +++ b/src/main/java/com/frontleaves/bungeecross/configuration/VariableStorage.java @@ -0,0 +1,31 @@ +package com.frontleaves.bungeecross.configuration; + +import lombok.Getter; +import lombok.Setter; +import net.md_5.bungee.api.config.ServerInfo; + +import java.util.List; +import java.util.Map; + +/** + * 变量存储 + * + * @author 筱锋xiao_lfeng + */ +public class VariableStorage { + @Getter + @Setter + private static String prefix; + + @Getter + @Setter + private static Map proxyServer; + + @Getter + @Setter + private static List loginServer; + + @Getter + @Setter + private static List lobbyServer; +} diff --git a/src/main/java/com/frontleaves/bungeecross/events/PlayerJoinProxyEvent.java b/src/main/java/com/frontleaves/bungeecross/events/PlayerJoinProxyEvent.java new file mode 100644 index 0000000..4fabfd7 --- /dev/null +++ b/src/main/java/com/frontleaves/bungeecross/events/PlayerJoinProxyEvent.java @@ -0,0 +1,22 @@ +package com.frontleaves.bungeecross.events; + +import com.frontleaves.bungeecross.configuration.VariableStorage; +import net.md_5.bungee.api.event.ServerConnectedEvent; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.event.EventHandler; +import org.jetbrains.annotations.NotNull; + +/** + * 玩家登录服务器事件 + * + * @author 筱锋xiao_lfeng + * @version v1.0-SNAPSHOT + * @since v1.0-SNAPSHOT + */ +public class PlayerJoinProxyEvent implements Listener { + + @EventHandler + public void onPlayerJoinProxy(@NotNull ServerConnectedEvent event) { + event.getPlayer().connect(VariableStorage.getProxyServer().get("login_1")); + } +} diff --git a/src/main/java/com/frontleaves/bungeecross/events/PlayerLeaveProxyEvent.java b/src/main/java/com/frontleaves/bungeecross/events/PlayerLeaveProxyEvent.java new file mode 100644 index 0000000..2350b1c --- /dev/null +++ b/src/main/java/com/frontleaves/bungeecross/events/PlayerLeaveProxyEvent.java @@ -0,0 +1,21 @@ +package com.frontleaves.bungeecross.events; + +import net.md_5.bungee.api.event.ServerDisconnectEvent; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.event.EventHandler; +import org.jetbrains.annotations.NotNull; + +/** + * 玩家离开服务器事件 + * + * @author 筱锋xiao_lfeng + * @version v1.0-SNAPSHOT + * @since v1.0-SNAPSHOT + */ +public class PlayerLeaveProxyEvent implements Listener { + + @EventHandler + public void onPlayerDisconnectEvent(@NotNull ServerDisconnectEvent event) { + + } +} diff --git a/src/main/resources/bungee.yml b/src/main/resources/bungee.yml new file mode 100644 index 0000000..f22ca89 --- /dev/null +++ b/src/main/resources/bungee.yml @@ -0,0 +1,5 @@ +name: BungeeCross +version: '${project.version}' +main: com.frontleaves.bungeecross.BungeeCross +author: xiao_lfeng +description: BungeeCord - 跨服 diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 0000000..f13b641 --- /dev/null +++ b/src/main/resources/config.yml @@ -0,0 +1,15 @@ +# BungeeCross +# Author: 筱锋xiao_lfeng +# Version: v1.0-SNAPSHOT + +# 显示前缀 +server_prefix: "§7[§2Bungee§aCross§7] §r" + +# 登录服务器列表 +server_login: + - login_1 + - login_2 + +# 大厅服务器列表 +server_lobby: + - 登陆大厅