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",