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

1424 lines
50 KiB
Python
Executable File

//////////////////////////////////////////////////////////////////////////////////////////
// //
// SCRIPT NAME : respawn_controller.sc //
// AUTHOR : Kenneth Ross //
// DESCRIPTION : Runs the appropriate routines when a player respawn has //
// been deteted. This includes respawns at police stations, //
// hospitals, and savehouses. //
// //
//////////////////////////////////////////////////////////////////////////////////////////
//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 "Finance_Control_Public.sch"
USING "respawn_location_data.sch"
USING "respawn_cleanup_data.sch"
USING "mission_control_private.sch"
USING "script_player.sch"
USING "replay_public.sch"
USING "friends_public.sch"
USING "respawnCutscene_private.sch"
USING "minigame_midsized_message.sch"
#IF IS_DEBUG_BUILD
USING "SP_Respawn_Debug.sch"
USING "test_tools.sch"
#ENDIF
ENUM SCRIPT_STAGE_ENUM
SCRIPT_STAGE_WAIT_FOR_DEATHARREST = 0,
SCRIPT_STAGE_WAIT_FOR_RESPAWN,
SCRIPT_STAGE_PERFORM_RESPAWN_ROUTINE,
SCRIPT_STAGE_WAIT_FOR_MISSION_CLEANUP,
SCRIPT_STAGE_CLEANUP
ENDENUM
SCRIPT_STAGE_ENUM eScriptStage = SCRIPT_STAGE_WAIT_FOR_DEATHARREST
RESPAWN_CUTSCENE_STRUCT sRespawnCutscene
INT iOffmissionRespawnEffectsStage = 99
STRING sOffmissionRespawnAudioScene = "", sOffmissionRespawnsRespawnCutsceneSoundSetName = ""
STRING sOffmissionRespawnMessageParam = ""
BOOL bOffmissionRespawnTextHitSoundPlayed, bOffmissionRespawnBedSoundPlayed
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID respawn_widget_group_id
#ENDIF
// ===========================================================================================================
// Script Cleanup
// ===========================================================================================================
// PURPOSE: Ensures that the script gets a chance to cleanup under specific circumstances (ie: moving from SP to MP)
//
PROC CLEANUP_SCRIPT()
CPRINTLN(DEBUG_RESPAWN, "Respawn controller script cleaning up.")
#IF IS_DEBUG_BUILD
IF DOES_WIDGET_GROUP_EXIST(respawn_widget_group_id)
DELETE_WIDGET_GROUP(respawn_widget_group_id)
ENDIF
#ENDIF
IF (iOffmissionRespawnEffectsStage <> 99)
IF IS_REPLAY_IN_PROGRESS()
OR HAS_PLAYER_ACCEPTED_REPLAY()
OR IS_REPLAY_BEING_PROCESSED()
//
ELSE
// not started fail effect, do it now
SET_FADE_OUT_AFTER_DEATH(TRUE)
SET_FADE_OUT_AFTER_ARREST(TRUE)
PAUSE_DEATH_ARREST_RESTART(FALSE)
DISPLAY_HUD(TRUE)
Replay_Control_Fail_Effect(FALSE)
Replay_Control_Fail_Out_Effect(FALSE)
Replay_Control_Slow_Motion(FALSE)
IF NOT IS_STRING_NULL_OR_EMPTY(sOffmissionRespawnAudioScene)
CPRINTLN(DEBUG_RESPAWN, "Stop audio scene \"", sOffmissionRespawnAudioScene, "\".")
STOP_AUDIO_SCENE(sOffmissionRespawnAudioScene)
sOffmissionRespawnAudioScene = ""
ENDIF
ENDIF
iOffmissionRespawnEffectsStage = 99
ENDIF
// Reset anyhing that would block these effects, just to be safe.
g_bBlockDeathFadeout = FALSE
g_bBlockWastedTitle = FALSE
g_bBlockUltraSloMoOnDeath = FALSE
IF IS_RESULT_SCREEN_DISPLAYING()
SET_RESULT_SCREEN_DISPLAYING_STATE(FALSE)
ENDIF
CPRINTLN(DEBUG_RESPAWN, "Respawn controller script terminating.")
TERMINATE_THIS_THREAD()
ENDPROC
// ===========================================================================================================
// Player State Cleanup
// ===========================================================================================================
// PURPOSE: Ensures that the player ped is in a safe playable state after respawn has occured.
//
PROC CLEANUP_PLAYER_STATE_ON_RESPAWN()
CPRINTLN(DEBUG_RESPAWN, "Cleaning up player state after respawn.")
PED_INDEX pedID = PLAYER_PED_ID()
// Reset variations incase we are using temp mission variations
IF g_bMagDemoActive
// Do nothing in magdemo.
ELSE
IF NOT IS_REPLAY_IN_PROGRESS()
AND NOT HAS_PLAYER_ACCEPTED_REPLAY()
CPRINTLN(DEBUG_RESPAWN, "Restoring variations for player on respawn.")
RESTORE_PLAYER_PED_VARIATIONS(pedID)
SET_FLOW_OUTFIT_REQUIREMENTS(pedID)
CLEAR_PED_PARACHUTE_PACK_VARIATION(pedID)
REMOVE_PED_HELMET(pedID, TRUE)
ELSE
CPRINTLN(DEBUG_RESPAWN, "Not Restoring variations for player on respawn: replay accepted.")
ENDIF
ENDIF
//Make sure any crazy special components are cleared on respawn. Parachutes, rucksacks, etc.
PED_COMP_NAME_ENUM eSpecial = GET_DUMMY_COMPONENT_FOR_SLOT(GET_ENTITY_MODEL(pedID), COMP_TYPE_SPECIAL, -1)
BOOL bClearSpecialItems = TRUE
PED_COMP_NAME_ENUM eCurrentItem
MODEL_NAMES ePedModel = GET_ENTITY_MODEL(pedID)
IF eSpecial != DUMMY_PED_COMP
// Add exceptions here
eCurrentItem = GET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_SPECIAL)
// Michael
IF ePedModel = PLAYER_ZERO
IF eCurrentItem = SPECIAL_P0_JANITOR_ACCS
OR eCurrentItem = SPECIAL_P0_POUCHES
OR eCurrentItem = SPECIAL_P0_BALACLAVA
OR eCurrentItem = SPECIAL_P0_SECURITY_ACCS
OR eCurrentItem = SPECIAL_P0_WATCH_AND_BRACELET
OR eCurrentItem = SPECIAL_P0_EPSILON_MEDAL
OR eCurrentItem = SPECIAL_P0_WATCH_LEATHER_STRAP
OR eCurrentItem = SPECIAL_P0_TIE_BLACK
bClearSpecialItems = FALSE
CPRINTLN(DEBUG_RESPAWN, "Respawn controller is NOT clearing special items")
ENDIF
// Franklin
ELIF ePedModel = PLAYER_ONE
IF eCurrentItem = SPECIAL_P1_WATCH_AND_BRACELET
OR eCurrentItem = SPECIAL_P1_MASK
OR eCurrentItem = SPECIAL_P1_BOWTIE
OR eCurrentItem = SPECIAL_P1_POUCHES
OR (eCurrentItem >= SPECIAL_P1_TIE_SHORT AND eCurrentItem <= SPECIAL_P1_TIE_SHORT_15)
OR (eCurrentItem >= SPECIAL_P1_TIE_MEDIUM AND eCurrentItem <= SPECIAL_P1_TIE_MEDIUM_15)
OR (eCurrentItem >= SPECIAL_P1_TIE_LONG AND eCurrentItem <= SPECIAL_P1_TIE_LONG_15)
bClearSpecialItems = FALSE
CPRINTLN(DEBUG_RESPAWN, "Respawn controller is NOT clearing special items")
ENDIF
// Trevor
ELIF ePedModel = PLAYER_TWO
IF (eCurrentItem >= SPECIAL_P2_WATCH AND eCurrentItem <= SPECIAL_P2_WATCH_1)
OR eCurrentItem = SPECIAL_P2_DOCK_WORKER
OR eCurrentItem = SPECIAL_P0_WATCH_LEATHER_STRAP
OR eCurrentItem = SPECIAL_P0_TIE_BLACK
OR eCurrentItem = SPECIAL_P2_SECURITY
OR eCurrentItem = SPECIAL_P2_BOWTIE
bClearSpecialItems = FALSE
CPRINTLN(DEBUG_RESPAWN, "Respawn controller is NOT clearing special items")
ENDIF
ENDIF
IF bClearSpecialItems = TRUE
CPRINTLN(DEBUG_RESPAWN, "Respawn controller is clearing special items")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_SPECIAL, eSpecial, FALSE)
ENDIF
ENDIF
// Do the same for Special2 items
eSpecial = GET_DUMMY_COMPONENT_FOR_SLOT(GET_ENTITY_MODEL(pedID), COMP_TYPE_SPECIAL2, -1)
IF eSpecial != DUMMY_PED_COMP
bClearSpecialItems = TRUE
// Add exceptions here
eCurrentItem = GET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_SPECIAL2)
// Michael
IF ePedModel = PLAYER_ZERO
IF eCurrentItem = SPECIAL2_P0_COP_BELT_2
OR (eCurrentItem >= SPECIAL2_P0_WRESTLER_MASK_0 AND eCurrentItem <= SPECIAL2_P0_WRESTLER_MASK_5)
bClearSpecialItems = FALSE
CPRINTLN(DEBUG_RESPAWN, "Respawn controller is NOT clearing special2 items")
ENDIF
// Franklin
ELIF ePedModel = PLAYER_ONE
IF (eCurrentItem >= SPECIAL2_P1_WRESTLER_MASK_0 AND eCurrentItem <= SPECIAL2_P1_WRESTLER_MASK_5)
bClearSpecialItems = FALSE
CPRINTLN(DEBUG_RESPAWN, "Respawn controller is NOT clearing special2 items")
ENDIF
// Trevor
ELIF ePedModel = PLAYER_TWO
IF eCurrentItem = SPECIAL2_P2_HIGHWAY_PATROL
OR (eCurrentItem >= SPECIAL2_P2_WRESTLER_MASK_0 AND eCurrentItem <= SPECIAL2_P2_WRESTLER_MASK_5)
OR (eCurrentItem >= SPECIAL2_P2_MASK_MONSTER_GREEN AND eCurrentItem <= SPECIAL2_P2_MASK_MONSTER_RED)
bClearSpecialItems = FALSE
CPRINTLN(DEBUG_RESPAWN, "Respawn controller is NOT clearing special2 items")
ENDIF
ENDIF
IF bClearSpecialItems = TRUE
CPRINTLN(DEBUG_RESPAWN, "Respawn controller is clearing special2 items")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_SPECIAL2, eSpecial, FALSE)
ENDIF
ENDIF
// B*1116103 - Players weapons need to be restored on player death when on a Rampage
IF (g_RestoreStoredWeaponsOnDeath)
RESTORE_PLAYER_PED_WEAPONS(pedID)
g_RestoreStoredWeaponsOnDeath = FALSE
ENDIF
IF (g_RestoreSnapshotWeaponsOnDeath)
RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(pedID)
g_RestoreSnapshotWeaponsOnDeath = FALSE
ENDIF
//Ensure the player is using default animation groups.
IF IS_SCREEN_FADED_OUT()
CLEAR_PED_TASKS_IMMEDIATELY(pedID)
ELSE
CLEAR_PED_TASKS(pedID)
CPRINTLN(DEBUG_RESPAWN, "Clear tasks without a fadeout.")
ENDIF
RESET_PED_MOVEMENT_CLIPSET(pedID)
RESET_PED_STRAFE_CLIPSET(pedID)
RESET_PED_WEAPON_MOVEMENT_CLIPSET(pedID)
SET_PED_USING_ACTION_MODE(pedID, FALSE)
SET_PED_STEALTH_MOVEMENT(pedID, FALSE)
//Ensure ped flags are all at default state.
SET_PED_CAN_BE_DRAGGED_OUT(pedID, TRUE)
SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(pedID, KNOCKOFFVEHICLE_DEFAULT)
SET_PED_CONFIG_FLAG(pedID, PCF_WillFlyThroughWindscreen, TRUE)
SET_PED_CAN_SMASH_GLASS(pedID, TRUE, TRUE)
SET_PED_CURRENT_WEAPON_VISIBLE(pedID, TRUE)
SET_PED_DIES_IN_SINKING_VEHICLE(pedID, TRUE)
SET_PED_MAX_TIME_UNDERWATER(pedID, -1)
SET_PED_RELATIONSHIP_GROUP_HASH(pedID, RELGROUPHASH_PLAYER)
SET_PED_HELMET(pedID, TRUE)
SET_PED_CAN_SWITCH_WEAPON(pedID, TRUE)
RESET_PED_IN_VEHICLE_CONTEXT(pedID)
CLEAR_PED_DRIVE_BY_CLIPSET_OVERRIDE(pedID)
SET_PED_INFINITE_AMMO_CLIP(pedID, FALSE)
SET_PED_CAN_PLAY_AMBIENT_ANIMS(pedID, TRUE)
SET_PED_IS_DRUNK(pedID, FALSE)
//Steve Taylor phone state reset
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_REQUESTED_DISABLE_CELLPHONE_THIS_FRAME)
HIDE_ACTIVE_PHONE(FALSE)
HIDE_PHONE_FOR_HOTSWAP(FALSE)
DISABLE_CELLPHONE(FALSE)
g_Cellphone.PhoneDS = PDS_AWAY
// player flags
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
// Clear last seen player data.
CPRINTLN(DEBUG_RESPAWN, "Resetting last known ped info.")
ResetLastKnownPedInfo(g_savedGlobals.sPlayerData.sInfo, SP_MISSION_NONE)
// Delete ambient player characters.
INT iPed
REPEAT NUM_OF_PLAYABLE_PEDS iPed
IF NOT IS_ENTITY_DEAD(g_sPlayerPedRequest.sSelectorPeds.pedID[iPed])
IF (g_sPlayerPedRequest.sSelectorPeds.pedID[iPed] <> PLAYER_PED_ID())
CPRINTLN(DEBUG_RESPAWN, "Deleteing global selector ped [", iPed, "].")
SET_ENTITY_AS_MISSION_ENTITY(g_sPlayerPedRequest.sSelectorPeds.pedID[iPed], TRUE, TRUE)
DELETE_PED(g_sPlayerPedRequest.sSelectorPeds.pedID[iPed])
ENDIF
ENDIF
ENDREPEAT
INT iQueue
REPEAT COUNT_OF(g_ambientSelectorPedDeleteQueue) iQueue
IF NOT IS_ENTITY_DEAD(g_ambientSelectorPedDeleteQueue[iQueue])
IF (g_ambientSelectorPedDeleteQueue[iQueue] <> PLAYER_PED_ID())
CPRINTLN(DEBUG_RESPAWN, "Deleting ambient queue ped [", iQueue, "].")
SET_ENTITY_AS_MISSION_ENTITY(g_ambientSelectorPedDeleteQueue[iQueue], TRUE, TRUE)
DELETE_PED(g_ambientSelectorPedDeleteQueue[iQueue])
ENDIF
ENDIF
ENDREPEAT
// Reset the weather (primarily for North Yankton snowfall).
IF NOT g_bSkipWeatherResetOnRespawn
CPRINTLN(DEBUG_RESPAWN, "Clearing current weather and randomising as player respawns.")
CLEAR_WEATHER_TYPE_PERSIST()
CLEAR_TIMECYCLE_MODIFIER()
SET_RANDOM_WEATHER_TYPE()
#IF IS_DEBUG_BUILD
ELSE
CPRINTLN(DEBUG_RESPAWN, "Skipping randomisation of weather on respawn as the replay controller is setting a mission weather state.")
#ENDIF
ENDIF
g_bSkipWeatherResetOnRespawn = FALSE
UNLOAD_ALL_CLOUD_HATS()
// some of these settings would interfere with replay setup
// so these aren't called if a replay is being processed
// They will instead be called by the replay controller as the replay setup ends
IF NOT IS_REPLAY_BEING_PROCESSED()
REPLAY_RESET_PLAYER_STATE()
ENDIF
ENDPROC
// ===========================================================================================================
// Respawn Routines
// ===========================================================================================================
/// PURPOSE: Ensures all the respawn locations have been initialised
///
PROC CHECK_RESPAWN_LOCATION_SETUP()
IF NOT Has_Savehouse_Respawns_Been_Initialised()
Initialise_Savehouse_Respawn_Locations()
ENDIF
IF NOT Has_Police_Respawns_Been_Initialised()
Initialise_Police_Respawn_Locations()
ENDIF
IF NOT Has_Hospital_Respawns_Been_Initialised()
Initialise_Hospital_Respawn_Locations()
ENDIF
ENDPROC
/// PURPOSE: Returns TRUE if the player has recently died.
FUNC BOOL HAS_PLAYER_HAD_RECENT_DEATH()
INT iLastDeathTime = GET_TIME_SINCE_LAST_DEATH()
INT iLastArrestTime = GET_TIME_SINCE_LAST_ARREST()
IF iLastDeathTime != -1
IF iLastArrestTime = -1
OR iLastDeathTime < iLastArrestTime
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Returns TRUE if the player has recently been arrested.
FUNC BOOL HAS_PLAYER_HAD_RECENT_ARREST()
INT iLastDeathTime = GET_TIME_SINCE_LAST_DEATH()
INT iLastArrestTime = GET_TIME_SINCE_LAST_ARREST()
IF iLastArrestTime != -1
IF iLastDeathTime = -1
OR iLastArrestTime < iLastDeathTime
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Returns TRUE if the player has recently died or been arrested.
FUNC BOOL HAS_PLAYER_HAD_RECENT_DEATHARREST()
RETURN (HAS_PLAYER_HAD_RECENT_DEATH() OR HAS_PLAYER_HAD_RECENT_ARREST())
ENDFUNC
/// PURPOSE: Returns TRUE if the respawn controller should skip the message/audio/fadeout scene
/// Used in some minigames and special conditions
FUNC BOOL SHOULD_SKIP_RESPAWN_EFFECTS()
IF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_SPMC)
CPRINTLN(DEBUG_RESPAWN, "Player is on an SPMC-type mission, skipping respawn effects")
RETURN TRUE
ENDIF
//Basejumps perform their own Slo-mo death scene
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("bj")) >0
CPRINTLN(DEBUG_RESPAWN, "Player has died while basejumping, skipping respawn effects")
RETURN TRUE
ENDIF
//Is a replay in process or being processed
IF IS_REPLAY_IN_PROGRESS()
OR HAS_PLAYER_ACCEPTED_REPLAY()
OR IS_REPLAY_BEING_PROCESSED()
CPRINTLN(DEBUG_RESPAWN, "A repeat play is in progress or being processed, skipping respawn effects")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
///
PROC PERFORM_OFFMISSION_RESPAWN_EFFECTS()
IF SHOULD_SKIP_RESPAWN_EFFECTS()
iOffmissionRespawnEffectsStage = 99
EXIT
ENDIF
CDEBUG3LN(DEBUG_RESPAWN, "Performing off-mission respawn effects ", iOffmissionRespawnEffectsStage, ".")
//#1503566
SUPPRESS_AMBIENT_PED_AGGRESSIVE_CLEANUP_THIS_FRAME()
// /*
// ok if you go to "Replay_Do_Blur" in the replay_controller.sc
// as soon as the mission is failed it calls Replay_Control_Fail_Effect
// which works out which fail effect to play, as there is 1 per character
// that also triggers the 1st slow motion effect via Replay_Control_Slow_Motion
IF (iOffmissionRespawnEffectsStage = 0)
CPRINTLN(DEBUG_RESPAWN, "Replay_Control_Fail_Effect(TRUE).")
// not started fail effect, do it now
Replay_Control_Fail_Effect(TRUE)
SET_FADE_OUT_AFTER_DEATH(FALSE)
SET_FADE_OUT_AFTER_ARREST(FALSE)
SET_FADE_IN_AFTER_DEATH_ARREST(FALSE)
PAUSE_DEATH_ARREST_RESTART(TRUE)
DISPLAY_HUD(FALSE)
IF IS_ENTITY_DEAD(PLAYER_PED_ID())
sOffmissionRespawnAudioScene = "DEATH_SCENE"
sOffmissionRespawnsRespawnCutsceneSoundSetName = "WastedSounds"
sOffmissionRespawnMessageParam = "RESPAWN_W"
CPRINTLN(DEBUG_RESPAWN, "Starting audio scene \"", sOffmissionRespawnAudioScene, "\".")
START_AUDIO_SCENE(sOffmissionRespawnAudioScene) //1409759
ENDIF
IF IS_PLAYER_BEING_ARRESTED(PLAYER_ID(), FALSE)
sOffmissionRespawnAudioScene = "BUSTED_SCENE"
sOffmissionRespawnsRespawnCutsceneSoundSetName = "BustedSounds"
sOffmissionRespawnMessageParam = "RESPAWN_B"
CPRINTLN(DEBUG_RESPAWN, "Starting audio scene \"", sOffmissionRespawnAudioScene, "\".")
START_AUDIO_SCENE(sOffmissionRespawnAudioScene) //1445110
ENDIF
SETTIMERA(0)
g_replay.mFailTextScaleform = REQUEST_SCALEFORM_MOVIE("MP_BIG_MESSAGE_FREEMODE")
IF NOT IS_SCREEN_FADED_OUT()
PLAY_SOUND_FRONTEND(-1, "ScreenFlash", sOffmissionRespawnsRespawnCutsceneSoundSetName)
ENDIF
REQUEST_SCRIPT_AUDIO_BANK("OFFMISSION_WASTED")
iOffmissionRespawnEffectsStage = 1
ENDIF
// then 3 seconds later (timed via IF TIMERA() > FAIL_EFFECT_TIME * FAIL_EFFECT_SLO_MO to compensate for the slow motion effect)
// it triggers the mission failed screen
// and the fail out effect via Replay_Control_Fail_Out_Effect
// this stops the fail effect and triggers the fail out effect
// and also changes the slow motion so that it is even slower
IF (iOffmissionRespawnEffectsStage = 1)
IF NOT bOffmissionRespawnBedSoundPlayed
IF REQUEST_SCRIPT_AUDIO_BANK("OFFMISSION_WASTED")
PLAY_SOUND_FRONTEND(-1, "Bed", sOffmissionRespawnsRespawnCutsceneSoundSetName)
bOffmissionRespawnBedSoundPlayed = TRUE
ENDIF
ENDIF
IF NOT bOffmissionRespawnBedSoundPlayed
IF TIMERA() > 0300
CWARNINGLN(DEBUG_RESPAWN, "Emergency call to PLAY_SOUND_FRONTEND for url:bugstar:2024410 - call \"Bed\", \"", sOffmissionRespawnsRespawnCutsceneSoundSetName, "\"")
PLAY_SOUND_FRONTEND(-1, "Bed", sOffmissionRespawnsRespawnCutsceneSoundSetName)
bOffmissionRespawnBedSoundPlayed = TRUE
ENDIF
ENDIF
IF TIMERA() > FAIL_EFFECT_TIME * FAIL_EFFECT_SLO_MO
// not started fail effect, do it now
Replay_Control_Fail_Out_Effect(TRUE)
SETTIMERB(0)
CPRINTLN(DEBUG_RESPAWN, "Replay_Control_Fail_Out_Effect(TRUE).")
iOffmissionRespawnEffectsStage = 2
ENDIF
ENDIF
// then 3 seconds later (calculated via IF TIMERB() > FAIL_OUT_EFFECT_TIME * FAIL_OUT_EFFECT_SLO_MO to compensate for the slow motion effect)
// we start fading out
// */
BOOL bUpdate_shard_big_message_generic = FALSE
IF (iOffmissionRespawnEffectsStage = 2)
IF NOT g_bBlockWastedTitle
IF NOT IS_STRING_NULL_OR_EMPTY(sOffmissionRespawnMessageParam)
IF NOT HAS_SCALEFORM_MOVIE_LOADED(g_replay.mFailTextScaleform)
g_replay.mFailTextScaleform = REQUEST_SCALEFORM_MOVIE("MP_BIG_MESSAGE_FREEMODE")
ELSE
IF NOT bOffmissionRespawnTextHitSoundPlayed
PLAY_SOUND_FRONTEND(-1, "TextHit", sOffmissionRespawnsRespawnCutsceneSoundSetName)
SET_SHARD_BIG_MESSAGE_GENERIC(g_replay.mFailTextScaleform, sOffmissionRespawnMessageParam, DEFAULT, SHARD_MESSAGE_WASTED)
bOffmissionRespawnTextHitSoundPlayed = TRUE
ENDIF
UPDATE_SHARD_BIG_MESSAGE_GENERIC(g_replay.mFailTextScaleform)
bUpdate_shard_big_message_generic = TRUE
ENDIF
ENDIF
ENDIF
IF NOT g_bBlockDeathFadeout
IF TIMERB() > FAIL_OUT_EFFECT_TIME * FAIL_OUT_EFFECT_SLO_MO
// fade out the screen
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME_LONG)
SETTIMERA(0)
CPRINTLN(DEBUG_RESPAWN, "DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME_LONG).")
iOffmissionRespawnEffectsStage = 3
#IF IS_DEBUG_BUILD
ELSE
CPRINTLN(DEBUG_RESPAWN, "TIMERB() set to ", TIMERB(), "???")
#ENDIF
ENDIF
#IF IS_DEBUG_BUILD
ELSE
CPRINTLN(DEBUG_RESPAWN, "g_bBlockDeathFadeout set to true???")
#ENDIF
ENDIF
ENDIF
IF iOffmissionRespawnEffectsStage = 3
IF NOT IS_SCREEN_FADED_OUT()
IF NOT bUpdate_shard_big_message_generic
IF HAS_SCALEFORM_MOVIE_LOADED(g_replay.mFailTextScaleform)
UPDATE_SHARD_BIG_MESSAGE_GENERIC(g_replay.mFailTextScaleform)
ENDIF
ENDIF
ENDIF
ENDIF
IF (iOffmissionRespawnEffectsStage <> 99)
IF NOT IS_SCREEN_FADED_OUT()
//
ELSE
// not started fail effect, do it now
SET_FADE_OUT_AFTER_DEATH(TRUE)
SET_FADE_OUT_AFTER_ARREST(TRUE)
PAUSE_DEATH_ARREST_RESTART(FALSE)
DISPLAY_HUD(TRUE)
Replay_Control_Fail_Effect(FALSE)
Replay_Control_Fail_Out_Effect(FALSE)
Replay_Control_Slow_Motion(FALSE)
//CLEANUP_MG_MIDSIZED_MESSAGE(RespawnBigSize)
CPRINTLN(DEBUG_RESPAWN, "Replay_Control_Fail_Effect(FALSE).")
IF NOT IS_STRING_NULL_OR_EMPTY(sOffmissionRespawnAudioScene)
CPRINTLN(DEBUG_RESPAWN, "Stopping audio scene \"", sOffmissionRespawnAudioScene, "\".")
STOP_AUDIO_SCENE(sOffmissionRespawnAudioScene)
sOffmissionRespawnAudioScene = ""
ENDIF
iOffmissionRespawnEffectsStage = 99
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
///
PROC RUN_DEATH_CUTSCENE()
VECTOR vPlayerCoord = GET_ENTITY_COORDS(PLAYER_PED_ID())
HOSPITAL_NAME_ENUM eHospital = GET_CLOSEST_HOSPITAL(vPlayerCoord)
STRING pHospitalDebugName = ""
#IF IS_DEBUG_BUILD
IF (g_eDebug_ForceHospitalRespawn <> NUMBER_OF_HOSPITAL_LOCATIONS)
eHospital = g_eDebug_ForceHospitalRespawn
CPRINTLN(DEBUG_RESPAWN, "g_eDebug_ForceHospitalRespawn.")
ENDIF
pHospitalDebugName = Get_Hospital_Respawn_Name(eHospital)
CPRINTLN(DEBUG_RESPAWN, "Player death at ", pHospitalDebugName, ".")
#ENDIF
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
sRespawnCutscene.effectName = "RespawnMichael"
sRespawnCutscene.pFacialDictName = "facials@P_M_ZERO@BASE"
sRespawnCutscene.pFacialClipName = "mood_injured_1"
BREAK
CASE CHAR_FRANKLIN
sRespawnCutscene.effectName = "RespawnFranklin"
sRespawnCutscene.pFacialDictName = "facials@P_M_ONE@BASE"
sRespawnCutscene.pFacialClipName = "mood_injured_1"
BREAK
CASE CHAR_TREVOR
sRespawnCutscene.effectName = "RespawnTrevor"
sRespawnCutscene.pFacialDictName = "facials@P_M_TWO@BASE"
sRespawnCutscene.pFacialClipName = "mood_injured_1"
BREAK
DEFAULT
#IF IS_DEBUG_BUILD
CASSERTLN(DEBUG_RESPAWN, "invalid character in RUN_DEATH_CUTSCENE()")
#ENDIF
EXIT
BREAK
ENDSWITCH
sRespawnCutscene.soundSetName = "RESPAWN_SOUNDSET"
sRespawnCutscene.soundNameA = "Hit"
sRespawnCutscene.soundNameB = "Whoosh"
SWITCH eHospital
CASE HOSPITAL_RH // 002339_01_GC_Respawn_Hospital_Rockford_Hills url:bugstar:922262
sRespawnCutscene.pAnimDictName = "RESPAWN@HOSPITAL@ROCKFORD"
sRespawnCutscene.pAnimClipName = "ROCKFORD"
sRespawnCutscene.pAnimCamName = "ROCKFORD_CAM"
sRespawnCutscene.vAnimPos = <<-447.2036, -342.8395, 34.5020>>
sRespawnCutscene.vAnimRot = <<0.0000, 0.0000, 109.1352>>
sRespawnCutscene.fDialoguePhase = 0.5
sRespawnCutscene.fRollingBlendoutPhase = 0.85
sRespawnCutscene.ePedMotionState = MS_ON_FOOT_WALK //MS_ON_FOOT_IDLE
sRespawnCutscene.gpCamPitch = 0.0
sRespawnCutscene.gpCamHead = -27.0 //388.665771 - 360
sRespawnCutscene.vTrafficOffset = <<0,0,0>>
sRespawnCutscene.vTrafficBounds = <<0,0,0>>
// [New anims submitted
// -please set the 1st person phase to be .75
// -make pushin duration 1 second
// -framing fine as default]
sRespawnCutscene.fFirstPersonPunchPhase = 0.75 //#2048274
sRespawnCutscene.vPushInDataDirectionMod = <<15.000,0,-11.000>>
sRespawnCutscene.gp3rdCamPitch = sRespawnCutscene.gpCamPitch
sRespawnCutscene.gp3rdCamHead = sRespawnCutscene.gpCamHead
BREAK
CASE HOSPITAL_SC // 002340_01_GC_Respawn_Hospital_South_Central url:bugstar:922304
sRespawnCutscene.pAnimDictName = "RESPAWN@HOSPITAL@SOUTH_CENTRAL"
sRespawnCutscene.pAnimClipName = "SOUTH_CENTRAL"
sRespawnCutscene.pAnimCamName = "SOUTH_CENTRAL_CAM"
sRespawnCutscene.vAnimPos = <<342.7344, -1397.8510, 32.5092>> //<<341.4144, -1396.2910, 32.5092>>
sRespawnCutscene.vAnimRot = <<0.0, 0.0, 62.5160>> //<<0,0,62.516>>
sRespawnCutscene.fDialoguePhase = 0.5
sRespawnCutscene.ePedMotionState = MS_ON_FOOT_WALK //MS_ON_FOOT_IDLE
sRespawnCutscene.vTrafficOffset = <<-39.0000, 16.5000, 0.0>>
sRespawnCutscene.vTrafficBounds = <<25,25,5>>
// [New anims submitted
// -please set the 1st person phase to be .65
// -make pushin duration 1 second
// -framing fine as default.
//
// Note Ive rotated the animation so he now walks to the left of the trees.]
sRespawnCutscene.fFirstPersonPunchPhase = 0.65 //#2050602
sRespawnCutscene.vPushInDataDirectionMod = <<7.650,0,2.550>>
sRespawnCutscene.gp3rdCamPitch = sRespawnCutscene.gpCamPitch
sRespawnCutscene.gp3rdCamHead = sRespawnCutscene.gpCamHead
BREAK
CASE HOSPITAL_DT // 002341_01_GC_Respawn_Hospital_Downtown url:bugstar:922416
sRespawnCutscene.pAnimDictName = "RESPAWN@HOSPITAL@DOWNTOWN"
sRespawnCutscene.pAnimClipName = "DOWNTOWN"
sRespawnCutscene.pAnimCamName = "DOWNTOWN_CAM"
sRespawnCutscene.vAnimPos = <<357.3475, -585.6215, 28.8310>>
sRespawnCutscene.vAnimRot = <<0.0000, 0.0000, -95.0926>>
sRespawnCutscene.fDialoguePhase = 0.5
sRespawnCutscene.ePedMotionState = MS_ON_FOOT_WALK //MS_ON_FOOT_IDLE
sRespawnCutscene.vTrafficOffset = <<34.5, -18.0, 0.0>>
sRespawnCutscene.vTrafficBounds = <<30.0, 30.0, 7.5>>
// [New anims submitted
// -please set the 1st person phase to be .75
// -make pushin duration 1 second
// -framing fine as default
//
// I also adjusted the character animation to make him
// end up away from the wall and facing otuside more to fix
// another bug I had. This should mean 1st person
// framing faces out more too.]
sRespawnCutscene.fFirstPersonPunchPhase = 0.75 //#2048509
sRespawnCutscene.vPushInDataDirectionMod = <<20,0,0>>
sRespawnCutscene.gp3rdCamPitch = sRespawnCutscene.gpCamPitch
sRespawnCutscene.gp3rdCamHead = sRespawnCutscene.gpCamHead
BREAK
CASE HOSPITAL_SS // 002342_01_GC_Respawn_Hospital_Sandy_shores url:bugstar:922469
sRespawnCutscene.pAnimDictName = "RESPAWN@HOSPITAL@SANDY_SHORES"
sRespawnCutscene.pAnimClipName = "SANDY_SHORES"
sRespawnCutscene.pAnimCamName = "SANDY_SHORES_CAM"
sRespawnCutscene.vAnimPos = <<1837.655, 3673.500, 34.308>>
sRespawnCutscene.vAnimRot = <<0,0,-146.160>>
sRespawnCutscene.fDialoguePhase = 0.5
sRespawnCutscene.ePedMotionState = MS_ON_FOOT_WALK //MS_ON_FOOT_IDLE
sRespawnCutscene.vTrafficOffset = <<0,0,0>>
sRespawnCutscene.vTrafficBounds = <<0,0,0>>
// [New anims submitted
// -please set the 1st person phase to be .7
// -make pushin duration 1 second
// -framing fine as default]
sRespawnCutscene.fFirstPersonPunchPhase = 0.7 //#2049116
sRespawnCutscene.vPushInDataDirectionMod = <<13.310,0,4.320>>
sRespawnCutscene.gp3rdCamPitch = sRespawnCutscene.gpCamPitch
sRespawnCutscene.gp3rdCamHead = sRespawnCutscene.gpCamHead
BREAK
CASE HOSPITAL_PB // 002343_01_GC_Respawn_Hospital_Paleto_Bay url:bugstar:922491
sRespawnCutscene.pAnimDictName = "RESPAWN@HOSPITAL@PALETO_BAY"
sRespawnCutscene.pAnimClipName = "PALETO_BAY"
sRespawnCutscene.pAnimCamName = "PALETO_BAY_CAM"
sRespawnCutscene.vAnimPos = <<-244.6081, 6324.9629, 32.4260>>
sRespawnCutscene.vAnimRot = <<0, 0, -57.7613>>
sRespawnCutscene.fDialoguePhase = 0.5
sRespawnCutscene.ePedMotionState = MS_ON_FOOT_WALK //MS_ON_FOOT_IDLE
sRespawnCutscene.vTrafficOffset = <<0,0,0>>
sRespawnCutscene.vTrafficBounds = <<0,0,0>>
// [New anims submitted
// -please set the 1st person phase to be .7
// -make pushin duration 1 second
// -framing fine as default]
sRespawnCutscene.fFirstPersonPunchPhase = 0.7 //#2048571
sRespawnCutscene.vPushInDataDirectionMod = <<20,0,0>>
sRespawnCutscene.gp3rdCamPitch = sRespawnCutscene.gpCamPitch
sRespawnCutscene.gp3rdCamHead = sRespawnCutscene.gpCamHead
BREAK
DEFAULT
#IF IS_DEBUG_BUILD
CASSERTLN(DEBUG_RESPAWN, "invalid eHospital \"", eHospital, "\" in RUN_DEATH_CUTSCENE()")
#ENDIF
EXIT
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_RESPAWN, "Player distance from ", Get_Hospital_Respawn_Name(eHospital), ": ", VDIST(vPlayerCoord, sRespawnCutscene.vAnimPos), "m.")
#ENDIF
IF (g_eRecentFriendChar <> NO_CHARACTER)
enumCharacterList ePlayerChar = GET_CURRENT_PLAYER_PED_ENUM()
#IF IS_DEBUG_BUILD
IF (g_eRecentFriendChar = CHAR_MULTIPLAYER)
SWITCH ePlayerChar
CASE CHAR_MICHAEL
IF GET_RANDOM_INT_IN_RANGE(0, 100) < 50
g_eRecentFriendChar = CHAR_FRANKLIN
ELSE
g_eRecentFriendChar = CHAR_TREVOR
ENDIF
BREAK
CASE CHAR_FRANKLIN
IF GET_RANDOM_INT_IN_RANGE(0, 100) < 50
g_eRecentFriendChar = CHAR_TREVOR
ELSE
g_eRecentFriendChar = CHAR_MICHAEL
ENDIF
BREAK
CASE CHAR_TREVOR
IF GET_RANDOM_INT_IN_RANGE(0, 100) < 50
g_eRecentFriendChar = CHAR_MICHAEL
ELSE
g_eRecentFriendChar = CHAR_FRANKLIN
ENDIF
BREAK
DEFAULT
CASSERTLN(DEBUG_RESPAWN, "invalid ePlayerChar [", GET_PLAYER_PED_STRING(ePlayerChar), "]")
BREAK
ENDSWITCH
ENDIF
#ENDIF
sRespawnCutscene.DialogueTextLabel = ""
SWITCH ePlayerChar
CASE CHAR_MICHAEL sRespawnCutscene.DialogueTextLabel = "MICS_" BREAK
CASE CHAR_FRANKLIN sRespawnCutscene.DialogueTextLabel = "FRAS_" BREAK
CASE CHAR_TREVOR sRespawnCutscene.DialogueTextLabel = "TRVS_" BREAK
DEFAULT
sRespawnCutscene.DialogueTextLabel = ""
CASSERTLN(DEBUG_RESPAWN, "invalid ePlayerChar [", GET_PLAYER_PED_STRING(ePlayerChar), "]")
BREAK
ENDSWITCH
SWITCH g_eRecentFriendChar
CASE CHAR_MICHAEL sRespawnCutscene.DialogueTextLabel += "DIEM" BREAK
CASE CHAR_FRANKLIN sRespawnCutscene.DialogueTextLabel += "DIEF" BREAK
CASE CHAR_TREVOR sRespawnCutscene.DialogueTextLabel += "DIET" BREAK
CASE CHAR_LAMAR
CASE CHAR_JIMMY
CASE CHAR_AMANDA
sRespawnCutscene.DialogueTextLabel = ""
CPRINTLN(DEBUG_RESPAWN, "ignorable g_eRecentFriendChar [", GET_PLAYER_PED_STRING(g_eRecentFriendChar), "]")
BREAK
DEFAULT
sRespawnCutscene.DialogueTextLabel = ""
CASSERTLN(DEBUG_RESPAWN, "invalid g_eRecentFriendChar [", GET_PLAYER_PED_STRING(g_eRecentFriendChar), "]")
BREAK
ENDSWITCH
ENDIF
sRespawnCutscene.ePlayerDamage = PD_NONE
SWITCH GET_RANDOM_INT_IN_RANGE(0,10)
CASE 0 sRespawnCutscene.ePlayerDamage = PD_0_chinBruise BREAK
CASE 1 sRespawnCutscene.ePlayerDamage = PD_1_plasterForehead BREAK
CASE 2 sRespawnCutscene.ePlayerDamage = PD_2_foreheadBruise BREAK
CASE 3 sRespawnCutscene.ePlayerDamage = PD_3_noseBruise BREAK
CASE 4 sRespawnCutscene.ePlayerDamage = PD_4_lefteyeBruise BREAK
CASE 5 sRespawnCutscene.ePlayerDamage = PD_5_splatterLeft BREAK
CASE 6 sRespawnCutscene.ePlayerDamage = PD_6_splatterLeft BREAK
CASE 7 sRespawnCutscene.ePlayerDamage = PD_7_splatterLeft BREAK
CASE 8 sRespawnCutscene.ePlayerDamage = PD_8_splatterLeft BREAK
CASE 9 sRespawnCutscene.ePlayerDamage = PD_9_cutNose BREAK
ENDSWITCH
Force_All_Drunk_Peds_To_Become_Sober_And_Quit_Camera()
ADVANCE_FRIEND_TIMERS(10.0)
#IF IS_DEBUG_BUILD
sRespawnCutscene.respawn_widgetId = respawn_widget_group_id
#ENDIF
RUN_RESPAWN_CUTSCENE(pHospitalDebugName, sRespawnCutscene, "") ////"AM_H_WASTED", // Kenneth R. - Removing for bug #1007089
g_eRecentFriendChar = NO_CHARACTER
ENDPROC
/// PURPOSE:
///
PROC RUN_ARREST_CUTSCENE()
VECTOR vPlayerCoord = GET_ENTITY_COORDS(PLAYER_PED_ID())
POLICE_STATION_NAME_ENUM ePoliceStation = GET_CLOSEST_POLICE_STATION(vPlayerCoord)
STRING pPoliceStationDebugName = ""
#IF IS_DEBUG_BUILD
IF (g_eDebug_ForcePoliceStationRespawn <> NUMBER_OF_POLICE_STATION_LOCATIONS)
ePoliceStation = g_eDebug_ForcePoliceStationRespawn
CPRINTLN(DEBUG_RESPAWN, "g_eDebug_ForcePoliceStationRespawn.")
ENDIF
pPoliceStationDebugName = Get_Police_Respawn_Name(ePoliceStation)
CPRINTLN(DEBUG_RESPAWN, "Player arrest at ", pPoliceStationDebugName, ".")
#ENDIF
sRespawnCutscene.effectName = ""
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
sRespawnCutscene.effectName = "RespawnMichael"
sRespawnCutscene.pFacialDictName = "facials@P_M_ZERO@BASE"
sRespawnCutscene.pFacialClipName = "mood_angry_1"
BREAK
CASE CHAR_FRANKLIN
sRespawnCutscene.effectName = "RespawnFranklin"
sRespawnCutscene.pFacialDictName = "facials@P_M_ONE@BASE"
sRespawnCutscene.pFacialClipName = "mood_angry_1"
BREAK
CASE CHAR_TREVOR
sRespawnCutscene.effectName = "RespawnTrevor"
sRespawnCutscene.pFacialDictName = "facials@P_M_TWO@BASE"
sRespawnCutscene.pFacialClipName = "mood_angry_1"
BREAK
DEFAULT
#IF IS_DEBUG_BUILD
CASSERTLN(DEBUG_RESPAWN, "invalid character in RUN_ARREST_CUTSCENE()")
#ENDIF
EXIT
BREAK
ENDSWITCH
sRespawnCutscene.soundSetName = "RESPAWN_SOUNDSET"
sRespawnCutscene.soundNameA = "Hit"
sRespawnCutscene.soundNameB = "Whoosh"
SWITCH ePoliceStation
CASE POLICE_STATION_VB // 002346_01_GC_Respawn_Police_Vespucci url:bugstar:922600
sRespawnCutscene.pAnimDictName = "RESPAWN@POLICE@VESPUCCI"
sRespawnCutscene.pAnimClipName = "VESPUCCI"
sRespawnCutscene.pAnimCamName = "VESPUCCI_CAM"
sRespawnCutscene.vAnimPos = <<-1092.6000, -807.6234, 19.3040>>
sRespawnCutscene.vAnimRot = <<0.0000, 0.0000, 37.240>>
sRespawnCutscene.ePedMotionState = MS_ON_FOOT_WALK //MS_ON_FOOT_IDLE
sRespawnCutscene.vTrafficOffset = <<0,0,0>>
sRespawnCutscene.vTrafficBounds = <<0,0,0>>
// [No new anims submitted
// -add 1st person punch in
// -please set the 1st person phase to be .8
// -make pushin duration 1 second
// -framing fine as default]
sRespawnCutscene.fFirstPersonPunchPhase = 0.8 //#2050717
sRespawnCutscene.vPushInDataDirectionMod = <<20,0,0>>
sRespawnCutscene.gp3rdCamPitch = sRespawnCutscene.gpCamPitch
sRespawnCutscene.gp3rdCamHead = sRespawnCutscene.gpCamHead
BREAK
CASE POLICE_STATION_SC // 002344_01_GC_Respawn_Police_South_Central url:bugstar:922583
sRespawnCutscene.pAnimDictName = "RESPAWN@POLICE@SOUTH_CENTRAL_A"
sRespawnCutscene.pAnimClipName = "SOUTH_CENTRAL_A"
sRespawnCutscene.pAnimCamName = "SOUTH_CENTRAL_A_CAM"
sRespawnCutscene.vAnimPos = <<361.4820, -1584.9680, 29.2930>>
sRespawnCutscene.vAnimRot = <<0.0000, 0.0000, 45.0000>>
sRespawnCutscene.ePedMotionState = MS_ON_FOOT_WALK //MS_ON_FOOT_IDLE
sRespawnCutscene.vTrafficOffset = <<0,0,0>>
sRespawnCutscene.vTrafficBounds = <<0,0,0>>
// [No changes to animations for this one.
// -add punch in for 1st person
// -please set the 1st person phase to be .6
// -make pushin duration 1 second COould you adjust the phase where we blend back to player control? Currently I think we have it fraction too soon, which is breaking the player out of his animation before he has properly turned away from the hedge. Another step and he is properly facing the road in the fbx file. This will affect 1st person framing too so hes not facing the wall.]
sRespawnCutscene.fFirstPersonPunchPhase = 0.6 //#2050671
sRespawnCutscene.vPushInDataDirectionMod = <<20,0,0>>
sRespawnCutscene.gp3rdCamPitch = 0.0
sRespawnCutscene.gp3rdCamHead = 25.377075
BREAK
CASE POLICE_STATION_RH // 002347_02_GC_Respawn_Police_Rockford_hills url:bugstar:922628
sRespawnCutscene.pAnimDictName = "RESPAWN@POLICE@ROCKFORD"
sRespawnCutscene.pAnimClipName = "ROCKFORD"
sRespawnCutscene.pAnimCamName = "ROCKFORD_CAM"
sRespawnCutscene.vAnimPos = <<-560.3680, -133.8910, 37.0520>>
sRespawnCutscene.vAnimRot = <<0.0000, 0.0000, 4.2000>>
sRespawnCutscene.ePedMotionState = MS_ON_FOOT_WALK //MS_ON_FOOT_IDLE
sRespawnCutscene.gpCamPitch = 0.0
sRespawnCutscene.gpCamHead = 20.0
sRespawnCutscene.vTrafficOffset = <<0,0,0>>
sRespawnCutscene.vTrafficBounds = <<0,0,0>>
// [No new anims submitted
// -add 1st person punch in
// -please set the 1st person phase to be .8
// -make pushin duration 1 second
// -please adjust 1st person framing to aim to the right towards the exit gap. as seen in screenshot]
sRespawnCutscene.fFirstPersonPunchPhase = 0.8 //#2050753
sRespawnCutscene.vPushInDataDirectionMod = <<20,0,0>>
sRespawnCutscene.gp3rdCamPitch = 0.0
sRespawnCutscene.gp3rdCamHead = -30.0
BREAK
CASE POLICE_STATION_SS // 002348_01_GC_Respawn_Police_Sandy_Shores url:bugstar:922673
sRespawnCutscene.pAnimDictName = "RESPAWN@POLICE@SANDY_SHORES"
sRespawnCutscene.pAnimClipName = "SANDY_SHORES"
sRespawnCutscene.pAnimCamName = "SANDY_SHORES_CAM"
sRespawnCutscene.vAnimPos = <<1854.9810, 3683.8401, 34.2680>>
sRespawnCutscene.vAnimRot = <<0.0000, 0.0000, -132.0000>>
sRespawnCutscene.ePedMotionState = MS_ON_FOOT_WALK //MS_ON_FOOT_IDLE
sRespawnCutscene.vTrafficOffset = <<0,0,0>>
sRespawnCutscene.vTrafficBounds = <<0,0,0>>
// [No new anims submitted
// -add punch in to 1st person
// -please set the 1st person phase to be .75
// -make pushin duration 1 second
// -framing fine as default]
sRespawnCutscene.fFirstPersonPunchPhase = 0.75 //#2050789
sRespawnCutscene.vPushInDataDirectionMod = <<20,0,0>>
sRespawnCutscene.gp3rdCamPitch = sRespawnCutscene.gpCamPitch
sRespawnCutscene.gp3rdCamHead = sRespawnCutscene.gpCamHead
BREAK
CASE POLICE_STATION_PB // Paleto Bay
sRespawnCutscene.pAnimDictName = "RESPAWN@POLICE@PALETO_BAY" //SOUTH_CENTRAL_B
sRespawnCutscene.pAnimClipName = "PALETO_BAY" //SOUTH_CENTRAL_B
sRespawnCutscene.pAnimCamName = "PALETO_BAY_CAM" //SOUTH_CENTRAL_B
sRespawnCutscene.vAnimPos = <<-440.7729, 6019.2891, 30.4900>>
sRespawnCutscene.vAnimRot = <<0, 0, -135.0690>>
sRespawnCutscene.ePedMotionState = MS_ON_FOOT_WALK //MS_ON_FOOT_IDLE
sRespawnCutscene.vTrafficOffset = <<0,0,0>>
sRespawnCutscene.vTrafficBounds = <<0,0,0>>
// [No new anims submitted
// -add punch in to 1st person
// -please set the 1st person phase to be .8
// -make pushin duration 1 second
// -framing fine as default]
sRespawnCutscene.fFirstPersonPunchPhase = 0.8 //#2050815
sRespawnCutscene.vPushInDataDirectionMod = <<20,0,0>>
sRespawnCutscene.gp3rdCamPitch = sRespawnCutscene.gpCamPitch
sRespawnCutscene.gp3rdCamHead = sRespawnCutscene.gpCamHead
BREAK
CASE POLICE_STATION_HW // Vinewood
sRespawnCutscene.pAnimDictName = "RESPAWN@POLICE@VINEWOOD"
sRespawnCutscene.pAnimClipName = "VINEWOOD"
sRespawnCutscene.pAnimCamName = "VINEWOOD_CAM"
sRespawnCutscene.vAnimPos = <<641.5, -0.3, 81.8030>>
sRespawnCutscene.vAnimRot = <<0.0000, 0.0000, -170.0000>>
sRespawnCutscene.ePedMotionState = MS_ON_FOOT_WALK //MS_ON_FOOT_IDLE
sRespawnCutscene.vTrafficOffset = <<0,0,0>>
sRespawnCutscene.vTrafficBounds = <<0,0,0>>
// [New anims submitted
// -add punch in to 1st person
// -please set the 1st person phase to be .7
// -make pushin duration 1 second
// -framing fine as default]
//
// Note Ive heavily rotated the animations to fix the player
// walking right off to the right of frame down the ramp.
// Now he heads off into the open.
sRespawnCutscene.fFirstPersonPunchPhase = 0.7 //#2051047
sRespawnCutscene.vPushInDataDirectionMod = <<20,0,0>>
sRespawnCutscene.gp3rdCamPitch = sRespawnCutscene.gpCamPitch
sRespawnCutscene.gp3rdCamHead = sRespawnCutscene.gpCamHead
BREAK
CASE POLICE_STATION_DT // Downtown
sRespawnCutscene.pAnimDictName = "RESPAWN@POLICE@DOWN_TOWN"
sRespawnCutscene.pAnimClipName = "DOWN_TOWN"
sRespawnCutscene.pAnimCamName = "DOWN_TOWN_CAM"
sRespawnCutscene.vAnimPos = <<480.3291, -976.4094, 26.9920>>
sRespawnCutscene.vAnimRot = <<0.0000, 0.0000, 4.9310>>
sRespawnCutscene.ePedMotionState = MS_ON_FOOT_WALK //MS_ON_FOOT_IDLE
sRespawnCutscene.gpCamPitch = 999.0
sRespawnCutscene.gpCamHead = 999.0
sRespawnCutscene.vTrafficOffset = <<486.8887, -958.3694, 27.9336>>-sRespawnCutscene.vAnimPos
sRespawnCutscene.vTrafficBounds = <<10,10,5>>
// [No new anims submitted
// -add 1st person punch in
// -please set the 1st person phase to be .75
// -make pushin duration 1 second
// -please adjust the 1st person framing to look a bit more to the right towards the gap for the stairs as shown in screenshot]
sRespawnCutscene.fFirstPersonPunchPhase = 0.75 //#2050744
sRespawnCutscene.vPushInDataDirectionMod = <<20,0,0>>
sRespawnCutscene.gp3rdCamPitch = -15.000
sRespawnCutscene.gp3rdCamHead = -15.000
BREAK
DEFAULT
#IF IS_DEBUG_BUILD
CASSERTLN(DEBUG_RESPAWN, "invalid ePoliceStation in RUN_ARREST_CUTSCENE()")
#ENDIF
EXIT
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_RESPAWN, "Player distance from ", Get_Police_Respawn_Name(ePoliceStation), ": ", VDIST(vPlayerCoord, sRespawnCutscene.vAnimPos), "m.")
#ENDIF
Force_All_Drunk_Peds_To_Become_Sober_And_Quit_Camera()
ADVANCE_FRIEND_TIMERS(10.0)
sRespawnCutscene.DialogueTextLabel = ""
sRespawnCutscene.fDialoguePhase = -1
#IF IS_DEBUG_BUILD
sRespawnCutscene.respawn_widgetId = respawn_widget_group_id
#ENDIF
RUN_RESPAWN_CUTSCENE(pPoliceStationDebugName, sRespawnCutscene, "AM_H_BUSTED")
ENDPROC
/// PURPOSE: This is where we take care of all the code that needs to be run
/// after a recent deatharrest. This proc should only be called once
/// for every deatharrest.
PROC PERFORM_RESPAWN_ROUTINE_AFTER_DEATHARREST()
CPRINTLN(DEBUG_RESPAWN, "Performing respawn routine after death/arrest.")
IF (iOffmissionRespawnEffectsStage <> 99)
// not started fail effect, do it now
SET_FADE_OUT_AFTER_DEATH(TRUE)
SET_FADE_OUT_AFTER_ARREST(TRUE)
PAUSE_DEATH_ARREST_RESTART(FALSE)
DISPLAY_HUD(TRUE)
Replay_Control_Fail_Effect(FALSE)
Replay_Control_Fail_Out_Effect(FALSE)
Replay_Control_Slow_Motion(FALSE)
IF NOT IS_STRING_NULL_OR_EMPTY(sOffmissionRespawnAudioScene)
CPRINTLN(DEBUG_RESPAWN, "Stopping audio scene \"", sOffmissionRespawnAudioScene, "\".")
STOP_AUDIO_SCENE(sOffmissionRespawnAudioScene)
sOffmissionRespawnAudioScene = ""
ENDIF
iOffmissionRespawnEffectsStage = 99
ENDIF
enumCharacterList ePed = GET_CURRENT_PLAYER_PED_ENUM()
// Generic player state cleanup.
CLEANUP_PLAYER_STATE_ON_RESPAWN()
// Run this once now. It will be run again in the next stage to ensure it has completed.
RUN_CUSTOM_CLEANUP_ON_RESPAWN()
// Fix for 1158192. Clear scene disrupted help on respawn.
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("AM_H_DISRU")
CLEAR_HELP(TRUE)
ENDIF
IF IS_FLOW_HELP_MESSAGE_QUEUED("AM_H_DISRU")
REMOVE_HELP_FROM_FLOW_QUEUE("AM_H_DISRU")
ENDIF
// only run this if g_bReplayDoRejectWarp = FALSE
// this is set to true if the player fails a mission as a character that is not unlocked in flow
// in this case we do not want to respawn him at the hospital / police station
IF g_bReplayDoRejectWarp = FALSE
// Death specific
IF HAS_PLAYER_HAD_RECENT_DEATH()
CPRINTLN(DEBUG_RESPAWN, "Processing recent death.")
// Run custom animation and camera on a death #810348
IF NOT IS_REPLAY_IN_PROGRESS()
AND NOT HAS_PLAYER_ACCEPTED_REPLAY()
RUN_DEATH_CUTSCENE()
ENDIF
// Deduct some cash (Bug #958353 - 5% of total, max of $5,000)
INT iCash = (GET_TOTAL_CASH(ePed))
iCash = FLOOR((TO_FLOAT(iCash/100) * 5.0))
iCash = CLAMP_INT(iCash, 0, 5000)
// Fix for B*1115962
// We don't take money of the player if they are accepting the replay
IF NOT ((g_replay.replayStageID = RS_ACTIVATE) OR (g_replay.replayStageID = RS_ACCEPTING))
IF iCash > 0
DO_HOSPITAL_FINANCE_PENALTY(ePed,iCash, GET_CLOSEST_HOSPITAL(GET_PLAYER_COORDS(GET_PLAYER_INDEX())))
ENDIF
ENDIF
//Fix for 184547. Hardcoding here saves us having to register savehouses specfifically for the anim test level.
//This simply forces the player position after a death on the anim test level.
#IF IS_DEBUG_BUILD
IF GET_INDEX_OF_CURRENT_LEVEL() = LEVEL_ANIM_TEST
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_PLAYER_START_POS())
ENDIF
ENDIF
#ENDIF
ENDIF
// Arrest specific
IF HAS_PLAYER_HAD_RECENT_ARREST()
CPRINTLN(DEBUG_RESPAWN, "Processing recent arrest.")
// Run custom animation and camera on a arrest #810348
IF NOT IS_REPLAY_IN_PROGRESS()
AND NOT HAS_PLAYER_ACCEPTED_REPLAY()
STORE_PLAYER_PED_WEAPONS(PLAYER_PED_ID())
INT iWeaponSlot
REPEAT NUM_WEAPONSLOTS iWeaponSlot
g_savedGlobals.sPlayerData.sInfo.sWeapons[ENUM_TO_INT(ePed)].sWeaponInfo[iWeaponSlot].iAmmoCount = 0
ENDREPEAT
REPEAT NUMBER_OF_DLC_WEAPONS iWeaponSlot
g_savedGlobals.sPlayerData.sInfo.sWeapons[ENUM_TO_INT(ePed)].sDLCWeaponInfo[iWeaponSlot].iAmmoCount = 0
ENDREPEAT
RESTORE_PLAYER_PED_WEAPONS(PLAYER_PED_ID())
RUN_ARREST_CUTSCENE()
ENDIF
// Deduct some cash (Bug #953002 - 300)
INT iCash = (GET_TOTAL_CASH(ePed))
iCash = CLAMP_INT(iCash, 0, 300)
IF iCash > 0
//DEBIT_BANK_ACCOUNT(ePed, BAAC_LESTER, iCash)
IF iCash > 0
DO_POLICE_FINANCE_PENALTY(ePed,iCash,GET_CLOSEST_POLICE_STATION(GET_PLAYER_COORDS(GET_PLAYER_INDEX())))
ENDIF
ENDIF
g_bReplayDoRejectWarp = FALSE
ENDIF
ELSE
CPRINTLN(DEBUG_RESPAWN, "Skipping death/arrest cutscene as g_bReplayDoRejectWarp = TRUE")
ENDIF
// Reinstate all savehouse blips incase we died inside one.
INT iSavehouse
REPEAT NUMBER_OF_SAVEHOUSE_LOCATIONS iSavehouse
Update_Savehouse_Respawn_Blip(INT_TO_ENUM(SAVEHOUSE_NAME_ENUM, iSavehouse))
ENDREPEAT
ENDPROC
#IF IS_DEBUG_BUILD
PROC MONITER_RESPAWN_MENU_SELECTION()
IF (g_eDebug_ForceHospitalRespawn <> NUMBER_OF_HOSPITAL_LOCATIONS)
IF IS_PLAYER_PLAYING(PLAYER_ID())
AND NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
AND NOT IS_PLAYER_BEING_ARRESTED(PLAYER_ID(), FALSE)
RUN_DEATH_CUTSCENE()
iHospitalSelection = ENUM_TO_INT(g_eDebug_ForceHospitalRespawn)
g_eDebug_ForceHospitalRespawn = NUMBER_OF_HOSPITAL_LOCATIONS
ENDIF
ENDIF
IF (g_eDebug_ForcePoliceStationRespawn <> NUMBER_OF_POLICE_STATION_LOCATIONS)
IF IS_PLAYER_PLAYING(PLAYER_ID())
AND NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
AND NOT IS_PLAYER_BEING_ARRESTED(PLAYER_ID(), FALSE)
RUN_ARREST_CUTSCENE()
iPoliceStationSelection = ENUM_TO_INT(g_eDebug_ForcePoliceStationRespawn)
g_eDebug_ForcePoliceStationRespawn = NUMBER_OF_POLICE_STATION_LOCATIONS
ENDIF
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD0)
enumCharacterList ePed = GET_CURRENT_PLAYER_PED_ENUM()
CASSERTLN(DEBUG_RESPAWN, "REMOVE_PLAYER_PED_AMMO")
STORE_PLAYER_PED_WEAPONS(PLAYER_PED_ID())
INT iWeaponSlot
REPEAT NUM_WEAPONSLOTS iWeaponSlot
g_savedGlobals.sPlayerData.sInfo.sWeapons[ENUM_TO_INT(ePed)].sWeaponInfo[iWeaponSlot].iAmmoCount = 0
ENDREPEAT
RESTORE_PLAYER_PED_WEAPONS(PLAYER_PED_ID())
ENDIF
ENDPROC
#ENDIF
// ===========================================================================================================
// Main Script
// ===========================================================================================================
SCRIPT
CPRINTLN(DEBUG_RESPAWN, "Starting respawn controller.")
// This script needs to cleanup only when the game moves from SP to MP
IF (HAS_FORCE_CLEANUP_OCCURRED(FORCE_CLEANUP_FLAG_SP_TO_MP | FORCE_CLEANUP_FLAG_DIRECTOR | FORCE_CLEANUP_FLAG_REPEAT_PLAY))
CPRINTLN(DEBUG_RESPAWN, "respawn_controller.sc has been forced to cleanup (SP to MP or Director Mode).")
CLEANUP_SCRIPT()
ENDIF
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("director_mode")) > 0
CPRINTLN(DEBUG_RESPAWN, "respawn_controller.sc has been forced to cleanup as Director Mode is already running.")
CLEANUP_SCRIPT()
ENDIF
// Setup some debug widgets
#IF IS_DEBUG_BUILD
respawn_widget_group_id = SETUP_RESPAWN_CONTROL_WIDGETS()
#ENDIF
CHECK_RESPAWN_LOCATION_SETUP()
// Main loop
WHILE (TRUE)
// Maintain the debug widgets
#IF IS_DEBUG_BUILD
MAINTAIN_RESPAWN_CONTROL_WIDGETS()
MONITER_RESPAWN_MENU_SELECTION()
#ENDIF
// Perform the main processing
IF (eScriptStage = SCRIPT_STAGE_WAIT_FOR_DEATHARREST)
IF IS_PED_INJURED(PLAYER_PED_ID())
OR IS_PLAYER_BEING_ARRESTED(PLAYER_ID(), FALSE)
iOffmissionRespawnEffectsStage = 0
eScriptStage = SCRIPT_STAGE_WAIT_FOR_RESPAWN
CPRINTLN(DEBUG_RESPAWN, "State change WAIT_FOR_DEATHARREST -> WAIT_FOR_RESPAWN")
ELSE
eScriptStage = SCRIPT_STAGE_WAIT_FOR_MISSION_CLEANUP
CPRINTLN(DEBUG_RESPAWN, "State change WAIT_FOR_DEATHARREST -> WAIT_FOR_MISSION_CLEANUP")
#IF IS_DEBUG_BUILD
IF g_bDebug_KeepRespawnControllerRunning
eScriptStage = SCRIPT_STAGE_WAIT_FOR_DEATHARREST
ENDIF
#ENDIF
ENDIF
ENDIF
IF (eScriptStage = SCRIPT_STAGE_WAIT_FOR_RESPAWN)
//Stops Respawn Controller from taking over replay_controller on-mission
IF NOT IS_BIT_SET(g_replay.iReplayBits,ENUM_TO_INT(RB_BLOCK_RESPAWN))
// Check for deatharrest
IF IS_PLAYER_PLAYING(PLAYER_ID())
AND NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
AND NOT IS_PLAYER_BEING_ARRESTED(PLAYER_ID(), FALSE)
IF NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_ANIMAL)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR)
PERFORM_RESPAWN_ROUTINE_AFTER_DEATHARREST()
ENDIF
eScriptStage = SCRIPT_STAGE_WAIT_FOR_MISSION_CLEANUP
CPRINTLN(DEBUG_RESPAWN, "State change WAIT_FOR_RESPAWN -> WAIT_FOR_MISSION_CLEANUP")
#IF IS_DEBUG_BUILD
IF g_bDebug_KeepRespawnControllerRunning
eScriptStage = SCRIPT_STAGE_WAIT_FOR_DEATHARREST
ENDIF
#ENDIF
ELSE
IF NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_ANIMAL)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR)
PERFORM_OFFMISSION_RESPAWN_EFFECTS()
ENDIF
ENDIF
ELSE
CPRINTLN(DEBUG_RESPAWN, "Can't process respawn right now as respawn controller is blocked")
ENDIF
ENDIF
IF (eScriptStage = SCRIPT_STAGE_WAIT_FOR_MISSION_CLEANUP)
IF RUN_CUSTOM_CLEANUP_ON_RESPAWN()
eScriptStage = SCRIPT_STAGE_CLEANUP
CPRINTLN(DEBUG_RESPAWN, "State change WAIT_FOR_MISSION_CLEANUP -> CLEANUP")
ENDIF
ENDIF
IF (eScriptStage = SCRIPT_STAGE_CLEANUP)
CLEANUP_SCRIPT()
ENDIF
WAIT(0)
ENDWHILE
ENDSCRIPT