You are not logged in.
Pages: 1
Когда то задавал этот вопрос.
Есть пед из трафика. Как промыть ему мозг ? Что бы он встал как вкопаный, как после
actor.create() и пустого DM.
Дело в том, что после любого задания, которое ему даётся (типа пойти туда-сюда,
проиграть аниму...) он всё равно прёт по своим делам. Вроде как к нему применили
05DE: AS_actor 54@ walk_around_ped_path
Как то можно закрыть ему все TASKи, которые он получил при генерации ?
Пробовал следующее:
1. Нашел нужного педа в трафике
2. Присвоил ему флаг уникальности
3. поставил ему EMPTY_DM (0) - нифига не помогло, он просто перестал реагировать
на плеера и остальных педов, но как пёр по своим педовским делам - так и пёр.
4. Пробовал 0687: clear_actor 0@ task = ессно тоже не помогло (я так понял этот
опкод отбивает у него желание исполнять только скриптовые TASKи)
Просто в некоторых ситуациях приходится создавать нового актора, причем чтоб он не был
виден в момент создания, т.к. это сильно бросается в глаза т.е. в 90% случаев за спиной плеера.
А по идее это должен быть пед из трафика.
Если последний в логе - wait, то значит в момент вылета ни один скрипт (или поток мейна) не выполнялся. Скрипт в данном случае может быть косвенной причиной вылета (например, если написать и установить скрипт, удаляющий ближайшие к игроку объекты, а затем попытаться выстрелить из ракетницы, то игра вылетит, т.к. скрипт удалит ракету и возникнет ошибка в процессе, управляющем ракетами).
Да уж, косвенные причины тяжелее найти...
Ну ты прям ясновидящий на тему ракет. Как раз в этом месте они обильно юзаются акторами...
Спасибки - будем искать.
Игра вылетает - вот лог.
Я так понял, что если запись заканчивается Waitом , то вылет, возможно не из за мэйна ?
Причем игра вылетает не на конкретном месте. А в любое время выполнения
одного из потоков. (кстати в лог этот поток почемто не записался)...
******************************************** thread main Local variables dump: 354189 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ******************************************** 00048040: 00D6 get numeric params: 1 param 1 = 0 00048044: 0256 get numeric params: 1 param 1 = 0 00048049: 004D (&IFresult = True) get numeric params: 1 param 1 = 48064 (&label: 00BF) 00048056: 09E8 get numeric params: 1 param 1 = 1 00048064: 00BF 00048072: 01BD 00048077: 008D 00048085: 008D 00048093: 0086 00048101: 0011 get numeric params: 1 param 1 = 30.00 00048111: 0011 get numeric params: 1 param 1 = 6.00 00048121: 0011 get numeric params: 1 param 1 = 0.50 00048131: 0059 00048139: 0002 get numeric params: 1 param 1 = 48036 (&label: 0001) 00048036: 0001 get numeric params: 1 param 1 = 0 ********************************* > Total opcodes: 24983560 > Logging finished: 1:01:59 Powered by SCMLog v1.04 *********************************
Спасибо... То что надо...
Есть ли в структуре педов неиспользуемые игрой байты ?
Это нужно для отсечения ранее найденых педов + для записи туда каких либо данных.
И еще вопрос - как узнать был ли найденный актор создан из скрипта или это пед из трафика ?
я в курсе что она превышает указанное значение, дело не в этом...как же объяснить понятнее...тут только показывать надо)) короче говоря, мне это нужно для моего мода...паркур мода...чтобы можно было перепрыгивать сальтами через заборы и не только, я придаю движение игроку опкодом 083С, а анимацию обездвиживаю...но проблема в том, что у меня анимация начинается с замаха, движение которого я оставляю, и убираю когда он должен подлетать...подлетание обеспечиваю тем самым опкодом (083С), через время замаха...время замаха подсчитать несложно, но если поставить wait с тем временем, то очень часто не попадает вовремя, а если фпс опустится скажем до 15, то он половину замаха сделает и подлетит, короче говоря опкод 083C сработает раньше чем надо...ну вобщем если непонятно, я могу скинуть примерчик))
А зачем тут время подсчитывать = жди до конца анимации замаха.
// тут начинаешь аниму замаха
while player.Defined($PLAYER_CHAR)
wait 0
if
actor.Animation($PLAYER_ACTOR) == "ANIMA"
jf break
0613: 26@ = actor $PLAYER_ACTOR animation "ANIMA" time // от 0.0 до 1.0
if
not 26@ == 1.0 // или можно например not 26@ > 0.98
jf break
end
И еще о звуках = (ибо без них моды получаются пресными)
хорошо бы еще иметь проверку типа "audiostream $AUDIO exist" (существует ли аудио)
во извежании глюков после загрузки сэйвов. Без этого, конечно, можно обойтись,
но неплохо иметь в арсенале.
Ну и еще расширить опкод "0AAE: release_audiostream $AUDIO", чтоб с параметром -1
он выгружал все загруженые звуки. Это мелочь, но приятно.
Полным шиком был бы опкод типа "audiostream $AUDIO fade 1.0 to 0.0 1000 ms"
(типа сменить громкость от 1.0 до 0.0 за 1000 мс).
Вот спасибо. Теперь есть почти всё что надо для звуков.
И всётаки, если будет время, добавь возможность проиграть файл с определённого места.
кстати - версию ты обновил, но в меню СА осталось 4.1.1.25
Не срабатывает формат текст, например
0ACF: show_formatted_styled_text "%d + %d = %d" time 2000 style 1 2 2 4
выдаёт на экране "d + d = d"
а вот этот работает
0ACF: show_formatted_styled_text "This is %.4X opcode" time 2000 style 1 0x0ACF
(КЛЕО4.1.1.25 , ЕХЕ 14 383 616 байт)
--
+ маловато возможностей AudioStream. Например нельзя проиграть файл с
определённого места.
А еще не работает (или я не понял как использовать) зацикливание звука
0AC0: loop_audiostream $hMP3 flag 1
Дениска а чето за файлы еще какието (3D_sound.aps , voice.aps и тд.) для работы скрипта со звуком?
Это файлы аудиоплеера для СА от Vityok SA MODer.
Модифицированная снайперская винтовка (GTA SA)
Стреляем с зажатым ШИФТОМ разрывательными зарядами (текст-подсказка присутствует).
Так же есть звуки выстрела и перезарядки.
Без ШИФТА - обычная винтовка.
Да, но перед тем как задать вопрос, я перепробовал все DM = не помогло.
А ЕХЕ для меня тёмный лес.
И ещё, когда я записываю в переменную прохожего и пытаюсь совершить с ним некоторые операции(заставить стоять и смотреть на Гг), он на мгновение поворачивается лицом к Гг, потом разворачивается и продолжает свой путь, как это исправить? (установка времени того сколько должен пед стоять и смотреть на Гг не помогает)
Пед на улице отличается от созданного актора.
Но наверняка можно из педа сделать актора.
Я как то задавал такой вопрос, но ответа не получил.
Так что присоединюсь к вопросу. Очень надо узнать.
(а пока выхожу из положения так = удаляю педа и на его месте
создаю актора с тойже моделью и углом поворота...
Плохо, т.к. если пед рядом и видим, то переход очень заметен)
Существует ли проверка момента выхода актёра из машины?
А может через адрес памяти ?
CPed +0x530 = [dword] Статус:
0 = покидает машину, падает с байка или что-то в этом роде
.... 0A96: 0@ = actor $PLAYER_ACTOR struct inc(0@,0x530) 0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0 if 0@ == 0 then // Аокидает машину end ....
Или может тут найдёшь http://gtamodding.ru/wiki/Адреса_Памяти … 0.B4.D1.8B
Я сделал свой остров, поставил туда дом с гаражом(без двери, пока). Прописал гараж в IPL. Машины
сохраняются. Но как сделать что бы дверь открывалась когда к ней подходишь, как в других гаражах?
Тоесть мне нужен опкод который может двигать обьекты. И если можно пример скрипта с дверью.
Скриптинг тут НЕ нужен. (не совсем по адресу вопрос).
Если ты прописал сам гараж и тачки в нём сохраняются, то осталось сделать дверь.
1. В IDE дверь должна быть прорисана с флагом 2048 (например "5555, DVER, DVER_TXD, 120, 2048")
2. Дверь надо прописать в файле objects.dat = посмотри как прописана любая дверь СА и
сделай так еж.
3. Очень важно. При моделировании дверь должна быть сделана так, чтобы тачка
въезжала слева-направо при виде сверху. Потом уже в ИПЛ её можно вращать и
ставить к входу в гараж.
4. Тип её открывания прописан там, где прописан сам гараж (см. описание ИПЛ)
Теперь она должна открываться автоматически без всяких скриптов.
Скриптами можно её насильно заблокировать, разблокировать, открыть, закрыть и еще
разные примочки.Но для её работы скриптинг не нужен
Тоже интересно как это сделать без мат вычислений.
А так, вот примерный алгоритм вычислений, если
известна точка откуда будет выстрел и направление.
(примерно так у меня реализована лазерная пушка)
Основан на методе деления на 2. Но это больше
подходит для одиночного выстрела, иначе
будет притормаживать при высокой точности.
const ITERATIONS = 8 // Точность 2^(ITERATIONS+1) end 04C4: store_coords_to 1@ 2@ 3@ from_actor $PLAYER_ACTOR with_offset 0.0 1.0 0.6 // BULLET START POINT 04C4: store_coords_to 7@ 8@ 9@ from_actor $PLAYER_ACTOR with_offset 0.0 500.0 0.6 // BULLET MAX POINT if 86BD: not no_obstacles_between 1@ 2@ 3@ and 7@ 8@ 9@ solid 1 car 0 actor 0 object 0 particle 0 then for 0@ = 1 to ITERATIONS 0087: 4@ = 1@ // Находим центр отрезка 005B: 4@ += 7@ 4@ /= 2.0 0087: 5@ = 2@ 005B: 5@ += 8@ 5@ /= 2.0 0087: 6@ = 3@ 005B: 6@ += 9@ 6@ /= 2.0 if 86BD: not no_obstacles_between 1@ 2@ 3@ and 4@ 5@ 6@ solid 1 car 0 actor 0 object 0 particle 0 then 0087: 7@ = 4@ // Если пересекается на 1й половине 0087: 8@ = 5@ // То дальше берём 1й отрезок 0087: 9@ = 6@ else 0087: 1@ = 4@ // Иначе берём 2й отрезок 0087: 2@ = 5@ 0087: 3@ = 6@ end end 0087: 4@ = 1@ // Еще раз делим на 2 для большей точности 005B: 4@ += 7@ 4@ /= 2.0 0087: 5@ = 2@ 005B: 5@ += 8@ 5@ /= 2.0 0087: 6@ = 3@ 005B: 6@ += 9@ 6@ /= 2.0 // Координаты = 4@,5@,6@ else // Нет пересечений end
По координатам в маленьком радиусе можно его хендл найти через 073F:......
(просто я думал можно проще это сделать)
......... 0@ = 300694 // TARGET 0085: 0@ = &0(0@,1i) inc(0@, 0x79C) 0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0 if 0@ > 0 then 0085: 1@ = 0@ // (int) inc(1@, 0x14) 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 inc(1@, 0x30) 0A8D: 20@ = read_memory 1@ size 4 virtual_protect 0 inc(1@, 0x04) 0A8D: 21@ = read_memory 1@ size 4 virtual_protect 0 inc(1@, 0x04) 0A8D: 22@ = read_memory 1@ size 4 virtual_protect 0 073F: get_actor_in_sphere 20@ 21@ 22@ radius 0.4 with_pedtype_civilian 1 gang 1 criminal/prostitute 1 handle_as 2@ end ..........
Но основной вопрос не в этом.
А как "превратить" его в актора ? (А то после "073F: get_actor_in_sphere..." пешеход продолжает
вести себя как ПЕД т.е. прёт по своим делам. Присвоение ему всяких DecisionMaker не помогает,
ClearTask не помогает... Вобщем много чего пробовал)
И где в его сруктуре записано есть ли у него reference ? (А то вдруг это уже актор...)
Может не совсем в тему вопрос =
Вот нашелся адрес структуры TARGET PEDа (из скрипта в 1м посте).
1. Как определить это пешеход или созданный актор ?
2. Если это пешеход, то как получить его хэндл и отменить все его ПЕДовские задачи ?
Как будто он создан CreateActor. ("Родить" на его месте другого актора с такой же
моделью, не подходит, т.к. это будет бросаться в глаза)
Pages: 1