From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: NONPLAYT <76615486+NONPLAYT@users.noreply.github.com> Date: Sat, 13 Jan 2024 19:19:16 +0300 Subject: [PATCH] Carpet-Fixes: getBiome Optimize diff --git a/src/main/java/net/minecraft/world/level/biome/BiomeManager.java b/src/main/java/net/minecraft/world/level/biome/BiomeManager.java index 01352cc83b25eb0e30b7e0ff521fc7c1b3d5155b..c042287e12b5ce814afe8557e4dfa8e8b16b0f5a 100644 --- a/src/main/java/net/minecraft/world/level/biome/BiomeManager.java +++ b/src/main/java/net/minecraft/world/level/biome/BiomeManager.java @@ -14,6 +14,7 @@ public class BiomeManager { private static final int ZOOM_MASK = 3; private final BiomeManager.NoiseBiomeSource noiseBiomeSource; private final long biomeZoomSeed; + private static final double maxOffset = 0.4500000001D; // DivineMC - Carpet-Fixes: getBiome Optimize public BiomeManager(BiomeManager.NoiseBiomeSource storage, long seed) { this.noiseBiomeSource = storage; @@ -29,39 +30,103 @@ public class BiomeManager { } public Holder getBiome(BlockPos pos) { - int i = pos.getX() - 2; - int j = pos.getY() - 2; - int k = pos.getZ() - 2; - int l = i >> 2; - int m = j >> 2; - int n = k >> 2; - double d = (double)(i & 3) / 4.0; - double e = (double)(j & 3) / 4.0; - double f = (double)(k & 3) / 4.0; - int o = 0; - double g = Double.POSITIVE_INFINITY; - - for (int p = 0; p < 8; p++) { - boolean bl = (p & 4) == 0; - boolean bl2 = (p & 2) == 0; - boolean bl3 = (p & 1) == 0; - int q = bl ? l : l + 1; - int r = bl2 ? m : m + 1; - int s = bl3 ? n : n + 1; - double h = bl ? d : d - 1.0; - double t = bl2 ? e : e - 1.0; - double u = bl3 ? f : f - 1.0; - double v = getFiddledDistance(this.biomeZoomSeed, q, r, s, h, t, u); - if (g > v) { - o = p; - g = v; + // DivineMC start - Carpet-Fixes: getBiome Optimize + if (space.bxteam.divinemc.configuration.DivineConfig.biomeManagerOptimization) { + int xMinus2 = pos.getX() - 2; + int yMinus2 = pos.getY() - 2; + int zMinus2 = pos.getZ() - 2; + int x = xMinus2 >> 2; // BlockPos to BiomePos + int y = yMinus2 >> 2; + int z = zMinus2 >> 2; + double quartX = (double) (xMinus2 & 3) / 4.0D; // quartLocal divided by 4 + double quartY = (double) (yMinus2 & 3) / 4.0D; // 0/4, 1/4, 2/4, 3/4 + double quartZ = (double) (zMinus2 & 3) / 4.0D; // [0, 0.25, 0.5, 0.75] + int smallestX = 0; + double smallestDist = Double.POSITIVE_INFINITY; + for (int biomeX = 0; biomeX < 8; ++biomeX) { + boolean everyOtherQuad = (biomeX & 4) == 0; // 1 1 1 1 0 0 0 0 + boolean everyOtherPair = (biomeX & 2) == 0; // 1 1 0 0 1 1 0 0 + boolean everyOther = (biomeX & 1) == 0; // 1 0 1 0 1 0 1 0 + double quartXX = everyOtherQuad ? quartX : quartX - 1.0D; //[-1.0,-0.75,-0.5,-0.25,0.0,0.25,0.5,0.75] + double quartYY = everyOtherPair ? quartY : quartY - 1.0D; + double quartZZ = everyOther ? quartZ : quartZ - 1.0D; + + double maxQuartYY = 0.0D, maxQuartZZ = 0.0D; + if (biomeX != 0) { + maxQuartYY = Mth.square(Math.max(quartYY + maxOffset, Math.abs(quartYY - maxOffset))); + maxQuartZZ = Mth.square(Math.max(quartZZ + maxOffset, Math.abs(quartZZ - maxOffset))); + double maxQuartXX = Mth.square(Math.max(quartXX + maxOffset, Math.abs(quartXX - maxOffset))); + if (smallestDist < maxQuartXX + maxQuartYY + maxQuartZZ) continue; + } + + int xx = everyOtherQuad ? x : x + 1; + int yy = everyOtherPair ? y : y + 1; + int zz = everyOther ? z : z + 1; + + //I transferred the code from method_38106 to here, so I could call continue halfway through + long seed = LinearCongruentialGenerator.next(this.biomeZoomSeed, xx); + seed = LinearCongruentialGenerator.next(seed, yy); + seed = LinearCongruentialGenerator.next(seed, zz); + seed = LinearCongruentialGenerator.next(seed, xx); + seed = LinearCongruentialGenerator.next(seed, yy); + seed = LinearCongruentialGenerator.next(seed, zz); + double offsetX = getFiddle(seed); + double sqrX = Mth.square(quartXX + offsetX); + if (biomeX != 0 && smallestDist < sqrX + maxQuartYY + maxQuartZZ) continue; //skip the rest of the loop + seed = LinearCongruentialGenerator.next(seed, this.biomeZoomSeed); + double offsetY = getFiddle(seed); + double sqrY = Mth.square(quartYY + offsetY); + if (biomeX != 0 && smallestDist < sqrX + sqrY + maxQuartZZ) continue; // skip the rest of the loop + seed = LinearCongruentialGenerator.next(seed, this.biomeZoomSeed); + double offsetZ = getFiddle(seed); + double biomeDist = sqrX + sqrY + Mth.square(quartZZ + offsetZ); + + if (smallestDist > biomeDist) { + smallestX = biomeX; + smallestDist = biomeDist; + } + } + return this.noiseBiomeSource.getNoiseBiome( + (smallestX & 4) == 0 ? x : x + 1, + (smallestX & 2) == 0 ? y : y + 1, + (smallestX & 1) == 0 ? z : z + 1 + ); + } else { + int i = pos.getX() - 2; + int j = pos.getY() - 2; + int k = pos.getZ() - 2; + int l = i >> 2; + int m = j >> 2; + int n = k >> 2; + double d = (double)(i & 3) / 4.0; + double e = (double)(j & 3) / 4.0; + double f = (double)(k & 3) / 4.0; + int o = 0; + double g = Double.POSITIVE_INFINITY; + + for (int p = 0; p < 8; p++) { + boolean bl = (p & 4) == 0; + boolean bl2 = (p & 2) == 0; + boolean bl3 = (p & 1) == 0; + int q = bl ? l : l + 1; + int r = bl2 ? m : m + 1; + int s = bl3 ? n : n + 1; + double h = bl ? d : d - 1.0; + double t = bl2 ? e : e - 1.0; + double u = bl3 ? f : f - 1.0; + double v = getFiddledDistance(this.biomeZoomSeed, q, r, s, h, t, u); + if (g > v) { + o = p; + g = v; + } } - } - int w = (o & 4) == 0 ? l : l + 1; - int x = (o & 2) == 0 ? m : m + 1; - int y = (o & 1) == 0 ? n : n + 1; - return this.noiseBiomeSource.getNoiseBiome(w, x, y); + int w = (o & 4) == 0 ? l : l + 1; + int x = (o & 2) == 0 ? m : m + 1; + int y = (o & 1) == 0 ? n : n + 1; + return this.noiseBiomeSource.getNoiseBiome(w, x, y); + } + // DivineMC end } public Holder getNoiseBiomeAtPosition(double x, double y, double z) { diff --git a/src/main/java/space/bxteam/divinemc/configuration/DivineConfig.java b/src/main/java/space/bxteam/divinemc/configuration/DivineConfig.java index a126361a640d3aac85785f3f24f9e5f712d4d2fe..b12578224a1ac9596a8e82c277efb71e1944c164 100644 --- a/src/main/java/space/bxteam/divinemc/configuration/DivineConfig.java +++ b/src/main/java/space/bxteam/divinemc/configuration/DivineConfig.java @@ -159,7 +159,9 @@ public class DivineConfig { } public static boolean recipeManagerOptimization = true; + public static boolean biomeManagerOptimization = true; private static void optimizations() { recipeManagerOptimization = getBoolean("settings.optimizations.recipe-manager-optimization", recipeManagerOptimization); + biomeManagerOptimization = getBoolean("settings.optimizations.biome-manager-optimization", biomeManagerOptimization); } }