Script ChatBots were persisted in the static botsOnHold list across
reconnects. When ScriptScheduler triggered new scripts on login, the
old Script bots were still running, causing duplicate commands to be
sent simultaneously. This led to command spam and crashes.
Adding OnDisconnect to the Script ChatBot ensures scripts are removed
from the bots list before they can be saved to botsOnHold, preventing
accumulation of duplicate script instances on reconnect.
- Reset _BotRecoAttempts on successful game join so retry counter
does not carry stale state across sessions
- Display "unlimited" instead of near-int.MaxValue retry count when
Retries is set to -1 (infinite)
- Guard SendText with CanSendMessage check to prevent
NullReferenceException when bots call send after disconnect
- Catch SocketException/IOException in Protocol18 Updater thread so
a closed socket triggers OnConnectionLost gracefully instead of an
unhandled exception
Made-with: Cursor
- Introduced message aggregation functionality with a configurable interval to reduce Discord API rate limits.
- Added options to relay all messages from Minecraft, including system messages, to Discord.
- Updated configuration comments to reflect new settings and their purposes.
Replace '== null' with 'is null' and '!= null' with 'is not null'
across 19 core files following modern C# pattern matching conventions.
Only literal null comparisons are changed. Assignments, value
comparisons, and LINQ expressions are left untouched.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replace all lock object declarations using 'object' type with the C# 13
System.Threading.Lock type across 12 files. The Lock type provides a
more efficient locking mechanism - when used with lock(), the compiler
automatically uses Lock.EnterScope() instead of Monitor.Enter/Exit.
Also made two previously non-readonly lock fields readonly:
- McClient.DigLock
- Protocol18.MessageSigningLock
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
FileInputBot (ChatBots/FileInputBot.cs):
- New ChatBot that monitors a text file (default: mcc_input.txt) for
commands, enabling MCC control from Cursor Shell or any non-interactive
environment where stdin is not available
- Activated by setting MCC_FILE_INPUT env var (e.g. MCC_FILE_INPUT=1)
- Polls every ~500ms for new lines appended to the file
- Lines starting with "/" are sent as server chat/commands
- Other lines are executed as MCC internal commands (same as console input)
- File path overridable via MCC_INPUT_FILE env var
McClient.cs:
- Load FileInputBot when MCC_FILE_INPUT environment variable is set
ChatParser.cs - NbtToString:
- Fix InvalidCastException when NBT "text" or nameless root tag values
are Int32 instead of String (happens with 1.20.6 SystemChat packets
containing numeric values in the chat component tree)
- Replace direct (string) casts with ?.ToString() ?? string.Empty
Made-with: Cursor
When MCC runs in non-interactive terminals (e.g. CI runners, IDE
embedded shells, piped input), several Console APIs throw exceptions
because there is no real console attached.
Changes:
- Program.cs: Wrap Console.KeyAvailable / Console.ReadKey in
HandleFailure() with try-catch so MCC does not crash on startup
failure in headless environments.
- Chunk.cs: Wrap Console.BufferWidth / BufferHeight in try-catch
with fallback values (120x50) to prevent exceptions when rendering
chunk maps without a console buffer.
- Map.cs: Same treatment for the map rendering path - use safe
fallback values when Console.BufferWidth/Height are unavailable.
- ReplayHandler.cs: Replace Array.Reverse() (returns void in newer
.NET) with .AsEnumerable().Reverse() to fix compilation with
.NET 10 SDK where the void return breaks the fluent chain.
Made-with: Cursor
Makes AutoRelog more hands on with the relogging rather than have the general relogging handler handle it.
Fallback to the general handler only when the AutoRelog module is disabled.