package net.minecraft.world.entity.projectile; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.Tag; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.network.syncher.SynchedEntityData.Builder; import net.minecraft.resources.RegistryOps; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; public abstract class ThrowableItemProjectile extends ThrowableProjectile implements ItemSupplier { private static final EntityDataAccessor DATA_ITEM_STACK = SynchedEntityData.defineId( ThrowableItemProjectile.class, EntityDataSerializers.ITEM_STACK ); public ThrowableItemProjectile(EntityType entityType, Level level) { super(entityType, level); } public ThrowableItemProjectile(EntityType entityType, double x, double y, double z, Level level, ItemStack item) { super(entityType, x, y, z, level); this.setItem(item); } public ThrowableItemProjectile(EntityType entityType, LivingEntity owner, Level level, ItemStack item) { this(entityType, owner.getX(), owner.getEyeY() - 0.1F, owner.getZ(), level, item); this.setOwner(owner); } public void setItem(ItemStack stack) { this.getEntityData().set(DATA_ITEM_STACK, stack.copyWithCount(1)); } protected abstract Item getDefaultItem(); @Override public ItemStack getItem() { return this.getEntityData().get(DATA_ITEM_STACK); } @Override protected void defineSynchedData(Builder builder) { builder.define(DATA_ITEM_STACK, new ItemStack(this.getDefaultItem())); } @Override public void addAdditionalSaveData(CompoundTag tag) { super.addAdditionalSaveData(tag); RegistryOps registryOps = this.registryAccess().createSerializationContext(NbtOps.INSTANCE); tag.store("Item", ItemStack.CODEC, registryOps, this.getItem()); } @Override public void readAdditionalSaveData(CompoundTag tag) { super.readAdditionalSaveData(tag); RegistryOps registryOps = this.registryAccess().createSerializationContext(NbtOps.INSTANCE); this.setItem((ItemStack)tag.read("Item", ItemStack.CODEC, registryOps).orElseGet(() -> new ItemStack(this.getDefaultItem()))); } }