Add hooks for using Vanilla's new Client data generator (#10206)

Add new hook for custom block models that do not have real blocks backing them
Some workspace cleanup fixing log4j annotation processor
This commit is contained in:
LexManos authored and GitHub committed 2024-12-19 10:41:21 -08:00
1 parent 07977ba242
commit 0e74886f8d
55 files changed
+1346 -75

No files matched your search

@@ -94,14 +94,14 @@ public final class ForgeEventFactoryClient {
/**
* Post an event to the {@link ModLoader#get()} event bus
*/
private static <T extends Event & IModBusEvent> T postModBus(T e) {
private static <T extends Event & IModBusEvent> T fireModBus(T e) {
ML.postEvent(e);
return e;
}
public static void onGatherLayers(Map<EntityType<?>, EntityRenderer<?, ?>> renderers, Map<Model, EntityRenderer<? extends Player, ?>> 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<Type, Function<EntityModelSet, SkullModelBase>> onCreateSkullModels() {
var builder = ImmutableMap.<Type, Function<EntityModelSet, SkullModelBase>>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());
}
}
@@ -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
*
* <p>This event is fired on the {@linkplain FMLJavaModLoadingContext#getModEventBus() mod-specific event bus},
* only on the {@linkplain LogicalSide#CLIENT logical client}.</p>
*/
public static class RegisterModelStateDefinitions extends ModelEvent implements IModBusEvent {
private final Map<ResourceLocation, StateDefinition<Block, BlockState>> states = new HashMap<>();
private final Map<ResourceLocation, StateDefinition<Block, BlockState>> view = Collections.unmodifiableMap(states);
@ApiStatus.Internal
public RegisterModelStateDefinitions() { }
/**
* Returns a read only view of the extra registered models
*/
public Map<ResourceLocation, StateDefinition<Block, BlockState>> getStates() {
return this.view;
}
/**
* Registers a StateDefinition for a synthetic block.
*/
public void register(ResourceLocation key, StateDefinition<Block, BlockState> 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);
}
@@ -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<BlockModelBuilder>
{
public BlockModelBuilder(ResourceLocation outputLocation, ExistingFileHelper existingFileHelper)
@@ -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<BlockModelBuilder> {
public BlockModelProvider(PackOutput output, String modid, ExistingFileHelper existingFileHelper) {
@@ -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
@@ -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 {
/**
@@ -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<T extends ModelBuilder<T>>
{
protected final ResourceLocation loaderId;
@@ -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
{
@@ -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<ItemModelBuilder> {
protected List<OverrideBuilder> overrides = new ArrayList<>();
@@ -37,7 +42,7 @@ public class ItemModelBuilder extends ModelBuilder<ItemModelBuilder> {
/**
* 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
@@ -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<ItemModelBuilder> {
public ItemModelProvider(PackOutput output, String modid, ExistingFileHelper existingFileHelper) {
@@ -50,7 +50,12 @@ import org.joml.Vector3f;
* @see ItemModelBuilder
*
* @param <T> 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<T extends ModelBuilder<T>> extends ModelFile {
@Nullable
@@ -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;
@@ -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<T extends ModelBuilder<T>> implements DataProvider {
public static final String BLOCK_FOLDER = "block";
@@ -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<PartBuilder> parts = new ArrayList<>();
private final Block owner;
@@ -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();
@@ -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<T extends ModelBuilder<T>> extends CustomLoaderBuilder<T>
{
private static final ResourceLocation NAME = ResourceLocation.fromNamespaceAndPath("forge", "composite");
@@ -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<T extends ModelBuilder<T>> extends CustomLoaderBuilder<T>
{
private static final ResourceLocation NAME = ResourceLocation.fromNamespaceAndPath("forge", "fluid_container");
@@ -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<T extends ModelBuilder<T>> extends CustomLoaderBuilder<T>
{
private static final ResourceLocation NAME = ResourceLocation.fromNamespaceAndPath("forge", "item_layers");
@@ -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<T extends ModelBuilder<T>> extends CustomLoaderBuilder<T>
{
private static final ResourceLocation NAME = ResourceLocation.fromNamespaceAndPath("forge", "obj");
@@ -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<T extends ModelBuilder<T>> extends CustomLoaderBuilder<T>
{
private static final ResourceLocation NAME = ResourceLocation.fromNamespaceAndPath("forge", "separate_transforms");
@@ -35,7 +35,7 @@ public class BakedModelRenderable implements IRenderable<BakedModelRenderable.Co
* Constructs a {@link BakedModelRenderable} from the given model location.
* The model is expected to have been baked ahead of time.
*
* @see net.minecraftforge.client.event.ModelEvent.RegisterAdditional
* @see net.minecraftforge.client.event.ModelEvent.RegisterModelStateDefinitions
*/
public static BakedModelRenderable of(ModelResourceLocation model) {
return of(Minecraft.getInstance().getModelManager().getModel(model));
@@ -6,6 +6,7 @@
package net.minecraftforge.data.loading;
import net.minecraft.Util;
import net.minecraft.client.ClientBootstrap;
import net.minecraft.data.registries.VanillaRegistries;
import net.minecraft.server.Bootstrap;
import net.minecraftforge.common.data.ExistingFileHelper;
@@ -21,7 +22,6 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.regex.Pattern;
@@ -42,8 +42,9 @@ public class DatagenModLoader {
return new DatagenModLoader(parser, client);
}
@SuppressWarnings("unused")
private final OptionParser parser;
private final boolean client;
private final OptionSpec<Void> client;
private final OptionSpec<String> existing;
private final OptionSpec<String> existingMod;
private final OptionSpec<String> 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());