Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ At this time the API is in an early preview state to obtain feedback from the co

## Usage

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.

You can use this API as a dependency via the public Hypixel maven repo.

#### Hypixel Maven Repo
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/net/hypixel/modapi/HypixelModAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import net.hypixel.modapi.handler.ClientboundPacketHandler;
import net.hypixel.modapi.packet.ClientboundHypixelPacket;
import net.hypixel.modapi.packet.PacketRegistry;
import net.hypixel.modapi.packet.impl.VersionedPacket;
import net.hypixel.modapi.packet.impl.clientbound.ClientboundLocationPacket;
import net.hypixel.modapi.packet.impl.clientbound.ClientboundPartyInfoPacket;
import net.hypixel.modapi.packet.impl.clientbound.ClientboundPingPacket;
Expand Down Expand Up @@ -71,6 +72,11 @@ public void handle(String identifier, PacketSerializer serializer) {
}

ClientboundHypixelPacket packet = registry.createClientboundPacket(identifier, serializer);
if (packet instanceof VersionedPacket && !((VersionedPacket) packet).isExpectedVersion()) {
// Ignore packets that don't match our expected version, these could be received due to other mods requesting them
return;
}

for (ClientboundPacketHandler handler : handlers) {
packet.handle(handler);
}
Expand Down
23 changes: 20 additions & 3 deletions src/main/java/net/hypixel/modapi/packet/impl/VersionedPacket.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,26 @@
import net.hypixel.modapi.packet.HypixelPacket;
import net.hypixel.modapi.serializer.PacketSerializer;

/**
* 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.
*/
public abstract class VersionedPacket implements HypixelPacket {
private final int version;
private int version;

public VersionedPacket(int version) {
this.version = version;
}

public VersionedPacket(PacketSerializer byteBuf) {
this.version = byteBuf.readVarInt();
public VersionedPacket(PacketSerializer serializer) {
read(serializer);
}

/**
* @return true if reading was successful, false if otherwise (such as due to a mismatch in version)
*/
protected boolean read(PacketSerializer serializer) {
this.version = serializer.readVarInt();
return isExpectedVersion();
}

@Override
Expand All @@ -23,6 +34,12 @@ public int getVersion() {
return version;
}

protected abstract int getLatestVersion();

public boolean isExpectedVersion() {
return getVersion() == getLatestVersion();
}

@Override
public String toString() {
return "VersionedPacket{" +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,17 @@
public class ClientboundLocationPacket extends VersionedPacket implements ClientboundHypixelPacket {
private static final int CURRENT_VERSION = 1;

private final Environment environment;
private final String proxyName;
private final String serverName;
private Environment environment;
private String proxyName;
private String serverName;
@Nullable
private final ServerType serverType;
private ServerType serverType;
@Nullable
private final String lobbyName;
private String lobbyName;
@Nullable
private final String mode;
private String mode;
@Nullable
private final String map;
private String map;

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

public ClientboundLocationPacket(PacketSerializer serializer) {
super(serializer);
}

@Override
protected boolean read(PacketSerializer serializer) {
if (!super.read(serializer)) {
return false;
}

this.environment = Environment.getById(serializer.readVarInt()).orElseThrow(() -> new IllegalArgumentException("Invalid environment ID"));
this.proxyName = serializer.readString();
this.serverName = serializer.readString();
this.serverType = serializer.readOptional(PacketSerializer::readString).flatMap(ServerType::valueOf).orElse(null);
this.lobbyName = serializer.readOptionally(PacketSerializer::readString);
this.mode = serializer.readOptionally(PacketSerializer::readString);
this.map = serializer.readOptionally(PacketSerializer::readString);
return true;
}

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

@Override
protected int getLatestVersion() {
return CURRENT_VERSION;
}

@Override
public void handle(ClientboundPacketHandler handler) {
handler.onLocationPacket(this);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
public class ClientboundPartyInfoPacket extends VersionedPacket implements ClientboundHypixelPacket {
private static final int CURRENT_VERSION = 1;

private final boolean inParty;
private final UUID leader;
private final Set<UUID> members;
private boolean inParty;
private UUID leader;
private Set<UUID> members;

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

public ClientboundPartyInfoPacket(PacketSerializer serializer) {
super(serializer);
}

@Override
protected boolean read(PacketSerializer serializer) {
if (!super.read(serializer)) {
return false;
}

this.inParty = serializer.readBoolean();
if (!inParty) {
this.leader = null;
this.members = Collections.emptySet();
return;
return true;
}

this.leader = serializer.readUuid();
Expand All @@ -39,6 +46,7 @@ public ClientboundPartyInfoPacket(PacketSerializer serializer) {
members.add(serializer.readUuid());
}
this.members = Collections.unmodifiableSet(members);
return true;
}

@Override
Expand All @@ -56,6 +64,11 @@ public void write(PacketSerializer serializer) {
}
}

@Override
protected int getLatestVersion() {
return CURRENT_VERSION;
}

@Override
public void handle(ClientboundPacketHandler handler) {
handler.onPartyInfoPacket(this);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
public class ClientboundPingPacket extends VersionedPacket implements ClientboundHypixelPacket {
private static final int CURRENT_VERSION = 1;

private final String response;
private String response;

public ClientboundPingPacket(String response) {
super(CURRENT_VERSION);
Expand All @@ -17,7 +17,16 @@ public ClientboundPingPacket(String response) {

public ClientboundPingPacket(PacketSerializer serializer) {
super(serializer);
}

@Override
protected boolean read(PacketSerializer serializer) {
if (!super.read(serializer)) {
return false;
}

this.response = serializer.readString();
return true;
}

@Override
Expand All @@ -26,6 +35,11 @@ public void write(PacketSerializer serializer) {
serializer.writeString(response);
}

@Override
protected int getLatestVersion() {
return CURRENT_VERSION;
}

@Override
public void handle(ClientboundPacketHandler handler) {
handler.onPingPacket(this);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@
public class ClientboundPlayerInfoPacket extends VersionedPacket implements ClientboundHypixelPacket {
private static final int CURRENT_VERSION = 1;

private final PlayerRank playerRank;
private final PackageRank packageRank;
private final MonthlyPackageRank monthlyPackageRank;
private PlayerRank playerRank;
private PackageRank packageRank;
private MonthlyPackageRank monthlyPackageRank;
@Nullable
private final String prefix;
private String prefix;

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

public ClientboundPlayerInfoPacket(PacketSerializer serializer) {
super(serializer);
}

@Override
protected boolean read(PacketSerializer serializer) {
if (!super.read(serializer)) {
return false;
}

this.playerRank = PlayerRank.getById(serializer.readVarInt()).orElseThrow(() -> new IllegalArgumentException("Invalid player rank ID"));
this.packageRank = PackageRank.getById(serializer.readVarInt()).orElseThrow(() -> new IllegalArgumentException("Invalid package rank ID"));
this.monthlyPackageRank = MonthlyPackageRank.getById(serializer.readVarInt()).orElseThrow(() -> new IllegalArgumentException("Invalid monthly package rank ID"));
this.prefix = serializer.readOptionally(PacketSerializer::readString);
return true;
}

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

@Override
protected int getLatestVersion() {
return CURRENT_VERSION;
}

@Override
public void handle(ClientboundPacketHandler handler) {
handler.onPlayerInfoPacket(this);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,9 @@ public ServerboundLocationPacket(PacketSerializer serializer) {
super(serializer);
}

@Override
protected int getLatestVersion() {
return CURRENT_VERSION;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,9 @@ public ServerboundPartyInfoPacket(PacketSerializer serializer) {
super(serializer);
}

@Override
protected int getLatestVersion() {
return CURRENT_VERSION;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,9 @@ public ServerboundPingPacket(PacketSerializer serializer) {
super(serializer);
}

@Override
protected int getLatestVersion() {
return CURRENT_VERSION;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,9 @@ public ServerboundPlayerInfoPacket(PacketSerializer serializer) {
super(serializer);
}

@Override
protected int getLatestVersion() {
return CURRENT_VERSION;
}

}