From c545b8ecd4e96107ccf134c8fd89906357d586ad Mon Sep 17 00:00:00 2001 From: James Mitchell Date: Wed, 11 Jan 2017 15:17:56 -0800 Subject: [PATCH] Clean up null issues, add more annotations (#3590) --- .../minecraft/block/BlockFlowerPot.java.patch | 2 +- .../state/BlockStateContainer.java.patch | 2 +- .../monster/EntityZombieVillager.java.patch | 4 +- .../TileEntityBrewingStand.java.patch | 2 +- .../tileentity/TileEntityChest.java.patch | 2 +- .../tileentity/TileEntityFurnace.java.patch | 2 +- ...egistryNamespacedDefaultedByKey.java.patch | 8 +- .../world/chunk/storage/RegionFile.java.patch | 10 +-- .../classloading/FMLForgePlugin.java | 3 + .../client/ClientCommandHandler.java | 2 +- .../client/EnumHelperClient.java | 7 ++ .../client/event/RenderPlayerEvent.java | 6 +- .../client/event/RenderSpecificHandEvent.java | 2 +- .../client/event/RenderTooltipEvent.java | 12 +-- .../client/model/ForgeBlockStateV1.java | 3 +- .../client/model/ItemLayerModel.java | 3 +- .../client/model/ModelDynBucket.java | 7 +- .../client/model/ModelLoader.java | 4 +- .../client/model/MultiLayerModel.java | 2 + .../animation/AnimationItemOverrideList.java | 4 +- .../model/animation/AnimationModelBase.java | 7 +- .../client/model/animation/AnimationTESR.java | 23 +++-- .../client/model/animation/FastTESR.java | 6 +- .../model/animation/ModelBlockAnimation.java | 2 + .../client/model/b3d/B3DLoader.java | 8 +- .../client/model/obj/OBJModel.java | 4 +- .../client/settings/KeyBindingMap.java | 3 + .../common/AchievementPage.java | 3 + .../minecraftforge/common/BiomeManager.java | 3 + .../common/DimensionManager.java | 7 +- .../common/ForgeChunkManager.java | 6 +- .../net/minecraftforge/common/ForgeHooks.java | 14 ++- .../common/ForgeModContainer.java | 3 + .../minecraftforge/common/ForgeVersion.java | 9 +- .../common/animation/TimeValues.java | 5 +- .../common/brewing/AbstractBrewingRecipe.java | 5 +- .../common/brewing/IBrewingRecipe.java | 9 +- .../common/brewing/VanillaBrewingRecipe.java | 1 + .../common/capabilities/Capability.java | 5 ++ .../capabilities/CapabilityDispatcher.java | 2 +- .../capabilities/CapabilityManager.java | 8 +- .../common/model/TRSRTransformation.java | 5 +- .../animation/AnimationStateMachine.java | 3 + .../common/model/animation/Clips.java | 5 +- .../common/property/ExtendedBlockState.java | 11 ++- .../common/util/BlockSnapshot.java | 8 +- .../common/util/EnumHelper.java | 33 +++++-- .../event/ForgeEventFactory.java | 16 +++- .../event/brewing/PotionBrewEvent.java | 2 +- .../enchanting/EnchantmentLevelSetEvent.java | 6 +- .../living/LivingEquipmentChangeEvent.java | 6 +- .../event/entity/player/AnvilRepairEvent.java | 9 +- .../event/entity/player/FillBucketEvent.java | 5 +- .../entity/player/PlayerInteractEvent.java | 3 +- .../event/world/BlockEvent.java | 21 +++-- .../fluids/BlockFluidClassic.java | 2 + .../minecraftforge/fluids/FluidRegistry.java | 7 +- .../net/minecraftforge/fluids/FluidStack.java | 18 ++-- .../net/minecraftforge/fluids/FluidTank.java | 6 +- .../minecraftforge/fluids/IFluidBlock.java | 2 + .../fluids/UniversalBucket.java | 4 +- .../wrappers/FluidBucketWrapper.java | 2 +- .../fml/client/FMLClientHandler.java | 5 +- .../minecraftforge/fml/client/GuiModList.java | 5 +- .../fml/client/IModGuiFactory.java | 3 + .../fml/client/SplashProgress.java | 13 +-- .../fml/client/config/DummyConfigElement.java | 7 +- .../fml/client/config/GuiConfig.java | 8 +- .../fml/client/config/GuiMessageDialog.java | 5 +- .../fml/client/config/GuiSlider.java | 5 +- .../fml/client/config/GuiUtils.java | 12 +-- .../fml/client/event/ConfigChangedEvent.java | 10 ++- .../fml/common/CertificateHelper.java | 4 +- .../fml/common/DummyModContainer.java | 3 + .../fml/common/FMLCommonHandler.java | 3 + .../fml/common/FMLContainer.java | 3 + .../fml/common/FMLModContainer.java | 4 + .../fml/common/InjectedModContainer.java | 4 + .../fml/common/LoadController.java | 8 +- .../net/minecraftforge/fml/common/Loader.java | 5 +- .../fml/common/MetadataCollection.java | 4 +- .../fml/common/MinecraftDummyContainer.java | 5 +- .../fml/common/ModContainer.java | 3 + .../fml/common/ModContainerFactory.java | 4 + .../fml/common/StartupQuery.java | 6 +- .../fml/common/asm/ASMTransformerWrapper.java | 4 + .../deobf/FMLDeobfuscatingRemapper.java | 13 ++- .../fml/common/discovery/ASMDataTable.java | 7 +- .../common/discovery/DirectoryDiscoverer.java | 4 +- .../fml/common/event/FMLInterModComms.java | 9 +- .../event/FMLPostInitializationEvent.java | 4 +- .../event/FMLPreInitializationEvent.java | 3 + .../fml/common/eventhandler/Event.java | 2 +- .../fml/common/eventhandler/EventBus.java | 2 +- .../fml/common/eventhandler/ListenerList.java | 5 +- .../fml/common/network/ByteBufUtils.java | 3 + .../common/network/FMLEmbeddedChannel.java | 3 + .../fml/common/network/FMLEventChannel.java | 5 ++ .../common/network/FMLOutboundHandler.java | 4 + .../fml/common/network/NetworkRegistry.java | 6 +- .../network/handshake/IHandshakeState.java | 4 +- .../network/internal/FMLNetworkHandler.java | 6 ++ .../network/internal/FMLProxyPacket.java | 3 + .../network/internal/NetworkModHolder.java | 4 +- .../fml/common/registry/EntityRegistry.java | 5 ++ .../FMLControlledNamespacedRegistry.java | 85 +++++++++---------- .../fml/common/registry/FinalFieldHelper.java | 3 +- .../fml/common/registry/IForgeRegistry.java | 13 +-- .../common/registry/IForgeRegistryEntry.java | 4 + .../fml/common/registry/ObjectHolderRef.java | 3 + .../common/registry/ObjectHolderRegistry.java | 4 +- .../registry/PersistentRegistryManager.java | 40 ++++----- .../fml/common/registry/RegistryBuilder.java | 9 ++ .../fml/common/registry/VillagerRegistry.java | 7 +- .../fml/common/versioning/Restriction.java | 8 +- .../fml/common/versioning/VersionRange.java | 4 +- .../fml/relauncher/FileListHelper.java | 3 +- .../fml/relauncher/IFMLLoadingPlugin.java | 2 + .../fml/relauncher/ModListHelper.java | 4 +- .../fml/relauncher/ReflectionHelper.java | 5 +- .../items/VanillaDoubleChestItemHandler.java | 6 +- .../items/VanillaInventoryCodeHooks.java | 1 + .../minecraftforge/oredict/OreDictionary.java | 5 +- .../minecraftforge/oredict/RecipeSorter.java | 6 +- .../oredict/ShapedOreRecipe.java | 5 +- .../oredict/ShapelessOreRecipe.java | 6 +- .../console/TerminalConsoleAppender.java | 3 + .../minecraftforge/debug/DynBucketTest.java | 33 ++++--- .../debug/FluidPlacementTest.java | 5 +- .../minecraftforge/debug/ModelFluidDebug.java | 8 +- 130 files changed, 629 insertions(+), 262 deletions(-) diff --git a/patches/minecraft/net/minecraft/block/BlockFlowerPot.java.patch b/patches/minecraft/net/minecraft/block/BlockFlowerPot.java.patch index c85bf0c1b7..0cdce5feb5 100644 --- a/patches/minecraft/net/minecraft/block/BlockFlowerPot.java.patch +++ b/patches/minecraft/net/minecraft/block/BlockFlowerPot.java.patch @@ -36,7 +36,7 @@ + return super.removedByPlayer(state, world, pos, player, willHarvest); + } + @Override -+ public void func_180657_a(World world, EntityPlayer player, BlockPos pos, IBlockState state, TileEntity te, ItemStack tool) ++ public void func_180657_a(World world, EntityPlayer player, BlockPos pos, IBlockState state, @Nullable TileEntity te, ItemStack tool) + { + super.func_180657_a(world, player, pos, state, te, tool); + world.func_175698_g(pos); diff --git a/patches/minecraft/net/minecraft/block/state/BlockStateContainer.java.patch b/patches/minecraft/net/minecraft/block/state/BlockStateContainer.java.patch index 205f945bf6..1edf31b3e1 100644 --- a/patches/minecraft/net/minecraft/block/state/BlockStateContainer.java.patch +++ b/patches/minecraft/net/minecraft/block/state/BlockStateContainer.java.patch @@ -8,7 +8,7 @@ + this(p_i45663_1_, p_i45663_2_, null); + } + -+ protected StateImplementation createState(Block block, ImmutableMap, Comparable> properties, ImmutableMap, com.google.common.base.Optional> unlistedProperties) ++ protected StateImplementation createState(Block block, ImmutableMap, Comparable> properties, @Nullable ImmutableMap, com.google.common.base.Optional> unlistedProperties) + { + return new StateImplementation(block, properties); + } diff --git a/patches/minecraft/net/minecraft/entity/monster/EntityZombieVillager.java.patch b/patches/minecraft/net/minecraft/entity/monster/EntityZombieVillager.java.patch index c7a607982e..7aba28025d 100644 --- a/patches/minecraft/net/minecraft/entity/monster/EntityZombieVillager.java.patch +++ b/patches/minecraft/net/minecraft/entity/monster/EntityZombieVillager.java.patch @@ -8,10 +8,11 @@ } public int func_190736_dl() -@@ -85,6 +86,19 @@ +@@ -85,6 +86,21 @@ return super.func_180482_a(p_180482_1_, p_180482_2_); } ++ @Nullable + private net.minecraftforge.fml.common.registry.VillagerRegistry.VillagerProfession prof; + public void setForgeProfession(net.minecraftforge.fml.common.registry.VillagerRegistry.VillagerProfession prof) + { @@ -19,6 +20,7 @@ + this.func_190733_a(net.minecraftforge.fml.common.registry.VillagerRegistry.getId(prof)); + } + ++ @Nullable + public net.minecraftforge.fml.common.registry.VillagerRegistry.VillagerProfession getForgeProfession() + { + return this.prof; diff --git a/patches/minecraft/net/minecraft/tileentity/TileEntityBrewingStand.java.patch b/patches/minecraft/net/minecraft/tileentity/TileEntityBrewingStand.java.patch index 4548157028..764ea7392f 100644 --- a/patches/minecraft/net/minecraft/tileentity/TileEntityBrewingStand.java.patch +++ b/patches/minecraft/net/minecraft/tileentity/TileEntityBrewingStand.java.patch @@ -65,7 +65,7 @@ + + @SuppressWarnings("unchecked") + @Override -+ public T getCapability(net.minecraftforge.common.capabilities.Capability capability, net.minecraft.util.EnumFacing facing) ++ public T getCapability(net.minecraftforge.common.capabilities.Capability capability, @javax.annotation.Nullable net.minecraft.util.EnumFacing facing) + { + if (facing != null && capability == net.minecraftforge.items.CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + { diff --git a/patches/minecraft/net/minecraft/tileentity/TileEntityChest.java.patch b/patches/minecraft/net/minecraft/tileentity/TileEntityChest.java.patch index 897aada37f..f0be15649f 100644 --- a/patches/minecraft/net/minecraft/tileentity/TileEntityChest.java.patch +++ b/patches/minecraft/net/minecraft/tileentity/TileEntityChest.java.patch @@ -16,7 +16,7 @@ + + @SuppressWarnings("unchecked") + @Override -+ public T getCapability(net.minecraftforge.common.capabilities.Capability capability, net.minecraft.util.EnumFacing facing) ++ public T getCapability(net.minecraftforge.common.capabilities.Capability capability, @Nullable net.minecraft.util.EnumFacing facing) + { + if (capability == net.minecraftforge.items.CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + { diff --git a/patches/minecraft/net/minecraft/tileentity/TileEntityFurnace.java.patch b/patches/minecraft/net/minecraft/tileentity/TileEntityFurnace.java.patch index ea91da7292..821be35f34 100644 --- a/patches/minecraft/net/minecraft/tileentity/TileEntityFurnace.java.patch +++ b/patches/minecraft/net/minecraft/tileentity/TileEntityFurnace.java.patch @@ -107,7 +107,7 @@ + + @SuppressWarnings("unchecked") + @Override -+ public T getCapability(net.minecraftforge.common.capabilities.Capability capability, net.minecraft.util.EnumFacing facing) ++ public T getCapability(net.minecraftforge.common.capabilities.Capability capability, @javax.annotation.Nullable net.minecraft.util.EnumFacing facing) + { + if (facing != null && capability == net.minecraftforge.items.CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + if (facing == EnumFacing.DOWN) diff --git a/patches/minecraft/net/minecraft/util/registry/RegistryNamespacedDefaultedByKey.java.patch b/patches/minecraft/net/minecraft/util/registry/RegistryNamespacedDefaultedByKey.java.patch index 2d0e3585fb..ffdc4e7ef1 100644 --- a/patches/minecraft/net/minecraft/util/registry/RegistryNamespacedDefaultedByKey.java.patch +++ b/patches/minecraft/net/minecraft/util/registry/RegistryNamespacedDefaultedByKey.java.patch @@ -7,8 +7,8 @@ + + //Bypass functions to allow querying this registry WITHOUT getting the defaulted value. + // MODDERS DO NOT USE THIS IS FOR FORGE INTERNAL CHECKS -+ public int getIDForObjectBypass(V bypass) { return super.func_148757_b(bypass); } -+ public K getNameForObjectBypass(V value) { return super.func_177774_c(value); } -+ public V getObjectBypass(K name) { return super.func_82594_a(name); } -+ public V getObjectByIdBypass(int id){ return super.func_148754_a(id); } ++ public int getIDForObjectBypass(@Nullable V bypass) { return super.func_148757_b(bypass); } ++ @Nullable public K getNameForObjectBypass(V value) { return super.func_177774_c(value); } ++ @Nullable public V getObjectBypass(K name) { return super.func_82594_a(name); } ++ @Nullable public V getObjectByIdBypass(int id){ return super.func_148754_a(id); } } diff --git a/patches/minecraft/net/minecraft/world/chunk/storage/RegionFile.java.patch b/patches/minecraft/net/minecraft/world/chunk/storage/RegionFile.java.patch index 0113ec45fa..2e1978b829 100644 --- a/patches/minecraft/net/minecraft/world/chunk/storage/RegionFile.java.patch +++ b/patches/minecraft/net/minecraft/world/chunk/storage/RegionFile.java.patch @@ -1,8 +1,8 @@ --- ../src-base/minecraft/net/minecraft/world/chunk/storage/RegionFile.java +++ ../src-work/minecraft/net/minecraft/world/chunk/storage/RegionFile.java -@@ -97,6 +97,39 @@ - - @Nullable +@@ -95,6 +95,39 @@ + } + } + // This is a copy (sort of) of the method below it, make sure they stay in sync + public synchronized boolean chunkExists(int x, int z) @@ -37,6 +37,6 @@ + return false; + } + + @Nullable + public synchronized DataInputStream func_76704_a(int p_76704_1_, int p_76704_2_) - { - if (this.func_76705_d(p_76704_1_, p_76704_2_)) diff --git a/src/main/java/net/minecraftforge/classloading/FMLForgePlugin.java b/src/main/java/net/minecraftforge/classloading/FMLForgePlugin.java index fd92fa678d..840d9a92be 100644 --- a/src/main/java/net/minecraftforge/classloading/FMLForgePlugin.java +++ b/src/main/java/net/minecraftforge/classloading/FMLForgePlugin.java @@ -24,6 +24,8 @@ import java.util.Map; import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin; +import javax.annotation.Nullable; + public class FMLForgePlugin implements IFMLLoadingPlugin { public static boolean RUNTIME_DEOBF = false; @@ -42,6 +44,7 @@ public class FMLForgePlugin implements IFMLLoadingPlugin } @Override + @Nullable public String getSetupClass() { return null; diff --git a/src/main/java/net/minecraftforge/client/ClientCommandHandler.java b/src/main/java/net/minecraftforge/client/ClientCommandHandler.java index f8ec83d240..61773db8b0 100644 --- a/src/main/java/net/minecraftforge/client/ClientCommandHandler.java +++ b/src/main/java/net/minecraftforge/client/ClientCommandHandler.java @@ -134,7 +134,7 @@ public class ClientCommandHandler extends CommandHandler if (mc.currentScreen instanceof GuiChat) { List commands = getTabCompletions(mc.player, leftOfCursor, mc.player.getPosition()); - if (commands != null && !commands.isEmpty()) + if (!commands.isEmpty()) { if (leftOfCursor.indexOf(' ') == -1) { diff --git a/src/main/java/net/minecraftforge/client/EnumHelperClient.java b/src/main/java/net/minecraftforge/client/EnumHelperClient.java index e12349cc7e..6eddcbdbb2 100644 --- a/src/main/java/net/minecraftforge/client/EnumHelperClient.java +++ b/src/main/java/net/minecraftforge/client/EnumHelperClient.java @@ -24,6 +24,8 @@ import net.minecraft.world.GameType; import net.minecraft.client.settings.GameSettings.Options; import net.minecraftforge.common.util.EnumHelper; +import javax.annotation.Nullable; + public class EnumHelperClient extends EnumHelper { private static Class[][] clientTypes = @@ -33,16 +35,19 @@ public class EnumHelperClient extends EnumHelper {EnumOS.class} }; + @Nullable public static GameType addGameType(String name, int id, String displayName, String shortName) { return addEnum(GameType.class, name, id, displayName, shortName); } + @Nullable public static Options addOptions(String name, String langName, boolean isSlider, boolean isToggle) { return addEnum(Options.class, name, langName, isSlider, isToggle); } + @Nullable public static Options addOptions(String name, String langName, boolean isSlider, boolean isToggle, float valMin, float valMax, float valStep) { return addEnum(Options.class, name, @@ -50,11 +55,13 @@ public class EnumHelperClient extends EnumHelper langName, isSlider, isToggle, valMin, valMax, valStep); } + @Nullable public static EnumOS addOS2(String name) { return addEnum(EnumOS.class, name); } + @Nullable private static > T addEnum(Class enumType, String enumName, Object... paramValues) { return addEnum(clientTypes, enumType, enumName, paramValues); diff --git a/src/main/java/net/minecraftforge/client/event/RenderPlayerEvent.java b/src/main/java/net/minecraftforge/client/event/RenderPlayerEvent.java index e71b997f4f..268e0bba27 100644 --- a/src/main/java/net/minecraftforge/client/event/RenderPlayerEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RenderPlayerEvent.java @@ -25,6 +25,8 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraftforge.event.entity.player.PlayerEvent; +import javax.annotation.Nonnull; + public abstract class RenderPlayerEvent extends PlayerEvent { private final RenderPlayer renderer; @@ -99,8 +101,9 @@ public abstract class RenderPlayerEvent extends PlayerEvent { private int result = -1; private final int slot; + @Nonnull private final ItemStack stack; - public SetArmorModel(EntityPlayer player, RenderPlayer renderer, int slot, float partialTick, ItemStack stack) + public SetArmorModel(EntityPlayer player, RenderPlayer renderer, int slot, float partialTick, @Nonnull ItemStack stack) { super(player, renderer, partialTick, 0D, 0D, 0D); this.slot = slot; @@ -126,6 +129,7 @@ public abstract class RenderPlayerEvent extends PlayerEvent return slot; } + @Nonnull public ItemStack getStack() { return stack; diff --git a/src/main/java/net/minecraftforge/client/event/RenderSpecificHandEvent.java b/src/main/java/net/minecraftforge/client/event/RenderSpecificHandEvent.java index 072dad814f..4bc08cb07d 100644 --- a/src/main/java/net/minecraftforge/client/event/RenderSpecificHandEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RenderSpecificHandEvent.java @@ -6,7 +6,6 @@ import net.minecraftforge.fml.common.eventhandler.Cancelable; import net.minecraftforge.fml.common.eventhandler.Event; import javax.annotation.Nonnull; -import javax.annotation.Nullable; /** * This event is fired on the {@link net.minecraftforge.common.MinecraftForge#EVENT_BUS} @@ -22,6 +21,7 @@ public class RenderSpecificHandEvent extends Event private final float interpolatedPitch; private final float swingProgress; private final float equipProgress; + @Nonnull private final ItemStack stack; public RenderSpecificHandEvent(EnumHand hand, float partialTicks, float interpolatedPitch, float swingProgress, float equipProgress, @Nonnull ItemStack stack) diff --git a/src/main/java/net/minecraftforge/client/event/RenderTooltipEvent.java b/src/main/java/net/minecraftforge/client/event/RenderTooltipEvent.java index 34eef91831..10fe2c6439 100644 --- a/src/main/java/net/minecraftforge/client/event/RenderTooltipEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RenderTooltipEvent.java @@ -4,7 +4,6 @@ import java.util.Collections; import java.util.List; import javax.annotation.Nonnull; -import javax.annotation.Nullable; import net.minecraft.client.gui.FontRenderer; import net.minecraft.item.ItemStack; @@ -26,6 +25,7 @@ import net.minecraftforge.fml.common.eventhandler.Event; */ public abstract class RenderTooltipEvent extends Event { + @Nonnull protected final ItemStack stack; protected final List lines; protected int x; @@ -42,7 +42,7 @@ public abstract class RenderTooltipEvent extends Event } /** - * @return The stack which the tooltip is being rendered for. As tooltips can be drawn without itemstacks, this return is {@link Nullable}. + * @return The stack which the tooltip is being rendered for. As tooltips can be drawn without itemstacks, this stack may be empty. */ @Nonnull public ItemStack getStack() @@ -98,7 +98,7 @@ public abstract class RenderTooltipEvent extends Event private int screenHeight; private int maxWidth; - public Pre(@Nullable ItemStack stack, @Nonnull List lines, int x, int y, int screenWidth, int screenHeight, int maxWidth, @Nonnull FontRenderer fr) + public Pre(@Nonnull ItemStack stack, @Nonnull List lines, int x, int y, int screenWidth, int screenHeight, int maxWidth, @Nonnull FontRenderer fr) { super(stack, lines, x, y, fr); this.screenWidth = screenWidth; @@ -181,7 +181,7 @@ public abstract class RenderTooltipEvent extends Event private final int width; private final int height; - public Post(@Nullable ItemStack stack, @Nonnull List textLines, int x, int y, @Nonnull FontRenderer fr, int width, int height) + public Post(@Nonnull ItemStack stack, @Nonnull List textLines, int x, int y, @Nonnull FontRenderer fr, int width, int height) { super(stack, textLines, x, y, fr); this.width = width; @@ -210,7 +210,7 @@ public abstract class RenderTooltipEvent extends Event */ public static class PostBackground extends Post { - public PostBackground(@Nullable ItemStack stack, @Nonnull List textLines, int x, int y, @Nonnull FontRenderer fr, int width, int height) + public PostBackground(@Nonnull ItemStack stack, @Nonnull List textLines, int x, int y, @Nonnull FontRenderer fr, int width, int height) { super(stack, textLines, x, y, fr, width, height); } } @@ -219,7 +219,7 @@ public abstract class RenderTooltipEvent extends Event */ public static class PostText extends Post { - public PostText(@Nullable ItemStack stack, @Nonnull List textLines, int x, int y, @Nonnull FontRenderer fr, int width, int height) + public PostText(@Nonnull ItemStack stack, @Nonnull List textLines, int x, int y, @Nonnull FontRenderer fr, int width, int height) { super(stack, textLines, x, y, fr, width, height); } } } diff --git a/src/main/java/net/minecraftforge/client/model/ForgeBlockStateV1.java b/src/main/java/net/minecraftforge/client/model/ForgeBlockStateV1.java index 0f1acd4d29..63fcea7d11 100644 --- a/src/main/java/net/minecraftforge/client/model/ForgeBlockStateV1.java +++ b/src/main/java/net/minecraftforge/client/model/ForgeBlockStateV1.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import javax.annotation.Nullable; import javax.vecmath.AxisAngle4d; import javax.vecmath.Matrix4f; import javax.vecmath.Quat4f; @@ -218,7 +219,7 @@ public class ForgeBlockStateV1 extends Marker return ret; } - private Multimap getPermutations(List sorted, Map> base, int depth, String prefix, Multimap ret, ForgeBlockStateV1.Variant parent) + private Multimap getPermutations(List sorted, Map> base, int depth, String prefix, Multimap ret, @Nullable ForgeBlockStateV1.Variant parent) { if (depth == sorted.size()) { diff --git a/src/main/java/net/minecraftforge/client/model/ItemLayerModel.java b/src/main/java/net/minecraftforge/client/model/ItemLayerModel.java index 69882ec20a..698f454091 100644 --- a/src/main/java/net/minecraftforge/client/model/ItemLayerModel.java +++ b/src/main/java/net/minecraftforge/client/model/ItemLayerModel.java @@ -24,6 +24,7 @@ import java.util.BitSet; import java.util.Collection; import java.util.List; +import javax.annotation.Nullable; import javax.vecmath.Matrix4f; import javax.vecmath.Vector4f; @@ -140,7 +141,7 @@ public final class ItemLayerModel implements IRetexturableModel private final boolean isCulled; private final ItemOverrideList overrides; - public BakedItemModel(ImmutableList quads, TextureAtlasSprite particle, ImmutableMap transforms, ItemOverrideList overrides, IBakedModel otherModel) + public BakedItemModel(ImmutableList quads, TextureAtlasSprite particle, ImmutableMap transforms, ItemOverrideList overrides, @Nullable IBakedModel otherModel) { this.quads = quads; this.particle = particle; diff --git a/src/main/java/net/minecraftforge/client/model/ModelDynBucket.java b/src/main/java/net/minecraftforge/client/model/ModelDynBucket.java index 719cbc53a7..5fff772dca 100644 --- a/src/main/java/net/minecraftforge/client/model/ModelDynBucket.java +++ b/src/main/java/net/minecraftforge/client/model/ModelDynBucket.java @@ -75,10 +75,13 @@ public final class ModelDynBucket implements IModel, IModelCustomData, IRetextur public static final IModel MODEL = new ModelDynBucket(); + @Nullable private final ResourceLocation baseLocation; + @Nullable private final ResourceLocation liquidLocation; + @Nullable private final ResourceLocation coverLocation; - + @Nullable private final Fluid fluid; private final boolean flipGas; @@ -87,7 +90,7 @@ public final class ModelDynBucket implements IModel, IModelCustomData, IRetextur this(null, null, null, null, false); } - public ModelDynBucket(ResourceLocation baseLocation, ResourceLocation liquidLocation, ResourceLocation coverLocation, Fluid fluid, boolean flipGas) + public ModelDynBucket(@Nullable ResourceLocation baseLocation, @Nullable ResourceLocation liquidLocation, @Nullable ResourceLocation coverLocation, @Nullable Fluid fluid, boolean flipGas) { this.baseLocation = baseLocation; this.liquidLocation = liquidLocation; diff --git a/src/main/java/net/minecraftforge/client/model/ModelLoader.java b/src/main/java/net/minecraftforge/client/model/ModelLoader.java index 3b4aceabd8..4ca54fd5f0 100644 --- a/src/main/java/net/minecraftforge/client/model/ModelLoader.java +++ b/src/main/java/net/minecraftforge/client/model/ModelLoader.java @@ -121,6 +121,8 @@ import com.google.common.collect.Multimap; import com.google.common.collect.Multimaps; import com.google.common.collect.Sets; +import javax.annotation.Nonnull; + public final class ModelLoader extends ModelBakery { private final Map stateModels = Maps.newHashMap(); @@ -1167,7 +1169,7 @@ public final class ModelLoader extends ModelBakery ModelLoader.setCustomMeshDefinition(item, new ItemMeshDefinition() { @Override - public ModelResourceLocation getModelLocation(ItemStack stack) + public ModelResourceLocation getModelLocation(@Nonnull ItemStack stack) { return ModelDynBucket.LOCATION; } diff --git a/src/main/java/net/minecraftforge/client/model/MultiLayerModel.java b/src/main/java/net/minecraftforge/client/model/MultiLayerModel.java index c309b1631e..cc706c6982 100644 --- a/src/main/java/net/minecraftforge/client/model/MultiLayerModel.java +++ b/src/main/java/net/minecraftforge/client/model/MultiLayerModel.java @@ -22,6 +22,7 @@ package net.minecraftforge.client.model; import java.util.Collection; import java.util.List; +import javax.annotation.Nonnull; import javax.vecmath.Matrix4f; import net.minecraft.block.state.IBlockState; @@ -177,6 +178,7 @@ public final class MultiLayerModel implements IModelCustomData return builder.build(); } + @Nonnull @Override public List getQuads(IBlockState state, EnumFacing side, long rand) { diff --git a/src/main/java/net/minecraftforge/client/model/animation/AnimationItemOverrideList.java b/src/main/java/net/minecraftforge/client/model/animation/AnimationItemOverrideList.java index 54aa7eedc0..65ead8924d 100644 --- a/src/main/java/net/minecraftforge/client/model/animation/AnimationItemOverrideList.java +++ b/src/main/java/net/minecraftforge/client/model/animation/AnimationItemOverrideList.java @@ -67,10 +67,10 @@ public final class AnimationItemOverrideList extends ItemOverrideList @Override public IBakedModel handleItemState(@Nonnull IBakedModel originalModel, @Nonnull ItemStack stack, @Nullable World world, @Nullable EntityLivingBase entity) { - if(stack.hasCapability(net.minecraftforge.common.model.animation.CapabilityAnimation.ANIMATION_CAPABILITY, null)) + IAnimationStateMachine asm = stack.getCapability(CapabilityAnimation.ANIMATION_CAPABILITY, null); + if (asm != null) { // TODO: caching? - IAnimationStateMachine asm = stack.getCapability(CapabilityAnimation.ANIMATION_CAPABILITY, null); if(world == null && entity != null) { world = entity.world; diff --git a/src/main/java/net/minecraftforge/client/model/animation/AnimationModelBase.java b/src/main/java/net/minecraftforge/client/model/animation/AnimationModelBase.java index e9aeaf6aee..aa38506ff6 100644 --- a/src/main/java/net/minecraftforge/client/model/animation/AnimationModelBase.java +++ b/src/main/java/net/minecraftforge/client/model/animation/AnimationModelBase.java @@ -44,6 +44,7 @@ import net.minecraftforge.common.animation.IEventHandler; import net.minecraftforge.common.model.IModelState; import net.minecraftforge.common.model.animation.CapabilityAnimation; +import net.minecraftforge.common.model.animation.IAnimationStateMachine; import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.opengl.GL11; @@ -67,12 +68,12 @@ public class AnimationModelBase extends ModelBase implements I @Override public void render(Entity entity, float limbSwing, float limbSwingSpeed, float timeAlive, float yawHead, float rotationPitch, float scale) { - if(!(entity.hasCapability(CapabilityAnimation.ANIMATION_CAPABILITY, null))) + IAnimationStateMachine capability = entity.getCapability(CapabilityAnimation.ANIMATION_CAPABILITY, null); + if (capability == null) { return; } - - Pair> pair = entity.getCapability(CapabilityAnimation.ANIMATION_CAPABILITY, null).apply(timeAlive / 20); + Pair> pair = capability.apply(timeAlive / 20); handleEvents((T)entity, timeAlive / 20, pair.getRight()); IModel model = ModelLoaderRegistry.getModelOrMissing(modelLocation); IBakedModel bakedModel = model.bake(pair.getLeft(), DefaultVertexFormats.ITEM, ModelLoader.defaultTextureGetter()); diff --git a/src/main/java/net/minecraftforge/client/model/animation/AnimationTESR.java b/src/main/java/net/minecraftforge/client/model/animation/AnimationTESR.java index e0749c1ee6..f248d805e2 100644 --- a/src/main/java/net/minecraftforge/client/model/animation/AnimationTESR.java +++ b/src/main/java/net/minecraftforge/client/model/animation/AnimationTESR.java @@ -32,11 +32,14 @@ import net.minecraftforge.common.animation.Event; import net.minecraftforge.common.animation.IEventHandler; import net.minecraftforge.common.model.IModelState; import net.minecraftforge.common.model.animation.CapabilityAnimation; +import net.minecraftforge.common.model.animation.IAnimationStateMachine; import net.minecraftforge.common.property.IExtendedBlockState; import net.minecraftforge.common.property.Properties; import org.apache.commons.lang3.tuple.Pair; +import javax.annotation.Nonnull; + /** * Generic TileEntitySpecialRenderer that works with the Forge model system and animations. */ @@ -44,7 +47,7 @@ public class AnimationTESR extends FastTESR implements { protected static BlockRendererDispatcher blockRenderer; - public void renderTileEntityFast(T te, double x, double y, double z, float partialTick, int breakStage, VertexBuffer renderer) + public void renderTileEntityFast(@Nonnull T te, double x, double y, double z, float partialTick, int breakStage, @Nonnull VertexBuffer renderer) { if(!te.hasCapability(CapabilityAnimation.ANIMATION_CAPABILITY, null)) { @@ -64,16 +67,20 @@ public class AnimationTESR extends FastTESR implements if(exState.getUnlistedNames().contains(Properties.AnimationProperty)) { float time = Animation.getWorldTime(getWorld(), partialTick); - Pair> pair = te.getCapability(CapabilityAnimation.ANIMATION_CAPABILITY, null).apply(time); - handleEvents(te, time, pair.getRight()); + IAnimationStateMachine capability = te.getCapability(CapabilityAnimation.ANIMATION_CAPABILITY, null); + if (capability != null) + { + Pair> pair = capability.apply(time); + handleEvents(te, time, pair.getRight()); - // TODO: caching? - IBakedModel model = blockRenderer.getBlockModelShapes().getModelForState(exState.getClean()); - exState = exState.withProperty(Properties.AnimationProperty, pair.getLeft()); + // TODO: caching? + IBakedModel model = blockRenderer.getBlockModelShapes().getModelForState(exState.getClean()); + exState = exState.withProperty(Properties.AnimationProperty, pair.getLeft()); - renderer.setTranslation(x - pos.getX(), y - pos.getY(), z - pos.getZ()); + renderer.setTranslation(x - pos.getX(), y - pos.getY(), z - pos.getZ()); - blockRenderer.getBlockModelRenderer().renderModel(world, model, exState, pos, renderer, false); + blockRenderer.getBlockModelRenderer().renderModel(world, model, exState, pos, renderer, false); + } } } } diff --git a/src/main/java/net/minecraftforge/client/model/animation/FastTESR.java b/src/main/java/net/minecraftforge/client/model/animation/FastTESR.java index 63b8adbd71..8f4a0d499a 100644 --- a/src/main/java/net/minecraftforge/client/model/animation/FastTESR.java +++ b/src/main/java/net/minecraftforge/client/model/animation/FastTESR.java @@ -31,10 +31,12 @@ import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.tileentity.TileEntity; +import javax.annotation.Nonnull; + public abstract class FastTESR extends TileEntitySpecialRenderer { @Override - public final void renderTileEntityAt(T te, double x, double y, double z, float partialTicks, int destroyStage) + public final void renderTileEntityAt(@Nonnull T te, double x, double y, double z, float partialTicks, int destroyStage) { Tessellator tessellator = Tessellator.getInstance(); VertexBuffer VertexBuffer = tessellator.getBuffer(); @@ -64,5 +66,5 @@ public abstract class FastTESR extends TileEntitySpecialRe } @Override - public abstract void renderTileEntityFast(T te, double x, double y, double z, float partialTicks, int destroyStage, VertexBuffer VertexBuffer); + public abstract void renderTileEntityFast(@Nonnull T te, double x, double y, double z, float partialTicks, int destroyStage, @Nonnull VertexBuffer VertexBuffer); } diff --git a/src/main/java/net/minecraftforge/client/model/animation/ModelBlockAnimation.java b/src/main/java/net/minecraftforge/client/model/animation/ModelBlockAnimation.java index d31d0f61c5..4c43d9655d 100644 --- a/src/main/java/net/minecraftforge/client/model/animation/ModelBlockAnimation.java +++ b/src/main/java/net/minecraftforge/client/model/animation/ModelBlockAnimation.java @@ -29,6 +29,7 @@ import java.util.Map; import java.util.NoSuchElementException; import java.util.TreeMap; +import javax.annotation.Nullable; import javax.vecmath.AxisAngle4f; import javax.vecmath.Matrix4f; import javax.vecmath.Quat4f; @@ -515,6 +516,7 @@ public class ModelBlockAnimation } } + @Nullable public TRSRTransformation getPartTransform(IModelState state, BlockPart part, int i) { ImmutableCollection infos = getJoint(i); diff --git a/src/main/java/net/minecraftforge/client/model/b3d/B3DLoader.java b/src/main/java/net/minecraftforge/client/model/b3d/B3DLoader.java index 9cc238ae6f..734298df93 100644 --- a/src/main/java/net/minecraftforge/client/model/b3d/B3DLoader.java +++ b/src/main/java/net/minecraftforge/client/model/b3d/B3DLoader.java @@ -30,6 +30,7 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; +import javax.annotation.Nullable; import javax.vecmath.Matrix4f; import javax.vecmath.Vector3f; @@ -168,6 +169,7 @@ public enum B3DLoader implements ICustomModelLoader private final int frame; private final int nextFrame; private final float progress; + @Nullable private final IModelState parent; public B3DState(Animation animation, int frame) @@ -185,7 +187,7 @@ public enum B3DLoader implements ICustomModelLoader this(animation, frame, nextFrame, progress, null); } - public B3DState(Animation animation, int frame, int nextFrame, float progress, IModelState parent) + public B3DState(Animation animation, int frame, int nextFrame, float progress, @Nullable IModelState parent) { this.animation = animation; this.frame = frame; @@ -194,7 +196,8 @@ public enum B3DLoader implements ICustomModelLoader this.parent = getParent(parent); } - private IModelState getParent(IModelState parent) + @Nullable + private IModelState getParent(@Nullable IModelState parent) { if (parent == null) return null; else if (parent instanceof B3DState) return ((B3DState)parent).parent; @@ -221,6 +224,7 @@ public enum B3DLoader implements ICustomModelLoader return progress; } + @Nullable public IModelState getParent() { return parent; diff --git a/src/main/java/net/minecraftforge/client/model/obj/OBJModel.java b/src/main/java/net/minecraftforge/client/model/obj/OBJModel.java index f9e6c6f3f6..51bbc5144c 100644 --- a/src/main/java/net/minecraftforge/client/model/obj/OBJModel.java +++ b/src/main/java/net/minecraftforge/client/model/obj/OBJModel.java @@ -33,6 +33,7 @@ import java.util.Map; import java.util.Set; import java.util.regex.Pattern; +import javax.annotation.Nullable; import javax.vecmath.Matrix3f; import javax.vecmath.Matrix4f; import javax.vecmath.Vector2f; @@ -1068,7 +1069,7 @@ public class OBJModel implements IRetexturableModel, IModelCustomData // public float[] minUVBounds = new float[] {0.0f, 0.0f}; // public float[] maxUVBounds = new float[] {1.0f, 1.0f}; - public Group(String name, LinkedHashSet faces) + public Group(String name, @Nullable LinkedHashSet faces) { this.name = name != null ? name : DEFAULT_NAME; this.faces = faces == null ? new LinkedHashSet() : faces; @@ -1129,6 +1130,7 @@ public class OBJModel implements IRetexturableModel, IModelCustomData for (String s : visibleGroups) this.visibilityMap.put(s, visibility); } + @Nullable public IModelState getParent(IModelState parent) { if (parent == null) return null; diff --git a/src/main/java/net/minecraftforge/client/settings/KeyBindingMap.java b/src/main/java/net/minecraftforge/client/settings/KeyBindingMap.java index 1430c904c5..bcad452b77 100644 --- a/src/main/java/net/minecraftforge/client/settings/KeyBindingMap.java +++ b/src/main/java/net/minecraftforge/client/settings/KeyBindingMap.java @@ -22,6 +22,7 @@ package net.minecraftforge.client.settings; import net.minecraft.client.settings.KeyBinding; import net.minecraft.util.IntHashMap; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collection; import java.util.EnumMap; @@ -38,6 +39,7 @@ public class KeyBindingMap } } + @Nullable public KeyBinding lookupActive(int keyCode) { KeyModifier activeModifier = KeyModifier.getActiveModifier(); @@ -52,6 +54,7 @@ public class KeyBindingMap return getBinding(keyCode, KeyModifier.NONE); } + @Nullable private KeyBinding getBinding(int keyCode, KeyModifier keyModifier) { Collection bindings = map.get(keyModifier).lookup(keyCode); diff --git a/src/main/java/net/minecraftforge/common/AchievementPage.java b/src/main/java/net/minecraftforge/common/AchievementPage.java index 736f312053..0dfbb70ecd 100644 --- a/src/main/java/net/minecraftforge/common/AchievementPage.java +++ b/src/main/java/net/minecraftforge/common/AchievementPage.java @@ -32,6 +32,8 @@ import java.util.Set; import net.minecraft.stats.Achievement; +import javax.annotation.Nullable; + public class AchievementPage { private String name; @@ -83,6 +85,7 @@ public class AchievementPage * @param name The page's name. * @return the achievement page with the given name or null if no such page */ + @Nullable public static AchievementPage getAchievementPage(String name) { for (AchievementPage page : achievementPages) diff --git a/src/main/java/net/minecraftforge/common/BiomeManager.java b/src/main/java/net/minecraftforge/common/BiomeManager.java index 085fba0bf9..be4ef0fca1 100644 --- a/src/main/java/net/minecraftforge/common/BiomeManager.java +++ b/src/main/java/net/minecraftforge/common/BiomeManager.java @@ -33,6 +33,8 @@ import net.minecraft.world.biome.BiomeProvider; import net.minecraft.world.gen.structure.MapGenVillage; import net.minecraftforge.common.util.EnumHelper; +import javax.annotation.Nullable; + public class BiomeManager { private static TrackedList[] biomes = setupBiomes(); @@ -154,6 +156,7 @@ public class BiomeManager } } + @Nullable public static ImmutableList getBiomes(BiomeType type) { int idx = type.ordinal(); diff --git a/src/main/java/net/minecraftforge/common/DimensionManager.java b/src/main/java/net/minecraftforge/common/DimensionManager.java index a2fb5b934f..11c4f48270 100644 --- a/src/main/java/net/minecraftforge/common/DimensionManager.java +++ b/src/main/java/net/minecraftforge/common/DimensionManager.java @@ -52,6 +52,8 @@ import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.FMLLog; +import javax.annotation.Nullable; + public class DimensionManager { private static Hashtable worlds = new Hashtable(); @@ -170,7 +172,7 @@ public class DimensionManager return worlds.keySet().toArray(new Integer[worlds.size()]); //Only loaded dims, since usually used to cycle through loaded worlds } - public static void setWorld(int id, WorldServer world, MinecraftServer server) + public static void setWorld(int id, @Nullable WorldServer world, MinecraftServer server) { if (world != null) { @@ -357,7 +359,7 @@ public class DimensionManager return dimMap; } - public static void loadDimensionDataMap(NBTTagCompound compoundTag) + public static void loadDimensionDataMap(@Nullable NBTTagCompound compoundTag) { dimensionMap.clear(); if (compoundTag == null) @@ -387,6 +389,7 @@ public class DimensionManager * Return the current root directory for the world save. Accesses getSaveHandler from the overworld * @return the root directory of the save */ + @Nullable public static File getCurrentSaveRootDirectory() { if (DimensionManager.getWorld(0) != null) diff --git a/src/main/java/net/minecraftforge/common/ForgeChunkManager.java b/src/main/java/net/minecraftforge/common/ForgeChunkManager.java index 79f10494ab..cd460a7f6f 100644 --- a/src/main/java/net/minecraftforge/common/ForgeChunkManager.java +++ b/src/main/java/net/minecraftforge/common/ForgeChunkManager.java @@ -139,7 +139,7 @@ public class ForgeChunkManager @Override public Chunk apply(@Nullable ChunkPos input) { - return world.getChunkFromChunkCoords(input.chunkXPos, input.chunkZPos); + return input == null ? null : world.getChunkFromChunkCoords(input.chunkXPos, input.chunkZPos); } })); world.theProfiler.endStartSection("regularChunkLoading"); @@ -687,6 +687,7 @@ public class ForgeChunkManager return playerTicketLength - playerTickets.get(username).size(); } + @Nullable public static Ticket requestPlayerTicket(Object mod, String player, World world, Type type) { ModContainer mc = getContainer(mod); @@ -713,6 +714,7 @@ public class ForgeChunkManager * @param type The type of ticket * @return A ticket with which to register chunks for loading, or null if no further tickets are available */ + @Nullable public static Ticket requestTicket(Object mod, World world, Type type) { ModContainer container = getContainer(mod); @@ -966,6 +968,7 @@ public class ForgeChunkManager } } + @Nullable public static Chunk fetchDormantChunk(long coords, World world) { Cache cache = dormantChunkCache.get(world); @@ -1110,6 +1113,7 @@ public class ForgeChunkManager return list; } + @Nullable public static ConfigCategory getConfigFor(Object mod) { ModContainer container = getContainer(mod); diff --git a/src/main/java/net/minecraftforge/common/ForgeHooks.java b/src/main/java/net/minecraftforge/common/ForgeHooks.java index 8526879f96..92c2ee9d32 100644 --- a/src/main/java/net/minecraftforge/common/ForgeHooks.java +++ b/src/main/java/net/minecraftforge/common/ForgeHooks.java @@ -552,7 +552,7 @@ public class ForgeHooks return (MinecraftForge.EVENT_BUS.post(event) ? null : new float[]{event.getDistance(), event.getDamageMultiplier()}); } - public static int getLootingLevel(Entity target, Entity killer, DamageSource cause) + public static int getLootingLevel(Entity target, @Nullable Entity killer, DamageSource cause) { int looting = 0; if (killer instanceof EntityLivingBase) @@ -619,6 +619,7 @@ public class ForgeHooks MinecraftForge.EVENT_BUS.post(new LivingJumpEvent(entity)); } + @Nullable public static EntityItem onPlayerTossEvent(@Nonnull EntityPlayer player, @Nonnull ItemStack item, boolean includeName) { player.captureDrops = true; @@ -649,6 +650,7 @@ public class ForgeHooks return world.getBlockState(pos).getBlock().getEnchantPowerBonus(world, pos); } + @Nullable public static ITextComponent onServerChatEvent(NetHandlerPlayServer net, String raw, ITextComponent comp) { ServerChatEvent event = new ServerChatEvent(net.playerEntity, raw, comp); @@ -793,7 +795,7 @@ public class ForgeHooks return event.isCanceled() ? -1 : event.getExpToDrop(); } - public static EnumActionResult onPlaceItemIntoWorld(@Nonnull ItemStack itemstack, EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ, EnumHand hand) + public static EnumActionResult onPlaceItemIntoWorld(@Nonnull ItemStack itemstack, @Nonnull EntityPlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull EnumFacing side, float hitX, float hitY, float hitZ, @Nonnull EnumHand hand) { // handle all placement events here int meta = itemstack.getItemDamage(); @@ -896,7 +898,7 @@ public class ForgeHooks return false; } - public static float onAnvilRepair(EntityPlayer player, ItemStack output, ItemStack left, ItemStack right) + public static float onAnvilRepair(EntityPlayer player, @Nonnull ItemStack output, @Nonnull ItemStack left, @Nonnull ItemStack right) { AnvilRepairEvent e = new AnvilRepairEvent(player, left, right, output); MinecraftForge.EVENT_BUS.post(e); @@ -1009,6 +1011,7 @@ public class ForgeHooks return !event.isCanceled(); } + @Nullable public static RayTraceResult rayTraceEyes(EntityLivingBase entity, double length) { Vec3d startPos = new Vec3d(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ); @@ -1016,6 +1019,7 @@ public class ForgeHooks return entity.world.rayTraceBlocks(startPos, endPos); } + @Nullable public static Vec3d rayTraceEyeHitVec(EntityLivingBase entity, double length) { RayTraceResult git = rayTraceEyes(entity, length); @@ -1085,6 +1089,8 @@ public class ForgeHooks return ctx; } + + @Nullable public static LootTable loadLootTable(Gson gson, ResourceLocation name, String data, boolean custom) { Deque que = lootContext.get(); @@ -1140,7 +1146,7 @@ public class ForgeHooks public String validateEntryName(@Nullable String name) { - if (!this.entryNames.contains(name)) + if (name != null && !this.entryNames.contains(name)) { this.entryNames.add(name); return name; diff --git a/src/main/java/net/minecraftforge/common/ForgeModContainer.java b/src/main/java/net/minecraftforge/common/ForgeModContainer.java index c5b6f96c56..2e0abea421 100644 --- a/src/main/java/net/minecraftforge/common/ForgeModContainer.java +++ b/src/main/java/net/minecraftforge/common/ForgeModContainer.java @@ -94,6 +94,8 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.PlayerEvent; import net.minecraftforge.fml.common.network.NetworkRegistry; +import javax.annotation.Nullable; + public class ForgeModContainer extends DummyModContainer implements WorldAccessContainer { public static final String VERSION_CHECK_CAT = "version_checking"; @@ -541,6 +543,7 @@ public class ForgeModContainer extends DummyModContainer implements WorldAccessC @Override + @Nullable public Certificate getSigningCertificate() { Certificate[] certificates = getClass().getProtectionDomain().getCodeSource().getCertificates(); diff --git a/src/main/java/net/minecraftforge/common/ForgeVersion.java b/src/main/java/net/minecraftforge/common/ForgeVersion.java index a8be006059..249c63857e 100644 --- a/src/main/java/net/minecraftforge/common/ForgeVersion.java +++ b/src/main/java/net/minecraftforge/common/ForgeVersion.java @@ -47,6 +47,8 @@ import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.ModContainer; import net.minecraftforge.fml.common.versioning.ComparableVersion; +import javax.annotation.Nullable; + public class ForgeVersion { // This is Forge's Mod Id, used for the ForgeModContainer and resource locations @@ -93,6 +95,7 @@ public class ForgeVersion return getResult(ForgeModContainer.getInstance()).status; } + @Nullable public static String getTarget() { CheckResult res = getResult(ForgeModContainer.getInstance()); @@ -159,15 +162,17 @@ public class ForgeVersion public static class CheckResult { public final Status status; + @Nullable public final ComparableVersion target; public final Map changes; + @Nullable public final String url; - private CheckResult(Status status, ComparableVersion target, Map changes, String url) + private CheckResult(Status status, @Nullable ComparableVersion target, @Nullable Map changes, @Nullable String url) { this.status = status; this.target = target; - this.changes = changes == null ? null : Collections.unmodifiableMap(changes); + this.changes = changes == null ? Collections.emptyMap() : Collections.unmodifiableMap(changes); this.url = url; } } diff --git a/src/main/java/net/minecraftforge/common/animation/TimeValues.java b/src/main/java/net/minecraftforge/common/animation/TimeValues.java index 67cc4b7019..88a9387a98 100644 --- a/src/main/java/net/minecraftforge/common/animation/TimeValues.java +++ b/src/main/java/net/minecraftforge/common/animation/TimeValues.java @@ -35,6 +35,8 @@ import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; +import javax.annotation.Nullable; + /** * Various implementations of ITimeValue. */ @@ -291,12 +293,13 @@ public final class TimeValues private final ThreadLocal> valueResolver = new ThreadLocal>(); - public void setValueResolver(Function valueResolver) + public void setValueResolver(@Nullable Function valueResolver) { this.valueResolver.set(valueResolver); } @SuppressWarnings("unchecked") + @Nullable public TypeAdapter create(Gson gson, TypeToken type) { if(type.getRawType() != ITimeValue.class) diff --git a/src/main/java/net/minecraftforge/common/brewing/AbstractBrewingRecipe.java b/src/main/java/net/minecraftforge/common/brewing/AbstractBrewingRecipe.java index a3f10fe3b3..2a96a272af 100644 --- a/src/main/java/net/minecraftforge/common/brewing/AbstractBrewingRecipe.java +++ b/src/main/java/net/minecraftforge/common/brewing/AbstractBrewingRecipe.java @@ -24,8 +24,9 @@ import net.minecraftforge.oredict.OreDictionary; import javax.annotation.Nonnull; -public abstract class AbstractBrewingRecipe implements IBrewingRecipe { - +public abstract class AbstractBrewingRecipe implements IBrewingRecipe +{ + @Nonnull private final ItemStack input; private final T ingredient; private final ItemStack output; diff --git a/src/main/java/net/minecraftforge/common/brewing/IBrewingRecipe.java b/src/main/java/net/minecraftforge/common/brewing/IBrewingRecipe.java index 8aa4027fed..145086b83c 100644 --- a/src/main/java/net/minecraftforge/common/brewing/IBrewingRecipe.java +++ b/src/main/java/net/minecraftforge/common/brewing/IBrewingRecipe.java @@ -30,18 +30,19 @@ public interface IBrewingRecipe { * being the item that goes in one of the three bottom slots of the brewing * stand (e.g: water bottle) */ - public boolean isInput(@Nonnull ItemStack input); + boolean isInput(@Nonnull ItemStack input); /** * Returns true if the passed ItemStack is an ingredient for this recipe. * "Ingredient" being the item that goes in the top slot of the brewing * stand (e.g: nether wart) */ - public boolean isIngredient(@Nonnull ItemStack ingredient); + boolean isIngredient(@Nonnull ItemStack ingredient); /** * Returns the output when the passed input is brewed with the passed - * ingredient. Null if invalid input or ingredient. + * ingredient. Empty if invalid input or ingredient. */ - public ItemStack getOutput(@Nonnull ItemStack input, @Nonnull ItemStack ingredient); + @Nonnull + ItemStack getOutput(@Nonnull ItemStack input, @Nonnull ItemStack ingredient); } \ No newline at end of file diff --git a/src/main/java/net/minecraftforge/common/brewing/VanillaBrewingRecipe.java b/src/main/java/net/minecraftforge/common/brewing/VanillaBrewingRecipe.java index 4ef417b125..3ebdcae9c5 100644 --- a/src/main/java/net/minecraftforge/common/brewing/VanillaBrewingRecipe.java +++ b/src/main/java/net/minecraftforge/common/brewing/VanillaBrewingRecipe.java @@ -58,6 +58,7 @@ public class VanillaBrewingRecipe implements IBrewingRecipe { * or if the new potion is a splash potion when the old one wasn't. */ @Override + @Nonnull public ItemStack getOutput(@Nonnull ItemStack input, @Nonnull ItemStack ingredient) { if (!input.isEmpty() && !ingredient.isEmpty() && isIngredient(ingredient)) diff --git a/src/main/java/net/minecraftforge/common/capabilities/Capability.java b/src/main/java/net/minecraftforge/common/capabilities/Capability.java index dbaec462f4..7c7bb34f57 100644 --- a/src/main/java/net/minecraftforge/common/capabilities/Capability.java +++ b/src/main/java/net/minecraftforge/common/capabilities/Capability.java @@ -26,6 +26,8 @@ import com.google.common.base.Throwables; import net.minecraft.nbt.NBTBase; import net.minecraft.util.EnumFacing; +import javax.annotation.Nullable; + /** * This is the core holder object Capabilities. * Each capability will have ONE instance of this class, @@ -55,6 +57,7 @@ public class Capability * @param side The side of the object the instance is associated with. * @return a NBT holding the data. Null if no data needs to be stored. */ + @Nullable NBTBase writeNBT(Capability capability, T instance, EnumFacing side); /** @@ -103,6 +106,7 @@ public class Capability * Quick access to the IStorage's writeNBT. * See {@link IStorage#writeNBT(Capability, Object, EnumFacing)} for documentation. */ + @Nullable public NBTBase writeNBT(T instance, EnumFacing side) { return storage.writeNBT(this, instance, side); @@ -117,6 +121,7 @@ public class Capability * * @return A NEW instance of the default implementation. */ + @Nullable public T getDefaultInstance() { try diff --git a/src/main/java/net/minecraftforge/common/capabilities/CapabilityDispatcher.java b/src/main/java/net/minecraftforge/common/capabilities/CapabilityDispatcher.java index 9ea287a9ec..2d76282add 100644 --- a/src/main/java/net/minecraftforge/common/capabilities/CapabilityDispatcher.java +++ b/src/main/java/net/minecraftforge/common/capabilities/CapabilityDispatcher.java @@ -54,7 +54,7 @@ public final class CapabilityDispatcher implements INBTSerializable list, ICapabilityProvider parent) + public CapabilityDispatcher(Map list, @Nullable ICapabilityProvider parent) { List lstCaps = Lists.newArrayList(); List> lstWriters = Lists.newArrayList(); diff --git a/src/main/java/net/minecraftforge/common/capabilities/CapabilityManager.java b/src/main/java/net/minecraftforge/common/capabilities/CapabilityManager.java index 8fa4b24791..0ae0a20ff5 100644 --- a/src/main/java/net/minecraftforge/common/capabilities/CapabilityManager.java +++ b/src/main/java/net/minecraftforge/common/capabilities/CapabilityManager.java @@ -39,6 +39,8 @@ import net.minecraftforge.common.util.EnumHelper; import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.discovery.ASMDataTable; +import javax.annotation.Nullable; + public enum CapabilityManager { INSTANCE; @@ -63,11 +65,10 @@ public enum CapabilityManager try { return implementation.newInstance(); } catch (InstantiationException e) { - Throwables.propagate(e); + throw Throwables.propagate(e); } catch (IllegalAccessException e) { - Throwables.propagate(e); + throw Throwables.propagate(e); } - return null; } }); } @@ -115,6 +116,7 @@ public enum CapabilityManager if (type == null) { FMLLog.log(Level.WARN, "Unable to inject capability at %s.%s (Invalid Annotation)", targetClass, targetName); + continue; } final String capabilityName = type.getInternalName().replace('/', '.').intern(); diff --git a/src/main/java/net/minecraftforge/common/model/TRSRTransformation.java b/src/main/java/net/minecraftforge/common/model/TRSRTransformation.java index 6ae30e83cd..68fbdd36a1 100644 --- a/src/main/java/net/minecraftforge/common/model/TRSRTransformation.java +++ b/src/main/java/net/minecraftforge/common/model/TRSRTransformation.java @@ -21,6 +21,7 @@ package net.minecraftforge.common.model; import java.util.EnumMap; +import javax.annotation.Nullable; import javax.vecmath.AxisAngle4f; import javax.vecmath.Matrix3f; import javax.vecmath.Matrix4f; @@ -78,7 +79,7 @@ public final class TRSRTransformation implements IModelState, ITransformation } } - public TRSRTransformation(Vector3f translation, Quat4f leftRot, Vector3f scale, Quat4f rightRot) + public TRSRTransformation(@Nullable Vector3f translation, @Nullable Quat4f leftRot, @Nullable Vector3f scale, @Nullable Quat4f rightRot) { this.matrix = mul(translation, leftRot, scale, rightRot); this.translation = translation != null ? translation : new Vector3f(); @@ -260,7 +261,7 @@ public final class TRSRTransformation implements IModelState, ITransformation ); } - public static Matrix4f mul(Vector3f translation, Quat4f leftRot, Vector3f scale, Quat4f rightRot) + public static Matrix4f mul(@Nullable Vector3f translation, @Nullable Quat4f leftRot, @Nullable Vector3f scale, @Nullable Quat4f rightRot) { Matrix4f res = new Matrix4f(), t = new Matrix4f(); res.setIdentity(); diff --git a/src/main/java/net/minecraftforge/common/model/animation/AnimationStateMachine.java b/src/main/java/net/minecraftforge/common/model/animation/AnimationStateMachine.java index 2d003515cc..9e5f40be89 100644 --- a/src/main/java/net/minecraftforge/common/model/animation/AnimationStateMachine.java +++ b/src/main/java/net/minecraftforge/common/model/animation/AnimationStateMachine.java @@ -57,6 +57,8 @@ import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.google.gson.annotations.SerializedName; +import javax.annotation.Nullable; + public final class AnimationStateMachine implements IAnimationStateMachine { private final ImmutableMap parameters; @@ -310,6 +312,7 @@ public final class AnimationStateMachine implements IAnimationStateMachine INSTANCE; @SuppressWarnings("unchecked") + @Nullable public TypeAdapter create(Gson gson, TypeToken type) { if(type.getRawType() != ImmutableMultimap.class || !(type.getType() instanceof ParameterizedType)) diff --git a/src/main/java/net/minecraftforge/common/model/animation/Clips.java b/src/main/java/net/minecraftforge/common/model/animation/Clips.java index 14ef8c7235..93c70a7b9f 100644 --- a/src/main/java/net/minecraftforge/common/model/animation/Clips.java +++ b/src/main/java/net/minecraftforge/common/model/animation/Clips.java @@ -53,6 +53,8 @@ import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; +import javax.annotation.Nullable; + /** * Various implementations of IClip, and utility methods. */ @@ -426,12 +428,13 @@ public final class Clips private final ThreadLocal> clipResolver = new ThreadLocal>(); - public void setClipResolver(Function clipResolver) + public void setClipResolver(@Nullable Function clipResolver) { this.clipResolver.set(clipResolver); } @SuppressWarnings("unchecked") + @Nullable public TypeAdapter create(Gson gson, TypeToken type) { if(type.getRawType() != IClip.class) diff --git a/src/main/java/net/minecraftforge/common/property/ExtendedBlockState.java b/src/main/java/net/minecraftforge/common/property/ExtendedBlockState.java index da1e628a82..955ef94460 100644 --- a/src/main/java/net/minecraftforge/common/property/ExtendedBlockState.java +++ b/src/main/java/net/minecraftforge/common/property/ExtendedBlockState.java @@ -37,6 +37,9 @@ import com.google.common.collect.ImmutableTable; import com.google.common.collect.Iterables; import com.google.common.collect.Maps; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + public class ExtendedBlockState extends BlockStateContainer { private final ImmutableSet> unlistedProperties; @@ -68,7 +71,8 @@ public class ExtendedBlockState extends BlockStateContainer } @Override - protected StateImplementation createState(Block block, ImmutableMap, Comparable> properties, ImmutableMap, Optional> unlistedProperties) + @Nonnull + protected StateImplementation createState(@Nonnull Block block, @Nonnull ImmutableMap, Comparable> properties, @Nullable ImmutableMap, Optional> unlistedProperties) { if (unlistedProperties == null || unlistedProperties.isEmpty()) return super.createState(block, properties, unlistedProperties); return new ExtendedStateImplementation(block, properties, unlistedProperties, null); @@ -79,7 +83,7 @@ public class ExtendedBlockState extends BlockStateContainer private final ImmutableMap, Optional> unlistedProperties; private Map, Comparable>, BlockStateContainer.StateImplementation> normalMap; - protected ExtendedStateImplementation(Block block, ImmutableMap, Comparable> properties, ImmutableMap, Optional> unlistedProperties, ImmutableTable, Comparable, IBlockState> table) + protected ExtendedStateImplementation(Block block, ImmutableMap, Comparable> properties, ImmutableMap, Optional> unlistedProperties, @Nullable ImmutableTable, Comparable, IBlockState> table) { super(block, properties); this.unlistedProperties = unlistedProperties; @@ -87,7 +91,8 @@ public class ExtendedBlockState extends BlockStateContainer } @Override - public , V extends T> IBlockState withProperty(IProperty property, V value) + @Nonnull + public , V extends T> IBlockState withProperty(@Nonnull IProperty property, @Nonnull V value) { if (!this.getProperties().containsKey(property)) { diff --git a/src/main/java/net/minecraftforge/common/util/BlockSnapshot.java b/src/main/java/net/minecraftforge/common/util/BlockSnapshot.java index 5684b98c3f..e3e00725d7 100644 --- a/src/main/java/net/minecraftforge/common/util/BlockSnapshot.java +++ b/src/main/java/net/minecraftforge/common/util/BlockSnapshot.java @@ -30,6 +30,8 @@ import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; import net.minecraftforge.fml.common.registry.ForgeRegistries; +import javax.annotation.Nullable; + /** * Represents a captured snapshot of a block which will not change * automatically. @@ -46,6 +48,7 @@ public class BlockSnapshot implements Serializable private final int dimId; private transient IBlockState replacedBlock; private int flag; + @Nullable private final NBTTagCompound nbt; private transient World world; private final ResourceLocation registryName; @@ -73,7 +76,7 @@ public class BlockSnapshot implements Serializable } } - public BlockSnapshot(World world, BlockPos pos, IBlockState state, NBTTagCompound nbt) + public BlockSnapshot(World world, BlockPos pos, IBlockState state, @Nullable NBTTagCompound nbt) { this.setWorld(world); this.dimId = world.provider.getDimension(); @@ -98,7 +101,7 @@ public class BlockSnapshot implements Serializable /** * Raw constructor designed for serialization usages. */ - public BlockSnapshot(int dimension, BlockPos pos, String modId, String blockName, int meta, int flag, NBTTagCompound nbt) + public BlockSnapshot(int dimension, BlockPos pos, String modId, String blockName, int meta, int flag, @Nullable NBTTagCompound nbt) { this.dimId = dimension; this.pos = pos.toImmutable(); @@ -322,6 +325,7 @@ public class BlockSnapshot implements Serializable public void setReplacedBlock(IBlockState replacedBlock) { this.replacedBlock = replacedBlock; } public int getFlag() { return flag; } public void setFlag(int flag) { this.flag = flag; } + @Nullable public NBTTagCompound getNbt() { return nbt; } public void setWorld(World world) { this.world = world; } public ResourceLocation getRegistryName() { return registryName; } diff --git a/src/main/java/net/minecraftforge/common/util/EnumHelper.java b/src/main/java/net/minecraftforge/common/util/EnumHelper.java index 7d0c8e4a41..3695c93a09 100644 --- a/src/main/java/net/minecraftforge/common/util/EnumHelper.java +++ b/src/main/java/net/minecraftforge/common/util/EnumHelper.java @@ -46,6 +46,8 @@ import net.minecraft.world.EnumSkyBlock; import net.minecraft.world.gen.structure.StructureStrongholdPieces.Stronghold.Door; import net.minecraftforge.classloading.FMLForgePlugin; +import javax.annotation.Nullable; + public class EnumHelper { private static Object reflectionFactory = null; @@ -73,54 +75,67 @@ public class EnumHelper {EnumRarity.class, TextFormatting.class, String.class} }; + @Nullable public static EnumAction addAction(String name) { return addEnum(EnumAction.class, name); } + @Nullable public static ArmorMaterial addArmorMaterial(String name, String textureName, int durability, int[] reductionAmounts, int enchantability, SoundEvent soundOnEquip, float toughness) { return addEnum(ArmorMaterial.class, name, textureName, durability, reductionAmounts, enchantability, soundOnEquip, toughness); } + @Nullable public static EnumArt addArt(String name, String tile, int sizeX, int sizeY, int offsetX, int offsetY) { return addEnum(EnumArt.class, name, tile, sizeX, sizeY, offsetX, offsetY); } + @Nullable public static EnumCreatureAttribute addCreatureAttribute(String name) { return addEnum(EnumCreatureAttribute.class, name); } + @Nullable public static EnumCreatureType addCreatureType(String name, Class typeClass, int maxNumber, Material material, boolean peaceful, boolean animal) { return addEnum(EnumCreatureType.class, name, typeClass, maxNumber, material, peaceful, animal); } + @Nullable public static Door addDoor(String name) { return addEnum(Door.class, name); } + @Nullable public static EnumEnchantmentType addEnchantmentType(String name, Predicate delegate) { return addEnum(EnumEnchantmentType.class, name, delegate); } + @Nullable public static Sensitivity addSensitivity(String name) { return addEnum(Sensitivity.class, name); } + @Nullable public static RayTraceResult.Type addMovingObjectType(String name) { return addEnum(RayTraceResult.Type.class, name); } + @Nullable public static EnumSkyBlock addSkyBlock(String name, int lightValue) { return addEnum(EnumSkyBlock.class, name, lightValue); } + @Nullable public static SleepResult addStatus(String name) { return addEnum(SleepResult.class, name); } + @Nullable public static ToolMaterial addToolMaterial(String name, int harvestLevel, int maxUses, float efficiency, float damage, int enchantability) { return addEnum(ToolMaterial.class, name, harvestLevel, maxUses, efficiency, damage, enchantability); } + @Nullable public static EnumRarity addRarity(String name, TextFormatting color, String displayName) { return addEnum(EnumRarity.class, name, color, displayName); @@ -164,16 +179,20 @@ public class EnumHelper return newConstructorAccessor.invoke(reflectionFactory, enumClass.getDeclaredConstructor(parameterTypes)); } - private static < T extends Enum> T makeEnum(Class enumClass, String value, int ordinal, Class[] additionalTypes, Object[] additionalValues) throws Exception + private static < T extends Enum> T makeEnum(Class enumClass, @Nullable String value, int ordinal, Class[] additionalTypes, @Nullable Object[] additionalValues) throws Exception { - Object[] params = new Object[additionalValues.length + 2]; + int additionalParamsCount = additionalValues == null ? 0 : additionalValues.length; + Object[] params = new Object[additionalParamsCount + 2]; params[0] = value; params[1] = ordinal; - System.arraycopy(additionalValues, 0, params, 2, additionalValues.length); + if (additionalValues != null) + { + System.arraycopy(additionalValues, 0, params, 2, additionalValues.length); + } return enumClass.cast(newInstance.invoke(getConstructorAccessor(enumClass, additionalTypes), new Object[] {params})); } - public static void setFailsafeFieldValue(Field field, Object target, Object value) throws Exception + public static void setFailsafeFieldValue(Field field, @Nullable Object target, @Nullable Object value) throws Exception { field.setAccessible(true); Field modifiersField = Field.class.getDeclaredField("modifiers"); @@ -202,12 +221,14 @@ public class EnumHelper blankField(enumClass, "enumConstants"); } + @Nullable private static > T addEnum(Class enumType, String enumName, Object... paramValues) { setup(); return addEnum(commonTypes, enumType, enumName, paramValues); } + @Nullable protected static > T addEnum(Class[][] map, Class enumType, String enumName, Object... paramValues) { for (Class[] lookup : map) @@ -231,13 +252,15 @@ public class EnumHelper addEnum(true, enumType, null, paramTypes, (Object[])null); } + @Nullable public static > T addEnum(Class enumType, String enumName, Class[] paramTypes, Object... paramValues) { return addEnum(false, enumType, enumName, paramTypes, paramValues); } @SuppressWarnings({ "unchecked", "serial" }) - private static > T addEnum(boolean test, final Class enumType, String enumName, final Class[] paramTypes, Object[] paramValues) + @Nullable + private static > T addEnum(boolean test, final Class enumType, @Nullable String enumName, final Class[] paramTypes, @Nullable Object[] paramValues) { if (!isSetup) { diff --git a/src/main/java/net/minecraftforge/event/ForgeEventFactory.java b/src/main/java/net/minecraftforge/event/ForgeEventFactory.java index dc4fec6a40..6914c5a702 100644 --- a/src/main/java/net/minecraftforge/event/ForgeEventFactory.java +++ b/src/main/java/net/minecraftforge/event/ForgeEventFactory.java @@ -143,10 +143,10 @@ public class ForgeEventFactory @Deprecated public static PlaceEvent onPlayerBlockPlace(EntityPlayer player, BlockSnapshot blockSnapshot, EnumFacing direction) { - return onPlayerBlockPlace(player, blockSnapshot, direction, null); + return onPlayerBlockPlace(player, blockSnapshot, direction, EnumHand.MAIN_HAND); } - public static PlaceEvent onPlayerBlockPlace(EntityPlayer player, BlockSnapshot blockSnapshot, EnumFacing direction, @Nullable EnumHand hand) + public static PlaceEvent onPlayerBlockPlace(@Nonnull EntityPlayer player, @Nonnull BlockSnapshot blockSnapshot, @Nonnull EnumFacing direction, @Nonnull EnumHand hand) { IBlockState placedAgainst = blockSnapshot.getWorld().getBlockState(blockSnapshot.getPos().offset(direction.getOpposite())); PlaceEvent event = new PlaceEvent(blockSnapshot, placedAgainst, player, hand); @@ -223,6 +223,7 @@ public class ForgeEventFactory return event.getDroppedExperience(); } + @Nullable public static List getPotentialSpawns(WorldServer world, EnumCreatureType type, BlockPos pos, List oldList) { WorldEvent.PotentialSpawns event = new WorldEvent.PotentialSpawns(world, type, pos, oldList); @@ -331,6 +332,7 @@ public class ForgeEventFactory MinecraftForge.EVENT_BUS.post(new PlayerEvent.LoadFromFile(player, dir, uuidString)); } + @Nullable public static ITextComponent onClientChat(byte type, ITextComponent message) { ClientChatReceivedEvent event = new ClientChatReceivedEvent(type, message); @@ -362,7 +364,8 @@ public class ForgeEventFactory return 0; } - public static ActionResult onBucketUse(EntityPlayer player, World world, ItemStack stack, RayTraceResult target) + @Nullable + public static ActionResult onBucketUse(@Nonnull EntityPlayer player, @Nonnull World world, @Nonnull ItemStack stack, @Nullable RayTraceResult target) { FillBucketEvent event = new FillBucketEvent(player, stack, world, target); if (MinecraftForge.EVENT_BUS.post(event)) return new ActionResult(EnumActionResult.FAIL, stack); @@ -543,27 +546,32 @@ public class ForgeEventFactory return MinecraftForge.EVENT_BUS.post(new RenderBlockOverlayEvent(player, renderPartialTicks, type, block, pos)); } + @Nullable public static CapabilityDispatcher gatherCapabilities(TileEntity tileEntity) { return gatherCapabilities(new AttachCapabilitiesEvent.TileEntity(tileEntity), null); } + @Nullable public static CapabilityDispatcher gatherCapabilities(Entity entity) { return gatherCapabilities(new AttachCapabilitiesEvent.Entity(entity), null); } + @Nullable public static CapabilityDispatcher gatherCapabilities(Item item, ItemStack stack, ICapabilityProvider parent) { return gatherCapabilities(new AttachCapabilitiesEvent.Item(item, stack), parent); } + @Nullable public static CapabilityDispatcher gatherCapabilities(World world, ICapabilityProvider parent) { return gatherCapabilities(new AttachCapabilitiesEvent.World(world), parent); } - private static CapabilityDispatcher gatherCapabilities(AttachCapabilitiesEvent event, ICapabilityProvider parent) + @Nullable + private static CapabilityDispatcher gatherCapabilities(AttachCapabilitiesEvent event, @Nullable ICapabilityProvider parent) { MinecraftForge.EVENT_BUS.post(event); return event.getCapabilities().size() > 0 || parent != null ? new CapabilityDispatcher(event.getCapabilities(), parent) : null; diff --git a/src/main/java/net/minecraftforge/event/brewing/PotionBrewEvent.java b/src/main/java/net/minecraftforge/event/brewing/PotionBrewEvent.java index f166fa8d07..4126455c33 100644 --- a/src/main/java/net/minecraftforge/event/brewing/PotionBrewEvent.java +++ b/src/main/java/net/minecraftforge/event/brewing/PotionBrewEvent.java @@ -42,7 +42,7 @@ public class PotionBrewEvent extends Event @Nonnull public ItemStack getItem(int index) { - if (index >= stacks.size()) return ItemStack.EMPTY; + if (index < 0 || index >= stacks.size()) return ItemStack.EMPTY; return stacks.get(index); } diff --git a/src/main/java/net/minecraftforge/event/enchanting/EnchantmentLevelSetEvent.java b/src/main/java/net/minecraftforge/event/enchanting/EnchantmentLevelSetEvent.java index cf9fd537cb..fce24517c7 100644 --- a/src/main/java/net/minecraftforge/event/enchanting/EnchantmentLevelSetEvent.java +++ b/src/main/java/net/minecraftforge/event/enchanting/EnchantmentLevelSetEvent.java @@ -24,6 +24,8 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.common.eventhandler.Event; +import javax.annotation.Nonnull; + /** * Fired when the enchantment level is set for each of the three potential enchantments in the enchanting table. * The {@link #level} is set to the vanilla value and can be modified by this event handler. @@ -38,11 +40,12 @@ public class EnchantmentLevelSetEvent extends Event private final BlockPos pos; private final int enchantRow; private final int power; + @Nonnull private final ItemStack itemStack; private final int originalLevel; private int level; - public EnchantmentLevelSetEvent(World world, BlockPos pos, int enchantRow, int power, ItemStack itemStack, int level) + public EnchantmentLevelSetEvent(World world, BlockPos pos, int enchantRow, int power, @Nonnull ItemStack itemStack, int level) { this.world = world; this.pos = pos; @@ -98,6 +101,7 @@ public class EnchantmentLevelSetEvent extends Event * * @return the item being enchanted */ + @Nonnull public ItemStack getItem() { return itemStack; diff --git a/src/main/java/net/minecraftforge/event/entity/living/LivingEquipmentChangeEvent.java b/src/main/java/net/minecraftforge/event/entity/living/LivingEquipmentChangeEvent.java index 1495e52ae9..244e5861e2 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/LivingEquipmentChangeEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/LivingEquipmentChangeEvent.java @@ -25,6 +25,8 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.eventhandler.Cancelable; +import javax.annotation.Nonnull; + /** * {@link LivingEquipmentChangeEvent} is fired when the Equipment of a Entity changes.
* This event is fired whenever changes in Equipment are detected in {@link EntityLivingBase#onUpdate()}.
@@ -47,7 +49,7 @@ public class LivingEquipmentChangeEvent extends LivingEvent private final ItemStack from; private final ItemStack to; - public LivingEquipmentChangeEvent(EntityLivingBase entity, EntityEquipmentSlot slot, ItemStack from, ItemStack to) + public LivingEquipmentChangeEvent(EntityLivingBase entity, EntityEquipmentSlot slot, @Nonnull ItemStack from, @Nonnull ItemStack to) { super(entity); this.slot = slot; @@ -56,6 +58,8 @@ public class LivingEquipmentChangeEvent extends LivingEvent } public EntityEquipmentSlot getSlot() { return this.slot; } + @Nonnull public ItemStack getFrom() { return this.from; } + @Nonnull public ItemStack getTo() { return this.to; } } diff --git a/src/main/java/net/minecraftforge/event/entity/player/AnvilRepairEvent.java b/src/main/java/net/minecraftforge/event/entity/player/AnvilRepairEvent.java index 960e8b3d43..e9cb3c8807 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/AnvilRepairEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/AnvilRepairEvent.java @@ -33,13 +33,15 @@ import javax.annotation.Nonnull; */ public class AnvilRepairEvent extends PlayerEvent { - + @Nonnull private final ItemStack left; // The left side of the input + @Nonnull private final ItemStack right; // The right side of the input + @Nonnull private final ItemStack output; // Set this to set the output stack private float breakChance; // Anvil's chance to break (reduced by 1 durability) when this is complete. Default is 12% (0.12f) - public AnvilRepairEvent(EntityPlayer player, @Nonnull ItemStack left, @Nonnull ItemStack right, ItemStack output) + public AnvilRepairEvent(EntityPlayer player, @Nonnull ItemStack left, @Nonnull ItemStack right, @Nonnull ItemStack output) { super(player); this.output = output; @@ -53,18 +55,21 @@ public class AnvilRepairEvent extends PlayerEvent * @return the output slot */ @Deprecated + @Nonnull public ItemStack getLeft() { return output; } /** * Deprecated in favour of {@link #getIngredientInput()}} - this is actually the first input slot of the anvil * @return the first input slot */ @Deprecated + @Nonnull public ItemStack getRight() { return left; } /** * Deprecated in favour of {@link #getItemResult()} - this is actually the second input slot of the anvil * @return the second input slot */ @Deprecated + @Nonnull public ItemStack getOutput() { return right; } /** diff --git a/src/main/java/net/minecraftforge/event/entity/player/FillBucketEvent.java b/src/main/java/net/minecraftforge/event/entity/player/FillBucketEvent.java index 482c5edea4..2ef374741d 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/FillBucketEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/FillBucketEvent.java @@ -27,6 +27,7 @@ import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; import javax.annotation.Nonnull; +import javax.annotation.Nullable; /** * This event is fired when a player attempts to use a Empty bucket, it @@ -44,11 +45,12 @@ public class FillBucketEvent extends PlayerEvent private final ItemStack current; private final World world; + @Nullable private final RayTraceResult target; private ItemStack result; - public FillBucketEvent(EntityPlayer player, @Nonnull ItemStack current, World world, RayTraceResult target) + public FillBucketEvent(EntityPlayer player, @Nonnull ItemStack current, World world, @Nullable RayTraceResult target) { super(player); this.current = current; @@ -59,6 +61,7 @@ public class FillBucketEvent extends PlayerEvent @Nonnull public ItemStack getEmptyBucket() { return this.current; } public World getWorld(){ return this.world; } + @Nullable public RayTraceResult getTarget() { return this.target; } @Nonnull public ItemStack getFilledBucket() { return this.result; } diff --git a/src/main/java/net/minecraftforge/event/entity/player/PlayerInteractEvent.java b/src/main/java/net/minecraftforge/event/entity/player/PlayerInteractEvent.java index 6d280896a6..4192786d40 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/PlayerInteractEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/PlayerInteractEvent.java @@ -47,9 +47,10 @@ public class PlayerInteractEvent extends PlayerEvent { private final EnumHand hand; private final BlockPos pos; + @Nullable private final EnumFacing face; - private PlayerInteractEvent(EntityPlayer player, EnumHand hand, BlockPos pos, EnumFacing face) + private PlayerInteractEvent(EntityPlayer player, EnumHand hand, BlockPos pos, @Nullable EnumFacing face) { super(Preconditions.checkNotNull(player, "Null player in PlayerInteractEvent!")); this.hand = Preconditions.checkNotNull(hand, "Null hand in PlayerInteractEvent!"); diff --git a/src/main/java/net/minecraftforge/event/world/BlockEvent.java b/src/main/java/net/minecraftforge/event/world/BlockEvent.java index 0aa101cab3..b0de106e97 100644 --- a/src/main/java/net/minecraftforge/event/world/BlockEvent.java +++ b/src/main/java/net/minecraftforge/event/world/BlockEvent.java @@ -40,6 +40,7 @@ import net.minecraftforge.fml.common.eventhandler.Event.Result; import com.google.common.collect.ImmutableList; +import javax.annotation.Nonnull; import javax.annotation.Nullable; public class BlockEvent extends Event @@ -171,7 +172,6 @@ public class BlockEvent extends Event public static class PlaceEvent extends BlockEvent { private final EntityPlayer player; - private final ItemStack itemInHand; private final BlockSnapshot blockSnapshot; private final IBlockState placedBlock; private final IBlockState placedAgainst; @@ -180,30 +180,29 @@ public class BlockEvent extends Event @Deprecated public PlaceEvent(BlockSnapshot blockSnapshot, IBlockState placedAgainst, EntityPlayer player) { - this(blockSnapshot, placedAgainst, player, null); + this(blockSnapshot, placedAgainst, player, EnumHand.MAIN_HAND); } - public PlaceEvent(BlockSnapshot blockSnapshot, IBlockState placedAgainst, EntityPlayer player, @Nullable EnumHand hand) { + public PlaceEvent(@Nonnull BlockSnapshot blockSnapshot, @Nonnull IBlockState placedAgainst, @Nonnull EntityPlayer player, @Nonnull EnumHand hand) { super(blockSnapshot.getWorld(), blockSnapshot.getPos(), blockSnapshot.getCurrentBlock()); this.player = player; - this.itemInHand = player.getHeldItem(hand != null ? hand : EnumHand.MAIN_HAND); this.blockSnapshot = blockSnapshot; this.placedBlock = blockSnapshot.getCurrentBlock(); this.placedAgainst = placedAgainst; this.hand = hand; if (DEBUG) { - System.out.printf("Created PlaceEvent - [PlacedBlock: %s ][PlacedAgainst: %s ][ItemStack: %s ][Player: %s ][Hand: %s]\n", getPlacedBlock(), placedAgainst, getItemInHand(), player, hand); + System.out.printf("Created PlaceEvent - [PlacedBlock: %s ][PlacedAgainst: %s ][ItemStack: %s ][Player: %s ][Hand: %s]\n", getPlacedBlock(), placedAgainst, player.getHeldItem(hand), player, hand); } } public EntityPlayer getPlayer() { return player; } - @Nullable - public ItemStack getItemInHand() { return itemInHand; } + @Nonnull + @Deprecated + public ItemStack getItemInHand() { return player.getHeldItem(hand); } public BlockSnapshot getBlockSnapshot() { return blockSnapshot; } public IBlockState getPlacedBlock() { return placedBlock; } public IBlockState getPlacedAgainst() { return placedAgainst; } - @Nullable public EnumHand getHand() { return hand; } } @@ -222,15 +221,15 @@ public class BlockEvent extends Event @Deprecated public MultiPlaceEvent(List blockSnapshots, IBlockState placedAgainst, EntityPlayer player) { - this(blockSnapshots, placedAgainst, player, null); + this(blockSnapshots, placedAgainst, player, EnumHand.MAIN_HAND); } - public MultiPlaceEvent(List blockSnapshots, IBlockState placedAgainst, EntityPlayer player, @Nullable EnumHand hand) { + public MultiPlaceEvent(@Nonnull List blockSnapshots, @Nonnull IBlockState placedAgainst, @Nonnull EntityPlayer player, @Nonnull EnumHand hand) { super(blockSnapshots.get(0), placedAgainst, player, hand); this.blockSnapshots = ImmutableList.copyOf(blockSnapshots); if (DEBUG) { - System.out.printf("Created MultiPlaceEvent - [PlacedAgainst: %s ][ItemInHand: %s ][Player: %s ]\n", placedAgainst, this.getItemInHand(), player); + System.out.printf("Created MultiPlaceEvent - [PlacedAgainst: %s ][ItemInHand: %s ][Player: %s ]\n", placedAgainst, player.getHeldItem(hand), player); } } diff --git a/src/main/java/net/minecraftforge/fluids/BlockFluidClassic.java b/src/main/java/net/minecraftforge/fluids/BlockFluidClassic.java index de12432d96..6dbb77f724 100644 --- a/src/main/java/net/minecraftforge/fluids/BlockFluidClassic.java +++ b/src/main/java/net/minecraftforge/fluids/BlockFluidClassic.java @@ -30,6 +30,7 @@ import net.minecraft.world.World; import net.minecraftforge.event.ForgeEventFactory; import javax.annotation.Nonnull; +import javax.annotation.Nullable; /** * This is a fluid block implementation which emulates vanilla Minecraft fluid behavior. @@ -373,6 +374,7 @@ public class BlockFluidClassic extends BlockFluidBase } @Override + @Nullable public FluidStack drain(World world, BlockPos pos, boolean doDrain) { if (!isSourceBlock(world, pos)) diff --git a/src/main/java/net/minecraftforge/fluids/FluidRegistry.java b/src/main/java/net/minecraftforge/fluids/FluidRegistry.java index 9ed0759748..f7f522b9fe 100644 --- a/src/main/java/net/minecraftforge/fluids/FluidRegistry.java +++ b/src/main/java/net/minecraftforge/fluids/FluidRegistry.java @@ -49,6 +49,8 @@ import net.minecraftforge.fml.common.ModContainer; import net.minecraftforge.fml.common.eventhandler.Event; import net.minecraftforge.fml.common.registry.RegistryDelegate; +import javax.annotation.Nullable; + /** * Handles Fluid registrations. Fluids MUST be registered in order to function. */ @@ -219,6 +221,7 @@ public abstract class FluidRegistry return getFluidName(stack.getFluid()); } + @Nullable public static FluidStack getFluidStack(String fluidName, int amount) { if (!fluids.containsKey(fluidName)) @@ -255,7 +258,9 @@ public abstract class FluidRegistry { if (Loader.instance().hasReachedState(LoaderState.PREINITIALIZATION)) { - FMLLog.getLogger().log(Level.ERROR, "Trying to activate the universal filled bucket too late. Call it statically in your Mods class. Mod: {}", Loader.instance().activeModContainer().getName()); + ModContainer modContainer = Loader.instance().activeModContainer(); + String modContainerName = modContainer == null ? null : modContainer.getName(); + FMLLog.getLogger().log(Level.ERROR, "Trying to activate the universal filled bucket too late. Call it statically in your Mods class. Mod: {}", modContainerName); } else { diff --git a/src/main/java/net/minecraftforge/fluids/FluidStack.java b/src/main/java/net/minecraftforge/fluids/FluidStack.java index 9ea847d224..051b4cc726 100644 --- a/src/main/java/net/minecraftforge/fluids/FluidStack.java +++ b/src/main/java/net/minecraftforge/fluids/FluidStack.java @@ -22,9 +22,12 @@ package net.minecraftforge.fluids; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.Constants; import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.registry.RegistryDelegate; +import javax.annotation.Nullable; + /** * ItemStack substitute for Fluids. * @@ -74,15 +77,20 @@ public class FluidStack * This provides a safe method for retrieving a FluidStack - if the Fluid is invalid, the stack * will return as null. */ + @Nullable public static FluidStack loadFluidStackFromNBT(NBTTagCompound nbt) { if (nbt == null) { return null; } - String fluidName = nbt.getString("FluidName"); + if (!nbt.hasKey("FluidName", Constants.NBT.TAG_STRING)) + { + return null; + } - if (fluidName == null || FluidRegistry.getFluid(fluidName) == null) + String fluidName = nbt.getString("FluidName"); + if (FluidRegistry.getFluid(fluidName) == null) { return null; } @@ -137,7 +145,7 @@ public class FluidStack * The FluidStack for comparison * @return true if the Fluids (IDs and NBT Tags) are the same */ - public boolean isFluidEqual(FluidStack other) + public boolean isFluidEqual(@Nullable FluidStack other) { return other != null && getFluid() == other.getFluid() && isFluidStackTagEqual(other); } @@ -150,7 +158,7 @@ public class FluidStack /** * Determines if the NBT Tags are equal. Useful if the FluidIDs are known to be equal. */ - public static boolean areFluidStackTagsEqual(FluidStack stack1, FluidStack stack2) + public static boolean areFluidStackTagsEqual(@Nullable FluidStack stack1, @Nullable FluidStack stack2) { return stack1 == null && stack2 == null ? true : stack1 == null || stack2 == null ? false : stack1.isFluidStackTagEqual(stack2); } @@ -161,7 +169,7 @@ public class FluidStack * @param other * @return true if this FluidStack contains the other FluidStack (same fluid and >= amount) */ - public boolean containsFluid(FluidStack other) + public boolean containsFluid(@Nullable FluidStack other) { return isFluidEqual(other) && amount >= other.amount; } diff --git a/src/main/java/net/minecraftforge/fluids/FluidTank.java b/src/main/java/net/minecraftforge/fluids/FluidTank.java index 9f506f64e1..976b2dff03 100644 --- a/src/main/java/net/minecraftforge/fluids/FluidTank.java +++ b/src/main/java/net/minecraftforge/fluids/FluidTank.java @@ -237,6 +237,7 @@ public class FluidTank implements IFluidTank, IFluidHandler * Use this method to bypass the restrictions from {@link #canDrainFluidType(FluidStack)} * Meant for use by the owner of the tank when they have {@link #canDrain()} set to false}. */ + @Nullable public FluidStack drainInternal(FluidStack resource, boolean doDrain) { if (resource == null || !resource.isFluidEqual(getFluid())) @@ -250,6 +251,7 @@ public class FluidTank implements IFluidTank, IFluidHandler * Use this method to bypass the restrictions from {@link #canDrainFluidType(FluidStack)} * Meant for use by the owner of the tank when they have {@link #canDrain()} set to false}. */ + @Nullable public FluidStack drainInternal(int maxDrain, boolean doDrain) { if (fluid == null || maxDrain <= 0) @@ -343,9 +345,9 @@ public class FluidTank implements IFluidTank, IFluidHandler * * @see IFluidTankProperties#canDrainFluidType(FluidStack) */ - public boolean canDrainFluidType(FluidStack fluid) + public boolean canDrainFluidType(@Nullable FluidStack fluid) { - return canDrain(); + return fluid != null && canDrain(); } protected void onContentsChanged() diff --git a/src/main/java/net/minecraftforge/fluids/IFluidBlock.java b/src/main/java/net/minecraftforge/fluids/IFluidBlock.java index ae200f429c..0e80860646 100644 --- a/src/main/java/net/minecraftforge/fluids/IFluidBlock.java +++ b/src/main/java/net/minecraftforge/fluids/IFluidBlock.java @@ -23,6 +23,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import javax.annotation.Nonnull; +import javax.annotation.Nullable; /** * Implement this interface on Block classes which represent world-placeable Fluids. @@ -60,6 +61,7 @@ public interface IFluidBlock * If false, the drain will only be simulated. * @return */ + @Nullable FluidStack drain(World world, BlockPos pos, boolean doDrain); /** diff --git a/src/main/java/net/minecraftforge/fluids/UniversalBucket.java b/src/main/java/net/minecraftforge/fluids/UniversalBucket.java index 0e29e0766c..8ec2905af2 100644 --- a/src/main/java/net/minecraftforge/fluids/UniversalBucket.java +++ b/src/main/java/net/minecraftforge/fluids/UniversalBucket.java @@ -48,6 +48,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.items.ItemHandlerHelper; import javax.annotation.Nonnull; +import javax.annotation.Nullable; /** * A universal bucket that can hold any liquid @@ -103,7 +104,7 @@ public class UniversalBucket extends Item @SideOnly(Side.CLIENT) @Override - public void getSubItems(@Nonnull Item itemIn, @Nonnull CreativeTabs tab, @Nonnull NonNullList subItems) + public void getSubItems(@Nonnull Item itemIn, @Nullable CreativeTabs tab, @Nonnull NonNullList subItems) { for (Fluid fluid : FluidRegistry.getRegisteredFluids().values()) { @@ -276,6 +277,7 @@ public class UniversalBucket extends Item return bucket; } + @Nullable public FluidStack getFluid(@Nonnull ItemStack container) { return FluidStack.loadFluidStackFromNBT(container.getTagCompound()); diff --git a/src/main/java/net/minecraftforge/fluids/capability/wrappers/FluidBucketWrapper.java b/src/main/java/net/minecraftforge/fluids/capability/wrappers/FluidBucketWrapper.java index e8f394a28d..035e8ebbf5 100644 --- a/src/main/java/net/minecraftforge/fluids/capability/wrappers/FluidBucketWrapper.java +++ b/src/main/java/net/minecraftforge/fluids/capability/wrappers/FluidBucketWrapper.java @@ -96,7 +96,7 @@ public class FluidBucketWrapper implements IFluidHandlerItem, ICapabilityProvide } } - protected void setFluid(Fluid fluid) { + protected void setFluid(@Nullable Fluid fluid) { if (fluid == null) { container = new ItemStack(Items.BUCKET); diff --git a/src/main/java/net/minecraftforge/fml/client/FMLClientHandler.java b/src/main/java/net/minecraftforge/fml/client/FMLClientHandler.java index fda26ded99..0c217da3d8 100644 --- a/src/main/java/net/minecraftforge/fml/client/FMLClientHandler.java +++ b/src/main/java/net/minecraftforge/fml/client/FMLClientHandler.java @@ -135,6 +135,8 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import javax.annotation.Nullable; + /** * Handles primary communication from hooked code into the system @@ -512,7 +514,7 @@ public class FMLClientHandler implements IFMLSidedHandler } @Override - public void showGuiScreen(Object clientGuiElement) + public void showGuiScreen(@Nullable Object clientGuiElement) { GuiScreen gui = (GuiScreen) clientGuiElement; client.displayGuiScreen(gui); @@ -813,6 +815,7 @@ public class FMLClientHandler implements IFMLSidedHandler private static final ResourceLocation iconSheet = new ResourceLocation("fml:textures/gui/icons.png"); private static final CountDownLatch startupConnectionData = new CountDownLatch(1); + @Nullable public String enhanceServerListEntry(ServerListEntryNormal serverListEntry, ServerData serverEntry, int x, int width, int y, int relativeMouseX, int relativeMouseY) { String tooltip; diff --git a/src/main/java/net/minecraftforge/fml/client/GuiModList.java b/src/main/java/net/minecraftforge/fml/client/GuiModList.java index 2525d6a80c..9cc7da0e11 100644 --- a/src/main/java/net/minecraftforge/fml/client/GuiModList.java +++ b/src/main/java/net/minecraftforge/fml/client/GuiModList.java @@ -29,6 +29,7 @@ import java.util.Comparator; import java.util.List; import java.util.Map.Entry; +import javax.annotation.Nullable; import javax.imageio.ImageIO; import net.minecraft.client.Minecraft; @@ -84,6 +85,7 @@ public class GuiModList extends GuiScreen this.buttonID = buttonID; } + @Nullable public static SortType getTypeForButton(GuiButton button) { for (SortType t : values()) @@ -468,11 +470,12 @@ public class GuiModList extends GuiScreen private class Info extends GuiScrollingList { + @Nullable private ResourceLocation logoPath; private Dimension logoDims; private List lines = null; - public Info(int width, List lines, ResourceLocation logoPath, Dimension logoDims) + public Info(int width, List lines, @Nullable ResourceLocation logoPath, Dimension logoDims) { super(GuiModList.this.getMinecraftInstance(), width, diff --git a/src/main/java/net/minecraftforge/fml/client/IModGuiFactory.java b/src/main/java/net/minecraftforge/fml/client/IModGuiFactory.java index 6184e737bc..340aa9c083 100644 --- a/src/main/java/net/minecraftforge/fml/client/IModGuiFactory.java +++ b/src/main/java/net/minecraftforge/fml/client/IModGuiFactory.java @@ -25,6 +25,8 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.GuiScreen; +import javax.annotation.Nullable; + public interface IModGuiFactory { /** * Called when instantiated to initialize with the active minecraft instance. @@ -85,6 +87,7 @@ public interface IModGuiFactory { * @param element The element we wish to paint for * @return The Handler for painting it */ + @Nullable public RuntimeOptionGuiHandler getHandlerFor(RuntimeOptionCategoryElement element); /** diff --git a/src/main/java/net/minecraftforge/fml/client/SplashProgress.java b/src/main/java/net/minecraftforge/fml/client/SplashProgress.java index 8dad28a1d0..04e08fbf65 100644 --- a/src/main/java/net/minecraftforge/fml/client/SplashProgress.java +++ b/src/main/java/net/minecraftforge/fml/client/SplashProgress.java @@ -38,6 +38,8 @@ import java.util.concurrent.Semaphore; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import javax.imageio.ImageIO; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; @@ -731,12 +733,12 @@ public class SplashProgress private final int frames; private final int size; - public Texture(ResourceLocation location, ResourceLocation fallback) + public Texture(ResourceLocation location, @Nullable ResourceLocation fallback) { this(location, fallback, true); } - public Texture(ResourceLocation location, ResourceLocation fallback, boolean allowRP) + public Texture(ResourceLocation location, @Nullable ResourceLocation fallback, boolean allowRP) { InputStream s = null; try @@ -881,14 +883,15 @@ public class SplashProgress } @Override - protected void bindTexture(ResourceLocation location) + protected void bindTexture(@Nonnull ResourceLocation location) { if(location != locationFontTexture) throw new IllegalArgumentException(); fontTexture.bind(); } + @Nonnull @Override - protected IResource getResource(ResourceLocation location) throws IOException + protected IResource getResource(@Nonnull ResourceLocation location) throws IOException { DefaultResourcePack pack = Minecraft.getMinecraft().mcDefaultResourcePack; return new SimpleResource(pack.getPackName(), location, pack.getInputStream(location), null, null); @@ -920,7 +923,7 @@ public class SplashProgress } } - private static InputStream open(ResourceLocation loc, ResourceLocation fallback, boolean allowRP) throws IOException + private static InputStream open(ResourceLocation loc, @Nullable ResourceLocation fallback, boolean allowRP) throws IOException { if (!allowRP) return mcPack.getInputStream(loc); diff --git a/src/main/java/net/minecraftforge/fml/client/config/DummyConfigElement.java b/src/main/java/net/minecraftforge/fml/client/config/DummyConfigElement.java index f656591bfe..cf2c75c7a8 100644 --- a/src/main/java/net/minecraftforge/fml/client/config/DummyConfigElement.java +++ b/src/main/java/net/minecraftforge/fml/client/config/DummyConfigElement.java @@ -28,6 +28,8 @@ import net.minecraft.client.resources.I18n; import net.minecraftforge.fml.client.config.GuiConfigEntries.IConfigEntry; import net.minecraftforge.fml.client.config.GuiEditArrayEntries.IArrayEntry; +import javax.annotation.Nullable; + /** * This class's main purpose is to provide the necessary objects for a sample Config GUI for FML, although @@ -56,6 +58,7 @@ public class DummyConfigElement implements IConfigElement protected boolean isListFixedLength = false; protected int maxListLength = -1; protected List childElements; + @Nullable protected Class configEntryClass; protected Class arrayEntryClass; @@ -75,7 +78,7 @@ public class DummyConfigElement implements IConfigElement this(name, langKey, new ArrayList(), customListEntryClass); } - public DummyCategoryElement(String name, String langKey, List childElements, Class customListEntryClass) + public DummyCategoryElement(String name, String langKey, List childElements, @Nullable Class customListEntryClass) { super(name, null, ConfigGuiType.CONFIG_CATEGORY, langKey); this.childElements = childElements; @@ -89,7 +92,7 @@ public class DummyConfigElement implements IConfigElement */ public static class DummyListElement extends DummyConfigElement { - public DummyListElement(String name, Object[] defaultValues, ConfigGuiType type, String langKey, boolean isListFixedLength, int maxListLength, Pattern validStringPattern, Object minValue, Object maxValue) + public DummyListElement(String name, Object[] defaultValues, ConfigGuiType type, String langKey, boolean isListFixedLength, int maxListLength, @Nullable Pattern validStringPattern, @Nullable Object minValue, @Nullable Object maxValue) { super(name, null, type, langKey, minValue, maxValue); this.defaultValues = defaultValues; diff --git a/src/main/java/net/minecraftforge/fml/client/config/GuiConfig.java b/src/main/java/net/minecraftforge/fml/client/config/GuiConfig.java index c6cb184736..d558474a9f 100644 --- a/src/main/java/net/minecraftforge/fml/client/config/GuiConfig.java +++ b/src/main/java/net/minecraftforge/fml/client/config/GuiConfig.java @@ -42,6 +42,8 @@ import net.minecraftforge.fml.common.eventhandler.Event.Result; import org.lwjgl.input.Keyboard; +import javax.annotation.Nullable; + /** * This class is the base GuiScreen for all config GUI screens. It can be extended by mods to provide the top-level config screen * that will be called when the Config button is clicked from the Main Menu Mods list. @@ -55,6 +57,7 @@ public class GuiConfig extends GuiScreen */ public final GuiScreen parentScreen; public String title = "Config GUI"; + @Nullable public String titleLine2; public final List configElements; public final List initEntries; @@ -68,6 +71,7 @@ public class GuiConfig extends GuiScreen * if any configElements were changed (includes child screens). If not defined, the events will be posted if the parent gui is null * or if the parent gui is not an instance of GuiConfig. */ + @Nullable public final String configID; public final boolean isWorldRunning; public final boolean allRequireWorldRestart; @@ -154,8 +158,8 @@ public class GuiConfig extends GuiScreen * @param titleLine2 the desired title second line for this screen. Typically this is used to send the category name of the category * currently being edited. */ - public GuiConfig(GuiScreen parentScreen, List configElements, String modID, String configID, - boolean allRequireWorldRestart, boolean allRequireMcRestart, String title, String titleLine2) + public GuiConfig(GuiScreen parentScreen, List configElements, String modID, @Nullable String configID, + boolean allRequireWorldRestart, boolean allRequireMcRestart, String title, @Nullable String titleLine2) { this.mc = Minecraft.getMinecraft(); this.parentScreen = parentScreen; diff --git a/src/main/java/net/minecraftforge/fml/client/config/GuiMessageDialog.java b/src/main/java/net/minecraftforge/fml/client/config/GuiMessageDialog.java index fbf9ca4899..97f3f54cb0 100644 --- a/src/main/java/net/minecraftforge/fml/client/config/GuiMessageDialog.java +++ b/src/main/java/net/minecraftforge/fml/client/config/GuiMessageDialog.java @@ -20,16 +20,17 @@ package net.minecraftforge.fml.client.config; import net.minecraft.client.gui.GuiDisconnected; -import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.resources.I18n; import net.minecraft.util.text.ITextComponent; +import javax.annotation.Nullable; + public class GuiMessageDialog extends GuiDisconnected { protected String buttonText; - public GuiMessageDialog(GuiScreen nextScreen, String title, ITextComponent message, String buttonText) + public GuiMessageDialog(@Nullable GuiScreen nextScreen, String title, ITextComponent message, String buttonText) { super(nextScreen, title, message); this.buttonText = buttonText; diff --git a/src/main/java/net/minecraftforge/fml/client/config/GuiSlider.java b/src/main/java/net/minecraftforge/fml/client/config/GuiSlider.java index 7802adeecc..867dd8ba04 100644 --- a/src/main/java/net/minecraftforge/fml/client/config/GuiSlider.java +++ b/src/main/java/net/minecraftforge/fml/client/config/GuiSlider.java @@ -22,6 +22,8 @@ package net.minecraftforge.fml.client.config; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GlStateManager; +import javax.annotation.Nullable; + /** * This class is blatantly stolen from iChunUtils with permission. * @@ -42,6 +44,7 @@ public class GuiSlider extends GuiButtonExt public double maxValue = 5.0D; public int precision = 1; + @Nullable public ISlider parent = null; public String suffix = ""; @@ -53,7 +56,7 @@ public class GuiSlider extends GuiButtonExt this(id, xPos, yPos, width, height, prefix, suf, minVal, maxVal, currentVal, showDec, drawStr, null); } - public GuiSlider(int id, int xPos, int yPos, int width, int height, String prefix, String suf, double minVal, double maxVal, double currentVal, boolean showDec, boolean drawStr, ISlider par) + public GuiSlider(int id, int xPos, int yPos, int width, int height, String prefix, String suf, double minVal, double maxVal, double currentVal, boolean showDec, boolean drawStr, @Nullable ISlider par) { super(id, xPos, yPos, width, height, prefix); minValue = minVal; diff --git a/src/main/java/net/minecraftforge/fml/client/config/GuiUtils.java b/src/main/java/net/minecraftforge/fml/client/config/GuiUtils.java index 3d1700eda2..fdb6b89c8f 100644 --- a/src/main/java/net/minecraftforge/fml/client/config/GuiUtils.java +++ b/src/main/java/net/minecraftforge/fml/client/config/GuiUtils.java @@ -36,7 +36,7 @@ import org.lwjgl.opengl.GL11; import java.util.ArrayList; import java.util.List; -import javax.annotation.Nullable; +import javax.annotation.Nonnull; /** * This class provides several methods and constants used by the Config GUI classes. @@ -210,14 +210,15 @@ public class GuiUtils tessellator.draw(); } - private static ItemStack cachedTooltipStack; + @Nonnull + private static ItemStack cachedTooltipStack = ItemStack.EMPTY; /** * Must be called from {@code GuiScreen.renderToolTip} before {@code GuiScreen.drawHoveringText} is called. * * @param stack The stack for which a tooltip is about to be drawn. */ - public static void preItemToolTip(ItemStack stack) + public static void preItemToolTip(@Nonnull ItemStack stack) { cachedTooltipStack = stack; } @@ -227,7 +228,7 @@ public class GuiUtils */ public static void postItemToolTip() { - cachedTooltipStack = null; + cachedTooltipStack = ItemStack.EMPTY; } /** @@ -255,8 +256,7 @@ public class GuiUtils * * @see #drawHoveringText(List, int, int, int, int, int, FontRenderer) */ - public static void drawHoveringText(@Nullable final ItemStack stack, List textLines, int mouseX, int mouseY, int screenWidth, int screenHeight, - int maxTextWidth, FontRenderer font) + public static void drawHoveringText(@Nonnull final ItemStack stack, List textLines, int mouseX, int mouseY, int screenWidth, int screenHeight, int maxTextWidth, FontRenderer font) { if (!textLines.isEmpty()) { diff --git a/src/main/java/net/minecraftforge/fml/client/event/ConfigChangedEvent.java b/src/main/java/net/minecraftforge/fml/client/event/ConfigChangedEvent.java index cd03cc717c..53139136a0 100644 --- a/src/main/java/net/minecraftforge/fml/client/event/ConfigChangedEvent.java +++ b/src/main/java/net/minecraftforge/fml/client/event/ConfigChangedEvent.java @@ -22,6 +22,8 @@ package net.minecraftforge.fml.client.event; import net.minecraftforge.fml.common.eventhandler.Event; import net.minecraftforge.fml.common.eventhandler.Event.HasResult; +import javax.annotation.Nullable; + /** * These events are posted from the GuiConfig screen when the done button is pressed. The events are only posted * if the parent screen is not an instance of GuiConfig or if the configID field has been set for @@ -39,9 +41,10 @@ public class ConfigChangedEvent extends Event private final String modID; private final boolean isWorldRunning; private final boolean requiresMcRestart; + @Nullable private final String configID; - public ConfigChangedEvent(String modID, String configID, boolean isWorldRunning, boolean requiresMcRestart) + public ConfigChangedEvent(String modID, @Nullable String configID, boolean isWorldRunning, boolean requiresMcRestart) { this.modID = modID; this.configID = configID; @@ -76,6 +79,7 @@ public class ConfigChangedEvent extends Event /** * A String identifier for this ConfigChangedEvent. */ + @Nullable public String getConfigID() { return configID; @@ -92,7 +96,7 @@ public class ConfigChangedEvent extends Event */ public static class OnConfigChangedEvent extends ConfigChangedEvent { - public OnConfigChangedEvent(String modID, String configID, boolean isWorldRunning, boolean requiresMcRestart) + public OnConfigChangedEvent(String modID, @Nullable String configID, boolean isWorldRunning, boolean requiresMcRestart) { super(modID, configID, isWorldRunning, requiresMcRestart); } @@ -104,7 +108,7 @@ public class ConfigChangedEvent extends Event */ public static class PostConfigChangedEvent extends ConfigChangedEvent { - public PostConfigChangedEvent(String modID, String configID, boolean isWorldRunning, boolean requiresMcRestart) + public PostConfigChangedEvent(String modID, @Nullable String configID, boolean isWorldRunning, boolean requiresMcRestart) { super(modID, configID, isWorldRunning, requiresMcRestart); } diff --git a/src/main/java/net/minecraftforge/fml/common/CertificateHelper.java b/src/main/java/net/minecraftforge/fml/common/CertificateHelper.java index 27621843b6..28854b3ed5 100644 --- a/src/main/java/net/minecraftforge/fml/common/CertificateHelper.java +++ b/src/main/java/net/minecraftforge/fml/common/CertificateHelper.java @@ -43,7 +43,7 @@ public class CertificateHelper { } catch (Exception e) { - return null; + return "CERTIFICATE FINGERPRINT EXCEPTION"; } } @@ -58,7 +58,7 @@ public class CertificateHelper { } catch (Exception e) { - return null; + return "CERTIFICATE FINGERPRINT EXCEPTION"; } } diff --git a/src/main/java/net/minecraftforge/fml/common/DummyModContainer.java b/src/main/java/net/minecraftforge/fml/common/DummyModContainer.java index f4f0d0bf14..ead7c81477 100644 --- a/src/main/java/net/minecraftforge/fml/common/DummyModContainer.java +++ b/src/main/java/net/minecraftforge/fml/common/DummyModContainer.java @@ -34,6 +34,8 @@ import net.minecraftforge.fml.common.versioning.VersionRange; import com.google.common.collect.ImmutableList; import com.google.common.eventbus.EventBus; +import javax.annotation.Nullable; + public class DummyModContainer implements ModContainer { private ModMetadata md; @@ -164,6 +166,7 @@ public class DummyModContainer implements ModContainer } @Override + @Nullable public Certificate getSigningCertificate() { return null; diff --git a/src/main/java/net/minecraftforge/fml/common/FMLCommonHandler.java b/src/main/java/net/minecraftforge/fml/common/FMLCommonHandler.java index 435f8ee3d5..fb5fc44fb5 100644 --- a/src/main/java/net/minecraftforge/fml/common/FMLCommonHandler.java +++ b/src/main/java/net/minecraftforge/fml/common/FMLCommonHandler.java @@ -81,6 +81,8 @@ import com.google.common.collect.MapMaker; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import javax.annotation.Nullable; + /** * The main class for non-obfuscated hook handling code @@ -709,6 +711,7 @@ public class FMLCommonHandler * @param inputstream Input stream containing the lang file. * @return A new InputStream that vanilla uses to load normal Lang files, Null if this is a 'enhanced' file and loading is done. */ + @Nullable public InputStream loadLanguage(Map table, InputStream inputstream) throws IOException { byte[] data = IOUtils.toByteArray(inputstream); diff --git a/src/main/java/net/minecraftforge/fml/common/FMLContainer.java b/src/main/java/net/minecraftforge/fml/common/FMLContainer.java index 4974e182e5..75c128d1fe 100644 --- a/src/main/java/net/minecraftforge/fml/common/FMLContainer.java +++ b/src/main/java/net/minecraftforge/fml/common/FMLContainer.java @@ -52,6 +52,8 @@ import org.apache.logging.log4j.Level; import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; +import javax.annotation.Nullable; + /** * @author cpw * @@ -343,6 +345,7 @@ public final class FMLContainer extends DummyModContainer implements WorldAccess @Override + @Nullable public Certificate getSigningCertificate() { Certificate[] certificates = getClass().getProtectionDomain().getCodeSource().getCertificates(); diff --git a/src/main/java/net/minecraftforge/fml/common/FMLModContainer.java b/src/main/java/net/minecraftforge/fml/common/FMLModContainer.java index b3abfc63f1..6b31a3cc1b 100644 --- a/src/main/java/net/minecraftforge/fml/common/FMLModContainer.java +++ b/src/main/java/net/minecraftforge/fml/common/FMLModContainer.java @@ -77,6 +77,8 @@ import com.google.common.collect.Sets; import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; +import javax.annotation.Nullable; + public class FMLModContainer implements ModContainer { private Object modInstance; @@ -280,6 +282,7 @@ public class FMLModContainer implements ModContainer } } + @Nullable public Properties searchForVersionProperties() { try @@ -391,6 +394,7 @@ public class FMLModContainer implements ModContainer } } + @Nullable @SuppressWarnings("unchecked") private Method gatherAnnotations(Class clazz) throws Exception { diff --git a/src/main/java/net/minecraftforge/fml/common/InjectedModContainer.java b/src/main/java/net/minecraftforge/fml/common/InjectedModContainer.java index 77dd04c332..b9a9ec6f53 100644 --- a/src/main/java/net/minecraftforge/fml/common/InjectedModContainer.java +++ b/src/main/java/net/minecraftforge/fml/common/InjectedModContainer.java @@ -31,6 +31,8 @@ import net.minecraftforge.fml.common.versioning.VersionRange; import com.google.common.eventbus.EventBus; +import javax.annotation.Nullable; + public class InjectedModContainer implements ModContainer { private File source; @@ -150,6 +152,7 @@ public class InjectedModContainer implements ModContainer return wrappedContainer.acceptableMinecraftVersionRange(); } + @Nullable public WorldAccessContainer getWrappedWorldAccessContainer() { if (wrappedContainer instanceof WorldAccessContainer) @@ -163,6 +166,7 @@ public class InjectedModContainer implements ModContainer } @Override + @Nullable public Certificate getSigningCertificate() { return wrappedContainer.getSigningCertificate(); diff --git a/src/main/java/net/minecraftforge/fml/common/LoadController.java b/src/main/java/net/minecraftforge/fml/common/LoadController.java index d5859bf52c..784778b75a 100644 --- a/src/main/java/net/minecraftforge/fml/common/LoadController.java +++ b/src/main/java/net/minecraftforge/fml/common/LoadController.java @@ -55,6 +55,8 @@ import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.SubscriberExceptionHandler; import com.google.common.eventbus.SubscriberExceptionContext; +import javax.annotation.Nullable; + public class LoadController { private Loader loader; @@ -198,12 +200,13 @@ public class LoadController } + @Nullable public ModContainer activeContainer() { return activeContainer != null ? activeContainer : findActiveContainerFromStack(); } - void forceActiveContainer(ModContainer container) + void forceActiveContainer(@Nullable ModContainer container) { activeContainer = container; } @@ -237,7 +240,7 @@ public class LoadController } } activeContainer = mc; - stateEvent.applyModContainer(activeContainer()); + stateEvent.applyModContainer(mc); ThreadContext.put("mod", modId); FMLLog.log(modId, Level.TRACE, "Sending event %s to mod %s", stateEvent.getEventType(), modId); eventChannels.get(modId).post(stateEvent); @@ -358,6 +361,7 @@ public class LoadController this.state = newState; } + @Nullable private ModContainer findActiveContainerFromStack() { for (Class c : getCallingStack()) diff --git a/src/main/java/net/minecraftforge/fml/common/Loader.java b/src/main/java/net/minecraftforge/fml/common/Loader.java index 32fbff04f5..aa52670bfa 100644 --- a/src/main/java/net/minecraftforge/fml/common/Loader.java +++ b/src/main/java/net/minecraftforge/fml/common/Loader.java @@ -90,6 +90,8 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import javax.annotation.Nullable; + /** * The loader class performs the actual loading of the mod code from disk. * @@ -887,6 +889,7 @@ public class Loader return getModObjectList().inverse(); } + @Nullable public ModContainer activeModContainer() { return modController != null ? modController.activeContainer() : null; @@ -1162,7 +1165,7 @@ public class Loader return modController != null ? modController.getState() : LoaderState.NOINIT; } - public void setActiveModContainer(ModContainer container) + public void setActiveModContainer(@Nullable ModContainer container) { this.modController.forceActiveContainer(container); } diff --git a/src/main/java/net/minecraftforge/fml/common/MetadataCollection.java b/src/main/java/net/minecraftforge/fml/common/MetadataCollection.java index 8b557a41b0..dc9466ed75 100644 --- a/src/main/java/net/minecraftforge/fml/common/MetadataCollection.java +++ b/src/main/java/net/minecraftforge/fml/common/MetadataCollection.java @@ -41,13 +41,15 @@ import com.google.gson.TypeAdapter; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; +import javax.annotation.Nullable; + public class MetadataCollection { private String modListVersion; private ModMetadata[] modList; private Map metadatas = Maps.newHashMap(); - public static MetadataCollection from(InputStream inputStream, String sourceName) + public static MetadataCollection from(@Nullable InputStream inputStream, String sourceName) { if (inputStream == null) { diff --git a/src/main/java/net/minecraftforge/fml/common/MinecraftDummyContainer.java b/src/main/java/net/minecraftforge/fml/common/MinecraftDummyContainer.java index 1bd63524c3..35851494e2 100644 --- a/src/main/java/net/minecraftforge/fml/common/MinecraftDummyContainer.java +++ b/src/main/java/net/minecraftforge/fml/common/MinecraftDummyContainer.java @@ -28,6 +28,8 @@ import net.minecraftforge.fml.common.versioning.VersionRange; import net.minecraftforge.fml.relauncher.FMLLaunchHandler; import net.minecraftforge.fml.relauncher.Side; +import javax.annotation.Nullable; + public class MinecraftDummyContainer extends DummyModContainer { @@ -65,6 +67,7 @@ public class MinecraftDummyContainer extends DummyModContainer } @Override + @Nullable public Certificate getSigningCertificate() { if (FMLLaunchHandler.side() != Side.CLIENT) @@ -76,7 +79,7 @@ public class MinecraftDummyContainer extends DummyModContainer Certificate[] certificates = cbr.getProtectionDomain().getCodeSource().getCertificates(); return certificates != null ? certificates[0] : null; } - catch (Exception e){} // Errors don't matter just return null. + catch (Exception ignored){} // Errors don't matter just return null. return null; } } diff --git a/src/main/java/net/minecraftforge/fml/common/ModContainer.java b/src/main/java/net/minecraftforge/fml/common/ModContainer.java index 8296976a1c..7bbc918958 100644 --- a/src/main/java/net/minecraftforge/fml/common/ModContainer.java +++ b/src/main/java/net/minecraftforge/fml/common/ModContainer.java @@ -32,6 +32,8 @@ import net.minecraftforge.fml.common.versioning.VersionRange; import com.google.common.collect.ImmutableMap; import com.google.common.eventbus.EventBus; +import javax.annotation.Nullable; + /** * The container that wraps around mods in the system. *

@@ -141,6 +143,7 @@ public interface ModContainer VersionRange acceptableMinecraftVersionRange(); + @Nullable Certificate getSigningCertificate(); public static final Map EMPTY_PROPERTIES = ImmutableMap.of(); diff --git a/src/main/java/net/minecraftforge/fml/common/ModContainerFactory.java b/src/main/java/net/minecraftforge/fml/common/ModContainerFactory.java index 6f6faf6de5..276f3ce668 100644 --- a/src/main/java/net/minecraftforge/fml/common/ModContainerFactory.java +++ b/src/main/java/net/minecraftforge/fml/common/ModContainerFactory.java @@ -34,6 +34,8 @@ import org.objectweb.asm.Type; import com.google.common.base.Throwables; import com.google.common.collect.Maps; +import javax.annotation.Nullable; + public class ModContainerFactory { public static Map> modTypes = Maps.newHashMap(); @@ -58,6 +60,8 @@ public class ModContainerFactory Throwables.propagate(e); } } + + @Nullable public ModContainer build(ASMModParser modParser, File modSource, ModCandidate container) { String className = modParser.getASMType().getClassName(); diff --git a/src/main/java/net/minecraftforge/fml/common/StartupQuery.java b/src/main/java/net/minecraftforge/fml/common/StartupQuery.java index a17e40d266..30849332e5 100644 --- a/src/main/java/net/minecraftforge/fml/common/StartupQuery.java +++ b/src/main/java/net/minecraftforge/fml/common/StartupQuery.java @@ -24,6 +24,8 @@ import java.util.concurrent.atomic.AtomicBoolean; import net.minecraft.server.MinecraftServer; +import javax.annotation.Nullable; + public class StartupQuery { // internal class/functionality, do not use @@ -80,12 +82,13 @@ public class StartupQuery { private static volatile boolean aborted = false; - private StartupQuery(String text, AtomicBoolean result) + private StartupQuery(String text, @Nullable AtomicBoolean result) { this.text = text; this.result = result; } + @Nullable public Boolean getResult() { return result == null ? null : result.get(); @@ -159,6 +162,7 @@ public class StartupQuery { } private String text; + @Nullable private AtomicBoolean result; private CountDownLatch signal = new CountDownLatch(1); private volatile boolean synchronous; diff --git a/src/main/java/net/minecraftforge/fml/common/asm/ASMTransformerWrapper.java b/src/main/java/net/minecraftforge/fml/common/asm/ASMTransformerWrapper.java index 3cc1171413..d597c1c0d4 100644 --- a/src/main/java/net/minecraftforge/fml/common/asm/ASMTransformerWrapper.java +++ b/src/main/java/net/minecraftforge/fml/common/asm/ASMTransformerWrapper.java @@ -47,6 +47,8 @@ import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.google.common.collect.Maps; +import javax.annotation.Nullable; + public class ASMTransformerWrapper { private static final Map wrapperModMap = Maps.newHashMap(); @@ -80,6 +82,7 @@ public class ASMTransformerWrapper private static class ASMGenHandler extends URLStreamHandler { + @Nullable protected URLConnection openConnection(URL url) throws IOException { String file = url.getFile(); @@ -125,6 +128,7 @@ public class ASMTransformerWrapper } @Override + @Nullable public Permission getPermission() { return null; diff --git a/src/main/java/net/minecraftforge/fml/common/asm/transformers/deobf/FMLDeobfuscatingRemapper.java b/src/main/java/net/minecraftforge/fml/common/asm/transformers/deobf/FMLDeobfuscatingRemapper.java index cff8906886..40817d3819 100644 --- a/src/main/java/net/minecraftforge/fml/common/asm/transformers/deobf/FMLDeobfuscatingRemapper.java +++ b/src/main/java/net/minecraftforge/fml/common/asm/transformers/deobf/FMLDeobfuscatingRemapper.java @@ -54,6 +54,8 @@ import com.google.common.collect.Sets; import com.google.common.io.CharSource; import com.google.common.io.Files; +import javax.annotation.Nullable; + public class FMLDeobfuscatingRemapper extends Remapper { public static final FMLDeobfuscatingRemapper INSTANCE = new FMLDeobfuscatingRemapper(); @@ -198,12 +200,13 @@ public class FMLDeobfuscatingRemapper extends Remapper { /* * Cache the field descriptions for classes so we don't repeatedly reload the same data again and again */ - private Map> fieldDescriptions = Maps.newHashMap(); + private final Map> fieldDescriptions = Maps.newHashMap(); // Cache null values so we don't waste time trying to recompute classes with no field or method maps private Set negativeCacheMethods = Sets.newHashSet(); private Set negativeCacheFields = Sets.newHashSet(); + @Nullable private String getFieldType(String owner, String name) { if (fieldDescriptions.containsKey(owner)) @@ -283,12 +286,12 @@ public class FMLDeobfuscatingRemapper extends Remapper { } @Override - public String mapFieldName(String owner, String name, String desc) + public String mapFieldName(String owner, String name, @Nullable String desc) { return mapFieldName(owner, name, desc, false); } - String mapFieldName(String owner, String name, String desc, boolean raw) + String mapFieldName(String owner, String name, @Nullable String desc, boolean raw) { if (classNameBiMap == null || classNameBiMap.isEmpty()) { @@ -350,6 +353,7 @@ public class FMLDeobfuscatingRemapper extends Remapper { } @Override + @Nullable public String mapSignature(String signature, boolean typeSignature) { // JDT decorates some lambdas with this and SignatureReader chokes on it @@ -430,7 +434,7 @@ public class FMLDeobfuscatingRemapper extends Remapper { e.printStackTrace(); } } - public void mergeSuperMaps(String name, String superName, String[] interfaces) + public void mergeSuperMaps(String name, @Nullable String superName, String[] interfaces) { // System.out.printf("Computing super maps for %s: %s %s\n", name, superName, Arrays.asList(interfaces)); if (classNameBiMap == null || classNameBiMap.isEmpty()) @@ -483,6 +487,7 @@ public class FMLDeobfuscatingRemapper extends Remapper { return ImmutableSet.copyOf(classNameBiMap.keySet()); } + @Nullable public String getStaticFieldType(String oldType, String oldName, String newType, String newName) { String fType = getFieldType(newType, newName); diff --git a/src/main/java/net/minecraftforge/fml/common/discovery/ASMDataTable.java b/src/main/java/net/minecraftforge/fml/common/discovery/ASMDataTable.java index 37106e67ac..c027db08e9 100644 --- a/src/main/java/net/minecraftforge/fml/common/discovery/ASMDataTable.java +++ b/src/main/java/net/minecraftforge/fml/common/discovery/ASMDataTable.java @@ -35,6 +35,8 @@ import com.google.common.collect.Multimap; import com.google.common.collect.Multimaps; import com.google.common.collect.SetMultimap; +import javax.annotation.Nullable; + public class ASMDataTable { public final static class ASMData implements Cloneable @@ -45,7 +47,7 @@ public class ASMDataTable private String objectName; private int classVersion; private Map annotationInfo; - public ASMData(ModCandidate candidate, String annotationName, String className, String objectName, Map info) + public ASMData(ModCandidate candidate, String annotationName, String className, @Nullable String objectName, @Nullable Map info) { this.candidate = candidate; this.annotationName = annotationName; @@ -128,7 +130,7 @@ public class ASMDataTable return globalAnnotationData.get(annotation); } - public void addASMData(ModCandidate candidate, String annotation, String className, String objectName, Map annotationInfo) + public void addASMData(ModCandidate candidate, String annotation, String className, @Nullable String objectName, @Nullable Map annotationInfo) { globalAnnotationData.put(annotation, new ASMData(candidate, annotation, className, objectName, annotationInfo)); } @@ -148,6 +150,7 @@ public class ASMDataTable return this.packageMap.get(pkg); } + @Nullable public static String getOwnerModID(Set mods, ASMData targ) { if (mods.size() == 1) { diff --git a/src/main/java/net/minecraftforge/fml/common/discovery/DirectoryDiscoverer.java b/src/main/java/net/minecraftforge/fml/common/discovery/DirectoryDiscoverer.java index 77fde78dae..3a9a02f139 100644 --- a/src/main/java/net/minecraftforge/fml/common/discovery/DirectoryDiscoverer.java +++ b/src/main/java/net/minecraftforge/fml/common/discovery/DirectoryDiscoverer.java @@ -39,6 +39,8 @@ import org.apache.logging.log4j.Level; import com.google.common.base.Throwables; import com.google.common.collect.Lists; +import javax.annotation.Nullable; + public class DirectoryDiscoverer implements ITypeDiscoverer { private class ClassFilter implements FileFilter @@ -66,7 +68,7 @@ public class DirectoryDiscoverer implements ITypeDiscoverer return found; } - public void exploreFileSystem(String path, File modDir, List harvestedMods, ModCandidate candidate, MetadataCollection mc) + public void exploreFileSystem(String path, File modDir, List harvestedMods, ModCandidate candidate, @Nullable MetadataCollection mc) { if (path.length() == 0) { diff --git a/src/main/java/net/minecraftforge/fml/common/event/FMLInterModComms.java b/src/main/java/net/minecraftforge/fml/common/event/FMLInterModComms.java index a0110bd89b..06b64cef54 100644 --- a/src/main/java/net/minecraftforge/fml/common/event/FMLInterModComms.java +++ b/src/main/java/net/minecraftforge/fml/common/event/FMLInterModComms.java @@ -35,6 +35,8 @@ import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ImmutableList; import org.apache.logging.log4j.Level; +import javax.annotation.Nonnull; + /** * Simple intermod communications to receive simple messages directed at you * from other mods @@ -91,20 +93,22 @@ public class FMLInterModComms { /** * This field, and {@link #value} are both at the mod's discretion */ + @Nonnull public final String key; /** * This field, and {@link #key} are both at the mod's discretion */ + @Nonnull private final Object value; - private IMCMessage(String key, Object value) + private IMCMessage(@Nonnull String key, @Nonnull Object value) { this.key = key; this.value = value; this.isFunction = false; } - private IMCMessage(String key, String value, boolean isFunction) { + private IMCMessage(@Nonnull String key, @Nonnull String value, boolean isFunction) { this.key = key; this.value = value; this.isFunction = isFunction; @@ -164,6 +168,7 @@ public class FMLInterModComms { * @throws ClassCastException if this message doesn't contain an Itemstack value * @return The Itemstack value */ + @Nonnull public ItemStack getItemStackValue() { return (ItemStack) value; diff --git a/src/main/java/net/minecraftforge/fml/common/event/FMLPostInitializationEvent.java b/src/main/java/net/minecraftforge/fml/common/event/FMLPostInitializationEvent.java index ac1aae4709..226e013b2d 100644 --- a/src/main/java/net/minecraftforge/fml/common/event/FMLPostInitializationEvent.java +++ b/src/main/java/net/minecraftforge/fml/common/event/FMLPostInitializationEvent.java @@ -70,14 +70,14 @@ public class FMLPostInitializationEvent extends FMLStateEvent @Nullable @Override public Class apply(@Nullable Object input) { - return input.getClass(); + return input == null ? null : input.getClass(); } }).toArray(new Class[0]); try { Class clz = Class.forName(className,true,Loader.instance().getModClassLoader()); Constructor ct = clz.getConstructor(args); - return Optional.fromNullable(ct.newInstance(arguments)); + return Optional.of(ct.newInstance(arguments)); } catch (Exception e) { diff --git a/src/main/java/net/minecraftforge/fml/common/event/FMLPreInitializationEvent.java b/src/main/java/net/minecraftforge/fml/common/event/FMLPreInitializationEvent.java index fcfcb243db..0151be9524 100644 --- a/src/main/java/net/minecraftforge/fml/common/event/FMLPreInitializationEvent.java +++ b/src/main/java/net/minecraftforge/fml/common/event/FMLPreInitializationEvent.java @@ -33,6 +33,8 @@ import net.minecraftforge.fml.common.discovery.ASMDataTable; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import javax.annotation.Nullable; + /** * Called before {@link FMLInitializationEvent} during mod startup. * @@ -132,6 +134,7 @@ public class FMLPreInitializationEvent extends FMLStateEvent * such as a unique version number from a properties file shipped as part of the distributable. * @return A properties object if one exists, else null */ + @Nullable public Properties getVersionProperties() { if (this.modContainer instanceof FMLModContainer) diff --git a/src/main/java/net/minecraftforge/fml/common/eventhandler/Event.java b/src/main/java/net/minecraftforge/fml/common/eventhandler/Event.java index aa93910253..41fa28cd01 100644 --- a/src/main/java/net/minecraftforge/fml/common/eventhandler/Event.java +++ b/src/main/java/net/minecraftforge/fml/common/eventhandler/Event.java @@ -153,7 +153,7 @@ public class Event public void setPhase(@Nonnull EventPriority value) { - Preconditions.checkArgument(value != null, "setPhase argument must not be null"); + Preconditions.checkNotNull(value, "setPhase argument must not be null"); int prev = phase == null ? -1 : phase.ordinal(); Preconditions.checkArgument(prev < value.ordinal(), "Attempted to set event phase to %s when already %s", value, phase); phase = value; diff --git a/src/main/java/net/minecraftforge/fml/common/eventhandler/EventBus.java b/src/main/java/net/minecraftforge/fml/common/eventhandler/EventBus.java index f3c36c1244..7a843073d2 100644 --- a/src/main/java/net/minecraftforge/fml/common/eventhandler/EventBus.java +++ b/src/main/java/net/minecraftforge/fml/common/eventhandler/EventBus.java @@ -59,7 +59,7 @@ public class EventBus implements IEventExceptionHandler public EventBus(@Nonnull IEventExceptionHandler handler) { this(); - Preconditions.checkArgument(handler != null, "EventBus exception handler can not be null"); + Preconditions.checkNotNull(handler, "EventBus exception handler can not be null"); exceptionHandler = handler; } diff --git a/src/main/java/net/minecraftforge/fml/common/eventhandler/ListenerList.java b/src/main/java/net/minecraftforge/fml/common/eventhandler/ListenerList.java index a257af7154..b253a09c53 100644 --- a/src/main/java/net/minecraftforge/fml/common/eventhandler/ListenerList.java +++ b/src/main/java/net/minecraftforge/fml/common/eventhandler/ListenerList.java @@ -23,12 +23,15 @@ import java.util.*; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; +import javax.annotation.Nullable; + public class ListenerList { private static ImmutableList allLists = ImmutableList.of(); private static int maxSize = 0; + @Nullable private ListenerList parent; private ListenerListInst[] lists = new ListenerListInst[0]; @@ -37,7 +40,7 @@ public class ListenerList this(null); } - public ListenerList(ListenerList parent) + public ListenerList(@Nullable ListenerList parent) { // parent needs to be set before resize ! this.parent = parent; diff --git a/src/main/java/net/minecraftforge/fml/common/network/ByteBufUtils.java b/src/main/java/net/minecraftforge/fml/common/network/ByteBufUtils.java index 60619e396c..6773061e95 100644 --- a/src/main/java/net/minecraftforge/fml/common/network/ByteBufUtils.java +++ b/src/main/java/net/minecraftforge/fml/common/network/ByteBufUtils.java @@ -30,6 +30,8 @@ import com.google.common.base.Throwables; import io.netty.buffer.ByteBuf; +import javax.annotation.Nullable; + /** * Utilities for interacting with {@link ByteBuf}. * @author cpw @@ -203,6 +205,7 @@ public class ByteBufUtils { * @param from The buffer to read from * @return The read tag */ + @Nullable public static NBTTagCompound readTag(ByteBuf from) { PacketBuffer pb = new PacketBuffer(from); diff --git a/src/main/java/net/minecraftforge/fml/common/network/FMLEmbeddedChannel.java b/src/main/java/net/minecraftforge/fml/common/network/FMLEmbeddedChannel.java index 2e10bd0124..5e9a470cff 100644 --- a/src/main/java/net/minecraftforge/fml/common/network/FMLEmbeddedChannel.java +++ b/src/main/java/net/minecraftforge/fml/common/network/FMLEmbeddedChannel.java @@ -31,6 +31,8 @@ import net.minecraftforge.fml.common.network.FMLOutboundHandler.OutboundTarget; import net.minecraftforge.fml.common.network.internal.FMLProxyPacket; import net.minecraftforge.fml.relauncher.Side; +import javax.annotation.Nullable; + /** * Utility wrapper around {@link EmbeddedChannel}. Provides some convenience methods * associated with the specific needs of FML network handling. @@ -72,6 +74,7 @@ public class FMLEmbeddedChannel extends EmbeddedChannel { return pkt; } + @Nullable public String findChannelHandlerNameForType(Class type) { String targetName = null; diff --git a/src/main/java/net/minecraftforge/fml/common/network/FMLEventChannel.java b/src/main/java/net/minecraftforge/fml/common/network/FMLEventChannel.java index 6eafb8bcbb..cf75d2f374 100644 --- a/src/main/java/net/minecraftforge/fml/common/network/FMLEventChannel.java +++ b/src/main/java/net/minecraftforge/fml/common/network/FMLEventChannel.java @@ -33,6 +33,8 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.network.internal.FMLProxyPacket; import net.minecraftforge.fml.relauncher.Side; +import javax.annotation.Nullable; + /** * An event driven network channel, using {@link FMLNetworkEvent.CustomPacketEvent} and {@link FMLNetworkEvent.CustomNetworkEvent} * to deliver messages to an event listener. There is one "bus" for each channel, due to the @@ -57,6 +59,7 @@ public class FMLEventChannel { SERVER() { @Override + @Nullable FMLNetworkEvent.CustomPacketEvent make(FMLProxyPacket msg) { FMLNetworkEvent.CustomPacketEvent event = null; @@ -71,6 +74,7 @@ public class FMLEventChannel { CLIENT() { @Override + @Nullable FMLNetworkEvent.CustomPacketEvent make(FMLProxyPacket msg) { FMLNetworkEvent.CustomPacketEvent event = null; @@ -87,6 +91,7 @@ public class FMLEventChannel { return event; } }; + @Nullable abstract FMLNetworkEvent.CustomPacketEvent make(FMLProxyPacket msg); } diff --git a/src/main/java/net/minecraftforge/fml/common/network/FMLOutboundHandler.java b/src/main/java/net/minecraftforge/fml/common/network/FMLOutboundHandler.java index 12ee630b1d..196cf12d87 100644 --- a/src/main/java/net/minecraftforge/fml/common/network/FMLOutboundHandler.java +++ b/src/main/java/net/minecraftforge/fml/common/network/FMLOutboundHandler.java @@ -40,6 +40,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; +import javax.annotation.Nullable; + public class FMLOutboundHandler extends ChannelOutboundHandlerAdapter { public static final AttributeKey FML_MESSAGETARGET = AttributeKey.valueOf("fml:outboundTarget"); public static final AttributeKey FML_MESSAGETARGETARGS = AttributeKey.valueOf("fml:outboundTargetArgs"); @@ -59,6 +61,7 @@ public class FMLOutboundHandler extends ChannelOutboundHandlerAdapter { } @Override + @Nullable public List selectNetworks(Object args, ChannelHandlerContext context, FMLProxyPacket packet) { return null; @@ -253,6 +256,7 @@ public class FMLOutboundHandler extends ChannelOutboundHandlerAdapter { } public final ImmutableSet allowed; public abstract void validateArgs(Object args); + @Nullable public abstract List selectNetworks(Object args, ChannelHandlerContext context, FMLProxyPacket packet); } diff --git a/src/main/java/net/minecraftforge/fml/common/network/NetworkRegistry.java b/src/main/java/net/minecraftforge/fml/common/network/NetworkRegistry.java index 333c893b93..d5117da2b3 100644 --- a/src/main/java/net/minecraftforge/fml/common/network/NetworkRegistry.java +++ b/src/main/java/net/minecraftforge/fml/common/network/NetworkRegistry.java @@ -50,6 +50,8 @@ import net.minecraftforge.fml.relauncher.Side; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; +import javax.annotation.Nullable; + /** * @author cpw * @@ -242,6 +244,7 @@ public enum NetworkRegistry * @param z Z coord * @return The server side GUI object (An instance of {@link Container}) */ + @Nullable public Container getRemoteGuiContainer(ModContainer mc, EntityPlayerMP player, int modGuiId, World world, int x, int y, int z) { IGuiHandler handler = serverGuiHandlers.get(mc); @@ -267,6 +270,7 @@ public enum NetworkRegistry * @param z Z coord * @return The client side GUI object (An instance of {@link net.minecraft.client.gui.Gui}) */ + @Nullable public Object getLocalGuiContainer(ModContainer mc, EntityPlayer player, int modGuiId, World world, int x, int y, int z) { IGuiHandler handler = clientGuiHandlers.get(mc); @@ -291,7 +295,7 @@ public enum NetworkRegistry * @param remoteVersionRange the acceptable remote range * @param asmHarvestedData internal data */ - public void register(ModContainer fmlModContainer, Class clazz, String remoteVersionRange, ASMDataTable asmHarvestedData) + public void register(ModContainer fmlModContainer, Class clazz, @Nullable String remoteVersionRange, ASMDataTable asmHarvestedData) { NetworkModHolder networkModHolder = new NetworkModHolder(fmlModContainer, clazz, remoteVersionRange, asmHarvestedData); registry.put(fmlModContainer, networkModHolder); diff --git a/src/main/java/net/minecraftforge/fml/common/network/handshake/IHandshakeState.java b/src/main/java/net/minecraftforge/fml/common/network/handshake/IHandshakeState.java index c1dd93eedb..6210127dc2 100644 --- a/src/main/java/net/minecraftforge/fml/common/network/handshake/IHandshakeState.java +++ b/src/main/java/net/minecraftforge/fml/common/network/handshake/IHandshakeState.java @@ -21,6 +21,8 @@ package net.minecraftforge.fml.common.network.handshake; import io.netty.channel.ChannelHandlerContext; +import javax.annotation.Nullable; + public interface IHandshakeState { - S accept(ChannelHandlerContext ctx, FMLHandshakeMessage msg); + S accept(ChannelHandlerContext ctx, @Nullable FMLHandshakeMessage msg); } diff --git a/src/main/java/net/minecraftforge/fml/common/network/internal/FMLNetworkHandler.java b/src/main/java/net/minecraftforge/fml/common/network/internal/FMLNetworkHandler.java index 344cff2898..24cc2a7899 100644 --- a/src/main/java/net/minecraftforge/fml/common/network/internal/FMLNetworkHandler.java +++ b/src/main/java/net/minecraftforge/fml/common/network/internal/FMLNetworkHandler.java @@ -60,6 +60,8 @@ import com.google.common.collect.Lists; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import javax.annotation.Nullable; + public class FMLNetworkHandler { public static final int READ_TIMEOUT = Integers.parseInt(System.getProperty("fml.readTimeout","30"),30); @@ -117,6 +119,7 @@ public class FMLNetworkHandler } + @Nullable public static Packet getEntitySpawningPacket(Entity entity) { EntityRegistration er = EntityRegistry.instance().lookupModSpawn(entity.getClass(), false); @@ -132,11 +135,14 @@ public class FMLNetworkHandler return channelPair.get(Side.SERVER).generatePacketFrom(new FMLMessage.EntitySpawnMessage(er, entity, er.getContainer())); } + @Nullable public static String checkModList(FMLHandshakeMessage.ModList modListPacket, Side side) { Map modList = modListPacket.modList(); return checkModList(modList, side); } + + @Nullable public static String checkModList(Map listData, Side side) { List rejects = Lists.newArrayList(); diff --git a/src/main/java/net/minecraftforge/fml/common/network/internal/FMLProxyPacket.java b/src/main/java/net/minecraftforge/fml/common/network/internal/FMLProxyPacket.java index b2c77ce0c9..701382c95e 100644 --- a/src/main/java/net/minecraftforge/fml/common/network/internal/FMLProxyPacket.java +++ b/src/main/java/net/minecraftforge/fml/common/network/internal/FMLProxyPacket.java @@ -49,6 +49,8 @@ import com.google.common.collect.Multiset; import com.google.common.collect.Multiset.Entry; import com.google.common.collect.Multisets; +import javax.annotation.Nullable; + public class FMLProxyPacket implements Packet { final String channel; private Side target; @@ -192,6 +194,7 @@ public class FMLProxyPacket implements Packet { this.dispatcher = networkDispatcher; } + @Nullable public NetworkManager getOrigin() { return this.dispatcher != null ? this.dispatcher.manager : null; diff --git a/src/main/java/net/minecraftforge/fml/common/network/internal/NetworkModHolder.java b/src/main/java/net/minecraftforge/fml/common/network/internal/NetworkModHolder.java index 6fdb8c6e77..375579bcc9 100644 --- a/src/main/java/net/minecraftforge/fml/common/network/internal/NetworkModHolder.java +++ b/src/main/java/net/minecraftforge/fml/common/network/internal/NetworkModHolder.java @@ -41,6 +41,8 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.SetMultimap; +import javax.annotation.Nullable; + public class NetworkModHolder { public abstract class NetworkChecker { @@ -118,7 +120,7 @@ public class NetworkModHolder this.checker = Preconditions.checkNotNull(checker); FMLLog.fine("The mod %s is using a custom checker %s", container.getModId(), checker.getClass().getName()); } - public NetworkModHolder(ModContainer container, Class modClass, String acceptableVersionRange, ASMDataTable table) + public NetworkModHolder(ModContainer container, Class modClass, @Nullable String acceptableVersionRange, ASMDataTable table) { this(container); SetMultimap annotationTable = table.getAnnotationsFor(container); diff --git a/src/main/java/net/minecraftforge/fml/common/registry/EntityRegistry.java b/src/main/java/net/minecraftforge/fml/common/registry/EntityRegistry.java index 0095911c30..b923675d34 100644 --- a/src/main/java/net/minecraftforge/fml/common/registry/EntityRegistry.java +++ b/src/main/java/net/minecraftforge/fml/common/registry/EntityRegistry.java @@ -42,6 +42,8 @@ import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import com.google.common.collect.ListMultimap; +import javax.annotation.Nullable; + public class EntityRegistry { public class EntityRegistration @@ -312,6 +314,7 @@ public class EntityRegistry } } + @Nullable public EntityRegistration lookupModSpawn(Class clazz, boolean keepLooking) { Class localClazz = clazz; @@ -331,6 +334,7 @@ public class EntityRegistry return null; } + @Nullable public EntityRegistration lookupModSpawn(ModContainer mc, int modEntityId) { for (EntityRegistration er : entityRegistrations.get(mc)) @@ -356,6 +360,7 @@ public class EntityRegistry } //Helper function + @Nullable public static EntityEntry getEntry(Class entry) { //TODO: Slave map for faster lookup? diff --git a/src/main/java/net/minecraftforge/fml/common/registry/FMLControlledNamespacedRegistry.java b/src/main/java/net/minecraftforge/fml/common/registry/FMLControlledNamespacedRegistry.java index 5b874d2cfd..fccf3fa9fb 100644 --- a/src/main/java/net/minecraftforge/fml/common/registry/FMLControlledNamespacedRegistry.java +++ b/src/main/java/net/minecraftforge/fml/common/registry/FMLControlledNamespacedRegistry.java @@ -30,6 +30,7 @@ import java.util.Map.Entry; import java.util.Set; import com.google.common.base.Joiner; +import com.google.common.base.Preconditions; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import com.google.common.collect.Iterators; @@ -47,12 +48,17 @@ import net.minecraftforge.fml.common.functions.GenericIterableFactory; import net.minecraftforge.fml.common.registry.RegistryDelegate.Delegate; import net.minecraftforge.fml.relauncher.ReflectionHelper; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + public class FMLControlledNamespacedRegistry> extends RegistryNamespacedDefaultedByKey implements IForgeRegistry { public static final boolean DEBUG = Boolean.parseBoolean(System.getProperty("fml.debugRegistryEntries", "false")); private final Class superType; private final boolean isDelegated; + @Nullable private ResourceLocation optionalDefaultKey; + @Nullable private I optionalDefaultObject; private int maxId; private int minId; @@ -83,16 +89,16 @@ public class FMLControlledNamespacedRegistry> e private final BitSet availabilityMap; private final Map slaves = Maps.newHashMap(); - + @Nullable private final AddCallback addCallback; - + @Nullable private final ClearCallback clearCallback; - + @Nullable private final CreateCallback createCallback; - + @Nullable private final SubstitutionCallback substitutionCallback; - FMLControlledNamespacedRegistry(ResourceLocation defaultKey, int minIdValue, int maxIdValue, Class type, BiMap> registries, AddCallback addCallback, ClearCallback clearCallback, CreateCallback createCallback, SubstitutionCallback substitutionCallback) + FMLControlledNamespacedRegistry(@Nullable ResourceLocation defaultKey, int minIdValue, int maxIdValue, Class type, BiMap> registries, @Nullable AddCallback addCallback, @Nullable ClearCallback clearCallback, @Nullable CreateCallback createCallback, @Nullable SubstitutionCallback substitutionCallback) { super(defaultKey); this.superType = type; @@ -220,7 +226,7 @@ public class FMLControlledNamespacedRegistry> e */ @Override @Deprecated - public void register(int id, ResourceLocation name, I thing) + public void register(int id, @Nonnull ResourceLocation name, @Nonnull I thing) { add(id, name, thing); } @@ -232,17 +238,10 @@ public class FMLControlledNamespacedRegistry> e */ @Override @Deprecated - public void putObject(ResourceLocation name, I thing) + public void putObject(@Nonnull ResourceLocation name, @Nonnull I thing) { - - if (name == null) - { - throw new NullPointerException("Can't use a null-name for the registry."); - } - if (thing == null) - { - throw new NullPointerException("Can't add null-object to the registry."); - } + Preconditions.checkNotNull(name, "Can't use a null-name for the registry."); + Preconditions.checkNotNull(thing, "Can't add null-object to the registry."); ResourceLocation existingName = getNameForObject(thing); @@ -269,6 +268,7 @@ public class FMLControlledNamespacedRegistry> e * @param name Unique name identifying the object. * @return Registered object of the default object if it wasn't found- */ + @Nullable @Override public I getObject(ResourceLocation name) { @@ -284,6 +284,7 @@ public class FMLControlledNamespacedRegistry> e * @param id ID identifying the object. * @return Registered object of the default object if it wasn't found- */ + @Nullable @Override public I getObjectById(int id) { @@ -302,7 +303,7 @@ public class FMLControlledNamespacedRegistry> e * @param thing Block/Item object. * @return Block/Item id or -1 if it wasn't found. */ - public int getId(I thing) + public int getId(@Nullable I thing) { return getIDForObjectBypass(thing); } @@ -313,6 +314,7 @@ public class FMLControlledNamespacedRegistry> e * @param id Block/Item id. * @return Block/Item object or null if it wasn't found. */ + @Nullable public I getRaw(int id) { return super.getObjectById(id); @@ -324,6 +326,7 @@ public class FMLControlledNamespacedRegistry> e * @param name Block/Item name. * @return Block/Item object or null if it wasn't found. */ + @Nullable private I getRaw(ResourceLocation name) { I ret = super.getObject(name); @@ -350,7 +353,7 @@ public class FMLControlledNamespacedRegistry> e * @return true if a matching entry was found. */ @Override - public boolean containsKey(ResourceLocation name) + public boolean containsKey(@Nonnull ResourceLocation name) { boolean ret = super.containsKey(name); @@ -430,16 +433,11 @@ public class FMLControlledNamespacedRegistry> e * @param thing Object to add. * @return ID eventually allocated. */ - int add(int id, ResourceLocation name, I thing) + int add(int id, @Nonnull ResourceLocation name, @Nonnull I thing) { - if (name == null) - { - throw new NullPointerException(String.format("Can't use a null-name for the registry, object %s.", thing)); - } - if (thing == null) - { - throw new NullPointerException(String.format("Can't add null-object to the registry, name %s.", name)); - } + Preconditions.checkNotNull(name, "Can't use a null-name for the registry, object %s.", thing); + Preconditions.checkNotNull(thing, "Can't add null-object to the registry, name %s.", name); + if (optionalDefaultKey != null && optionalDefaultKey.equals(name) && this.optionalDefaultObject == null) { this.optionalDefaultObject = thing; @@ -573,18 +571,9 @@ public class FMLControlledNamespacedRegistry> e */ private void addObjectRaw(int id, ResourceLocation name, I thing) { - if (name == null) - { - throw new NullPointerException("The name to be added to the registry is null. This can only happen with a corrupted registry state. Reflection/ASM hackery? Registry bug?"); - } - if (thing == null) - { - throw new NullPointerException("The object to be added to the registry is null. This can only happen with a corrupted registry state. Reflection/ASM hackery? Registry bug?"); - } - if (!superType.isInstance(thing)) - { - throw new IllegalArgumentException("The object to be added to the registry is not of the right type. Reflection/ASM hackery? Registry bug?"); - } + Preconditions.checkNotNull(name, "The name to be added to the registry is null. This can only happen with a corrupted registry state. Reflection/ASM hackery? Registry bug?"); + Preconditions.checkNotNull(thing, "The object to be added to the registry is null. This can only happen with a corrupted registry state. Reflection/ASM hackery? Registry bug?"); + Preconditions.checkState(superType.isInstance(thing), "The object to be added to the registry is not of the right type. Reflection/ASM hackery? Registry bug?"); underlyingIntegerMap.put(thing, id); // obj <-> id super.putObject(name, thing); // name <-> obj @@ -595,6 +584,7 @@ public class FMLControlledNamespacedRegistry> e } } + @Nullable public I getDefaultValue() { return optionalDefaultObject; @@ -606,6 +596,7 @@ public class FMLControlledNamespacedRegistry> e } @SuppressWarnings("unchecked") + @Nonnull private Delegate getExistingDelegate(I thing) { if (isDelegated) @@ -614,10 +605,11 @@ public class FMLControlledNamespacedRegistry> e } else { - return null; + throw new IllegalStateException("Tried to get existing delegate from registry that is not delegated."); } } + @Nullable I activateSubstitution(ResourceLocation nameToReplace) { if (getPersistentSubstitutions().containsKey(nameToReplace)) @@ -682,6 +674,7 @@ public class FMLControlledNamespacedRegistry> e * This iterator is used by some regular MC methods to visit all blocks, we need to include substitutions * Compare #typeSafeIterable() */ + @Nonnull @Override public Iterator iterator() { @@ -777,6 +770,7 @@ public class FMLControlledNamespacedRegistry> e remappedIds.put(itemName, new Integer[] {currId, newId}); } I obj = currentRegistry.getRaw(itemName); + Preconditions.checkState(obj != null, "objectKey has an ID but no object. Reflection/ASM hackery? Registry bug?"); I sub = obj; // If we have an object in the originals set, we use that for initial adding - substitute activation will readd the substitute if neceessary later if (currentRegistry.substitutionOriginals.containsKey(itemName)) @@ -808,7 +802,8 @@ public class FMLControlledNamespacedRegistry> e } @Override - public ResourceLocation getNameForObject(I p_177774_1_) + @Nullable + public ResourceLocation getNameForObject(@Nonnull I p_177774_1_) { ResourceLocation rl = super.getNameForObjectBypass(p_177774_1_); if (rl == null) @@ -828,7 +823,7 @@ public class FMLControlledNamespacedRegistry> e // IForgeRegistry: Modders should only interfaces with these methods @Override - public void register(I value) + public void register(@Nonnull I value) { ResourceLocation key = value.getRegistryName(); if (key == null) @@ -847,7 +842,7 @@ public class FMLControlledNamespacedRegistry> e } } @Override - public boolean containsValue(I value) + public boolean containsValue(@Nonnull I value) { return getKey(value) != null; } @@ -859,11 +854,13 @@ public class FMLControlledNamespacedRegistry> e } @Override + @Nullable public ResourceLocation getKey(I value) { return getNameForObject(value); } + @Nonnull @Override //Bouncer for OBF, as the super class's function is NotchCode and gets obfed. This plus the SRG lines prevents a AbstractMethodException public Set getKeys() { @@ -871,12 +868,14 @@ public class FMLControlledNamespacedRegistry> e } @Override + @Nonnull public List getValues() { return Lists.newArrayList(this.iterator()); } @Override + @Nonnull public Set> getEntries() { return Sets.newHashSet(new Iterator>() diff --git a/src/main/java/net/minecraftforge/fml/common/registry/FinalFieldHelper.java b/src/main/java/net/minecraftforge/fml/common/registry/FinalFieldHelper.java index b952ac659f..dab7c2347f 100644 --- a/src/main/java/net/minecraftforge/fml/common/registry/FinalFieldHelper.java +++ b/src/main/java/net/minecraftforge/fml/common/registry/FinalFieldHelper.java @@ -21,6 +21,7 @@ package net.minecraftforge.fml.common.registry; import com.google.common.base.Throwables; +import javax.annotation.Nullable; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; @@ -50,7 +51,7 @@ class FinalFieldHelper } - static void setField(Field field, Object instance, Object thing) throws Exception + static void setField(Field field, @Nullable Object instance, Object thing) throws Exception { Object fieldAccessor = newFieldAccessor.invoke(reflectionFactory, field, false); fieldAccessorSet.invoke(fieldAccessor, instance, thing); diff --git a/src/main/java/net/minecraftforge/fml/common/registry/IForgeRegistry.java b/src/main/java/net/minecraftforge/fml/common/registry/IForgeRegistry.java index 3d52bb2a26..e37e05fcb9 100644 --- a/src/main/java/net/minecraftforge/fml/common/registry/IForgeRegistry.java +++ b/src/main/java/net/minecraftforge/fml/common/registry/IForgeRegistry.java @@ -27,6 +27,9 @@ import java.util.Set; import com.google.common.collect.BiMap; import net.minecraft.util.ResourceLocation; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + /** * Main interface for the registry system. Use this to query the registry system. * @@ -44,12 +47,12 @@ public interface IForgeRegistry> extends Iterab boolean containsKey(ResourceLocation key); boolean containsValue(V value); - V getValue(ResourceLocation key); - ResourceLocation getKey(V value); + @Nullable V getValue(ResourceLocation key); + @Nullable ResourceLocation getKey(V value); - Set getKeys(); - List getValues(); - Set> getEntries(); + @Nonnull Set getKeys(); + @Nonnull List getValues(); + @Nonnull Set> getEntries(); /** * Retrieve the slave map of type T from the registry. diff --git a/src/main/java/net/minecraftforge/fml/common/registry/IForgeRegistryEntry.java b/src/main/java/net/minecraftforge/fml/common/registry/IForgeRegistryEntry.java index 919f803a21..e135e4c03a 100644 --- a/src/main/java/net/minecraftforge/fml/common/registry/IForgeRegistryEntry.java +++ b/src/main/java/net/minecraftforge/fml/common/registry/IForgeRegistryEntry.java @@ -28,6 +28,8 @@ import net.minecraftforge.fml.common.InjectedModContainer; import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.ModContainer; +import javax.annotation.Nullable; + public interface IForgeRegistryEntry { /** @@ -54,6 +56,7 @@ public interface IForgeRegistryEntry * * @return Unique identifier or null. */ + @Nullable ResourceLocation getRegistryName(); Class getRegistryType(); @@ -89,6 +92,7 @@ public interface IForgeRegistryEntry //Helper functions public final T setRegistryName(ResourceLocation name){ return setRegistryName(name.toString()); } public final T setRegistryName(String modID, String name){ return setRegistryName(modID + ":" + name); } + @Nullable public final ResourceLocation getRegistryName() { if (delegate.name() != null) return delegate.name(); diff --git a/src/main/java/net/minecraftforge/fml/common/registry/ObjectHolderRef.java b/src/main/java/net/minecraftforge/fml/common/registry/ObjectHolderRef.java index 6f91ea4bd7..31c5774047 100644 --- a/src/main/java/net/minecraftforge/fml/common/registry/ObjectHolderRef.java +++ b/src/main/java/net/minecraftforge/fml/common/registry/ObjectHolderRef.java @@ -33,6 +33,8 @@ import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.registry.GameRegistry.ObjectHolder; import net.minecraftforge.fml.common.registry.PersistentRegistryManager.PersistentRegistry; +import javax.annotation.Nullable; + /** * Internal class used in tracking {@link ObjectHolder} references @@ -100,6 +102,7 @@ class ObjectHolderRef { } @SuppressWarnings("unchecked") + @Nullable private FMLControlledNamespacedRegistry getRegistryForType(Field field) { Queue> typesToExamine = new LinkedList>(); diff --git a/src/main/java/net/minecraftforge/fml/common/registry/ObjectHolderRegistry.java b/src/main/java/net/minecraftforge/fml/common/registry/ObjectHolderRegistry.java index 685fd439eb..7d6e67f2b6 100644 --- a/src/main/java/net/minecraftforge/fml/common/registry/ObjectHolderRegistry.java +++ b/src/main/java/net/minecraftforge/fml/common/registry/ObjectHolderRegistry.java @@ -35,6 +35,8 @@ import com.google.common.base.Throwables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import javax.annotation.Nullable; + /** * Internal registry for tracking {@link ObjectHolder} references * @author cpw @@ -78,7 +80,7 @@ public enum ObjectHolderRegistry { FMLLog.info("Found %d ObjectHolder annotations", objectHolders.size()); } - private void scanTarget(Map classModIds, Map> classCache, String className, String annotationTarget, String value, boolean isClass, boolean extractFromValue) + private void scanTarget(Map classModIds, Map> classCache, String className, @Nullable String annotationTarget, String value, boolean isClass, boolean extractFromValue) { Class clazz; if (classCache.containsKey(className)) diff --git a/src/main/java/net/minecraftforge/fml/common/registry/PersistentRegistryManager.java b/src/main/java/net/minecraftforge/fml/common/registry/PersistentRegistryManager.java index 706f15eb49..ddd578bd14 100644 --- a/src/main/java/net/minecraftforge/fml/common/registry/PersistentRegistryManager.java +++ b/src/main/java/net/minecraftforge/fml/common/registry/PersistentRegistryManager.java @@ -57,6 +57,8 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.google.common.collect.Sets.SetView; +import javax.annotation.Nullable; + /** * Persistent registry manager. Manages the registries loading from disk, and from network. Handles staging * registry data before loading uniformly into the active registry, and keeps a frozen registry instance @@ -112,7 +114,7 @@ public class PersistentRegistryManager } @SuppressWarnings("unchecked") - private > FMLControlledNamespacedRegistry getRegistry(ResourceLocation key, @SuppressWarnings("UnusedParameters") Class regType) + private > FMLControlledNamespacedRegistry getRegistry(ResourceLocation key, @SuppressWarnings("UnusedParameters") @Nullable Class regType) { return (FMLControlledNamespacedRegistry)registries.get(key); } @@ -127,7 +129,7 @@ public class PersistentRegistryManager return getRegistry(key, regType); } - private > FMLControlledNamespacedRegistry createRegistry(ResourceLocation registryName, Class type, ResourceLocation defaultObjectKey, int minId, int maxId, IForgeRegistry.AddCallback addCallback, IForgeRegistry.ClearCallback clearCallback, IForgeRegistry.CreateCallback createCallback, IForgeRegistry.SubstitutionCallback substitutionCallback) + private > FMLControlledNamespacedRegistry createRegistry(ResourceLocation registryName, Class type, ResourceLocation defaultObjectKey, int minId, int maxId, @Nullable IForgeRegistry.AddCallback addCallback, @Nullable IForgeRegistry.ClearCallback clearCallback, @Nullable IForgeRegistry.CreateCallback createCallback, @Nullable IForgeRegistry.SubstitutionCallback substitutionCallback) { Set> parents = Sets.newHashSet(); findSuperTypes(type, parents); @@ -196,21 +198,21 @@ public class PersistentRegistryManager public static > FMLControlledNamespacedRegistry createRegistry( ResourceLocation registryName, Class registryType, ResourceLocation optionalDefaultKey, int minId, int maxId, boolean hasDelegates, - IForgeRegistry.AddCallback addCallback, - IForgeRegistry.ClearCallback clearCallback, - IForgeRegistry.CreateCallback createCallback) + @Nullable IForgeRegistry.AddCallback addCallback, + @Nullable IForgeRegistry.ClearCallback clearCallback, + @Nullable IForgeRegistry.CreateCallback createCallback) { return PersistentRegistry.ACTIVE.createRegistry(registryName, registryType, optionalDefaultKey, minId, maxId, getLegacyAdd(addCallback), getLegacyClear(clearCallback), getLegacyCreate(createCallback), null); } @Deprecated //Use RegistryBuilder TODO: Remove in 1.11 {Make package private so only builder can use it} public static > FMLControlledNamespacedRegistry createRegistry( - ResourceLocation registryName, Class registryType, ResourceLocation optionalDefaultKey, + ResourceLocation registryName, Class registryType, @Nullable ResourceLocation optionalDefaultKey, int minId, int maxId, boolean hasDelegates, - IForgeRegistry.AddCallback addCallback, - IForgeRegistry.ClearCallback clearCallback, - IForgeRegistry.CreateCallback createCallback, - IForgeRegistry.SubstitutionCallback substitutionCallback) + @Nullable IForgeRegistry.AddCallback addCallback, + @Nullable IForgeRegistry.ClearCallback clearCallback, + @Nullable IForgeRegistry.CreateCallback createCallback, + @Nullable IForgeRegistry.SubstitutionCallback substitutionCallback) { return PersistentRegistry.ACTIVE.createRegistry(registryName, registryType, optionalDefaultKey, minId, maxId, addCallback, clearCallback, createCallback, substitutionCallback); @@ -766,7 +768,8 @@ public class PersistentRegistryManager //TODO: Remove in 1.11, creates wrappers for API breakage cpw did in registry re-work. - private static > IForgeRegistry.ClearCallback getLegacyClear(final IForgeRegistry.ClearCallback cb) + @Nullable + private static > IForgeRegistry.ClearCallback getLegacyClear(@Nullable final IForgeRegistry.ClearCallback cb) { if (cb == null) return null; @@ -790,13 +793,13 @@ public class PersistentRegistryManager return cb; //Assume they are ussing modern API } catch (SecurityException e) { e.printStackTrace(); - Throwables.propagate(e); + throw Throwables.propagate(e); } - return null; //Will never get here unless things go wonkey... } //TODO: Remove in 1.11, creates wrappers for API breakage cpw did in registry re-work. - private static > IForgeRegistry.CreateCallback getLegacyCreate(final IForgeRegistry.CreateCallback cb) + @Nullable + private static > IForgeRegistry.CreateCallback getLegacyCreate(@Nullable final IForgeRegistry.CreateCallback cb) { if (cb == null) return null; @@ -820,13 +823,13 @@ public class PersistentRegistryManager return cb; //Assume they are ussing modern API } catch (SecurityException e) { e.printStackTrace(); - Throwables.propagate(e); + throw Throwables.propagate(e); } - return null; //Will never get here unless things go wonkey... } //TODO: Remove in 1.11, creates wrappers for API breakage cpw did in registry re-work. - private static > IForgeRegistry.AddCallback getLegacyAdd(final IForgeRegistry.AddCallback cb) + @Nullable + private static > IForgeRegistry.AddCallback getLegacyAdd(@Nullable final IForgeRegistry.AddCallback cb) { if (cb == null) return null; @@ -850,8 +853,7 @@ public class PersistentRegistryManager return cb; //Assume they are ussing modern API } catch (SecurityException e) { e.printStackTrace(); - Throwables.propagate(e); + throw Throwables.propagate(e); } - return null; //Will never get here unless things go wonkey... } } diff --git a/src/main/java/net/minecraftforge/fml/common/registry/RegistryBuilder.java b/src/main/java/net/minecraftforge/fml/common/registry/RegistryBuilder.java index cfad0b4dea..97b0b86135 100644 --- a/src/main/java/net/minecraftforge/fml/common/registry/RegistryBuilder.java +++ b/src/main/java/net/minecraftforge/fml/common/registry/RegistryBuilder.java @@ -28,6 +28,8 @@ import com.google.common.collect.Lists; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.registry.IForgeRegistry.*; +import javax.annotation.Nullable; + public class RegistryBuilder> { private ResourceLocation registryName; @@ -104,6 +106,7 @@ public class RegistryBuilder> getAdd(), getClear(), getCreate(), getSubstitution()); } + @Nullable private AddCallback getAdd() { if (this.addCallback.isEmpty()) @@ -121,6 +124,8 @@ public class RegistryBuilder> } }; } + + @Nullable private ClearCallback getClear() { if (this.clearCallback.isEmpty()) @@ -138,6 +143,8 @@ public class RegistryBuilder> } }; } + + @Nullable private CreateCallback getCreate() { if (this.createCallback.isEmpty()) @@ -155,6 +162,8 @@ public class RegistryBuilder> } }; } + + @Nullable private SubstitutionCallback getSubstitution() { if (this.substitutionCallback.isEmpty()) diff --git a/src/main/java/net/minecraftforge/fml/common/registry/VillagerRegistry.java b/src/main/java/net/minecraftforge/fml/common/registry/VillagerRegistry.java index fb652ad421..91d3391cc5 100644 --- a/src/main/java/net/minecraftforge/fml/common/registry/VillagerRegistry.java +++ b/src/main/java/net/minecraftforge/fml/common/registry/VillagerRegistry.java @@ -37,6 +37,9 @@ import net.minecraft.world.gen.structure.StructureComponent; import net.minecraft.world.gen.structure.StructureVillagePieces; import net.minecraft.world.gen.structure.StructureVillagePieces.PieceWeight; import net.minecraft.world.gen.structure.StructureVillagePieces.Village; + +import javax.annotation.Nullable; + /** * Registry for villager trading control */ @@ -284,7 +287,7 @@ public class VillagerRegistry return this; } - + @Nullable public List getTrades(int level) { return level >= 0 && level < this.trades.size() ? Collections.unmodifiableList(this.trades.get(level)) : null; @@ -357,7 +360,7 @@ public class VillagerRegistry } @Deprecated public static VillagerProfession getById(int network){ return INSTANCE.professions.getObjectById(network); } - @Deprecated public static int getId(VillagerProfession prof){ return INSTANCE.professions.getId(prof); } + @Deprecated public static int getId(@Nullable VillagerProfession prof){ return INSTANCE.professions.getId(prof); } //TODO: Figure out a good generic system for this. Put on hold for Patches. diff --git a/src/main/java/net/minecraftforge/fml/common/versioning/Restriction.java b/src/main/java/net/minecraftforge/fml/common/versioning/Restriction.java index dffa332f4e..81fc3a20d5 100644 --- a/src/main/java/net/minecraftforge/fml/common/versioning/Restriction.java +++ b/src/main/java/net/minecraftforge/fml/common/versioning/Restriction.java @@ -21,6 +21,8 @@ package net.minecraftforge.fml.common.versioning; import net.minecraft.client.resources.I18n; +import javax.annotation.Nullable; + /** * Describes a restriction in versioning. * @@ -38,8 +40,8 @@ public class Restriction public static final Restriction EVERYTHING = new Restriction( null, false, null, false ); - public Restriction( ArtifactVersion lowerBound, boolean lowerBoundInclusive, ArtifactVersion upperBound, - boolean upperBoundInclusive ) + public Restriction( @Nullable ArtifactVersion lowerBound, boolean lowerBoundInclusive, @Nullable ArtifactVersion upperBound, + boolean upperBoundInclusive ) { this.lowerBound = lowerBound; this.lowerBoundInclusive = lowerBoundInclusive; @@ -47,6 +49,7 @@ public class Restriction this.upperBoundInclusive = upperBoundInclusive; } + @Nullable public ArtifactVersion getLowerBound() { return lowerBound; @@ -57,6 +60,7 @@ public class Restriction return lowerBoundInclusive; } + @Nullable public ArtifactVersion getUpperBound() { return upperBound; diff --git a/src/main/java/net/minecraftforge/fml/common/versioning/VersionRange.java b/src/main/java/net/minecraftforge/fml/common/versioning/VersionRange.java index f5fb090c13..65c6150aa3 100644 --- a/src/main/java/net/minecraftforge/fml/common/versioning/VersionRange.java +++ b/src/main/java/net/minecraftforge/fml/common/versioning/VersionRange.java @@ -29,6 +29,8 @@ import java.util.List; import com.google.common.base.Joiner; +import javax.annotation.Nullable; + /** * Construct a version range from a specification. * @@ -101,7 +103,7 @@ public class VersionRange * @throws InvalidVersionSpecificationException * */ - public static VersionRange createFromVersionSpec( String spec ) + public static VersionRange createFromVersionSpec( @Nullable String spec ) throws InvalidVersionSpecificationException { if ( spec == null ) diff --git a/src/main/java/net/minecraftforge/fml/relauncher/FileListHelper.java b/src/main/java/net/minecraftforge/fml/relauncher/FileListHelper.java index 3d627ae1fb..3e8f912948 100644 --- a/src/main/java/net/minecraftforge/fml/relauncher/FileListHelper.java +++ b/src/main/java/net/minecraftforge/fml/relauncher/FileListHelper.java @@ -19,6 +19,7 @@ package net.minecraftforge.fml.relauncher; +import javax.annotation.Nullable; import java.io.File; import java.io.FilenameFilter; import java.util.Arrays; @@ -40,7 +41,7 @@ public final class FileListHelper { Arrays.sort(files, CaseInsensitiveFileComparator.INSTANCE); return files; } - public static File[] sortFileList(File dir, FilenameFilter filter) + public static File[] sortFileList(File dir, @Nullable FilenameFilter filter) { File[] files = dir.listFiles(filter); return sortFileList(files); diff --git a/src/main/java/net/minecraftforge/fml/relauncher/IFMLLoadingPlugin.java b/src/main/java/net/minecraftforge/fml/relauncher/IFMLLoadingPlugin.java index f2016bac20..8d6a62efca 100644 --- a/src/main/java/net/minecraftforge/fml/relauncher/IFMLLoadingPlugin.java +++ b/src/main/java/net/minecraftforge/fml/relauncher/IFMLLoadingPlugin.java @@ -19,6 +19,7 @@ package net.minecraftforge.fml.relauncher; +import javax.annotation.Nullable; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -60,6 +61,7 @@ public interface IFMLLoadingPlugin * minecraft class loading * TODO: implement crash ;) */ + @Nullable String getSetupClass(); /** diff --git a/src/main/java/net/minecraftforge/fml/relauncher/ModListHelper.java b/src/main/java/net/minecraftforge/fml/relauncher/ModListHelper.java index 6ecfb7d7cc..5f5f110b40 100644 --- a/src/main/java/net/minecraftforge/fml/relauncher/ModListHelper.java +++ b/src/main/java/net/minecraftforge/fml/relauncher/ModListHelper.java @@ -33,6 +33,8 @@ import com.google.common.io.Files; import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; +import javax.annotation.Nullable; + public class ModListHelper { public static class JsonModList { public String repositoryRoot; @@ -148,7 +150,7 @@ public class ModListHelper { tryAddFile(fileName.toString(), repoRoot, genericName.toString()); } } - private static void tryAddFile(String modFileName, File repoRoot, String descriptor) { + private static void tryAddFile(String modFileName, @Nullable File repoRoot, String descriptor) { File modFile = repoRoot != null ? new File(repoRoot,modFileName) : new File(mcDirectory, modFileName); if (!modFile.exists()) { diff --git a/src/main/java/net/minecraftforge/fml/relauncher/ReflectionHelper.java b/src/main/java/net/minecraftforge/fml/relauncher/ReflectionHelper.java index 260c972775..4017160b31 100644 --- a/src/main/java/net/minecraftforge/fml/relauncher/ReflectionHelper.java +++ b/src/main/java/net/minecraftforge/fml/relauncher/ReflectionHelper.java @@ -18,6 +18,7 @@ */ package net.minecraftforge.fml.relauncher; +import javax.annotation.Nullable; import java.lang.reflect.Field; import java.lang.reflect.Method; /** @@ -46,7 +47,7 @@ public class ReflectionHelper private static final long serialVersionUID = 1L; //private String[] classNames; - public UnableToFindClassException(String[] classNames, Exception err) + public UnableToFindClassException(String[] classNames, @Nullable Exception err) { super(err); //this.classNames = classNames; @@ -97,7 +98,7 @@ public class ReflectionHelper } @SuppressWarnings("unchecked") - public static T getPrivateValue(Class classToAccess, E instance, int fieldIndex) + public static T getPrivateValue(Class classToAccess, @Nullable E instance, int fieldIndex) { try { diff --git a/src/main/java/net/minecraftforge/items/VanillaDoubleChestItemHandler.java b/src/main/java/net/minecraftforge/items/VanillaDoubleChestItemHandler.java index f1fc635cf7..da17dfde15 100644 --- a/src/main/java/net/minecraftforge/items/VanillaDoubleChestItemHandler.java +++ b/src/main/java/net/minecraftforge/items/VanillaDoubleChestItemHandler.java @@ -32,6 +32,7 @@ import java.lang.ref.WeakReference; import com.google.common.base.Objects; import javax.annotation.Nonnull; +import javax.annotation.Nullable; public class VanillaDoubleChestItemHandler extends WeakReference implements IItemHandlerModifiable { @@ -41,7 +42,7 @@ public class VanillaDoubleChestItemHandler extends WeakReference itemHandlerResult = getItemHandler(dest, EnumFacing.UP); diff --git a/src/main/java/net/minecraftforge/oredict/OreDictionary.java b/src/main/java/net/minecraftforge/oredict/OreDictionary.java index d8c6d83eab..aa267bef3a 100644 --- a/src/main/java/net/minecraftforge/oredict/OreDictionary.java +++ b/src/main/java/net/minecraftforge/oredict/OreDictionary.java @@ -30,6 +30,7 @@ import java.util.Set; import net.minecraft.block.BlockPrismarine; import net.minecraft.util.NonNullList; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.common.ModContainer; import org.apache.logging.log4j.Level; import net.minecraft.block.Block; @@ -608,9 +609,11 @@ public class OreDictionary int hash; if (registryName == null) { + ModContainer modContainer = Loader.instance().activeModContainer(); + String modContainerName = modContainer == null ? null : modContainer.getName(); FMLLog.bigWarning("A broken ore dictionary registration with name %s has occurred. It adds an item (type: %s) which is currently unknown to the game registry. This dictionary item can only support a single value when" + " registered with ores like this, and NO I am not going to turn this spam off. Just register your ore dictionary entries after the GameRegistry.\n" - + "TO USERS: YES this is a BUG in the mod "+Loader.instance().activeModContainer().getName()+" report it to them!", name, ore.getItem().getClass()); + + "TO USERS: YES this is a BUG in the mod " + modContainerName + " report it to them!", name, ore.getItem().getClass()); hash = -1; } else diff --git a/src/main/java/net/minecraftforge/oredict/RecipeSorter.java b/src/main/java/net/minecraftforge/oredict/RecipeSorter.java index 97a6f229dd..a441cf5666 100644 --- a/src/main/java/net/minecraftforge/oredict/RecipeSorter.java +++ b/src/main/java/net/minecraftforge/oredict/RecipeSorter.java @@ -47,6 +47,9 @@ import net.minecraft.item.crafting.ShapelessRecipes; import net.minecraft.item.crafting.ShieldRecipes; import net.minecraft.item.crafting.RecipesBanners.RecipeAddPattern; import net.minecraft.item.crafting.RecipesBanners.RecipeDuplicatePattern; + +import javax.annotation.Nullable; + import static net.minecraftforge.oredict.RecipeSorter.Category.*; public class RecipeSorter implements Comparator @@ -64,12 +67,13 @@ public class RecipeSorter implements Comparator private static class SortEntry { private String name; + @Nullable private Class cls; private Category cat; List before = Lists.newArrayList(); List after = Lists.newArrayList(); - private SortEntry(String name, Class cls, Category cat, String deps) + private SortEntry(String name, @Nullable Class cls, Category cat, String deps) { this.name = name; this.cls = cls; diff --git a/src/main/java/net/minecraftforge/oredict/ShapedOreRecipe.java b/src/main/java/net/minecraftforge/oredict/ShapedOreRecipe.java index e49ba02002..67ad846af0 100644 --- a/src/main/java/net/minecraftforge/oredict/ShapedOreRecipe.java +++ b/src/main/java/net/minecraftforge/oredict/ShapedOreRecipe.java @@ -42,6 +42,7 @@ public class ShapedOreRecipe implements IRecipe public static final int MAX_CRAFT_GRID_WIDTH = 3; public static final int MAX_CRAFT_GRID_HEIGHT = 3; + @Nonnull protected ItemStack output = ItemStack.EMPTY; protected Object[] input = null; protected int width = 0; @@ -175,12 +176,14 @@ public class ShapedOreRecipe implements IRecipe } @Override - public ItemStack getCraftingResult(InventoryCrafting var1){ return output.copy(); } + @Nonnull + public ItemStack getCraftingResult(@Nonnull InventoryCrafting var1){ return output.copy(); } @Override public int getRecipeSize(){ return input.length; } @Override + @Nonnull public ItemStack getRecipeOutput(){ return output; } @Override diff --git a/src/main/java/net/minecraftforge/oredict/ShapelessOreRecipe.java b/src/main/java/net/minecraftforge/oredict/ShapelessOreRecipe.java index ad248a4d36..59a3bc32aa 100644 --- a/src/main/java/net/minecraftforge/oredict/ShapelessOreRecipe.java +++ b/src/main/java/net/minecraftforge/oredict/ShapelessOreRecipe.java @@ -37,6 +37,7 @@ import javax.annotation.Nonnull; public class ShapelessOreRecipe implements IRecipe { + @Nonnull protected ItemStack output = ItemStack.EMPTY; protected NonNullList input = NonNullList.create(); @@ -100,10 +101,12 @@ public class ShapelessOreRecipe implements IRecipe public int getRecipeSize(){ return input.size(); } @Override + @Nonnull public ItemStack getRecipeOutput(){ return output; } @Override - public ItemStack getCraftingResult(InventoryCrafting var1){ return output.copy(); } + @Nonnull + public ItemStack getCraftingResult(@Nonnull InventoryCrafting var1){ return output.copy(); } @SuppressWarnings("unchecked") @Override @@ -169,6 +172,7 @@ public class ShapelessOreRecipe implements IRecipe } @Override + @Nonnull public NonNullList getRemainingItems(InventoryCrafting inv) //getRecipeLeftovers { return ForgeHooks.defaultRecipeGetRemainingItems(inv); diff --git a/src/main/java/net/minecraftforge/server/console/TerminalConsoleAppender.java b/src/main/java/net/minecraftforge/server/console/TerminalConsoleAppender.java index a383d64f0e..1ea39f38d3 100644 --- a/src/main/java/net/minecraftforge/server/console/TerminalConsoleAppender.java +++ b/src/main/java/net/minecraftforge/server/console/TerminalConsoleAppender.java @@ -46,6 +46,8 @@ import com.google.common.base.Functions; import jline.TerminalFactory; import jline.console.ConsoleReader; +import javax.annotation.Nullable; + @Plugin(name = "TerminalConsole", category = "Core", elementType = "appender", printObject = true) public class TerminalConsoleAppender extends AbstractAppender { @@ -75,6 +77,7 @@ public class TerminalConsoleAppender extends AbstractAppender } @PluginFactory + @Nullable public static TerminalConsoleAppender createAppender(@PluginAttribute("name") String name, @PluginElement("Filters") Filter filter, @PluginElement("Layout") Layout layout, @PluginAttribute("ignoreExceptions") String ignore) { diff --git a/src/test/java/net/minecraftforge/debug/DynBucketTest.java b/src/test/java/net/minecraftforge/debug/DynBucketTest.java index e34bf82e8d..841bafef91 100644 --- a/src/test/java/net/minecraftforge/debug/DynBucketTest.java +++ b/src/test/java/net/minecraftforge/debug/DynBucketTest.java @@ -22,6 +22,7 @@ import net.minecraft.util.ActionResult; import net.minecraft.util.EnumActionResult; import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.text.TextComponentString; import net.minecraft.util.EnumFacing; @@ -108,7 +109,7 @@ public class DynBucketTest ModelLoader.setCustomMeshDefinition(dynBottle, new ItemMeshDefinition() { @Override - public ModelResourceLocation getModelLocation(ItemStack stack) + public ModelResourceLocation getModelLocation(@Nonnull ItemStack stack) { return bottle; } @@ -147,22 +148,26 @@ public class DynBucketTest @SubscribeEvent public void onBucketFill(FillBucketEvent event) { - IBlockState state = event.getWorld().getBlockState(event.getTarget().getBlockPos()); - if (state.getBlock() instanceof IFluidBlock) + RayTraceResult target = event.getTarget(); + if (target != null) { - Fluid fluid = ((IFluidBlock) state.getBlock()).getFluid(); - FluidStack fs = new FluidStack(fluid, Fluid.BUCKET_VOLUME); - - ItemStack bucket = event.getEmptyBucket(); - IFluidHandlerItem fluidHandler = FluidUtil.getFluidHandler(bucket); - if (fluidHandler != null) + IBlockState state = event.getWorld().getBlockState(target.getBlockPos()); + if (state.getBlock() instanceof IFluidBlock) { - int fillAmount = fluidHandler.fill(fs, true); - if (fillAmount > 0) + Fluid fluid = ((IFluidBlock) state.getBlock()).getFluid(); + FluidStack fs = new FluidStack(fluid, Fluid.BUCKET_VOLUME); + + ItemStack bucket = event.getEmptyBucket(); + IFluidHandlerItem fluidHandler = FluidUtil.getFluidHandler(bucket); + if (fluidHandler != null) { - ItemStack filledBucket = fluidHandler.getContainer(); - event.setFilledBucket(filledBucket); - event.setResult(Result.ALLOW); + int fillAmount = fluidHandler.fill(fs, true); + if (fillAmount > 0) + { + ItemStack filledBucket = fluidHandler.getContainer(); + event.setFilledBucket(filledBucket); + event.setResult(Result.ALLOW); + } } } } diff --git a/src/test/java/net/minecraftforge/debug/FluidPlacementTest.java b/src/test/java/net/minecraftforge/debug/FluidPlacementTest.java index f65ccf09b0..a1f3f0e2d1 100644 --- a/src/test/java/net/minecraftforge/debug/FluidPlacementTest.java +++ b/src/test/java/net/minecraftforge/debug/FluidPlacementTest.java @@ -86,7 +86,7 @@ public class FluidPlacementTest ModelBakery.registerItemVariants(fluid); ModelLoader.setCustomMeshDefinition(fluid, new ItemMeshDefinition() { - public ModelResourceLocation getModelLocation(ItemStack stack) + public ModelResourceLocation getModelLocation(@Nonnull ItemStack stack) { return fluidLocation; } @@ -214,6 +214,7 @@ public class FluidPlacementTest } @Override + @Nullable public FluidStack getFluid(ItemStack container) { container = container.copy(); @@ -234,7 +235,7 @@ public class FluidPlacementTest } @Override - public void getSubItems(@Nonnull Item itemIn, @Nonnull CreativeTabs tab, @Nonnull NonNullList subItems) + public void getSubItems(@Nonnull Item itemIn, @Nullable CreativeTabs tab, @Nonnull NonNullList subItems) { Fluid[] fluids = new Fluid[]{FluidRegistry.WATER, FluidRegistry.LAVA, FiniteFluid.instance, ModelFluidDebug.TestFluid.instance}; // add 16 variable fillings diff --git a/src/test/java/net/minecraftforge/debug/ModelFluidDebug.java b/src/test/java/net/minecraftforge/debug/ModelFluidDebug.java index a63aabcdf2..b71a4a2c47 100644 --- a/src/test/java/net/minecraftforge/debug/ModelFluidDebug.java +++ b/src/test/java/net/minecraftforge/debug/ModelFluidDebug.java @@ -22,6 +22,8 @@ import net.minecraftforge.fml.common.SidedProxy; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.registry.GameRegistry; +import javax.annotation.Nonnull; + @Mod(modid = ModelFluidDebug.MODID, name = "ForgeDebugModelFluid", version = ModelFluidDebug.VERSION, acceptableRemoteVersions = "*") public class ModelFluidDebug { @@ -81,21 +83,21 @@ public class ModelFluidDebug ModelBakery.registerItemVariants(milk); ModelLoader.setCustomMeshDefinition(fluid, new ItemMeshDefinition() { - public ModelResourceLocation getModelLocation(ItemStack stack) + public ModelResourceLocation getModelLocation(@Nonnull ItemStack stack) { return fluidLocation; } }); ModelLoader.setCustomMeshDefinition(gas, new ItemMeshDefinition() { - public ModelResourceLocation getModelLocation(ItemStack stack) + public ModelResourceLocation getModelLocation(@Nonnull ItemStack stack) { return gasLocation; } }); ModelLoader.setCustomMeshDefinition(milk, new ItemMeshDefinition() { - public ModelResourceLocation getModelLocation(ItemStack stack) + public ModelResourceLocation getModelLocation(@Nonnull ItemStack stack) { return milkLocation; }