From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: AlphaKR93 Date: Sat, 14 Dec 2024 00:29:15 +0900 Subject: [PATCH] Implement CarpetFixes diff --git a/src/main/java/net/minecraft/world/entity/animal/Sheep.java b/src/main/java/net/minecraft/world/entity/animal/Sheep.java index 0503f936d0d7194f110069adabff984f51af0a3a..0ca88636cca9b8f93cddf8bc58038e626e171df8 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java +++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java @@ -379,19 +379,22 @@ public class Sheep extends Animal implements Shearable { } private DyeColor getOffspringColor(ServerLevel world, Sheep firstParent, Sheep secondParent) { - DyeColor enumcolor = firstParent.getColor(); - DyeColor enumcolor1 = secondParent.getColor(); - CraftingInput craftinginput = Sheep.makeCraftInput(enumcolor, enumcolor1); - Optional optional = world.recipeAccess().getRecipeFor(RecipeType.CRAFTING, craftinginput, world).map((recipeholder) -> { // CraftBukkit - decompile error - return ((CraftingRecipe) recipeholder.value()).assemble(craftinginput, world.registryAccess()); - }).map(ItemStack::getItem); - - Objects.requireNonNull(DyeItem.class); - optional = optional.filter(DyeItem.class::isInstance); - Objects.requireNonNull(DyeItem.class); - return (DyeColor) optional.map(DyeItem.class::cast).map(DyeItem::getDyeColor).orElseGet(() -> { - return world.random.nextBoolean() ? enumcolor : enumcolor1; - }); + // Plazma start - Implement CarpetFixes + final DyeColor firstColor = firstParent.getColor(); + final DyeColor secondColor = secondParent.getColor(); +// PLAZMA - REMOVE THIS + if (world.plazmaConfig().carpetFixes.preparedSheepChildColor) { + final DyeColor color = org.plazmamc.plazma.util.CarpetFixes.properDyeMixin(firstColor, secondColor); + if (color != null) return color; + return world.random.nextBoolean() ? firstColor : secondColor; + } +// PLAZMA - REMOVE THIS + final CraftingInput input = Sheep.makeCraftInput(firstColor, secondColor); +// PLAZMA - REMOVE THIS + Optional result = world.recipeAccess().getRecipeFor(RecipeType.CRAFTING, input, world).map((recipeholder) -> recipeholder.value().assemble(input, world.registryAccess())).map(ItemStack::getItem); + result = result.filter(DyeItem.class::isInstance); + return result.map(DyeItem.class::cast).map(DyeItem::getDyeColor).orElseGet(() -> world.random.nextBoolean() ? firstColor : secondColor); + // Plazma end - Implement CarpetFixes } private static CraftingInput makeCraftInput(DyeColor firstColor, DyeColor secondColor) { 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 90f8360f547ce709fd13ee34f8e67d8bfa94b498..4e5fb377696c0a98a56f9ea11d0116b28399c8f6 100644 --- a/src/main/java/net/minecraft/world/level/biome/BiomeManager.java +++ b/src/main/java/net/minecraft/world/level/biome/BiomeManager.java @@ -9,6 +9,8 @@ import net.minecraft.util.Mth; public class BiomeManager { public static final int CHUNK_CENTER_QUART = QuartPos.fromBlock(8); + public static boolean PLAZMA_CARPET_FIXES = false; // Plazma - Implement CarpetFixes + private static final double MAX_OFFSET = 0.450_000_000_1; // Plazma - Implement CarpetFixes private static final int ZOOM_BITS = 2; private static final int ZOOM = 4; private static final int ZOOM_MASK = 3; @@ -29,6 +31,79 @@ public class BiomeManager { } public Holder getBiome(BlockPos pos) { + // Plazma start - Implement CarpetFixes + if (PLAZMA_CARPET_FIXES) { + final int x2 = pos.getX() - 2; + final int y2 = pos.getY() - 2; + final int z2 = pos.getZ() - 2; + + final int x = x2 >> 2; + final int y = y2 >> 2; + final int z = z2 >> 2; + + final double qX = (x2 & 3) / 4.0D; + final double qY = (y2 & 3) / 4.0D; + final double qZ = (z2 & 3) / 4.0D; + + int minX = 0; + double minD = Double.POSITIVE_INFINITY; + for (int bX = 0; bX < 8; ++bX) { + final boolean x0 = (bX & 4) == 0; + final boolean y0 = (bX & 2) == 0; + final boolean z0 = (bX & 1) == 0; + + final double x1 = x0 ? qX : qX - 1.0D; + final double y1 = y0 ? qY : qY - 1.0D; + final double z1 = z0 ? qZ : qZ - 1.0D; + + double maxQY = 0.0D; + double maxQZ = 0.0D; + if (bX != 0) { + final double maxQX = Mth.square(Math.max(x1 + MAX_OFFSET, Math.abs(x1 - MAX_OFFSET))); + maxQY = Mth.square(Math.max(y1 + MAX_OFFSET, Math.abs(y1 - MAX_OFFSET))); + maxQZ = Mth.square(Math.max(z1 + MAX_OFFSET, Math.abs(z1 - MAX_OFFSET))); + + if (minD < maxQY + maxQZ + maxQX) continue; + } + + int pX = x0 ? x : x + 1; + int pY = y0 ? y : y + 1; + int pZ = z0 ? z : z + 1; + + long seed = this.biomeZoomSeed; + seed = LinearCongruentialGenerator.next(seed, pX); + seed = LinearCongruentialGenerator.next(seed, pY); + seed = LinearCongruentialGenerator.next(seed, pZ); + seed = LinearCongruentialGenerator.next(seed, pX); + seed = LinearCongruentialGenerator.next(seed, pY); + seed = LinearCongruentialGenerator.next(seed, pZ); + + double dX = getFiddle(seed); + double sX = Mth.square(x1 + dX); + if (bX != 0 && minD < sX + maxQY + maxQZ) continue; + + seed = LinearCongruentialGenerator.next(seed, this.biomeZoomSeed); + double dY = getFiddle(seed); + double sY = Mth.square(y1 + dY); + if (bX != 0 && minD < sX + sY + maxQZ) continue; + + seed = LinearCongruentialGenerator.next(seed, this.biomeZoomSeed); + double dZ = getFiddle(seed); + double bD = sX + sY + Mth.square(z1 + dZ); + + if (minD <= bD) continue; + minX = bX; + minD = bD; + } + + return this.noiseBiomeSource.getNoiseBiome( + (minX & 4) == 0 ? x : x + 1, + (minX & 2) == 0 ? y : y + 1, + (minX & 1) == 0 ? z : z + 1 + ); + } + // Plazma end - Implement CarpetFixes + int i = pos.getX() - 2; int j = pos.getY() - 2; int k = pos.getZ() - 2; diff --git a/src/main/java/org/plazmamc/plazma/configurations/GlobalConfiguration.java b/src/main/java/org/plazmamc/plazma/configurations/GlobalConfiguration.java index 538c572661bd92666f84e6f9ef3e9760f69f50a9..db31d0c066e92fe308e7e64075e832bec66a5c02 100644 --- a/src/main/java/org/plazmamc/plazma/configurations/GlobalConfiguration.java +++ b/src/main/java/org/plazmamc/plazma/configurations/GlobalConfiguration.java @@ -188,4 +188,16 @@ public class GlobalConfiguration extends ConfigurationPart { } + public CarpetFixes carpetFixes; + public class CarpetFixes extends ConfigurationPart { + + boolean optimizeBiomeAccess = OPTIMIZE; + + @PostProcess + void post() { + net.minecraft.world.level.biome.BiomeManager.PLAZMA_CARPET_FIXES = this.optimizeBiomeAccess; + } + + } + } diff --git a/src/main/java/org/plazmamc/plazma/configurations/WorldConfigurations.java b/src/main/java/org/plazmamc/plazma/configurations/WorldConfigurations.java index 36345efa302413ad4e7d6e611d182572622f76ff..d314be46a02d73e669088d3a37937c8751f7735d 100644 --- a/src/main/java/org/plazmamc/plazma/configurations/WorldConfigurations.java +++ b/src/main/java/org/plazmamc/plazma/configurations/WorldConfigurations.java @@ -126,4 +126,11 @@ public class WorldConfigurations extends ConfigurationPart { } + public CarpetFixes carpetFixes; + public class CarpetFixes extends ConfigurationPart { + + public boolean preparedSheepChildColor = OPTIMIZE; + + } + } diff --git a/src/main/java/org/plazmamc/plazma/util/CarpetFixes.java b/src/main/java/org/plazmamc/plazma/util/CarpetFixes.java new file mode 100644 index 0000000000000000000000000000000000000000..a5b0ce75a0ffa65e357cde2d55b7a0f116a2afad --- /dev/null +++ b/src/main/java/org/plazmamc/plazma/util/CarpetFixes.java @@ -0,0 +1,45 @@ +package org.plazmamc.plazma.util; + +import net.minecraft.world.item.DyeColor; + +public interface CarpetFixes { + + static DyeColor properDyeMixin(DyeColor firstColor, DyeColor secondColor) { + if (firstColor.equals(secondColor)) return firstColor; + + return switch (firstColor) { + case WHITE -> switch (secondColor) { + case BLUE -> DyeColor.LIGHT_BLUE; + case GRAY -> DyeColor.LIGHT_GRAY; + case BLACK -> DyeColor.GRAY; + case GREEN -> DyeColor.LIME; + case RED -> DyeColor.PINK; + default -> null; + }; + case BLUE -> switch (secondColor) { + case WHITE -> DyeColor.LIGHT_BLUE; + case GREEN -> DyeColor.CYAN; + case RED -> DyeColor.PURPLE; + default -> null; + }; + case RED -> switch (secondColor) { + case YELLOW -> DyeColor.ORANGE; + case WHITE -> DyeColor.PINK; + case BLUE -> DyeColor.PURPLE; + default -> null; + }; + case GREEN -> switch (secondColor) { + case BLUE -> DyeColor.CYAN; + case WHITE -> DyeColor.LIME; + default -> null; + }; + case YELLOW -> secondColor.equals(DyeColor.RED) ? DyeColor.ORANGE : null; + case PURPLE -> secondColor.equals(DyeColor.PINK) ? DyeColor.MAGENTA : null; + case PINK -> secondColor.equals(DyeColor.PURPLE) ? DyeColor.MAGENTA : null; + case GRAY -> secondColor.equals(DyeColor.WHITE) ? DyeColor.LIGHT_GRAY : null; + case BLACK -> secondColor.equals(DyeColor.WHITE) ? DyeColor.GRAY : null; + default -> null; + }; + } + +}