diff --git a/javafmllanguage/src/main/java/net/minecraftforge/fml/javafmlmod/AutomaticEventSubscriber.java b/javafmllanguage/src/main/java/net/minecraftforge/fml/javafmlmod/AutomaticEventSubscriber.java index 1953bcf8a5..0f8d394d50 100644 --- a/javafmllanguage/src/main/java/net/minecraftforge/fml/javafmlmod/AutomaticEventSubscriber.java +++ b/javafmllanguage/src/main/java/net/minecraftforge/fml/javafmlmod/AutomaticEventSubscriber.java @@ -53,6 +53,8 @@ public class AutomaticEventSubscriber { private static final Type AUTO_SUBSCRIBER = Type.getType(EventBusSubscriber.class); private static final Type MOD_TYPE = Type.getType(Mod.class); private static final Type ONLY_IN_TYPE = Type.getType(OnlyIn.class); + private static final List DEFAULT_SIDES = List.of(new EnumData(null, "CLIENT"), new EnumData(null, "DEDICATED_SERVER")); + private static final EnumData DEFAULT_BUS = new EnumData(null, "BOTH"); public static void inject(ModContainer mod, ModFileScanData scanData, ClassLoader loader) { if (scanData == null) return; @@ -71,9 +73,6 @@ public class AutomaticEventSubscriber { .filter(data -> MOD_TYPE.equals(data.annotationType())) .collect(Collectors.toMap(a -> a.clazz().getClassName(), a -> (String)a.annotationData().get("value"))); - var defaultSides = List.of(new EnumData(null, "CLIENT"), new EnumData(null, "DEDICATED_SERVER")); - var defaultBus = new EnumData(null, "FORGE"); - for (var data : targets) { if (!FMLEnvironment.production && onlyIns.contains(data.clazz().getClassName())) { throw new RuntimeException("Found @OnlyIn on @EventBusSubscriber class " + data.clazz().getClassName() + " - this is not allowed as it causes crashes. Remove the OnlyIn and set value=Dist.CLIENT in the EventBusSubscriber annotation instead"); @@ -82,13 +81,13 @@ public class AutomaticEventSubscriber { var modId = modids.getOrDefault(data.clazz().getClassName(), mod.getModId()); modId = value(data, "modid", modId); - var sidesValue = value(data, "value", defaultSides); + var sidesValue = value(data, "value", DEFAULT_SIDES); var sides = sidesValue.stream() .map(EnumData::value) .map(Dist::valueOf) .collect(Collectors.toSet()); - var busName = value(data, "bus", defaultBus).value(); + var busName = value(data, "bus", DEFAULT_BUS).value(); var busTarget = Bus.valueOf(busName); if (Objects.equals(mod.getModId(), modId) && sides.contains(FMLEnvironment.dist)) { try { @@ -173,7 +172,7 @@ public class AutomaticEventSubscriber { Class eventType = (Class) parameterTypes[0]; var subscribeEventAnnotation = method.getAnnotation(SubscribeEvent.class); - registerListener(busGroup, paramCount, returnType, eventType, subscribeEventAnnotation, method); + registerListener(busGroup, paramCount, returnType, eventType, subscribeEventAnnotation, method, false); listenersCount++; if (firstValidListenerEventType == null) @@ -259,7 +258,7 @@ public class AutomaticEventSubscriber { throw fail(method, "Return type boolean is only valid for cancellable events"); } - registerListener(busGroup, paramCount, returnType, eventType, subscribeEventAnnotation, method); + registerListener(busGroup, paramCount, returnType, eventType, subscribeEventAnnotation, method, true); listenersCount++; if (firstValidListenerEventType == null) @@ -276,11 +275,24 @@ public class AutomaticEventSubscriber { @SuppressWarnings({"unchecked", "rawtypes"}) private static EventListener registerListener(@Nullable BusGroup busGroup, int paramCount, Class returnType, Class eventType, - SubscribeEvent subscribeEventAnnotation, Method method) { + SubscribeEvent subscribeEventAnnotation, Method method, boolean strict) { if (busGroup == null) { busGroup = IModBusEvent.class.isAssignableFrom(eventType) ? FMLJavaModLoadingContext.get().getModBusGroup() : BusGroup.DEFAULT; + } else if (strict) { + String solution = "To fix this, remove the bus param from your @EventBusSubscriber annotation or move this event listener to another class."; + var isDefaultBusGroup = busGroup == BusGroup.DEFAULT; + var isModBusEvent = IModBusEvent.class.isAssignableFrom(eventType); + if (isDefaultBusGroup && isModBusEvent) { // requested forge bus and has IModBusEvent + throw fail(method, "Event type " + eventType.getName() + + " is on the mod BusGroup but you are asking to register it on the default BusGroup (BusGroup.DEFAULT/EventBusSubscriber.Bus.FORGE). " + + solution); + } else if (!isDefaultBusGroup && !isModBusEvent) { // requested mod bus and does not have IModBusEvent + throw fail(method, "Event type " + eventType.getName() + + " is on the default BusGroup but you are asking to register it on the mod BusGroup (context.getModBusGroup()/EventBusSubscriber.Bus.MOD). " + + solution); + } } // determine the listener type from its parameters and return type diff --git a/javafmllanguage/src/main/java/net/minecraftforge/fml/javafmlmod/FMLModContainer.java b/javafmllanguage/src/main/java/net/minecraftforge/fml/javafmlmod/FMLModContainer.java index ddf980876f..f0edc6d6de 100644 --- a/javafmllanguage/src/main/java/net/minecraftforge/fml/javafmlmod/FMLModContainer.java +++ b/javafmllanguage/src/main/java/net/minecraftforge/fml/javafmlmod/FMLModContainer.java @@ -193,6 +193,6 @@ public class FMLModContainer extends ModContainer { @Override public String toString() { - return "FMLModContainer[" + this.getModInfo().getModId() + ", " + this.getClass().getName() + "]"; + return "FMLModContainer[" + this.getModInfo().getModId() + ", " + this.getClass().getName() + ']'; } } diff --git a/src/main/java/net/minecraftforge/client/ClientForgeMod.java b/src/main/java/net/minecraftforge/client/ClientForgeMod.java index d5513d2233..a6d8807928 100644 --- a/src/main/java/net/minecraftforge/client/ClientForgeMod.java +++ b/src/main/java/net/minecraftforge/client/ClientForgeMod.java @@ -7,6 +7,7 @@ package net.minecraftforge.client; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.client.resources.model.UnbakedGeometry; +import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.ModelEvent; import net.minecraftforge.client.event.RegisterClientReloadListenersEvent; @@ -21,10 +22,10 @@ import net.minecraftforge.fml.common.Mod; public class ClientForgeMod { @SubscribeEvent public static void onRegisterGeometryLoaders(ModelEvent.RegisterGeometryLoaders event) { - event.register("empty", (json, ctx) -> UnbakedGeometry.EMPTY); - event.register("obj", ObjLoader.INSTANCE); - event.register("fluid_container", DynamicFluidContainerModel.Loader.INSTANCE); - event.register("item_layers", ItemLayerGeometry.Loader.INSTANCE); + event.register(forgeRL("empty"), (json, ctx) -> UnbakedGeometry.EMPTY); + event.register(forgeRL("obj"), ObjLoader.INSTANCE); + event.register(forgeRL("fluid_container"), DynamicFluidContainerModel.Loader.INSTANCE); + event.register(forgeRL("item_layers"), ItemLayerGeometry.Loader.INSTANCE); } @SubscribeEvent @@ -34,6 +35,10 @@ public class ClientForgeMod { @SubscribeEvent public static void onRegisterNamedRenderTypes(RegisterNamedRenderTypesEvent event) { - event.register("item_unlit", ChunkSectionLayer.TRANSLUCENT, ForgeRenderTypes.ITEM_UNSORTED_UNLIT_TRANSLUCENT.get()); + event.register(forgeRL("item_unlit"), ChunkSectionLayer.TRANSLUCENT, ForgeRenderTypes.ITEM_UNSORTED_UNLIT_TRANSLUCENT.get()); + } + + private static ResourceLocation forgeRL(String path) { + return ResourceLocation.fromNamespaceAndPath("forge", path); } } diff --git a/src/main/java/net/minecraftforge/client/event/ModelEvent.java b/src/main/java/net/minecraftforge/client/event/ModelEvent.java index c4e4f75995..66b1027756 100644 --- a/src/main/java/net/minecraftforge/client/event/ModelEvent.java +++ b/src/main/java/net/minecraftforge/client/event/ModelEvent.java @@ -155,8 +155,6 @@ public abstract sealed class ModelEvent { /** * Allows users to register their own {@link IGeometryLoader geometry loaders} for use in block/item models. * - *

This event is not {@linkplain Cancelable cancellable}, and does not {@linkplain HasResult have a result}.

- * *

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

*/ @@ -174,13 +172,23 @@ public abstract sealed class ModelEvent { /** * Registers a new geometry loader. + * @param resourceLocation The namespace should match your mod's namespace, such as your mod ID */ + public void register(ResourceLocation resourceLocation, IGeometryLoader loader) { + Preconditions.checkArgument(!loaders.containsKey(resourceLocation), "Geometry loader already registered: " + resourceLocation); + loaders.put(resourceLocation, loader); + } + + /** + * Registers a new geometry loader. + * @deprecated Use {@link #register(ResourceLocation, IGeometryLoader)} instead. + */ + @Deprecated(forRemoval = true, since = "1.21.9") // removed in 1.21.9 public void register(String name, IGeometryLoader loader) { @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); + register(key, loader); } } } diff --git a/src/main/java/net/minecraftforge/client/event/RegisterNamedRenderTypesEvent.java b/src/main/java/net/minecraftforge/client/event/RegisterNamedRenderTypesEvent.java index abf0e1e377..5a391b45dd 100644 --- a/src/main/java/net/minecraftforge/client/event/RegisterNamedRenderTypesEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RegisterNamedRenderTypesEvent.java @@ -13,6 +13,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraftforge.client.RenderTypeGroup; import net.minecraftforge.eventbus.api.bus.BusGroup; import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.characteristic.SelfDestructing; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.event.IModBusEvent; @@ -25,7 +26,7 @@ import java.util.Map; * *

This event is fired only on the {@linkplain LogicalSide#CLIENT logical client}.

*/ -public final class RegisterNamedRenderTypesEvent implements IModBusEvent { +public final class RegisterNamedRenderTypesEvent implements SelfDestructing, IModBusEvent { public static EventBus getBus(BusGroup modBusGroup) { return IModBusEvent.getBus(modBusGroup, RegisterNamedRenderTypesEvent.class); } @@ -40,10 +41,40 @@ public final class RegisterNamedRenderTypesEvent implements IModBusEvent { /** * Registers a named {@link RenderTypeGroup}. * - * @param name The name + * @param resourceLocation The namespace should match your mod's namespace, such as your mod ID * @param blockRenderType What ChunkSectionLayer to render in * @param entityRenderType A {@link RenderType} using {@link DefaultVertexFormat#NEW_ENTITY} */ + public void register(ResourceLocation resourceLocation, ChunkSectionLayer blockRenderType, RenderType entityRenderType) { + register(resourceLocation, blockRenderType, entityRenderType, entityRenderType); + } + + /** + * Registers a named {@link RenderTypeGroup}. + * + * @param key The namespace should match your mod's namespace, such as your mod ID + * @param blockRenderType What ChunkSectionLayer to render in + * @param entityRenderType A {@link RenderType} using {@link DefaultVertexFormat#NEW_ENTITY} + * @param fabulousEntityRenderType A {@link RenderType} using {@link DefaultVertexFormat#NEW_ENTITY} for use when + * "fabulous" rendering is enabled + */ + public void register(ResourceLocation key, ChunkSectionLayer blockRenderType, RenderType entityRenderType, RenderType fabulousEntityRenderType) { + Preconditions.checkArgument(!renderTypes.containsKey(key), "Render type already registered: " + key); + Preconditions.checkArgument(entityRenderType.format() == DefaultVertexFormat.NEW_ENTITY, "The entity render type must use the NEW_ENTITY vertex format."); + Preconditions.checkArgument(fabulousEntityRenderType.format() == DefaultVertexFormat.NEW_ENTITY, "The fabulous entity render type must use the NEW_ENTITY vertex format."); + renderTypes.put(key, new RenderTypeGroup(blockRenderType, entityRenderType, fabulousEntityRenderType)); + } + + /** + * Registers a named {@link RenderTypeGroup}. + * + * @param name The name + * @param blockRenderType What ChunkSectionLayer to render in + * @param entityRenderType A {@link RenderType} using {@link DefaultVertexFormat#NEW_ENTITY} + * + * @deprecated Use {@link #register(ResourceLocation, ChunkSectionLayer, RenderType, RenderType)} instead. + */ + @Deprecated(forRemoval = true, since = "1.21.9") // removed in 1.21.9 public void register(String name, ChunkSectionLayer blockRenderType, RenderType entityRenderType) { register(name, blockRenderType, entityRenderType, entityRenderType); } @@ -56,13 +87,13 @@ public final class RegisterNamedRenderTypesEvent implements IModBusEvent { * @param entityRenderType A {@link RenderType} using {@link DefaultVertexFormat#NEW_ENTITY} * @param fabulousEntityRenderType A {@link RenderType} using {@link DefaultVertexFormat#NEW_ENTITY} for use when * "fabulous" rendering is enabled + * + * @deprecated Use {@link #register(ResourceLocation, ChunkSectionLayer, RenderType, RenderType)} instead. */ + @Deprecated(forRemoval = true, since = "1.21.9") // removed in 1.21.9 public void register(String name, ChunkSectionLayer blockRenderType, RenderType entityRenderType, RenderType fabulousEntityRenderType) { @SuppressWarnings("removal") var key = ResourceLocation.fromNamespaceAndPath(ModLoadingContext.get().getActiveNamespace(), name); - Preconditions.checkArgument(!renderTypes.containsKey(key), "Render type already registered: " + key); - Preconditions.checkArgument(entityRenderType.format() == DefaultVertexFormat.NEW_ENTITY, "The entity render type must use the NEW_ENTITY vertex format."); - Preconditions.checkArgument(fabulousEntityRenderType.format() == DefaultVertexFormat.NEW_ENTITY, "The fabulous entity render type must use the NEW_ENTITY vertex format."); - renderTypes.put(key, new RenderTypeGroup(blockRenderType, entityRenderType, fabulousEntityRenderType)); + register(key, blockRenderType, entityRenderType, fabulousEntityRenderType); } } diff --git a/src/main/java/net/minecraftforge/client/event/RegisterTextureAtlasSpriteLoadersEvent.java b/src/main/java/net/minecraftforge/client/event/RegisterTextureAtlasSpriteLoadersEvent.java index 2704c681df..047ba4f378 100644 --- a/src/main/java/net/minecraftforge/client/event/RegisterTextureAtlasSpriteLoadersEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RegisterTextureAtlasSpriteLoadersEvent.java @@ -39,12 +39,22 @@ public final class RegisterTextureAtlasSpriteLoadersEvent implements SelfDestruc /** * Registers a custom {@link ITextureAtlasSpriteLoader sprite loader}. + * @param resourceLocation The namespace should match your mod's namespace, such as your mod ID */ + public void register(ResourceLocation resourceLocation, ITextureAtlasSpriteLoader loader) { + Preconditions.checkArgument(!loaders.containsKey(resourceLocation), "Sprite loader already registered: " + resourceLocation); + Preconditions.checkArgument(!loaders.containsValue(loader), "Sprite loader already registered as " + loaders.inverse().get(loader)); + loaders.put(resourceLocation, loader); + } + + /** + * Registers a custom {@link ITextureAtlasSpriteLoader sprite loader}. + * @deprecated Use {@link #register(ResourceLocation, ITextureAtlasSpriteLoader)} instead. + */ + @Deprecated(forRemoval = true, since = "1.21.9") // removed in 1.21.9 public void register(String name, ITextureAtlasSpriteLoader loader) { @SuppressWarnings("removal") var key = ResourceLocation.fromNamespaceAndPath(ModLoadingContext.get().getActiveNamespace(), name); - Preconditions.checkArgument(!loaders.containsKey(key), "Sprite loader already registered: " + key); - Preconditions.checkArgument(!loaders.containsValue(loader), "Sprite loader already registered as " + loaders.inverse().get(loader)); - loaders.put(key, loader); + register(key, loader); } } diff --git a/src/main/java/net/minecraftforge/client/event/sound/SoundEngineLoadEvent.java b/src/main/java/net/minecraftforge/client/event/sound/SoundEngineLoadEvent.java index e2135344ad..8dd9fe42c4 100644 --- a/src/main/java/net/minecraftforge/client/event/sound/SoundEngineLoadEvent.java +++ b/src/main/java/net/minecraftforge/client/event/sound/SoundEngineLoadEvent.java @@ -6,24 +6,21 @@ package net.minecraftforge.client.event.sound; import net.minecraft.client.sounds.SoundEngine; -import net.minecraftforge.common.util.HasResult; import net.minecraftforge.eventbus.api.bus.BusGroup; import net.minecraftforge.eventbus.api.bus.EventBus; -import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.event.IModBusEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; /** * Fired when the {@link SoundEngine} is constructed or (re)loaded, such as during game initialization or when the sound * output device is changed. * - *

This event is not {@linkplain Cancellable cancellable}, and does not {@linkplain HasResult have a result}.

- * *

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

*/ +@NullMarked public final class SoundEngineLoadEvent extends SoundEvent implements IModBusEvent { public static EventBus getBus(BusGroup modBusGroup) { return IModBusEvent.getBus(modBusGroup, SoundEngineLoadEvent.class); diff --git a/src/main/java/net/minecraftforge/common/capabilities/CapabilityManager.java b/src/main/java/net/minecraftforge/common/capabilities/CapabilityManager.java index 47f2830424..638627f2be 100644 --- a/src/main/java/net/minecraftforge/common/capabilities/CapabilityManager.java +++ b/src/main/java/net/minecraftforge/common/capabilities/CapabilityManager.java @@ -9,6 +9,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraftforge.fml.Logging; import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.ModLoader; +import net.minecraftforge.forgespi.language.ModFileScanData; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.ApiStatus; @@ -91,7 +92,7 @@ public final class CapabilityManager { var autos = modlist.getAllScanData().stream() .flatMap(e -> e.getAnnotations().stream()) .filter(a -> AUTO_REGISTER.equals(a.annotationType())) - .map(a -> a.clazz()) + .map(ModFileScanData.AnnotationData::clazz) .distinct() .sorted(Comparator.comparing(Type::toString)) .toList(); diff --git a/src/main/java/net/minecraftforge/common/capabilities/RegisterCapabilitiesEvent.java b/src/main/java/net/minecraftforge/common/capabilities/RegisterCapabilitiesEvent.java index 13b6a5b43c..05f8554d04 100644 --- a/src/main/java/net/minecraftforge/common/capabilities/RegisterCapabilitiesEvent.java +++ b/src/main/java/net/minecraftforge/common/capabilities/RegisterCapabilitiesEvent.java @@ -9,6 +9,7 @@ import java.util.Objects; import net.minecraftforge.eventbus.api.bus.BusGroup; import net.minecraftforge.eventbus.api.bus.EventBus; +import org.jspecify.annotations.NullMarked; import org.objectweb.asm.Type; import net.minecraftforge.fml.event.IModBusEvent; @@ -20,6 +21,7 @@ import net.minecraftforge.fml.event.IModBusEvent; * @deprecated Use {@link AutoRegisterCapability} annotation on your class. */ @Deprecated(forRemoval = true, since = "1.21") +@NullMarked public final class RegisterCapabilitiesEvent implements IModBusEvent { public static EventBus getBus(BusGroup modBusGroup) { return IModBusEvent.getBus(modBusGroup, RegisterCapabilitiesEvent.class); diff --git a/src/main/java/net/minecraftforge/event/entity/SpawnPlacementRegisterEvent.java b/src/main/java/net/minecraftforge/event/entity/SpawnPlacementRegisterEvent.java index f9868a0ba3..d99b8d1d37 100644 --- a/src/main/java/net/minecraftforge/event/entity/SpawnPlacementRegisterEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/SpawnPlacementRegisterEvent.java @@ -18,6 +18,7 @@ import net.minecraft.world.entity.SpawnPlacements; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraftforge.eventbus.api.bus.BusGroup; import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.listener.Priority; import net.minecraftforge.fml.event.IModBusEvent; import net.minecraftforge.registries.ForgeRegistries; @@ -26,20 +27,19 @@ import org.jetbrains.annotations.ApiStatus; /** * This event allows each {@link EntityType} to have a {@link SpawnPlacements.SpawnPredicate} registered or modified. * Spawn Predicates are checked whenever an {@link Entity} of the given {@link EntityType} spawns in the world naturally. - * - * If registering your own entity's spawn placements, you should use {@link SpawnPlacementRegisterEvent#register(EntityType, SpawnPlacements.Type, Heightmap.Types, SpawnPlacements.SpawnPredicate, Operation)} + *
+ * If registering your own entity's spawn placements, you should use {@link SpawnPlacementRegisterEvent#register(EntityType, SpawnPlacementType, Heightmap.Types, SpawnPlacements.SpawnPredicate, Operation)} * So that you ensure that your entity has a heightmap type and placement type registered. - * + *
* If modifying vanilla or another mod's spawn placements, you can use three operations: - * REPLACE: checked first, the last mod to replace the predicate wipes out all other predicates. Listen with a low {@link EventPriority} if you need to do this. - * OR: checked second, only one of these predicates must pass along with the original predicate - * AND: checked third, these predicates must all pass along with the original predicate - * - *

- * This event is not {@linkplain Cancelable cancellable} and does not {@linkplain Event.HasResult have a result}. + *

    + *
  • REPLACE: checked first, the last mod to replace the predicate wipes out all other predicates. Listen with a low {@link Priority} if you need to do this.
  • + *
  • OR: checked second, only one of these predicates must pass along with the original predicate
  • + *
  • AND: checked third, these predicates must all pass along with the original predicate
  • + *
*

* - * Fired on the Mod bus {@link IModBusEvent}.
+ * Fired on the Mod bus {@link IModBusEvent}. */ public final class SpawnPlacementRegisterEvent implements IModBusEvent { public static EventBus getBus(BusGroup modBusGroup) { diff --git a/src/main/java/net/minecraftforge/registries/DeferredRegister.java b/src/main/java/net/minecraftforge/registries/DeferredRegister.java index 67992e21a5..93a75ba49c 100644 --- a/src/main/java/net/minecraftforge/registries/DeferredRegister.java +++ b/src/main/java/net/minecraftforge/registries/DeferredRegister.java @@ -12,7 +12,6 @@ import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; -import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.eventbus.api.bus.BusGroup; import net.minecraftforge.fml.javafmlmod.FMLModContainer; import net.minecraftforge.registries.tags.ITagManager; @@ -20,7 +19,6 @@ import net.minecraftforge.registries.tags.ITagManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.lang.invoke.MethodHandles; import java.util.Collection; import java.util.Collections; import java.util.HashSet; @@ -322,7 +320,9 @@ public class DeferredRegister { * your language provider's equivalent. */ public void register(BusGroup modBusGroup) { - modBusGroup.register(EventDispatcher.LOOKUP, new EventDispatcher()); + var dispatcher = new EventDispatcher(); + RegisterEvent.getBus(modBusGroup).addListener(dispatcher::handleEvent); + NewRegistryEvent.getBus(modBusGroup).addListener(dispatcher::createRegistry); } /** @@ -376,9 +376,6 @@ public class DeferredRegister { } private final class EventDispatcher { - private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); - - @SubscribeEvent public void handleEvent(RegisterEvent event) { if (event.getRegistryKey().equals(registryKey)) { seenRegisterEvent = true; @@ -392,7 +389,6 @@ public class DeferredRegister { } } - @SubscribeEvent public void createRegistry(NewRegistryEvent event) { if (registryFactory != null) event.create(registryFactory.get(), DeferredRegister.this::onFill); diff --git a/src/test/java/net/minecraftforge/test/BaseTestMod.java b/src/test/java/net/minecraftforge/test/BaseTestMod.java index ef100ca91a..53585fea6c 100644 --- a/src/test/java/net/minecraftforge/test/BaseTestMod.java +++ b/src/test/java/net/minecraftforge/test/BaseTestMod.java @@ -103,7 +103,7 @@ public abstract class BaseTestMod { } - private final class LookupHelper { + private static final class LookupHelper { private static final Lookup INSTANCE; static { try {