1182 lines
43 KiB
Scheme
Executable File
1182 lines
43 KiB
Scheme
Executable File
|
|
USING "commands_debug.sch"
|
|
USING "commands_path.sch"
|
|
USING "commands_camera.sch"
|
|
USING "commands_brains.sch"
|
|
|
|
USING "brains.sch"
|
|
USING "rage_builtins.sch"
|
|
USING "globals.sch"
|
|
USING "cutscene_public.sch"
|
|
USING "drunk_public.sch"
|
|
USING "friends_public.sch"
|
|
USING "flow_mission_data_public.sch"
|
|
USING "flow_public_core.sch"
|
|
USING "model_enums.sch"
|
|
USING "player_ped_public.sch"
|
|
USING "script_player.sch"
|
|
USING "types.sch"
|
|
USING "selector_public.sch"
|
|
|
|
ENUM ACTIVITY_ANIM_STATE
|
|
AAS_WAITING,
|
|
AAS_GET_TO_START,
|
|
AAS_START,
|
|
AAS_ENTRY_ANIM,
|
|
AAS_ENTRY_TO_RUN_ANIM,
|
|
AAS_RUN_ANIM,
|
|
AAS_CHOOSE_RANDOM_IDLE,
|
|
AAS_ENTRY_TO_EXIT_ANIM,
|
|
AAS_RUN_EXIT_ANIM
|
|
ENDENUM
|
|
|
|
STRUCT LOCAL_ACTIVITY_STRUCT
|
|
PED_INDEX piClone
|
|
OBJECT_INDEX oiTrigger
|
|
OBJECT_INDEX oiSecondaryItem
|
|
INT iSynchedScene
|
|
VECTOR vScPos
|
|
VECTOR vScRot
|
|
VECTOR vTrigPos
|
|
FLOAT fTrigRot
|
|
ACTIVITY_ANIM_STATE AnimState
|
|
BOOL bLighterFlame
|
|
BOOL bLighterSparks
|
|
BOOL bBongSmoke
|
|
PTFX_ID ptfxLighter
|
|
PLAYER_INDEX playerIndex
|
|
PED_INDEX pedIndex
|
|
MODEL_NAMES mBathroomDoorModel
|
|
VECTOR vBathroomDoorPos
|
|
INT iLocalDoorHash
|
|
ENDSTRUCT
|
|
|
|
FUNC INT GET_ACTIVITY_SCRIPT_STRING(INT i)
|
|
SWITCH i
|
|
CASE ci_APT_ACT_BONG RETURN HASH("ob_bong") break
|
|
CASE ci_APT_ACT_BEER RETURN HASH("ob_franklin_beer") break
|
|
CASE ci_APT_ACT_SHOTS RETURN HASH("ob_drinking_shots") break
|
|
CASE ci_APT_ACT_WHEATGRASS RETURN HASH("ob_wheatgrass") break
|
|
CASE ci_APT_ACT_SHOWER RETURN HASH("ob_mp_shower_med") break
|
|
CASE ci_APT_ACT_BED_LOW RETURN HASH("ob_mp_bed_low") break
|
|
CASE ci_APT_ACT_BED_MED RETURN HASH("ob_mp_bed_med") break
|
|
CASE ci_APT_ACT_BED_HI RETURN HASH("ob_mp_bed_high") break
|
|
CASE ci_APT_ACT_WINE RETURN HASH("ob_franklin_wine") break
|
|
CASE ci_APT_ACT_SHOWER_2 RETURN HASH("ob_mp_shower_med") break
|
|
CASE ci_APT_ACT_SHOWER_3 RETURN HASH("ob_mp_shower_med") break
|
|
CASE ci_APT_ACT_BED_HI_YACHT_2 RETURN HASH("ob_mp_bed_high") break
|
|
CASE ci_APT_ACT_BED_HI_YACHT_3 RETURN HASH("ob_mp_bed_high") break
|
|
ENDSWITCH
|
|
|
|
RETURN HASH("")
|
|
ENDFUNC
|
|
|
|
FUNC STRING GET_ACTIVITY_ANIM_DICT(INT i, PED_INDEX user)
|
|
SWITCH i
|
|
CASE ci_APT_ACT_BONG RETURN "mp_safehousebong@" break
|
|
CASE ci_APT_ACT_BEER RETURN "MP_SAFEHOUSEBEER@" break
|
|
CASE ci_APT_ACT_SHOTS RETURN "MP_SAFEHOUSEWHISKEY@" break
|
|
CASE ci_APT_ACT_WHEATGRASS RETURN "mp_safehousewheatgrass@" break
|
|
CASE ci_APT_ACT_BED_LOW RETURN "mp_bedmid" break
|
|
CASE ci_APT_ACT_BED_MED RETURN "mp_bedmid" break
|
|
CASE ci_APT_ACT_BED_HI RETURN "mp_bedmid" break
|
|
CASE ci_APT_ACT_WINE RETURN "MP_SAFEHOUSEWINE@" break
|
|
|
|
CASE ci_APT_ACT_SHOWER
|
|
IF GET_ENTITY_MODEL(user) = MP_M_FREEMODE_01
|
|
RETURN "mp_safehouseshower@male@"
|
|
ELSE
|
|
RETURN "mp_safehouseshower@female@"
|
|
ENDIF
|
|
break
|
|
ENDSWITCH
|
|
|
|
RETURN ""
|
|
ENDFUNC
|
|
|
|
FUNC STRING GET_BEER_BOTTLE_EXIT_ANIM(PED_INDEX mPed)
|
|
|
|
STRING sAnim
|
|
g_eDrunkLevel eDrunkLevel = Get_Peds_Drunk_Level(mPed)
|
|
|
|
SWITCH eDrunkLevel
|
|
CASE DL_NO_LEVEL sAnim = "exit_1_bottle" BREAK
|
|
CASE DL_moderatedrunk sAnim = "exit_2_bottle" BREAK
|
|
CASE DL_slightlydrunk sAnim = "exit_3_bottle" BREAK
|
|
CASE DL_verydrunk sAnim = "exit_4_bottle" BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN sAnim
|
|
|
|
ENDFUNC
|
|
|
|
FUNC STRING GET_BEER_PED_EXIT_ANIM(PED_INDEX mPed)
|
|
|
|
STRING sAnim
|
|
g_eDrunkLevel eDrunkLevel = Get_Peds_Drunk_Level(mPed)
|
|
|
|
SWITCH eDrunkLevel
|
|
CASE DL_NO_LEVEL sAnim = "exit_1" BREAK
|
|
CASE DL_moderatedrunk sAnim = "exit_2" BREAK
|
|
CASE DL_slightlydrunk sAnim = "exit_3" BREAK
|
|
CASE DL_verydrunk sAnim = "exit_4" BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN sAnim
|
|
|
|
ENDFUNC
|
|
|
|
FUNC OBJECT_INDEX GET_TRIGGER_OBJECT(INT i, PED_INDEX user)
|
|
|
|
VECTOR vpos = GET_ENTITY_COORDS(user)
|
|
|
|
SWITCH i
|
|
CASE ci_APT_ACT_BONG
|
|
RETURN GET_CLOSEST_OBJECT_OF_TYPE(vpos, 5, PROP_BONG_01, FALSE)
|
|
break
|
|
CASE ci_APT_ACT_BEER
|
|
RETURN GET_CLOSEST_OBJECT_OF_TYPE(vpos, 5, PROP_CS_BEER_BOT_01, FALSE)
|
|
break
|
|
CASE ci_APT_ACT_SHOTS
|
|
RETURN GET_CLOSEST_OBJECT_OF_TYPE(vpos, 5, p_tumbler_cs2_s, FALSE)
|
|
break
|
|
CASE ci_APT_ACT_WHEATGRASS
|
|
RETURN GET_CLOSEST_OBJECT_OF_TYPE(vpos, 5, P_W_GRASS_GLS_S, FALSE)
|
|
break
|
|
CASE ci_APT_ACT_SHOWER
|
|
RETURN GET_CLOSEST_OBJECT_OF_TYPE(vpos, 5, P_MP_SHOWERDOOR_S, FALSE)
|
|
break
|
|
CASE ci_APT_ACT_WINE
|
|
RETURN GET_CLOSEST_OBJECT_OF_TYPE(vpos, 5, P_WINE_GLASS_S, FALSE)
|
|
break
|
|
ENDSWITCH
|
|
|
|
RETURN NULL
|
|
ENDFUNC
|
|
|
|
FUNC OBJECT_INDEX GET_SECONDARY_OBJECT(INT i, PED_INDEX user)
|
|
|
|
VECTOR vpos = GET_ENTITY_COORDS(user)
|
|
|
|
SWITCH i
|
|
CASE ci_APT_ACT_BONG
|
|
RETURN GET_CLOSEST_OBJECT_OF_TYPE(vpos, 5, P_CS_LIGHTER_01, FALSE)
|
|
break
|
|
CASE ci_APT_ACT_SHOTS
|
|
RETURN GET_CLOSEST_OBJECT_OF_TYPE(vpos, 5, p_whiskey_bottle_s, FALSE)
|
|
break
|
|
CASE ci_APT_ACT_WINE
|
|
RETURN GET_CLOSEST_OBJECT_OF_TYPE(vpos, 5, PROP_WINE_BOT_01, FALSE)
|
|
break
|
|
ENDSWITCH
|
|
|
|
RETURN NULL
|
|
ENDFUNC
|
|
|
|
FUNC INT CONVERT_NEILB_ACTIVITY_TO_ROBS(INT i)
|
|
SWITCH i
|
|
CASE ci_APT_ACT_BONG RETURN SAFEACT_BONG break
|
|
CASE ci_APT_ACT_BEER RETURN SAFEACT_BEER break
|
|
CASE ci_APT_ACT_SHOTS RETURN SAFEACT_WHISKEY break
|
|
CASE ci_APT_ACT_WHEATGRASS RETURN SAFEACT_WHEATGRS break
|
|
CASE ci_APT_ACT_SHOWER RETURN SAFEACT_SHOWER break
|
|
CASE ci_APT_ACT_BED_LOW RETURN SAFEACT_BED break
|
|
CASE ci_APT_ACT_BED_MED RETURN SAFEACT_BED break
|
|
CASE ci_APT_ACT_BED_HI RETURN SAFEACT_BED break
|
|
CASE ci_APT_ACT_WINE RETURN SAFEACT_WINE break
|
|
ENDSWITCH
|
|
|
|
RETURN 0
|
|
ENDFUNC
|
|
|
|
FUNC BOOL DOES_THIS_ACTIVITY_NEED_SYNCING_LOCALLY(INT iActivity)
|
|
|
|
IF iActivity = ci_APT_ACT_WINE
|
|
OR iActivity = ci_APT_ACT_BEER
|
|
OR iActivity = ci_APT_ACT_WHEATGRASS
|
|
OR iActivity = ci_APT_ACT_BEER
|
|
OR iActivity = ci_APT_ACT_BONG
|
|
OR iActivity = ci_APT_ACT_SHOWER
|
|
OR iActivity = ci_APT_ACT_SHOTS
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC REMOVE_MASK(PED_INDEX mPed, PED_COMP_NAME_ENUM &eReturnItem)
|
|
// Remove any mask
|
|
SET_PED_COMPONENT_VARIATION(mPed, PED_COMP_BERD, 0, 0)
|
|
|
|
// After removing mask, restore the hair...
|
|
IF IS_SAFE_TO_RESTORE_SAVED_HAIR_MP(mPed, eReturnItem)
|
|
SET_PED_COMP_ITEM_CURRENT_MP(mPed, COMP_TYPE_HAIR, eReturnItem, FALSE)
|
|
ENDIF
|
|
|
|
IF HAS_PED_HEAD_BLEND_FINISHED(mPed)
|
|
AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(mPed)
|
|
FINALIZE_HEAD_BLEND(mPed)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC RETURN_MASK(PED_INDEX mPed, PED_VARIATION_STRUCT &sVariationStruct)
|
|
|
|
SET_PED_VARIATIONS(mPed, sVariationStruct)
|
|
|
|
IF HAS_PED_HEAD_BLEND_FINISHED(mPed)
|
|
AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(mPed)
|
|
FINALIZE_HEAD_BLEND(mPed)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC MP_COMMON_DO_WINE_ACTIVITY_ANIMS(BOOL bIsActivePlayer, STRING sAnimDict, LOCAL_ACTIVITY_STRUCT &activity, PED_VARIATION_STRUCT &sVariationStruct, PED_COMP_NAME_ENUM &eReturnItem)
|
|
|
|
STRING sPedEnterAnim, sGlassEnterAnim, sBottleEnterAnim, sGlassExitAnim, sBottleExitAnim
|
|
|
|
sPedEnterAnim = "drinking_wine"
|
|
sGlassEnterAnim = "drinking_wine_glass"
|
|
sBottleEnterAnim = "drinking_wine_bottle"
|
|
sGlassExitAnim = "drinking_wine_exit_glass"
|
|
sBottleExitAnim = "drinking_wine_exit_bottle"
|
|
|
|
IF (DOES_ENTITY_EXIST(activity.piClone) and not IS_ENTITY_DEAD(activity.piClone))
|
|
AND (DOES_ENTITY_EXIST(activity.oiTrigger) and not IS_ENTITY_DEAD(activity.oiTrigger))
|
|
AND (DOES_ENTITY_EXIST(activity.oiSecondaryItem) and not IS_ENTITY_DEAD(activity.oiSecondaryItem))
|
|
|
|
SWITCH activity.AnimState
|
|
|
|
CASE AAS_GET_TO_START
|
|
|
|
IF bIsActivePlayer
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
DISABLE_ALL_MP_HUD_THIS_FRAME()
|
|
ENDIF
|
|
|
|
// Remember what clothes ped is wearing
|
|
GET_PED_VARIATIONS(activity.piClone, sVariationStruct)
|
|
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(activity.piClone, activity.vTrigPos, PEDMOVEBLENDRATIO_WALK, 60000, DEFAULT_NAVMESH_RADIUS, ENAV_STOP_EXACTLY, activity.fTrigRot)
|
|
activity.AnimState = AAS_START
|
|
|
|
BREAK
|
|
|
|
|
|
CASE AAS_START
|
|
|
|
IF bIsActivePlayer
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
DISABLE_ALL_MP_HUD_THIS_FRAME()
|
|
ENDIF
|
|
|
|
IF GET_SCRIPT_TASK_STATUS(activity.piClone, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) <> WAITING_TO_START_TASK
|
|
AND GET_SCRIPT_TASK_STATUS(activity.piClone, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) = FINISHED_TASK
|
|
|
|
REMOVE_MASK(activity.piClone, eReturnItem)
|
|
|
|
activity.iSynchedScene = CREATE_SYNCHRONIZED_SCENE(activity.vScPos, activity.vScRot)
|
|
TASK_SYNCHRONIZED_SCENE(activity.piClone, activity.iSynchedScene, sAnimDict, sPedEnterAnim, NORMAL_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(activity.oiTrigger, activity.iSynchedScene, sGlassEnterAnim, sAnimDict, NORMAL_BLEND_IN, INSTANT_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(activity.oiSecondaryItem, activity.iSynchedScene, sBottleEnterAnim, sAnimDict, NORMAL_BLEND_IN, INSTANT_BLEND_OUT)
|
|
|
|
// Play scene
|
|
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Wine: TS_RUN_ANIM")
|
|
activity.AnimState = AAS_RUN_ANIM
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE AAS_RUN_ANIM
|
|
|
|
IF bIsActivePlayer
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
DISABLE_ALL_MP_HUD_THIS_FRAME()
|
|
ENDIF
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(activity.iSynchedScene) > 0.99
|
|
|
|
// Exit anim depends on peds drunk level...
|
|
activity.iSynchedScene = CREATE_SYNCHRONIZED_SCENE(activity.vScPos, activity.vScRot)
|
|
TASK_SYNCHRONIZED_SCENE(activity.piClone, activity.iSynchedScene, sAnimDict, "drinking_wine_exit", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(activity.oiTrigger, activity.iSynchedScene, sGlassExitAnim, sAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(activity.oiSecondaryItem, activity.iSynchedScene, sBottleExitAnim, sAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
|
|
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Drinking: Enter anim finished - run exit anim")
|
|
activity.AnimState = AAS_RUN_EXIT_ANIM
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE AAS_RUN_EXIT_ANIM
|
|
|
|
IF bIsActivePlayer
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
DISABLE_ALL_MP_HUD_THIS_FRAME()
|
|
ENDIF
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(activity.iSynchedScene) > 0.99
|
|
|
|
RETURN_MASK(activity.piClone, sVariationStruct)
|
|
|
|
activity.iSynchedScene = CREATE_SYNCHRONIZED_SCENE(activity.vScPos, activity.vScRot)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(activity.oiTrigger, activity.iSynchedScene, "drinking_wine_exit_glass", sAnimDict, INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(activity.iSynchedScene, 1.0)
|
|
|
|
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Drinking: TS_RUN_EXIT_ANIM -> TS_RESET")
|
|
activity.AnimState = AAS_WAITING
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC MP_COMMON_DO_BEER_ACTIVITY_ANIMS(BOOL bIsActivePlayer, STRING sAnimDict, LOCAL_ACTIVITY_STRUCT &activity, PED_VARIATION_STRUCT &sVariationStruct, PED_COMP_NAME_ENUM &eReturnItem)
|
|
|
|
STRING sPedEnterAnim
|
|
STRING sBottleEnterAnim
|
|
|
|
sPedEnterAnim = "enter"
|
|
sBottleEnterAnim = "enter_bottle"
|
|
|
|
IF (DOES_ENTITY_EXIST(activity.piClone) and not IS_ENTITY_DEAD(activity.piClone))
|
|
AND (DOES_ENTITY_EXIST(activity.oiTrigger) and not IS_ENTITY_DEAD(activity.oiTrigger))
|
|
|
|
SWITCH activity.AnimState
|
|
|
|
CASE AAS_GET_TO_START
|
|
|
|
IF bIsActivePlayer
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
DISABLE_ALL_MP_HUD_THIS_FRAME()
|
|
ENDIF
|
|
|
|
// Remember what clothes ped is wearing
|
|
GET_PED_VARIATIONS(activity.piClone, sVariationStruct)
|
|
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(activity.piClone, activity.vTrigPos, PEDMOVEBLENDRATIO_WALK, 60000, DEFAULT_NAVMESH_RADIUS, ENAV_STOP_EXACTLY, activity.fTrigRot)
|
|
activity.AnimState = AAS_START
|
|
|
|
BREAK
|
|
|
|
|
|
CASE AAS_START
|
|
|
|
IF bIsActivePlayer
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
DISABLE_ALL_MP_HUD_THIS_FRAME()
|
|
ENDIF
|
|
|
|
IF GET_SCRIPT_TASK_STATUS(activity.piClone, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) <> WAITING_TO_START_TASK
|
|
AND GET_SCRIPT_TASK_STATUS(activity.piClone, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) = FINISHED_TASK
|
|
|
|
REMOVE_MASK(activity.piClone, eReturnItem)
|
|
|
|
activity.iSynchedScene = CREATE_SYNCHRONIZED_SCENE(activity.vScPos, activity.vScRot)
|
|
TASK_SYNCHRONIZED_SCENE(activity.piClone, activity.iSynchedScene, sAnimDict, sPedEnterAnim, NORMAL_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(activity.oiTrigger, activity.iSynchedScene, sBottleEnterAnim, sAnimDict, NORMAL_BLEND_IN, INSTANT_BLEND_OUT)
|
|
|
|
// Play scene
|
|
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Wine: TS_RUN_ANIM")
|
|
activity.AnimState = AAS_RUN_ANIM
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE AAS_RUN_ANIM
|
|
|
|
IF bIsActivePlayer
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
DISABLE_ALL_MP_HUD_THIS_FRAME()
|
|
ENDIF
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(activity.iSynchedScene) > 0.99
|
|
|
|
// Exit anim depends on peds drunk level...
|
|
activity.iSynchedScene = CREATE_SYNCHRONIZED_SCENE(activity.vScPos, activity.vScRot)
|
|
TASK_SYNCHRONIZED_SCENE(activity.piClone, activity.iSynchedScene, sAnimDict, GET_BEER_PED_EXIT_ANIM(activity.piClone), NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(activity.oiTrigger, activity.iSynchedScene, GET_BEER_BOTTLE_EXIT_ANIM(activity.piClone), sAnimDict, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
|
|
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Drinking: Enter anim finished - run exit anim")
|
|
activity.AnimState = AAS_RUN_EXIT_ANIM
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE AAS_RUN_EXIT_ANIM
|
|
|
|
IF bIsActivePlayer
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
DISABLE_ALL_MP_HUD_THIS_FRAME()
|
|
ENDIF
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(activity.iSynchedScene) > 0.99
|
|
|
|
RETURN_MASK(activity.piClone, sVariationStruct)
|
|
|
|
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Drinking: TS_RUN_EXIT_ANIM -> TS_RESET")
|
|
activity.AnimState = AAS_WAITING
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC MP_COMMON_DO_WHEATGRASS_ACTIVITY_ANIMS(BOOL bIsActivePlayer, STRING sAnimDict, LOCAL_ACTIVITY_STRUCT &activity, PED_VARIATION_STRUCT &sVariationStruct, PED_COMP_NAME_ENUM &eReturnItem)
|
|
|
|
STRING sPedEnterAnim, sGlassEnterAnim
|
|
|
|
sPedEnterAnim = "ig_2_wheatgrassdrink_michael"
|
|
sGlassEnterAnim = "ig_2_wheatgrassdrink_glass"
|
|
|
|
IF (DOES_ENTITY_EXIST(activity.piClone) and not IS_ENTITY_DEAD(activity.piClone))
|
|
AND (DOES_ENTITY_EXIST(activity.oiTrigger) and not IS_ENTITY_DEAD(activity.oiTrigger))
|
|
|
|
SWITCH activity.AnimState
|
|
|
|
CASE AAS_GET_TO_START
|
|
|
|
IF bIsActivePlayer
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
DISABLE_ALL_MP_HUD_THIS_FRAME()
|
|
ENDIF
|
|
|
|
// Remember what clothes ped is wearing.
|
|
GET_PED_VARIATIONS(activity.piClone, sVariationStruct)
|
|
|
|
//TASK_FOLLOW_NAV_MESH_TO_COORD(activity.piClone, activity.vTrigPos, PEDMOVEBLENDRATIO_WALK, 60000, DEFAULT_NAVMESH_RADIUS, ENAV_STOP_EXACTLY, activity.fTrigRot)
|
|
TASK_GO_STRAIGHT_TO_COORD(activity.piClone, activity.vTrigPos, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, activity.vScRot.z+90, 0.1)
|
|
//TASK_PED_SLIDE_TO_COORD_HDG_RATE(activity.piClone, activity.vTrigPos, activity.vScRot.z, 0.6, 270.0)
|
|
activity.AnimState = AAS_START
|
|
BREAK
|
|
|
|
CASE AAS_START
|
|
|
|
IF bIsActivePlayer
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
DISABLE_ALL_MP_HUD_THIS_FRAME()
|
|
ENDIF
|
|
|
|
IF GET_SCRIPT_TASK_STATUS(activity.piClone, SCRIPT_TASK_GO_STRAIGHT_TO_COORD) <> WAITING_TO_START_TASK
|
|
AND GET_SCRIPT_TASK_STATUS(activity.piClone, SCRIPT_TASK_GO_STRAIGHT_TO_COORD) = FINISHED_TASK
|
|
|
|
REMOVE_MASK(activity.piClone, eReturnItem)
|
|
|
|
activity.iSynchedScene = CREATE_SYNCHRONIZED_SCENE(activity.vScPos, activity.vScRot)
|
|
TASK_SYNCHRONIZED_SCENE(activity.piClone, activity.iSynchedScene, sAnimDict, sPedEnterAnim, REALLY_SLOW_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(activity.oiTrigger, activity.iSynchedScene, sGlassEnterAnim, sAnimDict, INSTANT_BLEND_IN, SLOW_BLEND_OUT)
|
|
|
|
// Play scene
|
|
activity.AnimState = AAS_RUN_ANIM
|
|
CPRINTLN(DEBUG_AMBIENT, "[SH] Wheatgrass TS_GRAB_PLAYER -> TS_RUN_ANIM")
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE AAS_RUN_ANIM
|
|
|
|
IF bIsActivePlayer
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
DISABLE_ALL_MP_HUD_THIS_FRAME()
|
|
ENDIF
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(activity.iSynchedScene) > 0.99
|
|
|
|
RETURN_MASK(activity.piClone, sVariationStruct)
|
|
|
|
CPRINTLN(DEBUG_AMBIENT, "[SH] Wheatgrass TS_RUN_ANIM -> TS_RESET")
|
|
|
|
activity.AnimState = AAS_WAITING
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC MP_COMMON_DO_BONG_ACTIVITY(BOOL bIsActivePlayer, STRING sAnimDict, LOCAL_ACTIVITY_STRUCT &activity, PED_VARIATION_STRUCT &sVariationStruct, PED_COMP_NAME_ENUM &eReturnItem)
|
|
|
|
STRING sPedAnim, sBongAnim, sLighterAnim
|
|
|
|
sPedAnim = "bong_FRA"
|
|
sBongAnim = "bong_bong"
|
|
sLighterAnim = "bong_lighter"
|
|
|
|
IF (DOES_ENTITY_EXIST(activity.piClone) and not IS_ENTITY_DEAD(activity.piClone))
|
|
AND (DOES_ENTITY_EXIST(activity.oiTrigger) and not IS_ENTITY_DEAD(activity.oiTrigger))
|
|
AND (DOES_ENTITY_EXIST(activity.oiSecondaryItem) and not IS_ENTITY_DEAD(activity.oiSecondaryItem))
|
|
SWITCH activity.AnimState
|
|
|
|
CASE AAS_GET_TO_START
|
|
|
|
IF bIsActivePlayer
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
DISABLE_ALL_MP_HUD_THIS_FRAME()
|
|
ENDIF
|
|
|
|
REQUEST_PTFX_ASSET()
|
|
|
|
//SET_ENTITY_COLLISION(activity.piClone, FALSE)
|
|
|
|
// Remember what clothes ped is wearing.
|
|
GET_PED_VARIATIONS(activity.piClone, sVariationStruct)
|
|
|
|
//TASK_FOLLOW_NAV_MESH_TO_COORD(activity.piClone, activity.vTrigPos, PEDMOVEBLENDRATIO_WALK, 60000, DEFAULT_NAVMESH_RADIUS, ENAV_STOP_EXACTLY, activity.fTrigRot)
|
|
TASK_GO_STRAIGHT_TO_COORD(activity.piClone, activity.vTrigPos, PEDMOVEBLENDRATIO_WALK, 5000, DEFAULT_NAVMESH_RADIUS, activity.fTrigRot)
|
|
|
|
activity.AnimState = AAS_START
|
|
|
|
BREAK
|
|
|
|
|
|
CASE AAS_START
|
|
|
|
IF bIsActivePlayer
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
DISABLE_ALL_MP_HUD_THIS_FRAME()
|
|
ENDIF
|
|
|
|
IF GET_SCRIPT_TASK_STATUS(activity.piClone, SCRIPT_TASK_GO_STRAIGHT_TO_COORD) <> WAITING_TO_START_TASK
|
|
AND GET_SCRIPT_TASK_STATUS(activity.piClone, SCRIPT_TASK_GO_STRAIGHT_TO_COORD) = FINISHED_TASK
|
|
|
|
//SET_ENTITY_COLLISION(activity.piClone, TRUE)
|
|
|
|
REMOVE_MASK(activity.piClone, eReturnItem)
|
|
|
|
activity.iSynchedScene = CREATE_SYNCHRONIZED_SCENE(activity.vScPos, activity.vScRot)
|
|
TASK_SYNCHRONIZED_SCENE(activity.piClone, activity.iSynchedScene, sAnimDict, sPedAnim, SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS|SYNCED_SCENE_DONT_INTERRUPT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(activity.oiTrigger, activity.iSynchedScene, sBongAnim, sAnimDict, SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(activity.oiSecondaryItem, activity.iSynchedScene, sLighterAnim, sAnimDict, SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT)
|
|
|
|
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: MP_TS_CHECK_SMOKE_ANIM")
|
|
activity.AnimState = AAS_RUN_ANIM
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE AAS_RUN_ANIM
|
|
|
|
IF bIsActivePlayer
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
DISABLE_ALL_MP_HUD_THIS_FRAME()
|
|
ENDIF
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(activity.iSynchedScene) < 0.95 AND HAS_PTFX_ASSET_LOADED()
|
|
|
|
// Lighter flame
|
|
IF activity.bLighterFlame = FALSE
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(activity.iSynchedScene) > 0.194
|
|
activity.ptfxLighter = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_sh_lighter_flame", activity.oiSecondaryItem, <<-0.005,0.0,0.05>>, <<0.0,0.0,0.0>>)
|
|
activity.bLighterFlame = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(activity.ptfxLighter)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(activity.iSynchedScene) > 0.438
|
|
STOP_PARTICLE_FX_LOOPED(activity.ptfxLighter)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// // Lighter sparks
|
|
IF activity.bLighterSparks = FALSE
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(activity.iSynchedScene) > 0.185
|
|
STOP_CURRENT_PLAYING_AMBIENT_SPEECH(PLAYER_PED_ID())
|
|
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_sh_lighter_sparks", activity.oiSecondaryItem, << 0.0, 0.0, 0.06 >>, << 0.0, 0.0, 0.0 >>)
|
|
activity.bLighterSparks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
//
|
|
// // Bong smoke fx
|
|
IF activity.bBongSmoke = FALSE
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(activity.iSynchedScene) > 0.440
|
|
START_PARTICLE_FX_NON_LOOPED_ON_PED_BONE("scr_sh_bong_smoke", activity.piClone, << -0.025, 0.13, 0.0 >>, <<0,0,0>>, BONETAG_HEAD)
|
|
activity.bBongSmoke = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Synchronised scene has finished
|
|
ELSE
|
|
CPRINTLN(DEBUG_AMBIENT, "[Safehouse] Bong: MP_TS_RESET")
|
|
RETURN_MASK(activity.piClone, sVariationStruct)
|
|
activity.AnimState = AAS_WAITING
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC MP_COMMON_DO_SHOWER_ACTIVITY(BOOL bIsActivePlayer, STRING sAnimDict, LOCAL_ACTIVITY_STRUCT &activity, INT iActivitySubStage, PED_VARIATION_STRUCT &sVariationStruct, PED_COMP_NAME_ENUM &eReturnItem)
|
|
|
|
STRING sEnterAnim, sEnterToIdle, sIdleToExit, sIdleAnimA, sIdleAnimB, sIdleAnimC
|
|
STRING sEnterAnimDoor, sExitAnimDoor
|
|
FLOAT fNakedPhase, fNonNakedPhase
|
|
|
|
IF ARE_STRINGS_EQUAL(sAnimDict, "mp_safehouseshower@male@")
|
|
sEnterAnim = "male_shower_undress_&_turn_on_water"
|
|
sEnterToIdle = "male_shower_enter_into_idle"
|
|
sIdleAnimA = "male_shower_idle_a"
|
|
sIdleAnimB = "male_shower_idle_b"
|
|
sIdleAnimC = "male_shower_idle_c"
|
|
sIdleToExit = "Male_Shower_Exit_To_Idle"
|
|
|
|
sEnterAnimDoor = "male_shower_undress_&_turn_on_water_door"
|
|
sExitAnimDoor = "Male_Shower_Exit_To_Idle_Door"
|
|
|
|
fNakedPhase = 0.5
|
|
fNonNakedPhase = 0.55
|
|
ELSE
|
|
sEnterAnim = "shower_undress_&_turn_on_water"
|
|
sEnterToIdle = "shower_enter_into_idle"
|
|
sIdleToExit = "shower_Exit_To_Idle"
|
|
sIdleAnimA = "shower_idle_a"
|
|
sIdleAnimB = "shower_idle_b"
|
|
sIdleAnimC = "shower_idle_a"
|
|
|
|
sEnterAnimDoor = "shower_undress_&_turn_on_water_door"
|
|
sExitAnimDoor = "shower_Exit_To_Idle_Door"
|
|
|
|
fNakedPhase = 0.5
|
|
fNonNakedPhase = 0.5
|
|
ENDIF
|
|
|
|
IF (DOES_ENTITY_EXIST(activity.piClone) and not IS_ENTITY_DEAD(activity.piClone))
|
|
AND (DOES_ENTITY_EXIST(activity.oiTrigger) and not IS_ENTITY_DEAD(activity.oiTrigger))
|
|
|
|
SWITCH activity.AnimState
|
|
|
|
CASE AAS_GET_TO_START
|
|
|
|
IF bIsActivePlayer
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
DISABLE_ALL_MP_HUD_THIS_FRAME()
|
|
ENDIF
|
|
|
|
// Close the bathroom door
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(activity.iLocalDoorHash, 0.0, FALSE, FALSE)
|
|
|
|
// Lock the bathroom door
|
|
DOOR_SYSTEM_SET_DOOR_STATE(activity.iLocalDoorHash, DOORSTATE_LOCKED, FALSE, TRUE)
|
|
|
|
// Remember what clothes ped is wearing.
|
|
GET_PED_VARIATIONS(activity.piClone, sVariationStruct)
|
|
|
|
activity.AnimState = AAS_START
|
|
BREAK
|
|
|
|
|
|
CASE AAS_START
|
|
|
|
IF bIsActivePlayer
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
DISABLE_ALL_MP_HUD_THIS_FRAME()
|
|
ENDIF
|
|
|
|
//IF GET_SCRIPT_TASK_STATUS(activity.piClone, SCRIPT_TASK_GO_STRAIGHT_TO_COORD) <> WAITING_TO_START_TASK
|
|
//AND GET_SCRIPT_TASK_STATUS(activity.piClone, SCRIPT_TASK_GO_STRAIGHT_TO_COORD) = FINISHED_TASK
|
|
|
|
activity.iSynchedScene = CREATE_SYNCHRONIZED_SCENE(activity.vScPos, activity.vScRot)
|
|
TASK_SYNCHRONIZED_SCENE(activity.piClone, activity.iSynchedScene, sAnimDict, sEnterAnim, REALLY_SLOW_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(activity.oiTrigger, activity.iSynchedScene, sEnterAnimDoor, sAnimDict, REALLY_SLOW_BLEND_IN, NORMAL_BLEND_OUT, ENUM_TO_INT(SYNCED_SCENE_USE_PHYSICS))
|
|
|
|
CPRINTLN(DEBUG_AMBIENT, "[SH SHOWER] - TS_CHECK_ENTRY_ANIM")
|
|
activity.AnimState = AAS_ENTRY_ANIM
|
|
|
|
//ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE AAS_ENTRY_ANIM
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(activity.iSynchedScene) > 0.99
|
|
|
|
CPRINTLN(DEBUG_AMBIENT, "[SH SHOWER] - TS_RUN_ENTER_TO_IDLE_ANIM")
|
|
activity.iSynchedScene = CREATE_SYNCHRONIZED_SCENE(activity.vScPos, activity.vScRot)
|
|
TASK_SYNCHRONIZED_SCENE(activity.piClone, activity.iSynchedScene, sAnimDict, sEnterToIdle, SLOW_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
|
|
|
|
CPRINTLN(DEBUG_AMBIENT, "[SH SHOWER] - TS_CHECK_ENTER_TO_IDLE_ANIM")
|
|
activity.AnimState = AAS_ENTRY_TO_RUN_ANIM
|
|
ELSE
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(activity.iSynchedScene) > fNakedPhase
|
|
|
|
IF GET_PED_DRAWABLE_VARIATION(activity.piClone, PED_COMP_JBIB) != 15
|
|
OR GET_PED_DRAWABLE_VARIATION(activity.piClone, PED_COMP_TORSO) != 15
|
|
OR GET_PED_DRAWABLE_VARIATION(activity.piClone, PED_COMP_SPECIAL) != 15
|
|
OR GET_PED_DRAWABLE_VARIATION(activity.piClone, PED_COMP_SPECIAL2) != 0
|
|
OR GET_PED_DRAWABLE_VARIATION(activity.piClone, PED_COMP_TEETH) != 0
|
|
OR GET_PED_DRAWABLE_VARIATION(activity.piClone, PED_COMP_HAND) != 0
|
|
OR GET_PED_DRAWABLE_VARIATION(activity.piClone, PED_COMP_FEET) != 5
|
|
OR (GET_PED_DRAWABLE_VARIATION(activity.piClone, PED_COMP_LEG) != 14 AND GET_ENTITY_MODEL(activity.piClone) = MP_M_FREEMODE_01)
|
|
OR (GET_PED_DRAWABLE_VARIATION(activity.piClone, PED_COMP_LEG) != 15 AND GET_ENTITY_MODEL(activity.piClone) != MP_M_FREEMODE_01)
|
|
|
|
CPRINTLN(DEBUG_AMBIENT, "[SH] shower - taking clothes off")
|
|
|
|
SET_PED_COMPONENT_VARIATION(activity.piClone, PED_COMP_JBIB, 15, 0)
|
|
|
|
IF GET_PED_DRAWABLE_VARIATION(activity.piClone, PED_COMP_TORSO) != 15
|
|
SET_PED_COMPONENT_VARIATION(activity.piClone, PED_COMP_TORSO, 15, 0)
|
|
ENDIF
|
|
|
|
SET_PED_COMPONENT_VARIATION(activity.piClone, PED_COMP_SPECIAL, 15, 0)
|
|
SET_PED_COMPONENT_VARIATION(activity.piClone, PED_COMP_SPECIAL2, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(activity.piClone, PED_COMP_TEETH, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(activity.piClone, PED_COMP_HAND, 0, 0)
|
|
|
|
IF GET_PED_DRAWABLE_VARIATION(activity.piClone, PED_COMP_FEET) != 5
|
|
SET_PED_COMPONENT_VARIATION(activity.piClone, PED_COMP_FEET, 5, 0)
|
|
ENDIF
|
|
|
|
SET_PED_COMPONENT_VARIATION(activity.piClone, PED_COMP_BERD, 0, 0) // Store the mask
|
|
|
|
IF IS_SAFE_TO_RESTORE_SAVED_HAIR_MP(activity.piClone, eReturnItem)
|
|
SET_PED_COMP_ITEM_CURRENT_MP(activity.piClone, COMP_TYPE_HAIR, eReturnItem, FALSE)
|
|
ENDIF
|
|
|
|
CLEAR_ALL_PED_PROPS(activity.piClone)
|
|
|
|
IF GET_ENTITY_MODEL(activity.piClone) = MP_M_FREEMODE_01
|
|
|
|
IF GET_PED_DRAWABLE_VARIATION(activity.piClone, PED_COMP_LEG) != 14
|
|
SET_PED_COMPONENT_VARIATION(activity.piClone, PED_COMP_LEG, 14, 0)
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF GET_PED_DRAWABLE_VARIATION(activity.piClone, PED_COMP_LEG) != 15
|
|
SET_PED_COMPONENT_VARIATION(activity.piClone, PED_COMP_LEG, 15, 0)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF HAS_PED_HEAD_BLEND_FINISHED(activity.piClone)
|
|
AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(activity.piClone)
|
|
FINALIZE_HEAD_BLEND(activity.piClone)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE AAS_ENTRY_TO_RUN_ANIM
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(activity.iSynchedScene) > 0.99
|
|
INT iChosenIdle
|
|
STRING sChosenIdle
|
|
|
|
iChosenIdle = GET_RANDOM_INT_IN_RANGE(0, 3)
|
|
IF iChosenIdle = 0
|
|
sChosenIdle = sIdleAnimA
|
|
ELIF iChosenIdle = 1
|
|
sChosenIdle = sIdleAnimB
|
|
ELSE
|
|
sChosenIdle = sIdleAnimC
|
|
ENDIF
|
|
|
|
activity.iSynchedScene = CREATE_SYNCHRONIZED_SCENE(activity.vScPos, activity.vScRot)
|
|
TASK_SYNCHRONIZED_SCENE(activity.piClone, activity.iSynchedScene, sAnimDict, sChosenIdle, SLOW_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
|
|
|
|
CPRINTLN(DEBUG_AMBIENT, "[SH SHOWER] - TS_CHECK_IDLE_ANIM")
|
|
activity.AnimState = AAS_RUN_ANIM
|
|
|
|
ELSE
|
|
|
|
IF iActivitySubStage = ci_APT_ACT_STATE_FINISHING
|
|
CPRINTLN(DEBUG_AMBIENT, "[SH SHOWER] - TS_RUN_EXIT_SHOWER_ANIM")
|
|
|
|
activity.iSynchedScene = CREATE_SYNCHRONIZED_SCENE(activity.vScPos, activity.vScRot)
|
|
TASK_SYNCHRONIZED_SCENE(activity.piClone, activity.iSynchedScene, sAnimDict, sIdleToExit, REALLY_SLOW_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(activity.oiTrigger, activity.iSynchedScene, sExitAnimDoor, sAnimDict, REALLY_SLOW_BLEND_IN, NORMAL_BLEND_OUT, ENUM_TO_INT(SYNCED_SCENE_USE_PHYSICS))
|
|
|
|
activity.AnimState = AAS_RUN_EXIT_ANIM
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE AAS_RUN_ANIM
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(activity.iSynchedScene) > 0.99
|
|
CPRINTLN(DEBUG_AMBIENT, "[SH SHOWER] - TS_CHOOSE_RANDOM_IDLE")
|
|
activity.AnimState = AAS_ENTRY_TO_RUN_ANIM
|
|
ENDIF
|
|
|
|
IF iActivitySubStage = ci_APT_ACT_STATE_FINISHING
|
|
|
|
CPRINTLN(DEBUG_AMBIENT, "[SH SHOWER] - TS_RUN_EXIT_SHOWER_ANIM")
|
|
|
|
activity.iSynchedScene = CREATE_SYNCHRONIZED_SCENE(activity.vScPos, activity.vScRot)
|
|
TASK_SYNCHRONIZED_SCENE(activity.piClone, activity.iSynchedScene, sAnimDict, sIdleToExit, REALLY_SLOW_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(activity.oiTrigger, activity.iSynchedScene, sExitAnimDoor, sAnimDict, REALLY_SLOW_BLEND_IN, SLOW_BLEND_OUT, ENUM_TO_INT(SYNCED_SCENE_USE_PHYSICS))
|
|
|
|
activity.AnimState = AAS_RUN_EXIT_ANIM
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE AAS_RUN_EXIT_ANIM
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(activity.iSynchedScene) > 0.99
|
|
|
|
// Unlock the bathroom door
|
|
DOOR_SYSTEM_SET_DOOR_STATE(activity.iLocalDoorHash, DOORSTATE_UNLOCKED, FALSE, TRUE)
|
|
|
|
activity.AnimState = AAS_WAITING
|
|
ELSE
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(activity.iSynchedScene) > fNonNakedPhase
|
|
// Put clothes back on
|
|
IF GET_PED_DRAWABLE_VARIATION(activity.piClone, PED_COMP_JBIB) = 15
|
|
AND GET_PED_DRAWABLE_VARIATION(activity.piClone, PED_COMP_TORSO) = 15
|
|
AND GET_PED_DRAWABLE_VARIATION(activity.piClone, PED_COMP_SPECIAL) = 15
|
|
AND GET_PED_DRAWABLE_VARIATION(activity.piClone, PED_COMP_SPECIAL2) = 0
|
|
AND GET_PED_DRAWABLE_VARIATION(activity.piClone, PED_COMP_TEETH) = 0
|
|
AND GET_PED_DRAWABLE_VARIATION(activity.piClone, PED_COMP_HAND) = 0
|
|
AND GET_PED_DRAWABLE_VARIATION(activity.piClone, PED_COMP_FEET) = 5
|
|
AND ((GET_PED_DRAWABLE_VARIATION(activity.piClone, PED_COMP_LEG) = 14 AND GET_ENTITY_MODEL(activity.piClone) = MP_M_FREEMODE_01)
|
|
OR (GET_PED_DRAWABLE_VARIATION(activity.piClone, PED_COMP_LEG) = 15 AND GET_ENTITY_MODEL(activity.piClone) != MP_M_FREEMODE_01))
|
|
|
|
SET_PED_VARIATIONS(activity.piClone, sVariationStruct)
|
|
|
|
IF HAS_PED_HEAD_BLEND_FINISHED(activity.piClone)
|
|
AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(activity.piClone)
|
|
FINALIZE_HEAD_BLEND(activity.piClone)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Get the correct idle anim based on how many shots the player has had.
|
|
FUNC STRING GET_MP_IDLE_ANIM_FOR_THIS_SHOT(INT iTimesUsed)
|
|
|
|
STRING sAnim
|
|
|
|
SWITCH iTimesUsed
|
|
CASE 0 sAnim = "first_shot_base" BREAK
|
|
CASE 1 sAnim = "first_shot_base" BREAK
|
|
CASE 2 sAnim = "second_shot_base" BREAK
|
|
CASE 3 sAnim = "third_shot_base" BREAK
|
|
CASE 4 sAnim = "fourth_shot_base" BREAK
|
|
DEFAULT sAnim = "fifth_shot_base" BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN sAnim
|
|
ENDFUNC
|
|
|
|
FUNC STRING GET_MP_SHOT_ANIM_FOR_THIS_SHOT(INT iTimesUsed)
|
|
|
|
STRING sAnim
|
|
|
|
SWITCH iTimesUsed
|
|
CASE 0 sAnim = "first_shot" BREAK
|
|
CASE 1 sAnim = "first_shot" BREAK
|
|
CASE 2 sAnim = "second_shot" BREAK
|
|
CASE 3 sAnim = "third_shot" BREAK
|
|
CASE 4 sAnim = "fourth_shot" BREAK
|
|
CASE 5 sAnim = "fifth_shot" BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN sAnim
|
|
ENDFUNC
|
|
|
|
FUNC STRING GET_MP_EXIT_ANIM_FOR_THIS_SHOT(PED_INDEX ped)
|
|
|
|
STRING sAnim
|
|
g_eDrunkLevel eDrunkLevel = Get_Peds_Drunk_Level(ped)
|
|
|
|
SWITCH eDrunkLevel
|
|
CASE DL_NO_LEVEL sAnim = "exit_sober" BREAK
|
|
CASE DL_moderatedrunk sAnim = "exit_moderately_drunk" BREAK
|
|
CASE DL_slightlydrunk sAnim = "exit_slightly_drunk" BREAK
|
|
CASE DL_verydrunk sAnim = "exit_drunk" BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN sAnim
|
|
ENDFUNC
|
|
|
|
FUNC STRING GET_MP_SHOT_ANIM_FOR_GLASS(INT iTimesUsed)
|
|
|
|
STRING sAnim
|
|
|
|
SWITCH iTimesUsed
|
|
CASE 0 sAnim = "first_shot_glass" BREAK
|
|
CASE 1 sAnim = "first_shot_glass" BREAK
|
|
CASE 2 sAnim = "second_shot_glass" BREAK
|
|
CASE 3 sAnim = "third_shot_glass" BREAK
|
|
CASE 4 sAnim = "fourth_shot_glass" BREAK
|
|
CASE 5 sAnim = "fifth_shot_glass" BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN sAnim
|
|
|
|
ENDFUNC
|
|
|
|
FUNC STRING GET_MP_SHOT_ANIM_FOR_BOTTLE(INT iTimesUsed)
|
|
|
|
STRING sAnim
|
|
|
|
SWITCH iTimesUsed
|
|
CASE 0 sAnim = "first_shot_bot" BREAK
|
|
CASE 1 sAnim = "first_shot_bot" BREAK
|
|
CASE 2 sAnim = "second_shot_bot" BREAK
|
|
CASE 3 sAnim = "third_shot_bot" BREAK
|
|
CASE 4 sAnim = "fourth_shot_bot" BREAK
|
|
CASE 5 sAnim = "fifth_shot_bot" BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN sAnim
|
|
ENDFUNC
|
|
|
|
FUNC STRING GET_MP_SHOT_EXIT_ANIM_FOR_GLASS(PED_INDEX ped)
|
|
|
|
STRING sAnim
|
|
g_eDrunkLevel eDrunkLevel = Get_Peds_Drunk_Level(ped)
|
|
|
|
SWITCH eDrunkLevel
|
|
CASE DL_NO_LEVEL sAnim = "exit_sober_glass" BREAK
|
|
CASE DL_moderatedrunk sAnim = "exit_sober_glass" BREAK
|
|
CASE DL_slightlydrunk sAnim = "exit_drunk_glass" BREAK
|
|
CASE DL_verydrunk sAnim = "exit_drunk_glass" BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN sAnim
|
|
ENDFUNC
|
|
|
|
FUNC STRING GET_MP_SHOT_EXIT_ANIM_FOR_BOTTLE(PED_INDEX ped)
|
|
|
|
STRING sAnim
|
|
g_eDrunkLevel eDrunkLevel = Get_Peds_Drunk_Level(ped)
|
|
|
|
SWITCH eDrunkLevel
|
|
CASE DL_NO_LEVEL sAnim = "exit_sober_bot" BREAK
|
|
CASE DL_moderatedrunk sAnim = "exit_moderately_drunk_bot" BREAK
|
|
CASE DL_slightlydrunk sAnim = "exit_slightly_drunk_bot" BREAK
|
|
CASE DL_verydrunk sAnim = "exit_drunk_bot" BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN sAnim
|
|
ENDFUNC
|
|
|
|
FUNC STRING GET_MP_SHOT_IDLE_ANIM_FOR_BOTTLE(INT iTimesUsed)
|
|
|
|
STRING sAnim
|
|
|
|
SWITCH (iTimesUsed)
|
|
CASE 0 sAnim = "first_shot_base_bot" BREAK
|
|
CASE 1 sAnim = "second_shot_base_bot" BREAK
|
|
CASE 2 sAnim = "third_shot_base_bot" BREAK
|
|
CASE 3 sAnim = "fourth_shot_base_bot" BREAK
|
|
DEFAULT sAnim = "fifth_shot_base_bot" BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN sAnim
|
|
ENDFUNC
|
|
|
|
FUNC STRING GET_MP_SHOT_IDLE_ANIM_FOR_GLASS(INT iTimesUsed)
|
|
|
|
STRING sAnim
|
|
|
|
SWITCH (iTimesUsed)
|
|
CASE 0 sAnim = "first_shot_base_glass" BREAK
|
|
CASE 1 sAnim = "second_shot_base_glass" BREAK
|
|
CASE 2 sAnim = "third_shot_base_glass" BREAK
|
|
CASE 3 sAnim = "fourth_shot_base_glass" BREAK
|
|
DEFAULT sAnim = "fifth_shot_base_glass" BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN sAnim
|
|
ENDFUNC
|
|
|
|
PROC MP_COMMON_DO_SHOTS_ACTIVITY(BOOL bIsActivePlayer, STRING sAnimDict, LOCAL_ACTIVITY_STRUCT &activity, INT iActivitySubStage, PED_VARIATION_STRUCT &sVariationStruct, INT &iCloneShotNum)
|
|
|
|
INT iTimesUsed = iActivitySubStage - 3
|
|
|
|
IF iTimesUsed < 0
|
|
iTimesUsed = 0
|
|
ENDIF
|
|
|
|
// CPRINTLN(DEBUG_AMBIENT, "[CLONE] iActivitySubStage = ", iActivitySubStage)
|
|
// CPRINTLN(DEBUG_AMBIENT, "[CLONE] iTimesUsed = ", iTimesUsed)
|
|
|
|
STRING sPedEnterAnim
|
|
STRING sGlassEnterAnim
|
|
STRING sBottleEnterAnim
|
|
|
|
sPedEnterAnim = "enter"
|
|
sGlassEnterAnim = "enter_glass"
|
|
sBottleEnterAnim = "enter_bot"
|
|
|
|
IF (DOES_ENTITY_EXIST(activity.piClone) and not IS_ENTITY_DEAD(activity.piClone))
|
|
AND (DOES_ENTITY_EXIST(activity.oiTrigger) and not IS_ENTITY_DEAD(activity.oiTrigger))
|
|
AND (DOES_ENTITY_EXIST(activity.oiSecondaryItem) and not IS_ENTITY_DEAD(activity.oiSecondaryItem))
|
|
SWITCH activity.AnimState
|
|
|
|
CASE AAS_GET_TO_START
|
|
|
|
IF bIsActivePlayer
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
DISABLE_ALL_MP_HUD_THIS_FRAME()
|
|
ENDIF
|
|
|
|
// Remember what clothes ped is wearing.
|
|
GET_PED_VARIATIONS(activity.piClone, sVariationStruct)
|
|
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(activity.piClone, activity.vTrigPos, PEDMOVEBLENDRATIO_WALK, 60000, DEFAULT_NAVMESH_RADIUS, ENAV_STOP_EXACTLY, activity.fTrigRot)
|
|
activity.AnimState = AAS_START
|
|
|
|
BREAK
|
|
|
|
CASE AAS_START
|
|
|
|
IF bIsActivePlayer
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
DISABLE_ALL_MP_HUD_THIS_FRAME()
|
|
ENDIF
|
|
|
|
IF GET_SCRIPT_TASK_STATUS(activity.piClone, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) <> WAITING_TO_START_TASK
|
|
AND GET_SCRIPT_TASK_STATUS(activity.piClone, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) = FINISHED_TASK
|
|
|
|
activity.iSynchedScene = CREATE_SYNCHRONIZED_SCENE(activity.vScPos, activity.vScRot)
|
|
|
|
// Apply drinking anims to player and glass
|
|
TASK_SYNCHRONIZED_SCENE(activity.piClone, activity.iSynchedScene, sAnimDict, sPedEnterAnim, SLOW_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(activity.oiTrigger, activity.iSynchedScene, sGlassEnterAnim, sAnimDict, SLOW_BLEND_IN, NORMAL_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(activity.oiSecondaryItem, activity.iSynchedScene, sBottleEnterAnim, sAnimDict, SLOW_BLEND_IN, NORMAL_BLEND_OUT)
|
|
|
|
CPRINTLN(DEBUG_AMBIENT, "[CLONE] TS_WAIT_FOR_MORE_INPUT")
|
|
activity.AnimState = AAS_ENTRY_ANIM
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE AAS_ENTRY_ANIM
|
|
|
|
// Apply the idle if we're not already playing it...
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(activity.iSynchedScene) > 0.99
|
|
|
|
CPRINTLN(DEBUG_AMBIENT, "[CLONE] ANIM FINISHED, APPLY THE IDLE AND WAIT FOR MORE INPUT")
|
|
activity.iSynchedScene = CREATE_SYNCHRONIZED_SCENE(activity.vScPos, activity.vScRot)
|
|
|
|
// Apply looped idle anims to player and props
|
|
TASK_SYNCHRONIZED_SCENE(activity.piClone, activity.iSynchedScene, sAnimDict, GET_MP_IDLE_ANIM_FOR_THIS_SHOT(iTimesUsed), SLOW_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_LOOP_WITHIN_SCENE | SYNCED_SCENE_USE_PHYSICS)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(activity.oiTrigger, activity.iSynchedScene, GET_MP_SHOT_IDLE_ANIM_FOR_GLASS(iTimesUsed), sAnimDict, SLOW_BLEND_IN, NORMAL_BLEND_OUT, ENUM_TO_INT(SYNCED_SCENE_LOOP_WITHIN_SCENE))
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(activity.oiSecondaryItem, activity.iSynchedScene, GET_MP_SHOT_IDLE_ANIM_FOR_BOTTLE(iTimesUsed), sAnimDict, SLOW_BLEND_IN, NORMAL_BLEND_OUT, ENUM_TO_INT(SYNCED_SCENE_LOOP_WITHIN_SCENE))
|
|
iCloneShotNum = iTimesUsed
|
|
|
|
CPRINTLN(DEBUG_AMBIENT, "[CLONE] PLAY IDLE NUMBER ", iTimesUsed)
|
|
activity.AnimState = AAS_CHOOSE_RANDOM_IDLE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE AAS_CHOOSE_RANDOM_IDLE
|
|
|
|
// IF GET_SYNCHRONIZED_SCENE_PHASE(activity.iSynchedScene) > 0.99
|
|
// activity.AnimState = AAS_ENTRY_ANIM
|
|
// ENDIF
|
|
|
|
IF iActivitySubStage = ci_APT_ACT_STATE_FINISHING
|
|
activity.AnimState = AAS_ENTRY_TO_EXIT_ANIM
|
|
|
|
ELIF iCloneShotNum != iTimesUsed
|
|
activity.iSynchedScene = CREATE_SYNCHRONIZED_SCENE(activity.vScPos, activity.vScRot)
|
|
TASK_SYNCHRONIZED_SCENE(activity.piClone, activity.iSynchedScene, sAnimDict, GET_MP_SHOT_ANIM_FOR_THIS_SHOT(iTimesUsed), SLOW_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(activity.oiTrigger, activity.iSynchedScene, GET_MP_SHOT_ANIM_FOR_GLASS(iTimesUsed), sAnimDict, SLOW_BLEND_IN, SLOW_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(activity.oiSecondaryItem, activity.iSynchedScene, GET_MP_SHOT_ANIM_FOR_BOTTLE(iTimesUsed), sAnimDict, SLOW_BLEND_IN, SLOW_BLEND_OUT)
|
|
|
|
CPRINTLN(DEBUG_AMBIENT, "[CLONE] PLAY SHOT NUMBER ", iTimesUsed)
|
|
iCloneShotNum = iTimesUsed
|
|
activity.AnimState = AAS_ENTRY_ANIM
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE AAS_ENTRY_TO_EXIT_ANIM
|
|
|
|
activity.iSynchedScene = CREATE_SYNCHRONIZED_SCENE(activity.vScPos, activity.vScRot)
|
|
TASK_SYNCHRONIZED_SCENE(activity.piClone, activity.iSynchedScene, sAnimDict, GET_MP_EXIT_ANIM_FOR_THIS_SHOT(activity.pedIndex), SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(activity.oiTrigger, activity.iSynchedScene, GET_MP_SHOT_EXIT_ANIM_FOR_GLASS(activity.pedIndex), sAnimDict, NORMAL_BLEND_IN, REALLY_SLOW_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(activity.oiSecondaryItem, activity.iSynchedScene, GET_MP_SHOT_EXIT_ANIM_FOR_BOTTLE(activity.pedIndex), sAnimDict, NORMAL_BLEND_IN, REALLY_SLOW_BLEND_OUT)
|
|
|
|
activity.AnimState = AAS_RUN_EXIT_ANIM
|
|
|
|
BREAK
|
|
|
|
CASE AAS_RUN_EXIT_ANIM
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(activity.iSynchedScene) > 0.99
|
|
|
|
activity.AnimState = AAS_WAITING
|
|
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC ANIMATE_LOCAL_SYNC_SCENE(BOOL bIsActivePlayer, INT iActivity, LOCAL_ACTIVITY_STRUCT &activity, INT iActivitySubStage, PED_VARIATION_STRUCT &sVariationStruct, INT &iCloneShotNum, PED_COMP_NAME_ENUM &eReturnItem)
|
|
SWITCH iActivity
|
|
CASE ci_APT_ACT_WINE
|
|
MP_COMMON_DO_WINE_ACTIVITY_ANIMS(bIsActivePlayer, "MP_SAFEHOUSEWINE@", activity, sVariationStruct, eReturnItem)
|
|
BREAK
|
|
CASE ci_APT_ACT_WHEATGRASS
|
|
MP_COMMON_DO_WHEATGRASS_ACTIVITY_ANIMS(bIsActivePlayer, "mp_safehousewheatgrass@", activity, sVariationStruct, eReturnItem)
|
|
BREAK
|
|
CASE ci_APT_ACT_BONG
|
|
MP_COMMON_DO_BONG_ACTIVITY(bIsActivePlayer, "mp_safehousebong@", activity, sVariationStruct, eReturnItem)
|
|
BREAK
|
|
CASE ci_APT_ACT_BEER
|
|
MP_COMMON_DO_BEER_ACTIVITY_ANIMS(bIsActivePlayer, "MP_SAFEHOUSEBEER@", activity, sVariationStruct, eReturnItem)
|
|
BREAK
|
|
|
|
// COMPLICATED ONES....
|
|
CASE ci_APT_ACT_SHOWER
|
|
IF GET_ENTITY_MODEL(activity.piClone) = MP_M_FREEMODE_01
|
|
MP_COMMON_DO_SHOWER_ACTIVITY(bIsActivePlayer, "mp_safehouseshower@male@", activity, iActivitySubStage, sVariationStruct, eReturnItem)
|
|
ELSE
|
|
MP_COMMON_DO_SHOWER_ACTIVITY(bIsActivePlayer, "mp_safehouseshower@female@", activity, iActivitySubStage, sVariationStruct, eReturnItem)
|
|
ENDIF
|
|
BREAK
|
|
CASE ci_APT_ACT_SHOTS
|
|
MP_COMMON_DO_SHOTS_ACTIVITY(bIsActivePlayer, "MP_SAFEHOUSEWHISKEY@", activity, iActivitySubStage, sVariationStruct, iCloneShotNum)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|