diff --git a/src/main/java/ru/bclib/mixin/common/MinecraftServerMixin.java b/src/main/java/ru/bclib/mixin/common/MinecraftServerMixin.java index d5876718..9cd8378b 100644 --- a/src/main/java/ru/bclib/mixin/common/MinecraftServerMixin.java +++ b/src/main/java/ru/bclib/mixin/common/MinecraftServerMixin.java @@ -5,18 +5,25 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.server.MinecraftServer; import net.minecraft.server.ServerResources; import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.progress.ChunkProgressListener; import net.minecraft.world.level.Level; +import net.minecraft.world.level.storage.LevelResource; +import net.minecraft.world.level.storage.LevelStorageSource; import net.minecraft.world.level.storage.WorldData; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.bclib.api.BiomeAPI; +import ru.bclib.api.WorldDataAPI; +import ru.bclib.api.datafixer.DataFixerAPI; import ru.bclib.recipes.BCLRecipeManager; +import java.io.File; import java.util.Collection; import java.util.Map; import java.util.concurrent.CompletableFuture; @@ -33,7 +40,15 @@ public class MinecraftServerMixin { @Final @Shadow protected WorldData worldData; - + + @Inject(method="convertFromRegionFormatIfNeeded", at = @At("HEAD")) + private static void bclib_applyPatches(LevelStorageSource.LevelStorageAccess session, CallbackInfo ci){ + File levelPath = session.getLevelPath(LevelResource.ROOT).toFile(); + WorldDataAPI.load(new File(levelPath, "data")); + DataFixerAPI.fixData(levelPath); + } + + @Inject(method = "reloadResources", at = @At(value = "RETURN"), cancellable = true) private void bclib_reloadResources(Collection collection, CallbackInfoReturnable> info) { bclib_injectRecipes(); diff --git a/src/main/java/ru/bclib/mixin/common/ServerLevelMixin.java b/src/main/java/ru/bclib/mixin/common/ServerLevelMixin.java index dc76f988..285fda1e 100644 --- a/src/main/java/ru/bclib/mixin/common/ServerLevelMixin.java +++ b/src/main/java/ru/bclib/mixin/common/ServerLevelMixin.java @@ -15,6 +15,7 @@ import net.minecraft.world.level.storage.WritableLevelData; 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.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.bclib.api.BiomeAPI; import ru.bclib.api.WorldDataAPI; @@ -32,19 +33,8 @@ public abstract class ServerLevelMixin extends Level { protected ServerLevelMixin(WritableLevelData writableLevelData, ResourceKey resourceKey, DimensionType dimensionType, Supplier supplier, boolean bl, boolean bl2, long l) { super(writableLevelData, resourceKey, dimensionType, supplier, bl, bl2, l); } - @Inject(method = "*", at = @At("HEAD")) - private void bclib_onServerWorldInitStart(MinecraftServer server, Executor workerExecutor, LevelStorageSource.LevelStorageAccess session, ServerLevelData properties, ResourceKey registryKey, DimensionType dimensionType, ChunkProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List list, boolean bl, CallbackInfo info) { - ServerLevel world = ServerLevel.class.cast(this); - File dir = session.getDimensionPath(world.dimension()); - if (!new File(dir, "level.dat").exists()) { - dir = dir.getParentFile(); - } - WorldDataAPI.load(new File(dir, "data")); - DataFixerAPI.fixData(dir); - } - - @Inject(method = "*", at = @At("TAIL")) + @Inject(method = "*", at = @At("TAIL")) private void bclib_onServerWorldInit(MinecraftServer server, Executor workerExecutor, LevelStorageSource.LevelStorageAccess session, ServerLevelData properties, ResourceKey registryKey, DimensionType dimensionType, ChunkProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List list, boolean bl, CallbackInfo info) { BiomeAPI.initRegistry(server);