9
0
mirror of https://github.com/Xiao-MoMi/Custom-Crops.git synced 2025-12-27 19:09:09 +00:00
This commit is contained in:
XiaoMoMi
2024-03-15 09:47:51 +08:00
parent f0f69adc2f
commit 6b492aeacb
12 changed files with 548 additions and 46 deletions

View File

@@ -64,7 +64,6 @@ import org.bukkit.block.BlockFace;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.ExperienceOrb;
import org.bukkit.entity.Player;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;

View File

@@ -35,7 +35,6 @@ import net.momirealms.customcrops.compatibility.papi.ParseUtils;
import net.momirealms.customcrops.mechanic.misc.CrowAttackAnimation;
import net.momirealms.customcrops.utils.ClassUtils;
import net.momirealms.customcrops.utils.ConfigUtils;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.data.type.Farmland;

View File

@@ -718,13 +718,14 @@ public class ItemManagerImpl implements ItemManager {
return FunctionResult.PASS;
}
// is a pot
Pot pot = getPotByBlock(blockWrapper.getClickedBlock());
Block block = blockWrapper.getClickedBlock();
Pot pot = getPotByBlock(block);
if (pot == null) {
return FunctionResult.PASS;
}
final Player player = blockWrapper.getPlayer();
final ItemStack itemStack = blockWrapper.getItemInHand();
final Location clicked = blockWrapper.getClickedBlock().getLocation();
final Location clicked = block.getLocation();
State state = new State(player, itemStack, clicked);
// check watering-can requirements
if (!RequirementManager.isRequirementMet(state, wateringCan.getRequirements())) {
@@ -737,8 +738,14 @@ public class ItemManagerImpl implements ItemManager {
}
// check amount of water
int waterInCan = wateringCan.getCurrentWater(itemStack);
state.setArg("{storage}", String.valueOf(wateringCan.getStorage()));
if (waterInCan > 0 || wateringCan.isInfinite()) {
// fire the event
WateringCanWaterEvent waterEvent = new WateringCanWaterEvent(player, itemStack, wateringCan, clicked, pot);
if (EventUtils.fireAndCheckCancel(waterEvent))
return FunctionResult.CANCEL_EVENT_AND_RETURN;
state.setArg("{storage}", String.valueOf(wateringCan.getStorage()));
state.setArg("{current}", String.valueOf(waterInCan - 1));
state.setArg("{water_bar}", wateringCan.getWaterBar() == null ? "" : wateringCan.getWaterBar().getWaterBar(waterInCan - 1, wateringCan.getStorage()));
wateringCan.updateItem(player, itemStack, waterInCan - 1, state.getArgs());
@@ -749,6 +756,7 @@ public class ItemManagerImpl implements ItemManager {
pot.trigger(ActionTrigger.ADD_WATER, new State(player, itemStack, location));
}
} else {
state.setArg("{storage}", String.valueOf(wateringCan.getStorage()));
state.setArg("{current}", "0");
state.setArg("{water_bar}", wateringCan.getWaterBar() == null ? "" : wateringCan.getWaterBar().getWaterBar(0, wateringCan.getStorage()));
wateringCan.trigger(ActionTrigger.NO_WATER, state);
@@ -772,7 +780,7 @@ public class ItemManagerImpl implements ItemManager {
Block potBlock = blockWrapper.getClickedBlock().getRelative(BlockFace.DOWN);
Pot pot = getPotByBlock(potBlock);
if (pot == null) {
LogUtils.warn("Unexpected issue: Detetced that crops are not planted on a pot: " + blockWrapper.getClickedBlock().getLocation());
plugin.debug("Unexpected issue: Detetced that crops are not planted on a pot: " + blockWrapper.getClickedBlock().getLocation());
return FunctionResult.RETURN;
}
@@ -799,8 +807,14 @@ public class ItemManagerImpl implements ItemManager {
}
// check amount of water
int waterInCan = wateringCan.getCurrentWater(itemStack);
state.setArg("{storage}", String.valueOf(wateringCan.getStorage()));
if (waterInCan > 0 || wateringCan.isInfinite()) {
// fire the event
WateringCanWaterEvent waterEvent = new WateringCanWaterEvent(player, itemStack, wateringCan, potBlock.getLocation(), pot);
if (EventUtils.fireAndCheckCancel(waterEvent))
return FunctionResult.CANCEL_EVENT_AND_RETURN;
state.setArg("{storage}", String.valueOf(wateringCan.getStorage()));
state.setArg("{current}", String.valueOf(waterInCan - 1));
state.setArg("{water_bar}", wateringCan.getWaterBar() == null ? "" : wateringCan.getWaterBar().getWaterBar(waterInCan - 1, wateringCan.getStorage()));
wateringCan.updateItem(player, itemStack, waterInCan - 1, state.getArgs());
@@ -811,6 +825,7 @@ public class ItemManagerImpl implements ItemManager {
pot.trigger(ActionTrigger.ADD_WATER, new State(player, itemStack, location));
}
} else {
state.setArg("{storage}", String.valueOf(wateringCan.getStorage()));
state.setArg("{current}", "0");
state.setArg("{water_bar}", wateringCan.getWaterBar() == null ? "" : wateringCan.getWaterBar().getWaterBar(0, wateringCan.getStorage()));
wateringCan.trigger(ActionTrigger.NO_WATER, state);
@@ -858,8 +873,14 @@ public class ItemManagerImpl implements ItemManager {
}
// check amount of water
int waterInCan = wateringCan.getCurrentWater(itemStack);
state.setArg("{storage}", String.valueOf(wateringCan.getStorage()));
if (waterInCan > 0 || wateringCan.isInfinite()) {
// fire the event
WateringCanWaterEvent waterEvent = new WateringCanWaterEvent(player, itemStack, wateringCan, clicked, pot);
if (EventUtils.fireAndCheckCancel(waterEvent))
return FunctionResult.CANCEL_EVENT_AND_RETURN;
state.setArg("{storage}", String.valueOf(wateringCan.getStorage()));
state.setArg("{current}", String.valueOf(waterInCan - 1));
state.setArg("{water_bar}", wateringCan.getWaterBar() == null ? "" : wateringCan.getWaterBar().getWaterBar(waterInCan - 1, wateringCan.getStorage()));
wateringCan.updateItem(player, itemStack, waterInCan - 1, state.getArgs());
@@ -870,6 +891,7 @@ public class ItemManagerImpl implements ItemManager {
pot.trigger(ActionTrigger.ADD_WATER, new State(player, itemStack, location));
}
} else {
state.setArg("{storage}", String.valueOf(wateringCan.getStorage()));
state.setArg("{current}", "0");
state.setArg("{water_bar}", wateringCan.getWaterBar() == null ? "" : wateringCan.getWaterBar().getWaterBar(0, wateringCan.getStorage()));
wateringCan.trigger(ActionTrigger.NO_WATER, state);
@@ -885,12 +907,15 @@ public class ItemManagerImpl implements ItemManager {
return FunctionResult.PASS;
}
// check watering-can requirements
State state = new State(furnitureWrapper.getPlayer(), furnitureWrapper.getItemInHand(), furnitureWrapper.getLocation());
Player player = furnitureWrapper.getPlayer();
ItemStack itemInHand = furnitureWrapper.getItemInHand();
Location location = furnitureWrapper.getLocation();
State state = new State(player, itemInHand, location);
if (!RequirementManager.isRequirementMet(state, wateringCan.getRequirements())) {
return FunctionResult.RETURN;
}
// get water in can
int waterInCan = wateringCan.getCurrentWater(furnitureWrapper.getItemInHand());
int waterInCan = wateringCan.getCurrentWater(itemInHand);
String clickedFurnitureID = furnitureWrapper.getID();
Sprinkler sprinkler = getSprinklerBy3DItemID(clickedFurnitureID);
// is a sprinkler
@@ -907,21 +932,27 @@ public class ItemManagerImpl implements ItemManager {
// check amount of water
if (waterInCan > 0 || wateringCan.isInfinite()) {
// get sprinkler data
SimpleLocation location = SimpleLocation.of(furnitureWrapper.getLocation());
Optional<WorldSprinkler> worldSprinkler = plugin.getWorldManager().getSprinklerAt(location);
SimpleLocation simpleLocation = SimpleLocation.of(location);
Optional<WorldSprinkler> worldSprinkler = plugin.getWorldManager().getSprinklerAt(simpleLocation);
if (worldSprinkler.isEmpty()) {
plugin.debug("Player " + furnitureWrapper.getPlayer().getName() + " tried to interact a sprinkler which not exists in memory. Fixing the data...");
plugin.debug("Player " + player.getName() + " tried to interact a sprinkler which not exists in memory. Fixing the data...");
} else {
if (sprinkler.getStorage() <= worldSprinkler.get().getWater()) {
return FunctionResult.RETURN;
}
}
// fire the event
WateringCanWaterEvent waterEvent = new WateringCanWaterEvent(player, itemInHand, wateringCan, location, sprinkler);
if (EventUtils.fireAndCheckCancel(waterEvent))
return FunctionResult.CANCEL_EVENT_AND_RETURN;
state.setArg("{storage}", String.valueOf(wateringCan.getStorage()));
state.setArg("{current}", String.valueOf(waterInCan - 1));
state.setArg("{water_bar}", wateringCan.getWaterBar() == null ? "" : wateringCan.getWaterBar().getWaterBar(waterInCan - 1, wateringCan.getStorage()));
wateringCan.updateItem(furnitureWrapper.getPlayer(), furnitureWrapper.getItemInHand(), waterInCan - 1, state.getArgs());
wateringCan.updateItem(player, furnitureWrapper.getItemInHand(), waterInCan - 1, state.getArgs());
wateringCan.trigger(ActionTrigger.CONSUME_WATER, state);
plugin.getWorldManager().addWaterToSprinkler(sprinkler, location, 1);
plugin.getWorldManager().addWaterToSprinkler(sprinkler, simpleLocation, 1);
} else {
state.setArg("{storage}", String.valueOf(wateringCan.getStorage()));
state.setArg("{current}", "0");
@@ -937,13 +968,18 @@ public class ItemManagerImpl implements ItemManager {
for (PositiveFillMethod method : methods) {
if (method.getId().equals(clickedFurnitureID)) {
if (method.canFill(state)) {
// fire the event
WateringCanFillEvent fillEvent = new WateringCanFillEvent(player, itemInHand, wateringCan, location, method);
if (EventUtils.fireAndCheckCancel(fillEvent))
return FunctionResult.CANCEL_EVENT_AND_RETURN;
if (waterInCan < wateringCan.getStorage()) {
waterInCan += method.getAmount();
waterInCan = Math.min(waterInCan, wateringCan.getStorage());
state.setArg("{storage}", String.valueOf(wateringCan.getStorage()));
state.setArg("{current}", String.valueOf(waterInCan));
state.setArg("{water_bar}", wateringCan.getWaterBar() == null ? "" : wateringCan.getWaterBar().getWaterBar(waterInCan, wateringCan.getStorage()));
wateringCan.updateItem(furnitureWrapper.getPlayer(), furnitureWrapper.getItemInHand(), waterInCan, state.getArgs());
wateringCan.updateItem(player, furnitureWrapper.getItemInHand(), waterInCan, state.getArgs());
wateringCan.trigger(ActionTrigger.ADD_WATER, state);
method.trigger(state);
} else {
@@ -970,12 +1006,14 @@ public class ItemManagerImpl implements ItemManager {
if (wateringCan.isInfinite()) {
return FunctionResult.PASS;
}
Player player = interactWrapper.getPlayer();
ItemStack itemInHand = interactWrapper.getItemInHand();
// get the clicked block
Block targetBlock = interactWrapper.getPlayer().getTargetBlockExact(5, FluidCollisionMode.ALWAYS);
Block targetBlock = player.getTargetBlockExact(5, FluidCollisionMode.ALWAYS);
if (targetBlock == null)
return FunctionResult.PASS;
// check watering-can requirements
State state = new State(interactWrapper.getPlayer(), interactWrapper.getItemInHand(), targetBlock.getLocation());
State state = new State(player, itemInHand, targetBlock.getLocation());
if (!RequirementManager.isRequirementMet(state, wateringCan.getRequirements())) {
return FunctionResult.RETURN;
}
@@ -984,18 +1022,23 @@ public class ItemManagerImpl implements ItemManager {
if (targetBlock.getBlockData() instanceof Waterlogged waterlogged && waterlogged.isWaterlogged()) {
blockID = "WATER";
}
int water = wateringCan.getCurrentWater(interactWrapper.getItemInHand());
int water = wateringCan.getCurrentWater(itemInHand);
PositiveFillMethod[] methods = wateringCan.getPositiveFillMethods();
for (PositiveFillMethod method : methods) {
if (method.getId().equals(blockID)) {
if (method.canFill(state)) {
if (water < wateringCan.getStorage()) {
// fire the event
WateringCanFillEvent fillEvent = new WateringCanFillEvent(player, itemInHand, wateringCan, state.getLocation(), method);
if (EventUtils.fireAndCheckCancel(fillEvent))
return FunctionResult.CANCEL_EVENT_AND_RETURN;
water += method.getAmount();
water = Math.min(water, wateringCan.getStorage());
state.setArg("{storage}", String.valueOf(wateringCan.getStorage()));
state.setArg("{current}", String.valueOf(water));
state.setArg("{water_bar}", wateringCan.getWaterBar() == null ? "" : wateringCan.getWaterBar().getWaterBar(water, wateringCan.getStorage()));
wateringCan.updateItem(interactWrapper.getPlayer(), interactWrapper.getItemInHand(), water, state.getArgs());
wateringCan.updateItem(player, itemInHand, water, state.getArgs());
wateringCan.trigger(ActionTrigger.ADD_WATER, state);
method.trigger(state);
} else {
@@ -1017,12 +1060,14 @@ public class ItemManagerImpl implements ItemManager {
if (wateringCan.isInfinite()) {
return FunctionResult.PASS;
}
Player player = interactWrapper.getPlayer();
// get the clicked block
Block targetBlock = interactWrapper.getPlayer().getTargetBlockExact(5, FluidCollisionMode.ALWAYS);
Block targetBlock = player.getTargetBlockExact(5, FluidCollisionMode.ALWAYS);
if (targetBlock == null)
return FunctionResult.PASS;
// check watering-can requirements
State state = new State(interactWrapper.getPlayer(), interactWrapper.getItemInHand(), targetBlock.getLocation());
ItemStack itemInHand = interactWrapper.getItemInHand();
State state = new State(player, itemInHand, targetBlock.getLocation());
if (!RequirementManager.isRequirementMet(state, wateringCan.getRequirements())) {
return FunctionResult.RETURN;
}
@@ -1031,18 +1076,23 @@ public class ItemManagerImpl implements ItemManager {
if (targetBlock.getBlockData() instanceof Waterlogged waterlogged && waterlogged.isWaterlogged()) {
blockID = "WATER";
}
int water = wateringCan.getCurrentWater(interactWrapper.getItemInHand());
int water = wateringCan.getCurrentWater(itemInHand);
PositiveFillMethod[] methods = wateringCan.getPositiveFillMethods();
for (PositiveFillMethod method : methods) {
if (method.getId().equals(blockID)) {
if (method.canFill(state)) {
if (water < wateringCan.getStorage()) {
// fire the event
WateringCanFillEvent fillEvent = new WateringCanFillEvent(player, itemInHand, wateringCan, state.getLocation(), method);
if (EventUtils.fireAndCheckCancel(fillEvent))
return FunctionResult.CANCEL_EVENT_AND_RETURN;
water += method.getAmount();
water = Math.min(water, wateringCan.getStorage());
state.setArg("{storage}", String.valueOf(wateringCan.getStorage()));
state.setArg("{current}", String.valueOf(water));
state.setArg("{water_bar}", wateringCan.getWaterBar() == null ? "" : wateringCan.getWaterBar().getWaterBar(water, wateringCan.getStorage()));
wateringCan.updateItem(interactWrapper.getPlayer(), interactWrapper.getItemInHand(), water, state.getArgs());
wateringCan.updateItem(player, itemInHand, water, state.getArgs());
wateringCan.trigger(ActionTrigger.ADD_WATER, state);
method.trigger(state);
} else {
@@ -1223,14 +1273,18 @@ public class ItemManagerImpl implements ItemManager {
// add water to sprinkler
String itemID = getItemID(itemInHand);
int itemAmount = itemInHand.getAmount();
Optional<WorldSprinkler> worldSprinkler = plugin.getWorldManager().getSprinklerAt(simpleLocation);
int waterInSprinkler = worldSprinkler.map(WorldSprinkler::getWater).orElse(0);
int waterInSprinkler = optionalSprinkler.get().getWater();
// if it's not infinite
if (!sprinkler.isInfinite()) {
for (PassiveFillMethod method : sprinkler.getPassiveFillMethods()) {
if (method.getUsed().equals(itemID) && itemAmount >= method.getUsedAmount()) {
if (method.canFill(state)) {
if (waterInSprinkler < sprinkler.getStorage()) {
// fire the event
SprinklerFillEvent fillEvent = new SprinklerFillEvent(player, itemInHand, location, method, optionalSprinkler.get());
if (EventUtils.fireAndCheckCancel(fillEvent))
return FunctionResult.CANCEL_EVENT_AND_RETURN;
if (player.getGameMode() != GameMode.CREATIVE) {
itemInHand.setAmount(itemAmount - method.getUsedAmount());
if (method.getReturned() != null) {
@@ -1751,25 +1805,23 @@ public class ItemManagerImpl implements ItemManager {
}
// if not reached the max point, try detecting bone meals
if (optionalCrop.isPresent()) {
if (optionalCrop.get().getPoint() < crop.getMaxPoints()) {
for (BoneMeal boneMeal : crop.getBoneMeals()) {
if (boneMeal.getItem().equals(itemID)) {
if (player.getGameMode() != GameMode.CREATIVE) {
itemInHand.setAmount(itemAmount - boneMeal.getUsedAmount());
if (boneMeal.getReturned() != null) {
ItemStack returned = getItemStack(player, boneMeal.getReturned());
ItemUtils.giveItem(player, returned, boneMeal.getReturnedAmount());
}
if (optionalCrop.get().getPoint() < crop.getMaxPoints()) {
for (BoneMeal boneMeal : crop.getBoneMeals()) {
if (boneMeal.getItem().equals(itemID)) {
if (player.getGameMode() != GameMode.CREATIVE) {
itemInHand.setAmount(itemAmount - boneMeal.getUsedAmount());
if (boneMeal.getReturned() != null) {
ItemStack returned = getItemStack(player, boneMeal.getReturned());
ItemUtils.giveItem(player, returned, boneMeal.getReturnedAmount());
}
boneMeal.trigger(cropState);
plugin.getWorldManager().addPointToCrop(crop, SimpleLocation.of(cropLocation), boneMeal.getPoint());
return FunctionResult.RETURN;
}
boneMeal.trigger(cropState);
plugin.getWorldManager().addPointToCrop(crop, SimpleLocation.of(cropLocation), boneMeal.getPoint());
return FunctionResult.RETURN;
}
} else {
crop.trigger(ActionTrigger.RIPE, cropState);
}
} else {
crop.trigger(ActionTrigger.RIPE, cropState);
}
// trigger interact actions
@@ -1900,6 +1952,11 @@ public class ItemManagerImpl implements ItemManager {
if (method.getUsed().equals(itemID) && itemAmount >= method.getUsedAmount()) {
if (method.canFill(state)) {
if (waterInPot < pot.getStorage()) {
// fire the event
PotFillEvent waterEvent = new PotFillEvent(player, itemInHand, location, method, optionalPot.get());
if (EventUtils.fireAndCheckCancel(waterEvent))
return FunctionResult.CANCEL_EVENT_AND_RETURN;
if (player.getGameMode() != GameMode.CREATIVE) {
itemInHand.setAmount(itemAmount - method.getUsedAmount());
if (method.getReturned() != null) {

View File

@@ -22,6 +22,7 @@ import net.momirealms.customcrops.api.manager.ConfigManager;
import net.momirealms.customcrops.api.manager.WorldManager;
import net.momirealms.customcrops.api.mechanic.item.Pot;
import net.momirealms.customcrops.api.mechanic.item.Sprinkler;
import net.momirealms.customcrops.api.mechanic.item.WateringCan;
import net.momirealms.customcrops.api.mechanic.world.SimpleLocation;
import net.momirealms.customcrops.mechanic.item.ItemManagerImpl;
import org.bukkit.Location;
@@ -38,6 +39,7 @@ import org.bukkit.event.block.*;
import org.bukkit.event.entity.EntityChangeBlockEvent;
import org.bukkit.event.entity.ItemSpawnEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerItemDamageEvent;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.Nullable;
@@ -177,6 +179,15 @@ public abstract class AbstractCustomListener implements Listener {
}
}
@EventHandler (ignoreCancelled = true)
public void onItemDamage(PlayerItemDamageEvent event) {
ItemStack itemStack = event.getItem();
WateringCan wateringCan = this.itemManager.getWateringCanByItemStack(itemStack);
if (wateringCan != null) {
event.setCancelled(true);
}
}
public void onPlaceBlock(Player player, Block block, String blockID, Cancellable event) {
this.itemManager.handlePlayerPlaceBlock(player, block, blockID, event);
}

View File

@@ -134,6 +134,7 @@ public class WateringCanConfig extends AbstractEventItem implements WateringCan
@Override
public void updateItem(Player player, ItemStack itemStack, int water, Map<String, String> args) {
int maxDurability = itemStack.getType().getMaxDurability();
NBTItem nbtItem = new NBTItem(itemStack);
if (isInfinite()) water = storage;
if (hasDynamicLore()) {
@@ -159,6 +160,9 @@ public class WateringCanConfig extends AbstractEventItem implements WateringCan
}
nbtItem.setInteger("WaterAmount", water);
if (maxDurability != 0) {
nbtItem.setInteger("Damage", (int) (maxDurability * (((double) storage - water) / storage)));
}
itemStack.setItemMeta(nbtItem.getItem().getItemMeta());
}