Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e349124fc4 | ||
|
|
93a328a007 | ||
|
|
597e112e2b | ||
|
|
b0406b82f1 | ||
|
|
b10af101ed | ||
|
|
635cdd6c2c | ||
|
|
91b1cef4b2 | ||
|
|
1858aa143c | ||
|
|
93fbabcb60 | ||
|
|
aff9324c5c | ||
|
|
da49d87193 | ||
|
|
83886de13c | ||
|
|
df3e843284 | ||
|
|
5798ba209e | ||
|
|
8984945062 | ||
|
|
b8778d8a89 | ||
|
|
5b2524fe4d | ||
|
|
6f3babddd3 | ||
|
|
6134bd3735 | ||
|
|
b44db64e1e | ||
|
|
9d9bfd868d | ||
|
|
fb19e0fa84 | ||
|
|
88ab8d85cb | ||
|
|
e49f05cd1d | ||
|
|
573e129dee | ||
|
|
c01152b3fc | ||
|
|
62ef8d3be8 | ||
|
|
29bdf93a39 | ||
|
|
0f0f7be986 | ||
|
|
81d6eba98b | ||
|
|
08ba86bf79 | ||
|
|
8e9427d775 | ||
|
|
54c59cfd8a | ||
|
|
4d5cb3f2a4 | ||
|
|
77d41657aa | ||
|
|
5a5b8d2bd2 | ||
|
|
d2de4c18de | ||
|
|
037298b5a7 | ||
|
|
68bd653d9c | ||
|
|
c7432500fc | ||
|
|
d0d3e68ec4 | ||
|
|
0da4e7d52e | ||
|
|
ef6ef9e6a2 | ||
|
|
aad3b35a3a | ||
|
|
dc20a5e020 | ||
|
|
d0cf2b0811 | ||
|
|
6e79b7f740 | ||
|
|
e736186084 | ||
|
|
56930b532a | ||
|
|
1bf7fa9614 | ||
|
|
25ab2d7ea1 | ||
|
|
a1198c687e | ||
|
|
aa6d96e803 | ||
|
|
b49e1fd97d | ||
|
|
8a6980d33b | ||
|
|
8514f5774b | ||
|
|
32d977bf99 | ||
|
|
d0bd59f735 | ||
|
|
21155c06fb | ||
|
|
e0ac4551c2 | ||
|
|
e799b04b82 | ||
|
|
c2d42eba1b | ||
|
|
070bddc417 | ||
|
|
f3d5967ae6 | ||
|
|
72c0912c7b | ||
|
|
89020e2062 | ||
|
|
a617775941 | ||
|
|
b9e03dbb7b | ||
|
|
96d7f7673b | ||
|
|
a2a18e41c3 | ||
|
|
e2fcb0f5c2 | ||
|
|
ed1a281c9c | ||
|
|
9844193547 | ||
|
|
e9d402b60c | ||
|
|
71323383d8 | ||
|
|
3b34bef27e | ||
|
|
23402771cf | ||
|
|
6480bf8b8d | ||
|
|
f64587952e | ||
|
|
ad5e3b12b7 | ||
|
|
f1cdfcb3e8 | ||
|
|
4931f3a819 | ||
|
|
7b74fe93b1 | ||
|
|
4ccc44d612 | ||
|
|
08e63434d8 | ||
|
|
40dc440cbb | ||
|
|
7581c129bb | ||
|
|
259d022945 | ||
|
|
e44816b65a | ||
|
|
b300e7efd4 | ||
|
|
78853c19a6 | ||
|
|
e53ad8220b | ||
|
|
43fb2513a2 | ||
|
|
c909eea98f | ||
|
|
1f1240298a | ||
|
|
dfd2102274 | ||
|
|
35ce93db53 | ||
|
|
3f3103d070 | ||
|
|
ed4aa85442 | ||
|
|
43010d3eb2 | ||
|
|
546deac561 | ||
|
|
2eca4bc2ec | ||
|
|
a2ae910123 | ||
|
|
88b20af247 | ||
|
|
6a3454953c | ||
|
|
ceb5b2275d | ||
|
|
e980583b96 | ||
|
|
5c094254e5 | ||
|
|
d8a3327ee3 | ||
|
|
239ce420fa | ||
|
|
13d6b9fbaa | ||
|
|
ee1620f438 | ||
|
|
a0dba26666 | ||
|
|
82e29462a9 | ||
|
|
725ff7a410 | ||
|
|
64b5237f7c | ||
|
|
7d17c4d63a | ||
|
|
aab9aa4c22 | ||
|
|
6d9a7492e2 | ||
|
|
96c7c46e41 | ||
|
|
09f69374d9 | ||
|
|
4e8a65e584 | ||
|
|
bba4bda2d7 | ||
|
|
6263473f81 | ||
|
|
1fc4bd47d5 | ||
|
|
7558c0945c | ||
|
|
467b17bf38 | ||
|
|
3d113f473a | ||
|
|
792fa822f4 | ||
|
|
7b65e9b10f | ||
|
|
cd1f1c3970 | ||
|
|
be266234cb | ||
|
|
cf1f608745 | ||
|
|
f1f5aba33a | ||
|
|
0062a1e27a | ||
|
|
e79b92ff2c | ||
|
|
ce14e90beb | ||
|
|
93b3f04390 | ||
|
|
bc40e7bafe | ||
|
|
5628be3e6b | ||
|
|
58fbad4a85 |
No files matched your search
@@ -0,0 +1,103 @@
|
||||
# Native mods on the newest Nightly, as players' launchers build them (scripts/native_compat.py):
|
||||
# - on a pull request, each new native-mod version, applied together with the most downloaded native mods
|
||||
# and compiled (`cargo check`); its support modules' names against every registry mod's;
|
||||
# - every day after the Nightly, every native mod's newest version, applied, then the rest compiled
|
||||
# (`cargo check`): the ones horizon-mixins refuses alone and the ones whose own code doesn't compile go
|
||||
# to the `native-health` release, which publish adds to the index (`broken_on`) so the launcher warns
|
||||
# before an install.
|
||||
# The check compiles the submission, whose crates may have build scripts: it runs with a token that can
|
||||
# only read, and main's script, never the pull request's.
|
||||
name: native-compat
|
||||
on:
|
||||
pull_request:
|
||||
branches: [main]
|
||||
paths: ["mods/*.toml"]
|
||||
schedule:
|
||||
- cron: "40 18 * * *"
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
horizon:
|
||||
description: "Horizon commit, or `latest` (the newest Nightly)"
|
||||
default: latest
|
||||
upload:
|
||||
description: "Publish the result (native-health release); `false` for a trial run"
|
||||
default: "true"
|
||||
permissions:
|
||||
contents: read
|
||||
concurrency:
|
||||
group: native-compat-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: true
|
||||
env:
|
||||
# The Rust the launcher builds native mods with (Horizon's launcher/src/rust_toolchain.rs).
|
||||
RUST: "1.99.1"
|
||||
jobs:
|
||||
check:
|
||||
if: github.event_name == 'pull_request'
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 120
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.base.sha }}
|
||||
path: base
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
path: head
|
||||
persist-credentials: false
|
||||
- name: Does it change a native mod?
|
||||
id: native
|
||||
run: |
|
||||
if [ -n "$(python3 base/scripts/native_compat.py new base head)" ]; then
|
||||
echo "changed=true" >> "$GITHUB_OUTPUT"
|
||||
fi
|
||||
- if: steps.native.outputs.changed == 'true'
|
||||
run: rustup toolchain install $RUST --profile minimal && rustup default $RUST
|
||||
- if: steps.native.outputs.changed == 'true'
|
||||
run: sudo apt-get update && sudo apt-get install -y libasound2-dev libudev-dev pkg-config
|
||||
- if: steps.native.outputs.changed == 'true'
|
||||
name: On the newest Nightly, with the popular native mods
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ github.token }}
|
||||
run: |
|
||||
set -o pipefail
|
||||
python3 base/scripts/native_compat.py check base head | tee -a "$GITHUB_STEP_SUMMARY"
|
||||
health:
|
||||
if: github.event_name != 'pull_request'
|
||||
runs-on: ubuntu-latest
|
||||
# Each mod horizon-mixins refuses costs one more apply of the whole set.
|
||||
timeout-minutes: 300
|
||||
permissions:
|
||||
contents: write
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
GH_REPO: ${{ github.repository }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- run: python3 -m unittest discover -s scripts -p 'test_*.py'
|
||||
- run: rustup toolchain install $RUST --profile minimal && rustup default $RUST
|
||||
- run: sudo apt-get update && sudo apt-get install -y libasound2-dev libudev-dev pkg-config
|
||||
# Yesterday's dependencies, checked, and horizon-mixins: only Horizon's own crates and the mods compile again.
|
||||
- uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
~/.cargo/registry/index
|
||||
~/.cargo/registry/cache
|
||||
~/.cargo/git/db
|
||||
native/target/compat/cargo
|
||||
native/target/horizon-mixins
|
||||
key: native-health-${{ env.RUST }}-${{ github.run_id }}
|
||||
restore-keys: native-health-${{ env.RUST }}-
|
||||
- name: Every native mod's newest version on the newest Nightly
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ github.token }}
|
||||
HORIZON: ${{ inputs.horizon || 'latest' }}
|
||||
run: |
|
||||
set -o pipefail
|
||||
python3 scripts/native_compat.py health --horizon "$HORIZON" --out native-health.json | tee -a "$GITHUB_STEP_SUMMARY"
|
||||
- name: Keep it for publish
|
||||
if: inputs.upload != 'false'
|
||||
run: |
|
||||
gh release view native-health >/dev/null 2>&1 \
|
||||
|| gh release create native-health --prerelease --title "Native mods' health" \
|
||||
--notes "native-health.json: the native mods that don't apply on the newest Nightly (native-compat.yml). publish adds them to the index as broken_on."
|
||||
gh release upload native-health native-health.json --clobber
|
||||
@@ -78,7 +78,9 @@ jobs:
|
||||
names = zipfile.ZipFile(path).namelist()
|
||||
manifest = json.loads(zipfile.ZipFile(path).read("horizon-native.json"))
|
||||
assert manifest["hooks"] >= 1, manifest
|
||||
assert all(n == "horizon-native.json" or (n.startswith(f"mixins/{manifest['id']}/") and n.endswith((".rs", ".toml"))) for n in names), names
|
||||
bundle = f"mixins/{manifest['id']}/"
|
||||
assert all(n == "horizon-native.json" or n == bundle + "LICENSE" or (n.startswith(bundle) and n.endswith((".rs", ".toml"))) for n in names), names
|
||||
assert bundle + "LICENSE" in names, "the mod's LICENSE travels in its package"
|
||||
print(path, manifest)
|
||||
PY
|
||||
- uses: actions/upload-artifact@v4
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
# Merging publishes: each new version's file becomes a release asset
|
||||
# (<id>-<version>/<file>), then index.json and the icons go to GitHub Pages
|
||||
# (https://horizon-rust.github.io/horizon-mods/index.json), which the launcher and
|
||||
# (<id>-<version>/<file>), then index.json, the icons and the screenshots go to GitHub
|
||||
# Pages (https://horizon-rust.github.io/horizon-mods/index.json), which the launcher and
|
||||
# playhorizon.dev/mods read. Nothing is published if any entry fails its checks.
|
||||
# Every hour it runs again to refresh each project's `downloads`: GitHub's
|
||||
# download counts of its release assets.
|
||||
# Every hour it runs again to refresh each project's `downloads` (GitHub's download
|
||||
# counts of its release assets) and `stars` (its source repository's GitHub stars).
|
||||
name: publish
|
||||
on:
|
||||
push:
|
||||
@@ -73,9 +73,48 @@ jobs:
|
||||
| if $n > 0 then .downloads = $n else . end)' site/index.json > index.counted.json
|
||||
mv index.counted.json site/index.json
|
||||
jq -r '.projects[] | "\(.id) \(.downloads // 0)"' site/index.json
|
||||
- name: GitHub stars
|
||||
run: |
|
||||
# A project's stars are its source repository's (owner/repo of a
|
||||
# https://github.com/ source, a folder of it or .git included), asked
|
||||
# once per repository. One that can't be read is left out, not zero.
|
||||
jq -r '.projects[].source // empty' site/index.json \
|
||||
| sed -nE 's#^https://github\.com/([A-Za-z0-9-]+)/([A-Za-z0-9._-]+).*#\1/\2#p' \
|
||||
| sed -E 's/\.git$//' | tr 'A-Z' 'a-z' | sort -u \
|
||||
| while read -r repo; do
|
||||
n="$(gh api "repos/$repo" --jq .stargazers_count 2>/dev/null)" || continue
|
||||
echo "{\"key\": \"$repo\", \"value\": $n}"
|
||||
done | jq -s from_entries > stars.json
|
||||
jq --slurpfile stars stars.json '
|
||||
.projects |= map(
|
||||
(first((.source // "") | ascii_downcase
|
||||
| capture("^https://github[.]com/(?<r>[a-z0-9-]+/[a-z0-9._-]+)").r
|
||||
| sub("[.]git$"; "")) // "") as $r
|
||||
| ($stars[0][$r] // 0) as $n
|
||||
| if $n > 0 then .stars = $n else . end)' site/index.json > index.starred.json
|
||||
mv index.starred.json site/index.json
|
||||
jq -r '.projects[] | "\(.id) \(.stars // 0)"' site/index.json
|
||||
- name: Native mods that don't apply on the newest Nightly
|
||||
run: |
|
||||
# native-compat.yml's daily health: the version each names gets `broken_on`, the Horizon
|
||||
# commit horizon-mixins refused it on and its code, so the launcher warns before an install.
|
||||
if gh release download native-health --pattern native-health.json --dir health 2>/dev/null; then
|
||||
jq --slurpfile h health/native-health.json '
|
||||
$h[0] as $health
|
||||
| .projects |= map(. as $p | .versions |= map(
|
||||
($health.broken[$p.id] // null) as $b
|
||||
| if $b != null and $b.version == .version
|
||||
then .broken_on = [{horizon: $health.horizon, code: $b.code}] else . end))' \
|
||||
site/index.json > index.health.json
|
||||
mv index.health.json site/index.json
|
||||
jq -r '.projects[] | select(.versions[0].broken_on) | "\(.id) \(.versions[0].version): \(.versions[0].broken_on[0].code)"' site/index.json
|
||||
fi
|
||||
- name: The site
|
||||
run: |
|
||||
cp -R icons site/icons
|
||||
# Screenshots are served beside the icons: the index lists them at
|
||||
# <site>screenshots/<id>/<name>.
|
||||
if [ -d screenshots ]; then cp -R screenshots site/screenshots; fi
|
||||
cat > site/index.html <<'HTML'
|
||||
<!doctype html><meta charset="utf-8"><title>Horizon mods</title>
|
||||
<meta http-equiv="refresh" content="0; url=https://playhorizon.dev/mods">
|
||||
|
||||
@@ -11,9 +11,10 @@ with no file, network or clock access, and can only do what their page lists.
|
||||
Native source mods (`.hnmod`, kind `native-mod`) are built into an isolated game by
|
||||
a launcher with native-mod support. They run with the player’s account permissions.
|
||||
Their bundles pin the exact Horizon and Horizon Mixins revisions used for the build.
|
||||
Other revisions have not been validated. Registry checks inspect the source bundle without
|
||||
executing native code; reviewers must also examine the source and pinned-build
|
||||
validation. Publishing these requires the native-mod changes to `cargo-horizon-mod`
|
||||
Other revisions have not been validated. Registry checks inspect the source bundle and compile it
|
||||
on the newest Nightly with the most downloaded native mods (in a job whose token
|
||||
can only read) without running it; reviewers must also examine the source and
|
||||
pinned-build validation. Publishing these requires the native-mod changes to `cargo-horizon-mod`
|
||||
and the launcher to have shipped first.
|
||||
|
||||
**Who is responsible.** Except the projects marked Official (made by the Horizon project), everything here is made and
|
||||
@@ -65,6 +66,7 @@ why.
|
||||
| `.github/workflows/check.yml` | A pull request's checks |
|
||||
| `.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-compat.yml` | Native mods on the newest Nightly, as the launcher builds them: a pull request's new version applied and compiled with the most downloaded native mods, its module names against every mod's; daily, every mod's newest version, the ones that don't apply marked `broken_on` in the index (`scripts/native_compat.py`) |
|
||||
| `.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, Recipes, Coordinates HUD): the source of their `.hnmod` files |
|
||||
| `native/tools/` | Shared by them: apply on Horizon, check, build, package, prove (`native/tools/native.py`) |
|
||||
@@ -83,7 +85,8 @@ The index: `https://horizon-rust.github.io/horizon-mods/index.json`.
|
||||
[horizon-mixins](https://github.com/horizon-rust/horizon-mixins) bundles on Horizon's native hook points
|
||||
([docs/native-mods.md](https://github.com/horizon-rust/horizon/blob/main/docs/native-mods.md)). Each folder keeps the
|
||||
history of the repository it came from. A mod builds on any Horizon whose hook points are at least the version its
|
||||
`compatibility.json` names; `horizon_revision` is the commit it was last tested on.
|
||||
`compatibility.json` names; `horizon_revision` is the commit it was last tested on. `smp` and `voicechat-server`
|
||||
are server mods, built into the official server's engine (see their READMEs).
|
||||
|
||||
```sh
|
||||
python3 native/tools/native.py check zoom # apply on the tested Horizon and cargo check the game
|
||||
|
||||
|
After Width: | Height: | Size: 782 B |
|
After Width: | Height: | Size: 208 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 9.0 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 7.5 KiB |
|
After Width: | Height: | Size: 9.2 KiB |
|
After Width: | Height: | Size: 193 KiB |
|
After Width: | Height: | Size: 805 B |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 9.0 KiB |
|
After Width: | Height: | Size: 687 B |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 8.0 KiB |
|
After Width: | Height: | Size: 198 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 245 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 100 KiB |
|
After Width: | Height: | Size: 6.3 KiB |
|
After Width: | Height: | Size: 211 KiB |
|
After Width: | Height: | Size: 4.3 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 8.8 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 107 KiB |
|
After Width: | Height: | Size: 9.7 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 660 B |
|
After Width: | Height: | Size: 67 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 195 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 4.9 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 212 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 7.6 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 4.9 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 9.5 KiB |
|
After Width: | Height: | Size: 53 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 221 KiB |
|
After Width: | Height: | Size: 77 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 131 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 9.3 KiB |
|
After Width: | Height: | Size: 9.0 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 9.7 KiB |
|
After Width: | Height: | Size: 9.9 KiB |
|
After Width: | Height: | Size: 9.6 KiB |
|
After Width: | Height: | Size: 8.7 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 13 KiB |
@@ -0,0 +1,34 @@
|
||||
id = "accurate_block_placement"
|
||||
kind = "native-mod"
|
||||
name = "Accurate Block Placement"
|
||||
summary = "Hold right click with a block and every new spot you look at gets one, however fast you move."
|
||||
description = """
|
||||
Placing blocks fast is all about timing: vanilla places a block every four ticks while you hold right click, so moving fast skips spots and moving slowly stacks extra blocks. **Accurate Block Placement** times it for you: hold right click and every *new* spot you look at gets a block at once.
|
||||
|
||||
- **A new spot, a block**: bridging, building walls and floors, or sweeping along a row; no spot skipped, however fast you move.
|
||||
- **No extra blocks**: staring at one spot places nothing more.
|
||||
- **A single click stays a single block**: right after the click it waits as vanilla does, unless you turn the view.
|
||||
- **Building backwards**: walking backwards while placing toward yourself places one block per step.
|
||||
- Doors, chests, buttons and other blocks you click still work as usual.
|
||||
|
||||
**Settings** (Options > Mods > Accurate Block Placement): turn it on or off, bind a key to toggle it (unbound by default), and choose whether it works on servers.
|
||||
|
||||
Some servers see fast, accurate placing as a cheat: check their rules, or turn "Allowed on servers" off.
|
||||
|
||||
A port of [Accurate Block Placement: Reborn](https://modrinth.com/mod/accurate-block-placement-reborn) (MIT) by Clayborn, Flourick, schwar and KadTheHunter, rewritten in Rust for Horizon."""
|
||||
authors = ["Lutziano888"]
|
||||
owners = ["Lutziano888"]
|
||||
owner_ids = [129792568]
|
||||
license = "MIT"
|
||||
source = "https://github.com/Lutziano888/horizon-accurate-block-placement"
|
||||
icon = "icons/accurate_block_placement.png"
|
||||
categories = ["utility", "game-mechanics"]
|
||||
tags = ["building", "block-placement", "bridging", "port"]
|
||||
|
||||
[[versions]]
|
||||
version = "1.0.0"
|
||||
published = "2026-11-03"
|
||||
game = "26.3"
|
||||
file = "accurate_block_placement-1.0.0.hnmod"
|
||||
sha256 = "e631745f6d267360de6eb51995ee995bf1ab3d64393d287b7b93c332b85939ce"
|
||||
changelog = "First release."
|
||||
@@ -0,0 +1,59 @@
|
||||
id = "ae2"
|
||||
kind = "native-mod"
|
||||
name = "Applied Energistics 2"
|
||||
summary = "Unofficial port of Applied Energistics 2 15.4.12: ME networks, autocrafting, spatial storage and more."
|
||||
description = """
|
||||
An unofficial port of Applied Energistics 2 15.4.12 to Horizon, not made or endorsed by its authors. Please report problems to this port, not to them.
|
||||
|
||||
Rewritten in Rust: ME networks, storage cells, autocrafting, the cable bus with facades, P2P tunnels, spatial storage, the guide and the Fluix Researcher.
|
||||
|
||||
**One file, no separate content mod.**
|
||||
|
||||
### Optional integrations
|
||||
Each is compiled in only when its mod is in the same build, so adding or removing JEI or Jade takes effect at the next build.
|
||||
- **With JEI:** AE2's recipes and information pages, "+" transfer into terminals, and dragging items onto config slots.
|
||||
- **With Jade:** network state, channels, P2P links, charge, crafting and stored power.
|
||||
|
||||
### Missing or not the same
|
||||
- **No spatial dimension.** Horizon mods can't add one. A player in a spatial cell goes to a walled plot far out in the End, so `/tp` and F3 say `minecraft:the_end`. A swap with a player takes up to about a second.
|
||||
- **No Java addons.** AE2's Java API isn't available, and the integrations work only with the Horizon ports of JEI and Jade.
|
||||
- **Two storage buses on one inventory:** only the first reaches it.
|
||||
- **Moving items** costs power through terminals, interfaces, export buses and wireless terminals. An IO port and the crafting terminal's refills pay nothing yet.
|
||||
- **Power** is judged once a second, so a network with too little goes down at the next look and comes back after about 40 ticks, where AE2's is at once and 32.
|
||||
- **Unformed crafting, quantum and spatial blocks** join a network before they're formed.
|
||||
- **Autocrafting gaps:** a pattern input of more than one is a single template, so some plans report items missing that AE2 would find. Blocking mode looks at all six sides, provider priority is ignored, and a machine's request for more than it can make crafts nothing.
|
||||
- **Other differences:** machines have 6 or 4 orientations rather than 24, menus are in English, fluix tools are diamond tools, and guide scenes have no annotations.
|
||||
- **Crafting ETA is an estimate:** 1.1% off on average on the test rig, 2.0% at worst.
|
||||
- **Nested P2P error** is an approximation.
|
||||
- **World height:** parts on cables assume -64 to 319.
|
||||
|
||||
The Fluix Researcher and its trades rely on mixins, so they are the part most likely to break on a Horizon update.
|
||||
|
||||
### Tested
|
||||
Tested on Horizon commit 6475f62, on Windows, in single player, on LAN with one guest, and on a dedicated server with one client, including attacks by a non-operator with a modified client. This version is built for Horizon commit 66f3981, where AE2 alone compiles but hasn't been run, and the JEI and Jade integrations haven't been compiled. Other platforms, more than one guest, pipes from other mods and speed against the Java mod were not tested.
|
||||
|
||||
### Known issue
|
||||
In some test runs, placing a part into a cable cell did nothing. It isn't one specific part, and it's probably lost test clicks, but that isn't proven.
|
||||
|
||||
Textures and models are CC BY-NC-SA 3.0: noncommercial use only."""
|
||||
authors = ["AlgorithmX2", "TeamAppliedEnergistics", "Joeypc6"]
|
||||
owners = ["Joeypc6"]
|
||||
owner_ids = [35495484]
|
||||
license = "LGPL-3.0-only AND CC-BY-NC-SA-3.0"
|
||||
source = "https://github.com/Joeypc6/AE2-Horizon"
|
||||
icon = "icons/ae2.png"
|
||||
categories = ["technology", "utility", "storage"]
|
||||
tags = ["ae2", "applied-energistics", "storage", "autocrafting", "automation"]
|
||||
|
||||
[[versions]]
|
||||
version = "15.4.14"
|
||||
published = "2026-11-06"
|
||||
game = "26.3"
|
||||
file = "ae2-15.4.14.hnmod"
|
||||
sha256 = "584ec574b2620ccb9810a61f30b8bc4e639b5bf819bef7c3612835efbbdc278f"
|
||||
changelog = """
|
||||
First release on the registry, ported from AE2 15.4.12 (Fabric). 15.4.14 is this port's own version number, not an AE2 release.
|
||||
|
||||
Built for Horizon commit 66f3981. It compiles on that Horizon but wasn't run there; it was last tested on 6475f62.
|
||||
|
||||
One file: the blocks, items and textures, and the JEI and Jade integrations, are all in this mod. This replaces the earlier submissions, and fixes the `ae2:debug` vulnerability reported on them, along with others found by further reviews, and many defects from an outside review (PLAN.md, Rounds 24 to 26)."""
|
||||
@@ -3,19 +3,53 @@ kind = "native-mod"
|
||||
name = "AppleSkin"
|
||||
summary = "Shows how much HP, hunger, and saturation will be restored."
|
||||
description = """
|
||||
AppleSkin for Horizon, a native mod.
|
||||
A port of [AppleSkin](https://github.com/squeek502/AppleSkin) by squeek502 for Horizon, as a native mod. It
|
||||
draws the hunger details AppleSkin shows over the food bar:
|
||||
|
||||
Renders saturation, exhaustion, and held-food values over the hunger bar, as the original AppleSkin does.
|
||||
- **Saturation**: how much saturation you have, as food icons over the food bar.
|
||||
- **Exhaustion**: a thin strip showing how close you are to losing the next food point.
|
||||
- **Held food preview**: the food in your hand, with how much food and saturation it would restore.
|
||||
- **Animation**: fade in, pulse, or both (the default).
|
||||
|
||||
Based on AppleSkin by squeek502. See the LICENSE in the source for the
|
||||
original copyright and licence notices."""
|
||||
authors = ["soufi"]
|
||||
Each part can be turned on or off, and the animation changed, in the mod's settings (Options > Mods > AppleSkin).
|
||||
|
||||
Based on AppleSkin by squeek502. See the LICENSE in the source for the original copyright and licence notices."""
|
||||
authors = ["sillysoufi"]
|
||||
owners = ["soufied"]
|
||||
owner_ids = [47915535]
|
||||
license = "MIT"
|
||||
source = "https://github.com/soufied/AppleSkin-Horizon"
|
||||
icon = "icons/appleskin.png"
|
||||
categories = ["utility", "food"]
|
||||
tags = ["hud", "hunger", "saturation", "food", "port"]
|
||||
key = "RWT6eNq4e5WfVDA2lzOOi6XCm/+jJgilqT1+HUUM33ie5MCjcRfSg760"
|
||||
|
||||
[[versions]]
|
||||
version = "0.1.3"
|
||||
published = "2026-11-05"
|
||||
game = "26.3"
|
||||
file = "appleskin-0.1.3.hnmod"
|
||||
sha256 = "2dac91d4c4c4ab65684f41a3279c6b27beffa7407e5362b0d7a97c28c07914a6"
|
||||
signature = """
|
||||
untrusted comment: signature from minisign secret key
|
||||
RUT6eNq4e5WfVGmizdOQdqc3jXpjW/MxBBP/JE8iFYmkrE0cKbEOUP5t11senfkM2hkDW2JLSOEJCfQJT7PMS/LnYbXET1ux0Ag=
|
||||
trusted comment: timestamp:1793891067\tfile:appleskin-0.1.3.hnmod\thashed
|
||||
r7jcpfe0pAz6c2FZAuAd6EUJojhQ56mGoq/H9hYXyC8rZ6QuwErQt/nEM4ly1VjMIKS7pbn6vCz0wK7jIak+DQ=="""
|
||||
changelog = "Fix for https://github.com/horizon-rust/horizon-mods/issues/289"
|
||||
|
||||
[[versions]]
|
||||
version = "0.1.2"
|
||||
published = "2026-11-02"
|
||||
game = "26.3"
|
||||
file = "appleskin-0.1.2.hnmod"
|
||||
sha256 = "627d1e7c4b4fa3dd191a4ff5887fe38b20ceb7d7d7f1197c1e03d1f25b6b6b92"
|
||||
signature = """
|
||||
untrusted comment: signature from minisign secret key
|
||||
RUT6eNq4e5WfVJqiP4tt8vQGW6sVLSxiLXLeVunyGuyfS9aZWqPilg77biu/2B+HUDS1FlBE31F/HOhBR2YWy0GSmdwhUO7xNAs=
|
||||
trusted comment: timestamp:1793633868\tfile:appleskin-0.1.2.hnmod\thashed
|
||||
IW9M2qJIktmQDlARS6ZTJ1IA9BoGCfMZvatnjIlSpVPkpeG/Qpr5QKRRRPFhnZa93a5KcUG34ok+cgFxipRjBg=="""
|
||||
changelog = "animation fix"
|
||||
|
||||
[[versions]]
|
||||
version = "0.1.1"
|
||||
published = "2026-10-31"
|
||||
|
||||
@@ -3,16 +3,20 @@ kind = "native-mod"
|
||||
name = "AppleSkin"
|
||||
summary = "1:1 Minecraft Java parity food value preview & saturation HUD overlay."
|
||||
description = """
|
||||
1:1 Minecraft Java parity port of AppleSkin for the native Horizon Rust client.
|
||||
A port of AppleSkin for Horizon, as a native mod, drawn to match the Java Edition HUD.
|
||||
|
||||
Features
|
||||
Saturation Overlay: Golden border and glow around active saturation drumsticks matching original icons.png pixel art.
|
||||
Food Value Preview: Pulsing preview drumsticks and preview saturation border when holding edible items.
|
||||
Clean Integration: Easily toggled via Options > Mods > AppleSkin."""
|
||||
- **Saturation overlay**: a golden border and glow around the drumsticks your saturation covers.
|
||||
- **Food value preview**: pulsing preview drumsticks, and a preview of the saturation border, while you hold
|
||||
something you can eat.
|
||||
- **On or off** at any time in Options > Mods > AppleSkin."""
|
||||
authors = ["CayMac"]
|
||||
owners = ["CayMac97"]
|
||||
owner_ids = [197672048]
|
||||
license = "MIT"
|
||||
source = "https://github.com/CayMac97/appleskin"
|
||||
icon = "icons/appleskin_horizon.png"
|
||||
categories = ["utility", "food"]
|
||||
tags = ["hud", "hunger", "saturation", "food", "port"]
|
||||
key = "RWS411U2KXdTN4/y5bQhqBYxNlZvCtSZ5lNy46eeSAcgy0cxSJo2+Sm3"
|
||||
|
||||
[[versions]]
|
||||
|
||||
@@ -3,17 +3,24 @@ kind = "native-mod"
|
||||
name = "Armor Status"
|
||||
summary = "Displays equipped armor & held items with authentic Java durability colors."
|
||||
description = """
|
||||
A native ArmorStatusHUD mod for the Horizon Rust client.
|
||||
An ArmorStatusHUD-style overlay for Horizon, as a native mod: your armor and the items in your hands, with
|
||||
their durability, on the HUD.
|
||||
|
||||
Features
|
||||
Displays all 4 armor slots plus main and off-hand items on the HUD.
|
||||
Authentic Java durability color coding (Green > Yellow > Orange > Red).
|
||||
Item count display for non-damageable held items (torches, food, blocks).
|
||||
Default position: Bottom Right (freely customizable in Options > Mods)."""
|
||||
- **All four armor slots** (helmet, chestplate, leggings, boots) plus the main hand and the off hand.
|
||||
- **Durability colours** as in Java Edition: green above 50%, yellow from 25%, orange from 10%, red below 10%.
|
||||
- **Stack counts** for held items that don't wear out (food, blocks, torches).
|
||||
|
||||
**Settings** (Options > Mods > Armor Status): position (bottom right by default; hotbar left or right, top left or
|
||||
right, bottom left), durability as the remaining value, a percentage or a fraction, which hand items to show (both,
|
||||
main hand, off hand or armor only), and a translucent background box."""
|
||||
authors = ["CayMac"]
|
||||
owners = ["CayMac97"]
|
||||
owner_ids = [197672048]
|
||||
license = "MIT"
|
||||
source = "https://github.com/CayMac97/armor-status"
|
||||
icon = "icons/armor_status.png"
|
||||
categories = ["utility", "equipment"]
|
||||
tags = ["hud", "armor", "durability", "inventory-hud"]
|
||||
key = "RWS411U2KXdTN4/y5bQhqBYxNlZvCtSZ5lNy46eeSAcgy0cxSJo2+Sm3"
|
||||
|
||||
[[versions]]
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
id = "armorhud"
|
||||
kind = "native-mod"
|
||||
name = "Armor HUD"
|
||||
summary = "Your worn armor and its durability in a column left to the off-hand slot."
|
||||
description = """
|
||||
Your worn armor and its durability in a column of four slots left of the hotbar's off-hand slot, as a
|
||||
native mod for Horizon.
|
||||
|
||||
- **Durability numbers**: press **K** (rebindable in Options > Mods) to show or hide them; a notice above the
|
||||
hotbar says which. Off by default.
|
||||
- **Low-durability alerts**: a piece about to break pulses so you notice it in time. On by default.
|
||||
|
||||
Both switches are also on the mod's settings page (Options > Mods > Armor HUD)."""
|
||||
authors = ["Thomas9950"]
|
||||
owners = ["Thomas-Slot"]
|
||||
owner_ids = [265566914]
|
||||
license = "MIT"
|
||||
source = "https://github.com/Thomas-Slot/horizon-armor-hud"
|
||||
icon = "icons/armorhud.png"
|
||||
categories = ["utility", "equipment"]
|
||||
tags = ["hud", "armor", "durability"]
|
||||
key = "RWQNLUB+Hf9pa54kEx/ItgJHmDivzpAZxK9lqvv9wnecj34yzNVQHQur"
|
||||
|
||||
[[versions]]
|
||||
version = "1.0.0"
|
||||
published = "2026-11-04"
|
||||
game = "26.3"
|
||||
file = "armorhud-1.0.0.hnmod"
|
||||
sha256 = "8bd85e1584f307201bce5de2e60466d603b61d4807803d4ebc02772b4f6b704b"
|
||||
signature = """
|
||||
untrusted comment: signature from minisign secret key
|
||||
RUQNLUB+Hf9pa0KnzbNFmdhyi6xpMr56two0l9g3QlnoBYyrHFtJt5luXXEl9FnJQpP6GH7Y9KDqYUSAac7QZEQDejqrM2gA7A4=
|
||||
trusted comment: timestamp:1793750475\tfile:armorhud-1.0.0.hnmod\thashed
|
||||
q840egwiCqF5Ptn8MCP/0VqaPUQQgaWzyXwhnFhD47GLeblsZWdvPyaTnEUbsGxHCgHGT5FFrqJ54Mu1OSz/DQ=="""
|
||||
changelog = "Changed mod icon and description."
|
||||
@@ -20,8 +20,12 @@ Weapons hurt the mobs they hit. With blasting turned on in the control panel (of
|
||||
Built for this Horizon commit only: `68ac6f647e7022b2c696e81863d7cface28c9416`."""
|
||||
authors = ["repositorykreml1n"]
|
||||
owners = ["repositorykreml1n"]
|
||||
owner_ids = [271232376]
|
||||
license = "MIT"
|
||||
source = "https://github.com/repositorykreml1n/astral-cruiser"
|
||||
icon = "icons/astral_cruiser.png"
|
||||
categories = ["transportation", "adventure"]
|
||||
tags = ["starship", "vehicle", "flying", "portals", "weapons", "dimensions"]
|
||||
|
||||
[[versions]]
|
||||
version = "0.1.0"
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
id = "ayynoxs_map_pack"
|
||||
kind = "native-mod"
|
||||
name = "ayynoxs map pack"
|
||||
summary = "Minimap and full-screen world map with waypoints, cave layers and opt-in map sharing between players."
|
||||
description = """
|
||||
A **minimap** and a **full-screen world map** for Horizon, written from scratch as a native mod. Inspired by the well-known Java map mods, but no code or graphics are taken from them.
|
||||
|
||||
## ayynoxs minimap
|
||||
- Built on Horizon's own minimap renderer, with coordinates and facing direction below it
|
||||
- Square or round, north-up or rotating, 4 sizes, zoom with `I` / `O`
|
||||
- **Waypoints:** `B` opens a window for the name, `Backspace` removes the one you aim at. They show on the minimap, on the world map and in the world with their distance in metres.
|
||||
- Automatic death point
|
||||
- Chat commands: `/wp add|del|rename|share|sync|list|clear|help`
|
||||
|
||||
## ayynoxs world map
|
||||
- Full-screen map on `M`: drag or WASD to pan, wheel to zoom
|
||||
- Drawn like a vanilla map item, one block per cell
|
||||
- Saves every chunk you explore, per world/server, dimension and layer
|
||||
- Same layers as the minimap: the surface outside, your head height in caves and in the Nether
|
||||
|
||||
## Sharing (off by default)
|
||||
- `/wp share <nr> <player>` sends a waypoint as a private message, on any server. Only private messages to you can add waypoints.
|
||||
- Live map sharing is **off by default** and chosen per server with `/wp sync on|off`. When on, explored chunks and new waypoints go to the other players who turned it on, through a Horizon host (co-op/LAN, Horizon servers) or the AyynoxsMapSync plugin on Paper servers.
|
||||
- What arrives is limited: only your current level, within 2048 blocks of you, at most 1000 waypoints per world.
|
||||
|
||||
Languages: English (default), Deutsch, Français, Italiano, Русский.
|
||||
|
||||
## What it does and doesn't
|
||||
- **Hooks:** the native hook points (frame, tick, HUD, keys, commands, minimap, settings, mods list, screen keys and characters, mod messages, player join/leave), plus the Advancements screen's draw, mouse, scroll and close (the world map is drawn in its place), `extras_connecting` (the server address, for the map's folder) and the chat HUD's `add` / `add_signed` (to hide shared-waypoint private messages).
|
||||
- **Files:** writes only under `horizon-mods/.horizon-mod-data/ayynoxs_minimap/` (settings, waypoints) and `ayynoxs_worldmap/` (map tiles).
|
||||
- **Network:** no internet access. It only sends Horizon mod messages on `ayynoxs_map:sync` to the server you play on (shares only after `/wp sync on`), and `/msg` commands you start yourself with `/wp share <nr> <player>`.
|
||||
- Pinned to nightly `6475f62` (2026-11-04)."""
|
||||
authors = ["DenoxyYT (Ayynox)"]
|
||||
owners = ["DenoxyYT"]
|
||||
owner_ids = [94991632]
|
||||
license = "MIT"
|
||||
source = "https://github.com/DenoxyYT/ayynoxs-map-pack"
|
||||
icon = "icons/ayynoxs_map_pack.png"
|
||||
categories = ["utility", "adventure", "social"]
|
||||
tags = ["minimap", "world", "map", "waypoints", "multiplayer"]
|
||||
|
||||
[[versions]]
|
||||
version = "0.4.2"
|
||||
published = "2026-11-05"
|
||||
game = "26.3"
|
||||
file = "ayynoxs_map_pack-0.4.2.hnmod"
|
||||
sha256 = "d5cef20531720a594969b7b7acfd20d2d32d644d7b0ae230dd68a46f98172371"
|
||||
changelog = """
|
||||
Changes from the review of 0.4.1:
|
||||
- Map sharing is off by default and chosen per server: /wp sync on (or the setting) turns it on. When a server can pass shares on, the pack says so once in chat.
|
||||
- Waypoints arrive only through private messages to the player (commands.message.display.incoming); the marker in public chat does nothing.
|
||||
- Shared chunks are taken only for the player's current level, a real layer and within 2048 blocks of the player; shared waypoints stop at 1000 per world.
|
||||
Also: the world map is drawn like a map item again (one block per cell), which is cheaper while dragging.
|
||||
Built for Horizon nightly 6475f62 (2026-11-04)."""
|
||||
@@ -0,0 +1,36 @@
|
||||
id = "baritone"
|
||||
kind = "native-mod"
|
||||
name = "Baritone"
|
||||
summary = "A Rust port of the Baritone pathfinder: #goto, #mine, #farm, #build, #explore, #follow, #elytra and the rest."
|
||||
description = """
|
||||
A port to Rust of Baritone 1.21.4 for Horizon, written from the Java source: the pathfinder (A* with walking, sprinting, parkour, bridging, pillaring, doors, ladders and water bucket landings), `#goto`, `#mine`, `#farm`, `#follow`, `#explore`, `#build` (schematics and shapes), `#tunnel`, `#elytra`, waypoints, and every setting and command of the Java mod. Type `#help` in chat. PARITY.md in the source lists every Java class and what became of it.
|
||||
|
||||
What it does not do: it draws the cached chunks semitransparent (`renderCachedChunks`) only if Horizon later offers a renderer for it. Like the Java mod it plays for you, so many multiplayer servers ban it: that choice is the player's.
|
||||
|
||||
For reviewers:
|
||||
- No network access of its own: nothing in the source opens a socket or an HTTP request.
|
||||
- It writes only its settings, cached chunks and waypoints under `horizon-mods/.horizon-mod-data/baritone/`, and reads the schematic and explore-filter files the player names in a command.
|
||||
- It starts an operating system program in two places, both in `src/utils/notification.rs`: desktop notifications (PowerShell on Windows, osascript on macOS, notify-send on Linux), which are off unless the player sets `desktopNotifications true`, and `#pizza`, which opens a web page in the browser (the Java mod has the same command).
|
||||
- The `.hnmod` is built from the source of the tagged release, `python tools/pack.py`, and is the same file every time.
|
||||
- Pinned to Nightly 2026-10-30 (ba6344a): the launcher builds the game on that commit, and so does not depend on the Nightly the player has."""
|
||||
authors = ["luhnox (this port); Baritone by leijurv and the Baritone contributors"]
|
||||
owners = ["luhnox"]
|
||||
license = "LGPL-3.0-or-later (a derivative of Baritone, https://github.com/cabaletta/baritone)"
|
||||
source = "https://github.com/luhnox/horizon-baritone"
|
||||
icon = "icons/baritone.png"
|
||||
categories = ["utility", "transportation"]
|
||||
tags = ["pathfinding", "automation", "bot", "mining", "elytra", "port"]
|
||||
key = "RWRTLwnAmb4dyVYWM1egwotcybd6nw1ILTIWGHmQVwiMROClbjW0JoKZ"
|
||||
|
||||
[[versions]]
|
||||
version = "1.1.38"
|
||||
published = "2026-11-04"
|
||||
game = "26.3"
|
||||
file = "baritone-1.1.38.hnmod"
|
||||
sha256 = "b1a79d09061c30f757f428d9702a1a9f39a3c11d7ad17c96d48e101150e98e0c"
|
||||
signature = """
|
||||
untrusted comment: signature from minisign secret key\r
|
||||
RURTLwnAmb4dyQdoJpJlo6cHKjQifEH+yI6oUn+h7Qt0U0nujno7s1PO+nfhF4AxS8m8SVGgPrTl6JPTLuVYXai08leFO6JlVAY=\r
|
||||
trusted comment: timestamp:1793793185\tfile:dist/baritone.hnmod\thashed\r
|
||||
Rur3Vc4xI4A+zxLLeLBlPg+T3D0yNMhoPgjOutE/SxtQJ9J1Mjh5LsceEF0Peql/fBP+Ja5+2s5iH7BJWCjfBA=="""
|
||||
changelog = "`#mine` and `#goto <block>` of a block that is not found underground now explore the surface instead of digging down; the full Mask family, IOpenSet and LinkedListOpenSet; the goal beam shows through terrain; 247 of 297 Baritone 1.21.4 classes ported, none missing (PARITY.md)."
|
||||