sr2lua/bh05.lua

  1. -- bh05.lua 
  2. -- SR2 mission script 
  3. -- 3/28/07 
  4.  
  5. -- Groups -- 
  6. 	GROUP_JESSICAS_CAR =						"bh05_$jessicas_car" 
  7. 	GROUP_BANK =								"bh05_$bank" 
  8. 	GROUP_BANK_COOP =							"bh05_$bank_coop" 
  9. 	GROUP_COURTESY_CAR =						"bh05_$courtesy_car" 
  10.    GROUP_COURTESY_CAR_COOP =           "bh05_$courtesy_car_coop" 
  11. 	GROUP_SWAT =								"bh05_$swat" 
  12. 	GROUP_ARENA =								"bh05_$arena" 
  13. 	GROUP_BANK_OUTSIDE =						"bh05_$bank_outside" 
  14. 	GROUP_ALARM_SWAT =						"bh05_$alarm_swat" 
  15.  
  16. -- Navpoints -- 
  17. 	NAV_LOCAL_START =							"bh05_$n002" 
  18. 	NAV_REMOTE_START =						"bh05_$n003" 
  19. 	NAV_BANK =									"bh05_$n000" 
  20. 	NAV_BANK_INTERIOR =						"bh05_$n001" 
  21. 	NAV_SWAT_DEST =							"bh05_$n004" 
  22. 	NAV_TRUNK =									"bh05_$n007" 
  23. 	NAV_TRUNK_CAM =							"bh05_$n023" 
  24. 	NAV_JESSICA_FLEE =						{ "bh05_$n006", "bh05_$n008", "bh05_$n009" } 
  25.  
  26.    NAV_SWAT_FRONT =							{ { "bh05_$n010", "bh05_$n013" }, 
  27. 													  { "bh05_$n010", "bh05_$n014" }, 
  28. 													  { "bh05_$n010", "bh05_$n011" }, 
  29. 													  { "bh05_$n010", "bh05_$n015" }, 
  30. 													  { "bh05_$n010", "bh05_$n012" }, 
  31. 													  { "bh05_$n010" } } 
  32.  
  33.    SWAT_FRONT_LEASHED =						{ true, false, true, false, true, true} 
  34.  
  35.    SWAT_SIDE_LEASHED =						{true, true, false, true, false, true} 
  36.  
  37.    ALARM_DIRECTION =                   "bh05_$Alarm_Direction" 
  38.    AUSSIE_ALARM_DIRECTION =            "bh05_$Aussie_Alarm_Direction" 
  39.  
  40.    FRONT_APC_WARP_POINTS =             { "bh05_$APC1_S1", "bh05_$APC1_S2" } 
  41.    SIDE_APC_WARP_POINTS =              { "bh05_$APC2_S1", "bh05_$APC2_S2" } 
  42.    APC_WARP_POINTS =                   { FRONT_APC_WARP_POINTS, SIDE_APC_WARP_POINTS } 
  43.  
  44.    FRONT_APC_PATHS =                   { "bh05_$APC1_P1", "bh05_$APC1_P2" } 
  45.    SIDE_APC_PATHS =                    { "bh05_$APC2_P1", "bh05_$APC2_P2" } 
  46.    APC_PATHS =                         { FRONT_APC_PATHS, SIDE_APC_PATHS } 
  47.  
  48.    OUTSIDE_COP_CAR_PATH =              "bh05_$Outside_Cop_Car_Path" 
  49.  
  50. -- Triggers -- 
  51. 	TRIGGER_ARENA =							"bh05_$t000" 
  52. 	TRIGGER_TRUNK =							"bh05_$t001" 
  53. 	TRIGGER_ALARM =							"bh05_$t002" 
  54.  
  55.    TRIGGER_BANK_INTERIOR =             "bh05_$Inside_Bank" 
  56.  
  57. -- Interiors -- 
  58.    BANK_INTERIOR =                     "barrio_$Bank_Interior" 
  59.  
  60. -- Characters -- 
  61. 	CHAR_JESSICA =								"bh05_$c000" 
  62. 	CHAR_BANK_SECURITY =						{"bh05_$c001", "bh05_$c002", "bh05_$c003", "bh05_$c004", "bh05_$c005"} 
  63. 	CHAR_BANK_SECURITY_COOP =				{"bh05_$c015", "bh05_$c016"} 
  64. 	CHAR_BANK_TELLERS =						{"bh05_$c006", "bh05_$c008"} 
  65. 	CHAR_BANK_TELLERS_IDLE =				{"bh05_$c007", "bh05_$c009"} 
  66. 	CHAR_BANK_CUSTOMERS =					{"bh05_$c011", "bh05_$c012"} 
  67. 	CHAR_SWAT =									{"bh05_$c013", "bh05_$c014"} 
  68. 	CHAR_SWAT_FRONT =							{"bh05_$c023", "bh05_$c024", "bh05_$c025", "bh05_$c026", "bh05_$c027", "bh05_$c028"} 
  69. 	CHAR_SWAT_SIDE =							{"bh05_$c029", "bh05_$c030", "bh05_$c031", "bh05_$c032", "bh05_$c033", "bh05_$c034"} 
  70.    CHAR_SWAT_APCS =                    { CHAR_SWAT_FRONT, CHAR_SWAT_SIDE } 
  71.  
  72.    CHAR_OUTSIDE_COP_CAR =              {"bh05_$c017", "bh05_$c018", "bh05_$c022" } 
  73.  
  74. -- Vehicles -- 
  75. 	VEH_JESSICAS_CAR =						"bh05_$v000" 
  76. 	VEH_SWAT =									"bh05_$v002" 
  77.  
  78.    VEH_SWAT_SIDE_APC =                 "bh05_$SWAT_Side_APC" 
  79.    VEH_SWAT_FRONT_APC =                "bh05_$SWAT_Front_APC" 
  80.    VEH_SWAT_APCS =                     { VEH_SWAT_FRONT_APC, VEH_SWAT_SIDE_APC } 
  81.  
  82.    VEH_OUTSIDE_COP_CAR =               "bh05_$v004" 
  83.  
  84. -- Mesh Movers -- 
  85. 	MOVER_BANK_DOOR =							"bh05_$Bank_Door" 
  86.  
  87. -- Threads -- 
  88. 	THREAD_BANK_ALARM =						-1 
  89. 	THREAD_KEEP_HOSTAGE =					-1 
  90. 	THREAD_JESSICA_TRUNK_VOICE =			-1 
  91.  
  92. -- Checkpoints -- 
  93.    CP_REACHED_BANK = "reached_bank_checkpoint" 
  94.  
  95. -- Cutscenes -- 
  96. 	CUTSCENE_IN =						"br05-01" 
  97. 	CUTSCENE_OUT =						"br05-02" 
  98.    CUTSCENE_TRUNK_TOSS =         "IG_bh05_scene1" 
  99.  
  100. -- Voice -- 
  101. 	VOICE_JESSICA_TRUNK =			{"JESSICA_TRUNK_HIT", 
  102. 											 "JESSICA_TRUNK_THROWN", 
  103. 											 "VOC_JESSICA_TRUNK", 
  104.                                   "JESSICA_BR05_INTRUCK_1" } 
  105.  
  106. -- Animations -- 
  107. 	ANIM_TRUNK_TOSS =							"GML1_HS_Trnk_Toss_A.animx" 
  108. 	ANIM_TRUNK_TOSS_RECEIVE =				"GML1_HS_Trnk_Toss_B.animx" 
  109. 	ANIM_ALARM_SHUTOFF =						"GML1_HS_SD_Dial_Jessica.animx" 
  110.    ANIM_ALARM_SHUTOFF_NO_HS =          "GFL1_BS_SD_Dial.animx" 
  111. 	ANIM_BANK_SECURITY =						{"idle", "idle variant 1", "idle variant 2", "idle variant 3", "idle variant 4", "ready whip"} 
  112. 	ANIM_BANK_TELLERS =						{"talk confrontational", "talk submissive", "talk yell", "react oh hell no", "react Surprised", 
  113. 													"react negative A", "react negative B", "react negative C", "react positive A", "react positive B", "react positive C", 
  114. 													"idle", "idle Greet", "idle flirt", "idle variant 1", "idle variant 2", "idle variant 3", "idle variant 4", "idle variant 5", 
  115. 													"idle variant 6", "idle variant 7", "idle variant 8"} 
  116. 	ANIM_BANK_TELLERS_IDLE =				{"idle", "idle Greet", "idle flirt", "idle variant 1", "idle variant 2", "idle variant 3", "idle variant 4", "idle variant 5", 
  117. 													"idle variant 6", "idle variant 7", "idle variant 8"} 
  118. 	ANIM_BANK_CUSTOMERS =					{"talk confrontational", "talk submissive", "talk yell", "react oh hell no", "react Surprised", 
  119. 													"react negative A", "react negative B", "react negative C", "react positive A", "react positive B", "react positive C", 
  120. 													"idle", "idle Greet", "idle flirt", "idle variant 1", "idle variant 2", "idle variant 3", "idle variant 4", "idle variant 5", 
  121. 													"idle variant 6", "idle variant 7", "idle variant 8"} 
  122.  
  123. -- Sound 
  124.    -- Persona overrides 
  125.    JESSICA_PERSONA_OVERRIDES = { { "hostage - barters", "JESSICA_BR05_HOSTAGE" } } 
  126.  
  127.    -- Lines/Dialog Stream 
  128.    JESSICA_GRABBED_LINE = "JESSICA_BR05_GRABBED_1" 
  129.    JESSICA_PRE_ALARM_DISABLED = "JESSICA_BR05_ALARM_OFF_01" 
  130.    SHUT_OFF_ALARM_DIALOG_STREAM = 
  131.    { 
  132.    { "PLAYER_BR05_ALARM_L1", LOCAL_PLAYER, 0 }, 
  133.    { "BR05_ALARM_L2", CHAR_JESSICA, 0 }, 
  134.    { "PLAYER_BR05_ALARM_L3", LOCAL_PLAYER, 0 } 
  135.    } 
  136. 	SHUT_OFF_ALARM_DIALOG_STREAM_REMOTE = 
  137. 	{ 
  138.    { "PLAYER_BR05_ALARM_L1", REMOTE_PLAYER, 0 }, 
  139.    { "BR05_ALARM_L2", CHAR_JESSICA, 0 }, 
  140.    { "PLAYER_BR05_ALARM_L3", REMOTE_PLAYER, 0 } 
  141. 	} 
  142.  
  143.  
  144. -- Text -- 
  145. 	TEXT_GO_TO_THE_BANK =					"bh05_go_to_the_bank" 
  146. 	TEXT_GRAB_JESSICA =						"bh05_grab_jessica" 
  147. 	TEXT_DONT_DAMAGE_CAR =					"bh05_dont_damage_car"  
  148. 	TEXT_HOLD_TRIGGERS =						"bh05_hold_triggers" 
  149. 	TEXT_KEEP_HOSTAGE =						"bh05_keep_hostage" 
  150. 	TEXT_TAKE_JESSICA_TO_VEHICLE =		"bh05_take_jessica_to_vehicle" 
  151. 	TEXT_JESSICA_GETTING_AWAY =			"bh05_jessica_getting_away" 
  152. 	TEXT_GET_NEXT_TO_JESSICA =				"bh05_get_next_to_jessica"  
  153. 	TEXT_PRESS_Y =								"bh05_press_y" 
  154. 	TEXT_TAKE_JESSICA_TO_UNIVERSITY =	"bh05_take_jessica_to_university"  
  155. 	TEXT_DONT_WRECK =							"bh05_dont_wreck" 
  156.    TEXT_DONT_DESTROY_CAR =             "bh05_dont_destroy_car" 
  157. 	TEXT_JESSICA_DIED =						"bh05_jessica_died" 
  158.    TEXT_JESSICA_STICKYBOMBED =         "bh05_jessica_stickybombed" 
  159. 	TEXT_JESSICA_ESCAPED =					"bh05_jessica_escaped" 
  160. 	TEXT_JESSICAS_CAR_DESTROYED =			"bh05_jessicas_car_destroyed" 
  161. 	TEXT_DOORS_SEALED =						"bh05_doors_sealed" 
  162. 	TEXT_DOORS_OPENED =						"bh05_doors_opened" 
  163. 	TEXT_PRESS_Y_ALARM =						"bh05_press_y_to_stop_alarm" 
  164. 	TEXT_GET_BACK_IN_CAR =					"bh05_get_back_in_car" 
  165. 	TEXT_CAR_ABANDONED =						"bh05_car_abandoned" 
  166.  
  167. -- Other -- 
  168.    JESSICA_AFTER_GRABBED_PLAY_LINE_DELAY_SECONDS = 10.0 
  169. 	JESSICAS_CAR_LOW_HP_THRESHOLD_PERCENT =         0.75 
  170.  
  171.    TRUCK_DOOR_OPEN_ACCELERATION_MPSS = 300.0 
  172.  
  173. 	MONSTER_TRUCK_COMMERCIAL = "NEWS_ACT_RACING02" 
  174. 	EXTRA_DAMAGE_AMOUNT =		50 
  175. 	CAR_ABANDON_WARNING_DIST =	5 
  176. 	BANK_INTERIOR_RADIUS =		20 
  177. 	Jessica_in_trunk =			false 
  178. 	Alarm_triggered =				false 
  179. 	Alarm_shut_off =				false 
  180. 	Shutting_off_alarm =			false 
  181. 	Alarm_audio_id =				-1 
  182.  
  183.    Players_in_bank_interior = { [LOCAL_PLAYER] = false, [REMOTE_PLAYER] = false } 
  184.    Players_in_jessicas_car = { [LOCAL_PLAYER] = false, [REMOTE_PLAYER] = false } 
  185.    Jessica_inside_bank = true 
  186.  
  187.    Player_with_jessica_as_follower = "none" 
  188.  
  189.    Controls_disabled = false 
  190.    Player_with_disabled_controls = "none" 
  191.    Num_bank_security_remaining = 0 
  192.    Testing_Aussie_version = false 
  193.  
  194. function bh05_start( checkpoint_name, is_restart ) 
  195. 	-- Start trigger is hit...the activate button was hit 
  196. 	set_mission_author("Aaron Hanson (aka Father Zucosos)") 
  197.  
  198.    action_nodes_restrict_spawning( true ) 
  199.  
  200.    mission_start_fade_out() 
  201.  
  202.    if ( checkpoint_name == MISSION_START_CHECKPOINT ) then 
  203. 		local starter_groups = { GROUP_BANK, GROUP_COURTESY_CAR, GROUP_JESSICAS_CAR } 
  204. 		if ( coop_is_active() ) then 
  205. 			starter_groups = { GROUP_BANK, GROUP_BANK_COOP, GROUP_COURTESY_CAR, GROUP_COURTESY_CAR_COOP, GROUP_JESSICAS_CAR } 
  206. 		end 
  207.  
  208. 		if ( is_restart == false ) then 
  209. 			cutscene_play( CUTSCENE_IN, starter_groups, { NAV_LOCAL_START, NAV_REMOTE_START }, false ) 
  210. 			for index, group_name in pairs( starter_groups ) do 
  211. 				group_show( group_name ) 
  212. 			end 
  213. 			teleport_coop( NAV_LOCAL_START, NAV_REMOTE_START ) 
  214. 		else 
  215. 			for index, group_name in pairs( starter_groups ) do 
  216. 				group_create( group_name, true ) 
  217. 			end 
  218. 			teleport_coop( NAV_LOCAL_START, NAV_REMOTE_START )	 
  219. 		end 
  220.    end 
  221.  
  222.    local resuming_from_checkpoint = false 
  223.    bh05_create_and_setup_jessicas_car() 
  224.    bh05_create_and_setup_bank_interior() 
  225.  
  226.    set_police_never_fire_at_civilian_human_shields() 
  227.    if ( checkpoint_name == CP_REACHED_BANK ) then 
  228.       resuming_from_checkpoint = true 
  229.    end 
  230.     
  231.    mission_start_fade_in() 
  232. 	notoriety_force_no_spawn("police", true) 
  233.  
  234. 	bh05_get_to_the_bank( resuming_from_checkpoint ) 
  235. end 
  236.  
  237. function bh05_entered_bank( triggerer_name, trigger_name ) 
  238.    if ( triggerer_name ~= nil ) then 
  239.       if ( triggerer_name == CHAR_JESSICA ) then 
  240.          Jessica_inside_bank = true 
  241.       elseif ( character_is_player( triggerer_name ) ) then 
  242.          Players_in_bank_interior[triggerer_name] = true 
  243.       end 
  244.    end 
  245. end 
  246.  
  247. function bh05_left_bank( triggerer_name, trigger_name ) 
  248.    if ( triggerer_name ~= nil ) then 
  249.       if ( triggerer_name == CHAR_JESSICA ) then 
  250.          Jessica_inside_bank = false 
  251.       elseif ( character_is_player( triggerer_name ) ) then 
  252.          Players_in_bank_interior[triggerer_name] = false 
  253.       end 
  254.    end 
  255. end 
  256.  
  257. function bh05_create_and_setup_jessicas_car() 
  258. 	if ( group_is_loaded( GROUP_JESSICAS_CAR ) == false ) then 
  259. 		group_create(GROUP_JESSICAS_CAR, true) 
  260. 	end 
  261.    on_take_damage( "bh05_jessicas_car_took_damage", VEH_JESSICAS_CAR ) 
  262. 	on_vehicle_destroyed("bh05_failure_jessicas_car_destroyed", VEH_JESSICAS_CAR) 
  263. 	--vehicle_set_radio_controls_locked(VEH_JESSICAS_CAR, true) 
  264.    vehicle_prevent_explosion_fling( VEH_JESSICAS_CAR, true ) 
  265. 	vehicle_infinite_mass(VEH_JESSICAS_CAR, true) 
  266.    set_unjackable_flag( VEH_JESSICAS_CAR, true ) 
  267.    vehicle_set_untowable( VEH_JESSICAS_CAR ) 
  268. end 
  269.  
  270. function bh05_bank_security_killed( character_name ) 
  271.    marker_remove_npc( character_name, SYNC_ALL ) 
  272.    Num_bank_security_remaining = Num_bank_security_remaining - 1 
  273.  
  274.    -- If all of the interior security guards have been killed, then add Jessica as a follower to 
  275.    -- one of the players 
  276.    if ( Num_bank_security_remaining == 0 ) then 
  277.  
  278.       -- The closest player is the natural choice 
  279.       local distance, closest_player = get_dist_closest_player_to_object( CHAR_JESSICA ) 
  280.  
  281.       if ( Players_in_bank_interior[closest_player] ) then 
  282.          party_add( CHAR_JESSICA, closest_player ) 
  283.          Player_with_jessica_as_follower = closest_player 
  284.       -- If the closest player is not in the bank, the other player gets Jessica 
  285.       else 
  286.          local other_player = LOCAL_PLAYER 
  287.          if ( closest_player == LOCAL_PLAYER ) then 
  288.             other_player = REMOTE_PLAYER 
  289.          end 
  290.  
  291.          party_add( CHAR_JESSICA, other_player ) 
  292.          Player_with_jessica_as_follower = other_player 
  293.       end 
  294.  
  295.       npc_combat_enable( CHAR_JESSICA, false ) 
  296.    end 
  297. end 
  298.  
  299. function bh05_create_and_setup_bank_interior() 
  300.    -- Bank characters and behavior 
  301. 	if ( group_is_loaded( GROUP_BANK ) == false ) then 
  302. 	   group_create(GROUP_BANK, true) 
  303. 	end 
  304.    for i, npc in pairs(CHAR_BANK_SECURITY) do 
  305. 		wander_start(npc, npc, 10) 
  306. 	end 
  307.  
  308.    on_interior_enter( "bh05_entered_bank", BANK_INTERIOR ) 
  309.    on_interior_exit( "bh05_left_bank", BANK_INTERIOR ) 
  310.  
  311.    if ( coop_is_active() ) then 
  312. 		if ( group_is_loaded( GROUP_BANK_COOP ) == false ) then 
  313. 	      group_create(GROUP_BANK_COOP, true) 
  314. 		end 
  315.       for i, npc in pairs(CHAR_BANK_SECURITY_COOP) do 
  316.          wander_start(npc, npc, 10) 
  317.       end 
  318.    end 
  319.  
  320.    -- Bank inside/outside tracking. Doesn't causing anything to happen by itself. 
  321.    trigger_enable( TRIGGER_BANK_INTERIOR, true ) 
  322.    on_trigger( "bh05_entered_bank", TRIGGER_BANK_INTERIOR ) 
  323.    on_trigger_exit( "bh05_left_bank", TRIGGER_BANK_INTERIOR ) 
  324.  
  325.    -- Weapon firing tracking - checks for inside bank, and potentially sets off 
  326.    -- alarm. 
  327.    on_weapon_fired("bh05_weapon_fired", LOCAL_PLAYER) 
  328. 	if ( coop_is_active() ) then 
  329. 		on_weapon_fired("bh05_weapon_fired", REMOTE_PLAYER) 
  330. 	end 
  331. end 
  332.  
  333. function bh05_get_to_the_bank( resuming_from_checkpoint ) 
  334.  
  335.    if ( resuming_from_checkpoint == false ) then 
  336.    	mission_help_table(TEXT_GO_TO_THE_BANK) 
  337.       marker_add_navpoint(NAV_BANK, MINIMAP_ICON_LOCATION, INGAME_EFFECT_VEHICLE_LOCATION, SYNC_ALL) 
  338.       waypoint_add(NAV_BANK, SYNC_ALL)  
  339.  
  340.       delay(6) 
  341.  
  342.       while ((get_dist_char_to_nav(LOCAL_PLAYER, NAV_BANK) > 15) and ((not coop_is_active()) or get_dist_char_to_nav(REMOTE_PLAYER, NAV_BANK) > 15)) do 
  343.          thread_yield() 
  344.       end 
  345.       marker_remove_navpoint(NAV_BANK, SYNC_ALL) 
  346.       waypoint_remove(SYNC_ALL) 
  347.  
  348.       mission_set_checkpoint( CP_REACHED_BANK ) 
  349.    end 
  350.  
  351.    if ( human_shielding_disabled() or Testing_Aussie_version ) then 
  352.       for i, npc in pairs(CHAR_BANK_SECURITY) do 
  353.          marker_add_npc( npc, MINIMAP_ICON_KILL, INGAME_EFFECT_KILL, SYNC_ALL ) 
  354.          on_death( "bh05_bank_security_killed", npc ) 
  355.       end 
  356.       Num_bank_security_remaining = Num_bank_security_remaining + sizeof_table( CHAR_BANK_SECURITY ) 
  357.  
  358.       if ( coop_is_active() ) then 
  359.          group_create(GROUP_BANK_COOP, true) 
  360.          for i, npc in pairs(CHAR_BANK_SECURITY_COOP) do 
  361.             wander_start(npc, npc, 10) 
  362.  
  363.             -- If we're running without human shielding, these guys are required kills. 
  364.             if ( human_shielding_disabled() or Testing_Aussie_version ) then 
  365.                marker_add_npc( npc, MINIMAP_ICON_KILL, INGAME_EFFECT_KILL, SYNC_ALL ) 
  366.                on_death( "bh05_bank_security_killed", npc ) 
  367.             end 
  368.          end 
  369.          Num_bank_security_remaining = Num_bank_security_remaining + sizeof_table( CHAR_BANK_SECURITY_COOP ) 
  370.       end 
  371. 	end 
  372.  
  373. 	on_take_damage("bh05_player_taking_damage", LOCAL_PLAYER) 
  374. 	if ( coop_is_active() ) then 
  375. 		on_take_damage("bh05_player_taking_damage", REMOTE_PLAYER) 
  376. 	end 
  377.    on_take_damage( "bh05_maybe_set_off_bank_alarm", CHAR_JESSICA ) 
  378.  
  379. 	on_death("bh05_failure_jessica_died", CHAR_JESSICA) 
  380.    on_projectile_hit( "bh05_projectile_hit" ) 
  381.  
  382. 	mission_help_table(TEXT_GRAB_JESSICA) 
  383.  
  384.    if ( human_shielding_disabled() or Testing_Aussie_version ) then 
  385.       delay( 5.0 ) 
  386.       mission_help_table("tss01_kill_guards") 
  387.       repeat 
  388.          thread_yield() 
  389.       until ( Player_with_jessica_as_follower ~= "none" ) 
  390.    else 
  391.       -- Let the player know he should grab Jessica, and set her up to be upset when he does 
  392.       marker_add_npc(CHAR_JESSICA, MINIMAP_ICON_PROTECT_ACQUIRE, INGAME_EFFECT_PROTECT_ACQUIRE, SYNC_ALL) 
  393.       for index, override in pairs( JESSICA_PERSONA_OVERRIDES ) do 
  394.          persona_override_character_start( CHAR_JESSICA, override[1], override[2] ) 
  395.       end 
  396.  
  397.       -- Wait until Jessica is grabbed 
  398.       local message_time = 0.0 
  399.       local message_time_remote = 0.0 
  400.       while (not bh05_jessica_in_human_shield()) do 
  401.          thread_yield() 
  402.          message_time = message_time + get_frame_time() 
  403.          message_time_remote = message_time_remote + get_frame_time() 
  404.          if (get_dist_char_to_char(LOCAL_PLAYER, CHAR_JESSICA) <= 4) then 
  405.             if (coop_is_active() and get_dist_char_to_char(REMOTE_PLAYER, CHAR_JESSICA) <= 4) then 
  406.                if message_time >= 6.0 or message_time_remote >= 6.0 then 
  407.                   mission_help_table(TEXT_HOLD_TRIGGERS, "", "", SYNC_ALL) 
  408.                   message_time = 0.0 
  409.                   message_time_remote = 0.0 
  410.                end 
  411.             else 
  412.                if message_time >= 6.0 then 
  413.                   mission_help_table(TEXT_HOLD_TRIGGERS, "", "", SYNC_LOCAL) 
  414.                   message_time = 0.0 
  415.                end 
  416.             end 
  417.          elseif (coop_is_active() and get_dist_char_to_char(REMOTE_PLAYER, CHAR_JESSICA) <= 4) then 
  418.             if message_time_remote >= 6.0 then 
  419.                mission_help_table(TEXT_HOLD_TRIGGERS, "", "", SYNC_REMOTE) 
  420.                message_time_remote = 0.0 
  421.             end 
  422.          end 
  423.       end 
  424.  
  425.       -- Now that she's grabbed, do an update 
  426.       marker_remove_npc(CHAR_JESSICA, SYNC_ALL) 
  427.       audio_play_for_character( JESSICA_GRABBED_LINE, CHAR_JESSICA, "voice", false, true ) 
  428.    end 
  429.    npc_leash_remove( CHAR_JESSICA ) 
  430.  
  431.    thread_new( "bh05_jessica_play_after_grabbed_line" ) 
  432.  
  433.    bh05_maybe_set_off_bank_alarm() 
  434. end 
  435.  
  436.  
  437. function bh05_projectile_hit(type, name, weapon) 
  438. 	if name == CHAR_JESSICA and weapon == "satchel" then 
  439. 	   mission_end_failure( "bh05", TEXT_JESSICA_STICKYBOMBED ) 
  440. 	end 
  441. end 
  442.  
  443. -- Set off the bank alarm if it hasn't already been set off. 
  444. -- 
  445. function bh05_maybe_set_off_bank_alarm() 
  446. 	if (not Alarm_triggered) and (THREAD_BANK_ALARM == -1) then 
  447. 		THREAD_BANK_ALARM = thread_new("bh05_bank_alarm") 
  448. 	end 
  449. end 
  450.  
  451. -- Has Jessica play a custom line a short time after you grab her. 
  452. -- 
  453. function bh05_jessica_play_after_grabbed_line() 
  454.    delay( JESSICA_AFTER_GRABBED_PLAY_LINE_DELAY_SECONDS ) 
  455.  
  456.    if ( Alarm_shut_off == false ) then 
  457.       audio_play_for_character( JESSICA_PRE_ALARM_DISABLED, CHAR_JESSICA, "voice", false, false ) 
  458.    end 
  459. end 
  460.  
  461. function bh05_all_players_inside_bank() 
  462.    if ( Players_in_bank_interior[LOCAL_PLAYER] ) then 
  463.       if ( coop_is_active() ) then 
  464.          if ( Players_in_bank_interior[REMOTE_PLAYER] ) then 
  465.             return true 
  466.          end 
  467.       else 
  468.          return true 
  469.       end 
  470.    end 
  471.  
  472.    return false 
  473. end 
  474.  
  475. function bh05_all_players_outside_bank() 
  476.    if ( Players_in_bank_interior[LOCAL_PLAYER] == false ) then 
  477.       if ( coop_is_active() ) then 
  478.          if ( Players_in_bank_interior[REMOTE_PLAYER] == false ) then 
  479.             return true 
  480.          end 
  481.       else 
  482.          return true 
  483.       end 
  484.    end 
  485.  
  486.    return false 
  487. end 
  488.  
  489. function bh05_either_player_in_car() 
  490.    if ( Players_in_jessicas_car[LOCAL_PLAYER] == true or 
  491.         Players_in_jessicas_car[REMOTE_PLAYER] == true ) then 
  492.       return true 
  493.    end 
  494.  
  495.    return false 
  496. end 
  497.  
  498. function bh05_bank_alarm() 
  499. 	Alarm_triggered = true 
  500.  
  501. 	on_weapon_fired("", LOCAL_PLAYER) 
  502. 	if ( coop_is_active() ) then 
  503. 		on_weapon_fired("", REMOTE_PLAYER) 
  504. 	end 
  505.    on_take_damage( "", CHAR_JESSICA ) 
  506.  
  507. 	door_close(MOVER_BANK_DOOR) 
  508. 	door_lock(MOVER_BANK_DOOR, true) 
  509. 	delay(1) 
  510. 	Alarm_audio_id = audio_play_for_navpoint("SFX_BR5_BANK_ALARM", NAV_BANK_INTERIOR, "Foley") 
  511. 	notoriety_set_min("Police", 2) 
  512. 	notoriety_set("Police", 2) 
  513.  
  514.    -- If the players are outside and Jessica's inside, or vice versa, the mission is over 
  515.    if ( ( Jessica_inside_bank == true and bh05_all_players_outside_bank() ) or 
  516.         ( Jessica_inside_bank == false and bh05_all_players_inside_bank() ) ) then 
  517.       mission_debug( "failed because of different locations when alarm was triggered" ) 
  518.       mission_end_failure( "bh05", TEXT_JESSICA_ESCAPED ) 
  519.       return 
  520.    end 
  521.  
  522.    if ( human_shielding_disabled() or Testing_Aussie_version ) then 
  523.       repeat 
  524.          thread_yield() 
  525.       until ( Player_with_jessica_as_follower ~= "none" ) 
  526.    else 
  527.       while (not bh05_jessica_in_human_shield()) do 
  528.          thread_yield() 
  529.       end 
  530.    end 
  531.  
  532.    local alarm_shutoff_function = "bh05_alarm_shutoff" 
  533.  
  534.    if ( human_shielding_disabled() or Testing_Aussie_version ) then 
  535.       alarm_shutoff_function = "bh05_alarm_shutoff_without_human_shielding" 
  536.    end 
  537.  
  538.    on_trigger( alarm_shutoff_function, TRIGGER_ALARM ) 
  539. 	marker_add_navpoint( TRIGGER_ALARM,  MINIMAP_ICON_LOCATION, INGAME_EFFECT_LOCATION, SYNC_ALL ) 
  540. 	trigger_enable( TRIGGER_ALARM, true ) 
  541.  
  542.    if ( human_shielding_disabled() == false and ( Testing_Aussie_version == false ) ) then 
  543.       if THREAD_KEEP_HOSTAGE == -1 then 
  544.          THREAD_KEEP_HOSTAGE = thread_new("bh05_keep_jessica_close") 
  545.          mission_help_table(TEXT_KEEP_HOSTAGE) 
  546.          delay(6) 
  547.       end 
  548.    end 
  549. 	 
  550. 	mission_help_table(TEXT_DOORS_SEALED) 
  551.  
  552. 	while not Alarm_shut_off do 
  553. 		thread_yield() 
  554. 	end 
  555.  
  556. 	bh05_take_jessica_to_car() 
  557. end 
  558.  
  559. function bh05_enable_groups_combat( group_members, enable ) 
  560. 	for index, name in pairs( group_members ) do 
  561. 		npc_combat_enable( name, enable ) 
  562. 		set_attack_enemies_flag( name, enable ) 
  563. 		if ( enable == false ) then 
  564. 			npc_go_idle( name ) 
  565. 		end 
  566. 	end 
  567. end 
  568.  
  569. function bh05_enable_security_attacks( enable ) 
  570.    if ( enable == nil ) then 
  571.       enable = true 
  572.    end 
  573.  
  574. 	bh05_enable_groups_combat( CHAR_BANK_SECURITY, enable ) 
  575.    if ( coop_is_active() ) then 
  576. 		bh05_enable_groups_combat( CHAR_BANK_SECURITY_COOP, enable ) 
  577.    end 
  578. 	bh05_enable_groups_combat( CHAR_BANK_TELLERS, enable ) 
  579. 	bh05_enable_groups_combat( CHAR_BANK_TELLERS_IDLE, enable ) 
  580. 	bh05_enable_groups_combat( CHAR_BANK_CUSTOMERS, enable ) 
  581. end 
  582.  
  583. function bh05_alarm_shutoff_without_human_shielding( triggerer_name, trigger_name ) 
  584.    marker_remove_navpoint( trigger_name, SYNC_ALL ) 
  585.    trigger_enable( trigger_name, false ) 
  586.  
  587.    follower_make_independent( CHAR_JESSICA, true ) 
  588.    turn_invulnerable( CHAR_JESSICA ) 
  589.    character_prevent_flinching( CHAR_JESSICA, true ) 
  590.    character_prevent_explosion_fling( CHAR_JESSICA, true ) 
  591.    character_prevent_kneecapping( CHAR_JESSICA, true ) 
  592.    character_allow_ragdoll( CHAR_JESSICA, false ) 
  593. 	set_ignore_ai_flag( CHAR_JESSICA, true ) 
  594.  
  595.    move_to( CHAR_JESSICA, AUSSIE_ALARM_DIRECTION, 2, false, true ) 
  596.    turn_to( CHAR_JESSICA, AUSSIE_ALARM_DIRECTION, true ) 
  597.    delay( 1.0 ) 
  598.    action_play_custom(CHAR_JESSICA, ANIM_ALARM_SHUTOFF_NO_HS) 
  599. 	audio_play_for_navpoint("SFX_BR5_BANK_ALARM_OFF", TRIGGER_ALARM, "Foley") 
  600.  
  601.    follower_make_independent( CHAR_JESSICA, false ) 
  602.    turn_vulnerable( CHAR_JESSICA ) 
  603.    character_prevent_flinching( CHAR_JESSICA, false ) 
  604.    character_prevent_explosion_fling( CHAR_JESSICA, false ) 
  605.    character_prevent_kneecapping( CHAR_JESSICA, false ) 
  606.    character_allow_ragdoll( CHAR_JESSICA, true ) 
  607. 	set_ignore_ai_flag( CHAR_JESSICA, false ) 
  608.    Alarm_shut_off = true 
  609. end 
  610.  
  611. function bh05_alarm_shutoff(triggerer, trigger_name) 
  612. 	if (character_has_specific_human_shield(triggerer, CHAR_JESSICA)) then 
  613. 		Shutting_off_alarm = true 
  614. 		on_trigger("", TRIGGER_ALARM) 
  615. 		marker_remove_navpoint(TRIGGER_ALARM, SYNC_ALL) 
  616. 		trigger_enable(TRIGGER_ALARM, false) 
  617.  
  618.       -- Only disable security attacks if we're in single player. In coop, it would look wrong. 
  619.       if ( coop_is_active() == false ) then 
  620.          bh05_enable_security_attacks( false ) 
  621.       end 
  622.  
  623.       player_controls_disable( triggerer ) 
  624.       Player_with_disabled_controls = triggerer 
  625.       Controls_disabled = true 
  626. 		turn_invulnerable( triggerer ) 
  627. 		character_prevent_flinching( triggerer, true ) 
  628. 		character_prevent_explosion_fling( triggerer, true ) 
  629. 		character_prevent_kneecapping( triggerer, true ) 
  630. 		character_allow_ragdoll( triggerer, false ) 
  631. 	 
  632. 		if ( triggerer == LOCAL_PLAYER ) then 
  633. 	      audio_play_conversation( SHUT_OFF_ALARM_DIALOG_STREAM ) 
  634. 		else 
  635. 	      audio_play_conversation( SHUT_OFF_ALARM_DIALOG_STREAM_REMOTE ) 
  636. 		end 
  637. 		turn_invulnerable( CHAR_JESSICA ) 
  638. 		character_prevent_flinching( CHAR_JESSICA, true ) 
  639. 		character_prevent_explosion_fling( CHAR_JESSICA, true ) 
  640. 		character_prevent_kneecapping( CHAR_JESSICA, true ) 
  641. 		character_allow_ragdoll( CHAR_JESSICA, false ) 
  642. 		set_ignore_ai_flag( CHAR_JESSICA, true ) 
  643. 		character_release_human_shield( triggerer ) 
  644.  
  645. 		move_to( CHAR_JESSICA, AUSSIE_ALARM_DIRECTION, 1, false, true ) 
  646. 		turn_to( CHAR_JESSICA, "bh05_$AD", true ) 
  647. 		delay( 1.0 ) 
  648. 		action_play_custom(CHAR_JESSICA, ANIM_ALARM_SHUTOFF_NO_HS) 
  649. 		audio_play_for_navpoint("SFX_BR5_BANK_ALARM_OFF", TRIGGER_ALARM, "Foley") 
  650.  
  651. 		--character_take_human_shield( triggerer, CHAR_JESSICA ) 
  652.  
  653. 		turn_vulnerable( CHAR_JESSICA ) 
  654. 		character_prevent_flinching( CHAR_JESSICA, false ) 
  655. 		character_prevent_explosion_fling( CHAR_JESSICA, false ) 
  656. 		character_prevent_kneecapping( CHAR_JESSICA, false ) 
  657. 		character_allow_ragdoll( CHAR_JESSICA, true ) 
  658. 		set_ignore_ai_flag( CHAR_JESSICA, false ) 
  659.  
  660. 		turn_vulnerable( triggerer ) 
  661. 		character_prevent_flinching( triggerer, false ) 
  662. 		character_prevent_explosion_fling( triggerer, false ) 
  663. 		character_prevent_kneecapping( triggerer, false ) 
  664. 		character_allow_ragdoll( triggerer, true ) 
  665.  
  666.       player_controls_enable( triggerer ) 
  667.       Controls_disabled = false 
  668. 		Alarm_shut_off = true 
  669. 		audio_stop(Alarm_audio_id) 
  670.  
  671. 		mission_help_table_nag( TEXT_HOLD_TRIGGERS ) 
  672. 		delay(5) 
  673. 		Shutting_off_alarm = false 
  674. 		--[[ 
  675.       character_suppress_human_shield_idles( triggerer ) 
  676.       move_to( triggerer, ALARM_DIRECTION, 1, false, false )	 
  677. 	   turn_to( triggerer, ALARM_DIRECTION, true ) 
  678.       delay( 1 ) 
  679. 		on_trigger("", TRIGGER_ALARM) 
  680. 		marker_remove_navpoint(TRIGGER_ALARM, SYNC_ALL) 
  681. 		trigger_enable(TRIGGER_ALARM, false) 
  682. 		if ( triggerer == LOCAL_PLAYER ) then 
  683. 	      audio_play_conversation( SHUT_OFF_ALARM_DIALOG_STREAM ) 
  684. 		else 
  685. 	      audio_play_conversation( SHUT_OFF_ALARM_DIALOG_STREAM_REMOTE ) 
  686. 		end 
  687.       delay(1) 
  688. 		action_play_custom(CHAR_JESSICA, ANIM_ALARM_SHUTOFF) 
  689. 		audio_stop(Alarm_audio_id) 
  690. 		audio_play_for_navpoint("SFX_BR5_BANK_ALARM_OFF", TRIGGER_ALARM, "Foley") 
  691. 		delay(1) 
  692. 		door_lock(MOVER_BANK_DOOR, false) 
  693.       character_suppress_human_shield_idles( triggerer, false ) 
  694. 		]] 
  695.  
  696.       mission_help_table(TEXT_DOORS_OPENED) 
  697. 	end 
  698. end 
  699.  
  700. function bh05_swat_path(npc, navs, speed, retry, fire, leashed) 
  701.    vehicle_exit( npc ) 
  702. 	npc_unholster_best_weapon(npc) 
  703. 	move_to(npc, navs, speed, retry, fire) 
  704. 	if (leashed) then 
  705. 		npc_leash_to_nav(npc, navs[1], 1) 
  706. 	end 
  707. end 
  708.  
  709. function bh05_player_taking_damage(player) 
  710. 	character_damage(player, EXTRA_DAMAGE_AMOUNT) 
  711. end 
  712.  
  713. function bh05_do_bank_outside_attack() 
  714. 	group_create(GROUP_BANK_OUTSIDE, true) 
  715.  
  716.    vehicle_enter_group_teleport( CHAR_OUTSIDE_COP_CAR, VEH_OUTSIDE_COP_CAR ) 
  717.    vehicle_pathfind_to( VEH_OUTSIDE_COP_CAR, OUTSIDE_COP_CAR_PATH, true, true ) 
  718. end 
  719.  
  720. function bh05_do_alarm_swat_attack() 
  721.    group_create_hidden( GROUP_ALARM_SWAT, true ) 
  722.  
  723.    -- Create the APCs and the character and get everyone seated 
  724.    vehicle_enter_group_teleport( CHAR_SWAT_FRONT, VEH_SWAT_FRONT_APC ) 
  725.    vehicle_enter_group_teleport( CHAR_SWAT_SIDE, VEH_SWAT_SIDE_APC ) 
  726.  
  727.    -- Find out if a player is outside. 
  728.    local which_player_outside_bank = "none" 
  729.    if ( Players_in_bank_interior[LOCAL_PLAYER] == false ) then 
  730.       which_player_outside_bank = LOCAL_PLAYER 
  731.    elseif ( coop_is_active() and Players_in_bank_interior[REMOTE_PLAYER] == false ) then 
  732.       which_player_outside_bank = REMOTE_PLAYER 
  733.    end 
  734.  
  735.    local spawn_location_indices = { 1, 1 } 
  736.    if ( which_player_outside_bank ~= "none" ) then 
  737.       -- If so, then find the best spawn side based on his position and view 
  738.       for index, nav_name in pairs( FRONT_APC_WARP_POINTS ) do 
  739.          if ( navpoint_in_player_fov( nav_name, which_player_outside_bank ) == false ) then 
  740.             spawn_location_indices[1] = index 
  741.             break 
  742.          end 
  743.       end 
  744.  
  745.       for index, nav_name in pairs( SIDE_APC_WARP_POINTS ) do 
  746.          if ( navpoint_in_player_fov( nav_name, which_player_outside_bank ) == false ) then 
  747.             spawn_location_indices[2] = index 
  748.             break 
  749.          end 
  750.       end 
  751.    end 
  752.  
  753.    -- Teleport the loaded SWAT APCs to the appropriate teleport locations 
  754.    teleport_vehicle( VEH_SWAT_FRONT_APC, FRONT_APC_WARP_POINTS[spawn_location_indices[1]] ) 
  755.    teleport_vehicle( VEH_SWAT_SIDE_APC, SIDE_APC_WARP_POINTS[spawn_location_indices[2]] ) 
  756.  
  757.    -- Show everything now that it's in place 
  758.    group_show( GROUP_ALARM_SWAT ) 
  759.  
  760.    door_open( MOVER_BANK_DOOR ) 
  761.  
  762.    thread_new( "bh05_apc_path_and_attack", 1, spawn_location_indices[1] ) 
  763.    thread_new( "bh05_apc_path_and_attack", 2, spawn_location_indices[2] ) 
  764. end 
  765.  
  766. function bh05_apc_path_and_attack( group_index, spawn_location_index ) 
  767.    -- Have the loaded SWAT APCs path on their paths 
  768.    vehicle_pathfind_to( VEH_SWAT_APCS[group_index], APC_PATHS[group_index][spawn_location_index], true, true ) 
  769.  
  770.    -- Unload the SWAT APCs and have the members attack 
  771.    for index, member_name in pairs( CHAR_SWAT_APCS[group_index] ) do 
  772. 		set_attack_player_flag(member_name, true) 
  773. 		thread_new("bh05_swat_path", member_name, NAV_SWAT_FRONT[index], 2, true, true, SWAT_FRONT_LEASHED[index]) 
  774.       delay( 0.25 ) 
  775.    end 
  776. end 
  777.  
  778. function bh05_release_characters( character_list ) 
  779. 	for index, name in pairs( character_list ) do 
  780. 		release_to_world( name ) 
  781. 	end 
  782. end 
  783.  
  784. function bh05_take_jessica_to_car() 
  785. 	-- Only need to re-enable security attacks if we already disabled them 
  786. 	if ( coop_is_active() == false ) then 
  787. 		bh05_enable_security_attacks( true ) 
  788. 	end 
  789.  
  790. 	bh05_release_characters( CHAR_BANK_SECURITY ) 
  791. 	if ( coop_is_active() ) then 
  792. 		bh05_release_characters( CHAR_BANK_SECURITY_COOP ) 
  793. 	end 
  794. 	bh05_release_characters( CHAR_BANK_TELLERS ) 
  795. 	bh05_release_characters( CHAR_BANK_TELLERS_IDLE ) 
  796. 	bh05_release_characters( CHAR_BANK_CUSTOMERS ) 
  797.  
  798. 	thread_new( "bh05_do_bank_outside_attack" ) 
  799. 	thread_new( "bh05_do_alarm_swat_attack" ) 
  800.  
  801. 	marker_add_navpoint(TRIGGER_TRUNK, MINIMAP_ICON_LOCATION, INGAME_EFFECT_LOCATION, SYNC_ALL) 
  802. 	trigger_enable(TRIGGER_TRUNK, true) 
  803. 	on_trigger( "bh05_trunk_toss_sequence", TRIGGER_TRUNK) 
  804. 	delay(8) 
  805.  
  806. 	thread_new("bh05_take_jessica_to_car_message_loop") 
  807. 	thread_new("bh05_send_swat") 
  808. 	while (not Jessica_in_trunk) do 
  809. 		thread_yield() 
  810.  
  811.       if ( human_shielding_disabled() or Testing_Aussie_version ) then 
  812.          if ((get_dist_char_to_nav(Player_with_jessica_as_follower, TRIGGER_TRUNK) <= 2) ) then 
  813.             trigger_enable(TRIGGER_TRUNK, true) 
  814.          else 
  815.             trigger_enable(TRIGGER_TRUNK, false) 
  816.          end 
  817.       else 
  818.          if ((get_dist_char_to_nav(CHAR_JESSICA, TRIGGER_TRUNK) <= 2) and (bh05_jessica_in_human_shield())) then 
  819.             trigger_enable(TRIGGER_TRUNK, true) 
  820.          else 
  821.             trigger_enable(TRIGGER_TRUNK, false) 
  822.          end 
  823.       end 
  824. 	end 
  825.  
  826.    action_nodes_restrict_spawning( false ) 
  827.  
  828. 	notoriety_set_min("Police", 3) 
  829. 	notoriety_set("Police", 3) 
  830.  
  831. 	bh05_get_to_the_arena() 
  832. end 
  833.  
  834. function bh05_take_jessica_to_car_message_loop() 
  835. 	delay(15) 
  836. 	while (not Jessica_in_trunk) do 
  837. 		mission_help_table(TEXT_TAKE_JESSICA_TO_VEHICLE) 
  838. 		delay(30) 
  839. 	end 
  840. end 
  841.  
  842. function bh05_trunk_toss_sequence(triggerer) 
  843. 	if ( human_shielding_disabled() or Testing_Aussie_version ) then 
  844. 		if ( triggerer ~= Player_with_jessica_as_follower ) then 
  845. 			return 
  846. 		end 
  847. 	else 
  848. 		if (not character_has_specific_human_shield(triggerer, CHAR_JESSICA)) then 
  849. 			return 
  850. 		end 
  851. 	end 
  852.  
  853.    marker_remove_navpoint( TRIGGER_TRUNK, SYNC_ALL ) 
  854.    trigger_enable( TRIGGER_TRUNK, false ) 
  855.  
  856. 	if ( human_shielding_disabled() == false and Testing_Aussie_version == false ) then 
  857. 		if THREAD_KEEP_HOSTAGE ~= -1 then 
  858. 			thread_kill(THREAD_KEEP_HOSTAGE) 
  859. 		   THREAD_KEEP_HOSTAGE = -1 
  860. 		end 
  861. 	end 
  862.    fade_out( 0 ) 
  863. 	 
  864. 	if ( human_shielding_disabled() or Testing_Aussie_version ) then 
  865. 		-- Maybe disable the player controls here, if necessary? 
  866. 	else 
  867. 		group_hide( GROUP_JESSICAS_CAR ) 
  868. 		group_destroy( GROUP_JESSICAS_CAR ) 
  869. 		cutscene_play( CUTSCENE_TRUNK_TOSS, "", "", false ) 
  870. 		group_hide("bh05_$Trunk_Toss_Cutscene") 
  871. 		group_destroy("bh05_$Trunk_Toss_Cutscene") 
  872. 		bh05_create_and_setup_jessicas_car() 
  873. 	end 
  874.  
  875. 	if ( human_shielding_disabled() == false and Testing_Aussie_version == false ) then 
  876. 	   character_release_human_shield( triggerer, true ) 
  877. 	end 
  878. 	character_hide(CHAR_JESSICA) 
  879. 	object_destroy(CHAR_JESSICA) 
  880. 	audio_play_for_navpoint("SFX_BR5_TRUNK_SLAM", NAV_TRUNK, "Foley") 
  881.    vehicle_prevent_explosion_fling( VEH_JESSICAS_CAR, false ) 
  882. 	vehicle_infinite_mass(VEH_JESSICAS_CAR, false) 
  883.    set_unjackable_flag( VEH_JESSICAS_CAR, false ) 
  884. 	teleport( triggerer, "bh05_$Away_From_Car" ) 
  885. 	thread_yield() 
  886.    vehicle_enter_teleport( triggerer, VEH_JESSICAS_CAR, 0 ) 
  887.    vehicle_door_prevent_damage_detach( VEH_JESSICAS_CAR, "trunk", true ) 
  888.  
  889. 	delay( 1.5 ) 
  890.     
  891.    fade_in( 1.0 ) 
  892.  
  893. 	Jessica_in_trunk = true 
  894. end 
  895.  
  896. function bh05_get_to_the_arena() 
  897. 	notoriety_force_no_spawn("police", false) 
  898. 	on_take_damage("", LOCAL_PLAYER) 
  899. 	if ( coop_is_active() ) then 
  900. 		on_take_damage("", REMOTE_PLAYER) 
  901. 	end 
  902.  
  903. 	THREAD_JESSICA_TRUNK_VOICE = thread_new("bh05_jessica_trunk_voice") 
  904.  
  905. 	mission_help_table(TEXT_TAKE_JESSICA_TO_UNIVERSITY) 
  906.    marker_add_vehicle( VEH_JESSICAS_CAR, MINIMAP_ICON_PROTECT_ACQUIRE, INGAME_EFFECT_VEHICLE_PROTECT_ACQUIRE, SYNC_ALL ) 
  907. 	waypoint_add( VEH_JESSICAS_CAR, SYNC_ALL ) 
  908.  
  909. 	set_unjackable_flag(VEH_JESSICAS_CAR, false) 
  910. 	while ( ( not character_is_in_vehicle(LOCAL_PLAYER, VEH_JESSICAS_CAR)) and 
  911.            ( coop_is_active() == false or ( not character_is_in_vehicle( REMOTE_PLAYER, VEH_JESSICAS_CAR ) ) ) ) do 
  912. 		thread_yield() 
  913. 	end 
  914.    Players_in_jessicas_car[LOCAL_PLAYER] = true 
  915.    if ( coop_is_active() ) then 
  916.       Players_in_jessicas_car[REMOTE_PLAYER] = true 
  917.    end 
  918.    on_vehicle_enter( "bh05_entered_jessicas_car", VEH_JESSICAS_CAR ) 
  919.    on_vehicle_exit( "bh05_left_jessicas_car", VEH_JESSICAS_CAR ) 
  920.  
  921.    on_take_damage( "", VEH_JESSICAS_CAR ) 
  922.    on_damage( "bh05_jessicas_car_damaged_during_drive", VEH_JESSICAS_CAR, JESSICAS_CAR_LOW_HP_THRESHOLD_PERCENT ) 
  923.  
  924.    waypoint_remove( SYNC_ALL ) 
  925.    marker_remove_vehicle( VEH_JESSICAS_CAR, SYNC_ALL ) 
  926.    marker_add_navpoint(TRIGGER_ARENA, MINIMAP_ICON_LOCATION, INGAME_EFFECT_VEHICLE_LOCATION, SYNC_ALL) 
  927. 	waypoint_add(TRIGGER_ARENA, SYNC_ALL) 
  928.  
  929. 	group_create(GROUP_ARENA, true) 
  930.  
  931. 	--radio_on() 
  932. 	--delay(2) 
  933. 	--radio_post_event(MONSTER_TRUCK_COMMERCIAL, true) 
  934.  
  935. 	while (get_dist_vehicle_to_nav(VEH_JESSICAS_CAR, TRIGGER_ARENA) > 10) do 
  936. 		thread_yield() 
  937. 	end 
  938.  
  939. 	if THREAD_JESSICA_TRUNK_VOICE ~= -1 then 
  940. 		thread_kill(THREAD_JESSICA_TRUNK_VOICE) 
  941. 	end 
  942.  
  943. 	bh05_success_arena_reached() 
  944.  
  945. end 
  946.  
  947. function bh05_jessicas_car_damaged_during_drive() 
  948.    mission_help_table( TEXT_DONT_WRECK ) 
  949. end 
  950.  
  951. function bh05_jessicas_car_took_damage( vehicle_name, attacker_name, percent_damage ) 
  952.    if ( Jessica_in_trunk == false ) then 
  953.       if ( attacker_name ~= nil ) then 
  954.          if ( attacker_name == LOCAL_PLAYER or attacker_name == REMOTE_PLAYER ) then 
  955.             mission_help_table_nag( TEXT_DONT_DESTROY_CAR ) 
  956.             on_take_damage( "", VEH_JESSICAS_CAR ) 
  957.             delay( 5.0 ) 
  958.             on_take_damage( "bh05_jessicas_car_took_damage", VEH_JESSICAS_CAR ) 
  959.          end 
  960.       end 
  961.    else 
  962.       on_take_damage( "", VEH_JESSICAS_CAR ) 
  963.    end 
  964. end 
  965. function bh05_jessica_trunk_voice() 
  966. 	while 1 do 
  967. 		thread_yield() 
  968. 		if ( character_is_in_vehicle( LOCAL_PLAYER, VEH_JESSICAS_CAR ) ) then 
  969. 			delay( rand_int( 2, 8 ) ) 
  970. 			local choice = rand_int( 1, sizeof_table( VOICE_JESSICA_TRUNK ) ) 
  971. 			audio_play( VOICE_JESSICA_TRUNK[choice] ) 
  972. 		end 
  973. 	end 
  974. end 
  975.  
  976. function bh05_entered_jessicas_car( name ) 
  977.    mission_debug( name.." entered car." ) 
  978.    if ( character_is_player( name ) ) then 
  979.  
  980.       -- If no players were in the car before this player got in, be sure to add a marker for the goal 
  981.       if ( bh05_either_player_in_car() == false ) then 
  982. 			marker_add_navpoint(TRIGGER_ARENA, MINIMAP_ICON_LOCATION, INGAME_EFFECT_VEHICLE_LOCATION, SYNC_ALL ) 
  983. 			waypoint_add(TRIGGER_ARENA, SYNC_ALL ) 
  984.  
  985.          -- Remove the car marker and cancel the failure timer 
  986.          marker_remove_vehicle( VEH_JESSICAS_CAR, SYNC_ALL ) 
  987. 			hud_timer_stop(0) 
  988.       end 
  989.  
  990.       -- Now mark this player as in the car 
  991.       Players_in_jessicas_car[name] = true 
  992.    end 
  993. end 
  994.  
  995. function bh05_left_jessicas_car( name ) 
  996.    mission_debug( name.." left car." ) 
  997.  
  998.    if ( character_is_player( name ) ) then 
  999.       -- Mark this player as having left 
  1000.       Players_in_jessicas_car[name] = false 
  1001.  
  1002.       -- If no one's left in the car, then add a marker for it and remove the goal marker 
  1003.       if ( bh05_either_player_in_car() == false ) then 
  1004.          -- Remove the goal marker - the more immediate goal is the vehicle 
  1005.          marker_remove_navpoint( TRIGGER_ARENA, SYNC_ALL ) 
  1006.  
  1007.          -- Let the players know to get back in the vehicle 
  1008. 			mission_help_table_nag( TEXT_GET_BACK_IN_CAR, SYNC_ALL ) 
  1009. 			marker_add_vehicle( VEH_JESSICAS_CAR, MINIMAP_ICON_PROTECT_ACQUIRE, INGAME_EFFECT_VEHICLE_PROTECT_ACQUIRE, SYNC_ALL ) 
  1010. 			waypoint_add( VEH_JESSICAS_CAR, SYNC_ALL ) 
  1011.          -- Set a failure timer 
  1012. 			hud_timer_set( 0, 30000, "bh05_failure_abandoned_car", true, SYNC_ALL ) 
  1013.       end 
  1014.    end 
  1015. end 
  1016.  
  1017. function bh05_bank_life_anim(npc, anim) 
  1018. 	local num_actions = sizeof_table(anim) 
  1019. 	while (not Alarm_triggered) do 
  1020. 		thread_yield() 
  1021. 		action_play(npc, anim[rand_int(1, num_actions)], "", true, true) 
  1022. 		delay(rand_int(4,7)) 
  1023. 	end 
  1024. end 
  1025.  
  1026. function bh05_send_swat() 
  1027. 	group_create(GROUP_SWAT, true) 
  1028. 	vehicle_enter_group_teleport(CHAR_SWAT, VEH_SWAT) 
  1029. 	vehicle_pathfind_to(VEH_SWAT, NAV_SWAT_DEST, true, true) 
  1030. 	for i, npc in pairs(CHAR_SWAT) do	 
  1031. 		thread_new("vehicle_exit", npc) 
  1032. 		if ( coop_is_active() ) then 
  1033. 			local rnd = rand_int(0,1) 
  1034. 			if rnd == 0 then 
  1035. 				attack(npc, LOCAL_PLAYER) 
  1036. 			else 
  1037. 				attack(npc, REMOTE_PLAYER) 
  1038. 			end 
  1039. 		else 
  1040. 			attack(npc, LOCAL_PLAYER) 
  1041. 		end 
  1042. 	end 
  1043. end 
  1044.  
  1045. function bh05_keep_jessica_close() 
  1046. 	marker_remove_npc(CHAR_JESSICA, SYNC_ALL) 
  1047.  
  1048. 	while (not character_is_dead(CHAR_JESSICA)) do 
  1049. 		thread_yield() 
  1050. 		if (not bh05_jessica_in_human_shield()) and (not character_is_dead(CHAR_JESSICA) and (not Shutting_off_alarm)) then 
  1051. 			mission_help_table(TEXT_JESSICA_GETTING_AWAY) 
  1052. 			if Alarm_shut_off then 
  1053. 				marker_remove_navpoint(TRIGGER_TRUNK, SYNC_ALL) 
  1054. 				trigger_enable(TRIGGER_TRUNK, false) 
  1055. 			else 
  1056. 				marker_remove_navpoint(TRIGGER_ALARM, SYNC_ALL) 
  1057. 				trigger_enable(TRIGGER_ALARM, false) 
  1058. 			end 
  1059. 			marker_add_npc(CHAR_JESSICA, MINIMAP_ICON_PROTECT_ACQUIRE, INGAME_EFFECT_PROTECT_ACQUIRE, SYNC_ALL) 
  1060. 			thread_yield() 
  1061. 			hud_timer_set(1, 30000, "bh05_failure_jessica_escaped", true) 
  1062. 			local Escaping_time = 0 
  1063. 			local Message_displayed = false 
  1064. 			while (not bh05_jessica_in_human_shield()) and (not character_is_dead(CHAR_JESSICA)) do 
  1065. 				thread_yield() 
  1066. 				Escaping_time = Escaping_time + get_frame_time() 
  1067. 				if (not Message_displayed) and (Escaping_time > 10) then 
  1068. 					mission_help_table(TEXT_JESSICA_GETTING_AWAY) 
  1069. 					Message_displayed = true 
  1070. 				end 
  1071. 			end 
  1072. 			thread_yield() 
  1073. 			hud_timer_stop(1) 
  1074. 			marker_remove_npc(CHAR_JESSICA, SYNC_ALL) 
  1075. 			if Alarm_shut_off then 
  1076. 				marker_add_navpoint(TRIGGER_TRUNK, MINIMAP_ICON_LOCATION, INGAME_EFFECT_LOCATION, SYNC_ALL) 
  1077. 				trigger_enable(TRIGGER_TRUNK, true) 
  1078. 			else 
  1079. 				marker_add_navpoint(TRIGGER_ALARM, MINIMAP_ICON_LOCATION, INGAME_EFFECT_LOCATION, SYNC_ALL) 
  1080. 				trigger_enable(TRIGGER_ALARM, true) 
  1081. 			end 
  1082. 		end 
  1083. 	end 
  1084. end 
  1085.  
  1086. function bh05_weapon_fired( player ) 
  1087. 	if ( ( not Alarm_triggered ) and Players_in_bank_interior[player] ) then 
  1088. 		on_weapon_fired("", LOCAL_PLAYER) 
  1089. 		if ( coop_is_active() ) then 
  1090. 			on_weapon_fired("", REMOTE_PLAYER) 
  1091. 		end 
  1092.       bh05_maybe_set_off_bank_alarm() 
  1093. 	end 
  1094. end 
  1095.  
  1096. function bh05_jessicas_car_watch() 
  1097. 	while 1 do 
  1098. 		thread_yield() 
  1099. 		local sync = nil 
  1100. 		if character_is_in_vehicle(LOCAL_PLAYER, VEH_JESSICAS_CAR) then 
  1101. 			if ( coop_is_active() ) and character_is_in_vehicle(REMOTE_PLAYER, VEH_JESSICAS_CAR) then 
  1102. 				sync = SYNC_ALL 
  1103. 			else 
  1104. 				sync = SYNC_LOCAL 
  1105. 			end 
  1106. 		elseif ( coop_is_active() ) and character_is_in_vehicle(REMOTE_PLAYER, VEH_JESSICAS_CAR) then 
  1107. 			sync = SYNC_REMOTE 
  1108. 		end 
  1109. 		 
  1110. 		if sync ~= nil then 
  1111. 			mission_help_table(TEXT_DONT_DAMAGE_CAR, sync) 
  1112. 			delay(5) 
  1113. 		end 
  1114. 	end 
  1115. end 
  1116.  
  1117. function bh05_jessica_in_human_shield() 
  1118. 	return ((character_has_specific_human_shield(LOCAL_PLAYER, CHAR_JESSICA)) or  
  1119. 			 (coop_is_active() and character_has_specific_human_shield(REMOTE_PLAYER, CHAR_JESSICA))) 
  1120. end 
  1121.  
  1122. function bh05_failure_jessica_died() 
  1123. 	mission_end_failure("bh05", TEXT_JESSICA_DIED) 
  1124. end 
  1125.  
  1126. function bh05_failure_abandoned_car() 
  1127. 	mission_end_failure("bh05", TEXT_CAR_ABANDONED) 
  1128. end 
  1129.  
  1130. function bh05_failure_jessicas_car_destroyed() 
  1131. 	mission_end_failure("bh05", TEXT_JESSICAS_CAR_DESTROYED) 
  1132. end 
  1133.  
  1134. function bh05_failure_jessica_escaped() 
  1135. 	mission_end_failure("bh05", TEXT_JESSICA_ESCAPED) 
  1136. end 
  1137.  
  1138. function bh05_success_arena_reached() 
  1139. 	-- Stop the players' vehicles when they reach the trigger 
  1140. 	if ( character_is_in_vehicle( LOCAL_PLAYER ) ) then 
  1141. 		player_controls_disable( LOCAL_PLAYER ) 
  1142. 		vehicle_stop_do( LOCAL_PLAYER ) 
  1143. 	end 
  1144. 	if ( coop_is_active() ) then 
  1145. 		if ( character_is_in_vehicle( REMOTE_PLAYER ) ) then 
  1146. 			player_controls_disable( REMOTE_PLAYER ) 
  1147. 			vehicle_stop_do( REMOTE_PLAYER ) 
  1148. 		end 
  1149. 	end 
  1150. 	marker_remove_navpoint(TRIGGER_ARENA, SYNC_ALL) 
  1151. 	waypoint_remove(SYNC_ALL) 
  1152. 	on_vehicle_enter( "", VEH_JESSICAS_CAR ) 
  1153. 	on_vehicle_exit( "", VEH_JESSICAS_CAR ) 
  1154. 	mission_end_success("bh05", CUTSCENE_OUT, { NAV_LOCAL_START, NAV_REMOTE_START } ) 
  1155. end 
  1156.  
  1157. function bh05_cleanup() 
  1158. 	-- Cleanup mission here 
  1159.  
  1160.    door_lock(MOVER_BANK_DOOR, false) 
  1161.  
  1162. 	camera_end_look_through(true) 
  1163.  
  1164.    if ( Controls_disabled ) then 
  1165.    	player_controls_enable( Player_with_disabled_controls ) 
  1166. 		turn_vulnerable( Player_with_disabled_controls ) 
  1167. 		character_prevent_flinching( Player_with_disabled_controls, false ) 
  1168. 		character_prevent_explosion_fling( Player_with_disabled_controls, false ) 
  1169. 		character_prevent_kneecapping( Player_with_disabled_controls, false ) 
  1170. 		character_allow_ragdoll( Player_with_disabled_controls, true ) 
  1171.    end 
  1172.  
  1173.    on_take_damage("", LOCAL_PLAYER) 
  1174. 	if ( coop_is_active() ) then 
  1175. 		on_take_damage("", REMOTE_PLAYER) 
  1176. 	end 
  1177.  
  1178. 	hud_timer_stop(0) 
  1179. 	hud_timer_stop(1) 
  1180. 	marker_remove_navpoint(NAV_BANK, SYNC_ALL) 
  1181. 	marker_remove_npc(CHAR_JESSICA, SYNC_ALL) 
  1182. 	marker_remove_vehicle(VEH_JESSICAS_CAR, SYNC_ALL) 
  1183. 	marker_remove_navpoint(TRIGGER_ARENA, SYNC_ALL) 
  1184. 	on_trigger("", TRIGGER_ARENA) 
  1185. 	trigger_enable(TRIGGER_ARENA, false) 
  1186. 	marker_remove_navpoint(TRIGGER_ALARM, SYNC_ALL) 
  1187. 	on_trigger("", TRIGGER_ALARM) 
  1188. 	trigger_enable(TRIGGER_ALARM, false) 
  1189. 	marker_remove_navpoint(TRIGGER_TRUNK, SYNC_ALL) 
  1190. 	on_trigger("", TRIGGER_TRUNK) 
  1191. 	trigger_enable(TRIGGER_TRUNK, false) 
  1192. 	waypoint_remove(SYNC_ALL) 
  1193. 	on_weapon_fired("", LOCAL_PLAYER) 
  1194. 	if ( coop_is_active() ) then 
  1195. 		on_weapon_fired("", REMOTE_PLAYER) 
  1196. 	end 
  1197.  
  1198.  
  1199. 	if THREAD_BANK_ALARM ~= -1 then 
  1200. 		thread_kill(THREAD_BANK_ALARM) 
  1201. 	end 
  1202.  
  1203. 	if THREAD_KEEP_HOSTAGE ~= -1 then 
  1204. 		thread_kill(THREAD_KEEP_HOSTAGE) 
  1205. 	end 
  1206.  
  1207. 	if THREAD_JESSICA_TRUNK_VOICE ~= -1 then 
  1208. 		thread_kill(THREAD_JESSICA_TRUNK_VOICE) 
  1209. 	end 
  1210.  
  1211. 	group_destroy(GROUP_JESSICAS_CAR) 
  1212. 	--release_to_world(GROUP_BANK) 
  1213. 	--if ( coop_is_active() ) then 
  1214. 	--	release_to_world(GROUP_BANK_COOP) 
  1215. 	--end 
  1216.  
  1217.    set_police_never_fire_at_civilian_human_shields( false ) 
  1218.    action_nodes_restrict_spawning( false ) 
  1219.    on_projectile_hit( "" ) 
  1220.     
  1221.    vehicle_prevent_explosion_fling( VEH_JESSICAS_CAR, false ) 
  1222. 	vehicle_infinite_mass(VEH_JESSICAS_CAR, false) 
  1223.    set_unjackable_flag( VEH_JESSICAS_CAR, false ) 
  1224.    on_interior_enter( "", BANK_INTERIOR ) 
  1225.    on_interior_exit( "", BANK_INTERIOR ) 
  1226.    mission_cleanup_maybe_reenable_player_controls() 
  1227.  
  1228.    if ( vehicle_exists( VEH_JESSICAS_CAR ) ) then 
  1229.       vehicle_door_prevent_damage_detach( VEH_JESSICAS_CAR, "trunk", false ) 
  1230.    end 
  1231. end 
  1232.  
  1233. function bh05_success() 
  1234. 	-- Called when the mission has ended with success 
  1235. end 
  1236.