Phase 9: reproducible builds, balance from the server, spark check, play feedback

Build: every tool pinned (JDK, packwiz, Gradle plugins, Python packages), exports
normalised, tools/check_reproducible.py proves two clean builds are byte-identical.

Server-side balance: a server can load config/cobblesurvival/datapack.zip in place of
the jar's data, /reload applies it, tools/server_update.py packages it and refuses
when a client change is needed. JEI drop pages are sent by the server. Code-held
balance numbers moved to tuning/server.json.

Performance: spark in the pack (server only), tools/perf_test.py with fake players
whose chunks really are active, docs/performance.md.

Adrian's feedback: default keys R, U, J, §; drop pages link to Cobblemon Info and show
real chances; bosses only hurt in battles; battle XP halved; channels between the
islands low level; temperature ×3 with insulation doubled; hazards start at once; no
item dots on the map; a wild attack starts a battle; the starter only faints; quest
book on join with a basics page and an HMs page; regional forms obtainable.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
claudeandClaude Opus 5.5 committed 2026-11-09 16:26:30 +01:00
1 parent 0741c84077
commit 4083791944
133 files changed
+8350 -3273

No files matched your search

+75
View File
@@ -0,0 +1,75 @@
# Performance
Generated by `tools/perf_test.py`: the island world template, a 6G heap, 120 s to settle, then 180 s measured tick by tick with spark profiling the server thread.
Players are the self-tests' fake clients: the server ticks them, loads their chunks and spawns Pokémon around them. One walks a long ring round the island when there are several. They send and encode no packets and fight no battles, so read this as the cost of the world, not of the network.
A tick has 50 ms; over that, the server falls behind.
| Scenario | Players | Pastures × Pokémon each | Machines each | Mean tick | p95 | p99 | Worst | Ticks over 50 ms | Pokémon pastured / wild | Working machines | Loaded chunks |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| solo | 1 | 0 × 0 | 0 | 4.6 ms | 6.4 ms | 9.8 ms | 216 ms | 1 of 3900 | 0 / 18 | 0 of 0 | 2731 |
| group | 5 | 4 × 8 | 5 | 19.2 ms | 25.7 ms | 33.3 ms | 269 ms | 2 of 3900 | 113 / 175 | 16 of 25 | 8704 |
| stress | 8 | 6 × 16 | 10 | 38.3 ms | 50.4 ms | 54.9 ms | 322 ms | 215 of 3900 | 558 / 246 | 46 of 80 | 10763 |
## Where the server thread's busy time goes: solo
| Part | Share |
| --- | --- |
| Minecraft | 46.2 % |
| Other mods | 39.0 % |
| JVM and Kotlin | 11.4 % |
| Cobblemon | 3.1 % |
| Companion mod | 0.3 % |
Companion mod, heaviest methods including what they call:
- `dev.cobblesurvival.selftest.PerfLoad$$Lambda.0x000000080138d638.accept`: 2.02 %
- `dev.cobblesurvival.selftest.PerfLoad.register$onTickDone`: 2.00 %
- `dev.cobblesurvival.selftest.PerfLoad.onTickDone`: 2.00 %
- `dev.cobblesurvival.progress.HmsGate$$Lambda.0x0000000801380c60.accept`: 0.12 %
- `dev.cobblesurvival.progress.HmsGate.register$onServerTick`: 0.10 %
- `dev.cobblesurvival.progress.HmsGate.onServerTick`: 0.10 %
- `dev.cobblesurvival.progress.HmsGate.check`: 0.07 %
- `dev.cobblesurvival.progress.QuestEvents$$Lambda.0x000000080137b338.accept`: 0.07 %
## Where the server thread's busy time goes: group
| Part | Share |
| --- | --- |
| Minecraft | 61.4 % |
| Other mods | 20.6 % |
| JVM and Kotlin | 13.2 % |
| Cobblemon | 4.5 % |
| Companion mod | 0.2 % |
Companion mod, heaviest methods including what they call:
- `dev.cobblesurvival.selftest.PerfLoad$$Lambda.0x0000000801394200.accept`: 1.34 %
- `dev.cobblesurvival.selftest.PerfLoad.register$onTickDone`: 1.32 %
- `dev.cobblesurvival.selftest.PerfLoad.onTickDone`: 1.32 %
- `dev.cobblesurvival.selftest.PerfLoad.walk`: 0.24 %
- `dev.cobblesurvival.machine.MachineBlock$$Lambda.0x00000008022acee8.tick`: 0.13 %
- `dev.cobblesurvival.machine.MachineBlock.getTicker$lambda$1`: 0.13 %
- `dev.cobblesurvival.machine.MachineBlockEntity.serverTick`: 0.13 %
- `dev.cobblesurvival.progress.CobblebaseGate$Gate.invoke`: 0.08 %
## Where the server thread's busy time goes: stress
| Part | Share |
| --- | --- |
| Minecraft | 58.4 % |
| Other mods | 18.9 % |
| JVM and Kotlin | 17.0 % |
| Cobblemon | 5.5 % |
| Companion mod | 0.2 % |
Companion mod, heaviest methods including what they call:
- `dev.cobblesurvival.selftest.PerfLoad$$Lambda.0x0000000801386618.accept`: 1.02 %
- `dev.cobblesurvival.selftest.PerfLoad.register$onTickDone`: 1.02 %
- `dev.cobblesurvival.selftest.PerfLoad.onTickDone`: 1.02 %
- `dev.cobblesurvival.machine.MachineBlock$$Lambda.0x00000008022c2988.tick`: 0.31 %
- `dev.cobblesurvival.machine.MachineBlock.getTicker$lambda$1`: 0.30 %
- `dev.cobblesurvival.machine.MachineBlockEntity.serverTick`: 0.30 %
- `dev.cobblesurvival.selftest.PerfLoad.walk`: 0.27 %
- `dev.cobblesurvival.machine.MachineWork.tick`: 0.15 %