From 8716b3022e80f25e221a2bbe215b5738bb7e046c Mon Sep 17 00:00:00 2001 From: XiaoMoMi <972454774@qq.com> Date: Sun, 5 May 2024 02:33:39 +0800 Subject: [PATCH] [Fix?] --- .../customcrops/api/CustomCropsPlugin.java | 1 - .../api/manager/ConfigManager.java | 35 ++- .../item/custom/AbstractCustomListener.java | 18 +- .../api/mechanic/world/SimpleLocation.java | 1 - .../world/level/CustomCropsChunk.java | 7 + .../world/level/CustomCropsWorld.java | 2 + .../mechanic/world/level/WorldInfoData.java | 1 - build.gradle.kts | 2 +- .../customcrops/CustomCropsPluginImpl.java | 2 +- .../manager/ConfigManagerImpl.java | 33 ++- .../mechanic/action/ActionManagerImpl.java | 2 +- .../condition/ConditionManagerImpl.java | 18 +- .../mechanic/item/ItemManagerImpl.java | 10 +- .../custom/crucible/CrucibleListener.java | 105 ++++---- .../custom/crucible/CrucibleProvider.java | 248 +++++++++--------- .../custom/itemsadder/ItemsAdderListener.java | 2 +- .../custom/itemsadder/ItemsAdderProvider.java | 2 +- .../item/custom/oraxen/OraxenListener.java | 2 +- .../item/custom/oraxen/OraxenProvider.java | 2 +- .../customcrops/mechanic/world/CChunk.java | 12 + .../customcrops/mechanic/world/CWorld.java | 10 +- .../mechanic/world/block/MemoryPot.java | 1 - plugin/src/main/resources/config.yml | 7 +- 23 files changed, 299 insertions(+), 224 deletions(-) diff --git a/api/src/main/java/net/momirealms/customcrops/api/CustomCropsPlugin.java b/api/src/main/java/net/momirealms/customcrops/api/CustomCropsPlugin.java index b772c49..042c746 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/CustomCropsPlugin.java +++ b/api/src/main/java/net/momirealms/customcrops/api/CustomCropsPlugin.java @@ -18,7 +18,6 @@ package net.momirealms.customcrops.api; import net.momirealms.customcrops.api.manager.*; -import net.momirealms.customcrops.api.mechanic.world.season.Season; import net.momirealms.customcrops.api.scheduler.Scheduler; import org.bukkit.plugin.java.JavaPlugin; diff --git a/api/src/main/java/net/momirealms/customcrops/api/manager/ConfigManager.java b/api/src/main/java/net/momirealms/customcrops/api/manager/ConfigManager.java index 9d21173..7820679 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/manager/ConfigManager.java +++ b/api/src/main/java/net/momirealms/customcrops/api/manager/ConfigManager.java @@ -18,6 +18,7 @@ package net.momirealms.customcrops.api.manager; import net.momirealms.customcrops.api.common.Reloadable; +import net.momirealms.customcrops.api.mechanic.item.ItemCarrier; import org.bukkit.World; public abstract class ConfigManager implements Reloadable { @@ -120,21 +121,33 @@ public abstract class ConfigManager implements Reloadable { return instance.isConvertWorldOnLoad(); } - protected abstract boolean isConvertWorldOnLoad(); + public static boolean scarecrowProtectChunk() { + return instance.doesScarecrowProtectChunk(); + } - protected abstract double[] getDefaultQualityRatio(); + public static ItemCarrier scarecrowItemCarrier() { + return instance.getScarecrowItemCarrier(); + } - protected abstract String getLang(); + public static ItemCarrier glassItemCarrier() { + return instance.getGlassItemCarrier(); + } - protected abstract boolean getDebugMode(); + public abstract boolean isConvertWorldOnLoad(); - protected abstract boolean hasLegacyColorSupport(); + public abstract double[] getDefaultQualityRatio(); - protected abstract int getMaximumPoolSize(); + public abstract String getLang(); - protected abstract int getKeepAliveTime(); + public abstract boolean getDebugMode(); - protected abstract int getCorePoolSize(); + public abstract boolean hasLegacyColorSupport(); + + public abstract int getMaximumPoolSize(); + + public abstract int getKeepAliveTime(); + + public abstract int getCorePoolSize(); public abstract boolean isProtectLore(); @@ -162,5 +175,11 @@ public abstract class ConfigManager implements Reloadable { public abstract boolean isSyncSeasons(); + public abstract boolean doesScarecrowProtectChunk(); + + public abstract ItemCarrier getScarecrowItemCarrier(); + + public abstract ItemCarrier getGlassItemCarrier(); + public abstract World getReferenceWorld(); } diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/custom/AbstractCustomListener.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/custom/AbstractCustomListener.java index fdb531b..f39f7c4 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/custom/AbstractCustomListener.java +++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/custom/AbstractCustomListener.java @@ -25,8 +25,11 @@ import net.momirealms.customcrops.api.manager.VersionManager; import net.momirealms.customcrops.api.manager.WorldManager; import net.momirealms.customcrops.api.mechanic.item.*; import net.momirealms.customcrops.api.mechanic.requirement.State; +import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock; import net.momirealms.customcrops.api.mechanic.world.SimpleLocation; import net.momirealms.customcrops.api.mechanic.world.level.WorldCrop; +import net.momirealms.customcrops.api.mechanic.world.level.WorldGlass; +import net.momirealms.customcrops.api.mechanic.world.level.WorldPot; import net.momirealms.customcrops.api.util.EventUtils; import org.bukkit.Location; import org.bukkit.Material; @@ -113,7 +116,7 @@ public abstract class AbstractCustomListener implements Listener { ); } - @EventHandler (ignoreCancelled = false) + @EventHandler public void onInteractAir(PlayerInteractEvent event) { if (event.getHand() != EquipmentSlot.HAND) return; @@ -146,10 +149,15 @@ public abstract class AbstractCustomListener implements Listener { @EventHandler (ignoreCancelled = true) public void onPlaceBlock(BlockPlaceEvent event) { final Block block = event.getBlock(); - // prevent players from placing blocks on entities (crops/sprinklers) - if (CustomCropsPlugin.get().getWorldManager().getBlockAt(SimpleLocation.of(block.getLocation())).isPresent()) { - event.setCancelled(true); - return; + final Location location = block.getLocation(); + Optional customCropsBlock = CustomCropsPlugin.get().getWorldManager().getBlockAt(SimpleLocation.of(location)); + if (customCropsBlock.isPresent()) { + if (customCropsBlock.get() instanceof WorldPot || customCropsBlock.get() instanceof WorldGlass) { + CustomCropsPlugin.get().getWorldManager().removeAnythingAt(SimpleLocation.of(location)); + } else { + event.setCancelled(true); + return; + } } this.onPlaceBlock( event.getPlayer(), diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/SimpleLocation.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/SimpleLocation.java index 0fc9ade..6d48a72 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/SimpleLocation.java +++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/SimpleLocation.java @@ -98,7 +98,6 @@ public class SimpleLocation { return hash; } - @Nullable public Location getBukkitLocation() { World world = Bukkit.getWorld(worldName); if (world == null) return null; diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/CustomCropsChunk.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/CustomCropsChunk.java index 93b7457..97a4e9b 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/CustomCropsChunk.java +++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/CustomCropsChunk.java @@ -308,6 +308,13 @@ public interface CustomCropsChunk { */ void addScarecrowAt(WorldScarecrow scarecrow, SimpleLocation location); + /** + * If this chunk has scarecrow + * + * @return has or not + */ + boolean hasScarecrow(); + /** * Get CustomCrops sections * diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/CustomCropsWorld.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/CustomCropsWorld.java index b22bce5..25e1804 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/CustomCropsWorld.java +++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/CustomCropsWorld.java @@ -344,6 +344,8 @@ public interface CustomCropsWorld { @Nullable CustomCropsBlock removeAnythingAt(SimpleLocation location); + boolean doesChunkHaveScarecrow(SimpleLocation location); + /** * If the amount of pot reaches the limitation * diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/WorldInfoData.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/WorldInfoData.java index 15a828c..51c97e1 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/WorldInfoData.java +++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/WorldInfoData.java @@ -18,7 +18,6 @@ package net.momirealms.customcrops.api.mechanic.world.level; import com.google.gson.annotations.SerializedName; -import net.momirealms.customcrops.api.manager.ConfigManager; import net.momirealms.customcrops.api.mechanic.world.season.Season; public class WorldInfoData { diff --git a/build.gradle.kts b/build.gradle.kts index c64a749..d581e36 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,7 @@ plugins { allprojects { project.group = "net.momirealms" - project.version = "3.4.7-BETA" + project.version = "3.4.7" apply() apply(plugin = "java") diff --git a/plugin/src/main/java/net/momirealms/customcrops/CustomCropsPluginImpl.java b/plugin/src/main/java/net/momirealms/customcrops/CustomCropsPluginImpl.java index 4498e00..ab2438e 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/CustomCropsPluginImpl.java +++ b/plugin/src/main/java/net/momirealms/customcrops/CustomCropsPluginImpl.java @@ -24,6 +24,7 @@ import net.momirealms.customcrops.api.CustomCropsPlugin; import net.momirealms.customcrops.api.event.CustomCropsReloadEvent; import net.momirealms.customcrops.api.manager.ConfigManager; import net.momirealms.customcrops.api.manager.CoolDownManager; +import net.momirealms.customcrops.api.util.EventUtils; import net.momirealms.customcrops.api.util.LogUtils; import net.momirealms.customcrops.compatibility.IntegrationManagerImpl; import net.momirealms.customcrops.libraries.classpath.ReflectionClassPathAppender; @@ -38,7 +39,6 @@ import net.momirealms.customcrops.mechanic.misc.migrator.Migration; import net.momirealms.customcrops.mechanic.requirement.RequirementManagerImpl; import net.momirealms.customcrops.mechanic.world.WorldManagerImpl; import net.momirealms.customcrops.scheduler.SchedulerImpl; -import net.momirealms.customcrops.api.util.EventUtils; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; diff --git a/plugin/src/main/java/net/momirealms/customcrops/manager/ConfigManagerImpl.java b/plugin/src/main/java/net/momirealms/customcrops/manager/ConfigManagerImpl.java index 88ee65a..af6e785 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/manager/ConfigManagerImpl.java +++ b/plugin/src/main/java/net/momirealms/customcrops/manager/ConfigManagerImpl.java @@ -25,6 +25,7 @@ import dev.dejvokep.boostedyaml.settings.loader.LoaderSettings; import dev.dejvokep.boostedyaml.settings.updater.UpdaterSettings; import net.momirealms.customcrops.api.CustomCropsPlugin; import net.momirealms.customcrops.api.manager.ConfigManager; +import net.momirealms.customcrops.api.mechanic.item.ItemCarrier; import net.momirealms.customcrops.api.util.LogUtils; import net.momirealms.customcrops.util.ConfigUtils; import org.bukkit.Bukkit; @@ -35,12 +36,13 @@ import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; import java.io.IOException; import java.lang.ref.WeakReference; +import java.util.Locale; import java.util.Objects; public class ConfigManagerImpl extends ConfigManager { - public static final String configVersion = "36"; - private CustomCropsPlugin plugin; + public static final String configVersion = "37"; + private final CustomCropsPlugin plugin; private String lang; private int maximumPoolSize; private int corePoolSize; @@ -63,6 +65,9 @@ public class ConfigManagerImpl extends ConfigManager { private boolean syncSeasons; private WeakReference referenceWorld; private boolean convertWorldOnLoad; + private boolean scarecrowProtectChunk; + private ItemCarrier scarecrowItemType; + private ItemCarrier glassItemType; public ConfigManagerImpl(CustomCropsPlugin plugin) { this.plugin = plugin; @@ -126,10 +131,13 @@ public class ConfigManagerImpl extends ConfigManager { greenhouse = mechanics.getBoolean("greenhouse.enable", true); greenhouseID = mechanics.getString("greenhouse.id"); greenhouseRange = mechanics.getInt("greenhouse.range", 5); + glassItemType = ItemCarrier.valueOf(mechanics.getString("greenhouse.type", "CHORUS").toUpperCase(Locale.ENGLISH)); scarecrow = mechanics.getBoolean("scarecrow.enable", true); scarecrowID = mechanics.getString("scarecrow.id"); scarecrowRange = mechanics.getInt("scarecrow.range", 7); + scarecrowProtectChunk = mechanics.getBoolean("scarecrow.protect-chunk", false); + scarecrowItemType = ItemCarrier.valueOf(mechanics.getString("scarecrow.type", "ITEM_FRAME").toUpperCase(Locale.ENGLISH)); syncSeasons = mechanics.getBoolean("sync-season.enable", true); if (syncSeasons) { @@ -163,17 +171,17 @@ public class ConfigManagerImpl extends ConfigManager { } @Override - protected boolean isConvertWorldOnLoad() { + public boolean isConvertWorldOnLoad() { return convertWorldOnLoad; } @Override - protected double[] getDefaultQualityRatio() { + public double[] getDefaultQualityRatio() { return defaultQualityRatio; } @Override - protected String getLang() { + public String getLang() { return lang; } @@ -247,6 +255,21 @@ public class ConfigManagerImpl extends ConfigManager { return syncSeasons; } + @Override + public boolean doesScarecrowProtectChunk() { + return scarecrowProtectChunk; + } + + @Override + public ItemCarrier getScarecrowItemCarrier() { + return scarecrowItemType; + } + + @Override + public ItemCarrier getGlassItemCarrier() { + return glassItemType; + } + @Override public World getReferenceWorld() { return referenceWorld.get(); diff --git a/plugin/src/main/java/net/momirealms/customcrops/mechanic/action/ActionManagerImpl.java b/plugin/src/main/java/net/momirealms/customcrops/mechanic/action/ActionManagerImpl.java index 6bdb473..0ac242c 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/mechanic/action/ActionManagerImpl.java +++ b/plugin/src/main/java/net/momirealms/customcrops/mechanic/action/ActionManagerImpl.java @@ -48,6 +48,7 @@ import net.momirealms.customcrops.api.mechanic.world.level.WorldCrop; import net.momirealms.customcrops.api.mechanic.world.level.WorldPot; import net.momirealms.customcrops.api.mechanic.world.level.WorldSprinkler; import net.momirealms.customcrops.api.scheduler.CancellableTask; +import net.momirealms.customcrops.api.util.EventUtils; import net.momirealms.customcrops.api.util.LogUtils; import net.momirealms.customcrops.compatibility.VaultHook; import net.momirealms.customcrops.manager.AdventureManagerImpl; @@ -58,7 +59,6 @@ import net.momirealms.customcrops.mechanic.misc.TempFakeItem; import net.momirealms.customcrops.mechanic.world.block.MemoryCrop; import net.momirealms.customcrops.util.ClassUtils; import net.momirealms.customcrops.util.ConfigUtils; -import net.momirealms.customcrops.api.util.EventUtils; import net.momirealms.customcrops.util.ItemUtils; import org.bukkit.*; import org.bukkit.block.BlockFace; diff --git a/plugin/src/main/java/net/momirealms/customcrops/mechanic/condition/ConditionManagerImpl.java b/plugin/src/main/java/net/momirealms/customcrops/mechanic/condition/ConditionManagerImpl.java index 597c8c0..feb1f74 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/mechanic/condition/ConditionManagerImpl.java +++ b/plugin/src/main/java/net/momirealms/customcrops/mechanic/condition/ConditionManagerImpl.java @@ -168,18 +168,24 @@ public class ConditionManagerImpl implements ConditionManager { if (Math.random() > chance) return false; SimpleLocation location = block.getLocation(); if (ConfigManager.enableScarecrow()) { - int range = ConfigManager.scarecrowRange(); Optional world = plugin.getWorldManager().getCustomCropsWorld(location.getWorldName()); if (world.isEmpty()) return false; CustomCropsWorld customCropsWorld = world.get(); - for (int i = -range; i <= range; i++) { - for (int j = -range; j <= range; j++) { - for (int k : new int[]{0,-1,1}) { - if (customCropsWorld.getScarecrowAt(location.copy().add(i, k, j)).isPresent()) { - return false; + if (!ConfigManager.scarecrowProtectChunk()) { + int range = ConfigManager.scarecrowRange(); + for (int i = -range; i <= range; i++) { + for (int j = -range; j <= range; j++) { + for (int k : new int[]{0,-1,1}) { + if (customCropsWorld.getScarecrowAt(location.copy().add(i, k, j)).isPresent()) { + return false; + } } } } + } else { + if (customCropsWorld.doesChunkHaveScarecrow(location)) { + return false; + } } } if (!offline) diff --git a/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/ItemManagerImpl.java b/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/ItemManagerImpl.java index e6b72de..06372e6 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/ItemManagerImpl.java +++ b/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/ItemManagerImpl.java @@ -29,6 +29,7 @@ import net.momirealms.customcrops.api.mechanic.action.ActionTrigger; import net.momirealms.customcrops.api.mechanic.condition.Conditions; import net.momirealms.customcrops.api.mechanic.condition.DeathConditions; import net.momirealms.customcrops.api.mechanic.item.*; +import net.momirealms.customcrops.api.mechanic.item.custom.AbstractCustomListener; import net.momirealms.customcrops.api.mechanic.item.custom.CustomProvider; import net.momirealms.customcrops.api.mechanic.item.water.PassiveFillMethod; import net.momirealms.customcrops.api.mechanic.item.water.PositiveFillMethod; @@ -39,11 +40,9 @@ import net.momirealms.customcrops.api.mechanic.requirement.State; import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock; import net.momirealms.customcrops.api.mechanic.world.SimpleLocation; import net.momirealms.customcrops.api.mechanic.world.level.*; +import net.momirealms.customcrops.api.util.EventUtils; import net.momirealms.customcrops.api.util.LocationUtils; import net.momirealms.customcrops.api.util.LogUtils; -import net.momirealms.customcrops.api.mechanic.item.custom.AbstractCustomListener; -import net.momirealms.customcrops.mechanic.item.custom.crucible.CrucibleListener; -import net.momirealms.customcrops.mechanic.item.custom.crucible.CrucibleProvider; import net.momirealms.customcrops.mechanic.item.custom.itemsadder.ItemsAdderListener; import net.momirealms.customcrops.mechanic.item.custom.itemsadder.ItemsAdderProvider; import net.momirealms.customcrops.mechanic.item.custom.oraxen.OraxenListener; @@ -61,7 +60,6 @@ import net.momirealms.customcrops.mechanic.item.impl.WateringCanConfig; import net.momirealms.customcrops.mechanic.item.impl.fertilizer.*; import net.momirealms.customcrops.mechanic.world.block.*; import net.momirealms.customcrops.util.ConfigUtils; -import net.momirealms.customcrops.api.util.EventUtils; import net.momirealms.customcrops.util.ItemUtils; import net.momirealms.customcrops.util.RotationUtils; import org.bukkit.*; @@ -140,8 +138,8 @@ public class ItemManagerImpl implements ItemManager { listener = new ItemsAdderListener(this); customProvider = new ItemsAdderProvider(); } else if (Bukkit.getPluginManager().getPlugin("MythicCrucible") != null) { - listener = new CrucibleListener(this); - customProvider = new CrucibleProvider(); +// listener = new CrucibleListener(this); +// customProvider = new CrucibleProvider(); } else { LogUtils.severe("======================================================"); LogUtils.severe(" Please install ItemsAdder or Oraxen as dependency."); diff --git a/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/crucible/CrucibleListener.java b/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/crucible/CrucibleListener.java index 9ffe1c4..5f6020d 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/crucible/CrucibleListener.java +++ b/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/crucible/CrucibleListener.java @@ -1,56 +1,49 @@ -/* - * 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.mechanic.item.custom.crucible; - -import io.lumine.mythiccrucible.events.MythicFurniturePlaceEvent; -import net.momirealms.customcrops.mechanic.item.ItemManagerImpl; -import net.momirealms.customcrops.api.mechanic.item.custom.AbstractCustomListener; -import org.bukkit.event.EventHandler; - -public class CrucibleListener extends AbstractCustomListener { - - public CrucibleListener(ItemManagerImpl itemManager) { - super(itemManager); - } - - @EventHandler (ignoreCancelled = true) - public void onBreakCustomBlock() { - } - - @EventHandler (ignoreCancelled = true) - public void onPlaceCustomBlock() { - } - - @EventHandler (ignoreCancelled = true) - public void onPlaceFurniture(MythicFurniturePlaceEvent event) { - super.onPlaceFurniture( - event.getPlayer(), - event.getBlock().getLocation(), - event.getFurnitureItemContext().getItem().getInternalName(), - event - ); - } - - @EventHandler (ignoreCancelled = true) - public void onBreakFurniture() { - } - - @EventHandler (ignoreCancelled = true) - public void onInteractFurniture() { - } -} +///* +// * 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.mechanic.item.custom.crucible; +// +//import net.momirealms.customcrops.mechanic.item.ItemManagerImpl; +//import net.momirealms.customcrops.api.mechanic.item.custom.AbstractCustomListener; +//import org.bukkit.event.EventHandler; +// +//public class CrucibleListener extends AbstractCustomListener { +// +// public CrucibleListener(ItemManagerImpl itemManager) { +// super(itemManager); +// } +// +// @EventHandler (ignoreCancelled = true) +// public void onBreakCustomBlock() { +// } +// +// @EventHandler (ignoreCancelled = true) +// public void onPlaceCustomBlock() { +// } +// +// @EventHandler (ignoreCancelled = true) +// public void onPlaceFurniture() { +// } +// +// @EventHandler (ignoreCancelled = true) +// public void onBreakFurniture() { +// } +// +// @EventHandler (ignoreCancelled = true) +// public void onInteractFurniture() { +// } +//} diff --git a/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/crucible/CrucibleProvider.java b/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/crucible/CrucibleProvider.java index b2af7f8..af4d7db 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/crucible/CrucibleProvider.java +++ b/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/crucible/CrucibleProvider.java @@ -1,124 +1,124 @@ -/* - * 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.mechanic.item.custom.crucible; - -import io.lumine.mythic.bukkit.BukkitAdapter; -import io.lumine.mythic.bukkit.adapters.BukkitEntity; -import io.lumine.mythiccrucible.MythicCrucible; -import io.lumine.mythiccrucible.items.CrucibleItem; -import io.lumine.mythiccrucible.items.ItemManager; -import io.lumine.mythiccrucible.items.blocks.CustomBlockItemContext; -import io.lumine.mythiccrucible.items.blocks.CustomBlockManager; -import io.lumine.mythiccrucible.items.furniture.Furniture; -import io.lumine.mythiccrucible.items.furniture.FurnitureManager; -import net.momirealms.customcrops.api.util.LogUtils; -import net.momirealms.customcrops.api.mechanic.item.custom.CustomProvider; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.entity.Entity; -import org.bukkit.inventory.ItemStack; - -import java.util.Optional; - -public class CrucibleProvider implements CustomProvider { - - private final ItemManager itemManager; - private final CustomBlockManager blockManager; - private final FurnitureManager furnitureManager; - - public CrucibleProvider() { - this.itemManager = MythicCrucible.inst().getItemManager(); - this.blockManager = itemManager.getCustomBlockManager(); - this.furnitureManager = itemManager.getFurnitureManager(); - } - - @Override - public boolean removeBlock(Location location) { - Block block = location.getBlock(); - if (block.getType() == Material.AIR) { - return false; - } - Optional optional = blockManager.getBlockFromBlock(block); - if (optional.isPresent()) { - optional.get().remove(block, null, false); - } else { - block.setType(Material.AIR); - } - return true; - } - - @Override - public void placeCustomBlock(Location location, String id) { - Optional optionalCI = itemManager.getItem(id); - if (optionalCI.isPresent()) { - location.getBlock().setBlockData(optionalCI.get().getBlockData().getBlockData()); - } else { - LogUtils.warn("Custom block(" + id +") doesn't exist in Crucible configs. Please double check if that block exists."); - } - } - - @Override - public Entity placeFurniture(Location location, String id) { - Optional optionalCI = itemManager.getItem(id); - if (optionalCI.isPresent()) { - return optionalCI.get().getFurnitureData().placeFrame(location.getBlock(), BlockFace.UP, 0f, null); - } else { - LogUtils.warn("Furniture(" + id +") doesn't exist in Crucible configs. Please double check if that furniture exists."); - return null; - } - } - - @Override - public void removeFurniture(Entity entity) { - Optional optional = furnitureManager.getFurniture(entity.getUniqueId()); - optional.ifPresent(furniture -> furniture.getFurnitureData().remove(furniture, null, false, false)); - } - - @Override - public String getBlockID(Block block) { - Optional optionalCB = blockManager.getBlockFromBlock(block); - return optionalCB.map(customBlockItemContext -> customBlockItemContext.getCrucibleItem().getInternalName()).orElse(block.getType().name()); - } - - @Override - public String getItemID(ItemStack itemStack) { - return itemManager.getItem(itemStack).map(CrucibleItem::getInternalName).orElse(null); - } - - @Override - public ItemStack getItemStack(String id) { - Optional optionalCI = itemManager.getItem(id); - return optionalCI.map(crucibleItem -> BukkitAdapter.adapt(crucibleItem.getMythicItem().generateItemStack(1))).orElse(null); - } - - @Override - public String getEntityID(Entity entity) { - Optional optionalCI = furnitureManager.getItemFromEntity(entity); - if (optionalCI.isPresent()) { - return optionalCI.get().getInternalName(); - } - return entity.getType().name(); - } - - @Override - public boolean isFurniture(Entity entity) { - return furnitureManager.isFurniture(new BukkitEntity(entity)); - } -} +///* +// * 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.mechanic.item.custom.crucible; +// +//import io.lumine.mythic.bukkit.BukkitAdapter; +//import io.lumine.mythic.bukkit.adapters.BukkitEntity; +//import io.lumine.mythiccrucible.MythicCrucible; +//import io.lumine.mythiccrucible.items.CrucibleItem; +//import io.lumine.mythiccrucible.items.ItemManager; +//import io.lumine.mythiccrucible.items.blocks.CustomBlockItemContext; +//import io.lumine.mythiccrucible.items.blocks.CustomBlockManager; +//import io.lumine.mythiccrucible.items.furniture.Furniture; +//import io.lumine.mythiccrucible.items.furniture.FurnitureManager; +//import net.momirealms.customcrops.api.util.LogUtils; +//import net.momirealms.customcrops.api.mechanic.item.custom.CustomProvider; +//import org.bukkit.Location; +//import org.bukkit.Material; +//import org.bukkit.block.Block; +//import org.bukkit.block.BlockFace; +//import org.bukkit.entity.Entity; +//import org.bukkit.inventory.ItemStack; +// +//import java.util.Optional; +// +//public class CrucibleProvider implements CustomProvider { +// +// private final ItemManager itemManager; +// private final CustomBlockManager blockManager; +// private final FurnitureManager furnitureManager; +// +// public CrucibleProvider() { +// this.itemManager = MythicCrucible.inst().getItemManager(); +// this.blockManager = itemManager.getCustomBlockManager(); +// this.furnitureManager = itemManager.getFurnitureManager(); +// } +// +// @Override +// public boolean removeBlock(Location location) { +// Block block = location.getBlock(); +// if (block.getType() == Material.AIR) { +// return false; +// } +// Optional optional = blockManager.getBlockFromBlock(block); +// if (optional.isPresent()) { +// optional.get().remove(block, null, false); +// } else { +// block.setType(Material.AIR); +// } +// return true; +// } +// +// @Override +// public void placeCustomBlock(Location location, String id) { +// Optional optionalCI = itemManager.getItem(id); +// if (optionalCI.isPresent()) { +// location.getBlock().setBlockData(optionalCI.get().getBlockData().getBlockData()); +// } else { +// LogUtils.warn("Custom block(" + id +") doesn't exist in Crucible configs. Please double check if that block exists."); +// } +// } +// +// @Override +// public Entity placeFurniture(Location location, String id) { +// Optional optionalCI = itemManager.getItem(id); +// if (optionalCI.isPresent()) { +// return optionalCI.get().getFurnitureData().placeFrame(location.getBlock(), BlockFace.UP, 0f, null); +// } else { +// LogUtils.warn("Furniture(" + id +") doesn't exist in Crucible configs. Please double check if that furniture exists."); +// return null; +// } +// } +// +// @Override +// public void removeFurniture(Entity entity) { +// Optional optional = furnitureManager.getFurniture(entity.getUniqueId()); +// optional.ifPresent(furniture -> furniture.getFurnitureData().remove(furniture, null, false, false)); +// } +// +// @Override +// public String getBlockID(Block block) { +// Optional optionalCB = blockManager.getBlockFromBlock(block); +// return optionalCB.map(customBlockItemContext -> customBlockItemContext.getCrucibleItem().getInternalName()).orElse(block.getType().name()); +// } +// +// @Override +// public String getItemID(ItemStack itemStack) { +// return itemManager.getItem(itemStack).map(CrucibleItem::getInternalName).orElse(null); +// } +// +// @Override +// public ItemStack getItemStack(String id) { +// Optional optionalCI = itemManager.getItem(id); +// return optionalCI.map(crucibleItem -> BukkitAdapter.adapt(crucibleItem.getMythicItem().generateItemStack(1))).orElse(null); +// } +// +// @Override +// public String getEntityID(Entity entity) { +// Optional optionalCI = furnitureManager.getItemFromEntity(entity); +// if (optionalCI.isPresent()) { +// return optionalCI.get().getInternalName(); +// } +// return entity.getType().name(); +// } +// +// @Override +// public boolean isFurniture(Entity entity) { +// return furnitureManager.isFurniture(new BukkitEntity(entity)); +// } +//} diff --git a/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/itemsadder/ItemsAdderListener.java b/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/itemsadder/ItemsAdderListener.java index 6d45093..86040ff 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/itemsadder/ItemsAdderListener.java +++ b/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/itemsadder/ItemsAdderListener.java @@ -19,8 +19,8 @@ package net.momirealms.customcrops.mechanic.item.custom.itemsadder; import dev.lone.itemsadder.api.CustomFurniture; import dev.lone.itemsadder.api.Events.*; -import net.momirealms.customcrops.mechanic.item.ItemManagerImpl; import net.momirealms.customcrops.api.mechanic.item.custom.AbstractCustomListener; +import net.momirealms.customcrops.mechanic.item.ItemManagerImpl; import org.bukkit.entity.Entity; import org.bukkit.event.EventHandler; diff --git a/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/itemsadder/ItemsAdderProvider.java b/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/itemsadder/ItemsAdderProvider.java index 4e558c6..9177338 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/itemsadder/ItemsAdderProvider.java +++ b/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/itemsadder/ItemsAdderProvider.java @@ -20,8 +20,8 @@ package net.momirealms.customcrops.mechanic.item.custom.itemsadder; import dev.lone.itemsadder.api.CustomBlock; import dev.lone.itemsadder.api.CustomFurniture; import dev.lone.itemsadder.api.CustomStack; -import net.momirealms.customcrops.api.util.LogUtils; import net.momirealms.customcrops.api.mechanic.item.custom.CustomProvider; +import net.momirealms.customcrops.api.util.LogUtils; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; diff --git a/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/oraxen/OraxenListener.java b/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/oraxen/OraxenListener.java index 52a62bf..272475b 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/oraxen/OraxenListener.java +++ b/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/oraxen/OraxenListener.java @@ -24,9 +24,9 @@ import io.th0rgal.oraxen.api.events.custom_block.stringblock.OraxenStringBlockPl import io.th0rgal.oraxen.api.events.furniture.OraxenFurnitureBreakEvent; import io.th0rgal.oraxen.api.events.furniture.OraxenFurnitureInteractEvent; import io.th0rgal.oraxen.api.events.furniture.OraxenFurniturePlaceEvent; +import net.momirealms.customcrops.api.mechanic.item.custom.AbstractCustomListener; import net.momirealms.customcrops.api.util.LocationUtils; import net.momirealms.customcrops.mechanic.item.ItemManagerImpl; -import net.momirealms.customcrops.api.mechanic.item.custom.AbstractCustomListener; import org.bukkit.event.EventHandler; public class OraxenListener extends AbstractCustomListener { diff --git a/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/oraxen/OraxenProvider.java b/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/oraxen/OraxenProvider.java index 1ca1597..c0b52ec 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/oraxen/OraxenProvider.java +++ b/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/oraxen/OraxenProvider.java @@ -23,8 +23,8 @@ import io.th0rgal.oraxen.api.OraxenItems; import io.th0rgal.oraxen.items.ItemBuilder; import io.th0rgal.oraxen.mechanics.Mechanic; import io.th0rgal.oraxen.mechanics.provided.gameplay.furniture.FurnitureMechanic; -import net.momirealms.customcrops.api.util.LogUtils; import net.momirealms.customcrops.api.mechanic.item.custom.CustomProvider; +import net.momirealms.customcrops.api.util.LogUtils; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Rotation; diff --git a/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/CChunk.java b/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/CChunk.java index b74f1c3..c05bb4d 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/CChunk.java +++ b/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/CChunk.java @@ -553,6 +553,18 @@ public class CChunk implements CustomCropsChunk { return amount; } + @Override + public boolean hasScarecrow() { + for (CustomCropsSection section : getSections()) { + for (CustomCropsBlock block : section.getBlocks()) { + if (block instanceof WorldScarecrow) { + return true; + } + } + } + return false; + } + public CSection[] getSectionsForSerialization() { ArrayList sections = new ArrayList<>(); for (Map.Entry entry : loadedSections.entrySet()) { diff --git a/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/CWorld.java b/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/CWorld.java index 02da2d0..04dbc52 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/CWorld.java +++ b/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/CWorld.java @@ -35,8 +35,8 @@ import net.momirealms.customcrops.api.mechanic.world.level.*; import net.momirealms.customcrops.api.mechanic.world.season.Season; import net.momirealms.customcrops.api.scheduler.CancellableTask; import net.momirealms.customcrops.api.scheduler.Scheduler; -import net.momirealms.customcrops.api.util.LogUtils; import net.momirealms.customcrops.api.util.EventUtils; +import net.momirealms.customcrops.api.util.LogUtils; import org.bukkit.Bukkit; import org.bukkit.World; import org.jetbrains.annotations.NotNull; @@ -525,7 +525,7 @@ public class CWorld implements CustomCropsWorld { if (chunk != null) { return chunk; } - // is a loaded chunk, but it doesn't have customcrops data + // is a loaded chunk, but it doesn't have CustomCrops data if (bukkitWorld.isChunkLoaded(chunkPos.x(), chunkPos.z())) { chunk = new CChunk(this, chunkPos); loadChunk(chunk); @@ -535,6 +535,12 @@ public class CWorld implements CustomCropsWorld { } } + @Override + public boolean doesChunkHaveScarecrow(SimpleLocation location) { + Optional chunk = getLoadedChunkAt(location.getChunkPos()); + return chunk.map(CustomCropsChunk::hasScarecrow).orElse(false); + } + @Override public boolean isPotReachLimit(SimpleLocation location) { Optional chunk = getLoadedChunkAt(location.getChunkPos()); diff --git a/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/block/MemoryPot.java b/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/block/MemoryPot.java index f7e35c7..0fdac86 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/block/MemoryPot.java +++ b/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/block/MemoryPot.java @@ -27,7 +27,6 @@ import net.momirealms.customcrops.api.mechanic.item.ItemType; import net.momirealms.customcrops.api.mechanic.item.Pot; import net.momirealms.customcrops.api.mechanic.world.SimpleLocation; import net.momirealms.customcrops.api.mechanic.world.level.AbstractCustomCropsBlock; -import net.momirealms.customcrops.api.mechanic.world.level.CustomCropsChunk; import net.momirealms.customcrops.api.mechanic.world.level.WorldPot; import net.momirealms.customcrops.api.util.LogUtils; import org.bukkit.Location; diff --git a/plugin/src/main/resources/config.yml b/plugin/src/main/resources/config.yml index 0117663..5002e70 100644 --- a/plugin/src/main/resources/config.yml +++ b/plugin/src/main/resources/config.yml @@ -1,5 +1,5 @@ # Don't change -config-version: '36' +config-version: '37' # Debug debug: false @@ -102,12 +102,17 @@ mechanics: scarecrow: enable: true id: '{0}scarecrow' + type: ITEM_FRAME range: 7 + # If this option is enabled, the range above would not longer take effect + # This option would make the scarecrow protect all the crops in a chunk instead of crops in certain range + protect-chunk: false # Greenhouse glass prevents crops from withering from season changing greenhouse: enable: true id: '{0}greenhouse_glass' + type: CHORUS range: 5 # Sync seasons