Code/net/minecraft/world/level/levelgen/structure/TemplateStructurePiece.java

150 lines
6.8 KiB
Java
Raw Normal View History

2025-07-01 06:20:03 +00:00
package net.minecraft.world.level.levelgen.structure;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.logging.LogUtils;
import java.util.function.Function;
import net.minecraft.commands.arguments.blocks.BlockStateParser;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.registries.Registries;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.ServerLevelAccessor;
import net.minecraft.world.level.StructureManager;
import net.minecraft.world.level.WorldGenLevel;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.Rotation;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.StructureMode;
import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext;
import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager;
import org.slf4j.Logger;
public abstract class TemplateStructurePiece extends StructurePiece {
private static final Logger LOGGER = LogUtils.getLogger();
protected final String templateName;
protected StructureTemplate template;
protected StructurePlaceSettings placeSettings;
protected BlockPos templatePosition;
public TemplateStructurePiece(
StructurePieceType p_226886_,
int p_226887_,
StructureTemplateManager p_226888_,
ResourceLocation p_226889_,
String p_226890_,
StructurePlaceSettings p_226891_,
BlockPos p_226892_
) {
super(p_226886_, p_226887_, p_226888_.getOrCreate(p_226889_).getBoundingBox(p_226891_, p_226892_));
this.setOrientation(Direction.NORTH);
this.templateName = p_226890_;
this.templatePosition = p_226892_;
this.template = p_226888_.getOrCreate(p_226889_);
this.placeSettings = p_226891_;
}
public TemplateStructurePiece(
StructurePieceType p_226894_, CompoundTag p_226895_, StructureTemplateManager p_226896_, Function<ResourceLocation, StructurePlaceSettings> p_226897_
) {
super(p_226894_, p_226895_);
this.setOrientation(Direction.NORTH);
this.templateName = p_226895_.getStringOr("Template", "");
this.templatePosition = new BlockPos(p_226895_.getIntOr("TPX", 0), p_226895_.getIntOr("TPY", 0), p_226895_.getIntOr("TPZ", 0));
ResourceLocation resourcelocation = this.makeTemplateLocation();
this.template = p_226896_.getOrCreate(resourcelocation);
this.placeSettings = p_226897_.apply(resourcelocation);
this.boundingBox = this.template.getBoundingBox(this.placeSettings, this.templatePosition);
}
protected ResourceLocation makeTemplateLocation() {
return ResourceLocation.parse(this.templateName);
}
@Override
protected void addAdditionalSaveData(StructurePieceSerializationContext p_192690_, CompoundTag p_192691_) {
p_192691_.putInt("TPX", this.templatePosition.getX());
p_192691_.putInt("TPY", this.templatePosition.getY());
p_192691_.putInt("TPZ", this.templatePosition.getZ());
p_192691_.putString("Template", this.templateName);
}
@Override
public void postProcess(
WorldGenLevel p_226899_,
StructureManager p_226900_,
ChunkGenerator p_226901_,
RandomSource p_226902_,
BoundingBox p_226903_,
ChunkPos p_226904_,
BlockPos p_226905_
) {
this.placeSettings.setBoundingBox(p_226903_);
this.boundingBox = this.template.getBoundingBox(this.placeSettings, this.templatePosition);
if (this.template.placeInWorld(p_226899_, this.templatePosition, p_226905_, this.placeSettings, p_226902_, 2)) {
for (StructureTemplate.StructureBlockInfo structuretemplate$structureblockinfo : this.template
.filterBlocks(this.templatePosition, this.placeSettings, Blocks.STRUCTURE_BLOCK)) {
if (structuretemplate$structureblockinfo.nbt() != null) {
StructureMode structuremode = structuretemplate$structureblockinfo.nbt().read("mode", StructureMode.LEGACY_CODEC).orElseThrow();
if (structuremode == StructureMode.DATA) {
this.handleDataMarker(
structuretemplate$structureblockinfo.nbt().getStringOr("metadata", ""),
structuretemplate$structureblockinfo.pos(),
p_226899_,
p_226902_,
p_226903_
);
}
}
}
for (StructureTemplate.StructureBlockInfo structuretemplate$structureblockinfo1 : this.template
.filterBlocks(this.templatePosition, this.placeSettings, Blocks.JIGSAW)) {
if (structuretemplate$structureblockinfo1.nbt() != null) {
String s = structuretemplate$structureblockinfo1.nbt().getStringOr("final_state", "minecraft:air");
BlockState blockstate = Blocks.AIR.defaultBlockState();
try {
blockstate = BlockStateParser.parseForBlock(p_226899_.holderLookup(Registries.BLOCK), s, true).blockState();
} catch (CommandSyntaxException commandsyntaxexception) {
LOGGER.error("Error while parsing blockstate {} in jigsaw block @ {}", s, structuretemplate$structureblockinfo1.pos());
}
p_226899_.setBlock(structuretemplate$structureblockinfo1.pos(), blockstate, 3);
}
}
}
}
protected abstract void handleDataMarker(String p_226906_, BlockPos p_226907_, ServerLevelAccessor p_226908_, RandomSource p_226909_, BoundingBox p_226910_);
@Deprecated
@Override
public void move(int p_73668_, int p_73669_, int p_73670_) {
super.move(p_73668_, p_73669_, p_73670_);
this.templatePosition = this.templatePosition.offset(p_73668_, p_73669_, p_73670_);
}
@Override
public Rotation getRotation() {
return this.placeSettings.getRotation();
}
public StructureTemplate template() {
return this.template;
}
public BlockPos templatePosition() {
return this.templatePosition;
}
public StructurePlaceSettings placeSettings() {
return this.placeSettings;
}
}