You are not logged in.
Если вам потребуется в скрипте использовать глобальный ID модели из списка импортирумых моделей (DEFINE OBJECTS), вы можете прочитать его из адреса памяти игры, используя следующую формулу:
MA = -4982 + (ModelID * -7)
Например, чтобы прочитать глобальный ID модели INFO используйте следующий код:
0@ = #INFO 0@ *= -7 0@ += -4982 0084: $modelID = &0(0@,1i)
в modelID будет записано 1239.
вот пример цикла, который выводит по очереди все ID моделей из стандартного майна
03C4: set_status_text_to $modelID 0 'FEC_NMN' // -4982 + (ModelID * -7) for 1@ = -1 downto -388 // #INFO downto #SFCOPDR 0085: 0@ = 1@ 0@ *= -7 0@ += -4982 0084: $modelID = &0(0@,1i) wait 1000 end // for
Я правда не знаю, насколько это полезно, но вдруг пригодится.
Offline
Изменение ключей GXT, использование собственных текстов без редактирования american.gxt
// ---------------------------------------------------------------------- // change GXT Entries // ---------------------------------------------------------------------- :ChangeGXTEntries alloc($_param1, 76) alloc($_asmproc, 77) alloc($_param2, 78) 1@ = @_GXTNewString_1 2@ = @_GXTNewString_2 3@ = @_GXTNewString_3 4@ = @_GXTNewString_4 5@ = @_GXTNewString_5 6@ = @_GXTNewString_6 7@ = @_GXTNewString_7 8@ = @_GXTNewString_8 9@ = @_GXTNewString_9 10@ = @_GXTNewString_10 11@ = @_GXTNewString_11 12@ = @_GXTNewString_12 0@ = -429863 31@ = 1 while 31@ < 24 // strings*2 // ------------------------------- // FIND GXT ENTRY // ------------------------------- &0(0@,1i) = 0xA49960 &0(0@,1i) += @_GetGxtStringPointer $_asmproc = 0x6A0050 // char* GetGxtString $_param1 = 0xA49958 005E: $_param1 += 1@(31@,33i) // char* GXTEntry 0572: run_asm_inject true // ------------------------------- // CHANGE GXT STRING // ------------------------------- dec(31@) $_param1 = 0xA49964 005E: $_param1 += 1@(31@,33i) // char* Source, new string &0(0@,1i) = 0xA49960 &0(0@,1i) += @_CopyString $_asmproc = 0x718660 // int CopyString 0572: run_asm_inject true inc(31@,2) end return // ASM injectors // ------------------------------- // .text:006A0050 ; char *__cdecl GetGxtString(char *GXT_Entry) :_GetGxtStringPointer hex FF 35 909AA400 // push dword ptr [0xA49960+$_param1*4] B9 40B3C100 // mov ecx, @aAmericanGxt FF 15 949AA400 // call dword ptr [0xA49960+$_asmproc*4] A3 989AA400 // mov [$_param2], eax C3 // return end // .text:00718660 ; int __cdecl CopyString(char *Destination,char *Source) :_CopyString hex FF 35 909AA400 // push dword ptr [0xA49960+$_param1*4] FF 35 989AA400 // push dword ptr [0xA49960+$_param2*4] FF 15 949AA400 // call dword ptr [0xA49960+$_asmproc*4] 83 C4 08 // add esp, 8 C3 // return end // Compiled Strings Pool (null-terminated) // ------------------------------- :_GXTNewString_1 0900: "Player position:" 0900: 'FED_DFL' :_GXTNewString_2 0900: "X: ~1~.~1~" 0900: 'FED_DLS' :_GXTNewString_3 0900: "Y: ~1~.~1~" 0900: 'FED_DSR' :_GXTNewString_4 0900: "Z: ~1~.~1~" 0900: 'FEC_TGD' :_GXTNewString_5 0900: "Last eventID: ~1~" 0900: 'FED_RID' :_GXTNewString_6 0900: "Targeted ped:" 0900: 'FED_SCP' :_GXTNewString_7 0900: "<no target>" 0900: 'FED_SPR' :_GXTNewString_8 0900: "Health: ~1~" 0900: 'DEBUGT1' :_GXTNewString_9 0900: "Model: ~1~" 0900: 'DEBW0' :_GXTNewString_10 0900: "Traffic cars: ~1~" 0900: 'DEBW1' :_GXTNewString_11 0900: "Car model: ~1~" 0900: 'DEBW3' :_GXTNewString_12 // last entry // -------------------------------
вот код изменения GXT в runtime. Откомментирую позже.
Пара замечаний: массив строк (0900) должен оканчиваться на метку (даже пустую), максимум изменяемых строк таким способом равно 31 (по числу локальных переменных). После запуска этой подпрограммы, ключи из GXT используются как обычно; текст не должен оканчиваться на пробел (не знаю почему).
Процедура полностью автономная, все что нужно менять это 1) сами строки, 2) массив меток 3) в цикле while число (31@ < 24), оно равно числу элементов массива * 2
Чтобы строки отображались не в верхнем регистре, а как написаны, переключите форматирование в опциях санника на Как есть.
Last edited by Seemann (10-01-2007 11:00)
Offline
Offline
Открываем всю карту
for 0@ = 354164 to 354188 &0(0@,1i) = 16843009 end
Этот код откроет всю карту (уберет "туман" с непосещенных зон), как будто вы проехали по всему штату.
Offline
Открываем всю карту
А как правильно установить этот код?
Last edited by svetka (18-01-2007 17:51)
Offline
2svetka:
просто вставь это в любое место в начала игры, например сразу после команды 03a4: name_thread 'MAIN' или в нулевую миссию.
Offline
Двигаем игрока по карте
Смысл таков: по нажатию кнопки F4, игрок перемещается в координаты, записанные во внешнем файле.
:MovePlayer 0@ = -429863 1@ = 304497 while true wait 250 &0(1@,1i) == 0xFF0000 jf continue &0(0@,1i) = 0xA49960 &0(0@,1i) += @_SetNewCoords 0572: run_asm_inject true end // while :_SetNewCoords hex B8 B0 D7 5B 00 FF D0 C3 end
Теперь создавайте файл playercoords.txt в корневой директории игры (там, где exe), в нем пишите строчку, содержащую три координаты XYZ (можно разделять запятыми или пробелом). После нажатия F4 игра переместит CJ'я в указанные координаты.
Файл можно менять во время игры.
Offline
Можешь расписать , как ты к файлу обратился ?
Offline
я только вызвал готовую процедуру в ехе, которая открывает этот файл, читает, ставит координаты, закрывает файл. Видимо, это была часть дебаггера, больше она не используется.
Offline
Изменение ключей GXT, использование собственных текстов без редактирования american.gxt – шикарная вещь, работает как часы, но вот столкнулся с проблемой русификации. У меня имеется три, а быть может и больше вариантов перевода и каждый использует разные символы для русских букв. Каким то образом можно решить эту проблему? Не хочется, к примеру, для отдельной миссии в нагрузку кидать файлы fonts.dat и fonts.txd.
Offline
Хмм, а как это связано с модом? Представь, что ты использовал бы обычный метод через american.gxt, ты бы тоже мог иметь только один вариант перевода и вынужден был бы включить еще свой fonts.
Вывод: юзайте английский язык
Offline
Может и так уже все знают, но решил написать
Команда, отвечающая за уменьшение здоровья при падении с байка:
004B3296 D865 04 FSUB DWORD PTR SS:[EBP+4]
Команда, отвечающая за уменьшение здоровья:
004B3314 D865 04 FSUB DWORD PTR SS:[EBP+4]
Команда, отвечающая за уменьшение текущего количества патрон в машине:
0073FA85 48 DEC EAX
Команда, отвечающая за уменьшения общего количества патрон в машине:
0073FAAF FF4E 0C DEC DWORD PTR DS:[ESI+C]
Команда, отвечающая за уменьшение текущего количества патрон пешком:
007428AF 48 DEC EAX
Команда, отвечающая за уменьшения общего количества патрон пешком:
007428E6 FF4E 0C DEC DWORD PTR DS:[ESI+C]
Можно все команды занопить (90h), тогда патроны и здоровье заканчиваться не будут, или DEC заменить на INC, а FSUB заменить на FADD – патроны и здоровье будет прибавлятся.
Можно пропатчить как сам экзешник, так и процесс. Все адреса для версии gta_sa.exe v1.0
Скачать патч (патчится сам процесс, только для v1.0):
1) для заморозки жизней;
2) для заморозки патронов.
Last edited by Sanchez (02-05-2007 10:17)
Offline
хорошо надо будет сделать общий патч для всех стандартных ехе .
Offline
хорошо надо будет сделать общий патч для всех стандартных ехе .
У меня кроме 1.0 больше нет
Offline
я про себя говрил оффсеты мне найти будет не сложно ... Только вот времени бы побольше .
Offline
Только вот времени бы побольше .
Да там недолго Вот мои исходники если нужно http://foolroot.nm.ru/source/
Last edited by Sanchez (04-05-2007 09:20)
Offline
Offline
[center][large]Управление фарами[/large][/center]
Вчера мною и listener'ом был разобран весьма интересный класс в движке игры, который в частности позволяет получить полный контроль над фарами машины. Сразу оговорюсь, поворотниками управлять нельзя
Через этот класс можно чинить фары машины, если они разбиты.
Передние фары (левая и правая) чинятся по отдельности, задние - только обе сразу.
Итак, как это делается.
1. Сначала получаем адрес машины в памяти
03C0: 0@ = actor $PLAYER_ACTOR car 0A97: 1@ = car 0@ struct
2. Теперь получаем адрес нужного класса, путем прибавления смещения к начальному адресу машины
1@ += 0x5A0
3. Теперь можно чинить фары. Делается это строкой
0AA6: call_method 0x006C2100 struct 1@ num_params 2 pop 0 1 0
Последние 2 цифры - параметры. Предпоследняя цифра (1) означает состояние фары (1 - разбита, 0 - не разбита ). Последняя цифра - номер фары (0 - передняя левая, 1 - передняя правая, 3 - задние фары). Другие цифры не работают.
Число 1@ - это адрес класса, который мы получили выше.
Варьируя номера фар и их состояние можно получить эффект стробоскопов (выключаем левую/правую переднюю фару по очереди) (проверять нужно ночью, когда фары включены):
while true wait 250 if Player.Defined($PLAYER_CHAR) then if Actor.Driving($PLAYER_ACTOR) then 03C0: 0@ = actor $PLAYER_ACTOR car 0A97: 1@ = car 0@ struct 1@ += 0x5A0 0AA6: call_method 0x006C2100 struct 1@ num_params 2 pop 0 1 0 // выключили переднюю левую 0AA6: call_method 0x006C2100 struct 1@ num_params 2 pop 0 0 1 // включили переднюю правую wait 300 0AA6: call_method 0x006C2100 struct 1@ num_params 2 pop 0 0 0 // включили переднюю левую 0AA6: call_method 0x006C2100 struct 1@ num_params 2 pop 0 1 1 // выключили переднюю правую wait 300 end end end
<hr>
Аналогичным способом можно проверить - разбита фара или нет. Для этого используется такая строка:
0AA8: call_function_method 0x6C2130 struct 1@ num_params 1 pop 0 1 0@
Здесь последние 2 параметра означают: номер фары (1 - это передняя правая) и переменную, в которую будет записан результат (0@). Значение 0@ равное 0 означает, что фара не разбита, 1 - разбита.
struct 1@ означает все тот же адрес класса, как и в примере выше.
while true wait 250 if Player.Defined($PLAYER_CHAR) then if Actor.Driving($PLAYER_ACTOR) then 03C0: 0@ = actor $PLAYER_ACTOR car 0A97: 1@ = car 0@ struct 1@ += 0x5A0 0AA8: call_function_method 0x6C2130 struct 1@ num_params 1 pop 0 1 0@ // записываем в 0@ состояние передней правой фары if 0@ == 1 then 03E5: show_text_box 'HELP101' // вы разбили правую фару. сейчас починим 0AA6: call_method 0x006C2100 struct 1@ num_params 2 pop 0 0 1 // включили переднюю правую end end end end
Last edited by Seemann (13-06-2008 07:35)
Offline
[center][large]Самый быстрый способ создать перед игроком машину[/large][/center]
0AA5: call 0x0043A0B6 num_params 1 pop 1 #INFERNUS
#INFERNUS - это желаемая модель машины. Все остальное (загрузку модели, расчет координат) сделает игра.
(подробнее здесь и ниже по тексту).
Offline
[center][large]Управление фарами[/large][/center]
Вчера мною и listener'ом был разобран весьма интересный класс в движке игры, который в частности позволяет получить полный контроль над фарами машины. Сразу оговорюсь, поворотниками управлять нельзя
Через этот класс можно чинить фары машины, если они разбиты.
Передние фары (левая и правая) чинятся по отдельности, задние - только обе сразу.
Итак, как это делается.
1. Сначала получаем адрес машины в памяти
03C0: 0@ = actor $PLAYER_ACTOR car 0A97: 1@ = car 0@ struct2. Теперь получаем адрес нужного класса, путем прибавления смещения к начальному адресу машины
1@ += 0x5A03. Теперь можно чинить фары. Делается это строкой
0AA6: call_method 0x006C2100 struct 1@ num_params 2 pop 0 1 0Последние 2 цифры - параметры. Предпоследняя цифра (1) означает состояние фары (1 - разбита, 0 - не разбита ). Последняя цифра - номер фары (0 - передняя левая, 1 - передняя правая, 3 - задние фары). Другие цифры не работают.
Число 1@ - это адрес класса, который мы получили выше.Варьируя номера фар и их состояние можно получить эффект стробоскопов (выключаем левую/правую переднюю фару по очереди) (проверять нужно ночью, когда фары включены):
while true wait 250 if Player.Defined($PLAYER_CHAR) then if Actor.Driving($PLAYER_ACTOR) then 03C0: 0@ = actor $PLAYER_ACTOR car 0A97: 1@ = car 0@ struct 1@ += 0x5A0 0AA6: call_method 0x006C2100 struct 1@ num_params 2 pop 0 1 0 // выключили переднюю левую 0AA6: call_method 0x006C2100 struct 1@ num_params 2 pop 0 0 1 // включили переднюю правую wait 300 0AA6: call_method 0x006C2100 struct 1@ num_params 2 pop 0 0 0 // включили переднюю левую 0AA6: call_method 0x006C2100 struct 1@ num_params 2 pop 0 1 1 // выключили переднюю правую wait 300 end end end
а можно чтобы эффект стробоскопов включался/отключался например при нажатии кнопки U
а то у меня стоит скрипт включения/отключения фар
Охото чтобы можно было ездить и просто с горяшими фарами и со страбаскопами
Last edited by Basco (22-09-2008 11:10)
Offline
А как включить/выключить правую/левую заднюю фару?
Offline
а можно чтобы эффект стробоскопов включался/отключался например при нажатии кнопки U
а то у меня стоит скрипт включения/отключения фар
Охото чтобы можно было ездить и просто с горяшими фарами и со страбаскопами
Можно.
while true wait 250 if and Player.Defined($PLAYER_CHAR) 0AB0: key_pressed 0x55 Actor.Driving($PLAYER_ACTOR) then 03C0: 0@ = actor $PLAYER_ACTOR car 0A97: 1@ = car 0@ struct 1@ += 0x5A0 0AA6: call_method 0x006C2100 struct 1@ num_params 2 pop 0 1 0 0AA6: call_method 0x006C2100 struct 1@ num_params 2 pop 0 0 1 wait 300 0AA6: call_method 0x006C2100 struct 1@ num_params 2 pop 0 0 0 0AA6: call_method 0x006C2100 struct 1@ num_params 2 pop 0 1 1 wait 300 end end
Вроде так...
Last edited by Sw[ee]t (13-08-2009 21:18)
Offline
Как узнать имя машины, в которую целится игрок
код показался очень занятным, поэтому для истории запомним ссылочку
Offline