9
0
mirror of https://github.com/Xiao-MoMi/Custom-Crops.git synced 2025-12-22 08:29:35 +00:00
This commit is contained in:
Xiao-MoMi
2022-10-11 18:32:10 +08:00
parent 41810c090e
commit f774887120
17 changed files with 349 additions and 115 deletions

View File

@@ -4,7 +4,7 @@ plugins {
} }
group = 'net.momirealms' group = 'net.momirealms'
version = '2.0-r1-hotfix' version = '2.0-r3'
repositories { repositories {
mavenCentral() mavenCentral()

View File

@@ -77,6 +77,7 @@ public class ConfigUtil {
if (CustomCrops.plugin.getCropManager() != null) { if (CustomCrops.plugin.getCropManager() != null) {
CustomCrops.plugin.getCropManager().loadMode(); CustomCrops.plugin.getCropManager().loadMode();
CustomCrops.plugin.getCropManager().loadSeason(); CustomCrops.plugin.getCropManager().loadSeason();
CustomCrops.plugin.getCropManager().loadPacket();
} }
} }
} }

View File

@@ -90,6 +90,14 @@ public class MainConfig {
public static boolean autoBackUp; public static boolean autoBackUp;
public static boolean needSkyLight; public static boolean needSkyLight;
public static int skyLightLevel; public static int skyLightLevel;
public static boolean enableWaterCanLore;
public static boolean enablePacketLore;
public static List<String> waterCanLore;
public static String waterBarLeft;
public static String waterBarFull;
public static String waterBarEmpty;
public static String waterBarRight;
public static boolean topOrBottom;
public static void load() { public static void load() {
ConfigUtil.update("config.yml"); ConfigUtil.update("config.yml");
@@ -105,12 +113,15 @@ public class MainConfig {
worlds[i] = Bukkit.getWorld(worldsName.get(i)); worlds[i] = Bukkit.getWorld(worldsName.get(i));
} }
} }
if (worlds != null) {
worldList = List.of(worlds); worldList = new ArrayList<>();
} for (World world : worlds) {
else { if (world == null) continue;
worldList = new ArrayList<>(); worldList.add(world);
} }
worlds = worldList.toArray(new World[0]);
cropMode = config.getString("mechanics.crops-mode", "tripwire").equals("tripwire"); cropMode = config.getString("mechanics.crops-mode", "tripwire").equals("tripwire");
limitation = config.getBoolean("optimization.limitation.enable", true); limitation = config.getBoolean("optimization.limitation.enable", true);
wireAmount = config.getInt("optimization.limitation.tripwire-amount", 64); wireAmount = config.getInt("optimization.limitation.tripwire-amount", 64);
@@ -132,8 +143,8 @@ public class MainConfig {
preventInWrongSeason = config.getBoolean("mechanics.prevent-plant-if-wrong-season", true); preventInWrongSeason = config.getBoolean("mechanics.prevent-plant-if-wrong-season", true);
notifyInWrongSeason = config.getBoolean("mechanics.should-notify-if-wrong-season", true); notifyInWrongSeason = config.getBoolean("mechanics.should-notify-if-wrong-season", true);
enableBoneMeal = config.getBoolean("mechanics.bone-meal", true); enableBoneMeal = config.getBoolean("mechanics.bone-meal.enable", true);
boneMealChance = config.getDouble("mechanics.chance", 0.5); boneMealChance = config.getDouble("mechanics.bone-meal.chance", 0.5);
syncSeason = config.getBoolean("mechanics.season.sync-seasons.enable", false); syncSeason = config.getBoolean("mechanics.season.sync-seasons.enable", false);
syncWorld = Bukkit.getWorld(config.getString("mechanics.season.sync-seasons.world", "world")); syncWorld = Bukkit.getWorld(config.getString("mechanics.season.sync-seasons.world", "world"));
@@ -144,7 +155,7 @@ public class MainConfig {
enableAnimations = !config.getBoolean("optimization.disable-sprinkler-animation", false); enableAnimations = !config.getBoolean("optimization.disable-sprinkler-animation", false);
try { try {
boneMealSuccess = Particle.valueOf(config.getString("mechanics.success-particle", "VILLAGER_HAPPY")); boneMealSuccess = Particle.valueOf(config.getString("mechanics.bone-meal.success-particle", "VILLAGER_HAPPY"));
} }
catch (IllegalArgumentException e) { catch (IllegalArgumentException e) {
AdventureUtil.consoleMessage("<red>[CustomCrops] Illegal Particle Argument for Bone Meal</red>"); AdventureUtil.consoleMessage("<red>[CustomCrops] Illegal Particle Argument for Bone Meal</red>");
@@ -184,44 +195,53 @@ public class MainConfig {
fertilizerInfoDuration = config.getInt("hologram.fertilizer-info.duration", 1); fertilizerInfoDuration = config.getInt("hologram.fertilizer-info.duration", 1);
fertilizerInfo = config.getString("hologram.fertilizer-info.text", "<font:customcrops:default>{fertilizer}</font> <white>{times}<gray>/<white>{max_times}"); fertilizerInfo = config.getString("hologram.fertilizer-info.text", "<font:customcrops:default>{fertilizer}</font> <white>{times}<gray>/<white>{max_times}");
enableWaterCanLore = config.getBoolean("watering-can-lore.enable", true);
enablePacketLore = config.getBoolean("watering-can-lore.packets.enable", true);
topOrBottom = config.getBoolean("watering-can-lore.packets.top-or-bottom", true);
waterCanLore = config.getStringList("watering-can-lore.lore");
waterBarLeft = config.getString("watering-can-lore.water-bar.left", "<font:customcrops:default>뀂");
waterBarFull = config.getString("watering-can-lore.water-bar.full", "뀁뀃");
waterBarEmpty = config.getString("watering-can-lore.water-bar.empty", "뀁뀄");
waterBarRight = config.getString("watering-can-lore.water-bar.right", "뀁뀅</font>");
antiGriefs = new ArrayList<>(); antiGriefs = new ArrayList<>();
if (config.getBoolean("config.integration.Residence",false)){ if (config.getBoolean("integration.Residence",false)){
if (Bukkit.getPluginManager().getPlugin("Residence") == null) Log.warn("Failed to initialize Residence!"); if (Bukkit.getPluginManager().getPlugin("Residence") == null) Log.warn("Failed to initialize Residence!");
else {antiGriefs.add(new ResidenceHook());hookMessage("Residence");} else {antiGriefs.add(new ResidenceHook());hookMessage("Residence");}
} }
if (config.getBoolean("config.integration.Kingdoms",false)){ if (config.getBoolean("integration.Kingdoms",false)){
if (Bukkit.getPluginManager().getPlugin("Kingdoms") == null) Log.warn("Failed to initialize Kingdoms!"); if (Bukkit.getPluginManager().getPlugin("Kingdoms") == null) Log.warn("Failed to initialize Kingdoms!");
else {antiGriefs.add(new KingdomsXHook());hookMessage("Kingdoms");} else {antiGriefs.add(new KingdomsXHook());hookMessage("Kingdoms");}
} }
if (config.getBoolean("config.integration.WorldGuard",false)){ if (config.getBoolean("integration.WorldGuard",false)){
if (Bukkit.getPluginManager().getPlugin("WorldGuard") == null) Log.warn("Failed to initialize WorldGuard!"); if (Bukkit.getPluginManager().getPlugin("WorldGuard") == null) Log.warn("Failed to initialize WorldGuard!");
else {antiGriefs.add(new WorldGuardHook());hookMessage("WorldGuard");} else {antiGriefs.add(new WorldGuardHook());hookMessage("WorldGuard");}
} }
if (config.getBoolean("config.integration.GriefDefender",false)){ if (config.getBoolean("integration.GriefDefender",false)){
if(Bukkit.getPluginManager().getPlugin("GriefDefender") == null) Log.warn("Failed to initialize GriefDefender!"); if(Bukkit.getPluginManager().getPlugin("GriefDefender") == null) Log.warn("Failed to initialize GriefDefender!");
else {antiGriefs.add(new GriefDefenderHook());hookMessage("GriefDefender");} else {antiGriefs.add(new GriefDefenderHook());hookMessage("GriefDefender");}
} }
if (config.getBoolean("config.integration.PlotSquared",false)){ if (config.getBoolean("integration.PlotSquared",false)){
if(Bukkit.getPluginManager().getPlugin("PlotSquared") == null) Log.warn("Failed to initialize PlotSquared!"); if(Bukkit.getPluginManager().getPlugin("PlotSquared") == null) Log.warn("Failed to initialize PlotSquared!");
else {antiGriefs.add(new PlotSquaredHook());hookMessage("PlotSquared");} else {antiGriefs.add(new PlotSquaredHook());hookMessage("PlotSquared");}
} }
if (config.getBoolean("config.integration.Towny",false)){ if (config.getBoolean("integration.Towny",false)){
if (Bukkit.getPluginManager().getPlugin("Towny") == null) Log.warn("Failed to initialize Towny!"); if (Bukkit.getPluginManager().getPlugin("Towny") == null) Log.warn("Failed to initialize Towny!");
else {antiGriefs.add(new TownyHook());hookMessage("Towny");} else {antiGriefs.add(new TownyHook());hookMessage("Towny");}
} }
if (config.getBoolean("config.integration.Lands",false)){ if (config.getBoolean("integration.Lands",false)){
if (Bukkit.getPluginManager().getPlugin("Lands") == null) Log.warn("Failed to initialize Lands!"); if (Bukkit.getPluginManager().getPlugin("Lands") == null) Log.warn("Failed to initialize Lands!");
else {antiGriefs.add(new LandsHook());hookMessage("Lands");} else {antiGriefs.add(new LandsHook());hookMessage("Lands");}
} }
if (config.getBoolean("config.integration.GriefPrevention",false)){ if (config.getBoolean("integration.GriefPrevention",false)){
if (Bukkit.getPluginManager().getPlugin("GriefPrevention") == null) Log.warn("Failed to initialize GriefPrevention!"); if (Bukkit.getPluginManager().getPlugin("GriefPrevention") == null) Log.warn("Failed to initialize GriefPrevention!");
else {antiGriefs.add(new GriefPreventionHook());hookMessage("GriefPrevention");} else {antiGriefs.add(new GriefPreventionHook());hookMessage("GriefPrevention");}
} }
if (config.getBoolean("config.integration.CrashClaim",false)){ if (config.getBoolean("integration.CrashClaim",false)){
if (Bukkit.getPluginManager().getPlugin("CrashClaim") == null) Log.warn("Failed to initialize CrashClaim!"); if (Bukkit.getPluginManager().getPlugin("CrashClaim") == null) Log.warn("Failed to initialize CrashClaim!");
else {antiGriefs.add(new CrashClaimHook());hookMessage("CrashClaim");} else {antiGriefs.add(new CrashClaimHook());hookMessage("CrashClaim");}
} }
if (config.getBoolean("config.integration.BentoBox",false)){ if (config.getBoolean("integration.BentoBox",false)){
if (Bukkit.getPluginManager().getPlugin("BentoBox") == null) Log.warn("Failed to initialize BentoBox!"); if (Bukkit.getPluginManager().getPlugin("BentoBox") == null) Log.warn("Failed to initialize BentoBox!");
else {antiGriefs.add(new BentoBoxHook());hookMessage("BentoBox");} else {antiGriefs.add(new BentoBoxHook());hookMessage("BentoBox");}
} }
@@ -276,6 +296,6 @@ public class MainConfig {
} }
private static void hookMessage(String plugin){ private static void hookMessage(String plugin){
AdventureUtil.consoleMessage("[CustomCrops] <gold>" + plugin + " <color:#FFEBCD>Hooked!"); AdventureUtil.consoleMessage("[CustomCrops] <white>" + plugin + " Hooked!");
} }
} }

View File

@@ -17,7 +17,10 @@
package net.momirealms.customcrops.integrations.customplugin; package net.momirealms.customcrops.integrations.customplugin;
import de.tr7zw.changeme.nbtapi.NBTCompound;
import de.tr7zw.changeme.nbtapi.NBTItem; import de.tr7zw.changeme.nbtapi.NBTItem;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import net.momirealms.customcrops.CustomCrops; import net.momirealms.customcrops.CustomCrops;
import net.momirealms.customcrops.Function; import net.momirealms.customcrops.Function;
import net.momirealms.customcrops.api.crop.Crop; import net.momirealms.customcrops.api.crop.Crop;
@@ -74,6 +77,13 @@ public abstract class HandlerP extends Function {
//null //null
} }
public boolean coolDownJudge(Player player) {
long time = System.currentTimeMillis();
if (time - (coolDown.getOrDefault(player, time - 50)) < 50) return false;
coolDown.put(player, time);
return true;
}
public void onInteractSprinkler(Location location, Player player, @Nullable ItemStack itemStack, Sprinkler config) { public void onInteractSprinkler(Location location, Player player, @Nullable ItemStack itemStack, Sprinkler config) {
CustomWorld customWorld = cropManager.getCustomWorld(location.getWorld()); CustomWorld customWorld = cropManager.getCustomWorld(location.getWorld());
@@ -110,45 +120,57 @@ public abstract class HandlerP extends Function {
} }
} }
else if (itemStack.getType() != Material.AIR) { else if (itemStack.getType() != Material.AIR) {
NBTItem nbtItem = new NBTItem(itemStack);
int canWater = nbtItem.getInteger("WaterAmount");
if (canWater > 0) {
SprinklerFillEvent sprinklerFillEvent = new SprinklerFillEvent(player, itemStack); String canID = customInterface.getItemID(itemStack);
Bukkit.getPluginManager().callEvent(sprinklerFillEvent); WaterCan canConfig = WaterCanConfig.CANS.get(canID);
if (sprinklerFillEvent.isCancelled()) { if (canConfig != null) {
return;
}
nbtItem.setInteger("WaterAmount", --canWater); NBTItem nbtItem = new NBTItem(itemStack);
itemStack.setItemMeta(nbtItem.getItem().getItemMeta()); int canWater = nbtItem.getInteger("WaterAmount");
int water = sprinkler.getWater() + MainConfig.wateringCanToSprinkler; if (canWater > 0) {
if (water > config.getWater()) water = config.getWater();
sprinkler.setWater(water);
if (SoundConfig.addWaterToSprinkler.isEnable()) { SprinklerFillEvent sprinklerFillEvent = new SprinklerFillEvent(player, itemStack);
AdventureUtil.playerSound( Bukkit.getPluginManager().callEvent(sprinklerFillEvent);
player, if (sprinklerFillEvent.isCancelled()) {
SoundConfig.addWaterToSprinkler.getSource(), return;
SoundConfig.addWaterToSprinkler.getKey(), }
1,1
);
}
if (MainConfig.enableActionBar) { nbtItem.setInteger("WaterAmount", --canWater);
String canID = customInterface.getItemID(itemStack);
WaterCan canConfig = WaterCanConfig.CANS.get(canID);
if (canConfig == null) return;
AdventureUtil.playerActionbar( int water = sprinkler.getWater() + MainConfig.wateringCanToSprinkler;
player, if (water > config.getWater()) water = config.getWater();
(MainConfig.actionBarLeft + sprinkler.setWater(water);
MainConfig.actionBarFull.repeat(canWater) +
MainConfig.actionBarEmpty.repeat(canConfig.getMax() - canWater) + if (SoundConfig.addWaterToSprinkler.isEnable()) {
MainConfig.actionBarRight) AdventureUtil.playerSound(
.replace("{max_water}", String.valueOf(canConfig.getMax())) player,
.replace("{water}", String.valueOf(canWater)) SoundConfig.addWaterToSprinkler.getSource(),
); SoundConfig.addWaterToSprinkler.getKey(),
1,1
);
}
if (MainConfig.enableActionBar) {
AdventureUtil.playerActionbar(
player,
(MainConfig.actionBarLeft +
MainConfig.actionBarFull.repeat(canWater) +
MainConfig.actionBarEmpty.repeat(canConfig.getMax() - canWater) +
MainConfig.actionBarRight)
.replace("{max_water}", String.valueOf(canConfig.getMax()))
.replace("{water}", String.valueOf(canWater))
);
}
if (MainConfig.enableWaterCanLore && !MainConfig.enablePacketLore) {
addWaterLore(nbtItem, canConfig, canWater);
}
itemStack.setItemMeta(nbtItem.getItem().getItemMeta());
if (MainConfig.enableWaterCanLore && MainConfig.enablePacketLore) {
player.updateInventory();
}
} }
} }
} }
@@ -317,7 +339,7 @@ public abstract class HandlerP extends Function {
water += MainConfig.waterToWaterCan; water += MainConfig.waterToWaterCan;
if (water > config.getMax()) water = config.getMax(); if (water > config.getMax()) water = config.getMax();
nbtItem.setInteger("WaterAmount", water); nbtItem.setInteger("WaterAmount", water);
itemStack.setItemMeta(nbtItem.getItem().getItemMeta());
if (SoundConfig.addWaterToCan.isEnable()) { if (SoundConfig.addWaterToCan.isEnable()) {
AdventureUtil.playerSound( AdventureUtil.playerSound(
@@ -332,7 +354,17 @@ public abstract class HandlerP extends Function {
player.getWorld().spawnParticle(Particle.WATER_SPLASH, block.getLocation().add(0.5,1, 0.5),10,0.1,0.1,0.1); player.getWorld().spawnParticle(Particle.WATER_SPLASH, block.getLocation().add(0.5,1, 0.5),10,0.1,0.1,0.1);
} }
if (MainConfig.enableWaterCanLore && !MainConfig.enablePacketLore) {
addWaterLore(nbtItem, config, water);
}
itemStack.setItemMeta(nbtItem.getItem().getItemMeta());
if (MainConfig.enableWaterCanLore && MainConfig.enablePacketLore) {
player.updateInventory();
}
} }
break; break;
} }
} }
@@ -353,6 +385,24 @@ public abstract class HandlerP extends Function {
return false; return false;
} }
protected void addWaterLore(NBTItem nbtItem, WaterCan config, int water) {
NBTCompound display = nbtItem.getCompound("display");
List<String> lore = display.getStringList("Lore");
lore.clear();
for (String text : MainConfig.waterCanLore) {
lore.add(GsonComponentSerializer.gson().serialize(MiniMessage.miniMessage().deserialize(
text.replace("{water_bar}",
MainConfig.waterBarLeft +
MainConfig.waterBarFull.repeat(water) +
MainConfig.waterBarEmpty.repeat(config.getMax() - water) +
MainConfig.waterBarRight
)
.replace("{water}", String.valueOf(water))
.replace("{max_water}", String.valueOf(config.getMax()))
)));
}
}
public boolean useFertilizer(Location potLoc, String id, Player player, ItemStack itemStack) { public boolean useFertilizer(Location potLoc, String id, Player player, ItemStack itemStack) {
Fertilizer fertilizer = FertilizerConfig.FERTILIZERS.get(id); Fertilizer fertilizer = FertilizerConfig.FERTILIZERS.get(id);
if (fertilizer == null) return false; if (fertilizer == null) return false;

View File

@@ -15,7 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.momirealms.customcrops.managers; package net.momirealms.customcrops.integrations.customplugin.itemsadder;
import net.momirealms.customcrops.CustomCrops; import net.momirealms.customcrops.CustomCrops;
import net.momirealms.customcrops.api.crop.Crop; import net.momirealms.customcrops.api.crop.Crop;
@@ -23,6 +23,8 @@ import net.momirealms.customcrops.config.BasicItemConfig;
import net.momirealms.customcrops.config.CropConfig; import net.momirealms.customcrops.config.CropConfig;
import net.momirealms.customcrops.config.MainConfig; import net.momirealms.customcrops.config.MainConfig;
import net.momirealms.customcrops.integrations.customplugin.CustomInterface; import net.momirealms.customcrops.integrations.customplugin.CustomInterface;
import net.momirealms.customcrops.managers.CropManager;
import net.momirealms.customcrops.managers.CropModeInterface;
import net.momirealms.customcrops.objects.GiganticCrop; import net.momirealms.customcrops.objects.GiganticCrop;
import net.momirealms.customcrops.objects.fertilizer.Fertilizer; import net.momirealms.customcrops.objects.fertilizer.Fertilizer;
import net.momirealms.customcrops.objects.fertilizer.Gigantic; import net.momirealms.customcrops.objects.fertilizer.Gigantic;

View File

@@ -138,9 +138,9 @@ public abstract class ItemsAdderHandler extends HandlerP {
} }
private boolean useWateringCan(Location potLoc, String namespacedID, Player player, @NotNull CustomStack can) { private boolean useWateringCan(Location potLoc, String namespacedID, Player player, @NotNull CustomStack can) {
WaterCan waterCan = WaterCanConfig.CANS.get(namespacedID);
if (waterCan == null) return false; WaterCan canConfig = WaterCanConfig.CANS.get(namespacedID);
if (canConfig == null) return false;
ItemStack itemStack = can.getItemStack(); ItemStack itemStack = can.getItemStack();
NBTItem nbtItem = new NBTItem(itemStack); NBTItem nbtItem = new NBTItem(itemStack);
@@ -180,10 +180,6 @@ public abstract class ItemsAdderHandler extends HandlerP {
} }
if (MainConfig.enableActionBar) { if (MainConfig.enableActionBar) {
String canID = customInterface.getItemID(itemStack);
WaterCan canConfig = WaterCanConfig.CANS.get(canID);
if (canConfig == null) return true;
AdventureUtil.playerActionbar( AdventureUtil.playerActionbar(
player, player,
(MainConfig.actionBarLeft + (MainConfig.actionBarLeft +
@@ -195,8 +191,17 @@ public abstract class ItemsAdderHandler extends HandlerP {
); );
} }
if (MainConfig.enableWaterCanLore && !MainConfig.enablePacketLore) {
addWaterLore(nbtItem, canConfig, water);
}
itemStack.setItemMeta(nbtItem.getItem().getItemMeta()); itemStack.setItemMeta(nbtItem.getItem().getItemMeta());
super.waterPot(waterCan.getWidth(), waterCan.getLength(), potLoc, player.getLocation().getYaw());
if (MainConfig.enableWaterCanLore && MainConfig.enablePacketLore) {
player.updateInventory();
}
super.waterPot(canConfig.getWidth(), canConfig.getLength(), potLoc, player.getLocation().getYaw());
} }
return true; return true;

View File

@@ -15,7 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.momirealms.customcrops.managers; package net.momirealms.customcrops.integrations.customplugin.itemsadder;
import net.momirealms.customcrops.CustomCrops; import net.momirealms.customcrops.CustomCrops;
import net.momirealms.customcrops.api.crop.Crop; import net.momirealms.customcrops.api.crop.Crop;
@@ -23,6 +23,8 @@ import net.momirealms.customcrops.config.BasicItemConfig;
import net.momirealms.customcrops.config.CropConfig; import net.momirealms.customcrops.config.CropConfig;
import net.momirealms.customcrops.config.MainConfig; import net.momirealms.customcrops.config.MainConfig;
import net.momirealms.customcrops.integrations.customplugin.CustomInterface; import net.momirealms.customcrops.integrations.customplugin.CustomInterface;
import net.momirealms.customcrops.managers.CropManager;
import net.momirealms.customcrops.managers.CropModeInterface;
import net.momirealms.customcrops.objects.GiganticCrop; import net.momirealms.customcrops.objects.GiganticCrop;
import net.momirealms.customcrops.objects.fertilizer.Fertilizer; import net.momirealms.customcrops.objects.fertilizer.Fertilizer;
import net.momirealms.customcrops.objects.fertilizer.Gigantic; import net.momirealms.customcrops.objects.fertilizer.Gigantic;
@@ -31,7 +33,7 @@ import org.apache.commons.lang.StringUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
public class ItemsAdderWireCropImpl implements CropModeInterface{ public class ItemsAdderWireCropImpl implements CropModeInterface {
private final CropManager cropManager; private final CropManager cropManager;
private final CustomInterface customInterface; private final CustomInterface customInterface;

View File

@@ -15,7 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.momirealms.customcrops.managers; package net.momirealms.customcrops.integrations.customplugin.oraxen;
import net.momirealms.customcrops.CustomCrops; import net.momirealms.customcrops.CustomCrops;
import net.momirealms.customcrops.api.crop.Crop; import net.momirealms.customcrops.api.crop.Crop;
@@ -23,7 +23,8 @@ import net.momirealms.customcrops.config.BasicItemConfig;
import net.momirealms.customcrops.config.CropConfig; import net.momirealms.customcrops.config.CropConfig;
import net.momirealms.customcrops.config.MainConfig; import net.momirealms.customcrops.config.MainConfig;
import net.momirealms.customcrops.integrations.customplugin.CustomInterface; import net.momirealms.customcrops.integrations.customplugin.CustomInterface;
import net.momirealms.customcrops.integrations.customplugin.oraxen.OraxenHook; import net.momirealms.customcrops.managers.CropManager;
import net.momirealms.customcrops.managers.CropModeInterface;
import net.momirealms.customcrops.objects.GiganticCrop; import net.momirealms.customcrops.objects.GiganticCrop;
import net.momirealms.customcrops.objects.fertilizer.Fertilizer; import net.momirealms.customcrops.objects.fertilizer.Fertilizer;
import net.momirealms.customcrops.objects.fertilizer.Gigantic; import net.momirealms.customcrops.objects.fertilizer.Gigantic;

View File

@@ -136,8 +136,9 @@ public abstract class OraxenHandler extends HandlerP {
} }
private boolean useWateringCan(Location potLoc, String id, Player player, @NotNull ItemStack can) { private boolean useWateringCan(Location potLoc, String id, Player player, @NotNull ItemStack can) {
WaterCan waterCan = WaterCanConfig.CANS.get(id);
if (waterCan == null) return false; WaterCan canConfig = WaterCanConfig.CANS.get(id);
if (canConfig == null) return false;
NBTItem nbtItem = new NBTItem(can); NBTItem nbtItem = new NBTItem(can);
int water = nbtItem.getInteger("WaterAmount"); int water = nbtItem.getInteger("WaterAmount");
@@ -160,10 +161,6 @@ public abstract class OraxenHandler extends HandlerP {
} }
if (MainConfig.enableActionBar) { if (MainConfig.enableActionBar) {
String canID = customInterface.getItemID(can);
WaterCan canConfig = WaterCanConfig.CANS.get(canID);
if (canConfig == null) return true;
AdventureUtil.playerActionbar( AdventureUtil.playerActionbar(
player, player,
(MainConfig.actionBarLeft + (MainConfig.actionBarLeft +
@@ -175,8 +172,17 @@ public abstract class OraxenHandler extends HandlerP {
); );
} }
if (MainConfig.enableWaterCanLore && !MainConfig.enablePacketLore) {
addWaterLore(nbtItem, canConfig, water);
}
can.setItemMeta(nbtItem.getItem().getItemMeta()); can.setItemMeta(nbtItem.getItem().getItemMeta());
super.waterPot(waterCan.getWidth(), waterCan.getLength(), potLoc, player.getLocation().getYaw());
if (MainConfig.enableWaterCanLore && MainConfig.enablePacketLore) {
player.updateInventory();
}
super.waterPot(canConfig.getWidth(), canConfig.getLength(), potLoc, player.getLocation().getYaw());
} }
return true; return true;
} }

View File

@@ -15,7 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.momirealms.customcrops.managers; package net.momirealms.customcrops.integrations.customplugin.oraxen;
import net.momirealms.customcrops.CustomCrops; import net.momirealms.customcrops.CustomCrops;
import net.momirealms.customcrops.api.crop.Crop; import net.momirealms.customcrops.api.crop.Crop;
@@ -23,6 +23,8 @@ import net.momirealms.customcrops.config.BasicItemConfig;
import net.momirealms.customcrops.config.CropConfig; import net.momirealms.customcrops.config.CropConfig;
import net.momirealms.customcrops.config.MainConfig; import net.momirealms.customcrops.config.MainConfig;
import net.momirealms.customcrops.integrations.customplugin.CustomInterface; import net.momirealms.customcrops.integrations.customplugin.CustomInterface;
import net.momirealms.customcrops.managers.CropManager;
import net.momirealms.customcrops.managers.CropModeInterface;
import net.momirealms.customcrops.objects.GiganticCrop; import net.momirealms.customcrops.objects.GiganticCrop;
import net.momirealms.customcrops.objects.fertilizer.Fertilizer; import net.momirealms.customcrops.objects.fertilizer.Fertilizer;
import net.momirealms.customcrops.objects.fertilizer.Gigantic; import net.momirealms.customcrops.objects.fertilizer.Gigantic;
@@ -31,7 +33,7 @@ import org.apache.commons.lang.StringUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
public class OraxenWireCropImpl implements CropModeInterface{ public class OraxenWireCropImpl implements CropModeInterface {
private final CropManager cropManager; private final CropManager cropManager;
private final CustomInterface customInterface; private final CustomInterface customInterface;

View File

@@ -17,6 +17,7 @@
package net.momirealms.customcrops.integrations.skill; package net.momirealms.customcrops.integrations.skill;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.experience.EXPSource; import net.Indyuce.mmocore.experience.EXPSource;
import net.Indyuce.mmocore.experience.Profession; import net.Indyuce.mmocore.experience.Profession;
import net.momirealms.customcrops.integrations.SkillXP; import net.momirealms.customcrops.integrations.SkillXP;
@@ -25,7 +26,7 @@ import org.bukkit.entity.Player;
public class MMOCoreHook implements SkillXP { public class MMOCoreHook implements SkillXP {
@Override @Override
public void addXp(Player player, double amount) { public void addXp(Player player, double amount) {
Profession profession = net.Indyuce.mmocore.MMOCore.plugin.professionManager.get("farming"); Profession profession = MMOCore.plugin.professionManager.get("farming");
profession.giveExperience(net.Indyuce.mmocore.MMOCore.plugin.dataProvider.getDataManager().get(player), amount, null ,EXPSource.OTHER); profession.giveExperience(MMOCore.plugin.dataProvider.getDataManager().get(player), amount, null ,EXPSource.OTHER);
} }
} }

View File

@@ -27,18 +27,13 @@ import net.momirealms.customcrops.config.SeasonConfig;
import net.momirealms.customcrops.config.SoundConfig; import net.momirealms.customcrops.config.SoundConfig;
import net.momirealms.customcrops.integrations.customplugin.CustomInterface; import net.momirealms.customcrops.integrations.customplugin.CustomInterface;
import net.momirealms.customcrops.integrations.customplugin.HandlerP; import net.momirealms.customcrops.integrations.customplugin.HandlerP;
import net.momirealms.customcrops.integrations.customplugin.itemsadder.ItemsAdderFrameHandler; import net.momirealms.customcrops.integrations.customplugin.itemsadder.*;
import net.momirealms.customcrops.integrations.customplugin.itemsadder.ItemsAdderHook; import net.momirealms.customcrops.integrations.customplugin.oraxen.*;
import net.momirealms.customcrops.integrations.customplugin.itemsadder.ItemsAdderWireHandler;
import net.momirealms.customcrops.integrations.customplugin.oraxen.OraxenFrameHandler;
import net.momirealms.customcrops.integrations.customplugin.oraxen.OraxenHook;
import net.momirealms.customcrops.integrations.customplugin.oraxen.OraxenWireHandler;
import net.momirealms.customcrops.integrations.season.CCSeason; import net.momirealms.customcrops.integrations.season.CCSeason;
import net.momirealms.customcrops.integrations.season.InternalSeason; import net.momirealms.customcrops.integrations.season.InternalSeason;
import net.momirealms.customcrops.integrations.season.RealisticSeasonsHook; import net.momirealms.customcrops.integrations.season.RealisticSeasonsHook;
import net.momirealms.customcrops.integrations.season.SeasonInterface; import net.momirealms.customcrops.integrations.season.SeasonInterface;
import net.momirealms.customcrops.managers.listener.ItemSpawnListener; import net.momirealms.customcrops.managers.listener.*;
import net.momirealms.customcrops.managers.listener.WorldListener;
import net.momirealms.customcrops.managers.timer.CrowTask; import net.momirealms.customcrops.managers.timer.CrowTask;
import net.momirealms.customcrops.managers.timer.TimerTask; import net.momirealms.customcrops.managers.timer.TimerTask;
import net.momirealms.customcrops.objects.OtherLoot; import net.momirealms.customcrops.objects.OtherLoot;
@@ -75,6 +70,9 @@ public class CropManager extends Function {
private SeasonInterface seasonInterface; private SeasonInterface seasonInterface;
private CustomInterface customInterface; private CustomInterface customInterface;
private ArmorStandUtil armorStandUtil; private ArmorStandUtil armorStandUtil;
private ContainerListener containerListener;
private PlayerModeListener playerModeListener;
private PlayerContainerListener playerContainerListener;
private HandlerP handler; private HandlerP handler;
public CropManager() { public CropManager() {
@@ -91,6 +89,7 @@ public class CropManager extends Function {
loadMode(); loadMode();
loadSeason(); loadSeason();
loadPacket();
//load Worlds //load Worlds
for (World world : Bukkit.getWorlds()) { for (World world : Bukkit.getWorlds()) {
@@ -149,6 +148,28 @@ public class CropManager extends Function {
} }
} }
public void loadPacket() {
if (this.containerListener != null) {
CustomCrops.protocolManager.removePacketListener(containerListener);
this.containerListener = null;
}
if (this.playerModeListener != null) {
HandlerList.unregisterAll(playerModeListener);
this.playerModeListener = null;
}
if (this.playerContainerListener != null) {
CustomCrops.protocolManager.removePacketListener(playerContainerListener);
this.playerContainerListener = null;
}
if (!MainConfig.enableWaterCanLore || !MainConfig.enablePacketLore) return;
containerListener = new ContainerListener(this);
CustomCrops.protocolManager.addPacketListener(containerListener);
playerContainerListener = new PlayerContainerListener(handler);
CustomCrops.protocolManager.addPacketListener(playerContainerListener);
playerModeListener = new PlayerModeListener();
Bukkit.getPluginManager().registerEvents(playerModeListener, CustomCrops.plugin);
}
@Override @Override
public void unload() { public void unload() {
super.unload(); super.unload();
@@ -161,6 +182,7 @@ public class CropManager extends Function {
} }
customWorlds.clear(); customWorlds.clear();
if (this.seasonInterface != null) seasonInterface.unload(); if (this.seasonInterface != null) seasonInterface.unload();
if (this.containerListener != null) CustomCrops.protocolManager.removePacketListener(containerListener);
} }
public void onItemSpawn(Item item) { public void onItemSpawn(Item item) {

View File

@@ -0,0 +1,76 @@
package net.momirealms.customcrops.managers.listener;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.events.ListenerPriority;
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.events.PacketEvent;
import de.tr7zw.changeme.nbtapi.NBTCompound;
import de.tr7zw.changeme.nbtapi.NBTItem;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import net.momirealms.customcrops.CustomCrops;
import net.momirealms.customcrops.config.MainConfig;
import net.momirealms.customcrops.config.WaterCanConfig;
import net.momirealms.customcrops.integrations.customplugin.CustomInterface;
import net.momirealms.customcrops.managers.CropManager;
import net.momirealms.customcrops.objects.WaterCan;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
import java.util.List;
public class ContainerListener extends PacketAdapter {
private final CustomInterface customInterface;
public ContainerListener(CropManager cropManager) {
super(CustomCrops.plugin, ListenerPriority.HIGHEST, PacketType.Play.Server.WINDOW_ITEMS);
this.customInterface = cropManager.getCustomInterface();
}
public void onPacketSending(PacketEvent event) {
PacketContainer packet = event.getPacket();
if (event.getPlayer().getGameMode() == GameMode.CREATIVE) {
return;
}
List<ItemStack> itemStacks = packet.getItemListModifier().read(0);
List<ItemStack> itemStacksClone = new ArrayList<>();
for (ItemStack itemStack : itemStacks) {
ItemStack fake = itemStack.clone();
itemStacksClone.add(fake);
if (fake.getType() == Material.AIR) continue;
String id = customInterface.getItemID(fake);
WaterCan config = WaterCanConfig.CANS.get(id);
if (config == null) continue;
NBTItem nbtItem = new NBTItem(fake);
int water = nbtItem.getInteger("WaterAmount");
NBTCompound display = nbtItem.getCompound("display");
if (display == null) continue;
List<String> lore = display.getStringList("Lore");
if (MainConfig.topOrBottom) lore.addAll(0, getLore(config.getMax(), water));
else lore.addAll(getLore(config.getMax(), water));
fake.setItemMeta(nbtItem.getItem().getItemMeta());
}
packet.getItemListModifier().write(0, itemStacksClone);
}
private List<String> getLore(int max, int water) {
List<String> lore = new ArrayList<>();
for (String text : MainConfig.waterCanLore) {
lore.add(GsonComponentSerializer.gson().serialize(MiniMessage.miniMessage().deserialize(
text.replace("{water_bar}",
MainConfig.waterBarLeft +
MainConfig.waterBarFull.repeat(water) +
MainConfig.waterBarEmpty.repeat(max - water) +
MainConfig.waterBarRight
)
.replace("{water}", String.valueOf(water))
.replace("{max_water}", String.valueOf(max))
)));
}
return lore;
}
}

View File

@@ -0,0 +1,26 @@
package net.momirealms.customcrops.managers.listener;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.events.ListenerPriority;
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketEvent;
import net.momirealms.customcrops.CustomCrops;
import net.momirealms.customcrops.integrations.customplugin.HandlerP;
import org.bukkit.entity.Player;
public class PlayerContainerListener extends PacketAdapter {
private final HandlerP handlerP;
public PlayerContainerListener(HandlerP handlerP) {
super(CustomCrops.plugin, ListenerPriority.HIGHEST, PacketType.Play.Client.WINDOW_CLICK);
this.handlerP = handlerP;
}
public void onPacketReceiving(PacketEvent event) {
final Player player = event.getPlayer();
if (handlerP.coolDownJudge(player)) {
player.updateInventory();
}
}
}

View File

@@ -0,0 +1,17 @@
package net.momirealms.customcrops.managers.listener;
import net.momirealms.customcrops.CustomCrops;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerGameModeChangeEvent;
public class PlayerModeListener implements Listener {
@EventHandler
public void onModeChange(PlayerGameModeChangeEvent event) {
Bukkit.getScheduler().runTaskLater(CustomCrops.plugin, () -> {
event.getPlayer().updateInventory();
}, 1);
}
}

View File

@@ -1,21 +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.objects;
public class ScareCow {
}

View File

@@ -1,5 +1,5 @@
#Don't change #Don't change
config-version: '10' config-version: '11'
# lang: english / spanish / chinese # lang: english / spanish / chinese
lang: english lang: english
@@ -165,20 +165,20 @@ sounds:
type: player type: player
#Hologram information # Hologram information
hologram: hologram:
#Pot infomation # Pot infomation
fertilizer-info: fertilizer-info:
enable: true enable: true
y-offset: 0.8 y-offset: 0.8
duration: 1 duration: 1
text: '<font:customcrops:default>{fertilizer} </font><white>{times}<gray>/<white>{max_times}' text: '<font:customcrops:default>{fertilizer} </font><white>{times}<gray>/<white>{max_times}'
#Sprinkler infomation # Sprinkler infomation
sprinkler-info: sprinkler-info:
enable: true enable: true
y-offset: 0.8 y-offset: 0.8
duration: 1 duration: 1
#available variables {water} {max_water} # available variables {water} {max_water}
left: '<font:customcrops:default>뀂' left: '<font:customcrops:default>뀂'
full: '뀁뀃' full: '뀁뀃'
empty: '뀁뀄' empty: '뀁뀄'
@@ -187,10 +187,34 @@ hologram:
actionbar: actionbar:
#Should actionbar be sent when using watering-can # Should actionbar be sent when using watering-can
enable: true enable: true
#available variables {water} {max_water} # Available variables {water} {max_water}
left: '<font:customcrops:default>뀂' left: '<font:customcrops:default>뀂'
full: '뀁뀃' full: '뀁뀃'
empty: '뀁뀄' empty: '뀁뀄'
right: '뀁뀅</font>' right: '뀁뀅</font>'
watering-can-lore:
# Should watering-can has dynamic lore according to the water amount
enable: true
# Only packets can remain the former lore, otherwise the lore would be replaced
packets:
# Should watering-can's lore be sent by packets
# Wouldn't work in creative mode for safety
enable: true
# true: top / false: bottom
top-or-bottom: true
# Lore format
# Available variables: {water_bar}
# {water}current water {max_water}max storage
lore:
- '<italic:false><white>{water_bar}'
- '<italic:false><gray>Right click water to add water to the can.'
water-bar:
left: '<font:customcrops:default>뀂'
full: '뀁뀃'
empty: '뀁뀄'
right: '뀁뀅</font>'