This commit is contained in:
parent
d978fcab50
commit
24aff565fb
@ -62,6 +62,8 @@
|
|||||||
|
|
||||||
`/lwe overlay [点序号A] [点序号B]` 在选区地面上铺一层方块 - 需要手持被放置的方块
|
`/lwe overlay [点序号A] [点序号B]` 在选区地面上铺一层方块 - 需要手持被放置的方块
|
||||||
|
|
||||||
|
`/lwe drain [点序号A] [点序号B]` 排干AB点对角线间的流体 - 需要背包里有一个海绵
|
||||||
|
|
||||||
`/lwe cancel` 取消(终止)所有任务
|
`/lwe cancel` 取消(终止)所有任务
|
||||||
|
|
||||||
`/lwe pause` 暂停所有任务
|
`/lwe pause` 暂停所有任务
|
||||||
|
2
pom.xml
2
pom.xml
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<groupId>site.deercloud</groupId>
|
<groupId>site.deercloud</groupId>
|
||||||
<artifactId>LiteWorldEdit</artifactId>
|
<artifactId>LiteWorldEdit</artifactId>
|
||||||
<version>2.3.5.6</version>
|
<version>2.3.6.1</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<name>LiteWorldEdit</name>
|
<name>LiteWorldEdit</name>
|
||||||
|
@ -8,6 +8,7 @@ import org.bukkit.command.TabExecutor;
|
|||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import site.deercloud.liteworldedit.JobGenerator.Drain;
|
||||||
import site.deercloud.liteworldedit.JobGenerator.Empty;
|
import site.deercloud.liteworldedit.JobGenerator.Empty;
|
||||||
import site.deercloud.liteworldedit.JobGenerator.Fill;
|
import site.deercloud.liteworldedit.JobGenerator.Fill;
|
||||||
import site.deercloud.liteworldedit.JobGenerator.OverLay;
|
import site.deercloud.liteworldedit.JobGenerator.OverLay;
|
||||||
@ -31,11 +32,17 @@ public class Commands implements TabExecutor {
|
|||||||
listPoints(sender);
|
listPoints(sender);
|
||||||
return true;
|
return true;
|
||||||
} else if (Objects.equals(args[0], "fill")) {
|
} else if (Objects.equals(args[0], "fill")) {
|
||||||
return fillTask(sender, args);
|
fillTask(sender, args);
|
||||||
|
return true;
|
||||||
} else if (Objects.equals(args[0], "empty")) {
|
} else if (Objects.equals(args[0], "empty")) {
|
||||||
return emptyTask(sender, args);
|
emptyTask(sender, args);
|
||||||
|
return true;
|
||||||
} else if (Objects.equals(args[0], "overlay")) {
|
} 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")) {
|
} else if (Objects.equals(args[0], "help")) {
|
||||||
print_help(sender);
|
print_help(sender);
|
||||||
return true;
|
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)) {
|
if (!(sender instanceof Player)) {
|
||||||
LoggerX.err("该命令只能由玩家执行。");
|
LoggerX.err("该命令只能由玩家执行。");
|
||||||
return true;
|
return;
|
||||||
}
|
}
|
||||||
Player player = (Player) sender;
|
Player player = (Player) sender;
|
||||||
if (args.length == 3) {
|
if (args.length == 3) {
|
||||||
try {
|
try {
|
||||||
Vector2 diagonalPoint = getVector2(sender, args, player);
|
Vector2 diagonalPoint = getVector2(sender, args, player);
|
||||||
if (diagonalPoint == null) return true;
|
if (diagonalPoint == null) return;
|
||||||
Empty.empty(player, player.getWorld(), diagonalPoint.pointA, diagonalPoint.pointB);
|
Empty.empty(player, player.getWorld(), diagonalPoint.pointA, diagonalPoint.pointB);
|
||||||
Notification.info(player, "已添加任务。");
|
Notification.info(player, "已添加任务。");
|
||||||
|
|
||||||
@ -133,63 +140,81 @@ public class Commands implements TabExecutor {
|
|||||||
} else {
|
} else {
|
||||||
Notification.error(player, "参数错误。");
|
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)) {
|
if (!(sender instanceof Player)) {
|
||||||
LoggerX.err("该命令只能由玩家执行。");
|
LoggerX.err("该命令只能由玩家执行。");
|
||||||
return true;
|
return;
|
||||||
}
|
}
|
||||||
Player player = (Player) sender;
|
Player player = (Player) sender;
|
||||||
if (args.length == 3) {
|
if (args.length == 3) {
|
||||||
try {
|
try {
|
||||||
Vector2 diagonalPoint = getVector2(sender, args, player);
|
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();
|
ItemStack items_in_hand = player.getInventory().getItemInMainHand();
|
||||||
if (!items_in_hand.getType().isBlock() || items_in_hand.getType() == Material.AIR) {
|
if (!items_in_hand.getType().isBlock() || items_in_hand.getType() == Material.AIR) {
|
||||||
Notification.error(player, "你手上没有方块。");
|
Notification.error(player, "你手上没有方块。");
|
||||||
return true;
|
return;
|
||||||
}
|
}
|
||||||
Material material = Material.getMaterial(items_in_hand.getType().name());
|
Material material = Material.getMaterial(items_in_hand.getType().name());
|
||||||
OverLay.overLay(player, player.getWorld(), diagonalPoint.pointA, diagonalPoint.pointB, material);
|
OverLay.overLay(player, player.getWorld(), diagonalPoint.pointA, diagonalPoint.pointB, material);
|
||||||
Notification.info(player, "已添加任务。");
|
Notification.info(player, "已添加任务。");
|
||||||
return true;
|
return;
|
||||||
} catch (NumberFormatException e) {
|
} catch (NumberFormatException e) {
|
||||||
Notification.error(player, "参数错误。");
|
Notification.error(player, "参数错误。");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Notification.error(player, "参数错误。");
|
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)) {
|
if (!(sender instanceof Player)) {
|
||||||
LoggerX.err("该命令只能由玩家执行。");
|
LoggerX.err("该命令只能由玩家执行。");
|
||||||
return true;
|
return;
|
||||||
}
|
}
|
||||||
Player player = (Player) sender;
|
Player player = (Player) sender;
|
||||||
if (args.length == 3) {
|
if (args.length == 3) {
|
||||||
try {
|
try {
|
||||||
Vector2 diagonalPoint = getVector2(sender, args, player);
|
Vector2 diagonalPoint = getVector2(sender, args, player);
|
||||||
if (diagonalPoint == null) return true;
|
if (diagonalPoint == null) return;
|
||||||
ItemStack items_in_hand = player.getInventory().getItemInMainHand();
|
ItemStack items_in_hand = player.getInventory().getItemInMainHand();
|
||||||
if (!items_in_hand.getType().isBlock() || items_in_hand.getType() == Material.AIR) {
|
if (!items_in_hand.getType().isBlock() || items_in_hand.getType() == Material.AIR) {
|
||||||
Notification.error(player, "你手上没有方块。");
|
Notification.error(player, "你手上没有方块。");
|
||||||
return true;
|
return;
|
||||||
}
|
}
|
||||||
Material material = Material.getMaterial(items_in_hand.getType().name());
|
Material material = Material.getMaterial(items_in_hand.getType().name());
|
||||||
Fill.fill(player, player.getWorld(), diagonalPoint.pointA, diagonalPoint.pointB, material);
|
Fill.fill(player, player.getWorld(), diagonalPoint.pointA, diagonalPoint.pointB, material);
|
||||||
Notification.info(player, "已添加任务。");
|
Notification.info(player, "已添加任务。");
|
||||||
return true;
|
return;
|
||||||
} catch (NumberFormatException e) {
|
} catch (NumberFormatException e) {
|
||||||
Notification.error(player, "参数错误。");
|
Notification.error(player, "参数错误。");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Notification.error(player, "参数错误。");
|
Notification.error(player, "参数错误。");
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Vector2 getVector2(CommandSender sender, String[] args, Player player) {
|
private static Vector2 getVector2(CommandSender sender, String[] args, Player player) {
|
||||||
@ -275,11 +300,11 @@ public class Commands implements TabExecutor {
|
|||||||
@Override
|
@Override
|
||||||
public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) {
|
public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) {
|
||||||
if (args.length == 1) {
|
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) {
|
} else if (args.length == 2) {
|
||||||
if (args[0].equals("point") || args[0].equals("p")) {
|
if (args[0].equals("point") || args[0].equals("p")) {
|
||||||
return Collections.singletonList("[点序号(整数)] [x] [y] [z] - 创建点");
|
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]");
|
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 fill [点序号A] [点序号B] - (在AB点对角线间放置方块 - 需要手持被放置的方块)");
|
||||||
Notification.info((Player) sender, "/lwe empty [点序号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 overlay [点序号A] [点序号B] - (在AB点对角线间放置方块 - 不需要手持被放置的方块)");
|
||||||
|
Notification.info((Player) sender, "/lwe drain [点序号A] [点序号B] - (排干AB点对角线间的流体 - 需要背包里有一个海绵)");
|
||||||
Notification.info((Player) sender, "/lwe cancel - 取消当前任务");
|
Notification.info((Player) sender, "/lwe cancel - 取消当前任务");
|
||||||
Notification.info((Player) sender, "/lwe pause - 暂停当前任务");
|
Notification.info((Player) sender, "/lwe pause - 暂停当前任务");
|
||||||
Notification.info((Player) sender, "/lwe resume - 恢复当前任务");
|
Notification.info((Player) sender, "/lwe resume - 恢复当前任务");
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
52
src/main/java/site/deercloud/liteworldedit/Jobs/Absorb.java
Normal file
52
src/main/java/site/deercloud/liteworldedit/Jobs/Absorb.java
Normal file
@ -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<Integer, ?> 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -8,11 +8,13 @@ public enum JobErrCode {
|
|||||||
NOT_ENOUGH_DURATION(102, "所有下界合金镐耐久均不足10"),
|
NOT_ENOUGH_DURATION(102, "所有下界合金镐耐久均不足10"),
|
||||||
NOT_ENOUGH_ITEMS(103, "物品不足"),
|
NOT_ENOUGH_ITEMS(103, "物品不足"),
|
||||||
OUT_OF_RANGE(104, "超出操作距离"),
|
OUT_OF_RANGE(104, "超出操作距离"),
|
||||||
|
NO_SPONGE(105, "没有海绵,无法排水"),
|
||||||
|
|
||||||
// ------------ 以下结果应当跳过任务 ------------
|
// ------------ 以下结果应当跳过任务 ------------
|
||||||
NO_PERMISSION(201, "跳过没有权限操作的方块"),
|
NO_PERMISSION(201, "跳过没有权限操作的方块"),
|
||||||
NOT_AIR_BLOCK(202, "跳过非空气方块"),
|
NOT_AIR_BLOCK(202, "跳过非空气方块"),
|
||||||
NO_BREAKABLE(203, "跳过不可破坏方块"),
|
NO_BREAKABLE(203, "跳过不可破坏方块"),
|
||||||
|
NOT_LIQUID(204, "跳过非液体方块"),
|
||||||
;
|
;
|
||||||
|
|
||||||
private final int value;
|
private final int value;
|
||||||
|
@ -35,8 +35,8 @@ public class Place extends Job {
|
|||||||
}
|
}
|
||||||
// 跳过非空气方块
|
// 跳过非空气方块
|
||||||
Block raw_block = _world.getBlockAt(_location);
|
Block raw_block = _world.getBlockAt(_location);
|
||||||
if (!raw_block.isEmpty() && !raw_block.isLiquid()) {
|
if (!raw_block.isEmpty()) {
|
||||||
LoggerX.debug("目标方块不是空气或流体!");
|
LoggerX.debug("目标方块不是空气!");
|
||||||
return JobErrCode.NOT_AIR_BLOCK;
|
return JobErrCode.NOT_AIR_BLOCK;
|
||||||
}
|
}
|
||||||
// 获取到玩家物品中材料的第一个堆叠
|
// 获取到玩家物品中材料的第一个堆叠
|
||||||
|
Loading…
Reference in New Issue
Block a user