1.4.2: проверка версии игры и хранилище, которое не стирается
Повод: 1.4.1 на игре 3.3.0 experimental не смогла прочитать Пространственное хранилище (Bag переписан) и при сохранении записала пустой маркер - вещи пропали навсегда. GameVersionGuard: версия из Constants.cVersionInformation (не из const cVersionMinor - та вшивается в DLL), поддерживается Major 3 и Minor/10 == 2, то есть любая 3.2.x. На другой версии в главном меню окно «мод несовместим, обновите» с единственной кнопкой «Выйти из игры» (решение пользователя), а вместо PatchAll ставятся по отдельности только окно и четыре патча сохранения хранилища. Всё, чем пользуется защита, сверено с декомпиляцией 3.3. Хранилище: непрочитанные байты (чужая версия или упавший разбор) проходят Read -> ToPlayer -> FromPlayer -> Write нетронутыми, ключ - entityId, сброс при открытии главного меню (последнее сохранение игрока делается раньше, внутри SaveAndCleanupWorld - проверено по коду игры). Пока байты не прочитаны, хранилище не открывается и не пополняется, с подсказкой. Проверено в игре на 3.2 через отладочные файлы FORCE_VAULT_UNREAD и FORCE_VERSION_GUARD (в .gitignore, в архив не попадают): 603 байта хранилища прошли сохранение и прочитались обратно совпадающими с исходными (26 ячеек, 24 предмета); окно появляется, Esc его не закрывает, кнопка закрывает игру. На настоящей 3.3 не проверено. Localization: 4 новых ключа на 13 языках, всего 165; README - статус и число ключей (было 149). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
77b56be9ae
commit
f4470b784f
@@ -19,6 +19,36 @@ namespace NecromancerTome
|
||||
{
|
||||
Instance = _modInstance;
|
||||
var harmony = new Harmony("necromancertome.harmony");
|
||||
|
||||
// НЕСОВМЕСТИМАЯ ВЕРСИЯ ИГРЫ (1.4.2, см. GameVersionGuard.cs): ставятся только окно в
|
||||
// главном меню и сохранение хранилища байт в байт - каждое отдельно, чтобы отказ одного
|
||||
// не помешал другим. Остальной код мода, написанный под другую версию, не запускается
|
||||
// вовсе: игра всё равно закроется из главного меню.
|
||||
if (!GameVersionGuard.IsSupported)
|
||||
{
|
||||
System.Type[] safetyPatches =
|
||||
{
|
||||
typeof(Patch_XUiC_MainMenu_OnOpen_VersionGuard),
|
||||
typeof(Patch_PlayerDataFile_Read_SpatialVault),
|
||||
typeof(Patch_PlayerDataFile_ToPlayer_SpatialVault),
|
||||
typeof(Patch_PlayerDataFile_FromPlayer_SpatialVault),
|
||||
typeof(Patch_PlayerDataFile_Write_SpatialVault),
|
||||
};
|
||||
foreach (System.Type patch in safetyPatches)
|
||||
{
|
||||
try
|
||||
{
|
||||
harmony.CreateClassProcessor(patch).Patch();
|
||||
Debug.Log("[NecromancerTome] ModEntry: unsupported game version - safety patch " + patch.Name + " applied");
|
||||
}
|
||||
catch (System.Exception e)
|
||||
{
|
||||
Debug.LogError("[NecromancerTome] ModEntry: safety patch " + patch.Name + " failed: " + e);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
harmony.PatchAll(Assembly.GetExecutingAssembly());
|
||||
PetFollowPatch.Init();
|
||||
// SpatialVaultPersistence needs NO Init(): it is four Harmony postfixes that PatchAll
|
||||
|
||||
Reference in New Issue
Block a user