#1 17-03-2014 18:52

|Luca`s|
Registered: 17-03-2014
Posts: 2

Помогите с работой в памяти

Всем привет. Вот уже маюсь дня 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

#2 18-03-2014 20:07

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 937
Website

Re: Помогите с работой в памяти

Во-первых, следует различать понятия "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

#3 19-03-2014 18:28

|Luca`s|
Registered: 17-03-2014
Posts: 2

Re: Помогите с работой в памяти

Den_spb wrote:

Во-первых, следует различать понятия "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@).

Огромнеешее спасибо. Не знаю, каким образом я сумел пропустить данный опкодик. Лазил в gtagopcode database, и сам лез с sascm, и в opcode, но не нашел же, вот дубина! После создания темы нашел для Vice City

05E9: 0@ = ped_struct 0@ handle

Но это не то.
Еще раз большое спасибо, помогли мне, невнимательному, все работает. Теперь уже буду CarPointer осваивать )) yahoo

Offline

Board footer

Powered by FluxBB