Но вот с сан андреасом, и кучей разных ехе, большая проблема найти подобные программы или патчи, к US кряку 1.0 от холдума есть патч, с ним же работает один мемори хак, но вот с версиями 1.01 оригинальными US\UK(EU)\AU и крякнутыми (известна только UK(EU) версия, US и AU в природе не встречал), а так же оригинальной 2.0 US\UK (насчет существования AU версии не уверен, как и насчет существования кряка этой версии) и 3.0 (стим и последние D2D версии вроде) полная жопа.
Много людей были бы тебе благодарны, если бы ты хоть под все известные версии 1.0 и 1.1 сделал аналогичный скрипт, и опционально под 2.0 и 3.0 в виде ASI так ка клео их не поддерживает.
Хотя как показал мой опыт с использованием кастом кряка версии 1.0 для вайс сити, с которым твой скрипт работает без проблем, скрипт работает и с крякнутой и оригинальной версией идентично. Значит один скрипт для версии 1.01 EU(Uk) защищенной должен работать и с крякнутой версией и объем твоей работы значительно сокращается.
В общем слезно реквестирую для оригинальной и крякнутой версии Сана 1.0 и 1.01 замутить аналогичный скрипт.
Оффсет не знаю, но знаю точно что СА странно интерпретирует записанные значения ФПС - игровые 25 фпс записанны значением 30=1E, а 60 фпс выдает если использовать десятичное значение 105.
То есть тебе надо искать именно 1E.
Имелось в виду, что 0x30 вычитается из каждого из двух байтов по отдельности.
Так во втором(текущем варианте) так и делается.
П.С. 0x3630 - 0x3030 = 0x600, а не 600 (windows-калькулятор в помощь)
Им и считал, правда в нём префикса 0x нету, а на hex/dec не всегда обращаешь внимание, всё перепуталось тут 3630 - 3030 = 600 конечно же:D
@Seemann - Это было бы полезно использовать при переносе GTA 3 FOV Hack на клео, там я посмотрел, меняется адрес указателя на ms_fFOV__5CDraw, а потом по этому адресу пишется новое значение, чтоб игра стандартное не перезаписывала. Но не зная, нужно ли ещё что делать, помимо этого, скрипт писать не хочется.
05E0: 1@ = read_memory 0@ size 2 virtual_protect 0 000E: 1@ -= 0x3030 0A91: 2@ = 1@ / 0x100 0A90: 3@ = 2@ * 0x100 0062: 1@ -= 3@ 0012: 2@ *= 10 005A: 2@ += 1@
не очень-то оптимизировано выходит, зато меньше чтений памяти)))
]]>05E0: 1@ = read_memory 0@ size 1 virtual_protect 0 //0x36 default 0@ += 1 05E0: 2@ = read_memory 0@ size 1 virtual_protect 0 //0x30 default var 1@:int 2@:int end 1@ -= 0x30 2@ -= 0x30 1@ *= 10 1@ += 2@
05E0: 1@ = read_memory 0@ size 2 virtual_protect 0 1@ -= 0x3030
вычитаем 0x3030 из обоих цифр и получаем искомое число (0x3630 - 0x3030 = 60)
Но нужно учесть в таком случае,что значения фпс меньше 10 должны быть записаны с 0 в начале (05fps.cs)
]]>там же все сводится к двум строчкам:
0A8F: 10@ = 1@ - 0x30 // int 0A8F: 12@ = 2@ - 0x30 // int]]>
{$CLEO .cs} 0000: NOP 05EC: 0@ = current_thread_pointer 0@ += 8 05E0: 1@ = read_memory 0@ size 1 virtual_protect 0 //0x36 default 0@ += 1 05E0: 2@ = read_memory 0@ size 1 virtual_protect 0 //0x30 default 05FB: 10@ = 1@ - 0x30 05FB: 12@ = 2@ - 0x30 var 10@:int 12@:int end 10@ *= 10 10@ += 12@ 05E5: 3@ = game_version if 3@ == 0 // integer values then 05DF: write_memory 0x9B48EC size 1 value 10@ virtual_protect 0 //1.0 else 05DF: write_memory 0x9B48F4 size 1 value 10@ virtual_protect 0 //1.1 end 05DC: end_custom_thread
III:
{$CLEO .cs} 0000: NOP 05EC: 0@ = current_thread_pointer 0@ += 8 05E0: 1@ = read_memory 0@ size 1 virtual_protect 0 //0x36 default 0@ += 1 05E0: 2@ = read_memory 0@ size 1 virtual_protect 0 //0x30 default var 1@:int 2@:int end 1@ -= 0x30 2@ -= 0x30 1@ *= 10 1@ += 2@ 05E5: 3@ = game_version if 3@ == 0 // integer values then 05DF: write_memory 0x8F4374 size 1 value 1@ virtual_protect 0 //1.0 else 05DF: write_memory 0x8F4428 size 1 value 1@ virtual_protect 0 //1.1 end 05DC: end_custom_thread
По умолчанию скрипт называется 60vcframelimiter.cs/60iiiframelimiter.cs, где 60 - количество fps. Первые две цифры у скрипта должны быть числом, остальные символы не важны.
Ну и собственно для лимита в 90 фпс скрипт следует переименовать в 90vcframelimiter.cs/90iiiframelimiter.cs или 90frmlmtr.cs к примеру.