Minecraft-Console-Client/AGENTS.md

7.2 KiB

AGENTS.md

Project

  • Minecraft Console Client (MCC) is a cross-platform text/TUI client for Minecraft Java Edition.
  • Primary scope: connect to servers, send chat and commands, receive text, automate gameplay/admin tasks, and extend behavior through built-in bots or runtime C# scripts.
  • Secondary scope: protocol/version adaptation tooling, docs site, legacy GUI wrapper, and debug tooling.

Build / Run

  • Init submodules first: git submodule update --init --recursive
  • Build: dotnet build MinecraftClient.sln -c Release
  • Publish (matches CI shape): dotnet publish MinecraftClient.sln -f net8.0 -r <RID> --self-contained=true -c Release -p:UseAppHost=true -p:IncludeNativeLibrariesForSelfExtract=true -p:EnableCompressionInSingleFile=true -p:DebugType=Embedded
  • Run from source: dotnet run --project MinecraftClient -- --help
  • Docs: cd docs && npm install && npm run docs:dev or npm run docs:build
  • Docker: cd Docker && docker build -t minecraft-console-client:latest .
  • Tests: no dedicated test project is present in the main solution.
  • Current state: the solution builds after submodule init, but dotnet build emits many analyzer and NuGet vulnerability warnings; treat them as real.

Architecture

  • Program bootstraps console I/O, TOML config, auth/session state, MC version selection, Forge detection, then creates McClient.
  • McClient is the live session runtime: TCP client, selected protocol handler, Brigadier command dispatcher, loaded bots, world/inventory/entity state, queued chat, movement/pathing, reconnect flow.
  • Protocol/ is the network/auth boundary. ProtocolHandler maps Minecraft versions to protocol numbers and selects either Protocol16Handler (1.4.6-1.6.4) or Protocol18Handler (1.7.2+).
  • Scripting/ChatBot is the extension boundary. Built-in bots and /script C# bots share the same event/tick API.
  • Main runtime flow: console input -> internal Brigadier command or server chat; packets -> protocol handler -> McClient state update -> bot events; OnUpdate() (~10 Hz) drives bot ticks, delayed work, chat cooldowns, movement, and main-thread tasks.

Technology Stack

  • Main app: C#, .NET 8, nullable enabled.
  • Command system: Brigadier.NET.
  • Config: TOML via Samboy063.Tomlet.
  • Runtime scripting: Roslyn (Microsoft.CodeAnalysis.CSharp) with in-memory compilation.
  • Networking/auth: custom Minecraft protocol handlers, DNS SRV lookup (DnsClient), Forge/session/profile-key support.
  • Integrations: DSharpPlus, Telegram.Bot, MessagePack, Magick.NET, Sentry.
  • Docs site: VuePress 2 (docs/package.json).
  • Tooling: Docker, GitHub Actions, Python 3.10+ scripts under tools/ for palette/version generation.
  • Legacy UI: MinecraftClientGUI is a separate .NET Framework 4.0 WinForms wrapper, not the main runtime.

Version Support

Feature columns mean:

  • Inventory: /inventory plus inventory/container bot APIs
  • Movement: terrain handling, /move, and movement/pathing bots
  • Entity: entity tracking and entity-driven bot events
Minecraft Protocol path Inventory Movement Entity Notes
1.4.6-1.6.4 Protocol16Handler No No No Core login/chat only
1.7.2-1.7.10 Protocol18Handler No Yes No Pre-1.8 special case
1.8-1.9.4 Protocol18Handler Partial / docs conflict Yes Yes Runtime gates allow 1.8+, but docs still warn inventory is unsupported through 1.9
1.10-1.12.2 Protocol18Handler Yes Yes Yes Pre-flattening palettes
1.13-1.19.2 Protocol18Handler Yes Yes Yes Flattened block/item/entity palettes
1.19.3-1.20.4 Protocol18Handler Yes Yes Yes Newer chat/signing and palette splits
1.20.6-1.21.4 Protocol18Handler Yes Yes Yes Registry-driven world/attribute handling
1.21.5-1.21.8 Protocol18Handler Yes Yes Yes 1.21.7/1.21.8 reuse 1.21.6 block/entity palettes in code
1.21.9-1.21.10 Protocol18Handler Yes Yes Yes Latest coded support; version tools prefer server data reports since 1.21.9

Notes:

  • Declared code range is 1.4.6 to 1.21.10.
  • Human docs are stale in places and sometimes stop at older ranges; prefer code when docs and code disagree.
  • Movement/pathing limits called out in docs still apply: no swimming, no jumping, no knockback, slab support is partial.

Module Map

  • MinecraftClient/: main net8.0 runtime project.
  • MinecraftClient/Protocol/: protocol selection, auth/session flows, packet I/O, Forge/profile-key support.
  • MinecraftClient/Mapping/: world state, movement/pathfinding, block/entity/material palettes.
  • MinecraftClient/Inventory/: containers, items, enchantments, inventory helpers, item palettes.
  • MinecraftClient/Commands/ and MinecraftClient/CommandHandler/: internal MCC commands plus Brigadier argument types/patches.
  • MinecraftClient/ChatBots/: built-in automation bots, bridges, script scheduler, replay/map/item helpers.
  • MinecraftClient/Scripting/: ChatBot API, runtime C# compilation, movement lock helpers.
  • MinecraftClient/config/: sample scripts and example bots; excluded from compilation.
  • ConsoleInteractive/: required git submodule for richer console input/output.
  • docs/: VuePress documentation site.
  • tools/: Python scripts for version adaptation and palette generation.
  • DebugTools/: packet/proxy debugging utilities.
  • MinecraftClientGUI/: legacy Windows GUI wrapper around the console app.

Engineering Guidance

DO

  • Keep startup/config/auth logic in Program and connection runtime logic in McClient or Protocol/*.
  • Update version support holistically: protocol constants, version mapping, packet palette, block palette, item palette, entity palette, metadata palette, and routing switches.
  • Use tools/ and authoritative server data reports when adapting to new Minecraft versions, especially 1.21.9+.
  • Guard optional subsystems with GetTerrainEnabled(), GetInventoryEnabled(), and GetEntityHandlingEnabled() before using them.
  • For built-in bots, wire all pieces together: bot class, Settings.ChatBotConfigHealper, and McClient.RegisterBots().
  • Keep Initialize() for setup/prereq checks and AfterGameJoined() for sending chat or commands.
  • Normalize inbound chat with GetVerbatim() before IsChatMessage() / IsPrivateMessage().
  • Clean up commands, plugin channels, threads, timers, and movement locks in OnUnload().
  • Prefer nullable-aware code, pattern matching, ArgumentNullException.ThrowIfNull, Try* APIs for expected failures, and InvokeOnMainThread() for cross-thread state changes.
  • Use modern C# only when it fits the current target: the repo builds as net8.0 with default language version.

DON'T

  • Don't update only MCVer2ProtocolVersion() or only one palette file when adding a new Minecraft version.
  • Don't send chat in Initialize().
  • Don't mutate inventory snapshots and expect server-side effects; use handler APIs/window actions.
  • Don't bypass Brigadier with ad hoc command parsing.
  • Don't start background workers when Update() or delayed tasks are sufficient; if you must, stop them on unload/disconnect.
  • Don't leave movement locks, plugin channels, or dispatcher registrations behind.
  • Don't trust older docs over current code for supported versions or feature gates.