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

169 lines
7.4 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.function.Predicate;
import javax.annotation.Nullable;
import net.minecraft.advancements.CriteriaTriggers;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntitySpawnReason;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.animal.IronGolem;
import net.minecraft.world.entity.animal.SnowGolem;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.pattern.BlockInWorld;
import net.minecraft.world.level.block.state.pattern.BlockPattern;
import net.minecraft.world.level.block.state.pattern.BlockPatternBuilder;
import net.minecraft.world.level.block.state.predicate.BlockStatePredicate;
import net.minecraft.world.level.block.state.properties.EnumProperty;
public class CarvedPumpkinBlock extends HorizontalDirectionalBlock {
public static final MapCodec<CarvedPumpkinBlock> CODEC = simpleCodec(CarvedPumpkinBlock::new);
public static final EnumProperty<Direction> FACING = HorizontalDirectionalBlock.FACING;
@Nullable
private BlockPattern snowGolemBase;
@Nullable
private BlockPattern snowGolemFull;
@Nullable
private BlockPattern ironGolemBase;
@Nullable
private BlockPattern ironGolemFull;
private static final Predicate<BlockState> PUMPKINS_PREDICATE = p_51396_ -> p_51396_ != null
&& (p_51396_.is(Blocks.CARVED_PUMPKIN) || p_51396_.is(Blocks.JACK_O_LANTERN));
@Override
public MapCodec<? extends CarvedPumpkinBlock> codec() {
return CODEC;
}
protected CarvedPumpkinBlock(BlockBehaviour.Properties p_51375_) {
super(p_51375_);
this.registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.NORTH));
}
@Override
protected void onPlace(BlockState p_51387_, Level p_51388_, BlockPos p_51389_, BlockState p_51390_, boolean p_51391_) {
if (!p_51390_.is(p_51387_.getBlock())) {
this.trySpawnGolem(p_51388_, p_51389_);
}
}
public boolean canSpawnGolem(LevelReader p_51382_, BlockPos p_51383_) {
return this.getOrCreateSnowGolemBase().find(p_51382_, p_51383_) != null || this.getOrCreateIronGolemBase().find(p_51382_, p_51383_) != null;
}
private void trySpawnGolem(Level p_51379_, BlockPos p_51380_) {
BlockPattern.BlockPatternMatch blockpattern$blockpatternmatch = this.getOrCreateSnowGolemFull().find(p_51379_, p_51380_);
if (blockpattern$blockpatternmatch != null) {
SnowGolem snowgolem = EntityType.SNOW_GOLEM.create(p_51379_, EntitySpawnReason.TRIGGERED);
if (snowgolem != null) {
spawnGolemInWorld(p_51379_, blockpattern$blockpatternmatch, snowgolem, blockpattern$blockpatternmatch.getBlock(0, 2, 0).getPos());
}
} else {
BlockPattern.BlockPatternMatch blockpattern$blockpatternmatch1 = this.getOrCreateIronGolemFull().find(p_51379_, p_51380_);
if (blockpattern$blockpatternmatch1 != null) {
IronGolem irongolem = EntityType.IRON_GOLEM.create(p_51379_, EntitySpawnReason.TRIGGERED);
if (irongolem != null) {
irongolem.setPlayerCreated(true);
spawnGolemInWorld(p_51379_, blockpattern$blockpatternmatch1, irongolem, blockpattern$blockpatternmatch1.getBlock(1, 2, 0).getPos());
}
}
}
}
private static void spawnGolemInWorld(Level p_249110_, BlockPattern.BlockPatternMatch p_251293_, Entity p_251251_, BlockPos p_251189_) {
clearPatternBlocks(p_249110_, p_251293_);
p_251251_.snapTo(p_251189_.getX() + 0.5, p_251189_.getY() + 0.05, p_251189_.getZ() + 0.5, 0.0F, 0.0F);
p_249110_.addFreshEntity(p_251251_);
for (ServerPlayer serverplayer : p_249110_.getEntitiesOfClass(ServerPlayer.class, p_251251_.getBoundingBox().inflate(5.0))) {
CriteriaTriggers.SUMMONED_ENTITY.trigger(serverplayer, p_251251_);
}
updatePatternBlocks(p_249110_, p_251293_);
}
public static void clearPatternBlocks(Level p_249604_, BlockPattern.BlockPatternMatch p_251190_) {
for (int i = 0; i < p_251190_.getWidth(); i++) {
for (int j = 0; j < p_251190_.getHeight(); j++) {
BlockInWorld blockinworld = p_251190_.getBlock(i, j, 0);
p_249604_.setBlock(blockinworld.getPos(), Blocks.AIR.defaultBlockState(), 2);
p_249604_.levelEvent(2001, blockinworld.getPos(), Block.getId(blockinworld.getState()));
}
}
}
public static void updatePatternBlocks(Level p_248711_, BlockPattern.BlockPatternMatch p_251935_) {
for (int i = 0; i < p_251935_.getWidth(); i++) {
for (int j = 0; j < p_251935_.getHeight(); j++) {
BlockInWorld blockinworld = p_251935_.getBlock(i, j, 0);
p_248711_.updateNeighborsAt(blockinworld.getPos(), Blocks.AIR);
}
}
}
@Override
public BlockState getStateForPlacement(BlockPlaceContext p_51377_) {
return this.defaultBlockState().setValue(FACING, p_51377_.getHorizontalDirection().getOpposite());
}
@Override
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> p_51385_) {
p_51385_.add(FACING);
}
private BlockPattern getOrCreateSnowGolemBase() {
if (this.snowGolemBase == null) {
this.snowGolemBase = BlockPatternBuilder.start()
.aisle(" ", "#", "#")
.where('#', BlockInWorld.hasState(BlockStatePredicate.forBlock(Blocks.SNOW_BLOCK)))
.build();
}
return this.snowGolemBase;
}
private BlockPattern getOrCreateSnowGolemFull() {
if (this.snowGolemFull == null) {
this.snowGolemFull = BlockPatternBuilder.start()
.aisle("^", "#", "#")
.where('^', BlockInWorld.hasState(PUMPKINS_PREDICATE))
.where('#', BlockInWorld.hasState(BlockStatePredicate.forBlock(Blocks.SNOW_BLOCK)))
.build();
}
return this.snowGolemFull;
}
private BlockPattern getOrCreateIronGolemBase() {
if (this.ironGolemBase == null) {
this.ironGolemBase = BlockPatternBuilder.start()
.aisle("~ ~", "###", "~#~")
.where('#', BlockInWorld.hasState(BlockStatePredicate.forBlock(Blocks.IRON_BLOCK)))
.where('~', p_360416_ -> p_360416_.getState().isAir())
.build();
}
return this.ironGolemBase;
}
private BlockPattern getOrCreateIronGolemFull() {
if (this.ironGolemFull == null) {
this.ironGolemFull = BlockPatternBuilder.start()
.aisle("~^~", "###", "~#~")
.where('^', BlockInWorld.hasState(PUMPKINS_PREDICATE))
.where('#', BlockInWorld.hasState(BlockStatePredicate.forBlock(Blocks.IRON_BLOCK)))
.where('~', p_360415_ -> p_360415_.getState().isAir())
.build();
}
return this.ironGolemFull;
}
}