sasheg dev 00671e7c0d Звук в клиенте пропал из-за неверного каталога ассетов
Клиент запрашивал звук, движок его принимал и запускал, а на выходе было
тихо. Причина оказалась не в коде игры.

Minecraft 1.12.2 не умеет читать ассеты по индексу и объектному хранилищу.
Он ждёт обычное дерево: <assetsDir>/minecraft/<путь>. А лаунчер хранит
ассеты по-современному — indexes/1.12.json со ссылками на objects/<aa>/<sha1>.

Мы передавали лаунчеру корень этого хранилища как --assetsDir. Игре это не
выглядит как поломка: язык и текстуры берутся из самого jar, поэтому клиент
выглядит полностью рабочим. Но звуки с 1.7.3 лежат только в ассетах, и их
просто не было на диске. Движок поднимался, play() вызывался, ogg не
находился, а paulscode на это молчит.

- materialize_assets.py разворачивает дерево из индекса и хранилища,
  жёсткими ссылками где возможно, и идемпотентен
- run-game.ps1 материализует ассеты перед запуском и указывает клиенту на
  развёрнутое дерево; --assetIndex больше не нужен
- проверено: 1305 объектов, из них 1085 ogg, sounds.json на месте, ошибок
  загрузки в логе нет

Заодно убрана временная диагностика звука и движения, добавленная ради
поиска причины: она доказала, что запрос и воспроизведение доходят до
OpenAL, и свою задачу выполнила.

Полный prepare-game.ps1 после этого проходит целиком: 112 патчей,
FORK COMPILES CLEAN, 3268 классов, RsxDebug в дереве не осталось.
2026-10-19 00:04:51 +03:00

RustNotMC

A survival game built on a Minecraft 1.12.2 client as the rendering platform, with its own server, its own protocol and its own accounts.

Repositories

Repository License What lives there
rsx-client MIT Loader, mod API, client hooks, deobfuscation tools
rsx-protocol MIT Wire format, packet schemas, shared simulation library
rsx-plugin-api MIT Interfaces for server-side content
rsx-server-core proprietary Tick loop, world, entities, scaling
rsx-auth proprietary Accounts, tokens, revocation

Target

Base platform is Minecraft 1.12.2, forked into our own source tree so the game is moddable from the start rather than patched from outside.

  • game fork: Java 17, compiled by game-fork\scripts\prepare-game.ps1
  • loader and mod API: Java 17
  • mods: Java only

Capacity target is 200 players on 4 cores and 8 GB of RAM, scaling to 500 on larger hardware.

The fork

The client is not wrapped around the game jar. game-fork rebuilds it from the verified vanilla jar into readable source, and the loader is an ordinary part of that game rather than an agent injected into someone else's process.

vanilla client-1.12.2.jar   verified Mojang signature
  -> mcp-1.12.2-srg.zip    3344 classes, 20817 members
  -> merge with MCP CSVs   9991 fields, 18715 methods renamed
  -> SpecialSource          3310 classes in MCP names
  -> FernFlower            2050 source files
  -> hand patches + rules   103 patches, one regex rule
  -> javac                  3261 classes, clean

prepare-game.ps1 runs the whole thing and is idempotent. Hand fixes live in game-fork\patches\decompiler-fixes.txt and are re-applied on every run, so regenerating the tree never loses them.

The fork holds Mojang-derived code and is not published. What ships in the open repository is the loader, the mod API and the build tools.

Modding

Mods are jars with a descriptor at META-INF/rsxmod.properties:

id=rsxm-lib
name=RustNotMC Library
version=1.0.0
env=CLIENT
entrypoint=net.rustnotmc.lib.LibMod
access=hud, text, world, player
depends.core=>=1.0

env is CLIENT, SERVER or BOTH. The loader runs on the client today; the field exists so a mod that targets both sides does not need a format change when the loader moves to the server.

Each mod gets its own class loader. Mods declare the capabilities they need and the loader grants them; reflection is never granted without explicit operator consent.

Load order comes from the dependency graph, not from filenames. Shutdown runs in reverse.

Building

rsx-client\scripts\build.ps1    # dist\rsx-loader.jar
rsx-client\scripts\test.ps1     # self test, 96 checks
game-fork\scripts\prepare-game.ps1   # rebuild the fork from the vanilla jar
game-fork\scripts\compile-game.ps1   # compile only, fast iteration

Only a JDK is required. No Gradle, no network once the mappings are cached.

Tools

Script Purpose
rsx-client\tools\merge_srg_mcp.py vanilla SRG plus MCP CSVs into one obf to MCP SRG
rsx-client\tools\apply_patches.py re-applies the hand fixes, fails loudly if one misses
rsx-client\tools\fix_stale_locals.py FernFlower's stale local references, scoped per method
rsx-client\tools\fix_generic_casts.py inserts the cast where a generic loses its type parameter
rsx-client\tools\fix_decompiler_rules.py systematic rewrites that would be hundreds of patches
rsx-client\tools\show_errors.py javac errors next to the source line that caused them

Minecraft is a trademark of Mojang Studios. This project is not affiliated with or endorsed by Mojang or Microsoft. Game assets are not redistributed here.

S
Description
Tschhh... Do not go there
Readme 22 MiB
Languages
Java 87.5%
Python 8.5%
PowerShell 4%