From c1b5c1bfd6f4b034c58353b86c21fde18dec6320 Mon Sep 17 00:00:00 2001 From: yaohunya <31456652@qq.com> Date: Wed, 30 Oct 2024 20:39:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 + pom.xml | 52 +++ .../java/com/yaohun/wheatwar/WheatWar.java | 56 +++ .../wheatwar/effect/SummonTheVillager.java | 82 ++++ .../java/com/yaohun/wheatwar/game/Game.java | 107 ++++++ .../com/yaohun/wheatwar/game/GameSite.java | 36 ++ .../java/com/yaohun/wheatwar/game/Point.java | 94 +++++ .../java/com/yaohun/wheatwar/game/Region.java | 69 ++++ .../wheatwar/listener/GameEffectListener.java | 352 ++++++++++++++++++ .../wheatwar/listener/GameListener.java | 6 + .../yaohun/wheatwar/listener/GamePotect.java | 62 +++ .../wheatwar/listener/JoinListener.java | 25 ++ src/main/java/tools/BossBarUtil.java | 43 +++ src/main/java/tools/CDTimeAPI.java | 66 ++++ src/main/java/tools/GameUtil.java | 83 +++++ src/main/java/tools/RandomUtil.java | 36 ++ src/main/java/tools/StackUtil.java | 17 + src/main/resources/plugin.yml | 8 + 18 files changed, 1197 insertions(+) create mode 100644 .gitignore create mode 100644 pom.xml create mode 100644 src/main/java/com/yaohun/wheatwar/WheatWar.java create mode 100644 src/main/java/com/yaohun/wheatwar/effect/SummonTheVillager.java create mode 100644 src/main/java/com/yaohun/wheatwar/game/Game.java create mode 100644 src/main/java/com/yaohun/wheatwar/game/GameSite.java create mode 100644 src/main/java/com/yaohun/wheatwar/game/Point.java create mode 100644 src/main/java/com/yaohun/wheatwar/game/Region.java create mode 100644 src/main/java/com/yaohun/wheatwar/listener/GameEffectListener.java create mode 100644 src/main/java/com/yaohun/wheatwar/listener/GameListener.java create mode 100644 src/main/java/com/yaohun/wheatwar/listener/GamePotect.java create mode 100644 src/main/java/com/yaohun/wheatwar/listener/JoinListener.java create mode 100644 src/main/java/tools/BossBarUtil.java create mode 100644 src/main/java/tools/CDTimeAPI.java create mode 100644 src/main/java/tools/GameUtil.java create mode 100644 src/main/java/tools/RandomUtil.java create mode 100644 src/main/java/tools/StackUtil.java create mode 100644 src/main/resources/plugin.yml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d7571ed --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/target/ +/out/ +/.idea/ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..5258e2d --- /dev/null +++ b/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + + org.example + WheatWar + 1.0-SNAPSHOT + + + 17 + 17 + + + + + + public-rpg + https://repo.aurora-pixels.com/repository/public/ + + + + + + org.spigotmc + spigot-api + 1.18.2 + + + net.md5.bungee + BungeeCord + 1.12.2 + + + com.fastasyncworldedit.bukkit + FastAsyncWorldEdit + 1.18.2 + + + de.tr7zw.nbtapi + NbtAPI + 2.11.3 + + + com.yaohun.teleport-API + JGTeleportSpigot + 1.0.0 + + + + \ No newline at end of file diff --git a/src/main/java/com/yaohun/wheatwar/WheatWar.java b/src/main/java/com/yaohun/wheatwar/WheatWar.java new file mode 100644 index 0000000..1fe424a --- /dev/null +++ b/src/main/java/com/yaohun/wheatwar/WheatWar.java @@ -0,0 +1,56 @@ +package com.yaohun.wheatwar; + +import com.yaohun.wheatwar.effect.SummonTheVillager; +import com.yaohun.wheatwar.game.Game; +import com.yaohun.wheatwar.listener.GameEffectListener; +import com.yaohun.wheatwar.listener.GameListener; +import com.yaohun.wheatwar.listener.GamePotect; +import com.yaohun.wheatwar.listener.JoinListener; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +import tools.GameUtil; + +public class WheatWar extends JavaPlugin { + + private static WheatWar instance; + private static Game game; + + @Override + public void onEnable() { + instance = this; + game = new Game(); + getServer().getPluginManager().registerEvents(new GameEffectListener(),this); + getServer().getPluginManager().registerEvents(new GameListener(),this); + getServer().getPluginManager().registerEvents(new GamePotect(),this); + getServer().getPluginManager().registerEvents(new JoinListener(),this); + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String Command, String[] args) { + if (Command.equalsIgnoreCase("livegift")) { + // RepairGiftGui.OpenGui((Player) sender); + return true; + } + if (Command.equalsIgnoreCase("gameedit")) { + // GameEditGui.OpenGui((Player) sender); + return true; + } + if (Command.equalsIgnoreCase("game")) { + if (args.length == 0) { + sender.sendMessage("/game start - 开始游戏"); + return true; + } + if(args.length == 1 && args[0].equalsIgnoreCase("test1")){ + SummonTheVillager.apply(getGame(),(Player) sender,"1111",1); + sender.sendMessage("执行成功."); + } + } + return false; + } + + public static WheatWar inst(){return instance;} + + public static Game getGame() {return game;} +} diff --git a/src/main/java/com/yaohun/wheatwar/effect/SummonTheVillager.java b/src/main/java/com/yaohun/wheatwar/effect/SummonTheVillager.java new file mode 100644 index 0000000..72ebe9a --- /dev/null +++ b/src/main/java/com/yaohun/wheatwar/effect/SummonTheVillager.java @@ -0,0 +1,82 @@ +package com.yaohun.wheatwar.effect; + +import com.yaohun.wheatwar.WheatWar; +import com.yaohun.wheatwar.game.Game; +import org.bukkit.Effect; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.entity.Villager; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; +import org.bukkit.util.Vector; +import tools.CDTimeAPI; + +import java.util.UUID; + +public class SummonTheVillager { + + public static void apply(Game game, Player zhubo, String userName, int amount) { + if (!game.isStarted()) { + return; + } + // 获取主播的uuid + UUID uuid = zhubo.getUniqueId(); + // 计时器key + String timepieceKey = "SummonVillagerEffect"; + startTimepieceEvent(game,zhubo,userName,timepieceKey); + if(CDTimeAPI.isCD(uuid,timepieceKey)){ + long newTime = CDTimeAPI.getCD(uuid,timepieceKey) + (245L * amount); + CDTimeAPI.setPlayerCD(uuid,timepieceKey,newTime); + } else { + CDTimeAPI.setPlayerCD(uuid,timepieceKey,245L * amount); + } + } + + public static void startTimepieceEvent(Game game, Player zhubo, String userName, String timepieceKey) { + if (CDTimeAPI.isCD(zhubo.getUniqueId(), timepieceKey)) { + return; + } + BukkitTask task = new BukkitRunnable() { + @Override + public void run() { + if (!CDTimeAPI.isCD(zhubo.getUniqueId(), timepieceKey)) { + cancel(); + return; + } + spawnMobs(game,userName); + } + }.runTaskTimer(WheatWar.inst(), 0L, 5L); + game.addTasks(task); + } + public static void spawnMobs(Game game,String userName) { + Location location = game.getFarmlandRandom().clone().add(0,1,0); + Villager entity = (Villager) location.getWorld().spawnEntity(location, EntityType.VILLAGER); + entity.setProfession(Villager.Profession.FARMER); + entity.setCustomNameVisible(true); + entity.setCustomName("§a" + userName); + Location centralPoint = game.getCentralPoint(); + // 计算方向 + Vector direction = centralPoint.toVector().subtract(location.toVector()).normalize(); + // 设置初速度 + double initialVerticalVelocity = 0.4; // 向上抛的速度 + double horizontalVelocity = 1.35; // 控制水平抛出的力度 + // 创建一个向量,包括水平和垂直方向的速度 + Vector velocity = direction.multiply(horizontalVelocity).setY(initialVerticalVelocity); + entity.setVelocity(velocity); + new BukkitRunnable() { + private int i = 0; + @Override + public void run() { + if(i >= 15){ + cancel(); + return; + } + game.getWorld().spawnParticle(Particle.ELECTRIC_SPARK,entity.getLocation().clone().add(0,1,0),2); + //game.getWorld().spawnParticle(Particle.VILLAGER_HAPPY,entity.getLocation().clone().add(0,1,0),2); + i++; + } + }.runTaskTimer(WheatWar.inst(),0,1L); + } +} diff --git a/src/main/java/com/yaohun/wheatwar/game/Game.java b/src/main/java/com/yaohun/wheatwar/game/Game.java new file mode 100644 index 0000000..6bccbb5 --- /dev/null +++ b/src/main/java/com/yaohun/wheatwar/game/Game.java @@ -0,0 +1,107 @@ +package com.yaohun.wheatwar.game; + +import com.yaohun.wheatwar.WheatWar; +import org.bukkit.*; +import org.bukkit.block.Block; +import org.bukkit.block.data.Ageable; +import org.bukkit.block.data.BlockData; +import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarStyle; +import org.bukkit.boss.BossBar; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; +import tools.BossBarUtil; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Random; + +public class Game { + + private World world; + private Region region; + private BossBar bossBar1; + private BossBar bossBar2; + private boolean started = false; + private Location centralPoint; + private List wheatList = new ArrayList<>(); + private List tasks = new ArrayList<>(); + public Game(){ + this.world = Bukkit.getWorld("world"); + this.region = new Region(world,new Point(-30,68,-33),new Point(32,68,29)); + this.centralPoint = new Location(world,1,72,-2); + this.bossBar1 = Bukkit.createBossBar("今日挑战进度", BarColor.WHITE, BarStyle.SEGMENTED_10); + this.bossBar2 = Bukkit.createBossBar("补种进度", BarColor.GREEN, BarStyle.SEGMENTED_20); + loadGameMapFarmland(); + } + + private void updateCompleteWheatGoalBossBar() { + int cNow = GameSite.getMatureWheatAmount(); + int cMax = wheatList.size(); + double d = (double) cNow / (double) cMax; + String bossTitle = "§6成熟小麦数量§c: §f"+cNow+" §b("+String.format("%.2f",(d*100))+"%)"; + bossBar2.setTitle(bossTitle); + BossBarUtil.setBarColor(bossBar2,d); + BossBarUtil.setBarProgress(bossBar2,d); + } + + + + public void start(){ + if (started) { + return; + } + this.started = true; + tasks.add(new BukkitRunnable() { + @Override + public void run() { + updateCompleteWheatGoalBossBar(); + } + }.runTaskTimer(WheatWar.inst(), 0L, 5L)); + } + + public void initPlayerData(Player player) { + player.setArrowCooldown(6000); + player.setGameMode(GameMode.SURVIVAL); + player.setAllowFlight(true); + // bossBar1.addPlayer(player); + bossBar2.addPlayer(player); + } + + + public Location getFarmlandRandom(){ + List locationList = getWheatList(); + Collections.shuffle(locationList); + Random random = new Random(); + return locationList.get(random.nextInt(locationList.size())); + } + public World getWorld() {return world;} + public List getWheatList() {return wheatList;} + public Region getRegion() {return region;} + public Location getCentralPoint() {return centralPoint;} + public boolean isStarted() {return started;} + public void addTasks(BukkitTask task){ + this.tasks.add(task); + } + + public void loadGameMapFarmland(){ + List locationList = new ArrayList<>(); + for (int y = (int) Math.floor(67); y <= 67; y++) { + for (int x = (int) Math.floor(region.getMin().getX()); x <= region.getMax().getX(); x++) { + for (int z = (int) Math.floor(region.getMin().getZ()); z <= region.getMax().getZ(); z++) { + Block block = region.getWorld().getBlockAt(x, y, z); + if (!block.getType().equals(Material.AIR)) { + if(block.getType().equals(Material.FARMLAND)){ + locationList.add(block.getLocation().clone().add(0,1,0)); + } + } + } + } + } + this.wheatList = locationList; + Bukkit.getConsoleSender().sendMessage("[日志 - 保卫小麦] 游戏地图:"); + Bukkit.getConsoleSender().sendMessage(" - "+this.wheatList.size()+"块小麦"); + } +} diff --git a/src/main/java/com/yaohun/wheatwar/game/GameSite.java b/src/main/java/com/yaohun/wheatwar/game/GameSite.java new file mode 100644 index 0000000..19fffb5 --- /dev/null +++ b/src/main/java/com/yaohun/wheatwar/game/GameSite.java @@ -0,0 +1,36 @@ +package com.yaohun.wheatwar.game; + +import com.yaohun.wheatwar.WheatWar; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.data.Ageable; +import org.bukkit.block.data.BlockData; + +import java.util.ArrayList; +import java.util.List; + +public class GameSite { + + // 获取已成熟小麦数量 + public static int getMatureWheatAmount(){ + Game game = WheatWar.getGame(); + World world = game.getWorld(); + List locationList = game.getWheatList(); + int i = 0; + for (Location location : locationList){ + Block block = world.getBlockAt(location); + if (!block.getType().equals(Material.AIR)) { + BlockData blockData = block.getBlockData(); + if (blockData instanceof Ageable ageable) { + if (ageable.getAge() == 7) { + i++; + } + } + } + } + return i; + } + +} diff --git a/src/main/java/com/yaohun/wheatwar/game/Point.java b/src/main/java/com/yaohun/wheatwar/game/Point.java new file mode 100644 index 0000000..1693095 --- /dev/null +++ b/src/main/java/com/yaohun/wheatwar/game/Point.java @@ -0,0 +1,94 @@ +package com.yaohun.wheatwar.game; + +import com.sk89q.worldedit.math.BlockVector3; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.configuration.ConfigurationSection; + +import java.util.Objects; + +public class Point { + + private double x; + private double y; + private double z; + + public Point(int x, int y, int z) { + this.x = x; + this.y = y; + this.z = z; + } + + public Point(double x, double y, double z) { + this.x = x; + this.y = y; + this.z = z; + } + + public double getX() { + return x; + } + + public double getY() { + return y; + } + + public double getZ() { + return z; + } + + public void setX(double x) { + this.x = x; + } + + public void setY(double y) { + this.y = y; + } + + public void setZ(double z) { + this.z = z; + } + + public Point clone() { + return new Point(x, y, z); + } + + public Location toLocation(World world) { + return new Location(world, x, y, z, 0, 0); + } + + public static Point of(Location location) { + return new Point(location.getX(), location.getY(), location.getZ()); + } + + public static Point deserialize(ConfigurationSection section) { + return new Point(section.getDouble("x"), section.getDouble("y"), section.getDouble("z")); + } + + public BlockVector3 toBlockVector3() { + return BlockVector3.at(x, y, z); + } + + @Override + public String toString() { + return "Point{" + + "x=" + x + + ", y=" + y + + ", z=" + z + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Point point = (Point) o; + return Double.compare(point.x, x) == 0 && Double.compare(point.y, y) == 0 && Double.compare(point.z, z) == 0; + } + + @Override + public int hashCode() { + return Objects.hash(x, y, z); + } + +} diff --git a/src/main/java/com/yaohun/wheatwar/game/Region.java b/src/main/java/com/yaohun/wheatwar/game/Region.java new file mode 100644 index 0000000..cfab9d9 --- /dev/null +++ b/src/main/java/com/yaohun/wheatwar/game/Region.java @@ -0,0 +1,69 @@ +package com.yaohun.wheatwar.game; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.configuration.ConfigurationSection; + +public class Region { + + private World world; + private Point min; + private Point max; + + public Region(World world, Point min, Point max) { + this.world = world; + this.min = min; + this.max = max; + } + + public World getWorld() { + return world; + } + + public Point getMin() { + return min; + } + + public Point getMax() { + return max; + } + + public void setMax(Point max) { + this.max = max; + } + + public void setMin(Point min) { + this.min = min; + } + + public static Region deserialize(ConfigurationSection section) { + World world1 = Bukkit.getWorld(section.getString("world")); + Point point1 = Point.deserialize(section.getConfigurationSection("min")); + Point point2 = Point.deserialize(section.getConfigurationSection("max")); + return new Region(world1, point1, point2); + } + + public boolean isInRegion(Location location) { + if (!location.getWorld().getName().equalsIgnoreCase(world.getName())) { + return false; + } + return (location.getBlockX() >= this.min.getX() + && location.getBlockX() <= this.max.getX() + && location.getBlockY() >= this.min.getY() + && location.getBlockY() <= this.max.getY() + && location.getBlockZ() >= this.min.getZ() + && location.getBlockZ() <= this.max.getZ()); + } + + public boolean isInRegionPlayer(Location location) { + if (!location.getWorld().getName().equalsIgnoreCase(world.getName())) { + return false; + } + return (location.getBlockX() >= this.min.getX()-1 + && location.getBlockX() <= this.max.getX()+1 + && location.getBlockZ() >= this.min.getZ()-1 + && location.getBlockZ() <= this.max.getZ()+1); + } + +} diff --git a/src/main/java/com/yaohun/wheatwar/listener/GameEffectListener.java b/src/main/java/com/yaohun/wheatwar/listener/GameEffectListener.java new file mode 100644 index 0000000..0d838b1 --- /dev/null +++ b/src/main/java/com/yaohun/wheatwar/listener/GameEffectListener.java @@ -0,0 +1,352 @@ +package com.yaohun.wheatwar.listener; + +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.*; +import org.bukkit.block.Block; +import org.bukkit.block.data.Ageable; +import org.bukkit.block.data.type.Farmland; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.entity.TNTPrimed; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; +import tools.CDTimeAPI; +import tools.RandomUtil; + +import java.util.UUID; + +public class GameEffectListener implements Listener { + + /* + * 当玩家手持物品右键指定方块时触发效果 + * */ + @EventHandler + public void onPotion_drop_Main(PlayerInteractEvent e) { + Player p = e.getPlayer(); + ItemStack item = p.getInventory().getItemInMainHand(); + if (item.getType() != Material.AIR && item.getType() == Material.SPLASH_POTION) { + Block block = e.getClickedBlock(); + if (e.getAction() == Action.RIGHT_CLICK_BLOCK || e.getAction() == Action.LEFT_CLICK_BLOCK) { + boolean sound_butt = false; + Location location = block.getLocation(); + // 检测 3x2x3范围中的方块 + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + for (int z = -1; z <= 1; z++) { + Block newBlock = location.getWorld().getBlockAt(location.clone().add(x, y, z)); + // 判断方块是否是泥土 + if (newBlock.getType() == Material.FARMLAND) { + Farmland fdata = (Farmland) newBlock.getBlockData(); + if (fdata.getMoisture() < 7) { + sound_butt = true; + fdata.setMoisture(fdata.getMaximumMoisture()); + newBlock.setBlockData(fdata); + location.getWorld().spawnParticle(Particle.CRIMSON_SPORE, newBlock.getLocation().add(0.5, 0.5, 0.5), 3, 0.5, 0.5, 0.5, 0.1); + } + } + } + } + } + if (sound_butt) { + p.playSound(p.getLocation(), Sound.ITEM_BUCKET_EMPTY, 1, 1); + } + } + } + } + + + @EventHandler + public void onPotion_drop_Off(PlayerInteractEvent e) { + Player p = e.getPlayer(); + ItemStack item = p.getInventory().getItemInOffHand(); + if (item.getType() != Material.AIR && item.getType() == Material.SPLASH_POTION) { + Block block = e.getClickedBlock(); + if (e.getAction() == Action.RIGHT_CLICK_BLOCK || e.getAction() == Action.LEFT_CLICK_BLOCK) { + boolean sound_butt = false; + Location location = block.getLocation(); + // 检测 3x2x3范围中的方块 + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + for (int z = -1; z <= 1; z++) { + Block newBlock = location.getWorld().getBlockAt(location.clone().add(x, y, z)); + // 判断方块是否是泥土 + if (newBlock.getType() == Material.FARMLAND) { + Farmland fdata = (Farmland) newBlock.getBlockData(); + if (fdata.getMoisture() < 7) { + sound_butt = true; + fdata.setMoisture(fdata.getMaximumMoisture()); + newBlock.setBlockData(fdata); + location.getWorld().spawnParticle(Particle.CRIMSON_SPORE, newBlock.getLocation().add(0.5, 0.5, 0.5), 3, 0.5, 0.5, 0.5, 0.1); + } + } + } + } + } + if (sound_butt) { + p.playSound(p.getLocation(), Sound.ITEM_BUCKET_EMPTY, 1, 1); + } + } + } + } + + @EventHandler + public void onBone_meal_Main(PlayerInteractEvent e) { + Player p = e.getPlayer(); + Block block = e.getClickedBlock(); + if (e.getAction() == Action.RIGHT_CLICK_BLOCK || e.getAction() == Action.LEFT_CLICK_BLOCK) { + ItemStack item = p.getInventory().getItemInMainHand(); + // 检测手持物品是否是骨粉 + if (item.getType() == Material.BONE_MEAL) { + e.setCancelled(true); + boolean sound_butt = false; + Location location = block.getLocation(); + // 检测 3x2x3范围中的方块 + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + for (int z = -1; z <= 1; z++) { + Block newBlock = location.getWorld().getBlockAt(location.clone().add(x, y, z)); + if(newBlock.getType() == Material.WHEAT){ + if(newBlock.getBlockData() instanceof Ageable) { + Ageable ageable = (Ageable) newBlock.getBlockData(); + if (ageable.getAge() < 7) { + sound_butt = true; + ageable.setAge(ageable.getMaximumAge()); + newBlock.setBlockData(ageable); + block.getWorld().spawnParticle(Particle.VILLAGER_HAPPY, newBlock.getLocation().add(0.5, 0.5, 0.5), 3, 0.5, 0.5, 0.5, 0.1); + } + } + } + } + } + } + if(sound_butt){ + p.playSound(p.getLocation(),Sound.BLOCK_CROP_BREAK,1,1); + } + } + } + } + @EventHandler + public void onBone_meal_Off(PlayerInteractEvent e) { + Player p = e.getPlayer(); + Block block = e.getClickedBlock(); + if (e.getAction() == Action.RIGHT_CLICK_BLOCK || e.getAction() == Action.LEFT_CLICK_BLOCK) { + ItemStack item = p.getInventory().getItemInOffHand(); + // 检测手持物品是否是骨粉 + if (item.getType() == Material.BONE_MEAL) { + e.setCancelled(true); + boolean sound_butt = false; + Location location = block.getLocation(); + // 检测 3x2x3范围中的方块 + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + for (int z = -1; z <= 1; z++) { + Block newBlock = location.getWorld().getBlockAt(location.clone().add(x, y, z)); + if(newBlock.getType() == Material.WHEAT){ + if(newBlock.getBlockData() instanceof Ageable) { + Ageable ageable = (Ageable) newBlock.getBlockData(); + if (ageable.getAge() < 7) { + sound_butt = true; + ageable.setAge(ageable.getMaximumAge()); + newBlock.setBlockData(ageable); + block.getWorld().spawnParticle(Particle.VILLAGER_HAPPY, newBlock.getLocation().add(0.5, 0.5, 0.5), 3, 0.5, 0.5, 0.5, 0.1); + } + } + } + } + } + } + if(sound_butt){ + p.playSound(p.getLocation(),Sound.BLOCK_CROP_BREAK,1,1); + } + } + } + } + + @EventHandler + public void onWheat_Seeds(PlayerInteractEvent e){ + Player p = e.getPlayer(); + Block block = e.getClickedBlock(); + if(e.getAction() == Action.RIGHT_CLICK_BLOCK || e.getAction() == Action.LEFT_CLICK_BLOCK) { + ItemStack item = p.getInventory().getItemInMainHand(); + // 检测手持物品是否是小麦种子 + if (item.getType() == Material.WHEAT_SEEDS) { + boolean sound_butt = false; + // 获取玩家点击方块的坐标 + Location location = block.getLocation(); + if (p.isSneaking()) { + // 检索到泥土方块后判断方块是否是湿润状态 + if (block.getBlockData() instanceof Farmland) { + Farmland farmland = (Farmland) block.getBlockData(); + // 如果没有打湿则跳过 + if (farmland.getMoisture() != 7) { + return; + } + // 获取泥土方块上方是否有小麦 + Block blockWheat = block.getRelative(0, 1, 0); + if (blockWheat.getType() == Material.AIR) { + blockWheat.setType(Material.WHEAT); + if (blockWheat.getBlockData() instanceof Ageable) { + // 将小麦设置为刚种下时的阶段 + Ageable wheat = (Ageable) blockWheat.getBlockData(); + wheat.setAge(3); + blockWheat.setBlockData(wheat); + p.playSound(p.getLocation(), Sound.BLOCK_AMETHYST_BLOCK_PLACE, 1, 1); + block.getWorld().spawnParticle(Particle.VILLAGER_HAPPY, blockWheat.getLocation().add(0.5, 0.5, 0.5), 3, 0.5, 0.5, 0.5, 0.1); + } + } + } + } else { + if(block.getType() == Material.FARMLAND){ + if (block.getBlockData() instanceof Farmland) { + Farmland farmland = (Farmland) block.getBlockData(); + if (farmland.getMoisture() != 7) { + e.setCancelled(true); + } + } + } + // 检测 3x2x3范围中的方块 + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 0; y++) { + for (int z = -1; z <= 1; z++) { + Block newBlock = location.getWorld().getBlockAt(location.clone().add(x, y, z)); + // 检索到泥土方块后判断方块是否是湿润状态 + if (newBlock.getBlockData() instanceof Farmland) { + Farmland farmland = (Farmland) newBlock.getBlockData(); + // 如果没有打湿则跳过遍历 + if (farmland.getMoisture() != 7) { + continue; + } + // 获取泥土方块上方是否有小麦 + Block blockWheat = newBlock.getRelative(0, 1, 0); + if (blockWheat.getType() == Material.AIR) { + blockWheat.setType(Material.WHEAT); + if (blockWheat.getBlockData() instanceof Ageable) { + // 将小麦设置为刚种下时的阶段 + Ageable wheat = (Ageable) blockWheat.getBlockData(); + wheat.setAge(3); + blockWheat.setBlockData(wheat); + block.getWorld().spawnParticle(Particle.VILLAGER_HAPPY, blockWheat.getLocation().add(0.5, 0.5, 0.5), 3, 0.5, 0.5, 0.5, 0.1); + sound_butt = true; + } + }else if (block.getType() == Material.WHEAT) { + if (block.getBlockData() instanceof Ageable) { + // 将小麦设置为刚种下时的阶段 + Ageable ageable = (Ageable) block.getBlockData(); + if (ageable.getAge() < 3) { + ageable.setAge(3); + block.setBlockData(ageable); + block.getWorld().spawnParticle(Particle.VILLAGER_HAPPY, blockWheat.getLocation().add(0.5, 0.5, 0.5), 3, 0.5, 0.5, 0.5, 0.1); + sound_butt = true; + } + } + } + } + } + } + } + if(sound_butt){ + p.playSound(p.getLocation(),Sound.BLOCK_CROP_BREAK,1,1); + } + } + } + } + } + + + @EventHandler + public void onWheat_Seeds_off(PlayerInteractEvent e){ + Player p = e.getPlayer(); + Block block = e.getClickedBlock(); + if(e.getAction() == Action.RIGHT_CLICK_BLOCK || e.getAction() == Action.LEFT_CLICK_BLOCK) { + ItemStack item = p.getInventory().getItemInOffHand(); + // 检测手持物品是否是小麦种子 + if (item.getType() == Material.WHEAT_SEEDS) { + boolean sound_butt = false; + // 获取玩家点击方块的坐标 + Location location = block.getLocation(); + if (p.isSneaking()) { + // 检索到泥土方块后判断方块是否是湿润状态 + if (block.getBlockData() instanceof Farmland) { + Farmland farmland = (Farmland) block.getBlockData(); + // 如果没有打湿则跳过 + if (farmland.getMoisture() != 7) { + return; + } + // 获取泥土方块上方是否有小麦 + Block blockWheat = block.getRelative(0, 1, 0); + if (blockWheat.getType() == Material.AIR) { + blockWheat.setType(Material.WHEAT); + if (blockWheat.getBlockData() instanceof Ageable) { + // 将小麦设置为刚种下时的阶段 + Ageable wheat = (Ageable) blockWheat.getBlockData(); + wheat.setAge(3); + blockWheat.setBlockData(wheat); + p.playSound(p.getLocation(), Sound.BLOCK_AMETHYST_BLOCK_PLACE, 1, 1); + block.getWorld().spawnParticle(Particle.VILLAGER_HAPPY, blockWheat.getLocation().add(0.5, 0.5, 0.5), 3, 0.5, 0.5, 0.5, 0.1); + } + } + } + } else { + if(block.getType() == Material.FARMLAND){ + if (block.getBlockData() instanceof Farmland) { + Farmland farmland = (Farmland) block.getBlockData(); + if (farmland.getMoisture() != 7) { + e.setCancelled(true); + } + } + } + // 检测 3x2x3范围中的方块 + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 0; y++) { + for (int z = -1; z <= 1; z++) { + Block newBlock = location.getWorld().getBlockAt(location.clone().add(x, y, z)); + // 检索到泥土方块后判断方块是否是湿润状态 + if (newBlock.getBlockData() instanceof Farmland) { + Farmland farmland = (Farmland) newBlock.getBlockData(); + // 如果没有打湿则跳过遍历 + if (farmland.getMoisture() != 7) { + continue; + } + // 获取泥土方块上方是否有小麦 + Block blockWheat = newBlock.getRelative(0, 1, 0); + if (blockWheat.getType() == Material.AIR) { + blockWheat.setType(Material.WHEAT); + if (blockWheat.getBlockData() instanceof Ageable) { + // 将小麦设置为刚种下时的阶段 + Ageable wheat = (Ageable) blockWheat.getBlockData(); + wheat.setAge(3); + blockWheat.setBlockData(wheat); + block.getWorld().spawnParticle(Particle.VILLAGER_HAPPY, blockWheat.getLocation().add(0.5, 0.5, 0.5), 3, 0.5, 0.5, 0.5, 0.1); + sound_butt = true; + } + }else if (block.getType() == Material.WHEAT) { + if (block.getBlockData() instanceof Ageable) { + // 将小麦设置为刚种下时的阶段 + Ageable ageable = (Ageable) block.getBlockData(); + if (ageable.getAge() < 3) { + ageable.setAge(3); + block.setBlockData(ageable); + block.getWorld().spawnParticle(Particle.VILLAGER_HAPPY, blockWheat.getLocation().add(0.5, 0.5, 0.5), 3, 0.5, 0.5, 0.5, 0.1); + sound_butt = true; + } + } + } + } + } + } + } + if(sound_butt){ + p.playSound(p.getLocation(),Sound.BLOCK_CROP_BREAK,1,1); + } + } + } + } + } +} diff --git a/src/main/java/com/yaohun/wheatwar/listener/GameListener.java b/src/main/java/com/yaohun/wheatwar/listener/GameListener.java new file mode 100644 index 0000000..0344f2e --- /dev/null +++ b/src/main/java/com/yaohun/wheatwar/listener/GameListener.java @@ -0,0 +1,6 @@ +package com.yaohun.wheatwar.listener; + +import org.bukkit.event.Listener; + +public class GameListener implements Listener { +} diff --git a/src/main/java/com/yaohun/wheatwar/listener/GamePotect.java b/src/main/java/com/yaohun/wheatwar/listener/GamePotect.java new file mode 100644 index 0000000..a366dc8 --- /dev/null +++ b/src/main/java/com/yaohun/wheatwar/listener/GamePotect.java @@ -0,0 +1,62 @@ +package com.yaohun.wheatwar.listener; + +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBurnEvent; +import org.bukkit.event.block.BlockIgniteEvent; +import org.bukkit.event.entity.EntityCombustEvent; +import org.bukkit.event.entity.EntityInteractEvent; +import org.bukkit.event.entity.FoodLevelChangeEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.weather.WeatherChangeEvent; + +public class GamePotect implements Listener { + @EventHandler // 取消生物燃烧 + public void onEntityCombust(EntityCombustEvent event) { + if (event.getEntity() instanceof LivingEntity) { + event.setCancelled(true); + } + } + @EventHandler // 禁止火焰燃烧方块 + public void onBlockFire(BlockBurnEvent e) { + e.setCancelled(true); + } + @EventHandler// 禁止火焰燃烧物品 + public void onBlockIgnite(BlockIgniteEvent e) { + e.setCancelled(true); + } + @EventHandler(priority= EventPriority.HIGH) + public void onWeatherChange(WeatherChangeEvent e) { + e.setCancelled(true); + } + @EventHandler(priority= EventPriority.HIGH) + public void onFoodChange(FoodLevelChangeEvent e) { + e.setCancelled(true); + } + @EventHandler /*保护农作物免踩踏*/ + public void onJumpFarm(PlayerInteractEvent e){ + if (e.isCancelled()) {return;} + if(e.getAction() == Action.PHYSICAL){ + Block block = e.getClickedBlock(); + if(block.getType() == Material.FARMLAND){ + e.setCancelled(true); + } + } + } + @EventHandler /*保护农作物免踩踏*/ + public void onMobsFarm(EntityInteractEvent e){ + if (e.isCancelled()) {return;} + if(e.getEntityType() != EntityType.PLAYER){ + Block block = e.getBlock(); + if(block.getType() == Material.FARMLAND){ + e.setCancelled(true); + } + } + } +} diff --git a/src/main/java/com/yaohun/wheatwar/listener/JoinListener.java b/src/main/java/com/yaohun/wheatwar/listener/JoinListener.java new file mode 100644 index 0000000..e5076a8 --- /dev/null +++ b/src/main/java/com/yaohun/wheatwar/listener/JoinListener.java @@ -0,0 +1,25 @@ +package com.yaohun.wheatwar.listener; + +import com.yaohun.wheatwar.WheatWar; +import com.yaohun.wheatwar.game.Game; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.scheduler.BukkitRunnable; + +public class JoinListener implements Listener { + + @EventHandler + public void onJoin(PlayerJoinEvent e){ + Game game = WheatWar.getGame(); + new BukkitRunnable() { + @Override + public void run() { + if(!game.isStarted()) { + game.start(); + } + game.initPlayerData(e.getPlayer()); + } + }.runTaskLater(WheatWar.inst(),10L); + } +} diff --git a/src/main/java/tools/BossBarUtil.java b/src/main/java/tools/BossBarUtil.java new file mode 100644 index 0000000..d8ba728 --- /dev/null +++ b/src/main/java/tools/BossBarUtil.java @@ -0,0 +1,43 @@ +package tools; + +import org.bukkit.boss.BarColor; +import org.bukkit.boss.BossBar; +import org.bukkit.entity.Player; + +import java.util.List; + +public class BossBarUtil { + + public static void setBarColor(BossBar bossBar, double percent){ + if (percent >= 0 && percent <= 0.3333) { + bossBar.setColor(BarColor.RED); + } else if (percent <= 0.6666) { + bossBar.setColor(BarColor.YELLOW); + } else { + bossBar.setColor(BarColor.GREEN); + } + } + + public static void setBarProgress(BossBar bossBar,double percent){ + if (percent <= 0) { + percent = 0; + } else if (percent >= 1) { + percent = 1; + } + bossBar.setProgress(percent); + } + + // BossBarUtil.addBossBar(player,new ArrayList<>(Arrays.asList(bossBar1,bossBar3,bossBar2))); + public static void addBossBar(Player player, List bossBarList){ + for (BossBar bossBar : bossBarList) { + bossBar.addPlayer(player); + } + } + + public static void removeBossBar(Player player,List bossBarList){ + for (BossBar bossBar : bossBarList) { + bossBar.removePlayer(player); + } + } + +} diff --git a/src/main/java/tools/CDTimeAPI.java b/src/main/java/tools/CDTimeAPI.java new file mode 100644 index 0000000..df5b066 --- /dev/null +++ b/src/main/java/tools/CDTimeAPI.java @@ -0,0 +1,66 @@ +package tools; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.UUID; + +public class CDTimeAPI { + private static HashSet cdData = new HashSet<>(); + + public static void setPlayerCD(UUID uuid, String key, long mills) { + CDData data = getCDData(uuid); + long now = System.currentTimeMillis(); + data.setCD(key, now + mills); + } + + public static long getCD(UUID uuid, String key) { + CDData data = getCDData(uuid); + long now = System.currentTimeMillis(); + return data.getCD(key) - now; + } + + public static boolean isCD(UUID uuid, String key) { + return (getCD(uuid, key) > 0L); + } + + public static CDData getCDData(UUID uuid) { + for (CDData cDData : cdData) { + if (cDData.getUuid().equals(uuid)) + return cDData; + } + CDData data = new CDData(uuid); + cdData.add(data); + return data; + } + + public static class CDData{ + private final UUID uuid; + + private final HashMap cdTime; + + public CDData(UUID uuid) { + this.uuid = uuid; + this.cdTime = new HashMap<>(); + } + + public UUID getUuid() { + return this.uuid; + } + + public void setCD(String key, long time) { + this.cdTime.put(key, time); + } + + public long getCD(String key) { + return this.cdTime.getOrDefault(key,-1L); + } + + public HashMap getCdTime() { + return cdTime; + } + } + + public static HashSet getCdData() { + return cdData; + } +} diff --git a/src/main/java/tools/GameUtil.java b/src/main/java/tools/GameUtil.java new file mode 100644 index 0000000..ba26f12 --- /dev/null +++ b/src/main/java/tools/GameUtil.java @@ -0,0 +1,83 @@ +package tools; + +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldedit.extent.clipboard.Clipboard; +import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats; +import com.sk89q.worldedit.math.BlockVector3; +import com.yaohun.wheatwar.WheatWar; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Sound; +import org.bukkit.World; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; + +import java.io.File; + +public class GameUtil { + public static String hideName(String audience) { + if (audience.length() <= 2) { + return "**"; + } + char firstChar = audience.charAt(0); + char lastChar = audience.charAt(audience.length() - 1); + StringBuilder maskedString = new StringBuilder(); + for (int i = 1; i < audience.length() - 1; i++) { + maskedString.append('*'); + } + return String.valueOf(firstChar) + maskedString + lastChar; + } + public static void sendMessage(CommandSender sender, String message) { + sender.sendMessage("§c[系统]§a" + message); + } + public static void sendAllSound(String sound) { + for (Player player : Bukkit.getOnlinePlayers()) { + if (sound.contains("_")) { + player.playSound(player.getLocation(), Sound.valueOf(sound), 1, 1); + } else { + player.playSound(player.getLocation(), sound, 0.5F, 1); + } + } + } + public static void sendAllTitle(String title,String subTitle,int t1,int t2,int t3) { + for (Player player : Bukkit.getOnlinePlayers()) { + player.sendTitle(title,subTitle,t1,t2,t3); + } + } + + public static Vector getRandomVector(double radius){ + double x = RandomUtil.getRandomDouble(0-radius, 0+radius, 1); + double y = RandomUtil.getRandomDouble(0, 0.5, 1); + double z = RandomUtil.getRandomDouble(0-radius, 0+radius, 1); + return new Vector(x, y, z); + } + public static Vector getRandomVector(double radius,double radiusY){ + double x = RandomUtil.getRandomDouble(0-radius, 0+radius, 1); + double y = RandomUtil.getRandomDouble(0+radiusY, 0.5+radiusY, 1); + double z = RandomUtil.getRandomDouble(0-radius, 0+radius, 1); + return new Vector(x, y, z); + } + + public static void loadSchematics(String fileName) { + World world = Bukkit.getWorld("world"); + File schema_file = new File("plugins/FastAsyncWorldEdit/schematics",fileName+".schem"); + Location location = new Location(world, -233,74,258); + EditSession editSession = WorldEdit.getInstance().newEditSession(BukkitAdapter.adapt(world)); + Bukkit.getScheduler().runTaskAsynchronously( + WheatWar.inst(), () -> { + try { + Clipboard clipboard = ClipboardFormats.findByFile(schema_file).load(schema_file); + clipboard.paste(BukkitAdapter.adapt(world), BlockVector3.at(location.getBlockX(), location.getBlockY(), location.getBlockZ())); + clipboard.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + editSession.close(); + } + } + ); + } +} diff --git a/src/main/java/tools/RandomUtil.java b/src/main/java/tools/RandomUtil.java new file mode 100644 index 0000000..14bf75b --- /dev/null +++ b/src/main/java/tools/RandomUtil.java @@ -0,0 +1,36 @@ +package tools; + +import org.bukkit.Location; +import org.bukkit.World; + +import java.util.Random; + +public class RandomUtil { + + public static boolean random(double d) { + return d >= new Random().nextFloat(); + } + + public static int getRandomInt(int min, int max) { + if (min == max) { + return max; + } + Random r = new Random(); + int i = min < max ? min : max; + int a = min < max ? max : min; + return r.nextInt(a - i + 1) + i; + } + + public static double getRandomDouble(double min, double max, int scl) { + int pow = (int) Math.pow(10, scl); + return Math.floor((Math.random() * (max - min) + min) * pow) / pow; + } + + public static Location getRandomLocation(World world, double minX, double maxX, double minY, double maxY, double minZ, double maxZ) { + double rx = getRandomDouble(minX, maxX, 3); + double ry = getRandomDouble(minY, maxY, 3); + double rz = getRandomDouble(minZ, maxZ, 3); + return new Location(world, rx, ry, rz); + } + +} diff --git a/src/main/java/tools/StackUtil.java b/src/main/java/tools/StackUtil.java new file mode 100644 index 0000000..63242a9 --- /dev/null +++ b/src/main/java/tools/StackUtil.java @@ -0,0 +1,17 @@ +package tools; + +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.PotionMeta; +import org.bukkit.potion.PotionData; +import org.bukkit.potion.PotionType; + +import java.util.ArrayList; +import java.util.List; + +public class StackUtil { + +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..ffacba1 --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,8 @@ +name: WheatWar +main: com.yaohun.wheatwar.WheatWar +version: 1.0 +api-version: '1.18' +commands: + game: + gameedit: + livegift: