minecraft-src/net/minecraft/world/level/block/entity/TrialSpawnerBlockEntity.java
2025-07-04 03:45:38 +03:00

92 lines
3.3 KiB
Java

package net.minecraft.world.level.block.entity;
import net.minecraft.Util;
import net.minecraft.core.BlockPos;
import net.minecraft.core.HolderLookup;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtOps;
import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket;
import net.minecraft.util.RandomSource;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.Spawner;
import net.minecraft.world.level.block.TrialSpawnerBlock;
import net.minecraft.world.level.block.entity.trialspawner.PlayerDetector;
import net.minecraft.world.level.block.entity.trialspawner.TrialSpawner;
import net.minecraft.world.level.block.entity.trialspawner.TrialSpawnerState;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
public class TrialSpawnerBlockEntity extends BlockEntity implements Spawner, TrialSpawner.StateAccessor {
private TrialSpawner trialSpawner = this.createDefaultSpawner();
public TrialSpawnerBlockEntity(BlockPos pos, BlockState state) {
super(BlockEntityType.TRIAL_SPAWNER, pos, state);
}
private TrialSpawner createDefaultSpawner() {
PlayerDetector playerDetector = PlayerDetector.NO_CREATIVE_PLAYERS;
PlayerDetector.EntitySelector entitySelector = PlayerDetector.EntitySelector.SELECT_FROM_LEVEL;
return new TrialSpawner(this, playerDetector, entitySelector);
}
@Override
protected void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) {
super.loadAdditional(tag, registries);
this.trialSpawner = (TrialSpawner)tag.read(this.trialSpawner.codec(), registries.createSerializationContext(NbtOps.INSTANCE))
.orElseGet(this::createDefaultSpawner);
if (this.level != null) {
this.markUpdated();
}
}
@Override
protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) {
super.saveAdditional(tag, registries);
tag.store(this.trialSpawner.codec(), registries.createSerializationContext(NbtOps.INSTANCE), this.trialSpawner);
}
public ClientboundBlockEntityDataPacket getUpdatePacket() {
return ClientboundBlockEntityDataPacket.create(this);
}
@Override
public CompoundTag getUpdateTag(HolderLookup.Provider registries) {
return this.trialSpawner.getData().getUpdateTag(this.getBlockState().getValue(TrialSpawnerBlock.STATE));
}
@Override
public void setEntityId(EntityType<?> entityType, RandomSource random) {
if (this.level == null) {
Util.logAndPauseIfInIde("Expected non-null level");
} else {
this.trialSpawner.overrideEntityToSpawn(entityType, this.level);
this.setChanged();
}
}
public TrialSpawner getTrialSpawner() {
return this.trialSpawner;
}
@Override
public TrialSpawnerState getState() {
return !this.getBlockState().hasProperty(BlockStateProperties.TRIAL_SPAWNER_STATE)
? TrialSpawnerState.INACTIVE
: this.getBlockState().getValue(BlockStateProperties.TRIAL_SPAWNER_STATE);
}
@Override
public void setState(Level level, TrialSpawnerState state) {
this.setChanged();
level.setBlockAndUpdate(this.worldPosition, this.getBlockState().setValue(BlockStateProperties.TRIAL_SPAWNER_STATE, state));
}
@Override
public void markUpdated() {
this.setChanged();
if (this.level != null) {
this.level.sendBlockUpdated(this.worldPosition, this.getBlockState(), this.getBlockState(), 3);
}
}
}