3675 lines
139 KiB
Python
Executable File
3675 lines
139 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.
|
|
|
|
USING "rage_builtins.sch"
|
|
USING "globals.sch"
|
|
USING "commands_camera.sch"
|
|
USING "commands_pad.sch"
|
|
USING "commands_script.sch"
|
|
USING "flow_public_core_override.sch"
|
|
USING "RC_Helper_Functions.sch"
|
|
USING "rgeneral_include.sch"
|
|
USING "taxi_functions.sch"
|
|
#IF IS_DEBUG_BUILD
|
|
USING "select_mission_stage.sch"
|
|
#ENDIF
|
|
USING "replay_public.sch"
|
|
USING "RC_Threat_public.sch"
|
|
USING "family_public.sch"
|
|
USING "shared_hud_displays.sch"
|
|
USING "commands_recording.sch"
|
|
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
//
|
|
// MISSION NAME : ME_Amanda1.sc
|
|
// AUTHOR : Joe Binks
|
|
// DESCRIPTION : Amanda has been arrested for shoplifting and placed in the back
|
|
// of a police car. Michael must steal the cop car and escape
|
|
// before the cops drive away.
|
|
//
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
|
|
// ===========================================================================================================
|
|
// Variables / Constants etc
|
|
// ===========================================================================================================
|
|
|
|
ENUM MISSION_STATE
|
|
MS_INIT,
|
|
MS_DRIVE_TO_SHOP,
|
|
MS_RESCUE_AMANDA,
|
|
MS_LOSE_COPS,
|
|
MS_DRIVE_HOME,
|
|
MS_RETURN_TO_AMANDA,
|
|
MS_AT_HOME,
|
|
MS_AT_HOTEL,
|
|
MS_FAIL_DELAY
|
|
ENDENUM
|
|
|
|
ENUM MISSION_SUBSTATE
|
|
MSS_PREPARE,
|
|
MSS_ACTIVE_ONE,
|
|
MSS_ACTIVE_TWO,
|
|
MSS_ACTIVE_THREE,
|
|
MSS_ACTIVE_FOUR
|
|
ENDENUM
|
|
|
|
ENUM MISSION_FAILED_REASON
|
|
MFR_NONE,
|
|
MFR_AMANDA_HURT,
|
|
MFR_AMANDA_DEAD,
|
|
MFR_AMANDA_ARRESTED,
|
|
MFR_AMANDA_LEFT,
|
|
MFR_TRASHED_CAR
|
|
ENDENUM
|
|
|
|
ENUM GRIEF_CONV_STATE
|
|
GCS_READY,
|
|
GCS_PLAYING,
|
|
GCS_FINISH
|
|
ENDENUM
|
|
|
|
ENUM ARREST_SCENE_STAGE
|
|
ASS_STANDING,
|
|
ASS_ARREST,
|
|
ASS_READY,
|
|
ASS_POST_ARREST,
|
|
ASS_BREAKOUT,
|
|
ASS_END
|
|
ENDENUM
|
|
|
|
ENUM COP_CHAT_STAGE
|
|
CCS_NOT_STARTED,
|
|
CCS_INIT,
|
|
CCS_WAIT_FOR_REINIT,
|
|
CCS_PLAYING_NO_SUBS,
|
|
CCS_PLAYING_SUBS,
|
|
CCS_DONE
|
|
ENDENUM
|
|
|
|
CONST_INT MICHAEL_ID 0
|
|
CONST_INT AMANDA_ID 4//3
|
|
CONST_INT AMANDA_PHONE_ID 4
|
|
CONST_INT SHOPKEEPER_ID 5
|
|
CONST_INT COP_ID 6
|
|
structPedsForConversation pedConvStruct
|
|
//STRING sPlayerGestureGroup = "PlayerGestureGroup"
|
|
|
|
INT iArrestScene
|
|
ARREST_SCENE_STAGE eArrestSceneStage = ASS_STANDING
|
|
VECTOR vArrestScenePos = <<-836.87, -153.92, 34.77>>//<<-836.8745, -154.0169, 34.671>>
|
|
VECTOR vArrestSceneRot = <<-1, -2, 114>>//<<0,0,112.8727>>
|
|
STRING sCopStand = "stand_loop_cop"
|
|
STRING sShopStand = "stand_loop_owner"
|
|
STRING sAmandaStand = "stand_loop_ama"
|
|
STRING sCopCarStand = "stand_loop_car"
|
|
STRING sCopArrest = "arrest_cop"
|
|
STRING sShopArrest = "arrest_owner"
|
|
STRING sAmandaArrest = "arrest_ama"
|
|
STRING sCopCarArrest = "arrest_car"
|
|
STRING sCopPstArrest = "pst_arrest_loop_cop"
|
|
STRING sShopPstArrest = "pst_arrest_loop_owner"
|
|
CONST_FLOAT fStartArrestAnimDist 90.0 // Doubled if in vehicle, but lines are not subtitled until you are within this distance
|
|
COP_CHAT_STAGE copChatState
|
|
TEXT_LABEL_23 tCopCharConvLabel
|
|
|
|
/*VECTOR vOnFootEndPosMichael = <<-823.5155, 181.1892, 70.6611>>
|
|
FLOAT fOnFootEndRotMichael = 129.8824
|
|
VECTOR vOnFootEndPosAmanda = <<-824.33, 180.29, 71.55>>
|
|
FLOAT fOnFootEndRotAmanda = -31.51*/
|
|
/*FLOAT fOnFootEndCamHeading = 129.9509
|
|
FLOAT fOnFootEndCamPitch = -22.8990*/
|
|
VECTOR vAmandaFinalDest = <<-813.367920,179.495605,71.159195>>//<<-814.317505,179.017578,71.159195>>//<<-807.178955,180.306046,71.153076>>
|
|
VECTOR vAmandaFinalDestRear = <<-806.181396,184.289764,71.347694>>
|
|
VECTOR vKitchen = <<-801.9036, 182.9307, 71.6055>>
|
|
VECTOR vHotel = <<-1368.278687,355.901825,63.081089>>//<<-1320.7941, 380.0252, 68.0737>>
|
|
|
|
CONST_INT NUM_DRIVE_CONVS 4
|
|
CONST_INT iDriveConvTimer 2000
|
|
STRING sDriveConvs[NUM_DRIVE_CONVS]
|
|
INT iCurrentDriveConv = -1
|
|
INT iPreviousDriveConv = -1
|
|
|
|
CONST_INT NUM_START_LINES 1//5
|
|
CONST_INT iStartLinesTimer 10000
|
|
STRING sStartLines//[NUM_START_LINES]
|
|
INT iCurrentStartLine = -1
|
|
INT iPreviousStartLine = -1
|
|
|
|
INT iConversationTimer
|
|
|
|
CAMERA_INDEX ciHomeCam
|
|
|
|
CONST_INT DRIVING_LINES_TIMEOUT 9000//3000
|
|
|
|
INT iGriefingTimer = 0
|
|
CONST_INT GRIEFING_TIME 7000
|
|
TEXT_LABEL_23 sSceneConvLine//[NUM_SCENE_LINES]
|
|
GRIEF_CONV_STATE eGriefState = GCS_READY
|
|
|
|
CONST_INT NUM_CRASH_LINES 4
|
|
INT iCrashLineTimer
|
|
STRING sCrashLines[NUM_CRASH_LINES]
|
|
INT iCurrentCrashLine = 0
|
|
|
|
CONST_INT NUM_CRIME_LINES 4
|
|
//INT iCrimeLineTimer
|
|
//STRING sCrimeLines[NUM_CRIME_LINES]
|
|
//INT iCurrentCrimeLine = 0
|
|
|
|
CONST_INT NUM_STILL_LINES 3
|
|
INT iStillLineTimer
|
|
INT iStillTime
|
|
CONST_INT iStillTimeout 180//60
|
|
STRING sStillLines[NUM_STILL_LINES]
|
|
INT iCurrentStillLine = 0
|
|
|
|
INT iAbandonLineTimer
|
|
|
|
CONST_INT NUM_SIREN_LINES 3
|
|
INT iSirenLineTimer
|
|
STRING sSirenLines[NUM_SIREN_LINES]
|
|
INT iCurrentSirenLine = 0
|
|
BOOL bIsSirenOn = FALSE
|
|
BOOL bWasSirenOn = FALSE
|
|
|
|
CONST_INT NUM_LOSECOP_LINES 9
|
|
INT iLoseCopsTimer
|
|
STRING sLoseCopLines[NUM_LOSECOP_LINES]
|
|
INT iCurrentLoseCopLine = 0
|
|
CONST_INT NUM_LOSECOP_REPLY 4
|
|
STRING sLoseCopReply[NUM_LOSECOP_LINES]
|
|
INT iSelectedReply = 0
|
|
INT iPreviousReply = 0
|
|
|
|
CONST_INT NUM_NOT_HOME_LINES 3
|
|
INT iNotHomeTimer
|
|
STRING sNotHomeLines[NUM_NOT_HOME_LINES]
|
|
INT iCurrentNotHomeLine = 0
|
|
|
|
INT iCopCarDamageTimer = 0
|
|
|
|
CONST_FLOAT fSceneConvRadius 20.0
|
|
//BOOL bAllowSceneConv = TRUE
|
|
|
|
CONST_FLOAT fAmandaConvRadius 5.0
|
|
//BOOL bAllowAmandaConv = TRUE
|
|
CONST_INT NUM_AMANDA_LINES 5
|
|
INT iAmandaLineTimer
|
|
STRING sAmandaLines[NUM_AMANDA_LINES]
|
|
INT iCurrentAmandaLine = 0
|
|
|
|
STRING sMissionAnimDict = "rcmme_amanda1"
|
|
STRING sAmandaMoveDict = "move_characters@amanda@bag"
|
|
|
|
VECTOR vDisableNavmeshMin = <<-839.543579,-161.144562,36.821663>>
|
|
VECTOR vDisableNavmeshMax = <<-837.645996,-155.749100,37.943207>>
|
|
|
|
VECTOR vShopLocation = << -839.0088, -161.5691, 36.8037 >>
|
|
VECTOR vHomeLocation = <<-825.503540,179.026611,70.369011>>//<<-822.573730,182.467636,70.849342>>//<<-829.0000, 171.0000, 70.0000>>
|
|
VECTOR vHotelLocation = <<-1378.4454, 367.8120, 63.0445>>//<<-1317.6356, 391.5271, 68.6091>>
|
|
CONST_FLOAT fSpawnSetupDist 200.0
|
|
CONST_FLOAT fBlipAmandaDist 30.0
|
|
CONST_FLOAT fFailDistance 200.0
|
|
CONST_FLOAT fWarnDistance 15.0
|
|
CONST_FLOAT fReturnDistance 5.0
|
|
INT iDriveToShopTime
|
|
INT iFailTimer = 0
|
|
INT iCopDrivingTimer = 0
|
|
INT iMissionTimer = 0
|
|
//INT iStartDay = -1
|
|
CONST_INT iCopChaseTime 10000
|
|
CONST_INT MIN_DRIVE_TO_SHOP_TIME 30000
|
|
BOOL bPlayBeeps = TRUE
|
|
INT iBeepTimer
|
|
BOOL bStartedBeepTimer = FALSE
|
|
|
|
CONST_INT AT_SHOP_FAIL_TIME 25000 // The amount of time it takes for the cop/shopkeeper conversation to play
|
|
|
|
INT iCopGunTimer
|
|
|
|
MISSION_STATE missionState = MS_INIT
|
|
MISSION_SUBSTATE missionSubstate = MSS_PREPARE
|
|
|
|
MISSION_FAILED_REASON missionFailedReason = MFR_NONE
|
|
|
|
BLIP_INDEX biObjective
|
|
|
|
PED_INDEX piAmanda
|
|
REL_GROUP_HASH rghPlayer
|
|
|
|
VEHICLE_INDEX viCopCar
|
|
MODEL_NAMES mnCopCar = POLICE
|
|
VECTOR vCopCarPos = <<-840.28, -153.57, 37.41>>//<<-840.94, -153.84, 37.39>>
|
|
FLOAT fCopCarHeading = 298.55//299.88
|
|
|
|
PED_INDEX piCop
|
|
MODEL_NAMES mnCop = S_M_Y_COP_01
|
|
VECTOR vCopPos = <<-839.05, -158.35, 37.88>>
|
|
FLOAT fCopHeading = -163.87
|
|
|
|
//VECTOR vAmandaPos = <<-838.05, -157.35, 37.88>>
|
|
|
|
/*OBJECT_INDEX oiNotebook
|
|
MODEL_NAMES mnNotebook = PROP_NOTEPAD_01
|
|
VECTOR vNotebookOffset = <<0.1476, -0.0042, -0.0350>>
|
|
VECTOR vNotebookRotate = <<373.8389, -141.4298, -12.1299>>*/
|
|
|
|
PED_INDEX piShopkeeper
|
|
MODEL_NAMES mnShopkeeper = A_M_Y_BUSINESS_01
|
|
VECTOR vShopkeeperPos = <<-838.82, -159.50, 37.86>>
|
|
FLOAT fShopkeeperHeading = 11.64
|
|
|
|
VEHICLE_INDEX viPlayersVehicle
|
|
CONST_INT iCheckVehicle 1000
|
|
INT iCheckVehicleTimer = 0
|
|
CONST_INT NUM_ROOF_LINES 3
|
|
INT iCurrentRoofLine = -1
|
|
INT iPreviousRoofLine = -1
|
|
STRING sRoofLines[NUM_ROOF_LINES]
|
|
CONST_INT iRoofTime 5000
|
|
INT iRoofConvTimer
|
|
INT iInCarConvTimer
|
|
|
|
BOOL bShowHomeObjective = TRUE
|
|
BOOL bShowReturnObjective = TRUE
|
|
BOOL bStartCopToCar = TRUE
|
|
//BOOL bAllowLooking = TRUE
|
|
BOOL bAllowInCarConv = TRUE
|
|
BOOL bIsCarFrozen = TRUE
|
|
//BOOL bArrivedInVehicle = TRUE
|
|
BOOL bForceAmandaIntoGroup = FALSE
|
|
BOOL bPausedConversation = FALSE
|
|
|
|
BOOL bHandcuffSoundReady = FALSE
|
|
BOOL bLoadHandcuffSound = FALSE
|
|
INT iHandcuffSound
|
|
INT iHandCuffTimer
|
|
|
|
BOOL bShowingAmandasBag = TRUE
|
|
|
|
// variables for disabling the road the police car is on
|
|
VECTOR vRoadOffOne = <<-784.169678,-121.780930,35.823196>>
|
|
VECTOR vRoadOffTwo = <<-847.763611,-155.086975,37.793705>>
|
|
FLOAT fRoadOffWidth = 6.0
|
|
|
|
// Timer to check if conversations have failed to trigger
|
|
INT iConvFailedTimer
|
|
INT iCopConvFailedTimer
|
|
INT iWalkToHouseFailed
|
|
//CONST_INT CONV_FAILED_TIME 5000
|
|
|
|
BOOL bNotBumpedYet = TRUE
|
|
INT iBumpTimer = -1
|
|
|
|
BOOL bDisplaySeatObjective = TRUE
|
|
|
|
// Clear this area if the player arrives home on foot
|
|
VECTOR vCutsceneAreaPos1 = <<-826.696777,178.020920,69.187263>>
|
|
VECTOR vCutsceneAreaPos2 = <<-817.752869,185.950363,72.353897>>
|
|
FLOAT fCutsceneAreaWidth = 7.0
|
|
VECTOR vCarMovePos = <<-826.00, 157.66, 69.06>>
|
|
FLOAT fCarMoveHead = 273.51
|
|
|
|
// house and garage areas
|
|
/*VECTOR vGaragePos1 = <<-807.051025,188.957352,72.835045>>
|
|
VECTOR vGaragePos2 = <<-825.467041,182.292862,69.701797>>
|
|
FLOAT fGarageWidth = 6.0
|
|
VECTOR vHousePos1 = <<-816.768799,171.898209,69.564308>>
|
|
VECTOR vHousePos2 = <<-793.081055,180.968567,81.835052>>
|
|
FLOAT fHouseWidth = 20.0*/
|
|
|
|
/*VECTOR vOutsideGatePos1 = <<-856.688721,159.215210,63.143036>>
|
|
VECTOR vOutsideGatePos2 = <<-844.199646,159.172287,67.778503>>
|
|
FLOAT fOutsideGateWidth = 8.0*/
|
|
|
|
CONST_INT CP_MISSION_START 0
|
|
CONST_INT CP_AT_SHOP 1
|
|
//CONST_INT CP_DRIVE_HOME 2
|
|
CONST_INT CP_MISSION_PASSED 2//3
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
MissionStageMenuTextStruct sSkipMenu[4]
|
|
#ENDIF
|
|
|
|
RC_CONV_RESTORE_STATE stateRestoreConversation
|
|
TEXT_LABEL_23 tSavedConversationRoot
|
|
TEXT_LABEL_23 tSavedConversationLabel
|
|
|
|
// ===========================================================================================================
|
|
// Termination
|
|
// ===========================================================================================================
|
|
/// PURPOSE:
|
|
/// Deletes or releases all peds and vehicles created by the mission
|
|
/// PARAMS:
|
|
/// deleteAll - Should the peds and vehicles be deleted? TRUE if so
|
|
PROC RemovePedsAndVehicles(BOOL deleteAll = FALSE, BOOL bFailed = FALSE)
|
|
IF deleteAll
|
|
SAFE_DELETE_PED(piAmanda)
|
|
ELSE
|
|
IF IS_PED_UNINJURED(piAmanda) AND IS_PED_IN_GROUP(piAmanda)
|
|
REMOVE_PED_FROM_GROUP(piAmanda)
|
|
ENDIF
|
|
IF bFailed
|
|
SAFE_RELEASE_PED(piAmanda)
|
|
ELSE
|
|
IF IS_PED_UNINJURED(piAmanda) AND IS_ENTITY_AT_COORD(piAmanda, vHomeLocation, <<50,50,50>>)
|
|
RELEASE_PED_TO_FAMILY_SCENE(piAmanda)
|
|
ELSE
|
|
SAFE_RELEASE_PED(piAmanda)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SAFE_REMOVE_BLIP(biObjective)
|
|
|
|
IF deleteAll
|
|
SAFE_DELETE_VEHICLE(viCopCar)
|
|
ELSE
|
|
IF IS_VEHICLE_OK(viCopCar)
|
|
//SET_VEHICLE_CAN_SAVE_IN_GARAGE(viCopCar, TRUE)
|
|
ENDIF
|
|
SAFE_RELEASE_VEHICLE(viCopCar)
|
|
ENDIF
|
|
|
|
IF deleteAll
|
|
SAFE_DELETE_VEHICLE(viPlayersVehicle)
|
|
ELSE
|
|
IF IS_VEHICLE_OK(viPlayersVehicle)
|
|
//SET_VEHICLE_CAN_SAVE_IN_GARAGE(viPlayersVehicle, TRUE)
|
|
ENDIF
|
|
SAFE_RELEASE_VEHICLE(viPlayersVehicle)
|
|
ENDIF
|
|
|
|
//SAFE_DELETE_OBJECT(oiNotebook)
|
|
|
|
IF DOES_ENTITY_EXIST(piCop)
|
|
REMOVE_PED_FOR_DIALOGUE(pedConvStruct, COP_ID)
|
|
BOOL bKeepTask = TRUE
|
|
IF NOT IS_PED_INJURED(piCop)
|
|
IF IS_PED_IN_COMBAT(piCop) AND NOT (GET_PEDS_CURRENT_WEAPON(piCop) = WEAPONTYPE_PISTOL)
|
|
CLEAR_PED_TASKS(piCop)
|
|
TASK_WANDER_STANDARD(piCop)
|
|
/*ELIF IS_ENTITY_PLAYING_ANIM(piCop, sMissionAnimDict, sCopAnim)
|
|
bKeepTask = FALSE*/
|
|
ENDIF
|
|
ENDIF
|
|
IF deleteAll
|
|
SAFE_DELETE_PED(piCop)
|
|
ELSE
|
|
SAFE_RELEASE_PED(piCop, bKeepTask)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF deleteAll
|
|
SAFE_DELETE_PED(piShopkeeper)
|
|
ELSE
|
|
SAFE_RELEASE_PED(piShopkeeper, FALSE)
|
|
ENDIF
|
|
|
|
STOP_AUDIO_SCENES()
|
|
|
|
DISABLE_NAVMESH_IN_AREA(vDisableNavmeshMin, vDisableNavmeshMax, FALSE)
|
|
SET_PED_PATHS_IN_AREA(vDisableNavmeshMin, vDisableNavmeshMax, TRUE)
|
|
CLEAR_PED_NON_CREATION_AREA()
|
|
REMOVE_SCENARIO_BLOCKING_AREAS()
|
|
ENDPROC
|
|
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
// Mission Cleanup
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
/// PURPOSE:
|
|
/// Cleans up everything used by the mission
|
|
PROC Mission_Cleanup(BOOL bFailed = FALSE)
|
|
|
|
CPRINTLN(DEBUG_MISSION,"...ME_Amanda1 Cleanup")
|
|
RemovePedsAndVehicles(FALSE, bFailed)
|
|
RESET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID())
|
|
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(vRoadOffOne, vRoadOffTwo, fRoadOffWidth)
|
|
CLEAR_PRINTS()
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
SET_AUDIO_FLAG("WantedMusicOnMission", FALSE)
|
|
SET_WIDESCREEN_BORDERS(FALSE, 0)
|
|
|
|
TERMINATE_THIS_THREAD()
|
|
ENDPROC
|
|
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
// Mission Pass
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
/// PURPOSE:
|
|
/// Passes the mission
|
|
PROC Mission_Passed()
|
|
|
|
CPRINTLN(DEBUG_MISSION,"...ME_Amanda1 Passed")
|
|
|
|
//MISSION_FLOW_PLAY_END_OF_MISSION_MUSIC(TRUE)
|
|
Mission_Flow_Mission_Passed()
|
|
Mission_Cleanup()
|
|
ENDPROC
|
|
|
|
// ===========================================================================================================
|
|
// Helper functions
|
|
// ===========================================================================================================
|
|
/// PURPOSE:
|
|
/// Plays dialogue of Michael talking to himself while driving to get Amanda
|
|
PROC PlayStartLines()
|
|
IF iCurrentStartLine < NUM_START_LINES AND IS_PED_UNINJURED(PLAYER_PED_ID()) AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_THIS_PRINT_BEING_DISPLAYED("MEA1_01") // Go to ~y~Didier Sachs.
|
|
AND (GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vShopLocation) > (fBlipAmandaDist*3.0))
|
|
IF iPreviousStartLine = iCurrentStartLine
|
|
iCurrentStartLine++
|
|
iConversationTimer = GET_GAME_TIMER() + iStartLinesTimer
|
|
ELSE
|
|
IF GET_GAME_TIMER() > iConversationTimer
|
|
//IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_MICHAEL", sStartLines[iCurrentStartLine], CONV_PRIORITY_MEDIUM)
|
|
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_MICHAEL", sStartLines, CONV_PRIORITY_MEDIUM)
|
|
iPreviousStartLine = iCurrentStartLine
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if it's ok to display subtitles for a conversation
|
|
/// RETURNS:
|
|
/// The appropriate subtitles state, based on whether or not an objective is being displayed
|
|
FUNC enumSubtitlesState CheckDisplaySubtitles()
|
|
|
|
IF IS_MESSAGE_BEING_DISPLAYED()
|
|
RETURN DO_NOT_DISPLAY_SUBTITLES
|
|
ELSE
|
|
RETURN DISPLAY_SUBTITLES
|
|
ENDIF
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Loads all the models and animations used in the shop scene
|
|
PROC LoadSceneModels()
|
|
REQUEST_MODEL(mnCopCar)
|
|
REQUEST_MODEL(mnCop)
|
|
REQUEST_LOAD_MODEL(GET_NPC_PED_MODEL(CHAR_AMANDA))
|
|
//REQUEST_MODEL(mnNotebook)
|
|
REQUEST_MODEL(mnShopkeeper)
|
|
REQUEST_ANIM_DICT(sMissionAnimDict)
|
|
REQUEST_ANIM_DICT(sAmandaMoveDict)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Suppresses the players vehicle model
|
|
PROC SUPPRESS_PLAYERS_VEHICLE()
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
VEHICLE_INDEX viPlayerCar = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
IF IS_VEHICLE_OK(viPlayerCar)
|
|
MODEL_NAMES mnPlayerCar = GET_ENTITY_MODEL(viPlayerCar)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(mnPlayerCar, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Creates the cop, shopkeeper, cop car and Amanda
|
|
PROC SpawnShopScene()
|
|
IF NOT DOES_ENTITY_EXIST(viCopCar)
|
|
IF HAS_MODEL_LOADED(mnCopCar)
|
|
viCopCar = CREATE_VEHICLE(mnCopCar, vCopCarPos, fCopCarHeading)
|
|
SET_VEHICLE_ENGINE_ON(viCopCar, TRUE, TRUE)
|
|
FREEZE_ENTITY_POSITION(viCopCar, TRUE)
|
|
SET_VEHICLE_CAN_SAVE_IN_GARAGE(viCopCar, FALSE)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(viCopCar, FALSE)
|
|
SET_VEHICLE_EXTRA(viCopCar, VEHICLE_SETUP_FLAG_EXTRA_2, TRUE)
|
|
bIsCarFrozen = TRUE
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(mnCopCar)
|
|
SET_ROADS_IN_ANGLED_AREA(vRoadOffOne, vRoadOffTwo, fRoadOffWidth, FALSE, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(piAmanda)
|
|
IF IS_VEHICLE_OK(viCopCar) AND HAS_MODEL_LOADED(GET_NPC_PED_MODEL(CHAR_AMANDA))
|
|
CREATE_NPC_PED_INSIDE_VEHICLE(piAmanda, CHAR_AMANDA, viCopCar, VS_BACK_RIGHT)
|
|
//CREATE_NPC_PED_ON_FOOT(piAmanda, CHAR_AMANDA, vAmandaPos)
|
|
SET_PED_PRELOAD_VARIATION_DATA(piAmanda, PED_COMP_HAIR, 4, 0)
|
|
SET_PED_PRELOAD_VARIATION_DATA(piAmanda, PED_COMP_TORSO, 5, 0)
|
|
SET_PED_PRELOAD_VARIATION_DATA(piAmanda, PED_COMP_LEG, 5, 0)
|
|
SET_PED_PRELOAD_VARIATION_DATA(piAmanda, PED_COMP_SPECIAL, 1, 0)
|
|
SET_PED_PRELOAD_VARIATION_DATA(piAmanda, PED_COMP_BERD, 0, 0)
|
|
SET_PED_PRELOAD_VARIATION_DATA(piAmanda, PED_COMP_DECL, 1, 0)
|
|
SET_PED_COMPONENT_VARIATION(piAmanda, PED_COMP_HAIR, 4, 0)
|
|
SET_PED_COMPONENT_VARIATION(piAmanda, PED_COMP_TORSO, 5, 0)
|
|
SET_PED_COMPONENT_VARIATION(piAmanda, PED_COMP_LEG, 5, 0)
|
|
SET_PED_COMPONENT_VARIATION(piAmanda, PED_COMP_SPECIAL, 1, 0)
|
|
SET_PED_COMPONENT_VARIATION(piAmanda, PED_COMP_BERD, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(piAmanda, PED_COMP_DECL, 1, 0)
|
|
SET_PED_PROP_INDEX(piAmanda, ANCHOR_EYES, 0)
|
|
SET_PED_CAN_BE_TARGETTED(piAmanda, FALSE)
|
|
SET_PED_CONFIG_FLAG(piAmanda, PCF_GetOutUndriveableVehicle, FALSE)
|
|
SET_PED_CONFIG_FLAG(piAmanda, PCF_GetOutBurningVehicle, FALSE)
|
|
SET_PED_CONFIG_FLAG(piAmanda, PCF_OpenDoorArmIK, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(piAmanda, TRUE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), rghPlayer)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(piAmanda, rghPlayer)
|
|
//SET_PED_DIES_INSTANTLY_IN_WATER(piAmanda, TRUE)
|
|
SET_PED_DIES_IN_WATER(piAmanda, TRUE)
|
|
SET_PED_DIES_IN_SINKING_VEHICLE(piAmanda, TRUE)
|
|
SET_PED_CAN_PLAY_GESTURE_ANIMS(piAmanda, TRUE)
|
|
eArrestSceneStage = ASS_STANDING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//IF NOT DOES_ENTITY_EXIST(oiNotebook)
|
|
IF NOT DOES_ENTITY_EXIST(piCop)
|
|
IF /*HAS_MODEL_LOADED(mnNotebook) AND*/ HAS_MODEL_LOADED(mnCop)
|
|
//oiNotebook = CREATE_OBJECT_NO_OFFSET(mnNotebook, vCopPos)
|
|
//IF NOT DOES_ENTITY_EXIST(piCop)
|
|
piCop = CREATE_PED(PEDTYPE_COP, mnCop, vCopPos, fCopHeading)
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, COP_ID, piCop, "MEAmandaCop", TRUE)
|
|
SET_PED_CAN_SWITCH_WEAPON(piCop, FALSE)
|
|
SET_PED_PROP_INDEX(piCop, ANCHOR_EYES, 0)
|
|
SET_PED_ACCURACY(piCop, 25)
|
|
SET_ENTITY_COORDS_NO_OFFSET(piCop, vCopPos)
|
|
SET_ENTITY_HEALTH(piCop, 110)
|
|
/*IF HAS_ANIM_DICT_LOADED(sMissionAnimDict)
|
|
TASK_PLAY_ANIM(piCop, sMissionAnimDict, sCopAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE)
|
|
ENDIF*/
|
|
//ATTACH_ENTITY_TO_ENTITY(oiNotebook, piCop, GET_PED_BONE_INDEX( piCop, BONETAG_R_HAND ), vNotebookOffset, vNotebookRotate, TRUE, TRUE)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(mnCop)
|
|
//SET_MODEL_AS_NO_LONGER_NEEDED(mnNotebook)
|
|
//ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(piShopkeeper)
|
|
IF HAS_MODEL_LOADED(mnShopkeeper) //AND HAS_ANIM_DICT_LOADED(sMissionAnimDict)
|
|
piShopkeeper = CREATE_PED(PEDTYPE_CIVMALE, mnShopkeeper, vShopkeeperPos, fShopkeeperHeading)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(piShopkeeper, TRUE)
|
|
SET_ENTITY_COORDS_NO_OFFSET(piShopkeeper, vShopkeeperPos)
|
|
//TASK_PLAY_ANIM(piShopkeeper, sMissionAnimDict, sShopAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE)
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, SHOPKEEPER_ID, piShopkeeper, "MEAmandaShop", TRUE)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(mnShopkeeper)
|
|
|
|
// only need to do this stuff once so placing it here to ensure that happens
|
|
CLEAR_AREA_OF_PEDS(vCopPos, 50.0)
|
|
DISABLE_NAVMESH_IN_AREA(vDisableNavmeshMin, vDisableNavmeshMax, TRUE)
|
|
SET_PED_PATHS_IN_AREA(vDisableNavmeshMin, vDisableNavmeshMax, FALSE)
|
|
SET_PED_NON_CREATION_AREA(vDisableNavmeshMin, vDisableNavmeshMax)
|
|
ADD_SCENARIO_BLOCKING_AREA(vDisableNavmeshMin, vDisableNavmeshMax)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Triggers the conversation between the shopkeeper and cop when the player is close enough
|
|
PROC PlayCopShopkeeperConv()
|
|
|
|
SWITCH copChatState
|
|
|
|
CASE CCS_NOT_STARTED
|
|
// Waiting to start
|
|
BREAK
|
|
|
|
CASE CCS_INIT
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
/*FLOAT fTriggerDist
|
|
IF IS_PED_ON_FOOT(PLAYER_PED_ID())
|
|
fTriggerDist = fStartArrestAnimDist
|
|
ELSE
|
|
fTriggerDist = (fStartArrestAnimDist*2)
|
|
ENDIF*/
|
|
IF IS_PED_ON_FOOT(PLAYER_PED_ID())
|
|
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vArrestScenePos, fStartArrestAnimDist)
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
IF CREATE_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_SCENE", CONV_PRIORITY_MEDIUM, CheckDisplaySubtitles())
|
|
OR CONVERSATION_TIMED_OUT(iCopConvFailedTimer, 2000)
|
|
CPRINTLN(DEBUG_MISSION, "PlayCopShopkeeperConv: CCS_INIT: Started synched scene conversation with subtitles.")
|
|
eArrestSceneStage = ASS_ARREST
|
|
//bAllowSceneConv = FALSE
|
|
IF GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0
|
|
copChatState = CCS_DONE
|
|
ELSE
|
|
copChatState = CCS_PLAYING_SUBS
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vArrestScenePos, (fStartArrestAnimDist*2))
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
IF CREATE_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_SCENE", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
|
|
OR CONVERSATION_TIMED_OUT(iCopConvFailedTimer, 2000)
|
|
CPRINTLN(DEBUG_MISSION, "PlayCopShopkeeperConv: CCS_INIT: Started synched scene conversation without subtitles.")
|
|
eArrestSceneStage = ASS_ARREST
|
|
//bAllowSceneConv = FALSE
|
|
/*IF GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0
|
|
copChatState = CCS_DONE
|
|
ELSE*/
|
|
copChatState = CCS_PLAYING_NO_SUBS
|
|
//ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE CCS_WAIT_FOR_REINIT
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vArrestScenePos, 90)
|
|
AND NOT IS_THIS_PRINT_BEING_DISPLAYED("MEA1_02") AND NOT IS_THIS_PRINT_BEING_DISPLAYED("MEA1_03") // Get in the ~b~cop car. / Lose the cops.
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(pedConvStruct, "MEA1AUD", "MEA1_SCENE", tCopCharConvLabel, CONV_PRIORITY_MEDIUM)
|
|
CPRINTLN(DEBUG_MISSION, "PlayCopShopkeeperConv: CCS_WAIT_FOR_REINIT: Resumed synched scene conversation with subtitles")
|
|
//bAllowSceneConv = FALSE
|
|
copChatState = CCS_PLAYING_SUBS
|
|
ENDIF
|
|
ELSE
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(pedConvStruct, "MEA1AUD", "MEA1_SCENE", tCopCharConvLabel, CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
|
|
CPRINTLN(DEBUG_MISSION, "PlayCopShopkeeperConv: CCS_WAIT_FOR_REINIT: Resumed synched scene conversation without subtitles")
|
|
//bAllowSceneConv = FALSE
|
|
copChatState = CCS_PLAYING_NO_SUBS
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE CCS_PLAYING_NO_SUBS
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
// See if we need to reinit
|
|
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vArrestScenePos, 90)
|
|
CPRINTLN(DEBUG_MISSION, "PlayCopShopkeeperConv: CCS_PLAYING_NO_SUBS: Player in range, stopping conversation")
|
|
tCopCharConvLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
|
|
IF ARE_STRINGS_EQUAL(tCopCharConvLabel, "")
|
|
OR ARE_STRINGS_EQUAL(tCopCharConvLabel, "NULL")
|
|
CPRINTLN(DEBUG_MISSION, "PlayCopShopkeeperConv: CCS_PLAYING_NO_SUBS: Player in range but conversation already on last line, going to CCS_DONE")
|
|
copChatState = CCS_DONE
|
|
ELSE
|
|
CPRINTLN(DEBUG_MISSION, "PlayCopShopkeeperConv: CCS_PLAYING_NO_SUBS: Stopping and storing synched scene conversation")
|
|
KILL_ANY_CONVERSATION()
|
|
copChatState = CCS_WAIT_FOR_REINIT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE CCS_PLAYING_SUBS
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
// See if we need to reinit
|
|
IF NOT IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vArrestScenePos, 91)
|
|
CPRINTLN(DEBUG_MISSION, "PlayCopShopkeeperConv: CCS_PLAYING_SUBS: Player out of range, stopping conversation")
|
|
tCopCharConvLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
|
|
IF ARE_STRINGS_EQUAL(tCopCharConvLabel, "")
|
|
OR ARE_STRINGS_EQUAL(tCopCharConvLabel, "NULL")
|
|
CPRINTLN(DEBUG_MISSION, "PlayCopShopkeeperConv: CCS_PLAYING_SUBS: Player out of range but conversation already on last line, going to CCS_DONE")
|
|
copChatState = CCS_DONE
|
|
ELSE
|
|
CPRINTLN(DEBUG_MISSION, "PlayCopShopkeeperConv: CCS_PLAYING_SUBS: Stopping and storing synched scene conversation")
|
|
KILL_ANY_CONVERSATION()
|
|
copChatState = CCS_WAIT_FOR_REINIT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE CCS_DONE
|
|
// Finished
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Hides Amanda's bag when she gets in a car, shows it again when she gets out
|
|
PROC AmandasBagManager()
|
|
IF IS_PED_UNINJURED(piAmanda)
|
|
IF bShowingAmandasBag
|
|
IF IS_PED_IN_ANY_VEHICLE(piAmanda)
|
|
SET_PED_COMPONENT_VARIATION(piAmanda, PED_COMP_SPECIAL, 0, 0)
|
|
bShowingAmandasBag = FALSE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(piAmanda, TRUE)
|
|
SET_PED_COMPONENT_VARIATION(piAmanda, PED_COMP_SPECIAL, 1, 0)
|
|
bShowingAmandasBag = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// State machine for controlling the arrest scene synced animation
|
|
PROC ControlArrestScene()
|
|
IF IS_PED_UNINJURED(piCop) AND IS_PED_UNINJURED(piShopkeeper) AND IS_PED_UNINJURED(piAmanda) AND IS_VEHICLE_OK(viCopCar) AND HAS_ANIM_DICT_LOADED(sMissionAnimDict)
|
|
#IF IS_DEBUG_BUILD
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), viCopCar) AND IS_SYNCHRONIZED_SCENE_RUNNING(iArrestScene)
|
|
CPRINTLN(DEBUG_MISSION, "ControlArrestScene: Player contacted cop car at phase ", GET_SYNCHRONIZED_SCENE_PHASE(iArrestScene))
|
|
ENDIF
|
|
#ENDIF
|
|
SWITCH eArrestSceneStage
|
|
CASE ASS_STANDING
|
|
PlayCopShopkeeperConv()
|
|
iArrestScene = CREATE_SYNCHRONIZED_SCENE(vArrestScenePos, vArrestSceneRot)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(iArrestScene,TRUE)
|
|
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iArrestScene,FALSE)
|
|
|
|
bShowingAmandasBag = TRUE
|
|
|
|
TASK_SYNCHRONIZED_SCENE(piCop, iArrestScene, sMissionAnimDict, sCopStand, INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS, RBF_PLAYER_IMPACT)
|
|
TASK_SYNCHRONIZED_SCENE(piShopkeeper, iArrestScene, sMissionAnimDict, sShopStand, INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS, RBF_PLAYER_IMPACT)
|
|
TASK_SYNCHRONIZED_SCENE(piAmanda, iArrestScene, sMissionAnimDict, sAmandaStand, INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS, RBF_PLAYER_IMPACT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(viCopCar, iArrestScene, sCopCarStand, sMissionAnimDict, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, ENUM_TO_INT(SYNCED_SCENE_USE_PHYSICS))
|
|
|
|
// Init conversation tracking variables
|
|
//copChatState = CCS_NOT_STARTED
|
|
iCopConvFailedTimer = -1
|
|
copChatState = CCS_INIT
|
|
|
|
//eArrestSceneStage = ASS_ARREST
|
|
eArrestSceneStage = ASS_READY
|
|
BREAK
|
|
CASE ASS_READY
|
|
PlayCopShopkeeperConv()
|
|
BREAK
|
|
CASE ASS_ARREST
|
|
PlayCopShopkeeperConv()
|
|
/*FLOAT fTriggerDist
|
|
IF IS_PED_ON_FOOT(PLAYER_PED_ID())
|
|
fTriggerDist = fStartArrestAnimDist
|
|
ELSE
|
|
fTriggerDist = (fStartArrestAnimDist*2)
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vShopLocation, fTriggerDist)*/
|
|
// Init the conversation
|
|
/*IF copChatState = CCS_NOT_STARTED
|
|
copChatState = CCS_INIT
|
|
ENDIF*/
|
|
|
|
//IF NOT bAllowSceneConv
|
|
iArrestScene = CREATE_SYNCHRONIZED_SCENE(vArrestScenePos, vArrestSceneRot)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(iArrestScene,FALSE)
|
|
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iArrestScene,FALSE)
|
|
|
|
TASK_SYNCHRONIZED_SCENE(piCop, iArrestScene, sMissionAnimDict, sCopArrest, INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, RBF_PLAYER_IMPACT)
|
|
TASK_SYNCHRONIZED_SCENE(piShopkeeper, iArrestScene, sMissionAnimDict, sShopArrest, INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS, RBF_PLAYER_IMPACT)
|
|
TASK_SYNCHRONIZED_SCENE(piAmanda, iArrestScene, sMissionAnimDict, sAmandaArrest, INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, RBF_PLAYER_IMPACT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(viCopCar, iArrestScene, sCopCarArrest, sMissionAnimDict, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, ENUM_TO_INT(SYNCED_SCENE_USE_PHYSICS))
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iArrestScene, 0.622)
|
|
//SET_SYNCHRONIZED_SCENE_PHASE(iArrestScene, 0.5)
|
|
|
|
eArrestSceneStage = ASS_POST_ARREST
|
|
//ENDIF
|
|
//ENDIF
|
|
BREAK
|
|
CASE ASS_POST_ARREST
|
|
PlayCopShopkeeperConv()
|
|
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iArrestScene)
|
|
CPRINTLN(DEBUG_MISSION, "ControlArrestScene: Recreating synched scene without Amanda and car...")
|
|
iArrestScene = CREATE_SYNCHRONIZED_SCENE(vArrestScenePos, vArrestSceneRot)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(iArrestScene,TRUE)
|
|
|
|
TASK_SYNCHRONIZED_SCENE(piCop, iArrestScene, sMissionAnimDict, sCopPstArrest, INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS, RBF_PLAYER_IMPACT)
|
|
TASK_SYNCHRONIZED_SCENE(piShopkeeper, iArrestScene, sMissionAnimDict, sShopPstArrest, INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS, RBF_PLAYER_IMPACT)
|
|
//TASK_SYNCHRONIZED_SCENE(piAmanda, iArrestScene, sMissionAnimDict, sAmandaPstArrest, INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS, RBF_PLAYER_IMPACT)
|
|
IF IS_VEHICLE_SEAT_FREE(viCopCar, VS_BACK_RIGHT)
|
|
//TASK_WARP_PED_INTO_VEHICLE(piAmanda, viCopCar, VS_BACK_RIGHT)
|
|
SET_PED_INTO_VEHICLE(piAmanda, viCopCar, VS_BACK_RIGHT)
|
|
SET_VEHICLE_DOOR_SHUT(viCopCar, SC_DOOR_REAR_RIGHT)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(viCopCar, TRUE)
|
|
//SET_ENTITY_COLLISION(piAmanda, TRUE)
|
|
TASK_LOOK_AT_ENTITY(piAmanda, PLAYER_PED_ID(), -1, SLF_FAST_TURN_RATE | SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
|
|
CPRINTLN(DEBUG_MISSION,"Amanda has just been given the look at entity task for the player")
|
|
ENDIF
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), viCopCar, TRUE)
|
|
PRINT_NOW("MEA1_02", DEFAULT_GOD_TEXT_TIME, 1) // Get in the ~b~cop car.
|
|
ENDIF
|
|
CHECK_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT_NOW(stateRestoreConversation)
|
|
//PLAY_SYNCHRONIZED_ENTITY_ANIM(viCopCar, iArrestScene, sCopCarPstArrest, sMissionAnimDict, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
|
|
|
|
eArrestSceneStage = ASS_END
|
|
ELSE
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iArrestScene) >= 0.9
|
|
IF IS_ENTITY_PLAYING_ANIM(piAmanda, sMissionAnimDict, sAmandaArrest, ANIM_SYNCED_SCENE)
|
|
// IF IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), viCopCar, 2.0)
|
|
CPRINTLN(DEBUG_MISSION, "ControlArrestScene: Pulling Amanda and car out of synched scene...")
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(piAmanda, INSTANT_BLEND_OUT, FALSE)
|
|
//STOP_SYNCHRONIZED_ENTITY_ANIM(viCopCar, SLOW_BLEND_OUT, TRUE)
|
|
IF IS_VEHICLE_SEAT_FREE(viCopCar, VS_BACK_RIGHT)
|
|
//TASK_WARP_PED_INTO_VEHICLE(piAmanda, viCopCar, VS_BACK_RIGHT)
|
|
SET_PED_INTO_VEHICLE(piAmanda, viCopCar, VS_BACK_RIGHT)
|
|
SET_VEHICLE_DOOR_SHUT(viCopCar, SC_DOOR_REAR_RIGHT)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(viCopCar, TRUE)
|
|
//SET_ENTITY_COLLISION(piAmanda, TRUE)
|
|
TASK_LOOK_AT_ENTITY(piAmanda, PLAYER_PED_ID(), -1, SLF_FAST_TURN_RATE | SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
|
|
CPRINTLN(DEBUG_MISSION,"Amanda has just been given the look at entity task for the player")
|
|
ENDIF
|
|
// ENDIF
|
|
ENDIF
|
|
ELIF GET_SYNCHRONIZED_SCENE_PHASE(iArrestScene) >= 0.85
|
|
IF IS_ENTITY_PLAYING_ANIM(viCopCar, sMissionAnimDict, sCopCarArrest, ANIM_SYNCED_SCENE)
|
|
SET_ENTITY_COLLISION(piAmanda, FALSE)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(viCopCar, SLOW_BLEND_OUT, TRUE)
|
|
SET_VEHICLE_DOOR_SHUT(viCopCar, SC_DOOR_REAR_RIGHT)
|
|
ENDIF
|
|
/*ELIF GET_SYNCHRONIZED_SCENE_PHASE(iArrestScene) >= 0.622
|
|
IF copChatState = CCS_NOT_STARTED
|
|
copChatState = CCS_INIT
|
|
ENDIF*/
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE ASS_BREAKOUT
|
|
// Shopkeeper and Cop leave the anim when the player steals the cop car
|
|
/*iArrestScene = CREATE_SYNCHRONIZED_SCENE(vArrestScenePos, vArrestSceneRot)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(iArrestScene,FALSE)
|
|
|
|
//TASK_SYNCHRONIZED_SCENE(piCop, iArrestScene, sMissionAnimDict, sCopBreak, INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS, RBF_PLAYER_IMPACT)
|
|
TASK_SYNCHRONIZED_SCENE(piShopkeeper, iArrestScene, sMissionAnimDict, sShopBreak, INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS, RBF_PLAYER_IMPACT)*/
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(piShopkeeper, sMissionAnimDict, sShopArrest, ANIM_SYNCED_SCENE)
|
|
OR IS_ENTITY_PLAYING_ANIM(piShopkeeper, sMissionAnimDict, sShopPstArrest, ANIM_SYNCED_SCENE)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(piShopkeeper, NORMAL_BLEND_OUT, TRUE)
|
|
ENDIF
|
|
IF IS_ENTITY_PLAYING_ANIM(piCop, sMissionAnimDict, sCopArrest, ANIM_SYNCED_SCENE)
|
|
OR IS_ENTITY_PLAYING_ANIM(piCop, sMissionAnimDict, sCopPstArrest, ANIM_SYNCED_SCENE)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(piCop, NORMAL_BLEND_OUT, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_PED_UNINJURED(piCop)
|
|
TASK_TURN_PED_TO_FACE_ENTITY(piCop, PLAYER_PED_ID(), -1)
|
|
ENDIF
|
|
/*IF NOT IsPedPerformingTask(piCop, SCRIPT_TASK_ARREST_PED)
|
|
SEQUENCE_INDEX siCopStart
|
|
OPEN_SEQUENCE_TASK(siCopStart)
|
|
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), 1500)
|
|
TASK_COMBAT_PED(NULL, PLAYER_PED_ID())
|
|
CLOSE_SEQUENCE_TASK(siCopStart)
|
|
TASK_PERFORM_SEQUENCE(piCop, siCopStart)
|
|
CLEAR_SEQUENCE_TASK(siCopStart)
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_PED_UNINJURED(piShopkeeper) AND NOT IS_PED_FLEEING(piShopkeeper)
|
|
TASK_SMART_FLEE_PED(piShopkeeper, PLAYER_PED_ID(), 500, -1)
|
|
ENDIF*/
|
|
|
|
eArrestSceneStage = ASS_END
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Updates the fail reason, and sets the mission state to be fail delay
|
|
/// PARAMS:
|
|
/// eFailReason - the reason the player failed the mission
|
|
PROC SetFailReason(MISSION_FAILED_REASON eFailReason)
|
|
missionFailedReason = eFailReason
|
|
missionState = MS_FAIL_DELAY
|
|
missionSubstate = MSS_PREPARE
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if Amanda has been killed or injured
|
|
PROC CheckAmanda()
|
|
IF missionState = MS_FAIL_DELAY
|
|
EXIT
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(piAmanda) AND IS_PED_INJURED(piAmanda)
|
|
SetFailReason(MFR_AMANDA_DEAD)
|
|
|
|
ELIF IS_PED_UNINJURED(piAmanda) AND IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(piAmanda, PLAYER_PED_ID())
|
|
IF HAS_PED_BEEN_DAMAGED_BY_WEAPON(piAmanda, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON) OR HAS_ENTITY_BEEN_DAMAGED_BY_ANY_VEHICLE(piAmanda)
|
|
SetFailReason(MFR_AMANDA_HURT)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// Used to fail the mission if the player takes too long, commented out in case this is needed again
|
|
PROC CopGetsInCar()
|
|
IF bStartCopToCar
|
|
DISABLE_NAVMESH_IN_AREA(vDisableNavmeshMin, vDisableNavmeshMax, FALSE)
|
|
SET_PED_PATHS_IN_AREA(vDisableNavmeshMin, vDisableNavmeshMax, TRUE)
|
|
IF IS_PED_UNINJURED(piCop) AND IS_VEHICLE_OK(viCopCar) AND IS_VEHICLE_SEAT_FREE(viCopCar)
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
IF CREATE_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_LEAVE", CONV_PRIORITY_MEDIUM, CheckDisplaySubtitles())
|
|
SEQUENCE_INDEX siDriveOff
|
|
OPEN_SEQUENCE_TASK(siDriveOff)
|
|
TASK_ENTER_VEHICLE(NULL, viCopCar, DEFAULT_TIME_BEFORE_WARP,VS_DRIVER,PEDMOVEBLENDRATIO_WALK)
|
|
TASK_VEHICLE_DRIVE_WANDER(NULL, viCopCar, 50, DRIVINGMODE_AVOIDCARS_OBEYLIGHTS)
|
|
CLOSE_SEQUENCE_TASK(siDriveOff)
|
|
TASK_PERFORM_SEQUENCE(piCop, siDriveOff)
|
|
CLEAR_SEQUENCE_TASK(siDriveOff)
|
|
FREEZE_ENTITY_POSITION(viCopCar, FALSE)
|
|
eArrestSceneStage = ASS_END
|
|
copChatState = CCS_DONE
|
|
bStartCopToCar = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC CopInCarFail()
|
|
IF IS_PED_UNINJURED(piCop) AND IS_VEHICLE_OK(viCopCar)
|
|
IF IS_PED_IN_VEHICLE(piCop, viCopCar)
|
|
//SET_VEHICLE_DOORS_LOCKED(viCopCar, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
|
|
FREEZE_ENTITY_POSITION(viCopCar, FALSE)
|
|
IF IsPedPerformingTask(piCop, SCRIPT_TASK_VEHICLE_DRIVE_WANDER)
|
|
IF GET_GAME_TIMER() > iCopDrivingTimer
|
|
SetFailReason(MFR_AMANDA_ARRESTED)
|
|
ENDIF
|
|
ELSE
|
|
TASK_VEHICLE_DRIVE_WANDER(piCop, viCopCar, 30.0, DRIVINGMODE_AVOIDCARS)
|
|
iCopDrivingTimer = GET_GAME_TIMER() + 2000
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Gets the current time and converts it to seconds
|
|
/// RETURNS:
|
|
/// The current time in seconds
|
|
FUNC INT GetTimeInSeconds()
|
|
/*INT iHours = GET_TIMEOFDAY_HOUR(GET_CURRENT_TIMEOFDAY())
|
|
IF iStartDay = -1
|
|
iStartDay = GET_TIMEOFDAY_DAY(GET_CURRENT_TIMEOFDAY())
|
|
ELSE
|
|
IF iStartDay <> GET_TIMEOFDAY_DAY(GET_CURRENT_TIMEOFDAY())
|
|
iHours += 24
|
|
ENDIF
|
|
ENDIF
|
|
// convert the hours value to minutes
|
|
iHours *= 60
|
|
iHours *= 1000
|
|
|
|
INT iMinutes = GET_TIMEOFDAY_MINUTE(GET_CURRENT_TIMEOFDAY())
|
|
// add the converted hours value
|
|
//iMinutes += iHours
|
|
// convert the minutes value to seconds
|
|
iMinutes *= 1000//60
|
|
|
|
INT iSeconds = iHours + iMinutes//GET_TIMEOFDAY_SECOND(GET_CURRENT_TIMEOFDAY())
|
|
// add the converted minutes value
|
|
//iSeconds += iMinutes
|
|
|
|
RETURN iSeconds*/
|
|
RETURN GET_GAME_TIMER()
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Fails the mission if the player takes too long to reach Amanda
|
|
PROC FailIfTooLate()
|
|
IF GetTimeInSeconds() > iFailTimer - 1000
|
|
IF IS_PED_UNINJURED(piCop)
|
|
/*IF IS_ENTITY_PLAYING_ANIM(piCop, sMissionAnimDict, sCopAnim)
|
|
STOP_ANIM_TASK(piCop, sMissionAnimDict, sCopAnim)
|
|
ENDIF*/
|
|
CopGetsInCar()
|
|
CopInCarFail()
|
|
ELIF missionState = MS_DRIVE_TO_SHOP
|
|
SetFailReason(MFR_AMANDA_ARRESTED)
|
|
ENDIF
|
|
IF missionState <> MS_RESCUE_AMANDA AND bPlayBeeps
|
|
PLAY_SOUND_FRONTEND(-1, "TIMER_STOP", "HUD_MINI_GAME_SOUNDSET")
|
|
bPlayBeeps = FALSE
|
|
ENDIF
|
|
ELIF missionState <> MS_RESCUE_AMANDA //AND IS_MISSION_TITLE_FINISHED() //NOT (missionState = MS_RESCUE_AMANDA AND GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0)
|
|
iMissionTimer = iFailTimer - GetTimeInSeconds()
|
|
INT iTimeNow = GetTimeInSeconds()
|
|
//DRAW_GENERIC_METER(iMissionTimer, iDriveToShopTime, "TIMER_TIME")
|
|
HIDE_STREET_AND_CAR_NAMES_THIS_FRAME()
|
|
IF iMissionTimer > 11000
|
|
DRAW_GENERIC_TIMER(iMissionTimer, "MEA1_TIME")
|
|
ELIF iMissionTimer > 6000
|
|
DRAW_GENERIC_TIMER(iMissionTimer, "MEA1_TIME", 0, TIMER_STYLE_DONTUSEMILLISECONDS, -1, PODIUMPOS_NONE, HUDORDER_DONTCARE, FALSE, HUD_COLOUR_RED, HUDFLASHING_NONE, 0, FALSE, HUD_COLOUR_PURE_WHITE)
|
|
IF NOT bStartedBeepTimer
|
|
CPRINTLN(DEBUG_MISSION, "BEEP! Once a second")
|
|
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
|
|
iBeepTimer = GetTimeInSeconds()
|
|
bStartedBeepTimer = TRUE
|
|
ELIF iTimeNow-iBeepTimer > 1000
|
|
CPRINTLN(DEBUG_MISSION, "BEEP! Once a second")
|
|
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
|
|
iBeepTimer = GetTimeInSeconds()
|
|
ENDIF
|
|
ELSE
|
|
DRAW_GENERIC_TIMER(iMissionTimer, "MEA1_TIME", 0, TIMER_STYLE_DONTUSEMILLISECONDS, -1, PODIUMPOS_NONE, HUDORDER_DONTCARE, FALSE, HUD_COLOUR_RED, HUDFLASHING_NONE, 0, FALSE, HUD_COLOUR_PURE_WHITE)
|
|
IF iTimeNow-iBeepTimer > 500
|
|
CPRINTLN(DEBUG_MISSION, "BEEP! Twice a second")
|
|
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
|
|
iBeepTimer = GetTimeInSeconds()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Fails the mission if the player trashes the cop car before resuing amanda
|
|
PROC TrashedCopCarFail()
|
|
IF IS_PED_UNINJURED(piAmanda) AND NOT IS_PED_GROUP_MEMBER(piAmanda, PLAYER_GROUP_ID())
|
|
IF IS_VEHICLE_OK(viCopCar)
|
|
//CPRINTLN(DEBUG_MISSION,"Cop car is OK, ready for on roof check")
|
|
IF IS_VEHICLE_STUCK_TIMER_UP(viCopCar, VEH_STUCK_HUNG_UP, HUNG_UP_TIME)
|
|
OR IS_VEHICLE_STUCK_TIMER_UP(viCopCar, VEH_STUCK_JAMMED, JAMMED_TIME)
|
|
OR IS_VEHICLE_STUCK_TIMER_UP(viCopCar, VEH_STUCK_ON_ROOF, ROOF_TIME)
|
|
OR IS_VEHICLE_STUCK_TIMER_UP(viCopCar, VEH_STUCK_ON_SIDE, SIDE_TIME)
|
|
CPRINTLN(DEBUG_MISSION,"Cop car is on roof")
|
|
SetFailReason(MFR_TRASHED_CAR)
|
|
ENDIF
|
|
ELSE
|
|
IF missionState = MS_RESCUE_AMANDA
|
|
SetFailReason(MFR_TRASHED_CAR)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Makes the cop attack and the shopkeeper flee if the player threatens them
|
|
PROC PlayerThreatensPeds()
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND eArrestSceneStage <> ASS_END
|
|
BOOL bPlayerOnlyBumped = FALSE
|
|
IF (IS_PED_UNINJURED(piCop) AND IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), piCop)) OR (IS_PED_UNINJURED(piShopkeeper) AND IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), piShopkeeper))
|
|
AND NOT (HAS_PLAYER_THREATENED_PED(piCop) OR HAS_PLAYER_THREATENED_PED(piShopkeeper) OR IS_PED_SHOOTING(PLAYER_PED_ID())) AND GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0
|
|
IF IS_PED_RAGDOLL(piCop) OR IS_PED_RAGDOLL(piShopkeeper)
|
|
bPlayerOnlyBumped = TRUE
|
|
ELSE
|
|
IF bNotBumpedYet
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
IF CREATE_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_GRIEF", CONV_PRIORITY_MEDIUM, CheckDisplaySubtitles())
|
|
TASK_LOOK_AT_ENTITY(piCop, PLAYER_PED_ID(), 2000, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
|
|
bNotBumpedYet = FALSE
|
|
iBumpTimer = -1
|
|
ENDIF
|
|
ELIF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF CONVERSATION_TIMED_OUT(iBumpTimer, 2000)
|
|
bPlayerOnlyBumped = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF (DOES_ENTITY_EXIST(piCop) AND HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(piCop, PLAYER_PED_ID()))
|
|
OR (DOES_ENTITY_EXIST(piCop) AND IS_PED_INJURED(piCop))
|
|
OR IS_PLAYER_SHOOTING_NEAR_PED(piCop) OR IS_PLAYER_VISIBLY_TARGETTING_PED(piCop) OR IS_PLAYER_VISIBLY_TARGETTING_PED(piShopkeeper)
|
|
OR (DOES_ENTITY_EXIST(piShopkeeper) AND HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(piShopkeeper, PLAYER_PED_ID()))
|
|
OR (DOES_ENTITY_EXIST(piShopkeeper) AND IS_PED_INJURED(piShopkeeper))
|
|
OR IS_PED_SHOOTING(PLAYER_PED_ID()) OR bPlayerOnlyBumped
|
|
OR IS_ANYONE_SHOOTING_NEAR_PED(piShopkeeper) OR IS_PED_SHOOTING(PLAYER_PED_ID())
|
|
// player has aimed at or shot near the cop or shopkeeper
|
|
DISABLE_NAVMESH_IN_AREA(vDisableNavmeshMin, vDisableNavmeshMax, FALSE)
|
|
SET_PED_PATHS_IN_AREA(vDisableNavmeshMin, vDisableNavmeshMax, TRUE)
|
|
// Give the player an appropriate wanted level, make the cop attack and the shopkeeper flee
|
|
IF bPlayerOnlyBumped
|
|
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) < 1
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 1)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 0)
|
|
DISTANT_COP_CAR_SIRENS(TRUE)
|
|
ENDIF
|
|
ELSE
|
|
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) < 2
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 2)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 0)
|
|
DISTANT_COP_CAR_SIRENS(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_PED_UNINJURED(piCop) AND NOT IS_ENTITY_ON_FIRE(piCop) AND NOT IS_PED_GETTING_UP(piCop) AND NOT IS_PED_PRONE(piCop) AND NOT IS_PED_RAGDOLL(piCop)
|
|
/*IF IS_ENTITY_PLAYING_ANIM(piCop, sMissionAnimDict, sCopAnim)
|
|
STOP_ANIM_TASK(piCop, sMissionAnimDict, sCopAnim)
|
|
ENDIF*/
|
|
IF IS_ENTITY_PLAYING_ANIM(piCop, sMissionAnimDict, sCopArrest, ANIM_SYNCED_SCENE)
|
|
OR IS_ENTITY_PLAYING_ANIM(piCop, sMissionAnimDict, sCopPstArrest, ANIM_SYNCED_SCENE)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(piCop, NORMAL_BLEND_OUT, TRUE)
|
|
ENDIF
|
|
IF NOT IS_PED_IN_COMBAT(piCop) AND NOT IsPedPerformingTask(piCop, SCRIPT_TASK_ARREST_PED)
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
SET_PED_CAN_SWITCH_WEAPON(piCop, TRUE)
|
|
GIVE_WEAPON_TO_PED(piCop, WEAPONTYPE_PISTOL, -1)
|
|
IF bPlayerOnlyBumped
|
|
TASK_ARREST_PED(piCop, PLAYER_PED_ID())
|
|
ELSE
|
|
//TASK_COMBAT_PED(piCop, PLAYER_PED_ID())
|
|
TASK_ARREST_PED(piCop, PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
/*ELIF IS_PED_UNINJURED(piShopkeeper)
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
// non-essential dialogue so not in an IF statement
|
|
PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_ATTACK", "MEA1_ATTACK_2", CONV_PRIORITY_MEDIUM)
|
|
ENDIF*/
|
|
ENDIF
|
|
IF IS_PED_UNINJURED(piShopkeeper) AND NOT IS_PED_FLEEING(piShopkeeper)
|
|
IF IS_ENTITY_PLAYING_ANIM(piShopkeeper, sMissionAnimDict, sShopArrest, ANIM_SYNCED_SCENE)
|
|
OR IS_ENTITY_PLAYING_ANIM(piShopkeeper, sMissionAnimDict, sShopPstArrest, ANIM_SYNCED_SCENE)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(piShopkeeper, NORMAL_BLEND_OUT, TRUE)
|
|
ENDIF
|
|
TASK_SMART_FLEE_PED(piShopkeeper, PLAYER_PED_ID(), 500, -1)
|
|
ENDIF
|
|
/*IF DOES_ENTITY_EXIST(oiNotebook)
|
|
DETACH_ENTITY(oiNotebook)
|
|
ENDIF*/
|
|
|
|
eArrestSceneStage = ASS_END
|
|
copChatState = CCS_DONE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Triggers Amanda shouting at Michael when the player is close enough
|
|
PROC PlayNearAmandaConv()
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piAmanda)
|
|
IF iCurrentAmandaLine < NUM_AMANDA_LINES AND GET_GAME_TIMER() > iAmandaLineTimer AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), piAmanda) < fAmandaConvRadius
|
|
//PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(piAmanda, "MEA1_AJAA", "AMANDA", SPEECH_PARAMS_FORCE_FRONTEND)
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(piAmanda, sAmandaLines[iCurrentAmandaLine], "AMANDA", SPEECH_PARAMS_FORCE_FRONTEND)
|
|
iCurrentAmandaLine++
|
|
iAmandaLineTimer = GET_GAME_TIMER() + DRIVING_LINES_TIMEOUT
|
|
//IF bAllowLooking
|
|
/*IF NOT IsPedPerformingTask(piAmanda, SCRIPT_TASK_LOOK_AT_ENTITY)
|
|
TASK_LOOK_AT_ENTITY(piAmanda, PLAYER_PED_ID(), -1, SLF_USE_TORSO)
|
|
//bAllowLooking = FALSE
|
|
ENDIF*/
|
|
ENDIF
|
|
IF NOT IsPedPerformingTask(piAmanda, SCRIPT_TASK_LOOK_AT_ENTITY) AND IS_PED_UNINJURED(piCop) AND IS_PED_IN_ANY_VEHICLE(piAmanda)
|
|
TASK_LOOK_AT_ENTITY(piAmanda, piCop, -1, SLF_USE_TORSO | SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks for the player either getting in the car or grabbing it with a tow truck
|
|
PROC PlayerInCar()
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_VEHICLE_OK(viCopCar) AND IS_PED_UNINJURED(piAmanda)
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), viCopCar) OR IS_PLAYER_TOWING_VEHICLE(viCopCar)
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
//ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
SAFE_REMOVE_BLIP(biObjective)
|
|
//SET_PED_INTO_VEHICLE(piAmanda, viCopCar, VS_FRONT_RIGHT)
|
|
FREEZE_ENTITY_POSITION(viCopCar, FALSE)
|
|
bIsCarFrozen = FALSE
|
|
iConvFailedTimer = -1
|
|
CPRINTLN(DEBUG_MISSION,"Entering rescue amanda state: Active 3")
|
|
REMOVE_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID)
|
|
//PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(piAmanda,"MEA1_BFAA","AMANDA",SPEECH_PARAMS_FORCE_NORMAL)
|
|
missionSubstate = MSS_ACTIVE_TWO
|
|
ELIF IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), viCopCar, 6.5)
|
|
IF bIsCarFrozen
|
|
FREEZE_ENTITY_POSITION(viCopCar, FALSE)
|
|
bIsCarFrozen = FALSE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bIsCarFrozen
|
|
FREEZE_ENTITY_POSITION(viCopCar, TRUE)
|
|
bIsCarFrozen = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC CheckForFreeSeats()
|
|
IF bDisplaySeatObjective AND NOT IS_MESSAGE_BEING_DISPLAYED() AND IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piAmanda)
|
|
VEHICLE_INDEX viCheck
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
viCheck = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
IF IS_VEHICLE_OK(viCheck) AND NOT IS_PED_IN_VEHICLE(piAmanda, viCheck, TRUE) AND NOT DOES_VEHICLE_HAVE_FREE_SEAT(viCheck)
|
|
PRINT_NOW("MEA1_07", DEFAULT_GOD_TEXT_TIME, 1) // Get a different vehicle.
|
|
CHECK_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT_NOW(stateRestoreConversation)
|
|
bDisplaySeatObjective = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Releases the shopkeeper when he's far from the player
|
|
PROC ReleaseShopkeeper()
|
|
IF IS_PED_UNINJURED(piShopkeeper) AND GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), piShopkeeper) > 100
|
|
SAFE_RELEASE_PED(piShopkeeper, FALSE)
|
|
ENDIF
|
|
IF IS_PED_UNINJURED(piCop) AND GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), piCop) > 100
|
|
SAFE_RELEASE_PED(piCop)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Gives the player a wanted level and makes the cop attack
|
|
PROC ActivateCops()
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) < 3
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 3)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 0)
|
|
CPRINTLN(DEBUG_MISSION,"Trying to set player's wanted level, first attempt")
|
|
ENDIF
|
|
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) < 3
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 3)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 0)
|
|
CPRINTLN(DEBUG_MISSION,"Trying to set player's wanted level")
|
|
ELSE
|
|
CPRINTLN(DEBUG_MISSION,"Player is wanted, activating cops")
|
|
DISABLE_NAVMESH_IN_AREA(vDisableNavmeshMin, vDisableNavmeshMax, FALSE)
|
|
SET_PED_PATHS_IN_AREA(vDisableNavmeshMin, vDisableNavmeshMax, TRUE)
|
|
DISTANT_COP_CAR_SIRENS(TRUE)
|
|
IF IS_PED_UNINJURED(piAmanda)
|
|
TASK_CLEAR_LOOK_AT(piAmanda)
|
|
ENDIF
|
|
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(vRoadOffOne, vRoadOffTwo, fRoadOffWidth)
|
|
|
|
bLoadHandcuffSound = TRUE
|
|
bAllowInCarConv = TRUE
|
|
iConvFailedTimer = -1
|
|
|
|
/*IF DOES_ENTITY_EXIST(oiNotebook)
|
|
DETACH_ENTITY(oiNotebook)
|
|
ENDIF*/
|
|
IF IS_PED_UNINJURED(piCop) AND NOT IS_ENTITY_ON_FIRE(piCop) AND NOT IS_PED_GETTING_UP(piCop) AND NOT IS_PED_PRONE(piCop) AND NOT IS_PED_RAGDOLL(piCop)
|
|
IF NOT IsPedPerformingTask(piCop, SCRIPT_TASK_ARREST_PED)
|
|
IF IS_ENTITY_PLAYING_ANIM(piCop, sMissionAnimDict, sCopArrest, ANIM_SYNCED_SCENE)
|
|
OR IS_ENTITY_PLAYING_ANIM(piCop, sMissionAnimDict, sCopPstArrest, ANIM_SYNCED_SCENE)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(piCop, NORMAL_BLEND_OUT, TRUE)
|
|
ENDIF
|
|
SEQUENCE_INDEX siCopStart
|
|
OPEN_SEQUENCE_TASK(siCopStart)
|
|
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), 1500)
|
|
//TASK_COMBAT_PED(NULL, PLAYER_PED_ID())
|
|
TASK_ARREST_PED(NULL, PLAYER_PED_ID())
|
|
CLOSE_SEQUENCE_TASK(siCopStart)
|
|
TASK_PERFORM_SEQUENCE(piCop, siCopStart)
|
|
CLEAR_SEQUENCE_TASK(siCopStart)
|
|
//TASK_TURN_PED_TO_FACE_ENTITY(piCop, PLAYER_PED_ID(), 1500)
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_PED_UNINJURED(piShopkeeper) AND NOT IS_PED_FLEEING(piShopkeeper)
|
|
IF IS_ENTITY_PLAYING_ANIM(piShopkeeper, sMissionAnimDict, sShopArrest, ANIM_SYNCED_SCENE)
|
|
OR IS_ENTITY_PLAYING_ANIM(piShopkeeper, sMissionAnimDict, sShopPstArrest, ANIM_SYNCED_SCENE)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(piShopkeeper, NORMAL_BLEND_OUT, TRUE)
|
|
ENDIF
|
|
TASK_SMART_FLEE_PED(piShopkeeper, PLAYER_PED_ID(), 500, -1)
|
|
ENDIF
|
|
IF IS_AUDIO_SCENE_ACTIVE("M_E_AMANDA_ENTER_COP_CAR")
|
|
STOP_AUDIO_SCENE("M_E_AMANDA_ENTER_COP_CAR")
|
|
ENDIF
|
|
START_AUDIO_SCENE("M_E_AMANDA_ESCAPE_COPS")
|
|
|
|
PLAY_POLICE_REPORT("SCRIPTED_SCANNER_REPORT_MIC_AMANDA_01", 0.0)
|
|
|
|
//eArrestSceneStage = ASS_BREAKOUT
|
|
eArrestSceneStage = ASS_END
|
|
copChatState = CCS_DONE
|
|
missionSubstate = MSS_PREPARE
|
|
missionState = MS_LOSE_COPS
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Triggers the cop if the player alerts him for a reason other than stealing the cop car or directly threatening the cop or shopkeeper
|
|
/// PARAMS:
|
|
/// bCopAttacks - Should the cop attack? If this is false, the cop will attempt to arrest the player
|
|
PROC MinorCopAlert(BOOL bCopAttacks = TRUE)
|
|
IF IS_PED_UNINJURED(piCop) AND IS_PED_UNINJURED(PLAYER_PED_ID()) AND NOT IS_ENTITY_ON_FIRE(piCop) AND NOT IS_PED_GETTING_UP(piCop) AND NOT IS_PED_PRONE(piCop) AND NOT IS_PED_RAGDOLL(piCop)
|
|
/*IF DOES_ENTITY_EXIST(oiNotebook)
|
|
DETACH_ENTITY(oiNotebook)
|
|
ENDIF*/
|
|
IF NOT (GET_PEDS_CURRENT_WEAPON(piCop) = WEAPONTYPE_PISTOL)
|
|
SET_PED_CAN_SWITCH_WEAPON(piCop, TRUE)
|
|
GIVE_WEAPON_TO_PED(piCop, WEAPONTYPE_PISTOL, -1)
|
|
ENDIF
|
|
IF bCopAttacks
|
|
IF NOT IS_PED_IN_COMBAT(piCop)
|
|
//TASK_COMBAT_PED(piCop, PLAYER_PED_ID())
|
|
TASK_ARREST_PED(piCop, PLAYER_PED_ID())
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IsPedPerformingTask(piCop, SCRIPT_TASK_ARREST_PED)
|
|
TASK_ARREST_PED(piCop, PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_PED_UNINJURED(piShopkeeper) AND NOT IS_PED_FLEEING(piShopkeeper) AND NOT IS_PED_IN_COMBAT(piShopkeeper)
|
|
IF IS_ENTITY_PLAYING_ANIM(piShopkeeper, sMissionAnimDict, sShopArrest, ANIM_SYNCED_SCENE)
|
|
OR IS_ENTITY_PLAYING_ANIM(piShopkeeper, sMissionAnimDict, sShopPstArrest, ANIM_SYNCED_SCENE)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(piShopkeeper, NORMAL_BLEND_OUT, TRUE)
|
|
ENDIF
|
|
TASK_SMART_FLEE_PED(piShopkeeper, PLAYER_PED_ID(), 500, -1)
|
|
ENDIF
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
eArrestSceneStage = ASS_END
|
|
copChatState = CCS_DONE
|
|
//bAllowSceneConv = FALSE
|
|
DISABLE_NAVMESH_IN_AREA(vDisableNavmeshMin, vDisableNavmeshMax, FALSE)
|
|
SET_PED_PATHS_IN_AREA(vDisableNavmeshMin, vDisableNavmeshMax, TRUE)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Makes the shopkeeper flee if he's threatened
|
|
PROC MakeShopkeeperFlee()
|
|
IF IS_PED_UNINJURED(piShopkeeper) AND NOT IsPedPerformingTask(piShopkeeper, SCRIPT_TASK_SMART_FLEE_PED)
|
|
IF IS_ANYONE_SHOOTING_NEAR_PED(piShopkeeper) OR IS_PED_SHOOTING(PLAYER_PED_ID()) OR (IS_PED_UNINJURED(piCop) AND IS_PED_SHOOTING(piCop))
|
|
IF IS_ENTITY_PLAYING_ANIM(piShopkeeper, sMissionAnimDict, sShopArrest, ANIM_SYNCED_SCENE)
|
|
OR IS_ENTITY_PLAYING_ANIM(piShopkeeper, sMissionAnimDict, sShopPstArrest, ANIM_SYNCED_SCENE)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(piShopkeeper, NORMAL_BLEND_OUT, TRUE)
|
|
ENDIF
|
|
TASK_SMART_FLEE_PED(piShopkeeper, PLAYER_PED_ID(), 500, -1)
|
|
MinorCopAlert()
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Gives the cop a pistol
|
|
PROC GiveWeaponToCop()
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piCop) AND NOT IS_ENTITY_ON_FIRE(piCop) AND NOT IS_PED_GETTING_UP(piCop) AND NOT IS_PED_PRONE(piCop) AND NOT IS_PED_RAGDOLL(piCop)
|
|
IF GET_GAME_TIMER() > iCopGunTimer
|
|
IF NOT (GET_PEDS_CURRENT_WEAPON(piCop) = WEAPONTYPE_PISTOL)
|
|
SET_PED_CAN_SWITCH_WEAPON(piCop, TRUE)
|
|
GIVE_WEAPON_TO_PED(piCop, WEAPONTYPE_PISTOL, -1)
|
|
ENDIF
|
|
IF NOT IS_PED_IN_COMBAT(piCop)
|
|
CLEAR_PED_TASKS(piCop)
|
|
//TASK_COMBAT_PED(piCop, PLAYER_PED_ID())
|
|
TASK_ARREST_PED(piCop, PLAYER_PED_ID())
|
|
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) < 3
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 3)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Adds Amanda to the player's group, sets her so that she can't be targetted, even after the mission finishes
|
|
PROC AddAmandaToPlayerGroup()
|
|
SET_PED_AS_GROUP_MEMBER(piAmanda, PLAYER_GROUP_ID())
|
|
SET_PED_GROUP_MEMBER_PASSENGER_INDEX(piAmanda, VS_FRONT_RIGHT)
|
|
SET_PED_NEVER_LEAVES_GROUP(piAmanda, TRUE)
|
|
SET_PED_CAN_BE_TARGETTED(piAmanda, FALSE)
|
|
//SET_PED_DIES_INSTANTLY_IN_WATER(piAmanda, FALSE)
|
|
SET_PED_DIES_IN_WATER(piAmanda, FALSE)
|
|
SET_PED_DIES_IN_SINKING_VEHICLE(piAmanda, FALSE)
|
|
DISTANT_COP_CAR_SIRENS(FALSE)
|
|
ENDPROC
|
|
|
|
PROC ForceAmandaIntoGroupIfInterruptedSyncScene()
|
|
IF bForceAmandaIntoGroup
|
|
IF IS_PED_GROUP_MEMBER(piAmanda, PLAYER_GROUP_ID())
|
|
bForceAmandaIntoGroup = FALSE
|
|
ELSE
|
|
AddAmandaToPlayerGroup()
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC PlayerInterruptsSyncedScene()
|
|
VEHICLE_INDEX viPlayer = GET_PLAYERS_LAST_VEHICLE()
|
|
IF IS_PED_INJURED(piCop) OR IS_PED_INJURED(piShopkeeper) OR HAS_PLAYER_THREATENED_PED(piCop) OR HAS_PLAYER_THREATENED_PED(piShopkeeper)
|
|
//OR (IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_VEHICLE_OK(viCopCar) AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), viCopCar))
|
|
OR (IS_VEHICLE_OK(viPlayer) AND IS_VEHICLE_OK(viCopCar) AND IS_ENTITY_TOUCHING_ENTITY(viPlayer, viCopCar))
|
|
OR (GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0 AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vShopLocation) < fBlipAmandaDist)
|
|
IF NOT IS_PED_IN_VEHICLE(piAmanda, viCopCar)
|
|
IF NOT IS_PED_GROUP_MEMBER(piAmanda, PLAYER_GROUP_ID())
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
eArrestSceneStage = ASS_END
|
|
copChatState = CCS_DONE
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iArrestScene)
|
|
FLOAT fPhase = GET_SYNCHRONIZED_SCENE_PHASE(iArrestScene)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(piAmanda, INSTANT_BLEND_OUT, TRUE)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(viCopCar, INSTANT_BLEND_OUT, TRUE)
|
|
IF fPhase > 0.75
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(piAmanda, INSTANT_BLEND_OUT, FALSE)
|
|
SAFE_SET_PED_INTO_VEHICLE(piAmanda, viCopCar, VS_BACK_RIGHT)
|
|
ELSE
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(piAmanda, INSTANT_BLEND_OUT, TRUE)
|
|
SET_ENTITY_COLLISION(piAmanda, TRUE)
|
|
ENDIF
|
|
IF IS_PED_UNINJURED(piCop)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(piCop, INSTANT_BLEND_OUT, TRUE)
|
|
ENDIF
|
|
IF IS_PED_UNINJURED(piShopkeeper)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(piShopkeeper, INSTANT_BLEND_OUT, TRUE)
|
|
ENDIF
|
|
//SET_SYNCHRONIZED_SCENE_PHASE(iArrestScene, 1.0)
|
|
ENDIF
|
|
FREEZE_ENTITY_POSITION(piAmanda, FALSE)
|
|
FREEZE_ENTITY_POSITION(viCopCar, FALSE)
|
|
IF IS_VEHICLE_OK(viPlayer) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), viPlayer) AND IS_VEHICLE_SEAT_FREE(viPlayer, VS_FRONT_RIGHT)
|
|
IF NOT IsPedPerformingTask(piAmanda, SCRIPT_TASK_ENTER_VEHICLE)
|
|
TASK_ENTER_VEHICLE(piAmanda, viPlayer, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT, PEDMOVE_SPRINT)
|
|
ENDIF
|
|
ELIF GET_DISTANCE_BETWEEN_PEDS(piAmanda, PLAYER_PED_ID()) > 10
|
|
IF NOT IsPedPerformingTask(piAmanda, SCRIPT_TASK_GO_TO_ENTITY)
|
|
TASK_GO_TO_ENTITY(piAmanda, PLAYER_PED_ID(), DEFAULT_TIME_BEFORE_WARP, 7.0)
|
|
ENDIF
|
|
ELSE
|
|
CLEAR_PED_TASKS(piAmanda)
|
|
ENDIF
|
|
AddAmandaToPlayerGroup()
|
|
SAFE_REMOVE_BLIP(biObjective)
|
|
//biObjective = CREATE_PED_BLIP(piAmanda, TRUE, TRUE)
|
|
bForceAmandaIntoGroup = TRUE
|
|
/*missionSubstate = MSS_ACTIVE_ONE
|
|
missionState = MS_RETURN_TO_AMANDA*/
|
|
ENDIF
|
|
ActivateCops()
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if Amanda has been freed, adds her to the player's group if necessary
|
|
/// RETURNS:
|
|
/// TRUE if Amanda has been freed
|
|
FUNC BOOL AmandaReleased()
|
|
IF IS_PED_UNINJURED(piAmanda)
|
|
CPRINTLN(DEBUG_MISSION,"Checking Amanda released")
|
|
IF IS_PED_GROUP_MEMBER(piAmanda, PLAYER_GROUP_ID())
|
|
CPRINTLN(DEBUG_MISSION,"Amanda is in the player's group, returning true")
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
RETURN TRUE
|
|
ELSE // Need to create one of the "Lost cops" conversations here
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
CPRINTLN(DEBUG_MISSION,"Amanda is not in the player's group, adding her and doing other stuff")
|
|
IF IS_PLAYER_TOWING_VEHICLE(viCopCar)
|
|
RETURN TRUE
|
|
ELIF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), viCopCar)
|
|
AND IS_PED_IN_VEHICLE(piAmanda, viCopCar)
|
|
|
|
if CREATE_MULTIPART_CONVERSATION_WITH_4_LINES(pedConvStruct, "MEA1AUD", "MEA1_LOSTCOP", "MEA1_LOSTCOP_1", "MEA1_LOSTCOP", "MEA1_LOSTCOP_2", "MEA1_LOSTCOP", "MEA1_LOSTCOP_3", "MEA1_LOSTCOP", "MEA1_LOSTCOP_4", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
|
|
OR CONVERSATION_TIMED_OUT(iConvFailedTimer)
|
|
AddAmandaToPlayerGroup()
|
|
SEQUENCE_INDEX siLook
|
|
OPEN_SEQUENCE_TASK(siLook)
|
|
TASK_LOOK_AT_COORD(NULL, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(viCopCar, <<2, 2, 0>>), 2000, SLF_FAST_TURN_RATE | SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
|
|
TASK_PAUSE(NULL, 1000)
|
|
TASK_LOOK_AT_COORD(NULL, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(viCopCar, <<-2, 2, 0>>), 2000, SLF_FAST_TURN_RATE | SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
|
|
TASK_PAUSE(NULL, 1000)
|
|
TASK_LOOK_AT_COORD(NULL, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(viCopCar, <<2, 2, 0>>), 2000, SLF_FAST_TURN_RATE | SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
|
|
TASK_PAUSE(NULL, 1000)
|
|
TASK_LOOK_AT_COORD(NULL, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(viCopCar, <<-2, 2, 0>>), 2000, SLF_FAST_TURN_RATE | SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
|
|
CLOSE_SEQUENCE_TASK(siLook)
|
|
TASK_PERFORM_SEQUENCE(piAmanda, siLook)
|
|
CLEAR_SEQUENCE_TASK(siLook)
|
|
iHandCuffTimer = GET_GAME_TIMER() + 9000
|
|
bHandcuffSoundReady = TRUE
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
AddAmandaToPlayerGroup()
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// The player has returned to Amanda after leaving her, put the mission back to the appropriate stage
|
|
PROC BackWithAmanda()
|
|
CLEAR_THIS_PRINT("MEA1_05") // Return to ~b~Amanda.
|
|
missionSubstate = MSS_PREPARE
|
|
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID()) // Clear now - ped damage events can occur before you start checking for them B*1178888
|
|
IF (GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0)
|
|
missionState = MS_DRIVE_HOME
|
|
ELSE
|
|
missionState = MS_LOSE_COPS
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if it's OK to play non-essential dialogue without it overriding god text
|
|
/// RETURNS:
|
|
/// TRUE if there's no god text or if the player isn't using subtitles
|
|
FUNC BOOL IsOkToPlayDialogue()
|
|
IF NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if Michael and Amanda are in the same vehicle
|
|
/// RETURNS:
|
|
/// True if they are in the same vehicle, false otherwise
|
|
FUNC BOOL MichaelAndAmandaInSameVehicle()
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
VEHICLE_INDEX viTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
IF IS_VEHICLE_OK(viTemp) AND IS_PED_IN_VEHICLE(piAmanda, viTemp)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if Michael and Amanda are on foot
|
|
/// RETURNS:
|
|
/// True if they are both on foot, false otherwise
|
|
FUNC BOOL MichaelAndAmandaOnFoot()
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) OR IS_PED_IN_ANY_VEHICLE(piAmanda)
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
PROC ManageGriefingLines()
|
|
IF IS_VEHICLE_OK(viCopCar) AND IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piCop) AND IS_PED_UNINJURED(piShopkeeper)
|
|
SWITCH eGriefState
|
|
CASE GCS_READY
|
|
//CPRINTLN(DEBUG_MISSION,"eGriefState = GCS_READY")
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
TEXT_LABEL_23 tlConv
|
|
tlConv = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
|
|
STRING sConv
|
|
sConv = CONVERT_TEXT_LABEL_TO_STRING(tlConv)
|
|
IF ARE_STRINGS_EQUAL(sConv, "MEA1_SCENE")
|
|
/*INT iCurrentLine
|
|
iCurrentLine = GET_CURRENT_SCRIPTED_CONVERSATION_LINE()*/
|
|
sSceneConvLine = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL()
|
|
//CPRINTLN(DEBUG_MISSION,"Current iCurrentLine: ", sSceneConvLine)
|
|
IF (IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), viCopCar, 5.0) OR IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), piCop, 5.0))
|
|
// Don't interrupt the first three lines or they'll be out of sync with Amanda getting in the car
|
|
AND NOT ARE_STRINGS_EQUAL(sSceneConvLine, "MEA1_SCENE_1") AND NOT ARE_STRINGS_EQUAL(sSceneConvLine, "MEA1_SCENE_2") AND NOT ARE_STRINGS_EQUAL(sSceneConvLine, "MEA1_SCENE_3")
|
|
AND NOT ARE_STRINGS_EQUAL(sSceneConvLine, "MEA1_SCENE_4") AND NOT ARE_STRINGS_EQUAL(sSceneConvLine, "MEA1_SCENE_5") AND NOT ARE_STRINGS_EQUAL(sSceneConvLine, "MEA1_SCENE_6")
|
|
AND CAN_PED_SEE_PLAYER(piCop)
|
|
IF GET_GAME_TIMER() > iGriefingTimer
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
/*IF iCurrentLine > 0
|
|
iSceneConvLine += iCurrentLine
|
|
ENDIF*/
|
|
eGriefState = GCS_PLAYING
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE GCS_PLAYING
|
|
//CPRINTLN(DEBUG_MISSION,"eGriefState = GCS_PLAYING")
|
|
FLOAT fCopDist
|
|
fCopDist = GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), piCop)
|
|
FLOAT fCarDist
|
|
fCarDist = GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), viCopCar)
|
|
BOOL bConvPlayed
|
|
bConvPlayed = FALSE
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
IF fCopDist < fCarDist
|
|
bConvPlayed = CREATE_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_GRIEF", CONV_PRIORITY_MEDIUM, CheckDisplaySubtitles())
|
|
ELSE
|
|
bConvPlayed = CREATE_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_MESS", CONV_PRIORITY_MEDIUM, CheckDisplaySubtitles())
|
|
ENDIF
|
|
IF bConvPlayed
|
|
TASK_LOOK_AT_ENTITY(piCop, PLAYER_PED_ID(), 2000, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
|
|
eGriefState = GCS_FINISH
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE GCS_FINISH
|
|
//CPRINTLN(DEBUG_MISSION,"eGriefState = GCS_FINISH")
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
//IF iSceneConvLine > -1 AND iSceneConvLine < NUM_SCENE_LINES
|
|
IF NOT ARE_STRINGS_EQUAL(sSceneConvLine, "") AND NOT ARE_STRINGS_EQUAL(sSceneConvLine, "NULL")
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(pedConvStruct, "MEA1AUD", "MEA1_SCENE", sSceneConvLine, CONV_PRIORITY_MEDIUM, CheckDisplaySubtitles())
|
|
iGriefingTimer = GET_GAME_TIMER() + GRIEFING_TIME
|
|
//bAllowSceneConv = FALSE
|
|
eGriefState = GCS_READY
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
//CPRINTLN(DEBUG_MISSION,"Current iSceneConvLine: ", iSceneConvLine)
|
|
ENDPROC
|
|
|
|
PROC ManagePlayerDamagesCopCarLines()
|
|
IF GET_GAME_TIMER() > iCopCarDamageTimer
|
|
//IF DOES_ENTITY_EXIST(viCopCar) AND IS_PED_UNINJURED(piAmanda) //AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piAmanda) AND IS_PED_IN_ANY_VEHICLE(piAmanda) AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), piAmanda) < 10
|
|
VEHICLE_INDEX viAmanda = GET_VEHICLE_PED_IS_IN(piAmanda)
|
|
IF IS_VEHICLE_OK(viAmanda) AND NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), viAmanda)
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(viAmanda, PLAYER_PED_ID())
|
|
REMOVE_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID)
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(piAmanda, "GENERIC_FRIGHTENED_HIGH", "AMANDA_NORMAL", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
CPRINTLN(DEBUG_MISSION,"Player damaged the cop car, Amanda should be speaking")
|
|
iCopCarDamageTimer = GET_GAME_TIMER() + 5000
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(viCopCar)
|
|
ENDIF
|
|
ELIF IS_ENTITY_ON_FIRE(viAmanda)
|
|
REMOVE_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID)
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(piAmanda, "GENERIC_FRIGHTENED_HIGH", "AMANDA_NORMAL", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
CPRINTLN(DEBUG_MISSION,"Cop car is on fire, Amanda should be speaking")
|
|
iCopCarDamageTimer = GET_GAME_TIMER() + 5000
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC TriggerHandcuffSound()
|
|
IF bHandcuffSoundReady
|
|
CPRINTLN(DEBUG_MISSION,"Allowed to play handcuff sound")
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
CPRINTLN(DEBUG_MISSION,"Conversation playing: ")
|
|
IF GET_GAME_TIMER() > iHandCuffTimer
|
|
CPRINTLN(DEBUG_MISSION,"Starting handcuff noise")
|
|
PLAY_SOUND_FROM_ENTITY(iHandcuffSound, "MICHAEL_EVENT_AMANDA_REMOVE_HANDCUFFS_MASTER", piAmanda)
|
|
bHandcuffSoundReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Triggers conversations between the player and Amanda
|
|
PROC ManageDriveConversations()
|
|
IF iCurrentDriveConv < NUM_DRIVE_CONVS AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND IsOkToPlayDialogue()
|
|
AND (MichaelAndAmandaInSameVehicle() OR MichaelAndAmandaOnFoot())
|
|
AND IS_PED_GROUP_MEMBER(piAmanda, PLAYER_GROUP_ID())
|
|
IF iPreviousDriveConv = iCurrentDriveConv
|
|
iCurrentDriveConv++
|
|
iConversationTimer = GET_GAME_TIMER() + iDriveConvTimer
|
|
ELSE
|
|
IF GET_GAME_TIMER() > iConversationTimer
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
IF CREATE_CONVERSATION(pedConvStruct, "MEA1AUD", sDriveConvs[iCurrentDriveConv], CONV_PRIORITY_MEDIUM)
|
|
iPreviousDriveConv = iCurrentDriveConv
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Triggers Amanda's responses to the player crashing their car
|
|
PROC ManageCrashLines()
|
|
IF iCurrentCrashLine < NUM_CRASH_LINES AND GET_GAME_TIMER() > iCrashLineTimer AND IsOkToPlayDialogue() AND MichaelAndAmandaInSameVehicle()
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND NOT IS_PED_STOPPED(PLAYER_PED_ID())
|
|
VEHICLE_INDEX viTemp
|
|
viTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
IF IS_VEHICLE_OK(viTemp)
|
|
IF HAS_ENTITY_COLLIDED_WITH_ANYTHING(viTemp)
|
|
//KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF (iCurrentCrashLine = 0 AND IS_VEHICLE_OK(viCopCar) AND IS_PED_IN_VEHICLE(piAmanda, viCopCar) AND GET_SEAT_PED_IS_IN(piAmanda) = VS_BACK_RIGHT) // Prevent the "Hello. No seatbelt!" line playing if not in the back of the original cop car - B*1491664
|
|
OR ((iCurrentCrashLine = 1 OR iCurrentCrashLine = 2) AND IS_PED_IN_ANY_VEHICLE(piAmanda) AND (GET_SEAT_PED_IS_IN(piAmanda) = VS_BACK_RIGHT OR GET_SEAT_PED_IS_IN(piAmanda) = VS_BACK_LEFT))
|
|
OR (iCurrentCrashLine = 3 AND IS_PED_IN_ANY_POLICE_VEHICLE(PLAYER_PED_ID())) // Prevent the "You cannot wreck this cop car. You cannot." line playing if not in a cop car - B*1231582
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_CRASH", sCrashLines[iCurrentCrashLine], CONV_PRIORITY_MEDIUM)
|
|
iCurrentCrashLine++
|
|
iCrashLineTimer = GET_GAME_TIMER() + DRIVING_LINES_TIMEOUT
|
|
ENDIF
|
|
ELSE
|
|
iCurrentCrashLine++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Triggers Amanda's responses to the player committing crimes
|
|
//PROC ManageCrimeLines()
|
|
// IF iCurrentCrimeLine < NUM_CRIME_LINES AND GET_GAME_TIMER() > iCrimeLineTimer AND IsOkToPlayDialogue()
|
|
// AND (MichaelAndAmandaInSameVehicle() OR MichaelAndAmandaOnFoot())
|
|
// IF IS_PED_SHOOTING(PLAYER_PED_ID()) OR HAS_PLAYER_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
|
|
// KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
// IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
// // IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_CRIME", sCrimeLines[iCurrentCrimeLine], CONV_PRIORITY_MEDIUM)
|
|
// CPRINTLN(DEBUG_MISSION, "ManageCrimeLines: Triggered crime line", iCurrentCrimeLine)
|
|
// iCurrentCrimeLine++
|
|
// iCrimeLineTimer = GET_GAME_TIMER() + DRIVING_LINES_TIMEOUT
|
|
// CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
|
|
// // ENDIF
|
|
// ENDIF
|
|
// ENDIF
|
|
// ENDIF
|
|
//ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Triggers Amanda's responses to the player not moving
|
|
PROC ManageStationaryLines()
|
|
IF iCurrentStillLine < NUM_STILL_LINES AND GET_GAME_TIMER() > iStillLineTimer AND IsOkToPlayDialogue()
|
|
AND MichaelAndAmandaInSameVehicle() //OR MichaelAndAmandaOnFoot())
|
|
IF IS_PED_STOPPED(PLAYER_PED_ID())
|
|
// check stopped timer, do line if too long
|
|
iStillTime++
|
|
IF iStillTime > iStillTimeout //AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), vOutsideGatePos1, vOutsideGatePos2, fOutsideGateWidth)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_THIS_PRINT_BEING_DISPLAYED("MEA1_04") // Go ~y~home.
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
IF iCurrentStillLine = 2 AND NOT MichaelAndAmandaInSameVehicle()
|
|
iCurrentStillLine++
|
|
ELIF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_STILL", sStillLines[iCurrentStillLine], CONV_PRIORITY_MEDIUM)
|
|
iCurrentStillLine++
|
|
iStillTime = 0
|
|
iStillLineTimer = GET_GAME_TIMER() + DRIVING_LINES_TIMEOUT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iStillTime = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Amanda whines if Michael gets out of the cop car while she's still cuffed - B*1077704
|
|
PROC ManageAbandonLines()
|
|
// If Amanda is still in cop car and the home objective hasn't been shown, Amanda is still cuffed
|
|
IF IS_ENTITY_ALIVE(viCopCar) AND IS_PED_UNINJURED(piAmanda) AND IS_PED_IN_VEHICLE(piAmanda, viCopCar) //bShowHomeObjective = FALSE
|
|
AND GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), piAmanda) < 10
|
|
IF GET_GAME_TIMER() > iAbandonLineTimer
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED("MEA1_03") // Lose the cops
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("MEA1_05") // Return to Amanda
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("MEA1_06") // Get back in the cop car
|
|
IF CREATE_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_HELP", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
|
|
CPRINTLN(DEBUG_MISSION, "Playing Amanda abandon complaint")
|
|
iAbandonLineTimer = GET_GAME_TIMER() + DRIVING_LINES_TIMEOUT
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_HELP", CONV_PRIORITY_MEDIUM)
|
|
CPRINTLN(DEBUG_MISSION, "Playing Amanda abandon complaint")
|
|
iAbandonLineTimer = GET_GAME_TIMER() + DRIVING_LINES_TIMEOUT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Triggers Amanda's responses to the player turning on the cop siren
|
|
PROC ManageSirenLines()
|
|
IF iCurrentSirenLine < NUM_SIREN_LINES AND GET_GAME_TIMER() > iSirenLineTimer AND IsOkToPlayDialogue() AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
AND MichaelAndAmandaInSameVehicle()
|
|
VEHICLE_INDEX viPlayer = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
IF IS_VEHICLE_OK(viPlayer) AND IS_MODEL_POLICE_VEHICLE(GET_ENTITY_MODEL(viPlayer))
|
|
bIsSirenOn = IS_VEHICLE_SIREN_ON(viPlayer)
|
|
IF bIsSirenOn
|
|
// Player has just turned on the siren, play dialogue
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND bWasSirenOn = FALSE
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_SIREN", sSirenLines[iCurrentSirenLine], CONV_PRIORITY_MEDIUM)
|
|
iCurrentSirenLine++
|
|
bWasSirenOn = bIsSirenOn
|
|
iSirenLineTimer = GET_GAME_TIMER() + DRIVING_LINES_TIMEOUT
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
bWasSirenOn = bIsSirenOn
|
|
ENDIF
|
|
ENDIF
|
|
ELIF bWasSirenOn AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
VEHICLE_INDEX viPlayer = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
IF IS_VEHICLE_OK(viPlayer) AND IS_MODEL_POLICE_VEHICLE(GET_ENTITY_MODEL(viPlayer))
|
|
bWasSirenOn = IS_VEHICLE_SIREN_ON(viPlayer)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Triggers Amanda telling the player to lose the cops
|
|
PROC ManageLoseCopLines()
|
|
IF iCurrentLoseCopLine < NUM_LOSECOP_LINES AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND IsOkToPlayDialogue()
|
|
AND MichaelAndAmandaInSameVehicle() //OR MichaelAndAmandaOnFoot())
|
|
//AND IS_PED_GROUP_MEMBER(piAmanda, PLAYER_GROUP_ID())
|
|
AND GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
|
|
AND NOT IS_CHAR_ALMOST_STOPPED(PLAYER_PED_ID())
|
|
IF GET_GAME_TIMER() > iLoseCopsTimer
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
iSelectedReply = GET_RANDOM_INT_IN_RANGE(0, NUM_LOSECOP_REPLY)
|
|
IF iSelectedReply = iPreviousReply
|
|
iSelectedReply++
|
|
IF iSelectedReply >= NUM_LOSECOP_REPLY
|
|
iSelectedReply = 0
|
|
ENDIF
|
|
ENDIF
|
|
//IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_LOSEGEN", sLoseCopLines[iCurrentLoseCopLine], CONV_PRIORITY_MEDIUM)
|
|
IF CREATE_MULTIPART_CONVERSATION_WITH_2_LINES(pedConvStruct, "MEA1AUD", "MEA1_LOSEGEN", sLoseCopLines[iCurrentLoseCopLine], "MEA1_GOTTHIS", sLoseCopReply[iSelectedReply], CONV_PRIORITY_MEDIUM)
|
|
iLoseCopsTimer = GET_GAME_TIMER() + DRIVING_LINES_TIMEOUT
|
|
iCurrentLoseCopLine++
|
|
iPreviousReply = iSelectedReply
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Triggers Amanda complaining that the player hasn't gone home
|
|
PROC ManageNotAtHomeLines()
|
|
IF iCurrentNotHomeLine < NUM_NOT_HOME_LINES AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND IsOkToPlayDialogue()
|
|
AND MichaelAndAmandaInSameVehicle() //OR MichaelAndAmandaOnFoot())
|
|
AND IS_PED_GROUP_MEMBER(piAmanda, PLAYER_GROUP_ID())
|
|
//AND GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
|
|
IF GET_GAME_TIMER() > iNotHomeTimer
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_NOHOME", sNotHomeLines[iCurrentNotHomeLine], CONV_PRIORITY_MEDIUM)
|
|
iNotHomeTimer = GET_GAME_TIMER() + (iStartLinesTimer*2)
|
|
iCurrentNotHomeLine++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Gets the player's current car and adds it to the upside down check
|
|
PROC GetCurrentPlayersCar()
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND GET_GAME_TIMER() > iCheckVehicleTimer
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
VEHICLE_INDEX viNewVehicle = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
IF viNewVehicle <> viPlayersVehicle
|
|
IF viNewVehicle = viCopCar
|
|
viPlayersVehicle = viNewVehicle
|
|
ELSE
|
|
IF IS_VEHICLE_OK(viPlayersVehicle)
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(viPlayersVehicle)
|
|
ENDIF
|
|
viPlayersVehicle = viNewVehicle
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
iCheckVehicleTimer = GET_GAME_TIMER() + iCheckVehicle
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Triggers Amanda's responses to the player getting their car stuck on its roof
|
|
PROC PlayUpsideDownLine()
|
|
IF iCurrentRoofLine < NUM_ROOF_LINES AND IS_VEHICLE_OK(viPlayersVehicle) AND IsOkToPlayDialogue()
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), viPlayersVehicle) AND IS_PED_IN_VEHICLE(piAmanda, viPlayersVehicle)
|
|
IF IS_VEHICLE_STUCK_TIMER_UP(viPlayersVehicle, VEH_STUCK_HUNG_UP, iRoofTime)
|
|
OR IS_VEHICLE_STUCK_TIMER_UP(viPlayersVehicle, VEH_STUCK_JAMMED, iRoofTime)
|
|
OR IS_VEHICLE_STUCK_TIMER_UP(viPlayersVehicle, VEH_STUCK_ON_ROOF, iRoofTime)
|
|
OR IS_VEHICLE_STUCK_TIMER_UP(viPlayersVehicle, VEH_STUCK_ON_SIDE, iRoofTime)
|
|
IF iPreviousRoofLine = iCurrentRoofLine
|
|
iCurrentRoofLine++
|
|
iRoofConvTimer = GET_GAME_TIMER() + iRoofTime
|
|
ELSE
|
|
IF GET_GAME_TIMER() > iRoofConvTimer AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
// play upside down dialogue line here
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_ROOF", sRoofLines[iCurrentRoofLine], CONV_PRIORITY_MEDIUM)
|
|
iPreviousRoofLine = iCurrentRoofLine
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Pick a sensible spawnpoint near to where the CP coords got set
|
|
/// PARAMS:
|
|
/// vCoords - Current checkpoint spawn vector, will be reset to one of the presets
|
|
/// fHeading - Current spawn heading, will be reset to one of the presets
|
|
PROC GET_NEAREST_PRESET_SPAWN_TO_CP(VECTOR &vCoords, FLOAT &fHeading)
|
|
|
|
// Set up possible spawn coords/heading
|
|
VECTOR vSpawnCoords[4]
|
|
FLOAT fSpawnHead[4]
|
|
vSpawnCoords[0] = << -713.50, -174.48, 36.50 >>
|
|
fSpawnHead[0] = 28.96
|
|
vSpawnCoords[1] = << -645.00, -47.36, 40.22 >>
|
|
fSpawnHead[1] = 98.09
|
|
vSpawnCoords[2] = << -531.74, -270.68, 34.83 >>
|
|
fSpawnHead[2] = 111.76
|
|
vSpawnCoords[3] = << -183.39, -58.87, 51.45 >>
|
|
fSpawnHead[3] = 71.13
|
|
|
|
// Index for best match found so far
|
|
INT iBestMatch = 0
|
|
INT iCount = 1
|
|
WHILE iCount < 4
|
|
// Compare distances for current 'best' and next in list (actually comparing the squares but amounts to the same thing)
|
|
IF VDIST2(vSpawnCoords[iCount], vCoords) < VDIST2(vSpawnCoords[iBestMatch], vCoords)
|
|
iBestMatch = iCount
|
|
ENDIF
|
|
iCount++
|
|
ENDWHILE
|
|
|
|
// Set the passed in variables to be the best match found
|
|
vCoords = vSpawnCoords[iBestMatch]
|
|
fHeading = fSpawnHead[iBestMatch]
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if the shop scene models have loaded
|
|
/// PARAMS:
|
|
/// iTimer - timer to continue the mission if models have failed to load after one second
|
|
/// RETURNS:
|
|
/// TRUE when all models have loaded or one second has passed
|
|
FUNC BOOL AreSceneModelsLoaded(INT & iTimer)
|
|
IF iTimer < 0
|
|
iTimer = GET_GAME_TIMER() + 2000
|
|
ELIF GET_GAME_TIMER() > iTimer
|
|
RETURN TRUE
|
|
ENDIF
|
|
IF NOT HAS_MODEL_LOADED(mnCopCar)
|
|
RETURN FALSE
|
|
ENDIF
|
|
IF NOT HAS_MODEL_LOADED(mnCop)
|
|
RETURN FALSE
|
|
ENDIF
|
|
IF NOT HAS_MODEL_LOADED(GET_NPC_PED_MODEL(CHAR_AMANDA))
|
|
RETURN FALSE
|
|
ENDIF
|
|
IF NOT HAS_MODEL_LOADED(mnShopkeeper)
|
|
RETURN FALSE
|
|
ENDIF
|
|
/*IF NOT HAS_MODEL_LOADED(mnNotebook)
|
|
RETURN FALSE
|
|
ENDIF*/
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if the shop scene entities have been created
|
|
/// PARAMS:
|
|
/// iTimer - timer to continue the mission if models have failed to load after one second
|
|
/// RETURNS:
|
|
/// TRUE when they've all been created or if one second has passed
|
|
FUNC BOOL DoSceneEntitiesExist(INT & iTimer)
|
|
IF iTimer < 0
|
|
iTimer = GET_GAME_TIMER() + 2000
|
|
ELIF GET_GAME_TIMER() > iTimer
|
|
RETURN TRUE
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(viCopCar)
|
|
RETURN FALSE
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(piCop)
|
|
RETURN FALSE
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(piAmanda)
|
|
RETURN FALSE
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(piShopkeeper)
|
|
RETURN FALSE
|
|
ENDIF
|
|
/*IF NOT DOES_ENTITY_EXIST(oiNotebook)
|
|
RETURN FALSE
|
|
ENDIF*/
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Loads the models and spawns the shop scene while faded out
|
|
PROC DebugSpawnShopScene()
|
|
INT iTimer = -1
|
|
LoadSceneModels()
|
|
WHILE NOT AreSceneModelsLoaded(iTimer)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
iTimer = -1
|
|
SpawnShopScene()
|
|
WHILE NOT DoSceneEntitiesExist(iTimer)
|
|
SpawnShopScene()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Figures out how long the player has to reach Amanda, based on how far away they are
|
|
PROC SetMissionTime()
|
|
FLOAT fDist = GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vShopLocation)
|
|
iDriveToShopTime = (ROUND(fDist) * 180)
|
|
CPRINTLN(DEBUG_MISSION, "Time to destination ", iDriveToShopTime)
|
|
IF iDriveToShopTime < MIN_DRIVE_TO_SHOP_TIME
|
|
iDriveToShopTime = MIN_DRIVE_TO_SHOP_TIME
|
|
ENDIF
|
|
iFailTimer = GetTimeInSeconds() + iDriveToShopTime
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Resets the amount of time the player has to reach Amanda when they arrive at the shop
|
|
PROC SetMissionTimeAtShop()
|
|
FLOAT fDifference = TO_FLOAT(iFailTimer) - TO_FLOAT(GetTimeInSeconds())
|
|
FLOAT fAdjustment = TO_FLOAT(AT_SHOP_FAIL_TIME) / fDifference
|
|
fAdjustment *= TO_FLOAT(iDriveToShopTime)
|
|
iFailTimer = AT_SHOP_FAIL_TIME + GetTimeInSeconds()
|
|
iDriveToShopTime = ROUND(fAdjustment)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Skips to the Rescue Amanda stage, used when restarting and Z skipping
|
|
PROC SKIP_TO_RESCUE_AMANDA()
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-832.1946, -178.3130, 36.5807>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 41.9602)
|
|
VEHICLE_INDEX viPlayer = GET_PLAYERS_LAST_VEHICLE()
|
|
IF IS_VEHICLE_OK(viPlayer)
|
|
SET_ENTITY_COORDS(viPlayer, <<-836.72, -179.78, 37.10>>)
|
|
SET_ENTITY_HEADING(viPlayer, 32.61)
|
|
ELSE
|
|
VEHICLE_INDEX viTemp
|
|
CREATE_VEHICLE_FOR_REPLAY(viTemp, <<-836.72, -179.78, 37.10>>, 32.61, FALSE, TRUE, TRUE, TRUE, TRUE, TAILGATER)
|
|
ENDIF
|
|
CLEAR_AREA_OF_VEHICLES(<<-836.72, -179.78, 37.10>>, 100)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
DISTANT_COP_CAR_SIRENS(FALSE)
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
RemovePedsAndVehicles(TRUE)
|
|
DebugSpawnShopScene()
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_AT_SHOP, "Rescue Amanda")
|
|
missionSubstate = MSS_PREPARE
|
|
missionState = MS_RESCUE_AMANDA
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Skips to the Drive Home stage, used when restarting and Z skipping
|
|
/// PARAMS:
|
|
/// bDebugSkip - is this a debug skip?
|
|
PROC SKIP_TO_DRIVE_HOME(BOOL bDebugSkip = FALSE)
|
|
RemovePedsAndVehicles(TRUE)
|
|
DebugSpawnShopScene()
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piAmanda)
|
|
IF bDebugSkip
|
|
IF IS_VEHICLE_OK(viCopCar) AND IS_VEHICLE_SEAT_FREE(viCopCar)
|
|
TASK_WARP_PED_INTO_VEHICLE(PLAYER_PED_ID(), viCopCar)
|
|
SET_ENTITY_COORDS(viCopCar, << -761.0187, -151.4704, 36.2233 >>)
|
|
SET_ENTITY_HEADING(viCopCar, 209.2)
|
|
FREEZE_ENTITY_POSITION(viCopCar, FALSE)
|
|
ENDIF
|
|
ELSE
|
|
VEHICLE_INDEX viTemp
|
|
VECTOR vPos = GET_REPLAY_CHECKPOINT_PLAYER_POSITION()
|
|
FLOAT fHeading
|
|
GET_NEAREST_PRESET_SPAWN_TO_CP(vPos, fHeading)
|
|
CREATE_VEHICLE_FOR_REPLAY(viTemp, vPos, fHeading, TRUE, FALSE, TRUE, TRUE, TRUE, mnCopCar)
|
|
IF IS_VEHICLE_OK(viTemp) AND IS_VEHICLE_SEAT_FREE(viTemp, VS_BACK_RIGHT) AND IS_PED_UNINJURED(piAmanda)
|
|
SET_VEHICLE_EXTRA(viTemp, VEHICLE_SETUP_FLAG_EXTRA_1, TRUE)
|
|
SET_PED_INTO_VEHICLE(piAmanda, viTemp, VS_BACK_RIGHT)
|
|
SAFE_RELEASE_VEHICLE(viCopCar)
|
|
ENDIF
|
|
ENDIF
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
DISTANT_COP_CAR_SIRENS(FALSE)
|
|
ENDIF
|
|
|
|
IF IS_PED_UNINJURED(piCop)
|
|
TASK_WANDER_STANDARD(piCop)
|
|
SAFE_RELEASE_PED(piCop)
|
|
ENDIF
|
|
IF IS_PED_UNINJURED(piShopkeeper)
|
|
TASK_WANDER_STANDARD(piShopkeeper)
|
|
SAFE_RELEASE_PED(piShopkeeper)
|
|
ENDIF
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
bShowHomeObjective = TRUE
|
|
bShowReturnObjective = TRUE
|
|
iCurrentDriveConv = -1
|
|
iPreviousDriveConv = -1
|
|
iCurrentRoofLine = -1
|
|
iPreviousRoofLine = -1
|
|
iCurrentCrashLine = 0
|
|
// iCurrentCrimeLine = 0
|
|
iCurrentStillLine = 0
|
|
iCurrentSirenLine = 0
|
|
bIsSirenOn = FALSE
|
|
bWasSirenOn = FALSE
|
|
iCrashLineTimer = 0
|
|
// iCrimeLineTimer = 0
|
|
iStillLineTimer = 0
|
|
iSirenLineTimer = 0
|
|
//SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_DRIVE_HOME, "Drive Home", TRUE)
|
|
missionSubstate = MSS_PREPARE
|
|
missionState = MS_DRIVE_HOME
|
|
ENDPROC
|
|
|
|
// ===========================================================================================================
|
|
// Debug functions
|
|
// ===========================================================================================================
|
|
#IF IS_DEBUG_BUILD
|
|
/// PURPOSE:
|
|
/// Skips to the next stage of the mission
|
|
PROC J_SKIP()
|
|
INT iLoopTimer
|
|
//iStartDay = -1
|
|
SetMissionTime()
|
|
|
|
RC_START_Z_SKIP()
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
SWITCH missionState
|
|
CASE MS_DRIVE_TO_SHOP
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), << -840.1384, -182.7698, 36.5921 >>)
|
|
VEHICLE_INDEX tempVehicle
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
tempVehicle = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
ENDIF
|
|
IF IS_VEHICLE_OK(tempVehicle)
|
|
SET_ENTITY_HEADING(tempVehicle, 18.0)
|
|
ELSE
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 18.0)
|
|
ENDIF
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
DebugSpawnShopScene()
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_AT_SHOP, "Rescue Amanda")
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MS_RESCUE_AMANDA
|
|
CPRINTLN(DEBUG_MISSION,"Doing jskip from rescue amanda state")
|
|
|
|
// force wanted level to change so skip doesn't fail
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) < 3
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 3)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 0)
|
|
CPRINTLN(DEBUG_MISSION,"J skip is setting the player's wanted level")
|
|
|
|
iLoopTimer = GET_GAME_TIMER()
|
|
WHILE GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) < 3
|
|
WAIT(0)
|
|
CPRINTLN(DEBUG_MISSION,"Waiting for player to become wanted")
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) < 3
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 3)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 0)
|
|
ENDIF
|
|
ENDIF
|
|
IF GET_GAME_TIMER() > iLoopTimer + 5000
|
|
CPRINTLN(DEBUG_MISSION,"J skip failed to set wanted level")
|
|
EXIT
|
|
ENDIF
|
|
ENDWHILE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_PED_UNINJURED(piAmanda)
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
ENDIF
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_VEHICLE_OK(viCopCar)
|
|
IF IS_VEHICLE_SEAT_FREE(viCopCar)
|
|
TASK_WARP_PED_INTO_VEHICLE(PLAYER_PED_ID(), viCopCar)
|
|
ENDIF
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
FREEZE_ENTITY_POSITION(viCopCar, FALSE)
|
|
//bAllowSceneConv = FALSE
|
|
//bAllowLooking = FALSE
|
|
ActivateCops()
|
|
ENDIF
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_AT_SHOP, "Rescue Amanda")
|
|
BREAK
|
|
|
|
CASE MS_LOSE_COPS
|
|
CPRINTLN(DEBUG_MISSION,"Doing jskip from lose cops state")
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
DISTANT_COP_CAR_SIRENS(FALSE)
|
|
IF IS_PED_UNINJURED(piCop)
|
|
CLEAR_PED_TASKS(piCop)
|
|
TASK_WANDER_STANDARD(piCop)
|
|
ENDIF
|
|
IF IS_PED_UNINJURED(piShopkeeper)
|
|
TASK_WANDER_STANDARD(piShopkeeper)
|
|
ENDIF
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piAmanda)
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), << -761.0187, -151.4704, 36.2233 >>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 209.2)
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), << -761.0187, -151.4704, 36.2233 >>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 209.2)
|
|
SET_ENTITY_COORDS(piAmanda, << -760.0187, -150.4704, 36.2233 >>)
|
|
SET_ENTITY_HEADING(piAmanda, 209.2)
|
|
ENDIF
|
|
ENDIF
|
|
bShowHomeObjective = TRUE
|
|
bShowReturnObjective = TRUE
|
|
iCurrentDriveConv = -1
|
|
iPreviousDriveConv = -1
|
|
iCurrentRoofLine = -1
|
|
iPreviousRoofLine = -1
|
|
iCurrentCrashLine = 0
|
|
// iCurrentCrimeLine = 0
|
|
iCurrentStillLine = 0
|
|
iCurrentSirenLine = 0
|
|
bIsSirenOn = FALSE
|
|
bWasSirenOn = FALSE
|
|
iCrashLineTimer = 0
|
|
// iCrimeLineTimer = 0
|
|
iStillLineTimer = 0
|
|
iSirenLineTimer = 0
|
|
//SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_DRIVE_HOME, "Drive Home", TRUE)
|
|
BREAK
|
|
|
|
CASE MS_DRIVE_HOME
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piAmanda)
|
|
IF GetMichaelScheduleStage() = MSS_M4_WithoutFamily
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
VEHICLE_INDEX viTemp
|
|
viTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
IF IS_VEHICLE_OK(viTemp) AND IS_PED_IN_VEHICLE(piAmanda, viTemp)
|
|
SET_ENTITY_COORDS(viTemp, vHotelLocation)
|
|
SET_ENTITY_HEADING(viTemp, 300.0)
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), vHotelLocation)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 300.0)
|
|
SET_ENTITY_COORDS(piAmanda, vHotelLocation+<<1,1,0>>)
|
|
SET_ENTITY_HEADING(piAmanda, 300.0)
|
|
ENDIF
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), vHotelLocation)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 300.0)
|
|
SET_ENTITY_COORDS(piAmanda, vHotelLocation+<<1,1,0>>)
|
|
SET_ENTITY_HEADING(piAmanda, 300.0)
|
|
ENDIF
|
|
ELSE
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
VEHICLE_INDEX viTemp
|
|
viTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
IF IS_VEHICLE_OK(viTemp) AND IS_PED_IN_VEHICLE(piAmanda, viTemp)
|
|
SET_ENTITY_COORDS(viTemp, vHomeLocation)
|
|
SET_ENTITY_HEADING(viTemp, 300.0)
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), vHomeLocation)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 300.0)
|
|
SET_ENTITY_COORDS(piAmanda, vHomeLocation+<<1,1,0>>)
|
|
SET_ENTITY_HEADING(piAmanda, 300.0)
|
|
ENDIF
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), vHomeLocation)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 300.0)
|
|
SET_ENTITY_COORDS(piAmanda, vHomeLocation+<<1,1,0>>)
|
|
SET_ENTITY_HEADING(piAmanda, 300.0)
|
|
ENDIF
|
|
ENDIF
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
//SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_DRIVE_HOME, "Drive Home", TRUE)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
RC_END_Z_SKIP()
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Skips to the previous stage of the mission
|
|
PROC P_SKIP()
|
|
RC_START_Z_SKIP()
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
//iStartDay = -1
|
|
SetMissionTime()
|
|
SWITCH missionState
|
|
CASE MS_RESCUE_AMANDA
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), << -788.8835, -252.5904, 36.1073 >>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 35.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
RemovePedsAndVehicles(TRUE)
|
|
missionSubstate = MSS_PREPARE
|
|
missionState = MS_DRIVE_TO_SHOP
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MS_LOSE_COPS
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), << -840.1384, -182.7698, 36.5921 >>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 18.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
DISTANT_COP_CAR_SIRENS(FALSE)
|
|
RemovePedsAndVehicles(TRUE)
|
|
DebugSpawnShopScene()
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_AT_SHOP, "Rescue Amanda")
|
|
missionSubstate = MSS_PREPARE
|
|
missionState = MS_RESCUE_AMANDA
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MS_DRIVE_HOME
|
|
IF IS_VEHICLE_OK(viCopCar) AND IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), viCopCar)
|
|
SET_ENTITY_COORDS(viCopCar, vCopCarPos)
|
|
SET_ENTITY_HEADING(viCopCar, fCopCarHeading)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
bShowHomeObjective = TRUE
|
|
bShowReturnObjective = TRUE
|
|
//bAllowSceneConv = FALSE
|
|
//bAllowLooking = FALSE
|
|
iCurrentDriveConv = -1
|
|
iPreviousDriveConv = -1
|
|
iCurrentRoofLine = -1
|
|
iPreviousRoofLine = -1
|
|
iCurrentCrashLine = 0
|
|
// iCurrentCrimeLine = 0
|
|
iCurrentStillLine = 0
|
|
iCurrentSirenLine = 0
|
|
bIsSirenOn = FALSE
|
|
bWasSirenOn = FALSE
|
|
iCrashLineTimer = 0
|
|
// iCrimeLineTimer = 0
|
|
iStillLineTimer = 0
|
|
iSirenLineTimer = 0
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_AT_SHOP, "Rescue Amanda")
|
|
missionSubstate = MSS_ACTIVE_ONE
|
|
missionState = MS_RESCUE_AMANDA
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
RC_END_Z_SKIP()
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Skips to a player selected stage of the mission
|
|
PROC Z_SKIP()
|
|
INT debugJumpStage = -1
|
|
IF LAUNCH_MISSION_STAGE_MENU(sSkipMenu, debugJumpStage)
|
|
//iStartDay = -1
|
|
RC_START_Z_SKIP()
|
|
SetMissionTime()
|
|
IF debugJumpStage = 0
|
|
// Drive to shop
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), << -788.8835, -252.5904, 36.1073 >>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 35.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
DISTANT_COP_CAR_SIRENS(FALSE)
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
RemovePedsAndVehicles(TRUE)
|
|
missionSubstate = MSS_PREPARE
|
|
missionState = MS_DRIVE_TO_SHOP
|
|
ENDIF
|
|
ELIF debugJumpStage = 1
|
|
// Rescue Amanda
|
|
SKIP_TO_RESCUE_AMANDA()
|
|
ELIF debugJumpStage = 2
|
|
// Lose cops
|
|
RemovePedsAndVehicles(TRUE)
|
|
DebugSpawnShopScene()
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_VEHICLE_OK(viCopCar) AND IS_VEHICLE_SEAT_FREE(viCopCar)
|
|
TASK_WARP_PED_INTO_VEHICLE(PLAYER_PED_ID(), viCopCar)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
ENDIF
|
|
IF IS_PED_UNINJURED(piAmanda)
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
ENDIF
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
//bAllowSceneConv = FALSE
|
|
//bAllowLooking = FALSE
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_AT_SHOP, "Rescue Amanda")
|
|
missionSubstate = MSS_ACTIVE_ONE
|
|
missionState = MS_RESCUE_AMANDA
|
|
ELIF debugJumpStage = 3
|
|
// Drive home
|
|
SKIP_TO_DRIVE_HOME(TRUE)
|
|
ENDIF
|
|
RC_END_Z_SKIP()
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks for the player pressing a mission skip debug key
|
|
PROC CheckDebugKeys()
|
|
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J))
|
|
J_SKIP()
|
|
ENDIF
|
|
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P))
|
|
P_SKIP()
|
|
ENDIF
|
|
Z_SKIP()
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Makes Amanda walk off if the player debug passes the mission
|
|
PROC DebugPassDealWithAmanda()
|
|
IF IS_PED_UNINJURED(piAmanda)
|
|
IF IS_VEHICLE_OK(viCopCar)
|
|
IF IS_PED_IN_VEHICLE(piAmanda, viCopCar) AND IS_VEHICLE_SEAT_FREE(viCopCar, VS_FRONT_RIGHT)
|
|
SAFE_DELETE_PED(piAmanda)
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
|
|
REMOVE_PED_FROM_GROUP(piAmanda)
|
|
SEQUENCE_INDEX siAmanda
|
|
OPEN_SEQUENCE_TASK(siAmanda)
|
|
IF IS_PED_IN_ANY_VEHICLE(piAmanda)
|
|
TASK_LEAVE_ANY_VEHICLE(NULL, 0, ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP)
|
|
ENDIF
|
|
TASK_WANDER_STANDARD(NULL)
|
|
CLOSE_SEQUENCE_TASK(siAmanda)
|
|
TASK_PERFORM_SEQUENCE(piAmanda, siAmanda)
|
|
CLEAR_SEQUENCE_TASK(siAmanda)
|
|
SET_PED_KEEP_TASK(piAmanda, TRUE)
|
|
SAFE_RELEASE_PED(piAmanda)
|
|
ENDIF
|
|
ENDPROC
|
|
#ENDIF
|
|
|
|
// ===========================================================================================================
|
|
// Script States
|
|
// ===========================================================================================================
|
|
/// PURPOSE:
|
|
/// Initialises the mission
|
|
PROC INIT()
|
|
REQUEST_ADDITIONAL_TEXT("MEA1", MISSION_TEXT_SLOT)
|
|
|
|
IF HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
|
|
CPRINTLN(DEBUG_MISSION,"MS_INIT")
|
|
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, MICHAEL_ID, PLAYER_PED_ID(), "MICHAEL", TRUE)
|
|
//SET_PED_GESTURE_GROUP(PLAYER_PED_ID(), sPlayerGestureGroup)
|
|
SET_PED_CAN_PLAY_GESTURE_ANIMS(PLAYER_PED_ID(), TRUE)
|
|
ENDIF
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_PHONE_ID, NULL, "AMANDA")
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
rghPlayer = GET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
SET_AUDIO_FLAG("WantedMusicOnMission", TRUE)
|
|
|
|
sDriveConvs[0] = "MEA1_DRIVE1"
|
|
sDriveConvs[1] = "MEA1_DRIVE2"
|
|
sDriveConvs[2] = "MEA1_DRIVE3"
|
|
sDriveConvs[3] = "MEA1_CHAT"
|
|
|
|
sStartLines = "MEA1_MICHAEL_1"
|
|
/*sStartLines[0] = "MEA1_MICHAEL_1"
|
|
sStartLines[1] = "MEA1_MICHAEL_2"
|
|
sStartLines[2] = "MEA1_MICHAEL_3"
|
|
sStartLines[3] = "MEA1_MICHAEL_4"
|
|
sStartLines[4] = "MEA1_MICHAEL_5"*/
|
|
|
|
sCrashLines[0] = "MEA1_CRASH_1"
|
|
sCrashLines[1] = "MEA1_CRASH_2"
|
|
sCrashLines[2] = "MEA1_CRASH_3"
|
|
|
|
// sCrimeLines[0] = "MEA1_CRIME_1"
|
|
// sCrimeLines[1] = "MEA1_CRIME_2"
|
|
// sCrimeLines[2] = "MEA1_CRIME_3"
|
|
|
|
sStillLines[0] = "MEA1_STILL_1"
|
|
sStillLines[1] = "MEA1_STILL_2"
|
|
sStillLines[2] = "MEA1_STILL_3"
|
|
|
|
sSirenLines[0] = "MEA1_SIREN_1"
|
|
sSirenLines[1] = "MEA1_SIREN_2"
|
|
sSirenLines[2] = "MEA1_SIREN_3"
|
|
|
|
sRoofLines[0] = "MEA1_ROOF_1"
|
|
sRoofLines[1] = "MEA1_ROOF_2"
|
|
sRoofLines[2] = "MEA1_ROOF_3"
|
|
|
|
sLoseCopLines[0] = "MEA1_LOSEGEN_1"
|
|
sLoseCopLines[1] = "MEA1_LOSEGEN_2"
|
|
sLoseCopLines[2] = "MEA1_LOSEGEN_3"
|
|
sLoseCopLines[3] = "MEA1_LOSEGEN_4"
|
|
sLoseCopLines[4] = "MEA1_LOSEGEN_5"
|
|
sLoseCopLines[5] = "MEA1_LOSEGEN_6"
|
|
sLoseCopLines[6] = "MEA1_LOSEGEN_7"
|
|
sLoseCopLines[7] = "MEA1_LOSEGEN_8"
|
|
sLoseCopLines[8] = "MEA1_LOSEGEN_9"
|
|
sLoseCopReply[0] = "MEA1_GOTTHIS_1"
|
|
sLoseCopReply[1] = "MEA1_GOTTHIS_2"
|
|
sLoseCopReply[2] = "MEA1_GOTTHIS_3"
|
|
sLoseCopReply[3] = "MEA1_GOTTHIS_4"
|
|
|
|
sNotHomeLines[0] = "MEA1_NOHOME_1"
|
|
sNotHomeLines[1] = "MEA1_NOHOME_2"
|
|
sNotHomeLines[2] = "MEA1_NOHOME_3"
|
|
|
|
sAmandaLines[0] = "MEA1_BEAA_01"
|
|
sAmandaLines[1] = "MEA1_BEAA_02"
|
|
sAmandaLines[2] = "MEA1_BEAA_03"
|
|
sAmandaLines[3] = "MEA1_BEAA_04"
|
|
sAmandaLines[4] = "MEA1_BEAA_05"
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
sSkipMenu[0].sTxtLabel = "Drive to shop"
|
|
sSkipMenu[1].sTxtLabel = "Rescue Amanda"
|
|
sSkipMenu[2].sTxtLabel = "Lose cops"
|
|
sSkipMenu[3].sTxtLabel = "Drive home"
|
|
#ENDIF
|
|
|
|
SetMissionTime()
|
|
|
|
IF IS_REPEAT_PLAY_ACTIVE() AND IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
VEHICLE_INDEX viTemp
|
|
VECTOR vPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
FLOAT fHead = GET_ENTITY_HEADING(PLAYER_PED_ID())
|
|
CREATE_VEHICLE_FOR_REPLAY(viTemp, vPos, fHead, TRUE, FALSE, TRUE, TRUE, TRUE)
|
|
CLEAR_AREA_OF_VEHICLES(vPos, 100)
|
|
ENDIF
|
|
|
|
IF IS_REPLAY_IN_PROGRESS()
|
|
INT iReplayStage = GET_REPLAY_MID_MISSION_STAGE()
|
|
|
|
IF g_bShitskipAccepted = TRUE
|
|
iReplayStage++ // player is skipping this stage
|
|
ENDIF
|
|
|
|
SWITCH iReplayStage
|
|
CASE CP_MISSION_START
|
|
// don't do anything to the player if they failed before even reaching the mission
|
|
VEHICLE_INDEX viTemp
|
|
CREATE_VEHICLE_FOR_PHONECALL_TRIGGER_REPLAY(viTemp, TRUE, TRUE, TRUE, TRUE, TAILGATER)
|
|
IF IS_ENTITY_IN_RANGE_COORDS(viTemp, <<-811.343750,187.436691,71.478607>>, 6.0)
|
|
SET_ENTITY_COORDS(viTemp, <<-822.404419,182.607849,71.378090>>)
|
|
SET_ENTITY_HEADING(viTemp, 135.654083)
|
|
ENDIF
|
|
SAFE_RELEASE_VEHICLE(viTemp)
|
|
SUPPRESS_PLAYERS_VEHICLE()
|
|
missionSubstate = MSS_PREPARE
|
|
missionState = MS_DRIVE_TO_SHOP
|
|
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100)
|
|
SAFE_FADE_SCREEN_IN_FROM_BLACK()
|
|
BREAK
|
|
|
|
CASE CP_AT_SHOP
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
RC_START_Z_SKIP()
|
|
SKIP_TO_RESCUE_AMANDA()
|
|
SUPPRESS_PLAYERS_VEHICLE()
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
|
|
WAIT(500)
|
|
RC_END_Z_SKIP()
|
|
ENDIF
|
|
BREAK
|
|
|
|
/*CASE CP_DRIVE_HOME
|
|
RC_START_Z_SKIP()
|
|
SKIP_TO_DRIVE_HOME()
|
|
SUPPRESS_PLAYERS_VEHICLE()
|
|
WAIT(500)
|
|
RC_END_Z_SKIP()
|
|
BREAK*/
|
|
|
|
CASE CP_MISSION_PASSED
|
|
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SAFE_FADE_SCREEN_IN_FROM_BLACK()
|
|
RC_END_Z_SKIP()
|
|
Mission_Passed()
|
|
BREAK
|
|
|
|
DEFAULT
|
|
SCRIPT_ASSERT("Replay in progress: Unknown checkpoint selected")
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
SAFE_FADE_SCREEN_IN_FROM_BLACK()
|
|
SUPPRESS_PLAYERS_VEHICLE()
|
|
missionSubstate = MSS_PREPARE
|
|
missionState = MS_DRIVE_TO_SHOP
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Pauses the cop/shopkeeper conversation if the player drives too far away
|
|
PROC HIDE_SUBTITLES_IF_FAR_AWAY()
|
|
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vArrestScenePos, 100)
|
|
IF bPausedConversation
|
|
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
|
|
bPausedConversation = FALSE
|
|
ENDIF
|
|
ELSE
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT bPausedConversation
|
|
TEXT_LABEL_23 tlConv
|
|
tlConv = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
|
|
STRING sConv
|
|
sConv = CONVERT_TEXT_LABEL_TO_STRING(tlConv)
|
|
IF ARE_STRINGS_EQUAL(sConv, "MEA1_SCENE")
|
|
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
|
|
bPausedConversation = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// The player drives to the shop where Amanda has been arrested
|
|
PROC DRIVE_TO_SHOP()
|
|
HANDLE_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT(stateRestoreConversation, pedConvStruct, "MEA1AUD", tSavedConversationRoot, tSavedConversationLabel)
|
|
SWITCH missionSubstate
|
|
CASE MSS_PREPARE
|
|
CPRINTLN(DEBUG_MISSION,"Entering drive to shop state")
|
|
SAFE_REMOVE_BLIP(biObjective)
|
|
//biObjective = CREATE_COORD_BLIP(vShopLocation, BLIPPRIORITY_HIGH)
|
|
biObjective = CREATE_COORD_BLIP(vCopCarPos, BLIPPRIORITY_HIGH, FALSE)
|
|
SET_BLIP_NAME_FROM_TEXT_FILE(biObjective, "MEA1_AMA")
|
|
SET_BLIP_COLOUR(biObjective, BLIP_COLOUR_BLUE)
|
|
SET_BLIP_ROUTE(biObjective, TRUE)
|
|
SET_TAXI_DROPOFF_LOCATION_FOR_BLIP(biObjective, <<-838.47, -177.11, 36.92>>, 31.44)
|
|
|
|
LoadSceneModels()
|
|
|
|
iConversationTimer = GET_GAME_TIMER() + iStartLinesTimer
|
|
iCurrentStartLine = -1
|
|
iPreviousStartLine = -1
|
|
|
|
bForceAmandaIntoGroup = FALSE
|
|
bPausedConversation = FALSE
|
|
|
|
PRINT_NOW("MEA1_01", DEFAULT_GOD_TEXT_TIME, 1) // Go to ~y~Didier Sachs.
|
|
//PRINT_HELP("MEA1_HELP")
|
|
missionSubstate = MSS_ACTIVE_ONE
|
|
BREAK
|
|
|
|
CASE MSS_ACTIVE_ONE
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
IF (GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vShopLocation) < fSpawnSetupDist)
|
|
missionSubstate = MSS_ACTIVE_TWO
|
|
ENDIF
|
|
ENDIF
|
|
FailIfTooLate()
|
|
BREAK
|
|
|
|
CASE MSS_ACTIVE_TWO
|
|
SpawnShopScene()
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piAmanda) AND DOES_ENTITY_EXIST(piShopkeeper) AND DOES_ENTITY_EXIST(piCop) AND IS_VEHICLE_OK(viCopCar)
|
|
IF /*IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vShopLocation, <<1,1,LOCATE_SIZE_HEIGHT>>, TRUE)
|
|
OR*/ (GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vShopLocation) < fBlipAmandaDist)
|
|
//IF HAS_ENTITY_CLEAR_LOS_TO_ENTITY(PLAYER_PED_ID(), viCopCar)
|
|
iConvFailedTimer = -1
|
|
missionSubstate = MSS_PREPARE
|
|
missionState = MS_RESCUE_AMANDA
|
|
//ENDIF
|
|
ENDIF
|
|
PlayerInterruptsSyncedScene()
|
|
ENDIF
|
|
ManagePlayerDamagesCopCarLines()
|
|
FailIfTooLate()
|
|
PlayerThreatensPeds()
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("M_E_AMANDA_GO_TO_AMANDA")
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
START_AUDIO_SCENE("M_E_AMANDA_GO_TO_AMANDA")
|
|
ENDIF
|
|
ENDIF
|
|
PlayStartLines()
|
|
ControlArrestScene()
|
|
HIDE_SUBTITLES_IF_FAR_AWAY()
|
|
ENDPROC
|
|
|
|
PROC TRIGGER_AMANDA_ESCAPE_CONV()
|
|
IF bAllowInCarConv AND GET_GAME_TIMER() > iInCarConvTimer AND MichaelAndAmandaInSameVehicle()
|
|
REMOVE_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID)
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(piAmanda,"MEA1_BFAA","AMANDA",SPEECH_PARAMS_FORCE_NORMAL)
|
|
bAllowInCarConv = FALSE
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// The player arrives at the shop and rescues Amanda
|
|
PROC RESCUE_AMANDA()
|
|
IF IS_PED_UNINJURED(piCop) AND IS_PED_UNINJURED(piShopkeeper)
|
|
HANDLE_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT(stateRestoreConversation, pedConvStruct, "MEA1AUD", tSavedConversationRoot, tSavedConversationLabel)
|
|
ENDIF
|
|
SWITCH missionSubstate
|
|
CASE MSS_PREPARE
|
|
CPRINTLN(DEBUG_MISSION,"Entering rescue amanda state")
|
|
//IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
/*IF iConvFailedTimer = -1
|
|
iConvFailedTimer = GET_GAME_TIMER() + CONV_FAILED_TIME
|
|
ENDIF*/
|
|
/*IF CREATE_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_ARRIVE", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
|
|
OR CONVERSATION_TIMED_OUT(iConvFailedTimer)*/
|
|
SAFE_REMOVE_BLIP(biObjective)
|
|
IF IS_VEHICLE_OK(viCopCar)
|
|
biObjective = CREATE_VEHICLE_BLIP(viCopCar, TRUE)
|
|
ENDIF
|
|
IF IS_AUDIO_SCENE_ACTIVE("M_E_AMANDA_GO_TO_AMANDA")
|
|
STOP_AUDIO_SCENE("M_E_AMANDA_GO_TO_AMANDA")
|
|
ENDIF
|
|
START_AUDIO_SCENE("M_E_AMANDA_ENTER_COP_CAR")
|
|
//bAllowSceneConv = TRUE
|
|
//bAllowAmandaConv = TRUE
|
|
//bAllowLooking = TRUE
|
|
bAllowInCarConv = TRUE
|
|
bNotBumpedYet = TRUE
|
|
bDisplaySeatObjective = TRUE
|
|
//iSceneConvLine = 0
|
|
eGriefState = GCS_READY
|
|
/*PRINT_NOW("MEA1_02", DEFAULT_GOD_TEXT_TIME, 1) // Get in the ~b~cop car.
|
|
CHECK_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT_NOW(stateRestoreConversation)*/
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_AT_SHOP, "Rescue Amanda")
|
|
SetMissionTimeAtShop()
|
|
iGriefingTimer = GET_GAME_TIMER() + GRIEFING_TIME
|
|
VEHICLE_INDEX viPlayer
|
|
viPlayer = GET_PLAYERS_LAST_VEHICLE()
|
|
IF IS_VEHICLE_OK(viPlayer) AND GET_ENTITY_MODEL(viPlayer) <> mnCopCar
|
|
SET_MISSION_LAST_VEHICLE_AS_VEHICLE_GEN(<<-823, 181, 71>>, 71.0, TRUE, CHAR_MICHAEL) // Vehicle will be cleared up when player is 310m away from it
|
|
ENDIF
|
|
missionSubstate = MSS_ACTIVE_ONE
|
|
CPRINTLN(DEBUG_MISSION,"Entering rescue amanda state: Active 1")
|
|
|
|
//B* - 1980359
|
|
SET_STATIC_BLIP_ACTIVE_STATE(g_sSavehouses[SAVEHOUSE_MICHAEL_BH].eBlip, TRUE)
|
|
|
|
//ENDIF
|
|
//ENDIF
|
|
FailIfTooLate()
|
|
BREAK
|
|
|
|
CASE MSS_ACTIVE_ONE
|
|
ControlArrestScene()
|
|
PlayerInCar()
|
|
PlayerThreatensPeds()
|
|
ManageGriefingLines()
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_VEHICLE_OK(viCopCar) AND HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(viCopCar, PLAYER_PED_ID()) AND NOT IS_PED_RAGDOLL(PLAYER_PED_ID())
|
|
FREEZE_ENTITY_POSITION(viCopCar, FALSE)
|
|
MinorCopAlert()
|
|
ENDIF
|
|
FailIfTooLate()
|
|
BREAK
|
|
|
|
CASE MSS_ACTIVE_TWO
|
|
IF IS_VEHICLE_OK(viCopCar)
|
|
/*IF bAllowInCarConv //AND GET_GAME_TIMER() > iInCarConvTimer
|
|
REMOVE_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID)
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(piAmanda,"MEA1_BFAA","AMANDA",SPEECH_PARAMS_FORCE_NORMAL)
|
|
bAllowInCarConv = FALSE
|
|
ENDIF*/
|
|
/*IF bAllowInCarConv
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
IF CREATE_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_INCAR", CONV_PRIORITY_MEDIUM)
|
|
OR CONVERSATION_TIMED_OUT(iConvFailedTimer)
|
|
IF IS_AUDIO_SCENE_ACTIVE("M_E_AMANDA_ENTER_COP_CAR")
|
|
STOP_AUDIO_SCENE("M_E_AMANDA_ENTER_COP_CAR")
|
|
ENDIF
|
|
START_AUDIO_SCENE("M_E_AMANDA_ESCAPE_COPS")
|
|
iConvFailedTimer = -1
|
|
bAllowInCarConv = FALSE
|
|
ENDIF
|
|
ELSE*/
|
|
//IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() OR NOT IS_VEHICLE_STOPPED(viCopCar)
|
|
IF IS_PED_UNINJURED(piCop)
|
|
/*IF iConvFailedTimer = -1
|
|
iConvFailedTimer = GET_GAME_TIMER() + CONV_FAILED_TIME
|
|
ENDIF*/
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
|
|
IF CREATE_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_COP", CONV_PRIORITY_MEDIUM)
|
|
OR CONVERSATION_TIMED_OUT(iConvFailedTimer, 2000)
|
|
//OR GET_GAME_TIMER() > iConvFailedTimer
|
|
ActivateCops()
|
|
//TASK_TURN_PED_TO_FACE_ENTITY(piCop, PLAYER_PED_ID(), -1)
|
|
iInCarConvTimer = GET_GAME_TIMER() + 1000
|
|
eArrestSceneStage = ASS_BREAKOUT
|
|
copChatState = CCS_DONE
|
|
ENDIF
|
|
ELSE
|
|
ActivateCops()
|
|
ENDIF
|
|
//ENDIF
|
|
//ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MSS_ACTIVE_THREE
|
|
TRIGGER_AMANDA_ESCAPE_CONV()
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
ActivateCops()
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
PlayerInterruptsSyncedScene()
|
|
ManagePlayerDamagesCopCarLines()
|
|
//PlayCopShopkeeperConv()
|
|
//ControlArrestScene()
|
|
//PlayNearAmandaConv()
|
|
TrashedCopCarFail()
|
|
MakeShopkeeperFlee()
|
|
HIDE_SUBTITLES_IF_FAR_AWAY()
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// The player has to escape from the cops
|
|
PROC LOSE_COPS()
|
|
HANDLE_BUDDY_HEAD_TRACK_WHILE_ENTERING_VEHICLE()
|
|
HANDLE_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT(stateRestoreConversation, pedConvStruct, "MEA1AUD", tSavedConversationRoot, tSavedConversationLabel)
|
|
IF IS_PED_UNINJURED(piAmanda)
|
|
SET_PED_CAN_PLAY_GESTURE_ANIMS(piAmanda, TRUE)
|
|
ENDIF
|
|
SWITCH missionSubstate
|
|
CASE MSS_PREPARE
|
|
CPRINTLN(DEBUG_MISSION,"Entering lose cops state")
|
|
SAFE_REMOVE_BLIP(biObjective)
|
|
PRINT_NOW("MEA1_03", DEFAULT_GOD_TEXT_TIME, 1) // Lose the cops.
|
|
CHECK_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT_NOW(stateRestoreConversation)
|
|
missionSubstate = MSS_ACTIVE_ONE
|
|
iCopGunTimer = GET_GAME_TIMER() + iCopChaseTime
|
|
iConvFailedTimer = -1
|
|
|
|
//SET_PED_DESIRED_MOVE_BLEND_RATIO(piAmanda, PEDMOVE_SPRINT)
|
|
|
|
//iInCarConvTimer = GET_GAME_TIMER() + 500
|
|
BREAK
|
|
|
|
CASE MSS_ACTIVE_ONE
|
|
/*IF IS_PED_UNINJURED(piAmanda)
|
|
SET_PED_MIN_MOVE_BLEND_RATIO(piAmanda, PEDMOVE_RUN)
|
|
ENDIF*/
|
|
TRIGGER_AMANDA_ESCAPE_CONV()
|
|
IF bLoadHandcuffSound
|
|
IF REQUEST_MISSION_AUDIO_BANK("MICHAEL_EVENT_AMANDA_1")
|
|
iHandcuffSound = GET_SOUND_ID()
|
|
bLoadHandcuffSound = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
MakeShopkeeperFlee()
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piAmanda) //AND IS_VEHICLE_OK(viCopCar)
|
|
ManageLoseCopLines()
|
|
ManageCrashLines()
|
|
//ManageStationaryLines()
|
|
IF (GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0)
|
|
/*IF iConvFailedTimer = -1
|
|
iConvFailedTimer = GET_GAME_TIMER() + CONV_FAILED_TIME
|
|
ENDIF*/
|
|
IF AmandaReleased()
|
|
//SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_DRIVE_HOME, "Drive Home", TRUE)
|
|
missionSubstate = MSS_PREPARE
|
|
/*IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), vGaragePos1, vGaragePos2, fGarageWidth)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), vHousePos1, vHousePos2, fHouseWidth)
|
|
missionState = MS_AT_HOME
|
|
ELSE*/
|
|
missionState = MS_DRIVE_HOME
|
|
//ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_PED_GROUP_MEMBER(piAmanda, PLAYER_GROUP_ID())
|
|
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), piAmanda) > (fWarnDistance*2)
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
missionSubstate = MSS_PREPARE
|
|
missionState = MS_RETURN_TO_AMANDA
|
|
ENDIF
|
|
ELSE
|
|
IF IS_VEHICLE_OK(viCopCar) AND IS_PED_SITTING_IN_VEHICLE(piAmanda, viCopCar) AND NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), viCopCar) AND NOT IS_PLAYER_TOWING_VEHICLE(viCopCar)
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
missionSubstate = MSS_PREPARE
|
|
missionState = MS_RETURN_TO_AMANDA
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
GiveWeaponToCop()
|
|
//IF bAllowInCarConv
|
|
/*IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND MichaelAndAmandaInSameVehicle()
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
IF CREATE_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_INCAR", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
|
|
OR CONVERSATION_TIMED_OUT(iConvFailedTimer)
|
|
bAllowInCarConv = FALSE
|
|
ENDIF
|
|
ENDIF*/
|
|
/*IF GET_GAME_TIMER() > iInCarConvTimer
|
|
REMOVE_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID)
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(piAmanda,"MEA1_BFAA","AMANDA",SPEECH_PARAMS_FORCE_NORMAL)
|
|
bAllowInCarConv = FALSE
|
|
ENDIF*/
|
|
//ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ReleaseShopkeeper()
|
|
TrashedCopCarFail()
|
|
CheckForFreeSeats()
|
|
ManagePlayerDamagesCopCarLines()
|
|
// Prevent player losing wanted level if at Michael's house B*1224925
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), << -806.21, 165.83, 68.98 >>, << 52.00, 36.00, 16.25 >>)
|
|
OR IS_ENTITY_AT_COORD(piAmanda, << -806.21, 165.83, 68.98 >>, << 52.00, 36.00, 16.25 >>)
|
|
SUPPRESS_LOSING_WANTED_LEVEL_IF_HIDDEN_THIS_FRAME(PLAYER_ID())
|
|
//SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(prop_lrggate_02_ld, << -844.05, 155.97, 66.03 >>, FALSE, 1.0)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC CheckAtDestination()
|
|
VECTOR vDest
|
|
IF GetMichaelScheduleStage() = MSS_M4_WithoutFamily
|
|
vDest = vHotelLocation
|
|
ELSE
|
|
vDest = vHomeLocation
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vDest, <<1,1,LOCATE_SIZE_HEIGHT>>, TRUE)
|
|
OR (GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vDest) < LOCATE_SIZE_MISSION_TRIGGER)//5.0)
|
|
BOOL bIsOnGround
|
|
bIsOnGround = FALSE
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
VEHICLE_INDEX viTemp
|
|
viTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
IF IS_VEHICLE_OK(viTemp)
|
|
IF IS_VEHICLE_ON_ALL_WHEELS(viTemp)
|
|
bIsOnGround = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ENTITY_IN_AIR(PLAYER_PED_ID())
|
|
bIsOnGround = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
IF bIsOnGround
|
|
missionSubstate = MSS_PREPARE
|
|
IF GetMichaelScheduleStage() = MSS_M4_WithoutFamily
|
|
missionState = MS_AT_HOTEL
|
|
ELSE
|
|
missionState = MS_AT_HOME
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// The player drives home with Amanda
|
|
PROC DRIVE_HOME()
|
|
HANDLE_BUDDY_HEAD_TRACK_WHILE_ENTERING_VEHICLE()
|
|
HANDLE_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT(stateRestoreConversation, pedConvStruct, "MEA1AUD", tSavedConversationRoot, tSavedConversationLabel)
|
|
IF IS_PED_UNINJURED(piAmanda)
|
|
SET_PED_CAN_PLAY_GESTURE_ANIMS(piAmanda, TRUE)
|
|
ENDIF
|
|
SWITCH missionSubstate
|
|
CASE MSS_PREPARE
|
|
CPRINTLN(DEBUG_MISSION,"Entering drive home state")
|
|
SAFE_REMOVE_BLIP(biObjective)
|
|
IF IS_PED_UNINJURED(piCop)
|
|
CLEAR_PED_TASKS(piCop)
|
|
TASK_WANDER_STANDARD(piCop)
|
|
ENDIF
|
|
IF IS_AUDIO_SCENE_ACTIVE("M_E_AMANDA_ESCAPE_COPS")
|
|
STOP_AUDIO_SCENE("M_E_AMANDA_ESCAPE_COPS")
|
|
START_AUDIO_SCENE("M_E_AMANDA_DRIVE_HOME")
|
|
ENDIF
|
|
RESET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID())
|
|
IF IS_PED_GROUP_MEMBER(piAmanda, PLAYER_GROUP_ID())
|
|
bShowHomeObjective = FALSE
|
|
bShowReturnObjective = TRUE
|
|
ENDIF
|
|
IF AmandaReleased()
|
|
/*biObjective = CREATE_COORD_BLIP(vHomeLocation)
|
|
SET_BLIP_DISPLAY(biObjective, DISPLAY_NOTHING)*/
|
|
//SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_DRIVE_HOME, "Drive Home", TRUE)
|
|
IF HAS_ANIM_DICT_LOADED(sAmandaMoveDict)
|
|
SET_PED_MOVEMENT_CLIPSET(piAmanda, sAmandaMoveDict)
|
|
ENDIF
|
|
iNotHomeTimer = GET_GAME_TIMER() + (iStartLinesTimer*2)
|
|
//iConversationTimer = GET_GAME_TIMER() + 200
|
|
PRINT_NOW("MEA1_04", DEFAULT_GOD_TEXT_TIME, 1) // Go ~y~home.
|
|
IF GetMichaelScheduleStage() = MSS_M4_WithoutFamily
|
|
biObjective = CREATE_COORD_BLIP(vHotelLocation)
|
|
ELSE
|
|
biObjective = CREATE_COORD_BLIP(vHomeLocation)
|
|
ENDIF
|
|
missionSubstate = MSS_ACTIVE_ONE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MSS_ACTIVE_ONE
|
|
//IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
/*SET_BLIP_DISPLAY(biObjective, DISPLAY_BLIP)
|
|
SET_BLIP_COLOUR(biObjective, BLIP_COLOUR_YELLOW)*/
|
|
IF bShowHomeObjective
|
|
IF GET_GAME_TIMER() > iConversationTimer // Make sure the lost cops conversation has had time to start
|
|
/*PRINT_NOW("MEA1_04", DEFAULT_GOD_TEXT_TIME, 1) // Go ~y~home.
|
|
CHECK_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT_NOW(stateRestoreConversation)*/
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), viCopCar)
|
|
AND IS_PED_IN_VEHICLE(piAmanda, viCopCar)
|
|
IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(pedConvStruct, "MEA1AUD", "MEA1_LOSTCOP", "MEA1_LOSTCOP_5", CONV_PRIORITY_MEDIUM)
|
|
bShowHomeObjective = FALSE
|
|
bShowReturnObjective = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bShowHomeObjective = FALSE
|
|
bShowReturnObjective = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iCheckVehicleTimer = GET_GAME_TIMER() + iCheckVehicle
|
|
/*IF GetMichaelScheduleStage() = MSS_M4_WithoutFamily
|
|
biObjective = CREATE_COORD_BLIP(vHotelLocation)
|
|
ELSE
|
|
biObjective = CREATE_COORD_BLIP(vHomeLocation)
|
|
ENDIF*/
|
|
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID()) // Clear now - ped damage events can occur before you start checking for them B*1178888
|
|
missionSubstate = MSS_ACTIVE_TWO
|
|
ENDIF
|
|
//ENDIF
|
|
BREAK
|
|
|
|
CASE MSS_ACTIVE_TWO
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piAmanda)
|
|
TriggerHandcuffSound()
|
|
ManageDriveConversations()
|
|
ManageCrashLines()
|
|
// ManageCrimeLines()
|
|
ManageStationaryLines()
|
|
ManageSirenLines()
|
|
ManageNotAtHomeLines()
|
|
GetCurrentPlayersCar()
|
|
PlayUpsideDownLine()
|
|
IF NOT IS_PED_GROUP_MEMBER(piAmanda, PLAYER_GROUP_ID())
|
|
IF IS_VEHICLE_OK(viCopCar)
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), viCopCar)
|
|
AmandaReleased()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
CheckAtDestination()
|
|
IF (GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0)
|
|
missionSubstate = MSS_PREPARE
|
|
missionState = MS_LOSE_COPS
|
|
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID()) // Clear now - ped damage events can occur before you start checking for them B*1178888
|
|
ENDIF
|
|
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), piAmanda) > fWarnDistance
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
missionSubstate = MSS_PREPARE
|
|
missionState = MS_RETURN_TO_AMANDA
|
|
/*ELIF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
VEHICLE_INDEX viPlayer
|
|
viPlayer = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
IF NOT IS_PED_IN_VEHICLE(piAmanda, viPlayer, TRUE) AND NOT ARE_ANY_VEHICLE_SEATS_FREE(viPlayer)
|
|
//IF NOT IS_PED_IN_VEHICLE(piAmanda, viPlayer, TRUE)
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
missionSubstate = MSS_PREPARE
|
|
missionState = MS_RETURN_TO_AMANDA
|
|
ENDIF*/
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
CheckForFreeSeats()
|
|
ManagePlayerDamagesCopCarLines()
|
|
ReleaseShopkeeper()
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// The player has gone too far away from Amanda and must return to her
|
|
PROC RETURN_TO_AMANDA()
|
|
HANDLE_BUDDY_HEAD_TRACK_WHILE_ENTERING_VEHICLE()
|
|
HANDLE_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT(stateRestoreConversation, pedConvStruct, "MEA1AUD", tSavedConversationRoot, tSavedConversationLabel)
|
|
SWITCH missionSubstate
|
|
CASE MSS_PREPARE
|
|
CPRINTLN(DEBUG_MISSION,"Entering return to amanda state")
|
|
SAFE_REMOVE_BLIP(biObjective)
|
|
IF IS_PED_UNINJURED(piAmanda)
|
|
IF IS_PED_GROUP_MEMBER(piAmanda, PLAYER_GROUP_ID())
|
|
biObjective = CREATE_PED_BLIP(piAmanda, TRUE, TRUE)
|
|
IF bShowReturnObjective
|
|
PRINT_NOW("MEA1_05", DEFAULT_GOD_TEXT_TIME, 1) // Return to ~b~Amanda.
|
|
CHECK_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT_NOW(stateRestoreConversation)
|
|
bShowReturnObjective = FALSE
|
|
ENDIF
|
|
ELSE
|
|
biObjective = CREATE_VEHICLE_BLIP(viCopCar)
|
|
IF bShowReturnObjective
|
|
PRINT_NOW("MEA1_06", DEFAULT_GOD_TEXT_TIME, 1) // Get back in the ~b~cop car.
|
|
CHECK_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT_NOW(stateRestoreConversation)
|
|
bShowReturnObjective = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
iAbandonLineTimer = GET_GAME_TIMER() + 1000
|
|
missionSubstate = MSS_ACTIVE_ONE
|
|
BREAK
|
|
|
|
CASE MSS_ACTIVE_ONE
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piAmanda)
|
|
ForceAmandaIntoGroupIfInterruptedSyncScene()
|
|
IF IS_PED_GROUP_MEMBER(piAmanda, PLAYER_GROUP_ID())
|
|
/*IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
VEHICLE_INDEX viPlayer
|
|
viPlayer = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
IF IS_PED_IN_VEHICLE(piAmanda, viPlayer)
|
|
BackWithAmanda()
|
|
ENDIF
|
|
EL*/IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), piAmanda) < fReturnDistance
|
|
BackWithAmanda()
|
|
ENDIF
|
|
ELSE
|
|
IF (IS_VEHICLE_OK(viCopCar) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), viCopCar) AND IS_PED_IN_VEHICLE(piAmanda, viCopCar))
|
|
OR (NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), viCopCar) AND NOT IS_PED_IN_VEHICLE(piAmanda, viCopCar))
|
|
BackWithAmanda()
|
|
ENDIF
|
|
ENDIF
|
|
ManageAbandonLines()
|
|
|
|
IF (GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), piAmanda) > fFailDistance)
|
|
SetFailReason(MFR_AMANDA_LEFT)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ManagePlayerDamagesCopCarLines()
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// The player arrives at Michael's house with Amanda
|
|
PROC AT_HOME()
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piAmanda)
|
|
SET_PED_RESET_FLAG(piAmanda, PRF_SearchForClosestDoor, TRUE )
|
|
VEHICLE_INDEX viTemp
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
viTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
ENDIF
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
SWITCH missionSubstate
|
|
CASE MSS_PREPARE
|
|
CPRINTLN(DEBUG_MISSION,"Entering at home state")
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
KILL_PHONE_CONVERSATION()
|
|
IF IS_AUDIO_SCENE_ACTIVE("M_E_AMANDA_DRIVE_HOME")
|
|
STOP_AUDIO_SCENE("M_E_AMANDA_DRIVE_HOME")
|
|
ENDIF
|
|
VEHICLE_INDEX viBang
|
|
viBang = GET_PLAYERS_LAST_VEHICLE()
|
|
IF IS_ENTITY_ALIVE(viBang)
|
|
AND IS_ENTITY_ON_FIRE(viBang)
|
|
CPRINTLN(DEBUG_MISSION,"Entering at home state: Got player's last vehicle, removing fire")
|
|
IF GET_ENTITY_HEALTH(viBang) < 1
|
|
SET_ENTITY_HEALTH(viBang, 1)
|
|
ENDIF
|
|
IF GET_VEHICLE_ENGINE_HEALTH(viBang) < 1
|
|
SET_VEHICLE_ENGINE_HEALTH(viBang, 1)
|
|
ENDIF
|
|
IF GET_VEHICLE_PETROL_TANK_HEALTH(viBang) < 1
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(viBang, 1)
|
|
ENDIF
|
|
STOP_ENTITY_FIRE(viBang)
|
|
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(viBang), 2.5)
|
|
REMOVE_PARTICLE_FX_IN_RANGE(GET_ENTITY_COORDS(viBang), 2.5)
|
|
if not IS_ENTITY_A_MISSION_ENTITY(viBang)
|
|
SET_ENTITY_AS_MISSION_ENTITY(viBang)
|
|
ENDIF
|
|
SET_DISABLE_VEHICLE_ENGINE_FIRES(viBang, TRUE)
|
|
SET_DISABLE_VEHICLE_PETROL_TANK_FIRES(viBang, TRUE)
|
|
SAFE_RELEASE_VEHICLE(viBang)
|
|
ENDIF
|
|
SAFE_REMOVE_BLIP(biObjective)
|
|
iConvFailedTimer = -1
|
|
iWalkToHouseFailed = -1
|
|
RC_START_CUTSCENE_MODE(<<0.0,0.0,0.0>>, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE)
|
|
//iCutTimer = GET_GAME_TIMER() + 5000
|
|
ciHomeCam = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", << -840.7, 185.3, 78.4 >>, << -14.0, 0.0, -110.4 >>, 48.4)
|
|
SET_CAM_ACTIVE(ciHomeCam, TRUE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
IF IS_VEHICLE_OK(viTemp)
|
|
IF IS_VEHICLE_DOOR_DAMAGED(viTemp, SC_DOOR_FRONT_RIGHT)
|
|
SET_PED_CONFIG_FLAG(piAmanda, PCF_PedIgnoresAnimInterruptEvents, TRUE)
|
|
ENDIF
|
|
BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(viTemp)
|
|
MODEL_NAMES mnTemp
|
|
mnTemp = GET_ENTITY_MODEL(viTemp)
|
|
IF IS_THIS_MODEL_A_CAR(mnTemp) AND IS_MODEL_POLICE_VEHICLE(mnTemp)
|
|
missionSubstate = MSS_ACTIVE_ONE
|
|
ELSE
|
|
missionSubstate = MSS_ACTIVE_TWO
|
|
ENDIF
|
|
//bArrivedInVehicle = TRUE
|
|
ELSE
|
|
//SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
/*SET_ENTITY_COORDS_GROUNDED(PLAYER_PED_ID(), vOnFootEndPosMichael)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), fOnFootEndRotMichael)
|
|
CLEAR_PED_TASKS(piAmanda)
|
|
SET_ENTITY_COORDS_GROUNDED(piAmanda, vOnFootEndPosAmanda)
|
|
SET_ENTITY_HEADING(piAmanda, fOnFootEndRotAmanda)*/
|
|
//SET_GAMEPLAY_CAM_RELATIVE_HEADING(fOnFootEndCamHeading)
|
|
//SET_GAMEPLAY_CAM_RELATIVE_PITCH(fOnFootEndCamPitch)
|
|
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(vCutsceneAreaPos1, vCutsceneAreaPos2, fCutsceneAreaWidth, vCarMovePos, fCarMoveHead, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR())
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS_IMMEDIATELY(piAmanda)
|
|
SET_ENTITY_COORDS_GROUNDED(piAmanda, GET_ENTITY_COORDS(PLAYER_PED_ID())+<<2,2,0>>)
|
|
SET_ENTITY_HEADING(piAmanda, -155.84)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), -43.04)
|
|
TASK_TURN_PED_TO_FACE_ENTITY(PLAYER_PED_ID(), piAmanda)
|
|
//TASK_TURN_PED_TO_FACE_ENTITY(piAmanda, PLAYER_PED_ID())
|
|
SEQUENCE_INDEX siAmanda
|
|
OPEN_SEQUENCE_TASK(siAmanda)
|
|
//TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, GET_ENTITY_COORDS(PLAYER_PED_ID()), PEDMOVE_RUN)
|
|
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), 3000)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vKitchen, PEDMOVE_WALK)
|
|
CLOSE_SEQUENCE_TASK(siAmanda)
|
|
TASK_PERFORM_SEQUENCE(piAmanda, siAmanda)
|
|
CLEAR_SEQUENCE_TASK(siAmanda)
|
|
STOP_FIRE_IN_RANGE(vCarMovePos, 2.5)
|
|
REMOVE_PARTICLE_FX_IN_RANGE(vCarMovePos, 2.5)
|
|
missionSubstate = MSS_ACTIVE_TWO
|
|
//bArrivedInVehicle = FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MSS_ACTIVE_ONE
|
|
IF IS_VEHICLE_OK(viTemp)
|
|
BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(viTemp)
|
|
ENDIF
|
|
//IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
/*IF iConvFailedTimer = -1
|
|
iConvFailedTimer = GET_GAME_TIMER() + CONV_FAILED_TIME
|
|
ENDIF*/
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
IF CREATE_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_HOME", CONV_PRIORITY_MEDIUM)
|
|
OR CONVERSATION_TIMED_OUT(iConvFailedTimer)
|
|
//OR GET_GAME_TIMER() > iConvFailedTimer
|
|
missionSubstate = MSS_ACTIVE_THREE
|
|
ENDIF
|
|
//ENDIF
|
|
BREAK
|
|
|
|
CASE MSS_ACTIVE_TWO
|
|
IF IS_VEHICLE_OK(viTemp)
|
|
BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(viTemp)
|
|
ENDIF
|
|
//IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
/*IF iConvFailedTimer = -1
|
|
iConvFailedTimer = GET_GAME_TIMER() + CONV_FAILED_TIME
|
|
ENDIF*/
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
IF CREATE_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_HOME2", CONV_PRIORITY_MEDIUM)
|
|
OR CONVERSATION_TIMED_OUT(iConvFailedTimer)
|
|
//OR GET_GAME_TIMER() > iConvFailedTimer
|
|
missionSubstate = MSS_ACTIVE_THREE
|
|
ENDIF
|
|
//ENDIF
|
|
BREAK
|
|
|
|
CASE MSS_ACTIVE_THREE
|
|
IF IS_VEHICLE_OK(viTemp)
|
|
BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(viTemp)
|
|
ENDIF
|
|
IF IS_PED_IN_ANY_VEHICLE(piAmanda) AND IS_VEHICLE_OK(viTemp)
|
|
IF NOT IsPedPerformingTask(piAmanda, SCRIPT_TASK_PERFORM_SEQUENCE)
|
|
IF IS_VEHICLE_STOPPED(viTemp)
|
|
//TASK_LEAVE_ANY_VEHICLE(piAmanda)
|
|
SEQUENCE_INDEX siLeave
|
|
OPEN_SEQUENCE_TASK(siLeave)
|
|
TASK_LEAVE_ANY_VEHICLE(NULL)
|
|
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), 2000)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vKitchen, PEDMOVE_WALK)
|
|
CLOSE_SEQUENCE_TASK(siLeave)
|
|
TASK_PERFORM_SEQUENCE(piAmanda, siLeave)
|
|
CLEAR_SEQUENCE_TASK(siLeave)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
/*IF bArrivedInVehicle
|
|
IF NOT IsPedPerformingTask(piAmanda, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(piAmanda, vAmandaFinalDest, PEDMOVE_WALK)
|
|
ENDIF
|
|
ENDIF*/
|
|
|
|
IF IS_ENTITY_IN_RANGE_COORDS_2D(piAmanda, vAmandaFinalDest, 1.5)//3.0)
|
|
OR IS_ENTITY_IN_RANGE_COORDS_2D(piAmanda, vAmandaFinalDestRear, 1.5)//3.0)
|
|
OR CONVERSATION_TIMED_OUT(iWalkToHouseFailed, 10000)
|
|
IF IS_PLAYER_IN_FIRST_PERSON_CAMERA()
|
|
iWalkToHouseFailed = -1
|
|
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
missionSubstate = MSS_ACTIVE_FOUR
|
|
ELSE
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
RC_END_CUTSCENE_MODE()
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
DESTROY_CAM(ciHomeCam)
|
|
Mission_Passed()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MSS_ACTIVE_FOUR
|
|
IF CONVERSATION_TIMED_OUT(iWalkToHouseFailed, 300)
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
RC_END_CUTSCENE_MODE()
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
DESTROY_CAM(ciHomeCam)
|
|
Mission_Passed()
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC AT_HOTEL()
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_UNINJURED(piAmanda)
|
|
SET_PED_RESET_FLAG(piAmanda, PRF_SearchForClosestDoor, TRUE )
|
|
VEHICLE_INDEX viTemp
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
viTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
ENDIF
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
SWITCH missionSubstate
|
|
CASE MSS_PREPARE
|
|
CPRINTLN(DEBUG_MISSION,"Entering at home state")
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
KILL_PHONE_CONVERSATION()
|
|
IF IS_AUDIO_SCENE_ACTIVE("M_E_AMANDA_DRIVE_HOME")
|
|
STOP_AUDIO_SCENE("M_E_AMANDA_DRIVE_HOME")
|
|
ENDIF
|
|
SAFE_REMOVE_BLIP(biObjective)
|
|
iConvFailedTimer = -1
|
|
iWalkToHouseFailed = -1
|
|
RC_START_CUTSCENE_MODE(<<0.0,0.0,0.0>>, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE)
|
|
//iCutTimer = GET_GAME_TIMER() + 5000
|
|
ciHomeCam = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<-1392.2539, 367.9411, 75.0046>>, <<-44.2648, -0.0000, -119.8730>>, 48.4)
|
|
SET_CAM_ACTIVE(ciHomeCam, TRUE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
IF IS_VEHICLE_OK(viTemp)
|
|
BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(viTemp)
|
|
MODEL_NAMES mnTemp
|
|
mnTemp = GET_ENTITY_MODEL(viTemp)
|
|
IF IS_THIS_MODEL_A_CAR(mnTemp) AND IS_MODEL_POLICE_VEHICLE(mnTemp)
|
|
missionSubstate = MSS_ACTIVE_ONE
|
|
ELSE
|
|
missionSubstate = MSS_ACTIVE_TWO
|
|
ENDIF
|
|
//bArrivedInVehicle = TRUE
|
|
ELSE
|
|
//SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
/*SET_ENTITY_COORDS_GROUNDED(PLAYER_PED_ID(), vOnFootEndPosMichael)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), fOnFootEndRotMichael)
|
|
CLEAR_PED_TASKS(piAmanda)
|
|
SET_ENTITY_COORDS_GROUNDED(piAmanda, vOnFootEndPosAmanda)
|
|
SET_ENTITY_HEADING(piAmanda, fOnFootEndRotAmanda)*/
|
|
//SET_GAMEPLAY_CAM_RELATIVE_HEADING(fOnFootEndCamHeading)
|
|
//SET_GAMEPLAY_CAM_RELATIVE_PITCH(fOnFootEndCamPitch)
|
|
TASK_TURN_PED_TO_FACE_ENTITY(PLAYER_PED_ID(), piAmanda)
|
|
//TASK_TURN_PED_TO_FACE_ENTITY(piAmanda, PLAYER_PED_ID())
|
|
SEQUENCE_INDEX siAmanda
|
|
OPEN_SEQUENCE_TASK(siAmanda)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, GET_ENTITY_COORDS(PLAYER_PED_ID()), PEDMOVE_RUN)
|
|
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), 3000)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vHotel, PEDMOVE_WALK)
|
|
CLOSE_SEQUENCE_TASK(siAmanda)
|
|
TASK_PERFORM_SEQUENCE(piAmanda, siAmanda)
|
|
CLEAR_SEQUENCE_TASK(siAmanda)
|
|
missionSubstate = MSS_ACTIVE_TWO
|
|
//bArrivedInVehicle = FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MSS_ACTIVE_ONE
|
|
IF IS_VEHICLE_OK(viTemp)
|
|
BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(viTemp)
|
|
ENDIF
|
|
//IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
/*IF iConvFailedTimer = -1
|
|
iConvFailedTimer = GET_GAME_TIMER() + CONV_FAILED_TIME
|
|
ENDIF*/
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
IF CREATE_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_HOME", CONV_PRIORITY_MEDIUM)
|
|
OR CONVERSATION_TIMED_OUT(iConvFailedTimer)
|
|
//OR GET_GAME_TIMER() > iConvFailedTimer
|
|
missionSubstate = MSS_ACTIVE_THREE
|
|
ENDIF
|
|
//ENDIF
|
|
BREAK
|
|
|
|
CASE MSS_ACTIVE_TWO
|
|
IF IS_VEHICLE_OK(viTemp)
|
|
BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(viTemp)
|
|
ENDIF
|
|
//IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
/*IF iConvFailedTimer = -1
|
|
iConvFailedTimer = GET_GAME_TIMER() + CONV_FAILED_TIME
|
|
ENDIF*/
|
|
ADD_PED_FOR_DIALOGUE(pedConvStruct, AMANDA_ID, piAmanda, "AMANDA", TRUE)
|
|
IF CREATE_CONVERSATION(pedConvStruct, "MEA1AUD", "MEA1_HOME2", CONV_PRIORITY_MEDIUM)
|
|
OR CONVERSATION_TIMED_OUT(iConvFailedTimer)
|
|
//OR GET_GAME_TIMER() > iConvFailedTimer
|
|
missionSubstate = MSS_ACTIVE_THREE
|
|
ENDIF
|
|
//ENDIF
|
|
BREAK
|
|
|
|
CASE MSS_ACTIVE_THREE
|
|
IF IS_VEHICLE_OK(viTemp)
|
|
BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(viTemp)
|
|
ENDIF
|
|
IF IS_PED_IN_ANY_VEHICLE(piAmanda) AND IS_VEHICLE_OK(viTemp)
|
|
IF NOT IsPedPerformingTask(piAmanda, SCRIPT_TASK_LEAVE_ANY_VEHICLE)
|
|
IF IS_VEHICLE_STOPPED(viTemp)
|
|
//TASK_LEAVE_ANY_VEHICLE(piAmanda)
|
|
SEQUENCE_INDEX siLeave
|
|
OPEN_SEQUENCE_TASK(siLeave)
|
|
TASK_LEAVE_ANY_VEHICLE(NULL)
|
|
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), 2000)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vHotel, PEDMOVE_WALK)
|
|
CLOSE_SEQUENCE_TASK(siLeave)
|
|
TASK_PERFORM_SEQUENCE(piAmanda, siLeave)
|
|
CLEAR_SEQUENCE_TASK(siLeave)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
/*IF bArrivedInVehicle
|
|
IF NOT IsPedPerformingTask(piAmanda, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(piAmanda, vAmandaFinalDest, PEDMOVE_WALK)
|
|
ENDIF
|
|
ENDIF*/
|
|
|
|
IF /*NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND*/ IS_ENTITY_IN_RANGE_COORDS_2D(piAmanda, vHotel, 1.5)//3.0)
|
|
OR CONVERSATION_TIMED_OUT(iWalkToHouseFailed, 10000)
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
RC_END_CUTSCENE_MODE()
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
DESTROY_CAM(ciHomeCam)
|
|
Mission_Passed()
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Fades out and fails the mission with a delay if needed
|
|
PROC FAIL_DELAY()
|
|
SWITCH missionSubstate
|
|
CASE MSS_PREPARE
|
|
CLEAR_PRINTS()
|
|
SAFE_REMOVE_BLIP(biObjective)
|
|
|
|
IF DOES_ENTITY_EXIST(piAmanda)
|
|
IF IS_PED_INJURED(piAmanda)
|
|
missionFailedReason = MFR_AMANDA_DEAD
|
|
ELSE
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(piAmanda, PLAYER_PED_ID())
|
|
missionFailedReason = MFR_AMANDA_HURT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
STRING sFailReason
|
|
|
|
SWITCH missionFailedReason
|
|
CASE MFR_NONE
|
|
// no fail reason
|
|
BREAK
|
|
|
|
CASE MFR_AMANDA_HURT
|
|
sFailReason = "MEA1_FAIL4" // You injured Amanda.
|
|
BREAK
|
|
|
|
CASE MFR_AMANDA_DEAD
|
|
sFailReason = "MEA1_FAIL1" // Amanda died.
|
|
BREAK
|
|
|
|
CASE MFR_AMANDA_ARRESTED
|
|
sFailReason = "MEA1_FAIL2" // Amanda was arrested.
|
|
BREAK
|
|
|
|
CASE MFR_AMANDA_LEFT
|
|
sFailReason = "MEA1_FAIL3" // You abandoned Amanda.
|
|
BREAK
|
|
|
|
CASE MFR_TRASHED_CAR
|
|
sFailReason = "MEA1_FAIL5" // ~r~You trashed the cop car.
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
|
|
IF missionFailedReason = MFR_NONE
|
|
Mission_Flow_Mission_Failed()
|
|
ELSE
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON(sFailReason)
|
|
ENDIF
|
|
|
|
missionSubstate = MSS_ACTIVE_ONE
|
|
BREAK
|
|
|
|
CASE MSS_ACTIVE_ONE
|
|
|
|
IF GET_MISSION_FLOW_SAFE_TO_CLEANUP()
|
|
|
|
// must only take 1 frame and terminate the thread
|
|
CPRINTLN(DEBUG_MISSION,"...ME_Amanda1 Failed")
|
|
RemovePedsAndVehicles(TRUE)
|
|
Mission_Cleanup(TRUE)
|
|
ELSE
|
|
// not finished fading out
|
|
// you may want to handle dialogue etc here.
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
// ===========================================================================================================
|
|
// Script Loop
|
|
// ===========================================================================================================
|
|
SCRIPT
|
|
CPRINTLN(DEBUG_MISSION,"ME Amanda 1 launched")
|
|
|
|
IF (HAS_FORCE_CLEANUP_OCCURRED())
|
|
CPRINTLN(DEBUG_MISSION,"...ME_Amanda1 Force Cleanup")
|
|
Mission_Flow_Mission_Force_Cleanup()
|
|
Mission_Cleanup(TRUE)
|
|
ENDIF
|
|
|
|
SET_MISSION_FLAG(TRUE)
|
|
|
|
WHILE (TRUE)
|
|
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_TGH")
|
|
IF IS_PED_UNINJURED(piAmanda)
|
|
SET_PED_RESET_FLAG(piAmanda, PRF_CannotBeTargetedByAI, TRUE)
|
|
ENDIF
|
|
AmandasBagManager()
|
|
SWITCH missionState
|
|
CASE MS_INIT
|
|
INIT()
|
|
BREAK
|
|
CASE MS_DRIVE_TO_SHOP
|
|
DRIVE_TO_SHOP()
|
|
BREAK
|
|
|
|
CASE MS_RESCUE_AMANDA
|
|
RESCUE_AMANDA()
|
|
BREAK
|
|
|
|
CASE MS_LOSE_COPS
|
|
LOSE_COPS()
|
|
BREAK
|
|
|
|
CASE MS_DRIVE_HOME
|
|
DRIVE_HOME()
|
|
BREAK
|
|
|
|
CASE MS_RETURN_TO_AMANDA
|
|
RETURN_TO_AMANDA()
|
|
BREAK
|
|
|
|
CASE MS_AT_HOME
|
|
AT_HOME()
|
|
BREAK
|
|
|
|
CASE MS_AT_HOTEL
|
|
AT_HOTEL()
|
|
BREAK
|
|
|
|
CASE MS_FAIL_DELAY
|
|
FAIL_DELAY()
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
CheckAmanda()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF missionState <> MS_FAIL_DELAY
|
|
// Check for Pass
|
|
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S))
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
CLEAR_PRINTS()
|
|
DebugPassDealWithAmanda()
|
|
Mission_Passed()
|
|
ENDIF
|
|
|
|
// Check for Fail
|
|
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
|
|
IF missionState = MS_AT_HOME
|
|
RC_END_CUTSCENE_MODE()
|
|
ENDIF
|
|
SetFailReason(MFR_NONE)
|
|
ENDIF
|
|
|
|
CheckDebugKeys()
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
// Script should never reach here. Always terminate with cleanup function.
|
|
ENDSCRIPT
|