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