新增了overly任务 可以在地面铺上一层需要的方块

This commit is contained in:
张宇衡 2023-06-09 22:01:45 +08:00
parent 6d7c1f3c20
commit f4fec3b044
6 changed files with 95 additions and 20 deletions

View File

@ -77,6 +77,6 @@ Debug: false
- [ ] 选区可视化
- [ ] 可手动暂停、恢复任务
- [x] 可手动暂停、恢复任务
- [ ] 更多的任务类型支持(如画圆、弧线)

View File

@ -6,7 +6,7 @@
<groupId>site.deercloud</groupId>
<artifactId>LiteWorldEdit</artifactId>
<version>2.0.0</version>
<version>2.1.1</version>
<packaging>jar</packaging>
<name>LiteWorldEdit</name>

View File

@ -10,6 +10,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import site.deercloud.liteworldedit.JobGenerator.Empty;
import site.deercloud.liteworldedit.JobGenerator.Fill;
import site.deercloud.liteworldedit.JobGenerator.OverLay;
import site.deercloud.liteworldedit.Jobs.Job;
import site.deercloud.liteworldedit.Managers.Point;
@ -33,6 +34,8 @@ public class Commands implements TabExecutor {
return fillTask(sender, args);
} else if (Objects.equals(args[0], "empty")) {
return emptyTask(sender, args);
} else if (Objects.equals(args[0], "overlay")) {
return overlayTask(sender, args);
} else if (Objects.equals(args[0], "help")) {
print_help(sender);
return true;
@ -57,8 +60,12 @@ public class Commands implements TabExecutor {
private static void resumeJobs(CommandSender sender) {
if (sender instanceof Player) {
Player player = (Player) sender;
LiteWorldEdit.instance.getCache().getQueueOf(player).resume();
sender.sendMessage("已恢复。");
if (LiteWorldEdit.instance.getCache().getQueueOf(player) == null) {
sender.sendMessage("你没有正在进行的任务。");
} else {
LiteWorldEdit.instance.getCache().getQueueOf(player).resume();
sender.sendMessage("已恢复。");
}
} else {
sender.sendMessage("该命令只能由玩家执行。");
}
@ -67,8 +74,12 @@ public class Commands implements TabExecutor {
private static void pauseJobs(CommandSender sender) {
if (sender instanceof Player) {
Player player = (Player) sender;
LiteWorldEdit.instance.getCache().getQueueOf(player).pause();
sender.sendMessage("已暂停。");
if (LiteWorldEdit.instance.getCache().getQueueOf(player) == null) {
sender.sendMessage("你没有正在进行的任务。");
} else {
LiteWorldEdit.instance.getCache().getQueueOf(player).pause();
sender.sendMessage("已暂停。");
}
} else {
sender.sendMessage("该命令只能由玩家执行。");
}
@ -92,8 +103,12 @@ public class Commands implements TabExecutor {
private static void cancerJobs(CommandSender sender) {
if (sender instanceof Player) {
Player player = (Player) sender;
LiteWorldEdit.instance.getCache().getQueueOf(player).cancel();
sender.sendMessage("已取消。");
if (LiteWorldEdit.instance.getCache().getQueueOf(player) == null) {
sender.sendMessage("你没有正在进行的任务。");
} else {
LiteWorldEdit.instance.getCache().getQueueOf(player).cancel();
sender.sendMessage("已取消。");
}
} else {
sender.sendMessage("该命令只能由玩家执行。");
}
@ -118,7 +133,35 @@ public class Commands implements TabExecutor {
} else {
sender.sendMessage("参数错误。");
}
return false;
return true;
}
private static boolean overlayTask(CommandSender sender, String[] args) {
if (!(sender instanceof Player)) {
sender.sendMessage("该命令只能由玩家执行。");
return true;
}
Player player = (Player) sender;
if (args.length == 3) {
try {
Vector2 diagonalPoint = getVector2(sender, args, player);
if (diagonalPoint == null) return true;
ItemStack items_in_hand = player.getInventory().getItemInMainHand();
if (!items_in_hand.getType().isBlock() || items_in_hand.getType() == Material.AIR) {
sender.sendMessage("你手上没有方块。");
return true;
}
Material material = Material.getMaterial(items_in_hand.getType().name());
OverLay.overLay(player, player.getWorld(), diagonalPoint.pointA, diagonalPoint.pointB, material);
sender.sendMessage("已添加任务。");
return true;
} catch (NumberFormatException e) {
sender.sendMessage("参数错误。");
}
} else {
sender.sendMessage("参数错误。");
}
return true;
}
private static boolean fillTask(CommandSender sender, String[] args) {
@ -146,7 +189,7 @@ public class Commands implements TabExecutor {
} else {
sender.sendMessage("参数错误。");
}
return false;
return true;
}
private static Vector2 getVector2(CommandSender sender, String[] args, Player player) {
@ -226,21 +269,18 @@ public class Commands implements TabExecutor {
} else {
sender.sendMessage("参数错误。");
}
return false;
return true;
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
if (args.length == 1) {
return Arrays.asList("point", "p", "points", "fill", "empty", "cancel", "pause", "resume", "help", "reload");
return Arrays.asList("point", "p", "points", "fill", "empty", "overlay", "cancel", "pause", "resume", "help", "reload");
} else if (args.length == 2) {
switch (args[1]) {
case "point":
return Collections.singletonList("[点序号(整数)] [x] [y] [z]");
case "fill":
return Collections.singletonList("[点序号A] [点序号B] (需要手持被放置的方块)");
case "empty":
return Collections.singletonList("[点序号A] [点序号B] (需要拥有下届合金锄)");
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")) {
return Collections.singletonList("[点序号A] [点序号B]");
}
}
return Collections.emptyList();
@ -253,6 +293,7 @@ public class Commands implements TabExecutor {
sender.sendMessage(ChatColor.GREEN + "/lwe points - 查看所有点");
sender.sendMessage(ChatColor.GREEN + "/lwe fill [点序号A] [点序号B] - (在AB点对角线间放置方块 - 需要手持被放置的方块)");
sender.sendMessage(ChatColor.GREEN + "/lwe empty [点序号A] [点序号B] - (破坏AB点对角线间方块 - 需要拥有下届合金镐)");
sender.sendMessage(ChatColor.GREEN + "/lwe overlay [点序号A] [点序号B] - (在选区地面上铺一层方块 - 需要手持被放置的方块)");
sender.sendMessage(ChatColor.GREEN + "/lwe cancel - 取消所有任务");
sender.sendMessage(ChatColor.GREEN + "/lwe pause - 暂停工作");
sender.sendMessage(ChatColor.GREEN + "/lwe resume - 恢复工作");

View File

@ -9,7 +9,6 @@ import site.deercloud.liteworldedit.Managers.Point;
public class Empty {
public static void empty(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++) {

View File

@ -0,0 +1,29 @@
package site.deercloud.liteworldedit.JobGenerator;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import site.deercloud.liteworldedit.Jobs.Place;
import site.deercloud.liteworldedit.LiteWorldEdit;
import site.deercloud.liteworldedit.Managers.Point;
public class OverLay {
public static void overLay(Player player, World world, Point p1, Point p2, Material block) {
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++) {
for (int y = Math.min(p1.y, p2.y); y <= Math.max(p1.y, p2.y); y++) {
Block block1 = world.getBlockAt(x, y, z);
if (block1.getType() == Material.AIR) {
Location location = new Location(world, (double) x, (double) y, (double) z);
Place place_job = new Place(location, player, block);
LiteWorldEdit.instance.getCache().addJob(player, place_job);
break;
}
}
}
}
}
}

View File

@ -50,6 +50,12 @@ public class Cache {
}
public JobQueue getQueueOf(Player player) {
if (!_jobs.containsKey(player.getUniqueId().toString())) {
return null;
}
if (_jobs.get(player.getUniqueId().toString()).isEmpty()) {
return null;
}
return _jobs.get(player.getUniqueId().toString());
}