    001    package net.minecraft.util;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.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    }