You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Breaks system — per-session random "step away from the keyboard" simulation. Configure a check interval, hit chance, and min/max duration. While connected, the bot rolls the chance every N minutes; on a hit it disconnects for a random duration in [min, max] and reconnects automatically when the break ends. Auto-reconnect is suppressed during breaks (so the schedule/auto-reconnect loops don't fight the break timer). In scheduled mode, a break that ends outside the active window stays disconnected; the schedule ticker reconnects when the window reopens. A pill in Controls > Connection shows "On break — returning around HH:MM" while active. Config lives under Setup > Breaks.
Min-required break floor — extra fields under Setup > Breaks: "Force After (hr)" and "Forced Length (min)". If no break has happened within the floor window, the next check forces a fixed-duration break regardless of the random roll. Defaults: 3h floor / 10min forced. Set "Force After" to 0 to disable. Baseline for "no break yet" is the bot's connectedAt on first connection (so a freshly-connected bot isn't immediately overdue). lastBreakAt persists across server restarts.
Last Break readout — a "Last Break" row in Controls > Connection shows when the bot last took a break (e.g., "47m ago", "2h 15m ago", "Never"). Visible whenever breaks are enabled or a break has ever happened.
Fixes
CMI-nicknamed players' chat now classifies as real chat — the chat handler resolved senders by direct lookup in bot.players, which is keyed by real MC username. CMI (and Essentials, and any plugin that rewrites chat formats to show a nickname) sends the chat event with the visible nickname as the sender, so the lookup missed and the message fell through to the "Server" / plugin-broadcast branch — appearing in the UI as a non-chat system message and never reaching the AI handler. Added resolveChatSender() which falls back to matching against each player's displayName (with §-color codes stripped) when the direct lookup fails. UI now shows the nickname as the sender (matching what the player sees in-game) while AI/cooldowns/bot-account checks use the resolved real MC username. Whisper handler updated to the same resolver for consistency.
Asset cache-busting — index.html is now rendered at request time with the running APP_VERSION substituted into the asset URLs (/app.js?v=2.0.7, /app.css?v=2.0.7). Previously browsers could keep serving cached app.js after a container update, so users would see the new server version badge while still running the old UI (e.g., the v2.0.6 sidebar refactor not appearing until a manual hard-refresh). Bumping the version automatically invalidates the cached URLs on every release.
26.1.x connect failure handled gracefully — the v2.0.6 dependency bump registered the protocol metadata for 26.1.2 but PrismarineJS hasn't shipped the per-version game-data directory yet, so minecraft-data('26.1.2') returned null and minecraft-protocol threw before login. A first attempt to override the wire protocol so the handshake would still claim 26.1.2 succeeded at login but immediately crashed post-login because too many packets changed shape between 1.21.11 and 26.1.2 — the bot would briefly appear in-game and then vanish (PartialReadError / Cannot read properties of undefined in inventory.js). Now: when a 26.X.Y server is detected via ping, the bot auto-falls-back to negotiating as 1.21.11. Connects cleanly if the server has ViaVersion (or another protocol-translation plugin) installed; if not, the server rejects with a clear "outdated client" message instead of crashing mid-stream. Manual override via the Version field in Setup still works. The fallback becomes a no-op automatically once PrismarineJS ships proper 26.x data.