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(); +}