9
0
mirror of https://github.com/Xiao-MoMi/Custom-Crops.git synced 2025-12-28 03:19:15 +00:00
This commit is contained in:
XiaoMoMi
2024-03-09 07:19:25 +08:00
parent db04715107
commit a3f2b62394
366 changed files with 20684 additions and 15814 deletions

View File

@@ -1,133 +0,0 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api;
import net.momirealms.customcrops.api.object.CCGrowingCrop;
import net.momirealms.customcrops.api.object.CCPot;
import net.momirealms.customcrops.api.object.CCSprinkler;
import net.momirealms.customcrops.api.object.CCWorldSeason;
import org.bukkit.Location;
import org.bukkit.World;
import javax.annotation.Nullable;
public interface CustomCropsAPI {
/**
* Get the pot instance at the specified location
* In order to reduce the memory usage, pot data would be removed
* if it has no water and no fertilizer
* But if "only-work-in-loaded-chunks" is true, pot data would not be removed
* @param location location
* @return pot
*/
@Nullable
CCPot getPotAt(Location location);
/**
* Get the on growing crop at the specified location
* It would be null if the crop already comes to its final stage
* @param location location
* @return on growing crop
*/
@Nullable
CCGrowingCrop getCropAt(Location location);
/**
* If the block is a greenhouse glass in data
* It would return false if your greenhouse glass lost due to server crash
* @param location location
* @return whether the block is greenhouse glass
*/
boolean isGreenhouseGlass(Location location);
/**
* If the chunk has a scarecrow
* @param location location
* @return has scarecrow or not
*/
boolean hasScarecrowInChunk(Location location);
/**
* Get the sprinkler at the specified location
* It would be null if the sprinkler run out of water
* @param location location
* @return sprinkler
*/
@Nullable
CCSprinkler getSprinklerAt(Location location);
/**
* Set the world's season
* @param world world
* @param season season
*/
void setSeason(String world, String season);
/**
* Set the world's date
* @param world world
* @param date date
*/
void setDate(String world, int date);
/**
* Add a world's date
* @param world world
*/
void addDate(String world);
/**
* Get a world's season
* @param world world
* @return season
*/
@Nullable
CCWorldSeason getSeason(String world);
/**
* Force the crops to grow in specified seconds
* @param world world
* @param seconds time
*/
void grow(World world, int seconds);
/**
* Force the sprinkler to work in specified seconds
* @param world world
* @param seconds time
*/
void sprinklerWork(World world, int seconds);
/**
* Force the pots to reduce water and consume fertilizer in specified seconds
* @param world world
* @param seconds time
*/
void consume(World world, int seconds);
/**
* Get the api instance
* It would be null if the plugin is not enabled
* @return api
*/
@Nullable
static CustomCropsAPI getInstance() {
return CustomCropsPlugin.getInstance().getAPI();
}
}

View File

@@ -17,19 +17,107 @@
package net.momirealms.customcrops.api;
import net.momirealms.customcrops.api.manager.*;
import net.momirealms.customcrops.api.scheduler.Scheduler;
import org.bukkit.plugin.java.JavaPlugin;
public abstract class CustomCropsPlugin extends JavaPlugin {
protected static CustomCropsPlugin instance;
protected VersionManager versionManager;
protected ConfigManager configManager;
protected Scheduler scheduler;
protected RequirementManager requirementManager;
protected ActionManager actionManager;
protected IntegrationManager integrationManager;
protected CoolDownManager coolDownManager;
protected WorldManager worldManager;
protected ItemManager itemManager;
protected AdventureManager adventure;
protected MessageManager messageManager;
protected ConditionManager conditionManager;
protected PlaceholderManager placeholderManager;
protected CustomCropsAPI customCropsAPI;
public CustomCropsAPI getAPI() {
return customCropsAPI;
public CustomCropsPlugin() {
instance = this;
}
public static CustomCropsPlugin getInstance() {
return instance;
}
public static CustomCropsPlugin get() {
return instance;
}
/* Get version manager */
public VersionManager getVersionManager() {
return versionManager;
}
/* Get config manager */
public ConfigManager getConfigManager() {
return configManager;
}
/* Get scheduler */
public Scheduler getScheduler() {
return scheduler;
}
/* Get requirement manager */
public RequirementManager getRequirementManager() {
return requirementManager;
}
/* Get integration manager */
public IntegrationManager getIntegrationManager() {
return integrationManager;
}
/* Get action manager */
public ActionManager getActionManager() {
return actionManager;
}
/* Get cool down manager */
public CoolDownManager getCoolDownManager() {
return coolDownManager;
}
/* Get world data manager */
public WorldManager getWorldManager() {
return worldManager;
}
/* Get item manager */
public ItemManager getItemManager() {
return itemManager;
}
/* Get message manager */
public MessageManager getMessageManager() {
return messageManager;
}
/* Get adventure manager */
public AdventureManager getAdventure() {
return adventure;
}
/* Get condition manager */
public ConditionManager getConditionManager() {
return conditionManager;
}
/* Get placeholder manager */
public PlaceholderManager getPlaceholderManager() {
return placeholderManager;
}
public abstract boolean isHookedPluginEnabled(String plugin);
public abstract void debug(String debug);
public abstract void reload();
}

View File

@@ -0,0 +1,25 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.common;
public interface Initable {
void init();
void disable();
}

View File

@@ -0,0 +1,25 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.common;
public record Pair<L, R>(L left, R right) {
public static <L, R> Pair<L, R> of(final L left, final R right) {
return new Pair<>(left, right);
}
}

View File

@@ -0,0 +1,23 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.common;
public interface Property<T> {
T get();
void set(T value);
}

View File

@@ -0,0 +1,40 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.common;
public interface Reloadable extends Initable {
@Override
default void init() {
load();
}
void load();
void unload();
@Override
default void disable() {
unload();
}
default void reload() {
unload();
load();
}
}

View File

@@ -0,0 +1,59 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.common;
public class Tuple<L, M, R> {
private L left;
private M mid;
private R right;
public Tuple(L left, M mid, R right) {
this.left = left;
this.mid = mid;
this.right = right;
}
public static <L, M, R> Tuple<L, M, R> of(final L left, final M mid, final R right) {
return new Tuple<>(left, mid, right);
}
public L getLeft() {
return left;
}
public void setLeft(L left) {
this.left = left;
}
public M getMid() {
return mid;
}
public void setMid(M mid) {
this.mid = mid;
}
public R getRight() {
return right;
}
public void setRight(R right) {
this.right = right;
}
}

View File

@@ -0,0 +1,27 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.common.item;
import net.momirealms.customcrops.api.mechanic.action.ActionTrigger;
import net.momirealms.customcrops.api.mechanic.requirement.State;
public interface EventItem {
void trigger(ActionTrigger actionTrigger, State state);
}

View File

@@ -0,0 +1,23 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.common.item;
public interface KeyItem {
String getKey();
}

View File

@@ -17,36 +17,33 @@
package net.momirealms.customcrops.api.event;
import net.momirealms.customcrops.api.mechanic.world.level.WorldCrop;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerEvent;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* An event that triggered when breaking a crop
*/
public class CropBreakEvent extends Event implements Cancellable {
public class CropBreakEvent extends PlayerEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
private final String cropItemID;
private final String cropKey;
private final Location location;
private final Entity entity;
private final WorldCrop worldCrop;
public CropBreakEvent(
@Nullable Entity entity,
@NotNull String cropKey,
@NotNull String cropItemID,
@NotNull Location location
@NotNull Player player,
@NotNull Location location,
@Nullable WorldCrop worldCrop
) {
this.entity = entity;
this.cropItemID = cropItemID;
super(player);
this.location = location;
this.cropKey = cropKey;
this.worldCrop = worldCrop;
}
@Override
@@ -71,12 +68,12 @@ public class CropBreakEvent extends Event implements Cancellable {
}
/**
* Get the crop item id in IA/Oraxen
* @return item id
* Get the crop's data, it might be null if it's spawned by other plugins in the wild
* @return crop data
*/
@NotNull
public String getCropItemID() {
return cropItemID;
@Nullable
public WorldCrop getWorldCrop() {
return worldCrop;
}
/**
@@ -87,22 +84,4 @@ public class CropBreakEvent extends Event implements Cancellable {
public Location getLocation() {
return location;
}
/**
* Would be null if the crop is not broken by an entity
* @return entity
*/
@Nullable
public Entity getEntity() {
return entity;
}
/**
* Get the crop config key
* @return crop key
*/
@NotNull
public String getCropKey() {
return cropKey;
}
}

View File

@@ -17,6 +17,7 @@
package net.momirealms.customcrops.api.event;
import net.momirealms.customcrops.api.mechanic.world.level.WorldCrop;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
@@ -24,6 +25,7 @@ import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerEvent;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* An event that triggered when a player interacts a crop
@@ -33,21 +35,18 @@ public class CropInteractEvent extends PlayerEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
private final Location location;
private final String cropItemID;
private final String cropKey;
private final WorldCrop crop;
private final ItemStack itemInHand;
public CropInteractEvent(
@NotNull Player who,
@NotNull ItemStack itemInHand,
@NotNull Location location,
@NotNull String cropItemID,
@NotNull String cropKey
@Nullable WorldCrop crop
) {
super(who);
this.cropItemID = cropItemID;
this.location = location;
this.cropKey = cropKey;
this.crop = crop;
this.itemInHand = itemInHand;
}
@@ -92,20 +91,11 @@ public class CropInteractEvent extends PlayerEvent implements Cancellable {
}
/**
* Get the crop model item id
* @return model item id
* Get the crop's data, it might be null if it's spawned by other plugins in the wild
* @return crop data
*/
@NotNull
public String getCropItemID() {
return cropItemID;
}
/**
* Get the crop config key
* @return crop key
*/
@NotNull
public String getCropKey() {
return cropKey;
@Nullable
public WorldCrop getCrop() {
return crop;
}
}

View File

@@ -17,6 +17,7 @@
package net.momirealms.customcrops.api.event;
import net.momirealms.customcrops.api.mechanic.item.Crop;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
@@ -33,25 +34,22 @@ public class CropPlantEvent extends PlayerEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
private final ItemStack itemInHand;
private final String cropKey;
private final Crop crop;
private final Location location;
private int point;
private String cropItemID;
public CropPlantEvent(
@NotNull Player who,
@NotNull ItemStack itemInHand,
@NotNull Location location,
@NotNull String cropKey,
int point,
@NotNull String cropItemID
@NotNull Crop crop,
int point
) {
super(who);
this.itemInHand = itemInHand;
this.location = location;
this.cropKey = cropKey;
this.crop = crop;
this.point = point;
this.cropItemID = cropItemID;
}
@Override
@@ -85,16 +83,18 @@ public class CropPlantEvent extends PlayerEvent implements Cancellable {
}
/**
* Get the crop config key
* @return crop key
* Get the crop's config
*
* @return crop
*/
@NotNull
public String getCropKey() {
return cropKey;
public Crop getCrop() {
return crop;
}
/**
* Get the crop location
* Get the crop's location
*
* @return location
*/
@NotNull
@@ -105,7 +105,7 @@ public class CropPlantEvent extends PlayerEvent implements Cancellable {
/**
* Get the initial point
* It would be 0 when planting
* but might be a value higher than 0 when replanting
*
* @return point
*/
public int getPoint() {
@@ -119,21 +119,4 @@ public class CropPlantEvent extends PlayerEvent implements Cancellable {
public void setPoint(int point) {
this.point = point;
}
/**
* Get the crop stage model item id
* @return crop model
*/
@NotNull
public String getCropModel() {
return cropItemID;
}
/**
* Set the crop model item id
* @param cropItemID crop model item id
*/
public void setCropModel(String cropItemID) {
this.cropItemID = cropItemID;
}
}

View File

@@ -0,0 +1,47 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.event;
import net.momirealms.customcrops.api.CustomCropsPlugin;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
public class CustomCropsReloadEvent extends Event {
private static final HandlerList handlerList = new HandlerList();
private final CustomCropsPlugin plugin;
public CustomCropsReloadEvent(CustomCropsPlugin plugin) {
this.plugin = plugin;
}
public static HandlerList getHandlerList() {
return handlerList;
}
@NotNull
@Override
public HandlerList getHandlers() {
return getHandlerList();
}
public CustomCropsPlugin getPluginInstance() {
return plugin;
}
}

View File

@@ -1,98 +0,0 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.event;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerEvent;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
/**
* An event that triggered when player is using fertilizers
*/
public class FertilizerUseEvent extends PlayerEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
private final ItemStack itemInHand;
private final String fertilizerKey;
private final Location location;
public FertilizerUseEvent(
@NotNull Player who,
@NotNull ItemStack itemInHand,
@NotNull String fertilizerKey,
@NotNull Location location
) {
super(who);
this.itemInHand = itemInHand;
this.fertilizerKey = fertilizerKey;
this.location = location;
}
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean cancel) {
this.cancelled = cancel;
}
/**
* Get the fertilizer item in hand
* @return fertilizer itemStack
*/
@NotNull
public ItemStack getItemInHand() {
return itemInHand;
}
/**
* Get the fertilizer config key
* @return fertilizer key
*/
@NotNull
public String getFertilizerKey() {
return fertilizerKey;
}
/**
* Get the pot location
* @return location
*/
@NotNull
public Location getLocation() {
return location;
}
@NotNull
public static HandlerList getHandlerList() {
return handlers;
}
@NotNull
@Override
public HandlerList getHandlers() {
return getHandlerList();
}
}

View File

@@ -17,6 +17,7 @@
package net.momirealms.customcrops.api.event;
import net.momirealms.customcrops.api.mechanic.world.level.WorldPot;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.event.Cancellable;
@@ -33,17 +34,17 @@ public class PotBreakEvent extends Event implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
private final Location location;
private final String potKey;
private final WorldPot pot;
private final Entity entity;
public PotBreakEvent(
@Nullable Entity entity,
@NotNull Location location,
@NotNull String potKey
@NotNull WorldPot pot
) {
this.entity = entity;
this.location = location;
this.potKey = potKey;
this.pot = pot;
}
@Override
@@ -76,13 +77,14 @@ public class PotBreakEvent extends Event implements Cancellable {
return location;
}
/**
* Get the pot config key
* @return pot key
* Get the pot's data
* @return pot
*/
@NotNull
public String getPotKey() {
return potKey;
public WorldPot getPot() {
return pot;
}
/**
@@ -93,4 +95,4 @@ public class PotBreakEvent extends Event implements Cancellable {
public Entity getEntity() {
return entity;
}
}
}

View File

@@ -1,116 +0,0 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.event;
import net.momirealms.customcrops.api.object.CCFertilizer;
import net.momirealms.customcrops.api.object.CCGrowingCrop;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerEvent;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* This event is called after a player interacted a pot
* So the fertilizer/water would be updated
*/
public class PotInfoEvent extends PlayerEvent {
private static final HandlerList handlers = new HandlerList();
private final CCFertilizer fertilizer;
private final int water;
private final CCGrowingCrop growingCrop;
private final ItemStack itemInHand;
private final Location location;
public PotInfoEvent(
@NotNull Player who,
@NotNull Location location,
@NotNull ItemStack itemInHand,
@Nullable CCFertilizer fertilizer,
int water,
@Nullable CCGrowingCrop growingCrop
) {
super(who);
this.fertilizer = fertilizer;
this.water = water;
this.growingCrop = growingCrop;
this.itemInHand = itemInHand;
this.location = location;
}
@NotNull
public static HandlerList getHandlerList() {
return handlers;
}
@NotNull
@Override
public HandlerList getHandlers() {
return getHandlerList();
}
/**
* Get the fertilizer
* @return fertilizer
*/
@Nullable
public CCFertilizer getFertilizer() {
return fertilizer;
}
/**
* Get the water amount
* @return water amount
*/
public int getWater() {
return water;
}
/**
* Get the on growing crop above the pot
* It would be null if there's no crop or the crop is already ripe
* @return crop
*/
@Nullable
public CCGrowingCrop getGrowingCrop() {
return growingCrop;
}
/**
* Get the item in player's hand
* If there's nothing in hand, it would return AIR
* @return item in hand
*/
@NotNull
public ItemStack getItemInHand() {
return itemInHand;
}
/**
* Get the pot location
* @return location
*/
@NotNull
public Location getLocation() {
return location;
}
}

View File

@@ -17,6 +17,7 @@
package net.momirealms.customcrops.api.event;
import net.momirealms.customcrops.api.mechanic.world.level.WorldPot;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
@@ -34,18 +35,18 @@ public class PotInteractEvent extends PlayerEvent implements Cancellable {
private boolean cancelled;
private final ItemStack itemInHand;
private final Location location;
private final String potKey;
private final WorldPot pot;
public PotInteractEvent(
@NotNull Player who,
@NotNull ItemStack itemInHand,
@NotNull Location location,
@NotNull String potKey
@NotNull WorldPot pot
) {
super(who);
this.itemInHand = itemInHand;
this.location = location;
this.potKey = potKey;
this.pot = pot;
}
@Override
@@ -93,11 +94,11 @@ public class PotInteractEvent extends PlayerEvent implements Cancellable {
}
/**
* Get the pot's config key
* Get the pot's data
* @return pot key
*/
@NotNull
public String getPotKey() {
return potKey;
public WorldPot getPot() {
return pot;
}
}

View File

@@ -17,6 +17,7 @@
package net.momirealms.customcrops.api.event;
import net.momirealms.customcrops.api.mechanic.item.Pot;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
@@ -32,16 +33,16 @@ public class PotPlaceEvent extends PlayerEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
private final Location location;
private final String potKey;
private final Pot pot;
public PotPlaceEvent(
@NotNull Player who,
@NotNull Location location,
@NotNull String potKey
@NotNull Pot pot
) {
super(who);
this.location = location;
this.potKey = potKey;
this.pot = pot;
}
@Override
@@ -75,11 +76,11 @@ public class PotPlaceEvent extends PlayerEvent implements Cancellable {
}
/**
* Get the placed pot config key
* @return pot key
* Get the placed pot's config
* @return pot
*/
@NotNull
public String getPotKey() {
return potKey;
public Pot getPot() {
return pot;
}
}
}

View File

@@ -1,104 +0,0 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.event;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerEvent;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
/**
* An event that triggered when watering a pot
*/
public class PotWaterEvent extends PlayerEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
private final ItemStack itemInHand;
private int water;
private final Location location;
public PotWaterEvent(
@NotNull Player who,
@NotNull ItemStack itemInHand,
int water,
@NotNull Location location) {
super(who);
this.itemInHand = itemInHand;
this.water = water;
this.location = location;
}
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean cancel) {
this.cancelled = cancel;
}
@NotNull
public static HandlerList getHandlerList() {
return handlers;
}
@NotNull
@Override
public HandlerList getHandlers() {
return getHandlerList();
}
/**
* Get the pot location
* @return location
*/
@NotNull
public Location getLocation() {
return location;
}
/**
* Get the item in player's hand
* @return item in hand
*/
@NotNull
public ItemStack getItemInHand() {
return itemInHand;
}
/**
* Get the amount of water
* @return the amount of water that added to the pot
*/
public int getWater() {
return water;
}
/**
* Set the amount of water that added to the pot
* @param water water
*/
public void setWater(int water) {
this.water = water;
}
}

View File

@@ -17,25 +17,27 @@
package net.momirealms.customcrops.api.event;
import net.momirealms.customcrops.api.object.CCWorldSeason;
import net.momirealms.customcrops.api.mechanic.world.season.Season;
import org.bukkit.World;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.bukkit.event.world.WorldEvent;
import org.jetbrains.annotations.NotNull;
/**
* An event that triggered when season changes
* An async event triggered when season changes
*/
public class SeasonChangeEvent extends WorldEvent {
public class SeasonChangeEvent extends Event {
private static final HandlerList handlers = new HandlerList();
private final CCWorldSeason season;
private final Season season;
private final World world;
public SeasonChangeEvent(
@NotNull World world,
@NotNull CCWorldSeason season
@NotNull Season season
) {
super(world);
super(true);
this.world = world;
this.season = season;
}
@@ -55,7 +57,15 @@ public class SeasonChangeEvent extends WorldEvent {
* @return season
*/
@NotNull
public CCWorldSeason getSeason() {
public Season getSeason() {
return season;
}
/**
* Get the world
* @return world
*/
public World getWorld() {
return world;
}
}

View File

@@ -17,6 +17,7 @@
package net.momirealms.customcrops.api.event;
import net.momirealms.customcrops.api.mechanic.world.level.WorldSprinkler;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
@@ -32,16 +33,16 @@ public class SprinklerBreakEvent extends PlayerEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
private final Location location;
private final String sprinklerKey;
private final WorldSprinkler sprinkler;
public SprinklerBreakEvent(
@NotNull Player who,
@NotNull Location location,
@NotNull String sprinklerKey
@NotNull WorldSprinkler sprinkler
) {
super(who);
this.location = location;
this.sprinklerKey = sprinklerKey;
this.sprinkler = sprinkler;
}
@Override
@@ -75,11 +76,11 @@ public class SprinklerBreakEvent extends PlayerEvent implements Cancellable {
}
/**
* Get the sprinkler config key
* @return sprinkler key
* Get the sprinkler's data
* @return sprinkler
*/
@NotNull
public String getSprinklerKey() {
return sprinklerKey;
public WorldSprinkler getSprinkler() {
return sprinkler;
}
}
}

View File

@@ -1,116 +0,0 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.event;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerEvent;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
/**
* An event that triggered when filling a sprinkler
*/
public class SprinklerFillEvent extends PlayerEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
private final ItemStack itemInHand;
private int water;
private final Location location;
private final String sprinklerKey;
public SprinklerFillEvent(
@NotNull Player who,
@NotNull String sprinklerKey,
@NotNull ItemStack itemInHand,
int water,
@NotNull Location location) {
super(who);
this.itemInHand = itemInHand;
this.water = water;
this.location = location;
this.sprinklerKey = sprinklerKey;
}
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean cancel) {
this.cancelled = cancel;
}
@NotNull
public static HandlerList getHandlerList() {
return handlers;
}
@NotNull
@Override
public HandlerList getHandlers() {
return getHandlerList();
}
/**
* Get the item in player's hand
* @return item in hand
*/
@NotNull
public ItemStack getItemInHand() {
return itemInHand;
}
/**
* Get the sprinkler location
* @return location
*/
@NotNull
public Location getLocation() {
return location;
}
/**
* Get the amount of water
* @return the amount of water that added to the sprinkler
*/
public int getWater() {
return water;
}
/**
* Set the water that added to the sprinkler
* @param water water
*/
public void setWater(int water) {
this.water = water;
}
/**
* Get the sprinkler config key
* @return sprinkler key
*/
@NotNull
public String getSprinklerKey() {
return sprinklerKey;
}
}

View File

@@ -17,6 +17,7 @@
package net.momirealms.customcrops.api.event;
import net.momirealms.customcrops.api.mechanic.world.level.WorldSprinkler;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
@@ -33,18 +34,18 @@ public class SprinklerInteractEvent extends PlayerEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
private final Location location;
private final String sprinklerKey;
private final WorldSprinkler sprinkler;
private final ItemStack itemInHand;
public SprinklerInteractEvent(
@NotNull Player who,
@NotNull ItemStack itemInHand,
@NotNull Location location,
@NotNull String sprinklerKey
@NotNull WorldSprinkler sprinkler
) {
super(who);
this.location = location;
this.sprinklerKey = sprinklerKey;
this.sprinkler = sprinkler;
this.itemInHand = itemInHand;
}
@@ -79,12 +80,12 @@ public class SprinklerInteractEvent extends PlayerEvent implements Cancellable {
}
/**
* Get the sprinkler config key
* @return sprinkler key
* Get the sprinkler's data
* @return sprinkler
*/
@NotNull
public String getSprinklerKey() {
return sprinklerKey;
public WorldSprinkler getSprinkler() {
return sprinkler;
}
/**

View File

@@ -17,6 +17,7 @@
package net.momirealms.customcrops.api.event;
import net.momirealms.customcrops.api.mechanic.item.Sprinkler;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
@@ -34,13 +35,13 @@ public class SprinklerPlaceEvent extends PlayerEvent implements Cancellable {
private boolean cancelled;
private final ItemStack itemInHand;
private final Location location;
private final String sprinklerKey;
private final Sprinkler sprinkler;
public SprinklerPlaceEvent(@NotNull Player who, ItemStack itemInHand, Location location, String sprinklerKey) {
public SprinklerPlaceEvent(@NotNull Player who, ItemStack itemInHand, Location location, Sprinkler sprinkler) {
super(who);
this.itemInHand = itemInHand;
this.location = location;
this.sprinklerKey = sprinklerKey;
this.sprinkler = sprinkler;
}
@Override
@@ -83,11 +84,11 @@ public class SprinklerPlaceEvent extends PlayerEvent implements Cancellable {
}
/**
* Get the sprinkler config key
* @return sprinkler key
* Get the sprinkler's config
* @return sprinkler
*/
@NotNull
public String getSprinklerKey() {
return sprinklerKey;
public Sprinkler getSprinkler() {
return sprinkler;
}
}
}

View File

@@ -0,0 +1,30 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.integration;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
public interface ItemLibrary {
String identification();
ItemStack buildItem(Player player, String id);
String getItemID(ItemStack itemStack);
}

View File

@@ -0,0 +1,41 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.integration;
import org.bukkit.entity.Player;
public interface LevelInterface {
/**
* Add exp to a certain skill or job
*
* @param player player
* @param target the skill or job, for instance "Fishing" "fisherman"
* @param amount the exp amount
*/
void addXp(Player player, String target, double amount);
/**
* Get a player's skill or job's level
*
* @param player player
* @param target the skill or job, for instance "Fishing" "fisherman"
* @return level
*/
int getLevel(Player player, String target);
}

View File

@@ -15,34 +15,27 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.object;
package net.momirealms.customcrops.api.integration;
/**
* Fertilizer
*/
public interface CCFertilizer {
import net.momirealms.customcrops.api.mechanic.world.season.Season;
import org.bukkit.World;
import org.jetbrains.annotations.Nullable;
public interface SeasonInterface {
/**
* Reduce the fertilizer's usage times
* @return whether the fertilizer is used up
* Get a world's season
*
* @param world world
* @return spring, summer, autumn, winter or null
*/
boolean reduceTimes();
@Nullable Season getSeason(World world);
/**
* Get the fertilizer key in config
* @return key
* Get a world's date
*
* @param world world
* @return date
*/
String getKey();
/**
* Get the remaining usage times
* @return times
*/
int getLeftTimes();
/**
* Set remaining usage times
* @param times times
*/
void setTimes(int times);
int getDate(World world);
}

View File

@@ -0,0 +1,48 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.manager;
import net.momirealms.customcrops.api.common.Reloadable;
import net.momirealms.customcrops.api.mechanic.action.Action;
import net.momirealms.customcrops.api.mechanic.action.ActionFactory;
import net.momirealms.customcrops.api.mechanic.action.ActionTrigger;
import net.momirealms.customcrops.api.mechanic.requirement.State;
import org.bukkit.configuration.ConfigurationSection;
import java.util.HashMap;
public interface ActionManager extends Reloadable {
boolean registerAction(String type, ActionFactory actionFactory);
boolean unregisterAction(String type);
Action getAction(ConfigurationSection section);
HashMap<ActionTrigger, Action[]> getActionMap(ConfigurationSection section);
Action[] getActions(ConfigurationSection section);
ActionFactory getActionFactory(String type);
static void triggerActions(State state, Action... actions) {
if (actions != null)
for (Action action : actions)
action.trigger(state);
}
}

View File

@@ -0,0 +1,61 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.manager;
import net.kyori.adventure.key.Key;
import net.kyori.adventure.sound.Sound;
import net.kyori.adventure.text.Component;
import net.momirealms.customcrops.api.common.Initable;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public abstract class AdventureManager implements Initable {
private static AdventureManager instance;
public AdventureManager() {
instance = this;
}
public static AdventureManager getInstance() {
return instance;
}
public abstract void sendMessage(CommandSender sender, String s);
public abstract void sendMessageWithPrefix(CommandSender sender, String text);
public abstract void sendConsoleMessage(String text);
public abstract void sendPlayerMessage(Player player, String text);
public abstract void sendActionbar(Player player, String text);
public abstract void sendSound(Player player, Sound.Source source, Key key, float pitch, float volume);
public abstract void sendSound(Player player, Sound sound);
public abstract Component getComponentFromMiniMessage(String text);
public abstract String legacyToMiniMessage(String legacy);
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
public abstract boolean isColorCode(char c);
public abstract void sendTitle(Player player, String title, String subTitle, int fadeIn, int stay, int fadeOut);
}

View File

@@ -0,0 +1,54 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.manager;
import net.momirealms.customcrops.api.common.Reloadable;
import net.momirealms.customcrops.api.mechanic.condition.Condition;
import net.momirealms.customcrops.api.mechanic.condition.ConditionFactory;
import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
import org.bukkit.configuration.ConfigurationSection;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public interface ConditionManager extends Reloadable {
boolean registerCondition(String type, ConditionFactory conditionFactory);
boolean unregisterCondition(String type);
boolean hasCondition(String type);
@NotNull
Condition[] getConditions(ConfigurationSection section);
Condition getCondition(ConfigurationSection section);
Condition getCondition(String key, Object args);
@Nullable ConditionFactory getConditionFactory(String type);
static boolean isConditionMet(CustomCropsBlock block, Condition... conditions) {
if (conditions == null) return true;
for (Condition condition : conditions) {
if (!condition.isConditionMet(block)) {
return false;
}
}
return true;
}
}

View File

@@ -0,0 +1,160 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.manager;
import net.momirealms.customcrops.api.common.Reloadable;
import org.bukkit.World;
public abstract class ConfigManager implements Reloadable {
private static ConfigManager instance;
public ConfigManager() {
instance = this;
}
public static ConfigManager getInstance() {
return instance;
}
public static boolean legacyColorSupport() {
return instance.hasLegacyColorSupport();
}
public static int maximumPoolSize() {
return instance.getMaximumPoolSize();
}
public static int corePoolSize() {
return instance.getCorePoolSize();
}
public static int keepAliveTime() {
return instance.getKeepAliveTime();
}
public static boolean debug() {
return instance.getDebugMode();
}
public static boolean protectLore() {
return instance.isProtectLore();
}
public static String[] itemDetectionOrder() {
return instance.getItemDetectionOrder();
}
public static String lang() {
return instance.getLang();
}
public static boolean metrics() {
return instance.hasMetrics();
}
public static boolean checkUpdate() {
return instance.hasCheckUpdate();
}
public static double[] defaultQualityRatio() {
return instance.getDefaultQualityRatio();
}
public static boolean preventTrampling() {
return instance.isPreventTrampling();
}
public static boolean disableMoisture() {
return instance.isDisableMoisture();
}
public static boolean syncSeasons() {
return instance.isSyncSeasons();
}
public static boolean enableGreenhouse() {
return instance.isGreenhouseEnabled();
}
public static World referenceWorld() {
return instance.getReferenceWorld();
}
public static int greenhouseRange() {
return instance.getGreenhouseRange();
}
public static int scarecrowRange() {
return instance.getScarecrowRange();
}
public static String greenhouseID() {
return instance.getGreenhouseID();
}
public static boolean enableScarecrow() {
return instance.isScarecrowEnabled();
}
public static String scarecrowID() {
return instance.getScarecrowID();
}
protected abstract double[] getDefaultQualityRatio();
protected abstract String getLang();
protected abstract boolean getDebugMode();
protected abstract boolean hasLegacyColorSupport();
protected abstract int getMaximumPoolSize();
protected abstract int getKeepAliveTime();
protected abstract int getCorePoolSize();
public abstract boolean isProtectLore();
public abstract String[] getItemDetectionOrder();
public abstract boolean hasMetrics();
public abstract boolean hasCheckUpdate();
public abstract boolean isDisableMoisture();
public abstract boolean isPreventTrampling();
public abstract boolean isGreenhouseEnabled();
public abstract String getGreenhouseID();
public abstract int getGreenhouseRange();
public abstract boolean isScarecrowEnabled();
public abstract String getScarecrowID();
public abstract int getScarecrowRange();
public abstract boolean isSyncSeasons();
public abstract World getReferenceWorld();
}

View File

@@ -0,0 +1,87 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.manager;
import net.momirealms.customcrops.api.CustomCropsPlugin;
import net.momirealms.customcrops.api.common.Reloadable;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerQuitEvent;
import java.util.HashMap;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
public class CoolDownManager implements Listener, Reloadable {
private final ConcurrentHashMap<UUID, Data> dataMap;
private final CustomCropsPlugin plugin;
public CoolDownManager(CustomCropsPlugin plugin) {
this.dataMap = new ConcurrentHashMap<>();
this.plugin = plugin;
}
public boolean isCoolDown(UUID uuid, String key, long time) {
Data data = this.dataMap.computeIfAbsent(uuid, k -> new Data());
return data.isCoolDown(key, time);
}
@Override
public void load() {
Bukkit.getPluginManager().registerEvents(this, plugin);
}
@Override
public void unload() {
HandlerList.unregisterAll(this);
}
@Override
public void disable() {
unload();
this.dataMap.clear();
}
@EventHandler
public void onQuit(PlayerQuitEvent event) {
dataMap.remove(event.getPlayer().getUniqueId());
}
public static class Data {
private final HashMap<String, Long> coolDownMap;
public Data() {
this.coolDownMap = new HashMap<>();
}
public synchronized boolean isCoolDown(String key, long delay) {
long time = System.currentTimeMillis();
long last = coolDownMap.getOrDefault(key, time - delay);
if (last + delay > time) {
return true;
} else {
coolDownMap.put(key, time);
return false;
}
}
}
}

View File

@@ -0,0 +1,62 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.manager;
import net.momirealms.customcrops.api.common.Initable;
import net.momirealms.customcrops.api.integration.LevelInterface;
import net.momirealms.customcrops.api.integration.SeasonInterface;
import net.momirealms.customcrops.api.mechanic.world.season.Season;
import org.bukkit.World;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.Nullable;
public interface IntegrationManager extends Initable {
/**
* Registers a level plugin with the specified name.
*
* @param plugin The name of the level plugin.
* @param level The implementation of the LevelInterface.
* @return true if the registration was successful, false if the plugin name is already registered.
*/
boolean registerLevelPlugin(String plugin, LevelInterface level);
/**
* Unregisters a level plugin with the specified name.
*
* @param plugin The name of the level plugin to unregister.
* @return true if the unregistration was successful, false if the plugin name is not found.
*/
boolean unregisterLevelPlugin(String plugin);
/**
* Get the LevelInterface provided by a plugin.
*
* @param plugin The name of the plugin providing the LevelInterface.
* @return The LevelInterface provided by the specified plugin, or null if the plugin is not registered.
*/
@Nullable LevelInterface getLevelPlugin(String plugin);
SeasonInterface getSeasonInterface();
Season getSeason(World world);
int getDate(World world);
ItemStack build(String itemID);
}

View File

@@ -0,0 +1,113 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.manager;
import net.momirealms.customcrops.api.common.Reloadable;
import net.momirealms.customcrops.api.integration.ItemLibrary;
import net.momirealms.customcrops.api.mechanic.item.*;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
public interface ItemManager extends Reloadable {
boolean registerItemLibrary(@NotNull ItemLibrary itemLibrary);
boolean unregisterItemLibrary(String identification);
String getItemID(ItemStack itemStack);
ItemStack getItemStack(Player player, String id);
void placeItem(Location location, ItemCarrier carrier, String id);
void removeAnythingAt(Location location);
@Nullable
WateringCan getWateringCanByID(@NotNull String id);
@Nullable
WateringCan getWateringCanByItemID(@NotNull String id);
@Nullable
WateringCan getWateringCanByItemStack(@NotNull ItemStack itemStack);
@Nullable
Sprinkler getSprinklerByID(@NotNull String id);
@Nullable
Sprinkler getSprinklerBy3DItemID(@NotNull String id);
@Nullable
Sprinkler getSprinklerBy2DItemID(@NotNull String id);
@Nullable
Sprinkler getSprinklerByEntity(@NotNull Entity entity);
@Nullable
Sprinkler getSprinklerBy2DItemStack(@NotNull ItemStack itemStack);
@Nullable
Sprinkler getSprinklerBy3DItemStack(@NotNull ItemStack itemStack);
@Nullable
Sprinkler getSprinklerByItemStack(@NotNull ItemStack itemStack);
@Nullable
Pot getPotByID(@NotNull String id);
@Nullable
Pot getPotByBlockID(@NotNull String id);
@Nullable
Pot getPotByBlock(@NotNull Block block);
@Nullable
Pot getPotByItemStack(@NotNull ItemStack itemStack);
Fertilizer getFertilizerByID(String id);
Fertilizer getFertilizerByItemID(String id);
Fertilizer getFertilizerByItemStack(@NotNull ItemStack itemStack);
Crop getCropByID(String id);
Crop getCropBySeedID(String id);
Crop getCropBySeedItemStack(ItemStack itemStack);
Crop getCropByStageID(String id);
Crop getCropByEntity(Entity entity);
Crop getCropByBlock(Block block);
Crop.Stage getCropStageByStageID(String id);
void updatePotState(Location location, Pot pot, boolean hasWater, Fertilizer fertilizer);
@NotNull
Collection<Location> getPotInRange(Location baseLocation, int width, int length, float yaw, String potID);
}

View File

@@ -0,0 +1,54 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.manager;
import net.momirealms.customcrops.api.mechanic.world.season.Season;
import org.jetbrains.annotations.Nullable;
public abstract class MessageManager {
private static MessageManager instance;
public MessageManager() {
instance = this;
}
public static MessageManager getInstance() {
return instance;
}
public static String seasonTranslation(@Nullable Season season) {
return instance.getSeasonTranslation(season);
}
public static String reloadMessage() {
return instance.getReload();
}
public static String prefix() {
return instance.getPrefix();
}
protected abstract String getPrefix();
protected abstract String getReload();
protected abstract String getSeasonTranslation(Season season);
public abstract void reload();
}

View File

@@ -0,0 +1,47 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.manager;
import net.momirealms.customcrops.api.common.Reloadable;
import org.bukkit.entity.Player;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
public abstract class PlaceholderManager implements Reloadable {
public static final Pattern pattern = Pattern.compile("\\{[^{}]+}");
private static PlaceholderManager instance;
public PlaceholderManager() {
instance = this;
}
public static PlaceholderManager getInstance() {
return instance;
}
public abstract String parse(Player player, String text, Map<String, String> vars);
public abstract List<String> parse(Player player, List<String> text, Map<String, String> vars);
public abstract List<String> detectPlaceholders(String text);
public abstract String setPlaceholders(Player player, String text);
}

View File

@@ -0,0 +1,57 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.manager;
import net.momirealms.customcrops.api.common.Reloadable;
import net.momirealms.customcrops.api.mechanic.requirement.Requirement;
import net.momirealms.customcrops.api.mechanic.requirement.RequirementFactory;
import net.momirealms.customcrops.api.mechanic.requirement.State;
import org.bukkit.configuration.ConfigurationSection;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public interface RequirementManager extends Reloadable {
boolean registerRequirement(String type, RequirementFactory requirementFactory);
boolean unregisterRequirement(String type);
@Nullable
Requirement[] getRequirements(ConfigurationSection section, boolean advanced);
boolean hasRequirement(String type);
@NotNull
Requirement getRequirement(ConfigurationSection section, boolean advanced);
@NotNull
Requirement getRequirement(String type, Object value);
@Nullable
RequirementFactory getRequirementFactory(String type);
static boolean isRequirementMet(State condition, Requirement... requirements) {
if (requirements == null) return true;
for (Requirement requirement : requirements) {
if (!requirement.isStateMet(condition)) {
return false;
}
}
return true;
}
}

View File

@@ -0,0 +1,77 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.manager;
import java.util.concurrent.CompletionStage;
public abstract class VersionManager {
private static VersionManager instance;
public VersionManager() {
instance = this;
}
public static VersionManager getInstance() {
return instance;
}
public static boolean isHigherThan1_19_R3() {
return instance.isVersionNewerThan1_19_R3();
}
public static boolean isHigherThan1_19_R2() {
return instance.isVersionNewerThan1_19_R2();
}
public abstract boolean hasRegionScheduler();
public static boolean folia() {
return instance.hasRegionScheduler();
}
public abstract String getPluginVersion();
public static String pluginVersion() {
return instance.getPluginVersion();
}
public static String serverVersion() {
return instance.getServerVersion();
}
public abstract String getServerVersion();
public static boolean spigot() {
return instance.isSpigot();
}
public abstract boolean isSpigot();
public abstract boolean isVersionNewerThan1_19_R3();
public abstract boolean isVersionNewerThan1_19();
public abstract boolean isVersionNewerThan1_19_R2();
public abstract boolean isVersionNewerThan1_20();
public abstract boolean isMojmap();
public abstract CompletionStage<Boolean> checkUpdate();
}

View File

@@ -0,0 +1,142 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.manager;
import net.momirealms.customcrops.api.common.Reloadable;
import net.momirealms.customcrops.api.mechanic.item.*;
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 org.bukkit.Chunk;
import org.bukkit.World;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
import java.util.Optional;
public interface WorldManager extends Reloadable {
/**
* Load a specified world and convert it into a CustomCrops world
* This method ignores the whitelist and blacklist
* If there already exists one, it would not create a new instance but return the created one
*
* @param world world
*/
@NotNull
CustomCropsWorld loadWorld(@NotNull World world);
/**
* Unload a specified world and save it to file
* This method ignores the whitelist and blacklist
*
* @param world world
*/
boolean unloadWorld(@NotNull World world);
/**
* Check if the world has CustomCrops mechanisms
*
* @param world world
* @return has or not
*/
boolean isMechanicEnabled(@NotNull World world);
/**
* Get all the worlds loaded in CustomCrops
*
* @return worlds
*/
@NotNull
Collection<String> getWorldNames();
/**
* Get all the worlds loaded in CustomCrops
*
* @return worlds
*/
@NotNull
Collection<World> getBukkitWorlds();
/**
* Get all the worlds loaded in CustomCrops
*
* @return worlds
*/
@NotNull
Collection<? extends CustomCropsWorld> getCustomCropsWorlds();
@NotNull
Optional<CustomCropsWorld> getCustomCropsWorld(@NotNull String name);
@NotNull
Optional<CustomCropsWorld> getCustomCropsWorld(@NotNull World world);
@NotNull
Optional<WorldSprinkler> getSprinklerAt(@NotNull SimpleLocation location);
@NotNull
Optional<WorldPot> getPotAt(@NotNull SimpleLocation location);
@NotNull
Optional<WorldCrop> getCropAt(@NotNull SimpleLocation location);
@NotNull Optional<WorldGlass> getGlassAt(@NotNull SimpleLocation location);
@NotNull Optional<WorldScarecrow> getScarecrowAt(@NotNull SimpleLocation location);
Optional<CustomCropsBlock> getBlockAt(SimpleLocation location);
void addWaterToSprinkler(@NotNull Sprinkler sprinkler, @NotNull SimpleLocation location, int amount);
void addFertilizerToPot(@NotNull Pot pot, @NotNull Fertilizer fertilizer, @NotNull SimpleLocation location);
void addWaterToPot(@NotNull Pot pot, @NotNull SimpleLocation location, int amount);
void addGlassAt(@NotNull WorldGlass glass, @NotNull SimpleLocation location);
void addScarecrowAt(@NotNull WorldScarecrow scarecrow, @NotNull SimpleLocation location);
void removeSprinklerAt(@NotNull SimpleLocation location);
void removePotAt(@NotNull SimpleLocation location);
void removeCropAt(@NotNull SimpleLocation location);
boolean isReachLimit(SimpleLocation location, ItemType itemType);
void addPotAt(@NotNull WorldPot pot, @NotNull SimpleLocation location);
void addSprinklerAt(@NotNull WorldSprinkler sprinkler, @NotNull SimpleLocation location);
void addCropAt(@NotNull WorldCrop crop, @NotNull SimpleLocation location);
void addPointToCrop(@NotNull Crop crop, @NotNull SimpleLocation location, int points);
void handleChunkLoad(Chunk bukkitChunk);
void handleChunkUnload(Chunk bukkitChunk);
void saveChunkToFile(CustomCropsChunk chunk);
void removeGlassAt(@NotNull SimpleLocation location);
void removeScarecrowAt(@NotNull SimpleLocation location);
CustomCropsBlock removeAnythingAt(SimpleLocation location);
}

View File

@@ -0,0 +1,25 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.action;
import net.momirealms.customcrops.api.mechanic.requirement.State;
public interface Action {
void trigger(State condition);
}

View File

@@ -0,0 +1,29 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.action;
public abstract class ActionExpansion {
public abstract String getVersion();
public abstract String getAuthor();
public abstract String getActionType();
public abstract ActionFactory getActionFactory();
}

View File

@@ -0,0 +1,23 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.action;
public interface ActionFactory {
Action build(Object args, double chance);
}

View File

@@ -0,0 +1,36 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.action;
public enum ActionTrigger {
BREAK,
PLACE,
GROW,
ADD_WATER,
NO_WATER,
CONSUME_WATER,
FULL,
WORK,
USE,
WRONG_POT,
WRONG_SPRINKLER,
BEFORE_PLANT,
REACH_LIMIT,
INTERACT, PLANT, RIPE,
}

View File

@@ -0,0 +1,25 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.condition;
import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
public interface Condition {
boolean isConditionMet(CustomCropsBlock block);
}

View File

@@ -0,0 +1,29 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.condition;
public abstract class ConditionExpansion {
public abstract String getVersion();
public abstract String getAuthor();
public abstract String getConditionType();
public abstract ConditionFactory getConditionFactory();
}

View File

@@ -0,0 +1,23 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.condition;
public interface ConditionFactory {
Condition build(Object args);
}

View File

@@ -0,0 +1,14 @@
package net.momirealms.customcrops.api.mechanic.condition;
public class Conditions {
private final Condition[] conditions;
public Conditions(Condition[] conditions) {
this.conditions = conditions;
}
public Condition[] getConditions() {
return conditions;
}
}

View File

@@ -0,0 +1,29 @@
package net.momirealms.customcrops.api.mechanic.condition;
import net.momirealms.customcrops.api.mechanic.item.ItemCarrier;
public class DeathConditions extends Conditions {
private final String deathItem;
private final ItemCarrier itemCarrier;
private final int deathDelay;
public DeathConditions(Condition[] conditions, String deathItem, ItemCarrier itemCarrier, int deathDelay) {
super(conditions);
this.deathItem = deathItem;
this.itemCarrier = itemCarrier;
this.deathDelay = deathDelay;
}
public String getDeathItem() {
return deathItem;
}
public ItemCarrier getItemCarrier() {
return itemCarrier;
}
public int getDeathDelay() {
return deathDelay;
}
}

View File

@@ -0,0 +1,73 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.item;
import net.momirealms.customcrops.api.common.Pair;
import net.momirealms.customcrops.api.manager.ActionManager;
import net.momirealms.customcrops.api.mechanic.action.Action;
import net.momirealms.customcrops.api.mechanic.requirement.State;
import java.util.List;
public class BoneMeal {
private final String item;
private final int usedAmount;
private final String returned;
private final int returnedAmount;
private final List<Pair<Double, Integer>> pointGainList;
private final Action[] actions;
public BoneMeal(String item, int usedAmount, String returned, int returnedAmount, List<Pair<Double, Integer>> pointGainList, Action[] actions) {
this.item = item;
this.returned = returned;
this.pointGainList = pointGainList;
this.actions = actions;
this.usedAmount = usedAmount;
this.returnedAmount = returnedAmount;
}
public String getItem() {
return item;
}
public String getReturned() {
return returned;
}
public int getPoint() {
for (Pair<Double, Integer> pair : pointGainList) {
if (Math.random() < pair.left()) {
return pair.right();
}
}
return 0;
}
public void trigger(State state) {
ActionManager.triggerActions(state, actions);
}
public int getUsedAmount() {
return usedAmount;
}
public int getReturnedAmount() {
return returnedAmount;
}
}

View File

@@ -0,0 +1,79 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.item;
import net.momirealms.customcrops.api.common.item.KeyItem;
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.requirement.Requirement;
import net.momirealms.customcrops.api.mechanic.requirement.State;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.HashSet;
public interface Crop extends KeyItem {
String getSeedItemID();
int getMaxPoints();
Requirement[] getPlantRequirements();
Requirement[] getBreakRequirements();
Requirement[] getInteractRequirements();
Conditions getGrowConditions();
DeathConditions[] getDeathConditions();
BoneMeal[] getBoneMeals();
boolean isRotation();
void trigger(ActionTrigger trigger, State state);
Stage getStageByPoint(int point);
String getStageItemByPoint(int point);
Stage getStageByItemID(String itemID);
Collection<? extends Stage> getStages();
HashSet<String> getPotWhitelist();
ItemCarrier getItemCarrier();
interface Stage {
double getHologramOffset();
@Nullable String getStageID();
int getPoint();
void trigger(ActionTrigger trigger, State state);
Requirement[] getInteractRequirements();
Requirement[] getBreakRequirements();
}
}

View File

@@ -0,0 +1,41 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.item;
import net.momirealms.customcrops.api.common.item.EventItem;
import net.momirealms.customcrops.api.mechanic.requirement.Requirement;
import java.util.HashSet;
public interface Fertilizer extends EventItem {
String getKey();
String getItemID();
int getTimes();
FertilizerType getFertilizerType();
HashSet<String> getPotWhitelist();
boolean isBeforePlant();
String getIcon();
Requirement[] getRequirements();
}

View File

@@ -0,0 +1,26 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.item;
public enum FertilizerType {
SPEED_GROW,
QUALITY,
SOIL_RETAIN,
VARIATION,
YIELD_INCREASE
}

View File

@@ -0,0 +1,27 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.item;
public enum ItemCarrier {
NOTE_BLOCK,
MUSHROOM,
CHORUS,
TRIPWIRE,
ITEM_FRAME,
ITEM_DISPLAY
}

View File

@@ -0,0 +1,26 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.item;
public enum ItemType {
CROP,
POT,
SPRINKLER,
GREENHOUSE,
SCARECROW
}

View File

@@ -0,0 +1,57 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.item;
import net.momirealms.customcrops.api.common.item.KeyItem;
import net.momirealms.customcrops.api.mechanic.action.ActionTrigger;
import net.momirealms.customcrops.api.mechanic.item.water.PassiveFillMethod;
import net.momirealms.customcrops.api.mechanic.misc.image.WaterBar;
import net.momirealms.customcrops.api.mechanic.requirement.Requirement;
import net.momirealms.customcrops.api.mechanic.requirement.State;
import java.util.HashSet;
public interface Pot extends KeyItem {
int getStorage();
String getKey();
HashSet<String> getPotBlocks();
PassiveFillMethod[] getPassiveFillMethods();
String getDryItem();
String getWetItem();
Requirement[] getPlaceRequirements();
Requirement[] getBreakRequirements();
Requirement[] getUseRequirements();
void trigger(ActionTrigger trigger, State state);
WaterBar getWaterBar();
boolean isRainDropAccepted();
boolean isNearbyWaterAccepted();
String getBlockState(boolean water, FertilizerType type);
}

View File

@@ -0,0 +1,25 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.item;
import net.momirealms.customcrops.api.common.item.KeyItem;
public interface Scarecrow extends KeyItem {
String getItemID();
}

View File

@@ -0,0 +1,60 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.item;
import net.momirealms.customcrops.api.common.item.KeyItem;
import net.momirealms.customcrops.api.mechanic.action.ActionTrigger;
import net.momirealms.customcrops.api.mechanic.item.water.PassiveFillMethod;
import net.momirealms.customcrops.api.mechanic.misc.image.WaterBar;
import net.momirealms.customcrops.api.mechanic.requirement.Requirement;
import net.momirealms.customcrops.api.mechanic.requirement.State;
import java.util.HashSet;
public interface Sprinkler extends KeyItem {
String get2DItemID();
String get3DItemID();
String get3DItemWithWater();
int getStorage();
int getRange();
boolean isInfinite();
int getWater();
HashSet<String> getPotWhitelist();
ItemCarrier getItemCarrier();
PassiveFillMethod[] getPassiveFillMethods();
Requirement[] getPlaceRequirements();
Requirement[] getBreakRequirements();
Requirement[] getUseRequirements();
void trigger(ActionTrigger trigger, State state);
WaterBar getWaterBar();
}

View File

@@ -0,0 +1,64 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.item;
import net.momirealms.customcrops.api.common.item.KeyItem;
import net.momirealms.customcrops.api.mechanic.action.ActionTrigger;
import net.momirealms.customcrops.api.mechanic.misc.image.WaterBar;
import net.momirealms.customcrops.api.mechanic.requirement.Requirement;
import net.momirealms.customcrops.api.mechanic.requirement.State;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.Nullable;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
public interface WateringCan extends KeyItem {
String getItemID();
int getWidth();
int getLength();
int getStorage();
int getWater();
boolean hasDynamicLore();
void updateItem(Player player, ItemStack itemStack, int water, Map<String, String> args);
int getCurrentWater(ItemStack itemStack);
HashSet<String> getPotWhitelist();
HashSet<String> getSprinklerWhitelist();
List<String> getLore();
@Nullable WaterBar getWaterBar();
Requirement[] getRequirements();
boolean isInfinite();
void trigger(ActionTrigger trigger, State state);
}

View File

@@ -0,0 +1,26 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.item.fertilizer;
import net.momirealms.customcrops.api.mechanic.item.Fertilizer;
public interface QualityCrop extends Fertilizer {
double getChance();
double[] getRatio();
}

View File

@@ -0,0 +1,25 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.item.fertilizer;
import net.momirealms.customcrops.api.mechanic.item.Fertilizer;
public interface SoilRetain extends Fertilizer {
double getChance();
}

View File

@@ -0,0 +1,25 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.item.fertilizer;
import net.momirealms.customcrops.api.mechanic.item.Fertilizer;
public interface SpeedGrow extends Fertilizer {
int getPointBonus();
}

View File

@@ -0,0 +1,25 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.item.fertilizer;
import net.momirealms.customcrops.api.mechanic.item.Fertilizer;
public interface Variation extends Fertilizer {
double getChanceBonus();
}

View File

@@ -0,0 +1,25 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.item.fertilizer;
import net.momirealms.customcrops.api.mechanic.item.Fertilizer;
public interface YieldIncrease extends Fertilizer {
int getAmountBonus();
}

View File

@@ -0,0 +1,49 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.item.water;
import net.momirealms.customcrops.api.manager.ActionManager;
import net.momirealms.customcrops.api.manager.RequirementManager;
import net.momirealms.customcrops.api.mechanic.action.Action;
import net.momirealms.customcrops.api.mechanic.requirement.Requirement;
import net.momirealms.customcrops.api.mechanic.requirement.State;
public abstract class AbstractFillMethod {
protected int amount;
private final Action[] actions;
private final Requirement[] requirements;
protected AbstractFillMethod(int amount, Action[] actions, Requirement[] requirements) {
this.amount = amount;
this.actions = actions;
this.requirements = requirements;
}
public int getAmount() {
return amount;
}
public void trigger(State state) {
ActionManager.triggerActions(state, actions);
}
public boolean canFill(State state) {
return RequirementManager.isRequirementMet(state, requirements);
}
}

View File

@@ -0,0 +1,54 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.item.water;
import net.momirealms.customcrops.api.mechanic.action.Action;
import net.momirealms.customcrops.api.mechanic.requirement.Requirement;
import org.jetbrains.annotations.Nullable;
public class PassiveFillMethod extends AbstractFillMethod {
private final String used;
private final int usedAmount;
private final String returned;
private final int returnedAmount;
public PassiveFillMethod(String used, int usedAmount, @Nullable String returned, int returnedAmount, int amount, Action[] actions, Requirement[] requirements) {
super(amount, actions, requirements);
this.used = used;
this.returned = returned;
this.usedAmount = usedAmount;
this.returnedAmount = returnedAmount;
}
public String getUsed() {
return used;
}
public String getReturned() {
return returned;
}
public int getUsedAmount() {
return usedAmount;
}
public int getReturnedAmount() {
return returnedAmount;
}
}

View File

@@ -0,0 +1,35 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.item.water;
import net.momirealms.customcrops.api.mechanic.action.Action;
import net.momirealms.customcrops.api.mechanic.requirement.Requirement;
public class PositiveFillMethod extends AbstractFillMethod {
private final String id;
public PositiveFillMethod(String id, int amount, Action[] actions, Requirement[] requirements) {
super(amount, actions, requirements);
this.id = id;
}
public String getId() {
return id;
}
}

View File

@@ -0,0 +1,25 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.misc;
import org.bukkit.entity.Player;
public interface Value {
double get(Player player);
}

View File

@@ -0,0 +1,32 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.misc.image;
public record WaterBar(String left, String empty, String full, String right) {
public static WaterBar of(String left, String empty, String full, String right) {
return new WaterBar(left, empty, full, right);
}
public String getWaterBar(int current, int max) {
return left +
String.valueOf(full).repeat(current) +
String.valueOf(empty).repeat(Math.max(max - current, 0)) +
right;
}
}

View File

@@ -0,0 +1,23 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.requirement;
public interface Requirement {
boolean isStateMet(State state);
}

View File

@@ -0,0 +1,29 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.requirement;
public abstract class RequirementExpansion {
public abstract String getVersion();
public abstract String getAuthor();
public abstract String getRequirementType();
public abstract RequirementFactory getRequirementFactory();
}

View File

@@ -0,0 +1,31 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.requirement;
import net.momirealms.customcrops.api.mechanic.action.Action;
import java.util.List;
public interface RequirementFactory {
Requirement build(Object args, List<Action> notMetActions, boolean advanced);
default Requirement build(Object args) {
return build(args, null, false);
}
}

View File

@@ -0,0 +1,71 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.requirement;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.Map;
public class State {
private final Player player;
private final ItemStack itemInHand;
private final Location location;
private final HashMap<String, String> args;
public State(Player player, ItemStack itemInHand, @NotNull Location location) {
this.player = player;
this.itemInHand = itemInHand;
this.location = location.toBlockLocation();
this.args = new HashMap<>();
if (player != null) {
setArg("{player}", player.getName());
}
setArg("{x}", String.valueOf(location.getBlockX()));
setArg("{y}", String.valueOf(location.getBlockY()));
setArg("{z}", String.valueOf(location.getBlockZ()));
}
public Player getPlayer() {
return player;
}
public ItemStack getItemInHand() {
return itemInHand;
}
public Location getLocation() {
return location;
}
public Map<String, String> getArgs() {
return args;
}
public void setArg(String key, String value) {
args.put(key, value);
}
public String getArg(String key) {
return args.get(key);
}
}

View File

@@ -0,0 +1,67 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.world;
import org.bukkit.Chunk;
import org.jetbrains.annotations.NotNull;
public record ChunkCoordinate(int x, int z) {
private static final ChunkCoordinate empty = new ChunkCoordinate(0, 0);
public static ChunkCoordinate of(int x, int z) {
return new ChunkCoordinate(x, z);
}
@Override
public int hashCode() {
long combined = (long) x << 32 | z;
return Long.hashCode(combined);
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final ChunkCoordinate other = (ChunkCoordinate) obj;
if (this.x != other.x) {
return false;
}
if (this.z != other.z) {
return false;
}
return true;
}
@NotNull
public static ChunkCoordinate getByBukkitChunk(@NotNull Chunk chunk) {
return new ChunkCoordinate(chunk.getX(), chunk.getZ());
}
@Override
public String toString() {
return "ChunkCoordinate{" +
"x=" + x +
", z=" + z +
'}';
}
}

View File

@@ -0,0 +1,87 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.world;
import java.util.Objects;
public class ChunkPos {
private final int position;
public ChunkPos(int position) {
this.position = position;
}
public ChunkPos(int x, int y, int z) {
this.position = ((x & 0xF) << 28) | ((z & 0xF) << 24) | (y & 0xFFFFFF);
}
public static ChunkPos getByLocation(SimpleLocation location) {
return new ChunkPos(location.getX() % 16, location.getY(), location.getZ() % 16);
}
public SimpleLocation getLocation(String world, ChunkCoordinate coordinate) {
return new SimpleLocation(world, coordinate.x() * 16 + getX(), getY(), coordinate.z() * 16 + getZ());
}
public int getPosition() {
return position;
}
public int getX() {
return (position >> 28) & 0xF;
}
public int getZ() {
return (position >> 24) & 0xF;
}
public int getSectionID() {
return getY() / 16;
}
public int getY() {
int y = position & 0xFFFFFF;
if ((y & 0x800000) != 0) {
y |= 0xFF000000;
}
return y;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ChunkPos chunkPos = (ChunkPos) o;
return position == chunkPos.position;
}
@Override
public int hashCode() {
return Objects.hash(position);
}
@Override
public String toString() {
return "ChunkPos{" +
"x=" + getX() +
"y=" + getY() +
"z=" + getZ() +
'}';
}
}

View File

@@ -0,0 +1,26 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.world;
import net.momirealms.customcrops.api.mechanic.item.ItemType;
import net.momirealms.customcrops.api.mechanic.world.level.DataBlock;
public interface CustomCropsBlock extends DataBlock, Tickable {
ItemType getType();
}

View File

@@ -0,0 +1,151 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.world;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.jetbrains.annotations.Nullable;
import java.util.Objects;
public class SimpleLocation {
private int x;
private int y;
private int z;
private String worldName;
private SimpleLocation() {
}
public SimpleLocation(String worldName, int x, int y, int z){
this.worldName = worldName;
this.x = x;
this.y = y;
this.z = z;
}
public int getX() {
return x;
}
public int getZ() {
return z;
}
public int getY() {
return y;
}
public String getWorldName() {
return worldName;
}
public ChunkCoordinate getChunkCoordinate() {
return new ChunkCoordinate(x >> 4, z >> 4);
}
public SimpleLocation add(int x, int y, int z) {
this.x += x;
this.y += y;
this.z += z;
return this;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final SimpleLocation other = (SimpleLocation) obj;
if (!Objects.equals(worldName, other.getWorldName())) {
return false;
}
if (this.x != other.x) {
return false;
}
if (this.y != other.y) {
return false;
}
if (this.z != other.z) {
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 3;
hash = 7 * hash + (int) (Double.doubleToLongBits(this.x) ^ (Double.doubleToLongBits(this.x) >>> 32));
hash = 13 * hash + (int) (Double.doubleToLongBits(this.y) ^ (Double.doubleToLongBits(this.y) >>> 32));
hash = 19 * hash + (int) (Double.doubleToLongBits(this.z) ^ (Double.doubleToLongBits(this.z) >>> 32));
return hash;
}
@Nullable
public Location getBukkitLocation() {
World world = Bukkit.getWorld(worldName);
if (world == null) return null;
return new Location(world, x, y, z);
}
@Nullable
public World getBukkitWorld() {
return Bukkit.getWorld(worldName);
}
public static SimpleLocation getByString(String location) {
String[] loc = location.split(",", 4);
return new SimpleLocation(loc[0], Integer.parseInt(loc[1]), Integer.parseInt(loc[2]), Integer.parseInt(loc[3]));
}
public static SimpleLocation of(Location location) {
return new SimpleLocation(location.getWorld().getName(), location.getBlockX(), location.getBlockY(), location.getBlockZ());
}
@Override
public String toString() {
return "SimpleLocation{" +
"x=" + x +
", y=" + y +
", z=" + z +
", worldName='" + worldName + '\'' +
'}';
}
public boolean isNear(SimpleLocation simpleLocation, int distance) {
if (Math.abs(simpleLocation.x - this.x) > distance) {
return false;
}
if (Math.abs(simpleLocation.z - this.z) > distance) {
return false;
}
if (Math.abs(simpleLocation.y - this.y) > distance) {
return false;
}
return true;
}
public SimpleLocation copy() {
return new SimpleLocation(worldName, x, y, z);
}
}

View File

@@ -0,0 +1,67 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.world;
import com.flowpowered.nbt.CompoundMap;
import com.flowpowered.nbt.Tag;
import java.util.Objects;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class SynchronizedCompoundMap {
private final CompoundMap compoundMap;
private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
private final java.util.concurrent.locks.Lock readLock = rwLock.readLock();
private final java.util.concurrent.locks.Lock writeLock = rwLock.writeLock();
public SynchronizedCompoundMap(CompoundMap compoundMap) {
this.compoundMap = compoundMap;
}
public CompoundMap getOriginalMap() {
return compoundMap;
}
public Tag<?> get(String key) {
readLock.lock();
try {
return compoundMap.get(key);
} finally {
readLock.unlock();
}
}
public Tag<?> put(String key, Tag<?> tag) {
writeLock.lock();
try {
return compoundMap.put(key, tag);
} finally {
writeLock.unlock();
}
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SynchronizedCompoundMap that = (SynchronizedCompoundMap) o;
return Objects.equals(compoundMap, that.compoundMap);
}
}

View File

@@ -0,0 +1,6 @@
package net.momirealms.customcrops.api.mechanic.world;
public interface Tickable {
void tick(int interval);
}

View File

@@ -0,0 +1,73 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.world.level;
import com.flowpowered.nbt.CompoundMap;
import com.flowpowered.nbt.IntTag;
import com.flowpowered.nbt.Tag;
import net.momirealms.customcrops.api.mechanic.world.SimpleLocation;
import net.momirealms.customcrops.api.mechanic.world.SynchronizedCompoundMap;
public class AbstractCustomCropsBlock implements DataBlock {
private final SimpleLocation location;
private final SynchronizedCompoundMap compoundMap;
public AbstractCustomCropsBlock(SimpleLocation location, CompoundMap compoundMap) {
this.compoundMap = new SynchronizedCompoundMap(compoundMap);
this.location = location;
}
@Override
public void setData(String key, Tag<?> tag) {
compoundMap.put(key, tag);
}
@Override
public Tag<?> getData(String name) {
return compoundMap.get(name);
}
@Override
public SynchronizedCompoundMap getCompoundMap() {
return compoundMap;
}
@Override
public SimpleLocation getLocation() {
return location;
}
public boolean canTick(int interval) {
if (interval == 1) {
return true;
}
Tag<?> tag = getData("tick");
int tick = 0;
if (tag != null) {
tick = tag.getAsIntTag().map(IntTag::getValue).orElse(0);
}
if (++tick >= interval) {
setData("tick", new IntTag("tick", 0));
return true;
} else {
setData("tick", new IntTag("tick", tick));
}
return false;
}
}

View File

@@ -0,0 +1,105 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.world.level;
import net.momirealms.customcrops.api.mechanic.item.Crop;
import net.momirealms.customcrops.api.mechanic.item.Fertilizer;
import net.momirealms.customcrops.api.mechanic.item.Pot;
import net.momirealms.customcrops.api.mechanic.item.Sprinkler;
import net.momirealms.customcrops.api.mechanic.world.ChunkCoordinate;
import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
import net.momirealms.customcrops.api.mechanic.world.SimpleLocation;
import java.util.Optional;
public interface CustomCropsChunk {
void notifyOfflineUpdates();
CustomCropsWorld getCustomCropsWorld();
ChunkCoordinate getChunkCoordinate();
void secondTimer();
long getLastLoadedTime();
int getLoadedSeconds();
Optional<WorldCrop> getCropAt(SimpleLocation location);
Optional<WorldSprinkler> getSprinklerAt(SimpleLocation location);
Optional<WorldPot> getPotAt(SimpleLocation location);
Optional<WorldGlass> getGlassAt(SimpleLocation location);
Optional<WorldScarecrow> getScarecrowAt(SimpleLocation location);
Optional<CustomCropsBlock> getBlockAt(SimpleLocation location);
void addWaterToSprinkler(Sprinkler sprinkler, SimpleLocation location, int amount);
void addFertilizerToPot(Pot pot, Fertilizer fertilizer, SimpleLocation location);
void addWaterToPot(Pot pot, SimpleLocation location, int amount);
void removeSprinklerAt(SimpleLocation location);
void removePotAt(SimpleLocation location);
void removeCropAt(SimpleLocation location);
void removeGlassAt(SimpleLocation location);
void removeScarecrowAt(SimpleLocation location);
CustomCropsBlock removeBlockAt(SimpleLocation location);
CustomCropsBlock addBlockAt(CustomCropsBlock block, SimpleLocation location);
int getCropAmount();
int getPotAmount();
int getSprinklerAmount();
void addPotAt(WorldPot pot, SimpleLocation location);
void addSprinklerAt(WorldSprinkler sprinkler, SimpleLocation location);
void addCropAt(WorldCrop crop, SimpleLocation location);
void addPointToCrop(Crop crop, SimpleLocation location, int points);
void addGlassAt(WorldGlass glass, SimpleLocation location);
void addScarecrowAt(WorldScarecrow scarecrow, SimpleLocation location);
void updateLastLoadedTime();
CustomCropsSection[] getSections();
CustomCropsSection getSection(int sectionID);
int getUnloadedSeconds();
void setUnloadedSeconds(int unloadedSeconds);
boolean canPrune();
}

View File

@@ -0,0 +1,40 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.world.level;
import net.momirealms.customcrops.api.mechanic.world.ChunkPos;
import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
import java.util.Map;
public interface CustomCropsSection {
int getSectionID();
CustomCropsBlock getBlockAt(ChunkPos pos);
CustomCropsBlock removeBlockAt(ChunkPos pos);
CustomCropsBlock addBlockAt(ChunkPos pos, CustomCropsBlock block);
boolean canPrune();
CustomCropsBlock[] getBlocks();
Map<ChunkPos, CustomCropsBlock> getBlockMap();
}

View File

@@ -0,0 +1,114 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.world.level;
import net.momirealms.customcrops.api.mechanic.item.Crop;
import net.momirealms.customcrops.api.mechanic.item.Fertilizer;
import net.momirealms.customcrops.api.mechanic.item.Pot;
import net.momirealms.customcrops.api.mechanic.item.Sprinkler;
import net.momirealms.customcrops.api.mechanic.world.ChunkCoordinate;
import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
import net.momirealms.customcrops.api.mechanic.world.SimpleLocation;
import net.momirealms.customcrops.api.mechanic.world.season.Season;
import org.bukkit.World;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.Optional;
public interface CustomCropsWorld {
void startTick();
void cancelTick();
CustomCropsChunk removeLazyChunkAt(ChunkCoordinate chunkCoordinate);
WorldSetting getWorldSetting();
void setWorldSetting(WorldSetting setting);
Collection<? extends CustomCropsChunk> getChunkStorage();
World getWorld();
String getWorldName();
boolean isChunkLoaded(ChunkCoordinate chunkCoordinate);
Optional<CustomCropsChunk> getChunkAt(ChunkCoordinate chunkCoordinate);
void loadChunk(CustomCropsChunk chunk);
void unloadChunk(ChunkCoordinate chunkCoordinate);
void setInfoData(WorldInfoData infoData);
WorldInfoData getInfoData();
@Nullable
Season getSeason();
Optional<WorldSprinkler> getSprinklerAt(SimpleLocation location);
Optional<WorldPot> getPotAt(SimpleLocation location);
Optional<WorldCrop> getCropAt(SimpleLocation location);
Optional<WorldGlass> getGlassAt(SimpleLocation location);
Optional<WorldScarecrow> getScarecrowAt(SimpleLocation location);
Optional<CustomCropsBlock> getBlockAt(SimpleLocation location);
void addWaterToSprinkler(Sprinkler sprinkler, SimpleLocation location, int amount);
void addFertilizerToPot(Pot pot, Fertilizer fertilizer, SimpleLocation location);
void addWaterToPot(Pot pot, SimpleLocation location, int amount);
void removeSprinklerAt(SimpleLocation location);
void removePotAt(SimpleLocation location);
void removeCropAt(SimpleLocation location);
void removeGlassAt(SimpleLocation location);
void removeScarecrowAt(SimpleLocation location);
CustomCropsBlock removeAnythingAt(SimpleLocation location);
boolean isPotReachLimit(SimpleLocation location);
boolean isCropReachLimit(SimpleLocation location);
boolean isSprinklerReachLimit(SimpleLocation location);
void addPotAt(WorldPot pot, SimpleLocation location);
void addSprinklerAt(WorldSprinkler sprinkler, SimpleLocation location);
void addCropAt(WorldCrop crop, SimpleLocation location);
void addPointToCrop(Crop crop, SimpleLocation location, int points);
void addGlassAt(WorldGlass glass, SimpleLocation location);
void addScarecrowAt(WorldScarecrow scarecrow, SimpleLocation location);
}

View File

@@ -0,0 +1,33 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.world.level;
import com.flowpowered.nbt.Tag;
import net.momirealms.customcrops.api.mechanic.world.SimpleLocation;
import net.momirealms.customcrops.api.mechanic.world.SynchronizedCompoundMap;
public interface DataBlock {
void setData(String key, Tag<?> tag);
Tag<?> getData(String key);
SynchronizedCompoundMap getCompoundMap();
SimpleLocation getLocation();
}

View File

@@ -15,28 +15,18 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.object;
package net.momirealms.customcrops.api.mechanic.world.level;
/**
* Crops
*/
public interface CCGrowingCrop {
import net.momirealms.customcrops.api.mechanic.item.Crop;
import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
/**
* Get the crop growing point
* @return point
*/
int getPoints();
public interface WorldCrop extends CustomCropsBlock {
/**
* Set the growing point
* @param points points
*/
void setPoints(int points);
/**
* Get the crop config key
* @return crop key
*/
String getKey();
int getPoint();
void setPoint(int point);
Crop getConfig();
}

View File

@@ -0,0 +1,23 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.world.level;
import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
public interface WorldGlass extends CustomCropsBlock {
}

View File

@@ -0,0 +1,63 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.world.level;
import com.google.gson.annotations.SerializedName;
import net.momirealms.customcrops.api.mechanic.world.season.Season;
public class WorldInfoData {
@SerializedName("season")
private Season season;
@SerializedName("date")
private int date;
public WorldInfoData(Season season, int date) {
this.season = season;
this.date = date;
}
public static WorldInfoData empty() {
return new WorldInfoData(Season.SPRING, 1);
}
public Season getSeason() {
if (season == null) season = Season.SPRING;
return season;
}
public void setSeason(Season season) {
this.season = season;
}
public int getDate() {
return date;
}
public void setDate(int date) {
this.date = date;
}
@Override
public String toString() {
return "WorldInfoData{" +
"season=" + season +
", date=" + date +
'}';
}
}

View File

@@ -0,0 +1,45 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.world.level;
import net.momirealms.customcrops.api.mechanic.item.Fertilizer;
import net.momirealms.customcrops.api.mechanic.item.Pot;
import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
public interface WorldPot extends CustomCropsBlock {
String getKey();
int getWater();
void setWater(int water);
Fertilizer getFertilizer();
void setFertilizer(Fertilizer fertilizer);
void removeFertilizer();
int getFertilizerTimes();
void setFertilizerTimes(int times);
Pot getConfig();
void tickWater(CustomCropsChunk chunk);
}

View File

@@ -0,0 +1,23 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.world.level;
import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
public interface WorldScarecrow extends CustomCropsBlock {
}

View File

@@ -0,0 +1,191 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.world.level;
public class WorldSetting implements Cloneable {
private final boolean enableScheduler;
private final int minTickUnit;
private final int tickCropInterval;
private final int tickPotInterval;
private final int tickSprinklerInterval;
private final boolean offlineGrow;
private final boolean enableSeason;
private final boolean autoSeasonChange;
private final int seasonDuration;
private final int cropPerChunk;
private final int potPerChunk;
private final int sprinklerPerChunk;
private final int randomTickSpeed;
private final boolean tickCropRandomly;
private final boolean tickPotRandomly;
private final boolean tickSprinklerRandomly;
private final boolean scheduledTick;
private WorldSetting(
boolean enableScheduler,
int minTickUnit,
boolean tickCropRandomly,
int tickCropInterval,
boolean tickPotRandomly,
int tickPotInterval,
boolean tickSprinklerRandomly,
int tickSprinklerInterval,
boolean offlineGrow,
boolean enableSeason,
boolean autoSeasonChange,
int seasonDuration,
int cropPerChunk,
int potPerChunk,
int sprinklerPerChunk,
int randomTickSpeed
) {
this.enableScheduler = enableScheduler;
this.minTickUnit = minTickUnit;
this.tickCropInterval = tickCropInterval;
this.tickPotInterval = tickPotInterval;
this.tickSprinklerInterval = tickSprinklerInterval;
this.offlineGrow = offlineGrow;
this.enableSeason = enableSeason;
this.autoSeasonChange = autoSeasonChange;
this.seasonDuration = seasonDuration;
this.cropPerChunk = cropPerChunk;
this.potPerChunk = potPerChunk;
this.sprinklerPerChunk = sprinklerPerChunk;
this.randomTickSpeed = randomTickSpeed;
this.tickCropRandomly = tickCropRandomly;
this.tickPotRandomly = tickPotRandomly;
this.tickSprinklerRandomly = tickSprinklerRandomly;
this.scheduledTick = !(tickCropRandomly && tickPotRandomly && tickSprinklerRandomly);
}
public static WorldSetting of(
boolean enableScheduler,
int minTickUnit,
boolean tickCropRandomly,
int tickCropInterval,
boolean tickPotRandomly,
int tickPotInterval,
boolean tickSprinklerRandomly,
int tickSprinklerInterval,
boolean offlineGrow,
boolean enableSeason,
boolean autoSeasonChange,
int seasonDuration,
int cropPerChunk,
int potPerChunk,
int sprinklerPerChunk,
int randomTickSpeed
) {
return new WorldSetting(
enableScheduler,
minTickUnit,
tickCropRandomly,
tickCropInterval,
tickPotRandomly,
tickPotInterval,
tickSprinklerRandomly,
tickSprinklerInterval,
offlineGrow,
enableSeason,
autoSeasonChange,
seasonDuration,
cropPerChunk,
potPerChunk,
sprinklerPerChunk,
randomTickSpeed
);
}
public boolean isEnableScheduler() {
return enableScheduler;
}
public int getMinTickUnit() {
return minTickUnit;
}
public int getTickCropInterval() {
return tickCropInterval;
}
public int getTickPotInterval() {
return tickPotInterval;
}
public int getTickSprinklerInterval() {
return tickSprinklerInterval;
}
public boolean isOfflineGrow() {
return offlineGrow;
}
public boolean isEnableSeason() {
return enableSeason;
}
public boolean isAutoSeasonChange() {
return autoSeasonChange;
}
public int getSeasonDuration() {
return seasonDuration;
}
public int getPotPerChunk() {
return potPerChunk;
}
public int getCropPerChunk() {
return cropPerChunk;
}
public int getSprinklerPerChunk() {
return sprinklerPerChunk;
}
public int getRandomTickSpeed() {
return randomTickSpeed;
}
public boolean isScheduledTick() {
return scheduledTick;
}
@Override
public WorldSetting clone() {
try {
return (WorldSetting) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
public boolean randomTickCrop() {
return tickCropRandomly;
}
public boolean randomTickSprinkler() {
return tickSprinklerRandomly;
}
public boolean randomTickPot() {
return tickPotRandomly;
}
}

View File

@@ -15,28 +15,18 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.object;
package net.momirealms.customcrops.api.mechanic.world.level;
/**
* Sprinkler
*/
public interface CCSprinkler {
import net.momirealms.customcrops.api.mechanic.item.Sprinkler;
import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
public interface WorldSprinkler extends CustomCropsBlock {
/**
* Get the remaining water
* @return water amount
*/
int getWater();
/**
* Set the remaining water
* @param water water
*/
void setWater(int water);
/**
* Get the sprinkler config key
* @return sprinkler key
*/
String getKey();
Sprinkler getConfig();
}

View File

@@ -0,0 +1,30 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.world.season;
public enum Season {
SPRING,
SUMMER,
AUTUMN,
WINTER;
public Season getNextSeason() {
return Season.values()[(this.ordinal() + 1) % 4];
}
}

View File

@@ -1,67 +0,0 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.object;
/**
* Pot
*/
public interface CCPot {
/**
* Get the pot config key
* @return key
*/
String getKey();
/**
* Get the fertilizer inside the pot
* @return fertilizer
*/
CCFertilizer getFertilizer();
/**
* Set the fertilizer to the pot
* @param fertilizer fertilizer
*/
void setFertilizer(CCFertilizer fertilizer);
/**
* Get the water amount
* @return water amount
*/
int getWater();
/**
* Whether the pot is wet
* @return wet or not
*/
boolean isWet();
/**
* Add water to pot
* @param amount water amount
* @return whether the pot is previously dry
*/
boolean addWater(int amount);
/**
* Set water amount
* @param amount amount
*/
void setWater(int amount);
}

View File

@@ -15,22 +15,19 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.object;
package net.momirealms.customcrops.api.scheduler;
/**
* Season
*/
public interface CCWorldSeason {
public interface CancellableTask {
/**
* SPRING, SUMMER, AUTUMN, WINTER
* @return season
* Cancel the task
*/
String getSeason();
void cancel();
/**
* Get the season display name
* @return display name
* Get if the task is cancelled or not
*
* @return cancelled or not
*/
String getDisplay();
boolean isCancelled();
}

View File

@@ -0,0 +1,93 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.scheduler;
import org.bukkit.Location;
import java.util.concurrent.TimeUnit;
public interface Scheduler {
/**
* Runs a task synchronously on the main server thread or region thread.
*
* @param runnable The task to run.
* @param location The location associated with the task.
*/
void runTaskSync(Runnable runnable, Location location);
/**
* Runs a task synchronously with a specified delay and period.
*
* @param runnable The task to run.
* @param location The location associated with the task.
* @param delayTicks The delay in ticks before the first execution.
* @param periodTicks The period between subsequent executions in ticks.
* @return A CancellableTask for managing the scheduled task.
*/
CancellableTask runTaskSyncTimer(Runnable runnable, Location location, long delayTicks, long periodTicks);
/**
* Runs a task asynchronously with a specified delay.
*
* @param runnable The task to run.
* @param delay The delay before the task execution.
* @param timeUnit The time unit for the delay.
* @return A CancellableTask for managing the scheduled task.
*/
CancellableTask runTaskAsyncLater(Runnable runnable, long delay, TimeUnit timeUnit);
/**
* Runs a task asynchronously.
*
* @param runnable The task to run.
*/
void runTaskAsync(Runnable runnable);
/**
* Runs a task synchronously with a specified delay.
*
* @param runnable The task to run.
* @param location The location associated with the task.
* @param delay The delay before the task execution.
* @param timeUnit The time unit for the delay.
* @return A CancellableTask for managing the scheduled task.
*/
CancellableTask runTaskSyncLater(Runnable runnable, Location location, long delay, TimeUnit timeUnit);
/**
* Runs a task synchronously with a specified delay in ticks.
*
* @param runnable The task to run.
* @param location The location associated with the task.
* @param delayTicks The delay in ticks before the task execution.
* @return A CancellableTask for managing the scheduled task.
*/
CancellableTask runTaskSyncLater(Runnable runnable, Location location, long delayTicks);
/**
* Runs a task asynchronously with a specified delay and period.
*
* @param runnable The task to run.
* @param delay The delay before the first execution.
* @param period The period between subsequent executions.
* @param timeUnit The time unit for the delay and period.
* @return A CancellableTask for managing the scheduled task.
*/
CancellableTask runTaskAsyncTimer(Runnable runnable, long delay, long period, TimeUnit timeUnit);
}

View File

@@ -0,0 +1,44 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.util;
import org.bukkit.Bukkit;
import org.bukkit.Location;
public class LocationUtils {
private LocationUtils() {}
/**
* Calculates the Euclidean distance between two locations in 3D space.
*
* @param location1 The first location
* @param location2 The second location
* @return The Euclidean distance between the two locations
*/
public static double getDistance(Location location1, Location location2) {
return Math.sqrt(Math.pow(location2.getX() - location1.getX(), 2) +
Math.pow(location2.getY() - location1.getY(), 2) +
Math.pow(location2.getZ() - location1.getZ(), 2)
);
}
public static Location getAnyLocationInstance() {
return new Location(Bukkit.getWorlds().get(0), 0, 64, 0);
}
}

View File

@@ -0,0 +1,78 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.util;
import net.momirealms.customcrops.api.CustomCropsPlugin;
import org.jetbrains.annotations.NotNull;
import java.util.logging.Level;
/**
* Utility class for logging messages with various log levels.
*/
public final class LogUtils {
private LogUtils() {}
/**
* Log an informational message.
*
* @param message The message to log.
*/
public static void info(@NotNull String message) {
CustomCropsPlugin.getInstance().getLogger().info(message);
}
/**
* Log a warning message.
*
* @param message The message to log.
*/
public static void warn(@NotNull String message) {
CustomCropsPlugin.getInstance().getLogger().warning(message);
}
/**
* Log a severe error message.
*
* @param message The message to log.
*/
public static void severe(@NotNull String message) {
CustomCropsPlugin.getInstance().getLogger().severe(message);
}
/**
* Log a warning message with a throwable exception.
*
* @param message The message to log.
* @param throwable The throwable exception to log.
*/
public static void warn(@NotNull String message, Throwable throwable) {
CustomCropsPlugin.getInstance().getLogger().log(Level.WARNING, message, throwable);
}
/**
* Log a severe error message with a throwable exception.
*
* @param message The message to log.
* @param throwable The throwable exception to log.
*/
public static void severe(@NotNull String message, Throwable throwable) {
CustomCropsPlugin.getInstance().getLogger().log(Level.SEVERE, message, throwable);
}
}