diff --git a/core/README.MD b/core/README.MD
index 863eaa2..6176db3 100644
--- a/core/README.MD
+++ b/core/README.MD
@@ -32,21 +32,52 @@ Bean:
`keepAliveInterval` - как часто (в ms) отправлять клиентам пакет `KeepAlive`
+### IdleTime
+
+Implements: `mc.core.time.TimeProcessor`
+
+Bean:
+
+```xml
+
+
+
+```
+
+в качестве параметра конструктора указывается стартовое время.
+
+### TimePerTick
+
+Implements: `mc.core.time.TimeProcessor`
+
+Bean:
+
+```xml
+
+
+
+```
+
+в качестве параметра указывается стартовое время.
+
+### RealTime
+
+Implements: `mc.core.time.TimeProcessor`
+
+Bean:
+
+```xml
+
+```
+
### GameLoop
Bean:
```xml
-
-
+
```
-`timeMode` - режим хода времени суток.
-
-Есть три режима:
-
-* `0` или `idle` - полная остановка хода времени суток;
-* `normal` - стандартных ход времени (20 минут = 1 игровой день);
-* `realtime` - соответствует реальному системному времени.
\ No newline at end of file
+`gameTimer` - бин, управляющий ходом времени
diff --git a/core/src/main/java/mc/core/GameLoop.java b/core/src/main/java/mc/core/GameLoop.java
index d50f7c9..3865dd6 100644
--- a/core/src/main/java/mc/core/GameLoop.java
+++ b/core/src/main/java/mc/core/GameLoop.java
@@ -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);
/* --- --- --- */
diff --git a/core/src/main/java/mc/core/time/IdleTime.java b/core/src/main/java/mc/core/time/IdleTime.java
new file mode 100644
index 0000000..8926486
--- /dev/null
+++ b/core/src/main/java/mc/core/time/IdleTime.java
@@ -0,0 +1,14 @@
+/*
+ * DmitriyMX
+ * 2018-05-01
+ */
+package mc.core.time;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+public class IdleTime implements TimeProcessor {
+ @Getter
+ private final long gameTime;
+}
diff --git a/core/src/main/java/mc/core/time/RealTime.java b/core/src/main/java/mc/core/time/RealTime.java
new file mode 100644
index 0000000..ffad2b3
--- /dev/null
+++ b/core/src/main/java/mc/core/time/RealTime.java
@@ -0,0 +1,39 @@
+/*
+ * DmitriyMX
+ * 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;
+ }
+}
diff --git a/core/src/main/java/mc/core/time/TimePerTick.java b/core/src/main/java/mc/core/time/TimePerTick.java
new file mode 100644
index 0000000..25e3615
--- /dev/null
+++ b/core/src/main/java/mc/core/time/TimePerTick.java
@@ -0,0 +1,21 @@
+/*
+ * DmitriyMX
+ * 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;
+ }
+}
diff --git a/core/src/main/java/mc/core/time/TimeProcessor.java b/core/src/main/java/mc/core/time/TimeProcessor.java
new file mode 100644
index 0000000..05e96cd
--- /dev/null
+++ b/core/src/main/java/mc/core/time/TimeProcessor.java
@@ -0,0 +1,9 @@
+/*
+ * DmitriyMX
+ * 2018-05-01
+ */
+package mc.core.time;
+
+public interface TimeProcessor {
+ long getGameTime();
+}