Files
minecraft-pe-0.6.1/src/client/Timer.h
2026-03-02 22:04:18 +03:00

125 lines
3.4 KiB
C++
Executable File

#ifndef NET_MINECRAFT_CLIENT__Timer_H__
#define NET_MINECRAFT_CLIENT__Timer_H__
//package net.minecraft.client;
#include "../platform/time.h"
class Timer
{
public:
Timer(float ticksPerSecond)
: ticksPerSecond(ticksPerSecond),
adjustTime(1.0f),
timeScale(1.0f),
passedTime(0)
{
lastMs = getTimeMs();
lastMsSysTime = lastMs;
lastTime = lastMs / 1000.0f;
}
void advanceTime() {
long nowMs = getTimeMs();
long passedMs = nowMs - lastMs;
long msSysTime = nowMs;//System.nanoTime() / 1000000;
if (passedMs > 1000) {
long passedMsSysTime = msSysTime - lastMsSysTime;
if (passedMsSysTime == 0)
passedMs = passedMsSysTime = 1;
float adjustTimeT = passedMs / (float) passedMsSysTime;
adjustTime += (adjustTimeT - adjustTime) * 0.2f;
lastMs = nowMs;
lastMsSysTime = msSysTime;
}
if (passedMs < 0) {
lastMs = nowMs;
lastMsSysTime = msSysTime;
}
float now = msSysTime / 1000.0f;
float passedSeconds = (now - lastTime) * adjustTime;
lastTime = now;
if (passedSeconds < 0) passedSeconds = 0;
if (passedSeconds > 1) passedSeconds = 1;
//LOGI("passed s: %f\n", passedSeconds);
passedTime += passedSeconds * timeScale * ticksPerSecond;
ticks = (int) passedTime;
passedTime -= ticks;
if (ticks > MAX_TICKS_PER_UPDATE) ticks = MAX_TICKS_PER_UPDATE;
a = passedTime;
}
/**
* Advances time the max number of ticks per second.
*/
void advanceTimeQuickly() {
float passedSeconds = (float) MAX_TICKS_PER_UPDATE / (float) ticksPerSecond;
passedTime += passedSeconds * timeScale * ticksPerSecond;
ticks = (int) passedTime;
passedTime -= ticks;
a = passedTime;
lastMs = getTimeMs();//System.currentTimeMillis();
lastMsSysTime = lastMs;
}
void skipTime() {
long nowMs = getTimeMs();//System.currentTimeMillis();
long passedMs = nowMs - lastMs;
long msSysTime = nowMs;//System.nanoTime() / 1000000;
if (passedMs > 1000) {
long passedMsSysTime = msSysTime - lastMsSysTime;
if (passedMsSysTime == 0)
passedMs = passedMsSysTime = 1;
float adjustTimeT = passedMs / (float) passedMsSysTime;
adjustTime += (adjustTimeT - adjustTime) * 0.2f;
lastMs = nowMs;
lastMsSysTime = msSysTime;
}
if (passedMs < 0) {
lastMs = nowMs;
lastMsSysTime = msSysTime;
}
float now = msSysTime / 1000.0f;
float passedSeconds = (now - lastTime) * adjustTime;
lastTime = now;
if (passedSeconds < 0) passedSeconds = 0;
if (passedSeconds > 1) passedSeconds = 1;
passedTime += passedSeconds * timeScale * ticksPerSecond;
ticks = (int) 0;
if (ticks > MAX_TICKS_PER_UPDATE) ticks = MAX_TICKS_PER_UPDATE;
passedTime -= ticks;
}
public:
float ticksPerSecond;
int ticks;
float a;
float timeScale;
float passedTime;
private:
static const int MAX_TICKS_PER_UPDATE = 10;
float lastTime;
long lastMs;
long lastMsSysTime;
float adjustTime;
};
#endif /*NET_MINECRAFT_CLIENT__Timer_H__*/