Ensure that API implementations can never be null.

This commit is contained in:
modmuss50 2021-11-06 20:12:45 +00:00
parent 5521a561ea
commit 8a8e3d81de
22 changed files with 28 additions and 43 deletions
fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric
api/blockrenderlayer/v1
impl/blockrenderlayer
fabric-containers-v0/src/main/java/net/fabricmc/fabric
fabric-content-registries-v0/src/main/java/net/fabricmc/fabric
fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric
fabric-models-v0/src/main/java/net/fabricmc/fabric
fabric-rendering-fluids-v1/src/main/java/net/fabricmc/fabric
api/client/render/fluid/v1
impl/client/rendering/fluid
mixin/client/rendering/fluid
fabric-rendering-v1/src/main/java/net/fabricmc/fabric

View file

@ -36,7 +36,7 @@ import net.fabricmc.fabric.impl.blockrenderlayer.BlockRenderLayerMapImpl;
* <p>Client-side only.
*/
public interface BlockRenderLayerMap {
BlockRenderLayerMap INSTANCE = BlockRenderLayerMapImpl.INSTANCE;
BlockRenderLayerMap INSTANCE = new BlockRenderLayerMapImpl();
/**
* Map (or re-map) a block state with a render layer. Re-mapping is not recommended but if done, last one in wins.

View file

@ -28,7 +28,7 @@ import net.minecraft.item.Item;
import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap;
public class BlockRenderLayerMapImpl implements BlockRenderLayerMap {
private BlockRenderLayerMapImpl() { }
public BlockRenderLayerMapImpl() { }
@Override
public void putBlock(Block block, RenderLayer renderLayer) {
@ -75,8 +75,6 @@ public class BlockRenderLayerMapImpl implements BlockRenderLayerMap {
}
}
public static final BlockRenderLayerMap INSTANCE = new BlockRenderLayerMapImpl();
private static Map<Block, RenderLayer> blockRenderLayerMap = new HashMap<>();
private static Map<Item, RenderLayer> itemRenderLayerMap = new HashMap<>();
private static Map<Fluid, RenderLayer> fluidRenderLayerMap = new HashMap<>();

View file

@ -29,7 +29,7 @@ import net.fabricmc.fabric.impl.client.container.ScreenProviderRegistryImpl;
*/
@Deprecated
public interface ScreenProviderRegistry {
ScreenProviderRegistry INSTANCE = ScreenProviderRegistryImpl.INSTANCE;
ScreenProviderRegistry INSTANCE = new ScreenProviderRegistryImpl();
/**
* Register a "Container -&gt; ContainerScreen" factory. This is used only on the client side.

View file

@ -32,7 +32,7 @@ import net.fabricmc.fabric.impl.container.ContainerProviderImpl;
*/
@Deprecated
public interface ContainerProviderRegistry {
ContainerProviderRegistry INSTANCE = ContainerProviderImpl.INSTANCE;
ContainerProviderRegistry INSTANCE = new ContainerProviderImpl();
/**
* Register a "packet buffer -&gt; container" factory. This is used both on the client and server side.

View file

@ -31,14 +31,10 @@ import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.client.screen.ContainerScreenFactory;
import net.fabricmc.fabric.api.client.screen.ScreenProviderRegistry;
import net.fabricmc.fabric.api.container.ContainerFactory;
import net.fabricmc.fabric.api.container.ContainerProviderRegistry;
import net.fabricmc.fabric.impl.container.ContainerProviderImpl;
public class ScreenProviderRegistryImpl implements ScreenProviderRegistry {
/**
* Use the instance provided by ScreenProviderRegistry.
*/
public static final ScreenProviderRegistry INSTANCE = new ScreenProviderRegistryImpl();
private static final Logger LOGGER = LogManager.getLogger();
private static final Map<Identifier, ContainerFactory<HandledScreen>> FACTORIES = new HashMap<>();
@ -55,7 +51,7 @@ public class ScreenProviderRegistryImpl implements ScreenProviderRegistry {
@Override
public <C extends ScreenHandler> void registerFactory(Identifier identifier, ContainerScreenFactory<C> containerScreenFactory) {
registerFactory(identifier, (syncId, identifier1, player, buf) -> {
C container = ContainerProviderImpl.INSTANCE.createContainer(syncId, identifier1, player, buf);
C container = ((ContainerProviderImpl) ContainerProviderRegistry.INSTANCE).createContainer(syncId, identifier1, player, buf);
if (container == null) {
LOGGER.error("Could not open container for {} - a null object was created!", identifier1.toString());

View file

@ -37,10 +37,6 @@ import net.fabricmc.fabric.mixin.container.ServerPlayerEntityAccessor;
public class ContainerProviderImpl implements ContainerProviderRegistry {
public static final Identifier OPEN_CONTAINER = new Identifier("fabric", "container/open");
/**
* Use the instance provided by ContainerProviderRegistry.
*/
public static final ContainerProviderImpl INSTANCE = new ContainerProviderImpl();
private static final Logger LOGGER = LogManager.getLogger();

View file

@ -23,5 +23,5 @@ import net.fabricmc.fabric.impl.content.registry.FuelRegistryImpl;
* Registry of items to 0-32767 fuel burn time values, in in-game ticks.
*/
public interface FuelRegistry extends Item2ObjectMap<Integer> {
FuelRegistry INSTANCE = FuelRegistryImpl.INSTANCE;
FuelRegistry INSTANCE = new FuelRegistryImpl();
}

View file

@ -26,7 +26,7 @@ import net.fabricmc.fabric.impl.content.registry.LootEntryTypeRegistryImpl;
@Deprecated
public interface LootEntryTypeRegistry {
@Deprecated
LootEntryTypeRegistry INSTANCE = LootEntryTypeRegistryImpl.INSTANCE;
LootEntryTypeRegistry INSTANCE = new LootEntryTypeRegistryImpl();
@Deprecated
void register(LootPoolEntry.Serializer<?> serializer);

View file

@ -34,7 +34,6 @@ import net.fabricmc.fabric.api.registry.FuelRegistry;
// TODO: Clamp values to 32767 (+ add hook for mods which extend the limit to disable the check?)
public final class FuelRegistryImpl implements FuelRegistry {
public static final FuelRegistryImpl INSTANCE = new FuelRegistryImpl();
private static final Logger LOGGER = LogManager.getLogger();
private final Object2IntMap<ItemConvertible> itemCookTimes = new Object2IntLinkedOpenHashMap<>();
private final Object2IntMap<Tag<Item>> tagCookTimes = new Object2IntLinkedOpenHashMap<>();

View file

@ -25,7 +25,6 @@ import net.fabricmc.fabric.api.registry.LootEntryTypeRegistry;
@Deprecated
public final class LootEntryTypeRegistryImpl implements LootEntryTypeRegistry {
public static final LootEntryTypeRegistryImpl INSTANCE = new LootEntryTypeRegistryImpl();
private static final Method REGISTER_METHOD;
static {
@ -49,7 +48,7 @@ public final class LootEntryTypeRegistryImpl implements LootEntryTypeRegistry {
}
}
private LootEntryTypeRegistryImpl() { }
public LootEntryTypeRegistryImpl() { }
@Override
public void register(LootPoolEntry.Serializer<?> serializer) {

View file

@ -27,22 +27,23 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import net.minecraft.block.entity.AbstractFurnaceBlockEntity;
import net.minecraft.item.Item;
import net.fabricmc.fabric.api.registry.FuelRegistry;
import net.fabricmc.fabric.impl.content.registry.FuelRegistryImpl;
@Mixin(AbstractFurnaceBlockEntity.class)
public class MixinAbstractFurnaceBlockEntity {
@Inject(at = @At("RETURN"), method = "createFuelTimeMap")
private static void fuelTimeMapHook(CallbackInfoReturnable<Map<Item, Integer>> info) {
FuelRegistryImpl.INSTANCE.apply(info.getReturnValue());
((FuelRegistryImpl) FuelRegistry.INSTANCE).apply(info.getReturnValue());
}
@Redirect(method = "canUseAsFuel", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/entity/AbstractFurnaceBlockEntity;createFuelTimeMap()Ljava/util/Map;"))
private static Map<Item, Integer> canUseAsFuelRedirect() {
return FuelRegistryImpl.INSTANCE.getFuelTimes();
return ((FuelRegistryImpl) FuelRegistry.INSTANCE).getFuelTimes();
}
@Redirect(method = "getFuelTime", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/entity/AbstractFurnaceBlockEntity;createFuelTimeMap()Ljava/util/Map;"))
private Map<Item, Integer> getFuelTimeRedirect() {
return FuelRegistryImpl.INSTANCE.getFuelTimes();
return ((FuelRegistryImpl) FuelRegistry.INSTANCE).getFuelTimes();
}
}

View file

@ -24,12 +24,13 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.network.packet.s2c.play.SynchronizeTagsS2CPacket;
import net.fabricmc.fabric.api.registry.FuelRegistry;
import net.fabricmc.fabric.impl.content.registry.FuelRegistryImpl;
@Mixin(ClientPlayNetworkHandler.class)
public abstract class MixinClientPlayNetworkHandler {
@Inject(at = @At("TAIL"), method = "onSynchronizeTags")
private void onSynchronizeTagsHook(SynchronizeTagsS2CPacket packet, CallbackInfo info) {
FuelRegistryImpl.INSTANCE.resetCache();
((FuelRegistryImpl) FuelRegistry.INSTANCE).resetCache();
}
}

View file

@ -29,7 +29,7 @@ import net.fabricmc.fabric.impl.loot.table.LootEntryTypeRegistryImpl;
* @see #register
*/
public interface LootEntryTypeRegistry {
LootEntryTypeRegistry INSTANCE = LootEntryTypeRegistryImpl.INSTANCE;
LootEntryTypeRegistry INSTANCE = new LootEntryTypeRegistryImpl();
/**
* Registers a loot entry type serializer by its ID.

View file

@ -23,9 +23,7 @@ import net.minecraft.util.JsonSerializer;
import net.fabricmc.fabric.mixin.loot.table.LootPoolEntryTypesAccessor;
public final class LootEntryTypeRegistryImpl implements net.fabricmc.fabric.api.loot.v1.LootEntryTypeRegistry {
public static final LootEntryTypeRegistryImpl INSTANCE = new LootEntryTypeRegistryImpl();
private LootEntryTypeRegistryImpl() { }
public LootEntryTypeRegistryImpl() { }
@Override
public void register(Identifier id, JsonSerializer<? extends LootPoolEntry> serializer) {

View file

@ -24,7 +24,7 @@ import net.minecraft.util.Identifier;
import net.fabricmc.fabric.impl.client.model.ModelLoadingRegistryImpl;
public interface ModelLoadingRegistry {
ModelLoadingRegistry INSTANCE = ModelLoadingRegistryImpl.INSTANCE;
ModelLoadingRegistry INSTANCE = new ModelLoadingRegistryImpl();
/**
* Register a model provider, which can request loading additional models.

View file

@ -178,7 +178,6 @@ public class ModelLoadingRegistryImpl implements ModelLoadingRegistry {
}
private static final Logger LOGGER = LogManager.getLogger();
public static final ModelLoadingRegistryImpl INSTANCE = new ModelLoadingRegistryImpl();
private final List<Function<ResourceManager, ModelVariantProvider>> variantProviderSuppliers = new ArrayList<>();
private final List<Function<ResourceManager, ModelResourceProvider>> resourceProviderSuppliers = new ArrayList<>();
@ -205,6 +204,6 @@ public class ModelLoadingRegistryImpl implements ModelLoadingRegistry {
}
public static LoaderInstance begin(ModelLoader loader, ResourceManager manager) {
return new LoaderInstance(INSTANCE, loader, manager);
return new LoaderInstance((ModelLoadingRegistryImpl) INSTANCE, loader, manager);
}
}

View file

@ -82,7 +82,7 @@ public interface FluidRenderHandler {
* @return Whether anything is tessellated.
*/
default boolean renderFluid(BlockPos pos, BlockRenderView world, VertexConsumer vertexConsumer, FluidState state) {
return FluidRenderHandlerRegistryImpl.INSTANCE.renderFluid(pos, world, vertexConsumer, state);
return ((FluidRenderHandlerRegistryImpl) FluidRenderHandlerRegistry.INSTANCE).renderFluid(pos, world, vertexConsumer, state);
}
/**

View file

@ -30,7 +30,7 @@ import net.fabricmc.fabric.impl.client.rendering.fluid.FluidRenderHandlerRegistr
* rendering.
*/
public interface FluidRenderHandlerRegistry {
FluidRenderHandlerRegistry INSTANCE = FluidRenderHandlerRegistryImpl.INSTANCE;
FluidRenderHandlerRegistry INSTANCE = new FluidRenderHandlerRegistryImpl();
/**
* Get a {@link FluidRenderHandler} for a given Fluid. Supports vanilla and

View file

@ -41,7 +41,6 @@ import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandler;
import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandlerRegistry;
public class FluidRenderHandlerRegistryImpl implements FluidRenderHandlerRegistry {
public static final FluidRenderHandlerRegistryImpl INSTANCE = new FluidRenderHandlerRegistryImpl();
private static final int DEFAULT_WATER_COLOR = BuiltinRegistries.BIOME.get(BiomeKeys.OCEAN).getWaterColor();
private final Map<Fluid, FluidRenderHandler> handlers = new IdentityHashMap<>();
private final Map<Fluid, FluidRenderHandler> modHandlers = new IdentityHashMap<>();
@ -49,7 +48,7 @@ public class FluidRenderHandlerRegistryImpl implements FluidRenderHandlerRegistr
private FluidRenderer fluidRenderer;
private FluidRenderHandlerRegistryImpl() {
public FluidRenderHandlerRegistryImpl() {
}
@Override

View file

@ -37,6 +37,7 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.BlockRenderView;
import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandler;
import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandlerRegistry;
import net.fabricmc.fabric.impl.client.rendering.fluid.FluidRenderHandlerRegistryImpl;
import net.fabricmc.fabric.impl.client.rendering.fluid.FluidRendererHookContainer;
@ -56,7 +57,7 @@ public class MixinFluidRenderer {
@Inject(at = @At("RETURN"), method = "onResourceReload")
public void onResourceReloadReturn(CallbackInfo info) {
FluidRenderer self = (FluidRenderer) (Object) this;
FluidRenderHandlerRegistryImpl.INSTANCE.onFluidRendererReload(self, waterSprites, lavaSprites, waterOverlaySprite);
((FluidRenderHandlerRegistryImpl) FluidRenderHandlerRegistry.INSTANCE).onFluidRendererReload(self, waterSprites, lavaSprites, waterOverlaySprite);
}
@Inject(at = @At("HEAD"), method = "render", cancellable = true)
@ -82,7 +83,7 @@ public class MixinFluidRenderer {
@Unique
private void tessellateViaHandler(BlockRenderView view, BlockPos pos, VertexConsumer vertexConsumer, FluidState state, CallbackInfoReturnable<Boolean> info) {
FluidRendererHookContainer ctr = fabric_renderHandler.get();
FluidRenderHandler handler = FluidRenderHandlerRegistryImpl.INSTANCE.getOverride(state.getFluid());
FluidRenderHandler handler = ((FluidRenderHandlerRegistryImpl) FluidRenderHandlerRegistry.INSTANCE).getOverride(state.getFluid());
ctr.view = view;
ctr.pos = pos;
@ -146,7 +147,7 @@ public class MixinFluidRenderer {
public Sprite modSideSpriteForOverlay(Sprite chk) {
Block block = fabric_neighborBlock.get();
if (FluidRenderHandlerRegistryImpl.INSTANCE.isBlockTransparent(block)) {
if (FluidRenderHandlerRegistry.INSTANCE.isBlockTransparent(block)) {
FluidRendererHookContainer ctr = fabric_renderHandler.get();
return ctr.handler != null && ctr.hasOverlay ? ctr.overlay : waterOverlaySprite;
}

View file

@ -38,7 +38,7 @@ public interface BuiltinItemRendererRegistry {
* The singleton instance of the renderer registry.
* Use this instance to call the methods in this interface.
*/
BuiltinItemRendererRegistry INSTANCE = BuiltinItemRendererRegistryImpl.INSTANCE;
BuiltinItemRendererRegistry INSTANCE = new BuiltinItemRendererRegistryImpl();
/**
* Registers the renderer for the item.

View file

@ -33,11 +33,9 @@ import net.fabricmc.fabric.api.client.rendering.v1.BuiltinItemRendererRegistry;
@Environment(EnvType.CLIENT)
public final class BuiltinItemRendererRegistryImpl implements BuiltinItemRendererRegistry {
public static final BuiltinItemRendererRegistryImpl INSTANCE = new BuiltinItemRendererRegistryImpl();
private static final Map<Item, DynamicItemRenderer> RENDERERS = new HashMap<>();
private BuiltinItemRendererRegistryImpl() {
public BuiltinItemRendererRegistryImpl() {
}
@Override