Skip to content

Commit

Permalink
Avoid running biome generator on client in singleplayer
Browse files Browse the repository at this point in the history
  • Loading branch information
embeddedt committed Dec 6, 2023
1 parent 37ad7fa commit 0206f7d
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/main/java/com/gtnewhorizons/angelica/mixins/Mixins.java
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ public enum Mixins {
.setPhase(Phase.EARLY).setApplyIf(() -> AngelicaConfig.enableSodium).addMixinClasses(
"sodium.MixinChunkProviderClient"
,"sodium.MixinBlock"
,"sodium.MixinChunk"
,"sodium.MixinChunkProviderServer"
,"sodium.MixinEntity"
,"sodium.MixinRenderManager"
,"sodium.MixinExtendedBlockStorage"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.gtnewhorizons.angelica.mixins.early.sodium;

import net.minecraft.client.Minecraft;
import net.minecraft.world.World;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraft.world.biome.WorldChunkManager;
import net.minecraft.world.chunk.Chunk;
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.CallbackInfo;

@Mixin(Chunk.class)
public abstract class MixinChunk {
@Shadow
public World worldObj;

@Shadow
private byte[] blockBiomeArray;

@Shadow
@Final
public int xPosition, zPosition;

@Inject(method = "fillChunk", at = @At("RETURN"))
private void sodium$populateBiomes(CallbackInfo ci) {
if(this.worldObj.isRemote && !Minecraft.getMinecraft().isSingleplayer()) {
// We are in multiplayer, the server might not have sent all biomes to the client.
// Populate them now while we're on the main thread.
WorldChunkManager manager = this.worldObj.getWorldChunkManager();
for(int z = 0; z < 16; z++) {
for(int x = 0; x < 16; x++) {
int idx = (z << 4) + x;
int biome = this.blockBiomeArray[idx] & 255;
if(biome == 255) {
BiomeGenBase generated = manager.getBiomeGenAt((this.xPosition << 4) + x, (this.zPosition << 4) + z);
this.blockBiomeArray[idx] = (byte)(generated.biomeID & 255);
}
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.gtnewhorizons.angelica.mixins.early.sodium;

import net.minecraft.world.biome.WorldChunkManager;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.IChunkProvider;
import net.minecraft.world.gen.ChunkProviderServer;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;

@Mixin(ChunkProviderServer.class)
public class MixinChunkProviderServer {
@Redirect(method = "originalLoadChunk", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/chunk/IChunkProvider;provideChunk(II)Lnet/minecraft/world/chunk/Chunk;", remap = true), remap = false)
private Chunk sodium$populateChunkWithBiomes(IChunkProvider instance, int chunkX, int chunkZ) {
Chunk chunk = instance.provideChunk(chunkX, chunkZ);
if(chunk != null) {
WorldChunkManager manager = chunk.worldObj.getWorldChunkManager();
for(int z = 0; z < 16; z++) {
for(int x = 0; x < 16; x++) {
chunk.getBiomeGenForWorldCoords(x, z, manager);
}
}
}
return chunk;
}
}

0 comments on commit 0206f7d

Please sign in to comment.