From a7ada230cd65a76960f914866b564a2851fac998 Mon Sep 17 00:00:00 2001 From: Xiao-MoMi <70987828+Xiao-MoMi@users.noreply.github.com> Date: Wed, 8 Jun 2022 21:56:04 +0800 Subject: [PATCH] 1.4.3 worlds fix --- .../customcrops/commands/CommandHandler.java | 13 +- .../commands/CommandTabComplete.java | 6 + .../datamanager/ConfigManager.java | 1 + .../customcrops/datamanager/CropManager.java | 247 +++++++++--------- .../datamanager/MessageManager.java | 2 +- .../customcrops/datamanager/NextSeason.java | 26 +- .../datamanager/SprinklerManager.java | 74 +++--- .../integrations/ResidenceIntegrations.java | 1 + .../customcrops/libs/minedown/MineDown.java | 2 +- .../libs/minedown/MineDownParser.java | 12 +- .../libs/minedown/MineDownStringifier.java | 12 +- .../customcrops/libs/minedown/Replacer.java | 2 +- .../customcrops/libs/minedown/Util.java | 2 +- .../limits/MaxSprinklersPerChunk.java | 3 - .../customcrops/listener/BreakCrops.java | 4 +- .../customcrops/listener/RightClickBlock.java | 2 +- .../listener/RightClickCustomBlock.java | 133 +++++----- .../customcrops/timer/TimeCheck.java | 9 +- src/main/resources/config.yml | 5 +- src/main/resources/crops.yml | 24 +- src/main/resources/plugin.yml | 8 +- 21 files changed, 297 insertions(+), 291 deletions(-) diff --git a/src/main/java/net/momirealms/customcrops/commands/CommandHandler.java b/src/main/java/net/momirealms/customcrops/commands/CommandHandler.java index ddc9de9..2e5f461 100644 --- a/src/main/java/net/momirealms/customcrops/commands/CommandHandler.java +++ b/src/main/java/net/momirealms/customcrops/commands/CommandHandler.java @@ -22,11 +22,7 @@ public class CommandHandler implements CommandExecutor { @Override @ParametersAreNonnullByDefault public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - - if(sender instanceof Player && !sender.isOp()){ - return false; - } - + if(args.length<1) return true; //重载插件 if(args[0].equalsIgnoreCase("reload")){ @@ -41,6 +37,7 @@ public class CommandHandler implements CommandExecutor { } //设置季节 if(args[0].equalsIgnoreCase("setseason")){ + if(args.length<2) return true; if(ConfigManager.Config.season){ FileConfiguration config = CustomCrops.instance.getConfig(); @@ -84,7 +81,8 @@ public class CommandHandler implements CommandExecutor { } //强制生长 if(args[0].equalsIgnoreCase("forcegrow")){ - Bukkit.getScheduler().runTaskAsynchronously(CustomCrops.instance, CropManager::CropGrow); + if(args.length<2) return true; + Bukkit.getScheduler().runTaskAsynchronously(CustomCrops.instance, () -> CropManager.CropGrow(args[1])); if(sender instanceof Player){ MessageManager.playerMessage(ConfigManager.Config.prefix + ConfigManager.Config.force_grow, (Player) sender); }else { @@ -94,7 +92,8 @@ public class CommandHandler implements CommandExecutor { } //强制洒水 if(args[0].equalsIgnoreCase("forcewater")){ - Bukkit.getScheduler().runTaskAsynchronously(CustomCrops.instance, SprinklerManager::SprinklerWork); + if(args.length<2) return true; + Bukkit.getScheduler().runTaskAsynchronously(CustomCrops.instance, () -> SprinklerManager.SprinklerWork(args[1])); if(sender instanceof Player){ MessageManager.playerMessage(ConfigManager.Config.prefix + ConfigManager.Config.force_water, (Player) sender); }else { diff --git a/src/main/java/net/momirealms/customcrops/commands/CommandTabComplete.java b/src/main/java/net/momirealms/customcrops/commands/CommandTabComplete.java index ed50ac9..a2f5377 100644 --- a/src/main/java/net/momirealms/customcrops/commands/CommandTabComplete.java +++ b/src/main/java/net/momirealms/customcrops/commands/CommandTabComplete.java @@ -1,11 +1,14 @@ package net.momirealms.customcrops.commands; +import net.momirealms.customcrops.datamanager.ConfigManager; +import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -19,6 +22,9 @@ public class CommandTabComplete implements TabCompleter { if(args[0].equalsIgnoreCase("setseason")){ return Arrays.asList("spring","summer","autumn","winter"); } + if(args[0].equalsIgnoreCase("forcegrow") || args[0].equalsIgnoreCase("forcewater")){ + return ConfigManager.Config.worlds; + } return null; } } diff --git a/src/main/java/net/momirealms/customcrops/datamanager/ConfigManager.java b/src/main/java/net/momirealms/customcrops/datamanager/ConfigManager.java index 7cc5787..b9cc3ca 100644 --- a/src/main/java/net/momirealms/customcrops/datamanager/ConfigManager.java +++ b/src/main/java/net/momirealms/customcrops/datamanager/ConfigManager.java @@ -136,6 +136,7 @@ public class ConfigManager { Config.summer = configuration.getString("messages.summer"); Config.autumn = configuration.getString("messages.autumn"); Config.winter = configuration.getString("messages.winter"); + Config.winter = configuration.getString("messages.noperm"); } /* diff --git a/src/main/java/net/momirealms/customcrops/datamanager/CropManager.java b/src/main/java/net/momirealms/customcrops/datamanager/CropManager.java index 95046cf..760ac53 100644 --- a/src/main/java/net/momirealms/customcrops/datamanager/CropManager.java +++ b/src/main/java/net/momirealms/customcrops/datamanager/CropManager.java @@ -11,6 +11,7 @@ import org.bukkit.block.Block; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.scheduler.BukkitScheduler; +import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.IOException; @@ -66,17 +67,11 @@ public class CropManager { } } - /* - 添加农作物实例 - */ - public static void putInstance(Location location, String crop) { - CROPS.put(location, crop); - } /* 生长部分 */ - public static void CropGrow() { + public static void CropGrow(String worldName) { /* 阶段1:更新数据 */ @@ -97,154 +92,150 @@ public class CropManager { 阶段2:清理数据内无效的农作物并让有效农作物生长 */ long start2 = System.currentTimeMillis(); - ConfigManager.Config.worlds.forEach(worldName ->{ - if(data.contains(worldName)){ + if(data.contains(worldName)){ + World world = Bukkit.getWorld(worldName); + data.getConfigurationSection(worldName).getKeys(false).forEach(key ->{ + String[] coordinate = StringUtils.split(key,","); + //先判断区块是否加载,未加载则不进行下一步计算 + if (world.isChunkLoaded(Integer.parseInt(coordinate[0])/16, Integer.parseInt(coordinate[2])/16)){ - World world = Bukkit.getWorld(worldName); - data.getConfigurationSection(worldName).getKeys(false).forEach(key ->{ + Location sLoc = new Location(world,Double.parseDouble(coordinate[0]),Double.parseDouble(coordinate[1]),Double.parseDouble(coordinate[2])); + CustomBlock seedBlock = CustomBlock.byAlreadyPlaced(sLoc.getBlock()); - String[] coordinate = StringUtils.split(key,","); - //先判断区块是否加载,未加载则不进行下一步计算 - if (world.isChunkLoaded(Integer.parseInt(coordinate[0])/16, Integer.parseInt(coordinate[2])/16)){ - - Location sLoc = new Location(world,Double.parseDouble(coordinate[0]),Double.parseDouble(coordinate[1]),Double.parseDouble(coordinate[2])); - CustomBlock seedBlock = CustomBlock.byAlreadyPlaced(sLoc.getBlock()); - - if(seedBlock == null){ + if(seedBlock == null){ + CROPS.remove(sLoc); + data.set(worldName+"."+coordinate[0]+","+coordinate[1]+","+coordinate[2], null); + }else{ + String namespacedID = seedBlock.getNamespacedID(); + /* + 对之前旧版本的一些兼容 + 以及一些意料之外的情况,防止报错 + */ + if(namespacedID.equalsIgnoreCase(ConfigManager.Config.dead)){ CROPS.remove(sLoc); data.set(worldName+"."+coordinate[0]+","+coordinate[1]+","+coordinate[2], null); - }else{ - String namespacedID = seedBlock.getNamespacedID(); - /* - 对之前旧版本的一些兼容 - 以及一些意料之外的情况,防止报错 - */ - if(namespacedID.equalsIgnoreCase(ConfigManager.Config.dead)){ - CROPS.remove(sLoc); - data.set(worldName+"."+coordinate[0]+","+coordinate[1]+","+coordinate[2], null); - return; - } - if(namespacedID.contains("_stage_")){ + return; + } + if(namespacedID.contains("_stage_")){ - Location potLoc = sLoc.clone().subtract(0,1,0); - Block potBlock = potLoc.getBlock(); - CustomBlock pot = CustomBlock.byAlreadyPlaced(potBlock); + Location potLoc = sLoc.clone().subtract(0,1,0); + Block potBlock = potLoc.getBlock(); + CustomBlock pot = CustomBlock.byAlreadyPlaced(potBlock); - if (pot != null){ - String potName = pot.getNamespacedID(); - /* - 是湿润的种植盆吗 - */ - if (potName.equalsIgnoreCase(ConfigManager.Config.watered_pot)){ + if (pot != null){ + String potName = pot.getNamespacedID(); + /* + 是湿润的种植盆吗 + */ + if (potName.equalsIgnoreCase(ConfigManager.Config.watered_pot)){ - String[] split = StringUtils.split(namespacedID,":"); - String[] cropNameList = StringUtils.split(split[1],"_"); - Crop crop = ConfigManager.CONFIG.get(cropNameList[0]); + String[] split = StringUtils.split(namespacedID,":"); + String[] cropNameList = StringUtils.split(split[1],"_"); + Crop crop = ConfigManager.CONFIG.get(cropNameList[0]); - //季节判断 - Label_out: - if(ConfigManager.Config.season){ - if(ConfigManager.Config.greenhouse){ - for(int i = 1; i <= ConfigManager.Config.range; i++){ - CustomBlock cb = CustomBlock.byAlreadyPlaced(sLoc.clone().add(0,i,0).getBlock()); - if (cb != null){ - if(cb.getNamespacedID().equalsIgnoreCase(ConfigManager.Config.glass)){ - break Label_out; - } + //季节判断 + Label_out: + if(ConfigManager.Config.season){ + if(ConfigManager.Config.greenhouse){ + for(int i = 1; i <= ConfigManager.Config.range; i++){ + CustomBlock cb = CustomBlock.byAlreadyPlaced(sLoc.clone().add(0,i,0).getBlock()); + if (cb != null){ + if(cb.getNamespacedID().equalsIgnoreCase(ConfigManager.Config.glass)){ + break Label_out; } } } - boolean ws = true; - for(String season : crop.getSeasons()){ - if (Objects.equals(season, ConfigManager.Config.current)) { - ws = false; - break; - } - } - if(ws){ - CROPS.remove(sLoc); - data.set(worldName+"."+coordinate[0]+","+coordinate[1]+","+coordinate[2], null); - bukkitScheduler.callSyncMethod(CustomCrops.instance, () -> { - CustomBlock.remove(sLoc); - CustomBlock.place(ConfigManager.Config.dead, sLoc); - return null; - }); - return; + } + boolean ws = true; + for(String season : crop.getSeasons()){ + if (Objects.equals(season, ConfigManager.Config.current)) { + ws = false; + break; } } - //下一阶段判断 - int nextStage = Integer.parseInt(cropNameList[2]) + 1; - if (CustomBlock.getInstance(split[0] +":"+cropNameList[0] + "_stage_" + nextStage) != null) { - bukkitScheduler.callSyncMethod(CustomCrops.instance, () ->{ - CustomBlock.remove(potLoc); - CustomBlock.place(ConfigManager.Config.pot, potLoc); - if(Math.random()< crop.getChance()){ - CustomBlock.remove(sLoc); - CustomBlock.place(split[0] + ":" + cropNameList[0] + "_stage_" + nextStage, sLoc); - } - return null; - }); - } - //巨大化判断 - else if(crop.getWillGiant()){ - bukkitScheduler.callSyncMethod(CustomCrops.instance, () ->{ - CustomBlock.remove(potLoc); - CustomBlock.place(ConfigManager.Config.pot, potLoc); - if(crop.getGiantChance() > Math.random()){ - CROPS.remove(sLoc); - data.set(worldName+"."+coordinate[0]+","+coordinate[1]+","+coordinate[2], null); - CustomBlock.remove(sLoc); - CustomBlock.place(crop.getGiant(), sLoc); - } + if(ws){ + CROPS.remove(sLoc); + data.set(worldName+"."+coordinate[0]+","+coordinate[1]+","+coordinate[2], null); + bukkitScheduler.callSyncMethod(CustomCrops.instance, () -> { + CustomBlock.remove(sLoc); + CustomBlock.place(ConfigManager.Config.dead, sLoc); return null; }); + return; } } - /* - 是干燥的种植盆吗 - */ - else if(potName.equalsIgnoreCase(ConfigManager.Config.pot)){ - if(ConfigManager.Config.season) { - if(ConfigManager.Config.greenhouse){ - for(int i = 1; i <= ConfigManager.Config.range; i++){ - CustomBlock cb = CustomBlock.byAlreadyPlaced(sLoc.clone().add(0,i,0).getBlock()); - if (cb != null){ - if(cb.getNamespacedID().equalsIgnoreCase(ConfigManager.Config.glass)){ - return; - } + //下一阶段判断 + int nextStage = Integer.parseInt(cropNameList[2]) + 1; + if (CustomBlock.getInstance(split[0] +":"+cropNameList[0] + "_stage_" + nextStage) != null) { + bukkitScheduler.callSyncMethod(CustomCrops.instance, () ->{ + CustomBlock.remove(potLoc); + CustomBlock.place(ConfigManager.Config.pot, potLoc); + if(Math.random()< crop.getChance()){ + CustomBlock.remove(sLoc); + CustomBlock.place(split[0] + ":" + cropNameList[0] + "_stage_" + nextStage, sLoc); + } + return null; + }); + } + //巨大化判断 + else if(crop.getWillGiant()){ + bukkitScheduler.callSyncMethod(CustomCrops.instance, () ->{ + CustomBlock.remove(potLoc); + CustomBlock.place(ConfigManager.Config.pot, potLoc); + if(crop.getGiantChance() > Math.random()){ + CROPS.remove(sLoc); + data.set(worldName+"."+coordinate[0]+","+coordinate[1]+","+coordinate[2], null); + CustomBlock.remove(sLoc); + CustomBlock.place(crop.getGiant(), sLoc); + } + return null; + }); + } + } + /* + 是干燥的种植盆吗 + */ + else if(potName.equalsIgnoreCase(ConfigManager.Config.pot)){ + if(ConfigManager.Config.season) { + if(ConfigManager.Config.greenhouse){ + for(int i = 1; i <= ConfigManager.Config.range; i++){ + CustomBlock cb = CustomBlock.byAlreadyPlaced(sLoc.clone().add(0,i,0).getBlock()); + if (cb != null){ + if(cb.getNamespacedID().equalsIgnoreCase(ConfigManager.Config.glass)){ + return; } } } - boolean ws = true; - Crop crop = ConfigManager.CONFIG.get(StringUtils.split(StringUtils.split(namespacedID,":")[1],"_")[0]); - for (String season : crop.getSeasons()) { - if (Objects.equals(season, ConfigManager.Config.current)) { - ws = false; - break; - } - } - if (ws) { - CROPS.remove(sLoc); - data.set(worldName+"."+coordinate[0]+","+coordinate[1]+","+coordinate[2], null); - bukkitScheduler.callSyncMethod(CustomCrops.instance, () -> { - CustomBlock.remove(sLoc); - CustomBlock.place(ConfigManager.Config.dead, sLoc); - return null; - }); + } + boolean ws = true; + Crop crop = ConfigManager.CONFIG.get(StringUtils.split(StringUtils.split(namespacedID,":")[1],"_")[0]); + for (String season : crop.getSeasons()) { + if (Objects.equals(season, ConfigManager.Config.current)) { + ws = false; + break; } } + if (ws) { + CROPS.remove(sLoc); + data.set(worldName+"."+coordinate[0]+","+coordinate[1]+","+coordinate[2], null); + bukkitScheduler.callSyncMethod(CustomCrops.instance, () -> { + CustomBlock.remove(sLoc); + CustomBlock.place(ConfigManager.Config.dead, sLoc); + return null; + }); + } } } } - else { - CROPS.remove(sLoc); - data.set(worldName+"."+coordinate[0]+","+coordinate[1]+","+coordinate[2], null); - } + } + else { + CROPS.remove(sLoc); + data.set(worldName+"."+coordinate[0]+","+coordinate[1]+","+coordinate[2], null); } } - }); - } - }); + } + }); + } long finish2 = System.currentTimeMillis(); MessageManager.consoleMessage("&#ccfbff-#ef96c5&[CustomCrops] &7农作物生长耗时&a" + (finish2 - start2) + "&fms",Bukkit.getConsoleSender()); diff --git a/src/main/java/net/momirealms/customcrops/datamanager/MessageManager.java b/src/main/java/net/momirealms/customcrops/datamanager/MessageManager.java index 26ae095..8a5550c 100644 --- a/src/main/java/net/momirealms/customcrops/datamanager/MessageManager.java +++ b/src/main/java/net/momirealms/customcrops/datamanager/MessageManager.java @@ -1,6 +1,6 @@ package net.momirealms.customcrops.datamanager; -import net.momirealms.customcrops.Libs.minedown.MineDown; +import net.momirealms.customcrops.libs.minedown.MineDown; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; diff --git a/src/main/java/net/momirealms/customcrops/datamanager/NextSeason.java b/src/main/java/net/momirealms/customcrops/datamanager/NextSeason.java index d39cacd..b728542 100644 --- a/src/main/java/net/momirealms/customcrops/datamanager/NextSeason.java +++ b/src/main/java/net/momirealms/customcrops/datamanager/NextSeason.java @@ -6,16 +6,28 @@ import org.bukkit.configuration.file.FileConfiguration; import java.util.Objects; public class NextSeason { + public static void changeSeason(){ FileConfiguration config = CustomCrops.instance.getConfig(); String currentSeason = ConfigManager.Config.current; - String nextSeason = switch (Objects.requireNonNull(currentSeason)) { - case "spring" -> "summer"; - case "summer" -> "autumn"; - case "autumn" -> "winter"; - case "winter" -> "spring"; - default -> null; - }; + String nextSeason; + switch (Objects.requireNonNull(currentSeason)) { + case "spring": + nextSeason = "summer"; + break; + case "summer": + nextSeason = "autumn"; + break; + case "autumn": + nextSeason = "winter"; + break; + case "winter": + nextSeason = "spring"; + break; + default: + nextSeason = null; + break; + } if(nextSeason != null){ config.set("current-season", nextSeason); ConfigManager.Config.current = nextSeason; diff --git a/src/main/java/net/momirealms/customcrops/datamanager/SprinklerManager.java b/src/main/java/net/momirealms/customcrops/datamanager/SprinklerManager.java index 5b5cef9..7ae49a4 100644 --- a/src/main/java/net/momirealms/customcrops/datamanager/SprinklerManager.java +++ b/src/main/java/net/momirealms/customcrops/datamanager/SprinklerManager.java @@ -18,7 +18,7 @@ import java.util.concurrent.ConcurrentHashMap; public class SprinklerManager { - public static ConcurrentHashMap SPRINKLERS; + static ConcurrentHashMap SPRINKLERS; /* 开服的时候将文件的数据读入 */ @@ -63,7 +63,7 @@ public class SprinklerManager { SPRINKLERS.put(location, type); } - public static void SprinklerWork() { + public static void SprinklerWork(String worldName) { /* 阶段1:更新数据 */ @@ -78,45 +78,47 @@ public class SprinklerManager { data.set(entry.getKey().getWorld().getName() + "." + entry.getKey().getBlockX() + "," + entry.getKey().getBlockY()+ ","+entry.getKey().getBlockZ(), entry.getValue()); } long finish1 = System.currentTimeMillis(); - MessageManager.consoleMessage("&#ccfbff-#ef96c5&[CustomCrops] &7洒水器数据更新耗时&a" + String.valueOf(finish1-start1) + "&fms",Bukkit.getConsoleSender()); + MessageManager.consoleMessage("&#ccfbff-#ef96c5&[CustomCrops] &7洒水器数据更新耗时&a" + (finish1-start1) + "&fms",Bukkit.getConsoleSender()); /* 阶段2:清理数据内无效的洒水器并工作 */ bukkitScheduler.callSyncMethod(CustomCrops.instance,()->{ long start2 = System.currentTimeMillis(); //检测碰撞体积需要同步 - ConfigManager.Config.worlds.forEach(worldName ->{ - if(data.contains(worldName)){ - World world = Bukkit.getWorld(worldName); - data.getConfigurationSection(worldName).getKeys(false).forEach(key ->{ - String[] coordinate = StringUtils.split(key,","); - if (world.isChunkLoaded(Integer.parseInt(coordinate[0])/16, Integer.parseInt(coordinate[2])/16)){ - Location tempLoc = new Location(world,Double.parseDouble(coordinate[0])+0.5,Double.parseDouble(coordinate[1])+0.5,Double.parseDouble(coordinate[2])+0.5); - if(!IAFurniture.getFromLocation(tempLoc, world)){ - SPRINKLERS.remove(tempLoc); - data.set(worldName+"."+coordinate[0]+","+coordinate[1]+","+coordinate[2], null); - }else { - String type = data.getString(worldName + "." + coordinate[0] + "," + coordinate[1] + "," + coordinate[2]); - if(type.equals("s1")){ - for(int i = -1; i <= 1;i++){ - for (int j = -1; j <= 1; j++){ - waterPot(tempLoc.clone().add(i,-1,j)); - } + if(data.contains(worldName)){ + World world = Bukkit.getWorld(worldName); + data.getConfigurationSection(worldName).getKeys(false).forEach(key ->{ + String[] coordinate = StringUtils.split(key,","); + if (world.isChunkLoaded(Integer.parseInt(coordinate[0])/16, Integer.parseInt(coordinate[2])/16)){ + Location tempLoc = new Location(world,Double.parseDouble(coordinate[0])+0.5,Double.parseDouble(coordinate[1])+0.5,Double.parseDouble(coordinate[2])+0.5); + if(!IAFurniture.getFromLocation(tempLoc, world)){ + SPRINKLERS.remove(tempLoc); + data.set(worldName+"."+coordinate[0]+","+coordinate[1]+","+coordinate[2], null); + }else { + String type = data.getString(worldName + "." + coordinate[0] + "," + coordinate[1] + "," + coordinate[2]); + if(type == null){ + MessageManager.consoleMessage("错误数据位于"+ worldName + coordinate[0] + "," + coordinate[1] + "," + coordinate[2], Bukkit.getConsoleSender()); + return; + } + if(type.equalsIgnoreCase("s1")){ + for(int i = -1; i <= 1;i++){ + for (int j = -1; j <= 1; j++){ + waterPot(tempLoc.clone().add(i,-1,j)); } - }else{ - for(int i = -2; i <= 2;i++){ - for (int j = -2; j <= 2; j++){ - waterPot(tempLoc.clone().add(i,-1,j)); - } + } + }else{ + for(int i = -2; i <= 2;i++){ + for (int j = -2; j <= 2; j++){ + waterPot(tempLoc.clone().add(i,-1,j)); } } } } - }); - } - }); + } + }); + } long finish2 = System.currentTimeMillis(); - MessageManager.consoleMessage("&#ccfbff-#ef96c5&[CustomCrops] &7洒水器工作耗时&a" + String.valueOf(finish2-start2) + "&fms",Bukkit.getConsoleSender()); + MessageManager.consoleMessage("&#ccfbff-#ef96c5&[CustomCrops] &7洒水器工作耗时&a" + (finish2-start2) + "&fms",Bukkit.getConsoleSender()); bukkitScheduler.runTaskAsynchronously(CustomCrops.instance,()->{ /* @@ -130,19 +132,17 @@ public class SprinklerManager { CustomCrops.instance.getLogger().warning("洒水器数据保存出错!"); } long finish3 = System.currentTimeMillis(); - MessageManager.consoleMessage("&#ccfbff-#ef96c5&[CustomCrops] &7洒水器数据保存耗时&a" + String.valueOf(finish3-start3) + "&fms",Bukkit.getConsoleSender()); + MessageManager.consoleMessage("&#ccfbff-#ef96c5&[CustomCrops] &7洒水器数据保存耗时&a" + (finish3-start3) + "&fms",Bukkit.getConsoleSender()); }); return null; }); } private static void waterPot(Location tempLoc) { - if(CustomBlock.byAlreadyPlaced(tempLoc.getBlock()) != null){ - if(CustomBlock.byAlreadyPlaced(tempLoc.getBlock()).getNamespacedID().equalsIgnoreCase(ConfigManager.Config.pot)){ - Bukkit.getScheduler().callSyncMethod(CustomCrops.instance,()->{ - CustomBlock.remove(tempLoc); - CustomBlock.place((ConfigManager.Config.watered_pot), tempLoc); - return null; - }); + CustomBlock cb = CustomBlock.byAlreadyPlaced(tempLoc.getBlock()); + if(cb != null){ + if(cb.getNamespacedID().equalsIgnoreCase(ConfigManager.Config.pot)){ + CustomBlock.remove(tempLoc); + CustomBlock.place((ConfigManager.Config.watered_pot), tempLoc); } } } diff --git a/src/main/java/net/momirealms/customcrops/integrations/ResidenceIntegrations.java b/src/main/java/net/momirealms/customcrops/integrations/ResidenceIntegrations.java index 358ccd6..4876585 100644 --- a/src/main/java/net/momirealms/customcrops/integrations/ResidenceIntegrations.java +++ b/src/main/java/net/momirealms/customcrops/integrations/ResidenceIntegrations.java @@ -8,6 +8,7 @@ import org.bukkit.Location; import org.bukkit.entity.Player; public class ResidenceIntegrations { + public static boolean checkResBuild(Location location, Player player){ FlagPermissions.addFlag("build"); ClaimedResidence res = com.bekvon.bukkit.residence.Residence.getInstance().getResidenceManager().getByLoc(location); diff --git a/src/main/java/net/momirealms/customcrops/libs/minedown/MineDown.java b/src/main/java/net/momirealms/customcrops/libs/minedown/MineDown.java index 1e0847a..1e991aa 100644 --- a/src/main/java/net/momirealms/customcrops/libs/minedown/MineDown.java +++ b/src/main/java/net/momirealms/customcrops/libs/minedown/MineDown.java @@ -1,4 +1,4 @@ -package net.momirealms.customcrops.Libs.minedown; +package net.momirealms.customcrops.libs.minedown; /* * Copyright (c) 2017 Max Lee (https://github.com/Phoenix616) diff --git a/src/main/java/net/momirealms/customcrops/libs/minedown/MineDownParser.java b/src/main/java/net/momirealms/customcrops/libs/minedown/MineDownParser.java index 5751122..7dc51fe 100644 --- a/src/main/java/net/momirealms/customcrops/libs/minedown/MineDownParser.java +++ b/src/main/java/net/momirealms/customcrops/libs/minedown/MineDownParser.java @@ -1,4 +1,4 @@ -package net.momirealms.customcrops.Libs.minedown; +package net.momirealms.customcrops.libs.minedown; /* * Copyright (c) 2017 Max Lee (https://github.com/Phoenix616) @@ -50,11 +50,11 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -import static net.momirealms.customcrops.Libs.minedown.MineDown.COLOR_PREFIX; -import static net.momirealms.customcrops.Libs.minedown.MineDown.FONT_PREFIX; -import static net.momirealms.customcrops.Libs.minedown.MineDown.FORMAT_PREFIX; -import static net.momirealms.customcrops.Libs.minedown.MineDown.HOVER_PREFIX; -import static net.momirealms.customcrops.Libs.minedown.MineDown.INSERTION_PREFIX; +import static net.momirealms.customcrops.libs.minedown.MineDown.COLOR_PREFIX; +import static net.momirealms.customcrops.libs.minedown.MineDown.FONT_PREFIX; +import static net.momirealms.customcrops.libs.minedown.MineDown.FORMAT_PREFIX; +import static net.momirealms.customcrops.libs.minedown.MineDown.HOVER_PREFIX; +import static net.momirealms.customcrops.libs.minedown.MineDown.INSERTION_PREFIX; public class MineDownParser { private static final String RAINBOW = "rainbow"; diff --git a/src/main/java/net/momirealms/customcrops/libs/minedown/MineDownStringifier.java b/src/main/java/net/momirealms/customcrops/libs/minedown/MineDownStringifier.java index 1bbeb92..5f81c29 100644 --- a/src/main/java/net/momirealms/customcrops/libs/minedown/MineDownStringifier.java +++ b/src/main/java/net/momirealms/customcrops/libs/minedown/MineDownStringifier.java @@ -1,4 +1,4 @@ -package net.momirealms.customcrops.Libs.minedown; +package net.momirealms.customcrops.libs.minedown; /* * Copyright (c) 2017 Max Lee (https://github.com/Phoenix616) @@ -44,11 +44,11 @@ import java.util.Set; import java.util.stream.Collectors; -import static net.momirealms.customcrops.Libs.minedown.MineDown.COLOR_PREFIX; -import static net.momirealms.customcrops.Libs.minedown.MineDown.FONT_PREFIX; -import static net.momirealms.customcrops.Libs.minedown.MineDown.FORMAT_PREFIX; -import static net.momirealms.customcrops.Libs.minedown.MineDown.HOVER_PREFIX; -import static net.momirealms.customcrops.Libs.minedown.MineDown.INSERTION_PREFIX; +import static net.momirealms.customcrops.libs.minedown.MineDown.COLOR_PREFIX; +import static net.momirealms.customcrops.libs.minedown.MineDown.FONT_PREFIX; +import static net.momirealms.customcrops.libs.minedown.MineDown.FORMAT_PREFIX; +import static net.momirealms.customcrops.libs.minedown.MineDown.HOVER_PREFIX; +import static net.momirealms.customcrops.libs.minedown.MineDown.INSERTION_PREFIX; public class MineDownStringifier { diff --git a/src/main/java/net/momirealms/customcrops/libs/minedown/Replacer.java b/src/main/java/net/momirealms/customcrops/libs/minedown/Replacer.java index 4412c67..bbaa906 100644 --- a/src/main/java/net/momirealms/customcrops/libs/minedown/Replacer.java +++ b/src/main/java/net/momirealms/customcrops/libs/minedown/Replacer.java @@ -1,4 +1,4 @@ -package net.momirealms.customcrops.Libs.minedown; +package net.momirealms.customcrops.libs.minedown; /* * Copyright (c) 2017 Max Lee (https://github.com/Phoenix616) diff --git a/src/main/java/net/momirealms/customcrops/libs/minedown/Util.java b/src/main/java/net/momirealms/customcrops/libs/minedown/Util.java index a7472b5..1b28ab8 100644 --- a/src/main/java/net/momirealms/customcrops/libs/minedown/Util.java +++ b/src/main/java/net/momirealms/customcrops/libs/minedown/Util.java @@ -1,4 +1,4 @@ -package net.momirealms.customcrops.Libs.minedown; +package net.momirealms.customcrops.libs.minedown; /* * Copyright (c) 2017 Max Lee (https://github.com/Phoenix616) diff --git a/src/main/java/net/momirealms/customcrops/limits/MaxSprinklersPerChunk.java b/src/main/java/net/momirealms/customcrops/limits/MaxSprinklersPerChunk.java index d759452..a2a3d81 100644 --- a/src/main/java/net/momirealms/customcrops/limits/MaxSprinklersPerChunk.java +++ b/src/main/java/net/momirealms/customcrops/limits/MaxSprinklersPerChunk.java @@ -37,7 +37,4 @@ public class MaxSprinklersPerChunk { } return n > maxAmount; } - public static boolean alreadyPlaced(Location location){ - return IAFurniture.getFromLocation(location.clone().add(0.5, 1.5, 0.5), location.getWorld()); - } } diff --git a/src/main/java/net/momirealms/customcrops/listener/BreakCrops.java b/src/main/java/net/momirealms/customcrops/listener/BreakCrops.java index 8100668..851f01c 100644 --- a/src/main/java/net/momirealms/customcrops/listener/BreakCrops.java +++ b/src/main/java/net/momirealms/customcrops/listener/BreakCrops.java @@ -18,10 +18,10 @@ public class BreakCrops implements Listener { String namespacedId = CustomStack.byItemStack(((Item) entity).getItemStack()).getNamespacedID(); if(namespacedId.equalsIgnoreCase(ConfigManager.Config.sprinkler_1)){ entity.remove(); - entity.getWorld().dropItem(entity.getLocation() ,CustomStack.getInstance(namespacedId + "_item").getItemStack()); + entity.getWorld().dropItem(entity.getLocation() ,CustomStack.getInstance(ConfigManager.Config.sprinkler_1i).getItemStack()); }else if(namespacedId.equalsIgnoreCase(ConfigManager.Config.sprinkler_2)){ entity.remove(); - entity.getWorld().dropItem(entity.getLocation() ,CustomStack.getInstance(namespacedId + "_item").getItemStack()); + entity.getWorld().dropItem(entity.getLocation() ,CustomStack.getInstance(ConfigManager.Config.sprinkler_2i).getItemStack()); }else if(namespacedId.contains("_stage_")){ entity.remove(); } diff --git a/src/main/java/net/momirealms/customcrops/listener/RightClickBlock.java b/src/main/java/net/momirealms/customcrops/listener/RightClickBlock.java index 7f4467d..1719bdc 100644 --- a/src/main/java/net/momirealms/customcrops/listener/RightClickBlock.java +++ b/src/main/java/net/momirealms/customcrops/listener/RightClickBlock.java @@ -75,7 +75,7 @@ public class RightClickBlock implements Listener { return; } //此位置是否已有洒水器 - if(MaxSprinklersPerChunk.alreadyPlaced(location)){ + if(IAFurniture.getFromLocation(location.clone().add(0.5, 1.5, 0.5), location.getWorld())){ return; } //区块上限 diff --git a/src/main/java/net/momirealms/customcrops/listener/RightClickCustomBlock.java b/src/main/java/net/momirealms/customcrops/listener/RightClickCustomBlock.java index 3ee742e..54345a1 100644 --- a/src/main/java/net/momirealms/customcrops/listener/RightClickCustomBlock.java +++ b/src/main/java/net/momirealms/customcrops/listener/RightClickCustomBlock.java @@ -4,8 +4,6 @@ import dev.lone.itemsadder.api.CustomBlock; import dev.lone.itemsadder.api.CustomStack; import dev.lone.itemsadder.api.Events.CustomBlockInteractEvent; import net.momirealms.customcrops.datamanager.ConfigManager; -import net.momirealms.customcrops.CustomCrops; -import net.momirealms.customcrops.datamanager.CropManager; import net.momirealms.customcrops.limits.MaxCropsPerChunk; import net.momirealms.customcrops.integrations.IntegrationCheck; import net.momirealms.customcrops.datamanager.MessageManager; @@ -19,13 +17,12 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; import org.bukkit.inventory.ItemStack; -import org.bukkit.scheduler.BukkitScheduler; import java.util.Objects; -public class RightClickCustomBlock implements Listener { +import static net.momirealms.customcrops.datamanager.CropManager.CROPS; - BukkitScheduler bukkitScheduler = Bukkit.getScheduler(); +public class RightClickCustomBlock implements Listener { @EventHandler public void rightClickCustomBlock(CustomBlockInteractEvent event){ @@ -238,7 +235,7 @@ public class RightClickCustomBlock implements Listener { return false; } //添加到缓存中 - CropManager.putInstance(locUp, key); + CROPS.put(locUp, key); //放置自定义农作物 CustomBlock.place(namespacedID.replace("_seeds","_stage_1"),locUp); return true; @@ -246,77 +243,69 @@ public class RightClickCustomBlock implements Listener { private void waterPot(ItemStack itemStack, Player player, Location location){ //是否为IA物品 if(CustomStack.byItemStack(itemStack) == null) return; - bukkitScheduler.runTaskAsynchronously(CustomCrops.instance,()-> { - //获取IA物品 - CustomStack customStack = CustomStack.byItemStack(itemStack); - String namespacedId = customStack.getNamespacedID(); - World world = player.getWorld(); - int x; - int z; - if (namespacedId.equalsIgnoreCase(ConfigManager.Config.watering_can_1)) { + //获取IA物品 + CustomStack customStack = CustomStack.byItemStack(itemStack); + String namespacedId = customStack.getNamespacedID(); + World world = player.getWorld(); + int x; + int z; + if (namespacedId.equalsIgnoreCase(ConfigManager.Config.watering_can_1)) { + x = 0; + z = 0; + } else if (namespacedId.equalsIgnoreCase(ConfigManager.Config.watering_can_2)){ + x = 2; + z = 2; + } else if (namespacedId.equalsIgnoreCase(ConfigManager.Config.watering_can_3)){ + x = 4; + z = 4; + } else return; + //判断耐久度 + if(customStack.getDurability() > 0){ + CustomStack.byItemStack(itemStack).setDurability(CustomStack.byItemStack(itemStack).getDurability() - 1); + }else return; + //播放洒水音效 + world.playSound(player.getLocation(),Sound.BLOCK_WATER_AMBIENT,1,1); + //获取玩家朝向 + float yaw = player.getLocation().getYaw(); + //根据朝向确定浇水方向 + if (yaw <= 45 && yaw >= -135) { + if (yaw > -45) { x = 0; - z = 0; - } else if (namespacedId.equalsIgnoreCase(ConfigManager.Config.watering_can_2)){ - x = 2; - z = 2; - } else if (namespacedId.equalsIgnoreCase(ConfigManager.Config.watering_can_3)){ - x = 4; - z = 4; - } else return; - //判断耐久度 - if(customStack.getDurability() > 0){ - CustomStack.byItemStack(itemStack).setDurability(CustomStack.byItemStack(itemStack).getDurability() - 1); - }else return; - //播放洒水音效 - world.playSound(player.getLocation(),Sound.BLOCK_WATER_AMBIENT,1,1); - //获取玩家朝向 - float yaw = player.getLocation().getYaw(); - //根据朝向确定浇水方向 - if (yaw <= 45 && yaw >= -135) { - if (yaw > -45) { - x = 0; - } else { - z = 0; - } - for (int i = 0; i <= x; i++) { - for (int j = 0; j <= z; j++) { - Location tempLoc = location.clone().add(i, 0, j); - CustomBlock cb = CustomBlock.byAlreadyPlaced(tempLoc.getBlock()); - if(cb != null){ - if(cb.getNamespacedID().equalsIgnoreCase(ConfigManager.Config.pot)){ - //同步替换方块 - bukkitScheduler.callSyncMethod(CustomCrops.instance,()->{ - CustomBlock.remove(tempLoc); - CustomBlock.place(ConfigManager.Config.watered_pot,tempLoc); - return null; - }); - } - } - } - } } else { - if (yaw < 135 && yaw > 45) { - z= 0; - } else { - x= 0; - } - for (int i = 0; i <= x; i++) { - for (int j = 0; j <= z; j++) { - Location tempLoc = location.clone().subtract(i, 0, j); - CustomBlock cb = CustomBlock.byAlreadyPlaced(tempLoc.getBlock()); - if(cb != null){ - if(cb.getNamespacedID().equalsIgnoreCase(ConfigManager.Config.pot)){ - //同步替换方块 - bukkitScheduler.callSyncMethod(CustomCrops.instance,()->{ - CustomBlock.remove(tempLoc); - CustomBlock.place(ConfigManager.Config.watered_pot,tempLoc); - return null; - }); - } + z = 0; + } + for (int i = 0; i <= x; i++) { + for (int j = 0; j <= z; j++) { + Location tempLoc = location.clone().add(i, 0, j); + CustomBlock cb = CustomBlock.byAlreadyPlaced(tempLoc.getBlock()); + if(cb != null){ + if(cb.getNamespacedID().equalsIgnoreCase(ConfigManager.Config.pot)){ + //同步替换方块 + CustomBlock.remove(tempLoc); + CustomBlock.place(ConfigManager.Config.watered_pot,tempLoc); } } } } - }); + } else { + if (yaw < 135 && yaw > 45) { + z= 0; + } else { + x= 0; + } + for (int i = 0; i <= x; i++) { + for (int j = 0; j <= z; j++) { + Location tempLoc = location.clone().subtract(i, 0, j); + CustomBlock cb = CustomBlock.byAlreadyPlaced(tempLoc.getBlock()); + if(cb != null){ + if(cb.getNamespacedID().equalsIgnoreCase(ConfigManager.Config.pot)){ + //同步替换方块 + CustomBlock.remove(tempLoc); + CustomBlock.place(ConfigManager.Config.watered_pot,tempLoc); + } + } + } + } + } } } diff --git a/src/main/java/net/momirealms/customcrops/timer/TimeCheck.java b/src/main/java/net/momirealms/customcrops/timer/TimeCheck.java index 888883b..9114815 100644 --- a/src/main/java/net/momirealms/customcrops/timer/TimeCheck.java +++ b/src/main/java/net/momirealms/customcrops/timer/TimeCheck.java @@ -10,22 +10,19 @@ import org.bukkit.scheduler.BukkitScheduler; public class TimeCheck extends BukkitRunnable { - BukkitScheduler bukkitScheduler = Bukkit.getScheduler(); - @Override public void run() { - ConfigManager.Config.worlds.forEach(world ->{ + BukkitScheduler bukkitScheduler = Bukkit.getScheduler(); long time = Bukkit.getWorld(world).getTime(); - ConfigManager.Config.cropGrowTimeList.forEach(cropGrowTime -> { if(time == cropGrowTime){ - bukkitScheduler.runTaskAsynchronously(CustomCrops.instance, CropManager::CropGrow); + bukkitScheduler.runTaskAsynchronously(CustomCrops.instance, () -> CropManager.CropGrow(world)); } }); ConfigManager.Config.sprinklerWorkTimeList.forEach(sprinklerTime -> { if(time == sprinklerTime){ - bukkitScheduler.runTaskAsynchronously(CustomCrops.instance, SprinklerManager::SprinklerWork); + bukkitScheduler.runTaskAsynchronously(CustomCrops.instance, () -> SprinklerManager.SprinklerWork(world)); } }); }); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 8892388..e24a797 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -58,11 +58,11 @@ config: greenhouse-glass: customcrops:greenhouse_glass #洒水器的家具 sprinkler-1: customcrops:sprinkler_1 - #洒水器的方块的物品(请以_item结尾) + #洒水器的方块的2D物品 sprinkler-1-item: customcrops:sprinkler_1_item #优质洒水器的家具 sprinkler-2: customcrops:sprinkler_2 - #优质洒水器的方块的物品(请以_item结尾) + #优质洒水器的方块的2D物品 sprinkler-2-item: customcrops:sprinkler_2_item #农作物枯萎后变成的方块,物品ID中请保留stage以保持其下方方块被破坏时,枯萎作物也被破坏的特性 dead-crop: customcrops:crop_stage_death @@ -111,3 +111,4 @@ messages: summer: '&f夏' autumn: '&f秋' winter: '&f冬' + noperm: '&f权限不足' diff --git a/src/main/resources/crops.yml b/src/main/resources/crops.yml index cd7d433..7933f31 100644 --- a/src/main/resources/crops.yml +++ b/src/main/resources/crops.yml @@ -1,8 +1,7 @@ crops: + #在IA配置文件中命名农作物时请以_seeds和_stage_X结尾,否则会无法生长和种植 + #只要遵循正确的命名规则,你可以无限自定义农作物阶段数量 tomato: - #在IA配置文件中命名农作物时请以_seeds和_stage_X结尾,否则会无法生长和种植 - #只要遵循正确的命名规则,你可以无限自定义农作物阶段数量 - #每个生长点生长一个阶段的概率 #此项目必填(0-1) grow-chance: 0.4 @@ -11,12 +10,23 @@ crops: #若启用季节则必须填写此项目 #季节之间用逗号分隔 #可用的季节类型spring,summer,autumn,winter - #season: spring,summer + season: spring,summer #空手收获后返回第几个生长状态 #不填写此项目则无法重复收获 - #return: customcrops:tomato_stage_1 + return: customcrops:tomato_stage_1 #巨大化植物,以极低的概率生长为另一种形态 - #gigantic: customcrops:gigantic_tomato - #gigantic-chance: 0.01 \ No newline at end of file + gigantic: customcrops:gigantic_tomato + gigantic-chance: 0.01 + + cabbage: + grow-chance: 0.8 + season: summer,autumn + gigantic: customcrops:gigantic_cabbage + gigantic-chance: 0.02 + + grape: + grow-chance: 0.5 + season: autumn + return: customcrops:grape_stage_4 \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 2283adc..9b22074 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,10 +1,12 @@ name: CustomCrops -version: '1.4.0' +version: '1.4.3' main: net.momirealms.customcrops.CustomCrops api-version: 1.16 -depend: [ ItemsAdder , ProtocolLib ] +depend: [ ItemsAdder ] softdepend: [ PlaceholderAPI ] authors: [ XiaoMoMi ] commands: customcrops: - permission-message: No Permission \ No newline at end of file + usage: /customcrops + permission-message: No Permission + permission: customcrops.admin \ No newline at end of file