Files
2025-09-29 00:52:08 +02:00

17765 lines
583 KiB
Python
Executable File

//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
//Uber car chase data
// total should not exceed 225
CONST_INT TOTAL_NUMBER_OF_TRAFFIC_CARS 1
CONST_INT TOTAL_NUMBER_OF_PARKED_CARS 1
CONST_INT TOTAL_NUMBER_OF_SET_PIECE_CARS 4
// total should not exceed 12
CONST_INT MAX_NUMBER_OF_TRAFFIC_CARS_PLAYING_BACK 1
CONST_INT MAX_NUMBER_OF_SET_PIECE_CARS_PLAYING_BACK 4
// this should be fine
CONST_INT MAX_NUMBER_OF_PARKED_CARS_PLAYING_BACK 1
//const_int max_attached_objects 30
//const_int maximum_real_setpiece_vehicles 4
const_int total_number_of_wave_0_enemies 9
const_int total_number_of_wave_0_inside_enemies 4
const_int total_number_of_wave_0_vehicles 3
const_int total_number_of_wave_2_enemies 20
const_int total_number_of_wave_2_vehicles 8
// @SBA - to track rushing enemies
CONST_INT kiNumberOfWaveRushersAllowed 2
const_int total_number_of_wave_3_enemies 4
const_int total_number_of_wave_3_vehicles 1
const_int total_number_of_ambient_enemies 4
const_int total_number_of_ambient_enemy_vehicles 2
const_int total_number_of_the_parked_cars 4
CONST_INT MAX_SKIP_MENU_LENGTH 6 // number of stages in mission
USING "rage_builtins.sch"
USING "globals.sch"
using "script_heist.sch"
USING "flow_public_core_override.sch"
using "commands_misc.sch"
using "commands_pad.sch"
using "commands_script.sch"
using "commands_player.sch"
using "commands_streaming.sch"
using "commands_vehicle.sch"
using "commands_camera.sch"
using "commands_path.sch"
using "commands_fire.sch"
using "commands_graphics.sch"
using "commands_object.sch"
using "commands_misc.sch"
using "commands_recording.sch"
using "script_player.sch"
using "script_debug.sch"
using "streamed_scripts.sch"
using "model_enums.sch"
using "cellphone_public.sch"
using "selector_public.sch"
using "dialogue_public.sch"
using "player_ped_public.sch"
using "chase_hint_cam.sch"
using "locates_public.sch"
using "script_blips.sch"
using "traffic.sch"
using "select_mission_stage.sch"
using "replay_public.sch"
using "commands_cutscene.sch"
using "mission_stat_public.sch"
using "cutscene_public.sch"
USING "CompletionPercentage_public.sch"
using "building_control_public.sch"
using "clearmissionarea.sch"
using "emergency_call.sch"
USING "taxi_functions.sch"
USING "script_misc.sch"
#IF IS_DEBUG_BUILD
USING "rerecord_recording.sch"
#ENDIF
struct ped_structure
ped_index ped
model_names model
blip_index blip
vector pos
vector run_to_pos
float heading
int health
int accuracy
bool damaged_by_player
bool allow_body_armour
bool created
BOOL bRushInside // @SBA - flag for tracking when an enemy has been tasked inside
BOOL been_killed
weapon_type weapon
text_label name
endstruct
struct vehicle_struct
vehicle_index veh
model_names model
blip_index blip
vector pos
float heading
float speed
float skip_time
int health
float engine_health
float petrol_tank_health
int colour
int recording_number
bool been_destroyed
endstruct
struct object_struct
object_index obj
blip_index blip
model_names model
vector pos
vector offset_pos
vector offset_pos_2
vector rot
vector offset_rot
float heading
float scale
float health
string room_name
int time
bool been_created
endstruct
struct quaternion
float x
float y
float z
float w
endstruct
struct decal
DECAL_ID the_decal_id
DECAL_RENDERSETTING_ID decal_texture_id
vector pos
vector direction
vector side
float width
float height
float fAlpha
float life
float wash_amount
blip_index blip
bool decal_removed
endstruct
struct cover_point_struct
vector pos
vector cover_from_pos
float heading
coverpoint_index cover_point
endstruct
enum main_mission_flow
intro_mocap = 0,
get_to_meth_lab,
wave_0_system,
// wave_1_system, @SBA - NO LONGER ACTIVE
wave_2_system,
wave_3_system,
mission_passed_mocap,
vehicle_recording,
load_stage_selector_assets,
mission_fail_stage
endenum
enum main_mission_shootout
initial_attack_phase = 0,
get_into_pos,
run_to_other_side_of_building,
get_to_other_side_of_building,
run_to_front_of_building,
get_to_front_of_building,
run_into_shop,
get_into_shop,
charge_back_stairs, // @SBA - added this one to handle survivors
combat_player,
run_away,
attack_from_pos_2,
grenade_launcher_explosion,
do_nothing
endenum
main_mission_flow mission_flow = intro_mocap
main_mission_shootout wave_0_status[total_number_of_wave_0_enemies]
main_mission_shootout wave_2_status[total_number_of_wave_2_enemies]
main_mission_shootout wave_3_status[total_number_of_wave_3_enemies]
main_mission_shootout ambient_enemy_status[total_number_of_ambient_enemies]
ped_structure buddy
ped_structure translator
ped_structure cheng
ped_structure wave_0_enemy[total_number_of_wave_0_enemies]
ped_structure wave_2_enemy[total_number_of_wave_2_enemies]
ped_structure wave_3_enemy[total_number_of_wave_3_enemies]
ped_structure wave_0_inside_enemy[total_number_of_wave_0_inside_enemies]
ped_structure ambient_enemy[total_number_of_ambient_enemies]
// enemies
MODEL_NAMES GoonModel1 = G_M_Y_MexGoon_02
MODEL_NAMES GoonModel2 = G_M_Y_Azteca_01
vehicle_struct trevors_truck
vehicle_struct wave_0_enemy_vehicle[total_number_of_wave_0_vehicles]
vehicle_struct wave_2_enemy_vehicle[total_number_of_wave_2_vehicles]
vehicle_struct wave_3_enemy_vehicle[total_number_of_wave_3_vehicles]
vehicle_struct ambient_enemy_vehicle[total_number_of_ambient_enemy_vehicles]
object_struct explosive_barrels[4]
object_struct bins[3]
object_struct c4[3]
object_struct cover_box
cover_point_struct buddy_cover_point_data[6]
//decal blood[2]
// @SBA - stole this from Bob (RJM). This is a structure that's designed to give a name to angled areas.
// I find it difficult to look at an angled-area check, and know where that is, and what its purpose is.
// With this, you can create a "Trigger Box" variable with a name, and you can easily tell by the name, the purpose of it.
STRUCT TRIGGER_BOX
VECTOR vMin
VECTOR vMax
FLOAT flWidth
ENDSTRUCT
bool stop_mission_fail_checks = false
bool wave_0_complete = false
bool wave_2_complete = false
bool wave_3_complete = false
bool allow_buddy_ai_system = true
bool ram_cutscene_finished = false
bool allow_ambient_enemy_blips_to_flash = false
bool display_blips_as_friendly = false
bool no_vehicle_recording_skip = false
bool fence_shot = false
bool grenade_launcher_cutscene_playing = false
bool stop_player_proofing = false
bool use_main_cover_point = true
bool refresh_the_task = false
bool grenade_launcher_first_person_cam_active = false
int i
int original_time
int waypoint_node_pos = 0
int total_number_of_points = 0
int remaining_enemies = 0
int player_waypoint_status = 22
int dialogue_time
int dialogue_time_2
int buddy_waypoint_target_node = 0
int buddy_time
int player_grenade_launcher_cutscene_status = 0
int cutscene_index
int uber_vehicle_status = 0
int cutscene_trigger_time
int wave_0_inside_enemy_status[total_number_of_wave_0_inside_enemies]
int get_to_meth_lab_status = 0
int intro_mocap_status = 0
int vehicle_recording_system_status = 0
int get_to_meth_lab_dialogue_system_status = 0
int mission_passed_mocap_status = 0
int i_triggered_text_hashes[50]
int flash_blip_time = 0
int proofing_time = 0
int attack_time = 0
int get_to_meth_lab_audio_scene_system_status = 0
int wave_0_audio_scene_system_status = 0
int wave_2_audio_scene_system_status = 0
int wave_3_audio_scene_system_status = 0
#IF IS_DEBUG_BUILD
int get_to_meth_lab_skip_status = 0
int wave_0_system_skip_status = 0
int wave_3_system_skip_status
int p_skip_time
#endif
//*****not present in initialise_mission_variables()
int launch_mission_stage_menu_status = 0
//wave 0
INT iWave0SetupStage = 0
int wave_0_master_flow_system_status = 0
int wave_0_dialogue_system_status = 0
int wave_0_buddy_ai_system_status = 0
int ramming_gates_cutscene_status = 0
int wave_0_assisted_nodes_system_status = 0
//wave 1 - REMOVED @SBA
//wave2
int wave_2_master_flow_system_status = 0
int wave_2_dialogue_system_status = 0
int wave_2_buddy_ai_system_status = 0
int wave_2_assisted_nodes_system_status = 0
//wave3
int wave_3_master_flow_system_status = 0
int wave_3_dialogue_system_status = 0
int wave_3_buddy_ai_system_status = 0
int wave_3_assisted_nodes_system_status = 0
vector player_position
vector target_waypoint_pos
vector cutscene_pos
vector cutscene_rot
string buddy_waypoint_string
string mission_failed_text
vehicle_index parked_cars[total_number_of_the_parked_cars]
vehicle_index wave_1_uber_vehicle
vehicle_index ambient_car[5]
object_index players_weapon_obj
camera_index camera_a
camera_index camera_b
//camera_index camera_c
//camera_index camera_d
sequence_index seq
interior_instance_index meth_interior
coverpoint_index cpWaterHeaterCover // @SBA - added for wave 0 rushers
coverpoint_index buddy_cover_point[2]
coverpoint_index players_cover_point
coverpoint_index players_cover_point_2
coverpoint_index wave_3_0_cover_point
coverpoint_index wave_3_1_cover_point
coverpoint_index cover_point_back_roof_AC
blip_index outside_meth_lab_blip
blip_index meth_lab_blip
blip_index ice_box_blip
int remaining_enemy_status[2]
ped_index remaining_enemy[2]
//ped_index blood_ped
structPedsForConversation scripted_speech[2]
LOCATES_HEADER_DATA locates_data
#IF IS_DEBUG_BUILD
widget_group_id chinese_1_widget_group
MissionStageMenuTextStruct menu_stage_selector[MAX_SKIP_MENU_LENGTH]
int menu_return_stage = 0
#endif
// *** @SBA - additional variables***
// to remember if player received the grenade launcher during the mission
CONST_INT PLAYER_RECEIVED_GRENADE_LAUNCHER 0 //Array positino for replay globals
// to remember which vehicles the player destroyed
CONST_INT PLAYER_DESTROYED_VEHICLES 1 //Array positino for replay globals
CONST_INT NOT_GOT_GLAUNCHER 0
CONST_INT HAS_GOT_GLAUNCHER 1
CONST_INT WAVE0_BOTH_CARS_DEAD -1
CONST_INT WAVE0_ONLY_CAR0_ALIVE 0
CONST_INT WAVE0_ONLY_CAR1_ALIVE 1
CONST_INT WAVE0_BOTH_CARS_ALIVE 2
// The ammount of ammo in the grenade launcher
CONST_INT kiGrenadeLauncherAmmo 5 // @SBA - changed to 5 pere Leslie's feedback. OLD = 3
BOOL bPlayerInVehicle
// bar
PED_INDEX piBarLady
PED_INDEX piJosef
PED_INDEX piOldMan1A
PED_INDEX piOldMan2
PED_INDEX piDrunk
BOOL bBarPatronsCreated
BOOL bIsBarCleanedUp
SCENARIO_BLOCKING_INDEX sbiBarBlockingArea
// For timing the conversation
INT iGetToMethLabDialogTimer
// For counting hits to the Blue SUV (init'd as needed)
INT iSuvDamageCount = 0
// timer for wave rushes
INT iWave_Rush_Time = 0
// Duration of wait before rush
INT iWaitTimeBeforeRush = 0
// Rush counter
INT iWaveRushersSoFar = 0
// IDs for navmesh blocking objects
INT iNavBlockingUpstairsDoor
INT iNavBlockingUpstairsDoorway
INT iNavBlockingBackYardTrailer
// Timer to delay the order for the next rusher to rush
structtimer tmrNextRusherDelay
BOOL bClearCarGen = FALSE
// Checking player's vehicle for suitability
BOOL bTrevorsVehicleIsOkay = FALSE
// gating a load
BOOL bLoadedLastShootoutStuff = FALSE
// For gating a check to to break the window
BOOL bPlayerInOpeningCover = FALSE
// Gating the start of the initial wave
BOOL bStartedInitialWave = FALSE
BOOL bInitialWavePropsMade = FALSE
BOOL bSetTaxiDropoff = FALSE
// chef run back stairs
BOOL bChefRunsToBackStairs = FALSE
structtimer tmrChefRunsDelay
// gate for door
BOOL bBackStairsDoorClosed = FALSE
// Has player used special ability
BOOL bPlayerUsedAbility = FALSE
// sound played yet?
BOOL bPlayGunFire = FALSE
// Meth lab arrival cutscene resolve volume
TRIGGER_BOX tbArrivalCutResolveVol
// Volume outside of front doors
TRIGGER_BOX tbFrontDoorVolume
// Volume for upstairs in meth lab for wave 0 fight
TRIGGER_BOX tbUpstairsRushVolume
// In the room where Trevor takes cover
TRIGGER_BOX tbUpstairsCloserRushVolume
// Volume for alley to the back stairs (outside)
TRIGGER_BOX tbBackStairsAlleyVolume
// Volume on the back stairs, starting several steps up (outside)
TRIGGER_BOX tbOnBackStairsVolume
// Volume for top of the back stairs (outside)
TRIGGER_BOX tbTopBackStairsVolume
// Volume that covers all the back stairs and the landing (outside)
TRIGGER_BOX tbFullBackStairsVolume
// Volume for area outside gates, by gas station
TRIGGER_BOX tbOutsideMainGatesVolume
// Volumes for the back yard, back roof, and just beyond the back gate(wave 2)
TRIGGER_BOX tbBackYardVolume
TRIGGER_BOX tbBackRoofVolume
TRIGGER_BOX tbBackFullRoofVolume // abandonment volume
TRIGGER_BOX tbBackUpstairsRoomVolume
TRIGGER_BOX tbBackGateVolume
// Volume inside the liquor store (wave 3)
TRIGGER_BOX tbLiquorStoreVolume
// Volumes for final cutscene trigger
TRIGGER_BOX tbIceBoxInnerVol
TRIGGER_BOX tbIceBoxOuterVol
TRIGGER_BOX tbIceBoxCameraVol
// Arrival Lead-in variables
ENUM ARRIVAL_LEAD_IN_STATE
ALI_HALT_VEHICLE,
ALI_CAM_INTERP,
ALI_FINISH_DRIVE,
ALI_EXIT_VEHICLE,
ALI_VEHICLE_STOP,
ALI_FINISH_INTERP,
ALI_WAIT_FOR_TIMER
ENDENUM
ARRIVAL_LEAD_IN_STATE ArivialLeadInState = ALI_HALT_VEHICLE
VECTOR vArrivalMethLab = <<1406.26929, 3598.70752, 34.9>> // <<1403.1777, 3597.2070, 34.5>>
structTimer tmrArrival
VECTOR vVehicleLeadinLocR = <<1425.60095, 3604.64648, 33.89210>>
VECTOR vVehicleLeadinLocL = <<1382.39490, 3580.00366, 34.01978>>
VECTOR vTrevorsVehicleMethLabLoc = <<1409.9990, 3600.4973, 33.8676>>
FLOAT fTrevorsVehicleMethLabHead = 108.7487
// Vector for Trevor's start pos in window (cover)
VECTOR vTrevorWindowStartPos = <<1389.7571, 3599.7686, 37.9419>>
// Vector for Trevor's pos on the back deck (cover)
VECTOR vTrevorBackDeckStartPos = <<1409.21973, 3612.25244, 38.005>> //<<1409.44043, 3611.84180, 38.00555>>
// Vector for Trevor's pos in the liquor store (cover)
VECTOR vTrevorLiquorStartPos = <<1391.1561, 3607.2720, 33.9809>>
// Back door to roof
VECTOR vBackDoorToRoof = <<1399.7, 3607.8, 39.1>>
// Door to back stairs
VECTOR vDoorToBackStairs = <<1388.5, 3614.8, 39.1>>
// Door between liquor store and interior stairs
VECTOR vInteriorDoorStore = <<1395.61, 3609.33, 35.13>>
// Cover point used by teh chef in 2nd part of wave 0
VECTOR vChefCoverPointBackStairs = <<1384.0, 3615.31, 37.93>>
VECTOR vChefCoverPointBackStairs2 = <<1383.3361, 3617.2415, 37.9259>>
// chef wave 3
VECTOR vChefCoverPointLiquorStore = <<1393.85, 3608.19, 33.98>>
// Timer used to determine when an abandoned chef message should play
structtimer tmrAbandonChef
// Timer used to determine when an LOS check should happen (if not in LOS when Chef should die, kill him)
structtimer tmrCheckChefForLOS
//For timing the outbursts uttered by the Chef when in danger
structtimer tmrChefOutburstTimer
// Outburst time frequency
FLOAT fOutburstTime
// For timing when the Chef should die when abandoned
structtimer tmrChefDeathTimer
// Time from when being in danger to when the Chef dies
CONST_FLOAT kfChefDeathTime 8.000
// Timer used for a reminder if player takes too long getting Cheng out of ice box
structtimer tmrIceBoxReminder
// Timer used for the blend-in to the final cutscene
structtimer tmrIceBoxBlendin
// Timer for Chef's move from the roof to the shop
structtimer tmrStartChefMove
// Timer for Chef's move from the roof to the shop
structtimer tmrWave3ChefFailsafe
// For enemy dialogue after player uses grenade launcher
INT iEnemyGrenLaunchDialogue = 0
structTIMER tmrGrenLaunchTimer
CONST_FLOAT kfGrenLaunchWaitTime 1.500
PED_INDEX piEnemyToSpeak
// Gren launcher pickup
PICKUP_INDEX puiGrenadeLauncher
// Flag for whether to skip the grn launcher cutscene (if played already got the launcher)
BOOL bSkipGrenLaunchCutscene = FALSE
// Flag for setting pickup ammo
BOOL bPickupAmmoSet = FALSE
// blend-in to final cutscene
INT CHENG_CUTSCENE_INDEX
INT TRANSLATOR_CUTSCENE_INDEX
MODEL_NAMES mnIceBox = P_ICE_BOX_01_S //prop_ice_box_01
MODEL_NAMES mnIceBoxProxy = P_Ice_Box_Proxy_col
OBJECT_INDEX oiIceBox
OBJECT_INDEX oiIceBoxProxy
VECTOR vIceBoxPos = <<1388.6, 3599.4, 34.8>>
VECTOR vIceBoxRot = <<0, 0, 290.0>>
// @SBA - new dialogue
// Enemies have gotten inside
STRING sChefWarn1 = "attack_int"
// Enemies are in the same/adjacent room
STRING sChefWarn2 = "They_Here"
// Enemies are approaching the back stairs after truck ram
STRING sChefBackStairsWarn = "They_Coming"
// Chef is in danger, needs help (death timer)
STRING sChefHelp1 = "Need_Help"
// Chef makes a periodic short exclamation about being in danger
STRING sChefOutburst = "Outburst"
// Chef took enough damage
STRING sChefHurt = "chin_killed"
BOOL bChefComeOn = FALSE
BOOL bTellChefGetInside = FALSE
BOOL bSetIceBoxBlip = FALSE
// Cheng car dances
STRING sCrazyDanceDict = "MISSChinese1CrazyDance"
STRING sCrazyDanceBase = "Crazy_Dance_BASE"
STRING sCrazyDance1 = "Crazy_Dance_1"
STRING sCrazyDance2 = "Crazy_Dance_2"
STRING sCrazyDance3 = "Crazy_Dance_3" // craziest
STRING sDanceMove = sCrazyDanceBase
BOOL bDanceAnimDictUnloaded = FALSE
// Timer for Cheng starting/stopping dance
INT iChengDanceTime
INT iChengDanceStopTime = -1
ENUM CHENG_DANCE_STATE
eCDS_BaseAnim,
eCDS_FlavorAnim
ENDENUM
CHENG_DANCE_STATE eCDS_DanceState
// ending
BOOL bOutroShitSkip = FALSE
BOOL bStartTranslatorEmergeBox = FALSE
BOOL bMissionPassed = FALSE
VEHICLE_INDEX viGetAwayCar
// *** End additional variables ***
// *** @SBA - Trigger Box Functions ***
// I stole these from Bob (RJM). They proved a means of naming an angled area and using that name
// to create and check the area
FUNC TRIGGER_BOX CREATE_TRIGGER_BOX(VECTOR vMin, VECTOR vMax, FLOAT flWidth)
TRIGGER_BOX tbRetVal
tbRetVal.vMin = vMin
tbRetVal.vMax = vMax
tbRetVal.flWidth = flWidth
RETURN tbRetVal
ENDFUNC
FUNC BOOL IS_ENTITY_IN_TRIGGER_BOX(ENTITY_INDEX ent, TRIGGER_BOX trigger, BOOL bDoDeadCheck = TRUE)
IF NOT DOES_ENTITY_EXIST(ent)
RETURN FALSE
ENDIF
IF bDoDeadCheck
AND IS_ENTITY_DEAD(ent)
RETURN FALSE
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(ent, trigger.vMin, trigger.vMax, trigger.flWidth)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
// @SBA - Returns TRUE if any ped in the given ped structure is in the given trigger box
FUNC BOOL IS_ANY_PED_IN_TRIGGER_BOX(PED_STRUCTURE &psPedInfo[], TRIGGER_BOX trigger)
INT idx
FOR idx = 0 TO (COUNT_OF(psPedInfo) - 1)
IF IS_ENTITY_IN_TRIGGER_BOX(psPedInfo[idx].ped, trigger)
//CPRINTLN(DEBUG_MISSION, "IS_ANY_PED_IN_TRIGGER_BOX: This Ped is in a trigger box: ", psPedInfo[idx].name)
RETURN TRUE
ENDIF
ENDFOR
RETURN FALSE
ENDFUNC
// @SBA - Returns the PED_INDEX of the first ped in the given ped structure that is found alive in the given trigger box
FUNC PED_INDEX GET_FIRST_LIVING_PED_IN_TRIGGER_BOX(PED_STRUCTURE &psPedInfo[], TRIGGER_BOX trigger)
INT idx
FOR idx = 0 TO (COUNT_OF(psPedInfo) - 1)
IF IS_ENTITY_IN_TRIGGER_BOX(psPedInfo[idx].ped, trigger)
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_MISSION, "GET_FIRST_LIVING_PED_IN_TRIGGER_BOX: This Ped is alive in a trigger box: ", psPedInfo[idx].name)
#ENDIF
RETURN psPedInfo[idx].ped
ENDIF
ENDFOR
RETURN NULL
ENDFUNC
FUNC BOOL IS_PLAYER_IN_TRIGGER_BOX(TRIGGER_BOX trigger)
RETURN IS_ENTITY_IN_TRIGGER_BOX(PLAYER_PED_ID(), trigger)
ENDFUNC
// @SBA - only remake truck, then set attributes
PROC RECREATE_PLAYERS_VEHICLE(VECTOR vPos, FLOAT vHead, BOOL bSetVehicleLocked = TRUE)
CREATE_VEHICLE_FOR_REPLAY(trevors_truck.veh, vPos, vHead, FALSE, FALSE, FALSE, FALSE, TRUE, BODHI2, 32, CHAR_TREVOR)
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(trevors_truck.veh,CHI1_CAR_DAMAGE)
IF IS_VEHICLE_DRIVEABLE(trevors_truck.veh)
IF bSetVehicleLocked
set_vehicle_doors_locked(trevors_truck.veh, vehiclelock_locked)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(trevors_truck.veh, false)
ENDIF
set_vehicle_engine_on(trevors_truck.veh, false, true)
ENDIF
ENDPROC
//*** @SBA - Grenade Launcher Related Functions ***
// @SBA - set ammo in grenade launcher to desired ammount
PROC SET_GRENADE_LAUNCHER_AMMO()
IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), weapontype_grenadelauncher)
SET_AMMO_IN_CLIP(PLAYER_PED_ID(), weapontype_grenadelauncher, 0)
SET_PED_AMMO(PLAYER_PED_ID(), weapontype_grenadelauncher, kiGrenadeLauncherAmmo)
CPRINTLN(DEBUG_MISSION,"SET_GRENADE_LAUNCHER_AMMO: Setting ammo to ", kiGrenadeLauncherAmmo)
ENDIF
ENDPROC
// @SBA - create the grenade launcher pickup (which Chef will throw to player)
PROC SETUP_GRENADE_LAUNCHER_PICKUP()
// @SBA - remove the pickup on the roof to ensure we get a new one on restart
IF DOES_PICKUP_EXIST(puiGrenadeLauncher)
REMOVE_PICKUP(puiGrenadeLauncher)
ENDIF
// set placement flags
INT PlacementFlags
PlacementFlags = 0
SET_BIT(PlacementFlags, enum_to_int(PLACEMENT_FLAG_FIXED))
SET_BIT(PlacementFlags, enum_to_int(PLACEMENT_FLAG_LOCAL_ONLY))
puiGrenadeLauncher = CREATE_PICKUP_ROTATE(PICKUP_WEAPON_GRENADELAUNCHER, (<<1407.3669, 3617.3169, 38.4050>>), (<<16.6000, 90.0000, 21.8000>>), PlacementFlags)
//PRINTLN("SETUP_GRENADE_LAUNCHER_PICKUP")
ENDPROC
// @SBA - returns TRUE if the grenade launcher has less ammo than the required ammount
FUNC BOOL DOES_GRENADE_LAUNCHER_NEED_MORE_AMMO(BOOL bSubtractPickupAmmo = FALSE)
// bail if player doesn't have weapon
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), weapontype_grenadelauncher)
RETURN FALSE
ENDIF
// check total ammo
INT iClipAmmo, iPickupAmmo, iTotalAmmo
GET_AMMO_IN_CLIP(PLAYER_PED_ID(), weapontype_grenadelauncher, iClipAmmo)
iTotalAmmo = GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), weapontype_grenadelauncher) + iClipAmmo
//@SBA - if player has gotten more ammo from the pickup, don't include it in the calculation
IF bSubtractPickupAmmo
iPickupAmmo = GET_DEFAULT_AMMO_FOR_WEAPON_PICKUP(PICKUP_WEAPON_GRENADELAUNCHER)
#IF IS_DEBUG_BUILD
PRINTLN("DOES_GRENADE_LAUNCHER_NEED_MORE_AMMO: Pickup ammo = ", iPickupAmmo)
PRINTLN("DOES_GRENADE_LAUNCHER_NEED_MORE_AMMO: Subtotal ammo = ", iTotalAmmo)
#ENDIF
iTotalAmmo = iTotalAmmo - iPickupAmmo
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN("DOES_GRENADE_LAUNCHER_NEED_MORE_AMMO: Total ammo = ", iTotalAmmo)
#ENDIF
IF iTotalAmmo < kiGrenadeLauncherAmmo
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
// @SBA - check if player has gotten grenade launcher pickup, then give appropriate ammo if needed
PROC SET_AMMO_FOR_PICKED_UP_GRENADE_LAUNCHER()
// Have we set the ammo once?
IF bPickupAmmoSet
EXIT
ENDIF
IF NOT DOES_PICKUP_EXIST(puiGrenadeLauncher)
EXIT
ENDIF
// If player got pickup, check ammo level and set minimum ammount if needed
IF HAS_PICKUP_BEEN_COLLECTED(puiGrenadeLauncher)
// set flag to skip cutscene because player has pickup
IF NOT bSkipGrenLaunchCutscene
bSkipGrenLaunchCutscene = TRUE
g_replay.iReplayInt[PLAYER_RECEIVED_GRENADE_LAUNCHER] = HAS_GOT_GLAUNCHER
ENDIF
IF DOES_GRENADE_LAUNCHER_NEED_MORE_AMMO(TRUE)
SET_GRENADE_LAUNCHER_AMMO()
ENDIF
bPickupAmmoSet = TRUE
ENDIF
ENDPROC
//*** @SBA - Wave Rusher Related Functions ***
// @SBA - set some attributes for rushers
PROC SET_ENEMY_RUSHER_ATTRIBUTES(PED_INDEX piRusher, INT iNewAccuracy, FLOAT fBlanksCloseChance, FLOAT fBlanksFarChance)
IF PRIVATE_isEntityAlive(piRusher)
SET_PED_CHANCE_OF_FIRING_BLANKS(piRusher, fBlanksCloseChance, fBlanksFarChance)
SET_PED_ACCURACY(piRusher, iNewAccuracy)
ENDIF
ENDPROC
// @SBA - Returns TRUE if the passed in ped info shows the ped is ok and hasn't rushed yet
FUNC BOOL IS_ENEMY_VALID_FOR_RUSHING(PED_STRUCTURE &psPedInfo, main_mission_shootout &PedStatus, BOOL bCheckStatus = FALSE)
// @SBA - Check if the ped is in the correct state to process a rush.
// In some cases we don't want to do this as it would inturrupt the peds' strict rushing order.
IF bCheckStatus
IF PedStatus != run_into_shop
AND PedStatus != run_to_front_of_building // @SBA - wave0 uses this one
#IF IS_DEBUG_BUILD
PRINTLN("IS_ENEMY_VALID_FOR_RUSHING: This Ped is not in the correct state: ", psPedInfo.name)
#ENDIF
RETURN FALSE
ENDIF
ENDIF
IF NOT IS_PED_INJURED(psPedInfo.ped)
IF NOT psPedInfo.bRushInside
#IF IS_DEBUG_BUILD
PRINTLN("IS_ENEMY_VALID_FOR_RUSHING: Ped is VALID, setting rush flag for: ", psPedInfo.name)
#ENDIF
psPedInfo.bRushInside = TRUE
RETURN TRUE
ENDIF
ELSE
// If the ped is injured, set this flag true anyway for tracking
IF NOT psPedInfo.bRushInside
#IF IS_DEBUG_BUILD
PRINTLN("IS_ENEMY_VALID_FOR_RUSHING: Ped is INJURED, setting rush flag for: ", psPedInfo.name)
#ENDIF
psPedInfo.bRushInside = TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
// @SBA - determines and returns the index for the next valid enemy in wave 0
// Lets the enemies be checked in a specific order
FUNC INT GET_NEXT_WAVE_0_INDEX()
IF IS_ENEMY_VALID_FOR_RUSHING(wave_0_enemy[3], wave_0_status[3], TRUE)
RETURN 3
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_0_enemy[1], wave_0_status[1], TRUE)
RETURN 1
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_0_enemy[4], wave_0_status[4], TRUE)
RETURN 4
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_0_enemy[0], wave_0_status[0], TRUE)
RETURN 0
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_0_enemy[5], wave_0_status[5], TRUE)
RETURN 5
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_0_enemy[2], wave_0_status[2], TRUE)
RETURN 2
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_0_enemy[6], wave_0_status[6], TRUE)
RETURN 6
ENDIF
// @SBA - don't currently need the last two, since the truck smashing the gate should intervene
// when two (or fewer) enemies are left
// IF IS_ENEMY_VALID_FOR_RUSHING(wave_0_enemy[7], wave_0_status[7])
// RETURN 7
// ENDIF
//
// IF IS_ENEMY_VALID_FOR_RUSHING(wave_0_enemy[8], wave_0_status[8])
// RETURN 8
// ENDIF
// No valid enemy found
RETURN -1
ENDFUNC
// @SBA - determines and returns the index for the next valid enemy in wave 2
// Lets the enemies be checked in a specific order, but will skip a ped that's not in the correct state
FUNC INT GET_NEXT_WAVE_2_INDEX()
IF IS_ENEMY_VALID_FOR_RUSHING(wave_2_enemy[5], wave_2_status[5], TRUE)
RETURN 5
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_2_enemy[4], wave_2_status[4], TRUE)
RETURN 4
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_2_enemy[1], wave_2_status[1], TRUE)
RETURN 1
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_2_enemy[0], wave_2_status[0], TRUE)
RETURN 0
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_2_enemy[2], wave_2_status[2], TRUE)
RETURN 2
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_2_enemy[18], wave_2_status[18], TRUE)
RETURN 18
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_2_enemy[3], wave_2_status[3], TRUE)
RETURN 3
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_2_enemy[19], wave_2_status[19], TRUE)
RETURN 19
ENDIF
// @SBA - the enemies below are the second part of wave 2
IF IS_ENEMY_VALID_FOR_RUSHING(wave_2_enemy[6], wave_2_status[6], TRUE)
RETURN 6
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_2_enemy[7], wave_2_status[7], TRUE)
RETURN 7
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_2_enemy[8], wave_2_status[8], TRUE)
RETURN 8
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_2_enemy[9], wave_2_status[9], TRUE)
RETURN 9
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_2_enemy[10], wave_2_status[10], TRUE)
RETURN 10
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_2_enemy[11], wave_2_status[11], TRUE)
RETURN 11
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_2_enemy[12], wave_2_status[12], TRUE)
RETURN 12
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_2_enemy[13], wave_2_status[13], TRUE)
RETURN 13
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_2_enemy[14], wave_2_status[14], TRUE)
RETURN 14
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_2_enemy[15], wave_2_status[15], TRUE)
RETURN 15
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_2_enemy[16], wave_2_status[16], TRUE)
RETURN 16
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_2_enemy[17], wave_2_status[17], TRUE)
RETURN 17
ENDIF
// No valid enemy found
RETURN -1
ENDFUNC
// @SBA Returns a randomized time to wait between rush attempts for wave 2
//FUNC INT GET_RANDOM_WAIT_TIME_FOR_WAVE_2(INT iEnemyRushCount)
//
// // Return a "long" time after two rushes
// IF iEnemyRushCount % 2 = 0
// RETURN GET_RANDOM_INT_IN_RANGE(15000, 20000)
// ENDIF
//
// // Otherwise return a "normal" time
// RETURN GET_RANDOM_INT_IN_RANGE(2500, 4000)
//ENDFUNC
// @SBA - checks if enemies have been set to rush and are still alive. If we have too few, it's ok to request more.
FUNC BOOL ARE_WE_READY_FOR_A_NEW_RUSHER(PED_STRUCTURE &psPedInfo[], INT iMaxNumRushers = kiNumberOfWaveRushersAllowed)
INT k, iCounter
// @SBA - count up the number of enemies who have been told to rush and are uninjured
FOR k = 0 TO COUNT_OF(psPedInfo) - 1
IF psPedInfo[k].bRushInside
IF NOT IS_PED_INJURED(psPedInfo[k].ped)
//CPRINTLN(DEBUG_MISSION, "*** ARE_WE_READY_FOR_A_NEW_RUSHER: Counting enemy ", k)
iCounter ++
ENDIF
ENDIF
ENDFOR
// CPRINTLN(DEBUG_MISSION, "*** ARE_WE_READY_FOR_A_NEW_RUSHER: Number of active rushers = ", iCounter)
// CPRINTLN(DEBUG_MISSION, "*** ARE_WE_READY_FOR_A_NEW_RUSHER: Max Number of rushers = ", iMaxNumRushers)
// @SBA - if we're below the max number of allowed rushers at one time, it's ok to request a new one
IF iCounter < iMaxNumRushers
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
// @SBA - determines and returns the index for the next valid enemy in wave 3
// Lets the enemies be checked in a specific order
FUNC INT GET_NEXT_WAVE_3_INDEX()
IF IS_ENEMY_VALID_FOR_RUSHING(wave_3_enemy[2], wave_3_status[2])
RETURN 2
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_3_enemy[3], wave_3_status[3])
RETURN 3
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_3_enemy[1], wave_3_status[1])
RETURN 1
ENDIF
IF IS_ENEMY_VALID_FOR_RUSHING(wave_3_enemy[0], wave_3_status[0])
RETURN 0
ENDIF
// No valid enemy found
RETURN -1
ENDFUNC
// @SBA Returns a randomized time to wait between rush attempts for wave 3
FUNC INT GET_RANDOM_WAIT_TIME_FOR_WAVE_3()
// Return a shorter time after the third rush
IF wave_3_enemy[1].bRushInside
RETURN GET_RANDOM_INT_IN_RANGE(4000, 6000)
// Or return a longer time after first two rushes
ELIF wave_3_enemy[2].bRushInside
AND wave_3_enemy[3].bRushInside
RETURN GET_RANDOM_INT_IN_RANGE(20000, 25000)
ENDIF
// Otherwise return a "normal" time
RETURN GET_RANDOM_INT_IN_RANGE(6000, 8000)
ENDFUNC
//*** @SBA - Other General Functions ***
// @SBA - sets the given ped's health, if not already set to that value
PROC SET_HEALTH_FOR_PED(PED_INDEX piPed, INT iNewHealth)
IF DOES_ENTITY_EXIST(piPed)
IF NOT IS_ENTITY_DEAD(piPed)
IF GET_ENTITY_HEALTH(piPed) != iNewHealth
SET_ENTITY_HEALTH(piPed, iNewHealth)
ENDIF
ENDIF
ENDIF
ENDPROC
// @SBA - creates a blip for the ped in the passed-in struct if he's not in a vehicle
PROC HANDLE_ENEMY_BLIP_CREATION(PED_STRUCTURE &psPedInfo)
IF NOT DOES_BLIP_EXIST(psPedInfo.blip)
IF NOT IS_PED_IN_ANY_VEHICLE(psPedInfo.ped)
psPedInfo.blip = CREATE_BLIP_FOR_PED(psPedInfo.ped, TRUE)
SET_BLIP_DISPLAY(psPedInfo.blip, DISPLAY_BLIP)
ENDIF
ENDIF
ENDPROC
PROC REMOVE_VEHICLE_BLIP(vehicle_struct &vsVeh)
IF DOES_BLIP_EXIST(vsVeh.blip)
REMOVE_BLIP(vsVeh.blip)
ENDIF
ENDPROC
PROC REMOVE_DEAD_VEHICLE_BLIPS(vehicle_struct &vsVeh[])
INT idx
REPEAT COUNT_OF(vsVeh) idx
IF DOES_BLIP_EXIST(vsVeh[idx].blip)
IF DOES_ENTITY_EXIST(vsVeh[idx].veh)
IF NOT IS_VEHICLE_DRIVEABLE(vsVeh[idx].veh)
REMOVE_BLIP(vsVeh[idx].blip)
ELSE IS_VEHICLE_EMPTY(vsVeh[idx].veh, TRUE)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsVeh[idx].veh)
CPRINTLN(DEBUG_MISSION, "REMOVE_DEAD_VEHICLE_BLIPS: Vehicle has no living ped in it, removing blip.")
REMOVE_BLIP(vsVeh[idx].blip)
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDPROC
// @SBA - bit of a hack to blow up player if he's silly
PROC KILL_INVINCIBLE_PLAYER_IF_IN_EXPLOSION()
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), 5.0)
SET_ENTITY_PROOFS(PLAYER_PED_ID(), TRUE, FALSE, FALSE, TRUE, TRUE)
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), FALSE)
APPLY_DAMAGE_TO_PED(PLAYER_PED_ID(), 1000, TRUE)
ENDIF
ENDIF
ENDPROC
// so we can recreate the live ones, if we want
PROC STORE_ENEMY_VEHICLES_STILL_ALIVE()
INT iCounter = 0
g_replay.iReplayInt[PLAYER_DESTROYED_VEHICLES] = WAVE0_BOTH_CARS_DEAD
IF DOES_ENTITY_EXIST(wave_0_enemy_vehicle[0].veh)
IF NOT IS_ENTITY_DEAD(wave_0_enemy_vehicle[0].veh)
g_replay.iReplayInt[PLAYER_DESTROYED_VEHICLES] = WAVE0_ONLY_CAR0_ALIVE
iCounter ++
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(wave_0_enemy_vehicle[1].veh)
IF NOT IS_ENTITY_DEAD(wave_0_enemy_vehicle[1].veh)
g_replay.iReplayInt[PLAYER_DESTROYED_VEHICLES] = WAVE0_ONLY_CAR1_ALIVE
iCounter ++
ENDIF
ENDIF
IF iCounter = 2
g_replay.iReplayInt[PLAYER_DESTROYED_VEHICLES] = WAVE0_BOTH_CARS_ALIVE
ENDIF
CPRINTLN(DEBUG_MISSION,"STORE_ENEMY_VEHICLES_STILL_ALIVE: setting to ", g_replay.iReplayInt[PLAYER_DESTROYED_VEHICLES])
ENDPROC
PROC HANDLE_VEHICLE_TOO_NEAR_ICE_BOX()
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
EXIT
ENDIF
IF NOT IS_PLAYER_IN_TRIGGER_BOX(tbIceBoxOuterVol)
EXIT
ENDIF
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), 4.0)
TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID())
ENDIF
ENDPROC
proc remove_all_blips()
if does_blip_exist(outside_meth_lab_blip)
remove_blip(outside_meth_lab_blip)
endif
if does_blip_exist(meth_lab_blip)
remove_blip(meth_lab_blip)
endif
if does_blip_exist(buddy.blip)
remove_blip(buddy.blip)
endif
if does_blip_exist(cheng.blip)
remove_blip(cheng.blip)
endif
if does_blip_exist(translator.blip)
remove_blip(translator.blip)
endif
// @SBA - remove ice box blip as well
if does_blip_exist(ice_box_blip)
remove_blip(ice_box_blip)
endif
for i = 0 to count_of(wave_0_enemy) - 1
if does_blip_exist(wave_0_enemy[i].blip)
remove_blip(wave_0_enemy[i].blip)
endif
endfor
for i = 0 to count_of(wave_0_inside_enemy) - 1
if does_blip_exist(wave_0_inside_enemy[i].blip)
remove_blip(wave_0_inside_enemy[i].blip)
endif
endfor
for i = 0 to count_of(wave_2_enemy) - 1
if does_blip_exist(wave_2_enemy[i].blip)
remove_blip(wave_2_enemy[i].blip)
endif
endfor
for i = 0 to count_of(wave_3_enemy) - 1
if does_blip_exist(wave_3_enemy[i].blip)
remove_blip(wave_3_enemy[i].blip)
endif
endfor
// vehicles too
for i = 0 to count_of(wave_0_enemy_vehicle) - 1
REMOVE_VEHICLE_BLIP(wave_0_enemy_vehicle[i])
ENDFOR
for i = 0 to count_of(wave_2_enemy_vehicle) - 1
REMOVE_VEHICLE_BLIP(wave_2_enemy_vehicle[i])
ENDFOR
for i = 0 to count_of(wave_3_enemy_vehicle) - 1
REMOVE_VEHICLE_BLIP(wave_3_enemy_vehicle[i])
ENDFOR
endproc
PROC RECORD_ENEMY_IN_ARRAY_KILLED(ped_structure &enemyStruct[])
INT k
REPEAT COUNT_OF(enemyStruct) k
IF DOES_ENTITY_EXIST(enemyStruct[k].ped)
IF NOT enemyStruct[k].been_killed
IF IS_ENTITY_DEAD(enemyStruct[k].ped)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(enemyStruct[k].ped, PLAYER_PED_ID())
CPRINTLN(DEBUG_MISSION, "RECORD_ENEMY_IN_ARRAY_KILLED")
enemyStruct[k].been_killed = TRUE
INFORM_MISSION_STATS_OF_INCREMENT(CHI1_BODY_COUNT)
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(enemyStruct[k].ped, weapontype_grenadelauncher)
CPRINTLN(DEBUG_MISSION, "CHI1_GRENADE_LAUNCHER_KILLS")
INFORM_MISSION_STATS_OF_INCREMENT(CHI1_GRENADE_LAUNCHER_KILLS)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDPROC
PROC RECORD_VEHICLE_IN_ARRAY_DESTROYED(vehicle_struct &vehStruct[])
INT k
REPEAT COUNT_OF(vehStruct) k
IF DOES_ENTITY_EXIST(vehStruct[k].veh)
IF NOT vehStruct[k].been_destroyed
IF IS_ENTITY_DEAD(vehStruct[k].veh)
CPRINTLN(DEBUG_MISSION, "RECORD_VEHICLE_IN_ARRAY_DESTROYED")
vehStruct[k].been_destroyed = TRUE
INFORM_MISSION_STATS_OF_INCREMENT(CHI1_VEHICLES_DESTROYED)
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDPROC
PROC UPDATE_DAMAGE_WATCH_STATS()
IF IS_ENTITY_DEAD(PLAYER_PED_ID())
EXIT
ENDIF
IF bPlayerInVehicle
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
CPRINTLN(DEBUG_MISSION, "UPDATE_DAMAGE_WATCH_STATS: Player is NOT in vehicle.")
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(PLAYER_PED_ID(), CHI1_UNMARKED)
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(player_ped_id())
bPlayerInVehicle = FALSE
ENDIF
ELSE
IF DOES_ENTITY_EXIST(trevors_truck.veh)
IF IS_VEHICLE_DRIVEABLE(trevors_truck.veh)
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), trevors_truck.veh)
CPRINTLN(DEBUG_MISSION, "UPDATE_DAMAGE_WATCH_STATS: Player IS in vehicle.")
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(trevors_truck.veh, CHI1_CAR_DAMAGE)
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(trevors_truck.veh)
bPlayerInVehicle = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
// Update stats
PROC HANDLE_CHINESE1_STATS()
RECORD_ENEMY_IN_ARRAY_KILLED(wave_0_enemy)
RECORD_ENEMY_IN_ARRAY_KILLED(wave_0_inside_enemy)
RECORD_ENEMY_IN_ARRAY_KILLED(wave_2_enemy)
RECORD_ENEMY_IN_ARRAY_KILLED(wave_3_enemy)
RECORD_ENEMY_IN_ARRAY_KILLED(ambient_enemy)
RECORD_VEHICLE_IN_ARRAY_DESTROYED(wave_0_enemy_vehicle)
RECORD_VEHICLE_IN_ARRAY_DESTROYED(wave_2_enemy_vehicle)
RECORD_VEHICLE_IN_ARRAY_DESTROYED(wave_3_enemy_vehicle)
RECORD_VEHICLE_IN_ARRAY_DESTROYED(ambient_enemy_vehicle)
UPDATE_DAMAGE_WATCH_STATS()
ENDPROC
//**************************************************LAWRENCE SDK**************************************************
proc disable_dispatch_services()
enable_dispatch_service(dt_fire_department, false)
enable_dispatch_service(dt_police_automobile, false)
enable_dispatch_service(dt_police_helicopter, false)
enable_dispatch_service(dt_ambulance_department, false)
endproc
proc enable_dispatch_services()
enable_dispatch_service(dt_fire_department, true)
enable_dispatch_service(dt_police_automobile, true)
enable_dispatch_service(dt_police_helicopter, true)
enable_dispatch_service(dt_ambulance_department, true)
endproc
func bool HAVE_ALL_STREAMING_REQUESTS_COMPLETED_for_ped(ped_index miss_ped)
if does_entity_exist(miss_ped)
if not is_ped_injured(miss_ped)
if HAVE_ALL_STREAMING_REQUESTS_COMPLETED(miss_ped)
return true
endif
endif
endif
return false
endfunc
func bool start_new_cutscene_no_fade(bool clear_players_tasks = true, bool hide_weapon_for_cutscene = true, bool kill_conversation_line_immediately = true, BOOL dDisplayRadarHud = FALSE, bool ignore_can_player_start_cutscene = false)
if can_player_start_cutscene() or ignore_can_player_start_cutscene
SPECIAL_ABILITY_DEACTIVATE(player_id())
SET_SCRIPTS_SAFE_FOR_CUTSCENE(true)
clear_prints()
clear_help()
if kill_conversation_line_immediately
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
else
kill_any_conversation()
endif
display_hud(dDisplayRadarHud)
display_radar(dDisplayRadarHud)
set_widescreen_borders(true, 500)
if clear_players_tasks
set_player_control(player_id(), false, spc_clear_tasks)
else
set_player_control(player_id(), false)
endif
if hide_weapon_for_cutscene
hide_ped_weapon_for_scripted_cutscene(player_ped_id(), true)
endif
disable_dispatch_services()
return true
endif
return false
endfunc
proc end_cutscene(bool clear_tasks = true, float interp_heading = 0.0, float interp_pitch = 0.0, bool enable_emergency_services = true)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(false)
clear_prints()
clear_help()
kill_face_to_face_conversation()
display_hud(true)
display_radar(true)
set_widescreen_borders(false, 500)
if is_player_playing(player_id())
render_script_cams(false, false)
set_gameplay_cam_relative_heading(interp_heading)
set_gameplay_cam_relative_pitch(interp_pitch)
if clear_tasks
clear_ped_tasks(player_ped_id())
endif
set_player_control(player_id(), true)
hide_ped_weapon_for_scripted_cutscene(player_ped_id(), false)
endif
if enable_emergency_services
enable_dispatch_services()
else
disable_dispatch_services()
endif
// if mission_car_marked
// mark_vehicle_as_no_longer_needed(current_car)
// mission_car_marked = false
// endif
//allow_emergency_services(true)
do_screen_fade_in(DEFAULT_FADE_TIME)
endproc
proc end_cutscene_no_fade(bool clear_tasks = true, bool interpolate_behind_player = false, float interp_heading = 0.0, float interp_pitch = 0.0, int interp_to_game_time = 3000, bool enable_emergency_services = true, bool update_game_camera = true)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(false)
clear_prints()
clear_help()
kill_face_to_face_conversation()
display_hud(true)
display_radar(true)
set_widescreen_borders(false, 500) // 500
if is_player_playing(player_id())
destroy_all_cams()
if update_game_camera
if interpolate_behind_player
set_gameplay_cam_relative_heading(interp_heading)
set_gameplay_cam_relative_pitch(interp_pitch)
render_script_cams(false, true, interp_to_game_time)
else
render_script_cams(false, false)
set_gameplay_cam_relative_heading(interp_heading)
set_gameplay_cam_relative_pitch(interp_pitch)
endif
endif
if clear_tasks
clear_ped_tasks(player_ped_id())
endif
set_player_control(player_id(), true)
hide_ped_weapon_for_scripted_cutscene(player_ped_id(), false)
endif
if enable_emergency_services
enable_dispatch_services()
else
disable_dispatch_services()
endif
endproc
// @SBA - no frills
PROC END_CUTSCENE_BASIC()
SET_SCRIPTS_SAFE_FOR_CUTSCENE(false)
clear_prints()
clear_help()
kill_face_to_face_conversation()
display_hud(true)
display_radar(true)
set_widescreen_borders(false, 500) // 500
if is_player_playing(player_id())
set_player_control(player_id(), true)
hide_ped_weapon_for_scripted_cutscene(player_ped_id(), false)
ENDIF
ENDPROC
func bool lk_timer(int &start_time, int time)
int current_time
current_time = get_game_timer()
if ((current_time - start_time) > time)
return true
endif
return false
endfunc
func bool is_skip_button_pressed()
return is_control_just_pressed(frontend_control, input_frontend_accept)
endfunc
func bool skip_scripted_cut(int &original_time_temp, int cutscene_skip_time)
if lk_timer(original_time_temp, cutscene_skip_time)
if is_screen_faded_in()
if IS_CUTSCENE_SKIP_BUTTON_PRESSED()
return true
endif
endif
endif
return false
endfunc
func bool mission_ped_created_and_injured(bool &mission_ped_created, ped_index &mission_ped)
if mission_ped_created
return is_ped_injured(mission_ped)
endif
return false
endfunc
func bool mission_ped_injured(ped_index &this_ped)
if DOES_ENTITY_EXIST(this_ped)
return is_ped_injured(this_ped)
endif
return false
endfunc
func bool mission_vehicle_injured(vehicle_index &this_vehicle)
if DOES_ENTITY_EXIST(this_vehicle)
if not is_vehicle_driveable(this_vehicle)
return true
endif
endif
return false
endfunc
func bool is_mission_entity_attacked(ped_index &mission_ped, bool clear_damage_entity = false)
if DOES_ENTITY_EXIST(mission_ped)
if not is_ped_injured(mission_ped)
if HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(mission_ped, PLAYER_ped_ID())
if clear_damage_entity
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(mission_ped)
endif
return true
endif
else
return true
endif
endif
return false
endfunc
func bool has_char_task_finished_2(ped_index ped, script_task_name taskname)
scripttaskstatus status
status = get_script_task_status(ped, taskname)
if status = finished_task
or status = dormant_task
return true
endif
return false
endfunc
//gets the currenent car the player is in
func bool get_current_player_vehicle(vehicle_index &test_car)
if is_ped_sitting_in_any_vehicle(player_ped_id())
test_car = get_players_last_vehicle()
if DOES_ENTITY_EXIST(test_car)
if is_vehicle_driveable(test_car)
return true
endif
endif
endif
return false
endfunc
PROC STOP_PLAYER_vehicle()
VEHICLE_INDEX player_car
if get_current_player_vehicle(player_car)
FLOAT player_car_speed
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SET_ENTITY_PROOFS(player_car, true, true, true, true, true)
player_car_speed = GET_ENTITY_SPEED(player_car)
WHILE player_car_speed > 0.2
WAIT(0)
if not IS_ENTITY_DEAD(player_car)
player_car_speed = GET_ENTITY_SPEED(player_car)
endif
ENDWHILE
SET_ENTITY_PROOFS(player_car, false, false, false, false, false)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
ENDPROC
func bool add_ped_to_players_group(ped_index &this_ped, group_index &players_group)
if DOES_ENTITY_EXIST(this_ped)
if not is_ped_injured(this_ped)
players_group = get_player_group(player_id())
set_ped_as_group_member(this_ped, players_group)
return true
endif
endif
return false
endfunc
func float distance_from_player_to_ped(ped_index &mission_ped)
vector player_pos
vector mission_ped_pos
if DOES_ENTITY_EXIST(mission_ped)
if not is_ped_injured(mission_ped)
player_pos = GET_ENTITY_COORDS(player_ped_id())
mission_ped_pos = GET_ENTITY_COORDS(mission_ped)
return get_distance_between_coords(player_pos, mission_ped_pos)
endif
endif
return -1.0
endfunc
func bool has_ped_task_finished_2(ped_index ped, script_task_name taskname = script_task_perform_sequence)
scripttaskstatus status
status = get_script_task_status(ped, taskname)
if status = finished_task
or status = dormant_task
return true
endif
return false
endfunc
func bool is_ped_playing_anim_at_phase(string anim_dict_name, string anim_name, float phase_target)
// printstring("test 0")
// printnl()
if IS_ENTITY_PLAYING_ANIM(player_ped_id(), anim_dict_name, anim_name)
// printstring("test 1")
// printnl()
if GET_ENTITY_ANIM_CURRENT_TIME(player_ped_id(), anim_dict_name, anim_name) > phase_target
// script_assert("test 2")
return true
endif
endif
return false
endfunc
func bool are_vectors_alomost_equal(vector vector_a, vector vector_b, vector unit_vector_x_multiplier)
//vec b is the target vector
//vec a is the current positon of the object
//unit_vector_x_multiplier is the unitvector * frame time * multiplier
vector vector_ba
vector future_vector
vector_ba = vector_b - vector_a
if (vmag(vector_ba) < 0.2)
return true
endif
future_vector = (vector_b - (vector_a + unit_vector_x_multiplier))
if (vmag(future_vector) > vmag(vector_ba))
return true
endif
return false
endfunc
//The players group does not include the player himself. RELGROUPHASH_PLAYER is the player
REL_GROUP_HASH player_group
REL_GROUP_HASH enemy_group
proc add_relationship_groups()
ADD_RELATIONSHIP_GROUP("players group", player_group)
ADD_RELATIONSHIP_GROUP("enemy group", enemy_group)
endproc
proc setup_relationship_contact(ped_index &this_ped, bool block_temporary_events = false)
SET_RELATIONSHIP_between_groups(ACQUAINTANCE_TYPE_PED_LIKE, player_group, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_between_groups(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, player_group)
SET_RELATIONSHIP_between_groups(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, enemy_group)
SET_RELATIONSHIP_between_groups(ACQUAINTANCE_TYPE_PED_HATE, player_group, enemy_group)
SET_RELATIONSHIP_between_groups(ACQUAINTANCE_TYPE_PED_HATE, enemy_group, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_between_groups(ACQUAINTANCE_TYPE_PED_HATE, enemy_group, player_group)
if DOES_ENTITY_EXIST(this_ped)
if NOT is_ped_injured(this_ped)
SET_PED_RELATIONSHIP_GROUP_HASH(this_ped, player_group)
SET_PED_TARGET_LOSS_RESPONSE(this_ped, tlr_never_lose_target)
set_ped_combat_attributes(this_ped, CA_DISABLE_PINNED_DOWN, true)
set_ped_combat_attributes(this_ped, CA_DISABLE_PIN_DOWN_OTHERS, true)
if block_temporary_events
set_blocking_of_non_temporary_events(this_ped, true)
else
set_blocking_of_non_temporary_events(this_ped, false)
endif
endif
endif
endproc
proc setup_relationship_enemy(ped_index &this_ped, bool block_temporary_events = false)
SET_RELATIONSHIP_between_groups(ACQUAINTANCE_TYPE_PED_LIKE, player_group, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_between_groups(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, player_group)
SET_RELATIONSHIP_between_groups(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, enemy_group)
SET_RELATIONSHIP_between_groups(ACQUAINTANCE_TYPE_PED_HATE, player_group, enemy_group)
SET_RELATIONSHIP_between_groups(ACQUAINTANCE_TYPE_PED_HATE, enemy_group, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_between_groups(ACQUAINTANCE_TYPE_PED_HATE, enemy_group, player_group)
if DOES_ENTITY_EXIST(this_ped)
if NOT is_ped_injured(this_ped)
SET_ped_RELATIONSHIP_GROUP_hash(this_ped, enemy_group)
set_ped_combat_attributes(this_ped, ca_will_scan_for_dead_peds, false)
SET_PED_COMBAT_ATTRIBUTES(this_ped, ca_use_vehicle, false)
SET_PED_COMBAT_ATTRIBUTES(this_ped, CA_LEAVE_VEHICLES, true)
set_ped_combat_attributes(this_ped, CA_DISABLE_PINNED_DOWN, true)
set_ped_combat_attributes(this_ped, CA_DISABLE_PIN_DOWN_OTHERS, true)
set_ped_combat_movement(this_ped, cm_defensive)
SET_PED_TARGET_LOSS_RESPONSE(this_ped, tlr_never_lose_target)
set_entity_is_target_priority(this_ped, true)
if block_temporary_events
set_blocking_of_non_temporary_events(this_ped, true)
else
set_blocking_of_non_temporary_events(this_ped, false)
endif
endif
endif
endproc
proc setup_enemy_attributes(ped_structure &mission_entity)
set_ped_dies_when_injured(mission_entity.ped, true)
set_ped_as_enemy(mission_entity.ped, true)
set_entity_is_target_priority(mission_entity.ped, true)
set_ped_keep_task(mission_entity.ped, true)
set_ped_can_evasive_dive(mission_entity.ped, true)
set_blocking_of_non_temporary_events(mission_entity.ped, true)
SET_PED_CONFIG_FLAG(mission_entity.ped, PCF_KeepRelationshipGroupAfterCleanUp, true)
set_ped_config_flag(mission_entity.ped, PCF_DisableHurt, true)
give_weapon_to_ped(mission_entity.ped, mission_entity.weapon, infinite_ammo, true)
set_ped_accuracy(mission_entity.ped, mission_entity.accuracy)
SET_ENTITY_HEALTH(mission_entity.ped, mission_entity.health)
set_ped_max_health(mission_entity.ped, mission_entity.health)
if mission_entity.damaged_by_player
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(mission_entity.ped, true)
endif
if mission_entity.allow_body_armour
add_armour_to_ped(mission_entity.ped, 100)
endif
mission_entity.created = true
set_ped_name_debug(mission_entity.ped, mission_entity.name)
set_ped_hearing_range(mission_entity.ped, 250.00)
set_ped_seeing_range(mission_entity.ped, 250.00)
set_ped_id_range(mission_entity.ped, 250.00)
mission_entity.blip = create_blip_for_ped(mission_entity.ped, true)
set_blip_display(mission_entity.blip, DISPLAY_BLIP)
INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(mission_entity.ped)
endproc
proc setup_enemy(ped_structure &enemy)
clear_area(enemy.pos, 2.0, true)
enemy.ped = create_ped(pedtype_mission, enemy.model, enemy.pos, enemy.heading)
set_ped_random_component_variation(enemy.ped)
set_ped_dies_when_injured(enemy.ped, true)
set_ped_as_enemy(enemy.ped, true)
set_entity_is_target_priority(enemy.ped, true)
set_ped_keep_task(enemy.ped, true)
SET_PED_CONFIG_FLAG(enemy.ped, PCF_KeepRelationshipGroupAfterCleanUp, true)
set_ped_config_flag(enemy.ped, PCF_DisableHurt, true)
give_weapon_to_ped(enemy.ped, enemy.weapon, infinite_ammo, true)
SET_ENTITY_HEALTH(enemy.ped, enemy.health)
set_ped_max_health(enemy.ped, enemy.health)
if enemy.damaged_by_player
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(enemy.ped, true)
endif
if enemy.allow_body_armour
add_armour_to_ped(enemy.ped, 100)
endif
set_ped_name_debug(enemy.ped, enemy.name)
set_ped_seeing_range(enemy.ped, 250.00)
set_ped_hearing_range(enemy.ped, 250.00)
set_ped_id_range(enemy.ped, 250.00)
enemy.blip = CREATE_BLIP_FOR_PED(enemy.ped, true)
set_blip_display(enemy.blip, DISPLAY_BLIP)
set_ped_can_evasive_dive(enemy.ped, true)
setup_relationship_enemy(enemy.ped, true)
set_ped_accuracy(enemy.ped, enemy.accuracy)
INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(enemy.ped)
//CHI1_BODY_COUNT stats
enemy.created = true
endproc
proc setup_buddy(ped_structure &mission_buddy, BOOL bCreateBlip = TRUE)
clear_area(mission_buddy.pos, 4.0, true)
mission_buddy.ped = create_ped(pedtype_mission, mission_buddy.model, mission_buddy.pos, mission_buddy.heading)
set_entity_health(mission_buddy.ped, mission_buddy.health)
set_ped_dies_when_injured(mission_buddy.ped, false)
set_ped_can_be_targetted(mission_buddy.ped, false)
set_ped_suffers_critical_hits(mission_buddy.ped, false)
set_ped_can_evasive_dive(mission_buddy.ped, false)
set_entity_is_target_priority(mission_buddy.ped, false)
set_ped_keep_task(mission_buddy.ped, true)
set_ped_can_ragdoll(mission_buddy.ped, false)
SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(mission_buddy.ped, false)
SET_PED_CONFIG_FLAG(mission_buddy.ped, PCF_KeepRelationshipGroupAfterCleanUp, true)
SET_PED_CONFIG_FLAG(mission_buddy.ped, PCF_WillFlyThroughWindscreen, false)
SET_PED_CONFIG_FLAG(mission_buddy.ped, PCF_RunFromFiresAndExplosions, FALSE)
set_ped_config_flag(mission_buddy.ped, PCF_CanActivateRagdollWhenVehicleUpsideDown, true)
SET_PED_CONFIG_FLAG(mission_buddy.ped, PCF_DisableExplosionReactions, true)
SET_PED_CONFIG_FLAG(mission_buddy.ped, PCF_DisableHurt, true)
set_ped_name_debug(mission_buddy.ped, mission_buddy.name)
// @SBA - sometimes we don't want a blip
IF bCreateBlip
mission_buddy.blip = CREATE_BLIP_FOR_PED(mission_buddy.ped, false)
set_blip_display(mission_buddy.blip, DISPLAY_BLIP)
// Also will set Cheng and translator, but shouldn't hurt since there are no enemies, etc. while they exist.
SET_BLIP_PRIORITY(mission_buddy.blip, BLIPPRIORITY_HIGHEST)
ENDIF
IF mission_buddy.weapon != WEAPONTYPE_INVALID
give_weapon_to_ped(mission_buddy.ped, mission_buddy.weapon, infinite_ammo, false)
ENDIF
set_ped_seeing_range(mission_buddy.ped, 250.00)
set_ped_hearing_range(mission_buddy.ped, 250.00)
set_ped_id_range(mission_buddy.ped, 250.00)
// give glasses
IF mission_buddy.model = GET_NPC_PED_MODEL(CHAR_CHEF)
OR mission_buddy.model = GET_NPC_PED_MODEL(CHAR_cheng)
OR mission_buddy.model = IG_TaosTranslator
SET_PED_PROP_INDEX(mission_buddy.ped, ANCHOR_EYES, 0) //Glasses prop.
ENDIF
setup_relationship_contact(mission_buddy.ped, true)
endproc
// @SBA - create Chef for initial cutscene
PROC HANDLE_SETUP_INITIAL_CHEF()
IF NOT DOES_ENTITY_EXIST(buddy.ped)
IF HAS_MODEL_LOADED(buddy.model)
setup_buddy(buddy, FALSE)
CPRINTLN(DEBUG_MISSION, "HANDLE_SETUP_INITIAL_CHEF: Chef has been created")
ENDIF
ENDIF
ENDPROC
proc setup_buddy_attributes(ped_structure &mission_buddy)
set_entity_health(mission_buddy.ped, mission_buddy.health)
set_ped_dies_when_injured(mission_buddy.ped, false)
set_ped_can_be_targetted(mission_buddy.ped, false)
set_ped_suffers_critical_hits(mission_buddy.ped, false)
set_ped_can_evasive_dive(mission_buddy.ped, false)
set_entity_is_target_priority(mission_buddy.ped, false)
set_ped_keep_task(mission_buddy.ped, true)
set_ped_can_ragdoll(mission_buddy.ped, false)
SET_PED_CONFIG_FLAG(mission_buddy.ped, PCF_KeepRelationshipGroupAfterCleanUp, true)
SET_PED_CONFIG_FLAG(mission_buddy.ped, PCF_WillFlyThroughWindscreen, false)
SET_PED_CONFIG_FLAG(mission_buddy.ped, PCF_RunFromFiresAndExplosions, FALSE)
set_ped_config_flag(mission_buddy.ped, PCF_CanActivateRagdollWhenVehicleUpsideDown, true)
SET_PED_CONFIG_FLAG(mission_buddy.ped, PCF_DisableExplosionReactions, true)
SET_PED_CONFIG_FLAG(mission_buddy.ped, PCF_DisableHurt, true)
set_ped_name_debug(mission_buddy.ped, mission_buddy.name)
IF mission_buddy.weapon != WEAPONTYPE_INVALID
give_weapon_to_ped(mission_buddy.ped, mission_buddy.weapon, infinite_ammo, false)
ENDIF
set_ped_seeing_range(mission_buddy.ped, 250.00)
set_ped_hearing_range(mission_buddy.ped, 250.00)
set_ped_id_range(mission_buddy.ped, 250.00)
endproc
PROC SET_START_VERSIONS_OF_BUDDIES()
IF NOT IS_PED_INJURED(cheng.ped)
SET_PED_COMPONENT_VARIATION(cheng.ped, PED_COMP_HEAD, 0, 0)
SET_PED_COMPONENT_VARIATION(cheng.ped, PED_COMP_BERD, 0, 0)
SET_PED_COMPONENT_VARIATION(cheng.ped, PED_COMP_HAIR, 0, 0)
SET_PED_COMPONENT_VARIATION(cheng.ped, PED_COMP_TORSO, 2, 0)
SET_PED_COMPONENT_VARIATION(cheng.ped, PED_COMP_LEG, 0, 0)
SET_PED_COMPONENT_VARIATION(cheng.ped, PED_COMP_HAND, 0, 0)
SET_PED_COMPONENT_VARIATION(cheng.ped, PED_COMP_FEET, 0, 0)
SET_PED_COMPONENT_VARIATION(cheng.ped, PED_COMP_TEETH, 0, 0)
SET_PED_COMPONENT_VARIATION(cheng.ped, PED_COMP_SPECIAL, 0, 0)
SET_PED_COMPONENT_VARIATION(cheng.ped, PED_COMP_SPECIAL2, 0, 0)
SET_PED_COMPONENT_VARIATION(cheng.ped, PED_COMP_DECL, 0, 0)
SET_PED_COMPONENT_VARIATION(cheng.ped, PED_COMP_JBIB, 1, 0)
SET_PED_PROP_INDEX(cheng.ped, ANCHOR_EYES,0)
ENDIF
IF NOT IS_PED_INJURED(translator.ped)
SET_PED_COMPONENT_VARIATION(translator.ped, PED_COMP_HEAD, 0, 0)
SET_PED_COMPONENT_VARIATION(translator.ped, PED_COMP_BERD, 0, 0)
SET_PED_COMPONENT_VARIATION(translator.ped, PED_COMP_HAIR, 0, 0)
SET_PED_COMPONENT_VARIATION(translator.ped, PED_COMP_TORSO, 1, 0)
SET_PED_COMPONENT_VARIATION(translator.ped, PED_COMP_LEG, 1, 0)
SET_PED_COMPONENT_VARIATION(translator.ped, PED_COMP_HAND, 0, 0)
SET_PED_COMPONENT_VARIATION(translator.ped, PED_COMP_FEET, 0, 0)
SET_PED_COMPONENT_VARIATION(translator.ped, PED_COMP_TEETH, 0, 0)
SET_PED_COMPONENT_VARIATION(translator.ped, PED_COMP_SPECIAL, 0, 0)
SET_PED_COMPONENT_VARIATION(translator.ped, PED_COMP_SPECIAL2, 1, 0)
SET_PED_COMPONENT_VARIATION(translator.ped, PED_COMP_DECL, 0, 0)
SET_PED_COMPONENT_VARIATION(translator.ped, PED_COMP_JBIB, 1, 0)
SET_PED_PROP_INDEX(translator.ped, ANCHOR_EYES,0)
ENDIF
ENDPROC
PROC INIT_CHENGS_CRAZY_CAR_DANCING(INT iTime = 4000)
eCDS_DanceState = eCDS_BaseAnim
sDanceMove = sCrazyDanceBase
iChengDanceTime = GET_GAME_TIMER() + iTime
iChengDanceStopTime = -1
ENDPROC
PROC HANDLE_CHENGS_CRAZY_CAR_DANCING()
IF NOT DOES_ENTITY_EXIST(cheng.ped)
EXIT
ELIF IS_PED_INJURED(cheng.ped)
EXIT
ENDIF
// don't dance after aproaching meth lab
IF get_to_meth_lab_status > 0
IF GET_SCRIPT_TASK_STATUS(cheng.ped, SCRIPT_TASK_PLAY_ANIM) = PERFORMING_TASK
CLEAR_PED_TASKS(cheng.ped)
ENDIF
EXIT
ENDIF
// if player has left car clear peds tasks if needed so Cheng can exit
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF GET_SCRIPT_TASK_STATUS(cheng.ped, SCRIPT_TASK_PLAY_ANIM) = PERFORMING_TASK
CLEAR_PED_TASKS(cheng.ped)
ENDIF
INIT_CHENGS_CRAZY_CAR_DANCING()
EXIT
ENDIF
ENDIF
// Only dance to certain music
IF GET_PLAYER_RADIO_STATION_GENRE() != ENUM_TO_INT(RADIO_GENRE_DANCE)
AND GET_PLAYER_RADIO_STATION_GENRE() != ENUM_TO_INT(RADIO_GENRE_POP)
IF iChengDanceStopTime = -1
iChengDanceStopTime = GET_GAME_TIMER() + 1000
ENDIF
ENDIF
IF iChengDanceStopTime != -1
IF GET_GAME_TIMER() > iChengDanceStopTime
IF GET_SCRIPT_TASK_STATUS(cheng.ped, SCRIPT_TASK_PLAY_ANIM) = PERFORMING_TASK
CLEAR_PED_TASKS(cheng.ped)
ENDIF
INIT_CHENGS_CRAZY_CAR_DANCING(2000)
EXIT
ENDIF
ENDIF
// don't dance if not in a vehicle
IF NOT IS_PED_SITTING_IN_ANY_VEHICLE(cheng.ped)
IF GET_SCRIPT_TASK_STATUS(cheng.ped, SCRIPT_TASK_PLAY_ANIM) = PERFORMING_TASK
CLEAR_PED_TASKS(cheng.ped)
ENDIF
INIT_CHENGS_CRAZY_CAR_DANCING()
EXIT
ELSE
// only dance in front passenger seat
IF GET_SEAT_PED_IS_IN(cheng.ped) != VS_FRONT_RIGHT
EXIT
ENDIF
// only dance in trevors truck
VEHICLE_INDEX viChengVeh = GET_VEHICLE_PED_IS_IN(cheng.ped)
IF NOT IS_VEHICLE_MODEL(viChengVeh, trevors_truck.model)
EXIT
ENDIF
ENDIF
IF GET_GAME_TIMER() < iChengDanceTime
//CPRINTLN(DEBUG_MISSION, "HANDLE_CHENGS_CRAZY_CAR_DANCING: timer ", iChengDanceTime - GET_GAME_TIMER())
EXIT
ENDIF
// If ped is in a vehicle play base anim
// after a timer, check where we are in the anim phase. If we're low or high, transition to a flavor anim
ANIMATION_FLAGS AF_LOCAL_FLAG = AF_LOOPING | AF_NOT_INTERRUPTABLE | AF_ABORT_ON_WEAPON_DAMAGE
FLOAT fChance
SWITCH eCDS_DanceState
CASE eCDS_BaseAnim
IF NOT IS_ENTITY_PLAYING_ANIM(cheng.ped, sCrazyDanceDict, sDanceMove)
TASK_PLAY_ANIM(cheng.ped, sCrazyDanceDict, sDanceMove, SLOW_BLEND_IN, SLOW_BLEND_OUT, DEFAULT, AF_LOCAL_FLAG)
ELSE
IF GET_ENTITY_ANIM_CURRENT_TIME(cheng.ped, sCrazyDanceDict, sDanceMove) >= 0.99
fChance = GET_RANDOM_FLOAT_IN_RANGE()
IF fChance < 0.5
fChance = GET_RANDOM_FLOAT_IN_RANGE()
IF fChance <= 0.6
sDanceMove = sCrazyDance1
ELIF fChance <= 0.9
sDanceMove = sCrazyDance2
ELSE
sDanceMove = sCrazyDance3
ENDIF
AF_LOCAL_FLAG = AF_DEFAULT | AF_NOT_INTERRUPTABLE | AF_ABORT_ON_WEAPON_DAMAGE
TASK_PLAY_ANIM(cheng.ped, sCrazyDanceDict, sDanceMove, SLOW_BLEND_IN, SLOW_BLEND_OUT, DEFAULT, AF_LOCAL_FLAG)
eCDS_DanceState = eCDS_FlavorAnim
ENDIF
CPRINTLN(DEBUG_MISSION, "HANDLE_CHENGS_CRAZY_CAR_DANCING: Choosing ", sDanceMove)
ENDIF
ENDIF
BREAK
CASE eCDS_FlavorAnim
IF IS_ENTITY_PLAYING_ANIM(cheng.ped, sCrazyDanceDict, sDanceMove)
IF GET_ENTITY_ANIM_CURRENT_TIME(cheng.ped, sCrazyDanceDict, sDanceMove) >= 0.99
sDanceMove = sCrazyDanceBase
CPRINTLN(DEBUG_MISSION, "HANDLE_CHENGS_CRAZY_CAR_DANCING: Going to ", sDanceMove)
TASK_PLAY_ANIM(cheng.ped, sCrazyDanceDict, sDanceMove, DEFAULT, SLOW_BLEND_OUT, DEFAULT, AF_LOCAL_FLAG)
eCDS_DanceState = eCDS_BaseAnim
ENDIF
ELSE
CPRINTLN(DEBUG_MISSION, "HANDLE_CHENGS_CRAZY_CAR_DANCING: We dropped out? Going to ", sDanceMove)
sDanceMove = sCrazyDanceBase
eCDS_DanceState = eCDS_BaseAnim
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC SETUP_ENEMY_VEHICLE(vehicle_struct &vsVeh, FLOAT fDirtLevel = 13.0)
vsVeh.veh = create_vehicle(vsVeh.model, vsVeh.pos, vsVeh.heading)
IF DOES_ENTITY_EXIST(vsVeh.veh)
SET_VEHICLE_DIRT_LEVEL(vsVeh.veh, fDirtLevel)
SET_VEHICLE_DOORS_LOCKED(vsVeh.veh, vehiclelock_locked)
vsVeh.blip = CREATE_BLIP_FOR_VEHICLE(vsVeh.veh, TRUE)
IF DOES_BLIP_EXIST(vsVeh.blip)
SET_BLIP_PRIORITY(vsVeh.blip, BLIPPRIORITY_HIGHEST)
ENDIF
SET_ENTITY_AS_MISSION_ENTITY(vsVeh.veh)
ENDIF
ENDPROC
// @SBA - if the passed in ped is damaged by the player whilst driving, kill the ped
PROC KILL_PED_HIT_BY_PLAYERS_VEHICLE(PED_INDEX piPed)
IF NOT DOES_ENTITY_EXIST(piPed)
EXIT
ENDIF
IF IS_ENTITY_DEAD(piPed)
EXIT
ENDIF
VEHICLE_INDEX viPlayersVehicle
IF get_current_player_vehicle(viPlayersVehicle)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(piPed, PLAYER_PED_ID())
CPRINTLN(DEBUG_MISSION, "KILL_PED_HIT_BY_PLAYERS_VEHICLE: Player's vehicle has damaged ped! Killing ped.")
APPLY_DAMAGE_TO_PED(piPed, 1000, TRUE)
ENDIF
ENDIF
ENDPROC
// break glass at Trevor's first position
PROC IN_CASE_OF_ATTACK_BREAK_GLASS()
// @SBA - crack the glass so Tevor gets a good first shot
// Just firing the shot was causing a crash - hoping to circumvent that with this approach
IF NOT bPlayerInOpeningCover
CPRINTLN(DEBUG_MISSION, "Breaking the window!")
object_index glass_window
IF NOT DOES_ENTITY_EXIST(glass_window)
glass_window = get_closest_object_of_type(<<1389.11, 3600.43, 39.51>>, 2.0, v_ret_ml_win5)
ENDIF
break_entity_glass(glass_window, (<<1388.92908, 3600.90259, 40.0>>), 1.0, (<<0.0, 1.0, 0.0>>), 1100.00, 1, TRUE)
// SHOOT_SINGLE_BULLET_BETWEEN_COORDS((<<1380.0, 3599.5, 38.2>>), (<<1388.92908, 3600.90259, 40.0>>), 0, TRUE)
SET_OBJECT_AS_NO_LONGER_NEEDED(glass_window)
bPlayerInOpeningCover = TRUE
ENDIF
ENDPROC
proc setup_enemy_in_vehicle(ped_structure &enemy, vehicle_index &mission_veh, vehicle_seat veh_seat = vs_driver)
//clear_area(enemy.pos, 2.0, true)
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME()
enemy.ped = create_ped_inside_vehicle(mission_veh, pedtype_mission, enemy.model, veh_seat)
set_ped_random_component_variation(enemy.ped)
set_ped_dies_when_injured(enemy.ped, true)
set_ped_as_enemy(enemy.ped, true)
set_entity_is_target_priority(enemy.ped, true)
set_ped_keep_task(enemy.ped, true)
SET_PED_CONFIG_FLAG(enemy.ped, PCF_KeepRelationshipGroupAfterCleanUp, true)
set_ped_config_flag(enemy.ped, PCF_DisableHurt, true)
give_weapon_to_ped(enemy.ped, enemy.weapon, infinite_ammo, true)
set_current_ped_weapon(enemy.ped, enemy.weapon, true)
SET_ENTITY_HEALTH(enemy.ped, enemy.health)
set_ped_max_health(enemy.ped, enemy.health)
if enemy.damaged_by_player
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(enemy.ped, true)
endif
if enemy.allow_body_armour
add_armour_to_ped(enemy.ped, 100)
endif
enemy.created = true
set_ped_name_debug(enemy.ped, enemy.name)
set_ped_hearing_range(enemy.ped, 250.00)
// @SBA - quick fix. Only blip the driver so we don't have multiple blips on the vehicle
IF veh_seat = vs_driver
enemy.blip = CREATE_BLIP_FOR_PED(enemy.ped, true)
set_blip_display(enemy.blip, DISPLAY_BLIP)
ENDIF
set_ped_can_evasive_dive(enemy.ped, true)
setup_relationship_enemy(enemy.ped, true)
set_ped_accuracy(enemy.ped, enemy.accuracy)
INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(enemy.ped)
endproc
func bool ped_structure_are_all_enemies_dead(ped_structure &enemy_array[], bool set_ped_no_longer_needed = true)
int peds_dead = 0
int k = 0
for k = 0 to (count_of(enemy_array) - 1)
if DOES_ENTITY_EXIST(enemy_array[k].ped)
if is_ped_injured(enemy_array[k].ped)
//INFORM_MISSION_STATS_OF_INCREMENT(CHI1_BODY_COUNT)
if set_ped_no_longer_needed
SET_PED_AS_NO_LONGER_NEEDED(enemy_array[k].ped)
endif
if does_blip_exist(enemy_array[k].blip)
REMOVE_BLIP(enemy_array[k].blip)
endif
if is_special_ability_active(player_id())
//INFORM_STAT_CHINESE_ONE_SPECIAL_ABILITY_KILL()
endif
//INFORM_STAT_CHINESE_ONE_ENEMY_KILLED()
peds_dead ++
endif
else
if enemy_array[k].created
peds_dead ++
endif
endif
endfor
if peds_dead = count_of(enemy_array)
return TRUE
endif
return FALSE
endfunc
//*****call this function underneath ped_structure_are_all_enemies_dead
func bool ped_structure_are_specific_number_enemies_dead(ped_structure &enemy_array[], int number_of_dead_peds)
int peds_dead = 0
int k = 0
for k = 0 to count_of(enemy_array) - 1
if enemy_array[k].created
if is_ped_injured(enemy_array[k].ped)
peds_dead++
endif
endif
endfor
if peds_dead >= number_of_dead_peds
return TRUE
endif
return FALSE
endfunc
func int ped_structure_get_total_number_of_enemies_dead(ped_structure &enemy_array[])
int peds_dead = 0
int k = 0
// printstring("peds dead: ")
// printint(peds_dead)
// printnl()
for k = 0 to count_of(enemy_array) - 1
if enemy_array[k].created
if is_ped_injured(enemy_array[k].ped)
// printint(k)
// printnl()
peds_dead++
endif
endif
endfor
return peds_dead
endfunc
func bool is_coord_in_area_2d(vector test_coord, vector top_left, vector bottom_right)
vector tl
vector br
if top_left.x < bottom_right.x
tl.x = top_left.x
br.x = bottom_right.x
else
tl.x = bottom_right.x
br.x = top_left.x
endif
if top_left.y < bottom_right.y
tl.y = top_left.y
br.y = bottom_right.y
else
tl.y = bottom_right.y
br.y = top_left.y
endif
if (test_coord.x > tl.x) and (test_coord.x < br.x)
if (test_coord.y > tl.y) and (test_coord.y < br.y)
return true
endif
endif
return false
endfunc
func bool has_ped_been_harmed(ped_index &mission_ped, int &original_health)
int current_health
if DOES_ENTITY_EXIST(mission_ped)
if not is_ped_injured(mission_ped)
current_health = GET_ENTITY_HEALTH(mission_ped)
if HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(mission_ped , player_ped_id())
or (current_health < original_health)
or is_ped_responding_to_event(mission_ped, EVENT_DAMAGE)
return true
endif
else
return true
endif
endif
return false
endfunc
func bool has_peds_been_harmed(ped_structure &ped_struct[])
for i = 0 to (count_of(ped_struct) - 1)
if has_ped_been_harmed(ped_struct[i].ped, ped_struct[i].health)
return true
endif
endfor
return false
endfunc
func bool has_player_antagonised_ped(ped_index &mission_ped, float distance, bool distance_check_on = true)
if not is_ped_injured(mission_ped)
if get_distance_between_coords(get_entity_coords(player_ped_id()), get_entity_coords(mission_ped)) < distance
//if has_char_spotted_char(this_ped, player_char_id())
if CAN_PED_SEE_HATED_PED(mission_ped, PLAYER_PED_ID())
IF IS_ped_ARMED(PLAYER_ped_ID(), WF_INCLUDE_MELEE|WF_INCLUDE_PROJECTILE|WF_INCLUDE_GUN)
if IS_PLAYER_TARGETTING_ENTITY(player_id(), mission_ped)
return TRUE
endif
if is_player_free_aiming_at_entity(player_id(), mission_ped)
return TRUE
endif
endif
endif
if is_ped_shooting(player_ped_id())
return true
endif
endif
if is_bullet_in_area(get_entity_coords(mission_ped), 4.0)
return true
endif
if distance_check_on
if get_distance_between_coords(get_entity_coords(player_ped_id()), get_entity_coords(mission_ped)) < 1.5
return true
endif
endif
endif
return FALSE
endfunc
func bool is_player_targeting_ped(ped_index &mission_ped)
if not is_ped_injured(mission_ped)
if is_player_targetting_entity(player_id(), mission_ped)
or is_player_free_aiming_at_entity(player_id(), mission_ped)
return true
endif
endif
return false
endfunc
func bool is_player_targeting_any_peds(ped_structure &mission_ped_array[])
int k = 0
for k = 0 to count_of(mission_ped_array) - 1
if is_player_targeting_ped(mission_ped_array[k].ped)
return true
endif
endfor
return false
endfunc
func bool has_vehicle_been_harmed(vehicle_index &mission_vehicle, int &original_car_health)
int vehicle_health
if DOES_ENTITY_EXIST(mission_vehicle)
if is_vehicle_driveable(mission_vehicle)
vehicle_health = GET_ENTITY_HEALTH(mission_vehicle)
if get_vehicle_petrol_tank_health(mission_vehicle) < original_car_health
or get_vehicle_engine_health(mission_vehicle) < original_car_health
or HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(mission_vehicle, player_ped_id())
or vehicle_health < original_car_health
return true
endif
else
return true
endif
endif
return false
endfunc
func bool has_vehicles_been_harmed(vehicle_struct &veh_struct[])
for i = 0 to (count_of(veh_struct) - 1)
if has_vehicle_been_harmed(veh_struct[i].veh, veh_struct[i].health)
return true
endif
endfor
return false
endfunc
func bool is_ped_at_coords(ped_index &mission_ped, vector pos, vector locate_size)
if not is_ped_injured(mission_ped)
if IS_ENTITY_AT_COORD(mission_ped, pos, locate_size, false, true)
return true
endif
endif
return false
endfunc
func bool is_ped_in_angled_area_lk(ped_index &mission_ped, vector vec1, vector vec2, float distance_from_point)
if not is_ped_injured(mission_ped)
if IS_ENTITY_IN_ANGLED_AREA(mission_ped, vec1, vec2, distance_from_point)
return true
endif
endif
return false
endfunc
func bool is_vehicle_in_angled_area_lk(vehicle_index &mission_vehicle, vector vec1, vector vec2, float distance_from_point)
if DOES_ENTITY_EXIST(mission_vehicle)
if is_vehicle_driveable(mission_vehicle)
if is_point_in_angled_area(GET_ENTITY_COORDS(mission_vehicle), vec1, vec2, distance_from_point)
return true
endif
endif
endif
return false
endfunc
func bool is_ped_in_specific_room(ped_index mission_ped, vector interior_pos, string room_name)
interior_instance_index interior
interior_instance_index ped_current_interior
int ped_current_room_hash_key
int room_hash_key
if not is_ped_injured(mission_ped)
interior = get_interior_at_coords(interior_pos)
ped_current_interior = GET_INTERIOR_FROM_ENTITY(mission_ped)
if not (interior = null)
if (interior = ped_current_interior)
ped_current_room_hash_key = GET_KEY_FOR_ENTITY_IN_ROOM(mission_ped)
room_hash_key = get_hash_key(room_name)
if (ped_current_room_hash_key != 0)
if ped_current_room_hash_key = room_hash_key
return true
endif
endif
endif
endif
endif
return false
endfunc
//func bool is_ped_inside_interior(ped_index mission_ped, vector interior_pos)
//
// interior_instance_index interior
// interior_instance_index mission_ped_interior
//
// interior = get_interior_at_coords(interior_pos)
// mission_ped_interior = GET_INTERIOR_FROM_ENTITY(mission_ped)
//
// if not (mission_ped_interior = null)
// if (mission_ped_interior = interior)
// return true
// endif
// endif
//
// return false
//
//endfunc
func bool is_ped_inside_interior(ped_index mission_ped, vector interior_pos, string interior_name)
interior_instance_index interior
interior_instance_index mission_ped_interior
interior = get_interior_at_coords_with_type(interior_pos, interior_name)
mission_ped_interior = GET_INTERIOR_FROM_ENTITY(mission_ped)
if not (mission_ped_interior = null)
if (mission_ped_interior = interior)
return true
endif
endif
return false
endfunc
func bool is_vehicle_stuck_every_check(vehicle_index &vehicle)
if DOES_ENTITY_EXIST(vehicle)
if is_vehicle_driveable(vehicle)
if is_vehicle_stuck_timer_up(vehicle, VEH_STUCK_ON_ROOF, ROOF_TIME)
or is_vehicle_stuck_timer_up(vehicle, VEH_STUCK_JAMMED, JAMMED_TIME)
or is_vehicle_stuck_timer_up(vehicle, VEH_STUCK_HUNG_UP, HUNG_UP_TIME)
or is_vehicle_stuck_timer_up(vehicle, VEH_STUCK_ON_SIDE, SIDE_TIME)
return true
endif
endif
endif
return false
endfunc
func bool allow_dialogue_to_continue(ped_index mission_ped, vehicle_index mission_veh, int instruct_text_time, bool allow_wanted_level_check = false)
if not is_ped_injured(mission_ped)
if is_ped_in_group(mission_ped)
if allow_wanted_level_check
if is_player_wanted_level_greater(player_id(), 0)
instruct_text_time = get_game_timer()
return false
endif
//if you get a wanted level and the god text renders. If you then lose the wanted level and get
//instruction text this ensures the instruction text is rendered for 3 seconds before the
//dialogue is unpaused
if not lk_timer(instruct_text_time, 3000)
return false
endif
endif
if (is_ped_on_foot(mission_ped) and is_ped_on_foot(player_ped_id()))
return true
endif
if does_entity_exist(mission_veh)
if is_vehicle_driveable(mission_veh)
if (is_ped_sitting_in_vehicle(mission_ped, mission_veh) and is_ped_sitting_in_vehicle(player_ped_id(), mission_veh))
return true
endif
endif
endif
endif
endif
return false
endfunc
proc repostion_players_last_vehicle(vehicle_index &mission_veh, vector area_pos_check, vector area_dimensions, vector veh_pos, float veh_heading)
mission_veh = get_players_last_vehicle()
if does_entity_exist(mission_veh)
if is_vehicle_driveable(mission_veh)
if not is_big_vehicle(mission_veh)
if not (get_entity_model(mission_veh) = taxi)
if is_entity_at_coord(mission_veh, area_pos_check, area_dimensions)
if not is_entity_a_mission_entity(mission_veh)
set_entity_as_mission_entity(mission_veh)
endif
if not is_vehicle_in_players_garage(mission_veh, get_current_player_ped_enum(), false)
clear_area(veh_pos, 10.0, true)
set_entity_coords(mission_veh, veh_pos)
set_entity_heading(mission_veh, veh_heading)
set_vehicle_on_ground_properly(mission_veh)
endif
endif
endif
endif
endif
endif
endproc
func bool is_players_last_vehicle_present_and_acceptable(vehicle_index player_vehicle, vector pos, int number_of_seats, vector secondary_pos, float secondary_heading)
if does_entity_exist(player_vehicle)
if is_vehicle_driveable(player_vehicle)
if is_entity_at_coord(player_vehicle, pos, <<10.0, 10.0, 10.0>>, false)//<<25.0, 25.0, 10.0>>
INT iNumVehSeats = get_vehicle_max_number_of_passengers(player_vehicle)
CPRINTLN(DEBUG_MISSION, "Number of passenger seats = ", iNumVehSeats)
if iNumVehSeats >= number_of_seats
return true
else
clear_area(secondary_pos, 10.0, true)
set_entity_coords(player_vehicle, secondary_pos)
set_entity_heading(player_vehicle, secondary_heading)
set_vehicle_engine_on(player_vehicle, false, true)
set_vehicle_on_ground_properly(player_vehicle)
set_vehicle_as_no_longer_needed(player_vehicle)
endif
endif
endif
endif
CPRINTLN(DEBUG_MISSION,"Need a different vehicle")
return false
endfunc
func bool is_enemy_near_player(ped_structure &mission_struct[], float distance)
for i = 0 to count_of(mission_struct) - 1
if not is_ped_injured(mission_struct[i].ped)
if get_distance_between_coords(get_entity_coords(player_ped_id()), get_entity_coords(mission_struct[i].ped)) < distance
return true
endif
endif
endfor
return false
endfunc
func bool is_direction_stick_pushed()
int left_stick_x
int left_stick_y
int right_stick_x
int right_stick_y
int stick_dead_zone = 127
GET_CONTROL_VALUE_OF_ANALOGUE_STICKS(left_stick_x, left_stick_y, right_stick_x, right_stick_y)
IF NOT IS_LOOK_INVERTED()
right_stick_y *= -1
ENDIF
IF (left_stick_y > (STICK_DEAD_ZONE + 28))
OR (left_stick_y < (STICK_DEAD_ZONE - 28))
return true
endif
return false
endfunc
//PARAM NOTES:
//PURPOSE: If a players fires a weapon during a cutscene and you want to ensure he has the weapon
// and enough ammo during the cutscene. Also for the ammo to be reset at the end so that when the
//player goes back into gameplay he has the same amount of ammo or decent amount.
//At the end of a cutscene ensure you set the players ammo to ammo_in_players_weapon
proc setup_players_weapon_for_cutscene(weapon_type mission_weapon, int ammo_amount, int &ammo_in_players_weapon)
if not has_ped_got_weapon(player_ped_id(), mission_weapon)
ammo_in_players_weapon = ammo_amount
give_weapon_to_ped(player_ped_id(), mission_weapon, ammo_in_players_weapon, true, true)
else
ammo_in_players_weapon = get_ammo_in_ped_weapon(player_ped_id(), mission_weapon)
weapon_type players_weapon
get_current_ped_weapon(player_ped_id(), players_weapon)
if players_weapon != mission_weapon
set_current_ped_weapon(player_ped_id(), mission_weapon, true)
endif
if ammo_in_players_weapon < ammo_amount
ammo_in_players_weapon = ammo_amount
set_ped_ammo(player_ped_id(), mission_weapon, ammo_in_players_weapon)
endif
endif
endproc
/// PURPOSE:
/// Sorts the triggered label array such that all the empty elements are at the end.
PROC REMOVE_LABEL_ARRAY_SPACES()
INT k = 0
REPEAT (COUNT_OF(i_triggered_text_hashes) - 1) k
IF i_triggered_text_hashes[k] = 0
IF i_triggered_text_hashes[k+1] != 0
i_triggered_text_hashes[k] = i_triggered_text_hashes[k+1]
i_triggered_text_hashes[k+1] = 0
ENDIF
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Finds the array index of a particular triggered label, or -1 if the label hasn't been added.
FUNC INT GET_LABEL_INDEX(INT i_label_hash)
INT k = 0
REPEAT COUNT_OF(i_triggered_text_hashes) k
IF i_triggered_text_hashes[k] = 0 //We've reached the end of the filled section of the array, no need to continue.
RETURN -1
ELIF i_triggered_text_hashes[k] = i_label_hash
RETURN k
ENDIF
ENDREPEAT
RETURN -1
ENDFUNC
/// PURPOSE:
/// Returns TRUE if the given label has been triggered.
FUNC BOOL HAS_LABEL_BEEN_TRIGGERED(STRING str_label)
RETURN (GET_LABEL_INDEX(GET_HASH_KEY(str_label)) != -1)
ENDFUNC
/// PURPOSE:
/// Adds/removes a text label to/from the list of labels that have been triggered.
PROC SET_LABEL_AS_TRIGGERED(STRING str_label, BOOL b_trigger)
INT i_hash = GET_HASH_KEY(str_label)
INT k = 0
IF b_trigger
BOOL b_added = FALSE
WHILE NOT b_added AND k < COUNT_OF(i_triggered_text_hashes)
IF i_triggered_text_hashes[k] = i_hash //The label is already in the array, don't add it again.
b_added = TRUE
ELIF i_triggered_text_hashes[k] = 0
i_triggered_text_hashes[k] = i_hash
b_added = TRUE
ENDIF
k++
ENDWHILE
#IF IS_DEBUG_BUILD
IF NOT b_added
SCRIPT_ASSERT("SET_LABEL_AS_TRIGGERED: Failed to add label, array is full.")
ENDIF
#ENDIF
ELSE
INT i_index = GET_LABEL_INDEX(i_hash)
IF i_index != -1
i_triggered_text_hashes[i_index] = 0
REMOVE_LABEL_ARRAY_SPACES()
ENDIF
ENDIF
ENDPROC
PROC CLEAR_TRIGGERED_LABELS()
INT k = 0
REPEAT COUNT_OF(i_triggered_text_hashes) k
i_triggered_text_hashes[k] = 0
ENDREPEAT
ENDPROC
proc flash_ambient_enemy_blips(int &flash_timer)
if allow_ambient_enemy_blips_to_flash
for i = 0 to count_of(ambient_enemy) - 1
if not is_ped_injured(ambient_enemy[i].ped)
if get_distance_between_coords(get_entity_coords(player_ped_id()), get_entity_coords(ambient_enemy[i].ped)) > 50.00
if does_blip_exist(ambient_enemy[i].blip)
remove_blip(ambient_enemy[i].blip)
endif
endif
ELSE
if does_blip_exist(ambient_enemy[i].blip)
remove_blip(ambient_enemy[i].blip)
endif
endif
endfor
if lk_timer(flash_timer, 500)
for i = 0 to count_of(ambient_enemy) - 1
if does_blip_exist(ambient_enemy[i].blip)
if display_blips_as_friendly
set_blip_as_friendly(ambient_enemy[i].blip, true)
else
set_blip_as_friendly(ambient_enemy[i].blip, false)
endif
endif
endfor
if display_blips_as_friendly
display_blips_as_friendly = false
else
display_blips_as_friendly = true
endif
flash_timer = get_game_timer()
endif
endif
endproc
func bool is_player_in_cover_pos(cover_point_struct cover_data)
if is_entity_at_coord(player_ped_id(), cover_data.pos, <<1.0, 1.0, 2.0>>)
if is_ped_in_cover(player_ped_id())
return true
endif
endif
return false
endfunc
/// PURPOSE:
/// Checks if the player is currently hanging around where the given ped is trying to get to. This is useful for checking if peds
/// playing synced scenes need to break into AI due to the player getting in the way.
/// PARAMS:
/// ped - The ped moving towards the destination.
/// v_destination - The destination
/// f_max_dist_before_check - The ped must be within this distance of the destination before we start checking what the player is doing.
/// b_player_must_be_in_cover - If TRUE then the player must be in cover for them to be considered in the way.
FUNC BOOL IS_PLAYER_STEALING_PEDS_DESTINATION(PED_INDEX ped, VECTOR destination, FLOAT distance_check, BOOL player_must_be_in_cover = true)
IF NOT IS_PED_INJURED(ped)
VECTOR player_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
VECTOR ped_pos = GET_ENTITY_COORDS(ped)
FLOAT dist_from_ped_to_dest = VDIST(ped_pos, destination)
FLOAT dist_from_player_to_dest = VDIST(player_pos, destination)
IF dist_from_ped_to_dest < distance_check
//CPRINTLN(DEBUG_MISSION, "IS_PLAYER_STEALING_PEDS_DESTINATION: test 0")
IF dist_from_player_to_dest < dist_from_ped_to_dest
and is_entity_at_coord(player_ped_id(), destination, <<1.0, 1.0, 2.0>>)
CPRINTLN(DEBUG_MISSION, "IS_PLAYER_STEALING_PEDS_DESTINATION: test 1")
IF player_must_be_in_cover
IF IS_PED_IN_COVER(PLAYER_PED_ID())
//or is_ped_going_into_cover(player_ped())
CPRINTLN(DEBUG_MISSION, "IS_PLAYER_STEALING_PEDS_DESTINATION: test 2")
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
//put_ped_into
proc get_buddy_into_cover(ped_index &mission_ped, cover_point_struct &first_cover_data, cover_point_struct &second_cover_data, bool &go_to_main_cover_point, bool &refresh_task)
vector cover_pos
if not is_ped_in_cover(mission_ped)
if go_to_main_cover_point
cover_pos = first_cover_data.pos
if IS_PLAYER_STEALING_PEDS_DESTINATION(mission_ped, first_cover_data.pos, 3.0, false)
cover_pos = second_cover_data.pos
refresh_task = true
go_to_main_cover_point = false
exit
endif
else
cover_pos = second_cover_data.pos
if IS_PLAYER_STEALING_PEDS_DESTINATION(mission_ped, second_cover_data.pos, 3.0, false)
cover_pos = first_cover_data.pos
refresh_task = true
go_to_main_cover_point = true
exit
endif
endif
if is_entity_at_coord(mission_ped, cover_pos, <<2.0, 2.0, 2.0>>)
IF (NOT IS_PED_IN_COVER(mission_ped)
AND NOT IS_PED_GOING_INTO_COVER(mission_ped)
AND GET_SCRIPT_TASK_STATUS(mission_ped, SCRIPT_TASK_PUT_PED_DIRECTLY_INTO_COVER) != PERFORMING_TASK
and GET_SCRIPT_TASK_STATUS(mission_ped, SCRIPT_TASK_SEEK_COVER_TO_COVER_POINT) != PERFORMING_TASK
and GET_SCRIPT_TASK_STATUS(mission_ped, SCRIPT_TASK_SEEK_COVER_TO_COORDS) != performing_task)
or refresh_task
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(mission_ped, TRUE)
TASK_PUT_PED_DIRECTLY_INTO_COVER(mission_ped, cover_pos, -1, FALSE, 0, false, false, null, true)
refresh_task = false
//script_assert("test 1")
endif
else
if get_script_task_status(mission_ped, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) != performing_task
or refresh_task
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(mission_ped, TRUE)
task_follow_nav_mesh_to_coord(mission_ped, cover_pos, pedmove_run, -1)
refresh_task = false
//script_assert("test 3")
endif
ENDIF
endif
endproc
PROC EQUIP_BEST_PLAYER_WEAPON(ped_index mission_ped, BOOL bForceIntoHand = true)
IF NOT IS_PED_INJURED(mission_ped)
WEAPON_TYPE bestWeapon = GET_BEST_PED_WEAPON(mission_ped)
IF bestWeapon != WEAPONTYPE_UNARMED
SET_CURRENT_PED_WEAPON(mission_ped, bestWeapon, bForceIntoHand)
ENDIF
ENDIF
ENDPROC
proc setup_player_fail_weapon(ped_index mission_ped)
weapon_type players_weapon
players_weapon = Get_Fail_Weapon(enum_to_int(get_player_ped_enum(mission_ped)))
if players_weapon != WEAPONTYPE_INVALID
and players_weapon != WEAPONTYPE_UNARMED
set_current_ped_weapon(mission_ped, players_weapon, true)
endif
endproc
proc setup_weapon_for_ped(ped_index mission_ped, weapon_type ped_weapon, int num_of_bullets, bool force_weapon_into_hand = true, bool equip_weapon = true, bool equipe_best_weapon = true)
IF not HAS_PED_GOT_FIREARM(mission_ped, false)
give_weapon_to_ped(mission_ped, ped_weapon, num_of_bullets, force_weapon_into_hand, equip_weapon)
exit
else
weapon_type players_weapon
if equipe_best_weapon
EQUIP_BEST_PLAYER_WEAPON(mission_ped, force_weapon_into_hand)
get_current_ped_weapon(mission_ped, players_weapon)
else
players_weapon = Get_Fail_Weapon(enum_to_int(get_player_ped_enum(mission_ped)))
if players_weapon = WEAPONTYPE_INVALID
or players_weapon = WEAPONTYPE_UNARMED
if not HAS_PED_GOT_WEAPON(mission_ped, ped_weapon)
give_weapon_to_ped(mission_ped, ped_weapon, num_of_bullets, force_weapon_into_hand, equip_weapon)
exit
else
players_weapon = ped_weapon
endif
//script_assert("test 0")
endif
endif
// printint(enum_to_int(players_weapon))
// printnl()
// printint(enum_to_int(weapontype_pistol))
// printnl()
// script_assert("test 1")
if players_weapon = WEAPONTYPE_GRENADELAUNCHER
or players_weapon = WEAPONTYPE_RPG
if get_ammo_in_ped_weapon(mission_ped, players_weapon) < 5
set_ped_ammo(mission_ped, players_weapon, 5)
endif
else
if get_ammo_in_ped_weapon(mission_ped, players_weapon) < num_of_bullets
set_ped_ammo(mission_ped, players_weapon, num_of_bullets)
endif
endif
set_current_ped_weapon(mission_ped, players_weapon, force_weapon_into_hand)
endif
endproc
func int get_first_alive_ped(ped_structure &mission_ped[])
int k
for k = 0 to count_of(mission_ped) - 1
if not is_ped_injured(mission_ped[i].ped)
return k
endif
endfor
return -1
endfunc
func bool dialogue_monitoring_system(blip_index target_blip)
if does_blip_exist(target_blip)
// Unpause conversations if the locate blip is active
IF IS_CELLPHONE_CONVERSATION_PAUSED()
PAUSE_CELLPHONE_CONVERSATION(FALSE)
ELIF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(false)
endif
if not is_any_text_being_displayed(locates_data)
return true
endif
// If there's no blip, is there locate-related text on screen?
ELIF IS_ANY_TEXT_BEING_DISPLAYED(locates_data)
// then pause any covnersation
if IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_CELLPHONE_CONVERSATION_PAUSED()
PAUSE_CELLPHONE_CONVERSATION(TRUE)
ELIF not IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(true)
endif
endif
ELSE
// If there's still no locate blip, but the text is gone (or ignored), unpause the conversation so it can continue
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF IS_CELLPHONE_CONVERSATION_PAUSED()
PAUSE_CELLPHONE_CONVERSATION(FALSE)
ELIF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(false)
ENDIF
ENDIF
endif
return false
endfunc
//PURPOSE: repositions the players last vehicle if it exists via calling GET_MISSION_START_VEHICLE_INDEX()
// and sets the vehicle as a mission entity so that clear area will not clear it. Remember to
proc reposition_players_last_vehicle(vector car_pos, float car_heading)
vehicle_index players_last_car
players_last_car = GET_MISSION_START_VEHICLE_INDEX()
if does_entity_exist(players_last_car)
if is_vehicle_driveable(players_last_car)
SET_ENTITY_AS_MISSION_ENTITY(players_last_car, true, true)
clear_area(car_pos, 5.0, true)
set_entity_coords(players_last_car, car_pos)
set_entity_heading(players_last_car, car_heading)
set_vehicle_on_ground_properly(players_last_car)
SET_VEHICLE_DOORS_SHUT(players_last_car)
set_entity_as_mission_entity(players_last_car)
// @SBA - make sure we have anims for whatever the vehicle is
request_vehicle_asset(GET_ENTITY_MODEL(players_last_car))
endif
endif
endproc
// @SBA - kill enemies that have gotten away from the mission
PROC KILL_ANY_ERRANT_ENEMY(PED_STRUCTURE &psPedInfo[])
INT idx
BOOL bYouDieNow = FALSE
FOR idx = 0 TO COUNT_OF(psPedInfo) - 1
IF DOES_ENTITY_EXIST(psPedInfo[idx].ped)
IF NOT IS_PED_INJURED(psPedInfo[idx].ped)
// do we want to check this? All examples so far, the ped was on foot.
IF NOT IS_PED_IN_ANY_VEHICLE(psPedInfo[idx].ped)
VECTOR vPedCoords = GET_ENTITY_COORDS(psPedInfo[idx].ped, FALSE)
// If ped is far enough from meth lab and from player, he dies
IF GET_DISTANCE_BETWEEN_COORDS(vArrivalMethLab, vPedCoords) > 200.0
AND distance_from_player_to_ped(psPedInfo[idx].ped) > 50.0
bYouDieNow = TRUE
ELSE
// see if enemy is below ground
IF vPedCoords.z < 29.0
bYouDieNow = TRUE
ENDIF
ENDIF
IF bYouDieNow
// remove flag
IF psPedInfo[idx].bRushInside
psPedInfo[idx].bRushInside = FALSE
ENDIF
// kill him
EXPLODE_PED_HEAD(psPedInfo[idx].ped)
APPLY_DAMAGE_TO_PED(psPedInfo[idx].ped, 1000, FALSE)
CPRINTLN(DEBUG_MISSION,"KILL_ANY_ERRANT_ENEMY: *** ENEMY ", psPedInfo[idx].name," HAS BUGGERED OFF. KILLING HIM! ***.")
ENDIF
ENDIF
ENDIF
ENDIF
ENDFOR
ENDPROC
//Focus hint cam variables
VECTOR vEntityHint = <<-0.5, -1.00, 0.40>>
FLOAT fHintScalar = 0.41
FLOAT fHintHOffset = 0.12
FLOAT fHintVOffset = 0.11
//FLOAT fHintPitch = 0.0
FLOAT fHintFOV = 40.0
BOOL bResetFocusCam = FALSE
PROC HANDLE_HINT_CAM_FOR_LEAD_IN()
IF bResetFocusCam
IF IS_GAMEPLAY_HINT_ACTIVE()
STOP_GAMEPLAY_HINT(TRUE)
ENDIF
SET_GAMEPLAY_ENTITY_HINT( oiIceBox, vEntityHint, TRUE, -1, 2500 )
//SET_GAMEPLAY_HINT_BASE_ORBIT_PITCH_OFFSET( fHintPitch )
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET( fHintHOffset )
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_VERTICAL_OFFSET( fHintVOffset )
SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR( fHintScalar )
SET_GAMEPLAY_HINT_FOV( fHintFOV )
bResetFocusCam = FALSE
ENDIF
// exit if we're coming from a shit skip, as the Ice box won't exist
// and we won't need the hint cam (unless I'll need to show the lead in - I sure hope not)
IF bOutroShitSkip
EXIT
ENDIF
// is player in lead in trigger
IF IS_PLAYER_IN_TRIGGER_BOX(tbIceBoxCameraVol)
// exit if player is also inside
IF IS_PED_IN_SPECIFIC_ROOM(PLAYER_PED_ID(), (<<1392.3, 3602.9, 35.0>>), "v_39_ShopRm")
EXIT
ENDIF
IF NOT IS_GAMEPLAY_HINT_ACTIVE()
SET_GAMEPLAY_ENTITY_HINT(oiIceBox, vEntityHint, TRUE, -1, 2500)
SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(fHintScalar)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(fHintHOffset)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_VERTICAL_OFFSET(fHintVOffset)
SET_GAMEPLAY_HINT_FOV(fHintFOV)
SET_GAMEPLAY_HINT_CAMERA_BLEND_TO_FOLLOW_PED_MEDIUM_VIEW_MODE(TRUE)
ENDIF
ELSE
IF IS_GAMEPLAY_HINT_ACTIVE()
STOP_GAMEPLAY_HINT()
ENDIF
ENDIF
// if player is in cutscene trigger, halt him there
// IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
// IF IS_GAMEPLAY_HINT_ACTIVE()
// IF IS_PLAYER_IN_TRIGGER_BOX(tbIceBoxInnerVol)
// CPRINTLN(DEBUG_MISSION, "HANDLE_HINT_CAM_FOR_LEAD_IN: Locking player")
// SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
// IF NOT IS_ENTITY_DEAD(translator.ped)
// TASK_TURN_PED_TO_FACE_ENTITY(PLAYER_PED_ID(), translator.ped)
// ENDIF
// ENDIF
// ENDIF
// ENDIF
ENDPROC
// ***********************************************************************************
// @SBA - Chef Abandonment functions
// ***********************************************************************************
// @SBA - iterate over ped array and see if any ped is in the given room
FUNC BOOL IS_ANY_PED_IN_SPECIFIC_ROOM(PED_STRUCTURE &psPedInfo[], VECTOR interior_pos, STRING room_name)
INT idx
FOR idx = 0 TO COUNT_OF(psPedInfo) - 1
// Is enemy rush flag set (so we can ignore the others)
IF psPedInfo[idx].bRushInside
//
IF is_ped_in_specific_room(psPedInfo[idx].ped, interior_pos, room_name)
RETURN TRUE
ENDIF
ENDIF
ENDFOR
RETURN FALSE
ENDFUNC
// @SBA - play dialogue if player is close enough
FUNC BOOL PLAY_CHEF_CONVERSATION(STRING sChefConv)
// is player close enough
IF distance_from_player_to_ped(buddy.ped) < 100
IF CREATE_CONVERSATION(scripted_speech[0], "methaud", sChefConv, CONV_PRIORITY_HIGH)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
// @SBA - check for abandonment with specifics for the opening fight
FUNC BOOL HAS_PLAYER_ABANDONED_CHEF_WAVE_0()
// See if player has left the upstairs rooms
IF NOT IS_PED_IN_SPECIFIC_ROOM(PLAYER_PED_ID(), (<<1392.2, 3614.1, 39.0>>), "v_39_UpperRm1")
AND NOT IS_PED_IN_SPECIFIC_ROOM(PLAYER_PED_ID(), (<<1397.1, 3608.4, 38.5>>), "v_39_UpperRm2")
AND NOT IS_PED_IN_SPECIFIC_ROOM(PLAYER_PED_ID(), (<<1390.91, 3608.21, 38.91>>), "v_39_UpperRm3")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
// @SBA - check for abandonment with specifics for the back stairs fight
FUNC BOOL HAS_PLAYER_ABANDONED_CHEF_WAVE_0_PART2()
IF distance_from_player_to_ped(buddy.ped) > 17.0
RETURN TRUE
ENDIF
IF IS_PLAYER_IN_TRIGGER_BOX(tbOutsideMainGatesVolume)
RETURN TRUE
ENDIF
IF IS_PLAYER_IN_TRIGGER_BOX(tbBackRoofVolume)
RETURN TRUE
ENDIF
IF IS_PLAYER_IN_TRIGGER_BOX(tbBackUpstairsRoomVolume)
RETURN TRUE
ENDIF
IF IS_PED_IN_SPECIFIC_ROOM(PLAYER_PED_ID(), (<<1390.91, 3608.21, 38.91>>), "v_39_UpperRm3")
RETURN TRUE
ENDIF
IF IS_PED_IN_SPECIFIC_ROOM(PLAYER_PED_ID(), (<<1393.0, 3612.2, 35.0>>), "v_39_StairsRm")
RETURN TRUE
ENDIF
IF IS_PED_IN_SPECIFIC_ROOM(PLAYER_PED_ID(), (<<1392.3, 3602.9, 35.0>>), "v_39_ShopRm")
RETURN TRUE
ENDIF
// Overlaps with tbBackUpstairsRoomVolume, added for fringes
IF IS_PED_IN_SPECIFIC_ROOM(PLAYER_PED_ID(), (<<1397.1, 3608.4, 38.5>>), "v_39_UpperRm2")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
// @SBA - check for abandonment with specifics for the back roof fight
FUNC BOOL HAS_PLAYER_ABANDONED_CHEF_WAVE_2()
IF NOT IS_PLAYER_IN_TRIGGER_BOX(tbBackFullRoofVolume)
AND NOT IS_PED_IN_SPECIFIC_ROOM(PLAYER_PED_ID(), (<<1397.1, 3608.4, 38.5>>), "v_39_UpperRm2")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
// @SBA - check for abandonment with specifics for the (final) liquor store fight
FUNC BOOL HAS_PLAYER_ABANDONED_CHEF_WAVE_3()
IF NOT IS_PED_IN_SPECIFIC_ROOM(PLAYER_PED_ID(), (<<1392.3, 3602.9, 35.0>>), "v_39_ShopRm")
AND NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), (<<1394.18225, 3599.79858, 34.01332>>), (<<5.0, 5.0, 2.0>>))
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
// @SBA - displays the passed message string if it hasn't been displayed before, and no text is on screen
PROC DISPLAY_MESSAGE_WHEN_ABLE(STRING sMessage)
IF NOT HAS_LABEL_BEEN_TRIGGERED(sMessage)
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(LOCATES_DATA)
PRINT_NOW(sMessage, DEFAULT_GOD_TEXT_TIME, 1)
SET_LABEL_AS_TRIGGERED(sMessage, TRUE)
ENDIF
ENDIF
ENDPROC
// @SBA - displays a message to get back to Chef if you get too far away. Repeats after a timer.
PROC HANDLE_ABANDONMENT_MESSAGE(BOOL bIsChefAbandoned)
IF bIsChefAbandoned
DISPLAY_MESSAGE_WHEN_ABLE("METH_GOD_18") // Return to Chef
IF NOT IS_TIMER_STARTED(tmrAbandonChef)
CPRINTLN(DEBUG_MISSION,"HANDLE_ABANDONMENT_MESSAGE: Player has buggered off - start timer.")
START_TIMER_NOW(tmrAbandonChef)
ELIF TIMER_DO_WHEN_READY(tmrAbandonChef, (default_god_text_time*2)/1000)
CPRINTLN(DEBUG_MISSION, "HANDLE_ABANDONMENT_MESSAGE: Print Message.")
//reset's the god text
SET_LABEL_AS_TRIGGERED("METH_GOD_18", FALSE)
CANCEL_TIMER(tmrAbandonChef)
ENDIF
ELSE
// clear and reset the god text
IF IS_THIS_PRINT_BEING_DISPLAYED("METH_GOD_18")
CLEAR_THIS_PRINT("METH_GOD_18")
ENDIF
IF HAS_LABEL_BEEN_TRIGGERED("METH_GOD_18")
SET_LABEL_AS_TRIGGERED("METH_GOD_18", FALSE)
ENDIF
IF IS_TIMER_STARTED(tmrAbandonChef)
CPRINTLN(DEBUG_MISSION, "HANDLE_ABANDONMENT_MESSAGE: Player is back - cancel timer.")
CANCEL_TIMER(tmrAbandonChef)
ENDIF
ENDIF
ENDPROC
// @SBA - resets stuff if Chef is no longer about to die
PROC RESET_ABANDONMENT_STUFF()
IF IS_TIMER_STARTED(tmrCheckChefForLOS)
CANCEL_TIMER(tmrCheckChefForLOS)
ENDIF
IF IS_TIMER_STARTED(tmrChefDeathTimer)
CANCEL_TIMER(tmrChefDeathTimer)
ENDIF
ENDPROC
// @SBA - kills the chef if he can't be seen
PROC KILL_THE_CHEF()
IF NOT IS_PED_INJURED(buddy.ped)
BOOL bKillChef = FALSE
VECTOR vChefPos = GET_ENTITY_COORDS(buddy.ped)
IF NOT IS_SPHERE_VISIBLE(vChefPos, 1.0)
CPRINTLN(DEBUG_MISSION, "KILL_THE_CHEF: Chef's sphere not visible!")
bKillChef = TRUE
ELSE
IF NOT IS_TIMER_STARTED(tmrCheckChefForLOS)
START_TIMER_NOW(tmrCheckChefForLOS)
ELIF TIMER_DO_WHEN_READY(tmrCheckChefForLOS, 1.000)
IF NOT HAS_ENTITY_CLEAR_LOS_TO_ENTITY(PLAYER_PED_ID(), buddy.ped)
CPRINTLN(DEBUG_MISSION, "KILL_THE_CHEF: Chef's not in LOS!")
bKillChef = TRUE
RESET_ABANDONMENT_STUFF()
ENDIF
ENDIF
ENDIF
IF bKillChef
CPRINTLN(DEBUG_MISSION,"KILL_THE_CHEF: Killing the Chef Now!")
// Do we need a sound?
SHOOT_SINGLE_BULLET_BETWEEN_COORDS((<<vChefPos.x + 0.75, vChefPos.y, vChefPos.z +1.0>>), vChefPos, 10000, TRUE)
EXPLODE_PED_HEAD(buddy.ped)
APPLY_DAMAGE_TO_PED(buddy.ped, 10000, TRUE)
ENDIF
ENDIF
ENDPROC
// @SBA - for first part of wave 0, handles killing the chef if he's overrun by bad guys and the player isn't there
PROC HANDLE_WAVE_0_CHEF_DEMISE()
// Is Chef already on the outs?
IF IS_PED_INJURED(buddy.ped)
EXIT
ENDIF
// Is Player close enough to Chef?
IF NOT HAS_PLAYER_ABANDONED_CHEF_WAVE_0()
RESET_ABANDONMENT_STUFF()
EXIT
ENDIF
// @SBA - check if bad guys are in the vicinity
IF IS_ANY_PED_IN_SPECIFIC_ROOM(wave_0_enemy, (<<1391.1970, 3601.0510, 37.9418>>), "v_39_UpperRm3")
OR IS_ANY_PED_IN_SPECIFIC_ROOM(wave_0_enemy, (<<1397.1, 3608.4, 38.5>>), "v_39_UpperRm2")
IF NOT IS_TIMER_STARTED(tmrChefDeathTimer)
CPRINTLN(DEBUG_MISSION,"HANDLE_WAVE_0_CHEF_DEMISE: Chef is in danger - starting death timer!")
START_TIMER_NOW(tmrChefDeathTimer)
// play Chef's help dialogue
IF PLAY_CHEF_CONVERSATION(sChefHelp1)
CPRINTLN(DEBUG_MISSION,"HANDLE_WAVE_0_CHEF_DEMISE: Playing Chef's help dialogue!")
ENDIF
ENDIF
// If timer is up, ok to kill the Chef
IF TIMER_DO_WHEN_READY(tmrChefDeathTimer, kfChefDeathTime)
CPRINTLN(DEBUG_MISSION,"HANDLE_WAVE_0_CHEF_DEMISE: The Chef must die!")
KILL_THE_CHEF()
ENDIF
ELSE
RESET_ABANDONMENT_STUFF()
ENDIF
ENDPROC
// @SBA - for second part of wave 0, handles killing the chef if he's overrun by bad guys and the player isn't there
PROC HANDLE_WAVE_0_PART_2_CHEF_DEMISE()
// Is Chef already on the outs?
IF IS_PED_INJURED(buddy.ped)
EXIT
ENDIF
// Is Player close enough to Chef?
IF NOT HAS_PLAYER_ABANDONED_CHEF_WAVE_0_PART2()
RESET_ABANDONMENT_STUFF()
EXIT
ENDIF
// @SBA - check if bad guys are in the vicinity
IF IS_ANY_PED_IN_TRIGGER_BOX(wave_0_enemy, tbTopBackStairsVolume)
OR IS_ANY_PED_IN_TRIGGER_BOX(wave_0_inside_enemy, tbTopBackStairsVolume)
IF NOT IS_TIMER_STARTED(tmrChefDeathTimer)
CPRINTLN(DEBUG_MISSION,"HANDLE_WAVE_0_PART_2_CHEF_DEMISE: Chef is in danger - starting death timer!")
START_TIMER_NOW(tmrChefDeathTimer)
// play Chef's help dialogue
IF PLAY_CHEF_CONVERSATION(sChefHelp1)
CPRINTLN(DEBUG_MISSION,"HANDLE_WAVE_0_PART_2_CHEF_DEMISE: Playing Chef's help dialogue!")
ENDIF
ENDIF
// If timer is up, ok to kill the Chef
IF TIMER_DO_WHEN_READY(tmrChefDeathTimer, kfChefDeathTime)
CPRINTLN(DEBUG_MISSION,"HANDLE_WAVE_0_PART_2_CHEF_DEMISE: The Chef must die!")
KILL_THE_CHEF()
ENDIF
ELSE
RESET_ABANDONMENT_STUFF()
ENDIF
ENDPROC
// @SBA - for wave 2, handles killing the chef if he's overrun by bad guys and the player isn't there
PROC HANDLE_WAVE_2_CHEF_DEMISE()
// Is Chef already on the outs?
IF IS_PED_INJURED(buddy.ped)
EXIT
ENDIF
// Is Player close enough to Chef?
IF NOT HAS_PLAYER_ABANDONED_CHEF_WAVE_2()
RESET_ABANDONMENT_STUFF()
EXIT
ENDIF
// @SBA - check if bad guys are in the vicinity
IF IS_ANY_PED_IN_TRIGGER_BOX(wave_2_enemy, tbBackRoofVolume)
IF NOT IS_TIMER_STARTED(tmrChefDeathTimer)
CPRINTLN(DEBUG_MISSION,"HANDLE_WAVE_2_CHEF_DEMISE: Chef is in danger - starting death timer!")
START_TIMER_NOW(tmrChefDeathTimer)
// play Chef's help dialogue
IF PLAY_CHEF_CONVERSATION(sChefHelp1)
CPRINTLN(DEBUG_MISSION,"HANDLE_WAVE_2_CHEF_DEMISE: Playing Chef's help dialogue!")
ENDIF
ENDIF
// If timer is up, ok to kill the Chef
IF TIMER_DO_WHEN_READY(tmrChefDeathTimer, kfChefDeathTime)
CPRINTLN(DEBUG_MISSION,"HANDLE_WAVE_2_CHEF_DEMISE: The Chef must die!")
KILL_THE_CHEF()
ENDIF
ELSE
RESET_ABANDONMENT_STUFF()
ENDIF
ENDPROC
// @SBA - for wave 2, handles killing the chef if he's overrun by bad guys and the player isn't there
PROC HANDLE_WAVE_3_CHEF_DEMISE()
// Is Chef already on the outs?
IF IS_PED_INJURED(buddy.ped)
EXIT
ENDIF
// Is Player close enough to Chef?
IF NOT HAS_PLAYER_ABANDONED_CHEF_WAVE_3()
RESET_ABANDONMENT_STUFF()
EXIT
ENDIF
// @SBA - check if bad guys are in the vicinity
IF IS_ANY_PED_IN_TRIGGER_BOX(wave_3_enemy, tbLiquorStoreVolume)
IF NOT IS_TIMER_STARTED(tmrChefDeathTimer)
CPRINTLN(DEBUG_MISSION,"HANDLE_WAVE_3_CHEF_DEMISE: Chef is in danger - starting death timer!")
START_TIMER_NOW(tmrChefDeathTimer)
// play Chef's help dialogue
IF PLAY_CHEF_CONVERSATION(sChefHelp1)
CPRINTLN(DEBUG_MISSION,"HANDLE_WAVE_3_CHEF_DEMISE: Playing Chef's help dialogue!")
ENDIF
ENDIF
// If timer is up, ok to kill the Chef
IF TIMER_DO_WHEN_READY(tmrChefDeathTimer, kfChefDeathTime)
CPRINTLN(DEBUG_MISSION,"HANDLE_WAVE_3_CHEF_DEMISE: The Chef must die!")
KILL_THE_CHEF()
ENDIF
ELSE
RESET_ABANDONMENT_STUFF()
ENDIF
ENDPROC
/// PURPOSE:
/// Chef will say a line of dialogue if he's taken enough damage
PROC HANDLE_CHEF_DAMAGED_DIALOGUE()
// Is Chef already gone?
IF IS_PED_INJURED(buddy.ped)
EXIT
ENDIF
// only play once until reset
IF HAS_LABEL_BEEN_TRIGGERED(sChefHurt)
EXIT
ENDIF
// quit bellyaching about every little gun shot wound
IF GET_ENTITY_HEALTH(buddy.ped) > 150
EXIT
ENDIF
// ignore friendly fire (which should be fatal anyway)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(buddy.ped, PLAYER_PED_ID())
EXIT
ENDIF
ENDIF
// play Chef's owie dialogue
IF PLAY_CHEF_CONVERSATION(sChefHurt)
CPRINTLN(DEBUG_MISSION,"HANDLE_WAVE_3_CHEF_DEMISE: Playing Chef's I'm hurt dialogue!")
SET_LABEL_AS_TRIGGERED(sChefHurt, TRUE)
ENDIF
ENDPROC
// @SBA - specific test for after back porch wave, on the way to last wave
FUNC BOOL IS_PLAYER_NEAR_CHEF_ON_STAIRS()
VECTOR vplayer_position = GET_ENTITY_COORDS(player_ped_id())
// IF player is already on ground floor, continue
IF (vplayer_position.z < 37.00)
RETURN TRUE
ENDIF
// Check distance to Chef if player isn't on other side of wall from him
IF NOT IS_PED_IN_SPECIFIC_ROOM(PLAYER_PED_ID(), (<<1390.91, 3608.21, 38.91>>), "v_39_UpperRm3")
// If the player is, is he close enough to Chef
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(buddy.ped), vplayer_position) < 5.5
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
// ***********************************************************************************
//*****WIDGETS
#IF IS_DEBUG_BUILD
bool widget_reset_cutscene = false
bool widget_create_object = false
bool widget_modify = false
bool widget_vehicle_camera_active = false
bool widget_reset_deformation = false
bool widget_apply_deformation = false
bool widget_activate_ptfx = false
int widget_blip_alpha
float widget_temp_width
float widget_temp_height
float widget_temp_depth
float widget_angled_length
float widget_anim_speed = 1.0
float widget_heading
float widget_fov = 45.00
float widget_blip_scale
float widget_vehicle_damage
float widget_vehicle_deformation
vector widget_offset_bl
vector widget_offset_br
vector widget_bl
vector widget_br
vector widget_object_pos
vector widget_object_rot
vector widget_object_pos_2
vector widget_object_rot_2
vector widget_cam_attach_offset
vector widget_cam_point_offset
vector widget_blip_pos
vector widget_veh_offset
vector widget_ptfx_pos
vector widget_ptfx_rot
camera_index widget_camera
//mission specific widget variables
int x_squares = 1
int y_squares = 1
proc locate_widget()
vector widget_player_pos
widget_player_pos = GET_ENTITY_COORDS(player_ped_id())
IS_ENTITY_AT_COORD(player_ped_id(), widget_player_pos, <<widget_temp_width, widget_temp_depth, widget_temp_height>>, false, true)
endproc
proc angled_area_locate_widget()
widget_bl = get_offset_from_entity_in_world_coords(player_ped_id(), widget_offset_bl)
widget_br = get_offset_from_entity_in_world_coords(player_ped_id(), widget_offset_br)
IS_ENTITY_IN_ANGLED_AREA(player_ped_id(), widget_bl, widget_br, widget_angled_length, false)
if widget_offset_br.z > 0.0
SET_ENTITY_HEADING(player_ped_id(), widget_heading)
endif
endproc
proc attach_object_to_ped_and_move(ped_index mission_ped, object_index &mission_object)
if DOES_ENTITY_EXIST(mission_ped)
if not is_ped_injured(mission_ped)
if DOES_ENTITY_EXIST(mission_object)
ATTACH_ENTITY_TO_ENTITY(mission_object, mission_ped, bonetag_ph_r_hand, widget_object_pos, widget_object_rot)
endif
endif
endif
endproc
proc set_the_ped_anim_speed(ped_index mission_ped, string dict_name, string anim_name, float anim_speed)
if DOES_ENTITY_EXIST(mission_ped)
if not is_ped_injured(mission_ped)
if IS_ENTITY_PLAYING_ANIM(mission_ped, dict_name, anim_name)
SET_ENTITY_ANIM_SPEED(mission_ped, dict_name, anim_name, anim_speed)
endif
endif
endif
endproc
proc create_and_move_object(object_index &mission_object)
if DOES_ENTITY_EXIST(mission_object)
SET_ENTITY_COORDS_NO_OFFSET(mission_object, widget_object_pos)
SET_ENTITY_ROTATION(mission_object, widget_object_rot)
endif
endproc
proc create_and_move_object_2(object_index &mission_object)
if DOES_ENTITY_EXIST(mission_object)
SET_ENTITY_COORDS_NO_OFFSET(mission_object, widget_object_pos_2)
SET_ENTITY_ROTATION(mission_object, widget_object_rot_2)
endif
endproc
proc attach_object_to_object_and_move(object_index &parent_object, object_index &mission_object)
if DOES_ENTITY_EXIST(parent_object)
if DOES_ENTITY_EXIST(mission_object)
ATTACH_ENTITY_TO_ENTITY(mission_object, parent_object, -1, widget_object_pos_2, widget_object_rot_2)
endif
endif
endproc
proc create_and_move_pickup_widget(pickup_index &widget_mission_pickup, pickup_type pick_type, vector &pos, vector &rot)
if widget_create_object
if not widget_modify
widget_mission_pickup = create_pickup_rotate(pick_type, pos, rot, true)
widget_object_pos.x = pos.x
widget_object_pos.y = pos.y
widget_object_pos.z = pos.z
widget_object_rot.x = rot.x
widget_object_rot.y = rot.y
widget_object_rot.z = rot.z
widget_modify = true
else
if lk_timer(original_time, 500)
if does_pickup_exist(widget_mission_pickup)
remove_pickup(widget_mission_pickup)
else
widget_mission_pickup = create_pickup_rotate(pick_type, widget_object_pos, widget_object_rot, true)
endif
original_time = get_game_timer()
endif
endif
endif
endproc
proc camera_attached_to_vehicle_widget(vehicle_index &mission_veh)
if widget_vehicle_camera_active
if not does_cam_exist(widget_camera)
widget_camera = create_cam("default_scripted_camera", false)
ATTACH_CAM_TO_ENTITY(widget_camera, mission_veh, widget_cam_attach_offset)
POINT_CAM_AT_ENTITY(widget_camera, mission_veh, widget_cam_point_offset)
set_cam_active(widget_camera, true)
render_script_cams(true, false)
else
ATTACH_CAM_TO_ENTITY(widget_camera, mission_veh, widget_cam_attach_offset)
POINT_CAM_AT_ENTITY(widget_camera, mission_veh, widget_cam_point_offset)
set_cam_fov(widget_camera, widget_fov)
endif
endif
endproc
proc blip_pos_scale_and_alpha_widget(blip_index &mission_blip)
if does_blip_exist(mission_blip)
set_blip_coords(mission_blip, widget_blip_pos)
set_blip_scale(mission_blip, widget_blip_scale)
set_blip_alpha(mission_blip, widget_blip_alpha)
else
mission_blip = add_blip_for_coord(widget_blip_pos)
set_blip_as_friendly(mission_blip, true)
endif
endproc
proc vehicle_offset_system(vehicle_index miss_veh)
if does_entity_exist(miss_veh)
if is_vehicle_driveable(miss_veh)
DRAW_MARKER(MARKER_CYLINDER, get_offset_from_entity_in_world_coords(miss_veh, widget_offset_br), <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>, <<widget_blip_scale, widget_blip_scale, widget_blip_scale>>, 255, 0, 128, 178)
endif
endif
endproc
proc vehicle_damage_widget(vehicle_index mission_vehicle)
if does_entity_exist(mission_vehicle)
if is_vehicle_driveable(mission_vehicle)
if widget_reset_deformation
set_vehicle_fixed(mission_vehicle)
widget_reset_deformation = false
widget_apply_deformation = false
endif
if widget_apply_deformation
SET_VEHICLE_DAMAGE(mission_vehicle, widget_veh_offset, widget_vehicle_damage, widget_vehicle_deformation, TRUE)
widget_apply_deformation = false
endif
endif
endif
endproc
proc pfx_widget()
if widget_activate_ptfx
START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_chin1_freezer_gust", widget_ptfx_pos, widget_ptfx_rot)
// START_PARTICLE_FX_LOOPED_AT_COORD("cs_dry_ice_freezer_door", widget_ptfx_pos, widget_ptfx_rot)
// cs_dry_ice_freezer_door
// scr_chin1_freezer_gust
widget_activate_ptfx = false
endif
endproc
//**************************************************WIDGETS**************************************************
proc load_lk_widgets()
chinese_1_widget_group = start_widget_group("Chinese1")
// @SBA - uncomment to be able to switch whether to play the greneade cutscene or not
//ADD_WIDGET_INT_SLIDER("Flip Grenade Launcher cutscene", g_replay.iReplayInt[PLAYER_RECEIVED_GRENADE_LAUNCHER], NOT_GOT_GLAUNCHER, HAS_GOT_GLAUNCHER, 1)
#IF IS_DEBUG_BUILD
start_widget_group("locate widget")
add_widget_float_slider("width", widget_temp_width, -3000.0, 3000.0, 0.1)
add_widget_float_slider("depth", widget_temp_depth, -3000.0, 3000.0, 0.1)
add_widget_float_slider("height", widget_temp_height, -3000.0, 3000.0, 0.1)
stop_widget_group()
#endif
#IF IS_DEBUG_BUILD
start_widget_group("angled_area")
add_widget_float_slider("left offset x", widget_offset_bl.x, -2000.0, 2000.0, 0.1)
add_widget_float_slider("left offset y", widget_offset_bl.y, -2000.0, 2000.0, 0.1)
add_widget_float_slider("left offset z", widget_offset_bl.z, -2000.0, 2000.0, 0.1)
add_widget_float_slider("right offset x", widget_offset_br.x, -2000.0, 2000.0, 0.1)
add_widget_float_slider("right offset y", widget_offset_br.y, -2000.0, 2000.0, 0.1)
add_widget_float_slider("right offset z", widget_offset_br.z, -2000.0, 2000.0, 0.1)
add_widget_float_slider("angled area length", widget_angled_length, -2000.0, 2000.0, 0.1)
add_widget_float_slider("heading", widget_heading, -2000.0, 2000.0, 0.1)
add_widget_float_read_only("widget_bl x", widget_bl.x)
add_widget_float_read_only("widget_bl y", widget_bl.y)
add_widget_float_read_only("widget_bl z", widget_bl.z)
add_widget_float_read_only("widget_br x", widget_br.x)
add_widget_float_read_only("widget_br y", widget_br.y)
add_widget_float_read_only("widget_br z", widget_br.z)
stop_widget_group()
#endif
#IF IS_DEBUG_BUILD
start_widget_group("object attach to ped widget")
add_widget_float_slider("pos offset x", widget_object_pos.x, -3000.0, 3000.0, 0.01)
add_widget_float_slider("pos offset y", widget_object_pos.y, -3000.0, 3000.0, 0.01)
add_widget_float_slider("pos offset z", widget_object_pos.z, -3000.0, 3000.0, 0.01)
add_widget_float_slider("rot offset x", widget_object_rot.x, -3000.0, 3000.0, 0.01)
add_widget_float_slider("rot offset y", widget_object_rot.y, -3000.0, 3000.0, 0.01)
add_widget_float_slider("rot offset z", widget_object_rot.z, -3000.0, 3000.0, 0.01)
stop_widget_group()
#endif
#IF IS_DEBUG_BUILD
start_widget_group("grid square widget")
add_widget_float_slider("bl x", widget_bl.x, -5000.0, 5000.0, 0.01)
add_widget_float_slider("bl y", widget_bl.y, -5000.0, 5000.0, 0.01)
add_widget_float_slider("bl z", widget_bl.z, -5000.0, 5000.0, 0.01)
add_widget_float_slider("tr x", widget_br.x, -5000.0, 5000.0, 0.01)
add_widget_float_slider("tr y", widget_br.y, -5000.0, 5000.0, 0.01)
add_widget_float_slider("tr z", widget_br.z, -5000.0, 5000.0, 0.01)
add_widget_int_slider("x_squares", x_squares, 1, 500, 1)
add_widget_int_slider("y_squares", y_squares, 1, 500, 1)
stop_widget_group()
#endif
#IF IS_DEBUG_BUILD
start_widget_group("anim speed widget")
add_widget_float_slider("anim speed", widget_anim_speed, 0.1, 10.0, 0.01)
stop_widget_group()
#endif
#IF IS_DEBUG_BUILD
start_widget_group("reset cutscene widget")
add_widget_bool("reset cutscene", widget_reset_cutscene)
stop_widget_group()
#endif
#IF IS_DEBUG_BUILD
start_widget_group("object pos and rot widget")
add_widget_float_slider("pos x", widget_object_pos.x, -4000.0, 4000.0, 0.01)
add_widget_float_slider("pos y", widget_object_pos.y, -4000.0, 4000.0, 0.01)
add_widget_float_slider("pos z", widget_object_pos.z, -4000.0, 4000.0, 0.01)
add_widget_float_slider("rot x", widget_object_rot.x, -4000.0, 4000.0, 0.01)
add_widget_float_slider("rot y", widget_object_rot.y, -4000.0, 4000.0, 0.01)
add_widget_float_slider("rot z", widget_object_rot.z, -4000.0, 4000.0, 0.01)
stop_widget_group()
#endif
#IF IS_DEBUG_BUILD
start_widget_group("object pos and rot widget 2")
add_widget_float_slider("pos x", widget_object_pos_2.x, -3000.0, 3000.0, 0.01)
add_widget_float_slider("pos y", widget_object_pos_2.y, -3000.0, 3000.0, 0.01)
add_widget_float_slider("pos z", widget_object_pos_2.z, -3000.0, 3000.0, 0.01)
add_widget_float_slider("rot x", widget_object_rot_2.x, -3000.0, 3000.0, 0.01)
add_widget_float_slider("rot y", widget_object_rot_2.y, -3000.0, 3000.0, 0.01)
add_widget_float_slider("rot z", widget_object_rot_2.z, -3000.0, 3000.0, 0.01)
stop_widget_group()
#endif
#IF IS_DEBUG_BUILD
start_widget_group("attach object to object pos and rot widget")
add_widget_float_slider("pos x", widget_object_pos_2.x, -3000.0, 3000.0, 0.01)
add_widget_float_slider("pos y", widget_object_pos_2.y, -3000.0, 3000.0, 0.01)
add_widget_float_slider("pos z", widget_object_pos_2.z, -3000.0, 3000.0, 0.01)
add_widget_float_slider("rot x", widget_object_rot_2.x, -3000.0, 3000.0, 0.01)
add_widget_float_slider("rot y", widget_object_rot_2.y, -3000.0, 3000.0, 0.01)
add_widget_float_slider("rot z", widget_object_rot_2.z, -3000.0, 3000.0, 0.01)
stop_widget_group()
#endif
#IF IS_DEBUG_BUILD
start_widget_group("create and move PICKUP inside interior")
ADD_WIDGET_bool("create_object", widget_create_object)
ADD_WIDGET_FLOAT_SLIDER("object pos x", widget_object_pos.x, -3000.0, 3000.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("object pos y", widget_object_pos.y, -3000.0, 3000.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("object pos z", widget_object_pos.z, -3000.0, 3000.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("object rotation x", widget_object_rot.x, 0.0, 360.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("object rotation y", widget_object_rot.y, 0.0, 360.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("object rotation z", widget_object_rot.z, 0.0, 360.0, 0.1)
stop_widget_group()
#endif
start_widget_group("camaera attached to vehicle widget")
add_widget_bool("create camera", widget_vehicle_camera_active)
ADD_WIDGET_FLOAT_SLIDER("pos x", widget_cam_attach_offset.x, -3000.0, 3000.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("pos y", widget_cam_attach_offset.y, -3000.0, 3000.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("pos z", widget_cam_attach_offset.z, -3000.0, 3000.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("point offset x", widget_cam_point_offset.x, -3000.0, 3000.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("point offset y", widget_cam_point_offset.y, -3000.0, 3000.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("point offset z", widget_cam_point_offset.z, -3000.0, 3000.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("FOV", widget_fov, -3000.0, 3000.0, 0.1)
stop_widget_group()
start_widget_group("blip position, scale and alpha widget")
ADD_WIDGET_FLOAT_SLIDER("pos x", widget_blip_pos.x, -4000.0, 4000.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("pos y", widget_blip_pos.y, -4000.0, 4000.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("pos z", widget_blip_pos.z, -4000.0, 4000.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("scale", widget_blip_scale, -1.0, 40.0, 0.01)
ADD_WIDGET_int_SLIDER("alpha", widget_blip_alpha, -1, 400, 1)
stop_widget_group()
start_widget_group("vehicle offset sphere")
ADD_WIDGET_FLOAT_SLIDER("offset x", widget_offset_br.x, -400.0, 400.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("offset y", widget_offset_br.y, -400.0, 400.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("offset z", widget_offset_br.z, -400.0, 400.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("sphere radius", widget_blip_scale, -1.0, 40.0, 0.01)
stop_widget_group()
start_widget_group("vehicle damage")
ADD_WIDGET_bool("Reset vehicle deformation", widget_reset_deformation)
ADD_WIDGET_bool("Apply vehicle deformation", widget_apply_deformation)
ADD_WIDGET_FLOAT_SLIDER("vehicle offset x", widget_veh_offset.x, -3000.0, 3000.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("vehicle offset y", widget_veh_offset.y, -3000.0, 3000.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("vehicle offset z", widget_veh_offset.z, -3000.0, 3000.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("vehicle damage", widget_vehicle_damage, 0.0, 2000, 1000)
ADD_WIDGET_FLOAT_SLIDER("vehicle deformation", widget_vehicle_deformation, 0.0, 2000, 1000)
stop_widget_group()
START_WIDGET_GROUP("Focus push tweaks")
ADD_WIDGET_VECTOR_SLIDER( "HINT ENTITY OFFSET", vEntityHint, -1.0, 1.0, 0.01 )
ADD_WIDGET_FLOAT_SLIDER( "HINT SCALAR", fHintScalar, 0, 1.0, 0.01 )
ADD_WIDGET_FLOAT_SLIDER( "HINT HORIZONTAL", fHintHOffset, -1.0, 1.0, 0.01 )
ADD_WIDGET_FLOAT_SLIDER( "HINT VERTICAL", fHintVOffset, -1.0, 1.0, 0.01 )
//ADD_WIDGET_FLOAT_SLIDER( "HINT PITCH", fHintPitch, -90.0, 90.0, 1.0 )
ADD_WIDGET_FLOAT_SLIDER( "HINT FOV", fHintFOV, 0, 50.0, 1.0 )
ADD_WIDGET_BOOL( "RESET HINT", bResetFocusCam )
STOP_WIDGET_GROUP()
start_WIDGET_GROUP("ptfx widget")
add_widget_bool("toggle ptfx", widget_activate_ptfx)
add_widget_float_slider("widget_ptfx_pos x", widget_ptfx_pos.x, -4000.0, 4000.0, 0.1)
add_widget_float_slider("widget_ptfx_pos y", widget_ptfx_pos.y, -4000.0, 4000.0, 0.1)
add_widget_float_slider("widget_ptfx_pos z", widget_ptfx_pos.z, -4000.0, 4000.0, 0.1)
add_widget_float_slider("widget_ptfx_rot x", widget_ptfx_rot.x, -4000.0, 4000.0, 0.1)
add_widget_float_slider("widget_ptfx_rot y", widget_ptfx_rot.y, -4000.0, 4000.0, 0.1)
add_widget_float_slider("widget_ptfx_rot z", widget_ptfx_rot.z, -4000.0, 4000.0, 0.1)
stop_widget_group()
stop_widget_group()
endproc
#endif
//**************************************************LOCAL MISSION FUNCTIONS**************************************************
// @SBA - reset some values for Chef's warning system
PROC RESET_CHEF_WARNINGS_FOR_NEXT_WAVE()
SET_LABEL_AS_TRIGGERED(sChefWarn1, FALSE)
SET_LABEL_AS_TRIGGERED(sChefWarn2, FALSE)
SET_LABEL_AS_TRIGGERED(sChefBackStairsWarn, FALSE)
SET_LABEL_AS_TRIGGERED(sChefHurt, FALSE)
CANCEL_TIMER(tmrChefOutburstTimer)
RESET_ABANDONMENT_STUFF()
ENDPROC
// @SBA - clean up the script-created cover points
PROC REMOVE_ALL_COVERPOINTS()
INT idx
REMOVE_COVER_POINT(players_cover_point)
REMOVE_COVER_POINT(players_cover_point_2)
REMOVE_COVER_POINT(wave_3_0_cover_point)
REMOVE_COVER_POINT(wave_3_1_cover_point)
REMOVE_COVER_POINT(cpWaterHeaterCover)
REMOVE_COVER_POINT(cover_point_back_roof_AC)
REPEAT COUNT_OF(buddy_cover_point) idx
REMOVE_COVER_POINT(buddy_cover_point[idx])
ENDREPEAT
REPEAT COUNT_OF(buddy_cover_point_data) idx
REMOVE_COVER_POINT(buddy_cover_point_data[idx].cover_point)
ENDREPEAT
ENDPROC
PROC REMOVE_ALL_RECORDINGS()
REMOVE_VEHICLE_RECORDING(001, "lkmethlab")
REMOVE_VEHICLE_RECORDING(002, "lkmethlab")
REMOVE_VEHICLE_RECORDING(003, "lkmethlab")
REMOVE_VEHICLE_RECORDING(007, "lkmethlab")
REMOVE_VEHICLE_RECORDING(008, "lkmethlab")
REMOVE_VEHICLE_RECORDING(009, "lkmethlab")
REMOVE_VEHICLE_RECORDING(010, "lkmethlab")
REMOVE_VEHICLE_RECORDING(011, "lkmethlab")
REMOVE_VEHICLE_RECORDING(012, "lkmethlab")
REMOVE_VEHICLE_RECORDING(017, "lkmethlab")
REMOVE_VEHICLE_RECORDING(018, "lkmethlab")
REMOVE_VEHICLE_RECORDING(019, "lkmethlab")
REMOVE_VEHICLE_RECORDING(020, "lkmethlab")
REMOVE_VEHICLE_RECORDING(021, "lkmethlab")
REMOVE_WAYPOINT_RECORDING("methlab1")
REMOVE_WAYPOINT_RECORDING("methlab3")
REMOVE_WAYPOINT_RECORDING("methlab4")
REMOVE_WAYPOINT_RECORDING("methlab5")
REMOVE_WAYPOINT_RECORDING("methlab7")
ENDPROC
PROC UNLOCK_ALL_MISSION_VEHICLES()
if does_entity_exist(trevors_truck.veh)
if is_vehicle_driveable(trevors_truck.veh)
CPRINTLN(DEBUG_MISSION, "UNLOCK_ALL_MISSION_VEHICLES: unlocking player's vehicle")
set_vehicle_doors_locked(trevors_truck.veh, vehiclelock_unlocked)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(trevors_truck.veh, true)
endif
endif
for i = 0 to count_of(parked_cars) - 1
if does_entity_exist(parked_cars[i])
if is_vehicle_driveable(parked_cars[i])
set_vehicle_doors_locked(parked_cars[i], vehiclelock_unlocked)
endif
endif
endfor
for i = 0 to count_of(wave_0_enemy_vehicle) - 1
if does_entity_exist(wave_0_enemy_vehicle[i].veh)
if not is_entity_dead(wave_0_enemy_vehicle[i].veh)
CPRINTLN(DEBUG_MISSION, "wave_0_enemy_vehicle not dead: ", i)
if is_vehicle_driveable(wave_0_enemy_vehicle[i].veh)
set_vehicle_doors_locked(wave_0_enemy_vehicle[i].veh, vehiclelock_unlocked)
CPRINTLN(DEBUG_MISSION, "doors unlocked vehicle driveable: ", i)
else
if i = 1 //blue jeep
if get_vehicle_petrol_tank_health(wave_0_enemy_vehicle[i].veh) < 500
set_vehicle_petrol_tank_health(wave_0_enemy_vehicle[i].veh, 1000.00)
endif
SET_VEHICLE_CAN_LEAK_PETROL(wave_0_enemy_vehicle[i].veh, FALSE)
set_vehicle_doors_locked(wave_0_enemy_vehicle[i].veh, vehiclelock_unlocked)
endif
endif
else
CPRINTLN(DEBUG_MISSION, "wave_0_enemy_vehicle DEAD: ", i)
endif
endif
endfor
for i = 0 to count_of(wave_2_enemy_vehicle) - 1
if does_entity_exist(wave_2_enemy_vehicle[i].veh)
if is_vehicle_driveable(wave_2_enemy_vehicle[i].veh)
set_vehicle_doors_locked(wave_2_enemy_vehicle[i].veh, vehiclelock_unlocked)
endif
endif
endfor
for i = 0 to count_of(wave_3_enemy_vehicle) - 1
if does_entity_exist(wave_3_enemy_vehicle[i].veh)
if is_vehicle_driveable(wave_3_enemy_vehicle[i].veh)
set_vehicle_doors_locked(wave_3_enemy_vehicle[i].veh, vehiclelock_unlocked)
endif
endif
endfor
// @SBA - added this
for i = 0 to count_of(ambient_enemy_vehicle) - 1
if does_entity_exist(ambient_enemy_vehicle[i].veh)
if is_vehicle_driveable(ambient_enemy_vehicle[i].veh)
set_vehicle_doors_locked(ambient_enemy_vehicle[i].veh, vehiclelock_unlocked)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(ambient_enemy_vehicle[i].veh, true)
endif
endif
endfor
ENDPROC
/// PURPOSE:
/// @SBA - trying to free up more space for the cutscene. Set FALSE to reset to normal.
PROC REDUCE_AMBIENT_MODELS(BOOL bTurnOn)
SET_REDUCE_VEHICLE_MODEL_BUDGET(bTurnOn)
SET_REDUCE_PED_MODEL_BUDGET(bTurnOn)
IF bTurnOn
CPRINTLN(DEBUG_MISSION, "REDUCE_AMBIENT_MODELS: Setting ON")
SET_VEHICLE_POPULATION_BUDGET(0)
SET_PED_POPULATION_BUDGET(0)
ELSE
CPRINTLN(DEBUG_MISSION, "REDUCE_AMBIENT_MODELS: Setting OFF")
SET_VEHICLE_POPULATION_BUDGET(3)
SET_PED_POPULATION_BUDGET(3)
ENDIF
ENDPROC
PROC CLEAN_UP_NAVMESH_BLOCKERS()
IF DOES_NAVMESH_BLOCKING_OBJECT_EXIST(iNavBlockingUpstairsDoorway)
REMOVE_NAVMESH_BLOCKING_OBJECT(iNavBlockingUpstairsDoorway)
ENDIF
IF DOES_NAVMESH_BLOCKING_OBJECT_EXIST(iNavBlockingUpstairsDoor)
REMOVE_NAVMESH_BLOCKING_OBJECT(iNavBlockingUpstairsDoor)
ENDIF
IF DOES_NAVMESH_BLOCKING_OBJECT_EXIST(iNavBlockingBackYardTrailer)
REMOVE_NAVMESH_BLOCKING_OBJECT(iNavBlockingBackYardTrailer)
ENDIF
ENDPROC
PROC CLEANUP_BAR()
IF DOES_ENTITY_EXIST(piBarLady)
SET_PED_AS_NO_LONGER_NEEDED(piBarLady)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(IG_JANET)
IF DOES_ENTITY_EXIST(piJosef)
SET_PED_AS_NO_LONGER_NEEDED(piJosef)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(IG_JOSEF)
IF DOES_ENTITY_EXIST(piOldMan1A)
SET_PED_AS_NO_LONGER_NEEDED(piOldMan1A)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(IG_OLD_MAN1A)
IF DOES_ENTITY_EXIST(piOldMan2)
SET_PED_AS_NO_LONGER_NEEDED(piOldMan2)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(IG_OLD_MAN2)
IF DOES_ENTITY_EXIST(piDrunk)
SET_PED_AS_NO_LONGER_NEEDED(piDrunk)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(IG_RUSSIANDRUNK)
REMOVE_SCENARIO_BLOCKING_AREA(sbiBarBlockingArea)
ENDPROC
proc mission_cleanup()
kill_any_conversation()
set_fake_wanted_level(0)
//g_allowmaxwantedlevelcheck = true
// @SBA set to 6? Below, CLEAR_BLOCKED_PLAYER_FOR_LEAD_IN sets it to 5.
//set_max_wanted_level(6)
set_create_random_cops(true)
SET_ALL_RANDOM_PEDS_FLEE(player_id(), false)
REDUCE_AMBIENT_MODELS(FALSE)
RELEASE_SUPPRESSED_EMERGENCY_CALLS()
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<1357.68, 3556.56, -100.00>>, <<1436.65, 3672.06, 100.00>>, true)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<1335.97, 3598.28, -100.00>>, <<1368.15, 3575.16, 100.00>>, true)
REMOVE_SCENARIO_BLOCKING_AREAS()
// Spawn Chef
IF bMissionPassed
SET_SCENARIO_PEDS_SPAWN_IN_SPHERE_AREA((<<1389.77686, 3600.51782, 38.0>>), 3.0, 1)
bMissionPassed = FALSE
ENDIF
ASSISTED_MOVEMENT_remove_ROUTE("meth1")
ASSISTED_MOVEMENT_remove_ROUTE("Meth1_new")
ASSISTED_MOVEMENT_remove_ROUTE("Meth2")
ASSISTED_MOVEMENT_remove_ROUTE("methrew_newA")
ASSISTED_MOVEMENT_remove_ROUTE("methrew_newB")
ASSISTED_MOVEMENT_remove_ROUTE("Wave01457s")
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ml_door1, <<1392.93, 3599.47, 35.13>>, false, 0.0, 0.0, 0.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ml_door1, <<1395.37, 3600.36, 35.13>>, false, 0.0, 0.0, 0.0)
IF IS_GAMEPLAY_HINT_ACTIVE()
STOP_GAMEPLAY_HINT()
ENDIF
//stops the buddy from attacking the player when the mission cleansup
if DOES_ENTITY_EXIST(buddy.ped)
if not is_ped_injured(buddy.ped)
SET_PED_RELATIONSHIP_GROUP_HASH(buddy.ped, RELGROUPHASH_PLAYER)
endif
endif
enable_dispatch_services()
clear_mission_locate_stuff(locates_data, true)
set_time_scale(1.0)
CLEAR_WEATHER_TYPE_PERSIST()
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
if is_player_playing(player_id())
set_entity_proofs(player_ped_id(), false, false, false, false, false)
SET_PED_USING_ACTION_MODE(player_ped_id(), false)
ENDIF
CLEAR_BLOCKED_PLAYER_FOR_LEAD_IN()
IF IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_STOP()
CPRINTLN(DEBUG_MISSION, "mission_cleanup: calling NEW_LOAD_SCENE_STOP.")
ENDIF
// clean up srl if loaded
END_SRL()
// @SBA - allow player into vehicles again
UNLOCK_ALL_MISSION_VEHICLES()
// @SBA - remove tactical points
CLEAR_TACTICAL_NAV_MESH_POINTS()
// @SBA - reset door states
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ss_doorext, vBackDoorToRoof, FALSE, 0.0, 0.0, 0.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ss_doorext, vDoorToBackStairs, FALSE, 0.0, 0.0, 0.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ss_door04, vInteriorDoorStore, FALSE, 0.0, 0.0, 0.0)
// @SBA - clean up stuff I added
IF DOES_PICKUP_EXIST(puiGrenadeLauncher)
REMOVE_PICKUP(puiGrenadeLauncher)
ENDIF
IF DOES_ENTITY_EXIST(oiIceBox)
DELETE_OBJECT(oiIceBox)
ENDIF
IF DOES_ENTITY_EXIST(oiIceBoxProxy)
DELETE_OBJECT(oiIceBoxProxy)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(mnIceBox)
SET_MODEL_AS_NO_LONGER_NEEDED(mnIceBoxProxy)
REMOVE_MODEL_HIDE(vIceBoxPos, 2.0, prop_ice_box_01)
// @SBA - these didn't appear to be getting cleaned up
REMOVE_ANIM_DICT(sCrazyDanceDict)
REMOVE_ANIM_DICT("MissChinese1")
REMOVE_ANIM_DICT("MissChinese1LeadInOutCHI_1_MCS_4")
// Same with recordings - maybe it's automatic? But doesn't hurt.
REMOVE_ALL_RECORDINGS()
REMOVE_ALL_COVERPOINTS()
CLEANUP_BAR()
remove_all_blips()
RESET_CHEF_WARNINGS_FOR_NEXT_WAVE()
SET_INSTANCE_PRIORITY_HINT( INSTANCE_HINT_NONE )
STOP_AUDIO_SCENES()
RELEASE_SCRIPT_AUDIO_BANK()
trigger_music_event("CHN1_FAIL")
terminate_this_thread()
endproc
proc mission_passed()
Mission_Flow_Mission_Passed()
REMOVE_ALL_COVERPOINTS()
clear_player_wanted_level(player_id())
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, FALSE)
// @SBA - reset player control
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
bMissionPassed = TRUE
mission_cleanup()
endproc
PROC REMOVE_VEHICLE(VEHICLE_INDEX &veh, BOOL b_force_delete = FALSE)
IF DOES_ENTITY_EXIST(veh)
IF IS_VEHICLE_DRIVEABLE(veh)
IF IS_ENTITY_ATTACHED(veh)
DETACH_ENTITY(veh)
ENDIF
ENDIF
IF IS_ENTITY_A_MISSION_ENTITY(veh) AND DOES_ENTITY_BELONG_TO_THIS_SCRIPT(veh, false)
IF b_force_delete
DELETE_VEHICLE(veh)
ELSE
SET_VEHICLE_AS_NO_LONGER_NEEDED(veh)
ENDIF
endif
ENDIF
ENDPROC
proc remove_all_vehicles()
REMOVE_VEHICLE(trevors_truck.veh, true)
endproc
proc delete_assets_for_mission_fail()
//remove_all_vehicles()
if does_entity_exist(buddy.ped)
DELETE_PED(buddy.ped)
endif
set_model_as_no_longer_needed(buddy.model)
if does_entity_exist(cheng.ped)
DELETE_PED(cheng.ped)
endif
set_model_as_no_longer_needed(cheng.model)
if does_entity_exist(translator.ped)
DELETE_PED(translator.ped)
endif
set_model_as_no_longer_needed(translator.model)
for i = 0 to count_of(wave_0_enemy) - 1
if does_entity_exist(wave_0_enemy[i].ped)
DELETE_PED(wave_0_enemy[i].ped)
endif
set_model_as_no_longer_needed(wave_0_enemy[i].model)
endfor
for i = 0 to count_of(wave_2_enemy) - 1
if does_entity_exist(wave_2_enemy[i].ped)
DELETE_PED(wave_2_enemy[i].ped)
endif
set_model_as_no_longer_needed(wave_2_enemy[i].model)
endfor
for i = 0 to count_of(wave_3_enemy) - 1
if does_entity_exist(wave_3_enemy[i].ped)
DELETE_PED(wave_3_enemy[i].ped)
endif
set_model_as_no_longer_needed(wave_3_enemy[i].model)
endfor
for i = 0 to count_of(ambient_enemy) - 1
if does_entity_exist(ambient_enemy[i].ped)
DELETE_PED(ambient_enemy[i].ped)
endif
set_model_as_no_longer_needed(ambient_enemy[i].model)
endfor
for i = 0 to count_of(wave_0_inside_enemy) - 1
if does_entity_exist(wave_0_inside_enemy[i].ped)
DELETE_PED(wave_0_inside_enemy[i].ped)
endif
set_model_as_no_longer_needed(wave_0_inside_enemy[i].model)
endfor
for i = 0 to count_of(wave_0_enemy_vehicle) - 1
if does_entity_exist(wave_0_enemy_vehicle[i].veh)
DELETE_VEHICLE(wave_0_enemy_vehicle[i].veh)
endif
set_model_as_no_longer_needed(wave_0_enemy_vehicle[i].model)
endfor
for i = 0 to count_of(wave_2_enemy_vehicle) - 1
if does_entity_exist(wave_2_enemy_vehicle[i].veh)
DELETE_VEHICLE(wave_2_enemy_vehicle[i].veh)
endif
set_model_as_no_longer_needed(wave_2_enemy_vehicle[i].model)
endfor
for i = 0 to count_of(wave_3_enemy_vehicle) - 1
if does_entity_exist(wave_3_enemy_vehicle[i].veh)
DELETE_VEHICLE(wave_3_enemy_vehicle[i].veh)
endif
set_model_as_no_longer_needed(wave_3_enemy_vehicle[i].model)
endfor
for i = 0 to count_of(ambient_enemy_vehicle) - 1
if does_entity_exist(ambient_enemy_vehicle[i].veh)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), ambient_enemy_vehicle[i].veh)
DELETE_VEHICLE(ambient_enemy_vehicle[i].veh)
ENDIF
ENDIF
endif
set_model_as_no_longer_needed(ambient_enemy_vehicle[i].model)
endfor
for i = 0 to count_of(parked_cars) - 1
if does_entity_exist(parked_cars[i])
DELETE_VEHICLE(parked_cars[i])
endif
endfor
set_model_as_no_longer_needed(phoenix)
for i = 0 to count_of(explosive_barrels) - 1
if does_entity_exist(explosive_barrels[i].obj)
DELETE_OBJECT(explosive_barrels[i].obj)
endif
set_model_as_no_longer_needed(explosive_barrels[i].model)
endfor
for i = 0 to count_of(bins) - 1
if does_entity_exist(bins[i].obj)
DELETE_OBJECT(bins[i].obj)
endif
set_model_as_no_longer_needed(bins[i].model)
endfor
for i = 0 to count_of(c4) - 1
if does_entity_exist(c4[i].obj)
DELETE_OBJECT(c4[i].obj)
endif
set_model_as_no_longer_needed(c4[i].model)
endfor
if does_entity_exist(cover_box.obj)
delete_object(cover_box.obj)
set_model_as_no_longer_needed(cover_box.model)
endif
endproc
proc mission_failed()
RESTORE_PLAYER_PED_VARIATIONS(player_ped_id())
// check if we need to respawn the player in a different position,
// if so call MISSION_FLOW_SET_FAIL_WARP_LOCATION() + SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION here
//
//CREATE_VEHICLE_FOR_REPLAY
MISSION_CLEANUP()
delete_assets_for_mission_fail()
endproc
func bool mission_fail_checks()
switch mission_flow
case intro_mocap
if mission_ped_injured(cheng.ped)
mission_failed_text = "METH_FAIL_0"
return true
endif
if mission_ped_injured(translator.ped)
mission_failed_text = "METH_FAIL_1"
return true
endif
mission_vehicle_injured(trevors_truck.veh)
break
case get_to_meth_lab
if mission_ped_injured(cheng.ped)
mission_failed_text = "METH_FAIL_0"
return true
endif
if mission_ped_injured(translator.ped)
mission_failed_text = "METH_FAIL_1"
return true
endif
IF does_entity_exist(cheng.ped)
AND does_entity_exist(translator.ped)
if get_distance_between_coords(get_entity_coords(player_ped_id()), get_entity_coords(cheng.ped)) > 200.00
and get_distance_between_coords(get_entity_coords(player_ped_id()), get_entity_coords(translator.ped)) > 200.00
if not is_entity_on_screen(cheng.ped)
and not is_entity_on_screen(translator.ped)
//ADD OBANDONED CHENG TEXT
mission_failed_text = "METH_FAIL_5"
return true
endif
endif
ENDIF
if does_entity_exist(cheng.ped)
if get_distance_between_coords(get_entity_coords(player_ped_id()), get_entity_coords(cheng.ped)) > 200.00
if not is_entity_on_screen(cheng.ped)
//ADD OBANDONED CHENG TEXT
mission_failed_text = "METH_FAIL_6"
return true
endif
endif
endif
if does_entity_exist(translator.ped)
if get_distance_between_coords(get_entity_coords(player_ped_id()), get_entity_coords(translator.ped)) > 200.00
if not is_entity_on_screen(translator.ped)
//ADD OBANDONED TRANSLATOR TEXT
mission_failed_text = "METH_FAIL_7"
return true
endif
endif
endif
break
case wave_0_system
if mission_ped_injured(buddy.ped)
mission_failed_text = "METH_FAIL_3"
return true
endif
if get_distance_between_coords(get_entity_coords(player_ped_id()), <<1389.5963, 3600.4568, 37.9419>>) > 200.00
mission_failed_text = "METH_FAIL_5"
return true
endif
break
case wave_2_system
if mission_ped_injured(buddy.ped)
mission_failed_text = "METH_FAIL_3"
return true
endif
if get_distance_between_coords(get_entity_coords(player_ped_id()), <<1389.5963, 3600.4568, 37.9419>>) > 200.00
mission_failed_text = "METH_FAIL_5"
return true
endif
break
case wave_3_system
case mission_passed_mocap
if mission_ped_injured(buddy.ped)
mission_failed_text = "METH_FAIL_3"
return true
endif
if get_distance_between_coords(get_entity_coords(player_ped_id()), <<1389.5963, 3600.4568, 37.9419>>) > 200.00
mission_failed_text = "METH_FAIL_5"
return true
endif
if mission_ped_injured(cheng.ped)
mission_failed_text = "METH_FAIL_0"
return true
endif
if mission_ped_injured(translator.ped)
mission_failed_text = "METH_FAIL_1"
return true
endif
IF does_entity_exist(cheng.ped)
AND does_entity_exist(translator.ped)
if get_distance_between_coords(get_entity_coords(player_ped_id()), get_entity_coords(cheng.ped)) > 200.00
and get_distance_between_coords(get_entity_coords(player_ped_id()), get_entity_coords(translator.ped)) > 200.00
if not is_entity_on_screen(cheng.ped)
and not is_entity_on_screen(translator.ped)
mission_failed_text = "METH_FAIL_5"
return true
endif
endif
ENDIF
if does_entity_exist(cheng.ped)
if get_distance_between_coords(get_entity_coords(player_ped_id()), get_entity_coords(cheng.ped)) > 200.00
if not is_entity_on_screen(cheng.ped)
mission_failed_text = "METH_FAIL_6"
return true
endif
endif
endif
if does_entity_exist(translator.ped)
if get_distance_between_coords(get_entity_coords(player_ped_id()), get_entity_coords(translator.ped)) > 200.00
if not is_entity_on_screen(translator.ped)
mission_failed_text = "METH_FAIL_7"
return true
endif
endif
endif
break
endswitch
return false
endfunc
proc setup_mission_fail()
STORE_ENEMY_VEHICLES_STILL_ALIVE()
remove_all_blips()
stop_mission_fail_checks = true
trigger_music_event("CHN1_FAIL")
MISSION_FLOW_MISSION_FAILED_WITH_REASON(mission_failed_text)
mission_flow = mission_fail_stage
endproc
proc remove_all_mission_assets()
if IS_CUTSCENE_PLAYING()
STOP_CUTSCENE()
else
REMOVE_CUTSCENE()
endif
while is_cutscene_active()
wait(0)
endwhile
REMOVE_CUTSCENE()
// @SBA - make sure to reset to game cam if needed and clean cameras
IF NOT IS_GAMEPLAY_CAM_RENDERING()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ENDIF
IF DOES_CAM_EXIST(camera_a)
SET_CAM_ACTIVE(camera_a, FALSE)
DESTROY_CAM(camera_a)
ENDIF
IF DOES_CAM_EXIST(camera_b)
SET_CAM_ACTIVE(camera_b, FALSE)
DESTROY_CAM(camera_b)
ENDIF
IF DOES_PICKUP_EXIST(puiGrenadeLauncher)
REMOVE_PICKUP(puiGrenadeLauncher)
ENDIF
IF IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_STOP()
CPRINTLN(DEBUG_MISSION, "remove_all_mission_assets: calling NEW_LOAD_SCENE_STOP.")
ENDIF
clear_area(<<1403.1777, 3597.2070, 33.7417>>, 200.00, true)
clear_area(<<1948.1082, 3842.8328, 31.2855>>, 200.00, true)
clear_ped_tasks_immediately(player_ped_id())
if does_entity_exist(trevors_truck.veh)
delete_vehicle(trevors_truck.veh)
endif
clear_mission_locate_stuff(locates_data, true)
REMOVE_SCENARIO_BLOCKING_AREAS()
ASSISTED_MOVEMENT_remove_ROUTE("meth1")
ASSISTED_MOVEMENT_remove_ROUTE("Meth1_new")
ASSISTED_MOVEMENT_remove_ROUTE("Meth2")
ASSISTED_MOVEMENT_remove_ROUTE("methrew_newA")
ASSISTED_MOVEMENT_remove_ROUTE("methrew_newB")
ASSISTED_MOVEMENT_remove_ROUTE("Wave01457s")
REPLAY_CANCEL_EVENT()
remove_all_blips()
if does_entity_exist(buddy.ped)
DELETE_PED(buddy.ped)
endif
set_model_as_no_longer_needed(buddy.model)
if does_entity_exist(cheng.ped)
DELETE_PED(cheng.ped)
endif
set_model_as_no_longer_needed(cheng.model)
if does_entity_exist(translator.ped)
DELETE_PED(translator.ped)
endif
set_model_as_no_longer_needed(translator.model)
for i = 0 to count_of(wave_0_enemy) - 1
if does_entity_exist(wave_0_enemy[i].ped)
DELETE_PED(wave_0_enemy[i].ped)
endif
set_model_as_no_longer_needed(wave_0_enemy[i].model)
endfor
for i = 0 to count_of(wave_2_enemy) - 1
if does_entity_exist(wave_2_enemy[i].ped)
DELETE_PED(wave_2_enemy[i].ped)
endif
set_model_as_no_longer_needed(wave_2_enemy[i].model)
endfor
for i = 0 to count_of(wave_3_enemy) - 1
if does_entity_exist(wave_3_enemy[i].ped)
DELETE_PED(wave_3_enemy[i].ped)
endif
set_model_as_no_longer_needed(wave_3_enemy[i].model)
endfor
for i = 0 to count_of(ambient_enemy) - 1
if does_entity_exist(ambient_enemy[i].ped)
DELETE_PED(ambient_enemy[i].ped)
endif
set_model_as_no_longer_needed(ambient_enemy[i].model)
endfor
for i = 0 to count_of(wave_0_inside_enemy) - 1
if does_entity_exist(wave_0_inside_enemy[i].ped)
DELETE_PED(wave_0_inside_enemy[i].ped)
endif
set_model_as_no_longer_needed(wave_0_inside_enemy[i].model)
endfor
for i = 0 to count_of(wave_0_enemy_vehicle) - 1
if does_entity_exist(wave_0_enemy_vehicle[i].veh)
DELETE_VEHICLE(wave_0_enemy_vehicle[i].veh)
endif
set_model_as_no_longer_needed(wave_0_enemy_vehicle[i].model)
endfor
for i = 0 to count_of(wave_2_enemy_vehicle) - 1
if does_entity_exist(wave_2_enemy_vehicle[i].veh)
DELETE_VEHICLE(wave_2_enemy_vehicle[i].veh)
endif
set_model_as_no_longer_needed(wave_2_enemy_vehicle[i].model)
endfor
for i = 0 to count_of(wave_3_enemy_vehicle) - 1
if does_entity_exist(wave_3_enemy_vehicle[i].veh)
DELETE_VEHICLE(wave_3_enemy_vehicle[i].veh)
endif
set_model_as_no_longer_needed(wave_3_enemy_vehicle[i].model)
endfor
for i = 0 to count_of(ambient_enemy_vehicle) - 1
if does_entity_exist(ambient_enemy_vehicle[i].veh)
DELETE_VEHICLE(ambient_enemy_vehicle[i].veh)
endif
set_model_as_no_longer_needed(ambient_enemy_vehicle[i].model)
endfor
for i = 0 to count_of(parked_cars) - 1
if does_entity_exist(parked_cars[i])
DELETE_VEHICLE(parked_cars[i])
endif
endfor
set_model_as_no_longer_needed(phoenix)
for i = 0 to count_of(explosive_barrels) - 1
if does_entity_exist(explosive_barrels[i].obj)
DELETE_OBJECT(explosive_barrels[i].obj)
endif
set_model_as_no_longer_needed(explosive_barrels[i].model)
endfor
for i = 0 to count_of(bins) - 1
if does_entity_exist(bins[i].obj)
DELETE_OBJECT(bins[i].obj)
endif
set_model_as_no_longer_needed(bins[i].model)
endfor
for i = 0 to count_of(c4) - 1
if does_entity_exist(c4[i].obj)
DELETE_OBJECT(c4[i].obj)
endif
set_model_as_no_longer_needed(c4[i].model)
endfor
if does_entity_exist(cover_box.obj)
delete_object(cover_box.obj)
set_model_as_no_longer_needed(cover_box.model)
endif
REMOVE_ALL_RECORDINGS()
CLEANUP_BAR()
endproc
proc initialise_mission_variables()
stop_mission_fail_checks = false
wave_0_complete = false
wave_2_complete = false
wave_3_complete = false
allow_buddy_ai_system = true
// plant_bomb_dialogue_reminder = false
ram_cutscene_finished = false
//player_message_printed = false
//buddy_message_printed = false
//is_vehicle_exploded = false
allow_ambient_enemy_blips_to_flash = false
display_blips_as_friendly = false
no_vehicle_recording_skip = false
fence_shot = false
grenade_launcher_cutscene_playing = false
stop_player_proofing = false
use_main_cover_point = true
refresh_the_task = false
grenade_launcher_first_person_cam_active = false
waypoint_node_pos = 0
total_number_of_points = 0
remaining_enemies = 0
player_waypoint_status = 22
buddy_waypoint_target_node = 0
player_grenade_launcher_cutscene_status = 0
uber_vehicle_status = 0
get_to_meth_lab_status = 0
intro_mocap_status = 0
get_to_meth_lab_dialogue_system_status = 0
mission_passed_mocap_status = 0
get_to_meth_lab_audio_scene_system_status = 0
wave_0_audio_scene_system_status = 0
wave_3_audio_scene_system_status = 0
#IF IS_DEBUG_BUILD
get_to_meth_lab_skip_status = 0
wave_0_system_skip_status = 0
wave_3_system_skip_status = 0
#endif
#IF IS_DEBUG_BUILD
menu_stage_selector[0].sTxtLabel = "Outside Hicks Bar"
menu_stage_selector[1].sTxtLabel = "Outside Meth Lab - CHI_1_MCS_1"
menu_stage_selector[2].sTxtLabel = "Start of Wave 0 shootout"
menu_stage_selector[3].sTxtLabel = "Wave 0 outside enemies"
menu_stage_selector[4].sTxtLabel = "Wave 2 after grenade launcher cutscene"
menu_stage_selector[5].sTxtLabel = "Wave 3 CHI_1_MCS_4"
#endif
// blood[0].decal_texture_id = DECAL_RSID_BLOOD_DIRECTIONAL
// blood[0].pos = <<1984.59, 3050.58, 47.533>> //47.43
// blood[0].direction = <<0.0, 0.0, -1.0>>
// blood[0].side = normalise_vector(<<0.0, 1.0, 0.0>>) //heading
// blood[0].width = 0.2
// blood[0].height = 0.2
// blood[0].fAlpha = 1.0
// blood[0].life = -1
// blood[0].wash_amount = 0.3
// blood[0].decal_removed = false
//
//
// blood[1].decal_texture_id = DECAL_RSID_BLOOD_SPLATTER
// blood[1].pos = <<1984.64, 3050.62, 47.423>> //47.32
// blood[1].direction = <<0.0, -1.0, 0.0>>//<<0.0, -1.0, 0.0>>
// blood[1].side = normalise_vector(<<1.0, 0.0, 0.0>>) //heading //<<1.0, 1.0, 0.0>>
// blood[1].width = 0.2
// blood[1].height = 0.2
// blood[1].fAlpha = 1.0
// blood[1].life = -1
// blood[1].wash_amount = 0.3
// blood[1].decal_removed = false
buddy_cover_point_data[0].pos = vChefCoverPointBackStairs
buddy_cover_point_data[0].cover_from_pos = <<1372.99622, 3617.98950, 33.89206>>
buddy_cover_point_data[0].heading = 105.0
buddy_cover_point_data[1].pos = vChefCoverPointBackStairs2
buddy_cover_point_data[1].cover_from_pos = <<1372.99622, 3617.98950, 33.89206>>
buddy_cover_point_data[1].heading = 105.0
buddy_cover_point_data[2].pos = <<1406.77, 3615.64, 38.01>>
buddy_cover_point_data[2].cover_from_pos = <<1420.11, 3617.82, 36.26>>
buddy_cover_point_data[2].heading = 290.8229
buddy_cover_point_data[3].pos = <<1408.31, 3614.82, 38.00>>
buddy_cover_point_data[3].cover_from_pos = <<1420.11, 3617.82, 36.26>>
buddy_cover_point_data[3].heading = 290.8229
// wave 3 - liquor store
buddy_cover_point_data[4].pos = vChefCoverPointLiquorStore
buddy_cover_point_data[4].cover_from_pos = <<1394.83398, 3601.50195, 33.98091>>
buddy_cover_point_data[4].heading = 197.4313
buddy_cover_point_data[5].pos = vTrevorLiquorStartPos
buddy_cover_point_data[5].cover_from_pos = <<1394.83398, 3601.50195, 33.98091>>
buddy_cover_point_data[5].heading = 197.4313
//wave 0
wave_0_master_flow_system_status = 0
wave_0_dialogue_system_status = 0
wave_0_buddy_ai_system_status = 0
ramming_gates_cutscene_status = 0
wave_0_assisted_nodes_system_status = 0
//wave 1 - REMOVED @SBA
//wave2
wave_2_master_flow_system_status = 0
wave_2_dialogue_system_status = 0
wave_2_buddy_ai_system_status = 0
wave_2_assisted_nodes_system_status = 0
//wave3
wave_3_master_flow_system_status = 0
wave_3_dialogue_system_status = 0
wave_3_buddy_ai_system_status = 0
wave_3_assisted_nodes_system_status = 0
trevors_truck.pos = <<1960.0896, 3838.5664, 31.2088>>
trevors_truck.heading = 300.0665
trevors_truck.model = get_player_veh_model(char_trevor)
cheng.pos = <<1995.13013, 3058.72192, 46.05180>> //<<1996.9528, 3058.3777, 46.0490>>
cheng.heading = 0.0//179.1673
cheng.model = get_npc_ped_model(char_cheng) //IG_TaoCheng
cheng.weapon = WEAPONTYPE_INVALID // WEAPONTYPE_pistol
cheng.health = 500
cheng.name = "cheng"
translator.pos = <<2000.2826, 3056.5327, 46.0492>>
translator.heading = 323.0890//280.00
translator.model = IG_TaosTranslator
translator.weapon = WEAPONTYPE_INVALID // WEAPONTYPE_PUMPSHOTGUN
translator.health = 500
translator.name = "translator"
buddy.pos = <<1388.3929, 3607.6262, 37.9419>>
buddy.heading = 114.5685
buddy.model = GET_NPC_PED_MODEL(CHAR_CHEF) // @SBA - ensure we get correct model //A_M_Y_GenStreet_01 ig_cook
buddy.weapon = WEAPONTYPE_carbinerifle
buddy.health = 300 // @SBA - making the Chef more vulnerable. OLD = 1000
//WAVE 0
iWave0SetupStage = 0
wave_0_enemy[0].model = GoonModel2//A_M_Y_BeachVesp_01 //U_M_M_CHEMSEC_01
wave_0_enemy[0].pos = <<1353.6407, 3603.9707, 33.9350>>
wave_0_enemy[0].heading = 215.4769
wave_0_enemy[0].run_to_pos = <<1362.16003, 3590.75684, 33.93283>>
wave_0_enemy[0].health = 200
wave_0_enemy[0].weapon = WEAPONTYPE_ASSAULTRIFLE
wave_0_enemy[0].accuracy = 2
wave_0_enemy[0].damaged_by_player = true
wave_0_enemy[0].name = "wave_0 0"
wave_0_enemy[1].model = GoonModel1
wave_0_enemy[1].pos = <<1349.3075, 3607.7500, 33.9041>>
wave_0_enemy[1].heading = 229.00
wave_0_enemy[1].run_to_pos = <<1364.8840, 3600.9895, 33.8943>>
wave_0_enemy[1].health = 200
wave_0_enemy[1].weapon = weapontype_pistol
wave_0_enemy[1].accuracy = 2
wave_0_enemy[1].name = "wave_0 1"
wave_0_enemy[2].model = GoonModel2
wave_0_enemy[2].run_to_pos = <<1363.7, 3585.7, 34.3>>//<<1367.6045, 3587.3115, 33.9385>>//<<1363.6156, 3584.8359, 33.9350>>
wave_0_enemy[2].health = 200
wave_0_enemy[2].weapon = WEAPONTYPE_ASSAULTRIFLE
wave_0_enemy[2].accuracy = 2
wave_0_enemy[2].damaged_by_player = true
wave_0_enemy[2].name = "wave_0 2"
wave_0_enemy[3].model = GoonModel1
wave_0_enemy[3].run_to_pos = <<1374.11609, 3588.79761, 33.92868>>
wave_0_enemy[3].health = 200
wave_0_enemy[3].weapon = weapontype_pistol
wave_0_enemy[3].accuracy = 2
wave_0_enemy[3].name = "wave_0 3"
wave_0_enemy[4].model = GoonModel2
wave_0_enemy[4].run_to_pos = <<1369.97827, 3596.78906, 33.89490>>
wave_0_enemy[4].health = 200
wave_0_enemy[4].weapon = weapontype_pistol
wave_0_enemy[4].accuracy = 2
wave_0_enemy[4].damaged_by_player = true
wave_0_enemy[4].name = "wave_0 4"
wave_0_enemy[5].model = GoonModel1
wave_0_enemy[5].run_to_pos = <<1375.2, 3602.02, 34.0>> // doors = <<1394.700, 3598.500, 35.1>> // @SBA - want this guy to run to doors. OLD = <<1372.86182, 3594.96143, 33.85409>>//<<1370.9216, 3596.7520, 33.8951>>
wave_0_enemy[5].health = 200
wave_0_enemy[5].weapon = WEAPONTYPE_PUMPSHOTGUN
wave_0_enemy[5].accuracy = 2
wave_0_enemy[5].name = "wave_0 5"
wave_0_enemy[6].model = GoonModel2
wave_0_enemy[6].run_to_pos = <<1373.23328, 3589.86597, 34.06313>>
wave_0_enemy[6].health = 200
wave_0_enemy[6].weapon = WEAPONTYPE_ASSAULTRIFLE
wave_0_enemy[6].accuracy = 2
wave_0_enemy[6].damaged_by_player = true
wave_0_enemy[6].name = "wave_0 6"
wave_0_enemy[7].model = GoonModel1
wave_0_enemy[7].run_to_pos = <<1367.63049, 3601.10352, 33.90302>>//<<1366.8850, 3596.2249, 33.8948>>
wave_0_enemy[7].health = 200
wave_0_enemy[7].weapon = weapontype_pistol
wave_0_enemy[7].accuracy = 2
wave_0_enemy[7].name = "wave_0 7"
wave_0_enemy[8].model = GoonModel2
wave_0_enemy[8].run_to_pos = <<1365.79187, 3601.94165, 33.90197>>
wave_0_enemy[8].health = 200
wave_0_enemy[8].weapon = WEAPONTYPE_PUMPSHOTGUN
wave_0_enemy[8].accuracy = 2
wave_0_enemy[8].name = "wave_0 8"
// wave_0_enemy[9].pos = <<1351.1438, 3609.5547, 33.8506>>
// wave_0_enemy[9].model = GoonModel1
// wave_0_enemy[9].run_to_pos = <<1367.3512, 3595.8589, 33.8949>>
// wave_0_enemy[9].health = 200
// wave_0_enemy[9].weapon = weapontype_pistol
// wave_0_enemy[9].accuracy = 2
// wave_0_enemy[9].damaged_by_player = true
// wave_0_enemy[9].name = "wave_0 9"
wave_0_enemy_vehicle[0].pos = <<1274.0476, 3643.2988, 32.3214>>
wave_0_enemy_vehicle[0].heading = 287.7983
wave_0_enemy_vehicle[0].model = dubsta2
wave_0_enemy_vehicle[0].recording_number = 001
wave_0_enemy_vehicle[1].pos = <<1313.1727, 3658.6948, 32.0836>>
wave_0_enemy_vehicle[1].heading = 181.0355
wave_0_enemy_vehicle[1].model = dubsta2
wave_0_enemy_vehicle[1].recording_number = 002
wave_0_enemy_vehicle[2].pos = <<930.5292, 3564.9253, 32.8149>>
wave_0_enemy_vehicle[2].heading = 189.5711
wave_0_enemy_vehicle[2].model = sadler
wave_0_enemy_vehicle[2].recording_number = 003
//WAVE 0 - INSIDE ENEMIES
wave_0_inside_enemy[0].model = GoonModel2
wave_0_inside_enemy[0].run_to_pos = <<1385.6793, 3619.9067, 37.9258>>
wave_0_inside_enemy[0].health = 200
wave_0_inside_enemy[0].weapon = weapontype_pistol
wave_0_inside_enemy[0].accuracy = 2
//wave_0_inside_enemy[0].damaged_by_player = true
wave_0_inside_enemy[0].name = "wave_0 I 0"
wave_0_inside_enemy[1].model = GoonModel1
wave_0_inside_enemy[1].run_to_pos = <<1392.2399, 3617.5964, 37.9258>>
wave_0_inside_enemy[1].health = 200
wave_0_inside_enemy[1].weapon = weapontype_smg
wave_0_inside_enemy[1].accuracy = 2
wave_0_inside_enemy[1].name = "wave_0 I 1"
wave_0_inside_enemy[2].model = GoonModel2
wave_0_inside_enemy[2].run_to_pos = <<1385.6793, 3619.9067, 37.9258>>
wave_0_inside_enemy[2].health = 200
wave_0_inside_enemy[2].weapon = weapontype_pistol
wave_0_inside_enemy[2].accuracy = 2
//wave_0_inside_enemy[2].damaged_by_player = true
wave_0_inside_enemy[2].name = "wave_0 I 2"
wave_0_inside_enemy[3].model = GoonModel1
wave_0_inside_enemy[3].run_to_pos = <<1392.4437, 3617.7678, 37.9258>>
wave_0_inside_enemy[3].health = 200
wave_0_inside_enemy[3].weapon = WEAPONTYPE_PUMPSHOTGUN
wave_0_enemy[3].accuracy = 2
wave_0_inside_enemy[3].name = "wave_0 I 3"
//WAVE 1 - REMOVED @SBA
//WAVE 2
//ENEMIES ON FOOT
wave_2_enemy[0].pos = <<1478.80, 3653.09, 33.79>>//<<1473.9318, 3632.6509, 33.8312>>
wave_2_enemy[0].heading = 109.3158
wave_2_enemy[0].model = GoonModel2
wave_2_enemy[0].run_to_pos = <<1433.0659, 3622.7234, 34.7774>>
wave_2_enemy[0].health = 200
wave_2_enemy[0].weapon = weapontype_pistol
wave_2_enemy[0].accuracy = 2
wave_2_enemy[0].damaged_by_player = true
wave_2_enemy[0].name = "wave_2 0"
wave_2_enemy[1].pos = <<1497.8187, 3597.0610, 34.4572>>//<<1472.5101, 3635.0879, 33.7732>>
wave_2_enemy[1].heading = 61.9718 //129.7310
wave_2_enemy[1].model = GoonModel1
wave_2_enemy[1].run_to_pos = <<1434.63062, 3610.20190, 33.86340>>
wave_2_enemy[1].health = 200
wave_2_enemy[1].weapon = WEAPONTYPE_ASSAULTRIFLE
wave_2_enemy[1].accuracy = 2
wave_2_enemy[1].name = "wave_2 1"
wave_2_enemy[2].pos = <<1500.47, 3642.82, 33.87>>
wave_2_enemy[2].heading = 110.4908//119.1874
wave_2_enemy[2].model = GoonModel2
wave_2_enemy[2].run_to_pos = <<1424.91467, 3626.70874, 33.84133>>
wave_2_enemy[2].health = 200
wave_2_enemy[2].weapon = WEAPONTYPE_PUMPSHOTGUN
wave_2_enemy[2].accuracy = 2
wave_2_enemy[2].damaged_by_player = true
wave_2_enemy[2].name = "wave_2 2"
wave_2_enemy[3].pos = <<1481.33, 3655.46, 33.87>>//<<1477.9222, 3637.6001, 33.8724>>
wave_2_enemy[3].heading = 120.00
wave_2_enemy[3].model = GoonModel1
wave_2_enemy[3].run_to_pos = <<1446.2058, 3614.8169, 33.8532>>
wave_2_enemy[3].health = 200
wave_2_enemy[3].weapon = WEAPONTYPE_ASSAULTRIFLE
wave_2_enemy[3].accuracy = 2
wave_2_enemy[3].name = "wave_2 3"
wave_2_enemy[4].heading = 127.3335
wave_2_enemy[4].model = GoonModel2
wave_2_enemy[4].run_to_pos = <<1420.5912, 3625.5984, 33.8292>>// @SBA - run to stairs pos = <<1404.1445, 3628.6165, 33.8927>>
wave_2_enemy[4].health = 200
wave_2_enemy[4].weapon = weapontype_pistol
wave_2_enemy[4].accuracy = 2
wave_2_enemy[4].damaged_by_player = true
wave_2_enemy[4].name = "wave_2 4"
wave_2_enemy[5].heading = 121.0459
wave_2_enemy[5].model = GoonModel1
wave_2_enemy[5].run_to_pos = <<1433.7379, 3613.1348, 33.9168>>// @SBA - run to stairs pos = <<1404.1445, 3628.6165, 33.8927>>
wave_2_enemy[5].health = 200
wave_2_enemy[5].weapon = weapontype_pistol
wave_2_enemy[5].accuracy = 2
wave_2_enemy[5].damaged_by_player = true // @SBA - keep Chef from killing this guy before he can rush
wave_2_enemy[5].name = "wave_2 5"
//ENEMIES IN CARS
wave_2_enemy[6].model = GoonModel2
wave_2_enemy[6].run_to_pos = <<1425.9056, 3619.8916, 33.9196>>
wave_2_enemy[6].health = 200
wave_2_enemy[6].weapon = WEAPONTYPE_ASSAULTRIFLE
wave_2_enemy[6].accuracy = 2
wave_2_enemy[6].name = "wave_2 6"
wave_2_enemy[7].model = GoonModel1
wave_2_enemy[7].run_to_pos = <<1421.1597, 3623.3892, 33.8677>>
wave_2_enemy[7].health = 200
wave_2_enemy[7].weapon = weapontype_pistol
wave_2_enemy[7].accuracy = 2
wave_2_enemy[7].damaged_by_player = true
wave_2_enemy[7].name = "wave_2 7"
wave_2_enemy[8].model = GoonModel2
wave_2_enemy[8].run_to_pos = <<1422.8757, 3617.6958, 33.9261>>
wave_2_enemy[8].health = 200
wave_2_enemy[8].weapon = WEAPONTYPE_PUMPSHOTGUN
wave_2_enemy[8].accuracy = 2
wave_2_enemy[8].name = "wave_2 8"
wave_2_enemy[9].model = GoonModel1
wave_2_enemy[9].run_to_pos = <<1427.4917, 3615.0203, 33.9644>>
wave_2_enemy[9].health = 200
wave_2_enemy[9].weapon = WEAPONTYPE_ASSAULTRIFLE
wave_2_enemy[9].accuracy = 2
wave_2_enemy[9].name = "wave_2 9"
wave_2_enemy[10].model = GoonModel2
wave_2_enemy[10].run_to_pos = <<1431.5154, 3614.6177, 33.9824>>
wave_2_enemy[10].health = 200
wave_2_enemy[10].weapon = weapontype_pistol
wave_2_enemy[10].accuracy = 2
wave_2_enemy[10].damaged_by_player = true
wave_2_enemy[10].name = "wave_2 10"
wave_2_enemy[11].model = GoonModel1
wave_2_enemy[11].run_to_pos = <<1429.3192, 3610.2139, 33.8893>>
wave_2_enemy[11].health = 200
wave_2_enemy[11].weapon = WEAPONTYPE_PUMPSHOTGUN
wave_2_enemy[11].accuracy = 2
wave_2_enemy[11].name = "wave_2 11"
wave_2_enemy[12].model = GoonModel2
wave_2_enemy[12].run_to_pos = <<1425.9056, 3619.8916, 33.9196>>
wave_2_enemy[12].health = 200
wave_2_enemy[12].weapon = WEAPONTYPE_ASSAULTRIFLE
wave_2_enemy[12].accuracy = 2
wave_2_enemy[12].name = "wave_2 12"
wave_2_enemy[13].model = GoonModel1
wave_2_enemy[13].run_to_pos = <<1421.1597, 3623.3892, 33.8677>>
wave_2_enemy[13].health = 200
wave_2_enemy[13].weapon = weapontype_pistol
wave_2_enemy[13].accuracy = 2
wave_2_enemy[13].damaged_by_player = true
wave_2_enemy[13].name = "wave_2 13"
wave_2_enemy[14].model = GoonModel2
wave_2_enemy[14].run_to_pos = <<1422.8757, 3617.6958, 33.9261>>
wave_2_enemy[14].health = 200
wave_2_enemy[14].weapon = WEAPONTYPE_PUMPSHOTGUN
wave_2_enemy[14].accuracy = 2
wave_2_enemy[14].name = "wave_2 14"
wave_2_enemy[15].model = GoonModel1
wave_2_enemy[15].run_to_pos = <<1427.4917, 3615.0203, 33.9644>>
wave_2_enemy[15].health = 200
wave_2_enemy[15].weapon = WEAPONTYPE_ASSAULTRIFLE
wave_2_enemy[15].accuracy = 2
wave_2_enemy[15].name = "wave_2 15"
wave_2_enemy[16].model = GoonModel2
wave_2_enemy[16].run_to_pos = <<1431.5154, 3614.6177, 33.9824>>
wave_2_enemy[16].health = 200
wave_2_enemy[16].weapon = weapontype_pistol
wave_2_enemy[16].accuracy = 2
wave_2_enemy[16].name = "wave_2 16"
wave_2_enemy[17].model = GoonModel1
wave_2_enemy[17].run_to_pos = <<1429.3192, 3610.2139, 33.8893>>
wave_2_enemy[17].health = 200
wave_2_enemy[17].weapon = WEAPONTYPE_PUMPSHOTGUN
wave_2_enemy[17].accuracy = 2
wave_2_enemy[17].damaged_by_player = true
wave_2_enemy[17].name = "wave_2 17"
//more running enemies
wave_2_enemy[18].pos = <<1499.98, 3646.73, 33.78>>
wave_2_enemy[18].heading = 117.6692
wave_2_enemy[18].model = GoonModel2
wave_2_enemy[18].run_to_pos = <<1420.90442, 3623.09033, 33.86813>>
wave_2_enemy[18].health = 200
wave_2_enemy[18].weapon = WEAPONTYPE_PUMPSHOTGUN
wave_2_enemy[18].accuracy = 2
wave_2_enemy[18].name = "wave_2 18"
wave_2_enemy[19].pos = <<1492.34, 3667.31, 33.71>>
wave_2_enemy[19].heading = 117.3643
wave_2_enemy[19].model = GoonModel1
wave_2_enemy[19].run_to_pos = <<1444.5588, 3622.1567, 33.7832>>
wave_2_enemy[19].health = 200
wave_2_enemy[19].weapon = WEAPONTYPE_ASSAULTRIFLE
wave_2_enemy[19].accuracy = 2
wave_2_enemy[19].damaged_by_player = true
wave_2_enemy[19].name = "wave_2 19"
wave_2_enemy_vehicle[0].pos = <<1183.3048, 3559.6870, 34.4826>>
wave_2_enemy_vehicle[0].heading = 274.0203
wave_2_enemy_vehicle[0].model = phoenix
wave_2_enemy_vehicle[0].recording_number = 020
wave_2_enemy_vehicle[1].pos = <<1633.7235, 3618.2314, 35.3348>>
wave_2_enemy_vehicle[1].heading = 274.0203
wave_2_enemy_vehicle[1].model = sadler
wave_2_enemy_vehicle[1].recording_number = 009
wave_2_enemy_vehicle[2].pos = <<1564.2393, 3729.5574, 34.0375>>
wave_2_enemy_vehicle[2].heading = 31.0876
wave_2_enemy_vehicle[2].model = dubsta2
wave_2_enemy_vehicle[2].recording_number = 021
wave_2_enemy_vehicle[3].pos = <<1586.9836, 3695.9495, 33.9163>>
wave_2_enemy_vehicle[3].heading = 274.0203
wave_2_enemy_vehicle[3].model = pcj
wave_2_enemy_vehicle[3].recording_number = 017
wave_2_enemy_vehicle[4].pos = <<1630.4724, 3622.4307, 34.9559 >>
wave_2_enemy_vehicle[4].heading = 274.0203
wave_2_enemy_vehicle[4].model = pcj
wave_2_enemy_vehicle[4].recording_number = 018
wave_2_enemy_vehicle[5].pos = <<1570.2612, 3720.8474, 34.3386>>
wave_2_enemy_vehicle[5].heading = 274.0203
wave_2_enemy_vehicle[5].model = phoenix
wave_2_enemy_vehicle[5].recording_number = 019
wave_2_enemy_vehicle[6].pos = <<1510.2731, 3555.9585, 34.3625>>
wave_2_enemy_vehicle[6].heading = 106.7575
wave_2_enemy_vehicle[6].model = phoenix
wave_2_enemy_vehicle[6].recording_number = 010
wave_2_enemy_vehicle[7].pos = <<1191.8964, 3532.9456, 34.1179>>
wave_2_enemy_vehicle[7].heading = 274.0203
wave_2_enemy_vehicle[7].model = phoenix
wave_2_enemy_vehicle[7].recording_number = 008
//WAVE 3 - @SBA - they all can be damaged by Chef
wave_3_enemy[0].model = GoonModel2
wave_3_enemy[0].run_to_pos = <<1392.9648, 3598.3315, 34.0295>>
wave_3_enemy[0].health = 200
wave_3_enemy[0].weapon = WEAPONTYPE_ASSAULTRIFLE
wave_3_enemy[0].accuracy = 2
//wave_3_enemy[0].damaged_by_player = true
wave_3_enemy[0].name = "wave3_ortega"
wave_3_enemy[1].model = GoonModel1
wave_3_enemy[1].run_to_pos = <<1395.8434, 3599.8474, 34.0031>>
wave_3_enemy[1].health = 200
wave_3_enemy[1].weapon = weapontype_smg
wave_3_enemy[1].accuracy = 2
wave_3_enemy[1].name = "wave_3 1"
wave_3_enemy[2].model = GoonModel2
wave_3_enemy[2].run_to_pos = <<1394.6, 3597.5, 35.0>> // @SBA - setting a position nearer the front door. OLD = <<1395.7645, 3594.6904, 33.9130>>
wave_3_enemy[2].health = 200
wave_3_enemy[2].weapon = WEAPONTYPE_ASSAULTRIFLE
wave_3_enemy[2].accuracy = 2
//wave_3_enemy[2].damaged_by_player = true
wave_3_enemy[2].name = "wave_3 2"
wave_3_enemy[3].model = GoonModel1
wave_3_enemy[3].run_to_pos = <<1398.4982, 3593.2292, 33.8867>>
wave_3_enemy[3].health = 200
wave_3_enemy[3].weapon = weapontype_pistol
wave_3_enemy[3].accuracy = 2
wave_3_enemy[3].name = "wave_3 3"
ambient_enemy[0].model = GoonModel1
ambient_enemy[0].run_to_pos = <<1397.9803, 3592.6746, 33.7258>>
ambient_enemy[0].health = 200
ambient_enemy[0].weapon = weapontype_pistol
ambient_enemy[0].accuracy = 5
ambient_enemy[0].name = "ambient 0"
ambient_enemy[1].model = GoonModel1
ambient_enemy[1].run_to_pos = <<1386.96, 3575.22, 33.97>>
ambient_enemy[1].health = 200
ambient_enemy[1].weapon = weapontype_pistol
ambient_enemy[1].accuracy = 5
ambient_enemy[1].name = "ambient 1"
ambient_enemy[2].model = GoonModel1
ambient_enemy[2].run_to_pos = <<1387.1794, 3585.0732, 33.8415>>
ambient_enemy[2].health = 200
ambient_enemy[2].weapon = weapontype_pistol
ambient_enemy[2].accuracy = 5
ambient_enemy[2].name = "ambient 2"
ambient_enemy[3].model = GoonModel1
ambient_enemy[3].run_to_pos = <<1377.14, 3580.02, 34.02>>
ambient_enemy[3].health = 200
ambient_enemy[3].weapon = weapontype_pistol
ambient_enemy[3].accuracy = 5
ambient_enemy[3].name = "ambient 3"
wave_3_enemy_vehicle[0].pos = <<1184.7596, 3558.3193, 34.2744>>
wave_3_enemy_vehicle[0].heading = 189.00
wave_3_enemy_vehicle[0].model = dubsta2
wave_3_enemy_vehicle[0].recording_number = 007
ambient_enemy_vehicle[0].pos = <<1169.8923, 3537.2869, 34.0337>>
ambient_enemy_vehicle[0].heading = 269.5452
ambient_enemy_vehicle[0].model = phoenix
ambient_enemy_vehicle[0].recording_number = 011
ambient_enemy_vehicle[1].pos = <<1128.6812, 3539.9797, 33.7354>>
ambient_enemy_vehicle[1].heading = 262.7058
ambient_enemy_vehicle[1].model = phoenix
ambient_enemy_vehicle[1].recording_number = 012
c4[0].model = GET_WEAPONTYPE_MODEL(WEAPONTYPE_STICKYBOMB)
c4[1].model = GET_WEAPONTYPE_MODEL(WEAPONTYPE_STICKYBOMB)
c4[2].model = GET_WEAPONTYPE_MODEL(WEAPONTYPE_STICKYBOMB)
// c4_nodes[0].pos = <<1378.857, 3601.824, 34.900>>
// c4_nodes[0].heading = 180.00
// c4_nodes[0].planted = false
//
// c4_nodes[1].pos = <<1362.4718, 3591.5798, 33.9255>>
// c4_nodes[1].heading = 180.00
// c4_nodes[1].planted = false
//
// c4_nodes[2].pos = <<1373.4763, 3602.8335, 33.8946>>
// c4_nodes[2].heading = 180.00
// c4_nodes[2].planted = false
//
// c4_nodes[3].pos = <<1374.6613, 3585.6296, 33.929>>
// c4_nodes[3].heading = 180.00
// c4_nodes[3].planted = false
//
// c4_nodes[4].pos = <<1381.0747, 3597.1887, 33.8747>>
// c4_nodes[4].heading = 180.00
// c4_nodes[4].planted = false
//
// c4_nodes[5].pos = <<1381.2036, 3590.4878, 33.8771>>
// c4_nodes[5].heading = 180.00
// c4_nodes[5].planted = false
//
// c4_nodes[6].pos = <<1375.9454, 3588.1265, 33.8806>>
// c4_nodes[6].heading = 180.00
// c4_nodes[6].planted = false
//
// c4_nodes[7].pos = <<1370.5957, 3590.5942, 33.9001>>
// c4_nodes[7].heading = 180.00
// c4_nodes[7].planted = false
//
// c4_nodes[8].pos = <<1362.4718, 3591.5798, 33.9255>>
// c4_nodes[8].heading = 180.00
// c4_nodes[8].planted = false
//
// c4_nodes[9].pos = <<1359.7563, 3598.7205, 33.8910>>
// c4_nodes[9].heading = 180.00
// c4_nodes[9].planted = false
bins[0].model = PROP_CS_DUMPSTER_01A
bins[0].pos = <<1365.95, 3601.94, 34.43>>
bins[0].rot = <<0.0, 0.0, 120.00>>
// bins[1].model = PROP_CS_DUMPSTER_01A
// bins[1].pos = <<1367.00, 3593.720, 34.430>>
// bins[1].rot = <<0.0, 0.0, 80.0>>
bins[1].model = PROP_CS_DUMPSTER_01A
bins[1].pos = <<1374.370, 3589.740, 34.430>>
bins[1].rot = <<0.0, 0.0, 122.000>>
bins[2].model = PROP_CS_DUMPSTER_01A
bins[2].pos = <<1424.570, 3625.710, 34.370>>
bins[2].rot = <<0.0, 0.0, 305.00>>
explosive_barrels[0].pos = <<1362.49011, 3603.48438, 34.270>>
explosive_barrels[0].rot = <<0.0, 0.0, 0.0>>
explosive_barrels[0].model = PROP_GASCYL_01A
explosive_barrels[1].pos = <<1368.92529, 3606.08716, 34.3>>
explosive_barrels[1].rot = <<0.0, 0.0, 0.0>>
explosive_barrels[1].model = PROP_GASCYL_01A
explosive_barrels[2].pos = <<1361.08, 3595.01, 34.3>>
explosive_barrels[2].rot = <<0.0, 0.0, 0.0>>
explosive_barrels[2].model = PROP_GASCYL_01A
explosive_barrels[3].pos = <<1419.650, 3627.000, 34.180>>
explosive_barrels[3].rot = <<0.0, 0.0, 0.0>>
explosive_barrels[3].model = PROP_GASCYL_01A
cover_box.model = Prop_boxpile_02b//Prop_cratepile_07a
cover_box.pos = <<1409.990, 3623.510, 34.020>>
cover_box.rot = <<0.0, 0.0, 70.00>>
// explosive_barrels[3].pos = <<1421.310, 3627.840, 34.250>>
// explosive_barrels[3].rot = <<0.0, 0.0, 0.0>>
// explosive_barrels[3].model = Prop_Gas_Tank_01a
for i = 0 to count_of(wave_0_enemy) - 1
wave_0_enemy[i].created = false
wave_0_enemy[i].bRushInside = FALSE // @SBA - init this bool
wave_0_enemy[i].been_killed = FALSE
wave_0_status[i] = initial_attack_phase
endfor
for i = 0 to count_of(wave_0_inside_enemy_status) - 1
wave_0_inside_enemy[i].created = false
wave_0_inside_enemy[i].bRushInside = FALSE // @SBA - init this bool
wave_0_inside_enemy[i].been_killed = FALSE
wave_0_inside_enemy_status[i] = 0
endfor
for i = 0 to count_of(wave_2_enemy) - 1
wave_2_enemy[i].created = false
wave_2_enemy[i].bRushInside = FALSE // @SBA - init this bool
wave_2_enemy[i].been_killed = FALSE
wave_2_status[i] = initial_attack_phase
endfor
for i = 0 to count_of(wave_3_enemy) - 1
wave_3_enemy[i].created = false
wave_3_enemy[i].bRushInside = FALSE // @SBA - init this bool
wave_3_enemy[i].been_killed = FALSE
wave_3_status[i] = initial_attack_phase
endfor
// @SBA - Making sure this is initialized
for i = 0 to count_of(ambient_enemy) - 1
ambient_enemy[i].created = false
ambient_enemy[i].bRushInside = FALSE // @SBA - init this bool
ambient_enemy[i].been_killed = FALSE
ambient_enemy_status[i] = initial_attack_phase
endfor
for i = 0 to count_of(remaining_enemy) - 1
remaining_enemy_status[0] = 0
endfor
for i = 0 to count_of(wave_0_enemy_vehicle) - 1
wave_0_enemy_vehicle[i].been_destroyed = false
endfor
for i = 0 to count_of(wave_2_enemy_vehicle) - 1
wave_2_enemy_vehicle[i].been_destroyed = false
endfor
for i = 0 to count_of(wave_3_enemy_vehicle) - 1
wave_3_enemy_vehicle[i].been_destroyed = false
endfor
for i = 0 to count_of(ambient_enemy_vehicle) - 1
ambient_enemy_vehicle[i].been_destroyed = false
endfor
// @SBA - initializing trigger volumes
tbArrivalCutResolveVol = CREATE_TRIGGER_BOX(<<1380.224609,3593.346436,33.850239>>, <<1414.539917,3604.536865,35.898521>>, 13.000000)
tbFrontDoorVolume = CREATE_TRIGGER_BOX((<<1394.211304,3599.770264,33.519615>>), (<<1395.355469,3596.857910,35.675140>>), 4.0)
// This is an area behind the Chef: tbUpstairsRushVolume = CREATE_TRIGGER_BOX((<<1395.018799,3604.429932,37.441910>>), (<<1391.960327,3603.366455,39.691910>> ), 6.0)
tbUpstairsRushVolume = CREATE_TRIGGER_BOX((<<1391.724731,3601.888916,37.95>>), (<<1399.914551,3605.850098,39.691910>>), 4.75)
tbUpstairsCloserRushVolume = CREATE_TRIGGER_BOX((<<1395.802002,3603.719238,37.941910>>), <<1391.546997,3602.099609,39.691910>>, 3.50)
tbTopBackStairsVolume = CREATE_TRIGGER_BOX((<<1387.596436,3621.771484,37.832703>>), (<<1389.516235,3616.653320,39.675831>> ), 8.5)
tbBackStairsAlleyVolume = CREATE_TRIGGER_BOX((<<1387.938843,3626.496338,33.891834>>), (<<1379.320801,3623.467285,35.641552>>), 3.50)
tbOnBackStairsVolume = CREATE_TRIGGER_BOX((<<1388.321, 3622.040, 36.061>>), (<<1389.153, 3619.789, 41.061>>), 6.0)
tbFullBackStairsVolume = CREATE_TRIGGER_BOX(<<1388.212646,3622.047607,34.011982>>, <<1390.500977,3615.757324,39.675831>>, 13.500000)
tbOutsideMainGatesVolume = CREATE_TRIGGER_BOX((<<1377.952759,3608.572510,33.864216>>), (<<1384.160156,3591.729004,37.661396>>), 15.0)
tbBackYardVolume = CREATE_TRIGGER_BOX((<<1420.578491,3615.409424,33.436520>>), (<<1435.515747,3624.327637,35.786892>>), 29.0)
tbBackRoofVolume = CREATE_TRIGGER_BOX((<<1399.85681, 3610.41724,37.905733>>), (<<1409.257202,3613.888916,39.666866>>), 16.0)
tbBackFullRoofVolume = CREATE_TRIGGER_BOX((<<1398.830200,3625.614502,38.049397>>), (<<1407.572876,3602.470703,43.135361>>), 14.75)
tbBackUpstairsRoomVolume = CREATE_TRIGGER_BOX((<<1394.697021,3616.749023,38.10>>), (<<1399.886963,3602.334229,39.691910>>), 7.0)
tbBackGateVolume = CREATE_TRIGGER_BOX((<<1405.966675,3629.890869,33.642715>>), (<<1397.764038,3626.875977,35.645195>>), 4.5)
tbLiquorStoreVolume = CREATE_TRIGGER_BOX((<<1398.361328,3607.276123,33.680907>>), (<<1388.642090,3603.685547,35.730907>>), 8.0)
tbIceBoxInnerVol = CREATE_TRIGGER_BOX(<<1389.272461,3599.501709,33.895496>>, <<1382.610962,3597.052734,37.864140>>, 7.500000)
// @SBA smaller version tbIceBoxInnerVol = CREATE_TRIGGER_BOX(<<1388.118286,3599.011475,33.895119>>, <<1384.076221,3597.669922,37.895111>>, 5.00000)
tbIceBoxOuterVol = CREATE_TRIGGER_BOX(<<1392.669678,3600.705566,33.980907>>, <<1378.677124,3595.678711,37.389488>>, 17.000000)
tbIceBoxCameraVol = CREATE_TRIGGER_BOX(<<1390.041626,3600.490967,33.980907>>, <<1380.214233,3596.944092,37.389095>>, 14.500000)
//@SBA - initializing additional variables
bBarPatronsCreated = FALSE
bIsBarCleanedUp = FALSE
bClearCarGen = FALSE
bPlayerInVehicle = FALSE
bTrevorsVehicleIsOkay = FALSE
bDanceAnimDictUnloaded = FALSE
bLoadedLastShootoutStuff = FALSE
bPlayerInOpeningCover = FALSE
bStartedInitialWave = FALSE
bInitialWavePropsMade = FALSE
bSetTaxiDropoff = FALSE
bChefRunsToBackStairs = FALSE
bPlayGunFire = FALSE
iWaitTimeBeforeRush = 0
iWaveRushersSoFar = 0
iEnemyGrenLaunchDialogue = 0
bPickupAmmoSet = FALSE
bSkipGrenLaunchCutscene = FALSE
bOutroShitSkip = FALSE
bStartTranslatorEmergeBox = FALSE
bChefComeOn = FALSE
bTellChefGetInside = FALSE
bSetIceBoxBlip = FALSE
CANCEL_TIMER(tmrChefRunsDelay)
ArivialLeadInState = ALI_HALT_VEHICLE
// @SBA - Reset label
SET_LABEL_AS_TRIGGERED("attack_int", FALSE)
endproc
proc load_text_and_dialogue()
register_script_with_audio()
add_ped_for_dialogue(scripted_speech[0], 2, player_ped_id(), "trevor")
request_additional_text("MethAud", mission_dialogue_text_slot)
request_additional_text("METH", mission_text_slot)
while not has_additional_text_loaded(mission_text_slot)
or not has_additional_text_loaded(mission_dialogue_text_slot)
wait(0)
endwhile
endproc
proc get_to_meth_lab_dialogue_system()
switch get_to_meth_lab_dialogue_system_status
case 0
if create_conversation(scripted_speech[0], "methaud", "GETIN", conv_priority_medium)
original_time = get_game_timer()
get_to_meth_lab_dialogue_system_status++
endif
break
case 1
if not is_any_text_being_displayed(locates_data, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
// printstring("no text being displayed")
// printnl()
if dialogue_monitoring_system(locates_data.LocationBlip)
if not GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_ORTEGA_KILLED)
// @SBA - swapping in-car conversatiion with phone conversation per feedback
if PLAYER_CALL_CHAR_CELLPHONE(scripted_speech[0], char_chef, "MethAud", "CH1CAL", CONV_PRIORITY_high)
//Ross W - Recording phone call
REPLAY_RECORD_BACK_FOR_TIME(0.5, 5.0)
// @SBA - init timer for following conversation
iGetToMethLabDialogTimer = 0
get_to_meth_lab_dialogue_system_status++
endif
else
if PLAYER_CALL_CHAR_CELLPHONE(scripted_speech[0], char_chef, "MethAud", "CH1CAL2", CONV_PRIORITY_high)
// @SBA - init timer for following conversation
iGetToMethLabDialogTimer = 0
get_to_meth_lab_dialogue_system_status++
endif
endif
endif
else
// printstring("text being displayed")
// printnl()
endif
break
case 2
if dialogue_monitoring_system(locates_data.LocationBlip)
// @SBA - setting a timer for following conversation
IF iGetToMethLabDialogTimer = 0
iGetToMethLabDialogTimer = get_game_timer()
ENDIF
// @SBA - start next conversation once timer is up and if player is close to translator
IF lk_timer(iGetToMethLabDialogTimer, 2000)
IF distance_from_player_to_ped(translator.ped) < 8.0
// @SBA - swapping in-car conversation with phone conversation per feedback
//PRINTLN("CONVERSATION STARTING")
if create_conversation(scripted_speech[0], "methaud", "BANT1AV1", conv_priority_medium)
//script_assert("dialogue")
get_to_meth_lab_dialogue_system_status++
endif
ENDIF
endif
ENDIF
break
case 3
// We're done if conversation is over
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
get_to_meth_lab_dialogue_system_status++
ENDIF
// Pause conversation if player gets too far away
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
IF distance_from_player_to_ped(translator.ped) < 8.0
AND distance_from_player_to_ped(cheng.ped) < 8.0
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
ENDIF
ELIF distance_from_player_to_ped(translator.ped) >= 8.0
OR distance_from_player_to_ped(cheng.ped) >= 8.0
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
ENDIF
break
endswitch
endproc
proc setup_parked_cars()
parked_cars[0] = create_vehicle(phoenix, <<1362.9155, 3592.5757, 33.9161>>, 20.8352)
parked_cars[1] = create_vehicle(phoenix, <<1368.5109, 3603.1089, 33.9014>>, 22.1103)
parked_cars[2] = create_vehicle(phoenix, <<1419.4980, 3623.8757, 33.8507>>, 18.4636)
parked_cars[3] = create_vehicle(phoenix, <<1433.0057, 3611.3215, 33.8856>>, 15.7737)
//parked_cars[4] = create_vehicle(phoenix, <<1432.0254, 3616.4756, 33.9694>>, 105.1350)
for i = 0 to 3
set_vehicle_doors_locked(parked_cars[i], vehiclelock_locked)
SET_VEHICLE_DIRT_LEVEL(parked_cars[i], 13)
set_vehicle_colours(parked_cars[i], (i*5), (i*5))
endfor
CPRINTLN(DEBUG_MISSION, "setup_parked_cars: CREATED")
endproc
proc setup_wave_3_enemies()
//no_vehicle_recording_skip = true
for i = 0 to count_of(wave_3_enemy_vehicle) - 1
SETUP_ENEMY_VEHICLE(wave_3_enemy_vehicle[i])
start_playback_recorded_vehicle(wave_3_enemy_vehicle[i].veh, wave_3_enemy_vehicle[i].recording_number, "lkmethlab")
//CHI1_CAR_DAMAGE
if i = 0
if no_vehicle_recording_skip
skip_time_in_playback_recorded_vehicle(wave_3_enemy_vehicle[i].veh, 1000) //1000
else
skip_time_in_playback_recorded_vehicle(wave_3_enemy_vehicle[i].veh, 10500) //11000
endif
endif
endfor
if not GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_ORTEGA_KILLED)
create_npc_ped_inside_vehicle(wave_3_enemy[0].ped, char_ortega, wave_3_enemy_vehicle[0].veh)
setup_enemy_attributes(wave_3_enemy[0])
setup_relationship_enemy(wave_3_enemy[0].ped, true)
add_ped_for_dialogue(scripted_speech[0], 6, wave_3_enemy[0].ped, "ortega")
else
setup_enemy_in_vehicle(wave_3_enemy[0], wave_3_enemy_vehicle[0].veh)
endif
SET_PED_BLOCKS_PATHING_WHEN_DEAD(wave_3_enemy[0].ped, FALSE)
setup_enemy_in_vehicle(wave_3_enemy[1], wave_3_enemy_vehicle[0].veh, vs_front_right)
add_ped_for_dialogue(scripted_speech[0], 7, wave_3_enemy[1].ped, "azteca1")
SET_PED_BLOCKS_PATHING_WHEN_DEAD(wave_3_enemy[1].ped, FALSE)
setup_enemy_in_vehicle(wave_3_enemy[2], wave_3_enemy_vehicle[0].veh, vs_back_left)
add_ped_for_dialogue(scripted_speech[0], 8, wave_3_enemy[2].ped, "azteca2")
SET_PED_BLOCKS_PATHING_WHEN_DEAD(wave_3_enemy[2].ped, FALSE)
setup_enemy_in_vehicle(wave_3_enemy[3], wave_3_enemy_vehicle[0].veh, vs_back_right)
add_ped_for_dialogue(scripted_speech[0], ConvertSingleCharacter("B"), wave_3_enemy[3].ped, "azteca4")
SET_PED_BLOCKS_PATHING_WHEN_DEAD(wave_3_enemy[3].ped, FALSE)
//*****ambient enemies which the player does not have to kill to pass the mission*****
for i = 0 to count_of(ambient_enemy_vehicle) - 1
ambient_enemy_vehicle[i].veh = create_vehicle(ambient_enemy_vehicle[i].model, ambient_enemy_vehicle[i].pos, ambient_enemy_vehicle[i].heading)
SET_VEHICLE_DIRT_LEVEL(ambient_enemy_vehicle[i].veh, 13)
set_vehicle_doors_locked(ambient_enemy_vehicle[i].veh, vehiclelock_lockout_player_only)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(ambient_enemy_vehicle[i].veh, FALSE)
start_playback_recorded_vehicle(ambient_enemy_vehicle[i].veh, ambient_enemy_vehicle[i].recording_number, "lkmethlab")
if no_vehicle_recording_skip
skip_time_in_playback_recorded_vehicle(ambient_enemy_vehicle[i].veh, 0)
else
skip_time_in_playback_recorded_vehicle(ambient_enemy_vehicle[i].veh, 5000)//2000
endif
endfor
setup_enemy_in_vehicle(ambient_enemy[0], ambient_enemy_vehicle[0].veh)
set_blocking_of_non_temporary_events(ambient_enemy[0].ped, true)
SET_PED_CONFIG_FLAG(ambient_enemy[0].ped, PCF_GetOutBurningVehicle, FALSE)
SET_PED_CONFIG_FLAG(ambient_enemy[0].ped, PCF_RunFromFiresAndExplosions, FALSE)
remove_blip(ambient_enemy[0].blip)
setup_enemy_in_vehicle(ambient_enemy[1], ambient_enemy_vehicle[0].veh, vs_front_right)
set_blocking_of_non_temporary_events(ambient_enemy[1].ped, true)
//remove_blip(ambient_enemy[1].blip)
setup_enemy_in_vehicle(ambient_enemy[2], ambient_enemy_vehicle[1].veh)
set_blocking_of_non_temporary_events(ambient_enemy[2].ped, true)
SET_PED_CONFIG_FLAG(ambient_enemy[0].ped, PCF_GetOutBurningVehicle, FALSE)
SET_PED_CONFIG_FLAG(ambient_enemy[0].ped, PCF_RunFromFiresAndExplosions, FALSE)
remove_blip(ambient_enemy[2].blip)
setup_enemy_in_vehicle(ambient_enemy[3], ambient_enemy_vehicle[1].veh, vs_front_right)
set_blocking_of_non_temporary_events(ambient_enemy[3].ped, true)
//remove_blip(ambient_enemy[3].blip)
// piggy back in here
SET_INSTANCE_PRIORITY_HINT( INSTANCE_HINT_SHOOTING )
endproc
func bool are_all_ambient_entities_dead()
if is_ped_injured(ambient_enemy[0].ped)
and is_ped_injured(ambient_enemy[1].ped)
and is_ped_injured(ambient_enemy[2].ped)
and is_ped_injured(ambient_enemy[3].ped)
and not is_vehicle_driveable(ambient_enemy_vehicle[0].veh)
and not is_vehicle_driveable(ambient_enemy_vehicle[1].veh)
return true
endif
return false
endfunc
proc skip_system()
#IF IS_DEBUG_BUILD
dont_do_j_skip(locates_data)
if is_keyboard_key_just_pressed(key_j)
CPRINTLN(DEBUG_MISSION,"skip_system: *** J KEY PRESSED ***")
// @SBA - make sure to reset to game cam if needed and clean cameras
IF NOT IS_GAMEPLAY_CAM_RENDERING()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ENDIF
IF DOES_CAM_EXIST(camera_a)
SET_CAM_ACTIVE(camera_a, FALSE)
DESTROY_CAM(camera_a)
ENDIF
IF DOES_CAM_EXIST(camera_b)
SET_CAM_ACTIVE(camera_b, FALSE)
DESTROY_CAM(camera_b)
ENDIF
IF NOT IS_PLAYER_CONTROL_ON(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
IF DOES_PICKUP_EXIST(puiGrenadeLauncher)
REMOVE_PICKUP(puiGrenadeLauncher)
ENDIF
switch mission_flow
case intro_mocap
if is_cutscene_active()
stop_cutscene()
endif
break
case get_to_meth_lab
switch get_to_meth_lab_skip_status
case 0
// @SBA - if player is not at meth lab yet
IF get_to_meth_lab_status = 0
clear_ped_tasks_immediately(player_ped_id())
clear_ped_tasks_immediately(cheng.ped)
clear_ped_tasks_immediately(translator.ped)
set_entity_coords(player_ped_id(), <<1403.1777, 3597.2070, 33.9251>>)
set_entity_coords(cheng.ped, <<1402.1777, 3597.2070, 33.9251>>)
set_entity_coords(translator.ped, <<1401.1777, 3597.2070, 33.9251>>)
get_to_meth_lab_skip_status++
// @SBA - if cutscene is active, stop it and goto exit state
ELIF get_to_meth_lab_status < 5
// @SBA - stop cutscene if playing
IF IS_CUTSCENE_ACTIVE()
IF IS_CUTSCENE_PLAYING()
CPRINTLN(DEBUG_MISSION,"*** SHOULD BE SKIPPING CUTSCENE ***")
STOP_CUTSCENE()
ELSE
CPRINTLN(DEBUG_MISSION,"*** SHOULD BE RELEASING CUTSCENE ***")
REMOVE_CUTSCENE()
ENDIF
ENDIF
// get interior if not gotten yet
IF get_to_meth_lab_status < 3
meth_interior = get_interior_at_coords_with_type(<<1392.5117, 3603.1851, 38.5>>, "v_methlab")
pin_interior_in_memory(meth_interior)
ENDIF
if is_audio_scene_active("CHI_1_DRIVE_TO_LAB")
stop_audio_scene("CHI_1_DRIVE_TO_LAB")
endif
set_entity_coords(player_ped_id(), vTrevorWindowStartPos)
get_to_meth_lab_status = 5
get_to_meth_lab_skip_status++
ENDIF
break
case 1
// @SBA - if player J-skips twice in this checkpoint, handle the second one to skip the cutscene
IF get_to_meth_lab_status < 5
// @SBA - stop cutscene if playing
IF IS_CUTSCENE_ACTIVE()
IF IS_CUTSCENE_PLAYING()
CPRINTLN(DEBUG_MISSION,"*** SHOULD BE SKIPPING CUTSCENE ***")
STOP_CUTSCENE()
ELSE
CPRINTLN(DEBUG_MISSION,"*** SHOULD BE RELEASING CUTSCENE ***")
REMOVE_CUTSCENE()
ENDIF
ENDIF
// get interior if not gotten yet
IF get_to_meth_lab_status < 3
meth_interior = get_interior_at_coords_with_type(<<1392.5117, 3603.1851, 38.5>>, "v_methlab")
pin_interior_in_memory(meth_interior)
ENDIF
if is_audio_scene_active("CHI_1_DRIVE_TO_LAB")
stop_audio_scene("CHI_1_DRIVE_TO_LAB")
endif
set_entity_coords(player_ped_id(), vTrevorWindowStartPos)
get_to_meth_lab_status = 5
get_to_meth_lab_skip_status++
ENDIF
break
case 2
break
endswitch
break
case wave_0_system
switch wave_0_system_skip_status
case 0
for i = 0 to count_of(wave_0_enemy) - 1
if not is_ped_injured(wave_0_enemy[i].ped)
SET_ENTITY_HEALTH(wave_0_enemy[i].ped, 2)
else
wave_0_enemy[i].created = true
endif
endfor
wave_0_system_skip_status++
break
case 1
if wave_0_master_flow_system_status > 2
// @SBA - get vehicle to destination, set stuff as if the cutscene finished
IF IS_VEHICLE_DRIVEABLE(wave_0_enemy_vehicle[2].veh)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(wave_0_enemy_vehicle[2].veh)
SKIP_TO_END_AND_STOP_PLAYBACK_RECORDED_VEHICLE(wave_0_enemy_vehicle[2].veh)
SET_ENTITY_PROOFS(wave_0_enemy_vehicle[2].veh, false, false, false, false, false)
if is_audio_scene_active("CHI_1_TRUCK_ARRIVES")
stop_audio_scene("CHI_1_TRUCK_ARRIVES")
endif
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(wave_0_enemy_vehicle[2].veh)
original_time = get_game_timer()
REMOVE_VEHICLE_BLIP(wave_0_enemy_vehicle[2])
ram_cutscene_finished = true
ELSE
ENDIF
ENDIF
for i = 0 to count_of(wave_0_inside_enemy) - 1
if not is_ped_injured(wave_0_inside_enemy[i].ped)
SET_ENTITY_HEALTH(wave_0_inside_enemy[i].ped, 2)
endif
endfor
CLEAR_TACTICAL_NAV_MESH_POINTS()
clear_ped_tasks_immediately(player_ped_id())
SET_ENTITY_COORDS(player_ped_id(), <<1386.0081, 3616.5083, 37.9258>>)
SET_ENTITY_HEADING(player_ped_id(), 326.3752)
set_blocking_of_non_temporary_events(buddy.ped, true)
clear_ped_tasks_immediately(buddy.ped)
SET_ENTITY_COORDS(buddy.ped, <<1385.1, 3615.6, 37.9258>>) // @SBA - updated coord. OLD = <<1386.9521, 3618.3870, 37.9258>>
SET_ENTITY_HEADING(buddy.ped, 264.0776) // @SBA updated heading. OLD = 164.0776
wave_0_dialogue_system_status = 2
wave_0_buddy_ai_system_status = 1
wave_0_assisted_nodes_system_status = 1
wave_0_master_flow_system_status = 5
wave_0_system_skip_status++
endif
break
endswitch
break
case wave_2_system
for i = 0 to count_of(wave_2_enemy) - 1
if not is_ped_injured(wave_2_enemy[i].ped)
SET_ENTITY_HEALTH(wave_2_enemy[i].ped, 2)
else
wave_2_enemy[i].created = true
endif
endfor
ped_structure_are_all_enemies_dead(wave_2_enemy)
clear_ped_tasks_immediately(player_ped_id())
SET_ENTITY_COORDS(player_ped_id(), <<1407.5627, 3612.4297, 38.0055>>)
SET_ENTITY_HEADING(player_ped_id(), 278.8889)
clear_ped_tasks_immediately(buddy.ped)
SET_ENTITY_COORDS(buddy.ped, <<1407.3434, 3614.1377, 38.0055>>)
SET_ENTITY_HEADING(buddy.ped, 272.0829)
wave_2_master_flow_system_status = 8
break
case wave_3_system
switch wave_3_system_skip_status
case 0
INT iPoint
clear_ped_tasks_immediately(player_ped_id())
SET_ENTITY_COORDS(player_ped_id(), <<1395.8505, 3610.0105, 33.9808>>)
SET_ENTITY_HEADING(player_ped_id(), 79.1915)
if IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(buddy.ped)
IF WAYPOINT_RECORDING_GET_NUM_POINTS("methlab3", iPoint)
SET_PED_WAYPOINT_PROGRESS(buddy.ped, iPoint - 1 )
ENDIF
ENDIF
clear_ped_tasks_immediately(buddy.ped)
// SET_ENTITY_COORDS(buddy.ped, <<1393.5751, 3609.3645, 33.9808>>)
// SET_ENTITY_HEADING(buddy.ped, 140.3637)
buddy_time = get_game_timer()
wave_3_system_skip_status++
break
// get Chef into cover after skip
CASE 1
TASK_PUT_PED_DIRECTLY_INTO_COVER(buddy.ped, vChefCoverPointLiquorStore, -1, TRUE, NORMAL_BLEND_DURATION, FALSE, FALSE, buddy_cover_point_data[4].cover_point, TRUE)
wave_3_buddy_ai_system_status = 4
wave_3_system_skip_status++
BREAK
case 2
for i = 0 to count_of(wave_3_enemy) - 1
if not is_ped_injured(wave_3_enemy[i].ped)
set_entity_health(wave_3_enemy[i].ped, 2)
else
wave_3_enemy[i].created = true
endif
endfor
ped_structure_are_all_enemies_dead(wave_3_enemy)
wave_3_system_skip_status++
break
case 3
set_entity_coords(player_ped_id(), <<1387.9937, 3598.5166, 33.8954>>)
if not does_blip_exist(ice_box_blip)
ice_box_blip = create_blip_for_coord(<<1388.0475, 3598.6162, 33.8954>>)
endif
wave_3_master_flow_system_status = 4
wave_3_system_skip_status++
break
case 4
break
endswitch
break
CASE mission_passed_mocap
// @SBA - stop final cutscene if playing
IF IS_CUTSCENE_ACTIVE()
CPRINTLN(DEBUG_MISSION,"*** SHOULD BE SKIPPING CUTSCENE ***")
STOP_CUTSCENE()
ENDIF
BREAK
endswitch
elif is_keyboard_key_just_pressed(key_p)
switch mission_flow
case get_to_meth_lab
remove_all_mission_assets()
mission_flow = load_stage_selector_assets
launch_mission_stage_menu_status = 0
break
case wave_0_system
remove_all_mission_assets()
mission_flow = load_stage_selector_assets
if (get_game_timer() - p_skip_time) > 3000
launch_mission_stage_menu_status = 2
else
launch_mission_stage_menu_status = 1
endif
p_skip_time = get_game_timer()
break
case wave_2_system
case wave_3_system
remove_all_mission_assets()
mission_flow = load_stage_selector_assets
if (get_game_timer() - p_skip_time) > 3000
launch_mission_stage_menu_status = 4
else
launch_mission_stage_menu_status = 3
endif
p_skip_time = get_game_timer()
break
endswitch
endif
if LAUNCH_MISSION_STAGE_MENU(menu_stage_selector, menu_return_stage)
remove_all_mission_assets()
launch_mission_stage_menu_status = menu_return_stage
mission_flow = load_stage_selector_assets
endif
#endif
endproc
//PURPOSE: makes sure the player's current vehicle is acceptible for the buddy locate. If not, create Trevor's truck.
proc setup_vehicle_outside_bar()
IF bTrevorsVehicleIsOkay
EXIT
ENDIF
IF not does_entity_exist(trevors_truck.veh)
if has_model_loaded(trevors_truck.model)
if not is_players_last_vehicle_present_and_acceptable(GET_PLAYERS_LAST_VEHICLE(), <<2000.1245, 3059.5662, 46.0491>>, 2, <<2008.9219, 3054.0513, 46.0528>>, 326.3415)
CPRINTLN(DEBUG_MISSION, "Player needs an appropriate vehicle. Making one.")
WHILE NOT CREATE_PLAYER_VEHICLE(trevors_truck.veh, CHAR_TREVOR, <<2000.1245, 3059.5662, 46.0491>>, 59.1994, false)
WAIT(0)
CPRINTLN(DEBUG_MISSION, "Waiting on new vehicle...")
ENDWHILE
OVERRIDE_REPLAY_CHECKPOINT_VEHICLE(trevors_truck.veh)
ELSE
//IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(trevors_truck.veh), (<<2000.1245, 3059.5662, 46.0491>>)) > 20.0
trevors_truck.veh = GET_PLAYERS_LAST_VEHICLE()
CPRINTLN(DEBUG_MISSION, "Need to relocate player's vehicle")
SET_ENTITY_COORDS(trevors_truck.veh, (<<2000.1245, 3059.5662, 46.0491>>))
SET_ENTITY_HEADING(trevors_truck.veh, 59.1994)
SET_VEHICLE_ON_GROUND_PROPERLY(trevors_truck.veh)
//ENDIF
endif
CPRINTLN(DEBUG_MISSION, "Player should have vehicle")
bTrevorsVehicleIsOkay = TRUE
endif
ENDIF
endproc
PROC CLEAR_OLD_CAR_GEN()
DELETE_VEHICLE_GEN_VEHICLES_IN_AREA(vTrevorsVehicleMethLabLoc, 10.0)
CLEAR_AREA(vTrevorsVehicleMethLabLoc, 10.0, TRUE)
ENDPROC
func bool is_player_infront_of_door()
vector vec_BA
vector door_forward_vec
vec_BA = (<<1398.80, 3607.94, 39.19>> - GET_ENTITY_COORDS(player_ped_id()))
door_forward_vec = <<1402.35, 3609.46, 39.35>> - <<1398.80, 3607.94, 39.19>>
if dot_product(vec_BA, door_forward_vec) < 0.0
#IF IS_DEBUG_BUILD
printstring("infront")
printnl()
#endif
return true
endif
return false
endfunc
proc request_start_of_mission_assets()
request_model(GET_PLAYER_PED_MODEL(char_trevor))
request_model(cheng.model)
request_model(translator.model)
request_model(get_player_veh_model(char_trevor))
request_vehicle_asset(trevors_truck.model, enum_to_int(VRF_REQUEST_ALL_ANIMS))
request_model(bins[0].model)
request_anim_dict(sCrazyDanceDict)
endproc
func bool is_start_of_mission_assets_requested()
if has_model_loaded(GET_PLAYER_PED_MODEL(char_trevor))
and has_model_loaded(translator.model)
and has_model_loaded(cheng.model)
and has_model_loaded(get_player_veh_model(char_trevor))
and has_vehicle_asset_loaded(trevors_truck.model)
and has_model_loaded(bins[0].model)
and has_anim_dict_loaded(sCrazyDanceDict)
return true
endif
return false
endfunc
PROC REQUEST_BAR_PATRON_ASSETS()
request_model(IG_JANET)
request_model(IG_JOSEF)
request_model(IG_OLD_MAN1A)
request_model(IG_OLD_MAN2)
request_model(IG_RUSSIANDRUNK)
ENDPROC
FUNC BOOL HAVE_BAR_PATRON_ASSETS_LOADED()
IF has_model_loaded(IG_JANET)
and has_model_loaded(IG_JOSEF)
and has_model_loaded(IG_OLD_MAN1A)
and has_model_loaded(IG_OLD_MAN2)
and has_model_loaded(IG_RUSSIANDRUNK)
return true
endif
return false
ENDFUNC
// @SBA - splitting out the loads
PROC REQUEST_METH_ARRIVAL_ASSETS()
REQUEST_MODEL(buddy.model)
REQUEST_MODEL(GET_WEAPONTYPE_MODEL(WEAPONTYPE_CARBINERIFLE))
REQUEST_WEAPON_ASSET(WEAPONTYPE_carbinerifle)
ENDPROC
FUNC BOOL HAVE_METH_ARRIVAL_ASSETS_LOADED()
IF HAS_MODEL_LOADED(buddy.model)
AND HAS_MODEL_LOADED(GET_WEAPONTYPE_MODEL(WEAPONTYPE_carbinerifle))
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_carbinerifle)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
// @SBA - assets for fight, post arrival cutscene
PROC REQUEST_FIGHT_ASSETS()
REQUEST_MODEL(buddy.model)
request_model(wave_0_enemy[0].model)
request_model(wave_0_enemy[1].model)
request_model(phoenix)
request_model(sadler)
request_model(dubsta2)
request_model(explosive_barrels[0].model)
request_model(bins[0].model)
request_model(cover_box.model)
request_model(get_weapontype_model(WEAPONTYPE_ASSAULTRIFLE))
request_weapon_asset(WEAPONTYPE_ASSAULTRIFLE)
request_vehicle_recording(001, "lkmethlab")
request_vehicle_recording(002, "lkmethlab")
request_vehicle_recording(003, "lkmethlab")
REQUEST_WAYPOINT_RECORDING("methlab1")
REQUEST_WAYPOINT_RECORDING("methlab3")
REQUEST_WAYPOINT_RECORDING("methlab4")
REQUEST_WAYPOINT_RECORDING("methlab5")
REQUEST_WAYPOINT_RECORDING("methlab7")
request_anim_dict("MissChinese1")
ENDPROC
FUNC BOOL HAVE_FIGHT_ASSETS_LOADED()
IF HAS_MODEL_LOADED(buddy.model)
AND HAS_MODEL_LOADED(wave_0_enemy[0].model)
AND HAS_MODEL_LOADED(wave_0_enemy[1].model)
AND HAS_MODEL_LOADED(sadler)
AND HAS_MODEL_LOADED(dubsta2)
AND HAS_MODEL_LOADED(phoenix)
and has_model_loaded(explosive_barrels[0].model)
and has_model_loaded(bins[0].model)
and has_model_loaded(cover_box.model)
and has_model_loaded(get_weapontype_model(WEAPONTYPE_ASSAULTRIFLE))
and has_weapon_asset_loaded(WEAPONTYPE_ASSAULTRIFLE)
and has_vehicle_recording_been_loaded(001, "lkmethlab")
and has_vehicle_recording_been_loaded(002, "lkmethlab")
and has_vehicle_recording_been_loaded(003, "lkmethlab")
and get_is_waypoint_recording_loaded("methlab1")
and get_is_waypoint_recording_loaded("methlab3")
and get_is_waypoint_recording_loaded("methlab4")
and get_is_waypoint_recording_loaded("methlab5")
and get_is_waypoint_recording_loaded("methlab7")
and has_anim_dict_loaded("MissChinese1")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
proc request_shootout_assets(BOOL bRequestChefModel = TRUE)
// // @SBA - per B*1121357, requesting chef model later
IF bRequestChefModel
request_model(buddy.model)
ENDIF
// request_model(wave_0_enemy[0].model)
// request_model(wave_0_enemy[1].model)
//
// request_model(sadler)
// request_model(dubsta2)
// request_model(phoenix)
request_model(pcj)
request_model(explosive_barrels[0].model)
request_model(cover_box.model)
// request_model(get_weapontype_model(weapontype_carbinerifle))
request_model(get_weapontype_model(weapontype_grenadelauncher))
// request_model(get_weapontype_model(WEAPONTYPE_ASSAULTRIFLE))
//
// request_weapon_asset(WEAPONTYPE_carbinerifle)
request_weapon_asset(WEAPONTYPE_grenadelauncher)
// request_weapon_asset(WEAPONTYPE_ASSAULTRIFLE)
// request_vehicle_recording(001, "lkmethlab")
// request_vehicle_recording(002, "lkmethlab")
// request_vehicle_recording(003, "lkmethlab")
// request_vehicle_recording(004, "lkmethlab")
// request_vehicle_recording(005, "lkmethlab")
// request_vehicle_recording(006, "lkmethlab")
request_vehicle_recording(007, "lkmethlab")
request_vehicle_recording(008, "lkmethlab")
request_vehicle_recording(009, "lkmethlab")
request_vehicle_recording(010, "lkmethlab")
request_vehicle_recording(011, "lkmethlab")
request_vehicle_recording(012, "lkmethlab")
// request_vehicle_recording(013, "lkmethlab")
// request_vehicle_recording(014, "lkmethlab")
// request_vehicle_recording(015, "lkmethlab")
// request_vehicle_recording(016, "lkmethlab")
request_vehicle_recording(017, "lkmethlab")
request_vehicle_recording(018, "lkmethlab")
request_vehicle_recording(019, "lkmethlab")
request_vehicle_recording(020, "lkmethlab")
request_vehicle_recording(021, "lkmethlab")
// request_vehicle_recording(030, "lkmethlab")
// request_vehicle_recording(031, "lkmethlab")
// request_vehicle_recording(032, "lkmethlab")
// REQUEST_WAYPOINT_RECORDING("methlab1")
//// REQUEST_WAYPOINT_RECORDING("methlab2")
// REQUEST_WAYPOINT_RECORDING("methlab3")
// REQUEST_WAYPOINT_RECORDING("methlab4")
// REQUEST_WAYPOINT_RECORDING("methlab5")
//// REQUEST_WAYPOINT_RECORDING("methlab6")
// REQUEST_WAYPOINT_RECORDING("methlab7")
//// REQUEST_WAYPOINT_RECORDING("methlab8")
//// REQUEST_WAYPOINT_RECORDING("methlab9")
//
// request_anim_dict("MissChinese1")
//
endproc
func bool is_shootout_assets_loaded()
if has_model_loaded(buddy.model)
// and has_model_loaded(wave_0_enemy[0].model)
// and has_model_loaded(wave_0_enemy[1].model)
// and has_model_loaded(sadler)
// and has_model_loaded(dubsta2)
// and has_model_loaded(phoenix)
and has_model_loaded(pcj)
and has_model_loaded(explosive_barrels[0].model)
and has_model_loaded(cover_box.model)
// and has_model_loaded(get_weapontype_model(WEAPONTYPE_carbinerifle))
and has_model_loaded(get_weapontype_model(weapontype_grenadelauncher))
// and has_model_loaded(get_weapontype_model(WEAPONTYPE_ASSAULTRIFLE))
// and has_weapon_asset_loaded(WEAPONTYPE_carbinerifle)
and has_weapon_asset_loaded(WEAPONTYPE_grenadelauncher)
// and has_weapon_asset_loaded(WEAPONTYPE_ASSAULTRIFLE)
// and has_vehicle_recording_been_loaded(001, "lkmethlab")
// and has_vehicle_recording_been_loaded(002, "lkmethlab")
// and has_vehicle_recording_been_loaded(003, "lkmethlab")
// and has_vehicle_recording_been_loaded(004, "lkmethlab")
// and has_vehicle_recording_been_loaded(005, "lkmethlab")
// and has_vehicle_recording_been_loaded(006, "lkmethlab")
and has_vehicle_recording_been_loaded(007, "lkmethlab")
and has_vehicle_recording_been_loaded(008, "lkmethlab")
and has_vehicle_recording_been_loaded(009, "lkmethlab")
and has_vehicle_recording_been_loaded(010, "lkmethlab")
and has_vehicle_recording_been_loaded(011, "lkmethlab")
and has_vehicle_recording_been_loaded(012, "lkmethlab")
// and has_vehicle_recording_been_loaded(013, "lkmethlab")
// and has_vehicle_recording_been_loaded(014, "lkmethlab")
// and has_vehicle_recording_been_loaded(015, "lkmethlab")
// and has_vehicle_recording_been_loaded(016, "lkmethlab")
and has_vehicle_recording_been_loaded(017, "lkmethlab")
and has_vehicle_recording_been_loaded(018, "lkmethlab")
and has_vehicle_recording_been_loaded(019, "lkmethlab")
and has_vehicle_recording_been_loaded(020, "lkmethlab")
and has_vehicle_recording_been_loaded(021, "lkmethlab")
// and has_vehicle_recording_been_loaded(030, "lkmethlab")
// and has_vehicle_recording_been_loaded(031, "lkmethlab")
// and has_vehicle_recording_been_loaded(032, "lkmethlab")
// and get_is_waypoint_recording_loaded("methlab1")
//// and get_is_waypoint_recording_loaded("methlab2")
// and get_is_waypoint_recording_loaded("methlab3")
// and get_is_waypoint_recording_loaded("methlab4")
// and get_is_waypoint_recording_loaded("methlab5")
//// and get_is_waypoint_recording_loaded("methlab6")
// and get_is_waypoint_recording_loaded("methlab7")
//// and get_is_waypoint_recording_loaded("methlab8")
//// and get_is_waypoint_recording_loaded("methlab9")
// and has_anim_dict_loaded("MissChinese1")
return true
endif
return false
endfunc
proc create_start_of_mission_entities(bool playing_mocap = true)
if not playing_mocap
clear_area(<<1998.2826, 3058.0435, 46.0491>>, 10000.00, true)
remove_decals_in_range(<<1998.2826, 3058.0435, 46.0491>>, 10000.00)
delete_vehicle_gen_vehicles_in_area(<<1401.5897, -2053.6978, 50.9983>>, 10.0)
RECREATE_PLAYERS_VEHICLE(<<2000.1245, 3059.5662, 46.0491>>, 59.1994, FALSE)
setup_vehicle_outside_bar()
SET_INITIAL_PLAYER_STATION("RADIO_07_DANCE_01")
setup_buddy(cheng)
setup_buddy(translator)
SET_START_VERSIONS_OF_BUDDIES()
setup_relationship_contact(cheng.ped, true)
set_ped_can_ragdoll(cheng.ped, true)
remove_blip(cheng.blip)
add_ped_for_dialogue(scripted_speech[0], 4, cheng.ped, "cheng")
task_enter_vehicle(cheng.ped, trevors_truck.veh, 30000, vs_front_right, PEDMOVE_walk)
force_ped_motion_state(cheng.ped, ms_on_foot_walk, false)//, faus_cutscene_exit)
force_ped_ai_and_animation_update(cheng.ped)
SET_PED_LOD_MULTIPLIER(cheng.ped, 4.0)
setup_relationship_contact(translator.ped, true)
set_ped_can_ragdoll(translator.ped, true)
remove_blip(translator.blip)
add_ped_for_dialogue(scripted_speech[0], 3, translator.ped, "translator")
task_enter_vehicle(translator.ped, trevors_truck.veh, 30000, vs_back_left, PEDMOVE_walk)
force_ped_motion_state(translator.ped, ms_on_foot_walk, false)//, faus_cutscene_exit)
force_ped_ai_and_animation_update(translator.ped)
SET_PED_LOD_MULTIPLIER(translator.ped, 4.0)
clear_ped_tasks_immediately(player_ped_id())
IF NOT IS_REPLAY_BEING_SET_UP()
set_entity_coords(player_ped_id(), <<1998.04980, 3055.90698, 46.05226>>)//<<1998.19702, 3056.11426, 46.05203>>)
set_entity_heading(player_ped_id(), 328.0059)
force_ped_motion_state(player_ped_id(), ms_on_foot_walk, false)
SIMULATE_PLAYER_INPUT_GAIT(player_id(), pedmove_walk, 700)
force_ped_ai_and_animation_update(player_ped_id())
//task_enter_vehicle(player_ped_id(), trevors_truck.veh, -1, VS_DRIVER, PEDMOVE_WALK, ECF_RESUME_IF_INTERRUPTED | ECF_WARP_ENTRY_POINT)
ENDIF
endif
SET_VEHICLE_DIRT_LEVEL(trevors_truck.veh, 13)
SET_LOCATES_BUDDIES_TO_GET_INTO_NEAREST_CAR(locates_data, trevors_truck.veh)
//set_vehicle_as_no_longer_needed(trevors_truck.veh)
add_ped_for_dialogue(scripted_speech[0], 0, null, "cook") //added for phone call(@SBA - was 5 but ID num is 0 in D*.)
get_to_meth_lab_dialogue_system()
endproc
PROC HANDLE_CREATE_BAR_PATRONS()
IF bBarPatronsCreated
EXIT
ENDIF
REQUEST_BAR_PATRON_ASSETS()
IF NOT HAVE_BAR_PATRON_ASSETS_LOADED()
CPRINTLN(DEBUG_MISSION, "CREATE_BAR_PATRONS: Loading assets...")
EXIT
ENDIF
CLEAR_AREA_OF_PEDS(<<1984.136353,3051.933838,46.215084>> , 5.5, TRUE)
sbiBarBlockingArea = ADD_SCENARIO_BLOCKING_AREA(<<1984.9971, 3052.9048, 46.8556>>+<<5,5,2>>,<<1984.9971, 3052.9048, 46.8556>>-<<5,5,2>>)
CPRINTLN(DEBUG_MISSION, "CREATE_BAR_PATRONS: Creating patrons")
piBarLady = CREATE_PED(PEDTYPE_MISSION, IG_JANET, (<<1983.43469, 3054.87573, 47.00919>>))
TRIGGER_SCENE_SETUP_FRIENDLY_PED(piBarLady, player_group)
if DOES_SCENARIO_EXIST_IN_AREA(<<1983.43469, 3054.87573, 47.00919>>, 0.5, false)//true
TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(piBarLady, (<<1983.43469, 3054.87573, 47.00919>>), 0.5, -1)
endif
piJosef = CREATE_PED(PEDTYPE_MISSION, IG_JOSEF, (<<1987.3, 3048.7, 46.2>>))
TRIGGER_SCENE_SETUP_FRIENDLY_PED(piJosef, player_group)
TASK_WANDER_STANDARD(piJosef)
piOldMan1A = CREATE_PED(PEDTYPE_MISSION, IG_OLD_MAN1A, (<<1985.32666, 3052.07471, 46.2>>))
TRIGGER_SCENE_SETUP_FRIENDLY_PED(piOldMan1A, player_group)
SET_PED_PROP_INDEX(piOldMan1A, ANCHOR_HEAD,0)
if DOES_SCENARIO_EXIST_IN_AREA(<<1985.32666, 3053.07471, 46.97862>>, 0.75, true)
TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(piOldMan1A, (<<1985.32666, 3053.07471, 46.97862>>), 0.75, 15000)
endif
piOldMan2 = CREATE_PED(PEDTYPE_MISSION, IG_OLD_MAN2, (<<1984.87280, 3052.09902, 46.2>>))
TRIGGER_SCENE_SETUP_FRIENDLY_PED(piOldMan2, player_group)
if DOES_SCENARIO_EXIST_IN_AREA(<<1984.87280, 3052.49902, 46.97861>>, 0.75, true)
TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(piOldMan2, (<<1984.87280, 3052.49902, 46.97861>>), 0.75, 15000)
endif
piDrunk = CREATE_PED(PEDTYPE_MISSION, IG_RUSSIANDRUNK, (<<1985.552, 3050.480, 47.215>>), -30.26)
TRIGGER_SCENE_SETUP_FRIENDLY_PED(piDrunk, player_group)
APPLY_PED_BLOOD_SPECIFIC(piDrunk, ENUM_TO_INT(PDZ_HEAD), 0.502, 0.730, 0.0, 0.7, 0, 0.0, "BasicSlash")
TASK_START_SCENARIO_IN_PLACE(piDrunk, "WORLD_HUMAN_STUPOR", -1) //"WORLD_HUMAN_BUM_SLUMPED"
bBarPatronsCreated = TRUE
ENDPROC
//PURPOSE: Stores any near by vehicles and sets them as a mission entity. Means they won't be cleared on clear area
//call release_obtained_nearby_vehicles() to release them.
proc obtain_nearby_vehicles_and_store_them()
vehicle_index stored_last_vehicle
get_ped_nearby_vehicles(player_ped_id(), ambient_car)
stored_last_vehicle = get_players_last_vehicle()
for i = 0 to count_of(ambient_car) - 1
if ambient_car[i] != stored_last_vehicle
if does_entity_exist(ambient_car[i])
if is_vehicle_driveable(ambient_car[i])
//player pos and heading data = 1997.9380, 3056.4143, 46.0516>>, 328.5000
if is_entity_in_angled_area(ambient_car[i], <<1993.303, 3065.119, 46.052>>, <<2007.798, 3056.236, 50.052>>, 5.0)
//delete_vehicle(ambient_car[i])
clear_area(get_entity_coords(ambient_car[i]), 1.0, true)
else
//delete cars driving downt he road with drivers.
if does_entity_exist(GET_PED_IN_VEHICLE_SEAT(ambient_car[i]))
clear_area(get_entity_coords(ambient_car[i]), 1.0, true) //clear area rther than deleting to avoid "vehicle is not a script entity"
else
set_entity_as_mission_entity(ambient_car[i], true, true)
endif
endif
else
clear_area(get_entity_coords(ambient_car[i]), 1.0, false)
endif
endif
endif
endfor
endproc
//PURPOSE: Releases stored near by vehicles.
proc release_obtained_nearby_vehicles()
for i = 0 to count_of(ambient_car) - 1
if does_entity_exist(ambient_car[i])
set_vehicle_as_no_longer_needed(ambient_car[i])
endif
endfor
endproc
proc set_players_last_vehicle_to_vehicle_gen(vector car_pos, float car_heading)
vehicle_index players_last_car
players_last_car = GET_PLAYERS_LAST_VEHICLE() //get_players_last_vehicle
if does_entity_exist(players_last_car)
if is_vehicle_driveable(players_last_car)
model_names players_last_vehicle_model
players_last_vehicle_model = get_entity_model(players_last_car)
if not is_this_model_a_plane(players_last_vehicle_model )
SET_MISSION_VEHICLE_GEN_VEHICLE(players_last_car, car_pos, car_heading)
//SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN
//GET_MISSION_START_VEHICLE_INDEX()
endif
endif
endif
endproc
proc meth_lab_intro_mocap()
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME() //Fix for bug 2170997
switch intro_mocap_status
case 0
interior_instance_index interior_hicksbar
REQUEST_CUTSCENE("chinese_1_int")
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("trevor", PLAYER_PED_ID())
SET_CUTSCENE_PED_PROP_VARIATION("Tao", ANCHOR_EYES, 0)
SET_CUTSCENE_PED_PROP_VARIATION("Taos_Translator", ANCHOR_EYES, 0)
interior_hicksbar = GET_INTERIOR_AT_COORDS_with_type(<<1986.2722, 3051.9758, 47.1256>>, "v_hicksbar")
PIN_INTERIOR_IN_MEMORY(interior_hicksbar)
IF is_interior_ready(interior_hicksbar)
if HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
REGISTER_ENTITY_FOR_CUTSCENE(NULL, "Tao", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, cheng.model)
REGISTER_ENTITY_FOR_CUTSCENE(NULL, "Taos_Translator", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, translator.model)
START_CUTSCENE()
unpin_interior(interior_hicksbar)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(true)
intro_mocap_status++
ENDIF
endif
break
case 1
IF IS_REPEAT_PLAY_ACTIVE()
IF NOT IS_SCREEN_FADED_IN()
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME_SHORT)
ENDIF
ENDIF
ENDIF
if is_cutscene_playing()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
request_start_of_mission_assets()
delete_vehicle_gen_vehicles_in_area(<<2000.1245, 3059.5662, 46.0491>>, 10.0)
set_players_last_vehicle_to_vehicle_gen(<<2000.1245, 3059.5662, 46.0491>>, 59.1994)
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<1980.730, 3073.228, 46.049>>, <<2014.615, 3051.972, 50.049>>, 26.700, <<2000.1245, 3059.5662, 46.0491>>, 59.1994, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR())//, false)//, false) //2.5, 5.5, 2.0
// trevors_truck.veh = GET_MISSION_START_VEHICLE_INDEX()
// if does_entity_exist(trevors_truck.veh)
// if is_vehicle_driveable(trevors_truck.veh)
//
// SET_ENTITY_AS_MISSION_ENTITY(trevors_truck.veh, true, true)
// SET_VEHICLE_DOORS_SHUT(trevors_truck.veh)
// SET_VEHICLE_DOORS_LOCKED(trevors_truck.veh, vehiclelock_unlocked)
//
// // @SBA - make sure we have anims for whatever the vehicle is
// request_vehicle_asset(GET_ENTITY_MODEL(trevors_truck.veh))
//
// endif
// endif
SET_INITIAL_PLAYER_STATION("RADIO_07_DANCE_01")
MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(SP_MISSION_CHINESE_1)
intro_mocap_status++
endif
break
case 2
request_start_of_mission_assets()
if not WAS_CUTSCENE_SKIPPED()
if IS_CUTSCENE_PLAYING()
INT iCutTime
iCutTime = get_cutscene_time()
CPRINTLN(DEBUG_MISSION, "Cutscene Time = ", iCutTime)
// @SBA - load in scene out to the mountains
IF iCutTime > 85000
AND NOT IS_NEW_LOAD_SCENE_ACTIVE()
IF NEW_LOAD_SCENE_START((<<1997.36, 3054.05, 47.81>>), NORMALISE_VECTOR(<<0.53, 0.85, -0.05>>), 3500.0)
CPRINTLN(DEBUG_MISSION, GET_THIS_SCRIPT_NAME(), ": Cutscene ending: Calling NEW_LOAD_SCENE_START().")
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Tao", cheng.model))
cheng.ped = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Tao", cheng.model))
SET_PED_PROP_INDEX(cheng.ped, ANCHOR_EYES, 0)
ENDIF
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Taos_Translator", translator.model))
translator.ped = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Taos_Translator", translator.model))
SET_PED_PROP_INDEX(translator.ped, ANCHOR_EYES, 0)
ENDIF
setup_vehicle_outside_bar()
if CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Tao", cheng.model)
set_entity_coords(cheng.ped, cheng.pos)
set_entity_heading(cheng.ped, cheng.heading)
setup_relationship_contact(cheng.ped, true)
setup_buddy_attributes(cheng)
set_ped_can_ragdoll(cheng.ped, true)
add_ped_for_dialogue(scripted_speech[0], 4, cheng.ped, "cheng")
task_enter_vehicle(cheng.ped, trevors_truck.veh, 30000, vs_front_right, PEDMOVE_walk)
force_ped_motion_state(cheng.ped, ms_on_foot_walk, false)//, faus_cutscene_exit)
force_ped_ai_and_animation_update(cheng.ped)
endif
if CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Taos_Translator", translator.model)
set_entity_coords(translator.ped, translator.pos)
set_entity_heading(translator.ped, translator.heading)
setup_relationship_contact(translator.ped, true)
setup_buddy_attributes(translator)
set_ped_can_ragdoll(translator.ped, true)
add_ped_for_dialogue(scripted_speech[0], 3, translator.ped, "translator")
task_enter_vehicle(translator.ped, trevors_truck.veh, 30000, vs_back_left, PEDMOVE_walk)
force_ped_motion_state(translator.ped, ms_on_foot_walk, false)//, faus_cutscene_exit)
force_ped_ai_and_animation_update(translator.ped)
endif
if CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("trevor", GET_PLAYER_PED_MODEL(char_trevor))
CPRINTLN(DEBUG_MISSION, "Player exit state.")
//clear_ped_tasks_immediately(player_ped_id())
set_entity_coords(player_ped_id(), <<1998.19702, 3056.11426, 46.05203>>) //<<1998.04980, 3055.90698, 46.05226>>)
set_entity_heading(player_ped_id(), 328.0059)
force_ped_motion_state(player_ped_id(), ms_on_foot_walk, false)
SIMULATE_PLAYER_INPUT_GAIT(player_id(), pedmove_walk, 300)
force_ped_ai_and_animation_update(player_ped_id())
endif
if CAN_SET_EXIT_STATE_FOR_CAMERA()
CPRINTLN(DEBUG_MISSION, "Camera exit state.")
set_gameplay_cam_relative_heading(0)
set_gameplay_cam_relative_pitch(0)
endif
else
if is_start_of_mission_assets_requested()
CPRINTLN(DEBUG_MISSION, "starting assets loaded.")
IF IS_NEW_LOAD_SCENE_LOADED()
NEW_LOAD_SCENE_STOP()
CPRINTLN(DEBUG_MISSION, GET_THIS_SCRIPT_NAME(), ": Cutsene ending: calling NEW_LOAD_SCENE_STOP.")
SET_SCRIPTS_SAFE_FOR_CUTSCENE(false)
initialise_mission_variables()
create_start_of_mission_entities()
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(0, "Mission start")
END_CUTSCENE_BASIC()
if is_screen_faded_out()
do_screen_fade_in(DEFAULT_FADE_TIME)
endif
INIT_CHENGS_CRAZY_CAR_DANCING()
REPLAY_STOP_EVENT()
REPLAY_RECORD_BACK_FOR_TIME(0.0, 12.0)
mission_flow = get_to_meth_lab
ENDIF
endif
endif
else
SET_CUTSCENE_FADE_VALUES(false, false, true, false)
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
IF NEW_LOAD_SCENE_START((<<1997.36, 3054.05, 47.81>>), NORMALISE_VECTOR(<<0.53, 0.85, -0.05>>), 3500.0)
CPRINTLN(DEBUG_MISSION, GET_THIS_SCRIPT_NAME(), ": Cutscene skipped: Calling NEW_LOAD_SCENE_START().")
ENDIF
ENDIF
intro_mocap_status++
endif
break
// SKIPPED
case 3
request_start_of_mission_assets()
if IS_CUTSCENE_PLAYING()
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Tao", cheng.model))
cheng.ped = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Tao", cheng.model))
ENDIF
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Taos_Translator", translator.model))
translator.ped = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Taos_Translator", translator.model))
ENDIF
//hack fix to stop the translator from playing a secondary reaction anim. This played because the
//translator was to close to the player when the mocap ended and the script was waiting on
//assets to load so the physics would have activated on the peds, this would then fire off
//a reaction which did not occur till after clear_ped_tasks_immediately()
if CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Tao", cheng.model)
IF NOT IS_PED_INJURED(cheng.ped)
set_entity_coords(cheng.ped, cheng.pos)
set_entity_heading(cheng.ped, cheng.heading)
ENDIF
endif
if CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Taos_Translator", translator.model)
IF NOT IS_PED_INJURED(translator.ped)
set_entity_coords(translator.ped, translator.pos)
set_entity_heading(translator.ped, translator.heading)
ENDIF
endif
if CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("trevor", GET_PLAYER_PED_MODEL(char_trevor))
IF NOT IS_PED_INJURED(player_ped_id())
set_entity_coords(player_ped_id(), <<1998.19702, 3056.11426, 46.05203>>)//<<1998.04980, 3055.90698, 46.05226>>)
set_entity_heading(player_ped_id(), 328.0059)
ENDIF
endif
else
while not is_start_of_mission_assets_requested()
OR NOT IS_NEW_LOAD_SCENE_LOADED()
CPRINTLN(DEBUG_MISSION, "Waiting on assets and load scene...")
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME() //Fix for bug 2170997
WAIT(0)
endwhile
mission_fail_checks()//added because of above while loop
setup_vehicle_outside_bar()
NEW_LOAD_SCENE_STOP()
CPRINTLN(DEBUG_MISSION, GET_THIS_SCRIPT_NAME(), ": Cutsene skipped: calling NEW_LOAD_SCENE_STOP.")
IF NOT IS_PED_INJURED(cheng.ped)
clear_ped_tasks_immediately(cheng.ped)
set_entity_coords(cheng.ped, cheng.pos)
set_entity_heading(cheng.ped, cheng.heading)
setup_buddy_attributes(cheng)
setup_relationship_contact(cheng.ped, true)
set_ped_can_ragdoll(cheng.ped, true)
add_ped_for_dialogue(scripted_speech[0], 4, cheng.ped, "cheng")
task_enter_vehicle(cheng.ped, trevors_truck.veh, 30000, vs_front_right, PEDMOVE_walk)
force_ped_motion_state(cheng.ped, ms_on_foot_walk, false)//, faus_cutscene_exit)
force_ped_ai_and_animation_update(cheng.ped)
ENDIF
IF NOT IS_PED_INJURED(translator.ped)
clear_ped_tasks_immediately(translator.ped)
set_entity_coords(translator.ped, translator.pos)
set_entity_heading(translator.ped, translator.heading)
setup_buddy_attributes(translator)
setup_relationship_contact(translator.ped, true)
set_ped_can_ragdoll(translator.ped, true)
add_ped_for_dialogue(scripted_speech[0], 3, translator.ped, "translator")
task_enter_vehicle(translator.ped, trevors_truck.veh, 30000, vs_back_left, PEDMOVE_walk)
force_ped_motion_state(translator.ped, ms_on_foot_walk, false)//, faus_cutscene_exit)
force_ped_ai_and_animation_update(translator.ped)
ENDIF
IF NOT IS_PED_INJURED(player_ped_id())
clear_ped_tasks_immediately(player_ped_id())
set_entity_coords(player_ped_id(), <<1998.19702, 3056.11426, 46.05203>>) //<<1998.04980, 3055.90698, 46.05226>>)
set_entity_heading(player_ped_id(), 328.0059)
force_ped_motion_state(player_ped_id(), ms_on_foot_walk, false)
SIMULATE_PLAYER_INPUT_GAIT(player_id(), pedmove_walk, 300)
force_ped_ai_and_animation_update(player_ped_id())
ENDIF
create_start_of_mission_entities()
SET_START_VERSIONS_OF_BUDDIES()
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(0, "Mission start")
if is_screen_faded_out()
end_cutscene()
else
end_cutscene_no_fade()
endif
REPLAY_STOP_EVENT()
INIT_CHENGS_CRAZY_CAR_DANCING()
mission_flow = get_to_meth_lab
endif
break
endswitch
endproc
func bool area_system()
//stop_mission_fail_checks = true
return false
endfunc
proc wave_0_inside_enemy_0_attack()
open_sequence_task(seq)
//task_pause(null, 1000)
task_set_blocking_of_non_temporary_events(null, false)
task_set_sphere_defensive_area(null, <<1370.4471, 3618.1826, 33.8917>>, 8.0)//2.0
task_combat_ped(null, player_ped_id())
close_sequence_task(seq)
task_perform_sequence(wave_0_inside_enemy[0].ped, seq)
clear_sequence_task(seq)
attack_time = get_game_timer()
endproc
proc wave_0_inside_enemy_0_system()
if not is_ped_injured(wave_0_inside_enemy[0].ped)
// @SBA - make blip for enemy if needed
HANDLE_ENEMY_BLIP_CREATION(wave_0_inside_enemy[0])
switch wave_0_inside_enemy_status[0]
case 0
if is_vehicle_driveable(wave_0_enemy_vehicle[2].veh)
if is_playback_going_on_for_vehicle(wave_0_enemy_vehicle[2].veh)
if ((get_time_position_in_recording(wave_0_enemy_vehicle[2].veh) + 500) > GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(wave_0_enemy_vehicle[2].recording_number, "lkmethlab"))
stop_playback_recorded_vehicle(wave_0_enemy_vehicle[2].veh)
REMOVE_VEHICLE_BLIP(wave_0_enemy_vehicle[2])
wave_0_inside_enemy_status[0]++
endif
else
wave_0_inside_enemy_status[0]++
endif
else
wave_0_inside_enemy_status[0]++
endif
break
case 1
REMOVE_VEHICLE_BLIP(wave_0_enemy_vehicle[2])
vector player_pos
player_pos = GET_ENTITY_COORDS(player_ped_id())
if lk_timer(original_time, 25000)
or player_pos.z < 37.00
or IS_ENTITY_IN_ANGLED_AREA(player_ped_id(), <<1390.113, 3615.582, 37.931>>, <<1386.932, 3624.107, 41.431>>, 12.200)
or (is_entity_in_angled_area(player_ped_id(), <<1390.858, 3599.007, 37.980>>, <<1389.319, 3603.235, 40.680>>, 2.3) and is_sphere_visible(<<1373.8, 3615.3, 35.4>>, 1.0))
or (is_entity_in_angled_area(player_ped_id(), <<1388.832, 3604.578, 37.747>>, <<1387.122, 3609.276, 40.847>>, 2.3) and is_sphere_visible(<<1373.8, 3615.3, 35.4>>, 1.0))
or is_entity_in_angled_area(player_ped_id(), <<1400.469, 3607.616, 38.006>>, <<1399.769, 3609.490, 40.506>>, 1.2)
wave_0_inside_enemy_0_attack()
wave_0_inside_enemy_status[0]++
endif
break
case 2
IF wave_0_buddy_ai_system_status >= 3
OR NOT is_ped_inside_interior(player_ped_id(), <<1392.7360, 3602.5989, 38.5>>, "v_methlab")
if lk_timer(attack_time, 10000) // @SBA - have this guy head up the stairs quicker (previous time = 15000)
// @SBA - set rush flag and defensive area up the stairs
//set_ped_sphere_defensive_area(wave_0_inside_enemy[0].ped, wave_0_inside_enemy[0].run_to_pos, 2.0)
SET_PED_ANGLED_DEFENSIVE_AREA(wave_0_inside_enemy[0].ped, tbTopBackStairsVolume.vMin, tbTopBackStairsVolume.vMax, tbTopBackStairsVolume.flWidth, TRUE)
wave_0_inside_enemy[0].bRushInside = TRUE
// @SBA - make more agressive
REGISTER_TARGET(wave_0_inside_enemy[0].ped, buddy.ped)
SET_ENEMY_RUSHER_ATTRIBUTES(wave_0_inside_enemy[0].ped, 1, 10, 50)
attack_time = get_game_timer()
wave_0_inside_enemy_status[0]++
endif
ELSE
// reset timer
attack_time = get_game_timer()
ENDIF
break
case 3
break
endswitch
endif
endproc
proc wave_0_inside_enemy_1_attack()
open_sequence_task(seq)
task_pause(null, 250)
task_set_blocking_of_non_temporary_events(null, false)
task_set_sphere_defensive_area(null, <<1366.0543, 3623.9988, 33.7900>>, 8.0)//2.0
task_combat_ped(null, player_ped_id())
close_sequence_task(seq)
task_perform_sequence(wave_0_inside_enemy[1].ped, seq)
clear_sequence_task(seq)
endproc
proc wave_0_inside_enemy_1_system()
if not is_ped_injured(wave_0_inside_enemy[1].ped)
// @SBA - make blip for enemy if needed
HANDLE_ENEMY_BLIP_CREATION(wave_0_inside_enemy[1])
switch wave_0_inside_enemy_status[1]
case 0
if is_vehicle_driveable(wave_0_enemy_vehicle[2].veh)
if not is_playback_going_on_for_vehicle(wave_0_enemy_vehicle[2].veh)
vector player_pos
player_pos = GET_ENTITY_COORDS(player_ped_id())
if lk_timer(original_time, 25000)
or player_pos.z < 37.00
or IS_ENTITY_IN_ANGLED_AREA(player_ped_id(), <<1390.113, 3615.582, 37.931>>, <<1386.932, 3624.107, 41.431>>, 12.200)
or (is_entity_in_angled_area(player_ped_id(), <<1390.858, 3599.007, 37.980>>, <<1389.319, 3603.235, 40.680>>, 2.3) and is_sphere_visible(<<1373.8, 3615.3, 35.4>>, 1.0))
or (is_entity_in_angled_area(player_ped_id(), <<1388.832, 3604.578, 37.747>>, <<1387.122, 3609.276, 40.847>>, 2.3) and is_sphere_visible(<<1373.8, 3615.3, 35.4>>, 1.0))
or is_entity_in_angled_area(player_ped_id(), <<1400.469, 3607.616, 38.006>>, <<1399.769, 3609.490, 40.506>>, 1.2)
wave_0_inside_enemy_1_attack()
wave_0_inside_enemy_status[1]++
endif
endif
else
wave_0_inside_enemy_1_attack()
wave_0_inside_enemy_status[1]++
endif
break
case 1
// @SBA - getting this guy to head for the stairs quicker
IF lk_timer(attack_time, 15000)
OR is_ped_injured(wave_0_inside_enemy[0].ped)
// @SBA - set rush flag and defensive area up the stairs
//set_ped_sphere_defensive_area(wave_0_inside_enemy[1].ped, wave_0_inside_enemy[1].run_to_pos, 2.0)
SET_PED_ANGLED_DEFENSIVE_AREA(wave_0_inside_enemy[1].ped, tbTopBackStairsVolume.vMin, tbTopBackStairsVolume.vMax, tbTopBackStairsVolume.flWidth, TRUE)
wave_0_inside_enemy[1].bRushInside = TRUE
// @SBA - make more agressive
REGISTER_TARGET(wave_0_inside_enemy[1].ped, buddy.ped)
attack_time = get_game_timer()
SET_ENEMY_RUSHER_ATTRIBUTES(wave_0_inside_enemy[1].ped, 1, 10, 50)
wave_0_inside_enemy_status[1]++
endif
break
case 2
break
endswitch
endif
endproc
proc wave_0_inside_enemy_2_attack()
open_sequence_task(seq)
task_pause(null, 1250)
task_set_blocking_of_non_temporary_events(null, false)
task_set_sphere_defensive_area(null, <<1372.5642, 3614.3271, 33.8927>>, 8.0)//2.0
task_combat_ped(null, player_ped_id())
close_sequence_task(seq)
task_perform_sequence(wave_0_inside_enemy[2].ped, seq)
clear_sequence_task(seq)
endproc
proc wave_0_inside_enemy_2_system()
if not is_ped_injured(wave_0_inside_enemy[2].ped)
// @SBA - make blip for enemy if needed
HANDLE_ENEMY_BLIP_CREATION(wave_0_inside_enemy[2])
switch wave_0_inside_enemy_status[2]
case 0
if is_vehicle_driveable(wave_0_enemy_vehicle[2].veh)
if not is_playback_going_on_for_vehicle(wave_0_enemy_vehicle[2].veh)
vector player_pos
player_pos = GET_ENTITY_COORDS(player_ped_id())
if lk_timer(original_time, 25000)
or player_pos.z < 37.00
or IS_ENTITY_IN_ANGLED_AREA(player_ped_id(), <<1390.113, 3615.582, 37.931>>, <<1386.932, 3624.107, 41.431>>, 12.200)
or (is_entity_in_angled_area(player_ped_id(), <<1390.858, 3599.007, 37.980>>, <<1389.319, 3603.235, 40.680>>, 2.3) and is_sphere_visible(<<1373.8, 3615.3, 35.4>>, 1.0))
or (is_entity_in_angled_area(player_ped_id(), <<1388.832, 3604.578, 37.747>>, <<1387.122, 3609.276, 40.847>>, 2.3) and is_sphere_visible(<<1373.8, 3615.3, 35.4>>, 1.0))
or is_entity_in_angled_area(player_ped_id(), <<1400.469, 3607.616, 38.006>>, <<1399.769, 3609.490, 40.506>>, 1.2)
wave_0_inside_enemy_2_attack()
wave_0_inside_enemy_status[2]++
endif
endif
else
wave_0_inside_enemy_2_attack()
wave_0_inside_enemy_status[2]++
endif
break
case 1
if lk_timer(attack_time, 10000) // @SBA - shortened timer. OLD = 15000
and is_ped_injured(wave_0_inside_enemy[1].ped)
// @SBA - set rush flag and defensive area up the stairs
//set_ped_sphere_defensive_area(wave_0_inside_enemy[2].ped, wave_0_inside_enemy[2].run_to_pos, 2.0)
SET_PED_ANGLED_DEFENSIVE_AREA(wave_0_inside_enemy[2].ped, tbTopBackStairsVolume.vMin, tbTopBackStairsVolume.vMax, tbTopBackStairsVolume.flWidth, TRUE)
wave_0_inside_enemy[2].bRushInside = TRUE
// @SBA - make more agressive
REGISTER_TARGET(wave_0_inside_enemy[2].ped, buddy.ped)
attack_time = get_game_timer()
SET_ENEMY_RUSHER_ATTRIBUTES(wave_0_inside_enemy[2].ped, 1, 0, 50)
wave_0_inside_enemy_status[2]++
endif
break
case 2
break
endswitch
endif
endproc
proc wave_0_inside_enemy_3_attack()
open_sequence_task(seq)
task_pause(null, 1500)
task_set_blocking_of_non_temporary_events(null, false)
task_set_sphere_defensive_area(null, <<1364.3922, 3616.7683, 33.8913>>, 8.0)//2.0
task_combat_ped(null, player_ped_id())
close_sequence_task(seq)
task_perform_sequence(wave_0_inside_enemy[3].ped, seq)
clear_sequence_task(seq)
endproc
proc wave_0_inside_enemy_3_system()
if not is_ped_injured(wave_0_inside_enemy[3].ped)
// @SBA - make blip for enemy if needed
HANDLE_ENEMY_BLIP_CREATION(wave_0_inside_enemy[3])
switch wave_0_inside_enemy_status[3]
case 0
if is_vehicle_driveable(wave_0_enemy_vehicle[2].veh)
if not is_playback_going_on_for_vehicle(wave_0_enemy_vehicle[2].veh)
vector player_pos
player_pos = GET_ENTITY_COORDS(player_ped_id())
if lk_timer(original_time, 25000)
or player_pos.z < 37.00
or IS_ENTITY_IN_ANGLED_AREA(player_ped_id(), <<1390.113, 3615.582, 37.931>>, <<1386.932, 3624.107, 41.431>>, 12.200)
or (is_entity_in_angled_area(player_ped_id(), <<1390.858, 3599.007, 37.980>>, <<1389.319, 3603.235, 40.680>>, 2.3) and is_sphere_visible(<<1373.8, 3615.3, 35.4>>, 1.0))
or (is_entity_in_angled_area(player_ped_id(), <<1388.832, 3604.578, 37.747>>, <<1387.122, 3609.276, 40.847>>, 2.3) and is_sphere_visible(<<1373.8, 3615.3, 35.4>>, 1.0))
or is_entity_in_angled_area(player_ped_id(), <<1400.469, 3607.616, 38.006>>, <<1399.769, 3609.490, 40.506>>, 1.2)
wave_0_inside_enemy_3_attack()
wave_0_inside_enemy_status[3]++
endif
endif
else
wave_0_inside_enemy_3_attack()
wave_0_inside_enemy_status[3]++
endif
break
case 1
if lk_timer(attack_time, 15000)
or is_ped_injured(wave_0_inside_enemy[2].ped)
// @SBA - set rush flag and defensive area up the stairs
//set_ped_sphere_defensive_area(wave_0_inside_enemy[3].ped, wave_0_inside_enemy[3].run_to_pos, 2.0)
SET_PED_ANGLED_DEFENSIVE_AREA(wave_0_inside_enemy[3].ped, tbTopBackStairsVolume.vMin, tbTopBackStairsVolume.vMax, tbTopBackStairsVolume.flWidth, TRUE)
wave_0_inside_enemy[3].bRushInside = TRUE
// @SBA - make more agressive
REGISTER_TARGET(wave_0_inside_enemy[3].ped, buddy.ped)
attack_time = get_game_timer()
SET_ENEMY_RUSHER_ATTRIBUTES(wave_0_inside_enemy[3].ped, 1, 0, 50)
wave_0_inside_enemy_status[3]++
endif
break
case 2
break
endswitch
endif
endproc
//if is_entity_in_angled_area(wave_2_enemy[i].ped, <<1433.399, 3636.853, 33.922>>, <<1449.164, 3595.132, 37.922>>, 58.00)
//
//
func bool is_grenade_launcher_explosion_in_car_park()
if IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_GRENADELAUNCHER, <<1424.980, 3633.671, 33.922>>, <<1436.609, 3602.895, 37.922>>, 40.9)
//cache original grenade launcher ammo
//if original_ammo - current_ammo > clip size (5)
return true
endif
return false
endfunc
//PURPOSE:Force enemies on foot or in a vehicle to flee if the player fires grenade launcher explosion into the
//area of the car park
proc make_enemy_flee_when_grenade_launcher_explosion_in_area()
// printstring("test 0")
// printnl()
is_entity_in_angled_area(player_ped_id(), <<1433.399, 3636.853, 33.922>>, <<1449.164, 3595.132, 37.922>>, 58.00)
if wave_2_status[i] != grenade_launcher_explosion
if is_entity_in_angled_area(wave_2_enemy[i].ped, <<1433.399, 3636.853, 33.922>>, <<1449.164, 3595.132, 37.922>>, 58.00)
// printstring("test 1")
// printnl()
is_entity_in_angled_area(player_ped_id(), <<1424.980, 3633.671, 32.922>>, <<1436.609, 3602.895, 37.922>>, 40.9)
if IS_EXPLOSION_IN_ANGLED_AREA(EXP_TAG_GRENADELAUNCHER, <<1424.980, 3633.671, 32.922>>, <<1436.609, 3602.895, 37.922>>, 40.9)
//added for bug 986050
//fix for bug 1107853
//if is_explosion_in_sphere(EXP_TAG_GRENADELAUNCHER, get_entity_coords(wave_2_enemy[i].ped), 20.00)
if is_ped_sitting_in_any_vehicle(wave_2_enemy[i].ped)
vehicle_index mission_car = GET_VEHICLE_PED_IS_IN(wave_2_enemy[i].ped)
ped_index driver_ped = GET_PED_IN_VEHICLE_SEAT(mission_car)
if wave_2_enemy[i].ped = driver_ped
if not is_entity_dead(mission_car)
if is_playback_going_on_for_vehicle(mission_car)
stop_playback_recorded_vehicle(mission_car)
endif
set_ped_flee_attributes(wave_2_enemy[i].ped, fa_use_vehicle, true)
set_ped_flee_attributes(wave_2_enemy[i].ped, FA_DISABLE_EXIT_VEHICLE, true)
set_ped_flee_attributes(wave_2_enemy[i].ped, FA_DISABLE_REVERSE_IN_VEHICLE, true)
set_ped_flee_attributes(wave_2_enemy[i].ped, FA_DISABLE_ACCELERATE_IN_VEHICLE, true)
endif
set_blocking_of_non_temporary_events(wave_2_enemy[i].ped, true)
clear_ped_tasks(wave_2_enemy[i].ped)
task_smart_flee_ped(wave_2_enemy[i].ped, player_ped_id(), 300, -1)
wave_2_status[i] = grenade_launcher_explosion
else
//make ped flee if the driver is alive. Otherwise have them attack.
if not is_ped_injured(driver_ped)
set_ped_flee_attributes(wave_2_enemy[i].ped, fa_use_vehicle, true)
set_blocking_of_non_temporary_events(wave_2_enemy[i].ped, true)
clear_ped_tasks(wave_2_enemy[i].ped)
task_smart_flee_ped(wave_2_enemy[i].ped, player_ped_id(), 300, -1)
wave_2_status[i] = grenade_launcher_explosion
else
//fix for bug 1107853
//allow normal ai to progress so that he will get out and shoot when the dirver is dead.
//then when he is on foot is there is another explosion he will flee
endif
endif
else
set_blocking_of_non_temporary_events(wave_2_enemy[i].ped, true)
clear_ped_tasks(wave_2_enemy[i].ped)
task_smart_flee_ped(wave_2_enemy[i].ped, player_ped_id(), 300, -1)
wave_2_status[i] = grenade_launcher_explosion
endif
// set_blocking_of_non_temporary_events(wave_2_enemy[i].ped, true)
//
// clear_ped_tasks(wave_2_enemy[i].ped)
//
// task_smart_flee_ped(wave_2_enemy[i].ped, player_ped_id(), 300, -1)
//
// wave_2_status[i] = grenade_launcher_explosion
//endif
endif
endif
endif
endproc
func bool wave_2_ai_system()
if not wave_2_complete
//if activate_wave_2
if ped_structure_are_all_enemies_dead(wave_2_enemy)
wave_2_complete = true
return true
endif
// @SBA - initializing local variable
INT iWave_2_Index
for i = 0 to count_of(wave_2_enemy) - 1
if not is_ped_injured(wave_2_enemy[i].ped)
// @SBA - make blip for enemy if needed
HANDLE_ENEMY_BLIP_CREATION(wave_2_enemy[i])
// @SBA - going to try without the fleeing and see how it is
//make_enemy_flee_when_grenade_launcher_explosion_in_area()
switch wave_2_status[i]
case initial_attack_phase
switch i
case 0
if is_vehicle_driveable(wave_2_enemy_vehicle[2].veh)
if is_playback_going_on_for_vehicle(wave_2_enemy_vehicle[2].veh)
if ((get_time_position_in_recording(wave_2_enemy_vehicle[2].veh) + 250) > GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(wave_2_enemy_vehicle[2].recording_number, "lkmethlab"))
stop_playback_recorded_vehicle(wave_2_enemy_vehicle[2].veh)
REMOVE_VEHICLE_BLIP(wave_2_enemy_vehicle[2])
set_blocking_of_non_temporary_events(wave_2_enemy[i].ped, false)
set_ped_sphere_defensive_area(wave_2_enemy[i].ped, wave_2_enemy[i].run_to_pos, 2.0)
task_combat_ped(wave_2_enemy[i].ped, player_ped_id())
// @SBA - enemies will try to rush inside periodically, so setting this as the next stage
//wave_2_status[i] = do_nothing
wave_2_status[i] = run_into_shop
endif
else
set_blocking_of_non_temporary_events(wave_2_enemy[i].ped, false)
set_ped_sphere_defensive_area(wave_2_enemy[i].ped, wave_2_enemy[i].run_to_pos, 2.0)
task_combat_ped(wave_2_enemy[i].ped, player_ped_id())
// @SBA - enemies will try to rush inside periodically, so setting this as the next stage
//wave_2_status[i] = do_nothing
wave_2_status[i] = run_into_shop
endif
else
set_blocking_of_non_temporary_events(wave_2_enemy[i].ped, false)
set_ped_sphere_defensive_area(wave_2_enemy[i].ped, wave_2_enemy[i].run_to_pos, 2.0)
task_combat_ped(wave_2_enemy[i].ped, player_ped_id())
// @SBA - enemies will try to rush inside periodically, so setting this as the next stage
//wave_2_status[i] = do_nothing
wave_2_status[i] = run_into_shop
endif
break
case 1
case 2
if is_vehicle_driveable(wave_2_enemy_vehicle[2].veh)
if not is_playback_going_on_for_vehicle(wave_2_enemy_vehicle[2].veh)
open_sequence_task(seq)
task_pause(null, (250 * i))
task_set_blocking_of_non_temporary_events(null, false)
task_set_sphere_defensive_area(null, wave_2_enemy[i].run_to_pos, 4.0)
task_combat_ped(null, player_ped_id())
close_sequence_task(seq)
task_perform_sequence(wave_2_enemy[i].ped, seq)
clear_sequence_task(seq)
// @SBA - enemies will try to rush inside periodically, so setting this as the next stage
//wave_2_status[i] = do_nothing
wave_2_status[i] = run_into_shop
endif
else
open_sequence_task(seq)
task_pause(null, (250 * i))
task_set_blocking_of_non_temporary_events(null, false)
task_set_sphere_defensive_area(null, wave_2_enemy[i].run_to_pos, 4.0)
task_combat_ped(null, player_ped_id())
close_sequence_task(seq)
task_perform_sequence(wave_2_enemy[i].ped, seq)
clear_sequence_task(seq)
// @SBA - enemies will try to rush inside periodically, so setting this as the next stage
//wave_2_status[i] = do_nothing
wave_2_status[i] = run_into_shop
endif
break
case 3
if is_vehicle_driveable(wave_2_enemy_vehicle[2].veh)
if not is_playback_going_on_for_vehicle(wave_2_enemy_vehicle[2].veh)
open_sequence_task(seq)
task_pause(null, (250 * i))
task_set_blocking_of_non_temporary_events(null, false)
task_set_sphere_defensive_area(null, wave_2_enemy[i].run_to_pos, 4.0) // @SBA - expanding sphere. OLD = 2.0
task_combat_ped(null, player_ped_id())
close_sequence_task(seq)
task_perform_sequence(wave_2_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_2_status[i] = attack_from_pos_2
endif
else
open_sequence_task(seq)
task_pause(null, (250 * i))
task_set_blocking_of_non_temporary_events(null, false)
task_set_sphere_defensive_area(null, wave_2_enemy[i].run_to_pos, 4.0) // @SBA - expanding sphere. OLD = 2.0
task_combat_ped(null, player_ped_id())
close_sequence_task(seq)
task_perform_sequence(wave_2_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_2_status[i] = attack_from_pos_2
endif
break
case 4
if is_vehicle_driveable(wave_2_enemy_vehicle[3].veh)
if is_playback_going_on_for_vehicle(wave_2_enemy_vehicle[3].veh)
if (GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(wave_2_enemy_vehicle[3].recording_number, "lkmethlab") - 250) < (get_time_position_in_recording(wave_2_enemy_vehicle[3].veh))
stop_playback_recorded_vehicle(wave_2_enemy_vehicle[3].veh)
REMOVE_VEHICLE_BLIP(wave_2_enemy_vehicle[3])
// SET_PED_COMBAT_ATTRIBUTES(wave_2_enemy[i].ped, ca_use_vehicle, false)
// SET_PED_COMBAT_ATTRIBUTES(wave_2_enemy[i].ped, CA_LEAVE_VEHICLES, true)
// set_blocking_of_non_temporary_events(wave_2_enemy[i].ped, false)
// set_ped_sphere_defensive_area(wave_2_enemy[i].ped, wave_2_enemy[i].run_to_pos, 3.0)
// task_combat_ped(wave_2_enemy[i].ped, player_ped_id())
//wave_2_status[i] = do_nothing
// @SBA - have enemy exit vehicle and run to the back stairs
open_sequence_task(seq)
task_leave_vehicle(null, wave_2_enemy_vehicle[3].veh, ECF_USE_RIGHT_ENTRY)
TASK_SWAP_WEAPON(NULL, TRUE)
//TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, wave_2_enemy[i].run_to_pos, pedmove_run, -1)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_2_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
TASK_SET_SPHERE_DEFENSIVE_AREA(null, wave_2_enemy[i].run_to_pos, 4.0)
task_combat_ped(null, player_ped_id())
close_sequence_task(seq)
task_perform_sequence(wave_2_enemy[i].ped, seq)
clear_sequence_task(seq)
// @SBA - enemies will try to rush inside, so setting this as the next stage
// wave_2_status[i] = get_into_pos
wave_2_status[i] = run_into_shop
endif
else
set_blocking_of_non_temporary_events(wave_2_enemy[i].ped, false)
set_ped_sphere_defensive_area(wave_2_enemy[i].ped, wave_2_enemy[i].run_to_pos, 3.0)
task_combat_ped(wave_2_enemy[i].ped, player_ped_id())
// // @SBA - enemies will try to rush inside periodically, so setting this as the next stage
// //wave_2_status[i] = do_nothing
// wave_2_status[i] = run_into_shop
// @SBA - have enemy exit vehicle and run to the back stairs
// open_sequence_task(seq)
// // @SBA - replace this with a TASK_FOLLOW_NAV_MESH_TO_COORD once T-posing is fixed
// //TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_2_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
// TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, wave_2_enemy[i].run_to_pos, pedmove_run, -1)
// close_sequence_task(seq)
// task_perform_sequence(wave_2_enemy[i].ped, seq)
clear_sequence_task(seq)
// @SBA - enemies will try to rush inside, so setting this as the next stage
wave_2_status[i] = run_into_shop
endif
else
set_blocking_of_non_temporary_events(wave_2_enemy[i].ped, false)
set_ped_sphere_defensive_area(wave_2_enemy[i].ped, wave_2_enemy[i].run_to_pos, 3.0)
task_combat_ped(wave_2_enemy[i].ped, player_ped_id())
// // @SBA - enemies will try to rush inside periodically, so setting this as the next stage
// //wave_2_status[i] = do_nothing
// wave_2_status[i] = run_into_shop
// @SBA - have enemy exit vehicle and run to the back stairs
// open_sequence_task(seq)
// // @SBA - replace this with a TASK_FOLLOW_NAV_MESH_TO_COORD once T-posing is fixed
// //TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_2_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
// TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, wave_2_enemy[i].run_to_pos, pedmove_run, -1)
// close_sequence_task(seq)
// task_perform_sequence(wave_2_enemy[i].ped, seq)
// clear_sequence_task(seq)
// @SBA - enemies will try to rush inside, so setting this as the next stage
wave_2_status[i] = run_into_shop
endif
break
case 5
if is_vehicle_driveable(wave_2_enemy_vehicle[4].veh)
if is_playback_going_on_for_vehicle(wave_2_enemy_vehicle[4].veh)
if (GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(wave_2_enemy_vehicle[4].recording_number, "lkmethlab") - 500) < (get_time_position_in_recording(wave_2_enemy_vehicle[4].veh))
stop_playback_recorded_vehicle(wave_2_enemy_vehicle[4].veh)
REMOVE_VEHICLE_BLIP(wave_2_enemy_vehicle[4])
// @SBA - have enemy exit vehicle and run to the back stairs
open_sequence_task(seq)
task_leave_vehicle(null, wave_2_enemy_vehicle[4].veh, ECF_USE_RIGHT_ENTRY)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_2_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
task_set_blocking_of_non_temporary_events(null, false)
TASK_SET_SPHERE_DEFENSIVE_AREA(null, wave_2_enemy[i].run_to_pos, 4.0)
task_combat_ped(null, player_ped_id())
close_sequence_task(seq)
task_perform_sequence(wave_2_enemy[i].ped, seq)
// @SBA - enemies will try to rush inside, so setting this as the next stage
//wave_2_status[i] = do_nothing
wave_2_status[i] = run_into_shop
endif
else
set_blocking_of_non_temporary_events(wave_2_enemy[i].ped, false)
set_ped_sphere_defensive_area(wave_2_enemy[i].ped, wave_2_enemy[i].run_to_pos, 4.0)
task_combat_ped(wave_2_enemy[i].ped, player_ped_id())
// @SBA - have enemy exit vehicle and run to the back stairs
// open_sequence_task(seq)
// // @SBA - replace this with a TASK_FOLLOW_NAV_MESH_TO_COORD once T-posing is fixed
// TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_2_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
// close_sequence_task(seq)
// task_perform_sequence(wave_2_enemy[i].ped, seq)
// clear_sequence_task(seq)
// @SBA - enemies will try to rush inside, so setting this as the next stage
//wave_2_status[i] = do_nothing
wave_2_status[i] = run_into_shop
endif
else
set_blocking_of_non_temporary_events(wave_2_enemy[i].ped, false)
set_ped_sphere_defensive_area(wave_2_enemy[i].ped, wave_2_enemy[i].run_to_pos, 4.0)
task_combat_ped(wave_2_enemy[i].ped, player_ped_id())
// @SBA - have enemy exit vehicle and run to the back stairs
// open_sequence_task(seq)
// // @SBA - replace this with a TASK_FOLLOW_NAV_MESH_TO_COORD once T-posing is fixed
// TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_2_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
// close_sequence_task(seq)
// task_perform_sequence(wave_2_enemy[i].ped, seq)
// clear_sequence_task(seq)
// @SBA - enemies will try to rush inside, so setting this as the next stage
//wave_2_status[i] = do_nothing
wave_2_status[i] = run_into_shop
endif
break
case 6
if is_vehicle_driveable(wave_2_enemy_vehicle[0].veh)
if is_playback_going_on_for_vehicle(wave_2_enemy_vehicle[0].veh)
if (GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(wave_2_enemy_vehicle[0].recording_number, "lkmethlab") - 650) < (get_time_position_in_recording(wave_2_enemy_vehicle[0].veh))
stop_playback_recorded_vehicle(wave_2_enemy_vehicle[0].veh)
REMOVE_VEHICLE_BLIP(wave_2_enemy_vehicle[0])
open_sequence_task(seq)
task_leave_vehicle(null, wave_2_enemy_vehicle[0].veh, ecf_dont_close_door)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_2_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_2_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_2_status[i] = get_into_pos
else
// if is_entity_in_angled_area(wave_2_enemy[i].ped, <<1433.399, 3636.853, 33.922>>, <<1449.164, 3595.132, 37.922>>, 58.00)
//
// if is_grenade_launcher_explosion_in_car_park()
//
// endif
//
// endif
endif
else
wave_2_status[i] = get_into_pos
endif
else
wave_2_status[i] = get_into_pos
endif
break
case 7
if is_vehicle_driveable(wave_2_enemy_vehicle[0].veh)
if not is_playback_going_on_for_vehicle(wave_2_enemy_vehicle[0].veh)
open_sequence_task(seq)
task_pause(null, 250)
task_leave_vehicle(null, wave_2_enemy_vehicle[0].veh, ecf_dont_close_door)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_2_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_2_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_2_status[i] = get_into_pos
endif
else
wave_2_status[i] = get_into_pos
endif
break
case 8
if is_vehicle_driveable(wave_2_enemy_vehicle[1].veh)
if is_playback_going_on_for_vehicle(wave_2_enemy_vehicle[1].veh)
if (GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(wave_2_enemy_vehicle[1].recording_number, "lkmethlab") - 1000) < (get_time_position_in_recording(wave_2_enemy_vehicle[1].veh))
stop_playback_recorded_vehicle(wave_2_enemy_vehicle[1].veh)
REMOVE_VEHICLE_BLIP(wave_2_enemy_vehicle[1])
open_sequence_task(seq)
task_leave_vehicle(null, wave_2_enemy_vehicle[1].veh, ecf_dont_close_door)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_2_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_2_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_2_status[i] = get_into_pos
endif
else
wave_2_status[i] = get_into_pos
endif
else
wave_2_status[i] = get_into_pos
endif
break
case 9
if is_vehicle_driveable(wave_2_enemy_vehicle[1].veh)
if not is_playback_going_on_for_vehicle(wave_2_enemy_vehicle[1].veh)
open_sequence_task(seq)
task_pause(null, 250)
task_leave_vehicle(null, wave_2_enemy_vehicle[1].veh, ecf_dont_close_door)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_2_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_2_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_2_status[i] = get_into_pos
endif
else
wave_2_status[i] = get_into_pos
endif
break
case 10
if is_vehicle_driveable(wave_2_enemy_vehicle[2].veh)
if is_playback_going_on_for_vehicle(wave_2_enemy_vehicle[2].veh)
if (GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(wave_2_enemy_vehicle[2].recording_number, "lkmethlab") - 1000) < (get_time_position_in_recording(wave_2_enemy_vehicle[2].veh))
stop_playback_recorded_vehicle(wave_2_enemy_vehicle[2].veh)
REMOVE_VEHICLE_BLIP(wave_2_enemy_vehicle[2])
open_sequence_task(seq)
task_leave_vehicle(null, wave_2_enemy_vehicle[2].veh, ecf_dont_close_door)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_2_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_2_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_2_status[i] = get_into_pos
endif
else
wave_2_status[i] = get_into_pos
endif
else
wave_2_status[i] = get_into_pos
endif
break
case 11
if is_vehicle_driveable(wave_2_enemy_vehicle[2].veh)
if not is_playback_going_on_for_vehicle(wave_2_enemy_vehicle[2].veh)
open_sequence_task(seq)
task_pause(null, 250)
task_leave_vehicle(null, wave_2_enemy_vehicle[2].veh, ecf_dont_close_door)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_2_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_2_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_2_status[i] = get_into_pos
endif
else
wave_2_status[i] = get_into_pos
endif
break
case 12
if is_vehicle_driveable(wave_2_enemy_vehicle[5].veh)
if is_playback_going_on_for_vehicle(wave_2_enemy_vehicle[5].veh)
if (GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(wave_2_enemy_vehicle[5].recording_number, "lkmethlab") - 500) < (get_time_position_in_recording(wave_2_enemy_vehicle[5].veh))
stop_playback_recorded_vehicle(wave_2_enemy_vehicle[5].veh)
REMOVE_VEHICLE_BLIP(wave_2_enemy_vehicle[5])
open_sequence_task(seq)
task_leave_vehicle(null, wave_2_enemy_vehicle[5].veh, ecf_dont_close_door | ECF_DONT_DEFAULT_WARP_IF_DOOR_BLOCKED)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_2_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_2_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_2_status[i] = get_into_pos
endif
else
wave_2_status[i] = get_into_pos
endif
else
wave_2_status[i] = get_into_pos
endif
break
case 13
if is_vehicle_driveable(wave_2_enemy_vehicle[5].veh)
if not is_playback_going_on_for_vehicle(wave_2_enemy_vehicle[5].veh)
open_sequence_task(seq)
task_pause(null, 250)
task_leave_vehicle(null, wave_2_enemy_vehicle[5].veh, ecf_dont_close_door | ECF_DONT_DEFAULT_WARP_IF_DOOR_BLOCKED)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_2_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_2_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_2_status[i] = get_into_pos
endif
else
wave_2_status[i] = get_into_pos
endif
break
case 14
if is_vehicle_driveable(wave_2_enemy_vehicle[6].veh)
if is_playback_going_on_for_vehicle(wave_2_enemy_vehicle[6].veh)
if (GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(wave_2_enemy_vehicle[6].recording_number, "lkmethlab") - 500) < (get_time_position_in_recording(wave_2_enemy_vehicle[6].veh))
stop_playback_recorded_vehicle(wave_2_enemy_vehicle[6].veh)
REMOVE_VEHICLE_BLIP(wave_2_enemy_vehicle[6])
open_sequence_task(seq)
task_leave_vehicle(null, wave_2_enemy_vehicle[6].veh, ecf_dont_close_door)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_2_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_2_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_2_status[i] = get_into_pos
endif
else
wave_2_status[i] = get_into_pos
endif
else
wave_2_status[i] = get_into_pos
endif
break
case 15
if is_vehicle_driveable(wave_2_enemy_vehicle[6].veh)
if not is_playback_going_on_for_vehicle(wave_2_enemy_vehicle[6].veh)
open_sequence_task(seq)
task_pause(null, 250)
task_leave_vehicle(null, wave_2_enemy_vehicle[6].veh, ecf_dont_close_door)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_2_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_2_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_2_status[i] = get_into_pos
endif
else
wave_2_status[i] = get_into_pos
endif
break
case 16
if is_vehicle_driveable(wave_2_enemy_vehicle[7].veh)
if is_playback_going_on_for_vehicle(wave_2_enemy_vehicle[7].veh)
if (GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(wave_2_enemy_vehicle[7].recording_number, "lkmethlab") - 2000) < (get_time_position_in_recording(wave_2_enemy_vehicle[7].veh))
stop_playback_recorded_vehicle(wave_2_enemy_vehicle[7].veh)
REMOVE_VEHICLE_BLIP(wave_2_enemy_vehicle[7])
open_sequence_task(seq)
task_leave_vehicle(null, wave_2_enemy_vehicle[7].veh, ecf_dont_close_door)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_2_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_2_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_2_status[i] = get_into_pos
endif
else
wave_2_status[i] = get_into_pos
endif
else
wave_2_status[i] = get_into_pos
endif
break
case 17
if is_vehicle_driveable(wave_2_enemy_vehicle[7].veh)
if not is_playback_going_on_for_vehicle(wave_2_enemy_vehicle[7].veh)
open_sequence_task(seq)
task_pause(null, 250)
task_leave_vehicle(null, wave_2_enemy_vehicle[7].veh, ecf_dont_close_door)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_2_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_2_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_2_status[i] = get_into_pos
endif
else
wave_2_status[i] = get_into_pos
endif
break
case 18
if is_vehicle_driveable(wave_2_enemy_vehicle[6].veh)
if is_playback_going_on_for_vehicle(wave_2_enemy_vehicle[6].veh)
if ((get_time_position_in_recording(wave_2_enemy_vehicle[6].veh) + 250) > GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(wave_2_enemy_vehicle[6].recording_number, "lkmethlab"))
stop_playback_recorded_vehicle(wave_2_enemy_vehicle[6].veh)
REMOVE_VEHICLE_BLIP(wave_2_enemy_vehicle[6])
set_blocking_of_non_temporary_events(wave_2_enemy[i].ped, false)
set_ped_sphere_defensive_area(wave_2_enemy[i].ped, wave_2_enemy[i].run_to_pos, 3.0)
task_combat_ped(wave_2_enemy[i].ped, player_ped_id())
// @SBA - enemies will try to rush inside periodically, so setting this as the next stage
//wave_2_status[i] = do_nothing
wave_2_status[i] = run_into_shop
endif
else
set_blocking_of_non_temporary_events(wave_2_enemy[i].ped, false)
set_ped_sphere_defensive_area(wave_2_enemy[i].ped, wave_2_enemy[i].run_to_pos, 3.0)
task_combat_ped(wave_2_enemy[i].ped, player_ped_id())
// @SBA - enemies will try to rush inside periodically, so setting this as the next stage
//wave_2_status[i] = do_nothing
wave_2_status[i] = run_into_shop
endif
else
set_blocking_of_non_temporary_events(wave_2_enemy[i].ped, false)
set_ped_sphere_defensive_area(wave_2_enemy[i].ped, wave_2_enemy[i].run_to_pos, 3.0)
task_combat_ped(wave_2_enemy[i].ped, player_ped_id())
// @SBA - enemies will try to rush inside periodically, so setting this as the next stage
//wave_2_status[i] = do_nothing
wave_2_status[i] = run_into_shop
endif
break
case 19
if is_vehicle_driveable(wave_2_enemy_vehicle[6].veh)
if not is_playback_going_on_for_vehicle(wave_2_enemy_vehicle[6].veh)
open_sequence_task(seq)
task_pause(null, 250)
task_set_blocking_of_non_temporary_events(null, false)
task_set_sphere_defensive_area(null, wave_2_enemy[i].run_to_pos, 3.0) // @SBA - expanding sphere. OLD = 2.0
task_combat_ped(null, player_ped_id())
close_sequence_task(seq)
task_perform_sequence(wave_2_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_2_status[i] = attack_from_pos_2
endif
else
open_sequence_task(seq)
task_pause(null, 250)
task_set_blocking_of_non_temporary_events(null, false)
task_set_sphere_defensive_area(null, wave_2_enemy[i].run_to_pos, 3.0) // @SBA - expanding sphere. OLD = 2.0
task_combat_ped(null, player_ped_id())
close_sequence_task(seq)
task_perform_sequence(wave_2_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_2_status[i] = attack_from_pos_2
endif
break
case 20
SET_PED_COMBAT_ATTRIBUTES(wave_2_enemy[i].ped, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
set_blocking_of_non_temporary_events(wave_2_enemy[i].ped, false)
set_ped_sphere_defensive_area(wave_2_enemy[i].ped, wave_2_enemy[i].run_to_pos, 2.0)
task_combat_ped(wave_2_enemy[i].ped, player_ped_id())
wave_2_status[i] = attack_from_pos_2
break
endswitch
// @SBA - set intial wait time before the first enemy rushes (if not set yet)
IF iWaitTimeBeforeRush != 50000
iWaitTimeBeforeRush = 50000
// @SBA - start rush timer
iWave_Rush_Time = GET_GAME_TIMER()
ENDIF
break
case get_into_pos
switch i
//wave 2 second wave car enemies
case 6
case 7
case 8
case 9
case 10
case 11
case 12
case 13
case 14
case 15
case 16
case 17
if not IS_ENTITY_AT_COORD(wave_2_enemy[i].ped, wave_2_enemy[i].run_to_pos, <<1.0, 1.0, 1.6>>, false, true)
if has_ped_task_finished_2(wave_2_enemy[i].ped, script_task_perform_sequence)
set_blocking_of_non_temporary_events(wave_2_enemy[i].ped, true)
clear_ped_tasks(wave_2_enemy[i].ped)
open_sequence_task(seq)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_2_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_2_enemy[i].ped, seq)
clear_sequence_task(seq)
endif
else
set_blocking_of_non_temporary_events(wave_2_enemy[i].ped, false)
// @SBA - give enemy a wider range for the AI to use
//set_ped_sphere_defensive_area(wave_2_enemy[i].ped, wave_2_enemy[i].run_to_pos, 3.0)
SET_PED_ANGLED_DEFENSIVE_AREA(wave_2_enemy[i].ped, tbBackYardVolume.vMin, tbBackYardVolume.vMax, tbBackYardVolume.flWidth)
task_combat_ped(wave_2_enemy[i].ped, player_ped_id())
// @SBA - enemies will try to rush inside periodically, so setting this as the next stage
//wave_2_status[i] = do_nothing
wave_2_status[i] = run_into_shop
endif
break
endswitch
break
case attack_from_pos_2
switch i
case 3
if is_ped_injured(wave_2_enemy[1].ped)
wave_2_enemy[i].run_to_pos = wave_2_enemy[1].run_to_pos
set_blocking_of_non_temporary_events(wave_2_enemy[i].ped, false)
set_ped_sphere_defensive_area(wave_2_enemy[i].ped, wave_2_enemy[i].run_to_pos, 4.0) // @SBA - trying a larger sphere. OLD VALUE = 1.0
// @SBA - enemies will try to rush inside periodically, so setting this as the next stage
//wave_2_status[i] = do_nothing
wave_2_status[i] = run_into_shop
// @SBA - commenting this out one since enemy 5 is an early rusher
// elif is_ped_injured(wave_2_enemy[5].ped)
//
// wave_2_enemy[i].run_to_pos = wave_2_enemy[5].run_to_pos
//
// set_blocking_of_non_temporary_events(wave_2_enemy[i].ped, false)
// set_ped_sphere_defensive_area(wave_2_enemy[i].ped, wave_2_enemy[i].run_to_pos, 3.0) // @SBA - trying a larger sphere. OLD VALUE = 1.0
// // @SBA - enemies will try to rush inside periodically, so setting this as the next stage
// //wave_2_status[i] = do_nothing
// wave_2_status[i] = run_into_shop
endif
break
case 19
if is_ped_injured(wave_2_enemy[2].ped)
wave_2_enemy[i].run_to_pos = wave_2_enemy[2].run_to_pos
set_blocking_of_non_temporary_events(wave_2_enemy[i].ped, false)
set_ped_sphere_defensive_area(wave_2_enemy[i].ped, wave_2_enemy[i].run_to_pos, 4.0) // @SBA - trying a larger sphere. OLD VALUE = 1.0
wave_2_status[i] = run_into_shop
// @SBA - commenting this out one since enemy 4 is an early rusher
// elif is_ped_injured(wave_2_enemy[4].ped)
//
// wave_2_enemy[i].run_to_pos = wave_2_enemy[4].run_to_pos
//
// set_blocking_of_non_temporary_events(wave_2_enemy[i].ped, false)
// set_ped_sphere_defensive_area(wave_2_enemy[i].ped, wave_2_enemy[i].run_to_pos, 3.0) // @SBA - trying a larger sphere. OLD VALUE = 1.0
// wave_2_status[i] = do_nothing
endif
break
endswitch
break
// @SBA - adding this case for the rush inside
CASE run_into_shop
INT iRushersAtOnce
iRushersAtOnce = 1
IF iWaveRushersSoFar > 3
iRushersAtOnce = 2
ENDIF
// @SBA - allow a new rush only when the greneade launcher cutscene isn't playing
IF NOT grenade_launcher_cutscene_playing
// @SBA - check the rush timer
IF lk_timer(iWave_Rush_Time, iWaitTimeBeforeRush)
// @SBA - When the wait timer is ready, check if we want a new rusher
IF ARE_WE_READY_FOR_A_NEW_RUSHER(wave_2_enemy, iRushersAtOnce)
// @SBA - get the index of the next valid rushers
iWave_2_Index = GET_NEXT_WAVE_2_INDEX()
IF iWave_2_Index != -1
CPRINTLN(DEBUG_MISSION,"*** Sending in a Wave 2 enemy to rush. Index = ", iWave_2_Index)
// @SBA - set defensive area on the roof to move the enemy there
SET_PED_ANGLED_DEFENSIVE_AREA(wave_2_enemy[iWave_2_Index].ped, tbBackRoofVolume.vMin, tbBackRoofVolume.vMax, tbBackRoofVolume.flWidth)
// @SBA - Reset this so buddy can shoot these guys
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(wave_2_enemy[iWave_2_Index].ped, FALSE)
// @SBA - set a new, random wait time then restart rush timer
iWaitTimeBeforeRush = GET_RANDOM_INT_IN_RANGE(7999, 9999)
iWave_Rush_Time = GET_GAME_TIMER()
SET_ENEMY_RUSHER_ATTRIBUTES(wave_2_enemy[iWave_2_Index].ped, 1, 0, 50)
iWaveRushersSoFar++
// @SBA - set new state
wave_2_status[iWave_2_Index] = combat_player
ELSE
// @SBA - If we didn't find a valid enemy it could be because no one was in the right state yet,
// so reset the clock to try again
//CPRINTLN(DEBUG_MISSION,"*** Found no valid Wave 2 enemy to rush. Reset the timer to try again later.")
iWaitTimeBeforeRush = 10000
iWave_Rush_Time = GET_GAME_TIMER()
ENDIF
ELSE
// @SBA - Not ready for a new rusher (max number still in play).
//CPRINTLN(DEBUG_MISSION,"*** Don't need a new rusher yet. Reset the timer to try again later.")
iWaitTimeBeforeRush = GET_RANDOM_INT_IN_RANGE(7000, 9999)
iWave_Rush_Time = GET_GAME_TIMER()
ENDIF
ENDIF
ELSE
// ** Not sure we'll need this now, commenting out
// @SBA - when the greneade launcher cutscene starts reset the wait time
// this gives more time for the next enemies to arrive
// IF iWaitTimeBeforeRush != 22500
// iWaitTimeBeforeRush = 22500
// ENDIF
ENDIF
BREAK
// @SBA - adding this case for the rush inside
CASE combat_player
// Rushers will now have pistols - does enemy rusher need one?
IF wave_2_enemy[i].weapon != WEAPONTYPE_PISTOL
IF IS_PED_INSIDE_INTERIOR(wave_2_enemy[i].ped, <<1392.7360, 3602.5989, 38.5>>, "v_methlab")
// checking again for safety
IF GET_CURRENT_PED_WEAPON(wave_2_enemy[i].ped, wave_2_enemy[i].weapon)
IF wave_2_enemy[i].weapon != WEAPONTYPE_PISTOL
GIVE_WEAPON_TO_PED(wave_2_enemy[i].ped, WEAPONTYPE_PISTOL, INFINITE_AMMO)
OPEN_SEQUENCE_TASK(seq)
TASK_SWAP_WEAPON(NULL, TRUE)
TASK_COMBAT_PED(NULL, PLAYER_PED_ID())
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(wave_2_enemy[i].ped, seq)
CLEAR_SEQUENCE_TASK(seq)
SET_PED_CAN_SWITCH_WEAPON(wave_2_enemy[i].ped, FALSE)
wave_2_enemy[i].weapon = WEAPONTYPE_PISTOL
ENDIF
ENDIF
ENDIF
ENDIF
// @SBA - if enemy has reached position, let him fight there
IF IS_ENTITY_IN_TRIGGER_BOX(wave_2_enemy[i].ped, tbBackRoofVolume)
REGISTER_TARGET(wave_2_enemy[i].ped, buddy.ped)
//TASK_COMBAT_HATED_TARGETS_AROUND_PED(wave_2_enemy[i].ped, 20.0)
// @SBA - send this enemy's status to the bone yard
wave_2_status[i] = do_nothing
ENDIF
BREAK
case grenade_launcher_explosion
switch i
case 0
case 1
case 2
case 3
case 4
case 5
case 6
case 7
case 8
case 9
case 10
case 11
case 12
case 13
case 14
case 15
case 16
case 17
case 18
case 19
if get_distance_between_coords(get_entity_coords(player_ped_id()), get_entity_coords(wave_2_enemy[i].ped)) > 70
remove_blip(wave_2_enemy[i].blip)
set_ped_as_no_longer_needed(wave_2_enemy[i].ped)
endif
break
endswitch
break
case do_nothing
switch i
case 0
case 1
case 2
case 3
case 4
case 5
case 6
case 7
case 8
case 9
case 10
case 11
case 12
case 13
case 14
case 15
case 16
case 17
case 18
case 19
break
endswitch
break
endswitch
endif
endfor
//endif
else
return true
endif
return false
endfunc
func bool remaining_enemy_0_system()
if not is_ped_injured(remaining_enemy[0])
switch remaining_enemy_status[0]
case 0
set_blocking_of_non_temporary_events(remaining_enemy[0], true)
clear_ped_tasks(remaining_enemy[0])
open_sequence_task(seq)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, <<1395.7225, 3600.0715, 33.9803>>, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(remaining_enemy[0], seq)
clear_sequence_task(seq)
remaining_enemy_status[0]++
break
case 1
if not IS_ENTITY_AT_COORD(remaining_enemy[0], <<1395.7225, 3600.0715, 33.9803>>, <<1.0, 1.0, 1.6>>, false, true)
if has_ped_task_finished_2(remaining_enemy[0], script_task_perform_sequence)
set_blocking_of_non_temporary_events(remaining_enemy[0], true)
clear_ped_tasks(remaining_enemy[0])
open_sequence_task(seq)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, <<1395.7225, 3600.0715, 33.9803>>, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(remaining_enemy[0], seq)
clear_sequence_task(seq)
endif
else
set_blocking_of_non_temporary_events(remaining_enemy[0], false)
set_ped_sphere_defensive_area(remaining_enemy[0], <<1395.7225, 3600.0715, 33.9803>>, 1.0)
task_combat_ped(remaining_enemy[0], player_ped_id())
remaining_enemy_status[0]++
endif
break
case 2
if is_ped_injured(wave_3_enemy[1].ped)
set_blocking_of_non_temporary_events(remaining_enemy[0], true)
clear_ped_tasks(remaining_enemy[0])
open_sequence_task(seq)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, <<1394.5330, 3605.6438, 33.9809>>, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(remaining_enemy[0], seq)
clear_sequence_task(seq)
remaining_enemy_status[0]++
endif
break
case 3
if not IS_ENTITY_AT_COORD(remaining_enemy[0], <<1394.5330, 3605.6438, 33.9809>>, <<1.0, 1.0, 1.6>>, false, true)
if has_ped_task_finished_2(remaining_enemy[0], script_task_perform_sequence)
set_blocking_of_non_temporary_events(remaining_enemy[0], true)
clear_ped_tasks(remaining_enemy[0])
open_sequence_task(seq)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, <<1394.5330, 3605.6438, 33.9809>>, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(remaining_enemy[0], seq)
clear_sequence_task(seq)
endif
else
set_blocking_of_non_temporary_events(remaining_enemy[0], false)
set_ped_sphere_defensive_area(remaining_enemy[0], <<1394.5330, 3605.6438, 33.9809>>, 2.0)
task_combat_ped(remaining_enemy[0], player_ped_id())
remaining_enemy_status[0]++
endif
break
case 4
break
endswitch
else
return true
endif
return false
endfunc
func bool remaining_enemy_1_system()
if not is_ped_injured(remaining_enemy[1])
switch remaining_enemy_status[1]
case 0
set_blocking_of_non_temporary_events(remaining_enemy[1], true)
clear_ped_tasks(remaining_enemy[1])
open_sequence_task(seq)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, <<1392.7656, 3598.7432, 33.9803>>, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(remaining_enemy[1], seq)
clear_sequence_task(seq)
remaining_enemy_status[1]++
break
case 1
if not IS_ENTITY_AT_COORD(remaining_enemy[1], <<1392.7656, 3598.7432, 33.9803>>, <<1.0, 1.0, 1.6>>, false, true)
if has_ped_task_finished_2(remaining_enemy[1], script_task_perform_sequence)
set_blocking_of_non_temporary_events(remaining_enemy[1], true)
clear_ped_tasks(remaining_enemy[1])
open_sequence_task(seq)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, <<1392.7656, 3598.7432, 33.9803>>, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(remaining_enemy[1], seq)
clear_sequence_task(seq)
endif
else
set_blocking_of_non_temporary_events(remaining_enemy[1], false)
set_ped_sphere_defensive_area(remaining_enemy[1], <<1392.7656, 3598.7432, 33.9803>>, 1.0)
task_combat_ped(remaining_enemy[1], player_ped_id())
remaining_enemy_status[1]++
endif
break
case 2
if is_ped_injured(wave_3_enemy[2].ped)
set_blocking_of_non_temporary_events(remaining_enemy[1], true)
clear_ped_tasks(remaining_enemy[1])
open_sequence_task(seq)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, <<1396.5658, 3602.8413, 33.9809>>, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(remaining_enemy[1], seq)
clear_sequence_task(seq)
remaining_enemy_status[1]++
endif
break
case 3
if not IS_ENTITY_AT_COORD(remaining_enemy[1], <<1396.5658, 3602.8413, 33.9809>>, <<1.0, 1.0, 1.6>>, false, true)
if has_ped_task_finished_2(remaining_enemy[1], script_task_perform_sequence)
set_blocking_of_non_temporary_events(remaining_enemy[1], true)
clear_ped_tasks(remaining_enemy[1])
open_sequence_task(seq)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, <<1396.5658, 3602.8413, 33.9809>>, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(remaining_enemy[1], seq)
clear_sequence_task(seq)
endif
else
set_blocking_of_non_temporary_events(remaining_enemy[1], false)
set_ped_sphere_defensive_area(remaining_enemy[1], <<1396.5658, 3602.8413, 33.9809>>, 2.0)
task_combat_ped(remaining_enemy[1], player_ped_id())
remaining_enemy_status[1]++
endif
break
case 4
break
endswitch
else
return true
endif
return false
endfunc
func bool wave_3_ai_system()
if not wave_3_complete
//if activate_wave_3
if ped_structure_are_all_enemies_dead(wave_3_enemy) //and remaining_enemy_0_system() and remaining_enemy_1_system()
wave_3_complete = true
return true
endif
// @SBA - initializing local variable
INT iWave_3_Index
for i = 0 to count_of(wave_3_enemy) - 1
if not is_ped_injured(wave_3_enemy[i].ped)
// @SBA - make blip for enemy if needed
HANDLE_ENEMY_BLIP_CREATION(wave_3_enemy[i])
switch wave_3_status[i]
case initial_attack_phase
switch i
case 0
if is_vehicle_driveable(wave_3_enemy_vehicle[0].veh)
if is_playback_going_on_for_vehicle(wave_3_enemy_vehicle[0].veh)
if (GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(wave_3_enemy_vehicle[0].recording_number, "lkmethlab") - 1000) < (get_time_position_in_recording(wave_3_enemy_vehicle[0].veh))
stop_playback_recorded_vehicle(wave_3_enemy_vehicle[0].veh)
REMOVE_VEHICLE_BLIP(wave_3_enemy_vehicle[0])
open_sequence_task(seq)
task_leave_vehicle(null, wave_3_enemy_vehicle[0].veh, ecf_dont_close_door)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_3_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_3_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_3_status[i] = get_into_pos
endif
endif
else
wave_3_status[i] = get_into_pos
endif
break
case 1
case 2
case 3
if is_vehicle_driveable(wave_3_enemy_vehicle[0].veh)
if not is_playback_going_on_for_vehicle(wave_3_enemy_vehicle[0].veh)
player_position = GET_ENTITY_COORDS(player_ped_id())
if (player_position.z < 37.00)
open_sequence_task(seq)
task_pause(null, (250 * i))
task_leave_vehicle(null, wave_3_enemy_vehicle[0].veh, ecf_dont_close_door)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_3_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_3_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_3_status[i] = get_into_pos
endif
endif
else
wave_3_status[i] = get_into_pos
endif
break
endswitch
break
case get_into_pos
switch i
case 0
case 1
case 2
if not IS_ENTITY_AT_COORD(wave_3_enemy[i].ped, wave_3_enemy[i].run_to_pos, <<1.0, 1.0, 1.6>>, false, true)
if has_ped_task_finished_2(wave_3_enemy[i].ped, script_task_perform_sequence)
set_blocking_of_non_temporary_events(wave_3_enemy[i].ped, true)
clear_ped_tasks(wave_3_enemy[i].ped)
open_sequence_task(seq)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_3_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_3_enemy[i].ped, seq)
clear_sequence_task(seq)
endif
else
// @SBA - Start rushing timer (make sure it gives enough time to get enemies into position)
IF iWaitTimeBeforeRush != 2000
iWaitTimeBeforeRush = 2000
iWave_Rush_Time = GET_GAME_TIMER()
ENDIF
set_blocking_of_non_temporary_events(wave_3_enemy[i].ped, false)
set_ped_sphere_defensive_area(wave_3_enemy[i].ped, wave_3_enemy[i].run_to_pos, 1.0)
task_combat_ped(wave_3_enemy[i].ped, player_ped_id())
// @SBA - they'll all get a chance to rush, so goto run_into_shop
//wave_3_status[i] = do_nothing
wave_3_status[i] = run_into_shop
endif
break
case 3
if not IS_ENTITY_AT_COORD(wave_3_enemy[i].ped, wave_3_enemy[i].run_to_pos, <<1.0, 1.05, 1.6>>, false, true)
if has_ped_task_finished_2(wave_3_enemy[i].ped, script_task_perform_sequence)
set_blocking_of_non_temporary_events(wave_3_enemy[i].ped, true)
clear_ped_tasks(wave_3_enemy[i].ped)
open_sequence_task(seq)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_3_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_3_enemy[i].ped, seq)
clear_sequence_task(seq)
endif
else
set_blocking_of_non_temporary_events(wave_3_enemy[i].ped, false)
set_ped_sphere_defensive_area(wave_3_enemy[i].ped, wave_3_enemy[i].run_to_pos, 3.0)
task_combat_ped(wave_3_enemy[i].ped, player_ped_id())
wave_3_status[i] = run_into_shop
endif
break
endswitch
break
case run_into_shop
// @SBA - have all 4 enemies eventually run in (not just enemy 3)
// switch i
//
// case 3
//
// if is_ped_injured(wave_3_enemy[1].ped)
//
// set_blocking_of_non_temporary_events(wave_3_enemy[i].ped, true)
// clear_ped_tasks(wave_3_enemy[i].ped)
//
// wave_3_enemy[i].run_to_pos = wave_3_enemy[1].run_to_pos
//
// open_sequence_task(seq)
// TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_3_enemy[i].run_to_pos, player_ped_id(), pedmove_run, false, 0.5, 0.8)
// close_sequence_task(seq)
// task_perform_sequence(wave_3_enemy[i].ped, seq)
// clear_sequence_task(seq)
//
// wave_3_status[i] = get_into_shop
//
// endif
//
// break
//
// endswitch
// @SBA - allow a rush only when the player is inside
// IF IS_ENTITY_IN_ANGLED_AREA(player_ped_id(), <<1400.846, 3602.507, 28.946>>, <<1394.636, 3619.827, 48.946>>, 23.1)
// player_position = GET_ENTITY_COORDS(player_ped_id())
// // @SBA - make sure player isn't still upstairs
// IF (player_position.z < 37.00)
// @SBA - When the wait timer is ready, send a chosen enemy inside
IF lk_timer(iWave_Rush_Time, iWaitTimeBeforeRush)
iWave_3_Index = GET_NEXT_WAVE_3_INDEX()
IF iWave_3_Index != -1
IF wave_3_status[iWave_3_Index] = run_into_shop
CPRINTLN(DEBUG_MISSION,"*** Wave 3 rushing enemy is: ", iWave_3_Index)
// @SBA - set defensive area on the roof to move the enemy there
SET_PED_ANGLED_DEFENSIVE_AREA(wave_3_enemy[iWave_3_Index].ped, tbLiquorStoreVolume.vMin, tbLiquorStoreVolume.vMax, tbLiquorStoreVolume.flWidth)
// @SBA - set a new, random wait time then restart rush timer
iWaitTimeBeforeRush = GET_RANDOM_WAIT_TIME_FOR_WAVE_3()
iWave_Rush_Time = GET_GAME_TIMER()
// @SBA - have this enemy's status make like the US Congress
wave_3_status[iWave_3_Index] = do_nothing
ELSE
// @SBA - If the enemy isn't in the proper state yet (due to short initial timer), reset the flag and clock to try again
IF wave_3_enemy[iWave_3_Index].bRushInside
//CPRINTLN(DEBUG_MISSION,"*** Wave 3 rushing enemy isn't in proper state. Reset for enemy: ", iWave_3_Index)
iWaitTimeBeforeRush = 1500
wave_3_enemy[iWave_3_Index].bRushInside = FALSE
iWave_Rush_Time = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
// ELSE
// // @SBA - If the player goes back upstairs, reset the rush timer
// IF iWaitTimeBeforeRush != 17500
// iWaitTimeBeforeRush = 17500
// ENDIF
// ENDIF
// ELSE
// // @SBA - If the player leaves the liquor store, reset the rush timer
// IF iWaitTimeBeforeRush != 17500
// iWaitTimeBeforeRush = 17500
// ENDIF
// ENDIF
break
case get_into_shop
switch i
case 3
if not IS_ENTITY_AT_COORD(wave_3_enemy[i].ped, wave_3_enemy[i].run_to_pos, <<1.0, 1.0, 1.6>>, false, true)
if has_ped_task_finished_2(wave_3_enemy[i].ped, script_task_perform_sequence)
set_blocking_of_non_temporary_events(wave_3_enemy[i].ped, true)
clear_ped_tasks(wave_3_enemy[i].ped)
open_sequence_task(seq)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_3_enemy[i].run_to_pos, player_ped_id(), pedmove_run, false, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_3_enemy[i].ped, seq)
clear_sequence_task(seq)
endif
else
set_blocking_of_non_temporary_events(wave_3_enemy[i].ped, false)
set_ped_sphere_defensive_area(wave_3_enemy[i].ped, wave_3_enemy[i].run_to_pos, 1.0)
task_combat_ped(wave_3_enemy[i].ped, player_ped_id())
wave_3_status[i] = do_nothing
endif
break
endswitch
break
case do_nothing
break
endswitch
endif
endfor
//endif
else
return true
endif
return false
endfunc
func bool ambient_enemy_system()
if ped_structure_are_all_enemies_dead(ambient_enemy)
return true
endif
for i = 0 to count_of(ambient_enemy) - 1
if not is_ped_injured(ambient_enemy[i].ped)
switch ambient_enemy_status[i]
case initial_attack_phase
switch i
case 0
if is_vehicle_driveable(ambient_enemy_vehicle[0].veh)
if not is_playback_going_on_for_vehicle(ambient_enemy_vehicle[0].veh)
ambient_enemy_status[i] = run_away
endif
else
ambient_enemy_status[i] = run_away
endif
break
case 1
if is_vehicle_driveable(ambient_enemy_vehicle[0].veh)
if not is_playback_going_on_for_vehicle(ambient_enemy_vehicle[0].veh)
open_sequence_task(seq)
task_leave_vehicle(null, ambient_enemy_vehicle[0].veh, ecf_dont_close_door)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, ambient_enemy[i].run_to_pos, player_ped_id(), pedmove_run, false, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(ambient_enemy[i].ped, seq)
clear_sequence_task(seq)
ambient_enemy_status[i] = get_into_pos
endif
else
ambient_enemy_status[i] = get_into_pos
endif
break
case 2
if is_vehicle_driveable(ambient_enemy_vehicle[1].veh)
if not is_playback_going_on_for_vehicle(ambient_enemy_vehicle[1].veh)
ambient_enemy_status[i] = run_away
endif
else
ambient_enemy_status[i] = run_away
endif
break
case 3
if is_vehicle_driveable(ambient_enemy_vehicle[1].veh)
if not is_playback_going_on_for_vehicle(ambient_enemy_vehicle[1].veh)
open_sequence_task(seq)
task_leave_vehicle(null, ambient_enemy_vehicle[1].veh, ecf_dont_close_door)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, ambient_enemy[i].run_to_pos, player_ped_id(), pedmove_run, false, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(ambient_enemy[i].ped, seq)
clear_sequence_task(seq)
ambient_enemy_status[i] = get_into_pos
endif
else
ambient_enemy_status[i] = get_into_pos
endif
break
endswitch
break
case get_into_pos
switch i
case 1
if not IS_ENTITY_AT_COORD(ambient_enemy[i].ped, ambient_enemy[i].run_to_pos, <<1.5, 1.5, 1.6>>, false, true)
if has_ped_task_finished_2(ambient_enemy[i].ped, script_task_perform_sequence)
set_blocking_of_non_temporary_events(ambient_enemy[i].ped, true)
clear_ped_tasks(ambient_enemy[i].ped)
open_sequence_task(seq)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, ambient_enemy[i].run_to_pos, player_ped_id(), pedmove_run, false, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(ambient_enemy[i].ped, seq)
clear_sequence_task(seq)
endif
else
if has_ped_task_finished_2(ambient_enemy[i].ped, script_task_perform_sequence)
set_ped_sphere_defensive_area(ambient_enemy[i].ped, ambient_enemy[i].run_to_pos, 1.75)
set_blocking_of_non_temporary_events(ambient_enemy[i].ped, false)
task_combat_ped(ambient_enemy[i].ped, player_ped_id())
ambient_enemy_status[i] = combat_player
endif
endif
//peds will instead flee if all wave 3 enemies are dead or buddy is outside the lab
if ped_structure_are_all_enemies_dead(wave_3_enemy)
ambient_enemy_status[i] = run_away
endif
break
case 3
if not IS_ENTITY_AT_COORD(ambient_enemy[i].ped, ambient_enemy[i].run_to_pos, <<1.5, 1.5, 1.6>>, false, true)
if has_ped_task_finished_2(ambient_enemy[i].ped, script_task_perform_sequence)
set_blocking_of_non_temporary_events(ambient_enemy[i].ped, true)
clear_ped_tasks(ambient_enemy[i].ped)
open_sequence_task(seq)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, ambient_enemy[i].run_to_pos, player_ped_id(), pedmove_run, false, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(ambient_enemy[i].ped, seq)
clear_sequence_task(seq)
endif
else
if has_ped_task_finished_2(ambient_enemy[i].ped, script_task_perform_sequence)
set_ped_sphere_defensive_area(ambient_enemy[i].ped, ambient_enemy[i].run_to_pos, 1.75)
set_blocking_of_non_temporary_events(ambient_enemy[i].ped, false)
task_combat_ped(ambient_enemy[i].ped, player_ped_id())
ambient_enemy_status[i] = combat_player
endif
endif
//peds will instead flee if all wave 3 enemies are dead or buddy is outside the lab
if ped_structure_are_all_enemies_dead(wave_3_enemy)
ambient_enemy_status[i] = run_away
endif
break
endswitch
break
case combat_player
// If last wave is dead, proceed to run away
if ped_structure_are_all_enemies_dead(wave_3_enemy)
set_blocking_of_non_temporary_events(ambient_enemy[i].ped, true)
clear_ped_tasks(ambient_enemy[i].ped)
ambient_enemy_status[i] = run_away
endif
break
case run_away
switch i
case 0
if not is_ped_injured(ambient_enemy[1].ped)
if is_vehicle_driveable(ambient_enemy_vehicle[0].veh)
if ped_structure_are_all_enemies_dead(wave_3_enemy)
if is_ped_sitting_in_vehicle(ambient_enemy[1].ped, ambient_enemy_vehicle[0].veh)
//if is_ped_in_vehicle(ambient_enemy[1].ped, ambient_enemy_vehicle[0].veh)
open_sequence_task(seq)
TASK_VEHICLE_MISSION_COORS_TARGET(null, ambient_enemy_vehicle[0].veh, <<1740.78235, 3746.83301, 33.88214>>, mission_goto, 22.00, drivingmode_avoidcars, -1, -1)
close_sequence_task(seq)
task_perform_sequence(ambient_enemy[i].ped, seq)
clear_sequence_task(seq)
ambient_enemy_status[i] = do_nothing
endif
endif
else
task_smart_flee_ped(ambient_enemy[i].ped, player_ped_id(), 200.00, -1)
ambient_enemy_status[i] = do_nothing
endif
else
if is_vehicle_driveable(ambient_enemy_vehicle[0].veh)
open_sequence_task(seq)
TASK_VEHICLE_MISSION_COORS_TARGET(null, ambient_enemy_vehicle[0].veh, <<1740.78235, 3746.83301, 33.88214>>, mission_goto, 22.00, drivingmode_avoidcars, -1, -1)
close_sequence_task(seq)
task_perform_sequence(ambient_enemy[i].ped, seq)
clear_sequence_task(seq)
ambient_enemy_status[i] = do_nothing
else
task_smart_flee_ped(ambient_enemy[i].ped, player_ped_id(), 200.00, -1)
ambient_enemy_status[i] = do_nothing
endif
endif
break
case 1
if not is_ped_injured(ambient_enemy[0].ped)
if is_vehicle_driveable(ambient_enemy_vehicle[0].veh)
if not is_ped_sitting_in_vehicle(ambient_enemy[1].ped, ambient_enemy_vehicle[0].veh)
if has_ped_task_finished_2(ambient_enemy[i].ped, script_task_perform_sequence)
set_blocking_of_non_temporary_events(ambient_enemy[i].ped, true)
clear_ped_tasks(ambient_enemy[i].ped)
open_sequence_task(seq)
task_enter_vehicle(null, ambient_enemy_vehicle[0].veh, -1, vs_front_right)
close_sequence_task(seq)
task_perform_sequence(ambient_enemy[i].ped, seq)
clear_sequence_task(seq)
endif
endif
else
task_smart_flee_ped(ambient_enemy[i].ped, player_ped_id(), 200.00, -1)
ambient_enemy_status[i] = do_nothing
endif
else
task_smart_flee_ped(ambient_enemy[i].ped, player_ped_id(), 200.00, -1)
ambient_enemy_status[i] = do_nothing
endif
break
case 2
if not is_ped_injured(ambient_enemy[3].ped)
if is_vehicle_driveable(ambient_enemy_vehicle[1].veh)
if ped_structure_are_all_enemies_dead(wave_3_enemy)
AND is_ped_sitting_in_vehicle(ambient_enemy[3].ped, ambient_enemy_vehicle[1].veh)
open_sequence_task(seq)
TASK_VEHICLE_MISSION_COORS_TARGET(null, ambient_enemy_vehicle[1].veh, <<1741.78235, 3745.83301, 33.88214>>, mission_goto, 22.00, drivingmode_avoidcars, -1, -1)
close_sequence_task(seq)
task_perform_sequence(ambient_enemy[i].ped, seq)
clear_sequence_task(seq)
ambient_enemy_status[i] = do_nothing
endif
else
task_smart_flee_ped(ambient_enemy[i].ped, player_ped_id(), 200.00, -1)
ambient_enemy_status[i] = do_nothing
endif
else
if is_vehicle_driveable(ambient_enemy_vehicle[1].veh)
open_sequence_task(seq)
TASK_VEHICLE_MISSION_COORS_TARGET(null, ambient_enemy_vehicle[1].veh, <<1741.78235, 3745.83301, 33.88214>>, mission_goto, 22.00, drivingmode_avoidcars, -1, -1)
close_sequence_task(seq)
task_perform_sequence(ambient_enemy[i].ped, seq)
clear_sequence_task(seq)
else
task_smart_flee_ped(ambient_enemy[i].ped, player_ped_id(), 200.00, -1)
endif
ambient_enemy_status[i] = do_nothing
endif
break
case 3
if not is_ped_injured(ambient_enemy[2].ped)
if is_vehicle_driveable(ambient_enemy_vehicle[1].veh)
if not is_ped_sitting_in_vehicle(ambient_enemy[3].ped, ambient_enemy_vehicle[1].veh)
if has_ped_task_finished_2(ambient_enemy[i].ped, script_task_perform_sequence)
set_blocking_of_non_temporary_events(ambient_enemy[i].ped, true)
clear_ped_tasks(ambient_enemy[i].ped)
open_sequence_task(seq)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
TASK_AIM_GUN_AT_ENTITY(NULL, PLAYER_PED_ID(), 1000)
ENDIF
task_enter_vehicle(null, ambient_enemy_vehicle[1].veh, -1, vs_front_right)
close_sequence_task(seq)
task_perform_sequence(ambient_enemy[i].ped, seq)
clear_sequence_task(seq)
endif
endif
else
task_smart_flee_ped(ambient_enemy[i].ped, player_ped_id(), 200.00, -1)
ambient_enemy_status[i] = do_nothing
endif
else
task_smart_flee_ped(ambient_enemy[i].ped, player_ped_id(), 200.00, -1)
ambient_enemy_status[i] = do_nothing
endif
break
endswitch
break
case do_nothing
break
endswitch
endif
endfor
flash_ambient_enemy_blips(flash_blip_time)
return false
endfunc
func bool obtain_2_remaining_enemies()
//de_activates all wave enemy AI
for i = 0 to count_of(wave_0_enemy) - 1
wave_0_status[i] = do_nothing
endfor
for i = 0 to count_of(wave_2_enemy) - 1
wave_2_status[i] = do_nothing
endfor
for i = 0 to count_of(wave_0_enemy) - 1
if not is_ped_injured(wave_0_enemy[i].ped)
if remaining_enemies = 0
remaining_enemy[0] = wave_0_enemy[i].ped
elif remaining_enemies = 1
remaining_enemy[1] = wave_0_enemy[i].ped
endif
remaining_enemies++
if remaining_enemies >= 2
return true
endif
endif
endfor
for i = 0 to count_of(wave_2_enemy) - 1
if not is_ped_injured(wave_2_enemy[i].ped)
if remaining_enemies = 0
remaining_enemy[0] = wave_2_enemy[i].ped
elif remaining_enemies = 1
remaining_enemy[1] = wave_2_enemy[i].ped
endif
remaining_enemies++
if remaining_enemies >= 2
return true
endif
endif
endfor
return false
endfunc
proc load_uber_data()
SetPieceCarPos[0] = <<1117.2610, 3546.8918, 34.0889>>
SetPieceCarQuatX[0] = -0.0026
SetPieceCarQuatY[0] = 0.0156
SetPieceCarQuatZ[0] = 0.9813
SetPieceCarQuatW[0] = -0.1920
SetPieceCarRecording[0] = 14
SetPieceCarStartime[0] = 0.0000
SetPieceCarRecordingSpeed[0] = 1.0000
SetPieceCarModel[0] = pcj
SetPieceCarPos[1] = <<1113.4513, 3550.6558, 34.0715>>
SetPieceCarQuatX[1] = -0.0072
SetPieceCarQuatY[1] = 0.0138
SetPieceCarQuatZ[1] = 0.9729
SetPieceCarQuatW[1] = -0.2308
SetPieceCarRecording[1] = 15
SetPieceCarStartime[1] = 0.0000
SetPieceCarRecordingSpeed[1] = 1.0000
SetPieceCarModel[1] = pcj
SetPieceCarPos[2] = <<1116.6305, 3553.0454, 34.0862>>
SetPieceCarQuatX[2] = -0.0034
SetPieceCarQuatY[2] = 0.0162
SetPieceCarQuatZ[2] = 0.9675
SetPieceCarQuatW[2] = -0.2525
SetPieceCarRecording[2] = 16
SetPieceCarStartime[2] = 0.0000
SetPieceCarRecordingSpeed[2] = 1.0000
SetPieceCarModel[2] = pcj
endproc
func bool buddy_on_rooftop()
if IS_ENTITY_IN_ANGLED_AREA(buddy.ped, <<1403.115, 3619.935, 37.949>>, <<1408.469, 3605.388, 40.945>>, 6.6)
return true
endif
return false
endfunc
proc player_waypoint_system()
//ADD ASSISTED MOVEMENT WHICH JOHN ADDED INTO GAME WHICH IS TRIGGERED IN THE MAIN CONTROLLER HERE
switch player_waypoint_status
case 0
//USE_WAYPOINT_RECORDING_AS_ASSISTED_MOVEMENT_ROUTE("methlab6", true, 0.9)
//ASSISTED_MOVEMENT_remove_ROUTE("meth3")
player_waypoint_status++
break
case 1
if IS_ENTITY_IN_ANGLED_AREA(player_ped_id(), <<1401.366, 3619.451, 37.947>>, <<1406.805, 3604.510, 39.947>>, 10.900)
ASSISTED_MOVEMENT_remove_ROUTE("meth1")
player_waypoint_status++
endif
break
case 2
//player runs from rooftop downstairs
// if enemy_creation_and_flow_status > 3
// if IS_ENTITY_IN_ANGLED_AREA(<<1401.366, 3619.451, 37.947>>, <<1406.805, 3604.510, 39.947>>, 10.900)
//
// ASSISTED_MOVEMENT_remove_ROUTE("Meth2")
//
// player_waypoint_status++
// endif
// endif
break
case 3
break
case 22
break
endswitch
endproc
proc create_second_wave_of_wave_2_enemies()
if not wave_2_enemy[6].created
SETUP_ENEMY_VEHICLE(wave_2_enemy_vehicle[0])
start_playback_recorded_vehicle(wave_2_enemy_vehicle[0].veh, wave_2_enemy_vehicle[0].recording_number, "lkmethlab")
skip_time_in_playback_recorded_vehicle(wave_2_enemy_vehicle[0].veh, 8000)
setup_enemy_in_vehicle(wave_2_enemy[6], wave_2_enemy_vehicle[0].veh)
set_ped_flee_attributes(wave_2_enemy[6].ped, fa_use_vehicle, true)
setup_enemy_in_vehicle(wave_2_enemy[7], wave_2_enemy_vehicle[0].veh, vs_front_right)
wave_2_enemy[10].created = true
wave_2_enemy[11].created = true
endif
endproc
proc create_third_wave_of_wave_2_enemies()
if not wave_2_enemy[8].created
SETUP_ENEMY_VEHICLE(wave_2_enemy_vehicle[1])
start_playback_recorded_vehicle(wave_2_enemy_vehicle[1].veh, wave_2_enemy_vehicle[1].recording_number, "lkmethlab")
skip_time_in_playback_recorded_vehicle(wave_2_enemy_vehicle[1].veh, 5500)
setup_enemy_in_vehicle(wave_2_enemy[8], wave_2_enemy_vehicle[1].veh)
set_ped_flee_attributes(wave_2_enemy[8].ped, fa_use_vehicle, true)
setup_enemy_in_vehicle(wave_2_enemy[9], wave_2_enemy_vehicle[1].veh, vs_front_right)
endif
endproc
func bool player_grenade_launcher_cutscene_system()
if player_grenade_launcher_cutscene_status != 99
if player_grenade_launcher_cutscene_status > 0
if IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
player_grenade_launcher_cutscene_status = 22
endif
endif
endif
switch player_grenade_launcher_cutscene_status
case 0
if lk_timer(cutscene_trigger_time, 1500)
//if IS_ENTITY_IN_ANGLED_AREA(player_ped_id(), <<1403.115, 3619.935, 37.949>>, <<1408.469, 3605.388, 40.945>>, 6.6)
if IS_ENTITY_IN_ANGLED_AREA(player_ped_id(), <<1401.353, 3619.360, 38.011>>, <<1406.672, 3604.589, 40.511>>, 10.7)
and is_entity_in_angled_area(buddy.ped, <<1401.353, 3619.360, 38.011>>, <<1406.672, 3604.589, 40.511>>, 10.7)
and get_distance_between_coords(get_entity_coords(player_ped_id()), get_entity_coords(buddy.ped)) < 5.0
// @SBA - Don't toss the weapon yet if enemies are there
IF NOT IS_ANY_PED_IN_TRIGGER_BOX(wave_2_enemy, tbBackRoofVolume)
AND NOT IS_ANY_PED_IN_TRIGGER_BOX(wave_2_enemy, tbBackUpstairsRoomVolume)
AND NOT IS_ANY_PED_IN_SPECIFIC_ROOM(wave_2_enemy, (<<1392.2, 3614.1, 39.0>>), "v_39_UpperRm1")
if start_new_cutscene_no_fade(false)
REPLAY_START_EVENT()
REPLAY_RECORD_BACK_FOR_TIME(1.0, 12.0, REPLAY_IMPORTANCE_HIGHEST)
CREATE_CONVERSATION(scripted_speech[0], "methaud", "g_launcher", CONV_PRIORITY_HIGH)
REMOVE_ALL_PROJECTILES_OF_TYPE(WEAPONTYPE_GRENADE)
REMOVE_ALL_PROJECTILES_OF_TYPE(WEAPONTYPE_SMOKEGRENADE)
REMOVE_ALL_PROJECTILES_OF_TYPE(WEAPONTYPE_MOLOTOV)
clear_area(<<1403.115, 3619.935, 37.949>>, 100.00, false)
clear_ped_tasks_immediately(player_ped_id())
// @SBA - ensure player gets 3 rounds
IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), weapontype_grenadelauncher)
SET_GRENADE_LAUNCHER_AMMO()
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), weapontype_grenadelauncher, TRUE)
ELSE
give_weapon_to_ped(player_ped_id(), weapontype_grenadelauncher, kiGrenadeLauncherAmmo, true)
ENDIF
REFILL_AMMO_INSTANTLY(PLAYER_PED_ID())
set_blocking_of_non_temporary_events(buddy.ped, true)
clear_ped_tasks_immediately(buddy.ped)
hide_ped_weapon_for_scripted_cutscene(buddy.ped, true)
//fix for moving the players truck infront of the door @SBA - may need this for skip too?
if is_vehicle_driveable(trevors_truck.veh)
set_entity_coords(trevors_truck.veh, <<1409.9990, 3600.4973, 33.8676>>, false)
set_entity_heading(trevors_truck.veh, 108.7487)
set_vehicle_doors_locked(trevors_truck.veh, vehiclelock_locked)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(trevors_truck.veh, false)
ELIF DOES_ENTITY_EXIST(trevors_truck.veh)
set_entity_coords(trevors_truck.veh, <<1409.9990, 3600.4973, 33.8676>>, false)
set_entity_heading(trevors_truck.veh, 108.7487)
//delete_vehicle(trevors_truck.veh)
endif
// define cameras
camera_a = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", TRUE)
if get_cam_view_mode_for_context(cam_view_mode_context_on_foot) = cam_view_mode_first_person
camera_b = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<1407.336914,3612.038818,39.557838>>,<<-17.864130,-1.011106,-82.419159>>, 44.023628)
else
camera_b = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", (<<1407.0337, 3612.1533, 39.8239>>), (<<-19.0003, -0.0000, -72.7912>>), 50.0)
endif
/* START SYNCHRONIZED SCENE */
cutscene_pos = <<1408.814, 3611.670, 38.000>>
cutscene_rot = <<0.000, 0.000, 29.000>> //22
cutscene_index = CREATE_SYNCHRONIZED_SCENE(cutscene_pos, cutscene_rot)
TASK_SYNCHRONIZED_SCENE(buddy.ped, cutscene_index, "misschinese1", "throwgrenl_cook", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
TASK_SYNCHRONIZED_SCENE(player_ped_id(), cutscene_index, "misschinese1", "throwgrenl_player", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
PLAY_SYNCHRONIZED_CAM_ANIM(camera_a, cutscene_index, "throwGrenL_CAM", "misschinese1")
RENDER_SCRIPT_CAMS(TRUE, FALSE)
set_synchronized_scene_phase(cutscene_index, 0.186) //0.359
// @SBA - remove the pickup on the roof
IF DOES_PICKUP_EXIST(puiGrenadeLauncher)
REMOVE_PICKUP(puiGrenadeLauncher)
ENDIF
trigger_music_event("CHN1_G_LAUNCHER")
allow_buddy_ai_system = false //turns off buddy ai system
grenade_launcher_cutscene_playing = true
g_replay.iReplayInt[PLAYER_RECEIVED_GRENADE_LAUNCHER] = HAS_GOT_GLAUNCHER
// If coming from replay
IF NOT IS_SCREEN_FADED_IN()
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME_SHORT)
ENDIF
ENDIF
player_grenade_launcher_cutscene_status++
endif
ELSE
// @SBA - restart short delay so there's a pause after upstairs enemies have been cleared out
cutscene_trigger_time = get_game_timer()
ENDIF
else
if not has_label_been_triggered("chin_roof_0")
if not is_any_text_being_displayed(locates_data)
if create_conversation(scripted_speech[0], "methaud", "chin_roof_0", conv_priority_medium)
set_label_as_triggered("chin_roof_0", true)
SET_LABEL_AS_TRIGGERED("METH_GOD_18G", FALSE)
endif
endif
else
if not has_label_been_triggered("METH_GOD_18G")
if not is_any_text_being_displayed(locates_data)
print_now("METH_GOD_18G", default_god_text_time, 1)
set_label_as_triggered("METH_GOD_18G", true)
endif
endif
endif
endif
endif
break
// @SBA - adding this case to pull the chef out early
CASE 1
// @SBA - once Chef has tossed the weapon, have him do something other than stand there
IF (GET_SYNCHRONIZED_SCENE_PHASE(cutscene_index) >= 0.65)
clear_ped_tasks(buddy.ped)
for i = 0 to count_of(wave_2_enemy) - 1
if not is_ped_injured(wave_2_enemy[i].ped)
task_combat_ped(buddy.ped, wave_2_enemy[i].ped)
i = total_number_of_wave_2_enemies
endif
endfor
wave_2_buddy_ai_system_status = 2
allow_buddy_ai_system = true
//TASK_SEEK_COVER_TO_COVER_POINT(buddy.ped, buddy_cover_point_data[2].cover_point, (<<1423.0, 3624.8, 35.9>>), -1)
player_grenade_launcher_cutscene_status++
ENDIF
BREAK
case 2
//for first person camera we need to cut out of the animated camera early before it moves backwards as it gives a 3rd person feel
if not grenade_launcher_first_person_cam_active
if (get_cam_view_mode_for_context(cam_view_mode_context_on_foot) = cam_view_mode_first_person)
IF (GET_SYNCHRONIZED_SCENE_PHASE(cutscene_index) >= 0.68)
vector cam_a_pos
vector cam_a_rot
float cam_a_fov
cam_a_pos = get_cam_coord(camera_a)
cam_a_rot = get_cam_rot(camera_a)
cam_a_fov = get_cam_fov(camera_a)
destroy_cam(camera_a)
camera_a = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", cam_a_pos, cam_a_rot, cam_a_fov, TRUE)
set_cam_active_with_interp(camera_b, camera_a, 1300, graph_type_linear)
grenade_launcher_first_person_cam_active = true
endif
endif
endif
if (GET_SYNCHRONIZED_SCENE_PHASE(cutscene_index) >= 0.99)
REPLAY_STOP_EVENT()
if (get_cam_view_mode_for_context(cam_view_mode_context_on_foot) != cam_view_mode_first_person)
IF DOES_CAM_EXIST(camera_b)
AND DOES_CAM_EXIST(camera_a)
CPRINTLN(DEBUG_MISSION, "ACTIVATING camera_b")
SET_CAM_ACTIVE_WITH_INTERP(camera_b, camera_a, 100)
SET_CAM_ACTIVE(camera_a, FALSE)
ENDIF
endif
create_second_wave_of_wave_2_enemies()
//clear_ped_tasks_immediately(player_ped_id())
//SET_ENTITY_COORDS(player_ped_id(), vTrevorBackDeckStartPos) //<<1409.2817, 3611.7595, 38.0056>>
//SET_ENTITY_HEADING(player_ped_id(), 325.6850)
task_put_ped_directly_into_cover(player_ped_id(), vTrevorBackDeckStartPos, -1, true, 0.5, true, true, players_cover_point_2)
force_ped_ai_and_animation_update(player_ped_id())
hide_ped_weapon_for_scripted_cutscene(buddy.ped, false)
set_blocking_of_non_temporary_events(buddy.ped, false)
// @SBA - recycle this
SET_LABEL_AS_TRIGGERED("METH_GOD_18", FALSE)
//create_conversation(scripted_speech[0], "methaud", "THANKS", conv_priority_medium)
player_grenade_launcher_cutscene_status ++
endif
break
CASE 3
// handler for next vehicle full o' bad guys
create_third_wave_of_wave_2_enemies()
proofing_time = get_game_timer()
grenade_launcher_cutscene_playing = false
player_grenade_launcher_cutscene_status = 99
// stop and destroy cam, reset stuff
if (get_cam_view_mode_for_context(cam_view_mode_context_on_foot) = cam_view_mode_first_person)
end_cutscene_no_fade(false, TRUE, -91.8, -19.0, 500, false)
else
end_cutscene_no_fade(false, TRUE, -91.8, -19.0, 750, false)
endif
return true
BREAK
case 22
if not is_screen_faded_out()
if ((not is_screen_fading_in()) and (not is_screen_fading_out()))
do_screen_fade_out(500)
endif
else
create_second_wave_of_wave_2_enemies()
create_third_wave_of_wave_2_enemies()
clear_ped_tasks_immediately(player_ped_id())
SET_ENTITY_COORDS(player_ped_id(), <<1408.9497, 3612.3738, 38.0057>>)//<<1408.0160, 3612.2808, 38.0056>>)
SET_ENTITY_HEADING(player_ped_id(), 293.1200)
//give_weapon_to_ped(player_ped_id(), weapontype_grenadelauncher, 22, true)
//set_current_ped_weapon(player_ped_id(), weapontype_grenadelauncher, true)
//task_seek_cover_to_coords(player_ped_id(), <<1408.0160, 3612.2808, 38.0056>>, <<1419.32, 3617.24, 39.92>>, 3000)
task_put_ped_directly_into_cover(player_ped_id(), <<1408.0160, 3612.2808, 38.0056>>, -1)
force_ped_ai_and_animation_update(player_ped_id(), true)
clear_ped_tasks(buddy.ped)
SET_ENTITY_COORDS(buddy.ped, <<1406.4009, 3615.2783, 38.0056>>)
SET_ENTITY_HEADING(buddy.ped, 292.8793)
hide_ped_weapon_for_scripted_cutscene(buddy.ped, false)
set_blocking_of_non_temporary_events(buddy.ped, false)
for i = 0 to count_of(wave_2_enemy) - 1
if not is_ped_injured(wave_2_enemy[i].ped)
task_combat_ped(buddy.ped, wave_2_enemy[i].ped)
i = total_number_of_wave_2_enemies
endif
endfor
allow_buddy_ai_system = true
// @SBA - recycle this
SET_LABEL_AS_TRIGGERED("METH_GOD_18", FALSE)
// stop cam, reset stuff
end_cutscene(false)
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ADD_NON_CRITICAL_STANDARD_CONVERSATION_TO_BUFFER(scripted_speech[0], "methaud", "THANKS", CONV_PRIORITY_MEDIUM)
grenade_launcher_cutscene_playing = false
player_grenade_launcher_cutscene_status = 99
end_cutscene_no_fade(false, false, 0, 0, 3000, false)
return true
endif
break
case 99
break
endswitch
return false
endfunc
proc uber_vehicle_system()
switch uber_vehicle_status
case 0
update_uber_playback(wave_1_uber_vehicle, 1.0)
break
case 1
break
case 2
break
endswitch
endproc
proc reset_wave_0_vehicles_for_ram_gates_cutscene(bool allow_vehicle_warp = false)
//clears enemy cars off the vehicle recording line
float recording_time
for i = 0 to 1
if is_vehicle_driveable(wave_0_enemy_vehicle[i].veh)
and is_playback_going_on_for_vehicle(wave_0_enemy_vehicle[i].veh)
skip_to_end_and_stop_playback_recorded_vehicle(wave_0_enemy_vehicle[i].veh)
else
if not is_entity_dead(wave_0_enemy_vehicle[i].veh)
if is_playback_going_on_for_vehicle(wave_0_enemy_vehicle[i].veh)
stop_playback_recorded_vehicle(wave_0_enemy_vehicle[i].veh)
endif
endif
//commenting out as this is causing vehicles to visibly warp. This cutscene has been made ingame.
if allow_vehicle_warp
if does_entity_exist(wave_0_enemy_vehicle[i].veh)
wave_0_enemy_vehicle[i].pos = get_entity_coords(wave_0_enemy_vehicle[i].veh, false)
if is_point_in_angled_area(wave_0_enemy_vehicle[i].pos, <<1376.030, 3597.157, 33.900>>, <<1383.560, 3599.545, 36.900>>, 27.700)
or is_point_in_angled_area(wave_0_enemy_vehicle[i].pos, <<1370.034, 3570.068, 33.969>>, <<1365.436, 3582.441, 34.969>>, 31.5)
recording_time = (get_total_duration_of_vehicle_recording(wave_0_enemy_vehicle[i].recording_number, "lkmethlab") - 50)
set_entity_coords(wave_0_enemy_vehicle[i].veh, get_position_of_vehicle_recording_at_time(wave_0_enemy_vehicle[i].recording_number, recording_time, "lkmethlab"), false)
set_entity_rotation(wave_0_enemy_vehicle[i].veh, get_rotation_of_vehicle_recording_at_time(wave_0_enemy_vehicle[i].recording_number, recording_time, "lkmethlab"), euler_yxz, false)
endif
endif
endif
endif
endfor
for i = 0 to count_of(parked_cars) - 1
if does_entity_exist(parked_cars[i])
if is_entity_in_angled_area(parked_cars[i], <<1376.030, 3597.157, 33.900>>, <<1383.560, 3599.545, 36.900>>, 27.700, false, false)
or is_entity_in_angled_area(parked_cars[i], <<1370.034, 3570.068, 33.969>>, <<1365.436, 3582.441, 34.969>>, 31.5, false, false)
delete_vehicle(parked_cars[i])
endif
endif
endfor
endproc
func bool ramming_gates_cutscene()
FLOAT fRecTime
if does_entity_exist(wave_0_enemy_vehicle[2].veh)
if is_vehicle_driveable(wave_0_enemy_vehicle[2].veh)
if is_playback_going_on_for_vehicle(wave_0_enemy_vehicle[2].veh)
fRecTime = (get_time_position_in_recording(wave_0_enemy_vehicle[2].veh))
CPRINTLN(DEBUG_MISSION, "rec time = ", fRecTime)
endif
ELSE
CPRINTLN(DEBUG_MISSION, "Ramming Truck has been disabled: Bailing and cleaning up.")
ramming_gates_cutscene_status = 99
endif
endif
switch ramming_gates_cutscene_status
case 0
//kill_any_conversation()//forces any dialogue to clean up specific or shooting dialogue.
// @SBA - have this start quicker
if lk_timer(cutscene_trigger_time, 250)
and prepare_music_event("CHN1_CAR_ARRIVES")
//and not is_any_text_being_displayed(locates_data)
// @SBA - trying this without the cutscene
clear_area_of_vehicles(<<1402.2213, 3597.3352, 33.8866>>, 1000.00)
reset_wave_0_vehicles_for_ram_gates_cutscene()
if is_vehicle_driveable(trevors_truck.veh)
set_entity_coords(trevors_truck.veh, <<1409.9990, 3600.4973, 33.8676>>)
set_entity_heading(trevors_truck.veh, 108.7487)
set_vehicle_on_ground_properly(trevors_truck.veh)
endif
set_state_of_closest_door_of_type(prop_arm_gate_l, <<1372.36, 3609.02, 35.62>>, true, 0.0)
set_state_of_closest_door_of_type(prop_arm_gate_l, <<1377.97, 3611.06, 35.62>>, true, 0.0)
set_state_of_closest_door_of_type(prop_arm_gate_l, <<1372.36, 3609.02, 35.62>>, false, 0.0)
set_state_of_closest_door_of_type(prop_arm_gate_l, <<1377.97, 3611.06, 35.62>>, false, 0.0)
SETUP_ENEMY_VEHICLE(wave_0_enemy_vehicle[2])
set_entity_proofs(wave_0_enemy_vehicle[2].veh, true, true, true, true, true)
start_playback_recorded_vehicle(wave_0_enemy_vehicle[2].veh, wave_0_enemy_vehicle[2].recording_number, "lkmethlab")
// @SBA - setting the recording skip to be earlier, so it doesn't pop in so close
// OLD VALUE = 13500
skip_time_in_playback_recorded_vehicle(wave_0_enemy_vehicle[2].veh, 8000)
force_playback_recorded_vehicle_update(wave_0_enemy_vehicle[2].veh)
setup_enemy_in_vehicle(wave_0_inside_enemy[0], wave_0_enemy_vehicle[2].veh)
setup_enemy_in_vehicle(wave_0_inside_enemy[1], wave_0_enemy_vehicle[2].veh, vs_front_right)
setup_enemy_in_vehicle(wave_0_inside_enemy[2], wave_0_enemy_vehicle[2].veh, vs_back_left)
setup_enemy_in_vehicle(wave_0_inside_enemy[3], wave_0_enemy_vehicle[2].veh, vs_back_right)
set_entity_proofs(wave_0_inside_enemy[0].ped, true, true, true, true, true)
set_entity_proofs(wave_0_inside_enemy[1].ped, true, true, true, true, true)
set_entity_proofs(wave_0_inside_enemy[2].ped, true, true, true, true, true)
set_entity_proofs(wave_0_inside_enemy[3].ped, true, true, true, true, true)
// @SBA - add this truck guy for dialogue, ensure lable is cleared
ADD_PED_FOR_DIALOGUE(scripted_speech[0], 8, wave_0_inside_enemy[1].ped, "VAGOS")
SET_LABEL_AS_TRIGGERED("chin_RAM", FALSE)
for i = 0 to count_of(wave_0_inside_enemy) - 1
SET_COMBAT_FLOAT(wave_0_inside_enemy[i].ped, CCF_WEAPON_ACCURACY, 0.10)
endfor
TASK_DRIVE_BY(wave_0_inside_enemy[1].ped, player_ped_id(), null, <<0.0, 0.0, 2.0>>, 300.00, 100)
//setup_players_weapon_for_cutscene(weapontype_carbinerifle, 200, players_ammo)
//locate check for forecourt of meth lab
// @SBA - removing cameras, trying this without them
// set_cam_active(camera_a, true)
// render_script_cams(true, false)
// set_cam_active_with_interp(camera_b, camera_a, 3000, graph_type_accel)
if is_audio_scene_active("CHI_1_SHOOTOUT_01")
stop_audio_scene("CHI_1_SHOOTOUT_01")
endif
trigger_music_event("CHN1_CAR_ARRIVES")
start_audio_scene("CHI_1_TRUCK_ARRIVES")
ADD_ENTITY_TO_AUDIO_MIX_GROUP(wave_0_enemy_vehicle[2].veh, "CHI_1_TRUCK_01")
ramming_gates_cutscene_status++
// endif
endif
break
case 1
// @SBA - making this one variable
if is_vehicle_driveable(wave_0_enemy_vehicle[2].veh)
if is_playback_going_on_for_vehicle(wave_0_enemy_vehicle[2].veh)
if fRecTime > 15700
reset_wave_0_vehicles_for_ram_gates_cutscene()
original_time = get_game_timer()
ramming_gates_cutscene_status++
//@SBA - Have a guy in the truck say a dialogue line before they hit the gates
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("chin_RAM")
// We don't want this to trigger too late
IF fRecTime > 13000
AND fRecTime < 13500
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(locates_data)
IF CREATE_CONVERSATION(scripted_speech[0], "methaud", "chin_RAM", conv_priority_medium)
//PRINTLN("*** Saying truck ramming dialogue now.")
SET_LABEL_AS_TRIGGERED("chin_RAM", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
endif
endif
break
case 2
if is_vehicle_driveable(wave_0_enemy_vehicle[2].veh)
if is_playback_going_on_for_vehicle(wave_0_enemy_vehicle[2].veh)
if (get_time_position_in_recording(wave_0_enemy_vehicle[2].veh) > 17700)
for i = 0 to count_of(wave_0_inside_enemy) - 1
if not is_ped_injured(wave_0_inside_enemy[i].ped)
set_entity_proofs(wave_0_inside_enemy[i].ped, false, false, false, false, false)
endif
endfor
if is_vehicle_driveable(wave_0_enemy_vehicle[2].veh)
set_entity_proofs(wave_0_enemy_vehicle[2].veh, false, false, false, false, false)
endif
if not is_ped_injured(wave_0_inside_enemy[1].ped)
clear_ped_tasks(wave_0_inside_enemy[1].ped)
endif
if is_audio_scene_active("CHI_1_TRUCK_ARRIVES")
stop_audio_scene("CHI_1_TRUCK_ARRIVES")
endif
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(wave_0_enemy_vehicle[2].veh)
original_time = get_game_timer()
ram_cutscene_finished = true
return true
endif
endif
endif
break
case 22
if not is_screen_faded_out()
if ((not is_screen_fading_in()) and (not is_screen_fading_out()))
do_screen_fade_out(500)
endif
else
if is_vehicle_driveable(wave_0_enemy_vehicle[2].veh)
if is_playback_going_on_for_vehicle(wave_0_enemy_vehicle[2].veh)
skip_to_end_and_stop_playback_recorded_vehicle(wave_0_enemy_vehicle[2].veh)
endif
set_entity_proofs(wave_0_enemy_vehicle[2].veh, false, false, false, false, false)
endif
for i = 0 to count_of(wave_0_inside_enemy) - 1
if not is_ped_injured(wave_0_inside_enemy[i].ped)
set_entity_proofs(wave_0_inside_enemy[i].ped, false, false, false, false, false)
endif
endfor
if not is_ped_injured(wave_0_inside_enemy[1].ped)
clear_ped_tasks(wave_0_inside_enemy[1].ped)
endif
if is_audio_scene_active("CHI_1_TRUCK_ARRIVES")
stop_audio_scene("CHI_1_TRUCK_ARRIVES")
endif
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(wave_0_enemy_vehicle[2].veh)
original_time = get_game_timer()
if is_ped_in_specific_room(player_ped_id(), <<1391.2273, 3601.6284, 38.5>>, "V_39_UpperRm3")
end_cutscene(false, -12.0, 0, false)
else
end_cutscene(false, -12.0, 0, false)
endif
return true
endif
break
// @SBA - Clean up if the truck got disbaled somehow
CASE 99
for i = 0 to count_of(wave_0_inside_enemy) - 1
if not is_ped_injured(wave_0_inside_enemy[i].ped)
set_entity_proofs(wave_0_inside_enemy[i].ped, false, false, false, false, false)
endif
endfor
if is_vehicle_driveable(wave_0_enemy_vehicle[2].veh)
set_entity_proofs(wave_0_enemy_vehicle[2].veh, false, false, false, false, false)
endif
if not is_ped_injured(wave_0_inside_enemy[1].ped)
clear_ped_tasks(wave_0_inside_enemy[1].ped)
endif
if is_audio_scene_active("CHI_1_TRUCK_ARRIVES")
stop_audio_scene("CHI_1_TRUCK_ARRIVES")
endif
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(wave_0_enemy_vehicle[2].veh)
original_time = get_game_timer()
ram_cutscene_finished = true
return true
BREAK
endswitch
return false
endfunc
func bool wave_0_master_flow_system()
// @SBA = loading for next waves
IF NOT bLoadedLastShootoutStuff
request_shootout_assets(FALSE)
IF is_shootout_assets_loaded()
bLoadedLastShootoutStuff = TRUE
ENDIF
ENDIF
switch wave_0_master_flow_system_status
case 0
set_state_of_closest_door_of_type(prop_arm_gate_l, <<1372.36, 3609.02, 35.62>>, true, 0.0)
set_state_of_closest_door_of_type(prop_arm_gate_l, <<1377.97, 3611.06, 35.62>>, true, 0.0)
set_state_of_closest_door_of_type(prop_arm_gate_l, <<1372.36, 3609.02, 35.62>>, false, 0.0)
set_state_of_closest_door_of_type(prop_arm_gate_l, <<1377.97, 3611.06, 35.62>>, false, 0.0)
// @SBA - opening outer doors to help player follow Chef
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(v_ilev_ss_doorext, vBackDoorToRoof, TRUE, 1.0)
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(v_ilev_ss_doorext, vDoorToBackStairs, TRUE, -1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ss_door04, vInteriorDoorStore, TRUE, 0, 0, -1.0)
// @SBA - try to get the rushers into better positions
ADD_TACTICAL_NAV_MESH_POINT(<<1398.7, 3603.9, 37.95>>)
ADD_TACTICAL_NAV_MESH_POINT(<<1394.5, 3603.5, 37.95>>)
RESET_CHEF_WARNINGS_FOR_NEXT_WAVE()
// there's gonna be a shootout
SET_INSTANCE_PRIORITY_HINT( INSTANCE_HINT_SHOOTING )
wave_0_master_flow_system_status++
break
case 1
// clean up blend cam
IF DOES_CAM_EXIST(camera_a)
IF IS_GAMEPLAY_CAM_RENDERING()
SET_CAM_ACTIVE(camera_a, FALSE)
DESTROY_CAM(camera_a)
ENDIF
ENDIF
// fade in if needed (replay)
IF NOT IS_SCREEN_FADED_IN()
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
ENDIF
// @SBA - let the ram cutscene happen if there are 2 or fewer guys left from first group
IF ped_structure_get_total_number_of_enemies_dead(wave_0_enemy) >= ABSI( 2 - COUNT_OF(wave_0_enemy))
REPLAY_RECORD_BACK_FOR_TIME(3.0)
wave_0_master_flow_system_status++
cutscene_trigger_time = get_game_timer()
ENDIF
// if ped_structure_are_all_enemies_dead(wave_0_enemy)
// wave_0_master_flow_system_status++
// cutscene_trigger_time = get_game_timer()
// endif
break
case 2
// @SBA - now that there are two guys left when this wave "ends" and the truck comes,
// I'm switching out Trevor's dialogue to the lines written for B*846594, which contextually
// now make more sense. OLD Label = "chin_cut_0"
if create_conversation(scripted_speech[0], "methaud", "chin_LEFT", conv_priority_medium)
wave_0_master_flow_system_status++
endif
break
case 3
if ramming_gates_cutscene()
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(2, "Wave 0 outside enemies")
CLEAR_TACTICAL_NAV_MESH_POINTS()
wave_0_master_flow_system_status++
endif
break
case 4
if is_ped_in_angled_area_lk(wave_0_inside_enemy[0].ped, <<1383.042, 3613.064, 33.900>>, <<1378.663, 3625.411, 44.900>>, 22.6)
or is_ped_in_angled_area_lk(wave_0_inside_enemy[1].ped, <<1383.042, 3613.064, 33.900>>, <<1378.663, 3625.411, 44.900>>, 22.6)
or is_vehicle_in_angled_area_lk(wave_0_enemy_vehicle[2].veh, <<1383.042, 3613.064, 33.900>>, <<1378.663, 3625.411, 44.900>>, 22.6)
OR NOT IS_VEHICLE_DRIVEABLE(wave_0_enemy_vehicle[2].veh) // @SBA - skip through if vehicle got disabled
wave_0_dialogue_system_status = 2
wave_0_buddy_ai_system_status = 1
wave_0_assisted_nodes_system_status = 1
// piggy back in here
SET_INSTANCE_PRIORITY_HINT( INSTANCE_HINT_SHOOTING )
wave_0_master_flow_system_status++
endif
break
case 5
bool wave_0_enemies_dead
bool wave_0_inside_enemies_dead
wave_0_enemies_dead = ped_structure_are_all_enemies_dead(wave_0_enemy)
wave_0_inside_enemies_dead = ped_structure_are_all_enemies_dead(wave_0_inside_enemy)
if wave_0_enemies_dead
and wave_0_inside_enemies_dead
if is_audio_scene_active("CHI_1_SHOOTOUT_02")
stop_audio_scene("CHI_1_SHOOTOUT_02")
endif
START_AUDIO_SCENE("CHI_1_GET_TO_SHOOTOUT_03")
//stops any text or dialogue once all the enemies are dead.
//clear_prints()
wave_0_dialogue_system_status = 22
original_time = get_game_timer()
wave_0_master_flow_system_status++
endif
break
case 6
//if get_distance_between_coords(get_entity_coords(player_ped_id()), get_entity_coords(buddy.ped)) < 20
if create_conversation(scripted_speech[0], "methaud", "buddy_wv2_0", conv_priority_medium)
original_time = get_game_timer()
wave_0_master_flow_system_status++
endif
// else
// wave_2_dialogue_system_status++
// endif
break
case 7
if (not is_any_text_being_displayed(locates_data) and get_distance_between_coords(get_entity_coords(player_ped_id()), get_entity_coords(buddy.ped)) < 15 and is_ped_facing_ped(player_ped_id(), buddy.ped, 50.00))
or lk_timer(original_time, 5000)
or is_player_infront_of_door() //stops player running to the front of lab and seeing enemies spawn
return true
endif
break
// For replay
CASE 50
// delay fade in until player is actually in action mode
IF lk_timer(original_time, 750)
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME_SHORT)
wave_0_master_flow_system_status = 5
wave_0_dialogue_system_status = 2
ENDIF
BREAK
endswitch
return false
endfunc
func bool are_wave_0_enemies_coming_up_stairs()
for i = 0 to count_of(wave_0_inside_enemy) - 1
if not is_ped_injured(wave_0_inside_enemy[i].ped)
if IS_ENTITY_IN_ANGLED_AREA(wave_0_inside_enemy[i].ped, <<1390.113, 3615.582, 37.931>>, <<1386.932, 3624.107, 41.431>>, 12.20)
or IS_ENTITY_IN_ANGLED_AREA(wave_0_inside_enemy[i].ped, <<1388.321, 3622.040, 34.061>>, <<1389.153, 3619.789, 41.061>>, 9.10)
return true
endif
endif
endfor
return false
endfunc
// Plays the Chef's outburst line when ready, then resets to do it again
PROC PLAY_AND_RESET_OUTBURST()
IF TIMER_DO_ONCE_WHEN_READY(tmrChefOutburstTimer, fOutburstTime)
IF PLAY_CHEF_CONVERSATION(sChefOutburst)
CPRINTLN(DEBUG_MISSION,"PLAY_AND_RESET_OUTBURST: Playing Chef Outburst.")
ENDIF
fOutburstTime = GET_RANDOM_FLOAT_IN_RANGE(8.000, 12.000)
START_TIMER_NOW(tmrChefOutburstTimer)
ENDIF
ENDPROC
// @SBA - handles playing Chef's dialogue about enemies getting inside for wave 0
PROC HANDLE_CHEF_INFILTRATION_WARNINGS_WAVE_0()
BOOL bPlayDialogue = FALSE
// If an enemy is downstairs, play warning
IF NOT HAS_LABEL_BEEN_TRIGGERED(sChefWarn1)
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(LOCATES_DATA)
IF IS_ANY_PED_IN_SPECIFIC_ROOM(wave_0_enemy, (<<1393.0, 3612.2, 35.0>>), "v_39_StairsRm")
OR IS_ANY_PED_IN_SPECIFIC_ROOM(wave_0_enemy, (<<1392.3, 3602.9, 35.0>>), "v_39_ShopRm")
// play Chef's dialogue, but only once (skip if too player's too far)
IF PLAY_CHEF_CONVERSATION(sChefWarn1)
CPRINTLN(DEBUG_MISSION,"HANDLE_CHEF_INFILTRATION_WARNINGS_WAVE_0: Playing Chef WARNING 1.")
ENDIF
SET_LABEL_AS_TRIGGERED(sChefWarn1, TRUE)
ENDIF
ENDIF
ENDIF
// Check if enemy is upstairs
IF wave_0_master_flow_system_status < 5
IF IS_ANY_PED_IN_SPECIFIC_ROOM(wave_0_enemy, (<<1391.1970, 3601.0510, 37.9418>>), "v_39_UpperRm3")
OR IS_ANY_PED_IN_SPECIFIC_ROOM(wave_0_enemy, (<<1397.1, 3608.4, 38.5>>), "v_39_UpperRm2")
OR IS_ANY_PED_IN_SPECIFIC_ROOM(wave_0_enemy, (<<1392.2, 3614.1, 39.0>>), "v_39_UpperRm1")
bPlayDialogue = TRUE
ENDIF
ENDIF
// If clear to play the next warning, do it
IF NOT HAS_LABEL_BEEN_TRIGGERED(sChefWarn2)
IF bPlayDialogue
// play Chef's dialogue if player is close enough
IF PLAY_CHEF_CONVERSATION(sChefWarn2)
CPRINTLN(DEBUG_MISSION,"HANDLE_CHEF_INFILTRATION_WARNINGS_WAVE_0: Playing Chef WARNING 2.")
ENDIF
// Start outburst timer
START_TIMER_NOW(tmrChefOutburstTimer)
fOutburstTime = GET_RANDOM_FLOAT_IN_RANGE(8.000, 12.000)
SET_LABEL_AS_TRIGGERED(sChefWarn2, TRUE)
ENDIF
ENDIF
// Enemies at the back stairs
IF wave_0_master_flow_system_status = 5
// Warning when enemies head to back stairs
IF NOT HAS_LABEL_BEEN_TRIGGERED(sChefBackStairsWarn)
// Wait for any other enemies to clear the stairs
IF NOT IS_ANY_PED_IN_TRIGGER_BOX(wave_0_inside_enemy, tbFullBackStairsVolume)
AND NOT IS_ANY_PED_IN_TRIGGER_BOX(wave_0_enemy, tbFullBackStairsVolume)
IF IS_ANY_PED_IN_TRIGGER_BOX(wave_0_inside_enemy, tbBackStairsAlleyVolume)
// play warning if player is close enough
IF PLAY_CHEF_CONVERSATION(sChefBackStairsWarn)
CPRINTLN(DEBUG_MISSION,"HANDLE_CHEF_INFILTRATION_WARNINGS_WAVE_0: Playing Chef BACK STAIRS WARNING.")
ENDIF
// Start outburst timer
START_TIMER_NOW(tmrChefOutburstTimer)
fOutburstTime = GET_RANDOM_FLOAT_IN_RANGE(8.000, 12.000)
SET_LABEL_AS_TRIGGERED(sChefBackStairsWarn, TRUE)
ENDIF
ENDIF
ENDIF
// for back stairs outbursts
IF IS_ANY_PED_IN_TRIGGER_BOX(wave_0_inside_enemy, tbTopBackStairsVolume)
OR IS_ANY_PED_IN_TRIGGER_BOX(wave_0_inside_enemy, tbOnBackStairsVolume)
OR IS_ANY_PED_IN_TRIGGER_BOX(wave_0_enemy, tbTopBackStairsVolume)
OR IS_ANY_PED_IN_TRIGGER_BOX(wave_0_enemy, tbOnBackStairsVolume)
bPlayDialogue = TRUE
ENDIF
ENDIF
// Handle the Chef's outbursts
IF bPlayDialogue
PLAY_AND_RESET_OUTBURST()
// reset the second warning after a timer and if the coast is currently clear
ELIF IS_TIMER_STARTED(tmrChefOutburstTimer)
IF TIMER_DO_ONCE_WHEN_READY(tmrChefOutburstTimer, fOutburstTime)
SET_LABEL_AS_TRIGGERED(sChefWarn2, FALSE)
CANCEL_TIMER(tmrChefOutburstTimer)
ENDIF
ENDIF
ENDPROC
// @SBA - handles playing Chef's dialogue about enemies getting inside for wave 2
PROC HANDLE_CHEF_INFILTRATION_WARNINGS_WAVE_2()
BOOL bPlayDialogue = FALSE
// If an enemy is coming upstairs, play warning
IF NOT HAS_LABEL_BEEN_TRIGGERED(sChefWarn1)
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(LOCATES_DATA)
IF IS_ANY_PED_IN_TRIGGER_BOX(wave_2_enemy, tbBackGateVolume)
OR IS_ANY_PED_IN_TRIGGER_BOX(wave_2_enemy, tbTopBackStairsVolume)
OR IS_ANY_PED_IN_SPECIFIC_ROOM(wave_2_enemy, (<<1392.2, 3614.1, 39.0>>), "v_39_UpperRm1")
// play Chef's dialogue, but only once (if player's close)
IF PLAY_CHEF_CONVERSATION(sChefWarn1)
CPRINTLN(DEBUG_MISSION,"HANDLE_CHEF_INFILTRATION_WARNINGS_WAVE_2: Playing Chef WARNING 1.")
ENDIF
SET_LABEL_AS_TRIGGERED(sChefWarn1, TRUE)
ENDIF
ENDIF
ENDIF
// Check if enemy is upstairs
IF IS_ANY_PED_IN_TRIGGER_BOX(wave_2_enemy, tbBackRoofVolume)
OR IS_ANY_PED_IN_SPECIFIC_ROOM(wave_2_enemy, (<<1397.1, 3608.4, 38.5>>), "v_39_UpperRm2")
bPlayDialogue = TRUE
ENDIF
// If clear to play the next warning, do it
IF NOT HAS_LABEL_BEEN_TRIGGERED(sChefWarn2)
//IF NOT IS_ANY_TEXT_BEING_DISPLAYED(LOCATES_DATA)
IF bPlayDialogue
// play Chef's dialogue if player's close
IF PLAY_CHEF_CONVERSATION(sChefWarn2)
CPRINTLN(DEBUG_MISSION,"HANDLE_CHEF_INFILTRATION_WARNINGS_WAVE_2: Playing Chef WARNING 2.")
ENDIF
// Start outburst timer
START_TIMER_NOW(tmrChefOutburstTimer)
fOutburstTime = GET_RANDOM_FLOAT_IN_RANGE(8.000, 12.000)
SET_LABEL_AS_TRIGGERED(sChefWarn2, TRUE)
ENDIF
//ENDIF
ENDIF
// Handle the Chef's outbursts
IF bPlayDialogue
PLAY_AND_RESET_OUTBURST()
// reset the second warning after a timer and if the coast is currently clear
ELIF IS_TIMER_STARTED(tmrChefOutburstTimer)
IF TIMER_DO_ONCE_WHEN_READY(tmrChefOutburstTimer, fOutburstTime)
SET_LABEL_AS_TRIGGERED(sChefWarn2, FALSE)
CANCEL_TIMER(tmrChefOutburstTimer)
ENDIF
ENDIF
ENDPROC
proc wave_0_dialogue_system()
// @SBA- in case enemies get inside
HANDLE_CHEF_INFILTRATION_WARNINGS_WAVE_0()
switch wave_0_dialogue_system_status
case 0
if create_conversation(scripted_speech[0], "methaud", "buddy_info0", conv_priority_medium)
wave_0_dialogue_system_status++
endif
break
case 1
if not is_scripted_conversation_ongoing()
print_now("METH_GOD_0", default_god_text_time, 1)
wave_0_dialogue_system_status = 22
endif
break
case 2
if create_conversation(scripted_speech[0], "methaud", "ram_gates", conv_priority_medium)
REPLAY_RECORD_BACK_FOR_TIME(4.0, 8.0)
buddy_time = get_game_timer()
wave_0_dialogue_system_status++
endif
break
case 3
if not is_scripted_conversation_ongoing()
AND wave_0_buddy_ai_system_status >= 2 //@SBA - make sure Chef is ready to be followed first
dialogue_time_2 = get_game_timer()
dialogue_time = get_game_timer()
print_now("METH_GOD_1", default_god_text_time, 1) // Follow Chef outside
wave_0_dialogue_system_status++
endif
break
case 4
if lk_timer(dialogue_time_2, 5000)
if not is_any_text_being_displayed(locates_data)
if is_entity_in_angled_area(player_ped_id(), <<1388.600, 3602.066, 37.942>>, <<1396.070, 3604.638, 40.942>>, 7.2)
if create_conversation(scripted_speech[0], "methaud", "HERE", conv_priority_low)
dialogue_time_2 = get_game_timer()
endif
endif
endif
endif
//ensures the "enemies coming from the left" dialogue only plays when the player is walking through the
//correct door to make the dialogue make sense orientation wise.
//area on porch and small area running through door
if IS_ENTITY_IN_ANGLED_AREA(player_ped_id(), <<1390.113, 3615.582, 37.931>>, <<1386.932, 3624.107, 41.431>>, 12.200)
if is_entity_in_angled_area(player_ped_id(), <<1386.186, 3614.861, 37.943>>, <<1389.025, 3615.835, 39.942>>, 1.8)
if not are_wave_0_enemies_coming_up_stairs()
clear_prints()
if create_conversation(scripted_speech[0], "methaud", "chin_to_left", conv_priority_medium)
trigger_music_event("CHN1_FROM_LEFT")
wave_0_dialogue_system_status++
endif
else
wave_0_dialogue_system_status++
endif
else
wave_0_dialogue_system_status++
endif
else
vector player_pos
player_pos = get_entity_coords(player_ped_id())
//some of the conditions for making gang enemies attack.
if lk_timer(original_time, 25000)
or player_pos.z < 37.00
//or is_entity_in_angled_area(player_ped_id(), <<1400.469, 3607.616, 38.006>>, <<1399.769, 3609.490, 40.506>>, 1.2)
wave_0_dialogue_system_status++
endif
endif
break
case 5
if IS_ENTITY_IN_ANGLED_AREA(player_ped_id(), <<1390.113, 3615.582, 37.931>>, <<1386.932, 3624.107, 41.431>>, 12.200)
//if create_conversation(scripted_speech[0], "methaud", "chin_left_0", conv_priority_medium)
if create_conversation(scripted_speech[0], "methaud", "ram_gates_2", conv_priority_medium)
wave_0_dialogue_system_status++
endif
endif
break
case 6
IF NOT IS_SCRIPTED_CONVERSATION_ONGOING()
SPECIAL_ABILITY_CHARGE_SMALL(PLAYER_ID(), TRUE, TRUE)
IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
PRINT_HELP("METH_help_T_KM",DEFAULT_HELP_TEXT_TIME)
ELSE
PRINT_HELP("METH_help_T",DEFAULT_HELP_TEXT_TIME)
ENDIF
wave_0_dialogue_system_status++
ENDIF
break
case 22
break
endswitch
if lk_timer(dialogue_time, 13000)
if wave_0_master_flow_system_status != 3 //stops the dialogue during the cutscene.
if is_ped_shooting(player_ped_id())
if not is_any_text_being_displayed(locates_data)
if is_enemy_near_player(wave_0_enemy, 50.00)
or is_enemy_near_player(wave_0_inside_enemy, 50.00)
if create_conversation(scripted_speech[0], "methaud", "attack_0", conv_priority_low)
dialogue_time = get_game_timer()
endif
endif
endif
endif
endif
endif
endproc
proc wave_0_buddy_ai_system()
if allow_buddy_ai_system
IF NOT wave_0_complete // @SBA - this is combined for both parts of wave 0. If we get errant abandon messages, this may be why.
// Chef at window position
IF IS_ENTITY_AT_COORD(buddy.ped, <<1387.4102, 3607.4644, 37.9418>>, <<3.0, 3.0, 2.0>>, FALSE)
HANDLE_WAVE_0_CHEF_DEMISE()
HANDLE_ABANDONMENT_MESSAGE(HAS_PLAYER_ABANDONED_CHEF_WAVE_0())
// Chef outside, top of stairs postion
ELIF IS_ENTITY_AT_COORD(buddy.ped, vChefCoverPointBackStairs, <<3.0, 3.0, 2.0>>, FALSE)
HANDLE_WAVE_0_PART_2_CHEF_DEMISE()
HANDLE_ABANDONMENT_MESSAGE(HAS_PLAYER_ABANDONED_CHEF_WAVE_0_PART2())
ENDIF
HANDLE_CHEF_DAMAGED_DIALOGUE()
ENDIF
switch wave_0_buddy_ai_system_status
case 0
// @SBA - make sure Chef's health is set to max for this wave
SET_HEALTH_FOR_PED(buddy.ped, buddy.health)
if not IS_ENTITY_AT_COORD(buddy.ped, <<1387.4102, 3607.4644, 37.9418>>, <<2.0, 2.0, 2.0>>, false, true)
if has_ped_task_finished_2(buddy.ped, script_task_perform_sequence)
clear_ped_tasks(buddy.ped)
set_blocking_of_non_temporary_events(buddy.ped, true)
open_sequence_task(seq)
task_seek_cover_to_cover_point(null, buddy_cover_point[0], <<1372.01, 3596.31, 37.97>>, -1)
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
endif
else
if is_ped_in_cover(buddy.ped) or lk_timer(buddy_time, 4500)
if lk_timer(buddy_time, 4500)
SET_PED_CAN_PEEK_IN_COVER(buddy.ped, TRUE)
set_blocking_of_non_temporary_events(buddy.ped, false)
set_ped_sphere_defensive_area(buddy.ped, <<1387.4447, 3607.4478, 37.9418>>, 2.0)
SET_PED_ACCURACY(buddy.ped, 25)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(buddy.ped, 75.0)
wave_0_buddy_ai_system_status = 22
endif
endif
endif
break
case 1
// When Chef is visible, wait a little extra to help player see him run out
IF NOT IS_ENTITY_OCCLUDED(buddy.ped)
START_TIMER_NOW(tmrChefRunsDelay)
ELSE
CANCEL_TIMER(tmrChefRunsDelay)
ENDIF
// @SBA - Don't move yet if enemies are right there, or player isn't looking
IF NOT IS_ANY_PED_IN_TRIGGER_BOX(wave_0_enemy, tbUpstairsRushVolume)
if not is_entity_in_angled_area(player_ped_id(), <<1389.055, 3600.813, 37.947>>, <<1396.021, 3603.307, 40.947>>, 4.500)
OR TIMER_DO_WHEN_READY(tmrChefRunsDelay, 1.500)
or lk_timer(original_time, 10000) // failsafe to keep things moving
bChefRunsToBackStairs = TRUE
ENDIF
ENDIF
IF bChefRunsToBackStairs
set_blocking_of_non_temporary_events(buddy.ped, true)
clear_ped_tasks(buddy.ped)
open_sequence_task(seq)
task_clear_look_at(null)
TASK_FOLLOW_WAYPOINT_RECORDING(null, "methlab4", 0, EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT | EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS)
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
CANCEL_TIMER(tmrChefRunsDelay)
wave_0_buddy_ai_system_status++
endif
break
case 2
// @SBA - make sure Chef's health is set to max for this wave
SET_HEALTH_FOR_PED(buddy.ped, buddy.health)
if IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(buddy.ped)
WAYPOINT_PLAYBACK_OVERRIDE_SPEED(buddy.ped, 2.0) //1.9
endif
// @SBA - trying an earlier waypoint and different cover, also so he avoids getting stuck on door. OLD = 15
if waypoint_recording_get_coord("methlab4", 10, target_waypoint_pos)
if not IS_ENTITY_AT_COORD(buddy.ped, target_waypoint_pos, <<1.0, 1.0, 1.6>>, false, true)
if has_ped_task_finished_2(buddy.ped, script_task_perform_sequence)
if waypoint_recording_get_closest_waypoint("methlab4", GET_ENTITY_COORDS(buddy.ped), waypoint_node_pos)
waypoint_node_pos += 1
// @SBA - trying an earlier point. OLD = 15
if waypoint_node_pos > 10
waypoint_node_pos = 10
endif
set_blocking_of_non_temporary_events(buddy.ped, true)
clear_ped_tasks(buddy.ped)
open_sequence_task(seq)
task_follow_waypoint_recording(null, "methlab4", waypoint_node_pos, EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT | EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS)
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
endif
endif
else
IF IS_PLAYER_STEALING_PEDS_DESTINATION(buddy.ped, buddy_cover_point_data[0].pos, 5.0, false)
TASK_SEEK_COVER_TO_COVER_POINT(buddy.ped, buddy_cover_point_data[1].cover_point, buddy_cover_point_data[1].cover_from_pos, -1)
SET_PED_CAN_PEEK_IN_COVER(buddy.ped, FALSE)
ELSE
TASK_SEEK_COVER_TO_COVER_POINT(buddy.ped, buddy_cover_point_data[0].cover_point, buddy_cover_point_data[0].cover_from_pos, -1)
SET_PED_CAN_PEEK_IN_COVER(buddy.ped, TRUE)
ENDIF
wave_0_buddy_ai_system_status++
endif
endif
break
case 3
if not is_ped_in_cover(buddy.ped)
buddy_time = get_game_timer()
IF has_ped_task_finished_2(buddy.ped, SCRIPT_TASK_SEEK_COVER_TO_COVER_POINT)
IF IS_PLAYER_STEALING_PEDS_DESTINATION(buddy.ped, buddy_cover_point_data[0].pos, 5.0, false)
TASK_SEEK_COVER_TO_COVER_POINT(buddy.ped, buddy_cover_point_data[1].cover_point, buddy_cover_point_data[1].cover_from_pos, -1)
SET_PED_CAN_PEEK_IN_COVER(buddy.ped, FALSE)
ELSE
TASK_SEEK_COVER_TO_COVER_POINT(buddy.ped, buddy_cover_point_data[0].cover_point, buddy_cover_point_data[0].cover_from_pos, -1)
SET_PED_CAN_PEEK_IN_COVER(buddy.ped, TRUE)
ENDIF
ENDIF
else
if lk_timer(buddy_time, 1000)
SET_PED_PATH_CAN_USE_CLIMBOVERS(buddy.ped, false)
set_ped_sphere_defensive_area(buddy.ped, GET_ENTITY_COORDS(buddy.ped), 1.5) // @SBA - OLD = <<1389.67, 3619.39, 38.5>> and 1.0 //<<1390.00, 3618.03, 38.3>>
set_blocking_of_non_temporary_events(buddy.ped, false)
task_combat_hated_targets_around_ped(buddy.ped, 100)
wave_0_buddy_ai_system_status = 22
ENDIF
endif
break
case 4
if ped_structure_are_all_enemies_dead(wave_0_inside_enemy)
set_ped_accuracy(buddy.ped, 10)
set_blocking_of_non_temporary_events(buddy.ped, true)
clear_ped_tasks(buddy.ped)
SET_PED_CAN_PEEK_IN_COVER(buddy.ped, TRUE)
open_sequence_task(seq)
task_follow_nav_mesh_to_coord(null, <<1390.00, 3618.03, 37.93>>, pedmove_run, -1)
TASK_TURN_PED_TO_FACE_ENTITY(null, player_ped_id())
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
wave_0_buddy_ai_system_status++
endif
break
case 5
if not IS_ENTITY_AT_COORD(buddy.ped, <<1390.00, 3618.03, 37.93>>, <<1.0, 1.0, 1.6>>, false, true)
if has_ped_task_finished_2(buddy.ped, script_task_perform_sequence)
set_blocking_of_non_temporary_events(buddy.ped, true)
clear_ped_tasks(buddy.ped)
open_sequence_task(seq)
task_follow_nav_mesh_to_coord(null, <<1390.00, 3618.03, 37.93>>, pedmove_run, -1)
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
endif
else
if not is_ped_facing_ped(buddy.ped, player_ped_id(), 30.00)
if has_ped_task_finished_2(buddy.ped, script_task_perform_sequence)
set_blocking_of_non_temporary_events(buddy.ped, true)
clear_ped_tasks(buddy.ped)
open_sequence_task(seq)
TASK_TURN_PED_TO_FACE_ENTITY(null, player_ped_id())
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
endif
endif
endif
break
case 22
break
endswitch
endif
endproc
func bool wave_0_ai_system()
if not wave_0_complete
bool wave_0_enemies_dead = ped_structure_are_all_enemies_dead(wave_0_enemy)
bool wave_0_inside_enemies_dead = ped_structure_are_all_enemies_dead(wave_0_inside_enemy)
// @SBA - declare local variable
INT iWave_0_Index
if wave_0_enemies_dead and wave_0_inside_enemies_dead
wave_0_complete = true
return true
endif
for i = 0 to count_of(wave_0_enemy) - 1
if not is_ped_injured(wave_0_enemy[i].ped)
// @SBA - make blip for enemy if needed
HANDLE_ENEMY_BLIP_CREATION(wave_0_enemy[i])
switch wave_0_status[i]
case initial_attack_phase
switch i
case 0
case 1
open_sequence_task(seq)
task_pause(null, 500)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_0_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_0_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_0_status[i] = get_into_pos
break
case 2
if is_vehicle_driveable(wave_0_enemy_vehicle[0].veh)
if is_playback_going_on_for_vehicle(wave_0_enemy_vehicle[0].veh)
if (GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(wave_0_enemy_vehicle[0].recording_number, "lkmethlab") - 1000) < (get_time_position_in_recording(wave_0_enemy_vehicle[0].veh))
stop_playback_recorded_vehicle(wave_0_enemy_vehicle[0].veh)
REMOVE_VEHICLE_BLIP(wave_0_enemy_vehicle[0])
open_sequence_task(seq)
task_leave_vehicle(null, wave_0_enemy_vehicle[0].veh, ecf_dont_close_door)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_0_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_0_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_0_status[i] = get_into_pos
endif
endif
else
set_blocking_of_non_temporary_events(wave_0_enemy[i].ped, false)
set_ped_sphere_defensive_area(wave_0_enemy[i].ped, wave_0_enemy[i].run_to_pos, 3.0)
task_combat_ped(wave_0_enemy[i].ped, player_ped_id())
wave_0_status[i] = run_to_other_side_of_building
endif
break
case 3
case 4
if is_vehicle_driveable(wave_0_enemy_vehicle[0].veh)
if not is_playback_going_on_for_vehicle(wave_0_enemy_vehicle[0].veh)
open_sequence_task(seq)
task_pause(null, (150 * i))
//task_leave_vehicle(null, wave_0_enemy_vehicle[0].veh, ecf_dont_close_door)
//TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_0_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
TASK_SET_SPHERE_DEFENSIVE_AREA(null, wave_0_enemy[i].run_to_pos, 3.0)
task_set_blocking_of_non_temporary_events(null, false)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(null, 100)
close_sequence_task(seq)
task_perform_sequence(wave_0_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_0_status[i] = get_into_pos
endif
else
set_blocking_of_non_temporary_events(wave_0_enemy[i].ped, false)
set_ped_sphere_defensive_area(wave_0_enemy[i].ped, wave_0_enemy[i].run_to_pos, 8.0) //3.0
task_combat_ped(wave_0_enemy[i].ped, player_ped_id())
wave_0_status[i] = run_to_other_side_of_building
endif
break
case 5
if is_vehicle_driveable(wave_0_enemy_vehicle[1].veh)
if is_playback_going_on_for_vehicle(wave_0_enemy_vehicle[1].veh)
if (GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(wave_0_enemy_vehicle[1].recording_number, "lkmethlab") - 100) < (get_time_position_in_recording(wave_0_enemy_vehicle[1].veh))
stop_playback_recorded_vehicle(wave_0_enemy_vehicle[1].veh)
REMOVE_VEHICLE_BLIP(wave_0_enemy_vehicle[1])
open_sequence_task(seq)
task_leave_vehicle(null, wave_0_enemy_vehicle[1].veh, ecf_dont_close_door)
// @SBA - tasking this guy to just run (he comes inside first)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_0_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 1.0)
//TASK_SWAP_WEAPON(NULL, TRUE)
//TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, wave_0_enemy[i].run_to_pos, pedmove_run, -1)
close_sequence_task(seq)
task_perform_sequence(wave_0_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_0_status[i] = get_into_pos
endif
endif
else
set_blocking_of_non_temporary_events(wave_0_enemy[i].ped, false)
set_ped_sphere_defensive_area(wave_0_enemy[i].ped, wave_0_enemy[i].run_to_pos, 8.0) //3.0
task_combat_ped(wave_0_enemy[i].ped, player_ped_id())
wave_0_status[i] = run_to_other_side_of_building
endif
break
case 6
if is_vehicle_driveable(wave_0_enemy_vehicle[1].veh)
if not is_playback_going_on_for_vehicle(wave_0_enemy_vehicle[1].veh)
open_sequence_task(seq)
task_pause(null, (i * i * 15))
task_leave_vehicle(null, wave_0_enemy_vehicle[1].veh, ecf_dont_close_door)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_0_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_0_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_0_status[i] = get_into_pos
endif
else
set_blocking_of_non_temporary_events(wave_0_enemy[i].ped, false)
set_ped_sphere_defensive_area(wave_0_enemy[i].ped, wave_0_enemy[i].run_to_pos, 8.0)//2.0
task_combat_ped(wave_0_enemy[i].ped, player_ped_id())
wave_0_status[i] = run_to_other_side_of_building
endif
break
case 7
case 8
if is_vehicle_driveable(wave_0_enemy_vehicle[1].veh)
if not is_playback_going_on_for_vehicle(wave_0_enemy_vehicle[1].veh)
open_sequence_task(seq)
task_pause(null, (i * i * 15))
task_leave_vehicle(null, wave_0_enemy_vehicle[1].veh, ecf_dont_close_door)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_0_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_0_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_0_status[i] = get_into_pos
endif
else
set_blocking_of_non_temporary_events(wave_0_enemy[i].ped, false)
set_ped_sphere_defensive_area(wave_0_enemy[i].ped, wave_0_enemy[i].run_to_pos, 8.0) //3.0
task_combat_ped(wave_0_enemy[i].ped, player_ped_id())
wave_0_status[i] = run_to_other_side_of_building
endif
break
case 9
open_sequence_task(seq)
task_pause(null, 500)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_0_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_0_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_0_status[i] = get_into_pos
break
endswitch
break
case get_into_pos
switch i
case 0
case 1
case 2
case 3
case 4
case 5 // @SBA - no longer special casing this one, see below
case 6
case 7
case 8
if not IS_ENTITY_AT_COORD(wave_0_enemy[i].ped, wave_0_enemy[i].run_to_pos, <<1.5, 1.5, 1.6>>, false, true)
if has_ped_task_finished_2(wave_0_enemy[i].ped, script_task_perform_sequence)
set_blocking_of_non_temporary_events(wave_0_enemy[i].ped, true)
clear_ped_tasks(wave_0_enemy[i].ped)
open_sequence_task(seq)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_0_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_0_enemy[i].ped, seq)
clear_sequence_task(seq)
endif
else
set_blocking_of_non_temporary_events(wave_0_enemy[i].ped, false)
set_ped_sphere_defensive_area(wave_0_enemy[i].ped, wave_0_enemy[i].run_to_pos, 8.0)//3.0
task_combat_ped(wave_0_enemy[i].ped, player_ped_id())
// @SBA - enemies will try to rush inside periodically, so setting this as the next stage
wave_0_status[i] = run_to_front_of_building
endif
break
// @SBA - special case for this enemy so he runs right inside
// Mothballing...
// CASE 5
//
// if not IS_ENTITY_AT_COORD(wave_0_enemy[i].ped, wave_0_enemy[i].run_to_pos, <<1.5, 1.5, 1.6>>, false, true)
// //PRINTLN("*** ENEMY 5 - Not at coord ***")
//
// if has_ped_task_finished_2(wave_0_enemy[i].ped, script_task_perform_sequence)
// //PRINTLN("*** ENEMY 5 - Resetting task ***")
//
// set_blocking_of_non_temporary_events(wave_0_enemy[i].ped, true)
// clear_ped_tasks(wave_0_enemy[i].ped)
//
// open_sequence_task(seq)
// // @SBA - tasking this guy to just run (he comes inside first)
// //TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_0_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
// TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, wave_0_enemy[i].run_to_pos, pedmove_run, -1)
// close_sequence_task(seq)
// task_perform_sequence(wave_0_enemy[i].ped, seq)
// clear_sequence_task(seq)
// endif
//
// else
// //PRINTLN("*** ENEMY 5 - Going to run_into_shop ***")
//
// set_blocking_of_non_temporary_events(wave_0_enemy[i].ped, false)
// // @SBA - set defensive area just outside the door to move the enemy there
// //set_ped_sphere_defensive_area(wave_0_enemy[i].ped, wave_0_enemy[i].run_to_pos, 8.0)//3.0
// SET_PED_ANGLED_DEFENSIVE_AREA(wave_0_enemy[i].ped, tbFrontDoorVolume.vMin, tbFrontDoorVolume.vMax, tbFrontDoorVolume.flWidth, TRUE)
// task_combat_ped(wave_0_enemy[i].ped, player_ped_id())
// // set this flag
// wave_0_enemy[i].bRushInside = TRUE
//
// // @SBA - setting this as the next stage so he'll go upstairs
// wave_0_status[i] = run_into_shop
//
// endif
BREAK
case 9 // @SBA - not used?
if not IS_ENTITY_AT_COORD(wave_0_enemy[i].ped, wave_0_enemy[i].run_to_pos, <<1.5, 1.5, 1.6>>, false, true)
if has_ped_task_finished_2(wave_0_enemy[i].ped, script_task_perform_sequence)
set_blocking_of_non_temporary_events(wave_0_enemy[i].ped, true)
clear_ped_tasks(wave_0_enemy[i].ped)
open_sequence_task(seq)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, wave_0_enemy[i].run_to_pos, player_ped_id(), pedmove_run, true, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_0_enemy[i].ped, seq)
clear_sequence_task(seq)
endif
else
set_blocking_of_non_temporary_events(wave_0_enemy[i].ped, false)
set_ped_sphere_defensive_area(wave_0_enemy[i].ped, wave_0_enemy[i].run_to_pos, 8.0)//3.0
task_combat_ped(wave_0_enemy[i].ped, player_ped_id())
wave_0_status[i] = attack_from_pos_2
endif
break
endswitch
// @SBA - set intial wait time before the first enemy rushes (if not set yet)
IF iWaitTimeBeforeRush = 0
CANCEL_TIMER(tmrNextRusherDelay)
iWaitTimeBeforeRush = 15000
// @SBA - start rush timer
iWave_Rush_Time = GET_GAME_TIMER()
ENDIF
break
case attack_from_pos_2
switch i
case 9
// if is_ped_injured(wave_0_enemy[1].ped)
//
// wave_0_enemy[9].run_to_pos = wave_0_enemy[1].run_to_pos
//
// set_blocking_of_non_temporary_events(wave_0_enemy[i].ped, false)
// set_ped_sphere_defensive_area(wave_0_enemy[i].ped, wave_0_enemy[i].run_to_pos, 3.0)
// task_combat_ped(wave_0_enemy[i].ped, player_ped_id())
// wave_0_status[i] = do_nothing
//
// endif
break
endswitch
break
// @SBA - adding this case for the rush inside
// adding this intermediate waypoint so the enemies go through the front door
// (otherwise they open the gate to go up the back stairs)
CASE run_to_front_of_building
// @SBA - if the gate has been rammed, switch to the appropriate case
IF ram_cutscene_finished
wave_0_status[i] = run_to_other_side_of_building
CANCEL_TIMER(tmrNextRusherDelay)
RETURN FALSE
// @SBA - otherwise, when the wait timer is ready, check if it's ok to send a rusher
ELIF lk_timer(iWave_Rush_Time, iWaitTimeBeforeRush)
IF ARE_WE_READY_FOR_A_NEW_RUSHER(wave_0_enemy, 0) // @SBA - don't want rushers unless Chef is abandoned
START_TIMER_NOW(tmrNextRusherDelay)
// delay checking for the need for a new rusher until after one has been deployed
iWaitTimeBeforeRush = 10500
iWave_Rush_Time = GET_GAME_TIMER()
ELSE
// @SBA - Not ready for a new rusher (max number still in play).
//CPRINTLN(DEBUG_MISSION,"*** Don't need a new rusher yet. Reset the timer to try again later.")
iWaitTimeBeforeRush = GET_RANDOM_INT_IN_RANGE(2000, 3999)
iWave_Rush_Time = GET_GAME_TIMER()
ENDIF
ENDIF
// Delay the rusher so there's a breather after last one was killed
IF TIMER_DO_WHEN_READY(tmrNextRusherDelay, 10.000)
OR HAS_PLAYER_ABANDONED_CHEF_WAVE_0()
// still need rusher?
IF ARE_WE_READY_FOR_A_NEW_RUSHER(wave_0_enemy, 1)
// send a chosen enemy to the front doors
iWave_0_Index = GET_NEXT_WAVE_0_INDEX()
IF iWave_0_Index != -1
CPRINTLN(DEBUG_MISSION,"Sending in a new rusher (wave 0)")
// @SBA - set defensive area just outside the door to move the enemy there
SET_PED_ANGLED_DEFENSIVE_AREA(wave_0_enemy[iWave_0_Index].ped, tbFrontDoorVolume.vMin, tbFrontDoorVolume.vMax, tbFrontDoorVolume.flWidth, TRUE)
// @SBA - set a new, random wait time and restart rush timer
// Note: Don't set time to 18000ms as it's checking against that for wave 2
iWaitTimeBeforeRush = GET_RANDOM_INT_IN_RANGE(2000, 3999)
iWave_Rush_Time = GET_GAME_TIMER()
SET_ENEMY_RUSHER_ATTRIBUTES(wave_0_enemy[iWave_0_Index].ped, 1, 0, 50)
CANCEL_TIMER(tmrNextRusherDelay)
wave_0_status[iWave_0_Index] = run_into_shop
ENDIF
ENDIF
ENDIF
BREAK
// @SBA - adding this case for the rush inside
// This sends the enemies upstairs to fight
CASE run_into_shop
// @SBA - if the gate has been rammed, switch to the appropriate case
IF ram_cutscene_finished
wave_0_status[i] = run_to_other_side_of_building
// @SBA - otherwise have them continue upstairs
ELIF IS_ENTITY_IN_TRIGGER_BOX(wave_0_enemy[i].ped, tbFrontDoorVolume)
// @SBA - set defensive area upstairs to move the enemy there
SET_PED_ANGLED_DEFENSIVE_AREA(wave_0_enemy[i].ped, tbUpstairsRushVolume.vMin, tbUpstairsRushVolume.vMax, tbUpstairsRushVolume.flWidth)
// @SBA - Reset this so buddy can shoot these guys
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(wave_0_enemy[i].ped, FALSE)
wave_0_status[i] = combat_player
ENDIF
BREAK
// @SBA - adding this case for the rush inside
CASE combat_player
// @SBA - if enemy has already reached position, let him fight there
IF IS_ENTITY_IN_TRIGGER_BOX(wave_0_enemy[i].ped, tbUpstairsRushVolume)
SET_PED_ENABLE_WEAPON_BLOCKING(wave_0_enemy[i].ped, TRUE)
SET_PED_COMBAT_ATTRIBUTES(wave_0_enemy[i].ped, CA_ENABLE_TACTICAL_POINTS_WHEN_DEFENSIVE, TRUE)
REGISTER_TARGET(wave_0_enemy[i].ped, buddy.ped)
PLAY_PED_AMBIENT_SPEECH_NATIVE(wave_0_enemy[i].ped, "GENERIC_WAR_CRY", "SPEECH_PARAMS_FORCE")
// Make them go into the other room if it's free
IF NOT IS_ANY_PED_IN_TRIGGER_BOX(wave_0_enemy, tbUpstairsCloserRushVolume)
IF IS_PED_IN_SPECIFIC_ROOM(PLAYER_PED_ID(), (<<1390.91, 3608.21, 38.91>>), "v_39_UpperRm3")
SET_PED_ANGLED_DEFENSIVE_AREA(wave_0_enemy[i].ped, tbUpstairsCloserRushVolume.vMin, tbUpstairsCloserRushVolume.vMax, tbUpstairsCloserRushVolume.flWidth)
ENDIF
ENDIF
wave_0_status[i] = do_nothing
// otherwise, have him take up a position at the top of the back stairs
ELIF ram_cutscene_finished
wave_0_status[i] = charge_back_stairs
ENDIF
BREAK
case run_to_other_side_of_building
if ram_cutscene_finished
set_blocking_of_non_temporary_events(wave_0_enemy[i].ped, true)
clear_ped_tasks(wave_0_enemy[i].ped)
// @SBA - Reset this flag so buddy can shoot these guys, and kill any previous defensive area
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(wave_0_enemy[i].ped, FALSE)
REMOVE_PED_DEFENSIVE_AREA(wave_0_enemy[i].ped)
open_sequence_task(seq)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, <<1395.6790, 3629.6826, 33.9204>>, player_ped_id(), pedmove_run, false, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_0_enemy[i].ped, seq)
clear_sequence_task(seq)
wave_0_status[i] = get_to_other_side_of_building
endif
break
case get_to_other_side_of_building
if not IS_ENTITY_AT_COORD(wave_0_enemy[i].ped, <<1395.6790, 3629.6826, 33.9204>>, <<1.0, 1.0, 1.6>>, false, true)
if has_ped_task_finished_2(wave_0_enemy[i].ped, script_task_perform_sequence)
set_blocking_of_non_temporary_events(wave_0_enemy[i].ped, true)
clear_ped_tasks(wave_0_enemy[i].ped)
open_sequence_task(seq)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, <<1395.6790, 3629.6826, 33.9204>>, player_ped_id(), pedmove_run, false, 0.5, 0.8)
close_sequence_task(seq)
task_perform_sequence(wave_0_enemy[i].ped, seq)
clear_sequence_task(seq)
endif
else
set_blocking_of_non_temporary_events(wave_0_enemy[i].ped, false)
set_ped_sphere_defensive_area(wave_0_enemy[i].ped, <<1395.6790, 3629.6826, 33.9204>>, 8.0) //@SBA - setting a bigger area to accomodate more enemies (previous 1.5)
task_combat_ped(wave_0_enemy[i].ped, player_ped_id())
wave_0_status[i] = charge_back_stairs
endif
break
// @SBA - Added this case to have any survivors charge the stairs if the truck guys are dead
CASE charge_back_stairs
IF ped_structure_are_all_enemies_dead(wave_0_inside_enemy, FALSE)
OR wave_0_enemy[i].bRushInside
// @SBA - Make sure rush flag is set
wave_0_enemy[i].bRushInside = TRUE
SET_PED_ANGLED_DEFENSIVE_AREA(wave_0_enemy[i].ped, tbTopBackStairsVolume.vMin, tbTopBackStairsVolume.vMax, tbTopBackStairsVolume.flWidth, TRUE)
// @SBA - ensure buddy AI can kill them
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(wave_0_enemy[i].ped, FALSE)
wave_0_status[i] = do_nothing
ENDIF
BREAK
case do_nothing
break
endswitch
endif
endfor
wave_0_inside_enemy_0_system()
wave_0_inside_enemy_1_system()
wave_0_inside_enemy_2_system()
wave_0_inside_enemy_3_system()
else
return true
endif
return false
endfunc
proc wave_0_assisted_nodes_system()
switch wave_0_assisted_nodes_system_status
case 0
break
case 1
ASSISTED_MOVEMENT_REQUEST_ROUTE("Wave0")
wave_0_assisted_nodes_system_status++
break
case 2
//if not is_ped_inside_interior(player_ped_id(), <<1391.6487, 3608.3596, 37.9418>>)
if IS_ENTITY_IN_ANGLED_AREA(player_ped_id(), <<1383.533, 3615.497, 37.931>>, <<1394.681, 3619.662, 40.931>>, 4.400)
ASSISTED_MOVEMENT_remove_ROUTE("Wave0")
wave_0_assisted_nodes_system_status++
endif
break
case 3
break
endswitch
endproc
func bool wave_0_explode_vehicle_system()
// if not is_vehicle_exploded
//
// for i = 0 to count_of(wave_0_enemy_vehicle) - 1
//
// if is_vehicle_driveable(wave_0_enemy_vehicle[i].veh)
// if not is_playback_going_on_for_vehicle(wave_0_enemy_vehicle[i].veh)
// if get_vehicle_petrol_tank_health(wave_0_enemy_vehicle[i].veh) < 300
// or get_vehicle_engine_health(wave_0_enemy_vehicle[i].veh) < 300
// or get_entity_health(wave_0_enemy_vehicle[i].veh) < 300
//
// explode_vehicle(wave_0_enemy_vehicle[i].veh)
//
// is_vehicle_exploded = true
//
// return true
//
// endif
// endif
// endif
// endfor
//
// endif
if does_entity_exist(parked_cars[3])
if is_vehicle_driveable(parked_cars[3])
if get_entity_health(parked_cars[3]) < 700
or get_vehicle_engine_health(parked_cars[3]) < 700.00
or get_vehicle_petrol_tank_health(parked_cars[3]) < 700.00
explode_vehicle(parked_cars[3])
set_vehicle_as_no_longer_needed(parked_cars[3])
endif
endif
endif
return false
endfunc
proc wave_0_vehicle_destruction_system()
vector bullet_front_left_offset = <<-0.78, 1.32, -0.4>>
vector bullet_front_right_offset = <<0.78, 1.32, -0.4>>
vector bullet_back_right_offset = <<0.78, -1.64, -0.4>>
vector bullet_back_left_offset = <<-0.78, -1.64, -0.4>>
float bullet_radius_check = 1.55
vector deformation_front_left_offset = <<0.900, 1.340, 0.15>>
vector deformation_front_right_offset = <<-0.900, 1.30, 0.15>>
vector deformation_back_left_offset = <<-0.900, -1.3, 0.15>>
vector deformation_back_right_offset = <<0.9, -1.3, 0.15>>
float damage = 200.00 //140.00
float deformation = 200.00 //140.00
if is_player_control_on(player_id())
for i = 0 to count_of(wave_0_enemy_vehicle) - 1
if not is_entity_dead(wave_0_enemy_vehicle[i].veh)
//POSSIBLY MAKE A FUNCTION OUT OF THIS AND PASS IN 8 PARAMETERS
if HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(wave_0_enemy_vehicle[i].veh, bullet_front_left_offset), bullet_radius_check)
if not is_vehicle_tyre_burst(wave_0_enemy_vehicle[i].veh, sc_wheel_car_front_left)
SET_VEHICLE_TYRE_BURST(wave_0_enemy_vehicle[i].veh, sc_wheel_car_front_left)
SET_VEHICLE_DAMAGE(wave_0_enemy_vehicle[i].veh, deformation_front_left_offset, damage, deformation, true)
SMASH_VEHICLE_WINDOW(wave_0_enemy_vehicle[i].veh, sc_window_front_left)
endif
endif
if HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(wave_0_enemy_vehicle[i].veh, bullet_front_right_offset), bullet_radius_check)
if not is_vehicle_tyre_burst(wave_0_enemy_vehicle[i].veh, sc_wheel_car_front_right)
SET_VEHICLE_TYRE_BURST(wave_0_enemy_vehicle[i].veh, sc_wheel_car_front_right)
SET_VEHICLE_DAMAGE(wave_0_enemy_vehicle[i].veh, deformation_front_right_offset, damage, deformation, true)
SMASH_VEHICLE_WINDOW(wave_0_enemy_vehicle[i].veh, sc_window_front_right)
endif
endif
if HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(wave_0_enemy_vehicle[i].veh, bullet_back_left_offset), bullet_radius_check)
if not is_vehicle_tyre_burst(wave_0_enemy_vehicle[i].veh, sc_wheel_car_rear_left)
SET_VEHICLE_TYRE_BURST(wave_0_enemy_vehicle[i].veh, sc_wheel_car_rear_left)
SET_VEHICLE_DAMAGE(wave_0_enemy_vehicle[i].veh, deformation_back_left_offset, damage, deformation, true)
SMASH_VEHICLE_WINDOW(wave_0_enemy_vehicle[i].veh, sc_window_rear_left)
endif
endif
if HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(wave_0_enemy_vehicle[i].veh, bullet_back_right_offset), bullet_radius_check)
if not is_vehicle_tyre_burst(wave_0_enemy_vehicle[i].veh, sc_wheel_car_rear_right)
SET_VEHICLE_TYRE_BURST(wave_0_enemy_vehicle[i].veh, sc_wheel_car_rear_right)
SET_VEHICLE_DAMAGE(wave_0_enemy_vehicle[i].veh, deformation_back_right_offset, damage, deformation, true)
SMASH_VEHICLE_WINDOW(wave_0_enemy_vehicle[i].veh, sc_window_rear_right)
endif
endif
endif
endfor
endif
endproc
proc wave_0_leaking_petrol_system()
if does_entity_exist(wave_0_enemy_vehicle[1].veh)
if is_vehicle_driveable(wave_0_enemy_vehicle[1].veh)
if is_playback_going_on_for_vehicle(wave_0_enemy_vehicle[1].veh)
if (GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(wave_0_enemy_vehicle[1].recording_number, "lkmethlab") - 3000) < (get_time_position_in_recording(wave_0_enemy_vehicle[1].veh))
if GET_VEHICLE_PETROL_TANK_HEALTH(wave_0_enemy_vehicle[1].veh) > 150//150
SET_VEHICLE_CAN_LEAK_PETROL(wave_0_enemy_vehicle[1].veh, TRUE)
SET_VEHICLE_PETROL_TANK_HEALTH(wave_0_enemy_vehicle[1].veh, 150)
iSuvDamageCount = 0
CPRINTLN(DEBUG_MISSION,"wave_0_leaking_petrol_system: Setting Blue SUV tank health.")
endif
endif
// @SBA - gas trail not working properly, so hacking in something to get this vehicle ignited
ELSE
IF NOT IS_ENTITY_ON_FIRE(wave_0_enemy_vehicle[1].veh)
FLOAT fEngineHealth = GET_VEHICLE_ENGINE_HEALTH(wave_0_enemy_vehicle[1].veh)
// @SBA light it up if it's taken enough damage
IF fEngineHealth < 850.0
OR iSuvDamageCount >= 5 // Some hits register no damage to the engine, so this gets around that
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(wave_0_enemy_vehicle[1].veh, buddy.ped)
// start fire
SET_VEHICLE_PETROL_TANK_HEALTH(wave_0_enemy_vehicle[1].veh, -1.0)
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(wave_0_enemy_vehicle[1].veh)
iSuvDamageCount = 0
CPRINTLN(DEBUG_MISSION,"wave_0_leaking_petrol_system: Setting Blue SUV on fire.")
ENDIF
// Check if anyone has damaged SUV, increase count
IF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED(wave_0_enemy_vehicle[1].veh)
CPRINTLN(DEBUG_MISSION,"wave_0_enemy_vehicle[1] health = ", fEngineHealth)
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(wave_0_enemy_vehicle[1].veh)
iSuvDamageCount ++
ENDIF
ENDIF
endif
endif
endif
endproc
proc wave_0_fence_destruction()
if not fence_shot
if IS_ENTITY_IN_ANGLED_AREA(player_ped_id(), <<1390.113, 3615.582, 37.931>>, <<1386.932, 3624.107, 41.431>>, 12.200)
if is_ped_in_angled_area_lk(wave_0_inside_enemy[0].ped, <<1368.573, 3616.663, 33.898>>, <<1382.762, 3621.828, 36.898>>, 12.700)
or is_ped_in_angled_area_lk(wave_0_inside_enemy[1].ped, <<1368.573, 3616.663, 33.898>>, <<1382.762, 3621.828, 36.898>>, 12.700)
or is_ped_in_angled_area_lk(wave_0_inside_enemy[2].ped, <<1368.573, 3616.663, 33.898>>, <<1382.762, 3621.828, 36.898>>, 12.700)
or is_ped_in_angled_area_lk(wave_0_inside_enemy[3].ped, <<1368.573, 3616.663, 33.898>>, <<1382.762, 3621.828, 36.898>>, 12.700)
shoot_single_bullet_between_coords(<<1374.2, 3616.7, 36.2>>, <<1381.3, 3621.5, 38.3>>, 100, true, WEAPONTYPE_ASSAULTRIFLE)
shoot_single_bullet_between_coords(<<1374.2, 3616.7, 36.2>>, <<1381.5, 3620.9, 38.2>>, 100, true, WEAPONTYPE_ASSAULTRIFLE)
shoot_single_bullet_between_coords(<<1374.2, 3616.7, 36.2>>, <<1381.7, 3620.0, 38.3>>, 100, true, WEAPONTYPE_ASSAULTRIFLE)
shoot_single_bullet_between_coords(<<1374.2, 3616.7, 36.2>>, <<1382.1, 3619.3, 38.3>>, 100, true, WEAPONTYPE_ASSAULTRIFLE)
shoot_single_bullet_between_coords(<<1374.2, 3616.7, 36.2>>, <<1382.2, 3618.5, 38.3>>, 100, true, WEAPONTYPE_ASSAULTRIFLE)
fence_shot = true
endif
endif
endif
endproc
proc wave_0_audio_scene_system()
switch wave_0_audio_scene_system_status
case 0
IF wave_0_master_flow_system_status > 0
IF DOES_ENTITY_EXIST(wave_0_enemy_vehicle[0].veh)
IF IS_VEHICLE_DRIVEABLE(wave_0_enemy_vehicle[0].veh)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(wave_0_enemy_vehicle[0].veh, "CHI_1_FIRST_TRUCKS_ARRIVE_GROUP")
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(wave_0_enemy_vehicle[1].veh)
IF IS_VEHICLE_DRIVEABLE(wave_0_enemy_vehicle[1].veh)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(wave_0_enemy_vehicle[1].veh, "CHI_1_FIRST_TRUCKS_ARRIVE_GROUP")
ENDIF
ENDIF
wave_0_audio_scene_system_status++
ENDIF
break
case 1
if wave_0_master_flow_system_status > 3
vector player_pos
player_pos = GET_ENTITY_COORDS(player_ped_id())
if lk_timer(original_time, 25000)
or player_pos.z < 37.00
or IS_ENTITY_IN_ANGLED_AREA(player_ped_id(), <<1390.113, 3615.582, 37.931>>, <<1386.932, 3624.107, 41.431>>, 12.200)
or (is_entity_in_angled_area(player_ped_id(), <<1390.858, 3599.007, 37.980>>, <<1389.319, 3603.235, 40.680>>, 2.3) and is_sphere_visible(<<1373.8, 3615.3, 35.4>>, 1.0))
or (is_entity_in_angled_area(player_ped_id(), <<1388.832, 3604.578, 37.747>>, <<1387.122, 3609.276, 40.847>>, 2.3) and is_sphere_visible(<<1373.8, 3615.3, 35.4>>, 1.0))
or is_entity_in_angled_area(player_ped_id(), <<1400.469, 3607.616, 38.006>>, <<1399.769, 3609.490, 40.506>>, 1.2)
start_audio_scene("CHI_1_SHOOTOUT_02")
IF DOES_ENTITY_EXIST(wave_0_enemy_vehicle[0].veh)
IF IS_VEHICLE_DRIVEABLE(wave_0_enemy_vehicle[0].veh)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(wave_0_enemy_vehicle[0].veh)
ELSE
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(wave_0_enemy_vehicle[0].veh)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(wave_0_enemy_vehicle[1].veh)
IF IS_VEHICLE_DRIVEABLE(wave_0_enemy_vehicle[1].veh)
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(wave_0_enemy_vehicle[1].veh)
ELSE
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(wave_0_enemy_vehicle[1].veh)
ENDIF
ENDIF
wave_0_audio_scene_system_status++
endif
endif
break
case 2
break
endswitch
endproc
func bool chinese_wave_0_system()
// @SBA - B*1195400 - rarely, a ped falls through the world and cannot be killed in game play
// this kills him if he is below ground
KILL_ANY_ERRANT_ENEMY(wave_0_enemy)
KILL_ANY_ERRANT_ENEMY(wave_0_inside_enemy)
// @SBA - handle dead vehicle blips
REMOVE_DEAD_VEHICLE_BLIPS(wave_0_enemy_vehicle)
if wave_0_master_flow_system()
mission_flow = wave_2_system
return true
endif
wave_0_dialogue_system()
wave_0_buddy_ai_system()
wave_0_explode_vehicle_system()
wave_0_leaking_petrol_system()
// wave_0_vehicle_destruction_system()
//wave_0_assisted_nodes_system()
wave_0_ai_system()
wave_0_fence_destruction()
wave_0_audio_scene_system()
if is_ped_inside_interior(player_ped_id(), <<1392.7360, 3602.5989, 38.5>>, "v_methlab")
SET_RADAR_AS_EXTERIOR_THIS_FRAME()
endif
//set_radar_zoom()
//DEBUG - comment back in when doing uber recording
//uber_vehicle_system()
return false
endfunc
proc setup_final_wave_of_wave_2()
for i = 5 to 5 //6 7
SETUP_ENEMY_VEHICLE(wave_2_enemy_vehicle[i])
start_playback_recorded_vehicle(wave_2_enemy_vehicle[i].veh, wave_2_enemy_vehicle[i].recording_number, "lkmethlab")
if i = 5
skip_time_in_playback_recorded_vehicle(wave_2_enemy_vehicle[i].veh, 3000)
endif
//DISPLAY_PLAYBACK_RECORDED_VEHICLE(wave_2_enemy_vehicle[i].veh, rdm_wholeline)
endfor
setup_enemy_in_vehicle(wave_2_enemy[12], wave_2_enemy_vehicle[5].veh)
set_ped_flee_attributes(wave_2_enemy[12].ped, fa_use_vehicle, true)
setup_enemy_in_vehicle(wave_2_enemy[13], wave_2_enemy_vehicle[5].veh, vs_front_right)
wave_2_enemy[14].created = true
wave_2_enemy[15].created = true
wave_2_enemy[16].created = true
wave_2_enemy[17].created = true
//create_conversation(scripted_speech[0], "methaud", "CHIN1_CAR", conv_priority_medium)
//KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
KILL_FACE_TO_FACE_CONVERSATION()
ADD_NON_CRITICAL_STANDARD_CONVERSATION_TO_BUFFER(scripted_speech[0], "methaud", "CHIN1_CAR", CONV_PRIORITY_MEDIUM)
set_entity_proofs(player_ped_id(), false, false, false, false, false)
//reset's the god text
SET_LABEL_AS_TRIGGERED("METH_GOD_18", false)
// piggy back in here
SET_INSTANCE_PRIORITY_HINT( INSTANCE_HINT_SHOOTING )
endproc
///PURPOSE: Proofs the player for 1.5 seconds after the grenade launcher cutscene incase they get shot whilst going into cover
proc proofing_system_after_grenade_launcher_cutscene()
if not stop_player_proofing
if player_grenade_launcher_cutscene_status = 99
if lk_timer(proofing_time, 1500)
set_entity_proofs(player_ped_id(), false, false, false, false, false)
stop_player_proofing = true
else
set_entity_proofs(player_ped_id(), true, true, true, true, true)
endif
endif
endif
endproc
func bool wave_2_master_flow_system()
// printint(wave_2_master_flow_system_status)
// printnl()
// @SBA - if player picks up grenade launcher himself, set correct ammo ammount
SET_AMMO_FOR_PICKED_UP_GRENADE_LAUNCHER()
switch wave_2_master_flow_system_status
case 0
CPRINTLN(DEBUG_MISSION,"wave_2_master_flow_system: wave_2_master_flow_system_status = ", wave_2_master_flow_system_status)
//truck arriving at the back
SETUP_ENEMY_VEHICLE(wave_2_enemy_vehicle[2])
start_playback_recorded_vehicle(wave_2_enemy_vehicle[2].veh, wave_2_enemy_vehicle[2].recording_number, "lkmethlab")
setup_enemy_in_vehicle(wave_2_enemy[0], wave_2_enemy_vehicle[2].veh)
setup_enemy_in_vehicle(wave_2_enemy[1], wave_2_enemy_vehicle[2].veh, vs_front_right)
setup_enemy_in_vehicle(wave_2_enemy[2], wave_2_enemy_vehicle[2].veh, vs_back_left)
setup_enemy_in_vehicle(wave_2_enemy[3], wave_2_enemy_vehicle[2].veh, vs_back_right)
// @SBA - make grenade launcher pickup
SETUP_GRENADE_LAUNCHER_PICKUP()
RESET_CHEF_WARNINGS_FOR_NEXT_WAVE()
// piggy back in here
SET_INSTANCE_PRIORITY_HINT( INSTANCE_HINT_SHOOTING )
wave_2_master_flow_system_status++
CPRINTLN(DEBUG_MISSION,"wave_2_master_flow_system: GOING TO wave_2_master_flow_system_status = ", wave_2_master_flow_system_status)
break
// Splitting up the enemy creation somewhat
CASE 1
SETUP_ENEMY_VEHICLE(wave_2_enemy_vehicle[3])
start_playback_recorded_vehicle(wave_2_enemy_vehicle[3].veh, wave_2_enemy_vehicle[3].recording_number, "lkmethlab")
setup_enemy_in_vehicle(wave_2_enemy[4], wave_2_enemy_vehicle[3].veh)
wave_2_master_flow_system_status++
CPRINTLN(DEBUG_MISSION,"wave_2_master_flow_system: GOING TO wave_2_master_flow_system_status = ", wave_2_master_flow_system_status)
BREAK
CASE 2
SETUP_ENEMY_VEHICLE(wave_2_enemy_vehicle[4])
start_playback_recorded_vehicle(wave_2_enemy_vehicle[4].veh, wave_2_enemy_vehicle[4].recording_number, "lkmethlab")
skip_time_in_playback_recorded_vehicle(wave_2_enemy_vehicle[4].veh, 4500)
setup_enemy_in_vehicle(wave_2_enemy[5], wave_2_enemy_vehicle[4].veh)
wave_2_master_flow_system_status++
CPRINTLN(DEBUG_MISSION,"wave_2_master_flow_system: GOING TO wave_2_master_flow_system_status = ", wave_2_master_flow_system_status)
BREAK
case 3
if is_player_infront_of_door() //or lk_timer(original_time, 15000)
// @SBA - canceling this here - it was causing the script to hang on a z-menu restart from earlier checkpoints
// if the event had never triggered
CANCEL_MUSIC_EVENT("CHN1_G_LAUNCHER")
trigger_music_event("CHN1_BACK_ROOF")
SETUP_ENEMY_VEHICLE(wave_2_enemy_vehicle[6])
start_playback_recorded_vehicle(wave_2_enemy_vehicle[6].veh, wave_2_enemy_vehicle[6].recording_number, "lkmethlab")
setup_enemy_in_vehicle(wave_2_enemy[18], wave_2_enemy_vehicle[6].veh)
setup_enemy_in_vehicle(wave_2_enemy[19], wave_2_enemy_vehicle[6].veh, vs_front_right)
kill_face_to_face_conversation()
wave_2_dialogue_system_status = 3
bBackStairsDoorClosed = FALSE
wave_2_master_flow_system_status++
CPRINTLN(DEBUG_MISSION,"wave_2_master_flow_system: GOING TO wave_2_master_flow_system_status = ", wave_2_master_flow_system_status)
ELIF NOT bChefComeOn
IF buddy_on_rooftop()
wave_2_dialogue_system_status = 2
ENDIF
endif
break
case 4
// Shutting door to improve frame rate
IF NOT bBackStairsDoorClosed
BOOL bShutDoor
IF buddy_on_rooftop()
IF IS_PLAYER_IN_TRIGGER_BOX(tbBackRoofVolume)
bShutDoor = TRUE
ELIF NOT IS_SPHERE_VISIBLE(vDoorToBackStairs, 1.0)
bShutDoor = TRUE
ENDIF
IF bShutDoor
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ss_doorext, vDoorToBackStairs, FALSE, 0.0, 0.0, 0.0)
bBackStairsDoorClosed = TRUE
ENDIF
ENDIF
ENDIF
if (ped_structure_get_total_number_of_enemies_dead(wave_2_enemy) >= 4) //5
//CPRINTLN(DEBUG_MISSION,"wave_2_master_flow_system: Enough enemies are dead!")
IF prepare_music_event("CHN1_G_LAUNCHER")
//CPRINTLN(DEBUG_MISSION,"wave_2_master_flow_system: music prepared!")
// @SBA - if the player has already gotten the grenade launcher, don't bother with the cutscene
IF NOT bSkipGrenLaunchCutscene
// @SBA - also ensure no living enemey is on the roof or back room (may need a wider check than this?)
IF NOT IS_ANY_PED_IN_TRIGGER_BOX(wave_2_enemy, tbBackRoofVolume)
IF NOT IS_ANY_PED_IN_TRIGGER_BOX(wave_2_enemy, tbBackUpstairsRoomVolume)
AND NOT IS_ANY_PED_IN_SPECIFIC_ROOM(wave_2_enemy, (<<1392.2, 3614.1, 39.0>>), "v_39_UpperRm1")
CPRINTLN(DEBUG_MISSION,"*** GOING TO GRENADE LAUNCHER CUTSCENE ***")
// @SBA - we don't want the player to pick up the launcher while waiting for the cutscene to play
//SET_PLAYER_PERMITTED_TO_COLLECT_PICKUPS_OF_TYPE(PLAYER_ID(), PICKUP_WEAPON_GRENADELAUNCHER, FALSE)
cutscene_trigger_time = get_game_timer()
set_label_as_triggered("chin_roof_0", FALSE)
wave_2_master_flow_system_status++
CPRINTLN(DEBUG_MISSION,"wave_2_master_flow_system: GOING TO wave_2_master_flow_system_status = ", wave_2_master_flow_system_status)
ENDIF
ENDIF
// @SBA - skipping cutscene
ELSE
CPRINTLN(DEBUG_MISSION,"*** SKIPPING THE GRENADE LAUNCHER CUTSCENE ***")
wave_2_master_flow_system_status++
CPRINTLN(DEBUG_MISSION,"wave_2_master_flow_system: GOING TO wave_2_master_flow_system_status = ", wave_2_master_flow_system_status)
ENDIF
endif
ENDIF
break
case 5
// @SBA - are we to play the cutscene?
IF NOT bSkipGrenLaunchCutscene
if player_grenade_launcher_cutscene_system()
//ram cutscene is done ingame. We can not see the vehicles warping if they need to be reset. Adding this here as it is a safe place after the camera cut.
reset_wave_0_vehicles_for_ram_gates_cutscene(true)
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(3, "Wave 2 after grenade launcher cutscene")
wave_2_master_flow_system_status++
CPRINTLN(DEBUG_MISSION,"wave_2_master_flow_system: FROM CUTSCENE, GOING TO wave_2_master_flow_system_status = ", wave_2_master_flow_system_status)
else
//create peds when player is not near the cook to get the grenade launcher
if not grenade_launcher_cutscene_playing
if lk_timer(cutscene_trigger_time, 2000)
create_second_wave_of_wave_2_enemies()
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(3, "Wave 2 after grenade launcher cutscene")
wave_2_master_flow_system_status++
CPRINTLN(DEBUG_MISSION,"wave_2_master_flow_system: FROM WAITING FOR CUTSCENE, GOING TO wave_2_master_flow_system_status = ", wave_2_master_flow_system_status)
endif
endif
endif
// @SBA - if cutscene skipped, just do this stuff and advance
ELSE
// if lk_timer(cutscene_trigger_time, 2000)
create_second_wave_of_wave_2_enemies()
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(3, "Wave 2 after grenade launcher cutscene")
wave_2_master_flow_system_status++
CPRINTLN(DEBUG_MISSION,"wave_2_master_flow_system: FROM SKIPPED CUTSCENE, GOING TO wave_2_master_flow_system_status = ", wave_2_master_flow_system_status)
// endif
ENDIF
break
case 6
// fade in if needed (replay)
IF NOT IS_SCREEN_FADED_IN()
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
ENDIF
// @SBA - are we playing the cutscene?
IF NOT bSkipGrenLaunchCutscene
player_grenade_launcher_cutscene_system()
proofing_system_after_grenade_launcher_cutscene()
ENDIF
// handler for next vehicle full o' bad guys
create_third_wave_of_wave_2_enemies()
//if enemy 6, 7, 8, 9 are dead elif not vehicle driveable 0 1 or car recording not going on
if is_vehicle_driveable(wave_2_enemy_vehicle[0].veh)
if not is_playback_going_on_for_vehicle(wave_2_enemy_vehicle[0].veh)
setup_final_wave_of_wave_2()
wave_2_master_flow_system_status++
endif
else
setup_final_wave_of_wave_2()
wave_2_master_flow_system_status++
CPRINTLN(DEBUG_MISSION,"wave_2_master_flow_system: GOING TO wave_2_master_flow_system_status = ", wave_2_master_flow_system_status)
endif
break
case 7
// @SBA - are we playing the cutscene?
IF NOT bSkipGrenLaunchCutscene
player_grenade_launcher_cutscene_system()
proofing_system_after_grenade_launcher_cutscene()
ENDIF
if not grenade_launcher_cutscene_playing
if ped_structure_are_all_enemies_dead(wave_2_enemy) //@SBA should we set to TRUE to keep dead bodies?
//if get_distance_between_coords(get_entity_coords(player_ped_id()), get_entity_coords(buddy.ped)) < 30.00
//request ortega model if ortega has not been killed in trevor 1
if not GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_ORTEGA_KILLED)
request_model(get_npc_ped_model(char_ortega))
endif
clear_prints()
// Clean up last arriving vehicle blip, if needed
REMOVE_VEHICLE_BLIP(wave_2_enemy_vehicle[5])
//create_conversation(scripted_speech[0], "methaud", "CHIN1_GO", conv_priority_medium)
KILL_FACE_TO_FACE_CONVERSATION()
ADD_NON_CRITICAL_STANDARD_CONVERSATION_TO_BUFFER(scripted_speech[0], "methaud", "CHIN1_GO", CONV_PRIORITY_MEDIUM)
original_time = get_game_timer()
wave_2_master_flow_system_status++
CPRINTLN(DEBUG_MISSION,"wave_2_master_flow_system: GOING TO wave_2_master_flow_system_status = ", wave_2_master_flow_system_status)
// else
//
// if not has_label_been_triggered("METH_GOD_18")
// print_now("METH_GOD_18", default_god_text_time, 1)
// SET_LABEL_AS_TRIGGERED("METH_GOD_18", true)
// endif
//endif
endif
endif
break
case 8
if not GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_ORTEGA_KILLED)
request_model(get_npc_ped_model(char_ortega))
endif
if lk_timer(original_time, 500)
// if (not GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_ORTEGA_KILLED) and has_model_loaded(get_npc_ped_model(char_ortega)))
// or GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_ORTEGA_KILLED)
// script_assert("test")
// return true
// endif
if (not GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_ORTEGA_KILLED) and has_model_loaded(get_npc_ped_model(char_ortega)))
or GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_ORTEGA_KILLED)
if is_audio_scene_active("CHI_1_SHOOTOUT_03")
stop_audio_scene("CHI_1_SHOOTOUT_03")
endif
if is_audio_scene_active("CHI_1_SHOOTOUT_GRENADE_LAUNCHER")
stop_audio_scene("CHI_1_SHOOTOUT_GRENADE_LAUNCHER")
endif
start_audio_scene("CHI_1_GET_TO_SHOOTOUT_04")
trigger_music_event("CHN1_FIRST_FLOOR")
return true
endif
endif
//EQUIP_BEST_PLAYER_WEAPON()
break
case 22
break
endswitch
return false
endfunc
//@SBA - plays a line from an enemy (if one's alive) when a grenade goes off
PROC HANDLE_ENEMY_GREN_LAUNCH_DIALOGUE()
SWITCH iEnemyGrenLaunchDialogue
CASE 0
// check for grenade explosion
IF is_grenade_launcher_explosion_in_car_park()
// start a timer so dialogue doesn't happen during the explosion
START_TIMER_NOW(tmrGrenLaunchTimer)
iEnemyGrenLaunchDialogue ++
CPRINTLN(DEBUG_MISSION,"HANDLE_ENEMY_GREN_LAUNCH_DIALOGUE: Boom! Going to: ", iEnemyGrenLaunchDialogue)
ENDIF
BREAK
CASE 1
// When timer is up, try to find a living ped to say the dialogue
IF TIMER_DO_ONCE_WHEN_READY(tmrGrenLaunchTimer, kfGrenLaunchWaitTime)
// Check backyard for a living enemy
piEnemyToSpeak = GET_FIRST_LIVING_PED_IN_TRIGGER_BOX(wave_2_enemy,tbBackYardVolume)
// another bite at the apple to find a living enenmy
IF piEnemyToSpeak = NULL
piEnemyToSpeak = GET_FIRST_LIVING_PED_IN_TRIGGER_BOX(wave_2_enemy,tbBackGateVolume)
ENDIF
// Remove old data and assign a speaker, if there is one available
IF piEnemyToSpeak != NULL
ADD_PED_FOR_DIALOGUE(scripted_speech[0], 8, piEnemyToSpeak, "VAGOS")
ENDIF
// Canceling timer for some additional safety
CANCEL_TIMER(tmrGrenLaunchTimer)
iEnemyGrenLaunchDialogue ++
CPRINTLN(DEBUG_MISSION,"HANDLE_ENEMY_GREN_LAUNCH_DIALOGUE: Going to: ", iEnemyGrenLaunchDialogue)
ENDIF
BREAK
CASE 2
// Play conversation if we have a valid ped and if nothing else is displayed
IF piEnemyToSpeak != NULL
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(locates_data)
IF CREATE_CONVERSATION(scripted_speech[0], "methaud", "chin_GREN", CONV_PRIORITY_HIGH)
iEnemyGrenLaunchDialogue ++
CPRINTLN(DEBUG_MISSION,"HANDLE_ENEMY_GREN_LAUNCH_DIALOGUE: Going to: ", iEnemyGrenLaunchDialogue)
ENDIF
ENDIF
ENDIF
BREAK
CASE 3
// nothing
BREAK
ENDSWITCH
ENDPROC
proc wave_2_dialogue_system()
// @SBA - in case enemies get inside
HANDLE_CHEF_INFILTRATION_WARNINGS_WAVE_2()
// @SBA - enemy line after first explosion
HANDLE_ENEMY_GREN_LAUNCH_DIALOGUE()
switch wave_2_dialogue_system_status
case 0
prepare_music_event("CHN1_HEAD_TO_BACK")
IF NOT bPlayGunFire
PLAY_SOUND_FROM_COORD(-1, "CR_WEAPONS_BURST_SHORT", (<<1586.9836, 3695.9495, 33.9163>>))
CPRINTLN(DEBUG_MISSION, "Should be playing gunfire sound")
bPlayGunFire = TRUE
elif create_conversation(scripted_speech[0], "methaud", "chang_info0", conv_priority_medium)
REPLAY_RECORD_BACK_FOR_TIME(5.0, 6.0)
trigger_music_event("CHN1_HEAD_TO_BACK")
wave_2_dialogue_system_status++
endif
break
case 1
if not is_scripted_conversation_ongoing()
// @SBA - give player instruction instead
// if create_conversation(scripted_speech[0], "methaud", "chin_follow0", conv_priority_medium)
PRINT_NOW("METH_GOD_3", DEFAULT_GOD_TEXT_TIME, 1) // Follow Chef
wave_2_dialogue_system_status = 22
// endif
endif
break
CASE 2
IF IS_PLAYER_IN_TRIGGER_BOX(tbBackFullRoofVolume)
wave_2_dialogue_system_status = 22
bChefComeOn = TRUE
EXIT
ENDIF
if not is_any_text_being_displayed(locates_data)
IF create_conversation(scripted_speech[0], "methaud", "chin_comeon", conv_priority_medium)
wave_2_dialogue_system_status = 22
bChefComeOn = TRUE
ENDIF
ENDIF
BREAK
case 3
if create_conversation(scripted_speech[0], "methaud", "buddy_cover", conv_priority_medium)
wave_2_dialogue_system_status++
endif
break
case 4
if not is_scripted_conversation_ongoing()
wave_2_dialogue_system_status++
endif
break
case 5
break
endswitch
if lk_timer(dialogue_time, 13000)
if is_ped_shooting(player_ped_id())
if not is_any_text_being_displayed(locates_data)
if is_enemy_near_player(wave_2_enemy, 50.00)
if create_conversation(scripted_speech[0], "methaud", "attack_0", conv_priority_low)
dialogue_time = get_game_timer()
endif
endif
endif
endif
endif
endproc
proc wave_2_buddy_ai_system()
if allow_buddy_ai_system
// @SBA - handle Chef adandonment during wave 2 fight
IF NOT wave_2_complete
IF buddy_on_rooftop()
HANDLE_WAVE_2_CHEF_DEMISE()
HANDLE_ABANDONMENT_MESSAGE(HAS_PLAYER_ABANDONED_CHEF_WAVE_2())
ENDIF
HANDLE_CHEF_DAMAGED_DIALOGUE()
ENDIF
switch wave_2_buddy_ai_system_status
case 0
// @SBA - make sure Chef's health is set to max for this wave
SET_HEALTH_FOR_PED(buddy.ped, buddy.health)
SET_PED_PATH_CAN_USE_CLIMBOVERS(buddy.ped, true)
SET_PED_CAN_PEEK_IN_COVER(buddy.ped, TRUE)
set_ped_accuracy(buddy.ped, 40)
set_blocking_of_non_temporary_events(buddy.ped, true)
clear_ped_tasks(buddy.ped)
if is_ped_in_specific_room(buddy.ped, <<1390.91, 3608.21, 38.91>>, "V_39_UpperRm3")
buddy_waypoint_target_node = 16
buddy_waypoint_string = "methlab1"
open_sequence_task(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(null, buddy_waypoint_string, 2, EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS) // EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT | EWAYPOINT_START_FROM_CLOSEST_POINT |
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
else
buddy_waypoint_target_node = 19//23
buddy_waypoint_string = "methlab5"
open_sequence_task(seq)
task_follow_nav_mesh_to_coord(null, <<1387.2665, 3615.9451, 37.9259>>, PEDMOVE_WALK, -1, default_navmesh_radius, enav_no_stopping)
TASK_FOLLOW_WAYPOINT_RECORDING(null, buddy_waypoint_string, 2, EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS) // EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT | EWAYPOINT_START_FROM_CLOSEST_POINT |
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
endif
buddy_time = get_game_timer()
wave_2_buddy_ai_system_status++
break
case 1
SET_PED_RESET_FLAG(buddy.ped, PRF_UseKinematicPhysics, TRUE)
if IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(buddy.ped)
WAYPOINT_PLAYBACK_OVERRIDE_SPEED(buddy.ped, 2.0)
endif
if waypoint_recording_get_coord(buddy_waypoint_string, buddy_waypoint_target_node, target_waypoint_pos)
if not IS_ENTITY_AT_COORD(buddy.ped, target_waypoint_pos, <<1.0, 1.0, 1.6>>, false, true)
if has_ped_task_finished_2(buddy.ped, script_task_perform_sequence)
if waypoint_recording_get_closest_waypoint(buddy_waypoint_string, GET_ENTITY_COORDS(buddy.ped), waypoint_node_pos)
waypoint_node_pos += 1
if waypoint_node_pos > buddy_waypoint_target_node
waypoint_node_pos = buddy_waypoint_target_node
endif
set_blocking_of_non_temporary_events(buddy.ped, true)
clear_ped_tasks(buddy.ped)
open_sequence_task(seq)
task_follow_waypoint_recording(null, buddy_waypoint_string, waypoint_node_pos, EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT | EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS)
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
endif
// failsafe in case Chef get stuck somewhere
ELIF lk_timer(buddy_time, 15000)
OR IS_PLAYER_IN_TRIGGER_BOX(tbBackRoofVolume)
IF NOT buddy_on_rooftop()
wave_2_buddy_ai_system_status = 3
ENDIF
endif
else
use_main_cover_point = true
refresh_the_task = false
// if not IS_PLAYER_STEALING_PEDS_DESTINATION(buddy.ped, buddy_cover_point_data[2].pos, 2.0)
//
// open_sequence_task(seq)
// task_put_ped_directly_into_cover(null, buddy_cover_point_data[2].pos, -1)
// close_sequence_task(seq)
// task_perform_sequence(buddy.ped, seq)
// clear_sequence_task(seq)
//
// else
//
// open_sequence_task(seq)
// task_follow_nav_mesh_to_coord(null, buddy_cover_point_data[3].pos, pedmove_run, -1, 0.5)
// //task_put_ped_directly_into_cover(null, <<1408.0914, 3614.9163, 37.9421>>, -1)
// close_sequence_task(seq)
// task_perform_sequence(buddy.ped, seq)
// clear_sequence_task(seq)
//
// endif
wave_2_buddy_ai_system_status++
endif
endif
break
case 2
if buddy_on_rooftop()
if not is_ped_in_cover(buddy.ped)
buddy_time = get_game_timer()
//could make function return true once in cover for 1000ms
get_buddy_into_cover(buddy.ped, buddy_cover_point_data[2], buddy_cover_point_data[3], use_main_cover_point, refresh_the_task)
else
if lk_timer(buddy_time, 1000)
set_blocking_of_non_temporary_events(buddy.ped, false)
set_ped_sphere_defensive_area(buddy.ped, <<1406.70, 3615.67, 38.01>>, 2.0)
//use is check for buddy_cover_point_data[2] and buddy_cover_point_data[3]
//for setting sphere
if not is_ped_injured(wave_2_enemy[6].ped)
task_combat_ped(buddy.ped, wave_2_enemy[6].ped)
elif not is_ped_injured(wave_2_enemy[7].ped)
task_combat_ped(buddy.ped, wave_2_enemy[7].ped)
endif
wave_2_buddy_ai_system_status++
endif
endif
else
set_blocking_of_non_temporary_events(buddy.ped, true)
clear_ped_tasks(buddy.ped)
open_sequence_task(seq)
task_follow_nav_mesh_to_coord(null, <<1406.70, 3615.67, 38.01>>, pedmove_run, -1)
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
wave_2_buddy_ai_system_status = 4
endif
break
case 3
if not buddy_on_rooftop()
set_blocking_of_non_temporary_events(buddy.ped, true)
clear_ped_tasks(buddy.ped)
open_sequence_task(seq)
task_follow_nav_mesh_to_coord(null, <<1406.70, 3615.67, 38.01>>, pedmove_run, -1)
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
wave_2_buddy_ai_system_status = 4
endif
break
case 4
if has_ped_task_finished_2(buddy.ped, script_task_perform_sequence)
if buddy_on_rooftop()
wave_2_buddy_ai_system_status = 2
else
wave_2_buddy_ai_system_status = 3
endif
endif
break
endswitch
endif
endproc
proc wave_2_assisted_nodes_system()
switch wave_2_assisted_nodes_system_status
case 0
ASSISTED_MOVEMENT_REQUEST_ROUTE("Wave01457s")
wave_2_assisted_nodes_system_status++
break
case 1
if wave_2_master_flow_system_status > 7
ASSISTED_MOVEMENT_remove_ROUTE("Wave01457s")
wave_2_assisted_nodes_system_status++
endif
break
case 2
break
case 3
break
case 22
break
endswitch
endproc
proc wave_2_vehicle_destruction_system()
// vector front_left_offset = <<-0.78, 1.4, -0.42>>
// vector front_right_offset = <<0.78, 1.4, -0.42>>
// vector rear_right_offset = <<0.78, -1.47, -0.42>>
// vector rear_left_offset = <<-0.78, -1.47, -0.42>>
// float radius_check = 1.22
vector bullet_front_left_offset = <<-0.78, 1.32, -0.4>>
vector bullet_front_right_offset = <<0.78, 1.32, -0.4>>
vector bullet_back_right_offset = <<0.78, -1.64, -0.4>>
vector bullet_back_left_offset = <<-0.78, -1.64, -0.4>>
float bullet_radius_check = 1.55
vector deformation_front_left_offset = <<0.900, 1.340, 0.15>>
vector deformation_front_right_offset = <<-0.900, 1.30, 0.15>>
vector deformation_back_left_offset = <<-0.900, -1.3, 0.15>>
vector deformation_back_right_offset = <<0.9, -1.3, 0.15>>
float damage = 140.00
float deformation = 140.00
if is_player_control_on(player_id())
for i = 0 to count_of(wave_2_enemy_vehicle) - 1
if i <> 3
and i <> 4
if is_vehicle_driveable(wave_2_enemy_vehicle[i].veh)
//POSSIBLY MAKE A FUNCTION OUT OF THIS AND PASS IN 8 PARAMETERS
if HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(wave_2_enemy_vehicle[i].veh, bullet_front_left_offset), bullet_radius_check)
if not is_vehicle_tyre_burst(wave_2_enemy_vehicle[i].veh, sc_wheel_car_front_left)
SET_VEHICLE_TYRE_BURST(wave_2_enemy_vehicle[i].veh, sc_wheel_car_front_left)
SET_VEHICLE_DAMAGE(wave_2_enemy_vehicle[i].veh, deformation_front_left_offset, damage, deformation, true)
SMASH_VEHICLE_WINDOW(wave_2_enemy_vehicle[i].veh, sc_window_front_left)
endif
endif
if HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(wave_2_enemy_vehicle[i].veh, bullet_front_right_offset), bullet_radius_check)
if not is_vehicle_tyre_burst(wave_2_enemy_vehicle[i].veh, sc_wheel_car_front_right)
SET_VEHICLE_TYRE_BURST(wave_2_enemy_vehicle[i].veh, sc_wheel_car_front_right)
SET_VEHICLE_DAMAGE(wave_2_enemy_vehicle[i].veh, deformation_front_right_offset, damage, deformation, true)
SMASH_VEHICLE_WINDOW(wave_2_enemy_vehicle[i].veh, sc_window_front_right)
endif
endif
if HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(wave_2_enemy_vehicle[i].veh, bullet_back_left_offset), bullet_radius_check)
if not is_vehicle_tyre_burst(wave_2_enemy_vehicle[i].veh, sc_wheel_car_rear_left)
SET_VEHICLE_TYRE_BURST(wave_2_enemy_vehicle[i].veh, sc_wheel_car_rear_left)
SET_VEHICLE_DAMAGE(wave_2_enemy_vehicle[i].veh, deformation_back_left_offset, damage, deformation, true)
SMASH_VEHICLE_WINDOW(wave_2_enemy_vehicle[i].veh, sc_window_rear_left)
endif
endif
if HAS_BULLET_IMPACTED_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(wave_2_enemy_vehicle[i].veh, bullet_back_right_offset), bullet_radius_check)
if not is_vehicle_tyre_burst(wave_2_enemy_vehicle[i].veh, sc_wheel_car_rear_right)
SET_VEHICLE_TYRE_BURST(wave_2_enemy_vehicle[i].veh, sc_wheel_car_rear_right)
SET_VEHICLE_DAMAGE(wave_2_enemy_vehicle[i].veh, deformation_back_right_offset, damage, deformation, true)
SMASH_VEHICLE_WINDOW(wave_2_enemy_vehicle[i].veh, sc_window_rear_right)
endif
endif
endif
endif
endfor
endif
endproc
proc wave_2_audio_scene_system()
switch wave_2_audio_scene_system_status
case 0
if is_player_infront_of_door()
if is_audio_scene_active("CHI_1_GET_TO_SHOOTOUT_03")
stop_AUDIO_SCENE("CHI_1_GET_TO_SHOOTOUT_03")
endif
start_audio_scene("CHI_1_SHOOTOUT_03")
wave_2_audio_scene_system_status++
endif
break
case 1
if grenade_launcher_cutscene_playing
if is_audio_scene_active("CHI_1_SHOOTOUT_03")
stop_AUDIO_SCENE("CHI_1_SHOOTOUT_03")
endif
start_audio_scene("CHI_1_CATCH_GRENADE_LAUNCHER")
wave_2_audio_scene_system_status++
endif
break
case 2
if not grenade_launcher_cutscene_playing
if is_audio_scene_active("CHI_1_CATCH_GRENADE_LAUNCHER")
stop_AUDIO_SCENE("CHI_1_CATCH_GRENADE_LAUNCHER")
endif
start_audio_scene("CHI_1_SHOOTOUT_GRENADE_LAUNCHER")
wave_2_audio_scene_system_status++
endif
break
case 3
break
endswitch
endproc
func bool chinese_wave_2_system()
// @SBA - B*1195400 - rarely, a ped falls through the world and cannot be killed in game play
// this kills him if he is below ground
KILL_ANY_ERRANT_ENEMY(wave_2_enemy)
// @SBA - handle dead vehicle blips
REMOVE_DEAD_VEHICLE_BLIPS(wave_2_enemy_vehicle)
if wave_2_master_flow_system()
mission_flow = wave_3_system
return true
endif
wave_2_dialogue_system()
wave_2_buddy_ai_system()
//wave_2_vehicle_destruction_system()
wave_2_assisted_nodes_system()
wave_2_ai_system()
wave_2_audio_scene_system()
if is_ped_inside_interior(player_ped_id(), <<1392.7360, 3602.5989, 38.5>>, "v_methlab")
SET_RADAR_AS_EXTERIOR_THIS_FRAME()
endif
return false
endfunc
PROC DO_ICE_BOX_OBJECTIVE_STUFF()
// Print objective
IF NOT HAS_LABEL_BEEN_TRIGGERED("METH_GOD_20")
PRINT_NOW("METH_GOD_20", default_god_text_time, 1) // Go To Icebox
SET_LABEL_AS_TRIGGERED("METH_GOD_20", TRUE)
ENDIF
// remove buddy blip
IF DOES_BLIP_EXIST(buddy.blip)
REMOVE_BLIP(buddy.blip)
ENDIF
// display ice box blip
IF NOT does_blip_exist(ice_box_blip)
ice_box_blip = create_blip_for_coord(<<1388.0475, 3598.6162, 33.8954>>)
ENDIF
// Start timer for next dialogue
CANCEL_TIMER(tmrIceBoxReminder)
START_TIMER_NOW(tmrIceBoxReminder)
ENDPROC
PROC SET_ICY_VERSIONS_OF_PEDS()
IF NOT IS_PED_INJURED(cheng.ped)
SET_PED_COMPONENT_VARIATION(cheng.ped, PED_COMP_HEAD, 0, 1)
SET_PED_COMPONENT_VARIATION(cheng.ped, PED_COMP_BERD, 0, 0)
SET_PED_COMPONENT_VARIATION(cheng.ped, PED_COMP_HAIR, 0, 1)
SET_PED_COMPONENT_VARIATION(cheng.ped, PED_COMP_TORSO, 2, 1)
SET_PED_COMPONENT_VARIATION(cheng.ped, PED_COMP_LEG, 0, 1)
SET_PED_COMPONENT_VARIATION(cheng.ped, PED_COMP_HAND, 0, 1)
SET_PED_COMPONENT_VARIATION(cheng.ped, PED_COMP_FEET, 0, 0)
SET_PED_COMPONENT_VARIATION(cheng.ped, PED_COMP_TEETH, 0, 0)
SET_PED_COMPONENT_VARIATION(cheng.ped, PED_COMP_SPECIAL, 0, 0)
SET_PED_COMPONENT_VARIATION(cheng.ped, PED_COMP_SPECIAL2, 0, 0)
SET_PED_COMPONENT_VARIATION(cheng.ped, PED_COMP_DECL, 0, 0)
SET_PED_COMPONENT_VARIATION(cheng.ped, PED_COMP_JBIB, 1, 1)
SET_PED_PROP_INDEX(cheng.ped, ANCHOR_EYES,0)
ENDIF
IF NOT IS_PED_INJURED(translator.ped)
SET_PED_COMPONENT_VARIATION(translator.ped, PED_COMP_HEAD, 0, 1)
SET_PED_COMPONENT_VARIATION(translator.ped, PED_COMP_BERD, 0, 0)
SET_PED_COMPONENT_VARIATION(translator.ped, PED_COMP_HAIR, 0, 1)
SET_PED_COMPONENT_VARIATION(translator.ped, PED_COMP_TORSO, 1, 1)
SET_PED_COMPONENT_VARIATION(translator.ped, PED_COMP_LEG, 1, 1)
SET_PED_COMPONENT_VARIATION(translator.ped, PED_COMP_HAND, 0, 1)
SET_PED_COMPONENT_VARIATION(translator.ped, PED_COMP_FEET, 0, 0)
SET_PED_COMPONENT_VARIATION(translator.ped, PED_COMP_TEETH, 0, 0)
SET_PED_COMPONENT_VARIATION(translator.ped, PED_COMP_SPECIAL, 0, 0)
SET_PED_COMPONENT_VARIATION(translator.ped, PED_COMP_SPECIAL2, 1, 1)
SET_PED_COMPONENT_VARIATION(translator.ped, PED_COMP_DECL, 0, 0)
SET_PED_COMPONENT_VARIATION(translator.ped, PED_COMP_JBIB, 1, 0)
SET_PED_PROP_INDEX(translator.ped, ANCHOR_EYES,0)
ENDIF
ENDPROC
func bool wave_3_master_flow_system()
HANDLE_VEHICLE_TOO_NEAR_ICE_BOX()
switch wave_3_master_flow_system_status
case 0
if IS_ENTITY_IN_ANGLED_AREA(player_ped_id(), <<1400.846, 3602.507, 28.946>>, <<1394.636, 3619.827, 48.946>>, 23.1)
// @SBA - expanded this box to get Chef engaged sooner (else he stands around until player gets in)
//if IS_ENTITY_IN_ANGLED_AREA(player_ped_id(), <<1395.901, 3609.122, 33.986>>, <<1395.250, 3610.800, 36.986>>, 1.5)
IF IS_ENTITY_IN_ANGLED_AREA( PLAYER_PED_ID(), <<1396.791016,3609.446289,33.980907>>, <<1395.188354,3613.933838,35.480907>>, 2.250000)
//create_vehicle and skip
setup_wave_3_enemies()
// @SBA - Shutting outer doors to help with frame rate
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ss_doorext, vBackDoorToRoof, FALSE, 0.0, 0.0, 0.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ss_doorext, vDoorToBackStairs, FALSE, 0.0, 0.0, 0.0)
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(4, "Wave 3", true)
wave_3_master_flow_system_status++
// @SBA - grrrr
REQUEST_MODEL(cheng.model)
REQUEST_MODEL(translator.model)
REQUEST_MODEL(mnIceBox)
REQUEST_MODEL(mnIceBoxProxy)
REQUEST_ANIM_DICT("MissChinese1LeadInOutCHI_1_MCS_4")
endif
else
player_position = GET_ENTITY_COORDS(player_ped_id())
if (player_position.z < 37.00)
//create vehicle and let it run normally - add extra flag to function no_vehicle_recording_skip = false set as true
no_vehicle_recording_skip = true
setup_wave_3_enemies()
// @SBA - Shutting outer doors to help with frame rate
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ss_doorext, vBackDoorToRoof, FALSE, 0.0, 0.0, 0.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ss_doorext, vDoorToBackStairs, FALSE, 0.0, 0.0, 0.0)
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(4, "Wave 3", true)
wave_3_master_flow_system_status++
// @SBA - grrrr
REQUEST_MODEL(cheng.model)
REQUEST_MODEL(translator.model)
REQUEST_MODEL(mnIceBox)
REQUEST_MODEL(mnIceBoxProxy)
REQUEST_ANIM_DICT("MissChinese1LeadInOutCHI_1_MCS_4")
endif
endif
break
case 1
// @SBA - make sure assests have loaded
IF NOT HAS_MODEL_LOADED(cheng.model)
OR NOT HAS_MODEL_LOADED(translator.model)
OR NOT HAS_MODEL_LOADED(mnIceBox)
OR NOT HAS_MODEL_LOADED(mnIceBoxProxy)
OR NOT HAS_ANIM_DICT_LOADED("MissChinese1LeadInOutCHI_1_MCS_4")
CPRINTLN(DEBUG_MISSION, "Final assets not loaded")
RETURN FALSE
ENDIF
IF NOT IS_SCREEN_FADED_IN()
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
ENDIF
if ped_structure_are_all_enemies_dead(wave_3_enemy)
REPLAY_RECORD_BACK_FOR_TIME(3.0)
IF IS_THIS_PRINT_BEING_DISPLAYED("METH_GOD_18")
CLEAR_THIS_PRINT("METH_GOD_18")
ENDIF
// @SBA - cleanup navmesh blocking as we no longer need it
CLEAN_UP_NAVMESH_BLOCKERS()
for i = 0 to count_of(ambient_enemy) - 1
if not is_ped_injured(ambient_enemy[i].ped)
if not does_blip_exist(ambient_enemy[i].blip)
ambient_enemy[i].blip = create_blip_for_ped(ambient_enemy[i].ped, true)
endif
endif
endfor
allow_ambient_enemy_blips_to_flash = true
wave_3_buddy_ai_system_status = 5
//make sure no vehicles are blocking the front door of the lab
for i = 0 to count_of(parked_cars) - 1
if does_entity_exist(parked_cars[i])
if is_entity_in_angled_area(parked_cars[i], <<1393.118, 3598.737, 33.986>>, <<1395.846, 3599.719, 36.986>>, 2.500, false, false)
delete_vehicle(parked_cars[i])
endif
endif
endfor
for i = 0 to count_of(wave_0_enemy_vehicle) - 1
if does_entity_exist(wave_0_enemy_vehicle[i].veh)
if is_entity_in_angled_area(wave_0_enemy_vehicle[i].veh, <<1393.118, 3598.737, 33.986>>, <<1395.846, 3599.719, 36.986>>, 2.500, false, false)
delete_vehicle(wave_0_enemy_vehicle[i].veh)
ELSE
SET_VEHICLE_AS_NO_LONGER_NEEDED(wave_0_enemy_vehicle[i].veh)
endif
endif
endfor
for i = 0 to count_of(wave_2_enemy_vehicle) - 1
if does_entity_exist(wave_2_enemy_vehicle[i].veh)
if is_entity_in_angled_area(wave_2_enemy_vehicle[i].veh, <<1393.118, 3598.737, 33.986>>, <<1395.846, 3599.719, 36.986>>, 2.500, false, false)
delete_vehicle(wave_2_enemy_vehicle[i].veh)
ELSE
SET_VEHICLE_AS_NO_LONGER_NEEDED(wave_2_enemy_vehicle[i].veh)
endif
endif
endfor
for i = 0 to count_of(wave_3_enemy_vehicle) - 1
if does_entity_exist(wave_3_enemy_vehicle[i].veh)
if is_entity_in_angled_area(wave_3_enemy_vehicle[i].veh, <<1393.118, 3598.737, 33.986>>, <<1395.846, 3599.719, 36.986>>, 2.500, false, false)
delete_vehicle(wave_3_enemy_vehicle[i].veh)
endif
endif
endfor
if does_entity_exist(trevors_truck.veh)
if is_entity_in_angled_area(trevors_truck.veh, <<1393.118, 3598.737, 33.986>>, <<1395.846, 3599.719, 36.986>>, 2.500, false, false)
if is_vehicle_driveable(trevors_truck.veh)
set_entity_coords(trevors_truck.veh, <<1409.9990, 3600.4973, 33.8676>>, false)
set_entity_heading(trevors_truck.veh, 108.7487)
else
delete_vehicle(trevors_truck.veh)
endif
endif
endif
// @SBA additional clean up to save some memory
// Ambient enemies now use only GoonModel1, and the peds using GoonModel2 are set to clean up as they die
SET_MODEL_AS_NO_LONGER_NEEDED(GoonModel2)
SET_MODEL_AS_NO_LONGER_NEEDED(pcj)
SET_MODEL_AS_NO_LONGER_NEEDED(Sadler)
IF IS_INTERIOR_READY(meth_interior)
UNPIN_INTERIOR(meth_interior)
ENDIF
// @SBA - allow player access to vehicles again
UNLOCK_ALL_MISSION_VEHICLES()
// @SBA - re-create Cheng and Translator, create box for blend-in
// Then do synchronized scene
setup_buddy(cheng, FALSE)
setup_buddy(translator, FALSE)
// icy version
SET_ICY_VERSIONS_OF_PEDS()
// @SBA - hide old ice box, create new one that can be animated
CREATE_MODEL_HIDE(vIceBoxPos, 2.0, prop_ice_box_01, FALSE)
oiIceBox = CREATE_OBJECT_NO_OFFSET(mnIceBox, vIceBoxPos)
oiIceBoxProxy = CREATE_OBJECT_NO_OFFSET(mnIceBoxProxy, vIceBoxPos)
SET_LABEL_AS_TRIGGERED("METH_GOD_20", FALSE)
cutscene_pos = <<1388.108, 3599.101, 33.89>>
cutscene_rot = <<0.0, 0.0, 110.480>>
CHENG_CUTSCENE_INDEX = CREATE_SYNCHRONIZED_SCENE ( cutscene_pos, cutscene_rot)
TRANSLATOR_CUTSCENE_INDEX = CREATE_SYNCHRONIZED_SCENE ( cutscene_pos, cutscene_rot)
SET_SYNCHRONIZED_SCENE_LOOPED(CHENG_CUTSCENE_INDEX, TRUE)
SET_SYNCHRONIZED_SCENE_LOOPED(TRANSLATOR_CUTSCENE_INDEX, TRUE)
IF NOT IS_PED_INJURED(cheng.ped)
CPRINTLN(DEBUG_MISSION, "Starting Cheng's synched scene: initial loop")
TASK_SYNCHRONIZED_SCENE(cheng.ped, CHENG_CUTSCENE_INDEX, "MissChinese1LeadInOutCHI_1_MCS_4", "CHI_1_MCS_4_TAO_IDLE_1", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
ENDIF
IF NOT IS_PED_INJURED(translator.ped)
CPRINTLN(DEBUG_MISSION, "Starting translator's synched scene: initial loop")
TASK_SYNCHRONIZED_SCENE(translator.ped, TRANSLATOR_CUTSCENE_INDEX, "MissChinese1LeadInOutCHI_1_MCS_4", "CHI_1_MCS_4_TRANSLATOR_IDLE_1", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
ENDIF
IF DOES_ENTITY_EXIST(oiIceBox)
CPRINTLN(DEBUG_MISSION, "THE ICE BOX EXISTS!")
SET_ENTITY_ROTATION(oiIceBox, vIceBoxRot)
CPRINTLN(DEBUG_MISSION, "Starting ice box anims: initial loop")
PLAY_SYNCHRONIZED_ENTITY_ANIM(oiIceBox, CHENG_CUTSCENE_INDEX, "CHI_1_MCS_4_TAO_IDLE_1_FREEZER", "MissChinese1LeadInOutCHI_1_MCS_4", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
SET_ENTITY_COLLISION(oiIceBox, TRUE)
ENDIF
IF DOES_ENTITY_EXIST(oiIceBoxProxy)
CPRINTLN(DEBUG_MISSION, "THE ICE BOX PROXY EXISTS!")
SET_ENTITY_ROTATION(oiIceBoxProxy, vIceBoxRot)
SET_ENTITY_COLLISION(oiIceBoxProxy, FALSE)
ENDIF
// Enemies are dead - turn off now
SET_INSTANCE_PRIORITY_HINT( INSTANCE_HINT_NONE )
//request_cutscene("chi_1_mcs_4_concat")
prepare_music_event("CHN1_FINAL_CS")
START_TIMER_NOW(tmrWave3ChefFailsafe)
REQUEST_SCRIPT_AUDIO_BANK("CHINESE1_ICEBOX")
wave_3_master_flow_system_status++
endif
break
case 2
if wave_3_buddy_ai_system_status >= 8
bTellChefGetInside = TRUE
CANCEL_TIMER(tmrWave3ChefFailsafe)
wave_3_master_flow_system_status++
ELSE
// failsafe in case Chef gets stuck
IF are_all_ambient_entities_dead()
OR TIMER_DO_WHEN_READY(tmrWave3ChefFailsafe, 25.000)
CLEAR_PED_TASKS(buddy.ped)
CANCEL_TIMER(tmrWave3ChefFailsafe)
wave_3_buddy_ai_system_status = 9
wave_3_master_flow_system_status++
ENDIF
endif
break
case 3
IF IS_PED_USING_ACTION_MODE(PLAYER_PED_ID())
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
ENDIF
// Don't bother with blip and objective if player is already in position
IF IS_PLAYER_IN_TRIGGER_BOX(tbIceBoxOuterVol)
// make sure player is not in the store
IF NOT IS_PED_IN_SPECIFIC_ROOM(PLAYER_PED_ID(), (<<1392.3, 3602.9, 35.0>>), "v_39_ShopRm")
// @SBA - starting reminder timer (ensure timer isn't still running first)
// in case player leaves box before we've moved on in next state
CANCEL_TIMER(tmrIceBoxReminder)
START_TIMER_NOW(tmrIceBoxReminder)
wave_3_master_flow_system_status++
// If in the trigger box but also inside, print objective and blip
ELSE
bSetIceBoxBlip = TRUE
wave_3_master_flow_system_status++
ENDIF
ELSE
bSetIceBoxBlip = TRUE
wave_3_master_flow_system_status++
endif
break
case 4
// check larger outer volume around box
IF IS_PLAYER_IN_TRIGGER_BOX(tbIceBoxOuterVol)
// remove buddy blip
IF DOES_BLIP_EXIST(buddy.blip)
REMOVE_BLIP(buddy.blip)
ENDIF
// make sure player is not in the store
IF NOT IS_PED_IN_SPECIFIC_ROOM(PLAYER_PED_ID(), (<<1392.3, 3602.9, 35.0>>), "v_39_ShopRm")
IF not IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
// @SBA - play Trevor line, need to correct speaker number
ADD_PED_FOR_DIALOGUE(scripted_speech[0], 0, player_ped_id(), "trevor")
IF CREATE_CONVERSATION(scripted_speech[0], "methaud", "chin_M4_LI2", CONV_PRIORITY_HIGH)
RETURN TRUE
ENDIF
ENDIF
ENDIF
// @SBA = for B*926673. Adding a reminder.
// removing due to some dialogue rearranging. Might return?
// ELSE
// // timer is done
// IF TIMER_DO_ONCE_WHEN_READY(tmrIceBoxReminder, 25.000)
// // Play dialogue, if you can
// IF NOT HAS_LABEL_BEEN_TRIGGERED("chin_cookice")
// IF NOT IS_ANY_TEXT_BEING_DISPLAYED(locates_data)
// IF CREATE_CONVERSATION(scripted_speech[0], "methaud", "chin_cookice", conv_priority_medium)
// // Don't replay the line after this.
// SET_LABEL_AS_TRIGGERED("chin_cookice", TRUE)
// //wave_3_master_flow_system_status = 3
// ENDIF
// ENDIF
// // Otherwise just repeat objective @SBA - removed per B*1357967, but keeping in case
// //ELSE
// // Go back up to redisplay objective
// //wave_3_master_flow_system_status = 3
// ENDIF
// ENDIF
endif
break
endswitch
return false
endfunc
proc wave_3_dialogue_system()
switch wave_3_dialogue_system_status
case 0
if create_conversation(scripted_speech[0], "methaud", "meth_run1", conv_priority_medium)
wave_3_dialogue_system_status++
endif
break
case 1
if create_conversation(scripted_speech[0], "methaud", "TRESP", conv_priority_medium)
wave_3_dialogue_system_status++
endif
break
case 2
if not is_scripted_conversation_ongoing()
print_now("METH_GOD_3", default_god_text_time, 1)
wave_3_dialogue_system_status++
endif
break
case 3
prepare_music_event("CHN1_LAST_GUYS")
if wave_3_enemy[0].created
if not is_any_text_being_displayed(locates_data)
if create_conversation(scripted_speech[0], "methaud", "chin_doorcov", conv_priority_medium)
trigger_music_event("CHN1_LAST_GUYS")
wave_3_dialogue_system_status++
endif
endif
endif
break
CASE 4
IF NOT bPlayerUsedAbility
SPECIAL_ABILITY_CHARGE_SMALL(PLAYER_ID(), TRUE, TRUE)
IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
PRINT_HELP("METH_help_T_KM",DEFAULT_HELP_TEXT_TIME)
ELSE
PRINT_HELP("METH_help_T",DEFAULT_HELP_TEXT_TIME)
ENDIF
wave_3_dialogue_system_status++
ELSE
wave_3_dialogue_system_status++
ENDIF
dialogue_time_2 = GET_GAME_TIMER()
BREAK
case 5
// slight wait after help
IF NOT lk_timer(dialogue_time_2, 1000)
EXIT
ENDIF
if not is_any_text_being_displayed(locates_data)
if not has_label_been_triggered("chin_seeort")
if not GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_ORTEGA_KILLED)
if not is_ped_injured(wave_3_enemy[0].ped)
if is_ped_on_foot(wave_3_enemy[0].ped)
if create_conversation(scripted_speech[0], "methaud", "chin_seeort", conv_priority_medium)
set_label_as_triggered("chin_seeort", true)
endif
ENDIF
ENDIF
endif
endif
if not has_label_been_triggered("chin_ortega")
if not GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_ORTEGA_KILLED)
if not is_ped_injured(wave_3_enemy[0].ped)
if is_ped_on_foot(wave_3_enemy[0].ped)
if create_conversation(scripted_speech[0], "methaud", "chin_ortega", conv_priority_medium)
set_label_as_triggered("chin_ortega", true)
endif
endif
endif
endif
endif
if (not GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_ORTEGA_KILLED) and not is_ped_injured(wave_3_enemy[0].ped))
if not has_label_been_triggered("chin_alive")
if not is_ped_injured(wave_3_enemy[1].ped)
if is_ped_on_foot(wave_3_enemy[1].ped)
if create_conversation(scripted_speech[0], "methaud", "chin_alive", conv_priority_medium)
set_label_as_triggered("chin_alive", true)
endif
endif
endif
endif
else
if not has_label_been_triggered("chin_dead")
if not is_ped_injured(wave_3_enemy[1].ped)
if is_ped_on_foot(wave_3_enemy[1].ped)
if create_conversation(scripted_speech[0], "methaud", "chin_dead", conv_priority_medium)
set_label_as_triggered("chin_dead", true)
endif
endif
ELSE
// have Chef say Ortega killed if enemy doesn't
IF NOT GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_ORTEGA_KILLED)
IF IS_PED_INJURED(wave_3_enemy[0].ped)
IF NOT HAS_LABEL_BEEN_TRIGGERED("chin_killort")
IF CREATE_CONVERSATION(scripted_speech[0], "methaud", "chin_killort", CONV_PRIORITY_HIGH)
SET_LABEL_AS_TRIGGERED("chin_killort", TRUE)
SET_LABEL_AS_TRIGGERED("chin_dead", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
endif
endif
endif
if (not GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_ORTEGA_KILLED) and not is_ped_injured(wave_3_enemy[0].ped))
if not has_label_been_triggered("chin_alive2")
if not is_ped_injured(wave_3_enemy[2].ped)
if is_ped_on_foot(wave_3_enemy[2].ped)
if create_conversation(scripted_speech[0], "methaud", "chin_alive2", conv_priority_medium)
set_label_as_triggered("chin_alive2", true)
endif
endif
endif
endif
else
if not has_label_been_triggered("chin_dead2")
if not is_ped_injured(wave_3_enemy[1].ped)
if is_ped_on_foot(wave_3_enemy[1].ped)
if create_conversation(scripted_speech[0], "methaud", "chin_dead2", conv_priority_medium)
set_label_as_triggered("chin_dead2", true)
endif
endif
endif
endif
endif
if not has_label_been_triggered("chin_attack2")
if not is_any_text_being_displayed(locates_data)
if not is_ped_injured(wave_3_enemy[3].ped)
if wave_3_status[3] = do_nothing //if enemy is standing right of shop door
if create_conversation(scripted_speech[0], "methaud", "chin_attack2", conv_priority_medium)
set_label_as_triggered("chin_attack2", true)
endif
endif
endif
endif
endif
endif
if wave_3_master_flow_system_status > 1
set_label_as_triggered("chin_end", FALSE)
set_label_as_triggered("chin_cookice", FALSE)
set_label_as_triggered("chin_shout", FALSE)
wave_3_dialogue_system_status++
endif
break
case 6
// Trevor orders Chef back inside
IF bTellChefGetInside
if not is_any_text_being_displayed(locates_data)
if create_conversation(scripted_speech[0], "methaud", "chin_end", conv_priority_medium)
bTellChefGetInside = FALSE
REPLAY_RECORD_BACK_FOR_TIME(3.0, 6.0, REPLAY_IMPORTANCE_HIGHEST)
set_label_as_triggered("chin_end", true)
ENDIF
ENDIF
ELSE
// Chef yells at retreating enemies (if any)
IF NOT HAS_LABEL_BEEN_TRIGGERED("chin_shout")
IF NOT are_all_ambient_entities_dead()
IF NOT HAS_LABEL_BEEN_TRIGGERED("chin_end")
if NOT is_ped_in_specific_room(buddy.ped, (<<1392.3, 3602.9, 35.0>>), "v_39_ShopRm")
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(locates_data)
IF CREATE_CONVERSATION(scripted_speech[0], "methaud", "chin_shout", conv_priority_medium)
set_label_as_triggered("chin_shout", true)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
set_label_as_triggered("chin_shout", true)
ENDIF
ENDIF
ENDIF
// Trevor says he'll let Cheng and translator out
IF NOT HAS_LABEL_BEEN_TRIGGERED("chin_cookice")
IF HAS_LABEL_BEEN_TRIGGERED("chin_end")
OR wave_3_master_flow_system_status > 2
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(locates_data)
IF CREATE_CONVERSATION(scripted_speech[0], "methaud", "chin_cookice", conv_priority_medium)
set_label_as_triggered("chin_cookice", true)
ENDIF
ENDIF
ENDIF
ENDIF
// handle ice box blip, objecitve text, and stuff when told to
IF bSetIceBoxBlip
IF HAS_LABEL_BEEN_TRIGGERED("chin_cookice")
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(locates_data)
DO_ICE_BOX_OBJECTIVE_STUFF()
bSetIceBoxBlip = FALSE
wave_3_dialogue_system_status++
ENDIF
ENDIF
ENDIF
break
case 7
break
endswitch
// printint(wave_3_buddy_ai_system_status)
// printnl()
if lk_timer(dialogue_time, 13000)
if is_ped_shooting(player_ped_id())
if not is_any_text_being_displayed(locates_data)
if is_enemy_near_player(wave_3_enemy, 50.00)
if create_conversation(scripted_speech[0], "methaud", "attack_0", conv_priority_low)
dialogue_time = get_game_timer()
endif
endif
endif
endif
endif
endproc
proc wave_3_buddy_ai_system()
if allow_buddy_ai_system
// @SBA - handle if player leaves Chef during fight
IF NOT wave_3_complete
IF IS_ENTITY_AT_COORD(buddy.ped, (<<1393.76355, 3608.57373, 34.00>>), (<<1.5, 1.5, 2.0>>))
AND wave_3_buddy_ai_system_status > 4
HANDLE_WAVE_3_CHEF_DEMISE()
HANDLE_ABANDONMENT_MESSAGE(HAS_PLAYER_ABANDONED_CHEF_WAVE_3())
ENDIF
HANDLE_CHEF_DAMAGED_DIALOGUE()
ENDIF
switch wave_3_buddy_ai_system_status
case 0
// @SBA - we want to help ensure the player sees the chef run off
START_TIMER_NOW(tmrStartChefMove)
IF IS_ENTITY_ON_SCREEN(buddy.ped)
OR TIMER_DO_WHEN_READY(tmrStartChefMove, 4.000)
CANCEL_TIMER(tmrStartChefMove)
// @SBA - make sure Chef's health is set to max for this wave
SET_HEALTH_FOR_PED(buddy.ped, buddy.health)
SET_PED_CAN_PEEK_IN_COVER(buddy.ped, TRUE)
set_blocking_of_non_temporary_events(buddy.ped, true)
clear_ped_tasks(buddy.ped)
open_sequence_task(seq)
// @SBA - run to first waypoint, don't worry about navmesh or closest point (cleans up the transition)
TASK_FOLLOW_WAYPOINT_RECORDING(null, "methlab3", 0, EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS) // EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT | EWAYPOINT_START_FROM_CLOSEST_POINT |
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
wave_3_buddy_ai_system_status++
ENDIF
break
case 1
if IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(buddy.ped)
WAYPOINT_PLAYBACK_OVERRIDE_SPEED(buddy.ped, 1.60) // @SBA OLD = 2.0
endif
if not IS_ENTITY_IN_ANGLED_AREA(buddy.ped, <<1387.209, 3612.450, 37.946>>, <<1384.973, 3611.582, 40.948>>, 2.5, false)
if has_ped_task_finished_2(buddy.ped, script_task_perform_sequence)
if waypoint_recording_get_closest_waypoint("methlab3", GET_ENTITY_COORDS(buddy.ped), waypoint_node_pos)
waypoint_node_pos += 1
if (waypoint_node_pos > 18)
waypoint_node_pos = 18
endif
set_blocking_of_non_temporary_events(buddy.ped, true)
clear_ped_tasks(buddy.ped)
open_sequence_task(seq)
task_follow_waypoint_recording(null, "methlab3", waypoint_node_pos, EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT | EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS)
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
endif
endif
else
if get_distance_between_coords(GET_ENTITY_COORDS(buddy.ped), GET_ENTITY_COORDS(player_ped_id())) > 8.0 //6.0
if IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(buddy.ped)
WAYPOINT_PLAYBACK_PAUSE(buddy.ped, true)
endif
wave_3_buddy_ai_system_status++
else
wave_3_buddy_ai_system_status = 3
endif
endif
break
case 2
if not has_label_been_triggered("chin_cook")
if create_conversation(scripted_speech[0], "methaud", "chin_cook", conv_priority_medium)
set_label_as_triggered("chin_cook", true)
endif
endif
IF IS_PLAYER_NEAR_CHEF_ON_STAIRS()
if IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(buddy.ped)
WAYPOINT_PLAYBACK_RESUME(buddy.ped)
endif
REPLAY_RECORD_BACK_FOR_TIME(5.0, 13.0)
wave_3_buddy_ai_system_status++
endif
break
case 3
waypoint_recording_get_num_points("methlab3", total_number_of_points)
total_number_of_points -= 3
if waypoint_recording_get_coord("methlab3", total_number_of_points, target_waypoint_pos)
//CPRINTLN(DEBUG_MISSION, "Chef waypoint number is ", total_number_of_points)
//CPRINTLN(DEBUG_MISSION, "Chef waypoint vector is ", target_waypoint_pos)
if not IS_ENTITY_AT_COORD(buddy.ped, target_waypoint_pos, <<1.0, 1.0, 1.6>>, false, true)
if has_ped_task_finished_2(buddy.ped, script_task_perform_sequence)
if waypoint_recording_get_closest_waypoint("methlab3", GET_ENTITY_COORDS(buddy.ped), waypoint_node_pos)
waypoint_node_pos += 1
if (waypoint_node_pos > total_number_of_points)
waypoint_node_pos = total_number_of_points
endif
set_blocking_of_non_temporary_events(buddy.ped, true)
clear_ped_tasks(buddy.ped)
open_sequence_task(seq)
task_follow_waypoint_recording(null, "methlab3", waypoint_node_pos, EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT | EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS)
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
endif
endif
else
IF IS_PLAYER_STEALING_PEDS_DESTINATION(buddy.ped, buddy_cover_point_data[4].pos, 5.0, false)
CPRINTLN(DEBUG_MISSION, "Chef to right cover")
TASK_SEEK_COVER_TO_COVER_POINT(buddy.ped, buddy_cover_point_data[5].cover_point, buddy_cover_point_data[5].cover_from_pos, -1, TRUE)
ELSE
CPRINTLN(DEBUG_MISSION, "Chef to left cover")
TASK_SEEK_COVER_TO_COVER_POINT(buddy.ped, buddy_cover_point_data[4].cover_point, buddy_cover_point_data[4].cover_from_pos, -1, TRUE)
ENDIF
buddy_time = get_game_timer()
wave_3_buddy_ai_system_status++
endif
endif
break
case 4
IF NOT IS_PED_IN_COVER(buddy.ped)
IF has_ped_task_finished_2(buddy.ped, SCRIPT_TASK_SEEK_COVER_TO_COVER_POINT)
IF IS_PLAYER_STEALING_PEDS_DESTINATION(buddy.ped, buddy_cover_point_data[4].pos, 5.0, false)
CPRINTLN(DEBUG_MISSION, "Chef to right cover")
TASK_SEEK_COVER_TO_COVER_POINT(buddy.ped, buddy_cover_point_data[5].cover_point, buddy_cover_point_data[5].cover_from_pos, -1, TRUE)
ELSE
CPRINTLN(DEBUG_MISSION, "Chef to left cover")
TASK_SEEK_COVER_TO_COVER_POINT(buddy.ped, buddy_cover_point_data[4].cover_point, buddy_cover_point_data[4].cover_from_pos, -1, TRUE)
ENDIF
ENDIF
ELIF lk_timer(buddy_time, 2000) //@SBA OLD = 4000
// Wait for final vehicle to be in position
IF IS_VEHICLE_DRIVEABLE(wave_3_enemy_vehicle[0].veh)
IF NOT is_playback_going_on_for_vehicle(wave_3_enemy_vehicle[0].veh)
CPRINTLN(DEBUG_MISSION, "Chef should be in cover and in combat")
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(buddy.ped, false)
SET_PED_SPHERE_DEFENSIVE_AREA(buddy.ped, GET_ENTITY_COORDS(buddy.ped), 1.25)
SET_PED_ACCURACY(buddy.ped, 5)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(buddy.ped, 50.0)
wave_3_buddy_ai_system_status = 22
ENDIF
ENDIF
ENDIF
break
case 5
//if waypoint_recording_get_closest_waypoint("methlab7", GET_ENTITY_COORDS(buddy.ped), waypoint_node_pos)
set_blocking_of_non_temporary_events(buddy.ped, true)
clear_ped_tasks(buddy.ped)
set_entity_proofs(buddy.ped, false, true, false, false, false)
open_sequence_task(seq)
TASK_FOLLOW_WAYPOINT_RECORDING(null, "methlab7", waypoint_node_pos, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS)
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
wave_3_buddy_ai_system_status++
//endif
break
case 6
if not has_label_been_triggered("buddy_runout")
if not is_any_text_being_displayed(locates_data)
if create_conversation(scripted_speech[0], "methaud", "buddy_runout", conv_priority_medium)
set_label_as_triggered("buddy_runout", true)
endif
endif
endif
if IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(buddy.ped)
WAYPOINT_PLAYBACK_OVERRIDE_SPEED(buddy.ped, 2.0)
endif
if waypoint_recording_get_coord("methlab7", 11, target_waypoint_pos)
if not IS_ENTITY_AT_COORD(buddy.ped, target_waypoint_pos, <<1.5, 1.5, 1.6>>, false, true)
if has_ped_task_finished_2(buddy.ped, script_task_perform_sequence)
if waypoint_recording_get_closest_waypoint("methlab7", GET_ENTITY_COORDS(buddy.ped), waypoint_node_pos)
waypoint_node_pos += 1
if (waypoint_node_pos > 11)
waypoint_node_pos = 11
endif
set_blocking_of_non_temporary_events(buddy.ped, true)
clear_ped_tasks(buddy.ped)
open_sequence_task(seq)
task_follow_waypoint_recording(null, "methlab7", waypoint_node_pos, EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT | EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE | EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS)
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
endif
endif
else
if not is_ped_injured(ambient_enemy[0].ped)
or not is_ped_injured(ambient_enemy[1].ped)
or not is_ped_injured(ambient_enemy[2].ped)
or not is_ped_injured(ambient_enemy[3].ped)
if is_vehicle_driveable(ambient_enemy_vehicle[0].veh)
open_sequence_task(seq)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, <<1406.8160, 3595.9963, 33.6496>>, ambient_enemy_vehicle[0].veh, pedmove_run, true, 0.2, 0.8)
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
elif is_vehicle_driveable(ambient_enemy_vehicle[1].veh)
open_sequence_task(seq)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, <<1406.8160, 3595.9963, 33.6496>>, ambient_enemy_vehicle[1].veh, pedmove_run, true, 0.2, 0.8)
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
else
open_sequence_task(seq)
task_go_to_coord_while_aiming_at_coord(null, <<1406.8160, 3595.9963, 33.6496>>, <<1426.58, 3592.1, 35.42>>, pedmove_run, false, 0.2, 0.8)
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
endif
else
open_sequence_task(seq)
task_go_to_coord_while_aiming_at_coord(null, <<1406.8160, 3595.9963, 33.6496>>, <<1426.58, 3592.1, 35.42>>, pedmove_run, false, 0.2, 0.8)
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
endif
wave_3_buddy_ai_system_status++
endif
endif
break
case 7
if not IS_ENTITY_AT_COORD(buddy.ped, <<1406.8160, 3595.9963, 33.6496>>, <<1.5, 1.5, 1.6>>, false, true)
if has_ped_task_finished_2(buddy.ped, script_task_perform_sequence)
set_blocking_of_non_temporary_events(buddy.ped, true)
clear_ped_tasks(buddy.ped)
if is_vehicle_driveable(ambient_enemy_vehicle[0].veh)
open_sequence_task(seq)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, <<1406.8160, 3595.9963, 33.6496>>, ambient_enemy_vehicle[0].veh, pedmove_run, true, 0.2, 0.8)
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
elif is_vehicle_driveable(ambient_enemy_vehicle[1].veh)
open_sequence_task(seq)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(null, <<1406.8160, 3595.9963, 33.6496>>, ambient_enemy_vehicle[1].veh, pedmove_run, true, 0.2, 0.8)
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
else
open_sequence_task(seq)
task_go_to_coord_while_aiming_at_coord(null, <<1406.8160, 3595.9963, 33.6496>>, <<1426.58, 3592.1, 35.42>>, pedmove_run, false, 0.2, 0.8)
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
endif
endif
else
set_blocking_of_non_temporary_events(buddy.ped, false)
set_ped_sphere_defensive_area(buddy.ped, <<1406.8160, 3595.9963, 33.6496>>, 4.0)
task_combat_hated_targets_around_ped(buddy.ped, 200)
wave_3_buddy_ai_system_status++
original_time = get_game_timer()
endif
break
case 8
if lk_timer(original_time, 1500)
or are_all_ambient_entities_dead()
set_blocking_of_non_temporary_events(buddy.ped, true)
clear_ped_tasks(buddy.ped)
open_sequence_task(seq)
TASK_AIM_GUN_AT_COORD(NULL, (<<1426.58, 3592.1, 35.42>>), 750)
task_follow_nav_mesh_to_coord(null, <<1395.9012, 3611.6748, 33.9809>>, PEDMOVE_WALK, -1, default_navmesh_radius, enav_no_stopping)
task_follow_nav_mesh_to_coord(null, <<1391.8004, 3612.1050, 33.9809>>, PEDMOVE_WALK, -1, default_navmesh_radius, enav_no_stopping)
task_follow_nav_mesh_to_coord(null, <<1391.1970, 3601.0510, 37.9419>>, pedmove_run, -1, default_navmesh_radius)
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
wave_3_buddy_ai_system_status++
endif
break
case 9
if not is_entity_at_coord(buddy.ped, <<1391.1970, 3601.0510, 37.9419>>, <<1.5, 1.5, 2.0>>)
if has_ped_task_finished_2(buddy.ped)
open_sequence_task(seq)
task_follow_nav_mesh_to_coord(null, <<1391.1970, 3601.0510, 37.9419>>, pedmove_run, -1, default_navmesh_radius)
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
endif
else
// Have Chef do something until the cutscene starts
TASK_LOOK_AT_ENTITY(buddy.ped, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
OPEN_SEQUENCE_TASK(seq)
TASK_SWAP_WEAPON(NULL, FALSE)
TASK_USE_NEAREST_SCENARIO_TO_COORD(NULL, (<<1390.0, 3600.510, 37.9419>>), 2.5, -1)
//TASK_WANDER_IN_AREA(NULL, (<<1393.49988, 3603.23877, 37.94191>>), 2.0, 2, 4)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(buddy.ped, seq)
CLEAR_SEQUENCE_TASK(seq)
wave_3_buddy_ai_system_status++
endif
break
CASE 10
// zilch
BREAK
endswitch
endif
endproc
proc wave_3_assisted_nodes_system()
switch wave_3_assisted_nodes_system_status
case 0
ASSISTED_MOVEMENT_remove_ROUTE("Wave2")
ASSISTED_MOVEMENT_REQUEST_ROUTE("Wave3")
wave_3_assisted_nodes_system_status++
break
case 1
// if IS_ENTITY_IN_ANGLED_AREA(player_ped_id(), <<1401.366, 3619.451, 37.947>>, <<1406.805, 3604.510, 39.947>>, 10.900)
//
// ASSISTED_MOVEMENT_remove_ROUTE("Meth2")
//
// wave_3_assisted_nodes_system_status++
// endif
break
case 2
break
case 3
break
case 22
break
endswitch
endproc
proc wave_3_audio_scene_system()
switch wave_3_audio_scene_system_status
case 0
if wave_3_enemy[1].created
if does_entity_exist(wave_3_enemy_vehicle[0].veh)
if is_vehicle_driveable(wave_3_enemy_vehicle[0].veh)
add_entity_to_audio_mix_group(wave_3_enemy_vehicle[0].veh, "CHI_1_TRUCK_02")
endif
endif
if is_audio_scene_active("CHI_1_GET_TO_SHOOTOUT_04")
stop_audio_scene("CHI_1_GET_TO_SHOOTOUT_04")
endif
wave_3_audio_scene_system_status++
endif
break
case 1
if IS_ENTITY_IN_ANGLED_AREA(player_ped_id(), <<1400.846, 3602.507, 28.946>>, <<1394.636, 3619.827, 48.946>>, 23.1)
if IS_ENTITY_IN_ANGLED_AREA(player_ped_id(), <<1395.035, 3608.389, 33.981>>, <<1394.215, 3610.644, 36.5>>, 1.5)
start_audio_scene("CHI_1_SHOOTOUT_04")
endif
else
player_position = GET_ENTITY_COORDS(player_ped_id())
if (player_position.z < 37.00)
start_audio_scene("CHI_1_SHOOTOUT_04")
wave_3_audio_scene_system_status++
endif
endif
break
case 2
if does_entity_exist(wave_3_enemy_vehicle[0].veh)
if is_vehicle_driveable(wave_3_enemy_vehicle[0].veh)
if not is_playback_going_on_for_vehicle(wave_3_enemy_vehicle[0].veh)
remove_entity_from_audio_mix_group(wave_3_enemy_vehicle[0].veh)
wave_3_audio_scene_system_status++
endif
else
remove_entity_from_audio_mix_group(wave_3_enemy_vehicle[0].veh)
wave_3_audio_scene_system_status++
endif
endif
break
case 3
if ped_structure_are_all_enemies_dead(wave_3_enemy)
trigger_music_event("CHN1_ENEMIES_FLEE")
if is_audio_scene_active("CHI_1_SHOOTOUT_04")
stop_audio_scene("CHI_1_SHOOTOUT_04")
endif
start_audio_scene("CHI_1_ENEMIES_ESCAPE")
wave_3_audio_scene_system_status++
endif
break
case 4
if does_blip_exist(ice_box_blip)
if is_audio_scene_active("CHI_1_ENEMIES_ESCAPE")
stop_audio_scene("CHI_1_ENEMIES_ESCAPE")
endif
start_audio_scene("CHI_1_GO_TO_ICEBOX")
wave_3_audio_scene_system_status++
endif
break
endswitch
endproc
func bool chinese_wave_3_system()
// @SBA - B*1195400 - rarely, a ped falls through the world and cannot be killed in game play
// this kills him if he is below ground
KILL_ANY_ERRANT_ENEMY(wave_3_enemy)
KILL_ANY_ERRANT_ENEMY(ambient_enemy)
// @SBA - handle dead vehicle blips
REMOVE_DEAD_VEHICLE_BLIPS(wave_3_enemy_vehicle)
if wave_3_master_flow_system()
mission_flow = mission_passed_mocap
return true
endif
wave_3_dialogue_system()
wave_3_buddy_ai_system()
wave_3_ai_system()
//wave_3_assisted_nodes_system()
ambient_enemy_system()
wave_3_audio_scene_system()
if is_ped_inside_interior(player_ped_id(), <<1392.7360, 3602.5989, 38.5>>, "v_methlab")
SET_RADAR_AS_EXTERIOR_THIS_FRAME()
endif
return false
endfunc
PROC HAVE_PED_EXIT_VEHICLE_THEN_WALK(PED_INDEX piPed, VECTOR vLoc, INT iPause = 0)
SEQUENCE_INDEX siSeq
IF IS_VEHICLE_DRIVEABLE(trevors_truck.veh)
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
OPEN_SEQUENCE_TASK(siSeq)
TASK_PAUSE(NULL, iPause)
TASK_LEAVE_VEHICLE(NULL, trevors_truck.veh)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vLoc, PEDMOVE_WALK)
CLOSE_SEQUENCE_TASK(siSeq)
TASK_PERFORM_SEQUENCE(piPed, siSeq)
CLEAR_SEQUENCE_TASK(siSeq)
ENDIF
ENDPROC
FLOAT fSRLTime
// @SBA - handle the lead in for the arrival cutscene, return when finished
FUNC BOOL HANDLE_LEAD_IN_SHOT_OF_ARRIVAL()
IF DOES_ENTITY_EXIST(trevors_truck.veh)
IF NOT IS_ENTITY_DEAD(trevors_truck.veh)
REQUEST_VEHICLE_HIGH_DETAIL_MODEL(trevors_truck.veh)
ENDIF
ENDIF
IF ArivialLeadInState > ALI_HALT_VEHICLE
fSRLTime += GET_FRAME_TIME()
IF fSRLTime < 0.0
fSRLTime = 0.0
ENDIF
SET_SRL_TIME(fSRLTime)
ENDIF
SWITCH ArivialLeadInState
CASE ALI_HALT_VEHICLE
SET_SRL_READAHEAD_TIMES(5, 5, 5, 5)
BEGIN_SRL()
IF NOT IS_CAM_RENDERING(camera_a)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
display_hud(false)
display_radar(false)
ENDIF
IF IS_PED_INJURED(PLAYER_PED_ID())
CPRINTLN(DEBUG_MISSION, "HANDLE_LEAD_IN_SHOT_OF_ARRIVAL: Player is injured?!")
ENDIF
IF IS_TIMER_STARTED(tmrArrival)
CANCEL_TIMER(tmrArrival)
ENDIF
IF IS_PED_IN_ANY_HELI(PLAYER_PED_ID())
CPRINTLN(DEBUG_MISSION, "HANDLE_LEAD_IN_SHOT_OF_ARRIVAL: TO ALI_CAM_INTERP (helicopter)")
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ArivialLeadInState = ALI_CAM_INTERP
ELIF get_current_player_vehicle(trevors_truck.veh)
//IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(trevors_truck.veh, 6, 1, 12.0)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SET_ENTITY_AS_MISSION_ENTITY(trevors_truck.veh)
CPRINTLN(DEBUG_MISSION, "HANDLE_LEAD_IN_SHOT_OF_ARRIVAL: TO ALI_CAM_INTERP")
ArivialLeadInState = ALI_CAM_INTERP
//ENDIF
ELSE
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
CPRINTLN(DEBUG_MISSION, "HANDLE_LEAD_IN_SHOT_OF_ARRIVAL: TO ALI_CAM_INTERP (no vehicle)")
ArivialLeadInState = ALI_CAM_INTERP
ENDIF
BREAK
CASE ALI_CAM_INTERP
// start interp
IF DOES_CAM_EXIST(camera_a)
AND DOES_CAM_EXIST(camera_b)
SET_CAM_ACTIVE_WITH_INTERP(camera_b, camera_a, 5000)
SHAKE_CAM(camera_b, "HAND_SHAKE")
CPRINTLN(DEBUG_MISSION, "HANDLE_LEAD_IN_SHOT_OF_ARRIVAL: TO ALI_FINISH_DRIVE")
ArivialLeadInState = ALI_FINISH_DRIVE
ENDIF
BREAK
CASE ALI_FINISH_DRIVE
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
// helicopter?
IF IS_PED_IN_ANY_HELI(PLAYER_PED_ID())
CPRINTLN(DEBUG_MISSION, "HANDLE_LEAD_IN_SHOT_OF_ARRIVAL: TO ALI_FINISH_INTERP (helicopter)")
ArivialLeadInState = ALI_FINISH_INTERP
// If we're in a vehicle go to final spot
// Hopefully this alleviates badly-parked vehicles
ELIF get_current_player_vehicle(trevors_truck.veh)
VECTOR vVehCoord
FLOAT fVehHead
vVehCoord = GET_ENTITY_COORDS(trevors_truck.veh)
IF vVehCoord.x > 1402.7
CPRINTLN(DEBUG_MISSION, "HANDLE_LEAD_IN_SHOT_OF_ARRIVAL: Trevor's vehicle coming from the RIGHT")
vVehCoord = vVehicleLeadinLocR
fVehHead = fTrevorsVehicleMethLabHead
ELSE
CPRINTLN(DEBUG_MISSION, "HANDLE_LEAD_IN_SHOT_OF_ARRIVAL: Trevor's vehicle coming from the LEFT")
vVehCoord = vVehicleLeadinLocL
fVehHead = fTrevorsVehicleMethLabHead - 180
ENDIF
CLEAR_AREA(vVehCoord, 3.0, TRUE)
SET_ENTITY_COORDS(trevors_truck.veh, vVehCoord)
SET_ENTITY_HEADING(trevors_truck.veh, fVehHead)
SET_VEHICLE_ON_GROUND_PROPERLY(trevors_truck.veh)
TASK_VEHICLE_DRIVE_TO_COORD(PLAYER_PED_ID(), trevors_truck.veh, vArrivalMethLab, 15, DRIVINGSTYLE_NORMAL, DUMMY_MODEL_FOR_SCRIPT, DRIVINGMODE_PLOUGHTHROUGH, 2.0, 20)
CPRINTLN(DEBUG_MISSION, "HANDLE_LEAD_IN_SHOT_OF_ARRIVAL: TO ALI_VEHICLE_STOP")
START_TIMER_NOW(tmrArrival)
ArivialLeadInState = ALI_VEHICLE_STOP
// if we're on foot, just wait for the interp to end
ELSE
CPRINTLN(DEBUG_MISSION, "HANDLE_LEAD_IN_SHOT_OF_ARRIVAL: TO ALI_FINISH_INTERP (on foot)")
ArivialLeadInState = ALI_FINISH_INTERP
ENDIF
ENDIF
BREAK
CASE ALI_VEHICLE_STOP
IF IS_VEHICLE_DRIVEABLE(trevors_truck.veh)
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_VEHICLE_STOPPED(trevors_truck.veh)
AND (GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_VEHICLE_DRIVE_TO_COORD) != PERFORMING_TASK)
HAVE_PED_EXIT_VEHICLE_THEN_WALK(PLAYER_PED_ID(), (<<1402.6, 3598.8, 34.0>>))
HAVE_PED_EXIT_VEHICLE_THEN_WALK(translator.ped, (<<1402.3, 3598.6, 34.0>>), 300)
CPRINTLN(DEBUG_MISSION, "HANDLE_LEAD_IN_SHOT_OF_ARRIVAL: TO ALI_EXIT_VEHICLE")
ArivialLeadInState = ALI_EXIT_VEHICLE
ELIF TIMER_DO_WHEN_READY(tmrArrival, 16.000)
IF IS_ENTITY_OCCLUDED(trevors_truck.veh)
CANCEL_TIMER(tmrArrival)
CLEAR_AREA(vVehicleLeadinLocR, 3.0, TRUE)
SET_ENTITY_COORDS(trevors_truck.veh, vVehicleLeadinLocR)
SET_ENTITY_HEADING(trevors_truck.veh, fTrevorsVehicleMethLabHead)
ArivialLeadInState = ALI_FINISH_DRIVE
ENDIF
ENDIF
ENDIF
BREAK
CASE ALI_EXIT_VEHICLE
CPRINTLN(DEBUG_MISSION, "HANDLE_LEAD_IN_SHOT_OF_ARRIVAL: Leaving vehicle")
RETURN TRUE
BREAK
CASE ALI_FINISH_INTERP
// letting the interp finish if we're on foot
IF DOES_CAM_EXIST(camera_b)
IF IS_CAM_ACTIVE(camera_b)
IF NOT IS_CAM_INTERPOLATING(camera_b)
START_TIMER_NOW(tmrArrival)
CPRINTLN(DEBUG_MISSION, "HANDLE_LEAD_IN_SHOT_OF_ARRIVAL: TO ALI_WAIT_FOR_TIMER (no vehicle)")
ArivialLeadInState = ALI_WAIT_FOR_TIMER
ENDIF
ENDIF
ENDIF
BREAK
CASE ALI_WAIT_FOR_TIMER
IF TIMER_DO_ONCE_WHEN_READY(tmrArrival, 0.200)
CPRINTLN(DEBUG_MISSION, "HANDLE_LEAD_IN_SHOT_OF_ARRIVAL: Returning TRUE")
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC SETUP_PLAYER_POST_ARRIVAL_CUTSCENE()
// clear_ped_tasks_immediately(player_ped_id())
// SET_ENTITY_COORDS(player_ped_id(), vTrevorWindowStartPos)//@SBA - adjusting starting cover position slightly - OLD VALUE <<1389.5963, 3600.4568, 37.9419>>)
// SET_ENTITY_HEADING(player_ped_id(), 21.5294)//72.3301)
// @SBA - adjusting starting cover position slightly - OLD VALUE <<1389.63, 3600.41, 37.94>>
task_put_ped_directly_into_cover(player_ped_id(), vTrevorWindowStartPos, -1, false, 0.5, true, false, players_cover_point)//, false, instant_blend_in)
force_ped_ai_and_animation_update(player_ped_id(), FALSE)
if not has_ped_got_weapon(player_ped_id(), WEAPONTYPE_CARBINERIFLE)
give_weapon_to_ped(player_ped_id(), WEAPONTYPE_CARBINERIFLE, 500, true, true)
else
if get_ammo_in_ped_weapon(player_ped_id(), WEAPONTYPE_CARBINERIFLE) < 500
set_ped_ammo(player_ped_id(), WEAPONTYPE_CARBINERIFLE, 500)
endif
set_current_ped_weapon(player_ped_id(), WEAPONTYPE_CARBINERIFLE, true)
endif
//SET_GAMEPLAY_CAM_RELATIVE_HEADING(90.00)//*************
SET_PED_USING_ACTION_MODE(player_ped_id(), true)
ENDPROC
// @SBA HACK split up the creation of the wave a bit for normal game flow
FUNC BOOL SETUP_INITIAL_ENEMY_WAVE_IN_STAGES()
SWITCH iWave0SetupStage
// Enemies on foot
CASE 0
setup_enemy(wave_0_enemy[0])
setup_enemy(wave_0_enemy[1])
iWave0SetupStage ++
BREAK
// first SUV
CASE 1
SETUP_ENEMY_VEHICLE(wave_0_enemy_vehicle[0])
set_vehicle_colours(wave_0_enemy_vehicle[0].veh, 0, 0)
setup_enemy_in_vehicle(wave_0_enemy[2], wave_0_enemy_vehicle[0].veh)
setup_enemy_in_vehicle(wave_0_enemy[3], wave_0_enemy_vehicle[0].veh, vs_front_right)
setup_enemy_in_vehicle(wave_0_enemy[4], wave_0_enemy_vehicle[0].veh, vs_back_left)
start_playback_recorded_vehicle(wave_0_enemy_vehicle[0].veh, wave_0_enemy_vehicle[0].recording_number, "lkmethlab")
skip_time_in_playback_recorded_vehicle(wave_0_enemy_vehicle[0].veh, 3000)
iWave0SetupStage ++
BREAK
// second SUV
CASE 2
SETUP_ENEMY_VEHICLE(wave_0_enemy_vehicle[1])
set_vehicle_colours(wave_0_enemy_vehicle[1].veh, 10, 10)
setup_enemy_in_vehicle(wave_0_enemy[5], wave_0_enemy_vehicle[1].veh)
setup_enemy_in_vehicle(wave_0_enemy[6], wave_0_enemy_vehicle[1].veh, vs_front_right)
setup_enemy_in_vehicle(wave_0_enemy[7], wave_0_enemy_vehicle[1].veh, vs_back_left)
setup_enemy_in_vehicle(wave_0_enemy[8], wave_0_enemy_vehicle[1].veh, vs_back_right)
start_playback_recorded_vehicle(wave_0_enemy_vehicle[1].veh, wave_0_enemy_vehicle[1].recording_number, "lkmethlab")
skip_time_in_playback_recorded_vehicle(wave_0_enemy_vehicle[1].veh, 4500)
iWave0SetupStage ++
BREAK
CASE 3
iWave0SetupStage ++
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
// creating wave 0 all at once for restarts, etc.
PROC SETUP_INITIAL_ENEMY_WAVE()
IF bStartedInitialWave
CPRINTLN(DEBUG_MISSION, "SETUP_INITIAL_ENEMY_WAVE: Already started - exiting.")
EXIT
ENDIF
INT idx
for idx = 0 to 1
SETUP_ENEMY_VEHICLE(wave_0_enemy_vehicle[idx])
//set_entity_only_damaged_by_player(wave_0_enemy_vehicle[idx].veh, true)
start_playback_recorded_vehicle(wave_0_enemy_vehicle[idx].veh, wave_0_enemy_vehicle[idx].recording_number, "lkmethlab")
if idx = 0
skip_time_in_playback_recorded_vehicle(wave_0_enemy_vehicle[idx].veh, 3000) //4000
set_vehicle_colours(wave_0_enemy_vehicle[idx].veh, 0, 0)
elif idx = 1
skip_time_in_playback_recorded_vehicle(wave_0_enemy_vehicle[idx].veh, 4500) //5500
set_vehicle_colours(wave_0_enemy_vehicle[idx].veh, 10, 10)
endif
endfor
setup_enemy(wave_0_enemy[0])
setup_enemy(wave_0_enemy[1])
setup_enemy_in_vehicle(wave_0_enemy[2], wave_0_enemy_vehicle[0].veh)
setup_enemy_in_vehicle(wave_0_enemy[3], wave_0_enemy_vehicle[0].veh, vs_front_right)
setup_enemy_in_vehicle(wave_0_enemy[4], wave_0_enemy_vehicle[0].veh, vs_back_left)
setup_enemy_in_vehicle(wave_0_enemy[5], wave_0_enemy_vehicle[1].veh)
setup_enemy_in_vehicle(wave_0_enemy[6], wave_0_enemy_vehicle[1].veh, vs_front_right)
setup_enemy_in_vehicle(wave_0_enemy[7], wave_0_enemy_vehicle[1].veh, vs_back_left)
setup_enemy_in_vehicle(wave_0_enemy[8], wave_0_enemy_vehicle[1].veh, vs_back_right)
ENDPROC
PROC SETUP_INITIAL_ENEMY_WAVE_PROPS()
IF bInitialWavePropsMade
CPRINTLN(DEBUG_MISSION, "SETUP_INITIAL_ENEMY_WAVE_PROPS: Already started - exiting.")
EXIT
ENDIF
for i = 0 to count_of(bins) - 1
bins[i].obj = create_object_no_offset(bins[i].model, bins[i].pos)
SET_ENTITY_ROTATION(bins[i].obj, bins[i].rot)
FREEZE_ENTITY_POSITION(bins[i].obj, true)
endfor
for i = 0 to count_of(explosive_barrels) - 1
explosive_barrels[i].obj = create_object_no_offset(explosive_barrels[i].model, explosive_barrels[i].pos)
SET_ENTITY_ROTATION(explosive_barrels[i].obj, explosive_barrels[i].rot)
endfor
cover_box.obj = create_object_no_offset(cover_box.model, cover_box.pos)
freeze_entity_position(cover_box.obj, true)
SET_ENTITY_ROTATION(cover_box.obj, cover_box.rot)
ENDPROC
proc setup_start_of_shootout()
if does_entity_exist(trevors_truck.veh)
if is_vehicle_driveable(trevors_truck.veh)
set_entity_coords(trevors_truck.veh, <<1409.9990, 3600.4973, 33.8676>>)
set_entity_heading(trevors_truck.veh, 108.7487)
set_vehicle_engine_on(trevors_truck.veh, false, true)
endif
endif
IF NOT DOES_ENTITY_EXIST(buddy.ped)
setup_buddy(buddy)
ENDIF
IF NOT IS_PED_INJURED(buddy.ped)
SET_PED_HIGHLY_PERCEPTIVE(buddy.ped, true)
set_current_ped_weapon(buddy.ped, buddy.weapon, true)
ENDIF
add_ped_for_dialogue(scripted_speech[0], 5, buddy.ped, "cook")
IF NOT DOES_BLIP_EXIST(buddy.blip)
buddy.blip = CREATE_BLIP_FOR_PED(buddy.ped)
set_blip_display(buddy.blip, DISPLAY_BLIP)
SET_BLIP_PRIORITY(buddy.blip, BLIPPRIORITY_HIGHEST)
ENDIF
// *****TEMP REMOVE
//SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(buddy.ped, true)
// *****
// @SBA - this is where cheng and translator get deleted
if does_entity_exist(translator.ped)
DELETE_PED(translator.ped)
endif
set_model_as_no_longer_needed(translator.model)
if does_entity_exist(cheng.ped)
DELETE_PED(cheng.ped)
endif
set_model_as_no_longer_needed(cheng.model)
open_sequence_task(seq)
task_seek_cover_to_cover_point(null, buddy_cover_point[0], <<1372.01, 3596.31, 37.97>>, -1)
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
SETUP_INITIAL_ENEMY_WAVE()
// @SBA - create parked cars if not already created
IF NOT DOES_ENTITY_EXIST(parked_cars[3])
IF HAS_MODEL_LOADED(phoenix)
setup_parked_cars()
ENDIF
ENDIF
SETUP_INITIAL_ENEMY_WAVE_PROPS()
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ml_door1, <<1392.93, 3599.47, 35.13>>, true, 0.0, 0.0, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ml_door1, <<1395.37, 3600.36, 35.13>>, true, 0.0, 0.0, -1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ml_door1, <<1392.93, 3599.47, 35.13>>, false, 0.0, 0.0, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ml_door1, <<1395.37, 3600.36, 35.13>>, false, 0.0, 0.0, -1.0)
original_time = get_game_timer()
if is_screen_faded_in()
//end_cutscene_no_fade(false, false, 0, 0, 3000, false)
//end_cutscene_no_fade(false, true, 90.0, 0, 3000, false)
//end_cutscene_no_fade(false, false, (127.0963 - GET_ENTITY_HEADING(PLAYER_PED_ID())), -4.7568, 2000, false)
else
end_cutscene(false, 90.00, -12.0, false)
endif
trigger_music_event("CHN1_GAMEPLAY_STARTS")
start_audio_scene("CHI_1_SHOOTOUT_01")
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(1, "Start of Wave 0 shootout")
mission_flow = wave_0_system
endproc
proc request_mocap_data_for_CHI_1_MCS_1()
// @SBA - trying a larger distance to improve streaming at the destination //DEFAULT_CUTSCENE_LOAD_DIST, DEFAULT_CUTSCENE_UNLOAD_DIST,
//mocap_streaming_system(<<1403.1777, 3597.2070, 34.00>>, 100, 120, "CHI_1_MCS_1")
// force the load here
// IF (GET_DISTANCE_BETWEEN_COORDS(<<1403.1777, 3597.2070, 34.00>>, GET_ENTITY_COORDS(PLAYER_PED_ID())) < 60)
// //IF NOT IS_CUTSCENE_ACTIVE() OR NOT HAS_CUTSCENE_LOADED()
// //CPRINTLN(DEBUG_MISSION, "PLAYER < 60m: REQUESTING ARRIVAL CUTSCENE.")
// REQUEST_CUTSCENE("CHI_1_MCS_1")
// //ENDIF
// ELSE
// // longe range load if in a vehicle
// IF (GET_DISTANCE_BETWEEN_COORDS(<<1403.1777, 3597.2070, 34.00>>, GET_ENTITY_COORDS(PLAYER_PED_ID())) < 300)
// AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
// //CPRINTLN(DEBUG_MISSION, "PLAYER < 300m: REQUESTING ARRIVAL CUTSCENE.")
// REQUEST_CUTSCENE("CHI_1_MCS_1")
// ELSE
// // unload if farther away or not in a vehicle
// IF IS_CUTSCENE_ACTIVE() OR HAS_CUTSCENE_LOADED()
// IF (GET_DISTANCE_BETWEEN_COORDS(<<1403.1777, 3597.2070, 34.00>>, GET_ENTITY_COORDS(PLAYER_PED_ID())) > 320)
// OR NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
// //CPRINTLN(DEBUG_MISSION, "REMOVING ARRIVAL CUTSCENE.")
// REMOVE_CUTSCENE()
// ENDIF
// ENDIF
// ENDIF
// ENDIF
REQUEST_CUTSCENE("CHI_1_MCS_1")
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
CPRINTLN(DEBUG_MISSION, "Requesting arrival component variations")
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("trevor", PLAYER_PED_ID())
ENDIF
IF NOT IS_PED_INJURED(cheng.ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Tao", cheng.ped)
ENDIF
IF NOT IS_PED_INJURED(translator.ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Taos_Translator", translator.ped)
ENDIF
IF NOT IS_PED_INJURED(buddy.ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("cook", buddy.ped)
ENDIF
SET_CUTSCENE_PED_PROP_VARIATION("Cook", ANCHOR_EYES, 0, 0)
SET_CUTSCENE_PED_PROP_VARIATION("Tao", ANCHOR_EYES, 0)
SET_CUTSCENE_PED_PROP_VARIATION("Taos_Translator", ANCHOR_EYES, 0)
ENDIF
endproc
PROC HANDLE_STUFF_AS_PLAYER_APPROACHES_METH_LAB()
FLOAT fDistance = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), (<<1403.1777, 3597.2070, 34.5>>))
// IF fDistance < 60.0
// IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
// IF NEW_LOAD_SCENE_START((<<1410.99, 3587.20, 34.0>>), NORMALISE_VECTOR(<<-0.58, 0.69, 0.45>>), 2750.0)
// CPRINTLN(DEBUG_MISSION, GET_THIS_SCRIPT_NAME(), ": Meth Lab Arrival: Calling NEW_LOAD_SCENE_START.")
// ENDIF
// ENDIF
// ELIF fDistance < 200.0
// AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
// IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
// //IF NEW_LOAD_SCENE_START((<<1418.64, 3581.70, 35.85>>), NORMALISE_VECTOR(<<-0.69, 0.72, 0.03>>), 2750.0)
// IF NEW_LOAD_SCENE_START((<<1410.99, 3587.20, 34.0>>), NORMALISE_VECTOR(<<-0.58, 0.69, 0.45>>), 2750.0)
// CPRINTLN(DEBUG_MISSION, GET_THIS_SCRIPT_NAME(), ": Meth Lab Arrival: Calling NEW_LOAD_SCENE_START.")
// ENDIF
// ENDIF
// ELSE
// IF fDistance > 225.0
// OR NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
// // stop load scene if needed so it doesn't stay loaded if player is joy riding, or out of vehicle
// IF IS_NEW_LOAD_SCENE_ACTIVE()
// NEW_LOAD_SCENE_STOP()
// CPRINTLN(DEBUG_MISSION, GET_THIS_SCRIPT_NAME(), ": Meth Lab Arrival (too far): calling NEW_LOAD_SCENE_STOP.")
// ENDIF
// ENDIF
// ENDIF
IF NOT bClearCarGen
IF fDistance < 225
CPRINTLN(DEBUG_MISSION, "DELETING OLD CAR GEN. Fetching SRL.")
CLEAR_OLD_CAR_GEN()
PREFETCH_SRL("chi_1_mcs_1")
bClearCarGen = TRUE
ENDIF
ENDIF
IF fDistance < 250
IF NOT IS_INTERIOR_READY(meth_interior)
pin_interior_in_memory(meth_interior)
ENDIF
ELIF fDistance > 270
IF IS_INTERIOR_READY(meth_interior)
UNPIN_INTERIOR(meth_interior)
ENDIF
ENDIF
ENDPROC
proc get_to_meth_lab_audio_scene_system()
switch get_to_meth_lab_audio_scene_system_status
case 0
if is_ped_sitting_in_any_vehicle(player_ped_id())
start_audio_scene("CHI_1_DRIVE_TO_LAB")
get_to_meth_lab_audio_scene_system_status++
endif
break
case 1
break
endswitch
endproc
/// PURPOSE: returns TRUE if the player is using third person view whilst in cover.
func bool is_player_third_person_in_cover()
if get_cam_view_mode_for_context(cam_view_mode_context_on_foot) != cam_view_mode_first_person
return true
else
if get_is_using_fps_third_person_cover()
return true
endif
endif
return false
endfunc
proc chinese_get_to_meth_lab()
KILL_PED_HIT_BY_PLAYERS_VEHICLE(cheng.ped)
KILL_PED_HIT_BY_PLAYERS_VEHICLE(translator.ped)
HANDLE_CHENGS_CRAZY_CAR_DANCING()
HANDLE_CREATE_BAR_PATRONS()
switch get_to_meth_lab_status
case 0
FLOAT fDistance
// clean up any loaded bar assets
IF NOT bIsBarCleanedUp
fDistance = GET_DISTANCE_BETWEEN_COORDS((<<2000.1245, 3059.5662, 46.0491>>), GET_ENTITY_COORDS(PLAYER_PED_ID()))
IF fDistance > 50
CLEANUP_BAR()
bIsBarCleanedUp = TRUE
ELSE
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2170997 / 2195354
ENDIF
ENDIF
// @SBA - Need to request early so Chef can be properly registered with cutscene with his props in tact
//REQUEST_METH_ARRIVAL_ASSETS()
REQUEST_MODEL(buddy.model)
HANDLE_SETUP_INITIAL_CHEF()
//request_mocap_data_for_CHI_1_MCS_1()
SET_DOOR_STATE(DOORNAME_METHLAB_F_L, DOORSTATE_FORCE_LOCKED_THIS_FRAME)
SET_DOOR_STATE(DOORNAME_METHLAB_F_R, DOORSTATE_FORCE_LOCKED_THIS_FRAME)
SET_DOOR_STATE(DOORNAME_METHLAB_R, DOORSTATE_FORCE_LOCKED_THIS_FRAME)
meth_interior = get_interior_at_coords_with_type(<<1392.5117, 3603.1851, 38.5>>, "v_methlab")
IF NOT IS_PED_IN_ANY_HELI(PLAYER_PED_ID())
if is_player_at_location_with_buddies_any_means(locates_data, vArrivalMethLab, <<35.0, 35.0, 3.0>>,
true, cheng.ped, translator.ped, null, "METH_GOD_8", "METH_GOD_12", "METH_GOD_13", "",
"METH_GOD_14", false, true)
// safety
CLEANUP_BAR()
get_to_meth_lab_status = 50
// not arrived yet
ELSE
HANDLE_STUFF_AS_PLAYER_APPROACHES_METH_LAB()
ENDIF
// in helicopter
ELSE
HANDLE_STUFF_AS_PLAYER_APPROACHES_METH_LAB()
ENDIF
//--DEBUG
// if IS_INTERIOR_READY(meth_interior)
// printstring("meth_interior READY")
// printnl()
// else
// printstring("meth_interior NOT READY")
// printnl()
// endif
//--END DEBUG
get_to_meth_lab_dialogue_system()
get_to_meth_lab_audio_scene_system()
IF NOT bSetTaxiDropoff
IF DOES_BLIP_EXIST(locates_data.LocationBlip)
CPRINTLN(DEBUG_MISSION, "Meth Lab Arrival: Taxi dropoff set")
// trying to reduce memory on drive to meth lab
SET_REDUCE_PED_MODEL_BUDGET(TRUE)
SET_REDUCE_VEHICLE_MODEL_BUDGET(TRUE)
SET_TAXI_DROPOFF_LOCATION_FOR_BLIP(locates_data.LocationBlip, <<1447.9056, 3611.7273, 33.8160>>, 104.8207)
bSetTaxiDropoff = TRUE
ENDIF
ENDIF
break
CASE 50
// separated this out from previous case so locate won't spam
IF IS_SRL_LOADED()
kill_any_conversation()
clear_mission_locate_stuff(locates_data)
// start lead-in cam
camera_a = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<1413.1581, 3586.2705, 35.3191>>, <<14.4926, -0.0000, 51.7688>>, 40.0, TRUE)
camera_b = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<1415.4323, 3585.3635, 35.4866>>, <<5.5924, -0.0000, 49.1407>>, 40.0)
SET_FRONTEND_RADIO_ACTIVE(FALSE)
request_mocap_data_for_CHI_1_MCS_1()
get_to_meth_lab_status = 1
ENDIF
BREAK
case 1
// stop load scene if needed
IF IS_NEW_LOAD_SCENE_ACTIVE()
IF IS_NEW_LOAD_SCENE_LOADED()
NEW_LOAD_SCENE_STOP()
CPRINTLN(DEBUG_MISSION, GET_THIS_SCRIPT_NAME(), ": Meth Lab Arrival: calling NEW_LOAD_SCENE_STOP.")
ENDIF
ENDIF
// @SBA - unload dance dict
IF NOT bDanceAnimDictUnloaded
IF NOT IS_ENTITY_DEAD(cheng.ped)
IF GET_SCRIPT_TASK_STATUS(cheng.ped, SCRIPT_TASK_PLAY_ANIM) != PERFORMING_TASK
CPRINTLN(DEBUG_MISSION, "Removing ", sCrazyDanceDict, " for lead in.")
REMOVE_ANIM_DICT(sCrazyDanceDict)
bDanceAnimDictUnloaded = TRUE
ENDIF
ENDIF
ENDIF
// @SBA - load just what we need
REQUEST_METH_ARRIVAL_ASSETS()
HANDLE_SETUP_INITIAL_CHEF()
request_mocap_data_for_CHI_1_MCS_1()
IF HANDLE_LEAD_IN_SHOT_OF_ARRIVAL()
END_SRL()
REDUCE_AMBIENT_MODELS(TRUE)
get_to_meth_lab_status++
ENDIF
break
case 2
IF DOES_ENTITY_EXIST(trevors_truck.veh)
IF NOT IS_ENTITY_DEAD(trevors_truck.veh)
IF IS_ENTITY_ON_SCREEN(trevors_truck.veh)
REQUEST_VEHICLE_HIGH_DETAIL_MODEL(trevors_truck.veh)
ENDIF
ENDIF
ENDIF
// @SBA - load just what we need
//request_shootout_assets()
REQUEST_METH_ARRIVAL_ASSETS()
HANDLE_SETUP_INITIAL_CHEF()
request_mocap_data_for_CHI_1_MCS_1()
// if is_shootout_assets_loaded()
// @SBA - keep an eye on this in case it causes the lead in to take too long
IF HAVE_METH_ARRIVAL_ASSETS_LOADED()
and not is_any_text_being_displayed(locates_data)
if HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
if start_new_cutscene_no_fade(false, true, false)
CPRINTLN(DEBUG_MISSION, "*** ARRIVAL CUTSCENE STARTING ***")
clear_prints()
players_weapon_obj = CREATE_WEAPON_OBJECT(WEAPONTYPE_CARBINERIFLE, 500, <<1389.4, 3613.0, 39.7>>, true)
GIVE_WEAPON_COMPONENT_TO_WEAPON_OBJECT(players_weapon_obj, WEAPONCOMPONENT_CARBINERIFLE_CLIP_01)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
register_entity_for_cutscene(PLAYER_PED_ID(), "trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, PLAYER_TWO)
ENDIF
IF NOT IS_PED_INJURED(cheng.ped)
register_entity_for_cutscene(cheng.ped, "Tao", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(translator.ped)
register_entity_for_cutscene(translator.ped, "Taos_Translator", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(buddy.ped)
register_entity_for_cutscene(buddy.ped, "cook", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF DOES_ENTITY_EXIST(players_weapon_obj)
register_entity_for_cutscene(players_weapon_obj, "Trevors_Weapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
//Ross W
REPLAY_RECORD_BACK_FOR_TIME(10.0, 0.0)
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
start_cutscene()
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<1357.68, 3556.56, -100.00>>, <<1436.65, 3672.06, 100.00>>, false)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<1335.97, 3598.28, -100.00>>, <<1368.15, 3575.16, 100.00>>, false)
add_scenario_blocking_area(<<1587.6, 4259.42, -100.00>>, <<646.61, 3118.71, 100.00>>)
add_scenario_blocking_area(<<1829.64, 3625.69, -100.00>>, <<1538.96, 3710.29, 100.00>>)
set_ped_paths_in_area(<<1587.6, 4259.42, -100.00>>, <<646.61, 3118.71, 100.00>>, false)
set_roads_in_area(<<434.6, 3477.0, 36.3>>, <<1605.5, 4247.2, -100.00>>, FALSE)
set_roads_in_area(<<1829.64, 3625.69, -100.00>>, <<1538.96, 3710.29, 100.00>>, false)
meth_interior = get_interior_at_coords_with_type(<<1392.5117, 3603.1851, 38.5>>, "v_methlab")
pin_interior_in_memory(meth_interior)
clear_player_wanted_level(player_id())
//g_allowmaxwantedlevelcheck = false
set_max_wanted_level(0)
set_create_random_cops(false)
disable_dispatch_services()
//SET_ALL_RANDOM_PEDS_FLEE(player_id(), true) //forces random hell billies not to attack the palyer as they can become violent.
remove_blip(meth_lab_blip)
SET_FRONTEND_RADIO_ACTIVE(TRUE)
trigger_music_event("CHN1_START")
original_time = get_game_timer()
buddy_time = get_game_timer()
get_to_meth_lab_status++
endif
ELSE
CPRINTLN(DEBUG_MISSION, "*** WAITING ON CUTSCENE TO LOAD ***")
endif
ELSE
CPRINTLN(DEBUG_MISSION, "*** WAITING ON ASSEST/DIALOGUE ***")
endif
break
case 3
if is_cutscene_playing()
// @SBA - this is where cheng and translator get deleted
if does_entity_exist(translator.ped)
CPRINTLN(DEBUG_MISSION, "Unloading Translator")
DELETE_PED(translator.ped)
set_model_as_no_longer_needed(translator.model)
endif
if does_entity_exist(cheng.ped)
CPRINTLN(DEBUG_MISSION, "Unloading Cheng")
DELETE_PED(cheng.ped)
set_model_as_no_longer_needed(cheng.model)
endif
clear_area(<<1403.1777, 3597.2070, 33.7417>>, 400.00, true)
//repostion_players_last_vehicle(players_last_vehicle, <<1402.2213, 3597.3352, 33.8866>>, <<50.00, 50.00, 50.00>>, <<1402.2213, 3597.3352, 33.8866>>, 108.7487)
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(tbArrivalCutResolveVol.vMin, tbArrivalCutResolveVol.vMax, tbArrivalCutResolveVol.flWidth,
vTrevorsVehicleMethLabLoc, fTrevorsVehicleMethLabHead)
SET_MISSION_VEHICLE_GEN_VEHICLE(trevors_truck.veh, vTrevorsVehicleMethLabLoc, fTrevorsVehicleMethLabHead)
if is_audio_scene_active("CHI_1_DRIVE_TO_LAB")
stop_audio_scene("CHI_1_DRIVE_TO_LAB")
endif
// clean up cameras
RENDER_SCRIPT_CAMS(FALSE, FALSE)
IF DOES_CAM_EXIST(camera_a)
SET_CAM_ACTIVE(camera_a, FALSE)
DESTROY_CAM(camera_a)
ENDIF
IF DOES_CAM_EXIST(camera_b)
SET_CAM_ACTIVE(camera_b, FALSE)
DESTROY_CAM(camera_b)
ENDIF
// stop load scene if needed
IF IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_STOP()
CPRINTLN(DEBUG_MISSION, GET_THIS_SCRIPT_NAME(), ": Meth Lab Arrival (cutscene has started): calling NEW_LOAD_SCENE_STOP.")
ENDIF
// new cam
camera_a = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<1391.3059, 3601.0103, 39.5685>>, <<-12.6533, 0.0000, 111.6413>>, 50.0)
get_to_meth_lab_status++
endif
break
case 4
INT iCutTime
iCutTime = get_cutscene_time()
CPRINTLN(DEBUG_MISSION, "Cutscene Time = ", iCutTime)
// @SBA - trying to free up some more memory for the cutscene
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0)
IF IS_CUTSCENE_PLAYING()
if not WAS_CUTSCENE_SKIPPED()
if not has_label_been_triggered("CHN1_ICE_BIN")
if prepare_music_event("CHN1_ICE_BIN")
if iCutTime >= 23498
trigger_music_event("CHN1_ICE_BIN")
set_label_as_triggered("CHN1_ICE_BIN", true)
//script_assert("test")
endif
endif
else
if not IS_MUSIC_ONESHOT_PLAYING()
prepare_music_event("CHN1_GAMEPLAY_STARTS")
endif
endif
// request assets
IF iCutTime >= 40000
REQUEST_FIGHT_ASSETS()
IN_CASE_OF_ATTACK_BREAK_GLASS()
ENDIF
if iCutTime >= 41680
if not has_label_been_triggered("CHN1_NOW")
trigger_music_event("CHN1_NOW")
set_label_as_triggered("CHN1_NOW", true)
endif
endif
// @SBA set these up here, as they are now visible out the upstairs window
IF iCutTime > 45000
IF NOT DOES_ENTITY_EXIST(parked_cars[3])
IF HAS_MODEL_LOADED(phoenix)
setup_parked_cars()
ENDIF
ENDIF
ENDIF
IF iCutTime > 45100
AND NOT bInitialWavePropsMade
IF HAVE_FIGHT_ASSETS_LOADED()
CPRINTLN(DEBUG_MISSION, "Starting Wave Props Made")
SETUP_INITIAL_ENEMY_WAVE_PROPS()
SET_CUTSCENE_CAN_BE_SKIPPED(FALSE)
bInitialWavePropsMade = TRUE
ELSE
CPRINTLN(DEBUG_MISSION, "PROPS: WAITING FOR STARTING WAVE ASSESTS TO FINISH LOADING...")
ENDIF
ENDIF
IF iCutTime > 45250
AND NOT bStartedInitialWave
IF HAVE_FIGHT_ASSETS_LOADED()
IF SETUP_INITIAL_ENEMY_WAVE_IN_STAGES()
CPRINTLN(DEBUG_MISSION, "Starting Wave Made")
bStartedInitialWave = TRUE
ENDIF
ELSE
CPRINTLN(DEBUG_MISSION, "ENEMIES: WAITING FOR STARTING WAVE ASSESTS TO FINISH LOADING...")
ENDIF
ENDIF
if CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevors_Weapon")
if not has_ped_got_weapon(player_ped_id(), WEAPONTYPE_CARBINERIFLE)
give_weapon_object_to_ped(players_weapon_obj, player_ped_id())
else
if does_entity_exist(players_weapon_obj)
delete_object(players_weapon_obj)
endif
if get_ammo_in_ped_weapon(player_ped_id(), WEAPONTYPE_CARBINERIFLE) < 500
set_ped_ammo(player_ped_id(), WEAPONTYPE_CARBINERIFLE, 500)
endif
endif
endif
if CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("trevor", GET_PLAYER_PED_MODEL(char_trevor))
CPRINTLN(DEBUG_MISSION, "Arrival cutscene: exit for Trevor")
// SET_GAMEPLAY_CAM_RELATIVE_HEADING(127.0963 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
// SET_GAMEPLAY_CAM_RELATIVE_PITCH(-4.7568)
SETUP_PLAYER_POST_ARRIVAL_CUTSCENE()
endif
// Final cutscene cam seems to be too far from where the game cam can be
// so doing a blend to smooth the pop
if CAN_SET_EXIT_STATE_FOR_CAMERA()
CPRINTLN(DEBUG_MISSION, "Arrival cutscene: exit for camera")
if is_player_third_person_in_cover()
IF DOES_CAM_EXIST(camera_a)
CPRINTLN(DEBUG_MISSION, "Starting blend cam")
set_cam_active(camera_a, true)
render_script_cams(true, false)
ENDIF
ENDIF
if is_player_third_person_in_cover()
SET_GAMEPLAY_CAM_RELATIVE_HEADING(113.3477 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-12.500)
ELSE
SET_GAMEPLAY_CAM_RELATIVE_HEADING(102.8477 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-13.600)
ENDIF
//IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
//first person camera with third person in cover
//the gameplay camera will not update when player control is off.
//fps_with_thrid_person_in_cover the camera exit state is early and trevors exit state
//triggers 0.5 seconds later with his cover task.
//if player control is on. Trevors cover task updates the gameplay camera thus
//the relative gameplay camera heading returns to 0. As a result we can only unlock the
//player control if in full first person mode.
if not is_player_third_person_in_cover()
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
endif
else
if does_entity_exist(translator.ped)
CPRINTLN(DEBUG_MISSION, "SKIPPED: Unloading Translator")
DELETE_PED(translator.ped)
endif
set_model_as_no_longer_needed(translator.model)
if does_entity_exist(cheng.ped)
CPRINTLN(DEBUG_MISSION, "SKIPPED: Unloading Cheng")
DELETE_PED(cheng.ped)
endif
set_model_as_no_longer_needed(cheng.model)
set_cutscene_fade_values(false, false, true, false)
REQUEST_FIGHT_ASSETS()
get_to_meth_lab_status++
endif
ELSE
SET_CUTSCENE_CAN_BE_SKIPPED(TRUE)
get_to_meth_lab_status = 22
endif
if not is_player_third_person_in_cover()
SET_GAMEPLAY_CAM_RELATIVE_HEADING(102.8477 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-13.600)
endif
break
// IF SKIPPED
case 5
REQUEST_FIGHT_ASSETS()
if IS_CUTSCENE_PLAYING()
if CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevors_Weapon")
if not has_ped_got_weapon(player_ped_id(), WEAPONTYPE_CARBINERIFLE)
give_weapon_object_to_ped(players_weapon_obj, player_ped_id())
else
if does_entity_exist(players_weapon_obj)
delete_object(players_weapon_obj)
endif
if get_ammo_in_ped_weapon(player_ped_id(), WEAPONTYPE_CARBINERIFLE) < 500
set_ped_ammo(player_ped_id(), WEAPONTYPE_CARBINERIFLE, 500)
endif
endif
endif
else
SETUP_PLAYER_POST_ARRIVAL_CUTSCENE()
IN_CASE_OF_ATTACK_BREAK_GLASS()
while not is_interior_ready(meth_interior)
or not prepare_music_event("CHN1_GAMEPLAY_STARTS")
CPRINTLN(DEBUG_MISSION, "*** WAITING FOR INTERIOR AND MUSIC TO FINISH LOADING ***")
wait(0)
endwhile
// shouldn't need to do this, but just in case
IF DOES_CAM_EXIST(camera_a)
SET_CAM_ACTIVE(camera_a, FALSE)
DESTROY_CAM(camera_a)
ENDIF
trigger_music_event("CHN1_CS_SKIP")
mission_fail_checks()//checks all mission entities alive.
get_to_meth_lab_status = 23
endif
break
// NO SKIP
CASE 22
// SETUP_PLAYER_POST_ARRIVAL_CUTSCENE()
END_CUTSCENE_BASIC()
IF DOES_CAM_EXIST(camera_a)
DISABLE_FIRST_PERSON_FLASH_EFFECT_THIS_UPDATE()
//-- first person camera with third person in cover
//blends out earlier from the mocap cutscene. Therefore the camera exit will trigger before the
//player exit so the relative game play camera will change when the palyer is given the cover task.
//The relative gameplay cam will now be 0. As a result we need to set it again before the interp
//back to gameplay.
SET_GAMEPLAY_CAM_RELATIVE_HEADING(102.8477 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-13.600)
//--
render_script_cams(FALSE, TRUE, 750)
ENDIF
REPLAY_STOP_EVENT()
get_to_meth_lab_status++
BREAk
// @SBA - ensure assets have loaded before continuing
CASE 23
REQUEST_FIGHT_ASSETS()
CPRINTLN(DEBUG_MISSION, "*** WAITING FOR FIGHT ASSETS TO FINISH LOADING ***")
IF HAVE_FIGHT_ASSETS_LOADED()
// @SBA - return to normal
REDUCE_AMBIENT_MODELS(FALSE)
setup_start_of_shootout()
ENDIF
BREAK
endswitch
endproc
proc meth_lab_vehicle_recording()
switch vehicle_recording_system_status
case 0
// for i = 0 to 1
// wave_0_enemy_vehicle[i].veh = create_vehicle(wave_0_enemy_vehicle[i].model, wave_0_enemy_vehicle[i].pos, wave_0_enemy_vehicle[i].heading)
// set_vehicle_doors_locked(wave_0_enemy_vehicle[i].veh, vehiclelock_locked)
// start_playback_recorded_vehicle(wave_0_enemy_vehicle[i].veh, wave_0_enemy_vehicle[i].recording_number, "lkmethlab")
// skip_to_end_and_stop_playback_recorded_vehicle(wave_0_enemy_vehicle[i].veh)
// endfor
//
// for i = 5 to 6
// wave_2_enemy_vehicle[i].veh = create_vehicle(wave_2_enemy_vehicle[i].model, wave_2_enemy_vehicle[i].pos, wave_2_enemy_vehicle[i].heading)
// set_vehicle_doors_locked(wave_2_enemy_vehicle[i].veh, vehiclelock_locked)
// start_playback_recorded_vehicle(wave_2_enemy_vehicle[i].veh, wave_2_enemy_vehicle[i].recording_number, "lkmethlab")
// skip_to_end_and_stop_playback_recorded_vehicle(wave_2_enemy_vehicle[i].veh)
// endfor
for i = 5 to 5
wave_2_enemy_vehicle[i].veh = create_vehicle(wave_2_enemy_vehicle[i].model, wave_2_enemy_vehicle[i].pos, wave_2_enemy_vehicle[i].heading)
SET_VEHICLE_DIRT_LEVEL(wave_2_enemy_vehicle[i].veh, 13)
set_vehicle_doors_locked(wave_2_enemy_vehicle[i].veh, vehiclelock_locked)
start_playback_recorded_vehicle(wave_2_enemy_vehicle[i].veh, wave_2_enemy_vehicle[i].recording_number, "lkmethlab")
skip_time_in_playback_recorded_vehicle(wave_2_enemy_vehicle[i].veh, (GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(19, "lkmethlab") - 100))
set_entity_collision(wave_2_enemy_vehicle[i].veh, false)
endfor
wait(0)
pause_playback_recorded_vehicle(wave_2_enemy_vehicle[5].veh)
// comment back in for recording uber vehicles for wave 1
// wave_1_uber_vehicle = create_vehicle(pcj, <<1118.8160, 3541.5474, 34.1372>>, 272.0098)
// SET_ENTITY_VISIBLE(wave_1_uber_vehicle, false)
// SET_ENTITY_COLLISION(wave_1_uber_vehicle, false)
// SET_ENTITY_PROOFS(wave_1_uber_vehicle, true, true, true, true, true)
//
// INITIALISE_UBER_PLAYBACK("lkmethlab", true)
// load_uber_data()
// bCreateAllWaitingCars = TRUE
// start_playback_recorded_vehicle(wave_1_uber_vehicle, 013, "lkmethlab")
//
setup_parked_cars()
for i = 0 to count_of(bins) - 1
bins[i].obj = create_object_no_offset(bins[i].model, bins[i].pos)
SET_ENTITY_ROTATION(bins[i].obj, bins[i].rot)
FREEZE_ENTITY_POSITION(bins[i].obj, true)
endfor
vehicle_recording_system_status++
break
case 1
#if is_debug_build
DISPLAY_PLAYBACK_RECORDED_VEHICLE(wave_2_enemy_vehicle[2].veh, rdm_wholeline)
#endif
break
case 2
break
endswitch
endproc
//outside hicks bar
proc load_trip_skip_data_0()
request_start_of_mission_assets()
//REQUEST_BAR_PATRON_ASSETS()
IF NOT IS_REPLAY_BEING_SET_UP()
load_scene(<<1999.1615, 3057.8936, 46.049>>)
ENDIF
while not is_start_of_mission_assets_requested()
//AND NOT HAVE_BAR_PATRON_ASSETS_LOADED()
CPRINTLN(DEBUG_MISSION, "load_trip_skip_data_0 not loaded")
wait(0)
endwhile
create_start_of_mission_entities(false)
END_REPLAY_SETUP()
IF NOT IS_PED_INJURED(player_ped_id())
clear_ped_tasks_immediately(player_ped_id())
force_ped_motion_state(player_ped_id(), ms_on_foot_walk, false)
SIMULATE_PLAYER_INPUT_GAIT(player_id(), pedmove_walk, 300)
ENDIF
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(0, "Mission start")
if is_screen_faded_out()
end_cutscene()
else
end_cutscene_no_fade()
endif
INIT_CHENGS_CRAZY_CAR_DANCING()
// @SBA - not creating these guys on restart - was causing asserts I couldn't seem to fix
bBarPatronsCreated = TRUE
mission_flow = get_to_meth_lab
endproc
//wave 0
proc load_trip_skip_data_1()
request_model(GET_PLAYER_PED_MODEL(char_trevor))
request_model(buddy.model)
request_model(wave_0_enemy[0].model)
request_model(wave_0_enemy[1].model)
request_model(get_player_veh_model(char_trevor))
request_model(sadler)
request_model(dubsta2)
request_model(phoenix)
request_model(explosive_barrels[0].model)
request_model(bins[0].model)
request_model(cover_box.model)
request_model(pcj)
request_model(get_weapontype_model(weapontype_carbinerifle))
request_model(get_weapontype_model(weapontype_grenadelauncher))
request_model(get_weapontype_model(WEAPONTYPE_ASSAULTRIFLE))
request_weapon_asset(WEAPONTYPE_carbinerifle)
request_weapon_asset(WEAPONTYPE_grenadelauncher)
request_weapon_asset(WEAPONTYPE_ASSAULTRIFLE)
request_vehicle_recording(001, "lkmethlab")
request_vehicle_recording(002, "lkmethlab")
request_vehicle_recording(003, "lkmethlab")
// request_vehicle_recording(004, "lkmethlab")
// request_vehicle_recording(005, "lkmethlab")
// request_vehicle_recording(006, "lkmethlab")
request_vehicle_recording(007, "lkmethlab")
request_vehicle_recording(008, "lkmethlab")
request_vehicle_recording(009, "lkmethlab")
request_vehicle_recording(010, "lkmethlab")
request_vehicle_recording(011, "lkmethlab")
request_vehicle_recording(012, "lkmethlab")
// request_vehicle_recording(013, "lkmethlab")
// request_vehicle_recording(014, "lkmethlab")
// request_vehicle_recording(015, "lkmethlab")
// request_vehicle_recording(016, "lkmethlab")
request_vehicle_recording(017, "lkmethlab")
request_vehicle_recording(018, "lkmethlab")
request_vehicle_recording(019, "lkmethlab")
request_vehicle_recording(020, "lkmethlab")
request_vehicle_recording(021, "lkmethlab")
// request_vehicle_recording(030, "lkmethlab")
// request_vehicle_recording(031, "lkmethlab")
// request_vehicle_recording(032, "lkmethlab")
REQUEST_WAYPOINT_RECORDING("methlab1")
// REQUEST_WAYPOINT_RECORDING("methlab2")
REQUEST_WAYPOINT_RECORDING("methlab3")
REQUEST_WAYPOINT_RECORDING("methlab4")
REQUEST_WAYPOINT_RECORDING("methlab5")
// REQUEST_WAYPOINT_RECORDING("methlab6")
REQUEST_WAYPOINT_RECORDING("methlab7")
// REQUEST_WAYPOINT_RECORDING("methlab8")
// REQUEST_WAYPOINT_RECORDING("methlab9")
request_anim_dict("MissChinese1")
meth_interior = get_interior_at_coords_with_type(<<1392.5117, 3603.1851, 38.5>>, "v_methlab")
pin_interior_in_memory(meth_interior)
while not has_model_loaded(GET_PLAYER_PED_MODEL(char_trevor))
or not has_model_loaded(buddy.model)
or not has_model_loaded(wave_0_enemy[0].model)
or not has_model_loaded(wave_0_enemy[1].model)
or not has_model_loaded(get_player_veh_model(char_trevor))
or not has_model_loaded(sadler)
or not has_model_loaded(dubsta2)
or not has_model_loaded(phoenix)
or not has_model_loaded(explosive_barrels[0].model)
or not has_model_loaded(bins[0].model)
or not has_model_loaded(cover_box.model)
or not has_model_loaded(pcj)
or not has_model_loaded(get_weapontype_model(WEAPONTYPE_carbinerifle))
or not has_model_loaded(get_weapontype_model(weapontype_grenadelauncher))
or not has_model_loaded(get_weapontype_model(WEAPONTYPE_ASSAULTRIFLE))
or not has_weapon_asset_loaded(WEAPONTYPE_carbinerifle)
or not has_weapon_asset_loaded(WEAPONTYPE_grenadelauncher)
or not has_weapon_asset_loaded(WEAPONTYPE_ASSAULTRIFLE)
or not has_vehicle_recording_been_loaded(001, "lkmethlab")
or not has_vehicle_recording_been_loaded(002, "lkmethlab")
or not has_vehicle_recording_been_loaded(003, "lkmethlab")
// or not has_vehicle_recording_been_loaded(004, "lkmethlab")
// or not has_vehicle_recording_been_loaded(005, "lkmethlab")
// or not has_vehicle_recording_been_loaded(006, "lkmethlab")
or not has_vehicle_recording_been_loaded(007, "lkmethlab")
or not has_vehicle_recording_been_loaded(008, "lkmethlab")
or not has_vehicle_recording_been_loaded(009, "lkmethlab")
or not has_vehicle_recording_been_loaded(010, "lkmethlab")
or not has_vehicle_recording_been_loaded(011, "lkmethlab")
or not has_vehicle_recording_been_loaded(012, "lkmethlab")
// or not has_vehicle_recording_been_loaded(013, "lkmethlab")
// or not has_vehicle_recording_been_loaded(014, "lkmethlab")
// or not has_vehicle_recording_been_loaded(015, "lkmethlab")
// or not has_vehicle_recording_been_loaded(016, "lkmethlab")
or not has_vehicle_recording_been_loaded(017, "lkmethlab")
or not has_vehicle_recording_been_loaded(018, "lkmethlab")
or not has_vehicle_recording_been_loaded(019, "lkmethlab")
or not has_vehicle_recording_been_loaded(020, "lkmethlab")
or not has_vehicle_recording_been_loaded(021, "lkmethlab")
// or not has_vehicle_recording_been_loaded(030, "lkmethlab")
// or not has_vehicle_recording_been_loaded(031, "lkmethlab")
// or not has_vehicle_recording_been_loaded(032, "lkmethlab")
or not get_is_waypoint_recording_loaded("methlab1")
// or not get_is_waypoint_recording_loaded("methlab2")
or not get_is_waypoint_recording_loaded("methlab3")
or not get_is_waypoint_recording_loaded("methlab4")
or not get_is_waypoint_recording_loaded("methlab5")
// or not get_is_waypoint_recording_loaded("methlab6")
or not get_is_waypoint_recording_loaded("methlab7")
// or not get_is_waypoint_recording_loaded("methlab8")
// or not get_is_waypoint_recording_loaded("methlab9")
or not has_anim_dict_loaded("MissChinese1")
or not is_interior_ready(meth_interior)
CPRINTLN(DEBUG_MISSION, "load_trip_skip_data_1 not loaded")
wait(0)
endwhile
clear_player_wanted_level(player_id())
set_max_wanted_level(0)
set_create_random_cops(false)
disable_dispatch_services()
SET_ALL_RANDOM_PEDS_FLEE(player_id(), true)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<1357.68, 3556.56, -100.00>>, <<1436.65, 3672.06, 100.00>>, false)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<1335.97, 3598.28, -100.00>>, <<1368.15, 3575.16, 100.00>>, false)
add_scenario_blocking_area(<<1587.6, 4259.42, -100.00>>, <<646.61, 3118.71, 100.00>>)
add_scenario_blocking_area(<<1829.64, 3625.69, -100.00>>, <<1538.96, 3710.29, 100.00>>)
set_ped_paths_in_area(<<1587.6, 4259.42, -100.00>>, <<646.61, 3118.71, 100.00>>, false)
set_roads_in_area(<<434.6, 3477.0, 36.3>>, <<1605.5, 4247.2, -100.00>>, FALSE)
set_roads_in_area(<<1829.64, 3625.69, -100.00>>, <<1538.96, 3710.29, 100.00>>, false)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ml_door1, <<1392.93, 3599.47, 35.13>>, true, 0.0, 0.0, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ml_door1, <<1395.37, 3600.36, 35.13>>, true, 0.0, 0.0, -1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ml_door1, <<1392.93, 3599.47, 35.13>>, false, 0.0, 0.0, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ml_door1, <<1395.37, 3600.36, 35.13>>, false, 0.0, 0.0, -1.0)
// @SBA - opening outer doors to help player follow Chef
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ss_doorext, vBackDoorToRoof, TRUE, 0.0, 0.0, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ss_doorext, vDoorToBackStairs, TRUE, 0.0, 0.0, -1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ss_door04, vInteriorDoorStore, TRUE, 0.0, 0.0, -1.0)
clear_area(<<1998.2826, 3058.0435, 46.0491>>, 10000.00, true)
remove_decals_in_range(<<1998.2826, 3058.0435, 46.0491>>, 10000.00)
IF NOT IS_REPLAY_BEING_SET_UP()
SET_ENTITY_COORDS(player_ped_id(), vTrevorWindowStartPos) // @SBA - adjusting start position slightly. OLD VALUE = <<1389.5963, 3600.4568, 37.9418>>)
SET_ENTITY_HEADING(player_ped_id(), 21.5294)
ENDIF
//player should alway have the carbine rifle here
if not has_ped_got_weapon(player_ped_id(), WEAPONTYPE_CARBINERIFLE)
give_weapon_to_ped(player_ped_id(), WEAPONTYPE_CARBINERIFLE, 500, false)
else
if get_ammo_in_ped_weapon(player_ped_id(), WEAPONTYPE_CARBINERIFLE) < 500
set_ped_ammo(player_ped_id(), WEAPONTYPE_CARBINERIFLE, 500)
endif
endif
set_current_ped_weapon(player_ped_id(), WEAPONTYPE_CARBINERIFLE, true)
// @SBA - player vehicle
RECREATE_PLAYERS_VEHICLE(vTrevorsVehicleMethLabLoc, fTrevorsVehicleMethLabHead)
setup_buddy(buddy)
add_ped_for_dialogue(scripted_speech[0], 5, buddy.ped, "cook")
set_current_ped_weapon(buddy.ped, buddy.weapon, true)
// *****TEMP REMOVE
//SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(buddy.ped, true)
// *****
open_sequence_task(seq)
task_seek_cover_to_cover_point(null, buddy_cover_point[0], <<1372.01, 3596.31, 37.97>>, -1)
close_sequence_task(seq)
task_perform_sequence(buddy.ped, seq)
clear_sequence_task(seq)
for i = 0 to 1
SETUP_ENEMY_VEHICLE(wave_0_enemy_vehicle[i])
start_playback_recorded_vehicle(wave_0_enemy_vehicle[i].veh, wave_0_enemy_vehicle[i].recording_number, "lkmethlab")
if i = 0
skip_time_in_playback_recorded_vehicle(wave_0_enemy_vehicle[i].veh, 3000) //4000
set_vehicle_colours(wave_0_enemy_vehicle[i].veh, 0, 0)
elif i = 1
skip_time_in_playback_recorded_vehicle(wave_0_enemy_vehicle[i].veh, 4500) //5500
set_vehicle_colours(wave_0_enemy_vehicle[i].veh, 10, 10)
endif
endfor
setup_enemy(wave_0_enemy[0])
setup_enemy(wave_0_enemy[1])
setup_enemy_in_vehicle(wave_0_enemy[2], wave_0_enemy_vehicle[0].veh)
setup_enemy_in_vehicle(wave_0_enemy[3], wave_0_enemy_vehicle[0].veh, vs_front_right)
setup_enemy_in_vehicle(wave_0_enemy[4], wave_0_enemy_vehicle[0].veh, vs_back_left)
setup_enemy_in_vehicle(wave_0_enemy[5], wave_0_enemy_vehicle[1].veh)
setup_enemy_in_vehicle(wave_0_enemy[6], wave_0_enemy_vehicle[1].veh, vs_front_right)
setup_enemy_in_vehicle(wave_0_enemy[7], wave_0_enemy_vehicle[1].veh, vs_back_left)
setup_enemy_in_vehicle(wave_0_enemy[8], wave_0_enemy_vehicle[1].veh, vs_back_right)
setup_parked_cars()
for i = 0 to count_of(bins) - 1
bins[i].obj = create_object_no_offset(bins[i].model, bins[i].pos)
SET_ENTITY_ROTATION(bins[i].obj, bins[i].rot)
FREEZE_ENTITY_POSITION(bins[i].obj, true)
endfor
for i = 0 to count_of(explosive_barrels) - 1
explosive_barrels[i].obj = create_object_no_offset(explosive_barrels[i].model, explosive_barrels[i].pos)
SET_ENTITY_ROTATION(explosive_barrels[i].obj, explosive_barrels[i].rot)
endfor
cover_box.obj = create_object_no_offset(cover_box.model, cover_box.pos)
freeze_entity_position(cover_box.obj, true)
SET_ENTITY_ROTATION(cover_box.obj, cover_box.rot)
IF NOT IS_REPLAY_BEING_SET_UP()
load_scene(<<1389.5963, 3600.4568, 37.9419>>)
ENDIF
END_REPLAY_SETUP()
task_put_ped_directly_into_cover(player_ped_id(), vTrevorWindowStartPos, -1, false, 0.0, true, false, players_cover_point) // @SBA - adjusting start position slightly. OLD VALUE = <<1389.63, 3600.41, 37.94>>
force_ped_ai_and_animation_update(player_ped_id(), true)
SET_PED_USING_ACTION_MODE(player_ped_id(), true)
IN_CASE_OF_ATTACK_BREAK_GLASS()
original_time = get_game_timer()
buddy_time = get_game_timer()
trigger_music_event("CHN1_WAVE_ZERO_RT")
start_audio_scene("CHI_1_SHOOTOUT_01")
end_cutscene_no_fade(false, TRUE, 90, -12, 500, false)
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(1, "Start of Wave 0 shootout")
mission_flow = wave_0_system
endproc
//wave 0 outside enemies
proc load_trip_skip_data_2()
request_model(GET_PLAYER_PED_MODEL(char_trevor))
request_model(buddy.model)
request_model(wave_0_enemy[0].model)
request_model(wave_0_enemy[1].model)
request_model(get_player_veh_model(char_trevor))
request_model(sadler)
request_model(dubsta2)
request_model(phoenix)
request_model(explosive_barrels[0].model)
request_model(bins[0].model)
request_model(cover_box.model)
request_model(pcj)
request_model(get_weapontype_model(weapontype_carbinerifle))
request_model(get_weapontype_model(weapontype_grenadelauncher))
request_model(get_weapontype_model(WEAPONTYPE_ASSAULTRIFLE))
request_weapon_asset(WEAPONTYPE_carbinerifle)
request_weapon_asset(WEAPONTYPE_grenadelauncher)
request_weapon_asset(WEAPONTYPE_ASSAULTRIFLE)
request_vehicle_recording(001, "lkmethlab")
request_vehicle_recording(002, "lkmethlab")
request_vehicle_recording(003, "lkmethlab")
// request_vehicle_recording(004, "lkmethlab")
// request_vehicle_recording(005, "lkmethlab")
// request_vehicle_recording(006, "lkmethlab")
request_vehicle_recording(007, "lkmethlab")
request_vehicle_recording(008, "lkmethlab")
request_vehicle_recording(009, "lkmethlab")
request_vehicle_recording(010, "lkmethlab")
request_vehicle_recording(011, "lkmethlab")
request_vehicle_recording(012, "lkmethlab")
// request_vehicle_recording(013, "lkmethlab")
// request_vehicle_recording(014, "lkmethlab")
// request_vehicle_recording(015, "lkmethlab")
// request_vehicle_recording(016, "lkmethlab")
request_vehicle_recording(017, "lkmethlab")
request_vehicle_recording(018, "lkmethlab")
request_vehicle_recording(019, "lkmethlab")
request_vehicle_recording(020, "lkmethlab")
request_vehicle_recording(021, "lkmethlab")
// request_vehicle_recording(030, "lkmethlab")
// request_vehicle_recording(031, "lkmethlab")
// request_vehicle_recording(032, "lkmethlab")
REQUEST_WAYPOINT_RECORDING("methlab1")
// REQUEST_WAYPOINT_RECORDING("methlab2")
REQUEST_WAYPOINT_RECORDING("methlab3")
REQUEST_WAYPOINT_RECORDING("methlab4")
REQUEST_WAYPOINT_RECORDING("methlab5")
// REQUEST_WAYPOINT_RECORDING("methlab6")
REQUEST_WAYPOINT_RECORDING("methlab7")
// REQUEST_WAYPOINT_RECORDING("methlab8")
// REQUEST_WAYPOINT_RECORDING("methlab9")
request_anim_dict("MissChinese1")
meth_interior = get_interior_at_coords_with_type(<<1392.5117, 3603.1851, 38.5>>, "v_methlab")
pin_interior_in_memory(meth_interior)
while not has_model_loaded(GET_PLAYER_PED_MODEL(char_trevor))
or not has_model_loaded(buddy.model)
or not has_model_loaded(wave_0_enemy[0].model)
or not has_model_loaded(wave_0_enemy[1].model)
or not has_model_loaded(get_player_veh_model(char_trevor))
or not has_model_loaded(sadler)
or not has_model_loaded(dubsta2)
or not has_model_loaded(phoenix)
or not has_model_loaded(explosive_barrels[0].model)
or not has_model_loaded(bins[0].model)
or not has_model_loaded(cover_box.model)
or not has_model_loaded(pcj)
or not has_model_loaded(get_weapontype_model(WEAPONTYPE_carbinerifle))
or not has_model_loaded(get_weapontype_model(weapontype_grenadelauncher))
or not has_model_loaded(get_weapontype_model(WEAPONTYPE_ASSAULTRIFLE))
or not has_weapon_asset_loaded(WEAPONTYPE_carbinerifle)
or not has_weapon_asset_loaded(WEAPONTYPE_grenadelauncher)
or not has_weapon_asset_loaded(WEAPONTYPE_ASSAULTRIFLE)
or not has_vehicle_recording_been_loaded(001, "lkmethlab")
or not has_vehicle_recording_been_loaded(002, "lkmethlab")
or not has_vehicle_recording_been_loaded(003, "lkmethlab")
// or not has_vehicle_recording_been_loaded(004, "lkmethlab")
// or not has_vehicle_recording_been_loaded(005, "lkmethlab")
// or not has_vehicle_recording_been_loaded(006, "lkmethlab")
or not has_vehicle_recording_been_loaded(007, "lkmethlab")
or not has_vehicle_recording_been_loaded(008, "lkmethlab")
or not has_vehicle_recording_been_loaded(009, "lkmethlab")
or not has_vehicle_recording_been_loaded(010, "lkmethlab")
or not has_vehicle_recording_been_loaded(011, "lkmethlab")
or not has_vehicle_recording_been_loaded(012, "lkmethlab")
// or not has_vehicle_recording_been_loaded(013, "lkmethlab")
// or not has_vehicle_recording_been_loaded(014, "lkmethlab")
// or not has_vehicle_recording_been_loaded(015, "lkmethlab")
// or not has_vehicle_recording_been_loaded(016, "lkmethlab")
or not has_vehicle_recording_been_loaded(017, "lkmethlab")
or not has_vehicle_recording_been_loaded(018, "lkmethlab")
or not has_vehicle_recording_been_loaded(019, "lkmethlab")
or not has_vehicle_recording_been_loaded(020, "lkmethlab")
or not has_vehicle_recording_been_loaded(021, "lkmethlab")
// or not has_vehicle_recording_been_loaded(030, "lkmethlab")
// or not has_vehicle_recording_been_loaded(031, "lkmethlab")
// or not has_vehicle_recording_been_loaded(032, "lkmethlab")
or not get_is_waypoint_recording_loaded("methlab1")
// or not get_is_waypoint_recording_loaded("methlab2")
or not get_is_waypoint_recording_loaded("methlab3")
or not get_is_waypoint_recording_loaded("methlab4")
or not get_is_waypoint_recording_loaded("methlab5")
// or not get_is_waypoint_recording_loaded("methlab6")
or not get_is_waypoint_recording_loaded("methlab7")
// or not get_is_waypoint_recording_loaded("methlab8")
// or not get_is_waypoint_recording_loaded("methlab9")
or not has_anim_dict_loaded("MissChinese1")
or not is_interior_ready(meth_interior)
CPRINTLN(DEBUG_MISSION, "load_trip_skip_data_2 not loaded")
wait(0)
endwhile
clear_player_wanted_level(player_id())
//g_allowmaxwantedlevelcheck = false
set_max_wanted_level(0)
set_create_random_cops(false)
disable_dispatch_services()
SET_ALL_RANDOM_PEDS_FLEE(player_id(), true)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<1357.68, 3556.56, -100.00>>, <<1436.65, 3672.06, 100.00>>, false)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<1335.97, 3598.28, -100.00>>, <<1368.15, 3575.16, 100.00>>, false)
add_scenario_blocking_area(<<1587.6, 4259.42, -100.00>>, <<646.61, 3118.71, 100.00>>)
add_scenario_blocking_area(<<1829.64, 3625.69, -100.00>>, <<1538.96, 3710.29, 100.00>>)
set_roads_in_area(<<434.6, 3477.0, 36.3>>, <<1605.5, 4247.2, -100.00>>, FALSE)
set_roads_in_area(<<1829.64, 3625.69, -100.00>>, <<1538.96, 3710.29, 100.00>>, false)
clear_area(<<1390.8401, 3601.1016, 37.9419>>, 1000, true)
//front of shop doors
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ml_door1, <<1392.93, 3599.47, 35.13>>, true, 0.0, 0.0, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ml_door1, <<1395.37, 3600.36, 35.13>>, true, 0.0, 0.0, -1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ml_door1, <<1392.93, 3599.47, 35.13>>, false, 0.0, 0.0, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ml_door1, <<1395.37, 3600.36, 35.13>>, false, 0.0, 0.0, -1.0)
//gates outside methlab
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(prop_arm_gate_l, <<1372.27, 3608.99, 35.51>>, true, 0.0, 0.0, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(prop_arm_gate_l, <<1378.05, 3611.09, 35.51>>, true, 0.0, 0.0, -1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(prop_arm_gate_l, <<1372.27, 3608.99, 35.51>>, false, 0.0, 0.0, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(prop_arm_gate_l, <<1378.05, 3611.09, 35.51>>, false, 0.0, 0.0, -1.0)
// @SBA - opening outer doors to help player follow Chef
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ss_doorext, vBackDoorToRoof, TRUE, 0.0, 0.0, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ss_doorext, vDoorToBackStairs, TRUE, 0.0, 0.0, -1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ss_door04, vInteriorDoorStore, TRUE, 0.0, 0.0, -1.0)
setup_parked_cars()
for i = 0 to count_of(bins) - 1
bins[i].obj = create_object_no_offset(bins[i].model, bins[i].pos)
SET_ENTITY_ROTATION(bins[i].obj, bins[i].rot)
FREEZE_ENTITY_POSITION(bins[i].obj, true)
endfor
for i = 0 to count_of(explosive_barrels) - 1
explosive_barrels[i].obj = create_object_no_offset(explosive_barrels[i].model, explosive_barrels[i].pos)
SET_ENTITY_ROTATION(explosive_barrels[i].obj, explosive_barrels[i].rot)
endfor
cover_box.obj = create_object_no_offset(cover_box.model, cover_box.pos)
freeze_entity_position(cover_box.obj, true)
SET_ENTITY_ROTATION(cover_box.obj, cover_box.rot)
IF g_replay.iReplayInt[PLAYER_DESTROYED_VEHICLES] = WAVE0_BOTH_CARS_DEAD
OR g_replay.iReplayInt[PLAYER_DESTROYED_VEHICLES] = WAVE0_ONLY_CAR1_ALIVE
wave_0_enemy_vehicle[0].been_destroyed = TRUE
ENDIF
IF g_replay.iReplayInt[PLAYER_DESTROYED_VEHICLES] = WAVE0_BOTH_CARS_DEAD
OR g_replay.iReplayInt[PLAYER_DESTROYED_VEHICLES] = WAVE0_ONLY_CAR0_ALIVE
wave_0_enemy_vehicle[1].been_destroyed = TRUE
ENDIF
for i = 0 to 2
IF NOT wave_0_enemy_vehicle[i].been_destroyed
SETUP_ENEMY_VEHICLE(wave_0_enemy_vehicle[i])
start_playback_recorded_vehicle(wave_0_enemy_vehicle[i].veh, wave_0_enemy_vehicle[i].recording_number, "lkmethlab")
skip_to_end_and_stop_playback_recorded_vehicle(wave_0_enemy_vehicle[i].veh)
// @SBA - set colors
if i = 0
set_vehicle_colours(wave_0_enemy_vehicle[i].veh, 0, 0)
REMOVE_VEHICLE_BLIP(wave_0_enemy_vehicle[i])
elif i = 1
set_vehicle_colours(wave_0_enemy_vehicle[i].veh, 10, 10)
REMOVE_VEHICLE_BLIP(wave_0_enemy_vehicle[i])
endif
ENDIF
endfor
setup_enemy_in_vehicle(wave_0_inside_enemy[0], wave_0_enemy_vehicle[2].veh)
setup_enemy_in_vehicle(wave_0_inside_enemy[1], wave_0_enemy_vehicle[2].veh, vs_front_right)
setup_enemy_in_vehicle(wave_0_inside_enemy[2], wave_0_enemy_vehicle[2].veh, vs_back_left)
setup_enemy_in_vehicle(wave_0_inside_enemy[3], wave_0_enemy_vehicle[2].veh, vs_back_right)
for i = 0 to count_of(wave_0_inside_enemy) - 1
SET_COMBAT_FLOAT(wave_0_inside_enemy[i].ped, CCF_WEAPON_ACCURACY, 0.10)
endfor
clear_ped_tasks_immediately(player_ped_id())
IF NOT IS_REPLAY_BEING_SET_UP()
SET_ENTITY_COORDS(player_ped_id(), <<1390.8401, 3601.1016, 37.9419>>)
SET_ENTITY_HEADING(player_ped_id(), 323.8041)
ENDIF
if not has_ped_got_weapon(player_ped_id(), WEAPONTYPE_CARBINERIFLE)
give_weapon_to_ped(player_ped_id(), WEAPONTYPE_CARBINERIFLE, 500, false)
else
if get_ammo_in_ped_weapon(player_ped_id(), WEAPONTYPE_CARBINERIFLE) < 500
set_ped_ammo(player_ped_id(), WEAPONTYPE_CARBINERIFLE, 500)
endif
endif
setup_weapon_for_ped(player_ped_id(), WEAPONTYPE_CARBINERIFLE, 500, true, true, false)
// @SBA - trying this
// CREATE_PLAYER_VEHICLE(trevors_truck.veh, CHAR_TREVOR, <<1409.9990, 3600.4973, 33.8676>>, 108.7487, false)
// set_vehicle_doors_locked(trevors_truck.veh, vehiclelock_locked)
// SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(trevors_truck.veh, false)
// set_vehicle_engine_on(trevors_truck.veh, false, true)
RECREATE_PLAYERS_VEHICLE(vTrevorsVehicleMethLabLoc, fTrevorsVehicleMethLabHead)
buddy.pos = <<1387.5570, 3607.2000, 37.9419>>
buddy.heading = 244.5938
setup_buddy(buddy)
set_current_ped_weapon(buddy.ped, weapontype_carbinerifle, true)
add_ped_for_dialogue(scripted_speech[0], 5, buddy.ped, "cook")
task_look_at_entity(buddy.ped, player_ped_id(), -1)
IF NOT IS_REPLAY_BEING_SET_UP()
load_scene(<<1389.5963, 3600.4568, 37.9419>>)
ENDIF
END_REPLAY_SETUP()
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
// re-break glass
object_index glass_window
IF NOT DOES_ENTITY_EXIST(glass_window)
glass_window = get_closest_object_of_type(<<1389.11, 3600.43, 39.51>>, 2.0, v_ret_ml_win5)
ENDIF
//crack type
//2 = shoutgun
//3 = explosion
break_entity_glass(glass_window, <<1389.16, 3600.3, 39.5>>, 2.0, <<0.0, 1.0, 0.0>>, 1100.00, 3, TRUE)
break_entity_glass(glass_window, <<1388.8, 3600.9, 39.0>>, 2.0, <<0.0, 1.0, 0.0>>, 1100, 2, TRUE)
break_entity_glass(glass_window, <<1389.3, 3600.1, 39.7>>, 2.0, <<0.0, 1.0, 0.0>>, 1100.00, 2, TRUE)
SET_OBJECT_AS_NO_LONGER_NEEDED(glass_window)
//fakes all the wave_0_enemy as dead.
for i = 0 to count_of(wave_0_enemy) - 1
wave_0_enemy[i].created = true
endfor
wave_0_dialogue_system_status = 22
wave_0_buddy_ai_system_status = 1
wave_0_assisted_nodes_system_status = 1
wave_0_master_flow_system_status = 50 // dialogue set properly here
bChefRunsToBackStairs = TRUE
mission_flow = wave_0_system
original_time = get_game_timer()
trigger_music_event("CHN1_OUTSIDE_RT")
SET_GAMEPLAY_CAM_RELATIVE_HEADING(30)
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(2, "Wave 0 outside enemies")
endproc
//wave 2 after grenade launcher cutscene
proc load_trip_skip_data_3()
request_model(GET_PLAYER_PED_MODEL(char_trevor))
request_model(buddy.model)
request_model(wave_0_enemy[0].model)
request_model(wave_0_enemy[1].model)
request_model(get_player_veh_model(char_trevor))
request_model(sadler)
request_model(dubsta2)
request_model(phoenix)
request_model(explosive_barrels[0].model)
request_model(bins[0].model)
request_model(cover_box.model)
request_model(pcj)
request_model(c4[0].model)
request_model(get_weapontype_model(weapontype_carbinerifle))
request_weapon_asset(weapontype_carbinerifle)
request_model(get_weapontype_model(weapontype_grenadelauncher))
request_weapon_asset(WEAPONTYPE_grenadelauncher)
request_vehicle_recording(001, "lkmethlab")
request_vehicle_recording(002, "lkmethlab")
request_vehicle_recording(003, "lkmethlab")
// request_vehicle_recording(004, "lkmethlab")
// request_vehicle_recording(005, "lkmethlab")
// request_vehicle_recording(006, "lkmethlab")
request_vehicle_recording(007, "lkmethlab")
request_vehicle_recording(008, "lkmethlab")
request_vehicle_recording(009, "lkmethlab")
request_vehicle_recording(010, "lkmethlab")
request_vehicle_recording(011, "lkmethlab")
request_vehicle_recording(012, "lkmethlab")
// request_vehicle_recording(013, "lkmethlab")
// request_vehicle_recording(014, "lkmethlab")
// request_vehicle_recording(015, "lkmethlab")
// request_vehicle_recording(016, "lkmethlab")
request_vehicle_recording(017, "lkmethlab")
request_vehicle_recording(018, "lkmethlab")
request_vehicle_recording(019, "lkmethlab")
request_vehicle_recording(020, "lkmethlab")
request_vehicle_recording(021, "lkmethlab")
// request_vehicle_recording(030, "lkmethlab")
// request_vehicle_recording(031, "lkmethlab")
// request_vehicle_recording(032, "lkmethlab")
REQUEST_WAYPOINT_RECORDING("methlab1")
// REQUEST_WAYPOINT_RECORDING("methlab2")
REQUEST_WAYPOINT_RECORDING("methlab3")
REQUEST_WAYPOINT_RECORDING("methlab4")
REQUEST_WAYPOINT_RECORDING("methlab5")
// REQUEST_WAYPOINT_RECORDING("methlab6")
REQUEST_WAYPOINT_RECORDING("methlab7")
// REQUEST_WAYPOINT_RECORDING("methlab8")
// REQUEST_WAYPOINT_RECORDING("methlab9")
request_anim_dict("MissChinese1")
meth_interior = get_interior_at_coords_with_type(<<1392.5117, 3603.1851, 38.5>>, "v_methlab")
pin_interior_in_memory(meth_interior)
while not has_model_loaded(GET_PLAYER_PED_MODEL(char_trevor))
or not has_model_loaded(buddy.model)
or not has_model_loaded(wave_0_enemy[0].model)
or not has_model_loaded(wave_0_enemy[1].model)
or not has_model_loaded(get_player_veh_model(char_trevor))
or not has_model_loaded(sadler)
or not has_model_loaded(dubsta2)
or not has_model_loaded(phoenix)
or not has_model_loaded(explosive_barrels[0].model)
or not has_model_loaded(bins[0].model)
or not has_model_loaded(cover_box.model)
or not has_model_loaded(pcj)
or not has_model_loaded(c4[0].model)
or not has_model_loaded(get_weapontype_model(weapontype_carbinerifle))
or not has_weapon_asset_loaded(weapontype_carbinerifle)
or not has_model_loaded(get_weapontype_model(weapontype_grenadelauncher))
or not has_weapon_asset_loaded(weapontype_grenadelauncher)
or not has_vehicle_recording_been_loaded(001, "lkmethlab")
or not has_vehicle_recording_been_loaded(002, "lkmethlab")
or not has_vehicle_recording_been_loaded(003, "lkmethlab")
// or not has_vehicle_recording_been_loaded(004, "lkmethlab")
// or not has_vehicle_recording_been_loaded(005, "lkmethlab")
// or not has_vehicle_recording_been_loaded(006, "lkmethlab")
or not has_vehicle_recording_been_loaded(007, "lkmethlab")
or not has_vehicle_recording_been_loaded(008, "lkmethlab")
or not has_vehicle_recording_been_loaded(009, "lkmethlab")
or not has_vehicle_recording_been_loaded(010, "lkmethlab")
or not has_vehicle_recording_been_loaded(011, "lkmethlab")
or not has_vehicle_recording_been_loaded(012, "lkmethlab")
// or not has_vehicle_recording_been_loaded(013, "lkmethlab")
// or not has_vehicle_recording_been_loaded(014, "lkmethlab")
// or not has_vehicle_recording_been_loaded(015, "lkmethlab")
// or not has_vehicle_recording_been_loaded(016, "lkmethlab")
or not has_vehicle_recording_been_loaded(017, "lkmethlab")
or not has_vehicle_recording_been_loaded(018, "lkmethlab")
or not has_vehicle_recording_been_loaded(019, "lkmethlab")
or not has_vehicle_recording_been_loaded(020, "lkmethlab")
or not has_vehicle_recording_been_loaded(021, "lkmethlab")
// or not has_vehicle_recording_been_loaded(030, "lkmethlab")
// or not has_vehicle_recording_been_loaded(031, "lkmethlab")
// or not has_vehicle_recording_been_loaded(032, "lkmethlab")
or not get_is_waypoint_recording_loaded("methlab1")
// or not get_is_waypoint_recording_loaded("methlab2")
or not get_is_waypoint_recording_loaded("methlab3")
or not get_is_waypoint_recording_loaded("methlab4")
or not get_is_waypoint_recording_loaded("methlab5")
// or not get_is_waypoint_recording_loaded("methlab6")
or not get_is_waypoint_recording_loaded("methlab7")
// or not get_is_waypoint_recording_loaded("methlab8")
// or not get_is_waypoint_recording_loaded("methlab9")
or not has_anim_dict_loaded("MissChinese1")
or not is_interior_ready(meth_interior)
CPRINTLN(DEBUG_MISSION, "load_trip_skip_data_3 not loaded")
wait(0)
endwhile
//setup dead ped flags from before grenade launcher cutscene
//kids dead system on peds have been created
for i = 2 to 5
wave_2_enemy[i].created = true
endfor
wave_2_enemy[10].created = true
wave_2_enemy[11].created = true
wave_2_enemy[19].created = true
clear_player_wanted_level(player_id())
//g_allowmaxwantedlevelcheck = false
set_max_wanted_level(0)
set_create_random_cops(false)
disable_dispatch_services()
SET_ALL_RANDOM_PEDS_FLEE(player_id(), true)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<1357.68, 3556.56, -100.00>>, <<1436.65, 3672.06, 100.00>>, false)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<1335.97, 3598.28, -100.00>>, <<1368.15, 3575.16, 100.00>>, false)
add_scenario_blocking_area(<<1587.6, 4259.42, -100.00>>, <<646.61, 3118.71, 100.00>>)
add_scenario_blocking_area(<<1829.64, 3625.69, -100.00>>, <<1538.96, 3710.29, 100.00>>)
set_ped_paths_in_area(<<1587.6, 4259.42, -100.00>>, <<646.61, 3118.71, 100.00>>, false)
set_roads_in_area(<<434.6, 3477.0, 36.3>>, <<1605.5, 4247.2, -100.00>>, FALSE)
set_roads_in_area(<<1829.64, 3625.69, -100.00>>, <<1538.96, 3710.29, 100.00>>, false)
// SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ml_door1, <<1392.93, 3599.47, 35.13>>, true, 0.0, 0.0, 1.0)
// SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ml_door1, <<1395.37, 3600.36, 35.13>>, true, 0.0, 0.0, -1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ml_door1, <<1392.93, 3599.47, 35.13>>, false, 0.0, 0.0, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ml_door1, <<1395.37, 3600.36, 35.13>>, false, 0.0, 0.0, -1.0)
// @SBA - opening outer doors to help player follow Chef
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ss_doorext, vBackDoorToRoof, TRUE, 0.0, 0.0, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ss_door04, vInteriorDoorStore, TRUE, 0.0, 0.0, -1.0)
// shutting this door for frame rate
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ss_doorext, vDoorToBackStairs, FALSE, 0.0, 0.0, 0.0)
clear_area(<<1998.2826, 3058.0435, 46.0491>>, 10000.00, true)
remove_decals_in_range(<<1998.2826, 3058.0435, 46.0491>>, 10000.00)
setup_parked_cars()
for i = 0 to count_of(bins) - 1
bins[i].obj = create_object_no_offset(bins[i].model, bins[i].pos)
SET_ENTITY_ROTATION(bins[i].obj, bins[i].rot)
FREEZE_ENTITY_POSITION(bins[i].obj, true)
endfor
for i = 0 to count_of(explosive_barrels) - 1
explosive_barrels[i].obj = create_object_no_offset(explosive_barrels[i].model, explosive_barrels[i].pos)
SET_ENTITY_ROTATION(explosive_barrels[i].obj, explosive_barrels[i].rot)
endfor
cover_box.obj = create_object_no_offset(cover_box.model, cover_box.pos)
freeze_entity_position(cover_box.obj, true)
SET_ENTITY_ROTATION(cover_box.obj, cover_box.rot)
// @SBA - trying this
// CREATE_PLAYER_VEHICLE(trevors_truck.veh, CHAR_TREVOR, <<1409.9990, 3600.4973, 33.8676>>, 108.7487, false)
// set_vehicle_doors_locked(trevors_truck.veh, vehiclelock_locked)
// SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(trevors_truck.veh, false)
// set_vehicle_engine_on(trevors_truck.veh, false, true)
RECREATE_PLAYERS_VEHICLE(vTrevorsVehicleMethLabLoc, fTrevorsVehicleMethLabHead)
for i = 2 to 6
if i != 5
SETUP_ENEMY_VEHICLE(wave_2_enemy_vehicle[i])
start_playback_recorded_vehicle(wave_2_enemy_vehicle[i].veh, wave_2_enemy_vehicle[i].recording_number, "lkmethlab")
skip_to_end_and_stop_playback_recorded_vehicle(wave_2_enemy_vehicle[i].veh)
REMOVE_VEHICLE_BLIP(wave_2_enemy_vehicle[i])
endif
endfor
for i = 0 to 1
wave_2_enemy[i].pos = wave_2_enemy[i].run_to_pos
setup_enemy(wave_2_enemy[i])
TASK_AIM_GUN_AT_ENTITY(wave_2_enemy[i].ped, PLAYER_PED_ID(), -1, TRUE)
SET_PED_RESET_FLAG(wave_2_enemy[i].ped, PRF_InstantBlendToAim, TRUE)
endfor
for i = 18 to 18//19
wave_2_enemy[i].pos = wave_2_enemy[i].run_to_pos
setup_enemy(wave_2_enemy[i])
TASK_AIM_GUN_AT_ENTITY(wave_2_enemy[i].ped, PLAYER_PED_ID(), -1, TRUE)
SET_PED_RESET_FLAG(wave_2_enemy[i].ped, PRF_InstantBlendToAim, TRUE)
endfor
//***************** AFTER CUTSCENE
for i = 0 to 1
SETUP_ENEMY_VEHICLE(wave_2_enemy_vehicle[i])
start_playback_recorded_vehicle(wave_2_enemy_vehicle[i].veh, wave_2_enemy_vehicle[i].recording_number, "lkmethlab")
if i = 0
skip_time_in_playback_recorded_vehicle(wave_2_enemy_vehicle[i].veh, 8000)
elif i = 1
skip_time_in_playback_recorded_vehicle(wave_2_enemy_vehicle[i].veh, 5500)
elif i = 2
skip_time_in_playback_recorded_vehicle(wave_2_enemy_vehicle[i].veh, 500)
endif
endfor
setup_enemy_in_vehicle(wave_2_enemy[6], wave_2_enemy_vehicle[0].veh)
setup_enemy_in_vehicle(wave_2_enemy[7], wave_2_enemy_vehicle[0].veh, vs_front_right)
setup_enemy_in_vehicle(wave_2_enemy[8], wave_2_enemy_vehicle[1].veh)
setup_enemy_in_vehicle(wave_2_enemy[9], wave_2_enemy_vehicle[1].veh, vs_front_right)
if not has_ped_got_weapon(player_ped_id(), WEAPONTYPE_CARBINERIFLE)
give_weapon_to_ped(player_ped_id(), WEAPONTYPE_CARBINERIFLE, 500, false, false)
else
if get_ammo_in_ped_weapon(player_ped_id(), WEAPONTYPE_CARBINERIFLE) < 500
set_ped_ammo(player_ped_id(), WEAPONTYPE_CARBINERIFLE, 500)
endif
endif
// standard resets
player_grenade_launcher_cutscene_status = 99 //DEACTIVATES grenade launcher cutscene.
wave_2_buddy_ai_system_status = 3
wave_2_dialogue_system_status = 22
wave_2_assisted_nodes_system_status = 0
wave_2_master_flow_system_status = 6
wave_2_audio_scene_system_status = 3
// @SBA - play grenade launcher cutscene if needed
IF g_replay.iReplayInt[PLAYER_RECEIVED_GRENADE_LAUNCHER] = NOT_GOT_GLAUNCHER
CPRINTLN(DEBUG_MISSION, "load_trip_skip_data_3: ARE playing gren launch cutscene")
set_current_ped_weapon(player_ped_id(), WEAPONTYPE_CARBINERIFLE, true)
// update resets
player_grenade_launcher_cutscene_status = 0
wave_2_master_flow_system_status = 5
wave_2_audio_scene_system_status = 1
// Don't need to see it
ELSE
CPRINTLN(DEBUG_MISSION, "load_trip_skip_data_3: NOT playing gren launch cutscene")
if not has_ped_got_weapon(player_ped_id(), weapontype_grenadelauncher)
give_weapon_to_ped(player_ped_id(), weapontype_grenadelauncher, kiGrenadeLauncherAmmo, false)
else
// @SBA - ensure player gets just 3 rounds
SET_GRENADE_LAUNCHER_AMMO()
endif
set_current_ped_weapon(player_ped_id(), weapontype_grenadelauncher, true)
REFILL_AMMO_INSTANTLY(PLAYER_PED_ID())
start_audio_scene("CHI_1_SHOOTOUT_GRENADE_LAUNCHER")
ENDIF
clear_ped_tasks_immediately(player_ped_id())
IF NOT IS_REPLAY_BEING_SET_UP()
SET_ENTITY_COORDS(player_ped_id(), vTrevorBackDeckStartPos)//<<1408.0160, 3612.2808, 38.0056>>)
SET_ENTITY_HEADING(player_ped_id(), 19.5667)
ENDIF
SET_PED_USING_ACTION_MODE(player_ped_id(), true)
buddy.pos = <<1406.4009, 3615.2783, 38.0056>>
buddy.heading = 292.8793
setup_buddy(buddy)
add_ped_for_dialogue(scripted_speech[0], 5, buddy.ped, "cook")
set_blocking_of_non_temporary_events(buddy.ped, false)
set_ped_sphere_defensive_area(buddy.ped, <<1406.70, 3615.67, 38.01>>, 2.0)
task_combat_hated_targets_around_ped(buddy.ped, 100.00)
IF NOT IS_REPLAY_BEING_SET_UP()
load_scene(<<1408.9497, 3612.3738, 38.0057>>)
ENDIF
END_REPLAY_SETUP()
task_put_ped_directly_into_cover(player_ped_id(), vTrevorBackDeckStartPos, -1, true, 0, true, true, players_cover_point_2)
force_ped_ai_and_animation_update(player_ped_id(), true)
original_time = get_game_timer()
// bypasses a timer in the gren launcher cutscene
cutscene_trigger_time = get_game_timer() - 5000
mission_flow = wave_2_system
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(3, "Wave 2 after grenade launcher cutscene")
trigger_music_event("CHN1_AFTER_GRENADE_RT")
IF g_replay.iReplayInt[PLAYER_RECEIVED_GRENADE_LAUNCHER] = HAS_GOT_GLAUNCHER
end_cutscene_no_fade(false, TRUE, -77.0, -19.0, 500, false)
ENDIF
print_now("METH_GOD_0", default_god_text_time, 1)
endproc
//wave 3
proc load_trip_skip_data_4()
request_model(GET_PLAYER_PED_MODEL(char_trevor))
request_model(buddy.model)
request_model(wave_0_enemy[0].model)
request_model(wave_0_enemy[1].model)
if not GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_ORTEGA_KILLED)
request_model(get_npc_ped_model(char_ortega))
endif
request_model(cheng.model)
request_model(translator.model)
REQUEST_MODEL(mnIceBox)
REQUEST_MODEL(mnIceBoxProxy)
request_model(get_player_veh_model(char_trevor))
request_model(sadler)
request_model(dubsta2)
request_model(phoenix)
request_model(explosive_barrels[0].model)
request_model(bins[0].model)
request_model(cover_box.model)
request_model(get_weapontype_model(weapontype_carbinerifle))
request_weapon_asset(weapontype_carbinerifle)
request_vehicle_recording(001, "lkmethlab")
request_vehicle_recording(002, "lkmethlab")
request_vehicle_recording(003, "lkmethlab")
// request_vehicle_recording(004, "lkmethlab")
// request_vehicle_recording(005, "lkmethlab")
// request_vehicle_recording(006, "lkmethlab")
request_vehicle_recording(007, "lkmethlab")
request_vehicle_recording(008, "lkmethlab")
request_vehicle_recording(009, "lkmethlab")
request_vehicle_recording(010, "lkmethlab")
request_vehicle_recording(011, "lkmethlab")
request_vehicle_recording(012, "lkmethlab")
// request_vehicle_recording(013, "lkmethlab")
// request_vehicle_recording(014, "lkmethlab")
// request_vehicle_recording(015, "lkmethlab")
// request_vehicle_recording(016, "lkmethlab")
request_vehicle_recording(017, "lkmethlab")
request_vehicle_recording(018, "lkmethlab")
request_vehicle_recording(019, "lkmethlab")
request_vehicle_recording(020, "lkmethlab")
request_vehicle_recording(021, "lkmethlab")
// request_vehicle_recording(030, "lkmethlab")
// request_vehicle_recording(031, "lkmethlab")
// request_vehicle_recording(032, "lkmethlab")
REQUEST_WAYPOINT_RECORDING("methlab1")
// REQUEST_WAYPOINT_RECORDING("methlab2")
REQUEST_WAYPOINT_RECORDING("methlab3")
REQUEST_WAYPOINT_RECORDING("methlab4")
REQUEST_WAYPOINT_RECORDING("methlab5")
// REQUEST_WAYPOINT_RECORDING("methlab6")
REQUEST_WAYPOINT_RECORDING("methlab7")
// REQUEST_WAYPOINT_RECORDING("methlab8")
// REQUEST_WAYPOINT_RECORDING("methlab9")
request_anim_dict("MissChinese1")
request_anim_dict("MissChinese1LeadInOutCHI_1_MCS_4")
meth_interior = get_interior_at_coords_with_type(<<1392.5117, 3603.1851, 38.5>>, "v_methlab")
pin_interior_in_memory(meth_interior)
while not has_model_loaded(GET_PLAYER_PED_MODEL(char_trevor))
or not has_model_loaded(buddy.model)
or not has_model_loaded(wave_0_enemy[0].model)
or not has_model_loaded(wave_0_enemy[1].model)
or (not GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_ORTEGA_KILLED) and not has_model_loaded(get_npc_ped_model(char_ortega)))
or not has_model_loaded(cheng.model)
or not has_model_loaded(translator.model)
or not has_model_loaded(mnIceBox)
or not has_model_loaded(mnIceBoxProxy)
or not has_model_loaded(get_player_veh_model(char_trevor))
or not has_model_loaded(sadler)
or not has_model_loaded(dubsta2)
or not has_model_loaded(phoenix)
or not has_model_loaded(explosive_barrels[0].model)
or not has_model_loaded(bins[0].model)
or not has_model_loaded(cover_box.model)
or not has_model_loaded(get_weapontype_model(WEAPONTYPE_carbinerifle))
or not has_weapon_asset_loaded(weapontype_carbinerifle)
or not has_vehicle_recording_been_loaded(001, "lkmethlab")
or not has_vehicle_recording_been_loaded(002, "lkmethlab")
or not has_vehicle_recording_been_loaded(003, "lkmethlab")
// or not has_vehicle_recording_been_loaded(004, "lkmethlab")
// or not has_vehicle_recording_been_loaded(005, "lkmethlab")
// or not has_vehicle_recording_been_loaded(006, "lkmethlab")
or not has_vehicle_recording_been_loaded(007, "lkmethlab")
or not has_vehicle_recording_been_loaded(008, "lkmethlab")
or not has_vehicle_recording_been_loaded(009, "lkmethlab")
or not has_vehicle_recording_been_loaded(010, "lkmethlab")
or not has_vehicle_recording_been_loaded(011, "lkmethlab")
or not has_vehicle_recording_been_loaded(012, "lkmethlab")
// or not has_vehicle_recording_been_loaded(013, "lkmethlab")
// or not has_vehicle_recording_been_loaded(014, "lkmethlab")
// or not has_vehicle_recording_been_loaded(015, "lkmethlab")
// or not has_vehicle_recording_been_loaded(016, "lkmethlab")
or not has_vehicle_recording_been_loaded(017, "lkmethlab")
or not has_vehicle_recording_been_loaded(018, "lkmethlab")
or not has_vehicle_recording_been_loaded(019, "lkmethlab")
or not has_vehicle_recording_been_loaded(020, "lkmethlab")
or not has_vehicle_recording_been_loaded(021, "lkmethlab")
// or not has_vehicle_recording_been_loaded(030, "lkmethlab")
// or not has_vehicle_recording_been_loaded(031, "lkmethlab")
// or not has_vehicle_recording_been_loaded(032, "lkmethlab")
or not get_is_waypoint_recording_loaded("methlab1")
// or not get_is_waypoint_recording_loaded("methlab2")
or not get_is_waypoint_recording_loaded("methlab3")
or not get_is_waypoint_recording_loaded("methlab4")
or not get_is_waypoint_recording_loaded("methlab5")
// or not get_is_waypoint_recording_loaded("methlab6")
or not get_is_waypoint_recording_loaded("methlab7")
// or not get_is_waypoint_recording_loaded("methlab8")
// or not get_is_waypoint_recording_loaded("methlab9")
or not has_anim_dict_loaded("MissChinese1")
or not has_anim_dict_loaded("MissChinese1LeadInOutCHI_1_MCS_4")
or not is_interior_ready(meth_interior)
wait(0)
endwhile
clear_player_wanted_level(player_id())
//g_allowmaxwantedlevelcheck = false
set_max_wanted_level(0)
set_create_random_cops(false)
disable_dispatch_services()
SET_ALL_RANDOM_PEDS_FLEE(player_id(), true)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<1357.68, 3556.56, -100.00>>, <<1436.65, 3672.06, 100.00>>, false)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<1335.97, 3598.28, -100.00>>, <<1368.15, 3575.16, 100.00>>, false)
add_scenario_blocking_area(<<1587.6, 4259.42, -100.00>>, <<646.61, 3118.71, 100.00>>)
add_scenario_blocking_area(<<1829.64, 3625.69, -100.00>>, <<1538.96, 3710.29, 100.00>>)
set_ped_paths_in_area(<<1587.6, 4259.42, -100.00>>, <<646.61, 3118.71, 100.00>>, false)
set_roads_in_area(<<434.6, 3477.0, 36.3>>, <<1605.5, 4247.2, -100.00>>, FALSE)
set_roads_in_area(<<1829.64, 3625.69, -100.00>>, <<1538.96, 3710.29, 100.00>>, false)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ml_door1, <<1392.93, 3599.47, 35.13>>, true, 0.0, 0.0, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ml_door1, <<1395.37, 3600.36, 35.13>>, true, 0.0, 0.0, -1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ml_door1, <<1392.93, 3599.47, 35.13>>, false, 0.0, 0.0, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ml_door1, <<1395.37, 3600.36, 35.13>>, false, 0.0, 0.0, -1.0)
// @SBA - Shutting outer doors to help with frame rate
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ss_doorext, vBackDoorToRoof, FALSE, 0.0, 0.0, 0.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ss_doorext, vDoorToBackStairs, FALSE, 0.0, 0.0, 0.0)
// @SBA - opening outer doors to help player follow Chef
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(v_ilev_ss_door04, vInteriorDoorStore, TRUE, 0.0, 0.0, -1.0)
clear_area(<<1998.2826, 3058.0435, 46.0491>>, 10000.00, true)
remove_decals_in_range(<<1998.2826, 3058.0435, 46.0491>>, 10000.00)
setup_parked_cars()
for i = 0 to count_of(bins) - 1
bins[i].obj = create_object_no_offset(bins[i].model, bins[i].pos)
SET_ENTITY_ROTATION(bins[i].obj, bins[i].rot)
FREEZE_ENTITY_POSITION(bins[i].obj, true)
endfor
for i = 0 to count_of(explosive_barrels) - 1
explosive_barrels[i].obj = create_object_no_offset(explosive_barrels[i].model, explosive_barrels[i].pos)
SET_ENTITY_ROTATION(explosive_barrels[i].obj, explosive_barrels[i].rot)
endfor
cover_box.obj = create_object_no_offset(cover_box.model, cover_box.pos)
freeze_entity_position(cover_box.obj, true)
SET_ENTITY_ROTATION(cover_box.obj, cover_box.rot)
setup_wave_3_enemies()
// @SBA - trying this
// CREATE_PLAYER_VEHICLE(trevors_truck.veh, CHAR_TREVOR, <<1409.9990, 3600.4973, 33.8676>>, 108.7487, false)
// set_vehicle_doors_locked(trevors_truck.veh, vehiclelock_locked)
// SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(trevors_truck.veh, false)
// set_vehicle_engine_on(trevors_truck.veh, false, true)
RECREATE_PLAYERS_VEHICLE(vTrevorsVehicleMethLabLoc, fTrevorsVehicleMethLabHead)
clear_ped_tasks_immediately(player_ped_id())
IF NOT IS_REPLAY_BEING_SET_UP()
SET_ENTITY_COORDS(player_ped_id(), <<1391.2151, 3607.2073, 33.9809>>)
SET_ENTITY_HEADING(player_ped_id(), 109.0587)
ENDIF
SET_PED_USING_ACTION_MODE(player_ped_id(), true)
if not has_ped_got_weapon(player_ped_id(), WEAPONTYPE_CARBINERIFLE)
give_weapon_to_ped(player_ped_id(), WEAPONTYPE_CARBINERIFLE, 500, false, false)
else
if get_ammo_in_ped_weapon(player_ped_id(), WEAPONTYPE_CARBINERIFLE) < 500
set_ped_ammo(player_ped_id(), WEAPONTYPE_CARBINERIFLE, 500)
endif
endif
if not has_ped_got_weapon(player_ped_id(), weapontype_grenadelauncher)
give_weapon_to_ped(player_ped_id(), weapontype_grenadelauncher, kiGrenadeLauncherAmmo, false, FALSE)
else
// @SBA - ensure player gets just 3 rounds
SET_GRENADE_LAUNCHER_AMMO()
endif
// Since player is in cover inside, let's make sure he has the default rifle
//setup_weapon_for_ped(player_ped_id(), WEAPONTYPE_CARBINERIFLE, 500, true, true, false)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE, TRUE)
buddy.pos = vChefCoverPointLiquorStore
buddy.heading = 197.22
setup_buddy(buddy)
add_ped_for_dialogue(scripted_speech[0], 5, buddy.ped, "cook")
task_put_ped_directly_into_cover(buddy.ped, vChefCoverPointLiquorStore, 8000)
force_ped_ai_and_animation_update(buddy.ped)
IF NOT IS_REPLAY_BEING_SET_UP()
load_scene(<<1391.4332, 3607.9443, 33.9809>>)
ENDIF
END_REPLAY_SETUP()
task_put_ped_directly_into_cover(player_ped_id(), vTrevorLiquorStartPos, -1, true, 0, true, false)
force_ped_ai_and_animation_update(player_ped_id(), true)
wave_3_master_flow_system_status = 1
wave_3_dialogue_system_status = 5
wave_3_buddy_ai_system_status = 4
end_cutscene_no_fade(false, TRUE, 90, -12, 500, false) //-45
print_now("METH_GOD_0", default_god_text_time, 1)
dialogue_time_2 = get_game_timer()
buddy_time = get_game_timer()
trigger_music_event("CHN1_WAVE_3_RT")
start_audio_scene("CHI_1_SHOOTOUT_04")
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(4, "Wave 3", true)
REMOVE_MODEL_HIDE(vIceBoxPos, 2.0, prop_ice_box_01)
mission_flow = wave_3_system
endproc
// Outro cutscene
proc load_trip_skip_data_5()
request_model(GET_PLAYER_PED_MODEL(char_trevor))
request_model(get_player_veh_model(char_trevor))
request_model(cheng.model)
request_model(translator.model)
request_model(buddy.model)
meth_interior = get_interior_at_coords_with_type(<<1392.5117, 3603.1851, 38.5>>, "v_methlab")
pin_interior_in_memory(meth_interior)
END_REPLAY_SETUP()
while not has_model_loaded(GET_PLAYER_PED_MODEL(char_trevor))
or not has_model_loaded(get_player_veh_model(char_trevor))
or not has_model_loaded(cheng.model)
or not has_model_loaded(translator.model)
or not has_model_loaded(buddy.model)
or not is_interior_ready(meth_interior)
wait(0)
endwhile
clear_ped_tasks_immediately(player_ped_id())
IF NOT IS_REPLAY_BEING_SET_UP()
SET_ENTITY_COORDS(player_ped_id(), <<1384.9, 3598.2172, 33.8896>>)
set_entity_heading(player_ped_id(), 282.5231)
ENDIF
buddy.pos = <<1378.2903, 3591.9409, 33.8590>>
setup_buddy(buddy, false)
cheng.pos = <<1380.3240, 3595.5015, 33.8913>>
setup_buddy(cheng, FALSE)
translator.pos = <<1380.7184, 3599.5544, 33.8578>>
setup_buddy(translator, FALSE)
SET_ICY_VERSIONS_OF_PEDS()
wait(0) //must wait a frame to ensure the outfit variaitons have been applied before checking the streaming requests for the player
while not HAVE_ALL_STREAMING_REQUESTS_COMPLETED(player_ped_id())
or not HAVE_ALL_STREAMING_REQUESTS_COMPLETED_for_ped(cheng.ped)
or not HAVE_ALL_STREAMING_REQUESTS_COMPLETED_for_ped(translator.ped)
wait(0)
endwhile
// @SBA - trying this
// CREATE_PLAYER_VEHICLE(trevors_truck.veh, CHAR_TREVOR, <<1409.9990, 3600.4973, 33.8676>>, 108.7487, false)
// set_vehicle_doors_locked(trevors_truck.veh, vehiclelock_locked)
// SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(trevors_truck.veh, false)
// set_vehicle_engine_on(trevors_truck.veh, false, true)
RECREATE_PLAYERS_VEHICLE(vTrevorsVehicleMethLabLoc, fTrevorsVehicleMethLabHead)
IF NOT IS_REPLAY_BEING_SET_UP()
load_scene(<<1386.4717, 3594.1172, 33.8896>>)
ENDIF
request_cutscene("chi_1_mcs_4_concat")
while not has_cutscene_loaded()
CPRINTLN(DEBUG_MISSION, "Waiting for outro assets")
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
CPRINTLN(DEBUG_MISSION, "Requesting outro component variations")
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("trevor", PLAYER_PED_ID())
if not is_ped_injured(buddy.ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Cook", buddy.ped)
endif
if not is_ped_injured(cheng.ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Tao", cheng.ped)
endif
if not is_ped_injured(translator.ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Taos_Translator", translator.ped)
endif
SET_CUTSCENE_PED_PROP_VARIATION("Cook", ANCHOR_EYES, 0, 0)
SET_CUTSCENE_PED_PROP_VARIATION("Tao", ANCHOR_EYES, 0)
SET_CUTSCENE_PED_PROP_VARIATION("Taos_Translator", ANCHOR_EYES, 0)
ENDIF
wait(0)
endwhile
start_new_cutscene_no_fade(false, FALSE, TRUE, TRUE)
CLEAR_PRINTS()
SET_LABEL_AS_TRIGGERED("METH_GOD_14", FALSE)
RELEASE_SCRIPT_AUDIO_BANK()
// don't update Chef any more
allow_buddy_ai_system = FALSE
if not is_ped_injured(cheng.ped)
register_entity_for_cutscene(cheng.ped, "Tao", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
CPRINTLN(DEBUG_MISSION,"cheng registered for outro")
endif
IF not is_ped_injured(translator.ped)
register_entity_for_cutscene(translator.ped, "Taos_Translator", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
CPRINTLN(DEBUG_MISSION,"translator registered for outro")
ENDIF
IF not is_ped_injured(buddy.ped)
register_entity_for_cutscene(buddy.ped, "Cook", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
CPRINTLN(DEBUG_MISSION,"Chef registered for outro")
ENDIF
register_entity_for_cutscene(PLAYER_PED_ID(), "trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, PLAYER_TWO)
REGISTER_ENTITY_FOR_CUTSCENE(NULL, "getaway_car", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, PREMIER)
start_cutscene()
trigger_music_event("CHN1_FINAL_CS")
REDUCE_AMBIENT_MODELS(TRUE)
mission_passed_mocap_status = 5 //@SBA OLD = 2
bOutroShitSkip = TRUE
mission_flow = mission_passed_mocap
endproc
proc load_outside_methlab_skip()
request_model(GET_PLAYER_PED_MODEL(char_trevor))
request_model(cheng.model)
request_model(translator.model)
request_model(buddy.model)
request_model(trevors_truck.model)
set_vehicle_model_is_suppressed(trevors_truck.model, true)
request_model(get_weapontype_model(WEAPONTYPE_carbineRIFLE))
PREFETCH_SRL("CHI1_Methlab_Arrival")
while not has_model_loaded(GET_PLAYER_PED_MODEL(char_trevor))
or not has_model_loaded(cheng.model)
or not has_model_loaded(translator.model)
or not has_model_loaded(buddy.model)
or not has_model_loaded(trevors_truck.model)
or not has_model_loaded(get_weapontype_model(WEAPONTYPE_carbinerifle))
or not IS_SRL_LOADED()
wait(0)
CPRINTLN(DEBUG_MISSION,"Loading for load_outside_methlab_skip")
endwhile
// // @SBA - trying this to remake vehicle
// RECREATE_PLAYERS_VEHICLE( vTrevorsVehicleMethLabLoc, fTrevorsVehicleMethLabHead)
//
// if not is_players_last_vehicle_present_and_acceptable(trevors_truck.veh, vTrevorsVehicleMethLabLoc, 2, <<2008.9219, 3054.0513, 46.0528>>, 326.3415)
// CPRINTLN(DEBUG_MISSION, "Player needs an appropriate vehicle. Making one.")
// WHILE NOT CREATE_PLAYER_VEHICLE(trevors_truck.veh, CHAR_TREVOR, vTrevorsVehicleMethLabLoc, fTrevorsVehicleMethLabHead, false)
// WAIT(0)
// CPRINTLN(DEBUG_MISSION, "Waiting on new vehicle...")
// ENDWHILE
// ENDIF
CREATE_PLAYER_VEHICLE(trevors_truck.veh, CHAR_TREVOR, vTrevorsVehicleMethLabLoc, fTrevorsVehicleMethLabHead, false)
SET_INITIAL_PLAYER_STATION("OFF")
IF NOT IS_REPLAY_BEING_SET_UP()
set_ped_into_vehicle(player_ped_id(), trevors_truck.veh)
ENDIF
IF NOT DOES_ENTITY_EXIST(cheng.ped)
cheng.ped = create_ped_inside_vehicle(trevors_truck.veh, pedtype_mission, cheng.model, vs_front_right)
ELSE
SET_PED_INTO_VEHICLE(cheng.ped, TREVORS_TRUCK.VEH, vs_front_right)
ENDIF
add_ped_for_dialogue(scripted_speech[0], 4, cheng.ped, "cheng")
//RETAIN_ENTITY_IN_INTERIOR(buddy.ped, get_interior_at_coords(buddy.pos))
setup_buddy_attributes(cheng)
setup_relationship_contact(cheng.ped, true)
//*****TEMP REMOVE
//SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(cheng.ped, true)
//*****
IF NOT DOES_ENTITY_EXIST(translator.ped)
translator.ped = create_ped_inside_vehicle(trevors_truck.veh, pedtype_mission, translator.model, vs_back_right)
ELSE
SET_PED_INTO_VEHICLE(translator.ped, TREVORS_TRUCK.VEH, vs_back_right)
ENDIF
//RETAIN_ENTITY_IN_INTERIOR(translator.ped, get_interior_at_coords(translator.pos))
add_ped_for_dialogue(scripted_speech[0], 3, translator.ped, "translator")
setup_buddy_attributes(translator)
setup_relationship_contact(translator.ped, true)
SET_START_VERSIONS_OF_BUDDIES()
HANDLE_SETUP_INITIAL_CHEF()
IF NOT IS_REPLAY_BEING_SET_UP()
load_scene(<<1403.1777, 3597.2070, 33.7417>>)
ENDIF
END_REPLAY_SETUP(TREVORS_TRUCK.VEH, VS_DRIVER, FALSE)
if is_vehicle_driveable(trevors_truck.veh)
SET_VEH_RADIO_STATION(trevors_truck.veh,"OFF")
endif
bPlayerInVehicle = TRUE
end_cutscene()
request_mocap_data_for_CHI_1_MCS_1()
kill_any_conversation()
clear_mission_locate_stuff(locates_data)
SET_DOOR_STATE(DOORNAME_METHLAB_F_L, DOORSTATE_FORCE_LOCKED_THIS_FRAME)
SET_DOOR_STATE(DOORNAME_METHLAB_F_R, DOORSTATE_FORCE_LOCKED_THIS_FRAME)
SET_DOOR_STATE(DOORNAME_METHLAB_R, DOORSTATE_FORCE_LOCKED_THIS_FRAME)
bBarPatronsCreated = TRUE
cleanup_bar()
// start lead-in cam
camera_a = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<1413.1581, 3586.2705, 35.3191>>, <<14.4926, -0.0000, 51.7688>>, 40.0, TRUE)
camera_b = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<1415.4323, 3585.3635, 35.4866>>, <<5.5924, -0.0000, 49.1407>>, 40.0)
HANDLE_LEAD_IN_SHOT_OF_ARRIVAL()
mission_flow = get_to_meth_lab
get_to_meth_lab_status = 1
endproc
proc mission_setup()
#IF IS_DEBUG_BUILD
load_lk_widgets()
SET_LOCATES_HEADER_WIDGET_GROUP(chinese_1_widget_group)
#endif
if is_player_playing(player_id())
clear_player_wanted_level(player_id())
endif
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
set_wanted_level_multiplier(0.8)
SUPPRESS_EMERGENCY_CALLS()
//INFORM_MISSION_STATS_OF_MISSION_START_chinese_one()
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(player_ped_id(),CHI1_UNMARKED)
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(player_ped_id())
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(CHI1_SPECIAL_ABILITY_TIME)
//INFORM_MISSION_STATS_OF_INCREMENT(CHI1_GRENADE_LAUNCHER_KILLS)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<1357.68, 3556.56, -100.00>>, <<1436.65, 3672.06, 100.00>>, false)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<1335.97, 3598.28, -100.00>>, <<1368.15, 3575.16, 100.00>>, false)
add_scenario_blocking_area(<<1349.96, 3547.31, 100.00>>, <<1423.99, 3658.75, -100.00>>)
SET_PED_PATHS_IN_AREA(<<1349.96, 3547.31, 100.00>>, <<1423.99, 3658.75, -100.00>>, false)
load_text_and_dialogue()
add_relationship_groups()
// set weather
SET_WEATHER_TYPE_PERSIST("extrasunny")
// @SBA - adjusting start position slightly. OLD VALUE = <<1389.63, 3600.41, 37.94>>
players_cover_point = add_cover_point(vTrevorWindowStartPos, 112.4765, COVUSE_WALLTOBOTH, COVHEIGHT_low, COVARC_180) //COVUSE_WALLTOBOTH covuse_walltoleft
players_cover_point_2 = add_cover_point(vTrevorBackDeckStartPos, 290.00, COVUSE_WALLTOBOTH, COVHEIGHT_low, COVARC_180) // covuse_walltoright
buddy_cover_point[0] = add_cover_point(<<1387.12, 3607.50, 37.94>>, 118.00, COVUSE_WALLTOBOTH, COVHEIGHT_low, COVARC_120)
// @SBA - trying Chef in a different postion at the top of the stairs
//buddy_cover_point[1] = add_cover_point(<<1388.84, 3619.31, 37.93>>, 37.00, covuse_walltoright, COVHEIGHT_low, COVARC_180)
buddy_cover_point[1] = add_cover_point(vChefCoverPointBackStairs, 105.00, covuse_walltoleft, COVHEIGHT_low, COVARC_180)
wave_3_0_cover_point = wave_3_0_cover_point
wave_3_1_cover_point = wave_3_1_cover_point
//wave_3_0_cover_point = add_cover_point(<<1392.83228, 3598.94385, 34.02530>>, 19.00, covuse_walltoleft, COVHEIGHT_TOOHIGH, COVARC_180)
wave_3_0_cover_point = add_cover_point(<<1392.67334, 3598.85669, 34.02655>>, 19.00, covuse_walltoleft, COVHEIGHT_TOOHIGH, COVARC_180)
//wave_3_1_cover_point = add_cover_point(<<1395.67151, 3599.85791, 34.00392>>, 19.9438, covuse_walltoright, COVHEIGHT_TOOHIGH, COVARC_180)
wave_3_1_cover_point = add_cover_point(<<1395.83069, 3599.75, 34.00454>>, 19.9438, covuse_walltoright, COVHEIGHT_TOOHIGH, COVARC_180)
cpWaterHeaterCover = ADD_COVER_POINT((<<1397.4, 3602.6, 37.94>>), 108.0, COVUSE_WALLTOLEFT, COVHEIGHT_low, COVARC_180)
cover_point_back_roof_AC = ADD_COVER_POINT((<<1404.8580, 3611.8057, 38.0058>>), 108.0, COVUSE_WALLTORIGHT, COVHEIGHT_low, COVARC_120, TRUE)
add_ped_for_dialogue(scripted_speech[0], 2, player_ped_id(), "trevor")
initialise_mission_variables()
// Back stairs
buddy_cover_point_data[0].cover_point = buddy_cover_point[1]
buddy_cover_point_data[1].cover_point = add_cover_point(buddy_cover_point_data[1].pos, buddy_cover_point_data[1].heading, COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_180)
// Back roof
buddy_cover_point_data[2].cover_point = add_cover_point(buddy_cover_point_data[2].pos, buddy_cover_point_data[2].heading, covuse_walltoleft, COVHEIGHT_LOW, COVARC_180) //covheight_toohigh
buddy_cover_point_data[3].cover_point = add_cover_point(buddy_cover_point_data[3].pos, buddy_cover_point_data[3].heading, covuse_walltoleft, covheight_low, COVARC_180)
// liquor store
buddy_cover_point_data[4].cover_point = add_cover_point(buddy_cover_point_data[4].pos, buddy_cover_point_data[4].heading, COVUSE_WALLTOBOTH, COVHEIGHT_low, COVARC_180)
buddy_cover_point_data[5].cover_point = add_cover_point(buddy_cover_point_data[5].pos, buddy_cover_point_data[5].heading, COVUSE_WALLTOBOTH, COVHEIGHT_low, COVARC_180)
// @SBA - Navmesh blocking for upstairs doors, so rushers use the large doorway behind the player
iNavBlockingUpstairsDoorway = ADD_NAVMESH_BLOCKING_OBJECT((<<1394.03613, 3608.93579, 37.94191>>), (<<0.75, 0.5, 0.5>>), -1.2)
iNavBlockingUpstairsDoor = ADD_NAVMESH_BLOCKING_OBJECT((<<1392.08325, 3611.16699, 37.94191>>), (<<0.6, 0.4, 0.5>>), 0.36)
iNavBlockingBackYardTrailer = ADD_NAVMESH_BLOCKING_OBJECT((<<1432.98425, 3626.76880, 33.93124>>), (<<2.5, 3.75, 1.0>>), 1.95)
IF (Is_Replay_In_Progress())
INT iReplayStage = Get_Replay_Mid_Mission_Stage()
IF g_bShitskipAccepted
iReplayStage++ // player is skipping this stage
ENDIF
SWITCH iReplayStage
case 0
//outside hicks bar
CPRINTLN(DEBUG_MISSION, "Replay checkpoint 1")
START_REPLAY_SETUP((<<1998.04980, 3055.90698, 46.05226>>),328.0059)
load_trip_skip_data_0()
CPRINTLN(DEBUG_MISSION, "Replay checkpoint 1 loaded")
break
case 1
IF g_bShitskipAccepted
// arrival at meth lab, prior to wave 0
CPRINTLN(DEBUG_MISSION, "Replay checkpoint 2 (shit skip)")
START_REPLAY_SETUP(<<1423.0, 3603.0, 33.8866>>, 108.7487, FALSE)
load_outside_methlab_skip()
ELSE
//wave 0
CPRINTLN(DEBUG_MISSION, "Replay checkpoint 2")
START_REPLAY_SETUP(vTrevorWindowStartPos, 21.5294, FALSE)
load_trip_skip_data_1()
ENDIF
CPRINTLN(DEBUG_MISSION, "Replay checkpoint 2 loaded")
break
case 2
//wave 0 outside enemies
CPRINTLN(DEBUG_MISSION, "Replay checkpoint 3")
START_REPLAY_SETUP((<<1390.8401, 3601.1016, 37.9419>>), 323.8041, FALSE)
load_trip_skip_data_2()
CPRINTLN(DEBUG_MISSION, "Replay checkpoint 3 loaded")
break
case 3
//wave 2 after grenade launcher cutscene
CPRINTLN(DEBUG_MISSION, "Replay checkpoint 4")
START_REPLAY_SETUP(vTrevorBackDeckStartPos, 19.5667, FALSE)
load_trip_skip_data_3()
CPRINTLN(DEBUG_MISSION, "Replay checkpoint 4 loaded")
break
case 4
//wave 3
CPRINTLN(DEBUG_MISSION, "Replay checkpoint 5")
START_REPLAY_SETUP(vTrevorLiquorStartPos, 113.4341, FALSE)
load_trip_skip_data_4()
CPRINTLN(DEBUG_MISSION, "Replay checkpoint 5 loaded")
break
case 5
// outro
CPRINTLN(DEBUG_MISSION, "Replay (skip to) outro")
START_REPLAY_SETUP((<<1384.9, 3598.2172, 33.8896>>), 282.5231, FALSE) // Don't change vector! Pputs player in place to start cutscene.
load_trip_skip_data_5()
CPRINTLN(DEBUG_MISSION, "Replay outro loaded")
break
DEFAULT
SCRIPT_ASSERT("Replay in progress: Unknown checkpoint selected!")
BREAK
endswitch
// not a replay
else
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(0, "Mission start")
endif
endproc
proc fbi4_load_stage_selector_assets()
initialise_mission_variables()
switch launch_mission_stage_menu_status
case 0
load_trip_skip_data_0()
break
case 1
load_outside_methlab_skip()
break
case 2
load_trip_skip_data_1()
break
case 3
load_trip_skip_data_2()
break
case 4
load_trip_skip_data_3()
break
case 5
load_trip_skip_data_4()
break
endswitch
endproc
proc check_mission_vehicles_for_chi_1_mcs_4_mocap()
// @SBA - using a trigger box for all
TRIGGER_BOX tbOutroCutscene
TRIGGER_BOX tbOutroCutsceneRoad
tbOutroCutscene = CREATE_TRIGGER_BOX(<<1396.244995,3594.819824,33.912655>>, <<1380.003784,3590.047852,37.925877>>, 22.000000)
tbOutroCutsceneRoad = CREATE_TRIGGER_BOX(<<1345.245605,3568.100342,33.996071>>, <<1402.66, 3590.93,35.993843>>, 11.000000)
for i = 0 to count_of(parked_cars) - 1
if does_entity_exist(parked_cars[i])
if is_entity_in_angled_area(parked_cars[i], <<1393.118, 3598.737, 33.986>>, <<1395.846, 3599.719, 36.986>>, 2.500, false, false)
OR IS_ENTITY_IN_TRIGGER_BOX(parked_cars[i], tbOutroCutscene, FALSE)
OR IS_ENTITY_IN_TRIGGER_BOX(parked_cars[i], tbOutroCutsceneRoad, FALSE)
delete_vehicle(parked_cars[i])
endif
endif
endfor
for i = 0 to count_of(wave_0_enemy_vehicle) - 1
if does_entity_exist(wave_0_enemy_vehicle[i].veh)
IF IS_ENTITY_IN_TRIGGER_BOX(wave_0_enemy_vehicle[i].veh, tbOutroCutscene, FALSE)
OR IS_ENTITY_IN_TRIGGER_BOX(wave_0_enemy_vehicle[i].veh, tbOutroCutsceneRoad, FALSE)
delete_vehicle(wave_0_enemy_vehicle[i].veh)
endif
endif
endfor
for i = 0 to count_of(wave_2_enemy_vehicle) - 1
if does_entity_exist(wave_2_enemy_vehicle[i].veh)
IF IS_ENTITY_IN_TRIGGER_BOX(wave_2_enemy_vehicle[i].veh, tbOutroCutscene, FALSE)
OR IS_ENTITY_IN_TRIGGER_BOX(wave_2_enemy_vehicle[i].veh, tbOutroCutsceneRoad, FALSE)
delete_vehicle(wave_2_enemy_vehicle[i].veh)
endif
endif
endfor
for i = 0 to count_of(wave_3_enemy_vehicle) - 1
if does_entity_exist(wave_3_enemy_vehicle[i].veh)
IF IS_ENTITY_IN_TRIGGER_BOX(wave_3_enemy_vehicle[i].veh, tbOutroCutscene, FALSE)
OR IS_ENTITY_IN_TRIGGER_BOX(wave_3_enemy_vehicle[i].veh, tbOutroCutsceneRoad, FALSE)
// @SBA - just move car 0, don't delete (currently that's the only wave 3 veh)
IF i = 0
// to thwart asserts (don't actually care if it's dead)
IS_ENTITY_DEAD(wave_3_enemy_vehicle[i].veh)
SET_ENTITY_COORDS(wave_3_enemy_vehicle[i].veh, <<1397.67297, 3594.00537, 33.93133>>, false)
SET_ENTITY_HEADING(wave_3_enemy_vehicle[i].veh, -1.7487)
ELSE
delete_vehicle(wave_3_enemy_vehicle[i].veh)
ENDIF
endif
endif
endfor
for i = 0 to count_of(ambient_enemy_vehicle) - 1
IF does_entity_exist(ambient_enemy_vehicle[i].veh)
IF IS_ENTITY_IN_TRIGGER_BOX(ambient_enemy_vehicle[i].veh, tbOutroCutscene, FALSE)
OR IS_ENTITY_IN_TRIGGER_BOX(ambient_enemy_vehicle[i].veh, tbOutroCutsceneRoad, FALSE)
OR GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(ambient_enemy_vehicle[i].veh, FALSE), vIceBoxPos) > 75
DELETE_VEHICLE(ambient_enemy_vehicle[i].veh)
endif
ENDIF
endfor
IF NOT DOES_ENTITY_EXIST(trevors_truck.veh)
CPRINTLN(DEBUG_MISSION, "TREVOR'S VEHICLE DOES NOT EXIST")
ELSE
CPRINTLN(DEBUG_MISSION, "TREVOR'S VEHICLE DOES EXIST")
IF IS_ENTITY_IN_TRIGGER_BOX(trevors_truck.veh, tbOutroCutscene, FALSE)
OR IS_ENTITY_IN_TRIGGER_BOX(trevors_truck.veh, tbOutroCutsceneRoad, FALSE)
// to thwart asserts (don't actually care if it's dead)
IS_ENTITY_DEAD(trevors_truck.veh)
SET_ENTITY_COORDS(trevors_truck.veh, vTrevorsVehicleMethLabLoc, false)
SET_ENTITY_HEADING(trevors_truck.veh, fTrevorsVehicleMethLabHead)
ENDIF
ENDIF
SET_MISSION_VEHICLE_GEN_VEHICLE(trevors_truck.veh, vTrevorsVehicleMethLabLoc, fTrevorsVehicleMethLabHead)
endproc
proc chinese_mission_passed_mocap()
// @SBA - kill those asserts
IF IS_PED_INJURED(cheng.ped)
OR IS_PED_INJURED(translator.ped)
//CPRINTLN(DEBUG_MISSION, "chinese_mission_passed_mocap: Cheng or the Translator is NOT ok!")
ENDIF
// @SBA - Disable some player controls during lead in
// But let him die in explosion
IF mission_passed_mocap_status > 0
AND mission_passed_mocap_status < 5
UPDATE_BLOCKED_PLAYER_FOR_LEAD_IN(TRUE)
KILL_INVINCIBLE_PLAYER_IF_IN_EXPLOSION()
HANDLE_HINT_CAM_FOR_LEAD_IN()
HANDLE_VEHICLE_TOO_NEAR_ICE_BOX()
// just in case
wave_3_buddy_ai_system()
ENDIF
// continue to update fleeing enemies (also updates their blips)
ambient_enemy_system()
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
CPRINTLN(DEBUG_MISSION, "Requesting outro component variations")
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Tao", cheng.ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Taos_Translator", translator.ped)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("trevor", PLAYER_PED_ID())
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Cook", buddy.ped)
SET_CUTSCENE_PED_PROP_VARIATION("Cook", ANCHOR_EYES, 0, 0)
SET_CUTSCENE_PED_PROP_VARIATION("Tao", ANCHOR_EYES, 0)
SET_CUTSCENE_PED_PROP_VARIATION("Taos_Translator", ANCHOR_EYES, 0)
ENDIF
if mission_passed_mocap_status < 6
disable_on_foot_first_person_view_this_update() //don't process for mocap playing and exit
endif
switch mission_passed_mocap_status
case 0
// @SBA - start the timer, reset label
CANCEL_TIMER(tmrIceBoxBlendin)
START_TIMER_NOW(tmrIceBoxBlendin)
SET_LABEL_AS_TRIGGERED("chin_M4_LI1", FALSE)
// get rid of blip
if does_blip_exist(ice_box_blip)
remove_blip(ice_box_blip)
endif
request_cutscene("chi_1_mcs_4_concat")
BLOCK_PLAYER_FOR_LEAD_IN(FALSE)
// collision proxy on
IF DOES_ENTITY_EXIST(oiIceBoxProxy)
SET_ENTITY_COLLISION(oiIceBoxProxy, TRUE)
ENDIF
STOP_FIRE_IN_RANGE(vIceBoxPos, 5.0)
mission_passed_mocap_status++
break
// @SBA - adding this case
CASE 1
IF TIMER_DO_ONCE_WHEN_READY(tmrIceBoxBlendin, 1.200)
remove_decals_in_range(<<1388.4, 3598.8, 35.1>>, 0.5) //right door
/* @SBA - START SYNCHRONIZED SCENE */
cutscene_pos = <<1388.108, 3599.101, 33.89>>
cutscene_rot = <<0.0, 0.0, 110.480>>
// @SBA - get Cheng out of the ice box
CHENG_CUTSCENE_INDEX = CREATE_SYNCHRONIZED_SCENE ( cutscene_pos, cutscene_rot)
// CLEAR_PED_TASKS(cheng.ped)
CPRINTLN(DEBUG_MISSION, "Playing Cheng anim: CHI_1_MCS_4_TAO_ACTION")
TASK_SYNCHRONIZED_SCENE(cheng.ped, CHENG_CUTSCENE_INDEX, "MissChinese1LeadInOutCHI_1_MCS_4", "CHI_1_MCS_4_TAO_ACTION", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT)
// @SBA - animate the door
IF DOES_ENTITY_EXIST(oiIceBox)
CPRINTLN(DEBUG_MISSION, "Playing Icebox anim: CHI_1_MCS_4_TAO_ACTION_FREEZER")
PLAY_SYNCHRONIZED_ENTITY_ANIM(oiIceBox, CHENG_CUTSCENE_INDEX, "CHI_1_MCS_4_TAO_ACTION_FREEZER", "MissChinese1LeadInOutCHI_1_MCS_4", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
SET_ENTITY_COLLISION(oiIceBox, TRUE)
ENDIF
// pesky Molotovs
STOP_FIRE_IN_RANGE(vIceBoxPos, 5.0)
prepare_music_event("CHN1_FINAL_CS")
mission_passed_mocap_status++
ENDIF
BREAK
// @SBA - adding this case
CASE 2
// @SBA - play Cheng's first line as he exits the box
IF NOT HAS_LABEL_BEEN_TRIGGERED("chin_M4_LI1_1")
IF GET_SYNCHRONIZED_SCENE_PHASE(CHENG_CUTSCENE_INDEX) >= 0.12
ADD_PED_FOR_DIALOGUE(scripted_speech[0], 5, cheng.ped, "cheng")
//IF CREATE_CONVERSATION(scripted_speech[0], "methaud", "chin_M4_LI1", CONV_PRIORITY_MEDIUM)
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(scripted_speech[0], "methaud", "chin_M4_LI1", "chin_M4_LI1_1", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("chin_M4_LI1_1", TRUE)
ENDIF
ENDIF
ELSE
// play second line from conv if player is not in trigger
IF NOT HAS_LABEL_BEEN_TRIGGERED("chin_M4_LI1_2")
IF NOT IS_PLAYER_IN_TRIGGER_BOX(tbIceBoxInnerVol)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(scripted_speech[0], "methaud", "chin_M4_LI1", "chin_M4_LI1_2", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("chin_M4_LI1_2", TRUE)
ENDIF
ENDIF
ELSE
// set as triggered if the player is right there
SET_LABEL_AS_TRIGGERED("chin_M4_LI1_2", TRUE)
ENDIF
ENDIF
ENDIF
// @SBA - while Cheng is getting out of the box, get the translator out
IF NOT bStartTranslatorEmergeBox
IF GET_SYNCHRONIZED_SCENE_PHASE(CHENG_CUTSCENE_INDEX) >= 0.687
remove_decals_in_range(<<1388.1, 3599.6, 35.1>>, 0.5) //left door
//CLEAR_PED_TASKS(translator.ped)
CPRINTLN(DEBUG_MISSION, "Playing translator anim: CHI_1_MCS_4_TRANSLATOR_ACTION")
TRANSLATOR_CUTSCENE_INDEX = CREATE_SYNCHRONIZED_SCENE ( cutscene_pos, cutscene_rot)
TASK_SYNCHRONIZED_SCENE(translator.ped, TRANSLATOR_CUTSCENE_INDEX, "MissChinese1LeadInOutCHI_1_MCS_4", "CHI_1_MCS_4_TRANSLATOR_ACTION", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT)
// @SBA - door
IF DOES_ENTITY_EXIST(oiIceBox)
CPRINTLN(DEBUG_MISSION, "Playing Icebox anim: CHI_1_MCS_4_TRANSLATOR_ACTION_FREEZER")
PLAY_SYNCHRONIZED_ENTITY_ANIM(oiIceBox, TRANSLATOR_CUTSCENE_INDEX, "CHI_1_MCS_4_TRANSLATOR_ACTION_FREEZER", "MissChinese1LeadInOutCHI_1_MCS_4", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
SET_ENTITY_COLLISION(oiIceBox, TRUE)
ENDIF
bStartTranslatorEmergeBox = TRUE
ENDIF
ENDIF
// @SBA - when Cheng is out of the box, start idle loop
IF GET_SYNCHRONIZED_SCENE_PHASE(CHENG_CUTSCENE_INDEX) >= 0.99
//CLEAR_PED_TASKS(cheng.ped)
CPRINTLN(DEBUG_MISSION, "Playing Cheng's anim: CHI_1_MCS_4_TAO_IDLE_2")
CHENG_CUTSCENE_INDEX = CREATE_SYNCHRONIZED_SCENE ( cutscene_pos, cutscene_rot)
SET_SYNCHRONIZED_SCENE_LOOPED(CHENG_CUTSCENE_INDEX, TRUE)
TASK_SYNCHRONIZED_SCENE(cheng.ped, CHENG_CUTSCENE_INDEX, "MissChinese1LeadInOutCHI_1_MCS_4", "CHI_1_MCS_4_TAO_IDLE_2", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT)
// @SBA - don't need to do door here, previous anim still applies
mission_passed_mocap_status++
ENDIF
BREAK
// @SBA - adding this case
CASE 3
IF HAS_LABEL_BEEN_TRIGGERED("chin_M4_LI1_1")
// play second line from conv if player is not in trigger
IF NOT HAS_LABEL_BEEN_TRIGGERED("chin_M4_LI1_2")
IF NOT IS_PLAYER_IN_TRIGGER_BOX(tbIceBoxInnerVol)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(scripted_speech[0], "methaud", "chin_M4_LI1", "chin_M4_LI1_2", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("chin_M4_LI1_2", TRUE)
ENDIF
ENDIF
ELSE
// set as triggered if the player is right there
SET_LABEL_AS_TRIGGERED("chin_M4_LI1_2", TRUE)
ENDIF
ENDIF
ENDIF
// @SBA - Translator out of box? put into idle loop.
IF GET_SYNCHRONIZED_SCENE_PHASE(TRANSLATOR_CUTSCENE_INDEX) >= 0.99
CPRINTLN(DEBUG_MISSION, "Playing trnaslator's anim: CHI_1_MCS_4_TRANSLATOR_IDLE_2")
TRANSLATOR_CUTSCENE_INDEX = CREATE_SYNCHRONIZED_SCENE ( cutscene_pos, cutscene_rot)
SET_SYNCHRONIZED_SCENE_LOOPED(TRANSLATOR_CUTSCENE_INDEX, TRUE)
TASK_SYNCHRONIZED_SCENE(translator.ped, TRANSLATOR_CUTSCENE_INDEX, "MissChinese1LeadInOutCHI_1_MCS_4", "CHI_1_MCS_4_TRANSLATOR_IDLE_2", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT)
// @SBA - door
IF DOES_ENTITY_EXIST(oiIceBox)
CPRINTLN(DEBUG_MISSION, "Playing Icebox anim: CHI_1_MCS_4_TRANSLATOR_IDLE_2_FREEZER")
PLAY_SYNCHRONIZED_ENTITY_ANIM(oiIceBox, TRANSLATOR_CUTSCENE_INDEX, "CHI_1_MCS_4_TRANSLATOR_IDLE_2_FREEZER", "MissChinese1LeadInOutCHI_1_MCS_4", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
SET_ENTITY_COLLISION(oiIceBox, TRUE)
ENDIF
CANCEL_TIMER(tmrIceBoxBlendin)
mission_passed_mocap_status++
// Go to cutscene earlier if player is already in position
ELIF IS_PLAYER_IN_TRIGGER_BOX(tbIceBoxInnerVol)
//IF GET_SYNCHRONIZED_SCENE_PHASE(TRANSLATOR_CUTSCENE_INDEX) >= 0.8
IF HAS_ANIM_EVENT_FIRED(translator.ped, get_hash_key("START_CUTSCENE"))
//AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
CPRINTLN(DEBUG_MISSION, "STARTING OUTRO CUTSENE EARLY")
CANCEL_TIMER(tmrIceBoxBlendin)
mission_passed_mocap_status++
ENDIF
ENDIF
BREAK
case 4
// @SBA - Is player not around? exit, otherwise start cutscene
// Also check player still has control (if not, start cutscene)
IF NOT IS_PLAYER_IN_TRIGGER_BOX(tbIceBoxInnerVol)
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
// show objective, if you can
IF NOT HAS_LABEL_BEEN_TRIGGERED("METH_GOD_14")
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(locates_data)
PRINT_NOW("METH_GOD_14", default_god_text_time, 1)
SET_LABEL_AS_TRIGGERED("METH_GOD_14", TRUE)
CANCEL_TIMER(tmrIceBoxReminder)
ENDIF
ENDIF
// blip them (or just one since they're next to each other)
IF NOT DOES_BLIP_EXIST(cheng.blip)
cheng.blip = CREATE_BLIP_FOR_PED(cheng.ped)
ENDIF
EXIT
ENDIF
// Check conversations are done
if not IS_SPECIAL_ABILITY_ACTIVE(player_id()) //fix for bug 1854979
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
EXIT
enDIF
endif
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
if start_new_cutscene_no_fade(false, FALSE, TRUE, TRUE, true)
CLEAR_PRINTS()
SET_LABEL_AS_TRIGGERED("METH_GOD_14", FALSE)
RELEASE_SCRIPT_AUDIO_BANK()
// don't update Chef any more
allow_buddy_ai_system = FALSE
IF DOES_BLIP_EXIST(cheng.blip)
REMOVE_BLIP(cheng.blip)
ENDIF
IF DOES_ENTITY_EXIST(cheng.ped)
register_entity_for_cutscene(cheng.ped, "Tao", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
CPRINTLN(DEBUG_MISSION,"cheng registered for outro")
ENDIF
IF DOES_ENTITY_EXIST(translator.ped)
register_entity_for_cutscene(translator.ped, "Taos_Translator", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
CPRINTLN(DEBUG_MISSION,"translator registered for outro")
ENDIF
IF DOES_ENTITY_EXIST(buddy.ped)
register_entity_for_cutscene(buddy.ped, "Cook", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
CPRINTLN(DEBUG_MISSION,"Chef registered for outro")
ENDIF
register_entity_for_cutscene(PLAYER_PED_ID(), "trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, PLAYER_TWO)
REGISTER_ENTITY_FOR_CUTSCENE(NULL, "getaway_car", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, PREMIER)
if get_cam_view_mode_for_context(cam_view_mode_context_on_foot) = cam_view_mode_first_person
start_cutscene(CUTSCENE_SUPPRESS_FP_TRANSITION_FLASH) //supress flash. we are bledning out of the cutscene. Code will perform flash during blend out.
else
start_cutscene()
endif
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
trigger_music_event("CHN1_FINAL_CS")
if is_audio_scene_active("CHI_1_GO_TO_ICEBOX")
stop_audio_scene("CHI_1_GO_TO_ICEBOX")
endif
REDUCE_AMBIENT_MODELS(TRUE)
mission_passed_mocap_status++
ENDIF
endif
break
case 5
if is_cutscene_playing()
// fade in if coming from skip
IF NOT IS_SCREEN_FADED_IN()
IF NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME_SHORT)
ENDIF
ENDIF
IF IS_GAMEPLAY_HINT_ACTIVE()
STOP_GAMEPLAY_HINT()
ENDIF
// do this here so it's not a frame early
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(PLAYER_PED_ID(), TRUE)
ENDIF
//might cycle through and switch all enemy vehicles off.
if is_vehicle_driveable(trevors_truck.veh)
set_vehicle_engine_on(trevors_truck.veh, false, true)
endif
check_mission_vehicles_for_chi_1_mcs_4_mocap()
clear_area(<<1403.1777, 3597.2070, 33.7417>>, 1000.00, true, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(GoonModel1)
// @SBA - Don't need the ice box anymore
IF DOES_ENTITY_EXIST(oiIceBox)
DELETE_OBJECT(oiIceBox)
ENDIF
IF DOES_ENTITY_EXIST(oiIceBoxProxy)
DELETE_OBJECT(oiIceBoxProxy)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(mnIceBox)
SET_MODEL_AS_NO_LONGER_NEEDED(mnIceBoxProxy)
object_index glass_window
IF NOT DOES_ENTITY_EXIST(glass_window)
glass_window = get_closest_object_of_type(<<1389.11, 3600.43, 39.51>>, 2.0, v_ret_ml_win5)
ENDIF
//crack type
//2 = shoutgun
//3 = explosion
// break_entity_glass(glass_window, <<1388.9, 3601.0, 40.2>>, 2.0, <<0.0, 1.0, 0.0>>, 1100.00, 3)
// break_entity_glass(glass_window, <<1389.6, 3599.1, 40.2>>, 2.0, <<0.0, 1.0, 0.0>>, 1100.00, 3)
break_entity_glass(glass_window, <<1389.16, 3600.3, 39.5>>, 2.0, <<0.0, 1.0, 0.0>>, 1100.00, 3, TRUE)
break_entity_glass(glass_window, <<1388.8, 3600.9, 39.0>>, 2.0, <<0.0, 1.0, 0.0>>, 1100, 2, TRUE)
break_entity_glass(glass_window, <<1389.3, 3600.1, 39.7>>, 2.0, <<0.0, 1.0, 0.0>>, 1100.00, 2, TRUE)
SET_OBJECT_AS_NO_LONGER_NEEDED(glass_window)
// turn cutscene vehicle's lights on if it's night
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("getaway_car"))
viGetAwayCar = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("getaway_car"))
CPRINTLN(DEBUG_MISSION, "Getaway car grabbed")
IF NOT IS_DAYLIGHT_HOURS()
AND DOES_ENTITY_EXIST(viGetAwayCar)
CPRINTLN(DEBUG_MISSION, "Getaway car lights should be on")
SET_VEHICLE_LIGHTS(viGetAwayCar, SET_VEHICLE_LIGHTS_ON)
ENDIF
ENDIF
// Some clean up
IF DOES_ENTITY_EXIST(cheng.ped)
IF NOT IS_ENTITY_ON_SCREEN(cheng.ped)
SET_PED_AS_NO_LONGER_NEEDED(cheng.ped)
SET_MODEL_AS_NO_LONGER_NEEDED(cheng.model)
CPRINTLN(DEBUG_MISSION,"Cheng no longer needed")
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(translator.ped)
IF NOT IS_ENTITY_ON_SCREEN(translator.ped)
SET_PED_AS_NO_LONGER_NEEDED(translator.ped)
SET_MODEL_AS_NO_LONGER_NEEDED(translator.model)
CPRINTLN(DEBUG_MISSION,"Translator no longer needed")
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(buddy.ped)
SET_PED_AS_NO_LONGER_NEEDED(buddy.ped)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(buddy.model)
SET_SRL_POST_CUTSCENE_CAMERA(<<1386.7813, 3597.9500, 35.6490>>, NORMALISE_VECTOR(<<-3.0000, 0.0000, -169.0608>>))
mission_passed_mocap_status++
endif
break
case 6
if is_cutscene_playing()
if not was_cutscene_skipped()
printstring("test")
printnl()
if CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("trevor", GET_PLAYER_PED_MODEL(char_trevor))
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 1500)
endif
if CAN_SET_EXIT_STATE_FOR_CAMERA()
set_gameplay_cam_relative_heading(0)
set_gameplay_cam_relative_pitch(0)
if get_cam_view_mode_for_context(cam_view_mode_context_on_foot) = cam_view_mode_first_person
camera_a = create_cam_with_params("default_scripted_camera", <<1387.450195,3596.558350,35.691887>>, <<-8.343739,0.054248,-171.329453>>, 50.000000)
set_cam_active(camera_a, true)
render_script_cams(true, false)
endif
endif
else
trigger_music_event("CHN1_FINAL_CS_SKIP")
SET_CUTSCENE_FADE_VALUES(false, false, true, false)
mission_passed_mocap_status++
endif
else
if does_entity_exist(buddy.ped)
delete_ped(buddy.ped)
endif
IF DOES_ENTITY_EXIST(viGetAwayCar)
DELETE_VEHICLE(viGetAwayCar)
ENDIF
REPLAY_STOP_EVENT()
if get_cam_view_mode_for_context(cam_view_mode_context_on_foot) = cam_view_mode_first_person
end_cutscene_no_fade(true, true, 0, 0, 1000)
else
end_cutscene_no_fade()
endif
mission_passed()
endif
break
case 7
if is_screen_faded_out()
if not is_cutscene_active()
if does_entity_exist(buddy.ped)
delete_ped(buddy.ped)
endif
IF DOES_ENTITY_EXIST(viGetAwayCar)
DELETE_VEHICLE(viGetAwayCar)
ENDIF
REPLAY_STOP_EVENT()
end_cutscene()
mission_passed()
endif
endif
break
endswitch
endproc
proc chinese_mission_failed_system()
KILL_INVINCIBLE_PLAYER_IF_IN_EXPLOSION()
if GET_MISSION_FLOW_SAFE_TO_CLEANUP()
mission_failed()
endif
endproc
SCRIPT
set_mission_flag(true)
if has_force_cleanup_occurred()
Store_Fail_Weapon(player_ped_id(), enum_to_int(get_current_player_ped_enum()))
STORE_ENEMY_VEHICLES_STILL_ALIVE()
Mission_Flow_Mission_Force_Cleanup()
mission_cleanup()
endif
mission_setup()
while true
wait(0)
if not stop_mission_fail_checks
if mission_fail_checks()
setup_mission_fail()
endif
endif
skip_system()
HANDLE_CHINESE1_STATS()
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_TPIndustries")
IF NOT bPlayerUsedAbility
IF IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID())
bPlayerUsedAbility = TRUE
ENDIF
ENDIF
// help frames when there are exploding vehicles
IF mission_flow >= wave_0_system
AND mission_flow < wave_3_system
DISABLE_VEHICLE_EXPLOSION_BREAK_OFF_PARTS()
ENDIF
switch mission_flow
case intro_mocap
meth_lab_intro_mocap()
//mission_flow = bikers_cutscene
break
case get_to_meth_lab
chinese_get_to_meth_lab()
break
case wave_0_system
chinese_wave_0_system()
break
// WAVE 1 - REMOVED @SBA
case wave_2_system
chinese_wave_2_system()
break
case wave_3_system
chinese_wave_3_system()
break
case mission_passed_mocap
chinese_mission_passed_mocap()
break
case vehicle_recording
meth_lab_vehicle_recording()
break
case load_stage_selector_assets
fbi4_load_stage_selector_assets()
break
case mission_fail_stage
chinese_mission_failed_system()
break
endswitch
#IF IS_DEBUG_BUILD
is_entity_in_angled_area(player_ped_id(), <<1980.730, 3073.228, 46.049>>, <<2014.615, 3051.972, 50.049>>, 26.700)
angled_area_locate_widget()
// request_ptfx_asset()
//
// if has_ptfx_asset_loaded()
// if is_keyboard_key_just_pressed(key_t)
// printstring("ptfx loaded")
// printnl()
// endif
// else
// if is_keyboard_key_just_pressed(key_t)
// printstring("ptfx NOT loaded")
// printnl()
// endif
// endif
//
// pfx_widget()
if is_keyboard_key_just_pressed(key_s)
mission_passed()
endif
if is_keyboard_key_just_pressed(key_f)
mission_failed_text = ""
setup_mission_fail()
endif
if is_keyboard_key_just_pressed(key_k)
for i = 0 to count_of(wave_0_inside_enemy) - 1
if does_entity_exist(wave_0_inside_enemy[i].ped)
set_entity_health(wave_0_inside_enemy[i].ped, 2)
endif
endfor
endif
#endif
endwhile
endscript
//lkmethlab waypoints
//waypoint 4 = buddy running from inside lab to outside to shoot inside enemy guys
//waypoint 5 = buddy running from outside lab to other side of rooftop
//waypoint 3 = buddy running from rooftop down stairs
//player_running_from
//waypoint 6 = player running from inside lab to outside.
//waypoint 7 = player running from outside lab to other side of rooftop