private static int doRecurringEvents( int firedEvents, long startTime )
    {

        // fire all of the recurring events
        for ( Event e : recurringEvents )
        {
            if ( TimeHelper.isOver( startTime, MaxTickTime ) )
            {
                return firedEvents; // we've run out of time for this tick, let's keep the game running
            }
            if ( Sys.getTime() < e.executionTime )
            {
                continue; // the event hasn't been scheduled to run again yet
            }

            try
            {
                e.action.invoke( e.target, e.parameters ); // invoke the method
                if ( TimedEventsThrottled )
                {
                    firedEvents++; // we've fired a method
                }
            }
            catch ( Exception ex )
            {
                // something failed, tell the console
                Lumberjack.error( "Scheduler", "Failed to invoke \"%s()\"", e.action.getName() );
                Lumberjack.throwable( "Scheduler", ex );
            }

            if ( LogOutput )
            {
                Lumberjack.debug( "Scheduler", "Executed recurring event \"%s\"", e.action.getName() );
            }

            e.executionTime = TimeHelper.getDelay( e.delay ); // set the next execution time
        }

        return firedEvents;
    }