Skip to content

Latest commit

 

History

History
117 lines (91 loc) · 3.58 KB

File metadata and controls

117 lines (91 loc) · 3.58 KB

PacketAPI

Modern, versioned access to the Minecraft protocol through direct NMS (CraftPlayer.getHandle(), ServerPlayer.connection.send). Menu/container packets live in PacketUxUi; sign input lives in SignGUI. Optional Netty intercept uses an instance-scoped injection path that refuses to silently overwrite another PacketAPI copy.

Codacy Badge

What it is

  • Per-version paperweight adapters (1.16 → 26.2) sharing one NMS implementation when the packet layout does not break
  • Typed PacketWrap around raw net.minecraft.network.protocol.Packet handles
  • Custom Bukkit events (PacketSendEvent, NmsPlayerJoinEvent, NmsSwingEvent, NmsUnknownEntityInteractEvent) with NMS player handles
  • Folia / Paper / Canvas region-safe schedulers
  • Ownership-aware PacketListenerBus.ensureInjected (single inject entry point) that detects foreign shaded copies via pipeline markers and backs off instead of hijacking
  • No duplication of PacketUxUi window click / open / set-slot / cursor / book packets

Add the dependency

Latest release: 1.0.2 — hosted on Reposilite.

Maven (pom.xml):

<repositories>
    <repository>
        <id>mastersmp-releases</id>
        <url>http://repo.mastersmp.net/releases</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>net.opmasterleo</groupId>
        <artifactId>PacketAPI</artifactId>
        <version>1.0.2</version>
    </dependency>
</dependencies>

Gradle (Groovy) (build.gradle):

repositories {
    maven {
        name = "mastersmp-releases"
        url = uri("http://repo.mastersmp.net/releases")
        isAllowInsecureProtocol = true
    }
}

dependencies {
    implementation("net.opmasterleo:PacketAPI:1.0.2")
}

Gradle (Kotlin DSL) (build.gradle.kts):

repositories {
    maven {
        name = "mastersmp-releases"
        url = uri("http://repo.mastersmp.net/releases")
        isAllowInsecureProtocol = true
    }
}

dependencies {
    implementation("net.opmasterleo:PacketAPI:1.0.2")
}

Send a packet

import net.opmasterleo.packet.PacketAPI;
import net.kyori.adventure.text.Component;

PacketAPI api = PacketAPI.get();
Object handle = api.adapter().players().handle(player); // ServerPlayer
api.packets().setHealth(player, 20f, 20, 5f);
api.packets().systemChat(player, Component.text("hello"), false);

Listen without touching Netty:

import net.opmasterleo.packet.event.PacketSendEvent;
import net.opmasterleo.packet.event.NmsPlayerJoinEvent;

@EventHandler
public void onPacket(PacketSendEvent event) {
    if (event.getPacketName().contains("SetHealth")) {
        event.setCancelled(true);
    }
}

@EventHandler
public void onJoin(NmsPlayerJoinEvent event) {
    Object serverPlayer = event.getPlayerHandle();
}

Optional Netty filters (single entry point — never call low-level inject helpers):

api.listeners().addOutbound(player, (viewer, packet) -> OutboundPacketResult.keep());
// Conflict / ownership probe for status/debug:
InjectionProbe.Result probe = api.detectInjectionConflicts(player);
String status = api.injectionStatus(player);

Build / publish

./gradlew shadowJar
./gradlew publish          # Reposilite releases
./gradlew publishSnapshot  # Reposilite snapshots