Data Fixer (WIP)

This commit is contained in:
paulevsGitch 2021-03-13 05:08:17 +03:00
parent a3a6b54eba
commit a2605ef3f9
8 changed files with 174 additions and 0 deletions

View file

@ -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 = "<init>*", at = @At("TAIL"))
private void be_onServerWorldInit(MinecraftServer server, Executor workerExecutor, LevelStorage.Session session, ServerWorldProperties properties, RegistryKey<World> registryKey, DimensionType dimensionType, WorldGenerationProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List<Spawner> 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());
}
}
}