Code/net/minecraft/world/level/block/EnchantingTableBlock.java

121 lines
5.1 KiB
Java
Raw Normal View History

2025-07-01 06:20:03 +00:00
package net.minecraft.world.level.block;
import com.mojang.serialization.MapCodec;
import java.util.List;
import javax.annotation.Nullable;
import net.minecraft.core.BlockPos;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.network.chat.Component;
import net.minecraft.tags.BlockTags;
import net.minecraft.util.RandomSource;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.MenuProvider;
import net.minecraft.world.Nameable;
import net.minecraft.world.SimpleMenuProvider;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.ContainerLevelAccess;
import net.minecraft.world.inventory.EnchantmentMenu;
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.block.entity.BlockEntityTicker;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.entity.EnchantingTableBlockEntity;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.pathfinder.PathComputationType;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
public class EnchantingTableBlock extends BaseEntityBlock {
public static final MapCodec<EnchantingTableBlock> CODEC = simpleCodec(EnchantingTableBlock::new);
public static final List<BlockPos> BOOKSHELF_OFFSETS = BlockPos.betweenClosedStream(-2, 0, -2, 2, 1, 2)
.filter(p_328998_ -> Math.abs(p_328998_.getX()) == 2 || Math.abs(p_328998_.getZ()) == 2)
.map(BlockPos::immutable)
.toList();
private static final VoxelShape SHAPE = Block.column(16.0, 0.0, 12.0);
@Override
public MapCodec<EnchantingTableBlock> codec() {
return CODEC;
}
protected EnchantingTableBlock(BlockBehaviour.Properties p_333403_) {
super(p_333403_);
}
public static boolean isValidBookShelf(Level p_328191_, BlockPos p_328702_, BlockPos p_336071_) {
return p_328191_.getBlockState(p_328702_.offset(p_336071_)).is(BlockTags.ENCHANTMENT_POWER_PROVIDER)
&& p_328191_.getBlockState(p_328702_.offset(p_336071_.getX() / 2, p_336071_.getY(), p_336071_.getZ() / 2)).is(BlockTags.ENCHANTMENT_POWER_TRANSMITTER);
}
@Override
protected boolean useShapeForLightOcclusion(BlockState p_329621_) {
return true;
}
@Override
protected VoxelShape getShape(BlockState p_329467_, BlockGetter p_330223_, BlockPos p_327750_, CollisionContext p_332344_) {
return SHAPE;
}
@Override
public void animateTick(BlockState p_334651_, Level p_328070_, BlockPos p_335832_, RandomSource p_335180_) {
super.animateTick(p_334651_, p_328070_, p_335832_, p_335180_);
for (BlockPos blockpos : BOOKSHELF_OFFSETS) {
if (p_335180_.nextInt(16) == 0 && isValidBookShelf(p_328070_, p_335832_, blockpos)) {
p_328070_.addParticle(
ParticleTypes.ENCHANT,
p_335832_.getX() + 0.5,
p_335832_.getY() + 2.0,
p_335832_.getZ() + 0.5,
blockpos.getX() + p_335180_.nextFloat() - 0.5,
blockpos.getY() - p_335180_.nextFloat() - 1.0F,
blockpos.getZ() + p_335180_.nextFloat() - 0.5
);
}
}
}
@Override
public BlockEntity newBlockEntity(BlockPos p_329775_, BlockState p_330999_) {
return new EnchantingTableBlockEntity(p_329775_, p_330999_);
}
@Nullable
@Override
public <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level p_335666_, BlockState p_330579_, BlockEntityType<T> p_332523_) {
return p_335666_.isClientSide ? createTickerHelper(p_332523_, BlockEntityType.ENCHANTING_TABLE, EnchantingTableBlockEntity::bookAnimationTick) : null;
}
@Override
protected InteractionResult useWithoutItem(BlockState p_335615_, Level p_335039_, BlockPos p_331142_, Player p_334809_, BlockHitResult p_334503_) {
if (!p_335039_.isClientSide) {
p_334809_.openMenu(p_335615_.getMenuProvider(p_335039_, p_331142_));
}
return InteractionResult.SUCCESS;
}
@Nullable
@Override
protected MenuProvider getMenuProvider(BlockState p_335872_, Level p_334298_, BlockPos p_336351_) {
BlockEntity blockentity = p_334298_.getBlockEntity(p_336351_);
if (blockentity instanceof EnchantingTableBlockEntity) {
Component component = ((Nameable)blockentity).getDisplayName();
return new SimpleMenuProvider(
(p_328554_, p_332165_, p_330050_) -> new EnchantmentMenu(p_328554_, p_332165_, ContainerLevelAccess.create(p_334298_, p_336351_)), component
);
} else {
return null;
}
}
@Override
protected boolean isPathfindable(BlockState p_335176_, PathComputationType p_334574_) {
return false;
}
}