Archived
0

Time processor

This commit is contained in:
2018-05-01 23:46:30 +03:00
parent 81aa26c593
commit c845d9dcb6
6 changed files with 127 additions and 52 deletions

View File

@@ -32,21 +32,52 @@ Bean:
`keepAliveInterval` - как часто (в ms) отправлять клиентам пакет `KeepAlive`
### IdleTime
Implements: `mc.core.time.TimeProcessor`
Bean:
```xml
<bean id="idleTime" class="mc.core.time.IdleTime">
<constructor-arg index="0" type="long" value="1000"/>
</bean>
```
в качестве параметра конструктора указывается стартовое время.
### TimePerTick
Implements: `mc.core.time.TimeProcessor`
Bean:
```xml
<bean id="timePerTick" class="mc.core.time.TimePerTick">
<property name="startGameTime" value="1000"/>
</bean>
```
в качестве параметра указывается стартовое время.
### RealTime
Implements: `mc.core.time.TimeProcessor`
Bean:
```xml
<bean id="realTime" class="mc.core.time.RealTime"/>
```
### GameLoop
Bean:
```xml
<bean id="gameLoop" class="mc.core.GameLoop">
<property name="startGameTime" value="6000"/>
<property name="timeMode" value="realtime"/>
<property name="gameTimer" ref="timeProcessor"/>
</bean>
```
`timeMode` - режим хода времени суток.
Есть три режима:
* `0` или `idle` - полная остановка хода времени суток;
* `normal` - стандартных ход времени (20 минут = 1 игровой день);
* `realtime` - соответствует реальному системному времени.
`gameTimer` - бин, управляющий ходом времени

View File

@@ -6,6 +6,7 @@ package mc.core;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import mc.core.time.TimeProcessor;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Calendar;
@@ -23,14 +24,13 @@ public class GameLoop extends Thread {
private int lowTps;
/* Time */
private long gameTime;
private Runnable gameTimeUpdateFunc;
@Setter
private TimeProcessor gameTimer;
public GameLoop() {
super();
setTps(20);
setPercentWarnLowTps(5);
setStartGameTime(0);
}
public void setPercentWarnLowTps(int value) {
@@ -51,42 +51,6 @@ public class GameLoop extends Thread {
this.pause = (1000 / tps);
}
public void setStartGameTime(long value) {
this.gameTime = value;
}
public void setTimeMode(String mode) {
if (mode.equals("0") || mode.equalsIgnoreCase("idle")) {
gameTimeUpdateFunc = () -> {};
} else if (mode.equalsIgnoreCase("realtime")) {
gameTimeUpdateFunc = () -> {
final long DIFF = 21600L;
final long HOUR24 = 86400L;
final long SYSTIME = System.currentTimeMillis();
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(SYSTIME);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
long time = (SYSTIME - calendar.getTimeInMillis())/1000;
if (time < DIFF) time += HOUR24;
gameTime = (long) ((time - DIFF) / 3.6);
};
} else {
if (!mode.equalsIgnoreCase("normal")) {
log.warn("Unknown time mode: {}. Set normal mode", mode);
}
gameTimeUpdateFunc = () -> {
gameTime++;
if (gameTime > 24000) gameTime = 0;
};
}
}
@Override
public void run() {
log.info("Target TPS: {}; Low TPS: {}", tps, lowTps);
@@ -108,10 +72,7 @@ public class GameLoop extends Thread {
/* --- --- --- */
gameTimeUpdateFunc.run();
/* --- --- --- */
long gameTime = gameTimer.getGameTime();
playerManager.getBroadcastChannel().sendTimeUpdate(gameTime);
/* --- --- --- */

View File

@@ -0,0 +1,14 @@
/*
* DmitriyMX <dimon550@gmail.com>
* 2018-05-01
*/
package mc.core.time;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
public class IdleTime implements TimeProcessor {
@Getter
private final long gameTime;
}

View File

@@ -0,0 +1,39 @@
/*
* DmitriyMX <dimon550@gmail.com>
* 2018-05-01
*/
package mc.core.time;
import java.util.Calendar;
public class RealTime implements TimeProcessor {
private static final long DIFF = 21600L;
private static final long HOUR24 = 86400L;
private final Calendar calendar = Calendar.getInstance();
private long lastUpdate = 0;
private long gameTime;
private void calcRealTime() {
lastUpdate = System.currentTimeMillis();
calendar.setTimeInMillis(lastUpdate);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
long time = (lastUpdate - calendar.getTimeInMillis())/1000;
if (time < DIFF) time += HOUR24;
gameTime = (long) ((time - DIFF) / 3.6);
}
@Override
public long getGameTime() {
if ((System.currentTimeMillis() - lastUpdate) > 1000) {
calcRealTime();
}
return gameTime;
}
}

View File

@@ -0,0 +1,21 @@
/*
* DmitriyMX <dimon550@gmail.com>
* 2018-05-01
*/
package mc.core.time;
public class TimePerTick implements TimeProcessor {
private long gameTime;
public void setStartGameTime(long value) {
gameTime = value;
}
@Override
public long getGameTime() {
gameTime++;
if (gameTime > 24000) gameTime = 0;
return gameTime;
}
}

View File

@@ -0,0 +1,9 @@
/*
* DmitriyMX <dimon550@gmail.com>
* 2018-05-01
*/
package mc.core.time;
public interface TimeProcessor {
long getGameTime();
}