Files
gtav-src/script/dev_ng/singleplayer/include/private/friendActivity_bar_private.sch
T
2025-09-29 00:52:08 +02:00

854 lines
28 KiB
Scheme
Executable File

// _________________________________________________________________________________________
// _________________________________________________________________________________________
// ___ ___
// ___ Author: Alwyn Roberts Date: 04/10/2010 ___
//- commands headers -//
//- script headers -//
//- public headers -//
USING "cutscene_public.sch"
USING "rc_helper_functions.sch"
USING "friendActivity_public.sch"
//- private headers -//
USING "friendActivity_private.sch"
#IF IS_DEBUG_BUILD
//- debug headers -//
#ENDIF
///private cutscene header for friend activity scripts
/// sam.hackett@rockstarleeds.com
///
//-------------------------------------------------------------------------------------------------------------------------------------------
// VARIABLES
//-------------------------------------------------------------------------------------------------------------------------------------------
// Constants
//CONST_INT CONST_iCutsceneStartPanDuration 5000//5000//DEFAULT_GOD_TEXT_TIME
CONST_INT CONST_iCutsceneTimeshiftDuration 2500
CONST_INT CONST_iCutsceneEndPanDuration 5000//5000//DEFAULT_GOD_TEXT_TIME
CONST_INT CONST_iCutsceneSkipDuration 500
// Vars
CAMERA_INDEX hBarCams[2]
BOOL bAddedDrunkTime = FALSE
structTimelapse sTimelapse
INT iTOD_DestHour
INT iTOD_DestMin
INT iTOD_SkipTotalHours
//-------------------------------------------------------------------------------------------------------------------------------------------
// UTILS
//-------------------------------------------------------------------------------------------------------------------------------------------
FUNC BOOL RC_IS_CUTSCENE_OK_TO_START_NO_DIALOGUE_WAIT(FLOAT stopping_distance = 10.0)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF NOT BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), stopping_distance, 1)
RETURN FALSE
ENDIF
IF NOT IS_VEHICLE_ON_ALL_WHEELS(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
RETURN FALSE
ENDIF
ELSE
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_BRAKE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HANDBRAKE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_DUCK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_LR)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_UD)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HEADLIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HORN)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_NEXT_RADIO)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_PREV_RADIO)
ENDIF
RETURN TRUE
ENDFUNC
PROC Private_GetActivityScenePedPosBoundingBox(structFActivityScene& scene, VECTOR& vMin, VECTOR& vMax)
vMin = scene.vPedPPos[0]
vMax = scene.vPedPPos[0]
INT i
REPEAT 9 i
VECTOR vPos
IF i = 0 vPos = scene.vPedPPos[0]
ELIF i = 1 vPos = scene.vPedPPos[1]
ELIF i = 2 vPos = scene.vPedPPos[2]
ELIF i = 3 vPos = scene.vPedAPos[0]
ELIF i = 4 vPos = scene.vPedAPos[1]
ELIF i = 5 vPos = scene.vPedAPos[2]
ELIF i = 6 vPos = scene.vPedBPos[0]
ELIF i = 7 vPos = scene.vPedBPos[1]
ELIF i = 8 vPos = scene.vPedBPos[2]
ENDIF
IF scene.bIsCinema = FALSE OR ((i % 3) <> 2)
IF vPos.x < vMin.x vMin.x = vPos.x ENDIF
IF vPos.y < vMin.y vMin.y = vPos.y ENDIF
IF vPos.z < vMin.z vMin.z = vPos.z ENDIF
IF vPos.x > vMax.x vMax.x = vPos.x ENDIF
IF vPos.y > vMax.y vMax.y = vPos.y ENDIF
IF vPos.z > vMax.z vMax.z = vPos.z ENDIF
ENDIF
ENDREPEAT
vMin -= << 0.5, 0.5, 2.5 >>
vMax += << 0.5, 0.5, 2.5 >>
ENDPROC
PROC Private_SetCinemaCatchupCam(enumActivityLocation eLoc)
// Set timeshift cam
CAMERA_INDEX hNewCam = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
IF DOES_CAM_EXIST(hNewCam)
SWITCH eLoc
CASE ALOC_cinema_downtown
SET_CAM_COORD(hNewCam, <<397.2, -716.2, 29.9>>)
SET_CAM_ROT(hNewCam, <<-4.0, 0.0, -9.3>>)
SET_CAM_FOV(hNewCam, 50.0)
BREAK
CASE ALOC_cinema_morningwood
SET_CAM_COORD(hNewCam, <<-1411.5, -200.6, 47.8>>)
SET_CAM_ROT(hNewCam, <<-3.8, 0.0, 19.7>>)
SET_CAM_FOV(hNewCam, 50.0)
BREAK
CASE ALOC_cinema_vinewood
SET_CAM_COORD(hNewCam, <<298.9, 200.8, 105.0>>)
SET_CAM_ROT(hNewCam, <<-7.6, 0.0, 161.6>>)
SET_CAM_FOV(hNewCam, 50.0)
BREAK
DEFAULT
EXIT
BREAK
ENDSWITCH
IF DOES_CAM_EXIST(hBarCams[0])
DESTROY_CAM(hBarCams[0])
ENDIF
IF DOES_CAM_EXIST(hBarCams[1])
DESTROY_CAM(hBarCams[1])
ENDIF
SET_CAM_ACTIVE(hNewCam, TRUE)
hBarCams[0] = hNewCam
ENDIF
ENDPROC
PROC Private_ChargePedForBar(PED_INDEX hPed, enumActivityLocation eLoc, INT iDebitAmount)
BANK_ACCOUNT_ACTION_SOURCE_BAAC eDebitor = BAAC_UNLOGGED_SMALL_ACTION
SWITCH eLoc
CASE ALOC_bar_bahamas eDebitor = BAAC_BAHAMAMAMAS BREAK
CASE ALOC_bar_baybar eDebitor = BAAC_BAY_BAR BREAK
CASE ALOC_bar_biker eDebitor = BAAC_BIKER_BAR BREAK
CASE ALOC_bar_downtown eDebitor = BAAC_SHENANIGANS_BAR BREAK
CASE ALOC_bar_himen eDebitor = BAAC_HIMEN_BAR BREAK
CASE ALOC_bar_mojitos eDebitor = BAAC_MOJITOS_BAR BREAK
CASE ALOC_bar_singletons eDebitor = BAAC_SINGLETONS_BAR BREAK
ENDSWITCH
enumCharacterList eChar = Private_GetCharFromPed(hPed)
IF eChar = CHAR_MICHAEL
OR eChar = CHAR_FRANKLIN
OR eChar = CHAR_TREVOR
INT iCash = GET_TOTAL_CASH(eChar)
IF iCash > iDebitAmount
DEBIT_BANK_ACCOUNT(eChar, eDebitor, iDebitAmount)
ELIF iCash > 0
DEBIT_BANK_ACCOUNT(eChar, eDebitor, iCash)
ENDIF
ENDIF
ENDPROC
PROC Private_UpdateStockExchange(enumActivityLocation eLoc)
IF eLoc = ALOC_bar_bahamas
OR eLoc = ALOC_bar_himen
OR eLoc = ALOC_bar_singletons
BAWSAQ_INCREMENT_MODIFIER(BSMF_SM_PUBCLUB) //call on taking friends to a club
ELSE
BAWSAQ_INCREMENT_MODIFIER(BSMF_SM_FRNPUB) //call on taking friends to a pub
ENDIF
ENDPROC
//-------------------------------------------------------------------------------------------------------------------------------------------
// BAR SCENE
//-------------------------------------------------------------------------------------------------------------------------------------------
FUNC BOOL Private_ProcessActivityScene(enumActivityLocation eLoc, structFActivityScene& scene, INT& iStage, PED_INDEX hFriendA, PED_INDEX hFriendB, structPedsForConversation& convPeds)
//-- Fade out if skip is pressed --
CPRINTLN(DEBUG_FRIENDS, "Private_ProcessActivityScene() A - ", iStage)
IF scene.bIsCinema = FALSE
IF iStage > 0
AND iStage < 4
IF IS_SCREEN_FADED_OUT()
ADD_TO_CLOCK_TIME(iTOD_SkipTotalHours, 0, 0)
iStage = 98
RETURN FALSE
ELIF NOT IS_SCREEN_FADING_IN()
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
DO_SCREEN_FADE_OUT(CONST_iCutsceneSkipDuration)
ENDIF
ENDIF
ENDIF
IF iStage < 3
REQUEST_SCRIPT_AUDIO_BANK("TIME_LAPSE")
ENDIF
ENDIF
// IF iStage >= 0
// AND iStage < 100
// SET_EVERYONE_IGNORE_PLAYER(PLAYER_ID(), TRUE)
// ENDIF
CPRINTLN(DEBUG_FRIENDS, "Private_ProcessActivityScene() B - ", iStage)
// Disable player pressing PS4 touchpad during cutscene (for some reason that can cause problem during this scene)
IF iStage != -1
DISABLE_CAMERA_VIEW_MODE_CYCLE(PLAYER_ID())
// DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
ENDIF
//------------------------------------------------------------------------
IF iStage = 0
IF RC_IS_CUTSCENE_OK_TO_START_NO_DIALOGUE_WAIT(5.0)
RC_START_CUTSCENE_MODE(scene.vPedPPos[0], TRUE, TRUE, FALSE, FALSE, FALSE)
bAddedDrunkTime = FALSE
// Clear larger area of vehicles (for camera)
CLEAR_ANGLED_AREA_OF_VEHICLES(scene.vClearA, scene.vClearB, scene.fClearW, TRUE)
SET_ROADS_IN_ANGLED_AREA(scene.vClearA, scene.vClearB, scene.fClearW, FALSE, FALSE)
// Clear smaller area of peds (for walking)
VECTOR vPedPosMin, vPedPosMax
Private_GetActivityScenePedPosBoundingBox(scene, vPedPosMin, vPedPosMax)
SET_PED_PATHS_IN_AREA(vPedPosMin, vPedPosMax, FALSE)
CLEAR_AREA((vPedPosMin+vPedPosMax)*0.5, VDIST(vPedPosMax, vPedPosMin)*0.5, TRUE)
SEQUENCE_INDEX seq
SETTIMERA(0)
INT iDebitAmount = GET_RANDOM_INT_IN_RANGE(25, 35)
iTOD_SkipTotalHours = GET_RANDOM_INT_IN_RANGE(2, 4)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
// Set car position
Private_RespotVehicleForActivity(GET_PLAYERS_LAST_VEHICLE(), eLoc)
//-- Set ped positions + tasks
IF IS_PED_UNINJURED(hFriendA)
// Set player pos + tasks
SET_ENTITY_COORDS(PLAYER_PED_ID(), scene.vPedPPos[0])
SET_ENTITY_FACING(PLAYER_PED_ID(), scene.vPedPPos[1])
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
STOP_PED_SPEAKING(PLAYER_PED_ID(), TRUE)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_NAV_MESH_TO_COORD(null, scene.vPedPPos[1], PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_ACCURATE_WALKRUN_START)
IF scene.bIsCinema AND NOT IS_PED_DRUNK(PLAYER_PED_ID())
TASK_TURN_PED_TO_FACE_ENTITY(null, hFriendA)
ENDIF
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), seq)
CLEAR_SEQUENCE_TASK(seq)
// Set friend A pos + tasks
SET_ENTITY_COORDS(hFriendA, scene.vPedAPos[0])
SET_ENTITY_FACING(hFriendA, scene.vPedAPos[1])
CLEAR_PED_TASKS_IMMEDIATELY(hFriendA)
SET_PED_STEALTH_MOVEMENT(hFriendA, FALSE)
SET_CURRENT_PED_WEAPON(hFriendA, WEAPONTYPE_UNARMED, TRUE)
STOP_PED_SPEAKING(hFriendA, TRUE)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_NAV_MESH_TO_COORD(null, scene.vPedAPos[1], PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP)
IF scene.bIsCinema AND NOT IS_PED_DRUNK(hFriendA)
TASK_TURN_PED_TO_FACE_ENTITY(null, PLAYER_PED_ID())
ENDIF
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(hFriendA, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
IF IS_PED_UNINJURED(hFriendB)
SET_ENTITY_COORDS(hFriendB, scene.vPedBPos[0])
SET_ENTITY_FACING(hFriendB, scene.vPedBPos[1])
CLEAR_PED_TASKS_IMMEDIATELY(hFriendB)
SET_PED_STEALTH_MOVEMENT(hFriendB, FALSE)
SET_CURRENT_PED_WEAPON(hFriendB, WEAPONTYPE_UNARMED, TRUE)
STOP_PED_SPEAKING(hFriendB, TRUE)
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_NAV_MESH_TO_COORD(null, scene.vPedBPos[1], PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP)
IF scene.bIsCinema AND NOT IS_PED_DRUNK(hFriendB)
TASK_TURN_PED_TO_FACE_ENTITY(null, PLAYER_PED_ID())
ENDIF
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(hFriendB, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
// Charge player/friends
IF scene.bIsCinema = FALSE
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
Private_ChargePedForBar(PLAYER_PED_ID(), eLoc, iDebitAmount)
ENDIF
IF NOT IS_PED_INJURED(hFriendA)
Private_ChargePedForBar(hFriendA, eLoc, iDebitAmount)
ENDIF
IF NOT IS_PED_INJURED(hFriendB)
Private_ChargePedForBar(hFriendB, eLoc, iDebitAmount)
ENDIF
Private_UpdateStockExchange(eLoc)
ENDIF
//-- Start first cam pan
hBarCams[0] = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
SET_CAM_COORD(hBarCams[0], scene.mCamPanA[0].vPos)
SET_CAM_ROT(hBarCams[0], scene.mCamPanA[0].vRot)
SET_CAM_FOV(hBarCams[0], scene.fCamPanAFov)
hBarCams[1] = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
SET_CAM_COORD(hBarCams[1], scene.mCamPanA[1].vPos)
SET_CAM_ROT(hBarCams[1], scene.mCamPanA[1].vRot)
SET_CAM_FOV(hBarCams[1], scene.fCamPanAFov)
// Start camera pan
FLOAT fPanADuration = scene.fPanADurationNormal
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_DRUNK(PLAYER_PED_ID())
fPanADuration = scene.fPanADurationDrunk
ENDIF
SET_CAM_ACTIVE_WITH_INTERP(hBarCams[1], hBarCams[0], FLOOR(fPanADuration * 1000.0))
// SHAKE_CAM(hBarCams[0], "HAND_SHAKE", 1.0)
// SHAKE_CAM(hBarCams[1], "HAND_SHAKE", 1.0)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
ENDIF
IF NOT IS_SCREEN_FADED_IN()
DO_SCREEN_FADE_IN(1000)
ENDIF
iStage++
ENDIF
ELIF iStage = 1
IF scene.bIsCinema
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
AND NOT IS_PED_INJURED(hFriendA)
IF TIMERA() > 1000
TEXT_LABEL tBlock, tRoot
enumCharacterList ePlayerChar, eFriendChar
ePlayerChar = GET_CURRENT_PLAYER_PED_ENUM()
eFriendChar = Private_GetCharFromPed(hFriendA)
// Try to do special Michael/Franklin Meltdown dialogue
IF g_ePreviousActivityResult = AR_playerDraw
AND ePlayerChar = CHAR_FRANKLIN
AND eFriendChar = CHAR_MICHAEL
AND NOT Is_Ped_Drunk(PLAYER_PED_ID())
AND Private_GetFriendActivityPhrase(ePlayerChar, eFriendChar, FAP_COMMENT_MELTDOWN, tBlock, tRoot)
IF TIMERA() > FLOOR(scene.fPanADurationNormal * 1000.0)
OR CREATE_CONVERSATION(convPeds, tBlock, tRoot, CONV_PRIORITY_AMBIENT_HIGH, DISPLAY_SUBTITLES)
iStage++
ENDIF
// Otherwise do normal dialogue
ELSE
IF g_ePreviousActivityResult = AR_playerDraw
g_ePreviousActivityResult = AR_playerWon
ENDIF
IF NOT Private_GetFriendActivityResult(ePlayerChar, eFriendChar, ALOC_cinema_downtown, g_ePreviousActivityResult, Is_Ped_Drunk(PLAYER_PED_ID()), tBlock, tRoot)
OR CREATE_CONVERSATION(convPeds, tBlock, tRoot, CONV_PRIORITY_AMBIENT_HIGH, DISPLAY_SUBTITLES)
OR TIMERA() > FLOOR(scene.fPanADurationNormal * 1000.0)
iStage++
ENDIF
ENDIF
ENDIF
ELSE
iStage++
ENDIF
ELIF iStage = 2
// Wait for a few seconds (or for skip button)
FLOAT fPanADuration = scene.fPanADurationNormal
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_DRUNK(PLAYER_PED_ID())
fPanADuration = scene.fPanADurationDrunk
ENDIF
IF TIMERA() > FLOOR(fPanADuration * 1000.0)
IF scene.bIsCinema
IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
iStage = 50
ELSE
Private_SetCinemaCatchupCam(eLoc)
iStage = 100
ENDIF
ELSE
IF DOES_CAM_EXIST(hBarCams[0])
DESTROY_CAM(hBarCams[0])
ENDIF
// Set timeshift cam
hBarCams[0] = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
SET_CAM_COORD(hBarCams[0], scene.mCamTime.vPos)
SET_CAM_ROT(hBarCams[0], scene.mCamTime.vRot)
SET_CAM_FOV(hBarCams[0], scene.fCamTimeFov)
// SHAKE_CAM(hBarCams[0], "HAND_SHAKE", 1.0)
SET_CAM_ACTIVE(hBarCams[0], TRUE)
// Clear dialogue/prints
STOP_SCRIPTED_CONVERSATION(FALSE)
CLEAR_PRINTS()
// Make peds drunk
INT iDrunkTime = 55
IF (NOT IS_PED_INJURED(PLAYER_PED_ID()) AND Private_GetCharFromPed(PLAYER_PED_ID()) = CHAR_TREVOR)
OR (NOT IS_PED_INJURED(hFriendA) AND Private_GetCharFromPed(hFriendA) = CHAR_TREVOR)
OR (NOT IS_PED_INJURED(hFriendB) AND Private_GetCharFromPed(hFriendB) = CHAR_TREVOR)
iDrunkTime = 75
ENDIF
iDrunkTime += (CONST_iCutsceneTimeshiftDuration / 1000)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
IF NOT IS_PED_DRUNK(PLAYER_PED_ID())
MAKE_PED_DRUNK(PLAYER_PED_ID(), iDrunkTime*1000)
ELSE
EXTEND_OVERALL_DRUNK_TIME(PLAYER_PED_ID(), iDrunkTime*1000)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(hFriendA)
CLEAR_PED_TASKS_IMMEDIATELY(hFriendA)
IF NOT IS_PED_DRUNK(hFriendA)
MAKE_PED_DRUNK(hFriendA, iDrunkTime*1000)
ELSE
EXTEND_OVERALL_DRUNK_TIME(hFriendA, iDrunkTime*1000)
ENDIF
ENDIF
IF IS_PED_UNINJURED(hFriendB)
CLEAR_PED_TASKS_IMMEDIATELY(hFriendB)
IF NOT IS_PED_DRUNK(hFriendB)
MAKE_PED_DRUNK(hFriendB, iDrunkTime*1000)
ELSE
EXTEND_OVERALL_DRUNK_TIME(hFriendB, iDrunkTime*1000)
ENDIF
ENDIF
bAddedDrunkTime = TRUE
SETTIMERA(0)
iStage++
ENDIF
ENDIF
ELIF iStage = 3
IF REQUEST_SCRIPT_AUDIO_BANK("TIME_LAPSE")
sTimelapse.splineCamera = CREATE_CAM("DEFAULT_SPLINE_CAMERA")
ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera, scene.mCamTime.vPos, scene.mCamTime.vRot, CONST_iCutsceneTimeshiftDuration)
ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera, scene.mCamTime.vPos, scene.mCamTime.vRot, CONST_iCutsceneTimeshiftDuration)
SET_CAM_FOV(sTimelapse.splineCamera, scene.fCamTimeFov)
SET_CAM_ACTIVE(sTimelapse.splineCamera, TRUE)
sTimelapse.sStartTimeOfDay = GET_CURRENT_TIMEOFDAY()
sTimelapse.currentTimeOfDay = GET_CURRENT_TIMEOFDAY()
SET_TODS_CUTSCENE_RUNNING(sTimelapse, TRUE)
iTOD_DestHour = (GET_CLOCK_HOURS() + iTOD_SkipTotalHours) % 24
iTOD_DestMin = GET_CLOCK_MINUTES()
iStage++
ENDIF
ELIF iStage = 4
IF SKIP_TO_TIME_DURING_SPLINE_CAMERA(iTOD_DestHour, iTOD_DestMin, "", "", sTimelapse)
iStage++
ENDIF
ELIF iStage = 5
SEQUENCE_INDEX seq
SETTIMERA(0)
//-- Set ped positions + tasks
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
// Set player pos + tasks
SET_ENTITY_COORDS(PLAYER_PED_ID(), scene.vPedPPos[1])
SET_ENTITY_FACING(PLAYER_PED_ID(), scene.vPedPPos[2])
OPEN_SEQUENCE_TASK(seq)
TASK_FOLLOW_NAV_MESH_TO_COORD(null, scene.vPedPPos[2], PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_SUPPRESS_EXACT_STOP)
// TASK_TURN_PED_TO_FACE_ENTITY(null, hFriendA)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), seq)
CLEAR_SEQUENCE_TASK(seq)
// Walk out of bar
IF NOT IS_PED_INJURED(hFriendA)
SET_ENTITY_COORDS(hFriendA, scene.vPedAPos[1])
SET_ENTITY_FACING(hFriendA, scene.vPedAPos[2])
IF IS_PED_GROUP_MEMBER(hFriendA, PLAYER_GROUP_ID())
REMOVE_PED_FROM_GROUP(hFriendA)
ENDIF
OPEN_SEQUENCE_TASK(seq)
TASK_PAUSE(null, 250)
TASK_FOLLOW_NAV_MESH_TO_COORD(null, scene.vPedAPos[2], PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_SUPPRESS_EXACT_STOP)
// TASK_TURN_PED_TO_FACE_ENTITY(null, PLAYER_PED_ID())
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(hFriendA, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
IF IS_PED_UNINJURED(hFriendB)
SET_ENTITY_COORDS(hFriendB, scene.vPedBPos[1])
SET_ENTITY_FACING(hFriendB, scene.vPedBPos[2])
IF IS_PED_GROUP_MEMBER(hFriendB, PLAYER_GROUP_ID())
REMOVE_PED_FROM_GROUP(hFriendB)
ENDIF
OPEN_SEQUENCE_TASK(seq)
TASK_PAUSE(null, 1200)
TASK_FOLLOW_NAV_MESH_TO_COORD(null, scene.vPedBPos[2], PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_SUPPRESS_EXACT_STOP)
// TASK_TURN_PED_TO_FACE_ENTITY(null, PLAYER_PED_ID())
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(hFriendB, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
//-- Start end cam pan
IF DOES_CAM_EXIST(hBarCams[0])
DESTROY_CAM(hBarCams[0])
ENDIF
IF DOES_CAM_EXIST(hBarCams[1])
DESTROY_CAM(hBarCams[1])
ENDIF
// SET_TODS_CUTSCENE_RUNNING(sTimelapse, FALSE)
SET_TODS_CUTSCENE_RUNNING(sTimelapse, FALSE, FALSE, DEFAULT, TRUE, FALSE)
hBarCams[0] = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
SET_CAM_COORD(hBarCams[0], scene.mCamPanB[0].vPos)
SET_CAM_ROT(hBarCams[0], scene.mCamPanB[0].vRot)
SET_CAM_FOV(hBarCams[0], scene.fCamPanBFov)
hBarCams[1] = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
SET_CAM_COORD(hBarCams[1], scene.mCamPanB[1].vPos)
SET_CAM_ROT(hBarCams[1], scene.mCamPanB[1].vRot)
SET_CAM_FOV(hBarCams[1], scene.fCamPanBFov)
// Start camera pan
// SHAKE_CAM(hBarCams[0], "HAND_SHAKE", 1.0)
// SHAKE_CAM(hBarCams[1], "HAND_SHAKE", 1.0)
SET_CAM_ACTIVE_WITH_INTERP(hBarCams[1], hBarCams[0], CONST_iCutsceneEndPanDuration)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
ENDIF
IF eLoc = ALOC_bar_biker
CLEAR_AREA_OF_PEDS(scene.vPedPPos[0], 300.0)
CLEAR_AREA_OF_PROJECTILES(scene.vPedPPos[0], 300.0)
ENDIF
iStage++
ELIF iStage = 6
// Wait for a few seconds (or for skip button)
IF TIMERA() > CONST_iCutsceneEndPanDuration
// Set drunk cam
INT iDrunkTime = 55
IF (NOT IS_PED_INJURED(PLAYER_PED_ID()) AND Private_GetCharFromPed(PLAYER_PED_ID()) = CHAR_TREVOR)
OR (NOT IS_PED_INJURED(hFriendA) AND Private_GetCharFromPed(hFriendA) = CHAR_TREVOR)
OR (NOT IS_PED_INJURED(hFriendB) AND Private_GetCharFromPed(hFriendB) = CHAR_TREVOR)
iDrunkTime = 75
ENDIF
Activate_Drunk_Camera(iDrunkTime*1000)
g_drunkCameraTimeCycleModifier = 0.25
g_drunkCameraTimeCycleName = "DRUNK"
IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
iStage = 50
ELSE
// Execute extra catchup cam if included
IF scene.bExtraCatchupCam
IF DOES_CAM_EXIST(hBarCams[1])
DESTROY_CAM(hBarCams[1])
ENDIF
hBarCams[1] = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
SET_CAM_COORD(hBarCams[1], scene.mCamCatch.vPos)
SET_CAM_ROT(hBarCams[1], scene.mCamCatch.vRot)
SET_CAM_FOV(hBarCams[1], scene.fCamCatchFov)
SET_CAM_ACTIVE(hBarCams[1], TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
ENDIF
iStage = 100
ENDIF
ENDIF
//-- 1st person end transition
ELIF iStage = 50
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
SETTIMERA(0)
iStage++
ELIF iStage = 51
IF TIMERA() > 300
iStage = 100
ENDIF
//-- Skip scene
ELIF iStage = 98
// Set camera
IF DOES_CAM_EXIST(hBarCams[0])
DESTROY_CAM(hBarCams[0])
ENDIF
IF DOES_CAM_EXIST(hBarCams[1])
DESTROY_CAM(hBarCams[1])
ENDIF
hBarCams[1] = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
IF scene.bExtraCatchupCam = FALSE
SET_CAM_COORD(hBarCams[1], scene.mCamPanB[1].vPos)
SET_CAM_ROT(hBarCams[1], scene.mCamPanB[1].vRot)
SET_CAM_FOV(hBarCams[1], scene.fCamPanBFov)
ELSE
SET_CAM_COORD(hBarCams[1], scene.mCamCatch.vPos)
SET_CAM_ROT(hBarCams[1], scene.mCamCatch.vRot)
SET_CAM_FOV(hBarCams[1], scene.fCamCatchFov)
ENDIF
SET_CAM_ACTIVE(hBarCams[1], TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
//-- Set ped positions to end of scene
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), scene.vPedPPos[2])
SET_ENTITY_FACING(PLAYER_PED_ID(), scene.vPedPPos[2] + (scene.vPedPPos[2] - scene.vPedPPos[1]))
ENDIF
// Set friend A pos
IF NOT IS_PED_INJURED(hFriendA)
SET_ENTITY_COORDS(hFriendA, scene.vPedAPos[2])
SET_ENTITY_FACING(hFriendA, scene.vPedAPos[2] + (scene.vPedAPos[2] - scene.vPedAPos[1]))
IF IS_PED_GROUP_MEMBER(hFriendA, PLAYER_GROUP_ID())
REMOVE_PED_FROM_GROUP(hFriendA)
ENDIF
ENDIF
// Set friend B pos
IF IS_PED_UNINJURED(hFriendB)
SET_ENTITY_COORDS(hFriendB, scene.vPedBPos[2])
SET_ENTITY_FACING(hFriendB, scene.vPedBPos[2] + (scene.vPedBPos[2] - scene.vPedBPos[1]))
IF IS_PED_GROUP_MEMBER(hFriendB, PLAYER_GROUP_ID())
REMOVE_PED_FROM_GROUP(hFriendB)
ENDIF
ENDIF
// Make peds drunk
INT iDrunkTime = 55
IF (NOT IS_PED_INJURED(PLAYER_PED_ID()) AND Private_GetCharFromPed(PLAYER_PED_ID()) = CHAR_TREVOR)
OR (NOT IS_PED_INJURED(hFriendA) AND Private_GetCharFromPed(hFriendA) = CHAR_TREVOR)
OR (NOT IS_PED_INJURED(hFriendB) AND Private_GetCharFromPed(hFriendB) = CHAR_TREVOR)
iDrunkTime = 75
ENDIF
Activate_Drunk_Camera(iDrunkTime*1000)
g_drunkCameraTimeCycleModifier = 0.25
g_drunkCameraTimeCycleName = "DRUNK"
iDrunkTime += 1
IF bAddedDrunkTime = FALSE
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
IF NOT IS_PED_DRUNK(PLAYER_PED_ID())
MAKE_PED_DRUNK(PLAYER_PED_ID(), iDrunkTime*1000)
ELSE
EXTEND_OVERALL_DRUNK_TIME(PLAYER_PED_ID(), iDrunkTime*1000)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(hFriendA)
CLEAR_PED_TASKS_IMMEDIATELY(hFriendA)
IF NOT IS_PED_DRUNK(hFriendA)
MAKE_PED_DRUNK(hFriendA, iDrunkTime*1000)
ELSE
EXTEND_OVERALL_DRUNK_TIME(hFriendA, iDrunkTime*1000)
ENDIF
ENDIF
IF IS_PED_UNINJURED(hFriendB)
CLEAR_PED_TASKS_IMMEDIATELY(hFriendB)
IF NOT IS_PED_DRUNK(hFriendA)
MAKE_PED_DRUNK(hFriendB, iDrunkTime*1000)
ELSE
EXTEND_OVERALL_DRUNK_TIME(hFriendB, iDrunkTime*1000)
ENDIF
ENDIF
bAddedDrunkTime = TRUE
ENDIF
SETTIMERA(0)
iStage++
ELIF iStage = 99
IF TIMERA() > 2000
// Fade in
DO_SCREEN_FADE_IN(1000)
iStage++
ENDIF
//-- Fade out and re-spot
ELIF iStage = 100
// Destroy cameras (if in first person, just cut back to gameplay cam)
IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ELSE
STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP()
ENDIF
INT iCamera
REPEAT COUNT_OF(hBarCams) iCamera
IF DOES_CAM_EXIST(hBarCams[iCamera])
DESTROY_CAM(hBarCams[iCamera])
ENDIF
ENDREPEAT
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
STOP_PED_SPEAKING(PLAYER_PED_ID(), FALSE)
ENDIF
IF NOT IS_PED_INJURED(hFriendA)
STOP_PED_SPEAKING(hFriendA, FALSE)
ENDIF
IF NOT IS_PED_INJURED(hFriendB)
STOP_PED_SPEAKING(hFriendB, FALSE)
ENDIF
// Unblock ped and road paths
VECTOR vPedPosMin, vPedPosMax
Private_GetActivityScenePedPosBoundingBox(scene, vPedPosMin, vPedPosMax)
SET_PED_PATHS_BACK_TO_ORIGINAL(vPedPosMin, vPedPosMax)
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(scene.vClearA, scene.vClearB, scene.fClearW)
RC_END_CUTSCENE_MODE(TRUE, FALSE)
iStage = -1
ENDIF
IF iStage = -1
// If peds are ok, put buddy back in players group
IF DOES_ENTITY_EXIST(PLAYER_PED_ID()) AND NOT IS_PED_INJURED(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(hFriendA) AND NOT IS_PED_INJURED(hFriendA)
IF NOT IS_PED_GROUP_MEMBER(hFriendA, PLAYER_GROUP_ID())
SET_PED_AS_GROUP_MEMBER(hFriendA, PLAYER_GROUP_ID())
SET_PED_GROUP_MEMBER_PASSENGER_INDEX(hFriendA, VS_FRONT_RIGHT)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(hFriendB) AND NOT IS_PED_INJURED(hFriendB)
IF NOT IS_PED_GROUP_MEMBER(hFriendB, PLAYER_GROUP_ID())
SET_PED_AS_GROUP_MEMBER(hFriendB, PLAYER_GROUP_ID())
SET_PED_GROUP_MEMBER_PASSENGER_INDEX(hFriendB, VS_FRONT_RIGHT)
ENDIF
ENDIF
ENDIF
ADVANCE_FRIEND_TIMERS(TO_FLOAT(iTOD_SkipTotalHours))
DO_SCREEN_FADE_IN(1000)
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
//-------------------------------------------------------------------------------------------------------------------------------------------
// INTERFACE - BAR
//-------------------------------------------------------------------------------------------------------------------------------------------
FUNC BOOL PROCESS_BAR_STATE()
structFActivityScene scene
Private_ALOC_GetActivityScene(g_eCurrentActivityLoc, scene)
IF Private_ProcessActivityScene(g_eCurrentActivityLoc, scene, gActivity.iStateProgress, gActivity.mFriendA.hPed, gActivity.mFriendB.hPed, gActivity.convPedsDefault)
finishActivity(g_eCurrentActivityLoc, AR_playerWon)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
//-------------------------------------------------------------------------------------------------------------------------------------------
// INTERFACE - CINEMA
//-------------------------------------------------------------------------------------------------------------------------------------------
FUNC BOOL PROCESS_CINEMA_STATE()
structFActivityScene scene
Private_ALOC_GetActivityScene(g_ePreviousActivityLoc, scene)
IF Private_ProcessActivityScene(g_ePreviousActivityLoc, scene, gActivity.iStateProgress, gActivity.mFriendA.hPed, gActivity.mFriendB.hPed, gActivity.convPedsDefault)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC END_CINEMA_STATE()
//-- Return to journey state --
Private_SetActivityState(ACTIVITY_STATE_Journey)
ENDPROC