From e0df70529d358b1e79d8ec1d18aa908938697299 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Mon, 4 Nov 2024 04:03:42 +0800 Subject: [PATCH] Additional slime world event listener --- .../api/core/block/GreenhouseBlock.java | 1 + .../api/core/block/ScarecrowBlock.java | 1 + .../api/core/world/WorldManager.java | 2 ++ .../adaptor/asp_r1/SlimeWorldAdaptorR1.java | 14 ++++++++- gradle.properties | 4 +-- .../bukkit/item/BukkitItemFactory.java | 2 +- .../bukkit/world/BukkitWorldManager.java | 31 +++++++++++++------ 7 files changed, 41 insertions(+), 14 deletions(-) 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 5818463..de59c06 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 @@ -81,6 +81,7 @@ public class GreenhouseBlock extends AbstractCustomCropsBlock { CustomCropsBlockState state = getOrFixState(world, pos3); GreenhouseGlassBreakEvent breakEvent = new GreenhouseGlassBreakEvent(event.entityBreaker(), event.blockBreaker(), event.location(), event.brokenID(), state, event.reason()); if (EventUtils.fireAndCheckCancel(breakEvent)) { + breakEvent.setCancelled(true); return; } world.removeBlockState(pos3); 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 44fa993..59a6ee3 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 @@ -81,6 +81,7 @@ public class ScarecrowBlock extends AbstractCustomCropsBlock { CustomCropsBlockState state = getOrFixState(world, pos3); ScarecrowBreakEvent breakEvent = new ScarecrowBreakEvent(event.entityBreaker(), event.blockBreaker(), event.location(), event.brokenID(), state, event.reason()); if (EventUtils.fireAndCheckCancel(breakEvent)) { + event.setCancelled(true); return; } world.removeBlockState(pos3); diff --git a/api/src/main/java/net/momirealms/customcrops/api/core/world/WorldManager.java b/api/src/main/java/net/momirealms/customcrops/api/core/world/WorldManager.java index f234c3d..63afd1b 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/core/world/WorldManager.java +++ b/api/src/main/java/net/momirealms/customcrops/api/core/world/WorldManager.java @@ -72,6 +72,8 @@ public interface WorldManager extends Reloadable { */ boolean unloadWorld(World world, boolean disabling); + boolean isMechanicEnabled(World world); + /** * Retrieves a CustomCrops world based on the specified Bukkit world, if loaded. * diff --git a/compatibility-asp-r1/src/main/java/net/momirealms/customcrops/bukkit/integration/adaptor/asp_r1/SlimeWorldAdaptorR1.java b/compatibility-asp-r1/src/main/java/net/momirealms/customcrops/bukkit/integration/adaptor/asp_r1/SlimeWorldAdaptorR1.java index 824f268..1750ba8 100644 --- a/compatibility-asp-r1/src/main/java/net/momirealms/customcrops/bukkit/integration/adaptor/asp_r1/SlimeWorldAdaptorR1.java +++ b/compatibility-asp-r1/src/main/java/net/momirealms/customcrops/bukkit/integration/adaptor/asp_r1/SlimeWorldAdaptorR1.java @@ -18,6 +18,7 @@ package net.momirealms.customcrops.bukkit.integration.adaptor.asp_r1; import com.flowpowered.nbt.*; +import com.infernalsuite.aswm.api.events.LoadSlimeWorldEvent; import com.infernalsuite.aswm.api.world.SlimeWorld; import net.momirealms.customcrops.api.BukkitCustomCropsPlugin; import net.momirealms.customcrops.api.core.InternalRegistries; @@ -27,8 +28,12 @@ import net.momirealms.customcrops.api.core.world.adaptor.AbstractWorldAdaptor; import net.momirealms.customcrops.api.util.StringUtils; import net.momirealms.customcrops.api.util.TagUtils; import net.momirealms.customcrops.common.helper.GsonHelper; +import net.momirealms.customcrops.common.plugin.CustomCropsPlugin; import net.momirealms.customcrops.common.util.Key; import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.Nullable; @@ -40,7 +45,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.PriorityBlockingQueue; import java.util.function.Function; -public class SlimeWorldAdaptorR1 extends AbstractWorldAdaptor { +public class SlimeWorldAdaptorR1 extends AbstractWorldAdaptor implements Listener { private final Function getSlimeWorldFunction; @@ -76,6 +81,13 @@ public class SlimeWorldAdaptorR1 extends AbstractWorldAdaptor { } } + @EventHandler + public void onWorldLoad(LoadSlimeWorldEvent event) { + World world = Bukkit.getWorld(event.getSlimeWorld().getName()); + if (!BukkitCustomCropsPlugin.getInstance().getWorldManager().isMechanicEnabled(world)) return; + BukkitCustomCropsPlugin.getInstance().getWorldManager().loadWorld(world); + } + @Override public CustomCropsWorld adapt(Object world) { return CustomCropsWorld.create((SlimeWorld) world, this); diff --git a/gradle.properties b/gradle.properties index ed197b2..bb2204d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=3.6.17 +project_version=3.6.19 config_version=42 project_group=net.momirealms @@ -18,7 +18,7 @@ asm_commons_version=9.7.1 jar_relocator_version=1.7 adventure_bundle_version=4.17.0 adventure_platform_version=4.3.4 -sparrow_heart_version=0.45 +sparrow_heart_version=0.46 cloud_core_version=2.0.0 cloud_services_version=2.0.0 cloud_brigadier_version=2.0.0-beta.10 diff --git a/plugin/src/main/java/net/momirealms/customcrops/bukkit/item/BukkitItemFactory.java b/plugin/src/main/java/net/momirealms/customcrops/bukkit/item/BukkitItemFactory.java index 588dceb..c49222d 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/bukkit/item/BukkitItemFactory.java +++ b/plugin/src/main/java/net/momirealms/customcrops/bukkit/item/BukkitItemFactory.java @@ -45,7 +45,7 @@ public abstract class BukkitItemFactory extends ItemFactory { + "1.21", "1.21.1", "1.21.2", "1.21.3", "1.21.4" -> { return new ComponentItemFactory(plugin); } default -> throw new IllegalStateException("Unsupported server version: " + plugin.getServerVersion()); diff --git a/plugin/src/main/java/net/momirealms/customcrops/bukkit/world/BukkitWorldManager.java b/plugin/src/main/java/net/momirealms/customcrops/bukkit/world/BukkitWorldManager.java index 92c520d..2538933 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/bukkit/world/BukkitWorldManager.java +++ b/plugin/src/main/java/net/momirealms/customcrops/bukkit/world/BukkitWorldManager.java @@ -56,12 +56,16 @@ public class BukkitWorldManager implements WorldManager, Listener { this.plugin = plugin; try { Class.forName("com.infernalsuite.aswm.api.SlimePlugin"); - adaptors.add(new SlimeWorldAdaptorR1(1)); + SlimeWorldAdaptorR1 adaptor = new SlimeWorldAdaptorR1(1); + adaptors.add(adaptor); + Bukkit.getPluginManager().registerEvents(adaptor, plugin.getBootstrap()); plugin.getPluginLogger().info("SlimeWorldManager hooked!"); } catch (ClassNotFoundException ignored) { } if (Bukkit.getPluginManager().isPluginEnabled("SlimeWorldPlugin")) { - adaptors.add(new SlimeWorldAdaptorR1(2)); + SlimeWorldAdaptorR1 adaptor = new SlimeWorldAdaptorR1(2); + adaptors.add(adaptor); + Bukkit.getPluginManager().registerEvents(adaptor, plugin.getBootstrap()); plugin.getPluginLogger().info("AdvancedSlimePaper hooked!"); } this.adaptors.add(new BukkitWorldAdaptor()); @@ -140,6 +144,19 @@ public class BukkitWorldManager implements WorldManager, Listener { this.worldSettings.clear(); } + @Override + public void disable() { + this.unload(); + for (World world : Bukkit.getWorlds()) { + unloadWorld(world, true); + } + for (WorldAdaptor adaptor : this.adaptors) { + if (adaptor instanceof Listener listener) { + HandlerList.unregisterAll(listener); + } + } + } + private void loadConfig() { YamlDocument config = BukkitConfigManager.getMainConfig(); @@ -176,14 +193,6 @@ public class BukkitWorldManager implements WorldManager, Listener { } } - @Override - public void disable() { - this.unload(); - for (World world : Bukkit.getWorlds()) { - unloadWorld(world, true); - } - } - @Override public CustomCropsWorld loadWorld(World world) { Optional> optionalWorld = getWorld(world); @@ -282,7 +291,9 @@ public class BukkitWorldManager implements WorldManager, Listener { }); } + @Override public boolean isMechanicEnabled(World world) { + if (world == null) return false; if (matchRule == MatchRule.WHITELIST) { return worldList.contains(world.getName()); } else if (matchRule == MatchRule.BLACKLIST) {