Keybind

⌨️ Bind keys to server-side commands. Press a key, the server runs a command.

30

Keybind

⌨️ Keybind

Bind keys to server-side commands. Press a key, the server runs a command.

Client Mod (Fabric)Server Plugin (Paper)

| Component | Environment | Platform | | :--- | :--- | :--- | | `KeybindMod` | Server only | Fabric (MC 26.1.2) | | `KeybindPlugin` | Server only | Paper 1.18.2+ |

---

✨ Features

- 🔗 Stale Action Cleanup: Actions are defined entirely on the server and synced to the client on join. - 📁 Stale Action Cleanup: Key assignments are saved per server IP in `.minecraft/config/keybind-servers/` and never overwritten on rejoin. - 🛠️ Stale Action Cleanup: New server actions appear in your Stale Action Cleanup menu without restarting the game. - 🏷️ Stale Action Cleanup: Server owners set friendly names (e.g., `"Teleport to Spawn"` instead of `spawn`). - ⏱️ Stale Action Cleanup: Both a global cooldown (between any actions) and per-action cooldowns prevent spam. - 🔐 Stale Action Cleanup: Each action supports an optional extra permission node on top of `keybind.use`. - 📡 Stale Action Cleanup: Uses `keybind:main` / `keybind:sync` plugin message channels. Falls back to `/kbind <action>` if the packet channel is unavailable. - 🧹 Stale Action Cleanup: Obsolete actions from previous sessions are automatically removed from the Controls menu and saved config.

---

🚀 How It Works

1. Execution: 1 second after a player joins, the plugin sends all configured actions (name, display name, default key) over the `keybind:sync` channel. 2. Execution: The mod registers each action as a native Minecraft keybind under the Execution category in Execution. 3. Execution: When a key is pressed (and no screen is open), the mod sends the action name over the `keybind:main` channel. 4. Execution: The plugin validates the action name (alphanumeric + underscores only), checks permissions and cooldowns, then runs the command.

---

🛠️ Installation

Server Side

1. Place `KeybindPlugin.jar` into your `plugins/` folder. 2. Restart the server — `plugins/Keybind/config.yml` is generated automatically. 3. Edit `config.yml` to define your actions, then run `/kbind reload`.

Client Side

1. Place `KeybindMod.jar` into your `.minecraft/mods/` folder. 2. Requires Fabric API and Fabric API. 3. Launch the game and connect to any server running the plugin.

> The mod works on any server. On servers without the plugin, no keybinds are registered.

---

⚙️ Configuration

`plugins/Keybind/config.yml`

```yaml

Global cooldown between any keybind actions (milliseconds)

global-cooldown: 500

actions: spawn: command: "spawn" # Command to run (without /) display-name: "Spawn" # Label shown in Controls menu default-key: "LEFT_BRACKET" # Suggested key for first-time players permission: "" # Optional extra permission node (leave empty for none) cooldown: 1000 # Per-action cooldown (ms); defaults to global-cooldown console: false # true = run as console with {player} replaced by player name

home: command: "home" display-name: "Home" default-key: "RIGHT_BRACKET" permission: "" cooldown: 1000 console: false ```

Notes: - Action names must be alphanumeric + underscores only (e.g. `my_action`). - `console: true` runs the command as the console sender. Use `{player}` as a placeholder for the player's name (e.g. `command: "tp {player} spawn"`). - `default-key` is only applied the first time a player connects. Their saved binding is used on subsequent joins.

---

⌨️ Supported Keys

Keyboard

| Category | Values | | :--- | :--- | | Letters | `A`–`Z` | | Numbers | `0`–`9` | | Function | `F1`–`F25` | | Arrows | `UP`, `DOWN`, `LEFT`, `RIGHT` | | Navigation | `PAGE_UP`, `PAGE_DOWN`, `HOME`, `END`, `INSERT`, `DELETE` | | Special | `SPACE`, `ENTER`, `TAB`, `BACKSPACE`, `ESCAPE`, `PAUSE` | | Lock keys | `CAPS_LOCK`, `SCROLL_LOCK`, `NUM_LOCK` | | Other | `PRINT_SCREEN`, `MENU` | | Modifiers | `LEFT_SHIFT`, `LEFT_CONTROL` (or `LEFT_CTRL`), `LEFT_ALT`, `LEFT_SUPER`, `RIGHT_SHIFT`, `RIGHT_CONTROL` (or `RIGHT_CTRL`), `RIGHT_ALT`, `RIGHT_SUPER` | | Numpad | `KP_0`–`KP_9`, `KP_ADD`, `KP_SUBTRACT`, `KP_MULTIPLY`, `KP_DIVIDE`, `KP_DECIMAL`, `KP_ENTER`, `KP_EQUAL` | | Symbols | `LEFT_BRACKET`, `RIGHT_BRACKET`, `BACKSLASH`, `SEMICOLON`, `APOSTROPHE`, `COMMA`, `PERIOD`, `SLASH`, `GRAVE_ACCENT`, `MINUS`, `EQUAL` — or the character directly: `[`, `]`, ``, `;`, `'`, `,`, `.`, `/`, `` ` ``, `-`, `=` | | World keys | `WORLD_1`, `WORLD_2` (locale-specific keys on some keyboards) |

Mouse

| Value | Aliases | Button | | :--- | :--- | :--- | | `MOUSE_LEFT` | `MOUSE_1` | Left click | | `MOUSE_RIGHT` | `MOUSE_2` | Right click | | `MOUSE_MIDDLE` | `MOUSE_3` | Middle click | | `MOUSE_4`–`MOUSE_8` | — | Side/extra buttons |

---

📜 Commands & Permissions

| Command | Description | Permission | | :--- | :--- | :--- | | `/kbind <action>` | Manually trigger an action | `keybind.use` | | `/kbind list` | List all configured action names | *(any)* | | `/kbind reload` | Reload config and re-sync all online players | `keybind.admin` |

| Permission | Description | Default | | :--- | :--- | :--- | | `keybind.use` | Required to trigger any action | `true` (everyone) | | `keybind.admin` | Access to `/kbind reload` | `op` | | `keybind.bypass.cooldown` | Ignore all cooldowns | `op` |

---

🏗️ Building from Source

```bash ./gradlew clean build ```

Output jars: - `keybind-plugin/build/libs/KeybindPlugin-1.0.0.jar` - `keybind-mod/build/libs/KeybindMod-1.0.0.jar`

Requires Java 17+ for the plugin, Java 25+ for the mod.

---

🔒 Security

- Action names are validated server-side against `^[a-zA-Z0-9_]+$` — arbitrary input is rejected. - Packet length is capped at 256 bytes. - All command execution happens on the main server thread. - Players without `keybind.use` cannot trigger any action, even via direct `/kbind` command.

ADS