You are not logged in.
Понравилась мне очень идея jayrocc`а и решил я переписать код с нуля, при этом устранив предыдущие баги.
Итак. Сначала преамбула.
МИНУСЫ
1. не поддерживает paintjob`ы (ибо у меня тока один пейнт, а остальные влом вписывать)
ПЛЮСЫ
1. самолёты при посадке останавливаются в конце полосы и не разбиваются
2. самолёты после посадки разворачиваются и начинают новый перелёт (после небольшой паузы)
3. при совершении трёх перелётов самолёт подъезжает к ангару
4. при уничтожении самолёта скрипт автоматически перезапускается
5. шасси выпускаются и убираются
ВИД
Скрипт "поставляется" в виде двух скриптов. Альфы и Омеги. Принцыпы у них одинаковые только последовательность и маршруты разные.
Альфа:
<41> LS(R) - SF
<44> SF - LV
<48> LV - LS(L)
Омега:
<46> LS(L) - LV
<43> LV - SF
<49> SF - LS(L)
Сорок второй маршрут не используется ибо не имеет точки остановки.
итак, вот и скрипты:
файл autopilot_alpha.cs
// rewrited script of airlines // by AlphaOmega // [alpha] {$CLEO .cs} //-------------MAIN--------------- :start 0000: NOP :check wait 10000 Model.Load(#AT400) 038B: load_requested_models :plane wait 0 if and Model.Available(#AT400) else_jump @plane 0@ = Car.Create(#AT400, 0.0, 0.0, 500.0) 0175: set_car 0@ Z_angle_to 0.0 08E6: set_plane 0@ landing_gear 0 ///////////////////////////////////////////////////////////// //0430: put_actor $PLAYER_ACTOR into_car 0@ passenger_seat 0 //0186: 22@ = create_marker_above_car 0@ ///////////////////////////////////////////////////////////// 1@ = 0 8@ = 41 :nextpath 07C0: load_path 8@ :path wait 0 if 07C1: path 8@ available else_jump @path 054F: clear_car 0@ damage 05EB: assign_car 0@ to_path 8@ wait 15000 :far wait 2500 00AA: store_car 0@ position_to 4@ 5@ 6@ if 0031: 6@ >= 50.0 jf @landing 08E6: set_plane 0@ landing_gear 1 jump @far :landing 08E6: set_plane 0@ landing_gear 0 :nopath wait 10000 if 060E: car 0@ assigned_to_path jf @changing jump @nopath :changing if not Car.Wrecked(0@) jf @restart 06C5: release_car 0@ from_path 0873: release_path 8@ 08E6: set_plane 0@ landing_gear 0 0174: 3@ = car 0@ Z_angle 2@ = 0 000A: 1@ += 1 if 0029: 1@ >= 3 jf @rotate jump @move :rotate wait 10 000B: 3@ += 1.0 000A: 2@ += 1 0175: set_car 0@ Z_angle_to 3@ if 0029: 2@ >= 180 jf @rotate wait 5000 jump @next1 :move 2@ = 0 4@ = 2046.304 5@ = -2492.627 6@ = 14.0 7@ = 270.0 :drive wait 5 000A: 2@ += 1 000B: 4@ += 0.127 000B: 5@ += 0.101 000B: 7@ += 0.172 00AB: put_car 0@ at 4@ 5@ 6@ 0175: set_car 0@ Z_angle_to 7@ if 0029: 2@ >= 520 jf @drive 00AB: put_car 0@ at 2112.690 -2439.955 14.0 0175: set_car 0@ Z_angle_to 0.0 wait 10000 06C5: release_car 0@ from_path 0873: release_path 8@ Car.RemoveReferences(0@) jump @check :next1 if 0039: 1@ == 1 jf @next2 0006: 8@ = 44 jump @nextpath :next2 if 0039: 1@ == 2 jf @next3 0006: 8@ = 48 jump @nextpath :next3 1@ = 0 0006: 8@ = 41 jump @nextpath :restart 06C5: release_car 0@ from_path 0873: release_path 8@ Car.RemoveReferences(0@) jump @check
файл autopilot_omega.cs
// rewrited script of airlines // by AlphaOmega // [omega] {$CLEO .cs} //-------------MAIN--------------- :start 0000: NOP :check wait 30000 Model.Load(#AT400) 038B: load_requested_models :plane wait 0 if and Model.Available(#AT400) else_jump @plane 0@ = Car.Create(#AT400, 0.0, 0.0, 500.0) 0175: set_car 0@ Z_angle_to 0.0 08E6: set_plane 0@ landing_gear 0 ///////////////////////////////////////////////////////////// //0430: put_actor $PLAYER_ACTOR into_car 0@ passenger_seat 0 //0186: 22@ = create_marker_above_car 0@ ///////////////////////////////////////////////////////////// 1@ = 0 8@ = 46 :nextpath 07C0: load_path 8@ :path wait 0 if 07C1: path 8@ available else_jump @path 054F: clear_car 0@ damage 05EB: assign_car 0@ to_path 8@ wait 15000 :far wait 2500 00AA: store_car 0@ position_to 4@ 5@ 6@ if 0031: 6@ >= 50.0 jf @landing 08E6: set_plane 0@ landing_gear 1 jump @far :landing 08E6: set_plane 0@ landing_gear 0 :nopath wait 10000 if 060E: car 0@ assigned_to_path jf @changing jump @nopath :changing if not Car.Wrecked(0@) jf @restart 06C5: release_car 0@ from_path 0873: release_path 8@ 08E6: set_plane 0@ landing_gear 0 0174: 3@ = car 0@ Z_angle 2@ = 0 000A: 1@ += 1 if 0029: 1@ >= 3 jf @rotate jump @move :rotate wait 10 000B: 3@ += 1.0 000A: 2@ += 1 0175: set_car 0@ Z_angle_to 3@ if 0029: 2@ >= 180 jf @rotate wait 5000 jump @next1 :move 2@ = 0 4@ = 2046.304 5@ = -2492.627 6@ = 14.0 7@ = 270.0 :drive wait 5 000A: 2@ += 1 000B: 4@ += 0.127 000B: 5@ += 0.101 000B: 7@ += 0.172 00AB: put_car 0@ at 4@ 5@ 6@ 0175: set_car 0@ Z_angle_to 7@ if 0029: 2@ >= 520 jf @drive 00AB: put_car 0@ at 2112.690 -2439.955 14.0 0175: set_car 0@ Z_angle_to 0.0 wait 10000 06C5: release_car 0@ from_path 0873: release_path 8@ Car.RemoveReferences(0@) jump @check :next1 if 0039: 1@ == 1 jf @next2 0006: 8@ = 43 jump @nextpath :next2 if 0039: 1@ == 2 jf @next3 0006: 8@ = 49 jump @nextpath :next3 1@ = 0 0006: 8@ = 46 jump @nextpath :restart 06C5: release_car 0@ from_path 0873: release_path 8@ Car.RemoveReferences(0@) jump @check
Last edited by AlphaOmega (22-06-2008 19:23)
Offline
@AlphaOmega - Поиграл, в целом хорошо.
Но на мой взгляд, мод совершенно не создает иллюзии воздушного траффика, как заявлено в названии темы. Все дело в том, что скрипт управляет только одним самолетом. И большую часть времени самолет проводит где-то в облаках, не выдавая своего присутствия.
Я бы предложил немного другую концепцию мода. Сделать скрипт, который был бы шаблоном для управления неким самолетом в переменной 0@. Такой скрипт делал бы основные проверки, работу с путями, посадку, переход на другой путь и т.д. Назовем его AirTraffic.cs.
Еще в начале AirTraffic.cs нужно было бы добавить один блок кода, который создавал бы группу самолетов (5-6 штук) в разных частях штата. Не обязательно делать только AT400, чем хуже шамал или невада? И после этого скрипт рекурсивно вызывал бы самого себя с параметром - хендлом самолета. Т.е.
create_custom_thread "CLEO\AirTraffic.cs" 0@ // первый самолет create_custom_thread "CLEO\AirTraffic.cs" 1@ // второй самолет и т.д.
В начале скрипта тебе нужно было бы только проверить переменную 0@ (в которой хранится переданный в поток параметр). Если она равна 0, значит это первый запуск скрипта (автоматический). Тогда ты создаешь группу самолетов и делаешь вызов этого же скрипта для каждого самолета.
Если 0@ не равно 0, значит это ты сам вызвал этот скрипт и в 0@ хранится хендл самолета. Теперь аттачим его к случайному пути (возможно даже где-то в середине, необязательно же стартовать только со взлетной полосы).
Таким образом ты получишь 5-6 работающих потоков в памяти игры, каждый из которых управлял бы своим самолетом, летающим из города в город. Получилось бы здорово, мне кажется.
Еще не забывай помечать модели как более ненужные, командой Model.Destroy
Примерно шаблон скрипта выглядит так:
{$CLEO} if 0@ == 0 // проверяем параметр then // это запуск скрипта через CLEO. // создаем самолеты и добавляем к ним "мозги" 0@ = create_car #AT400 create_custom_thread "CLEO\AirTraffic.cs" 0@ 0@ = create_car #SHAMAL create_custom_thread "CLEO\AirTraffic.cs" 0@ 0@ = create_car #NEVADA create_custom_thread "CLEO\AirTraffic.cs" 0@ // самолеты созданы, у каждого есть скрипт управления, поэтому этот скрипт уже не нужен end_custom_thread else // есть параметр, значит была создана группа самолетов с "мозгами" // здесь мы управляем самолетом, аттачим к пути, проверяем и т.д. attach_car 0@ to_path while true .... // важно! нужно постоянно проверять состояние самолета // если он уничтожен (например, пока разворачивается на полосе) // нужно прекратить скрипт if car 0@ wrecked then // перед остановкой, скрипт может создать еще один самолет и еще одну копию самого себя // чтобы число самолетов не уменьшалось // //0@ = create_car #NEVADA //create_custom_thread "CLEO\AirTraffic.cs" 0@ end_custom_thread end end end
Offline
@AlphaOmega - Поиграл, в целом хорошо.
<...>
Идея интересная. Надо попробовать. Только вот в чём проблема: когда аттачишь самолёт к пути - онвсегда начинает его с начала. Как его переместить в другую часть пути - не знаю.
Когда создаются много самолётов, они начинают накладывать друг на друга в аэропортах (проходят друг друга насквозь).
Кстати, пытался использовать опкод типа "драйв_кар_ту_ХYZ" и "ротэйт_обжект_фром_А_ту_Z" но самолёты всё равно стоят на месте. Как быть? А то вручную его передвижение (как в конце к ангару) прописывать жутко неудобно и косячно.
Offline
Как его переместить в другую часть пути - не знаю
0706: advance_car 108@ further_along_path 1.0
параметр - номер точки пути. 1.0 - переместить к следующей, 2.0 - через одну и т.д.
но самолёты всё равно стоят на месте
нужно детачить его с пути и посадить пилота. серьезно. без водителя в машине опкоды движения машины не работают.
Offline
посадить пилота. серьезно. без водителя в машине опкоды движения машины не работают.
Почему? Работают, но звука двигателя не будет и в самолетах не будет вращаться пропеллер. А двигаться по заданному пути будет, не раз проверял. Делал для ролика движение и посадку самолета, вынужден был сажать в кабину пилота только потому , что не крутился пропеллер.
Offline
Пилота посадил. Пропеллер крутится, двигатель шумит. Но когда я говорю ему ехать к точке - он чуток сдвигается и затем практически останавливается. Если присвоить ему какую-то скорость, то самолёт начинает движение, а потом плавно тормозит так и не доехав до точки. Если присвоение скорости и/или пути запустить в цикл каждую секунду, то самолёт начинает двигаться по кругу
:go 02C2: car 0@ drive_to 1508.57 1788.499 11.0 04BA: set_car 0@ speed_to 5.0 wait 1000 jump @go
Что ж делать то?
Как заставить самолёт плавно доехать до конкретной точки?
Offline
04D2: unknown_RC_car $Plane race_to 1600.0 1200.0 64.0 0.0 0.0 - заставляет настоящий самолёт лететь к заданной точке, 0.0 0.0 - не трогайте.
070F: (unknown) $Plane 0.0 130.0 130.0 - заставляет самолёт лететь под опред.углом(0.0) на опред. высоте (130.0 130.0). Если рассмотреть карту SA, как плоскость,то легко подсчитать угол полёта.
08E6: plane $Plane change_landing_gear 1 - шасси у самолёта выпушенуо, если 1 и не выпущено, если 0, но временами эти команды проглючивают.
084E: flying_vehicle $SamNeLet use_primary_gun 1 - использование самолётом (ГИДРА) ракет.
0841: flying_vehicle $SamNeLet use_secondary_gun 1 - использование пулемёта (ДИЛЛЕР).
0724: flying_vehicle $SamNeLet follow_and_attack_player $PLAYER_CHAR radius 40.0 - самолёт держится на определённом радиусе от игрока и атакует его.
03A2: $Plane 3 - опускает у самолёта закрылки,если ставить меньше,чем 0,то ничего не будет
0745: $Plane - переключение в режим горизонтального полёта (для Гидры)
-=YariK=-
http://my-mods.org.ua/
Offline
...
Блииин, я же говорю про ЗЕМЛЮ. В воздухе получается всё что требуется, а на земле самолёт как камень почти. Пробовал указать куда ехаьть, пробовал заставить пилота туда поехать, но всё заканчивается либо полной остановкой, либо при придании скорости он начинает поворачивать и так до бесконечности
Offline
Ну а может оно и не расчитано на самолётовю Чем не подходит 04D2 ???
-=YariK=-
http://my-mods.org.ua/
Offline
Ну а может оно и не расчитано на самолётов.
Ты же рассказывал что раньше делал.
Чем не подходит 04D2 ???
Тем, что работает через раз: 50% работает так же как драйв_ту, а в 50% взлетает и следует к точке уже в воздухе.
Offline
Ты же рассказывал что раньше делал.
Я? не помню такого если честно...я ваще с самолётами почти не работал
взлетает и следует к точке уже в воздухе
а если указать Z координату чуть ниже земли? может тогда не полетит?
-=YariK=-
http://my-mods.org.ua/
Offline
взлетает и следует к точке уже в воздухе
а если указать Z координату чуть ниже земли? может тогда не полетит?
Неа. Всё равно. Взлетает
Offline
если поставить ограничитель скорости?
Offline
если поставить ограничитель скорости?
Неа, он всё равно разгоняется и взлетает
Вопрос: а реально с помощью клео, серией точек задать свой путь, и потом к нему привязать самолёт?
Offline