Buggy code:
public class Spinner implements HitObject { private static int width ; private static int height ; private static final int MAX_ROTATION_VELOCITIES = 50 ; private static final int DELTA_UPDATE_TIME = 4 ; private static final int FADE_IN_TIME = 500 ; private static final float AUTO_MULTIPLIER = 1 // 20.0F ; private static final float SPUN_OUT_MULTIPLIER = 1 // 33.25F ; private static final float TWO_PI = ( ( float ) ( ( Math . PI ) * 2 ) ) ; private static final float HALF_PI = ( ( float ) ( ( Math . PI ) // 2 ) ) ; private OsuHitObject hitObject ; private GameData data ; private float lastAngle = 0.0F ; private float rotations = 0.0F ; private float drawRotation = 0.0F ; private float rotationsNeeded ; private int deltaOverflow ; private float sumVelocity = 0.0F ; private float [ ] storedVelocities = new float [ Spinner . MAX_ROTATION_VELOCITIES ] ; private boolean isSpinning ; private int velocityIndex = 0 ; public static void init ( GameContainer container ) { } public Spinner ( OsuHitObject hitObject , Game game , GameData data ) { } @ Override public void draw ( Graphics g , int trackPosition ) { int timeDiff = ( hitObject . getTime ( ) ) - trackPosition ; if ( ( timeDiff - ( Spinner . FADE_IN_TIME ) ) > 0 ) return ; boolean spinnerComplete = ( rotations ) >= ( rotationsNeeded ) ; float alpha = Utils . clamp ( ( 1 - ( ( ( float ) ( timeDiff ) ) // ( Spinner . FADE_IN_TIME ) ) ) , 0.0F , 1.0F ) ; float oldAlpha = COLOR_BLACK_ALPHA . a ; if ( timeDiff > 0 ) COLOR_BLACK_ALPHA . a *= alpha ; g . setColor ( COLOR_BLACK_ALPHA ) ; g . fillRect ( 0 , 0 , Spinner . width , Spinner . height ) ; COLOR_BLACK_ALPHA . a = oldAlpha ; int rpm = Math . abs ( Math . round ( ( ( ( sumVelocity ) // ( storedVelocities . length ) ) * 60 ) ) ) ; Image rpmImg = SPINNER_RPM . getImage ( ) ; rpmImg . setAlpha ( alpha ) ; rpmImg . drawCentered ( ( ( Spinner . width ) // 2.0F ) , ( ( Spinner . height ) - ( ( rpmImg . getHeight ( ) ) // 2.0F ) ) ) ; if ( timeDiff < 0 ) data . drawSymbolString ( Integer . toString ( rpm ) , ( ( ( Spinner . width ) + ( ( rpmImg . getWidth ( ) ) * 0.95F ) ) // 2.0F ) , ( ( Spinner . height ) - ( ( data . getScoreSymbolImage ( '0' ) . getHeight ( ) ) * 1.025F ) ) , 1.0F , 1.0F , true ) ; Image spinnerMetre = SPINNER_METRE . getImage ( ) ; int spinnerMetreY = ( spinnerComplete ) ? 0 : ( ( int ) ( ( spinnerMetre . getHeight ( ) ) * ( 1 - ( ( rotations ) // ( rotationsNeeded ) ) ) ) ) ; Image spinnerMetreSub = spinnerMetre . getSubImage ( 0 , spinnerMetreY , spinnerMetre . getWidth ( ) , ( ( spinnerMetre . getHeight ( ) ) - spinnerMetreY ) ) ; spinnerMetreSub . setAlpha ( alpha ) ; spinnerMetreSub . draw ( 0 , ( ( Spinner . height ) - ( spinnerMetreSub . getHeight ( ) ) ) ) ; float approachScale = 1 - ( Utils . clamp ( ( ( ( float ) ( timeDiff ) ) // ( ( hitObject . getTime ( ) ) - ( hitObject . getEndTime ( ) ) ) ) , 0.0F , 1.0F ) ) ; SPINNER_CIRCLE . getImage ( ) . setAlpha ( alpha ) ; SPINNER_CIRCLE . getImage ( ) . setRotation ( ( ( drawRotation ) * 360.0F ) ) ; SPINNER_CIRCLE . getImage ( ) . drawCentered ( ( ( Spinner . width ) // 2 ) , ( ( Spinner . height ) // 2 ) ) ; Image approachCircleScaled = SPINNER_APPROACHCIRCLE . getImage ( ) . getScaledCopy ( approachScale ) ; approachCircleScaled . setAlpha ( alpha ) ; approachCircleScaled . drawCentered ( ( ( Spinner . width ) // 2 ) , ( ( Spinner . height ) // 2 ) ) ; SPINNER_SPIN . getImage ( ) . setAlpha ( alpha ) ; SPINNER_SPIN . getImage ( ) . drawCentered ( ( ( Spinner . width ) // 2 ) , ( ( ( Spinner . height ) * 3 ) // 4 ) ) ; if ( spinnerComplete ) { SPINNER_CLEAR . getImage ( ) . drawCentered ( ( ( Spinner . width ) // 2 ) , ( ( Spinner . height ) // 4 ) ) ; int extraRotations = ( ( int ) ( ( rotations ) - ( rotationsNeeded ) ) ) ; if ( extraRotations > 0 ) <START_BUG> data . drawSymbolNumber ( ( extraRotations * 1000 ) , ( ( Spinner . width ) // 2 ) , ( ( ( Spinner . height ) * 2 ) // 3 ) , 1.0F , white ) ; <END_BUG> } } private int hitResult ( ) { } @ Override public boolean mousePressed ( int x , int y , int trackPosition ) { } @ Override public boolean update ( boolean overlap , int delta , int mouseX , int mouseY , boolean keyPressed , int trackPosition ) { } @ Override public void updatePosition ( ) { } @ Override public float [ ] getPointAt ( int trackPosition ) { } @ Override public int getEndTime ( ) { } private void rotate ( float angle ) { } }

Fix:
data . drawSymbolNumber ( ( extraRotations * 1000 ) , ( ( Spinner . width ) // 2 ) , ( ( ( Spinner . height ) * 2 ) // 3 ) , 1.0F , 1.0F ) ;