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> completablefuture = loadBlockModels(p_251134_, p_250550_); -@@ -253,6 +_,8 @@ - .collect(Collectors.joining("\n")) + CompletableFuture completablefuture = CompletableFuture.supplyAsync(EntityModelSet::vanilla, p_250550_); + CompletableFuture completablefuture1 = completablefuture.thenApplyAsync(SpecialBlockModelRenderer::vanilla, p_250550_); +@@ -260,13 +_,15 @@ + p_374740_.stream().sorted().map(p_374742_ -> " " + p_374742_).collect(Collectors.joining("\n")) ) ); + p_252136_.popPush("forge_modify_baking_result"); -+ net.minecraftforge.client.ForgeHooksClient.onModifyBakingResult(p_248945_.getBakedTopLevelModels(), p_248945_); ++ net.minecraftforge.client.ForgeHooksClient.onModifyBakingResult(p_248945_, modelbakery$bakingresult); p_252136_.popPush("dispatch"); - Map map = p_248945_.getBakedTopLevelModels(); - BakedModel bakedmodel = map.get(MissingBlockModel.VARIANT); -@@ -284,6 +_,8 @@ - this.bakedRegistry = modelbakery.getBakedTopLevelModels(); + Map map = createBlockStateToModelDispatch(modelbakery$bakingresult.blockStateModels(), modelbakery$bakingresult.missingModel()); + CompletableFuture completablefuture = CompletableFuture.allOf( + p_250646_.values().stream().map(AtlasSet.StitchResult::readyForUpload).toArray(CompletableFuture[]::new) + ); + p_252136_.pop(); +- return new ModelManager.ReloadState(modelbakery$bakingresult, p_361513_, map, p_250646_, p_378097_, p_377275_, completablefuture); ++ return new ModelManager.ReloadState(modelbakery$bakingresult, p_361513_, map, p_250646_, p_378097_, p_377275_, completablefuture, p_248945_); + } + + private static Map createBlockStateToModelDispatch(Map p_377857_, BakedModel p_378390_) { +@@ -298,11 +_,15 @@ + p_248996_.atlasPreparations.values().forEach(AtlasSet.StitchResult::upload); + ModelBakery.BakingResult modelbakery$bakingresult = p_248996_.bakedModels; + this.bakedBlockStateModels = modelbakery$bakingresult.blockStateModels(); ++ this.bakedBlockStateModelsView = java.util.Collections.unmodifiableMap(this.bakedBlockStateModels); + this.bakedItemStackModels = modelbakery$bakingresult.itemStackModels(); ++ this.bakedItemStackModelsView = java.util.Collections.unmodifiableMap(this.bakedItemStackModels); + this.itemProperties = modelbakery$bakingresult.itemProperties(); this.modelGroups = p_248996_.modelGroups; - this.missingModel = p_248996_.missingModel; -+ this.modelBakery = modelbakery; -+ net.minecraftforge.client.ForgeHooksClient.onModelBake(this, this.bakedRegistry, modelbakery); + this.missingModel = modelbakery$bakingresult.missingModel(); + this.missingItemModel = modelbakery$bakingresult.missingItemModel(); ++ this.modelBakery = p_248996_.modelBakery(); ++ net.minecraftforge.client.ForgeHooksClient.onModelBake(this, this.modelBakery); p_251960_.popPush("cache"); this.blockModelShaper.replaceCache(p_248996_.modelCache); - p_251960_.pop(); -@@ -308,6 +_,7 @@ + this.specialBlockModelRenderer = p_248996_.specialBlockModelRenderer; +@@ -329,6 +_,7 @@ } public TextureAtlas getAtlas(ResourceLocation p_119429_) { @@ -50,14 +89,24 @@ return this.atlases.getAtlas(p_119429_); } -@@ -318,6 +_,10 @@ - - public void updateMaxMipLevel(int p_119411_) { +@@ -341,6 +_,10 @@ this.maxMipmapLevels = p_119411_; -+ } -+ -+ public ModelBakery getModelBakery() { -+ return com.google.common.base.Preconditions.checkNotNull(modelBakery, "Attempted to query model bakery before it has been initialized."); } - @OnlyIn(Dist.CLIENT) ++ public ModelBakery getModelBakery() { ++ return com.google.common.base.Preconditions.checkNotNull(modelBakery, "Attempted to query model bakery before it has been initialized."); ++ } ++ + public Supplier specialBlockModelRenderer() { + return () -> this.specialBlockModelRenderer; + } +@@ -357,7 +_,8 @@ + Map atlasPreparations, + EntityModelSet entityModelSet, + SpecialBlockModelRenderer specialBlockModelRenderer, +- CompletableFuture readyForUpload ++ CompletableFuture readyForUpload, ++ ModelBakery modelBakery + ) { + } + } diff --git a/patches/minecraft/net/minecraft/client/resources/model/SimpleBakedModel.java.patch b/patches/minecraft/net/minecraft/client/resources/model/SimpleBakedModel.java.patch index 12a2fc2bc1..82cd20b248 100644 --- a/patches/minecraft/net/minecraft/client/resources/model/SimpleBakedModel.java.patch +++ b/patches/minecraft/net/minecraft/client/resources/model/SimpleBakedModel.java.patch @@ -1,45 +1,50 @@ --- a/net/minecraft/client/resources/model/SimpleBakedModel.java +++ b/net/minecraft/client/resources/model/SimpleBakedModel.java -@@ -25,6 +_,15 @@ - protected final boolean usesBlockLight; - protected final TextureAtlasSprite particleIcon; - protected final ItemTransforms transforms; +@@ -29,6 +_,19 @@ + private final boolean usesBlockLight; + private final TextureAtlasSprite particleIcon; + private final ItemTransforms transforms; ++ /* + protected final net.minecraftforge.client.ChunkRenderTypeSet blockRenderTypes; + protected final List itemRenderTypes; + protected final List fabulousItemRenderTypes; ++ */ + -+ /** @deprecated Forge: Use {@linkplain #SimpleBakedModel(List, Map, boolean, boolean, boolean, TextureAtlasSprite, ItemTransforms, net.minecraftforge.client.RenderTypeGroup) variant with RenderTypeGroup} **/ ++ /* @deprecated Forge: Use {@linkplain #SimpleBakedModel(List, Map, boolean, boolean, boolean, TextureAtlasSprite, ItemTransforms, net.minecraftforge.client.RenderTypeGroup) variant with RenderTypeGroup} **/ ++ /* + @Deprecated + public SimpleBakedModel(List p_119489_, Map> p_119490_, boolean p_119491_, boolean p_119492_, boolean p_119493_, TextureAtlasSprite p_119494_, ItemTransforms p_119495_) { + this(p_119489_, p_119490_, p_119491_, p_119492_, p_119493_, p_119494_, p_119495_, net.minecraftforge.client.RenderTypeGroup.EMPTY); + } ++ */ public SimpleBakedModel( List p_119489_, -@@ -33,7 +_,8 @@ - boolean p_119492_, +@@ -38,6 +_,7 @@ boolean p_119493_, TextureAtlasSprite p_119494_, -- ItemTransforms p_119495_ -+ ItemTransforms p_119495_, -+ net.minecraftforge.client.RenderTypeGroup renderTypes + ItemTransforms p_119495_ ++ //net.minecraftforge.client.RenderTypeGroup renderTypes ) { this.unculledFaces = p_119489_; this.culledFaces = p_119490_; -@@ -42,6 +_,9 @@ +@@ -46,6 +_,11 @@ this.usesBlockLight = p_119492_; this.particleIcon = p_119494_; this.transforms = p_119495_; ++ /* + this.blockRenderTypes = !renderTypes.isEmpty() ? net.minecraftforge.client.ChunkRenderTypeSet.of(renderTypes.block()) : null; + this.itemRenderTypes = !renderTypes.isEmpty() ? List.of(renderTypes.entity()) : null; + this.fabulousItemRenderTypes = !renderTypes.isEmpty() ? List.of(renderTypes.entityFabulous()) : null; ++ */ } - @Override -@@ -79,6 +_,25 @@ + public static BakedModel bakeElements( +@@ -123,6 +_,27 @@ return this.transforms; } ++ /* + @Override + public net.minecraftforge.client.ChunkRenderTypeSet getRenderTypes(BlockState state, RandomSource rand, net.minecraftforge.client.model.data.ModelData data) { + return blockRenderTypes != null ? blockRenderTypes : BakedModel.super.getRenderTypes(state, rand, data); @@ -58,19 +63,22 @@ + } + return BakedModel.super.getRenderTypes(itemStack, fabulous); + } ++ */ + @OnlyIn(Dist.CLIENT) public static class Builder { private final ImmutableList.Builder unculledFaces = ImmutableList.builder(); -@@ -124,13 +_,19 @@ +@@ -164,13 +_,21 @@ return this; } ++ /* + private net.minecraftforge.client.RenderTypeGroup renderTypes = net.minecraftforge.client.RenderTypeGroup.EMPTY; + public SimpleBakedModel.Builder renderTypes(net.minecraftforge.client.RenderTypeGroup renderTypes) { + this.renderTypes = renderTypes; + return this; + } ++ */ + public BakedModel build() { if (this.particleIcon == null) { @@ -79,7 +87,7 @@ Map> map = Maps.transformValues(this.culledFaces, ImmutableList.Builder::build); return new SimpleBakedModel( - this.unculledFaces.build(), new EnumMap<>(map), this.hasAmbientOcclusion, this.usesBlockLight, this.isGui3d, this.particleIcon, this.transforms -+ this.unculledFaces.build(), new EnumMap<>(map), this.hasAmbientOcclusion, this.usesBlockLight, this.isGui3d, this.particleIcon, this.transforms, this.renderTypes ++ this.unculledFaces.build(), new EnumMap<>(map), this.hasAmbientOcclusion, this.usesBlockLight, this.isGui3d, this.particleIcon, this.transforms/*, this.renderTypes*/ ); } } diff --git a/patches/minecraft/net/minecraft/client/resources/model/SpriteGetter.java.patch b/patches/minecraft/net/minecraft/client/resources/model/SpriteGetter.java.patch new file mode 100644 index 0000000000..9eed2ad9d4 --- /dev/null +++ b/patches/minecraft/net/minecraft/client/resources/model/SpriteGetter.java.patch @@ -0,0 +1,12 @@ +--- a/net/minecraft/client/resources/model/SpriteGetter.java ++++ b/net/minecraft/client/resources/model/SpriteGetter.java +@@ -9,4 +_,9 @@ + TextureAtlasSprite get(Material p_376066_); + + TextureAtlasSprite reportMissingReference(String p_377389_); ++ ++ default TextureAtlasSprite maybeMissing(net.minecraft.client.renderer.block.model.TextureSlots textures, String name) { ++ var material = textures.getMaterial(name); ++ return material != null ? get(material) : reportMissingReference(name); ++ } + } diff --git a/patches/minecraft/net/minecraft/client/resources/model/UnbakedModel.java.patch b/patches/minecraft/net/minecraft/client/resources/model/UnbakedModel.java.patch new file mode 100644 index 0000000000..00f3905f4d --- /dev/null +++ b/patches/minecraft/net/minecraft/client/resources/model/UnbakedModel.java.patch @@ -0,0 +1,24 @@ +--- a/net/minecraft/client/resources/model/UnbakedModel.java ++++ b/net/minecraft/client/resources/model/UnbakedModel.java +@@ -13,6 +_,10 @@ + boolean DEFAULT_AMBIENT_OCCLUSION = true; + UnbakedModel.GuiLight DEFAULT_GUI_LIGHT = UnbakedModel.GuiLight.SIDE; + ++ default BakedModel bake(TextureSlots textures, ModelBaker baker, ModelState state) { ++ return bake(textures, baker, state, this.getAmbientOcclusion(), this.getGuiLight().lightLikeBlock(), this.getTransforms()); ++ } ++ + BakedModel bake(TextureSlots p_376037_, ModelBaker p_250133_, ModelState p_119536_, boolean p_378145_, boolean p_377763_, ItemTransforms p_375499_); + + @Nullable +@@ -135,6 +_,10 @@ + + public boolean lightLikeBlock() { + return this == SIDE; ++ } ++ ++ public String getSerializedName() { ++ return name; + } + } + } diff --git a/patches/minecraft/net/minecraft/client/sounds/SoundEngine.java.patch b/patches/minecraft/net/minecraft/client/sounds/SoundEngine.java.patch index cd5868519e..72ef7fe597 100644 --- a/patches/minecraft/net/minecraft/client/sounds/SoundEngine.java.patch +++ b/patches/minecraft/net/minecraft/client/sounds/SoundEngine.java.patch @@ -16,7 +16,7 @@ } private synchronized void loadLibrary() { -@@ -325,7 +_,8 @@ +@@ -334,7 +_,8 @@ public void play(SoundInstance p_120313_) { if (this.loaded) { @@ -26,7 +26,7 @@ WeighedSoundEvents weighedsoundevents = p_120313_.resolve(this.soundManager); ResourceLocation resourcelocation = p_120313_.getLocation(); if (weighedsoundevents == null) { -@@ -389,19 +_,22 @@ +@@ -398,19 +_,22 @@ p_194488_.setSelfPosition(vec3); p_194488_.setRelative(flag); }); @@ -34,8 +34,8 @@ if (!flag2) { this.soundBuffers .getCompleteBuffer(sound.getPath()) - .thenAccept(p_194501_ -> channelaccess$channelhandle.execute(p_194495_ -> { - p_194495_.attachStaticBuffer(p_194501_); + .thenAccept(p_377326_ -> channelaccess$channelhandle.execute(p_194495_ -> { + p_194495_.attachStaticBuffer(p_377326_); p_194495_.play(); + net.minecraftforge.client.event.ForgeEventFactoryClient.onPlaySoundSource(this, soundinstance, p_194495_); })); @@ -44,8 +44,8 @@ - .getStream(sound.getPath(), flag1) + soundinstance + .getStream(this.soundBuffers, sound, flag1) - .thenAccept(p_194504_ -> channelaccess$channelhandle.execute(p_194498_ -> { - p_194498_.attachBufferStream(p_194504_); + .thenAccept(p_376862_ -> channelaccess$channelhandle.execute(p_194498_ -> { + p_194498_.attachBufferStream(p_376862_); p_194498_.play(); + net.minecraftforge.client.event.ForgeEventFactoryClient.onPlayStreamingSource(this, soundinstance, p_194498_); })); diff --git a/patches/minecraft/net/minecraft/data/Main.java.patch b/patches/minecraft/net/minecraft/data/Main.java.patch index 542d84046a..eb7a9bc282 100644 --- a/patches/minecraft/net/minecraft/data/Main.java.patch +++ b/patches/minecraft/net/minecraft/data/Main.java.patch @@ -1,41 +1,21 @@ --- a/net/minecraft/data/Main.java +++ b/net/minecraft/data/Main.java -@@ -86,8 +_,15 @@ - OptionSpec optionspec6 = optionparser.accepts("all", "Include all generators"); - OptionSpec optionspec7 = optionparser.accepts("output", "Output folder").withRequiredArg().defaultsTo("generated"); - OptionSpec optionspec8 = optionparser.accepts("input", "Input folder").withRequiredArg(); -+ OptionSpec existing = optionparser.accepts("existing", "Existing resource packs that generated resources can reference").withRequiredArg(); -+ OptionSpec existingMod = optionparser.accepts("existing-mod", "Existing mods that generated resources can reference the resource packs of").withRequiredArg(); -+ OptionSpec gameDir = optionparser.accepts("gameDir").withRequiredArg().ofType(java.io.File.class).defaultsTo(new java.io.File(".")).required(); //Need by modlauncher, so lets just eat it -+ OptionSpec mod = optionparser.accepts("mod", "A modid to dump").withRequiredArg().withValuesSeparatedBy(","); -+ OptionSpec flat = optionparser.accepts("flat", "Do not append modid prefix to output directory when generating for multiple mods"); -+ OptionSpec assetIndex = optionparser.accepts("assetIndex").withRequiredArg(); -+ OptionSpec assetsDir = optionparser.accepts("assetsDir").withRequiredArg().ofType(java.io.File.class); +@@ -77,14 +_,17 @@ + OptionSpec optionspec4 = optionparser.accepts("all", "Include all generators"); + OptionSpec optionspec5 = optionparser.accepts("output", "Output folder").withRequiredArg().defaultsTo("generated"); + OptionSpec optionspec6 = optionparser.accepts("input", "Input folder").withRequiredArg(); ++ var loader = net.minecraftforge.data.loading.DatagenModLoader.setup(optionparser, false); OptionSet optionset = optionparser.parse(p_129669_); - if (!optionset.has(optionspec) && optionset.hasOptions()) { -+ if (!optionset.has(optionspec) && optionset.hasOptions() && !(optionset.specs().size() == 1 && optionset.has(gameDir))) { - Path path = Paths.get(optionspec7.value(optionset)); - boolean flag = optionset.has(optionspec6); - boolean flag1 = flag || optionset.has(optionspec2); -@@ -95,6 +_,13 @@ ++ if (!optionset.has(optionspec) && optionset.hasOptions() && loader.hasArgs(optionset)) { + Path path = Paths.get(optionspec5.value(optionset)); + boolean flag = optionset.has(optionspec4); + boolean flag1 = flag || optionset.has(optionspec1); + boolean flag2 = flag || optionset.has(optionspec2); boolean flag3 = flag || optionset.has(optionspec3); - boolean flag4 = flag || optionset.has(optionspec4); - boolean flag5 = flag || optionset.has(optionspec5); -+ Collection inputs = optionset.valuesOf(optionspec8).stream().map(Paths::get).collect(Collectors.toList()); -+ Collection existingPacks = optionset.valuesOf(existing).stream().map(Paths::get).collect(Collectors.toList()); -+ java.util.Set existingMods = new java.util.HashSet<>(optionset.valuesOf(existingMod)); -+ java.util.Set mods = new java.util.HashSet<>(optionset.valuesOf(mod)); -+ boolean isFlat = mods.isEmpty() || optionset.has(flat); -+ net.minecraftforge.data.loading.DatagenModLoader.begin(mods, path, inputs, existingPacks, existingMods, flag2, flag1, flag3, flag4, flag5, isFlat, optionset.valueOf(assetIndex), optionset.valueOf(assetsDir)); -+ if (mods.contains("minecraft") || mods.isEmpty()) { - DataGenerator datagenerator = createStandardGenerator( - path, - optionset.valuesOf(optionspec8).stream().map(p_129659_ -> Paths.get(p_129659_)).collect(Collectors.toList()), -@@ -107,6 +_,7 @@ - true - ); + Collection collection = optionset.valuesOf(optionspec6).stream().map(p_129659_ -> Paths.get(p_129659_)).toList(); ++ if (!loader.run(optionset, path, collection, flag1, flag, flag2, flag3, false)) ++ return; + DataGenerator datagenerator = new DataGenerator(path, SharedConstants.getCurrentVersion(), true); + addServerProviders(datagenerator, collection, flag1, flag2, flag3); datagenerator.run(); -+ } - } else { - optionparser.printHelpOn(System.out); - } diff --git a/patches/minecraft/net/minecraft/data/loot/BlockLootSubProvider.java.patch b/patches/minecraft/net/minecraft/data/loot/BlockLootSubProvider.java.patch index f339433da3..a097b1ef43 100644 --- a/patches/minecraft/net/minecraft/data/loot/BlockLootSubProvider.java.patch +++ b/patches/minecraft/net/minecraft/data/loot/BlockLootSubProvider.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/data/loot/BlockLootSubProvider.java +++ b/net/minecraft/data/loot/BlockLootSubProvider.java -@@ -668,12 +_,16 @@ +@@ -690,12 +_,16 @@ protected abstract void generate(); diff --git a/patches/minecraft/net/minecraft/resources/HolderSetCodec.java.patch b/patches/minecraft/net/minecraft/resources/HolderSetCodec.java.patch index aa7b8bb364..b54b7873b5 100644 --- a/patches/minecraft/net/minecraft/resources/HolderSetCodec.java.patch +++ b/patches/minecraft/net/minecraft/resources/HolderSetCodec.java.patch @@ -9,7 +9,7 @@ private static Codec>> homogenousList(Codec> p_206668_, boolean p_206669_) { Codec>> codec = p_206668_.listOf().validate(ExtraCodecs.ensureHomogenous(Holder::kind)); -@@ -42,6 +_,10 @@ +@@ -36,6 +_,10 @@ this.elementCodec = p_206661_; this.homogenousListCodec = homogenousList(p_206661_, p_206662_); this.registryAwareCodec = Codec.either(TagKey.hashedCodec(p_206660_), this.homogenousListCodec); @@ -20,7 +20,7 @@ } @Override -@@ -50,14 +_,17 @@ +@@ -44,14 +_,17 @@ Optional> optional = registryops.getter(this.registryKey); if (optional.isPresent()) { HolderGetter holdergetter = optional.get(); @@ -39,7 +39,7 @@ ); return dataresult.map(p_326149_ -> Pair.of((HolderSet)p_326149_, (T)p_326147_.getSecond())); } -@@ -90,7 +_,7 @@ +@@ -84,7 +_,7 @@ } private DataResult, T>> decodeWithoutRegistry(DynamicOps p_206671_, T p_206672_) { @@ -48,7 +48,7 @@ List> list = new ArrayList<>(); for (Holder holder : p_206666_.getFirst()) { -@@ -106,6 +_,9 @@ +@@ -100,6 +_,9 @@ } private DataResult encodeWithoutRegistry(HolderSet p_206690_, DynamicOps p_206691_, T p_206692_) { diff --git a/patches/minecraft/net/minecraft/resources/RegistryDataLoader.java.patch b/patches/minecraft/net/minecraft/resources/RegistryDataLoader.java.patch index 197e01f037..5d949e97fd 100644 --- a/patches/minecraft/net/minecraft/resources/RegistryDataLoader.java.patch +++ b/patches/minecraft/net/minecraft/resources/RegistryDataLoader.java.patch @@ -63,15 +63,15 @@ E e = dataresult.getOrThrow(); p_330991_.register(p_332850_, e, p_332222_); } -@@ -267,6 +_,7 @@ - String s = Registries.elementsDirPath(p_331358_.key()); - FileToIdConverter filetoidconverter = FileToIdConverter.json(s); +@@ -266,6 +_,7 @@ + ) { + FileToIdConverter filetoidconverter = FileToIdConverter.registry(p_331358_.key()); RegistryOps registryops = RegistryOps.create(JsonOps.INSTANCE, p_333035_); + Decoder> conditional = net.minecraftforge.common.crafting.conditions.ConditionCodec.wrap(p_329404_); for (Entry entry : filetoidconverter.listMatchingResources(p_335634_).entrySet()) { ResourceLocation resourcelocation = entry.getKey(); -@@ -275,7 +_,7 @@ +@@ -274,7 +_,7 @@ RegistrationInfo registrationinfo = REGISTRATION_INFO_CACHE.apply(resource.knownPackInfo()); try { @@ -80,18 +80,17 @@ } catch (Exception exception) { p_335074_.put( resourcekey, -@@ -298,7 +_,9 @@ +@@ -297,7 +_,8 @@ RegistryDataLoader.NetworkedRegistryData registrydataloader$networkedregistrydata = p_331925_.get(p_332518_.key()); if (registrydataloader$networkedregistrydata != null) { RegistryOps registryops = RegistryOps.create(NbtOps.INSTANCE, p_329253_); - RegistryOps registryops1 = RegistryOps.create(JsonOps.INSTANCE, p_329253_); -+ RegistryOps registryops1 = RegistryOps.create(JsonOps.INSTANCE, p_329253_) -+ .withContext(net.minecraftforge.common.crafting.conditions.ICondition.IContext.KEY, net.minecraftforge.common.crafting.conditions.ICondition.IContext.TAGS_INVALID); ++ RegistryOps registryops1 = net.minecraftforge.common.crafting.conditions.ICondition.IContext.TAGS_INVALID.wrap(RegistryOps.create(JsonOps.INSTANCE, p_329253_)); + Decoder> conditional = net.minecraftforge.common.crafting.conditions.ConditionCodec.wrap(p_328898_); - String s = Registries.elementsDirPath(p_332518_.key()); - FileToIdConverter filetoidconverter = FileToIdConverter.json(s); + FileToIdConverter filetoidconverter = FileToIdConverter.registry(p_332518_.key()); -@@ -321,7 +_,7 @@ + for (RegistrySynchronization.PackedRegistryEntry registrysynchronization$packedregistryentry : registrydataloader$networkedregistrydata.elements) { +@@ -319,7 +_,7 @@ try { Resource resource = p_332010_.getResourceOrThrow(resourcelocation); diff --git a/patches/minecraft/net/minecraft/server/Bootstrap.java.patch b/patches/minecraft/net/minecraft/server/Bootstrap.java.patch index cff7b40ec6..5c593f41e2 100644 --- a/patches/minecraft/net/minecraft/server/Bootstrap.java.patch +++ b/patches/minecraft/net/minecraft/server/Bootstrap.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/Bootstrap.java +++ b/net/minecraft/server/Bootstrap.java -@@ -53,6 +_,8 @@ +@@ -57,6 +_,8 @@ CauldronInteraction.bootStrap(); BuiltInRegistries.bootStrap(); CreativeModeTabs.validate(); @@ -9,7 +9,7 @@ wrapStreams(); bootstrapDuration.set(Duration.between(instant, Instant.now()).toMillis()); } -@@ -119,7 +_,6 @@ +@@ -123,7 +_,6 @@ Commands.validate(); } diff --git a/patches/minecraft/net/minecraft/server/Main.java.patch b/patches/minecraft/net/minecraft/server/Main.java.patch index aa3287d912..1edc690417 100644 --- a/patches/minecraft/net/minecraft/server/Main.java.patch +++ b/patches/minecraft/net/minecraft/server/Main.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/Main.java +++ b/net/minecraft/server/Main.java -@@ -83,6 +_,17 @@ +@@ -87,6 +_,17 @@ OptionSpec optionspec13 = optionparser.accepts("jfrProfile"); OptionSpec optionspec14 = optionparser.accepts("pidFile").withRequiredArg().withValuesConvertedBy(new PathConverter()); OptionSpec optionspec15 = optionparser.nonOptions(); @@ -18,7 +18,7 @@ try { OptionSet optionset = optionparser.parse(p_129699_); -@@ -91,6 +_,14 @@ +@@ -95,6 +_,14 @@ return; } @@ -33,7 +33,7 @@ Path path = optionset.valueOf(optionspec14); if (path != null) { writePidFile(path); -@@ -105,24 +_,29 @@ +@@ -109,24 +_,29 @@ Bootstrap.validate(); Util.startTimerHackThread(); Path path1 = Paths.get("server.properties"); @@ -70,7 +70,7 @@ LevelStorageSource levelstoragesource = LevelStorageSource.createDefault(file1.toPath()); LevelStorageSource.LevelStorageAccess levelstoragesource$levelstorageaccess = levelstoragesource.validateAndCreateAccess(s); Dynamic dynamic; -@@ -173,6 +_,10 @@ +@@ -177,6 +_,10 @@ PackRepository packrepository = ServerPacksSource.createPackRepository(levelstoragesource$levelstorageaccess); @@ -81,7 +81,7 @@ WorldStem worldstem; try { WorldLoader.InitConfig worldloader$initconfig = loadOrCreateConfig(dedicatedserversettings.getProperties(), dynamic1, flag, packrepository); -@@ -214,6 +_,16 @@ +@@ -218,6 +_,16 @@ worlddimensions = dedicatedserverproperties.createDimensions(p_358511_.datapackWorldgen()); } @@ -98,7 +98,7 @@ WorldDimensions.Complete worlddimensions$complete = worlddimensions.bake(registry); Lifecycle lifecycle = worlddimensions$complete.lifecycle().add(p_358511_.datapackWorldgen().allRegistriesLifecycle()); return new WorldLoader.DataLoadOutput<>( -@@ -244,9 +_,16 @@ +@@ -248,9 +_,16 @@ WorldData worlddata = worldstem.worldData(); levelstoragesource$levelstorageaccess.saveDataTag(registryaccess$frozen, worlddata); @@ -117,7 +117,7 @@ p_296433_, levelstoragesource$levelstorageaccess, packrepository, -@@ -256,12 +_,13 @@ +@@ -260,12 +_,13 @@ services, LoggerChunkProgressListener::createFromGameruleRadius ); @@ -133,7 +133,7 @@ } return dedicatedserver1; -@@ -270,7 +_,10 @@ +@@ -274,7 +_,10 @@ Thread thread = new Thread("Server Shutdown Thread") { @Override public void run() { diff --git a/patches/minecraft/net/minecraft/server/ServerAdvancementManager.java.patch b/patches/minecraft/net/minecraft/server/ServerAdvancementManager.java.patch index fc1d5acac1..8bd51b0f51 100644 --- a/patches/minecraft/net/minecraft/server/ServerAdvancementManager.java.patch +++ b/patches/minecraft/net/minecraft/server/ServerAdvancementManager.java.patch @@ -1,21 +1,15 @@ --- a/net/minecraft/server/ServerAdvancementManager.java +++ b/net/minecraft/server/ServerAdvancementManager.java -@@ -26,8 +_,17 @@ +@@ -26,7 +_,12 @@ private AdvancementTree tree = new AdvancementTree(); private final HolderLookup.Provider registries; + /** @deprecated Forge: use {@linkplain ServerAdvancementManager#ServerAdvancementManager(net.minecraftforge.common.crafting.conditions.ICondition.IContext) constructor with context}. */ public ServerAdvancementManager(HolderLookup.Provider p_336198_) { -- super(p_336198_, Advancement.CODEC, Registries.elementsDirPath(Registries.ADVANCEMENT)); + this(p_336198_, net.minecraftforge.common.crafting.conditions.ICondition.IContext.EMPTY); + } + + public ServerAdvancementManager(HolderLookup.Provider p_336198_, net.minecraftforge.common.crafting.conditions.ICondition.IContext context) { -+ super( -+ p_336198_.createSerializationContext(com.mojang.serialization.JsonOps.INSTANCE) -+ .>withContext( -+ net.minecraftforge.common.crafting.conditions.ICondition.IContext.KEY, context -+ ), Advancement.CODEC, Registries.elementsDirPath(Registries.ADVANCEMENT)); + super(p_336198_, Advancement.CODEC, Registries.ADVANCEMENT); this.registries = p_336198_; } - diff --git a/patches/minecraft/net/minecraft/server/level/ServerEntity.java.patch b/patches/minecraft/net/minecraft/server/level/ServerEntity.java.patch index 630433297c..2f8f49c877 100644 --- a/patches/minecraft/net/minecraft/server/level/ServerEntity.java.patch +++ b/patches/minecraft/net/minecraft/server/level/ServerEntity.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/level/ServerEntity.java +++ b/net/minecraft/server/level/ServerEntity.java -@@ -278,6 +_,7 @@ +@@ -277,6 +_,7 @@ public void removePairing(ServerPlayer p_8535_) { this.entity.stopSeenByPlayer(p_8535_); p_8535_.connection.send(new ClientboundRemoveEntitiesPacket(this.entity.getId())); @@ -8,7 +8,7 @@ } public void addPairing(ServerPlayer p_8542_) { -@@ -285,6 +_,7 @@ +@@ -284,6 +_,7 @@ this.sendPairingData(p_8542_, list::add); p_8542_.connection.send(new ClientboundBundlePacket(list)); this.entity.startSeenByPlayer(p_8542_); diff --git a/patches/minecraft/net/minecraft/server/level/ServerLevel.java.patch b/patches/minecraft/net/minecraft/server/level/ServerLevel.java.patch index f7b1e1decd..feea14cc4c 100644 --- a/patches/minecraft/net/minecraft/server/level/ServerLevel.java.patch +++ b/patches/minecraft/net/minecraft/server/level/ServerLevel.java.patch @@ -1,11 +1,10 @@ --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -202,11 +_,12 @@ - private final List customSpawners; +@@ -204,10 +_,12 @@ @Nullable private EndDragonFight dragonFight; -- final Int2ObjectMap dragonParts = new Int2ObjectOpenHashMap<>(); -+ final Int2ObjectMap> dragonParts = new Int2ObjectOpenHashMap<>(); + final Int2ObjectMap dragonParts = new Int2ObjectOpenHashMap<>(); ++ final Int2ObjectMap> partEntities = new Int2ObjectOpenHashMap<>(); private final StructureManager structureManager; private final StructureCheck structureCheck; private final boolean tickTime; @@ -14,7 +13,7 @@ public ServerLevel( MinecraftServer p_214999_, -@@ -289,6 +_,12 @@ +@@ -290,6 +_,12 @@ this.sleepStatus = new SleepStatus(); this.gameEventDispatcher = new GameEventDispatcher(this); this.randomSequences = Objects.requireNonNullElseGet(p_288977_, () -> this.getDataStorage().computeIfAbsent(RandomSequences.factory(i), "random_sequences")); @@ -27,7 +26,7 @@ } @Deprecated -@@ -330,8 +_,8 @@ +@@ -331,8 +_,8 @@ int i = this.getGameRules().getInt(GameRules.RULE_PLAYERS_SLEEPING_PERCENTAGE); if (this.sleepStatus.areEnoughSleeping(i) && this.sleepStatus.areEnoughDeepSleeping(i, this.players)) { if (this.getGameRules().getBoolean(GameRules.RULE_DAYLIGHT)) { @@ -38,7 +37,7 @@ } this.wakeUpAllPlayers(); -@@ -369,7 +_,8 @@ +@@ -370,7 +_,8 @@ this.handlingTick = false; profilerfiller.pop(); @@ -48,7 +47,7 @@ if (flag1) { this.resetEmptyTime(); } -@@ -398,6 +_,7 @@ +@@ -399,6 +_,7 @@ p_358707_.stopRiding(); } @@ -56,7 +55,7 @@ profilerfiller.push("tick"); this.guardEntityTick(this::tickNonPassenger, p_358707_); profilerfiller.pop(); -@@ -525,6 +_,7 @@ +@@ -526,6 +_,7 @@ BlockPos blockpos = this.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, p_300602_); BlockPos blockpos1 = blockpos.below(); Biome biome = this.getBiome(blockpos).value(); @@ -64,7 +63,7 @@ if (biome.shouldFreeze(this, blockpos1)) { this.setBlockAndUpdate(blockpos1, Blocks.ICE.defaultBlockState()); } -@@ -700,8 +_,8 @@ +@@ -701,8 +_,8 @@ this.server.getPlayerList().broadcastAll(new ClientboundGameEventPacket(ClientboundGameEventPacket.START_RAINING, 0.0F)); } @@ -75,7 +74,7 @@ } } -@@ -738,6 +_,7 @@ +@@ -739,6 +_,7 @@ p_8648_.tickCount++; profilerfiller.push(() -> BuiltInRegistries.ENTITY_TYPE.getKey(p_8648_.getType()).toString()); profilerfiller.incrementCounter("tickNonPassenger"); @@ -83,7 +82,7 @@ p_8648_.tick(); profilerfiller.pop(); -@@ -755,6 +_,7 @@ +@@ -756,6 +_,7 @@ ProfilerFiller profilerfiller = Profiler.get(); profilerfiller.push(() -> BuiltInRegistries.ENTITY_TYPE.getKey(p_8664_.getType()).toString()); profilerfiller.incrementCounter("tickPassenger"); @@ -91,7 +90,7 @@ p_8664_.rideTick(); profilerfiller.pop(); -@@ -787,6 +_,7 @@ +@@ -788,6 +_,7 @@ } else { this.entityManager.autoSave(); } @@ -99,7 +98,7 @@ } } -@@ -881,6 +_,7 @@ +@@ -882,6 +_,7 @@ } private void addPlayer(ServerPlayer p_8854_) { @@ -107,7 +106,7 @@ Entity entity = this.getEntities().get(p_8854_.getUUID()); if (entity != null) { LOGGER.warn("Force-added player with duplicate UUID {}", p_8854_.getUUID()); -@@ -888,7 +_,8 @@ +@@ -889,7 +_,8 @@ this.removePlayerImmediately((ServerPlayer)entity, Entity.RemovalReason.DISCARDED); } @@ -117,7 +116,7 @@ } private boolean addEntity(Entity p_8873_) { -@@ -896,7 +_,12 @@ +@@ -897,7 +_,12 @@ LOGGER.warn("Tried to add entity {} but it was marked as removed already", EntityType.getKey(p_8873_.getType())); return false; } else { @@ -131,7 +130,7 @@ } } -@@ -944,6 +_,12 @@ +@@ -945,6 +_,12 @@ float p_263390_, long p_263403_ ) { @@ -144,7 +143,7 @@ this.server .getPlayerList() .broadcast( -@@ -961,6 +_,12 @@ +@@ -962,6 +_,12 @@ public void playSeededSound( @Nullable Player p_263545_, Entity p_263544_, Holder p_263491_, SoundSource p_263542_, float p_263530_, float p_263520_, long p_263490_ ) { @@ -157,7 +156,7 @@ this.server .getPlayerList() .broadcast( -@@ -1019,6 +_,7 @@ +@@ -1020,6 +_,7 @@ @Override public void gameEvent(Holder p_334475_, Vec3 p_215042_, GameEvent.Context p_215043_) { @@ -165,7 +164,7 @@ this.gameEventDispatcher.post(p_334475_, p_215042_, p_215043_); } -@@ -1057,16 +_,24 @@ +@@ -1058,16 +_,24 @@ @Override public void updateNeighborsAt(BlockPos p_215045_, Block p_215046_) { @@ -190,7 +189,7 @@ this.neighborUpdater.updateNeighborsAtExceptFromFacing(p_215052_, p_215053_, p_215054_, p_370072_); } -@@ -1112,12 +_,14 @@ +@@ -1113,12 +_,14 @@ Explosion.BlockInteraction explosion$blockinteraction = switch (p_255827_) { case NONE -> Explosion.BlockInteraction.KEEP; case BLOCK -> this.getDestroyType(GameRules.RULE_BLOCK_EXPLOSION_DROP_DECAY); @@ -206,41 +205,41 @@ serverexplosion.explode(); ParticleOptions particleoptions = serverexplosion.isSmall() ? p_310962_ : p_310322_; -@@ -1691,6 +_,11 @@ +@@ -1714,6 +_,11 @@ return this.chunkSource.getGenerator().getSeaLevel(); } + @Override + public java.util.Collection> getPartEntities() { -+ return this.dragonParts.values(); ++ return this.partEntities.values(); + } + final class EntityCallbacks implements LevelCallback { public void onCreated(Entity p_143355_) { } -@@ -1725,8 +_,8 @@ - ServerLevel.this.navigatingMobs.add(mob); +@@ -1754,6 +_,12 @@ + } } -- if (p_143371_ instanceof EnderDragon enderdragon) { -- for (EnderDragonPart enderdragonpart : enderdragon.getSubEntities()) { + if (p_143371_.isMultipartEntity()) { -+ for (var enderdragonpart : p_143371_.getParts()) { - ServerLevel.this.dragonParts.put(enderdragonpart.getId(), enderdragonpart); ++ for (var part : p_143371_.getParts()) { ++ ServerLevel.this.partEntities.put(part.getId(), part); ++ } ++ } ++ + p_143371_.updateDynamicGameEventListener(DynamicGameEventListener::add); + } + +@@ -1781,7 +_,16 @@ } } -@@ -1752,13 +_,16 @@ - ServerLevel.this.navigatingMobs.remove(mob); - } -- if (p_143375_ instanceof EnderDragon enderdragon) { -- for (EnderDragonPart enderdragonpart : enderdragon.getSubEntities()) { + if (p_143375_.isMultipartEntity()) { -+ for (var enderdragonpart : p_143375_.getParts()) { - ServerLevel.this.dragonParts.remove(enderdragonpart.getId()); - } - } - ++ for (var part : p_143375_.getParts()) { ++ ServerLevel.this.partEntities.remove(part.getId()); ++ } ++ } ++ p_143375_.updateDynamicGameEventListener(DynamicGameEventListener::remove); + + p_143375_.onRemovedFromWorld(); diff --git a/patches/minecraft/net/minecraft/server/level/ServerPlayer.java.patch b/patches/minecraft/net/minecraft/server/level/ServerPlayer.java.patch index 74dc4ea541..a963c2e152 100644 --- a/patches/minecraft/net/minecraft/server/level/ServerPlayer.java.patch +++ b/patches/minecraft/net/minecraft/server/level/ServerPlayer.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -181,7 +_,8 @@ +@@ -180,7 +_,8 @@ import net.minecraft.world.scores.criteria.ObjectiveCriteria; import org.slf4j.Logger; @@ -10,7 +10,7 @@ private static final Logger LOGGER = LogUtils.getLogger(); private static final int NEUTRAL_MOB_DEATH_NOTIFICATION_RADII_XZ = 32; private static final int NEUTRAL_MOB_DEATH_NOTIFICATION_RADII_Y = 10; -@@ -846,6 +_,7 @@ +@@ -844,6 +_,7 @@ @Override public void die(DamageSource p_9035_) { @@ -18,7 +18,7 @@ this.gameEvent(GameEvent.ENTITY_DIE); boolean flag = this.serverLevel().getGameRules().getBoolean(GameRules.RULE_SHOWDEATHMESSAGES); if (flag) { -@@ -1041,6 +_,7 @@ +@@ -1034,6 +_,7 @@ @Nullable public ServerPlayer teleport(TeleportTransition p_361322_) { @@ -26,7 +26,7 @@ if (this.isRemoved()) { return null; } else { -@@ -1068,7 +_,7 @@ +@@ -1061,7 +_,7 @@ PlayerList playerlist = this.server.getPlayerList(); playerlist.sendPlayerPermissionLevel(this); serverlevel1.removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION); @@ -35,7 +35,7 @@ ProfilerFiller profilerfiller = Profiler.get(); profilerfiller.push("moving"); if (resourcekey == Level.OVERWORLD && serverlevel.dimension() == Level.NETHER) { -@@ -1092,6 +_,7 @@ +@@ -1085,6 +_,7 @@ this.lastSentExp = -1; this.lastSentHealth = -1.0F; this.lastSentFood = -1; @@ -43,7 +43,7 @@ return this; } } -@@ -1132,6 +_,9 @@ +@@ -1125,6 +_,9 @@ @Override public Either startSleepInBed(BlockPos p_9115_) { @@ -53,7 +53,7 @@ Direction direction = this.level().getBlockState(p_9115_).getValue(HorizontalDirectionalBlock.FACING); if (this.isSleeping() || !this.isAlive()) { return Either.left(Player.BedSleepingProblem.OTHER_PROBLEM); -@@ -1143,7 +_,7 @@ +@@ -1136,7 +_,7 @@ return Either.left(Player.BedSleepingProblem.OBSTRUCTED); } else { this.setRespawnPosition(this.level().dimension(), p_9115_, this.getYRot(), false, true); @@ -62,7 +62,7 @@ return Either.left(Player.BedSleepingProblem.NOT_POSSIBLE_NOW); } else { if (!this.isCreative()) { -@@ -1189,6 +_,7 @@ +@@ -1182,6 +_,7 @@ } private boolean bedInRange(BlockPos p_9117_, Direction p_9118_) { @@ -70,7 +70,7 @@ return this.isReachableBedBlock(p_9117_) || this.isReachableBedBlock(p_9117_.relative(p_9118_.getOpposite())); } -@@ -1303,6 +_,7 @@ +@@ -1286,6 +_,7 @@ this.connection.send(new ClientboundOpenScreenPacket(abstractcontainermenu.containerId, abstractcontainermenu.getType(), p_9033_.getDisplayName())); this.initMenu(abstractcontainermenu); this.containerMenu = abstractcontainermenu; @@ -78,7 +78,7 @@ return OptionalInt.of(this.containerCounter); } } -@@ -1352,6 +_,7 @@ +@@ -1335,6 +_,7 @@ public void doCloseContainer() { this.containerMenu.removed(this); this.inventoryMenu.transferState(this.containerMenu); @@ -86,7 +86,7 @@ this.containerMenu = this.inventoryMenu; } -@@ -1575,6 +_,15 @@ +@@ -1558,6 +_,15 @@ this.setShoulderEntityLeft(p_9016_.getShoulderEntityLeft()); this.setShoulderEntityRight(p_9016_.getShoulderEntityRight()); this.setLastDeathLocation(p_9016_.getLastDeathLocation()); @@ -102,7 +102,7 @@ } @Override -@@ -1676,6 +_,7 @@ +@@ -1657,6 +_,7 @@ public boolean setGameMode(GameType p_143404_) { boolean flag = this.isSpectator(); @@ -110,7 +110,7 @@ if (!this.gameMode.changeGameModeForPlayer(p_143404_)) { return false; } else { -@@ -1840,6 +_,9 @@ +@@ -1821,6 +_,9 @@ public void setCamera(@Nullable Entity p_9214_) { Entity entity = this.getCamera(); this.camera = (Entity)(p_9214_ == null ? this : p_9214_); @@ -120,7 +120,7 @@ if (entity != this.camera) { if (this.camera.level() instanceof ServerLevel serverlevel) { this.teleportTo( -@@ -1878,7 +_,11 @@ +@@ -1859,7 +_,11 @@ @Nullable public Component getTabListDisplayName() { @@ -133,7 +133,7 @@ } public int getTabListOrder() { -@@ -1925,6 +_,9 @@ +@@ -1906,6 +_,9 @@ } public void setRespawnPosition(ResourceKey p_9159_, @Nullable BlockPos p_9160_, float p_9161_, boolean p_9162_, boolean p_9163_) { @@ -143,7 +143,7 @@ if (p_9160_ != null) { boolean flag = p_9160_.equals(this.respawnPosition) && p_9159_.equals(this.respawnDimension); if (p_9163_ && !flag) { -@@ -1982,6 +_,9 @@ +@@ -1963,6 +_,9 @@ if (itementity == null) { return null; } else { @@ -153,7 +153,7 @@ this.level().addFreshEntity(itementity); ItemStack itemstack = itementity.getItem(); if (p_9087_) { -@@ -2088,9 +_,12 @@ +@@ -2069,9 +_,12 @@ public boolean drop(boolean p_182295_) { Inventory inventory = this.getInventory(); @@ -167,7 +167,7 @@ } @Override -@@ -2189,6 +_,75 @@ +@@ -2170,6 +_,75 @@ @Nullable public BlockPos getRaidOmenPosition() { return this.raidOmenPosition; diff --git a/patches/minecraft/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch b/patches/minecraft/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch index f3a9390aac..2d3e75da8f 100644 --- a/patches/minecraft/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch +++ b/patches/minecraft/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch @@ -1,20 +1,20 @@ --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -1021,9 +_,10 @@ - switch (serverboundplayeractionpacket$action) { - case SWAP_ITEM_WITH_OFFHAND: - if (!this.player.isSpectator()) { -- ItemStack itemstack = this.player.getItemInHand(InteractionHand.OFF_HAND); -- this.player.setItemInHand(InteractionHand.OFF_HAND, this.player.getItemInHand(InteractionHand.MAIN_HAND)); -- this.player.setItemInHand(InteractionHand.MAIN_HAND, itemstack); -+ var event = net.minecraftforge.event.ForgeEventFactory.onLivingSwapHandItems(this.player); -+ if (event.isCanceled()) return; -+ this.player.setItemInHand(InteractionHand.OFF_HAND, event.getItemSwappedToOffHand()); -+ this.player.setItemInHand(InteractionHand.MAIN_HAND, event.getItemSwappedToMainHand()); - this.player.stopUsingItem(); - } +@@ -1081,9 +_,10 @@ + switch (serverboundplayeractionpacket$action) { + case SWAP_ITEM_WITH_OFFHAND: + if (!this.player.isSpectator()) { +- ItemStack itemstack = this.player.getItemInHand(InteractionHand.OFF_HAND); +- this.player.setItemInHand(InteractionHand.OFF_HAND, this.player.getItemInHand(InteractionHand.MAIN_HAND)); +- this.player.setItemInHand(InteractionHand.MAIN_HAND, itemstack); ++ var event = net.minecraftforge.event.ForgeEventFactory.onLivingSwapHandItems(this.player); ++ if (event.isCanceled()) return; ++ this.player.setItemInHand(InteractionHand.OFF_HAND, event.getItemSwappedToOffHand()); ++ this.player.setItemInHand(InteractionHand.MAIN_HAND, event.getItemSwappedToMainHand()); + this.player.stopUsingItem(); + } -@@ -1214,8 +_,9 @@ +@@ -1281,8 +_,9 @@ } CompletableFuture completablefuture = this.filterTextPacket(playerchatmessage.signedContent()); @@ -25,16 +25,16 @@ PlayerChatMessage playerchatmessage1 = playerchatmessage.withUnsignedContent(component).filter(p_296589_.mask()); this.broadcastChatMessage(playerchatmessage1); }); -@@ -1537,7 +_,7 @@ +@@ -1607,7 +_,7 @@ - @Override - public void onInteraction(InteractionHand p_143682_, Vec3 p_143683_) { -- this.performInteraction(p_143682_, (p_143686_, p_143687_, p_143688_) -> p_143687_.interactAt(p_143686_, p_143683_, p_143688_)); -+ this.performInteraction(p_143682_, (p_143686_, p_143687_, p_143688_) -> net.minecraftforge.common.ForgeHooks.onInteractEntityAt(p_143687_, p_143686_, p_143683_, p_143688_)); - } + @Override + public void onInteraction(InteractionHand p_143682_, Vec3 p_143683_) { +- this.performInteraction(p_143682_, (p_143686_, p_143687_, p_143688_) -> p_143687_.interactAt(p_143686_, p_143683_, p_143688_)); ++ this.performInteraction(p_143682_, (p_143686_, p_143687_, p_143688_) -> net.minecraftforge.common.ForgeHooks.onInteractEntityAt(p_143687_, p_143686_, p_143683_, p_143688_)); + } - @Override -@@ -1847,6 +_,7 @@ + @Override +@@ -1912,6 +_,7 @@ @Override public void handleCustomPayload(ServerboundCustomPayloadPacket p_329963_) { diff --git a/patches/minecraft/net/minecraft/server/packs/AbstractPackResources.java.patch b/patches/minecraft/net/minecraft/server/packs/AbstractPackResources.java.patch index 17594c2b7c..06fe719f00 100644 --- a/patches/minecraft/net/minecraft/server/packs/AbstractPackResources.java.patch +++ b/patches/minecraft/net/minecraft/server/packs/AbstractPackResources.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/packs/AbstractPackResources.java +++ b/net/minecraft/server/packs/AbstractPackResources.java -@@ -63,4 +_,9 @@ +@@ -62,4 +_,9 @@ public PackLocationInfo location() { return this.location; } diff --git a/patches/minecraft/net/minecraft/server/packs/resources/SimpleJsonResourceReloadListener.java.patch b/patches/minecraft/net/minecraft/server/packs/resources/SimpleJsonResourceReloadListener.java.patch index 09324c7782..9f6167e70f 100644 --- a/patches/minecraft/net/minecraft/server/packs/resources/SimpleJsonResourceReloadListener.java.patch +++ b/patches/minecraft/net/minecraft/server/packs/resources/SimpleJsonResourceReloadListener.java.patch @@ -1,29 +1,30 @@ --- a/net/minecraft/server/packs/resources/SimpleJsonResourceReloadListener.java +++ b/net/minecraft/server/packs/resources/SimpleJsonResourceReloadListener.java -@@ -55,7 +_,15 @@ - ResourceLocation resourcelocation1 = filetoidconverter.fileToId(resourcelocation); +@@ -31,6 +_,10 @@ + this(p_378826_.createSerializationContext(JsonOps.INSTANCE), p_361980_, FileToIdConverter.registry(p_376437_)); + } + ++ protected SimpleJsonResourceReloadListener(HolderLookup.Provider p_378826_, Codec p_361980_, ResourceKey> p_376437_, net.minecraftforge.common.crafting.conditions.ICondition.IContext context) { ++ this(context.wrap(p_378826_.createSerializationContext(JsonOps.INSTANCE)), p_361980_, FileToIdConverter.registry(p_376437_)); ++ } ++ + protected SimpleJsonResourceReloadListener(Codec p_370137_, FileToIdConverter p_375758_) { + this(JsonOps.INSTANCE, p_370137_, p_375758_); + } +@@ -65,7 +_,15 @@ + ResourceLocation resourcelocation1 = p_377980_.fileToId(resourcelocation); try (Reader reader = entry.getValue().openAsReader()) { -- p_368755_.parse(p_369854_, JsonParser.parseReader(reader)).ifSuccess(p_370131_ -> { +- p_376362_.parse(p_378080_, JsonParser.parseReader(reader)).ifSuccess(p_370131_ -> { + var json = JsonParser.parseReader(reader); -+ json = net.minecraftforge.common.ForgeHooks.readConditional(p_369854_, json); ++ json = net.minecraftforge.common.ForgeHooks.readConditional(p_378080_, json); + if (json == null) { + LOGGER.debug("Skipping loading {} as its conditions were not met", resourcelocation); + continue; + } -+ p_368755_.parse(p_369854_, json).ifSuccess(p_370131_ -> { -+ p_370131_ = net.minecraftforge.common.ForgeHooks.onJsonDataParsed(p_368755_, resourcelocation1, p_370131_); ++ p_376362_.parse(p_378080_, json).ifSuccess(p_370131_ -> { ++ p_370131_ = net.minecraftforge.common.ForgeHooks.onJsonDataParsed(p_376362_, resourcelocation1, p_370131_); + if (p_370131_ == null) return; - if (p_279404_.putIfAbsent(resourcelocation1, (T)p_370131_) != null) { + if (p_377922_.putIfAbsent(resourcelocation1, (T)p_370131_) != null) { throw new IllegalStateException("Duplicate data file ignored with ID " + resourcelocation1); } -@@ -64,5 +_,9 @@ - LOGGER.error("Couldn't parse data file '{}' from '{}'", resourcelocation1, resourcelocation, jsonparseexception); - } - } -+ } -+ -+ protected ResourceLocation getPreparedPath(ResourceLocation rl) { -+ return rl.withPath(this.directory + "/" + rl.getPath() + ".json"); - } - } diff --git a/patches/minecraft/net/minecraft/tags/ItemTags.java.patch b/patches/minecraft/net/minecraft/tags/ItemTags.java.patch index 51f93d1c30..472a7d87c1 100644 --- a/patches/minecraft/net/minecraft/tags/ItemTags.java.patch +++ b/patches/minecraft/net/minecraft/tags/ItemTags.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/tags/ItemTags.java +++ b/net/minecraft/tags/ItemTags.java -@@ -183,4 +_,12 @@ +@@ -185,4 +_,12 @@ private static TagKey bind(String p_203855_) { return TagKey.create(Registries.ITEM, ResourceLocation.withDefaultNamespace(p_203855_)); } diff --git a/patches/minecraft/net/minecraft/util/SpawnUtil.java.patch b/patches/minecraft/net/minecraft/util/SpawnUtil.java.patch index 11e50ccc72..ea52bf708c 100644 --- a/patches/minecraft/net/minecraft/util/SpawnUtil.java.patch +++ b/patches/minecraft/net/minecraft/util/SpawnUtil.java.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/util/SpawnUtil.java +++ b/net/minecraft/util/SpawnUtil.java -@@ -35,7 +_,7 @@ - if (p_216406_.getWorldBorder().isWithinBounds(blockpos$mutableblockpos) && moveToPossibleSpawnPosition(p_216406_, p_216410_, blockpos$mutableblockpos, p_216411_)) { +@@ -47,7 +_,7 @@ + )) { T t = (T)p_216404_.create(p_216406_, null, blockpos$mutableblockpos, p_369127_, false, false); if (t != null) { - if (t.checkSpawnRules(p_216406_, p_369127_) && t.checkSpawnObstruction(p_216406_)) { + if (net.minecraftforge.event.ForgeEventFactory.checkSpawnPosition(t, p_216406_, p_369127_)) { p_216406_.addFreshEntityWithPassengers(t); + t.playAmbientSound(); return Optional.of(t); - } diff --git a/patches/minecraft/net/minecraft/world/entity/Entity.java.patch b/patches/minecraft/net/minecraft/world/entity/Entity.java.patch index 6ea927d4d2..45189f1a90 100644 --- a/patches/minecraft/net/minecraft/world/entity/Entity.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/Entity.java.patch @@ -53,7 +53,7 @@ } public void onClientRemoval() { -@@ -476,7 +_,7 @@ +@@ -480,7 +_,7 @@ if (this.isInLava()) { this.lavaHurt(); @@ -62,7 +62,7 @@ } this.checkBelowWorld(); -@@ -767,12 +_,12 @@ +@@ -779,12 +_,12 @@ this.setRemainingFireTicks(-this.getFireImmuneTicks()); } @@ -77,7 +77,7 @@ this.setRemainingFireTicks(-this.getFireImmuneTicks()); } } -@@ -852,9 +_,7 @@ +@@ -864,9 +_,7 @@ return blockpos; } else { BlockState blockstate = this.level().getBlockState(blockpos); @@ -88,7 +88,7 @@ ? blockpos.atY(Mth.floor(this.position.y - (double)p_216987_)) : blockpos; } -@@ -1138,19 +_,19 @@ +@@ -1150,19 +_,19 @@ return !blockstate.is(BlockTags.INSIDE_STEP_SOUND_BLOCKS) && !blockstate.is(BlockTags.COMBINATION_STEP_SOUND_BLOCKS) ? p_278049_ : blockpos; } @@ -114,12 +114,23 @@ this.playSound(soundtype.getStepSound(), soundtype.getVolume() * 0.15F, soundtype.getPitch()); } -@@ -1301,27 +_,33 @@ +@@ -1290,6 +_,10 @@ + return this.wasTouchingWater; + } + ++ public boolean isInWaterOrSwimmable() { ++ return this.isInWater() || isInFluidType((fluidType, height) -> canSwimInFluidType(fluidType)); ++ } ++ + private boolean isInRain() { + BlockPos blockpos = this.blockPosition(); + return this.level().isRainingAt(blockpos) +@@ -1322,27 +_,33 @@ public void updateSwimming() { if (this.isSwimming()) { - this.setSwimming(this.isSprinting() && this.isInWater() && !this.isPassenger()); -+ this.setSwimming(this.isSprinting() && (this.isInWater() || this.isInFluidType((fluidType, height) -> this.canSwimInFluidType(fluidType))) && !this.isPassenger()); ++ this.setSwimming(this.isSprinting() && this.isInWaterOrSwimmable() && !this.isPassenger()); } else { - this.setSwimming(this.isSprinting() && this.isUnderWater() && !this.isPassenger() && this.level().getFluidState(this.blockPosition).is(FluidTags.WATER)); + this.setSwimming(this.isSprinting() && (this.isUnderWater() || this.canStartSwimming()) && !this.isPassenger()); @@ -156,7 +167,7 @@ if (!this.wasTouchingWater && !this.firstTick) { this.doWaterSplashEffect(); } -@@ -1337,6 +_,7 @@ +@@ -1358,6 +_,7 @@ private void updateFluidOnEyes() { this.wasEyeInWater = this.isEyeInFluid(FluidTags.WATER); this.fluidOnEyes.clear(); @@ -164,7 +175,7 @@ double d0 = this.getEyeY(); if (this.getVehicle() instanceof AbstractBoat abstractboat && !abstractboat.isUnderWater() -@@ -1349,7 +_,7 @@ +@@ -1370,7 +_,7 @@ FluidState fluidstate = this.level().getFluidState(blockpos); double d1 = (double)((float)blockpos.getY() + fluidstate.getHeight(this.level(), blockpos)); if (d1 > d0) { @@ -173,7 +184,7 @@ } } -@@ -1403,12 +_,13 @@ +@@ -1424,12 +_,13 @@ } public boolean canSpawnSprintParticle() { @@ -188,7 +199,7 @@ if (blockstate.getRenderShape() != RenderShape.INVISIBLE) { Vec3 vec3 = this.getDeltaMovement(); BlockPos blockpos1 = this.blockPosition(); -@@ -1424,7 +_,7 @@ +@@ -1445,7 +_,7 @@ this.level() .addParticle( @@ -197,7 +208,7 @@ d0, this.getY() + 0.1, d1, -@@ -1435,12 +_,15 @@ +@@ -1456,12 +_,15 @@ } } @@ -214,7 +225,7 @@ } public void moveRelative(float p_19921_, Vec3 p_19922_) { -@@ -1810,6 +_,11 @@ +@@ -1831,6 +_,11 @@ p_20241_.putBoolean("HasVisualFire", this.hasVisualFire); } @@ -226,7 +237,7 @@ if (!this.tags.isEmpty()) { ListTag listtag = new ListTag(); -@@ -1901,6 +_,9 @@ +@@ -1924,6 +_,9 @@ this.setGlowingTag(p_20259_.getBoolean("Glowing")); this.setTicksFrozen(p_20259_.getInt("TicksFrozen")); this.hasVisualFire = p_20259_.getBoolean("HasVisualFire"); @@ -236,7 +247,7 @@ if (p_20259_.contains("Tags", 9)) { this.tags.clear(); ListTag listtag3 = p_20259_.getList("Tags", 8); -@@ -1983,6 +_,8 @@ +@@ -2006,6 +_,8 @@ } else { ItemEntity itementity = new ItemEntity(p_364149_, this.getX(), this.getY() + (double)p_367722_, this.getZ(), p_366908_); itementity.setDefaultPickUpDelay(); @@ -245,7 +256,7 @@ p_364149_.addFreshEntity(itementity); return itementity; } -@@ -2050,6 +_,7 @@ +@@ -2078,6 +_,7 @@ public void rideTick() { this.setDeltaMovement(Vec3.ZERO); @@ -253,7 +264,7 @@ this.tick(); if (this.isPassenger()) { this.getVehicle().positionRider(this); -@@ -2110,6 +_,7 @@ +@@ -2138,6 +_,7 @@ } } @@ -261,7 +272,7 @@ if (p_19967_ || this.canRide(p_19966_) && p_19966_.canAddPassenger(this)) { if (this.isPassenger()) { this.stopRiding(); -@@ -2141,6 +_,7 @@ +@@ -2169,6 +_,7 @@ public void removeVehicle() { if (this.vehicle != null) { Entity entity = this.vehicle; @@ -269,7 +280,7 @@ this.vehicle = null; entity.removePassenger(this); } -@@ -2190,6 +_,8 @@ +@@ -2218,6 +_,8 @@ return this.passengers.isEmpty(); } @@ -278,16 +289,16 @@ protected boolean couldAcceptPassenger() { return true; } -@@ -2378,7 +_,7 @@ +@@ -2406,7 +_,7 @@ } public boolean isVisuallyCrawling() { - return this.isVisuallySwimming() && !this.isInWater(); -+ return this.isVisuallySwimming() && !this.isInWater() && !this.isInFluidType((fluidType, height) -> this.canSwimInFluidType(fluidType)); ++ return this.isVisuallySwimming() && !this.isInWaterOrSwimmable(); } public void setSwimming(boolean p_20283_) { -@@ -2491,7 +_,7 @@ +@@ -2519,7 +_,7 @@ this.igniteForSeconds(8.0F); } @@ -296,7 +307,7 @@ } public void onAboveBubbleCol(boolean p_20313_) { -@@ -2586,7 +_,7 @@ +@@ -2614,7 +_,7 @@ } protected Component getTypeName() { @@ -305,7 +316,7 @@ } public boolean is(Entity p_20356_) { -@@ -2879,6 +_,7 @@ +@@ -2907,6 +_,7 @@ return this.stringUUID; } @@ -313,7 +324,7 @@ public boolean isPushedByFluid() { return true; } -@@ -3283,9 +_,17 @@ +@@ -3307,9 +_,17 @@ return Mth.lerp(p_344421_, this.yRotO, this.yRot); } @@ -332,7 +343,7 @@ } else { AABB aabb = this.getBoundingBox().deflate(0.001); int i = Mth.floor(aabb.minX); -@@ -3300,25 +_,28 @@ +@@ -3324,25 +_,28 @@ Vec3 vec3 = Vec3.ZERO; int k1 = 0; BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos(); @@ -368,7 +379,7 @@ } } } -@@ -3326,27 +_,28 @@ +@@ -3350,27 +_,28 @@ } } @@ -407,7 +418,7 @@ } } -@@ -3359,7 +_,10 @@ +@@ -3383,7 +_,10 @@ return !this.level().hasChunksAt(i, k, j, l); } @@ -418,7 +429,7 @@ return this.fluidHeight.getDouble(p_204037_); } -@@ -3375,7 +_,9 @@ +@@ -3399,7 +_,9 @@ return this.dimensions.height(); } @@ -428,7 +439,7 @@ return new ClientboundAddEntityPacket(this, p_344981_); } -@@ -3496,6 +_,11 @@ +@@ -3520,6 +_,11 @@ this.levelCallback.onMove(); } @@ -440,7 +451,7 @@ } public void checkDespawn() { -@@ -3648,6 +_,100 @@ +@@ -3672,6 +_,100 @@ float f1 = (float)Mth.lerp(d0, (double)this.getXRot(), p_298926_); this.setPos(d1, d2, d3); this.setRot(f, f1); diff --git a/patches/minecraft/net/minecraft/world/entity/EntityType.java.patch b/patches/minecraft/net/minecraft/world/entity/EntityType.java.patch index 83d5cc3081..e9b2151182 100644 --- a/patches/minecraft/net/minecraft/world/entity/EntityType.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/EntityType.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/EntityType.java +++ b/net/minecraft/world/entity/EntityType.java -@@ -893,6 +_,11 @@ +@@ -867,6 +_,11 @@ private final float spawnDimensionsScale; private final FeatureFlagSet requiredFeatures; @@ -12,7 +12,7 @@ private static EntityType register(ResourceKey> p_368406_, EntityType.Builder p_363129_) { return Registry.register(BuiltInRegistries.ENTITY_TYPE, p_368406_, p_363129_.build(p_368406_)); } -@@ -927,7 +_,8 @@ +@@ -901,7 +_,8 @@ int p_273451_, String p_367006_, Optional> p_364691_, @@ -22,7 +22,7 @@ ) { this.factory = p_273268_; this.category = p_272918_; -@@ -943,6 +_,10 @@ +@@ -917,6 +_,10 @@ this.descriptionId = p_367006_; this.lootTable = p_364691_; this.requiredFeatures = p_273518_; @@ -33,7 +33,7 @@ } @Nullable -@@ -1214,14 +_,26 @@ +@@ -1193,14 +_,26 @@ } public int clientTrackingRange() { @@ -60,8 +60,8 @@ return this != PLAYER && this != LLAMA_SPIT && this != WITHER -@@ -1273,6 +_,12 @@ - return (p_358865_, p_358866_) -> new ChestRaft(p_358865_, p_358866_, p_368732_); +@@ -1256,6 +_,12 @@ + return OP_ONLY_CUSTOM_DATA.contains(this); } + public T customClientSpawn(net.minecraftforge.network.packets.SpawnEntity packet, Level world) { @@ -73,7 +73,7 @@ public static class Builder { private final EntityType.EntityFactory factory; private final MobCategory category; -@@ -1291,6 +_,10 @@ +@@ -1274,6 +_,10 @@ ResourceKey.create(Registries.LOOT_TABLE, p_358877_.location().withPrefix("entities/")) ); private DependantName, String> descriptionId = p_358878_ -> Util.makeDescriptionId("entity", p_358878_.location()); @@ -84,7 +84,7 @@ private Builder(EntityType.EntityFactory p_20696_, MobCategory p_20697_) { this.factory = p_20696_; -@@ -1404,6 +_,30 @@ +@@ -1387,6 +_,30 @@ return this; } @@ -115,7 +115,7 @@ public EntityType build(ResourceKey> p_369693_) { if (this.serialize) { Util.fetchChoiceType(References.ENTITY_TREE, p_369693_.location().toString()); -@@ -1423,7 +_,8 @@ +@@ -1406,7 +_,8 @@ this.updateInterval, this.descriptionId.get(p_369693_), this.lootTable.get(p_369693_), diff --git a/patches/minecraft/net/minecraft/world/entity/ExperienceOrb.java.patch b/patches/minecraft/net/minecraft/world/entity/ExperienceOrb.java.patch index 0a1a4bf62f..31a1de102e 100644 --- a/patches/minecraft/net/minecraft/world/entity/ExperienceOrb.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/ExperienceOrb.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/ExperienceOrb.java +++ b/net/minecraft/world/entity/ExperienceOrb.java -@@ -111,7 +_,8 @@ +@@ -112,7 +_,8 @@ this.applyEffectsFromBlocks(); float f = 0.98F; if (this.onGround()) { @@ -10,7 +10,7 @@ } this.setDeltaMovement(this.getDeltaMovement().multiply((double)f, 0.98, (double)f)); -@@ -230,6 +_,7 @@ +@@ -231,6 +_,7 @@ public void playerTouch(Player p_20792_) { if (p_20792_ instanceof ServerPlayer serverplayer) { if (p_20792_.takeXpDelay == 0) { diff --git a/patches/minecraft/net/minecraft/world/entity/LivingEntity.java.patch b/patches/minecraft/net/minecraft/world/entity/LivingEntity.java.patch index 65aed85fc3..70f30e1f2b 100644 --- a/patches/minecraft/net/minecraft/world/entity/LivingEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/LivingEntity.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -137,7 +_,7 @@ +@@ -136,7 +_,7 @@ import net.minecraft.world.scores.Scoreboard; import org.slf4j.Logger; @@ -9,7 +9,7 @@ private static final Logger LOGGER = LogUtils.getLogger(); private static final String TAG_ACTIVE_EFFECTS = "active_effects"; private static final ResourceLocation SPEED_MODIFIER_POWDER_SNOW_ID = ResourceLocation.withDefaultNamespace("powder_snow"); -@@ -173,6 +_,8 @@ +@@ -172,6 +_,8 @@ public static final float EXTRA_RENDER_CULLING_SIZE_WITH_BIG_HAT = 0.5F; public static final float DEFAULT_BABY_SCALE = 0.5F; public static final String ATTRIBUTES_FIELD = "attributes"; @@ -18,7 +18,7 @@ public static final Predicate PLAYER_NOT_WEARING_DISGUISE_ITEM = p_358894_ -> { if (p_358894_ instanceof Player player) { ItemStack itemstack = player.getItemBySlot(EquipmentSlot.HEAD); -@@ -272,7 +_,8 @@ +@@ -270,7 +_,8 @@ this.setYRot((float)(Math.random() * (float) (Math.PI * 2))); this.yHeadRot = this.getYRot(); NbtOps nbtops = NbtOps.INSTANCE; @@ -28,7 +28,7 @@ } public Brain getBrain() { -@@ -326,7 +_,8 @@ +@@ -324,7 +_,8 @@ .add(Attributes.EXPLOSION_KNOCKBACK_RESISTANCE) .add(Attributes.WATER_MOVEMENT_EFFICIENCY) .add(Attributes.MOVEMENT_EFFICIENCY) @@ -38,7 +38,7 @@ } @Override -@@ -354,7 +_,8 @@ +@@ -352,7 +_,8 @@ float f = (float)Mth.ceil((double)this.fallDistance - d7); double d4 = Math.min((double)(0.2F + f / 15.0F), 2.5); int i = (int)(150.0 * d4); @@ -48,7 +48,7 @@ } } -@@ -364,6 +_,7 @@ +@@ -362,6 +_,7 @@ } } @@ -56,7 +56,7 @@ public final boolean canBreatheUnderwater() { return this.getType().is(EntityTypeTags.CAN_BREATHE_UNDER_WATER); } -@@ -410,6 +_,10 @@ +@@ -408,6 +_,10 @@ } } @@ -185,16 +185,7 @@ } if (p_361865_.is(DamageTypeTags.IS_FREEZING) && this.getType().is(EntityTypeTags.FREEZE_HURTS_EXTRA_TYPES)) { -@@ -1166,7 +_,7 @@ - if (entity instanceof Player player1) { - this.lastHurtByPlayerTime = 100; - this.lastHurtByPlayer = player1; -- } else if (entity instanceof Wolf wolf && wolf.isTame()) { -+ } else if (entity instanceof net.minecraft.world.entity.TamableAnimal wolf && wolf.isTame()) { - this.lastHurtByPlayerTime = 100; - if (wolf.getOwner() instanceof Player player) { - this.lastHurtByPlayer = player; -@@ -1231,7 +_,7 @@ +@@ -1212,7 +_,7 @@ if (this instanceof ServerPlayer serverplayer) { CriteriaTriggers.ENTITY_HURT_PLAYER.trigger(serverplayer, p_361865_, f, p_365677_, flag); if (f1 > 0.0F && f1 < 3.4028235E37F) { @@ -203,7 +194,16 @@ } } -@@ -1261,7 +_,7 @@ +@@ -1240,7 +_,7 @@ + this.lastHurtByPlayer = player; + return player; + } else { +- if (entity instanceof Wolf wolf && wolf.isTame()) { ++ if (entity instanceof net.minecraft.world.entity.TamableAnimal wolf && wolf.isTame()) { + this.lastHurtByPlayerTime = 100; + if (wolf.getOwner() instanceof Player player1) { + this.lastHurtByPlayer = player1; +@@ -1273,7 +_,7 @@ for (InteractionHand interactionhand : InteractionHand.values()) { ItemStack itemstack1 = this.getItemInHand(interactionhand); deathprotection = itemstack1.get(DataComponents.DEATH_PROTECTION); @@ -212,7 +212,7 @@ itemstack = itemstack1.copy(); itemstack1.shrink(1); break; -@@ -1345,6 +_,7 @@ +@@ -1357,6 +_,7 @@ } public void die(DamageSource p_21014_) { @@ -220,7 +220,7 @@ if (!this.isRemoved() && !this.dead) { Entity entity = p_21014_.getEntity(); LivingEntity livingentity = this.getKillCredit(); -@@ -1380,10 +_,10 @@ +@@ -1392,10 +_,10 @@ if (this.level() instanceof ServerLevel serverlevel) { boolean flag = false; if (p_21269_ instanceof WitherBoss) { @@ -233,7 +233,7 @@ this.level().setBlock(blockpos, blockstate, 3); flag = true; } -@@ -1398,6 +_,7 @@ +@@ -1410,6 +_,7 @@ } protected void dropAllDeathLoot(ServerLevel p_342160_, DamageSource p_21192_) { @@ -241,7 +241,7 @@ boolean flag = this.lastHurtByPlayerTime > 0; if (this.shouldDropLoot() && p_342160_.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { this.dropFromLootTable(p_342160_, p_21192_, flag); -@@ -1406,6 +_,11 @@ +@@ -1418,6 +_,11 @@ this.dropEquipment(p_342160_); this.dropExperience(p_342160_, p_21192_.getEntity()); @@ -253,7 +253,7 @@ } protected void dropEquipment(ServerLevel p_365823_) { -@@ -1413,7 +_,8 @@ +@@ -1425,7 +_,8 @@ protected void dropExperience(ServerLevel p_370040_, @Nullable Entity p_342525_) { if (!this.wasExperienceConsumed() && (this.isAlwaysExperienceDropper() || this.lastHurtByPlayerTime > 0 && this.shouldDropExperience() && p_370040_.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT))) { @@ -263,7 +263,7 @@ } } -@@ -1489,6 +_,11 @@ +@@ -1501,6 +_,11 @@ } public void knockback(double p_147241_, double p_147242_, double p_147243_) { @@ -275,7 +275,7 @@ p_147241_ *= 1.0 - this.getAttributeValue(Attributes.KNOCKBACK_RESISTANCE); if (!(p_147241_ <= 0.0)) { this.hasImpulse = true; -@@ -1566,6 +_,13 @@ +@@ -1582,6 +_,13 @@ } else { BlockPos blockpos = this.blockPosition(); BlockState blockstate = this.getInBlockState(); @@ -289,7 +289,7 @@ if (blockstate.is(BlockTags.CLIMBABLE)) { this.lastClimbablePos = Optional.of(blockpos); return true; -@@ -1627,6 +_,10 @@ +@@ -1636,6 +_,10 @@ @Override public boolean causeFallDamage(float p_147187_, float p_147188_, DamageSource p_147189_) { @@ -300,7 +300,7 @@ boolean flag = super.causeFallDamage(p_147187_, p_147188_, p_147189_); int i = this.calculateFallDamage(p_147187_, p_147188_); if (i > 0) { -@@ -1654,9 +_,10 @@ +@@ -1663,9 +_,10 @@ int i = Mth.floor(this.getX()); int j = Mth.floor(this.getY() - 0.2F); int k = Mth.floor(this.getZ()); @@ -313,7 +313,7 @@ this.playSound(soundtype.getFallSound(), soundtype.getVolume() * 0.5F, soundtype.getPitch() * 0.75F); } } -@@ -1717,9 +_,9 @@ +@@ -1726,9 +_,9 @@ float f2 = f1 - p_21194_; if (f2 > 0.0F && f2 < 3.4028235E37F) { if (this instanceof ServerPlayer) { @@ -325,7 +325,7 @@ } } } -@@ -1747,6 +_,8 @@ +@@ -1756,6 +_,8 @@ protected void actuallyHurt(ServerLevel p_365124_, DamageSource p_21240_, float p_21241_) { if (!this.isInvulnerableTo(p_365124_, p_21240_)) { @@ -334,7 +334,7 @@ p_21241_ = this.getDamageAfterArmorAbsorb(p_21240_, p_21241_); p_21241_ = this.getDamageAfterMagicAbsorb(p_21240_, p_21241_); float f1 = Math.max(p_21241_ - this.getAbsorptionAmount(), 0.0F); -@@ -1756,6 +_,7 @@ +@@ -1765,6 +_,7 @@ serverplayer.awardStat(Stats.DAMAGE_DEALT_ABSORBED, Math.round(f * 10.0F)); } @@ -342,7 +342,7 @@ if (f1 != 0.0F) { this.getCombatTracker().recordDamage(p_21240_, f1); this.setHealth(this.getHealth() - f1); -@@ -1815,6 +_,8 @@ +@@ -1824,6 +_,8 @@ } public void swing(InteractionHand p_21012_, boolean p_21013_) { @@ -351,7 +351,7 @@ if (!this.swinging || this.swingTime >= this.getCurrentSwingDuration() / 2 || this.swingTime < 0) { this.swingTime = -1; this.swinging = true; -@@ -1927,9 +_,10 @@ +@@ -1936,9 +_,10 @@ } private void swapHandItems() { @@ -365,7 +365,7 @@ } @Override -@@ -2147,15 +_,18 @@ +@@ -2156,15 +_,18 @@ } this.hasImpulse = true; @@ -386,7 +386,7 @@ } protected float getWaterSlowDown() { -@@ -2179,8 +_,8 @@ +@@ -2188,8 +_,8 @@ public void travel(Vec3 p_21280_) { if (this.isControlledByLocalInstance()) { FluidState fluidstate = this.level().getFluidState(this.blockPosition()); @@ -397,7 +397,7 @@ } else if (this.isFallFlying()) { this.travelFallFlying(); } else { -@@ -2191,7 +_,7 @@ +@@ -2200,7 +_,7 @@ private void travelInAir(Vec3 p_362087_) { BlockPos blockpos = this.getBlockPosBelowThatAffectsMyMovement(); @@ -406,7 +406,7 @@ float f1 = f * 0.91F; Vec3 vec3 = this.handleRelativeFrictionAndCalculateMovement(p_362087_, f); double d0 = vec3.y; -@@ -2214,10 +_,18 @@ +@@ -2223,10 +_,18 @@ } } @@ -426,7 +426,7 @@ if (this.isInWater()) { float f = this.isSprinting() ? 0.9F : this.getWaterSlowDown(); float f1 = 0.02F; -@@ -2235,6 +_,7 @@ +@@ -2244,6 +_,7 @@ f = 0.96F; } @@ -434,7 +434,7 @@ this.moveRelative(f1, p_362114_); this.move(MoverType.SELF, this.getDeltaMovement()); Vec3 vec3 = this.getDeltaMovement(); -@@ -2383,7 +_,7 @@ +@@ -2392,7 +_,7 @@ double d0 = Mth.clamp(p_21298_.x, -0.15F, 0.15F); double d1 = Mth.clamp(p_21298_.z, -0.15F, 0.15F); double d2 = Math.max(p_21298_.y, -0.15F); @@ -443,7 +443,7 @@ d2 = 0.0; } -@@ -2416,6 +_,7 @@ +@@ -2425,6 +_,7 @@ @Override public void tick() { @@ -451,7 +451,7 @@ super.tick(); this.updatingUsingItem(); this.updateSwimAmount(); -@@ -2568,6 +_,7 @@ +@@ -2577,6 +_,7 @@ }; ItemStack itemstack1 = this.getItemBySlot(equipmentslot); if (this.equipmentHasChanged(itemstack, itemstack1)) { @@ -459,7 +459,7 @@ if (map == null) { map = Maps.newEnumMap(EquipmentSlot.class); } -@@ -2727,6 +_,10 @@ +@@ -2736,6 +_,10 @@ profilerfiller.push("jump"); if (this.jumping && this.isAffectedByFluids()) { double d3; @@ -470,7 +470,7 @@ if (this.isInLava()) { d3 = this.getFluidHeight(FluidTags.LAVA); } else { -@@ -2737,15 +_,22 @@ +@@ -2746,15 +_,22 @@ double d4 = this.getFluidJumpThreshold(); if (!flag || this.onGround() && !(d3 > d4)) { if (!this.isInLava() || this.onGround() && !(d3 > d4)) { @@ -495,7 +495,7 @@ } } else { this.noJumpDelay = 0; -@@ -3095,8 +_,11 @@ +@@ -3104,8 +_,11 @@ private void updatingUsingItem() { if (this.isUsingItem()) { @@ -508,7 +508,7 @@ this.updateUsingItem(this.useItem); } else { this.stopUsingItem(); -@@ -3105,8 +_,12 @@ +@@ -3114,8 +_,12 @@ } protected void updateUsingItem(ItemStack p_147201_) { @@ -522,7 +522,7 @@ this.completeUsingItem(); } } -@@ -3134,8 +_,10 @@ +@@ -3143,8 +_,10 @@ public void startUsingItem(InteractionHand p_21159_) { ItemStack itemstack = this.getItemInHand(p_21159_); if (!itemstack.isEmpty() && !this.isUsingItem()) { @@ -534,7 +534,7 @@ if (!this.level().isClientSide) { this.setLivingEntityFlag(1, true); this.setLivingEntityFlag(2, p_21159_ == InteractionHand.OFF_HAND); -@@ -3187,6 +_,9 @@ +@@ -3196,6 +_,9 @@ vec31 = vec31.xRot(-this.getXRot() * (float) (Math.PI / 180.0)); vec31 = vec31.yRot(-this.getYRot() * (float) (Math.PI / 180.0)); vec31 = vec31.add(this.getX(), this.getEyeY(), this.getZ()); @@ -544,7 +544,7 @@ this.level() .addParticle( new ItemParticleOption(ParticleTypes.ITEM, p_21061_), -@@ -3207,7 +_,9 @@ +@@ -3216,7 +_,9 @@ this.releaseUsingItem(); } else { if (!this.useItem.isEmpty() && this.isUsingItem()) { @@ -554,7 +554,7 @@ if (itemstack != this.useItem) { this.setItemInHand(interactionhand, itemstack); } -@@ -3235,7 +_,13 @@ +@@ -3244,7 +_,13 @@ public void releaseUsingItem() { if (!this.useItem.isEmpty()) { @@ -568,7 +568,7 @@ if (this.useItem.useOnRelease()) { this.updatingUsingItem(); } -@@ -3245,6 +_,7 @@ +@@ -3254,6 +_,7 @@ } public void stopUsingItem() { @@ -576,7 +576,7 @@ if (!this.level().isClientSide) { boolean flag = this.isUsingItem(); this.setLivingEntityFlag(1, false); -@@ -3265,7 +_,8 @@ +@@ -3274,7 +_,8 @@ public ItemStack getItemBlockingWith() { if (this.isUsingItem() && !this.useItem.isEmpty()) { Item item = this.useItem.getItem(); @@ -586,7 +586,7 @@ return null; } else { return item.getUseDuration(this.useItem, this) - this.useItemRemaining < 5 ? null : this.useItem; -@@ -3410,8 +_,8 @@ +@@ -3419,8 +_,8 @@ } BlockState blockstate = this.level().getBlockState(p_21141_); @@ -597,11 +597,11 @@ } this.setPose(Pose.SLEEPING); -@@ -3426,15 +_,15 @@ +@@ -3435,15 +_,15 @@ } private boolean checkBedExists() { -- return this.getSleepingPos().map(p_358885_ -> this.level().getBlockState(p_358885_).getBlock() instanceof BedBlock).orElse(false); +- return this.getSleepingPos().map(p_374931_ -> this.level().getBlockState(p_374931_).getBlock() instanceof BedBlock).orElse(false); + return this.getSleepingPos().map(p_341272_ -> net.minecraftforge.event.ForgeEventFactory.fireSleepingLocationCheck(this, p_341272_)).orElse(false); } @@ -616,7 +616,7 @@ Vec3 vec31 = BedBlock.findStandUpPosition(this.getType(), this.level(), p_261435_, direction, this.getYRot()).orElseGet(() -> { BlockPos blockpos = p_261435_.above(); return new Vec3((double)blockpos.getX() + 0.5, (double)blockpos.getY() + 0.1, (double)blockpos.getZ() + 0.5); -@@ -3455,7 +_,9 @@ +@@ -3464,7 +_,9 @@ @Nullable public Direction getBedOrientation() { BlockPos blockpos = this.getSleepingPos().orElse(null); @@ -627,7 +627,7 @@ } @Override -@@ -3464,7 +_,7 @@ +@@ -3473,7 +_,7 @@ } public ItemStack getProjectile(ItemStack p_21272_) { @@ -636,7 +636,7 @@ } private static byte entityEventForEquipmentBreak(EquipmentSlot p_21267_) { -@@ -3519,6 +_,8 @@ +@@ -3528,6 +_,8 @@ } public final EquipmentSlot getEquipmentSlotForItem(ItemStack p_147234_) { @@ -645,7 +645,7 @@ Equippable equippable = p_147234_.get(DataComponents.EQUIPPABLE); return equippable != null && this.canUseSlot(equippable.slot()) ? equippable.slot() : EquipmentSlot.MAINHAND; } -@@ -3650,5 +_,42 @@ +@@ -3659,5 +_,42 @@ } public static record Fallsounds(SoundEvent small, SoundEvent big) { diff --git a/patches/minecraft/net/minecraft/world/entity/Mob.java.patch b/patches/minecraft/net/minecraft/world/entity/Mob.java.patch index 416e0e89de..a6f7a455b0 100644 --- a/patches/minecraft/net/minecraft/world/entity/Mob.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/Mob.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/Mob.java +++ b/net/minecraft/world/entity/Mob.java -@@ -133,6 +_,9 @@ +@@ -129,6 +_,9 @@ private Leashable.LeashData leashData; private BlockPos restrictCenter = BlockPos.ZERO; private float restrictRadius = -1.0F; @@ -10,7 +10,7 @@ protected Mob(EntityType p_21368_, Level p_21369_) { super(p_21368_, p_21369_); -@@ -239,7 +_,10 @@ +@@ -235,7 +_,10 @@ } public void setTarget(@Nullable LivingEntity p_21544_) { @@ -22,7 +22,7 @@ } @Override -@@ -421,6 +_,10 @@ +@@ -418,6 +_,10 @@ if (this.isNoAi()) { p_21484_.putBoolean("NoAI", this.isNoAi()); } @@ -33,9 +33,9 @@ } @Override -@@ -480,6 +_,14 @@ - } +@@ -484,6 +_,14 @@ + this.lootTableSeed = p_21450_.getLong("DeathLootTableSeed"); this.setNoAi(p_21450_.getBoolean("NoAI")); + + if (p_21450_.contains("forge:spawn_type")) { @@ -48,7 +48,7 @@ } @Override -@@ -532,7 +_,7 @@ +@@ -536,7 +_,7 @@ && this.canPickUpLoot() && this.isAlive() && !this.dead @@ -57,7 +57,7 @@ Vec3i vec3i = this.getPickupReach(); for (ItemEntity itementity : this.level() -@@ -700,6 +_,14 @@ +@@ -702,6 +_,14 @@ this.discard(); } else if (!this.isPersistenceRequired() && !this.requiresCustomPersistence()) { Entity entity = this.level().getNearestPlayer(this, -1.0); @@ -72,7 +72,7 @@ if (entity != null) { double d0 = entity.distanceToSqr(this); int i = this.getType().getCategory().getDespawnDistance(); -@@ -1116,6 +_,16 @@ +@@ -1118,6 +_,16 @@ } } @@ -89,7 +89,7 @@ @Nullable public SpawnGroupData finalizeSpawn(ServerLevelAccessor p_21434_, DifficultyInstance p_21435_, EntitySpawnReason p_369316_, @Nullable SpawnGroupData p_21437_) { RandomSource randomsource = p_21434_.getRandom(); -@@ -1127,6 +_,7 @@ +@@ -1129,6 +_,7 @@ } this.setLeftHanded(randomsource.nextFloat() < 0.05F); @@ -97,7 +97,7 @@ return p_21437_; } -@@ -1438,15 +_,25 @@ +@@ -1439,15 +_,25 @@ return false; } @@ -124,7 +124,7 @@ @VisibleForTesting public void removeFreeWill() { this.removeAllGoals(p_341273_ -> true); -@@ -1472,6 +_,41 @@ +@@ -1473,6 +_,41 @@ public ItemStack getPickResult() { SpawnEggItem spawneggitem = SpawnEggItem.byId(this.getType()); return spawneggitem == null ? null : new ItemStack(spawneggitem); diff --git a/patches/minecraft/net/minecraft/world/entity/SpawnPlacements.java.patch b/patches/minecraft/net/minecraft/world/entity/SpawnPlacements.java.patch index 54d1956bdb..5771b2f0ab 100644 --- a/patches/minecraft/net/minecraft/world/entity/SpawnPlacements.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/SpawnPlacements.java.patch @@ -18,7 +18,7 @@ } static { -@@ -164,5 +_,13 @@ +@@ -163,5 +_,13 @@ @FunctionalInterface public interface SpawnPredicate { boolean test(EntityType p_217081_, ServerLevelAccessor p_217082_, EntitySpawnReason p_365908_, BlockPos p_217084_, RandomSource p_217085_); diff --git a/patches/minecraft/net/minecraft/world/entity/TamableAnimal.java.patch b/patches/minecraft/net/minecraft/world/entity/TamableAnimal.java.patch index d84c309d97..edf2fe0e34 100644 --- a/patches/minecraft/net/minecraft/world/entity/TamableAnimal.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/TamableAnimal.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/TamableAnimal.java +++ b/net/minecraft/world/entity/TamableAnimal.java -@@ -219,13 +_,16 @@ +@@ -222,13 +_,16 @@ @Override public void die(DamageSource p_21809_) { diff --git a/patches/minecraft/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java.patch b/patches/minecraft/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java.patch index e3e7877afe..75fc966be3 100644 --- a/patches/minecraft/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java +++ b/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java -@@ -177,11 +_,12 @@ +@@ -176,11 +_,12 @@ .build(); public static AttributeSupplier getSupplier(EntityType p_22298_) { diff --git a/patches/minecraft/net/minecraft/world/entity/animal/Bee.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/Bee.java.patch index add7ac13fd..3affe941b4 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/Bee.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/Bee.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/Bee.java +++ b/net/minecraft/world/entity/animal/Bee.java -@@ -502,7 +_,9 @@ +@@ -505,7 +_,9 @@ if (this.hivePos == null) { return null; } else { @@ -11,7 +11,7 @@ } } -@@ -648,13 +_,22 @@ +@@ -668,13 +_,22 @@ } @Override diff --git a/patches/minecraft/net/minecraft/world/entity/animal/Cat.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/Cat.java.patch index ea562ef2eb..ca43f5dce3 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/Cat.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/Cat.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/Cat.java +++ b/net/minecraft/world/entity/animal/Cat.java -@@ -371,10 +_,10 @@ +@@ -369,10 +_,10 @@ } } else if (this.isFood(itemstack) && this.getHealth() < this.getMaxHealth()) { if (!this.level().isClientSide()) { @@ -12,7 +12,7 @@ } return InteractionResult.SUCCESS; -@@ -435,7 +_,7 @@ +@@ -433,7 +_,7 @@ } private void tryToTame(Player p_333297_) { diff --git a/patches/minecraft/net/minecraft/world/entity/animal/MushroomCow.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/MushroomCow.java.patch index b1cbf3d6ce..52c6d8701a 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/MushroomCow.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/MushroomCow.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/MushroomCow.java +++ b/net/minecraft/world/entity/animal/MushroomCow.java -@@ -110,7 +_,7 @@ +@@ -109,7 +_,7 @@ this.playSound(soundevent, 1.0F, 1.0F); return InteractionResult.SUCCESS; @@ -9,7 +9,7 @@ if (this.level() instanceof ServerLevel serverlevel) { this.shear(serverlevel, SoundSource.PLAYERS, itemstack); this.gameEvent(GameEvent.SHEAR, p_28941_); -@@ -165,15 +_,26 @@ +@@ -164,15 +_,26 @@ @Override public void shear(ServerLevel p_369641_, SoundSource p_28924_, ItemStack p_364876_) { @@ -25,21 +25,21 @@ + if (!net.minecraftforge.event.ForgeEventFactory.canLivingConvert(this, EntityType.COW, time -> {})) + return ret; p_369641_.playSound(null, this, SoundEvents.MOOSHROOM_SHEAR, p_28924_, 1.0F, 1.0F); - this.convertTo(EntityType.COW, ConversionParams.single(this, false, false), p_359168_ -> { + this.convertTo(EntityType.COW, ConversionParams.single(this, false, false), p_375107_ -> { p_369641_.sendParticles(ParticleTypes.EXPLOSION, this.getX(), this.getY(0.5), this.getZ(), 1, 0.0, 0.0, 0.0, 0.0); - this.dropFromShearingLootTable(p_369641_, BuiltInLootTables.SHEAR_MOOSHROOM, p_364876_, (p_359169_, p_359170_) -> { -- for (int i = 0; i < p_359170_.getCount(); i++) { -- p_359169_.addFreshEntity(new ItemEntity(this.level(), this.getX(), this.getY(1.0), this.getZ(), p_359170_.copyWithCount(1))); + this.dropFromShearingLootTable(p_369641_, BuiltInLootTables.SHEAR_MOOSHROOM, p_364876_, (p_375108_, p_375109_) -> { +- for (int i = 0; i < p_375109_.getCount(); i++) { +- p_375108_.addFreshEntity(new ItemEntity(this.level(), this.getX(), this.getY(1.0), this.getZ(), p_375109_.copyWithCount(1))); - } -+ ret.add(p_359170_); ++ ret.add(p_375109_); }); -+ net.minecraftforge.event.ForgeEventFactory.onLivingConvert(this, p_359168_); ++ net.minecraftforge.event.ForgeEventFactory.onLivingConvert(this, p_375107_); }); + return ret; } @Override -@@ -233,6 +_,15 @@ +@@ -232,6 +_,15 @@ } return mushroomcow$variant2; diff --git a/patches/minecraft/net/minecraft/world/entity/animal/Parrot.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/Parrot.java.patch index 3cbbc44bc0..dbbe84225e 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/Parrot.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/Parrot.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/Parrot.java +++ b/net/minecraft/world/entity/animal/Parrot.java -@@ -259,7 +_,7 @@ +@@ -257,7 +_,7 @@ } if (!this.level().isClientSide) { diff --git a/patches/minecraft/net/minecraft/world/entity/animal/Pig.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/Pig.java.patch index d8b774599e..fdbc17fb7b 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/Pig.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/Pig.java.patch @@ -6,13 +6,13 @@ public void thunderHit(ServerLevel p_29473_, LightningBolt p_29474_) { - if (p_29473_.getDifficulty() != Difficulty.PEACEFUL) { + if (p_29473_.getDifficulty() != Difficulty.PEACEFUL && net.minecraftforge.event.ForgeEventFactory.canLivingConvert(this, EntityType.ZOMBIFIED_PIGLIN, (timer) -> {})) { - ZombifiedPiglin zombifiedpiglin = this.convertTo(EntityType.ZOMBIFIED_PIGLIN, ConversionParams.single(this, false, true), p_359172_ -> { + ZombifiedPiglin zombifiedpiglin = this.convertTo(EntityType.ZOMBIFIED_PIGLIN, ConversionParams.single(this, false, true), p_375111_ -> { if (this.getMainHandItem().isEmpty()) { - p_359172_.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(Items.GOLDEN_SWORD)); + p_375111_.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(Items.GOLDEN_SWORD)); } - p_359172_.setPersistenceRequired(); -+ net.minecraftforge.event.ForgeEventFactory.onLivingConvert(this, p_359172_); + p_375111_.setPersistenceRequired(); ++ net.minecraftforge.event.ForgeEventFactory.onLivingConvert(this, p_375111_); }); if (zombifiedpiglin == null) { super.thunderHit(p_29473_, p_29474_); diff --git a/patches/minecraft/net/minecraft/world/entity/animal/Sheep.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/Sheep.java.patch index 7922e58efc..84445d73b3 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/Sheep.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/Sheep.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/Sheep.java +++ b/net/minecraft/world/entity/animal/Sheep.java -@@ -161,7 +_,7 @@ +@@ -156,7 +_,7 @@ @Override public InteractionResult mobInteract(Player p_29853_, InteractionHand p_29854_) { ItemStack itemstack = p_29853_.getItemInHand(p_29854_); @@ -9,7 +9,7 @@ if (this.level() instanceof ServerLevel serverlevel && this.readyForShearing()) { this.shear(serverlevel, SoundSource.PLAYERS, itemstack); this.gameEvent(GameEvent.SHEAR, p_29853_); -@@ -177,12 +_,26 @@ +@@ -172,12 +_,26 @@ @Override public void shear(ServerLevel p_365174_, SoundSource p_29819_, ItemStack p_361058_) { @@ -36,7 +36,7 @@ for (int i = 0; i < p_359183_.getCount(); i++) { ItemEntity itementity = this.spawnAtLocation(p_359182_, p_359183_.copyWithCount(1), 1.0F); if (itementity != null) { -@@ -197,8 +_,14 @@ +@@ -192,8 +_,14 @@ } } } diff --git a/patches/minecraft/net/minecraft/world/entity/animal/Wolf.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/Wolf.java.patch index 65b7adf79a..db2887afe0 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/Wolf.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/Wolf.java.patch @@ -40,7 +40,7 @@ this.tame(p_336244_); this.navigation.stop(); this.setTarget(null); -@@ -625,6 +_,24 @@ +@@ -623,6 +_,24 @@ return true; } diff --git a/patches/minecraft/net/minecraft/world/entity/animal/allay/Allay.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/allay/Allay.java.patch index daf26fdbaf..106817be0f 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/allay/Allay.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/allay/Allay.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/allay/Allay.java +++ b/net/minecraft/world/entity/animal/allay/Allay.java -@@ -367,7 +_,7 @@ +@@ -373,7 +_,7 @@ public boolean wantsToPickUp(ServerLevel p_363882_, ItemStack p_218387_) { ItemStack itemstack = this.getItemInHand(InteractionHand.MAIN_HAND); return !itemstack.isEmpty() diff --git a/patches/minecraft/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java.patch b/patches/minecraft/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java.patch index a6e2d83146..27788eb6eb 100644 --- a/patches/minecraft/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java.patch @@ -55,8 +55,8 @@ } if (this.dragonDeathTime == 1 && !this.isSilent()) { -@@ -551,7 +_,8 @@ - this.move(MoverType.SELF, new Vec3(0.0, 0.1F, 0.0)); +@@ -558,7 +_,8 @@ + if (this.dragonDeathTime == 200 && this.level() instanceof ServerLevel serverlevel1) { if (serverlevel1.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { - ExperienceOrb.award(serverlevel1, this.position(), Mth.floor((float)i * 0.2F)); @@ -65,7 +65,7 @@ } if (this.dragonFight != null) { -@@ -864,6 +_,7 @@ +@@ -871,6 +_,7 @@ @Override public void recreateFromPacket(ClientboundAddEntityPacket p_218825_) { super.recreateFromPacket(p_218825_); @@ -73,7 +73,7 @@ EnderDragonPart[] aenderdragonpart = this.getSubEntities(); for (int i = 0; i < aenderdragonpart.length; i++) { -@@ -879,5 +_,15 @@ +@@ -886,5 +_,15 @@ @Override protected float sanitizeScale(float p_333905_) { return 1.0F; diff --git a/patches/minecraft/net/minecraft/world/entity/boss/wither/WitherBoss.java.patch b/patches/minecraft/net/minecraft/world/entity/boss/wither/WitherBoss.java.patch index 2728a9cee9..2273e783ec 100644 --- a/patches/minecraft/net/minecraft/world/entity/boss/wither/WitherBoss.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/boss/wither/WitherBoss.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -315,7 +_,7 @@ +@@ -314,7 +_,7 @@ if (this.destroyBlocksTick > 0) { this.destroyBlocksTick--; @@ -9,7 +9,7 @@ boolean flag = false; int l = Mth.floor(this.getBbWidth() / 2.0F + 1.0F); int i1 = Mth.floor(this.getBbHeight()); -@@ -324,7 +_,7 @@ +@@ -323,7 +_,7 @@ this.getBlockX() - l, this.getBlockY(), this.getBlockZ() - l, this.getBlockX() + l, this.getBlockY() + i1, this.getBlockZ() + l )) { BlockState blockstate = p_363567_.getBlockState(blockpos); @@ -18,7 +18,7 @@ flag = p_363567_.destroyBlock(blockpos, true, this) || flag; } } -@@ -343,6 +_,10 @@ +@@ -342,6 +_,10 @@ } } diff --git a/patches/minecraft/net/minecraft/world/entity/decoration/HangingEntity.java.patch b/patches/minecraft/net/minecraft/world/entity/decoration/HangingEntity.java.patch index b16a8430e1..c00ea7fb6f 100644 --- a/patches/minecraft/net/minecraft/world/entity/decoration/HangingEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/decoration/HangingEntity.java.patch @@ -2,9 +2,9 @@ +++ b/net/minecraft/world/entity/decoration/HangingEntity.java @@ -60,6 +_,8 @@ } else { - boolean flag = BlockPos.betweenClosedStream(this.calculateSupportBox()).allMatch(p_359231_ -> { - BlockState blockstate = this.level().getBlockState(p_359231_); -+ if (net.minecraft.world.level.block.Block.canSupportCenter(this.level(), p_359231_, this.direction)) + boolean flag = BlockPos.betweenClosedStream(this.calculateSupportBox()).allMatch(p_375130_ -> { + BlockState blockstate = this.level().getBlockState(p_375130_); ++ if (net.minecraft.world.level.block.Block.canSupportCenter(this.level(), p_375130_, this.direction)) + return true; return blockstate.isSolid() || DiodeBlock.isDiode(blockstate); }); diff --git a/patches/minecraft/net/minecraft/world/entity/monster/AbstractSkeleton.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/AbstractSkeleton.java.patch index 09906ac37d..a68dbb1485 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/AbstractSkeleton.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/AbstractSkeleton.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/AbstractSkeleton.java +++ b/net/minecraft/world/entity/monster/AbstractSkeleton.java -@@ -159,7 +_,7 @@ +@@ -161,7 +_,7 @@ if (this.level() != null && !this.level().isClientSide) { this.goalSelector.removeGoal(this.meleeGoal); this.goalSelector.removeGoal(this.bowGoal); @@ -9,7 +9,7 @@ if (itemstack.is(Items.BOW)) { int i = this.getHardAttackInterval(); if (this.level().getDifficulty() != Difficulty.HARD) { -@@ -184,9 +_,12 @@ +@@ -186,9 +_,12 @@ @Override public void performRangedAttack(LivingEntity p_32141_, float p_32142_) { diff --git a/patches/minecraft/net/minecraft/world/entity/monster/EnderMan.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/EnderMan.java.patch index c7b871fd8d..2d754dff48 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/EnderMan.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/EnderMan.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/EnderMan.java +++ b/net/minecraft/world/entity/monster/EnderMan.java -@@ -114,7 +_,6 @@ +@@ -113,7 +_,6 @@ @Override public void setTarget(@Nullable LivingEntity p_32537_) { @@ -8,7 +8,7 @@ AttributeInstance attributeinstance = this.getAttribute(Attributes.MOVEMENT_SPEED); if (p_32537_ == null) { this.targetChangeTime = 0; -@@ -128,6 +_,7 @@ +@@ -127,6 +_,7 @@ attributeinstance.addTransientModifier(SPEED_MODIFIER_ATTACKING); } } @@ -16,16 +16,16 @@ } @Override -@@ -209,7 +_,7 @@ +@@ -208,7 +_,7 @@ } boolean isBeingStaredBy(Player p_368759_) { -- return this.isLookingAtMe(p_368759_, 0.025, true, false, LivingEntity.PLAYER_NOT_WEARING_DISGUISE_ITEM, new DoubleSupplier[]{this::getEyeY}); -+ return this.isLookingAtMe(p_368759_, 0.025, true, false, net.minecraftforge.common.ForgeHooks.isNotDisguised(this), new DoubleSupplier[]{this::getEyeY}); +- return !LivingEntity.PLAYER_NOT_WEARING_DISGUISE_ITEM.test(p_368759_) ? false : this.isLookingAtMe(p_368759_, 0.025, true, false, new double[]{this.getEyeY()}); ++ return !net.minecraftforge.common.ForgeHooks.isNotDisguised(this).test(p_368759_) ? false : this.isLookingAtMe(p_368759_, 0.025, true, false, new double[]{this.getEyeY()}); } @Override -@@ -287,8 +_,10 @@ +@@ -286,8 +_,10 @@ boolean flag = blockstate.blocksMotion(); boolean flag1 = blockstate.getFluidState().is(FluidTags.WATER); if (flag && !flag1) { @@ -37,7 +37,7 @@ if (flag2) { this.level().gameEvent(GameEvent.TELEPORT, vec3, GameEvent.Context.of(this)); if (!this.isSilent()) { -@@ -441,7 +_,7 @@ +@@ -440,7 +_,7 @@ if (this.enderman.getCarriedBlock() == null) { return false; } else { @@ -46,7 +46,7 @@ } } -@@ -459,7 +_,7 @@ +@@ -458,7 +_,7 @@ BlockState blockstate2 = this.enderman.getCarriedBlock(); if (blockstate2 != null) { blockstate2 = Block.updateFromNeighbourShapes(blockstate2, this.enderman.level(), blockpos); @@ -55,7 +55,7 @@ level.setBlock(blockpos, blockstate2, 3); level.gameEvent(GameEvent.BLOCK_PLACE, blockpos, GameEvent.Context.of(this.enderman, blockstate2)); this.enderman.setCarriedBlock(null); -@@ -471,6 +_,7 @@ +@@ -470,6 +_,7 @@ return p_32562_.isAir() && !p_32563_.isAir() && !p_32563_.is(Blocks.BEDROCK) @@ -63,7 +63,7 @@ && p_32563_.isCollisionShapeFullBlock(p_32559_, p_32564_) && p_32561_.canSurvive(p_32559_, p_32560_) && p_32559_.getEntities(this.enderman, AABB.unitCubeFromLowerCorner(Vec3.atLowerCornerOf(p_32560_))).isEmpty(); -@@ -580,7 +_,7 @@ +@@ -579,7 +_,7 @@ if (this.enderman.getCarriedBlock() != null) { return false; } else { diff --git a/patches/minecraft/net/minecraft/world/entity/monster/Pillager.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/Pillager.java.patch index ea74e23dd8..28cf44850e 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/Pillager.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/Pillager.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/Pillager.java +++ b/net/minecraft/world/entity/monster/Pillager.java -@@ -119,7 +_,7 @@ +@@ -127,7 +_,7 @@ public AbstractIllager.IllagerArmPose getArmPose() { if (this.isChargingCrossbow()) { return AbstractIllager.IllagerArmPose.CROSSBOW_CHARGE; diff --git a/patches/minecraft/net/minecraft/world/entity/monster/Ravager.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/Ravager.java.patch index 6a7b9077cc..29feef1ec9 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/Ravager.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/Ravager.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/Ravager.java +++ b/net/minecraft/world/entity/monster/Ravager.java -@@ -139,7 +_,7 @@ +@@ -136,7 +_,7 @@ this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(Mth.lerp(0.1, d1, d0)); } diff --git a/patches/minecraft/net/minecraft/world/entity/monster/Shulker.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/Shulker.java.patch index 8fd2873e51..7d62f91964 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/Shulker.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/Shulker.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/Shulker.java +++ b/net/minecraft/world/entity/monster/Shulker.java -@@ -391,6 +_,12 @@ +@@ -389,6 +_,12 @@ && this.level().noCollision(this, new AABB(blockpos1).deflate(1.0E-6))) { Direction direction = this.findAttachableSurface(blockpos1); if (direction != null) { diff --git a/patches/minecraft/net/minecraft/world/entity/monster/Skeleton.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/Skeleton.java.patch index 4f358100c6..541eb09220 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/Skeleton.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/Skeleton.java.patch @@ -5,6 +5,6 @@ protected void doFreezeConversion() { + if (!net.minecraftforge.event.ForgeEventFactory.canLivingConvert(this, EntityType.STRAY, (timer) -> this.conversionTime = timer)) return; - this.convertTo(EntityType.STRAY, ConversionParams.single(this, true, true), p_361572_ -> { + this.convertTo(EntityType.STRAY, ConversionParams.single(this, true, true), p_375136_ -> { if (!this.isSilent()) { this.level().levelEvent(null, 1048, this.blockPosition(), 0); diff --git a/patches/minecraft/net/minecraft/world/entity/monster/Zombie.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/Zombie.java.patch index 09c7f75a5e..7f1f2ab1cf 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/Zombie.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/Zombie.java.patch @@ -8,10 +8,10 @@ this.convertTo( p_34311_, ConversionParams.single(this, true, true), -- p_359259_ -> p_359259_.handleAttributes(p_359259_.level().getCurrentDifficultyAt(p_359259_.blockPosition()).getSpecialMultiplier()) -+ p_359259_ -> { -+ p_359259_.handleAttributes(p_359259_.level().getCurrentDifficultyAt(p_359259_.blockPosition()).getSpecialMultiplier()); -+ net.minecraftforge.event.ForgeEventFactory.onLivingConvert(this, p_359259_); +- p_375145_ -> p_375145_.handleAttributes(p_375145_.level().getCurrentDifficultyAt(p_375145_.blockPosition()).getSpecialMultiplier()) ++ p_375145_ -> { ++ p_375145_.handleAttributes(p_375145_.level().getCurrentDifficultyAt(p_375145_.blockPosition()).getSpecialMultiplier()); ++ net.minecraftforge.event.ForgeEventFactory.onLivingConvert(this, p_375145_); + } ); } diff --git a/patches/minecraft/net/minecraft/world/entity/monster/creaking/Creaking.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/creaking/Creaking.java.patch index 6bda4537b0..2e543386c2 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/creaking/Creaking.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/creaking/Creaking.java.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/world/entity/monster/creaking/Creaking.java +++ b/net/minecraft/world/entity/monster/creaking/Creaking.java -@@ -230,7 +_,7 @@ - - return true; - } else { -- Predicate predicate = this.isActive() ? LivingEntity.PLAYER_NOT_WEARING_DISGUISE_ITEM : p_366417_ -> true; -+ Predicate predicate = this.isActive() ? net.minecraftforge.common.ForgeHooks.isNotDisguised(this) : p_366417_ -> true; - +@@ -507,7 +_,7 @@ for (Player player : list) { - if (!player.isCreative() + if (this.canAttack(player) && !this.isAlliedTo(player)) { + flag1 = true; +- if ((!flag || LivingEntity.PLAYER_NOT_WEARING_DISGUISE_ITEM.test(player)) ++ if ((!flag || net.minecraftforge.common.ForgeHooks.isNotDisguised(this).test(player)) + && this.isLookingAtMe( + player, + 0.5, diff --git a/patches/minecraft/net/minecraft/world/entity/monster/piglin/Piglin.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/piglin/Piglin.java.patch index 54814c5515..36910d5361 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/piglin/Piglin.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/piglin/Piglin.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -351,7 +_,7 @@ +@@ -359,7 +_,7 @@ } else if (this.isChargingCrossbow()) { return PiglinArmPose.CROSSBOW_CHARGE; } else { @@ -9,7 +9,7 @@ } } -@@ -388,7 +_,7 @@ +@@ -396,7 +_,7 @@ } protected void holdInOffHand(ItemStack p_34786_) { @@ -18,7 +18,7 @@ this.setItemSlot(EquipmentSlot.OFFHAND, p_34786_); this.setGuaranteedDrop(EquipmentSlot.OFFHAND); } else { -@@ -398,7 +_,7 @@ +@@ -406,7 +_,7 @@ @Override public boolean wantsToPickUp(ServerLevel p_369934_, ItemStack p_34777_) { diff --git a/patches/minecraft/net/minecraft/world/entity/npc/Villager.java.patch b/patches/minecraft/net/minecraft/world/entity/npc/Villager.java.patch index d18c0d9d5a..4368388b96 100644 --- a/patches/minecraft/net/minecraft/world/entity/npc/Villager.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/npc/Villager.java.patch @@ -26,5 +26,5 @@ - if (p_35409_.getDifficulty() != Difficulty.PEACEFUL) { + if (p_35409_.getDifficulty() != Difficulty.PEACEFUL && net.minecraftforge.event.ForgeEventFactory.canLivingConvert(this, EntityType.WITCH, (timer) -> {})) { LOGGER.info("Villager {} was struck by lightning {}.", this, p_35410_); - Witch witch = this.convertTo(EntityType.WITCH, ConversionParams.single(this, false, false), p_359315_ -> { - p_359315_.finalizeSpawn(p_35409_, p_35409_.getCurrentDifficultyAt(p_359315_.blockPosition()), EntitySpawnReason.CONVERSION, null); + Witch witch = this.convertTo(EntityType.WITCH, ConversionParams.single(this, false, false), p_375163_ -> { + p_375163_.finalizeSpawn(p_35409_, p_35409_.getCurrentDifficultyAt(p_375163_.blockPosition()), EntitySpawnReason.CONVERSION, null); diff --git a/patches/minecraft/net/minecraft/world/entity/player/Inventory.java.patch b/patches/minecraft/net/minecraft/world/entity/player/Inventory.java.patch index a099624883..68283d9864 100644 --- a/patches/minecraft/net/minecraft/world/entity/player/Inventory.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/player/Inventory.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/player/Inventory.java +++ b/net/minecraft/world/entity/player/Inventory.java -@@ -129,7 +_,7 @@ +@@ -123,7 +_,7 @@ for (int k = 0; k < 9; k++) { int l = (this.selected + k) % 9; @@ -9,7 +9,7 @@ return l; } } -@@ -201,11 +_,13 @@ +@@ -195,11 +_,13 @@ } public void tick() { @@ -24,7 +24,7 @@ } } } -@@ -255,6 +_,8 @@ +@@ -249,6 +_,8 @@ } catch (Throwable throwable) { CrashReport crashreport = CrashReport.forThrowable(throwable, "Adding item to inventory"); CrashReportCategory crashreportcategory = crashreport.addCategory("Item being added"); diff --git a/patches/minecraft/net/minecraft/world/entity/player/Player.java.patch b/patches/minecraft/net/minecraft/world/entity/player/Player.java.patch index 49a6116ed0..76ec5e4344 100644 --- a/patches/minecraft/net/minecraft/world/entity/player/Player.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/player/Player.java.patch @@ -9,7 +9,7 @@ private static final Logger LOGGER = LogUtils.getLogger(); public static final HumanoidArm DEFAULT_MAIN_HAND = HumanoidArm.RIGHT; public static final int DEFAULT_MODEL_CUSTOMIZATION = 0; -@@ -195,6 +_,9 @@ +@@ -198,6 +_,9 @@ public Entity currentExplosionCause; private boolean ignoreFallDamageFromCurrentImpulse; private int currentImpulseContextResetGraceTime; @@ -19,7 +19,7 @@ public Player(Level p_250508_, BlockPos p_250289_, float p_251702_, GameProfile p_252153_) { super(EntityType.PLAYER, p_250508_); -@@ -227,11 +_,12 @@ +@@ -230,11 +_,12 @@ .add(Attributes.LUCK) .add(Attributes.BLOCK_INTERACTION_RANGE, 4.5) .add(Attributes.ENTITY_INTERACTION_RANGE, 3.0) @@ -34,15 +34,15 @@ } @Override -@@ -247,6 +_,7 @@ +@@ -250,6 +_,7 @@ @Override public void tick() { + net.minecraftforge.event.ForgeEventFactory.onPlayerPreTick(this); this.noPhysics = this.isSpectator(); - if (this.isSpectator()) { + if (this.isSpectator() || this.isPassenger()) { this.setOnGround(false); -@@ -262,7 +_,7 @@ +@@ -265,7 +_,7 @@ this.sleepCounter = 100; } @@ -51,7 +51,7 @@ this.stopSleepInBed(false, true); } } else if (this.sleepCounter > 0) { -@@ -323,6 +_,7 @@ +@@ -326,6 +_,7 @@ if (this.currentImpulseContextResetGraceTime > 0) { this.currentImpulseContextResetGraceTime--; } @@ -59,7 +59,7 @@ } @Override -@@ -425,6 +_,10 @@ +@@ -428,6 +_,10 @@ } protected void updatePlayerPose() { @@ -70,7 +70,7 @@ if (this.canPlayerFitWithinBlocksAndEntitiesWhen(Pose.SWIMMING)) { Pose pose; if (this.isFallFlying()) { -@@ -652,6 +_,7 @@ +@@ -655,6 +_,7 @@ @Override public void die(DamageSource p_36152_) { @@ -78,7 +78,7 @@ super.die(p_36152_); this.reapplyPosition(); if (!this.isSpectator() && this.level() instanceof ServerLevel serverlevel) { -@@ -709,7 +_,7 @@ +@@ -712,7 +_,7 @@ @Nullable public ItemEntity drop(ItemStack p_36177_, boolean p_36178_) { @@ -87,7 +87,7 @@ } @Nullable -@@ -721,7 +_,12 @@ +@@ -724,7 +_,12 @@ return null; } @@ -100,7 +100,7 @@ float f = this.inventory.getDestroySpeed(p_36282_); if (f > 1.0F) { f += (float)this.getAttributeValue(Attributes.MINING_EFFICIENCY); -@@ -750,11 +_,14 @@ +@@ -753,11 +_,14 @@ f /= 5.0F; } @@ -116,7 +116,7 @@ } @Override -@@ -855,6 +_,7 @@ +@@ -858,6 +_,7 @@ @Override public boolean hurtServer(ServerLevel p_369360_, DamageSource p_364544_, float p_368576_) { @@ -124,7 +124,7 @@ if (this.isInvulnerableTo(p_369360_, p_364544_)) { return false; } else if (this.abilities.invulnerable && !p_364544_.is(DamageTypeTags.BYPASSES_INVULNERABILITY)) { -@@ -888,7 +_,7 @@ +@@ -891,7 +_,7 @@ protected void blockUsingShield(LivingEntity p_36295_) { super.blockUsingShield(p_36295_); ItemStack itemstack = this.getItemBlockingWith(); @@ -133,7 +133,7 @@ this.disableShield(itemstack); } } -@@ -920,7 +_,7 @@ +@@ -923,7 +_,7 @@ @Override protected void hurtCurrentlyUsedShield(float p_36383_) { @@ -142,7 +142,7 @@ if (!this.level().isClientSide) { this.awardStat(Stats.ITEM_USED.get(this.useItem.getItem())); } -@@ -946,10 +_,13 @@ +@@ -949,10 +_,13 @@ @Override protected void actuallyHurt(ServerLevel p_365751_, DamageSource p_36312_, float p_36313_) { if (!this.isInvulnerableTo(p_365751_, p_36312_)) { @@ -156,7 +156,7 @@ float f = p_36313_ - f1; if (f > 0.0F && f < 3.4028235E37F) { this.awardStat(Stats.DAMAGE_ABSORBED, Math.round(f * 10.0F)); -@@ -1008,6 +_,10 @@ +@@ -1011,6 +_,10 @@ return InteractionResult.PASS; } else { @@ -167,7 +167,7 @@ ItemStack itemstack = this.getItemInHand(p_36159_); ItemStack itemstack1 = itemstack.copy(); InteractionResult interactionresult = p_36158_.interact(this, p_36159_); -@@ -1016,6 +_,10 @@ +@@ -1019,6 +_,10 @@ itemstack.setCount(itemstack1.getCount()); } @@ -178,7 +178,7 @@ return interactionresult; } else { if (!itemstack.isEmpty() && p_36158_ instanceof LivingEntity) { -@@ -1027,6 +_,7 @@ +@@ -1030,6 +_,7 @@ if (interactionresult1.consumesAction()) { this.level().gameEvent(GameEvent.ENTITY_INTERACT, p_36158_.position(), GameEvent.Context.of(this)); if (itemstack.isEmpty() && !this.abilities.instabuild) { @@ -186,7 +186,7 @@ this.setItemInHand(p_36159_, ItemStack.EMPTY); } -@@ -1126,6 +_,7 @@ +@@ -1129,6 +_,7 @@ } public void attack(Entity p_36347_) { @@ -194,7 +194,7 @@ if (p_36347_.isAttackable()) { if (!p_36347_.skipAttackInteraction(this)) { float f = this.isAutoSpinAttack() ? this.autoSpinAttackDmg : (float)this.getAttributeValue(Attributes.ATTACK_DAMAGE); -@@ -1163,8 +_,10 @@ +@@ -1166,8 +_,10 @@ && !this.isPassenger() && p_36347_ instanceof LivingEntity && !this.isSprinting(); @@ -206,7 +206,7 @@ } float f3 = f + f1; -@@ -1172,7 +_,7 @@ +@@ -1175,7 +_,7 @@ if (flag3 && !flag1 && !flag && this.onGround()) { double d0 = this.getKnownMovement().horizontalDistanceSqr(); double d1 = (double)this.getSpeed() * 2.5; @@ -215,7 +215,7 @@ flag2 = true; } } -@@ -1208,7 +_,7 @@ +@@ -1211,7 +_,7 @@ if (flag2) { float f7 = 1.0F + (float)this.getAttributeValue(Attributes.SWEEPING_DAMAGE_RATIO) * f; @@ -224,7 +224,7 @@ if (livingentity2 != this && livingentity2 != p_36347_ && !this.isAlliedTo(livingentity2) -@@ -1258,8 +_,8 @@ +@@ -1261,8 +_,8 @@ this.setLastHurtMob(p_36347_); Entity entity = p_36347_; @@ -235,7 +235,7 @@ } boolean flag5 = false; -@@ -1300,6 +_,7 @@ +@@ -1303,6 +_,7 @@ this.level().playSound(null, this.getX(), this.getY(), this.getZ(), SoundEvents.PLAYER_ATTACK_NODAMAGE, this.getSoundSource(), 1.0F, 1.0F); } } @@ -243,7 +243,7 @@ } } } -@@ -1384,6 +_,7 @@ +@@ -1387,6 +_,7 @@ } public void stopSleepInBed(boolean p_36226_, boolean p_36227_) { @@ -251,7 +251,7 @@ super.stopSleeping(); if (this.level() instanceof ServerLevel && p_36227_) { ((ServerLevel)this.level()).updateSleepingPlayerList(); -@@ -1492,6 +_,7 @@ +@@ -1495,6 +_,7 @@ @Override public boolean causeFallDamage(float p_150093_, float p_150094_, DamageSource p_150095_) { if (this.abilities.mayfly) { @@ -259,7 +259,7 @@ return false; } else { if (p_150093_ >= 2.0F) { -@@ -1550,13 +_,13 @@ +@@ -1553,13 +_,13 @@ protected void playStepSound(BlockPos p_282121_, BlockState p_282194_) { if (this.isInWater()) { this.waterSwimSound(); @@ -275,7 +275,7 @@ } else { super.playStepSound(blockpos, blockstate); } -@@ -1587,6 +_,12 @@ +@@ -1590,6 +_,12 @@ } public void giveExperiencePoints(int p_36291_) { @@ -288,7 +288,7 @@ this.increaseScore(p_36291_); this.experienceProgress = this.experienceProgress + (float)p_36291_ / (float)this.getXpNeededForNextLevel(); this.totalExperience = Mth.clamp(this.totalExperience + p_36291_, 0, Integer.MAX_VALUE); -@@ -1614,7 +_,7 @@ +@@ -1617,7 +_,7 @@ } public void onEnchantmentPerformed(ItemStack p_36172_, int p_36173_) { @@ -297,7 +297,7 @@ if (this.experienceLevel < 0) { this.experienceLevel = 0; this.experienceProgress = 0.0F; -@@ -1625,6 +_,12 @@ +@@ -1628,6 +_,12 @@ } public void giveExperienceLevels(int p_36276_) { @@ -310,7 +310,7 @@ this.experienceLevel = IntMath.saturatedAdd(this.experienceLevel, p_36276_); if (this.experienceLevel < 0) { this.experienceLevel = 0; -@@ -1828,7 +_,13 @@ +@@ -1831,7 +_,13 @@ @Override public Component getDisplayName() { @@ -325,7 +325,7 @@ return this.decorateDisplayNameComponent(mutablecomponent); } -@@ -1991,18 +_,19 @@ +@@ -1994,18 +_,19 @@ Predicate predicate = ((ProjectileWeaponItem)p_36349_.getItem()).getSupportedHeldProjectiles(); ItemStack itemstack = ProjectileWeaponItem.getHeldProjectile(this, predicate); if (!itemstack.isEmpty()) { @@ -348,7 +348,7 @@ } } } -@@ -2130,6 +_,65 @@ +@@ -2150,6 +_,65 @@ this.currentImpulseImpactPos = null; this.ignoreFallDamageFromCurrentImpulse = false; } diff --git a/patches/minecraft/net/minecraft/world/entity/projectile/AbstractArrow.java.patch b/patches/minecraft/net/minecraft/world/entity/projectile/AbstractArrow.java.patch index 016f5342b0..783805bbf7 100644 --- a/patches/minecraft/net/minecraft/world/entity/projectile/AbstractArrow.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/projectile/AbstractArrow.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/projectile/AbstractArrow.java +++ b/net/minecraft/world/entity/projectile/AbstractArrow.java -@@ -71,6 +_,7 @@ +@@ -73,6 +_,7 @@ private ItemStack pickupItemStack = this.getDefaultPickupItem(); @Nullable private ItemStack firedFromWeapon = null; @@ -8,7 +8,7 @@ protected AbstractArrow(EntityType p_332730_, Level p_335646_) { super(p_332730_, p_335646_); -@@ -189,7 +_,7 @@ +@@ -191,7 +_,7 @@ this.shakeTime--; } @@ -17,7 +17,7 @@ this.clearFire(); } -@@ -541,7 +_,7 @@ +@@ -556,7 +_,7 @@ protected boolean canHitEntity(Entity p_36743_) { return p_36743_ instanceof Player && this.getOwner() instanceof Player player && !player.canHarmPlayer((Player)p_36743_) ? false diff --git a/patches/minecraft/net/minecraft/world/entity/projectile/AbstractHurtingProjectile.java.patch b/patches/minecraft/net/minecraft/world/entity/projectile/AbstractHurtingProjectile.java.patch index 860193d65a..c8ce94f9eb 100644 --- a/patches/minecraft/net/minecraft/world/entity/projectile/AbstractHurtingProjectile.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/projectile/AbstractHurtingProjectile.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/projectile/AbstractHurtingProjectile.java +++ b/net/minecraft/world/entity/projectile/AbstractHurtingProjectile.java -@@ -90,7 +_,7 @@ +@@ -86,7 +_,7 @@ this.igniteForSeconds(1.0F); } diff --git a/patches/minecraft/net/minecraft/world/entity/projectile/Projectile.java.patch b/patches/minecraft/net/minecraft/world/entity/projectile/Projectile.java.patch index 9ddd84c0d8..61ef3eb469 100644 --- a/patches/minecraft/net/minecraft/world/entity/projectile/Projectile.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/projectile/Projectile.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/projectile/Projectile.java +++ b/net/minecraft/world/entity/projectile/Projectile.java -@@ -370,7 +_,7 @@ +@@ -359,7 +_,7 @@ @Override public boolean mayInteract(ServerLevel p_364907_, BlockPos p_150168_) { Entity entity = this.getOwner(); diff --git a/patches/minecraft/net/minecraft/world/inventory/ArmorSlot.java.patch b/patches/minecraft/net/minecraft/world/inventory/ArmorSlot.java.patch index 6a4255e393..59f3ccbc88 100644 --- a/patches/minecraft/net/minecraft/world/inventory/ArmorSlot.java.patch +++ b/patches/minecraft/net/minecraft/world/inventory/ArmorSlot.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/inventory/ArmorSlot.java +++ b/net/minecraft/world/inventory/ArmorSlot.java -@@ -39,7 +_,7 @@ +@@ -38,7 +_,7 @@ @Override public boolean mayPlace(ItemStack p_344267_) { diff --git a/patches/minecraft/net/minecraft/world/inventory/BrewingStandMenu.java.patch b/patches/minecraft/net/minecraft/world/inventory/BrewingStandMenu.java.patch index 8150b3d7df..7108e80639 100644 --- a/patches/minecraft/net/minecraft/world/inventory/BrewingStandMenu.java.patch +++ b/patches/minecraft/net/minecraft/world/inventory/BrewingStandMenu.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/inventory/BrewingStandMenu.java +++ b/net/minecraft/world/inventory/BrewingStandMenu.java -@@ -42,9 +_,9 @@ +@@ -45,9 +_,9 @@ this.brewingStand = p_39095_; this.brewingStandData = p_39096_; PotionBrewing potionbrewing = p_39094_.player.level().potionBrewing(); @@ -13,7 +13,7 @@ this.ingredientSlot = this.addSlot(new BrewingStandMenu.IngredientsSlot(potionbrewing, p_39095_, 3, 79, 17)); this.addSlot(new BrewingStandMenu.FuelSlot(p_39095_, 4, 17, 17)); this.addDataSlots(p_39096_); -@@ -72,7 +_,7 @@ +@@ -75,7 +_,7 @@ if (!this.moveItemStackTo(itemstack1, 3, 4, false)) { return ItemStack.EMPTY; } @@ -22,7 +22,7 @@ if (!this.moveItemStackTo(itemstack1, 0, 3, false)) { return ItemStack.EMPTY; } -@@ -149,12 +_,23 @@ +@@ -157,12 +_,23 @@ } public static class PotionSlot extends Slot { @@ -46,7 +46,7 @@ return mayPlaceItem(p_39132_); } -@@ -167,6 +_,7 @@ +@@ -175,6 +_,7 @@ public void onTake(Player p_150499_, ItemStack p_150500_) { Optional> optional = p_150500_.getOrDefault(DataComponents.POTION_CONTENTS, PotionContents.EMPTY).potion(); if (optional.isPresent() && p_150499_ instanceof ServerPlayer serverplayer) { diff --git a/patches/minecraft/net/minecraft/world/inventory/EnchantmentMenu.java.patch b/patches/minecraft/net/minecraft/world/inventory/EnchantmentMenu.java.patch index ccd659894a..6f681e40c5 100644 --- a/patches/minecraft/net/minecraft/world/inventory/EnchantmentMenu.java.patch +++ b/patches/minecraft/net/minecraft/world/inventory/EnchantmentMenu.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/inventory/EnchantmentMenu.java +++ b/net/minecraft/world/inventory/EnchantmentMenu.java -@@ -63,7 +_,7 @@ +@@ -62,7 +_,7 @@ this.addSlot(new Slot(this.enchantSlots, 1, 35, 47) { @Override public boolean mayPlace(ItemStack p_39517_) { @@ -9,7 +9,7 @@ } @Override -@@ -91,23 +_,25 @@ +@@ -90,23 +_,25 @@ if (!itemstack.isEmpty() && itemstack.isEnchantable()) { this.access.execute((p_341515_, p_341516_) -> { IdMap> idmap = p_341515_.registryAccess().lookupOrThrow(Registries.ENCHANTMENT).asHolderIdMap(); @@ -37,7 +37,7 @@ } for (int l = 0; l < 3; l++) { -@@ -234,7 +_,7 @@ +@@ -233,7 +_,7 @@ if (!this.moveItemStackTo(itemstack1, 2, 38, true)) { return ItemStack.EMPTY; } diff --git a/patches/minecraft/net/minecraft/world/inventory/Slot.java.patch b/patches/minecraft/net/minecraft/world/inventory/Slot.java.patch index a11d9ba593..b51036baf1 100644 --- a/patches/minecraft/net/minecraft/world/inventory/Slot.java.patch +++ b/patches/minecraft/net/minecraft/world/inventory/Slot.java.patch @@ -1,15 +1,15 @@ --- a/net/minecraft/world/inventory/Slot.java +++ b/net/minecraft/world/inventory/Slot.java -@@ -81,7 +_,7 @@ +@@ -80,7 +_,7 @@ @Nullable - public Pair getNoItemIcon() { + public ResourceLocation getNoItemIcon() { - return null; -+ return backgroundPair; ++ return background; } public ItemStack remove(int p_40227_) { -@@ -162,5 +_,37 @@ +@@ -161,5 +_,36 @@ public boolean isFake() { return false; @@ -34,16 +34,15 @@ + return this.container == other.container; + } + -+ private Pair backgroundPair; ++ private ResourceLocation background; + /** + * Sets the background atlas and sprite location. + * -+ * @param atlas The atlas name + * @param sprite The sprite located on that atlas. + * @return this, to allow chaining. + */ -+ public Slot setBackground(ResourceLocation atlas, ResourceLocation sprite) { -+ this.backgroundPair = Pair.of(atlas, sprite); ++ public Slot setBackground(ResourceLocation sprite) { ++ this.background = sprite; + return this; } } diff --git a/patches/minecraft/net/minecraft/world/item/BlockItem.java.patch b/patches/minecraft/net/minecraft/world/item/BlockItem.java.patch index 866ffd8e43..2ee13fedb2 100644 --- a/patches/minecraft/net/minecraft/world/item/BlockItem.java.patch +++ b/patches/minecraft/net/minecraft/world/item/BlockItem.java.patch @@ -29,7 +29,7 @@ @Nullable public BlockPlaceContext updatePlacementContext(BlockPlaceContext p_40609_) { return p_40609_; -@@ -180,6 +_,10 @@ +@@ -202,6 +_,10 @@ public void registerBlocks(Map p_40607_, Item p_40608_) { p_40607_.put(this.getBlock(), p_40608_); diff --git a/patches/minecraft/net/minecraft/world/item/BundleItem.java.patch b/patches/minecraft/net/minecraft/world/item/BundleItem.java.patch index e1c1329dcc..b9b75883e1 100644 --- a/patches/minecraft/net/minecraft/world/item/BundleItem.java.patch +++ b/patches/minecraft/net/minecraft/world/item/BundleItem.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/item/BundleItem.java +++ b/net/minecraft/world/item/BundleItem.java -@@ -98,6 +_,7 @@ +@@ -85,6 +_,7 @@ @Override public boolean overrideOtherStackedOnMe(ItemStack p_150742_, ItemStack p_150743_, Slot p_150744_, ClickAction p_150745_, Player p_150746_, SlotAccess p_150747_) { diff --git a/patches/minecraft/net/minecraft/world/item/CrossbowItem.java.patch b/patches/minecraft/net/minecraft/world/item/CrossbowItem.java.patch index f2df8f9c1a..47c8da301d 100644 --- a/patches/minecraft/net/minecraft/world/item/CrossbowItem.java.patch +++ b/patches/minecraft/net/minecraft/world/item/CrossbowItem.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/item/CrossbowItem.java +++ b/net/minecraft/world/item/CrossbowItem.java -@@ -185,6 +_,7 @@ +@@ -186,6 +_,7 @@ Level p_40888_, LivingEntity p_40889_, InteractionHand p_40890_, ItemStack p_40891_, float p_40892_, float p_40893_, @Nullable LivingEntity p_329478_ ) { if (p_40888_ instanceof ServerLevel serverlevel) { diff --git a/patches/minecraft/net/minecraft/world/item/DyeColor.java.patch b/patches/minecraft/net/minecraft/world/item/DyeColor.java.patch index dd31f0012a..7b449c98f9 100644 --- a/patches/minecraft/net/minecraft/world/item/DyeColor.java.patch +++ b/patches/minecraft/net/minecraft/world/item/DyeColor.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/item/DyeColor.java +++ b/net/minecraft/world/item/DyeColor.java -@@ -44,6 +_,8 @@ +@@ -49,6 +_,8 @@ private final int textureDiffuseColor; private final int fireworkColor; private final int textColor; @@ -9,7 +9,7 @@ private DyeColor(final int p_41046_, final String p_41047_, final int p_41048_, final MapColor p_285297_, final int p_41050_, final int p_41051_) { this.id = p_41046_; -@@ -52,6 +_,8 @@ +@@ -57,6 +_,8 @@ this.textColor = p_41051_; this.textureDiffuseColor = ARGB.opaque(p_41048_); this.fireworkColor = p_41050_; @@ -18,7 +18,7 @@ } public int getId() { -@@ -102,5 +_,26 @@ +@@ -107,6 +_,27 @@ @Override public String getSerializedName() { return this.name; @@ -44,4 +44,5 @@ + public static DyeColor getColor(ItemStack stack) { + return net.minecraftforge.common.ForgeHooks.getDyeColorFromItemStack(stack); } - } + + public static DyeColor getMixedColor(ServerLevel p_377753_, DyeColor p_378336_, DyeColor p_376650_) { diff --git a/patches/minecraft/net/minecraft/world/item/Item.java.patch b/patches/minecraft/net/minecraft/world/item/Item.java.patch index 6e59375416..7751ee45bd 100644 --- a/patches/minecraft/net/minecraft/world/item/Item.java.patch +++ b/patches/minecraft/net/minecraft/world/item/Item.java.patch @@ -65,8 +65,8 @@ public final ItemStack getCraftingRemainder() { return this.craftingRemainingItem == null ? ItemStack.EMPTY : new ItemStack(this.craftingRemainingItem); } -@@ -318,6 +_,30 @@ - return this.requiredFeatures; +@@ -322,6 +_,30 @@ + return false; } + private Object renderProperties; @@ -96,7 +96,7 @@ public static class Properties { private static final DependantName BLOCK_DESCRIPTION_ID = p_367498_ -> Util.makeDescriptionId("block", p_367498_.location()); private static final DependantName ITEM_DESCRIPTION_ID = p_367603_ -> Util.makeDescriptionId("item", p_367603_.location()); -@@ -483,6 +_,11 @@ +@@ -482,6 +_,11 @@ @Nullable MapItemSavedData mapData(MapId p_335695_); @@ -108,7 +108,7 @@ static Item.TooltipContext of(@Nullable final Level p_332083_) { return p_332083_ == null ? EMPTY : new Item.TooltipContext() { @Override -@@ -498,6 +_,11 @@ +@@ -497,6 +_,11 @@ @Override public MapItemSavedData mapData(MapId p_330171_) { return p_332083_.getMapData(p_330171_); diff --git a/patches/minecraft/net/minecraft/world/item/ItemStack.java.patch b/patches/minecraft/net/minecraft/world/item/ItemStack.java.patch index a1e2aeca0d..68aa435c7b 100644 --- a/patches/minecraft/net/minecraft/world/item/ItemStack.java.patch +++ b/patches/minecraft/net/minecraft/world/item/ItemStack.java.patch @@ -6,10 +6,10 @@ -public final class ItemStack implements DataComponentHolder { +public final class ItemStack implements DataComponentHolder, net.minecraftforge.common.extensions.IForgeItemStack { - public static final Codec CODEC = Codec.lazyInitialized( - () -> RecordCodecBuilder.create( - p_359412_ -> p_359412_.group( -@@ -348,13 +_,22 @@ + private static final List OP_NBT_WARNING = List.of( + Component.translatable("item.op_warning.line1").withStyle(ChatFormatting.RED, ChatFormatting.BOLD), + Component.translatable("item.op_warning.line2").withStyle(ChatFormatting.RED), +@@ -357,13 +_,22 @@ } public InteractionResult useOn(UseOnContext p_41662_) { @@ -33,7 +33,7 @@ if (player != null && interactionresult instanceof InteractionResult.Success interactionresult$success && interactionresult$success.wasItemInteraction()) { player.awardStat(Stats.ITEM_USED.get(item)); } -@@ -507,7 +_,13 @@ +@@ -516,7 +_,13 @@ p_41623_, serverlevel, p_41624_ instanceof ServerPlayer serverplayer ? serverplayer : null, @@ -48,8 +48,8 @@ ); } } -@@ -856,6 +_,8 @@ - list.add(DISABLED_ITEM_TOOLTIP); +@@ -876,6 +_,8 @@ + list.addAll(OP_NBT_WARNING); } + net.minecraftforge.event.ForgeEventFactory.onItemTooltip(this, p_41652_, list, p_41653_); @@ -57,7 +57,7 @@ return list; } } -@@ -1082,6 +_,7 @@ +@@ -1102,6 +_,7 @@ this.getItem().onUseTick(p_41732_, p_41733_, this, p_41734_); } diff --git a/patches/minecraft/net/minecraft/world/item/Items.java.patch b/patches/minecraft/net/minecraft/world/item/Items.java.patch index 149d0da6f7..93e1bdc37a 100644 --- a/patches/minecraft/net/minecraft/world/item/Items.java.patch +++ b/patches/minecraft/net/minecraft/world/item/Items.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/item/Items.java +++ b/net/minecraft/world/item/Items.java -@@ -2103,7 +_,25 @@ +@@ -2078,7 +_,25 @@ } public static Item registerBlock(Block p_252092_, Block... p_248886_) { @@ -27,7 +27,7 @@ for (Block block : p_248886_) { Item.BY_BLOCK.put(block, item); -@@ -2142,10 +_,6 @@ +@@ -2117,10 +_,6 @@ public static Item registerItem(ResourceKey p_364577_, Function p_366144_, Item.Properties p_369845_) { Item item = p_366144_.apply(p_369845_.setId(p_364577_)); diff --git a/patches/minecraft/net/minecraft/world/item/MobBucketItem.java.patch b/patches/minecraft/net/minecraft/world/item/MobBucketItem.java.patch index c4062370c4..a48818eed9 100644 --- a/patches/minecraft/net/minecraft/world/item/MobBucketItem.java.patch +++ b/patches/minecraft/net/minecraft/world/item/MobBucketItem.java.patch @@ -4,20 +4,20 @@ public class MobBucketItem extends BucketItem { private static final MapCodec VARIANT_FIELD_CODEC = TropicalFish.Variant.CODEC.fieldOf("BucketVariantTag"); -- private final EntityType type; +- private final EntityType type; - private final SoundEvent emptySound; -+ private final java.util.function.Supplier> entityTypeSupplier; ++ private final java.util.function.Supplier> entityTypeSupplier; + private final java.util.function.Supplier emptySoundSupplier; + @Deprecated - public MobBucketItem(EntityType p_151137_, Fluid p_151138_, SoundEvent p_151139_, Item.Properties p_151140_) { + public MobBucketItem(EntityType p_151137_, Fluid p_151138_, SoundEvent p_151139_, Item.Properties p_151140_) { - super(p_151138_, p_151140_); - this.type = p_151137_; - this.emptySound = p_151139_; + this(() -> p_151137_, () -> p_151138_, () -> p_151139_, p_151140_); + } + -+ public MobBucketItem(java.util.function.Supplier> entitySupplier, java.util.function.Supplier fluidSupplier, java.util.function.Supplier soundSupplier, Item.Properties properties) { ++ public MobBucketItem(java.util.function.Supplier> entitySupplier, java.util.function.Supplier fluidSupplier, java.util.function.Supplier soundSupplier, Item.Properties properties) { + super(fluidSupplier, properties); + this.emptySoundSupplier = soundSupplier; + this.entityTypeSupplier = entitySupplier; @@ -33,12 +33,12 @@ } private void spawn(ServerLevel p_151142_, ItemStack p_151143_, BlockPos p_151144_) { -- Entity entity = this.type.create(p_151142_, EntityType.createDefaultStackConfig(p_151142_, p_151143_, null), p_151144_, EntitySpawnReason.BUCKET, true, false); -+ Entity entity = this.getFishType().create(p_151142_, EntityType.createDefaultStackConfig(p_151142_, p_151143_, null), p_151144_, EntitySpawnReason.BUCKET, true, false); - if (entity instanceof Bucketable bucketable) { +- Mob mob = this.type.create(p_151142_, EntityType.createDefaultStackConfig(p_151142_, p_151143_, null), p_151144_, EntitySpawnReason.BUCKET, true, false); ++ Mob mob = this.getFishType().create(p_151142_, EntityType.createDefaultStackConfig(p_151142_, p_151143_, null), p_151144_, EntitySpawnReason.BUCKET, true, false); + if (mob instanceof Bucketable bucketable) { CustomData customdata = p_151143_.getOrDefault(DataComponents.BUCKET_ENTITY_DATA, CustomData.EMPTY); bucketable.loadFromBucketTag(customdata.copyTag()); -@@ -63,7 +_,7 @@ +@@ -64,7 +_,7 @@ @Override public void appendHoverText(ItemStack p_151155_, Item.TooltipContext p_329546_, List p_151157_, TooltipFlag p_151158_) { @@ -47,13 +47,13 @@ CustomData customdata = p_151155_.getOrDefault(DataComponents.BUCKET_ENTITY_DATA, CustomData.EMPTY); if (customdata.isEmpty()) { return; -@@ -91,5 +_,13 @@ +@@ -92,5 +_,13 @@ p_151157_.add(mutablecomponent); } } + } + -+ protected EntityType getFishType() { ++ protected EntityType getFishType() { + return entityTypeSupplier.get(); + } + diff --git a/patches/minecraft/net/minecraft/world/item/SpawnEggItem.java.patch b/patches/minecraft/net/minecraft/world/item/SpawnEggItem.java.patch index 40753ae515..e4b78cdd22 100644 --- a/patches/minecraft/net/minecraft/world/item/SpawnEggItem.java.patch +++ b/patches/minecraft/net/minecraft/world/item/SpawnEggItem.java.patch @@ -1,49 +1,13 @@ --- a/net/minecraft/world/item/SpawnEggItem.java +++ b/net/minecraft/world/item/SpawnEggItem.java -@@ -41,11 +_,13 @@ - private final int highlightColor; - private final EntityType defaultType; - -+ /** @deprecated Forge: Use {@link net.minecraftforge.common.ForgeSpawnEggItem} instead for suppliers */ - public SpawnEggItem(EntityType p_43207_, int p_43208_, int p_43209_, Item.Properties p_43210_) { - super(p_43210_); - this.defaultType = p_43207_; - this.backgroundColor = p_43208_; - this.highlightColor = p_43209_; -+ if (p_43207_ != null) - BY_ID.put(p_43207_, this); +@@ -143,6 +_,10 @@ + return this.defaultType; } -@@ -131,6 +_,7 @@ - return p_43212_ == 0 ? this.backgroundColor : this.highlightColor; - } - -+ /** @deprecated Forge: call {@link net.minecraftforge.common.ForgeSpawnEggItem#fromEntityType(EntityType)} instead */ - @Nullable - public static SpawnEggItem byId(@Nullable EntityType p_43214_) { - return BY_ID.get(p_43214_); -@@ -142,12 +_,12 @@ - - public EntityType getType(ItemStack p_334231_) { - CustomData customdata = p_334231_.getOrDefault(DataComponents.ENTITY_DATA, CustomData.EMPTY); -- return !customdata.isEmpty() ? customdata.read(ENTITY_TYPE_FIELD_CODEC).result().orElse(this.defaultType) : this.defaultType; -+ return !customdata.isEmpty() ? customdata.read(ENTITY_TYPE_FIELD_CODEC).result().orElse(this.getDefaultType()) : this.getDefaultType(); - } - - @Override - public FeatureFlagSet requiredFeatures() { -- return this.defaultType.requiredFeatures(); -+ return this.getDefaultType().requiredFeatures(); - } - - public Optional spawnOffspringFromSpawnEgg(Player p_43216_, Mob p_43217_, EntityType p_43218_, ServerLevel p_43219_, Vec3 p_43220_, ItemStack p_43221_) { -@@ -176,5 +_,9 @@ - } - } - } ++ public EntityType getDefaultType() { ++ return this.defaultType; + } + -+ protected EntityType getDefaultType() { -+ return defaultType; - } - } + @Override + public FeatureFlagSet requiredFeatures() { + return this.defaultType.requiredFeatures(); diff --git a/patches/minecraft/net/minecraft/world/item/crafting/Ingredient.java.patch b/patches/minecraft/net/minecraft/world/item/crafting/Ingredient.java.patch index 638930092f..5e0c8d5860 100644 --- a/patches/minecraft/net/minecraft/world/item/crafting/Ingredient.java.patch +++ b/patches/minecraft/net/minecraft/world/item/crafting/Ingredient.java.patch @@ -1,9 +1,9 @@ --- a/net/minecraft/world/item/crafting/Ingredient.java +++ b/net/minecraft/world/item/crafting/Ingredient.java -@@ -24,20 +_,28 @@ +@@ -23,18 +_,26 @@ import net.minecraft.world.level.ItemLike; - public class Ingredient implements Predicate { + public class Ingredient implements StackedContents.IngredientInfo>, Predicate { - public static final StreamCodec CONTENTS_STREAM_CODEC = ByteBufCodecs.holderSet(Registries.ITEM) + private static final StreamCodec VANILLA_CONTENTS_STREAM_CODEC = ByteBufCodecs.holderSet(Registries.ITEM) .map(Ingredient::new, p_359816_ -> p_359816_.values); @@ -13,7 +13,7 @@ .map( - p_359814_ -> p_359814_.size() == 0 ? Optional.empty() : Optional.of(new Ingredient((HolderSet)p_359814_)), - p_359815_ -> p_359815_.>map(p_359810_ -> p_359810_.values).orElse(HolderSet.direct()) -+ ingredient -> ingredient.items().isEmpty() ? Optional.empty() : Optional.of(ingredient), ++ ingredient -> ingredient.items().count() == 0 ? Optional.empty() : Optional.of(ingredient), + ingredient -> ingredient.orElseGet(() -> Ingredient.of()) ); public static final Codec> NON_AIR_HOLDER_SET_CODEC = HolderSetCodec.create(Registries.ITEM, Item.CODEC, false); @@ -23,8 +23,6 @@ + private static final com.mojang.serialization.MapCodec VANILLA_MAP_CODEC = VANILLA_CODEC.fieldOf("value"); + public static final Codec CODEC = net.minecraftforge.common.ForgeHooks.ingredientBaseCodec(VANILLA_CODEC); + protected final HolderSet values; - @Nullable - private List> items; protected Ingredient(HolderSet p_368516_) { + this(p_368516_, true); @@ -35,7 +33,7 @@ p_368516_.unwrap().ifRight(p_359817_ -> { if (p_359817_.isEmpty()) { throw new UnsupportedOperationException("Ingredients can't be empty"); -@@ -112,5 +_,50 @@ +@@ -106,5 +_,50 @@ } else { return slotdisplay; } diff --git a/patches/minecraft/net/minecraft/world/item/crafting/RecipeManager.java.patch b/patches/minecraft/net/minecraft/world/item/crafting/RecipeManager.java.patch index f4911a4ec4..e5a8406bbc 100644 --- a/patches/minecraft/net/minecraft/world/item/crafting/RecipeManager.java.patch +++ b/patches/minecraft/net/minecraft/world/item/crafting/RecipeManager.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/item/crafting/RecipeManager.java +++ b/net/minecraft/world/item/crafting/RecipeManager.java -@@ -61,15 +_,24 @@ +@@ -63,14 +_,21 @@ private SelectableRecipe.SingleInputSet stonecutterRecipes = SelectableRecipe.SingleInputSet.empty(); private List allDisplays = List.of(); private Map>, List> recipeToDisplay = Map.of(); @@ -18,14 +18,11 @@ protected RecipeMap prepare(ResourceManager p_368640_, ProfilerFiller p_361102_) { SortedMap> sortedmap = new TreeMap<>(); - SimpleJsonResourceReloadListener.scanDirectory( -- p_368640_, Registries.elementsDirPath(Registries.RECIPE), this.registries.createSerializationContext(JsonOps.INSTANCE), Recipe.CODEC, sortedmap -+ p_368640_, Registries.elementsDirPath(Registries.RECIPE), this.registries.createSerializationContext(JsonOps.INSTANCE) -+ .withContext(net.minecraftforge.common.crafting.conditions.ICondition.IContext.KEY, this.context), -+ Recipe.CODEC, sortedmap - ); +- SimpleJsonResourceReloadListener.scanDirectory(p_368640_, RECIPE_LISTER, this.registries.createSerializationContext(JsonOps.INSTANCE), Recipe.CODEC, sortedmap); ++ SimpleJsonResourceReloadListener.scanDirectory(p_368640_, RECIPE_LISTER, this.context.wrap(this.registries.createSerializationContext(JsonOps.INSTANCE)), Recipe.CODEC, sortedmap); List> list = new ArrayList<>(sortedmap.size()); sortedmap.forEach((p_359835_, p_359836_) -> { + ResourceKey> resourcekey = ResourceKey.create(Registries.RECIPE, p_359835_); @@ -86,6 +_,7 @@ } diff --git a/patches/minecraft/net/minecraft/world/level/Level.java.patch b/patches/minecraft/net/minecraft/world/level/Level.java.patch index 2b967f294a..c03ff89364 100644 --- a/patches/minecraft/net/minecraft/world/level/Level.java.patch +++ b/patches/minecraft/net/minecraft/world/level/Level.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java -@@ -78,7 +_,7 @@ +@@ -79,7 +_,7 @@ import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.Scoreboard; @@ -9,7 +9,7 @@ public static final Codec> RESOURCE_KEY_CODEC = ResourceKey.codec(Registries.DIMENSION); public static final ResourceKey OVERWORLD = ResourceKey.create(Registries.DIMENSION, ResourceLocation.withDefaultNamespace("overworld")); public static final ResourceKey NETHER = ResourceKey.create(Registries.DIMENSION, ResourceLocation.withDefaultNamespace("the_nether")); -@@ -115,6 +_,11 @@ +@@ -116,6 +_,11 @@ private final RegistryAccess registryAccess; private final DamageSources damageSources; private long subTickCount; @@ -21,7 +21,7 @@ protected Level( WritableLevelData p_270739_, -@@ -126,6 +_,7 @@ +@@ -127,6 +_,7 @@ long p_270248_, int p_270466_ ) { @@ -29,7 +29,7 @@ this.levelData = p_270739_; this.dimensionTypeRegistration = p_270240_; final DimensionType dimensiontype = p_270240_.value(); -@@ -215,11 +_,35 @@ +@@ -216,11 +_,35 @@ } else { LevelChunk levelchunk = this.getChunkAt(p_46605_); Block block = p_46606_.getBlock(); @@ -65,7 +65,7 @@ if (blockstate1 == p_46606_) { if (blockstate != blockstate1) { this.setBlocksDirty(p_46605_, blockstate, blockstate1); -@@ -246,9 +_,8 @@ +@@ -247,9 +_,8 @@ } this.onBlockStateChange(p_46605_, blockstate, blockstate1); @@ -76,7 +76,7 @@ } } } -@@ -490,10 +_,30 @@ +@@ -499,10 +_,30 @@ (this.tickingBlockEntities ? this.pendingBlockEntityTickers : this.blockEntityTickers).add(p_151526_); } @@ -107,7 +107,7 @@ if (!this.pendingBlockEntityTickers.isEmpty()) { this.blockEntityTickers.addAll(this.pendingBlockEntityTickers); this.pendingBlockEntityTickers.clear(); -@@ -517,12 +_,19 @@ +@@ -526,12 +_,19 @@ public void guardEntityTick(Consumer p_46654_, T p_46655_) { try { @@ -127,7 +127,7 @@ } } -@@ -674,6 +_,7 @@ +@@ -683,6 +_,7 @@ if (!this.isOutsideBuildHeight(p_46748_)) { this.getChunkAt(p_46748_).removeBlockEntity(p_46748_); } @@ -135,18 +135,19 @@ } public boolean isLoaded(BlockPos p_46750_) { -@@ -750,8 +_,8 @@ - list.add(p_151522_); +@@ -760,9 +_,9 @@ } + }); -- if (p_151522_ instanceof EnderDragon) { -- for (EnderDragonPart enderdragonpart : ((EnderDragon)p_151522_).getSubEntities()) { -+ if (p_151522_.isMultipartEntity()) { -+ for (var enderdragonpart : p_151522_.getParts()) { - if (p_151522_ != p_46536_ && p_46538_.test(enderdragonpart)) { - list.add(enderdragonpart); - } -@@ -784,8 +_,8 @@ +- for (EnderDragonPart enderdragonpart : this.dragonParts()) { ++ for (var enderdragonpart : this.getPartEntities()) { + if (enderdragonpart != p_46536_ +- && enderdragonpart.parentMob != p_46536_ ++ && enderdragonpart.getParent() != p_46536_ + && p_46538_.test(enderdragonpart) + && p_46537_.intersects(enderdragonpart.getBoundingBox())) { + list.add(enderdragonpart); +@@ -795,8 +_,8 @@ } } @@ -157,7 +158,7 @@ T t = p_261885_.tryCast(enderdragonpart); if (t != null && p_261688_.test(t)) { p_262071_.add(t); -@@ -919,16 +_,15 @@ +@@ -932,16 +_,15 @@ public abstract Scoreboard getScoreboard(); public void updateNeighbourForOutputSignal(BlockPos p_46718_, Block p_46719_) { @@ -178,7 +179,7 @@ this.neighborChanged(blockstate, blockpos, p_46719_, null, false); } } -@@ -1031,6 +_,20 @@ +@@ -1044,6 +_,20 @@ } public abstract PotionBrewing potionBrewing(); diff --git a/patches/minecraft/net/minecraft/world/level/biome/Biome.java.patch b/patches/minecraft/net/minecraft/world/level/biome/Biome.java.patch index 59b415f331..90d4c994f0 100644 --- a/patches/minecraft/net/minecraft/world/level/biome/Biome.java.patch +++ b/patches/minecraft/net/minecraft/world/level/biome/Biome.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/biome/Biome.java +++ b/net/minecraft/world/level/biome/Biome.java -@@ -35,8 +_,8 @@ +@@ -36,8 +_,8 @@ public final class Biome { public static final Codec DIRECT_CODEC = RecordCodecBuilder.create( p_220544_ -> p_220544_.group( @@ -11,7 +11,7 @@ BiomeGenerationSettings.CODEC.forGetter(p_220548_ -> p_220548_.generationSettings), MobSpawnSettings.CODEC.forGetter(p_220546_ -> p_220546_.mobSettings) ) -@@ -58,8 +_,10 @@ +@@ -59,8 +_,10 @@ ) public static final PerlinSimplexNoise BIOME_INFO_NOISE = new PerlinSimplexNoise(new WorldgenRandom(new LegacyRandomSource(2345L)), ImmutableList.of(0)); private static final int TEMPERATURE_CACHE_SIZE = 1024; @@ -22,7 +22,7 @@ private final MobSpawnSettings mobSettings; private final BiomeSpecialEffects specialEffects; private final ThreadLocal temperatureCache = ThreadLocal.withInitial(() -> Util.make(() -> { -@@ -71,12 +_,14 @@ +@@ -72,12 +_,14 @@ long2floatlinkedopenhashmap.defaultReturnValue(Float.NaN); return long2floatlinkedopenhashmap; })); @@ -37,7 +37,7 @@ } public int getSkyColor() { -@@ -84,7 +_,7 @@ +@@ -85,7 +_,7 @@ } public MobSpawnSettings getMobSettings() { @@ -46,7 +46,7 @@ } public boolean hasPrecipitation() { -@@ -186,7 +_,7 @@ +@@ -187,7 +_,7 @@ } public BiomeGenerationSettings getGenerationSettings() { @@ -55,10 +55,10 @@ } public int getFogColor() { -@@ -248,6 +_,31 @@ +@@ -253,6 +_,31 @@ - public Optional getBackgroundMusic() { - return this.specialEffects.getBackgroundMusic(); + public float getBackgroundMusicVolume() { + return this.specialEffects.getBackgroundMusicVolume(); + } + + /** diff --git a/patches/minecraft/net/minecraft/world/level/biome/BiomeSpecialEffects.java.patch b/patches/minecraft/net/minecraft/world/level/biome/BiomeSpecialEffects.java.patch index 84809c8087..ca29e1d4fd 100644 --- a/patches/minecraft/net/minecraft/world/level/biome/BiomeSpecialEffects.java.patch +++ b/patches/minecraft/net/minecraft/world/level/biome/BiomeSpecialEffects.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/biome/BiomeSpecialEffects.java +++ b/net/minecraft/world/level/biome/BiomeSpecialEffects.java -@@ -212,7 +_,7 @@ +@@ -242,7 +_,7 @@ } } @@ -9,7 +9,7 @@ NONE("none") { @Override public int modifyColor(double p_48081_, double p_48082_, int p_48083_) { -@@ -234,11 +_,16 @@ +@@ -264,11 +_,16 @@ }; private final String name; @@ -29,7 +29,7 @@ GrassColorModifier(final String p_48058_) { this.name = p_48058_; -@@ -251,6 +_,30 @@ +@@ -281,6 +_,30 @@ @Override public String getSerializedName() { return this.name; diff --git a/patches/minecraft/net/minecraft/world/level/block/Block.java.patch b/patches/minecraft/net/minecraft/world/level/block/Block.java.patch index 81554ee531..e3f1bbc958 100644 --- a/patches/minecraft/net/minecraft/world/level/block/Block.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/Block.java.patch @@ -91,20 +91,15 @@ } public void setPlacedBy(Level p_49847_, BlockPos p_49848_, BlockState p_49849_, @Nullable LivingEntity p_49850_, ItemStack p_49851_) { -@@ -375,10 +_,12 @@ +@@ -375,6 +_,7 @@ p_49822_.setDeltaMovement(p_49822_.getDeltaMovement().multiply(1.0, 0.0, 1.0)); } -+ /** @deprecated Forge use {@link IForgeBlock#getCloneItemStack(BlockState, HitResult, LevelReader, BlockPos, Player)}*/ - public ItemStack getCloneItemStack(LevelReader p_312699_, BlockPos p_49824_, BlockState p_49825_) { - return new ItemStack(this); - } - + /** @deprecated Forge use {@link IForgeStateBlock#getFriction(Level, BlockPos, Entity)}*/ public float getFriction() { return this.friction; } -@@ -449,7 +_,7 @@ +@@ -445,7 +_,7 @@ this.item = Item.byBlock(this); } @@ -113,7 +108,7 @@ } public boolean hasDynamicShape() { -@@ -501,5 +_,74 @@ +@@ -497,5 +_,74 @@ public int hashCode() { return System.identityHashCode(this.first) * 31 + System.identityHashCode(this.second); } diff --git a/patches/minecraft/net/minecraft/world/level/block/Blocks.java.patch b/patches/minecraft/net/minecraft/world/level/block/Blocks.java.patch index ab27f9a985..66fa8841cd 100644 --- a/patches/minecraft/net/minecraft/world/level/block/Blocks.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/Blocks.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/Blocks.java +++ b/net/minecraft/world/level/block/Blocks.java -@@ -766,7 +_,7 @@ +@@ -758,7 +_,7 @@ public static final Block RED_BED = registerBed("red_bed", DyeColor.RED); public static final Block BLACK_BED = registerBed("black_bed", DyeColor.BLACK); public static final Block POWERED_RAIL = register( @@ -9,7 +9,7 @@ ); public static final Block DETECTOR_RAIL = register( "detector_rail", DetectorRailBlock::new, BlockBehaviour.Properties.of().noCollission().strength(0.7F).sound(SoundType.METAL) -@@ -6552,14 +_,5 @@ +@@ -6585,14 +_,5 @@ private static Block register(String p_50796_, BlockBehaviour.Properties p_362760_) { return register(p_50796_, Block::new, p_362760_); diff --git a/patches/minecraft/net/minecraft/world/level/block/CampfireBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/CampfireBlock.java.patch index 927f77d8db..4db887cbad 100644 --- a/patches/minecraft/net/minecraft/world/level/block/CampfireBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/CampfireBlock.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/CampfireBlock.java +++ b/net/minecraft/world/level/block/CampfireBlock.java -@@ -292,7 +_,7 @@ +@@ -287,7 +_,7 @@ return true; } diff --git a/patches/minecraft/net/minecraft/world/level/block/ChestBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/ChestBlock.java.patch index 47e4ad187d..05a8241fdc 100644 --- a/patches/minecraft/net/minecraft/world/level/block/ChestBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/ChestBlock.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/ChestBlock.java +++ b/net/minecraft/world/level/block/ChestBlock.java -@@ -365,7 +_,8 @@ +@@ -360,7 +_,8 @@ @Override protected BlockState mirror(BlockState p_51549_, Mirror p_51550_) { diff --git a/patches/minecraft/net/minecraft/world/level/block/FlowerPotBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/FlowerPotBlock.java.patch index 6644feaa44..f87a51ddea 100644 --- a/patches/minecraft/net/minecraft/world/level/block/FlowerPotBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/FlowerPotBlock.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/FlowerPotBlock.java +++ b/net/minecraft/world/level/block/FlowerPotBlock.java -@@ -43,9 +_,31 @@ +@@ -45,9 +_,31 @@ } public FlowerPotBlock(Block p_53528_, BlockBehaviour.Properties p_53529_) { @@ -35,7 +35,7 @@ } @Override -@@ -58,7 +_,7 @@ +@@ -60,7 +_,7 @@ ItemStack p_329639_, BlockState p_328047_, Level p_328816_, BlockPos p_334572_, Player p_329206_, InteractionHand p_329142_, BlockHitResult p_330607_ ) { BlockState blockstate = (p_329639_.getItem() instanceof BlockItem blockitem @@ -44,7 +44,7 @@ : Blocks.AIR) .defaultBlockState(); if (blockstate.isAir()) { -@@ -84,7 +_,7 @@ +@@ -86,7 +_,7 @@ p_333787_.drop(itemstack, false); } @@ -53,7 +53,7 @@ p_334489_.gameEvent(p_333787_, GameEvent.BLOCK_CHANGE, p_330334_); return InteractionResult.SUCCESS; } -@@ -116,11 +_,30 @@ +@@ -118,7 +_,7 @@ } public Block getPotted() { @@ -62,8 +62,10 @@ } @Override - protected boolean isPathfindable(BlockState p_53535_, PathComputationType p_53538_) { - return false; +@@ -153,5 +_,24 @@ + } else { + return p_376074_.is(Blocks.POTTED_CLOSED_EYEBLOSSOM) ? Blocks.POTTED_OPEN_EYEBLOSSOM.defaultBlockState() : p_376074_; + } + } + + private final Map> fullPots; diff --git a/patches/minecraft/net/minecraft/world/level/block/SculkCatalystBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/SculkCatalystBlock.java.patch index 9d54d480b1..5ccbcb116e 100644 --- a/patches/minecraft/net/minecraft/world/level/block/SculkCatalystBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/SculkCatalystBlock.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/SculkCatalystBlock.java +++ b/net/minecraft/world/level/block/SculkCatalystBlock.java -@@ -66,8 +_,13 @@ +@@ -61,8 +_,13 @@ @Override protected void spawnAfterBreak(BlockState p_222109_, ServerLevel p_222110_, BlockPos p_222111_, ItemStack p_222112_, boolean p_222113_) { super.spawnAfterBreak(p_222109_, p_222110_, p_222111_, p_222112_, p_222113_); diff --git a/patches/minecraft/net/minecraft/world/level/block/SculkSensorBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/SculkSensorBlock.java.patch index 583f080f8a..cd50666b90 100644 --- a/patches/minecraft/net/minecraft/world/level/block/SculkSensorBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/SculkSensorBlock.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/SculkSensorBlock.java +++ b/net/minecraft/world/level/block/SculkSensorBlock.java -@@ -301,8 +_,13 @@ +@@ -296,8 +_,13 @@ @Override protected void spawnAfterBreak(BlockState p_222142_, ServerLevel p_222143_, BlockPos p_222144_, ItemStack p_222145_, boolean p_222146_) { super.spawnAfterBreak(p_222142_, p_222143_, p_222144_, p_222145_, p_222146_); diff --git a/patches/minecraft/net/minecraft/world/level/block/SculkShriekerBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/SculkShriekerBlock.java.patch index f0db06e76a..d478bf836d 100644 --- a/patches/minecraft/net/minecraft/world/level/block/SculkShriekerBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/SculkShriekerBlock.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/SculkShriekerBlock.java +++ b/net/minecraft/world/level/block/SculkShriekerBlock.java -@@ -148,7 +_,7 @@ +@@ -143,7 +_,7 @@ @Override protected void spawnAfterBreak(BlockState p_222192_, ServerLevel p_222193_, BlockPos p_222194_, ItemStack p_222195_, boolean p_222196_) { super.spawnAfterBreak(p_222192_, p_222193_, p_222194_, p_222195_, p_222196_); @@ -9,7 +9,7 @@ this.tryDropExperience(p_222193_, p_222194_, p_222195_, ConstantInt.of(5)); } } -@@ -163,5 +_,10 @@ +@@ -158,5 +_,10 @@ (p_281134_, p_281135_, p_281136_, p_281137_) -> VibrationSystem.Ticker.tick(p_281134_, p_281137_.getVibrationData(), p_281137_.getVibrationUser()) ) : null; diff --git a/patches/minecraft/net/minecraft/world/level/block/SoundType.java.patch b/patches/minecraft/net/minecraft/world/level/block/SoundType.java.patch index 781848f3c9..01c60379d2 100644 --- a/patches/minecraft/net/minecraft/world/level/block/SoundType.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/SoundType.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/SoundType.java +++ b/net/minecraft/world/level/block/SoundType.java -@@ -357,6 +_,7 @@ +@@ -363,6 +_,7 @@ private final SoundEvent hitSound; private final SoundEvent fallSound; diff --git a/patches/minecraft/net/minecraft/world/level/block/SpawnerBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/SpawnerBlock.java.patch index 214eae1b2f..ebe0c83231 100644 --- a/patches/minecraft/net/minecraft/world/level/block/SpawnerBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/SpawnerBlock.java.patch @@ -9,7 +9,7 @@ int i = 15 + p_222478_.random.nextInt(15) + p_222478_.random.nextInt(15); this.popExperience(p_222478_, p_222479_, i); } -@@ -59,5 +_,10 @@ +@@ -54,5 +_,10 @@ public void appendHoverText(ItemStack p_255714_, Item.TooltipContext p_331610_, List p_255708_, TooltipFlag p_255667_) { super.appendHoverText(p_255714_, p_331610_, p_255708_, p_255667_); Spawner.appendHoverText(p_255714_, p_255708_, "SpawnData"); diff --git a/patches/minecraft/net/minecraft/world/level/block/SpongeBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/SpongeBlock.java.patch index cb05f57fbb..c4e78d0895 100644 --- a/patches/minecraft/net/minecraft/world/level/block/SpongeBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/SpongeBlock.java.patch @@ -14,6 +14,6 @@ FluidState fluidstate = p_56808_.getFluidState(p_296944_); - if (!fluidstate.is(FluidTags.WATER)) { + if (!spongeState.canBeHydrated(p_56808_, p_56809_, fluidstate, p_296944_)) { - return false; + return BlockPos.TraversalNodeStatus.SKIP; } else { if (blockstate.getBlock() instanceof BucketPickup bucketpickup diff --git a/patches/minecraft/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java.patch b/patches/minecraft/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java.patch index 0a4cff8826..0133fe59e0 100644 --- a/patches/minecraft/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java.patch @@ -1,14 +1,14 @@ --- a/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java +++ b/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java -@@ -54,6 +_,7 @@ +@@ -53,6 +_,7 @@ + public static final int NUM_DATA_VALUES = 4; public static final int BURN_TIME_STANDARD = 200; public static final int BURN_COOL_SPEED = 2; - public static final int UNKNOWN_LIT_DURATION = 0; + private final RecipeType recipeType; protected NonNullList items = NonNullList.withSize(3, ItemStack.EMPTY); - int litTime; - int litDuration = 0; -@@ -106,6 +_,7 @@ + int litTimeRemaining; + int litTotalTime; +@@ -105,6 +_,7 @@ ) { super(p_154991_, p_154992_, p_154993_); this.quickCheck = RecipeManager.createCheck((RecipeType)p_154994_); @@ -16,40 +16,44 @@ } private boolean isLit() { -@@ -117,9 +_,9 @@ +@@ -116,10 +_,10 @@ super.loadAdditional(p_335441_, p_330623_); this.items = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); ContainerHelper.loadAllItems(p_335441_, this.items, p_330623_); -- this.litTime = p_335441_.getShort("BurnTime"); -- this.cookingProgress = p_335441_.getShort("CookTime"); -- this.cookingTotalTime = p_335441_.getShort("CookTimeTotal"); -+ this.litTime = p_335441_.getInt("BurnTime"); -+ this.cookingProgress = p_335441_.getInt("CookTime"); -+ this.cookingTotalTime = p_335441_.getInt("CookTimeTotal"); - this.litDuration = 0; +- this.cookingTimer = p_335441_.getShort("cooking_time_spent"); +- this.cookingTotalTime = p_335441_.getShort("cooking_total_time"); +- this.litTimeRemaining = p_335441_.getShort("lit_time_remaining"); +- this.litTotalTime = p_335441_.getShort("lit_total_time"); ++ this.cookingTimer = p_335441_.getInt("cooking_time_spent"); ++ this.cookingTotalTime = p_335441_.getInt("cooking_total_time"); ++ this.litTimeRemaining = p_335441_.getInt("lit_time_remaining"); ++ this.litTotalTime = p_335441_.getInt("lit_total_time"); CompoundTag compoundtag = p_335441_.getCompound("RecipesUsed"); -@@ -131,9 +_,9 @@ + for (String s : compoundtag.getAllKeys()) { +@@ -130,10 +_,10 @@ @Override protected void saveAdditional(CompoundTag p_187452_, HolderLookup.Provider p_330192_) { super.saveAdditional(p_187452_, p_330192_); -- p_187452_.putShort("BurnTime", (short)this.litTime); -- p_187452_.putShort("CookTime", (short)this.cookingProgress); -- p_187452_.putShort("CookTimeTotal", (short)this.cookingTotalTime); -+ p_187452_.putInt("BurnTime", this.litTime); -+ p_187452_.putInt("CookTime", this.cookingProgress); -+ p_187452_.putInt("CookTimeTotal", this.cookingTotalTime); +- p_187452_.putShort("cooking_time_spent", (short)this.cookingTimer); +- p_187452_.putShort("cooking_total_time", (short)this.cookingTotalTime); +- p_187452_.putShort("lit_time_remaining", (short)this.litTimeRemaining); +- p_187452_.putShort("lit_total_time", (short)this.litTotalTime); ++ p_187452_.putInt("cooking_time_spent", this.cookingTimer); ++ p_187452_.putInt("cooking_total_time", this.cookingTotalTime); ++ p_187452_.putInt("lit_time_remaining", this.litTimeRemaining); ++ p_187452_.putInt("lit_total_time", this.litTotalTime); ContainerHelper.saveAllItems(p_187452_, this.items, p_330192_); CompoundTag compoundtag = new CompoundTag(); this.recipesUsed.forEach((p_360478_, p_360479_) -> compoundtag.putInt(p_360478_.location().toString(), p_360479_)); -@@ -165,27 +_,31 @@ +@@ -161,27 +_,31 @@ } int i = p_155017_.getMaxStackSize(); - if (!p_155017_.isLit() && canBurn(p_364207_.registryAccess(), recipeholder, singlerecipeinput, p_155017_.items, i)) { + if (!p_155017_.isLit() && p_155017_.canBurn(p_364207_.registryAccess(), recipeholder, singlerecipeinput, p_155017_.items, i)) { - p_155017_.litTime = p_155017_.getBurnDuration(p_364207_.fuelValues(), itemstack); - p_155017_.litDuration = p_155017_.litTime; + p_155017_.litTimeRemaining = p_155017_.getBurnDuration(p_364207_.fuelValues(), itemstack); + p_155017_.litTotalTime = p_155017_.litTimeRemaining; if (p_155017_.isLit()) { flag1 = true; + var remainder = itemstack.getCraftingRemainder(); @@ -69,16 +73,16 @@ - if (p_155017_.isLit() && canBurn(p_364207_.registryAccess(), recipeholder, singlerecipeinput, p_155017_.items, i)) { + if (p_155017_.isLit() && p_155017_.canBurn(p_364207_.registryAccess(), recipeholder, singlerecipeinput, p_155017_.items, i)) { - p_155017_.cookingProgress++; - if (p_155017_.cookingProgress == p_155017_.cookingTotalTime) { - p_155017_.cookingProgress = 0; + p_155017_.cookingTimer++; + if (p_155017_.cookingTimer == p_155017_.cookingTotalTime) { + p_155017_.cookingTimer = 0; p_155017_.cookingTotalTime = getTotalCookTime(p_364207_, p_155017_); - if (burn(p_364207_.registryAccess(), recipeholder, singlerecipeinput, p_155017_.items, i)) { + if (p_155017_.burn(p_364207_.registryAccess(), recipeholder, singlerecipeinput, p_155017_.items, i)) { p_155017_.setRecipeUsed(recipeholder); } -@@ -209,7 +_,7 @@ +@@ -205,7 +_,7 @@ } } @@ -87,7 +91,7 @@ RegistryAccess p_266924_, @Nullable RecipeHolder p_299207_, SingleRecipeInput p_364069_, -@@ -227,9 +_,9 @@ +@@ -223,9 +_,9 @@ } else if (!ItemStack.isSameItemSameComponents(itemstack1, itemstack)) { return false; } else { @@ -99,7 +103,7 @@ } } } else { -@@ -237,7 +_,7 @@ +@@ -233,7 +_,7 @@ } } @@ -108,7 +112,7 @@ RegistryAccess p_266740_, @Nullable RecipeHolder p_299450_, SingleRecipeInput p_364092_, -@@ -251,7 +_,7 @@ +@@ -247,7 +_,7 @@ if (itemstack2.isEmpty()) { p_267073_.set(2, itemstack1.copy()); } else if (ItemStack.isSameItemSameComponents(itemstack2, itemstack1)) { @@ -117,7 +121,7 @@ } if (itemstack.is(Blocks.WET_SPONGE.asItem()) && !p_267073_.get(1).isEmpty() && p_267073_.get(1).is(Items.BUCKET)) { -@@ -392,5 +_,34 @@ +@@ -388,5 +_,34 @@ for (ItemStack itemstack : this.items) { p_363325_.accountStack(itemstack); } diff --git a/patches/minecraft/net/minecraft/world/level/block/entity/BlockEntity.java.patch b/patches/minecraft/net/minecraft/world/level/block/entity/BlockEntity.java.patch index 097c53db37..0dd2f6abf2 100644 --- a/patches/minecraft/net/minecraft/world/level/block/entity/BlockEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/entity/BlockEntity.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/entity/BlockEntity.java +++ b/net/minecraft/world/level/block/entity/BlockEntity.java -@@ -27,7 +_,7 @@ +@@ -26,7 +_,7 @@ import net.minecraft.world.level.block.state.BlockState; import org.slf4j.Logger; @@ -9,7 +9,7 @@ private static final Logger LOGGER = LogUtils.getLogger(); private final BlockEntityType type; @Nullable -@@ -38,10 +_,12 @@ +@@ -37,10 +_,12 @@ private DataComponentMap components = DataComponentMap.EMPTY; public BlockEntity(BlockEntityType p_155228_, BlockPos p_155229_, BlockState p_155230_) { @@ -22,7 +22,7 @@ } private void validateBlockState(BlockState p_345558_) { -@@ -51,7 +_,7 @@ +@@ -50,7 +_,7 @@ } public boolean isValidBlockState(BlockState p_345570_) { @@ -31,7 +31,7 @@ } public static BlockPos getPosFromTag(CompoundTag p_187473_) { -@@ -72,6 +_,7 @@ +@@ -71,6 +_,7 @@ } protected void loadAdditional(CompoundTag p_331149_, HolderLookup.Provider p_333170_) { @@ -39,7 +39,7 @@ } public final void loadWithComponents(CompoundTag p_331756_, HolderLookup.Provider p_335164_) { -@@ -87,6 +_,7 @@ +@@ -86,6 +_,7 @@ } protected void saveAdditional(CompoundTag p_187471_, HolderLookup.Provider p_327783_) { @@ -47,7 +47,7 @@ } public final CompoundTag saveWithFullMetadata(HolderLookup.Provider p_331193_) { -@@ -217,6 +_,13 @@ +@@ -208,6 +_,13 @@ public void setRemoved() { this.remove = true; diff --git a/patches/minecraft/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java.patch b/patches/minecraft/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java.patch index 71a5f0f75e..4b77e2ce52 100644 --- a/patches/minecraft/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java +++ b/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java -@@ -229,7 +_,7 @@ +@@ -230,7 +_,7 @@ @Override public boolean canPlaceItemThroughFace(int p_59663_, ItemStack p_59664_, @Nullable Direction p_59665_) { @@ -9,7 +9,7 @@ } @Override -@@ -253,6 +_,11 @@ +@@ -254,6 +_,11 @@ public boolean isClosed() { return this.animationStatus == ShulkerBoxBlockEntity.AnimationStatus.CLOSED; diff --git a/patches/minecraft/net/minecraft/world/level/block/entity/SignBlockEntity.java.patch b/patches/minecraft/net/minecraft/world/level/block/entity/SignBlockEntity.java.patch index 70a713f27c..56359d16a1 100644 --- a/patches/minecraft/net/minecraft/world/level/block/entity/SignBlockEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/entity/SignBlockEntity.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/entity/SignBlockEntity.java +++ b/net/minecraft/world/level/block/entity/SignBlockEntity.java -@@ -286,6 +_,11 @@ +@@ -281,6 +_,11 @@ } } diff --git a/patches/minecraft/net/minecraft/world/level/block/state/BlockBehaviour.java.patch b/patches/minecraft/net/minecraft/world/level/block/state/BlockBehaviour.java.patch index d7a14f65bc..4ab8341f20 100644 --- a/patches/minecraft/net/minecraft/world/level/block/state/BlockBehaviour.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/state/BlockBehaviour.java.patch @@ -54,7 +54,7 @@ protected SoundType getSoundType(BlockState p_328629_) { return this.soundType; } -@@ -403,6 +_,10 @@ +@@ -407,6 +_,10 @@ return this.properties.destroyTime; } @@ -65,7 +65,7 @@ public abstract static class BlockStateBase extends StateHolder { private static final Direction[] DIRECTIONS = Direction.values(); private static final VoxelShape[] EMPTY_OCCLUSION_SHAPES = Util.make(new VoxelShape[DIRECTIONS.length], p_368402_ -> Arrays.fill(p_368402_, Shapes.empty())); -@@ -555,12 +_,14 @@ +@@ -559,12 +_,14 @@ return this.useShapeForLightOcclusion; } @@ -81,7 +81,7 @@ } public boolean ignitedByLava() { -@@ -573,9 +_,11 @@ +@@ -577,9 +_,11 @@ } public MapColor getMapColor(BlockGetter p_285002_, BlockPos p_285293_) { @@ -94,7 +94,7 @@ public BlockState rotate(Rotation p_60718_) { return this.getBlock().rotate(this.asState(), p_60718_); } -@@ -629,6 +_,8 @@ +@@ -633,6 +_,8 @@ } public PushReaction getPistonPushReaction() { @@ -103,7 +103,7 @@ return this.pushReaction; } -@@ -990,7 +_,7 @@ +@@ -998,7 +_,7 @@ BlockBehaviour.StateArgumentPredicate> isValidSpawn = (p_360542_, p_360543_, p_360544_, p_360545_) -> p_360542_.isFaceSturdy( p_360543_, p_360544_, Direction.UP ) diff --git a/patches/minecraft/net/minecraft/world/level/chunk/ChunkAccess.java.patch b/patches/minecraft/net/minecraft/world/level/chunk/ChunkAccess.java.patch index 2c4df32839..d953474d90 100644 --- a/patches/minecraft/net/minecraft/world/level/chunk/ChunkAccess.java.patch +++ b/patches/minecraft/net/minecraft/world/level/chunk/ChunkAccess.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/chunk/ChunkAccess.java +++ b/net/minecraft/world/level/chunk/ChunkAccess.java -@@ -324,23 +_,28 @@ +@@ -327,23 +_,28 @@ @Override public final void findBlockLightSources(BiConsumer p_285269_) { @@ -33,7 +33,7 @@ } } } -@@ -484,5 +_,10 @@ +@@ -487,5 +_,10 @@ } public static record PackedTicks(List> blocks, List> fluids) { diff --git a/patches/minecraft/net/minecraft/world/level/chunk/ChunkGenerator.java.patch b/patches/minecraft/net/minecraft/world/level/chunk/ChunkGenerator.java.patch index 0f3f5d81fb..81c159a836 100644 --- a/patches/minecraft/net/minecraft/world/level/chunk/ChunkGenerator.java.patch +++ b/patches/minecraft/net/minecraft/world/level/chunk/ChunkGenerator.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/chunk/ChunkGenerator.java +++ b/net/minecraft/world/level/chunk/ChunkGenerator.java -@@ -80,7 +_,7 @@ +@@ -81,7 +_,7 @@ public abstract class ChunkGenerator { public static final Codec CODEC = BuiltInRegistries.CHUNK_GENERATOR.byNameCodec().dispatchStable(ChunkGenerator::codec, Function.identity()); protected final BiomeSource biomeSource; @@ -9,7 +9,7 @@ private final Function, BiomeGenerationSettings> generationSettingsGetter; public ChunkGenerator(BiomeSource p_256133_) { -@@ -90,9 +_,14 @@ +@@ -91,9 +_,14 @@ public ChunkGenerator(BiomeSource p_255838_, Function, BiomeGenerationSettings> p_256216_) { this.biomeSource = p_255838_; this.generationSettingsGetter = p_256216_; diff --git a/patches/minecraft/net/minecraft/world/level/chunk/LevelChunk.java.patch b/patches/minecraft/net/minecraft/world/level/chunk/LevelChunk.java.patch index a218a5cc55..545d205acb 100644 --- a/patches/minecraft/net/minecraft/world/level/chunk/LevelChunk.java.patch +++ b/patches/minecraft/net/minecraft/world/level/chunk/LevelChunk.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/chunk/LevelChunk.java +++ b/net/minecraft/world/level/chunk/LevelChunk.java -@@ -51,7 +_,7 @@ +@@ -52,7 +_,7 @@ import net.minecraft.world.ticks.TickContainerAccess; import org.slf4j.Logger; @@ -9,7 +9,7 @@ static final Logger LOGGER = LogUtils.getLogger(); private static final TickingBlockEntity NULL_TICKER = new TickingBlockEntity() { @Override -@@ -114,6 +_,7 @@ +@@ -115,6 +_,7 @@ this.postLoad = p_196861_; this.blockTicks = p_196857_; this.fluidTicks = p_196858_; @@ -17,7 +17,7 @@ } public LevelChunk(ServerLevel p_196850_, ProtoChunk p_196851_, @Nullable LevelChunk.PostLoadProcessor p_196852_) { -@@ -290,14 +_,14 @@ +@@ -294,14 +_,14 @@ boolean flag2 = blockstate.hasBlockEntity(); if (!this.level.isClientSide) { blockstate.onRemove(this.level, p_62865_, p_62866_, p_62867_); @@ -34,7 +34,7 @@ p_62866_.onPlace(this.level, p_62865_, blockstate, p_62867_); } -@@ -352,6 +_,12 @@ +@@ -356,6 +_,12 @@ @Nullable public BlockEntity getBlockEntity(BlockPos p_62868_, LevelChunk.EntityCreationType p_62869_) { BlockEntity blockentity = this.blockEntities.get(p_62868_); @@ -47,7 +47,7 @@ if (blockentity == null) { CompoundTag compoundtag = this.pendingBlockEntities.remove(p_62868_); if (compoundtag != null) { -@@ -369,9 +_,6 @@ +@@ -373,9 +_,6 @@ this.addAndRegisterBlockEntity(blockentity); } } @@ -57,7 +57,7 @@ } return blockentity; -@@ -385,6 +_,7 @@ +@@ -389,6 +_,7 @@ } this.updateBlockEntityTicker(p_156391_); @@ -65,7 +65,7 @@ } } -@@ -437,9 +_,14 @@ +@@ -441,9 +_,14 @@ public CompoundTag getBlockEntityNbtForSaving(BlockPos p_62932_, HolderLookup.Provider p_329605_) { BlockEntity blockentity = this.getBlockEntity(p_62932_); if (blockentity != null && !blockentity.isRemoved()) { @@ -80,7 +80,7 @@ } else { CompoundTag compoundtag = this.pendingBlockEntities.get(p_62932_); if (compoundtag != null) { -@@ -519,7 +_,7 @@ +@@ -523,7 +_,7 @@ p_187974_.accept((p_327409_, p_327410_, p_327411_) -> { BlockEntity blockentity = this.getBlockEntity(p_327409_, LevelChunk.EntityCreationType.IMMEDIATE); if (blockentity != null && p_327411_ != null && blockentity.getType() == p_327410_) { @@ -89,7 +89,7 @@ } }); } -@@ -629,6 +_,7 @@ +@@ -633,6 +_,7 @@ } public void clearAllBlockEntities() { @@ -97,7 +97,7 @@ this.blockEntities.values().forEach(BlockEntity::setRemoved); this.blockEntities.clear(); this.tickersInLevel.values().forEach(p_187966_ -> p_187966_.rebind(NULL_TICKER)); -@@ -636,6 +_,7 @@ +@@ -640,6 +_,7 @@ } public void registerAllBlockEntitiesAfterLevelLoad() { @@ -105,7 +105,7 @@ this.blockEntities.values().forEach(p_187988_ -> { if (this.level instanceof ServerLevel serverlevel) { this.addGameEventListener(p_187988_, serverlevel); -@@ -687,6 +_,24 @@ +@@ -691,6 +_,24 @@ return new LevelChunk.BoundTickingBlockEntity<>(p_156376_, p_156377_); } @@ -130,7 +130,7 @@ class BoundTickingBlockEntity implements TickingBlockEntity { private final T blockEntity; private final BlockEntityTicker ticker; -@@ -704,6 +_,7 @@ +@@ -708,6 +_,7 @@ if (LevelChunk.this.isTicking(blockpos)) { try { ProfilerFiller profilerfiller = Profiler.get(); @@ -138,7 +138,7 @@ profilerfiller.push(this::getType); BlockState blockstate = LevelChunk.this.getBlockState(blockpos); if (this.blockEntity.getType().isValid(blockstate)) { -@@ -725,6 +_,11 @@ +@@ -729,6 +_,11 @@ CrashReport crashreport = CrashReport.forThrowable(throwable, "Ticking block entity"); CrashReportCategory crashreportcategory = crashreport.addCategory("Block entity being ticked"); this.blockEntity.fillCrashReportCategory(crashreportcategory); @@ -150,7 +150,7 @@ throw new ReportedException(crashreport); } } -@@ -798,6 +_,33 @@ +@@ -802,6 +_,33 @@ public String toString() { return this.ticker + " "; } diff --git a/patches/minecraft/net/minecraft/world/level/chunk/status/ChunkStatusTasks.java.patch b/patches/minecraft/net/minecraft/world/level/chunk/status/ChunkStatusTasks.java.patch index 11b806f115..ed841dffcd 100644 --- a/patches/minecraft/net/minecraft/world/level/chunk/status/ChunkStatusTasks.java.patch +++ b/patches/minecraft/net/minecraft/world/level/chunk/status/ChunkStatusTasks.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/chunk/status/ChunkStatusTasks.java +++ b/net/minecraft/world/level/chunk/status/ChunkStatusTasks.java -@@ -181,9 +_,15 @@ +@@ -183,9 +_,15 @@ levelchunk.setFullStatus(generationchunkholder::getFullStatus); levelchunk.runPostLoad(); levelchunk.setLoaded(true); diff --git a/patches/minecraft/net/minecraft/world/level/levelgen/structure/Structure.java.patch b/patches/minecraft/net/minecraft/world/level/levelgen/structure/Structure.java.patch index 3ef65ec3fc..dcdb501284 100644 --- a/patches/minecraft/net/minecraft/world/level/levelgen/structure/Structure.java.patch +++ b/patches/minecraft/net/minecraft/world/level/levelgen/structure/Structure.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/levelgen/structure/Structure.java +++ b/net/minecraft/world/level/levelgen/structure/Structure.java -@@ -42,10 +_,13 @@ +@@ -46,10 +_,13 @@ public abstract class Structure { public static final Codec DIRECT_CODEC = BuiltInRegistries.STRUCTURE_TYPE.byNameCodec().dispatch(Structure::type, StructureType::codec); public static final Codec> CODEC = RegistryFileCodec.create(Registries.STRUCTURE, DIRECT_CODEC); @@ -16,7 +16,7 @@ } public static MapCodec simpleCodec(Function p_226608_) { -@@ -54,22 +_,23 @@ +@@ -58,22 +_,23 @@ protected Structure(Structure.StructureSettings p_226558_) { this.settings = p_226558_; @@ -44,7 +44,7 @@ } public BoundingBox adjustBoundingBox(BoundingBox p_226570_) { -@@ -194,6 +_,22 @@ +@@ -209,6 +_,22 @@ } public abstract StructureType type(); diff --git a/patches/minecraft/net/minecraft/world/level/storage/DimensionDataStorage.java.patch b/patches/minecraft/net/minecraft/world/level/storage/DimensionDataStorage.java.patch index a06cfd27b5..c37fcb87d9 100644 --- a/patches/minecraft/net/minecraft/world/level/storage/DimensionDataStorage.java.patch +++ b/patches/minecraft/net/minecraft/world/level/storage/DimensionDataStorage.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/storage/DimensionDataStorage.java +++ b/net/minecraft/world/level/storage/DimensionDataStorage.java -@@ -104,6 +_,10 @@ +@@ -108,6 +_,10 @@ } int i = NbtUtils.getDataVersion(compoundtag, 1343); diff --git a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java index 48cc0b1b3e..c04693e20a 100644 --- a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java +++ b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java @@ -8,6 +8,10 @@ package net.minecraftforge.client; import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; import com.mojang.blaze3d.platform.NativeImage; import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.shaders.FogShape; @@ -17,6 +21,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.SheetedDecalTextureGenerator; import com.mojang.datafixers.util.Either; import com.mojang.math.Constants; +import com.mojang.math.Transformation; import net.minecraft.ChatFormatting; import net.minecraft.FileUtil; @@ -26,7 +31,6 @@ import net.minecraft.client.ClientRecipeBook; import net.minecraft.client.Minecraft; import net.minecraft.client.Options; import net.minecraft.client.color.block.BlockColors; -import net.minecraft.client.color.item.ItemColors; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.ChatComponent; @@ -57,6 +61,8 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.ShaderDefines; import net.minecraft.client.renderer.ShaderProgram; import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.block.model.BlockElement; +import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.client.renderer.entity.state.HumanoidRenderState; import net.minecraft.client.renderer.texture.SpriteContents; @@ -85,6 +91,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.ReloadableResourceManager; import net.minecraft.server.packs.resources.Resource; import net.minecraft.server.packs.resources.ResourceMetadata; +import net.minecraft.util.GsonHelper; import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; @@ -139,6 +146,8 @@ import net.minecraftforge.client.extensions.common.IClientMobEffectExtensions; import net.minecraftforge.client.gui.ClientTooltipComponentManager; import net.minecraftforge.client.gui.ModMismatchDisconnectedScreen; import net.minecraftforge.client.model.data.ModelData; +import net.minecraftforge.client.model.geometry.GeometryLoaderManager; +import net.minecraftforge.client.model.geometry.IUnbakedGeometry; import net.minecraftforge.client.textures.ForgeTextureMetadata; import net.minecraftforge.client.textures.TextureAtlasSpriteLoaderManager; import net.minecraftforge.common.ForgeConfig; @@ -175,6 +184,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -281,10 +291,6 @@ public class ForgeHooksClient { ModLoader.get().postEvent(new RegisterColorHandlersEvent.Block(blockColors)); } - public static void onItemColorsInit(ItemColors itemColors, BlockColors blockColors) { - ModLoader.get().postEvent(new RegisterColorHandlersEvent.Item(itemColors, blockColors)); - } - public static Model getArmorModel(HumanoidRenderState state, ItemStack itemStack, EquipmentSlot slot, HumanoidModel _default) { return IClientItemExtensions.of(itemStack).getGenericArmorModel(state, itemStack, slot, _default); } @@ -414,71 +420,27 @@ public class ForgeHooksClient { return ret; } - public static void onModifyBakingResult(Map models, ModelBakery modelBakery) { - ModLoader.get().postEvent(new ModelEvent.ModifyBakingResult(models, modelBakery)); + public static void onModifyBakingResult(ModelBakery modelBakery, ModelBakery.BakingResult results) { + ModLoader.get().postEvent(new ModelEvent.ModifyBakingResult(modelBakery, results)); } - public static void onModelBake(ModelManager modelManager, Map models, ModelBakery modelBakery) { - ModLoader.get().postEvent(new ModelEvent.BakingCompleted(modelManager, Collections.unmodifiableMap(models), modelBakery)); + public static void onModelBake(ModelManager modelManager, ModelBakery modelBakery) { + ModLoader.get().postEvent(new ModelEvent.BakingCompleted(modelManager, modelBakery)); } public static TextureAtlasSprite[] getFluidSprites(BlockAndTintGetter level, BlockPos pos, FluidState fluidStateIn) { IClientFluidTypeExtensions props = IClientFluidTypeExtensions.of(fluidStateIn); ResourceLocation overlayTexture = props.getOverlayTexture(fluidStateIn, level, pos); + @SuppressWarnings("deprecation") + var BLOCKS = TextureAtlas.LOCATION_BLOCKS; + var atlas = Minecraft.getInstance().getTextureAtlas(BLOCKS); return new TextureAtlasSprite[] { - Minecraft.getInstance().getTextureAtlas(InventoryMenu.BLOCK_ATLAS).apply(props.getStillTexture(fluidStateIn, level, pos)), - Minecraft.getInstance().getTextureAtlas(InventoryMenu.BLOCK_ATLAS).apply(props.getFlowingTexture(fluidStateIn, level, pos)), - overlayTexture == null ? null : Minecraft.getInstance().getTextureAtlas(InventoryMenu.BLOCK_ATLAS).apply(overlayTexture), + atlas.apply(props.getStillTexture(fluidStateIn, level, pos)), + atlas.apply(props.getFlowingTexture(fluidStateIn, level, pos)), + overlayTexture == null ? null : atlas.apply(overlayTexture), }; } - public static Material getBlockMaterial(ResourceLocation loc) { - return new Material(InventoryMenu.BLOCK_ATLAS, loc); - } - - /* - public static void fillNormal(int[] faceData, Direction facing) { - fillNormal(faceData, facing, false); - } - - /** - * internal, relies on fixed format of FaceBakery - * / - // TODO Do we need this? - public static void fillNormal(int[] faceData, Direction facing, boolean calculateNormals) { - Vector3f v2; - if (calculateNormals) { - Vector3f v1 = getVertexPos(faceData, 3); - Vector3f t1 = getVertexPos(faceData, 1); - v2 = getVertexPos(faceData, 2); - Vector3f t2 = getVertexPos(faceData, 0); - v1.sub(t1); - v2.sub(t2); - v2.cross(v1); - v2.normalize(); - } else - v2 = new Vector3f(facing.getNormal().getX(), facing.getNormal().getY(), facing.getNormal().getZ()); - int x = ((byte) Math.round(v2.x() * 127)) & 0xFF; - int y = ((byte) Math.round(v2.y() * 127)) & 0xFF; - int z = ((byte) Math.round(v2.z() * 127)) & 0xFF; - - int normal = x | (y << 0x08) | (z << 0x10); - - for(int i = 0; i < 4; i++) - faceData[i * 8 + 7] = normal; - } - */ - - private static Vector3f getVertexPos(int[] data, int vertex) { - int idx = vertex * 8; - - float x = Float.intBitsToFloat(data[idx]); - float y = Float.intBitsToFloat(data[idx + 1]); - float z = Float.intBitsToFloat(data[idx + 2]); - - return new Vector3f(x, y, z); - } - public static boolean calculateFaceWithoutAO(BlockAndTintGetter getter, BlockState state, BlockPos pos, BakedQuad quad, boolean isFaceCubic, float[] brightness, int[] lightmap) { if (quad.hasAmbientOcclusion()) return false; @@ -933,4 +895,39 @@ public class ForgeHooksClient { || screen.mouseDragged(mouseX, mouseY, mouseButton, dragX, dragY) || ForgeEventFactoryClient.onScreenMouseDragPost(screen, mouseX, mouseY, mouseButton, dragX, dragY); } + + public static BlockModel deserializeBlockModel(BlockModel model, List elements, JsonObject json, JsonDeserializationContext context) { + IUnbakedGeometry geometry = null; + if (json.has("loader")) { + var name = ResourceLocation.parse(GsonHelper.getAsString(json, "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())); + + geometry = loader.read(json, context); + } + + if (geometry != null) { + elements.clear(); + model.customData.setCustomGeometry(geometry); + } + + if (json.has("transform")) { + JsonElement transform = json.get("transform"); + model.customData.setRootTransform(context.deserialize(transform, Transformation.class)); + } + + if (json.has("render_type")) { + var renderTypeHintName = GsonHelper.getAsString(json, "render_type"); + model.customData.setRenderTypeHint(ResourceLocation.parse(renderTypeHintName)); + } + + if (json.has("visibility")) { + var visibility = GsonHelper.getAsJsonObject(json, "visibility"); + for (var part : visibility.entrySet()) + model.customData.visibilityData.setVisibilityState(part.getKey(), part.getValue().getAsBoolean()); + } + + return model; + } } diff --git a/src/main/java/net/minecraftforge/client/ForgeRenderTypes.java b/src/main/java/net/minecraftforge/client/ForgeRenderTypes.java index 16aa68fe5c..78ece0c236 100644 --- a/src/main/java/net/minecraftforge/client/ForgeRenderTypes.java +++ b/src/main/java/net/minecraftforge/client/ForgeRenderTypes.java @@ -12,6 +12,8 @@ import net.minecraft.client.renderer.RenderStateShard.TextureStateShard; import net.minecraft.client.renderer.RenderType; import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.VertexFormat; + +import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.TriState; @@ -23,17 +25,22 @@ import java.util.function.Function; import java.util.function.Supplier; public enum ForgeRenderTypes { - ITEM_LAYERED_SOLID(()-> getItemLayeredSolid(InventoryMenu.BLOCK_ATLAS)), - ITEM_LAYERED_CUTOUT(()-> getItemLayeredCutout(InventoryMenu.BLOCK_ATLAS)), - ITEM_LAYERED_CUTOUT_MIPPED(()-> getItemLayeredCutoutMipped(InventoryMenu.BLOCK_ATLAS)), - ITEM_LAYERED_TRANSLUCENT(()-> getItemLayeredTranslucent(InventoryMenu.BLOCK_ATLAS)), - ITEM_UNSORTED_TRANSLUCENT(()-> getUnsortedTranslucent(InventoryMenu.BLOCK_ATLAS)), - ITEM_UNLIT_TRANSLUCENT(()-> getUnlitTranslucent(InventoryMenu.BLOCK_ATLAS)), - ITEM_UNSORTED_UNLIT_TRANSLUCENT(()-> getUnlitTranslucent(InventoryMenu.BLOCK_ATLAS, false)), - TRANSLUCENT_ON_PARTICLES_TARGET(() -> getTranslucentParticlesTarget(InventoryMenu.BLOCK_ATLAS)); + ITEM_LAYERED_SOLID(()-> getItemLayeredSolid(blockAtlas())), + ITEM_LAYERED_CUTOUT(()-> getItemLayeredCutout(blockAtlas())), + ITEM_LAYERED_CUTOUT_MIPPED(()-> getItemLayeredCutoutMipped(blockAtlas())), + ITEM_LAYERED_TRANSLUCENT(()-> getItemLayeredTranslucent(blockAtlas())), + ITEM_UNSORTED_TRANSLUCENT(()-> getUnsortedTranslucent(blockAtlas())), + ITEM_UNLIT_TRANSLUCENT(()-> getUnlitTranslucent(blockAtlas())), + ITEM_UNSORTED_UNLIT_TRANSLUCENT(()-> getUnlitTranslucent(blockAtlas(), false)), + TRANSLUCENT_ON_PARTICLES_TARGET(() -> getTranslucentParticlesTarget(blockAtlas())); public static TriState enableTextTextureLinearFiltering = TriState.FALSE; + @SuppressWarnings("deprecation") + private static final ResourceLocation blockAtlas() { + return TextureAtlas.LOCATION_BLOCKS; + } + /** * @return A RenderType fit for multi-layer solid item rendering. */ @@ -348,7 +355,7 @@ public enum ForgeRenderTypes { this.mipmap = mipmap.get(); TextureManager manager = Minecraft.getInstance().getTextureManager(); var texture = manager.getTexture(resLoc); - texture.setFilter(this.blur.toBoolean(texture.getDefaultBlur()), this.mipmap); + texture.setFilter(this.blur, this.mipmap); RenderSystem.setShaderTexture(0, resLoc); }; } diff --git a/src/main/java/net/minecraftforge/client/event/CreateSpecialBlockRendererEvent.java b/src/main/java/net/minecraftforge/client/event/CreateSpecialBlockRendererEvent.java new file mode 100644 index 0000000000..1ef20b9fdc --- /dev/null +++ b/src/main/java/net/minecraftforge/client/event/CreateSpecialBlockRendererEvent.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) Forge Development LLC and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.minecraftforge.client.event; + +import java.util.Map; + +import net.minecraft.client.renderer.special.SpecialModelRenderer; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.eventbus.api.Event; + +public class CreateSpecialBlockRendererEvent extends Event { + private final Map map; + + public CreateSpecialBlockRendererEvent(Map map) { + this.map = map; + } + + public void register(Block block, SpecialModelRenderer.Unbaked renderer) { + this.map.put(block, renderer); + } +} diff --git a/src/main/java/net/minecraftforge/client/event/EntityRenderersEvent.java b/src/main/java/net/minecraftforge/client/event/EntityRenderersEvent.java index 04f84e9fb0..c67d49fdc1 100644 --- a/src/main/java/net/minecraftforge/client/event/EntityRenderersEvent.java +++ b/src/main/java/net/minecraftforge/client/event/EntityRenderersEvent.java @@ -39,6 +39,7 @@ import org.jetbrains.annotations.Nullable; import java.util.Map; import java.util.Set; +import java.util.function.Function; import java.util.function.Supplier; /** @@ -201,20 +202,11 @@ public abstract class EntityRenderersEvent extends Event implements IModBusEvent * only on the {@linkplain LogicalSide#CLIENT logical client}.

*/ 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> typeSupplier; - - @SuppressWarnings("deprecation") - public ForgeSpawnEggItem(Supplier> type, int backgroundColor, int highlightColor, Properties props) { - super((EntityType)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 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