diff --git a/README.md b/README.md index 049b402..4beb6db 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,8 @@ `/lwe overlay [点序号A] [点序号B]` 在选区地面上铺一层方块 - 需要手持被放置的方块 +`/lwe drain [点序号A] [点序号B]` 排干AB点对角线间的流体 - 需要背包里有一个海绵 + `/lwe cancel` 取消(终止)所有任务 `/lwe pause` 暂停所有任务 diff --git a/pom.xml b/pom.xml index c109d0b..c9d5b8f 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ site.deercloud LiteWorldEdit - 2.3.5.6 + 2.3.6.1 jar LiteWorldEdit diff --git a/src/main/java/site/deercloud/liteworldedit/Commands.java b/src/main/java/site/deercloud/liteworldedit/Commands.java index a899b2e..a0f974e 100644 --- a/src/main/java/site/deercloud/liteworldedit/Commands.java +++ b/src/main/java/site/deercloud/liteworldedit/Commands.java @@ -8,6 +8,7 @@ import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; +import site.deercloud.liteworldedit.JobGenerator.Drain; import site.deercloud.liteworldedit.JobGenerator.Empty; import site.deercloud.liteworldedit.JobGenerator.Fill; import site.deercloud.liteworldedit.JobGenerator.OverLay; @@ -31,11 +32,17 @@ public class Commands implements TabExecutor { listPoints(sender); return true; } else if (Objects.equals(args[0], "fill")) { - return fillTask(sender, args); + fillTask(sender, args); + return true; } else if (Objects.equals(args[0], "empty")) { - return emptyTask(sender, args); + emptyTask(sender, args); + return true; } else if (Objects.equals(args[0], "overlay")) { - return overlayTask(sender, args); + overlayTask(sender, args); + return true; + } else if (Objects.equals(args[0], "drain")) { + drainTask(sender, args); + return true; } else if (Objects.equals(args[0], "help")) { print_help(sender); return true; @@ -114,16 +121,16 @@ public class Commands implements TabExecutor { } } - private static boolean emptyTask(CommandSender sender, String[] args) { + private static void emptyTask(CommandSender sender, String[] args) { if (!(sender instanceof Player)) { LoggerX.err("该命令只能由玩家执行。"); - return true; + return; } Player player = (Player) sender; if (args.length == 3) { try { Vector2 diagonalPoint = getVector2(sender, args, player); - if (diagonalPoint == null) return true; + if (diagonalPoint == null) return; Empty.empty(player, player.getWorld(), diagonalPoint.pointA, diagonalPoint.pointB); Notification.info(player, "已添加任务。"); @@ -133,63 +140,81 @@ public class Commands implements TabExecutor { } else { Notification.error(player, "参数错误。"); } - return true; } - private static boolean overlayTask(CommandSender sender, String[] args) { + private static void drainTask(CommandSender sender, String[] args) { if (!(sender instanceof Player)) { LoggerX.err("该命令只能由玩家执行。"); - return true; + return; } Player player = (Player) sender; if (args.length == 3) { try { Vector2 diagonalPoint = getVector2(sender, args, player); - if (diagonalPoint == null) return true; + if (diagonalPoint == null) return; + Drain.drain(player, player.getWorld(), diagonalPoint.pointA, diagonalPoint.pointB); + Notification.info(player, "已添加任务。"); + + } catch (NumberFormatException e) { + Notification.error(player, "参数错误。"); + } + } else { + Notification.error(player, "参数错误。"); + } + } + + private static void overlayTask(CommandSender sender, String[] args) { + if (!(sender instanceof Player)) { + LoggerX.err("该命令只能由玩家执行。"); + return; + } + Player player = (Player) sender; + if (args.length == 3) { + try { + Vector2 diagonalPoint = getVector2(sender, args, player); + if (diagonalPoint == null) return; ItemStack items_in_hand = player.getInventory().getItemInMainHand(); if (!items_in_hand.getType().isBlock() || items_in_hand.getType() == Material.AIR) { Notification.error(player, "你手上没有方块。"); - return true; + return; } Material material = Material.getMaterial(items_in_hand.getType().name()); OverLay.overLay(player, player.getWorld(), diagonalPoint.pointA, diagonalPoint.pointB, material); Notification.info(player, "已添加任务。"); - return true; + return; } catch (NumberFormatException e) { Notification.error(player, "参数错误。"); } } else { Notification.error(player, "参数错误。"); } - return true; } - private static boolean fillTask(CommandSender sender, String[] args) { + private static void fillTask(CommandSender sender, String[] args) { if (!(sender instanceof Player)) { LoggerX.err("该命令只能由玩家执行。"); - return true; + return; } Player player = (Player) sender; if (args.length == 3) { try { Vector2 diagonalPoint = getVector2(sender, args, player); - if (diagonalPoint == null) return true; + if (diagonalPoint == null) return; ItemStack items_in_hand = player.getInventory().getItemInMainHand(); if (!items_in_hand.getType().isBlock() || items_in_hand.getType() == Material.AIR) { Notification.error(player, "你手上没有方块。"); - return true; + return; } Material material = Material.getMaterial(items_in_hand.getType().name()); Fill.fill(player, player.getWorld(), diagonalPoint.pointA, diagonalPoint.pointB, material); Notification.info(player, "已添加任务。"); - return true; + return; } catch (NumberFormatException e) { Notification.error(player, "参数错误。"); } } else { Notification.error(player, "参数错误。"); } - return true; } private static Vector2 getVector2(CommandSender sender, String[] args, Player player) { @@ -275,11 +300,11 @@ public class Commands implements TabExecutor { @Override public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { if (args.length == 1) { - return Arrays.asList("point", "p", "points", "fill", "empty", "overlay", "cancel", "pause", "resume", "help", "reload"); + return Arrays.asList("point", "p", "points", "fill", "empty", "overlay", "drain", "cancel", "pause", "resume", "help", "reload"); } else if (args.length == 2) { if (args[0].equals("point") || args[0].equals("p")) { return Collections.singletonList("[点序号(整数)] [x] [y] [z] - 创建点"); - } else if (args[0].equals("fill") || args[0].equals("empty") || args[0].equals("overlay")) { + } else if (args[0].equals("fill") || args[0].equals("empty") || args[0].equals("overlay") || args[0].equals("drain")) { return Collections.singletonList("[点序号A] [点序号B]"); } } @@ -298,6 +323,7 @@ public class Commands implements TabExecutor { Notification.info((Player) sender, "/lwe fill [点序号A] [点序号B] - (在AB点对角线间放置方块 - 需要手持被放置的方块)"); Notification.info((Player) sender, "/lwe empty [点序号A] [点序号B] - (破坏AB点对角线间方块 - 需要拥有下届合金镐)"); Notification.info((Player) sender, "/lwe overlay [点序号A] [点序号B] - (在AB点对角线间放置方块 - 不需要手持被放置的方块)"); + Notification.info((Player) sender, "/lwe drain [点序号A] [点序号B] - (排干AB点对角线间的流体 - 需要背包里有一个海绵)"); Notification.info((Player) sender, "/lwe cancel - 取消当前任务"); Notification.info((Player) sender, "/lwe pause - 暂停当前任务"); Notification.info((Player) sender, "/lwe resume - 恢复当前任务"); diff --git a/src/main/java/site/deercloud/liteworldedit/JobGenerator/Drain.java b/src/main/java/site/deercloud/liteworldedit/JobGenerator/Drain.java new file mode 100644 index 0000000..73d9cbb --- /dev/null +++ b/src/main/java/site/deercloud/liteworldedit/JobGenerator/Drain.java @@ -0,0 +1,23 @@ +package site.deercloud.liteworldedit.JobGenerator; + +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.Player; +import site.deercloud.liteworldedit.Jobs.Absorb; +import site.deercloud.liteworldedit.Jobs.Remove; +import site.deercloud.liteworldedit.LiteWorldEdit; +import site.deercloud.liteworldedit.Managers.Point; + +public class Drain { + public static void drain(Player player, World world, Point p1, Point p2) { + for (int y = Math.max(p1.y, p2.y); y >= Math.min(p1.y, p2.y); y--) { + for (int x = Math.min(p1.x, p2.x); x <= Math.max(p1.x, p2.x); x++) { + for (int z = Math.min(p1.z, p2.z); z <= Math.max(p1.z, p2.z); z++) { + Location location = new Location(world, (double) x, (double) y, (double) z); + Absorb absorb_job = new Absorb(location, player); + LiteWorldEdit.instance.getCache().getPlayer(player).addJob(absorb_job); + } + } + } + } +} diff --git a/src/main/java/site/deercloud/liteworldedit/Jobs/Absorb.java b/src/main/java/site/deercloud/liteworldedit/Jobs/Absorb.java new file mode 100644 index 0000000..8f6a06d --- /dev/null +++ b/src/main/java/site/deercloud/liteworldedit/Jobs/Absorb.java @@ -0,0 +1,52 @@ +package site.deercloud.liteworldedit.Jobs; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.block.SpongeAbsorbEvent; +import org.bukkit.inventory.ItemStack; +import site.deercloud.liteworldedit.LoggerX; + +import java.util.HashMap; + +public class Absorb extends Job { + public Absorb(Location location, Player player) { + super(player.getWorld(), location, player); + } + + @Override + public JobErrCode Do() { + Player _creator = this.get_creator(); + Location _location = this.get_location(); + World _world = this.get_world(); + // 超出距离 + if (!in_range(_creator, _location)) { + LoggerX.debug("超出距离!"); + return JobErrCode.OUT_OF_RANGE; + } + Block raw_block = _world.getBlockAt(_location); + // 跳过非流体 + if (!raw_block.isLiquid()) { + LoggerX.debug("目标方块不是流体!"); + return JobErrCode.NOT_LIQUID; + } + HashMap sponge = _creator.getInventory().all(Material.SPONGE); + if (sponge.size() == 0) { + return JobErrCode.NO_SPONGE; + } + // 模拟海绵吸水事件 + BlockPlaceEvent event = new BlockPlaceEvent(raw_block, raw_block.getState(), raw_block, new ItemStack(Material.SPONGE), _creator, true, null); + Bukkit.getPluginManager().callEvent(event); + if (!event.isCancelled()) { + raw_block.setType(Material.SPONGE); + raw_block.setType(Material.AIR); + return JobErrCode.OK; + } else { + return JobErrCode.NO_PERMISSION; + } + } +} diff --git a/src/main/java/site/deercloud/liteworldedit/Jobs/JobErrCode.java b/src/main/java/site/deercloud/liteworldedit/Jobs/JobErrCode.java index fe7eb9e..2a9c85b 100644 --- a/src/main/java/site/deercloud/liteworldedit/Jobs/JobErrCode.java +++ b/src/main/java/site/deercloud/liteworldedit/Jobs/JobErrCode.java @@ -8,11 +8,13 @@ public enum JobErrCode { NOT_ENOUGH_DURATION(102, "所有下界合金镐耐久均不足10"), NOT_ENOUGH_ITEMS(103, "物品不足"), OUT_OF_RANGE(104, "超出操作距离"), + NO_SPONGE(105, "没有海绵,无法排水"), // ------------ 以下结果应当跳过任务 ------------ NO_PERMISSION(201, "跳过没有权限操作的方块"), NOT_AIR_BLOCK(202, "跳过非空气方块"), NO_BREAKABLE(203, "跳过不可破坏方块"), + NOT_LIQUID(204, "跳过非液体方块"), ; private final int value; diff --git a/src/main/java/site/deercloud/liteworldedit/Jobs/Place.java b/src/main/java/site/deercloud/liteworldedit/Jobs/Place.java index b16b583..3b4485f 100644 --- a/src/main/java/site/deercloud/liteworldedit/Jobs/Place.java +++ b/src/main/java/site/deercloud/liteworldedit/Jobs/Place.java @@ -35,8 +35,8 @@ public class Place extends Job { } // 跳过非空气方块 Block raw_block = _world.getBlockAt(_location); - if (!raw_block.isEmpty() && !raw_block.isLiquid()) { - LoggerX.debug("目标方块不是空气或流体!"); + if (!raw_block.isEmpty()) { + LoggerX.debug("目标方块不是空气!"); return JobErrCode.NOT_AIR_BLOCK; } // 获取到玩家物品中材料的第一个堆叠