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

755 lines
24 KiB
Python
Executable File

// Includes
USING "ob_safehouse_common.sch"
USING "net_mission_trigger_public.sch"
// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : ob_drinking.sc
// DESCRIPTION : Franklin's beer and wine drinking, Michael's wheatgrass.
//
// *****************************************************************************************
// *****************************************************************************************
// Constants
CONST_INT WHEATGRASS_REGEN_DIST(25)
// 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_RUN_EXIT_ANIM,
TS_BREAKOUT_EARLY,
TS_WAIT_TO_LEAVE_AREA,
TS_RESET
ENDENUM
TRIGGER_STATE eTriggerState = TS_PLAYER_OUT_OF_RANGE
// Variables
BOOL bBreakoutEarly = FALSE
BOOL bAnimLoaded = FALSE
CAMERA_INDEX CamIndex
INT iCurProperty
INT mSynchedScene
INT iUsageStat
g_eDrunkLevel eDrunkLevel
STRING sAnimDict
STRING sPedEnterAnim = "ig_2_wheatgrassdrink_michael"
//STRING sPedExitAnim = "exit_michael"
STRING sGlassEnterAnim = "ig_2_wheatgrassdrink_glass"
//STRING sGlassExitAnim = "exit_glass"
STRING sHelpText = "SA_WHEAT"
VECTOR vCamPos
VECTOR vCamHead
FLOAT fCamFov
VECTOR vExitCamPos
VECTOR vExitCamHead
FLOAT fExitCamFov
VECTOR vScenePos
VECTOR vSceneHead
VECTOR vTriggerPos
FLOAT fTriggerHead
// -----------------------------------------------------------------------------------------------------------
// Script Cleanup
// -----------------------------------------------------------------------------------------------------------
PROC CLEANUP_DRINKING_ACTIVITY()
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Wheatgrass: Cleaning up")
// url:bugstar:1645538
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE,DEFAULT,FALSE)
// Clear help message
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(sHelpText)
CLEAR_HELP(TRUE)
ENDIF
// Release audio
RELEASE_AMBIENT_AUDIO_BANK()
IF IS_AUDIO_SCENE_ACTIVE("MICHAEL_SAFEHOUSE_ACTIVITIES_SCENE")
STOP_AUDIO_SCENE("MICHAEL_SAFEHOUSE_ACTIVITIES_SCENE")
ENDIF
// Remove camera
IF DOES_CAM_EXIST(CamIndex)
DESTROY_CAM(CamIndex)
ENDIF
IF bAnimLoaded
REMOVE_ANIM_DICT(sAnimDict)
ENDIF
IF g_bInMultiplayer
IF bSafehouseSetControlOff
NET_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
// End script
TERMINATE_THIS_MULTIPLAYER_THREAD_NO_ARGS()
ELSE
// Restore control and remove motion blur
SAFE_RESTORE_PLAYER_CONTROL()
// End script
TERMINATE_THIS_THREAD()
ENDIF
ENDPROC
// -----------------------------------------------------------------------------------------------------------
// Script Functions
// -----------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// Requests and checks that the anim dict for this activity has loaded
/// RETURNS:
/// True if the anim dict has loaded.
FUNC BOOL HAS_DRINKING_ANIM_DICT_LOADED()
// Load animations
REQUEST_ANIM_DICT(sAnimDict)
WHILE NOT HAS_ANIM_DICT_LOADED(sAnimDict)
WAIT(0)
ENDWHILE
//CPRINTLN(DEBUG_AMBIENT, "ANIM DICT LOADED")
bAnimLoaded = TRUE
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Monitor sticks for movement and set a flag if the player wants to
/// quit the activity early.
PROC CHECK_FOR_BREAKOUT()
// Does the player want to break out?
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] Wheatgrass: PLAYER WANTS TO BREAK OUT")
bBreakoutEarly = TRUE
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Updates drinking activity
PROC UPDATE_DRINKING_ACTIVITY()
vTriggerPos = (GET_TRIGGER_VEC_FOR_THIS_OBJECT())
VECTOR vTriggerSize = << 1.2, 1.2, 1.2 >>
FLOAT fScenePhase = 0.0
SWITCH eTriggerState
CASE TS_PLAYER_OUT_OF_RANGE
IF IS_TRIGGER_AREA_OK(vTriggerPos, vTriggerSize)
AND GET_ENTITY_HEADING(PLAYER_PED_ID()) >= (GET_HEADING_FOR_THIS_OBJ() - TRIGGER_ANGLE)
AND GET_ENTITY_HEADING(PLAYER_PED_ID()) <= (GET_HEADING_FOR_THIS_OBJ() + TRIGGER_ANGLE)
AND DO_REQUIRED_OBJECTS_EXIST()
AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FAM_WEAPDIS")
IF NOT IS_AUDIO_SCENE_ACTIVE("MICHAEL_SAFEHOUSE_ACTIVITIES_SCENE")
START_AUDIO_SCENE("MICHAEL_SAFEHOUSE_ACTIVITIES_SCENE")
ENDIF
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Wheatgrass: PLAYER CLOSE TO TRIGGER...")
SHOW_DEBUG_FOR_THIS_OBJECT()
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 GET_ENTITY_HEADING(PLAYER_PED_ID()) >= (GET_HEADING_FOR_THIS_OBJ() - TRIGGER_ANGLE)
AND GET_ENTITY_HEADING(PLAYER_PED_ID()) <= (GET_HEADING_FOR_THIS_OBJ() + TRIGGER_ANGLE)
AND DO_REQUIRED_OBJECTS_EXIST()
IF NOT IS_PLAYER_TARGETTING_ANYTHING(PLAYER_ID())
AND IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_CONTEXT)
IF GET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID())
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
ENDIF
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Wheatgrass: ACTIVITY TRIGGERED...")
SHOW_DEBUG_FOR_THIS_OBJECT()
SET_PED_CLOTH_PIN_FRAMES(PLAYER_PED_ID(), 180)
DISABLE_SELECTOR_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
KILL_ANY_CONVERSATION()
KILL_FACE_TO_FACE_CONVERSATION()
STOP_CURRENT_PLAYING_AMBIENT_SPEECH(PLAYER_PED_ID())
CLEAR_HELP(TRUE)
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)
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())
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), mSynchedScene, sAnimDict, GET_ENTER_ANIM_FOR_THIS_ACTIVITY(), INSTANT_BLEND_IN, SLOW_BLEND_OUT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(GET_SYNCHED_SCENE_OBJECT(), mSynchedScene, GET_ENTER_ANIM_FOR_THIS_ENTITY(), sAnimDict, INSTANT_BLEND_IN, SLOW_BLEND_OUT)
PLAY_FACIAL_ANIM(PLAYER_PED_ID(), "ig_2_wheatgrassdrink_michael_facial", sAnimDict)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(GET_SYNCHED_SCENE_OBJECT()) //Stop the glitch on the glass.
IF IS_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(mSynchedScene)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(mSynchedScene, FALSE)
ENDIF
IF GET_FOLLOW_PED_CAM_VIEW_MODE() != CAM_VIEW_MODE_FIRST_PERSON
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Wheatgrass: not using 1st person so creating CamIndex")
CamIndex = CREATE_CAMERA()
ELSE
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Wheatgrass: using 1st person so not creating CamIndex")
DESTROY_ALL_CAMS() // Ensure there are no script cams
ENDIF
// Initialise camera
IF IS_NOT_1ST_PERSON_AND_DOES_CAM_EXIST(CamIndex)
SET_CAM_ACTIVE(CamIndex, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
SET_CAM_PARAMS(CamIndex, vCamPos, vCamHead, fCamFov)
SHAKE_CAM(CamIndex, "HAND_SHAKE", DEFAULT_CAM_SHAKE/DEFAULT_CAM_DAMPER)
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Wheatgrass: initialised CamIndex")
ENDIF
// Play scene
eTriggerState = TS_RUN_ANIM
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Wheatgrass: TS_GRAB_PLAYER -> 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)
IF IS_SYNCHRONIZED_SCENE_RUNNING(mSynchedScene)
IF IS_NOT_1ST_PERSON_AND_DOES_CAM_EXIST(CamIndex)
DO_CAM_ADJUST(CamIndex, vCamHead)
ENDIF
fScenePhase = GET_SYNCHRONIZED_SCENE_PHASE(mSynchedScene)
CHECK_FOR_BREAKOUT()
IF NOT bDoneWheatGrassDialogue
IF fScenePhase > 0.6
START_WHEATGRASS_DIALOGUE()
ENDIF
ENDIF
IF bBreakoutEarly
FLOAT fReturnStartPhase, fReturnEndPhase
// There is no ScriptEvent tag present in the drinking wheatgrass anim.
// The script looks for a WalkInteruptible and if it's found, we exit out to the early breakout anim
// Can we trigger the seperate exit anim early?
IF FIND_ANIM_EVENT_PHASE(sAnimDict, GET_ENTER_ANIM_FOR_THIS_ACTIVITY(), "WalkInterruptible", fReturnStartPhase, fReturnEndPhase)
IF fScenePhase >= fReturnStartPhase AND fScenePhase <= fReturnEndPhase
// If we have seperate exit anims, play them here.
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(), NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(GET_SYNCHED_SCENE_OBJECT(), mSynchedScene, GET_EXIT_ANIM_FOR_THIS_ENTITY(), sAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
IF IS_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(mSynchedScene)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(mSynchedScene, FALSE)
ENDIF
IF IS_NOT_1ST_PERSON_AND_DOES_CAM_EXIST(CamIndex)
SET_CAM_PARAMS(CamIndex, vExitCamPos, vExitCamHead, fExitCamFov)
ENDIF
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Wheatgrass: TS_RUN_ANIM -> TS_RESET WalkInterruptible detected at ScenePhase ", fScenePhase)
eTriggerState = TS_RESET
ENDIF
ENDIF
ENDIF
ELSE // The drinking anim has finished
IF IS_NOT_1ST_PERSON_AND_DOES_CAM_EXIST(CamIndex)
SET_CAM_PARAMS(CamIndex, vExitCamPos, vExitCamHead, fExitCamFov)
ENDIF
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Wheatgrass: TS_RUN_ANIM -> TS_RESET")
eTriggerState = TS_RESET
ENDIF
BREAK
CASE TS_RUN_EXIT_ANIM
DISABLE_SELECTOR_THIS_FRAME()
HIDE_HUD_AND_RADAR_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(mSynchedScene)
IF IS_NOT_1ST_PERSON_AND_DOES_CAM_EXIST(CamIndex)
SET_CAM_PARAMS(CamIndex, vExitCamPos, vExitCamHead, fExitCamFov)
ENDIF
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Wheatgrass: TS_RUN_EXIT_ANIM -> TS_RESET")
eTriggerState = TS_RESET
ENDIF
BREAK
CASE TS_RESET
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Wheatgrass: Resetting")
DISABLE_SELECTOR_THIS_FRAME()
HIDE_HUD_AND_RADAR_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
// Increment TV usage stat
IF STAT_GET_INT(NUM_SH_WHEATGRASS, iUsageStat)
STAT_SET_INT(NUM_SH_WHEATGRASS, iUsageStat+1)
ENDIF
// Normal gameplay cam
IF IS_NOT_1ST_PERSON_AND_DOES_CAM_EXIST(CamIndex)
STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP()
ENDIF
// Restore control
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
bSafehouseSetControlOff = FALSE
bBreakoutEarly = FALSE
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE,DEFAULT,FALSE)
// Also can only trigger once, need to walk away for activity to reset
FREEZE_ENTITY_POSITION(mTrigger, TRUE)
PLAY_ENTITY_ANIM(GET_SYNCHED_SCENE_OBJECT(), GET_ENTER_ANIM_FOR_THIS_ENTITY(), sAnimDict, INSTANT_BLEND_IN, FALSE, TRUE, FALSE, 1.0)
// Give Michael a health boost if he's just drunk wheatgrass
IF GET_ENTITY_HEALTH(PLAYER_PED_ID()) < (GET_PED_MAX_HEALTH(PLAYER_PED_ID())- HEALTH_BOOST_VALUE)
SET_ENTITY_HEALTH(PLAYER_PED_ID(), (GET_ENTITY_HEALTH(PLAYER_PED_ID()) + HEALTH_BOOST_VALUE))
ENDIF
// Fill Michael's special ability by 25%
SPECIAL_ABILITY_CHARGE_NORMALIZED(PLAYER_ID(), 0.25, TRUE)
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Wheatgrass: TS_RESET -> TS_WAIT_TO_LEAVE_AREA")
eTriggerState = TS_WAIT_TO_LEAVE_AREA
BREAK
ENDSWITCH
ENDPROC
PROC MP_UPDATE_DRINKING_ACTIVITY()
VECTOR vTriggerSize = << 1.2, 1.2, 1.2 >>
// FLOAT fScenePhase = 0.0
SWITCH eTriggerState
CASE TS_PLAYER_OUT_OF_RANGE
IF iPersonalAptActivity = ci_APT_ACT_WHEATGRASS
iPersonalAptActivity = ci_APT_ACT_IDLE
ENDIF
eDrunkLevel = Get_Peds_Drunk_Level(PLAYER_PED_ID())
IF MP_IS_APARTMENT_ACTIVITY_FREE_AND_PLAYER_IS_AVAILABLE(ci_APT_ACT_WHEATGRASS) AND NOT IS_BIT_SET(iBS_AptActivityInUse, ci_APT_ACT_WHEATGRASS_USED)
PRINTSTRING("PAul - addituional") PRINTNL()
IF IS_TRIGGER_AREA_OK(vTriggerPos, vTriggerSize)
// AND GET_ENTITY_HEADING(PLAYER_PED_ID()) >= (fTriggerHead - TRIGGER_ANGLE)
// AND GET_ENTITY_HEADING(PLAYER_PED_ID()) <= (fTriggerHead + TRIGGER_ANGLE)
AND eDrunkLevel = DL_NO_LEVEL
PRINT_HELP_FOREVER("SA_WHEAT")
eTriggerState = TS_WAIT_FOR_PLAYER
ENDIF
ENDIF
BREAK
CASE TS_WAIT_FOR_PLAYER
IF CAN_PLAYER_START_CUTSCENE()
IF IS_TRIGGER_AREA_OK(vTriggerPos, vTriggerSize)
// AND GET_ENTITY_HEADING(PLAYER_PED_ID()) >= (fTriggerHead - TRIGGER_ANGLE)
// AND GET_ENTITY_HEADING(PLAYER_PED_ID()) <= (fTriggerHead + TRIGGER_ANGLE)
AND MP_IS_APARTMENT_ACTIVITY_FREE_AND_PLAYER_IS_AVAILABLE(ci_APT_ACT_WHEATGRASS)
AND NOT IS_BIT_SET(iBS_AptActivityInUse, ci_APT_ACT_WHEATGRASS_USED)
IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_CONTEXT)
IF GET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID())
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
ENDIF
iPersonalAptActivity = ci_APT_ACT_WHEATGRASS
CPRINTLN(DEBUG_AMBIENT, "[SH] Wheatgrass ACTIVITY TRIGGERED...")
DISABLE_SELECTOR_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
STOP_CURRENT_PLAYING_AMBIENT_SPEECH(PLAYER_PED_ID())
CLEAR_HELP(TRUE)
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)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE,DEFAULT,FALSE)
TASK_FOLLOW_NAV_MESH_TO_COORD(PLAYER_PED_ID(), vTriggerPos, PEDMOVEBLENDRATIO_WALK, 60000, DEFAULT_NAVMESH_RADIUS, ENAV_STOP_EXACTLY, fTriggerHead)
eTriggerState = TS_GRAB_PLAYER
ENDIF
ELSE
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("SA_WHEAT")
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_ALL_MP_HUD_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) = FINISHED_TASK
REMOVE_PLAYER_MASK()
// CamIndex = CREATE_CAMERA()
// Initialise 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
mSynchedScene = CREATE_SYNCHRONIZED_SCENE(vScenePos, vSceneHead)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), mSynchedScene, sAnimDict, sPedEnterAnim, REALLY_SLOW_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS, RBF_NONE, REALLY_SLOW_BLEND_IN, AIK_DISABLE_HEAD_IK)
SET_ENTITY_COLLISION(mTrigger, FALSE)
PLAY_SYNCHRONIZED_ENTITY_ANIM(mTrigger, mSynchedScene, sGlassEnterAnim, sAnimDict, REALLY_SLOW_BLEND_IN, SLOW_BLEND_OUT)
// Play scene
eTriggerState = TS_RUN_ANIM
CPRINTLN(DEBUG_AMBIENT, "[SH] Wheatgrass TS_GRAB_PLAYER -> TS_RUN_ANIM")
ENDIF
BREAK
CASE TS_RUN_ANIM
DISABLE_SELECTOR_THIS_FRAME()
HIDE_HUD_AND_RADAR_THIS_FRAME()
DISABLE_ALL_MP_HUD_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
IF GET_SYNCHRONIZED_SCENE_PHASE(mSynchedScene) > 0.99
CPRINTLN(DEBUG_AMBIENT, "[SH] Wheatgrass TS_RUN_ANIM -> TS_RESET")
//SET_CAM_PARAMS(CamIndex, vExitCamPos, vExitCamHead, 50.0)
eTriggerState = TS_RESET
ENDIF
BREAK
CASE TS_RUN_EXIT_ANIM
DISABLE_SELECTOR_THIS_FRAME()
HIDE_HUD_AND_RADAR_THIS_FRAME()
DISABLE_ALL_MP_HUD_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
IF GET_SYNCHRONIZED_SCENE_PHASE(mSynchedScene) > 0.99
CPRINTLN(DEBUG_AMBIENT, "[SH] Wheatgrass TS_RUN_EXIT_ANIM -> TS_RESET")
//SET_CAM_PARAMS(CamIndex, vExitCamPos, vExitCamHead, 50.0)
eTriggerState = TS_RESET
ENDIF
BREAK
CASE TS_RESET
CPRINTLN(DEBUG_AMBIENT, "[SH] Wheatgrass Resetting")
DISABLE_SELECTOR_THIS_FRAME()
HIDE_HUD_AND_RADAR_THIS_FRAME()
DISABLE_ALL_MP_HUD_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
CLEAR_PED_TASKS(PLAYER_PED_ID())
RESTORE_PLAYER_MASK()
// // Increment TV usage stat
// IF STAT_GET_INT(NUM_SH_WHEATGRASS, iUsageStat)
// STAT_SET_INT(NUM_SH_WHEATGRASS, iUsageStat+1)
// ENDIF
// Normal gameplay cam
// IF DOES_CAM_EXIST(CamIndex)
// STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP()
// ENDIF
// Restore control
NET_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
bSafehouseSetControlOff = FALSE
bBreakoutEarly = FALSE
iPersonalAptActivity = ci_APT_ACT_IDLE
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE,DEFAULT,FALSE)
// Also can only trigger once, need to walk away for activity to reset
FREEZE_ENTITY_POSITION(mTrigger, TRUE)
PLAY_ENTITY_ANIM(mTrigger, sGlassEnterAnim, sAnimDict, INSTANT_BLEND_IN, FALSE, TRUE, FALSE, 1.0)
// Give player a health boost if he's just drunk wheatgrass
IF GET_ENTITY_HEALTH(PLAYER_PED_ID()) < (GET_PED_MAX_HEALTH(PLAYER_PED_ID())- HEALTH_BOOST_VALUE)
SET_ENTITY_HEALTH(PLAYER_PED_ID(), (GET_ENTITY_HEALTH(PLAYER_PED_ID()) + HEALTH_BOOST_VALUE))
ELSE
SET_ENTITY_HEALTH(PLAYER_PED_ID(), GET_PED_MAX_HEALTH(PLAYER_PED_ID()))
ENDIF
// // Fill Michael's special ability by 25%
// SPECIAL_ABILITY_CHARGE_NORMALIZED(PLAYER_ID(), 0.25, TRUE)
SET_ENTITY_COLLISION(mTrigger, TRUE)
CPRINTLN(DEBUG_AMBIENT, "[SH] Wheatgrass TS_RESET -> TS_WAIT_TO_LEAVE_AREA")
eTriggerState = TS_WAIT_TO_LEAVE_AREA
BREAK
ENDSWITCH
ENDPROC
FUNC BOOL IS_WITHIN_BRAIN_ACTIVATION_RANGE()
IF eTriggerState = TS_WAIT_TO_LEAVE_AREA
// This will be handled in TS_WAIT_TO_LEAVE_AREA
// Needed to reset wheatgrass glass state
RETURN TRUE
ELSE
// Standard world brain check
IF IS_OBJECT_WITHIN_BRAIN_ACTIVATION_RANGE(mTrigger)
//CPRINTLN(DEBUG_AMBIENT, "Object is within brain activation range...")
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
// ===========================================================================================================
// 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, "DEFAULT CLEANUP")
CLEANUP_DRINKING_ACTIVITY()
ENDIF
ELSE
// Default cleanup
IF HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS|FORCE_CLEANUP_FLAG_DEBUG_MENU)
OR IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_MINIGAME)
OR (IS_MISSION_LEADIN_WITH_HIGH_MEMORY_ACTIVE() AND NOT IS_HIGH_MEMORY_PC())
OR Is_Player_On_Or_Triggering_Any_Mission()
CPRINTLN(DEBUG_AMBIENT, "DEFAULT CLEANUP")
CLEANUP_DRINKING_ACTIVITY()
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(mObjectIn)
mTrigger = mObjectIn
mTriggerModel = GET_ENTITY_MODEL(mTrigger)
IF NOT IS_ENTITY_ATTACHED(mTrigger)
FREEZE_ENTITY_POSITION(mTrigger, TRUE)
ENDIF
IF NETWORK_IS_GAME_IN_PROGRESS()
// 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
CPRINTLN(DEBUG_AMBIENT, "[SH MP] Wheatgrass: Current property is ", iCurProperty)
GET_HOUSE_INTERIOR_DETAILS(tempPropertyStruct, iCurProperty)
vTriggerPos = tempPropertyStruct.house.activity[SAFEACT_WHEATGRS].vTriggerVec
fTriggerHead = tempPropertyStruct.house.activity[SAFEACT_WHEATGRS].fTriggerRot
IF fTriggerHead < 0.0
fTriggerHead+= 360.0
ENDIF
vScenePos = tempPropertyStruct.house.activity[SAFEACT_WHEATGRS].vSceneVec
vSceneHead = tempPropertyStruct.house.activity[SAFEACT_WHEATGRS].vSceneRot
// vCamPos = tempPropertyStruct.house.activity[SAFEACT_WHEATGRS].vCamVec
// vCamHead = tempPropertyStruct.house.activity[SAFEACT_WHEATGRS].vCamRot
//
// vExitCamPos = tempPropertyStruct.house.activity[SAFEACT_WHEATGRS].vExitCamVec
// vExitCamHead = tempPropertyStruct.house.activity[SAFEACT_WHEATGRS].vExitCamRot
// fExitCamFov = 38.2
sAnimDict = "mp_safehousewheatgrass@"
// vDrawAreaA = tempPropertyStruct.house.activity[SAFEACT_SHOWER].vAreaAVec
// vDrawAreaB = tempPropertyStruct.house.activity[SAFEACT_SHOWER].vAreaBVec
ELSE
sAnimDict = "safe@michael@ig_2"
vCamPos = <<-803.7434, 183.1330, 72.8617>>
vCamHead = <<6.6195, -0.0696, -1.4962>>
fCamFov = 37.3
vExitCamPos = <<-802.6, 184.6, 73.2>>
vExitCamHead = <<-6.4, 0.0, 89.1>>
fExitCamFov = 40.0
ENDIF
ENDIF
CPRINTLN(DEBUG_AMBIENT, "... WHEAT GRASS IS TRIGGERING ...")
// Mission Loop -------------------------------------------//
WHILE TRUE
WAIT(0)
IF DOES_ENTITY_EXIST(mTrigger)
IF IS_WITHIN_BRAIN_ACTIVATION_RANGE()
AND NOT IS_ENTITY_DEAD(mTrigger)
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
AND CAN_PLAYER_USE_THIS_OBJECT()
AND IS_INTERIOR_CORRECT()
AND NOT IS_PLAYER_SWITCH_IN_PROGRESS()
AND NOT IS_ENTITY_ON_FIRE(PLAYER_PED_ID())
AND NOT IS_PED_IN_COVER(PLAYER_PED_ID())
SWITCH eState
CASE AS_LOAD_ASSETS
IF HAS_DRINKING_ANIM_DICT_LOADED()
AND HAS_AUDIO_LOADED()
eState = AS_RUN_ACTIVITY
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()
MP_UPDATE_DRINKING_ACTIVITY()
ELSE
UPDATE_DRINKING_ACTIVITY()
ENDIF
ELSE
UPDATE_DRINKING_ACTIVITY()
ENDIF
ENDIF
//ENDIF
BREAK
CASE AS_END
BREAK
ENDSWITCH
ELSE
CLEANUP_DRINKING_ACTIVITY()
ENDIF
ELSE
CLEANUP_DRINKING_ACTIVITY()
ENDIF
ENDWHILE
ENDSCRIPT