SA:MP Lua Arizona Убираем первое лицо от лаунчера Аризоны (FirstPersonHandler_class_destroyer_t.lua)

Tema05

Известный
Автор темы
1,507
475
Версия SA-MP
  1. 0.3.7-R3
Так как я просто обожаю все щикарные иновации, что нам предлагает лаунчер Аризоны, представляю вашему внимаю простенький стрипт, который полностью отрубает первое лицо, добавленное в последнем обновлении.

P.S. Возможно вызывает какие-то побочки, лично я не заметил их. UPD: На практике активного использования долгое время побочек не было замечено.
P.P.S. По идеи при обновлении лаунчера скрипт не должен сломаться, но такая вероятность есть, если что обновлю.
P.P.P.S. Знаю, что ты, читатель, сумеешь сделать это в 30 символов и без костылей, сделал как сумел, мне главное результат.

UPD 16.04.2025:
При длительном использовании мне удалось наткнуть, отследить и решить 2 проблемы.
1) Так как я пишу скрипты, то постоянно их перезагружаю. А у меня при каждом запуске выполняется порядка 9 поисков по сигнатуре через функцию findSignatureInModule. Так вот спустя несколько сотен перезапусков lua скрипты не могут запустить из-за нехватки памяти. Вызвано это утечкой памяти в данной функции. Для переменной buffer выделяется память для хранения байтов региона программы, но после она то ли не до конца очищается, то ли вовсе этого не делает. Попробовал разные решения, по итогу помогло каждый раз удалять эту переменную и вручную запускать сборщик мусора.
Lua:
buffer = nil
collectgarbage('collect')
2) Последнее время начал замечать 1 краш, который очень редко происходил при загадочных обстоятельствах. Это началось примерно в тот же момент как обновился антиафк от AIR. Он обновился из-за каких-то изменений в лаунчере Аризоны. После этого у меня также появился другой краш. По итогу выяснилось, что другой патч памяти, который замечательно работал несколько месяцев, при каких-то извращённых обстоятельствах параллельной работы сетевого соединения, вызванных с определённой вероятностью микрофризом от вообще другого asi скрипта, начинал конфликтовать с новым антиафк. Я потратил 4 дня, чтобы раскопать это говно и понять как гарантированно воспроизводить эту ошибку хотя бы за пару минут, а не часов.

Оказалось мои варианты решений, которые не давали обработчикам в core.asi выполняться начали вызывать эти проблемы. Это также навело меня на решение проблемы с этим скриптом и я переделал его. Изучил поподробнее как работает 1 лицо в лаунчере Аризоны. Теперь просто не будет проходить условие, которые переключает камеру на вид от 1 лица. Для состояния на ногах и в машине отдельно

Вот код:
Lua:
-- Паблик функция, не помню откуда взял
local ffi = require 'ffi'
ffi.cdef [[ ... ]]
function findSignatureInModule(signature, moduleName) ... end

local address, error = findSignatureInModule(
    '83 F8 03 75 ?? 83 3D ?? ?? ?? ?? 01',
    'core.asi'
)
if address then
    writeMemory(tonumber(address + 3), 1, 0xEB, true)
else
    print(error)
end
local address, error = findSignatureInModule(
    '39 98 B4 00 00 00 75',
    'core.asi'
)
if address then
    writeMemory(tonumber(address + 6), 1, 0xEB, true)
else
    print(error)
end
 

Вложения

  • FirstPersonHandler_class_destroyer_t.lua
    2.8 KB · Просмотры: 9
Последнее редактирование:

whyega52

Eblang головного мозга
Модератор
2,851
2,811
-- Паблик функция, не помню откуда взял
 
  • Нравится
Реакции: Tema05

Орк

Известный
310
262
А есть простой адрес на проверку состояния первого лица? Хочу для cam_set сделать проверку

@chapo ? @ARMOR ?
 

whyega52

Eblang головного мозга
Модератор
2,851
2,811
А есть простой адрес на проверку состояния первого лица?
Открой в иде кор аризоны, в нем alt + b и введи FF 61 04, если сигнатура правильная, то первый (а в идале единственный) будет нужный адрес
 

Орк

Известный
310
262
Открой в иде кор аризоны, в нем alt + b и введи FF 61 04, если сигнатура правильная, то первый (а в идале единственный) будет нужный адрес
а вариант для тупых, которые использую cheat engine или сразу адрес?

Lua:
-- core.asi+1765F6
-- core.asi+1765EB
-- core.asi+1765EA
-- core.asi+176498
-- core.asi+1765E8

    writeMemory(getModuleHandle('core.asi') + 0x1765E8, 1, 1 --[[ 0 ]], true)
какой-то из этих адресов.
Последний на переключение вида от первого и стандарт

А вообще, вид от первого лица у них неиграбельный, для красоты норм, но постоянно с ним не поиграть.
 
Последнее редактирование:

Tema05

Известный
Автор темы
1,507
475
Открой в иде кор аризоны, в нем alt + b и введи FF 61 04, если сигнатура правильная, то первый (а в идале единственный) будет нужный адрес
Нет, эта сигнатура ведёт на место, где идёт "jmp" на обработчик изменения режима камеры, который перехватывает это событие и переключает на свой дополнительный режим 1 лица. Инструкция заменяется на 0xC3 "retn", чтобы завершить функцию. Возвращяемого значения там нет. Эта функция не имеет прямого отношения к состоянию камеры.

а вариант для тупых, которые использую cheat engine или сразу адрес?

Lua:
-- core.asi+1765F6
-- core.asi+1765EB
-- core.asi+1765EA
-- core.asi+176498
-- core.asi+1765E8

    writeMemory(getModuleHandle('core.asi') + 0x1765E8, 1, 1 --[[ 0 ]], true)
какой-то из этих адресов.
Последний на переключение вида от первого и стандарт

А вообще, вид от первого лица у них неиграбельный, для красоты норм, но постоянно с ним не поиграть.
Походу из всех присутствующих я единственный кто реально открыл этот кор в иде) @whyega52
Потому что функцию, возвращающую состояние камеры 1 лица они любезно закинули в экспорты
Lua:
-- Выполнить 1 раз где-то в начале
ffi.cdef [[
    bool IsFirstPerson();
]]
local core = ffi.load('core.asi')

-- Получаем состояние 1 лица
print(core.IsFirstPerson())
И в отличии от твоего решения оно не сломается при обновлении кора, когда этот адрес памяти сместится
 
Последнее редактирование: