minecraft-source/src/net/minecraft/world/item/ItemStack.java

831 lines
33 KiB
Java

package net.minecraft.world.item;
import java.util.AbstractList;
import org.apache.logging.log4j.LogManager;
import net.minecraft.sounds.SoundEvent;
import java.util.function.Predicate;
import net.minecraft.commands.arguments.blocks.BlockPredicateArgument;
import net.minecraft.tags.TagManager;
import java.util.Objects;
import net.minecraft.network.chat.HoverEvent;
import com.google.common.collect.HashMultimap;
import net.minecraft.world.item.enchantment.Enchantment;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.function.Function;
import net.minecraft.world.level.block.Block;
import net.minecraft.tags.BlockTags;
import net.minecraft.commands.arguments.blocks.BlockStateParser;
import com.mojang.brigadier.StringReader;
import java.util.Iterator;
import com.google.common.collect.Multimap;
import java.util.Collection;
import net.minecraft.world.entity.MobType;
import net.minecraft.world.entity.monster.SharedMonsterAttributes;
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
import java.util.Map;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.network.chat.ComponentUtils;
import net.minecraft.network.chat.Style;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.TextComponent;
import com.google.common.collect.Lists;
import java.util.List;
import com.google.gson.JsonParseException;
import net.minecraft.network.chat.Component;
import net.minecraft.nbt.ListTag;
import net.minecraft.world.entity.Entity;
import java.util.function.Consumer;
import net.minecraft.advancements.CriteriaTriggers;
import net.minecraft.world.item.enchantment.DigDurabilityEnchantment;
import net.minecraft.world.item.enchantment.EnchantmentHelper;
import net.minecraft.world.item.enchantment.Enchantments;
import javax.annotation.Nullable;
import net.minecraft.server.level.ServerPlayer;
import java.util.Random;
import net.minecraft.nbt.Tag;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.InteractionResultHolder;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.player.Player;
import net.minecraft.stats.Stat;
import net.minecraft.stats.Stats;
import net.minecraft.world.level.LevelReader;
import net.minecraft.world.InteractionResult;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.core.Registry;
import net.minecraft.world.level.ItemLike;
import java.text.DecimalFormatSymbols;
import java.util.Locale;
import net.minecraft.world.level.block.state.pattern.BlockInWorld;
import net.minecraft.world.entity.decoration.ItemFrame;
import net.minecraft.nbt.CompoundTag;
import java.text.DecimalFormat;
import org.apache.logging.log4j.Logger;
public final class ItemStack {
private static final Logger LOGGER;
public static final ItemStack EMPTY;
public static final DecimalFormat ATTRIBUTE_MODIFIER_FORMAT;
private int count;
private int popTime;
@Deprecated
private final Item item;
private CompoundTag tag;
private boolean emptyCacheFlag;
private ItemFrame frame;
private BlockInWorld cachedBreakBlock;
private boolean cachedBreakBlockResult;
private BlockInWorld cachedPlaceBlock;
private boolean cachedPlaceBlockResult;
private static DecimalFormat getAttributeDecimalFormat() {
final DecimalFormat decimalFormat1 = new DecimalFormat("#.##");
decimalFormat1.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.ROOT));
return decimalFormat1;
}
public ItemStack(final ItemLike bjs) {
this(bjs, 1);
}
public ItemStack(final ItemLike bjs, final int integer) {
this.item = ((bjs == null) ? null : bjs.asItem());
this.count = integer;
if (this.item != null && this.item.canBeDepleted()) {
this.setDamageValue(this.getDamageValue());
}
this.updateEmptyCacheFlag();
}
private void updateEmptyCacheFlag() {
this.emptyCacheFlag = false;
this.emptyCacheFlag = this.isEmpty();
}
private ItemStack(final CompoundTag jt) {
this.item = Registry.ITEM.get(new ResourceLocation(jt.getString("id")));
this.count = jt.getByte("Count");
if (jt.contains("tag", 10)) {
this.tag = jt.getCompound("tag");
this.getItem().verifyTagAfterLoad(jt);
}
if (this.getItem().canBeDepleted()) {
this.setDamageValue(this.getDamageValue());
}
this.updateEmptyCacheFlag();
}
public static ItemStack of(final CompoundTag jt) {
try {
return new ItemStack(jt);
}
catch (RuntimeException runtimeException2) {
ItemStack.LOGGER.debug("Tried to load invalid item: {}", jt, runtimeException2);
return ItemStack.EMPTY;
}
}
public boolean isEmpty() {
return this == ItemStack.EMPTY || (this.getItem() == null || this.getItem() == Items.AIR) || this.count <= 0;
}
public ItemStack split(final int integer) {
final int integer2 = Math.min(integer, this.count);
final ItemStack bek4 = this.copy();
bek4.setCount(integer2);
this.shrink(integer2);
return bek4;
}
public Item getItem() {
return this.emptyCacheFlag ? Items.AIR : this.item;
}
public InteractionResult useOn(final UseOnContext bfw) {
final Player ayg3 = bfw.getPlayer();
final BlockPos fk4 = bfw.getClickedPos();
final BlockInWorld byk5 = new BlockInWorld(bfw.getLevel(), fk4, false);
if (ayg3 != null && !ayg3.abilities.mayBuild && !this.hasAdventureModePlaceTagForBlock(bfw.getLevel().getTagManager(), byk5)) {
return InteractionResult.PASS;
}
final Item bef6 = this.getItem();
final InteractionResult aji7 = bef6.useOn(bfw);
if (ayg3 != null && aji7 == InteractionResult.SUCCESS) {
ayg3.awardStat(Stats.ITEM_USED.get(bef6));
}
return aji7;
}
public float getDestroySpeed(final BlockState byg) {
return this.getItem().getDestroySpeed(this, byg);
}
public InteractionResultHolder<ItemStack> use(final Level bjt, final Player ayg, final InteractionHand ajh) {
return this.getItem().use(bjt, ayg, ajh);
}
public ItemStack finishUsingItem(final Level bjt, final LivingEntity akw) {
return this.getItem().finishUsingItem(this, bjt, akw);
}
public CompoundTag save(final CompoundTag jt) {
final ResourceLocation sm3 = Registry.ITEM.getKey(this.getItem());
jt.putString("id", (sm3 == null) ? "minecraft:air" : sm3.toString());
jt.putByte("Count", (byte)this.count);
if (this.tag != null) {
jt.put("tag", this.tag.copy());
}
return jt;
}
public int getMaxStackSize() {
return this.getItem().getMaxStackSize();
}
public boolean isStackable() {
return this.getMaxStackSize() > 1 && (!this.isDamageableItem() || !this.isDamaged());
}
public boolean isDamageableItem() {
if (this.emptyCacheFlag || this.getItem().getMaxDamage() <= 0) {
return false;
}
final CompoundTag jt2 = this.getTag();
return jt2 == null || !jt2.getBoolean("Unbreakable");
}
public boolean isDamaged() {
return this.isDamageableItem() && this.getDamageValue() > 0;
}
public int getDamageValue() {
return (this.tag == null) ? 0 : this.tag.getInt("Damage");
}
public void setDamageValue(final int integer) {
this.getOrCreateTag().putInt("Damage", Math.max(0, integer));
}
public int getMaxDamage() {
return this.getItem().getMaxDamage();
}
public boolean hurt(int integer, final Random random, @Nullable final ServerPlayer xe) {
if (!this.isDamageableItem()) {
return false;
}
if (integer > 0) {
final int integer2 = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.UNBREAKING, this);
int integer3 = 0;
for (int integer4 = 0; integer2 > 0 && integer4 < integer; ++integer4) {
if (DigDurabilityEnchantment.shouldIgnoreDurabilityDrop(this, integer2, random)) {
++integer3;
}
}
integer -= integer3;
if (integer <= 0) {
return false;
}
}
if (xe != null && integer != 0) {
CriteriaTriggers.ITEM_DURABILITY_CHANGED.trigger(xe, this, this.getDamageValue() + integer);
}
final int integer2 = this.getDamageValue() + integer;
this.setDamageValue(integer2);
return integer2 >= this.getMaxDamage();
}
public <T extends LivingEntity> void hurtAndBreak(final int integer, final T akw, final Consumer<T> consumer) {
if (akw.level.isClientSide || (akw instanceof Player && ((Player)akw).abilities.instabuild)) {
return;
}
if (!this.isDamageableItem()) {
return;
}
if (this.hurt(integer, akw.getRandom(), (akw instanceof ServerPlayer) ? akw : null)) {
consumer.accept(akw);
final Item bef5 = this.getItem();
this.shrink(1);
if (akw instanceof Player) {
((Player)akw).awardStat(Stats.ITEM_BROKEN.get(bef5));
}
this.setDamageValue(0);
}
}
public void hurtEnemy(final LivingEntity akw, final Player ayg) {
final Item bef4 = this.getItem();
if (bef4.hurtEnemy(this, akw, ayg)) {
ayg.awardStat(Stats.ITEM_USED.get(bef4));
}
}
public void mineBlock(final Level bjt, final BlockState byg, final BlockPos fk, final Player ayg) {
final Item bef6 = this.getItem();
if (bef6.mineBlock(this, bjt, byg, fk, ayg)) {
ayg.awardStat(Stats.ITEM_USED.get(bef6));
}
}
public boolean canDestroySpecial(final BlockState byg) {
return this.getItem().canDestroySpecial(byg);
}
public boolean interactEnemy(final Player ayg, final LivingEntity akw, final InteractionHand ajh) {
return this.getItem().interactEnemy(this, ayg, akw, ajh);
}
public ItemStack copy() {
if (this.isEmpty()) {
return ItemStack.EMPTY;
}
final ItemStack bek2 = new ItemStack(this.getItem(), this.count);
bek2.setPopTime(this.getPopTime());
if (this.tag != null) {
bek2.tag = this.tag.copy();
}
return bek2;
}
public static boolean tagMatches(final ItemStack bek1, final ItemStack bek2) {
return (bek1.isEmpty() && bek2.isEmpty()) || (!bek1.isEmpty() && !bek2.isEmpty() && (bek1.tag != null || bek2.tag == null) && (bek1.tag == null || bek1.tag.equals(bek2.tag)));
}
public static boolean matches(final ItemStack bek1, final ItemStack bek2) {
return (bek1.isEmpty() && bek2.isEmpty()) || (!bek1.isEmpty() && !bek2.isEmpty() && bek1.matches(bek2));
}
private boolean matches(final ItemStack bek) {
return this.count == bek.count && this.getItem() == bek.getItem() && (this.tag != null || bek.tag == null) && (this.tag == null || this.tag.equals(bek.tag));
}
public static boolean isSame(final ItemStack bek1, final ItemStack bek2) {
return bek1 == bek2 || (!bek1.isEmpty() && !bek2.isEmpty() && bek1.sameItem(bek2));
}
public static boolean isSameIgnoreDurability(final ItemStack bek1, final ItemStack bek2) {
return bek1 == bek2 || (!bek1.isEmpty() && !bek2.isEmpty() && bek1.sameItemStackIgnoreDurability(bek2));
}
public boolean sameItem(final ItemStack bek) {
return !bek.isEmpty() && this.getItem() == bek.getItem();
}
public boolean sameItemStackIgnoreDurability(final ItemStack bek) {
if (this.isDamageableItem()) {
return !bek.isEmpty() && this.getItem() == bek.getItem();
}
return this.sameItem(bek);
}
public String getDescriptionId() {
return this.getItem().getDescriptionId(this);
}
@Override
public String toString() {
return this.count + " " + this.getItem();
}
public void inventoryTick(final Level bjt, final Entity akn, final int integer, final boolean boolean4) {
if (this.popTime > 0) {
--this.popTime;
}
if (this.getItem() != null) {
this.getItem().inventoryTick(this, bjt, akn, integer, boolean4);
}
}
public void onCraftedBy(final Level bjt, final Player ayg, final int integer) {
ayg.awardStat(Stats.ITEM_CRAFTED.get(this.getItem()), integer);
this.getItem().onCraftedBy(this, bjt, ayg);
}
public int getUseDuration() {
return this.getItem().getUseDuration(this);
}
public UseAnim getUseAnimation() {
return this.getItem().getUseAnimation(this);
}
public void releaseUsing(final Level bjt, final LivingEntity akw, final int integer) {
this.getItem().releaseUsing(this, bjt, akw, integer);
}
public boolean useOnRelease() {
return this.getItem().useOnRelease(this);
}
public boolean hasTag() {
return !this.emptyCacheFlag && this.tag != null && !this.tag.isEmpty();
}
@Nullable
public CompoundTag getTag() {
return this.tag;
}
public CompoundTag getOrCreateTag() {
if (this.tag == null) {
this.setTag(new CompoundTag());
}
return this.tag;
}
public CompoundTag getOrCreateTagElement(final String string) {
if (this.tag == null || !this.tag.contains(string, 10)) {
final CompoundTag jt3 = new CompoundTag();
this.addTagElement(string, jt3);
return jt3;
}
return this.tag.getCompound(string);
}
@Nullable
public CompoundTag getTagElement(final String string) {
if (this.tag == null || !this.tag.contains(string, 10)) {
return null;
}
return this.tag.getCompound(string);
}
public void removeTagKey(final String string) {
if (this.tag != null && this.tag.contains(string)) {
this.tag.remove(string);
if (this.tag.isEmpty()) {
this.tag = null;
}
}
}
public ListTag getEnchantmentTags() {
if (this.tag != null) {
return this.tag.getList("Enchantments", 10);
}
return new ListTag();
}
public void setTag(@Nullable final CompoundTag jt) {
this.tag = jt;
if (this.getItem().canBeDepleted()) {
this.setDamageValue(this.getDamageValue());
}
}
public Component getHoverName() {
final CompoundTag jt2 = this.getTagElement("display");
if (jt2 != null && jt2.contains("Name", 8)) {
try {
final Component lf3 = Component.Serializer.fromJson(jt2.getString("Name"));
if (lf3 != null) {
return lf3;
}
jt2.remove("Name");
}
catch (JsonParseException jsonParseException3) {
jt2.remove("Name");
}
}
return this.getItem().getName(this);
}
public ItemStack setHoverName(@Nullable final Component lf) {
final CompoundTag jt3 = this.getOrCreateTagElement("display");
if (lf != null) {
jt3.putString("Name", Component.Serializer.toJson(lf));
}
else {
jt3.remove("Name");
}
return this;
}
public void resetHoverName() {
final CompoundTag jt2 = this.getTagElement("display");
if (jt2 != null) {
jt2.remove("Name");
if (jt2.isEmpty()) {
this.removeTagKey("display");
}
}
if (this.tag != null && this.tag.isEmpty()) {
this.tag = null;
}
}
public boolean hasCustomHoverName() {
final CompoundTag jt2 = this.getTagElement("display");
return jt2 != null && jt2.contains("Name", 8);
}
public List<Component> getTooltipLines(@Nullable final Player ayg, final TooltipFlag bft) {
final List<Component> list4 = Lists.newArrayList();
final Component lf5 = new TextComponent("").append(this.getHoverName()).withStyle(this.getRarity().color);
if (this.hasCustomHoverName()) {
lf5.withStyle(ChatFormatting.ITALIC);
}
list4.add(lf5);
if (!bft.isAdvanced() && !this.hasCustomHoverName() && this.getItem() == Items.FILLED_MAP) {
list4.add(new TextComponent("#" + MapItem.getMapId(this)).withStyle(ChatFormatting.GRAY));
}
int integer6 = 0;
if (this.hasTag() && this.tag.contains("HideFlags", 99)) {
integer6 = this.tag.getInt("HideFlags");
}
if ((integer6 & 0x20) == 0x0) {
this.getItem().appendHoverText(this, (ayg == null) ? null : ayg.level, list4, bft);
}
if (this.hasTag()) {
if ((integer6 & 0x1) == 0x0) {
appendEnchantmentNames(list4, this.getEnchantmentTags());
}
if (this.tag.contains("display", 10)) {
final CompoundTag jt7 = this.tag.getCompound("display");
if (jt7.contains("color", 3)) {
if (bft.isAdvanced()) {
list4.add(new TranslatableComponent("item.color", new Object[] { String.format("#%06X", jt7.getInt("color")) }).withStyle(ChatFormatting.GRAY));
}
else {
list4.add(new TranslatableComponent("item.dyed", new Object[0]).withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC));
}
}
if (jt7.getTagType("Lore") == 9) {
final ListTag jz8 = jt7.getList("Lore", 8);
for (int integer7 = 0; integer7 < jz8.size(); ++integer7) {
final String string10 = jz8.getString(integer7);
try {
final Component lf6 = Component.Serializer.fromJson(string10);
if (lf6 != null) {
list4.add(ComponentUtils.mergeStyles(lf6, new Style().setColor(ChatFormatting.DARK_PURPLE).setItalic(true)));
}
}
catch (JsonParseException jsonParseException11) {
jt7.remove("Lore");
}
}
}
}
}
for (final EquipmentSlot aks10 : EquipmentSlot.values()) {
final Multimap<String, AttributeModifier> multimap11 = this.getAttributeModifiers(aks10);
if (!multimap11.isEmpty() && (integer6 & 0x2) == 0x0) {
list4.add(new TextComponent(""));
list4.add(new TranslatableComponent("item.modifiers." + aks10.getName(), new Object[0]).withStyle(ChatFormatting.GRAY));
for (final Map.Entry<String, AttributeModifier> entry13 : multimap11.entries()) {
final AttributeModifier alp14 = entry13.getValue();
double double15 = alp14.getAmount();
boolean boolean19 = false;
if (ayg != null) {
if (alp14.getId() == Item.BASE_ATTACK_DAMAGE_UUID) {
double15 += ayg.getAttribute(SharedMonsterAttributes.ATTACK_DAMAGE).getBaseValue();
double15 += EnchantmentHelper.getDamageBonus(this, MobType.UNDEFINED);
boolean19 = true;
}
else if (alp14.getId() == Item.BASE_ATTACK_SPEED_UUID) {
double15 += ayg.getAttribute(SharedMonsterAttributes.ATTACK_SPEED).getBaseValue();
boolean19 = true;
}
}
double double16;
if (alp14.getOperation() == AttributeModifier.Operation.MULTIPLY_BASE || alp14.getOperation() == AttributeModifier.Operation.MULTIPLY_TOTAL) {
double16 = double15 * 100.0;
}
else {
double16 = double15;
}
if (boolean19) {
list4.add(new TextComponent(" ").append(new TranslatableComponent("attribute.modifier.equals." + alp14.getOperation().toValue(), new Object[] { ItemStack.ATTRIBUTE_MODIFIER_FORMAT.format(double16), new TranslatableComponent("attribute.name." + entry13.getKey(), new Object[0]) })).withStyle(ChatFormatting.DARK_GREEN));
}
else if (double15 > 0.0) {
list4.add(new TranslatableComponent("attribute.modifier.plus." + alp14.getOperation().toValue(), new Object[] { ItemStack.ATTRIBUTE_MODIFIER_FORMAT.format(double16), new TranslatableComponent("attribute.name." + entry13.getKey(), new Object[0]) }).withStyle(ChatFormatting.BLUE));
}
else {
if (double15 >= 0.0) {
continue;
}
double16 *= -1.0;
list4.add(new TranslatableComponent("attribute.modifier.take." + alp14.getOperation().toValue(), new Object[] { ItemStack.ATTRIBUTE_MODIFIER_FORMAT.format(double16), new TranslatableComponent("attribute.name." + entry13.getKey(), new Object[0]) }).withStyle(ChatFormatting.RED));
}
}
}
}
if (this.hasTag() && this.getTag().getBoolean("Unbreakable") && (integer6 & 0x4) == 0x0) {
list4.add(new TranslatableComponent("item.unbreakable", new Object[0]).withStyle(ChatFormatting.BLUE));
}
if (this.hasTag() && this.tag.contains("CanDestroy", 9) && (integer6 & 0x8) == 0x0) {
final ListTag jz9 = this.tag.getList("CanDestroy", 8);
if (!jz9.isEmpty()) {
list4.add(new TextComponent(""));
list4.add(new TranslatableComponent("item.canBreak", new Object[0]).withStyle(ChatFormatting.GRAY));
for (int integer8 = 0; integer8 < jz9.size(); ++integer8) {
list4.addAll(expandBlockState(jz9.getString(integer8)));
}
}
}
if (this.hasTag() && this.tag.contains("CanPlaceOn", 9) && (integer6 & 0x10) == 0x0) {
final ListTag jz9 = this.tag.getList("CanPlaceOn", 8);
if (!jz9.isEmpty()) {
list4.add(new TextComponent(""));
list4.add(new TranslatableComponent("item.canPlace", new Object[0]).withStyle(ChatFormatting.GRAY));
for (int integer8 = 0; integer8 < jz9.size(); ++integer8) {
list4.addAll(expandBlockState(jz9.getString(integer8)));
}
}
}
if (bft.isAdvanced()) {
if (this.isDamaged()) {
list4.add(new TranslatableComponent("item.durability", new Object[] { this.getMaxDamage() - this.getDamageValue(), this.getMaxDamage() }));
}
list4.add(new TextComponent(Registry.ITEM.getKey(this.getItem()).toString()).withStyle(ChatFormatting.DARK_GRAY));
if (this.hasTag()) {
list4.add(new TranslatableComponent("item.nbt_tags", new Object[] { this.getTag().getAllKeys().size() }).withStyle(ChatFormatting.DARK_GRAY));
}
}
return list4;
}
public static void appendEnchantmentNames(final List<Component> list, final ListTag jz) {
for (int integer3 = 0; integer3 < jz.size(); ++integer3) {
final CompoundTag jt4 = jz.getCompound(integer3);
Registry.ENCHANTMENT.getOptional(ResourceLocation.tryParse(jt4.getString("id"))).ifPresent(bhu -> list.add(bhu.getFullname(jt4.getInt("lvl"))));
}
}
private static Collection<Component> expandBlockState(final String string) {
try {
final BlockStateParser dv2 = new BlockStateParser(new StringReader(string), true).parse(true);
final BlockState byg3 = dv2.getState();
final ResourceLocation sm4 = dv2.getTag();
final boolean boolean5 = byg3 != null;
final boolean boolean6 = sm4 != null;
if (boolean5 || boolean6) {
if (boolean5) {
return Lists.newArrayList(byg3.getBlock().getName().withStyle(ChatFormatting.DARK_GRAY));
}
final net.minecraft.tags.Tag<Block> aaz7 = BlockTags.getAllTags().getTag(sm4);
if (aaz7 != null) {
final Collection<Block> collection8 = aaz7.getValues();
if (!collection8.isEmpty()) {
return collection8.stream().map(Block::getName).map(lf -> lf.withStyle(ChatFormatting.DARK_GRAY)).collect(Collectors.toList());
}
}
}
}
catch (CommandSyntaxException ex) {}
return Lists.newArrayList(new TextComponent("missingno").withStyle(ChatFormatting.DARK_GRAY));
}
public boolean hasFoil() {
return this.getItem().isFoil(this);
}
public Rarity getRarity() {
return this.getItem().getRarity(this);
}
public boolean isEnchantable() {
return this.getItem().isEnchantable(this) && !this.isEnchanted();
}
public void enchant(final Enchantment bhu, final int integer) {
this.getOrCreateTag();
if (!this.tag.contains("Enchantments", 9)) {
this.tag.put("Enchantments", new ListTag());
}
final ListTag jz4 = this.tag.getList("Enchantments", 10);
final CompoundTag jt5 = new CompoundTag();
jt5.putString("id", String.valueOf(Registry.ENCHANTMENT.getKey(bhu)));
jt5.putShort("lvl", (byte)integer);
((AbstractList<CompoundTag>)jz4).add(jt5);
}
public boolean isEnchanted() {
return this.tag != null && this.tag.contains("Enchantments", 9) && !this.tag.getList("Enchantments", 10).isEmpty();
}
public void addTagElement(final String string, final Tag kj) {
this.getOrCreateTag().put(string, kj);
}
public boolean isFramed() {
return this.frame != null;
}
public void setFramed(@Nullable final ItemFrame avo) {
this.frame = avo;
}
@Nullable
public ItemFrame getFrame() {
return this.emptyCacheFlag ? null : this.frame;
}
public int getBaseRepairCost() {
if (this.hasTag() && this.tag.contains("RepairCost", 3)) {
return this.tag.getInt("RepairCost");
}
return 0;
}
public void setRepairCost(final int integer) {
this.getOrCreateTag().putInt("RepairCost", integer);
}
public Multimap<String, AttributeModifier> getAttributeModifiers(final EquipmentSlot aks) {
Multimap<String, AttributeModifier> multimap3;
if (this.hasTag() && this.tag.contains("AttributeModifiers", 9)) {
multimap3 = HashMultimap.create();
final ListTag jz4 = this.tag.getList("AttributeModifiers", 10);
for (int integer5 = 0; integer5 < jz4.size(); ++integer5) {
final CompoundTag jt6 = jz4.getCompound(integer5);
final AttributeModifier alp2 = SharedMonsterAttributes.loadAttributeModifier(jt6);
if (alp2 != null) {
if (!jt6.contains("Slot", 8) || jt6.getString("Slot").equals(aks.getName())) {
if (alp2.getId().getLeastSignificantBits() != 0L && alp2.getId().getMostSignificantBits() != 0L) {
multimap3.put(jt6.getString("AttributeName"), alp2);
}
}
}
}
}
else {
multimap3 = this.getItem().getDefaultAttributeModifiers(aks);
}
multimap3.values().forEach(alp -> alp.setSerialize(false));
return multimap3;
}
public void addAttributeModifier(final String string, final AttributeModifier alp, @Nullable final EquipmentSlot aks) {
this.getOrCreateTag();
if (!this.tag.contains("AttributeModifiers", 9)) {
this.tag.put("AttributeModifiers", new ListTag());
}
final ListTag jz5 = this.tag.getList("AttributeModifiers", 10);
final CompoundTag jt6 = SharedMonsterAttributes.saveAttributeModifier(alp);
jt6.putString("AttributeName", string);
if (aks != null) {
jt6.putString("Slot", aks.getName());
}
((AbstractList<CompoundTag>)jz5).add(jt6);
}
public Component getDisplayName() {
final Component lf2 = new TextComponent("").append(this.getHoverName());
if (this.hasCustomHoverName()) {
lf2.withStyle(ChatFormatting.ITALIC);
}
final Component lf3 = ComponentUtils.wrapInSquareBrackets(lf2);
if (!this.emptyCacheFlag) {
final CompoundTag jt4 = this.save(new CompoundTag());
final HoverEvent hoverEvent;
final CompoundTag compoundTag;
lf3.withStyle(this.getRarity().color).withStyle(ln -> {
new HoverEvent(HoverEvent.Action.SHOW_ITEM, new TextComponent(compoundTag.toString()));
ln.setHoverEvent(hoverEvent);
return;
});
}
return lf3;
}
private static boolean areSameBlocks(final BlockInWorld byk1, @Nullable final BlockInWorld byk2) {
return byk2 != null && byk1.getState() == byk2.getState() && ((byk1.getEntity() == null && byk2.getEntity() == null) || (byk1.getEntity() != null && byk2.getEntity() != null && Objects.equals(byk1.getEntity().save(new CompoundTag()), byk2.getEntity().save(new CompoundTag()))));
}
public boolean hasAdventureModeBreakTagForBlock(final TagManager abb, final BlockInWorld byk) {
if (areSameBlocks(byk, this.cachedBreakBlock)) {
return this.cachedBreakBlockResult;
}
this.cachedBreakBlock = byk;
if (this.hasTag() && this.tag.contains("CanDestroy", 9)) {
final ListTag jz4 = this.tag.getList("CanDestroy", 8);
for (int integer5 = 0; integer5 < jz4.size(); ++integer5) {
final String string6 = jz4.getString(integer5);
try {
final Predicate<BlockInWorld> predicate7 = BlockPredicateArgument.blockPredicate().parse(new StringReader(string6)).create(abb);
if (predicate7.test(byk)) {
return this.cachedBreakBlockResult = true;
}
}
catch (CommandSyntaxException ex) {}
}
}
return this.cachedBreakBlockResult = false;
}
public boolean hasAdventureModePlaceTagForBlock(final TagManager abb, final BlockInWorld byk) {
if (areSameBlocks(byk, this.cachedPlaceBlock)) {
return this.cachedPlaceBlockResult;
}
this.cachedPlaceBlock = byk;
if (this.hasTag() && this.tag.contains("CanPlaceOn", 9)) {
final ListTag jz4 = this.tag.getList("CanPlaceOn", 8);
for (int integer5 = 0; integer5 < jz4.size(); ++integer5) {
final String string6 = jz4.getString(integer5);
try {
final Predicate<BlockInWorld> predicate7 = BlockPredicateArgument.blockPredicate().parse(new StringReader(string6)).create(abb);
if (predicate7.test(byk)) {
return this.cachedPlaceBlockResult = true;
}
}
catch (CommandSyntaxException ex) {}
}
}
return this.cachedPlaceBlockResult = false;
}
public int getPopTime() {
return this.popTime;
}
public void setPopTime(final int integer) {
this.popTime = integer;
}
public int getCount() {
return this.emptyCacheFlag ? 0 : this.count;
}
public void setCount(final int integer) {
this.count = integer;
this.updateEmptyCacheFlag();
}
public void grow(final int integer) {
this.setCount(this.count + integer);
}
public void shrink(final int integer) {
this.grow(-integer);
}
public void onUseTick(final Level bjt, final LivingEntity akw, final int integer) {
this.getItem().onUseTick(bjt, akw, this, integer);
}
public boolean isEdible() {
return this.getItem().isEdible();
}
public SoundEvent getDrinkingSound() {
return this.getItem().getDrinkingSound();
}
public SoundEvent getEatingSound() {
return this.getItem().getEatingSound();
}
static {
LOGGER = LogManager.getLogger();
EMPTY = new ItemStack((ItemLike)null);
ATTRIBUTE_MODIFIER_FORMAT = getAttributeDecimalFormat();
}
}