minecraft_25w45a_unobfuscated/net/minecraft/world/RandomizableContainer.java
2025-11-24 22:52:51 +03:00

98 lines
3.9 KiB
Java

/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* org.jspecify.annotations.Nullable
*/
package net.minecraft.world;
import net.minecraft.advancements.CriteriaTriggers;
import net.minecraft.core.BlockPos;
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.Container;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.storage.ValueInput;
import net.minecraft.world.level.storage.ValueOutput;
import net.minecraft.world.level.storage.loot.LootParams;
import net.minecraft.world.level.storage.loot.LootTable;
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.jspecify.annotations.Nullable;
public interface RandomizableContainer
extends Container {
public static final String LOOT_TABLE_TAG = "LootTable";
public static final String LOOT_TABLE_SEED_TAG = "LootTableSeed";
public @Nullable ResourceKey<LootTable> getLootTable();
public void setLootTable(@Nullable ResourceKey<LootTable> var1);
default public void setLootTable(ResourceKey<LootTable> lootTable, long seed) {
this.setLootTable(lootTable);
this.setLootTableSeed(seed);
}
public long getLootTableSeed();
public void setLootTableSeed(long var1);
public BlockPos getBlockPos();
public @Nullable Level getLevel();
public static void setBlockEntityLootTable(BlockGetter level, RandomSource random, BlockPos blockEntityPos, ResourceKey<LootTable> lootTable) {
BlockEntity blockEntity = level.getBlockEntity(blockEntityPos);
if (blockEntity instanceof RandomizableContainer) {
RandomizableContainer randomizableContainer = (RandomizableContainer)((Object)blockEntity);
randomizableContainer.setLootTable(lootTable, random.nextLong());
}
}
default public boolean tryLoadLootTable(ValueInput base) {
ResourceKey lootTable = base.read(LOOT_TABLE_TAG, LootTable.KEY_CODEC).orElse(null);
this.setLootTable(lootTable);
this.setLootTableSeed(base.getLongOr(LOOT_TABLE_SEED_TAG, 0L));
return lootTable != null;
}
default public boolean trySaveLootTable(ValueOutput base) {
ResourceKey<LootTable> lootTable = this.getLootTable();
if (lootTable == null) {
return false;
}
base.store(LOOT_TABLE_TAG, LootTable.KEY_CODEC, lootTable);
long lootTableSeed = this.getLootTableSeed();
if (lootTableSeed != 0L) {
base.putLong(LOOT_TABLE_SEED_TAG, lootTableSeed);
}
return true;
}
default public void unpackLootTable(@Nullable Player player) {
Level level = this.getLevel();
BlockPos worldPosition = this.getBlockPos();
ResourceKey<LootTable> lootTableKey = this.getLootTable();
if (lootTableKey != null && level != null && level.getServer() != null) {
LootTable lootTable = level.getServer().reloadableRegistries().getLootTable(lootTableKey);
if (player instanceof ServerPlayer) {
CriteriaTriggers.GENERATE_LOOT.trigger((ServerPlayer)player, lootTableKey);
}
this.setLootTable(null);
LootParams.Builder params = new LootParams.Builder((ServerLevel)level).withParameter(LootContextParams.ORIGIN, Vec3.atCenterOf(worldPosition));
if (player != null) {
params.withLuck(player.getLuck()).withParameter(LootContextParams.THIS_ENTITY, player);
}
lootTable.fill(this, params.create(LootContextParamSets.CHEST), this.getLootTableSeed());
}
}
}