LunaTranslator/docs/ru/hooksettings.md
HIllya51 b0a83d563e .
2025-08-08 19:24:50 +08:00

117 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# HOOK Настройки
## Общие настройки
1. #### Кодовая страница
::: info
Эта настройка имеет смысл только если извлекаемый из игры текст является **многобайтовой строкой** без указания кодировки в **внутренних механизмах HOOK**. Если HOOK уже указал кодовую страницу внутри, или текст является **широкой строкой (wide char)** либо **UTF32 строкой**, эта настройка не имеет никакого эффекта.
:::
Обычно нет необходимости изменять эту настройку. Только в некоторых старых движках (например, Yuris) официальная китайская версия может использовать кодировки GBK/BIG5/UTF8. Если правильный текст не определяется, просто отправьте мне [issue](https://lunatranslator.org/Resource/game_support). Изменение этой настройки обычно бесполезно.
1. #### Задержка обновления
Если вы столкнулись с одной из следующих ситуаций:
1. Текст извлекается по одному-два символа за раз;
2. Текст извлекается построчно, заменя предыдущую строку, и в итоге отображается только последняя строка;
3. Текст извлекается корректно, но очень медленно;
то вам нужно отрегулировать этот параметр.
Для случаев **1 и 2**, поскольку текст в игре отображается слишком медленно, а задержка обновления слишком мала, каждые несколько символов или каждая новая строка сразу же отображаются. В этом случае вам следует **увеличить задержку обновления** или повысить скорость отображения текста в игре.
Для случая **3** вы можете **умеренно уменьшить задержку обновления**, следя за тем, чтобы не возникли ситуации **1 и 2**.
1. #### Максимальная длина буфера
Иногда текст может постоянно обновляться. В этом случае, если задержка обновления высока и не может быть уменьшена, текст будет продолжать поступать до тех пор, пока не заполнит буфер или пока обновления не прекратятся (обычно это происходит, когда игра теряет фокус, поэтому чаще всего буфер просто заполняется).
Чтобы решить эту проблему, можно соответствующим образом уменьшить длину буфера, при этом важно не сделать длину буфера слишком маленькой, чтобы она не стала меньше фактической длины текста.
1. #### Максимальная длина кэшированного текста
Полученный исторический текст будет кэшироваться. При просмотре содержимого определенного текста в окне выбора текста будет запрашиваться кэшированный исторический текст. Если текстовых записей слишком много или текст постоянно обновляется, это приведет к накоплению избыточного кэшированного текста, что может вызывать заметные задержки при просмотре (иногда даже без активного просмотра). На самом деле большая часть этого кэша представляет собой бесполезный текст. Полезный исторический текст можно просмотреть в окне исторического текста, поэтому это значение можно свободно уменьшить (по умолчанию 1000000, но достаточно установить 1000).
1. #### Максимально допустимая длина выходного текста
При пропуске или просмотре истории текста в игре может выводиться сразу большое количество текста, но он может быть вам неинтересен. Настройка этого значения на подходящий уровень позволяет отфильтровывать внезапные всплески текстового вывода.
## Специальные настройки игры
1. #### Дополнительные хуки
1. #### Универсальные Win32-хуки
После активации в игру будут внедрены универсальные Win32-функции хукинга, включая функции GDI, D3DX и строковые функции.
Внедрение слишком большого количества хуков может замедлить работу игры, поэтому по умолчанию эти хуки не внедряются.
Если не удается извлечь правильный текст, можно попробовать активировать эти две опции.
1. #### Специальный код
Специальный код будет записан только при **вставке специального кода** и **выборе текста специального кода**. При следующем запуске этот специальный код будет автоматически вставлен. В этих настройках записаны все ранее сохраненные специальные коды, где их можно добавлять или удалять.
1. #### Отложенная инъекция
Иногда игра требует, чтобы хуки вставлялись в DLL, а DLL загружается только после непродолжительной работы игры. Нам также нужно дождаться загрузки DLL перед внедрением.
1. #### Настройки специальных HOOK
Настройки в разделе "Настройки HOOK" в интерфейсе настроек являются настройками по умолчанию. Они применяются, если для игры не указаны специальные настройки HOOK.
Для настройки специальных HOOK для конкретной игры необходимо в **управлении играми** открыть интерфейс **настроек игры**, на вкладке настроек игры переключиться на подвкладку HOOK, отменить **следование умолчанию**, после чего можно установить специальные настройки HOOK для игры.
::: details
![img](https://image.lunatranslator.org/zh/gamesettings/1.jpg)
![img](https://image.lunatranslator.org/zh/gamesettings/2.png)
:::
## Формат специальных кодов
1. #### HOOK
`{H|B}{A|B|C|W|I|S|Q|U|V}[F][N][codepage#][padding+]data_offset[*deref_offset][:split_offset[*deref_offset]]@addr[:module[:func]]`
H - это inlineHook, B - это vehhook
Одиночные символы: A/B - mbcs little-endian/big-endian, C - UTF8, W - UTF16, I - UTF32.
Строки: S - строка ASCII по умолчанию, Q - UTF16, U - UTF32, V - UTF8.
F: добавлять символ новой строки после каждого чтения строки
N: игнорировать контекст
寄存器的data_offset
* 32-бит EAX -4, ECX -8, EDX -C, EBX -10, ESP -14, EBP -18, ESI -1C, EDI -20
* 64-бит RAX -C, RBX -14, RCX -1C, RDX -24, RSP -2C, RBP -34, RSI -3C, RDI -44, R8 -4C, R9 -54, R10 -5C, R11 -64, R12 -6C, R13 -74, R14 -7C, R15 -84
1. #### JIT HOOK
`{H|B}{A|B|C|W|I|S|Q|M|U|V}[F][N][codepage#][padding+]arg_index[*deref_offset][:split_offset[*deref_offset]]@{info}:JIT:{UNITY|YUZU|PPSSPP|VITA3K|RPCS3}`
arg_index是JIT函数的参数index。M为C#字符串仅UNITY可用。
Информация UNITY: [сборка]:[пространство имён]:[имя класса]:[имя функции]:[количество параметров]
Информация YUZU/PPSSPP/VITA3K/RPCS3: эмулируемый адрес
1. #### Встраивание
`E[D][S][N|O]HOOKCODE`
E - использование встроенной аннотации, HOOKCODE - специальный код JIT или специальный код HOOK.
DПри записи конвертировать китайские символы в японский набор символов
SПри извлечении использовать способ извлечения текста, указанный в HOOKCODE
NПри записи создать новую строку и поменять указатель строки
OПри записи перезаписать исходную строку
1. #### Прямое чтение памяти
`R{S|Q|V|U}[codepage#]@addr`
R - это маркер прямого чтения памяти
S - строка ASCII по умолчанию, Q - UTF16, U - UTF32, V - UTF8