Skip to content

Commit 6059e8e

Browse files
feat: Add basic methods for using PacketSerializer with optional values (#17)
1 parent f005226 commit 6059e8e

File tree

4 files changed

+39
-32
lines changed

4 files changed

+39
-32
lines changed

src/main/java/net/hypixel/modapi/HypixelModAPI.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import net.hypixel.modapi.serializer.PacketSerializer;
1717

1818
import java.util.List;
19+
import java.util.Optional;
1920
import java.util.concurrent.CopyOnWriteArrayList;
2021

2122
public class HypixelModAPI {
@@ -65,9 +66,9 @@ public void handle(String identifier, PacketSerializer serializer) {
6566
}
6667

6768
// All responses contain a boolean of if the response is a success, if not then a further var int is included to identify the error
68-
if (!serializer.readBoolean()) {
69-
ErrorReason reason = ErrorReason.getById(serializer.readVarInt());
70-
throw new ModAPIException(identifier, reason);
69+
Optional<ErrorReason> errorReasonOptional = serializer.readOptional(PacketSerializer::readVarInt).map(ErrorReason::getById);
70+
if (errorReasonOptional.isPresent()) {
71+
throw new ModAPIException(identifier, errorReasonOptional.get());
7172
}
7273

7374
ClientboundHypixelPacket packet = registry.createClientboundPacket(identifier, serializer);

src/main/java/net/hypixel/modapi/packet/impl/clientbound/ClientboundLocationPacket.java

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,10 @@ public ClientboundLocationPacket(PacketSerializer serializer) {
4141
this.environment = Environment.getById(serializer.readVarInt()).orElseThrow(() -> new IllegalArgumentException("Invalid environment ID"));
4242
this.proxyName = serializer.readString();
4343
this.serverName = serializer.readString();
44-
this.serverType = serializer.readBoolean() ? ServerType.valueOf(serializer.readString()).orElse(null) : null;
45-
this.lobbyName = serializer.readBoolean() ? serializer.readString() : null;
46-
this.mode = serializer.readBoolean() ? serializer.readString() : null;
47-
this.map = serializer.readBoolean() ? serializer.readString() : null;
44+
this.serverType = serializer.readOptional(PacketSerializer::readString).flatMap(ServerType::valueOf).orElse(null);
45+
this.lobbyName = serializer.readOptionally(PacketSerializer::readString);
46+
this.mode = serializer.readOptionally(PacketSerializer::readString);
47+
this.map = serializer.readOptionally(PacketSerializer::readString);
4848
}
4949

5050
@Override
@@ -53,26 +53,10 @@ public void write(PacketSerializer serializer) {
5353
serializer.writeVarInt(environment.ordinal());
5454
serializer.writeString(proxyName);
5555
serializer.writeString(serverName);
56-
57-
serializer.writeBoolean(serverType != null);
58-
if (serverType != null) {
59-
serializer.writeString(serverType.name());
60-
}
61-
62-
serializer.writeBoolean(lobbyName != null);
63-
if (lobbyName != null) {
64-
serializer.writeString(lobbyName);
65-
}
66-
67-
serializer.writeBoolean(mode != null);
68-
if (mode != null) {
69-
serializer.writeString(mode);
70-
}
71-
72-
serializer.writeBoolean(map != null);
73-
if (map != null) {
74-
serializer.writeString(map);
75-
}
56+
serializer.writeOptionally(serverType, (s, t) -> s.writeString(t.name()));
57+
serializer.writeOptionally(lobbyName, PacketSerializer::writeString);
58+
serializer.writeOptionally(mode, PacketSerializer::writeString);
59+
serializer.writeOptionally(map, PacketSerializer::writeString);
7660
}
7761

7862
@Override

src/main/java/net/hypixel/modapi/packet/impl/clientbound/ClientboundPlayerInfoPacket.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public ClientboundPlayerInfoPacket(PacketSerializer serializer) {
3333
this.playerRank = PlayerRank.getById(serializer.readVarInt()).orElseThrow(() -> new IllegalArgumentException("Invalid player rank ID"));
3434
this.packageRank = PackageRank.getById(serializer.readVarInt()).orElseThrow(() -> new IllegalArgumentException("Invalid package rank ID"));
3535
this.monthlyPackageRank = MonthlyPackageRank.getById(serializer.readVarInt()).orElseThrow(() -> new IllegalArgumentException("Invalid monthly package rank ID"));
36-
this.prefix = serializer.readBoolean() ? serializer.readString() : null;
36+
this.prefix = serializer.readOptionally(PacketSerializer::readString);
3737
}
3838

3939
@Override
@@ -42,10 +42,7 @@ public void write(PacketSerializer serializer) {
4242
serializer.writeVarInt(playerRank.getId());
4343
serializer.writeVarInt(packageRank.getId());
4444
serializer.writeVarInt(monthlyPackageRank.getId());
45-
serializer.writeBoolean(prefix != null);
46-
if (prefix != null) {
47-
serializer.writeString(prefix);
48-
}
45+
serializer.writeOptionally(prefix, PacketSerializer::writeString);
4946
}
5047

5148
@Override

src/main/java/net/hypixel/modapi/serializer/PacketSerializer.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,12 @@
44
import io.netty.handler.codec.DecoderException;
55
import io.netty.handler.codec.EncoderException;
66
import io.netty.util.CharsetUtil;
7+
import org.jetbrains.annotations.Nullable;
78

9+
import java.util.Optional;
810
import java.util.UUID;
11+
import java.util.function.BiConsumer;
12+
import java.util.function.Function;
913

1014
public class PacketSerializer {
1115
private static final int MAX_BYTES_PER_CHAR_UTF8 = (int) CharsetUtil.getEncoder(CharsetUtil.UTF_8).maxBytesPerChar();
@@ -135,4 +139,25 @@ public PacketSerializer writeUuid(UUID uuid) {
135139
return this;
136140
}
137141

142+
public <T> Optional<T> readOptional(Function<PacketSerializer, T> function) {
143+
return this.readBoolean() ? Optional.of(function.apply(this)) : Optional.empty();
144+
}
145+
146+
@Nullable
147+
public <T> T readOptionally(Function<PacketSerializer, T> function) {
148+
return this.readBoolean() ? function.apply(this) : null;
149+
}
150+
151+
public <T> PacketSerializer writeOptional(Optional<T> optional, BiConsumer<PacketSerializer, T> consumer) {
152+
return writeOptionally(optional.orElse(null), consumer);
153+
}
154+
155+
public <T> PacketSerializer writeOptionally(@Nullable T value, BiConsumer<PacketSerializer, T> consumer) {
156+
this.writeBoolean(value != null);
157+
if (value != null) {
158+
consumer.accept(this, value);
159+
}
160+
return this;
161+
}
162+
138163
}

0 commit comments

Comments
 (0)