diff --git a/src/main/java/org/dimdev/dimdoors/block/entity/RiftBlockEntity.java b/src/main/java/org/dimdev/dimdoors/block/entity/RiftBlockEntity.java index a49474ec..0f21314b 100644 --- a/src/main/java/org/dimdev/dimdoors/block/entity/RiftBlockEntity.java +++ b/src/main/java/org/dimdev/dimdoors/block/entity/RiftBlockEntity.java @@ -27,6 +27,7 @@ import net.minecraft.entity.Entity; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.world.ServerWorld; import net.minecraft.text.LiteralText; +import net.minecraft.world.World; import net.fabricmc.fabric.api.block.entity.BlockEntityClientSerializable; @@ -238,4 +239,8 @@ public abstract class RiftBlockEntity extends BlockEntity implements BlockEntity public RiftData getData() { return this.data; } + + public void setWorld(World world) { + this.world = world; + } } diff --git a/src/main/java/org/dimdev/dimdoors/pockets/TemplateUtils.java b/src/main/java/org/dimdev/dimdoors/pockets/TemplateUtils.java index cc449be0..6e06024c 100644 --- a/src/main/java/org/dimdev/dimdoors/pockets/TemplateUtils.java +++ b/src/main/java/org/dimdev/dimdoors/pockets/TemplateUtils.java @@ -33,6 +33,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.StructureWorldAccess; public class TemplateUtils { static void setupEntityPlaceholders(List entities, CompoundTag entityTag) { @@ -117,7 +118,7 @@ public class TemplateUtils { } } - public static void replacePlaceholders(Schematic schematic) { + public static void replacePlaceholders(Schematic schematic, StructureWorldAccess world) { // Replace placeholders (some schematics will contain them) List blockEntities = new ArrayList<>(); for (CompoundTag blockEntityTag : schematic.getBlockEntities()) { @@ -128,6 +129,7 @@ public class TemplateUtils { CompoundTag newTag = new CompoundTag(); EntranceRiftBlockEntity rift = Objects.requireNonNull(ModBlockEntityTypes.ENTRANCE_RIFT.instantiate()); + rift.setWorld(world.toServerWorld()); switch (blockEntityTag.getString("placeholder")) { case "deeper_depth_door": rift.setPos(new BlockPos(x, y, z)); @@ -169,10 +171,10 @@ public class TemplateUtils { } schematic.setBlockEntities(blockEntities); -// List entities = new ArrayList<>(); -// for (CompoundTag entityTag : schematic.getEntities()) { -// TemplateUtils.setupEntityPlaceholders(entities, entityTag); -// } -// schematic.setEntities(entities); + List entities = new ArrayList<>(); + for (CompoundTag entityTag : schematic.getEntities()) { + TemplateUtils.setupEntityPlaceholders(entities, entityTag); + } + schematic.setEntities(entities); } } diff --git a/src/main/java/org/dimdev/dimdoors/util/schematic/v2/RelativeBlockSample.java b/src/main/java/org/dimdev/dimdoors/util/schematic/v2/RelativeBlockSample.java index 6b68e257..7a1200b6 100644 --- a/src/main/java/org/dimdev/dimdoors/util/schematic/v2/RelativeBlockSample.java +++ b/src/main/java/org/dimdev/dimdoors/util/schematic/v2/RelativeBlockSample.java @@ -1,8 +1,10 @@ package org.dimdev.dimdoors.util.schematic.v2; import java.util.Map; +import java.util.NoSuchElementException; import java.util.Objects; +import com.google.common.collect.HashBiMap; import io.github.boogiemonster1o1.libcbe.api.ConditionalBlockEntityProvider; import com.google.common.collect.BiMap; import com.google.common.collect.ImmutableBiMap; @@ -16,20 +18,27 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.entity.BlockEntity; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; import net.minecraft.fluid.FluidState; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.IntArrayTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.NbtOps; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.BlockView; import net.minecraft.world.ModifiableWorld; import net.minecraft.world.StructureWorldAccess; +import net.fabricmc.fabric.api.util.NbtType; + public class RelativeBlockSample implements BlockView, ModifiableWorld { public final Schematic schematic; private final int[][][] blockData; private final BiMap blockPalette; private final Map blockContainer; private final Map blockEntityContainer; + private final BiMap entityContainer; private StructureWorldAccess world; public RelativeBlockSample(Schematic schematic) { @@ -67,6 +76,12 @@ public class RelativeBlockSample implements BlockView, ModifiableWorld { BlockPos position = new BlockPos(arr[0], arr[1], arr[2]); this.blockEntityContainer.put(position, blockEntityTag); } + + this.entityContainer = HashBiMap.create(); + for (CompoundTag entityTag : schematic.getEntities()) { + ListTag doubles = entityTag.getList("Pos", NbtType.DOUBLE); + this.entityContainer.put(entityTag, new Vec3d(doubles.getDouble(0), doubles.getDouble(1), doubles.getDouble(2))); + } } @Override @@ -109,6 +124,17 @@ public class RelativeBlockSample implements BlockView, ModifiableWorld { this.world.toServerWorld().setBlockEntity(blockEntity.getPos(), blockEntity); } } + for (Map.Entry entry : this.entityContainer.entrySet()) { + CompoundTag tag = entry.getKey(); + ListTag doubles = tag.getList("Pos", NbtType.DOUBLE); + Vec3d vec = entry.getValue().add(origin.getX(), origin.getY(), origin.getZ()); + doubles.set(0, NbtOps.INSTANCE.createDouble(vec.x)); + doubles.set(1, NbtOps.INSTANCE.createDouble(vec.y)); + doubles.set(2, NbtOps.INSTANCE.createDouble(vec.z)); + tag.put("Pos", doubles); + Entity entity = EntityType.getEntityFromTag(tag, this.world.toServerWorld()).orElseThrow(NoSuchElementException::new); + this.world.spawnEntity(entity); + } } public int[][][] getBlockData() { diff --git a/src/main/java/org/dimdev/dimdoors/world/feature/gateway/schematic/SchematicV2Gateway.java b/src/main/java/org/dimdev/dimdoors/world/feature/gateway/schematic/SchematicV2Gateway.java index efbac73d..a349fa96 100644 --- a/src/main/java/org/dimdev/dimdoors/world/feature/gateway/schematic/SchematicV2Gateway.java +++ b/src/main/java/org/dimdev/dimdoors/world/feature/gateway/schematic/SchematicV2Gateway.java @@ -46,7 +46,7 @@ public abstract class SchematicV2Gateway implements Gateway { public final void generate(StructureWorldAccess world, BlockPos pos) { if (!this.replaced) { - TemplateUtils.replacePlaceholders(this.schematic); + TemplateUtils.replacePlaceholders(this.schematic, world); this.replaced = true; } SchematicPlacer.place(this.schematic, world, pos);