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

500 lines
17 KiB
Scheme
Executable File

//////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// SCRIPT NAME : chop_cam_public.sch //
// AUTHOR : Rob Bray //
// DESCRIPTION : Common functions for chop cam //
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////
USING "rage_builtins.sch"
USING "commands_misc.sch"
USING "commands_pad.sch"
USING "commands_script.sch"
USING "commands_player.sch"
USING "commands_vehicle.sch"
USING "commands_object.sch"
USING "commands_graphics.sch"
USING "commands_physics.sch"
USING "commands_streaming.sch"
USING "commands_camera.sch"
USING "commands_audio.sch"
USING "script_player.sch"
USING "selector_public.sch"
USING "mission_stat_public.sch"
USING "player_ped_public.sch"
CONST_INT CHOP_VIEW_CAM_INTERP_TIME 0
CONST_FLOAT CHOP_SWITCH_DISTANCE 70.0
ENUM CHOP_VIEW_CAM_STATE_ENUM
CHOP_VIEW_CAM_DISABLED = 0,
CHOP_VIEW_CAM_TO_CHOP,
CHOP_VIEW_CAM_ON_CHOP,
CHOP_VIEW_CAM_TO_PLAYER
ENDENUM
ENUM CHOP_MISSION_ENUM
CHOP_MISSION_UNSPECIFIED = 0,
CHOP_MISSION_FRANKLIN0,
CHOP_MISSION_FRANKLIN1,
CHOP_MISSION_EXILE2
ENDENUM
ENUM CHOP_CAM_AUDIO_STATE_ENUM
CHOP_CAM_AUDIO_STATE_NOT_STARTED = 0,
CHOP_CAM_AUDIO_STATE_STREAMING,
CHOP_CAM_AUDIO_STATE_PLAYING
ENDENUM
STRUCT CHOP_VIEW_CAM_DATA
// state
CHOP_VIEW_CAM_STATE_ENUM state
SELECTOR_SLOTS_ENUM selectorSlot = SELECTOR_PED_MICHAEL
CHOP_MISSION_ENUM chopMission
// chop ped
PED_INDEX chopPed
// camera stuff
CAMERA_INDEX chopCam
INT iFinishAutoInterpTime
FLOAT fCamYAttach
FLOAT fCamZAttach
BOOL bNeverTrevor
BOOL bClearPendingTask
// audio stuff
CHOP_CAM_AUDIO_STATE_ENUM audioState
INT iAudioVariation
INT iCamSoundID = -1
VECTOR vLastPTFXPos
// OBSOLETE! REMOVE!
PTFX_ID scentPTFX
ENDSTRUCT
// request chop cam sfx
FUNC BOOL REQUEST_CHOP_CAM_SFX()
RETURN TRUE
/*
IF REQUEST_SCRIPT_AUDIO_BANK("CHOP_CAM_A_01")
AND REQUEST_SCRIPT_AUDIO_BANK("CHOP_CAM_A_02")
AND REQUEST_SCRIPT_AUDIO_BANK("CHOP_CAM_B_01")
AND REQUEST_SCRIPT_AUDIO_BANK("CHOP_CAM_B_02")
RETURN TRUE
ENDIF
RETURN FALSE
*/
ENDFUNC
// release chop cam sfx
PROC RELEASE_CHOP_CAM_SFX(CHOP_VIEW_CAM_DATA &chopViewCamData, BOOL bDumpSoundID = TRUE)
RELEASE_NAMED_SCRIPT_AUDIO_BANK("CHOP_CAM_A_01")
RELEASE_NAMED_SCRIPT_AUDIO_BANK("CHOP_CAM_A_02")
RELEASE_NAMED_SCRIPT_AUDIO_BANK("CHOP_CAM_B_01")
RELEASE_NAMED_SCRIPT_AUDIO_BANK("CHOP_CAM_B_02")
RELEASE_NAMED_SCRIPT_AUDIO_BANK("CHOP_CAM_C_01")
RELEASE_NAMED_SCRIPT_AUDIO_BANK("CHOP_CAM_C_02")
chopViewCamData.audioState = CHOP_CAM_AUDIO_STATE_NOT_STARTED
IF bDumpSoundID
IF chopViewCamData.iCamSoundID <> -1
RELEASE_SOUND_ID(chopViewCamData.iCamSoundID)
chopViewCamData.iCamSoundID = -1
ENDIF
ENDIF
ENDPROC
// fake selector icon to player
PROC FAKE_SELECTOR_IS_PLAYER(CHOP_VIEW_CAM_DATA &chopViewCamData, SELECTOR_PED_STRUCT &sSelectorPeds, BOOL bFake)
INT i
IF bFake
REPEAT 3 i
SELECTOR_SLOTS_ENUM thisSelector = INT_TO_ENUM(SELECTOR_SLOTS_ENUM, i)
IF thisSelector <> chopViewCamData.selectorSlot
IF IS_SELECTOR_PED_AVAILABLE_IN_FLOW(thisSelector)
SET_SELECTOR_PED_FAKE_STATE(sSelectorPeds, thisSelector, SELECTOR_STATE_AVAILABLE)
ENDIF
ELSE
SET_SELECTOR_PED_FAKE_STATE(sSelectorPeds, thisSelector, SELECTOR_STATE_CURRENT)
ENDIF
ENDREPEAT
ELSE
REPEAT 3 i
SELECTOR_SLOTS_ENUM thisSelector = INT_TO_ENUM(SELECTOR_SLOTS_ENUM, i)
SET_SELECTOR_PED_FAKE_STATE(sSelectorPeds, thisSelector, SELECTOR_STATE_DEFAULT)
ENDREPEAT
ENDIF
IF chopViewCamData.bNeverTrevor
//IF IS_SELECTOR_PED_AVAILABLE_IN_FLOW(SELECTOR_PED_TREVOR)
// SET_SELECTOR_PED_FAKE_STATE(sSelectorPeds, SELECTOR_PED_TREVOR, SELECTOR_STATE_UNAVAILABLE)
//ELSE
SET_SELECTOR_PED_FAKE_STATE(sSelectorPeds, SELECTOR_PED_TREVOR, SELECTOR_STATE_DEFAULT)
//ENDIF
ENDIF
ENDPROC
// set chop hint
PROC SET_CHOP_SELECT_HINT(CHOP_VIEW_CAM_DATA &chopViewCamData, SELECTOR_PED_STRUCT &sSelectorPeds, BOOL bHintToChop)
/*
INT i
REPEAT 3 i
SELECTOR_SLOTS_ENUM thisSelector = INT_TO_ENUM(SELECTOR_SLOTS_ENUM, i)
IF thisSelector <> chopViewCamData.selectorSlot
SET_SELECTOR_PED_HINT(sSelectorPeds, thisSelector, NOT bHintToChop)
ELSE
SET_SELECTOR_PED_HINT(sSelectorPeds, thisSelector, bHintToChop)
ENDIF
ENDREPEAT
*/
SET_SELECTOR_PED_HINT(sSelectorPeds, chopViewCamData.selectorSlot, bHintToChop)
ENDPROC
// common disable chop cam functions
PROC COMMON_DISABLE_CHOP_VIEW_CAM(CHOP_VIEW_CAM_DATA &chopViewCamData, SELECTOR_PED_STRUCT &sSelectorPeds)
CLEAR_TIMECYCLE_MODIFIER()
IF ANIMPOSTFX_IS_RUNNING("ChopVision")
ANIMPOSTFX_STOP("ChopVision")
ENDIF
FAKE_SELECTOR_IS_PLAYER(chopViewCamData, sSelectorPeds, FALSE)
HIDE_CELLPHONE_SIGNIFIERS_FOR_CUTSCENE(FALSE)
IF chopViewCamData.iCamSoundID <> -1
IF NOT HAS_SOUND_FINISHED(chopViewCamData.iCamSoundID)
STOP_SOUND(chopViewCamData.iCamSoundID)
ENDIF
ENDIF
RELEASE_CHOP_CAM_SFX(chopViewCamData, FALSE)
SET_CONTROL_SHAKE_SUPPRESSED_ID(PLAYER_CONTROL, -1)
// allow to speak
IF NOT IS_PED_INJURED(chopViewCamData.chopPed)
STOP_PED_SPEAKING(chopViewCamData.chopPed, FALSE)
ENDIF
// set visible
IF DOES_ENTITY_EXIST(chopViewCamData.chopPed)
IF IS_ENTITY_DEAD(chopViewCamData.chopPed)
OR NOT IS_ENTITY_DEAD(chopViewCamData.chopPed)
SET_ENTITY_VISIBLE(chopViewCamData.chopPed, TRUE)
ENDIF
ENDIF
// MISSION SPECIFIC STUFF
SWITCH chopViewCamData.chopMission
CASE CHOP_MISSION_FRANKLIN0
// Franklin0 Chop
INFORM_MISSION_STATS_SYSTEM_OF_ACTION_CAM_END()
BREAK
ENDSWITCH
ENDPROC
// disable mission specific player tasks
PROC DISABLE_CHOP_VIEW_CAM_PLAYER_TASKS(CHOP_VIEW_CAM_DATA &chopViewCamData)
SWITCH chopViewCamData.chopMission
CASE CHOP_MISSION_FRANKLIN0
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_FOLLOW_TO_OFFSET_OF_ENTITY) <> FINISHED_TASK
OR GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_FOLLOW_WAYPOINT_ROUTE) <> FINISHED_TASK
OR GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY) <> FINISHED_TASK
OR GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_GO_TO_ENTITY) <> FINISHED_TASK
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_FOLLOW_TO_OFFSET_OF_ENTITY) = WAITING_TO_START_TASK
OR GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_FOLLOW_WAYPOINT_ROUTE) = WAITING_TO_START_TASK
OR GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY) = WAITING_TO_START_TASK
OR GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_GO_TO_ENTITY) = WAITING_TO_START_TASK
chopViewCamData.bClearPendingTask = TRUE
ENDIF
CLEAR_PED_TASKS(PLAYER_PED_ID())
ENDIF
BREAK
ENDSWITCH
ENDPROC
// set chop view cam on
PROC SET_CHOP_VIEW_CAM_ON_CHOP(CHOP_VIEW_CAM_DATA &chopViewCamData, SELECTOR_PED_STRUCT &sSelectorPeds, BOOL bHandleCams = TRUE, BOOL bDoInterp = FALSE, INT iInterpTime = DEFAULT_INTERP_TO_FROM_GAME)
FAKE_SELECTOR_IS_PLAYER(chopViewCamData, sSelectorPeds, TRUE)
SET_TIMECYCLE_MODIFIER("chop")
SET_CAM_ACTIVE(chopViewCamData.chopCam, TRUE)
IF bHandleCams
RENDER_SCRIPT_CAMS(TRUE, bDoInterp, iInterpTime)
IF bDoInterp
chopViewCamData.iFinishAutoInterpTime = GET_GAME_TIMER() + iInterpTime
ENDIF
ENDIF
sSelectorPeds.eNewSelectorPed = NUMBER_OF_SELECTOR_PEDS
IF chopViewCamData.chopMission = CHOP_MISSION_FRANKLIN0
INFORM_MISSION_STATS_SYSTEM_OF_ACTION_CAM_START()
ENDIF
ANIMPOSTFX_PLAY("ChopVision", 0, FALSE)
SET_CONTROL_SHAKE_SUPPRESSED_ID(PLAYER_CONTROL, 1)
// prevent chop speaking
IF NOT IS_PED_INJURED(chopViewCamData.chopPed)
SET_ENTITY_VISIBLE(chopViewCamData.chopPed, FALSE)
STOP_PED_SPEAKING(chopViewCamData.chopPed, TRUE)
ENDIF
chopViewCamData.state = CHOP_VIEW_CAM_ON_CHOP
ENDPROC
// set chop view cam interp to chop
PROC SET_CHOP_VIEW_CAM_TO_CHOP(CHOP_VIEW_CAM_DATA &chopViewCamData, BOOL bHandleControl = TRUE, BOOL bHandleHUD = TRUE, BOOL bHandleCams = TRUE, BOOL bDoInterp = FALSE, INT iInterpTime = DEFAULT_INTERP_TO_FROM_GAME, BOOL bUseCodeSwitch = FALSE, BOOL bOverrideType = FALSE, SWITCH_TYPE overrideType = SWITCH_TYPE_SHORT)
IF bHandleControl
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ENDIF
IF bHandleHUD
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
ENDIF
IF bHandleCams
RENDER_SCRIPT_CAMS(TRUE, bDoInterp, iInterpTime)
IF bDoInterp
chopViewCamData.iFinishAutoInterpTime = GET_GAME_TIMER() + iInterpTime
ENDIF
ENDIF
IF bUseCodeSwitch
SWITCH_FLAGS eSwitchFlags = INT_TO_ENUM(SWITCH_FLAGS, 0)
SWITCH_TYPE switchType
IF NOT bOverrideType
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(chopViewCamData.chopPed), GET_ENTITY_COORDS(PLAYER_PED_ID())) < CHOP_SWITCH_DISTANCE
switchType = SWITCH_TYPE_SHORT
ELSE
switchType = SWITCH_TYPE_AUTO
eSwitchFlags = SWITCH_FLAG_SKIP_OUTRO
ENDIF
ELSE
switchType = overrideType
ENDIF
START_PLAYER_SWITCH(PLAYER_PED_ID(), chopViewCamData.chopPed, eSwitchFlags, switchType)
ENDIF
HIDE_CELLPHONE_SIGNIFIERS_FOR_CUTSCENE(TRUE)
chopViewCamData.state = CHOP_VIEW_CAM_TO_CHOP
ENDPROC
// set chop view cam interp to player
PROC SET_CHOP_VIEW_CAM_TO_PLAYER(CHOP_VIEW_CAM_DATA &chopViewCamData, SELECTOR_PED_STRUCT &sSelectorPeds, BOOL bSetGameplayCamRelative = TRUE, BOOL bUseCodeSwitch = FALSE, BOOL bClearPTFX = FALSE, BOOL bOverrideType = FALSE, SWITCH_TYPE overrideType = SWITCH_TYPE_SHORT)
IF bSetGameplayCamRelative
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
ENDIF
IF bClearPTFX
REMOVE_PARTICLE_FX_IN_RANGE(chopViewCamData.vLastPTFXPos, 2)
ENDIF
IF bUseCodeSwitch
SWITCH_FLAGS eSwitchFlags = INT_TO_ENUM(SWITCH_FLAGS, 0)
SWITCH_TYPE switchType
IF NOT bOverrideType
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(chopViewCamData.chopPed), GET_ENTITY_COORDS(PLAYER_PED_ID())) < CHOP_SWITCH_DISTANCE
switchType = SWITCH_TYPE_SHORT
ELSE
switchType = SWITCH_TYPE_AUTO
eSwitchFlags = SWITCH_FLAG_SKIP_INTRO
ENDIF
ELSE
switchType = overrideType
ENDIF
START_PLAYER_SWITCH(chopViewCamData.chopPed, PLAYER_PED_ID(), eSwitchFlags, switchType)
IF switchType = SWITCH_TYPE_SHORT
COMMON_DISABLE_CHOP_VIEW_CAM(chopViewCamData, sSelectorPeds)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ENDIF
ELSE
COMMON_DISABLE_CHOP_VIEW_CAM(chopViewCamData, sSelectorPeds)
ENDIF
chopViewCamData.state = CHOP_VIEW_CAM_TO_PLAYER
ENDPROC
// set chop view cam interp to chop
PROC SET_CHOP_VIEW_CAM_DISABLED(CHOP_VIEW_CAM_DATA &chopViewCamData, SELECTOR_PED_STRUCT &sSelectorPeds, BOOL bResetNewSelectorPed = FALSE, BOOL bHandleControl = TRUE, BOOL bHandleHUD = TRUE, BOOL bHandleCams = TRUE, BOOL bInterpToGameCam = FALSE, INT iInterpTime = DEFAULT_INTERP_TO_FROM_GAME)
COMMON_DISABLE_CHOP_VIEW_CAM(chopViewCamData, sSelectorPeds)
DISABLE_CHOP_VIEW_CAM_PLAYER_TASKS(chopViewCamData)
IF bResetNewSelectorPed
sSelectorPeds.eNewSelectorPed = NUMBER_OF_SELECTOR_PEDS
ENDIF
IF bHandleControl
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
IF bHandleHUD
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
ENDIF
IF bHandleCams
RENDER_SCRIPT_CAMS(FALSE, bInterpToGameCam, iInterpTime)
IF bInterpToGameCam
chopViewCamData.iFinishAutoInterpTime = GET_GAME_TIMER() + iInterpTime
ENDIF
ENDIF
chopViewCamData.state = CHOP_VIEW_CAM_DISABLED
ENDPROC
CONST_FLOAT CHOP_CAM_Y -0.15
CONST_FLOAT CHOP_CAM_Z 0.05
// set chop view cam to first person
PROC SET_CHOP_VIEW_CAM_FIRST_PERSON(CHOP_VIEW_CAM_DATA &chopViewCamData)
IF NOT IS_PED_INJURED(chopViewCamData.chopPed)
chopViewCamData.fCamYAttach = CHOP_CAM_Y
chopViewCamData.fCamZAttach = CHOP_CAM_Z
ATTACH_CAM_TO_PED_BONE(chopViewCamData.chopCam, chopViewCamData.chopPed, BONETAG_HEAD, <<0,chopViewCamData.fCamYAttach,chopViewCamData.fCamZAttach>>)
SET_CAM_NEAR_CLIP(chopViewCamData.chopCam, 0.101)
POINT_CAM_AT_ENTITY(chopViewCamData.chopCam, chopViewCamData.chopPed,<<0.0, 10.0, chopViewCamData.fCamZAttach>>)
SET_CAM_FOV(chopViewCamData.chopCam, 96.76)
SET_CAM_DOF_PLANES(chopViewCamData.chopCam, 0.0, 0.0, 100000.0, 100000.0)
ENDIF
ENDPROC
// set chop cam handle water
PROC SET_CHOP_VIEW_CAM_HANDLE_WATER(CHOP_VIEW_CAM_DATA &chopViewCamData)
IF NOT IS_PED_INJURED(chopViewCamData.chopPed)
AND DOES_CAM_EXIST(chopViewCamData.chopCam)
IF IS_ENTITY_IN_WATER(chopViewCamData.chopPed)
chopViewCamData.fCamZAttach = chopViewCamData.fCamZAttach +@ 0.1
IF chopViewCamData.fCamZAttach >= 0.32
chopViewCamData.fCamZAttach = 0.32
ENDIF
ELSE
chopViewCamData.fCamZAttach = chopViewCamData.fCamZAttach -@ 0.1
IF chopViewCamData.fCamZAttach <= CHOP_CAM_Z
chopViewCamData.fCamZAttach = CHOP_CAM_Z
ENDIF
ENDIF
ATTACH_CAM_TO_PED_BONE(chopViewCamData.chopCam, chopViewCamData.chopPed, BONETAG_HEAD, <<0,chopViewCamData.fCamYAttach,chopViewCamData.fCamZAttach>>)
ENDIF
ENDPROC
// set chop cam pull back
PROC SET_CHOP_VIEW_CAM_CUSTOM_ATTACH(CHOP_VIEW_CAM_DATA &chopViewCamData, FLOAT fYAttach, FLOAT fZAttach)
IF NOT IS_PED_INJURED(chopViewCamData.chopPed)
AND DOES_CAM_EXIST(chopViewCamData.chopCam)
chopViewCamData.fCamYAttach = fYAttach
chopViewCamData.fCamZAttach = fZAttach
ATTACH_CAM_TO_PED_BONE(chopViewCamData.chopCam, chopViewCamData.chopPed, BONETAG_HEAD, <<0,chopViewCamData.fCamYAttach,chopViewCamData.fCamZAttach>>)
ENDIF
ENDPROC
// create chop cam
PROC CREATE_CHOP_CAM(CHOP_VIEW_CAM_DATA &chopViewCamData)
IF NOT DOES_CAM_EXIST(chopViewCamData.chopCam)
chopViewCamData.chopCam = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
IF chopViewCamData.iCamSoundID <> -1
IF NOT HAS_SOUND_FINISHED(chopViewCamData.iCamSoundID)
STOP_SOUND(chopViewCamData.iCamSoundID)
ENDIF
RELEASE_SOUND_ID(chopViewCamData.iCamSoundID)
chopViewCamData.iCamSoundID = -1
ENDIF
chopViewCamData.iCamSoundID = GET_SOUND_ID()
chopViewCamData.audioState = CHOP_CAM_AUDIO_STATE_NOT_STARTED
chopViewCamData.iAudioVariation = GET_RANDOM_INT_IN_RANGE(0,3)
SET_CHOP_VIEW_CAM_FIRST_PERSON(chopViewCamData)
ENDIF
ENDPROC
// handle chop cam audio
PROC HANDLE_CHOP_CAM_AUDIO(CHOP_VIEW_CAM_DATA &chopViewCamData)
SWITCH chopViewCamData.audioState
CASE CHOP_CAM_AUDIO_STATE_NOT_STARTED
IF chopViewCamData.state = CHOP_VIEW_CAM_ON_CHOP
chopViewCamData.audioState = CHOP_CAM_AUDIO_STATE_STREAMING
ENDIF
BREAK
CASE CHOP_CAM_AUDIO_STATE_STREAMING
BOOL bStreamed
bStreamed = FALSE
SWITCH chopViewCamData.iAudioVariation
CASE 0
IF REQUEST_SCRIPT_AUDIO_BANK("CHOP_CAM_A_01")
AND REQUEST_SCRIPT_AUDIO_BANK("CHOP_CAM_A_02")
bStreamed = TRUE
ENDIF
BREAK
CASE 1
IF REQUEST_SCRIPT_AUDIO_BANK("CHOP_CAM_B_01")
AND REQUEST_SCRIPT_AUDIO_BANK("CHOP_CAM_B_02")
bStreamed = TRUE
ENDIF
BREAK
CASE 2
IF REQUEST_SCRIPT_AUDIO_BANK("CHOP_CAM_C_01")
AND REQUEST_SCRIPT_AUDIO_BANK("CHOP_CAM_C_02")
bStreamed = TRUE
ENDIF
BREAK
ENDSWITCH
IF bStreamed
IF chopViewCamData.iCamSoundID <> -1
IF HAS_SOUND_FINISHED(chopViewCamData.iCamSoundID)
SWITCH chopViewCamData.iAudioVariation
CASE 0
PLAY_SOUND_FRONTEND(chopViewCamData.iCamSoundID, "CHOP_CAM_A")
PRINTSTRING("play chop sound A") PRINTNL()
BREAK
CASE 1
PLAY_SOUND_FRONTEND(chopViewCamData.iCamSoundID, "CHOP_CAM_B")
PRINTSTRING("play chop sound B") PRINTNL()
BREAK
CASE 2
PLAY_SOUND_FRONTEND(chopViewCamData.iCamSoundID, "CHOP_CAM_C")
PRINTSTRING("play chop sound C") PRINTNL()
BREAK
ENDSWITCH
ENDIF
ENDIF
chopViewCamData.iAudioVariation++
IF chopViewCamData.iAudioVariation > 2
chopViewCamData.iAudioVariation = 0
ENDIF
chopViewCamData.audioState = CHOP_CAM_AUDIO_STATE_PLAYING
ENDIF
BREAK
CASE CHOP_CAM_AUDIO_STATE_PLAYING
BREAK
ENDSWITCH
ENDPROC
// has player selected chop?
FUNC BOOL IS_CHOP_SELECTED(CHOP_VIEW_CAM_DATA &chopViewCamData, SELECTOR_PED_STRUCT &sSelectorPeds)
IF sSelectorPeds.eNewSelectorPed = chopViewCamData.selectorSlot
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
// set hidof when in chop cam - 1824903
PROC HANDLE_CHOP_CAM_HIDOF(CHOP_VIEW_CAM_DATA &chopViewCamData)
// printstring("here1") printnl()
IF chopViewCamData.state = CHOP_VIEW_CAM_ON_CHOP
// printstring("here2") printnl()
SET_USE_HI_DOF()
ENDIF
ENDPROC