From 89f1a5814bbe4f59a1d767670cfdfe74b6e01055 Mon Sep 17 00:00:00 2001 From: Connor Linfoot Date: Tue, 1 Apr 2025 14:42:38 +0100 Subject: [PATCH] Implement HypixelModAPIImplementation --- gradle.properties | 4 +- .../hypixel/modapi/fabric/FabricModAPI.java | 69 +++++++++++++------ 2 files changed, 49 insertions(+), 24 deletions(-) diff --git a/gradle.properties b/gradle.properties index a97ae95..94ec110 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,10 +8,10 @@ org.gradle.jvmargs=-Xmx1G loader_version=0.16.10 # Mod Properties - mod_version = 1.0.1+build.1 + mod_version = 1.0.1+build.dev maven_group = net.hypixel archives_base_name = HypixelModAPI - mod_api_version = 1.0.1 + mod_api_version = dev-SNAPSHOT # Dependencies # check this on https://modmuss50.me/fabric.html diff --git a/src/main/java/net/hypixel/modapi/fabric/FabricModAPI.java b/src/main/java/net/hypixel/modapi/fabric/FabricModAPI.java index c8eaf68..92e6877 100644 --- a/src/main/java/net/hypixel/modapi/fabric/FabricModAPI.java +++ b/src/main/java/net/hypixel/modapi/fabric/FabricModAPI.java @@ -3,35 +3,78 @@ import com.mojang.logging.LogUtils; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.networking.v1.ClientConfigurationNetworking; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; import net.fabricmc.loader.api.FabricLoader; import net.hypixel.modapi.HypixelModAPI; +import net.hypixel.modapi.HypixelModAPIImplementation; import net.hypixel.modapi.fabric.event.HypixelModAPICallback; import net.hypixel.modapi.fabric.event.HypixelModAPIErrorCallback; import net.hypixel.modapi.fabric.payload.ClientboundHypixelPayload; import net.hypixel.modapi.fabric.payload.ServerboundHypixelPayload; +import net.hypixel.modapi.packet.HypixelPacket; +import net.hypixel.modapi.packet.impl.clientbound.ClientboundHelloPacket; import net.hypixel.modapi.packet.impl.clientbound.event.ClientboundLocationPacket; import net.minecraft.client.MinecraftClient; import net.minecraft.network.PacketByteBuf; import net.minecraft.network.codec.PacketCodec; import net.minecraft.network.packet.CustomPayload; +import net.minecraft.test.GameTest; import net.minecraft.util.Identifier; +import org.jetbrains.annotations.ApiStatus; import org.slf4j.Logger; -public class FabricModAPI implements ClientModInitializer { +public class FabricModAPI implements ClientModInitializer, HypixelModAPIImplementation { private static final Logger LOGGER = LogUtils.getLogger(); private static final boolean DEBUG_MODE = FabricLoader.getInstance().isDevelopmentEnvironment() || Boolean.getBoolean("net.hypixel.modapi.debug"); + private boolean onHypixel = false; + + @GameTest @Override public void onInitializeClient() { - reloadRegistrations(); - registerPacketSender(); + HypixelModAPI.getInstance().setModImplementation(this); + } + + @Override + public void onInit() { + HypixelModAPI.getInstance().createHandler(ClientboundHelloPacket.class, packet -> onHypixel = true); + ClientPlayConnectionEvents.DISCONNECT.register((handler, client) -> onHypixel = false); if (DEBUG_MODE) { LOGGER.info("Debug mode is enabled!"); registerDebug(); } + + reloadRegistrations(); + } + + @Override + public boolean sendPacket(HypixelPacket packet) { + if (!isConnectedToHypixel()) { + return false; + } + + ServerboundHypixelPayload hypixelPayload = new ServerboundHypixelPayload(packet); + + if (MinecraftClient.getInstance().getNetworkHandler() != null) { + ClientPlayNetworking.send(hypixelPayload); + return true; + } + + try { + ClientConfigurationNetworking.send(hypixelPayload); + return true; + } catch (IllegalStateException ignored) { + LOGGER.warn("Failed to send a packet as the client is not connected to a server '{}'", packet); + return false; + } + } + + @Override + public boolean isConnectedToHypixel() { + return onHypixel; } /** @@ -39,6 +82,7 @@ public void onInitializeClient() { *

* This method is available for internal use by Hypixel to add new packets externally, and is not intended for use by other developers. */ + @ApiStatus.Internal public static void reloadRegistrations() { for (String identifier : HypixelModAPI.getInstance().getRegistry().getClientboundIdentifiers()) { try { @@ -59,25 +103,6 @@ public static void reloadRegistrations() { } } - private static void registerPacketSender() { - HypixelModAPI.getInstance().setPacketSender((packet) -> { - ServerboundHypixelPayload hypixelPayload = new ServerboundHypixelPayload(packet); - - if (MinecraftClient.getInstance().getNetworkHandler() != null) { - ClientPlayNetworking.send(hypixelPayload); - return true; - } - - try { - ClientConfigurationNetworking.send(hypixelPayload); - return true; - } catch (IllegalStateException ignored) { - LOGGER.warn("Failed to send a packet as the client is not connected to a server '{}'", packet); - return false; - } - }); - } - private static void registerClientbound(String identifier) { try { CustomPayload.Id clientboundId = new CustomPayload.Id<>(Identifier.of(identifier));