////////////////////////////////////////////////////////////////////////////////////////// // // // SCRIPT NAME : respawnCutscene_private.sch // // AUTHOR : Alwyn Roberts // // DESCRIPTION : // // // ////////////////////////////////////////////////////////////////////////////////////////// USING "commands_graphics.sch" USING "mission_control_private.sch" USING "replay_public.sch" USING "push_in_public.sch" ENUM PLAYER_DAMAGE_ENUM PD_NONE = 0, /* # 1178145 Hospital 0 - No damage Hospital 1 - Bruise left forehead Hospital 2 - Bruise on right eye Hospital 3 - Bruise on right eye, Bruise on left cheek, Redness at right lower lip Hospital 4 - Bruise on left eye, Cut on left cheek, Bruise on right jawbone Hospital 5 - Small cut on right cheek, Cuts on right brow, Bruise on left eye, Bloody part on left eye tearduct. Hospital 6 - Bruise on right eye, Bruise on left eye, Small cut on right cheek, Bloody Nose Hospital 7 - Bruise on left eye, Redness and scuffs on left brow, Cuts on Chin Hospital 8 - Cuts on chin, Cuts on right cheek, Bruise on left eye Hospital 9 - Bruise left cheek, Bruise right eye, Bruise left eye, Bloody nose, Scars on lower lip */ PD_0_chinBruise = BIT0, PD_1_plasterForehead = BIT1, PD_2_foreheadBruise = BIT2, PD_3_noseBruise = BIT3, PD_4_lefteyeBruise = BIT4, PD_5_splatterLeft = BIT5, PD_6_splatterLeft = BIT6, PD_7_splatterLeft = BIT7, PD_8_splatterLeft = BIT8, PD_9_cutNose = BIT9 ENDENUM FUNC INT iPOWER(INT iThisNumber, INT iThisPower) INT iLoopControl INT iInitialValue = iThisNumber INT iResult = 0 IF iThisPower = 0 iResult = 1 //n^0 = 1 ELIF iThisPower = 1 iResult = iThisNumber ELIF iThisPower < 0 iLoopControl = -iThisPower + 1 WHILE iLoopControl > 0 iThisNumber *= iInitialValue iLoopControl-- ENDWHILE iResult = 1 / iThisNumber ELIF iThisPower > 1 iLoopControl = iThisPower - 1 WHILE iLoopControl > 0 iThisNumber *= iInitialValue iLoopControl-- ENDWHILE iResult = iThisNumber ENDIF RETURN iResult ENDFUNC PROC APPLY_DEATHARREST_DAMAGE_DECALS(PED_INDEX PedIndex, PLAYER_DAMAGE_ENUM ePlayerDamage) IF IS_BITMASK_ENUM_AS_ENUM_SET(ePlayerDamage, PD_0_chinBruise) APPLY_PED_DAMAGE_PACK(pedIndex, "HOSPITAL_0", 0.0, 1.0) CPRINTLN(DEBUG_RESPAWN, " APPLY_PED_DAMAGE_DECAL(\"HOSPITAL_0\") //PD_0_chinBruise") ENDIF IF IS_BITMASK_ENUM_AS_ENUM_SET(ePlayerDamage, PD_1_plasterForehead) APPLY_PED_DAMAGE_PACK(pedIndex, "HOSPITAL_1", 0.0, 1.0) CPRINTLN(DEBUG_RESPAWN, " APPLY_PED_DAMAGE_DECAL(\"HOSPITAL_1\") //PD_1_plasterForehead") ENDIF IF IS_BITMASK_ENUM_AS_ENUM_SET(ePlayerDamage, PD_2_foreheadBruise) APPLY_PED_DAMAGE_PACK(pedIndex, "HOSPITAL_2", 0.0, 1.0) CPRINTLN(DEBUG_RESPAWN, " APPLY_PED_DAMAGE_DECAL(\"HOSPITAL_2\") //PD_2_foreheadBruise") ENDIF IF IS_BITMASK_ENUM_AS_ENUM_SET(ePlayerDamage, PD_3_noseBruise) APPLY_PED_DAMAGE_PACK(pedIndex, "HOSPITAL_3", 0.0, 1.0) CPRINTLN(DEBUG_RESPAWN, " APPLY_PED_DAMAGE_DECAL(\"HOSPITAL_3\") //PD_3_noseBruise") ENDIF IF IS_BITMASK_ENUM_AS_ENUM_SET(ePlayerDamage, PD_4_lefteyeBruise) APPLY_PED_DAMAGE_PACK(pedIndex, "HOSPITAL_4", 0.0, 1.0) CPRINTLN(DEBUG_RESPAWN, " APPLY_PED_DAMAGE_DECAL(\"HOSPITAL_4\") //PD_4_lefteyeBruise") ENDIF IF IS_BITMASK_ENUM_AS_ENUM_SET(ePlayerDamage, PD_5_splatterLeft) APPLY_PED_DAMAGE_PACK(pedIndex, "HOSPITAL_5", 0.0, 1.0) CPRINTLN(DEBUG_RESPAWN, " APPLY_PED_DAMAGE_DECAL(\"HOSPITAL_5\") //PD_5_splatterLeft") ENDIF IF IS_BITMASK_ENUM_AS_ENUM_SET(ePlayerDamage, PD_6_splatterLeft) APPLY_PED_DAMAGE_PACK(pedIndex, "HOSPITAL_6", 0.0, 1.0) CPRINTLN(DEBUG_RESPAWN, " APPLY_PED_DAMAGE_DECAL(\"HOSPITAL_6\") //PD_6_splatterLeft") ENDIF IF IS_BITMASK_ENUM_AS_ENUM_SET(ePlayerDamage, PD_7_splatterLeft) APPLY_PED_DAMAGE_PACK(pedIndex, "HOSPITAL_7", 0.0, 1.0) CPRINTLN(DEBUG_RESPAWN, " APPLY_PED_DAMAGE_DECAL(\"HOSPITAL_7\") //PD_7_splatterLeft") ENDIF IF IS_BITMASK_ENUM_AS_ENUM_SET(ePlayerDamage, PD_8_splatterLeft) APPLY_PED_DAMAGE_PACK(pedIndex, "HOSPITAL_8", 0.0, 1.0) CPRINTLN(DEBUG_RESPAWN, " APPLY_PED_DAMAGE_DECAL(\"HOSPITAL_8\") //PD_8_splatterLeft") ENDIF IF IS_BITMASK_ENUM_AS_ENUM_SET(ePlayerDamage, PD_9_cutNose) APPLY_PED_DAMAGE_PACK(pedIndex, "HOSPITAL_9", 0.0, 1.0) CPRINTLN(DEBUG_RESPAWN, " APPLY_PED_DAMAGE_DECAL(\"HOSPITAL_9\") //PD_9_cutNose") ENDIF IF IS_BITMASK_ENUM_AS_ENUM_SET(ePlayerDamage, PD_NONE) // CPRINTLN(DEBUG_RESPAWN, " APPLY_PED_DAMAGE_DECAL() //PD_NONE") ENDIF ENDPROC PROC DisableControlAction(CONTROL_TYPE control, CONTROL_ACTION action, INT &iOffset_y) DISABLE_CONTROL_ACTION(control, action) iOffset_y++ #IF IS_DEBUG_BUILD TEXT_LABEL_63 str = "" HUD_COLOURS eColour = HUD_COLOUR_PURE_WHITE SWITCH control CASE PLAYER_CONTROL eColour = HUD_COLOUR_REDLIGHT BREAK CASE CAMERA_CONTROL eColour = HUD_COLOUR_GREENLIGHT BREAK CASE FRONTEND_CONTROL eColour = HUD_COLOUR_BLUELIGHT BREAK ENDSWITCH SWITCH action CASE INPUT_LOOK_BEHIND str += ("INPUT_LOOK_BEHIND") BREAK CASE INPUT_VEH_LOOK_BEHIND str += ("INPUT_VEH_LOOK_BEHIND") BREAK CASE INPUT_LOOK_LR str += ("INPUT_LOOK_LR") BREAK CASE INPUT_LOOK_UD str += ("INPUT_LOOK_UD") BREAK CASE INPUT_SPRINT str += ("INPUT_SPRINT") BREAK CASE INPUT_JUMP str += ("INPUT_JUMP") BREAK CASE INPUT_DUCK str += ("INPUT_DUCK") BREAK CASE INPUT_MELEE_ATTACK_ALTERNATE str += ("INPUT_MELEE_ATTACK_ALTERNATE") BREAK CASE INPUT_MELEE_ATTACK_HEAVY str += ("INPUT_MELEE_ATTACK_HEAVY") BREAK CASE INPUT_MELEE_ATTACK_LIGHT str += ("INPUT_MELEE_ATTACK_LIGHT") BREAK CASE INPUT_MELEE_ATTACK1 str += ("INPUT_MELEE_ATTACK1") BREAK CASE INPUT_MELEE_ATTACK2 str += ("INPUT_MELEE_ATTACK2") BREAK CASE INPUT_MOVE_LR str += ("INPUT_MOVE_LR") BREAK CASE INPUT_MOVE_UD str += ("INPUT_MOVE_UD") BREAK DEFAULT str += ("INPUT_") str += ENUM_TO_INT(action) str += ("_UNKNOWN") BREAK ENDSWITCH IF IS_DISABLED_CONTROL_PRESSED(control, action) DrawDebugSceneTextWithOffset(str, GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), TO_FLOAT(iOffset_y), eColour) ELSE DrawDebugSceneTextWithOffset(str, GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), TO_FLOAT(iOffset_y), eColour, 0.25) ENDIF #ENDIF ENDPROC STRUCT RESPAWN_CUTSCENE_STRUCT STRING pAnimDictName STRING pAnimClipName STRING pAnimCamName FLOAT fRollingBlendoutPhase = 0.95 PED_MOTION_STATE ePedMotionState VECTOR vAnimPos VECTOR vAnimRot TEXT_LABEL DialogueTextLabel FLOAT fDialoguePhase STRING pFacialDictName STRING pFacialClipName PLAYER_DAMAGE_ENUM ePlayerDamage VECTOR vTrafficOffset, vTrafficBounds BOOL bSeenFirstTimeHelp STRING effectName STRING soundSetName STRING soundNameA, soundNameB #IF IS_DEBUG_BUILD WIDGET_GROUP_ID respawn_widgetId #ENDIF FLOAT gpCamPitch = 999.0 FLOAT gpCamHead = 999.0 BOOL bStartedPushin = FALSE BOOL bShortCircuitedPushin = FALSE PUSH_IN_DATA sPushInData FLOAT fFirstPersonPunchPhase = 999.0 VECTOR vPushInDataDirectionMod FLOAT gp3rdCamPitch FLOAT gp3rdCamHead ENDSTRUCT PROC RUN_RESPAWN_CUTSCENE(STRING pSceneDebugName, RESPAWN_CUTSCENE_STRUCT &sRespawnCutscene, STRING HelpTextLabel) CONST_FLOAT fRESPAWN_CUTSCENE_RADIUS 15.0 //5.0 FLOAT fAnimPhase = 0.0 #IF IS_DEBUG_BUILD FLOAT fAnimPos_heightDiff = 0.0 INT iDamage TEXT_LABEL_63 str BOOL bUpdateRespawnScene, bUpdateDamageDecal[10], bTestRespawnCamPichHeading WIDGET_GROUP_ID first_time_deatharrest_widget_group_id SET_CURRENT_WIDGET_GROUP(sRespawnCutscene.respawn_widgetId) str = "Respawn Cutscene [" str += pSceneDebugName str += "]" CPRINTLN(DEBUG_RESPAWN, "RUN_RESPAWN_CUTSCENE(\"", pSceneDebugName, "\")") first_time_deatharrest_widget_group_id = START_WIDGET_GROUP(str) str = "clip: \"" str += sRespawnCutscene.pAnimClipName str += "\", cam: \"" str += sRespawnCutscene.pAnimCamName str += "\"" ADD_WIDGET_FLOAT_SLIDER(str, fAnimPhase, 0.0, 1.0, 0.01) CONST_FLOAT SLIDER_RANGE 10.0 CONST_FLOAT SLIDER_STEP 0.01 ADD_WIDGET_STRING("synch scene origin") ADD_WIDGET_FLOAT_SLIDER("vAnimPos x", sRespawnCutscene.vAnimPos.x, sRespawnCutscene.vAnimPos.x-SLIDER_RANGE, sRespawnCutscene.vAnimPos.x+SLIDER_RANGE, SLIDER_STEP) ADD_WIDGET_FLOAT_SLIDER("vAnimPos y", sRespawnCutscene.vAnimPos.y, sRespawnCutscene.vAnimPos.y-SLIDER_RANGE, sRespawnCutscene.vAnimPos.y+SLIDER_RANGE, SLIDER_STEP) ADD_WIDGET_FLOAT_SLIDER("vAnimPos z", sRespawnCutscene.vAnimPos.z, sRespawnCutscene.vAnimPos.z-SLIDER_RANGE, sRespawnCutscene.vAnimPos.z+SLIDER_RANGE, SLIDER_STEP*0.1) ADD_WIDGET_FLOAT_READ_ONLY("fAnimPos_heightDiff", fAnimPos_heightDiff) IF (sRespawnCutscene.vAnimRot.z > 180) sRespawnCutscene.vAnimRot.z -=360 ENDIF IF (sRespawnCutscene.vAnimRot.z < -180) sRespawnCutscene.vAnimRot.z +=360 ENDIF ADD_WIDGET_VECTOR_SLIDER("vAnimRot", sRespawnCutscene.vAnimRot, -180, 180, 1.0) str = "help: \"" str += HelpTextLabel str += "\"" ADD_WIDGET_STRING(str) ADD_WIDGET_BOOL("bUpdateRespawnScene", bUpdateRespawnScene) START_WIDGET_GROUP("damage decals") REPEAT COUNT_OF(bUpdateDamageDecal) iDamage bUpdateDamageDecal[iDamage] = IS_BITMASK_ENUM_AS_ENUM_SET(sRespawnCutscene.ePlayerDamage, INT_TO_ENUM(PLAYER_DAMAGE_ENUM, iPOWER(2, iDamage))) ENDREPEAT ADD_WIDGET_BOOL("PD_0_chinBruise", bUpdateDamageDecal[0]) ADD_WIDGET_BOOL("PD_1_plasterForehead", bUpdateDamageDecal[1]) ADD_WIDGET_BOOL("PD_2_foreheadBruise", bUpdateDamageDecal[2]) ADD_WIDGET_BOOL("PD_3_noseBruise", bUpdateDamageDecal[3]) ADD_WIDGET_BOOL("PD_4_lefteyeBruise", bUpdateDamageDecal[4]) ADD_WIDGET_BOOL("PD_5_splatterLeft", bUpdateDamageDecal[5]) ADD_WIDGET_BOOL("PD_6_splatterLeft", bUpdateDamageDecal[6]) ADD_WIDGET_BOOL("PD_7_splatterLeft", bUpdateDamageDecal[7]) ADD_WIDGET_BOOL("PD_8_splatterLeft", bUpdateDamageDecal[8]) ADD_WIDGET_BOOL("PD_9_cutNose", bUpdateDamageDecal[9]) STOP_WIDGET_GROUP() START_WIDGET_GROUP("traffic") ADD_WIDGET_VECTOR_SLIDER("vTrafficOffset", sRespawnCutscene.vTrafficOffset, -50, 50, 0.1) ADD_WIDGET_VECTOR_SLIDER("vTrafficBounds", sRespawnCutscene.vTrafficBounds, 0, 50, 1.0) STOP_WIDGET_GROUP() IF ((sRespawnCutscene.gpCamPitch != 999.0) AND (sRespawnCutscene.gpCamHead != 999.0)) OR ((sRespawnCutscene.gp3rdCamPitch != 999.0) AND (sRespawnCutscene.gp3rdCamHead != 999.0)) START_WIDGET_GROUP("gpCamPitch and Head") IF NOT (sRespawnCutscene.gpCamPitch = 999.0) AND NOT (sRespawnCutscene.gpCamHead = 999.0) ADD_WIDGET_FLOAT_SLIDER("gpCamPitch", sRespawnCutscene.gpCamPitch, -360, 360, 1.0) ADD_WIDGET_FLOAT_SLIDER("gpCamHead", sRespawnCutscene.gpCamHead, -360, 360, 1.0) ENDIF IF NOT (sRespawnCutscene.gp3rdCamPitch = 999.0) AND NOT (sRespawnCutscene.gp3rdCamHead = 999.0) ADD_WIDGET_FLOAT_SLIDER("gp3rdCamPitch", sRespawnCutscene.gp3rdCamPitch, -360, 360, 1.0) ADD_WIDGET_FLOAT_SLIDER("gp3rdCamHead", sRespawnCutscene.gp3rdCamHead, -360, 360, 1.0) ENDIF ADD_WIDGET_BOOL("bTestRespawnCamPichHeading", bTestRespawnCamPichHeading) STOP_WIDGET_GROUP() ENDIF START_WIDGET_GROUP("1st person") IF sRespawnCutscene.fFirstPersonPunchPhase != 999.0 ADD_WIDGET_FLOAT_SLIDER("fFirstPersonPunchPhase", sRespawnCutscene.fFirstPersonPunchPhase, 0.0, 1.0, 0.01) ELSE ADD_WIDGET_FLOAT_READ_ONLY("fFirstPersonPunchPhase", sRespawnCutscene.fFirstPersonPunchPhase) ENDIF ADD_WIDGET_VECTOR_SLIDER("vPushInDataDirectionMod", sRespawnCutscene.vPushInDataDirectionMod, -90, 90, 0.01) STOP_WIDGET_GROUP() STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(sRespawnCutscene.respawn_widgetId) #ENDIF SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), TRUE) ENDIF REMOVE_PARTICLE_FX_IN_RANGE(sRespawnCutscene.vAnimPos, REPLAY_LOAD_SCENE_SIZE) REMOVE_DECALS_IN_RANGE(sRespawnCutscene.vAnimPos, REPLAY_LOAD_SCENE_SIZE) CLEAR_AREA(sRespawnCutscene.vAnimPos, 5.0, TRUE) SET_ENTITY_COORDS(PLAYER_PED_ID(), sRespawnCutscene.vAnimPos) FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE) WAIT(0) SET_GAME_PAUSED(TRUE) // load the stream vol REQUEST_ANIM_DICT(sRespawnCutscene.pAnimDictName) IF IS_STRING_NULL_OR_EMPTY(sRespawnCutscene.pFacialDictName) CPRINTLN(DEBUG_RESPAWN, " REQUEST_ANIM_DICT(\"", sRespawnCutscene.pAnimDictName, "\")") ELSE CPRINTLN(DEBUG_RESPAWN, " REQUEST_ANIM_DICT(\"", sRespawnCutscene.pAnimDictName, "\" and \"", sRespawnCutscene.pFacialDictName, "\")") REQUEST_ANIM_DICT(sRespawnCutscene.pFacialDictName) ENDIF IF NOT IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_OUT(0) ENDIF Replay_TeleportPlayer(sRespawnCutscene.vAnimPos, sRespawnCutscene.vAnimRot.z) IF NOT IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_OUT(0) ENDIF INT iRespawnTimeoutGametime = GET_GAME_TIMER() + REPLAY_LOAD_SCENE_TIMEOUT BOOL bRespawnAssetsLoading = FALSE sRespawnCutscene.bShortCircuitedPushin = FALSE WHILE NOT bRespawnAssetsLoading AND iRespawnTimeoutGametime > GET_GAME_TIMER() bRespawnAssetsLoading = TRUE REQUEST_ANIM_DICT(sRespawnCutscene.pAnimDictName) IF NOT HAS_ANIM_DICT_LOADED(sRespawnCutscene.pAnimDictName) bRespawnAssetsLoading = FALSE #IF IS_DEBUG_BUILD CDEBUG1LN(DEBUG_RESPAWN, " HAS_ANIM_DICT_LOADED(\"", sRespawnCutscene.pAnimDictName, "\")") #ENDIF ENDIF IF NOT IS_STRING_NULL_OR_EMPTY(sRespawnCutscene.pFacialDictName) REQUEST_ANIM_DICT(sRespawnCutscene.pFacialDictName) IF NOT HAS_ANIM_DICT_LOADED(sRespawnCutscene.pFacialDictName) bRespawnAssetsLoading = FALSE #IF IS_DEBUG_BUILD CDEBUG1LN(DEBUG_RESPAWN, " HAS_ANIM_DICT_LOADED(\"", sRespawnCutscene.pFacialDictName, "\")") #ENDIF ENDIF ENDIF IF NOT IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_OUT(0) ENDIF WAIT(0) ENDWHILE #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_RESPAWN, " loadscene and assets took ", iRespawnTimeoutGametime - GET_GAME_TIMER(), "ms") #ENDIF Force_All_Drunk_Peds_To_Become_Sober_And_Quit_Camera() IF NOT ARE_VECTORS_EQUAL(sRespawnCutscene.vTrafficBounds, <<0,0,0>>) SET_ROADS_IN_AREA((sRespawnCutscene.vAnimPos+sRespawnCutscene.vTrafficOffset)-sRespawnCutscene.vTrafficBounds, (sRespawnCutscene.vAnimPos+sRespawnCutscene.vTrafficOffset)+sRespawnCutscene.vTrafficBounds, FALSE) CLEAR_AREA_OF_VEHICLES((sRespawnCutscene.vAnimPos+sRespawnCutscene.vTrafficOffset), VMAG(sRespawnCutscene.vTrafficBounds)+25.0) CLEAR_AREA((sRespawnCutscene.vAnimPos+sRespawnCutscene.vTrafficOffset), VMAG(sRespawnCutscene.vTrafficBounds)+25.0, TRUE) ENDIF IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID()) SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE) CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) ENDIF FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE) SET_GAME_PAUSED(FALSE) CLEAR_AREA(sRespawnCutscene.vAnimPos, fRESPAWN_CUTSCENE_RADIUS, TRUE) INSTANTLY_FILL_PED_POPULATION() INSTANTLY_FILL_VEHICLE_POPULATION() Set_Leave_Area_Flag_For_All_Blipped_Missions() // wait for replay processing to finish before fading in for cut-scene WHILE IS_REPLAY_BEING_PROCESSED() WAIT(0) CPRINTLN(DEBUG_RESPAWN, "RUN_RESPAWN_CUTSCENE waiting for replay processing to complete") ENDWHILE IF NOT IS_SCREEN_FADED_IN() AND NOT IS_SCREEN_FADING_IN() DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME_SHORT) ENDIF SET_FADE_IN_AFTER_DEATH_ARREST(TRUE) BOOL bPedForcedToUseScripCamHeadingFlag INT iSceneId CAMERA_INDEX respawnCamIndex IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) iSceneId = CREATE_SYNCHRONIZED_SCENE(sRespawnCutscene.vAnimPos, sRespawnCutscene.vAnimRot) SET_SYNCHRONIZED_SCENE_LOOPED(iSceneId, FALSE) SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iSceneId, FALSE) respawnCamIndex = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", TRUE) SYNCED_SCENE_PLAYBACK_FLAGS flags = SYNCED_SCENE_DONT_INTERRUPT IF (sRespawnCutscene.ePedMotionState <> MS_ON_FOOT_IDLE) flags |= SYNCED_SCENE_TAG_SYNC_OUT ENDIF APPLY_DEATHARREST_DAMAGE_DECALS(PLAYER_PED_ID(), sRespawnCutscene.ePlayerDamage) TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSceneId, sRespawnCutscene.pAnimDictName, sRespawnCutscene.pAnimClipName, INSTANT_BLEND_IN, WALK_BLEND_OUT, flags) SET_FORCE_FOOTSTEP_UPDATE(PLAYER_PED_ID(), TRUE) SET_PLAYER_CLOTH_PIN_FRAMES(PLAYER_ID(), 1) bPedForcedToUseScripCamHeadingFlag = GET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_ForcePedToUseScripCamHeading) SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_ForcePedToUseScripCamHeading, TRUE) PLAY_SYNCHRONIZED_CAM_ANIM(respawnCamIndex, iSceneId, sRespawnCutscene.pAnimCamName, sRespawnCutscene.pAnimDictName) RENDER_SCRIPT_CAMS(TRUE, FALSE) IF NOT IS_STRING_NULL_OR_EMPTY(sRespawnCutscene.pFacialDictName) AND NOT IS_STRING_NULL_OR_EMPTY(sRespawnCutscene.pFacialClipName) CPRINTLN(DEBUG_RESPAWN, "RUN_RESPAWN_CUTSCENE play facial \"", sRespawnCutscene.pFacialDictName, "\", \"", sRespawnCutscene.pFacialClipName, "\"") TASK_PLAY_ANIM(PLAYER_PED_ID(), sRespawnCutscene.pFacialDictName, sRespawnCutscene.pFacialClipName, INSTANT_BLEND_IN, WALK_BLEND_OUT, 10000, AF_SECONDARY | AF_LOOPING) ENDIF ELSE #IF IS_DEBUG_BUILD SCRIPT_ASSERT("player is dead at respawn??") #ENDIF iSceneId = -1 ENDIF IF NOT sRespawnCutscene.bSeenFirstTimeHelp IF NOT IS_STRING_NULL_OR_EMPTY(HelpTextLabel) PRINT_HELP(HelpTextLabel) sRespawnCutscene.bSeenFirstTimeHelp = TRUE ENDIF ENDIF BOOL bPlayedsRespawnCutsceneDialogueTextLabel = FALSE, bEffectOrSoundPlayed = FALSE structPedsForConversation MyLocalPedStruct IF NOT IS_STRING_NULL_OR_EMPTY(sRespawnCutscene.DialogueTextLabel) enumCharacterList ePlayerChar = GET_CURRENT_PLAYER_PED_ENUM() INT iPlayerVoiceNum = -1 STRING tPlayerVoiceID = "" SWITCH ePlayerChar CASE CHAR_MICHAEL iPlayerVoiceNum = 0 tPlayerVoiceID = "MICHAEL" BREAK CASE CHAR_FRANKLIN iPlayerVoiceNum = 1 tPlayerVoiceID = "FRANKLIN" BREAK CASE CHAR_TREVOR iPlayerVoiceNum = 2 tPlayerVoiceID = "TREVOR" BREAK DEFAULT SCRIPT_ASSERT("invalid ePlayerChar") BREAK ENDSWITCH ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, iPlayerVoiceNum, PLAYER_PED_ID(), tPlayerVoiceID) ENDIF IF IS_SYNCHRONIZED_SCENE_RUNNING(iSceneId) #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_RESPAWN, "SYNCHRONIZED_SCENE_RUNNING(", iSceneId, ")") #ENDIF STRING sWalkInterruptible = "WalkInterruptible" STRING sForceBlendout = "ForceBlendout" WHILE IS_SYNCHRONIZED_SCENE_RUNNING(iSceneId) AND NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) IF NOT bEffectOrSoundPlayed IF NOT IS_SCREEN_FADED_OUT() IF NOT IS_STRING_NULL_OR_EMPTY(sRespawnCutscene.effectName) CONST_INT durationMs 0 //3000 ANIMPOSTFX_PLAY(sRespawnCutscene.effectName, durationMs, FALSE) CPRINTLN(DEBUG_RESPAWN, "RUN_RESPAWN_CUTSCENE animpostfx play \"", sRespawnCutscene.effectName, "\", ", durationMs) bEffectOrSoundPlayed = TRUE ENDIF IF NOT IS_STRING_NULL_OR_EMPTY(sRespawnCutscene.soundSetName) IF NOT IS_STRING_NULL_OR_EMPTY(sRespawnCutscene.soundNameA) PLAY_SOUND_FRONTEND(-1, sRespawnCutscene.soundNameA, sRespawnCutscene.soundSetName, FALSE) CPRINTLN(DEBUG_RESPAWN, "RUN_RESPAWN_CUTSCENE play sound frontend \"", sRespawnCutscene.soundNameA, "\", \"", sRespawnCutscene.soundSetName, "\"") bEffectOrSoundPlayed = TRUE ENDIF IF NOT IS_STRING_NULL_OR_EMPTY(sRespawnCutscene.soundNameB) PLAY_SOUND_FRONTEND(-1, sRespawnCutscene.soundNameB, sRespawnCutscene.soundSetName, FALSE) CPRINTLN(DEBUG_RESPAWN, "RUN_RESPAWN_CUTSCENE play sound frontend \"", sRespawnCutscene.soundNameB, "\", \"", sRespawnCutscene.soundSetName, "\"") bEffectOrSoundPlayed = TRUE ENDIF ENDIF ENDIF ENDIF // Hide the HUD HIDE_HUD_AND_RADAR_THIS_FRAME() HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_FEED) CLEAR_REMINDER_MESSAGE() DISABLE_CELLPHONE_THIS_FRAME_ONLY() //Is the global wait timer at 0? INT iGameTime = GET_GAME_TIMER() IF iGameTime >= g_iGlobalWaitTime - 0500 ADD_GLOBAL_COMMUNICATION_DELAY(CC_DELAY_POST_AMBIENT_SWITCH / 2) ENDIF FLOAT ReturnStartPhase = -1, ReturnEndPhase = -1 #IF IS_DEBUG_BUILD IF NOT bUpdateRespawnScene #ENDIF fAnimPhase = GET_SYNCHRONIZED_SCENE_PHASE(iSceneId) #IF IS_DEBUG_BUILD ENDIF #ENDIF #IF IS_DEBUG_BUILD IF bUpdateRespawnScene IF NOT IS_SYNCHRONIZED_SCENE_LOOPED(iSceneId) SET_SYNCHRONIZED_SCENE_LOOPED(iSceneId, TRUE) REPEAT COUNT_OF(bUpdateDamageDecal) iDamage bUpdateDamageDecal[iDamage] = IS_BITMASK_ENUM_AS_ENUM_SET(sRespawnCutscene.ePlayerDamage, INT_TO_ENUM(PLAYER_DAMAGE_ENUM, iPOWER(2, iDamage))) ENDREPEAT SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE) ENDIF SET_SYNCHRONIZED_SCENE_ORIGIN(iSceneId, sRespawnCutscene.vAnimPos, sRespawnCutscene.vAnimRot) SET_SYNCHRONIZED_SCENE_PHASE(iSceneId, fAnimPhase) IF bTestRespawnCamPichHeading IF IS_CAM_RENDERING(respawnCamIndex) RENDER_SCRIPT_CAMS(FALSE, FALSE) ENDIF IF GET_FOLLOW_PED_CAM_VIEW_MODE() != CAM_VIEW_MODE_FIRST_PERSON SET_GAMEPLAY_CAM_RELATIVE_PITCH(sRespawnCutscene.gpCamPitch) SET_GAMEPLAY_CAM_RELATIVE_HEADING(sRespawnCutscene.gpCamHead) ELSE SET_GAMEPLAY_CAM_RELATIVE_PITCH(sRespawnCutscene.gp3rdCamPitch) SET_GAMEPLAY_CAM_RELATIVE_HEADING(sRespawnCutscene.gp3rdCamHead) SET_FIRST_PERSON_SHOOTER_CAMERA_PITCH(sRespawnCutscene.gp3rdCamPitch) SET_FIRST_PERSON_SHOOTER_CAMERA_HEADING(sRespawnCutscene.gp3rdCamHead) ENDIF ELSE IF NOT IS_CAM_RENDERING(respawnCamIndex) RENDER_SCRIPT_CAMS(TRUE, FALSE) ENDIF ENDIF FLOAT fPlayerCoord_groundZ = 0.0 VECTOR vPlayerCoord = GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE) IF GET_GROUND_Z_FOR_3D_COORD(vPlayerCoord, fPlayerCoord_groundZ) fAnimPos_heightDiff = (vPlayerCoord.z - 1) - fPlayerCoord_groundZ ELSE fAnimPos_heightDiff = 0.0 ENDIF BOOL bUpdatedDamageDecals = FALSE REPEAT COUNT_OF(bUpdateDamageDecal) iDamage PLAYER_DAMAGE_ENUM eDamageBit = INT_TO_ENUM(PLAYER_DAMAGE_ENUM, iPOWER(2, iDamage)) IF bUpdateDamageDecal[iDamage] <> IS_BITMASK_ENUM_AS_ENUM_SET(sRespawnCutscene.ePlayerDamage, eDamageBit) IF bUpdateDamageDecal[iDamage] SET_BITMASK_ENUM_AS_ENUM(sRespawnCutscene.ePlayerDamage, eDamageBit) ELSE CLEAR_BITMASK_ENUM_AS_ENUM(sRespawnCutscene.ePlayerDamage, eDamageBit) ENDIF bUpdatedDamageDecals = TRUE ENDIF ENDREPEAT IF bUpdatedDamageDecals IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) CLEAR_PED_BLOOD_DAMAGE(PLAYER_PED_ID()) RESET_PED_VISIBLE_DAMAGE(PLAYER_PED_ID()) APPLY_DEATHARREST_DAMAGE_DECALS(PLAYER_PED_ID(), sRespawnCutscene.ePlayerDamage) ENDIF ENDIF IF g_bDrawLiteralSceneString DRAW_DEBUG_BOX((sRespawnCutscene.vAnimPos+sRespawnCutscene.vTrafficOffset)-sRespawnCutscene.vTrafficBounds, (sRespawnCutscene.vAnimPos+sRespawnCutscene.vTrafficOffset)+sRespawnCutscene.vTrafficBounds, 000,128,000,064) IF DOES_CAM_EXIST(respawnCamIndex) VECTOR vRenderingCamPos = GET_CAM_COORD(respawnCamIndex) // VECTOR vRenderingCamOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(PLAYER_PED_ID(), vRenderingCamPos) VECTOR vRenderingCamRot = GET_CAM_ROT(respawnCamIndex) VECTOR vModifiedRenderingCamRot = vRenderingCamRot+ sRespawnCutscene.vPushInDataDirectionMod // VECTOR vRenderingCamOffsetRot = vModifiedRenderingCamRot - GET_ENTITY_ROTATION(PLAYER_PED_ID()) VECTOR vRenderingCamDirection = <<-SIN(vModifiedRenderingCamRot.z) * COS(vModifiedRenderingCamRot.x), COS(vModifiedRenderingCamRot.z) * COS(vModifiedRenderingCamRot.x), SIN(vModifiedRenderingCamRot.x)>> // VECTOR vRenderingCamAttachedDirection = <<-SIN(vRenderingCamOffsetRot.z) * COS(vRenderingCamOffsetRot.x), COS(vRenderingCamOffsetRot.z) * COS(vRenderingCamOffsetRot.x), SIN(vRenderingCamOffsetRot.x)>> DRAW_DEBUG_LINE(vRenderingCamPos + (vRenderingCamDirection * VDIST(vRenderingCamPos, GET_ENTITY_COORDS(PLAYER_PED_ID()))), vRenderingCamPos) DRAW_DEBUG_SPHERE(vRenderingCamPos + (vRenderingCamDirection * VDIST(vRenderingCamPos, GET_ENTITY_COORDS(PLAYER_PED_ID()))), 0.1) ENDIF ENDIF IF IS_KEYBOARD_KEY_PRESSED(KEY_LEFT) fAnimPhase -= 0.01 IF (fAnimPhase < 0) fAnimPhase = 0 ENDIF ENDIF IF IS_KEYBOARD_KEY_PRESSED(KEY_RIGHT) fAnimPhase += 0.01 IF (fAnimPhase > 1) fAnimPhase = 1 ENDIF ENDIF IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_C) SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("CASE ")SAVE_STRING_TO_DEBUG_FILE(pSceneDebugName)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE(" sRespawnCutscene.pAnimDictName = \"")SAVE_STRING_TO_DEBUG_FILE(sRespawnCutscene.pAnimDictName)SAVE_STRING_TO_DEBUG_FILE("\"")SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE(" sRespawnCutscene.pAnimClipName = \"")SAVE_STRING_TO_DEBUG_FILE(sRespawnCutscene.pAnimClipName)SAVE_STRING_TO_DEBUG_FILE("\"")SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE(" sRespawnCutscene.pAnimCamName = \"")SAVE_STRING_TO_DEBUG_FILE(sRespawnCutscene.pAnimCamName)SAVE_STRING_TO_DEBUG_FILE("\"")SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE(" ")SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE(" sRespawnCutscene.vAnimPos = ")SAVE_VECTOR_TO_DEBUG_FILE(sRespawnCutscene.vAnimPos)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE(" sRespawnCutscene.vAnimRot = ")SAVE_VECTOR_TO_DEBUG_FILE(sRespawnCutscene.vAnimRot)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE(" ")SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE(" sRespawnCutscene.ePedMotionState = MS_") SWITCH sRespawnCutscene.ePedMotionState CASE MS_ON_FOOT_IDLE SAVE_STRING_TO_DEBUG_FILE("ON_FOOT_IDLE") BREAK CASE MS_ON_FOOT_WALK SAVE_STRING_TO_DEBUG_FILE("ON_FOOT_WALK") BREAK DEFAULT SAVE_INT_TO_DEBUG_FILE(ENUM_TO_INT(sRespawnCutscene.ePedMotionState)) BREAK ENDSWITCH SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE(" ")SAVE_NEWLINE_TO_DEBUG_FILE() IF NOT ARE_VECTORS_EQUAL(sRespawnCutscene.vTrafficBounds, <<0,0,0>>) SAVE_STRING_TO_DEBUG_FILE(" sRespawnCutscene.vTrafficOffset = ")SAVE_VECTOR_TO_DEBUG_FILE(sRespawnCutscene.vTrafficOffset)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE(" sRespawnCutscene.vTrafficBounds = ")SAVE_VECTOR_TO_DEBUG_FILE(sRespawnCutscene.vTrafficBounds)SAVE_NEWLINE_TO_DEBUG_FILE() ENDIF SAVE_STRING_TO_DEBUG_FILE("BREAK")SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_NEWLINE_TO_DEBUG_FILE() bUpdateRespawnScene = FALSE ENDIF ELSE IF IS_SYNCHRONIZED_SCENE_LOOPED(iSceneId) SET_SYNCHRONIZED_SCENE_LOOPED(iSceneId, FALSE) ENDIF ENDIF #ENDIF #IF IS_DEBUG_BUILD str = ("\"") str += (sRespawnCutscene.pAnimDictName) str += (", ") str += (sRespawnCutscene.pAnimClipName) str += ("\"") DrawDebugSceneTextWithOffset(str, GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), 0, HUD_COLOUR_RED) str = ("synch scene[") str += (iSceneId) str += ("] phase: ") str += (GET_STRING_FROM_FLOAT(fAnimPhase)) DrawDebugSceneTextWithOffset(str, GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), 1, HUD_COLOUR_ORANGE) REPEAT COUNT_OF(bUpdateDamageDecal) iDamage PLAYER_DAMAGE_ENUM eDamageBit = INT_TO_ENUM(PLAYER_DAMAGE_ENUM, iPOWER(2, iDamage)) str = (" PD_") str += (iDamage) IF IS_BITMASK_ENUM_AS_ENUM_SET(sRespawnCutscene.ePlayerDamage, eDamageBit) str += (" set") DrawDebugSceneTextWithOffset(str, GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), TO_FLOAT(2+iDamage), HUD_COLOUR_REDLIGHT) ELSE str += (" NOT set") DrawDebugSceneTextWithOffset(str, GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), TO_FLOAT(2+iDamage), HUD_COLOUR_GREENLIGHT) ENDIF ENDREPEAT #ENDIF IF NOT IS_STRING_NULL_OR_EMPTY(sRespawnCutscene.DialogueTextLabel) IF NOT bPlayedsRespawnCutsceneDialogueTextLabel CPRINTLN(DEBUG_RESPAWN, "wait for ", sRespawnCutscene.fDialoguePhase, " to play \"", sRespawnCutscene.DialogueTextLabel, "\"") IF (fAnimPhase >= sRespawnCutscene.fDialoguePhase) IF CREATE_CONVERSATION(MyLocalPedStruct, "PRSAUD", sRespawnCutscene.DialogueTextLabel, CONV_PRIORITY_AMBIENT_MEDIUM) bPlayedsRespawnCutsceneDialogueTextLabel = TRUE ENDIF ENDIF ELSE CPRINTLN(DEBUG_RESPAWN, "played \"", sRespawnCutscene.DialogueTextLabel, "\"") ENDIF ENDIF BOOL bAnimEventHit bAnimEventHit = FALSE IF HAS_ANIM_EVENT_FIRED(PLAYER_PED_ID(), GET_HASH_KEY(sWalkInterruptible)) #IF IS_DEBUG_BUILD str = ("\"") str += (sWalkInterruptible) str += ("\" ") str += GET_STRING_FROM_FLOAT(ReturnStartPhase) str += (" to ") str += GET_STRING_FROM_FLOAT(ReturnEndPhase) DrawDebugSceneTextWithOffset(str, GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), TO_FLOAT(2+COUNT_OF(bUpdateDamageDecal)), HUD_COLOUR_ORANGE) #ENDIF // IF (fAnimPhase >= ReturnStartPhase) // AND (fAnimPhase <= ReturnEndPhase) CONST_INT iLEFT_STICK_THRESHOLD 64 INT ReturnLeftX = GET_CONTROL_VALUE(FRONTEND_CONTROL,INPUT_FRONTEND_AXIS_X) -128 INT ReturnLeftY = GET_CONTROL_VALUE(FRONTEND_CONTROL,INPUT_FRONTEND_AXIS_Y) -128 IF ReturnLeftX < iLEFT_STICK_THRESHOLD AND ReturnLeftX > -iLEFT_STICK_THRESHOLD AND ReturnLeftY < iLEFT_STICK_THRESHOLD AND ReturnLeftY > -iLEFT_STICK_THRESHOLD // ELSE bAnimEventHit = TRUE ENDIF // ENDIF ELSE ReturnStartPhase = -1 ReturnEndPhase = -1 bAnimEventHit = FALSE sRespawnCutscene.fRollingBlendoutPhase = sRespawnCutscene.fRollingBlendoutPhase ReturnStartPhase = ReturnStartPhase ReturnEndPhase = ReturnEndPhase ENDIF IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON AND sRespawnCutscene.fFirstPersonPunchPhase > 0 #IF IS_DEBUG_BUILD str = ("1st person phase: ") str += GET_STRING_FROM_FLOAT(fAnimPhase) str += (" >= ") str += GET_STRING_FROM_FLOAT(sRespawnCutscene.fFirstPersonPunchPhase) HUD_COLOURS ePushin_hud_colour = HUD_COLOUR_PINK #ENDIF IF (fAnimPhase >= sRespawnCutscene.fFirstPersonPunchPhase) IF NOT sRespawnCutscene.bStartedPushin FLOAT fPushinDist = PUSH_IN_DISTANCE VECTOR vCamCoord = GET_FINAL_RENDERED_CAM_COORD() VECTOR vPlayerCoord = GET_PED_BONE_COORDS(PLAYER_PED_ID(), BONETAG_HEAD, <<0,0,0>>) FLOAT fCoordDist3d = GET_DISTANCE_BETWEEN_COORDS(vCamCoord, vPlayerCoord) CONST_FLOAT fPUSHIN_DIST_BUFFER 0.75 fPushinDist = CLAMP(fPushinDist, 0.001, fCoordDist3d-fPUSHIN_DIST_BUFFER) IF fPushinDist < 0 CWARNINGLN(DEBUG_RESPAWN, "fPushinDist is less than zero!! ", fPushinDist) fPushinDist = 0.001 ENDIF #IF IS_DEBUG_BUILD IF fPushinDist = PUSH_IN_DISTANCE CPRINTLN(DEBUG_RESPAWN, "PUSH_IN fCoordDist3d: ", fCoordDist3d, ", fPushinDist: PUSH_IN_DISTANCE //", pSceneDebugName) ELSE CPRINTLN(DEBUG_RESPAWN, "PUSH_IN fCoordDist3d: ", fCoordDist3d, ", fPushinDist: ", fPushinDist, " //", pSceneDebugName) ENDIF #ENDIF FILL_PUSH_IN_DATA(sRespawnCutscene.sPushInData, PLAYER_PED_ID(), GET_CURRENT_PLAYER_PED_ENUM(), 0.000001, //FLOAT fDistance = PUSH_IN_DISTANCE 300, //INT iInterpTime = PUSH_IN_INTERP_TIME 300, //INT iCutTime = PUSH_IN_CUT_TIME 000, //INT iPostFXTime = PUSH_IN_POSTFX_TIME 000, //INT iSpeedUpTime = 0 DEFAULT) //FLOAT fSpeedUpProportion = PUSH_IN_SPEED_UP_PROPORTION) SET_PUSH_IN_DIRECTION_MODIFIER(sRespawnCutscene.sPushInData, sRespawnCutscene.vPushInDataDirectionMod) // rob - short-circuit the creation of push-in cams to keep the original cam moving round till the cut IF NOT sRespawnCutscene.bShortCircuitedPushin sRespawnCutscene.sPushInData.state = PUSH_IN_RUNNING sRespawnCutscene.sPushInData.iCreateTime = GET_GAME_TIMER() sRespawnCutscene.sPushInData.bDonePostFX = FALSE sRespawnCutscene.bShortCircuitedPushin = TRUE ENDIF CPRINTLN(DEBUG_RESPAWN, "PUSH_IN vDirectionMod: ", sRespawnCutscene.sPushInData.vDirectionMod) // // // // // // // // // // FLOAT pitch, heading IF (sRespawnCutscene.gp3rdCamHead = 999.0) sRespawnCutscene.gp3rdCamPitch = 0.0 ENDIF IF (sRespawnCutscene.gp3rdCamHead = 999.0) VECTOR vecCamEndRot FLOAT fCreateHead vecCamEndRot = GET_FINAL_RENDERED_CAM_ROT() fCreateHead = GET_ENTITY_HEADING(PLAYER_PED_ID()) FLOAT finalSplineCameraHeading, playerHeading finalSplineCameraHeading = vecCamEndRot.z playerHeading = fCreateHead sRespawnCutscene.gp3rdCamHead = finalSplineCameraHeading - playerHeading IF (sRespawnCutscene.gp3rdCamHead < 360) sRespawnCutscene.gp3rdCamHead += 360 ENDIF IF (sRespawnCutscene.gp3rdCamHead > 360) sRespawnCutscene.gp3rdCamHead -= 360 ENDIF ENDIF pitch = sRespawnCutscene.gp3rdCamPitch heading = sRespawnCutscene.gp3rdCamHead SET_GAMEPLAY_CAM_RELATIVE_PITCH(pitch) SET_GAMEPLAY_CAM_RELATIVE_HEADING(heading) SET_FIRST_PERSON_SHOOTER_CAMERA_PITCH(pitch) SET_FIRST_PERSON_SHOOTER_CAMERA_HEADING(heading) VECTOR camIndexCoord, gamcamIndexCoord FLOAT fCamInterpDist INT iCamInterpTime camIndexCoord = GET_FINAL_RENDERED_CAM_COORD() gamcamIndexCoord = GET_GAMEPLAY_CAM_COORD() fCamInterpDist = GET_DISTANCE_BETWEEN_COORDS(camIndexCoord, gamcamIndexCoord) iCamInterpTime = ROUND(fCamInterpDist*1000) CPRINTLN(DEBUG_RESPAWN, "SET_GAMEPLAY_CAM first person(pitch: ", pitch, ", heading:", heading, ", duration:", iCamInterpTime, ")") // // // // // // // // // // sRespawnCutscene.bStartedPushin = TRUE ENDIF IF sRespawnCutscene.bStartedPushin DISABLE_FIRST_PERSON_FLASH_EFFECT_THIS_UPDATE() IF HANDLE_PUSH_IN(sRespawnCutscene.sPushInData, TRUE, // BOOL bCamsAttached = FALSE TRUE, // BOOL bDestroyCamsAtEnd = TRUE DEFAULT, // BOOL bDoPostFX = TRUE DEFAULT, // BOOL bOnlyAttachStartIfCamsAttached = FALSE FALSE) // BOOL bDoColouredFlash = TRUE) #IF IS_DEBUG_BUILD ePushin_hud_colour = HUD_COLOUR_REDLIGHT str += (" [pushed in!]") CPRINTLN(DEBUG_RESPAWN, str) #ENDIF ELSE #IF IS_DEBUG_BUILD ePushin_hud_colour = HUD_COLOUR_REDDARK str += (" [pushing in...]") CPRINTLN(DEBUG_RESPAWN, str) #ENDIF ENDIF ENDIF ENDIF #IF IS_DEBUG_BUILD DrawDebugSceneTextWithOffset(str, GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), TO_FLOAT(3+COUNT_OF(bUpdateDamageDecal)), ePushin_hud_colour) #ENDIF ENDIF IF HAS_ANIM_EVENT_FIRED(PLAYER_PED_ID(), GET_HASH_KEY(sForceBlendout)) OR bAnimEventHit #IF IS_DEBUG_BUILD IF NOT bUpdateRespawnScene #ENDIF // IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON // AND sRespawnCutscene.fFirstPersonPunchPhase > 0 // IF NOT sRespawnCutscene.bStartedPushin // CASSERTLN(DEBUG_RESPAWN, "respawn pushin phase[", sRespawnCutscene.fFirstPersonPunchPhase, "] is greater than force blend out phase [", fAnimPhase, "] so it'd never hit - consider changing!") // ENDIF // ENDIF IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) CLEAR_PED_TASKS(PLAYER_PED_ID()) SWITCH sRespawnCutscene.ePedMotionState CASE MS_ON_FOOT_IDLE CPRINTLN(DEBUG_RESPAWN, "FORCE_PED_MOTION_STATE(MS_ON_FOOT_IDLE) 2: ", fAnimPhase) FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_IDLE, TRUE) // SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVEBLENDRATIO_WALK, 0500) STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP() BREAK CASE MS_ON_FOOT_WALK CPRINTLN(DEBUG_RESPAWN, "FORCE_PED_MOTION_STATE(MS_ON_FOOT_WALK) 2: ", fAnimPhase) FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, TRUE) SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVEBLENDRATIO_WALK, 0500) // // // // // // // // // // IF GET_FOLLOW_PED_CAM_VIEW_MODE() != CAM_VIEW_MODE_FIRST_PERSON FLOAT pitch, heading IF (sRespawnCutscene.gpCamHead = 999.0) sRespawnCutscene.gpCamPitch= 0.0 ENDIF IF (sRespawnCutscene.gpCamHead = 999.0) VECTOR vecCamEndRot FLOAT fCreateHead vecCamEndRot = GET_FINAL_RENDERED_CAM_ROT() fCreateHead = GET_ENTITY_HEADING(PLAYER_PED_ID()) FLOAT finalSplineCameraHeading, playerHeading finalSplineCameraHeading = vecCamEndRot.z playerHeading = fCreateHead sRespawnCutscene.gpCamHead = finalSplineCameraHeading - playerHeading IF (sRespawnCutscene.gpCamHead < 360) sRespawnCutscene.gpCamHead += 360 ENDIF IF (sRespawnCutscene.gpCamHead > 360) sRespawnCutscene.gpCamHead -= 360 ENDIF ENDIF pitch = sRespawnCutscene.gpCamPitch heading = sRespawnCutscene.gpCamHead SET_GAMEPLAY_CAM_RELATIVE_PITCH(pitch) SET_GAMEPLAY_CAM_RELATIVE_HEADING(heading) VECTOR camIndexCoord, gamcamIndexCoord FLOAT fCamInterpDist INT iCamInterpTime camIndexCoord = GET_FINAL_RENDERED_CAM_COORD() gamcamIndexCoord = GET_GAMEPLAY_CAM_COORD() fCamInterpDist = GET_DISTANCE_BETWEEN_COORDS(camIndexCoord, gamcamIndexCoord) iCamInterpTime = ROUND(fCamInterpDist*1000) CPRINTLN(DEBUG_RESPAWN, "SET_GAMEPLAY_CAM(pitch: ", pitch, ", heading:", heading, ", duration:", iCamInterpTime, ")") // // // // // // // // // // RENDER_SCRIPT_CAMS(FALSE, TRUE, iCamInterpTime, FALSE) ELSE // // // // // // // // // // // // IF (sRespawnCutscene.gp3rdCamHead = 999.0) // sRespawnCutscene.gp3rdCamPitch = 0.0 // ENDIF // // IF (sRespawnCutscene.gp3rdCamHead = 999.0) // VECTOR vecCamEndRot // FLOAT fCreateHead // vecCamEndRot = GET_FINAL_RENDERED_CAM_ROT() // fCreateHead = GET_ENTITY_HEADING(PLAYER_PED_ID()) // // FLOAT finalSplineCameraHeading, playerHeading // finalSplineCameraHeading = vecCamEndRot.z // playerHeading = fCreateHead // sRespawnCutscene.gp3rdCamHead = finalSplineCameraHeading - playerHeading // // IF (sRespawnCutscene.gp3rdCamHead < 360) sRespawnCutscene.gp3rdCamHead += 360 ENDIF // IF (sRespawnCutscene.gp3rdCamHead > 360) sRespawnCutscene.gp3rdCamHead -= 360 ENDIF // ENDIF // pitch = sRespawnCutscene.gp3rdCamPitch // heading = sRespawnCutscene.gp3rdCamHead // // SET_GAMEPLAY_CAM_RELATIVE_PITCH(pitch) // SET_GAMEPLAY_CAM_RELATIVE_HEADING(heading) // // VECTOR camIndexCoord, gamcamIndexCoord // FLOAT fCamInterpDist // INT iCamInterpTime // camIndexCoord = GET_FINAL_RENDERED_CAM_COORD() // gamcamIndexCoord = GET_GAMEPLAY_CAM_COORD() // fCamInterpDist = GET_DISTANCE_BETWEEN_COORDS(camIndexCoord, gamcamIndexCoord) // iCamInterpTime = ROUND(fCamInterpDist*1000) // // CPRINTLN(DEBUG_RESPAWN, "SET_GAMEPLAY_CAM first person(pitch: ", pitch, ", heading:", heading, ", duration:", iCamInterpTime, ")") // // // // // // // // // // // // RENDER_SCRIPT_CAMS(FALSE, TRUE, iCamInterpTime, FALSE) ENDIF BREAK DEFAULT CPRINTLN(DEBUG_RESPAWN, "FORCE_PED_MOTION_STATE(MS_unknown_", ENUM_TO_INT(sRespawnCutscene.ePedMotionState), ") 2: ", fAnimPhase) SCRIPT_ASSERT("invalid sRespawnCutscene.ePedMotionState") BREAK ENDSWITCH IF IS_SYNCHRONIZED_SCENE_RUNNING(iSceneId) DETACH_SYNCHRONIZED_SCENE(iSceneId) iSceneId = -1 ENDIF ENDIF #IF IS_DEBUG_BUILD ENDIF #ENDIF ENDIF WAIT(0) ENDWHILE #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_RESPAWN, "SYNCHRONIZED_SCENE_NOT_RUNNING(", iSceneId, ")") #ENDIF ENDIF IF NOT ARE_VECTORS_EQUAL(sRespawnCutscene.vTrafficBounds, <<0,0,0>>) SET_ROADS_BACK_TO_ORIGINAL((sRespawnCutscene.vAnimPos+sRespawnCutscene.vTrafficOffset)-sRespawnCutscene.vTrafficBounds, (sRespawnCutscene.vAnimPos+sRespawnCutscene.vTrafficOffset)+sRespawnCutscene.vTrafficBounds) ENDIF // REMOVE_SCENARIO_BLOCKING_AREA(respawnScenarioBlockID) // CLEAR_PED_NON_CREATION_AREA() SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) CLEAR_PED_TASKS(PLAYER_PED_ID()) ENDIF BOOL bIS_INTERPOLATING_FROM_SCRIPT_CAMS = IS_INTERPOLATING_FROM_SCRIPT_CAMS() BOOL bHANDLE_PUSH_IN = FALSE IF sRespawnCutscene.bStartedPushin DISABLE_FIRST_PERSON_FLASH_EFFECT_THIS_UPDATE() IF NOT HANDLE_PUSH_IN(sRespawnCutscene.sPushInData, TRUE, // BOOL bCamsAttached = FALSE TRUE, // BOOL bDestroyCamsAtEnd = TRUE DEFAULT, // BOOL bDoPostFX = TRUE DEFAULT, // BOOL bOnlyAttachStartIfCamsAttached = FALSE DEFAULT) // BOOL bDoColouredFlash = TRUE) bHANDLE_PUSH_IN = TRUE ENDIF ENDIF IF bIS_INTERPOLATING_FROM_SCRIPT_CAMS OR bHANDLE_PUSH_IN #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_RESPAWN, "IS_INTERPOLATING_FROM_SCRIPT_CAMS(", ")") #ENDIF WHILE (bIS_INTERPOLATING_FROM_SCRIPT_CAMS OR bHANDLE_PUSH_IN) AND NOT IS_PLAYER_SWITCH_IN_PROGRESS() // Fix for 2399685. // Guard against getting stuck in this while when starting a switch scene during the interp. IF bIS_INTERPOLATING_FROM_SCRIPT_CAMS #IF IS_DEBUG_BUILD str = ("IS_INTERPOLATING_FROM_SCRIPT_CAMS...") DrawDebugSceneTextWithOffset(str, GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), 0.0, HUD_COLOUR_PURE_WHITE) CPRINTLN(DEBUG_RESPAWN, str) #ENDIF ENDIF IF bHANDLE_PUSH_IN #IF IS_DEBUG_BUILD str = ("bHANDLE_PUSH_IN...") DrawDebugSceneTextWithOffset(str, GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), 1.0, HUD_COLOUR_PURE_WHITE) CPRINTLN(DEBUG_RESPAWN, str) #ENDIF ENDIF INT iOffset_y = 2 DisableControlAction(CAMERA_CONTROL, INPUT_LOOK_BEHIND, iOffset_y) DisableControlAction(CAMERA_CONTROL, INPUT_VEH_LOOK_BEHIND, iOffset_y) DisableControlAction(CAMERA_CONTROL, INPUT_LOOK_LR, iOffset_y) DisableControlAction(CAMERA_CONTROL, INPUT_LOOK_UD, iOffset_y) // DisableControlAction(PLAYER_CONTROL, INPUT_SPRINT, iOffset_y) DisableControlAction(PLAYER_CONTROL, INPUT_JUMP, iOffset_y) DisableControlAction(PLAYER_CONTROL, INPUT_DUCK, iOffset_y) DisableControlAction(PLAYER_CONTROL, INPUT_MELEE_ATTACK_ALTERNATE, iOffset_y) DisableControlAction(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY, iOffset_y) DisableControlAction(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT, iOffset_y) DisableControlAction(PLAYER_CONTROL, INPUT_MELEE_ATTACK1, iOffset_y) DisableControlAction(PLAYER_CONTROL, INPUT_MELEE_ATTACK2, iOffset_y) WAIT(0) bIS_INTERPOLATING_FROM_SCRIPT_CAMS = IS_INTERPOLATING_FROM_SCRIPT_CAMS() bHANDLE_PUSH_IN = FALSE IF sRespawnCutscene.bStartedPushin DISABLE_FIRST_PERSON_FLASH_EFFECT_THIS_UPDATE() IF NOT HANDLE_PUSH_IN(sRespawnCutscene.sPushInData, TRUE, // BOOL bCamsAttached = FALSE TRUE, // BOOL bDestroyCamsAtEnd = TRUE DEFAULT, // BOOL bDoPostFX = TRUE DEFAULT, // BOOL bOnlyAttachStartIfCamsAttached = FALSE DEFAULT) // BOOL bDoColouredFlash = TRUE) bHANDLE_PUSH_IN = TRUE ENDIF ENDIF ENDWHILE ELSE #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_RESPAWN, "WASNT_INTERPOLATING_FROM_SCRIPT_CAMS(", ")") #ENDIF ENDIF #IF IS_DEBUG_BUILD IF IS_PLAYER_SWITCH_IN_PROGRESS() // Fix for 2399685. PRINTLN("[RESPAWN] Bailed early from a respawn interp-out cam due to a switch scene starting. (2399685)") ENDIF IF DOES_WIDGET_GROUP_EXIST(first_time_deatharrest_widget_group_id) DELETE_WIDGET_GROUP(first_time_deatharrest_widget_group_id) ENDIF #ENDIF IF NOT IS_STRING_NULL_OR_EMPTY(sRespawnCutscene.pFacialDictName) REMOVE_ANIM_DICT(sRespawnCutscene.pFacialDictName) ENDIF REMOVE_ANIM_DICT(sRespawnCutscene.pAnimDictName) DESTROY_CAM(respawnCamIndex) RESET_PUSH_IN(sRespawnCutscene.sPushInData) IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_ForcePedToUseScripCamHeading, bPedForcedToUseScripCamHeadingFlag) SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), FALSE) ENDIF pSceneDebugName = pSceneDebugName ENDPROC