Zoom, FPS Counter, Keystrokes and Minimap turn native (2.0.0) (#26)

The four official entries switch from `mod` to `native-mod`, each with a
2.0.0 `.hnmod` built from native/<name>/ and pinned to Nightly 6f8c7a0
(nightly-source/2026-10-28-6f8c7a0), the first Nightly with the native
hook points v1 and the on/off from Options > Mods. Their 1.0.0 `.hmod`
stays published; the index lists only 2.0.0, and the launcher keeps a
player's installed `.hmod` until a native build has the mod. Settings
carry over: the same files and keys.

Recipes stays on 8f91683 (hook points v2) until a Nightly ships them.
native.py now builds mods pinned to different commits on the pin of the
mods that need the most hook points, as the launcher does, so `together`
checks the whole set without --horizon.

Co-authored-by: Claude Opus 5.5 <[email protected]>
This commit is contained in:
Ludovic MarieandClaude Opus 5.5 authored and GitHub committed 2026-10-29 05:32:54 +01:00
1 parent d6a1ddd703
commit 22c6f14ea6
14 files changed
+75 -19

No files matched your search

+1 -1
View File
@@ -65,7 +65,7 @@ why.
| `.github/workflows/publish.yml` | On merge: releases, then `index.json` on Pages |
| `.github/workflows/cleanup.yml` | Weekly: staging files nobody needs any more |
| `.github/workflows/native.yml` | Horizon's native mods: each changed one's tests, `.hnmod` and game check, all of them together, and weekly on the newest Nightly |
| `native/<name>/` | Horizon's own native mods (Zoom, FPS Counter, Keystrokes, Minimap): the source of their `.hnmod` files |
| `native/<name>/` | Horizon's own native mods (Zoom, FPS Counter, Keystrokes, Minimap, Recipes): the source of their `.hnmod` files |
| `native/tools/` | Shared by them: apply on Horizon, check, build, package, prove (`native/tools/native.py`) |
| `scripts/` | What the workflows share |
+15 -2
View File
@@ -1,5 +1,5 @@
id = "fps_overlay"
kind = "mod"
kind = "native-mod"
name = "FPS Counter"
summary = "Frames per second in a corner of the screen, with the minimum and the 1% low."
description = """
@@ -10,11 +10,24 @@ Horizon's own FPS counter, formerly an extra in Options > Horizon Extras.
- Settings: Options > Mods > FPS Counter > Settings (corner; minimum and 1% low).
It reads the game's own frame counter and draws on the HUD: nothing else.
Now a native mod (2.0.0): built into the game by the launcher, on the Horizon you play, like any native mod
(Settings → Game → Native mods (experimental), then Build). Your settings carry over from 1.0.0. Turn it off in
Options > Mods: it rests at once, and the next build leaves it out. Its source is
[horizon-mods/native/fps-overlay](https://github.com/horizon-rust/horizon-mods/tree/main/native/fps-overlay).
"""
authors = ["Horizon"]
owners = ["ludovic111"]
license = "MIT"
source = "https://github.com/horizon-rust/horizon/tree/main/mods/official/fps-overlay"
source = "https://github.com/horizon-rust/horizon-mods/tree/main/native/fps-overlay"
[[versions]]
version = "2.0.0"
published = "2026-10-29"
game = "26.3"
file = "fps_overlay-2.0.0.hnmod"
sha256 = "bedb670e2490ce8239906c86eabd3a0c131ef5037b2937607231bdbdba38c171"
changelog = "Native: built into the game by the launcher on Horizon's native hook points; settings carry over; turn it off in Options > Mods."
[[versions]]
version = "1.0.0"
+15 -2
View File
@@ -1,5 +1,5 @@
id = "keystrokes"
kind = "mod"
kind = "native-mod"
name = "Keystrokes"
summary = "Your movement keys, mouse buttons and space bar in a corner, lit while held, with clicks per second."
description = """
@@ -10,11 +10,24 @@ Horizon's own keystrokes overlay, formerly an extra in Options > Horizon Extras.
- Settings: Options > Mods > Keystrokes > Settings (corner; clicks per second).
It reads which keys you hold and your clicks, and draws on the HUD: nothing else.
Now a native mod (2.0.0): built into the game by the launcher, on the Horizon you play, like any native mod
(Settings → Game → Native mods (experimental), then Build). Your settings carry over from 1.0.0. Turn it off in
Options > Mods: it rests at once, and the next build leaves it out. Its source is
[horizon-mods/native/keystrokes](https://github.com/horizon-rust/horizon-mods/tree/main/native/keystrokes).
"""
authors = ["Horizon"]
owners = ["ludovic111"]
license = "MIT"
source = "https://github.com/horizon-rust/horizon/tree/main/mods/official/keystrokes"
source = "https://github.com/horizon-rust/horizon-mods/tree/main/native/keystrokes"
[[versions]]
version = "2.0.0"
published = "2026-10-29"
game = "26.3"
file = "keystrokes-2.0.0.hnmod"
sha256 = "bed34d2f8049e92c52cd7c91c0c4c8c9d165faaf0183500cf4021d9e04783a7d"
changelog = "Native: built into the game by the launcher on Horizon's native hook points; settings carry over; turn it off in Options > Mods."
[[versions]]
version = "1.0.0"
+15 -2
View File
@@ -1,5 +1,5 @@
id = "minimap"
kind = "mod"
kind = "native-mod"
name = "Minimap"
summary = "A map of the world around you in a corner of the screen."
description = """
@@ -10,11 +10,24 @@ Horizon's own minimap, formerly an extra in Options > Horizon Extras.
- Settings: Options > Mods > Minimap > Settings (corner; size; square or round; zoom, 0.5 to 4 blocks per pixel; turn with the player).
It shows a map in a corner of the screen: nothing else.
Now a native mod (2.0.0): built into the game by the launcher, on the Horizon you play, like any native mod
(Settings → Game → Native mods (experimental), then Build). Your settings carry over from 1.0.0. Turn it off in
Options > Mods: it rests at once, and the next build leaves it out. Its source is
[horizon-mods/native/minimap](https://github.com/horizon-rust/horizon-mods/tree/main/native/minimap).
"""
authors = ["Horizon"]
owners = ["ludovic111"]
license = "MIT"
source = "https://github.com/horizon-rust/horizon/tree/main/mods/official/minimap"
source = "https://github.com/horizon-rust/horizon-mods/tree/main/native/minimap"
[[versions]]
version = "2.0.0"
published = "2026-10-29"
game = "26.3"
file = "minimap-2.0.0.hnmod"
sha256 = "6f5dbca0699562b088a04b3f5abdc1b7faf8da51257a96da0a4ed639c6644ed9"
changelog = "Native: built into the game by the launcher on Horizon's native hook points; settings carry over; turn it off in Options > Mods."
[[versions]]
version = "1.0.0"
+15 -2
View File
@@ -1,5 +1,5 @@
id = "zoom"
kind = "mod"
kind = "native-mod"
name = "Zoom"
summary = "Hold a key to zoom in; the mouse wheel zooms further while you hold it."
description = """
@@ -11,11 +11,24 @@ Horizon's own zoom, formerly an extra in Options > Horizon Extras.
- Settings: Options > Mods > Zoom > Settings (the key; starting zoom; smooth zoom; slower turning).
It hears its own key and the mouse wheel while you hold it, and zooms the camera: nothing else.
Now a native mod (2.0.0): built into the game by the launcher, on the Horizon you play, like any native mod
(Settings → Game → Native mods (experimental), then Build). Your settings carry over from 1.0.0. Turn it off in
Options > Mods: it rests at once, and the next build leaves it out. Its source is
[horizon-mods/native/zoom](https://github.com/horizon-rust/horizon-mods/tree/main/native/zoom).
"""
authors = ["Horizon"]
owners = ["ludovic111"]
license = "MIT"
source = "https://github.com/horizon-rust/horizon/tree/main/mods/official/zoom"
source = "https://github.com/horizon-rust/horizon-mods/tree/main/native/zoom"
[[versions]]
version = "2.0.0"
published = "2026-10-29"
game = "26.3"
file = "zoom-2.0.0.hnmod"
sha256 = "49fa2d7d635225c53304fbf1477606c0677eb23d94dac75b730f6c3ba065f127"
changelog = "Native: built into the game by the launcher on Horizon's native hook points; settings carry over; turn it off in Options > Mods."
[[versions]]
version = "1.0.0"
+1 -1
View File
@@ -2,7 +2,7 @@
"game": "26.3",
"hooks": 1,
"horizon_repository": "https://github.com/horizon-rust/horizon",
"horizon_revision": "8f91683323ac1165e7d76b3037e18f30fe647205",
"horizon_revision": "6f8c7a0e5d531d3834c4d0be4659a1db8e7e5c2a",
"horizon_mixins_repository": "https://github.com/horizon-rust/horizon-mixins",
"horizon_mixins_revision": "0d6b103c70633d8fd9443d8d0acd3aadaacedb06"
}
@@ -6,7 +6,7 @@ priority = 100
# The commit it was tested on. It uses only the native hook points (hooks 1 in
# compatibility.json): the launcher builds it on any Horizon that has them.
[compatibility]
horizon_revision = "8f91683323ac1165e7d76b3037e18f30fe647205"
horizon_revision = "6f8c7a0e5d531d3834c4d0be4659a1db8e7e5c2a"
[[module]]
id = "runtime"
+1 -1
View File
@@ -2,7 +2,7 @@
"game": "26.3",
"hooks": 1,
"horizon_repository": "https://github.com/horizon-rust/horizon",
"horizon_revision": "8f91683323ac1165e7d76b3037e18f30fe647205",
"horizon_revision": "6f8c7a0e5d531d3834c4d0be4659a1db8e7e5c2a",
"horizon_mixins_repository": "https://github.com/horizon-rust/horizon-mixins",
"horizon_mixins_revision": "0d6b103c70633d8fd9443d8d0acd3aadaacedb06"
}
@@ -6,7 +6,7 @@ priority = 100
# The commit it was tested on. It uses only the native hook points (hooks 1 in
# compatibility.json): the launcher builds it on any Horizon that has them.
[compatibility]
horizon_revision = "8f91683323ac1165e7d76b3037e18f30fe647205"
horizon_revision = "6f8c7a0e5d531d3834c4d0be4659a1db8e7e5c2a"
[[module]]
id = "runtime"
+1 -1
View File
@@ -2,7 +2,7 @@
"game": "26.3",
"hooks": 1,
"horizon_repository": "https://github.com/horizon-rust/horizon",
"horizon_revision": "8f91683323ac1165e7d76b3037e18f30fe647205",
"horizon_revision": "6f8c7a0e5d531d3834c4d0be4659a1db8e7e5c2a",
"horizon_mixins_repository": "https://github.com/horizon-rust/horizon-mixins",
"horizon_mixins_revision": "0d6b103c70633d8fd9443d8d0acd3aadaacedb06"
}
@@ -6,7 +6,7 @@ priority = 100
# The commit it was tested on. It uses only the native hook points (hooks 1 in
# compatibility.json): the launcher builds it on any Horizon that has them.
[compatibility]
horizon_revision = "8f91683323ac1165e7d76b3037e18f30fe647205"
horizon_revision = "6f8c7a0e5d531d3834c4d0be4659a1db8e7e5c2a"
[[module]]
id = "runtime"
+6 -2
View File
@@ -8,7 +8,8 @@
python3 native/tools/native.py proof --resources PATH zoom # build, then drive the game with horizon-ctl
--horizon REV build on another Horizon commit (`latest` = the newest Nightly) instead of the mods'
compatibility.json: they use only the native hook points, so they build on any Horizon whose
NATIVE_HOOKS_API is at least the one they name, as the launcher does.
NATIVE_HOOKS_API is at least the one they name, as the launcher does. Without it, mods pinned
to different commits build on the commit of those that need the most hook points.
`all` names every mod in native/.
Horizon's source comes from GitHub's archive of the commit, never a local checkout; horizon-mixins is built once at
@@ -206,7 +207,10 @@ def main():
package(m)
return
if args.horizon is None:
revs = {m.compat["horizon_revision"] for m in mods}
# Mods on the hook points build on any Horizon with the hook points they need, as the launcher builds
# them: the commit of the mods that need the most has them all (stage checks each mod's need).
newest = max(m.compat["hooks"] for m in mods)
revs = {m.compat["horizon_revision"] for m in mods if m.compat["hooks"] == newest}
if len(revs) != 1:
sys.exit(f"the mods were tested on different Horizons {sorted(revs)}: pass --horizon")
revision = revs.pop()
+1 -1
View File
@@ -2,7 +2,7 @@
"game": "26.3",
"hooks": 1,
"horizon_repository": "https://github.com/horizon-rust/horizon",
"horizon_revision": "8f91683323ac1165e7d76b3037e18f30fe647205",
"horizon_revision": "6f8c7a0e5d531d3834c4d0be4659a1db8e7e5c2a",
"horizon_mixins_repository": "https://github.com/horizon-rust/horizon-mixins",
"horizon_mixins_revision": "0d6b103c70633d8fd9443d8d0acd3aadaacedb06"
}
+1 -1
View File
@@ -6,7 +6,7 @@ priority = 100
# The commit it was tested on. It uses only the native hook points (hooks 1 in
# compatibility.json): the launcher builds it on any Horizon that has them.
[compatibility]
horizon_revision = "8f91683323ac1165e7d76b3037e18f30fe647205"
horizon_revision = "6f8c7a0e5d531d3834c4d0be4659a1db8e7e5c2a"
[[module]]
id = "runtime"