minecraft-src/net/minecraft/world/RandomizableContainer.java
2025-07-04 03:45:38 +03:00

90 lines
3.1 KiB
Java

package net.minecraft.world;
import net.minecraft.advancements.CriteriaTriggers;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceKey;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.util.RandomSource;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.storage.loot.LootTable;
import net.minecraft.world.level.storage.loot.LootParams.Builder;
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets;
import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.Nullable;
public interface RandomizableContainer extends Container {
String LOOT_TABLE_TAG = "LootTable";
String LOOT_TABLE_SEED_TAG = "LootTableSeed";
@Nullable
ResourceKey<LootTable> getLootTable();
void setLootTable(@Nullable ResourceKey<LootTable> lootTable);
default void setLootTable(ResourceKey<LootTable> lootTable, long seed) {
this.setLootTable(lootTable);
this.setLootTableSeed(seed);
}
long getLootTableSeed();
void setLootTableSeed(long seed);
BlockPos getBlockPos();
@Nullable
Level getLevel();
static void setBlockEntityLootTable(BlockGetter level, RandomSource random, BlockPos ps, ResourceKey<LootTable> lootTable) {
if (level.getBlockEntity(ps) instanceof RandomizableContainer randomizableContainer) {
randomizableContainer.setLootTable(lootTable, random.nextLong());
}
}
default boolean tryLoadLootTable(CompoundTag tag) {
ResourceKey<LootTable> resourceKey = (ResourceKey<LootTable>)tag.read("LootTable", LootTable.KEY_CODEC).orElse(null);
this.setLootTable(resourceKey);
this.setLootTableSeed(tag.getLongOr("LootTableSeed", 0L));
return resourceKey != null;
}
default boolean trySaveLootTable(CompoundTag tag) {
ResourceKey<LootTable> resourceKey = this.getLootTable();
if (resourceKey == null) {
return false;
} else {
tag.store("LootTable", LootTable.KEY_CODEC, resourceKey);
long l = this.getLootTableSeed();
if (l != 0L) {
tag.putLong("LootTableSeed", l);
}
return true;
}
}
default void unpackLootTable(@Nullable Player player) {
Level level = this.getLevel();
BlockPos blockPos = this.getBlockPos();
ResourceKey<LootTable> resourceKey = this.getLootTable();
if (resourceKey != null && level != null && level.getServer() != null) {
LootTable lootTable = level.getServer().reloadableRegistries().getLootTable(resourceKey);
if (player instanceof ServerPlayer) {
CriteriaTriggers.GENERATE_LOOT.trigger((ServerPlayer)player, resourceKey);
}
this.setLootTable(null);
Builder builder = new Builder((ServerLevel)level).withParameter(LootContextParams.ORIGIN, Vec3.atCenterOf(blockPos));
if (player != null) {
builder.withLuck(player.getLuck()).withParameter(LootContextParams.THIS_ENTITY, player);
}
lootTable.fill(this, builder.create(LootContextParamSets.CHEST), this.getLootTableSeed());
}
}
}