diff --git a/api/src/main/java/net/momirealms/customcrops/api/core/block/CropBlock.java b/api/src/main/java/net/momirealms/customcrops/api/core/block/CropBlock.java index 5021faa..55597b3 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/core/block/CropBlock.java +++ b/api/src/main/java/net/momirealms/customcrops/api/core/block/CropBlock.java @@ -62,7 +62,7 @@ public class CropBlock extends AbstractCustomCropsBlock { // ignore random tick if (world.setting().tickCropMode() == 1) return; if (canTick(state, world.setting().tickCropInterval())) { - tickCrop(state, world, location, offlineTick); + tickCrop(state, world, location, offlineTick, false); } } @@ -71,7 +71,7 @@ public class CropBlock extends AbstractCustomCropsBlock { // ignore scheduled tick if (world.setting().tickCropMode() == 2) return; if (canTick(state, world.setting().tickCropInterval())) { - tickCrop(state, world, location, offlineTick); + tickCrop(state, world, location, offlineTick, true); } } @@ -340,7 +340,7 @@ public class CropBlock extends AbstractCustomCropsBlock { return state; } - private void tickCrop(CustomCropsBlockState state, CustomCropsWorld world, Pos3 location, boolean offline) { + private void tickCrop(CustomCropsBlockState state, CustomCropsWorld world, Pos3 location, boolean offline, boolean tickMode) { CropConfig config = config(state); BukkitCustomCropsPlugin plugin = BukkitCustomCropsPlugin.getInstance(); if (config == null) { @@ -349,6 +349,9 @@ public class CropBlock extends AbstractCustomCropsBlock { return; } + if (tickMode && config.ignoreRandomTick()) return; + if (!tickMode && config.ignoreScheduledTick()) return; + int previousPoint = point(state); World bukkitWorld = world.bukkitWorld(); Location bukkitLocation = location.toLocation(bukkitWorld); diff --git a/api/src/main/java/net/momirealms/customcrops/api/core/mechanic/crop/CropConfig.java b/api/src/main/java/net/momirealms/customcrops/api/core/mechanic/crop/CropConfig.java index 58071b0..8d30449 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/core/mechanic/crop/CropConfig.java +++ b/api/src/main/java/net/momirealms/customcrops/api/core/mechanic/crop/CropConfig.java @@ -18,6 +18,7 @@ package net.momirealms.customcrops.api.core.mechanic.crop; import net.momirealms.customcrops.api.action.Action; +import net.momirealms.customcrops.api.core.mechanic.pot.PotConfig; import net.momirealms.customcrops.api.core.world.CustomCropsBlockState; import net.momirealms.customcrops.api.requirement.Requirement; import org.bukkit.entity.Player; @@ -207,6 +208,20 @@ public interface CropConfig { return new CropConfigImpl.BuilderImpl(); } + /** + * Should the crop ignore scheduled tick? + * + * @return ignore or not + */ + boolean ignoreScheduledTick(); + + /** + * Should the crop ignore random tick? + * + * @return ignore or not + */ + boolean ignoreRandomTick(); + /** * Builder interface for constructing instances of {@link CropConfig}. */ @@ -355,5 +370,21 @@ public interface CropConfig { * @return The builder instance for chaining. */ Builder stages(Collection stages); + + /** + * Sets whether the crop ignores random tick + * + * @param ignoreRandomTick True if ignore random tick + * @return The current instance of the Builder. + */ + Builder ignoreRandomTick(boolean ignoreRandomTick); + + /** + * Sets whether the crop ignores scheduled tick + * + * @param ignoreScheduledTick True if ignore scheduled tick + * @return The current instance of the Builder. + */ + Builder ignoreScheduledTick(boolean ignoreScheduledTick); } } diff --git a/api/src/main/java/net/momirealms/customcrops/api/core/mechanic/crop/CropConfigImpl.java b/api/src/main/java/net/momirealms/customcrops/api/core/mechanic/crop/CropConfigImpl.java index 471ddfd..b7b9f46 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/core/mechanic/crop/CropConfigImpl.java +++ b/api/src/main/java/net/momirealms/customcrops/api/core/mechanic/crop/CropConfigImpl.java @@ -50,6 +50,8 @@ public class CropConfigImpl implements CropConfig { private final HashMap id2Stages = new HashMap<>(); private final Set stageIDs = new HashSet<>(); private final HashMap cropStageWithModelMap = new HashMap<>(); + private final boolean ignoreScheduledTick; + private final boolean ignoreRandomTick; public CropConfigImpl( String id, @@ -69,7 +71,9 @@ public class CropConfigImpl implements CropConfig { BoneMeal[] boneMeals, boolean rotation, Set potWhitelist, - Collection stageBuilders + Collection stageBuilders, + boolean ignoreScheduledTick, + boolean ignoreRandomTick ) { this.id = id; this.seed = seed; @@ -88,6 +92,8 @@ public class CropConfigImpl implements CropConfig { this.boneMeals = boneMeals; this.rotation = rotation; this.potWhitelist = potWhitelist; + this.ignoreRandomTick = ignoreRandomTick; + this.ignoreScheduledTick = ignoreScheduledTick; for (CropStageConfig.Builder builder : stageBuilders) { CropStageConfig config = builder.crop(this).build(); point2Stages.put(config.point(), config); @@ -228,8 +234,17 @@ public class CropConfigImpl implements CropConfig { return navigablePoint2Stages.floorEntry(point); } - public static class BuilderImpl implements Builder { + @Override + public boolean ignoreScheduledTick() { + return ignoreScheduledTick; + } + @Override + public boolean ignoreRandomTick() { + return ignoreRandomTick; + } + + public static class BuilderImpl implements Builder { private String id; private String seed; private ExistenceForm existenceForm; @@ -249,10 +264,12 @@ public class CropConfigImpl implements CropConfig { private boolean rotation; private Set potWhitelist; private Collection stages; + private boolean ignoreScheduledTick; + private boolean ignoreRandomTick; @Override public CropConfig build() { - return new CropConfigImpl(id, seed, maxPoints, wrongPotActions, interactActions, breakActions, plantActions, reachLimitActions, deathActions, plantRequirements, breakRequirements, interactRequirements, growConditions, deathConditions, boneMeals, rotation, potWhitelist, stages); + return new CropConfigImpl(id, seed, maxPoints, wrongPotActions, interactActions, breakActions, plantActions, reachLimitActions, deathActions, plantRequirements, breakRequirements, interactRequirements, growConditions, deathConditions, boneMeals, rotation, potWhitelist, stages, ignoreScheduledTick, ignoreRandomTick); } @Override @@ -361,5 +378,17 @@ public class CropConfigImpl implements CropConfig { this.stages = new HashSet<>(stages); return this; } + + @Override + public Builder ignoreRandomTick(boolean ignoreRandomTick) { + this.ignoreRandomTick = ignoreRandomTick; + return this; + } + + @Override + public Builder ignoreScheduledTick(boolean ignoreScheduledTick) { + this.ignoreScheduledTick = ignoreScheduledTick; + return this; + } } } 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 e10e654..704debc 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 @@ -275,8 +275,20 @@ public interface PotConfig { */ Builder isNearbyWaterAccepted(boolean isNearbyWaterAccepted); + /** + * Sets whether the pot ignores random tick + * + * @param ignoreRandomTick True if ignore random tick + * @return The current instance of the Builder. + */ Builder ignoreRandomTick(boolean ignoreRandomTick); + /** + * Sets whether the pot ignores scheduled tick + * + * @param ignoreScheduledTick True if ignore scheduled tick + * @return The current instance of the Builder. + */ Builder ignoreScheduledTick(boolean ignoreScheduledTick); /** 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 fc7c312..35ab1db 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 @@ -209,6 +209,8 @@ public class ConfigType { .seed(section.getString("seed")) .rotation(section.getBoolean("random-rotation", false)) .maxPoints(section.getInt("max-points", 1)) + .ignoreRandomTick(section.getBoolean("ignore-random-tick", false)) + .ignoreScheduledTick(section.getBoolean("ignore-scheduled-tick", false)) .potWhitelist(new HashSet<>(section.getStringList("pot-whitelist"))) .wrongPotActions(pam.parseActions(section.getSection("events.wrong_pot"))) .plantActions(pam.parseActions(section.getSection("events.plant")))