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.Item;
|
||||||
import net.momirealms.craftengine.core.item.behavior.ItemBehavior;
|
import net.momirealms.craftengine.core.item.behavior.ItemBehavior;
|
||||||
import net.momirealms.craftengine.core.item.context.UseOnContext;
|
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.ContextHolder;
|
||||||
import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext;
|
import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext;
|
||||||
import net.momirealms.craftengine.core.plugin.context.event.EventTrigger;
|
import net.momirealms.craftengine.core.plugin.context.event.EventTrigger;
|
||||||
import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters;
|
import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters;
|
||||||
import net.momirealms.craftengine.core.util.Cancellable;
|
import net.momirealms.craftengine.core.util.*;
|
||||||
import net.momirealms.craftengine.core.util.Direction;
|
|
||||||
import net.momirealms.craftengine.core.world.BlockHitResult;
|
import net.momirealms.craftengine.core.world.BlockHitResult;
|
||||||
import net.momirealms.craftengine.core.world.BlockPos;
|
import net.momirealms.craftengine.core.world.BlockPos;
|
||||||
import net.momirealms.craftengine.core.world.Vec3d;
|
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.EventPriority;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.block.Action;
|
import org.bukkit.event.block.Action;
|
||||||
|
import org.bukkit.event.entity.FoodLevelChangeEvent;
|
||||||
import org.bukkit.event.player.PlayerInteractEvent;
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
import org.bukkit.event.player.PlayerItemConsumeEvent;
|
import org.bukkit.event.player.PlayerItemConsumeEvent;
|
||||||
import org.bukkit.inventory.EquipmentSlot;
|
import org.bukkit.inventory.EquipmentSlot;
|
||||||
@@ -329,6 +330,36 @@ public class ItemEventListener implements Listener {
|
|||||||
if (event.isCancelled()) {
|
if (event.isCancelled()) {
|
||||||
return;
|
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) {
|
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.Bukkit;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.event.entity.FoodLevelChangeEvent;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
import org.jspecify.annotations.Nullable;
|
import org.jspecify.annotations.Nullable;
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ public class ItemSettings {
|
|||||||
boolean dyeable = true;
|
boolean dyeable = true;
|
||||||
Helmet helmet = null;
|
Helmet helmet = null;
|
||||||
FoodData foodData = null;
|
FoodData foodData = null;
|
||||||
|
Key consumeReplacement = null;
|
||||||
|
|
||||||
private ItemSettings() {}
|
private ItemSettings() {}
|
||||||
|
|
||||||
@@ -72,6 +73,7 @@ public class ItemSettings {
|
|||||||
newSettings.dyeable = settings.dyeable;
|
newSettings.dyeable = settings.dyeable;
|
||||||
newSettings.helmet = settings.helmet;
|
newSettings.helmet = settings.helmet;
|
||||||
newSettings.foodData = settings.foodData;
|
newSettings.foodData = settings.foodData;
|
||||||
|
newSettings.consumeReplacement = settings.consumeReplacement;
|
||||||
return newSettings;
|
return newSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,6 +126,11 @@ public class ItemSettings {
|
|||||||
return foodData;
|
return foodData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public Key consumeReplacement() {
|
||||||
|
return consumeReplacement;
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public Helmet helmet() {
|
public Helmet helmet() {
|
||||||
return helmet;
|
return helmet;
|
||||||
@@ -139,6 +146,11 @@ public class ItemSettings {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ItemSettings consumeReplacement(Key key) {
|
||||||
|
this.consumeReplacement = key;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public ItemSettings canRepair(boolean canRepair) {
|
public ItemSettings canRepair(boolean canRepair) {
|
||||||
this.canRepair = canRepair;
|
this.canRepair = canRepair;
|
||||||
return this;
|
return this;
|
||||||
@@ -228,6 +240,7 @@ public class ItemSettings {
|
|||||||
int intValue = ResourceConfigUtils.getAsInt(value, "fuel-time");
|
int intValue = ResourceConfigUtils.getAsInt(value, "fuel-time");
|
||||||
return settings -> settings.fuelTime(intValue);
|
return settings -> settings.fuelTime(intValue);
|
||||||
}));
|
}));
|
||||||
|
registerFactory("consume-replacement", (value -> settings -> settings.consumeReplacement(Key.of(value.toString()))));
|
||||||
registerFactory("tags", (value -> {
|
registerFactory("tags", (value -> {
|
||||||
List<String> tags = MiscUtils.getAsStringList(value);
|
List<String> tags = MiscUtils.getAsStringList(value);
|
||||||
return settings -> settings.tags(tags.stream().map(Key::of).collect(Collectors.toSet()));
|
return settings -> settings.tags(tags.stream().map(Key::of).collect(Collectors.toSet()));
|
||||||
|
|||||||
Reference in New Issue
Block a user