diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/storage/SaveFormatBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/storage/SaveFormatBridge.java index 13a239c0..2427a2e1 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/storage/SaveFormatBridge.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/storage/SaveFormatBridge.java @@ -9,4 +9,9 @@ import java.io.IOException; public interface SaveFormatBridge { SaveFormat.LevelSave bridge$getLevelSave(String saveName, RegistryKey world) throws IOException; + + interface LevelSaveBridge { + + void bridge$setDimType(RegistryKey typeKey); + } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java index dfa0dd3d..7969d0ef 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java @@ -71,6 +71,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import javax.annotation.Nullable; import java.io.File; @@ -415,6 +416,7 @@ public abstract class MinecraftServerMixin extends RecursiveEventLoop cir, boolean flag) { + cir.setReturnValue(flag); + } + /** * @author IzzelAliz * @reason our branding, no one should fuck this up diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ServerWorldMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ServerWorldMixin.java index 18ac1873..b4a23d9c 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ServerWorldMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ServerWorldMixin.java @@ -216,10 +216,17 @@ public abstract class ServerWorldMixin extends WorldMixin implements ServerWorld } @Inject(method = "save", at = @At(value = "JUMP", ordinal = 0, opcode = Opcodes.IFNULL)) - public void arclight$worldSave(IProgressUpdate progress, boolean flush, boolean skipSave, CallbackInfo ci) { + private void arclight$worldSaveEvent(IProgressUpdate progress, boolean flush, boolean skipSave, CallbackInfo ci) { Bukkit.getPluginManager().callEvent(new WorldSaveEvent(bridge$getWorld())); } + @Inject(method = "save", at = @At("RETURN")) + private void arclight$saveLevelDat(IProgressUpdate progress, boolean flush, boolean skipSave, CallbackInfo ci) { + this.$$worldDataServer.setWorldBorderSerializer(this.getWorldBorder().getSerializer()); + this.$$worldDataServer.setCustomBossEventData(this.shadow$getServer().getCustomBossEvents().write()); + this.convertable.saveLevel(this.shadow$getServer().field_240767_f_, this.$$worldDataServer, this.shadow$getServer().getPlayerList().getHostPlayerData()); + } + @Inject(method = "onChunkUnloading", at = @At("HEAD")) public void arclight$closeOnChunkUnloading(Chunk chunkIn, CallbackInfo ci) { for (TileEntity tileentity : chunkIn.getTileEntityMap().values()) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/SaveFormatMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/SaveFormatMixin.java index d4a93801..7a5e301f 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/SaveFormatMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/SaveFormatMixin.java @@ -17,7 +17,9 @@ public abstract class SaveFormatMixin implements SaveFormatBridge { // @formatter:on public SaveFormat.LevelSave getLevelSave(String saveName, RegistryKey world) throws IOException { - return getLevelSave(saveName); + SaveFormat.LevelSave save = getLevelSave(saveName); + ((LevelSaveBridge) save).bridge$setDimType(world); + return save; } // mock diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/SaveFormat_LevelSaveMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/SaveFormat_LevelSaveMixin.java new file mode 100644 index 00000000..2923ba3f --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/SaveFormat_LevelSaveMixin.java @@ -0,0 +1,40 @@ +package io.izzel.arclight.common.mixin.core.world.storage; + +import io.izzel.arclight.common.bridge.world.storage.SaveFormatBridge; +import net.minecraft.util.RegistryKey; +import net.minecraft.world.Dimension; +import net.minecraft.world.World; +import net.minecraft.world.storage.SaveFormat; +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.callback.CallbackInfoReturnable; + +import java.io.File; +import java.nio.file.Path; + +@Mixin(SaveFormat.LevelSave.class) +public class SaveFormat_LevelSaveMixin implements SaveFormatBridge.LevelSaveBridge { + + @Shadow @Final public Path saveDir; + + private RegistryKey dimensionType; + + @Override + public void bridge$setDimType(RegistryKey typeKey) { + this.dimensionType = typeKey; + } + + @Inject(method = "getDimensionFolder", cancellable = true, at = @At("HEAD")) + private void arclight$useActualType(RegistryKey dimensionKey, CallbackInfoReturnable cir) { + if (dimensionType == Dimension.OVERWORLD) { + cir.setReturnValue(this.saveDir.toFile()); + } else if (dimensionType == Dimension.THE_NETHER) { + cir.setReturnValue(new File(this.saveDir.toFile(), "DIM-1")); + } else if (dimensionType == Dimension.THE_END) { + cir.setReturnValue(new File(this.saveDir.toFile(), "DIM1")); + } + } +} diff --git a/arclight-common/src/main/resources/mixins.arclight.core.json b/arclight-common/src/main/resources/mixins.arclight.core.json index 6bb879b9..169eccd4 100644 --- a/arclight-common/src/main/resources/mixins.arclight.core.json +++ b/arclight-common/src/main/resources/mixins.arclight.core.json @@ -432,6 +432,7 @@ "world.storage.MapData_MapInfoMixin", "world.storage.MapDataMixin", "world.storage.PlayerDataMixin", + "world.storage.SaveFormat_LevelSaveMixin", "world.storage.SaveFormatMixin", "world.storage.ServerWorldInfoMixin" ]