- 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)
10 KiB
10 KiB
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)
- По мере переписи модулей — тест на каждый