package net.minecraft.world.level.block.entity; import net.minecraft.core.BlockPos; import net.minecraft.core.component.DataComponents; import net.minecraft.core.component.DataComponentMap.Builder; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceKey; import net.minecraft.world.RandomizableContainer; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.component.SeededContainerLoot; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.storage.loot.LootTable; import org.jetbrains.annotations.Nullable; public abstract class RandomizableContainerBlockEntity extends BaseContainerBlockEntity implements RandomizableContainer { @Nullable protected ResourceKey lootTable; protected long lootTableSeed = 0L; protected RandomizableContainerBlockEntity(BlockEntityType type, BlockPos pos, BlockState blockState) { super(type, pos, blockState); } @Nullable @Override public ResourceKey getLootTable() { return this.lootTable; } @Override public void setLootTable(@Nullable ResourceKey lootTable) { this.lootTable = lootTable; } @Override public long getLootTableSeed() { return this.lootTableSeed; } @Override public void setLootTableSeed(long seed) { this.lootTableSeed = seed; } @Override public boolean isEmpty() { this.unpackLootTable(null); return super.isEmpty(); } @Override public ItemStack getItem(int slot) { this.unpackLootTable(null); return super.getItem(slot); } @Override public ItemStack removeItem(int slot, int amount) { this.unpackLootTable(null); return super.removeItem(slot, amount); } @Override public ItemStack removeItemNoUpdate(int slot) { this.unpackLootTable(null); return super.removeItemNoUpdate(slot); } @Override public void setItem(int slot, ItemStack stack) { this.unpackLootTable(null); super.setItem(slot, stack); } @Override public boolean canOpen(Player player) { return super.canOpen(player) && (this.lootTable == null || !player.isSpectator()); } @Nullable @Override public AbstractContainerMenu createMenu(int i, Inventory inventory, Player player) { if (this.canOpen(player)) { this.unpackLootTable(inventory.player); return this.createMenu(i, inventory); } else { return null; } } @Override protected void applyImplicitComponents(BlockEntity.DataComponentInput componentInput) { super.applyImplicitComponents(componentInput); SeededContainerLoot seededContainerLoot = componentInput.get(DataComponents.CONTAINER_LOOT); if (seededContainerLoot != null) { this.lootTable = seededContainerLoot.lootTable(); this.lootTableSeed = seededContainerLoot.seed(); } } @Override protected void collectImplicitComponents(Builder components) { super.collectImplicitComponents(components); if (this.lootTable != null) { components.set(DataComponents.CONTAINER_LOOT, new SeededContainerLoot(this.lootTable, this.lootTableSeed)); } } @Override public void removeComponentsFromTag(CompoundTag tag) { super.removeComponentsFromTag(tag); tag.remove("LootTable"); tag.remove("LootTableSeed"); } }