You are not logged in.
Pages: 1
Всем привет. Вот уже маюсь дня 4 с памятью игры gta-sa.exe
Мне попался Cped, начал разбирать. Сделал проверку на то, что сидит ли персонаж, понравилось.
Потом дошли руки до адреса CPed + 0x764 (ну или же 1892)
Данный адрес имеет в себе указатель на педа, который убил меня.
Сразу побежали мысли об создании скрипта, который пометит маркером моего убийцу, а потом при нажатии на insert тпшнит к ниму.
Ну и, наконец, вопрос: как же мне получить Актера из указателя. Читал везде по чуть-чуть
Нашел для объектов:
// convert object pointer to a handle 0A8D: 8@ = read_memory 0xB7449C size 4 virtual_protect 0 // лимит всех объектов в gta ? 0AA8: call_function_method 0x465070 struct 8@ num_params 1 pop 0 1@ 1@ // что вызывает ?
Что же мне делать с указателем на педа.
У меня просьба рассказать, что мы получим - player или actor | о том, как конвектировать указатель в актера.
Читал по разному, нашел, что нужно
ID * 256 * flags
Для персонажей - 0x80 (это 128) - значит пед не существует.
Пробовал умножать, что-то делать в цикле - все вылетало.
Вот то,что хотя бы теоретически работает
while true wait 0 if Actor.Dead($PLAYER_ACTOR) then 0A96: 4@ = actor $PLAYER_ACTOR struct 4@ += 0x764 0A8D: 7@ = read_memory 4@ size 4 virtual_protect 0 if or 056D: actor 7@ defined // вот что тут я не понимаю Player.Defined(7@) // что мы получаем с адреса? Как конвертировать его и потом обычную проверку и т.д then Actor.StorePos(7@, 29@, 30@, 31@) // сохранение позиций убийцы 7@ += 10.0 // к Z добавляем 10.0 (float) Marker.CreateAboveActor($Mark, 7@) // создаем над ним маркер end end if 0ab0: 0x2D // insert then Actor.PutAt($PLAYER_ACTOR, 29@, 30@, 31@) // телепортируемся к нашему убийце end end
Надеюсь на вашу помощь. Если не трудно, выведите общую формулу для обьектов / педов / каров
Offline
Во-первых, следует различать понятия "player" и "actor".
"player" - это игрок (посмотреть команды и проверки для игрока можно, введя в поиске опкодов SB "player_char"). Если в игру играет один человек, то и игрок соответственно один (переменная игрока - $PLAYER_CHAR)
"actor" - это персонаж (физический объект), в том числе и персонаж, управляемый игроком. Персонажи в игре ещё называют "педами". Переменная педа игрока - $PLAYER_ACTOR.
Во-вторых, следует различать понятия "хэндл" и "указатель".
Хэндл - что-то типа индивидуального идентификационного номера какого-либо объекта.
Указатель - адрес структуры объекта в памяти игры.
В "классическом" скриптинге (стандартные опкоды) используются только хэндлы.
Конвертировать хэндл в указатель и обратно можно с помощью опкодов КЛЕО4. Пример для актёров:
0A96: $ActorStruct = actor $PLAYER_ACTOR struct // Вычисление указателя по хэндлу 0AEA: $actor = actor_struct $ped_struct handle // Вычисление хэндла по указателю
С учетом поправок получается такой код (в игре не проверял):
while true wait 0 if Actor.Dead($PLAYER_ACTOR) then 0A96: 4@ = actor $PLAYER_ACTOR struct 4@ += 0x764 0A8D: 7@ = read_memory 4@ size 4 virtual_protect 0 if 7@ > 0 then 0AEA: 7@ = actor_struct 7@ handle Actor.StorePos(7@, 29@, 30@, 31@) 31@ += 10.0 Marker.CreateAboveActor(8@, 7@) if 0ab0: 0x2D // insert then Actor.PutAt($PLAYER_ACTOR, 29@, 30@, 31@) end end end end
P.S. Свои глобальные переменные в клео-скриптах не используем ($Mark). Применяем вместо них локальные переменные (0@...31@).
Last edited by Den_spb (18-03-2014 20:27)
Offline
Во-первых, следует различать понятия "player" и "actor".
"player" - это игрок (посмотреть команды и проверки для игрока можно, введя в поиске опкодов SB "player_char"). Если в игру играет один человек, то и игрок соответственно один (переменная игрока - $PLAYER_CHAR)
"actor" - это персонаж (физический объект), в том числе и персонаж, управляемый игроком. Персонажи в игре ещё называют "педами". Переменная педа игрока - $PLAYER_ACTOR.Во-вторых, следует различать понятия "хэндл" и "указатель".
Хэндл - что-то типа индивидуального идентификационного номера какого-либо объекта.
Указатель - адрес структуры объекта в памяти игры.
В "классическом" скриптинге (стандартные опкоды) используются только хэндлы.Конвертировать хэндл в указатель и обратно можно с помощью опкодов КЛЕО4. Пример для актёров:
0A96: $ActorStruct = actor $PLAYER_ACTOR struct // Вычисление указателя по хэндлу 0AEA: $actor = actor_struct $ped_struct handle // Вычисление хэндла по указателюС учетом поправок получается такой код (в игре не проверял):
while true wait 0 if Actor.Dead($PLAYER_ACTOR) then 0A96: 4@ = actor $PLAYER_ACTOR struct 4@ += 0x764 0A8D: 7@ = read_memory 4@ size 4 virtual_protect 0 if 7@ > 0 then 0AEA: 7@ = actor_struct 7@ handle Actor.StorePos(7@, 29@, 30@, 31@) 31@ += 10.0 Marker.CreateAboveActor(8@, 7@) if 0ab0: 0x2D // insert then Actor.PutAt($PLAYER_ACTOR, 29@, 30@, 31@) end end end endP.S. Свои глобальные переменные в клео-скриптах не используем ($Mark). Применяем вместо них локальные переменные (0@...31@).
Огромнеешее спасибо. Не знаю, каким образом я сумел пропустить данный опкодик. Лазил в gtagopcode database, и сам лез с sascm, и в opcode, но не нашел же, вот дубина! После создания темы нашел для Vice City
05E9: 0@ = ped_struct 0@ handle
Но это не то.
Еще раз большое спасибо, помогли мне, невнимательному, все работает. Теперь уже буду CarPointer осваивать ))
Offline
Pages: 1