LoVisual/combatant-client-26.2/TODO.md
loki5512344 52d87368c9 chore(history): squash 10 commit(s) from 2026-07-31
- feat: Фаза 1 ребрендинг combatant → lovisual + восстановление config
- refactor: Фаза 2 — выкинуть Runtime/JarReplacement, заменить на Lifecycle
- refactor: Фаза 3.5 — удалить читерские модули, ESP под легит
- refactor: Фаза 3 — разбить Renderer2D (3379→2150 фасад + 14 хелперов ≤200)
- refactor: Фаза 3 — разбить BetterChatRenderer (2870→210 фасад + 21 хелпер ≤200)
- refactor: Фаза 3 — разбить UnifiedSettingRenderer (2798→208 фасад + 24 хелпера ≤200)
- refactor: Фаза 3 — разбить ClickGuiRenderer (1887→542 фасад + 15 хелперов ≤200)
- refactor: Фаза 3 — разбить NameTags (1791→438 фасад + 11 хелперов ≤200)
- refactor: Фаза 3 — разбить TargetHud (1655→340 фасад + 11 хелперов ≤200)
- refactor: Фаза 3 — разбить ESP (1538→269 фасад + 11 хелперов ≤200)
2026-07-31 23:14:14 +02:00

10 KiB
Raw Blame History

LoVisual Mod (combatant-client-26.2) — план переписи

Мод — форк Combatant Client, переписываем под LoVisual.

Правила (ОБЯЗАТЕЛЬНЫЕ, нарушение = откат)

  • KISS / DRY / SOLID — простая структура, без оверинжиниринга
  • Макс. 200 строк на файл (было >1500) — превышение = разбить на модули
  • Макс. 3 файла на папку — больше = новая подпапка по смыслу
  • Никакого статика — Minecraft.getInstance() только лениво, никогда в поле
  • Никаких this-escape — конструктор не публикует this
  • Никаких мёртвых миксинов — миксин только если реально нужен; cancellable=true только при реальном cancel
  • Без пустышек — файл без реализации не создаётся
  • Каждый этап компилируется — ./gradlew build перед переходом к следующему
  • Тесты обязательны для новых модулей (JUnit)

СТАТУС ПРОБЛЕМ (что вижу сейчас)

1. Ребрендинг не закончен (пункт 2)

  • 288 файлов / 1464 упоминания combatant в main-коде
  • Классы: CombatantRenderSystem, CombatantRenderEngineBootstrap, CombatantRenderPipelines, CombatantVulkanBackend, CombatantFrameGraph, CombatantTerrainVertex и др.
  • Заголовки файлов: «This file is part of the Combatant Client distribution» / copyright (c) pivosos2007

2. Файлы-гиганты (пункт 3) — 12 файлов > 1500 строк

Файл Строк
render/engine/renderer/Renderer2D.java 3379
features/gui/chat/BetterChatRenderer.java 2870
features/gui/clickgui/settings/UnifiedSettingRenderer.java 2798
features/module/modules/player/Scaffold.java 2416
features/module/modules/combat/AttributeSwap.java 1922
features/gui/clickgui/ClickGuiRenderer.java 1900
features/module/modules/visuals/NameTags.java 1791
features/module/modules/combat/ElytraTarget.java 1711
features/gui/hud/draggable/impl/TargetHud.java 1687
features/module/modules/visuals/ESP.java 1520
features/module/modules/combat/AutoCrystal.java 1516
features/gui/hud/nondraggable/impl/CustomBar.java 1496

3. Runtime / JarReplacement (пункт 4)

  • runtime/ (ClientRuntime, RuntimeGate, ClientRuntimeState, SOFT_PANIC/JAR_REPLACEMENT_PANIC, shutdown/resume-участники)
  • runtime/loader/ (JarReplacementCoordinator, LoaderBridge, PanicOnlyJarReplacementCoordinator)
  • Моё предложение: выкинуть. Живая замена jar в памяти — источник classloader-утечек, хрупкая, для клиента не нужна (обновление делает лаунчер). Заменить на простой Lifecycle.

4. Security (пункт 7)

  • features/security/BackdoorProtection — на деле защита от SSRF/translate-инъекций (порт ExploitPreventer, MIT). Полезное, но enum-синглтон со статикой.
  • features/relations/StaffTracker + StaffHeuristicsMatcher — детект «стафа» по эвристикам TAB. Сомнительно, решить оставить/выкинуть.

5. Тесты (пункт 6)

  • 5 тестов на ~213k строк. Добавлять по мере переписи модулей.

Фаза 1: Ребрендинг (пункт 2)

  • Восстановлен config/-пакет (55+3 файла) из ref/zip/combatant-client-26.2 (1).zip — он отсутствовал в форке, без него проект не собирался. Переименован combatant.client.config → dev.loki.lovisual.config. compileJava ✓
  • Заменить combatant → lovisual в main-коде (1464 вхождения, 288 файлов)
  • Переименовать классы Combatant* → LoVisual* (23 шт., включая IrisCombatantFrameHooks → IrisLoVisualFrameHooks)
  • Заголовки файлов → LoVisual, пересобрать копирайты (GPLv3 форка)
  • Проверить fabric.mod.json / lovisual.mixins.json на остатки
  • Проверить строки/сообщения/логи на «combatant»
  • JNI-имена в native: Java_combatant_client_ → Java_dev_loki_lovisual_ (34 шт.) + FindClass-пути

Проверка: rg -i combatant src → 0 ✓, ./gradlew build ✓ (1406 файлов изменено)

Фаза 2: Выкинуть Runtime/JarReplacement (пункт 4)

Вместе с рантаймом удалить и модуль Panic (features/module/modules/misc/Panic.java), интерфейс RuntimeControlModule, команду RuntimeCommand и все ветки на них в ModuleManager/Module. Panic — единственная реализация RuntimeControlModule, без него они становятся мёртвым кодом.

  • Удалить runtime/ и runtime/loader/ (14 файлов)
  • Удалить Panic.java + RuntimeControlModule.java + RuntimeCommand.java
  • Убрать ветки instanceof RuntimeControlModule и tickRuntimeControllers() из ModuleManager/Module
  • Убрать RuntimeGate из точек входа (LoVisual.java, модули, рендер) — заменён на Lifecycle
  • Заменить на простой Lifecycle-класс (dev.loki.lovisual.Lifecycle: INIT → ACTIVE → SHUTDOWN, гейты canRunRender/Hud/ShaderBridge + RenderResourceReadiness)
  • Panic-фичи удалены; ModuleManager.disableAll() оставлен как простая утилита
  • Мёртвые cleanup-методы удалены (shutdownForRuntime, clearRuntimeReferences, VanillaChatRuntimeCleanup, i18n-ключи panic/runtime)

Проверка: ./gradlew build ✓, тесты ✓ (13), rg runtime-подсистема → 0

Фаза 3: Разбивка файлов-гигантов (пункт 3) — ОТЛОЖЕНА, сначала чистка модулей

  • Сначала удалены читерские модули (см. Фазу 3.5) — рефакторить удалённые файлы не нужно
  • Renderer2D (3379) → renderer + пакеты (текст, примитивы, deferred-слои)
  • BetterChatRenderer (2870) → рендер, парсинг, кэш
  • UnifiedSettingRenderer (2798) → по типам настроек
  • ClickGuiRenderer (1900), NameTags (1791), TargetHud (1687), ESP (1538), CustomBar (1495)

Проверка: после каждого файла ./gradlew build; цель ≤200 строк/файл

Фаза 3.5: Удаление читерских модулей (легит-направление)

Пользователь решил: LoVisual — легитное приложение. Все читерские модули удаляются.

  • combat: удалены AttributeSwap, AutoAnchor, AutoAttack, AutoBed, AutoBow, AutoCrystal, Backtrack, Criticals, ElytraTarget, Hitbox, KillAura, KTLeave, MaceKill. Оставлены: ProjectilePuncher, PvpCooldowns, Reach, RubberHand, SpearAssist, TPSSync
  • movement: удалены ВСЕ модули (AirJump, AutoDodge, ElytraFly, ElytraHelper, Flight, Freeze, InventoryMove, NoFall, NoPush, NoStun, Parkour, Phase, ReverseStep, SafeWalk, Speed, Sprint, Step, Strafe, SuperFirework, TargetStrafe, Timer, Velocity, WindJump) — 22 файла
  • player: удалены AirPlace, AutoArmor, AutoEat, AutoTotem, Scaffold, XCarry. Оставлены: AutoTool, ClickPearl, FakeLag, NoDelay, NoInteract, ShitDropper
  • Осиротевшие хелпер-пакеты: удалены combat/autocrystal/ (17), combat/autobed/ (9), combat/autoanchor/ (9), util/block/scaffold/ (10), BlockPlacer + тест ScaffoldPlacementGateTest
  • Enum-заглушки: KillAura.RaycastMode/RotationTiming/AngleSmoothMode → локальные enum в ProjectilePuncher/Reach; Criticals.SelectionMode → удалено; Hitbox-зависимость убрана из ESP
  • ESP переписан под легит: новые настройки only_visible (LOS-луч от камеры), skip_invisible, only_armor (без брони не подсвечивать) — по умолчанию true, только для игроков

Проверка: ./gradlew build ✓, тесты ✓ (13), остатки только в комментариях/строках

Фаза 4: Security (пункт 7)

  • BackdoorProtection: убрать enum-синглтон, сделать инстансный сервис, ленивый Minecraft.getInstance()
  • Решить судьбу StaffTracker/StaffHeuristics — согласовать и выкинуть или переписать
  • Покрыть логику фильтров тестами

Фаза 5: Модули — нормализация под правила

  • Прочесать все 131 модуль: убрать static final Minecraft в полях (6 шт. уже найдено)
  • Проверить модули на System.currentTimeMillis() → заменить на игровое время
  • Разнести addon/events/mixininterface по смыслу

Фаза 6: Тесты (пункт 6)

  • Юнит-тесты: EventBus, конфиг, утилиты (игровые классы — mock)
  • По мере переписи модулей — тест на каждый

Проверка: ./gradlew test зелёный