# Carpet Bot Manager (`cbot`) Fabric mod that adds player-owned bot management on top of Fabric Carpet's `/player` command. The mod can run server-side only for command-based management. If the same jar is installed on both the server and the client, players can also manage their own bots through a GUI. ## Dependencies - Minecraft `1.21.11` (Yarn mapped) - Fabric Loader - Fabric API - Fabric Carpet (for `/player`-based spawn/actions) Build system: Gradle + Fabric Loom (project files included). If Carpet is missing, `/cbot` still registers, but Carpet-backed actions (`spawn` and forwarded actions) return: `Carpet mod is not installed`. ## Client GUI Install `cbot` on both the server and client to enable the GUI. - `/cbot gui` - Opens the client GUI when the player has the client mod installed. - Without the client mod, the server returns `Install cbot on your client to use the GUI`. - Keybind: `Open Carpet Bot Manager` - Default is unbound. - Configure it in Minecraft controls under `Carpet Bot Manager`. The GUI is personal bot management only. Admin configuration remains command-only. GUI actions are still server-authoritative: - The client sends only bot IDs and action parameters. - The server resolves bot ownership from the executing player. - Bot actions still dispatch only restricted `player ...` or `tp ...` commands. ## Commands - `/cbot list` - Shows owned bot IDs, names, and online status. - `/cbot buy` - Buys one additional bot using the configured price. - `/cbot gui` - Opens the client GUI if the client also has cbot installed. - `/cbot spawn` - Runs `player spawn` as server source. - `/cbot tp` - Runs `tp `. - `/cbot tp ` - Runs `tp `. - `/cbot ` - Forwards to `player `. - Provides autocomplete hints for common Carpet actions while still forwarding the action text unchanged. Admin-only config commands require permission level 4: - `/cbot config show` - Shows the current bot name pattern, free bot count, price, and cap. - `/cbot config botname ""` - Sets the bot name pattern and renames saved bot identities. - Supported placeholders: `{player}`, `{id}`, `{uuid}`. - Generated bot names are sanitized and deterministically shortened to Minecraft's 16-character player-name limit. - `/cbot config starting-free ` - Sets how many free bots players are topped up to on next join or `/cbot` use. - `/cbot config price ` - Sets the buy price, for example `minecraft:diamond 2`. - A count of `0` makes buying free. - `/cbot config cap ` - Sets the maximum total bots per player. - `/cbot config cap none` - Removes the bot cap. - `/cbot config reset` - Restores defaults and renames saved bot identities back to the default pattern. ## Ownership and persistence - Ownership is stored per world in a `PersistentState`: - `Map> botNames`. - By default, a player gets exactly one starter bot: - `cbot__1`. - Additional bots are deterministic and per-owner: - `cbot__`. - Defaults: - Bot name pattern: `cbot_{player}_{id}` - Starting free bots: `1` - Price: `1` `minecraft:netherite_block` - Bot cap: none - Changing `botname` renames saved identities immediately. Already-spawned old-name fake players are not killed automatically. ## Security model `/cbot` executes underlying commands with elevated server permissions, but only after validation: - Executor must be a real `ServerPlayerEntity`. - Bot ID must resolve from that player's owned list. - Commands are restricted to: - `player ...` - `tp ...` - All dispatches are logged with owner UUID/name, bot name, action, and command string. This prevents arbitrary command execution through `/cbot`. ## Quick test plan 1. Fresh world: join as PlayerA, run `/cbot list`, verify 1 starter bot. 2. Run `/cbot 1 spawn`, verify bot appears. 3. Run `/cbot 1 use once`, verify forwarding works. 4. Give netherite block, run `/cbot buy`, verify bot #2 appears in `/cbot list`. 5. Join PlayerB, verify PlayerB cannot manage PlayerA's bot IDs. 6. Restart server, verify ownership persists. 7. As an operator, run `/cbot config starting-free 3`, verify an existing player is topped up on the next `/cbot list`. 8. Run `/cbot config botname "cbot{id}_of_{player}"`, verify saved bot names are renamed and stay spawnable. ## E2E tests Run the Mineflayer-based E2E test with: ```sh npm run e2e ``` The test starts `./gradlew runServer`, ensures Fabric Carpet is available in `run/mods`, connects real network players with Mineflayer in offline mode, executes `/cbot` commands, checks chat responses, and stops the server.