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.
- Per-version paperweight adapters (1.16 → 26.2) sharing one NMS implementation when the packet layout does not break
- Typed
PacketWraparound rawnet.minecraft.network.protocol.Packethandles - 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
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")
}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);./gradlew shadowJar
./gradlew publish # Reposilite releases
./gradlew publishSnapshot # Reposilite snapshots