From a2605ef3f9759b72e4123e749a1e212adf5539d0 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 13 Mar 2021 05:08:17 +0300 Subject: [PATCH] Data Fixer (WIP) --- src/main/java/ru/betterend/BetterEnd.java | 2 + .../mixin/common/ServerWorldMixin.java | 69 ++++++++++++++ .../java/ru/betterend/util/DataFixerUtil.java | 90 ++++++++++++++++++ .../models/item/end_stone_stalactite.json | 6 ++ .../item/end_stone_stalactite_cavemoss.json | 6 ++ .../textures/item/end_stone_stalactite.png | Bin 0 -> 1569 bytes .../item/end_stone_stalactite_cavemoss.png | Bin 0 -> 2103 bytes .../resources/betterend.mixins.common.json | 1 + 8 files changed, 174 insertions(+) create mode 100644 src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java create mode 100644 src/main/java/ru/betterend/util/DataFixerUtil.java create mode 100644 src/main/resources/assets/betterend/models/item/end_stone_stalactite.json create mode 100644 src/main/resources/assets/betterend/models/item/end_stone_stalactite_cavemoss.json create mode 100644 src/main/resources/assets/betterend/textures/item/end_stone_stalactite.png create mode 100644 src/main/resources/assets/betterend/textures/item/end_stone_stalactite_cavemoss.png diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index 628f2618..2cf9e6c9 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -32,6 +32,7 @@ import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; import ru.betterend.registry.EndTags; import ru.betterend.util.BonemealUtil; +import ru.betterend.util.DataFixerUtil; import ru.betterend.util.Logger; import ru.betterend.world.generator.BetterEndBiomeSource; import ru.betterend.world.generator.GeneratorOptions; @@ -65,6 +66,7 @@ public class BetterEnd implements ModInitializer { Integrations.register(); BonemealUtil.init(); GeneratorOptions.init(); + DataFixerUtil.init(); if (hasGuideBook()) { GuideBookItem.register(); diff --git a/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java b/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java new file mode 100644 index 00000000..4d2a5df9 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/ServerWorldMixin.java @@ -0,0 +1,69 @@ +package ru.betterend.mixin.common; + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.concurrent.Executor; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.fabricmc.loader.api.FabricLoader; +import net.fabricmc.loader.api.metadata.ModMetadata; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtIo; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.WorldGenerationProgressListener; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.registry.RegistryKey; +import net.minecraft.world.World; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.gen.Spawner; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.level.ServerWorldProperties; +import net.minecraft.world.level.storage.LevelStorage; +import ru.betterend.BetterEnd; +import ru.betterend.util.DataFixerUtil; + +@Mixin(ServerWorld.class) +public class ServerWorldMixin { + @Inject(method = "*", at = @At("TAIL")) + private void be_onServerWorldInit(MinecraftServer server, Executor workerExecutor, LevelStorage.Session session, ServerWorldProperties properties, RegistryKey registryKey, DimensionType dimensionType, WorldGenerationProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List list, boolean bl, CallbackInfo info) { + File beData = new File(FabricLoader.getInstance().getGameDir().getParent().toString(), "saves/" + properties.getLevelName() + "/betterend_data.nbt"); + ModMetadata meta = FabricLoader.getInstance().getModContainer(BetterEnd.MOD_ID).get().getMetadata(); + String version = meta.getVersion().toString(); + boolean fix = false; + if (version.equals("${version}")) { + version = "development"; + } + if (beData.exists()) { + CompoundTag root; + try { + root = NbtIo.read(beData); + } + catch (IOException e) { + BetterEnd.LOGGER.error("World data loading failed", e); + return; + } + String dataVersion = root.getString("version"); + fix = !dataVersion.equals(version); + } + else { + CompoundTag root = new CompoundTag(); + root.putString("version", version); + try { + NbtIo.write(root, beData); + } + catch (IOException e) { + BetterEnd.LOGGER.error("World data saving failed", e); + } + fix = true; + } + + if (fix) { + DataFixerUtil.fixData(beData.getParentFile()); + } + } +} diff --git a/src/main/java/ru/betterend/util/DataFixerUtil.java b/src/main/java/ru/betterend/util/DataFixerUtil.java new file mode 100644 index 00000000..99085b14 --- /dev/null +++ b/src/main/java/ru/betterend/util/DataFixerUtil.java @@ -0,0 +1,90 @@ +package ru.betterend.util; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.util.List; +import java.util.Map; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.NbtIo; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.storage.RegionFile; + +public class DataFixerUtil { + private static final Map REPLACEMENT = Maps.newHashMap(); + + public static void init() { + addFix("minecraft:stone", "minecraft:glowstone"); + } + + public static void fixData(File dir) { + List regions = getAllRegions(dir, null); + regions.forEach((file) -> { + try { + System.out.println("Fixing " + file); + boolean[] changed = new boolean[1]; + RegionFile region = new RegionFile(file, file.getParentFile(), true); + for (int x = 0; x < 32; x++) { + for (int z = 0; z < 32; z++) { + ChunkPos pos = new ChunkPos(x, z); + changed[0] = false; + if (region.hasChunk(pos)) { + DataInputStream input = region.getChunkInputStream(pos); + CompoundTag root = NbtIo.read(input); + input.close(); + ListTag sections = root.getCompound("Level").getList("Sections", 10); + sections.forEach((tag) -> { + ListTag palette = ((CompoundTag) tag).getList("Palette", 10); + palette.forEach((blockTag) -> { + CompoundTag blockTagCompound = ((CompoundTag) blockTag); + String name = blockTagCompound.getString("Name"); + String replace = REPLACEMENT.get(name); + if (replace != null) { + blockTagCompound.putString("Name", replace); + changed[0] = true; + } + }); + }); + if (changed[0]) { + System.out.println("Write!"); + DataOutputStream output = region.getChunkOutputStream(pos); + NbtIo.write(root, output); + output.close(); + } + } + } + } + region.close(); + } + catch (Exception e) { + e.printStackTrace(); + } + }); + } + + private static void addFix(String result, String... names) { + for (String name: names) { + REPLACEMENT.put(name, result); + } + } + + private static List getAllRegions(File dir, List list) { + if (list == null) { + list = Lists.newArrayList(); + } + for (File file: dir.listFiles()) { + if (file.isDirectory()) { + getAllRegions(file, list); + } + else if (file.isFile() && file.getName().endsWith(".mca")) { + list.add(file); + } + } + return list; + } +} diff --git a/src/main/resources/assets/betterend/models/item/end_stone_stalactite.json b/src/main/resources/assets/betterend/models/item/end_stone_stalactite.json new file mode 100644 index 00000000..0ea40081 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/end_stone_stalactite.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/end_stone_stalactite" + } +} diff --git a/src/main/resources/assets/betterend/models/item/end_stone_stalactite_cavemoss.json b/src/main/resources/assets/betterend/models/item/end_stone_stalactite_cavemoss.json new file mode 100644 index 00000000..642d4c00 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/end_stone_stalactite_cavemoss.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/end_stone_stalactite_cavemoss" + } +} diff --git a/src/main/resources/assets/betterend/textures/item/end_stone_stalactite.png b/src/main/resources/assets/betterend/textures/item/end_stone_stalactite.png new file mode 100644 index 0000000000000000000000000000000000000000..994dd767ca550f662be9050b2c083f14e373d9c7 GIT binary patch literal 1569 zcmbVMTZkJ~7@l-n-R)9|7HyGY#|ed9bnZ!ZGww8GlW0Oa+hrT*F23x^IcJk`Gjqn7 zNs}x>y9&h$io{Dn7JVr7QL3*Mo3$v4f-k=K;024%x?PnbtMN=OgGkldfivg!o$tT@ z=jZ31*thq=y$r+bD;9DKbdCmN^e*~8yxj$K8gmLu9>a|94@QJ}W8)yh?A|s@i~gc< zT!X|C03u~9G%bgs8D=KkbO2n%K3m2W)7H5kuUzF=6Y1QkgdrJD7FW%}nu|}a&6VKV zDoi0ReUzPPYLvjjK46aTx(<#-j_pDGRh`QO0@+1lp3M>$vk4)|LpiRn zQz=1CN+~7&D62^FlqgM!vdT-cCM7jB#ST7>N^{YQwvc;#AdBvFuIl@aCW?(lLujZ1 zaVw&nN~J_e5fz1}2;OViK4|i`7aKCO&2h3JCb%_P_+0E3N;8BB-qp z*838_fsA;t+_NyX!Q3ei;pClM~= zvN8q1@O_TJdJx3nd-OlwpKwiDM4)!(JYkTuEU6LKAc%Td4N|z5N?O76XuMj3qBx14 z9;|96+shsez#zeO4hE6Mh#MT6ckG!yZKH}Q>A!@#5A(>1-vBPoRHzqkC!<8FzZg_w z-xTrhR`%}xQn^DoZ3n?J>_c=Db~0?!_T|z(mHGAj&$P#VS|ibkW$H#^(wGvfPaemZpg*z<+& z>wCt9?#Rf6tv|Leb=O~FuAD>S#$(@%fC))@rh8-E7Y{DIF74cmZ0%YC%nP%|xN+|A znGdcf&ffdv>@KaFe(&mA-!gYkTzn0VZ3#^N;nC-IzSxXB@Y{*@fj85wPG|GOPuaOGf_Jhc3|)V}Y<<&O?=8`FvFeq@qi?tlB(Q@?!t!)DOL Ni}|_SJG0Br{t11P|IYvb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/end_stone_stalactite_cavemoss.png b/src/main/resources/assets/betterend/textures/item/end_stone_stalactite_cavemoss.png new file mode 100644 index 0000000000000000000000000000000000000000..6d3cdf8b9b9aa0371951c9fd12851edb6379d9e2 GIT binary patch literal 2103 zcmcIle{9rL94`UJfM7t449K9AAR6rT=iRks=bU%Qh8&FB=>`h!-FvThb$4xPd%GJD z6$goi5G6y6bILClTSKlhF8&F~ZLHnA%%!ODxA^A>s(+x4 zqH4Aq$quh0zDR>sE&z~~!hvGWCTNOkXe`1xFYQ{vUg*niD2bP3{hMVKZ(Al(sf zrK6UE>0ltlLO~Ykuo@6Tyei6f(IPK|IX=t@63Yu3AJQb1E*}hu<{({5#O^D{B2N(} z<9W8mafL!5P>=$alja0fRXJYdM3E&3*6lGpP-IPaR)rykUFaCLXILifGlGFrQis1IE!=G^jv}!s#u~@JYIzlOPkA8 z(XKbYn`Bh3ZCJFM?6EPIz^;{dAfDe%BF?HLW@jwVax>Od>ZpFMR%2^X2LsP?l9rXN zG^(}2LPw*1V-)(1cEdzg!M)QDRGx!lz{3$nSPfwYvI z3d$&?vmrUCvx*{zSw$97ECNAZfhj>%fK-_uvtZtDqCbDg&&Yy=qbi*S*VymN*9ar9k#dRzE957(+0`BMC_?#5l-`sw}fABBLM< zA)LY~F$@7i{~b4KWi2OeA)>kD8@gmHt=Vu%_j<~|NE=>N9%T)>Bbw(zAP@x05grr3d%7zUeEQp_8Q&z-|FG~wR6a7 z+`nB|`gX-SOWIj_MHX*=Slupk8ip>ru$TrGNx(r=Wi;t>{FL+Uor37ZG%mg zlBwA~W&Kylmwz_Sjy}}OeRp)t?-wTRy7l>Gb2r{pJG1%wdyG^2f`fvZcqjefAKaLo zA59;4W&H8{`G-E)K)Lx(A>r`5qT-#jp?{>=H0+qQi11I6uMy0$O6fAZE<(|4R+vpatzliQYfv3KmcOykIx zUYmGv${SyvKlAwOU7H`vzk6`fZ%gR?kKR0bFF3gM;l9TDAD_GQS?83Rj-yW$`;N_S zJ$BoQ&dtv(T39#x@VSIizx@4YKV{Y)J=uTmLwjNK%0o4KW*VbTez5cG)RY%L)-%HD h>X^3_eZA^3wMAMNy)f;kjsDi&GJkRGt$RD4{0qk1z3>14 literal 0 HcmV?d00001 diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index 625615ac..82e04940 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -29,6 +29,7 @@ "LivingEntityMixin", "BoneMealItemMixin", "PlayerEntityMixin", + "ServerWorldMixin", "SlimeEntityMixin", "AnvilBlockMixin", "BrewingAccessor",