commit 1fb5691b321fc58d1a2fe0301cfbf0a0ebf8b27b Author: 张宇衡 Date: Fri Jun 2 10:13:59 2023 +0800 变更 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4788b4b --- /dev/null +++ b/.gitignore @@ -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/ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..bb3aa80 --- /dev/null +++ b/pom.xml @@ -0,0 +1,76 @@ + + + 4.0.0 + + site.deercloud + LiteWorldEdit + 1.0-SNAPSHOT + jar + + LiteWorldEdit + + 生存用简易创世神。 + + 1.8 + UTF-8 + + https://blog.deercloud.site + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.4 + + + package + + shade + + + false + + + + + + + + src/main/resources + true + + + + + + + spigotmc-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + sonatype + https://oss.sonatype.org/content/groups/public/ + + + + + + org.spigotmc + spigot-api + 1.17-R0.1-SNAPSHOT + provided + + + diff --git a/src/main/java/site/deercloud/liteworldedit/Commands.java b/src/main/java/site/deercloud/liteworldedit/Commands.java new file mode 100644 index 0000000..7f12c16 --- /dev/null +++ b/src/main/java/site/deercloud/liteworldedit/Commands.java @@ -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 points = LiteWorldEdit.instance.getCache().get_points(player); + if (points != null) { + sender.sendMessage("你创建的点:"); + for (Map.Entry 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 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 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 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()); + } + +} diff --git a/src/main/java/site/deercloud/liteworldedit/Events.java b/src/main/java/site/deercloud/liteworldedit/Events.java new file mode 100644 index 0000000..ea9a568 --- /dev/null +++ b/src/main/java/site/deercloud/liteworldedit/Events.java @@ -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()); + } +} diff --git a/src/main/java/site/deercloud/liteworldedit/JobGenerator/Empty.java b/src/main/java/site/deercloud/liteworldedit/JobGenerator/Empty.java new file mode 100644 index 0000000..ff3ca9e --- /dev/null +++ b/src/main/java/site/deercloud/liteworldedit/JobGenerator/Empty.java @@ -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); + } + } + } + + } +} diff --git a/src/main/java/site/deercloud/liteworldedit/JobGenerator/Fill.java b/src/main/java/site/deercloud/liteworldedit/JobGenerator/Fill.java new file mode 100644 index 0000000..38967d4 --- /dev/null +++ b/src/main/java/site/deercloud/liteworldedit/JobGenerator/Fill.java @@ -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); + } + } + } + + } +} diff --git a/src/main/java/site/deercloud/liteworldedit/Jobs/Job.java b/src/main/java/site/deercloud/liteworldedit/Jobs/Job.java new file mode 100644 index 0000000..46bb359 --- /dev/null +++ b/src/main/java/site/deercloud/liteworldedit/Jobs/Job.java @@ -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; + } + +} diff --git a/src/main/java/site/deercloud/liteworldedit/Jobs/Place.java b/src/main/java/site/deercloud/liteworldedit/Jobs/Place.java new file mode 100644 index 0000000..39b0fdd --- /dev/null +++ b/src/main/java/site/deercloud/liteworldedit/Jobs/Place.java @@ -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; + } + } +} diff --git a/src/main/java/site/deercloud/liteworldedit/Jobs/Remove.java b/src/main/java/site/deercloud/liteworldedit/Jobs/Remove.java new file mode 100644 index 0000000..e3a1f7e --- /dev/null +++ b/src/main/java/site/deercloud/liteworldedit/Jobs/Remove.java @@ -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; + } + } +} diff --git a/src/main/java/site/deercloud/liteworldedit/LiteWorldEdit.java b/src/main/java/site/deercloud/liteworldedit/LiteWorldEdit.java new file mode 100644 index 0000000..bbacc03 --- /dev/null +++ b/src/main/java/site/deercloud/liteworldedit/LiteWorldEdit.java @@ -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; +} diff --git a/src/main/java/site/deercloud/liteworldedit/LoggerX.java b/src/main/java/site/deercloud/liteworldedit/LoggerX.java new file mode 100644 index 0000000..a6ff970 --- /dev/null +++ b/src/main/java/site/deercloud/liteworldedit/LoggerX.java @@ -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); + } +} diff --git a/src/main/java/site/deercloud/liteworldedit/Managers/Cache.java b/src/main/java/site/deercloud/liteworldedit/Managers/Cache.java new file mode 100644 index 0000000..74d27bb --- /dev/null +++ b/src/main/java/site/deercloud/liteworldedit/Managers/Cache.java @@ -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> _points; + private final Map> _jobs; + + public Cache() { + _points = new HashMap>(); + _jobs = new HashMap>(); + } + + public void add_point(Player player, Integer index, Point point) { + if (!_points.containsKey(player.getUniqueId().toString())) { + _points.put(player.getUniqueId().toString(), new HashMap()); + } + _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()); + } + _jobs.get(player.getUniqueId().toString()).add(job); + } + + public Job get_one_job() { + for (Map.Entry> entry : _jobs.entrySet()) { + if (entry.getValue().size() > 0) { + return entry.getValue().removeFirst(); + } + } + return null; + } + public Map 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()); + } +} diff --git a/src/main/java/site/deercloud/liteworldedit/Managers/ConfigManager.java b/src/main/java/site/deercloud/liteworldedit/Managers/ConfigManager.java new file mode 100644 index 0000000..a702a52 --- /dev/null +++ b/src/main/java/site/deercloud/liteworldedit/Managers/ConfigManager.java @@ -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; +} diff --git a/src/main/java/site/deercloud/liteworldedit/Managers/Point.java b/src/main/java/site/deercloud/liteworldedit/Managers/Point.java new file mode 100644 index 0000000..41d66e2 --- /dev/null +++ b/src/main/java/site/deercloud/liteworldedit/Managers/Point.java @@ -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; +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 0000000..7c9823e --- /dev/null +++ b/src/main/resources/config.yml @@ -0,0 +1,7 @@ +MaxX: 64 + +MaxY: 64 + +MaxZ: 64 + +Debug: false \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..ccb4c28 --- /dev/null +++ b/src/main/resources/plugin.yml @@ -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 + aliases: [lwe] \ No newline at end of file