9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-19 15:09:15 +00:00

food和返还物品

This commit is contained in:
XiaoMoMi
2025-06-08 19:54:25 +08:00
parent a5d6ce8107
commit 959515d023
3 changed files with 47 additions and 2 deletions

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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()));