diff --git a/protocol/src/main/java/mc/protocol/State.java b/protocol/src/main/java/mc/protocol/State.java
index 70cfb0f..1557405 100644
--- a/protocol/src/main/java/mc/protocol/State.java
+++ b/protocol/src/main/java/mc/protocol/State.java
@@ -60,7 +60,8 @@ public enum State {
JoinGamePacket.class, 0x23,
PlayerAbilitiesPacket.class,0x2C,
SPlayerPositionAndLookPacket.class, 0x2F,
- SpawnPositionPacket.class, 0x46
+ SpawnPositionPacket.class, 0x46,
+ TimeUpdatePacket.class, 0x47
)
);
diff --git a/protocol/src/main/java/mc/protocol/packets/server/TimeUpdatePacket.java b/protocol/src/main/java/mc/protocol/packets/server/TimeUpdatePacket.java
new file mode 100644
index 0000000..d643833
--- /dev/null
+++ b/protocol/src/main/java/mc/protocol/packets/server/TimeUpdatePacket.java
@@ -0,0 +1,45 @@
+package mc.protocol.packets.server;
+
+import lombok.Data;
+import mc.protocol.io.NetByteBuf;
+import mc.protocol.packets.ServerSidePacket;
+
+/**
+ * Обновление времени суток.
+ *
+ *
Структура пакета
+ *
+ * | FIELD | TYPE | NOTES |
+ * |-------------|------|----------------------------------------|
+ * | World Age | Long | Время жизни мира. В тиках (tick) |
+ * | Time of day | Long | Суточное время в тиках (tick), 0-24000 |
+ *
+ *
+ *
+ * Каждую секунду происходит 20 тиков.
+ * В игровых сутках 24000 тиков, т.е. игровые сутки в Minecraft длятся 20 минут.
+ * В Vanilla сервере значение "Time of day" увеличивается на 20 единиц каждую секунду.
+ *
+ *
+ * Временные промежутки:
+ *
+ * - 0 - восход солнца
+ * - 6000 - полдень
+ * - 12000 - закат
+ * - 18000 - полночь
+ *
+ *
+ * @see Time Update
+ */
+@Data
+public class TimeUpdatePacket implements ServerSidePacket {
+
+ private long worldAge;
+ private long timeOfDay;
+
+ @Override
+ public void writeSelf(NetByteBuf netByteBuf) {
+ netByteBuf.writeLong(this.worldAge);
+ netByteBuf.writeLong(this.timeOfDay);
+ }
+}
diff --git a/server/src/main/java/mc/server/PacketHandler.java b/server/src/main/java/mc/server/PacketHandler.java
index fad97df..a0b3004 100644
--- a/server/src/main/java/mc/server/PacketHandler.java
+++ b/server/src/main/java/mc/server/PacketHandler.java
@@ -26,6 +26,7 @@ import java.util.Base64;
import java.util.Collections;
import java.util.Random;
import java.util.UUID;
+import java.util.concurrent.TimeUnit;
@Slf4j
@RequiredArgsConstructor
@@ -67,6 +68,7 @@ public class PacketHandler {
context.sendNow(response);
}
+ @SuppressWarnings("java:S2189")
public void onLoginStart(ConnectionContext context, LoginStartPacket loginStartPacket) {
var loginSuccessPacket = new LoginSuccessPacket();
loginSuccessPacket.setUuid(UUID.randomUUID());
@@ -122,6 +124,28 @@ public class PacketHandler {
context.send(pingPacket);
context.flushSending();
+
+ // -- Эксперименты -- //
+
+ var timeUpdatePacket = new TimeUpdatePacket();
+ timeUpdatePacket.setWorldAge(0);
+ timeUpdatePacket.setTimeOfDay(0);
+
+ while (true) {
+ context.sendNow(timeUpdatePacket);
+
+ timeUpdatePacket.setTimeOfDay(timeUpdatePacket.getTimeOfDay() + 20);
+ if (timeUpdatePacket.getTimeOfDay() >= 24_000) {
+ timeUpdatePacket.setWorldAge(timeUpdatePacket.getWorldAge() + 1);
+ timeUpdatePacket.setTimeOfDay(0);
+ }
+
+ try {
+ TimeUnit.MILLISECONDS.sleep(5);
+ } catch (InterruptedException e) {
+ break;
+ }
+ }
}
private static String faviconToBase64(Path iconPath) {