linuxdo-idea-ui
為 linux.do 提供全新外觀的油猴腳本合集:包含 JetBrains/Darcula IDE 風格、飛書 IM 以及釘釘 IM 三種外觀,僅進行介面換皮而不觸及任何數據。
AI 翻譯
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證A read-only 3D map of a Minecraft server's world with Medieval Factions territories, borders and relations.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Faction Map is a Minecraft plugin that draws a lightweight 3D map of a server's world in the browser, with Medieval Factions politics on top: each faction's territory tinted in its own colour, claim borders, faction names, and alliance, war and vassal links between factions.
It is a faction-native map, not a general-purpose one. The terrain is the top surface only: no caves, interiors, entities or lighting. That keeps it cheap. The plugin reads only chunks that players have already loaded, within a fixed main-thread budget per tick, and it never writes to the world or to Medieval Factions. Without Medieval Factions it still draws the terrain.
Live: Saltmarsh claims more land (13 to 29 chunks) and the open viewer picks it up without a reload.
The design is RFC 0002 in the Dans-Plugins RFC repository. This is the first milestone (M1): the skeleton, the capture and tile pipeline, the embedded web server and the faction layers.
dev prerelease there is an automated build of main that has not been through any release check: use it only to try unreleased changes, and back up the server first. You can also build the jar with ./gradlew build (see Testing).plugins folder of your server.http://127.0.0.1:8199/ on the server machine. The map fills in as players explore.The viewer listens on 127.0.0.1 only. To show the map to players, put it behind your reverse proxy, or change web.host (see the Configuration Guide).
The versions in minecraft-versions.json: 1.21.11, 26.2 and 26.3, on Spigot or Paper. CI checks that every Bukkit class, field and method the jar uses exists on each of them, and that its bytecode (Java 21) loads on each. Folia is not supported.
/fmapconfig.ymlRead-only. No block writes, no world saves, no command dispatch, no chunk loading (only chunks for which isChunkLoaded is true are read), and Medieval Factions through its getters only: never its database, its REST API, or a save or delete. Everything the plugin writes is under plugins/FactionMap/ and is derived: deleting that folder is always safe and rebuilds the same tiles. CI checks this on the jar's bytecode (scripts/check_read_only.py).
A main-thread budget. Capture stops each tick once capture.mainThreadBudgetMicros (500 µs by default) would be exceeded. Meshing, tile writing and the web server run on their own threads.
Works on phones. The panel becomes a bottom sheet that can be hidden.
No player data. The map reads no player names, UUIDs or positions. Faction names are shown by default and can be replaced with letters; faction homes are off by default.
You can find the support Discord server here.
Please fill out a bug report here.
Linux:
./gradlew clean test
Windows:
.\gradlew.bat clean test
If you see BUILD SUCCESSFUL, the tests have passed. The build downloads the Medieval Factions 7.0.0 release jar that the integration compiles against and checks its SHA-256.
python3 scripts/check_read_only.py --self-test
python3 scripts/check_read_only.py build/libs
curl -fsSL -o /tmp/check_api_compat.py https://raw.githubusercontent.com/Dans-Plugins/release-gates/v23/gates/check_api_compat.py
python3 /tmp/check_api_compat.py --versions minecraft-versions.json target build/libs
check_read_only.py checks the jar's bytecode against the read-only rules (see What it guarantees); check_api_compat.py checks every Bukkit class, field and method the jar uses against each version in minecraft-versions.json. CI runs both after ./gradlew clean build.
tools/smoke/ boots the plugin on a throwaway Spigot 26.3 server with Medieval Factions and four mineflayer bots, which create factions, claims and relations; the areas around their faction sites are force-loaded. gate.py then measures the performance budget: p99 main-thread time per tick ≤ 1 ms with no tick above 5 ms after warm-up, and a block change reaching the served tile in ≤ 3 s. The Smoke workflow runs it in GitHub Actions on every pull request. Usage reporting and bStats are switched off on that server before its first boot.
Measured on a local throwaway server: Spigot 26.3 on Temurin 25, Medieval Factions 7.0.0, ~1,480 chunks loaded, 4 bot-created factions with 84 claims and one alliance, war and vassalage each. Development machine (shared, not a production host); two runs on 2026-10-18. The bots cannot hold chunks loaded on 26.3 (they send no movement packets), so the gate now force-loads 15 × 15 chunks around each faction site to make the loaded set the same on every run:
| Budget (RFC 0002) | Run 1 (600 s) | Run 2 (300 s) | |
|---|---|---|---|
| Main thread per tick, p99 | ≤ 1 ms | 0.18 ms | 0.43 ms |
| Main thread per tick, max after warm-up | ≤ 5 ms | 0.82 ms | 2.5 ms |
| Capture per chunk, p50 (main thread) | ≤ 150 µs | 56 µs | 67 µs |
| Block change (TNT) → tile served over HTTP | ≤ 3 s typical | 1.36–1.63 s, 6 of 6 | 1.32–1.54 s, 6 of 6 |
| Tile rewrite (8 × 8 chunks, background) p50 / p95 | ≤ 50 ms | 13 / 19 ms | 18 / 31 ms |
| Tile size per update, p50 / max | ≤ 64 KB | 50 / 66 KB | 41 / 66 KB |
| Load wave (256 new chunks force-loaded), p99 / max | p99 ≤ 2 ms | – | 1.0 / 7.3 ms |
The largest tiles (mountains and forest) slightly exceed the 64 KB per-update target, and the load wave's worst tick exceeds 5 ms; both are tracked for the next milestone.
A Docker-based test server is available for development.
sample.env to .env and configure as needed../gradlew build./up.shThe server listens on localhost:25565 and the map on http://localhost:8199/.
To rebuild the plugin, copy the new jar into the running container and restart the server:
./reload-plugin.sh
./down.sh
Usage reporting is on by default: when the plugin is enabled, it sends its name and version to the author's trace server so it is known which plugins are actually in use, and each /fmap a player runs sends one event naming the subcommand (the console, command blocks and text that is not a subcommand are not counted). Nothing about players, worlds or IPs is sent, apart from any tags the server's operator adds under tags: in plugins/trace/config.yml, which go with every event (see the Configuration Guide). The plugin says on the console at every start whether reporting is on. Each event also carries a random server ID (the server-id line in plugins/trace/config.yml) so servers can be counted rather than events. It identifies no person, account or IP address; delete the line to get a new one. To turn it off:
usage-reporting.enabled to false in plugins/FactionMap/config.yml;enabled to false in plugins/trace/config.yml (created on first start);TRACE_USAGE_REPORTING=off or DO_NOT_TRACK=1.This version ships without a trace key, so reporting is off ("no key") until one is added in a later release.
Details: https://danielstephenson.dev/usage-reporting
| Name | Main Contributions |
|---|---|
| Daniel McCoy Stephenson | Creator; design (RFC 0002) |
The plugin's code was drafted by Claude (Anthropic) on Daniel Stephenson's behalf.
src/main/resources/web/vendor/three.min.js.src/main/resources/colors.json) is generated from the block catalogue of Minecraft-USD-Exporter (MIT).This project is licensed under the GNU General Public License v3.0.
See the LICENSE file for full details.
This project is in active development: milestone M1 of RFC 0002. Next (M2): the bot-scripted check that every faction change reaches the map, and the event-plus-poll coverage measured end to end. Opt-in faction homes, also planned for M2, are already available (factions.showHomes, off by default).