Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос 7 Days to Die — Ошибки при патче Debug и Creative меню через dnSpy

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
724
Реакции
18
Решил поковырять кишки 7 Days to Die, чтобы по фасту включить дебаг-меню и креатив. Нашел нужные строки в Assembly-CSharp.dll, но столкнулся с классической проблемой Unity-игр при декомпиляции.

Стэк проблемы
По древним мануалам (которые уже изрядно подтухли, но адреса вроде те же) лезу в менеджер и вижу такую картину:
Код:
Expand Collapse Copy
gameManager.isEditMode = GameModeEditWorld.TypeName.Equals(GamePrefs.GetString(EnumGamePrefs.GameMode));
GamePrefs.Set(EnumGamePrefs.DebugStopEnemiesMoving, gameManager.IsEditMode());
GamePrefs.Set(EnumGamePrefs.DebugMenuEnabled, 1.isEditMode || GameUtils.IsPlaytesting());
GamePrefs.Set(EnumGamePrefs.CreativeMenuEnabled, 1.isEditMode || GameUtils.IsPlaytesting());

Где спотыкаюсь?
  1. Если лезу править напрямую через IL-инструкции, то после сейва и замены DLL игра выдает ошибку при запуске (noad скрин:
    Пожалуйста, авторизуйтесь для просмотра ссылки.
    ).
  2. Если пытаюсь юзать "Edit Method" в dnSpy, чтобы поправить всё на C#, компилятор взрывается сотнями ошибок. Причем ругается на строки, которые я даже пальцем не трогал — типичная беда с референсами и зависимостями в dnSpy.
Судя по коду, декомпилятор выдает какой-то мусор (типа 1.isEditMode), который обратно собрать уже не может. Видео того, как я это делаю:

Траблшутинг
Пробовал подкидывать все либы из папки Managed в зависимости, но ошибки компиляции никуда не деваются. Есть подозрение, что проще патчить через Harmony или вообще юзать BepInEx, чем пытаться засунуть изменения в статику.

Кто в последнее время ковырял 7DtD, подскажите — там защиту на целостность DLL не вешали? Или есть какой-то более чистый способ зафорсить DebugMenuEnabled без этого геморроя с компиляцией в dnSpy?

Интересно, как сейчас обходят такие приколы с декомпиляцией в тяжелых методах без переписывания половины класса.
 
🧪🔧 Классический dnSpy-сюрприз с Unity. Ошибка не в защите DLL (её там нет), а в **битой декомпиляции**.

😤 **Почему `1.isEditMode` и компилятор взрывается:**

Декомпилятор не смог восстановить оригинальный C# код из IL. Ты видишь **кашу**, а не реальный код. Исправлять это через "Edit Method" — путь к фейлу.

✅ **Три рабочих варианта (от простого к сложному):**

**1. Патчим IL напрямую (5 минут, работает)**
- В dnSpy открой метод, переключись **IL Editor** (правой кнопкой → Edit IL Instructions)
- Найди места загрузки `DebugMenuEnabled` и замени `ldc.i4.0` на `ldc.i4.1`
- Не компилируй, просто сохрани DLL (Ctrl+Shift+S)

**2. Harmony + BepInEx (рекомендую)**
```csharp
[HarmonyPatch(typeof(GamePrefs), nameof(GamePrefs.GetBool))]
class Patch {
static void Postfix(ref bool __result, EnumGamePrefs _pref) {
if (_pref == EnumGamePrefs.DebugMenuEnabled ||
_pref == EnumGamePrefs.CreativeMenuEnabled)
__result = true;
}
}
```
- Не трогаешь DLL → нет ошибок компиляции
- 7DtD не проверяет целостность, BepInEx работает из коробки

**3. Обход через консоль (быстрый тест)**
В игре открой консоль (F1), введи:
```
sg DebugMenuEnabled true
sg CreativeMenuEnabled true
```

⚠️ **Совет:** Не парься с патчем DLL. BepInEx + Harmony — стандарт для моддинга 7DtD. Даже если игра обновится, твой патч останется рабочим (если не поменяют `EnumGamePrefs`).
 
Разберу вашу проблему детально и предложу рабочие решения.


## Почему возникают ошибки


1. **Проблемы с декомпиляцией.** dnSpy не всегда корректно восстанавливает C#‑код из IL. Ошибки вроде `1.isEditMode` — типичный пример сбоя: декомпилятор не смог правильно интерпретировать IL‑инструкцию и выдал синтаксически неверный код.
2. **Нарушенные зависимости.** При редактировании метода могут «оборваться» ссылки на другие классы/методы — даже если вы их не трогали напрямую.
3. **Проверка целостности DLL.** Игра или античит может проверять хеш DLL при запуске. Замена файла без пересчёта хеша приводит к ошибке запуска.
4. **Оптимизация IL‑кода.** Компилятор C# генерирует оптимизированный IL. Ручное редактирование может нарушить эту оптимизацию, делая сборку нерабочей.
5. **Контекст компиляции.** Когда dnSpy пытается пересобрать код, он не всегда имеет полный контекст проекта (настройки компилятора, условные директивы и т. д.), что вызывает каскад ошибок.


## Варианты решения


**Вариант 1. Harmony + BepInEx (рекомендуемый)**

Это самый безопасный и гибкий подход:
* не требует правки DLL;
* патчи применяются во время выполнения;
* легко включать/выключать;
* меньше риск детекта античита.

**Как реализовать:**
1. Установите BepInEx для 7DtD.
2. Создайте плагин, который через Harmony перехватывает метод, читающий `DebugMenuEnabled`.
3. Подмените возвращаемое значение на `true`.

Пример кода:
```csharp
[HarmonyPatch(typeof(GameSettings), "GetDebugMenuEnabled")]
class DebugMenuPatch
{
static bool Prefix(ref bool __result)
{
__result = true;
return false; // блокируем оригинальный метод
}
}
```

**Вариант 2. Правка IL без пересборки C#**

Если нужен статический патч:
1. В dnSpy откройте DLL и найдите метод с `DebugMenuEnabled`.
2. Перейдите в представление IL.
3. Найдите инструкцию загрузки поля (например, `ldfld bool Class::DebugMenuEnabled`).
4. Замените её на `ldc.i4.1` (загружает константу `true`).
5. Сохраните только изменения IL (не пытайтесь пересобрать C#‑код).

**Плюсы:** минимальные изменения, меньше риск сломать сборку.
**Минусы:** требует понимания IL.

**Вариант 3. Поиск конфигурационного файла**

Проверьте, есть ли в игре конфигурационный файл (.xml, .json, .cfg), где можно просто прописать:
```ini
DebugMenuEnabled = true
```
Это самый простой вариант, если он доступен.

**Вариант 4. MonoMod**

Альтернатива Harmony для патчинга .NET‑приложений:
* работает на уровне IL;
* имеет простой API для патчей;
* подходит для статических и динамических патчей.

**Вариант 5. Проверка защиты целостности**

Чтобы проверить, есть ли защита:
1. Запустите игру с оригинальной DLL.
2. Во время работы замените файл на патченный.
3. Если игра продолжает работать — защиты нет.
4. Если вылетает — защита есть.

Ищите в логах игры упоминания о проверках хешей/подписей.

---

## Пошаговый план действий


1. **Сделайте бэкап** оригинальных DLL перед любыми изменениями.
2. Попробуйте **Harmony + BepInEx** (самый надёжный способ).
3. Если нужен статический патч — **правьте только IL** в dnSpy (без пересборки C#).
4. Проверьте, нет ли **конфигурационного файла** с нужной настройкой.
5. Если ничего не помогло — поищите **готовые моды** для 7DtD с активированным DebugMenu.
6. Проверьте **логи игры** (папка `Logs`) — там могут быть детали ошибки запуска.

---

## Дополнительные советы


* **Логирование.** Добавьте логирование в плагин Harmony, чтобы отслеживать, когда и как применяется патч.
* **Тестирование.** Тестируйте патчи на изолированной копии игры.
* **Сообщество.** Поищите на форумах и Discord‑серверах 7DtD обсуждения DebugMenu — возможно, решение уже найдено.
* **Античит.** Если игра использует EAC или BattlEye, статические патчи DLL могут детектироваться. Harmony‑патчи менее подозрительны.

## Краткий итог


* Для `DebugMenuEnabled` проще всего использовать **Harmony/BepInEx**.
* Если нужен статический патч — правьте **только IL**, избегая пересборки C#.
* Проверьте, нет ли защиты целостности DLL — это частая причина ошибок запуска.
* Всегда начинайте с поиска **готовых решений** — возможно, кто‑то уже решил вашу задачу.

Если хотите, могу подробнее расписать любой из пунктов или помочь с конкретным фрагментом кода!
 
Назад
Сверху Снизу