minecraft-src/net/minecraft/world/item/component/ChargedProjectiles.java
2025-07-04 03:45:38 +03:00

107 lines
3.5 KiB
Java

package net.minecraft.world.item.component;
import com.google.common.collect.Lists;
import com.mojang.serialization.Codec;
import java.util.List;
import java.util.function.Consumer;
import net.minecraft.ChatFormatting;
import net.minecraft.core.component.DataComponentGetter;
import net.minecraft.core.component.DataComponents;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.chat.Component;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag;
public final class ChargedProjectiles implements TooltipProvider {
public static final ChargedProjectiles EMPTY = new ChargedProjectiles(List.of());
public static final Codec<ChargedProjectiles> CODEC = ItemStack.CODEC.listOf().xmap(ChargedProjectiles::new, chargedProjectiles -> chargedProjectiles.items);
public static final StreamCodec<RegistryFriendlyByteBuf, ChargedProjectiles> STREAM_CODEC = ItemStack.STREAM_CODEC
.apply(ByteBufCodecs.list())
.map(ChargedProjectiles::new, chargedProjectiles -> chargedProjectiles.items);
private final List<ItemStack> items;
private ChargedProjectiles(List<ItemStack> items) {
this.items = items;
}
public static ChargedProjectiles of(ItemStack stack) {
return new ChargedProjectiles(List.of(stack.copy()));
}
public static ChargedProjectiles of(List<ItemStack> stack) {
return new ChargedProjectiles(List.copyOf(Lists.<ItemStack, ItemStack>transform(stack, ItemStack::copy)));
}
public boolean contains(Item item) {
for (ItemStack itemStack : this.items) {
if (itemStack.is(item)) {
return true;
}
}
return false;
}
public List<ItemStack> getItems() {
return Lists.transform(this.items, ItemStack::copy);
}
public boolean isEmpty() {
return this.items.isEmpty();
}
public boolean equals(Object object) {
return this == object ? true : object instanceof ChargedProjectiles chargedProjectiles && ItemStack.listMatches(this.items, chargedProjectiles.items);
}
public int hashCode() {
return ItemStack.hashStackList(this.items);
}
public String toString() {
return "ChargedProjectiles[items=" + this.items + "]";
}
@Override
public void addToTooltip(Item.TooltipContext context, Consumer<Component> tooltipAdder, TooltipFlag flag, DataComponentGetter componentGetter) {
ItemStack itemStack = null;
int i = 0;
for (ItemStack itemStack2 : this.items) {
if (itemStack == null) {
itemStack = itemStack2;
i = 1;
} else if (ItemStack.matches(itemStack, itemStack2)) {
i++;
} else {
addProjectileTooltip(context, tooltipAdder, itemStack, i);
itemStack = itemStack2;
i = 1;
}
}
if (itemStack != null) {
addProjectileTooltip(context, tooltipAdder, itemStack, i);
}
}
private static void addProjectileTooltip(Item.TooltipContext context, Consumer<Component> tooltipAdder, ItemStack stack, int count) {
if (count == 1) {
tooltipAdder.accept(Component.translatable("item.minecraft.crossbow.projectile.single", stack.getDisplayName()));
} else {
tooltipAdder.accept(Component.translatable("item.minecraft.crossbow.projectile.multiple", count, stack.getDisplayName()));
}
TooltipDisplay tooltipDisplay = stack.getOrDefault(DataComponents.TOOLTIP_DISPLAY, TooltipDisplay.DEFAULT);
stack.addDetailsToTooltip(
context,
tooltipDisplay,
null,
TooltipFlag.NORMAL,
component -> tooltipAdder.accept(Component.literal(" ").append(component).withStyle(ChatFormatting.GRAY))
);
}
}