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

297 lines
9.1 KiB
Scheme
Executable File

//- commands headers -//
//- script headers -//
//- public headers -//
//- private headers -//
USING "friendActivity_system_private.sch"
USING "friendActivity_journey_private.sch"
#IF IS_DEBUG_BUILD
//- debug headers -//
#ENDIF
//---------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------
//-- Friend activity - Pickup state private functions and data types
// sam.hackett@rockstarleeds.com
//---------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------
#IF IS_DEBUG_BUILD
PROC DEBUG_DisplayPickupInfo()
DEBUG_DisplayFriendInfo(gActivity.mFriendA, 0)
DEBUG_DisplayFriendInfo(gActivity.mFriendB, 2)
// DEBUG_DisplayGlobalFriendIDs(20)
ENDPROC
#ENDIF
//---------------------------------------------------------------------------------------------------
//-- Pickup - Switching/basic functions
//---------------------------------------------------------------------------------------------------
PROC Private_GrabMemberPeds()
Private_SyncFriendPed(gActivity.mPlayer)
Private_SyncFriendPed(gActivity.mFriendA)
Private_SyncFriendPed(gActivity.mFriendB)
ENDPROC
FUNC BOOL Private_HandleSwitching()
IF Private_IsPlayerSwitching()
// If player char changes...
enumCharacterList eActualPlayerChar = GET_CURRENT_PLAYER_PED_ENUM()
IF gActivity.ePlayerChar <> eActualPlayerChar
#IF IS_DEBUG_BUILD
TEXT_LABEL_63 tOld = GetLabel_enumFriend(GET_FRIEND_FROM_CHAR(gActivity.ePlayerChar))
TEXT_LABEL_63 tNew = GetLabel_enumFriend(GET_FRIEND_FROM_CHAR(eActualPlayerChar))
CPRINTLN(DEBUG_FRIENDS, " --- SWITCH (", tOld, " -> ", tNew, ") ---")
#ENDIF
// Stop blocking scenarios at pickup point
Private_ClearFriendScenarioBlocking(gActivity.mPlayer)
Private_ClearFriendScenarioBlocking(gActivity.mFriendA)
Private_ClearFriendScenarioBlocking(gActivity.mFriendB)
// Player will have travelled, so update their pickup location to nearest one in use
Private_UpdateFriendPickupLocToNearest(gActivity.mPlayer)
// Switch members
Private_SortMembers(FALSE)
Private_GrabMemberPeds()
// Ensure the two friends will never try to occupy the same waiting spot
Private_SetFriendPickupLocOffset(gActivity.mFriendA, 0)
Private_SetFriendPickupLocOffset(gActivity.mFriendB, 1)
// Enable blocking scenarios at pickup point
Private_SetFriendScenarioBlocking(gActivity.mPlayer)
Private_SetFriendScenarioBlocking(gActivity.mFriendA)
Private_SetFriendScenarioBlocking(gActivity.mFriendB)
// Mark as switched
gActivity.ePlayerChar = eActualPlayerChar
gActivity.bUpdateAfterSwitch = TRUE
ENDIF
ELSE
// Grab any instances of the peds that get made by anyone else
Private_GrabMemberPeds()
// Update switch overrides after switch ends
IF gActivity.bUpdateAfterSwitch
Private_ClearFriendSwitchOverride(gActivity.mPlayer)
Private_SetFriendSwitchOverride(gActivity.mFriendA)
Private_SetFriendSwitchOverride(gActivity.mFriendB)
CPRINTLN(DEBUG_FRIENDS, " --- END SWITCH ---")
gActivity.bUpdateAfterSwitch = FALSE
IF Private_IsPlayerThirdParty()
RETURN FALSE
ENDIF
ENDIF
ENDIF
RETURN TRUE
ENDFUNC
FUNC BOOL Private_AreAnyFriendsPickedUp()
IF gActivity.mPlayer.bWasPickedUp
OR gActivity.mFriendA.bWasPickedUp
OR gActivity.mFriendB.bWasPickedUp
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
//---------------------------------------------------------------------------------------------------
//-- Pickup - Main loop
//---------------------------------------------------------------------------------------------------
/// PURPOSE:
/// Update function for the "Pickup" state in the friend activity
/// PARAMS:
/// pickup - global data for the pickup state
/// RETURNS:
/// If the buddy has been successfully picked up.
PROC PROCESS_PICKUP_STATE()
Private_ClearActivityFailReason()
//-- Check for non-starters...
//----------------------------
// TODO: Need to check if player is in a taxi?
//-- If replay (as in playback) system requested clear entities...
IF REPLAY_SYSTEM_HAS_REQUESTED_A_SCRIPT_CLEANUP()
Private_ClearObjective()
Private_SetActivityFailReason(FAF_PlaybackAbort)
EXIT
//-- Check if replay (as in retry failed mission) has been initiated
ELIF IS_REPLAY_BEING_PROCESSED()
Private_ClearObjective()
IF GET_MISSION_FLOW_SAFE_TO_CLEANUP()
Private_SetActivityFailReason(FAF_RetryAbort)
ENDIF
//-- If player is dead/arrested...
ELIF NOT IS_PLAYER_PLAYING(PLAYER_ID())
Private_ClearObjective()
Private_SetActivityFailReason(FAF_PlayerDeathArrest)
//-- If player has started prep mission...
ELIF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_PREP) // BBUDDIES REPLACED
Private_ClearObjective()
Private_SetDialogueState(gActivity.mDialogue, FDIALOGUE_SQUAD)
Private_SetDialogueIdleState(gActivity.mDialogue, FDIALOGUE_SQUAD_IDLE)
gActivity.eLogFailCharA = NO_CHARACTER
gActivity.eLogFailCharB = NO_CHARACTER
Private_RejectMembersForMission(FALSE, FAP_REJECTION_OK, TRUE)
Private_SetActivityState(ACTIVITY_STATE_Trapped)
//-- If player has started squad-allowed mission...
// ELIF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_PREP) // BBUDDIES REMOVED
//
// Private_ClearObjective()
//
// SET_SQUAD_MISSION_TO_CURRENT_ZONE()
// Private_TransferMembersToSquad()
// Private_SetActivityState(ACTIVITY_STATE_SquadMission)
//-- If player has called soldiers...
// ELIF ARE_ANY_SQUAD_CONNECTIONS_PENDING_OR_ACTIVE() // BBUDDIES REMOVED
//
// Private_ClearObjective()
//
// Private_TransferMembersToSquad()
// Private_SetActivityState(ACTIVITY_STATE_SquadRoaming)
//-- If knockout scene has started...
ELIF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_GRIEFING)
Private_ClearObjective()
// Private_ClearDropoffScenarioBlocking()
Private_DeleteMembersForGriefing()
Private_SetActivityFailReason(FAF_PlayerOnMission)
//-- If player has started story mission...
ELIF IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_FRIEND_ACTIVITY)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY_WITH_MG)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_SWITCH)
Private_ClearObjective()
Private_RejectMembersForMission(FALSE)
Private_SetActivityFailReason(FAF_PlayerOnMission)
//-- If player has switched to third party...
ELIF NOT Private_HandleSwitching()
CPRINTLN(DEBUG_FRIENDS, "FriendActivity: Player switched to third party")
// Remove friends
Private_CleanupFriend(gActivity.mPlayer, MC_Release)
Private_CleanupFriend(gActivity.mFriendA, MC_Release)
Private_CleanupFriend(gActivity.mFriendB, MC_Release)
Private_ClearObjective()
Private_SetActivityFailReason(FAF_PlayerSwitch)
EXIT
//-- Waiting to get mission flag...
ELIF Private_AreAnyFriendsPickedUp() AND NOT Private_SetCurrentlyOnFriendMission(gActivity.iCandidateID)
DISABLE_SELECTOR_THIS_FRAME()
EXIT
ELIF Private_LoadFriendPickupResources()
//-- Process activity members
Private_ProcessAddFriends(FALSE)
Private_ProcessMembers()
Private_ProcessRemoveMembers()
Private_ProcessSystem()
#IF IS_DEBUG_BUILD
DEBUG_DisplayPickupInfo()
#ENDIF
// Change follow dist based on if player is normal/in interior/in fight
Private_UpdateFriendGroupSpacing()
//-- Set objective
IF Private_AreAnyFriendsPickedUp()
IF gActivity.bRestoreLocationBlips = FALSE
Private_BackupLocationBlips()
gActivity.bRestoreLocationBlips = TRUE
ENDIF
ENDIF
IF Private_IsPlayerSwitching() // Is switching
Private_ClearObjective()
ELIF NOT Private_AreAnyMembersValid() // Are friends failed
Private_ClearObjective()
IF Private_AreAllMembersRemoved()
Private_SetActivityFailReason(FAF_MemberFail)
ENDIF
ELIF (gActivity.mFriendA.eState = FRIEND_LOST OR gActivity.mFriendA.eState = FRIEND_FAIL_LOST OR gActivity.mFriendA.eState = FRIEND_PLUMMET) // Any friend lost
OR (gActivity.mFriendB.eState = FRIEND_LOST OR gActivity.mFriendB.eState = FRIEND_FAIL_LOST OR gActivity.mFriendB.eState = FRIEND_PLUMMET)
Private_DisplayObjective_Lost()
ELIF gActivity.mPlayer.eState = FRIEND_PICKUP // Any friend waiting to be picked up
OR gActivity.mFriendA.eState = FRIEND_PICKUP
OR gActivity.mFriendB.eState = FRIEND_PICKUP
Private_DisplayObjective_Pickup()
ELSE // All friends have been picked up, proceed to next stage
Private_ClearObjective()
Private_SortMembers(TRUE)
Private_SetActivityState(ACTIVITY_STATE_Journey)
ENDIF
ENDIF
ENDPROC
// TODO: Make sure anims (and text?) are released on friendActivity.sc cleanup