diff --git a/build.gradle b/build.gradle index ddd44cc..286cdda 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group = 'net.momirealms' -version = '3.2.1' +version = '3.2.2' repositories { mavenCentral() @@ -30,9 +30,9 @@ dependencies { compileOnly ('me.clip:placeholderapi:2.11.3') compileOnly ('com.github.LoneDev6:api-itemsadder:3.4.1-r4') compileOnly ('io.lumine:Mythic-Dist:5.0.3-SNAPSHOT') - compileOnly ('com.willfp:EcoSkills:2.2.6') - compileOnly ('com.willfp:eco:6.53.1') - compileOnly ('com.willfp:EcoJobs:3.2.5') + //compileOnly ('com.willfp:EcoSkills:3.0.0-b2') + compileOnly ('com.willfp:eco:6.60.0') + compileOnly ('com.willfp:EcoJobs:3.13.0') compileOnly ('net.objecthunter:exp4j:0.4.8') compileOnly ('io.lumine:Mythic-Dist:5.2.1') compileOnly fileTree (dir:'libs',includes:['*.jar']) diff --git a/libs/ProtectionLib.jar b/libs/ProtectionLib.jar index 366a676..4a2e9d1 100644 Binary files a/libs/ProtectionLib.jar and b/libs/ProtectionLib.jar differ diff --git a/src/main/java/net/momirealms/customcrops/api/customplugin/Handler.java b/src/main/java/net/momirealms/customcrops/api/customplugin/Handler.java index 4214444..63e52c4 100644 --- a/src/main/java/net/momirealms/customcrops/api/customplugin/Handler.java +++ b/src/main/java/net/momirealms/customcrops/api/customplugin/Handler.java @@ -59,12 +59,12 @@ public abstract class Handler extends Function implements Listener { @EventHandler public void onBreak(BlockBreakEvent event) { - platformManager.onBreakVanilla(event); + platformManager.onBreakVanillaBlock(event); } @EventHandler public void onPlace(BlockPlaceEvent event) { - platformManager.onPlaceVanilla(event); + platformManager.onPlaceVanillaBlock(event); } @EventHandler diff --git a/src/main/java/net/momirealms/customcrops/api/customplugin/PlatformInterface.java b/src/main/java/net/momirealms/customcrops/api/customplugin/PlatformInterface.java index 7f1ea23..f8a0201 100644 --- a/src/main/java/net/momirealms/customcrops/api/customplugin/PlatformInterface.java +++ b/src/main/java/net/momirealms/customcrops/api/customplugin/PlatformInterface.java @@ -34,47 +34,127 @@ import java.util.Collection; public interface PlatformInterface { + /** + * This method is used for removing custom blocks + * @param location location + * @return false if it is not a custom one + */ boolean removeCustomBlock(Location location); + /** + * This method is used for removing any block + * @param location location + * @return false if there's no block + */ default boolean removeAnyBlock(Location location) { - String id = getCustomBlockID(location); - if (id != null) { - return removeCustomBlock(location); - } Block block = location.getBlock(); if (block.getType() == Material.AIR) { return false; - } else { - block.setType(Material.AIR); - return true; } + if (!removeCustomBlock(location)) { + block.setType(Material.AIR); + } + return true; } + default boolean removeAnyBlock(Block block) { + if (block.getType() == Material.AIR) { + return false; + } + if (!removeCustomBlock(block.getLocation())) { + block.setType(Material.AIR); + } + return true; + } + + /** + * Get custom block id at a certain location + * @param location location + * @return block id + */ @Nullable String getCustomBlockID(Location location); + /** + * Get item by id + * @param id id + * @return itemStack + */ @Nullable ItemStack getItemStack(String id); + /** + * Place an item frame at the specified location + * Would remove the entity if it is not item frame + * @param location location + * @param id id + * @return item frame + */ @Nullable ItemFrame placeItemFrame(Location location, String id); + /** + * Place an item display at the specified location + * Would remove the entity if it is not item display + * @param location location + * @param id id + * @return item display + */ @Nullable ItemDisplay placeItemDisplay(Location location, String id); + /** + * Place custom note block at a specified location + * @param location location + * @param id id + */ void placeNoteBlock(Location location, String id); + /** + * Place custom string block at a specified location + * @param location location + * @param id id + */ void placeTripWire(Location location, String id); + /** + * Place custom chorus plant at a specified location + * @param location location + * @param id id + */ + void placeChorus(Location location, String id); + + /** + * Get the block id + * (Examples) + * Vanilla stone -> STONE + * ItemsAdder pot -> customcrops:pot + * Oraxen pot -> pot + * @param block block + * @return id + */ @NotNull String getBlockID(Block block); + /** + * If an item exists in item library + * @param id id + * @return exists or not + */ boolean doesItemExist(String id); + /** + * Drop the block's loot + * @param block block + */ void dropBlockLoot(Block block); - void placeChorus(Location location, String id); - + /** + * Get the custom stuff at a specified location + * It might be a block or an entity + * @param location location + * @return id + */ @NotNull default String getAnyItemIDAt(Location location) { String block = getBlockID(location.getBlock()); @@ -94,14 +174,29 @@ public interface PlatformInterface { return "AIR"; } + /** + * Remove all the custom stuff at a specified location + * @param location location + */ default void removeCustomItemAt(Location location) { removeCustomBlock(location); removeItemFrame(location); } + /** + * Get itemStack's internal id + * @param itemStack itemStack + * @return id + */ @NotNull String getItemStackID(@NotNull ItemStack itemStack); + /** + * Get item display at a specified location + * This method would also remove overlapped entities + * @param location location + * @return id + */ @Nullable default String getItemDisplayIDAt(Location location) { ItemDisplay itemDisplay = getItemDisplayAt(location); @@ -109,6 +204,12 @@ public interface PlatformInterface { return getItemDisplayID(itemDisplay); } + /** + * Get item frame at a specified location + * This method would also remove overlapped entities + * @param location location + * @return id + */ @Nullable default String getItemFrameIDAt(Location location) { ItemFrame itemFrame = getItemFrameAt(location); @@ -116,12 +217,28 @@ public interface PlatformInterface { return getItemFrameID(itemFrame); } + /** + * Get custom furniture's id + * @param itemDisplay itemDisplay + * @return id + */ @Nullable String getItemDisplayID(ItemDisplay itemDisplay); + /** + * Get custom furniture's id + * @param itemFrame itemFrame + * @return id + */ @Nullable String getItemFrameID(ItemFrame itemFrame); + /** + * Get item frame at a specified location + * This method would also remove overlapped entities + * @param location location + * @return id + */ @Nullable default ItemFrame getItemFrameAt(Location location) { Collection itemFrames = location.clone().add(0.5,0.5,0.5).getNearbyEntitiesByType(ItemFrame.class, 0.4, 0.5, 0.4); @@ -137,6 +254,12 @@ public interface PlatformInterface { return null; } + /** + * Get item display at a specified location + * This method would also remove overlapped entities + * @param location location + * @return id + */ @Nullable default ItemDisplay getItemDisplayAt(Location location) { Collection itemDisplays = location.clone().add(0.5,0.25,0.5).getNearbyEntitiesByType(ItemDisplay.class, 0.4, 0.5, 0.4); @@ -152,6 +275,11 @@ public interface PlatformInterface { return null; } + /** + * Remove item frames at a specified location + * @param location location + * @return success or not + */ default boolean removeItemFrame(Location location) { ItemFrame itemFrame = getItemFrameAt(location); if (itemFrame != null) { @@ -162,10 +290,11 @@ public interface PlatformInterface { return false; } - default void removeInteractions(Location location) { - location.clone().add(0.5,0.5,0.5).getNearbyEntitiesByType(Interaction.class, 0.4, 0.5, 0.4).forEach(Entity::remove); - } - + /** + * Remove item display entities at a specified location + * @param location location + * @return success or not + */ default boolean removeItemDisplay(Location location) { ItemDisplay itemDisplay = getItemDisplayAt(location); if (itemDisplay != null) { @@ -176,6 +305,24 @@ public interface PlatformInterface { return false; } + /** + * Remove interaction entities at a specified location + * @param location location + * @return success or not + */ + default boolean removeInteractions(Location location) { + Collection interactions = location.clone().add(0.5,0.5,0.5).getNearbyEntitiesByType(Interaction.class, 0.4, 0.5, 0.4); + for (Interaction interaction : interactions) { + interaction.remove(); + } + return interactions.size() != 0; + } + + /** + * If there's any custom stuff at a specified location + * @param location location + * @return has custom stuff or not + */ default boolean detectAnyThing(Location location) { Block block = location.getBlock(); if (block.getType() != Material.AIR) return true; @@ -183,27 +330,21 @@ public interface PlatformInterface { return entities.size() != 0 || (CustomCrops.getInstance().getVersionHelper().isVersionNewerThan1_19_R3() && detectItemDisplay(location)); } + /** + * If there's any item display entity at a specified location + * @param location location + * @return has item display or not + */ default boolean detectItemDisplay(Location location) { Collection entities = location.clone().add(0.5,0,0.5).getNearbyEntitiesByType(ItemDisplay.class, 0.4, 0.5, 0.4); return entities.size() != 0; } - default boolean removeCustomItem(Location location, ItemMode itemMode) { - if (itemMode == ItemMode.TRIPWIRE || itemMode == ItemMode.CHORUS) - return removeCustomBlock(location); - else if (itemMode == ItemMode.ITEM_FRAME) - return removeItemFrame(location); - else if (itemMode == ItemMode.ITEM_DISPLAY) - return removeItemDisplay(location); - return false; - } - - default void removeAnyThingAt(Location location) { - removeAnyBlock(location); - removeItemFrame(location); - if (CustomCrops.getInstance().getVersionHelper().isVersionNewerThan1_19_R3()) removeItemDisplay(location); - } - + /** + * Place custom stuff according to its mode + * @param location location + * @param itemMode itemMode + */ default void placeCustomItem(Location location, String id, ItemMode itemMode) { if (itemMode == ItemMode.TRIPWIRE) placeTripWire(location, id); @@ -214,4 +355,30 @@ public interface PlatformInterface { else if (itemMode == ItemMode.CHORUS) placeChorus(location, id); } + + /** + * Remove custom stuff according to its mode + * @param location location + * @param itemMode itemMode + * @return success or not + */ + default boolean removeCustomItem(Location location, ItemMode itemMode) { + if (itemMode == ItemMode.TRIPWIRE || itemMode == ItemMode.CHORUS) + return removeCustomBlock(location); + else if (itemMode == ItemMode.ITEM_FRAME) + return removeItemFrame(location); + else if (itemMode == ItemMode.ITEM_DISPLAY) + return removeItemDisplay(location); + return false; + } + + /** + * Remove anything + * @param location location + */ + default void removeAnyThingAt(Location location) { + removeAnyBlock(location); + removeItemFrame(location); + if (CustomCrops.getInstance().getVersionHelper().isVersionNewerThan1_19_R3()) removeItemDisplay(location); + } } diff --git a/src/main/java/net/momirealms/customcrops/api/customplugin/PlatformManager.java b/src/main/java/net/momirealms/customcrops/api/customplugin/PlatformManager.java index 6b0a377..6fae243 100644 --- a/src/main/java/net/momirealms/customcrops/api/customplugin/PlatformManager.java +++ b/src/main/java/net/momirealms/customcrops/api/customplugin/PlatformManager.java @@ -17,7 +17,6 @@ package net.momirealms.customcrops.api.customplugin; -import dev.lone.itemsadder.api.Events.CustomBlockBreakEvent; import net.momirealms.customcrops.CustomCrops; import net.momirealms.customcrops.api.customplugin.itemsadder.ItemsAdderHandler; import net.momirealms.customcrops.api.customplugin.oraxen.OraxenHandler; @@ -87,52 +86,41 @@ public class PlatformManager extends Function { this.handler.unload(); } - public void onBreakVanilla(BlockBreakEvent event) { + public void onPlaceVanillaBlock(BlockPlaceEvent event) { if (event.isCancelled()) return; Block block = event.getBlock(); - if (block.getType() == Material.NOTE_BLOCK) plugin.getWorldDataManager().removeCorrupted(SimpleLocation.getByBukkitLocation(block.getLocation())); - onBreakSomething(event.getPlayer(), block.getLocation(), block.getType().name(), event); + onPlaceVanilla(event.getPlayer(), block.getLocation(), block.getType().name(), event); } - public void onPlaceVanilla(BlockPlaceEvent event) { + public void onBreakVanillaBlock(BlockBreakEvent event) { if (event.isCancelled()) return; Block block = event.getBlock(); - onPlaceSomething(event.getPlayer(), block.getLocation(), block.getType().name(), event); - } - - public void onBreakTripWire(Player player, Block block, String id, Cancellable event) { - if (event.isCancelled()) return; - onBreakSomething(player, block.getLocation(), id, event); - } - - public void onBreakChorus(Player player, Block block, String id, CustomBlockBreakEvent event) { - if (event.isCancelled()) return; - onBreakSomething(player, block.getLocation(), id, event); - } - - public void onBreakNoteBlock(Player player, Block block, String id, Cancellable event) { - if (event.isCancelled()) return; - onBreakSomething(player, block.getLocation(), id, event); - } - - public void onBreakItemDisplay(Player player, Entity entity, String id, Cancellable event) { - if (event.isCancelled()) return; - onBreakSomething(player, entity.getLocation().getBlock().getLocation(), id, event); - } - - public void onBreakItemFrame(Player player, Entity entity, String id, Cancellable event) { - if (event.isCancelled()) return; - onBreakSomething(player, entity.getLocation().getBlock().getLocation(), id, event); + if (block.getType() == Material.NOTE_BLOCK) { + SimpleLocation potLoc = SimpleLocation.getByBukkitLocation(block.getLocation()); + plugin.getWorldDataManager().removeCorrupted(potLoc); + plugin.getWorldDataManager().removePotData(potLoc); + } + onBreakVanilla(event.getPlayer(), block.getLocation(), block.getType().name(), event); } public void onPlaceFurniture(Player player, Location location, String id, Cancellable event) { if (event != null && event.isCancelled()) return; - onPlaceSomething(player, location, id, event); + onPlaceCustom(player, location, id, event); } - public void onPlaceBlock(Player player, Location location, String id, Cancellable event) { + public void onBreakFurniture(Player player, Entity entity, String id, Cancellable event) { if (event.isCancelled()) return; - onPlaceSomething(player, location, id, event); + onBreakCustom(player, entity.getLocation().getBlock().getLocation(), id, event); + } + + public void onPlaceCustomBlock(Player player, Location location, String id, Cancellable event) { + if (event.isCancelled()) return; + onPlaceCustom(player, location, id, event); + } + + public void onBreakCustomBlock(Player player, Location location, String id, Cancellable event) { + if (event.isCancelled()) return; + onBreakCustom(player, location, id, event); } public void onInteractBlock(PlayerInteractEvent event) { @@ -144,6 +132,9 @@ public class PlatformManager extends Function { Block block = event.getClickedBlock(); String id = plugin.getPlatformInterface().getBlockID(block); assert block != null; + if (ConfigManager.enableCorruptionFixer && onInteractBrokenPot(id, block.getLocation())) { + return; + } onInteractSomething(event.getPlayer(), block.getLocation(), id, event.getBlockFace(), event); } } @@ -156,13 +147,10 @@ public class PlatformManager extends Function { public void onInteractAir(Player player) { ItemStack item_in_hand = player.getInventory().getItemInMainHand(); String id = plugin.getPlatformInterface().getItemStackID(item_in_hand); - - if (onInteractWithWateringCan(player, id, item_in_hand, null, null)) { - return; - } + onInteractWithWateringCan(player, id, item_in_hand, null, null); } - public void onBreakSomething(Player player, Location location, String id, Cancellable event) { + public void onBreakCustom(Player player, Location location, String id, Cancellable event) { if (onBreakGlass(player, id, location, event)) { return; @@ -185,7 +173,18 @@ public class PlatformManager extends Function { } } - public void onPlaceSomething(Player player, Location location, String id, @Nullable Cancellable event) { + public void onBreakVanilla(Player player, Location location, String id, Cancellable event) { + + if (onBreakGlass(player, id, location, event)) { + return; + } + + if (onBreakPot(player, id, location, event)) { + return; + } + } + + public void onPlaceCustom(Player player, Location location, String id, @Nullable Cancellable event) { if (onPlaceGlass(player, id, location, event)) { return; @@ -200,6 +199,17 @@ public class PlatformManager extends Function { } } + public void onPlaceVanilla(Player player, Location location, String id, @Nullable Cancellable event) { + + if (onPlaceGlass(player, id, location, event)) { + return; + } + + if (onPlacePot(player, id, location, event)) { + return; + } + } + void onInteractSomething(Player player, Location location, String id, @Nullable BlockFace blockFace, Cancellable event) { if (!plugin.getWorldDataManager().isWorldAllowed(location.getWorld())) { @@ -228,16 +238,15 @@ public class PlatformManager extends Function { return; } - if (onInteractBrokenPot(id, location)) { - return; - } - if (onInteractWithWateringCan(player, item_in_hand_id, item_in_hand, id, location)) { return; } } } + /** + * Fix a pot if CustomCrops detected the location seems to be corrupted + */ private boolean onInteractBrokenPot(String id, Location location) { if (!id.equals("NOTE_BLOCK")) { return false; @@ -263,6 +272,10 @@ public class PlatformManager extends Function { return true; } + /** + * Fix the pots according to the range + * The scope of detection is to some extent determined by the scope of corruption + */ public void furtherFix(Location location, int range) { if (range >= ConfigManager.fixRange) return; List locations = new ArrayList<>(); @@ -453,7 +466,6 @@ public class PlatformManager extends Function { } Sprinkler sprinkler = plugin.getWorldDataManager().getSprinklerData(SimpleLocation.getByBukkitLocation(location)); - WaterAmountHologram waterAmountHologram = sprinklerConfig.getSprinklerHologram(); if (waterAmountHologram != null) { String content; @@ -923,19 +935,18 @@ public class PlatformManager extends Function { CropConfig cropConfig = plugin.getCropManager().getCropConfigByStage(id); if (cropConfig == null) return false; + // The entity might be other creatures when the pot is FARMLAND + // because of vanilla farmland mechanics if (entity instanceof Player player) { - if (!canBreak(player, cropConfig, location)) { event.setCancelled(true); return true; } - CropBreakEvent cropBreakEvent = new CropBreakEvent(entity, cropConfig, id, location); Bukkit.getPluginManager().callEvent(cropBreakEvent); if (cropBreakEvent.isCancelled()) { return true; } - if (player.getGameMode() != GameMode.CREATIVE) { StageConfig stageConfig = plugin.getCropManager().getStageConfig(id); if (stageConfig != null) { @@ -948,13 +959,11 @@ public class PlatformManager extends Function { } } } else { - CropBreakEvent cropBreakEvent = new CropBreakEvent(entity, cropConfig, id, location); Bukkit.getPluginManager().callEvent(cropBreakEvent); if (cropBreakEvent.isCancelled()) { return true; } - StageConfig stageConfig = plugin.getCropManager().getStageConfig(id); if (stageConfig != null) { Action[] breakActions = stageConfig.getBreakActions(); @@ -965,7 +974,6 @@ public class PlatformManager extends Function { } } } - plugin.getWorldDataManager().removeCropData(SimpleLocation.getByBukkitLocation(location)); return true; } diff --git a/src/main/java/net/momirealms/customcrops/api/customplugin/itemsadder/ItemsAdderHandler.java b/src/main/java/net/momirealms/customcrops/api/customplugin/itemsadder/ItemsAdderHandler.java index a00fc55..2d34715 100644 --- a/src/main/java/net/momirealms/customcrops/api/customplugin/itemsadder/ItemsAdderHandler.java +++ b/src/main/java/net/momirealms/customcrops/api/customplugin/itemsadder/ItemsAdderHandler.java @@ -20,8 +20,6 @@ package net.momirealms.customcrops.api.customplugin.itemsadder; import dev.lone.itemsadder.api.Events.*; import net.momirealms.customcrops.api.customplugin.Handler; import net.momirealms.customcrops.api.customplugin.PlatformManager; -import org.bukkit.block.Block; -import org.bukkit.entity.Entity; import org.bukkit.event.EventHandler; public class ItemsAdderHandler extends Handler { @@ -32,21 +30,12 @@ public class ItemsAdderHandler extends Handler { @EventHandler public void onBreakCustomBlock(CustomBlockBreakEvent event) { - Block block = event.getBlock(); - switch (block.getType()) { - case NOTE_BLOCK -> platformManager.onBreakNoteBlock(event.getPlayer(), event.getBlock(), event.getNamespacedID(), event); - case TRIPWIRE -> platformManager.onBreakTripWire(event.getPlayer(), event.getBlock(), event.getNamespacedID(), event); - case CHORUS_PLANT -> platformManager.onBreakChorus(event.getPlayer(), event.getBlock(), event.getNamespacedID(), event); - } + platformManager.onBreakCustomBlock(event.getPlayer(), event.getBlock().getLocation(), event.getNamespacedID(), event); } @EventHandler public void onBreakFurniture(FurnitureBreakEvent event) { - Entity entity = event.getBukkitEntity(); - switch (entity.getType()) { - case ITEM_FRAME -> platformManager.onBreakItemFrame(event.getPlayer(), entity, event.getNamespacedID(), event); - case ITEM_DISPLAY -> platformManager.onBreakItemDisplay(event.getPlayer(), entity, event.getNamespacedID(), event); - } + platformManager.onBreakFurniture(event.getPlayer(), event.getBukkitEntity(), event.getNamespacedID(), event); } @EventHandler @@ -56,7 +45,7 @@ public class ItemsAdderHandler extends Handler { @EventHandler public void onPlaceCustomBlock(CustomBlockPlaceEvent event) { - platformManager.onPlaceBlock(event.getPlayer(), event.getBlock().getLocation(), event.getNamespacedID(), event); + platformManager.onPlaceCustomBlock(event.getPlayer(), event.getBlock().getLocation(), event.getNamespacedID(), event); } @EventHandler diff --git a/src/main/java/net/momirealms/customcrops/api/customplugin/oraxen/OraxenHandler.java b/src/main/java/net/momirealms/customcrops/api/customplugin/oraxen/OraxenHandler.java index d97644c..03a9d65 100644 --- a/src/main/java/net/momirealms/customcrops/api/customplugin/oraxen/OraxenHandler.java +++ b/src/main/java/net/momirealms/customcrops/api/customplugin/oraxen/OraxenHandler.java @@ -34,22 +34,20 @@ public class OraxenHandler extends Handler { @EventHandler public void onBreakNoteBlock(OraxenNoteBlockBreakEvent event) { - platformManager.onBreakNoteBlock(event.getPlayer(), event.getBlock(), event.getMechanic().getItemID(), event); + platformManager.onBreakCustomBlock(event.getPlayer(), event.getBlock().getLocation(), event.getMechanic().getItemID(), event); } @EventHandler public void onBreakStringBlock(OraxenStringBlockBreakEvent event) { - platformManager.onBreakTripWire(event.getPlayer(), event.getBlock(), event.getMechanic().getItemID(), event); + platformManager.onBreakCustomBlock(event.getPlayer(), event.getBlock().getLocation(), event.getMechanic().getItemID(), event); } @EventHandler public void onBreakFurniture(OraxenFurnitureBreakEvent event) { Entity entity = event.getBaseEntity(); + // TODO Why entity would sometimes be null if (entity == null) return; - switch (entity.getType()) { - case ITEM_FRAME -> platformManager.onBreakItemFrame(event.getPlayer(), entity, event.getMechanic().getItemID(), event); - case ITEM_DISPLAY -> platformManager.onBreakItemDisplay(event.getPlayer(), entity, event.getMechanic().getItemID(), event); - } + platformManager.onBreakFurniture(event.getPlayer(), entity, event.getMechanic().getItemID(), event); } @EventHandler @@ -63,14 +61,15 @@ public class OraxenHandler extends Handler { public void onPlaceStringBlock(OraxenStringBlockPlaceEvent event) { StringBlockMechanic mechanic = event.getMechanic(); if (mechanic == null) return; - platformManager.onPlaceBlock(event.getPlayer(), event.getBlock().getLocation(), mechanic.getItemID(), event); + platformManager.onPlaceCustomBlock(event.getPlayer(), event.getBlock().getLocation(), mechanic.getItemID(), event); } @EventHandler public void onPlaceNoteBlock(OraxenNoteBlockPlaceEvent event) { NoteBlockMechanic mechanic = event.getMechanic(); + // TODO Why mechanic would sometimes be null if (mechanic == null) return; - platformManager.onPlaceBlock(event.getPlayer(), event.getBlock().getLocation(), mechanic.getItemID(), event); + platformManager.onPlaceCustomBlock(event.getPlayer(), event.getBlock().getLocation(), mechanic.getItemID(), event); } @EventHandler diff --git a/src/main/java/net/momirealms/customcrops/api/customplugin/oraxen/OraxenPluginImpl.java b/src/main/java/net/momirealms/customcrops/api/customplugin/oraxen/OraxenPluginImpl.java index 4f7f62c..c6fdf5b 100644 --- a/src/main/java/net/momirealms/customcrops/api/customplugin/oraxen/OraxenPluginImpl.java +++ b/src/main/java/net/momirealms/customcrops/api/customplugin/oraxen/OraxenPluginImpl.java @@ -79,6 +79,7 @@ public class OraxenPluginImpl implements PlatformInterface { return itemFrame; else { AdventureUtils.consoleMessage("[CustomCrops] ItemFrame not exists: " + id); + // use oraxen method to remove sub entities OraxenFurniture.remove(entity, null); return null; } @@ -97,6 +98,7 @@ public class OraxenPluginImpl implements PlatformInterface { return itemDisplay; else { AdventureUtils.consoleMessage("[CustomCrops] ItemDisplay not exists: " + id); + // use oraxen method to remove sub entities OraxenFurniture.remove(entity, null); return null; } diff --git a/src/main/java/net/momirealms/customcrops/api/object/basic/ConfigManager.java b/src/main/java/net/momirealms/customcrops/api/object/basic/ConfigManager.java index 376fc01..9f5e24f 100644 --- a/src/main/java/net/momirealms/customcrops/api/object/basic/ConfigManager.java +++ b/src/main/java/net/momirealms/customcrops/api/object/basic/ConfigManager.java @@ -41,7 +41,8 @@ public class ConfigManager extends Function { public static boolean whiteListWorlds; public static HashSet worldList; public static String worldFolderPath; - public static boolean debug; + public static boolean debugScheduler; + public static boolean debugCorruption; public static String greenhouseBlock; public static String scarecrow; public static boolean enableGreenhouse; @@ -66,6 +67,7 @@ public class ConfigManager extends Function { public static boolean disableMoistureMechanic; public static boolean preventTrampling; public static boolean onlyInLoadedChunks; + public static boolean enableCorruptionFixer; private final HashMap cropPerWorld; private final CustomCrops plugin; @@ -92,7 +94,8 @@ public class ConfigManager extends Function { YamlConfiguration config = ConfigUtils.getConfig("config.yml"); enableBStats = config.getBoolean("metrics"); lang = config.getString("lang"); - debug = config.getBoolean("debug"); + debugScheduler = config.getBoolean("debug.log-scheduler", false); + debugCorruption = config.getBoolean("debug.log-corruption-fixer", false); loadWorlds(Objects.requireNonNull(config.getConfigurationSection("worlds"))); loadOptimization(Objects.requireNonNull(config.getConfigurationSection("optimization"))); loadScheduleSystem(Objects.requireNonNull(config.getConfigurationSection("schedule-system"))); @@ -149,6 +152,7 @@ public class ConfigManager extends Function { private void loadOtherSetting(ConfigurationSection section) { enableSkillBonus = section.getBoolean("skill-bonus.enable", false); bonusFormula = section.getString("skill-bonus.formula"); + enableCorruptionFixer = section.getBoolean("enable-corruption-fixer", true); fixRange = section.getInt("corrupt-fix-range", 4); } diff --git a/src/main/java/net/momirealms/customcrops/api/object/world/CCWorld.java b/src/main/java/net/momirealms/customcrops/api/object/world/CCWorld.java index 3a4c3e1..e44620e 100644 --- a/src/main/java/net/momirealms/customcrops/api/object/world/CCWorld.java +++ b/src/main/java/net/momirealms/customcrops/api/object/world/CCWorld.java @@ -233,7 +233,7 @@ public class CCWorld extends Function { this.timerTask = plugin.getScheduler().runTaskTimerAsync(() -> { World current = world.get(); if (current != null) { - if (ConfigManager.debug) { + if (ConfigManager.debugScheduler) { Log.info("Queue size: " + schedule.getQueue().size() + " Completed: " + schedule.getCompletedTaskCount()); } long day = current.getFullTime() / 24000; @@ -259,7 +259,7 @@ public class CCWorld extends Function { if (ConfigManager.cacheSaveInterval != -1) { cacheTimer--; if (cacheTimer <= 0) { - if (ConfigManager.debug) Log.info("== Save cache =="); + if (ConfigManager.debugScheduler) Log.info("== Save cache =="); cacheTimer = ConfigManager.cacheSaveInterval; schedule.execute(this::saveDateData); schedule.execute(this::saveCorruptedPots); @@ -278,12 +278,12 @@ public class CCWorld extends Function { public void onReachPoint() { if (ConfigManager.enableScheduleSystem) { - if (ConfigManager.debug) Log.info("== Grow point =="); + if (ConfigManager.debugScheduler) Log.info("== Grow point =="); plantInPoint.clear(); int size = schedule.getQueue().size(); if (size != 0) { schedule.getQueue().clear(); - if (ConfigManager.debug) Log.info("== Clear queue =="); + if (ConfigManager.debugScheduler) Log.info("== Clear queue =="); } for (CCChunk chunk : chunkMap.values()) { chunk.scheduleGrowTask(this, -1); @@ -296,12 +296,12 @@ public class CCWorld extends Function { } if (consumeCounter == 0) { consumeCounter = ConfigManager.intervalConsume; - if (ConfigManager.debug) Log.info("== Consume time =="); + if (ConfigManager.debugScheduler) Log.info("== Consume time =="); scheduleConsumeTask(-1); } if (workCounter == 0) { workCounter = ConfigManager.intervalWork; - if (ConfigManager.debug) Log.info("== Work time =="); + if (ConfigManager.debugScheduler) Log.info("== Work time =="); scheduleSprinklerWork(-1); } } @@ -443,13 +443,26 @@ public class CCWorld extends Function { CompletableFuture asyncGetChunk = location.getWorld().getChunkAtAsync(location.getBlockX() >> 4, location.getBlockZ() >> 4); asyncGetChunk.whenComplete((result, throwable) -> plugin.getScheduler().runTask(() -> { - if (!plugin.getPlatformInterface().removeAnyBlock(location)) { - plugin.getWorldDataManager().removePotData(simpleLocation); + Block block = location.getBlock(); + if (block.getType() == Material.AIR) { + removePotData(simpleLocation); return; } String replacer = wet ? potConfig.getWetPot(fertilizer) : potConfig.getDryPot(fertilizer); + String id = plugin.getPlatformInterface().getBlockID(block); + if (ConfigManager.enableCorruptionFixer && id.equals("NOTE_BLOCK")) { + plugin.getPlatformInterface().placeNoteBlock(location, replacer); + return; + } + String potKey = plugin.getPotManager().getPotKeyByBlockID(id); + if (potKey == null) { + removePotData(simpleLocation); + return; + } + if (potKey.equals(pot.getPotKey())) { + return; + } if (ConfigUtils.isVanillaItem(replacer)) { - Block block = location.getBlock(); block.setType(Material.valueOf(replacer)); if (block.getBlockData() instanceof Farmland farmland && ConfigManager.disableMoistureMechanic) { farmland.setMoisture(wet ? farmland.getMaximumMoisture() : 0); @@ -546,15 +559,12 @@ public class CCWorld extends Function { } else { addWaterToPot(simpleLocation, amount, potKey); } - } else if (blockID.equals("NOTE_BLOCK")) { + } else if (ConfigManager.enableCorruptionFixer && blockID.equals("NOTE_BLOCK")) { // Only ItemsAdder can go to this step Pot pot = getPotData(simpleLocation); if (pot != null) { - // mark it as glitched + // mark it as corrupted potKey = pot.getPotKey(); - corruptedPot.put(simpleLocation, potKey); - if (ConfigManager.debug) AdventureUtils.consoleMessage("[CustomCrops] Trying to fix corrupted pot found at: " + simpleLocation); - if (whitelist == null) { pot.addWater(amount); } else { @@ -565,21 +575,12 @@ public class CCWorld extends Function { } } } - + corruptedPot.put(simpleLocation, potKey); + if (ConfigManager.debugCorruption) AdventureUtils.consoleMessage("[CustomCrops] Trying to fix corrupted pot found at: " + simpleLocation); // only custom blocks would corrupt - String replacer = pot.getConfig().getWetPot(pot.getFertilizer()); + // so it's not necessary to check if the pot is a vanilla block + String replacer = pot.isWet() ? pot.getConfig().getWetPot(pot.getFertilizer()) : pot.getConfig().getDryPot(pot.getFertilizer()); plugin.getPlatformInterface().placeNoteBlock(location, replacer); - } else { - potKey = corruptedPot.get(simpleLocation); - if (potKey != null) { - PotConfig potConfig = plugin.getPotManager().getPotConfig(potKey); - if (potConfig != null) { - String replacer = potConfig.getDryPot(null); - plugin.getPlatformInterface().placeNoteBlock(location, replacer); - } else { - corruptedPot.remove(simpleLocation); - } - } } } } @@ -627,7 +628,7 @@ public class CCWorld extends Function { } int points = 1; - Pot pot = plugin.getWorldDataManager().getPotData(simpleLocation.add(0,-1,0)); + Pot pot = getPotData(simpleLocation.add(0,-1,0)); if (pot != null) { FertilizerConfig fertilizerConfig = plugin.getFertilizerManager().getConfigByFertilizer(pot.getFertilizer()); if (fertilizerConfig instanceof SpeedGrow speedGrow) { diff --git a/src/main/java/net/momirealms/customcrops/integration/skill/EcoSkillsImpl.java b/src/main/java/net/momirealms/customcrops/integration/skill/EcoSkillsImpl.java index 6269262..794ace1 100644 --- a/src/main/java/net/momirealms/customcrops/integration/skill/EcoSkillsImpl.java +++ b/src/main/java/net/momirealms/customcrops/integration/skill/EcoSkillsImpl.java @@ -24,19 +24,13 @@ import org.bukkit.entity.Player; public class EcoSkillsImpl implements SkillInterface { - public EcoSkillsAPI ecoSkillsAPI; - - public EcoSkillsImpl() { - ecoSkillsAPI = EcoSkillsAPI.getInstance(); - } - @Override public void addXp(Player player, double amount) { - ecoSkillsAPI.giveSkillExperience(player, Skills.FARMING, amount); + EcoSkillsAPI.giveSkillXP(player, Skills.INSTANCE.getByID("farming"), amount); } @Override public int getLevel(Player player) { - return ecoSkillsAPI.getSkillLevel(player, Skills.FISHING); + return EcoSkillsAPI.getSkillLevel(player, Skills.INSTANCE.getByID("farming")); } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index c556a6e..06f122b 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,11 +1,13 @@ # Don't change -config-version: '31' +config-version: '32' # BStats metrics: true # Language: english / spanish / chinese / turkish lang: english # debug -debug: false +debug: + log-scheduler: false + log-corruption-fixer: false worlds: # This is designed for servers that using a separate folder for worlds @@ -114,5 +116,7 @@ other-settings: # MMOCore profession name # MMOCore职业名 MMOCore-profession-name: 'farmer' + # Enable corruption fixer + enable-corruption-fixer: true # Fixed corrupted pots when interacting corrupt-fix-range: 4 \ No newline at end of file