diff --git a/build.gradle b/build.gradle index 07d1361..7350b82 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group = 'net.momirealms' -version = '2.0-r1-hotfix' +version = '2.0-r3' repositories { mavenCentral() diff --git a/src/main/java/net/momirealms/customcrops/config/ConfigUtil.java b/src/main/java/net/momirealms/customcrops/config/ConfigUtil.java index 7b84bef..8099319 100644 --- a/src/main/java/net/momirealms/customcrops/config/ConfigUtil.java +++ b/src/main/java/net/momirealms/customcrops/config/ConfigUtil.java @@ -77,6 +77,7 @@ public class ConfigUtil { if (CustomCrops.plugin.getCropManager() != null) { CustomCrops.plugin.getCropManager().loadMode(); CustomCrops.plugin.getCropManager().loadSeason(); + CustomCrops.plugin.getCropManager().loadPacket(); } } } diff --git a/src/main/java/net/momirealms/customcrops/config/MainConfig.java b/src/main/java/net/momirealms/customcrops/config/MainConfig.java index 943a13d..4ca52e4 100644 --- a/src/main/java/net/momirealms/customcrops/config/MainConfig.java +++ b/src/main/java/net/momirealms/customcrops/config/MainConfig.java @@ -90,6 +90,14 @@ public class MainConfig { public static boolean autoBackUp; public static boolean needSkyLight; public static int skyLightLevel; + public static boolean enableWaterCanLore; + public static boolean enablePacketLore; + public static List waterCanLore; + public static String waterBarLeft; + public static String waterBarFull; + public static String waterBarEmpty; + public static String waterBarRight; + public static boolean topOrBottom; public static void load() { ConfigUtil.update("config.yml"); @@ -105,12 +113,15 @@ public class MainConfig { worlds[i] = Bukkit.getWorld(worldsName.get(i)); } } - if (worlds != null) { - worldList = List.of(worlds); - } - else { - worldList = new ArrayList<>(); + + worldList = new ArrayList<>(); + for (World world : worlds) { + if (world == null) continue; + worldList.add(world); } + + worlds = worldList.toArray(new World[0]); + cropMode = config.getString("mechanics.crops-mode", "tripwire").equals("tripwire"); limitation = config.getBoolean("optimization.limitation.enable", true); wireAmount = config.getInt("optimization.limitation.tripwire-amount", 64); @@ -132,8 +143,8 @@ public class MainConfig { preventInWrongSeason = config.getBoolean("mechanics.prevent-plant-if-wrong-season", true); notifyInWrongSeason = config.getBoolean("mechanics.should-notify-if-wrong-season", true); - enableBoneMeal = config.getBoolean("mechanics.bone-meal", true); - boneMealChance = config.getDouble("mechanics.chance", 0.5); + enableBoneMeal = config.getBoolean("mechanics.bone-meal.enable", true); + boneMealChance = config.getDouble("mechanics.bone-meal.chance", 0.5); syncSeason = config.getBoolean("mechanics.season.sync-seasons.enable", false); syncWorld = Bukkit.getWorld(config.getString("mechanics.season.sync-seasons.world", "world")); @@ -144,7 +155,7 @@ public class MainConfig { enableAnimations = !config.getBoolean("optimization.disable-sprinkler-animation", false); try { - boneMealSuccess = Particle.valueOf(config.getString("mechanics.success-particle", "VILLAGER_HAPPY")); + boneMealSuccess = Particle.valueOf(config.getString("mechanics.bone-meal.success-particle", "VILLAGER_HAPPY")); } catch (IllegalArgumentException e) { AdventureUtil.consoleMessage("[CustomCrops] Illegal Particle Argument for Bone Meal"); @@ -184,44 +195,53 @@ public class MainConfig { fertilizerInfoDuration = config.getInt("hologram.fertilizer-info.duration", 1); fertilizerInfo = config.getString("hologram.fertilizer-info.text", "{fertilizer} {times}/{max_times}"); + enableWaterCanLore = config.getBoolean("watering-can-lore.enable", true); + enablePacketLore = config.getBoolean("watering-can-lore.packets.enable", true); + topOrBottom = config.getBoolean("watering-can-lore.packets.top-or-bottom", true); + waterCanLore = config.getStringList("watering-can-lore.lore"); + waterBarLeft = config.getString("watering-can-lore.water-bar.left", "뀂"); + waterBarFull = config.getString("watering-can-lore.water-bar.full", "뀁뀃"); + waterBarEmpty = config.getString("watering-can-lore.water-bar.empty", "뀁뀄"); + waterBarRight = config.getString("watering-can-lore.water-bar.right", "뀁뀅"); + antiGriefs = new ArrayList<>(); - if (config.getBoolean("config.integration.Residence",false)){ + if (config.getBoolean("integration.Residence",false)){ if (Bukkit.getPluginManager().getPlugin("Residence") == null) Log.warn("Failed to initialize Residence!"); else {antiGriefs.add(new ResidenceHook());hookMessage("Residence");} } - if (config.getBoolean("config.integration.Kingdoms",false)){ + if (config.getBoolean("integration.Kingdoms",false)){ if (Bukkit.getPluginManager().getPlugin("Kingdoms") == null) Log.warn("Failed to initialize Kingdoms!"); else {antiGriefs.add(new KingdomsXHook());hookMessage("Kingdoms");} } - if (config.getBoolean("config.integration.WorldGuard",false)){ + if (config.getBoolean("integration.WorldGuard",false)){ if (Bukkit.getPluginManager().getPlugin("WorldGuard") == null) Log.warn("Failed to initialize WorldGuard!"); else {antiGriefs.add(new WorldGuardHook());hookMessage("WorldGuard");} } - if (config.getBoolean("config.integration.GriefDefender",false)){ + if (config.getBoolean("integration.GriefDefender",false)){ if(Bukkit.getPluginManager().getPlugin("GriefDefender") == null) Log.warn("Failed to initialize GriefDefender!"); else {antiGriefs.add(new GriefDefenderHook());hookMessage("GriefDefender");} } - if (config.getBoolean("config.integration.PlotSquared",false)){ + if (config.getBoolean("integration.PlotSquared",false)){ if(Bukkit.getPluginManager().getPlugin("PlotSquared") == null) Log.warn("Failed to initialize PlotSquared!"); else {antiGriefs.add(new PlotSquaredHook());hookMessage("PlotSquared");} } - if (config.getBoolean("config.integration.Towny",false)){ + if (config.getBoolean("integration.Towny",false)){ if (Bukkit.getPluginManager().getPlugin("Towny") == null) Log.warn("Failed to initialize Towny!"); else {antiGriefs.add(new TownyHook());hookMessage("Towny");} } - if (config.getBoolean("config.integration.Lands",false)){ + if (config.getBoolean("integration.Lands",false)){ if (Bukkit.getPluginManager().getPlugin("Lands") == null) Log.warn("Failed to initialize Lands!"); else {antiGriefs.add(new LandsHook());hookMessage("Lands");} } - if (config.getBoolean("config.integration.GriefPrevention",false)){ + if (config.getBoolean("integration.GriefPrevention",false)){ if (Bukkit.getPluginManager().getPlugin("GriefPrevention") == null) Log.warn("Failed to initialize GriefPrevention!"); else {antiGriefs.add(new GriefPreventionHook());hookMessage("GriefPrevention");} } - if (config.getBoolean("config.integration.CrashClaim",false)){ + if (config.getBoolean("integration.CrashClaim",false)){ if (Bukkit.getPluginManager().getPlugin("CrashClaim") == null) Log.warn("Failed to initialize CrashClaim!"); else {antiGriefs.add(new CrashClaimHook());hookMessage("CrashClaim");} } - if (config.getBoolean("config.integration.BentoBox",false)){ + if (config.getBoolean("integration.BentoBox",false)){ if (Bukkit.getPluginManager().getPlugin("BentoBox") == null) Log.warn("Failed to initialize BentoBox!"); else {antiGriefs.add(new BentoBoxHook());hookMessage("BentoBox");} } @@ -276,6 +296,6 @@ public class MainConfig { } private static void hookMessage(String plugin){ - AdventureUtil.consoleMessage("[CustomCrops] " + plugin + " Hooked!"); + AdventureUtil.consoleMessage("[CustomCrops] " + plugin + " Hooked!"); } } diff --git a/src/main/java/net/momirealms/customcrops/integrations/customplugin/HandlerP.java b/src/main/java/net/momirealms/customcrops/integrations/customplugin/HandlerP.java index 3612f40..1a94e80 100644 --- a/src/main/java/net/momirealms/customcrops/integrations/customplugin/HandlerP.java +++ b/src/main/java/net/momirealms/customcrops/integrations/customplugin/HandlerP.java @@ -17,7 +17,10 @@ package net.momirealms.customcrops.integrations.customplugin; +import de.tr7zw.changeme.nbtapi.NBTCompound; import de.tr7zw.changeme.nbtapi.NBTItem; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.momirealms.customcrops.CustomCrops; import net.momirealms.customcrops.Function; import net.momirealms.customcrops.api.crop.Crop; @@ -74,6 +77,13 @@ public abstract class HandlerP extends Function { //null } + public boolean coolDownJudge(Player player) { + long time = System.currentTimeMillis(); + if (time - (coolDown.getOrDefault(player, time - 50)) < 50) return false; + coolDown.put(player, time); + return true; + } + public void onInteractSprinkler(Location location, Player player, @Nullable ItemStack itemStack, Sprinkler config) { CustomWorld customWorld = cropManager.getCustomWorld(location.getWorld()); @@ -110,45 +120,57 @@ public abstract class HandlerP extends Function { } } else if (itemStack.getType() != Material.AIR) { - NBTItem nbtItem = new NBTItem(itemStack); - int canWater = nbtItem.getInteger("WaterAmount"); - if (canWater > 0) { - SprinklerFillEvent sprinklerFillEvent = new SprinklerFillEvent(player, itemStack); - Bukkit.getPluginManager().callEvent(sprinklerFillEvent); - if (sprinklerFillEvent.isCancelled()) { - return; - } + String canID = customInterface.getItemID(itemStack); + WaterCan canConfig = WaterCanConfig.CANS.get(canID); + if (canConfig != null) { - nbtItem.setInteger("WaterAmount", --canWater); - itemStack.setItemMeta(nbtItem.getItem().getItemMeta()); - int water = sprinkler.getWater() + MainConfig.wateringCanToSprinkler; - if (water > config.getWater()) water = config.getWater(); - sprinkler.setWater(water); + NBTItem nbtItem = new NBTItem(itemStack); + int canWater = nbtItem.getInteger("WaterAmount"); + if (canWater > 0) { - if (SoundConfig.addWaterToSprinkler.isEnable()) { - AdventureUtil.playerSound( - player, - SoundConfig.addWaterToSprinkler.getSource(), - SoundConfig.addWaterToSprinkler.getKey(), - 1,1 - ); - } + SprinklerFillEvent sprinklerFillEvent = new SprinklerFillEvent(player, itemStack); + Bukkit.getPluginManager().callEvent(sprinklerFillEvent); + if (sprinklerFillEvent.isCancelled()) { + return; + } - if (MainConfig.enableActionBar) { - String canID = customInterface.getItemID(itemStack); - WaterCan canConfig = WaterCanConfig.CANS.get(canID); - if (canConfig == null) return; + nbtItem.setInteger("WaterAmount", --canWater); - AdventureUtil.playerActionbar( - player, - (MainConfig.actionBarLeft + - MainConfig.actionBarFull.repeat(canWater) + - MainConfig.actionBarEmpty.repeat(canConfig.getMax() - canWater) + - MainConfig.actionBarRight) - .replace("{max_water}", String.valueOf(canConfig.getMax())) - .replace("{water}", String.valueOf(canWater)) - ); + int water = sprinkler.getWater() + MainConfig.wateringCanToSprinkler; + if (water > config.getWater()) water = config.getWater(); + sprinkler.setWater(water); + + if (SoundConfig.addWaterToSprinkler.isEnable()) { + AdventureUtil.playerSound( + player, + SoundConfig.addWaterToSprinkler.getSource(), + SoundConfig.addWaterToSprinkler.getKey(), + 1,1 + ); + } + + if (MainConfig.enableActionBar) { + AdventureUtil.playerActionbar( + player, + (MainConfig.actionBarLeft + + MainConfig.actionBarFull.repeat(canWater) + + MainConfig.actionBarEmpty.repeat(canConfig.getMax() - canWater) + + MainConfig.actionBarRight) + .replace("{max_water}", String.valueOf(canConfig.getMax())) + .replace("{water}", String.valueOf(canWater)) + ); + } + + if (MainConfig.enableWaterCanLore && !MainConfig.enablePacketLore) { + addWaterLore(nbtItem, canConfig, canWater); + } + + itemStack.setItemMeta(nbtItem.getItem().getItemMeta()); + + if (MainConfig.enableWaterCanLore && MainConfig.enablePacketLore) { + player.updateInventory(); + } } } } @@ -317,7 +339,7 @@ public abstract class HandlerP extends Function { water += MainConfig.waterToWaterCan; if (water > config.getMax()) water = config.getMax(); nbtItem.setInteger("WaterAmount", water); - itemStack.setItemMeta(nbtItem.getItem().getItemMeta()); + if (SoundConfig.addWaterToCan.isEnable()) { AdventureUtil.playerSound( @@ -332,7 +354,17 @@ public abstract class HandlerP extends Function { player.getWorld().spawnParticle(Particle.WATER_SPLASH, block.getLocation().add(0.5,1, 0.5),10,0.1,0.1,0.1); } + if (MainConfig.enableWaterCanLore && !MainConfig.enablePacketLore) { + addWaterLore(nbtItem, config, water); + } + + itemStack.setItemMeta(nbtItem.getItem().getItemMeta()); + + if (MainConfig.enableWaterCanLore && MainConfig.enablePacketLore) { + player.updateInventory(); + } } + break; } } @@ -353,6 +385,24 @@ public abstract class HandlerP extends Function { return false; } + protected void addWaterLore(NBTItem nbtItem, WaterCan config, int water) { + NBTCompound display = nbtItem.getCompound("display"); + List lore = display.getStringList("Lore"); + lore.clear(); + for (String text : MainConfig.waterCanLore) { + lore.add(GsonComponentSerializer.gson().serialize(MiniMessage.miniMessage().deserialize( + text.replace("{water_bar}", + MainConfig.waterBarLeft + + MainConfig.waterBarFull.repeat(water) + + MainConfig.waterBarEmpty.repeat(config.getMax() - water) + + MainConfig.waterBarRight + ) + .replace("{water}", String.valueOf(water)) + .replace("{max_water}", String.valueOf(config.getMax())) + ))); + } + } + public boolean useFertilizer(Location potLoc, String id, Player player, ItemStack itemStack) { Fertilizer fertilizer = FertilizerConfig.FERTILIZERS.get(id); if (fertilizer == null) return false; diff --git a/src/main/java/net/momirealms/customcrops/managers/ItemsAdderFrameCropImpl.java b/src/main/java/net/momirealms/customcrops/integrations/customplugin/itemsadder/ItemsAdderFrameCropImpl.java similarity index 96% rename from src/main/java/net/momirealms/customcrops/managers/ItemsAdderFrameCropImpl.java rename to src/main/java/net/momirealms/customcrops/integrations/customplugin/itemsadder/ItemsAdderFrameCropImpl.java index 17b70a0..406d485 100644 --- a/src/main/java/net/momirealms/customcrops/managers/ItemsAdderFrameCropImpl.java +++ b/src/main/java/net/momirealms/customcrops/integrations/customplugin/itemsadder/ItemsAdderFrameCropImpl.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package net.momirealms.customcrops.managers; +package net.momirealms.customcrops.integrations.customplugin.itemsadder; import net.momirealms.customcrops.CustomCrops; import net.momirealms.customcrops.api.crop.Crop; @@ -23,6 +23,8 @@ import net.momirealms.customcrops.config.BasicItemConfig; import net.momirealms.customcrops.config.CropConfig; import net.momirealms.customcrops.config.MainConfig; import net.momirealms.customcrops.integrations.customplugin.CustomInterface; +import net.momirealms.customcrops.managers.CropManager; +import net.momirealms.customcrops.managers.CropModeInterface; import net.momirealms.customcrops.objects.GiganticCrop; import net.momirealms.customcrops.objects.fertilizer.Fertilizer; import net.momirealms.customcrops.objects.fertilizer.Gigantic; diff --git a/src/main/java/net/momirealms/customcrops/integrations/customplugin/itemsadder/ItemsAdderHandler.java b/src/main/java/net/momirealms/customcrops/integrations/customplugin/itemsadder/ItemsAdderHandler.java index 593e5b1..f905049 100644 --- a/src/main/java/net/momirealms/customcrops/integrations/customplugin/itemsadder/ItemsAdderHandler.java +++ b/src/main/java/net/momirealms/customcrops/integrations/customplugin/itemsadder/ItemsAdderHandler.java @@ -138,9 +138,9 @@ public abstract class ItemsAdderHandler extends HandlerP { } private boolean useWateringCan(Location potLoc, String namespacedID, Player player, @NotNull CustomStack can) { - WaterCan waterCan = WaterCanConfig.CANS.get(namespacedID); - if (waterCan == null) return false; + WaterCan canConfig = WaterCanConfig.CANS.get(namespacedID); + if (canConfig == null) return false; ItemStack itemStack = can.getItemStack(); NBTItem nbtItem = new NBTItem(itemStack); @@ -180,10 +180,6 @@ public abstract class ItemsAdderHandler extends HandlerP { } if (MainConfig.enableActionBar) { - String canID = customInterface.getItemID(itemStack); - WaterCan canConfig = WaterCanConfig.CANS.get(canID); - if (canConfig == null) return true; - AdventureUtil.playerActionbar( player, (MainConfig.actionBarLeft + @@ -195,8 +191,17 @@ public abstract class ItemsAdderHandler extends HandlerP { ); } + if (MainConfig.enableWaterCanLore && !MainConfig.enablePacketLore) { + addWaterLore(nbtItem, canConfig, water); + } + itemStack.setItemMeta(nbtItem.getItem().getItemMeta()); - super.waterPot(waterCan.getWidth(), waterCan.getLength(), potLoc, player.getLocation().getYaw()); + + if (MainConfig.enableWaterCanLore && MainConfig.enablePacketLore) { + player.updateInventory(); + } + + super.waterPot(canConfig.getWidth(), canConfig.getLength(), potLoc, player.getLocation().getYaw()); } return true; diff --git a/src/main/java/net/momirealms/customcrops/managers/ItemsAdderWireCropImpl.java b/src/main/java/net/momirealms/customcrops/integrations/customplugin/itemsadder/ItemsAdderWireCropImpl.java similarity index 96% rename from src/main/java/net/momirealms/customcrops/managers/ItemsAdderWireCropImpl.java rename to src/main/java/net/momirealms/customcrops/integrations/customplugin/itemsadder/ItemsAdderWireCropImpl.java index 3b0c2e9..8c9667f 100644 --- a/src/main/java/net/momirealms/customcrops/managers/ItemsAdderWireCropImpl.java +++ b/src/main/java/net/momirealms/customcrops/integrations/customplugin/itemsadder/ItemsAdderWireCropImpl.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package net.momirealms.customcrops.managers; +package net.momirealms.customcrops.integrations.customplugin.itemsadder; import net.momirealms.customcrops.CustomCrops; import net.momirealms.customcrops.api.crop.Crop; @@ -23,6 +23,8 @@ import net.momirealms.customcrops.config.BasicItemConfig; import net.momirealms.customcrops.config.CropConfig; import net.momirealms.customcrops.config.MainConfig; import net.momirealms.customcrops.integrations.customplugin.CustomInterface; +import net.momirealms.customcrops.managers.CropManager; +import net.momirealms.customcrops.managers.CropModeInterface; import net.momirealms.customcrops.objects.GiganticCrop; import net.momirealms.customcrops.objects.fertilizer.Fertilizer; import net.momirealms.customcrops.objects.fertilizer.Gigantic; @@ -31,7 +33,7 @@ import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.Location; -public class ItemsAdderWireCropImpl implements CropModeInterface{ +public class ItemsAdderWireCropImpl implements CropModeInterface { private final CropManager cropManager; private final CustomInterface customInterface; diff --git a/src/main/java/net/momirealms/customcrops/managers/OraxenFrameCropImpl.java b/src/main/java/net/momirealms/customcrops/integrations/customplugin/oraxen/OraxenFrameCropImpl.java similarity index 96% rename from src/main/java/net/momirealms/customcrops/managers/OraxenFrameCropImpl.java rename to src/main/java/net/momirealms/customcrops/integrations/customplugin/oraxen/OraxenFrameCropImpl.java index f678410..bb60ba9 100644 --- a/src/main/java/net/momirealms/customcrops/managers/OraxenFrameCropImpl.java +++ b/src/main/java/net/momirealms/customcrops/integrations/customplugin/oraxen/OraxenFrameCropImpl.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package net.momirealms.customcrops.managers; +package net.momirealms.customcrops.integrations.customplugin.oraxen; import net.momirealms.customcrops.CustomCrops; import net.momirealms.customcrops.api.crop.Crop; @@ -23,7 +23,8 @@ import net.momirealms.customcrops.config.BasicItemConfig; import net.momirealms.customcrops.config.CropConfig; import net.momirealms.customcrops.config.MainConfig; import net.momirealms.customcrops.integrations.customplugin.CustomInterface; -import net.momirealms.customcrops.integrations.customplugin.oraxen.OraxenHook; +import net.momirealms.customcrops.managers.CropManager; +import net.momirealms.customcrops.managers.CropModeInterface; import net.momirealms.customcrops.objects.GiganticCrop; import net.momirealms.customcrops.objects.fertilizer.Fertilizer; import net.momirealms.customcrops.objects.fertilizer.Gigantic; diff --git a/src/main/java/net/momirealms/customcrops/integrations/customplugin/oraxen/OraxenHandler.java b/src/main/java/net/momirealms/customcrops/integrations/customplugin/oraxen/OraxenHandler.java index f758b1b..4ec7051 100644 --- a/src/main/java/net/momirealms/customcrops/integrations/customplugin/oraxen/OraxenHandler.java +++ b/src/main/java/net/momirealms/customcrops/integrations/customplugin/oraxen/OraxenHandler.java @@ -136,8 +136,9 @@ public abstract class OraxenHandler extends HandlerP { } private boolean useWateringCan(Location potLoc, String id, Player player, @NotNull ItemStack can) { - WaterCan waterCan = WaterCanConfig.CANS.get(id); - if (waterCan == null) return false; + + WaterCan canConfig = WaterCanConfig.CANS.get(id); + if (canConfig == null) return false; NBTItem nbtItem = new NBTItem(can); int water = nbtItem.getInteger("WaterAmount"); @@ -160,10 +161,6 @@ public abstract class OraxenHandler extends HandlerP { } if (MainConfig.enableActionBar) { - String canID = customInterface.getItemID(can); - WaterCan canConfig = WaterCanConfig.CANS.get(canID); - if (canConfig == null) return true; - AdventureUtil.playerActionbar( player, (MainConfig.actionBarLeft + @@ -175,8 +172,17 @@ public abstract class OraxenHandler extends HandlerP { ); } + if (MainConfig.enableWaterCanLore && !MainConfig.enablePacketLore) { + addWaterLore(nbtItem, canConfig, water); + } + can.setItemMeta(nbtItem.getItem().getItemMeta()); - super.waterPot(waterCan.getWidth(), waterCan.getLength(), potLoc, player.getLocation().getYaw()); + + if (MainConfig.enableWaterCanLore && MainConfig.enablePacketLore) { + player.updateInventory(); + } + + super.waterPot(canConfig.getWidth(), canConfig.getLength(), potLoc, player.getLocation().getYaw()); } return true; } diff --git a/src/main/java/net/momirealms/customcrops/managers/OraxenWireCropImpl.java b/src/main/java/net/momirealms/customcrops/integrations/customplugin/oraxen/OraxenWireCropImpl.java similarity index 95% rename from src/main/java/net/momirealms/customcrops/managers/OraxenWireCropImpl.java rename to src/main/java/net/momirealms/customcrops/integrations/customplugin/oraxen/OraxenWireCropImpl.java index 117e51f..b214db5 100644 --- a/src/main/java/net/momirealms/customcrops/managers/OraxenWireCropImpl.java +++ b/src/main/java/net/momirealms/customcrops/integrations/customplugin/oraxen/OraxenWireCropImpl.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package net.momirealms.customcrops.managers; +package net.momirealms.customcrops.integrations.customplugin.oraxen; import net.momirealms.customcrops.CustomCrops; import net.momirealms.customcrops.api.crop.Crop; @@ -23,6 +23,8 @@ import net.momirealms.customcrops.config.BasicItemConfig; import net.momirealms.customcrops.config.CropConfig; import net.momirealms.customcrops.config.MainConfig; import net.momirealms.customcrops.integrations.customplugin.CustomInterface; +import net.momirealms.customcrops.managers.CropManager; +import net.momirealms.customcrops.managers.CropModeInterface; import net.momirealms.customcrops.objects.GiganticCrop; import net.momirealms.customcrops.objects.fertilizer.Fertilizer; import net.momirealms.customcrops.objects.fertilizer.Gigantic; @@ -31,7 +33,7 @@ import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.Location; -public class OraxenWireCropImpl implements CropModeInterface{ +public class OraxenWireCropImpl implements CropModeInterface { private final CropManager cropManager; private final CustomInterface customInterface; diff --git a/src/main/java/net/momirealms/customcrops/integrations/skill/MMOCoreHook.java b/src/main/java/net/momirealms/customcrops/integrations/skill/MMOCoreHook.java index d4b6701..1914930 100644 --- a/src/main/java/net/momirealms/customcrops/integrations/skill/MMOCoreHook.java +++ b/src/main/java/net/momirealms/customcrops/integrations/skill/MMOCoreHook.java @@ -17,6 +17,7 @@ package net.momirealms.customcrops.integrations.skill; +import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.experience.EXPSource; import net.Indyuce.mmocore.experience.Profession; import net.momirealms.customcrops.integrations.SkillXP; @@ -25,7 +26,7 @@ import org.bukkit.entity.Player; public class MMOCoreHook implements SkillXP { @Override public void addXp(Player player, double amount) { - Profession profession = net.Indyuce.mmocore.MMOCore.plugin.professionManager.get("farming"); - profession.giveExperience(net.Indyuce.mmocore.MMOCore.plugin.dataProvider.getDataManager().get(player), amount, null ,EXPSource.OTHER); + Profession profession = MMOCore.plugin.professionManager.get("farming"); + profession.giveExperience(MMOCore.plugin.dataProvider.getDataManager().get(player), amount, null ,EXPSource.OTHER); } } diff --git a/src/main/java/net/momirealms/customcrops/managers/CropManager.java b/src/main/java/net/momirealms/customcrops/managers/CropManager.java index f781807..7d33e4f 100644 --- a/src/main/java/net/momirealms/customcrops/managers/CropManager.java +++ b/src/main/java/net/momirealms/customcrops/managers/CropManager.java @@ -27,18 +27,13 @@ import net.momirealms.customcrops.config.SeasonConfig; import net.momirealms.customcrops.config.SoundConfig; import net.momirealms.customcrops.integrations.customplugin.CustomInterface; import net.momirealms.customcrops.integrations.customplugin.HandlerP; -import net.momirealms.customcrops.integrations.customplugin.itemsadder.ItemsAdderFrameHandler; -import net.momirealms.customcrops.integrations.customplugin.itemsadder.ItemsAdderHook; -import net.momirealms.customcrops.integrations.customplugin.itemsadder.ItemsAdderWireHandler; -import net.momirealms.customcrops.integrations.customplugin.oraxen.OraxenFrameHandler; -import net.momirealms.customcrops.integrations.customplugin.oraxen.OraxenHook; -import net.momirealms.customcrops.integrations.customplugin.oraxen.OraxenWireHandler; +import net.momirealms.customcrops.integrations.customplugin.itemsadder.*; +import net.momirealms.customcrops.integrations.customplugin.oraxen.*; import net.momirealms.customcrops.integrations.season.CCSeason; import net.momirealms.customcrops.integrations.season.InternalSeason; import net.momirealms.customcrops.integrations.season.RealisticSeasonsHook; import net.momirealms.customcrops.integrations.season.SeasonInterface; -import net.momirealms.customcrops.managers.listener.ItemSpawnListener; -import net.momirealms.customcrops.managers.listener.WorldListener; +import net.momirealms.customcrops.managers.listener.*; import net.momirealms.customcrops.managers.timer.CrowTask; import net.momirealms.customcrops.managers.timer.TimerTask; import net.momirealms.customcrops.objects.OtherLoot; @@ -75,6 +70,9 @@ public class CropManager extends Function { private SeasonInterface seasonInterface; private CustomInterface customInterface; private ArmorStandUtil armorStandUtil; + private ContainerListener containerListener; + private PlayerModeListener playerModeListener; + private PlayerContainerListener playerContainerListener; private HandlerP handler; public CropManager() { @@ -91,6 +89,7 @@ public class CropManager extends Function { loadMode(); loadSeason(); + loadPacket(); //load Worlds for (World world : Bukkit.getWorlds()) { @@ -149,6 +148,28 @@ public class CropManager extends Function { } } + public void loadPacket() { + if (this.containerListener != null) { + CustomCrops.protocolManager.removePacketListener(containerListener); + this.containerListener = null; + } + if (this.playerModeListener != null) { + HandlerList.unregisterAll(playerModeListener); + this.playerModeListener = null; + } + if (this.playerContainerListener != null) { + CustomCrops.protocolManager.removePacketListener(playerContainerListener); + this.playerContainerListener = null; + } + if (!MainConfig.enableWaterCanLore || !MainConfig.enablePacketLore) return; + containerListener = new ContainerListener(this); + CustomCrops.protocolManager.addPacketListener(containerListener); + playerContainerListener = new PlayerContainerListener(handler); + CustomCrops.protocolManager.addPacketListener(playerContainerListener); + playerModeListener = new PlayerModeListener(); + Bukkit.getPluginManager().registerEvents(playerModeListener, CustomCrops.plugin); + } + @Override public void unload() { super.unload(); @@ -161,6 +182,7 @@ public class CropManager extends Function { } customWorlds.clear(); if (this.seasonInterface != null) seasonInterface.unload(); + if (this.containerListener != null) CustomCrops.protocolManager.removePacketListener(containerListener); } public void onItemSpawn(Item item) { diff --git a/src/main/java/net/momirealms/customcrops/managers/listener/ContainerListener.java b/src/main/java/net/momirealms/customcrops/managers/listener/ContainerListener.java new file mode 100644 index 0000000..505aa4b --- /dev/null +++ b/src/main/java/net/momirealms/customcrops/managers/listener/ContainerListener.java @@ -0,0 +1,76 @@ +package net.momirealms.customcrops.managers.listener; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.events.ListenerPriority; +import com.comphenix.protocol.events.PacketAdapter; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.events.PacketEvent; +import de.tr7zw.changeme.nbtapi.NBTCompound; +import de.tr7zw.changeme.nbtapi.NBTItem; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import net.momirealms.customcrops.CustomCrops; +import net.momirealms.customcrops.config.MainConfig; +import net.momirealms.customcrops.config.WaterCanConfig; +import net.momirealms.customcrops.integrations.customplugin.CustomInterface; +import net.momirealms.customcrops.managers.CropManager; +import net.momirealms.customcrops.objects.WaterCan; +import org.bukkit.GameMode; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class ContainerListener extends PacketAdapter { + + private final CustomInterface customInterface; + + public ContainerListener(CropManager cropManager) { + super(CustomCrops.plugin, ListenerPriority.HIGHEST, PacketType.Play.Server.WINDOW_ITEMS); + this.customInterface = cropManager.getCustomInterface(); + } + + public void onPacketSending(PacketEvent event) { + PacketContainer packet = event.getPacket(); + if (event.getPlayer().getGameMode() == GameMode.CREATIVE) { + return; + } + List itemStacks = packet.getItemListModifier().read(0); + List itemStacksClone = new ArrayList<>(); + for (ItemStack itemStack : itemStacks) { + ItemStack fake = itemStack.clone(); + itemStacksClone.add(fake); + if (fake.getType() == Material.AIR) continue; + String id = customInterface.getItemID(fake); + WaterCan config = WaterCanConfig.CANS.get(id); + if (config == null) continue; + NBTItem nbtItem = new NBTItem(fake); + int water = nbtItem.getInteger("WaterAmount"); + NBTCompound display = nbtItem.getCompound("display"); + if (display == null) continue; + List lore = display.getStringList("Lore"); + if (MainConfig.topOrBottom) lore.addAll(0, getLore(config.getMax(), water)); + else lore.addAll(getLore(config.getMax(), water)); + fake.setItemMeta(nbtItem.getItem().getItemMeta()); + } + packet.getItemListModifier().write(0, itemStacksClone); + } + + private List getLore(int max, int water) { + List lore = new ArrayList<>(); + for (String text : MainConfig.waterCanLore) { + lore.add(GsonComponentSerializer.gson().serialize(MiniMessage.miniMessage().deserialize( + text.replace("{water_bar}", + MainConfig.waterBarLeft + + MainConfig.waterBarFull.repeat(water) + + MainConfig.waterBarEmpty.repeat(max - water) + + MainConfig.waterBarRight + ) + .replace("{water}", String.valueOf(water)) + .replace("{max_water}", String.valueOf(max)) + ))); + } + return lore; + } +} diff --git a/src/main/java/net/momirealms/customcrops/managers/listener/PlayerContainerListener.java b/src/main/java/net/momirealms/customcrops/managers/listener/PlayerContainerListener.java new file mode 100644 index 0000000..a1e0001 --- /dev/null +++ b/src/main/java/net/momirealms/customcrops/managers/listener/PlayerContainerListener.java @@ -0,0 +1,26 @@ +package net.momirealms.customcrops.managers.listener; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.events.ListenerPriority; +import com.comphenix.protocol.events.PacketAdapter; +import com.comphenix.protocol.events.PacketEvent; +import net.momirealms.customcrops.CustomCrops; +import net.momirealms.customcrops.integrations.customplugin.HandlerP; +import org.bukkit.entity.Player; + +public class PlayerContainerListener extends PacketAdapter { + + private final HandlerP handlerP; + + public PlayerContainerListener(HandlerP handlerP) { + super(CustomCrops.plugin, ListenerPriority.HIGHEST, PacketType.Play.Client.WINDOW_CLICK); + this.handlerP = handlerP; + } + + public void onPacketReceiving(PacketEvent event) { + final Player player = event.getPlayer(); + if (handlerP.coolDownJudge(player)) { + player.updateInventory(); + } + } +} \ No newline at end of file diff --git a/src/main/java/net/momirealms/customcrops/managers/listener/PlayerModeListener.java b/src/main/java/net/momirealms/customcrops/managers/listener/PlayerModeListener.java new file mode 100644 index 0000000..2e94eec --- /dev/null +++ b/src/main/java/net/momirealms/customcrops/managers/listener/PlayerModeListener.java @@ -0,0 +1,17 @@ +package net.momirealms.customcrops.managers.listener; + +import net.momirealms.customcrops.CustomCrops; +import org.bukkit.Bukkit; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerGameModeChangeEvent; + +public class PlayerModeListener implements Listener { + + @EventHandler + public void onModeChange(PlayerGameModeChangeEvent event) { + Bukkit.getScheduler().runTaskLater(CustomCrops.plugin, () -> { + event.getPlayer().updateInventory(); + }, 1); + } +} diff --git a/src/main/java/net/momirealms/customcrops/objects/ScareCow.java b/src/main/java/net/momirealms/customcrops/objects/ScareCow.java deleted file mode 100644 index cbda47a..0000000 --- a/src/main/java/net/momirealms/customcrops/objects/ScareCow.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customcrops.objects; - -public class ScareCow { -} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 45ca6bb..be61ad6 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,5 +1,5 @@ #Don't change -config-version: '10' +config-version: '11' # lang: english / spanish / chinese lang: english @@ -165,20 +165,20 @@ sounds: type: player -#Hologram information +# Hologram information hologram: - #Pot infomation + # Pot infomation fertilizer-info: enable: true y-offset: 0.8 duration: 1 text: '{fertilizer} {times}/{max_times}' - #Sprinkler infomation + # Sprinkler infomation sprinkler-info: enable: true y-offset: 0.8 duration: 1 - #available variables {water} {max_water} + # available variables {water} {max_water} left: '뀂' full: '뀁뀃' empty: '뀁뀄' @@ -187,10 +187,34 @@ hologram: actionbar: - #Should actionbar be sent when using watering-can + # Should actionbar be sent when using watering-can enable: true - #available variables {water} {max_water} + # Available variables {water} {max_water} left: '뀂' full: '뀁뀃' empty: '뀁뀄' - right: '뀁뀅' \ No newline at end of file + right: '뀁뀅' + + + +watering-can-lore: + # Should watering-can has dynamic lore according to the water amount + enable: true + # Only packets can remain the former lore, otherwise the lore would be replaced + packets: + # Should watering-can's lore be sent by packets + # Wouldn't work in creative mode for safety + enable: true + # true: top / false: bottom + top-or-bottom: true + # Lore format + # Available variables: {water_bar} + # {water}current water {max_water}max storage + lore: + - '{water_bar}' + - 'Right click water to add water to the can.' + water-bar: + left: '뀂' + full: '뀁뀃' + empty: '뀁뀄' + right: '뀁뀅'