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

1351 lines
42 KiB
Python
Executable File

// Includes
USING "ob_safehouse_common.sch"
USING "freemode_header.sch"
USING "context_control_public.sch"
USING "net_realty_mess_include.sch"
USING "net_mission_trigger_public.sch"
// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : ob_bong.sc
// DESCRIPTION : Franklin and Michael's bong safehouse activity
//
// *****************************************************************************************
// *****************************************************************************************
// Enums
ENUM ACTIVITY_STATE
AS_LOAD_ASSETS,
AS_RUN_ACTIVITY,
AS_END
ENDENUM
ACTIVITY_STATE eState = AS_LOAD_ASSETS
ENUM TRIGGER_STATE
TS_PLAYER_OUT_OF_RANGE,
TS_WAIT_FOR_PLAYER,
TS_GRAB_PLAYER,
TS_RUN_ANIM,
TS_TRIGGER_EXIT_ANIM,
TS_BREAKOUT_EARLY,
TS_RESET
ENDENUM
TRIGGER_STATE eTriggerState = TS_PLAYER_OUT_OF_RANGE
ENUM MP_TRIGGER_STATE
MP_TS_PLAYER_OUT_OF_RANGE,
MP_TS_WAIT_FOR_PLAYER,
MP_TS_TRIGGER_SMOKE_ANIM,
MP_TS_CHECK_SMOKE_ANIM,
MP_TS_RUN_SMOKE_ANIM,
MP_TS_TRIGGER_EXIT_ANIM,
MP_TS_CHECK_EXIT_ANIM,
MP_TS_BREAKOUT_EARLY,
MP_TS_RESET
ENDENUM
MP_TRIGGER_STATE eMPTriggerState = MP_TS_PLAYER_OUT_OF_RANGE
CONST_FLOAT STONED_PHASE 0.5
BOOL bBongSmoke = FALSE
BOOL bBreakoutEarly = FALSE
BOOL bLighterFlame = FALSE
BOOL bLighterSparks = FALSE
BOOL bSetupAnimDict = FALSE
BOOL bSetupPTFX = FALSE
//BOOL bTriggeredCam2 = FALSE
BOOL bTriggeredExitCam = FALSE
BOOL bTakenHit = FALSE
BOOL bAppliedAnim = FALSE
BOOL bConvoKilled = FALSE
BOOL bInLowApt = FALSE
//FLOAT fCam2PhaseTime = 0.1
//FLOAT fExitCamPhaseTime = 0.7
INT iCurProperty
INT mSynchedScene
INT iUsageStat
INT iContextIntention = NEW_CONTEXT_INTENTION
CAMERA_INDEX CamIndex
OBJECT_INDEX mLighter
PTFX_ID ptfxLighter
STRING sClipSet = "move_m@drunk@slightlydrunk"
STRING sAnimDict
STRING sPedSmokeAnim
STRING sBongSmokeAnim
STRING sPedExitAnim
STRING sBongExitAnim
STRING sLighterSmokeAnim
STRING sLighterExitAnim
VECTOR vTriggerPos
FLOAT fTriggerHead
VECTOR vScenePos
VECTOR vSceneHead
//VECTOR vCamPos
//VECTOR vCamHead
//
//VECTOR vCam2Pos
//VECTOR vCam2Head
//VECTOR vExitCamPos
//VECTOR vExitCamHead
WEAPON_TYPE storedWeapon
// -----------------------------------------------------------------------------------------------------------
// Script Cleanup
// -----------------------------------------------------------------------------------------------------------
PROC CLEANUP_BONG_ACTIVITY()
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: Cleaning up...")
// Unload audio
RELEASE_AMBIENT_AUDIO_BANK()
// Clear help message
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("SA_BONG2")
CLEAR_HELP(TRUE)
ENDIF
// Remove particle fx
IF bSetupPTFX
REMOVE_PTFX_ASSET()
ENDIF
// Remove animation dictionary
IF bSetupAnimDict
REMOVE_ANIM_DICT(sAnimDict)
ENDIF
// Player is no longer stoned
CLEANUP_STONED_EFFECT()
IF IS_SYNCHRONIZED_SCENE_RUNNING(mSynchedScene)
SET_SYNCHRONIZED_SCENE_PHASE(mSynchedScene, 1.0)
ENDIF
// B*1918442
IF bAppliedAnim = TRUE // if we have applied the drunk clipset
IF bTakenHit = FALSE // but we haven't made the player drunk, reset them
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
CLEAR_PED_ALTERNATE_MOVEMENT_ANIM(PLAYER_PED_ID(), AAT_IDLE)
RESET_PED_MOVEMENT_CLIPSET(PLAYER_PED_ID(), 0.0)
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: Cleaning up - reset movement clipset changes")
ENDIF
ENDIF
ENDIF
IF g_bInMultiplayer
RELEASE_CONTEXT_INTENTION(iContextIntention)
IF bSafehouseSetControlOff
NET_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
// End script
TERMINATE_THIS_MULTIPLAYER_THREAD_NO_ARGS()
ELSE
// Clean up the audio scenes
IF IS_AUDIO_SCENE_ACTIVE("FRANKLIN_SAFEHOUSE_ACTIVITIES_SCENE")
STOP_AUDIO_SCENE("FRANKLIN_SAFEHOUSE_ACTIVITIES_SCENE")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MICHAEL_SAFEHOUSE_ACTIVITIES_SCENE")
STOP_AUDIO_SCENE("MICHAEL_SAFEHOUSE_ACTIVITIES_SCENE")
ENDIF
// Remove monalogues
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
REMOVE_PED_FOR_DIALOGUE(mWeedConv, 0)
REMOVE_PED_FOR_DIALOGUE(mWeedConv, 1)
// B*1895222 - Reactivate the chop script only if the player started the activity
IF bIsFranklin
IF bSafehouseSetControlOff
REACTIVATE_NAMED_WORLD_BRAINS_WAITING_TILL_OUT_OF_RANGE("chop")
ENDIF
ENDIF
// Restore control and remove motion blur
SAFE_RESTORE_PLAYER_CONTROL()
// End script
TERMINATE_THIS_THREAD()
ENDIF
ENDPROC
// -----------------------------------------------------------------------------------------------------------
// Script Functions
// -----------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// Requests and loads the correct animation dictionary.
FUNC BOOL HAS_BONG_ANIM_DICT_LOADED()
IF bIsFranklin
sPedSmokeAnim = "bong_FRA"
sPedExitAnim = "exit_FRA"
sBongSmokeAnim = "bong_bong"
sLighterSmokeAnim = "bong_lighter"
//sCamAnim = "bong_cam"
ELSE
sPedSmokeAnim = "michael_short"
sPedExitAnim = "michael_exit"
sBongSmokeAnim = "bong_short"
sLighterSmokeAnim = "lighter_short"
//sCamAnim = "bong_cam"
ENDIF
// Load animations
REQUEST_ANIM_DICT(sAnimDict)
IF HAS_ANIM_DICT_LOADED(sAnimDict)
bSetupAnimDict = TRUE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Requests and loads particle effects for this activity
FUNC BOOL HAS_BONG_PTFX_ASSET_LOADED()
// Load PTFX
REQUEST_PTFX_ASSET()
IF HAS_PTFX_ASSET_LOADED()
bSetupPTFX = TRUE
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
FUNC BOOL HAS_BONG_AUDIO_LOADED()
IF bIsFranklin
REQUEST_AMBIENT_AUDIO_BANK("SAFEHOUSE_FRANKLIN_USE_BONG")
ELSE
REQUEST_AMBIENT_AUDIO_BANK("SAFEHOUSE_MICHAEL_USE_BONG")
ENDIF
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Have particle effects and animations loaded for this activity
FUNC BOOL HAVE_ASSETS_LOADED()
IF HAS_BONG_ANIM_DICT_LOADED()
IF HAS_BONG_PTFX_ASSET_LOADED()
IF HAS_BONG_AUDIO_LOADED()
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: Assets have loaded...")
RETURN TRUE
ELSE
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: Audio loading...")
ENDIF
ELSE
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: PTFX loading...")
ENDIF
ELSE
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: Anims loading...")
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_LOW_APT_SOFA_IN_USE()
IF bInLowApt
AND IS_BIT_SET(MPSpecGlobals.iBitSet, GLOBAL_SPEC_BS_USING_MP_TV_SEAT)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Returns anim phase for bong smoke FX
FUNC FLOAT GET_BREAKOUT_PHASE()
IF bIsFranklin
RETURN 0.350
ELSE
RETURN 0.550
ENDIF
ENDFUNC
/// PURPOSE:
/// Returns anim phase for bong smoke FX
FUNC FLOAT GET_PHASE_TIME_FOR_BONG_SMOKE()
IF bIsFranklin
RETURN 0.440
ELSE
RETURN 0.495
ENDIF
ENDFUNC
/// PURPOSE:
/// Returns anim phase for lighter flame FX
FUNC FLOAT GET_PHASE_TIME_FOR_LIGHTER_FLAME(BOOL bStartFX=TRUE)
IF bIsFranklin
IF bStartFX
RETURN 0.194
ELSE
RETURN 0.438
ENDIF
ELSE
IF bStartFX
RETURN 0.246
ELSE
RETURN 0.470
ENDIF
ENDIF
ENDFUNC
FUNC VECTOR GET_LIGHTER_FLAME_POS()
IF bIsFranklin
RETURN <<-0.005,0.0,0.05>>
ELSE
RETURN <<0.0,0.0,0.06>>
ENDIF
ENDFUNC
/// PURPOSE:
/// Returns anim phase for lighter sparks FX
FUNC FLOAT GET_PHASE_TIME_FOR_LIGHTER_SPARKS()
IF bIsFranklin
RETURN 0.185
ELSE
RETURN 0.244
ENDIF
ENDFUNC
// Detect breakout of animation
PROC CHECK_FOR_BREAKOUT()
IF NOT bBreakoutEarly
INT iLeftX, iLeftY, iRightX, iRightY
GET_CONTROL_VALUE_OF_ANALOGUE_STICKS(iLeftX, iLeftY, iRightX, iRightY)
IF iLeftX < -64 OR iLeftX > 64 // Left/Right
OR iLeftY < -64 OR iLeftY > 64 // Forwards/Backwards
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: BREAKOUT DETECTED")
bBreakoutEarly = TRUE
ENDIF
ENDIF
ENDPROC
FUNC FLOAT GET_EXIT_PHASE_TIME()
IF bIsFranklin
RETURN 0.783
ELSE
RETURN 0.899
ENDIF
ENDFUNC
FUNC FLOAT GET_HEADING()
IF bIsFranklin
RETURN -47.5447
ELSE
RETURN 7.9319
ENDIF
ENDFUNC
FUNC FLOAT GET_PITCH
IF bIsFranklin
RETURN -7.5031
ELSE
RETURN 0.7148
ENDIF
ENDFUNC
/// PURPOSE:
/// Updates SINGLE PLAYER bong smoking activity
PROC UPDATE_BONG_ACTIVITY()
vTriggerPos = GET_TRIGGER_VEC_FOR_THIS_OBJECT()
VECTOR vTriggerSize = << 1.2, 1.2, 1.2 >>
FLOAT fScenePhase = 0.0
FLOAT fReturnStartPhase, fReturnEndPhase
SWITCH eTriggerState
CASE TS_PLAYER_OUT_OF_RANGE
IF IS_TRIGGER_AREA_OK(vTriggerPos, vTriggerSize)
AND IS_PED_HEADING_TOWARDS_POSITION(PLAYER_PED_ID(), GET_ENTITY_COORDS(mTrigger), TRIGGER_ANGLE)
AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FAM_WEAPDIS")
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: Player close to trigger...")
PRINT_HELP_FOREVER(GET_HELP_TEXT_FOR_THIS_ACTIVITY())
eTriggerState = TS_WAIT_FOR_PLAYER
ENDIF
BREAK
CASE TS_WAIT_FOR_PLAYER
IF CAN_PLAYER_START_CUTSCENE()
IF IS_TRIGGER_AREA_OK(vTriggerPos, vTriggerSize)
AND IS_PED_HEADING_TOWARDS_POSITION(PLAYER_PED_ID(), GET_ENTITY_COORDS(mTrigger), TRIGGER_ANGLE)
IF NOT IS_PLAYER_FREE_AIMING(PLAYER_ID())
AND NOT IS_PLAYER_TARGETTING_ANYTHING(PLAYER_ID())
AND IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_CONTEXT)
//vStartPos = GET_ENTITY_COORDS(mTrigger)
//fStartHead = GET_ENTITY_HEADING(mTrigger)
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: Activity triggered...")
SHOW_DEBUG_FOR_THIS_OBJECT()
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(GET_HELP_TEXT_FOR_THIS_ACTIVITY())
CLEAR_HELP(TRUE)
ENDIF
IF bIsFranklin
Request_Drunk_Audio_Scene("FRANKLIN_SAFEHOUSE_ACTIVITIES_SCENE")
//START_AUDIO_SCENE("FRANKLIN_SAFEHOUSE_ACTIVITIES_SCENE")
ELSE
Request_Drunk_Audio_Scene("MICHAEL_SAFEHOUSE_ACTIVITIES_SCENE")
//START_AUDIO_SCENE("MICHAEL_SAFEHOUSE_ACTIVITIES_SCENE")
ENDIF
CLEAR_AREA_OF_PROJECTILES(vTriggerPos, 3.0)
IF GET_FOLLOW_PED_CAM_VIEW_MODE() != CAM_VIEW_MODE_FIRST_PERSON
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ELSE
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
ENDIF
bSafehouseSetControlOff = TRUE
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), storedWeapon)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
IF DOES_ENTITY_EXIST(mTrigger)
IF NOT IS_ENTITY_ATTACHED(mTrigger)
FREEZE_ENTITY_POSITION(mTrigger, FALSE)
ENDIF
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE, DEFAULT, FALSE)
eTriggerState = TS_GRAB_PLAYER
ENDIF
ELSE
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(GET_HELP_TEXT_FOR_THIS_ACTIVITY())
CLEAR_HELP(TRUE)
ENDIF
eTriggerState = TS_PLAYER_OUT_OF_RANGE
ENDIF
ENDIF
BREAK
CASE TS_GRAB_PLAYER
DISABLE_SELECTOR_THIS_FRAME()
HIDE_HUD_AND_RADAR_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
mSynchedScene = CREATE_SYNCHRONIZED_SCENE(GET_SYNCHED_SCENE_VECTOR(), GET_SYNCHED_SCENE_ROT())
// Apply the anim to the player and all props he uses.
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), mSynchedScene, sAnimDict, GET_ENTER_ANIM_FOR_THIS_ACTIVITY(), NORMAL_BLEND_IN, REALLY_SLOW_BLEND_OUT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(mTrigger, mSynchedScene, GET_ENTER_ANIM_FOR_THIS_ENTITY(), sAnimDict, NORMAL_BLEND_IN, REALLY_SLOW_BLEND_OUT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(GET_SECONDARY_ENTITY(), mSynchedScene, GET_ENTER_ANIM_FOR_SECOND_ENTITY(), sAnimDict, NORMAL_BLEND_IN, REALLY_SLOW_BLEND_OUT)
IF IS_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(mSynchedScene)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(mSynchedScene, FALSE)
ENDIF
// Setup camera
IF GET_FOLLOW_PED_CAM_VIEW_MODE() != CAM_VIEW_MODE_FIRST_PERSON
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: not using 1st person so creating CamIndex")
CamIndex = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", TRUE)
PLAY_SYNCHRONIZED_CAM_ANIM(CamIndex, mSynchedScene, GET_CAMERA_FOR_THIS_ACTIVITY(), sAnimDict)
SHAKE_CAM(CamIndex, "HAND_SHAKE", DEFAULT_CAM_SHAKE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
ELSE
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: using 1st person so not creating CamIndex")
DESTROY_ALL_CAMS() // Ensure there are no script cams
ENDIF
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: TS_RUN_ANIM")
eTriggerState = TS_RUN_ANIM
BREAK
CASE TS_RUN_ANIM
DISABLE_SELECTOR_THIS_FRAME()
HIDE_HUD_AND_RADAR_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
CHECK_FOR_BREAKOUT()
IF NOT bAppliedAnim
REQUEST_CLIP_SET(sClipSet)
IF HAS_CLIP_SET_LOADED(sClipSet)
//FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_IDLE)
SET_PED_MOVEMENT_CLIPSET(PLAYER_PED_ID(), sClipSet)
SET_PED_ALTERNATE_MOVEMENT_ANIM(PLAYER_PED_ID(), AAT_IDLE, sClipSet, "idle")
bAppliedAnim = TRUE
ENDIF
ENDIF
// Monitor for particle effects/early breakout
IF IS_SYNCHRONIZED_SCENE_RUNNING(mSynchedScene)
fScenePhase = GET_SYNCHRONIZED_SCENE_PHASE(mSynchedScene)
IF NOT bConvoKilled
IF fScenePhase > 0.15
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: Killing any previous convo")
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: Convo check done...")
bConvoKilled = TRUE
ENDIF
ENDIF
// Lighter flame
IF bLighterFlame = FALSE
IF fScenePhase > GET_PHASE_TIME_FOR_LIGHTER_FLAME()
ptfxLighter = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_sh_lighter_flame", GET_SECONDARY_ENTITY(), GET_LIGHTER_FLAME_POS(), <<0.0,0.0,0.0>>)
SET_PARTICLE_FX_LOOPED_EVOLUTION(ptfxLighter, "inhale", 1)
bLighterFlame = TRUE
ENDIF
ELSE
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfxLighter)
IF fScenePhase > GET_PHASE_TIME_FOR_LIGHTER_FLAME(FALSE)
STOP_PARTICLE_FX_LOOPED(ptfxLighter)
ENDIF
ENDIF
ENDIF
// Lighter sparks
IF bLighterSparks = FALSE
IF GET_SYNCHRONIZED_SCENE_PHASE(mSynchedScene) > GET_PHASE_TIME_FOR_LIGHTER_SPARKS()
STOP_CURRENT_PLAYING_AMBIENT_SPEECH(PLAYER_PED_ID())
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_sh_lighter_sparks", GET_SECONDARY_ENTITY(), << 0.0, 0.0, 0.06 >>, << 0.0, 0.0, 0.0 >>)
bLighterSparks = TRUE
ENDIF
ENDIF
// Bong smoke fx
IF bBongSmoke = FALSE
IF fScenePhase > GET_PHASE_TIME_FOR_BONG_SMOKE()
START_PARTICLE_FX_NON_LOOPED_ON_PED_BONE("scr_sh_bong_smoke", PLAYER_PED_ID(), << -0.025, 0.13, 0.0 >>, <<0,0,0>>, BONETAG_HEAD)
bBongSmoke = TRUE
ENDIF
ENDIF
IF fScenePhase > STONED_PHASE
IF NOT bTakenHit
IF IS_NOT_1ST_PERSON_AND_DOES_CAM_EXIST(CamIndex)
Player_Takes_Weed_Hit(PLAYER_PED_ID(), CamIndex)
ELSE
Player_Takes_Weed_Hit(PLAYER_PED_ID(), NULL)
ENDIF
iTimesUsed++
bTakenHit = TRUE
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: Player_Takes_Weed_Hit called ")
ENDIF
ENDIF
IF NOT bTriggeredExitCam
IF fScenePhase > GET_EXIT_PHASE_TIME()
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: TRIGGERING EXIT CAM")
RENDER_SCRIPT_CAMS(FALSE, FALSE)
// Normal gameplay camera
IF IS_NOT_1ST_PERSON_AND_DOES_CAM_EXIST(CamIndex)
DESTROY_CAM(CamIndex)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(GET_HEADING())
SET_GAMEPLAY_CAM_RELATIVE_PITCH(GET_PITCH())
SHAKE_GAMEPLAY_CAM("HAND_SHAKE", DEFAULT_CAM_SHAKE)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
ENDIF
bTriggeredExitCam = TRUE
ENDIF
ENDIF
// Handle breakout of animation
IF bBreakoutEarly
IF FIND_ANIM_EVENT_PHASE(sAnimDict, GET_ENTER_ANIM_FOR_THIS_ACTIVITY(), "ScriptEvent", fReturnStartPhase, fReturnEndPhase)
IF fScenePhase >= fReturnStartPhase AND fScenePhase <= fReturnEndPhase
CPRINTLN(DEBUG_AMBIENT, "[SA] Bong: Found ScriptEvent at ", fScenePhase)
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: Breakout Early - TS_RUN_ANIM -> TS_TRIGGER_EXIT_ANIM")
eTriggerState = TS_TRIGGER_EXIT_ANIM
ENDIF
ENDIF
// IF FIND_ANIM_EVENT_PHASE(sAnimDict, GET_ENTER_ANIM_FOR_THIS_ACTIVITY(), "WalkInterruptible", fReturnStartPhase, fReturnEndPhase)
// IF fScenePhase >= fReturnStartPhase AND fScenePhase <= fReturnEndPhase
// CPRINTLN(DEBUG_AMBIENT, "[SA] Bong: Found WalkInterruptible at ", fScenePhase)
// CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: Breakout Early - TS_RUN_ANIM -> TS_TRIGGER_EXIT_ANIM")
// eTriggerState = TS_TRIGGER_EXIT_ANIM
// ENDIF
// ENDIF
ENDIF
// Synchronised scene has finished
ELSE
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: TS_RUN_ANIM -> TS_RESET")
eTriggerState = TS_RESET
ENDIF
BREAK
CASE TS_TRIGGER_EXIT_ANIM
DISABLE_SELECTOR_THIS_FRAME()
HIDE_HUD_AND_RADAR_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
mSynchedScene = CREATE_SYNCHRONIZED_SCENE(GET_SYNCHED_SCENE_VECTOR(), GET_SYNCHED_SCENE_ROT())
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), mSynchedScene, sAnimDict, GET_EXIT_ANIM_FOR_THIS_ACTIVITY(), SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT)
// Apply the exit anim to the player and all props he uses.
IF bEntityHasExitAnim
PLAY_SYNCHRONIZED_ENTITY_ANIM(mTrigger, mSynchedScene, GET_EXIT_ANIM_FOR_THIS_ENTITY(), sAnimDict, SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(GET_SECONDARY_ENTITY(), mSynchedScene, GET_EXIT_ANIM_FOR_SECOND_ENTITY(), sAnimDict, SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT)
IF IS_NOT_1ST_PERSON_AND_DOES_CAM_EXIST(CamIndex)
IF NOT bIsFranklin
SET_CAM_ANIM_CURRENT_PHASE(CamIndex, 1.0)
ENDIF
ENDIF
ENDIF
IF IS_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(mSynchedScene)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(mSynchedScene, FALSE)
ENDIF
bBreakoutEarly = FALSE
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: TS_BREAKOUT_EARLY")
eTriggerState = TS_BREAKOUT_EARLY
BREAK
CASE TS_BREAKOUT_EARLY
DISABLE_SELECTOR_THIS_FRAME()
HIDE_HUD_AND_RADAR_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
CHECK_FOR_BREAKOUT()
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(mSynchedScene)
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: TS_RESET due to scene ending")
eTriggerState = TS_RESET
ELSE
IF NOT bTakenHit
IF IS_NOT_1ST_PERSON_AND_DOES_CAM_EXIST(CamIndex)
Player_Takes_Weed_Hit(PLAYER_PED_ID(), CamIndex)
ELSE
Player_Takes_Weed_Hit(PLAYER_PED_ID(), NULL)
ENDIF
iTimesUsed++
bTakenHit = TRUE
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: TS_BREAKOUT_EARLY Player_Takes_Weed_Hit called ")
ENDIF
IF bBreakoutEarly
//CPRINTLN(DEBUG_AMBIENT, "[SA] Bong: Player wants to break out of the exit anim")
IF FIND_ANIM_EVENT_PHASE(sAnimDict, GET_EXIT_ANIM_FOR_THIS_ACTIVITY(), "WalkInterruptible", fReturnStartPhase, fReturnEndPhase)
IF (fScenePhase >= fReturnStartPhase) AND (fScenePhase <= fReturnEndPhase)
CPRINTLN(DEBUG_AMBIENT, "[SA] Bong: Found WalkInterruptible at ", fScenePhase)
CPRINTLN(DEBUG_AMBIENT, "[SA] Bong: TS_BREAKOUT_EARLY -> TS_RESET (EXIT BREAKOUT!)")
eTriggerState = TS_RESET
ENDIF
ENDIF
IF FIND_ANIM_EVENT_PHASE(sAnimDict, GET_EXIT_ANIM_FOR_THIS_ACTIVITY(), "ScriptEvent", fReturnStartPhase, fReturnEndPhase)
IF (fScenePhase >= fReturnStartPhase) AND (fScenePhase <= fReturnEndPhase)
CPRINTLN(DEBUG_AMBIENT, "[SA] Bong: Found ScriptEvent at ", fScenePhase)
CPRINTLN(DEBUG_AMBIENT, "[SA] Bong: TS_BREAKOUT_EARLY -> TS_RESET (EXIT BREAKOUT!)")
eTriggerState = TS_RESET
ENDIF
ENDIF
ENDIF
// Frankin has an exit cam
IF bIsFranklin
IF NOT bTriggeredExitCam
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: TRIGGERING EXIT CAM")
RENDER_SCRIPT_CAMS(FALSE, FALSE)
// Normal gameplay camera
IF IS_NOT_1ST_PERSON_AND_DOES_CAM_EXIST(CamIndex)
DESTROY_CAM(CamIndex)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(GET_HEADING())
SET_GAMEPLAY_CAM_RELATIVE_PITCH(GET_PITCH())
SHAKE_GAMEPLAY_CAM("HAND_SHAKE", DEFAULT_CAM_SHAKE)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
ENDIF
bTriggeredExitCam = TRUE
ENDIF
ENDIF
ENDIF
BREAK
CASE TS_RESET
// Clear tasks
CLEAR_PED_TASKS(PLAYER_PED_ID())
REACTIVATE_NAMED_WORLD_BRAINS_WAITING_TILL_OUT_OF_RANGE("chop")
// Normal gameplay camera
IF IS_NOT_1ST_PERSON_AND_DOES_CAM_EXIST(CamIndex)
STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP()
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("FRANKLIN_SAFEHOUSE_ACTIVITIES_SCENE")
STOP_AUDIO_SCENE("FRANKLIN_SAFEHOUSE_ACTIVITIES_SCENE")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MICHAEL_SAFEHOUSE_ACTIVITIES_SCENE")
STOP_AUDIO_SCENE("MICHAEL_SAFEHOUSE_ACTIVITIES_SCENE")
ENDIF
// Increment tracking stat
IF STAT_GET_INT(NUM_SH_BONG_SMOKED, iUsageStat)
STAT_SET_INT(NUM_SH_BONG_SMOKED, iUsageStat+1)
ENDIF
IF DOES_ENTITY_EXIST(mTrigger)
IF NOT IS_ENTITY_ATTACHED(mTrigger)
FREEZE_ENTITY_POSITION(mTrigger, TRUE)
ENDIF
ENDIF
// Reset Flags
bBongSmoke = FALSE
bLighterFlame = FALSE
bLighterSparks = FALSE
bBreakoutEarly = FALSE
bTriggeredExitCam = FALSE
bTakenHit = FALSE
bConvoKilled = FALSE
// Restore control
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
bSafehouseSetControlOff = FALSE
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE, DEFAULT, FALSE)
eTriggerState = TS_PLAYER_OUT_OF_RANGE
BREAK
ENDSWITCH
ENDPROC
FUNC BOOL HAS_SOMEONE_KNOCKED_BONG_OVER()
VECTOR vBongRot = GET_ENTITY_ROTATION(GET_CLOSEST_OBJECT_OF_TYPE(vTriggerPos, 2.0, PROP_BONG_01, FALSE))
IF (vBongRot.x < 0.1) AND (vBongRot.x > -0.1)
AND (vBongRot.y < 0.1) AND( vBongRot.y > -0.1)
RETURN FALSE
ENDIF
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: SOMEONE KNOCKED THE BONG OVER")
RETURN TRUE
ENDFUNC
PROC MP_UPDATE_BONG_ACTIVITY()
VECTOR vTriggerSize = << 1.2, 1.2, 1.2 >>
FLOAT fScenePhase = 0.0
FLOAT fReturnStartPhase, fReturnEndPhase
SWITCH eMPTriggerState
CASE MP_TS_PLAYER_OUT_OF_RANGE
IF iPersonalAptActivity = ci_APT_ACT_BONG
iPersonalAptActivity = ci_APT_ACT_IDLE
ENDIF
IF IS_TRIGGER_AREA_OK(vTriggerPos, vTriggerSize)
AND MP_IS_APARTMENT_ACTIVITY_FREE_AND_PLAYER_IS_AVAILABLE(ci_APT_ACT_BONG )
AND NOT HAS_SOMEONE_KNOCKED_BONG_OVER()
AND GET_ENTITY_HEADING(PLAYER_PED_ID()) >= (fTriggerHead - TRIGGER_ANGLE)
AND GET_ENTITY_HEADING(PLAYER_PED_ID()) <= (fTriggerHead + TRIGGER_ANGLE)
AND GET_INTERIOR_FROM_ENTITY(PLAYER_PED_ID()) = GET_INTERIOR_FROM_ENTITY(mTrigger)
IF iContextIntention = NEW_CONTEXT_INTENTION
REGISTER_CONTEXT_INTENTION(iContextIntention, CP_MEDIUM_PRIORITY, "SA_BONG2")
ENDIF
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: MP_TS_WAIT_FOR_PLAYER")
eMPTriggerState = MP_TS_WAIT_FOR_PLAYER
ENDIF
BREAK
CASE MP_TS_WAIT_FOR_PLAYER
IF CAN_PLAYER_START_CUTSCENE()
IF IS_TRIGGER_AREA_OK(vTriggerPos, vTriggerSize)
AND MP_IS_APARTMENT_ACTIVITY_FREE_AND_PLAYER_IS_AVAILABLE(ci_APT_ACT_BONG )
AND GET_ENTITY_HEADING(PLAYER_PED_ID()) >= (fTriggerHead - TRIGGER_ANGLE)
AND GET_ENTITY_HEADING(PLAYER_PED_ID()) <= (fTriggerHead + TRIGGER_ANGLE)
AND NOT IS_PLAYER_FREE_AIMING(PLAYER_ID())
AND NOT IS_PLAYER_TARGETTING_ANYTHING(PLAYER_ID())
AND NOT HAS_SOMEONE_KNOCKED_BONG_OVER()
IF HAS_CONTEXT_BUTTON_TRIGGERED(iContextIntention)
iPersonalAptActivity = ci_APT_ACT_BONG
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("SA_BONG2")
CLEAR_HELP(TRUE)
ENDIF
RELEASE_CONTEXT_INTENTION(iContextIntention)
DISABLE_INTERACTION_MENU()
CLEAR_AREA_OF_PROJECTILES(vTriggerPos, 3.0)
NET_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, NSPC_LEAVE_CAMERA_CONTROL_ON)
bSafehouseSetControlOff = TRUE
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
IF DOES_ENTITY_EXIST(mTrigger)
IF NOT IS_ENTITY_ATTACHED(mTrigger)
FREEZE_ENTITY_POSITION(mTrigger, FALSE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(mLighter)
IF NOT IS_ENTITY_ATTACHED(mLighter)
FREEZE_ENTITY_POSITION(mLighter, FALSE)
ENDIF
ENDIF
TASK_GO_STRAIGHT_TO_COORD(PLAYER_PED_ID(), vTriggerPos, PEDMOVEBLENDRATIO_WALK, 5000, fTriggerHead, DEFAULT_NAVMESH_RADIUS)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE, DEFAULT, FALSE)
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: MP_TS_TRIGGER_SMOKE_ANIM")
eMPTriggerState = MP_TS_TRIGGER_SMOKE_ANIM
ENDIF
ELSE
RELEASE_CONTEXT_INTENTION(iContextIntention)
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("SA_BONG2")
CLEAR_HELP(TRUE)
ENDIF
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: MP_TS_PLAYER_OUT_OF_RANGE")
eMPTriggerState = MP_TS_PLAYER_OUT_OF_RANGE
ENDIF
ENDIF
BREAK
CASE MP_TS_TRIGGER_SMOKE_ANIM
DISABLE_SELECTOR_THIS_FRAME()
HIDE_HUD_AND_RADAR_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
DISABLE_ALL_MP_HUD_THIS_FRAME()
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_GO_STRAIGHT_TO_COORD) = FINISHED_TASK
REMOVE_PLAYER_MASK()
mSynchedScene = CREATE_SYNCHRONIZED_SCENE(vScenePos, vSceneHead)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), mSynchedScene, sAnimDict, sPedSmokeAnim, SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS|SYNCED_SCENE_DONT_INTERRUPT)
IF NOT PLAY_SYNCHRONIZED_ENTITY_ANIM(mTrigger, mSynchedScene, sBongSmokeAnim, sAnimDict, SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT)
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: CANNOT PLAY BONG ANIM.")
ENDIF
IF NOT PLAY_SYNCHRONIZED_ENTITY_ANIM(mLighter, mSynchedScene, sLighterSmokeAnim, sAnimDict, SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT)
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: CANNOT PLAY LIGHTER ANIM.")
ENDIF
// Initialise camera
// CamIndex = CREATE_CAMERA()
//
// IF DOES_CAM_EXIST(CamIndex)
// SET_CAM_ACTIVE(CamIndex, TRUE)
// RENDER_SCRIPT_CAMS(TRUE, FALSE)
// SET_CAM_PARAMS(CamIndex, vCamPos, vCamHead, 35.0)
// SHAKE_CAM(CamIndex, "HAND_SHAKE", DEFAULT_CAM_SHAKE)
// ENDIF
//
// CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: USING ANIMATED CAMERA!")
// CamIndex = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", TRUE)
//
// PLAY_SYNCHRONIZED_CAM_ANIM(CamIndex, mSynchedScene, GET_CAMERA_FOR_THIS_ACTIVITY(), sAnimDict)
// SHAKE_CAM(CamIndex, "HAND_SHAKE", DEFAULT_CAM_SHAKE)
// RENDER_SCRIPT_CAMS(TRUE, FALSE)
//
// PLAY_SYNCHRONIZED_CAM_ANIM(CamIndex, mSynchedScene, "bong_cam", sAnimDict)
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: MP_TS_CHECK_SMOKE_ANIM")
eMPTriggerState = MP_TS_CHECK_SMOKE_ANIM
ENDIF
BREAK
CASE MP_TS_CHECK_SMOKE_ANIM
DISABLE_SELECTOR_THIS_FRAME()
HIDE_HUD_AND_RADAR_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
DISABLE_ALL_MP_HUD_THIS_FRAME()
IF IS_SYNCHRONIZED_SCENE_RUNNING(mSynchedScene)
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: MP_TS_RUN_SMOKE_ANIM")
eMPTriggerState = MP_TS_RUN_SMOKE_ANIM
ENDIF
BREAK
CASE MP_TS_RUN_SMOKE_ANIM
DISABLE_SELECTOR_THIS_FRAME()
HIDE_HUD_AND_RADAR_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
DISABLE_ALL_MP_HUD_THIS_FRAME()
//CHECK_FOR_BREAKOUT()
// Monitor for particle effects/early breakout
//IF IS_SYNCHRONIZED_SCENE_RUNNING(mSynchedScene)
IF GET_SYNCHRONIZED_SCENE_PHASE(mSynchedScene) < 0.95
fScenePhase = GET_SYNCHRONIZED_SCENE_PHASE(mSynchedScene)
IF bSetupPTFX
// Lighter flame
IF bLighterFlame = FALSE
IF fScenePhase > GET_PHASE_TIME_FOR_LIGHTER_FLAME()
ptfxLighter = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_sh_lighter_flame", mLighter, GET_LIGHTER_FLAME_POS(), <<0.0,0.0,0.0>>)
bLighterFlame = TRUE
ENDIF
ELSE
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfxLighter)
IF fScenePhase > GET_PHASE_TIME_FOR_LIGHTER_FLAME(FALSE)
STOP_PARTICLE_FX_LOOPED(ptfxLighter)
ENDIF
ENDIF
ENDIF
// Lighter sparks
IF bLighterSparks = FALSE
IF fScenePhase > GET_PHASE_TIME_FOR_LIGHTER_SPARKS()
STOP_CURRENT_PLAYING_AMBIENT_SPEECH(PLAYER_PED_ID())
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_sh_lighter_sparks", mLighter, << 0.0, 0.0, 0.06 >>, << 0.0, 0.0, 0.0 >>)
bLighterSparks = TRUE
ENDIF
ENDIF
// Bong smoke fx
IF bBongSmoke = FALSE
IF fScenePhase > GET_PHASE_TIME_FOR_BONG_SMOKE()
START_PARTICLE_FX_NON_LOOPED_ON_PED_BONE("scr_sh_bong_smoke", PLAYER_PED_ID(), << -0.025, 0.13, 0.0 >>, <<0,0,0>>, BONETAG_HEAD)
bBongSmoke = TRUE
ENDIF
ENDIF
ENDIF
IF fScenePhase > STONED_PHASE
IF NOT bTakenHit
Player_Takes_Weed_Hit(PLAYER_PED_ID())
//iTimesUsed++
bTakenHit = TRUE
ENDIF
ENDIF
// IF NOT bTriggeredCam2
// IF fScenePhase > fCam2PhaseTime
//
// CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: TRIGGERING CAM 2")
//
// IF DOES_CAM_EXIST(CamIndex)
// SET_CAM_PARAMS(CamIndex, vCam2Pos, vCam2Head, 40.0)
// SHAKE_CAM(CamIndex, "HAND_SHAKE", DEFAULT_CAM_SHAKE)
// ENDIF
//
// bTriggeredCam2 = TRUE
//
// ENDIF
// ENDIF
// IF NOT bTriggeredExitCam
// IF fScenePhase > fExitCamPhaseTime
//
// RENDER_SCRIPT_CAMS(FALSE, FALSE)
//
// // Normal gameplay camera
// IF DOES_CAM_EXIST(CamIndex)
// DESTROY_CAM(CamIndex)
// ENDIF
//
// SET_GAMEPLAY_CAM_RELATIVE_HEADING(GET_HEADING())
// SET_GAMEPLAY_CAM_RELATIVE_PITCH(GET_PITCH())
//
// SHAKE_GAMEPLAY_CAM("HAND_SHAKE", DEFAULT_CAM_SHAKE)
// SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
//
// bTriggeredExitCam = TRUE
//
// ENDIF
// ENDIF
// Synchronised scene has finished
ELSE
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: MP_TS_RESET")
iPersonalAptActivityState = ci_APT_ACT_STATE_FINISHING
eMPTriggerState = MP_TS_RESET
ENDIF
BREAK
CASE MP_TS_TRIGGER_EXIT_ANIM
DISABLE_SELECTOR_THIS_FRAME()
HIDE_HUD_AND_RADAR_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
DISABLE_ALL_MP_HUD_THIS_FRAME()
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: APPLY BREAKOUT ANIMATION")
mSynchedScene = CREATE_SYNCHRONIZED_SCENE(vScenePos, vSceneHead)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), mSynchedScene, sAnimDict, sBongExitAnim, SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS|SYNCED_SCENE_DONT_INTERRUPT|SYNCED_SCENE_EXPAND_PED_CAPSULE_FROM_SKELETON)
// Apply the exit anim to the player and all props he uses.
IF bEntityHasExitAnim
PLAY_SYNCHRONIZED_ENTITY_ANIM(mTrigger, mSynchedScene, sBongExitAnim, sAnimDict, SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(mLighter, mSynchedScene, sLighterExitAnim, sAnimDict, SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT)
IF NOT bIsFranklin
//SET_CAM_ANIM_CURRENT_PHASE(CamIndex, 1.0)
ENDIF
ENDIF
bBreakoutEarly = FALSE
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: MP_TS_BREAKOUT_EARLY")
eMPTriggerState = MP_TS_BREAKOUT_EARLY
BREAK
CASE MP_TS_BREAKOUT_EARLY
DISABLE_SELECTOR_THIS_FRAME()
HIDE_HUD_AND_RADAR_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
DISABLE_ALL_MP_HUD_THIS_FRAME()
CHECK_FOR_BREAKOUT()
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(mSynchedScene)
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: MP_TS_RESET")
eMPTriggerState = MP_TS_RESET
ELSE
IF NOT bTakenHit
IF IS_NOT_1ST_PERSON_AND_DOES_CAM_EXIST(CamIndex)
Player_Takes_Weed_Hit(PLAYER_PED_ID(), CamIndex)
ELSE
Player_Takes_Weed_Hit(PLAYER_PED_ID(), NULL)
ENDIF
//iTimesUsed++
bTakenHit = TRUE
ENDIF
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: Looking for WalkInteruptable")
IF FIND_ANIM_EVENT_PHASE(sAnimDict, sPedExitAnim, "WalkInterruptible", fReturnStartPhase, fReturnEndPhase)
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: Found WalkInterruptible")
IF (fScenePhase >= fReturnStartPhase) AND (fScenePhase <= fReturnEndPhase)
// Clear tasks
CLEAR_PED_TASKS(PLAYER_PED_ID())
CPRINTLN(DEBUG_AMBIENT, "[SA] Bong: MP_TS_RESET (EXIT BREAKOUT!)")
eMPTriggerState = MP_TS_RESET
ENDIF
ENDIF
// Frankin has an exit cam
// IF NOT bTriggeredExitCam
// CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: TRIGGERING EXIT CAM")
//
// RENDER_SCRIPT_CAMS(FALSE, FALSE)
//
// // Normal gameplay camera
// IF DOES_CAM_EXIST(CamIndex)
// DESTROY_CAM(CamIndex)
// ENDIF
//
// SET_GAMEPLAY_CAM_RELATIVE_HEADING(GET_HEADING())
// SET_GAMEPLAY_CAM_RELATIVE_PITCH(GET_PITCH())
// SHAKE_GAMEPLAY_CAM("HAND_SHAKE", DEFAULT_CAM_SHAKE)
//
// SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
//
// bTriggeredExitCam = TRUE
// ENDIF
ENDIF
BREAK
CASE MP_TS_RESET
// // Normal gameplay camera
// IF DOES_CAM_EXIST(CamIndex)
// STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP()
// ENDIF
RESTORE_PLAYER_MASK()
// Clear tasks
CLEAR_PED_TASKS(PLAYER_PED_ID())
INCREMENT_MP_APT_SMOKE_COUNTER()
IF IS_AUDIO_SCENE_ACTIVE("FRANKLIN_SAFEHOUSE_ACTIVITIES_SCENE")
STOP_AUDIO_SCENE("FRANKLIN_SAFEHOUSE_ACTIVITIES_SCENE")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MICHAEL_SAFEHOUSE_ACTIVITIES_SCENE")
STOP_AUDIO_SCENE("MICHAEL_SAFEHOUSE_ACTIVITIES_SCENE")
ENDIF
// // Increment tracking stat
// IF STAT_GET_INT(NUM_SH_BONG_SMOKED, iUsageStat)
// STAT_SET_INT(NUM_SH_BONG_SMOKED, iUsageStat+1)
// ENDIF
IF DOES_ENTITY_EXIST(mTrigger)
IF NOT IS_ENTITY_ATTACHED(mTrigger)
FREEZE_ENTITY_POSITION(mTrigger, TRUE)
ENDIF
ENDIF
// Reset Flags
bBongSmoke = FALSE
bLighterFlame = FALSE
bLighterSparks = FALSE
bBreakoutEarly = FALSE
bTriggeredExitCam = FALSE
bTakenHit = FALSE
ENABLE_INTERACTION_MENU()
// Restore control // cntrl vsble clrtk colsn fze ps taget invinc damage allow cam
NET_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
bSafehouseSetControlOff = FALSE
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE, DEFAULT, FALSE)
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: MP_TS_PLAYER_OUT_OF_RANGE")
eMPTriggerState = MP_TS_PLAYER_OUT_OF_RANGE
BREAK
ENDSWITCH
ENDPROC
// ===========================================================================================================
// Script Loop
// ===========================================================================================================
SCRIPT(OBJECT_INDEX mObjectIn)
IF NETWORK_IS_GAME_IN_PROGRESS()
// Default cleanup
IF HAS_FORCE_CLEANUP_OCCURRED(FORCE_CLEANUP_FLAG_DEBUG_MENU)
OR Is_Player_On_Or_Triggering_Any_Mission()
OR MPGlobalsAmbience.bRunningFmIntroCut
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: Default Cleanup")
CLEANUP_BONG_ACTIVITY()
ENDIF
NETWORK_SET_THIS_SCRIPT_IS_NETWORK_SCRIPT(NUM_NETWORK_PLAYERS, FALSE)
// This makes sure the net script is active, waits until it is.
HANDLE_NET_SCRIPT_INITIALISATION()
SET_THIS_SCRIPT_CAN_BE_PAUSED(FALSE)
IF DOES_ENTITY_EXIST(mObjectIn)
mTrigger = mObjectIn
mTriggerModel = GET_ENTITY_MODEL(mTrigger)
// IF NOT NETWORK_GET_ENTITY_IS_NETWORKED(mTrigger)
// NETWORK_REGISTER_ENTITY_AS_NETWORKED(mTrigger)
// ENDIF
iCurProperty = GlobalplayerBD_FM[NATIVE_TO_INT(PLAYER_ID())].propertyDetails.iCurrentlyInsideProperty
INT iCurProp = GET_PROPERTY_SIZE_TYPE(iCurProperty)
SWITCH iCurProp
CASE PROP_SIZE_TYPE_SMALL_APT
bInLowApt = TRUE
BREAK
DEFAULT
bInLowApt = FALSE
BREAK
ENDSWITCH
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] MP Bong: Current property is ", iCurProperty)
sAnimDict = "mp_safehousebong@"
GET_HOUSE_INTERIOR_DETAILS(tempPropertyStruct, iCurProperty)
vTriggerPos = tempPropertyStruct.house.activity[SAFEACT_BONG].vTriggerVec
fTriggerHead = tempPropertyStruct.house.activity[SAFEACT_BONG].fTriggerRot
vScenePos = tempPropertyStruct.house.activity[SAFEACT_BONG].vSceneVec
vSceneHead = tempPropertyStruct.house.activity[SAFEACT_BONG].vSceneRot
// vCamPos = tempPropertyStruct.house.activity[SAFEACT_BONG].vCamVec
// vCamHead = tempPropertyStruct.house.activity[SAFEACT_BONG].vCamRot
// vCam2Pos = tempPropertyStruct.house.activity[SAFEACT_BONG].vCam2Vec
// vCam2Head = tempPropertyStruct.house.activity[SAFEACT_BONG].vCam2Rot
// vExitCamPos = tempPropertyStruct.house.activity[SAFEACT_BONG].vExitCamVec
// vExitCamHead = tempPropertyStruct.house.activity[SAFEACT_BONG].vExitCamRot
bIsFranklin = tempPropertyStruct.house.activity[SAFEACT_BONG].bFranklinBong
IF fTriggerHead < 0.0
fTriggerHead+= 360.0
ENDIF
IF CAN_REGISTER_MISSION_OBJECTS(2)
// Get a handle to the lighter
mLighter = GET_CLOSEST_OBJECT_OF_TYPE(vTriggerPos, 2.0, P_CS_LIGHTER_01, FALSE)
// IF DOES_ENTITY_EXIST(mLighter)
// IF NOT NETWORK_GET_ENTITY_IS_NETWORKED(mLighter)
// NETWORK_REGISTER_ENTITY_AS_NETWORKED(mLighter)
// CPRINTLN(DEBUG_AMBIENT, "[Safehouse] MP Bong: Registering Lighter as Network object.")
// ENDIF
// ENDIF
ENDIF
IF DOES_ENTITY_EXIST(mTrigger)
IF NOT IS_ENTITY_ATTACHED(mTrigger)
FREEZE_ENTITY_POSITION(mTrigger, TRUE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(mLighter)
IF NOT IS_ENTITY_ATTACHED(mLighter)
FREEZE_ENTITY_POSITION(mLighter, TRUE)
ENDIF
ENDIF
ENDIF
ELSE
// Default cleanup
IF HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS|FORCE_CLEANUP_FLAG_DEBUG_MENU|FORCE_CLEANUP_FLAG_SP_TO_MP|FORCE_CLEANUP_FLAG_DIRECTOR)
OR IS_PED_INJURED(PLAYER_PED_ID()) //#1686982
OR IS_PED_WEARING_A_MASK(PLAYER_PED_ID())
OR IS_PED_WEARING_HELMET(PLAYER_PED_ID())
OR IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_MINIGAME)
OR (IS_MISSION_LEADIN_WITH_HIGH_MEMORY_ACTIVE() AND NOT IS_HIGH_MEMORY_PC())
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: Default Cleanup")
CLEANUP_BONG_ACTIVITY()
ENDIF
IF DOES_ENTITY_EXIST(mObjectIn)
mTrigger = mObjectIn
mTriggerModel = GET_ENTITY_MODEL(mTrigger)
IF CAN_PLAYER_USE_THIS_OBJECT()
sAnimDict = GET_ANIM_DICT_FOR_THIS_ACTIVITY()
IF bIsFranklin
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: Franklins bong anims loaded")
ELSE
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: Michaels bong anims loaded")
ENDIF
IF DOES_ENTITY_EXIST(mTrigger)
IF NOT IS_ENTITY_ATTACHED(mTrigger)
FREEZE_ENTITY_POSITION(mTrigger, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: Ready for launch...")
// Mission Loop -------------------------------------------//
WHILE TRUE
WAIT(0)
IF DOES_ENTITY_EXIST(mTrigger)
AND IS_OBJECT_WITHIN_BRAIN_ACTIVATION_RANGE(mTrigger)
AND NOT IS_ENTITY_DEAD(mTrigger)
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
AND CAN_PLAYER_USE_THIS_OBJECT()
AND IS_INTERIOR_CORRECT(mTrigger)
AND NOT IS_PLAYER_SWITCH_IN_PROGRESS()
AND NOT IS_ENTITY_ON_FIRE(PLAYER_PED_ID())
SWITCH eState
CASE AS_LOAD_ASSETS
IF HAVE_ASSETS_LOADED()
eState = AS_RUN_ACTIVITY
ELSE
IF g_bInMultiplayer AND SHOULD_THIS_MULTIPLAYER_THREAD_TERMINATE()
CLEANUP_BONG_ACTIVITY()
ENDIF
ENDIF
BREAK
CASE AS_RUN_ACTIVITY
//IF g_OldSafehouseActivites = TRUE
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF g_bInMultiplayer
IF NOT SHOULD_THIS_MULTIPLAYER_THREAD_TERMINATE()
IF NOT IS_LOW_APT_SOFA_IN_USE()
MP_UPDATE_BONG_ACTIVITY()
APPLY_USAGE_EFFECTS()
ENDIF
ELSE
CLEANUP_BONG_ACTIVITY()
ENDIF
ELSE
UPDATE_BONG_ACTIVITY()
APPLY_USAGE_EFFECTS()
ENDIF
ENDIF
//ENDIF
BREAK
CASE AS_END
BREAK
ENDSWITCH
ELSE
CLEANUP_BONG_ACTIVITY()
ENDIF
ENDWHILE
ENDSCRIPT