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

146 lines
5.7 KiB
Java

package net.minecraft.world.level.levelgen.structure;
import com.mojang.logging.LogUtils;
import java.util.List;
import javax.annotation.Nullable;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.Registries;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.StructureManager;
import net.minecraft.world.level.WorldGenLevel;
import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.levelgen.structure.pieces.PiecesContainer;
import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext;
import net.minecraft.world.level.levelgen.structure.structures.OceanMonumentStructure;
import org.slf4j.Logger;
public final class StructureStart {
public static final String INVALID_START_ID = "INVALID";
public static final StructureStart INVALID_START = new StructureStart(null, new ChunkPos(0, 0), 0, new PiecesContainer(List.of()));
private static final Logger LOGGER = LogUtils.getLogger();
private final Structure structure;
private final PiecesContainer pieceContainer;
private final ChunkPos chunkPos;
private int references;
@Nullable
private volatile BoundingBox cachedBoundingBox;
public StructureStart(Structure p_226846_, ChunkPos p_226847_, int p_226848_, PiecesContainer p_226849_) {
this.structure = p_226846_;
this.chunkPos = p_226847_;
this.references = p_226848_;
this.pieceContainer = p_226849_;
}
@Nullable
public static StructureStart loadStaticStart(StructurePieceSerializationContext p_226858_, CompoundTag p_226859_, long p_226860_) {
String s = p_226859_.getStringOr("id", "");
if ("INVALID".equals(s)) {
return INVALID_START;
} else {
Registry<Structure> registry = p_226858_.registryAccess().lookupOrThrow(Registries.STRUCTURE);
Structure structure = registry.getValue(ResourceLocation.parse(s));
if (structure == null) {
LOGGER.error("Unknown stucture id: {}", s);
return null;
} else {
ChunkPos chunkpos = new ChunkPos(p_226859_.getIntOr("ChunkX", 0), p_226859_.getIntOr("ChunkZ", 0));
int i = p_226859_.getIntOr("references", 0);
ListTag listtag = p_226859_.getListOrEmpty("Children");
try {
PiecesContainer piecescontainer = PiecesContainer.load(listtag, p_226858_);
if (structure instanceof OceanMonumentStructure) {
piecescontainer = OceanMonumentStructure.regeneratePiecesAfterLoad(chunkpos, p_226860_, piecescontainer);
}
return new StructureStart(structure, chunkpos, i, piecescontainer);
} catch (Exception exception) {
LOGGER.error("Failed Start with id {}", s, exception);
return null;
}
}
}
}
public BoundingBox getBoundingBox() {
BoundingBox boundingbox = this.cachedBoundingBox;
if (boundingbox == null) {
boundingbox = this.structure.adjustBoundingBox(this.pieceContainer.calculateBoundingBox());
this.cachedBoundingBox = boundingbox;
}
return boundingbox;
}
public void placeInChunk(
WorldGenLevel p_226851_, StructureManager p_226852_, ChunkGenerator p_226853_, RandomSource p_226854_, BoundingBox p_226855_, ChunkPos p_226856_
) {
List<StructurePiece> list = this.pieceContainer.pieces();
if (!list.isEmpty()) {
BoundingBox boundingbox = list.get(0).boundingBox;
BlockPos blockpos = boundingbox.getCenter();
BlockPos blockpos1 = new BlockPos(blockpos.getX(), boundingbox.minY(), blockpos.getZ());
for (StructurePiece structurepiece : list) {
if (structurepiece.getBoundingBox().intersects(p_226855_)) {
structurepiece.postProcess(p_226851_, p_226852_, p_226853_, p_226854_, p_226855_, p_226856_, blockpos1);
}
}
this.structure.afterPlace(p_226851_, p_226852_, p_226853_, p_226854_, p_226855_, p_226856_, this.pieceContainer);
}
}
public CompoundTag createTag(StructurePieceSerializationContext p_192661_, ChunkPos p_192662_) {
CompoundTag compoundtag = new CompoundTag();
if (this.isValid()) {
compoundtag.putString("id", p_192661_.registryAccess().lookupOrThrow(Registries.STRUCTURE).getKey(this.structure).toString());
compoundtag.putInt("ChunkX", p_192662_.x);
compoundtag.putInt("ChunkZ", p_192662_.z);
compoundtag.putInt("references", this.references);
compoundtag.put("Children", this.pieceContainer.save(p_192661_));
return compoundtag;
} else {
compoundtag.putString("id", "INVALID");
return compoundtag;
}
}
public boolean isValid() {
return !this.pieceContainer.isEmpty();
}
public ChunkPos getChunkPos() {
return this.chunkPos;
}
public boolean canBeReferenced() {
return this.references < this.getMaxReferences();
}
public void addReference() {
this.references++;
}
public int getReferences() {
return this.references;
}
protected int getMaxReferences() {
return 1;
}
public Structure getStructure() {
return this.structure;
}
public List<StructurePiece> getPieces() {
return this.pieceContainer.pieces();
}
}