You are not logged in.
Однако первый пост в новом году :3
Всем доброго времени суток. Сюда призываются гуру ассемблера, знающие, как (и можно ли) в файле программы заменить кусочек байткода на свой. В данном случае заменить push ecx (51) на push 8 (6A 08). Сперва попробовал как последний нуб «раздвинуть» файл и воткнуться в нужном мне месте, но разумеется это не сработало, так что, в общем, вот.
Даже если бы число округлялось, при разных параметрах функция бы возвращала разные значения, а так постоянно 20
@Jack Daniel's,
Эта функция возвращает высоту по Z в точке XY. Пример... Скажем, мы хотим замутить чит, который создает машину в координатах маркера на радаре — мы берем XY этого маркера, а потом с помощью этой функции вычисляем Z в этой точке, и создаем там машину.
__add
Говорю же, я не так хорошо знаю ассемблер, как хотелось бы. Положительное смещение — признак наличия аргументов, отрицательное — их отсутствия? 34 и 38 — это получается два флоата, по четыре байта? Можешь написать пример конкретно для этой функции? Желательно с использованием и ассемблера, и… не ассемблера, не знаю, как такой способ называется Тот, каким я вызывал эту функцию.
А, и где можно найти процедуры, которые вызывают эту функцию?
А плохая новость — конкретно эта функция постоянно возвращает 20
___add
Вызывал и собейтовским методом, и своим, все равно всегда 20.
float FindGroundZForCoord ( float x, float y ) { typedef float ( __stdcall *pFuncAddr ) ( float x, float y ); pFuncAddr pFunc = (pFuncAddr) FUNC_FindGroundZForCoord; return pFunc ( x, y ); }
Заранее извиняюсь за дурацкие вопросы — допустим, я нашел в базе функций сана такую запись:
00569660 92 _Get_Z_for_XYPoint
1) Что означает число 92?
2) Как узнать количество и тип аргументов этой функции?
Полез в ИДУ, отправился на искомый адрес, нашел sub_569660, сгенерировал псевдокод:
int __cdecl sub_569660(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10, int a11, int a12, int a13, float a14) { return sub_401BC5(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); }
Тут 14 параметров, а в исходниках собейта эта функция описана как:
float CWorldSA::FindGroundZForPosition(float fX, float fY)
— два параметра.
Сама функция выглядит так:
float CWorldSA::FindGroundZForPosition(float fX, float fY) { DWORD dwFunc = FUNC_FindGroundZForCoord;//константа для 0x569660; FLOAT fReturn = 0; _asm { push fY push fX call dwFunc fstp fReturn add esp, 8 } return fReturn; }
Я не силен в ассемблере, может, здесь функция как-то сокращена?
Заранее спасибо.
@listener,
спасибо
Может, этот вопрос уже задавался, но где в сане хранятся адреса с матрицей поворотов костей актера, и можно ли их менять?
А, и еще — по какому адресу находятся координаты и размеры боундбокса игрока?
И главное: параметры надо передавать в обратном порядке!
Ах вооот оно что, спасибо. Кстати, а тогда в опкоде 0AA7 параметр для возвращаемого значения нужно таки указывать первым или последним?
Спасибо. Кстати, как правильно пользоваться опкодами 0AA5 и 0AA7? (Справку я читал )
А точнее, что неправильно в этом коде?
:test1 wait 0 if and not actor.Dead($PLAYER_ACTOR) 0ADC: test_cheat "VIDEO" jf @test1 //0B17: show_message_box "Preved!" 0AA5: call 0x7476B0 num_params 2 pop 2 1 "Logo.mpg" wait 2000 jump @test1
По адресу — процедура, проигрывающая видео, void __cdecl PlayMPEG(int nShowCmd, char *filename)
___Edit:
Хммм, перечитал хелп еще раз, написано, что строковые параметры использовать нельзя, а как же тогда?
Ооо…
Я делаю минимод по фильму Эквилибриум, думаю, кто смотрел, сразу поймет
Хочу сделать Ката Стрелка (Gun Kata, не уверен, что в русском это слово склоняется) — вымышленное (и не очень) боевое искусство, принцип которого заключается в статистическом предсказании позиций противника в перестрелке и, как следствие, мастерское владение двумя пистолетами.
Собственно по моду — чтобы реализовать эту идею, нужно либо научить игрока стрелять из любой анимации, либо как-то вручную направлять руки при стрельбе. Трудностей не боюсь, можете предлагать самые зверские решения, лишь бы они были
___Edit
Так вот, - узнаём оффсет с параметрами .0 .0 .0, далее - .0 1.0 .0, ну и получаем позицию и вектор направления кости в 3D пространстве, так сказать.
Вообще когда у меня раньше возникала надобность узнать координаты и угол кости, я просто аттачил к ней объект, потом считывал его координаты, а затем опкодом 0400 узнавал «направление» — и вуаля! Или ты это и имел ввиду?
Хотел спросить в «одном вопросе», но видимо простыми опкодами этого не сделаешь. Так вот, вопрос первый: можно ли как-то заставить пистолеты стрелять во время воспроизведения актером анимации? И вопрос второй: как узнать углы поворота и позицию… ээ… рук, когда они стреляют из двуручного оружия — узнать, а также поменять.
И все бы ничего, но ведь я когда-то нашел тутор по написанию трейнера для пинбола (правда потом потерял, но восстановил, как мне кажется, полностью), и тогда все прекрасно работало…
PS если у кого-то этот тутор есть, киньте)
Ибо тот сайт как упал, так больше и не вставал.
Спустя долгое время снова занялся саномоддингом, а здесь мне так и не ответили. Печально(
Решусь спросить еще раз…
Нахождение окна и процесса проходит нормально, а вот денежки из адреса не считываются.
Помогите найти ошибку, заранее спасибо.
HWND hWnd = FindWindow( 0, L"GTA: San Andreas" ); if( !hWnd ) cout << "Окно не найдено.\n"; else cout << "Окно найдено.\n"; DWORD pid; if( !GetWindowThreadProcessId( hWnd, &pid ) ) cout << "Процесс не найден.\n"; else cout << "Процесс найден, ID: " << pid << endl; DWORD money; HANDLE hProc = OpenProcess( PROCESS_ALL_ACCESS, 0, pid ); ReadProcessMemory( hProc, (LPCVOID) 0xB7CE50, &money, 4, 0 ) cout << money << endl;
Приветствую всех, есть тут такой нубский вопрос…
Есть код:
HWND hWnd = FindWindow( 0, L"GTA: San Andreas" ); if( !hWnd ) cout << "Окно не найдено.\n"; else cout << "Окно найдено.\n"; DWORD pid; if( !GetWindowThreadProcessId( hWnd, &pid ) ) cout << "Процесс не найден.\n"; else cout << "Процесс найден, ID: " << pid << endl; DWORD money; HANDLE hProc = OpenProcess( PROCESS_ALL_ACCESS, 0, pid ); if( !ReadProcessMemory( hProc, (LPCVOID) 0xB7CE50, &money, 4, 0 ) ) cout << "Ошибка.\n"; else cout << money << endl;
Окно находит нормально, ид процесса совпадает. Но на чтении адреса выдает ошибку. Если проверку убрать, то по этому адресу находит какую-то хренотень. Подскажите, что неправильно, наставьте на путь истинный
Народ, не мог бы кто-то написать на спп исходник-туториал по написанию библиотеки, содержащей функции чтения значения по статическому и динамическому адресам? Надеюсь, не слишком наглая просьба
Заранее спасибо.
Помню я высчитывал координаты прицеленного места довольно рачным путем, я аттачил обьект к кисти игрока и увеличивал его координаты по прямой, пока он не натыкался на препятствие, и тогда высчитывал координаты обьекта.
Формулу сам ищу давно))
А как сделать, чтоб анимация повторялась не постонно, а через некоторые интервалы времени, например, чтоб актёр выпивал каждые 10 сек.
Посмотри внимательно мой скрипт. Там перед выполнением анимации скрипт ждет рандумное количество мс - от 5000 до 15000.
0605: actor $PLAYER_ACTOR perform_animation_sequence "M_SMKLEAN_LOOP" IFP_file "LOWRIDER" 4.0 loop 1 0 0 0 time -1 // versionA
Параметр, стоящий после слова loop отвечает за повторение анимации, 1 - анимация будет повторяться, 0 - проиграется один раз. При одноразовом использовании параметр после time следует заменить на wait <время> (Последний параметр будет работать только в последовательности, объявлять которую нужно опкодом 0615: define_AS_pack_begin 15@ и завершать опкодом 0616: define_AS_pack_end 15@)
Только в последовательности вместо хендла актера указывай -1. А, присобачивать актера к указанной последовательности - 0618: assign_actor 2@ to_AS_pack 15@
Хмммм, ну можно создать другого актера по тому же алгоритму, только в руку ему воткнуть сигарету, а анимку бухания заменить на анимку курения.
Расскажи, чо за плагин?
Ну в евро ехешнике отличные от us адреса, и ессно он вылетает (хотя странно, что он не вылетает еще при старте игры )
__Или я, как всегда, что-то путаю в разновидностях ехе)
Sergey81,
Именно пропустить её можно, удалив или закомментив этот кусок в скрипте)
Если ты просто не можешь набрать нужное кол-во очков, можешь воспользоваться скриптом:
// This file was decompiled using sascm.ini published by Seemann (http://sannybuilder.com/files/SASCM.rar) on 13.10.2007 {$VERSION 3.1.0027} {$CLEO .cs} thread 'score' :score wait 0 if and 0AB0: 16 //шифт 0AB0: 77 //m jf @score 0A8C: write_memory 0xA4EC20 size 1 value 999999 virtual_protect 0 0A8C: write_memory 0xA4A948 size 1 value 999999 virtual_protect 0 wait 100 jump @score
Он устанавливает 999999 очков танцев и лоурайдерства.
__PS: сингл у меня не работает, поэтому скрипт не тестировался, но должен работать.
Мне нужно, чтобы пед шёл по улице и пил из бутылки.
Хммм, ну вроде пьёт у нас из бутылок педтип 8 (Грув Стрит Фемилис), думаю, если задать актеру этот педтип, то он будет время от времени пить из бутылки))
Если нужно, чтобы конкретный актер иногда прихлёбывал - я бы сделал так:
:создать_актера wait 0 model.Load(#модель) model.Load(#пиво) 009A: 1@ = create_actor_pedtype 8 model #модель at $x $y $z 0107: 0@ = create_object #пиво at 0.0 0.0 0.0 09A0: actor 1@ attach_object 0@ with_offset $offset_x $offset_y $offset_z on_bone <5 или 6, 5 - левая рука, 6 - правая> 16 perform_animation "NULL" IFP_file "NULL" time -1 :пить_пиво wait 0 0209: 2@ = random_int_in_ranges 5000 15000 wait 2@ if not actor.Dead(1@) then 0605: actor 1@ perform_animation_sequence "<анимация_бухания>" IFP_file "<ифп_с_анимацией>" 4.0 loop 0 0 0 0 time -1 // versionA else 070B: set_actor 1@ onbone_attached_object_operation 0 object.Destroy(0@) jump @создать_актера \ еще куда-то end jump @пить_пиво
__Внес несколько поправок.
2Sw[ee]t
Ну или легче, поставлю вопрос по другому. Есть машина с тюнингом, и рядом нужно создать такую же машину с такимже тюнингом
Хм, ну впринципе это можно сделать путем гета\сета каждого элемента тюнинга в отдельности, как то:
0988: get_car $car1 paintjob 0@
06ED: set_car $car2 paintjob 0@
0803: car $car1 have_hydraulics
07FF: set_car $car2 hydraulics 1
03F3: get_car $car1 primary_color_to 1@ secondary_color_to 2@
0229: set_car $car2 primary_color_to 1@ secondary_color_to 2@
09E9: car $car2 add_single_nitro
Насчет колёс и остального не уверен, скорее всего есть какой-то адрес памяти, где записаны номера колёс, спойлеров, юбок и прочего.
Хм, группа анимации.. А что это? Не тип педа случаем?
CraZZZy-GameRRR,
0665: get_actor 88@ model_to 94@