118 lines
3.3 KiB
Java
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<?> blockEntityType, BlockPos blockPos, BlockState blockState) {
|
|
super(blockEntityType, blockPos, 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");
|
|
}
|
|
}
|