64 lines
2.3 KiB
Java
64 lines
2.3 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 x, double y, double z, Level level, ItemStack item) {
|
|
super(entityType, x, y, z, level);
|
|
this.setItem(item);
|
|
}
|
|
|
|
public ThrowableItemProjectile(EntityType<? extends ThrowableItemProjectile> 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);
|
|
tag.put("Item", this.getItem().save(this.registryAccess()));
|
|
}
|
|
|
|
@Override
|
|
public void readAdditionalSaveData(CompoundTag tag) {
|
|
super.readAdditionalSaveData(tag);
|
|
if (tag.contains("Item", 10)) {
|
|
this.setItem((ItemStack)ItemStack.parse(this.registryAccess(), tag.getCompound("Item")).orElseGet(() -> new ItemStack(this.getDefaultItem())));
|
|
} else {
|
|
this.setItem(new ItemStack(this.getDefaultItem()));
|
|
}
|
|
}
|
|
}
|