Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions src/generated/resources/assets/anvilcraft/lang/en_ud.json
Original file line number Diff line number Diff line change
Expand Up @@ -1084,7 +1084,7 @@
"item.anvilcraft.brown_cement_bucket": "ʇǝʞɔnᗺ ʇuǝɯǝƆ uʍoɹᗺ",
"item.anvilcraft.buffer_boots": "sʇooᗺ ɹǝɟɟnᗺ",
"item.anvilcraft.building_rod": "poᴚ ᵷuᴉpꞁᴉnᗺ",
"item.anvilcraft.building_rod.controls": "ʇuᴉɹdǝnꞁq ɐ ɟo ʇɹɐd ǝꞁqɐꞁᴉɐʌɐ ǝɥʇ pꞁᴉnq oʇ ʇɟᴉɥS pꞁoɥ ⸵(sʞɔoꞁq 000'߈ oʇ dn) xoq ɐ ꞁꞁᴉɟ oʇ ᵷɐɹp puɐ ǝsn pꞁoH",
"item.anvilcraft.building_rod.controls": "ʇuᴉɹdǝnꞁq ɐ ɟo ʇɹɐd ǝꞁqɐꞁᴉɐʌɐ ǝɥʇ pꞁᴉnq oʇ ʇɟᴉɥS pꞁoɥ ⸵ǝʇsɐd oʇ uᴉɐᵷɐ ʞɔᴉꞁɔ-ʇɥᵷᴉɹ uǝɥʇ 'ɯǝɥʇ ʞɔoꞁ oʇ ǝsɐǝꞁǝɹ 'suoᴉʇɔǝɾoɹd ʇuᴉɹdǝnꞁq ʇɐǝdǝɹ oʇ ᵷɐɹp puɐ ǝsn pꞁoɥ ⸵ꞁǝɔuɐɔ oʇ ꞁɹʇƆ ǝsɐǝꞁǝɹ ɹo 'ǝɔɐꞁd oʇ ʞɔᴉꞁɔ-ʇɥᵷᴉɹ 'ʇsnɾpɐ oʇ sʎǝʞ ʍoɹɹɐ ǝsn 'ǝɔuɐʇsᴉp ǝɥʇ dǝǝʞ oʇ ɹǝuɹoɔ ʇsɹᴉɟ ǝɥʇ ᵷuᴉʇɔǝꞁǝs ɹǝʇɟɐ ꞁɹʇƆ pꞁoɥ ⸵(sʞɔoꞁq 000'߈ oʇ dn) xoq ɐ ꞁꞁᴉɟ oʇ ʞɔoꞁq ǝꞁqɐpᴉꞁꞁoɔ ɐ ɯoɹɟ ᵷɐɹp puɐ ǝsn pꞁoH",
"item.anvilcraft.building_rod.desc": "ɥɔɐǝɹ ʞɔoꞁq ϛ⥝+ ɥʇᴉʍ pꞁᴉnq oʇ puɐɥ ɹǝɥʇᴉǝ uᴉ pꞁoɥ ⸵sʇǝʞɔod uᴉ ᵷuᴉpnꞁɔuᴉ 'pǝᴉɹɹɐɔ ǝꞁᴉɥʍ ɥɔɐǝɹ ʍɐꞁɔ qɐɹɔ sʇuɐɹ⅁",
"item.anvilcraft.building_rod.energy": "ʞɔoꞁq/ƎℲ 00⥝ · ƎℲ 000'000'8 / %s",
"item.anvilcraft.building_rod.fluids": "ǝᵷɐɹoʇs pǝʞuᴉꞁ ɹo ʎɹoʇuǝʌuᴉ ʎq pǝᴉꞁddns 'ꞁꞁᴉɟ ɹǝd ᗺ ᘔ ʇsoɔ spᴉnꞁɟ ǝꞁqɐʍǝuǝɹ ⸵sʞɔoꞁq ᵷoꞁɹǝʇɐʍ puɐ sɐǝɹɐ ꞁꞁᴉɟ uɐɔ sʇǝʞɔnᗺ",
Expand Down Expand Up @@ -1337,6 +1337,7 @@
"message.anvilcraft.building_rod.too_many": "ǝɔuo ʇɐ sʞɔoꞁq 000'߈ uɐɥʇ ǝɹoɯ ǝɔɐꞁd ʇouuɐƆ",
"message.anvilcraft.building_rod.undone": "ǝuopun ʇuǝɯǝɔɐꞁd ʇsɐꞀ",
"message.anvilcraft.building_rod.unsupported": "pǝᴉꞁddns ǝq ʇouuɐɔ ʇɐɥʇ sꞁɐᴉɹǝʇɐɯ suᴉɐʇuoɔ ʇuᴉɹdǝnꞁq sᴉɥ⟘",
"message.anvilcraft.building_rod.unsupported_type": "%s :ʇɔǝɾqo ʇuᴉɹdǝnꞁq ɹoɟ ꞁɐᴉɹǝʇɐɯ ᵷuᴉpꞁᴉnq pǝʇɹoddns oN",
"message.anvilcraft.chute.cannot_place": "uoᴉʇɔǝɹᴉp sᴉɥʇ ǝɔɐɟ ʇouuɐɔ ǝʇnɥƆ",
"message.anvilcraft.code_gen_check": "˙sɯǝʇᴉ sɐɥ ʇoꞁs ʇndʇno ǝɥʇ ɟᴉ puɐ ǝqnɔ ɐ sᴉ ɐǝɹɐ pǝʇɔǝꞁǝs ǝɥʇ ɟᴉ ʞɔǝɥɔ ǝsɐǝꞁԀ",
"message.anvilcraft.code_gen_filed": "pǝꞁᴉɐɟ uoᴉʇɐɹǝuǝᵷ ǝpoƆ",
Expand Down Expand Up @@ -1390,8 +1391,9 @@
"screen.anvilcraft.balance_mode.restock": "ʎꞁuo ʞɔoʇsǝᴚ",
"screen.anvilcraft.balance_mode.smart": "ʇɹɐɯS",
"screen.anvilcraft.batch_crafter.switch_recipe": "ǝdᴉɔǝɹ ᵷuᴉʇɟɐɹɔ ɥɔʇᴉʍS",
"screen.anvilcraft.building_rod.distance": "ʇuᴉɹdǝnꞁq ʞɔoꞀ %s | ʇsnɾpɐ oʇ %s/%s\nǝɔuɐʇsᴉp uoᴉʇɔǝɾoɹd ǝɥʇ dǝǝʞ oʇ %s pꞁoH",
"screen.anvilcraft.building_rod.optimized": "ɹoɹɹᴉW %s | ǝʇɐʇoᴚ %s %s\nǝʌoW %s %s %s %s %s %s\nꞁǝɔuɐƆ %s | ǝɔɐꞁԀ %s",
"screen.anvilcraft.building_rod.distance": "ǝʇsɐd oʇ uᴉɐᵷɐ ʞɔᴉꞁɔ uǝɥʇ 'suoᴉʇɔǝɾoɹd ʇɐǝdǝɹ oʇ ᵷɐɹp puɐ pꞁoH / uoᴉʇɔǝɾoɹd ʞɔoꞀ %s | ʇsnɾpɐ oʇ %s/%s\nǝɔuɐʇsᴉp uoᴉʇɔǝɾoɹd ǝɥʇ dǝǝʞ oʇ %s pꞁoH",
"screen.anvilcraft.building_rod.optimized": "ɹoɹɹᴉW %s | ǝʇɐʇoᴚ %s %s\nǝʌoW %s %s %s %s %s %s\nꞁǝɔuɐƆ %s | suoᴉʇɔǝɾoɹd ǝʇsɐԀ %s",
"screen.anvilcraft.building_rod.selection_size": "%s × %s × %s",
"screen.anvilcraft.building_rod.suspended": "ʞɔoꞁun oʇ %s puɐ poɹ ᵷuᴉpꞁᴉnq ǝɥʇ pꞁoH | pǝʞɔoꞁ uoᴉʇɔǝɾoɹԀ",
"screen.anvilcraft.building_rod.tool.cancel": "ʇuǝɯǝɔɐꞁd ꞁǝɔuɐƆ",
"screen.anvilcraft.building_rod.tool.confirm": "ʇuǝɯǝɔɐꞁd ɯɹᴉɟuoƆ",
Expand All @@ -1403,7 +1405,7 @@
"screen.anvilcraft.building_rod.traditional": "ꞁǝɔuɐƆ %s | %s · ǝʇnɔǝxǝ :ǝs∩ | sɹǝʎɐꞁ :ꞁꞁoɹɔS + %s | ʇsnɾpɐ :ꞁꞁoɹɔS + %s | ꞁooʇ ʇɔǝꞁǝs :ꞁꞁoɹɔS + %s",
"screen.anvilcraft.building_rod.traditional.anchor_following": "ɹᴉɐɥssoɹɔ ᵷuᴉʍoꞁꞁoℲ",
"screen.anvilcraft.building_rod.traditional.anchor_locked": "pǝʞɔoꞁ ɹoɥɔuⱯ",
"screen.anvilcraft.building_rod.traditional.hint": "ɹɐqʇoɥ sǝᵷuɐɥɔ %s sǝʇnɔǝxǝ %s\nsʇsnɾpɐ %s+%s sꞁooʇ sǝɥɔʇᴉʍs %s+%s",
"screen.anvilcraft.building_rod.traditional.hint": "ɹɐqʇoɥ sǝᵷuɐɥɔ %s (ǝʇsɐd oʇ uᴉɐᵷɐ ʞɔᴉꞁɔ uǝɥʇ 'suoᴉʇɔǝɾoɹd ʇɐǝdǝɹ oʇ ǝʌoW ɥʇᴉʍ ᵷɐɹp puɐ pꞁoɥ) sǝʇnɔǝxǝ %s\nsʇsnɾpɐ %s+%s sꞁooʇ sǝɥɔʇᴉʍs %s+%s",
"screen.anvilcraft.building_rod.traditional.layer_all": "ꞁꞁⱯ",
"screen.anvilcraft.building_rod.traditional.scroll": "ꞁꞁoɹɔS",
"screen.anvilcraft.building_rod.traditional.status": "%6$s | %5$s ɹǝʎɐꞀ | %4$s ɹoɹɹᴉW | %3$s uoᴉʇɐʇoᴚ\n%2$s\n%1$s",
Expand Down
10 changes: 6 additions & 4 deletions src/generated/resources/assets/anvilcraft/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -1084,7 +1084,7 @@
"item.anvilcraft.brown_cement_bucket": "Brown Cement Bucket",
"item.anvilcraft.buffer_boots": "Buffer Boots",
"item.anvilcraft.building_rod": "Building Rod",
"item.anvilcraft.building_rod.controls": "Hold use and drag to fill a box (up to 4,000 blocks); hold Shift to build the available part of a blueprint",
"item.anvilcraft.building_rod.controls": "Hold use and drag from a collidable block to fill a box (up to 4,000 blocks); hold Ctrl after selecting the first corner to keep the distance, use arrow keys to adjust, right-click to place, or release Ctrl to cancel; hold use and drag to repeat blueprint projections, release to lock them, then right-click again to paste; hold Shift to build the available part of a blueprint",
"item.anvilcraft.building_rod.desc": "Grants crab claw reach while carried, including in pockets; hold in either hand to build with +15 block reach",
"item.anvilcraft.building_rod.energy": "%s / 8,000,000 FE · 100 FE/block",
"item.anvilcraft.building_rod.fluids": "Buckets can fill areas and waterlog blocks; renewable fluids cost 2 B per fill, supplied by inventory or linked storage",
Expand Down Expand Up @@ -1337,6 +1337,7 @@
"message.anvilcraft.building_rod.too_many": "Cannot place more than 4,000 blocks at once",
"message.anvilcraft.building_rod.undone": "Last placement undone",
"message.anvilcraft.building_rod.unsupported": "This blueprint contains materials that cannot be supplied",
"message.anvilcraft.building_rod.unsupported_type": "No supported building material for blueprint object: %s",
"message.anvilcraft.chute.cannot_place": "Chute cannot face this direction",
"message.anvilcraft.code_gen_check": "Please check if the selected area is a cube and if the output slot has items.",
"message.anvilcraft.code_gen_filed": "Code generation failed",
Expand Down Expand Up @@ -1390,8 +1391,9 @@
"screen.anvilcraft.balance_mode.restock": "Restock only",
"screen.anvilcraft.balance_mode.smart": "Smart",
"screen.anvilcraft.batch_crafter.switch_recipe": "Switch crafting recipe",
"screen.anvilcraft.building_rod.distance": "Hold %s to keep the projection distance\n%s/%s to adjust | %s Lock blueprint",
"screen.anvilcraft.building_rod.optimized": "%s Place | %s Cancel\n%s %s %s %s %s %s Move\n%s %s Rotate | %s Mirror",
"screen.anvilcraft.building_rod.distance": "Hold %s to keep the projection distance\n%s/%s to adjust | %s Lock projection / Hold and drag to repeat projections, then click again to paste",
"screen.anvilcraft.building_rod.optimized": "%s Paste projections | %s Cancel\n%s %s %s %s %s %s Move\n%s %s Rotate | %s Mirror",
"screen.anvilcraft.building_rod.selection_size": "%s × %s × %s",
"screen.anvilcraft.building_rod.suspended": "Projection locked | Hold the building rod and %s to unlock",
"screen.anvilcraft.building_rod.tool.cancel": "Cancel placement",
"screen.anvilcraft.building_rod.tool.confirm": "Confirm placement",
Expand All @@ -1403,7 +1405,7 @@
"screen.anvilcraft.building_rod.traditional": "%s + Scroll: select tool | %s + Scroll: adjust | %s + Scroll: layers | Use: execute · %s | %s Cancel",
"screen.anvilcraft.building_rod.traditional.anchor_following": "Following crosshair",
"screen.anvilcraft.building_rod.traditional.anchor_locked": "Anchor locked",
"screen.anvilcraft.building_rod.traditional.hint": "%s+%s switches tools %s+%s adjusts\n%s executes %s changes hotbar",
"screen.anvilcraft.building_rod.traditional.hint": "%s+%s switches tools %s+%s adjusts\n%s executes (hold and drag with Move to repeat projections, then click again to paste) %s changes hotbar",
"screen.anvilcraft.building_rod.traditional.layer_all": "All",
"screen.anvilcraft.building_rod.traditional.scroll": "Scroll",
"screen.anvilcraft.building_rod.traditional.status": "%1$s\n%2$s\nRotation %3$s | Mirror %4$s | Layer %5$s | %6$s",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries)
tag.put("ExtraData", data);
}

/** 恢复蓝图保存的停机状态,不把加载当作输入边沿或循环启动指令。 */
/** 暂缓结构恢复过程中的输入判定,完成后由蓝图统一激活。 */
public void loadBlueprint(CompoundTag tag, HolderLookup.Provider registries) {
this.loadingBlueprint = true;
this.skipBlueprintLoadUpdate = true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,19 @@
import dev.dubhe.anvilcraft.block.entity.fluid.AbstractPipeCheckValveBlockEntity;
import dev.dubhe.anvilcraft.block.entity.fluid.ControlValveBlockEntity;
import dev.dubhe.anvilcraft.init.item.ModItems;
import dev.dubhe.anvilcraft.inventory.container.FilterOnlyContainer;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.NbtOps;
import net.minecraft.nbt.NbtUtils;
import net.minecraft.nbt.StringTag;
import net.minecraft.nbt.Tag;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.item.ItemStack;
Expand All @@ -48,13 +52,14 @@
import java.util.Set;
import javax.annotation.Nullable;

/** 蓝图只复制经过字段校验的设置;库存、身份和执行缓存不属于设置。 */
/** 恢复蓝图设置与运行进度;库存由材料系统供应,身份由当前放置重建。 */
public final class BlueprintBlockConfiguration {
private BlueprintBlockConfiguration() {
}

static CompoundTag take(BlockEntity entity, CompoundTag source, HolderLookup.Provider registries) {
CompoundTag result = new CompoundTag();
final CompoundTag runtime = BlueprintRuntimeData.take(entity, source);
if (entity instanceof SignBlockEntity) {
result = SignDecorationAdapter.sanitize(entity.getBlockState(), source, registries);
remove(source, "front_text", "back_text", "is_waxed");
Expand Down Expand Up @@ -142,6 +147,7 @@ static CompoundTag take(BlockEntity entity, CompoundTag source, HolderLookup.Pro
result.put("Valves", checkValves(source.getList("Valves", Tag.TAG_COMPOUND)));
remove(source, "Valves", "Powered");
}
result.merge(runtime);
return result;
}

Expand Down Expand Up @@ -190,7 +196,7 @@ private static void stripFiltering(CompoundTag source) {
}

private static CompoundTag filterSamples(CompoundTag source, int size, HolderLookup.Provider registries) {
var items = new dev.dubhe.anvilcraft.inventory.container.FilterOnlyContainer(null, size);
var items = new FilterOnlyContainer(null, size);
for (Tag value : source.getList("Items", Tag.TAG_COMPOUND)) {
CompoundTag tag = (CompoundTag) value;
int slot = tag.getInt("Slot");
Expand Down Expand Up @@ -245,7 +251,7 @@ private static void enchanting(CompoundTag source, CompoundTag result, HolderLoo
String id = value.getAsString();
ResourceLocation key = ResourceLocation.tryParse(id);
if (key != null && seen.add(id) && registries.lookupOrThrow(Registries.ENCHANTMENT)
.get(net.minecraft.resources.ResourceKey.create(Registries.ENCHANTMENT, key)).isPresent()) {
.get(ResourceKey.create(Registries.ENCHANTMENT, key)).isPresent()) {
selected.add(StringTag.valueOf(id));
}
}
Expand Down Expand Up @@ -303,6 +309,12 @@ static List<ItemStack> materials(CompoundTag config) {
public static void transform(
CompoundTag config, BlueprintPlacement placement, @Nullable BlockPos sourceOrigin, StructureSnapshot snapshot
) {
if ("minecraft:piston".equals(config.getString("id"))) {
var moved = NbtUtils.readBlockState(BuiltInRegistries.BLOCK.asLookup(), config.getCompound("blockState"));
config.put("blockState", NbtUtils.writeBlockState(placement.stateOf(moved)));
Direction facing = Direction.from3DDataValue(config.getInt("facing"));
config.putInt("facing", placement.rotation().rotate(placement.mirror().mirror(facing)).get3DDataValue());
}
if (config.contains("Facing")) {
Direction facing = Direction.from3DDataValue(config.getInt("Facing"));
config.putInt("Facing", placement.rotation().rotate(placement.mirror().mirror(facing)).get3DDataValue());
Expand Down Expand Up @@ -361,6 +373,12 @@ static void apply(BlockEntity entity, CompoundTag settings, ServerPlayer player)
}

static void afterContents(BlockEntity entity, CompoundTag settings, ServerPlayer player) {
CompoundTag runtime = BlueprintRuntimeData.take(entity, settings.copy());
if (!runtime.isEmpty()) {
CompoundTag restored = entity.saveWithFullMetadata(player.registryAccess()).merge(runtime);
if (entity instanceof PulseGeneratorBlockEntity pulse) pulse.loadBlueprint(restored, player.registryAccess());
else entity.loadWithComponents(restored, player.registryAccess());
}
if (entity instanceof LecternBlockEntity lectern && !lectern.getBook().isEmpty() && settings.contains("Page")) {
apply(entity, settings, player);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package dev.dubhe.anvilcraft.building;

import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.EntityBlock;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.piston.PistonMovingBlockEntity;
import net.minecraft.world.level.block.state.BlockState;

import javax.annotation.Nullable;

public final class BlueprintBlockEntities {
private BlueprintBlockEntities() {
}

@Nullable
public static BlockEntity create(Level level, BlockPos pos, BlockState state, @Nullable CompoundTag data) {
BlockEntity entity = state.is(Blocks.MOVING_PISTON) ? new PistonMovingBlockEntity(pos, state)
: state.getBlock() instanceof EntityBlock block ? block.newBlockEntity(pos, state) : null;
if (entity == null) return null;
if (data != null) entity.loadWithComponents(data, level.registryAccess());
entity.setLevel(level);
return entity;
}
}
65 changes: 65 additions & 0 deletions src/main/java/dev/dubhe/anvilcraft/building/BlueprintCapture.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package dev.dubhe.anvilcraft.building;

import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.Vec3i;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.decoration.Painting;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.structure.BoundingBox;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

public final class BlueprintCapture {
private BlueprintCapture() {
}

public static BlueprintNormalizer.Result capture(ServerLevel level, AABB area) {
BlockPos origin = BlockPos.containing(area.minX, area.minY, area.minZ);
BlockPos end = BlockPos.containing(area.maxX - 1, area.maxY - 1, area.maxZ - 1);
Map<BlockPos, StructureSnapshot.BlockEntry> blocks = new LinkedHashMap<>();
List<BlockState> palette = new ArrayList<>();
for (BlockPos cursor : BlockPos.betweenClosed(origin, end)) {
BlockPos pos = cursor.immutable();
BlockState state = level.getBlockState(pos);
if (state.isAir() || !BlueprintMultiblocks.shouldRecord(state)) continue;
BlueprintMultiblocks.forEachPart(pos, state, (part, generated) -> {
BlockState actual = level.getBlockState(part);
if (actual.isAir()) actual = generated;
int index = palette.indexOf(actual);
if (index < 0) {
index = palette.size();
palette.add(actual);
}
var entity = level.getBlockEntity(part);
blocks.put(part, new StructureSnapshot.BlockEntry(part.subtract(origin), index,
Optional.ofNullable(entity).map(value -> value.saveWithFullMetadata(level.registryAccess()))));
});
}
List<StructureSnapshot.EntityEntry> entities = new ArrayList<>();
for (Entity entity : level.getEntities((Entity) null, area, entity -> !(entity instanceof Player))) {
CompoundTag tag = new CompoundTag();
if (!entity.saveAsPassenger(tag)) continue;
tag.remove("Passengers");
if (entity.getVehicle() != null) tag.putUUID("anvilcraft:vehicle", entity.getVehicle().getUUID());
Vec3 pos = entity.position().subtract(Vec3.atLowerCornerOf(origin));
BlockPos block = entity instanceof Painting painting ? painting.getPos().subtract(origin) : BlockPos.containing(pos);
entities.add(new StructureSnapshot.EntityEntry(pos, block, tag));
}
List<BlueprintTicks.Entry> ticks = BlueprintTicks.capture(level, BoundingBox.fromCorners(origin, end)).stream()
.map(tick -> tick.at(tick.pos().subtract(origin))).toList();
StructureSnapshot raw = new StructureSnapshot(new Vec3i(end.getX() - origin.getX() + 1,
end.getY() - origin.getY() + 1, end.getZ() - origin.getZ() + 1), palette, new ArrayList<>(blocks.values()),
entities, ticks, level.getGameTime());
return BlueprintNormalizer.normalize(ScannerDiskNormalizer.normalize(raw, Direction.NORTH, false));
}
}
Loading
Loading