diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java index 21436d077..d43d0649f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java @@ -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 wrapped = this.plugin.itemManager().wrap(consumedItem); + Optional> optionalCustomItem = wrapped.getCustomItem(); + if (optionalCustomItem.isEmpty()) { + return; + } + CustomItem 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) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java index d00647089..7902e8216 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java @@ -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; diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java index d8cae1654..9bf01f99a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java @@ -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 tags = MiscUtils.getAsStringList(value); return settings -> settings.tags(tags.stream().map(Key::of).collect(Collectors.toSet()));