001    package net.minecraft.util;
002    
003    import cpw.mods.fml.relauncher.Side;
004    import cpw.mods.fml.relauncher.SideOnly;
005    import net.minecraft.client.Minecraft;
006    
007    @SideOnly(Side.CLIENT)
008    public class Timer
009    {
010        /** The number of timer ticks per second of real time */
011        float ticksPerSecond;
012    
013        /**
014         * The time reported by the high-resolution clock at the last call of updateTimer(), in seconds
015         */
016        private double lastHRTime;
017    
018        /**
019         * How many full ticks have turned over since the last call to updateTimer(), capped at 10.
020         */
021        public int elapsedTicks;
022    
023        /**
024         * How much time has elapsed since the last tick, in ticks, for use by display rendering routines (range: 0.0 -
025         * 1.0).  This field is frozen if the display is paused to eliminate jitter.
026         */
027        public float renderPartialTicks;
028    
029        /**
030         * A multiplier to make the timer (and therefore the game) go faster or slower.  0.5 makes the game run at half-
031         * speed.
032         */
033        public float timerSpeed = 1.0F;
034    
035        /**
036         * How much time has elapsed since the last tick, in ticks (range: 0.0 - 1.0).
037         */
038        public float elapsedPartialTicks = 0.0F;
039    
040        /**
041         * The time reported by the system clock at the last sync, in milliseconds
042         */
043        private long lastSyncSysClock;
044    
045        /**
046         * The time reported by the high-resolution clock at the last sync, in milliseconds
047         */
048        private long lastSyncHRClock;
049        private long field_74285_i;
050    
051        /**
052         * A ratio used to sync the high-resolution clock to the system clock, updated once per second
053         */
054        private double timeSyncAdjustment = 1.0D;
055    
056        public Timer(float par1)
057        {
058            this.ticksPerSecond = par1;
059            this.lastSyncSysClock = Minecraft.getSystemTime();
060            this.lastSyncHRClock = System.nanoTime() / 1000000L;
061        }
062    
063        /**
064         * Updates all fields of the Timer using the current time
065         */
066        public void updateTimer()
067        {
068            long var1 = Minecraft.getSystemTime();
069            long var3 = var1 - this.lastSyncSysClock;
070            long var5 = System.nanoTime() / 1000000L;
071            double var7 = (double)var5 / 1000.0D;
072    
073            if (var3 <= 1000L && var3 >= 0L)
074            {
075                this.field_74285_i += var3;
076    
077                if (this.field_74285_i > 1000L)
078                {
079                    long var9 = var5 - this.lastSyncHRClock;
080                    double var11 = (double)this.field_74285_i / (double)var9;
081                    this.timeSyncAdjustment += (var11 - this.timeSyncAdjustment) * 0.20000000298023224D;
082                    this.lastSyncHRClock = var5;
083                    this.field_74285_i = 0L;
084                }
085    
086                if (this.field_74285_i < 0L)
087                {
088                    this.lastSyncHRClock = var5;
089                }
090            }
091            else
092            {
093                this.lastHRTime = var7;
094            }
095    
096            this.lastSyncSysClock = var1;
097            double var13 = (var7 - this.lastHRTime) * this.timeSyncAdjustment;
098            this.lastHRTime = var7;
099    
100            if (var13 < 0.0D)
101            {
102                var13 = 0.0D;
103            }
104    
105            if (var13 > 1.0D)
106            {
107                var13 = 1.0D;
108            }
109    
110            this.elapsedPartialTicks = (float)((double)this.elapsedPartialTicks + var13 * (double)this.timerSpeed * (double)this.ticksPerSecond);
111            this.elapsedTicks = (int)this.elapsedPartialTicks;
112            this.elapsedPartialTicks -= (float)this.elapsedTicks;
113    
114            if (this.elapsedTicks > 10)
115            {
116                this.elapsedTicks = 10;
117            }
118    
119            this.renderPartialTicks = this.elapsedPartialTicks;
120        }
121    }