commit dac207f91eb5aed71f7a2541aeffddd518b217e1 Author: Da_nuo Date: Mon Jan 20 16:17:06 2025 +0800 首次提交 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..d9e3477 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..f44ba7b --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..82dbec8 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..3007dae --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..d5d5d71 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,283 @@ + + + + + + + + + + + + + + + + + + + + + + { + "customColor": "", + "associatedIndex": 8 +} + + + + + + + + + + + + + + + + + + + C:\Users\Administrator\AppData\Roaming\Subversion + + + + + 1733023429534 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..467a62a --- /dev/null +++ b/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + + org.example + untitled + 1.0-SNAPSHOT + + + spigot-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + + + + org.spigotmc + spigot-api + 1.20.1-R0.1-SNAPSHOT + provided + + + + 17 + 17 + UTF-8 + + + \ No newline at end of file diff --git a/src/main/java/org/start/command/command.java b/src/main/java/org/start/command/command.java new file mode 100644 index 0000000..7e68621 --- /dev/null +++ b/src/main/java/org/start/command/command.java @@ -0,0 +1,94 @@ +package org.start.command; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import org.start.data.TeamManager; +import org.start.player.cuan_song.chuan_song; +import org.start.print; +import org.start.player.bossbar.boss_bar_runs; + +public class command implements CommandExecutor { + + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + + Player player = (Player) sender; + ChatColor r = ChatColor.RED; + ChatColor g = ChatColor.GREEN; + ChatColor y = ChatColor.YELLOW; + ChatColor b = ChatColor.BLUE; + + if (args.length == 0){ + print.player_p(player,"&命令不正确,请使用 /war help 了解更多"); + return false; + } + + //处理 help 命令 + if (args[0].equalsIgnoreCase("help")){ + player.sendMessage(" "); + print.player_p(player, "&e=======&b[ &a守塔模式 (内部插件) &b]&e======="); + player.sendMessage("用法:/war join red 加入进攻方"); + player.sendMessage(" /war join blue 加入防守方"); + player.sendMessage(" /war stop 离开守塔模式"); + return true; + } + + //处理 join事件 + if (args[0].equalsIgnoreCase("join")) { + if (args.length < 2){ + print.player_p(player,"你需要指定一个想要加入的队伍&a red:进攻方 blue:防守方"); + return true; + } + + String joinType = args[1].toLowerCase(); + if (joinType.equals("red")){ + if (TeamManager.isPlayerInTeam(player.getName())){ + print.player_p(player, "&e警告&f你已加入"+ TeamManager.getPlayer(player.getName())+",请勿重复加入"); + return true; + }else { + chuan_song.toRed(player); + TeamManager.setPlayer(player.getName(), "red"); //将玩家传入存储类 + boss_bar_runs.onPlayerJoinTeam(player,"red"); //为玩家添加进度条 + print.player_p(player,"你已加入进攻方"); + print.boardChat("玩家"+ player.getName()+"加入进攻方"); + return true; + } + } + if (joinType.equals("blue")){ + if (TeamManager.isPlayerInTeam(player.getName())) { + print.player_p(player, "&e警告&f你已加入" + TeamManager.getPlayer(player.getName()) + ",请勿重复加入"); + return true; + }else { + chuan_song.toBlue(player); + TeamManager.setPlayer(player.getName(), "blue"); + boss_bar_runs.onPlayerJoinTeam(player,"blue"); + print.player_p(player,"你已加入防守方"); + print.boardChat("玩家"+ player.getName()+"加入进攻方"); + return true; + } + + }else { + print.player_p(player,"无效队伍,请重试"); + return true; + } + } + + //处理 stop 命令 + if (args[0].equalsIgnoreCase("stop")){ + print.player_p(player,"你已离开守塔模式"); + chuan_song.toStop(player); + boss_bar_runs.onPlayerLeaveTeam(player); //移除玩家的进度条 + print.boardChat("玩家"+ player.getName()+"离开守塔模式"); + TeamManager.removePlayer(player.getName()); //将玩家移出存储类 + return true; + } + + print.player_p(player,"无效命令,请重试"); + return false; + } +} diff --git a/src/main/java/org/start/command/commandTab.java b/src/main/java/org/start/command/commandTab.java new file mode 100644 index 0000000..dc12e59 --- /dev/null +++ b/src/main/java/org/start/command/commandTab.java @@ -0,0 +1,32 @@ +package org.start.command; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; + +import java.util.ArrayList; +import java.util.List; + +public class commandTab implements TabCompleter { + + @Override + public List onTabComplete(CommandSender sender, Command command, String label, String[] args) { + List completions = new ArrayList<>(); + + // 玩家输入第一个参数时(如 "/war "),自动补全 "join", "stop", "help" + if (args.length == 1) { + if ("join".startsWith(args[0])) completions.add("join"); + if ("stop".startsWith(args[0])) completions.add("stop"); + if ("help".startsWith(args[0])) completions.add("help"); + } + + // 玩家输入 "war join" 后(即第二个参数),自动补全队伍名称,如 "red" 和 "blue" + if (args.length == 2 && args[0].equalsIgnoreCase("join")) { + if ("red".startsWith(args[1])) completions.add("red"); + if ("blue".startsWith(args[1])) completions.add("blue"); + } + + return completions; + } +} + diff --git a/src/main/java/org/start/data/TeamManager.java b/src/main/java/org/start/data/TeamManager.java new file mode 100644 index 0000000..838797b --- /dev/null +++ b/src/main/java/org/start/data/TeamManager.java @@ -0,0 +1,58 @@ +package org.start.data; + +import org.start.print; + +import java.util.HashMap; +import java.util.Map; + +public class TeamManager { + + // 存储玩家名称与队伍的关系 + private static Map playerTeamMap = new HashMap<>(); + + /** + * 设置玩家的队伍类型 + * + * @param playerName 玩家名称 + * @param teamType 队伍类型 + */ + public static void setPlayer(String playerName, String teamType) { + playerTeamMap.put(playerName, teamType); + print.command_p("i", "玩家"+ playerName + "加入" + teamType); + } + + /** + * 获取玩家当前的队伍类型 + * + * @param playerName 玩家名称 + * @return 队伍类型,如果玩家不在任何队伍中则返回 null + */ + public static String getPlayer(String playerName) { + return playerTeamMap.get(playerName); + } + + /** + * 检查玩家是否已经加入了队伍 + * + * @param playerName 玩家名称 + * @return 如果玩家已经加入了队伍,返回 true,否则返回 false + */ + public static boolean isPlayerInTeam(String playerName) { + return playerTeamMap.containsKey(playerName); + } + + /** + * 移除玩家的队伍类型 + * + * @param playerName 玩家名称 + */ + public static boolean removePlayer(String playerName) { + if (playerTeamMap.containsKey(playerName)) { + playerTeamMap.remove(playerName); + print.command_p("i" ,"玩家 " + playerName + " 已退出队伍"); + return true; + } else { + return false; + } + } +} diff --git a/src/main/java/org/start/data/worldSpawnItem.java b/src/main/java/org/start/data/worldSpawnItem.java new file mode 100644 index 0000000..406b279 --- /dev/null +++ b/src/main/java/org/start/data/worldSpawnItem.java @@ -0,0 +1,89 @@ +package org.start.data; + +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.plugin.java.JavaPlugin; +import org.start.print; +import org.start.run; + + +public class worldSpawnItem { + + /* + // 静态插件实例 + private static JavaPlugin plugin; + + // 静态方法初始化插件实例 + public static void initialize(JavaPlugin plugin) { + worldSpawnItem.plugin = plugin; + plugin.getLogger().info("出生点获取类初始化已完成"); + } + */ + static World world; + static double redPath_x; + static double redPath_y; + static double redPath_z; + + static double bluePath_x; + static double bluePath_y; + static double bluePath_z; + + static double stopPath_x; + static double stopPath_y; + static double stopPath_z; + + public worldSpawnItem(run plugin){ + // 获取世界名 + String world_ = plugin.getConfig().getString("world"); + world = plugin.getServer().getWorld(world_); + + if (world == null){ + print.command_p("e", "未找到可用的世界名,已设为默认(world)"); + world = plugin.getServer().getWorld("world"); + }else { + print.command_p("i","加载世界名:" + world.getName()); + } + + //获取各队伍位置 + try { + redPath_x = plugin.getConfig().getDouble("red_path.x"); + redPath_y = plugin.getConfig().getDouble("red_path.y"); + redPath_z = plugin.getConfig().getDouble("red_path.z"); + print.command_p("i", "获取到的进攻方的数据为 "+redPath_x + " " +redPath_y+ " " +redPath_z); + }catch (Exception e){ + print.command_p("e", "无法获取进攻方队伍数据,请检查配置文件 ( " + e + " ) "); + } + try { + bluePath_x = plugin.getConfig().getDouble("blue_path.x"); + bluePath_y = plugin.getConfig().getDouble("blue_path.y"); + bluePath_z = plugin.getConfig().getDouble("blue_path.z"); + print.command_p("i", "获取到的防守方数据为 "+ bluePath_x +" " + bluePath_y + " " + bluePath_z); + }catch (Exception e){ + print.command_p("e", "无法获取防守方队伍数据,请检查配置文件 ( " + e + " ) "); + } + try { + stopPath_x = plugin.getConfig().getDouble("stop_path.x"); + stopPath_y = plugin.getConfig().getDouble("stop_path.y"); + stopPath_z = plugin.getConfig().getDouble("stop_path.z"); + print.command_p("i", "获取到的停止队列的数据为 " + stopPath_x + " " + stopPath_y + " " + stopPath_z); + }catch (Exception e){ + print.command_p("e", "无法获取停止队伍数据,请检查配置文件 ( " + e + " )"); + } + + } + public static World getWorld(){ + return world; + } + + public static Location getRed(){ + return new Location(world, redPath_x, redPath_y, redPath_z); + } + + public static Location getBlue(){ + return new Location(world, bluePath_x, bluePath_y, bluePath_z); + } + + public static Location getStop(){ + return new Location(world, stopPath_x, stopPath_y, stopPath_z); + } +} diff --git a/src/main/java/org/start/player/bossbar/boss_bar_runs.java b/src/main/java/org/start/player/bossbar/boss_bar_runs.java new file mode 100644 index 0000000..9a90737 --- /dev/null +++ b/src/main/java/org/start/player/bossbar/boss_bar_runs.java @@ -0,0 +1,36 @@ +package org.start.player.bossbar; + +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; + +public class boss_bar_runs { + private static JavaPlugin plugin; + public boss_bar_runs(JavaPlugin plugin) { + boss_bar_runs.plugin = plugin; + plugin.getLogger().info("进度条 类初始化已完成"); + } + + private static manger progressManager; + private static data teamProgressData; + + public static void main_runs_() { + // 初始化进度条管理器和队伍进度数据 + progressManager = new manger(plugin); + teamProgressData = new data(progressManager); + } + + // 玩家加入队伍时,创建并显示进度条 + public static void onPlayerJoinTeam(Player player, String team) { + progressManager.addPlayerProgress(player, team); // 为玩家添加进度条 + } + + // 玩家退出队伍时,移除进度条 + public static void onPlayerLeaveTeam(Player player) { + progressManager.removePlayerProgress(player); // 移除玩家进度条 + } + + // 玩家进攻进度变化时,更新红队进度条 + public static void onRedTeamProgressChanged(double newProgress) { + teamProgressData.setRedTeamProgress(newProgress); // 更新红队进攻进度 + } +} diff --git a/src/main/java/org/start/player/bossbar/data.java b/src/main/java/org/start/player/bossbar/data.java new file mode 100644 index 0000000..17d2062 --- /dev/null +++ b/src/main/java/org/start/player/bossbar/data.java @@ -0,0 +1,33 @@ +package org.start.player.bossbar; + +public class data { + + private double redTeamProgress = 0.0; // 红队的进攻进度 + private double blueTeamProgress = 1.0; // 蓝队的失守进度,初始为 100% + + private manger progressManager; + + public data(manger progressManager) { + this.progressManager = progressManager; + } + + // 设置红队的进攻进度 + public void setRedTeamProgress(double progress) { + redTeamProgress = progress / 100.0; // 转换为 0.0 - 1.0 + blueTeamProgress = 1.0 - redTeamProgress; // 蓝队失守进度是红队进度的反向 + + // 更新进度条 + progressManager.updateProgress("red", redTeamProgress); // 更新红队进度条 + progressManager.updateProgress("blue", blueTeamProgress); // 更新蓝队进度条 + } + + // 获取红队进攻进度 + public double getRedTeamProgress() { + return redTeamProgress; + } + + // 获取蓝队失守进度 + public double getBlueTeamProgress() { + return blueTeamProgress; + } +} diff --git a/src/main/java/org/start/player/bossbar/manger.java b/src/main/java/org/start/player/bossbar/manger.java new file mode 100644 index 0000000..2cdea03 --- /dev/null +++ b/src/main/java/org/start/player/bossbar/manger.java @@ -0,0 +1,74 @@ +package org.start.player.bossbar; + +import org.bukkit.boss.BarStyle; +import org.bukkit.boss.BarColor; +import org.bukkit.boss.BossBar; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.HashMap; +import java.util.Map; + +public class manger { + + private JavaPlugin plugin; // 插件实例 + private Map playerBossBars = new HashMap<>(); // 存储玩家的进度条 + + public manger(JavaPlugin plugin) { + this.plugin = plugin; + } + + // 为玩家创建进度条,并将其加入对应队伍的进度条 + public void addPlayerProgress(Player player, String team) { + // 如果玩家已经有进度条,先移除 + removePlayerProgress(player); + + // 创建进度条 + BossBar bossBar = plugin.getServer().createBossBar("", BarColor.RED, BarStyle.SOLID); + + // 根据队伍设置进度条标题 + if (team.equals("red")) { + bossBar.setTitle("Red Team Progress"); + } else if (team.equals("blue")) { + bossBar.setTitle("Blue Team Progress"); + } + + // 设置初始进度为 0 + bossBar.setProgress(0.0); + + // 显示进度条 + bossBar.addPlayer(player); + + // 存储玩家的进度条 + playerBossBars.put(player.getName(), bossBar); + } + + // 移除玩家的进度条 + public void removePlayerProgress(Player player) { + BossBar bossBar = playerBossBars.get(player.getName()); + if (bossBar != null) { + bossBar.removePlayer(player); + playerBossBars.remove(player.getName()); + } + } + + // 更新所有玩家的进度条 + public void updateProgress(String team, double progress) { + // 遍历所有玩家,并更新其队伍对应的进度条 + for (Player player : plugin.getServer().getOnlinePlayers()) { + if (team.equals("red")) { + // 红队的进度条 + BossBar bossBar = playerBossBars.get(player.getName()); + if (bossBar != null) { + bossBar.setProgress(progress); + } + } else if (team.equals("blue")) { + // 蓝队的进度条 + BossBar bossBar = playerBossBars.get(player.getName()); + if (bossBar != null) { + bossBar.setProgress(1.0 - progress); // 蓝队失守进度 + } + } + } + } +} diff --git a/src/main/java/org/start/player/cuan_song/chuan_song.java b/src/main/java/org/start/player/cuan_song/chuan_song.java new file mode 100644 index 0000000..3ce79aa --- /dev/null +++ b/src/main/java/org/start/player/cuan_song/chuan_song.java @@ -0,0 +1,45 @@ +package org.start.player.cuan_song; + +import org.bukkit.*; +import org.bukkit.entity.*; +import org.start.run; +import org.start.data.worldSpawnItem; + +public class chuan_song { + + private static run plugin; + public chuan_song(run plugin){this.plugin = plugin;} + + //定义传送点位置 + private static Location redLocation; + private static Location blueLocation; + private static Location stopLocation; + + //初始化 + public static void initLocation (){ + redLocation = worldSpawnItem.getRed(); + blueLocation = worldSpawnItem.getBlue(); + stopLocation = worldSpawnItem.getStop(); + } + + //红队 + public static void toRed(Player player){ + if (redLocation != null){ + player.teleport(redLocation); + } + } + + //蓝队 + public static void toBlue(Player player){ + if (blueLocation != null){ + player.teleport(blueLocation); + } + } + + //退出传送 + public static void toStop(Player player){ + if (stopLocation != null){ + player.teleport(stopLocation); + } + } +} diff --git a/src/main/java/org/start/player/main/model/def_path.java b/src/main/java/org/start/player/main/model/def_path.java new file mode 100644 index 0000000..c208721 --- /dev/null +++ b/src/main/java/org/start/player/main/model/def_path.java @@ -0,0 +1,45 @@ +package org.start.player.main.model; + +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.plugin.java.JavaPlugin; +import org.start.data.worldSpawnItem; + +public class def_path { + private static JavaPlugin plugin; + public static void def_path_(JavaPlugin plugin){def_path.plugin = plugin;plugin.getLogger().info("def_path 类初始化操作已完成");} + + + private static Location captureStart; // 占领区域的起始坐标 + private static Location captureEnd; // 占领区域的终止坐标 + + public void initPath(){ + FileConfiguration config = plugin.getConfig(); + World world; + + // 获取区域的起始点和终止点坐标 + double startX = config.getDouble("capture_area.start.x"); + double startY = config.getDouble("capture_area.start.y"); + double startZ = config.getDouble("capture_area.start.z"); + + double endX = config.getDouble("capture_area.end.x"); + double endY = config.getDouble("capture_area.end.y"); + double endZ = config.getDouble("capture_area.end.z"); + + + world = worldSpawnItem.getWorld(); + // 假设玩家所在世界是默认世界 + captureStart = new Location(world, startX, startY, startZ); + captureEnd = new Location(world, endX, endY, endZ); + } + // 获取起始坐标 + public static Location getCaptureStart() { + return captureStart; + } + + // 获取终止坐标 + public static Location getCaptureEnd() { + return captureEnd; + } +} diff --git a/src/main/java/org/start/player/main/model/redAtEvent.java b/src/main/java/org/start/player/main/model/redAtEvent.java new file mode 100644 index 0000000..2f16afc --- /dev/null +++ b/src/main/java/org/start/player/main/model/redAtEvent.java @@ -0,0 +1,13 @@ +package org.start.player.main.model; + +public class redAtEvent { + static boolean b1; + + public void first() {b1 = false;} //初始化,防止为空 + + public static void setB1(boolean b){b1 = b;} + + public static boolean isAt(){ + return b1; + } +} diff --git a/src/main/java/org/start/player/main/model/shi_fo_at.java b/src/main/java/org/start/player/main/model/shi_fo_at.java new file mode 100644 index 0000000..3e76625 --- /dev/null +++ b/src/main/java/org/start/player/main/model/shi_fo_at.java @@ -0,0 +1,43 @@ +package org.start.player.main.model; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.start.data.TeamManager; + +public class shi_fo_at { + static Location start = def_path.getCaptureStart(); + static Location end = def_path.getCaptureEnd(); + + + // 判断玩家是否在占领区域内 + public static boolean isPlayerInRegion(Player player) { + + Location playerLocation = player.getLocation(); + + double minX = Math.min(start.getX(), end.getX()); + double maxX = Math.max(start.getX(), end.getX()); + + double minY = Math.min(start.getY(), end.getY()); + double maxY = Math.max(start.getY(), end.getY()); + + double minZ = Math.min(start.getZ(), end.getZ()); + double maxZ = Math.max(start.getZ(), end.getZ()); + + double playerX = playerLocation.getX(); + double playerY = playerLocation.getY(); + double playerZ = playerLocation.getZ(); + + // 判断玩家是否在区域内 + boolean b = (playerX >= minX && playerX <= maxX) && + (playerY >= minY && playerY <= maxY) && + (playerZ >= minZ && playerZ <= maxZ); + + + String teamName = TeamManager.getPlayer(player.getName()); + boolean r = "red".equalsIgnoreCase(teamName); + if (b && r){ + return true; + } + return false; + } +} diff --git a/src/main/java/org/start/player/main/run_.java b/src/main/java/org/start/player/main/run_.java new file mode 100644 index 0000000..65c4b3a --- /dev/null +++ b/src/main/java/org/start/player/main/run_.java @@ -0,0 +1,83 @@ +package org.start.player.main; + +// ----------- > > > 本类是插件核心调度类 < < < ------------ + +// 统管bossbar模块,用于控制玩家 +// 管玩家区域事件,监听玩家是否位于某一区域 + +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.scheduler.BukkitRunnable; +import org.start.player.bossbar.boss_bar_runs; +import org.start.player.main.model.redAtEvent; +import org.start.player.main.model.shi_fo_at; +import org.start.print; + + +public class run_{ + + private JavaPlugin plugin; // 插件实例,用于访问服务器的API + private double redTeamProgress = 0; // 红队的进攻进度(0-100),初始为0 + private boolean gameEnded = false; // 游戏是否已经结束的标志 + private static boolean b; //用于判断是否有玩家在目标位置 + + public run_(JavaPlugin plugin) { + this.plugin = plugin; + plugin.getLogger().info("run_ 类初始化已完成"); + _start(); // 启动任务 + } + + // 开始定时检查红队进攻进度的任务 + public void _start() { + print.command_p( "i","计时任务正在运行"); + new shi_fo_at(); // 初始化判断类 + new redAtEvent().first(); //初始化,防止出错 + + // 每1秒钟检查一次红队玩家是否在目标区域 + new BukkitRunnable() { + + @Override + public void run() { + + // 如果游戏已经结束,停止定时任务 + if (gameEnded) { + cancel(); // 停止任务 + return; + } + int redTeamPlayersInArea = 0; + // 遍历所有在线玩家,检查红队玩家是否在目标区域 + for (Player player : plugin.getServer().getOnlinePlayers()) { + if (shi_fo_at.isPlayerInRegion(player)) { + b = true; + } + } + + if (b){ + b = false; + redAtEvent.setB1(true); + redTeamPlayersInArea++; // 如果红队玩家在区域内,计数器加1 + boss_bar_runs.onRedTeamProgressChanged(redTeamProgress); + }else { + redAtEvent.setB1(false); + } + + + // 如果有红队玩家在目标区域,增加进度 + if (redTeamPlayersInArea > 0) { + redTeamProgress = Math.min(redTeamProgress + 0.5, 100); // 红队进度加1,最大为100 + // 如果红队进度达到100,游戏结束 + if (redTeamProgress == 100) { + gameOver(); + } + } + } + }.runTaskTimer(plugin, 0L, 10L); // 0L 延迟,20L 间隔,表示每1秒执行一次 + } + + // 游戏结束,触发游戏结束相关操作 + private void gameOver() { + gameEnded = true; // 标记游戏已结束 + plugin.getServer().broadcastMessage("游戏结束!红队胜利!"); // 广播游戏结束消息 + } +} + diff --git a/src/main/java/org/start/player/pCase/pIdName.java b/src/main/java/org/start/player/pCase/pIdName.java new file mode 100644 index 0000000..3945c68 --- /dev/null +++ b/src/main/java/org/start/player/pCase/pIdName.java @@ -0,0 +1,7 @@ +package org.start.player.pCase; + + +// 控制玩家头顶的名字状态 +public class pIdName { + +} diff --git a/src/main/java/org/start/player/pCase/run_.java b/src/main/java/org/start/player/pCase/run_.java new file mode 100644 index 0000000..f30499d --- /dev/null +++ b/src/main/java/org/start/player/pCase/run_.java @@ -0,0 +1,9 @@ +package org.start.player.pCase; + +// 主类,用于控制: +// 玩家头顶的名字系统 +// 玩家抗性系统 +// 玩家血量系统 +// 玩家盔甲颜色系统 +public class run_ { +} diff --git a/src/main/java/org/start/print.java b/src/main/java/org/start/print.java new file mode 100644 index 0000000..68c780c --- /dev/null +++ b/src/main/java/org/start/print.java @@ -0,0 +1,45 @@ +package org.start; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; + +public class print { + private static JavaPlugin plugin; + public print(JavaPlugin plugin){print.plugin = plugin;plugin.getLogger().info("print 类初始化操作已完成");} + + public static void command_p(String type, String msg) { + if (type.equals("w")) { + plugin.getLogger().info("\033[33m[Waring] \033[0m" + msg); + } else if (type.equals("i")) { + plugin.getLogger().info("\033[34m[Info] \033[0m" + msg); + } else if (type.equals("e")) { + plugin.getLogger().info("\033[31m[Error] \033[0m" + msg); + } else { + plugin.getLogger().info("\033[33m[Waring] \033[0m" + "意外的输出调用" + type + "(信息内容:" + msg + ")"); + } + } + + public static void player_p(Player player, String msg){ + /** + * 负责玩家的消息发送 + * + * @param player 玩家对象 + * @param msg 使用&作为转义符, 字体类型:l加粗 n下划线 o斜体 m删除线 r重置效果 + */ + String msg_ = ChatColor.translateAlternateColorCodes('&', msg); //转义 + player.sendMessage(msg_); + + } + + public static void boardChat(String msg){ + /** + * 负责广播消息 + * + * @param msg 使用&作为转义符, 字体类型:l加粗 n下划线 o斜体 m删除线 r重置效果 + */ + String msg_ = ChatColor.translateAlternateColorCodes('&', "&e[server] &f"+msg); //转义 + Bukkit.broadcastMessage(msg_); + } +} diff --git a/src/main/java/org/start/run.java b/src/main/java/org/start/run.java new file mode 100644 index 0000000..c558356 --- /dev/null +++ b/src/main/java/org/start/run.java @@ -0,0 +1,71 @@ +/* +* +* 本项目已于 2025.1.20 存档,目前停止开发 +* +* ===================================================================== +* +* 当前进度 +* player -> main -> event -> say 待修复 +* tip: 目前存在异常输出的问题 +* +* +* player -> main -> pCase 当前开发进度 +* +* ====================================================================== +* +*如果你认为项目能帮到你,并且你可以继续完成剩余的开发工作 +*亦或者你想看到项目的最终成品,想要 Da_nuo & BRanulf_Lode 继续完成开发,我们会考虑 +* +* +* 感谢! +*/ + + +/* +本项目进入静默开发阶段 >︿< + */ +package org.start; + +import org.bukkit.event.Listener; +import org.bukkit.plugin.java.JavaPlugin; + +import org.start.command.commandTab; +import org.start.command.command; +import org.start.player.cuan_song.chuan_song; +import org.start.data.worldSpawnItem; +import org.start.player.main.model.def_path; +import org.start.player.bossbar.boss_bar_runs; +import org.start.player.main.run_; + + +public class run extends JavaPlugin implements Listener { + + @Override + public void onEnable() { + saveDefaultConfig(); //加载默认配置 + + // 截至目前,加入队伍后出现报错,可能是管理进度条的类出现问题。 + + //开始初始化 这几句都是爷,必须最先初始化 + new print(this); // <------- 初始化信息输出类,位于当前文件 + new worldSpawnItem(this); // <------- 初始化传送点获取类,位于data + def_path.def_path_(this); // <------- 初始化玩家占领点获取类,位于player -> main + new def_path().initPath(); // <------- 初始化占领点位置 + new boss_bar_runs(this); // <------- 初始化进度条类,位于player -> main + boss_bar_runs.main_runs_(); // <------- 实例化进度条辅助类 + new run_(this); // <------- 初始化核心调度类 + + + new chuan_song(this).initLocation(); //初始化玩家传送点 (这个this真的给我整红温了) + + + // 开始注册监听器 + getCommand("war").setExecutor(new command()); //注册命令执行器 + getCommand("war").setTabCompleter(new commandTab()); //注册命令补全器 + + //getServer().getPluginManager().registerEvents(new set_spawn(this), this); //注册玩家加入队伍后管理传送的监听器 (重生后移动) + + getLogger().info("\033[92m" + "守塔模式 插件加载成功!" + "\033[0m"); + getLogger().info("\033[92m" + "作者:Da_nuo & BRanulf_Lode" + "\033[0m"); + } +} \ No newline at end of file diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 0000000..f439750 --- /dev/null +++ b/src/main/resources/config.yml @@ -0,0 +1,44 @@ +#========================================================== +# +# -------->>> 守塔模式 - 内部插件,请勿外传 <<<--------- +# +# +# 作者:Da_nuo & BRanulf_Lode +# +#=========================================================== + +#世界名 +world: world + +#指定进攻方玩家的重生位置 +red_path: + x: 0 + y: 50 + z: 0 + +#指定防守方的位置 +blue_path: + x: 20 + y: 50 + z: 0 + +#指定玩家离开时的位置 +stop_path: + x: 0 + y: 50 + z: 20 + +#指定检测区域,当这个区域出现进攻方玩家时,即判断有人开始攻占。 +capture_area: + start: + x: 100 + y: 65 + z: 100 + end: + x: 110 + y: 70 + z: 110 + + + + diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..15416ad --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,14 @@ +name: keep_mode +main: org.start.run +version: 1.0.0 +description: 可以为服务器提供一个守塔模式,用于守塔玩法。 +api-version: 1.20 +commands: + war: + description: 打招呼的命令 + permission: war.player + +permissions: + war.player: + description: 供玩家进行队伍选择 + default: true diff --git a/target/classes/config.yml b/target/classes/config.yml new file mode 100644 index 0000000..f439750 --- /dev/null +++ b/target/classes/config.yml @@ -0,0 +1,44 @@ +#========================================================== +# +# -------->>> 守塔模式 - 内部插件,请勿外传 <<<--------- +# +# +# 作者:Da_nuo & BRanulf_Lode +# +#=========================================================== + +#世界名 +world: world + +#指定进攻方玩家的重生位置 +red_path: + x: 0 + y: 50 + z: 0 + +#指定防守方的位置 +blue_path: + x: 20 + y: 50 + z: 0 + +#指定玩家离开时的位置 +stop_path: + x: 0 + y: 50 + z: 20 + +#指定检测区域,当这个区域出现进攻方玩家时,即判断有人开始攻占。 +capture_area: + start: + x: 100 + y: 65 + z: 100 + end: + x: 110 + y: 70 + z: 110 + + + + diff --git a/target/classes/org/start/command/command.class b/target/classes/org/start/command/command.class new file mode 100644 index 0000000..6129d39 Binary files /dev/null and b/target/classes/org/start/command/command.class differ diff --git a/target/classes/org/start/command/commandTab.class b/target/classes/org/start/command/commandTab.class new file mode 100644 index 0000000..eaa018f Binary files /dev/null and b/target/classes/org/start/command/commandTab.class differ diff --git a/target/classes/org/start/data/TeamManager.class b/target/classes/org/start/data/TeamManager.class new file mode 100644 index 0000000..6ae8b25 Binary files /dev/null and b/target/classes/org/start/data/TeamManager.class differ diff --git a/target/classes/org/start/data/worldSpawnItem.class b/target/classes/org/start/data/worldSpawnItem.class new file mode 100644 index 0000000..c23c11b Binary files /dev/null and b/target/classes/org/start/data/worldSpawnItem.class differ diff --git a/target/classes/org/start/player/bossbar/boss_bar_runs.class b/target/classes/org/start/player/bossbar/boss_bar_runs.class new file mode 100644 index 0000000..c0b61cd Binary files /dev/null and b/target/classes/org/start/player/bossbar/boss_bar_runs.class differ diff --git a/target/classes/org/start/player/bossbar/data.class b/target/classes/org/start/player/bossbar/data.class new file mode 100644 index 0000000..43f1f5e Binary files /dev/null and b/target/classes/org/start/player/bossbar/data.class differ diff --git a/target/classes/org/start/player/bossbar/manger.class b/target/classes/org/start/player/bossbar/manger.class new file mode 100644 index 0000000..402c75c Binary files /dev/null and b/target/classes/org/start/player/bossbar/manger.class differ diff --git a/target/classes/org/start/player/cuan_song/chuan_song.class b/target/classes/org/start/player/cuan_song/chuan_song.class new file mode 100644 index 0000000..5a349e4 Binary files /dev/null and b/target/classes/org/start/player/cuan_song/chuan_song.class differ diff --git a/target/classes/org/start/player/main/def_path.class b/target/classes/org/start/player/main/def_path.class new file mode 100644 index 0000000..f6db200 Binary files /dev/null and b/target/classes/org/start/player/main/def_path.class differ diff --git a/target/classes/org/start/player/main/demo.class b/target/classes/org/start/player/main/demo.class new file mode 100644 index 0000000..6e1b091 Binary files /dev/null and b/target/classes/org/start/player/main/demo.class differ diff --git a/target/classes/org/start/player/main/redAtEvent.class b/target/classes/org/start/player/main/redAtEvent.class new file mode 100644 index 0000000..d40d884 Binary files /dev/null and b/target/classes/org/start/player/main/redAtEvent.class differ diff --git a/target/classes/org/start/player/main/run_$1.class b/target/classes/org/start/player/main/run_$1.class new file mode 100644 index 0000000..afa0587 Binary files /dev/null and b/target/classes/org/start/player/main/run_$1.class differ diff --git a/target/classes/org/start/player/main/run_.class b/target/classes/org/start/player/main/run_.class new file mode 100644 index 0000000..1332cf1 Binary files /dev/null and b/target/classes/org/start/player/main/run_.class differ diff --git a/target/classes/org/start/player/main/say$1.class b/target/classes/org/start/player/main/say$1.class new file mode 100644 index 0000000..1136ed0 Binary files /dev/null and b/target/classes/org/start/player/main/say$1.class differ diff --git a/target/classes/org/start/player/main/say.class b/target/classes/org/start/player/main/say.class new file mode 100644 index 0000000..f640bfc Binary files /dev/null and b/target/classes/org/start/player/main/say.class differ diff --git a/target/classes/org/start/player/main/shi_fo_at.class b/target/classes/org/start/player/main/shi_fo_at.class new file mode 100644 index 0000000..fe1aa26 Binary files /dev/null and b/target/classes/org/start/player/main/shi_fo_at.class differ diff --git a/target/classes/org/start/print.class b/target/classes/org/start/print.class new file mode 100644 index 0000000..272fdc3 Binary files /dev/null and b/target/classes/org/start/print.class differ diff --git a/target/classes/org/start/run.class b/target/classes/org/start/run.class new file mode 100644 index 0000000..e719b10 Binary files /dev/null and b/target/classes/org/start/run.class differ diff --git a/target/classes/plugin.yml b/target/classes/plugin.yml new file mode 100644 index 0000000..15416ad --- /dev/null +++ b/target/classes/plugin.yml @@ -0,0 +1,14 @@ +name: keep_mode +main: org.start.run +version: 1.0.0 +description: 可以为服务器提供一个守塔模式,用于守塔玩法。 +api-version: 1.20 +commands: + war: + description: 打招呼的命令 + permission: war.player + +permissions: + war.player: + description: 供玩家进行队伍选择 + default: true diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties new file mode 100644 index 0000000..510e1a6 --- /dev/null +++ b/target/maven-archiver/pom.properties @@ -0,0 +1,3 @@ +artifactId=untitled +groupId=org.example +version=1.0-SNAPSHOT diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..09427ba --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,17 @@ +org\start\player\bossbar\manger.class +org\start\run.class +org\start\player\bossbar\boss_bar_runs.class +org\start\player\main\def_path.class +org\start\player\main\demo.class +org\start\player\main\redAtEvent.class +org\start\player\main\run_.class +org\start\player\cuan_song\chuan_song.class +org\start\player\main\say$1.class +org\start\player\main\say.class +org\start\command\commandTab.class +org\start\print.class +org\start\player\bossbar\data.class +org\start\data\TeamManager.class +org\start\player\main\run_$1.class +org\start\player\main\shi_fo_at.class +org\start\command\command.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..b98c961 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,16 @@ +D:\project\java\mc_spring_1.20\守塔模式\src\main\java\org\start\player\bossbar\boss_bar_runs.java +D:\project\java\mc_spring_1.20\守塔模式\src\main\java\org\start\player\main\run_.java +D:\project\java\mc_spring_1.20\守塔模式\src\main\java\org\start\player\cuan_song\chuan_song.java +D:\project\java\mc_spring_1.20\守塔模式\src\main\java\org\start\player\main\demo.java +D:\project\java\mc_spring_1.20\守塔模式\src\main\java\org\start\data\TeamManager.java +D:\project\java\mc_spring_1.20\守塔模式\src\main\java\org\start\data\worldSpawnItem.java +D:\project\java\mc_spring_1.20\守塔模式\src\main\java\org\start\player\bossbar\data.java +D:\project\java\mc_spring_1.20\守塔模式\src\main\java\org\start\command\command.java +D:\project\java\mc_spring_1.20\守塔模式\src\main\java\org\start\player\main\redAtEvent.java +D:\project\java\mc_spring_1.20\守塔模式\src\main\java\org\start\print.java +D:\project\java\mc_spring_1.20\守塔模式\src\main\java\org\start\player\bossbar\manger.java +D:\project\java\mc_spring_1.20\守塔模式\src\main\java\org\start\player\main\def_path.java +D:\project\java\mc_spring_1.20\守塔模式\src\main\java\org\start\player\main\say.java +D:\project\java\mc_spring_1.20\守塔模式\src\main\java\org\start\run.java +D:\project\java\mc_spring_1.20\守塔模式\src\main\java\org\start\command\commandTab.java +D:\project\java\mc_spring_1.20\守塔模式\src\main\java\org\start\player\main\shi_fo_at.java diff --git a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..e69de29 diff --git a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..e69de29