HakuuLib.Minecraft
0.1.2
dotnet add package HakuuLib.Minecraft --version 0.1.2
NuGet\Install-Package HakuuLib.Minecraft -Version 0.1.2
<PackageReference Include="HakuuLib.Minecraft" Version="0.1.2" />
<PackageVersion Include="HakuuLib.Minecraft" Version="0.1.2" />
<PackageReference Include="HakuuLib.Minecraft" />
paket add HakuuLib.Minecraft --version 0.1.2
#r "nuget: HakuuLib.Minecraft, 0.1.2"
#:package HakuuLib.Minecraft@0.1.2
#addin nuget:?package=HakuuLib.Minecraft&version=0.1.2
#tool nuget:?package=HakuuLib.Minecraft&version=0.1.2
HakuuLib.Minecraft
A .NET library for Minecraft LAN discovery and forwarding, supporting both Java Edition and Bedrock Edition.
Features
- LAN Discovery: Listen for Minecraft servers broadcasting on your local network
- LAN Forwarding: Expose remote servers as if they were on your local network
- Cross-Edition Support: Full support for both Java Edition (TCP) and Bedrock Edition (UDP/RakNet)
Installation
dotnet add package HakuuLib.Minecraft
Quick Start
Factory Class
Use the MinecraftLan factory class for convenient access:
using HakuuLib.Minecraft;
var minecraft = new MinecraftLan();
// Java Edition
var javaListener = minecraft.CreateJavaHostListener();
var javaForwarder = minecraft.CreateJavaForwarder(options);
// Bedrock Edition
var bedrockListener = minecraft.CreateBedrockDiscoveryListener();
var bedrockForwarder = minecraft.CreateBedrockForwarder(options);
Java Edition
Discovery
Listen for Java Edition LAN game announcements (multicast on 224.0.2.60:4445):
using HakuuLib.Minecraft.Java.Discovery;
var options = new JavaLanDiscoveryOptions
{
MulticastAddress = "224.0.2.60",
Port = 4445
};
await using var listener = new JavaLanDiscoveryListener(options);
await listener.StartAsync();
await foreach (var server in listener.ReadAllAsync())
{
Console.WriteLine($"Found: {server.Motd} at {server.Address}:{server.Port}");
}
Forwarding
Forward a remote Java Edition server to appear on your LAN:
using HakuuLib.Minecraft.Java.Forwarding;
var options = new JavaLanForwarderOptions
{
RemoteHost = "your-server.example.com",
RemotePort = 25565,
ListenPort = 25565,
Motd = "My Forwarded Server"
};
await using var forwarder = new JavaLanForwarder(options);
forwarder.SessionStarted += (s, e) => Console.WriteLine($"Player connected from {e.ClientEndpoint}");
forwarder.SessionEnded += (s, e) => Console.WriteLine($"Player disconnected");
await forwarder.StartAsync();
// Keep running...
await Task.Delay(Timeout.Infinite);
Bedrock Edition
Discovery
Discover Bedrock Edition servers by sending RakNet ping packets:
using HakuuLib.Minecraft.Bedrock.Discovery;
var options = new BedrockLanDiscoveryOptions
{
Port = 19132,
PingInterval = TimeSpan.FromSeconds(1)
};
await using var listener = new BedrockLanDiscoveryListener(options);
await listener.StartAsync();
await foreach (var server in listener.ReadAllAsync())
{
Console.WriteLine($"Found: {server.MotdLine1}");
Console.WriteLine($" Version: {server.VersionName} (Protocol {server.ProtocolVersion})");
Console.WriteLine($" Players: {server.PlayerCount}/{server.MaxPlayerCount}");
Console.WriteLine($" Game Mode: {server.GameModeName}");
Console.WriteLine($" Address: {server.Address}:{server.PortV4}");
}
Query a Specific Server
Query a specific Bedrock server directly:
using HakuuLib.Minecraft.Bedrock.Discovery;
var server = await BedrockServerQuery.QueryAsync("192.168.1.100", 19132);
if (server != null)
{
Console.WriteLine($"Server: {server.MotdLine1}");
Console.WriteLine($"Players: {server.PlayerCount}/{server.MaxPlayerCount}");
}
Forwarding
Forward a remote Bedrock Edition server to appear on your LAN:
using HakuuLib.Minecraft.Bedrock.Forwarding;
var options = new BedrockLanForwarderOptions
{
RemoteHost = "your-bedrock-server.example.com",
RemotePort = 19132,
ListenPort = 19132,
MotdLine1 = "My Forwarded Bedrock Server",
MotdLine2 = "Welcome!",
VersionName = "1.21.50",
ProtocolVersion = 748,
MaxPlayerCount = 10,
GameMode = BedrockGameMode.Survival
};
await using var forwarder = new BedrockLanForwarder(options);
forwarder.SessionStarted += (s, e) => Console.WriteLine($"Client connected from {e.ClientEndpoint}");
forwarder.SessionEnded += (s, e) => Console.WriteLine($"Client disconnected");
await forwarder.StartAsync();
// Update player count dynamically
forwarder.UpdatePlayerCount(5, 10);
// Keep running...
await Task.Delay(Timeout.Infinite);
Broadcaster Only
If you just want to respond to LAN pings without forwarding:
using HakuuLib.Minecraft.Bedrock.Forwarding;
var broadcaster = new BedrockLanBroadcaster();
broadcaster.Configure(
motdLine1: "My Server",
motdLine2: "Bedrock World",
versionName: "1.21.50",
protocolVersion: 748,
playerCount: 0,
maxPlayerCount: 10,
gameMode: BedrockGameMode.Survival
);
await broadcaster.StartAsync(19132);
Project Structure
Minecraft/
├── MinecraftLan.cs # Factory class
├── Bedrock/
│ ├── RakNetConstants.cs # RakNet protocol constants
│ ├── RakNetPacketType.cs # Packet type definitions
│ ├── RakNetPing.cs # Ping packet handling
│ ├── RakNetPong.cs # Pong packet handling
│ ├── RakNetUtils.cs # Utility functions
│ ├── Discovery/
│ │ ├── BedrockLanAnnouncement.cs # Server announcement data
│ │ ├── BedrockLanDiscoveryListener.cs
│ │ ├── BedrockLanDiscoveryOptions.cs
│ │ └── BedrockServerQuery.cs # Direct server query
│ └── Forwarding/
│ ├── BedrockLanBroadcaster.cs # Responds to ping packets
│ ├── BedrockLanForwarder.cs # Full forwarding solution
│ ├── BedrockLanForwarderOptions.cs
│ └── BedrockUdpRelay.cs # UDP traffic relay
└── Java/
├── Discovery/
│ ├── JavaLanAnnouncement.cs # Server announcement data
│ ├── JavaLanDiscoveryListener.cs
│ └── JavaLanDiscoveryOptions.cs
└── Forwarding/
├── JavaLanBroadcaster.cs # Multicast broadcaster
├── JavaLanForwarder.cs # Full forwarding solution
├── JavaLanForwarderOptions.cs
└── JavaTcpRelay.cs # TCP traffic relay
Protocol Details
Java Edition
- Transport: TCP
- Default Port: 25565
- Discovery: UDP multicast on
224.0.2.60:4445 - Message Format:
[MOTD]server_name[/MOTD][AD]port[/AD]
Bedrock Edition
- Transport: UDP (RakNet)
- Default Port: 19132 (IPv4), 19133 (IPv6)
- Discovery: RakNet Unconnected Ping/Pong
- Magic Bytes:
0x00ffff00fefefefefdfdfdfd12345678 - Server ID String Format:
Edition;MOTD1;Protocol;Version;Players;MaxPlayers;ServerID;MOTD2;GameMode;GameModeNum;PortV4;PortV6;
License
MIT License
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.