diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java index 5a1beb340..391e31b4e 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java @@ -136,8 +136,8 @@ public class FabricChunkGeneratorWrapper extends net.minecraft.world.gen.chunk.C return CompletableFuture.supplyAsync(() -> { ProtoWorld world = (ProtoWorld) ((StructureAccessorAccessor) structureAccessor).getWorld(); BiomeProvider biomeProvider; - if(chunk instanceof net.minecraft.world.chunk.ProtoChunk) { - biomeProvider = ((BiomeProviderHolder) chunk).getBiomeProvider(); + if(chunk instanceof BiomeProviderHolder providerHolder) { + biomeProvider = providerHolder.getBiomeProvider(); if(biomeProvider == null) { biomeProvider = pack.getBiomeProvider().caching(world); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/cache/ChunkRegionMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/cache/ChunkRegionMixin.java new file mode 100644 index 000000000..b24dfbf6b --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/cache/ChunkRegionMixin.java @@ -0,0 +1,48 @@ +package com.dfsek.terra.fabric.mixin.cache; + +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.chunk.Chunk; +import com.dfsek.terra.fabric.generation.BiomeProviderHolder; + +import net.minecraft.server.world.ServerWorld; +import net.minecraft.world.ChunkRegion; +import net.minecraft.world.chunk.ChunkStatus; +import net.minecraft.world.chunk.ProtoChunk; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +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; + +import java.util.List; + + +@Mixin(ChunkRegion.class) +@Implements(@Interface(iface = BiomeProviderHolder.class, prefix = "provider$")) +public class ChunkRegionMixin { + @Shadow + @Final + private net.minecraft.world.chunk.Chunk centerPos; + private BiomeProvider biomeProvider; + + @Inject(method = "", at = @At("RETURN")) + public void addProvider(ServerWorld world, List chunks, ChunkStatus status, int placementRadius, CallbackInfo ci) { + if(centerPos instanceof BiomeProviderHolder providerHolder) { + biomeProvider = providerHolder.getBiomeProvider(); + } + } + + public void provider$setBiomeProvider(BiomeProvider provider) { + if(this.biomeProvider != null) { + throw new IllegalStateException("Already set biome provider for chunk " + this); + } + this.biomeProvider = provider; + } + + public BiomeProvider provider$getBiomeProvider() { + return biomeProvider; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/cache/ProtoChunkMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/cache/ProtoChunkMixin.java new file mode 100644 index 000000000..6818d353f --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/cache/ProtoChunkMixin.java @@ -0,0 +1,27 @@ +package com.dfsek.terra.fabric.mixin.cache; + +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.fabric.generation.BiomeProviderHolder; + +import net.minecraft.world.chunk.ProtoChunk; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; + + +@Mixin(ProtoChunk.class) +@Implements(@Interface(iface = BiomeProviderHolder.class, prefix = "provider$")) +public class ProtoChunkMixin { + private BiomeProvider biomeProvider; + + public void provider$setBiomeProvider(BiomeProvider provider) { + if(this.biomeProvider != null) { + throw new IllegalStateException("Already set biome provider for chunk " + this); + } + this.biomeProvider = provider; + } + + public BiomeProvider provider$getBiomeProvider() { + return biomeProvider; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/data/ProtoChunkMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/data/ProtoChunkMixin.java index a77681b2d..a65a4f4d8 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/data/ProtoChunkMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/data/ProtoChunkMixin.java @@ -32,10 +32,7 @@ import org.spongepowered.asm.mixin.Shadow; @Mixin(net.minecraft.world.chunk.ProtoChunk.class) -@Implements(value = { - @Interface(iface = ProtoChunk.class, prefix = "terra$"), - @Interface(iface = BiomeProviderHolder.class, prefix = "provider$") -}) +@Implements(@Interface(iface = ProtoChunk.class, prefix = "terra$")) public abstract class ProtoChunkMixin { @Shadow public abstract net.minecraft.block.BlockState getBlockState(BlockPos pos); @@ -43,8 +40,6 @@ public abstract class ProtoChunkMixin { @Shadow public abstract HeightLimitView getHeightLimitView(); - private BiomeProvider biomeProvider; - public void terra$setBlock(int x, int y, int z, @NotNull BlockState blockState) { ((net.minecraft.world.chunk.Chunk) (Object) this).setBlockState(new BlockPos(x, y, z), (net.minecraft.block.BlockState) blockState, false); @@ -57,15 +52,4 @@ public abstract class ProtoChunkMixin { public int terra$getMaxHeight() { return getHeightLimitView().getTopY(); } - - public void provider$setBiomeProvider(BiomeProvider provider) { - if(this.biomeProvider != null) { - throw new IllegalStateException("Already set biome provider for chunk " + this); - } - this.biomeProvider = provider; - } - - public BiomeProvider provider$getBiomeProvider() { - return biomeProvider; - } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java index b849f700a..7b1562d59 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java @@ -28,6 +28,7 @@ import com.dfsek.terra.api.world.ServerWorld; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator; import com.dfsek.terra.api.world.chunk.generation.ProtoWorld; +import com.dfsek.terra.fabric.generation.BiomeProviderHolder; import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; import com.dfsek.terra.fabric.generation.TerraBiomeSource; import com.dfsek.terra.fabric.util.FabricUtil; @@ -130,6 +131,10 @@ public abstract class ChunkRegionMixin { } public BiomeProvider terraWorld$getBiomeProvider() { + BiomeProvider provider = ((BiomeProviderHolder) this).getBiomeProvider(); + if(provider != null) { + return provider; + } return caching.value(); } diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index 778f06889..9fb0d4ea2 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -1,51 +1,53 @@ { - "required": true, - "minVersion": "0.8", - "package": "com.dfsek.terra.fabric.mixin", - "compatibilityLevel": "JAVA_17", - "mixins": [ - "ReloadCommandMixin", - "access.MobSpawnerLogicAccessor", - "access.StateAccessor", - "access.StructureAccessorAccessor", - "compat.GenerationSettingsFloraFeaturesMixin", - "implementations.BiomeMixin", - "implementations.HandleImplementationMixin", - "implementations.block.BlockMixin", - "implementations.block.entity.BlockEntityMixin", - "implementations.block.entity.LootableContainerBlockEntityMixin", - "implementations.block.entity.MobSpawnerBlockEntityMixin", - "implementations.block.entity.SignBlockEntityMixin", - "implementations.block.state.BlockStateMixin", - "implementations.block.state.PropertyMixin", - "implementations.chunk.ChunkRegionMixin", - "implementations.chunk.WorldChunkMixin", - "implementations.chunk.data.ProtoChunkMixin", - "implementations.entity.EntityMixin", - "implementations.entity.EntityTypeMixin", - "implementations.entity.PlayerEntityMixin", - "implementations.entity.ServerCommandSourceMixin", - "implementations.inventory.LockableContainerBlockEntityMixin", - "implementations.inventory.item.ItemMixin", - "implementations.inventory.item.ItemStackMixin", - "implementations.inventory.meta.EnchantmentMixin", - "implementations.inventory.meta.ItemStackDamageableMixin", - "implementations.inventory.meta.ItemStackMetaMixin", - "implementations.world.ChunkRegionMixin", - "implementations.world.ServerWorldMixin", - "lifecycle.DataPackContentsMixin", - "lifecycle.MinecraftServerMixin", - "lifecycle.NoiseConfigMixin", - "lifecycle.RegistryMixin" - ], - "client": [ - "lifecycle.client.MinecraftClientMixin" - ], - "server": [ - "lifecycle.server.ServerMainMixin" - ], - "injectors": { - "defaultRequire": 1 - }, - "refmap": "terra-refmap.json" + "required": true, + "minVersion": "0.8", + "package": "com.dfsek.terra.fabric.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [ + "ReloadCommandMixin", + "access.MobSpawnerLogicAccessor", + "access.StateAccessor", + "access.StructureAccessorAccessor", + "cache.ChunkRegionMixin", + "cache.ProtoChunkMixin", + "compat.GenerationSettingsFloraFeaturesMixin", + "implementations.BiomeMixin", + "implementations.HandleImplementationMixin", + "implementations.block.BlockMixin", + "implementations.block.entity.BlockEntityMixin", + "implementations.block.entity.LootableContainerBlockEntityMixin", + "implementations.block.entity.MobSpawnerBlockEntityMixin", + "implementations.block.entity.SignBlockEntityMixin", + "implementations.block.state.BlockStateMixin", + "implementations.block.state.PropertyMixin", + "implementations.chunk.ChunkRegionMixin", + "implementations.chunk.WorldChunkMixin", + "implementations.chunk.data.ProtoChunkMixin", + "implementations.entity.EntityMixin", + "implementations.entity.EntityTypeMixin", + "implementations.entity.PlayerEntityMixin", + "implementations.entity.ServerCommandSourceMixin", + "implementations.inventory.LockableContainerBlockEntityMixin", + "implementations.inventory.item.ItemMixin", + "implementations.inventory.item.ItemStackMixin", + "implementations.inventory.meta.EnchantmentMixin", + "implementations.inventory.meta.ItemStackDamageableMixin", + "implementations.inventory.meta.ItemStackMetaMixin", + "implementations.world.ChunkRegionMixin", + "implementations.world.ServerWorldMixin", + "lifecycle.DataPackContentsMixin", + "lifecycle.MinecraftServerMixin", + "lifecycle.NoiseConfigMixin", + "lifecycle.RegistryMixin" + ], + "client": [ + "lifecycle.client.MinecraftClientMixin" + ], + "server": [ + "lifecycle.server.ServerMainMixin" + ], + "injectors": { + "defaultRequire": 1 + }, + "refmap": "terra-refmap.json" } \ No newline at end of file