Блокбастер «Смерть полицейского»
Предисловие:
Очередной, и на этот раз последний мой скрипт из цикла «блокбастер». Но главное не в этом. Главное то, что я разработал уникальный массив из полицейских машин, который может пригодиться в ряде других скриптов. Благодаря ему копов не просто много, их ОЧЕНЬ МНОГО. Для более эффектного зрелища каждый стреляет из своей машины
Описание:
Миссия во многом похожа на миссию «блокбастер «конвой»», но есть и множество различий. Зажмите «прыжок» и «присесть» для запуска миссии. Как и в «блокбастер «конвой»» вы будете сидеть в машине пассажиром, но на этот раз все отстреливающиеся от ментов актеры компактно расположатся именно на этой машине, которая будет ездить по дорогам. Далее следует небывалый наплыв копов, которые будут приследовать все ту же машину. В самые интересные моменты (надеюсь) будет очень сильное замедление времени, дабы вы смогли рассмотреть все детали перестрелки между копами и актерами на машине. Но это еще не все. Настоящая миссия начнется когда вы нажмете кнопку submission(подмиссия). Тогда вам будет предложено порулить самостоятельно, удирая от полицейской погони. Ваша бронированная машина превратится в машину с ограниченным кол-вом жизней. Вам надо ездить так, чтобы машина не взорвалась и чтобы актеры на машине (они, кстати, бессмертны) взорвали 80 полицейских машин. Замедления времени в этом режиме не будет. Для возврата в режим просмотра нажмите еще раз submission(подмиссия). Для выхода нажмите exit car(выход из машины)
Скриптерам:
Миссия работает благодаря взаимодействию двух отдельных потоков: один обычный, другой внутри миссии. Благодаря этому все проверки и команды выполняются приблизительно в 2 раза быстрее. На сколько я знаю, это новый прием в скриптинге (не видел подобного). А т.к. в миссии полно проверок, задержек и изменений скорости игры, то он практически необходим.
Сюжет:
Да, как ни странно здесь есть сюжет! СиДжей постоянно участвует в погонях, перестрелках и т.п., поэтому все это не могло не отразиться на его психике и снах. Все это ему приснилось!
Установка:
Т.к. не часто появляются скрипты, написанные внутри миссий, то я подумал, что не все догадались как их устанавливать. Поэтому я решил написать инструкцию по установке.
1. Найдите строку DEFINE MISSIONS и увеличте число в этой строке на единицу
2. В конце списка DEFINE MISSION вставьте DEFINE MISSION 135 AT @anticop
Число 135 актуально для оригинального main’a . У вас оно должно быть на 1 больше, чем в последней строке этого списка и на 1 меньше, чем в пункте 1. Запомните его, и везде, где у меня будет использоваться mission 135, замените 135 на это число.
Дальше все как обычно:
:show3
thread 'show3'
:show3_1245
wait 25
if
Player.Defined($PLAYER_CHAR)
jf @show3_1245
if and
00E1: key_pressed_on_pad 0 button 18
00E1: key_pressed_on_pad 0 button 14
jf @show3_1245
if
not Actor.Driving($PLAYER_ACTOR)
jf @show3_1245
if
$ONMISSION == 0 // integer values
jf @show3_1245
if
Player.Controllable($PLAYER_CHAR)
jf @show3_1245
00BA: text_styled 'SWEET_1' 1500 ms 2 // KPNMNHALJHSN PANOH FOPODA
0169: set_fade_color 0 0 0
fade 0 2500
:show3_1371
wait 0
if
not fading
jf @show3_1371
start_mission 135
end_thread
:COPS
thread 'cops'
:TAXIC_23
var
$x : array 20 of float
$y : array 20 of float
$z : array 20 of float
$cos : float
$sin : float
$rnd_x : float
$rnd : float
$max_cop : int = 19
$actcop: array 20 of Actor
$cop : array 20 of Actor
$copcar: array 20 of car
$mark: array 20 of marker
end
gosub @TAXIC_33
jump @TAXIC_45
:TAXIC_33
if Player.Defined($PLAYER_CHAR)
else_jump @escort_2444
if or
01F4: car $car flipped
02BF: car $car sunk
03CE: vehicle $car stuck
00E1: key_pressed 0 18
jf @TAXIC_35
Car.StorePos($car, $x_pos, $y_pos, $z_pos)
02C1: set $x_pos $y_pos $z_pos to_car_path_coords_closest_to $x_pos $y_pos $z_pos
0395: clear_area 1 at $x_pos $y_pos $z_pos range 10.0
Car.PutAt($car, $x_pos, $y_pos, $z_pos)
:TAXIC_35
if or
00E1: key_pressed 0 15
$score < 1
then
jump @escort_2444
end
return
:TAXIC_45
for $i = 1 to $max_cop
:TAXIC_55
repeat
wait 0
gosub @TAXIC_33
$rnd_x = random(5, 150)
$rnd = random(0, 360)
02F6: $cos = cosine $rnd // sinus swapped with cosine
02F7: $sin = sinus $rnd // cosine swapped with sinus
$cos *= $rnd_x // floating-point values
$sin *= $rnd_x // floating-point values
$sin += 30.0
04C4: create_coordinate $X $Y $Z from_actor $PLAYER_ACTOR offset $cos $sin 0.0
04C4: create_coordinate $X1 $Y1 $Z1 from_actor $PLAYER_ACTOR offset 0.0 0.0 0.0
02C1: set $x[$i] $y[$i] $z[$i] to_car_path_coords_closest_to $x $y $z
050A: 0@ = distance_between_points $x[$i] $y[$i] $z[$i] and $X1 $Y1 $Z1
if
0@ > 120.0
then
break
end // if
until 80C2: not sphere_onscreen $x[$i] $y[$i] $z[$i] 5.0
for $k = 1 to $i // step 1
if
$k $i
then
if and
$x[$i] == $x[$k]
$y[$i] == $y[$k]
$z[$i] == $z[$k]
then
jump @TAXIC_55
end // if
end // if
end // for
if
$i > 9
then
$modelcar = #COPCARLA
$modelcop = #LVPD1
$weapon = 24
else
$modelcar = #FBIRANCH
$modelcop = #fbi
$weapon = 29
end // if
$copcar[$i] = Car.Create($modelcar, $x[$i], $y[$i], $z[$i])
0129: $actcop[$i] = create_actor 6 $modelcop in_car $copcar[$i] driverseat
0397: car $copcar[$i] siren = 1
04BA: set_car $copcar[$i] speed_instantly 5.0
$mark[$i] = marker.CreateAboveCar($copcar[$i])
06E1: unknown_action_sequence $actcop[$i] $copcar[$i] $car 2 100.0 2
0A21: (unknown) $copcar[$i] 1
0423: vehicle $copcar[$i] improve_handling 1.5
072F: (unknown) $copcar[$i] 0.5 5000 1 0 1 1
039C: (unknown) $copcar[$i] 1
03AB: set_vehicle $copcar[$i] strong 1
03ED: (unknown) $copcar[$i] 1
03CC: car $copcar[$i] add_to_stuck_car_check 2.0 = 2000
$cop[$i] = Actor.Create($modelcop, 6, $X, $y, $z)
0430: put_actor $cop[$i] into_vehicle $copcar[$i] passenger_seat 0
01B2: give_actor $cop[$i] weapon $weapon ammo 99999
0713: actor $cop[$i] drive_by actor -1 car $car point 0.0 0.0 0.0 5000.0 8 1 60
end
:escort_2430
for $i = 1 to $max_cop
wait 0
if
$copcar[$i] -1
then
if or
Car.Wrecked($copcar[$i])
8202: not actor $PLAYER_ACTOR near_car $copcar[$i] radius 150.0 150.0 unknown 0
then
if and
Car.Wrecked($copcar[$i])
$mode == 1
then
$score += -1
end // if
gosub @escort_2440
gosub @escort_2437
else
gosub @TAXIC_33
end
end
gosub @TAXIC_33
end
jump @escort_2430
:escort_2437
repeat
wait 0
gosub @TAXIC_33
$rnd_x = random(5, 150)
$rnd = random(0, 360)
02F6: $cos = cosine $rnd // sinus swapped with cosine
02F7: $sin = sinus $rnd // cosine swapped with sinus
$cos *= $rnd_x // floating-point values
$sin *= $rnd_x // floating-point values
$sin += 30.0
04C4: create_coordinate $X $Y $Z from_actor $PLAYER_ACTOR offset $cos $sin 0.0
04C4: create_coordinate $X1 $Y1 $Z1 from_actor $PLAYER_ACTOR offset 0.0 0.0 0.0
02C1: set $x[$i] $y[$i] $z[$i] to_car_path_coords_closest_to $x $y $z
050A: 0@ = distance_between_points $x[$i] $y[$i] $z[$i] and $X1 $Y1 $Z1
if
0@ > 120.0
then
break
end // if
until 80C2: not sphere_onscreen $x[$i] $y[$i] $z[$i] 5.0
for $k = 1 to $max_cop // step 1
if
$k $i
then
if and
$x[$i] == $x[$k]
$y[$i] == $y[$k]
then
jump @escort_2437
end // if
end // if
end // for
if
$i > 7
then
$modelcar = #COPCARLA
$modelcop = #LVPD1
$weapon = 24
else
$modelcar = #FBIRANCH
$modelcop = #fbi
$weapon = 29
end // if
$copcar[$i] = Car.Create($modelcar, $x[$i], $y[$i], $z[$i])
0129: $actcop[$i] = create_actor 6 $modelcop in_car $copcar[$i] driverseat
072F: (unknown) $copcar[$i] 1.0 2000 1 1 1 -1
0397: car $copcar[$i] siren = 1
04BA: set_car $copcar[$i] speed_instantly 5.0
$mark[$i] = marker.CreateAboveCar($copcar[$i])
06E1: unknown_action_sequence $actcop[$i] $copcar[$i] $car 2 100.0 2
0A21: (unknown) $copcar[$i] 1
0423: vehicle $copcar[$i] improve_handling 1.5
072F: (unknown) $copcar[$i] 0.5 5000 1 0 1 1
039C: (unknown) $copcar[$i] 1
03AB: set_vehicle $copcar[$i] strong 1
03ED: (unknown) $copcar[$i] 1
$timer += 1
03CC: car $copcar[$i] add_to_stuck_car_check 2.0 = 2000
$cop[$i] = Actor.Create($modelcop, 6, $X, $y, $z)
0430: put_actor $cop[$i] into_vehicle $copcar[$i] passenger_seat 0
01B2: give_actor $cop[$i] weapon $weapon ammo 99999
0713: actor $cop[$i] drive_by actor -1 car $car point 0.0 0.0 0.0 5000.0 8 1 60
return
:anticop_131
wait 0
if and
Model.Available(#CHEETAH)
Model.Available(#MP5LNG)
Model.Available(#SNIPER)
Model.Available(#SAWNOFF)
Model.Available(#FAM2)
jf @anticop_131
0208: 170@ = random_float -2800.0 2800.0
0208: 171@ = random_float -2800.0 2800.0
04E4: unknown_refresh_game_renderer_at 170@ 171@
Actor.PutAt($PLAYER_ACTOR, 170@, 171@, -100.0)
wait 1000
Actor.StorePos($PLAYER_ACTOR, 170@, 171@, 172@)
02C1: set 170@ 171@ 172@ to_car_path_coords_closest_to 170@ 171@ 172@
060A: unknown_create_entity 2 26@
Player.SetMinWantedLevel($PLAYER_CHAR, 5)
$car = Car.Create(#CHEETAH, 170@, 171@, 172@)
Car.SetImmunities($car, 1, 1, 1, 1, 1)
Car.DoorStatus($car) = 4
07EE: car $car enable_tire_marks 0
3@ = Actor.Create(#FAM2, 8, 2504.4709, -1675.764, 12.371)
4@ = Actor.Create(#FAM2, 8, 2504.4709, -1675.764, 12.371)
5@ = Actor.Create(#FAM2, 8, 2504.4709, -1675.764, 12.371)
6@ = Actor.Create(#FAM2, 8, 2504.4709, -1675.764, 12.371)
7@ = Actor.Create(#FAM2, 8, 2504.4709, -1675.764, 12.371)
8@ = Actor.Create(#FAM2, 8, 2504.4709, -1675.764, 12.371)
9@ = Actor.Create(#FAM2, 8, 2504.4709, -1675.764, 12.371)
10@ = Actor.Create(#FAM2, 8, 2504.4709, -1675.764, 12.371)
11@ = Actor.Create(#FAM2, 8, 2504.4709, -1675.764, 12.371)
12@ = Actor.Create(#FAM2, 8, 2504.4709, -1675.764, 12.371)
Actor.SetImmunities(5@, 1, 1, 1, 1, 1)
Actor.SetImmunities(6@, 1, 1, 1, 1, 1)
Actor.SetImmunities(7@, 1, 1, 1, 1, 1)
Actor.SetImmunities(8@, 1, 1, 1, 1, 1)
Actor.SetImmunities(9@, 1, 1, 1, 1, 1)
Actor.SetImmunities(10@, 1, 1, 1, 1, 1)
Actor.SetImmunities(11@, 1, 1, 1, 1, 1)
Actor.SetImmunities(12@, 1, 1, 1, 1, 1)
0129: $vodit = create_actor 8 #FAM2 in_car $car driverseat // Load the ped model before using this
0350: unknown_actor $vodit not_scared_flag 1
0350: unknown_actor 3@ not_scared_flag 1
0350: unknown_actor 4@ not_scared_flag 1
0350: unknown_actor 5@ not_scared_flag 1
0350: unknown_actor 6@ not_scared_flag 1
0350: unknown_actor 7@ not_scared_flag 1
0350: unknown_actor 8@ not_scared_flag 1
0350: unknown_actor 9@ not_scared_flag 1
0350: unknown_actor 10@ not_scared_flag 1
0350: unknown_actor 11@ not_scared_flag 1
0350: unknown_actor 12@ not_scared_flag 1
Actor.SetImmunities($vodit, 1, 1, 1, 1, 1)
Actor.SetImmunities(3@, 1, 1, 1, 1, 1)
Actor.SetImmunities(4@, 1, 1, 1, 1, 1)
01B2: give_actor 3@ weapon 28 ammo 999999 // Load the weapon model before using this
081A: set_actor 3@ weapon_skill 2
01B2: give_actor 4@ weapon 34 ammo 999999 // Load the weapon model before using this
01B2: give_actor 5@ weapon 29 ammo 999999 // Load the weapon model before using this
01B2: give_actor 6@ weapon 30 ammo 999999 // Load the weapon model before using this
01B2: give_actor 7@ weapon 27 ammo 999999 // Load the weapon model before using this
01B2: give_actor 8@ weapon 16 ammo 999999 // Load the weapon model before using this
01B2: give_actor 9@ weapon 36 ammo 999999 // Load the weapon model before using this
01B2: give_actor 10@ weapon 18 ammo 999999 // Load the weapon model before using this
01B2: give_actor 11@ weapon 32 ammo 999999 // Load the weapon model before using this
081A: set_actor 11@ weapon_skill 2
01B2: give_actor 12@ weapon 26 ammo 999999 // Load the weapon model before using this
081A: set_actor 12@ weapon_skill 2
0430: put_actor $PLAYER_ACTOR into_vehicle $car passenger_seat 0
Car.SetDriverBehaviour($car, FollowRoad)
00AE: set_vehicle $car traffic_behavior_to 2
Car.SetMaxSpeed($car, 100.0)
0423: vehicle $car improve_handling 3.0
0631: put_actor 3@ in_group $PLAYER_GROUP
0631: put_actor 4@ in_group $PLAYER_GROUP
0631: put_actor 5@ in_group $PLAYER_GROUP
0631: put_actor 6@ in_group $PLAYER_GROUP
0631: put_actor 7@ in_group $PLAYER_GROUP
0631: put_actor 8@ in_group $PLAYER_GROUP
0631: put_actor 9@ in_group $PLAYER_GROUP
0631: put_actor 10@ in_group $PLAYER_GROUP
0631: put_actor 11@ in_group $PLAYER_GROUP
0631: put_actor 12@ in_group $PLAYER_GROUP
0464: put_actor 5@ into_turret_on_car $car at_car_offset -1.0 -1.9 1.2 position 0 shooting_angle 360.0 with_weapon 29
0464: put_actor 6@ into_turret_on_car $car at_car_offset 1.0 1.9 1.2 position 0 shooting_angle 360.0 with_weapon 30
0464: put_actor 7@ into_turret_on_car $car at_car_offset -1.0 1.9 1.2 position 0 shooting_angle 360.0 with_weapon 27
0464: put_actor 8@ into_turret_on_car $car at_car_offset 1.0 -1.9 1.2 position 0 shooting_angle 360.0 with_weapon 16
0464: put_actor 9@ into_turret_on_car $car at_car_offset -1.0 -1.9 2.9 position 0 shooting_angle 360.0 with_weapon 36
0464: put_actor 10@ into_turret_on_car $car at_car_offset 1.0 -1.9 2.9 position 0 shooting_angle 360.0 with_weapon 18
0464: put_actor 11@ into_turret_on_car $car at_car_offset -1.0 1.9 2.9 position 0 shooting_angle 360.0 with_weapon 32
0464: put_actor 12@ into_turret_on_car $car at_car_offset 1.0 1.9 2.9 position 0 shooting_angle 360.0 with_weapon 26
0464: put_actor 3@ into_turret_on_car $car at_car_offset 1.0 0.0 1.4 position 0 shooting_angle 360.0 with_weapon 28
0464: put_actor 4@ into_turret_on_car $car at_car_offset -1.0 0.0 1.4 position 0 shooting_angle 360.0 with_weapon 34
Actor.WeaponAccuracy(10@) = 100
Actor.WeaponAccuracy(4@) = 100
Actor.WeaponAccuracy(8@) = 100
29@ = 0 // integer values
create_thread @cops
fade 1 1000
var
$mode : int = 0
$score : int = 80
$money : int = -200
end // var
:anticop_1528
if
80E1: not key_pressed 0 15
else_jump @anticop_2225
if
00E1: key_pressed 0 19
then
if
$mode == 0
then
$mode = 1
0362: remove_actor $PLAYER_ACTOR from_car_and_place_at $pas $pass $passs
036A: put_actor $PLAYER_ACTOR in_car $car
015D: set_gamespeed 1.0
Car.SetImmunities($car, 0, 1, 1, 0, 0)
Car.Health($car) = 10000
054C: use_GXT_table 'GRAV'
04F7: status_text $score 0 line 2 'BB_18' // O4KN
else
$mode = 0
0362: remove_actor $PLAYER_ACTOR from_car_and_place_at $pas $pass $passs
036A: put_actor $vodit in_car $car
0430: put_actor $PLAYER_ACTOR into_vehicle $car passenger_seat 0
0151: remove_status_text $health
0151: remove_status_text $score
Car.Health($car) = 10000
Car.SetImmunities($car, 1, 1, 1, 1, 1)
$score = 80
end // if
end // if
:anticop_1538
if
$mode == 1
then
if
$score < 1
then
$money = 30000
jump @anticop_2225
end // if
$health = Car.Health($car)
054C: use_GXT_table 'TRUCK'
04F7: status_text $health 0 line 1 'TRK_DMG'
wait 600
jump @anticop_1528
end
if
02E0: actor 3@ aggressive
jf @anticop_1561
29@ += 1 // integer values
:anticop_1561
if
02E0: actor 4@ aggressive
jf @anticop_1584
29@ += 1 // integer values
:anticop_1584
if
02E0: actor 5@ aggressive
jf @anticop_1607
29@ += 1 // integer values
:anticop_1607
if
02E0: actor 6@ aggressive
jf @anticop_1630
29@ += 1 // integer values
:anticop_1630
if
02E0: actor 7@ aggressive
jf @anticop_1653
29@ += 1 // integer values
:anticop_1653
if
02E0: actor 8@ aggressive
jf @anticop_1676
29@ += 1 // integer values
:anticop_1676
if
02E0: actor 9@ aggressive
jf @anticop_1699
29@ += 1 // integer values
:anticop_1699
if
02E0: actor 10@ aggressive
jf @anticop_1722
29@ += 1 // integer values
:anticop_1722
if
02E0: actor 11@ aggressive
jf @anticop_1745
29@ += 1 // integer values
:anticop_1745
if
02E0: actor 12@ aggressive
jf @anticop_1768
29@ += 1 // integer values
:anticop_1768
if
not 29@ == 0 // integer values
jf @anticop_1955
if
not 29@ == 1 // integer values
jf @anticop_1969
if
not 29@ == 2 // integer values
jf @anticop_1983
if
not 29@ == 3 // integer values
jf @anticop_1997
if
not 29@ == 4 // integer values
jf @anticop_2011
if
not 29@ == 5 // integer values
jf @anticop_2025
if
not 29@ == 6 // integer values
jf @anticop_2039
if
not 29@ == 7 // integer values
jf @anticop_2053
if
not 29@ == 8 // integer values
jf @anticop_2067
if
not 29@ == 9 // integer values
jf @anticop_2081
jump @anticop_2095