Compare commits

...
Author SHA1 Message Date
e349124fc4 native-compat: remove [api] and [dependencies] before horizon-mixins, as the launcher does (#364)
The launcher strips these launcher-only tables before horizon-mixins reads a
bundle's manifest (native_mods/api.rs). The check passed them through, so a
mod with a trait package (cpm, #317) failed with E_MANIFEST "unknown field api"
while players' launchers apply it. Mods with an API package are applied but
not compiled, as health already leaves them out.

Co-authored-by: Horizon agent <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-11-07 09:35:45 +01:00
Ludovic MarieandLauch2 93a328a007 Update waymap 0.2.1 (#299)
Submitted by @Lauch2 through the form.

Submission: oGhoINdrgt53euuAJhTWXZXUK9MkZDtdP-MypG3iCJs

Co-authored-by: Lauch2 <[email protected]>
2026-11-07 09:35:40 +01:00
Ludovic MarieandNirokx 597e112e2b Add schematics 1.0.0 (#312)
* Add schematics 1.0.0

Submitted by @Nirokx through the form.

Submission: IPMlWgATI24rtG-B7hYNbx7AqLk8rJAAhd9iErhagsk
Co-authored-by: Nirokx <[email protected]>

* Add schematics 1.0.0

Submitted by @Nirokx through the form.

Submission: IPMlWgATI24rtG-B7hYNbx7AqLk8rJAAhd9iErhagsk
Co-authored-by: Nirokx <[email protected]>

---------

Co-authored-by: Nirokx <[email protected]>
2026-11-07 09:32:55 +01:00
Ludovic MarieandPx228-Da-Da b0406b82f1 Add worldmap 0.6.0 (#360)
* Add worldmap 0.6.0

Submitted by @Px228-Da-Da through the form.

Submission: KK2VoWwVfpqSu7xszK-VgaJm52pu-4uf5bE9IXJ8gdY
Co-authored-by: Px228-Da-Da <[email protected]>

* Add worldmap 0.6.0

Submitted by @Px228-Da-Da through the form.

Submission: KK2VoWwVfpqSu7xszK-VgaJm52pu-4uf5bE9IXJ8gdY
Co-authored-by: Px228-Da-Da <[email protected]>

* Add worldmap 0.6.0

Submitted by @Px228-Da-Da through the form.

Submission: KK2VoWwVfpqSu7xszK-VgaJm52pu-4uf5bE9IXJ8gdY
Co-authored-by: Px228-Da-Da <[email protected]>

* Add worldmap 0.6.0

Submitted by @Px228-Da-Da through the form.

Submission: KK2VoWwVfpqSu7xszK-VgaJm52pu-4uf5bE9IXJ8gdY
Co-authored-by: Px228-Da-Da <[email protected]>

* Add worldmap 0.6.0

Submitted by @Px228-Da-Da through the form.

Submission: KK2VoWwVfpqSu7xszK-VgaJm52pu-4uf5bE9IXJ8gdY
Co-authored-by: Px228-Da-Da <[email protected]>

* Add worldmap 0.6.0

Submitted by @Px228-Da-Da through the form.

Submission: KK2VoWwVfpqSu7xszK-VgaJm52pu-4uf5bE9IXJ8gdY
Co-authored-by: Px228-Da-Da <[email protected]>

* Add worldmap 0.6.0

Submitted by @Px228-Da-Da through the form.

Submission: KK2VoWwVfpqSu7xszK-VgaJm52pu-4uf5bE9IXJ8gdY
Co-authored-by: Px228-Da-Da <[email protected]>

* Add worldmap 0.6.0

Submitted by @Px228-Da-Da through the form.

Submission: KK2VoWwVfpqSu7xszK-VgaJm52pu-4uf5bE9IXJ8gdY
Co-authored-by: Px228-Da-Da <[email protected]>

---------

Co-authored-by: Px228-Da-Da <[email protected]>
2026-11-07 09:32:21 +01:00
Ludovic Marieandtomasmendes01 b10af101ed Add spotify_hud 1.0.0 (#295)
* Add spotify_hud 1.0.0

Submitted by @tomasmendes01 through the form.

Submission: KwuGkwkpwCQK2jhNI8FqpOPm9OVtaP6mmH6R1vdmwmU
Co-authored-by: tomasmendes01 <[email protected]>

* Add spotify_hud 1.0.0

Submitted by @tomasmendes01 through the form.

Submission: KwuGkwkpwCQK2jhNI8FqpOPm9OVtaP6mmH6R1vdmwmU
Co-authored-by: tomasmendes01 <[email protected]>

* Add spotify_hud 1.0.0

Submitted by @tomasmendes01 through the form.

Submission: KwuGkwkpwCQK2jhNI8FqpOPm9OVtaP6mmH6R1vdmwmU
Co-authored-by: tomasmendes01 <[email protected]>

* Add spotify_hud 1.0.0

Submitted by @tomasmendes01 through the form.

Submission: KwuGkwkpwCQK2jhNI8FqpOPm9OVtaP6mmH6R1vdmwmU
Co-authored-by: tomasmendes01 <[email protected]>

---------

Co-authored-by: tomasmendes01 <[email protected]>
2026-11-07 09:31:31 +01:00
Ludovic Marieandluhnox 635cdd6c2c Add seedcrackerx 0.2.3 (#280)
* Add seedcrackerx 0.2.3

Submitted by @luhnox through the form.

Submission: 9eVbRNl_6QYJMiT-wO3i8P72MrOJTz9rlxDC_ZHD5E4
Co-authored-by: luhnox <[email protected]>

* Add seedcrackerx 0.2.3

Submitted by @luhnox through the form.

Submission: 9eVbRNl_6QYJMiT-wO3i8P72MrOJTz9rlxDC_ZHD5E4
Co-authored-by: luhnox <[email protected]>

---------

Co-authored-by: luhnox <[email protected]>
2026-11-07 09:31:26 +01:00
Ludovic Marieandoxi-does-dev 91b1cef4b2 Add hud_plus 4 (#347)
* Add hud_plus 4

Submitted by @oxi-does-dev through the form.

Submission: E7QvlGS8WgWudmiynwnyKWatgHM2Heg8Ur8C4te986M
Co-authored-by: oxi-does-dev <[email protected]>

* Add hud_plus 4

Submitted by @oxi-does-dev through the form.

Submission: E7QvlGS8WgWudmiynwnyKWatgHM2Heg8Ur8C4te986M
Co-authored-by: oxi-does-dev <[email protected]>

---------

Co-authored-by: oxi-does-dev <[email protected]>
2026-11-07 09:29:58 +01:00
21 changed files with 286 additions and 2 deletions

No files matched your search

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

+44
View File
@@ -0,0 +1,44 @@
id = "hud_plus"
kind = "native-mod"
name = "HUD+"
summary = "One fully configurable HUD with a drag-and-drop editor and four views per module."
description = """
HUD+ is one configurable HUD for Horizon, with an in-game drag-and-drop layout editor.
Every module has four views: **Minimal**, **Compact**, **Standard** and **Full**. `Standard` follows the module's own switches; the other three are presets. A profile picks a view for all modules: Minimal gives Minimal, PvP gives Compact, the rest give Standard.
- **AppleSkin** — the original mod's look: golden saturation outlines over the hunger icons and the food/saturation a held item would restore flashing on the same bar. Minimal draws the outlines only, Compact adds food numbers, Full adds saturation, exhaustion, regeneration and the item preview.
- **Effects** — names, amplifiers, remaining time, sorting, grouping, an expiring-only filter and warning colours; can hide vanilla's icons. Minimal shows three rows of icons only, Compact adds names and time up to six rows, Full shows everything without a limit.
- **Inventory, armour and held items** — the whole inventory, hotbar, armour and offhand, stack counts, durability bars or percentages, the selected slot, arrows and totems. Minimal is the hotbar alone, Compact adds counts and a durability bar, Full adds the grid, armour, offhand and empty slots.
- **Coordinates** — XYZ, facing and yaw, chunk, dimension, and the same place in the other dimension. Minimal is XYZ, Compact adds facing, Full adds chunk, dimension, the Nether equivalent and yaw.
- **Keystrokes** — WASD, space, sneak, sprint, mouse buttons and CPS. Minimal is WASD, Compact adds the mouse, Full adds space, sneak, sprint and CPS.
- **Performance and time** — FPS, frame time, 1% low, world clock and day, local time and date, speed. Minimal is FPS, Compact adds the clock, Full adds frame time, the 1% low, real time and speed.
- **Player vitals, food tooltips, durability tooltips.** Minimal is health, Compact adds food and bars, Full adds absorption, armour, air and XP.
- **The vanilla HUD** — every widget (crosshair, hotbar, health and hunger, XP, effect icons, boss bars, chat, scoreboard and the rest) can be moved and scaled on a `Vanilla` page in the editor.
Settings open as one compact, scrollable panel on the right: General, every module, Vanilla HUD and tooltips are on a single screen, the world stays visible, and each module has its view, anchor, scale, background, border and module-specific options inline. Five profiles (Default, Minimal, PvP, Builder, Streamer) and six themes set everything at once. `H` opens the layout editor, `N` settings, `V` the vanilla layout page; `/hudplus on|off|layout|settings|reset|profile|theme` also work. Configuration lives in `config/hud_plus.json`.
HUD+ only draws. It has no network code, no packets, no second process and no movement, attack or use calls; `check_client_only.py` scans every source for them and CI fails the build if one appears. A wire-level audit (`tools/packet_audit.py`) records a stock Horizon client and the HUD+ build on the same fresh server behind a decoding proxy, and the two captures match packet for packet. The mod is compiled into the client (not a file in `mods/`), and a client-only HUD is never named in `horizon:mod_list`. It is provided as is under the MIT licence, without warranty; players are responsible for checking that a server's rules allow the modules they turn on.
Native mod: the launcher builds it into the game on the pinned Horizon Nightly. Uses the saturation art of [squeek502/AppleSkin](https://github.com/squeek502/AppleSkin) (Unlicense)."""
authors = ["oxi-does-dev"]
owners = ["oxi-does-dev"]
owner_ids = [318972665]
license = "MIT"
source = "https://github.com/oxi-does-dev/hud-plus"
icon = "icons/hud_plus.png"
categories = ["utility"]
tags = ["hud", "ui"]
[[versions]]
version = "4"
published = "2026-11-06"
game = "26.3"
file = "hud_plus-4.hnmod"
sha256 = "0f94e0502ccd6a2b4905d4f4e41073e06726cb7ce50cd0d9ec1035841d72a957"
changelog = """
Four views for every module — Minimal, Compact, Standard and Full. Standard keeps the module's individual switches; the other three are presets, so one row under N makes a module tiny, tidy or exhaustive. Profiles pick a view for all modules (Minimal gives Minimal, PvP gives Compact, the rest Standard).
Also adds an Off setting for effect timers and a separate inventory-grid switch (Minimal keeps only the hotbar), tightens the held/armour rows for the compact views, drops the full-screen sleep overlay from the Vanilla page because there is nothing to move or scale in it, and makes snap-to-grid move modules around their own default offset so dragging one back restores its exact default position.
Settings now open as one compact, scrollable panel on the right instead of a list of module pages: General, every module, Vanilla HUD and Tooltips are on a single screen, the world stays visible behind it, and each module keeps its own switches inline. Clicking a row on the Vanilla page now selects the widget actually under the pointer (the list treated its header as a row), Subtitles start where the captions are drawn and move and scale with the rest of the vanilla HUD, and a configuration change made from chat reaches the HUD immediately. AppleSkin keeps its icons on the vanilla hunger bar when the food numbers make the box wider, and centres those numbers over the icons."""
+35
View File
@@ -0,0 +1,35 @@
id = "schematics"
kind = "native-mod"
name = "Schematics"
summary = "Load schematics in every common format, see them as ghost blocks in the world, check what is missing, paste them and save areas."
description = """
Schematics for Horizon.
Reads `.litematic`, `.schem` (Sponge versions 1 to 3), `.schematic` (numeric ids of 1.12 and before), `.nbt`, `.mcstructure` (Bedrock, translated on a best-effort basis) and `.bp`. Put files in `schematics/` in the game folder.
- **M**: the menu: load a file, then move, turn, mirror or paste the placement.
- **In the world**: missing blocks show as see-through ghosts, wrong blocks red, wrong states orange, extra blocks magenta.
- **Materials**: what it takes, what is missing and what you carry.
- **Save area**: a stick's left and right clicks set two corners; save them as `.litematic`, `.schem` or `.nbt`.
- **Page Up / Page Down**: one layer at a time.
- **/schematics** (or **/sch**): the same from chat.
**What it does and doesn't do:** it reads the game's world, block models and player, and draws over the world, the HUD and its own screen. It reads and writes schematic files in `schematics/` and its settings and placements in `horizon-mods/.horizon-mod-data/schematics/`. It opens no network connections. Pasting in single player runs on the world's own server; on a server it sends `/setblock` and `/summon` commands, which need permission there.
Written from scratch for Horizon. Pinned to Horizon `c9d474d`, because it reads the game's block models, atlas and world, and the single player server's levels."""
authors = ["Nirokx"]
owners = ["Nirokx"]
owner_ids = [95123456]
license = "MIT"
source = "https://github.com/Nirokx/horizon-schematics"
icon = "icons/schematics.png"
categories = ["utility", "management"]
tags = ["schematics", "building", "litematic", "schem", "ghost-blocks", "material-list"]
[[versions]]
version = "1.0.0"
published = "2026-11-05"
game = "26.3"
file = "schematics-1.0.0.hnmod"
sha256 = "04c0cb5d1fbddf92327cf3456b33070a515af6b51b37109cd43f058ee1b78642"
changelog = "First release for Horizon 26.3 (Nightly c9d474d)."
+31
View File
@@ -0,0 +1,31 @@
id = "seedcrackerx"
kind = "native-mod"
name = "SeedCrackerX"
summary = "SeedCrackerX for Horizon: finds the world seed of a server from the structures you walk past, outlined through walls."
description = """
A port to Rust of [SeedCrackerX](https://github.com/19MisterX98/SeedcrackerX) 2.16.2 for Horizon, written from the Java source together with the parts of the SeedFinding libraries it calls. Walk near structures (igloos, temples, monuments, shipwrecks, end cities, buried treasure, outposts, trial chambers, desert wells, end gateways, emerald ore, dungeons) and they are outlined through walls; with enough of them the world seed is printed in chat. Commands are `/seedcracker ...` as in the Java (`render outlines`, `finder`, `data`, `cracker`, `version`, `database`, `gui`), and the settings are on the mod's page in Options > Mods. PARITY.md in the source lists every Java file and what became of it.
What it does not do: the Dungeon and Warped Fungus cracking of Minecraft 1.17 and older (it needs a lattice solver) and the biome-based world seed search. A world seed is found from structures and the hashed seed the server sends. Like the Java mod it shows information the game does not draw by itself, so some servers do not allow it: that choice is the player's.
For reviewers:
- Network, in two places, both in `src/game/seedcracker.rs` and both the Java mod's own behaviour: (1) once when the mod starts, one HTTP GET of the public Google Sheet of known server seeds (`DATABASE_URL`, `src/config/database.rs`) on a background thread, always, with no switch; (2) only if the player switches `databaseSubmits` on (off by default), when a seed is cracked on a server with more than 10 players: the mod asks the game's own `horizon_client::auth::join_server` to prove the account to Mojang's session service under the id `seedcrackerx`, then posts the server address, dimension, seed, version and the player's name (or a hash of it) to the sheet's script (`DATABASE_POST_URL`). The mod never reads or stores the access token. Nothing else opens a socket.
- It writes only under `horizon-mods/.horizon-mod-data/seedcrackerx/`: `seedcracker.json` (settings, the Java's layout), `known_seeds.txt` and a folder `SeedCracker saved structures`; it reads the same files back.
- It starts an operating system program in one place, `open_uri` in `src/game/seedcracker.rs` (`rundll32` on Windows, `open` on macOS, `xdg-open` on Linux): `/seedcracker database` and the links on its settings page open the seed sheet in the browser.
- The `.hnmod` is built from the source of the tagged release, `python tools/pack.py`, and is the same file every time (line endings are written as LF). It carries `LICENSE` and `NOTICE.md`.
- MIT, like every original it is a port of; `NOTICE.md` lists SeedCrackerX and the SeedFinding libraries it calls with their copyright notices. Tests: `cargo test` (a diff against 7.3k lines produced by the real Java libraries, the cracker, the finders).
- Pinned to Nightly 2026-11-04 (6475f62): the launcher builds the game on that commit, and so does not depend on the Nightly the player has."""
authors = ["luhnox (this port); SeedCrackerX by 19MisterX98 and the SeedCrackerX contributors; the SeedFinding libraries by KaptainWutax and Neil and Matthew Bolan"]
owners = ["luhnox"]
owner_ids = [85970136]
license = "MIT"
source = "https://github.com/luhnox/horizon-seedcrackerx"
icon = "icons/seedcrackerx.png"
categories = ["utility"]
[[versions]]
version = "0.2.3"
published = "2026-11-05"
game = "26.3"
file = "seedcrackerx-0.2.3.hnmod"
sha256 = "6646fd05f28251ca6ccd935027376fbb27a79ff92ac9980f20b3689964a0be9a"
changelog = "First listing. A Rust port of SeedCrackerX 2.16.2 for Horizon 26.3: structures are outlined through walls and the world seed is cracked from them and from the hashed seed the server sends; /seedcracker commands, a settings page in Options > Mods, saved structures, and the shared seed database (reading always, sending only if switched on). Pinned to the newest Nightly, 2026-11-04 (6475f62)."
+42
View File
@@ -0,0 +1,42 @@
id = "spotify_hud"
kind = "native-mod"
name = "Spotify HUD"
summary = "What Spotify is playing on your HUD, with play, pause, skip, shuffle, repeat and volume."
description = """
Shows the song Spotify is playing in a box on the HUD: cover, title, artists and progress. Open chat and point at the box for buttons: play/pause, next, previous, shuffle, repeat, volume, the song's link, settings and moving the box.
## Connect Spotify (one time)
1. Go to https://developer.spotify.com/dashboard and press **Create app**.
2. Add the redirect URI `http://127.0.0.1:21851/spotify/callback`, tick **Web API**, save.
3. In a world: `/music clientid <Client ID>`.
4. Then `/music login` and allow it in the browser (within two minutes).
The buttons need **Spotify Premium** (Spotify refuses them from free accounts) and a song playing on some device.
## Using it
- `/music` opens the settings: corner, which screens, colours, which buttons, chat line for each new song, and more.
- `/music volume [0-100] | play | pause | next | previous | shuffle | repeat | hide | position | restart | logout`
- Keys for next, previous, play/pause and hiding the box in Options → Mods → Spotify HUD (unbound by default).
Settings, the login and `theme.json` (colours you can edit) are in `horizon-mods/.horizon-mod-data/spotify_hud/`.
By tomasmendes01 (in-game: iLoong). Inspired by ThatGravyBoat's Craftify, written from scratch for Horizon. Not affiliated with Spotify."""
authors = ["tomasmendes01"]
owners = ["tomasmendes01"]
owner_ids = [68385376]
license = "MIT"
source = "https://github.com/tomasmendes01/spotify-hud-horizon"
icon = "icons/spotify_hud.png"
categories = ["utility"]
tags = ["spotify", "music", "hud", "media-controls"]
screenshots = ["screenshots/spotify_hud/1.png", "screenshots/spotify_hud/2.png"]
[[versions]]
version = "1.0.0"
published = "2026-11-05"
game = "26.3"
file = "spotify_hud-1.0.0.hnmod"
sha256 = "db7e370554c60fb26fea5048d31bc4b633a1c37d70174789117aa3144e5a3cf3"
changelog = "First release."
+13 -1
View File
@@ -48,10 +48,22 @@ owner_ids = [339589475]
license = "MIT"
source = "https://github.com/Lauch2/horizon-waymap-mod"
icon = "icons/waymap.png"
categories = ["utility", "adventure"]
categories = ["utility", "adventure", "management"]
tags = ["waypoints", "minimap", "navigation", "death-points", "hud"]
key = "RWS1B1QZPeYaSNKJr9rffnfHDSvB0AZj/Ul1B2pKrJ2XFBgKXL0FC96u"
[[versions]]
version = "0.2.1"
published = "2026-11-05"
game = "26.3"
file = "waymap-0.2.1.hnmod"
sha256 = "702af5081ef69b97e4ab8c43eed98140243cc4dc9d0964df2ef2227f9bc76342"
signature = """
untrusted comment: signature from minisign secret key
RUS1B1QZPeYaSHezDLD6R2pB3yPNb/cRiVDBUdyRz6wMEN89Wteo8J9Fnjf9Smoup4qVFZFd1a/L1YogmobVGGzk4OTrb4mVqAY=
trusted comment: timestamp:1793896727\tfile:waymap-0.2.1.hnmod\thashed
RvWULAMNk5gh3M7ewdU/sju6cpVHsOscwpw1pqEHb5xU7iqFAXRbcXMA5tTEmUvWjMtRgQZJ11m0Fn+Rjb3hDg=="""
[[versions]]
version = "0.2.0"
published = "2026-11-04"
+44
View File
@@ -0,0 +1,44 @@
id = "worldmap"
kind = "native-mod"
name = "World Map"
summary = "A full screen, self-writing world map with a minimap, waypoints (groups, import and export), day and night, cave layers and teleport."
description = """
A full screen map that writes itself as you explore, with a minimap in the corner of the game.
- **Self-writing map.** The terrain you have seen stays on the map after you leave, kept per world, dimension and cave layer, in the vanilla map colours. Dark at night, and lit blocks (torches, lava, lanterns) shine.
- **Minimap.** In a corner of the game: the map round you, turning with you with the sides of the world on its edge (or north up), your waypoints, other players as dots, dark at night. Under a roof or in a cave it shows the floor at your height.
- **Smooth.** Drag to move (the map glides on when you let go), scroll to zoom towards the pointer; far zoom blurs instead of flickering.
- **Cave layers.** Under a roof, in a cave or in the Nether the map shows the floor round you; layered or full, with a Top Y slider from -64 to 319.
- **Dimensions.** One button shows the Overworld, the Nether or the End from any of them, with the other world's coordinates of the place under the pointer.
- **Waypoints.** Right-click for a menu: add, rename, 16 colours, three shapes, group, teleport (/tp), delete. Waypoints show in the world as a square with a letter, with their name and distance; a waypoint is made where you die; a list with search (L) and groups you can hide; Export and Import of the list (it reads other map mods' waypoints files too).
- **Also:** the biome under the pointer, other players on the map, go to coordinates (J), a chunk grid, your trail, and an export of the whole map as a PNG.
- **Keys.** A World Map section in Options > Controls > Key Binds (with Reset), twelve keys, all rebindable. Open the map with M.
- **Russian** interface when the game is in Russian.
**What it does and doesn't do:** it reads the chunks the game has loaded around you and the game's own state, draws on its own screen and in the game's HUD, and keeps files in `config/worldmap/` (the explored chunks and a waypoints file for each world). It sends `/tp` in chat when you choose Teleport. It makes no network connection and needs no other mod.
**Native mod, pinned** to Horizon Nightly `66f3981` (Minecraft 26.3): it adds rows to the game's Key Binds screen and reuses the minimap's colour scan, so it builds on that revision."""
authors = ["Px228-Da-Da"]
owners = ["Px228-Da-Da"]
owner_ids = [160890712]
license = "MIT"
source = "https://github.com/Px228-Da-Da/horizon-worldmap"
icon = "icons/worldmap.png"
categories = ["utility", "adventure"]
tags = ["map", "worldmap", "waypoints", "navigation", "caves", "minimap"]
screenshots = ["screenshots/worldmap/1.jpg", "screenshots/worldmap/2.png", "screenshots/worldmap/3.jpg", "screenshots/worldmap/4.png", "screenshots/worldmap/5.png", "screenshots/worldmap/6.png"]
[[versions]]
version = "0.6.0"
published = "2026-11-06"
game = "26.3"
file = "worldmap-0.6.0.hnmod"
sha256 = "460af1e08fd353cc7455fc32c4b4bd543572e68f6791c03910ae356725904a40"
changelog = """
- **Minimap** in a corner of the game, with your waypoints and the night. It turns with you (the way you face is up) with the sides of the world on its edge, or keeps north up. Under a roof or in a cave it shows the floor at your height, at every block, a jump too. Other players are dots on it. Corner and size are in Options > Mods; keys N (on and off) and Z (scale).
- **Day and night on the map:** the surface of the Overworld is dark at night, and lit blocks keep their light.
- **Waypoints in the world** are a square of their colour with their first letter, name and distance under it; they follow the view smoothly.
- **Waypoint groups:** give a waypoint a group in its menu, click the group's heading in the list to hide or show them all.
- **Export and Import** of waypoints (exports/waypoints.txt, exports/import.txt); the import also reads the waypoints file of other map mods.
- **Smoother map:** it glides on when you let go of a drag, and reads the world faster while it is open.
- **Fixed:** worlds with the same name (New World, New World (1)...) and friends' worlds no longer share one map and one set of waypoints."""
Binary file not shown.

After

Width:  |  Height:  |  Size: 946 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 724 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 309 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 461 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 587 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 441 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 525 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 571 KiB

+25 -1
View File
@@ -79,7 +79,27 @@ class Bundle:
# As the launcher does for a mod built on another Horizon than it pins.
toml = out / "horizon-mixin.toml"
text = re.sub(r'horizon_revision\s*=\s*"[0-9a-f]{40}"', f'horizon_revision = "{revision}"', toml.read_text())
toml.write_text(text)
toml.write_text(strip_launcher_tables(text))
# The tables only the launcher reads; it removes them before horizon-mixins sees the manifest (native_mods/api.rs).
LAUNCHER_TABLES = ("api", "dependencies")
def strip_launcher_tables(text):
"""`text` without its [api] and [dependencies] tables (and their sub-tables), the rest unchanged."""
kept, skipping = [], False
for line in text.splitlines(keepends=True):
header = re.match(r'\s*\[\[?\s*([^\]]+?)\s*\]\]?\s*(#.*)?$', line)
if header:
skipping = header.group(1).split(".")[0].strip().strip('"\'') in LAUNCHER_TABLES
if not skipping:
kept.append(line)
stripped = "".join(kept)
want = {k: v for k, v in tomllib.loads(text).items() if k not in LAUNCHER_TABLES}
if tomllib.loads(stripped) != want:
sys.exit("horizon-mixin.toml: its [api] or [dependencies] table couldn't be removed line by line")
return stripped
def download(url, sha256):
@@ -321,6 +341,10 @@ def check(args):
failed.append(mod.id)
if args.no_compile:
continue
if mod.api:
# Its API package is staged by the launcher only (Bundle.api), as `health` leaves these out too.
print("- applies; it has a mod API package, which only the launcher builds, so it isn't compiled here.")
continue
if compiles(stage):
print(f"- applies and compiles with {len(popular) - len(refused)} popular mods.")
continue
+52
View File
@@ -0,0 +1,52 @@
"""python3 -m unittest discover -s scripts -p 'test_*.py'"""
import tomllib
import unittest
from native_compat import strip_launcher_tables
MANIFEST = """[mod]
id = "example"
version = "1.0.0"
[compatibility]
horizon_revision = "0123456789abcdef0123456789abcdef01234567"
# A trait-mod package.
[api]
path = "api"
[dependencies]
jei = { optional = true }
[dependencies.ae2]
optional = false
[[module]]
id = "runtime"
file = "crates/horizon-client/src/game.rs"
name = "example_mod"
source = "runtime.rs"
[[injection]]
id = "frame"
target = "horizon_client::game::native_hooks::Game<'_>::native_frame"
helper = "frame.rs"
"""
class StripLauncherTables(unittest.TestCase):
def test_removes_only_the_launcher_tables(self):
stripped = tomllib.loads(strip_launcher_tables(MANIFEST))
original = tomllib.loads(MANIFEST)
self.assertNotIn("api", stripped)
self.assertNotIn("dependencies", stripped)
for key in ("mod", "compatibility", "module", "injection"):
self.assertEqual(stripped[key], original[key])
def test_a_manifest_without_them_is_unchanged(self):
plain = MANIFEST.split("# A trait-mod package.")[0] + MANIFEST.split('optional = false\n')[1]
self.assertEqual(strip_launcher_tables(plain), plain)
if __name__ == "__main__":
unittest.main()