minecraft-src/net/minecraft/world/entity/projectile/ThrowableItemProjectile.java
2025-07-04 02:00:41 +03:00

64 lines
2.4 KiB
Java

package net.minecraft.world.entity.projectile;
import net.minecraft.nbt.CompoundTag;
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.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<ItemStack> DATA_ITEM_STACK = SynchedEntityData.defineId(
ThrowableItemProjectile.class, EntityDataSerializers.ITEM_STACK
);
public ThrowableItemProjectile(EntityType<? extends ThrowableItemProjectile> entityType, Level level) {
super(entityType, level);
}
public ThrowableItemProjectile(EntityType<? extends ThrowableItemProjectile> entityType, double d, double e, double f, Level level, ItemStack itemStack) {
super(entityType, d, e, f, level);
this.setItem(itemStack);
}
public ThrowableItemProjectile(EntityType<? extends ThrowableItemProjectile> entityType, LivingEntity livingEntity, Level level, ItemStack itemStack) {
this(entityType, livingEntity.getX(), livingEntity.getEyeY() - 0.1F, livingEntity.getZ(), level, itemStack);
this.setOwner(livingEntity);
}
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 compound) {
super.addAdditionalSaveData(compound);
compound.put("Item", this.getItem().save(this.registryAccess()));
}
@Override
public void readAdditionalSaveData(CompoundTag compound) {
super.readAdditionalSaveData(compound);
if (compound.contains("Item", 10)) {
this.setItem((ItemStack)ItemStack.parse(this.registryAccess(), compound.getCompound("Item")).orElseGet(() -> new ItemStack(this.getDefaultItem())));
} else {
this.setItem(new ItemStack(this.getDefaultItem()));
}
}
}