9
0
mirror of https://github.com/BX-Team/DivineMC.git synced 2025-12-19 14:59:25 +00:00
Files
DivineMC/divinemc-server/minecraft-patches/features/0020-Carpet-Fixes-Sheep-Optimization.patch
NONPLAYT 1f51fdd5bf cleanup
2025-07-20 16:02:38 +03:00

127 lines
4.9 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: NONPLAYT <76615486+NONPLAYT@users.noreply.github.com>
Date: Thu, 8 May 2025 16:49:29 +0300
Subject: [PATCH] Carpet-Fixes: Sheep Optimization
This patch is based on the following mixins and classes:
* "carpetfixes/helpers/Utils.java"
* "carpetfixes/mixins/optimizations/SheepEntity_childColorMixin.java"
By: fxmorin <28154542+fxmorin@users.noreply.github.com>
As part of: carpet-fixes (https://github.com/fxmorin/carpet-fixes)
Licensed under: MIT (https://opensource.org/licenses/MIT)
Patch description:
The game determines the child sheep's color by getting a wool block from the parents, putting them in a crafting
recipe, getting the output wool and getting the color from that.
I don't know in what world we would consider a data-driven method with that much overhead as a smart idea. Instead,
we used a prebaked list of all the possible colors and combinations, however this means that you can't use a
datapack to change it.
diff --git a/net/minecraft/world/item/DyeColor.java b/net/minecraft/world/item/DyeColor.java
index c9cde255117b46690b2b6670d009a00b051af016..2c9f513e6ccd75959484f29a375671e21aab9590 100644
--- a/net/minecraft/world/item/DyeColor.java
+++ b/net/minecraft/world/item/DyeColor.java
@@ -112,6 +112,15 @@ public enum DyeColor implements StringRepresentable {
}
public static DyeColor getMixedColor(ServerLevel level, DyeColor first, DyeColor second) {
+ // DivineMC start - Carpet-Fixes: Sheep Optimization
+ if (org.bxteam.divinemc.config.DivineConfig.PerformanceCategory.sheepOptimization) {
+ DyeColor col = properDye(first, second);
+
+ if (col == null) col = level.random.nextBoolean() ? first : second;
+
+ return col;
+ }
+ // DivineMC end - Carpet-Fixes: Sheep Optimization
CraftingInput craftingInput = makeCraftColorInput(first, second);
return level.recipeAccess()
.getRecipeFor(RecipeType.CRAFTING, craftingInput, level)
@@ -132,4 +141,85 @@ public enum DyeColor implements StringRepresentable {
return values()[random.nextInt(values().length)];
}
// Purpur end - Shulker spawn from bullet options
+
+ // DivineMC start - Carpet-Fixes: Sheep Optimization
+ private static DyeColor properDye(DyeColor firstColor, DyeColor secondColor) {
+ if (firstColor.equals(secondColor)) return firstColor;
+
+ switch (firstColor) {
+ case WHITE -> {
+ switch (secondColor) {
+ case BLUE -> {
+ return DyeColor.LIGHT_BLUE;
+ }
+ case GRAY -> {
+ return DyeColor.LIGHT_GRAY;
+ }
+ case BLACK -> {
+ return DyeColor.GRAY;
+ }
+ case GREEN -> {
+ return DyeColor.LIME;
+ }
+ case RED -> {
+ return DyeColor.PINK;
+ }
+ }
+ }
+ case BLUE -> {
+ switch (secondColor) {
+ case WHITE -> {
+ return DyeColor.LIGHT_BLUE;
+ }
+ case GREEN -> {
+ return DyeColor.CYAN;
+ }
+ case RED -> {
+ return DyeColor.PURPLE;
+ }
+ }
+ }
+ case RED -> {
+ switch (secondColor) {
+ case YELLOW -> {
+ return DyeColor.ORANGE;
+ }
+ case WHITE -> {
+ return DyeColor.PINK;
+ }
+ case BLUE -> {
+ return DyeColor.PURPLE;
+ }
+ }
+ }
+ case GREEN -> {
+ switch (secondColor) {
+ case BLUE -> {
+ return DyeColor.CYAN;
+ }
+ case WHITE -> {
+ return DyeColor.LIME;
+ }
+ }
+ }
+ case YELLOW -> {
+ if (secondColor.equals(DyeColor.RED)) return DyeColor.ORANGE;
+ }
+ case PURPLE -> {
+ if (secondColor.equals(DyeColor.PINK)) return DyeColor.MAGENTA;
+ }
+ case PINK -> {
+ if (secondColor.equals(DyeColor.PURPLE)) return DyeColor.MAGENTA;
+ }
+ case GRAY -> {
+ if (secondColor.equals(DyeColor.WHITE)) return DyeColor.LIGHT_GRAY;
+ }
+ case BLACK -> {
+ if (secondColor.equals(DyeColor.WHITE)) return DyeColor.GRAY;
+ }
+ }
+
+ return null;
+ }
+ // DivineMC end - Carpet-Fixes: Sheep Optimization
}