Skip to content

Commit 1910ecb

Browse files
committed
Fix world upgrade for pre flattening worlds
1 parent 1123dd1 commit 1910ecb

File tree

6 files changed

+70
-74
lines changed

6 files changed

+70
-74
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* This file is part of Sponge, licensed under the MIT License (MIT).
3+
*
4+
* Copyright (c) SpongePowered <https://www.spongepowered.org>
5+
* Copyright (c) contributors
6+
*
7+
* Permission is hereby granted, free of charge, to any person obtaining a copy
8+
* of this software and associated documentation files (the "Software"), to deal
9+
* in the Software without restriction, including without limitation the rights
10+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11+
* copies of the Software, and to permit persons to whom the Software is
12+
* furnished to do so, subject to the following conditions:
13+
*
14+
* The above copyright notice and this permission notice shall be included in
15+
* all copies or substantial portions of the Software.
16+
*
17+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23+
* THE SOFTWARE.
24+
*/
25+
package org.spongepowered.common.bridge.world.level.storage;
26+
27+
import net.minecraft.resources.ResourceLocation;
28+
import org.checkerframework.checker.nullness.qual.Nullable;
29+
30+
public interface DimensionDataStorageBridge {
31+
32+
void bridge$dimensionKey(@Nullable ResourceLocation dimensionKey);
33+
34+
@Nullable ResourceLocation bridge$dimensionKey();
35+
}

src/main/java/org/spongepowered/common/hooks/PlatformHooks.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ public final class PlatformHooks {
5151
private DimensionHooks dimensionHooks = new DimensionHooks() {};
5252
private EventHooks eventHooks = new EventHooks() {};
5353
private GeneralHooks generalHooks = new GeneralHooks() {};
54-
private WorldGenerationHooks worldGenerationHooks = new WorldGenerationHooks() {};
5554
private InventoryHooks inventoryHooks = new InventoryHooks() {};
5655
private WorldHooks worldHooks = new WorldHooks() {};
5756
private ItemHooks itemHooks = new ItemHooks() {};
@@ -82,14 +81,6 @@ public void setGeneralHooks(final GeneralHooks generalHooks) {
8281
this.generalHooks = Objects.requireNonNull(generalHooks);
8382
}
8483

85-
public WorldGenerationHooks getWorldGenerationHooks() {
86-
return this.worldGenerationHooks;
87-
}
88-
89-
public void setWorldGenerationHooks(final WorldGenerationHooks worldGenerationHooks) {
90-
this.worldGenerationHooks = Objects.requireNonNull(worldGenerationHooks);
91-
}
92-
9384
public InventoryHooks getInventoryHooks() {
9485
return this.inventoryHooks;
9586
}

src/main/java/org/spongepowered/common/hooks/WorldGenerationHooks.java

Lines changed: 0 additions & 54 deletions
This file was deleted.

src/mixins/java/org/spongepowered/common/mixin/core/server/level/ServerLevelMixin.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
import net.minecraft.world.level.entity.PersistentEntitySectionManager;
6060
import net.minecraft.world.level.gameevent.GameEvent;
6161
import net.minecraft.world.level.material.Fluid;
62+
import net.minecraft.world.level.storage.DimensionDataStorage;
6263
import net.minecraft.world.level.storage.LevelData;
6364
import net.minecraft.world.level.storage.LevelStorageSource;
6465
import net.minecraft.world.level.storage.ServerLevelData;
@@ -104,6 +105,7 @@
104105
import org.spongepowered.common.bridge.world.level.border.WorldBorderBridge;
105106
import org.spongepowered.common.bridge.world.level.chunk.LevelChunkBridge;
106107
import org.spongepowered.common.bridge.world.level.dimension.DimensionTypeBridge;
108+
import org.spongepowered.common.bridge.world.level.storage.DimensionDataStorageBridge;
107109
import org.spongepowered.common.bridge.world.level.storage.ServerLevelDataBridge;
108110
import org.spongepowered.common.bridge.world.ticks.LevelTicksBridge;
109111
import org.spongepowered.common.config.SpongeGameConfigs;
@@ -141,7 +143,7 @@ public abstract class ServerLevelMixin extends LevelMixin implements ServerLevel
141143

142144
@Shadow public abstract void levelEvent(@Nullable Player $$0, int $$1, BlockPos $$2, int $$3);
143145
@Shadow @Nullable private EndDragonFight dragonFight;
144-
146+
@Shadow public abstract DimensionDataStorage shadow$getDataStorage();
145147
// @formatter:on
146148

147149

@@ -227,6 +229,9 @@ public abstract class ServerLevelMixin extends LevelMixin implements ServerLevel
227229

228230
super.bridge$adjustDimensionLogic(dimensionType);
229231

232+
((DimensionDataStorageBridge) this.shadow$getDataStorage()).bridge$dimensionKey(
233+
this.registryAccess().registryOrThrow(Registries.DIMENSION_TYPE).getKey(dimensionType));
234+
230235
// TODO Minecraft 1.16.2 - Rebuild level stems, get generator from type, set generator
231236
// TODO ...or cache generator on type?
232237

src/mixins/java/org/spongepowered/common/mixin/core/world/level/levelgen/structure/LegacyStructureDataHandlerMixin.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,24 +24,26 @@
2424
*/
2525
package org.spongepowered.common.mixin.core.world.level.levelgen.structure;
2626

27+
import net.minecraft.core.registries.Registries;
2728
import net.minecraft.resources.ResourceKey;
2829
import net.minecraft.world.level.Level;
2930
import net.minecraft.world.level.levelgen.structure.LegacyStructureDataHandler;
3031
import net.minecraft.world.level.storage.DimensionDataStorage;
3132
import org.checkerframework.checker.nullness.qual.Nullable;
3233
import org.spongepowered.asm.mixin.Mixin;
33-
import org.spongepowered.asm.mixin.Overwrite;
34-
import org.spongepowered.common.hooks.PlatformHooks;
34+
import org.spongepowered.asm.mixin.injection.At;
35+
import org.spongepowered.asm.mixin.injection.ModifyVariable;
36+
import org.spongepowered.common.bridge.world.level.storage.DimensionDataStorageBridge;
37+
38+
import java.util.Optional;
3539

3640
@Mixin(LegacyStructureDataHandler.class)
3741
public abstract class LegacyStructureDataHandlerMixin {
3842

39-
/**
40-
* @author zidane - November, 26th 2020 - Minecraft 1.15.2
41-
* @reason Allow the platform to determine how to create the legacy structure data updater
42-
*/
43-
@Overwrite
44-
public static LegacyStructureDataHandler getLegacyStructureHandler(final ResourceKey<Level> dimension, final @Nullable DimensionDataStorage savedData) {
45-
return PlatformHooks.INSTANCE.getWorldGenerationHooks().createLegacyStructureDataUtil(dimension, savedData);
43+
@ModifyVariable(method = "getLegacyStructureHandler", at = @At("HEAD"), argsOnly = true)
44+
private static ResourceKey<Level> impl$fixupLevelDimension(final ResourceKey<Level> dimension, final ResourceKey<Level> $$0, final @Nullable DimensionDataStorage $$1) {
45+
return Optional.ofNullable(((DimensionDataStorageBridge) $$1).bridge$dimensionKey())
46+
.map(k -> ResourceKey.create(Registries.DIMENSION, k))
47+
.orElse(dimension);
4648
}
4749
}

src/mixins/java/org/spongepowered/common/mixin/core/world/level/storage/DimensionDataStorageMixin.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,29 @@
2626

2727
import net.minecraft.core.HolderLookup;
2828
import net.minecraft.nbt.CompoundTag;
29+
import net.minecraft.resources.ResourceLocation;
2930
import net.minecraft.util.datafix.DataFixTypes;
3031
import net.minecraft.world.level.saveddata.SavedData;
3132
import net.minecraft.world.level.storage.DimensionDataStorage;
33+
import org.checkerframework.checker.nullness.qual.Nullable;
3234
import org.spongepowered.asm.mixin.Mixin;
3335
import org.spongepowered.asm.mixin.injection.At;
3436
import org.spongepowered.asm.mixin.injection.Inject;
3537
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
3638
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
3739
import org.spongepowered.common.bridge.data.DataCompoundHolder;
40+
import org.spongepowered.common.bridge.world.level.storage.DimensionDataStorageBridge;
3841
import org.spongepowered.common.data.DataUtil;
3942

4043
import java.io.File;
4144
import java.util.function.BiFunction;
4245

4346
@Mixin(DimensionDataStorage.class)
44-
public abstract class DimensionDataStorageMixin {
47+
public abstract class DimensionDataStorageMixin implements DimensionDataStorageBridge {
48+
49+
// @formatter:off
50+
private @Nullable ResourceLocation impl$dimensionKey;
51+
// @formatter:on
4552

4653
@Inject(method = "readSavedData", at = @At(value = "RETURN", ordinal = 0), locals = LocalCapture.CAPTURE_FAILHARD)
4754
public void readSpongeMapData(BiFunction<CompoundTag, HolderLookup.Provider, SavedData> var1, DataFixTypes $$1, String var2,
@@ -54,4 +61,14 @@ public void readSpongeMapData(BiFunction<CompoundTag, HolderLookup.Provider, Sav
5461
((DataCompoundHolder) savedData).data$setCompound(null);
5562
}
5663
}
64+
65+
@Override
66+
public void bridge$dimensionKey(final @Nullable ResourceLocation dimensionKey) {
67+
this.impl$dimensionKey = dimensionKey;
68+
}
69+
70+
@Override
71+
public @Nullable ResourceLocation bridge$dimensionKey() {
72+
return this.impl$dimensionKey;
73+
}
5774
}

0 commit comments

Comments
 (0)