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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 19 additions & 12 deletions src/main/java/net/hypixel/modapi/HypixelModAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@
import net.hypixel.modapi.packet.impl.serverbound.ServerboundRegisterPacket;
import net.hypixel.modapi.serializer.PacketSerializer;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Predicate;

public class HypixelModAPI {
private static final HypixelModAPI INSTANCE = new HypixelModAPI();
Expand All @@ -33,12 +33,12 @@ public static HypixelModAPI getInstance() {
private final Map<String, Collection<RegisteredHandlerImpl<?>>> handlers = new ConcurrentHashMap<>();
private final Set<String> subscribedEvents = ConcurrentHashMap.newKeySet();
private Set<String> lastSubscribedEvents = Collections.emptySet();
private Predicate<HypixelPacket> packetSender = null;
@Nullable
private HypixelModAPIImplementation modImplementation;

private HypixelModAPI() {
registerHypixelPackets();
registerEventPackets();
registerDefaultHandler();
}

private void registerHypixelPackets() {
Expand Down Expand Up @@ -77,8 +77,8 @@ private void registerDefaultHandler() {
}

private void sendRegisterPacket(boolean alwaysSendIfNotEmpty) {
if (packetSender == null) {
// Allow registering events before the mod has fully initialized
if (modImplementation == null || !modImplementation.isConnectedToHypixel()) {
// Allow registering events when not connected to Hypixel
return;
}

Expand Down Expand Up @@ -144,11 +144,18 @@ public void handleError(String identifier, ErrorReason reason) {
}

@ApiStatus.Internal
public void setPacketSender(Predicate<HypixelPacket> packetSender) {
if (this.packetSender != null) {
throw new IllegalArgumentException("Packet sender already set");
public void setModImplementation(HypixelModAPIImplementation modImplementation) {
if (this.modImplementation != null) {
throw new IllegalStateException("Mod implementation already set");
}

if (modImplementation == null) {
throw new NullPointerException("modImplementation cannot be null");
}
this.packetSender = packetSender;

this.modImplementation = modImplementation;
this.modImplementation.onInit();
registerDefaultHandler();
}

/**
Expand Down Expand Up @@ -184,11 +191,11 @@ public void subscribeToEventPacket(Class<? extends EventPacket> packet) {
* @return whether the packet was sent successfully
*/
public boolean sendPacket(HypixelPacket packet) {
if (packetSender == null) {
throw new IllegalStateException("Packet sender not set");
if (modImplementation == null) {
throw new IllegalStateException("Mod implementation not set");
}

return packetSender.test(packet);
return modImplementation.sendPacket(packet);
}

private static class RegisteredHandlerImpl<T extends ClientboundHypixelPacket> implements RegisteredHandler<T> {
Expand Down
15 changes: 15 additions & 0 deletions src/main/java/net/hypixel/modapi/HypixelModAPIImplementation.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package net.hypixel.modapi;

import net.hypixel.modapi.packet.HypixelPacket;
import org.jetbrains.annotations.ApiStatus;

@ApiStatus.Internal
public interface HypixelModAPIImplementation {

void onInit();

boolean sendPacket(HypixelPacket packet);

boolean isConnectedToHypixel();

}