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 }