Вопросы по созданию КЛЕО-скриптов 2
|
|
Den_spb | Дата: Вторник, 16.07.2013, 19:57 | Сообщение # 361 |
Создатель сайта
Группа: Администраторы
Сообщений: 1603
Статус: Offline
| Цитата (Vital) И всё-таки странно, почему уничтоженная и выгруженная из памяти машина считается найденной... Не понял. Если это вопрос, то приведите в более понятную форму.
|
|
| |
Vital | Дата: Вторник, 16.07.2013, 20:31 | Сообщение # 362 |
Группа: Проверенные
Сообщений: 206
Статус: Offline
| Den_spb, в предыдущем моём посте был вопрос, копирую сюда, чтоб было удобнее: Я вас не побеспокою, если покажу свой код целого скрипта, по которому есть пока что лишь один вопрос? Ссылка на pastebin.com
Проблема находится в части 7.2.1 (цикл for). Если не использовать проверку на наличие маркера, то игра, вопреки car defined засчитает уже уничтоженную машину найденной, хоть я и удаляю о ней сведения в случае уничтожения. В таком случае миссия сразу считается пройденной, а маркеры и два самолёта остаются, продолжая атаковать. Это странно, вроде бы игра не должны считать объекты без сведений найденными, однако так случается.
SCRIPTER
|
|
| |
Den_spb | Дата: Вторник, 16.07.2013, 23:58 | Сообщение # 363 |
Создатель сайта
Группа: Администраторы
Сообщений: 1603
Статус: Offline
| Цитата (Vital) Это странно, вроде бы игра не должны считать объекты без сведений найденными Командой remove_references ты всего лишь снял флаг уникальности - после этого действия машина продолжает существовать, только теперь у неё уже нет "иммунитета" от игрового "сборщика мусора". Это означает, что если теперь игрок отойдёт от машины на значительное расстояние, то игра сможет сама её удалить. Проверка car_defined проверяет, существует ли данная машина вообще - при этом не важно, целая машина или взорванная, включен ли флаг уникальности или нет и т.д.
|
|
| |
DK22Pac | Дата: Пятница, 19.07.2013, 17:35 | Сообщение # 364 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Vital, вот скрипт для пикапов. Код {$CLEO} {$I inloop} {$I forallpickups} 065B: store_pickup pick position_to 0@ 1@ 2@ if 00C2: sphere_onscreen 0@ 1@ 2@ radius 7.0 then 024F: create_corona_with_radius 0.35 type 9 lensflares 0 with_color 255 0 0 at 0@ 1@ 2@ 016F: create_particle 3 rotation_factor 0.0 size 0.75 intensity 100 flags 255 255 0 at 0@ 1@ 2@ end {$I for_end} {$I end}
|
|
| |
Vital | Дата: Пятница, 19.07.2013, 19:24 | Сообщение # 365 |
Группа: Проверенные
Сообщений: 206
Статус: Offline
| DK22Pac, здорово Даже с учётом текста файла forallpickups код получается в несколько раз меньше и аккуратнее. Спасибо за пример! Теперь, пожалуй, займусь "пониманием" кода самих $Include. Например, я, наконец-то, понял логику перебора адресов пикапов. Начальный адрес, как и указано в gtamodding - 0x9788C0. Один элемент - 32 байта, что в шестнадцатеричной системе - 20 (0х20). Всего 620 элементов, но так как отсчёт идёт с нуля (с первого элемента, то есть, с 0x9788C0), то берём 619 элементов, умножаем на 32 и переводим получившееся число в шестнадцатеричную систему счисления. К этому числу прибавляем начальный адрес (первый) и получаем 0x97D620 - последний элемент. Только с дальнейшим у меня проблемы с пониманием: почему не надо читать адрес, а сразу можно проверить его (30@ > 0). Потом мы сразу считываем вот это: - +26 = [word]Уникальный индекс
, зачем-то умножаем на 65536 (0х1000). Потом из текущего элемента вычитаем начальный адрес пикапов, затем делим на размер одного элемента, а потом прибавляем полученное ранее число-индекс (31@ += 29@). С этим неясно. Я не ошибаюсь, ведь можно осуществить таким образом перебор и каждое значение счётчика (в for) использовать как адрес памяти?
SCRIPTER
|
|
| |
DK22Pac | Дата: Пятница, 19.07.2013, 19:42 | Сообщение # 366 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Там (в forallpickups) происходит вычисление хендла пикапа. Он там (в игре) зарыт немного.Цитата (Vital) почему не надо читать адрес, а сразу можно проверить его (30@ > 0). Действительно, эта проверка лишняя. Цитата (Vital) Потом из текущего элемента вычитаем начальный адрес пикапов, затем делим на размер одного элемента Так мы получаем индекс пикапа в массиве.Цитата (Vital) а потом прибавляем полученное ранее число-индекс Так получаем хендл.
Сообщение отредактировал DK22Pac - Пятница, 19.07.2013, 19:44 |
|
| |
Vital | Дата: Пятница, 19.07.2013, 19:58 | Сообщение # 367 |
Группа: Проверенные
Сообщений: 206
Статус: Offline
| DK22Pac, если не сложно и есть время, можно ещё немного объяснить работу forallpeds / cars. Некоторые нюансы я не заметил на сайтах с адресами памяти. Буду рад разобраться. Добавлено (19.07.2013, 19:58) --------------------------------------------- Если быть конкретнее, возьму пример peds: 1) 0xB74490 - Содержит указатель на указатель, берём смещение +4 (Содержит указатель на карту байтов, которая обозначает, какие элементы используются в пуле CPed). Это, наверное, сам массив актёров?
2) Код for 30@ = 0 to 35584 step 0x100 А здесь вместо базового адреса отсчёт идёт с нуля и до 35587 с шагом 0х100 (256). Что означают эти числа? Это перебор той самой "карты байтов"?
3) Код 0A8D: ped = read_memory 29@ size 1 virtual_protect 0 000A: 29@ += 0x1 Чтение того самого адреса "карты байтов" и прибавление смещения 1 (0х1). Что делает данное смещение?
4) Код if and 0029: ped >= 0x00 001B: 0x80 > ped then 005A: ped += 30@ Проверяем, что ped > 0 (0х00, как мы обычно смотрели, есть ли структура), но непонятно, почему мы проверяем, что ped < 0x80 (128). Затем прибавляем 30@(счетчик цикла) к ped, что тоже пока туго понять.
SCRIPTER
|
|
| |
DK22Pac | Дата: Пятница, 19.07.2013, 22:16 | Сообщение # 368 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Vital, там ничего сложного нет. Хендл вычисляется так: индекс_в_массиве * 256 + значение_flags При этом, пед существует, если в значение_flags не включен флаг 0x80.Добавлено (19.07.2013, 22:16) --------------------------------------------- Вот тут есть информация об этом. http://varistor.dyndns.org/wiki....8%C6%C0
Жаль, что на японском
|
|
| |
Vital | Дата: Пятница, 19.07.2013, 23:07 | Сообщение # 369 |
Группа: Проверенные
Сообщений: 206
Статус: Offline
| DK22Pac, обязательно посмотрю, по крайней мере код не на японском. "Чтобы получить ручку (хендл) на все". Гениальный машинный перевод Я так понял, значение флагов - это ped. Только хотелось бы понять, что такое флаги (не те ли флаги, которые задаются актёрам), что такое карта байтов, что есть в этом всём индекс массива и откуда значения 35584 и 0х100 в цикле for. В общем, я тут как турист: с открытым от удивления ртом смотрю и не могу понять. А моя гуманитарная сущность, увы, не поняв досконально, наотрез отказывается эффективно работать Жаль, конечно, что из-за этого приходится вас всех отвлекать по десять раз, тем более гуманитариям нелегко объяснить что-то подобное. У меня всегда так: когда дело идёт с опкодами, циклами и подобными вещами среднего уровня, у меня всё нормально, но когда идёт углубление в биты, байты и шестнадцатеричную систему (переводы из одной в другую в школе я до сих пор вспоминаю с ужасом), голова взрывается. В общем, не прошу вас выдумывать сказочные образы точных вещей, просто немножко конкретики, самой логики вещей. Заранее спасибо за помощь и за невыразимо крепкое терпение: вы через форум пропустили столько людей, столько просьб и вопросов, порой совсем невнятных и "нубских", что другие бы вряд ли обошлись без ругани и мата.
SCRIPTER
|
|
| |
d88 | Дата: Понедельник, 22.07.2013, 12:12 | Сообщение # 370 |
Группа: Проверенные
Сообщений: 113
Статус: Offline
| Привет. У меня проблема с кодами 016C: и 016D:, они устанавливают координаты рестарта после гибели и ареста. Но они работают только если игрок погиб или был арестован вблизи от указанных координат. Это можно исправить?
|
|
| |
ILYALION | Дата: Понедельник, 19.08.2013, 11:38 | Сообщение # 371 |
Группа: Проверенные
Сообщений: 325
Статус: Offline
| Я создаю актёра командой 01C8: 9@ = create_actor_pedtype 1@ model 8@ in_car 0@ passenger_seat 0 После того, как я удаляю о нём сведения из памяти командой actor.RemoveReferences(9@), он выходит из машины. Как сделать так, чтобы он оставался в машине?Добавлено (19.08.2013, 11:38) --------------------------------------------- Как заставить актёра садиться в машину именно через дверь водителя, чтобы он не выбрасывал пассажиров?
|
|
| |
андрей1981 | Дата: Суббота, 19.10.2013, 09:25 | Сообщение # 372 |
Группа: Пользователи
Сообщений: 12
Статус: Offline
| Как можно скриптом "отключить" стандартные звуки (авто, оружия)
|
|
| |
d88 | Дата: Пятница, 01.11.2013, 16:52 | Сообщение # 373 |
Группа: Проверенные
Сообщений: 113
Статус: Offline
| Den_spb, привет. Мы когда-то обсуждали, как создать автомобиль в случайных координатах на дороге, и чтоб при этом он был сразу повёрнут в ту сторону, куда направлено движение машин. Вроде тогда ты нашёл способ, как это сделать. Можешь ещё раз написать его?
И ещё - у тебя же большой опыт в работе с поездами. Можно сделать, чтоб поезда ездили часто, быстро и без остановок?
|
|
| |
Den_spb | Дата: Понедельник, 04.11.2013, 05:30 | Сообщение # 374 |
Создатель сайта
Группа: Администраторы
Сообщений: 1603
Статус: Offline
| Цитата d88 ( ) Den_spb, привет. Мы когда-то обсуждали, как создать автомобиль в случайных координатах на дороге, и чтоб при этом он был сразу повёрнут в ту сторону, куда направлено движение машин. Привет. Такого разговора уже не помню, но предполагаю, что в данной ситуации поможет опкод:Код 06F8: get_nearest_route_for 0@ 1@ 2@ in_direction 30@ store_to 6@ 7@ 8@ Z_angle_to 3@ Записывает в переменные 6@ 7@ 8@ координаты точки пути, ближайшей к точке с координатами 0@ 1@ 2@. "Angle" - угол направления от найденной точки пути к следующей точке этого пути. "Direction" - если указать 0, то будет найдена самая ближайшая точка, 1 - вторая точка по удалённости от указанных координат, 2 - третья точка по удалённости от указанных координат и т.д. Цитата d88 ( ) Можно сделать, чтоб поезда ездили часто, быстро и без остановок? Есть 2 пути: либо редактировать стандартную игровую функцию, управляющую движением поездовКод 006F7900 Trains_Spawn_Process Либо отключать стандартный трафик поездов и писать скрипт, создающий новый трафик поездов. Этот скрипт был написан для модификации "Новый алгоритм движения поездов". Остановки убрать проще всего - в файле маршрута поезда tracks.dat они отмечены единицами в четвёртом столбце файла. Эти единицы нужно заменить на нули.
|
|
| |
d88 | Дата: Вторник, 05.11.2013, 16:14 | Сообщение # 375 |
Группа: Проверенные
Сообщений: 113
Статус: Offline
| Цитата Den_spb ( ) Такого разговора уже не помню, но предполагаю, что в данной ситуации поможет опкод: Спасибо, попробую.
Цитата Den_spb ( ) Остановки убрать проще всего - в файле маршрута поезда tracks.dat они отмечены единицами в четвёртом столбце файла. Эти единицы нужно заменить на нули. А через скрипт это можно сделать? Мне нужно, чтоб остановики отключились только на определённое время. Если использовать второй способ, то созданные скриптом поезда будут ехать без остановок?
|
|
| |