Skip to content

Commit 0e5cae4

Browse files
improvement: Change packet handling to only handle the expected version (#18)
1 parent b31f475 commit 0e5cae4

11 files changed

+119
-19
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ At this time the API is in an early preview state to obtain feedback from the co
77

88
## Usage
99

10+
For using the Mod API it is highly recommended to relocate the package `net.hypixel` to prevent conflicting with other mods and different versions of the Mod API.
11+
1012
You can use this API as a dependency via the public Hypixel maven repo.
1113

1214
#### Hypixel Maven Repo

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import net.hypixel.modapi.handler.ClientboundPacketHandler;
66
import net.hypixel.modapi.packet.ClientboundHypixelPacket;
77
import net.hypixel.modapi.packet.PacketRegistry;
8+
import net.hypixel.modapi.packet.impl.VersionedPacket;
89
import net.hypixel.modapi.packet.impl.clientbound.ClientboundLocationPacket;
910
import net.hypixel.modapi.packet.impl.clientbound.ClientboundPartyInfoPacket;
1011
import net.hypixel.modapi.packet.impl.clientbound.ClientboundPingPacket;
@@ -71,6 +72,11 @@ public void handle(String identifier, PacketSerializer serializer) {
7172
}
7273

7374
ClientboundHypixelPacket packet = registry.createClientboundPacket(identifier, serializer);
75+
if (packet instanceof VersionedPacket && !((VersionedPacket) packet).isExpectedVersion()) {
76+
// Ignore packets that don't match our expected version, these could be received due to other mods requesting them
77+
return;
78+
}
79+
7480
for (ClientboundPacketHandler handler : handlers) {
7581
packet.handle(handler);
7682
}

src/main/java/net/hypixel/modapi/packet/impl/VersionedPacket.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,26 @@
33
import net.hypixel.modapi.packet.HypixelPacket;
44
import net.hypixel.modapi.serializer.PacketSerializer;
55

6+
/**
7+
* Represents a packet that is backed by a version. Versioned packets will only be handled if the incoming packet matches the version of the packet known.
8+
*/
69
public abstract class VersionedPacket implements HypixelPacket {
7-
private final int version;
10+
private int version;
811

912
public VersionedPacket(int version) {
1013
this.version = version;
1114
}
1215

13-
public VersionedPacket(PacketSerializer byteBuf) {
14-
this.version = byteBuf.readVarInt();
16+
public VersionedPacket(PacketSerializer serializer) {
17+
read(serializer);
18+
}
19+
20+
/**
21+
* @return true if reading was successful, false if otherwise (such as due to a mismatch in version)
22+
*/
23+
protected boolean read(PacketSerializer serializer) {
24+
this.version = serializer.readVarInt();
25+
return isExpectedVersion();
1526
}
1627

1728
@Override
@@ -23,6 +34,12 @@ public int getVersion() {
2334
return version;
2435
}
2536

37+
protected abstract int getLatestVersion();
38+
39+
public boolean isExpectedVersion() {
40+
return getVersion() == getLatestVersion();
41+
}
42+
2643
@Override
2744
public String toString() {
2845
return "VersionedPacket{" +

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

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,17 @@
1313
public class ClientboundLocationPacket extends VersionedPacket implements ClientboundHypixelPacket {
1414
private static final int CURRENT_VERSION = 1;
1515

16-
private final Environment environment;
17-
private final String proxyName;
18-
private final String serverName;
16+
private Environment environment;
17+
private String proxyName;
18+
private String serverName;
1919
@Nullable
20-
private final ServerType serverType;
20+
private ServerType serverType;
2121
@Nullable
22-
private final String lobbyName;
22+
private String lobbyName;
2323
@Nullable
24-
private final String mode;
24+
private String mode;
2525
@Nullable
26-
private final String map;
26+
private String map;
2727

2828
public ClientboundLocationPacket(Environment environment, String proxyName, String serverName, @Nullable ServerType serverType, @Nullable String lobbyName, @Nullable String mode, @Nullable String map) {
2929
super(CURRENT_VERSION);
@@ -38,13 +38,22 @@ public ClientboundLocationPacket(Environment environment, String proxyName, Stri
3838

3939
public ClientboundLocationPacket(PacketSerializer serializer) {
4040
super(serializer);
41+
}
42+
43+
@Override
44+
protected boolean read(PacketSerializer serializer) {
45+
if (!super.read(serializer)) {
46+
return false;
47+
}
48+
4149
this.environment = Environment.getById(serializer.readVarInt()).orElseThrow(() -> new IllegalArgumentException("Invalid environment ID"));
4250
this.proxyName = serializer.readString();
4351
this.serverName = serializer.readString();
4452
this.serverType = serializer.readOptional(PacketSerializer::readString).flatMap(ServerType::valueOf).orElse(null);
4553
this.lobbyName = serializer.readOptionally(PacketSerializer::readString);
4654
this.mode = serializer.readOptionally(PacketSerializer::readString);
4755
this.map = serializer.readOptionally(PacketSerializer::readString);
56+
return true;
4857
}
4958

5059
@Override
@@ -59,6 +68,11 @@ public void write(PacketSerializer serializer) {
5968
serializer.writeOptionally(map, PacketSerializer::writeString);
6069
}
6170

71+
@Override
72+
protected int getLatestVersion() {
73+
return CURRENT_VERSION;
74+
}
75+
6276
@Override
6377
public void handle(ClientboundPacketHandler handler) {
6478
handler.onLocationPacket(this);

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

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
public class ClientboundPartyInfoPacket extends VersionedPacket implements ClientboundHypixelPacket {
1212
private static final int CURRENT_VERSION = 1;
1313

14-
private final boolean inParty;
15-
private final UUID leader;
16-
private final Set<UUID> members;
14+
private boolean inParty;
15+
private UUID leader;
16+
private Set<UUID> members;
1717

1818
public ClientboundPartyInfoPacket(boolean inParty, @Nullable UUID leader, Set<UUID> members) {
1919
super(CURRENT_VERSION);
@@ -24,12 +24,19 @@ public ClientboundPartyInfoPacket(boolean inParty, @Nullable UUID leader, Set<UU
2424

2525
public ClientboundPartyInfoPacket(PacketSerializer serializer) {
2626
super(serializer);
27+
}
28+
29+
@Override
30+
protected boolean read(PacketSerializer serializer) {
31+
if (!super.read(serializer)) {
32+
return false;
33+
}
2734

2835
this.inParty = serializer.readBoolean();
2936
if (!inParty) {
3037
this.leader = null;
3138
this.members = Collections.emptySet();
32-
return;
39+
return true;
3340
}
3441

3542
this.leader = serializer.readUuid();
@@ -39,6 +46,7 @@ public ClientboundPartyInfoPacket(PacketSerializer serializer) {
3946
members.add(serializer.readUuid());
4047
}
4148
this.members = Collections.unmodifiableSet(members);
49+
return true;
4250
}
4351

4452
@Override
@@ -56,6 +64,11 @@ public void write(PacketSerializer serializer) {
5664
}
5765
}
5866

67+
@Override
68+
protected int getLatestVersion() {
69+
return CURRENT_VERSION;
70+
}
71+
5972
@Override
6073
public void handle(ClientboundPacketHandler handler) {
6174
handler.onPartyInfoPacket(this);

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
public class ClientboundPingPacket extends VersionedPacket implements ClientboundHypixelPacket {
99
private static final int CURRENT_VERSION = 1;
1010

11-
private final String response;
11+
private String response;
1212

1313
public ClientboundPingPacket(String response) {
1414
super(CURRENT_VERSION);
@@ -17,7 +17,16 @@ public ClientboundPingPacket(String response) {
1717

1818
public ClientboundPingPacket(PacketSerializer serializer) {
1919
super(serializer);
20+
}
21+
22+
@Override
23+
protected boolean read(PacketSerializer serializer) {
24+
if (!super.read(serializer)) {
25+
return false;
26+
}
27+
2028
this.response = serializer.readString();
29+
return true;
2130
}
2231

2332
@Override
@@ -26,6 +35,11 @@ public void write(PacketSerializer serializer) {
2635
serializer.writeString(response);
2736
}
2837

38+
@Override
39+
protected int getLatestVersion() {
40+
return CURRENT_VERSION;
41+
}
42+
2943
@Override
3044
public void handle(ClientboundPacketHandler handler) {
3145
handler.onPingPacket(this);

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

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@
1414
public class ClientboundPlayerInfoPacket extends VersionedPacket implements ClientboundHypixelPacket {
1515
private static final int CURRENT_VERSION = 1;
1616

17-
private final PlayerRank playerRank;
18-
private final PackageRank packageRank;
19-
private final MonthlyPackageRank monthlyPackageRank;
17+
private PlayerRank playerRank;
18+
private PackageRank packageRank;
19+
private MonthlyPackageRank monthlyPackageRank;
2020
@Nullable
21-
private final String prefix;
21+
private String prefix;
2222

2323
public ClientboundPlayerInfoPacket(PlayerRank playerRank, PackageRank packageRank, MonthlyPackageRank monthlyPackageRank, @Nullable String prefix) {
2424
super(CURRENT_VERSION);
@@ -30,10 +30,19 @@ public ClientboundPlayerInfoPacket(PlayerRank playerRank, PackageRank packageRan
3030

3131
public ClientboundPlayerInfoPacket(PacketSerializer serializer) {
3232
super(serializer);
33+
}
34+
35+
@Override
36+
protected boolean read(PacketSerializer serializer) {
37+
if (!super.read(serializer)) {
38+
return false;
39+
}
40+
3341
this.playerRank = PlayerRank.getById(serializer.readVarInt()).orElseThrow(() -> new IllegalArgumentException("Invalid player rank ID"));
3442
this.packageRank = PackageRank.getById(serializer.readVarInt()).orElseThrow(() -> new IllegalArgumentException("Invalid package rank ID"));
3543
this.monthlyPackageRank = MonthlyPackageRank.getById(serializer.readVarInt()).orElseThrow(() -> new IllegalArgumentException("Invalid monthly package rank ID"));
3644
this.prefix = serializer.readOptionally(PacketSerializer::readString);
45+
return true;
3746
}
3847

3948
@Override
@@ -45,6 +54,11 @@ public void write(PacketSerializer serializer) {
4554
serializer.writeOptionally(prefix, PacketSerializer::writeString);
4655
}
4756

57+
@Override
58+
protected int getLatestVersion() {
59+
return CURRENT_VERSION;
60+
}
61+
4862
@Override
4963
public void handle(ClientboundPacketHandler handler) {
5064
handler.onPlayerInfoPacket(this);

src/main/java/net/hypixel/modapi/packet/impl/serverbound/ServerboundLocationPacket.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,9 @@ public ServerboundLocationPacket(PacketSerializer serializer) {
1414
super(serializer);
1515
}
1616

17+
@Override
18+
protected int getLatestVersion() {
19+
return CURRENT_VERSION;
20+
}
21+
1722
}

src/main/java/net/hypixel/modapi/packet/impl/serverbound/ServerboundPartyInfoPacket.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,9 @@ public ServerboundPartyInfoPacket(PacketSerializer serializer) {
1414
super(serializer);
1515
}
1616

17+
@Override
18+
protected int getLatestVersion() {
19+
return CURRENT_VERSION;
20+
}
21+
1722
}

src/main/java/net/hypixel/modapi/packet/impl/serverbound/ServerboundPingPacket.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,9 @@ public ServerboundPingPacket(PacketSerializer serializer) {
1414
super(serializer);
1515
}
1616

17+
@Override
18+
protected int getLatestVersion() {
19+
return CURRENT_VERSION;
20+
}
21+
1722
}

0 commit comments

Comments
 (0)