755 lines
24 KiB
Python
Executable File
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
|