diff --git a/.gitattributes b/.gitattributes index 24e37356d2..cb8977f3da 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3,6 +3,7 @@ *.patch text eol=lf *.java text eol=lf *.gradle text eol=crlf +**/MANIFEST.MF text eol=crlf *.png binary *.gif binary *.exe binary diff --git a/.gitignore b/.gitignore index 137ed073ba..4ae87a4951 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,8 @@ src/*/generated/**/.cache/ /ForgeRoot.ipr /ForgeRoot.iws + +# APT stuff +/*/.gitignore +/*/.factorypath +/*/.apt_generated/ diff --git a/build_forge.gradle b/build_forge.gradle index d12e580488..2ef0569148 100644 --- a/build_forge.gradle +++ b/build_forge.gradle @@ -97,13 +97,13 @@ final String S2S_TOOL = 'net.minecraftforge:Srg2Source:8.1.0:fatjar' configurations { // Don't pull all libraries, if we're missing something, add it to the installer list so the installer knows to download it. bootstrap { transitive = false } - installer { + installer { extendsFrom(bootstrap) - transitive = false + transitive = false } - installerextra { + installerextra { extendsFrom(bootstrap) - transitive = false + transitive = false } api.extendsFrom(installer) } @@ -117,9 +117,9 @@ dependencies { bootstrap(libs.securemodules) // Has Union file system in it bootstrap(libs.unsafe) // Needed by securemodules bootstrap(libs.bundles.asm) // Needed by securemodules - + implementation(libs.jopt.simple) { version { strictly '5.0.4' } } - + installer(libs.bootstrap) installer(libs.bootstrap.api) // Needed by securemodules installer(libs.accesstransformers) @@ -227,6 +227,31 @@ patcher { '--assetsDir', downloadAssets.output, '--assetIndex', "{asset_index}" } + + forge_client_data { + args '--launchTarget', 'forge_dev_client_data', + '--mod', 'forge', + '--all', + '--validate', + '--output', rootProject.file('src/main/generated/'), + '--existing', sourceSets.main.resources.srcDirs[0], + '--assetsDir', downloadAssets.output, + '--assetIndex', "{asset_index}" + } + + forge_client_data_test { + source sourceSets.test + args '--launchTarget', 'forge_dev', + '--launchEntry', 'minecraft/net.minecraft.client.data.Main', + '--launchData', + '--mod', '.+', + '--all', + '--output', rootProject.file('src/test/generated/'), + '--existing', sourceSets.main.resources.srcDirs[0], + '--existing', sourceSets.test.resources.srcDirs[0], + '--assetsDir', downloadAssets.output, + '--assetIndex', "{asset_index}" + } } } @@ -268,11 +293,11 @@ tasks.register('downloadCrowdin', Download) { tasks.userdevConfig.configure { configurations.installer.allDependencies.forEach { def dep = it.toString() - if (it instanceof ProjectDependency) + if (it instanceof ProjectDependency) dep = "net.minecraftforge:$it.dependencyProject.name:$it.dependencyProject.version" libraries.add(dep) } - + inject = '' // We don't have a userdev sourceset anymore. Empty as a gradle workaround... runs { client { @@ -284,6 +309,13 @@ tasks.userdevConfig.configure { args '--assetsDir', '{assets_root}' } + clientData { + environment 'MCP_MAPPINGS', '{mcp_mappings}' + args '--launchTarget', "forge_userdev_client_data" + args '--assetIndex', '{asset_index}' + args '--assetsDir', '{assets_root}' + } + server { environment 'MCP_MAPPINGS', '{mcp_mappings}' property 'forge.enableGameTest', 'true' @@ -493,7 +525,7 @@ tasks.register('serverShimJar', Jar) { from { zipTree(downloadServerShim.output).find { it.name == 'MANIFEST.MF' } } - + attributes('Class-Path': configurations.bootstrap.resolvedConfiguration.resolvedArtifacts.collect { "libraries/${Util.getMavenInfoFromDep(it).path}" }.join(' ')) } archiveClassifier = 'shim' @@ -586,7 +618,7 @@ tasks.register('checkJarCompatibility', CheckJarCompatibility) { baseLibraries.from(project.tasks.named('createJoinedSRG').flatMap { it.output }) inputJar = project.tasks.named('reobfJar').flatMap { it.output } - + commonLibraries.from(project.configurations.minecraftImplementation) commonLibraries.from(project.configurations.installer) } @@ -607,11 +639,11 @@ tasks.register('launcherJson', LauncherJson).configure { tasks.register('installerJson', InstallerJson) { icon = rootProject.file('icon.ico') - + // Json to install into the client's launcher dependsOn(launcherJson) input.from(launcherJson.output) - + // Download Official Mappings dependsOn(downloadClientMappings, downloadServerMappings) input.from(downloadClientMappings.output, downloadServerMappings.output) @@ -1059,7 +1091,7 @@ publishing { license gradleutils.pom.Licenses.LGPLv2_1 } } - + repositories { maven gradleutils.publishingForgeMaven } diff --git a/fmlearlydisplay/src/main/java/net/minecraftforge/fml/earlydisplay/RenderElement.java b/fmlearlydisplay/src/main/java/net/minecraftforge/fml/earlydisplay/RenderElement.java index ca251669d8..166d165a42 100644 --- a/fmlearlydisplay/src/main/java/net/minecraftforge/fml/earlydisplay/RenderElement.java +++ b/fmlearlydisplay/src/main/java/net/minecraftforge/fml/earlydisplay/RenderElement.java @@ -84,16 +84,6 @@ public class RenderElement { font.generateVerticesForTexts(10, context.scaledHeight() - texts.size() * font.lineSpacing() + font.descent() - 10, bb, texts.toArray(SimpleFont.DisplayText[]::new)); } - public static RenderElement monag() { - return new RenderElement(RenderElement.initializeTexture("monagstudios.png", 45000, 4, (bb, ctx, sz, frame) -> { - var size = 256; - var x0 = (ctx.width() - 2 * size) / 2; - var y0 = 64; - QuadHelper.loadQuad(bb, x0, x0+size, y0, y0+size/2f, 0f, 1f, 0f, 0.5f, 0xFFFFFFFF); - QuadHelper.loadQuad(bb, x0+size, x0+2*size, y0, y0+size/2f, 0f, 1f, 0.5f, 1f, 0xFFFFFFFF); - })); - - } public static RenderElement mojang(final int textureId, final int frameStart) { return new RenderElement(()->(bb, ctx, frame) -> { diff --git a/fmlloader/build.gradle b/fmlloader/build.gradle index 0791ce3956..a49f4928b8 100644 --- a/fmlloader/build.gradle +++ b/fmlloader/build.gradle @@ -5,6 +5,7 @@ plugins { id 'maven-publish' id 'net.minecraftforge.licenser' id 'net.minecraftforge.gradleutils' + alias(libs.plugins.apt) } apply from: rootProject.file('build_shared.gradle') @@ -36,6 +37,7 @@ dependencies { implementation(libs.terminalconsoleappender) implementation(libs.jimfs) + // Needed because we have a custom log4j plugin, and they removed package scanning and require a data file to be generated implementation(libs.log4j.core) annotationProcessor(libs.bundles.log4j) @@ -85,7 +87,7 @@ publishing { license PomUtils.Licenses.LGPLv2_1 } } - + repositories { maven gradleutils.publishingForgeMaven } @@ -102,5 +104,23 @@ tasks.register('writeForgeVersionJson') { } tasks.named('generateResources').configure { + dependsOn('eclipseJdt') + dependsOn('eclipseJdtApt') + dependsOn('eclipseFactorypath') dependsOn('writeForgeVersionJson') } + +eclipse { + classpath { + // We need to set the default output directory for the log4j annotation processor + // Ideally we'd just set the value, but the eclipse plugin deduplicates the output directories + // So we have to do a hacky whenMerged + //defaultOutputDir = file('bin/main') + file.whenMerged { + entries.each { entry -> + if (entry.kind == 'output' && entry.hasProperty('path')) + entry.path = 'bin/main' + } + } + } +} diff --git a/fmlloader/src/main/java/net/minecraftforge/fml/loading/log4j/ForgeHighlight.java b/fmlloader/src/main/java/net/minecraftforge/fml/loading/log4j/ForgeHighlight.java index 168a3d6621..70ec3bb39e 100644 --- a/fmlloader/src/main/java/net/minecraftforge/fml/loading/log4j/ForgeHighlight.java +++ b/fmlloader/src/main/java/net/minecraftforge/fml/loading/log4j/ForgeHighlight.java @@ -18,9 +18,7 @@ import org.apache.logging.log4j.util.PerformanceSensitive; import org.jetbrains.annotations.Nullable; import java.lang.reflect.Method; -import java.util.ArrayList; import java.util.Arrays; -import java.util.List; /** * A wrapper for {@link HighlightConverter} that auto-disables ANSI when the terminal doesn't support it. diff --git a/fmlloader/src/main/java/net/minecraftforge/fml/loading/targets/ArgumentList.java b/fmlloader/src/main/java/net/minecraftforge/fml/loading/targets/ArgumentList.java index 3f212a2a49..41055700cd 100644 --- a/fmlloader/src/main/java/net/minecraftforge/fml/loading/targets/ArgumentList.java +++ b/fmlloader/src/main/java/net/minecraftforge/fml/loading/targets/ArgumentList.java @@ -81,6 +81,10 @@ class ArgumentList { .toArray(String[]::new); } + public boolean has(String key) { + return this.values.containsKey(key); + } + public boolean hasValue(String key) { return getOrDefault(key, null) != null; } diff --git a/fmlloader/src/main/java/net/minecraftforge/fml/loading/targets/CommonDevLaunchHandler.java b/fmlloader/src/main/java/net/minecraftforge/fml/loading/targets/CommonDevLaunchHandler.java index c001bd6aa5..4298506f1b 100644 --- a/fmlloader/src/main/java/net/minecraftforge/fml/loading/targets/CommonDevLaunchHandler.java +++ b/fmlloader/src/main/java/net/minecraftforge/fml/loading/targets/CommonDevLaunchHandler.java @@ -22,6 +22,10 @@ abstract class CommonDevLaunchHandler extends CommonLaunchHandler { super(type, prefix); } + protected CommonDevLaunchHandler(String name) { + super(name); + } + @Override public String getNaming() { return "mcp"; } @Override public boolean isProduction() { return false; } @@ -29,13 +33,35 @@ abstract class CommonDevLaunchHandler extends CommonLaunchHandler { protected String[] preLaunch(String[] arguments, ModuleLayer layer) { super.preLaunch(arguments, layer); + var args = ArgumentList.from(arguments); + + if (this.module == null) { + var entry = args.get("launchEntry"); + if (entry == null) + throw new IllegalArgumentException("When using " + this.name() + " launch target you must specify a --launchEntry argument"); + + args.remove("launchEntry"); + + int idx = entry.indexOf('/'); + if (idx == -1) { + this.module = "minecraft"; + this.main = entry; + } else { + this.module = entry.substring(0, idx); + this.main = entry.substring(idx + 1); + } + + if (args.has("launchData")) { + args.remove("launchData"); + this.isData = true; + } + } + if (getDist().isDedicatedServer()) - return arguments; + return args.getArguments(); if (isData()) - return arguments; - - var args = ArgumentList.from(arguments); + return args.getArguments(); String username = args.get("username"); if (username != null) { // Replace '#' placeholders with random numbers 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 13e733c959..7f29a5ab3e 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 @@ -29,17 +29,27 @@ import java.util.List; public abstract class CommonLaunchHandler implements ILaunchHandlerService { protected static final Logger LOGGER = LogUtils.getLogger(); - protected final LaunchType type; - private final String prefix; + private final String name; + protected Dist dist = Dist.CLIENT; + protected boolean isData = false; + protected String module; + protected String main; protected CommonLaunchHandler(LaunchType type, String prefix) { - this.type = type; - this.prefix = prefix; + this(prefix + type.name()); + this.dist = type.dist(); + this.isData = type.data(); + this.module = type.module(); + this.main = type.main(); } - @Override public String name() { return this.prefix + this.type.name(); } - public Dist getDist() { return this.type.dist(); } - public boolean isData() { return this.type.data(); } + protected CommonLaunchHandler(String name) { + this.name = name; + } + + @Override public String name() { return this.name; } + public Dist getDist() { return this.dist; } + public boolean isData() { return this.isData; } public boolean isProduction() { return false; } public abstract String getNaming(); @@ -66,7 +76,7 @@ public abstract class CommonLaunchHandler implements ILaunchHandlerService { } protected ServiceRunner makeService(final String[] arguments, final ModuleLayer gameLayer) { - return () -> runTarget(this.type.module(), this.type.main(), arguments, gameLayer); + return () -> runTarget(this.module, this.main, arguments, gameLayer); } protected record LaunchType(String name, String module, String main, Dist dist, boolean data) {}; 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 1b61029530..75178793d5 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 @@ -14,12 +14,14 @@ sealed abstract class ForgeDevLaunchHandler extends CommonDevLaunchHandler { super(type, "forge_dev_"); } + private ForgeDevLaunchHandler(String name) { + super(name); + } + @Override public List getMinecraftPaths() { - - // The extra jar is on the classpath, so try and pull it out of the legacy classpath - var legacyCP = findClassPath(); - var extra = findJarOnClasspath(legacyCP, "client-extra"); + // The client extra jar is on the classpath we can try locating it using the .mcassetsroot which vanilla uses for loading data + var extra = getPathFromResource("assets/.mcassetsroot"); // Minecraft is an exploded directory, so find it. var minecraft = getPathFromResource("net/minecraft/client/Minecraft.class"); var forge = getPathFromResource("net/minecraftforge/common/MinecraftForge.class"); @@ -62,4 +64,10 @@ sealed abstract class ForgeDevLaunchHandler extends CommonDevLaunchHandler { super(SERVER_GAMETEST); } } + + public static final class Custom extends ForgeDevLaunchHandler { + public Custom() { + super("forge_dev"); + } + } } diff --git a/fmlloader/src/main/java/net/minecraftforge/fml/loading/targets/ForgeUserdevLaunchHandler.java b/fmlloader/src/main/java/net/minecraftforge/fml/loading/targets/ForgeUserdevLaunchHandler.java index 295afc91b9..4384f45b18 100644 --- a/fmlloader/src/main/java/net/minecraftforge/fml/loading/targets/ForgeUserdevLaunchHandler.java +++ b/fmlloader/src/main/java/net/minecraftforge/fml/loading/targets/ForgeUserdevLaunchHandler.java @@ -8,17 +8,18 @@ package net.minecraftforge.fml.loading.targets; import net.minecraftforge.fml.loading.FMLLoader; import java.nio.file.Path; import java.util.List; -import java.util.function.BiPredicate; import org.jetbrains.annotations.ApiStatus; -import cpw.mods.jarhandling.SecureJar; - @ApiStatus.Internal sealed abstract class ForgeUserdevLaunchHandler extends CommonDevLaunchHandler { private ForgeUserdevLaunchHandler(LaunchType type) { super(type, "forge_userdev_"); } + private ForgeUserdevLaunchHandler(String name) { + super(name); + } + @Override public List getMinecraftPaths() { var legacyCP = findClassPath(); @@ -26,7 +27,7 @@ sealed abstract class ForgeUserdevLaunchHandler extends CommonDevLaunchHandler { // Minecraft is extra jar {resources} + forge jar {patches} // The MC extra and forge jars are on the classpath, so try and pull them out - var extra = findJarOnClasspath(legacyCP, "client-extra"); + var extra = findJarOnClasspath(legacyCP, "client-extra"); // This should be "client-" + vers.mcAndMCPVersion() + "-extra" but FG6 qwerks var forge = findJarOnClasspath(legacyCP, "forge-" + vers.mcAndForgeVersion()); // We need to filter the forge jar to just MC code var minecraft = CommonDevLaunchHandler.getMinecraftOnly(extra, forge); @@ -39,6 +40,12 @@ sealed abstract class ForgeUserdevLaunchHandler extends CommonDevLaunchHandler { } } + public static final class ClientData extends ForgeUserdevLaunchHandler { + public ClientData() { + super(CLIENT_DATA); + } + } + public static final class Data extends ForgeUserdevLaunchHandler { public Data() { super(DATA); @@ -56,4 +63,10 @@ sealed abstract class ForgeUserdevLaunchHandler extends CommonDevLaunchHandler { super(SERVER_GAMETEST); } } + + public static final class Custom extends ForgeUserdevLaunchHandler { + public Custom() { + super("forge_userdev"); + } + } } diff --git a/fmlloader/src/main/resources/META-INF/services/cpw.mods.modlauncher.api.ILaunchHandlerService b/fmlloader/src/main/resources/META-INF/services/cpw.mods.modlauncher.api.ILaunchHandlerService index b4a3ffa7bc..f475a74c6a 100644 --- a/fmlloader/src/main/resources/META-INF/services/cpw.mods.modlauncher.api.ILaunchHandlerService +++ b/fmlloader/src/main/resources/META-INF/services/cpw.mods.modlauncher.api.ILaunchHandlerService @@ -4,12 +4,16 @@ net.minecraftforge.fml.loading.targets.ForgeProdLaunchHandler$Server # Mod Developers net.minecraftforge.fml.loading.targets.ForgeUserdevLaunchHandler$Client +net.minecraftforge.fml.loading.targets.ForgeUserdevLaunchHandler$ClientData +net.minecraftforge.fml.loading.targets.ForgeUserdevLaunchHandler$Custom net.minecraftforge.fml.loading.targets.ForgeUserdevLaunchHandler$Data net.minecraftforge.fml.loading.targets.ForgeUserdevLaunchHandler$Server net.minecraftforge.fml.loading.targets.ForgeUserdevLaunchHandler$ServerGameTest #Working on Forge itself net.minecraftforge.fml.loading.targets.ForgeDevLaunchHandler$Client +net.minecraftforge.fml.loading.targets.ForgeDevLaunchHandler$ClientData +net.minecraftforge.fml.loading.targets.ForgeDevLaunchHandler$Custom net.minecraftforge.fml.loading.targets.ForgeDevLaunchHandler$Data net.minecraftforge.fml.loading.targets.ForgeDevLaunchHandler$Server net.minecraftforge.fml.loading.targets.ForgeDevLaunchHandler$ServerGameTest diff --git a/fmlloader/src/main/resources/log4j2.xml b/fmlloader/src/main/resources/log4j2.xml index fb838a071f..5643af9265 100644 --- a/fmlloader/src/main/resources/log4j2.xml +++ b/fmlloader/src/main/resources/log4j2.xml @@ -4,7 +4,7 @@ SPDX-License-Identifier: LGPL-2.1-only --> - + diff --git a/patches/minecraft/net/minecraft/client/data/models/ItemModelGenerators.java.patch b/patches/minecraft/net/minecraft/client/data/models/ItemModelGenerators.java.patch new file mode 100644 index 0000000000..c9e9f4379a --- /dev/null +++ b/patches/minecraft/net/minecraft/client/data/models/ItemModelGenerators.java.patch @@ -0,0 +1,12 @@ +--- a/net/minecraft/client/data/models/ItemModelGenerators.java ++++ b/net/minecraft/client/data/models/ItemModelGenerators.java +@@ -852,6 +_,9 @@ + this.declareCustomModelItem(Items.COD); + this.declareCustomModelItem(Items.FEATHER); + this.declareCustomModelItem(Items.LEAD); ++ // moved from validate to here, because it's just vanilla default blocks ++ if (this.itemModelOutput instanceof ModelProvider.ItemInfoCollector collector) ++ collector.generateDefaultBlockModels(); + } + + @OnlyIn(Dist.CLIENT) diff --git a/patches/minecraft/net/minecraft/client/data/models/ModelProvider.java.patch b/patches/minecraft/net/minecraft/client/data/models/ModelProvider.java.patch new file mode 100644 index 0000000000..a1f7b8da70 --- /dev/null +++ b/patches/minecraft/net/minecraft/client/data/models/ModelProvider.java.patch @@ -0,0 +1,111 @@ +--- a/net/minecraft/client/data/models/ModelProvider.java ++++ b/net/minecraft/client/data/models/ModelProvider.java +@@ -43,11 +_,11 @@ + + @Override + public CompletableFuture run(CachedOutput p_376268_) { +- ModelProvider.ItemInfoCollector modelprovider$iteminfocollector = new ModelProvider.ItemInfoCollector(); +- ModelProvider.BlockStateGeneratorCollector modelprovider$blockstategeneratorcollector = new ModelProvider.BlockStateGeneratorCollector(); ++ ModelProvider.ItemInfoCollector modelprovider$iteminfocollector = new ModelProvider.ItemInfoCollector(this::getKnownItems); ++ ModelProvider.BlockStateGeneratorCollector modelprovider$blockstategeneratorcollector = new ModelProvider.BlockStateGeneratorCollector(this::getKnownBlocks); + ModelProvider.SimpleModelCollector modelprovider$simplemodelcollector = new ModelProvider.SimpleModelCollector(); +- new BlockModelGenerators(modelprovider$blockstategeneratorcollector, modelprovider$iteminfocollector, modelprovider$simplemodelcollector).run(); +- new ItemModelGenerators(modelprovider$iteminfocollector, modelprovider$simplemodelcollector).run(); ++ getBlockModelGenerators(modelprovider$blockstategeneratorcollector, modelprovider$iteminfocollector, modelprovider$simplemodelcollector).run(); ++ getItemModelGenerators(modelprovider$iteminfocollector, modelprovider$simplemodelcollector).run(); + modelprovider$blockstategeneratorcollector.validate(); + modelprovider$iteminfocollector.finalizeAndValidate(); + return CompletableFuture.allOf( +@@ -57,6 +_,22 @@ + ); + } + ++ protected Stream getKnownBlocks() { ++ return BuiltInRegistries.BLOCK.stream().filter(block -> "minecraft".equals(block.builtInRegistryHolder().key().location().getNamespace())); ++ } ++ ++ protected Stream getKnownItems() { ++ return BuiltInRegistries.ITEM.stream().filter(item -> "minecraft".equals(item.builtInRegistryHolder().key().location().getNamespace())); ++ } ++ ++ protected BlockModelGenerators getBlockModelGenerators(BlockStateGeneratorCollector blocks, ItemInfoCollector items, SimpleModelCollector models) { ++ return new BlockModelGenerators(blocks, items, models); ++ } ++ ++ protected ItemModelGenerators getItemModelGenerators(ItemInfoCollector items, SimpleModelCollector models) { ++ return new ItemModelGenerators(items, models); ++ } ++ + static CompletableFuture saveAll(CachedOutput p_378816_, Function p_377914_, Map> p_377836_) { + return DataProvider.saveAll(p_378816_, Supplier::get, p_377914_, p_377836_); + } +@@ -69,6 +_,15 @@ + @OnlyIn(Dist.CLIENT) + public static class BlockStateGeneratorCollector implements Consumer { + private final Map generators = new HashMap<>(); ++ private final Supplier> known; ++ ++ public BlockStateGeneratorCollector() { ++ this(() -> BuiltInRegistries.BLOCK.stream().filter(block -> "minecraft".equals(block.builtInRegistryHolder().key().location().getNamespace()))); ++ } ++ ++ public BlockStateGeneratorCollector(Supplier> known) { ++ this.known = known; ++ } + + public void accept(BlockStateGenerator p_378147_) { + Block block = p_378147_.getBlock(); +@@ -79,7 +_,7 @@ + } + + public void validate() { +- Stream> stream = BuiltInRegistries.BLOCK.listElements().filter(p_376480_ -> true); ++ Stream> stream = known.get().map(Block::builtInRegistryHolder); + List list = stream.filter(p_378423_ -> !this.generators.containsKey(p_378423_.value())) + .map(p_378200_ -> p_378200_.key().location()) + .toList(); +@@ -97,6 +_,15 @@ + public static class ItemInfoCollector implements ItemModelOutput { + private final Map itemInfos = new HashMap<>(); + private final Map copies = new HashMap<>(); ++ private final Supplier> known; ++ ++ public ItemInfoCollector() { ++ this(() -> BuiltInRegistries.ITEM.stream().filter(item -> "minecraft".equals(item.builtInRegistryHolder().key().location().getNamespace()))); ++ } ++ ++ public ItemInfoCollector(Supplier> known) { ++ this.known = known; ++ } + + @Override + public void accept(Item p_376450_, ItemModel.Unbaked p_378513_) { +@@ -115,7 +_,7 @@ + this.copies.put(p_376965_, p_377438_); + } + +- public void finalizeAndValidate() { ++ public void generateDefaultBlockModels() { + BuiltInRegistries.ITEM.forEach(p_378629_ -> { + if (!this.copies.containsKey(p_378629_)) { + if (p_378629_ instanceof BlockItem blockitem && !this.itemInfos.containsKey(blockitem)) { +@@ -124,6 +_,8 @@ + } + } + }); ++ } ++ public void finalizeAndValidate() { + this.copies.forEach((p_376289_, p_375718_) -> { + ClientItem clientitem = this.itemInfos.get(p_375718_); + if (clientitem == null) { +@@ -132,8 +_,8 @@ + this.register(p_376289_, clientitem); + } + }); +- List list = BuiltInRegistries.ITEM +- .listElements() ++ List list = known.get() ++ .map(item -> item.builtInRegistryHolder()) + .filter(p_377225_ -> !this.itemInfos.containsKey(p_377225_.value())) + .map(p_378591_ -> p_378591_.key().location()) + .toList(); diff --git a/patches/minecraft/net/minecraft/client/resources/model/BlockStateModelLoader.java.patch b/patches/minecraft/net/minecraft/client/resources/model/BlockStateModelLoader.java.patch new file mode 100644 index 0000000000..1921378808 --- /dev/null +++ b/patches/minecraft/net/minecraft/client/resources/model/BlockStateModelLoader.java.patch @@ -0,0 +1,11 @@ +--- a/net/minecraft/client/resources/model/BlockStateModelLoader.java ++++ b/net/minecraft/client/resources/model/BlockStateModelLoader.java +@@ -52,6 +_,8 @@ + + private static Function> definitionLocationToBlockMapper() { + Map> map = new HashMap<>(STATIC_DEFINITIONS); ++ var event = net.minecraftforge.client.event.ForgeEventFactoryClient.onRegisterModeStateDefinitions(); ++ map.putAll(event.getStates()); + + for (Block block : BuiltInRegistries.BLOCK) { + map.put(block.builtInRegistryHolder().key().location(), block.getStateDefinition()); diff --git a/settings.gradle b/settings.gradle index f8de0090ed..554e94492c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -23,6 +23,8 @@ plugins { dependencyResolutionManagement { versionCatalogs { libs { + plugin('apt', 'com.diffplug.eclipse.apt').version('4.2.0') + library('forgespi', 'net.minecraftforge:forgespi:7.1.5') // Needs modlauncher library('modlauncher', 'net.minecraftforge:modlauncher:10.2.2') // Needs securemodules library('securemodules', 'net.minecraftforge:securemodules:2.2.20') // Needs unsafe @@ -43,7 +45,7 @@ dependencyResolutionManagement { library('jimfs', 'com.google.jimfs:jimfs:1.3.0') bundle('jimfs', ['guava', 'failureaccess']) - version('bootstrap', '2.1.6') + version('bootstrap', '2.1.7') library('bootstrap', 'net.minecraftforge', 'bootstrap' ).versionRef('bootstrap') // Needs modlauncher library('bootstrap-api', 'net.minecraftforge', 'bootstrap-api' ).versionRef('bootstrap') library('bootstrap-dev', 'net.minecraftforge', 'bootstrap-dev' ).versionRef('bootstrap') diff --git a/src/main/generated/data/minecraft/loot_table/blocks/pale_oak_leaves.json b/src/main/generated/data/minecraft/loot_table/blocks/pale_oak_leaves.json new file mode 100644 index 0000000000..8e75c5a242 --- /dev/null +++ b/src/main/generated/data/minecraft/loot_table/blocks/pale_oak_leaves.json @@ -0,0 +1,132 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:any_of", + "terms": [ + { + "action": "shears_dig", + "condition": "forge:can_tool_perform_action" + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + } + ] + } + ], + "name": "minecraft:pale_oak_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + }, + { + "chances": [ + 0.05, + 0.0625, + 0.083333336, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "name": "minecraft:pale_oak_sapling" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:inverted", + "term": { + "condition": "minecraft:any_of", + "terms": [ + { + "action": "shears_dig", + "condition": "forge:can_tool_perform_action" + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "chances": [ + 0.02, + 0.022222223, + 0.025, + 0.033333335, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "minecraft:stick" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:blocks/pale_oak_leaves" +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/recipe/pale_oak_chest_boat.json b/src/main/generated/data/minecraft/recipe/pale_oak_chest_boat.json new file mode 100644 index 0000000000..2b223559ee --- /dev/null +++ b/src/main/generated/data/minecraft/recipe/pale_oak_chest_boat.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "group": "chest_boat", + "ingredients": [ + "#c:chests/wooden", + "minecraft:pale_oak_boat" + ], + "result": { + "count": 1, + "id": "minecraft:pale_oak_chest_boat" + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/recipe/pale_oak_fence.json b/src/main/generated/data/minecraft/recipe/pale_oak_fence.json new file mode 100644 index 0000000000..c4a34ad537 --- /dev/null +++ b/src/main/generated/data/minecraft/recipe/pale_oak_fence.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "wooden_fence", + "key": { + "#": "#c:rods/wooden", + "W": "minecraft:pale_oak_planks" + }, + "pattern": [ + "W#W", + "W#W" + ], + "result": { + "count": 3, + "id": "minecraft:pale_oak_fence" + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/recipe/pale_oak_fence_gate.json b/src/main/generated/data/minecraft/recipe/pale_oak_fence_gate.json new file mode 100644 index 0000000000..b09f87fa2b --- /dev/null +++ b/src/main/generated/data/minecraft/recipe/pale_oak_fence_gate.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "group": "wooden_fence_gate", + "key": { + "#": "#c:rods/wooden", + "W": "minecraft:pale_oak_planks" + }, + "pattern": [ + "#W#", + "#W#" + ], + "result": { + "count": 1, + "id": "minecraft:pale_oak_fence_gate" + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/recipe/pale_oak_sign.json b/src/main/generated/data/minecraft/recipe/pale_oak_sign.json new file mode 100644 index 0000000000..ac471218f3 --- /dev/null +++ b/src/main/generated/data/minecraft/recipe/pale_oak_sign.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "wooden_sign", + "key": { + "#": "minecraft:pale_oak_planks", + "X": "#c:rods/wooden" + }, + "pattern": [ + "###", + "###", + " X " + ], + "result": { + "count": 3, + "id": "minecraft:pale_oak_sign" + } +} \ No newline at end of file diff --git a/src/main/generated/pack.mcmeta b/src/main/generated/pack.mcmeta index ac4f194926..c09f703a79 100644 --- a/src/main/generated/pack.mcmeta +++ b/src/main/generated/pack.mcmeta @@ -3,6 +3,6 @@ "description": { "translate": "pack.forge.description" }, - "pack_format": 57 + "pack_format": 61 } } \ No newline at end of file diff --git a/src/main/java/net/minecraftforge/client/event/ForgeEventFactoryClient.java b/src/main/java/net/minecraftforge/client/event/ForgeEventFactoryClient.java index 522cb64b2e..8bdd26e18a 100644 --- a/src/main/java/net/minecraftforge/client/event/ForgeEventFactoryClient.java +++ b/src/main/java/net/minecraftforge/client/event/ForgeEventFactoryClient.java @@ -94,14 +94,14 @@ public final class ForgeEventFactoryClient { /** * Post an event to the {@link ModLoader#get()} event bus */ - private static T postModBus(T e) { + private static T fireModBus(T e) { ML.postEvent(e); return e; } public static void onGatherLayers(Map, EntityRenderer> renderers, Map> playerRenderers, Context context) { // TODO: Why is this a ModLoader event... - postModBus(new EntityRenderersEvent.AddLayers(renderers, playerRenderers, context)); + fireModBus(new EntityRenderersEvent.AddLayers(renderers, playerRenderers, context)); } public static boolean onScreenMouseReleased(Screen screen, double mouseX, double mouseY, int button) { @@ -295,7 +295,12 @@ public final class ForgeEventFactoryClient { public static Map> onCreateSkullModels() { var builder = ImmutableMap.>builder(); - postModBus(new EntityRenderersEvent.CreateSkullModels(builder)); + fireModBus(new EntityRenderersEvent.CreateSkullModels(builder)); return builder.build(); } + + public static ModelEvent.RegisterModelStateDefinitions onRegisterModeStateDefinitions() { + // This is on the mod bus because it happens during the initial texture reload, which is while the Forge bus is shut down. + return fireModBus(new ModelEvent.RegisterModelStateDefinitions()); + } } diff --git a/src/main/java/net/minecraftforge/client/event/ModelEvent.java b/src/main/java/net/minecraftforge/client/event/ModelEvent.java index 47e7ea6e89..6d91ed482e 100644 --- a/src/main/java/net/minecraftforge/client/event/ModelEvent.java +++ b/src/main/java/net/minecraftforge/client/event/ModelEvent.java @@ -6,11 +6,12 @@ package net.minecraftforge.client.event; import com.google.common.base.Preconditions; -import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelBakery; import net.minecraft.client.resources.model.ModelManager; -import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; import net.minecraftforge.client.model.geometry.IGeometryLoader; import net.minecraftforge.eventbus.api.Cancelable; import net.minecraftforge.eventbus.api.Event; @@ -20,6 +21,8 @@ import net.minecraftforge.fml.event.IModBusEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import org.jetbrains.annotations.ApiStatus; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; /** @@ -106,6 +109,37 @@ public abstract class ModelEvent extends Event { } } + /** + * Fired when the {@link net.minecraft.client.resources.model.BlockStateModelLoader BlockStateModelLoader} is notified of the resource manager reloading. + * Allows developers to register {@link net.minecraft.world.level.block.state.StateDefinition StateDefinitons} for blocks that are not in the normal Block registry. + * This is designed to allow for extra models to be loaded in connection with a blockstates json file. This is not intended to allow + * overriding or modification of StateDefinitions from registered Blocks + * + *

This event is fired on the {@linkplain FMLJavaModLoadingContext#getModEventBus() mod-specific event bus}, + * only on the {@linkplain LogicalSide#CLIENT logical client}.

+ */ + public static class RegisterModelStateDefinitions extends ModelEvent implements IModBusEvent { + private final Map> states = new HashMap<>(); + private final Map> view = Collections.unmodifiableMap(states); + + @ApiStatus.Internal + public RegisterModelStateDefinitions() { } + + /** + * Returns a read only view of the extra registered models + */ + public Map> getStates() { + return this.view; + } + + /** + * Registers a StateDefinition for a synthetic block. + */ + public void register(ResourceLocation key, StateDefinition value) { + states.put(key, value); + } + } + /** * Allows users to register their own {@link IGeometryLoader geometry loaders} for use in block/item models. * @@ -126,7 +160,9 @@ public abstract class ModelEvent extends Event { * Registers a new geometry loader. */ public void register(String name, IGeometryLoader loader) { - var key = ResourceLocation.fromNamespaceAndPath(ModLoadingContext.get().getActiveNamespace(), name); + @SuppressWarnings("removal") + var namespace = ModLoadingContext.get().getActiveNamespace(); + var key = ResourceLocation.fromNamespaceAndPath(namespace, name); Preconditions.checkArgument(!loaders.containsKey(key), "Geometry loader already registered: " + key); loaders.put(key, loader); } diff --git a/src/main/java/net/minecraftforge/client/model/generators/BlockModelBuilder.java b/src/main/java/net/minecraftforge/client/model/generators/BlockModelBuilder.java index 74b9d0274d..c56532c64e 100644 --- a/src/main/java/net/minecraftforge/client/model/generators/BlockModelBuilder.java +++ b/src/main/java/net/minecraftforge/client/model/generators/BlockModelBuilder.java @@ -16,7 +16,12 @@ import net.minecraftforge.common.data.ExistingFileHelper; * * @see ModelProvider * @see ModelBuilder + * + * In 1.21.4 Mojang exposed their data generators for their models. So it should be feasible to just use theirs. + * If you find something lacking feel free to open a PR so that we can extend it. + * @deprecated Use Vanilla's providers {@link net.minecraft.client.data.models.ModelProvider} */ +@Deprecated(since = "1.21.4", forRemoval = true) public class BlockModelBuilder extends ModelBuilder { public BlockModelBuilder(ResourceLocation outputLocation, ExistingFileHelper existingFileHelper) diff --git a/src/main/java/net/minecraftforge/client/model/generators/BlockModelProvider.java b/src/main/java/net/minecraftforge/client/model/generators/BlockModelProvider.java index 1ecde58854..797f918394 100644 --- a/src/main/java/net/minecraftforge/client/model/generators/BlockModelProvider.java +++ b/src/main/java/net/minecraftforge/client/model/generators/BlockModelProvider.java @@ -12,7 +12,12 @@ import org.jetbrains.annotations.NotNull; /** * Stub class to extend for block model data providers, eliminates some * boilerplate constructor parameters. + * + * In 1.21.4 Mojang exposed their data generators for their models. So it should be feasible to just use theirs. + * If you find something lacking feel free to open a PR so that we can extend it. + * @deprecated Use Vanilla's providers {@link net.minecraft.client.data.models.ModelProvider} */ +@Deprecated(since = "1.21.4", forRemoval = true) public abstract class BlockModelProvider extends ModelProvider { public BlockModelProvider(PackOutput output, String modid, ExistingFileHelper existingFileHelper) { diff --git a/src/main/java/net/minecraftforge/client/model/generators/BlockStateProvider.java b/src/main/java/net/minecraftforge/client/model/generators/BlockStateProvider.java index e3e7d64fde..0d25253562 100644 --- a/src/main/java/net/minecraftforge/client/model/generators/BlockStateProvider.java +++ b/src/main/java/net/minecraftforge/client/model/generators/BlockStateProvider.java @@ -63,10 +63,17 @@ import org.jetbrains.annotations.VisibleForTesting; /** * Data provider for blockstate files. Extends {@link BlockModelProvider} so that * blockstates and their referenced models can be provided in tandem. + * + * In 1.21.4 Mojang exposed their data generators for their models. So it should be feasible to just use theirs. + * If you find something lacking feel free to open a PR so that we can extend it. + * @deprecated Use Vanilla's providers {@link net.minecraft.client.data.models.ModelProvider} */ +@Deprecated(since = "1.21.4", forRemoval = true) public abstract class BlockStateProvider implements DataProvider { + @SuppressWarnings("unused") private static final Logger LOGGER = LogManager.getLogger(); + @SuppressWarnings("unused") private static final Gson GSON = (new GsonBuilder()).setPrettyPrinting().disableHtmlEscaping().create(); @VisibleForTesting diff --git a/src/main/java/net/minecraftforge/client/model/generators/ConfiguredModel.java b/src/main/java/net/minecraftforge/client/model/generators/ConfiguredModel.java index ea9911f9ee..4581f17d94 100644 --- a/src/main/java/net/minecraftforge/client/model/generators/ConfiguredModel.java +++ b/src/main/java/net/minecraftforge/client/model/generators/ConfiguredModel.java @@ -28,7 +28,12 @@ import org.jetbrains.annotations.Nullable; * Can be manually constructed, created by static factory such as * {@link #allYRotations(ModelFile, int, boolean)}, or created by builder via * {@link #builder()}. + * + * In 1.21.4 Mojang exposed their data generators for their models. So it should be feasible to just use theirs. + * If you find something lacking feel free to open a PR so that we can extend it. + * @deprecated Use Vanilla's providers {@link net.minecraft.client.data.models.ModelProvider} */ +@Deprecated(since = "1.21.4", forRemoval = true) public final class ConfiguredModel { /** diff --git a/src/main/java/net/minecraftforge/client/model/generators/CustomLoaderBuilder.java b/src/main/java/net/minecraftforge/client/model/generators/CustomLoaderBuilder.java index 413b0852fd..2a258244dd 100644 --- a/src/main/java/net/minecraftforge/client/model/generators/CustomLoaderBuilder.java +++ b/src/main/java/net/minecraftforge/client/model/generators/CustomLoaderBuilder.java @@ -13,6 +13,16 @@ import net.minecraftforge.common.data.ExistingFileHelper; import java.util.LinkedHashMap; import java.util.Map; +/** + * In 1.21.4 Mojang exposed their data generators for their models. So it should be feasible to just use theirs. + * If you find something lacking feel free to open a PR so that we can extend it. + * + * This is the only class that doesn't seem to have a vanilla alternative however, it should be a simple helper + * function to replace this functionality for your custom models + * + * @deprecated Use Vanilla's providers {@link net.minecraft.client.data.models.ModelProvider} + */ +@Deprecated(since = "1.21.4", forRemoval = true) public abstract class CustomLoaderBuilder> { protected final ResourceLocation loaderId; diff --git a/src/main/java/net/minecraftforge/client/model/generators/IGeneratedBlockState.java b/src/main/java/net/minecraftforge/client/model/generators/IGeneratedBlockState.java index a5d0b1992b..220b5f2413 100644 --- a/src/main/java/net/minecraftforge/client/model/generators/IGeneratedBlockState.java +++ b/src/main/java/net/minecraftforge/client/model/generators/IGeneratedBlockState.java @@ -8,6 +8,12 @@ package net.minecraftforge.client.model.generators; import com.google.gson.JsonObject; import org.jetbrains.annotations.VisibleForTesting; +/** + * In 1.21.4 Mojang exposed their data generators for their models. So it should be feasible to just use theirs. + * If you find something lacking feel free to open a PR so that we can extend it. + * @deprecated Use Vanilla's providers {@link net.minecraft.client.data.models.ModelProvider} + */ +@Deprecated(since = "1.21.4", forRemoval = true) @VisibleForTesting public interface IGeneratedBlockState { diff --git a/src/main/java/net/minecraftforge/client/model/generators/ItemModelBuilder.java b/src/main/java/net/minecraftforge/client/model/generators/ItemModelBuilder.java index ba61104f71..b7c6c2806e 100644 --- a/src/main/java/net/minecraftforge/client/model/generators/ItemModelBuilder.java +++ b/src/main/java/net/minecraftforge/client/model/generators/ItemModelBuilder.java @@ -20,7 +20,12 @@ import net.minecraftforge.common.data.ExistingFileHelper; /** * Builder for item models, adds the ability to build overrides via * {@link #override()}. + * + * In 1.21.4 Mojang exposed their data generators for their models. So it should be feasible to just use theirs. + * If you find something lacking feel free to open a PR so that we can extend it. + * @deprecated Use Vanilla's providers {@link net.minecraft.client.data.models.ModelProvider} */ +@Deprecated(since = "1.21.4", forRemoval = true) public class ItemModelBuilder extends ModelBuilder { protected List overrides = new ArrayList<>(); @@ -37,7 +42,7 @@ public class ItemModelBuilder extends ModelBuilder { /** * Get an existing override builder - * + * * @param index the index of the existing override builder * @return the override builder * @throws IndexOutOfBoundsException if {@code} index is out of bounds diff --git a/src/main/java/net/minecraftforge/client/model/generators/ItemModelProvider.java b/src/main/java/net/minecraftforge/client/model/generators/ItemModelProvider.java index cc8e0c21ca..4dbb681e62 100644 --- a/src/main/java/net/minecraftforge/client/model/generators/ItemModelProvider.java +++ b/src/main/java/net/minecraftforge/client/model/generators/ItemModelProvider.java @@ -17,7 +17,12 @@ import java.util.Objects; /** * Stub class to extend for item model data providers, eliminates some * boilerplate constructor parameters. + * + * In 1.21.4 Mojang exposed their data generators for their models. So it should be feasible to just use theirs. + * If you find something lacking feel free to open a PR so that we can extend it. + * @deprecated Use Vanilla's providers {@link net.minecraft.client.data.models.ModelProvider} */ +@Deprecated(since = "1.21.4", forRemoval = true) public abstract class ItemModelProvider extends ModelProvider { public ItemModelProvider(PackOutput output, String modid, ExistingFileHelper existingFileHelper) { diff --git a/src/main/java/net/minecraftforge/client/model/generators/ModelBuilder.java b/src/main/java/net/minecraftforge/client/model/generators/ModelBuilder.java index 9bc67de1ce..2511d7721e 100644 --- a/src/main/java/net/minecraftforge/client/model/generators/ModelBuilder.java +++ b/src/main/java/net/minecraftforge/client/model/generators/ModelBuilder.java @@ -50,7 +50,12 @@ import org.joml.Vector3f; * @see ItemModelBuilder * * @param Self type, for simpler chaining of methods. + * + * In 1.21.4 Mojang exposed their data generators for their models. So it should be feasible to just use theirs. + * If you find something lacking feel free to open a PR so that we can extend it. + * @deprecated Use Vanilla's providers {@link net.minecraft.client.data.models.ModelProvider} */ +@Deprecated(since = "1.21.4", forRemoval = true) public class ModelBuilder> extends ModelFile { @Nullable diff --git a/src/main/java/net/minecraftforge/client/model/generators/ModelFile.java b/src/main/java/net/minecraftforge/client/model/generators/ModelFile.java index 470c45aaae..628e781d11 100644 --- a/src/main/java/net/minecraftforge/client/model/generators/ModelFile.java +++ b/src/main/java/net/minecraftforge/client/model/generators/ModelFile.java @@ -10,6 +10,12 @@ import com.google.common.base.Preconditions; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.common.data.ExistingFileHelper; +/** + * In 1.21.4 Mojang exposed their data generators for their models. So it should be feasible to just use theirs. + * If you find something lacking feel free to open a PR so that we can extend it. + * @deprecated Use Vanilla's providers {@link net.minecraft.client.data.models.ModelProvider} + */ +@Deprecated(since = "1.21.4", forRemoval = true) public abstract class ModelFile { protected ResourceLocation location; diff --git a/src/main/java/net/minecraftforge/client/model/generators/ModelProvider.java b/src/main/java/net/minecraftforge/client/model/generators/ModelProvider.java index 41e7053463..951bf626c8 100644 --- a/src/main/java/net/minecraftforge/client/model/generators/ModelProvider.java +++ b/src/main/java/net/minecraftforge/client/model/generators/ModelProvider.java @@ -21,6 +21,12 @@ import net.minecraftforge.common.data.ExistingFileHelper; import net.minecraftforge.common.data.ExistingFileHelper.ResourceType; import org.jetbrains.annotations.VisibleForTesting; +/** + * In 1.21.4 Mojang exposed their data generators for their models. So it should be feasible to just use theirs. + * If you find something lacking feel free to open a PR so that we can extend it. + * @deprecated Use Vanilla's providers {@link net.minecraft.client.data.models.ModelProvider} + */ +@Deprecated(since = "1.21.4", forRemoval = true) public abstract class ModelProvider> implements DataProvider { public static final String BLOCK_FOLDER = "block"; diff --git a/src/main/java/net/minecraftforge/client/model/generators/MultiPartBlockStateBuilder.java b/src/main/java/net/minecraftforge/client/model/generators/MultiPartBlockStateBuilder.java index 0971975895..0f5eb34d2f 100644 --- a/src/main/java/net/minecraftforge/client/model/generators/MultiPartBlockStateBuilder.java +++ b/src/main/java/net/minecraftforge/client/model/generators/MultiPartBlockStateBuilder.java @@ -21,6 +21,12 @@ import com.google.gson.JsonObject; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.properties.Property; +/** + * In 1.21.4 Mojang exposed their data generators for their models. So it should be feasible to just use theirs. + * If you find something lacking feel free to open a PR so that we can extend it. + * @deprecated Use Vanilla's providers {@link net.minecraft.client.data.models.ModelProvider} + */ +@Deprecated(since = "1.21.4", forRemoval = true) public final class MultiPartBlockStateBuilder implements IGeneratedBlockState { private final List parts = new ArrayList<>(); private final Block owner; diff --git a/src/main/java/net/minecraftforge/client/model/generators/VariantBlockStateBuilder.java b/src/main/java/net/minecraftforge/client/model/generators/VariantBlockStateBuilder.java index 23987bdd80..eef49b6391 100644 --- a/src/main/java/net/minecraftforge/client/model/generators/VariantBlockStateBuilder.java +++ b/src/main/java/net/minecraftforge/client/model/generators/VariantBlockStateBuilder.java @@ -50,7 +50,12 @@ import org.jetbrains.annotations.Nullable; * values. * * @see BlockStateProvider + * + * In 1.21.4 Mojang exposed their data generators for their models. So it should be feasible to just use theirs. + * If you find something lacking feel free to open a PR so that we can extend it. + * @deprecated Use Vanilla's providers {@link net.minecraft.client.data.models.ModelProvider} */ +@Deprecated(since = "1.21.4", forRemoval = true) public class VariantBlockStateBuilder implements IGeneratedBlockState { @@ -284,6 +289,7 @@ public class VariantBlockStateBuilder implements IGeneratedBlockState return true; } + @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public String toString() { StringBuilder ret = new StringBuilder(); diff --git a/src/main/java/net/minecraftforge/client/model/generators/loaders/CompositeModelBuilder.java b/src/main/java/net/minecraftforge/client/model/generators/loaders/CompositeModelBuilder.java index 37bd40d4dc..c845ab0ce4 100644 --- a/src/main/java/net/minecraftforge/client/model/generators/loaders/CompositeModelBuilder.java +++ b/src/main/java/net/minecraftforge/client/model/generators/loaders/CompositeModelBuilder.java @@ -15,6 +15,11 @@ import net.minecraftforge.common.data.ExistingFileHelper; import java.util.*; +/** + * In 1.21.4 Mojang exposed their data generators for their models. So it should be feasible to just use theirs. + * If you find something lacking feel free to open a PR so that we can extend it. + * @deprecated Use Vanilla's providers {@link net.minecraft.client.data.models.ModelProvider} + */ public class CompositeModelBuilder> extends CustomLoaderBuilder { private static final ResourceLocation NAME = ResourceLocation.fromNamespaceAndPath("forge", "composite"); diff --git a/src/main/java/net/minecraftforge/client/model/generators/loaders/DynamicFluidContainerModelBuilder.java b/src/main/java/net/minecraftforge/client/model/generators/loaders/DynamicFluidContainerModelBuilder.java index a9d094712e..2feb8001f2 100644 --- a/src/main/java/net/minecraftforge/client/model/generators/loaders/DynamicFluidContainerModelBuilder.java +++ b/src/main/java/net/minecraftforge/client/model/generators/loaders/DynamicFluidContainerModelBuilder.java @@ -14,6 +14,11 @@ import net.minecraftforge.client.model.generators.ModelBuilder; import net.minecraftforge.common.data.ExistingFileHelper; import net.minecraftforge.registries.ForgeRegistries; +/** + * In 1.21.4 Mojang exposed their data generators for their models. So it should be feasible to just use theirs. + * If you find something lacking feel free to open a PR so that we can extend it. + * @deprecated Use Vanilla's providers {@link net.minecraft.client.data.models.ModelProvider} + */ public class DynamicFluidContainerModelBuilder> extends CustomLoaderBuilder { private static final ResourceLocation NAME = ResourceLocation.fromNamespaceAndPath("forge", "fluid_container"); diff --git a/src/main/java/net/minecraftforge/client/model/generators/loaders/ItemLayerModelBuilder.java b/src/main/java/net/minecraftforge/client/model/generators/loaders/ItemLayerModelBuilder.java index 12aedcfb37..c5e5182e43 100644 --- a/src/main/java/net/minecraftforge/client/model/generators/loaders/ItemLayerModelBuilder.java +++ b/src/main/java/net/minecraftforge/client/model/generators/loaders/ItemLayerModelBuilder.java @@ -24,6 +24,11 @@ import net.minecraftforge.client.model.generators.CustomLoaderBuilder; import net.minecraftforge.client.model.generators.ModelBuilder; import net.minecraftforge.common.data.ExistingFileHelper; +/** + * In 1.21.4 Mojang exposed their data generators for their models. So it should be feasible to just use theirs. + * If you find something lacking feel free to open a PR so that we can extend it. + * @deprecated Use Vanilla's providers {@link net.minecraft.client.data.models.ModelProvider} + */ public class ItemLayerModelBuilder> extends CustomLoaderBuilder { private static final ResourceLocation NAME = ResourceLocation.fromNamespaceAndPath("forge", "item_layers"); diff --git a/src/main/java/net/minecraftforge/client/model/generators/loaders/ObjModelBuilder.java b/src/main/java/net/minecraftforge/client/model/generators/loaders/ObjModelBuilder.java index 310790413f..fdb217512e 100644 --- a/src/main/java/net/minecraftforge/client/model/generators/loaders/ObjModelBuilder.java +++ b/src/main/java/net/minecraftforge/client/model/generators/loaders/ObjModelBuilder.java @@ -13,6 +13,11 @@ import net.minecraftforge.client.model.generators.CustomLoaderBuilder; import net.minecraftforge.client.model.generators.ModelBuilder; import net.minecraftforge.common.data.ExistingFileHelper; +/** + * In 1.21.4 Mojang exposed their data generators for their models. So it should be feasible to just use theirs. + * If you find something lacking feel free to open a PR so that we can extend it. + * @deprecated Use Vanilla's providers {@link net.minecraft.client.data.models.ModelProvider} + */ public class ObjModelBuilder> extends CustomLoaderBuilder { private static final ResourceLocation NAME = ResourceLocation.fromNamespaceAndPath("forge", "obj"); diff --git a/src/main/java/net/minecraftforge/client/model/generators/loaders/SeparateTransformsModelBuilder.java b/src/main/java/net/minecraftforge/client/model/generators/loaders/SeparateTransformsModelBuilder.java index 6e81b71123..55384a02d4 100644 --- a/src/main/java/net/minecraftforge/client/model/generators/loaders/SeparateTransformsModelBuilder.java +++ b/src/main/java/net/minecraftforge/client/model/generators/loaders/SeparateTransformsModelBuilder.java @@ -7,7 +7,6 @@ package net.minecraftforge.client.model.generators.loaders; import com.google.common.base.Preconditions; import com.google.gson.JsonObject; -import net.minecraft.client.renderer.block.model.ItemTransforms; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemDisplayContext; import net.minecraftforge.client.model.generators.CustomLoaderBuilder; @@ -17,6 +16,11 @@ import net.minecraftforge.common.data.ExistingFileHelper; import java.util.LinkedHashMap; import java.util.Map; +/** + * In 1.21.4 Mojang exposed their data generators for their models. So it should be feasible to just use theirs. + * If you find something lacking feel free to open a PR so that we can extend it. + * @deprecated Use Vanilla's providers {@link net.minecraft.client.data.models.ModelProvider} + */ public class SeparateTransformsModelBuilder> extends CustomLoaderBuilder { private static final ResourceLocation NAME = ResourceLocation.fromNamespaceAndPath("forge", "separate_transforms"); 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 1046b53114..4d2f4b2d0f 100644 --- a/src/main/java/net/minecraftforge/client/model/renderable/BakedModelRenderable.java +++ b/src/main/java/net/minecraftforge/client/model/renderable/BakedModelRenderable.java @@ -35,7 +35,7 @@ public class BakedModelRenderable implements IRenderable client; private final OptionSpec existing; private final OptionSpec existingMod; private final OptionSpec mod; @@ -55,7 +56,7 @@ public class DatagenModLoader { 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.client = !client ? null : parser.accepts("client", "Include client generators"); 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(","); @@ -82,8 +83,13 @@ public class DatagenModLoader { if (patterns.contains("minecraft") && patterns.size() == 1) return true; + if (!genClient && this.client != null) + genClient = options.has(this.client); + runningDataGen = true; Bootstrap.bootStrap(); + if (genClient) + ClientBootstrap.bootstrap(); ModLoader.get().gatherAndInitializeMods(ModWorkManager.syncExecutor(), ModWorkManager.parallelExecutor(), ()->{}); var lookupProvider = CompletableFuture.supplyAsync(VanillaRegistries::createLookup, Util.backgroundExecutor()); diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 34782950d3..ac10472ac7 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -3,6 +3,350 @@ default net.minecraft.client.KeyMapping f_90817_ # isDown public net.minecraft.client.Minecraft f_90987_ # textureManager public-f net.minecraft.client.Options f_92059_ # keyMappings public net.minecraft.client.Options$FieldAccess +public net.minecraft.client.color.item.ItemTintSources f_371619_ # ID_MAPPER +#group protected net.minecraft.client.data.models.BlockModelGenerators *() +protected net.minecraft.client.data.models.BlockModelGenerators m_372042_(Lnet/minecraft/world/item/Item;Lnet/minecraft/resources/ResourceLocation;)V # registerSimpleItemModel +protected net.minecraft.client.data.models.BlockModelGenerators m_372049_(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Ljava/lang/Boolean;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createSculkCatalyst$61 +protected net.minecraft.client.data.models.BlockModelGenerators m_372065_()V # createCartographyTable +protected net.minecraft.client.data.models.BlockModelGenerators m_372079_(Lnet/minecraft/world/level/block/Block;II)Lnet/minecraft/resources/ResourceLocation; # lambda$createCropBlock$17 +protected net.minecraft.client.data.models.BlockModelGenerators m_372090_()V # createPitcherCrop +protected net.minecraft.client.data.models.BlockModelGenerators m_372114_(Lnet/minecraft/client/data/models/blockstates/MultiPartGenerator;Lnet/minecraft/client/data/models/blockstates/Condition$TerminalCondition;Lnet/minecraft/client/data/models/blockstates/VariantProperties$Rotation;)V # addSlotStateAndRotationVariants +protected net.minecraft.client.data.models.BlockModelGenerators m_372121_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;)V # createWeightedPressurePlate +protected net.minecraft.client.data.models.BlockModelGenerators m_372122_(Lnet/minecraft/client/data/models/blockstates/Variant;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createSoulFire$32 +protected net.minecraft.client.data.models.BlockModelGenerators m_372128_()V # createSmithingTable +protected net.minecraft.client.data.models.BlockModelGenerators m_372129_()V # createPetrifiedOakSlab +protected net.minecraft.client.data.models.BlockModelGenerators m_372134_()V # createFarmland +protected net.minecraft.client.data.models.BlockModelGenerators m_372137_(Ljava/lang/String;I)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createBambooModels$14 +protected net.minecraft.client.data.models.BlockModelGenerators m_372151_()V # createIronBars +protected net.minecraft.client.data.models.BlockModelGenerators m_372158_()V # createBookshelf +protected net.minecraft.client.data.models.BlockModelGenerators m_372187_(Lnet/minecraft/world/level/block/Block;Ljava/lang/Boolean;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createHangingMoss$60 +protected net.minecraft.client.data.models.BlockModelGenerators m_372188_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/BlockStateGenerator; # createAxisAlignedPillarBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_372190_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/item/Item;)V # createMultiface +protected net.minecraft.client.data.models.BlockModelGenerators m_372196_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;)V # copyTrapdoorModel +protected net.minecraft.client.data.models.BlockModelGenerators m_372199_()V # createStructureBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_372209_(Lnet/minecraft/world/item/Item;Lnet/minecraft/world/level/block/Block;Ljava/lang/String;)Lnet/minecraft/resources/ResourceLocation; # createFlatItemModelWithBlockTexture +protected net.minecraft.client.data.models.BlockModelGenerators m_372211_(Lnet/minecraft/client/data/models/model/TextureMapping;)V # lambda$new$4 +protected net.minecraft.client.data.models.BlockModelGenerators m_372231_()Lnet/minecraft/client/data/models/blockstates/PropertyDispatch; # createRotatedPillar +protected net.minecraft.client.data.models.BlockModelGenerators m_372234_(Lnet/minecraft/world/level/block/Block;)V # createRotatedMirroredVariantBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_372247_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/BlockStateGenerator; # createTrapdoor +protected net.minecraft.client.data.models.BlockModelGenerators m_372261_()V # createBamboo +protected net.minecraft.client.data.models.BlockModelGenerators m_372277_()V # createSnifferEgg +protected net.minecraft.client.data.models.BlockModelGenerators m_372283_(Lnet/minecraft/client/data/models/blockstates/Variant;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createFire$24 +protected net.minecraft.client.data.models.BlockModelGenerators m_372285_()Lnet/minecraft/client/data/models/blockstates/PropertyDispatch; # createColumnWithFacing +protected net.minecraft.client.data.models.BlockModelGenerators m_372302_(Lnet/minecraft/resources/ResourceLocation;)[Lnet/minecraft/client/data/models/blockstates/Variant; # createRotatedVariants +protected net.minecraft.client.data.models.BlockModelGenerators m_372307_()V # createMangrovePropagule +protected net.minecraft.client.data.models.BlockModelGenerators m_372310_()V # createPointedDripstone +protected net.minecraft.client.data.models.BlockModelGenerators m_372311_(Ljava/lang/Integer;)Lnet/minecraft/resources/ResourceLocation; # lambda$createSnifferEgg$47 +protected net.minecraft.client.data.models.BlockModelGenerators m_372312_(Lnet/minecraft/core/FrontAndTop;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createCrafterBlock$21 +protected net.minecraft.client.data.models.BlockModelGenerators m_372325_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/client/data/models/model/TextureMapping;Ljava/util/function/BiConsumer;)Lnet/minecraft/client/data/models/blockstates/BlockStateGenerator; # createMirroredColumnGenerator +protected net.minecraft.client.data.models.BlockModelGenerators m_372336_(Lnet/minecraft/client/data/models/blockstates/Variant;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createSoulFire$33 +protected net.minecraft.client.data.models.BlockModelGenerators m_372346_()Lnet/minecraft/client/data/models/blockstates/PropertyDispatch; # createTorchHorizontalDispatch +protected net.minecraft.client.data.models.BlockModelGenerators m_372364_(Lnet/minecraft/world/level/block/state/properties/BooleanProperty;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/PropertyDispatch; # createBooleanModelDispatch +protected net.minecraft.client.data.models.BlockModelGenerators m_372368_()V # createJigsaw +protected net.minecraft.client.data.models.BlockModelGenerators m_372383_()V # createAmethystClusters +protected net.minecraft.client.data.models.BlockModelGenerators m_372396_([Lnet/minecraft/world/level/block/Block;)V # createCampfires +protected net.minecraft.client.data.models.BlockModelGenerators m_372397_(Lnet/minecraft/world/level/block/Block;)V # createLantern +protected net.minecraft.client.data.models.BlockModelGenerators m_372399_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/MultiVariantGenerator; # createSimpleBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_372406_()V # createObserver +protected net.minecraft.client.data.models.BlockModelGenerators m_372418_()V # createDaylightDetector +protected net.minecraft.client.data.models.BlockModelGenerators m_372455_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/model/TexturedModel$Provider;Lnet/minecraft/client/data/models/model/TexturedModel$Provider;)V # createRotatedPillarWithHorizontalVariant +protected net.minecraft.client.data.models.BlockModelGenerators m_372502_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/BlockModelGenerators$PlantType;Lnet/minecraft/client/data/models/model/TextureMapping;)V # createCrossBlockWithDefaultItem +protected net.minecraft.client.data.models.BlockModelGenerators m_372503_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;)V # createStems +protected net.minecraft.client.data.models.BlockModelGenerators m_372507_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/item/Item;)V # createAirLikeBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_372519_()V # createGrindstone +protected net.minecraft.client.data.models.BlockModelGenerators m_372527_(Lnet/minecraft/world/level/block/Block;)V # registerSimpleFlatItemModel +protected net.minecraft.client.data.models.BlockModelGenerators m_372530_(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/client/data/models/model/TextureMapping;)V # lambda$createBarrel$15 +protected net.minecraft.client.data.models.BlockModelGenerators m_372543_(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/world/level/block/entity/vault/VaultState;Ljava/lang/Boolean;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createVault$38 +protected net.minecraft.client.data.models.BlockModelGenerators m_372545_()V # createLightBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_372548_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;)V # createCoral +protected net.minecraft.client.data.models.BlockModelGenerators m_372570_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/model/TextureMapping;)V # lambda$createCreakingHeart$6 +protected net.minecraft.client.data.models.BlockModelGenerators m_372582_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/MultiVariantGenerator; # createRotatedVariant +protected net.minecraft.client.data.models.BlockModelGenerators m_372599_()Lnet/minecraft/client/data/models/blockstates/PropertyDispatch; # createFacingDispatch +protected net.minecraft.client.data.models.BlockModelGenerators m_372620_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;)V # copyCopperBulbModel +protected net.minecraft.client.data.models.BlockModelGenerators m_372638_(Lnet/minecraft/client/data/models/model/TextureMapping;)V # lambda$new$3 +protected net.minecraft.client.data.models.BlockModelGenerators m_372644_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/client/data/models/blockstates/Variant;)V # createGrassLikeBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_372663_()V # createFrostedIce +protected net.minecraft.client.data.models.BlockModelGenerators m_372681_(Lnet/minecraft/client/data/models/model/TexturedModel$Provider;[Lnet/minecraft/world/level/block/Block;)V # createColoredBlockWithStateRotations +protected net.minecraft.client.data.models.BlockModelGenerators m_372696_()V # createEndPortalFrame +protected net.minecraft.client.data.models.BlockModelGenerators m_372705_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/BlockStateGenerator; # createOrientableTrapdoor +protected net.minecraft.client.data.models.BlockModelGenerators m_372711_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/BlockStateGenerator; # createDoor +protected net.minecraft.client.data.models.BlockModelGenerators m_372719_()V # createChorusFlower +protected net.minecraft.client.data.models.BlockModelGenerators m_372720_()V # createCocoa +protected net.minecraft.client.data.models.BlockModelGenerators m_372723_(Lnet/minecraft/client/data/models/model/TextureMapping;)V # lambda$new$0 +protected net.minecraft.client.data.models.BlockModelGenerators m_372724_()V # createSmallDripleaf +protected net.minecraft.client.data.models.BlockModelGenerators m_372726_(Lnet/minecraft/world/level/block/Block;)V # createMultiface +protected net.minecraft.client.data.models.BlockModelGenerators m_372728_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/blockstates/Condition$TerminalCondition;Lnet/minecraft/world/level/block/state/properties/BooleanProperty;)V # lambda$createMultifaceBlockStates$55 +protected net.minecraft.client.data.models.BlockModelGenerators m_372729_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/BlockModelGenerators$PlantType;)V # createGrowingPlant +protected net.minecraft.client.data.models.BlockModelGenerators m_372730_()V # createBeds +protected net.minecraft.client.data.models.BlockModelGenerators m_372737_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/BlockModelGenerators$PlantType;)V # createCrossBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_372739_()V # createNetherPortalBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_372745_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;)V # createNetherRoots +protected net.minecraft.client.data.models.BlockModelGenerators m_372746_(Lnet/minecraft/client/data/models/model/TextureMapping;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/model/TextureMapping; # lambda$createCommandBlock$13 +protected net.minecraft.client.data.models.BlockModelGenerators m_372768_(Lnet/minecraft/world/level/block/Block;)V # createAmethystCluster +protected net.minecraft.client.data.models.BlockModelGenerators m_372788_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;)V # copyDoorModel +protected net.minecraft.client.data.models.BlockModelGenerators m_372818_(Lnet/minecraft/world/level/block/Block;)Ljava/util/List; # createTopFireModels +protected net.minecraft.client.data.models.BlockModelGenerators m_372820_(Lnet/minecraft/client/data/models/blockstates/Variant;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createFire$25 +protected net.minecraft.client.data.models.BlockModelGenerators m_372825_(Ljava/lang/Integer;Ljava/lang/Integer;)Lnet/minecraft/resources/ResourceLocation; # createTurtleEggModel +protected net.minecraft.client.data.models.BlockModelGenerators m_372827_()V # createMuddyMangroveRoots +protected net.minecraft.client.data.models.BlockModelGenerators m_372830_(Lnet/minecraft/world/level/block/Block;)V # createFlowerBed +protected net.minecraft.client.data.models.BlockModelGenerators m_372831_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;)V # copyModel +protected net.minecraft.client.data.models.BlockModelGenerators m_372841_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/MultiVariantGenerator; # createRotatedVariant +protected net.minecraft.client.data.models.BlockModelGenerators m_372857_()V # createSweetBerryBush +protected net.minecraft.client.data.models.BlockModelGenerators m_372870_()V # createSculkCatalyst +protected net.minecraft.client.data.models.BlockModelGenerators m_372876_()V # createBigDripLeafBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_372882_(Lnet/minecraft/client/data/models/model/TexturedModel$Provider;[Lnet/minecraft/world/level/block/Block;)V # createColoredBlockWithRandomRotations +protected net.minecraft.client.data.models.BlockModelGenerators m_372883_(Lnet/minecraft/client/data/models/blockstates/Variant;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createFire$28 +protected net.minecraft.client.data.models.BlockModelGenerators m_372884_()V # createLever +protected net.minecraft.client.data.models.BlockModelGenerators m_372888_(Lnet/minecraft/core/FrontAndTop;Lnet/minecraft/client/data/models/blockstates/Variant;)Lnet/minecraft/client/data/models/blockstates/Variant; # applyRotation +protected net.minecraft.client.data.models.BlockModelGenerators m_372890_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/model/TextureMapping;Ljava/lang/Integer;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createStems$10 +protected net.minecraft.client.data.models.BlockModelGenerators m_372908_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;Z)V # createChest +protected net.minecraft.client.data.models.BlockModelGenerators m_372933_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/BlockModelGenerators$PlantType;)V # createPlantWithDefaultItem +protected net.minecraft.client.data.models.BlockModelGenerators m_372942_()V # createStonecutter +protected net.minecraft.client.data.models.BlockModelGenerators m_372944_(Lnet/minecraft/world/level/block/Block;)V # createCreakingHeart +protected net.minecraft.client.data.models.BlockModelGenerators m_372948_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/client/data/models/model/TextureMapping;Ljava/util/function/BiConsumer;)Lnet/minecraft/client/data/models/blockstates/BlockStateGenerator; # createNorthWestMirroredCubeGenerator +protected net.minecraft.client.data.models.BlockModelGenerators m_372954_()V # createSmoothStoneSlab +protected net.minecraft.client.data.models.BlockModelGenerators m_372958_()V # createDirtPath +protected net.minecraft.client.data.models.BlockModelGenerators m_372959_()V # createComparator +protected net.minecraft.client.data.models.BlockModelGenerators m_372960_(Lnet/minecraft/world/level/block/Block;)V # createTintedDoublePlant +protected net.minecraft.client.data.models.BlockModelGenerators m_372976_(Lnet/minecraft/world/level/block/Block;)V # createAzalea +protected net.minecraft.client.data.models.BlockModelGenerators m_372983_(Lnet/minecraft/client/data/models/blockstates/MultiPartGenerator;Lnet/minecraft/resources/ResourceLocation;Lcom/mojang/datafixers/util/Pair;)V # lambda$createChiseledBookshelf$62 +protected net.minecraft.client.data.models.BlockModelGenerators m_373004_(Lnet/minecraft/world/level/block/Block;)V # createCommandBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_373008_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/item/DyeColor;)V # createShulkerBox +protected net.minecraft.client.data.models.BlockModelGenerators m_373026_(Lnet/minecraft/world/item/Item;)V # registerSimpleFlatItemModel +protected net.minecraft.client.data.models.BlockModelGenerators m_373031_(Ljava/lang/Integer;Ljava/lang/Integer;)Ljava/util/List; # lambda$createTurtleEgg$46 +protected net.minecraft.client.data.models.BlockModelGenerators m_373035_(Lnet/minecraft/world/level/block/Block;)V # createItemWithGrassTint +protected net.minecraft.client.data.models.BlockModelGenerators m_373046_(Lnet/minecraft/world/item/Item;Lnet/minecraft/world/level/block/Block;Ljava/lang/String;)Lnet/minecraft/resources/ResourceLocation; # createFlatItemModelWithBlockTextureAndOverlay +protected net.minecraft.client.data.models.BlockModelGenerators m_373060_(Lnet/minecraft/client/data/models/model/TextureMapping;)V # lambda$new$2 +protected net.minecraft.client.data.models.BlockModelGenerators m_373061_(Lnet/minecraft/client/data/models/blockstates/Variant;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createFire$26 +protected net.minecraft.client.data.models.BlockModelGenerators m_373071_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/BlockModelGenerators$PlantType;Lnet/minecraft/client/data/models/model/TextureMapping;)V # createCrossBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_373072_(Lnet/minecraft/world/level/block/Block;)V # createParticleOnlyBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_373079_(Lnet/minecraft/world/level/block/Block;Ljava/lang/Integer;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createBrushableBlock$5 +protected net.minecraft.client.data.models.BlockModelGenerators m_373089_(Lnet/minecraft/world/item/Item;)Lnet/minecraft/resources/ResourceLocation; # createFlatItemModel +protected net.minecraft.client.data.models.BlockModelGenerators m_373098_()V # createCaveVines +protected net.minecraft.client.data.models.BlockModelGenerators m_373127_(Lnet/minecraft/client/data/models/blockstates/Variant;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createFire$27 +protected net.minecraft.client.data.models.BlockModelGenerators m_373150_(Lnet/minecraft/resources/ResourceLocation;Ljava/lang/Integer;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createSnowBlocks$42 +protected net.minecraft.client.data.models.BlockModelGenerators m_373154_(Lnet/minecraft/client/data/models/blockstates/Variant;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createFire$29 +protected net.minecraft.client.data.models.BlockModelGenerators m_373159_()V # createComposter +protected net.minecraft.client.data.models.BlockModelGenerators m_373167_(Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$static$52 +protected net.minecraft.client.data.models.BlockModelGenerators m_373171_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;Ljava/util/function/BiFunction;)V # createCraftingTableLike +protected net.minecraft.client.data.models.BlockModelGenerators m_373177_()V # createTrialSpawner +protected net.minecraft.client.data.models.BlockModelGenerators m_373181_()V # createVine +protected net.minecraft.client.data.models.BlockModelGenerators m_373188_()V # createInfestedStone +protected net.minecraft.client.data.models.BlockModelGenerators m_373195_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/renderer/special/SpecialModelRenderer$Unbaked;)V # generateSimpleSpecialItemModel +protected net.minecraft.client.data.models.BlockModelGenerators m_373216_(Lnet/minecraft/world/level/block/Block;)Ljava/util/List; # createFloorFireModels +protected net.minecraft.client.data.models.BlockModelGenerators m_373228_(Lnet/minecraft/world/level/block/Block;)Lnet/minecraft/client/data/models/BlockModelGenerators$BlockFamilyProvider; # family +protected net.minecraft.client.data.models.BlockModelGenerators m_373247_(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/client/data/models/model/TextureMapping;)V # lambda$createFurnace$19 +protected net.minecraft.client.data.models.BlockModelGenerators m_373255_()V # createPumpkins +protected net.minecraft.client.data.models.BlockModelGenerators m_373266_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/BlockStateGenerator; # createPressurePlate +protected net.minecraft.client.data.models.BlockModelGenerators m_373285_(Lnet/minecraft/world/level/block/state/properties/Property;Ljava/lang/Comparable;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/PropertyDispatch; # createEmptyOrFullDispatch +protected net.minecraft.client.data.models.BlockModelGenerators m_373293_()V # createTripwire +protected net.minecraft.client.data.models.BlockModelGenerators m_373303_(Lnet/minecraft/world/level/block/Block;)V # createMossyCarpet +protected net.minecraft.client.data.models.BlockModelGenerators m_373329_()V # createSculkSensor +protected net.minecraft.client.data.models.BlockModelGenerators m_373330_()V # createPistonHeads +protected net.minecraft.client.data.models.BlockModelGenerators m_373332_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/BlockStateGenerator; # createStairs +protected net.minecraft.client.data.models.BlockModelGenerators m_373333_()V # createBanners +protected net.minecraft.client.data.models.BlockModelGenerators m_373336_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/BlockModelGenerators$PlantType;)V # createCrossBlockWithDefaultItem +protected net.minecraft.client.data.models.BlockModelGenerators m_373340_()V # createSnowBlocks +protected net.minecraft.client.data.models.BlockModelGenerators m_373341_(Lnet/minecraft/core/Direction;Lnet/minecraft/world/level/block/state/properties/DripstoneThickness;)Lnet/minecraft/client/data/models/blockstates/Variant; # createPointedDripstoneVariant +protected net.minecraft.client.data.models.BlockModelGenerators m_373342_(Lnet/minecraft/world/level/block/Block;)V # createDispenserBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_373358_()V # createSculkShrieker +protected net.minecraft.client.data.models.BlockModelGenerators m_373367_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/BlockStateGenerator; # createRotatedPillarWithHorizontalVariant +protected net.minecraft.client.data.models.BlockModelGenerators m_373371_(Lnet/minecraft/world/level/block/Block;)V # createNonTemplateModelBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_373393_()V # createRedstoneTorch +protected net.minecraft.client.data.models.BlockModelGenerators m_373406_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;)V # createAxisAlignedPillarBlockCustomModel +protected net.minecraft.client.data.models.BlockModelGenerators m_373407_(Lnet/minecraft/client/data/models/blockstates/Variant;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createSoulFire$34 +protected net.minecraft.client.data.models.BlockModelGenerators m_373410_(Lnet/minecraft/client/data/models/model/TextureMapping;)V # lambda$new$1 +protected net.minecraft.client.data.models.BlockModelGenerators m_373413_(Lnet/minecraft/world/level/block/Block;)V # createMultifaceBlockStates +protected net.minecraft.client.data.models.BlockModelGenerators m_373423_()V # createGrassBlocks +protected net.minecraft.client.data.models.BlockModelGenerators m_373424_()V # createChiseledBookshelf +protected net.minecraft.client.data.models.BlockModelGenerators m_373437_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;)V # createNonTemplateModelBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_373442_(Ljava/lang/Integer;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createSweetBerryBush$44 +protected net.minecraft.client.data.models.BlockModelGenerators m_373454_(Lnet/minecraft/client/data/models/model/TextureMapping;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/model/TextureMapping; # lambda$createChorusFlower$20 +protected net.minecraft.client.data.models.BlockModelGenerators m_373455_(Ljava/util/List;Ljava/util/function/UnaryOperator;)Ljava/util/List; # wrapModels +protected net.minecraft.client.data.models.BlockModelGenerators m_373466_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;)V # registerSimpleItemModel +protected net.minecraft.client.data.models.BlockModelGenerators m_373467_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/client/data/models/model/TextureMapping;)V # createPistonVariant +protected net.minecraft.client.data.models.BlockModelGenerators m_373468_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/client/color/item/ItemTintSource;)V # registerSimpleTintedItemModel +protected net.minecraft.client.data.models.BlockModelGenerators m_373481_(Lnet/minecraft/world/level/block/Block;)V # createMushroomBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_373512_(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/client/data/models/model/TextureMapping;)V # lambda$createGrassBlocks$35 +protected net.minecraft.client.data.models.BlockModelGenerators m_373523_()V # createRepeater +protected net.minecraft.client.data.models.BlockModelGenerators m_373526_()V # createRedstoneLamp +protected net.minecraft.client.data.models.BlockModelGenerators m_373538_(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/world/level/block/state/properties/SculkSensorPhase;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createSculkSensor$39 +protected net.minecraft.client.data.models.BlockModelGenerators m_373558_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/model/TexturedModel$Provider;)V # createFurnace +protected net.minecraft.client.data.models.BlockModelGenerators m_373573_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/BlockStateGenerator; # createSlab +protected net.minecraft.client.data.models.BlockModelGenerators m_373577_(Lnet/minecraft/client/data/models/blockstates/PropertyDispatch$C4;Lnet/minecraft/world/level/block/state/properties/DoubleBlockHalf;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/PropertyDispatch$C4; # configureDoorHalf +protected net.minecraft.client.data.models.BlockModelGenerators m_373578_()V # createPitcherPlant +protected net.minecraft.client.data.models.BlockModelGenerators m_373590_(Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$static$50 +protected net.minecraft.client.data.models.BlockModelGenerators m_373608_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/BlockModelGenerators$PlantType;)V # createPlant +protected net.minecraft.client.data.models.BlockModelGenerators m_373622_(Lnet/minecraft/world/level/block/Block;Ljava/util/function/Function;)V # createBeeNest +protected net.minecraft.client.data.models.BlockModelGenerators m_373634_()V # createScaffolding +protected net.minecraft.client.data.models.BlockModelGenerators m_373643_()V # createVault +protected net.minecraft.client.data.models.BlockModelGenerators m_373651_(Lnet/minecraft/client/data/models/blockstates/MultiPartGenerator;Lnet/minecraft/client/data/models/blockstates/Condition$TerminalCondition;Lnet/minecraft/client/data/models/blockstates/VariantProperties$Rotation;Lcom/mojang/datafixers/util/Pair;)V # lambda$addSlotStateAndRotationVariants$63 +protected net.minecraft.client.data.models.BlockModelGenerators m_373660_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/model/TextureMapping;Ljava/util/function/BiConsumer;)Lnet/minecraft/client/data/models/blockstates/BlockStateGenerator; # createPillarBlockUVLocked +protected net.minecraft.client.data.models.BlockModelGenerators m_373673_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/BlockStateGenerator; # createButton +protected net.minecraft.client.data.models.BlockModelGenerators m_373680_(Lnet/minecraft/world/level/block/Block;)V # createCopperBulb +protected net.minecraft.client.data.models.BlockModelGenerators m_373694_()V # createCauldrons +protected net.minecraft.client.data.models.BlockModelGenerators m_373697_()V # createSoulFire +protected net.minecraft.client.data.models.BlockModelGenerators m_373701_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/BlockStateGenerator; # createWall +protected net.minecraft.client.data.models.BlockModelGenerators m_373707_(Lnet/minecraft/world/level/block/Block;)V # createPottedAzalea +protected net.minecraft.client.data.models.BlockModelGenerators m_373721_(Lnet/minecraft/world/level/block/Block;)V # createNonTemplateHorizontalBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_373723_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;)V # createGlassBlocks +protected net.minecraft.client.data.models.BlockModelGenerators m_373729_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/model/TexturedModel$Provider;)V # createHorizontallyRotatedBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_373730_(Lnet/minecraft/world/level/block/Block;Ljava/lang/String;Lnet/minecraft/client/data/models/model/ModelTemplate;Ljava/util/function/Function;)Lnet/minecraft/resources/ResourceLocation; # createSuffixedVariant +protected net.minecraft.client.data.models.BlockModelGenerators m_373738_(Ljava/util/function/Function;Ljava/lang/Integer;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createSnifferEgg$48 +protected net.minecraft.client.data.models.BlockModelGenerators m_373743_(Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$wrapModels$23 +protected net.minecraft.client.data.models.BlockModelGenerators m_373750_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/model/TextureMapping;)V # lambda$createMossyCarpet$58 +protected net.minecraft.client.data.models.BlockModelGenerators m_373795_(ILjava/lang/String;Lnet/minecraft/client/data/models/model/TextureMapping;)Lnet/minecraft/resources/ResourceLocation; # createTurtleEggModel +protected net.minecraft.client.data.models.BlockModelGenerators m_373801_(Lnet/minecraft/world/item/Item;Lnet/minecraft/world/level/block/Block;)Lnet/minecraft/resources/ResourceLocation; # createFlatItemModelWithBlockTexture +protected net.minecraft.client.data.models.BlockModelGenerators m_373808_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/client/data/models/model/TextureMapping;Ljava/util/function/BiConsumer;)Lnet/minecraft/client/data/models/blockstates/BlockStateGenerator; # createMirroredCubeGenerator +protected net.minecraft.client.data.models.BlockModelGenerators m_373813_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/SkullBlock$Type;Lnet/minecraft/resources/ResourceLocation;)V # createHead +protected net.minecraft.client.data.models.BlockModelGenerators m_373825_(Lnet/minecraft/world/level/block/Block;)V # createAnvil +protected net.minecraft.client.data.models.BlockModelGenerators m_373827_()V # createTallSeagrass +protected net.minecraft.client.data.models.BlockModelGenerators m_373843_()V # createHeads +protected net.minecraft.client.data.models.BlockModelGenerators m_373844_()V # createLightningRod +protected net.minecraft.client.data.models.BlockModelGenerators m_373857_([ILnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/BlockModelGenerators$PlantType;Ljava/lang/Integer;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createCrossBlock$9 +protected net.minecraft.client.data.models.BlockModelGenerators m_373862_()V # createFire +protected net.minecraft.client.data.models.BlockModelGenerators m_373864_()V # createBrewingStand +protected net.minecraft.client.data.models.BlockModelGenerators m_373879_()V # createMagmaBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_373894_(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createCopperBulb$22 +protected net.minecraft.client.data.models.BlockModelGenerators m_373901_(Lnet/minecraft/client/data/models/blockstates/Variant;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createSoulFire$30 +protected net.minecraft.client.data.models.BlockModelGenerators m_373907_([ILit/unimi/dsi/fastutil/ints/Int2ObjectMap;Lnet/minecraft/world/level/block/Block;Ljava/lang/Integer;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createCropBlock$18 +protected net.minecraft.client.data.models.BlockModelGenerators m_373916_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/state/properties/Property;[I)V # createCropBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_373929_()V # createSunflower +protected net.minecraft.client.data.models.BlockModelGenerators m_373935_(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/world/level/block/entity/trialspawner/TrialSpawnerState;Ljava/lang/Boolean;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createTrialSpawner$37 +protected net.minecraft.client.data.models.BlockModelGenerators m_373936_()V # createLilyPad +protected net.minecraft.client.data.models.BlockModelGenerators m_373941_(Lnet/minecraft/world/level/block/Block;)Ljava/util/List; # createSideFireModels +protected net.minecraft.client.data.models.BlockModelGenerators m_373945_()V # createTurtleEgg +protected net.minecraft.client.data.models.BlockModelGenerators m_373948_(Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$static$54 +protected net.minecraft.client.data.models.BlockModelGenerators m_373958_()Lnet/minecraft/client/data/models/blockstates/PropertyDispatch; # createHorizontalFacingDispatch +protected net.minecraft.client.data.models.BlockModelGenerators m_373961_(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/client/data/models/model/TextureMapping;)V # lambda$createGrassBlocks$36 +protected net.minecraft.client.data.models.BlockModelGenerators m_373973_(Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$static$53 +protected net.minecraft.client.data.models.BlockModelGenerators m_373974_()V # createBell +protected net.minecraft.client.data.models.BlockModelGenerators m_373976_()Lnet/minecraft/client/data/models/blockstates/PropertyDispatch; # createHorizontalFacingDispatchAlt +protected net.minecraft.client.data.models.BlockModelGenerators m_373984_(Lnet/minecraft/world/level/block/Block;)V # createPassiveRail +protected net.minecraft.client.data.models.BlockModelGenerators m_373986_(Lnet/minecraft/core/FrontAndTop;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createJigsaw$66 +protected net.minecraft.client.data.models.BlockModelGenerators m_373989_(Lnet/minecraft/world/level/block/Block;)V # createRotatableColumn +protected net.minecraft.client.data.models.BlockModelGenerators m_374000_(Lnet/minecraft/world/level/block/Block;)V # createRotatedVariantBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_374002_(Lnet/minecraft/data/BlockFamily;)V # lambda$run$67 +protected net.minecraft.client.data.models.BlockModelGenerators m_374004_()V # createCalibratedSculkSensor +protected net.minecraft.client.data.models.BlockModelGenerators m_374006_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/model/TextureMapping;)V # createPumpkinVariant +protected net.minecraft.client.data.models.BlockModelGenerators m_374030_()V # createChests +protected net.minecraft.client.data.models.BlockModelGenerators m_374031_(Ljava/lang/Comparable;Lnet/minecraft/client/data/models/blockstates/Variant;Lnet/minecraft/client/data/models/blockstates/Variant;Ljava/lang/Comparable;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createEmptyOrFullDispatch$16 +protected net.minecraft.client.data.models.BlockModelGenerators m_374032_(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Ljava/lang/Boolean;Lnet/minecraft/world/level/block/state/properties/RailShape;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createActiveRail$12 +protected net.minecraft.client.data.models.BlockModelGenerators m_374036_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/blockstates/Condition$TerminalCondition;)V # lambda$createMultifaceBlockStates$56 +protected net.minecraft.client.data.models.BlockModelGenerators m_374041_(Lnet/minecraft/world/level/block/Block;Ljava/lang/String;)V # registerSimpleFlatItemModel +protected net.minecraft.client.data.models.BlockModelGenerators m_374042_(Lnet/minecraft/world/level/block/Block;)V # createTrapdoor +protected net.minecraft.client.data.models.BlockModelGenerators m_374064_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/model/TexturedModel$Provider;)Lnet/minecraft/resources/ResourceLocation; # lambda$createCreakingHeart$8 +protected net.minecraft.client.data.models.BlockModelGenerators m_374071_(Ljava/lang/Boolean;Ljava/lang/Boolean;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createTripwireHook$45 +protected net.minecraft.client.data.models.BlockModelGenerators m_374076_(Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$static$49 +protected net.minecraft.client.data.models.BlockModelGenerators m_374126_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;)V # createDoubleBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_374134_(I)Ljava/util/List; # createBambooModels +protected net.minecraft.client.data.models.BlockModelGenerators m_374141_(Lnet/minecraft/world/level/block/Block;)V # createBrushableBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_374146_(Lnet/minecraft/world/level/block/Block;)V # createHangingMoss +protected net.minecraft.client.data.models.BlockModelGenerators m_374177_()V # createCrafterBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_374200_(Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$static$51 +protected net.minecraft.client.data.models.BlockModelGenerators m_374216_(Lnet/minecraft/world/level/block/Block;)V # createOrientableTrapdoor +protected net.minecraft.client.data.models.BlockModelGenerators m_374249_()V # createChorusPlant +protected net.minecraft.client.data.models.BlockModelGenerators m_374256_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;)V # createFullAndCarpetBlocks +protected net.minecraft.client.data.models.BlockModelGenerators m_374262_(Lnet/minecraft/client/data/models/blockstates/Variant;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createSoulFire$31 +protected net.minecraft.client.data.models.BlockModelGenerators m_374265_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;)V # createAirLikeBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_374268_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/item/DyeColor;)V # createBanner +protected net.minecraft.client.data.models.BlockModelGenerators m_374271_(Lnet/minecraft/world/level/block/state/properties/StructureMode;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createStructureBlock$43 +protected net.minecraft.client.data.models.BlockModelGenerators m_374273_()V # createNetherrack +protected net.minecraft.client.data.models.BlockModelGenerators m_374284_()V # createInfestedDeepslate +protected net.minecraft.client.data.models.BlockModelGenerators m_374293_()V # createPistons +protected net.minecraft.client.data.models.BlockModelGenerators m_374299_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/BlockStateGenerator; # createFence +protected net.minecraft.client.data.models.BlockModelGenerators m_374303_(Lnet/minecraft/world/level/block/Block;)V # createNyliumBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_374308_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;)V # createCandleAndCandleCake +protected net.minecraft.client.data.models.BlockModelGenerators m_374309_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/model/TextureMapping;)V # lambda$createCreakingHeart$7 +protected net.minecraft.client.data.models.BlockModelGenerators m_374312_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/model/TextureMapping;)V # lambda$createMossyCarpet$57 +protected net.minecraft.client.data.models.BlockModelGenerators m_374339_()V # createRedstoneWire +protected net.minecraft.client.data.models.BlockModelGenerators m_374347_()V # createBarrel +protected net.minecraft.client.data.models.BlockModelGenerators m_374348_()V # createRespawnAnchor +protected net.minecraft.client.data.models.BlockModelGenerators m_374353_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;)Lnet/minecraft/resources/ResourceLocation; # createParticleOnlyBlockModel +protected net.minecraft.client.data.models.BlockModelGenerators m_374355_()V # createFrogspawnBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_374363_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/BlockModelGenerators$PlantType;)V # createDoublePlantWithDefaultItem +protected net.minecraft.client.data.models.BlockModelGenerators m_374364_(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/world/level/block/state/properties/SculkSensorPhase;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createCalibratedSculkSensor$40 +protected net.minecraft.client.data.models.BlockModelGenerators m_374369_(Lnet/minecraft/world/level/block/Block;Ljava/lang/String;)V # registerTwoLayerFlatItemModel +protected net.minecraft.client.data.models.BlockModelGenerators m_374379_(Ljava/lang/Integer;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createRepeater$41 +protected net.minecraft.client.data.models.BlockModelGenerators m_374411_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/item/DyeColor;)V # createBed +protected net.minecraft.client.data.models.BlockModelGenerators m_374412_()V # createTripwireHook +protected net.minecraft.client.data.models.BlockModelGenerators m_374415_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/BlockStateGenerator; # createCustomFence +protected net.minecraft.client.data.models.BlockModelGenerators m_374416_()V # createHopper +protected net.minecraft.client.data.models.BlockModelGenerators m_374434_(Lnet/minecraft/world/level/block/Block;)V # createDoor +protected net.minecraft.client.data.models.BlockModelGenerators m_374436_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/blockstates/Condition$TerminalCondition;Lnet/minecraft/core/Direction;)V # lambda$createMossyCarpet$59 +protected net.minecraft.client.data.models.BlockModelGenerators m_374440_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/data/models/blockstates/BlockStateGenerator; # createCopperBulb +protected net.minecraft.client.data.models.BlockModelGenerators m_374454_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;)V # createCoralFans +protected net.minecraft.client.data.models.BlockModelGenerators m_374464_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;)V # createNormalTorch +protected net.minecraft.client.data.models.BlockModelGenerators m_374484_()V # createSeaPickle +protected net.minecraft.client.data.models.BlockModelGenerators m_374486_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/BlockModelGenerators$PlantType;)V # createDoublePlant +protected net.minecraft.client.data.models.BlockModelGenerators m_374496_(Lnet/minecraft/world/level/block/Block;)Lnet/minecraft/client/data/models/BlockModelGenerators$WoodProvider; # woodProvider +protected net.minecraft.client.data.models.BlockModelGenerators m_374498_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Z)Lnet/minecraft/client/data/models/blockstates/BlockStateGenerator; # createFenceGate +protected net.minecraft.client.data.models.BlockModelGenerators m_374503_([Lnet/minecraft/resources/ResourceLocation;Ljava/lang/Integer;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createRespawnAnchor$65 +protected net.minecraft.client.data.models.BlockModelGenerators m_374511_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/BlockModelGenerators$PlantType;Lnet/minecraft/world/level/block/state/properties/Property;[I)V # createCrossBlock +protected net.minecraft.client.data.models.BlockModelGenerators m_374514_(Lnet/minecraft/world/level/block/Block;)V # createActiveRail +protected net.minecraft.client.data.models.BlockModelGenerators m_374516_(Lnet/minecraft/world/level/block/Block;Ljava/lang/Integer;Lnet/minecraft/world/level/block/state/properties/DoubleBlockHalf;)Lnet/minecraft/client/data/models/blockstates/Variant; # lambda$createPitcherCrop$11 +protected net.minecraft.client.data.models.BlockModelGenerators m_374532_(Lnet/minecraft/client/data/models/blockstates/MultiPartGenerator;Lnet/minecraft/client/data/models/blockstates/Condition$TerminalCondition;Lnet/minecraft/client/data/models/blockstates/VariantProperties$Rotation;Lnet/minecraft/world/level/block/state/properties/BooleanProperty;Lnet/minecraft/client/data/models/model/ModelTemplate;Z)V # addBookSlotModel +protected net.minecraft.client.data.models.BlockModelGenerators m_374541_(Lnet/minecraft/client/data/models/model/ModelTemplate;Ljava/lang/String;Lnet/minecraft/client/data/models/model/TextureMapping;Lnet/minecraft/client/data/models/BlockModelGenerators$BookSlotModelCacheKey;)Lnet/minecraft/resources/ResourceLocation; # lambda$addBookSlotModel$64 +protected net.minecraft.client.data.models.BlockModelGenerators m_374546_()V # createCakeBlock +#endgroup +protected net.minecraft.client.data.models.BlockModelGenerators f_371124_ # itemModelOutput +protected net.minecraft.client.data.models.BlockModelGenerators f_371133_ # modelOutput +protected net.minecraft.client.data.models.BlockModelGenerators f_371615_ # blockStateOutput +public net.minecraft.client.data.models.BlockModelGenerators$BlockFamilyProvider +#group protected net.minecraft.client.data.models.BlockModelGenerators$BlockFamilyProvider *() +protected net.minecraft.client.data.models.BlockModelGenerators$BlockFamilyProvider m_372389_(Lnet/minecraft/world/level/block/Block;)V # trapdoor +protected net.minecraft.client.data.models.BlockModelGenerators$BlockFamilyProvider m_372633_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/model/ModelTemplate;)Lnet/minecraft/resources/ResourceLocation; # lambda$getOrCreateModel$0 +protected net.minecraft.client.data.models.BlockModelGenerators$BlockFamilyProvider m_373052_(Lnet/minecraft/world/level/block/Block;)Lnet/minecraft/client/data/models/BlockModelGenerators$BlockFamilyProvider; # door +protected net.minecraft.client.data.models.BlockModelGenerators$BlockFamilyProvider m_373078_(Lnet/minecraft/client/data/models/model/ModelTemplate;Lnet/minecraft/world/level/block/Block;)Lnet/minecraft/resources/ResourceLocation; # getOrCreateModel +protected net.minecraft.client.data.models.BlockModelGenerators$BlockFamilyProvider m_373633_(Lnet/minecraft/data/BlockFamily$Variant;Lnet/minecraft/world/level/block/Block;)V # lambda$generateFor$1 +protected net.minecraft.client.data.models.BlockModelGenerators$BlockFamilyProvider m_373732_(Lnet/minecraft/world/level/block/Block;)Lnet/minecraft/client/data/models/BlockModelGenerators$BlockFamilyProvider; # fullBlockVariant +#endgroup +public net.minecraft.client.data.models.BlockModelGenerators$WoodProvider +#group protected net.minecraft.client.data.models.ItemModelGenerators *() +protected net.minecraft.client.data.models.ItemModelGenerators m_372103_(Lnet/minecraft/world/item/Item;I)V # generateDyedItem +protected net.minecraft.client.data.models.ItemModelGenerators m_372177_(Lnet/minecraft/world/item/Item;)V # generateBundleModels +protected net.minecraft.client.data.models.ItemModelGenerators m_372280_(Lnet/minecraft/world/item/Item;Lnet/minecraft/client/data/models/model/ModelTemplate;)V # generateFlatItem +protected net.minecraft.client.data.models.ItemModelGenerators m_372299_(Lnet/minecraft/world/item/Item;)V # generateClockItem +protected net.minecraft.client.data.models.ItemModelGenerators m_372587_(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;)V # generateLayeredItem +protected net.minecraft.client.data.models.ItemModelGenerators m_372592_(Lnet/minecraft/world/item/Item;)Ljava/util/List; # createCompassModels +protected net.minecraft.client.data.models.ItemModelGenerators m_372634_(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/resources/ResourceLocation; # generateLayeredItem +protected net.minecraft.client.data.models.ItemModelGenerators m_372677_(Lnet/minecraft/world/item/Item;Lnet/minecraft/resources/ResourceLocation;)V # addPotionTint +protected net.minecraft.client.data.models.ItemModelGenerators m_372690_(Lnet/minecraft/world/item/Item;)V # generateCrossbow +protected net.minecraft.client.data.models.ItemModelGenerators m_372771_(Lnet/minecraft/world/item/Item;)V # generateGoatHorn +protected net.minecraft.client.data.models.ItemModelGenerators m_372861_(Lnet/minecraft/world/item/Item;)V # generatePotion +protected net.minecraft.client.data.models.ItemModelGenerators m_372885_(Lnet/minecraft/world/item/Item;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/resources/ResourceLocation; # generateLayeredItem +protected net.minecraft.client.data.models.ItemModelGenerators m_372915_(Lnet/minecraft/world/item/Item;Lnet/minecraft/client/color/item/ItemTintSource;)V # generateItemWithTintedOverlay +protected net.minecraft.client.data.models.ItemModelGenerators m_372919_(Lnet/minecraft/world/item/Item;Lnet/minecraft/resources/ResourceKey;Ljava/lang/String;Z)V # generateTrimmableItem +protected net.minecraft.client.data.models.ItemModelGenerators m_372969_(Lnet/minecraft/world/item/Item;Ljava/lang/String;Lnet/minecraft/client/data/models/model/ModelTemplate;)Lnet/minecraft/resources/ResourceLocation; # createFlatItemModel +protected net.minecraft.client.data.models.ItemModelGenerators m_373030_(Lnet/minecraft/world/item/Item;)V # generateShield +protected net.minecraft.client.data.models.ItemModelGenerators m_373037_(Lnet/minecraft/world/item/Item;)V # generateStandardCompassItem +protected net.minecraft.client.data.models.ItemModelGenerators m_373158_(Lnet/minecraft/world/item/Item;Lnet/minecraft/client/data/models/model/ModelTemplate;Ljava/lang/String;)Lnet/minecraft/resources/ResourceLocation; # generateBundleCoverModel +protected net.minecraft.client.data.models.ItemModelGenerators m_373235_(Lnet/minecraft/world/item/Item;)V # generateTippedArrow +protected net.minecraft.client.data.models.ItemModelGenerators m_373294_(Lnet/minecraft/client/renderer/item/ItemModel$Unbaked;Lnet/minecraft/client/renderer/item/ItemModel$Unbaked;)Lnet/minecraft/client/renderer/item/ItemModel$Unbaked; # createFlatModelDispatch +protected net.minecraft.client.data.models.ItemModelGenerators m_373463_(Lnet/minecraft/world/item/Item;)V # declareCustomModelItem +protected net.minecraft.client.data.models.ItemModelGenerators m_373547_(Lnet/minecraft/world/item/Item;)V # generateSpyglass +protected net.minecraft.client.data.models.ItemModelGenerators m_373727_(Lnet/minecraft/world/item/Item;)V # generateElytra +protected net.minecraft.client.data.models.ItemModelGenerators m_373789_(Lnet/minecraft/world/item/Item;Lnet/minecraft/client/renderer/item/properties/conditional/ConditionalItemModelProperty;Lnet/minecraft/client/renderer/item/ItemModel$Unbaked;Lnet/minecraft/client/renderer/item/ItemModel$Unbaked;)V # generateBooleanDispatch +protected net.minecraft.client.data.models.ItemModelGenerators m_373819_(Lnet/minecraft/world/item/Item;Ljava/lang/String;Lnet/minecraft/client/color/item/ItemTintSource;)V # generateItemWithTintedOverlay +protected net.minecraft.client.data.models.ItemModelGenerators m_373839_(Lnet/minecraft/world/item/Item;)V # generateTrident +protected net.minecraft.client.data.models.ItemModelGenerators m_373858_(Lnet/minecraft/world/item/Item;Lnet/minecraft/client/data/models/model/ModelTemplate;)Lnet/minecraft/resources/ResourceLocation; # createFlatItemModel +protected net.minecraft.client.data.models.ItemModelGenerators m_373869_(Lnet/minecraft/world/item/Item;Lnet/minecraft/world/item/Item;Lnet/minecraft/client/data/models/model/ModelTemplate;)Lnet/minecraft/resources/ResourceLocation; # createFlatItemModel +protected net.minecraft.client.data.models.ItemModelGenerators m_373892_(Lnet/minecraft/world/item/Item;)V # generateWolfArmor +protected net.minecraft.client.data.models.ItemModelGenerators m_374089_(Lnet/minecraft/world/item/Item;)V # generateBow +protected net.minecraft.client.data.models.ItemModelGenerators m_374190_(Lnet/minecraft/world/item/Item;)V # generateFishingRod +protected net.minecraft.client.data.models.ItemModelGenerators m_374289_(Lnet/minecraft/world/item/Item;)V # generateBrush +protected net.minecraft.client.data.models.ItemModelGenerators m_374337_(Lnet/minecraft/world/item/Item;Lnet/minecraft/world/item/Item;Lnet/minecraft/client/data/models/model/ModelTemplate;)V # generateFlatItem +protected net.minecraft.client.data.models.ItemModelGenerators m_374345_(Lnet/minecraft/world/item/Item;II)V # generateSpawnEgg +protected net.minecraft.client.data.models.ItemModelGenerators m_374365_(Lnet/minecraft/world/item/Item;)V # generateRecoveryCompassItem +#endgroup +protected net.minecraft.client.data.models.ItemModelGenerators f_370758_ # modelOutput +protected net.minecraft.client.data.models.ItemModelGenerators f_370978_ # itemModelOutput +public net.minecraft.client.data.models.ModelProvider$BlockStateGeneratorCollector +public net.minecraft.client.data.models.ModelProvider$BlockStateGeneratorCollector ()V # constructor +public net.minecraft.client.data.models.ModelProvider$ItemInfoCollector +public net.minecraft.client.data.models.ModelProvider$ItemInfoCollector ()V # constructor +public net.minecraft.client.data.models.ModelProvider$SimpleModelCollector +public net.minecraft.client.data.models.ModelProvider$SimpleModelCollector ()V # constructor protected net.minecraft.client.gui.components.AbstractButton f_290895_ # SPRITES protected net.minecraft.client.gui.components.AbstractSelectionList$Entry f_93521_ # list protected net.minecraft.client.gui.components.AbstractSliderButton m_293290_()Lnet/minecraft/resources/ResourceLocation; # getHandleSprite @@ -48,7 +392,6 @@ public net.minecraft.client.renderer.RenderStateShard$TransparencyStateShard public net.minecraft.client.renderer.RenderStateShard$WriteMaskStateShard public net.minecraft.client.renderer.RenderType m_173215_(Ljava/lang/String;Lcom/mojang/blaze3d/vertex/VertexFormat;Lcom/mojang/blaze3d/vertex/VertexFormat$Mode;IZZLnet/minecraft/client/renderer/RenderType$CompositeState;)Lnet/minecraft/client/renderer/RenderType$CompositeRenderType; # create public net.minecraft.client.renderer.RenderType$CompositeState -protected net.minecraft.client.renderer.block.model.BakedOverrides ()V # constructor public net.minecraft.client.renderer.block.model.BlockElement m_111320_(Lnet/minecraft/core/Direction;)[F # uvsByFace public net.minecraft.client.renderer.block.model.BlockElement$Deserializer public net.minecraft.client.renderer.block.model.BlockElement$Deserializer ()V # constructor @@ -56,13 +399,10 @@ public net.minecraft.client.renderer.block.model.BlockElementFace$Deserializer public net.minecraft.client.renderer.block.model.BlockElementFace$Deserializer ()V # constructor public net.minecraft.client.renderer.block.model.BlockFaceUV$Deserializer public net.minecraft.client.renderer.block.model.BlockFaceUV$Deserializer ()V # constructor -public net.minecraft.client.renderer.block.model.BlockModel f_111417_ # textureMap public net.minecraft.client.renderer.block.model.BlockModel f_111418_ # parent public net.minecraft.client.renderer.block.model.BlockModel f_111424_ # hasAmbientOcclusion -public net.minecraft.client.renderer.block.model.BlockModel m_111437_(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.renderer.block.model.BlockModel f_370667_ # textureSlots public net.minecraft.client.renderer.block.model.ItemModelGenerator m_111638_(ILjava/lang/String;Lnet/minecraft/client/renderer/texture/SpriteContents;)Ljava/util/List; # processFrames -public net.minecraft.client.renderer.block.model.ItemOverride$Deserializer -public net.minecraft.client.renderer.block.model.ItemOverride$Deserializer ()V # constructor public net.minecraft.client.renderer.block.model.ItemTransform$Deserializer public net.minecraft.client.renderer.block.model.ItemTransform$Deserializer ()V # constructor public net.minecraft.client.renderer.block.model.ItemTransform$Deserializer f_111769_ # DEFAULT_ROTATION @@ -76,18 +416,18 @@ private-f net.minecraft.client.renderer.blockentity.PistonHeadRenderer f_112441_ public net.minecraft.client.renderer.blockentity.SkullBlockRenderer f_112519_ # SKIN_BY_TYPE public net.minecraft.client.renderer.entity.EntityRenderDispatcher f_114362_ # renderers public net.minecraft.client.renderer.entity.EntityRenderers m_174036_(Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/client/renderer/entity/EntityRendererProvider;)V # register -public net.minecraft.client.renderer.entity.ItemRenderer m_115162_(Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;Ljava/util/List;Lnet/minecraft/world/item/ItemStack;II)V # renderQuadList -public net.minecraft.client.renderer.entity.ItemRenderer m_115189_(Lnet/minecraft/client/resources/model/BakedModel;Lnet/minecraft/world/item/ItemStack;IILcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;)V # renderModelLists +public net.minecraft.client.renderer.entity.ItemRenderer m_115162_(Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;Ljava/util/List;[III)V # renderQuadList +public net.minecraft.client.renderer.entity.ItemRenderer m_115189_(Lnet/minecraft/client/resources/model/BakedModel;[IIILcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;)V # renderModelLists public net.minecraft.client.renderer.entity.LivingEntityRenderer m_115326_(Lnet/minecraft/client/renderer/entity/layers/RenderLayer;)Z # addLayer protected net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer m_117078_(Lnet/minecraft/client/renderer/entity/state/HumanoidRenderState;Lnet/minecraft/world/entity/EquipmentSlot;)Lnet/minecraft/client/model/HumanoidModel; # getArmorModel +public net.minecraft.client.renderer.item.BlockModelWrapper f_371418_ # model public net.minecraft.client.renderer.texture.SpriteContents f_243731_ # byMipLevel default net.minecraft.client.renderer.texture.SpriteContents f_244575_ # animatedTexture default net.minecraft.client.renderer.texture.SpriteContents m_245088_()I # getFrameCount public net.minecraft.client.resources.ClientPackSource m_246691_(Ljava/nio/file/Path;)Lnet/minecraft/server/packs/VanillaPackResources; # createVanillaPackSource 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.resources.model.SimpleBakedModel$Builder (ZZZLnet/minecraft/client/renderer/block/model/ItemTransforms;)V # constructor 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 @@ -234,6 +574,7 @@ protected net.minecraft.world.level.biome.BiomeGenerationSettings$PlainBuilder f protected net.minecraft.world.level.biome.BiomeGenerationSettings$PlainBuilder f_254678_ # carvers protected net.minecraft.world.level.biome.BiomeGenerationSettings$PlainBuilder m_255276_(I)V # addFeatureStepsUpTo #group protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder * +protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder f_371299_ # backgroundMusicVolume protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder f_48005_ # fogColor protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder f_48006_ # waterColor protected net.minecraft.world.level.biome.BiomeSpecialEffects$Builder f_48007_ # waterFogColor @@ -352,8 +693,8 @@ public net.minecraft.world.level.block.WoolCarpetBlock (Lnet/minecraft/wor public net.minecraft.world.level.block.Block m_49805_(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;I)V # popExperience public net.minecraft.world.level.block.FireBlock m_221164_(Lnet/minecraft/world/level/block/state/BlockState;)I # getBurnOdds public net.minecraft.world.level.block.FireBlock m_221166_(Lnet/minecraft/world/level/block/state/BlockState;)I # getIgniteOdds +public net.minecraft.world.level.block.entity.BlockEntityType (Lnet/minecraft/world/level/block/entity/BlockEntityType$BlockEntitySupplier;Ljava/util/Set;)V # constructor public net.minecraft.world.level.block.entity.BlockEntityType$BlockEntitySupplier -public net.minecraft.world.level.block.entity.BlockEntityType (Lnet/minecraft/world/level/block/entity/BlockEntityType$BlockEntitySupplier;Ljava/util/Set;)V # public net.minecraft.world.level.block.entity.HopperBlockEntity m_59395_(I)V # setCooldown public net.minecraft.world.level.block.entity.HopperBlockEntity m_59409_()Z # isOnCustomCooldown public net.minecraft.world.level.block.state.properties.BlockSetType m_272115_(Lnet/minecraft/world/level/block/state/properties/BlockSetType;)Lnet/minecraft/world/level/block/state/properties/BlockSetType; # register @@ -399,4 +740,4 @@ public net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacerType < protected net.minecraft.world.level.portal.PortalForcer f_77648_ # level public net.minecraft.world.level.storage.LevelResource (Ljava/lang/String;)V # constructor private-f net.minecraft.world.level.storage.loot.LootPool f_79028_ # rolls -private-f net.minecraft.world.level.storage.loot.LootPool f_79029_ # bonusRolls +private-f net.minecraft.world.level.storage.loot.LootPool f_79029_ # bonusRolls \ No newline at end of file diff --git a/src/test/generated/additional_model/assets/additional_model/blockstates/cow_head.json b/src/test/generated/additional_model/assets/additional_model/blockstates/cow_head.json new file mode 100644 index 0000000000..0f6b03807b --- /dev/null +++ b/src/test/generated/additional_model/assets/additional_model/blockstates/cow_head.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "additional_model:block/cow_head" + } + } +} \ No newline at end of file diff --git a/src/test/generated/additional_model/assets/additional_model/items/pig_head.json b/src/test/generated/additional_model/assets/additional_model/items/pig_head.json new file mode 100644 index 0000000000..7b0a90ef9c --- /dev/null +++ b/src/test/generated/additional_model/assets/additional_model/items/pig_head.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "additional_model:block/pig_head" + } +} \ No newline at end of file diff --git a/src/test/generated/additional_model/assets/additional_model/models/block/cow_head.json b/src/test/generated/additional_model/assets/additional_model/models/block/cow_head.json new file mode 100644 index 0000000000..adc6359e28 --- /dev/null +++ b/src/test/generated/additional_model/assets/additional_model/models/block/cow_head.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "minecraft:block/bedrock" + } +} \ No newline at end of file diff --git a/src/test/generated/additional_model/assets/additional_model/models/block/pig_head.json b/src/test/generated/additional_model/assets/additional_model/models/block/pig_head.json new file mode 100644 index 0000000000..ab65fe9087 --- /dev/null +++ b/src/test/generated/additional_model/assets/additional_model/models/block/pig_head.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "minecraft:block/cobblestone" + } +} \ No newline at end of file diff --git a/src/test/generated/mdk_datagen/pack.mcmeta b/src/test/generated/mdk_datagen/pack.mcmeta index d5c1bd6c9a..e6a650030c 100644 --- a/src/test/generated/mdk_datagen/pack.mcmeta +++ b/src/test/generated/mdk_datagen/pack.mcmeta @@ -1,6 +1,6 @@ { "pack": { "description": "${mod_id} resources", - "pack_format": 42 + "pack_format": 46 } } \ No newline at end of file diff --git a/src/test/generated/test_helper_mod/pack.mcmeta b/src/test/generated/test_helper_mod/pack.mcmeta index 77feec54eb..6b178df5a7 100644 --- a/src/test/generated/test_helper_mod/pack.mcmeta +++ b/src/test/generated/test_helper_mod/pack.mcmeta @@ -1,6 +1,6 @@ { "pack": { "description": "Forge tests resource pack", - "pack_format": 42 + "pack_format": 46 } } \ No newline at end of file diff --git a/src/test/java/net/minecraftforge/debug/client/AdditionalModelTest.java b/src/test/java/net/minecraftforge/debug/client/AdditionalModelTest.java new file mode 100644 index 0000000000..2cd91e2f41 --- /dev/null +++ b/src/test/java/net/minecraftforge/debug/client/AdditionalModelTest.java @@ -0,0 +1,230 @@ +/* + * Copyright (c) Forge Development LLC and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.minecraftforge.debug.client; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.data.models.BlockModelGenerators; +import net.minecraft.client.data.models.ItemModelGenerators; +import net.minecraft.client.data.models.model.ItemModelUtils; +import net.minecraft.client.data.models.model.ModelLocationUtils; +import net.minecraft.client.data.models.model.ModelTemplates; +import net.minecraft.client.data.models.model.TextureMapping; +import net.minecraft.client.model.CowModel; +import net.minecraft.client.model.PigModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; +import net.minecraft.client.renderer.entity.state.PigRenderState; +import net.minecraft.client.renderer.item.BlockModelWrapper; +import net.minecraft.client.renderer.item.ItemStackRenderState; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.resources.model.ModelResourceLocation; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.CachedOutput; +import net.minecraft.data.DataProvider; +import net.minecraft.data.PackOutput; +import net.minecraft.gametest.framework.GameTest; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.animal.Cow; +import net.minecraft.world.entity.animal.Pig; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraftforge.client.event.EntityRenderersEvent; +import net.minecraftforge.client.event.ModelEvent; +import net.minecraftforge.client.model.data.ModelData; +import net.minecraftforge.data.event.GatherDataEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.loading.FMLLoader; +import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.RegistryObject; +import net.minecraftforge.test.BaseTestMod; + +import java.nio.file.Path; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Stream; + +import com.google.gson.JsonElement; +import com.mojang.blaze3d.vertex.PoseStack; + +@Mod(AdditionalModelTest.MODID) +@GameTestHolder("forge." + AdditionalModelTest.MODID) +public class AdditionalModelTest extends BaseTestMod { + public static final String MODID = "additional_model"; + + private static final DeferredRegister BLOCKS = DeferredRegister.create(Registries.BLOCK, MODID); + private static final RegistryObject PIG_HEAD = BLOCKS.register("pig_head", () -> new Block(BlockBehaviour.Properties.of().setId(BLOCKS.key("pig_head")))); + private static final RegistryObject COW_HEAD = BLOCKS.register("cow_head", () -> new Block(BlockBehaviour.Properties.of().setId(BLOCKS.key("cow_head")))); + + private static final DeferredRegister ITEMS = DeferredRegister.create(Registries.ITEM, MODID); + private static final RegistryObject PIG_HEAD_ITEM = ITEMS.register("pig_head", () -> new Item(new Item.Properties().setId(ITEMS.key("pig_head")))); + + private static ResourceLocation rl(String path) { + return ResourceLocation.fromNamespaceAndPath(MODID, path); + } + + public AdditionalModelTest(FMLJavaModLoadingContext context) { + super(context, false); + + modBus.register(this); + + if (FMLLoader.getLaunchHandler().isData()) { + BLOCKS.register(modBus); + ITEMS.register(modBus); + } + } + + @SubscribeEvent + public void runData(GatherDataEvent event) { + var out = event.getGenerator().getPackOutput(); + event.getGenerator().addProvider(event.includeClient(), new ModelProvider(out)); + } + + + @SubscribeEvent + public void onRegisterAdditional(ModelEvent.RegisterModelStateDefinitions event) { + // Our fake blocks are only created during data gen, so we have to add a fake mapper + event.register(rl("cow_head"), + new StateDefinition.Builder(Blocks.AIR) + .create(Block::defaultBlockState, BlockState::new) + ); + } + + @GameTest(template = "forge:empty3x3x3") + public static void item_model(GameTestHelper helper) { + var manager = Minecraft.getInstance().getModelManager(); + + var key = rl("pig_head"); + var model = manager.getItemModel(key); + if (model == null) + helper.fail("Failed to retreive " + key + " item model"); + + if (!(model instanceof BlockModelWrapper)) + helper.fail("Itme Model was " + model.getClass() + " when BlockModelWrapper expected"); + + helper.succeed(); + } + + @GameTest(template = "forge:empty3x3x3") + public static void block_model(GameTestHelper helper) { + var manager = Minecraft.getInstance().getModelManager(); + + var key = new ModelResourceLocation(rl("cow_head"), ""); + var model = manager.getModel(key); + + if (model == null) + helper.fail("Failed to retreive " + key + " block model"); + + helper.succeed(); + } + + // An example on how to render both the item and block model variants + //@SubscribeEvent + public void onAddLayers(EntityRenderersEvent.AddLayers event) { + // Pigs get a block on their head, this is a test of going through the ItemModel loader + LivingEntityRenderer pig = event.getEntityRenderer(EntityType.PIG); + pig.addLayer(new RenderLayer<>(pig) { + @Override + public void render(PoseStack stack, MultiBufferSource source, int light, PigRenderState state, float xRot, float yRot) { + this.getParentModel().getAnyDescendantWithName("head").ifPresent(part -> { + var manager = Minecraft.getInstance().getModelManager(); + stack.pushPose(); + this.getParentModel().root().translateAndRotate(stack); + part.translateAndRotate(stack); + stack.scale(0.5F, 0.5F, 0.5F); + stack.translate(0, -1, -0.5); + + var model = manager.getItemModel(rl("pig_head")); + if (model instanceof BlockModelWrapper wrapper) { + var itemState = new ItemStackRenderState(); + itemState.newLayer().setupBlockModel(wrapper.model, RenderType.solid()); + itemState.render(stack, source, light, light); + } + stack.popPose(); + }); + } + }); + + + // Cows get a block on their head, this is a test of going through the BlockModel loader + LivingEntityRenderer cow = event.getEntityRenderer(EntityType.COW); + cow.addLayer(new RenderLayer<>(cow) { + @Override + public void render(PoseStack stack, MultiBufferSource source, int light, LivingEntityRenderState state, float xRot, float yRot) { + this.getParentModel().getAnyDescendantWithName("head").ifPresent(part -> { + var manager = Minecraft.getInstance().getModelManager(); + var renderer = Minecraft.getInstance().getBlockRenderer().getModelRenderer(); + + stack.pushPose(); + + this.getParentModel().root().translateAndRotate(stack); + part.translateAndRotate(stack); + stack.scale(0.5F, 0.5F, 0.5F); + stack.translate(-0.5, -0.5, -0.5); + stack.translate(0, -1, -0.5); + + var ml = new ModelResourceLocation(rl("cow_head"), ""); + var model = manager.getModel(ml); + + var consumer = source.getBuffer(RenderType.solid()); + renderer.renderModel(stack.last(), consumer, null, model, 1.0F, 1.0F, 1.0F, light, OverlayTexture.NO_OVERLAY, ModelData.EMPTY, null); + stack.popPose(); + }); + } + }); + } + + public class ModelProvider extends net.minecraft.client.data.models.ModelProvider { + public ModelProvider(PackOutput output) { + super(output); + } + + protected Stream getKnownBlocks() { + return Stream.of(PIG_HEAD.get(), COW_HEAD.get()); + } + + protected Stream getKnownItems() { + return Stream.of(PIG_HEAD_ITEM.get()); + } + + protected BlockModelGenerators getBlockModelGenerators(BlockStateGeneratorCollector blocks, ItemInfoCollector items, SimpleModelCollector models) { + return new BlockModelGenerators(blocks, items, models) { + @Override + public void run() { + ModelTemplates.CUBE_ALL.create(PIG_HEAD.get(), TextureMapping.cube(Blocks.COBBLESTONE), this.modelOutput); + var cow = ModelTemplates.CUBE_ALL.create(COW_HEAD.get(), TextureMapping.cube(Blocks.BEDROCK), this.modelOutput); + this.blockStateOutput.accept(createSimpleBlock(COW_HEAD.get(), cow)); + } + }; + } + + protected ItemModelGenerators getItemModelGenerators(ItemInfoCollector items, SimpleModelCollector models) { + return new ItemModelGenerators(items, models) { + @Override + public void run() { + this.itemModelOutput.accept(PIG_HEAD_ITEM.get(), ItemModelUtils.plainModel(ModelLocationUtils.getModelLocation(PIG_HEAD.get()))); + } + }; + } + + static CompletableFuture saveAll(CachedOutput p_378816_, Function p_377914_, Map> p_377836_) { + return DataProvider.saveAll(p_378816_, Supplier::get, p_377914_, p_377836_); + } + } +} diff --git a/src/test/java/net/minecraftforge/debug/client/LateBoundIdMapperTest.java b/src/test/java/net/minecraftforge/debug/client/LateBoundIdMapperTest.java new file mode 100644 index 0000000000..b3df94d73f --- /dev/null +++ b/src/test/java/net/minecraftforge/debug/client/LateBoundIdMapperTest.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) Forge Development LLC and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.minecraftforge.debug.client; + +import net.minecraft.client.color.item.ItemTintSource; +import net.minecraft.client.color.item.ItemTintSources; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.gametest.framework.GameTest; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.test.BaseTestMod; +import javax.annotation.Nullable; + +import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.Codec; +import com.mojang.serialization.JsonOps; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +@Mod(LateBoundIdMapperTest.MODID) +@GameTestHolder("forge." + LateBoundIdMapperTest.MODID) +public class LateBoundIdMapperTest extends BaseTestMod { + public LateBoundIdMapperTest(FMLJavaModLoadingContext context) { + super(context); + } + + public static final String MODID = "late_bound_id_mapper"; + private static ResourceLocation rl(String path) { + return ResourceLocation.fromNamespaceAndPath(MODID, path); + } + + @GameTest(template = "forge:empty3x3x3") + public static void compound(GameTestHelper helper) { + var ID_MAPPER = ItemTintSources.ID_MAPPER; + + ID_MAPPER.put(rl("test"), Test.CODEC); + + var expected = new Test(10); + + var encoded = ItemTintSources.CODEC.encodeStart(JsonOps.INSTANCE, expected).result().orElse(null); + if (encoded == null) + helper.fail("Failed to encode test value"); + + var found = ItemTintSources.CODEC.decode(JsonOps.INSTANCE, encoded).result().orElse(Pair.of(null, null)).getFirst(); + if (found == null) + helper.fail("Failed to decode test value"); + + if (!found.equals(expected)) + helper.fail("Decoded value was not the same as encoded"); + + helper.succeed(); + } + + private record Test(int value) implements ItemTintSource { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( + b -> b.group(Codec.INT.fieldOf("value").forGetter(Test::value)).apply(b, Test::new) + ); + + @Override + public int calculate(ItemStack stack, @Nullable ClientLevel level, @Nullable LivingEntity entity) { + return this.value; + } + + @Override + public MapCodec type() { + return CODEC; + } + } +} diff --git a/src/test/java/net/minecraftforge/test/BaseTestMod.java b/src/test/java/net/minecraftforge/test/BaseTestMod.java index 89d936fdb9..aae036e92c 100644 --- a/src/test/java/net/minecraftforge/test/BaseTestMod.java +++ b/src/test/java/net/minecraftforge/test/BaseTestMod.java @@ -30,9 +30,15 @@ public abstract class BaseTestMod { protected final IEventBus modBus; public BaseTestMod(FMLJavaModLoadingContext context) { - // TODO: Some form of enable flag? + this(context, true); + } + public BaseTestMod(FMLJavaModLoadingContext context, boolean register) { this.modBus = context.getModEventBus(); + + if (!register) + return; + modBus.register(this); Class cls = getClass();