Buggy code:
public abstract class ProjectileWeapon extends ToolCore implements IAccuracy , IWindup { public ProjectileWeapon ( int baseDamage , String name ) { } @ SideOnly ( Side . CLIENT ) public CrosshairType getCrosshairType ( ) { } @ Override public boolean zoomOnWindup ( ItemStack itemStack ) { } @ Override public float getZoom ( ItemStack itemStack ) { } public abstract ItemStack searchForAmmo ( EntityPlayer player , ItemStack weapon ) { } protected abstract Entity createProjectile ( ItemStack ammo , World world , EntityPlayer player , float speed , float accuracy , float windup ) { } public abstract float minAccuracy ( ItemStack itemStack ) { } public abstract float maxAccuracy ( ItemStack itemStack ) { } public float getAccuracy ( ItemStack itemStack , EntityPlayer player ) { } public float getAccuracy ( ItemStack itemStack , int time ) { } public int getWindupTime ( ItemStack itemStack ) { } public float getWindupProgress ( ItemStack itemStack , EntityPlayer player ) { } public float getWindupProgress ( ItemStack itemStack , int timeInUse ) { } public float getProjectileSpeed ( ItemStack itemStack ) { } @ Override public EnumAction getItemUseAction ( ItemStack par1ItemStack ) { } @ Override public int getMaxItemUseDuration ( ItemStack par1ItemStack ) { } @ Override public ItemStack onItemRightClick ( ItemStack stack , World world , EntityPlayer player ) { } @ Override public void onPlayerStoppedUsing ( ItemStack weapon , World world , EntityPlayer player , int useRemaining ) { } public abstract void playFiringSound ( World world , EntityPlayer player , ItemStack weapon , ItemStack ammo , float speed , float accuracy ) { } public HashMap < Integer , IIcon [ ] > animationHeadIcons = new HashMap < Integer , IIcon [ ] > ( ) ; public HashMap < Integer , IIcon [ ] > animationHandleIcons = new HashMap < Integer , IIcon [ ] > ( ) ; public HashMap < Integer , IIcon [ ] > animationAccessoryIcons = new HashMap < Integer , IIcon [ ] > ( ) ; public HashMap < Integer , IIcon [ ] > animationExtraIcons = new HashMap < Integer , IIcon [ ] > ( ) ; public HashMap < Integer , IIcon [ ] > animationEffectIcons = new HashMap < Integer , IIcon [ ] > ( ) ; protected boolean animateLayer ( int renderPass ) { } @ Override public IIcon getIcon ( ItemStack stack , int renderPass , EntityPlayer player , ItemStack usingItem , int useRemaining ) { } protected IIcon getCorrectAnimationIcon ( Map < Integer , IIcon [ ] > icons , int id , float progress ) { float count = ( icons . get ( ( - 1 ) ) . length ) - 1 ; int step = Math . round ( ( progress * count ) ) ; <START_BUG> step = Math . min ( 0 , step ) ; <END_BUG> if ( icons . containsKey ( id ) ) return icons . get ( id ) [ step ] ; return icons . get ( ( - 1 ) ) [ step ] ; } @ Override @ SideOnly ( Side . CLIENT ) public IIcon getIcon ( ItemStack stack , int renderPass ) { } @ Override public void registerIcons ( IIconRegister iconRegister ) { } private void addAnimationIcons ( HashMap < Integer , String > textures , HashMap < Integer , IIcon [ ] > icons , IIconRegister iconRegister , String standard ) { } @ SideOnly ( Side . CLIENT ) @ Override public void addInformation ( ItemStack stack , EntityPlayer player , List list , boolean par4 ) { } }

Fix:
step = Math . max ( 0 , step ) ;