Time processor
This commit is contained in:
@@ -32,21 +32,52 @@ Bean:
|
|||||||
|
|
||||||
`keepAliveInterval` - как часто (в ms) отправлять клиентам пакет `KeepAlive`
|
`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
|
### GameLoop
|
||||||
|
|
||||||
Bean:
|
Bean:
|
||||||
|
|
||||||
```xml
|
```xml
|
||||||
<bean id="gameLoop" class="mc.core.GameLoop">
|
<bean id="gameLoop" class="mc.core.GameLoop">
|
||||||
<property name="startGameTime" value="6000"/>
|
<property name="gameTimer" ref="timeProcessor"/>
|
||||||
<property name="timeMode" value="realtime"/>
|
|
||||||
</bean>
|
</bean>
|
||||||
```
|
```
|
||||||
|
|
||||||
`timeMode` - режим хода времени суток.
|
`gameTimer` - бин, управляющий ходом времени
|
||||||
|
|
||||||
Есть три режима:
|
|
||||||
|
|
||||||
* `0` или `idle` - полная остановка хода времени суток;
|
|
||||||
* `normal` - стандартных ход времени (20 минут = 1 игровой день);
|
|
||||||
* `realtime` - соответствует реальному системному времени.
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ package mc.core;
|
|||||||
|
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import mc.core.time.TimeProcessor;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
@@ -23,14 +24,13 @@ public class GameLoop extends Thread {
|
|||||||
private int lowTps;
|
private int lowTps;
|
||||||
|
|
||||||
/* Time */
|
/* Time */
|
||||||
private long gameTime;
|
@Setter
|
||||||
private Runnable gameTimeUpdateFunc;
|
private TimeProcessor gameTimer;
|
||||||
|
|
||||||
public GameLoop() {
|
public GameLoop() {
|
||||||
super();
|
super();
|
||||||
setTps(20);
|
setTps(20);
|
||||||
setPercentWarnLowTps(5);
|
setPercentWarnLowTps(5);
|
||||||
setStartGameTime(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPercentWarnLowTps(int value) {
|
public void setPercentWarnLowTps(int value) {
|
||||||
@@ -51,42 +51,6 @@ public class GameLoop extends Thread {
|
|||||||
this.pause = (1000 / tps);
|
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
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
log.info("Target TPS: {}; Low TPS: {}", tps, lowTps);
|
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);
|
playerManager.getBroadcastChannel().sendTimeUpdate(gameTime);
|
||||||
|
|
||||||
/* --- --- --- */
|
/* --- --- --- */
|
||||||
|
|||||||
14
core/src/main/java/mc/core/time/IdleTime.java
Normal file
14
core/src/main/java/mc/core/time/IdleTime.java
Normal 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;
|
||||||
|
}
|
||||||
39
core/src/main/java/mc/core/time/RealTime.java
Normal file
39
core/src/main/java/mc/core/time/RealTime.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
21
core/src/main/java/mc/core/time/TimePerTick.java
Normal file
21
core/src/main/java/mc/core/time/TimePerTick.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
9
core/src/main/java/mc/core/time/TimeProcessor.java
Normal file
9
core/src/main/java/mc/core/time/TimeProcessor.java
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* DmitriyMX <dimon550@gmail.com>
|
||||||
|
* 2018-05-01
|
||||||
|
*/
|
||||||
|
package mc.core.time;
|
||||||
|
|
||||||
|
public interface TimeProcessor {
|
||||||
|
long getGameTime();
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user