You are not logged in.
Gyr, у меня return стоит.
А скрипт у меня последний, тот что Seemann давал.
Может мне пример дадите, как сделать, чтобы искались все ближайшие, кроме тех, кто в моей машине?
Last edited by GTASA (20-12-2009 22:30)
Offline
@GTASA
Вот тебе мой вариант interceptor'а
0AB1: call_scm_func @ANY_GETACTOR 4 1@ 2@ 3@ 10.0 0@ ///Вызываешь это где нужно в скрипте ///Все по аналогии с обычным интерсептором ///1@ 2@ 3@ это центр поиска, ///10.0 это радиус поиска ///0@ это получаемый актер //////////////////// Добавляешь это в конец куда нибудь скрипта :ANY_GETACTOR 0006: 16@ = 305868 0006: 6@ = 1988 03C0: 8@ = actor $PLAYER_ACTOR car :ANY_ACTOR_STARTSEARCH 008B: 16@ = &0(16@,1i) // CPool* 0085: 5@ = 16@ 17@ = 8 gosub @ANY_ACTOR_READMEMOFFSET 0085: 7@ = 5@ 0A8D: 11@ = read_memory 16@ size 4 virtual_protect 0 // CPool.pUnits 0006: 10@ = 0 0006: 19@ = -1 :ANY_ACTOR_SEARCHLOOPMAIN 0085: 5@ = 11@ 17@ = 20 gosub @ANY_ACTOR_READMEMOFFSET 0085: 4@ = 5@ 8039: not 4@ == 0 004D: jump_if_false @ANY_ACTOR_SEARCHLOOPNEXT 0085: 5@ = 4@ 17@ = 48 gosub @ANY_ACTOR_READMEMOFFSET 0087: 12@ = 5@ 0085: 5@ = 4@ 17@ = 52 gosub @ANY_ACTOR_READMEMOFFSET 0087: 13@ = 5@ 0085: 5@ = 4@ 17@ = 56 gosub @ANY_ACTOR_READMEMOFFSET 0087: 14@ = 5@ 050A: 15@ = distance_between_XYZ 0@ 1@ 2@ and_XYZ 12@ 13@ 14@ 0025: 3@ > 15@ // (float) 004D: jump_if_false @ANY_ACTOR_SEARCHLOOPNEXT 0085: 9@ = 10@ // (int) // counter 0085: 5@ = 16@ 17@ = 4 gosub @ANY_ACTOR_READMEMOFFSET 0085: 4@ = 5@ 005A: 4@ += 9@ // (int) 0A8D: 4@ = read_memory 4@ size 1 virtual_protect 0 0012: 9@ *= 256 005A: 9@ += 4@ // (int) :ANY_ACTOR_TESTACTORHANDLE 056D: is 9@ valid_actor_handle 004D: jump_if_false @ANY_ACTOR_SEARCHLOOPNEXT 00D6: if and 803C: not $PLAYER_ACTOR == 9@ // (int) 8118: not actor 9@ dead 004D: jump_if_false @ANY_ACTOR_SEARCHLOOPNEXT 03C0: 18@ = actor 9@ car if and not 18@ == -1 803B: not 18@ == 8@ // (int) 004D: jump_if_false @ANY_ACTOR_SEARCHLOOPNEXT 0085: 19@ = 9@ 0085: 3@ = 15@ :ANY_ACTOR_SEARCHLOOPNEXT 005A: 11@ += 6@ // (int) 000A: 10@ += 1 002D: 10@ >= 7@ // (int) 004D: jump_if_false @ANY_ACTOR_SEARCHLOOPMAIN 0AB2: ret 1 19@ :ANY_ACTOR_READMEMOFFSET 0A8E: 5@ = 5@ + 17@ // int 0A8D: 5@ = read_memory 5@ size 4 virtual_protect 0 0051: return
Last edited by mfisto (21-12-2009 07:40)
I know everything and nothing...
Offline
Чем такая версия лучше старой?
Offline
Код оптимизирован, на сколько мои глаза сейчас видят
Offline
При записи предыдущего найденного актера в переменную, он будет пропущен, но поиск мотается теперь около двух актеров. А как сделать, чтобы этого не было? Чтобы пропускались все те, которые уже были найдены?
И что надо изменить в коде, чтобы можно было искать не только транспорт, объекты и актеров, а, например, маркеры над актерами, пикапы.
Offline
Часто при поиске актёра или педа вылетает, почему?
Offline
Да
Offline
а почему бы тебе не использовать опкоды клео 4?
Offline
Я их и использовал.
Offline
1) Вылетает при чтении координат найденного актёра/педа. Если вычисление координат убрать, то вылетает на опкоде 0001.
2) Cleo 4.
Offline
Я даже проверку поставил, существует ли актёр или нет, но проблема не решилась.
Offline
00AA: store_car 0@ position_to 1@ 2@ 3@ 0AB1: call_scm_func @SEARCH_PED 21 1@ 2@ 3@ 200.0 0 0 0 0 0 0 0 0 0 0 0 0 0 5@ 6@ 7@ 17@ 26@ // 5@, 6@, 7@, 17@ - педы, которых не надо искать 056D: actor 26@ defined 004D: jump_if_false @PED_NOT_DEFINED ................ :SEARCH_PED 0006: 16@ = 305868 0006: 6@ = 1988 008B: 16@ = &0(16@,1i) // (int) 0AB1: call_scm_func @READ_MEMORY 2 16@ 8 7@ 0A8D: 11@ = read_memory 16@ size 4 virtual_protect 0 0006: 9@ = -1 0006: 10@ = 0 :SEARCH_PED_7831 0AB1: call_scm_func @READ_MEMORY 2 11@ 20 4@ 8039: not 4@ == 0 004D: jump_if_false @KITT_FUNCTIONS_8134 0085: 9@ = 10@ // (int) 0AB1: call_scm_func @READ_MEMORY 2 16@ 4 5@ 005A: 5@ += 9@ // (int) 0A8D: 5@ = read_memory 5@ size 1 virtual_protect 0 0012: 9@ *= 256 005A: 9@ += 5@ // (int) 056D: actor 9@ defined 004D: jump_if_false @SEARCH_PED_8092 0AB1: call_scm_func @READ_MEMORY 2 4@ 48 12@ // По SCMLog'у вылет происходит, начиная отсюда... 0AB1: call_scm_func @READ_MEMORY 2 4@ 52 13@ 0AB1: call_scm_func @READ_MEMORY 2 4@ 56 14@ 050A: 15@ = distance_between_XYZ 0@ 1@ 2@ and_XYZ 12@ 13@ 14@ 0025: 3@ > 15@ // (float) 004D: jump_if_false @SEARCH_PED_8134 00D6: if or 003C: $PLAYER_ACTOR == 9@ // (int) 0039: 9@ == 0 003B: 9@ == 17@ // (int) 003B: 9@ == 18@ // (int) 003B: 9@ == 19@ // (int) 003B: 9@ == 20@ // (int) 0118: actor 9@ dead 004D: jump_if_false @SEARCH_PED_8106 :SEARCH_PED_8092 0006: 9@ = -1 0002: jump @SEARCH_PED_8134 :SEARCH_PED_8106 8449: not actor 9@ in_a_car 004D: jump_if_false @SEARCH_PED_8092 0085: 3@ = 15@ // (int) 0AB2: ret 1 9@ :SEARCH_PED_8134 005A: 11@ += 6@ // (int) 000A: 10@ += 1 002D: 10@ >= 7@ // (int) 004D: jump_if_false @SEARCH_PED_7831 0AB2: ret 1 9@ :READ_MEMORY 0A8E: 0@ = 0@ + 1@ // int 0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0 // ...и заканчивая здесь. 0AB2: ret 1 0@
Извиняюсь за скомплинированный скрипт.
------------------------------------------------------------------------------------------------------------------------------
JAN 08 2012 12:46 GMT+08:00
Путём убирания некоторых частей кода я нашёл причину вылета. Вылетает при использовании следующей части кода:
... 0006: 16@ = 305868 0006: 6@ = 1988 008B: 16@ = &0(16@,1i) // (int) 0AB1: call_scm_func @KITT_FUNCTIONS_8172 2 16@ 8 7@ 0A8D: 11@ = read_memory 16@ size 4 virtual_protect 0 ...
Что делает эта часть кода и чем её можно заменить?
Last edited by Dr_Emmett_Brown_2011 (08-01-2012 04:51)
Offline