Пятница, 19.04.2024, 06:53
Качественные скрипты, моды и дополнения для GTA без регистрации
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Форум » Игры серии ГТА » Скриптинг » Вопросы по созданию КЛЕО-скриптов 2
Вопросы по созданию КЛЕО-скриптов 2
Den_spbДата: Вторник, 16.07.2013, 19:57 | Сообщение # 361
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: 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
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: 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, здорово  smile Даже с учётом текста файла 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

Жаль, что на японском  tongue

 
VitalДата: Пятница, 19.07.2013, 23:07 | Сообщение # 369
Группа: Проверенные
Сообщений: 206
Статус: Offline
DK22Pac, обязательно посмотрю, по крайней мере код не на японском.
"Чтобы получить ручку (хендл) на все". Гениальный машинный перевод  biggrin
Я так понял, значение флагов - это ped. Только хотелось бы понять, что такое флаги (не те ли флаги, которые задаются актёрам), что такое карта байтов, что есть в этом всём индекс массива и откуда значения 35584 и 0х100 в цикле for. В общем, я тут как турист: с открытым от удивления ртом смотрю и не могу понять. А моя гуманитарная сущность, увы, не поняв досконально, наотрез отказывается эффективно работать  dry Жаль, конечно, что из-за этого приходится вас всех отвлекать по десять раз, тем более гуманитариям нелегко объяснить что-то подобное. У меня всегда так: когда дело идёт с опкодами, циклами и подобными вещами среднего уровня, у меня всё нормально, но когда идёт углубление в биты, байты и шестнадцатеричную систему (переводы из одной в другую в школе я до сих пор вспоминаю с ужасом), голова взрывается.
В общем, не прошу вас выдумывать сказочные образы точных вещей, просто немножко конкретики, самой логики вещей.
Заранее спасибо за помощь и за невыразимо крепкое терпение: вы через форум пропустили столько людей, столько просьб и вопросов, порой совсем невнятных и "нубских", что другие бы вряд ли обошлись без ругани и мата.


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
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: 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 они отмечены единицами в четвёртом столбце файла. Эти единицы нужно заменить на нули.

А через скрипт это можно сделать? Мне нужно, чтоб остановики отключились только на определённое время.
Если использовать второй способ, то созданные скриптом поезда будут ехать без остановок?
 
Форум » Игры серии ГТА » Скриптинг » Вопросы по созданию КЛЕО-скриптов 2
Поиск: