diff --git a/src/main/java/net/momirealms/customcrops/ConfigReader.java b/src/main/java/net/momirealms/customcrops/ConfigReader.java index 4402765..54b077f 100644 --- a/src/main/java/net/momirealms/customcrops/ConfigReader.java +++ b/src/main/java/net/momirealms/customcrops/ConfigReader.java @@ -41,9 +41,9 @@ public class ConfigReader { Config.loadConfig(); Message.loadMessage(); Basic.loadBasic(); - Season.loadSeason(); cropLoad(); fertilizerLoad(); + Season.loadSeason(); } public static class Config{ @@ -150,7 +150,7 @@ public class ConfigReader { CustomCrops.instance.getLogger().warning("未检测到插件 Residence!"); }else { integration.add(new Residence()); - AdventureManager.consoleMessage("[CustomCrops] 检测到 Residence 已启用保护!"); + AdventureManager.consoleMessage("[CustomCrops] 已启用 Residence 保护!"); } } if(config.getBoolean("config.integration.Kingdoms",false)){ @@ -158,7 +158,7 @@ public class ConfigReader { CustomCrops.instance.getLogger().warning("未检测到插件 Kingdoms!"); }else { integration.add(new KingdomsX()); - AdventureManager.consoleMessage("[CustomCrops] 检测到 KingdomsX 已启用保护!"); + AdventureManager.consoleMessage("[CustomCrops] 已启用 KingdomsX 保护!"); } } if(config.getBoolean("config.integration.WorldGuard",false)){ @@ -166,7 +166,7 @@ public class ConfigReader { CustomCrops.instance.getLogger().warning("未检测到插件 WorldGuard!"); }else { integration.add(new WorldGuard()); - AdventureManager.consoleMessage("[CustomCrops] 检测到 WorldGuard 已启用保护!"); + AdventureManager.consoleMessage("[CustomCrops] 已启用 WorldGuard 保护!"); } } if(config.getBoolean("config.integration.GriefDefender",false)){ @@ -174,7 +174,15 @@ public class ConfigReader { CustomCrops.instance.getLogger().warning("未检测到插件 GriefDefender!"); }else { integration.add(new GriefDefender()); - AdventureManager.consoleMessage("[CustomCrops] 检测到 GriefDefender 已启用保护!"); + AdventureManager.consoleMessage("[CustomCrops] 已启用 GriefDefender 保护!"); + } + } + if(config.getBoolean("config.integration.PlotSquared",false)){ + if(Bukkit.getPluginManager().getPlugin("PlotSquared") == null){ + CustomCrops.instance.getLogger().warning("未检测到插件 PlotSquared!"); + }else { + integration.add(new PlotSquared()); + AdventureManager.consoleMessage("[CustomCrops] 已启用 PlotSquared 保护!"); } } } @@ -220,6 +228,7 @@ public class ConfigReader { } }); } + AdventureManager.consoleMessage("[CustomCrops] 已载入 " + CANS.size() + " 个水壶!"); SPRINKLERS.clear(); if (config.contains("sprinkler")){ @@ -236,6 +245,7 @@ public class ConfigReader { } }); } + AdventureManager.consoleMessage("[CustomCrops] 已载入 " + SPRINKLERS.size()/2 + " 个洒水器!"); } } @@ -258,7 +268,10 @@ public class ConfigReader { } seasonChange = config.getBoolean("season.auto-season-change.enable",false); if (seasonChange) { + AdventureManager.consoleMessage("[CustomCrops] 当前季节变换模式: 自动"); duration = config.getInt("season.auto-season-change.duration",28); + }else { + AdventureManager.consoleMessage("[CustomCrops] 当前季节变换模式: 指令"); } } } @@ -297,6 +310,7 @@ public class ConfigReader { public static String sprinklerFull; public static String sprinklerEmpty; public static String sprinklerRight; + public static String beforePlant; public static double cropOffset; public static double sprinklerOffset; @@ -324,6 +338,7 @@ public class ConfigReader { setSeason = config.getString("messages.set-season"); wrongArgs = config.getString("messages.wrong-args"); forceSave = config.getString("messages.force-save"); + beforePlant = config.getString("messages.before-plant"); hasCropInfo = config.getBoolean("hologram.grow-info.enable"); if (hasCropInfo){ @@ -385,6 +400,7 @@ public class ConfigReader { } CROPS.put(key, cropInstance); }); + AdventureManager.consoleMessage("[CustomCrops] 已载入 " + CROPS.size() + " 种农作物!"); } public static void fertilizerLoad(){ @@ -428,5 +444,6 @@ public class ConfigReader { } }); } + AdventureManager.consoleMessage("[CustomCrops] 已载入 " + FERTILIZERS.size() + " 种肥料!"); } } diff --git a/src/main/java/net/momirealms/customcrops/commands/Executor.java b/src/main/java/net/momirealms/customcrops/commands/Executor.java index 2fb79ba..166bf2c 100644 --- a/src/main/java/net/momirealms/customcrops/commands/Executor.java +++ b/src/main/java/net/momirealms/customcrops/commands/Executor.java @@ -137,9 +137,19 @@ public class Executor implements CommandExecutor { } default -> { if (sender instanceof Player player){ - AdventureManager.playerMessage(player,""); + AdventureManager.playerMessage(player,"/customcrops reload 重载插件"); + AdventureManager.playerMessage(player,"/customcrops setseason 设置某个世界的季节"); + AdventureManager.playerMessage(player,"/customcrops backup 备份数据"); + AdventureManager.playerMessage(player,"/customcrops forcegrow 强制某个世界的农作物进行生长判定"); + AdventureManager.playerMessage(player,"/customcrops forcewater 强制某个世界的洒水器进行工作判定"); + AdventureManager.playerMessage(player,"/customcrops forcesave 强制更新缓存并保存"); }else { - AdventureManager.consoleMessage(""); + AdventureManager.consoleMessage("/customcrops reload 重载插件"); + AdventureManager.consoleMessage("/customcrops setseason 设置某个世界的季节"); + AdventureManager.consoleMessage("/customcrops backup 备份数据"); + AdventureManager.consoleMessage("/customcrops forcegrow 强制某个世界的农作物进行生长判定"); + AdventureManager.consoleMessage("/customcrops forcewater 强制某个世界的洒水器进行工作判定"); + AdventureManager.consoleMessage("/customcrops forcesave 强制更新缓存并保存"); } } } diff --git a/src/main/java/net/momirealms/customcrops/integrations/PlotSquared.java b/src/main/java/net/momirealms/customcrops/integrations/PlotSquared.java new file mode 100644 index 0000000..daf3976 --- /dev/null +++ b/src/main/java/net/momirealms/customcrops/integrations/PlotSquared.java @@ -0,0 +1,22 @@ +package net.momirealms.customcrops.integrations; + +import com.plotsquared.core.location.Location; +import org.bukkit.entity.Player; + +public record PlotSquared() implements Integration { + @Override + public boolean canBreak(org.bukkit.Location location, Player player) { +// PlotAPI api = new PlotAPI(); +// PlotPlayer plotPlayer = com.plotsquared.core.PlotSquared.platform().playerManager().getPlayerIfExists(player.getUniqueId()); + Location plotLoc = Location.at(location.getWorld().getName(), location.getBlockX(), location.getBlockY(), location.getBlockZ()); + if (plotLoc.isPlotRoad()) return false; + return plotLoc.getPlotArea().getPlot(plotLoc).isAdded(player.getUniqueId()); + } + + @Override + public boolean canPlace(org.bukkit.Location location, Player player) { + Location plotLoc = Location.at(location.getWorld().getName(), location.getBlockX(), location.getBlockY(), location.getBlockZ()); + if (plotLoc.isPlotRoad()) return false; + return plotLoc.getPlotArea().getPlot(plotLoc).isAdded(player.getUniqueId()); + } +} diff --git a/src/main/java/net/momirealms/customcrops/integrations/Residence.java b/src/main/java/net/momirealms/customcrops/integrations/Residence.java index 90f7640..3676cc4 100644 --- a/src/main/java/net/momirealms/customcrops/integrations/Residence.java +++ b/src/main/java/net/momirealms/customcrops/integrations/Residence.java @@ -23,7 +23,7 @@ public record Residence() implements Integration { ClaimedResidence res = com.bekvon.bukkit.residence.Residence.getInstance().getResidenceManager().getByLoc(location); if(res!=null){ ResidencePermissions perms = res.getPermissions(); - return perms.playerHas(player, Flags.harvest, true); + return perms.playerHas(player, Flags.destroy, true); } return true; } diff --git a/src/main/java/net/momirealms/customcrops/integrations/WorldGuard.java b/src/main/java/net/momirealms/customcrops/integrations/WorldGuard.java index 5c3fe53..3f7e3dc 100644 --- a/src/main/java/net/momirealms/customcrops/integrations/WorldGuard.java +++ b/src/main/java/net/momirealms/customcrops/integrations/WorldGuard.java @@ -19,7 +19,6 @@ public record WorldGuard() implements Integration { RegionQuery query = container.createQuery(); ApplicableRegionSet set = query.getApplicableRegions(BukkitAdapter.adapt(location)); if (set != null){ - System.out.println(set); return query.testState(BukkitAdapter.adapt(location), localPlayer, Flags.BUILD); }else { return true; @@ -33,7 +32,6 @@ public record WorldGuard() implements Integration { RegionQuery query = container.createQuery(); ApplicableRegionSet set = query.getApplicableRegions(BukkitAdapter.adapt(location)); if (set != null){ - System.out.println(set); return query.testState(BukkitAdapter.adapt(location), localPlayer, Flags.BLOCK_BREAK); }else { return true; diff --git a/src/main/java/net/momirealms/customcrops/listener/BreakBlock.java b/src/main/java/net/momirealms/customcrops/listener/BreakBlock.java index f7cdb72..972783a 100644 --- a/src/main/java/net/momirealms/customcrops/listener/BreakBlock.java +++ b/src/main/java/net/momirealms/customcrops/listener/BreakBlock.java @@ -7,6 +7,7 @@ import net.momirealms.customcrops.ConfigReader; import net.momirealms.customcrops.datamanager.PotManager; import net.momirealms.customcrops.fertilizer.Fertilizer; import net.momirealms.customcrops.fertilizer.QualityCrop; +import net.momirealms.customcrops.integrations.Integration; import net.momirealms.customcrops.utils.CropInstance; import org.apache.commons.lang.StringUtils; import org.bukkit.Location; @@ -28,9 +29,12 @@ public class BreakBlock implements Listener { String namespacedId = event.getNamespacedID(); if(namespacedId.contains("_stage_")){ Player player =event.getPlayer(); + Location location = event.getBlock().getLocation(); + for (Integration integration : ConfigReader.Config.integration){ + if(!integration.canPlace(location, player)) return; + } if(player.getInventory().getItemInMainHand().containsEnchantment(Enchantment.SILK_TOUCH) || player.getInventory().getItemInMainHand().getType() == Material.SHEARS){ event.setCancelled(true); - Location location = event.getBlock().getLocation(); CustomBlock.place(namespacedId, location); CustomBlock.byAlreadyPlaced(location.getBlock()).getLoot().forEach(itemStack -> { location.getWorld().dropItem(location.clone().add(0.5,0.2,0.5), itemStack); @@ -45,7 +49,6 @@ public class BreakBlock implements Listener { CropInstance cropInstance = ConfigReader.CROPS.get(cropNameList[0]); ThreadLocalRandom current = ThreadLocalRandom.current(); int random = current.nextInt(cropInstance.getMin(), cropInstance.getMax() + 1); - Location location = event.getBlock().getLocation(); Location itemLoc = location.clone().add(0.5,0.2,0.5); World world = location.getWorld(); Fertilizer fertilizer = PotManager.Cache.get(location.clone().subtract(0,1,0)); @@ -65,19 +68,12 @@ public class BreakBlock implements Listener { world.dropItem(itemLoc, CustomStack.getInstance(cropInstance.getQuality_3()).getItemStack()); } } + }else { + normalDrop(cropInstance, random, itemLoc, world); } } else { - for (int i = 0; i < random; i++){ - double ran = Math.random(); - if (ran < ConfigReader.Config.quality_1){ - world.dropItem(itemLoc, CustomStack.getInstance(cropInstance.getQuality_1()).getItemStack()); - }else if(ran > ConfigReader.Config.quality_2){ - world.dropItem(itemLoc, CustomStack.getInstance(cropInstance.getQuality_2()).getItemStack()); - }else { - world.dropItem(itemLoc, CustomStack.getInstance(cropInstance.getQuality_3()).getItemStack()); - } - } + normalDrop(cropInstance, random, itemLoc, world); } } } @@ -86,6 +82,9 @@ public class BreakBlock implements Listener { PotManager.Cache.remove(location); World world = location.getWorld(); Block blockUp = location.add(0,1,0).getBlock(); + for (Integration integration : ConfigReader.Config.integration){ + if(!integration.canPlace(location, event.getPlayer())) return; + } if(CustomBlock.byAlreadyPlaced(blockUp) != null){ String cropNamespacedId = CustomBlock.byAlreadyPlaced(blockUp).getNamespacedID(); if(cropNamespacedId.contains("_stage_")){ @@ -120,16 +119,7 @@ public class BreakBlock implements Listener { } } else { - for (int i = 0; i < random; i++){ - double ran = Math.random(); - if (ran < ConfigReader.Config.quality_1){ - world.dropItem(itemLoc, CustomStack.getInstance(cropInstance.getQuality_1()).getItemStack()); - }else if(ran > ConfigReader.Config.quality_2){ - world.dropItem(itemLoc, CustomStack.getInstance(cropInstance.getQuality_2()).getItemStack()); - }else { - world.dropItem(itemLoc, CustomStack.getInstance(cropInstance.getQuality_3()).getItemStack()); - } - } + normalDrop(cropInstance, random, itemLoc, world); } return; } @@ -142,4 +132,17 @@ public class BreakBlock implements Listener { } } } + + static void normalDrop(CropInstance cropInstance, int random, Location itemLoc, World world) { + for (int i = 0; i < random; i++){ + double ran = Math.random(); + if (ran < ConfigReader.Config.quality_1){ + world.dropItem(itemLoc, CustomStack.getInstance(cropInstance.getQuality_1()).getItemStack()); + }else if(ran > ConfigReader.Config.quality_2){ + world.dropItem(itemLoc, CustomStack.getInstance(cropInstance.getQuality_2()).getItemStack()); + }else { + world.dropItem(itemLoc, CustomStack.getInstance(cropInstance.getQuality_3()).getItemStack()); + } + } + } } diff --git a/src/main/java/net/momirealms/customcrops/listener/InteractEntity.java b/src/main/java/net/momirealms/customcrops/listener/InteractEntity.java index 4c7ecf5..47614d4 100644 --- a/src/main/java/net/momirealms/customcrops/listener/InteractEntity.java +++ b/src/main/java/net/momirealms/customcrops/listener/InteractEntity.java @@ -49,11 +49,11 @@ public class InteractEntity implements Listener { int z = location.getBlockZ(); int maxWater = config.getWater(); int currentWater = 0; + Location loc = location.subtract(0,1,0).getBlock().getLocation().add(0,1,0); + Sprinkler sprinkler = SprinklerManager.Cache.get(loc); if (itemStack.getType() == Material.WATER_BUCKET){ itemStack.setType(Material.BUCKET); player.getWorld().playSound(player.getLocation(), Sound.ITEM_BUCKET_FILL,1,1); - Location loc = location.subtract(0,1,0).getBlock().getLocation().add(0,1,0); - Sprinkler sprinkler = SprinklerManager.Cache.get(loc); if (sprinkler != null){ currentWater = sprinkler.getWater(); currentWater += ConfigReader.Config.sprinklerRefill; @@ -62,21 +62,27 @@ public class InteractEntity implements Listener { } sprinkler.setWater(currentWater); }else { - StringBuilder stringBuilder = new StringBuilder().append(world).append(".").append(x/16).append(",").append(z/16).append(".").append(x).append(",").append(location.getBlockY()).append(",").append(z).append(".water"); - currentWater = plugin.getSprinklerManager().data.getInt(stringBuilder.toString()); + String path = world + "." + x / 16 + "," + z / 16 + "." + x + "," + location.getBlockY() + "," + z + ".water"; + currentWater = plugin.getSprinklerManager().data.getInt(path); currentWater += ConfigReader.Config.sprinklerRefill; if (currentWater > maxWater){ currentWater = maxWater; } - plugin.getSprinklerManager().data.set(stringBuilder.toString(), currentWater); + plugin.getSprinklerManager().data.set(path, currentWater); + } + }else { + if (sprinkler != null){ + currentWater = sprinkler.getWater(); + }else { + String path = world + "." + x / 16 + "," + z / 16 + "." + x + "," + location.getBlockY() + "," + z + ".water"; + currentWater = plugin.getSprinklerManager().data.getInt(path); } } - Location loc = armorStand.getLocation().add(0, ConfigReader.Message.sprinklerOffset,0); if (ConfigReader.Message.hasSprinklerInfo){ String string = ConfigReader.Message.sprinklerLeft + ConfigReader.Message.sprinklerFull.repeat(currentWater) + ConfigReader.Message.sprinklerEmpty.repeat(maxWater - currentWater) + ConfigReader.Message.sprinklerRight; if(HoloUtil.cache.get(player) == null) { - HoloUtil.showHolo(string.replace("{max_water}", String.valueOf(maxWater)).replace("{water}", String.valueOf(currentWater)), player, loc, ConfigReader.Message.sprinklerTime); + HoloUtil.showHolo(string.replace("{max_water}", String.valueOf(maxWater)).replace("{water}", String.valueOf(currentWater)), player, location.add(0, ConfigReader.Message.sprinklerOffset,0), ConfigReader.Message.sprinklerTime); } } } diff --git a/src/main/java/net/momirealms/customcrops/listener/RightClick.java b/src/main/java/net/momirealms/customcrops/listener/RightClick.java index 852fb18..6005568 100644 --- a/src/main/java/net/momirealms/customcrops/listener/RightClick.java +++ b/src/main/java/net/momirealms/customcrops/listener/RightClick.java @@ -5,7 +5,6 @@ import de.tr7zw.changeme.nbtapi.NBTItem; import dev.lone.itemsadder.api.CustomBlock; import dev.lone.itemsadder.api.CustomStack; import net.momirealms.customcrops.ConfigReader; -import net.momirealms.customcrops.CustomCrops; import net.momirealms.customcrops.datamanager.CropManager; import net.momirealms.customcrops.datamanager.PotManager; import net.momirealms.customcrops.datamanager.SeasonManager; @@ -92,19 +91,12 @@ public class RightClick implements Listener { world.dropItem(itemLoc, CustomStack.getInstance(cropInstance.getQuality_3()).getItemStack()); } } + }else { + BreakBlock.normalDrop(cropInstance, random, itemLoc, world); } } else { - for (int i = 0; i < random; i++){ - double ran = Math.random(); - if (ran < ConfigReader.Config.quality_1){ - world.dropItem(itemLoc, CustomStack.getInstance(cropInstance.getQuality_1()).getItemStack()); - }else if(ran > ConfigReader.Config.quality_2){ - world.dropItem(itemLoc, CustomStack.getInstance(cropInstance.getQuality_2()).getItemStack()); - }else { - world.dropItem(itemLoc, CustomStack.getInstance(cropInstance.getQuality_3()).getItemStack()); - } - } + BreakBlock.normalDrop(cropInstance, random, itemLoc, world); } }else { customBlock.getLoot().forEach(loot-> location.getWorld().dropItem(location.clone().add(0.5,0.2,0.5), loot)); @@ -225,13 +217,30 @@ public class RightClick implements Listener { } String namespacedID = customBlock.getNamespacedID(); if (namespacedID.equals(ConfigReader.Basic.pot) || namespacedID.equals(ConfigReader.Basic.watered_pot)){ - itemStack.setAmount(itemStack.getAmount() - 1); - player.getWorld().playSound(player.getLocation(), Sound.ITEM_HOE_TILL,1,1); - addFertilizer(fertilizerConfig, block); - }else if (!fertilizerConfig.isBefore() && namespacedID.contains("_stage_")){ - itemStack.setAmount(itemStack.getAmount() - 1); - addFertilizer(fertilizerConfig, block); - player.getWorld().playSound(player.getLocation(), Sound.ITEM_HOE_TILL,1,1); + CustomBlock customBlockUp = CustomBlock.byAlreadyPlaced(block.getLocation().clone().add(0,1,0).getBlock()); + if (customBlockUp != null){ + if (fertilizerConfig.isBefore() && customBlockUp.getNamespacedID().contains("_stage_")){ + AdventureManager.playerMessage(player, ConfigReader.Message.prefix + ConfigReader.Message.beforePlant); + return; + }else { + itemStack.setAmount(itemStack.getAmount() - 1); + player.getWorld().playSound(player.getLocation(), Sound.ITEM_HOE_TILL,1,1); + addFertilizer(fertilizerConfig, block); + } + }else { + itemStack.setAmount(itemStack.getAmount() - 1); + player.getWorld().playSound(player.getLocation(), Sound.ITEM_HOE_TILL,1,1); + addFertilizer(fertilizerConfig, block); + } + }else if (namespacedID.contains("_stage_")){ + if (!fertilizerConfig.isBefore()){ + itemStack.setAmount(itemStack.getAmount() - 1); + addFertilizer(fertilizerConfig, block); + player.getWorld().playSound(player.getLocation(), Sound.ITEM_HOE_TILL,1,1); + }else { + AdventureManager.playerMessage(player, ConfigReader.Message.prefix + ConfigReader.Message.beforePlant); + return; + } } return; } @@ -249,6 +258,7 @@ public class RightClick implements Listener { return; } Sprinkler sprinklerData = new Sprinkler(sprinkler.get().getRange(), 0); + itemStack.setAmount(itemStack.getAmount() - 1); SprinklerManager.Cache.put(location.add(0,1,0), sprinklerData); IAFurniture.placeFurniture(sprinkler.get().getNamespacedID_2(),location); return; diff --git a/src/main/java/net/momirealms/customcrops/utils/BackUp.java b/src/main/java/net/momirealms/customcrops/utils/BackUp.java index c7a9240..57fa8ff 100644 --- a/src/main/java/net/momirealms/customcrops/utils/BackUp.java +++ b/src/main/java/net/momirealms/customcrops/utils/BackUp.java @@ -1,6 +1,5 @@ package net.momirealms.customcrops.utils; -import net.momirealms.customcrops.ConfigReader; import net.momirealms.customcrops.CustomCrops; import java.io.File; diff --git a/src/main/java/net/momirealms/customcrops/utils/HoloUtil.java b/src/main/java/net/momirealms/customcrops/utils/HoloUtil.java index 72bf3ea..00a3e89 100644 --- a/src/main/java/net/momirealms/customcrops/utils/HoloUtil.java +++ b/src/main/java/net/momirealms/customcrops/utils/HoloUtil.java @@ -8,7 +8,6 @@ import com.comphenix.protocol.wrappers.WrappedDataWatcher; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; -import net.momirealms.customcrops.ConfigReader; import net.momirealms.customcrops.CustomCrops; import org.bukkit.Bukkit; import org.bukkit.Location; diff --git a/src/main/java/net/momirealms/customcrops/utils/WateringCan.java b/src/main/java/net/momirealms/customcrops/utils/WateringCan.java index 802a0e4..eaabab2 100644 --- a/src/main/java/net/momirealms/customcrops/utils/WateringCan.java +++ b/src/main/java/net/momirealms/customcrops/utils/WateringCan.java @@ -1,16 +1,6 @@ package net.momirealms.customcrops.utils; -public class WateringCan { - - private final int max; - private final int width; - private final int length; - - public WateringCan(int max, int width, int length){ - this.length = length; - this.max = max; - this.width = width; - } +public record WateringCan(int max, int width, int length) { public int getMax() { return max; diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 971ca07..a51ea82 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,7 +1,7 @@ config: #插件兼容 integration: - #收获flag为harvest 浇水种植flag为build + #收获flag为destroy 浇水种植flag为build Residence: false #收获flag为BLOCK-BREAK 浇水种植flag为BUILD WorldGuard: false @@ -9,6 +9,9 @@ config: Kingdoms: false #信任的玩家可以收获、浇水和种植 GriefDefender: false + #拥有地皮权限的玩家可以收获、浇水和种植 + PlotSquared: false + #生长时间点(tick) #洒水器将会在农作物全部完成生长后开始工作 @@ -19,6 +22,8 @@ config: quality: #若不启用则植物成熟阶段会掉落IA配置里的loot #如果关闭产物品质需要在IA物品配置内自行添加最后一阶段掉落物 + #如果你使用的领地插件不被兼容,请不要启用产物品质功能, + #请立即更换领地插件或寻找作者写领地兼容 enable: true #默认品质权重比 default-ratio: 17/2/1 diff --git a/src/main/resources/messages.yml b/src/main/resources/messages.yml index fdfb39c..102572e 100644 --- a/src/main/resources/messages.yml +++ b/src/main/resources/messages.yml @@ -23,6 +23,7 @@ messages: force-save: '成功强制保存缓存信息!' back-up: '已完成数据备份!' set-season: '成功切换世界 {world} 的季节为 {season}!' + before-plant: '这种肥料必须在种植前使用!' #全息信息显示 hologram: @@ -39,7 +40,7 @@ hologram: #洒水器信息 sprinkler-info: enable: true - y-offset: -0.2 + y-offset: 0.8 duration: 1 #可用变量 {water}当前水量 {max_water}最大蓄水量 left: '뀂' diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index ea1e411..fc9e07f 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -11,6 +11,7 @@ softdepend: - Kingdoms - WorldGuard - GriefDefender + - PlotSquared authors: [ XiaoMoMi ] commands: customcrops: