From 577cd7cb1026666d5edba9866d0ef5143ced7f05 Mon Sep 17 00:00:00 2001 From: XiaoMoMi <70987828+Xiao-MoMi@users.noreply.github.com> Date: Thu, 5 Sep 2024 02:07:27 +0800 Subject: [PATCH] improve vanilla crop interactions --- .../api/core/AbstractCustomEventListener.java | 23 +++++++++- .../customcrops/api/core/ConfigManager.java | 7 ++++ .../api/core/block/GreenhouseBlock.java | 2 +- .../customcrops/api/core/block/PotBlock.java | 16 +++---- .../api/core/block/ScarecrowBlock.java | 2 +- .../api/core/block/SprinklerBlock.java | 2 +- .../api/core/mechanic/pot/PotConfigImpl.java | 1 - .../bukkit/config/BukkitConfigManager.java | 42 +++++++++++++++++-- .../bukkit/item/BukkitItemManager.java | 3 +- plugin/src/main/resources/config.yml | 2 + 10 files changed, 82 insertions(+), 18 deletions(-) diff --git a/api/src/main/java/net/momirealms/customcrops/api/core/AbstractCustomEventListener.java b/api/src/main/java/net/momirealms/customcrops/api/core/AbstractCustomEventListener.java index aa75583..bacc68a 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/core/AbstractCustomEventListener.java +++ b/api/src/main/java/net/momirealms/customcrops/api/core/AbstractCustomEventListener.java @@ -22,7 +22,6 @@ import net.momirealms.customcrops.api.action.ActionManager; import net.momirealms.customcrops.api.context.Context; import net.momirealms.customcrops.api.context.ContextKeys; import net.momirealms.customcrops.api.core.block.CropBlock; -import net.momirealms.customcrops.api.core.block.PotBlock; import net.momirealms.customcrops.api.core.mechanic.crop.BoneMeal; import net.momirealms.customcrops.api.core.mechanic.crop.CropConfig; import net.momirealms.customcrops.api.core.mechanic.crop.CropStageConfig; @@ -43,6 +42,7 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Item; import org.bukkit.entity.Player; +import org.bukkit.event.Event; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -109,9 +109,14 @@ public abstract class AbstractCustomEventListener implements Listener { return; Block block = event.getClickedBlock(); assert block != null; - if (blocks.contains(block.getType())) { + Material type = block.getType(); + if (blocks.contains(type)) { return; } + ItemStack itemStack = event.getItem(); + if (itemStack != null && itemStack.getType() == Material.BONE_MEAL && ConfigManager.overriddenCrops().contains(type)) { + event.setUseItemInHand(Event.Result.DENY); + } this.itemManager.handlePlayerInteractBlock( event.getPlayer(), block, @@ -145,6 +150,10 @@ public abstract class AbstractCustomEventListener implements Listener { if (blocks.contains(block.getType())) { return; } + if (ConfigManager.overriddenCrops().contains(block.getType())) { + event.setCancelled(true); + return; + } this.itemManager.handlePlayerPlace( event.getPlayer(), block.getLocation(), @@ -161,6 +170,9 @@ public abstract class AbstractCustomEventListener implements Listener { if (blocks.contains(block.getType())) { return; } + if (ConfigManager.overriddenCrops().contains(block.getType())) { + event.setDropItems(false); + } this.itemManager.handlePlayerBreak( event.getPlayer(), block.getLocation(), @@ -318,6 +330,13 @@ public abstract class AbstractCustomEventListener implements Listener { } } + @EventHandler + public void onBlockPhysics(BlockPhysicsEvent event) { + if (ConfigManager.overriddenCrops().contains(event.getBlock().getType())) { + event.setCancelled(true); + } + } + @EventHandler (ignoreCancelled = true, priority = EventPriority.HIGH) public void onDispenser(BlockDispenseEvent event) { Block block = event.getBlock(); diff --git a/api/src/main/java/net/momirealms/customcrops/api/core/ConfigManager.java b/api/src/main/java/net/momirealms/customcrops/api/core/ConfigManager.java index 283978d..4ca0f78 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/core/ConfigManager.java +++ b/api/src/main/java/net/momirealms/customcrops/api/core/ConfigManager.java @@ -28,6 +28,7 @@ import net.momirealms.customcrops.api.util.PluginUtils; import net.momirealms.customcrops.common.config.ConfigLoader; import net.momirealms.customcrops.common.plugin.feature.Reloadable; import net.momirealms.customcrops.common.util.Pair; +import org.bukkit.Material; import org.bukkit.entity.Player; import java.io.*; @@ -70,6 +71,8 @@ public abstract class ConfigManager implements ConfigLoader, Reloadable { protected boolean disableMoistureMechanic; protected HashMap offsets = new HashMap<>(); + protected HashSet overriddenCrops = new HashSet<>(); + public ConfigManager(BukkitCustomCropsPlugin plugin) { this.plugin = plugin; instance = this; @@ -163,6 +166,10 @@ public abstract class ConfigManager implements ConfigLoader, Reloadable { return instance.disableMoistureMechanic; } + public static Set overriddenCrops() { + return instance.overriddenCrops; + } + @Override public YamlDocument loadConfig(String filePath) { return loadConfig(filePath, '.'); diff --git a/api/src/main/java/net/momirealms/customcrops/api/core/block/GreenhouseBlock.java b/api/src/main/java/net/momirealms/customcrops/api/core/block/GreenhouseBlock.java index 4d5aff7..c8764d5 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/core/block/GreenhouseBlock.java +++ b/api/src/main/java/net/momirealms/customcrops/api/core/block/GreenhouseBlock.java @@ -17,7 +17,6 @@ package net.momirealms.customcrops.api.core.block; -import net.momirealms.customcrops.api.misc.NamedTextColor; import net.momirealms.customcrops.api.BukkitCustomCropsPlugin; import net.momirealms.customcrops.api.core.BuiltInBlockMechanics; import net.momirealms.customcrops.api.core.ConfigManager; @@ -30,6 +29,7 @@ import net.momirealms.customcrops.api.core.wrapper.WrappedPlaceEvent; import net.momirealms.customcrops.api.event.GreenhouseGlassBreakEvent; import net.momirealms.customcrops.api.event.GreenhouseGlassInteractEvent; import net.momirealms.customcrops.api.event.GreenhouseGlassPlaceEvent; +import net.momirealms.customcrops.api.misc.NamedTextColor; import net.momirealms.customcrops.api.util.EventUtils; import java.util.Optional; diff --git a/api/src/main/java/net/momirealms/customcrops/api/core/block/PotBlock.java b/api/src/main/java/net/momirealms/customcrops/api/core/block/PotBlock.java index 625eff0..2fcf908 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/core/block/PotBlock.java +++ b/api/src/main/java/net/momirealms/customcrops/api/core/block/PotBlock.java @@ -18,13 +18,14 @@ package net.momirealms.customcrops.api.core.block; import com.flowpowered.nbt.*; -import com.flowpowered.nbt.Tag; -import net.momirealms.customcrops.api.misc.NamedTextColor; import net.momirealms.customcrops.api.BukkitCustomCropsPlugin; import net.momirealms.customcrops.api.action.ActionManager; import net.momirealms.customcrops.api.context.Context; import net.momirealms.customcrops.api.context.ContextKeys; -import net.momirealms.customcrops.api.core.*; +import net.momirealms.customcrops.api.core.BuiltInBlockMechanics; +import net.momirealms.customcrops.api.core.ConfigManager; +import net.momirealms.customcrops.api.core.ExistenceForm; +import net.momirealms.customcrops.api.core.Registries; import net.momirealms.customcrops.api.core.mechanic.crop.CropConfig; import net.momirealms.customcrops.api.core.mechanic.crop.CropStageConfig; import net.momirealms.customcrops.api.core.mechanic.fertilizer.Fertilizer; @@ -37,17 +38,18 @@ import net.momirealms.customcrops.api.core.wrapper.WrappedBreakEvent; import net.momirealms.customcrops.api.core.wrapper.WrappedInteractEvent; import net.momirealms.customcrops.api.core.wrapper.WrappedPlaceEvent; import net.momirealms.customcrops.api.event.*; +import net.momirealms.customcrops.api.misc.NamedTextColor; import net.momirealms.customcrops.api.misc.water.WateringMethod; import net.momirealms.customcrops.api.requirement.RequirementManager; import net.momirealms.customcrops.api.util.EventUtils; import net.momirealms.customcrops.api.util.LocationUtils; import net.momirealms.customcrops.api.util.PlayerUtils; -import net.momirealms.customcrops.api.util.StringUtils; -import org.bukkit.*; -import org.bukkit.block.Block; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Waterlogged; -import org.bukkit.block.data.type.Farmland; import org.bukkit.entity.Player; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; diff --git a/api/src/main/java/net/momirealms/customcrops/api/core/block/ScarecrowBlock.java b/api/src/main/java/net/momirealms/customcrops/api/core/block/ScarecrowBlock.java index 07371e1..4f6168c 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/core/block/ScarecrowBlock.java +++ b/api/src/main/java/net/momirealms/customcrops/api/core/block/ScarecrowBlock.java @@ -17,7 +17,6 @@ package net.momirealms.customcrops.api.core.block; -import net.momirealms.customcrops.api.misc.NamedTextColor; import net.momirealms.customcrops.api.BukkitCustomCropsPlugin; import net.momirealms.customcrops.api.core.BuiltInBlockMechanics; import net.momirealms.customcrops.api.core.ConfigManager; @@ -30,6 +29,7 @@ import net.momirealms.customcrops.api.core.wrapper.WrappedPlaceEvent; import net.momirealms.customcrops.api.event.ScarecrowBreakEvent; import net.momirealms.customcrops.api.event.ScarecrowInteractEvent; import net.momirealms.customcrops.api.event.ScarecrowPlaceEvent; +import net.momirealms.customcrops.api.misc.NamedTextColor; import net.momirealms.customcrops.api.util.EventUtils; import java.util.Optional; diff --git a/api/src/main/java/net/momirealms/customcrops/api/core/block/SprinklerBlock.java b/api/src/main/java/net/momirealms/customcrops/api/core/block/SprinklerBlock.java index 5393caa..fe51a4e 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/core/block/SprinklerBlock.java +++ b/api/src/main/java/net/momirealms/customcrops/api/core/block/SprinklerBlock.java @@ -19,7 +19,6 @@ package net.momirealms.customcrops.api.core.block; import com.flowpowered.nbt.IntTag; import com.flowpowered.nbt.Tag; -import net.momirealms.customcrops.api.misc.NamedTextColor; import net.momirealms.customcrops.api.BukkitCustomCropsPlugin; import net.momirealms.customcrops.api.action.ActionManager; import net.momirealms.customcrops.api.context.Context; @@ -37,6 +36,7 @@ import net.momirealms.customcrops.api.event.SprinklerBreakEvent; import net.momirealms.customcrops.api.event.SprinklerFillEvent; import net.momirealms.customcrops.api.event.SprinklerInteractEvent; import net.momirealms.customcrops.api.event.SprinklerPlaceEvent; +import net.momirealms.customcrops.api.misc.NamedTextColor; import net.momirealms.customcrops.api.misc.water.WateringMethod; import net.momirealms.customcrops.api.requirement.RequirementManager; import net.momirealms.customcrops.api.util.EventUtils; diff --git a/api/src/main/java/net/momirealms/customcrops/api/core/mechanic/pot/PotConfigImpl.java b/api/src/main/java/net/momirealms/customcrops/api/core/mechanic/pot/PotConfigImpl.java index b40b48e..8edb196 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/core/mechanic/pot/PotConfigImpl.java +++ b/api/src/main/java/net/momirealms/customcrops/api/core/mechanic/pot/PotConfigImpl.java @@ -18,7 +18,6 @@ package net.momirealms.customcrops.api.core.mechanic.pot; import net.momirealms.customcrops.api.action.Action; -import net.momirealms.customcrops.api.core.ExistenceForm; import net.momirealms.customcrops.api.core.mechanic.fertilizer.FertilizerType; import net.momirealms.customcrops.api.core.world.CustomCropsBlockState; import net.momirealms.customcrops.api.misc.water.WaterBar; diff --git a/plugin/src/main/java/net/momirealms/customcrops/bukkit/config/BukkitConfigManager.java b/plugin/src/main/java/net/momirealms/customcrops/bukkit/config/BukkitConfigManager.java index df9161b..d499eca 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/bukkit/config/BukkitConfigManager.java +++ b/plugin/src/main/java/net/momirealms/customcrops/bukkit/config/BukkitConfigManager.java @@ -38,9 +38,11 @@ import net.momirealms.customcrops.api.core.mechanic.pot.PotConfig; import net.momirealms.customcrops.api.core.mechanic.sprinkler.SprinklerConfig; import net.momirealms.customcrops.api.core.mechanic.wateringcan.WateringCanConfig; import net.momirealms.customcrops.common.helper.AdventureHelper; +import net.momirealms.customcrops.common.helper.VersionHelper; import net.momirealms.customcrops.common.locale.TranslationManager; import net.momirealms.customcrops.common.plugin.CustomCropsProperties; import net.momirealms.customcrops.common.util.ListUtils; +import org.bukkit.Material; import java.io.File; import java.io.FileInputStream; @@ -50,14 +52,23 @@ import java.util.*; public class BukkitConfigManager extends ConfigManager { + private static final Set VANILLA_CROPS = new HashSet<>( + List.of(Material.WHEAT, Material.CARROTS, Material.POTATOES, Material.BEETROOTS, Material.SWEET_BERRY_BUSH, + Material.MELON_STEM, Material.PUMPKIN_STEM) + ); private static YamlDocument MAIN_CONFIG; - public static YamlDocument getMainConfig() { return MAIN_CONFIG; } public BukkitConfigManager(BukkitCustomCropsPlugin plugin) { super(plugin); + if (VersionHelper.isVersionNewerThan1_19_4()) { + VANILLA_CROPS.add(Material.TORCHFLOWER_CROP); + } + if (VersionHelper.isVersionNewerThan1_20()) { + VANILLA_CROPS.add(Material.PITCHER_CROP); + } } @Override @@ -155,6 +166,27 @@ public class BukkitConfigManager extends ConfigManager { for (String id : greenhouse) { Registries.BLOCKS.register(id, BuiltInBlockMechanics.GREENHOUSE.mechanic()); } + + overriddenCrops.clear(); + overriddenCrops.addAll(config.getStringList("mechanics.override-vanilla-crops") + .stream() + .map(it -> { + try { + return Material.valueOf(it.toUpperCase(Locale.ENGLISH)); + } catch (IllegalArgumentException e) { + plugin.getPluginLogger().warn("No enum constant exists", e); + return Material.AIR; + } + }) + .filter(it -> { + if (it == Material.AIR) return false; + boolean allow = VANILLA_CROPS.contains(it); + if (!allow) { + plugin.getPluginLogger().warn(it.name() + " is not a supported vanilla crop type"); + } + return allow; + }) + .toList()); } @Override @@ -193,8 +225,12 @@ public class BukkitConfigManager extends ConfigManager { boolean save = false; for (Map.Entry entry : document.getStringRouteMappedValues(false).entrySet()) { if (entry.getValue() instanceof Section section) { - if (type.parse(this, entry.getKey(), section)) { - save = true; + try { + if (type.parse(this, entry.getKey(), section)) { + save = true; + } + } catch (Exception e) { + plugin.getPluginLogger().warn("Error occurs during parsing configs", e); } } } diff --git a/plugin/src/main/java/net/momirealms/customcrops/bukkit/item/BukkitItemManager.java b/plugin/src/main/java/net/momirealms/customcrops/bukkit/item/BukkitItemManager.java index 4c35bd7..1d73b2d 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/bukkit/item/BukkitItemManager.java +++ b/plugin/src/main/java/net/momirealms/customcrops/bukkit/item/BukkitItemManager.java @@ -37,7 +37,6 @@ import net.momirealms.customcrops.api.integration.ItemProvider; import net.momirealms.customcrops.api.util.EventUtils; import net.momirealms.customcrops.api.util.LocationUtils; import net.momirealms.customcrops.api.util.PluginUtils; -import net.momirealms.customcrops.api.util.StringUtils; import net.momirealms.customcrops.common.item.Item; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -250,7 +249,7 @@ public class BukkitItemManager extends AbstractItemManager { public String blockID(@NotNull Block block) { String id = this.provider.blockID(block); if (id == null) { - id = block.getType().toString(); + id = block.getBlockData().getAsString(); } return id; } diff --git a/plugin/src/main/resources/config.yml b/plugin/src/main/resources/config.yml index 7fc7d2e..07c8994 100644 --- a/plugin/src/main/resources/config.yml +++ b/plugin/src/main/resources/config.yml @@ -125,6 +125,8 @@ mechanics: # Set hologram offset correction for other blocks hologram-offset-correction: "{0}crop_stage_death": 0 + # Set the crop types that would be overridden + override-vanilla-crops: [] other-settings: # It's recommended to use MiniMessage format. If you insist on using legacy color code "&", enable the support below. # Disable this would improve performance