From 346d64aea5aef89f2a2ea32831915bc0d339121e Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 8 May 2021 22:31:36 +0300 Subject: [PATCH] SetExperiencePacket --- protocol/src/main/java/mc/protocol/State.java | 1 + .../packets/server/SetExperiencePacket.java | 35 +++++++++++++++++++ .../main/java/mc/server/PacketHandler.java | 29 ++++++++++++++- 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 protocol/src/main/java/mc/protocol/packets/server/SetExperiencePacket.java diff --git a/protocol/src/main/java/mc/protocol/State.java b/protocol/src/main/java/mc/protocol/State.java index 70cfb0f..d634b08 100644 --- a/protocol/src/main/java/mc/protocol/State.java +++ b/protocol/src/main/java/mc/protocol/State.java @@ -60,6 +60,7 @@ public enum State { JoinGamePacket.class, 0x23, PlayerAbilitiesPacket.class,0x2C, SPlayerPositionAndLookPacket.class, 0x2F, + SetExperiencePacket.class, 0x40, SpawnPositionPacket.class, 0x46 ) ); diff --git a/protocol/src/main/java/mc/protocol/packets/server/SetExperiencePacket.java b/protocol/src/main/java/mc/protocol/packets/server/SetExperiencePacket.java new file mode 100644 index 0000000..7277c8b --- /dev/null +++ b/protocol/src/main/java/mc/protocol/packets/server/SetExperiencePacket.java @@ -0,0 +1,35 @@ +package mc.protocol.packets.server; + +import lombok.Data; +import mc.protocol.io.NetByteBuf; +import mc.protocol.packets.ServerSidePacket; + +/** + * Set Experience packet. + * + *

Структура пакета

+ *
+ * | FIELD            | TYPE     | NOTES                  |
+ * |------------------|----------|------------------------|
+ * | Experience bar   | Float    | Значение от 0.0 до 1.0 |
+ * | Level            | VarInt   |                        |
+ * | Total Experience | VarInt   |                        |
+ * 
+ * + * @see Set Experience + * @see Experience: Leveling up + */ +@Data +public class SetExperiencePacket implements ServerSidePacket { + + private float experienceBar; + private int level; + private int totalExperience; + + @Override + public void writeSelf(NetByteBuf netByteBuf) { + netByteBuf.writeFloat(this.experienceBar); + netByteBuf.writeVarInt(this.level); + netByteBuf.writeVarInt(this.totalExperience); + } +} diff --git a/server/src/main/java/mc/server/PacketHandler.java b/server/src/main/java/mc/server/PacketHandler.java index fad97df..893e8cf 100644 --- a/server/src/main/java/mc/server/PacketHandler.java +++ b/server/src/main/java/mc/server/PacketHandler.java @@ -2,7 +2,8 @@ package mc.server; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import mc.protocol.*; +import mc.protocol.ProtocolConstant; +import mc.protocol.State; import mc.protocol.api.ConnectionContext; import mc.protocol.model.Location; import mc.protocol.model.Look; @@ -26,6 +27,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 +69,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 +125,30 @@ public class PacketHandler { context.send(pingPacket); context.flushSending(); + + // -- Эксперименты -- // + + var setExperiencePacket = new SetExperiencePacket(); + setExperiencePacket.setExperienceBar(0f); + setExperiencePacket.setLevel(0); + setExperiencePacket.setTotalExperience(100); + + while (true) { + context.sendNow(setExperiencePacket); + + setExperiencePacket.setExperienceBar(setExperiencePacket.getExperienceBar() + 0.01f); + setExperiencePacket.setLevel(setExperiencePacket.getLevel() + 1); + if (setExperiencePacket.getExperienceBar() > 1.0f) { + setExperiencePacket.setExperienceBar(0f); + setExperiencePacket.setLevel(0); + } + + try { + TimeUnit.MILLISECONDS.sleep(10); + } catch (InterruptedException e) { + break; + } + } } private static String faviconToBase64(Path iconPath) {