- refactor(8.5.1): split render/engine/uniform/impl 28 classes into hand/sky/esp/post/ui/world(+liquid) leaves - refactor(8.5.1): split renderer/ui top 28 files into blur/batches(+ordered)/item/deferred(+sched)/pass/dispatch leaves; add tools/pkgsplit scripts (split_struct.py, promote.py) for reproducible waves - refactor(8.5.1): split render/engine/text 24 files into font(+faces/info)/glyph/msdf/render/command leaves; fiximports tool; disambiguate Font/GlyphAtlasManager shadowing - refactor(8.5.1): split nondraggable/impl into bars(+jump)/locator(+panel)/buttons/tooltips/dynamicisland/overlay; promote.py +8-indent & ctor support - refactor(8.5.1): nondraggable dynamicisland 5->4 files (IslandUiUtil into controls) - refactor(8.5.1): split features/gui/clickgui top 20 files into render/screen/editor/input/tabs/picker/font; ClickGuiModel records nested - refactor(8.5.1): picker 6->5+screen leaf - refactor(8.5.1): picker catalog leaf (picker=2: state+icon manager) - refactor(tools): improve pkgsplit import handling (fiximports v2) - refactor(8.5.1): split util/text 8 -> mask/format/edit leaves (≤4) - refactor(8.5.1): split util/network 5, util/player/effect 5, util/media 5 (+ shadow fix) - refactor(8.5.1): split util/pvp 13, util/projectile 13, util/block 8 - refactor(8.5.1): split util/wav 9, util/item 9, util/combat 9, util/player/inventory 9 - refactor(8.5.1): split render/helpers 16 + config/values 16 - refactor(8.5.1): split renderer/ui/draw 23 -> shape/box/corner/edge/paint/effect - refactor(8.5.1): split render/engine/command 17 -> core/shape/effect/texture/world - refactor(8.5.1): split renderer/ui/runtime/script 23 -> engine/runtime/module/registry/render/patch - refactor(8.5.1): split profiler 14 + hud 14 + addon 14 - refactor(8.5.1): split iris 13 + profile 13 + text/backend 12 - refactor(8.5.1): split config 12 + module 12 + cosmetic 11 - refactor(8.5.1): split rhi/pipeline 11 + mixininterface 11 + config/common/impl 11 - refactor(8.5.1): split util/player 10 + rhi/resource 10 + runtime/render 10 - refactor(8.5.1): split rhi 9 + svg 9 + command 8 - refactor(8.5.1): split core 9 + postprocess 9 + combat 9 - refactor(8.5.1): split command/impl 16 + modules/player 14 + modules/misc 12 - refactor(8.5.1): split ui/runtime 43 -> core/style/input/reconcile/asset - refactor(8.5.1): split session/microsoft 8 + relations 7 + animation 7 - refactor(8.5.1): split engine/world 7 + postprocess/graph 7 + api/v0/render 7 - refactor(8.5.1): split sodium 12 + aiming 21 - refactor(8.5.1): split хвост 13 папок 34 файла - fix(8.5.1): видимость членов и enum после расщепления пакетов - refactor(8.5.1): FailRotationProcessor -> processors root (impl 5 -> 4) - docs(8.5.1): TODO — волна 8.5.1 завершена (0 папок >4 файлов) - refactor(8.5.2): split LoVisualAltManagerScreen 1113 -> 11 файлов alt/ (≤200 строк) - docs(8.5.2): LoVisualAltManagerScreen сплит завершён - refactor(8.5.2): split UiPrimitiveRenderer 1053 -> фасад 188 + primitive/ + rect/ (7 файлов ≤200); fix readPoints индексация - docs(8.5.2): UiPrimitiveRenderer сплит завершён
157 lines
14 KiB
Markdown
157 lines
14 KiB
Markdown
# LoVisual
|
||
|
||
Проект состоит из одного компонента — мода.
|
||
|
||
| Компонент | Стек | TODO |
|
||
|-----------|------|------|
|
||
| `combatant-client-26.2/` | Java 25, Fabric (MC 26.2) | [`combatant-client-26.2/TODO.md`](combatant-client-26.2/TODO.md) |
|
||
|
||
> Лаунчер (Rust + Slint) и backend (Rust + axum) удалены из проекта — развитие только мода.
|
||
|
||
---
|
||
|
||
## Правила (для мода, продублированы в его TODO)
|
||
- KISS / DRY / SOLID
|
||
- Макс. 200 строк на файл (фасады-делегаты исключение)
|
||
- Макс. 4 файла на папку
|
||
- Никакого статика, никаких this-escape, никаких мёртвых миксинов
|
||
- Без пустышек; каждый этап компилируется (`./gradlew build`)
|
||
- Тесты обязательны для новых модулей (JUnit)
|
||
|
||
---
|
||
|
||
## Статус
|
||
- [x] Фаза 1: Ребрендинг `combatant` → `lovisual`
|
||
- [x] Фаза 2: Выкинуть Runtime/JarReplacement + Panic
|
||
- [x] Фаза 3: Разбивка 12 файлов-гигантов
|
||
- [x] Фаза 3.5: Удаление читерских модулей (легит-направление)
|
||
- [x] Фаза 4: Security (BackdoorProtection, StaffTracker)
|
||
- [x] Фаза 5: Нормализация модулей (ленивый Minecraft, GameClock)
|
||
- [x] Фаза 6: Тесты (EventBus, конфиг, утилиты) — см. `combatant-client-26.2/TODO.md`
|
||
- [ ] Фаза 7: Новые модули по мотивам SoupVisuals — см. ниже
|
||
- [ ] Фаза 8.5: Аудит структуры ≤200/≤4 — 8.5.1 (папки >4) ЗАВЕРШЕНА 2026-09-10
|
||
(0 папок >4, коммиты 8846d53…303b17e); далее 8.5.2 (гиганты >600),
|
||
план в `combatant-client-26.2/TODO.md`
|
||
- [ ] Фаза 9: Оптимизация FPS (9.1 фиксы мёртвых грузов → 9.2 модуль Optimize),
|
||
план в `combatant-client-26.2/TODO.md`
|
||
|
||
---
|
||
|
||
## Фаза 7: Новые модули — референс SoupVisuals
|
||
> Референс: `ref/soupvisuals-src/` — SoupVisuals 3.2.0 (MC 1.21.11, лицензия SOUP-1.0).
|
||
> Код референса НЕ копируем (чужая лицензия + декомпил) — только пере-реализация идей
|
||
> под наши правила (≤200 строк/файл, ≤4 файла/папку, без статики, тесты).
|
||
> Модули референса лежат в `ref/soupvisuals-src/padej/soup/implement/features/modules/`.
|
||
|
||
- [x] **Hitboxes** (visuals) — цветные хитбоксы сущностей, как у Soup: ТОЛЬКО рендер
|
||
контейнера с настройкой цвета/видимости, БЕЗ увеличения хитбокса (увеличение —
|
||
чит, удалён в Фазе 3.5). Референс: `visuals/Hitboxes.java`
|
||
- [x] **Watermark** (HUD, draggable) — обещан в README, в коде отсутствует
|
||
- [ ] **Gps** (world) — луч/маркер направления к точке (у Soup ~400 стр.); связка
|
||
с Xaero-waypoints и координатами. Референс: `world/Gps.java`
|
||
- [x] **Light** (world) — кастомный цвет освещения (у Soup 41 стр.). Референс: `world/Light.java`
|
||
- [ ] **HitBubbles** (particles) — пузыри при ударах по игрокам (у Soup 323 стр.).
|
||
Референс: `particles/HitBubbles.java`
|
||
- [ ] **AmbientParticles + FireFlyParticle** (particles) — атмосферные частицы мира /
|
||
светлячки (у Soup 775 + 241 стр.). Референс: `particles/AmbientParticles.java`,
|
||
`particles/types/FireFlyParticle.java`
|
||
- [x] **NameProtect** (misc) — подмена своего ника и ников друзей в тексте чата/скорборда
|
||
(у Soup 42 стр.). Референс: `other/NameProtect.java`
|
||
- [ ] **EndCrystal** (visuals) — улучшенный рендер энд-кристаллов (у Soup 217 стр.).
|
||
Референс: `other/EndCrystal.java`
|
||
- [ ] **Trinket 2.0** — апгрейд нашего CosmeticDisplay до уровня Soup Trinket:
|
||
иконки-спутники (Atom/Ball/Cat/Donut/Flame/Flower/Gem/Ghost/MCTiers), трейл
|
||
(цвет sync/custom, длина, толщина), звуки (типы + громкость), частицы
|
||
(у Soup 315 стр.). Референс: `other/Trinket.java`
|
||
- [ ] **Cosmetics Overhaul (Unified Cosmetics)** — сейчас модуль бесполезен (next/prev
|
||
keybind без экрана). План (обсуждён в брейнсторме, черновик, детали могут
|
||
измениться):
|
||
- **Слоты вместо типов**: новый `CosmeticSlot` enum — `MODEL, PET, HEAD,
|
||
SHOULDERS, BACK, WAIST, LEGS, HELD` (8 шт). `CosmeticType` (MODEL/PET/ACCESSORY)
|
||
остаётся внутри `CosmeticModel` как есть (анимация/рендер-логика не трогается).
|
||
- Аксессуары (ACCESSORY) получают поле `slot` — парсится из `avatar.json`
|
||
(`"slot": "head"`), при отсутствии — вывод по имени папки (существующая
|
||
эвристика witch/hat→HEAD, wing→BACK, wheel→WAIST, иначе→HELD).
|
||
- `CosmeticManager`: `EnumMap<CosmeticSlot, CosmeticModel>` вместо 3 полей.
|
||
MODEL/PET — по одному активному. 6 accessory-слотов — **можно носить
|
||
несколько одновременно** (шляпа + крылья + пояс разом).
|
||
- Экран `CosmeticsScreen`: левая панель — живая 3D-модель игрока
|
||
(`InventoryScreen.renderEntityInInventoryFollowsMouse` или свой вызов
|
||
EntityRenderDispatcher), drag ЛКМ по превью — вращение (yaw/pitch,
|
||
pitch ограничен ±30°), скролл — zoom (0.5–2.0), кнопка сброса угла.
|
||
Открывается через **ПКМ по модулю в ClickGUI** (спецкейс вместо обычной
|
||
settings-панели — прецедент есть в `ClickGuiEditorScreen`).
|
||
- Hotspot-зоны поверх 3D-модели (HEAD/SHOULDERS/BACK/WAIST/LEGS + иконка
|
||
HELD сбоку) — клик открывает правую панель выбора модели для этого слота.
|
||
- Offset/rotation/scale — **на слот** (не на модель, т.к. модулей может быть
|
||
десятки, а статичных SettingDef-полей на каждую не сделать): 6 стандартных
|
||
num()-хелперов модуля (per-slot), visibleWhen(активный слот). Смена модели
|
||
в слоте может потребовать подстройки — ок, вписывается в существующий
|
||
SettingDef/SettingFactory конвейер без новой инфраструктуры.
|
||
- Цвета из Theme.theme() (windowBg/accent/textMuted), файлы по правилам
|
||
≤200 строк/≤4 файла на папку: `CosmeticsModule`, `CosmeticsScreen`,
|
||
`CosmeticsSlot`(=CosmeticSlot), `CosmeticsSlotPanel`.
|
||
- i18n: `module.cosmetics.*`, `setting.cosmetics.active_slot`,
|
||
`offset_x/y/z`, `rotation`, `scale`, `setting.cosmetics.slot.<slot>` и т.д.
|
||
(en_us + ru_ru обязательно).
|
||
- Открытые вопросы для следующего захода: точные хитбокс-координаты зон
|
||
по проценту региона превью, формат хранения per-slot offset в .lvcfg,
|
||
нужен ли предпросмотр модели до эквипа в правой панели.
|
||
- **Портирование процедурных head/back-модулей в слоты** — из всех
|
||
`visuals/*` только 3 модуля реально являются «надетыми на игрока»
|
||
процедурными косметиками (нашёл через grep по HeadAnchor-хелперу):
|
||
- `ChinaHat` (+`ChinaHatModel`, `ChinaHatPalette`, 295+107+144 стр.) —
|
||
конус на голове → встроенная опция слота **HEAD**.
|
||
- `TazikHat` (859 стр.! требует разбивки на файлы ≤200 стр. при
|
||
портировании — геометрия/палитра/модуль отдельно, как у ChinaHat) —
|
||
«тазик»/чаша на голове → **HEAD**.
|
||
- `BackSword` (287 стр.) — катана на спине → **BACK**.
|
||
Остальные visuals-модули (ESP, Chams, Trails, Rain, PostFX и т.д.) —
|
||
НЕ переносятся, это общие эффекты, а не надеваемые предметы.
|
||
План: каждый становится встроенным вариантом (built-in entry, не
|
||
.bbmodel) внутри соответствующего слота — юзер выбирает между
|
||
своими .bbmodel-моделями И этими процедурными built-in вариантами
|
||
в одном и том же слоте. Настройки самого варианта (цвет/размер/сегменты
|
||
и т.д.) показываются в правой панели слота, когда built-in выбран
|
||
активным. Старые `@ModuleInfo`-модули `chinahat`/`tazikhat`/`backsword`
|
||
удаляются как отдельные модули из списка Visuals (их функциональность
|
||
полностью переезжает в Cosmetics) — конфиг-миграция/бэккомпат не нужны
|
||
(легит-клиент, публичного релиза со старыми конфигами ещё не было —
|
||
уточнить у пользователя перед удалением).
|
||
- **"None" в каждом слоте** — обязательный первый вариант в списке выбора
|
||
любого слота (Model/Pet/Head/Shoulders/Back/Waist/Legs/Held): "ничего
|
||
не надето", слот пуст, `CosmeticManager.active` для этого слота = null.
|
||
Не путать с выключенным модулем `CosmeticDisplay` целиком — None это
|
||
per-slot состояние, остальные слоты продолжают рендериться.
|
||
- Подтверждено пользователем: точно только 3 built-in кандидата
|
||
(ChinaHat/TazikHat/BackSword), остальные visuals-модули не переносятся.
|
||
- **Решённые вопросы (финал черновика):**
|
||
1. Hotspot-координаты — **вариант B**: проекция костей игрока (голова/тело/
|
||
ноги vanilla-модели) в экранные координаты через `ScreenProjection`
|
||
(уже есть в `render/helpers/`), а не фиксированные проценты региона —
|
||
точнее держит зоны при вращении/приседе. Fallback на фикс-проценты,
|
||
если в реализации окажется дороже, чем стоит.
|
||
2. Хранение offset/rot/scale — **обычные `NumberValue`-поля модуля**
|
||
(6 слотов × offset_x/y/z/rot/scale), сохраняются в `.lvcfg` как
|
||
обычные настройки — без нового ConfigValue-типа.
|
||
3. Правая панель — **live-apply**: клик по модели в списке слота сразу
|
||
применяет и показывает на превью, без отдельной кнопки Apply.
|
||
4. Built-in процедурные варианты (ChinaHat/TazikHat/BackSword) — **просто
|
||
обычные записи в списке слота** (с иконкой-превью), не выделяются в
|
||
отдельную секцию; настройки открываются так же, как у .bbmodel-моделей.
|
||
5. `TazikHat` (859 стр.) при портировании — **разбить как ChinaHat**:
|
||
`TazikHatGeometry` + `TazikHatPalette` + встраиваемый рендер-класс без
|
||
собственного `@ModuleInfo`/Module-обвязки (вызывается из слота HEAD).
|
||
6. Старые модули `chinahat`/`tazikhat`/`backsword` — **удаляются
|
||
полностью** из списка Visuals, функциональность только в Cosmetics.
|
||
- [ ] **Balancer** (mctiers) — тиры игроков с mctiers.info (у Soup отдельная категория
|
||
MCTiers). Референс: `mctiers/Balancer.java`
|
||
- [ ] **HandsShader: новые шейдеры руки** — у Soup 10 режимов (Solid, Chroma, Balatro,
|
||
Smoke, Stripes, Glow, Glass, Invert, Snow) + dual-режим с blend-режимами
|
||
(Mix/Add/Multiply/Screen/Overlay/Difference); шейдеры лежат в
|
||
`ref/soupvisuals-src/assets/soupapi/shaders/hand/`. Пере-реализовать недостающие
|
||
и добавить к нашим (BackSword/Chams hand shaders уже есть dual — сверить набор).
|
||
Референс: `visuals/HandsShader.java`
|
||
- [x] **Фикс ChinaHat** — текущая геометрия кривая (смахивает на самбреро/зонт);
|
||
переделать модель в нормальную конусную шляпу по референсу Soup
|
||
(`visuals/ChinaHat.java` + `ChinaHatModel.java`).
|