You are not logged in.
Подскажите, что именно делает данный метод
0x4B8DD0 CMatrix::Attach((RwMatrix *, bool))
И можно ли с его помощью сцепить два обьекта?
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Den_spb, большое спасибо!
Offline
Незачто. Я немного стормозил: ID-номер модели - это ведь и есть model index. Так что если в 0@ записан ID-номер, то код выглядит так:
0@ *= 4 0@ += 0xA9B0C8 0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0 //CModel 0@ += 0x4A 0A8D: 0@ = read_memory 0@ size 2 virtual_protect 0 //handlingIndex
Offline
Незачто. Я немного стормозил: ID-номер модели - это ведь и есть model index. Так что если в 0@ записан ID-номер, то код выглядит так:
0@ *= 4 0@ += 0xA9B0C8 0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0 //CModel 0@ += 0x4A 0A8D: 0@ = read_memory 0@ size 2 virtual_protect 0 //handlingIndex
0@ += 83418 0A8E: 0@ = &0(0@,1i) + 0x4A 0A8D: 0@ = read_memory 0@ size 2 virtual_protect 0 //handlingIndex
Offline
И тебе, Seemann, тоже спасибо!
Offline
Приветствую всех, есть тут такой нубский вопрос…
Есть код:
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;
Окно находит нормально, ид процесса совпадает. Но на чтении адреса выдает ошибку. Если проверку убрать, то по этому адресу находит какую-то хренотень. Подскажите, что неправильно, наставьте на путь истинный
Offline
0AE3: $object = random_object_near_point 0@ 1@ 2@ in_radius 10.0 find_next 1 //IF and SET
Как представить этот опкод в виде последовательности операций с игровой памятью? Я так понимаю сначала пробегаемся по пулу объектов, что-то вроде этого:
:get_obj 0A8D: 27@ = read_memory 0xB7449C size 4 virtual_protect 0 000A: 27@ += 0x4 0A8D: 27@ = read_memory 27@ size 4 virtual_protect 0 for 28@ = 0 to 89344 step 0x100 0A8D: 26@ = read_memory 27@ size 1 virtual_protect 0 000A: 27@ += 0x1 if and 0029: 26@ >= 0x00 001B: 0x80 > 26@ then 005A: 26@ += 28@ // (int) if 03CA: (check) object 26@ exists then end end end return
потом проверяем, находится ли этот объект в нужных координатах и и записываем его хэндл в $object?
Offline
Offline
@Alien - Эту тему я видел, просто думал может есть другой способ, а то 20 локальных переменных ради поиска 1 объекта это перебор. Координаты и find_next в принципе не важны.
Offline
Вобщем проверил - короткая версия интерцептора у меня получилась такая:
{$CLEO} 0000: while true wait 0 gosub @get_obj end :get_obj 0A8D: 27@ = read_memory 0xB7449C size 4 virtual_protect 0 000A: 27@ += 0x4 0A8D: 27@ = read_memory 27@ size 4 virtual_protect 0 for 28@ = 0 to 89344 step 0x100 0A8D: 26@ = read_memory 27@ size 1 virtual_protect 0 000A: 27@ += 0x1 if and 0029: 26@ >= 0x00 001B: 0x80 > 26@ then 005A: 26@ += 28@ // (int) if 03CA: (check) object 26@ exists then Marker.Disable($m2) Marker.CreateAboveObject($m2, 26@) wait 1000 Object.Destroy(26@) end end end return
Делает всё тоже самое, что и в выше приведённой теме, но без учёта координат и find_next(если я правильно понял).
Как здесь правильно реализовать опциональный find_next, чтоб код соответствовал оригиналу?
Last edited by Sergey81 (10-03-2011 22:36)
Offline
Кто знает подскажите, по какому адресу хранится значение усталости игрока или актера вообще, и сколько байт и в каких пределах, т.е, например, когда игрок устает бежать спринтом или плавать или на велосипеде, мне надо не то значение что хранится в "Статистика ID", а именно то, что хранится в структуре актеров, может, правда, это значение только для игрока существует?
I know everything and nothing...
Offline
Спустя долгое время снова занялся саномоддингом, а здесь мне так и не ответили. Печально(
Решусь спросить еще раз…
Нахождение окна и процесса проходит нормально, а вот денежки из адреса не считываются.
Помогите найти ошибку, заранее спасибо.
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;
Last edited by Wire (02-05-2011 17:58)
Offline
Надо каким-то образом инжектиться в сам процесс, пытался то же самое сделать (как у тебя) и не получалось нифига.
Offline
И все бы ничего, но ведь я когда-то нашел тутор по написанию трейнера для пинбола (правда потом потерял, но восстановил, как мне кажется, полностью), и тогда все прекрасно работало…
PS если у кого-то этот тутор есть, киньте)
Ибо тот сайт как упал, так больше и не вставал.
Offline
вопрос по сейвам и маркерам на карте.
В общем, допустим, у меня есть сейв с сохраненными метками(квадратиками) на карте. После загрузки сейва, при приближении к одной из меток, она должна удаляться. Смысл в том, что таких меток много, и они обязательно должны быть загружены из сейва. Это необходимо для моего мода, в котором можно сохраняться в любое время(как в Half Life например). Сам принцип создания/сохранения/загрузки из сейва метки уже есть, я не знаю лишь, как "прочитать" метку из памяти, проверить расстояние до игрока и т.п.
Мб есть у кого какие-нибудь мысли? Просьба не предлагать проверку на координаты, в которые я ранее ставил метку - там они случайные и вообще нужно только через память, иначе сейвы работать не будут...
Offline
Суть проблемы не ясна
Сам принцип создания/сохранения/загрузки из сейва метки уже есть
в каком виде ты хранишь "метку" в сейве? что именно ты записываешь?
Offline
Я тоже не вижу проблемы, но пара примеров работы с пулом маркеров у меня есть:
Для SA:
while true wait 0 for 10@ = 0xBA86F0 to 0xBAA248 step 0x28 0A8D: 22@ = read_memory 10@ size 4 virtual_protect 0 0A8E: 11@ = 10@ + 0x1C 0A8D: 12@ = read_memory 11@ size 4 virtual_protect 0 //DWORD dwIconSize; if 12@ == 3 then 0A8C: write_memory 11@ size 4 value 2 virtual_protect 0 end end end
Здесь мы устанавливаем всем маркерам с размером 3 второй размер.
Для VC:
{$CLEO .cs} 0000: while true wait 0 for 10@ = 0x7D7D68 to 0x7D8D98 step 0x38 05E0: 12@ = read_memory 10@ size 2 virtual_protect 0 //DWORD dwIconSize; if 12@ == 3 then 05DF: write_memory 10@ size 2 value 2 virtual_protect 0 end end end
Тоже самое.
Структура:
SA:
00000000 CMarker struc ; (sizeof=0x28) 00000000 Color dd ? 00000004 EntityHandle dd ? 00000008 Pos RwV3D ? 00000014 _Index dw ? 00000016 db ? ; undefined 00000017 db ? ; undefined 00000018 _SphereRadius dd ? 0000001C Size dw ? 0000001E db ? ; undefined 0000001F db ? ; undefined 00000020 field_20 dd ? 00000024 Icon db ? 00000025 _Flag db ? 00000026 _RadarMode_or_EntityType db ? 00000027 field_27 db ? 00000028 CMarker ends
VC:
00000000 CMarker struc ; (sizeof=0x38) 00000000 field_0 dd ? 00000004 type dd ? 00000008 entityHandle dd ? 0000000C pos RwV3d ? 00000018 field_18 RwV3d ? 00000024 field_24 dw ? 00000026 field_26 db ? 00000027 inUse db ? 00000028 field_28 db ? 00000029 db ? ; undefined 0000002A db ? ; undefined 0000002B db ? ; undefined 0000002C field_2C dd ? 00000030 Size dw ? 00000032 field_32 dw ? 00000034 iconID dw ? 00000036 __padding dw ? 00000038 CMarker ends
Last edited by Sergey81 (22-06-2011 20:54)
Offline
короче мне нужно "идентифицировать" метку на карте, чтобы с ней можно было работать - узнать расстояние до нее, удалить ее, передвинуть и т.п. Т.е. при загрузке сейва у меня нет нигде данных об этой метке(в scm), но она на карте есть.
Мне это нужно на СА, но если есть инфа и насчет ВС - буду очень признателен(тогда реализую еще одну идейку)
Last edited by Shag (23-06-2011 15:43)
Offline
Пытаюсь создать проекцию. Игра вылетает (если убрать вызов процедуры, то не вылетает).
__asm { mov eax, 0xB6F5F0 mov eax, [eax] add eax, 0x14 // Matrix mov eax, [eax] add eax, 0x30 // Vector push 0 push 0 push 1.0 push 0 push 1000.0 push 255 push 0 push 0 push 255 push 3.0 push 0 push 0 push 3.0 push eax // Vector mov eax, 0xC403F4 push eax // RwTexture push 2 mov eax, 0x707390 call eax add esp, 0x40 }
В чём может быть проблема?
Edit:
Проблему решил.
mov eax, [0xC403F4] push eax
Last edited by DK22Pac (30-06-2011 10:13)
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
@DK22Pac - что за проекцию? Если на подобии 3D текста то мне уже интересно!
Offline
Я понимаю, что вопрос, который я задам, слишком прямолинеен, но он меня мучает продолжительное количество времени.
Вопрос: Существует ли такой кусок в памяти игры, который хранит в себе все координаты маркеров-целей (в сампе маркеры игроков обозначаются как "цели миссии")?
Я понимаю, что вы не занимаетесь модификациями мультиплеера и прочее, но как бы все же
Мультиплеер тоже интересен для модифицирования. Как раз недавно даже исходники чуть более ранней версии отрыл...
Алсо,
не примите за проходимца-нуба с 0 постами. Я перечитал ваш форум вдоль и поперек. Не говоря про изучение гташки/сампа/мта.
Last edited by Jack Daniel's (05-07-2011 21:31)
Offline
Offline
Сомневаюсь, что мультиплеер хранит в нем все данные. И я не нашел ничего об этом пуле (кроме структуры из базы Листенера). Придется самому копаться(
Offline
Я понимаю, что вопрос, который я задам, слишком прямолинеен, но он меня мучает продолжительное количество времени.
Вопрос: Существует ли такой кусок в памяти игры, который хранит в себе все координаты маркеров-целей (в сампе маркеры игроков обозначаются как "цели миссии")?
Отвечаю прямолинейно: да, такой кусок существует.
Offline