HorseMount is a Minecraft Java server plugin that lets players choose, summon, ride, and dismiss personal horse-family mounts. It is a modern continuation of the original Bukkit plugin, now using the current entity API and limiting cleanup and inventory rules to mounts created by HorseMount.
| Component | Supported version |
|---|---|
| Minecraft | 26.2 |
| Servers | Paper, Spigot, and CraftBukkit 26.2 |
| Recommended server | Paper 26.2, stable build 111 |
| Java | 25 |
| HorseMount | 2.x |
HorseMount ships one Bukkit-format JAR for all three supported servers. Paper is recommended and powers the included local development server, but it is not required. CI compile-checks the shared source against both the Spigot and Paper APIs, then manually dispatched and release-gated smoke tests boot the same built JAR on Paper, Spigot, and CraftBukkit.
Support is scoped to the current Minecraft release. The JAR declares api-version: '26.2', so older servers will refuse to load it; newer Minecraft versions are not supported until the compatibility checks move forward. Paper-compatible forks such as Purpur may work but are not tested. HorseMount does not declare Folia support.
- Install Paper 26.2 (recommended), or use the latest Spigot BuildTools with
--rev 26.2to build Spigot; add--compile craftbukkitto build CraftBukkit instead. Run the server with Java 25. - Download the HorseMount JAR from GitHub Releases.
- Put the JAR in the server's
pluginsdirectory and restart the server. - Grant the desired
horsemount.*permissions with your permissions plugin.
HorseMount creates plugins/HorseMount/config.yml on first start.
| Command | Purpose | Permission |
|---|---|---|
/horsemount or /hm |
Show help | horsemount.help |
/hm reload |
Reload configuration | horsemount.reload |
/mount or /mnt |
Summon the selected mount, or dismiss the current HorseMount mount | horsemount.mount |
/dismount |
Dismiss the current HorseMount mount | horsemount.dismount |
/setmount <variant> [style] [color] |
Select the player's default mount | horsemount.setmount |
/setarmor <none|iron|gold|diamond> |
Select armor for a regular horse | horsemount.setarmor |
/showmount |
Show the current selection | horsemount.showmount |
/spawnmount <variant> [style] [color] |
Create a protected display mount | horsemount.spawnmount |
/hm reload and help may be run from the console. Commands that act on a player or entity must be run by a player.
- Variants:
horse,donkey,mule,skeleton,zombie(undeadis accepted as a legacy alias forzombie) - Horse styles:
default,white,whitefield,whitedots,blackdots - Horse colors:
white,creamy,chestnut,brown,black,gray,darkbrown - Horse armor:
none,iron,gold,diamond
Styles, colors, and armor apply only to the regular horse variant. Each selectable value has a matching permission such as horsemount.variant.donkey, horsemount.style.whitefield, horsemount.color.chestnut, or horsemount.armor.diamond. horsemount.* grants every HorseMount permission and is disabled by default.
A player with horsemount.signs.create can create selection signs. A player with horsemount.signs.use can use them.
Regular horse sign:
[HorseMount]
horse
whitefield
chestnut
Other variant sign:
[HorseMount]
donkey
Armor sign:
[HorseMount]
diamond
[HM] is also accepted when creating a sign. HorseMount normalizes a valid sign's heading and values.
disable-spawning: true
disable-item-drops: true
players:
default:
variant: horse
style: default
color: white
armor: nonedisable-spawningprevents natural horse-family spawns. HorseMount's custom spawns are still allowed.disable-item-dropssuppresses drops and experience from HorseMount-created mounts. It does not alter ordinary horses.players.defaultis the fallback profile. Per-player selections are stored belowplayers.<uuid>.
Incomplete player profiles inherit valid default values. Invalid profiles are rejected with a clear message, and an invalid server default falls back to horse/default/white/none. /hm reload refreshes the runtime settings.
Back up the old plugins/HorseMount directory before upgrading. HorseMount 2.x reads the existing setting names and UUID-based player sections, but it deliberately does not preserve live entities created by the old plugin. Very old releases stored player names rather than UUIDs; those sections must be moved manually to players.<uuid> if they still matter.
The 2.x safety model is intentionally narrower: only entities tagged as HorseMount-managed are removed on dismount, protected from inventory changes, or stripped of drops. Ordinary and other plugins' horses are left alone.
The repository includes a Gradle Wrapper and automatically provisions the Java 25 compilation toolchain when necessary:
./gradlew clean buildThe versioned plugin JAR is written to build/libs/. A byte-identical copy with the stable name HorseMount.jar is staged in build/docker/plugins/ for the local Docker server. Server APIs are compile-only dependencies and are not bundled into the plugin.
The included Docker Compose stack runs the recommended local target: Paper 26.2 build 111 on Java 25. Server data is retained in the ignored .server/ directory, and port 25565 is bound only to localhost. Spigot and CraftBukkit coverage lives in CI; the local stack intentionally remains Paper-only.
First, create the local environment file. Review the linked Minecraft EULA, set MINECRAFT_EULA=TRUE only if you accept it, and replace the operator name:
cp .env.example .envBuild HorseMount, then start Paper with Compose Watch:
./gradlew clean build
docker compose up --watchConnect a Minecraft Java Edition 26.2 client to 127.0.0.1. Operators listed in MINECRAFT_OPS receive all HorseMount permissions on this local development server.
While Compose Watch is running, rebuild without clean after code changes:
./gradlew buildGradle replaces build/docker/plugins/HorseMount.jar; Compose detects the verified artifact, restarts Paper gracefully, and the container synchronizes the new JAR into its writable plugin directory. For a fully automatic edit-build-restart loop, run ./gradlew build --continuous in a second terminal.
Use docker compose stop to stop the server without deleting its world, or docker compose down to remove the container and network while retaining .server/data. Do not use Minecraft's /reload command to load a new plugin JAR.
For pull requests and pushes to master, GitHub Actions runs the unit tests, compiles the shared source against the Paper and Spigot 26.2 APIs, and packages one platform-neutral JAR. These fast checks do not start a Minecraft server.
Manually dispatched and release-gated compatibility jobs then boot that exact JAR on Paper, Spigot, and CraftBukkit 26.2 and verify that HorseMount enables cleanly. These are startup compatibility checks rather than exhaustive gameplay tests. This project does not redistribute Spigot or CraftBukkit server JARs, so those lanes build them with the official BuildTools and do not cache or publish the resulting server artifacts; keeping the slower server builds out of routine pull-request checks makes that constraint manageable.
The runtime workflow requires a repository Actions variable named MINECRAFT_EULA with the value TRUE. Set it only after reviewing and accepting the Minecraft EULA; without that explicit confirmation, the server jobs stop before launch.
Pushing a semantic-version tag creates a GitHub Release:
git tag v2.0.0
git push origin v2.0.0The release workflow validates the tag, rebuilds and tests the tagged commit, requires the three-server compatibility smoke test, creates the versioned JAR and SHA-256 checksum, and publishes both with build provenance. Dependency updates for Gradle and GitHub Actions are proposed by Dependabot.
The original BukkitDev listing is archived at dev.bukkit.org/projects/horsemount.
HorseMount is licensed under the terms in LICENSE.