变更
This commit is contained in:
commit
1fb5691b32
113
.gitignore
vendored
Normal file
113
.gitignore
vendored
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
# User-specific stuff
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
*.iws
|
||||||
|
|
||||||
|
# IntelliJ
|
||||||
|
out/
|
||||||
|
|
||||||
|
# Compiled class file
|
||||||
|
*.class
|
||||||
|
|
||||||
|
# Log file
|
||||||
|
*.log
|
||||||
|
|
||||||
|
# BlueJ files
|
||||||
|
*.ctxt
|
||||||
|
|
||||||
|
# Package Files #
|
||||||
|
*.jar
|
||||||
|
*.war
|
||||||
|
*.nar
|
||||||
|
*.ear
|
||||||
|
*.zip
|
||||||
|
*.tar.gz
|
||||||
|
*.rar
|
||||||
|
|
||||||
|
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||||
|
hs_err_pid*
|
||||||
|
|
||||||
|
*~
|
||||||
|
|
||||||
|
# temporary files which can be created if a process still has a handle open of a deleted file
|
||||||
|
.fuse_hidden*
|
||||||
|
|
||||||
|
# KDE directory preferences
|
||||||
|
.directory
|
||||||
|
|
||||||
|
# Linux trash folder which might appear on any partition or disk
|
||||||
|
.Trash-*
|
||||||
|
|
||||||
|
# .nfs files are created when an open file is removed but is still being accessed
|
||||||
|
.nfs*
|
||||||
|
|
||||||
|
# General
|
||||||
|
.DS_Store
|
||||||
|
.AppleDouble
|
||||||
|
.LSOverride
|
||||||
|
|
||||||
|
# Icon must end with two \r
|
||||||
|
Icon
|
||||||
|
|
||||||
|
# Thumbnails
|
||||||
|
._*
|
||||||
|
|
||||||
|
# Files that might appear in the root of a volume
|
||||||
|
.DocumentRevisions-V100
|
||||||
|
.fseventsd
|
||||||
|
.Spotlight-V100
|
||||||
|
.TemporaryItems
|
||||||
|
.Trashes
|
||||||
|
.VolumeIcon.icns
|
||||||
|
.com.apple.timemachine.donotpresent
|
||||||
|
|
||||||
|
# Directories potentially created on remote AFP share
|
||||||
|
.AppleDB
|
||||||
|
.AppleDesktop
|
||||||
|
Network Trash Folder
|
||||||
|
Temporary Items
|
||||||
|
.apdisk
|
||||||
|
|
||||||
|
# Windows thumbnail cache files
|
||||||
|
Thumbs.db
|
||||||
|
Thumbs.db:encryptable
|
||||||
|
ehthumbs.db
|
||||||
|
ehthumbs_vista.db
|
||||||
|
|
||||||
|
# Dump file
|
||||||
|
*.stackdump
|
||||||
|
|
||||||
|
# Folder config file
|
||||||
|
[Dd]esktop.ini
|
||||||
|
|
||||||
|
# Recycle Bin used on file shares
|
||||||
|
$RECYCLE.BIN/
|
||||||
|
|
||||||
|
# Windows Installer files
|
||||||
|
*.cab
|
||||||
|
*.msi
|
||||||
|
*.msix
|
||||||
|
*.msm
|
||||||
|
*.msp
|
||||||
|
|
||||||
|
# Windows shortcuts
|
||||||
|
*.lnk
|
||||||
|
|
||||||
|
target/
|
||||||
|
|
||||||
|
pom.xml.tag
|
||||||
|
pom.xml.releaseBackup
|
||||||
|
pom.xml.versionsBackup
|
||||||
|
pom.xml.next
|
||||||
|
|
||||||
|
release.properties
|
||||||
|
dependency-reduced-pom.xml
|
||||||
|
buildNumber.properties
|
||||||
|
.mvn/timing.properties
|
||||||
|
.mvn/wrapper/maven-wrapper.jar
|
||||||
|
.flattened-pom.xml
|
||||||
|
|
||||||
|
# Common working directory
|
||||||
|
run/
|
76
pom.xml
Normal file
76
pom.xml
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>site.deercloud</groupId>
|
||||||
|
<artifactId>LiteWorldEdit</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<name>LiteWorldEdit</name>
|
||||||
|
|
||||||
|
<description>生存用简易创世神。</description>
|
||||||
|
<properties>
|
||||||
|
<java.version>1.8</java.version>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
<url>https://blog.deercloud.site</url>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.8.1</version>
|
||||||
|
<configuration>
|
||||||
|
<source>${java.version}</source>
|
||||||
|
<target>${java.version}</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-shade-plugin</artifactId>
|
||||||
|
<version>3.2.4</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>shade</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<createDependencyReducedPom>false</createDependencyReducedPom>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>src/main/resources</directory>
|
||||||
|
<filtering>true</filtering>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>spigotmc-repo</id>
|
||||||
|
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
|
||||||
|
</repository>
|
||||||
|
<repository>
|
||||||
|
<id>sonatype</id>
|
||||||
|
<url>https://oss.sonatype.org/content/groups/public/</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.spigotmc</groupId>
|
||||||
|
<artifactId>spigot-api</artifactId>
|
||||||
|
<version>1.17-R0.1-SNAPSHOT</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
188
src/main/java/site/deercloud/liteworldedit/Commands.java
Normal file
188
src/main/java/site/deercloud/liteworldedit/Commands.java
Normal file
@ -0,0 +1,188 @@
|
|||||||
|
package site.deercloud.liteworldedit;
|
||||||
|
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.command.TabExecutor;
|
||||||
|
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.Jobs.Job;
|
||||||
|
import site.deercloud.liteworldedit.Jobs.Place;
|
||||||
|
import site.deercloud.liteworldedit.Jobs.Remove;
|
||||||
|
import site.deercloud.liteworldedit.Managers.Point;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class Commands implements TabExecutor {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||||
|
if (args.length == 0) {
|
||||||
|
sender.sendMessage(ChatColor.GREEN + "LiteWorldEdit by DeerCloud");
|
||||||
|
sender.sendMessage(ChatColor.GREEN + "使用 /lwe help 查看帮助。");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (Objects.equals(args[0], "point") || Objects.equals(args[0], "p")) {
|
||||||
|
if (sender instanceof Player) {
|
||||||
|
Player player = (Player) sender;
|
||||||
|
if (args.length == 5) {
|
||||||
|
try {
|
||||||
|
Integer index = Integer.parseInt(args[1]);
|
||||||
|
int x = Integer.parseInt(args[2]);
|
||||||
|
int y = Integer.parseInt(args[3]);
|
||||||
|
int z = Integer.parseInt(args[4]);
|
||||||
|
// 选择的点不允许超过128格范围
|
||||||
|
if (!Job.in_range(player, new Location(player.getWorld(), x, y, z))) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
Point point = new Point(x, y, z, player);
|
||||||
|
LiteWorldEdit.instance.getCache().add_point(player, index, point);
|
||||||
|
sender.sendMessage("点 " + index + " 已设置为 " + x + ", " + y + ", " + z + "。");
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
sender.sendMessage("参数错误。");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sender.sendMessage("参数错误。");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sender.sendMessage("该命令只能由玩家执行。");
|
||||||
|
}
|
||||||
|
} else if (Objects.equals(args[0], "points")) {
|
||||||
|
if (sender instanceof Player) {
|
||||||
|
Player player = (Player) sender;
|
||||||
|
Map<Integer, Point> points = LiteWorldEdit.instance.getCache().get_points(player);
|
||||||
|
if (points != null) {
|
||||||
|
sender.sendMessage("你创建的点:");
|
||||||
|
for (Map.Entry<Integer, Point> entry : points.entrySet()) {
|
||||||
|
Point point = entry.getValue();
|
||||||
|
sender.sendMessage(entry.getKey() + ": " + point.x + ", " + point.y + ", " + point.z);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sender.sendMessage("你没有设置任何点。");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sender.sendMessage("该命令只能由玩家执行。");
|
||||||
|
}
|
||||||
|
} else if (Objects.equals(args[0], "place")) {
|
||||||
|
if (sender instanceof Player) {
|
||||||
|
Player player = (Player) sender;
|
||||||
|
if (args.length == 3) {
|
||||||
|
try {
|
||||||
|
Integer indexA = Integer.parseInt(args[1]);
|
||||||
|
Integer indexB = Integer.parseInt(args[2]);
|
||||||
|
Map<Integer, Point> points = LiteWorldEdit.instance.getCache().get_points(player);
|
||||||
|
if (points == null) {
|
||||||
|
sender.sendMessage("你没有设置任何点。");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
Point pointA = points.get(indexA);
|
||||||
|
Point pointB = points.get(indexB);
|
||||||
|
if (pointA == null || pointB == null) {
|
||||||
|
sender.sendMessage("点不存在。");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (out_of_region(pointA, pointB)) {
|
||||||
|
sender.sendMessage("选择的区域不可以超过 " + LiteWorldEdit.instance.getConfigMgr().getXMax() + "x" + LiteWorldEdit.instance.getConfigMgr().getYMax() + "x" + LiteWorldEdit.instance.getConfigMgr().getZMax() + "。");
|
||||||
|
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());
|
||||||
|
Fill.fill(player, player.getWorld(), pointA, pointB, material);
|
||||||
|
sender.sendMessage("已添加任务。");
|
||||||
|
return true;
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
sender.sendMessage("参数错误。");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sender.sendMessage("参数错误。");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sender.sendMessage("该命令只能由玩家执行。");
|
||||||
|
}
|
||||||
|
} else if (Objects.equals(args[0], "break")) {
|
||||||
|
if (sender instanceof Player) {
|
||||||
|
Player player = (Player) sender;
|
||||||
|
if (args.length == 3) {
|
||||||
|
try {
|
||||||
|
Integer indexA = Integer.parseInt(args[1]);
|
||||||
|
Integer indexB = Integer.parseInt(args[2]);
|
||||||
|
Map<Integer, Point> points = LiteWorldEdit.instance.getCache().get_points(player);
|
||||||
|
if (points == null) {
|
||||||
|
sender.sendMessage("你没有设置任何点。");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
Point pointA = points.get(indexA);
|
||||||
|
Point pointB = points.get(indexB);
|
||||||
|
if (pointA != null && pointB != null) {
|
||||||
|
if (out_of_region(pointA, pointB)) {
|
||||||
|
sender.sendMessage("选择的区域不可以超过 " + LiteWorldEdit.instance.getConfigMgr().getXMax() + "x" + LiteWorldEdit.instance.getConfigMgr().getYMax() + "x" + LiteWorldEdit.instance.getConfigMgr().getZMax() + "。");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
Empty.empty(player, player.getWorld(), pointA, pointB);
|
||||||
|
sender.sendMessage("已添加任务。");
|
||||||
|
} else {
|
||||||
|
sender.sendMessage("点不存在。");
|
||||||
|
}
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
sender.sendMessage("参数错误。");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sender.sendMessage("参数错误。");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sender.sendMessage("该命令只能由玩家执行。");
|
||||||
|
}
|
||||||
|
} else if (Objects.equals(args[0], "help")) {
|
||||||
|
print_help(sender);
|
||||||
|
} else {
|
||||||
|
sender.sendMessage("参数错误。");
|
||||||
|
}
|
||||||
|
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", "place", "break", "help");
|
||||||
|
} else if (args.length == 2) {
|
||||||
|
switch (args[1]) {
|
||||||
|
case "point":
|
||||||
|
return Collections.singletonList("[点序号(整数)] [x] [y] [z]");
|
||||||
|
case "place":
|
||||||
|
return Collections.singletonList("[点序号A] [点序号B] (需要手持被放置的方块)");
|
||||||
|
case "break":
|
||||||
|
return Collections.singletonList("[点序号A] [点序号B] (需要拥有下届合金锄)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void print_help(CommandSender sender) {
|
||||||
|
sender.sendMessage(ChatColor.GREEN + "LiteWorldEdit 帮助");
|
||||||
|
sender.sendMessage(ChatColor.GREEN + "/lwe point [点序号(整数)] [x] [y] [z] - 创建点");
|
||||||
|
sender.sendMessage(ChatColor.GREEN + "/lwe points - 查看所有点");
|
||||||
|
sender.sendMessage(ChatColor.GREEN + "/lwe place [点序号A] [点序号B] - (在AB点对角线间放置方块 - 需要手持被放置的方块)");
|
||||||
|
sender.sendMessage(ChatColor.GREEN + "/lwe break [点序号A] [点序号B] - (破坏AB点对角线间方块 - 需要拥有下届合金镐)");
|
||||||
|
sender.sendMessage(ChatColor.GREEN + "/lwe help - 查看帮助");
|
||||||
|
}
|
||||||
|
|
||||||
|
static public boolean out_of_region(Point A, Point B) {
|
||||||
|
int minX = Math.min(A.x, B.x);
|
||||||
|
int minY = Math.min(A.y, B.y);
|
||||||
|
int minZ = Math.min(A.z, B.z);
|
||||||
|
int maxX = Math.max(A.x, B.x);
|
||||||
|
int maxY = Math.max(A.y, B.y);
|
||||||
|
int maxZ = Math.max(A.z, B.z);
|
||||||
|
return !(maxX - minX <= LiteWorldEdit.instance.getConfigMgr().getXMax() && maxY - minY <= LiteWorldEdit.instance.getConfigMgr().getYMax() && maxZ - minZ <= LiteWorldEdit.instance.getConfigMgr().getZMax());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
18
src/main/java/site/deercloud/liteworldedit/Events.java
Normal file
18
src/main/java/site/deercloud/liteworldedit/Events.java
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
package site.deercloud.liteworldedit;
|
||||||
|
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
|
||||||
|
import java.util.EventListener;
|
||||||
|
|
||||||
|
public class Events implements Listener {
|
||||||
|
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||||
|
LiteWorldEdit.instance.getCache().delete_player_points(event.getPlayer());
|
||||||
|
LiteWorldEdit.instance.getCache().delete_player_jobs(event.getPlayer());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package site.deercloud.liteworldedit.JobGenerator;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import site.deercloud.liteworldedit.Jobs.Remove;
|
||||||
|
import site.deercloud.liteworldedit.LiteWorldEdit;
|
||||||
|
import site.deercloud.liteworldedit.Managers.Point;
|
||||||
|
|
||||||
|
public class Empty {
|
||||||
|
public static void empty(Player player, World world, Point p1, Point p2) {
|
||||||
|
// 经验扣除与校验
|
||||||
|
for (int x = Math.min(p1.x, p2.x); x <= Math.max(p1.x, p2.x); x++) {
|
||||||
|
for (int y = Math.min(p1.y, p2.y); y <= Math.max(p1.y, p2.y); y++) {
|
||||||
|
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);
|
||||||
|
Remove remove_job = new Remove(location, player);
|
||||||
|
LiteWorldEdit.instance.getCache().add_job(player, remove_job);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
package site.deercloud.liteworldedit.JobGenerator;
|
||||||
|
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.World;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
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 Fill {
|
||||||
|
|
||||||
|
public static void fill(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 y = Math.max(p1.y, p2.y); y >= Math.min(p1.y, p2.y); y--) {
|
||||||
|
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);
|
||||||
|
Place place_job = new Place(location, player, block);
|
||||||
|
LiteWorldEdit.instance.getCache().add_job(player, place_job);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
51
src/main/java/site/deercloud/liteworldedit/Jobs/Job.java
Normal file
51
src/main/java/site/deercloud/liteworldedit/Jobs/Job.java
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
package site.deercloud.liteworldedit.Jobs;
|
||||||
|
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.Inventory;
|
||||||
|
|
||||||
|
enum JobErrCode {
|
||||||
|
OK, // 无错误
|
||||||
|
NO_PERMISSION, // 没有权限
|
||||||
|
NO_PICKAXE, // 没有下界合金镐
|
||||||
|
NOT_ENOUGH_DURATION, // 耐久不足
|
||||||
|
NOT_ENOUGH_ITEMS, // 物品不足
|
||||||
|
OUT_OF_RANGE, // 超出距离
|
||||||
|
NOT_AIR_BLOCK, // 不是空气方块
|
||||||
|
NO_BREAKABLE, // 不可破坏
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Job {
|
||||||
|
protected World _world;
|
||||||
|
protected Location _location;
|
||||||
|
protected Long _time;
|
||||||
|
protected Player _creator;
|
||||||
|
protected Inventory _inventory;
|
||||||
|
|
||||||
|
public Long get_time() {
|
||||||
|
return _time;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Player get_creator() {
|
||||||
|
return _creator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public JobErrCode Do() {
|
||||||
|
// nothing
|
||||||
|
return JobErrCode.OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static public Boolean in_range(Player player, Location location) {
|
||||||
|
if (player.getWorld() != location.getWorld()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (player.getLocation().distance(location) > 128) {
|
||||||
|
player.sendMessage(ChatColor.RED + "不允许超过128格操作!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
64
src/main/java/site/deercloud/liteworldedit/Jobs/Place.java
Normal file
64
src/main/java/site/deercloud/liteworldedit/Jobs/Place.java
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
package site.deercloud.liteworldedit.Jobs;
|
||||||
|
|
||||||
|
import org.bukkit.*;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.block.BlockPlaceEvent;
|
||||||
|
import org.bukkit.inventory.EquipmentSlot;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import site.deercloud.liteworldedit.LoggerX;
|
||||||
|
|
||||||
|
public class Place extends Job {
|
||||||
|
private final Material _block;
|
||||||
|
|
||||||
|
|
||||||
|
public Place(Location location, Player player, Material material) {
|
||||||
|
_world = player.getWorld();
|
||||||
|
_location = location;
|
||||||
|
_creator = player;
|
||||||
|
_time = System.currentTimeMillis();
|
||||||
|
_block = material;
|
||||||
|
_inventory = player.getInventory();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JobErrCode Do() {
|
||||||
|
// 超出距离
|
||||||
|
if (!in_range(_creator, _location)) {
|
||||||
|
return JobErrCode.OUT_OF_RANGE;
|
||||||
|
}
|
||||||
|
// 跳过非空气方块
|
||||||
|
Block raw_block = _world.getBlockAt(_location);
|
||||||
|
if (!raw_block.isEmpty()) {
|
||||||
|
return JobErrCode.NOT_AIR_BLOCK;
|
||||||
|
}
|
||||||
|
// 获取到玩家物品中材料的第一个堆叠
|
||||||
|
int stack_index = _inventory.first(_block);
|
||||||
|
if (stack_index == -1) {
|
||||||
|
return JobErrCode.NOT_ENOUGH_ITEMS;
|
||||||
|
}
|
||||||
|
ItemStack stack = _inventory.getItem(stack_index);
|
||||||
|
if (stack == null) {
|
||||||
|
return JobErrCode.NOT_ENOUGH_ITEMS;
|
||||||
|
}
|
||||||
|
|
||||||
|
Block block = _world.getBlockAt(raw_block.getX() + 1, raw_block.getY(), raw_block.getZ());
|
||||||
|
// 校验是否可以放置
|
||||||
|
BlockPlaceEvent event = new BlockPlaceEvent(
|
||||||
|
block,
|
||||||
|
raw_block.getState(),
|
||||||
|
block,
|
||||||
|
stack,
|
||||||
|
_creator,
|
||||||
|
true,
|
||||||
|
EquipmentSlot.valueOf("HAND"));
|
||||||
|
Bukkit.getPluginManager().callEvent(event);
|
||||||
|
if (!event.isCancelled()) {
|
||||||
|
raw_block.setType(_block);
|
||||||
|
stack.setAmount(stack.getAmount() - 1);
|
||||||
|
return JobErrCode.OK;
|
||||||
|
} else {
|
||||||
|
return JobErrCode.NO_PERMISSION;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
79
src/main/java/site/deercloud/liteworldedit/Jobs/Remove.java
Normal file
79
src/main/java/site/deercloud/liteworldedit/Jobs/Remove.java
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
package site.deercloud.liteworldedit.Jobs;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.enchantments.Enchantment;
|
||||||
|
import org.bukkit.inventory.meta.Damageable;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.block.BlockBreakEvent;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
import site.deercloud.liteworldedit.LoggerX;
|
||||||
|
|
||||||
|
public class Remove extends Job {
|
||||||
|
|
||||||
|
public Remove(Location location, Player player) {
|
||||||
|
_world = player.getWorld();
|
||||||
|
_location = location;
|
||||||
|
_creator = player;
|
||||||
|
_time = System.currentTimeMillis();
|
||||||
|
_inventory = player.getInventory();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JobErrCode Do() {
|
||||||
|
// 超出距离
|
||||||
|
if (!in_range(_creator, _location)) {
|
||||||
|
return JobErrCode.OUT_OF_RANGE;
|
||||||
|
}
|
||||||
|
Block raw_block = _world.getBlockAt(_location);
|
||||||
|
// 跳过不破坏的对象
|
||||||
|
if (raw_block.isLiquid() || raw_block.isEmpty() || raw_block.getType().getHardness() == -1) {
|
||||||
|
return JobErrCode.NO_BREAKABLE;
|
||||||
|
}
|
||||||
|
// 获取玩家背包中的下届合金镐
|
||||||
|
int stack_index = _inventory.first(Material.NETHERITE_PICKAXE);
|
||||||
|
if (stack_index == -1) {
|
||||||
|
return JobErrCode.NO_PICKAXE;
|
||||||
|
}
|
||||||
|
ItemStack pickaxe = _inventory.getItem(stack_index);
|
||||||
|
if (pickaxe == null) {
|
||||||
|
LoggerX.debug("获取到的下界合金镐为空!");
|
||||||
|
return JobErrCode.NO_PICKAXE;
|
||||||
|
}
|
||||||
|
ItemMeta pickaxe_meta = pickaxe.getItemMeta();
|
||||||
|
if (pickaxe_meta == null) {
|
||||||
|
LoggerX.debug("获取到的下界合金镐元数据为空!");
|
||||||
|
return JobErrCode.NO_PICKAXE;
|
||||||
|
}
|
||||||
|
if (!(pickaxe_meta instanceof Damageable)) {
|
||||||
|
LoggerX.debug("无法转换为Damageable!");
|
||||||
|
return JobErrCode.NO_PICKAXE;
|
||||||
|
}
|
||||||
|
// 如果耐久小于10,提示玩家
|
||||||
|
Damageable damageable = (Damageable) pickaxe_meta;
|
||||||
|
if (damageable.getDamage() >= 2031 - 10) {
|
||||||
|
LoggerX.err(_creator, "下界合金镐耐久太低!");
|
||||||
|
return JobErrCode.NOT_ENOUGH_DURATION;
|
||||||
|
}
|
||||||
|
BlockBreakEvent event = new BlockBreakEvent(raw_block, _creator);
|
||||||
|
Bukkit.getPluginManager().callEvent(event);
|
||||||
|
if (!event.isCancelled()) {
|
||||||
|
raw_block.setType(Material.AIR);
|
||||||
|
// 获取耐久附魔
|
||||||
|
int durability = pickaxe.getEnchantmentLevel(Enchantment.DURABILITY);
|
||||||
|
double random = Math.random();
|
||||||
|
if (random < 1.0 / (durability + 1)) {
|
||||||
|
// 扣除耐久
|
||||||
|
damageable.setDamage(damageable.getDamage() + 1);
|
||||||
|
pickaxe.setItemMeta((ItemMeta) damageable);
|
||||||
|
|
||||||
|
}
|
||||||
|
return JobErrCode.OK;
|
||||||
|
} else {
|
||||||
|
return JobErrCode.NO_PERMISSION;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,53 @@
|
|||||||
|
package site.deercloud.liteworldedit;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
import site.deercloud.liteworldedit.Jobs.Job;
|
||||||
|
import site.deercloud.liteworldedit.Managers.ConfigManager;
|
||||||
|
import site.deercloud.liteworldedit.Managers.Cache;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public final class LiteWorldEdit extends JavaPlugin {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEnable() {
|
||||||
|
// Plugin startup logic
|
||||||
|
instance = this;
|
||||||
|
_config = new ConfigManager();
|
||||||
|
_cache = new Cache();
|
||||||
|
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Job job = _cache.get_one_job();
|
||||||
|
if (job != null) {
|
||||||
|
job.Do();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.runTaskTimer(this, 0, 1);
|
||||||
|
|
||||||
|
Objects.requireNonNull(Bukkit.getPluginCommand("LiteWorldEdit")).setExecutor(new Commands());
|
||||||
|
Objects.requireNonNull(Bukkit.getPluginCommand("LiteWorldEdit")).setTabCompleter(new Commands());
|
||||||
|
|
||||||
|
LoggerX.info("插件启动成功。");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDisable() {
|
||||||
|
// Plugin shutdown logic
|
||||||
|
}
|
||||||
|
|
||||||
|
public ConfigManager getConfigMgr() {
|
||||||
|
return _config;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Cache getCache() {
|
||||||
|
return _cache;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static LiteWorldEdit instance;
|
||||||
|
private ConfigManager _config;
|
||||||
|
private Cache _cache;
|
||||||
|
}
|
52
src/main/java/site/deercloud/liteworldedit/LoggerX.java
Normal file
52
src/main/java/site/deercloud/liteworldedit/LoggerX.java
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
package site.deercloud.liteworldedit;
|
||||||
|
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
public class LoggerX {
|
||||||
|
private static final LiteWorldEdit _plugin = LiteWorldEdit.instance;
|
||||||
|
private static final Logger _logger = _plugin.getLogger();
|
||||||
|
|
||||||
|
public static void info(Player player, String message) {
|
||||||
|
player.sendMessage(ChatColor.GREEN + " LWE I | " + message);
|
||||||
|
if (_plugin.getConfigMgr().isDebug())
|
||||||
|
debug("来自玩家[ " + player.getName() + " ] 的信息 | " + message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void info(String message) {
|
||||||
|
_logger.info(ChatColor.GREEN + " I | " + message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void warn(Player player, String message) {
|
||||||
|
player.sendMessage(ChatColor.YELLOW + " LWE W | " + message);
|
||||||
|
if (_plugin.getConfigMgr().isDebug())
|
||||||
|
debug("来自玩家[ " + player.getName() + " ] 的警告 | " + message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void warn(String message) {
|
||||||
|
_logger.info(ChatColor.YELLOW + " W | " + message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void err(Player player, String message) {
|
||||||
|
player.sendMessage(ChatColor.RED + " LWE E | " + message);
|
||||||
|
if (_plugin.getConfigMgr().isDebug())
|
||||||
|
debug("来自玩家[ " + player.getName() + " ] 的报错 | " + message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void err(String message) {
|
||||||
|
_logger.info(ChatColor.RED + " E | " + message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void debug(Player player, String message) {
|
||||||
|
if (!_plugin.getConfigMgr().isDebug()) return;
|
||||||
|
if (player.isOp())
|
||||||
|
player.sendMessage(ChatColor.BLUE + " LWE D | " + message);
|
||||||
|
debug("来自玩家[ " + player.getName() + " ] 的调试 | " + message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void debug(String message) {
|
||||||
|
_logger.info(ChatColor.BLUE + " D | " + message);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,52 @@
|
|||||||
|
package site.deercloud.liteworldedit.Managers;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import site.deercloud.liteworldedit.Jobs.Job;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class Cache {
|
||||||
|
private final Map<String, Map<Integer, Point>> _points;
|
||||||
|
private final Map<String, LinkedList<Job>> _jobs;
|
||||||
|
|
||||||
|
public Cache() {
|
||||||
|
_points = new HashMap<String, Map<Integer, Point>>();
|
||||||
|
_jobs = new HashMap<String, LinkedList<Job>>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void add_point(Player player, Integer index, Point point) {
|
||||||
|
if (!_points.containsKey(player.getUniqueId().toString())) {
|
||||||
|
_points.put(player.getUniqueId().toString(), new HashMap<Integer, Point>());
|
||||||
|
}
|
||||||
|
_points.get(player.getUniqueId().toString()).put(index, point);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void add_job(Player player, Job job) {
|
||||||
|
if (!_jobs.containsKey(player.getUniqueId().toString())) {
|
||||||
|
_jobs.put(player.getUniqueId().toString(), new LinkedList<Job>());
|
||||||
|
}
|
||||||
|
_jobs.get(player.getUniqueId().toString()).add(job);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Job get_one_job() {
|
||||||
|
for (Map.Entry<String, LinkedList<Job>> entry : _jobs.entrySet()) {
|
||||||
|
if (entry.getValue().size() > 0) {
|
||||||
|
return entry.getValue().removeFirst();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
public Map<Integer, Point> get_points(Player player) {
|
||||||
|
return _points.get(player.getUniqueId().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void delete_player_jobs(Player player) {
|
||||||
|
_jobs.remove(player.getUniqueId().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void delete_player_points(Player player) {
|
||||||
|
_points.remove(player.getUniqueId().toString());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,63 @@
|
|||||||
|
package site.deercloud.liteworldedit.Managers;
|
||||||
|
|
||||||
|
import com.sun.org.apache.xpath.internal.operations.Bool;
|
||||||
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
|
import site.deercloud.liteworldedit.LiteWorldEdit;
|
||||||
|
|
||||||
|
public class ConfigManager {
|
||||||
|
public ConfigManager() {
|
||||||
|
_plugin.saveDefaultConfig();
|
||||||
|
reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reload() {
|
||||||
|
_plugin.reloadConfig();
|
||||||
|
_file = _plugin.getConfig();
|
||||||
|
_debug = _file.getBoolean("Debug", false);
|
||||||
|
_x_max = _file.getInt("MaxX", 64);
|
||||||
|
_y_max = _file.getInt("MaxY", 64);
|
||||||
|
_z_max = _file.getInt("MaxZ", 64);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean isDebug() {
|
||||||
|
return _debug;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDebug(Boolean debug) {
|
||||||
|
_debug = debug;
|
||||||
|
_file.set("Debug", debug);
|
||||||
|
_plugin.saveConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getXMax() {
|
||||||
|
return _x_max;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getYMax() {
|
||||||
|
return _y_max;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getZMax() {
|
||||||
|
return _z_max;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMaxSize(Integer x, Integer y, Integer z) {
|
||||||
|
_x_max = x;
|
||||||
|
_y_max = y;
|
||||||
|
_z_max = z;
|
||||||
|
_file.set("MaxX", x);
|
||||||
|
_file.set("MaxY", y);
|
||||||
|
_file.set("MaxZ", z);
|
||||||
|
_plugin.saveConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private final LiteWorldEdit _plugin = LiteWorldEdit.instance;
|
||||||
|
private FileConfiguration _file;
|
||||||
|
|
||||||
|
private Boolean _debug;
|
||||||
|
|
||||||
|
private Integer _x_max;
|
||||||
|
private Integer _y_max;
|
||||||
|
private Integer _z_max;
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package site.deercloud.liteworldedit.Managers;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
public class Point {
|
||||||
|
public Point(Integer x, Integer y, Integer z, Player player) {
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
this.z = z;
|
||||||
|
this.player = player;
|
||||||
|
}
|
||||||
|
public Integer x;
|
||||||
|
public Integer y;
|
||||||
|
public Integer z;
|
||||||
|
|
||||||
|
public Player player;
|
||||||
|
}
|
7
src/main/resources/config.yml
Normal file
7
src/main/resources/config.yml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
MaxX: 64
|
||||||
|
|
||||||
|
MaxY: 64
|
||||||
|
|
||||||
|
MaxZ: 64
|
||||||
|
|
||||||
|
Debug: false
|
14
src/main/resources/plugin.yml
Normal file
14
src/main/resources/plugin.yml
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
name: LiteWorldEdit
|
||||||
|
version: '${project.version}'
|
||||||
|
main: site.deercloud.liteworldedit.LiteWorldEdit
|
||||||
|
api-version: 1.14
|
||||||
|
prefix: LWE
|
||||||
|
load: STARTUP
|
||||||
|
authors: [ Luming ]
|
||||||
|
description: 生存用简易创世神。
|
||||||
|
website: https://blog.deercloud.site
|
||||||
|
commands:
|
||||||
|
LiteWorldEdit:
|
||||||
|
description: 简易创世神命令
|
||||||
|
usage: /lwe <cmd>
|
||||||
|
aliases: [lwe]
|
Loading…
Reference in New Issue
Block a user