diff --git a/fmlloader/src/main/java/net/minecraftforge/fml/loading/BackgroundWaiter.java b/fmlloader/src/main/java/net/minecraftforge/fml/loading/BackgroundWaiter.java
index 2d681f4537..c6d4d42e5e 100644
--- a/fmlloader/src/main/java/net/minecraftforge/fml/loading/BackgroundWaiter.java
+++ b/fmlloader/src/main/java/net/minecraftforge/fml/loading/BackgroundWaiter.java
@@ -6,14 +6,13 @@
package net.minecraftforge.fml.loading;
import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class BackgroundWaiter {
- private static final ExecutorService runner = Executors.newSingleThreadExecutor();
public static void runAndTick(Runnable r, Runnable tick) {
+ var runner = Executors.newSingleThreadExecutor();
ImmediateWindowHandler.updateProgress("Loading bootstrap resources");
final Future> work = runner.submit(r);
do {
diff --git a/fmlloader/src/main/java/net/minecraftforge/fml/loading/targets/CommonLaunchHandler.java b/fmlloader/src/main/java/net/minecraftforge/fml/loading/targets/CommonLaunchHandler.java
index 6ed1a52e7f..13e733c959 100644
--- a/fmlloader/src/main/java/net/minecraftforge/fml/loading/targets/CommonLaunchHandler.java
+++ b/fmlloader/src/main/java/net/minecraftforge/fml/loading/targets/CommonLaunchHandler.java
@@ -71,6 +71,7 @@ public abstract class CommonLaunchHandler implements ILaunchHandlerService {
protected record LaunchType(String name, String module, String main, Dist dist, boolean data) {};
protected static final LaunchType CLIENT = new LaunchType("client", "minecraft", "net.minecraft.client.main.Main", Dist.CLIENT, false);
+ protected static final LaunchType CLIENT_DATA = new LaunchType("client_data", "minecraft", "net.minecraft.client.data.Main", Dist.CLIENT, true);
protected static final LaunchType DATA = new LaunchType("data", "minecraft", "net.minecraft.data.Main", Dist.CLIENT, true);
protected static final LaunchType SERVER = new LaunchType("server", "minecraft", "net.minecraft.server.Main", Dist.DEDICATED_SERVER, false);
protected static final LaunchType SERVER_GAMETEST = new LaunchType("server_gametest", "net.minecraftforge.forge", "net.minecraftforge.gametest.GameTestMain", Dist.DEDICATED_SERVER, false);
diff --git a/fmlloader/src/main/java/net/minecraftforge/fml/loading/targets/ForgeDevLaunchHandler.java b/fmlloader/src/main/java/net/minecraftforge/fml/loading/targets/ForgeDevLaunchHandler.java
index dd3c84deae..1b61029530 100644
--- a/fmlloader/src/main/java/net/minecraftforge/fml/loading/targets/ForgeDevLaunchHandler.java
+++ b/fmlloader/src/main/java/net/minecraftforge/fml/loading/targets/ForgeDevLaunchHandler.java
@@ -39,6 +39,12 @@ sealed abstract class ForgeDevLaunchHandler extends CommonDevLaunchHandler {
}
}
+ public static final class ClientData extends ForgeDevLaunchHandler {
+ public ClientData() {
+ super(CLIENT_DATA);
+ }
+ }
+
public static final class Data extends ForgeDevLaunchHandler {
public Data() {
super(DATA);
diff --git a/gradle.properties b/gradle.properties
index f59ff44519..49ed8d37f7 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -5,11 +5,11 @@ org.gradle.daemon=false
org.gradle.parallel=true
JAVA_VERSION=21
-MC_VERSION=1.21.3
+MC_VERSION=1.21.4
MC_NEXT_VERSION=1.22
-MCP_VERSION=20241025.112443
+MCP_VERSION=20241203.143248
MAPPING_CHANNEL=official
-MAPPING_VERSION=1.21.3
+MAPPING_VERSION=1.21.4
// Set to true before the first build of a new MC version, so we don't do compatibility checks
CHECK_COMPATIBILITY=false
diff --git a/patches/minecraft/com/mojang/blaze3d/platform/Window.java.patch b/patches/minecraft/com/mojang/blaze3d/platform/Window.java.patch
index 9a2213c1b8..06acc31f03 100644
--- a/patches/minecraft/com/mojang/blaze3d/platform/Window.java.patch
+++ b/patches/minecraft/com/mojang/blaze3d/platform/Window.java.patch
@@ -1,6 +1,6 @@
--- a/com/mojang/blaze3d/platform/Window.java
+++ b/com/mojang/blaze3d/platform/Window.java
-@@ -88,7 +_,8 @@
+@@ -89,7 +_,8 @@
GLFW.glfwWindowHint(139267, 2);
GLFW.glfwWindowHint(139272, 204801);
GLFW.glfwWindowHint(139270, 1);
@@ -10,7 +10,7 @@
if (monitor != null) {
VideoMode videomode = monitor.getPreferredVidMode(this.fullscreen ? this.preferredFullscreenVideoMode : Optional.empty());
this.windowedX = this.x = monitor.getX() + videomode.getWidth() / 2 - this.width / 2;
-@@ -100,6 +_,7 @@
+@@ -101,6 +_,7 @@
this.windowedX = this.x = aint1[0];
this.windowedY = this.y = aint[0];
}
@@ -18,7 +18,7 @@
GLFW.glfwMakeContextCurrent(this.window);
GL.createCapabilities();
-@@ -267,6 +_,9 @@
+@@ -271,6 +_,9 @@
GLFW.glfwGetFramebufferSize(this.window, aint, aint1);
this.framebufferWidth = aint[0] > 0 ? aint[0] : 1;
this.framebufferHeight = aint1[0] > 0 ? aint1[0] : 1;
diff --git a/patches/minecraft/net/minecraft/Util.java.patch b/patches/minecraft/net/minecraft/Util.java.patch
index 259ca88d92..677a3c434b 100644
--- a/patches/minecraft/net/minecraft/Util.java.patch
+++ b/patches/minecraft/net/minecraft/Util.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/Util.java
+++ b/net/minecraft/Util.java
-@@ -264,7 +_,7 @@
+@@ -268,7 +_,7 @@
.getSchema(DataFixUtils.makeKey(SharedConstants.getCurrentVersion().getDataVersion().getVersion()))
.getChoiceType(p_137552_, p_137553_);
} catch (IllegalArgumentException illegalargumentexception) {
diff --git a/patches/minecraft/net/minecraft/client/KeyMapping.java.patch b/patches/minecraft/net/minecraft/client/KeyMapping.java.patch
index 5630279bf4..77ab4376bd 100644
--- a/patches/minecraft/net/minecraft/client/KeyMapping.java.patch
+++ b/patches/minecraft/net/minecraft/client/KeyMapping.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/KeyMapping.java
+++ b/net/minecraft/client/KeyMapping.java
-@@ -14,9 +_,9 @@
+@@ -15,9 +_,9 @@
import net.minecraftforge.api.distmarker.OnlyIn;
@OnlyIn(Dist.CLIENT)
@@ -12,7 +12,7 @@
private static final Set CATEGORIES = Sets.newHashSet();
public static final String CATEGORY_MOVEMENT = "key.categories.movement";
public static final String CATEGORY_MISC = "key.categories.misc";
-@@ -42,14 +_,14 @@
+@@ -43,14 +_,14 @@
private int clickCount;
public static void click(InputConstants.Key p_90836_) {
@@ -29,7 +29,7 @@
if (keymapping != null) {
keymapping.setDown(p_90839_);
}
-@@ -100,7 +_,7 @@
+@@ -101,7 +_,7 @@
}
public boolean isDown() {
@@ -38,7 +38,7 @@
}
public String getCategory() {
-@@ -136,7 +_,16 @@
+@@ -137,7 +_,16 @@
public int compareTo(KeyMapping p_90841_) {
return this.category.equals(p_90841_.category)
? I18n.get(this.name).compareTo(I18n.get(p_90841_.name))
@@ -56,7 +56,7 @@
}
public static Supplier createNameSupplier(String p_90843_) {
-@@ -145,6 +_,20 @@
+@@ -146,6 +_,20 @@
}
public boolean same(KeyMapping p_90851_) {
@@ -77,7 +77,7 @@
return this.key.equals(p_90851_.key);
}
-@@ -163,11 +_,13 @@
+@@ -164,11 +_,13 @@
}
public Component getTranslatedKeyMessage() {
@@ -92,10 +92,10 @@
}
public String saveString() {
-@@ -176,5 +_,88 @@
-
- public void setDown(boolean p_90846_) {
- this.isDown = p_90846_;
+@@ -182,5 +_,88 @@
+ @Nullable
+ public static KeyMapping get(String p_378660_) {
+ return ALL.get(p_378660_);
+ }
+
+ private net.minecraftforge.client.settings.KeyModifier keyModifierDefault = net.minecraftforge.client.settings.KeyModifier.NONE;
diff --git a/patches/minecraft/net/minecraft/client/Minecraft.java.patch b/patches/minecraft/net/minecraft/client/Minecraft.java.patch
index 27e4dc5379..a7cdf9632f 100644
--- a/patches/minecraft/net/minecraft/client/Minecraft.java.patch
+++ b/patches/minecraft/net/minecraft/client/Minecraft.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/Minecraft.java
+++ b/net/minecraft/client/Minecraft.java
-@@ -253,7 +_,7 @@
+@@ -250,7 +_,7 @@
import org.slf4j.Logger;
@OnlyIn(Dist.CLIENT)
@@ -9,7 +9,7 @@
static Minecraft instance;
private static final Logger LOGGER = LogUtils.getLogger();
public static final boolean ON_OSX = Util.getPlatform() == Util.OS.OSX;
-@@ -433,7 +_,6 @@
+@@ -428,7 +_,6 @@
}
}, Util.nonCriticalIoPool());
LOGGER.info("Setting user: {}", this.user.getName());
@@ -17,7 +17,7 @@
this.demo = p_91084_.game.demo;
this.allowsMultiplayer = !p_91084_.game.disableMultiplayer;
this.allowsChat = !p_91084_.game.disableChat;
-@@ -480,15 +_,15 @@
+@@ -475,15 +_,15 @@
LOGGER.error("Couldn't set icon", (Throwable)ioexception);
}
@@ -35,15 +35,15 @@
this.resourcePackRepository.reload();
this.options.loadSelectedResourcePacks(this.resourcePackRepository);
this.languageManager = new LanguageManager(this.options.languageCode, p_340763_ -> {
-@@ -562,6 +_,7 @@
- );
- this.resourceManager.registerReloadListener(this.entityRenderDispatcher);
+@@ -561,6 +_,7 @@
+ this.blockEntityRenderDispatcher = new BlockEntityRenderDispatcher(this.font, this.modelManager.entityModels(), this.blockRenderer, this.itemModelResolver, this.itemRenderer, this.entityRenderDispatcher);
+ this.resourceManager.registerReloadListener(this.blockEntityRenderDispatcher);
this.particleEngine = new ParticleEngine(this.level, this.textureManager);
+ net.minecraftforge.client.ForgeHooksClient.onRegisterParticleProviders(this.particleEngine);
this.resourceManager.registerReloadListener(this.particleEngine);
this.paintingTextures = new PaintingTextureManager(this.textureManager);
this.resourceManager.registerReloadListener(this.paintingTextures);
-@@ -577,6 +_,9 @@
+@@ -576,6 +_,9 @@
this.resourceManager.registerReloadListener(this.gpuWarnlistManager);
this.resourceManager.registerReloadListener(this.regionalCompliancies);
this.gui = new Gui(this);
@@ -53,7 +53,7 @@
this.debugRenderer = new DebugRenderer(this);
RealmsClient realmsclient = RealmsClient.create(this);
this.realmsDataFetcher = new RealmsDataFetcher(realmsclient);
-@@ -600,6 +_,7 @@
+@@ -599,6 +_,7 @@
this.options.fullscreen().set(this.window.isFullscreen());
}
@@ -157,7 +157,7 @@
}
profilerfiller.push("blit");
-@@ -1339,10 +_,12 @@
+@@ -1342,10 +_,12 @@
this.window.setGuiScale((double)i);
if (this.screen != null) {
this.screen.resize(this, this.window.getGuiScaledWidth(), this.window.getGuiScaledHeight());
@@ -170,7 +170,7 @@
this.gameRenderer.resize(this.window.getWidth(), this.window.getHeight());
this.mouseHandler.setIgnoreFirstMove();
}
-@@ -1483,6 +_,7 @@
+@@ -1486,6 +_,7 @@
}
public void stop() {
@@ -178,7 +178,7 @@
this.running = false;
}
-@@ -1511,10 +_,18 @@
+@@ -1514,10 +_,18 @@
if (p_91387_ && this.hitResult != null && this.hitResult.getType() == HitResult.Type.BLOCK) {
BlockHitResult blockhitresult = (BlockHitResult)this.hitResult;
BlockPos blockpos = blockhitresult.getBlockPos();
@@ -200,7 +200,7 @@
this.player.swing(InteractionHand.MAIN_HAND);
}
}
-@@ -1542,6 +_,8 @@
+@@ -1545,6 +_,8 @@
return false;
} else {
boolean flag = false;
@@ -209,7 +209,7 @@
switch (this.hitResult.getType()) {
case ENTITY:
this.gameMode.attack(this.player, ((EntityHitResult)this.hitResult).getEntity());
-@@ -1549,7 +_,7 @@
+@@ -1552,7 +_,7 @@
case BLOCK:
BlockHitResult blockhitresult = (BlockHitResult)this.hitResult;
BlockPos blockpos = blockhitresult.getBlockPos();
@@ -218,7 +218,7 @@
this.gameMode.startDestroyBlock(blockpos, blockhitresult.getDirection());
if (this.level.getBlockState(blockpos).isAir()) {
flag = true;
-@@ -1562,8 +_,10 @@
+@@ -1565,8 +_,10 @@
}
this.player.resetAttackStrengthTicker();
@@ -229,7 +229,7 @@
this.player.swing(InteractionHand.MAIN_HAND);
return flag;
}
-@@ -1579,6 +_,12 @@
+@@ -1582,6 +_,12 @@
}
for (InteractionHand interactionhand : InteractionHand.values()) {
@@ -242,7 +242,7 @@
ItemStack itemstack = this.player.getItemInHand(interactionhand);
if (!itemstack.isItemEnabled(this.level.enabledFeatures())) {
return;
-@@ -1599,7 +_,7 @@
+@@ -1602,7 +_,7 @@
}
if (interactionresult instanceof InteractionResult.Success interactionresult$success2) {
@@ -251,7 +251,7 @@
this.player.swing(interactionhand);
}
-@@ -1611,7 +_,7 @@
+@@ -1614,7 +_,7 @@
int i = itemstack.getCount();
InteractionResult interactionresult1 = this.gameMode.useItemOn(this.player, interactionhand, blockhitresult);
if (interactionresult1 instanceof InteractionResult.Success interactionresult$success) {
@@ -260,7 +260,7 @@
this.player.swing(interactionhand);
if (!itemstack.isEmpty() && (itemstack.getCount() != i || this.gameMode.hasInfiniteItems())) {
this.gameRenderer.itemInHandRenderer.itemUsed(interactionhand);
-@@ -1627,6 +_,9 @@
+@@ -1630,6 +_,9 @@
}
}
@@ -270,7 +270,7 @@
if (!itemstack.isEmpty()
&& this.gameMode.useItem(this.player, interactionhand) instanceof InteractionResult.Success interactionresult$success1) {
if (interactionresult$success1.swingSource() == InteractionResult.SwingSource.CLIENT) {
-@@ -1656,6 +_,8 @@
+@@ -1659,6 +_,8 @@
}
ProfilerFiller profilerfiller = Profiler.get();
@@ -279,7 +279,7 @@
profilerfiller.push("gui");
this.chatListener.tick();
this.gui.tick(this.pause);
-@@ -1745,6 +_,7 @@
+@@ -1748,6 +_,7 @@
this.tutorial.tick();
@@ -287,7 +287,7 @@
try {
this.level.tick(() -> true);
} catch (Throwable throwable1) {
-@@ -1758,6 +_,7 @@
+@@ -1761,6 +_,7 @@
throw new ReportedException(crashreport1);
}
@@ -295,7 +295,7 @@
}
profilerfiller.popPush("animateTick");
-@@ -1782,6 +_,7 @@
+@@ -1785,6 +_,7 @@
profilerfiller.popPush("keyboard");
this.keyboardHandler.tick();
profilerfiller.pop();
@@ -303,7 +303,7 @@
}
private boolean isLevelRunningNormally() {
-@@ -1983,6 +_,7 @@
+@@ -1986,6 +_,7 @@
}
public void setLevel(ClientLevel p_91157_, ReceivingLevelScreen.Reason p_335893_) {
@@ -311,7 +311,7 @@
this.updateScreenAndTick(new ReceivingLevelScreen(() -> false, p_335893_));
this.level = p_91157_;
this.updateLevelInEngines(p_91157_);
-@@ -2020,6 +_,7 @@
+@@ -2023,6 +_,7 @@
IntegratedServer integratedserver = this.singleplayerServer;
this.singleplayerServer = null;
this.gameRenderer.resetData();
@@ -319,7 +319,7 @@
this.gameMode = null;
this.narrator.clear();
this.clientLevelTeardownInProgress = true;
-@@ -2027,6 +_,7 @@
+@@ -2030,6 +_,7 @@
try {
this.updateScreenAndTick(p_335030_);
if (this.level != null) {
@@ -327,7 +327,7 @@
if (integratedserver != null) {
ProfilerFiller profilerfiller = Profiler.get();
profilerfiller.push("waitForServer");
-@@ -2040,6 +_,7 @@
+@@ -2043,6 +_,7 @@
this.gui.onDisconnected();
this.isLocalServer = false;
@@ -335,40 +335,11 @@
}
this.level = null;
-@@ -2187,6 +_,7 @@
+@@ -2190,6 +_,7 @@
private void pickBlock() {
if (this.hitResult != null && this.hitResult.getType() != HitResult.Type.MISS) {
+ if (net.minecraftforge.client.event.ForgeEventFactoryClient.onClickInput(2, this.options.keyPickItem, InteractionHand.MAIN_HAND).isCanceled()) return;
- boolean flag = this.player.getAbilities().instabuild;
- BlockEntity blockentity = null;
- HitResult.Type hitresult$type = this.hitResult.getType();
-@@ -2199,7 +_,7 @@
- }
-
- Block block = blockstate.getBlock();
-- itemstack = block.getCloneItemStack(this.level, blockpos, blockstate);
-+ itemstack = blockstate.getCloneItemStack(this.hitResult, this.level, blockpos, this.player);
- if (itemstack.isEmpty()) {
- return;
- }
-@@ -2213,7 +_,7 @@
- }
-
- Entity entity = ((EntityHitResult)this.hitResult).getEntity();
-- itemstack = entity.getPickResult();
-+ itemstack = entity.getPickedResult(this.hitResult);
- if (itemstack == null) {
- return;
- }
-@@ -2818,6 +_,10 @@
- @Nullable
- public static String getLauncherBrand() {
- return System.getProperty("minecraft.launcher.brand");
-+ }
-+
-+ public ItemColors getItemColors() {
-+ return this.itemColors;
- }
-
- @OnlyIn(Dist.CLIENT)
+ boolean flag = Screen.hasControlDown();
+ HitResult hitresult = this.hitResult;
+ Objects.requireNonNull(this.hitResult);
diff --git a/patches/minecraft/net/minecraft/client/color/block/BlockColors.java.patch b/patches/minecraft/net/minecraft/client/color/block/BlockColors.java.patch
index a738abee59..ee5ebf41c7 100644
--- a/patches/minecraft/net/minecraft/client/color/block/BlockColors.java.patch
+++ b/patches/minecraft/net/minecraft/client/color/block/BlockColors.java.patch
@@ -1,16 +1,16 @@
--- a/net/minecraft/client/color/block/BlockColors.java
+++ b/net/minecraft/client/color/block/BlockColors.java
-@@ -29,7 +_,8 @@
- @OnlyIn(Dist.CLIENT)
- public class BlockColors {
+@@ -30,7 +_,8 @@
private static final int DEFAULT = -1;
+ public static final int LILY_PAD_IN_WORLD = -14647248;
+ public static final int LILY_PAD_DEFAULT = -9321636;
- private final IdMapper blockColors = new IdMapper<>(32);
+ // Forge: Use registry delegate as non-Vanilla block ids are not constant
+ private final java.util.Map, BlockColor> blockColors = new java.util.HashMap<>(32);
private final Map>> coloringStates = Maps.newHashMap();
public static BlockColors createDefault() {
-@@ -91,11 +_,12 @@
+@@ -90,11 +_,12 @@
}, Blocks.MELON_STEM, Blocks.PUMPKIN_STEM);
blockcolors.addColoringState(StemBlock.AGE, Blocks.MELON_STEM, Blocks.PUMPKIN_STEM);
blockcolors.register((p_92596_, p_92597_, p_92598_, p_92599_) -> p_92597_ != null && p_92598_ != null ? -14647248 : -9321636, Blocks.LILY_PAD);
@@ -24,7 +24,7 @@
if (blockcolor != null) {
return blockcolor.getColor(p_92583_, null, null, 0);
} else {
-@@ -105,13 +_,15 @@
+@@ -104,13 +_,15 @@
}
public int getColor(BlockState p_92578_, @Nullable BlockAndTintGetter p_92579_, @Nullable BlockPos p_92580_, int p_92581_) {
diff --git a/patches/minecraft/net/minecraft/client/color/item/ItemColors.java.patch b/patches/minecraft/net/minecraft/client/color/item/ItemColors.java.patch
deleted file mode 100644
index ae1c04e53d..0000000000
--- a/patches/minecraft/net/minecraft/client/color/item/ItemColors.java.patch
+++ /dev/null
@@ -1,35 +0,0 @@
---- a/net/minecraft/client/color/item/ItemColors.java
-+++ b/net/minecraft/client/color/item/ItemColors.java
-@@ -26,7 +_,8 @@
- @OnlyIn(Dist.CLIENT)
- public class ItemColors {
- private static final int DEFAULT = -1;
-- private final IdMapper itemColors = new IdMapper<>(32);
-+ // Forge: Use registry delegate as non-Vanilla item ids are not constant
-+ private final java.util.Map, ItemColor> itemColors = new java.util.HashMap<>(32);
-
- public static ItemColors createDefault(BlockColors p_92684_) {
- ItemColors itemcolors = new ItemColors();
-@@ -101,17 +_,20 @@
- (p_357654_, p_357655_) -> p_357655_ == 0 ? -1 : ARGB.opaque(p_357654_.getOrDefault(DataComponents.MAP_COLOR, MapItemColor.DEFAULT).rgb()),
- Items.FILLED_MAP
- );
-+ net.minecraftforge.client.ForgeHooksClient.onItemColorsInit(itemcolors, p_92684_);
- return itemcolors;
- }
-
- public int getColor(ItemStack p_92677_, int p_92678_) {
-- ItemColor itemcolor = this.itemColors.byId(BuiltInRegistries.ITEM.getId(p_92677_.getItem()));
-+ ItemColor itemcolor = this.itemColors.get(net.minecraftforge.registries.ForgeRegistries.ITEMS.getDelegateOrThrow(p_92677_.getItem()));
- return itemcolor == null ? -1 : itemcolor.getColor(p_92677_, p_92678_);
- }
-
-+ /** @deprecated Register via {@link net.minecraftforge.client.event.RegisterColorHandlersEvent.Item} */
-+ @Deprecated
- public void register(ItemColor p_92690_, ItemLike... p_92691_) {
- for (ItemLike itemlike : p_92691_) {
-- this.itemColors.addMapping(p_92690_, Item.getId(itemlike.asItem()));
-+ this.itemColors.put(net.minecraftforge.registries.ForgeRegistries.ITEMS.getDelegateOrThrow(itemlike.asItem()), p_92690_);
- }
- }
- }
diff --git a/patches/minecraft/net/minecraft/client/data/Main.java.patch b/patches/minecraft/net/minecraft/client/data/Main.java.patch
new file mode 100644
index 0000000000..0d03bde7a5
--- /dev/null
+++ b/patches/minecraft/net/minecraft/client/data/Main.java.patch
@@ -0,0 +1,22 @@
+--- a/net/minecraft/client/data/Main.java
++++ b/net/minecraft/client/data/Main.java
+@@ -30,13 +_,18 @@
+ OptionSpec optionspec1 = optionparser.accepts("client", "Include client generators");
+ OptionSpec optionspec2 = optionparser.accepts("all", "Include all generators");
+ OptionSpec optionspec3 = optionparser.accepts("output", "Output folder").withRequiredArg().defaultsTo("generated");
++ OptionSpec inputSpec = optionparser.accepts("input", "Input folder").withRequiredArg();
++ var loader = net.minecraftforge.data.loading.DatagenModLoader.setup(optionparser, true);
+ OptionSet optionset = optionparser.parse(p_375526_);
+- if (!optionset.has(optionspec) && optionset.hasOptions()) {
++ if (!optionset.has(optionspec) && optionset.hasOptions() && loader.hasArgs(optionset)) {
++ var input = optionset.valuesOf(inputSpec).stream().map(Paths::get).toList();
+ Path path = Paths.get(optionspec3.value(optionset));
+ boolean flag = optionset.has(optionspec2);
+ boolean flag1 = flag || optionset.has(optionspec1);
+ Bootstrap.bootStrap();
+ ClientBootstrap.bootstrap();
++ if (!loader.run(optionset, path, input, flag, flag1, flag, flag, false))
++ return;
+ DataGenerator datagenerator = new DataGenerator(path, SharedConstants.getCurrentVersion(), true);
+ addClientProviders(datagenerator, flag1);
+ datagenerator.run();
diff --git a/patches/minecraft/net/minecraft/client/gui/Font.java.patch b/patches/minecraft/net/minecraft/client/gui/Font.java.patch
index 1383e43f3b..6df7351abb 100644
--- a/patches/minecraft/net/minecraft/client/gui/Font.java.patch
+++ b/patches/minecraft/net/minecraft/client/gui/Font.java.patch
@@ -1,11 +1,11 @@
--- a/net/minecraft/client/gui/Font.java
+++ b/net/minecraft/client/gui/Font.java
-@@ -33,7 +_,7 @@
- import org.joml.Vector3f;
+@@ -32,7 +_,7 @@
+ import org.joml.Matrix4f;
@OnlyIn(Dist.CLIENT)
-public class Font {
+public class Font implements net.minecraftforge.client.extensions.IForgeFont {
private static final float EFFECT_DEPTH = 0.01F;
- private static final Vector3f SHADOW_OFFSET = new Vector3f(0.0F, 0.0F, 0.03F);
- public static final int ALPHA_CUTOFF = 8;
+ public static final float SHADOW_DEPTH = 0.03F;
+ public static final int NO_SHADOW = 0;
diff --git a/patches/minecraft/net/minecraft/client/gui/GuiGraphics.java.patch b/patches/minecraft/net/minecraft/client/gui/GuiGraphics.java.patch
index 3f5471e921..deef495d95 100644
--- a/patches/minecraft/net/minecraft/client/gui/GuiGraphics.java.patch
+++ b/patches/minecraft/net/minecraft/client/gui/GuiGraphics.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/gui/GuiGraphics.java
+++ b/net/minecraft/client/gui/GuiGraphics.java
-@@ -53,7 +_,7 @@
+@@ -52,7 +_,7 @@
import org.joml.Vector2ic;
@OnlyIn(Dist.CLIENT)
@@ -9,7 +9,7 @@
public static final float MAX_GUI_Z = 10000.0F;
public static final float MIN_GUI_Z = -10000.0F;
private static final int EXTRA_SPACE_AFTER_FIRST_TOOLTIP_LINE = 2;
-@@ -227,6 +_,11 @@
+@@ -229,6 +_,11 @@
}
public int drawString(Font p_283343_, @Nullable String p_281896_, int p_283569_, int p_283418_, int p_281560_, boolean p_282130_) {
@@ -21,7 +21,7 @@
return p_281896_ == null
? 0
: p_283343_.drawInBatch(
-@@ -248,6 +_,11 @@
+@@ -250,6 +_,11 @@
}
public int drawString(Font p_282636_, FormattedCharSequence p_281596_, int p_281586_, int p_282816_, int p_281743_, boolean p_282394_) {
@@ -33,7 +33,7 @@
return p_282636_.drawInBatch(
p_281596_,
(float)p_281586_,
-@@ -872,6 +_,7 @@
+@@ -859,6 +_,7 @@
CrashReport crashreport = CrashReport.forThrowable(throwable, "Rendering item");
CrashReportCategory crashreportcategory = crashreport.addCategory("Item being rendered");
crashreportcategory.setDetail("Item Type", () -> String.valueOf(p_281675_.getItem()));
@@ -41,7 +41,7 @@
crashreportcategory.setDetail("Item Components", () -> String.valueOf(p_281675_.getComponents()));
crashreportcategory.setDetail("Item Foil", () -> String.valueOf(p_281675_.hasFoil()));
throw new ReportedException(crashreport);
-@@ -892,13 +_,24 @@
+@@ -879,13 +_,24 @@
this.renderItemCount(p_282005_, p_283349_, p_282641_, p_282146_, p_282803_);
this.renderItemCooldown(p_283349_, p_282641_, p_282146_);
this.pose.popPose();
@@ -66,7 +66,7 @@
}
public void renderTooltip(Font p_283128_, List p_282716_, Optional p_281682_, int p_283678_, int p_281696_) {
-@@ -908,8 +_,7 @@
+@@ -895,8 +_,7 @@
public void renderTooltip(
Font p_362491_, List p_368544_, Optional p_362815_, int p_366300_, int p_368952_, @Nullable ResourceLocation p_368469_
) {
@@ -76,7 +76,7 @@
this.renderTooltipInternal(p_362491_, list, p_366300_, p_368952_, DefaultTooltipPositioner.INSTANCE, p_368469_);
}
-@@ -922,7 +_,22 @@
+@@ -909,7 +_,22 @@
}
public void renderComponentTooltip(Font p_282739_, List p_281832_, int p_282191_, int p_282446_) {
@@ -100,7 +100,7 @@
}
public void renderComponentTooltip(Font p_369090_, List p_365405_, int p_368143_, int p_366244_, @Nullable ResourceLocation p_364763_) {
-@@ -964,11 +_,13 @@
+@@ -951,11 +_,13 @@
@Nullable ResourceLocation p_368234_
) {
if (!p_282615_.isEmpty()) {
@@ -115,7 +115,7 @@
if (k > i) {
i = k;
}
-@@ -978,18 +_,19 @@
+@@ -965,18 +_,19 @@
int i2 = i;
int j2 = j;
@@ -138,7 +138,7 @@
k1 += clienttooltipcomponent1.getHeight(p_282675_) + (l1 == 0 ? 2 : 0);
}
-@@ -997,7 +_,7 @@
+@@ -984,7 +_,7 @@
for (int k2 = 0; k2 < p_282615_.size(); k2++) {
ClientTooltipComponent clienttooltipcomponent2 = p_282615_.get(k2);
@@ -147,7 +147,7 @@
k1 += clienttooltipcomponent2.getHeight(p_282675_) + (k2 == 0 ? 2 : 0);
}
-@@ -1054,6 +_,10 @@
+@@ -1041,6 +_,10 @@
}
}
}
diff --git a/patches/minecraft/net/minecraft/client/gui/components/AbstractWidget.java.patch b/patches/minecraft/net/minecraft/client/gui/components/AbstractWidget.java.patch
index 0f91a10ba9..d64f8cacdc 100644
--- a/patches/minecraft/net/minecraft/client/gui/components/AbstractWidget.java.patch
+++ b/patches/minecraft/net/minecraft/client/gui/components/AbstractWidget.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/gui/components/AbstractWidget.java
+++ b/net/minecraft/client/gui/components/AbstractWidget.java
-@@ -259,6 +_,25 @@
+@@ -250,6 +_,25 @@
this.focused = p_93693_;
}
diff --git a/patches/minecraft/net/minecraft/client/gui/screens/LoadingOverlay.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/LoadingOverlay.java.patch
index d91b950e22..5c59bdff1f 100644
--- a/patches/minecraft/net/minecraft/client/gui/screens/LoadingOverlay.java.patch
+++ b/patches/minecraft/net/minecraft/client/gui/screens/LoadingOverlay.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/gui/screens/LoadingOverlay.java
+++ b/net/minecraft/client/gui/screens/LoadingOverlay.java
-@@ -62,6 +_,8 @@
+@@ -61,6 +_,8 @@
return p_169325_ & 16777215 | p_169326_ << 24;
}
@@ -9,7 +9,7 @@
@Override
public void render(GuiGraphics p_281839_, int p_282704_, int p_283650_, float p_283394_) {
int i = p_281839_.guiWidth();
-@@ -100,6 +_,7 @@
+@@ -99,6 +_,7 @@
f2 = 1.0F;
}
@@ -17,7 +17,7 @@
int k2 = (int)((double)p_281839_.guiWidth() * 0.5);
int l2 = (int)((double)p_281839_.guiHeight() * 0.5);
double d1 = Math.min((double)p_281839_.guiWidth() * 0.75, (double)p_281839_.guiHeight()) * 0.25;
-@@ -115,12 +_,14 @@
+@@ -114,12 +_,14 @@
if (f < 1.0F) {
this.drawProgressBar(p_281839_, i / 2 - j1, l1 - 5, i / 2 + j1, l1 + 5, 1.0F - Mth.clamp(f, 0.0F, 1.0F));
}
@@ -32,7 +32,7 @@
try {
this.reload.checkExceptions();
this.onFinish.accept(Optional.empty());
-@@ -128,7 +_,6 @@
+@@ -127,7 +_,6 @@
this.onFinish.accept(Optional.of(throwable));
}
diff --git a/patches/minecraft/net/minecraft/client/gui/screens/TitleScreen.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/TitleScreen.java.patch
index 0e956fe57f..f66092ddbf 100644
--- a/patches/minecraft/net/minecraft/client/gui/screens/TitleScreen.java.patch
+++ b/patches/minecraft/net/minecraft/client/gui/screens/TitleScreen.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/gui/screens/TitleScreen.java
+++ b/net/minecraft/client/gui/screens/TitleScreen.java
-@@ -60,6 +_,7 @@
+@@ -58,6 +_,7 @@
private boolean fading;
private long fadeInStart;
private final LogoRenderer logoRenderer;
@@ -8,7 +8,7 @@
public TitleScreen() {
this(false);
-@@ -115,11 +_,15 @@
+@@ -111,11 +_,15 @@
int j = this.width - i - 2;
int k = 24;
int l = this.height / 4 + 48;
@@ -24,7 +24,7 @@
l = this.createTestWorldButton(l, 24);
SpriteIconButton spriteiconbutton = this.addRenderableWidget(
-@@ -184,7 +_,7 @@
+@@ -180,7 +_,7 @@
}).bounds(this.width / 2 - 100, i = p_96764_ + p_96765_, 200, 20).tooltip(tooltip).build()).active = flag;
this.addRenderableWidget(
Button.builder(Component.translatable("menu.online"), p_325369_ -> this.minecraft.setScreen(new RealmsMainScreen(this)))
@@ -33,7 +33,7 @@
.tooltip(tooltip)
.build()
)
-@@ -293,6 +_,7 @@
+@@ -289,6 +_,7 @@
if ((i & -67108864) != 0) {
super.render(p_282860_, p_281753_, p_283539_, p_282628_);
this.logoRenderer.renderLogo(p_282860_, this.width, f);
@@ -41,7 +41,7 @@
if (this.splash != null && !this.minecraft.options.hideSplashTexts().get()) {
this.splash.render(p_282860_, this.width, this.font, i);
}
-@@ -308,10 +_,18 @@
+@@ -304,10 +_,18 @@
s = s + I18n.get("menu.modded");
}
diff --git a/patches/minecraft/net/minecraft/client/gui/screens/inventory/AbstractContainerScreen.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/inventory/AbstractContainerScreen.java.patch
index 86593465a8..f12164fe27 100644
--- a/patches/minecraft/net/minecraft/client/gui/screens/inventory/AbstractContainerScreen.java.patch
+++ b/patches/minecraft/net/minecraft/client/gui/screens/inventory/AbstractContainerScreen.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/gui/screens/inventory/AbstractContainerScreen.java
+++ b/net/minecraft/client/gui/screens/inventory/AbstractContainerScreen.java
-@@ -108,6 +_,7 @@
+@@ -106,6 +_,7 @@
int i = this.leftPos;
int j = this.topPos;
super.render(p_283479_, p_283661_, p_281248_, p_281886_);
@@ -8,7 +8,7 @@
p_283479_.pose().pushPose();
p_283479_.pose().translate((float)i, (float)j, 0.0F);
Slot slot = this.hoveredSlot;
-@@ -119,6 +_,8 @@
+@@ -117,6 +_,8 @@
this.onStopHovering(slot);
}
@@ -17,7 +17,7 @@
this.renderLabels(p_283479_, p_283661_, p_281248_);
ItemStack itemstack = this.draggingItem.isEmpty() ? this.menu.getCarried() : this.draggingItem;
if (!itemstack.isEmpty()) {
-@@ -199,7 +_,7 @@
+@@ -197,7 +_,7 @@
ItemStack itemstack = this.hoveredSlot.getItem();
if (this.menu.getCarried().isEmpty() || this.showTooltipWithItemInHand(itemstack)) {
p_283594_.renderTooltip(
@@ -26,7 +26,7 @@
);
}
}
-@@ -217,7 +_,8 @@
+@@ -215,7 +_,8 @@
p_282567_.pose().pushPose();
p_282567_.pose().translate(0.0F, 0.0F, 232.0F);
p_282567_.renderItem(p_281330_, p_281772_, p_281689_);
@@ -36,7 +36,7 @@
p_282567_.pose().popPose();
}
-@@ -324,7 +_,8 @@
+@@ -321,7 +_,8 @@
if (super.mouseClicked(p_97748_, p_97749_, p_97750_)) {
return true;
} else {
@@ -46,7 +46,7 @@
Slot slot = this.getHoveredSlot(p_97748_, p_97749_);
long i = Util.getMillis();
this.doubleclick = this.lastClickSlot == slot && i - this.lastClickTime < 250L && this.lastClickButton == p_97750_;
-@@ -335,6 +_,7 @@
+@@ -332,6 +_,7 @@
int j = this.leftPos;
int k = this.topPos;
boolean flag1 = this.hasClickedOutside(p_97748_, p_97749_, j, k, p_97750_);
@@ -54,7 +54,7 @@
int l = -1;
if (slot != null) {
l = slot.index;
-@@ -360,7 +_,7 @@
+@@ -357,7 +_,7 @@
}
} else if (!this.isQuickCrafting) {
if (this.menu.getCarried().isEmpty()) {
@@ -63,7 +63,7 @@
this.slotClicked(slot, l, p_97750_, ClickType.CLONE);
} else {
boolean flag2 = l != -999
-@@ -388,7 +_,7 @@
+@@ -385,7 +_,7 @@
this.quickCraftingType = 0;
} else if (p_97750_ == 1) {
this.quickCraftingType = 1;
@@ -72,7 +72,7 @@
this.quickCraftingType = 2;
}
}
-@@ -467,10 +_,13 @@
+@@ -464,10 +_,13 @@
@Override
public boolean mouseReleased(double p_97812_, double p_97813_, int p_97814_) {
@@ -86,7 +86,7 @@
int k = -1;
if (slot != null) {
k = slot.index;
-@@ -487,7 +_,7 @@
+@@ -484,7 +_,7 @@
if (slot2 != null
&& slot2.mayPickup(this.minecraft.player)
&& slot2.hasItem()
@@ -95,7 +95,7 @@
&& AbstractContainerMenu.canItemQuickReplace(slot2, this.lastQuickMoved, true)) {
this.slotClicked(slot2, slot2.index, p_97814_, ClickType.QUICK_MOVE);
}
-@@ -551,7 +_,7 @@
+@@ -548,7 +_,7 @@
this.slotClicked(null, -999, AbstractContainerMenu.getQuickcraftMask(2, this.quickCraftingType), ClickType.QUICK_CRAFT);
} else if (!this.menu.getCarried().isEmpty()) {
@@ -104,7 +104,7 @@
this.slotClicked(slot, k, p_97814_, ClickType.CLONE);
} else {
boolean flag1 = k != -999
-@@ -631,9 +_,10 @@
+@@ -628,9 +_,10 @@
@Override
public boolean keyPressed(int p_97765_, int p_97766_, int p_97767_) {
@@ -116,7 +116,7 @@
this.onClose();
return true;
} else {
-@@ -707,4 +_,11 @@
+@@ -704,4 +_,11 @@
super.onClose();
}
diff --git a/patches/minecraft/net/minecraft/client/gui/screens/inventory/CreativeModeInventoryScreen.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/inventory/CreativeModeInventoryScreen.java.patch
index 3be90137b4..91cf1163ff 100644
--- a/patches/minecraft/net/minecraft/client/gui/screens/inventory/CreativeModeInventoryScreen.java.patch
+++ b/patches/minecraft/net/minecraft/client/gui/screens/inventory/CreativeModeInventoryScreen.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/gui/screens/inventory/CreativeModeInventoryScreen.java
+++ b/net/minecraft/client/gui/screens/inventory/CreativeModeInventoryScreen.java
-@@ -115,6 +_,8 @@
+@@ -114,6 +_,8 @@
private final Set> visibleTags = new HashSet<>();
private final boolean displayOperatorCreativeTab;
private final EffectsInInventory effects;
@@ -9,7 +9,7 @@
public CreativeModeInventoryScreen(LocalPlayer p_344408_, FeatureFlagSet p_260074_, boolean p_259569_) {
super(new CreativeModeInventoryScreen.ItemPickerMenu(p_344408_), p_344408_.getInventory(), CommonComponents.EMPTY);
-@@ -163,7 +_,7 @@
+@@ -162,7 +_,7 @@
private void refreshCurrentTabContents(Collection p_261591_) {
int i = this.menu.getRowIndexForScroll(this.scrollOffs);
this.menu.items.clear();
@@ -18,7 +18,7 @@
this.refreshSearchResults();
} else {
this.menu.items.addAll(p_261591_);
-@@ -331,6 +_,35 @@
+@@ -330,6 +_,35 @@
protected void init() {
if (this.minecraft.gameMode.hasInfiniteItems()) {
super.init();
@@ -54,7 +54,7 @@
this.searchBox = new EditBox(this.font, this.leftPos + 82, this.topPos + 6, 80, 9, Component.translatable("itemGroup.search"));
this.searchBox.setMaxLength(50);
this.searchBox.setBordered(false);
-@@ -377,7 +_,7 @@
+@@ -376,7 +_,7 @@
public boolean charTyped(char p_98521_, int p_98522_) {
if (this.ignoreTextInput) {
return false;
@@ -63,7 +63,7 @@
return false;
} else {
String s = this.searchBox.getValue();
-@@ -396,7 +_,7 @@
+@@ -395,7 +_,7 @@
@Override
public boolean keyPressed(int p_98547_, int p_98548_, int p_98549_) {
this.ignoreTextInput = false;
@@ -72,7 +72,7 @@
if (this.minecraft.options.keyChat.matches(p_98547_, p_98548_)) {
this.ignoreTextInput = true;
this.selectTab(CreativeModeTabs.searchTab());
-@@ -432,6 +_,7 @@
+@@ -431,6 +_,7 @@
}
private void refreshSearchResults() {
@@ -80,7 +80,7 @@
this.menu.items.clear();
this.visibleTags.clear();
String s = this.searchBox.getValue();
-@@ -444,10 +_,10 @@
+@@ -443,10 +_,10 @@
SearchTree searchtree;
if (s.startsWith("#")) {
s = s.substring(1);
@@ -93,7 +93,7 @@
}
this.menu.items.addAll(searchtree.search(s.toLowerCase(Locale.ROOT)));
-@@ -479,7 +_,8 @@
+@@ -478,7 +_,8 @@
@Override
protected void renderLabels(GuiGraphics p_283168_, int p_281774_, int p_281466_) {
if (selectedTab.showTitle()) {
@@ -103,7 +103,7 @@
}
}
-@@ -489,7 +_,7 @@
+@@ -488,7 +_,7 @@
double d0 = p_98531_ - (double)this.leftPos;
double d1 = p_98532_ - (double)this.topPos;
@@ -112,7 +112,7 @@
if (this.checkTabClicked(creativemodetab, d0, d1)) {
return true;
}
-@@ -511,7 +_,7 @@
+@@ -510,7 +_,7 @@
double d1 = p_98623_ - (double)this.topPos;
this.scrolling = false;
@@ -121,7 +121,7 @@
if (this.checkTabClicked(creativemodetab, d0, d1)) {
this.selectTab(creativemodetab);
return true;
-@@ -605,13 +_,15 @@
+@@ -604,13 +_,15 @@
this.originalSlots = null;
}
@@ -138,7 +138,7 @@
this.refreshSearchResults();
} else {
-@@ -677,7 +_,15 @@
+@@ -676,7 +_,15 @@
super.render(p_283000_, p_281317_, p_282770_, p_281295_);
this.effects.render(p_283000_, p_281317_, p_282770_, p_281295_);
@@ -155,7 +155,7 @@
if (this.checkTabHovering(p_283000_, creativemodetab, p_281317_, p_282770_)) {
break;
}
-@@ -689,6 +_,7 @@
+@@ -688,6 +_,7 @@
p_283000_.renderTooltip(this.font, TRASH_SLOT_TOOLTIP, p_281317_, p_282770_);
}
@@ -163,7 +163,7 @@
this.renderTooltip(p_283000_, p_281317_, p_282770_);
}
-@@ -701,7 +_,7 @@
+@@ -700,7 +_,7 @@
public List getTooltipFromContainerItem(ItemStack p_281769_) {
boolean flag = this.hoveredSlot != null && this.hoveredSlot instanceof CreativeModeInventoryScreen.CustomCreativeSlot;
boolean flag1 = selectedTab.getType() == CreativeModeTab.Type.CATEGORY;
@@ -172,7 +172,7 @@
TooltipFlag.Default tooltipflag$default = this.minecraft.options.advancedItemTooltips ? TooltipFlag.Default.ADVANCED : TooltipFlag.Default.NORMAL;
TooltipFlag tooltipflag = flag ? tooltipflag$default.asCreative() : tooltipflag$default;
List list = p_281769_.getTooltipLines(Item.TooltipContext.of(this.minecraft.level), this.minecraft.player, tooltipflag);
-@@ -720,7 +_,7 @@
+@@ -719,7 +_,7 @@
int i = 1;
for (CreativeModeTab creativemodetab : CreativeModeTabs.tabs()) {
@@ -181,7 +181,7 @@
list1.add(i++, creativemodetab.getDisplayName().copy().withStyle(ChatFormatting.BLUE));
}
}
-@@ -731,7 +_,7 @@
+@@ -730,7 +_,7 @@
@Override
protected void renderBg(GuiGraphics p_282663_, float p_282504_, int p_282089_, int p_282249_) {
@@ -190,7 +190,7 @@
if (creativemodetab != selectedTab) {
this.renderTabButton(p_282663_, creativemodetab);
}
-@@ -747,6 +_,7 @@
+@@ -746,6 +_,7 @@
p_282663_.blitSprite(RenderType::guiTextured, resourcelocation, j, k + (int)((float)(i - k - 17) * this.scrollOffs), 12, 15);
}
@@ -198,7 +198,7 @@
this.renderTabButton(p_282663_, selectedTab);
if (selectedTab.getType() == CreativeModeTab.Type.INVENTORY) {
InventoryScreen.renderEntityInInventoryFollowsMouse(
-@@ -765,7 +_,7 @@
+@@ -764,7 +_,7 @@
}
private int getTabX(CreativeModeTab p_260136_) {
@@ -207,7 +207,7 @@
int j = 27;
int k = 27 * i;
if (p_260136_.isAlignedRight()) {
-@@ -777,7 +_,7 @@
+@@ -776,7 +_,7 @@
private int getTabY(CreativeModeTab p_260181_) {
int i = 0;
@@ -216,7 +216,7 @@
i -= 32;
} else {
i += this.imageHeight;
-@@ -805,8 +_,8 @@
+@@ -804,8 +_,8 @@
protected void renderTabButton(GuiGraphics p_283590_, CreativeModeTab p_283489_) {
boolean flag = p_283489_ == selectedTab;
@@ -227,7 +227,7 @@
int j = this.leftPos + this.getTabX(p_283489_);
int k = this.topPos - (flag1 ? 28 : -(this.imageHeight - 4));
ResourceLocation[] aresourcelocation;
-@@ -816,6 +_,7 @@
+@@ -815,6 +_,7 @@
aresourcelocation = flag ? SELECTED_BOTTOM_TABS : UNSELECTED_BOTTOM_TABS;
}
@@ -235,7 +235,7 @@
p_283590_.blitSprite(RenderType::guiTextured, aresourcelocation[Mth.clamp(i, 0, aresourcelocation.length)], j, k, 26, 32);
p_283590_.pose().pushPose();
p_283590_.pose().translate(0.0F, 0.0F, 100.0F);
-@@ -857,6 +_,14 @@
+@@ -856,6 +_,14 @@
}
}
@@ -250,7 +250,7 @@
@OnlyIn(Dist.CLIENT)
static class CustomCreativeSlot extends Slot {
public CustomCreativeSlot(Container p_98633_, int p_98634_, int p_98635_, int p_98636_) {
-@@ -1038,6 +_,22 @@
+@@ -1037,6 +_,22 @@
@Override
public boolean mayPickup(Player p_98665_) {
return this.target.mayPickup(p_98665_);
@@ -267,8 +267,8 @@
+ }
+
+ @Override
-+ public Slot setBackground(ResourceLocation atlas, ResourceLocation sprite) {
-+ this.target.setBackground(atlas, sprite);
++ public Slot setBackground(ResourceLocation sprite) {
++ this.target.setBackground(sprite);
+ return this;
}
}
diff --git a/patches/minecraft/net/minecraft/client/gui/screens/inventory/EnchantmentScreen.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/inventory/EnchantmentScreen.java.patch
index 8dc2658742..53c7b11e43 100644
--- a/patches/minecraft/net/minecraft/client/gui/screens/inventory/EnchantmentScreen.java.patch
+++ b/patches/minecraft/net/minecraft/client/gui/screens/inventory/EnchantmentScreen.java.patch
@@ -8,7 +8,7 @@
+ if (((k < l + 1 || this.minecraft.player.experienceLevel < k1) && !this.minecraft.player.getAbilities().instabuild) || this.menu.enchantClue[l] == -1) { // Forge: render buttons as disabled when enchantable but enchantability not met on lower levels{
p_282430_.blitSprite(RenderType::guiTextured, ENCHANTMENT_SLOT_DISABLED_SPRITE, i1, j + 14 + 19 * l, 108, 19);
p_282430_.blitSprite(RenderType::guiTextured, DISABLED_LEVEL_SPRITES[l], i1 + 1, j + 15 + 19 * l, 16, 16);
- p_282430_.drawWordWrap(this.font, formattedtext, j1, j + 16 + 19 * l, l1, (i2 & 16711422) >> 1);
+ p_282430_.drawWordWrap(this.font, formattedtext, j1, j + 16 + 19 * l, l1, (i2 & 16711422) >> 1, false);
@@ -175,13 +_,16 @@
.registryAccess()
.lookupOrThrow(Registries.ENCHANTMENT)
diff --git a/patches/minecraft/net/minecraft/client/gui/screens/multiplayer/ServerSelectionList.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/multiplayer/ServerSelectionList.java.patch
index 54a177cf52..02981c1a46 100644
--- a/patches/minecraft/net/minecraft/client/gui/screens/multiplayer/ServerSelectionList.java.patch
+++ b/patches/minecraft/net/minecraft/client/gui/screens/multiplayer/ServerSelectionList.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/gui/screens/multiplayer/ServerSelectionList.java
+++ b/net/minecraft/client/gui/screens/multiplayer/ServerSelectionList.java
-@@ -372,6 +_,8 @@
+@@ -371,6 +_,8 @@
this.screen.setTooltipForNextRenderPass(Lists.transform(this.onlinePlayersTooltip, Component::getVisualOrderText));
}
diff --git a/patches/minecraft/net/minecraft/client/gui/screens/options/controls/KeyBindsList.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/options/controls/KeyBindsList.java.patch
index 2b240ca07b..0c30ae1842 100644
--- a/patches/minecraft/net/minecraft/client/gui/screens/options/controls/KeyBindsList.java.patch
+++ b/patches/minecraft/net/minecraft/client/gui/screens/options/controls/KeyBindsList.java.patch
@@ -1,18 +1,6 @@
--- a/net/minecraft/client/gui/screens/options/controls/KeyBindsList.java
+++ b/net/minecraft/client/gui/screens/options/controls/KeyBindsList.java
-@@ -69,6 +_,11 @@
- return 340;
- }
-
-+ @Override
-+ protected int getScrollbarPosition() {
-+ return super.getScrollbarPosition() + 20;
-+ }
-+
- @OnlyIn(Dist.CLIENT)
- public class CategoryEntry extends KeyBindsList.Entry {
- final Component name;
-@@ -153,9 +_,10 @@
+@@ -148,9 +_,10 @@
this.name = p_343976_;
this.changeButton = Button.builder(p_343976_, p_342196_ -> {
KeyBindsList.this.keyBindsScreen.selectedKey = p_343088_;
@@ -24,7 +12,7 @@
.createNarration(
p_342179_ -> p_343088_.isUnbound()
? Component.translatable("narrator.controls.unbound", p_343976_)
-@@ -163,7 +_,7 @@
+@@ -158,7 +_,7 @@
)
.build();
this.resetButton = Button.builder(RESET_BUTTON_TITLE, p_357685_ -> {
@@ -33,7 +21,7 @@
KeyBindsList.this.resetMappingAndUpdateButtons();
}).bounds(0, 0, 50, 20).createNarration(p_344192_ -> Component.translatable("narrator.controls.reset", p_343976_)).build();
this.refreshEntry();
-@@ -215,7 +_,7 @@
+@@ -210,7 +_,7 @@
MutableComponent mutablecomponent = Component.empty();
if (!this.key.isUnbound()) {
for (KeyMapping keymapping : KeyBindsList.this.minecraft.options.keyMappings) {
diff --git a/patches/minecraft/net/minecraft/client/gui/screens/packs/PackSelectionScreen.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/packs/PackSelectionScreen.java.patch
index 427a059bb8..0eb7369f43 100644
--- a/patches/minecraft/net/minecraft/client/gui/screens/packs/PackSelectionScreen.java.patch
+++ b/patches/minecraft/net/minecraft/client/gui/screens/packs/PackSelectionScreen.java.patch
@@ -6,6 +6,6 @@
p_100014_.setSelected(null);
- p_100015_.forEach(
+ p_100015_.filter(PackSelectionModel.Entry::notHidden).forEach(
- p_357689_ -> {
+ p_374582_ -> {
TransferableSelectionList.PackEntry transferableselectionlist$packentry1 = new TransferableSelectionList.PackEntry(
- this.minecraft, p_100014_, p_357689_
+ this.minecraft, p_100014_, p_374582_
diff --git a/patches/minecraft/net/minecraft/client/gui/screens/worldselection/CreateWorldScreen.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/worldselection/CreateWorldScreen.java.patch
index f98ff819c0..8362cba197 100644
--- a/patches/minecraft/net/minecraft/client/gui/screens/worldselection/CreateWorldScreen.java.patch
+++ b/patches/minecraft/net/minecraft/client/gui/screens/worldselection/CreateWorldScreen.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/gui/screens/worldselection/CreateWorldScreen.java
+++ b/net/minecraft/client/gui/screens/worldselection/CreateWorldScreen.java
-@@ -169,6 +_,7 @@
+@@ -168,6 +_,7 @@
) {
queueLoadScreen(p_369292_, PREPARING_WORLD_DATA);
PackRepository packrepository = new PackRepository(new ServerPacksSource(p_369292_.directoryValidator()));
@@ -8,7 +8,7 @@
WorldLoader.InitConfig worldloader$initconfig = createDefaultLoadConfig(packrepository, WorldDataConfiguration.DEFAULT);
CompletableFuture completablefuture = WorldLoader.load(
worldloader$initconfig,
-@@ -479,7 +_,7 @@
+@@ -468,7 +_,7 @@
if (p_269627_) {
p_270552_.accept(this.uiState.getSettings().dataConfiguration());
} else {
@@ -17,7 +17,7 @@
}
},
Component.translatable("dataPack.validation.failed"),
-@@ -593,6 +_,7 @@
+@@ -582,6 +_,7 @@
if (path != null) {
if (this.tempDataPackRepository == null) {
this.tempDataPackRepository = ServerPacksSource.createPackRepository(path, this.packValidator);
diff --git a/patches/minecraft/net/minecraft/client/gui/screens/worldselection/WorldSelectionList.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/worldselection/WorldSelectionList.java.patch
index 8943dc5e1f..6bd3d9a61a 100644
--- a/patches/minecraft/net/minecraft/client/gui/screens/worldselection/WorldSelectionList.java.patch
+++ b/patches/minecraft/net/minecraft/client/gui/screens/worldselection/WorldSelectionList.java.patch
@@ -9,8 +9,8 @@
static final Component FROM_NEWER_TOOLTIP_2 = Component.translatable("selectWorld.tooltip.fromNewerVersion2").withStyle(ChatFormatting.RED);
static final Component SNAPSHOT_TOOLTIP_1 = Component.translatable("selectWorld.tooltip.snapshot1").withStyle(ChatFormatting.GOLD);
@@ -400,6 +_,7 @@
- p_281612_.drawString(this.minecraft.font, s1, p_282820_ + 32 + 3, p_283181_ + 9 + 3, -8355712, false);
- p_281612_.drawString(this.minecraft.font, component, p_282820_ + 32 + 3, p_283181_ + 9 + 9 + 3, -8355712, false);
+ p_281612_.drawString(this.minecraft.font, s1, p_282820_ + 32 + 3, p_283181_ + 9 + 3, -8355712);
+ p_281612_.drawString(this.minecraft.font, component, p_282820_ + 32 + 3, p_283181_ + 9 + 9 + 3, -8355712);
p_281612_.blit(RenderType::guiTextured, this.icon.textureLocation(), p_282820_, p_283181_, 0.0F, 0.0F, 32, 32, 32, 32);
+ renderExperimentalWarning(p_281612_, p_283204_, p_283025_, p_283181_, p_282820_);
if (this.minecraft.options.touchscreen().get() || p_283396_) {
diff --git a/patches/minecraft/net/minecraft/client/main/Main.java.patch b/patches/minecraft/net/minecraft/client/main/Main.java.patch
index 6aba45470a..00ebccb940 100644
--- a/patches/minecraft/net/minecraft/client/main/Main.java.patch
+++ b/patches/minecraft/net/minecraft/client/main/Main.java.patch
@@ -1,12 +1,13 @@
--- a/net/minecraft/client/main/Main.java
+++ b/net/minecraft/client/main/Main.java
-@@ -120,8 +_,8 @@
+@@ -121,8 +_,8 @@
CrashReport.preload();
logger = LogUtils.getLogger();
s1 = "Bootstrap";
- Bootstrap.bootStrap();
- GameLoadTimesEvent.INSTANCE.setBootstrapTime(Bootstrap.bootstrapDuration.get());
+- ClientBootstrap.bootstrap();
+ net.minecraftforge.fml.loading.BackgroundWaiter.runAndTick(Bootstrap::bootStrap, net.minecraftforge.fml.loading.FMLLoader.progressWindowTick);
++ net.minecraftforge.fml.loading.BackgroundWaiter.runAndTick(ClientBootstrap::bootstrap, net.minecraftforge.fml.loading.FMLLoader.progressWindowTick);
+ GameLoadTimesEvent.INSTANCE.setBootstrapTime(Bootstrap.bootstrapDuration.get());
Bootstrap.validate();
s1 = "Argument parsing";
- List list = optionset.valuesOf(optionspec29);
diff --git a/patches/minecraft/net/minecraft/client/model/HumanoidModel.java.patch b/patches/minecraft/net/minecraft/client/model/HumanoidModel.java.patch
index 7e4692ecab..b1c8dc5313 100644
--- a/patches/minecraft/net/minecraft/client/model/HumanoidModel.java.patch
+++ b/patches/minecraft/net/minecraft/client/model/HumanoidModel.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/model/HumanoidModel.java
+++ b/net/minecraft/client/model/HumanoidModel.java
-@@ -259,6 +_,8 @@
+@@ -255,6 +_,8 @@
case BRUSH:
this.rightArm.xRot = this.rightArm.xRot * 0.5F - (float) (Math.PI / 5);
this.rightArm.yRot = 0.0F;
@@ -9,7 +9,7 @@
}
}
-@@ -303,6 +_,8 @@
+@@ -299,6 +_,8 @@
case BRUSH:
this.leftArm.xRot = this.leftArm.xRot * 0.5F - (float) (Math.PI / 5);
this.leftArm.yRot = 0.0F;
@@ -18,7 +18,7 @@
}
}
-@@ -381,7 +_,7 @@
+@@ -377,7 +_,7 @@
}
@OnlyIn(Dist.CLIENT)
@@ -27,7 +27,7 @@
EMPTY(false),
ITEM(false),
BLOCK(false),
-@@ -397,10 +_,28 @@
+@@ -393,10 +_,28 @@
private ArmPose(final boolean p_102896_) {
this.twoHanded = p_102896_;
diff --git a/patches/minecraft/net/minecraft/client/model/geom/LayerDefinitions.java.patch b/patches/minecraft/net/minecraft/client/model/geom/LayerDefinitions.java.patch
index 14e14cbcc2..802af04216 100644
--- a/patches/minecraft/net/minecraft/client/model/geom/LayerDefinitions.java.patch
+++ b/patches/minecraft/net/minecraft/client/model/geom/LayerDefinitions.java.patch
@@ -1,8 +1,8 @@
--- a/net/minecraft/client/model/geom/LayerDefinitions.java
+++ b/net/minecraft/client/model/geom/LayerDefinitions.java
-@@ -449,6 +_,7 @@
- builder.put(ModelLayers.createWallSignModelName(p_357774_), layerdefinition54);
- builder.put(ModelLayers.createHangingSignModelName(p_357774_), layerdefinition55);
+@@ -464,6 +_,7 @@
+ builder.put(ModelLayers.createHangingSignModelName(p_374591_, hangingsignrenderer$attachmenttype), layerdefinition55);
+ }
});
+ net.minecraftforge.client.ForgeHooksClient.loadLayerDefinitions(builder);
ImmutableMap immutablemap = builder.build();
diff --git a/patches/minecraft/net/minecraft/client/model/geom/ModelLayers.java.patch b/patches/minecraft/net/minecraft/client/model/geom/ModelLayers.java.patch
index d8b287cfb9..d0200e2142 100644
--- a/patches/minecraft/net/minecraft/client/model/geom/ModelLayers.java.patch
+++ b/patches/minecraft/net/minecraft/client/model/geom/ModelLayers.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/model/geom/ModelLayers.java
+++ b/net/minecraft/client/model/geom/ModelLayers.java
-@@ -301,15 +_,18 @@
+@@ -308,15 +_,18 @@
}
public static ModelLayerLocation createStandingSignModelName(WoodType p_171292_) {
@@ -15,10 +15,10 @@
+ return new ModelLayerLocation(ResourceLocation.fromNamespaceAndPath(location.getNamespace(), "sign/wall/" + location.getPath()), "main");
}
- public static ModelLayerLocation createHangingSignModelName(WoodType p_252225_) {
-- return createLocation("hanging_sign/" + p_252225_.name(), "main");
+ public static ModelLayerLocation createHangingSignModelName(WoodType p_252225_, HangingSignRenderer.AttachmentType p_378070_) {
+- return createLocation("hanging_sign/" + p_252225_.name() + "/" + p_378070_.getSerializedName(), "main");
+ ResourceLocation location = ResourceLocation.parse(p_252225_.name());
-+ return new ModelLayerLocation(ResourceLocation.fromNamespaceAndPath(location.getNamespace(), "hanging_sign/" + location.getPath()), "main");
++ return new ModelLayerLocation(ResourceLocation.fromNamespaceAndPath(location.getNamespace(), "hanging_sign/" + location.getPath() + "/" + p_378070_.getSerializedName()), "main");
}
public static Stream getKnownLocations() {
diff --git a/patches/minecraft/net/minecraft/client/multiplayer/ClientChunkCache.java.patch b/patches/minecraft/net/minecraft/client/multiplayer/ClientChunkCache.java.patch
index 34a6e9d7d1..1621efa410 100644
--- a/patches/minecraft/net/minecraft/client/multiplayer/ClientChunkCache.java.patch
+++ b/patches/minecraft/net/minecraft/client/multiplayer/ClientChunkCache.java.patch
@@ -8,7 +8,7 @@
this.storage.drop(i, levelchunk);
}
}
-@@ -123,6 +_,7 @@
+@@ -124,6 +_,7 @@
}
this.level.onChunkLoaded(chunkpos);
diff --git a/patches/minecraft/net/minecraft/client/multiplayer/ClientLevel.java.patch b/patches/minecraft/net/minecraft/client/multiplayer/ClientLevel.java.patch
index 6e062759b9..6858b16c24 100644
--- a/patches/minecraft/net/minecraft/client/multiplayer/ClientLevel.java.patch
+++ b/patches/minecraft/net/minecraft/client/multiplayer/ClientLevel.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/multiplayer/ClientLevel.java
+++ b/net/minecraft/client/multiplayer/ClientLevel.java
-@@ -118,6 +_,7 @@
+@@ -123,6 +_,7 @@
p_194170_.put(BiomeColors.GRASS_COLOR_RESOLVER, new BlockTintCache(p_194181_ -> this.calculateBlockTint(p_194181_, BiomeColors.GRASS_COLOR_RESOLVER)));
p_194170_.put(BiomeColors.FOLIAGE_COLOR_RESOLVER, new BlockTintCache(p_194177_ -> this.calculateBlockTint(p_194177_, BiomeColors.FOLIAGE_COLOR_RESOLVER)));
p_194170_.put(BiomeColors.WATER_COLOR_RESOLVER, new BlockTintCache(p_194168_ -> this.calculateBlockTint(p_194168_, BiomeColors.WATER_COLOR_RESOLVER)));
@@ -8,7 +8,7 @@
});
private final ClientChunkCache chunkSource;
private final Deque lightUpdateQueue = Queues.newArrayDeque();
-@@ -126,6 +_,8 @@
+@@ -131,6 +_,8 @@
private final int seaLevel;
private boolean tickDayTime;
private static final Set- MARKER_PARTICLE_ITEMS = Set.of(Items.BARRIER, Items.LIGHT);
@@ -17,7 +17,7 @@
public void handleBlockChangedAck(int p_233652_) {
this.blockStatePredictionHandler.endPredictionsUpTo(p_233652_, this);
-@@ -192,6 +_,8 @@
+@@ -197,6 +_,8 @@
this.serverSimulationDistance = p_364305_;
this.updateSkyBrightness();
this.prepareWeather();
@@ -26,7 +26,7 @@
}
public void queueLightUpdate(Runnable p_194172_) {
-@@ -274,6 +_,7 @@
+@@ -279,6 +_,7 @@
p_104640_.setOldPosAndRot();
p_104640_.tickCount++;
Profiler.get().push(() -> BuiltInRegistries.ENTITY_TYPE.getKey(p_104640_.getType()).toString());
@@ -34,7 +34,7 @@
p_104640_.tick();
Profiler.get().pop();
-@@ -326,8 +_,10 @@
+@@ -330,8 +_,10 @@
}
public void addEntity(Entity p_104741_) {
@@ -45,7 +45,7 @@
}
public void removeEntity(int p_171643_, Entity.RemovalReason p_171644_) {
-@@ -498,6 +_,12 @@
+@@ -502,6 +_,12 @@
float p_263349_,
long p_263408_
) {
@@ -58,7 +58,7 @@
if (p_263381_ == this.minecraft.player) {
this.playSound(p_263372_, p_263404_, p_263365_, p_263335_.value(), p_263417_, p_263416_, p_263349_, false, p_263408_);
}
-@@ -507,6 +_,12 @@
+@@ -511,6 +_,12 @@
public void playSeededSound(
@Nullable Player p_263514_, Entity p_263536_, Holder p_263518_, SoundSource p_263487_, float p_263538_, float p_263524_, long p_263509_
) {
@@ -71,7 +71,7 @@
if (p_263514_ == this.minecraft.player) {
this.minecraft.getSoundManager().play(new EntityBoundSoundInstance(p_263518_.value(), p_263487_, p_263538_, p_263524_, p_263536_, p_263509_));
}
-@@ -943,6 +_,24 @@
+@@ -953,6 +_,24 @@
return this.seaLevel;
}
@@ -96,7 +96,7 @@
@OnlyIn(Dist.CLIENT)
public static class ClientLevelData implements WritableLevelData {
private final boolean hardcore;
-@@ -1031,6 +_,7 @@
+@@ -1041,6 +_,7 @@
}
public void setDifficulty(Difficulty p_104852_) {
@@ -104,9 +104,9 @@
this.difficulty = p_104852_;
}
-@@ -1067,11 +_,26 @@
- if (p_171712_ instanceof AbstractClientPlayer) {
- ClientLevel.this.players.add((AbstractClientPlayer)p_171712_);
+@@ -1084,6 +_,12 @@
+ break;
+ default:
}
+
+ if (p_171712_.isMultipartEntity()) {
@@ -117,8 +117,11 @@
}
public void onTrackingEnd(Entity p_171716_) {
- p_171716_.unRide();
- ClientLevel.this.players.remove(p_171716_);
+@@ -1097,6 +_,15 @@
+ ClientLevel.this.dragonParts.removeAll(Arrays.asList(enderdragon.getSubEntities()));
+ break;
+ default:
++ }
+
+ p_171716_.onRemovedFromWorld();
+ net.minecraftforge.event.ForgeEventFactory.onEntityLeaveLevel(p_171716_, ClientLevel.this);
@@ -127,7 +130,6 @@
+ for (var part : p_171716_.getParts()) {
+ ClientLevel.this.partEntities.remove(part.getId());
+ }
-+ }
+ }
}
- public void onSectionChange(Entity p_233660_) {
diff --git a/patches/minecraft/net/minecraft/client/multiplayer/ClientPacketListener.java.patch b/patches/minecraft/net/minecraft/client/multiplayer/ClientPacketListener.java.patch
index 89ee62157d..8be7186f6c 100644
--- a/patches/minecraft/net/minecraft/client/multiplayer/ClientPacketListener.java.patch
+++ b/patches/minecraft/net/minecraft/client/multiplayer/ClientPacketListener.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/multiplayer/ClientPacketListener.java
+++ b/net/minecraft/client/multiplayer/ClientPacketListener.java
-@@ -451,6 +_,7 @@
+@@ -452,6 +_,7 @@
this.minecraft.debugRenderer.clear();
this.minecraft.player.resetPos();
@@ -57,7 +57,7 @@
}
@Override
-@@ -2516,6 +_,8 @@
+@@ -2530,6 +_,8 @@
}
public void sendChat(String p_249888_) {
@@ -66,7 +66,7 @@
Instant instant = Instant.now();
long i = Crypt.SaltSupplier.getLong();
LastSeenMessagesTracker.Update lastseenmessagestracker$update = this.lastSeenMessages.generateAndApplyUpdate();
-@@ -2524,6 +_,7 @@
+@@ -2538,6 +_,7 @@
}
public void sendCommand(String p_250092_) {
diff --git a/patches/minecraft/net/minecraft/client/multiplayer/MultiPlayerGameMode.java.patch b/patches/minecraft/net/minecraft/client/multiplayer/MultiPlayerGameMode.java.patch
index cfcbab4131..fe4dedbece 100644
--- a/patches/minecraft/net/minecraft/client/multiplayer/MultiPlayerGameMode.java.patch
+++ b/patches/minecraft/net/minecraft/client/multiplayer/MultiPlayerGameMode.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/multiplayer/MultiPlayerGameMode.java
+++ b/net/minecraft/client/multiplayer/MultiPlayerGameMode.java
-@@ -106,6 +_,7 @@
+@@ -107,6 +_,7 @@
}
public boolean destroyBlock(BlockPos p_105268_) {
@@ -8,7 +8,7 @@
if (this.minecraft.player.blockActionRestricted(this.minecraft.level, p_105268_, this.localPlayerMode)) {
return false;
} else {
-@@ -120,9 +_,8 @@
+@@ -121,9 +_,8 @@
} else if (blockstate.isAir()) {
return false;
} else {
@@ -19,7 +19,7 @@
if (flag) {
block.destroy(level, p_105268_, blockstate);
}
-@@ -143,6 +_,7 @@
+@@ -144,6 +_,7 @@
BlockState blockstate = this.minecraft.level.getBlockState(p_105270_);
this.minecraft.getTutorial().onDestroyBlock(this.minecraft.level, p_105270_, blockstate, 1.0F);
this.startPrediction(this.minecraft.level, p_233757_ -> {
@@ -27,7 +27,7 @@
this.destroyBlock(p_105270_);
return new ServerboundPlayerActionPacket(ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK, p_105270_, p_105271_, p_233757_);
});
-@@ -152,15 +_,18 @@
+@@ -153,15 +_,18 @@
this.connection
.send(new ServerboundPlayerActionPacket(ServerboundPlayerActionPacket.Action.ABORT_DESTROY_BLOCK, this.destroyBlockPos, p_105271_));
}
@@ -46,7 +46,7 @@
if (flag && blockstate1.getDestroyProgress(this.minecraft.player, this.minecraft.player.level(), p_105270_) >= 1.0F) {
this.destroyBlock(p_105270_);
} else {
-@@ -171,6 +_,7 @@
+@@ -172,6 +_,7 @@
this.destroyTicks = 0.0F;
this.minecraft.level.destroyBlockProgress(this.minecraft.player.getId(), this.destroyBlockPos, this.getDestroyStage());
}
@@ -54,7 +54,7 @@
return new ServerboundPlayerActionPacket(ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK, p_105270_, p_105271_, p_233728_);
});
-@@ -203,6 +_,7 @@
+@@ -204,6 +_,7 @@
BlockState blockstate1 = this.minecraft.level.getBlockState(p_105284_);
this.minecraft.getTutorial().onDestroyBlock(this.minecraft.level, p_105284_, blockstate1, 1.0F);
this.startPrediction(this.minecraft.level, p_233753_ -> {
@@ -62,7 +62,7 @@
this.destroyBlock(p_105284_);
return new ServerboundPlayerActionPacket(ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK, p_105284_, p_105285_, p_233753_);
});
-@@ -215,7 +_,7 @@
+@@ -216,7 +_,7 @@
} else {
this.destroyProgress = this.destroyProgress + blockstate.getDestroyProgress(this.minecraft.player, this.minecraft.player.level(), p_105284_);
if (this.destroyTicks % 4.0F == 0.0F) {
@@ -71,7 +71,7 @@
this.minecraft
.getSoundManager()
.play(
-@@ -232,6 +_,7 @@
+@@ -233,6 +_,7 @@
this.destroyTicks++;
this.minecraft.getTutorial().onDestroyBlock(this.minecraft.level, p_105284_, blockstate, Mth.clamp(this.destroyProgress, 0.0F, 1.0F));
@@ -79,7 +79,7 @@
if (this.destroyProgress >= 1.0F) {
this.isDestroying = false;
this.startPrediction(this.minecraft.level, p_233739_ -> {
-@@ -270,7 +_,7 @@
+@@ -271,7 +_,7 @@
private boolean sameDestroyTarget(BlockPos p_105282_) {
ItemStack itemstack = this.minecraft.player.getMainHandItem();
@@ -88,7 +88,7 @@
}
private void ensureHasSentCarriedItem() {
-@@ -298,12 +_,23 @@
+@@ -299,12 +_,23 @@
private InteractionResult performUseItemOn(LocalPlayer p_233747_, InteractionHand p_233748_, BlockHitResult p_233749_) {
BlockPos blockpos = p_233749_.getBlockPos();
ItemStack itemstack = p_233747_.getItemInHand(p_233748_);
@@ -114,7 +114,7 @@
BlockState blockstate = this.minecraft.level.getBlockState(blockpos);
if (!this.connection.isFeatureEnabled(blockstate.getBlock().requiredFeatures())) {
return InteractionResult.FAIL;
-@@ -324,8 +_,10 @@
+@@ -325,8 +_,10 @@
}
}
@@ -127,7 +127,7 @@
InteractionResult interactionresult2;
if (this.localPlayerMode.isCreative()) {
int i = itemstack.getCount();
-@@ -359,6 +_,11 @@
+@@ -360,6 +_,11 @@
mutableobject.setValue(InteractionResult.PASS);
return serverbounduseitempacket;
} else {
@@ -139,7 +139,7 @@
InteractionResult interactionresult = itemstack.use(this.minecraft.level, p_233722_, p_233723_);
ItemStack itemstack1;
if (interactionresult instanceof InteractionResult.Success interactionresult$success) {
-@@ -369,6 +_,9 @@
+@@ -370,6 +_,9 @@
if (itemstack1 != itemstack) {
p_233722_.setItemInHand(p_233723_, itemstack1);
@@ -149,7 +149,7 @@
}
mutableobject.setValue(interactionresult);
-@@ -400,6 +_,10 @@
+@@ -401,6 +_,10 @@
public InteractionResult interact(Player p_105227_, Entity p_105228_, InteractionHand p_105229_) {
this.ensureHasSentCarriedItem();
this.connection.send(ServerboundInteractPacket.createInteractionPacket(p_105228_, p_105227_.isShiftKeyDown(), p_105229_));
@@ -160,7 +160,7 @@
return (InteractionResult)(this.localPlayerMode == GameType.SPECTATOR ? InteractionResult.PASS : p_105227_.interactOn(p_105228_, p_105229_));
}
-@@ -407,6 +_,10 @@
+@@ -408,6 +_,10 @@
this.ensureHasSentCarriedItem();
Vec3 vec3 = p_105233_.getLocation().subtract(p_105232_.getX(), p_105232_.getY(), p_105232_.getZ());
this.connection.send(ServerboundInteractPacket.createInteractionPacket(p_105232_, p_105231_.isShiftKeyDown(), p_105234_, vec3));
diff --git a/patches/minecraft/net/minecraft/client/multiplayer/PlayerInfo.java.patch b/patches/minecraft/net/minecraft/client/multiplayer/PlayerInfo.java.patch
index 5aa803aaa2..4695d7e5ef 100644
--- a/patches/minecraft/net/minecraft/client/multiplayer/PlayerInfo.java.patch
+++ b/patches/minecraft/net/minecraft/client/multiplayer/PlayerInfo.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/multiplayer/PlayerInfo.java
+++ b/net/minecraft/client/multiplayer/PlayerInfo.java
-@@ -86,6 +_,7 @@
+@@ -88,6 +_,7 @@
}
protected void setGameMode(GameType p_105318_) {
diff --git a/patches/minecraft/net/minecraft/client/particle/BreakingItemParticle.java.patch b/patches/minecraft/net/minecraft/client/particle/BreakingItemParticle.java.patch
deleted file mode 100644
index 8e9d7a78fc..0000000000
--- a/patches/minecraft/net/minecraft/client/particle/BreakingItemParticle.java.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/net/minecraft/client/particle/BreakingItemParticle.java
-+++ b/net/minecraft/client/particle/BreakingItemParticle.java
-@@ -33,7 +_,7 @@
-
- protected BreakingItemParticle(ClientLevel p_105665_, double p_105666_, double p_105667_, double p_105668_, ItemStack p_105669_) {
- super(p_105665_, p_105666_, p_105667_, p_105668_, 0.0, 0.0, 0.0);
-- this.setSprite(Minecraft.getInstance().getItemRenderer().getModel(p_105669_, p_105665_, null, 0).getParticleIcon());
-+ this.setSprite(Minecraft.getInstance().getItemRenderer().getModel(p_105669_, p_105665_, null, 0).getParticleIcon(net.minecraftforge.client.model.data.ModelData.EMPTY));
- this.gravity = 1.0F;
- this.quadSize /= 2.0F;
- this.uo = this.random.nextFloat() * 3.0F;
diff --git a/patches/minecraft/net/minecraft/client/particle/Particle.java.patch b/patches/minecraft/net/minecraft/client/particle/Particle.java.patch
index f54bdd700c..1cb94ee68e 100644
--- a/patches/minecraft/net/minecraft/client/particle/Particle.java.patch
+++ b/patches/minecraft/net/minecraft/client/particle/Particle.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/particle/Particle.java
+++ b/net/minecraft/client/particle/Particle.java
-@@ -243,6 +_,18 @@
+@@ -248,6 +_,18 @@
return Optional.empty();
}
diff --git a/patches/minecraft/net/minecraft/client/particle/ParticleEngine.java.patch b/patches/minecraft/net/minecraft/client/particle/ParticleEngine.java.patch
index 45a1d266a0..5150450ef5 100644
--- a/patches/minecraft/net/minecraft/client/particle/ParticleEngine.java.patch
+++ b/patches/minecraft/net/minecraft/client/particle/ParticleEngine.java.patch
@@ -1,8 +1,8 @@
--- a/net/minecraft/client/particle/ParticleEngine.java
+++ b/net/minecraft/client/particle/ParticleEngine.java
-@@ -77,11 +_,11 @@
- ParticleRenderType.TERRAIN_SHEET, ParticleRenderType.PARTICLE_SHEET_OPAQUE, ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT, ParticleRenderType.CUSTOM
- );
+@@ -72,11 +_,11 @@
+ private static final int MAX_PARTICLES_PER_LAYER = 16384;
+ private static final List RENDER_ORDER = List.of(ParticleRenderType.TERRAIN_SHEET, ParticleRenderType.PARTICLE_SHEET_OPAQUE, ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT);
protected ClientLevel level;
- private final Map> particles = Maps.newIdentityHashMap();
+ private final Map> particles = Maps.newTreeMap(net.minecraftforge.client.ForgeHooksClient.makeParticleRenderTypeComparator(RENDER_ORDER));
@@ -14,7 +14,7 @@
private final Queue particlesToAdd = Queues.newArrayDeque();
private final Map spriteSets = Maps.newHashMap();
private final TextureAtlas textureAtlas;
-@@ -214,10 +_,14 @@
+@@ -205,10 +_,14 @@
this.register(ParticleTypes.BLOCK_CRUMBLE, new TerrainParticle.CrumblingProvider());
}
@@ -30,7 +30,7 @@
public void register(ParticleType p_273423_, ParticleProvider.Sprite p_273134_) {
this.register(
p_273423_,
-@@ -234,10 +_,12 @@
+@@ -225,10 +_,12 @@
);
}
@@ -44,7 +44,7 @@
}
@Override
-@@ -357,7 +_,7 @@
+@@ -348,7 +_,7 @@
private Particle makeParticle(
T p_107396_, double p_107397_, double p_107398_, double p_107399_, double p_107400_, double p_107401_, double p_107402_
) {
@@ -53,35 +53,61 @@
return particleprovider == null
? null
: particleprovider.createParticle(p_107396_, this.level, p_107397_, p_107398_, p_107399_, p_107400_, p_107401_, p_107402_);
-@@ -433,17 +_,26 @@
+@@ -424,28 +_,36 @@
}
}
-+
-+ /**@deprecated Forge: use {@link #render(LightTexture, Camera, float, net.minecraft.client.renderer.culling.Frustum)} with Frustum as additional parameter*/
++ /**@deprecated Forge: use {@link #render(Camera, float, net.minecraft.client.renderer.culling.Frustum)} with Frustum as additional parameter*/
+ @Deprecated
- public void render(LightTexture p_107339_, Camera p_107340_, float p_107341_) {
-+ render(p_107339_, p_107340_, p_107341_, null);
+ public void render(Camera p_107340_, float p_107341_, MultiBufferSource.BufferSource p_377798_) {
+- for (ParticleRenderType particlerendertype : RENDER_ORDER) {
++ render(p_107340_, p_107341_, p_377798_, null);
+ }
+
-+ public void render(LightTexture p_107339_, Camera p_107340_, float p_107341_, @Nullable net.minecraft.client.renderer.culling.Frustum frustum) {
- p_107339_.turnOnLightLayer();
- RenderSystem.enableDepthTest();
-
-- for (ParticleRenderType particlerendertype : RENDER_ORDER) {
++ public void render(Camera p_107340_, float p_107341_, MultiBufferSource.BufferSource p_377798_, @Nullable net.minecraft.client.renderer.culling.Frustum frustum) {
+ for (ParticleRenderType particlerendertype : this.particles.keySet()) { // Forge: allow custom IParticleRenderType's
+ if (particlerendertype == ParticleRenderType.NO_RENDER) continue;
Queue queue = this.particles.get(particlerendertype);
if (queue != null && !queue.isEmpty()) {
- Tesselator tesselator = Tesselator.getInstance();
- BufferBuilder bufferbuilder = particlerendertype.begin(tesselator, this.textureManager);
- if (bufferbuilder != null) {
- for (Particle particle : queue) {
-+ if (frustum != null && particle.shouldCull() && !frustum.isVisible(particle.getBoundingBox())) continue;
- try {
- particle.render(bufferbuilder, p_107340_, p_107341_);
- } catch (Throwable throwable) {
-@@ -475,7 +_,7 @@
+- renderParticleType(p_107340_, p_107341_, p_377798_, particlerendertype, queue);
++ renderParticleType(p_107340_, p_107341_, p_377798_, particlerendertype, queue, frustum);
+ }
+ }
+
+ Queue queue1 = this.particles.get(ParticleRenderType.CUSTOM);
+ if (queue1 != null && !queue1.isEmpty()) {
+- renderCustomParticles(p_107340_, p_107341_, p_377798_, queue1);
++ renderCustomParticles(p_107340_, p_107341_, p_377798_, queue1, frustum);
+ }
+
+ p_377798_.endBatch();
+ }
+
+ private static void renderParticleType(
+- Camera p_376120_, float p_375470_, MultiBufferSource.BufferSource p_377543_, ParticleRenderType p_378369_, Queue p_376283_
++ Camera p_376120_, float p_375470_, MultiBufferSource.BufferSource p_377543_, ParticleRenderType p_378369_, Queue p_376283_, @Nullable net.minecraft.client.renderer.culling.Frustum frustum
+ ) {
+ VertexConsumer vertexconsumer = p_377543_.getBuffer(Objects.requireNonNull(p_378369_.renderType()));
+
+ for (Particle particle : p_376283_) {
++ if (frustum != null && particle.shouldCull() && !frustum.isVisible(particle.getBoundingBox())) continue;
+ try {
+ particle.render(vertexconsumer, p_376120_, p_375470_);
+ } catch (Throwable throwable) {
+@@ -458,10 +_,11 @@
+ }
+ }
+
+- private static void renderCustomParticles(Camera p_377913_, float p_376893_, MultiBufferSource.BufferSource p_376978_, Queue p_375784_) {
++ private static void renderCustomParticles(Camera p_377913_, float p_376893_, MultiBufferSource.BufferSource p_376978_, Queue p_375784_, @Nullable net.minecraft.client.renderer.culling.Frustum frustum) {
+ PoseStack posestack = new PoseStack();
+
+ for (Particle particle : p_375784_) {
++ if (frustum != null && particle.shouldCull() && !frustum.isVisible(particle.getBoundingBox())) continue;
+ try {
+ particle.renderCustom(posestack, p_376978_, p_377913_, p_376893_);
+ } catch (Throwable throwable) {
+@@ -481,7 +_,7 @@
}
public void destroy(BlockPos p_107356_, BlockState p_107357_) {
@@ -90,7 +116,7 @@
VoxelShape voxelshape = p_107357_.getShape(this.level, p_107356_);
double d0 = 0.25;
voxelshape.forAllBoxes(
-@@ -508,6 +_,7 @@
+@@ -514,6 +_,7 @@
p_107357_,
p_107356_
)
@@ -98,7 +124,7 @@
);
}
}
-@@ -517,6 +_,13 @@
+@@ -523,6 +_,13 @@
}
}
@@ -112,7 +138,7 @@
public void crack(BlockPos p_107368_, Direction p_107369_) {
BlockState blockstate = this.level.getBlockState(p_107368_);
if (blockstate.getRenderShape() != RenderShape.INVISIBLE && blockstate.shouldSpawnTerrainParticles()) {
-@@ -552,7 +_,7 @@
+@@ -558,7 +_,7 @@
d0 = (double)i + aabb.maxX + 0.1F;
}
diff --git a/patches/minecraft/net/minecraft/client/player/LocalPlayer.java.patch b/patches/minecraft/net/minecraft/client/player/LocalPlayer.java.patch
index e1d931c149..69ccad5be7 100644
--- a/patches/minecraft/net/minecraft/client/player/LocalPlayer.java.patch
+++ b/patches/minecraft/net/minecraft/client/player/LocalPlayer.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/player/LocalPlayer.java
+++ b/net/minecraft/client/player/LocalPlayer.java
-@@ -303,6 +_,7 @@
+@@ -308,6 +_,7 @@
ServerboundPlayerActionPacket.Action serverboundplayeractionpacket$action = p_108701_
? ServerboundPlayerActionPacket.Action.DROP_ALL_ITEMS
: ServerboundPlayerActionPacket.Action.DROP_ITEM;
@@ -8,7 +8,7 @@
ItemStack itemstack = this.getInventory().removeFromSelected(p_108701_);
this.connection.send(new ServerboundPlayerActionPacket(serverboundplayeractionpacket$action, BlockPos.ZERO, Direction.DOWN));
return !itemstack.isEmpty();
-@@ -488,7 +_,11 @@
+@@ -493,7 +_,11 @@
@Override
public void playSound(SoundEvent p_108651_, float p_108652_, float p_108653_) {
@@ -21,43 +21,43 @@
}
@Override
-@@ -682,6 +_,7 @@
+@@ -686,6 +_,7 @@
+ && this.canPlayerFitWithinBlocksAndEntitiesWhen(Pose.CROUCHING)
&& (this.isShiftKeyDown() || !this.isSleeping() && !this.canPlayerFitWithinBlocksAndEntitiesWhen(Pose.STANDING));
- float f = (float)this.getAttributeValue(Attributes.SNEAKING_SPEED);
- this.input.tick(this.isMovingSlowly(), f);
+ this.input.tick();
+ net.minecraftforge.client.ForgeHooksClient.onMovementInputUpdate(this, this.input);
this.minecraft.getTutorial().onInput(this.input);
- if (this.isUsingItem() && !this.isPassenger()) {
- this.input.leftImpulse *= 0.2F;
-@@ -710,7 +_,7 @@
- boolean flag4 = this.canStartSprinting();
- boolean flag5 = this.isPassenger() ? this.getVehicle().onGround() : this.onGround();
- boolean flag6 = !flag1 && !flag2;
-- if ((flag5 || this.isUnderWater()) && flag6 && flag4) {
-+ if ((flag5 || this.isUnderWater() || this.canStartSwimming()) && flag6 && flag4) {
+ if (this.shouldStopSprinting()) {
+ this.setSprinting(false);
+@@ -724,7 +_,7 @@
+ boolean flag3 = this.canStartSprinting();
+ boolean flag4 = this.isPassenger() ? this.getVehicle().onGround() : this.onGround();
+ boolean flag5 = !flag1 && !flag2;
+- if ((flag4 || this.isUnderWater()) && flag5 && flag3) {
++ if ((flag4 || this.isUnderWater() || this.canStartSwimming()) && flag5 && flag3) {
if (this.sprintTriggerTime <= 0 && !this.minecraft.options.keySprint.isDown()) {
this.sprintTriggerTime = 7;
} else {
-@@ -718,15 +_,15 @@
+@@ -732,15 +_,16 @@
}
}
-- if ((!this.isInWater() || this.isUnderWater()) && flag4 && this.minecraft.options.keySprint.isDown()) {
-+ if (!this.isSprinting() && (!(this.isInWater() || this.isInFluidType((fluidType, height) -> this.canSwimInFluidType(fluidType))) || (this.isUnderWater() || this.canStartSwimming())) && this.hasEnoughImpulseToStartSprinting() && flag4 && !this.isUsingItem() && !this.hasEffect(MobEffects.BLINDNESS) && this.minecraft.options.keySprint.isDown()) {
+- if ((!this.isInWater() || this.isUnderWater()) && flag3 && this.minecraft.options.keySprint.isDown()) {
++ if ((!this.isInWaterOrSwimmable() || this.isUnderWater() || this.canStartSwimming()) && flag3 && this.minecraft.options.keySprint.isDown()) {
this.setSprinting(true);
}
if (this.isSprinting()) {
- boolean flag7 = !this.input.hasForwardImpulse() || !this.hasEnoughFoodToStartSprinting();
-- boolean flag8 = flag7 || this.horizontalCollision && !this.minorHorizontalCollision || this.isInWater() && !this.isUnderWater();
-+ boolean flag8 = flag7 || this.horizontalCollision && !this.minorHorizontalCollision || this.isInWater() && !this.isUnderWater() || (this.isInFluidType((fluidType, height) -> this.canSwimInFluidType(fluidType)) && !this.canStartSwimming());
+ boolean flag6 = !this.input.hasForwardImpulse() || !this.hasEnoughFoodToStartSprinting();
+ boolean flag7 = flag6 || this.horizontalCollision && !this.minorHorizontalCollision || this.isInWater() && !this.isUnderWater();
++ flag7 = flag7 || (this.isInFluidType((fluidType, height) -> this.canSwimInFluidType(fluidType)) && !this.canStartSwimming());
if (this.isSwimming()) {
-- if (!this.onGround() && !this.input.keyPresses.shift() && flag7 || !this.isInWater()) {
-+ if (!this.onGround() && !this.input.keyPresses.shift() && flag7 || !(this.isInWater() || this.isInFluidType((fluidType, height) -> this.canSwimInFluidType(fluidType)))) {
+- if (!this.onGround() && !this.input.keyPresses.shift() && flag6 || !this.isInWater()) {
++ if (!this.onGround() && !this.input.keyPresses.shift() && flag7 || !this.isInWaterOrSwimmable()) {
this.setSprinting(false);
}
- } else if (flag8) {
-@@ -763,8 +_,9 @@
+ } else if (flag7) {
+@@ -777,8 +_,9 @@
}
this.wasFallFlying = this.isFallFlying();
@@ -69,7 +69,7 @@
}
if (this.isEyeInFluid(FluidTags.WATER)) {
-@@ -870,6 +_,8 @@
+@@ -900,6 +_,8 @@
@Override
public void rideTick() {
super.rideTick();
@@ -78,7 +78,7 @@
this.handsBusy = false;
if (this.getControlledVehicle() instanceof AbstractBoat abstractboat) {
abstractboat.setInput(
-@@ -1146,6 +_,18 @@
+@@ -1177,6 +_,18 @@
@Override
public float getVisualRotationYInDegrees() {
return this.getYRot();
diff --git a/patches/minecraft/net/minecraft/client/renderer/GameRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/GameRenderer.java.patch
index 5b973bb884..1cda9f2b03 100644
--- a/patches/minecraft/net/minecraft/client/renderer/GameRenderer.java.patch
+++ b/patches/minecraft/net/minecraft/client/renderer/GameRenderer.java.patch
@@ -34,7 +34,7 @@
}
}
-@@ -468,12 +_,12 @@
+@@ -470,12 +_,12 @@
(float)((double)window.getHeight() / window.getGuiScale()),
0.0F,
1000.0F,
@@ -49,7 +49,7 @@
Lighting.setupFor3DItems();
GuiGraphics guigraphics = new GuiGraphics(this.minecraft, this.renderBuffers.bufferSource());
if (flag && p_109096_ && this.minecraft.level != null) {
-@@ -499,7 +_,7 @@
+@@ -501,7 +_,7 @@
}
} else if (flag && this.minecraft.screen != null) {
try {
@@ -58,7 +58,7 @@
} catch (Throwable throwable1) {
CrashReport crashreport1 = CrashReport.forThrowable(throwable1, "Rendering screen");
CrashReportCategory crashreportcategory1 = crashreport1.addCategory("Screen render details");
-@@ -655,6 +_,9 @@
+@@ -657,6 +_,9 @@
if (this.minecraft.options.bobView().get()) {
this.bobView(posestack, camera.getPartialTickTime());
}
diff --git a/patches/minecraft/net/minecraft/client/renderer/ItemBlockRenderTypes.java.patch b/patches/minecraft/net/minecraft/client/renderer/ItemBlockRenderTypes.java.patch
index 8c657d02ad..9fe92b8df9 100644
--- a/patches/minecraft/net/minecraft/client/renderer/ItemBlockRenderTypes.java.patch
+++ b/patches/minecraft/net/minecraft/client/renderer/ItemBlockRenderTypes.java.patch
@@ -5,18 +5,18 @@
@OnlyIn(Dist.CLIENT)
public class ItemBlockRenderTypes {
+ @Deprecated
- private static final Map TYPE_BY_BLOCK = Util.make(Maps.newHashMap(), p_357825_ -> {
+ private static final Map TYPE_BY_BLOCK = Util.make(Maps.newHashMap(), p_374604_ -> {
RenderType rendertype = RenderType.tripwire();
- p_357825_.put(Blocks.TRIPWIRE, rendertype);
-@@ -340,6 +_,7 @@
- p_357825_.put(Blocks.BUBBLE_COLUMN, rendertype3);
- p_357825_.put(Blocks.TINTED_GLASS, rendertype3);
+ p_374604_.put(Blocks.TRIPWIRE, rendertype);
+@@ -345,6 +_,7 @@
+ p_374604_.put(Blocks.BUBBLE_COLUMN, rendertype3);
+ p_374604_.put(Blocks.TINTED_GLASS, rendertype3);
});
+ @Deprecated
private static final Map TYPE_BY_FLUID = Util.make(Maps.newHashMap(), p_109290_ -> {
RenderType rendertype = RenderType.translucent();
p_109290_.put(Fluids.FLOWING_WATER, rendertype);
-@@ -347,6 +_,8 @@
+@@ -352,6 +_,8 @@
});
private static boolean renderCutout;
@@ -25,7 +25,7 @@
public static RenderType getChunkRenderType(BlockState p_109283_) {
Block block = p_109283_.getBlock();
if (block instanceof LeavesBlock) {
-@@ -357,6 +_,8 @@
+@@ -362,6 +_,8 @@
}
}
@@ -34,7 +34,7 @@
public static RenderType getMovingBlockRenderType(BlockState p_109294_) {
Block block = p_109294_.getBlock();
if (block instanceof LeavesBlock) {
-@@ -371,6 +_,8 @@
+@@ -376,6 +_,8 @@
}
}
@@ -43,7 +43,7 @@
public static RenderType getRenderType(BlockState p_364446_) {
RenderType rendertype = getChunkRenderType(p_364446_);
return rendertype == RenderType.translucent() ? Sheets.translucentItemSheet() : Sheets.cutoutBlockSheet();
-@@ -385,12 +_,77 @@
+@@ -390,12 +_,77 @@
}
}
diff --git a/patches/minecraft/net/minecraft/client/renderer/ItemInHandRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/ItemInHandRenderer.java.patch
index 4b23d605bd..0cf57f67ae 100644
--- a/patches/minecraft/net/minecraft/client/renderer/ItemInHandRenderer.java.patch
+++ b/patches/minecraft/net/minecraft/client/renderer/ItemInHandRenderer.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/renderer/ItemInHandRenderer.java
+++ b/net/minecraft/client/renderer/ItemInHandRenderer.java
-@@ -339,12 +_,14 @@
+@@ -343,12 +_,14 @@
if (iteminhandrenderer$handrenderselection.renderMainHand) {
float f4 = interactionhand == InteractionHand.MAIN_HAND ? f : 0.0F;
float f5 = 1.0F - Mth.lerp(p_109315_, this.oMainHandHeight, this.mainHandHeight);
@@ -15,7 +15,7 @@
this.renderArmWithItem(p_109318_, p_109315_, f1, InteractionHand.OFF_HAND, f6, this.offHandItem, f7, p_109316_, p_109317_, p_109319_);
}
-@@ -410,7 +_,7 @@
+@@ -414,7 +_,7 @@
} else {
this.renderOneHandedMap(p_109379_, p_109380_, p_109381_, p_109378_, humanoidarm, p_109376_, p_109377_);
}
@@ -25,19 +25,20 @@
boolean flag2 = humanoidarm == HumanoidArm.RIGHT;
int i = flag2 ? 1 : -1;
@@ -460,6 +_,7 @@
- );
} else {
boolean flag3 = humanoidarm == HumanoidArm.RIGHT;
+ int j = flag3 ? 1 : -1;
+ if (!net.minecraftforge.client.extensions.common.IClientItemExtensions.of(p_109377_).applyForgeHandTransform(p_109379_, minecraft.player, humanoidarm, p_109377_, p_109373_, p_109378_, p_109376_)) // FORGE: Allow items to define custom arm animation
if (p_109372_.isUsingItem() && p_109372_.getUseItemRemainingTicks() > 0 && p_109372_.getUsedItemHand() == p_109375_) {
- int k = flag3 ? 1 : -1;
switch (p_109377_.getUseAnimation()) {
-@@ -574,8 +_,16 @@
+ case NONE:
+@@ -588,8 +_,18 @@
this.offHandHeight = Mth.clamp(this.offHandHeight - 0.4F, 0.0F, 1.0F);
} else {
float f = localplayer.getAttackStrengthScale(1.0F);
-- this.mainHandHeight = this.mainHandHeight + Mth.clamp((this.mainHandItem == itemstack ? f * f * f : 0.0F) - this.mainHandHeight, -0.4F, 0.4F);
-- this.offHandHeight = this.offHandHeight + Mth.clamp((float)(this.offHandItem == itemstack1 ? 1 : 0) - this.offHandHeight, -0.4F, 0.4F);
+- float f1 = this.mainHandItem != itemstack ? 0.0F : f * f * f;
+- float f2 = this.offHandItem != itemstack1 ? 0.0F : 1.0F;
++
+ boolean requipM = net.minecraftforge.client.ForgeHooksClient.shouldCauseReequipAnimation(this.mainHandItem, itemstack, localplayer.getInventory().selected);
+ boolean requipO = net.minecraftforge.client.ForgeHooksClient.shouldCauseReequipAnimation(this.offHandItem, itemstack1, -1);
+
@@ -46,8 +47,9 @@
+ if (!requipO && this.offHandItem != itemstack1)
+ this.offHandItem = itemstack1;
+
-+ this.mainHandHeight += Mth.clamp((!requipM ? f * f * f : 0.0F) - this.mainHandHeight, -0.4F, 0.4F);
-+ this.offHandHeight += Mth.clamp((float)(!requipO ? 1 : 0) - this.offHandHeight, -0.4F, 0.4F);
++ float f1 = requipM ? 0.0F : f * f * f;
++ float f2 = requipO ? 0.0F : 1.0F;
++
+ this.mainHandHeight = this.mainHandHeight + Mth.clamp(f1 - this.mainHandHeight, -0.4F, 0.4F);
+ this.offHandHeight = this.offHandHeight + Mth.clamp(f2 - this.offHandHeight, -0.4F, 0.4F);
}
-
- if (this.mainHandHeight < 0.1F) {
diff --git a/patches/minecraft/net/minecraft/client/renderer/LevelRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/LevelRenderer.java.patch
index 43bfd3479e..4d00a9a971 100644
--- a/patches/minecraft/net/minecraft/client/renderer/LevelRenderer.java.patch
+++ b/patches/minecraft/net/minecraft/client/renderer/LevelRenderer.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/renderer/LevelRenderer.java
+++ b/net/minecraft/client/renderer/LevelRenderer.java
-@@ -111,7 +_,7 @@
+@@ -109,7 +_,7 @@
private final SkyRenderer skyRenderer = new SkyRenderer();
private final CloudRenderer cloudRenderer = new CloudRenderer();
private final WorldBorderRenderer worldBorderRenderer = new WorldBorderRenderer();
@@ -9,16 +9,16 @@
@Nullable
private ClientLevel level;
private final SectionOcclusionGraph sectionOcclusionGraph = new SectionOcclusionGraph();
-@@ -487,7 +_,7 @@
+@@ -482,7 +_,7 @@
postchain1.addToFrame(framegraphbuilder, i, j, this.targets);
}
-- this.addParticlesPass(framegraphbuilder, p_109604_, p_109606_, f, fogparameters);
-+ this.addParticlesPass(framegraphbuilder, p_109604_, p_109606_, f, fogparameters, frustum);
+- this.addParticlesPass(framegraphbuilder, p_109604_, f, fogparameters);
++ this.addParticlesPass(framegraphbuilder, p_109604_, f, fogparameters, frustum);
CloudStatus cloudstatus = this.minecraft.options.getCloudsType();
if (cloudstatus != CloudStatus.OFF) {
float f2 = this.level.effects().getCloudHeight();
-@@ -569,7 +_,11 @@
+@@ -564,7 +_,11 @@
double d2 = vec3.z();
p_369478_.push("terrain");
this.renderSectionLayer(RenderType.solid(), d0, d1, d2, p_361439_, p_369924_);
@@ -30,7 +30,7 @@
this.renderSectionLayer(RenderType.cutout(), d0, d1, d2, p_361439_, p_369924_);
if (this.level.effects().constantAmbientLight()) {
Lighting.setupNetherLevel();
-@@ -603,7 +_,7 @@
+@@ -598,7 +_,7 @@
multibuffersource$buffersource.endLastBatch();
this.checkPoseStack(posestack);
p_369478_.popPush("blockentities");
@@ -39,7 +39,7 @@
multibuffersource$buffersource.endLastBatch();
this.checkPoseStack(posestack);
multibuffersource$buffersource.endBatch(RenderType.solid());
-@@ -617,8 +_,8 @@
+@@ -612,8 +_,8 @@
multibuffersource$buffersource.endBatch(Sheets.hangingSignSheet());
multibuffersource$buffersource.endBatch(Sheets.chestSheet());
this.renderBuffers.outlineBufferSource().endOutlineBatch();
@@ -50,7 +50,7 @@
}
p_369478_.popPush("debug");
-@@ -648,8 +_,8 @@
+@@ -643,8 +_,8 @@
this.renderSectionLayer(RenderType.translucent(), d0, d1, d2, p_361439_, p_369924_);
p_369478_.popPush("string");
this.renderSectionLayer(RenderType.tripwire(), d0, d1, d2, p_361439_, p_369924_);
@@ -61,25 +61,25 @@
}
multibuffersource$buffersource.endBatch();
-@@ -657,7 +_,7 @@
+@@ -652,7 +_,7 @@
});
}
-- private void addParticlesPass(FrameGraphBuilder p_366471_, Camera p_363128_, LightTexture p_366434_, float p_365755_, FogParameters p_363695_) {
-+ private void addParticlesPass(FrameGraphBuilder p_366471_, Camera p_363128_, LightTexture p_366434_, float p_365755_, FogParameters p_363695_, Frustum frustum) {
+- private void addParticlesPass(FrameGraphBuilder p_366471_, Camera p_363128_, float p_365755_, FogParameters p_363695_) {
++ private void addParticlesPass(FrameGraphBuilder p_366471_, Camera p_363128_, float p_365755_, FogParameters p_363695_, Frustum frustum) {
FramePass framepass = p_366471_.addPass("particles");
if (this.targets.particles != null) {
this.targets.particles = framepass.readsAndWrites(this.targets.particles);
-@@ -677,7 +_,7 @@
+@@ -671,7 +_,7 @@
+ resourcehandle1.get().copyDepthFrom(resourcehandle.get());
}
- RenderStateShard.PARTICLES_TARGET.setupRenderState();
-- this.minecraft.particleEngine.render(p_366434_, p_363128_, p_365755_);
-+ this.minecraft.particleEngine.render(p_366434_, p_363128_, p_365755_, frustum);
- RenderStateShard.PARTICLES_TARGET.clearRenderState();
+- this.minecraft.particleEngine.render(p_363128_, p_365755_, this.renderBuffers.bufferSource());
++ this.minecraft.particleEngine.render(p_363128_, p_365755_, this.renderBuffers.bufferSource(), frustum);
});
}
-@@ -766,9 +_,9 @@
+
+@@ -759,9 +_,9 @@
|| p_365712_.isDetached()
|| p_365712_.getEntity() instanceof LivingEntity && ((LivingEntity)p_365712_.getEntity()).isSleeping()
)
@@ -91,7 +91,7 @@
flag = true;
}
}
-@@ -808,9 +_,10 @@
+@@ -801,9 +_,10 @@
}
}
@@ -104,7 +104,7 @@
Vec3 vec3 = p_369847_.getPosition();
double d0 = vec3.x();
double d1 = vec3.y();
-@@ -820,6 +_,7 @@
+@@ -813,6 +_,7 @@
List list = sectionrenderdispatcher$rendersection.getCompiled().getRenderableBlockEntities();
if (!list.isEmpty()) {
for (BlockEntity blockentity : list) {
@@ -112,7 +112,7 @@
BlockPos blockpos = blockentity.getBlockPos();
MultiBufferSource multibuffersource = p_362022_;
p_366168_.pushPose();
-@@ -839,6 +_,9 @@
+@@ -832,6 +_,9 @@
}
}
@@ -122,7 +122,7 @@
this.blockEntityRenderDispatcher.render(blockentity, p_367074_, p_366168_, multibuffersource);
p_366168_.popPose();
}
-@@ -847,13 +_,18 @@
+@@ -840,13 +_,18 @@
synchronized (this.globalBlockEntities) {
for (BlockEntity blockentity1 : this.globalBlockEntities) {
@@ -141,7 +141,7 @@
}
private void renderBlockDestroyAnimation(PoseStack p_366956_, Camera p_369324_, MultiBufferSource.BufferSource p_365998_) {
-@@ -872,14 +_,14 @@
+@@ -865,14 +_,14 @@
p_366956_.translate((double)blockpos.getX() - d0, (double)blockpos.getY() - d1, (double)blockpos.getZ() - d2);
PoseStack.Pose posestack$pose = p_366956_.last();
VertexConsumer vertexconsumer = new SheetedDecalTextureGenerator(p_365998_.getBuffer(ModelBakery.DESTROY_TYPES.get(i)), posestack$pose, 1.0F);
@@ -158,7 +158,7 @@
if (this.minecraft.hitResult instanceof BlockHitResult blockhitresult) {
if (blockhitresult.getType() != HitResult.Type.MISS) {
BlockPos blockpos = blockhitresult.getBlockPos();
-@@ -890,6 +_,9 @@
+@@ -883,6 +_,9 @@
return;
}
@@ -168,7 +168,7 @@
Vec3 vec3 = p_367935_.getPosition();
Boolean obool = this.minecraft.options.highContrastBlockOutline().get();
if (obool) {
-@@ -905,6 +_,8 @@
+@@ -898,6 +_,8 @@
p_367206_.endLastBatch();
}
}
@@ -177,7 +177,7 @@
}
}
-@@ -1391,7 +_,7 @@
+@@ -1367,7 +_,7 @@
} else {
int i = p_109538_.getBrightness(LightLayer.SKY, p_109540_);
int j = p_109538_.getBrightness(LightLayer.BLOCK, p_109540_);
@@ -186,7 +186,7 @@
if (j < k) {
j = k;
}
-@@ -1453,5 +_,21 @@
+@@ -1429,5 +_,21 @@
public CloudRenderer getCloudRenderer() {
return this.cloudRenderer;
diff --git a/patches/minecraft/net/minecraft/client/renderer/RenderType.java.patch b/patches/minecraft/net/minecraft/client/renderer/RenderType.java.patch
index e165b98c7d..b07181c479 100644
--- a/patches/minecraft/net/minecraft/client/renderer/RenderType.java.patch
+++ b/patches/minecraft/net/minecraft/client/renderer/RenderType.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/renderer/RenderType.java
+++ b/net/minecraft/client/renderer/RenderType.java
-@@ -800,11 +_,22 @@
+@@ -929,11 +_,22 @@
.createCompositeState(false)
);
private static final ImmutableList CHUNK_BUFFER_LAYERS = ImmutableList.of(solid(), cutoutMipped(), cutout(), translucent(), tripwire());
@@ -23,7 +23,7 @@
public static RenderType solid() {
return SOLID;
-@@ -1025,7 +_,7 @@
+@@ -1154,7 +_,7 @@
}
public static RenderType text(ResourceLocation p_110498_) {
@@ -32,7 +32,7 @@
}
public static RenderType textBackground() {
-@@ -1033,19 +_,19 @@
+@@ -1162,19 +_,19 @@
}
public static RenderType textIntensity(ResourceLocation p_173238_) {
@@ -56,7 +56,7 @@
}
public static RenderType textBackgroundSeeThrough() {
-@@ -1053,7 +_,7 @@
+@@ -1182,7 +_,7 @@
}
public static RenderType textIntensitySeeThrough(ResourceLocation p_173241_) {
diff --git a/patches/minecraft/net/minecraft/client/renderer/ScreenEffectRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/ScreenEffectRenderer.java.patch
index 3bf478397d..28043374b2 100644
--- a/patches/minecraft/net/minecraft/client/renderer/ScreenEffectRenderer.java.patch
+++ b/patches/minecraft/net/minecraft/client/renderer/ScreenEffectRenderer.java.patch
@@ -1,15 +1,15 @@
--- a/net/minecraft/client/renderer/ScreenEffectRenderer.java
+++ b/net/minecraft/client/renderer/ScreenEffectRenderer.java
-@@ -31,17 +_,24 @@
+@@ -27,17 +_,24 @@
Player player = p_110719_.player;
if (!player.noPhysics) {
BlockState blockstate = getViewBlockingState(player);
- if (blockstate != null) {
-- renderTex(p_110719_.getBlockRenderer().getBlockModelShaper().getParticleIcon(blockstate), p_110720_);
+- renderTex(p_110719_.getBlockRenderer().getBlockModelShaper().getParticleIcon(blockstate), p_110720_, p_378238_);
+ var overlay = getOverlayBlock(player);
+ if (overlay != null) {
+ if (!net.minecraftforge.client.ForgeHooksClient.renderBlockOverlay(player, p_110720_, net.minecraftforge.client.event.RenderBlockScreenEffectEvent.OverlayType.BLOCK, overlay.getLeft(), overlay.getRight())) {
-+ renderTex(p_110719_.getBlockRenderer().getBlockModelShaper().getTexture(overlay.getLeft(), p_110719_.level, overlay.getRight()), p_110720_);
++ renderTex(p_110719_.getBlockRenderer().getBlockModelShaper().getTexture(overlay.getLeft(), p_110719_.level, overlay.getRight()), p_110720_, p_378238_);
+ }
}
}
@@ -17,17 +17,17 @@
if (!p_110719_.player.isSpectator()) {
if (p_110719_.player.isEyeInFluid(FluidTags.WATER)) {
+ if (!net.minecraftforge.client.ForgeHooksClient.renderWaterOverlay(player, p_110720_))
- renderWater(p_110719_, p_110720_);
+ renderWater(p_110719_, p_110720_, p_378238_);
+ } else if (!player.getEyeInFluidType().isAir()) {
-+ net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions.of(player.getEyeInFluidType()).renderOverlay(p_110719_, p_110720_);
++ net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions.of(player.getEyeInFluidType()).renderOverlay(p_110719_, p_110720_, p_378238_);
}
if (p_110719_.player.isOnFire()) {
+ if (!net.minecraftforge.client.ForgeHooksClient.renderFireOverlay(player, p_110720_))
- renderFire(p_110719_, p_110720_);
+ renderFire(p_110720_, p_378238_);
}
}
-@@ -49,6 +_,12 @@
+@@ -45,6 +_,12 @@
@Nullable
private static BlockState getViewBlockingState(Player p_110717_) {
@@ -40,7 +40,7 @@
BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos();
for (int i = 0; i < 8; i++) {
-@@ -58,7 +_,7 @@
+@@ -54,7 +_,7 @@
blockpos$mutableblockpos.set(d0, d1, d2);
BlockState blockstate = p_110717_.level().getBlockState(blockpos$mutableblockpos);
if (blockstate.getRenderShape() != RenderShape.INVISIBLE && blockstate.isViewBlocking(p_110717_.level(), blockpos$mutableblockpos)) {
@@ -49,17 +49,23 @@
}
}
-@@ -88,8 +_,12 @@
+@@ -82,6 +_,10 @@
}
- private static void renderWater(Minecraft p_110726_, PoseStack p_110727_) {
-+ renderFluid(p_110726_, p_110727_, UNDERWATER_LOCATION);
+ private static void renderWater(Minecraft p_110726_, PoseStack p_110727_, MultiBufferSource p_376402_) {
++ renderFluid(p_110726_, p_110727_, p_376402_, UNDERWATER_LOCATION);
+ }
+
-+ public static void renderFluid(Minecraft p_110726_, PoseStack p_110727_, ResourceLocation texture) {
- RenderSystem.setShader(CoreShaders.POSITION_TEX);
-- RenderSystem.setShaderTexture(0, UNDERWATER_LOCATION);
-+ RenderSystem.setShaderTexture(0, texture);
++ public static void renderFluid(Minecraft p_110726_, PoseStack p_110727_, MultiBufferSource p_376402_, ResourceLocation texture) {
BlockPos blockpos = BlockPos.containing(p_110726_.player.getX(), p_110726_.player.getEyeY(), p_110726_.player.getZ());
float f = LightTexture.getBrightness(p_110726_.player.level().dimensionType(), p_110726_.player.level().getMaxLocalRawBrightness(blockpos));
- RenderSystem.enableBlend();
+ int i = ARGB.colorFromFloat(0.1F, f, f, f);
+@@ -94,7 +_,7 @@
+ float f7 = -p_110726_.player.getYRot() / 64.0F;
+ float f8 = p_110726_.player.getXRot() / 64.0F;
+ Matrix4f matrix4f = p_110727_.last().pose();
+- VertexConsumer vertexconsumer = p_376402_.getBuffer(RenderType.blockScreenEffect(UNDERWATER_LOCATION));
++ VertexConsumer vertexconsumer = p_376402_.getBuffer(RenderType.blockScreenEffect(texture));
+ vertexconsumer.addVertex(matrix4f, -1.0F, -1.0F, -0.5F).setUv(4.0F + f7, 4.0F + f8).setColor(i);
+ vertexconsumer.addVertex(matrix4f, 1.0F, -1.0F, -0.5F).setUv(0.0F + f7, 4.0F + f8).setColor(i);
+ vertexconsumer.addVertex(matrix4f, 1.0F, 1.0F, -0.5F).setUv(0.0F + f7, 0.0F + f8).setColor(i);
diff --git a/patches/minecraft/net/minecraft/client/renderer/Sheets.java.patch b/patches/minecraft/net/minecraft/client/renderer/Sheets.java.patch
index 9ee0f90ac4..08c0a5ed18 100644
--- a/patches/minecraft/net/minecraft/client/renderer/Sheets.java.patch
+++ b/patches/minecraft/net/minecraft/client/renderer/Sheets.java.patch
@@ -1,20 +1,24 @@
--- a/net/minecraft/client/renderer/Sheets.java
+++ b/net/minecraft/client/renderer/Sheets.java
-@@ -140,11 +_,11 @@
+@@ -155,7 +_,7 @@
}
private static Material createSignMaterial(WoodType p_173386_) {
-- return new Material(SIGN_SHEET, ResourceLocation.withDefaultNamespace("entity/signs/" + p_173386_.name()));
-+ return new Material(SIGN_SHEET, ResourceLocation.parse(p_173386_.name()).withPrefix("entity/signs/"));
+- return createSignMaterial(ResourceLocation.withDefaultNamespace(p_173386_.name()));
++ return createSignMaterial(ResourceLocation.parse(p_173386_.name()));
+ }
+
+ public static Material createSignMaterial(ResourceLocation p_378064_) {
+@@ -163,7 +_,7 @@
}
private static Material createHangingSignMaterial(WoodType p_251735_) {
-- return new Material(SIGN_SHEET, ResourceLocation.withDefaultNamespace("entity/signs/hanging/" + p_251735_.name()));
-+ return new Material(SIGN_SHEET, ResourceLocation.parse(p_251735_.name()).withPrefix("entity/signs/hanging/"));
+- return createHangingSignMaterial(ResourceLocation.withDefaultNamespace(p_251735_.name()));
++ return createHangingSignMaterial(ResourceLocation.parse(p_251735_.name()));
}
- public static Material getSignMaterial(WoodType p_173382_) {
-@@ -203,6 +_,23 @@
+ public static Material createHangingSignMaterial(ResourceLocation p_377324_) {
+@@ -230,6 +_,23 @@
case SINGLE:
default:
return p_110773_;
diff --git a/patches/minecraft/net/minecraft/client/renderer/block/BlockRenderDispatcher.java.patch b/patches/minecraft/net/minecraft/client/renderer/block/BlockRenderDispatcher.java.patch
index 3c52740cf9..3c56573450 100644
--- a/patches/minecraft/net/minecraft/client/renderer/block/BlockRenderDispatcher.java.patch
+++ b/patches/minecraft/net/minecraft/client/renderer/block/BlockRenderDispatcher.java.patch
@@ -2,7 +2,7 @@
+++ b/net/minecraft/client/renderer/block/BlockRenderDispatcher.java
@@ -37,7 +_,7 @@
this.blockModelShaper = p_173399_;
- this.blockEntityRenderer = p_173400_;
+ this.specialBlockModelRenderer = p_378785_;
this.blockColors = p_173401_;
- this.modelRenderer = new ModelBlockRenderer(this.blockColors);
+ this.modelRenderer = new net.minecraftforge.client.model.lighting.ForgeModelBlockRenderer(this.blockColors);
@@ -67,34 +67,16 @@
+ public void renderSingleBlock(BlockState p_110913_, PoseStack p_110914_, MultiBufferSource p_110915_, int p_110916_, int p_110917_, net.minecraftforge.client.model.data.ModelData modelData, net.minecraft.client.renderer.RenderType renderType) {
RenderShape rendershape = p_110913_.getRenderShape();
if (rendershape != RenderShape.INVISIBLE) {
- switch (rendershape) {
-@@ -113,21 +_,26 @@
- float f = (float)(i >> 16 & 0xFF) / 255.0F;
- float f1 = (float)(i >> 8 & 0xFF) / 255.0F;
- float f2 = (float)(i & 0xFF) / 255.0F;
-+ for (var rt : bakedmodel.getRenderTypes(p_110913_, RandomSource.create(42), modelData))
- this.modelRenderer
- .renderModel(
- p_110914_.last(),
-- p_110915_.getBuffer(ItemBlockRenderTypes.getRenderType(p_110913_)),
-+ p_110915_.getBuffer(renderType != null ? renderType : net.minecraftforge.client.RenderTypeHelper.getEntityRenderType(rt)),
- p_110913_,
- bakedmodel,
- f,
- f1,
- f2,
- p_110916_,
-- p_110917_
-+ p_110917_,
-+ modelData,
-+ rt
- );
- break;
- case ENTITYBLOCK_ANIMATED:
-- this.blockEntityRenderer.renderByItem(new ItemStack(p_110913_.getBlock()), ItemDisplayContext.NONE, p_110914_, p_110915_, p_110916_, p_110917_);
-+ ItemStack stack = new ItemStack(p_110913_.getBlock());
-+ var renderer = net.minecraftforge.client.extensions.common.IClientItemExtensions.of(stack).getCustomRenderer();
-+ renderer.renderByItem(stack, ItemDisplayContext.NONE, p_110914_, p_110915_, p_110916_, p_110917_);
- }
+ BakedModel bakedmodel = this.getBlockModel(p_110913_);
+@@ -111,9 +_,10 @@
+ float f = (float)(i >> 16 & 0xFF) / 255.0F;
+ float f1 = (float)(i >> 8 & 0xFF) / 255.0F;
+ float f2 = (float)(i & 0xFF) / 255.0F;
++ for (var rt : bakedmodel.getRenderTypes(p_110913_, RandomSource.create(42), modelData))
+ this.modelRenderer
+ .renderModel(
+- p_110914_.last(), p_110915_.getBuffer(ItemBlockRenderTypes.getRenderType(p_110913_)), p_110913_, bakedmodel, f, f1, f2, p_110916_, p_110917_
++ p_110914_.last(), p_110915_.getBuffer(renderType != null ? renderType : net.minecraftforge.client.RenderTypeHelper.getEntityRenderType(rt)), p_110913_, bakedmodel, f, f1, f2, p_110916_, p_110917_, modelData, rt
+ );
+ this.specialBlockModelRenderer.get().renderByBlock(p_110913_.getBlock(), ItemDisplayContext.NONE, p_110914_, p_110915_, p_110916_, p_110917_);
}
- }
diff --git a/patches/minecraft/net/minecraft/client/renderer/block/model/BlockModel.java.patch b/patches/minecraft/net/minecraft/client/renderer/block/model/BlockModel.java.patch
index 6fccdbb133..772aaf1f9c 100644
--- a/patches/minecraft/net/minecraft/client/renderer/block/model/BlockModel.java.patch
+++ b/patches/minecraft/net/minecraft/client/renderer/block/model/BlockModel.java.patch
@@ -1,82 +1,47 @@
--- a/net/minecraft/client/renderer/block/model/BlockModel.java
+++ b/net/minecraft/client/renderer/block/model/BlockModel.java
-@@ -72,9 +_,10 @@
- public BlockModel parent;
+@@ -49,6 +_,7 @@
+ public UnbakedModel parent;
@Nullable
- protected ResourceLocation parentLocation;
+ private final ResourceLocation parentLocation;
+ public final net.minecraftforge.client.model.geometry.BlockGeometryBakingContext customData = new net.minecraftforge.client.model.geometry.BlockGeometryBakingContext(this);
public static BlockModel fromStream(Reader p_111462_) {
-- return GsonHelper.fromJson(GSON, p_111462_, BlockModel.class);
-+ return GsonHelper.fromJson(net.minecraftforge.client.model.ExtendedBlockModelDeserializer.INSTANCE, p_111462_, BlockModel.class);
+ return GsonHelper.fromJson(GSON, p_111462_, BlockModel.class);
+@@ -85,6 +_,8 @@
+ @Override
+ public void resolveDependencies(ResolvableModel.Resolver p_377823_) {
+ if (this.parentLocation != null) {
++ if (customData.hasCustomGeometry())
++ customData.getCustomGeometry().resolveDependencies(p_377823_, customData);
+ this.parent = p_377823_.resolve(this.parentLocation);
+ }
}
-
- public BlockModel(
-@@ -95,10 +_,17 @@
- this.overrides = p_273099_;
- }
-
-+ @Deprecated
- public List getElements() {
-+ if (customData.hasCustomGeometry()) return java.util.Collections.emptyList();
- return this.elements.isEmpty() && this.parent != null ? this.parent.getElements() : this.elements;
- }
-
-+ @Nullable
-+ public ResourceLocation getParentLocation() {
-+ return parentLocation;
-+ }
+@@ -110,6 +_,9 @@
+ public BakedModel bake(
+ TextureSlots p_378598_, ModelBaker p_378458_, ModelState p_111453_, boolean p_111455_, boolean p_377435_, ItemTransforms p_378085_
+ ) {
++ if (this.customData.getCustomGeometry() != null)
++ return this.customData.getCustomGeometry().bake(customData, p_378458_, p_378598_, p_111453_);
+
- public boolean hasAmbientOcclusion() {
- if (this.hasAmbientOcclusion != null) {
- return this.hasAmbientOcclusion;
-@@ -130,12 +_,18 @@
- throw new IllegalStateException("BlockModel parent has to be a block model.");
+ return this.elements.isEmpty() && this.parent != null
+ ? this.parent.bake(p_378598_, p_378458_, p_111453_, p_111455_, p_377435_, p_378085_)
+ : SimpleBakedModel.bakeElements(this.elements, p_378598_, p_378458_.sprites(), p_111453_, p_111455_, p_377435_, true, p_378085_);
+@@ -118,6 +_,7 @@
+ @Nullable
+ @VisibleForTesting
+ List getElements() {
++ if (customData.hasCustomGeometry()) return java.util.Collections.emptyList();
+ return this.elements;
+ }
+
+@@ -147,7 +_,8 @@
}
-+ if (customData.hasCustomGeometry()) {
-+ customData.getCustomGeometry().resolveDependencies(p_365651_, customData);
-+ }
-+
- this.parent = blockmodel;
+ ResourceLocation resourcelocation = s.isEmpty() ? null : ResourceLocation.parse(s);
+- return new BlockModel(resourcelocation, list, textureslots$data, obool, unbakedmodel$guilight, itemtransforms);
++ var ret = new BlockModel(resourcelocation, list, textureslots$data, obool, unbakedmodel$guilight, itemtransforms);
++ return net.minecraftforge.client.ForgeHooksClient.deserializeBlockModel(ret, ret.getElements(), jsonobject, p_111500_);
}
- }
- @Override
- public BakedModel bake(ModelBaker p_252120_, Function p_250023_, ModelState p_251130_) {
-+ if (this.customData.getCustomGeometry() != null)
-+ return this.customData.getCustomGeometry().bake(customData, p_252120_, p_250023_, p_251130_);
- return this.bake(p_250023_, p_251130_, true);
- }
-
-@@ -229,7 +_,18 @@
- ItemTransform itemtransform5 = this.getTransform(ItemDisplayContext.GUI);
- ItemTransform itemtransform6 = this.getTransform(ItemDisplayContext.GROUND);
- ItemTransform itemtransform7 = this.getTransform(ItemDisplayContext.FIXED);
-- return new ItemTransforms(itemtransform, itemtransform1, itemtransform2, itemtransform3, itemtransform4, itemtransform5, itemtransform6, itemtransform7);
-+
-+ var builder = com.google.common.collect.ImmutableMap.builder();
-+ for (ItemDisplayContext type : ItemDisplayContext.values()) {
-+ if (type.isModded()) {
-+ var transform = this.getTransform(type);
-+ if (transform != ItemTransform.NO_TRANSFORM) {
-+ builder.put(type, transform);
-+ }
-+ }
-+ }
-+
-+ return new ItemTransforms(itemtransform, itemtransform1, itemtransform2, itemtransform3, itemtransform4, itemtransform5, itemtransform6, itemtransform7, builder.build());
- }
-
- private ItemTransform getTransform(ItemDisplayContext p_270662_) {
-@@ -347,6 +_,10 @@
-
- public boolean lightLikeBlock() {
- return this == SIDE;
-+ }
-+
-+ public String getSerializedName() {
-+ return name;
- }
- }
- }
+ private TextureSlots.Data getTextureMap(JsonObject p_111510_) {
diff --git a/patches/minecraft/net/minecraft/client/renderer/block/model/FaceBakery.java.patch b/patches/minecraft/net/minecraft/client/renderer/block/model/FaceBakery.java.patch
index 13b29d7ad4..ef03fcdd16 100644
--- a/patches/minecraft/net/minecraft/client/renderer/block/model/FaceBakery.java.patch
+++ b/patches/minecraft/net/minecraft/client/renderer/block/model/FaceBakery.java.patch
@@ -1,12 +1,11 @@
--- a/net/minecraft/client/renderer/block/model/FaceBakery.java
+++ b/net/minecraft/client/renderer/block/model/FaceBakery.java
-@@ -58,7 +_,14 @@
- this.recalculateWinding(aint, direction);
+@@ -58,7 +_,13 @@
+ recalculateWinding(aint, direction);
}
- return new BakedQuad(aint, p_111603_.tintIndex(), direction, p_111604_, p_111608_, p_364904_);
+ var data = p_111603_.data();
-+ //net.minecraftforge.client.ForgeHooksClient.fillNormal(aint, direction, data.calculateNormals());
+ var quad = new BakedQuad(aint, p_111603_.tintIndex(), direction, p_111604_, p_111608_, p_364904_, data.ambientOcclusion());
+ if (!net.minecraftforge.client.model.ForgeFaceData.DEFAULT.equals(data)) {
+ net.minecraftforge.client.model.QuadTransformers.applyingLightmap(data.blockLight(), data.skyLight()).processInPlace(quad);
diff --git a/patches/minecraft/net/minecraft/client/renderer/block/model/ItemModelGenerator.java.patch b/patches/minecraft/net/minecraft/client/renderer/block/model/ItemModelGenerator.java.patch
deleted file mode 100644
index 0c2a9b043a..0000000000
--- a/patches/minecraft/net/minecraft/client/renderer/block/model/ItemModelGenerator.java.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/net/minecraft/client/renderer/block/model/ItemModelGenerator.java
-+++ b/net/minecraft/client/renderer/block/model/ItemModelGenerator.java
-@@ -39,6 +_,8 @@
- map.put("particle", p_111672_.hasTexture("particle") ? Either.left(p_111672_.getMaterial("particle")) : map.get("layer0"));
- BlockModel blockmodel = new BlockModel(null, list, map, false, p_111672_.getGuiLight(), p_111672_.getTransforms(), p_111672_.getOverrides());
- blockmodel.name = p_111672_.name;
-+ blockmodel.customData.copyFrom(p_111672_.customData);
-+ blockmodel.customData.setGui3d(false);
- return blockmodel;
- }
-
diff --git a/patches/minecraft/net/minecraft/client/renderer/block/model/ItemTransforms.java.patch b/patches/minecraft/net/minecraft/client/renderer/block/model/ItemTransforms.java.patch
index 479bb8a726..94d09650c9 100644
--- a/patches/minecraft/net/minecraft/client/renderer/block/model/ItemTransforms.java.patch
+++ b/patches/minecraft/net/minecraft/client/renderer/block/model/ItemTransforms.java.patch
@@ -1,53 +1,23 @@
--- a/net/minecraft/client/renderer/block/model/ItemTransforms.java
+++ b/net/minecraft/client/renderer/block/model/ItemTransforms.java
-@@ -21,6 +_,7 @@
- public final ItemTransform gui;
- public final ItemTransform ground;
- public final ItemTransform fixed;
-+ public final com.google.common.collect.ImmutableMap moddedTransforms;
-
- private ItemTransforms() {
- this(
-@@ -35,6 +_,7 @@
- );
- }
-
-+ @Deprecated
- public ItemTransforms(ItemTransforms p_111807_) {
- this.thirdPersonLeftHand = p_111807_.thirdPersonLeftHand;
- this.thirdPersonRightHand = p_111807_.thirdPersonRightHand;
-@@ -44,6 +_,12 @@
- this.gui = p_111807_.gui;
- this.ground = p_111807_.ground;
- this.fixed = p_111807_.fixed;
-+ this.moddedTransforms = p_111807_.moddedTransforms;
-+ }
+@@ -19,8 +_,15 @@
+ ItemTransform head,
+ ItemTransform gui,
+ ItemTransform ground,
+- ItemTransform fixed
++ ItemTransform fixed,
++ com.google.common.collect.ImmutableMap moddedTransforms
+ ) {
+
+ @Deprecated
-+ public ItemTransforms(ItemTransform p_111798_, ItemTransform p_111799_, ItemTransform p_111800_, ItemTransform p_111801_, ItemTransform p_111802_, ItemTransform p_111803_, ItemTransform p_111804_, ItemTransform p_111805_) {
-+ this(p_111798_, p_111799_, p_111800_, p_111801_, p_111802_, p_111803_, p_111804_, p_111805_, com.google.common.collect.ImmutableMap.of());
- }
-
- public ItemTransforms(
-@@ -54,7 +_,8 @@
- ItemTransform p_111802_,
- ItemTransform p_111803_,
- ItemTransform p_111804_,
-- ItemTransform p_111805_
-+ ItemTransform p_111805_,
-+ com.google.common.collect.ImmutableMap moddedTransforms
- ) {
- this.thirdPersonLeftHand = p_111798_;
- this.thirdPersonRightHand = p_111799_;
-@@ -64,6 +_,7 @@
- this.gui = p_111803_;
- this.ground = p_111804_;
- this.fixed = p_111805_;
-+ this.moddedTransforms = moddedTransforms;
- }
-
- public ItemTransform getTransform(ItemDisplayContext p_270619_) {
-@@ -76,7 +_,7 @@
++ public ItemTransforms(ItemTransform thirdPersonLeftHand, ItemTransform thirdPersonRightHand, ItemTransform firstPersonLeftHand, ItemTransform firstPersonRightHand, ItemTransform head, ItemTransform gui, ItemTransform ground, ItemTransform fixed) {
++ this(thirdPersonLeftHand, thirdPersonRightHand, firstPersonLeftHand, firstPersonRightHand, head, gui, ground, fixed, com.google.common.collect.ImmutableMap.of());
++ }
++
+ public static final ItemTransforms NO_TRANSFORMS = new ItemTransforms(
+ ItemTransform.NO_TRANSFORM,
+ ItemTransform.NO_TRANSFORM,
+@@ -42,7 +_,7 @@
case GUI -> this.gui;
case GROUND -> this.ground;
case FIXED -> this.fixed;
@@ -56,7 +26,7 @@
};
}
-@@ -104,8 +_,23 @@
+@@ -66,8 +_,22 @@
ItemTransform itemtransform5 = this.getTransform(p_111822_, jsonobject, ItemDisplayContext.GUI);
ItemTransform itemtransform6 = this.getTransform(p_111822_, jsonobject, ItemDisplayContext.GROUND);
ItemTransform itemtransform7 = this.getTransform(p_111822_, jsonobject, ItemDisplayContext.FIXED);
@@ -69,9 +39,8 @@
+ fallbackType = fallbackType.fallback();
+ transform = this.getTransform(p_111822_, jsonobject, fallbackType);
+ }
-+ if (transform != ItemTransform.NO_TRANSFORM){
++ if (transform != ItemTransform.NO_TRANSFORM)
+ builder.put(type, transform);
-+ }
+ }
+ }
+
diff --git a/patches/minecraft/net/minecraft/client/renderer/block/model/MultiVariant.java.patch b/patches/minecraft/net/minecraft/client/renderer/block/model/MultiVariant.java.patch
deleted file mode 100644
index d34edb7658..0000000000
--- a/patches/minecraft/net/minecraft/client/renderer/block/model/MultiVariant.java.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/net/minecraft/client/renderer/block/model/MultiVariant.java
-+++ b/net/minecraft/client/renderer/block/model/MultiVariant.java
-@@ -50,7 +_,7 @@
- SimpleWeightedRandomList.Builder builder = SimpleWeightedRandomList.builder();
-
- for (Variant variant : this.variants) {
-- BakedModel bakedmodel = p_249016_.bake(variant.getModelLocation(), variant);
-+ BakedModel bakedmodel = p_249016_.bake(variant.getModelLocation(), variant, p_111851_);
- builder.add(bakedmodel, variant.getWeight());
- }
-
diff --git a/patches/minecraft/net/minecraft/client/renderer/blockentity/SkullBlockRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/blockentity/SkullBlockRenderer.java.patch
index 0e47d5cd8f..53e6125c78 100644
--- a/patches/minecraft/net/minecraft/client/renderer/blockentity/SkullBlockRenderer.java.patch
+++ b/patches/minecraft/net/minecraft/client/renderer/blockentity/SkullBlockRenderer.java.patch
@@ -1,10 +1,21 @@
--- a/net/minecraft/client/renderer/blockentity/SkullBlockRenderer.java
+++ b/net/minecraft/client/renderer/blockentity/SkullBlockRenderer.java
-@@ -55,6 +_,7 @@
- builder.put(SkullBlock.Types.CREEPER, new SkullModel(p_173662_.bakeLayer(ModelLayers.CREEPER_HEAD)));
- builder.put(SkullBlock.Types.DRAGON, new DragonHeadModel(p_173662_.bakeLayer(ModelLayers.DRAGON_SKULL)));
- builder.put(SkullBlock.Types.PIGLIN, new PiglinHeadModel(p_173662_.bakeLayer(ModelLayers.PIGLIN_HEAD)));
-+ net.minecraftforge.fml.ModLoader.get().postEvent(new net.minecraftforge.client.event.EntityRenderersEvent.CreateSkullModels(builder, p_173662_));
- return builder.build();
+@@ -33,6 +_,7 @@
+
+ @OnlyIn(Dist.CLIENT)
+ public class SkullBlockRenderer implements BlockEntityRenderer {
++ private static Map> customModels;
+ private final Function modelByType;
+ public static final Map SKIN_BY_TYPE = Util.make(Maps.newHashMap(), p_340906_ -> {
+ p_340906_.put(SkullBlock.Types.SKELETON, ResourceLocation.withDefaultNamespace("textures/entity/skeleton/skeleton.png"));
+@@ -57,7 +_,9 @@
+ case PIGLIN -> new PiglinHeadModel(p_376421_.bakeLayer(ModelLayers.PIGLIN_HEAD));
+ });
+ } else {
+- return null;
++ if (customModels == null)
++ customModels = net.minecraftforge.client.event.ForgeEventFactoryClient.onCreateSkullModels();
++ return customModels.getOrDefault(p_377655_, k -> null).apply(p_376421_);
+ }
}
diff --git a/patches/minecraft/net/minecraft/client/renderer/entity/EntityRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/entity/EntityRenderer.java.patch
index ea9bdb5fc5..75b18632c9 100644
--- a/patches/minecraft/net/minecraft/client/renderer/entity/EntityRenderer.java.patch
+++ b/patches/minecraft/net/minecraft/client/renderer/entity/EntityRenderer.java.patch
@@ -12,7 +12,7 @@
}
}
-@@ -268,7 +_,7 @@
+@@ -272,7 +_,7 @@
}
p_367427_.distanceToCameraSq = this.entityRenderDispatcher.distanceToSqr(p_367571_);
diff --git a/patches/minecraft/net/minecraft/client/renderer/entity/FishingHookRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/entity/FishingHookRenderer.java.patch
deleted file mode 100644
index 2f4a714384..0000000000
--- a/patches/minecraft/net/minecraft/client/renderer/entity/FishingHookRenderer.java.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/net/minecraft/client/renderer/entity/FishingHookRenderer.java
-+++ b/net/minecraft/client/renderer/entity/FishingHookRenderer.java
-@@ -63,7 +_,7 @@
- private Vec3 getPlayerHandPos(Player p_328037_, float p_328369_, float p_332926_) {
- int i = p_328037_.getMainArm() == HumanoidArm.RIGHT ? 1 : -1;
- ItemStack itemstack = p_328037_.getMainHandItem();
-- if (!itemstack.is(Items.FISHING_ROD)) {
-+ if (!itemstack.canPerformAction(net.minecraftforge.common.ToolActions.FISHING_ROD_CAST)) {
- i = -i;
- }
-
diff --git a/patches/minecraft/net/minecraft/client/renderer/entity/HumanoidMobRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/entity/HumanoidMobRenderer.java.patch
index df02d369b4..1bfdbebfdb 100644
--- a/patches/minecraft/net/minecraft/client/renderer/entity/HumanoidMobRenderer.java.patch
+++ b/patches/minecraft/net/minecraft/client/renderer/entity/HumanoidMobRenderer.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/renderer/entity/HumanoidMobRenderer.java
+++ b/net/minecraft/client/renderer/entity/HumanoidMobRenderer.java
-@@ -40,7 +_,7 @@
+@@ -51,7 +_,7 @@
p_369040_.isCrouching = p_362179_.isCrouching();
p_369040_.isFallFlying = p_362179_.isFallFlying();
p_369040_.isVisuallySwimming = p_362179_.isVisuallySwimming();
diff --git a/patches/minecraft/net/minecraft/client/renderer/entity/ItemFrameRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/entity/ItemFrameRenderer.java.patch
index 58e4236fa3..6759e32229 100644
--- a/patches/minecraft/net/minecraft/client/renderer/entity/ItemFrameRenderer.java.patch
+++ b/patches/minecraft/net/minecraft/client/renderer/entity/ItemFrameRenderer.java.patch
@@ -1,18 +1,18 @@
--- a/net/minecraft/client/renderer/entity/ItemFrameRenderer.java
+++ b/net/minecraft/client/renderer/entity/ItemFrameRenderer.java
-@@ -98,6 +_,7 @@
-
- int j = mapid != null ? p_361692_.rotation % 4 * 2 : p_361692_.rotation;
+@@ -96,6 +_,7 @@
+ if (p_361692_.mapId != null) {
+ int j = p_361692_.rotation % 4 * 2;
p_115061_.mulPose(Axis.ZP.rotationDegrees((float)j * 360.0F / 8.0F));
+ if (!net.minecraftforge.client.event.ForgeEventFactoryClient.onRenderItemInFrame(p_361692_, this, p_115061_, p_115062_, p_115063_)) {
- if (mapid != null) {
- p_115061_.mulPose(Axis.ZP.rotationDegrees(180.0F));
- float f2 = 0.0078125F;
-@@ -110,6 +_,7 @@
- int k = this.getLightVal(p_361692_.isGlowFrame, 15728880, p_115063_);
- p_115061_.scale(0.5F, 0.5F, 0.5F);
- this.itemRenderer.render(itemstack, ItemDisplayContext.FIXED, false, p_115061_, p_115062_, k, OverlayTexture.NO_OVERLAY, p_361692_.itemModel);
+ p_115061_.mulPose(Axis.ZP.rotationDegrees(180.0F));
+ float f2 = 0.0078125F;
+ p_115061_.scale(0.0078125F, 0.0078125F, 0.0078125F);
+@@ -103,6 +_,7 @@
+ p_115061_.translate(0.0F, 0.0F, -1.0F);
+ int i = this.getLightCoords(p_361692_.isGlowFrame, 15728850, p_115063_);
+ this.mapRenderer.render(p_361692_.mapRenderState, p_115061_, p_115062_, true, i);
+ }
- }
- }
-
+ } else if (!p_361692_.item.isEmpty()) {
+ p_115061_.mulPose(Axis.ZP.rotationDegrees((float)p_361692_.rotation * 360.0F / 8.0F));
+ int k = this.getLightCoords(p_361692_.isGlowFrame, 15728880, p_115063_);
diff --git a/patches/minecraft/net/minecraft/client/renderer/entity/ItemRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/entity/ItemRenderer.java.patch
index 0e583b1cc9..2571fbc4ec 100644
--- a/patches/minecraft/net/minecraft/client/renderer/entity/ItemRenderer.java.patch
+++ b/patches/minecraft/net/minecraft/client/renderer/entity/ItemRenderer.java.patch
@@ -1,54 +1,11 @@
--- a/net/minecraft/client/renderer/entity/ItemRenderer.java
+++ b/net/minecraft/client/renderer/entity/ItemRenderer.java
-@@ -152,7 +_,7 @@
- float p_368655_
- ) {
- p_366810_.pushPose();
-- p_369691_.getTransforms().getTransform(p_369628_).apply(p_365876_, p_366810_);
-+ p_369691_ = p_369691_.applyTransform(p_369628_, p_366810_, p_365876_);
- p_366810_.translate(-0.5F, -0.5F, p_368655_);
- this.renderItem(p_368265_, p_369628_, p_366810_, p_363829_, p_363235_, p_368132_, p_369691_, p_366607_);
- p_366810_.popPose();
-@@ -169,7 +_,8 @@
- boolean p_366488_
- ) {
- if (!p_367824_.isCustomRenderer() && (!p_364096_.is(Items.TRIDENT) || p_366488_)) {
-- RenderType rendertype = ItemBlockRenderTypes.getRenderType(p_364096_);
-+ for (var model : p_367824_.getRenderPasses(p_364096_, true)) {
-+ for (var rendertype : model.getRenderTypes(p_364096_, true)) {
- VertexConsumer vertexconsumer;
- if (hasAnimatedTexture(p_364096_) && p_364096_.hasFoil()) {
- PoseStack.Pose posestack$pose = p_370127_.last().copy();
-@@ -185,8 +_,11 @@
+@@ -130,7 +_,7 @@
+ f3 = 1.0F;
}
- this.renderModelLists(p_367824_, p_364096_, p_363416_, p_367651_, p_370127_, vertexconsumer);
-+ }
-+ }
- } else {
-- this.blockEntityRenderer.renderByItem(p_364096_, p_362035_, p_370127_, p_365365_, p_363416_, p_367651_);
-+ var blockEntityRenderer = net.minecraftforge.client.extensions.common.IClientItemExtensions.of(p_364096_).getCustomRenderer();
-+ blockEntityRenderer.renderByItem(p_364096_, p_362035_, p_370127_, p_365365_, p_363416_, p_367651_);
- }
- }
-
-@@ -232,7 +_,7 @@
- float f1 = (float)ARGB.red(i) / 255.0F;
- float f2 = (float)ARGB.green(i) / 255.0F;
- float f3 = (float)ARGB.blue(i) / 255.0F;
- p_115164_.putBulkData(posestack$pose, bakedquad, f1, f2, f3, f, p_115167_, p_115168_);
+ p_115164_.putBulkData(posestack$pose, bakedquad, f1, f2, f3, f, p_115167_, p_115168_, true);
}
}
-@@ -275,6 +_,10 @@
- @Override
- public void onResourceManagerReload(ResourceManager p_115105_) {
- this.itemModelShaper.invalidateCache();
-+ }
-+
-+ public BlockEntityWithoutLevelRenderer getBlockEntityRenderer() {
-+ return blockEntityRenderer;
- }
-
- @Nullable
diff --git a/patches/minecraft/net/minecraft/client/renderer/entity/LivingEntityRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/entity/LivingEntityRenderer.java.patch
index 66ba5e8c4e..2f5e0be8f7 100644
--- a/patches/minecraft/net/minecraft/client/renderer/entity/LivingEntityRenderer.java.patch
+++ b/patches/minecraft/net/minecraft/client/renderer/entity/LivingEntityRenderer.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/renderer/entity/LivingEntityRenderer.java
+++ b/net/minecraft/client/renderer/entity/LivingEntityRenderer.java
-@@ -69,6 +_,7 @@
+@@ -73,6 +_,7 @@
}
public void render(S p_364280_, PoseStack p_115311_, MultiBufferSource p_115312_, int p_115313_) {
@@ -8,7 +8,7 @@
p_115311_.pushPose();
if (p_364280_.hasPose(Pose.SLEEPING)) {
Direction direction = p_364280_.bedOrientation;
-@@ -104,6 +_,7 @@
+@@ -108,6 +_,7 @@
p_115311_.popPose();
super.render(p_364280_, p_115311_, p_115312_, p_115313_);
@@ -16,12 +16,11 @@
}
protected boolean shouldRenderLayers(S p_360804_) {
-@@ -284,7 +_,7 @@
-
- p_363057_.isFullyFrozen = p_368665_.isFullyFrozen();
- p_363057_.isBaby = p_368665_.isBaby();
-- p_363057_.isInWater = p_368665_.isInWater();
-+ p_363057_.isInWater = p_368665_.isInWater() || p_368665_.isInFluidType((fluidType, height) -> p_368665_.canSwimInFluidType(fluidType));
- p_363057_.isAutoSpinAttack = p_368665_.isAutoSpinAttack();
- p_363057_.hasRedOverlay = p_368665_.hurtTime > 0 || p_368665_.deathTime > 0;
- ItemStack itemstack1 = p_368665_.getItemBySlot(EquipmentSlot.HEAD);
+@@ -290,6 +_,7 @@
+ p_363057_.isFullyFrozen = p_368665_.isFullyFrozen();
+ p_363057_.isBaby = p_368665_.isBaby();
+ p_363057_.isInWater = p_368665_.isInWater();
++ p_363057_.isInWater = p_368665_.isInWaterOrSwimmable();
+ p_363057_.isAutoSpinAttack = p_368665_.isAutoSpinAttack();
+ p_363057_.hasRedOverlay = p_368665_.hurtTime > 0 || p_368665_.deathTime > 0;
+ ItemStack itemstack = p_368665_.getItemBySlot(EquipmentSlot.HEAD);
diff --git a/patches/minecraft/net/minecraft/client/renderer/entity/layers/HumanoidArmorLayer.java.patch b/patches/minecraft/net/minecraft/client/renderer/entity/layers/HumanoidArmorLayer.java.patch
index b9ccf1179a..c038c82521 100644
--- a/patches/minecraft/net/minecraft/client/renderer/entity/layers/HumanoidArmorLayer.java.patch
+++ b/patches/minecraft/net/minecraft/client/renderer/entity/layers/HumanoidArmorLayer.java.patch
@@ -1,17 +1,17 @@
--- a/net/minecraft/client/renderer/entity/layers/HumanoidArmorLayer.java
+++ b/net/minecraft/client/renderer/entity/layers/HumanoidArmorLayer.java
-@@ -45,22 +_,23 @@
+@@ -44,22 +_,23 @@
}
public void render(PoseStack p_117085_, MultiBufferSource p_117086_, int p_117087_, S p_364101_, float p_117089_, float p_117090_) {
-- this.renderArmorPiece(p_117085_, p_117086_, p_364101_.chestItem, EquipmentSlot.CHEST, p_117087_, this.getArmorModel(p_364101_, EquipmentSlot.CHEST));
-- this.renderArmorPiece(p_117085_, p_117086_, p_364101_.legsItem, EquipmentSlot.LEGS, p_117087_, this.getArmorModel(p_364101_, EquipmentSlot.LEGS));
-- this.renderArmorPiece(p_117085_, p_117086_, p_364101_.feetItem, EquipmentSlot.FEET, p_117087_, this.getArmorModel(p_364101_, EquipmentSlot.FEET));
-- this.renderArmorPiece(p_117085_, p_117086_, p_364101_.headItem, EquipmentSlot.HEAD, p_117087_, this.getArmorModel(p_364101_, EquipmentSlot.HEAD));
-+ this.renderArmorPiece(p_117085_, p_117086_, p_364101_.chestItem, EquipmentSlot.CHEST, p_117087_, this.getArmorModel(p_364101_, EquipmentSlot.CHEST), p_364101_);
-+ this.renderArmorPiece(p_117085_, p_117086_, p_364101_.legsItem, EquipmentSlot.LEGS, p_117087_, this.getArmorModel(p_364101_, EquipmentSlot.LEGS), p_364101_);
-+ this.renderArmorPiece(p_117085_, p_117086_, p_364101_.feetItem, EquipmentSlot.FEET, p_117087_, this.getArmorModel(p_364101_, EquipmentSlot.FEET), p_364101_);
-+ this.renderArmorPiece(p_117085_, p_117086_, p_364101_.headItem, EquipmentSlot.HEAD, p_117087_, this.getArmorModel(p_364101_, EquipmentSlot.HEAD), p_364101_);
+- this.renderArmorPiece(p_117085_, p_117086_, p_364101_.chestEquipment, EquipmentSlot.CHEST, p_117087_, this.getArmorModel(p_364101_, EquipmentSlot.CHEST));
+- this.renderArmorPiece(p_117085_, p_117086_, p_364101_.legsEquipment, EquipmentSlot.LEGS, p_117087_, this.getArmorModel(p_364101_, EquipmentSlot.LEGS));
+- this.renderArmorPiece(p_117085_, p_117086_, p_364101_.feetEquipment, EquipmentSlot.FEET, p_117087_, this.getArmorModel(p_364101_, EquipmentSlot.FEET));
+- this.renderArmorPiece(p_117085_, p_117086_, p_364101_.headEquipment, EquipmentSlot.HEAD, p_117087_, this.getArmorModel(p_364101_, EquipmentSlot.HEAD));
++ this.renderArmorPiece(p_117085_, p_117086_, p_364101_.chestEquipment, EquipmentSlot.CHEST, p_117087_, this.getArmorModel(p_364101_, EquipmentSlot.CHEST), p_364101_);
++ this.renderArmorPiece(p_117085_, p_117086_, p_364101_.legsEquipment, EquipmentSlot.LEGS, p_117087_, this.getArmorModel(p_364101_, EquipmentSlot.LEGS), p_364101_);
++ this.renderArmorPiece(p_117085_, p_117086_, p_364101_.feetEquipment, EquipmentSlot.FEET, p_117087_, this.getArmorModel(p_364101_, EquipmentSlot.FEET), p_364101_);
++ this.renderArmorPiece(p_117085_, p_117086_, p_364101_.headEquipment, EquipmentSlot.HEAD, p_117087_, this.getArmorModel(p_364101_, EquipmentSlot.HEAD), p_364101_);
}
- private void renderArmorPiece(PoseStack p_117119_, MultiBufferSource p_117120_, ItemStack p_366444_, EquipmentSlot p_117122_, int p_117123_, A p_117124_) {
@@ -21,16 +21,16 @@
this.getParentModel().copyPropertiesTo(p_117124_);
this.setPartVisibility(p_117124_, p_117122_);
+ var model = this.getArmorModel(state, p_117122_, p_366444_, p_117124_);
- ResourceLocation resourcelocation = equippable.model().orElseThrow();
- EquipmentModel.LayerType equipmentmodel$layertype = this.usesInnerModel(p_117122_)
- ? EquipmentModel.LayerType.HUMANOID_LEGGINGS
- : EquipmentModel.LayerType.HUMANOID;
-- this.equipmentRenderer.renderLayers(equipmentmodel$layertype, resourcelocation, p_117124_, p_366444_, p_117119_, p_117120_, p_117123_);
-+ this.equipmentRenderer.renderLayers(equipmentmodel$layertype, resourcelocation, model, p_366444_, p_117119_, p_117120_, p_117123_);
+ EquipmentClientInfo.LayerType equipmentclientinfo$layertype = this.usesInnerModel(p_117122_)
+ ? EquipmentClientInfo.LayerType.HUMANOID_LEGGINGS
+ : EquipmentClientInfo.LayerType.HUMANOID;
+ this.equipmentRenderer
+- .renderLayers(equipmentclientinfo$layertype, equippable.assetId().orElseThrow(), p_117124_, p_366444_, p_117119_, p_117120_, p_117123_);
++ .renderLayers(equipmentclientinfo$layertype, equippable.assetId().orElseThrow(), model, p_366444_, p_117119_, p_117120_, p_117123_);
}
}
-@@ -97,5 +_,12 @@
+@@ -96,5 +_,12 @@
private boolean usesInnerModel(EquipmentSlot p_117129_) {
return p_117129_ == EquipmentSlot.LEGS;
diff --git a/patches/minecraft/net/minecraft/client/renderer/entity/layers/WingsLayer.java.patch b/patches/minecraft/net/minecraft/client/renderer/entity/layers/WingsLayer.java.patch
index fbd8e17bcf..eca443d613 100644
--- a/patches/minecraft/net/minecraft/client/renderer/entity/layers/WingsLayer.java.patch
+++ b/patches/minecraft/net/minecraft/client/renderer/entity/layers/WingsLayer.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/renderer/entity/layers/WingsLayer.java
+++ b/net/minecraft/client/renderer/entity/layers/WingsLayer.java
-@@ -49,7 +_,7 @@
+@@ -57,7 +_,7 @@
}
@Nullable
diff --git a/patches/minecraft/net/minecraft/client/renderer/entity/player/PlayerRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/entity/player/PlayerRenderer.java.patch
index a01ede50d1..01bb860fa9 100644
--- a/patches/minecraft/net/minecraft/client/renderer/entity/player/PlayerRenderer.java.patch
+++ b/patches/minecraft/net/minecraft/client/renderer/entity/player/PlayerRenderer.java.patch
@@ -1,26 +1,22 @@
--- a/net/minecraft/client/renderer/entity/player/PlayerRenderer.java
+++ b/net/minecraft/client/renderer/entity/player/PlayerRenderer.java
-@@ -128,6 +_,9 @@
+@@ -128,10 +_,14 @@
+ if (itemuseanimation == ItemUseAnimation.BRUSH) {
+ return HumanoidModel.ArmPose.BRUSH;
+ }
+- } else if (!p_376602_.swinging && p_376446_.is(Items.CROSSBOW) && CrossbowItem.isCharged(p_376446_)) {
++ } else if (!p_376602_.swinging && p_376446_.getItem() instanceof CrossbowItem && CrossbowItem.isCharged(p_376446_)) {
return HumanoidModel.ArmPose.CROSSBOW_HOLD;
}
-+ if (p_362189_.pose != null)
-+ return p_362189_.pose;
++ var pose = net.minecraftforge.client.extensions.common.IClientItemExtensions.of(p_376446_).getArmPose(p_376602_, p_361073_, p_376446_);
++ if (pose != null)
++ return pose;
+
return HumanoidModel.ArmPose.ITEM;
}
}
-@@ -217,7 +_,8 @@
- ItemStack itemstack = p_361341_.getItemInHand(p_364300_);
- p_365410_.isEmpty = itemstack.isEmpty();
- p_365410_.useAnimation = !itemstack.isEmpty() ? itemstack.getUseAnimation() : null;
-- p_365410_.holdsChargedCrossbow = itemstack.is(Items.CROSSBOW) && CrossbowItem.isCharged(itemstack);
-+ p_365410_.holdsChargedCrossbow = itemstack.getItem() instanceof CrossbowItem && CrossbowItem.isCharged(itemstack);
-+ p_365410_.pose = net.minecraftforge.client.extensions.common.IClientItemExtensions.of(itemstack).getArmPose(p_361341_, p_364300_, itemstack);
- }
-
- private static void extractCapeState(AbstractClientPlayer p_366404_, PlayerRenderState p_365208_, float p_366613_) {
-@@ -251,10 +_,12 @@
+@@ -255,10 +_,12 @@
}
public void renderRightHand(PoseStack p_117771_, MultiBufferSource p_117772_, int p_117773_, ResourceLocation p_364347_, boolean p_367689_) {
@@ -33,7 +29,7 @@
this.renderHand(p_117814_, p_117815_, p_117816_, p_368419_, this.model.leftArm, p_362915_);
}
-@@ -293,5 +_,12 @@
+@@ -297,5 +_,12 @@
} else {
super.setupRotations(p_369667_, p_117803_, p_117804_, p_117805_);
}
diff --git a/patches/minecraft/net/minecraft/client/renderer/entity/state/PlayerRenderState.java.patch b/patches/minecraft/net/minecraft/client/renderer/entity/state/PlayerRenderState.java.patch
deleted file mode 100644
index b6f256947b..0000000000
--- a/patches/minecraft/net/minecraft/client/renderer/entity/state/PlayerRenderState.java.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/net/minecraft/client/renderer/entity/state/PlayerRenderState.java
-+++ b/net/minecraft/client/renderer/entity/state/PlayerRenderState.java
-@@ -48,6 +_,8 @@
-
- @OnlyIn(Dist.CLIENT)
- public static class HandState {
-+ @Nullable
-+ public net.minecraft.client.model.HumanoidModel.ArmPose pose;
- public boolean isEmpty = true;
- @Nullable
- public ItemUseAnimation useAnimation;
diff --git a/patches/minecraft/net/minecraft/client/renderer/item/BlockModelWrapper.java.patch b/patches/minecraft/net/minecraft/client/renderer/item/BlockModelWrapper.java.patch
new file mode 100644
index 0000000000..fa4c5f3dbd
--- /dev/null
+++ b/patches/minecraft/net/minecraft/client/renderer/item/BlockModelWrapper.java.patch
@@ -0,0 +1,15 @@
+--- a/net/minecraft/client/renderer/item/BlockModelWrapper.java
++++ b/net/minecraft/client/renderer/item/BlockModelWrapper.java
+@@ -55,6 +_,12 @@
+ aint[j] = this.tints.get(j).calculate(p_378482_, p_376532_, p_376906_);
+ }
+
++ // TODO: [Rendering] Figure out how to add multiple passes
++ /*
++ - RenderType rendertype = ItemBlockRenderTypes.getRenderType(p_378482_);
++ + for (var model : p_367824_.getRenderPasses(p_378482_, true)) {
++ + for (var rendertype : model.getRenderTypes(p_378482_, true)) {
++ */
+ RenderType rendertype = ItemBlockRenderTypes.getRenderType(p_378482_);
+ itemstackrenderstate$layerrenderstate.setupBlockModel(this.model, rendertype);
+ }
diff --git a/patches/minecraft/net/minecraft/client/renderer/item/ItemProperties.java.patch b/patches/minecraft/net/minecraft/client/renderer/item/ItemProperties.java.patch
deleted file mode 100644
index a82cbdded7..0000000000
--- a/patches/minecraft/net/minecraft/client/renderer/item/ItemProperties.java.patch
+++ /dev/null
@@ -1,24 +0,0 @@
---- a/net/minecraft/client/renderer/item/ItemProperties.java
-+++ b/net/minecraft/client/renderer/item/ItemProperties.java
-@@ -42,6 +_,10 @@
- private static final Map
- > PROPERTIES = Maps.newHashMap();
-
- private static ClampedItemPropertyFunction registerGeneric(ResourceLocation p_174582_, ClampedItemPropertyFunction p_174583_) {
-+ return (ClampedItemPropertyFunction) registerGeneric(p_174582_, (ItemPropertyFunction) p_174583_);
-+ }
-+
-+ public static ItemPropertyFunction registerGeneric(ResourceLocation p_174582_, ItemPropertyFunction p_174583_) {
- GENERIC_PROPERTIES.put(p_174582_, p_174583_);
- return p_174583_;
- }
-@@ -51,6 +_,10 @@
- }
-
- private static void register(Item p_174571_, ResourceLocation p_174572_, ClampedItemPropertyFunction p_174573_) {
-+ register(p_174571_, p_174572_, (ItemPropertyFunction) p_174573_);
-+ }
-+
-+ public static void register(Item p_174571_, ResourceLocation p_174572_, ItemPropertyFunction p_174573_) {
- PROPERTIES.computeIfAbsent(p_174571_, p_117828_ -> Maps.newHashMap()).put(p_174572_, p_174573_);
- }
-
diff --git a/patches/minecraft/net/minecraft/client/renderer/item/ItemStackRenderState.java.patch b/patches/minecraft/net/minecraft/client/renderer/item/ItemStackRenderState.java.patch
new file mode 100644
index 0000000000..31e45365cd
--- /dev/null
+++ b/patches/minecraft/net/minecraft/client/renderer/item/ItemStackRenderState.java.patch
@@ -0,0 +1,21 @@
+--- a/net/minecraft/client/renderer/item/ItemStackRenderState.java
++++ b/net/minecraft/client/renderer/item/ItemStackRenderState.java
+@@ -72,7 +_,7 @@
+ return null;
+ } else {
+ BakedModel bakedmodel = this.layers[p_376964_.nextInt(this.activeLayerCount)].model;
+- return bakedmodel == null ? null : bakedmodel.getParticleIcon();
++ return bakedmodel == null ? null : bakedmodel.getParticleIcon(net.minecraftforge.client.model.data.ModelData.EMPTY);
+ }
+ }
+
+@@ -149,6 +_,9 @@
+
+ void render(PoseStack p_377989_, MultiBufferSource p_377594_, int p_375616_, int p_376132_) {
+ p_377989_.pushPose();
++ if (this.model != null)
++ this.model.applyTransform(ItemStackRenderState.this.displayContext, p_377989_, ItemStackRenderState.this.isLeftHand);
++ else
+ this.transform().apply(ItemStackRenderState.this.isLeftHand, p_377989_);
+ p_377989_.translate(-0.5F, -0.5F, -0.5F);
+ if (this.specialRenderer != null) {
diff --git a/patches/minecraft/net/minecraft/client/renderer/special/SpecialModelRenderers.java.patch b/patches/minecraft/net/minecraft/client/renderer/special/SpecialModelRenderers.java.patch
new file mode 100644
index 0000000000..96a59eefef
--- /dev/null
+++ b/patches/minecraft/net/minecraft/client/renderer/special/SpecialModelRenderers.java.patch
@@ -0,0 +1,11 @@
+--- a/net/minecraft/client/renderer/special/SpecialModelRenderers.java
++++ b/net/minecraft/client/renderer/special/SpecialModelRenderers.java
+@@ -180,6 +_,8 @@
+ map.put(Blocks.TRAPPED_CHEST, GIFT_CHEST);
+ }
+
++ net.minecraftforge.client.event.ForgeEventFactoryClient.onCreateSpecialBlockRenderers(map);
++
+ Builder> builder = ImmutableMap.builder();
+ map.forEach((p_377014_, p_376072_) -> {
+ SpecialModelRenderer> specialmodelrenderer = p_376072_.bake(p_378538_);
diff --git a/patches/minecraft/net/minecraft/client/renderer/texture/AbstractTexture.java.patch b/patches/minecraft/net/minecraft/client/renderer/texture/AbstractTexture.java.patch
index 2e4f937714..38e3ff9e92 100644
--- a/patches/minecraft/net/minecraft/client/renderer/texture/AbstractTexture.java.patch
+++ b/patches/minecraft/net/minecraft/client/renderer/texture/AbstractTexture.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/renderer/texture/AbstractTexture.java
+++ b/net/minecraft/client/renderer/texture/AbstractTexture.java
-@@ -20,6 +_,8 @@
+@@ -53,6 +_,8 @@
RenderSystem.assertOnRenderThreadOrInit();
int i;
int j;
@@ -9,7 +9,7 @@
if (p_117961_) {
i = p_117962_ ? 9987 : 9729;
j = 9729;
-@@ -76,5 +_,18 @@
+@@ -110,5 +_,18 @@
@Override
public void close() {
diff --git a/patches/minecraft/net/minecraft/client/renderer/texture/SpriteContents.java.patch b/patches/minecraft/net/minecraft/client/renderer/texture/SpriteContents.java.patch
index f32fe2bd1d..97de83a047 100644
--- a/patches/minecraft/net/minecraft/client/renderer/texture/SpriteContents.java.patch
+++ b/patches/minecraft/net/minecraft/client/renderer/texture/SpriteContents.java.patch
@@ -19,25 +19,25 @@
this.name = p_249787_;
this.width = p_251031_.width();
this.height = p_251031_.height();
-@@ -44,6 +_,7 @@
- this.animatedTexture = this.createAnimatedTexture(p_251031_, p_252131_.getWidth(), p_252131_.getHeight(), animationmetadatasection);
+@@ -45,6 +_,7 @@
+ .orElse(null);
this.originalImage = p_252131_;
this.byMipLevel = new NativeImage[]{this.originalImage};
+ this.forgeMeta = forgeMeta;
}
public void increaseMipLevel(int p_248864_) {
-@@ -120,6 +_,9 @@
+@@ -130,6 +_,9 @@
void upload(int p_248895_, int p_250245_, int p_250458_, int p_251337_, NativeImage[] p_248825_) {
for (int i = 0; i < this.byMipLevel.length; i++) {
+ // Forge: Skip uploading if the texture would be made invalid by mip level
+ if ((this.width >> i) <= 0 || (this.height >> i) <= 0)
+ break;
- p_248825_[i]
- .upload(
- i,
-@@ -150,6 +_,10 @@
+ p_248825_[i].upload(i, p_248895_ >> i, p_250245_ >> i, p_250458_ >> i, p_251337_ >> i, this.width >> i, this.height >> i, false);
+ }
+ }
+@@ -149,6 +_,10 @@
return this.name;
}
@@ -48,7 +48,7 @@
public IntStream getUniqueFrames() {
return this.animatedTexture != null ? this.animatedTexture.getUniqueFrames() : IntStream.of(1);
}
-@@ -252,7 +_,8 @@
+@@ -244,7 +_,8 @@
for (int i = 0; i < this.activeFrame.length; i++) {
int j = SpriteContents.this.width >> i;
int k = SpriteContents.this.height >> i;
@@ -58,7 +58,7 @@
}
}
-@@ -267,6 +_,9 @@
+@@ -259,6 +_,9 @@
for (int k = 0; k < this.activeFrame.length; k++) {
int l = SpriteContents.this.width >> k;
int i1 = SpriteContents.this.height >> k;
diff --git a/patches/minecraft/net/minecraft/client/renderer/texture/TextureAtlas.java.patch b/patches/minecraft/net/minecraft/client/renderer/texture/TextureAtlas.java.patch
index 7d90e2f6ac..e1df40047a 100644
--- a/patches/minecraft/net/minecraft/client/renderer/texture/TextureAtlas.java.patch
+++ b/patches/minecraft/net/minecraft/client/renderer/texture/TextureAtlas.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/renderer/texture/TextureAtlas.java
+++ b/net/minecraft/client/renderer/texture/TextureAtlas.java
-@@ -87,6 +_,7 @@
+@@ -82,6 +_,7 @@
this.sprites = List.copyOf(list);
this.animatedTextures = List.copyOf(list1);
}
@@ -8,10 +8,10 @@
}
@Override
-@@ -168,5 +_,10 @@
+@@ -159,5 +_,10 @@
- public void updateFilter(SpriteLoader.Preparations p_251993_) {
- this.setFilter(false, p_251993_.mipLevel() > 0);
+ int getHeight() {
+ return this.height;
+ }
+
+ /** {@return the set of sprites in this atlas} */
diff --git a/patches/minecraft/net/minecraft/client/renderer/texture/atlas/SpriteResourceLoader.java.patch b/patches/minecraft/net/minecraft/client/renderer/texture/atlas/SpriteResourceLoader.java.patch
index edf931e4c5..bbdccff52f 100644
--- a/patches/minecraft/net/minecraft/client/renderer/texture/atlas/SpriteResourceLoader.java.patch
+++ b/patches/minecraft/net/minecraft/client/renderer/texture/atlas/SpriteResourceLoader.java.patch
@@ -1,11 +1,12 @@
--- a/net/minecraft/client/renderer/texture/atlas/SpriteResourceLoader.java
+++ b/net/minecraft/client/renderer/texture/atlas/SpriteResourceLoader.java
-@@ -45,6 +_,8 @@
- .orElse(AnimationMetadataSection.EMPTY);
- FrameSize framesize = animationmetadatasection.calculateFrameSize(nativeimage.getWidth(), nativeimage.getHeight());
- if (Mth.isMultipleOf(nativeimage.getWidth(), framesize.width()) && Mth.isMultipleOf(nativeimage.getHeight(), framesize.height())) {
-+ SpriteContents contents = net.minecraftforge.client.ForgeHooksClient.loadSpriteContents(p_296303_, p_296304_, framesize, nativeimage, resourcemetadata);
-+ if (contents != null) return contents;
- return new SpriteContents(p_296303_, framesize, nativeimage, resourcemetadata);
- } else {
- LOGGER.error(
+@@ -62,6 +_,9 @@
+ framesize = new FrameSize(nativeimage.getWidth(), nativeimage.getHeight());
+ }
+
++ SpriteContents contents = net.minecraftforge.client.ForgeHooksClient.loadSpriteContents(p_374679_, p_374680_, framesize, nativeimage, resourcemetadata);
++ if (contents != null) return contents;
++
+ return new SpriteContents(p_374679_, framesize, nativeimage, resourcemetadata);
+ };
+ }
diff --git a/patches/minecraft/net/minecraft/client/resources/model/BakedModel.java.patch b/patches/minecraft/net/minecraft/client/resources/model/BakedModel.java.patch
index 76d5076125..b3ad1b216b 100644
--- a/patches/minecraft/net/minecraft/client/resources/model/BakedModel.java.patch
+++ b/patches/minecraft/net/minecraft/client/resources/model/BakedModel.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/client/resources/model/BakedModel.java
+++ b/net/minecraft/client/resources/model/BakedModel.java
-@@ -13,7 +_,9 @@
+@@ -12,7 +_,9 @@
import net.minecraftforge.api.distmarker.OnlyIn;
@OnlyIn(Dist.CLIENT)
@@ -11,9 +11,9 @@
List getQuads(@Nullable BlockState p_235039_, @Nullable Direction p_235040_, RandomSource p_235041_);
boolean useAmbientOcclusion();
-@@ -24,9 +_,13 @@
+@@ -21,7 +_,11 @@
- boolean isCustomRenderer();
+ boolean usesBlockLight();
+ /**@deprecated Forge: Use {@link net.minecraftforge.client.extensions.IForgeBakedModel#getParticleIcon(net.minecraftforge.client.model.data.ModelData)}*/
+ @Deprecated
@@ -23,6 +23,4 @@
+ /**@deprecated Forge: Use {@link net.minecraftforge.client.extensions.IForgeBakedModel#applyTransform(ItemTransforms.TransformType, com.mojang.blaze3d.vertex.PoseStack, boolean)} instead */
+ @Deprecated
+ default ItemTransforms getTransforms() { return ItemTransforms.NO_TRANSFORMS; }
-
- default BakedOverrides overrides() {
- return BakedOverrides.EMPTY;
+ }
diff --git a/patches/minecraft/net/minecraft/client/resources/model/ModelBaker.java.patch b/patches/minecraft/net/minecraft/client/resources/model/ModelBaker.java.patch
deleted file mode 100644
index 1c60620d9c..0000000000
--- a/patches/minecraft/net/minecraft/client/resources/model/ModelBaker.java.patch
+++ /dev/null
@@ -1,14 +0,0 @@
---- a/net/minecraft/client/resources/model/ModelBaker.java
-+++ b/net/minecraft/client/resources/model/ModelBaker.java
-@@ -5,6 +_,10 @@
- import net.minecraftforge.api.distmarker.OnlyIn;
-
- @OnlyIn(Dist.CLIENT)
--public interface ModelBaker {
-+public interface ModelBaker extends net.minecraftforge.client.extensions.IForgeModelBaker {
-+ /**
-+ * @deprecated Forge: Use {@link #bake(ResourceLocation, ModelState, java.util.function.Function)} instead.
-+ */
-+ @Deprecated
- BakedModel bake(ResourceLocation p_250776_, ModelState p_251280_);
- }
diff --git a/patches/minecraft/net/minecraft/client/resources/model/ModelBakery.java.patch b/patches/minecraft/net/minecraft/client/resources/model/ModelBakery.java.patch
deleted file mode 100644
index 9db274c44f..0000000000
--- a/patches/minecraft/net/minecraft/client/resources/model/ModelBakery.java.patch
+++ /dev/null
@@ -1,45 +0,0 @@
---- a/net/minecraft/client/resources/model/ModelBakery.java
-+++ b/net/minecraft/client/resources/model/ModelBakery.java
-@@ -94,25 +_,39 @@
- }
-
- @Override
-+ public Function getModelTextureGetter() {
-+ return this.modelTextureGetter;
-+ }
-+
-+ @Override
- public BakedModel bake(ResourceLocation p_252176_, ModelState p_249765_) {
-+ return bake(p_252176_, p_249765_, this.modelTextureGetter);
-+ }
-+
-+ @Override
-+ public BakedModel bake(ResourceLocation p_252176_, ModelState p_249765_, Function sprites) {
- ModelBakery.BakedCacheKey modelbakery$bakedcachekey = new ModelBakery.BakedCacheKey(p_252176_, p_249765_.getRotation(), p_249765_.isUvLocked());
- BakedModel bakedmodel = ModelBakery.this.bakedCache.get(modelbakery$bakedcachekey);
- if (bakedmodel != null) {
- return bakedmodel;
- } else {
- UnbakedModel unbakedmodel = this.getModel(p_252176_);
-- BakedModel bakedmodel1 = this.bakeUncached(unbakedmodel, p_249765_);
-+ BakedModel bakedmodel1 = this.bakeUncached(unbakedmodel, p_249765_, sprites);
- ModelBakery.this.bakedCache.put(modelbakery$bakedcachekey, bakedmodel1);
- return bakedmodel1;
- }
- }
-
- BakedModel bakeUncached(UnbakedModel p_343761_, ModelState p_342939_) {
-+ return bakeUncached(p_343761_, p_342939_, this.modelTextureGetter);
-+ }
-+
-+ BakedModel bakeUncached(UnbakedModel p_343761_, ModelState p_342939_, Function sprites) {
- if (p_343761_ instanceof BlockModel blockmodel && blockmodel.getRootModel() == SpecialModels.GENERATED_MARKER) {
-- return ModelBakery.ITEM_MODEL_GENERATOR.generateBlockModel(this.modelTextureGetter, blockmodel).bake(this.modelTextureGetter, p_342939_, false);
-+ return ModelBakery.ITEM_MODEL_GENERATOR.generateBlockModel(sprites, blockmodel).bake(sprites, p_342939_, false);
- }
-
-- return p_343761_.bake(this, this.modelTextureGetter, p_342939_);
-+ return p_343761_.bake(this, sprites, p_342939_);
- }
- }
-
diff --git a/patches/minecraft/net/minecraft/client/resources/model/ModelManager.java.patch b/patches/minecraft/net/minecraft/client/resources/model/ModelManager.java.patch
index 59d82dd6c6..e812e33cb2 100644
--- a/patches/minecraft/net/minecraft/client/resources/model/ModelManager.java.patch
+++ b/patches/minecraft/net/minecraft/client/resources/model/ModelManager.java.patch
@@ -1,48 +1,87 @@
--- a/net/minecraft/client/resources/model/ModelManager.java
+++ b/net/minecraft/client/resources/model/ModelManager.java
-@@ -71,13 +_,14 @@
- TextureAtlas.LOCATION_BLOCKS,
+@@ -72,7 +_,9 @@
ResourceLocation.withDefaultNamespace("blocks")
);
-- private Map bakedRegistry;
-+ private Map bakedRegistry = new java.util.HashMap<>();
+ private Map bakedBlockStateModels = Map.of();
++ private Map bakedBlockStateModelsView = Map.of();
+ private Map bakedItemStackModels = Map.of();
++ private Map bakedItemStackModelsView = Map.of();
+ private Map itemProperties = Map.of();
private final AtlasSet atlases;
private final BlockModelShaper blockModelShaper;
- private final BlockColors blockColors;
- private int maxMipmapLevels;
+@@ -83,6 +_,7 @@
private BakedModel missingModel;
- private Object2IntMap modelGroups;
+ private ItemModel missingItemModel;
+ private Object2IntMap modelGroups = Object2IntMaps.emptyMap();
+ private ModelBakery modelBakery;
public ModelManager(TextureManager p_119406_, BlockColors p_119407_, int p_119408_) {
this.blockColors = p_119407_;
-@@ -102,6 +_,7 @@
+@@ -95,6 +_,10 @@
+ return this.bakedBlockStateModels.getOrDefault(p_119423_, this.missingModel);
+ }
+
++ public Map getModels() {
++ return this.bakedBlockStateModelsView;
++ }
++
+ public BakedModel getMissingModel() {
+ return this.missingModel;
+ }
+@@ -103,6 +_,10 @@
+ return this.bakedItemStackModels.getOrDefault(p_376816_, this.missingItemModel);
+ }
+
++ public Map getItemModels() {
++ return this.bakedItemStackModelsView;
++ }
++
+ public ClientItem.Properties getItemProperties(ResourceLocation p_378319_) {
+ return this.itemProperties.getOrDefault(p_378319_, ClientItem.Properties.DEFAULT);
+ }
+@@ -115,6 +_,7 @@
public final CompletableFuture reload(
PreparableReloadListener.PreparationBarrier p_249079_, ResourceManager p_251134_, Executor p_250550_, Executor p_249221_
) {
+ net.minecraftforge.client.model.geometry.GeometryLoaderManager.init();
UnbakedModel unbakedmodel = MissingBlockModel.missingModel();
- BlockStateModelLoader blockstatemodelloader = new BlockStateModelLoader(unbakedmodel);
- CompletableFuture
*/
public static class CreateSkullModels extends EntityRenderersEvent {
- private final ImmutableMap.Builder builder;
- private final EntityModelSet entityModelSet;
+ private final ImmutableMap.Builder> builder;
@ApiStatus.Internal
- public CreateSkullModels(ImmutableMap.Builder builder, EntityModelSet entityModelSet) {
+ public CreateSkullModels(ImmutableMap.Builder> builder) {
this.builder = builder;
- this.entityModelSet = entityModelSet;
- }
-
- /**
- * {@return the set of entity models}
- */
- public EntityModelSet getEntityModelSet() {
- return entityModelSet;
}
/**
@@ -228,7 +220,7 @@ public abstract class EntityRenderersEvent extends Event implements IModBusEvent
* {@link EntityModelSet#bakeLayer(ModelLayerLocation)} and pass it to the constructor for
* {@link SkullModel}.
*/
- public void registerSkullModel(SkullBlock.Type type, SkullModelBase model) {
+ public void registerSkullModel(SkullBlock.Type type, Function model) {
builder.put(type, model);
}
}
diff --git a/src/main/java/net/minecraftforge/client/event/ForgeEventFactoryClient.java b/src/main/java/net/minecraftforge/client/event/ForgeEventFactoryClient.java
index 4296b9678a..522cb64b2e 100644
--- a/src/main/java/net/minecraftforge/client/event/ForgeEventFactoryClient.java
+++ b/src/main/java/net/minecraftforge/client/event/ForgeEventFactoryClient.java
@@ -8,6 +8,8 @@ package net.minecraftforge.client.event;
import java.io.File;
import java.util.List;
import java.util.Map;
+import java.util.function.Function;
+
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.eventbus.api.Cancelable;
@@ -17,6 +19,7 @@ import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import com.google.common.collect.ImmutableMap;
import com.mojang.blaze3d.audio.Channel;
import com.mojang.blaze3d.platform.NativeImage;
import com.mojang.blaze3d.vertex.PoseStack;
@@ -32,6 +35,8 @@ import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent;
import net.minecraft.client.model.EntityModel;
+import net.minecraft.client.model.SkullModelBase;
+import net.minecraft.client.model.geom.EntityModelSet;
import net.minecraft.client.multiplayer.MultiPlayerGameMode;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.client.renderer.GameRenderer;
@@ -45,6 +50,7 @@ import net.minecraft.client.renderer.entity.state.EntityRenderState;
import net.minecraft.client.renderer.entity.state.ItemFrameRenderState;
import net.minecraft.client.renderer.entity.state.LivingEntityRenderState;
import net.minecraft.client.renderer.entity.state.PlayerRenderState;
+import net.minecraft.client.renderer.special.SpecialModelRenderer;
import net.minecraft.client.resources.PlayerSkin.Model;
import net.minecraft.client.resources.sounds.SoundInstance;
import net.minecraft.client.sounds.SoundEngine;
@@ -57,6 +63,8 @@ import net.minecraft.world.entity.HumanoidArm;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
+import net.minecraft.world.level.block.Block;
+import net.minecraft.world.level.block.SkullBlock.Type;
import net.minecraftforge.client.event.sound.PlaySoundSourceEvent;
import net.minecraftforge.client.event.sound.PlayStreamingSourceEvent;
import net.minecraftforge.eventbus.api.Event;
@@ -86,8 +94,9 @@ public final class ForgeEventFactoryClient {
/**
* Post an event to the {@link ModLoader#get()} event bus
*/
- private static void postModBus(T e) {
+ private static T postModBus(T e) {
ML.postEvent(e);
+ return e;
}
public static void onGatherLayers(Map, EntityRenderer, ?>> renderers, Map> playerRenderers, Context context) {
@@ -279,4 +288,14 @@ public final class ForgeEventFactoryClient {
public static ComputeFovModifierEvent fireFovModifierEvent(Player entity, float modifier, float scale) {
return fire(new ComputeFovModifierEvent(entity, modifier, scale));
}
+
+ public static void onCreateSpecialBlockRenderers(Map map) {
+ post(new CreateSpecialBlockRendererEvent(map));
+ }
+
+ public static Map> onCreateSkullModels() {
+ var builder = ImmutableMap.>builder();
+ postModBus(new EntityRenderersEvent.CreateSkullModels(builder));
+ return builder.build();
+ }
}
diff --git a/src/main/java/net/minecraftforge/client/event/ModelEvent.java b/src/main/java/net/minecraftforge/client/event/ModelEvent.java
index 962c882f93..47e7ea6e89 100644
--- a/src/main/java/net/minecraftforge/client/event/ModelEvent.java
+++ b/src/main/java/net/minecraftforge/client/event/ModelEvent.java
@@ -46,20 +46,20 @@ public abstract class ModelEvent extends Event {
* only on the {@linkplain LogicalSide#CLIENT logical client}.
*/
public static class ModifyBakingResult extends ModelEvent implements IModBusEvent {
- private final Map models;
private final ModelBakery modelBakery;
+ private final ModelBakery.BakingResult results;
@ApiStatus.Internal
- public ModifyBakingResult(Map models, ModelBakery modelBakery) {
- this.models = models;
+ public ModifyBakingResult(ModelBakery modelBakery, ModelBakery.BakingResult results) {
this.modelBakery = modelBakery;
+ this.results = results;
}
/**
* @return the modifiable registry map of models and their model names
*/
- public Map getModels() {
- return models;
+ public ModelBakery.BakingResult getResults() {
+ return results;
}
/**
@@ -83,13 +83,11 @@ public abstract class ModelEvent extends Event {
*/
public static class BakingCompleted extends ModelEvent implements IModBusEvent {
private final ModelManager modelManager;
- private final Map models;
private final ModelBakery modelBakery;
@ApiStatus.Internal
- public BakingCompleted(ModelManager modelManager, Map models, ModelBakery modelBakery) {
+ public BakingCompleted(ModelManager modelManager, ModelBakery modelBakery) {
this.modelManager = modelManager;
- this.models = models;
this.modelBakery = modelBakery;
}
@@ -100,13 +98,6 @@ public abstract class ModelEvent extends Event {
return modelManager;
}
- /**
- * @return an unmodifiable view of the registry map of models and their model names
- */
- public Map getModels() {
- return models;
- }
-
/**
* @return the model loader
*/
diff --git a/src/main/java/net/minecraftforge/client/event/RegisterColorHandlersEvent.java b/src/main/java/net/minecraftforge/client/event/RegisterColorHandlersEvent.java
index 2cdf48ab26..1b2b316c67 100644
--- a/src/main/java/net/minecraftforge/client/event/RegisterColorHandlersEvent.java
+++ b/src/main/java/net/minecraftforge/client/event/RegisterColorHandlersEvent.java
@@ -8,11 +8,8 @@ package net.minecraftforge.client.event;
import com.google.common.collect.ImmutableList;
import net.minecraft.client.color.block.BlockColor;
import net.minecraft.client.color.block.BlockColors;
-import net.minecraft.client.color.item.ItemColor;
-import net.minecraft.client.color.item.ItemColors;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.ColorResolver;
-import net.minecraft.world.level.ItemLike;
import net.minecraftforge.eventbus.api.Cancelable;
import net.minecraftforge.eventbus.api.Event;
import net.minecraftforge.fml.LogicalSide;
@@ -71,56 +68,6 @@ public abstract class RegisterColorHandlersEvent extends Event implements IModBu
}
}
- /**
- * Fired for registering item color handlers.
- *
- * The block colors should only be used for referencing or delegating item colors to their respective block
- * colors. Use {@link RegisterColorHandlersEvent.Block} for registering your block color handlers.
- *
- * This event is not {@linkplain Cancelable cancellable}, and does not {@linkplain HasResult have a result}.
- *
- * This event is fired on the {@linkplain FMLJavaModLoadingContext#getModEventBus() mod-specific event bus},
- * only on the {@linkplain LogicalSide#CLIENT logical client}.
- */
- public static class Item extends RegisterColorHandlersEvent {
- private final ItemColors itemColors;
- private final BlockColors blockColors;
-
- @ApiStatus.Internal
- public Item(ItemColors itemColors, BlockColors blockColors) {
- this.itemColors = itemColors;
- this.blockColors = blockColors;
- }
-
- /**
- * {@return the item colors registry}
- *
- * @see ItemColors#register(ItemColor, ItemLike...)
- */
- public ItemColors getItemColors() {
- return itemColors;
- }
-
- /**
- * {@return the block colors registry}
- * This should only be used for referencing or delegating item colors to their respective block colors.
- */
- public BlockColors getBlockColors() {
- return blockColors;
- }
-
- /**
- * Registers a {@link ItemColor} instance for a set of blocks.
- *
- * @param itemColor The color provider
- * @param items The items
- */
- @SuppressWarnings("deprecation")
- public void register(ItemColor itemColor, ItemLike... items) {
- itemColors.register(itemColor, items);
- }
- }
-
/**
* Allows registration of custom {@link ColorResolver} implementations to be used with
* {@link net.minecraft.world.level.BlockAndTintGetter#getBlockTint(BlockPos, ColorResolver)}.
diff --git a/src/main/java/net/minecraftforge/client/event/RegisterTextureAtlasSpriteLoadersEvent.java b/src/main/java/net/minecraftforge/client/event/RegisterTextureAtlasSpriteLoadersEvent.java
index 2dd38c81fe..2b264db225 100644
--- a/src/main/java/net/minecraftforge/client/event/RegisterTextureAtlasSpriteLoadersEvent.java
+++ b/src/main/java/net/minecraftforge/client/event/RegisterTextureAtlasSpriteLoadersEvent.java
@@ -6,6 +6,8 @@
package net.minecraftforge.client.event;
import com.google.common.base.Preconditions;
+import com.google.common.collect.BiMap;
+
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.client.textures.ITextureAtlasSpriteLoader;
import net.minecraftforge.eventbus.api.Cancelable;
@@ -16,8 +18,6 @@ import net.minecraftforge.fml.event.IModBusEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import org.jetbrains.annotations.ApiStatus;
-import java.util.Map;
-
/**
* Allows users to register custom {@link ITextureAtlasSpriteLoader texture atlas sprite loaders}.
*
@@ -27,10 +27,10 @@ import java.util.Map;
* only on the {@linkplain LogicalSide#CLIENT logical client}.
*/
public class RegisterTextureAtlasSpriteLoadersEvent extends Event implements IModBusEvent {
- private final Map loaders;
+ private final BiMap loaders;
@ApiStatus.Internal
- public RegisterTextureAtlasSpriteLoadersEvent(Map loaders) {
+ public RegisterTextureAtlasSpriteLoadersEvent(BiMap loaders) {
this.loaders = loaders;
}
@@ -38,8 +38,10 @@ public class RegisterTextureAtlasSpriteLoadersEvent extends Event implements IMo
* Registers a custom {@link ITextureAtlasSpriteLoader sprite loader}.
*/
public void register(String name, ITextureAtlasSpriteLoader loader) {
+ @SuppressWarnings("removal")
var key = ResourceLocation.fromNamespaceAndPath(ModLoadingContext.get().getActiveNamespace(), name);
Preconditions.checkArgument(!loaders.containsKey(key), "Sprite loader already registered: " + key);
+ Preconditions.checkArgument(!loaders.containsValue(loader), "Sprite loader already registered as " + loaders.inverse().get(loader));
loaders.put(key, loader);
}
}
diff --git a/src/main/java/net/minecraftforge/client/event/RenderItemInFrameEvent.java b/src/main/java/net/minecraftforge/client/event/RenderItemInFrameEvent.java
index 67375e94c5..62457dac93 100644
--- a/src/main/java/net/minecraftforge/client/event/RenderItemInFrameEvent.java
+++ b/src/main/java/net/minecraftforge/client/event/RenderItemInFrameEvent.java
@@ -10,7 +10,6 @@ import net.minecraft.client.renderer.LightTexture;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.entity.ItemFrameRenderer;
import net.minecraft.client.renderer.entity.state.ItemFrameRenderState;
-import net.minecraft.world.item.ItemStack;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.Cancelable;
import net.minecraftforge.eventbus.api.Event;
@@ -46,13 +45,6 @@ public class RenderItemInFrameEvent extends Event {
this.packedLight = packedLight;
}
- /**
- * {@return the item stack being rendered}
- */
- public ItemStack getItemStack() {
- return getItemFrameState().itemStack;
- }
-
/**
* {@return the item frame entity}
*/
diff --git a/src/main/java/net/minecraftforge/client/extensions/IForgeBakedModel.java b/src/main/java/net/minecraftforge/client/extensions/IForgeBakedModel.java
index a4e014374a..eae8395076 100644
--- a/src/main/java/net/minecraftforge/client/extensions/IForgeBakedModel.java
+++ b/src/main/java/net/minecraftforge/client/extensions/IForgeBakedModel.java
@@ -89,9 +89,11 @@ public interface IForgeBakedModel {
*
* @see #getRenderPasses(ItemStack, boolean)
*/
+ /*
default List getRenderTypes(ItemStack itemStack, boolean fabulous) {
return List.of(RenderTypeHelper.getFallbackItemRenderType(itemStack, self()));
}
+ */
/**
* Gets an ordered list of baked models used to render this model as an item.
@@ -101,7 +103,9 @@ public interface IForgeBakedModel {
*
* @see #getRenderTypes(ItemStack, boolean)
*/
+ /*
default List getRenderPasses(ItemStack itemStack, boolean fabulous) {
return List.of(self());
}
+ */
}
diff --git a/src/main/java/net/minecraftforge/client/extensions/IForgeModelBaker.java b/src/main/java/net/minecraftforge/client/extensions/IForgeModelBaker.java
deleted file mode 100644
index cc907bc319..0000000000
--- a/src/main/java/net/minecraftforge/client/extensions/IForgeModelBaker.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (c) Forge Development LLC and contributors
- * SPDX-License-Identifier: LGPL-2.1-only
- */
-
-package net.minecraftforge.client.extensions;
-
-import net.minecraft.client.renderer.texture.TextureAtlasSprite;
-import net.minecraft.client.resources.model.BakedModel;
-import net.minecraft.client.resources.model.Material;
-import net.minecraft.client.resources.model.ModelState;
-import net.minecraft.resources.ResourceLocation;
-import org.jetbrains.annotations.Nullable;
-import java.util.function.Function;
-
-public interface IForgeModelBaker {
- @Nullable
- BakedModel bake(ResourceLocation location, ModelState state, Function sprites);
-
- Function getModelTextureGetter();
-}
diff --git a/src/main/java/net/minecraftforge/client/extensions/common/IClientFluidTypeExtensions.java b/src/main/java/net/minecraftforge/client/extensions/common/IClientFluidTypeExtensions.java
index 66cdf2f8dc..cd2f5dfa0e 100644
--- a/src/main/java/net/minecraftforge/client/extensions/common/IClientFluidTypeExtensions.java
+++ b/src/main/java/net/minecraftforge/client/extensions/common/IClientFluidTypeExtensions.java
@@ -5,16 +5,14 @@
package net.minecraftforge.client.extensions.common;
-import com.mojang.blaze3d.shaders.FogShape;
import com.mojang.blaze3d.vertex.PoseStack;
-import java.util.Objects;
import java.util.function.Consumer;
-import java.util.stream.Stream;
import net.minecraft.client.Camera;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.renderer.FogParameters;
import net.minecraft.client.renderer.FogRenderer;
+import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.ScreenEffectRenderer;
import net.minecraft.core.BlockPos;
import net.minecraft.resources.ResourceLocation;
@@ -137,10 +135,10 @@ public interface IClientFluidTypeExtensions {
* @param mc the client instance
* @param poseStack the transformations representing the current rendering position
*/
- default void renderOverlay(Minecraft mc, PoseStack poseStack) {
+ default void renderOverlay(Minecraft mc, PoseStack poseStack, MultiBufferSource buffer) {
ResourceLocation texture = this.getRenderOverlayTexture(mc);
if (texture != null)
- ScreenEffectRenderer.renderFluid(mc, poseStack, texture);
+ ScreenEffectRenderer.renderFluid(mc, poseStack, buffer, texture);
}
/**
diff --git a/src/main/java/net/minecraftforge/client/extensions/common/IClientItemExtensions.java b/src/main/java/net/minecraftforge/client/extensions/common/IClientItemExtensions.java
index f6a62543db..748ebfb880 100644
--- a/src/main/java/net/minecraftforge/client/extensions/common/IClientItemExtensions.java
+++ b/src/main/java/net/minecraftforge/client/extensions/common/IClientItemExtensions.java
@@ -6,15 +6,12 @@
package net.minecraftforge.client.extensions.common;
import com.mojang.blaze3d.vertex.PoseStack;
-import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
import net.minecraft.client.model.HumanoidModel;
import net.minecraft.client.model.Model;
import net.minecraft.client.player.LocalPlayer;
-import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer;
import net.minecraft.client.renderer.entity.state.HumanoidRenderState;
import net.minecraft.client.renderer.entity.state.LivingEntityRenderState;
-import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.HumanoidArm;
@@ -22,7 +19,6 @@ import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
-import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.client.ForgeHooksClient;
import net.minecraftforge.client.IArmPoseTransformer;
import net.minecraftforge.fml.LogicalSide;
@@ -142,18 +138,6 @@ public interface IClientItemExtensions {
*/
default void renderHelmetOverlay(ItemStack stack, Player player, int width, int height, float partialTick) { }
- /**
- * Queries this item's renderer.
- *
- * Only used if {@link BakedModel#isCustomRenderer()} returns {@code true} or {@link BlockState#getRenderShape()}
- * returns {@link net.minecraft.world.level.block.RenderShape#ENTITYBLOCK_ANIMATED}.
- *
- * By default, returns vanilla's block entity renderer.
- */
- default BlockEntityWithoutLevelRenderer getCustomRenderer() {
- return Minecraft.getInstance().getItemRenderer().getBlockEntityRenderer();
- }
-
enum FontContext {
/**
* Used to display the amount of items in the {@link ItemStack}.
diff --git a/src/main/java/net/minecraftforge/client/gui/LoadingErrorScreen.java b/src/main/java/net/minecraftforge/client/gui/LoadingErrorScreen.java
index 876beadd3e..ee37fe8464 100644
--- a/src/main/java/net/minecraftforge/client/gui/LoadingErrorScreen.java
+++ b/src/main/java/net/minecraftforge/client/gui/LoadingErrorScreen.java
@@ -103,11 +103,6 @@ public class LoadingErrorScreen extends ErrorScreen {
warnings.forEach(w->addEntry(new LoadingMessageEntry(Component.literal(w.formatToString()))));
}
- @Override
- protected int getScrollbarPosition() {
- return this.getRight() - 6;
- }
-
@Override
public int getRowWidth() {
return this.width;
diff --git a/src/main/java/net/minecraftforge/client/gui/ModListScreen.java b/src/main/java/net/minecraftforge/client/gui/ModListScreen.java
index 12d9f4c31d..2be789d57a 100644
--- a/src/main/java/net/minecraftforge/client/gui/ModListScreen.java
+++ b/src/main/java/net/minecraftforge/client/gui/ModListScreen.java
@@ -22,7 +22,6 @@ import net.minecraftforge.client.ConfigScreenHandler;
import net.minecraftforge.client.gui.widget.ModListWidget;
import net.minecraftforge.client.gui.widget.ScrollPanel;
import net.minecraftforge.fml.loading.moddiscovery.ModFileInfo;
-import org.apache.commons.lang3.tuple.Pair;
import org.apache.maven.artifact.versioning.ComparableVersion;
import com.mojang.blaze3d.systems.RenderSystem;
@@ -58,6 +57,7 @@ import net.minecraft.network.chat.Style;
import org.slf4j.Logger;
public class ModListScreen extends Screen {
+ private static final ResourceLocation LOGO = ResourceLocation.fromNamespaceAndPath("forge", "mod_logo");
private static String stripControlCodes(String value) { return net.minecraft.util.StringUtil.stripColor(value); }
private static final Logger LOGGER = LogUtils.getLogger();
private enum SortType implements Comparator {
@@ -378,6 +378,9 @@ public class ModListScreen extends Screen {
updateCache();
}
+ record Logo(ResourceLocation texture, Size2i size) {}
+ private static final Logo NONE = new Logo(null, new Size2i(0, 0));
+
private void updateCache() {
if (selected == null) {
this.configButton.active = false;
@@ -390,8 +393,9 @@ public class ModListScreen extends Screen {
List lines = new ArrayList<>();
VersionChecker.CheckResult vercheck = VersionChecker.getResult(selectedMod);
- @SuppressWarnings("resource")
- Pair logoData = selectedMod.getLogoFile().map(logoFile -> {
+ var logoData = NONE;
+ var logoFile = selectedMod.getLogoFile().orElse(null);
+ if (logoFile != null) {
TextureManager tm = this.minecraft.getTextureManager();
try {
@@ -404,20 +408,26 @@ public class ModListScreen extends Screen {
}
if (logo != null) {
- return Pair.of(tm.register("modlogo", new DynamicTexture(logo) {
+
+ var texture = new DynamicTexture(logo) {
@Override
public void upload() {
- this.bind();
- NativeImage td = this.getPixels();
- // Use custom "blur" value which controls texture filtering (nearest-neighbor vs linear)
- this.getPixels().upload(0, 0, 0, 0, 0, td.getWidth(), td.getHeight(), selectedMod.getLogoBlur(), false, false, false);
+ var pixels = this.getPixels();
+ if (pixels != null) {
+ this.bind();
+ // Use custom "blur" value which controls texture filtering (nearest-neighbor vs linear)
+ pixels.upload(0, 0, 0, selectedMod.getLogoBlur());
+ }
}
- }), new Size2i(logo.getWidth(), logo.getHeight()));
+ };
+
+ tm.register(LOGO, texture);
+ var size = new Size2i(logo.getWidth(), logo.getHeight());
+
+ logoData = new Logo(LOGO, size);
}
} catch (IOException e) { }
-
- return Pair.of(null, new Size2i(0, 0));
- }).orElse(Pair.of(null, new Size2i(0, 0)));
+ }
lines.add(selectedMod.getDisplayName());
lines.add(ForgeI18n.parseMessage("fml.menu.mods.info.version", MavenVersionStringHelper.artifactVersionToString(selectedMod.getVersion())));
@@ -461,7 +471,7 @@ public class ModListScreen extends Screen {
}
}
- modInfo.setInfo(lines, logoData.getLeft(), logoData.getRight());
+ modInfo.setInfo(lines, logoData.texture(), logoData.size());
}
@Override
diff --git a/src/main/java/net/minecraftforge/client/gui/widget/ModListWidget.java b/src/main/java/net/minecraftforge/client/gui/widget/ModListWidget.java
index 204a4dc771..e6e2a527c3 100644
--- a/src/main/java/net/minecraftforge/client/gui/widget/ModListWidget.java
+++ b/src/main/java/net/minecraftforge/client/gui/widget/ModListWidget.java
@@ -35,11 +35,6 @@ public class ModListWidget extends ObjectSelectionList {
this.refreshList();
}
- @Override
- protected int getScrollbarPosition() {
- return this.listWidth;
- }
-
@Override
public int getRowWidth() {
return this.listWidth;
diff --git a/src/main/java/net/minecraftforge/client/model/BakedModelWrapper.java b/src/main/java/net/minecraftforge/client/model/BakedModelWrapper.java
index 7365831ac9..a3b62648dd 100644
--- a/src/main/java/net/minecraftforge/client/model/BakedModelWrapper.java
+++ b/src/main/java/net/minecraftforge/client/model/BakedModelWrapper.java
@@ -7,7 +7,6 @@ package net.minecraftforge.client.model;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.renderer.RenderType;
-import net.minecraft.client.renderer.block.model.BakedOverrides;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.renderer.block.model.ItemTransforms;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
@@ -16,7 +15,6 @@ import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.util.RandomSource;
import net.minecraft.world.item.ItemDisplayContext;
-import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.client.ChunkRenderTypeSet;
@@ -68,11 +66,6 @@ public abstract class BakedModelWrapper implements BakedMo
return originalModel.usesBlockLight();
}
- @Override
- public boolean isCustomRenderer() {
- return originalModel.isCustomRenderer();
- }
-
@Override
public TextureAtlasSprite getParticleIcon() {
return originalModel.getParticleIcon();
@@ -83,11 +76,6 @@ public abstract class BakedModelWrapper implements BakedMo
return originalModel.getTransforms();
}
- @Override
- public BakedOverrides overrides() {
- return originalModel.overrides();
- }
-
@Override
public BakedModel applyTransform(ItemDisplayContext cameraTransformType, PoseStack poseStack, boolean applyLeftHandTransform) {
return originalModel.applyTransform(cameraTransformType, poseStack, applyLeftHandTransform);
@@ -114,14 +102,4 @@ public abstract class BakedModelWrapper implements BakedMo
public ChunkRenderTypeSet getRenderTypes(@NotNull BlockState state, @NotNull RandomSource rand, @NotNull ModelData data) {
return originalModel.getRenderTypes(state, rand, data);
}
-
- @Override
- public List getRenderTypes(ItemStack itemStack, boolean fabulous) {
- return originalModel.getRenderTypes(itemStack, fabulous);
- }
-
- @Override
- public List getRenderPasses(ItemStack itemStack, boolean fabulous) {
- return originalModel.getRenderPasses(itemStack, fabulous);
- }
}
diff --git a/src/main/java/net/minecraftforge/client/model/CompositeModel.java b/src/main/java/net/minecraftforge/client/model/CompositeModel.java
index 806734bd6d..4d8ec110cd 100644
--- a/src/main/java/net/minecraftforge/client/model/CompositeModel.java
+++ b/src/main/java/net/minecraftforge/client/model/CompositeModel.java
@@ -24,6 +24,7 @@ import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.renderer.block.model.BlockModel;
import net.minecraft.client.renderer.block.model.ItemTransforms;
+import net.minecraft.client.renderer.block.model.TextureSlots;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.client.resources.model.Material;
@@ -64,9 +65,8 @@ public class CompositeModel implements IUnbakedGeometry {
}
@Override
- public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, Function spriteGetter, ModelState modelState) {
- Material particleLocation = context.getMaterial("particle");
- TextureAtlasSprite particle = spriteGetter.apply(particleLocation);
+ public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, TextureSlots textures, ModelState modelState) {
+ var particle = baker.sprites().maybeMissing(textures, "particle");
var rootTransform = context.getRootTransform();
if (!rootTransform.isIdentity())
@@ -78,7 +78,7 @@ public class CompositeModel implements IUnbakedGeometry {
if (!context.isComponentVisible(name, true))
continue;
var model = entry.getValue();
- bakedPartsBuilder.put(name, model.bake(baker, spriteGetter, modelState));
+ bakedPartsBuilder.put(name, model.bake(textures, baker, modelState, model.getAmbientOcclusion(), model.getGuiLight().lightLikeBlock(), model.getTransforms()));
}
var bakedParts = bakedPartsBuilder.build();
@@ -158,11 +158,6 @@ public class CompositeModel implements IUnbakedGeometry {
return isSideLit;
}
- @Override
- public boolean isCustomRenderer() {
- return false;
- }
-
@Override
public TextureAtlasSprite getParticleIcon() {
return particle;
@@ -181,11 +176,6 @@ public class CompositeModel implements IUnbakedGeometry {
return ChunkRenderTypeSet.union(sets);
}
- @Override
- public List getRenderPasses(ItemStack itemStack, boolean fabulous) {
- return itemPasses;
- }
-
@Nullable
public BakedModel getPart(String name) {
return children.get(name);
@@ -223,7 +213,7 @@ public class CompositeModel implements IUnbakedGeometry {
}
private void addLayer(RenderTypeGroup renderTypes, List quads) {
- var modelBuilder = IModelBuilder.of(isAmbientOcclusion, isSideLit, isGui3d, transforms, particle, renderTypes);
+ var modelBuilder = IModelBuilder.of(isAmbientOcclusion, isSideLit, isGui3d, transforms, particle/*, renderTypes*/);
quads.forEach(modelBuilder::addUnculledFace);
children.add(modelBuilder.build());
}
diff --git a/src/main/java/net/minecraftforge/client/model/DynamicFluidContainerModel.java b/src/main/java/net/minecraftforge/client/model/DynamicFluidContainerModel.java
index fdec1f902e..b86f6563ab 100644
--- a/src/main/java/net/minecraftforge/client/model/DynamicFluidContainerModel.java
+++ b/src/main/java/net/minecraftforge/client/model/DynamicFluidContainerModel.java
@@ -5,27 +5,21 @@
package net.minecraftforge.client.model;
-import com.google.common.collect.Maps;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonObject;
import com.mojang.math.Transformation;
-import net.minecraft.client.color.item.ItemColor;
-import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.renderer.RenderType;
-import net.minecraft.client.renderer.block.model.BakedOverrides;
+import net.minecraft.client.renderer.block.model.TextureSlots;
+import net.minecraft.client.renderer.texture.TextureAtlas;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.resources.model.BakedModel;
-import net.minecraft.client.resources.model.BlockModelRotation;
import net.minecraft.client.resources.model.Material;
import net.minecraft.client.resources.model.ModelBaker;
import net.minecraft.client.resources.model.ModelState;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.GsonHelper;
-import net.minecraft.world.entity.LivingEntity;
-import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.material.Fluid;
import net.minecraft.world.level.material.Fluids;
-import net.minecraftforge.client.ForgeHooksClient;
import net.minecraftforge.client.ForgeRenderTypes;
import net.minecraftforge.client.RenderTypeGroup;
import net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions;
@@ -34,18 +28,10 @@ import net.minecraftforge.client.model.geometry.IGeometryLoader;
import net.minecraftforge.client.model.geometry.IUnbakedGeometry;
import net.minecraftforge.client.model.geometry.StandaloneGeometryBakingContext;
import net.minecraftforge.client.model.geometry.UnbakedGeometryHelper;
-import net.minecraftforge.fluids.FluidUtil;
import net.minecraftforge.registries.ForgeRegistries;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
import org.joml.Quaternionf;
import org.joml.Vector3f;
-import java.util.Map;
-import java.util.function.Function;
-
-import static net.minecraftforge.client.model.geometry.StandaloneGeometryBakingContext.LOCATION;
-
/**
* A dynamic fluid container model, capable of re-texturing itself at runtime to match the contained fluid.
*
@@ -85,18 +71,21 @@ public class DynamicFluidContainerModel implements IUnbakedGeometry spriteGetter, ModelState modelState) {
- Material particleLocation = context.hasMaterial("particle") ? context.getMaterial("particle") : null;
- Material baseLocation = context.hasMaterial("base") ? context.getMaterial("base") : null;
- Material fluidMaskLocation = context.hasMaterial("fluid") ? context.getMaterial("fluid") : null;
- Material coverLocation = context.hasMaterial("cover") ? context.getMaterial("cover") : null;
+ public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, TextureSlots textures, ModelState modelState) {
+ Material fluidMaskLocation = textures.getMaterial("fluid");
+ Material stillMaterial = null;
+ if (fluid != Fluids.EMPTY) {
+ var stillTexture = IClientFluidTypeExtensions.of(fluid).getStillTexture();
+ stillMaterial = new Material(TextureAtlas.LOCATION_BLOCKS, stillTexture);
+ }
- TextureAtlasSprite baseSprite = baseLocation != null ? spriteGetter.apply(baseLocation) : null;
- TextureAtlasSprite fluidSprite = fluid != Fluids.EMPTY ? spriteGetter.apply(ForgeHooksClient.getBlockMaterial(IClientFluidTypeExtensions.of(fluid).getStillTexture())) : null;
- TextureAtlasSprite coverSprite = (coverLocation != null && (!coverIsMask || baseLocation != null)) ? spriteGetter.apply(coverLocation) : null;
-
- TextureAtlasSprite particleSprite = particleLocation != null ? spriteGetter.apply(particleLocation) : null;
+ var sprites = baker.sprites();
+ var baseSprite = sprites.maybeMissing(textures, "base");
+ var fluidSprite = stillMaterial == null ? null : sprites.get(stillMaterial);
+ var coverSprite = sprites.maybeMissing(textures, "cover"); // (coverLocation != null && (!coverIsMask || baseLocation != null)) ? textures.apply(coverLocation) : null;
+ var particleSprite = sprites.maybeMissing(textures, "particle");
if (particleSprite == null) particleSprite = fluidSprite;
if (particleSprite == null) particleSprite = baseSprite;
@@ -110,12 +99,12 @@ public class DynamicFluidContainerModel implements IUnbakedGeometry baseSprite, modelState);
@@ -123,7 +112,7 @@ public class DynamicFluidContainerModel implements IUnbakedGeometry
- {
+ public static final class Loader implements IGeometryLoader {
public static final Loader INSTANCE = new Loader();
- private Loader()
- {
- }
+ private Loader() { }
@Override
- public DynamicFluidContainerModel read(JsonObject jsonObject, JsonDeserializationContext deserializationContext)
- {
+ public DynamicFluidContainerModel read(JsonObject jsonObject, JsonDeserializationContext deserializationContext) {
if (!jsonObject.has("fluid"))
throw new RuntimeException("Bucket model requires 'fluid' value.");
@@ -180,52 +165,4 @@ public class DynamicFluidContainerModel implements IUnbakedGeometry cache = Maps.newHashMap(); // contains all the baked models since they'll never change
- private final BakedOverrides nested;
- private final ModelBaker baker;
- private final IGeometryBakingContext owner;
- private final DynamicFluidContainerModel parent;
-
- private ContainedFluidOverrideHandler(BakedOverrides nested, ModelBaker baker, IGeometryBakingContext owner, DynamicFluidContainerModel parent) {
- this.nested = nested;
- this.baker = baker;
- this.owner = owner;
- this.parent = parent;
- }
-
- @Override
- public BakedModel findOverride(ItemStack stack, @Nullable ClientLevel level, @Nullable LivingEntity entity, int seed) {
- BakedModel overridden = nested.findOverride(stack, level, entity, seed);
- if (overridden != null)
- return overridden;
-
- var fluidStack = FluidUtil.getFluidContained(stack).orElse(null);
- if (fluidStack == null)
- return null;
-
- Fluid fluid = fluidStack.getFluid();
- String name = ForgeRegistries.FLUIDS.getKey(fluid).toString();
-
- if (!cache.containsKey(name)) {
- DynamicFluidContainerModel unbaked = this.parent.withFluid(fluid);
- BakedModel bakedModel = unbaked.bake(owner, baker, Material::sprite, BlockModelRotation.X0_Y0);//, nested);
- cache.put(name, bakedModel);
- return bakedModel;
- }
-
- return cache.get(name);
- }
- }
-
- public static class Colors implements ItemColor {
- @Override
- public int getColor(@NotNull ItemStack stack, int tintIndex) {
- if (tintIndex != 1) return 0xFFFFFFFF;
- return FluidUtil.getFluidContained(stack)
- .map(fluidStack -> IClientFluidTypeExtensions.of(fluidStack.getFluid()).getTintColor(fluidStack))
- .orElse(0xFFFFFFFF);
- }
- }
}
diff --git a/src/main/java/net/minecraftforge/client/model/ElementsModel.java b/src/main/java/net/minecraftforge/client/model/ElementsModel.java
index 92e98a5c80..b92899e14d 100644
--- a/src/main/java/net/minecraftforge/client/model/ElementsModel.java
+++ b/src/main/java/net/minecraftforge/client/model/ElementsModel.java
@@ -11,15 +11,11 @@ import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import java.util.ArrayList;
import java.util.List;
-import java.util.function.Function;
import net.minecraft.client.renderer.block.model.BlockElement;
-import net.minecraft.client.renderer.block.model.BlockModel;
-import net.minecraft.client.renderer.texture.TextureAtlasSprite;
-import net.minecraft.client.resources.model.Material;
+import net.minecraft.client.renderer.block.model.TextureSlots;
import net.minecraft.client.resources.model.ModelBaker;
import net.minecraft.client.resources.model.ModelState;
-import net.minecraft.core.Direction;
-import net.minecraft.resources.ResourceLocation;
+import net.minecraft.client.resources.model.SimpleBakedModel;
import net.minecraft.util.GsonHelper;
import net.minecraftforge.client.model.geometry.IGeometryBakingContext;
import net.minecraftforge.client.model.geometry.IGeometryLoader;
@@ -29,18 +25,17 @@ import net.minecraftforge.client.model.geometry.UnbakedGeometryHelper;
/**
* A model composed of vanilla {@linkplain BlockElement block elements}.
*/
-public class ElementsModel extends SimpleUnbakedGeometry
-{
+public class ElementsModel extends SimpleUnbakedGeometry {
private final List elements;
- public ElementsModel(List elements)
- {
+ public ElementsModel(List elements) {
this.elements = elements;
}
+
@Override
- protected void addQuads(IGeometryBakingContext context, IModelBuilder> modelBuilder, ModelBaker baker, Function spriteGetter, ModelState modelState)
- {
+ protected void addQuads(IGeometryBakingContext context, IModelBuilder> modelBuilder, ModelBaker baker, TextureSlots textures, ModelState modelState) {
+ //protected void addQuads(IGeometryBakingContext context, IModelBuilder> modelBuilder, ModelBaker baker, Function spriteGetter, ModelState modelState) {
// If there is a root transform, undo the ModelState transform, apply it, then re-apply the ModelState transform.
// This is necessary because of things like UV locking, which should only respond to the ModelState, and as such
// that is the only transform that should be applied during face bake.
@@ -48,14 +43,13 @@ public class ElementsModel extends SimpleUnbakedGeometry
var rootTransform = context.getRootTransform();
if (!rootTransform.isIdentity())
postTransform = UnbakedGeometryHelper.applyRootTransform(modelState, rootTransform);
+ var sprites = baker.sprites();
- for (BlockElement element : elements)
- {
- for (Direction direction : element.faces.keySet())
- {
+ for (var element : elements) {
+ for (var direction : element.faces.keySet()) {
var face = element.faces.get(direction);
- var sprite = spriteGetter.apply(context.getMaterial(face.texture()));
- var quad = BlockModel.bakeFace(element, face, sprite, direction, modelState);
+ var sprite = sprites.maybeMissing(textures, face.texture());
+ var quad = SimpleBakedModel.bakeFace(element, face, sprite, direction, modelState);
postTransform.processInPlace(quad);
if (face.cullForDirection() == null)
@@ -66,25 +60,18 @@ public class ElementsModel extends SimpleUnbakedGeometry
}
}
- public static final class Loader implements IGeometryLoader
- {
+ public static final class Loader implements IGeometryLoader {
public static final Loader INSTANCE = new Loader();
-
- private Loader()
- {
- }
+ private Loader() { }
@Override
- public ElementsModel read(JsonObject jsonObject, JsonDeserializationContext deserializationContext) throws JsonParseException
- {
+ public ElementsModel read(JsonObject jsonObject, JsonDeserializationContext deserializationContext) throws JsonParseException {
if (!jsonObject.has("elements"))
throw new JsonParseException("An element model must have an \"elements\" member.");
List elements = new ArrayList<>();
for (JsonElement element : GsonHelper.getAsJsonArray(jsonObject, "elements"))
- {
elements.add(deserializationContext.deserialize(element, BlockElement.class));
- }
return new ElementsModel(elements);
}
diff --git a/src/main/java/net/minecraftforge/client/model/EmptyModel.java b/src/main/java/net/minecraftforge/client/model/EmptyModel.java
index 3f0b4c5821..5d89c7de5b 100644
--- a/src/main/java/net/minecraftforge/client/model/EmptyModel.java
+++ b/src/main/java/net/minecraftforge/client/model/EmptyModel.java
@@ -7,17 +7,16 @@ package net.minecraftforge.client.model;
import java.util.List;
import java.util.Map;
-import java.util.function.Function;
import net.minecraft.client.renderer.block.model.ItemTransforms;
+import net.minecraft.client.renderer.block.model.TextureSlots;
import net.minecraft.client.renderer.texture.MissingTextureAtlasSprite;
+import net.minecraft.client.renderer.texture.TextureAtlas;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.client.resources.model.Material;
import net.minecraft.client.resources.model.ModelBaker;
import net.minecraft.client.resources.model.ModelState;
import net.minecraft.client.resources.model.SimpleBakedModel;
-import net.minecraft.world.inventory.InventoryMenu;
-import net.minecraftforge.client.RenderTypeGroup;
import net.minecraftforge.client.model.geometry.IGeometryBakingContext;
import net.minecraftforge.client.model.geometry.IGeometryLoader;
import net.minecraftforge.client.model.geometry.IUnbakedGeometry;
@@ -37,20 +36,20 @@ public class EmptyModel extends SimpleUnbakedGeometry {
private EmptyModel() { }
@Override
- protected void addQuads(IGeometryBakingContext owner, IModelBuilder> modelBuilder, ModelBaker baker, Function spriteGetter, ModelState modelTransform) {
+ protected void addQuads(IGeometryBakingContext owner, IModelBuilder> modelBuilder, ModelBaker baker, TextureSlots textures, ModelState modelTransform) {
// NO-OP
}
@Override
- public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, Function spriteGetter, ModelState modelState) {
+ public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, TextureSlots spriteGetter, ModelState modelState) {
return BAKED;
}
private static class Baked extends SimpleBakedModel {
- private static final Material MISSING_TEXTURE = new Material(InventoryMenu.BLOCK_ATLAS, MissingTextureAtlasSprite.getLocation());
+ private static final Material MISSING_TEXTURE = new Material(TextureAtlas.LOCATION_BLOCKS, MissingTextureAtlasSprite.getLocation());
public Baked() {
- super(List.of(), Map.of(), false, false, false, UnitTextureAtlasSprite.INSTANCE, ItemTransforms.NO_TRANSFORMS, RenderTypeGroup.EMPTY);
+ super(List.of(), Map.of(), false, false, false, UnitTextureAtlasSprite.INSTANCE, ItemTransforms.NO_TRANSFORMS/*, RenderTypeGroup.EMPTY*/);
}
@Override
diff --git a/src/main/java/net/minecraftforge/client/model/ExtendedBlockModelDeserializer.java b/src/main/java/net/minecraftforge/client/model/ExtendedBlockModelDeserializer.java
deleted file mode 100644
index 59999748d9..0000000000
--- a/src/main/java/net/minecraftforge/client/model/ExtendedBlockModelDeserializer.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (c) Forge Development LLC and contributors
- * SPDX-License-Identifier: LGPL-2.1-only
- */
-
-package net.minecraftforge.client.model;
-
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import com.google.gson.JsonDeserializationContext;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParseException;
-import com.mojang.math.Transformation;
-import net.minecraft.client.renderer.block.model.BlockElement;
-import net.minecraft.client.renderer.block.model.BlockElementFace;
-import net.minecraft.client.renderer.block.model.BlockFaceUV;
-import net.minecraft.client.renderer.block.model.BlockModel;
-import net.minecraft.client.renderer.block.model.ItemOverride;
-import net.minecraft.client.renderer.block.model.ItemTransform;
-import net.minecraft.client.renderer.block.model.ItemTransforms;
-import net.minecraft.resources.ResourceLocation;
-import net.minecraft.util.GsonHelper;
-import net.minecraftforge.client.model.geometry.GeometryLoaderManager;
-import net.minecraftforge.client.model.geometry.IUnbakedGeometry;
-import net.minecraftforge.common.util.TransformationHelper;
-import org.jetbrains.annotations.Nullable;
-
-import java.lang.reflect.Type;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-/**
- * A version of {@link BlockModel.Deserializer} capable of deserializing models with custom loaders, as well as other
- * changes introduced to the spec by Forge.
- */
-public class ExtendedBlockModelDeserializer extends BlockModel.Deserializer
-{
- public static final Gson INSTANCE = (new GsonBuilder())
- .registerTypeAdapter(BlockModel.class, new ExtendedBlockModelDeserializer())
- .registerTypeAdapter(BlockElement.class, new BlockElement.Deserializer())
- .registerTypeAdapter(BlockElementFace.class, new BlockElementFace.Deserializer())
- .registerTypeAdapter(BlockFaceUV.class, new BlockFaceUV.Deserializer())
- .registerTypeAdapter(ItemTransform.class, new ItemTransform.Deserializer())
- .registerTypeAdapter(ItemTransforms.class, new ItemTransforms.Deserializer())
- .registerTypeAdapter(ItemOverride.class, new ItemOverride.Deserializer())
- .registerTypeAdapter(Transformation.class, new TransformationHelper.Deserializer())
- .create();
-
- public BlockModel deserialize(JsonElement element, Type targetType, JsonDeserializationContext deserializationContext) throws JsonParseException
- {
- BlockModel model = super.deserialize(element, targetType, deserializationContext);
- JsonObject jsonobject = element.getAsJsonObject();
- IUnbakedGeometry> geometry = deserializeGeometry(deserializationContext, jsonobject);
-
- List elements = model.getElements();
- if (geometry != null)
- {
- elements.clear();
- model.customData.setCustomGeometry(geometry);
- }
-
- if (jsonobject.has("transform"))
- {
- JsonElement transform = jsonobject.get("transform");
- model.customData.setRootTransform(deserializationContext.deserialize(transform, Transformation.class));
- }
-
- if (jsonobject.has("render_type"))
- {
- var renderTypeHintName = GsonHelper.getAsString(jsonobject, "render_type");
- model.customData.setRenderTypeHint(ResourceLocation.parse(renderTypeHintName));
- }
-
- if (jsonobject.has("visibility"))
- {
- JsonObject visibility = GsonHelper.getAsJsonObject(jsonobject, "visibility");
- for (Map.Entry part : visibility.entrySet())
- {
- model.customData.visibilityData.setVisibilityState(part.getKey(), part.getValue().getAsBoolean());
- }
- }
-
- return model;
- }
-
- @Nullable
- public static IUnbakedGeometry> deserializeGeometry(JsonDeserializationContext deserializationContext, JsonObject object) throws JsonParseException
- {
- if (!object.has("loader"))
- return null;
-
- var name = ResourceLocation.parse(GsonHelper.getAsString(object, "loader"));
- var loader = GeometryLoaderManager.get(name);
- if (loader == null)
- throw new JsonParseException(String.format(Locale.ENGLISH, "Model loader '%s' not found. Registered loaders: %s", name, GeometryLoaderManager.getLoaderList()));
-
- return loader.read(object, deserializationContext);
- }
-}
diff --git a/src/main/java/net/minecraftforge/client/model/IModelBuilder.java b/src/main/java/net/minecraftforge/client/model/IModelBuilder.java
index a00dc67e39..7911d0d0da 100644
--- a/src/main/java/net/minecraftforge/client/model/IModelBuilder.java
+++ b/src/main/java/net/minecraftforge/client/model/IModelBuilder.java
@@ -11,25 +11,26 @@ import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.client.resources.model.SimpleBakedModel;
import net.minecraft.core.Direction;
-import net.minecraftforge.client.RenderTypeGroup;
-
import java.util.List;
/**
* Base interface for any object that collects culled and unculled faces and bakes them into a model.
*
- * Provides a generic base implementation via {@link #of(boolean, boolean, boolean, ItemTransforms, ItemOverrides, TextureAtlasSprite, RenderTypeGroup)}
+ * Provides a generic base implementation via {@link #of(boolean, boolean, boolean, ItemTransforms, ItemOverrides, TextureAtlasSprite)}
* and a quad-collecting alternative via {@link #collecting(List)}.
*/
public interface IModelBuilder> {
/**
* Creates a new model builder that uses the provided attributes in the final baked model.
*/
- static IModelBuilder> of(boolean hasAmbientOcclusion, boolean usesBlockLight, boolean isGui3d,
- ItemTransforms transforms, TextureAtlasSprite particle,
- RenderTypeGroup renderTypes
+ static IModelBuilder> of(
+ boolean hasAmbientOcclusion,
+ boolean usesBlockLight,
+ boolean isGui3d,
+ ItemTransforms transforms,
+ TextureAtlasSprite particle
){
- return new Simple(hasAmbientOcclusion, usesBlockLight, isGui3d, transforms, particle, renderTypes);
+ return new Simple(hasAmbientOcclusion, usesBlockLight, isGui3d, transforms, particle);
}
/**
@@ -48,13 +49,12 @@ public interface IModelBuilder> {
class Simple implements IModelBuilder {
private final SimpleBakedModel.Builder builder;
- private final RenderTypeGroup renderTypes;
- private Simple(boolean hasAmbientOcclusion, boolean usesBlockLight, boolean isGui3d,
- ItemTransforms transforms, TextureAtlasSprite particle, RenderTypeGroup renderTypes
+ private Simple(
+ boolean hasAmbientOcclusion, boolean usesBlockLight, boolean isGui3d,
+ ItemTransforms transforms, TextureAtlasSprite particle
) {
this.builder = new SimpleBakedModel.Builder(hasAmbientOcclusion, usesBlockLight, isGui3d, transforms).particle(particle);
- this.renderTypes = renderTypes;
}
@Override
@@ -72,7 +72,7 @@ public interface IModelBuilder> {
@Deprecated
@Override
public BakedModel build() {
- return builder.renderTypes(renderTypes).build();
+ return builder.build();
}
}
diff --git a/src/main/java/net/minecraftforge/client/model/ItemLayerModel.java b/src/main/java/net/minecraftforge/client/model/ItemLayerModel.java
index 31f583562b..09325827c2 100644
--- a/src/main/java/net/minecraftforge/client/model/ItemLayerModel.java
+++ b/src/main/java/net/minecraftforge/client/model/ItemLayerModel.java
@@ -13,7 +13,7 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.block.model.ItemModelGenerator;
-import net.minecraft.client.renderer.texture.TextureAtlasSprite;
+import net.minecraft.client.renderer.block.model.TextureSlots;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.client.resources.model.Material;
import net.minecraft.client.resources.model.ModelBaker;
@@ -27,8 +27,6 @@ import net.minecraftforge.client.model.geometry.IUnbakedGeometry;
import net.minecraftforge.client.model.geometry.UnbakedGeometryHelper;
import org.jetbrains.annotations.Nullable;
-import java.util.function.Function;
-
/**
* Forge reimplementation of vanilla's {@link ItemModelGenerator}, i.e. builtin/generated models with some tweaks:
* - Represented as {@link IUnbakedGeometry} so it can be baked as usual instead of being special-cased
@@ -46,17 +44,19 @@ public class ItemLayerModel implements IUnbakedGeometry {
}
@Override
- public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, Function spriteGetter, ModelState modelState) {
+ public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, TextureSlots spriteGetter, ModelState modelState) {
if (textures == null) {
ImmutableList.Builder builder = ImmutableList.builder();
- for (int i = 0; context.hasMaterial("layer" + i); i++)
- builder.add(context.getMaterial("layer" + i));
+ int i = 0;
+ Material material;
+ while ((material = spriteGetter.getMaterial("layer" + i++)) != null) {
+ builder.add(material);
+ }
textures = builder.build();
}
- TextureAtlasSprite particle = spriteGetter.apply(
- context.hasMaterial("particle") ? context.getMaterial("particle") : textures.get(0)
- );
+ Material particleMaterial = spriteGetter.getMaterial("particle");
+ var particle = baker.sprites().get(particleMaterial == null ? textures.get(0) : particleMaterial);
var rootTransform = context.getRootTransform();
if (!rootTransform.isIdentity())
modelState = UnbakedGeometryHelper.composeRootTransformIntoModelState(modelState, rootTransform);
@@ -64,7 +64,7 @@ public class ItemLayerModel implements IUnbakedGeometry {
var normalRenderTypes = new RenderTypeGroup(RenderType.translucent(), ForgeRenderTypes.ITEM_UNSORTED_TRANSLUCENT.get());
var builder = CompositeModel.Baked.builder(context, particle, context.getTransforms());
for (int i = 0; i < textures.size(); i++) {
- var sprite = spriteGetter.apply(textures.get(i));
+ var sprite = baker.sprites().get(textures.get(i));
var unbaked = UnbakedGeometryHelper.createUnbakedItemElements(i, sprite.contents());
var quads = UnbakedGeometryHelper.bakeElements(unbaked, $ -> sprite, modelState);
var renderTypeName = renderTypeNames.get(i);
diff --git a/src/main/java/net/minecraftforge/client/model/SeparateTransformsModel.java b/src/main/java/net/minecraftforge/client/model/SeparateTransformsModel.java
index 05208e94b2..262b3cfc2f 100644
--- a/src/main/java/net/minecraftforge/client/model/SeparateTransformsModel.java
+++ b/src/main/java/net/minecraftforge/client/model/SeparateTransformsModel.java
@@ -13,14 +13,13 @@ import com.mojang.blaze3d.vertex.PoseStack;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.function.Function;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.renderer.block.model.BlockModel;
import net.minecraft.client.renderer.block.model.ItemTransforms;
+import net.minecraft.client.renderer.block.model.TextureSlots;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.resources.model.BakedModel;
-import net.minecraft.client.resources.model.Material;
import net.minecraft.client.resources.model.ModelBaker;
import net.minecraft.client.resources.model.ModelState;
import net.minecraft.client.resources.model.UnbakedModel;
@@ -49,16 +48,17 @@ public class SeparateTransformsModel implements IUnbakedGeometry spriteGetter, ModelState modelState) {
+ public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, TextureSlots textures, ModelState modelState) {
return new Baked(
context.useAmbientOcclusion(),
context.isGui3d(),
context.useBlockLight(),
- spriteGetter.apply(context.getMaterial("particle")),
- baseModel.bake(spriteGetter, modelState, context.useBlockLight()),
+ baker.sprites().maybeMissing(textures, "particle"),
+ baseModel.bake(textures, baker, modelState),
ImmutableMap.copyOf(Maps.transformValues(perspectives, value -> {
- return value.bake(spriteGetter, modelState, context.useBlockLight());
+ return value.bake(textures, baker, modelState, context.useBlockLight(), value.getGuiLight().lightLikeBlock(), value.getTransforms());
}))
);
}
@@ -107,11 +107,6 @@ public class SeparateTransformsModel implements IUnbakedGeometry getCustomGeometry() {
- return owner.parent != null && customGeometry == null ? owner.parent.customData.getCustomGeometry() : customGeometry;
+ if (customGeometry != null)
+ return customGeometry;
+ var pctx = parentContext();
+ return pctx == null ? null : pctx.getCustomGeometry();
}
public void setCustomGeometry(IUnbakedGeometry> geometry) {
@@ -61,19 +64,10 @@ public class BlockGeometryBakingContext implements IGeometryBakingContext {
@Override
public boolean isComponentVisible(String part, boolean fallback) {
- return owner.parent != null && !visibilityData.hasCustomVisibility(part) ?
- owner.parent.customData.isComponentVisible(part, fallback) :
- visibilityData.isVisible(part, fallback);
- }
-
- @Override
- public boolean hasMaterial(String name) {
- return owner.hasTexture(name);
- }
-
- @Override
- public Material getMaterial(String name) {
- return owner.getMaterial(name);
+ var pctx = parentContext();
+ if (pctx == null || visibilityData.hasCustomVisibility(part))
+ return visibilityData.isVisible(part, fallback);
+ return pctx.isComponentVisible(part, fallback);
}
@Override
@@ -88,7 +82,7 @@ public class BlockGeometryBakingContext implements IGeometryBakingContext {
@Override
public boolean useAmbientOcclusion() {
- return owner.hasAmbientOcclusion();
+ return owner.getAmbientOcclusion();
}
@Override
@@ -100,7 +94,8 @@ public class BlockGeometryBakingContext implements IGeometryBakingContext {
public Transformation getRootTransform() {
if (rootTransform != null)
return rootTransform;
- return owner.parent != null ? owner.parent.customData.getRootTransform() : Transformation.identity();
+ var pctx = parentContext();
+ return pctx == null ? Transformation.identity() : pctx.getRootTransform();
}
public void setRootTransform(Transformation rootTransform) {
@@ -112,7 +107,8 @@ public class BlockGeometryBakingContext implements IGeometryBakingContext {
public ResourceLocation getRenderTypeHint() {
if (renderTypeHint != null)
return renderTypeHint;
- return owner.parent != null ? owner.parent.customData.getRenderTypeHint() : null;
+ var pctx = parentContext();
+ return pctx == null ? null: pctx.getRenderTypeHint();
}
public void setRenderTypeHint(ResourceLocation renderTypeHint) {
@@ -131,11 +127,11 @@ public class BlockGeometryBakingContext implements IGeometryBakingContext {
this.gui3d = other.gui3d;
}
- public BakedModel bake(ModelBaker baker, Function bakedTextureGetter, ModelState modelTransform) {
+ public BakedModel bake(ModelBaker baker, TextureSlots textures, ModelState modelTransform) {
IUnbakedGeometry> geometry = getCustomGeometry();
if (geometry == null)
throw new IllegalStateException("Can not use custom baking without custom geometry");
- return geometry.bake(this, baker, bakedTextureGetter, modelTransform);
+ return geometry.bake(this, baker, textures, modelTransform);
}
public static class VisibilityData {
diff --git a/src/main/java/net/minecraftforge/client/model/geometry/IGeometryBakingContext.java b/src/main/java/net/minecraftforge/client/model/geometry/IGeometryBakingContext.java
index e5b17e4306..70193a2ed6 100644
--- a/src/main/java/net/minecraftforge/client/model/geometry/IGeometryBakingContext.java
+++ b/src/main/java/net/minecraftforge/client/model/geometry/IGeometryBakingContext.java
@@ -22,27 +22,6 @@ import org.jetbrains.annotations.Nullable;
* @see BlockGeometryBakingContext
*/
public interface IGeometryBakingContext {
- /**
- * {@return the name of the model being baked for logging and caching purposes.}
- */
- String getModelName();
-
- /**
- * Checks if a material is present in the model.
- *
- * @param name The name of the material
- * @return true if the material is present, false otherwise
- */
- boolean hasMaterial(String name);
-
- /**
- * Resolves the final texture name, taking into account texture aliases and replacements.
- *
- * @param name The name of the material
- * @return The material, or the missing texture if not found
- */
- Material getMaterial(String name);
-
/**
* {@return true if this model should render in 3D in a GUI, false otherwise}
*/
diff --git a/src/main/java/net/minecraftforge/client/model/geometry/IUnbakedGeometry.java b/src/main/java/net/minecraftforge/client/model/geometry/IUnbakedGeometry.java
index da9dbb565e..568f6049db 100644
--- a/src/main/java/net/minecraftforge/client/model/geometry/IUnbakedGeometry.java
+++ b/src/main/java/net/minecraftforge/client/model/geometry/IUnbakedGeometry.java
@@ -9,9 +9,8 @@ import java.util.Set;
import java.util.function.Function;
import net.minecraft.client.renderer.block.model.BlockModel;
-import net.minecraft.client.renderer.texture.TextureAtlasSprite;
+import net.minecraft.client.renderer.block.model.TextureSlots;
import net.minecraft.client.resources.model.BakedModel;
-import net.minecraft.client.resources.model.Material;
import net.minecraft.client.resources.model.ModelBaker;
import net.minecraft.client.resources.model.ModelState;
import net.minecraft.client.resources.model.UnbakedModel;
@@ -19,17 +18,17 @@ import net.minecraft.client.resources.model.UnbakedModel;
/**
* General interface for any model that can be baked, superset of vanilla {@link UnbakedModel}.
*
- * Instances of this class ar usually created via {@link IGeometryLoader}.
+ * Instances of this class are usually created via {@link IGeometryLoader}.
*
* @see IGeometryLoader
* @see IGeometryBakingContext
*/
public interface IUnbakedGeometry> {
- BakedModel bake(IGeometryBakingContext context, ModelBaker baker, Function spriteGetter, ModelState modelState);
+ BakedModel bake(IGeometryBakingContext context, ModelBaker baker, TextureSlots spriteGetter, ModelState modelState);
/**
* Resolve parents of nested {@link BlockModel}s which are later used in
- * {@link IUnbakedGeometry#bake(IGeometryBakingContext, ModelBaker, Function, ModelState)}
+ * {@link IUnbakedGeometry#bake(IGeometryBakingContext, ModelBaker, TextureSlots, ModelState)}
* via {@link BlockModel#resolveParents(Function)}
*/
default void resolveDependencies(UnbakedModel.Resolver resolver, IGeometryBakingContext context) { }
diff --git a/src/main/java/net/minecraftforge/client/model/geometry/SimpleUnbakedGeometry.java b/src/main/java/net/minecraftforge/client/model/geometry/SimpleUnbakedGeometry.java
index a81e309d5a..cbcf5aab4b 100644
--- a/src/main/java/net/minecraftforge/client/model/geometry/SimpleUnbakedGeometry.java
+++ b/src/main/java/net/minecraftforge/client/model/geometry/SimpleUnbakedGeometry.java
@@ -5,15 +5,11 @@
package net.minecraftforge.client.model.geometry;
-import java.util.function.Function;
import net.minecraft.client.renderer.block.model.BakedQuad;
-import net.minecraft.client.renderer.texture.TextureAtlasSprite;
+import net.minecraft.client.renderer.block.model.TextureSlots;
import net.minecraft.client.resources.model.BakedModel;
-import net.minecraft.client.resources.model.Material;
import net.minecraft.client.resources.model.ModelBaker;
import net.minecraft.client.resources.model.ModelState;
-import net.minecraft.resources.ResourceLocation;
-import net.minecraftforge.client.RenderTypeGroup;
import net.minecraftforge.client.model.IModelBuilder;
/**
@@ -22,18 +18,18 @@ import net.minecraftforge.client.model.IModelBuilder;
*/
public abstract class SimpleUnbakedGeometry> implements IUnbakedGeometry {
@Override
- public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, Function spriteGetter, ModelState modelState) {
- TextureAtlasSprite particle = spriteGetter.apply(context.getMaterial("particle"));
+ public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, TextureSlots textures, ModelState modelState) {
+ var particle = baker.sprites().maybeMissing(textures, "particle");
- var renderTypeHint = context.getRenderTypeHint();
- var renderTypes = renderTypeHint != null ? context.getRenderType(renderTypeHint) : RenderTypeGroup.EMPTY;
+ //var renderTypeHint = context.getRenderTypeHint();
+ //var renderTypes = renderTypeHint != null ? context.getRenderType(renderTypeHint) : RenderTypeGroup.EMPTY;
IModelBuilder> builder = IModelBuilder.of(context.useAmbientOcclusion(), context.useBlockLight(), context.isGui3d(),
- context.getTransforms(), particle, renderTypes);
+ context.getTransforms(), particle/*, renderTypes*/);
- addQuads(context, builder, baker, spriteGetter, modelState);
+ addQuads(context, builder, baker, textures, modelState);
return builder.build();
}
- protected abstract void addQuads(IGeometryBakingContext owner, IModelBuilder> modelBuilder, ModelBaker baker, Function spriteGetter, ModelState modelTransform);
+ protected abstract void addQuads(IGeometryBakingContext owner, IModelBuilder> modelBuilder, ModelBaker baker, TextureSlots textures, ModelState modelTransform);
}
diff --git a/src/main/java/net/minecraftforge/client/model/geometry/StandaloneGeometryBakingContext.java b/src/main/java/net/minecraftforge/client/model/geometry/StandaloneGeometryBakingContext.java
index 26931d6094..bdb9b7293e 100644
--- a/src/main/java/net/minecraftforge/client/model/geometry/StandaloneGeometryBakingContext.java
+++ b/src/main/java/net/minecraftforge/client/model/geometry/StandaloneGeometryBakingContext.java
@@ -5,21 +5,13 @@
package net.minecraftforge.client.model.geometry;
-import com.google.common.base.Predicates;
import com.mojang.math.Transformation;
import it.unimi.dsi.fastutil.objects.Object2BooleanMap;
import net.minecraft.client.renderer.block.model.ItemTransforms;
-import net.minecraft.client.renderer.texture.MissingTextureAtlasSprite;
-import net.minecraft.client.resources.model.Material;
import net.minecraft.resources.ResourceLocation;
-import net.minecraft.world.inventory.InventoryMenu;
-
import org.jetbrains.annotations.Nullable;
-import java.util.Map;
import java.util.function.BiPredicate;
-import java.util.function.Function;
-import java.util.function.Predicate;
/**
* A {@linkplain IGeometryBakingContext geometry baking context} that is not bound to block/item model loading.
@@ -27,23 +19,8 @@ import java.util.function.Predicate;
public class StandaloneGeometryBakingContext implements IGeometryBakingContext {
public static final ResourceLocation LOCATION = ResourceLocation.fromNamespaceAndPath("forge", "standalone");
- public static final StandaloneGeometryBakingContext INSTANCE = create(LOCATION);
+ public static final StandaloneGeometryBakingContext INSTANCE = builder().build();
- public static StandaloneGeometryBakingContext create(ResourceLocation modelName) {
- return builder().build(modelName);
- }
-
- public static StandaloneGeometryBakingContext create(Map textures) {
- return create(LOCATION, textures);
- }
-
- public static StandaloneGeometryBakingContext create(ResourceLocation modelName, Map textures) {
- return builder().withTextures(textures, MissingTextureAtlasSprite.getLocation()).build(modelName);
- }
-
- private final ResourceLocation modelName;
- private final Predicate materialCheck;
- private final Function materialLookup;
private final boolean isGui3d;
private final boolean useBlockLight;
private final boolean useAmbientOcclusion;
@@ -54,16 +31,12 @@ public class StandaloneGeometryBakingContext implements IGeometryBakingContext {
private final BiPredicate visibilityTest;
private StandaloneGeometryBakingContext(
- ResourceLocation modelName, Predicate materialCheck,
- Function materialLookup, boolean isGui3d,
+ boolean isGui3d,
boolean useBlockLight, boolean useAmbientOcclusion,
ItemTransforms transforms, Transformation rootTransform,
@Nullable ResourceLocation renderTypeHint,
BiPredicate visibilityTest
) {
- this.modelName = modelName;
- this.materialCheck = materialCheck;
- this.materialLookup = materialLookup;
this.isGui3d = isGui3d;
this.useBlockLight = useBlockLight;
this.useAmbientOcclusion = useAmbientOcclusion;
@@ -73,21 +46,6 @@ public class StandaloneGeometryBakingContext implements IGeometryBakingContext {
this.visibilityTest = visibilityTest;
}
- @Override
- public String getModelName() {
- return modelName.toString();
- }
-
- @Override
- public boolean hasMaterial(String name) {
- return materialCheck.test(name);
- }
-
- @Override
- public Material getMaterial(String name) {
- return materialLookup.apply(name);
- }
-
@Override
public boolean isGui3d() {
return isGui3d;
@@ -133,9 +91,6 @@ public class StandaloneGeometryBakingContext implements IGeometryBakingContext {
}
public static final class Builder {
- private static final Material NO_MATERIAL = new Material(InventoryMenu.BLOCK_ATLAS, MissingTextureAtlasSprite.getLocation());
- private Predicate materialCheck = Predicates.alwaysFalse();
- private Function materialLookup = $ -> NO_MATERIAL;
private boolean isGui3d = true;
private boolean useBlockLight = true;
private boolean useAmbientOcclusion = true;
@@ -148,8 +103,6 @@ public class StandaloneGeometryBakingContext implements IGeometryBakingContext {
private Builder() { }
private Builder(IGeometryBakingContext parent) {
- this.materialCheck = parent::hasMaterial;
- this.materialLookup = parent::getMaterial;
this.isGui3d = parent.isGui3d();
this.useBlockLight = parent.useBlockLight();
this.useAmbientOcclusion = parent.useAmbientOcclusion();
@@ -159,22 +112,6 @@ public class StandaloneGeometryBakingContext implements IGeometryBakingContext {
this.visibilityTest = parent::isComponentVisible;
}
- public Builder withTextures(Map textures, ResourceLocation defaultTexture) {
- return withTextures(InventoryMenu.BLOCK_ATLAS, textures, defaultTexture);
- }
-
- public Builder withTextures(ResourceLocation atlasLocation, Map textures, ResourceLocation defaultTexture) {
- this.materialCheck = textures::containsKey;
- this.materialLookup = name -> new Material(atlasLocation, textures.getOrDefault(name, defaultTexture));
- return this;
- }
-
- public Builder withMaterials(Map materials, Material defaultMaterial) {
- this.materialCheck = materials::containsKey;
- this.materialLookup = name -> materials.getOrDefault(name, defaultMaterial);
- return this;
- }
-
public Builder withGui3d(boolean isGui3d) {
this.isGui3d = isGui3d;
return this;
@@ -211,8 +148,8 @@ public class StandaloneGeometryBakingContext implements IGeometryBakingContext {
return this;
}
- public StandaloneGeometryBakingContext build(ResourceLocation modelName) {
- return new StandaloneGeometryBakingContext(modelName, materialCheck, materialLookup, isGui3d, useBlockLight, useAmbientOcclusion, transforms, rootTransform, renderTypeHint, visibilityTest);
+ public StandaloneGeometryBakingContext build() {
+ return new StandaloneGeometryBakingContext(isGui3d, useBlockLight, useAmbientOcclusion, transforms, rootTransform, renderTypeHint, visibilityTest);
}
}
}
diff --git a/src/main/java/net/minecraftforge/client/model/geometry/UnbakedGeometryHelper.java b/src/main/java/net/minecraftforge/client/model/geometry/UnbakedGeometryHelper.java
index 46883b1af0..420468a7ff 100644
--- a/src/main/java/net/minecraftforge/client/model/geometry/UnbakedGeometryHelper.java
+++ b/src/main/java/net/minecraftforge/client/model/geometry/UnbakedGeometryHelper.java
@@ -12,11 +12,13 @@ import net.minecraft.client.renderer.block.model.BlockElement;
import net.minecraft.client.renderer.block.model.BlockElementFace;
import net.minecraft.client.renderer.block.model.BlockFaceUV;
import net.minecraft.client.renderer.block.model.FaceBakery;
+import net.minecraft.client.renderer.block.model.ItemModelGenerator;
+import net.minecraft.client.renderer.block.model.TextureSlots;
import net.minecraft.client.renderer.texture.MissingTextureAtlasSprite;
import net.minecraft.client.renderer.texture.SpriteContents;
+import net.minecraft.client.renderer.texture.TextureAtlas;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.resources.model.Material;
-import net.minecraft.client.resources.model.ModelBakery;
import net.minecraft.client.resources.model.ModelState;
import net.minecraft.core.Direction;
import net.minecraft.resources.ResourceLocation;
@@ -25,6 +27,8 @@ import net.minecraftforge.client.model.IModelBuilder;
import net.minecraftforge.client.model.IQuadTransformer;
import net.minecraftforge.client.model.QuadTransformers;
import net.minecraftforge.client.model.SimpleModelState;
+
+import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
import org.joml.Vector3f;
@@ -39,6 +43,7 @@ import java.util.regex.Pattern;
/**
* Helper for dealing with unbaked models and geometries.
*/
+@ApiStatus.Internal
public class UnbakedGeometryHelper {
private static final FaceBakery FACE_BAKERY = new FaceBakery();
@@ -64,11 +69,11 @@ public class UnbakedGeometryHelper {
*
* The target atlas will always be {@link InventoryMenu#BLOCK_ATLAS}.
*/
- public static Material resolveDirtyMaterial(@Nullable String tex, IGeometryBakingContext owner) {
+ public static Material resolveDirtyMaterial(@Nullable String tex, TextureSlots textures) {
if (tex == null)
- return new Material(InventoryMenu.BLOCK_ATLAS, MissingTextureAtlasSprite.getLocation());
+ return new Material(TextureAtlas.LOCATION_BLOCKS, MissingTextureAtlasSprite.getLocation());
if (tex.startsWith("#"))
- return owner.getMaterial(tex);
+ return textures.getMaterial(tex);
// Attempt to convert a common (windows/linux/mac) filesystem path to a ResourceLocation.
// This makes no promises, if it doesn't work, too bad, fix your mtl file.
@@ -79,9 +84,10 @@ public class UnbakedGeometryHelper {
tex = namespace != null ? namespace + ":" + path : path;
}
- return new Material(InventoryMenu.BLOCK_ATLAS, ResourceLocation.parse(tex));
+ return new Material(TextureAtlas.LOCATION_BLOCKS, ResourceLocation.parse(tex));
}
+ private static final ItemModelGenerator ITEM_MODEL_GENERATOR = new ItemModelGenerator();
/**
* Creates a list of {@linkplain BlockElement block elements} in the shape of the specified sprite contents.
* These can later be baked using the same, or another texture.
@@ -89,7 +95,7 @@ public class UnbakedGeometryHelper {
* The {@link Direction#NORTH} and {@link Direction#SOUTH} faces take up the whole surface.
*/
public static List createUnbakedItemElements(int layerIndex, SpriteContents spriteContents) {
- return ModelBakery.ITEM_MODEL_GENERATOR.processFrames(layerIndex, "layer" + layerIndex, spriteContents);
+ return ITEM_MODEL_GENERATOR.processFrames(layerIndex, "layer" + layerIndex, spriteContents);
}
/**
@@ -162,7 +168,7 @@ public class UnbakedGeometryHelper {
public static void bakeElements(IModelBuilder> builder, List elements, Function spriteGetter, ModelState modelState) {
for (BlockElement element : elements) {
element.faces.forEach((side, face) -> {
- var sprite = spriteGetter.apply(new Material(InventoryMenu.BLOCK_ATLAS, ResourceLocation.parse(face.texture())));
+ var sprite = spriteGetter.apply(new Material(TextureAtlas.LOCATION_BLOCKS, ResourceLocation.parse(face.texture())));
var quad = bakeElementFace(element, face, sprite, side, modelState, element.lightEmission);
if (face.cullForDirection() == null)
builder.addUnculledFace(quad);
diff --git a/src/main/java/net/minecraftforge/client/model/obj/ObjModel.java b/src/main/java/net/minecraftforge/client/model/obj/ObjModel.java
index cc66d4f7b3..64cf418208 100644
--- a/src/main/java/net/minecraftforge/client/model/obj/ObjModel.java
+++ b/src/main/java/net/minecraftforge/client/model/obj/ObjModel.java
@@ -11,11 +11,11 @@ import com.google.common.collect.Sets;
import com.mojang.math.Transformation;
import net.minecraft.client.renderer.LightTexture;
import net.minecraft.client.renderer.block.model.BakedQuad;
+import net.minecraft.client.renderer.block.model.TextureSlots;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.resources.model.Material;
import net.minecraft.client.resources.model.ModelBaker;
import net.minecraft.client.resources.model.ModelState;
-import net.minecraft.client.resources.model.UnbakedModel;
import net.minecraft.core.Direction;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;
@@ -43,9 +43,7 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
-import java.util.function.Function;
import java.util.stream.Collectors;
-import java.util.stream.Stream;
/**
* A model loaded from an OBJ file.
@@ -53,14 +51,13 @@ import java.util.stream.Stream;
* Supports positions, texture coordinates, normals and colors. The {@link ObjMaterialLibrary material library}
* has support for numerous features, including support for {@link ResourceLocation} textures (non-standard).
*/
-public class ObjModel extends SimpleUnbakedGeometry
-{
+public class ObjModel extends SimpleUnbakedGeometry {
private static final Vector4f COLOR_WHITE = new Vector4f(1, 1, 1, 1);
private static final Vec2[] DEFAULT_COORDS = {
- new Vec2(0, 0),
- new Vec2(0, 1),
- new Vec2(1, 1),
- new Vec2(1, 0),
+ new Vec2(0, 0),
+ new Vec2(0, 1),
+ new Vec2(1, 1),
+ new Vec2(1, 0),
};
private final Map parts = Maps.newLinkedHashMap();
@@ -81,8 +78,7 @@ public class ObjModel extends SimpleUnbakedGeometry
public final ResourceLocation modelLocation;
- private ObjModel(ModelSettings settings)
- {
+ private ObjModel(ModelSettings settings) {
this.modelLocation = settings.modelLocation;
this.automaticCulling = settings.automaticCulling;
this.shadeQuads = settings.shadeQuads;
@@ -91,8 +87,7 @@ public class ObjModel extends SimpleUnbakedGeometry
this.mtlOverride = settings.mtlOverride;
}
- public static ObjModel parse(ObjTokenizer tokenizer, ModelSettings settings) throws IOException
- {
+ public static ObjModel parse(ObjTokenizer tokenizer, ModelSettings settings) throws IOException {
var modelLocation = settings.modelLocation;
var materialLibraryOverrideLocation = settings.mtlOverride;
var model = new ObjModel(settings);
@@ -115,8 +110,7 @@ public class ObjModel extends SimpleUnbakedGeometry
boolean objAboveGroup = false;
- if (materialLibraryOverrideLocation != null)
- {
+ if (materialLibraryOverrideLocation != null) {
String lib = materialLibraryOverrideLocation;
if (lib.contains(":"))
mtllib = ObjLoader.INSTANCE.loadMaterialLibrary(ResourceLocation.parse(lib));
@@ -125,12 +119,9 @@ public class ObjModel extends SimpleUnbakedGeometry
}
String[] line;
- while ((line = tokenizer.readAndSplitLine(true)) != null)
- {
- switch (line[0])
- {
- case "mtllib": // Loads material library
- {
+ while ((line = tokenizer.readAndSplitLine(true)) != null) {
+ switch (line[0]) {
+ case "mtllib": { // Loads material library
if (materialLibraryOverrideLocation != null)
break;
@@ -141,28 +132,18 @@ public class ObjModel extends SimpleUnbakedGeometry
mtllib = ObjLoader.INSTANCE.loadMaterialLibrary(ResourceLocation.fromNamespaceAndPath(modelDomain, modelPath + lib));
break;
}
-
- case "usemtl": // Sets the current material (starts new mesh)
- {
-
+ case "usemtl": { // Sets the current material (starts new mesh)
String mat = Arrays.asList(Arrays.copyOfRange(line, 1, line.length)).stream().collect(Collectors.joining(" "));
ObjMaterialLibrary.Material newMat = mtllib.getMaterial(mat);
- if (!Objects.equals(newMat, currentMat))
- {
+ if (!Objects.equals(newMat, currentMat)) {
currentMat = newMat;
if (currentMesh != null && currentMesh.mat == null && currentMesh.faces.isEmpty())
- {
currentMesh.mat = currentMat;
- }
- else
- {
- // Start new mesh
+ else // Start new mesh
currentMesh = null;
- }
}
break;
}
-
case "v": // Vertex
model.positions.add(parseVector4To3(line));
break;
@@ -175,20 +156,13 @@ public class ObjModel extends SimpleUnbakedGeometry
case "vc": // Vertex color (non-standard)
model.colors.add(parseVector4(line));
break;
-
- case "f": // Face
- {
- if (currentMesh == null)
- {
+ case "f": { // Face
+ if (currentMesh == null) {
currentMesh = model.new ModelMesh(currentMat, currentSmoothingGroup);
if (currentObject != null)
- {
currentObject.meshes.add(currentMesh);
- }
- else
- {
- if (currentGroup == null)
- {
+ else {
+ if (currentGroup == null) {
currentGroup = model.new ModelGroup("");
model.parts.put("", currentGroup);
}
@@ -197,65 +171,39 @@ public class ObjModel extends SimpleUnbakedGeometry
}
int[][] vertices = new int[line.length - 1][];
- for (int i = 0; i < vertices.length; i++)
- {
+ for (int i = 0; i < vertices.length; i++) {
String vertexData = line[i + 1];
String[] vertexParts = vertexData.split("/");
int[] vertex = Arrays.stream(vertexParts).mapToInt(num -> num == null || num.isEmpty() ? 0 : Integer.parseInt(num)).toArray();
- if (vertex[0] < 0) vertex[0] = model.positions.size() + vertex[0];
- else vertex[0]--;
- if (vertex.length > 1)
- {
- if (vertex[1] < 0) vertex[1] = model.texCoords.size() + vertex[1];
- else vertex[1]--;
- if (vertex.length > 2)
- {
- if (vertex[2] < 0) vertex[2] = model.normals.size() + vertex[2];
- else vertex[2]--;
- if (vertex.length > 3)
- {
- if (vertex[3] < 0) vertex[3] = model.colors.size() + vertex[3];
- else vertex[3]--;
- }
- }
+ for (int x = 0; x < 4 && x < vertex.length; x++) {
+ if (vertex[x] < 0)
+ vertex[x] = model.positions.size() + vertex[x];
+ else
+ vertex[x]--;
}
vertices[i] = vertex;
}
currentMesh.faces.add(vertices);
-
break;
}
-
- case "s": // Smoothing group (starts new mesh)
- {
+ case "s": { // Smoothing group (starts new mesh)
String smoothingGroup = "off".equals(line[1]) ? null : line[1];
- if (!Objects.equals(currentSmoothingGroup, smoothingGroup))
- {
+ if (!Objects.equals(currentSmoothingGroup, smoothingGroup)) {
currentSmoothingGroup = smoothingGroup;
if (currentMesh != null && currentMesh.smoothingGroup == null && currentMesh.faces.isEmpty())
- {
currentMesh.smoothingGroup = currentSmoothingGroup;
- }
- else
- {
- // Start new mesh
+ else // Start new mesh
currentMesh = null;
- }
}
break;
}
-
- case "g":
- {
+ case "g": {
String name = line[1];
- if (objAboveGroup)
- {
+ if (objAboveGroup) {
currentObject = model.new ModelObject(currentGroup.name() + "/" + name);
currentGroup.parts.put(name, currentObject);
- }
- else
- {
+ } else {
currentGroup = model.new ModelGroup(name);
model.parts.put(name, currentGroup);
currentObject = null;
@@ -264,20 +212,15 @@ public class ObjModel extends SimpleUnbakedGeometry
currentMesh = null;
break;
}
-
- case "o":
- {
+ case "o": {
String name = line[1];
- if (objAboveGroup || currentGroup == null)
- {
+ if (objAboveGroup || currentGroup == null) {
objAboveGroup = true;
currentGroup = model.new ModelGroup(name);
model.parts.put(name, currentGroup);
currentObject = null;
- }
- else
- {
+ } else {
currentObject = model.new ModelObject(currentGroup.name() + "/" + name);
currentGroup.parts.put(name, currentObject);
}
@@ -290,30 +233,25 @@ public class ObjModel extends SimpleUnbakedGeometry
return model;
}
- private static Vector3f parseVector4To3(String[] line)
- {
+ private static Vector3f parseVector4To3(String[] line) {
Vector4f vec4 = parseVector4(line);
return new Vector3f(
- vec4.x() / vec4.w(),
- vec4.y() / vec4.w(),
- vec4.z() / vec4.w()
+ vec4.x() / vec4.w(),
+ vec4.y() / vec4.w(),
+ vec4.z() / vec4.w()
);
}
- private static Vec2 parseVector2(String[] line)
- {
- return switch (line.length)
- {
+ private static Vec2 parseVector2(String[] line) {
+ return switch (line.length) {
case 1 -> new Vec2(0, 0);
case 2 -> new Vec2(Float.parseFloat(line[1]), 0);
default -> new Vec2(Float.parseFloat(line[1]), Float.parseFloat(line[2]));
};
}
- private static Vector3f parseVector3(String[] line)
- {
- return switch (line.length)
- {
+ private static Vector3f parseVector3(String[] line) {
+ return switch (line.length) {
case 1 -> new Vector3f();
case 2 -> new Vector3f(Float.parseFloat(line[1]), 0, 0);
case 3 -> new Vector3f(Float.parseFloat(line[1]), Float.parseFloat(line[2]), 0);
@@ -321,10 +259,8 @@ public class ObjModel extends SimpleUnbakedGeometry
};
}
- static Vector4f parseVector4(String[] line)
- {
- return switch (line.length)
- {
+ static Vector4f parseVector4(String[] line) {
+ return switch (line.length) {
case 1 -> new Vector4f();
case 2 -> new Vector4f(Float.parseFloat(line[1]), 0, 0, 1);
case 3 -> new Vector4f(Float.parseFloat(line[1]), Float.parseFloat(line[2]), 0, 1);
@@ -334,20 +270,19 @@ public class ObjModel extends SimpleUnbakedGeometry
}
@Override
- protected void addQuads(IGeometryBakingContext owner, IModelBuilder> modelBuilder, ModelBaker baker, Function spriteGetter, ModelState modelTransform)
- {
- parts.values().stream().filter(part -> owner.isComponentVisible(part.name(), true))
- .forEach(part -> part.addQuads(owner, modelBuilder, baker, spriteGetter, modelTransform, modelLocation));
+ protected void addQuads(IGeometryBakingContext owner, IModelBuilder> modelBuilder, ModelBaker baker, TextureSlots textures, ModelState modelTransform) {
+ for (var part : parts.values()) {
+ if (owner.isComponentVisible(part.name(), true))
+ part.addQuads(owner, modelBuilder, baker, textures, modelTransform, modelLocation);
+ }
}
- public Set getRootComponentNames()
- {
+ public Set getRootComponentNames() {
return rootComponentNames;
}
@Override
- public Set getConfigurableComponentNames()
- {
+ public Set getConfigurableComponentNames() {
if (allComponentNames != null)
return allComponentNames;
var names = new HashSet();
@@ -356,16 +291,13 @@ public class ObjModel extends SimpleUnbakedGeometry
return allComponentNames = Collections.unmodifiableSet(names);
}
- private Pair makeQuad(int[][] indices, int tintIndex, Vector4f colorTint, Vector4f ambientColor, TextureAtlasSprite texture, Transformation transform)
- {
+ private Pair makeQuad(int[][] indices, int tintIndex, Vector4f colorTint, Vector4f ambientColor, TextureAtlasSprite texture, Transformation transform) {
boolean needsNormalRecalculation = false;
for (int[] ints : indices)
- {
needsNormalRecalculation |= ints.length < 3;
- }
+
Vector3f faceNormal = new Vector3f();
- if (needsNormalRecalculation)
- {
+ if (needsNormalRecalculation) {
Vector3f a = positions.get(indices[0][0]);
Vector3f ab = positions.get(indices[1][0]);
Vector3f ac = positions.get(indices[2][0]);
@@ -384,16 +316,12 @@ public class ObjModel extends SimpleUnbakedGeometry
quadBaker.setTintIndex(tintIndex);
int uv2 = 0;
- if (emissiveAmbient)
- {
+ if (emissiveAmbient) {
int fakeLight = (int) ((ambientColor.x() + ambientColor.y() + ambientColor.z()) * 15 / 3.0f);
uv2 = LightTexture.pack(fakeLight, fakeLight);
quadBaker.setShade(fakeLight == 0 && shadeQuads);
- }
- else
- {
+ } else
quadBaker.setShade(shadeQuads);
- }
boolean hasTransform = !transform.isIdentity();
// The incoming transform is referenced on the center of the block, but our coords are referenced on the corner
@@ -402,16 +330,14 @@ public class ObjModel extends SimpleUnbakedGeometry
Vector4f[] pos = new Vector4f[4];
Vector3f[] norm = new Vector3f[4];
- for (int i = 0; i < 4; i++)
- {
+ for (int i = 0; i < 4; i++) {
int[] index = indices[Math.min(i, indices.length - 1)];
Vector4f position = new Vector4f(positions.get(index[0]), 1);
Vec2 texCoord = index.length >= 2 && !texCoords.isEmpty() ? texCoords.get(index[1]) : DEFAULT_COORDS[i];
Vector3f norm0 = !needsNormalRecalculation && index.length >= 3 && !normals.isEmpty() ? normals.get(index[2]) : faceNormal;
Vector3f normal = norm0;
Vector4f color = index.length >= 4 && !colors.isEmpty() ? colors.get(index[3]) : COLOR_WHITE;
- if (hasTransform)
- {
+ if (hasTransform) {
normal = new Vector3f(norm0);
transformation.transformPosition(position);
transformation.transformNormal(normal);
@@ -430,16 +356,13 @@ public class ObjModel extends SimpleUnbakedGeometry
quadBaker.setUv2(uv2 & 0xFFFF, uv2 >> 16 & 0xFFFF);
quadBaker.setNormal(normal.x(), normal.y(), normal.z());
if (i == 0)
- {
quadBaker.setDirection(Direction.getApproximateNearest(normal.x(), normal.y(), normal.z()));
- }
pos[i] = position;
norm[i] = normal;
}
Direction cull = null;
- if (automaticCulling)
- {
+ if (automaticCulling) {
if (Mth.equal(pos[0].x(), 0) && // vertex.position.x
Mth.equal(pos[1].x(), 0) &&
Mth.equal(pos[2].x(), 0) &&
@@ -493,143 +416,123 @@ public class ObjModel extends SimpleUnbakedGeometry
return Pair.of(quadBaker.build(), cull);
}
- public CompositeRenderable bakeRenderable(IGeometryBakingContext configuration)
- {
+ public CompositeRenderable bakeRenderable(TextureSlots textures) {
var builder = CompositeRenderable.builder();
- for (var entry : parts.entrySet())
- {
+ for (var entry : parts.entrySet()) {
var name = entry.getKey();
var part = entry.getValue();
- part.bake(builder.child(name), configuration);
+ part.bake(builder.child(name), textures);
}
return builder.get();
}
- public class ModelObject
- {
+ private class ModelObject {
public final String name;
List meshes = Lists.newArrayList();
- ModelObject(String name)
- {
+ ModelObject(String name) {
this.name = name;
}
- public String name()
- {
+ public String name() {
return name;
}
- public void addQuads(IGeometryBakingContext owner, IModelBuilder> modelBuilder, ModelBaker baker, Function spriteGetter, ModelState modelTransform, ResourceLocation modelLocation)
- {
- for (ModelMesh mesh : meshes)
- {
- mesh.addQuads(owner, modelBuilder, spriteGetter, modelTransform);
+ protected void addQuads(IGeometryBakingContext owner, IModelBuilder> modelBuilder, ModelBaker baker, TextureSlots textures, ModelState modelTransform, ResourceLocation modelLocation) {
+ for (var mesh : meshes)
+ mesh.addQuads(owner, modelBuilder, baker, textures, modelTransform, modelLocation);
+ }
+
+ protected void bake(CompositeRenderable.PartBuilder> builder, TextureSlots textures) {
+ for (var mesh : this.meshes)
+ mesh.bake(builder, textures);
+ }
+
+ protected Collection getTextures(IGeometryBakingContext owner, TextureSlots textures, Set> missingTextureErrors) {
+ var ret = new HashSet();
+ for (var mesh : meshes) {
+ if (mesh.mat != null)
+ ret.add(UnbakedGeometryHelper.resolveDirtyMaterial(mesh.mat.diffuseColorMap, textures));
}
+ return ret;
}
- public void bake(CompositeRenderable.PartBuilder> builder, IGeometryBakingContext configuration)
- {
- for (ModelMesh mesh : this.meshes)
- {
- mesh.bake(builder, configuration);
- }
- }
-
- public Collection getTextures(IGeometryBakingContext owner, Function modelGetter, Set> missingTextureErrors)
- {
- return meshes.stream()
- .flatMap(mesh -> mesh.mat != null
- ? Stream.of(UnbakedGeometryHelper.resolveDirtyMaterial(mesh.mat.diffuseColorMap, owner))
- : Stream.of())
- .collect(Collectors.toSet());
- }
-
- protected void addNamesRecursively(Set names)
- {
+ protected void addNamesRecursively(Set names) {
names.add(name());
}
}
- public class ModelGroup extends ModelObject
- {
+ private class ModelGroup extends ModelObject {
final Map parts = Maps.newLinkedHashMap();
- ModelGroup(String name)
- {
+ ModelGroup(String name) {
super(name);
}
@Override
- public void addQuads(IGeometryBakingContext owner, IModelBuilder> modelBuilder, ModelBaker baker, Function spriteGetter, ModelState modelTransform, ResourceLocation modelLocation)
- {
+ public void addQuads(IGeometryBakingContext owner, IModelBuilder> modelBuilder, ModelBaker baker, TextureSlots spriteGetter, ModelState modelTransform, ResourceLocation modelLocation) {
super.addQuads(owner, modelBuilder, baker, spriteGetter, modelTransform, modelLocation);
- parts.values().stream().filter(part -> owner.isComponentVisible(part.name(), true))
- .forEach(part -> part.addQuads(owner, modelBuilder, baker, spriteGetter, modelTransform, modelLocation));
- }
-
- @Override
- public void bake(CompositeRenderable.PartBuilder> builder, IGeometryBakingContext configuration)
- {
- super.bake(builder, configuration);
-
- for (var entry : parts.entrySet())
- {
- var name = entry.getKey();
- var part = entry.getValue();
- part.bake(builder.child(name), configuration);
+ for (var part : parts.values()) {
+ if (owner.isComponentVisible(part.name(), true))
+ part.addQuads(owner, modelBuilder, baker, spriteGetter, modelTransform, modelLocation);
}
}
@Override
- public Collection getTextures(IGeometryBakingContext owner, Function modelGetter, Set> missingTextureErrors)
- {
+ public void bake(CompositeRenderable.PartBuilder> builder, TextureSlots textures) {
+ super.bake(builder, textures);
+
+ for (var entry : parts.entrySet()) {
+ var name = entry.getKey();
+ var part = entry.getValue();
+ part.bake(builder.child(name), textures);
+ }
+ }
+
+ @Override
+ public Collection getTextures(IGeometryBakingContext owner, TextureSlots textures, Set> missingTextureErrors) {
Set combined = Sets.newHashSet();
- combined.addAll(super.getTextures(owner, modelGetter, missingTextureErrors));
+ combined.addAll(super.getTextures(owner, textures, missingTextureErrors));
for (ModelObject part : parts.values())
- combined.addAll(part.getTextures(owner, modelGetter, missingTextureErrors));
+ combined.addAll(part.getTextures(owner, textures, missingTextureErrors));
return combined;
}
@Override
- protected void addNamesRecursively(Set names)
- {
+ protected void addNamesRecursively(Set names) {
super.addNamesRecursively(names);
for (ModelObject object : parts.values())
object.addNamesRecursively(names);
}
}
- private class ModelMesh
- {
+ private class ModelMesh {
@Nullable
public ObjMaterialLibrary.Material mat;
@Nullable
public String smoothingGroup;
public final List faces = Lists.newArrayList();
- public ModelMesh(@Nullable ObjMaterialLibrary.Material currentMat, @Nullable String currentSmoothingGroup)
- {
+ public ModelMesh(@Nullable ObjMaterialLibrary.Material currentMat, @Nullable String currentSmoothingGroup) {
this.mat = currentMat;
this.smoothingGroup = currentSmoothingGroup;
}
- public void addQuads(IGeometryBakingContext owner, IModelBuilder> modelBuilder, Function spriteGetter, ModelState modelTransform)
- {
+ protected void addQuads(IGeometryBakingContext owner, IModelBuilder> modelBuilder, ModelBaker baker, TextureSlots textures, ModelState modelTransform, ResourceLocation modelLocation) {
if (mat == null)
return;
- TextureAtlasSprite texture = spriteGetter.apply(UnbakedGeometryHelper.resolveDirtyMaterial(mat.diffuseColorMap, owner));
+ var material = UnbakedGeometryHelper.resolveDirtyMaterial(mat.diffuseColorMap, textures);
+ var texture = baker.sprites().get(material);
int tintIndex = mat.diffuseTintIndex;
Vector4f colorTint = mat.diffuseColor;
var rootTransform = owner.getRootTransform();
var transform = rootTransform.isIdentity() ? modelTransform.getRotation() : modelTransform.getRotation().compose(rootTransform);
- for (int[][] face : faces)
- {
+ for (int[][] face : faces) {
Pair quad = makeQuad(face, tintIndex, colorTint, mat.ambientColor, texture, transform);
if (quad.getRight() == null)
modelBuilder.addUnculledFace(quad.getLeft());
@@ -638,8 +541,7 @@ public class ObjModel extends SimpleUnbakedGeometry
}
}
- public void bake(CompositeRenderable.PartBuilder> builder, IGeometryBakingContext configuration)
- {
+ public void bake(CompositeRenderable.PartBuilder> builder, TextureSlots textures) {
ObjMaterialLibrary.Material mat = this.mat;
if (mat == null)
return;
@@ -648,13 +550,12 @@ public class ObjModel extends SimpleUnbakedGeometry
final List quads = new ArrayList<>();
- for (var face : this.faces)
- {
+ for (var face : this.faces) {
var pair = makeQuad(face, tintIndex, colorTint, mat.ambientColor, UnitTextureAtlasSprite.INSTANCE, Transformation.identity());
quads.add(pair.getLeft());
}
- ResourceLocation textureLocation = UnbakedGeometryHelper.resolveDirtyMaterial(mat.diffuseColorMap, configuration).texture();
+ ResourceLocation textureLocation = UnbakedGeometryHelper.resolveDirtyMaterial(mat.diffuseColorMap, textures).texture();
ResourceLocation texturePath = textureLocation.withPath(p -> "textures/" + p + ".png");
builder.addMesh(texturePath, quads);
diff --git a/src/main/java/net/minecraftforge/client/model/renderable/BakedModelRenderable.java b/src/main/java/net/minecraftforge/client/model/renderable/BakedModelRenderable.java
index db87e4b73b..1046b53114 100644
--- a/src/main/java/net/minecraftforge/client/model/renderable/BakedModelRenderable.java
+++ b/src/main/java/net/minecraftforge/client/model/renderable/BakedModelRenderable.java
@@ -9,13 +9,12 @@ import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.block.model.BakedQuad;
+import net.minecraft.client.renderer.texture.TextureAtlas;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.core.Direction;
-import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.RandomSource;
import net.minecraft.util.Unit;
-import net.minecraft.world.inventory.InventoryMenu;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.client.model.data.ModelData;
import org.jetbrains.annotations.Nullable;
@@ -57,7 +56,7 @@ public class BakedModelRenderable implements IRenderable The type of context object used by the rendering logic
*/
@FunctionalInterface
-public interface IRenderable
-{
+public interface IRenderable {
/**
* Draws the renderable by adding the geometry to the provided {@link MultiBufferSource}
*
@@ -37,8 +36,7 @@ public interface IRenderable
* @param context The context used for rendering
* @return A renderable that accepts {@link Unit#INSTANCE} as context, but uses the provided {@code context} instead
*/
- default IRenderable withContext(T context)
- {
+ default IRenderable withContext(T context) {
return (poseStack, bufferSource, textureRenderTypeLookup, lightmap, overlay, partialTick, unused) ->
this.render(poseStack, bufferSource, textureRenderTypeLookup, lightmap, overlay, partialTick, context);
}
diff --git a/src/main/java/net/minecraftforge/client/textures/ForgeTextureMetadata.java b/src/main/java/net/minecraftforge/client/textures/ForgeTextureMetadata.java
index 4593f21960..9b64cc4114 100644
--- a/src/main/java/net/minecraftforge/client/textures/ForgeTextureMetadata.java
+++ b/src/main/java/net/minecraftforge/client/textures/ForgeTextureMetadata.java
@@ -6,17 +6,14 @@
package net.minecraftforge.client.textures;
import net.minecraft.resources.ResourceLocation;
-import net.minecraft.server.packs.metadata.MetadataSectionSerializer;
+import net.minecraft.server.packs.metadata.MetadataSectionType;
import net.minecraft.server.packs.resources.Resource;
-import net.minecraft.util.GsonHelper;
+import com.mojang.serialization.Codec;
+import com.mojang.serialization.codecs.RecordCodecBuilder;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonSyntaxException;
-import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.IOException;
-import java.util.Optional;
/**
* The "forge" section of texture metadata files (.mcmeta). Currently used only to specify custom
@@ -25,44 +22,26 @@ import java.util.Optional;
* @see ITextureAtlasSpriteLoader
*/
public record ForgeTextureMetadata(@Nullable ITextureAtlasSpriteLoader loader) {
-
public static final ForgeTextureMetadata EMPTY = new ForgeTextureMetadata(null);
- public static final MetadataSectionSerializer SERIALIZER = new Serializer();
+
+ private static final Codec LOADER_CODEC = Codec.stringResolver(
+ loader -> {
+ var ret = TextureAtlasSpriteLoaderManager.getKey(loader);
+ return ret == null ? null : ret.toString();
+ },
+ name -> TextureAtlasSpriteLoaderManager.get(ResourceLocation.parse(name))
+ );
+
+ private static final Codec CODEC = RecordCodecBuilder.create(i ->
+ i.group(
+ LOADER_CODEC.fieldOf("loader").forGetter(ForgeTextureMetadata::loader)
+ ).apply(i, ForgeTextureMetadata::new)
+ );
+
+
+ public static final MetadataSectionType TYPE = new MetadataSectionType<>("forge", CODEC);
public static ForgeTextureMetadata forResource(Resource resource) throws IOException {
- Optional metadata = resource.metadata().getSection(SERIALIZER);
- return metadata.orElse(EMPTY);
+ return resource.metadata().getSection(TYPE).orElse(EMPTY);
}
-
- @Nullable
- public ITextureAtlasSpriteLoader getLoader() {
- return loader;
- }
-
- private static final class Serializer implements MetadataSectionSerializer {
-
- @Override
- @NotNull
- public String getMetadataSectionName() {
- return "forge";
- }
-
- @Override
- @NotNull
- public ForgeTextureMetadata fromJson(JsonObject json) {
- @Nullable
- ITextureAtlasSpriteLoader loader;
- if (json.has("loader")) {
- ResourceLocation loaderName = ResourceLocation.parse(GsonHelper.getAsString(json, "loader"));
- loader = TextureAtlasSpriteLoaderManager.get(loaderName);
- if (loader == null) {
- throw new JsonSyntaxException("Unknown TextureAtlasSpriteLoader " + loaderName);
- }
- } else {
- loader = null;
- }
- return new ForgeTextureMetadata(loader);
- }
- }
-
}
diff --git a/src/main/java/net/minecraftforge/client/textures/TextureAtlasSpriteLoaderManager.java b/src/main/java/net/minecraftforge/client/textures/TextureAtlasSpriteLoaderManager.java
index 1ab167c070..c1306a657f 100644
--- a/src/main/java/net/minecraftforge/client/textures/TextureAtlasSpriteLoaderManager.java
+++ b/src/main/java/net/minecraftforge/client/textures/TextureAtlasSpriteLoaderManager.java
@@ -5,23 +5,23 @@
package net.minecraftforge.client.textures;
-import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.BiMap;
+import com.google.common.collect.HashBiMap;
+import com.google.common.collect.ImmutableBiMap;
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.client.event.RegisterTextureAtlasSpriteLoadersEvent;
import net.minecraftforge.fml.ModLoader;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
-import java.util.HashMap;
-import java.util.Map;
-
/**
* Manager for {@link ITextureAtlasSpriteLoader} instances.
*
* Provides a lookup.
+ * TODO: Convert this into a proper registry
*/
public final class TextureAtlasSpriteLoaderManager {
- private static Map LOADERS;
+ private static BiMap LOADERS;
/**
* Finds the loader with the given name, or null if none is registered.
@@ -31,12 +31,17 @@ public final class TextureAtlasSpriteLoaderManager {
return LOADERS.get(name);
}
+ @Nullable
+ public static ResourceLocation getKey(ITextureAtlasSpriteLoader value) {
+ return LOADERS.inverse().get(value);
+ }
+
@ApiStatus.Internal
public static void init() {
- var loaders = new HashMap();
+ var loaders = HashBiMap.create();
var event = new RegisterTextureAtlasSpriteLoadersEvent(loaders);
ModLoader.get().postEventWrapContainerInModOrder(event);
- LOADERS = ImmutableMap.copyOf(loaders);
+ LOADERS = ImmutableBiMap.copyOf(loaders);
}
private TextureAtlasSpriteLoaderManager() {}
diff --git a/src/main/java/net/minecraftforge/common/ForgeHooks.java b/src/main/java/net/minecraftforge/common/ForgeHooks.java
index efa7a7179b..318759a5b5 100644
--- a/src/main/java/net/minecraftforge/common/ForgeHooks.java
+++ b/src/main/java/net/minecraftforge/common/ForgeHooks.java
@@ -685,7 +685,7 @@ public final class ForgeHooks {
if (potion != null && potion.unwrapKey().isPresent())
return potion.unwrapKey().get().location().getNamespace();
} else if (item instanceof SpawnEggItem egg) {
- var resourceLocation = ForgeRegistries.ENTITY_TYPES.getKey(egg.getType(itemStack));
+ var resourceLocation = EntityType.getKey(egg.getDefaultType());
if (resourceLocation != null)
return resourceLocation.getNamespace();
}
diff --git a/src/main/java/net/minecraftforge/common/ForgeSpawnEggItem.java b/src/main/java/net/minecraftforge/common/ForgeSpawnEggItem.java
deleted file mode 100644
index 38b930e5e0..0000000000
--- a/src/main/java/net/minecraftforge/common/ForgeSpawnEggItem.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (c) Forge Development LLC and contributors
- * SPDX-License-Identifier: LGPL-2.1-only
- */
-
-package net.minecraftforge.common;
-
-import net.minecraft.core.Direction;
-import net.minecraft.core.dispenser.DispenseItemBehavior;
-import net.minecraft.util.ARGB;
-import net.minecraft.world.entity.EntitySpawnReason;
-import net.minecraft.world.entity.EntityType;
-import net.minecraft.world.entity.Mob;
-import net.minecraft.world.item.ItemStack;
-import net.minecraft.world.item.SpawnEggItem;
-import net.minecraft.world.level.block.DispenserBlock;
-import net.minecraft.world.level.gameevent.GameEvent;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.client.event.RegisterColorHandlersEvent;
-import net.minecraftforge.eventbus.api.EventPriority;
-import net.minecraftforge.eventbus.api.SubscribeEvent;
-import net.minecraftforge.fml.common.Mod;
-import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.ArrayList;
-import java.util.IdentityHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Supplier;
-
-public class ForgeSpawnEggItem extends SpawnEggItem {
- private static final List MOD_EGGS = new ArrayList<>();
- private static final Map, ForgeSpawnEggItem> TYPE_MAP = new IdentityHashMap<>();
- private final Supplier extends EntityType extends Mob>> typeSupplier;
-
- @SuppressWarnings("deprecation")
- public ForgeSpawnEggItem(Supplier extends EntityType extends Mob>> type, int backgroundColor, int highlightColor, Properties props) {
- super((EntityType extends Mob>)null, backgroundColor, highlightColor, props);
- this.typeSupplier = type;
-
- MOD_EGGS.add(this);
- }
-
- @Nullable
- protected DispenseItemBehavior createDispenseBehavior() {
- return DEFAULT_DISPENSE_BEHAVIOR;
- }
-
- @SuppressWarnings("deprecation")
- @Nullable
- public static SpawnEggItem fromEntityType(@Nullable EntityType> type) {
- SpawnEggItem ret = TYPE_MAP.get(type);
- return ret != null ? ret : SpawnEggItem.byId(type);
- }
-
- @Override
- protected EntityType> getDefaultType() {
- return this.typeSupplier.get();
- }
-
- private static final DispenseItemBehavior DEFAULT_DISPENSE_BEHAVIOR = (source, stack) -> {
- Direction face = source.state().getValue(DispenserBlock.FACING);
- EntityType> type = ((SpawnEggItem)stack.getItem()).getType(stack);
-
- try {
- type.spawn(source.level(), stack, null, source.pos().relative(face), EntitySpawnReason.DISPENSER, face != Direction.UP, false);
- } catch (Exception exception) {
- DispenseItemBehavior.LOGGER.error("Error while dispensing spawn egg from dispenser at {}", source.pos(), exception);
- return ItemStack.EMPTY;
- }
-
- stack.shrink(1);
- source.level().gameEvent(GameEvent.ENTITY_PLACE, source.pos(), GameEvent.Context.of(source.state()));
- return stack;
- };
-
- @Mod.EventBusSubscriber(modid = "forge", bus = Mod.EventBusSubscriber.Bus.MOD)
- private static class CommonHandler {
- @SubscribeEvent
- public static void onCommonSetup(FMLCommonSetupEvent event) {
- MOD_EGGS.forEach(egg -> {
- DispenseItemBehavior dispenseBehavior = egg.createDispenseBehavior();
- if (dispenseBehavior != null)
- DispenserBlock.registerBehavior(egg, dispenseBehavior);
-
- TYPE_MAP.put(egg.typeSupplier.get(), egg);
- });
- }
- }
-
- @Mod.EventBusSubscriber(value = Dist.CLIENT, modid = "forge", bus = Mod.EventBusSubscriber.Bus.MOD)
- private static class ColorRegisterHandler {
- @SubscribeEvent(priority = EventPriority.HIGHEST)
- public static void registerSpawnEggColors(RegisterColorHandlersEvent.Item event) {
- for (ForgeSpawnEggItem egg : MOD_EGGS) {
- event.register((stack, layer) -> {
- int color = egg.getColor(layer);
- if (ARGB.alpha(color) == 0)
- color = ARGB.opaque(color);
- return color;
- }, egg);
- }
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/net/minecraftforge/common/crafting/conditions/ICondition.java b/src/main/java/net/minecraftforge/common/crafting/conditions/ICondition.java
index 4650cba43e..cf94482c0e 100644
--- a/src/main/java/net/minecraftforge/common/crafting/conditions/ICondition.java
+++ b/src/main/java/net/minecraftforge/common/crafting/conditions/ICondition.java
@@ -10,6 +10,7 @@ import com.mojang.serialization.DynamicOps;
import com.mojang.serialization.MapCodec;
import net.minecraft.core.Holder;
+import net.minecraft.resources.DelegatingOps;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.TagKey;
import net.minecraftforge.registries.ForgeRegistries;
@@ -36,6 +37,10 @@ public interface ICondition {
@ApiStatus.Internal
public static ResourceLocation KEY = ResourceLocation.fromNamespaceAndPath("forge", "condition_context");
+ default > O wrap(O ops) {
+ return ops.withContext(KEY, this);
+ }
+
IContext EMPTY = new IContext() {
@Override
public Collection> getTag(TagKey key) {
diff --git a/src/main/java/net/minecraftforge/common/crafting/ingredients/AbstractIngredient.java b/src/main/java/net/minecraftforge/common/crafting/ingredients/AbstractIngredient.java
index ece557eee0..21e94de1e1 100644
--- a/src/main/java/net/minecraftforge/common/crafting/ingredients/AbstractIngredient.java
+++ b/src/main/java/net/minecraftforge/common/crafting/ingredients/AbstractIngredient.java
@@ -5,6 +5,7 @@
package net.minecraftforge.common.crafting.ingredients;
+import net.minecraft.core.Holder;
import net.minecraft.core.HolderSet;
import net.minecraft.tags.TagKey;
import net.minecraft.world.item.Item;
@@ -32,6 +33,15 @@ public abstract class AbstractIngredient extends Ingredient {
@Override
public abstract IIngredientSerializer extends Ingredient> serializer();
+ @Override
+ public boolean isEmpty() {
+ return this.items().count() == 0;
+ }
+
+ @Override
+ public boolean acceptsItem(Holder- item) {
+ return this.items().anyMatch(i -> i.equals(item));
+ }
/* Hide vanilla ingredient static constructors to reduce errors with constructing custom ingredients */
diff --git a/src/main/java/net/minecraftforge/common/crafting/ingredients/CompoundIngredient.java b/src/main/java/net/minecraftforge/common/crafting/ingredients/CompoundIngredient.java
index a749add222..91cd54af38 100644
--- a/src/main/java/net/minecraftforge/common/crafting/ingredients/CompoundIngredient.java
+++ b/src/main/java/net/minecraftforge/common/crafting/ingredients/CompoundIngredient.java
@@ -9,6 +9,8 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.stream.Stream;
+
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
@@ -44,14 +46,14 @@ public class CompoundIngredient extends AbstractIngredient {
@Override
@NotNull
- public List> items() {
+ public Stream> items() {
if (this.items == null) {
var tmp = new ArrayList>();
for (var child : children)
- tmp.addAll(child.items());
+ child.items().forEach(tmp::add);
this.items = Collections.unmodifiableList(tmp);
}
- return this.items;
+ return this.items.stream();
}
@Override
diff --git a/src/main/java/net/minecraftforge/common/crafting/ingredients/DifferenceIngredient.java b/src/main/java/net/minecraftforge/common/crafting/ingredients/DifferenceIngredient.java
index fe96a74140..f9562747d4 100644
--- a/src/main/java/net/minecraftforge/common/crafting/ingredients/DifferenceIngredient.java
+++ b/src/main/java/net/minecraftforge/common/crafting/ingredients/DifferenceIngredient.java
@@ -18,6 +18,7 @@ import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import java.util.stream.Stream;
/** Ingredient that matches everything from the first ingredient that is not included in the second ingredient */
public class DifferenceIngredient extends AbstractIngredient {
@@ -49,24 +50,18 @@ public class DifferenceIngredient extends AbstractIngredient {
@SuppressWarnings("deprecation")
@Override
- public List> items() {
+ public Stream> items() {
if (this.items == null) {
var tmp = new ArrayList>();
- for (var base : this.base.items()) {
- boolean match = false;
- for (var item : this.subtracted.items()) {
- if (base.is(item)) {
- match = true;
- break;
- }
- }
+ this.base.items().forEach(base -> {
+ boolean match = this.subtracted.items().anyMatch(base::is);
if (!match)
tmp.add(base);
- }
+ });
this.items = Collections.unmodifiableList(tmp);
}
- return items;
+ return items.stream();
}
@Override
diff --git a/src/main/java/net/minecraftforge/common/crafting/ingredients/IntersectionIngredient.java b/src/main/java/net/minecraftforge/common/crafting/ingredients/IntersectionIngredient.java
index a0007c835c..1d40e180ae 100644
--- a/src/main/java/net/minecraftforge/common/crafting/ingredients/IntersectionIngredient.java
+++ b/src/main/java/net/minecraftforge/common/crafting/ingredients/IntersectionIngredient.java
@@ -19,6 +19,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.stream.Stream;
/** Ingredient that matches if all child ingredients match */
public class IntersectionIngredient extends AbstractIngredient {
@@ -61,20 +62,14 @@ public class IntersectionIngredient extends AbstractIngredient {
@SuppressWarnings("deprecation")
@Override
- public List> items() {
+ public Stream> items() {
if (this.items == null) {
var tmp = new ArrayList>();
- for (var base : children.get(0).items()) {
+ children.get(0).items().forEach(base -> {
boolean allMatch = true;
for (int i = 1; i < children.size(); i++) {
- boolean match = false;
- for (var item : children.get(i).items()) {
- if (base.is(item)) {
- match = true;
- break;
- }
- }
+ boolean match = children.get(i).items().anyMatch(base::is);
if (!match) {
allMatch = false;
break;
@@ -82,10 +77,10 @@ public class IntersectionIngredient extends AbstractIngredient {
}
if (allMatch)
tmp.add(base);
- }
+ });
this.items = Collections.unmodifiableList(tmp);
}
- return items;
+ return items.stream();
}
@Override
diff --git a/src/main/java/net/minecraftforge/common/extensions/IForgeBlock.java b/src/main/java/net/minecraftforge/common/extensions/IForgeBlock.java
index 8a052ce671..527e295004 100644
--- a/src/main/java/net/minecraftforge/common/extensions/IForgeBlock.java
+++ b/src/main/java/net/minecraftforge/common/extensions/IForgeBlock.java
@@ -36,7 +36,6 @@ import net.minecraft.tags.BlockTags;
import net.minecraft.core.Direction;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.pathfinder.WalkNodeEvaluator;
-import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.Vec3;
import net.minecraft.server.level.ServerLevel;
import net.minecraftforge.client.ForgeHooksClient;
@@ -271,17 +270,6 @@ public interface IForgeBlock {
return self().getExplosionResistance();
}
- /**
- *
- * Called when A user uses the creative pick block button on this block
- *
- * @param target The full target the player is looking at
- * @return A ItemStack to add to the player's inventory, empty itemstack if nothing should be added.
- */
- default ItemStack getCloneItemStack(BlockState state, HitResult target, LevelReader level, BlockPos pos, Player player) {
- return self().getCloneItemStack(level, pos, state);
- }
-
/**
* Allows a block to override the standard EntityLivingBase.updateFallState
* particles, this is a server side method that spawns particles with
diff --git a/src/main/java/net/minecraftforge/common/extensions/IForgeBlockEntity.java b/src/main/java/net/minecraftforge/common/extensions/IForgeBlockEntity.java
index c186b2593b..bc5aada321 100644
--- a/src/main/java/net/minecraftforge/common/extensions/IForgeBlockEntity.java
+++ b/src/main/java/net/minecraftforge/common/extensions/IForgeBlockEntity.java
@@ -5,7 +5,6 @@
package net.minecraftforge.common.extensions;
-import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.network.Connection;
import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket;
diff --git a/src/main/java/net/minecraftforge/common/extensions/IForgeBlockState.java b/src/main/java/net/minecraftforge/common/extensions/IForgeBlockState.java
index 85ae8cc026..966cb0dc66 100644
--- a/src/main/java/net/minecraftforge/common/extensions/IForgeBlockState.java
+++ b/src/main/java/net/minecraftforge/common/extensions/IForgeBlockState.java
@@ -22,10 +22,8 @@ import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.SignalGetter;
import net.minecraft.world.level.levelgen.feature.configurations.TreeConfiguration;
import net.minecraft.world.level.material.FluidState;
-import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.pathfinder.PathType;
import net.minecraft.core.BlockPos;
-import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.Vec3;
import net.minecraft.server.level.ServerLevel;
import net.minecraftforge.common.IPlantable;
@@ -200,17 +198,6 @@ public interface IForgeBlockState {
return self().getBlock().getExplosionResistance(self(), level, pos, explosion);
}
- /**
- *
- * Called when A user uses the creative pick block button on this block
- *
- * @param target The full target the player is looking at
- * @return A ItemStack to add to the player's inventory, empty itemstack if nothing should be added.
- */
- default ItemStack getCloneItemStack(HitResult target, LevelReader level, BlockPos pos, Player player) {
- return self().getBlock().getCloneItemStack(self(), target, level, pos, player);
- }
-
/**
* Allows a block to override the standard EntityLivingBase.updateFallState
* particles, this is a server side method that spawns particles with
diff --git a/src/main/java/net/minecraftforge/common/extensions/IForgeEntity.java b/src/main/java/net/minecraftforge/common/extensions/IForgeEntity.java
index 3f01d35f4b..7e1e13dd75 100644
--- a/src/main/java/net/minecraftforge/common/extensions/IForgeEntity.java
+++ b/src/main/java/net/minecraftforge/common/extensions/IForgeEntity.java
@@ -17,14 +17,11 @@ import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.MobCategory;
import net.minecraft.world.entity.item.ItemEntity;
-import net.minecraft.world.item.ItemStack;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.core.BlockPos;
import net.minecraft.core.HolderLookup;
import net.minecraft.world.level.material.FluidState;
-import net.minecraft.world.phys.HitResult;
-import net.minecraftforge.common.ForgeSpawnEggItem;
import net.minecraftforge.common.SoundAction;
import net.minecraftforge.common.capabilities.ICapabilitySerializable;
import net.minecraftforge.entity.PartEntity;
@@ -72,21 +69,6 @@ public interface IForgeEntity extends ICapabilitySerializable {
return true;
}
- /**
- * Called when a user uses the creative pick block button on this entity.
- *
- * @param target The full target the player is looking at
- * @return A ItemStack to add to the player's inventory, empty ItemStack if nothing should be added.
- */
- default ItemStack getPickedResult(HitResult target) {
- var result = self().getPickResult();
- if (result == null) {
- var egg = ForgeSpawnEggItem.fromEntityType(self().getType());
- result = egg == null ? ItemStack.EMPTY : new ItemStack(egg);
- }
- return result;
- }
-
/**
* If a rider of this entity can interact with this entity. Should return true on the
* ridden entity if so.
diff --git a/src/main/java/net/minecraftforge/common/loot/LootModifierManager.java b/src/main/java/net/minecraftforge/common/loot/LootModifierManager.java
index 32925161a6..a36c0ed741 100644
--- a/src/main/java/net/minecraftforge/common/loot/LootModifierManager.java
+++ b/src/main/java/net/minecraftforge/common/loot/LootModifierManager.java
@@ -25,6 +25,7 @@ import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.util.ExtraCodecs;
import net.minecraft.util.GsonHelper;
import net.minecraft.core.HolderLookup;
+import net.minecraft.resources.FileToIdConverter;
import net.minecraft.resources.ResourceLocation;
public class LootModifierManager extends SimpleJsonResourceReloadListener {
@@ -36,7 +37,7 @@ public class LootModifierManager extends SimpleJsonResourceReloadListener modifiers = ImmutableMap.of();
public LootModifierManager(HolderLookup.Provider registries) {
- super(registries, ExtraCodecs.JSON, FOLDER);
+ super(registries.createSerializationContext(JsonOps.INSTANCE), ExtraCodecs.JSON, FileToIdConverter.json(FOLDER));
this.registries = registries;
}
diff --git a/src/main/java/net/minecraftforge/common/world/BiomeSpecialEffectsBuilder.java b/src/main/java/net/minecraftforge/common/world/BiomeSpecialEffectsBuilder.java
index ce0832a2a0..96023cc804 100644
--- a/src/main/java/net/minecraftforge/common/world/BiomeSpecialEffectsBuilder.java
+++ b/src/main/java/net/minecraftforge/common/world/BiomeSpecialEffectsBuilder.java
@@ -10,6 +10,7 @@ import java.util.Optional;
import net.minecraft.core.Holder;
import net.minecraft.sounds.Music;
import net.minecraft.sounds.SoundEvent;
+import net.minecraft.util.random.SimpleWeightedRandomList;
import net.minecraft.world.level.biome.AmbientAdditionsSettings;
import net.minecraft.world.level.biome.AmbientMoodSettings;
import net.minecraft.world.level.biome.AmbientParticleSettings;
@@ -19,10 +20,8 @@ import net.minecraft.world.level.biome.BiomeSpecialEffects;
* Extension of the vanilla builder but also provides read access and a copy-from-existing-data helper.
* Also, the base builder crashes if certain values aren't specified on build, so this enforces the setting of those.
*/
-public class BiomeSpecialEffectsBuilder extends BiomeSpecialEffects.Builder
-{
- public static BiomeSpecialEffectsBuilder copyOf(BiomeSpecialEffects baseEffects)
- {
+public class BiomeSpecialEffectsBuilder extends BiomeSpecialEffects.Builder {
+ public static BiomeSpecialEffectsBuilder copyOf(BiomeSpecialEffects baseEffects) {
BiomeSpecialEffectsBuilder builder = BiomeSpecialEffectsBuilder.create(baseEffects.getFogColor(), baseEffects.getWaterColor(), baseEffects.getWaterFogColor(), baseEffects.getSkyColor());
builder.grassColorModifier = baseEffects.getGrassColorModifier();
baseEffects.getFoliageColorOverride().ifPresent(builder::foliageColorOverride);
@@ -35,13 +34,11 @@ public class BiomeSpecialEffectsBuilder extends BiomeSpecialEffects.Builder
return builder;
}
- public static BiomeSpecialEffectsBuilder create(int fogColor, int waterColor, int waterFogColor, int skyColor)
- {
+ public static BiomeSpecialEffectsBuilder create(int fogColor, int waterColor, int waterFogColor, int skyColor) {
return new BiomeSpecialEffectsBuilder(fogColor, waterColor, waterFogColor, skyColor);
}
- protected BiomeSpecialEffectsBuilder(int fogColor, int waterColor, int waterFogColor, int skyColor)
- {
+ protected BiomeSpecialEffectsBuilder(int fogColor, int waterColor, int waterFogColor, int skyColor) {
super();
this.fogColor(fogColor);
this.waterColor(waterColor);
@@ -49,63 +46,51 @@ public class BiomeSpecialEffectsBuilder extends BiomeSpecialEffects.Builder
this.skyColor(skyColor);
}
- public int getFogColor()
- {
+ public int getFogColor() {
return this.fogColor.getAsInt();
}
- public int waterColor()
- {
+ public int waterColor() {
return this.waterColor.getAsInt();
}
- public int getWaterFogColor()
- {
+ public int getWaterFogColor() {
return this.waterFogColor.getAsInt();
}
- public int getSkyColor()
- {
+ public int getSkyColor() {
return this.skyColor.getAsInt();
}
- public BiomeSpecialEffects.GrassColorModifier getGrassColorModifier()
- {
+ public BiomeSpecialEffects.GrassColorModifier getGrassColorModifier() {
return this.grassColorModifier;
}
- public Optional getFoliageColorOverride()
- {
+ public Optional getFoliageColorOverride() {
return this.foliageColorOverride;
}
- public Optional getGrassColorOverride()
- {
+ public Optional getGrassColorOverride() {
return this.grassColorOverride;
}
- public Optional getAmbientParticle()
- {
+ public Optional getAmbientParticle() {
return this.ambientParticle;
}
- public Optional> getAmbientLoopSound()
- {
+ public Optional> getAmbientLoopSound() {
return this.ambientLoopSoundEvent;
}
- public Optional getAmbientMoodSound()
- {
+ public Optional getAmbientMoodSound() {
return this.ambientMoodSettings;
}
- public Optional getAmbientAdditionsSound()
- {
+ public Optional getAmbientAdditionsSound() {
return this.ambientAdditionsSettings;
}
- public Optional getBackgroundMusic()
- {
+ public Optional> getBackgroundMusic() {
return this.backgroundMusic;
}
}
\ No newline at end of file
diff --git a/src/main/java/net/minecraftforge/data/loading/DatagenModLoader.java b/src/main/java/net/minecraftforge/data/loading/DatagenModLoader.java
index ae0f138922..def36dd4df 100644
--- a/src/main/java/net/minecraftforge/data/loading/DatagenModLoader.java
+++ b/src/main/java/net/minecraftforge/data/loading/DatagenModLoader.java
@@ -18,12 +18,17 @@ import org.apache.logging.log4j.Logger;
import java.io.File;
import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.regex.Pattern;
+import joptsimple.OptionParser;
+import joptsimple.OptionSet;
+import joptsimple.OptionSpec;
+
public class DatagenModLoader {
private static final Logger LOGGER = LogManager.getLogger();
private static ExistingFileHelper existingFileHelper;
@@ -33,13 +38,49 @@ public class DatagenModLoader {
return runningDataGen;
}
- public static void begin(
- Set patterns, Path output, Collection inputs, Collection existingPacks, Set existingMods,
- boolean genServer, boolean genClient, boolean genDev, boolean genReports,
- boolean validate, boolean flat, String assetIndex, File assetsDir
+ public static DatagenModLoader setup(OptionParser parser, boolean client) {
+ return new DatagenModLoader(parser, client);
+ }
+
+ private final OptionParser parser;
+ private final boolean client;
+ private final OptionSpec existing;
+ private final OptionSpec existingMod;
+ private final OptionSpec mod;
+ private final OptionSpec assetIndex;
+ private final OptionSpec gameDir;
+ private final OptionSpec assetsDir;
+ private final OptionSpec flat;
+
+ private DatagenModLoader(OptionParser parser, boolean client) {
+ this.gameDir = parser.accepts("gameDir").withRequiredArg().ofType(java.io.File.class).defaultsTo(new java.io.File(".")).required(); //Need by modlauncher, so lets just eat it
+ this.parser = parser;
+ this.client = client;
+ this.existing = parser.accepts("existing", "Existing resource packs that generated resources can reference").withRequiredArg();
+ this.existingMod = parser.accepts("existing-mod", "Existing mods that generated resources can reference the resource packs of").withRequiredArg();
+ this.mod = parser.accepts("mod", "A modid to dump").withRequiredArg().withValuesSeparatedBy(",");
+ this.flat = parser.accepts("flat", "Do not append modid prefix to output directory when generating for multiple mods");
+ this.assetIndex = parser.accepts("assetIndex").withRequiredArg();
+ this.assetsDir = parser.accepts("assetsDir").withRequiredArg().ofType(java.io.File.class);
+ }
+
+ public boolean hasArgs(OptionSet options) {
+ return options.specs().size() != 1 || !options.has(gameDir);
+ }
+
+ public boolean run(
+ OptionSet options, Path output, Collection inputs,
+ boolean genServer, boolean genClient, boolean genDev, boolean genReports, boolean validate
) {
+ var existingPacks = options.valuesOf(this.existing).stream().map(Paths::get).toList();
+ var existingMods = new HashSet<>(options.valuesOf(this.existingMod));
+ var patterns = new HashSet<>(options.valuesOf(this.mod));
+ var flat = patterns.isEmpty() || options.has(this.flat);
+ var assetIndex = options.valueOf(this.assetIndex);
+ var assetsDir = options.valueOf(this.assetsDir);
+
if (patterns.contains("minecraft") && patterns.size() == 1)
- return;
+ return true;
runningDataGen = true;
Bootstrap.bootStrap();
@@ -77,5 +118,7 @@ public class DatagenModLoader {
), config, existingFileHelper)
);
config.runAll();
+
+ return false;
}
}
diff --git a/src/main/java/net/minecraftforge/resource/DelegatingPackResources.java b/src/main/java/net/minecraftforge/resource/DelegatingPackResources.java
index e2ab43633f..125f0e40e2 100644
--- a/src/main/java/net/minecraftforge/resource/DelegatingPackResources.java
+++ b/src/main/java/net/minecraftforge/resource/DelegatingPackResources.java
@@ -21,7 +21,7 @@ import net.minecraft.server.packs.AbstractPackResources;
import net.minecraft.server.packs.PackLocationInfo;
import net.minecraft.server.packs.PackResources;
import net.minecraft.server.packs.PackType;
-import net.minecraft.server.packs.metadata.MetadataSectionSerializer;
+import net.minecraft.server.packs.metadata.MetadataSectionType;
import net.minecraft.server.packs.metadata.pack.PackMetadataSection;
import net.minecraft.server.packs.repository.Pack;
import net.minecraft.server.packs.repository.Pack.Metadata;
@@ -58,8 +58,8 @@ public class DelegatingPackResources extends AbstractPackResources {
@SuppressWarnings("unchecked")
@Nullable
@Override
- public T getMetadataSection(MetadataSectionSerializer deserializer) throws IOException {
- return deserializer.getMetadataSectionName().equals("pack") ? (T) this.packMeta : null;
+ public T getMetadataSection(MetadataSectionType deserializer) throws IOException {
+ return deserializer.name().equals("pack") ? (T) this.packMeta : null;
}
@Override
diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg
index 4368b40a7a..34782950d3 100644
--- a/src/main/resources/META-INF/accesstransformer.cfg
+++ b/src/main/resources/META-INF/accesstransformer.cfg
@@ -87,6 +87,7 @@ public net.minecraft.client.resources.ClientPackSource m_246691_(Ljava/nio/file/
protected net.minecraft.client.resources.TextureAtlasHolder f_118884_ # textureAtlas
public net.minecraft.client.resources.model.ModelBakery f_119241_ # ITEM_MODEL_GENERATOR
public net.minecraft.client.resources.model.SimpleBakedModel$Builder (ZZZLnet/minecraft/client/renderer/block/model/ItemTransforms;)V # constructor
+public net.minecraft.client.resources.model.SimpleBakedModel m_373830_(Lnet/minecraft/client/renderer/block/model/BlockElement;Lnet/minecraft/client/renderer/block/model/BlockElementFace;Lnet/minecraft/client/renderer/texture/TextureAtlasSprite;Lnet/minecraft/core/Direction;Lnet/minecraft/client/resources/model/ModelState;)Lnet/minecraft/client/renderer/block/model/BakedQuad; # bakeFace
public net.minecraft.client.sounds.SoundEngine f_120217_ # soundManager
public net.minecraft.commands.CommandSourceStack f_81288_ # source
public net.minecraft.commands.arguments.selector.EntitySelectorParser m_121229_()V # finalizePredicates
@@ -152,7 +153,7 @@ public net.minecraft.server.packs.repository.FolderRepositorySource$FolderPackDe
public net.minecraft.server.packs.repository.FolderRepositorySource$FolderPackDetector (Lnet/minecraft/world/level/validation/DirectoryValidator;)V # constructor
public net.minecraft.server.packs.repository.ServerPacksSource m_246173_()Lnet/minecraft/server/packs/VanillaPackResources; # createVanillaPackSource
public net.minecraft.server.packs.resources.FallbackResourceManager f_10599_ # fallbacks
-protected net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener (Lcom/mojang/serialization/DynamicOps;Lcom/mojang/serialization/Codec;Ljava/lang/String;)V # constructor
+protected net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener (Lcom/mojang/serialization/DynamicOps;Lcom/mojang/serialization/Codec;Lnet/minecraft/resources/FileToIdConverter;)V # constructor
public net.minecraft.util.datafix.fixes.StructuresBecomeConfiguredFix$Conversion
public net.minecraft.util.thread.BlockableEventLoop m_18689_(Ljava/lang/Runnable;)Ljava/util/concurrent/CompletableFuture; # submitAsync
#group public net.minecraft.world.damagesource.DamageSource *() #All methods public, most are already