#1 26-10-2009 13:03

FeniX-256
Registered: 26-10-2009
Posts: 12

Выделить актера под прицелом

Доброго всем времени суток! Подскажите пожалуйста, как реализовать, или ткните носом если уже было на форуме smile Вообщем, нужно прицепить актера под прицелом к переменной, для дальнейшей работы с самим актером.

Offline

#2 26-10-2009 20:54

Alien
Registered: 12-10-2008
Posts: 564

Re: Выделить актера под прицелом

Пример есть в Консоли Seemann'а
Приведу свой пример. Педы под прицелом подбрасываются вверх, а потом падают.:D

{$CLEO} 
0000:
while true 
    repeat
        wait 100
        0A8D: 0@ = read_memory 0xB6F3B8 size 4 virtual_protect 0
        if
            0@ == 0 
        then
            continue
        end
        0@ += 0x79C
        0A8D: 1@ = read_memory 0@ size 4 virtual_protect 0
    until 1@ <> 0
    0A8D: 2@ = read_memory 0xB74490 size 4 virtual_protect 0  //get pPedPool
    0AA8: call_function_method 0x4442D0 struct 2@ num_params 1 pop 0 ped 1@ store_to 0@   //get handle of ped
    0AA6: call_method 0x4637E0 struct 0xA90850 num_params 2 pop 0 type 2 ped 1@      //add references to ped

    if
        056D:   actor 0@ defined 
    then
        083C: set_actor 0@ velocity_in_direction_XYZ 0.0 0.0 100.0 
        actor.RemoveReferences(0@)
    end
end

Offline

#3 27-10-2009 12:27

Gyr
From: Серпухов
Registered: 03-02-2009
Posts: 246
Website

Re: Выделить актера под прицелом

А вот это хороший скрипт!


Специально для тех, кто не умеет читать по английски. Мой ник читается как "ГИР"!!!
Народная мудрость:
Прежде чем задавать вопросы,ПОЧИТАЙ СПРАВКУ!!!!

Offline

#4 27-10-2009 16:37

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: Выделить актера под прицелом

Что означает эта строка? поподробнее пожалуйста.

0AA6: call_method 0x4637E0 struct 0xA90850 num_params 2 pop 0 type 2 ped 1@      //add references to ped

I know everything and nothing...

Offline

#5 27-10-2009 18:31

Alien
Registered: 12-10-2008
Posts: 564

Re: Выделить актера под прицелом

mfisto wrote:

Что означает эта строка? поподробнее пожалуйста.

0AA6: call_method 0x4637E0 struct 0xA90850 num_params 2 pop 0 type 2 ped 1@      //add references to ped

Вообще, опкод 0AA6 вызывает процедуру-метод. А если конкретно, то эта строчка добавляет ссылку на педа в MissionCleanupList. 2 - это тип того, что добавляем (то есть пед), 1@ - то, что добавляем, 0xA90850 - ссылка на себя (MissionCleanupList), 0x4637E0 - адрес памяти этого метода. После этой операции педа можно назвать актером. То есть игра ни с того ни с сего не станет удалять его.

Offline

#6 27-10-2009 22:14

GTASA
Registered: 13-09-2008
Posts: 476

Re: Выделить актера под прицелом

Alien, я смотрю, ты спец по адресам памяти. Можешь как-нить сделать, чтобы снайперки тоже при джойпаде наводились на актера?

Offline

#7 28-10-2009 09:32

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: Выделить актера под прицелом

Понятно, т.е это как бы тоже самое, если бы мы создали актера create actor вручную так. И актер становится неудаляемым, пока мы не сделаем remove reference. Или не так? Или он все равно исчезнет, например, на каком то расстоянии от игрока.


I know everything and nothing...

Offline

#8 28-10-2009 11:13

GTASA
Registered: 13-09-2008
Posts: 476

Re: Выделить актера под прицелом

А можно получить от вас адрес паияти, который удаляет из памяти информацию об актере? А то при Actor.Removereferences он начинает идти, а это мне совсем не нужно.

Offline

#9 28-10-2009 15:42

3Doomer
From: КаZан
Registered: 14-05-2008
Posts: 659
Website

Re: Выделить актера под прицелом

назначь переменной актёра любое другое значение (например, 0@ = 0)


GIMS developer

Offline

#10 28-10-2009 16:27

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: Выделить актера под прицелом

Назначить переменной ноль ничего не даст, т.к. мы просто этим самым теряем инфу переменной 0@ на ноль. Иначе говоря если у нас 0@ это число 67859403 то теперь оно будет ноль. И между прочим поправьте, если я не прав, что 0 это сам игрок, поэтому использовать ноль не в коем случае нельзя, а нужно -1.


I know everything and nothing...

Offline

#11 28-10-2009 16:37

3Doomer
From: КаZан
Registered: 14-05-2008
Posts: 659
Website

Re: Выделить актера под прицелом

а зачем тебе в последствии использовать переназначенную переменную как игрока? если твоя цель - удалить его из памяти...


GIMS developer

Offline

#12 28-10-2009 16:47

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: Выделить актера под прицелом

Так вот и получается, что это просто подмена, понимаешь. Из памяти надо не переменную освобождать, а сам объект. GTASA нужно чтоб актер перестал быть неудаляемым из памяти, но при этом это происходило незаметно для нашего виденья. И поэтому одной замены переменной тут не обойтись. Если она вообще нужна.


I know everything and nothing...

Offline

#13 28-10-2009 22:15

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

Re: Выделить актера под прицелом

GTASA wrote:

А можно получить от вас адрес паияти, который удаляет из памяти информацию об актере? А то при Actor.Removereferences он начинает идти, а это мне совсем не нужно.

Removereferences удаляет информацию из памяти - и не нужны никакие манипуляции с переменными. А как сделать, чтобы пед не шел - это другая задача

Last edited by Den_spb (28-10-2009 22:30)

Offline

#14 29-10-2009 09:25

GTASA
Registered: 13-09-2008
Posts: 476

Re: Выделить актера под прицелом

Ладненько. А можно получить адресок памяти от вас, чтобы сделать актера неколлизированным, при этом чтобы он мог двигаться, бегать, прыгать...

Offline

#15 29-10-2009 09:31

3Doomer
From: КаZан
Registered: 14-05-2008
Posts: 659
Website

Re: Выделить актера под прицелом

не думаю, что возможно двигаться без коллизии)))


GIMS developer

Offline

#16 04-11-2009 23:00

CrazyDude69
Registered: 22-07-2009
Posts: 18

Re: Выделить актера под прицелом

А где вы адреса берете? Ладно адрес на денги, жизни, это можно с artmoney и другим редактором памяти найти, а координаты? И другие функции? Как вы вобще их находите? Кстате мне нужно записать в переменную машину, на которую я целюсь...

Offline

#17 08-11-2009 19:36

Alien
Registered: 12-10-2008
Posts: 564

Re: Выделить актера под прицелом

адреса ищутся путем анализом кода.
С машиной под прицелом сложнее. Над ней зеленых треугольников не появляется. Наверное надо перебирать все машины и определять возможность того, что в машину целится игрок.

Offline

#18 08-11-2009 19:58

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

Re: Выделить актера под прицелом

Значок появляется, если прицеливаться самонаводящимся гранатомётом. Для других видов оружия может быть предложен вариант с опкодом no_obstacles - если известно направление прицеливания.

Offline

#19 09-11-2009 07:58

GTASA
Registered: 13-09-2008
Posts: 476

Re: Выделить актера под прицелом

А можно как-нибудь записать коорды, куда игрок целится, в переменную? Не важно, на машину, на актера, на землю. Хотя, было бы прекрасно, если можно получить координаты и на машине, и на актере.

Offline

#20 16-11-2009 16:36

Alien
Registered: 12-10-2008
Posts: 564

Re: Выделить актера под прицелом

немного подправил скрипт. Исправлены вылеты, когда актер в машине и появилась возможность получить хэндл целевого педа в режиме автоприцела.

{$CLEO} 
0000:
while true 
    wait 100
    if
        0AB1: call_scm_func @GetTargetedActor 0 store_to 0@ //IF and SET
    then
        if 
            003b: 1@ == 0@
        then
            continue
        end
        083C: set_actor 0@ velocity_in_direction_XYZ 0.0 0.0 100.0 
        actor.RemoveReferences(0@)
        0085: 1@ = 0@    //запоминаем "предыдущего"
    else
        1@ = 0
    end
end                

//0AB1: call_scm_func @GetTargetedActor 0 store_to 0@ //IF and SET
:GetTargetedActor
if
    not player.Defined(0)
then
    059A: return_false
    0AB2: ret 1 0
end
//проверить, находится ли пед в машине
0A96: 0@ = actor $PLAYER_ACTOR struct
0A8E: 1@ = 0@ + 0x58C
0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
if
    1@ <> 0
then
    059A: return_false
    0AB2: ret 1 0
end   
//получить цель актера (управление джойстиком)
0@ += 0x71C
0A8D: 1@ = read_memory 0@ size 4 virtual_protect 0
if
    1@ <> 0
then
    goto @Found
end
//получить цель актера (управление мышью)
0A8D: 0@ = read_memory 0xB6F3B8 size 4 virtual_protect 0
if
    0@ == 0
then
    059A: return_false
    0AB2: ret 1 0
end
0@ += 0x79C
0A8D: 1@ = read_memory 0@ size 4 virtual_protect 0
if
    1@ == 0
then
    059A: return_false
    0AB2: ret 1 0
end    
:Found
//если дошли до сюда, значит цель есть. Получаем хендл и добавляем референсы
0A8D: 2@ = read_memory 0xB74490 size 4 virtual_protect 0  //get pPedPool
0AA8: call_function_method 0x4442D0 struct 2@ num_params 1 pop 0 ped 1@ store_to 0@   //get handle of ped
//а вдруг там не актер был
if
    actor.Defined(0@)
then
    0AA6: call_method 0x4637E0 struct 0xA90850 num_params 2 pop 0 type 2 ped 1@      //add references to ped
    0485: return_true
    0AB2: ret 1 0@
else
    059A: return_false
    0AB2: ret 1 0
end

Offline

#21 17-11-2009 11:29

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: Выделить актера под прицелом

Еще раз объясните тугодуму! smile

Т.е. добавляя в mission cleanup list, актера надо удалять потом, да? например remove reference.
А если не сделать так, то актер куда бы игрок не пошел не удалится из памяти.

Вопрос скорее к Alien


I know everything and nothing...

Offline

#22 17-11-2009 12:21

Alien
Registered: 12-10-2008
Posts: 564

Re: Выделить актера под прицелом

mfisto wrote:

Еще раз объясните тугодуму! smile

Т.е. добавляя в mission cleanup list, актера надо удалять потом, да? например remove reference.
А если не сделать так, то актер куда бы игрок не пошел не удалится из памяти.

Вопрос скорее к Alien

да. К этому приему следует относиться как к какому-нибудь опкоду для получения случайного актера (например, 089E). Получил актера, поработал с ним и почистил за собой.

Актер "не удалится из памяти" пока на него есть ссылка в mission cleanup list.

Offline

#23 17-11-2009 12:51

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: Выделить актера под прицелом

И еще один вопрос возник
Eсть опкод
Actor.RemoveFromMissionCleanupList(1@)
После его применения нужно remove reference?


I know everything and nothing...

Offline

#24 17-11-2009 13:22

Alien
Registered: 12-10-2008
Posts: 564

Re: Выделить актера под прицелом

угум. Чой-то я запуталсо. Это ж оно и есть. Значит MissionCleanUpList - это только для thread'ов миссий. Но почему тогда игра не удаляет актеров для обычных трэдов? Наверное какой-то еще флаг есть...:rolleyes:

Offline

#25 09-03-2010 11:27

GTASA
Registered: 13-09-2008
Posts: 476

Re: Выделить актера под прицелом

А можете сотворить скрипт, чтобы получать переменную транспорта, на который направили прицел?

Offline

Board footer

Powered by FluxBB