mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-19 23:19:15 +00:00
food和返还物品
This commit is contained in:
@@ -15,12 +15,12 @@ import net.momirealms.craftengine.core.item.CustomItem;
|
||||
import net.momirealms.craftengine.core.item.Item;
|
||||
import net.momirealms.craftengine.core.item.behavior.ItemBehavior;
|
||||
import net.momirealms.craftengine.core.item.context.UseOnContext;
|
||||
import net.momirealms.craftengine.core.item.setting.FoodData;
|
||||
import net.momirealms.craftengine.core.plugin.context.ContextHolder;
|
||||
import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext;
|
||||
import net.momirealms.craftengine.core.plugin.context.event.EventTrigger;
|
||||
import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters;
|
||||
import net.momirealms.craftengine.core.util.Cancellable;
|
||||
import net.momirealms.craftengine.core.util.Direction;
|
||||
import net.momirealms.craftengine.core.util.*;
|
||||
import net.momirealms.craftengine.core.world.BlockHitResult;
|
||||
import net.momirealms.craftengine.core.world.BlockPos;
|
||||
import net.momirealms.craftengine.core.world.Vec3d;
|
||||
@@ -33,6 +33,7 @@ import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.Action;
|
||||
import org.bukkit.event.entity.FoodLevelChangeEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerItemConsumeEvent;
|
||||
import org.bukkit.inventory.EquipmentSlot;
|
||||
@@ -329,6 +330,36 @@ public class ItemEventListener implements Listener {
|
||||
if (event.isCancelled()) {
|
||||
return;
|
||||
}
|
||||
if (event.getPlayer().getGameMode() != GameMode.CREATIVE) {
|
||||
Key replacement = customItem.settings().consumeReplacement();
|
||||
if (replacement == null) {
|
||||
event.setReplacement(null);
|
||||
} else {
|
||||
ItemStack replacementItem = this.plugin.itemManager().buildItemStack(replacement, this.plugin.adapt(event.getPlayer()));
|
||||
event.setReplacement(replacementItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOW)
|
||||
public void onFoodLevelChange(FoodLevelChangeEvent event) {
|
||||
if (VersionHelper.isOrAbove1_20_5()) return;
|
||||
if (!(event.getEntity() instanceof Player player)) return;
|
||||
ItemStack consumedItem = event.getItem();
|
||||
if (ItemUtils.isEmpty(consumedItem)) return;
|
||||
Item<ItemStack> wrapped = this.plugin.itemManager().wrap(consumedItem);
|
||||
Optional<CustomItem<ItemStack>> optionalCustomItem = wrapped.getCustomItem();
|
||||
if (optionalCustomItem.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
CustomItem<ItemStack> customItem = optionalCustomItem.get();
|
||||
FoodData foodData = customItem.settings().foodData();
|
||||
if (foodData == null) return;
|
||||
event.setCancelled(true);
|
||||
int oldFoodLevel = player.getFoodLevel();
|
||||
if (foodData.nutrition() != 0) player.setFoodLevel(MCUtils.clamp(oldFoodLevel + foodData.nutrition(), 0, 20));
|
||||
float oldSaturation = player.getSaturation();
|
||||
if (foodData.saturation() != 0) player.setSaturation(MCUtils.clamp(oldSaturation, 0, 10));
|
||||
}
|
||||
|
||||
private boolean cancelEventIfHasInteraction(PlayerInteractEvent event, BukkitServerPlayer player, InteractionHand hand) {
|
||||
|
||||
@@ -48,6 +48,7 @@ import org.bstats.bukkit.Metrics;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.event.entity.FoodLevelChangeEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.jspecify.annotations.Nullable;
|
||||
|
||||
@@ -36,6 +36,7 @@ public class ItemSettings {
|
||||
boolean dyeable = true;
|
||||
Helmet helmet = null;
|
||||
FoodData foodData = null;
|
||||
Key consumeReplacement = null;
|
||||
|
||||
private ItemSettings() {}
|
||||
|
||||
@@ -72,6 +73,7 @@ public class ItemSettings {
|
||||
newSettings.dyeable = settings.dyeable;
|
||||
newSettings.helmet = settings.helmet;
|
||||
newSettings.foodData = settings.foodData;
|
||||
newSettings.consumeReplacement = settings.consumeReplacement;
|
||||
return newSettings;
|
||||
}
|
||||
|
||||
@@ -124,6 +126,11 @@ public class ItemSettings {
|
||||
return foodData;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Key consumeReplacement() {
|
||||
return consumeReplacement;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Helmet helmet() {
|
||||
return helmet;
|
||||
@@ -139,6 +146,11 @@ public class ItemSettings {
|
||||
return this;
|
||||
}
|
||||
|
||||
public ItemSettings consumeReplacement(Key key) {
|
||||
this.consumeReplacement = key;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ItemSettings canRepair(boolean canRepair) {
|
||||
this.canRepair = canRepair;
|
||||
return this;
|
||||
@@ -228,6 +240,7 @@ public class ItemSettings {
|
||||
int intValue = ResourceConfigUtils.getAsInt(value, "fuel-time");
|
||||
return settings -> settings.fuelTime(intValue);
|
||||
}));
|
||||
registerFactory("consume-replacement", (value -> settings -> settings.consumeReplacement(Key.of(value.toString()))));
|
||||
registerFactory("tags", (value -> {
|
||||
List<String> tags = MiscUtils.getAsStringList(value);
|
||||
return settings -> settings.tags(tags.stream().map(Key::of).collect(Collectors.toSet()));
|
||||
|
||||
Reference in New Issue
Block a user