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 единиц каждую секунду. + *

+ * + *

Временные промежутки:

+ * + * + * @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) {