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 8fae423..aa75583 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 @@ -115,7 +115,8 @@ public abstract class AbstractCustomEventListener implements Listener { this.itemManager.handlePlayerInteractBlock( event.getPlayer(), block, - block.getType().name(), event.getBlockFace(), + block.getBlockData().getAsString(), + event.getBlockFace(), event.getHand(), event.getItem(), event @@ -130,8 +131,10 @@ public abstract class AbstractCustomEventListener implements Listener { } this.itemManager.handlePlayerInteractFurniture( event.getPlayer(), - event.getRightClicked().getLocation(), type.name(), - event.getHand(), event.getPlayer().getInventory().getItem(event.getHand()), + event.getRightClicked().getLocation(), + type.name(), + event.getHand(), + event.getPlayer().getInventory().getItem(event.getHand()), event ); } @@ -145,7 +148,7 @@ public abstract class AbstractCustomEventListener implements Listener { this.itemManager.handlePlayerPlace( event.getPlayer(), block.getLocation(), - block.getType().name(), + block.getBlockData().getAsString(), event.getHand(), event.getItemInHand(), event @@ -160,7 +163,9 @@ public abstract class AbstractCustomEventListener implements Listener { } this.itemManager.handlePlayerBreak( event.getPlayer(), - block.getLocation(), event.getPlayer().getInventory().getItemInMainHand(), block.getType().name(), + block.getLocation(), + event.getPlayer().getInventory().getItemInMainHand(), + block.getBlockData().getAsString(), event ); } @@ -216,7 +221,7 @@ public abstract class AbstractCustomEventListener implements Listener { event.setCancelled(true); return; } - this.itemManager.handlePhysicsBreak(block.getLocation(), "FARMLAND", event); + this.itemManager.handlePhysicsBreak(block.getLocation(), block.getBlockData().getAsString(), event); } } } @@ -229,7 +234,7 @@ public abstract class AbstractCustomEventListener implements Listener { event.setCancelled(true); return; } - this.itemManager.handleEntityTrample(event.getEntity(), block.getLocation(), "FARMLAND", event); + this.itemManager.handleEntityTrample(event.getEntity(), block.getLocation(), block.getBlockData().getAsString(), event); } } 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 76d6716..625eff0 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,6 +18,7 @@ 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; @@ -42,10 +43,7 @@ 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.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.World; +import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Waterlogged; @@ -349,6 +347,9 @@ public class PotBlock extends AbstractCustomCropsBlock { } } + // work as vanilla farmland + if (config.vanillaFarmland()) return; + boolean hasNaturalWater = false; boolean waterChanged = false; @@ -613,20 +614,9 @@ public class PotBlock extends AbstractCustomCropsBlock { } public void updateBlockAppearance(Location location, PotConfig config, boolean hasWater, @Nullable Fertilizer fertilizer) { + if (config.vanillaFarmland()) return; String appearance = config.getPotAppearance(hasWater, fertilizer == null ? null : fertilizer.type()); - if (StringUtils.isCapitalLetter(appearance)) { - Block block = location.getBlock(); - Material type = Material.valueOf(appearance); - if (type == Material.FARMLAND) { - Farmland data = ((Farmland) Material.FARMLAND.createBlockData()); - data.setMoisture(hasWater ? 7 : 0); - block.setBlockData(data, false); - } else { - block.setType(type, false); - } - } else { - BukkitCustomCropsPlugin.getInstance().getItemManager().place(location, ExistenceForm.BLOCK, appearance, FurnitureRotation.NONE); - } + BukkitCustomCropsPlugin.getInstance().getItemManager().placeBlock(location, appearance); } private Fertilizer tagToFertilizer(CompoundMap tag) { 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 7b9ae62..5393caa 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 @@ -302,18 +302,20 @@ public class SprinklerBlock extends AbstractCustomCropsBlock { CustomCropsBlockState anotherState = optionalState.get(); if (anotherState.type() instanceof PotBlock potBlock) { PotConfig potConfig = potBlock.config(anotherState); - if (config.potWhitelist().contains(potConfig.id())) { - if (potBlock.addWater(anotherState, potConfig, config.wateringAmount())) { - BukkitCustomCropsPlugin.getInstance().getScheduler().sync().run( - () -> potBlock.updateBlockAppearance( - pos3.toLocation(world.bukkitWorld()), - potConfig, - true, - potBlock.fertilizers(anotherState) - ), - bukkitWorld, - pos3.chunkX(), pos3.chunkZ() - ); + if (!potConfig.vanillaFarmland()) { + if (config.potWhitelist().contains(potConfig.id())) { + if (potBlock.addWater(anotherState, potConfig, config.wateringAmount())) { + BukkitCustomCropsPlugin.getInstance().getScheduler().sync().run( + () -> potBlock.updateBlockAppearance( + pos3.toLocation(world.bukkitWorld()), + potConfig, + true, + potBlock.fertilizers(anotherState) + ), + bukkitWorld, + pos3.chunkX(), pos3.chunkZ() + ); + } } } } diff --git a/api/src/main/java/net/momirealms/customcrops/api/core/item/WateringCanItem.java b/api/src/main/java/net/momirealms/customcrops/api/core/item/WateringCanItem.java index 9786208..e4a8bbc 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/core/item/WateringCanItem.java +++ b/api/src/main/java/net/momirealms/customcrops/api/core/item/WateringCanItem.java @@ -254,6 +254,8 @@ public class WateringCanItem extends AbstractCustomCropsItem { PotConfig potConfig = Registries.ITEM_TO_POT.get(targetBlockID); if (potConfig != null) { + if (potConfig.vanillaFarmland()) + return InteractionResult.COMPLETE; // need to click the upper face if (blockFace != BlockFace.UP) return InteractionResult.PASS; diff --git a/api/src/main/java/net/momirealms/customcrops/api/core/mechanic/pot/PotConfig.java b/api/src/main/java/net/momirealms/customcrops/api/core/mechanic/pot/PotConfig.java index 816a31f..c4b0475 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/core/mechanic/pot/PotConfig.java +++ b/api/src/main/java/net/momirealms/customcrops/api/core/mechanic/pot/PotConfig.java @@ -62,6 +62,13 @@ public interface PotConfig { */ boolean isNearbyWaterAccepted(); + /** + * Checks if the pot works as a vanilla farmland + * + * @return True if disabled + */ + boolean vanillaFarmland(); + /** * Gets the methods available for watering the pot. * @@ -221,6 +228,14 @@ public interface PotConfig { */ Builder storage(int storage); + /** + * Sets if the pot works as a vanilla farmland + * + * @param vanillaFarmland if works as a vanilla farmland + * @return The current instance of the Builder. + */ + Builder vanillaFarmland(boolean vanillaFarmland); + /** * Sets whether the pot can accept rain as a source of water. * 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 a854022..b40b48e 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 @@ -24,7 +24,6 @@ import net.momirealms.customcrops.api.core.world.CustomCropsBlockState; import net.momirealms.customcrops.api.misc.water.WaterBar; import net.momirealms.customcrops.api.misc.water.WateringMethod; import net.momirealms.customcrops.api.requirement.Requirement; -import net.momirealms.customcrops.api.util.StringUtils; import net.momirealms.customcrops.common.util.Pair; import org.bukkit.entity.Player; @@ -35,6 +34,7 @@ import java.util.Set; public class PotConfigImpl implements PotConfig { private final String id; + private final boolean vanillaFarmland; private final Pair basicAppearance; private final HashMap> potAppearanceMap; private final Set blocks = new HashSet<>(); @@ -59,6 +59,7 @@ public class PotConfigImpl implements PotConfig { public PotConfigImpl( String id, + boolean vanillaFarmland, Pair basicAppearance, HashMap> potAppearanceMap, int storage, @@ -80,6 +81,7 @@ public class PotConfigImpl implements PotConfig { Action[] maxFertilizerActions ) { this.id = id; + this.vanillaFarmland = vanillaFarmland; this.basicAppearance = basicAppearance; this.potAppearanceMap = potAppearanceMap; this.storage = storage; @@ -101,19 +103,18 @@ public class PotConfigImpl implements PotConfig { this.maxFertilizerActions = maxFertilizerActions; this.blocks.add(basicAppearance.left()); this.blocks.add(basicAppearance.right()); - addToWet(basicAppearance.right()); + this.wetBlocks.add(basicAppearance.right()); for (Pair pair : potAppearanceMap.values()) { this.blocks.add(pair.left()); this.blocks.add(pair.right()); - addToWet(pair.right()); + this.wetBlocks.add(pair.right()); } - } - - private void addToWet(String id) { - if (StringUtils.isCapitalLetter(id)) { - return; + if (vanillaFarmland) { + this.blocks.clear(); + for (int i = 0; i <= 7; i++) { + this.blocks.add("minecraft:farmland[moisture=" + i +"]"); + } } - this.wetBlocks.add(id); } @Override @@ -123,21 +124,28 @@ public class PotConfigImpl implements PotConfig { @Override public int storage() { + if (vanillaFarmland()) return 0; return storage; } @Override public boolean isRainDropAccepted() { - return isRainDropAccepted; + return isRainDropAccepted && !vanillaFarmland(); } @Override public boolean isNearbyWaterAccepted() { - return isNearbyWaterAccepted; + return isNearbyWaterAccepted && !vanillaFarmland(); + } + + @Override + public boolean vanillaFarmland() { + return vanillaFarmland; } @Override public WateringMethod[] wateringMethods() { + if (vanillaFarmland()) return new WateringMethod[0]; return wateringMethods; } @@ -148,6 +156,7 @@ public class PotConfigImpl implements PotConfig { @Override public boolean isWet(String blockID) { + if (vanillaFarmland()) return false; return wetBlocks.contains(blockID); } @@ -158,6 +167,7 @@ public class PotConfigImpl implements PotConfig { @Override public int maxFertilizers() { + if (vanillaFarmland) return 0; return maxFertilizers; } @@ -230,7 +240,7 @@ public class PotConfigImpl implements PotConfig { public static class BuilderImpl implements Builder { private String id; - private ExistenceForm existenceForm; + private boolean vanillaFarmland; private Pair basicAppearance; private HashMap> potAppearanceMap; private int storage; @@ -253,7 +263,7 @@ public class PotConfigImpl implements PotConfig { @Override public PotConfig build() { - return new PotConfigImpl(id, basicAppearance, potAppearanceMap, storage, isRainDropAccepted, isNearbyWaterAccepted, wateringMethods, waterBar, maxFertilizers, placeRequirements, breakRequirements, useRequirements, tickActions, reachLimitActions, interactActions, placeActions, breakActions, addWaterActions, fullWaterActions, maxFertilizerActions); + return new PotConfigImpl(id, vanillaFarmland, basicAppearance, potAppearanceMap, storage, isRainDropAccepted, isNearbyWaterAccepted, wateringMethods, waterBar, maxFertilizers, placeRequirements, breakRequirements, useRequirements, tickActions, reachLimitActions, interactActions, placeActions, breakActions, addWaterActions, fullWaterActions, maxFertilizerActions); } @Override @@ -268,6 +278,12 @@ public class PotConfigImpl implements PotConfig { return this; } + @Override + public Builder vanillaFarmland(boolean vanillaFarmland) { + this.vanillaFarmland = vanillaFarmland; + return this; + } + @Override public Builder isRainDropAccepted(boolean isRainDropAccepted) { this.isRainDropAccepted = isRainDropAccepted; diff --git a/plugin/src/main/java/net/momirealms/customcrops/bukkit/config/ConfigType.java b/plugin/src/main/java/net/momirealms/customcrops/bukkit/config/ConfigType.java index 131fca3..7e98e3c 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/bukkit/config/ConfigType.java +++ b/plugin/src/main/java/net/momirealms/customcrops/bukkit/config/ConfigType.java @@ -115,6 +115,7 @@ public class ConfigType { PotConfig config = PotConfig.builder() .id(id) + .vanillaFarmland(section.getBoolean("vanilla-farmland", false)) .storage(section.getInt("storage", 5)) .isRainDropAccepted(section.getBoolean("absorb-rainwater", false)) .isNearbyWaterAccepted(section.getBoolean("absorb-nearby-water", false)) 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 fbec063..4c35bd7 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 @@ -201,8 +201,8 @@ public class BukkitItemManager extends AbstractItemManager { @Override public void placeBlock(@NotNull Location location, @NotNull String id) { - if (StringUtils.isCapitalLetter(id)) { - location.getWorld().getBlockAt(location).setType(Material.valueOf(id), false); + if (id.startsWith("minecraft:")) { + location.getWorld().getBlockAt(location).setBlockData(Bukkit.createBlockData(id), false); } else { this.provider.placeCustomBlock(location, id); }