#1 08-05-2009 20:10

Alien
Registered: 12-10-2008
Posts: 564

ZIS-6 BM-13-16 Rocket Launcher (Оживляем "Катюшу")

К 9 мая написал скрипт, оживляющий модельку, сделанную Du-Mont'ом. Модельку можно скачать, например, здесь.
      [large]Краткое описание[/large]
CLEO-скрипт для игры GTA San Andreas. Оживляет модель пусковой установки "Катюша" на шасси ЗИС-6 времен Второй Мировой Войны, сделанной Du-Mont'ом. Скрипт написан только для этой конкретной модели, заменяющей трансопортное средство Packer, и ни для какой другой.
      [large]Управление, оно же подробное описание[/large]
Вся установка управляется при помощи одной единственной Левой кнопкой мыши aka ЛКМ aka LMB aka Left Mouse Button (и не надо меня потом спрашивать, что же это за кнопка такая). Думаю, понятно, что делает эта кнопка - запускает ракету. Игрок в этот момент должен находится в кабине машины ЗИС-6 на водительском месте. Не забывайте также, что можете поднимать и опускать пусковую установку при помощи внутреигровых клавиш управления авто VEHICLE_TURRETUP и VEHICLE_TURRETDOWN, регулируя тем самым дальность стрельбы.
      [large]Сырцы[/large] (откомментированные)

{$CLEO}
{$I VK.inc}           //Здесь зарезервированные константые имена Virtual Key Codes для 0AB0 (VK_*)
const
rocket = 0@                 //массив ракет, 8 штук
col_model = 8@               //массив объектов, имеющих коллизию - она нужна чтобы зарегистрировать касание ракеты, 8 штук
rocket_timer = 16@           //не совем таймер, но нужен для расчета времени (массив - 8 штук).
stopsnd = 26@
playsnd = 27@
last_index = 28@           
index = 29@                  //индекс для всех массивов
zis6 = 30@                   //машина
KeyTime = 31@                //время нажимания клавиши запуска; не используется - может понадобится для расширения режимов...
end
MODEL.Load(1582)                //модель объектов col_model
model.load(#MISSILE)            //модель объектов rocket
REPEAT
WAIT 0
until model.Available(1582)
REPEAT
WAIT 0
until model.Available(#MISSILE)
03CF: load_wav 14401  as 1  //звук LONG_EXPLOSION
repeat
wait 0
until 03D0:   wav 1 loaded 
last_index = -1
if
0AA2: 25@ = load_library "Missile.dll" // IF and SET
then
if
0AA4: playsnd = get_proc_address "PlaySND" library 25@ // IF and SET
then
if
0AA4: stopsnd = get_proc_address "StopSND" library 25@ // IF and SET
then
25@ = 1
end
end
end

//----------------TELO--------------------------------
while true
    wait 10
    if 
        player.Defined($player_char)
    then
        if
            actor.Drivingvehicletype($player_actor,#PACKER)
        then
            if
                0AB1: call_scm_func @KEY_PRESS 1 VK_LBUTTON KeyTime       //нажата ли VK_LBUTTON и как долго
            then
                gosub @launch_single                              //запуск ракеты
            end
        end    
    end
gosub @rocket_control                       //управление всеми ракетами
end  
//-----------------TELO_END =)-------------------------

:launch_single
if
83D2:   not wav 1 ended 
then
return
end
03C0: zis6 = actor $PLAYER_ACTOR car 
0A8E: index = last_index + 1                         //запускаем ракеты по порядку
if
    index >= 8
then
    index = 0
    last_index = -1
end
if                     
    03CA:   object rocket(index,8i) exists                 //если порядок нарушен
then
    for index = 0 to 7                                   //ищем индекс первой свободной ракеты
        if
            83CA:   not object rocket(index,8i) exists 
        then
            break
        end
    end
end
if and
    03CA:  object rocket(index,8i) exists 
    index == 7                                         //если же таковой не нашелся
then
    return                                           //возврат
end
0085: last_index = index
0AB1: call_scm_func @create_rocket 2 zis6 index col_model(index,8i) rocket(index,8i)          //создаем ракету, прикрепленную к машине
097C: attach_wav 1 to_object col_model(index,8i) 
03D1: play_wav 1                                                        //проигрываем звук запуска
0A8E: rocket_timer(index,8i) = 33@ + 300                            //устанавливаем таймеру значение, отличающиеся от потокового таймера на 300
return

:rocket_control
for index = 0 to 7
    if  and
        03CA:  object rocket(index,8i) exists                  //существует ли ракета
        03CA:  object col_model(index,8i) exists 
    then
        if and                                                 //если прикрепленная ракета висит на ней уже 300 милллисекунд
         001d:   33@ >= rocket_timer(index,8i)
         0685:   object col_model(index,8i) attached 
        then
            0682: detach_object col_model(index,8i) 0.0 0.0 0.0 collision_detection 0       //отцепляем (передаем управление другому обработчику)
            gosub @Play_SND                                                         //Воспроизводим звук летящей ракеты
            0A8E: rocket_timer(index,8i) = 33@ + 5000                            //таймер до "искусственного" взрыва ракеты с момента запуска.
           if                                                                    
               80E1:   not player 0 pressed_key 6                                  //эффект отбрасывания машины назад, если не на ручнике
           then
               02E3: $TEMPVAR_FLOAT_1 = car zis6 speed 
               $TEMPVAR_FLOAT_1 += -1.0
               car.SetSpeedInstantly(zis6,$TEMPVAR_FLOAT_1)
           end
        end
        if
            8685:   not object col_model(index,8i) attached                         //обработчик запущенной ракеты
        then
            if
                0AB1: call_scm_func @rocket_trajectory 3 col_model(index,8i) zis6 rocket(index,8i) //управляем траекторией ракеты
            then                                                                        //если ракета взорвана 
                gosub @Stop_SND                                                       //останавливаем звук
            end
            if
                001d:33@ >= rocket_timer(index,8i)                                  //ракета заблудилась - взрываем
            then
                0AB1: call_scm_func @explode 2 col_model(index,8i) rocket(index,8i)     
                gosub @Stop_SND                                                       //останавливаем звук
            end
        end
    end  
end
return

:create_rocket
object.Create(2@,1582,0.0,0.0,0.0) 
098D: get_car 0@ extra_parts_angle 5@                          //регулирует дальность полета
5@ *= 65.0                                                  //коэффициент
6@ = 205.0         
005b: 6@ += 5@                                                //линейное смещение
06BE: 7@ = car 0@ y_angle                                   //наклон машины (влево/вправо)
7@ *= -1.0                                                  //Правильное ориентирование ракеты в момент прикрепления гарантирует правильную траекторию  полета
10@ = 2.2
10@ /= 7.0 
0093: 1@ = integer 1@ to_float 
006b: 10@ *= 1@                                               
12@ = -1.1 
005b:12@ += 10@
0681: attach_object 2@ to_car 0@ with_offset 12@ -3.0 0.8 rotation 6@  7@  0.0
object.Create(3@,#MISSILE,0.0,0.0,0.0) 
069A: attach_object 3@ to_object 2@ with_offset 0.0 0.0 0.0 rotation 180.0 0.0 0.0 
Object.ToggleInMovingList(2@) = True
Object.SetImmunities(2@, 1, 1, 1, 1, 1)
04D9: object 2@ set_scripted_collision_check 1 
0906: set_object 2@ mass_to 100.0 // float            //масса
0908: set_object 2@ turn_mass_to 750.0 // float       //инертность (качественное отличие?)
Object.SetImmunities(3@, 1, 1, 1, 1, 1)
08D2: object 2@ scale_model 0.0001                     
08D2: object 3@ scale_model 2.0 
066D: 4@ = attach_particle "tank_fire" to_object 2@ offset 0.0 0.8 0.0 1  
064C: make_particle 4@ visible
0400: store_coords_to 6@ 7@ 8@ from_object 2@ with_offset 0.0 2.0 0.0                    
073F: get_actor_in_sphere 6@ 7@ 8@ radius 2.0 with_pedtype_civilian 1 gang 1 criminal/prostitute 1 handle_as 9@ 
if
actor.Defined(9@)
then
0326: 10@ = create_actor 9@ fire 
end
0AB2: ret 2 2@ 3@

:rocket_trajectory
0400: store_coords_to 6@ 7@ 8@ from_object 0@ with_offset 0.0 -100.0 0.0                    
0400: store_coords_to 9@ 10@ 11@ from_object 0@ with_offset 0.0 0.0 0.0 
016F: create_particle 3 rotation_factor 0.0 size 12.5 intensity 100 flags 255 255 255 at 9@ 10@ 11@     
04D5: create_corona_at 9@ 10@ 11@ radius 5.0 type 1 flare 2 RGB 255 192 128 
09E5: create_flash_light_at 9@ 10@ 11@ RGB_mask 4095 4095 4095 radius 20.0 
0063: 6@ -= 9@ // (float) 
0063: 7@ -= 10@ // (float) 
0063: 8@ -= 11@ // (float) 
05A1: set_object 0@ rotation_velocity_about_an_axis -0.05 0.0 0.0 through_center_of_body         //поворачиваем объект, чтобы он описывал дугу
Object.Throw(0@, 6@, 7@, 8@)
066D: 12@ = attach_particle "tank_fire" to_object 0@ offset 0.0 0.8 0.0 1  
064C: make_particle 12@ visible
if or
    04E7:   object 0@ in_water 
    04DA:   is_object 0@ collided                                  //если ракета сколидилась
then
    if                                                             // и сколидилась она не с зис6 (в момент запуска))
        0897: car 1@ collided_with_object 0@
    then
      059A: return_false
    else
      0AB1: call_scm_func @explode 2 0@ 2@                         //большой бум
      0485: return_true
    end
end
0AB2:ret 0

:explode
object.StorePos(0@,3@, 4@, 5@)                     
Object.Destroy(0@)                                 
Object.Destroy(1@)                                    
020C: create_explosion_with_radius 6 at 3@ 4@ 5@                     
0AB2:ret 0

:KEY_PRESS
32@ = 0
if
    0ab0: 0@
then
    while 0ab0: 0@
        wait 0
    end
    0485: return_true
else
    059A: return_false
end
0AB2:ret 1 32@    

:Play_SND
if
    25@ == 1
then
    0AA5: call playsnd num_params 0 pop 0
end
return

:Stop_SND
if
    25@ == 1
then
    0AA5: call stopsnd num_params 0 pop 0
end
return

В скрипте используется самый дурацкий способ воспроизведения звуков. В связи с этим имеется куча багов.С мультимедией работать я так и не научился. Чтобы не воспроизводились эти идиотские звуки, достаточно просто удалить файл missile.dll.

Offline

#2 08-05-2009 20:16

Alien
Registered: 12-10-2008
Posts: 564

Re: ZIS-6 BM-13-16 Rocket Launcher (Оживляем "Катюшу")

Не прикрепилось, хоть и в zip-формате... Наверно слишком большой размер. Вот на ifolder'е пусть лежит сколько пролежит...

Offline

#3 08-05-2009 22:52

GTASA
Registered: 13-09-2008
Posts: 476

Re: ZIS-6 BM-13-16 Rocket Launcher (Оживляем "Катюшу")

Пишет, что невозможно загрузить {$I VK.inc} при копиляции. И куда совать файл ZIS-6_Rocket_Launch_BM-13.sami?

Offline

#4 09-05-2009 16:28

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: ZIS-6 BM-13-16 Rocket Launcher (Оживляем "Катюшу")

Скачай готовый вариант с S4G и не парься. Там же можно взять и саму модель.

Offline

#5 09-05-2009 17:26

Alien
Registered: 12-10-2008
Posts: 564

Re: ZIS-6 BM-13-16 Rocket Launcher (Оживляем "Катюшу")

GTASA wrote:

Пишет, что невозможно загрузить {$I VK.inc} при копиляции. И куда совать файл ZIS-6_Rocket_Launch_BM-13.sami?

Нет там никакого sami.
Тупо код скопировать не удастся. Надо инсталлятор скачивать. И на scriptsforgta на данный момент лежит старая версия с багом в коде=)

Offline

Board footer

Powered by FluxBB