diff --git a/api/src/main/java/net/momirealms/customcrops/api/action/builtin/ActionDropItem.java b/api/src/main/java/net/momirealms/customcrops/api/action/builtin/ActionDropItem.java index 1dfc2c2..1a780df 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/action/builtin/ActionDropItem.java +++ b/api/src/main/java/net/momirealms/customcrops/api/action/builtin/ActionDropItem.java @@ -31,6 +31,7 @@ import net.momirealms.customcrops.api.core.world.Pos3; import net.momirealms.customcrops.api.event.DropItemActionEvent; import net.momirealms.customcrops.api.misc.value.MathValue; 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.common.util.RandomUtils; import org.bukkit.Location; @@ -87,7 +88,7 @@ public class ActionDropItem extends AbstractBuiltInAction { if (toInv && player != null) { PlayerUtils.giveItem(player, itemToDrop, itemToDrop.getAmount()); } else { - location.getWorld().dropItemNaturally(location, itemToDrop); + location.getWorld().dropItemNaturally(LocationUtils.toBlockCenterLocation(location), itemToDrop); } } }, location); diff --git a/api/src/main/java/net/momirealms/customcrops/api/action/builtin/ActionQualityCrops.java b/api/src/main/java/net/momirealms/customcrops/api/action/builtin/ActionQualityCrops.java index 1a43cd0..c5b9ff1 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/action/builtin/ActionQualityCrops.java +++ b/api/src/main/java/net/momirealms/customcrops/api/action/builtin/ActionQualityCrops.java @@ -32,6 +32,7 @@ import net.momirealms.customcrops.api.core.world.Pos3; import net.momirealms.customcrops.api.event.QualityCropActionEvent; import net.momirealms.customcrops.api.misc.value.MathValue; 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.common.util.RandomUtils; import org.bukkit.Location; @@ -94,7 +95,7 @@ public class ActionQualityCrops extends AbstractBuiltInAction { if (toInv && player != null) { PlayerUtils.giveItem(player, itemStack, itemStack.getAmount()); } else { - location.getWorld().dropItemNaturally(location, itemStack); + location.getWorld().dropItemNaturally(LocationUtils.toBlockCenterLocation(location), itemStack); } } }, location); 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 bb757ba..11d9dff 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 @@ -55,6 +55,14 @@ public interface WorldManager extends Reloadable { */ int getDate(World world); + /** + * Loads a CustomCrops world + * + * @param world The CustomCrops world + * @return The loaded CustomCropsWorld instance, it might be another instance if it's already loaded + */ + CustomCropsWorld loadWorld(CustomCropsWorld world); + /** * Loads a CustomCrops world based on the specified Bukkit world. * 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 f0e9ccc..64c2df5 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 @@ -30,6 +30,7 @@ import net.momirealms.customcrops.api.util.TagUtils; import net.momirealms.customcrops.common.helper.GsonHelper; import net.momirealms.customcrops.common.util.Key; import org.bukkit.Bukkit; +import org.bukkit.Chunk; import org.bukkit.World; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -84,7 +85,7 @@ public class SlimeWorldAdaptorR1 extends AbstractWorldAdaptor implem public void onWorldLoad(LoadSlimeWorldEvent event) { World world = Bukkit.getWorld(event.getSlimeWorld().getName()); if (!BukkitCustomCropsPlugin.getInstance().getWorldManager().isMechanicEnabled(world)) return; - BukkitCustomCropsPlugin.getInstance().getWorldManager().loadWorld(world); + BukkitCustomCropsPlugin.getInstance().getWorldManager().loadWorld(adapt(event.getSlimeWorld())); } @Override diff --git a/gradle.properties b/gradle.properties index aa02b1f..cc6e337 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=3.6.28 +project_version=3.6.29 config_version=42 project_group=net.momirealms 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 2538933..eef8534 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 @@ -42,7 +42,6 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; public class BukkitWorldManager implements WorldManager, Listener { - private final BukkitCustomCropsPlugin plugin; private final TreeSet> adaptors = new TreeSet<>(); private final ConcurrentHashMap> worlds = new ConcurrentHashMap<>(); @@ -193,6 +192,25 @@ public class BukkitWorldManager implements WorldManager, Listener { } } + @Override + public CustomCropsWorld loadWorld(CustomCropsWorld world) { + Optional> optionalWorld = getWorld(world.worldName()); + if (optionalWorld.isPresent()) { + CustomCropsWorld customCropsWorld = optionalWorld.get(); + customCropsWorld.setting(Optional.ofNullable(worldSettings.get(world.worldName())).orElse(defaultWorldSetting)); + return customCropsWorld; + } + world.setting(Optional.ofNullable(worldSettings.get(world.worldName())).orElse(defaultWorldSetting)); + world.setTicking(true); + this.worlds.put(world.worldName(), world); + for (Chunk chunk : world.bukkitWorld().getLoadedChunks()) { + ChunkPos pos = ChunkPos.fromBukkitChunk(chunk); + loadLoadedChunk(world, pos); + notifyOfflineUpdates(world, pos); + } + return world; + } + @Override public CustomCropsWorld loadWorld(World world) { Optional> optionalWorld = getWorld(world);