package net.minecraft.util.datafix.fixes; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.mojang.datafixers.DataFix; import com.mojang.datafixers.DataFixUtils; import com.mojang.datafixers.TypeRewriteRule; import com.mojang.datafixers.schemas.Schema; import com.mojang.datafixers.types.Type; import com.mojang.logging.LogUtils; import com.mojang.serialization.Dynamic; import it.unimi.dsi.fastutil.ints.Int2ObjectLinkedOpenHashMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; import it.unimi.dsi.fastutil.ints.Int2ObjectMap.Entry; import java.nio.ByteBuffer; import java.util.Arrays; import java.util.BitSet; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.stream.Stream; import javax.annotation.Nullable; import net.minecraft.util.CrudeIncrementalIntIdentityHashBiMap; import net.minecraft.util.datafix.ExtraDataFixUtils; import net.minecraft.util.datafix.PackedBitStorage; import org.slf4j.Logger; public class ChunkPalettedStorageFix extends DataFix { private static final int NORTH_WEST_MASK = 128; private static final int WEST_MASK = 64; private static final int SOUTH_WEST_MASK = 32; private static final int SOUTH_MASK = 16; private static final int SOUTH_EAST_MASK = 8; private static final int EAST_MASK = 4; private static final int NORTH_EAST_MASK = 2; private static final int NORTH_MASK = 1; static final Logger LOGGER = LogUtils.getLogger(); private static final int SIZE = 4096; public ChunkPalettedStorageFix(Schema p_15058_, boolean p_15059_) { super(p_15058_, p_15059_); } public static String getName(Dynamic p_15065_) { return p_15065_.get("Name").asString(""); } public static String getProperty(Dynamic p_15067_, String p_15068_) { return p_15067_.get("Properties").get(p_15068_).asString(""); } public static int idFor(CrudeIncrementalIntIdentityHashBiMap> p_15062_, Dynamic p_15063_) { int i = p_15062_.getId(p_15063_); if (i == -1) { i = p_15062_.add(p_15063_); } return i; } private Dynamic fix(Dynamic p_15093_) { Optional> optional = p_15093_.get("Level").result(); return optional.isPresent() && optional.get().get("Sections").asStreamOpt().result().isPresent() ? p_15093_.set("Level", new ChunkPalettedStorageFix.UpgradeChunk((Dynamic)optional.get()).write()) : p_15093_; } @Override public TypeRewriteRule makeRule() { Type type = this.getInputSchema().getType(References.CHUNK); Type type1 = this.getOutputSchema().getType(References.CHUNK); return this.writeFixAndRead("ChunkPalettedStorageFix", type, type1, this::fix); } public static int getSideMask(boolean p_15087_, boolean p_15088_, boolean p_15089_, boolean p_15090_) { int i = 0; if (p_15089_) { if (p_15088_) { i |= 2; } else if (p_15087_) { i |= 128; } else { i |= 1; } } else if (p_15090_) { if (p_15087_) { i |= 32; } else if (p_15088_) { i |= 8; } else { i |= 16; } } else if (p_15088_) { i |= 4; } else if (p_15087_) { i |= 64; } return i; } static class DataLayer { private static final int SIZE = 2048; private static final int NIBBLE_SIZE = 4; private final byte[] data; public DataLayer() { this.data = new byte[2048]; } public DataLayer(byte[] p_15132_) { this.data = p_15132_; if (p_15132_.length != 2048) { throw new IllegalArgumentException("ChunkNibbleArrays should be 2048 bytes not: " + p_15132_.length); } } public int get(int p_15136_, int p_15137_, int p_15138_) { int i = this.getPosition(p_15137_ << 8 | p_15138_ << 4 | p_15136_); return this.isFirst(p_15137_ << 8 | p_15138_ << 4 | p_15136_) ? this.data[i] & 15 : this.data[i] >> 4 & 15; } private boolean isFirst(int p_15134_) { return (p_15134_ & 1) == 0; } private int getPosition(int p_15140_) { return p_15140_ >> 1; } } public static enum Direction { DOWN(ChunkPalettedStorageFix.Direction.AxisDirection.NEGATIVE, ChunkPalettedStorageFix.Direction.Axis.Y), UP(ChunkPalettedStorageFix.Direction.AxisDirection.POSITIVE, ChunkPalettedStorageFix.Direction.Axis.Y), NORTH(ChunkPalettedStorageFix.Direction.AxisDirection.NEGATIVE, ChunkPalettedStorageFix.Direction.Axis.Z), SOUTH(ChunkPalettedStorageFix.Direction.AxisDirection.POSITIVE, ChunkPalettedStorageFix.Direction.Axis.Z), WEST(ChunkPalettedStorageFix.Direction.AxisDirection.NEGATIVE, ChunkPalettedStorageFix.Direction.Axis.X), EAST(ChunkPalettedStorageFix.Direction.AxisDirection.POSITIVE, ChunkPalettedStorageFix.Direction.Axis.X); private final ChunkPalettedStorageFix.Direction.Axis axis; private final ChunkPalettedStorageFix.Direction.AxisDirection axisDirection; private Direction(final ChunkPalettedStorageFix.Direction.AxisDirection p_15154_, final ChunkPalettedStorageFix.Direction.Axis p_15155_) { this.axis = p_15155_; this.axisDirection = p_15154_; } public ChunkPalettedStorageFix.Direction.AxisDirection getAxisDirection() { return this.axisDirection; } public ChunkPalettedStorageFix.Direction.Axis getAxis() { return this.axis; } public static enum Axis { X, Y, Z; } public static enum AxisDirection { POSITIVE(1), NEGATIVE(-1); private final int step; private AxisDirection(final int p_15180_) { this.step = p_15180_; } public int getStep() { return this.step; } } } static class MappingConstants { static final BitSet VIRTUAL = new BitSet(256); static final BitSet FIX = new BitSet(256); static final Dynamic PUMPKIN = ExtraDataFixUtils.blockState("minecraft:pumpkin"); static final Dynamic SNOWY_PODZOL = ExtraDataFixUtils.blockState("minecraft:podzol", Map.of("snowy", "true")); static final Dynamic SNOWY_GRASS = ExtraDataFixUtils.blockState("minecraft:grass_block", Map.of("snowy", "true")); static final Dynamic SNOWY_MYCELIUM = ExtraDataFixUtils.blockState("minecraft:mycelium", Map.of("snowy", "true")); static final Dynamic UPPER_SUNFLOWER = ExtraDataFixUtils.blockState("minecraft:sunflower", Map.of("half", "upper")); static final Dynamic UPPER_LILAC = ExtraDataFixUtils.blockState("minecraft:lilac", Map.of("half", "upper")); static final Dynamic UPPER_TALL_GRASS = ExtraDataFixUtils.blockState("minecraft:tall_grass", Map.of("half", "upper")); static final Dynamic UPPER_LARGE_FERN = ExtraDataFixUtils.blockState("minecraft:large_fern", Map.of("half", "upper")); static final Dynamic UPPER_ROSE_BUSH = ExtraDataFixUtils.blockState("minecraft:rose_bush", Map.of("half", "upper")); static final Dynamic UPPER_PEONY = ExtraDataFixUtils.blockState("minecraft:peony", Map.of("half", "upper")); static final Map> FLOWER_POT_MAP = DataFixUtils.make(Maps.newHashMap(), p_369284_ -> { p_369284_.put("minecraft:air0", ExtraDataFixUtils.blockState("minecraft:flower_pot")); p_369284_.put("minecraft:red_flower0", ExtraDataFixUtils.blockState("minecraft:potted_poppy")); p_369284_.put("minecraft:red_flower1", ExtraDataFixUtils.blockState("minecraft:potted_blue_orchid")); p_369284_.put("minecraft:red_flower2", ExtraDataFixUtils.blockState("minecraft:potted_allium")); p_369284_.put("minecraft:red_flower3", ExtraDataFixUtils.blockState("minecraft:potted_azure_bluet")); p_369284_.put("minecraft:red_flower4", ExtraDataFixUtils.blockState("minecraft:potted_red_tulip")); p_369284_.put("minecraft:red_flower5", ExtraDataFixUtils.blockState("minecraft:potted_orange_tulip")); p_369284_.put("minecraft:red_flower6", ExtraDataFixUtils.blockState("minecraft:potted_white_tulip")); p_369284_.put("minecraft:red_flower7", ExtraDataFixUtils.blockState("minecraft:potted_pink_tulip")); p_369284_.put("minecraft:red_flower8", ExtraDataFixUtils.blockState("minecraft:potted_oxeye_daisy")); p_369284_.put("minecraft:yellow_flower0", ExtraDataFixUtils.blockState("minecraft:potted_dandelion")); p_369284_.put("minecraft:sapling0", ExtraDataFixUtils.blockState("minecraft:potted_oak_sapling")); p_369284_.put("minecraft:sapling1", ExtraDataFixUtils.blockState("minecraft:potted_spruce_sapling")); p_369284_.put("minecraft:sapling2", ExtraDataFixUtils.blockState("minecraft:potted_birch_sapling")); p_369284_.put("minecraft:sapling3", ExtraDataFixUtils.blockState("minecraft:potted_jungle_sapling")); p_369284_.put("minecraft:sapling4", ExtraDataFixUtils.blockState("minecraft:potted_acacia_sapling")); p_369284_.put("minecraft:sapling5", ExtraDataFixUtils.blockState("minecraft:potted_dark_oak_sapling")); p_369284_.put("minecraft:red_mushroom0", ExtraDataFixUtils.blockState("minecraft:potted_red_mushroom")); p_369284_.put("minecraft:brown_mushroom0", ExtraDataFixUtils.blockState("minecraft:potted_brown_mushroom")); p_369284_.put("minecraft:deadbush0", ExtraDataFixUtils.blockState("minecraft:potted_dead_bush")); p_369284_.put("minecraft:tallgrass2", ExtraDataFixUtils.blockState("minecraft:potted_fern")); p_369284_.put("minecraft:cactus0", ExtraDataFixUtils.blockState("minecraft:potted_cactus")); }); static final Map> SKULL_MAP = DataFixUtils.make(Maps.newHashMap(), p_366440_ -> { mapSkull(p_366440_, 0, "skeleton", "skull"); mapSkull(p_366440_, 1, "wither_skeleton", "skull"); mapSkull(p_366440_, 2, "zombie", "head"); mapSkull(p_366440_, 3, "player", "head"); mapSkull(p_366440_, 4, "creeper", "head"); mapSkull(p_366440_, 5, "dragon", "head"); }); static final Map> DOOR_MAP = DataFixUtils.make(Maps.newHashMap(), p_366018_ -> { mapDoor(p_366018_, "oak_door"); mapDoor(p_366018_, "iron_door"); mapDoor(p_366018_, "spruce_door"); mapDoor(p_366018_, "birch_door"); mapDoor(p_366018_, "jungle_door"); mapDoor(p_366018_, "acacia_door"); mapDoor(p_366018_, "dark_oak_door"); }); static final Map> NOTE_BLOCK_MAP = DataFixUtils.make(Maps.newHashMap(), p_361432_ -> { for (int i = 0; i < 26; i++) { p_361432_.put("true" + i, ExtraDataFixUtils.blockState("minecraft:note_block", Map.of("powered", "true", "note", String.valueOf(i)))); p_361432_.put("false" + i, ExtraDataFixUtils.blockState("minecraft:note_block", Map.of("powered", "false", "note", String.valueOf(i)))); } }); private static final Int2ObjectMap DYE_COLOR_MAP = DataFixUtils.make(new Int2ObjectOpenHashMap<>(), p_366854_ -> { p_366854_.put(0, "white"); p_366854_.put(1, "orange"); p_366854_.put(2, "magenta"); p_366854_.put(3, "light_blue"); p_366854_.put(4, "yellow"); p_366854_.put(5, "lime"); p_366854_.put(6, "pink"); p_366854_.put(7, "gray"); p_366854_.put(8, "light_gray"); p_366854_.put(9, "cyan"); p_366854_.put(10, "purple"); p_366854_.put(11, "blue"); p_366854_.put(12, "brown"); p_366854_.put(13, "green"); p_366854_.put(14, "red"); p_366854_.put(15, "black"); }); static final Map> BED_BLOCK_MAP = DataFixUtils.make(Maps.newHashMap(), p_362358_ -> { for (Entry entry : DYE_COLOR_MAP.int2ObjectEntrySet()) { if (!Objects.equals(entry.getValue(), "red")) { addBeds(p_362358_, entry.getIntKey(), entry.getValue()); } } }); static final Map> BANNER_BLOCK_MAP = DataFixUtils.make(Maps.newHashMap(), p_362796_ -> { for (Entry entry : DYE_COLOR_MAP.int2ObjectEntrySet()) { if (!Objects.equals(entry.getValue(), "white")) { addBanners(p_362796_, 15 - entry.getIntKey(), entry.getValue()); } } }); static final Dynamic AIR = ExtraDataFixUtils.blockState("minecraft:air"); private MappingConstants() { } private static void mapSkull(Map> p_364399_, int p_365434_, String p_368075_, String p_367880_) { p_364399_.put(p_365434_ + "north", ExtraDataFixUtils.blockState("minecraft:" + p_368075_ + "_wall_" + p_367880_, Map.of("facing", "north"))); p_364399_.put(p_365434_ + "east", ExtraDataFixUtils.blockState("minecraft:" + p_368075_ + "_wall_" + p_367880_, Map.of("facing", "east"))); p_364399_.put(p_365434_ + "south", ExtraDataFixUtils.blockState("minecraft:" + p_368075_ + "_wall_" + p_367880_, Map.of("facing", "south"))); p_364399_.put(p_365434_ + "west", ExtraDataFixUtils.blockState("minecraft:" + p_368075_ + "_wall_" + p_367880_, Map.of("facing", "west"))); for (int i = 0; i < 16; i++) { p_364399_.put( "" + p_365434_ + i, ExtraDataFixUtils.blockState("minecraft:" + p_368075_ + "_" + p_367880_, Map.of("rotation", String.valueOf(i))) ); } } private static void mapDoor(Map> p_368492_, String p_362981_) { String s = "minecraft:" + p_362981_; p_368492_.put( "minecraft:" + p_362981_ + "eastlowerleftfalsefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "east", "half", "lower", "hinge", "left", "open", "false", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "eastlowerleftfalsetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "east", "half", "lower", "hinge", "left", "open", "false", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "eastlowerlefttruefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "east", "half", "lower", "hinge", "left", "open", "true", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "eastlowerlefttruetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "east", "half", "lower", "hinge", "left", "open", "true", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "eastlowerrightfalsefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "east", "half", "lower", "hinge", "right", "open", "false", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "eastlowerrightfalsetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "east", "half", "lower", "hinge", "right", "open", "false", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "eastlowerrighttruefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "east", "half", "lower", "hinge", "right", "open", "true", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "eastlowerrighttruetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "east", "half", "lower", "hinge", "right", "open", "true", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "eastupperleftfalsefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "east", "half", "upper", "hinge", "left", "open", "false", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "eastupperleftfalsetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "east", "half", "upper", "hinge", "left", "open", "false", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "eastupperlefttruefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "east", "half", "upper", "hinge", "left", "open", "true", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "eastupperlefttruetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "east", "half", "upper", "hinge", "left", "open", "true", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "eastupperrightfalsefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "east", "half", "upper", "hinge", "right", "open", "false", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "eastupperrightfalsetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "east", "half", "upper", "hinge", "right", "open", "false", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "eastupperrighttruefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "east", "half", "upper", "hinge", "right", "open", "true", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "eastupperrighttruetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "east", "half", "upper", "hinge", "right", "open", "true", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "northlowerleftfalsefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "north", "half", "lower", "hinge", "left", "open", "false", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "northlowerleftfalsetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "north", "half", "lower", "hinge", "left", "open", "false", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "northlowerlefttruefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "north", "half", "lower", "hinge", "left", "open", "true", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "northlowerlefttruetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "north", "half", "lower", "hinge", "left", "open", "true", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "northlowerrightfalsefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "north", "half", "lower", "hinge", "right", "open", "false", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "northlowerrightfalsetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "north", "half", "lower", "hinge", "right", "open", "false", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "northlowerrighttruefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "north", "half", "lower", "hinge", "right", "open", "true", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "northlowerrighttruetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "north", "half", "lower", "hinge", "right", "open", "true", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "northupperleftfalsefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "north", "half", "upper", "hinge", "left", "open", "false", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "northupperleftfalsetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "north", "half", "upper", "hinge", "left", "open", "false", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "northupperlefttruefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "north", "half", "upper", "hinge", "left", "open", "true", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "northupperlefttruetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "north", "half", "upper", "hinge", "left", "open", "true", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "northupperrightfalsefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "north", "half", "upper", "hinge", "right", "open", "false", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "northupperrightfalsetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "north", "half", "upper", "hinge", "right", "open", "false", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "northupperrighttruefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "north", "half", "upper", "hinge", "right", "open", "true", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "northupperrighttruetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "north", "half", "upper", "hinge", "right", "open", "true", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "southlowerleftfalsefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "south", "half", "lower", "hinge", "left", "open", "false", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "southlowerleftfalsetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "south", "half", "lower", "hinge", "left", "open", "false", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "southlowerlefttruefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "south", "half", "lower", "hinge", "left", "open", "true", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "southlowerlefttruetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "south", "half", "lower", "hinge", "left", "open", "true", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "southlowerrightfalsefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "south", "half", "lower", "hinge", "right", "open", "false", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "southlowerrightfalsetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "south", "half", "lower", "hinge", "right", "open", "false", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "southlowerrighttruefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "south", "half", "lower", "hinge", "right", "open", "true", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "southlowerrighttruetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "south", "half", "lower", "hinge", "right", "open", "true", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "southupperleftfalsefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "south", "half", "upper", "hinge", "left", "open", "false", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "southupperleftfalsetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "south", "half", "upper", "hinge", "left", "open", "false", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "southupperlefttruefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "south", "half", "upper", "hinge", "left", "open", "true", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "southupperlefttruetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "south", "half", "upper", "hinge", "left", "open", "true", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "southupperrightfalsefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "south", "half", "upper", "hinge", "right", "open", "false", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "southupperrightfalsetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "south", "half", "upper", "hinge", "right", "open", "false", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "southupperrighttruefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "south", "half", "upper", "hinge", "right", "open", "true", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "southupperrighttruetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "south", "half", "upper", "hinge", "right", "open", "true", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "westlowerleftfalsefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "west", "half", "lower", "hinge", "left", "open", "false", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "westlowerleftfalsetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "west", "half", "lower", "hinge", "left", "open", "false", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "westlowerlefttruefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "west", "half", "lower", "hinge", "left", "open", "true", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "westlowerlefttruetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "west", "half", "lower", "hinge", "left", "open", "true", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "westlowerrightfalsefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "west", "half", "lower", "hinge", "right", "open", "false", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "westlowerrightfalsetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "west", "half", "lower", "hinge", "right", "open", "false", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "westlowerrighttruefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "west", "half", "lower", "hinge", "right", "open", "true", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "westlowerrighttruetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "west", "half", "lower", "hinge", "right", "open", "true", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "westupperleftfalsefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "west", "half", "upper", "hinge", "left", "open", "false", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "westupperleftfalsetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "west", "half", "upper", "hinge", "left", "open", "false", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "westupperlefttruefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "west", "half", "upper", "hinge", "left", "open", "true", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "westupperlefttruetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "west", "half", "upper", "hinge", "left", "open", "true", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "westupperrightfalsefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "west", "half", "upper", "hinge", "right", "open", "false", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "westupperrightfalsetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "west", "half", "upper", "hinge", "right", "open", "false", "powered", "true")) ); p_368492_.put( "minecraft:" + p_362981_ + "westupperrighttruefalse", ExtraDataFixUtils.blockState(s, Map.of("facing", "west", "half", "upper", "hinge", "right", "open", "true", "powered", "false")) ); p_368492_.put( "minecraft:" + p_362981_ + "westupperrighttruetrue", ExtraDataFixUtils.blockState(s, Map.of("facing", "west", "half", "upper", "hinge", "right", "open", "true", "powered", "true")) ); } private static void addBeds(Map> p_369009_, int p_366326_, String p_363252_) { p_369009_.put( "southfalsefoot" + p_366326_, ExtraDataFixUtils.blockState("minecraft:" + p_363252_ + "_bed", Map.of("facing", "south", "occupied", "false", "part", "foot")) ); p_369009_.put( "westfalsefoot" + p_366326_, ExtraDataFixUtils.blockState("minecraft:" + p_363252_ + "_bed", Map.of("facing", "west", "occupied", "false", "part", "foot")) ); p_369009_.put( "northfalsefoot" + p_366326_, ExtraDataFixUtils.blockState("minecraft:" + p_363252_ + "_bed", Map.of("facing", "north", "occupied", "false", "part", "foot")) ); p_369009_.put( "eastfalsefoot" + p_366326_, ExtraDataFixUtils.blockState("minecraft:" + p_363252_ + "_bed", Map.of("facing", "east", "occupied", "false", "part", "foot")) ); p_369009_.put( "southfalsehead" + p_366326_, ExtraDataFixUtils.blockState("minecraft:" + p_363252_ + "_bed", Map.of("facing", "south", "occupied", "false", "part", "head")) ); p_369009_.put( "westfalsehead" + p_366326_, ExtraDataFixUtils.blockState("minecraft:" + p_363252_ + "_bed", Map.of("facing", "west", "occupied", "false", "part", "head")) ); p_369009_.put( "northfalsehead" + p_366326_, ExtraDataFixUtils.blockState("minecraft:" + p_363252_ + "_bed", Map.of("facing", "north", "occupied", "false", "part", "head")) ); p_369009_.put( "eastfalsehead" + p_366326_, ExtraDataFixUtils.blockState("minecraft:" + p_363252_ + "_bed", Map.of("facing", "east", "occupied", "false", "part", "head")) ); p_369009_.put( "southtruehead" + p_366326_, ExtraDataFixUtils.blockState("minecraft:" + p_363252_ + "_bed", Map.of("facing", "south", "occupied", "true", "part", "head")) ); p_369009_.put( "westtruehead" + p_366326_, ExtraDataFixUtils.blockState("minecraft:" + p_363252_ + "_bed", Map.of("facing", "west", "occupied", "true", "part", "head")) ); p_369009_.put( "northtruehead" + p_366326_, ExtraDataFixUtils.blockState("minecraft:" + p_363252_ + "_bed", Map.of("facing", "north", "occupied", "true", "part", "head")) ); p_369009_.put( "easttruehead" + p_366326_, ExtraDataFixUtils.blockState("minecraft:" + p_363252_ + "_bed", Map.of("facing", "east", "occupied", "true", "part", "head")) ); } private static void addBanners(Map> p_368021_, int p_361887_, String p_364451_) { for (int i = 0; i < 16; i++) { p_368021_.put(i + "_" + p_361887_, ExtraDataFixUtils.blockState("minecraft:" + p_364451_ + "_banner", Map.of("rotation", String.valueOf(i)))); } p_368021_.put("north_" + p_361887_, ExtraDataFixUtils.blockState("minecraft:" + p_364451_ + "_wall_banner", Map.of("facing", "north"))); p_368021_.put("south_" + p_361887_, ExtraDataFixUtils.blockState("minecraft:" + p_364451_ + "_wall_banner", Map.of("facing", "south"))); p_368021_.put("west_" + p_361887_, ExtraDataFixUtils.blockState("minecraft:" + p_364451_ + "_wall_banner", Map.of("facing", "west"))); p_368021_.put("east_" + p_361887_, ExtraDataFixUtils.blockState("minecraft:" + p_364451_ + "_wall_banner", Map.of("facing", "east"))); } static { FIX.set(2); FIX.set(3); FIX.set(110); FIX.set(140); FIX.set(144); FIX.set(25); FIX.set(86); FIX.set(26); FIX.set(176); FIX.set(177); FIX.set(175); FIX.set(64); FIX.set(71); FIX.set(193); FIX.set(194); FIX.set(195); FIX.set(196); FIX.set(197); VIRTUAL.set(54); VIRTUAL.set(146); VIRTUAL.set(25); VIRTUAL.set(26); VIRTUAL.set(51); VIRTUAL.set(53); VIRTUAL.set(67); VIRTUAL.set(108); VIRTUAL.set(109); VIRTUAL.set(114); VIRTUAL.set(128); VIRTUAL.set(134); VIRTUAL.set(135); VIRTUAL.set(136); VIRTUAL.set(156); VIRTUAL.set(163); VIRTUAL.set(164); VIRTUAL.set(180); VIRTUAL.set(203); VIRTUAL.set(55); VIRTUAL.set(85); VIRTUAL.set(113); VIRTUAL.set(188); VIRTUAL.set(189); VIRTUAL.set(190); VIRTUAL.set(191); VIRTUAL.set(192); VIRTUAL.set(93); VIRTUAL.set(94); VIRTUAL.set(101); VIRTUAL.set(102); VIRTUAL.set(160); VIRTUAL.set(106); VIRTUAL.set(107); VIRTUAL.set(183); VIRTUAL.set(184); VIRTUAL.set(185); VIRTUAL.set(186); VIRTUAL.set(187); VIRTUAL.set(132); VIRTUAL.set(139); VIRTUAL.set(199); } } static class Section { private final CrudeIncrementalIntIdentityHashBiMap> palette = CrudeIncrementalIntIdentityHashBiMap.create(32); private final List> listTag; private final Dynamic section; private final boolean hasData; final Int2ObjectMap toFix = new Int2ObjectLinkedOpenHashMap<>(); final IntList update = new IntArrayList(); public final int y; private final Set> seen = Sets.newIdentityHashSet(); private final int[] buffer = new int[4096]; public Section(Dynamic p_15195_) { this.listTag = Lists.newArrayList(); this.section = p_15195_; this.y = p_15195_.get("Y").asInt(0); this.hasData = p_15195_.get("Blocks").result().isPresent(); } public Dynamic getBlock(int p_15198_) { if (p_15198_ >= 0 && p_15198_ <= 4095) { Dynamic dynamic = this.palette.byId(this.buffer[p_15198_]); return dynamic == null ? ChunkPalettedStorageFix.MappingConstants.AIR : dynamic; } else { return ChunkPalettedStorageFix.MappingConstants.AIR; } } public void setBlock(int p_15203_, Dynamic p_15204_) { if (this.seen.add(p_15204_)) { this.listTag .add("%%FILTER_ME%%".equals(ChunkPalettedStorageFix.getName(p_15204_)) ? ChunkPalettedStorageFix.MappingConstants.AIR : p_15204_); } this.buffer[p_15203_] = ChunkPalettedStorageFix.idFor(this.palette, p_15204_); } public int upgrade(int p_15210_) { if (!this.hasData) { return p_15210_; } else { ByteBuffer bytebuffer = this.section.get("Blocks").asByteBufferOpt().result().get(); ChunkPalettedStorageFix.DataLayer chunkpalettedstoragefix$datalayer = this.section .get("Data") .asByteBufferOpt() .map(p_15214_ -> new ChunkPalettedStorageFix.DataLayer(DataFixUtils.toArray(p_15214_))) .result() .orElseGet(ChunkPalettedStorageFix.DataLayer::new); ChunkPalettedStorageFix.DataLayer chunkpalettedstoragefix$datalayer1 = this.section .get("Add") .asByteBufferOpt() .map(p_15208_ -> new ChunkPalettedStorageFix.DataLayer(DataFixUtils.toArray(p_15208_))) .result() .orElseGet(ChunkPalettedStorageFix.DataLayer::new); this.seen.add(ChunkPalettedStorageFix.MappingConstants.AIR); ChunkPalettedStorageFix.idFor(this.palette, ChunkPalettedStorageFix.MappingConstants.AIR); this.listTag.add(ChunkPalettedStorageFix.MappingConstants.AIR); for (int i = 0; i < 4096; i++) { int j = i & 15; int k = i >> 8 & 15; int l = i >> 4 & 15; int i1 = chunkpalettedstoragefix$datalayer1.get(j, k, l) << 12 | (bytebuffer.get(i) & 255) << 4 | chunkpalettedstoragefix$datalayer.get(j, k, l); if (ChunkPalettedStorageFix.MappingConstants.FIX.get(i1 >> 4)) { this.addFix(i1 >> 4, i); } if (ChunkPalettedStorageFix.MappingConstants.VIRTUAL.get(i1 >> 4)) { int j1 = ChunkPalettedStorageFix.getSideMask(j == 0, j == 15, l == 0, l == 15); if (j1 == 0) { this.update.add(i); } else { p_15210_ |= j1; } } this.setBlock(i, BlockStateData.getTag(i1)); } return p_15210_; } } private void addFix(int p_15200_, int p_15201_) { IntList intlist = this.toFix.get(p_15200_); if (intlist == null) { intlist = new IntArrayList(); this.toFix.put(p_15200_, intlist); } intlist.add(p_15201_); } public Dynamic write() { Dynamic dynamic = this.section; if (!this.hasData) { return dynamic; } else { dynamic = dynamic.set("Palette", dynamic.createList(this.listTag.stream())); int i = Math.max(4, DataFixUtils.ceillog2(this.seen.size())); PackedBitStorage packedbitstorage = new PackedBitStorage(i, 4096); for (int j = 0; j < this.buffer.length; j++) { packedbitstorage.set(j, this.buffer[j]); } dynamic = dynamic.set("BlockStates", dynamic.createLongList(Arrays.stream(packedbitstorage.getRaw()))); dynamic = dynamic.remove("Blocks"); dynamic = dynamic.remove("Data"); return dynamic.remove("Add"); } } } static final class UpgradeChunk { private int sides; private final ChunkPalettedStorageFix.Section[] sections = new ChunkPalettedStorageFix.Section[16]; private final Dynamic level; private final int x; private final int z; private final Int2ObjectMap> blockEntities = new Int2ObjectLinkedOpenHashMap<>(16); public UpgradeChunk(Dynamic p_15222_) { this.level = p_15222_; this.x = p_15222_.get("xPos").asInt(0) << 4; this.z = p_15222_.get("zPos").asInt(0) << 4; p_15222_.get("TileEntities") .asStreamOpt() .ifSuccess( p_15241_ -> p_15241_.forEach( p_145228_ -> { int l3 = p_145228_.get("x").asInt(0) - this.x & 15; int i4 = p_145228_.get("y").asInt(0); int j4 = p_145228_.get("z").asInt(0) - this.z & 15; int k4 = i4 << 8 | j4 << 4 | l3; if (this.blockEntities.put(k4, (Dynamic)p_145228_) != null) { ChunkPalettedStorageFix.LOGGER .warn("In chunk: {}x{} found a duplicate block entity at position: [{}, {}, {}]", this.x, this.z, l3, i4, j4); } } ) ); boolean flag = p_15222_.get("convertedFromAlphaFormat").asBoolean(false); p_15222_.get("Sections").asStreamOpt().ifSuccess(p_15235_ -> p_15235_.forEach(p_145226_ -> { ChunkPalettedStorageFix.Section chunkpalettedstoragefix$section1 = new ChunkPalettedStorageFix.Section((Dynamic)p_145226_); this.sides = chunkpalettedstoragefix$section1.upgrade(this.sides); this.sections[chunkpalettedstoragefix$section1.y] = chunkpalettedstoragefix$section1; })); for (ChunkPalettedStorageFix.Section chunkpalettedstoragefix$section : this.sections) { if (chunkpalettedstoragefix$section != null) { for (Entry entry : chunkpalettedstoragefix$section.toFix.int2ObjectEntrySet()) { int i = chunkpalettedstoragefix$section.y << 12; switch (entry.getIntKey()) { case 2: for (int i3 : entry.getValue()) { i3 |= i; Dynamic dynamic11 = this.getBlock(i3); if ("minecraft:grass_block".equals(ChunkPalettedStorageFix.getName(dynamic11))) { String s11 = ChunkPalettedStorageFix.getName(this.getBlock(relative(i3, ChunkPalettedStorageFix.Direction.UP))); if ("minecraft:snow".equals(s11) || "minecraft:snow_layer".equals(s11)) { this.setBlock(i3, ChunkPalettedStorageFix.MappingConstants.SNOWY_GRASS); } } } break; case 3: for (int l2 : entry.getValue()) { l2 |= i; Dynamic dynamic10 = this.getBlock(l2); if ("minecraft:podzol".equals(ChunkPalettedStorageFix.getName(dynamic10))) { String s10 = ChunkPalettedStorageFix.getName(this.getBlock(relative(l2, ChunkPalettedStorageFix.Direction.UP))); if ("minecraft:snow".equals(s10) || "minecraft:snow_layer".equals(s10)) { this.setBlock(l2, ChunkPalettedStorageFix.MappingConstants.SNOWY_PODZOL); } } } break; case 25: for (int k2 : entry.getValue()) { k2 |= i; Dynamic dynamic9 = this.removeBlockEntity(k2); if (dynamic9 != null) { String s9 = Boolean.toString(dynamic9.get("powered").asBoolean(false)) + (byte)Math.min(Math.max(dynamic9.get("note").asInt(0), 0), 24); this.setBlock( k2, ChunkPalettedStorageFix.MappingConstants.NOTE_BLOCK_MAP .getOrDefault(s9, ChunkPalettedStorageFix.MappingConstants.NOTE_BLOCK_MAP.get("false0")) ); } } break; case 26: for (int j2 : entry.getValue()) { j2 |= i; Dynamic dynamic8 = this.getBlockEntity(j2); Dynamic dynamic14 = this.getBlock(j2); if (dynamic8 != null) { int k3 = dynamic8.get("color").asInt(0); if (k3 != 14 && k3 >= 0 && k3 < 16) { String s15 = ChunkPalettedStorageFix.getProperty(dynamic14, "facing") + ChunkPalettedStorageFix.getProperty(dynamic14, "occupied") + ChunkPalettedStorageFix.getProperty(dynamic14, "part") + k3; if (ChunkPalettedStorageFix.MappingConstants.BED_BLOCK_MAP.containsKey(s15)) { this.setBlock(j2, ChunkPalettedStorageFix.MappingConstants.BED_BLOCK_MAP.get(s15)); } } } } break; case 64: case 71: case 193: case 194: case 195: case 196: case 197: for (int i2 : entry.getValue()) { i2 |= i; Dynamic dynamic7 = this.getBlock(i2); if (ChunkPalettedStorageFix.getName(dynamic7).endsWith("_door")) { Dynamic dynamic13 = this.getBlock(i2); if ("lower".equals(ChunkPalettedStorageFix.getProperty(dynamic13, "half"))) { int j3 = relative(i2, ChunkPalettedStorageFix.Direction.UP); Dynamic dynamic15 = this.getBlock(j3); String s16 = ChunkPalettedStorageFix.getName(dynamic13); if (s16.equals(ChunkPalettedStorageFix.getName(dynamic15))) { String s1 = ChunkPalettedStorageFix.getProperty(dynamic13, "facing"); String s2 = ChunkPalettedStorageFix.getProperty(dynamic13, "open"); String s3 = flag ? "left" : ChunkPalettedStorageFix.getProperty(dynamic15, "hinge"); String s4 = flag ? "false" : ChunkPalettedStorageFix.getProperty(dynamic15, "powered"); this.setBlock(i2, ChunkPalettedStorageFix.MappingConstants.DOOR_MAP.get(s16 + s1 + "lower" + s3 + s2 + s4)); this.setBlock(j3, ChunkPalettedStorageFix.MappingConstants.DOOR_MAP.get(s16 + s1 + "upper" + s3 + s2 + s4)); } } } } break; case 86: for (int l1 : entry.getValue()) { l1 |= i; Dynamic dynamic6 = this.getBlock(l1); if ("minecraft:carved_pumpkin".equals(ChunkPalettedStorageFix.getName(dynamic6))) { String s8 = ChunkPalettedStorageFix.getName(this.getBlock(relative(l1, ChunkPalettedStorageFix.Direction.DOWN))); if ("minecraft:grass_block".equals(s8) || "minecraft:dirt".equals(s8)) { this.setBlock(l1, ChunkPalettedStorageFix.MappingConstants.PUMPKIN); } } } break; case 110: for (int k1 : entry.getValue()) { k1 |= i; Dynamic dynamic5 = this.getBlock(k1); if ("minecraft:mycelium".equals(ChunkPalettedStorageFix.getName(dynamic5))) { String s7 = ChunkPalettedStorageFix.getName(this.getBlock(relative(k1, ChunkPalettedStorageFix.Direction.UP))); if ("minecraft:snow".equals(s7) || "minecraft:snow_layer".equals(s7)) { this.setBlock(k1, ChunkPalettedStorageFix.MappingConstants.SNOWY_MYCELIUM); } } } break; case 140: for (int j1 : entry.getValue()) { j1 |= i; Dynamic dynamic4 = this.removeBlockEntity(j1); if (dynamic4 != null) { String s6 = dynamic4.get("Item").asString("") + dynamic4.get("Data").asInt(0); this.setBlock( j1, ChunkPalettedStorageFix.MappingConstants.FLOWER_POT_MAP .getOrDefault(s6, ChunkPalettedStorageFix.MappingConstants.FLOWER_POT_MAP.get("minecraft:air0")) ); } } break; case 144: for (int i1 : entry.getValue()) { i1 |= i; Dynamic dynamic3 = this.getBlockEntity(i1); if (dynamic3 != null) { String s5 = String.valueOf(dynamic3.get("SkullType").asInt(0)); String s13 = ChunkPalettedStorageFix.getProperty(this.getBlock(i1), "facing"); String s14; if (!"up".equals(s13) && !"down".equals(s13)) { s14 = s5 + s13; } else { s14 = s5 + dynamic3.get("Rot").asInt(0); } dynamic3.remove("SkullType"); dynamic3.remove("facing"); dynamic3.remove("Rot"); this.setBlock( i1, ChunkPalettedStorageFix.MappingConstants.SKULL_MAP .getOrDefault(s14, ChunkPalettedStorageFix.MappingConstants.SKULL_MAP.get("0north")) ); } } break; case 175: for (int l : entry.getValue()) { l |= i; Dynamic dynamic2 = this.getBlock(l); if ("upper".equals(ChunkPalettedStorageFix.getProperty(dynamic2, "half"))) { Dynamic dynamic12 = this.getBlock(relative(l, ChunkPalettedStorageFix.Direction.DOWN)); String s12 = ChunkPalettedStorageFix.getName(dynamic12); switch (s12) { case "minecraft:sunflower": this.setBlock(l, ChunkPalettedStorageFix.MappingConstants.UPPER_SUNFLOWER); break; case "minecraft:lilac": this.setBlock(l, ChunkPalettedStorageFix.MappingConstants.UPPER_LILAC); break; case "minecraft:tall_grass": this.setBlock(l, ChunkPalettedStorageFix.MappingConstants.UPPER_TALL_GRASS); break; case "minecraft:large_fern": this.setBlock(l, ChunkPalettedStorageFix.MappingConstants.UPPER_LARGE_FERN); break; case "minecraft:rose_bush": this.setBlock(l, ChunkPalettedStorageFix.MappingConstants.UPPER_ROSE_BUSH); break; case "minecraft:peony": this.setBlock(l, ChunkPalettedStorageFix.MappingConstants.UPPER_PEONY); } } } break; case 176: case 177: for (int j : entry.getValue()) { j |= i; Dynamic dynamic = this.getBlockEntity(j); Dynamic dynamic1 = this.getBlock(j); if (dynamic != null) { int k = dynamic.get("Base").asInt(0); if (k != 15 && k >= 0 && k < 16) { String s = ChunkPalettedStorageFix.getProperty(dynamic1, entry.getIntKey() == 176 ? "rotation" : "facing") + "_" + k; if (ChunkPalettedStorageFix.MappingConstants.BANNER_BLOCK_MAP.containsKey(s)) { this.setBlock(j, ChunkPalettedStorageFix.MappingConstants.BANNER_BLOCK_MAP.get(s)); } } } } } } } } } @Nullable private Dynamic getBlockEntity(int p_15237_) { return this.blockEntities.get(p_15237_); } @Nullable private Dynamic removeBlockEntity(int p_15243_) { return this.blockEntities.remove(p_15243_); } public static int relative(int p_15227_, ChunkPalettedStorageFix.Direction p_15228_) { return switch (p_15228_.getAxis()) { case X -> { int k = (p_15227_ & 15) + p_15228_.getAxisDirection().getStep(); yield k >= 0 && k <= 15 ? p_15227_ & -16 | k : -1; } case Y -> { int j = (p_15227_ >> 8) + p_15228_.getAxisDirection().getStep(); yield j >= 0 && j <= 255 ? p_15227_ & 0xFF | j << 8 : -1; } case Z -> { int i = (p_15227_ >> 4 & 15) + p_15228_.getAxisDirection().getStep(); yield i >= 0 && i <= 15 ? p_15227_ & -241 | i << 4 : -1; } }; } private void setBlock(int p_15230_, Dynamic p_15231_) { if (p_15230_ >= 0 && p_15230_ <= 65535) { ChunkPalettedStorageFix.Section chunkpalettedstoragefix$section = this.getSection(p_15230_); if (chunkpalettedstoragefix$section != null) { chunkpalettedstoragefix$section.setBlock(p_15230_ & 4095, p_15231_); } } } @Nullable private ChunkPalettedStorageFix.Section getSection(int p_15245_) { int i = p_15245_ >> 12; return i < this.sections.length ? this.sections[i] : null; } public Dynamic getBlock(int p_15225_) { if (p_15225_ >= 0 && p_15225_ <= 65535) { ChunkPalettedStorageFix.Section chunkpalettedstoragefix$section = this.getSection(p_15225_); return chunkpalettedstoragefix$section == null ? ChunkPalettedStorageFix.MappingConstants.AIR : chunkpalettedstoragefix$section.getBlock(p_15225_ & 4095); } else { return ChunkPalettedStorageFix.MappingConstants.AIR; } } public Dynamic write() { Dynamic dynamic = this.level; if (this.blockEntities.isEmpty()) { dynamic = dynamic.remove("TileEntities"); } else { dynamic = dynamic.set("TileEntities", dynamic.createList(this.blockEntities.values().stream())); } Dynamic dynamic1 = dynamic.emptyMap(); List> list = Lists.newArrayList(); for (ChunkPalettedStorageFix.Section chunkpalettedstoragefix$section : this.sections) { if (chunkpalettedstoragefix$section != null) { list.add(chunkpalettedstoragefix$section.write()); dynamic1 = dynamic1.set( String.valueOf(chunkpalettedstoragefix$section.y), dynamic1.createIntList(Arrays.stream(chunkpalettedstoragefix$section.update.toIntArray())) ); } } Dynamic dynamic2 = dynamic.emptyMap(); dynamic2 = dynamic2.set("Sides", dynamic2.createByte((byte)this.sides)); dynamic2 = dynamic2.set("Indices", dynamic1); return dynamic.set("UpgradeData", dynamic2).set("Sections", dynamic2.createList(list.stream())); } } }