You are not logged in.
Доброго всем времени суток! Подскажите пожалуйста, как реализовать, или ткните носом если уже было на форуме Вообщем, нужно прицепить актера под прицелом к переменной, для дальнейшей работы с самим актером.
Offline
Пример есть в Консоли 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
Что означает эта строка? поподробнее пожалуйста.
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
Alien, я смотрю, ты спец по адресам памяти. Можешь как-нить сделать, чтобы снайперки тоже при джойпаде наводились на актера?
Offline
Понятно, т.е это как бы тоже самое, если бы мы создали актера create actor вручную так. И актер становится неудаляемым, пока мы не сделаем remove reference. Или не так? Или он все равно исчезнет, например, на каком то расстоянии от игрока.
I know everything and nothing...
Offline
А можно получить от вас адрес паияти, который удаляет из памяти информацию об актере? А то при Actor.Removereferences он начинает идти, а это мне совсем не нужно.
Offline
Назначить переменной ноль ничего не даст, т.к. мы просто этим самым теряем инфу переменной 0@ на ноль. Иначе говоря если у нас 0@ это число 67859403 то теперь оно будет ноль. И между прочим поправьте, если я не прав, что 0 это сам игрок, поэтому использовать ноль не в коем случае нельзя, а нужно -1.
I know everything and nothing...
Offline
Так вот и получается, что это просто подмена, понимаешь. Из памяти надо не переменную освобождать, а сам объект. GTASA нужно чтоб актер перестал быть неудаляемым из памяти, но при этом это происходило незаметно для нашего виденья. И поэтому одной замены переменной тут не обойтись. Если она вообще нужна.
I know everything and nothing...
Offline
А можно получить от вас адрес паияти, который удаляет из памяти информацию об актере? А то при Actor.Removereferences он начинает идти, а это мне совсем не нужно.
Removereferences удаляет информацию из памяти - и не нужны никакие манипуляции с переменными. А как сделать, чтобы пед не шел - это другая задача
Last edited by Den_spb (28-10-2009 22:30)
Offline
Ладненько. А можно получить адресок памяти от вас, чтобы сделать актера неколлизированным, при этом чтобы он мог двигаться, бегать, прыгать...
Offline
А где вы адреса берете? Ладно адрес на денги, жизни, это можно с artmoney и другим редактором памяти найти, а координаты? И другие функции? Как вы вобще их находите? Кстате мне нужно записать в переменную машину, на которую я целюсь...
Offline
адреса ищутся путем анализом кода.
С машиной под прицелом сложнее. Над ней зеленых треугольников не появляется. Наверное надо перебирать все машины и определять возможность того, что в машину целится игрок.
Offline
А можно как-нибудь записать коорды, куда игрок целится, в переменную? Не важно, на машину, на актера, на землю. Хотя, было бы прекрасно, если можно получить координаты и на машине, и на актере.
Offline
немного подправил скрипт. Исправлены вылеты, когда актер в машине и появилась возможность получить хэндл целевого педа в режиме автоприцела.
{$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
Еще раз объясните тугодуму!
Т.е. добавляя в mission cleanup list, актера надо удалять потом, да? например remove reference.
А если не сделать так, то актер куда бы игрок не пошел не удалится из памяти.
Вопрос скорее к Alien'у
I know everything and nothing...
Offline
Еще раз объясните тугодуму!
Т.е. добавляя в mission cleanup list, актера надо удалять потом, да? например remove reference.
А если не сделать так, то актер куда бы игрок не пошел не удалится из памяти.Вопрос скорее к Alien'у
да. К этому приему следует относиться как к какому-нибудь опкоду для получения случайного актера (например, 089E). Получил актера, поработал с ним и почистил за собой.
Актер "не удалится из памяти" пока на него есть ссылка в mission cleanup list.
Offline
угум. Чой-то я запуталсо. Это ж оно и есть. Значит MissionCleanUpList - это только для thread'ов миссий. Но почему тогда игра не удаляет актеров для обычных трэдов? Наверное какой-то еще флаг есть...:rolleyes:
Offline
А можете сотворить скрипт, чтобы получать переменную транспорта, на который направили прицел?
Offline