diff --git a/station-worldgen-api-v0/build.gradle.kts b/station-worldgen-api-v0/build.gradle.kts index 341adeead..6890c6b9c 100644 --- a/station-worldgen-api-v0/build.gradle.kts +++ b/station-worldgen-api-v0/build.gradle.kts @@ -10,5 +10,6 @@ addModuleDependencies(project, "station-flattening-v0", "station-nbt-v0", "station-biome-events-v0", - "station-blocks-v0" + "station-blocks-v0", + "station-dimensions-v0" ) \ No newline at end of file diff --git a/station-worldgen-api-v0/src/main/java/net/modificationstation/stationapi/api/event/worldgen/biome/BiomeModificationEvent.java b/station-worldgen-api-v0/src/main/java/net/modificationstation/stationapi/api/event/worldgen/biome/BiomeModificationEvent.java index cbd8cca9f..62cc5d462 100644 --- a/station-worldgen-api-v0/src/main/java/net/modificationstation/stationapi/api/event/worldgen/biome/BiomeModificationEvent.java +++ b/station-worldgen-api-v0/src/main/java/net/modificationstation/stationapi/api/event/worldgen/biome/BiomeModificationEvent.java @@ -5,8 +5,17 @@ import net.mine_diver.unsafeevents.event.EventPhases; import net.minecraft.world.World; import net.minecraft.world.biome.Biome; +import net.minecraft.world.dimension.Dimension; import net.modificationstation.stationapi.api.StationAPI; +/** + * A general event for modifying biomes in a dimension. + *

+ * BE AWARE THAT BIOME OBJECTS MAY BE SHARED BETWEEN DIMENSIONS. + *
+ * TRACK THIS YOURSELF TO AVOID DUPLICATE MODIFICATIONS.
+ * @see it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap + */ @SuperBuilder @EventPhases(StationAPI.INTERNAL_PHASE) public class BiomeModificationEvent extends Event { diff --git a/station-worldgen-api-v0/src/main/java/net/modificationstation/stationapi/api/worldgen/BiomeAPI.java b/station-worldgen-api-v0/src/main/java/net/modificationstation/stationapi/api/worldgen/BiomeAPI.java index 1aff62885..bfc89c24e 100644 --- a/station-worldgen-api-v0/src/main/java/net/modificationstation/stationapi/api/worldgen/BiomeAPI.java +++ b/station-worldgen-api-v0/src/main/java/net/modificationstation/stationapi/api/worldgen/BiomeAPI.java @@ -5,8 +5,10 @@ import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; import net.minecraft.world.World; import net.minecraft.world.biome.Biome; +import net.minecraft.world.dimension.Dimension; import net.modificationstation.stationapi.api.StationAPI; import net.modificationstation.stationapi.api.event.worldgen.biome.BiomeModificationEvent; +import net.modificationstation.stationapi.api.registry.DimensionRegistry; import net.modificationstation.stationapi.api.util.Identifier; import net.modificationstation.stationapi.api.worldgen.biome.BiomeProvider; import net.modificationstation.stationapi.api.worldgen.biome.BiomeRegionsProvider; @@ -19,7 +21,7 @@ public class BiomeAPI { private static Map overworldProviders = new Reference2ObjectOpenHashMap<>(16); private static Map netherProviders = new Reference2ObjectOpenHashMap<>(16); - private static final Object2BooleanMap MODIFICATIONS_APPLIED = new Object2BooleanOpenHashMap<>(16); + private static final Object2BooleanMap MODIFICATIONS_APPLIED = new Object2BooleanOpenHashMap<>(16); private static BiomeRegionsProvider overworldProvider; private static BiomeRegionsProvider netherProvider; @@ -127,9 +129,12 @@ public static void init(World world, long seed) { overworldProvider.setSeed(seed); netherProvider.setSeed(seed); - - if (!MODIFICATIONS_APPLIED.getBoolean(world)) { - MODIFICATIONS_APPLIED.put(world, true); + } + + public static void modifyBiomes(World world) { + Identifier dimId = DimensionRegistry.INSTANCE.getIdByLegacyId(world.dimension.id).orElseThrow(); + if (!MODIFICATIONS_APPLIED.getBoolean(dimId)) { + MODIFICATIONS_APPLIED.put(dimId, true); // World objects have the same hash, somehow, plus dimensions are the thing that control biomes world.dimension.getBiomes().forEach(biome -> { StationAPI.EVENT_BUS.post(BiomeModificationEvent.builder().biome(biome).world(world).build()); }); diff --git a/station-worldgen-api-v0/src/main/java/net/modificationstation/stationapi/mixin/worldgen/DimensionMixin.java b/station-worldgen-api-v0/src/main/java/net/modificationstation/stationapi/mixin/worldgen/DimensionMixin.java new file mode 100644 index 000000000..ad3d07f11 --- /dev/null +++ b/station-worldgen-api-v0/src/main/java/net/modificationstation/stationapi/mixin/worldgen/DimensionMixin.java @@ -0,0 +1,21 @@ +package net.modificationstation.stationapi.mixin.worldgen; + +import net.minecraft.world.World; +import net.minecraft.world.dimension.Dimension; +import net.modificationstation.stationapi.api.worldgen.BiomeAPI; +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.CallbackInfo; + +@Mixin(Dimension.class) +public class DimensionMixin { + @Shadow + public World world; + + @Inject(method = "setWorld", at = @At(value = "RETURN")) + private void modifyBiomes(CallbackInfo ci) { + BiomeAPI.modifyBiomes(world); + } +} diff --git a/station-worldgen-api-v0/src/main/resources/station-worldgen-api-v0.mixins.json b/station-worldgen-api-v0/src/main/resources/station-worldgen-api-v0.mixins.json index 6bcfbf4f8..2145db785 100644 --- a/station-worldgen-api-v0/src/main/resources/station-worldgen-api-v0.mixins.json +++ b/station-worldgen-api-v0/src/main/resources/station-worldgen-api-v0.mixins.json @@ -6,6 +6,7 @@ "mixins": [ "BiomeMixin", "BiomeSourceMixin", + "DimensionMixin", "NetherDimensionMixin", "NetherWorldSourceMixin", "OverworldDimensionMixin",