- GodRays: PostProcessPass PRE_HAND, godrays.frag (radial sky blur to the sun over the scene, depth from mainDepth), GodRaysUniforms, GodRaysSkyMixin takes sunAngle/sunset colour from SkyRenderState; off under shaderpacks (Iris) - Knife (Melee Skins): 33 skins from Bedrock geo/anim in assets/lovisual/knife, animator (static_idle, draw/inspect/melee/run, 0.2 s crossfade, Catmull-Rom) with background baking, first/third-person render, sounds, mixins ItemInHand/PlayerItemInHand/Minecraft - Wings: wingSource Procedural/Model with 14 textured Bedrock models (WingModelDef/WingModels/WingModelRenderer, BedrockClip + procedural angel/demon/dragon); shared Bedrock parser util/bedrock (GeoParser, GeoFaces, Channel, Clip) - EnchantGlint: Pulse/Fire/Galaxy/Hologram/Glitch/Sparkle/Aurora styles in glint/style, coverage setting, custom animated texture matrix via GlintTextureMixin.styleMotion; lang en/ru for all new settings - Themes: shader backdrop for ClickGUI (Backdrop record, 6 modes, intensity/speed/scale, ui_theme_backdrop_batch.frag with 700 ms REVEAL/ERASE wipe, ThemeBackdrop2D in BackgroundComponent), ThemeEntry.backdrop persisted in JSON and profile codec, 6 presets with backdrops, backdrop settings in the theme editor - tests: GodRaysSun, GlintStyles, Knife assets/animator, WingModel, Backdrop, bedrock Channel; ./gradlew build green
24 KiB
24 KiB
LoVisual Mod (26.2): план и статус
Мод вырос из форка Combatant Client. Полный старый текст (фазы 1-12, все решения, коммиты, списки файлов) сохранён
в docs/TODO_HISTORY.md (770 строк, не правим); здесь только актуальное.
Правила (обязательные)
- KISS / DRY / SOLID, без оверинжиниринга; публичный API менять можно, мёртвый код удалять.
- ≤250 строк на файл (новый код держим ≤200), ≤4 .java файла на папку (
checkFolderLimitпадает при нарушении). - Коммиты на английском; владелец просит большие коммиты, не дробить; ничего не пушить без просьбы.
- Без
static Minecraftв полях, без this-escape, без мёртвых миксинов и файлов-пустышек. - Каждый этап компилируется (
./gradlew build), у нового кода тесты (JUnit) на чистую логику. - Тексты сайта и ответы без длинного тире; ответы владельцу по-русски.
Сделано (кратко)
- Ребрендинг, удаление Runtime/JarReplacement, разбивка файлов-гигантов (>600 строк), удаление читерских модулей, тесты.
- Перенос QoL-модулей из Delta (StreamerMode, LockSlot, AutoRespawn/Leave/Accept, ThirdPerson, UseTracker, NoServerPack,
DeathCoords, ItemScroller, TapeMouse, SoundReducer и др.), команды с префиксом
%и автокомплит (в том числе в ванильном чате). - Оптимизация FPS (мёртвые грузы, модуль Optimize), аудит attack-визуалов по sacura/GodWeer.
- Сессия 2026-10-01: TargetESP (Созвездие, Мечи), JumpCircles, KillEffect Blood (с depth), Hero/orbs главное меню и его
настройки, Simple Voice Chat (мягкая интеграция, модуль, HUD), тултипы (amber по умолчанию, выключаются, авто-масштаб под GUI
Scale), описания модулей и плашка описания в ClickGUI,
%tierс подсказками ников, краши запуска (MixinExtras 0.5.5, helper-классы внеmixins.*, порядок static init тем).
Фаза 13: порт идей из evo (отчёт: docs/EVO_REPORT.md)
Лицензия: код и ассеты evo проприетарные (ref/evo/README.md). Для релиза только свои модели/звуки или разрешение автора;
пути из отчёта нужны для локальной отладки, ассеты evo в репозиторий не коммитить.
- HoldMyItems Scripted на LuaJ: режим Dynamics/Scripts/Both;
hand_pose,hand_relative_pose,item_pose,item_model+ аддоны (изconfig/lovisual/holdmyitems/, горячая перезагрузка); песочница без io/os/luajava;V:cancelEquip/cancelSwing,animator(квады модели),particleManager,C:setCamRot/setCamPos, «всегда обе руки». Код:held/lua/{runtime,api,ext}. Не сделано: событияswingMHand/interact/blockBreaking,use_duration/using_item, ItemStack-поля, roll камеры, ресурс-паки. - TNTTimer: уже был в
Predictions(плашка с таймером); добавлены «Иконка TNT» и «Полоска фитиля». - ProjectileTrails: новый модуль
visuals/effects/projectiletrails/(TrailStore,TrailRibbon): ленты за стрелами, трезубцами, жемчугом, снежками, яйцами, зельями, огненными шарами, ветряными зарядами, фейерверками; длительность, ширина, заливка Solid/Glow, контур, глубина, 8 режимов цвета. Шейдерные заливки evo (Nebula, Plasma, Matrix и т.д.) не портированы. - DeathEffects: режимы KillEffect Shatter, Ascend, Explosion, Disintegrate (
hits/death/:DeathPhysicsчистая + 6 тестов,DeathBody,DeathMesh,DeathEffectHelper; тело из 6 частей с UV скина игрока, у мобов серые кубы). Настройки вDeathEffectSettings. Не сделано: скрытие ванильного трупа на время эффекта, шейдерdeath_blast, режим Lightning из evo (у нас уже есть свой Lightning). - GuiPresence (идея evo, наш бэкенд):
backend/chat-service(новый крейт, in-memory,POST /presence/gui, привязка mc uuid к аккаунту, TTL 6 с, план и протокол вbackend/chat-service/PLAN.md), маршрут/presence/*в gateway (+CHAT_HTTP_URL, лимит 6/с на аккаунт), Dockerfile/compose/dev-stack. Мод:platform/presence/{PresenceCodec,PresenceTimeline,PresenceClient}(кодек 36 байт, плейбэк с задержкой 300 мс, адаптивный опрос 350 мс/2 с), модульvisuals/presence/GuiPresence(делиться своим меню, показывать чужие, дистанция, размер), снимок менюModulesMenuScreen.presenceSnapshot. Мини-копия ClickGUI в мире перед игроком из цветных квадов (без текста). Нужны привязанный аккаунт (%link) и мультиплеер. Не сделано: значок «LoVisual» у ника/в табе, названия модулей в панели, просмотр видео (.watchу evo), деплой chat-service на прод СДЕЛАН 2026-10-02 (rsync backend +docker compose up -d --build chat-service gateway; на сервер не уехали накопленные правки accounts-service/configs-service, они ждут отдельного деплоя). - ElytraTrails и Blizzard сверены с оригиналом evo (
ref/evo/.../ElytraTrailsModule,BlizzardModule), спец-тесты по поведению evo: ElytraTrails: концы крыльев по настоящей цепочке матриц модели элитры (pose/WingTipLocator,ElytraPoses), горизонтальная лента, сужение Grow/Shrink, колебания Wave/Helix, плавный старт, реакция на скорость, мягкие края, ореол, свой/чужие, разрыв ленты при скачке больше 8 блоков или паузе больше 300 мс, шаг записи 0.35, до 256 точек (ribbon/RibbonShape,TrackBuffer.addContinuous). Не сделано из evo: заливка шейдером (8 видов), раздельные цвета крыльев. Blizzard: снег только над землёй и под открытым небом (карта высот, спавн между землёй и потолком, нет снега в помещении), константы ветра/плотности/турбулентности как у evo, экспозиция неба, «Whiteout» (миксин туманаBlizzardFogMixin), скрытие ванильной погоды (WeatherHideMixin), рендер «капля» вдоль скорости, обмерзание 32 полосы, «только в снегопад» по силе осадков. Не сделано из evo: «Snow cover» (снег накапливается на земле, шейдер). Не проверено вживую: вид, туман, положение концов крыльев. - Темы с шейдерным фоном как у evo (2026-10-05, вживую не смотрели; фон только за ClickGUI, переход темы сразу). Сделано:
theme/impl/Backdrop, полеThemeEntry.backdrop, JSON и профиль, шейдерui_theme_backdrop_batch.frag(6 режимов + волна REVEAL/ERASE 700 мс),ThemeBackdrop2D, рисование вBackgroundComponent, 6 пресетов с фоном, редактор тем (режим/сила/скорость/масштаб). Не сделано: превью фона в карточках тем, lang-ключи редактора (их у редактора нет и для остальных полей). План был: 1.Themes.Backdrop(mode, intensity, speed, scale)вThemeEntry;ThemeStore/ThemesProfileCodecпишут и читают его, старые темы = None. 2. Шейдерtheme_backdrop.frag(Iridescence, Magma, Digital Rain, Grid Horizon, Singularity, Ember), цвета из accent/accentSoft/windowBg. 3. Рисование за окном ClickGUI через пайплайн полноэкранных проходов (ScreenPipelines.screen), uniformThemeBackdrop. 4. Шейдерный переход при смене темы (theme_wipe): волна от нового к старому за времяTHEME_TRANSITION_MS. 5. Пресеты с включённым фоном (Cinder Magma, Dusk Grid Horizon, Prism Iridescence, Forest Digital Rain, Nitro Singularity, Amber Ember). 6. Редактор тем: режим, интенсивность, скорость, масштаб; lang en/ru; тесты на чистую логику (Backdrop.lerp, кодек, режимы). - Wings: режим «Модель» (2026-10-04, вживую не смотрели):
WingsполучилwingSource(Procedural/Model) иwingModel(14 видов). Общий парсер Bedrock вutil/bedrock/{geo,anim}(GeoParser,GeoFaces,Channel,Clip), крылья вvisuals/wings/model/(WingModelDefкаталог,WingModelsзагрузка,WingModelRendererякорь как у игрока-модели + присед,anim/ProceduralWingsangel/demon/dragon,anim/BedrockClip). Ресурсы скопированы из evo вassets/lovisual/{wings,textures/wings}(лицензию решать до релиза). Проверить в игре: сторона/направление X, Z-сдвиг от спины, зеркальность текстур на гранях, свет (множитель яркости, не lightmap). - Knife (Melee Skins) (2026-10-04, вживую не смотрели):
visuals/knife/(модульKnife, каталогKnifeSkinизknife/index.json,anim/аниматор какInspectу evo: static_idle + draw/inspect/melee_1..3 + аддитивный бег, кроссфейд 0.2 с, Catmull-Rom;model/бейк геометрии и клипов в фоновом потоке;render/первое лицо с руками игрока вrighthand_pos/lefthand_posи камерой, третье лицо у себя). Миксиныmixins/render/knife/*(ItemInHandRenderer.submitArmWithItem,PlayerItemInHandLayer,Minecraftввод). Ресурсы из evo вassets/lovisual/{knife,textures/knife,sounds/knife,sounds.json}(звуки cs2 и скины CS: лицензию решать до релиза). Не сделано: шейдер holy (костиholyBonesрисуются обычной текстурой), нож в левой (оффхенд) руке, иконки слотов, выбор скина в UI вне ModeValue. - Быстрые модули P1 (2026-10-02, сверены с
ref/evo/mod/jar-src-named/evovis/module/{misc,render}, тесты зелёные, вживую не смотрели): AutoSprint (player/, как у evo держит спринт; вход черезSprintControlEvent, решаетSprintController.canStartSprinting), TotemCounter (visuals/totems/, свои тотемы справа от хотбара; счёт попов чужих у нас уже вutil/pvp/opponents/TotemPopSnapshot, без отдельной клавиши сброса как у evo), EnchantGlint (visuals/items/glint/: стили Rainbow/Solid/Gradient/Hidden (2026-10-04 добавлены Pulse/Fire/Galaxy/Hologram/Glitch/Sparkle/Aurora, Coverage и своя анимация текстурной матрицы:glint/style/,GlintTextureMixin.styleMotion), сила, скорость, масштаб, «предметы/броня»; у evo свои RenderType и 11 стилей, у нас перерисовка ванильных текстур блескаGlintTexture+GlintTextureMixin; не сделано: режим «Special» трезубец/щит), ArmorColor (visuals/items/armor/: цвет по прочности Gradient/Steps, цели Players/Friends/Self/Mobs, Only Below, Low Pulse; миксин вEquipmentLayerRendererMixin, флаг цели вLivingEntityRenderState), PlaceAnimation (visuals/placeanimation/: блок вылетает из руки, наклон/масштаб, как у evo: скрытие из мешаSectionCompilerPlaceMixin+ SodiumSodiumPlace*Mixin, отрисовка движущимся блокомLevelRendererPlaceMixin, блок-сущностиBlockEntityPlaceMixin; формулы кривых и сторона руки восстановлены по идее evo, направление наклона и сдвига по вертикали подобраны на глаз). Проверить в игре: миксины брони/блеска/PlaceAnimation (при ошибке прислать лог), вид наклона и сдвига блока, перекраску блеска и её возврат при выключении, Sodium (скрытый блок не оставляет дыр у соседей), TotemCounter при GUI Scale 2/3/4. - KineticLyrics починен (2026-10-02):
LyricPlayback.loadTrackвызывалreset()после записи ключа трека, ключ стирался, загруженный текст отбрасывался, а запрос уходил заново каждый тик (lrclib отвечал 503). Теперьlrc/source/LyricsFinder: lrclib (точный запрос с длительностью, ранжированные поискиlrc/match/LyricMatch, обычный текст получает оценочные таймингиPlainLyricTimer), запасной NetEase, повтор при занятом сервисе (до 6 раз). Нет из evo: YouTube Music и распознавание Whisper. Проверить вживую на Spotify. - CustomModels (2026-10-02, из
CustomModels-2026-10-02-120830.zip):visuals/models/+mesh/(Chicken, Rabbit, Verity из .bbmodel), ассеты вassets/lovisual/models/, миксиныrender/models/. Только у вас на экране, цели: себя/друзья/все. Нужна проверка вживую (поза рук, рука от первого лица, Verity под Iris/Sodium). Исходный проект зарезан до этого модуля, остальные его части не нужны. - GodRays (2026-10-04, вживую не смотрели):
visuals/godrays/(модульGodRaysкакPostProcessPassPRE_HAND, чистая математикаGodRaysSun), шейдерgodrays.frag(один проход: радиальный блюр неба к солнцу поверх сцены, глубина изcontext.mainDepth()),GodRaysUniforms, миксинrender/godrays/GodRaysSkyMixinзабираетsunAngleи закатный цвет изSkyRenderState. Не работает при шейдерпаке (Iris). - Дальше P1-P2 — перенос модулей из evo поштучно (референс:
docs/EVO_REPORT.md§1.2; лицензия evo проприетарная — их ассеты/код в репо не кладём, только идеи):- Blizzard (render, evo ~1290 LOC, M/L) — высотная метель: ветровые снежинки с горизонтальным сносом, белая пелена, обмерзание краёв экрана.
- FoodInfo (~889, M) — сытость/восстановление и подсказка оптимального порядка еды на полосе голода.
- ElytraTrails (~2208, M) — светящиеся шлейфы с концов крыльев элитры, переиспользовать наш
Trails. - CustomHand (~373, M) — пост-процесс шейдер руки (частично есть
shaders/hand_glass.frag). - DynamicLights (~553, M) — факелы/лампы в руке светят по-настоящему; сначала проверить наш
Light. - TotemSound (~257, S) — свой звук при срабатывании тотема.
- Sounds (~195, S) — звук на клиентские действия (открытие инвентаря, прыжок, клик в GUI…).
- InventorySort (~390, S/M) — сортировка инвентаря по пресету (клиентские QUICK_MOVE, без чужих пакетов).
- StorageTracker (~678, M) — память содержимого контейнеров, поиск предмета, подсветка где лежит.
- ConsumeESP (~671, M) — круг с кольцом прогресса над целью, когда она ест/пьёт.
- PatPat (~645, M) — гладить моба пустой рукой (бинд, анимация/частицы, всё локально).
- Showcase (~882, L) — кинематографичный облёт постройки камерой; запись клипа — позже (MVP: облёт).
- P3 (следующий заход): Chunk Cache, Schematics, HitFix (риск античита), Camera, Graffiti, Skin Wheel, Discord RPC, Replay, Trainer. Полный список и сложности: отчёт, раздел 1.2.
Открытые задачи
Проверить в игре (код готов, вживую не смотрели)
- Автокомплит
%в ванильном чате (%,%to, Tab,%tier); если миксин не применится, прислать лог. - Режимы TargetESP Созвездие и Мечи; формы JumpCircles; кровь (лужи, яркость, depth); новые режимы KillEffect (ориентация граней частей, UV скина, яркость искр); ProjectileTrails (вид ленты, глубина); Hero/orbs-меню.
- HoldMyItems Scripted: знаки осей
M:rotate, видимость Lua-частиц, анимация квадов на реальной модели. - GuiPresence: нужен запущенный стек (
backend/scripts/dev-stack.sh) и два клиента с привязанными аккаунтами на одном сервере. - SpatialGui (инвентарь был прозрачным): сверено с
ref/mods/Spatial-GUI; убрано ванильное затемнение в захвате (ScreenSpatialBackgroundMixin) и композитинг плоскости переведён на premultiplied-alpha пайплайнWORLD_TEXTURED_PREMULTIPLIED. Проверить в игре; если всё ещё прозрачно, следующий подозреваемый: глубина захвата (clear 1.0) и HUD внутри захвата (у эталона захватывается только экран, отдельным GuiRenderer). - Войсчат с настоящим SVC 2.6.24 (события mute/speaking, значок шапки HUD).
- Размер плашки описания в ClickGUI и авто-масштаб тултипа при GUI Scale 2/3/4.
Решения и долги
- Тип ClickGUI: селектор «Тип ClickGUI» (
classicпо умолчанию), точка выбора экранаClickGuiScreenManager; ждёт решения, какой второй вид делать. - ViewModel: свободный
Customswing и режимы sacura (Возвращение, Круговая); HitEffect: distortion/glow post-process; JumpCircles: easing на появление; KillEffect: toggle «сквозь стены»; Trails: сравнение с sacura вживую. - Фаза 8.5.3 (история: раздел 8.5): около 150 файлов 250-400 строк и папки >4 файлов. Правило: касаешься файла по другой
задаче, первым коммитом разбей на ≤250 (фасад + package-private хелперы, API вызывающих не трогать), вторым целевое изменение.
Очередь самых больших: LoVisualRenderPipelines, DraggableHudElementRegistry, Predictions, DynamicIsland, Module,
HudNotifier, AltManager, Triangulator, TargetESP, UiPrimitiveRenderer. Фасады (Renderer2D и т.п.) остаются исключением.
При переносах пакетов не ломать id модулей и ключи настроек (совместимость
.lvcfg), после move проверять grep'ом. - Разнос
addon/events/mixininterfaceпо смыслу отложен (54/41/88 файлов-импортёров, чистый import-churn): только скриптовым отдельным проходом. - Фаза 9 (FPS) закрыта: мёртвые грузы починены в коде, ручной модуль Optimize есть; авто-деградацию по FPS решено не делать.
- Фаза 7 (Delta QoL): Wasted и Arrows отменены, TapeMouse оставлен по решению владельца; список в истории.
.gitignoreдляserver-plugin/.classpath,.project,.settings/.- Приёмка серверного плагина (Velocity +
%policy), бэкенд chat-service и addons-registry (корневой TODO.md).
Заметки для сессий
- Игру запускает владелец:
cd mod && ./gradlew runClient(из корня репозитория./gradlewнет). - Параллельные сборки блокируют друг друга:
flock /tmp/claude-1000/gradle.lock ./gradlew build --offline -q. - Helper-классы для миксинов нельзя класть в пакет
dev.loki.lovisual.mixins.*(MixinIllegalClassLoadError): им место вmixinhandlers/,render/или рядом с фичей. - Мировые пайплайны (
WorldPipelines) рисуют без отсечения задних граней и без записи глубины: порядок обхода вершин не важен. - Параллельная сессия может коммитить в тот же репозиторий: перед
git commit --amendсмотретьgit log -3.