minecraft-src/net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity.java
2025-07-04 02:00:41 +03:00

118 lines
3.3 KiB
Java

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> lootTable;
protected long lootTableSeed = 0L;
protected RandomizableContainerBlockEntity(BlockEntityType<?> type, BlockPos pos, BlockState blockState) {
super(type, pos, blockState);
}
@Nullable
@Override
public ResourceKey<LootTable> getLootTable() {
return this.lootTable;
}
@Override
public void setLootTable(@Nullable ResourceKey<LootTable> 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");
}
}