From 3e29d3e24da2072167ef91fafae7c323b16f8cb5 Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Sat, 20 Feb 2021 21:57:13 +0800 Subject: [PATCH] Add missing patch to structure data --- .../world/chunk/storage/ChunkLoaderMixin.java | 75 +++++++++++++++++++ .../core/world/server/ChunkManagerMixin.java | 11 +++ .../main/resources/mixins.arclight.core.json | 1 + 3 files changed, 87 insertions(+) create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/chunk/storage/ChunkLoaderMixin.java diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/chunk/storage/ChunkLoaderMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/chunk/storage/ChunkLoaderMixin.java new file mode 100644 index 00000000..5d2da9cc --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/chunk/storage/ChunkLoaderMixin.java @@ -0,0 +1,75 @@ +package io.izzel.arclight.common.mixin.core.world.chunk.storage; + +import com.google.common.collect.ImmutableList; +import com.mojang.datafixers.DataFixer; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.NBTUtil; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.SharedConstants; +import net.minecraft.util.datafix.DefaultTypeReferences; +import net.minecraft.world.DimensionType; +import net.minecraft.world.World; +import net.minecraft.world.chunk.storage.ChunkLoader; +import net.minecraft.world.gen.feature.structure.LegacyStructureDataUtil; +import net.minecraft.world.storage.DimensionSavedDataManager; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import javax.annotation.Nullable; +import java.util.List; +import java.util.function.Supplier; + +@Mixin(ChunkLoader.class) +public abstract class ChunkLoaderMixin { + + // @formatter:off + @Shadow public static int getDataVersion(CompoundNBT compound) { return 0; } + @Shadow @Final protected DataFixer dataFixer; + @Shadow @Nullable private LegacyStructureDataUtil field_219167_a; + // @formatter:on + + /** + * @author IzzelAliz + * @reason + */ + @Overwrite + public CompoundNBT func_235968_a_(RegistryKey p_235968_1_, Supplier p_235968_2_, CompoundNBT nbt) { + int i = getDataVersion(nbt); + if (i < 1493) { + nbt = NBTUtil.update(this.dataFixer, DefaultTypeReferences.CHUNK, nbt, i, 1493); + if (nbt.getCompound("Level").getBoolean("hasLegacyStructureData")) { + if (this.field_219167_a == null) { + this.field_219167_a = legacyDataOf(p_235968_1_, p_235968_2_.get()); + } + + nbt = this.field_219167_a.func_212181_a(nbt); + } + } + + nbt = NBTUtil.update(this.dataFixer, DefaultTypeReferences.CHUNK, nbt, Math.max(1493, i)); + if (i < SharedConstants.getVersion().getWorldVersion()) { + nbt.putInt("DataVersion", SharedConstants.getVersion().getWorldVersion()); + } + + return nbt; + } + + /** + * From {@link LegacyStructureDataUtil#func_236992_a_(RegistryKey, DimensionSavedDataManager)} + */ + private static LegacyStructureDataUtil legacyDataOf(RegistryKey typeKey, @Nullable DimensionSavedDataManager dataManager) { + if (typeKey == DimensionType.OVERWORLD || typeKey == World.OVERWORLD) { + return new LegacyStructureDataUtil(dataManager, ImmutableList.of("Monument", "Stronghold", "Village", "Mineshaft", "Temple", "Mansion"), ImmutableList.of("Village", "Mineshaft", "Mansion", "Igloo", "Desert_Pyramid", "Jungle_Pyramid", "Swamp_Hut", "Stronghold", "Monument")); + } else if (typeKey == DimensionType.THE_NETHER || typeKey == World.THE_NETHER) { + List list1 = ImmutableList.of("Fortress"); + return new LegacyStructureDataUtil(dataManager, list1, list1); + } else if (typeKey == DimensionType.THE_END || typeKey == World.THE_END) { + List list = ImmutableList.of("EndCity"); + return new LegacyStructureDataUtil(dataManager, list, list); + } else { + throw new RuntimeException(String.format("Unknown dimension type : %s", typeKey)); + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ChunkManagerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ChunkManagerMixin.java index d4b4cee5..dfb124e2 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ChunkManagerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ChunkManagerMixin.java @@ -1,13 +1,19 @@ package io.izzel.arclight.common.mixin.core.world.server; +import io.izzel.arclight.common.bridge.world.WorldBridge; import io.izzel.arclight.common.bridge.world.server.ChunkManagerBridge; import io.izzel.arclight.common.mod.util.ArclightCallbackExecutor; +import net.minecraft.util.RegistryKey; import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.DimensionType; import net.minecraft.world.server.ChunkHolder; import net.minecraft.world.server.ChunkManager; +import net.minecraft.world.server.ServerWorld; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.gen.Invoker; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; import javax.annotation.Nullable; import java.util.function.BooleanSupplier; @@ -24,6 +30,11 @@ public abstract class ChunkManagerMixin implements ChunkManagerBridge { @Invoker("setViewDistance") public abstract void bridge$setViewDistance(int i); // @formatter:on + @Redirect(method = "loadChunkData", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;getDimensionKey()Lnet/minecraft/util/RegistryKey;")) + private RegistryKey arclight$useTypeKey(ServerWorld serverWorld) { + return ((WorldBridge) serverWorld).bridge$getTypeKey(); + } + public final ArclightCallbackExecutor callbackExecutor = new ArclightCallbackExecutor(); @Override diff --git a/arclight-common/src/main/resources/mixins.arclight.core.json b/arclight-common/src/main/resources/mixins.arclight.core.json index 4fd72ef3..b5c6860c 100644 --- a/arclight-common/src/main/resources/mixins.arclight.core.json +++ b/arclight-common/src/main/resources/mixins.arclight.core.json @@ -410,6 +410,7 @@ "world.biome.BiomeContainerMixin", "world.border.WorldBorderMixin", "world.chunk.ChunkMixin", + "world.chunk.storage.ChunkLoaderMixin", "world.chunk.storage.RegionFileCacheMixin", "world.gen.WorldGenRegionMixin", "world.gen.feature.structure.StructureManagerMixin",