/// File: common_sex.sch /// Original Author: John R. Diaz /// Putting all sex anims in here for reusability USING "commands_entity.sch" USING "commands_ped.sch" USING "net_interactions_public.sch" CONST_INT ALLOW_ALL_CARS 0 CAM_VIEW_MODE ExitViewMode ENUM SEX_SYNCH_SCENE_ORIGIN SEX_ORIGIN_DRIVER_SEAT = 0, SEX_ORIGIN_PASSENGER_SEAT, SEX_ORIGIN_PROP_LOOP ENDENUM ENUM SEX_STATE_ENUM SEX_PROP_TO_ACTION_P1 = 0, SEX_PROP_TO_ACTION_P2, SEX_ACTION_LOOP, //Performing BJ or Having Sex SEX_ACTION_TO_PROP_P1, //Money Shot SEX_ACTION_TO_PROP_P2, SEX_PROP_LOOP, SEX_SERVICE_COMPLETE ENDENUM ENUM ANIM_NAME_VEHICLE_LOW //Propositions ANVL_PROP_INTRO_M = 0, ANVL_PROP_INTRO_F, ANVL_PROP_LOOP_M, ANVL_PROP_LOOP_F, ANVL_PROP_OUTRO_M, ANVL_PROP_OUTRO_F, ANVL_PROP_TO_SIT_M, ANVL_PROP_TO_SIT_F, //Sex ANVL_PROP_2_SEX_P1_F, ANVL_PROP_2_SEX_P2_F, ANVL_SEX_LOOP_F, ANVL_SEX_2_PROP_P1_F, ANVL_SEX_2_PROP_P2_F, ANVL_PROP_2_SEX_P1_M, ANVL_PROP_2_SEX_P2_M, ANVL_SEX_LOOP_M, ANVL_SEX_2_PROP_P1_M, ANVL_SEX_2_PROP_P2_M, //BJ ANVL_PROP_2_BJ_P1_F, ANVL_PROP_2_BJ_P2_F, ANVL_BJ_LOOP_F, ANVL_BJ_2_PROP_P1_F, ANVL_BJ_2_PROP_P2_F, ANVL_PROP_2_BJ_P1_M, ANVL_PROP_2_BJ_P2_M, ANVL_BJ_LOOP_M, ANVL_BJ_2_PROP_P1_M, ANVL_BJ_2_PROP_P2_M, ANVL_TOTAL ENDENUM FUNC STRING GET_CLIP_SET_FOR_FEMALES_TO_ENTER_LOW_VEHICLES() RETURN "clipset@veh@low@ps@female@base" ENDFUNC FUNC STRING GET_ANIM_DICT_FOR_SEX_IN_LOW_VEHICLES() return "mini@prostitutes@sexlow_veh" ENDFUNC FUNC STRING GET_ANIM_DICT_FOR_SEX_IN_LOW_VEHICLES_FIRST_PERSON() return "mini@prostitutes@sexlow_veh_first_person" //return "mini@prostitutes@sexlow_veh" ENDFUNC FUNC STRING GET_SEX_STATE_INDEX_NAME(SEX_STATE_ENUM eThisState) STRING sStateName SWITCH eThisState CASE SEX_PROP_TO_ACTION_P1 sStateName = "Init" BREAK CASE SEX_PROP_TO_ACTION_P2 sStateName = "Exit Pass Seat" BREAK CASE SEX_ACTION_LOOP sStateName = "Entering Driver Seat" BREAK CASE SEX_ACTION_TO_PROP_P1 sStateName = "Sex" BREAK CASE SEX_ACTION_TO_PROP_P2 sStateName = "Exiting Driver Seat" BREAK CASE SEX_PROP_LOOP sStateName = "Entering Pass Seat" BREAK CASE SEX_SERVICE_COMPLETE sStateName = "Complete" BREAK DEFAULT sStateName = "-" BREAK ENDSWITCH RETURN sStateName ENDFUNC FUNC STRING GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANIM_NAME_VEHICLE_LOW eSexAnim) STRING sAnimName SWITCH eSexAnim //PROPOSITION - Prostitute asks the male what he wants to do //Low Car Proposition - NEW CASE ANVL_PROP_INTRO_M sAnimName = "low_car_sit_to_prop_player" BREAK CASE ANVL_PROP_INTRO_F sAnimName = "low_car_sit_to_prop_female" BREAK CASE ANVL_PROP_LOOP_M sAnimName = "low_car_prop_loop_player" BREAK CASE ANVL_PROP_LOOP_F sAnimName = "low_car_prop_loop_female" BREAK CASE ANVL_PROP_OUTRO_M sAnimName = "low_car_prop_to_leave_player" BREAK CASE ANVL_PROP_OUTRO_F sAnimName = "low_car_prop_to_sit_alt_female" BREAK CASE ANVL_PROP_TO_SIT_M sAnimName = "low_car_prop_to_sit_player" BREAK CASE ANVL_PROP_TO_SIT_F sAnimName = "low_car_prop_to_sit_female" BREAK //Sex===================================================================== CASE ANVL_PROP_2_SEX_P1_F sAnimName = "low_car_prop_to_sex_p1_female" BREAK CASE ANVL_PROP_2_SEX_P2_F sAnimName = "low_car_prop_to_sex_p2_female" BREAK CASE ANVL_SEX_LOOP_F sAnimName = "low_car_sex_loop_female" BREAK CASE ANVL_SEX_2_PROP_P1_F sAnimName = "low_car_sex_to_prop_p1_female" BREAK CASE ANVL_SEX_2_PROP_P2_F sAnimName = "low_car_sex_to_prop_p2_female" BREAK CASE ANVL_PROP_2_SEX_P1_M sAnimName = "low_car_prop_to_sex_p1_player" BREAK CASE ANVL_PROP_2_SEX_P2_M sAnimName = "low_car_prop_to_sex_p2_player" BREAK CASE ANVL_SEX_LOOP_M sAnimName = "low_car_sex_loop_player" BREAK CASE ANVL_SEX_2_PROP_P1_M sAnimName = "low_car_sex_to_prop_p1_player" BREAK CASE ANVL_SEX_2_PROP_P2_M sAnimName = "low_car_sex_to_prop_p2_player" BREAK //BJs==================================================================== CASE ANVL_PROP_2_BJ_P1_F sAnimName = "low_car_prop_to_bj_p1_female" BREAK CASE ANVL_PROP_2_BJ_P2_F sAnimName = "low_car_prop_to_bj_p2_female" BREAK CASE ANVL_BJ_LOOP_F sAnimName = "low_car_bj_loop_female" BREAK CASE ANVL_BJ_2_PROP_P1_F sAnimName = "low_car_bj_to_prop_p1_female" BREAK CASE ANVL_BJ_2_PROP_P2_F sAnimName = "low_car_bj_to_prop_p2_female" BREAK CASE ANVL_PROP_2_BJ_P1_M sAnimName = "low_car_prop_to_bj_p1_player" BREAK CASE ANVL_PROP_2_BJ_P2_M sAnimName = "low_car_prop_to_bj_p2_player" BREAK CASE ANVL_BJ_LOOP_M sAnimName = "low_car_bj_loop_player" BREAK CASE ANVL_BJ_2_PROP_P1_M sAnimName = "low_car_bj_to_prop_p1_player" BREAK CASE ANVL_BJ_2_PROP_P2_M sAnimName = "low_car_bj_to_prop_p2_player" BREAK DEFAULT sAnimName = "" BREAK ENDSWITCH RETURN sAnimName ENDFUNC ENUM ANIM_NAME_VEHICLE_NORM //PROPOSITION--------------------------------------- ANVN_PROP_INTRO_M = 0, ANVN_PROP_INTRO_F, ANVN_PROP_LOOP_M, ANVN_PROP_LOOP_F, ANVN_PROP_OUTRO_M, ANVN_PROP_OUTRO_F, ANVN_PROP_TO_SIT_M, ANVN_PROP_TO_SIT_F, //SEX---------------------------------------------- ANVN_PROP_2_SEX_P1_F, ANVN_PROP_2_SEX_P2_F, ANVN_SEX_LOOP_F, ANVN_SEX_2_PROP_P1_F, ANVN_SEX_2_PROP_P2_F, ANVN_PROP_2_SEX_P1_M, ANVN_PROP_2_SEX_P2_M, ANVN_SEX_LOOP_M, ANVN_SEX_2_PROP_P1_M, ANVN_SEX_2_PROP_P2_M, //BJ----------------------------------------------- ANVN_PROP_2_BJ_P1_F, ANVN_PROP_2_BJ_P2_F, ANVN_BJ_LOOP_F, ANVN_BJ_2_PROP_P1_F, ANVN_BJ_2_PROP_P2_F, ANVN_PROP_2_BJ_P1_M, ANVN_PROP_2_BJ_P2_M, ANVN_BJ_LOOP_M, ANVN_BJ_2_PROP_P1_M, ANVN_BJ_2_PROP_P2_M, ANVN_NUM_TOTAL ENDENUM FUNC STRING GET_ANIM_DICT_FOR_SEX_IN_NORM_VEHICLES() return "mini@prostitutes@sexnorm_veh" ENDFUNC FUNC STRING GET_ANIM_DICT_FOR_SEX_IN_NORM_VEHICLES_FIRST_PERSON() return "mini@prostitutes@sexnorm_veh_first_person" //return "mini@prostitutes@sexnorm_veh" ENDFUNC FUNC STRING GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANIM_NAME_VEHICLE_NORM eSexAnim) STRING sAnimName SWITCH eSexAnim //PROPOSITION - Prostitute asks the male what he wants to do CASE ANVN_PROP_INTRO_M sAnimName = "into_proposition_male" BREAK CASE ANVN_PROP_INTRO_F sAnimName = "into_proposition_prostitute" BREAK CASE ANVN_PROP_LOOP_M sAnimName = "proposition_loop_male" BREAK CASE ANVN_PROP_LOOP_F sAnimName = "proposition_loop_prostitute" BREAK CASE ANVN_PROP_OUTRO_M sAnimName = "proposition_to_exit_male" BREAK CASE ANVN_PROP_OUTRO_F sAnimName = "prop_to_sit_alt_prostitute" BREAK CASE ANVN_PROP_TO_SIT_M sAnimName = "prop_to_sit_male" BREAK CASE ANVN_PROP_TO_SIT_F sAnimName = "prop_to_sit_prostitute" BREAK //Sex===================================================================== //Norm Car Variations - CASE ANVN_PROP_2_SEX_P1_F sAnimName = "proposition_to_sex_p1_prostitute" BREAK CASE ANVN_PROP_2_SEX_P2_F sAnimName = "proposition_to_sex_p2_prostitute" BREAK CASE ANVN_SEX_LOOP_F sAnimName = "sex_loop_prostitute" BREAK CASE ANVN_SEX_2_PROP_P1_F sAnimName = "sex_to_proposition_p1_prostitute" BREAK CASE ANVN_SEX_2_PROP_P2_F sAnimName = "sex_to_proposition_p2_prostitute" BREAK CASE ANVN_PROP_2_SEX_P1_M sAnimName = "proposition_to_sex_p1_male" BREAK CASE ANVN_PROP_2_SEX_P2_M sAnimName = "proposition_to_sex_p2_male" BREAK CASE ANVN_SEX_LOOP_M sAnimName = "sex_loop_male" BREAK CASE ANVN_SEX_2_PROP_P1_M sAnimName = "sex_to_proposition_p1_male" BREAK CASE ANVN_SEX_2_PROP_P2_M sAnimName = "sex_to_proposition_p2_male" BREAK //BJs==================================================================== CASE ANVN_PROP_2_BJ_P1_F sAnimName = "proposition_to_BJ_p1_prostitute" BREAK CASE ANVN_PROP_2_BJ_P2_F sAnimName = "proposition_to_BJ_p2_prostitute" BREAK CASE ANVN_BJ_LOOP_F sAnimName = "BJ_loop_prostitute" BREAK CASE ANVN_BJ_2_PROP_P1_F sAnimName = "BJ_to_proposition_p1_prostitute" BREAK CASE ANVN_BJ_2_PROP_P2_F sAnimName = "BJ_to_proposition_p2_prostitute" BREAK CASE ANVN_PROP_2_BJ_P1_M sAnimName = "proposition_to_BJ_p1_male" BREAK CASE ANVN_PROP_2_BJ_P2_M sAnimName = "proposition_to_BJ_p2_male" BREAK CASE ANVN_BJ_LOOP_M sAnimName = "BJ_loop_male" BREAK CASE ANVN_BJ_2_PROP_P1_M sAnimName = "BJ_to_proposition_p1_male" BREAK CASE ANVN_BJ_2_PROP_P2_M sAnimName = "BJ_to_proposition_p2_male" BREAK DEFAULT sAnimName = "" BREAK ENDSWITCH RETURN sAnimName ENDFUNC ENUM ANIM_NAME_PROSTITUTE_IDLES AN_PRO_I_INTRO = 0, AN_PRO_I_IDLE_A, AN_PRO_I_IDLE_B, AN_PRO_I_IDLE_C, AN_PRO_I_IDLE_WAIT, AN_PRO_I_REJECT, AN_PRO_I_REJECT_2_IDLE, AN_PRO_I_REJECT_OUTRO, AN_PRO_I_REJECT_LOOP_A, AN_PRO_I_REJECT_LOOP_B, AN_PRO_I_REJECT_LOOP_C, AN_PRO_I_OUTRO ENDENUM FUNC STRING GET_ANIM_NAME_FOR_PROSTITUTE_IDLES(ANIM_NAME_PROSTITUTE_IDLES eProsAnim) SWITCH eProsAnim CASE AN_PRO_I_INTRO RETURN "idle_intro" BREAK CASE AN_PRO_I_IDLE_A RETURN "idle_a" BREAK CASE AN_PRO_I_IDLE_B RETURN "idle_b" BREAK CASE AN_PRO_I_IDLE_C RETURN "idle_c" BREAK // CASE AN_PRO_I_IDLE_D // RETURN "idle_d" // BREAK CASE AN_PRO_I_IDLE_WAIT RETURN "idle_wait" BREAK CASE AN_PRO_I_REJECT RETURN "idle_reject" BREAK CASE AN_PRO_I_REJECT_LOOP_A RETURN "idle_reject_loop_a" BREAK CASE AN_PRO_I_REJECT_LOOP_B RETURN "idle_reject_loop_b" BREAK CASE AN_PRO_I_REJECT_LOOP_C RETURN "idle_reject_loop_c" BREAK CASE AN_PRO_I_OUTRO RETURN "idle_outro" BREAK CASE AN_PRO_I_REJECT_2_IDLE RETURN "reject_2_idle" BREAK CASE AN_PRO_I_REJECT_OUTRO RETURN "reject_outro" BREAK ENDSWITCH RETURN "" ENDFUNC ENUM PROSTITUTE_PIMP_ANIM PROSTITUTE_PIMP_MAIN = 0, PROSTITUTE_PIMP_HOOKER, PROSTTITUE_PIMP_CASH ENDENUM FUNC STRING GET_PROSTITUTE_PIMP_ANIM_DICT() RETURN "mini@prostitutespimp_demands_money" ENDFUNC FUNC STRING GET_PROSTITUTE_PIMP_ANIM_TO_PLAY(PROSTITUTE_PIMP_ANIM eProsAnim) SWITCH eProsAnim CASE PROSTITUTE_PIMP_MAIN RETURN "pimp_demands_money_pimp" BREAK CASE PROSTITUTE_PIMP_HOOKER RETURN "pimp_demands_money_hooker" BREAK CASE PROSTTITUE_PIMP_CASH RETURN "pimp_demands_money_cash" BREAK ENDSWITCH RETURN "" ENDFUNC FUNC BOOL IS_VEHICLE_MODEL_SUITABLE_FOR_SEX(MODEL_NAMES this_VEHICLE_model, BOOL bExcludeLawVehicles = FALSE) #IF ALLOW_ALL_CARS RETURN TRUE #ENDIF IF IS_THIS_MODEL_A_BOAT (this_VEHICLE_model) OR IS_THIS_MODEL_A_PLANE (this_VEHICLE_model) OR IS_THIS_MODEL_A_HELI (this_VEHICLE_model) OR IS_THIS_MODEL_A_TRAIN (this_VEHICLE_model) OR IS_THIS_MODEL_A_BIKE (this_VEHICLE_model) RETURN FALSE ENDIF IF IS_MODEL_POLICE_VEHICLE(this_VEHICLE_model) RETURN FALSE ENDIF IF NOT bExcludeLawVehicles IF this_VEHICLE_model = POLICE OR this_VEHICLE_model = POLICE2 OR this_VEHICLE_model = POLICE3 OR this_VEHICLE_model = POLICE4 OR this_VEHICLE_model = FBI OR this_VEHICLE_model = FBI2 OR this_VEHICLE_model = CADDY OR this_VEHICLE_model = CADDY2 RETURN FALSE ENDIF ENDIF //Vehicles that are too cramped IF this_VEHICLE_model = ISSI2 OR this_VEHICLE_model = HOTKNIFE OR this_VEHICLE_model = JB700 OR ENUM_TO_INT(this_VEHICLE_model) = HASH("jester") OR ENUM_TO_INT(this_VEHICLE_model) = HASH("jester2") OR this_VEHICLE_model = STROMBERG OR this_VEHICLE_model = BARRAGE OR ENUM_TO_INT(this_VEHICLE_model) = HASH("kamacho") //mpAssault OR this_VEHICLE_model = GB200 OR this_VEHICLE_model = FAGALOA OR this_VEHICLE_model = TEZERACT //mpBattle OR this_VEHICLE_model = SWINGER //mpArena_Wars OR ENUM_TO_INT(this_VEHICLE_model) = HASH("imperator") //mpVinewood OR this_VEHICLE_model = LOCUST OR this_VEHICLE_model = SCHLAGEN OR this_VEHICLE_model = OUTLAW //mpFixer OR this_VEHICLE_model = COMET7 OR this_VEHICLE_model = YOUGA4 //mpSum2 OR this_VEHICLE_model = SM722 RETURN FALSE ENDIF RETURN TRUE ENDFUNC FUNC BOOL IS_VEHICLE_LAYOUT_VALID_FOR_SEX(VEHICLE_INDEX vehicle) #IF ALLOW_ALL_CARS RETURN TRUE #ENDIF IF IS_VEHICLE_DRIVEABLE(vehicle) IF GET_NUM_MOD_KITS(vehicle) > 0 INT i MOD_TYPE eMod INT iLabelHash TEXT_LABEL_15 tlModLabel REPEAT MAX_VEHICLE_MOD_SLOTS i eMod = INT_TO_ENUM(MOD_TYPE, i) // Toggle mods IF eMod <> MOD_TOGGLE_NITROUS AND eMod <> MOD_TOGGLE_TURBO AND eMod <> MOD_TOGGLE_SUBWOOFER AND eMod <> MOD_TOGGLE_TYRE_SMOKE AND eMod <> MOD_TOGGLE_HYDRAULICS AND eMod <> MOD_TOGGLE_XENON_LIGHTS IF GET_VEHICLE_MOD(vehicle, eMod) != -1 tlModLabel = GET_MOD_TEXT_LABEL(vehicle, eMod, GET_VEHICLE_MOD(vehicle, eMod)) iLabelHash = GET_HASH_KEY(tlModLabel) IF iLabelHash != 0 IF iLabelHash = GET_HASH_KEY("SABRE_CAG") RETURN FALSE ENDIF ENDIF ENDIF ENDIF ENDREPEAT ENDIF SWITCH GET_ENTITY_MODEL(vehicle) CASE PEYOTE2 IF !IS_VEHICLE_EXTRA_TURNED_ON(vehicle, 2) AND !IS_VEHICLE_EXTRA_TURNED_ON(vehicle, 3) AND !IS_VEHICLE_EXTRA_TURNED_ON(vehicle, 4) RETURN FALSE ENDIF BREAK CASE PEYOTE3 IF !IS_VEHICLE_EXTRA_TURNED_ON(vehicle, 2) AND !IS_VEHICLE_EXTRA_TURNED_ON(vehicle, 3) AND !IS_VEHICLE_EXTRA_TURNED_ON(vehicle, 4) AND !IS_VEHICLE_EXTRA_TURNED_ON(vehicle, 1) RETURN FALSE ENDIF BREAK CASE COQUETTE4 IF !IS_VEHICLE_EXTRA_TURNED_ON(vehicle, 1) RETURN FALSE ENDIF BREAK CASE ZORRUSSO IF GET_VEHICLE_MOD(vehicle, MOD_ROOF) = -1 RETURN FALSE ENDIF BREAK CASE MANANA2 IF IS_VEHICLE_EXTRA_TURNED_ON(vehicle, 1) RETURN FALSE ENDIF BREAK CASE RT3000 IF GET_VEHICLE_MOD(vehicle, MOD_ROOF) = -1 OR GET_VEHICLE_MOD(vehicle, MOD_ROOF) = 3 RETURN FALSE ENDIF BREAK ENDSWITCH SWITCH GET_VEHICLE_LAYOUT_HASH(vehicle) CASE HASH("LAYOUT_LOW") CASE HASH("LAYOUT_LOW_CHEETAH") CASE HASH("LAYOUT_LOW_INFERNUS") CASE HASH("LAYOUT_LOW_RESTRICTED") CASE HASH("LAYOUT_LOW_SENTINEL2") CASE HASH("LAYOUT_STANDARD") CASE HASH("LAYOUT_STD_EXITFIXUP") CASE HASH("LAYOUT_STD_HABANERO") CASE HASH("LAYOUT_STD_STRETCH") CASE HASH("LAYOUT_STD_HIGHWINDOW") CASE HASH("LAYOUT_RANGER") CASE HASH("LAYOUT_RANGER_SWAT") CASE HASH("LAYOUT_4X4") CASE HASH("LAYOUT_BISON") CASE HASH("LAYOUT_VAN_BODHI") CASE HASH("LAYOUT_STD_LOWROOF") CASE HASH("LAYOUT_STD_STRATUM") CASE HASH("LAYOUT_VAN_ROOSEVELT") CASE HASH("LAYOUT_STD_HUNTLEY") CASE HASH("LAYOUT_STD_WARRENER") CASE HASH("LAYOUT_LOW_BLADE") CASE HASH("LAYOUT_LOW_FURORE") CASE HASH("LAYOUT_STD_KURUMA") CASE HASH("LAYOUT_STD_BLISTA2") CASE HASH("LAYOUT_STD_CHINO") CASE HASH("LAYOUT_LOW_OSIRIS") CASE HASH("LAYOUT_LOW_FELTZER3") CASE HASH("LAYOUT_LOW_LOWRIDER") CASE HASH("LAYOUT_LOW_LOWRIDER_FACTION") CASE HASH("LAYOUT_STD_LOWRIDER") CASE HASH("LAYOUT_STD_LOWRIDER_CHINO") CASE HASH("LAYOUT_STD_LOWRIDER_SIDEDOOR") CASE HASH("LAYOUT_LOW_VERLIERER") CASE HASH("LAYOUT_STD_BALLER4") CASE HASH("LAYOUT_LOW_LOWRIDER2") CASE HASH("LAYOUT_LOW_LOWRIDER2_FACTION3") CASE HASH("LAYOUT_STD_LOWRIDER2") CASE HASH("LAYOUT_STD_LOWRIDER2_SIDEDOOR") CASE HASH("LAYOUT_STD_LOWRIDER2_SLAMVAN") CASE HASH("LAYOUT_STD_WINDSOR2") CASE HASH("LAYOUT_STD_XLS") CASE HASH("LAYOUT_LOW_LE7B") CASE HASH("LAYOUT_STD_OMNIS") CASE HASH("LAYOUT_LOW_RUINER2") CASE HASH("LAYOUT_LOW_INFERNUS2") CASE HASH("LAYOUT_LOW_TORERO") CASE HASH("LAYOUT_LOW_SC1") CASE HASH("LAYOUT_STD_NEON") //mpAssault CASE HASH("LAYOUT_LOW_MICHELLI") CASE HASH("LAYOUT_LOW_TEZERACT") CASE HASH("LAYOUT_LOW_DOMINATOR3") CASE HASH("LAYOUT_LOW_TAIPAN") //mpChristmas2018 CASE HASH("LAYOUT_LOW_ITALIGTO") CASE HASH("LAYOUT_LOW_RESTRICTED_SCHLAGEN") CASE HASH("LAYOUT_RANGER_TOROS") CASE HASH("LAYOUT_STD_DEVIANT") //mpVinewood CASE HASH("LAYOUT_STD_DRAFTER") CASE HASH("LAYOUT_STD_DYNASTY") CASE HASH("LAYOUT_STD_PARAGON") CASE HASH("LAYOUT_STD_ZION3") CASE HASH("LAYOUT_LOW_RESTRICTED_GAUNTLET3") CASE HASH("LAYOUT_LOW_PEYOTE2") CASE HASH("LAYOUT_LOW_NEO") CASE HASH("LAYOUT_RANGER_NOVAK") //mpHeist3 CASE HASH("LAYOUT_RANGER_EVERON") //mpSum CASE HASH("LAYOUT_LOW_PEYOTE3") CASE HASH("LAYOUT_RANGER_SEMINOLE2") //mpTuner CASE HASH("LAYOUT_LOW_CALICO") CASE HASH("LAYOUT_STD_CYPHER") CASE HASH("LAYOUT_LOW_RESTRICTED_DOMINATOR8") CASE HASH("LAYOUT_LOW_RESTRICTED_EUROS") CASE HASH("LAYOUT_LOW_RESTRICTED_RT3000") CASE HASH("LAYOUT_STANDARD_SULTAN3") CASE HASH("LAYOUT_STD_WARRENER2") CASE HASH("LAYOUT_LOW_ZR350") //mpFixer CASE HASH("LAYOUT_LOW_IGNUS") CASE HASH("LAYOUT_STANDARD_BUFFALO4") CASE HASH("LAYOUT_STD_ASTRON") CASE HASH("LAYOUT_STD_CINQUEMILA") CASE HASH("LAYOUT_STD_DEITY") CASE HASH("LAYOUT_STD_GRANGER2") CASE HASH("LAYOUT_STD_I-WAGEN") CASE HASH("LAYOUT_LOW_ZENO") //mpG9EC CASE HASH("LAYOUT_STD_S95") //mpSum2 CASE HASH("LAYOUT_LOW_RESTRICTED_POSTLUDE") CASE HASH("LAYOUT_LOW_RESTRICTED_TENF2") CASE HASH("LAYOUT_LOW_CORSITA") CASE HASH("LAYOUT_STD_RHINEHART") CASE HASH("LAYOUT_STANDARD_SENTINEL4") CASE HASH("LAYOUT_LOW_TORERO2") CASE HASH("LAYOUT_STD_GREENWOOD") RETURN TRUE BREAK ENDSWITCH //B* - 2151010, allow slamvan, but not ripley layout IF GET_VEHICLE_LAYOUT_HASH(vehicle) = HASH("LAYOUT_STD_RIPLEY") AND GET_ENTITY_MODEL(vehicle) = SLAMVAN RETURN TRUE ENDIF //B* - 6733643, allow weevil and brioso2, but not issi3 layout IF GET_VEHICLE_LAYOUT_HASH(vehicle) = HASH("LAYOUT_STD_ISSI3") AND GET_ENTITY_MODEL(vehicle) = WEEVIL OR GET_ENTITY_MODEL(vehicle) = BRIOSO2 RETURN TRUE ENDIF #IF FEATURE_DLC_1_2022 IF GET_VEHICLE_LAYOUT_HASH(vehicle) = HASH("LAYOUT_STD_ISSI3") AND GET_ENTITY_MODEL(vehicle) = INT_TO_ENUM(MODEL_NAMES, HASH("BRIOSO3")) RETURN TRUE ENDIF #ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL IS_VEHICLE_LOW_FOR_SEX(VEHICLE_INDEX vehicle) IF IS_VEHICLE_DRIVEABLE(vehicle) //VEHICLE_LAYOUT_TYPE LayoutHash = INT_TO_ENUM(VEHICLE_LAYOUT_TYPE, GET_VEHICLE_LAYOUT_HASH(vehicle)) SWITCH GET_VEHICLE_LAYOUT_HASH(vehicle) CASE HASH("LAYOUT_LOW") CASE HASH("LAYOUT_LOW_ENTITYXF") CASE HASH("LAYOUT_LOW_CHEETAH") CASE HASH("LAYOUT_LOW_INFERNUS") // CASE HASH("LAYOUT_STD_ZTYPE") CASE HASH("LAYOUT_LOW_RESTRICTED") CASE HASH("LAYOUT_LOW_SENTINEL2") CASE HASH("LAYOUT_LOW_FURORE") CASE HASH("LAYOUT_LOW_OSIRIS") CASE HASH("LAYOUT_LOW_FELTZER3") CASE HASH("LAYOUT_LOW_LOWRIDER") CASE HASH("LAYOUT_LOW_LOWRIDER_FACTION") CASE HASH("LAYOUT_LOW_VERLIERER") CASE HASH("LAYOUT_LOW_LOWRIDER2") CASE HASH("LAYOUT_LOW_LOWRIDER2_FACTION3") CASE HASH("LAYOUT_LOW_LE7B") CASE HASH("LAYOUT_LOW_RUINER2") CASE HASH("LAYOUT_LOW_INFERNUS2") CASE HASH("LAYOUT_LOW_SC1") //mpAssault CASE HASH("LAYOUT_LOW_MICHELLI") CASE HASH("LAYOUT_LOW_TEZERACT") CASE HASH("LAYOUT_LOW_DOMINATOR3") CASE HASH("LAYOUT_LOW_TAIPAN") //mpChristmas2018 CASE HASH("LAYOUT_LOW_ITALIGTO") CASE HASH("LAYOUT_LOW_RESTRICTED_SCHLAGEN") //Vinewood CASE HASH("LAYOUT_LOW_RESTRICTED_GAUNTLET3") CASE HASH("LAYOUT_LOW_PEYOTE2") CASE HASH("LAYOUT_LOW_NEO") //mpSum CASE HASH("LAYOUT_LOW_PEYOTE3") //mpTuner CASE HASH("LAYOUT_LOW_CALICO") CASE HASH("LAYOUT_LOW_RESTRICTED_DOMINATOR8") CASE HASH("LAYOUT_LOW_RESTRICTED_EUROS") CASE HASH("LAYOUT_LOW_RESTRICTED_RT3000") CASE HASH("LAYOUT_LOW_ZR350") //mpFixer CASE HASH("LAYOUT_LOW_IGNUS") CASE HASH("LAYOUT_LOW_ZENO") //mpSum2 CASE HASH("LAYOUT_LOW_RESTRICTED_POSTLUDE") CASE HASH("LAYOUT_LOW_RESTRICTED_TENF2") CASE HASH("LAYOUT_LOW_CORSITA") RETURN TRUE BREAK ENDSWITCH ENDIF RETURN FALSE ENDFUNC /// PURPOSE: to properly set the hooker into the vehicle context per B*1525901 FUNC BOOL DOES_VEHICLE_USE_LOW_RESTRICTED_VEHICLE_CONTEXT(VEHICLE_INDEX vehicle) IF IS_VEHICLE_DRIVEABLE(vehicle) SWITCH GET_VEHICLE_LAYOUT_HASH(vehicle) CASE HASH("LAYOUT_LOW_INFERNUS") CASE HASH("LAYOUT_LOW_RESTRICTED") CASE HASH("LAYOUT_LOW_OSIRIS") CASE HASH("LAYOUT_LOW_FELTZER3") CASE HASH("LAYOUT_LOW_VERLIERER") CASE HASH("LAYOUT_LOW_RUINER2") CASE HASH("LAYOUT_LOW_TORERO") //mpAssault CASE HASH("LAYOUT_LOW_MICHELLI") //Vinewood CASE HASH("LAYOUT_LOW_RESTRICTED_GAUNTLET3") //mpTuner CASE HASH("LAYOUT_LOW_RESTRICTED_DOMINATOR8") CASE HASH("LAYOUT_LOW_RESTRICTED_EUROS") CASE HASH("LAYOUT_LOW_RESTRICTED_RT3000") //mpSum2 CASE HASH("LAYOUT_LOW_RESTRICTED_POSTLUDE") CASE HASH("LAYOUT_LOW_RESTRICTED_TENF2") CASE HASH("LAYOUT_LOW_CORSITA") CASE HASH("LAYOUT_LOW_TORERO2") RETURN TRUE BREAK ENDSWITCH ENDIF RETURN FALSE ENDFUNC FUNC BOOL DOES_VEHICLE_USE_LOW_RESTRICTED_NOAMBIENT_VEHICLE_CONTEXT(VEHICLE_INDEX vehicle) IF IS_VEHICLE_DRIVEABLE(vehicle) SWITCH GET_VEHICLE_LAYOUT_HASH(vehicle) CASE HASH("LAYOUT_LOW_CHEETAH") CASE HASH("LAYOUT_LOW_ENTITYXF") CASE HASH("LAYOUT_LOW_LE7B") RETURN TRUE BREAK ENDSWITCH ENDIF RETURN FALSE ENDFUNC FUNC BOOL DOES_VEHICLE_USE_LOW_LOWRIDER_VEHICLE_CONTEXT(VEHICLE_INDEX vehicle) IF IS_VEHICLE_DRIVEABLE(vehicle) SWITCH GET_VEHICLE_LAYOUT_HASH(vehicle) CASE HASH("LAYOUT_LOW_LOWRIDER") CASE HASH("LAYOUT_LOW_LOWRIDER_FACTION") RETURN TRUE BREAK ENDSWITCH ENDIF RETURN FALSE ENDFUNC FUNC BOOL DOES_VEHICLE_USE_LOW_LOWRIDER2_VEHICLE_CONTEXT(VEHICLE_INDEX vehicle) IF IS_VEHICLE_DRIVEABLE(vehicle) SWITCH GET_VEHICLE_LAYOUT_HASH(vehicle) CASE HASH("LAYOUT_LOW_LOWRIDER2") CASE HASH("LAYOUT_LOW_LOWRIDER2_FACTION3") RETURN TRUE BREAK ENDSWITCH ENDIF RETURN FALSE ENDFUNC FUNC BOOL DOES_VEHICLE_USE_LOW_INFERNUS2_VEHICLE_CONTEXT(VEHICLE_INDEX vehicle) IF IS_VEHICLE_DRIVEABLE(vehicle) SWITCH GET_VEHICLE_LAYOUT_HASH(vehicle) CASE HASH("LAYOUT_LOW_INFERNUS2") RETURN TRUE BREAK ENDSWITCH ENDIF RETURN FALSE ENDFUNC FUNC BOOL DOES_VEHICLE_USE_LOW_SC1_VEHICLE_CONTEXT(VEHICLE_INDEX vehicle) IF IS_VEHICLE_DRIVEABLE(vehicle) SWITCH GET_VEHICLE_LAYOUT_HASH(vehicle) CASE HASH("LAYOUT_LOW_SC1") RETURN TRUE BREAK ENDSWITCH ENDIF RETURN FALSE ENDFUNC FUNC BOOL DOES_VEHICLE_USE_LOW_TEZERACT_VEHICLE_CONTEXT(VEHICLE_INDEX vehicle) IF IS_VEHICLE_DRIVEABLE(vehicle) SWITCH GET_VEHICLE_LAYOUT_HASH(vehicle) CASE HASH("LAYOUT_LOW_TEZERACT") CASE HASH("LAYOUT_LOW_TAIPAN") RETURN TRUE BREAK ENDSWITCH ENDIF RETURN FALSE ENDFUNC FUNC BOOL DOES_VEHICLE_USE_LOW_DOMINATOR3_VEHICLE_CONTEXT(VEHICLE_INDEX vehicle) IF IS_VEHICLE_DRIVEABLE(vehicle) SWITCH GET_VEHICLE_LAYOUT_HASH(vehicle) CASE HASH("LAYOUT_LOW_DOMINATOR3") RETURN TRUE BREAK ENDSWITCH ENDIF RETURN FALSE ENDFUNC FUNC BOOL DOES_VEHICLE_USE_LOW_ITALIGTO_VEHICLE_CONTEXT(VEHICLE_INDEX vehicle) IF IS_VEHICLE_DRIVEABLE(vehicle) SWITCH GET_VEHICLE_LAYOUT_HASH(vehicle) CASE HASH("LAYOUT_LOW_ITALIGTO") RETURN TRUE BREAK ENDSWITCH ENDIF RETURN FALSE ENDFUNC FUNC BOOL DOES_VEHICLE_USE_LOW_RESTRICTED_SCHLAGEN_VEHICLE_CONTEXT(VEHICLE_INDEX vehicle) IF IS_VEHICLE_DRIVEABLE(vehicle) SWITCH GET_VEHICLE_LAYOUT_HASH(vehicle) CASE HASH("LAYOUT_LOW_RESTRICTED_SCHLAGEN") RETURN TRUE BREAK ENDSWITCH ENDIF RETURN FALSE ENDFUNC FUNC BOOL DOES_VEHICLE_USE_LOW_NEO_VEHICLE_CONTEXT(VEHICLE_INDEX vehicle) IF IS_VEHICLE_DRIVEABLE(vehicle) SWITCH GET_VEHICLE_LAYOUT_HASH(vehicle) CASE HASH("LAYOUT_LOW_NEO") RETURN TRUE BREAK ENDSWITCH ENDIF RETURN FALSE ENDFUNC FUNC BOOL DOES_VEHICLE_USE_LOW_PEYOTE2_VEHICLE_CONTEXT(VEHICLE_INDEX vehicle) IF IS_VEHICLE_DRIVEABLE(vehicle) SWITCH GET_VEHICLE_LAYOUT_HASH(vehicle) CASE HASH("LAYOUT_LOW_PEYOTE2") RETURN TRUE BREAK ENDSWITCH ENDIF RETURN FALSE ENDFUNC FUNC BOOL DOES_VEHICLE_USE_LOW_ZR350_VEHICLE_CONTEXT(VEHICLE_INDEX vehicle) IF IS_VEHICLE_DRIVEABLE(vehicle) SWITCH GET_VEHICLE_LAYOUT_HASH(vehicle) CASE HASH("LAYOUT_LOW_ZR350") RETURN TRUE BREAK ENDSWITCH ENDIF RETURN FALSE ENDFUNC FUNC BOOL DOES_VEHICLE_USE_LOW_IGNUS_VEHICLE_CONTEXT(VEHICLE_INDEX vehicle) IF IS_VEHICLE_DRIVEABLE(vehicle) SWITCH GET_VEHICLE_LAYOUT_HASH(vehicle) CASE HASH("LAYOUT_LOW_IGNUS") RETURN TRUE BREAK ENDSWITCH ENDIF RETURN FALSE ENDFUNC FUNC BOOL DOES_VEHICLE_USE_LOW_ZENO_VEHICLE_CONTEXT(VEHICLE_INDEX vehicle) IF IS_VEHICLE_DRIVEABLE(vehicle) SWITCH GET_VEHICLE_LAYOUT_HASH(vehicle) CASE HASH("LAYOUT_LOW_ZENO") RETURN TRUE BREAK ENDSWITCH ENDIF RETURN FALSE ENDFUNC //Use this to determine if the player can only get a BJ in this vehicle FUNC BOOL CAN_HAVE_SEX_IN_THIS_VEHICLE_MODEL(VEHICLE_INDEX vehicle) IF IS_VEHICLE_DRIVEABLE(vehicle) MODEL_NAMES mVehicle = GET_ENTITY_MODEL(vehicle) IF mVehicle = INFERNUS OR mVehicle = VOLTIC OR mVehicle = STINGERGT OR mVehicle = STINGER OR mVehicle = BULLET OR mVehicle = ENTITYXF OR mVehicle = FELTZER3 OR mVehicle = GRANGER OR mVehicle = PANTO OR mVehicle = PHOENIX OR mVehicle = FMJ OR mVehicle = REAPER OR mVehicle = LE7B OR mVehicle = TYRUS OR mVehicle = INFERNUS2 RETURN FALSE ENDIF ENDIF RETURN TRUE ENDFUNC FUNC BOOL IS_ANY_FIRST_PERSON_CAM_ACTIVE(BOOL bCheckOnFoot = TRUE, BOOL bCheckInCar = TRUE) BOOL bIsFirstPersonCamActive = FALSE IF bCheckOnFoot bIsFirstPersonCamActive = (GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON) ENDIF IF bCheckInCar IF NOT bIsFirstPersonCamActive bIsFirstPersonCamActive = (GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE) = CAM_VIEW_MODE_FIRST_PERSON) ENDIF ENDIF RETURN bIsFirstPersonCamActive ENDFUNC FUNC STRING GET_ANIM_DICT_FOR_SEX_FOR_THIS_VEHICLE(VEHICLE_INDEX this_VEHICLE) IF DOES_ENTITY_EXIST(this_VEHICLE) IF IS_VEHICLE_LOW_FOR_SEX(this_VEHICLE) RETURN GET_ANIM_DICT_FOR_SEX_IN_LOW_VEHICLES() ENDIF ENDIF RETURN GET_ANIM_DICT_FOR_SEX_IN_NORM_VEHICLES() ENDFUNC FUNC STRING GET_ANIM_DICT_FOR_SEX_FOR_VEHICLE_PED_IS_IN(PED_INDEX pedHooker, BOOL bForceGetFPAnimDict = FALSE, BOOL bForceGet3rdPAnimDict = FALSE) IF NOT IS_ENTITY_DEAD(pedHooker) VEHICLE_INDEX vehiclePedIsIn vehiclePedIsIn = GET_VEHICLE_PED_IS_IN(pedHooker,TRUE) IF IS_VEHICLE_DRIVEABLE(vehiclePedIsIn) IF IS_VEHICLE_LOW_FOR_SEX(vehiclePedIsIn) IF (NOT IS_ANY_FIRST_PERSON_CAM_ACTIVE(FALSE) OR bForceGet3rdPAnimDict) AND NOT bForceGetFPAnimDict RETURN GET_ANIM_DICT_FOR_SEX_IN_LOW_VEHICLES() ELSE RETURN GET_ANIM_DICT_FOR_SEX_IN_LOW_VEHICLES_FIRST_PERSON() ENDIF ELIF GET_ENTITY_MODEL(vehiclePedIsIn) = VSTR RETURN "anim@mini@prostitutes@sex@veh_vstr@" ENDIF ENDIF ENDIF IF (NOT IS_ANY_FIRST_PERSON_CAM_ACTIVE(FALSE) OR bForceGet3rdPAnimDict) AND NOT bForceGetFPAnimDict RETURN GET_ANIM_DICT_FOR_SEX_IN_NORM_VEHICLES() ELSE RETURN GET_ANIM_DICT_FOR_SEX_IN_NORM_VEHICLES_FIRST_PERSON() ENDIF ENDFUNC FUNC STRING GET_ANIM_NAME_FOR_SEX_STATE(SEX_STATE_ENUM eSexState, BOOL bIsPedHooker = FALSE, BOOL bIsBlowJob = FALSE, BOOL bIsPedInLowVehicle = FALSE) STRING sSexAnimName = "" SWITCH eSexState CASE SEX_PROP_TO_ACTION_P1 IF bIsPedInLowVehicle IF bIsBlowJob IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_PROP_2_BJ_P1_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_PROP_2_BJ_P1_M) ENDIF //It's SEX ELSE IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_PROP_2_SEX_P1_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_PROP_2_SEX_P1_M) ENDIF ENDIF //Normal Vehicle ELSE IF bIsBlowJob IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_PROP_2_BJ_P1_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_PROP_2_BJ_P1_M) ENDIF //It's SEX ELSE IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_PROP_2_SEX_P1_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_PROP_2_SEX_P1_M) ENDIF ENDIF ENDIF BREAK CASE SEX_PROP_TO_ACTION_P2 IF bIsPedInLowVehicle IF bIsBlowJob IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_PROP_2_BJ_P2_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_PROP_2_BJ_P2_M) ENDIF //It's SEX ELSE IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_PROP_2_SEX_P2_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_PROP_2_SEX_P2_M) ENDIF ENDIF //Normal Vehicle - P2 doesn't exist yet************ ELSE IF bIsBlowJob IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_PROP_2_BJ_P2_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_PROP_2_BJ_P2_M) ENDIF //It's SEX ELSE IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_PROP_2_SEX_P2_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_PROP_2_SEX_P2_M) ENDIF ENDIF ENDIF BREAK CASE SEX_ACTION_LOOP IF bIsPedInLowVehicle IF bIsBlowJob IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_BJ_LOOP_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_BJ_LOOP_M) ENDIF //It's SEX ELSE IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_SEX_LOOP_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_SEX_LOOP_M) ENDIF ENDIF //Normal Vehicle ELSE IF bIsBlowJob IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_BJ_LOOP_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_BJ_LOOP_M) ENDIF //It's SEX ELSE IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_SEX_LOOP_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_SEX_LOOP_M) ENDIF ENDIF ENDIF BREAK CASE SEX_ACTION_TO_PROP_P1 IF bIsPedInLowVehicle IF bIsBlowJob IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_BJ_2_PROP_P1_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_BJ_2_PROP_P1_M) ENDIF //It's SEX ELSE IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_SEX_2_PROP_P1_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_SEX_2_PROP_P1_M) ENDIF ENDIF //Normal Vehicle ELSE IF bIsBlowJob IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_BJ_2_PROP_P1_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_BJ_2_PROP_P1_M) ENDIF //It's SEX ELSE IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_SEX_2_PROP_P1_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_SEX_2_PROP_P1_M) ENDIF ENDIF ENDIF BREAK CASE SEX_ACTION_TO_PROP_P2 IF bIsPedInLowVehicle IF bIsBlowJob IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_BJ_2_PROP_P2_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_BJ_2_PROP_P2_M) ENDIF //It's SEX ELSE IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_SEX_2_PROP_P2_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_SEX_2_PROP_P2_M) ENDIF ENDIF //Normal Vehicle - P2 doesn't exist yet************ ELSE IF bIsBlowJob IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_BJ_2_PROP_P2_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_BJ_2_PROP_P2_M) ENDIF //It's SEX ELSE IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_SEX_2_PROP_P2_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_SEX_2_PROP_P2_M) ENDIF ENDIF ENDIF BREAK CASE SEX_PROP_LOOP IF bIsPedInLowVehicle IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_PROP_LOOP_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_PROP_LOOP_M) ENDIF //Normal Vehicle ELSE IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_PROP_LOOP_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_PROP_LOOP_M) ENDIF ENDIF BREAK CASE SEX_SERVICE_COMPLETE BREAK ENDSWITCH RETURN sSexAnimName ENDFUNC FUNC STRING GET_SEX_ANIM_LOOP_NAME_FOR_PED(PED_INDEX pedHooker, BOOL bIsBlowJob = TRUE, BOOL bIsPedHooker = TRUE) STRING sSexAnimName = "" IF NOT IS_ENTITY_DEAD(pedHooker) VEHICLE_INDEX vehiclePedIsIn vehiclePedIsIn = GET_VEHICLE_PED_IS_IN(pedHooker,TRUE) IF IS_VEHICLE_DRIVEABLE(vehiclePedIsIn) IF IS_VEHICLE_LOW_FOR_SEX(vehiclePedIsIn) IF bIsBlowJob IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_BJ_LOOP_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_BJ_LOOP_M) ENDIF //It's SEX ELSE IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_SEX_LOOP_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_SEX_LOOP_M) ENDIF ENDIF ELSE IF bIsBlowJob IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_BJ_LOOP_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_BJ_LOOP_M) ENDIF //It's SEX ELSE IF bIsPedHooker sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_SEX_LOOP_F) ELSE sSexAnimName = GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_SEX_LOOP_M) ENDIF ENDIF ENDIF ENDIF ENDIF RETURN sSexAnimName ENDFUNC FUNC BOOL IS_PED_PLAYING_SEX_ANIM(PED_INDEX ped, BOOL bIsPedHooker, BOOL bIsBlowJob, BOOL bIsPlayerInLowCar) RETURN ( IS_ENTITY_PLAYING_ANIM(ped, GET_ANIM_DICT_FOR_SEX_IN_NORM_VEHICLES(), GET_ANIM_NAME_FOR_SEX_STATE(SEX_PROP_TO_ACTION_P1,bIsPedHooker,bIsBlowJob,bIsPlayerInLowCar)) OR IS_ENTITY_PLAYING_ANIM(ped, GET_ANIM_DICT_FOR_SEX_IN_NORM_VEHICLES(), GET_ANIM_NAME_FOR_SEX_STATE(SEX_PROP_TO_ACTION_P2,bIsPedHooker,bIsBlowJob,bIsPlayerInLowCar)) OR IS_ENTITY_PLAYING_ANIM(ped, GET_ANIM_DICT_FOR_SEX_IN_NORM_VEHICLES(), GET_ANIM_NAME_FOR_SEX_STATE(SEX_ACTION_LOOP,bIsPedHooker,bIsBlowJob,bIsPlayerInLowCar)) OR IS_ENTITY_PLAYING_ANIM(ped, GET_ANIM_DICT_FOR_SEX_IN_NORM_VEHICLES(), GET_ANIM_NAME_FOR_SEX_STATE(SEX_ACTION_TO_PROP_P1,bIsPedHooker,bIsBlowJob,bIsPlayerInLowCar)) OR IS_ENTITY_PLAYING_ANIM(ped, GET_ANIM_DICT_FOR_SEX_IN_NORM_VEHICLES(), GET_ANIM_NAME_FOR_SEX_STATE(SEX_ACTION_TO_PROP_P2,bIsPedHooker,bIsBlowJob,bIsPlayerInLowCar))) ENDFUNC FUNC BOOL INIT_SEX_SEQUENCE_TASK(BOOL bIsPedHooker, BOOL bIsBlowJob, BOOL bIsPlayerInLowCar, SEQUENCE_INDEX &sequence) STRING sCarSexAnimDictionaryName = GET_ANIM_DICT_FOR_SEX_IN_NORM_VEHICLES() REQUEST_ANIM_DICT(sCarSexAnimDictionaryName) IF HAS_ANIM_DICT_LOADED(sCarSexAnimDictionaryName) OPEN_SEQUENCE_TASK(sequence) TASK_PLAY_ANIM(NULL, sCarSexAnimDictionaryName, GET_ANIM_NAME_FOR_SEX_STATE(SEX_PROP_TO_ACTION_P1,bIsPedHooker,bIsBlowJob,bIsPlayerInLowCar), NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_DEFAULT) TASK_PLAY_ANIM(NULL, sCarSexAnimDictionaryName, GET_ANIM_NAME_FOR_SEX_STATE(SEX_PROP_TO_ACTION_P2,bIsPedHooker,bIsBlowJob,bIsPlayerInLowCar), NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1, AF_DEFAULT) TASK_PLAY_ANIM(NULL, sCarSexAnimDictionaryName, GET_ANIM_NAME_FOR_SEX_STATE(SEX_ACTION_LOOP,bIsPedHooker,bIsBlowJob,bIsPlayerInLowCar), NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING ) TASK_PLAY_ANIM(NULL, sCarSexAnimDictionaryName, GET_ANIM_NAME_FOR_SEX_STATE(SEX_ACTION_TO_PROP_P1,bIsPedHooker,bIsBlowJob,bIsPlayerInLowCar), NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1, AF_DEFAULT) TASK_PLAY_ANIM(NULL, sCarSexAnimDictionaryName, GET_ANIM_NAME_FOR_SEX_STATE(SEX_ACTION_TO_PROP_P2,bIsPedHooker,bIsBlowJob,bIsPlayerInLowCar), SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_DEFAULT) CLOSE_SEQUENCE_TASK(sequence) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: Wrapper for tasking peds to play the mini@prostitute sex anims in car /// /// PARAMS: /// pedToTask - The ped to animate /// bIsBlowJob - Is this a blowjob or sex /// bIsPedHooker - Is this the passenger who is performing the deed /// nTimeToPlay - Length of time to have sex/oral PROC TASK_PED_TO_HAVE_SEX_IN_VEHICLE(PED_INDEX pedToTask, BOOL bIsBlowJob = FALSE, BOOL bIsPedHooker = TRUE, INT nTimeToPlay = -1, BOOL bClearSequenceTaskAtEnd = TRUE) IF IS_ENTITY_DEAD(pedToTask) EXIT ENDIF VEHICLE_INDEX vehiclePedIsIn vehiclePedIsIn = GET_VEHICLE_PED_IS_IN(pedToTask,TRUE) IF NOT IS_VEHICLE_DRIVEABLE(vehiclePedIsIn) EXIT ENDIF ExitViewMode = GET_FOLLOW_PED_CAM_VIEW_MODE() //[MF] Force on-foot cam to first person mode. IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE) AND IS_ANY_FIRST_PERSON_CAM_ACTIVE(FALSE) IF (ExitViewMode != CAM_VIEW_MODE_FIRST_PERSON) CDEBUG1LN(DEBUG_PROSTITUTE, "[SEX] Forcing 3rd person cam to 1st person so it matches 1st person car view... ") SET_FOLLOW_PED_CAM_VIEW_MODE(CAM_VIEW_MODE_FIRST_PERSON) ELSE CDEBUG1LN(DEBUG_PROSTITUTE, "[SEX] (ExitViewMode = CAM_VIEW_MODE_FIRST_PERSON)") ENDIF ELSE CDEBUG1LN(DEBUG_PROSTITUTE, "[SEX] Player isn't in car or isn't in first person cam....") ENDIF BOOL bIsPlayerInLowCar = IS_VEHICLE_LOW_FOR_SEX(vehiclePedIsIn) CDEBUG1LN(DEBUG_PROSTITUTE, "[SEX] Is vehicle low? ", bIsPlayerInLowCar) STRING sCarSexAnimDictionaryName = GET_ANIM_DICT_FOR_SEX_FOR_VEHICLE_PED_IS_IN(pedToTask) CDEBUG1LN(DEBUG_PROSTITUTE, "[SEX] Anim dict? ", sCarSexAnimDictionaryName) IF NOT HAS_ANIM_DICT_LOADED(sCarSexAnimDictionaryName) REQUEST_ANIM_DICT(sCarSexAnimDictionaryName) CDEBUG1LN(DEBUG_PROSTITUTE, "[SEX] Anim dict being requested", sCarSexAnimDictionaryName) ELSE SEQUENCE_INDEX iTaskSeq OPEN_SEQUENCE_TASK(iTaskSeq) TASK_PLAY_ANIM(NULL, sCarSexAnimDictionaryName, GET_ANIM_NAME_FOR_SEX_STATE(SEX_PROP_TO_ACTION_P1,bIsPedHooker,bIsBlowJob,bIsPlayerInLowCar), NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_DEFAULT) TASK_PLAY_ANIM(NULL, sCarSexAnimDictionaryName, GET_ANIM_NAME_FOR_SEX_STATE(SEX_PROP_TO_ACTION_P2,bIsPedHooker,bIsBlowJob,bIsPlayerInLowCar), NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1, AF_DEFAULT) TASK_PLAY_ANIM(NULL, sCarSexAnimDictionaryName, GET_ANIM_NAME_FOR_SEX_STATE(SEX_ACTION_LOOP,bIsPedHooker,bIsBlowJob,bIsPlayerInLowCar), NORMAL_BLEND_IN, SLOW_BLEND_OUT, nTimeToPlay, AF_LOOPING ) TASK_PLAY_ANIM(NULL, sCarSexAnimDictionaryName, GET_ANIM_NAME_FOR_SEX_STATE(SEX_ACTION_TO_PROP_P1,bIsPedHooker,bIsBlowJob,bIsPlayerInLowCar), NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1, AF_DEFAULT) TASK_PLAY_ANIM(NULL, sCarSexAnimDictionaryName, GET_ANIM_NAME_FOR_SEX_STATE(SEX_ACTION_TO_PROP_P2,bIsPedHooker,bIsBlowJob,bIsPlayerInLowCar), SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_DEFAULT) CLOSE_SEQUENCE_TASK(iTaskSeq) TASK_PERFORM_SEQUENCE(pedToTask, iTaskSeq) //Doesn't seem to work with this set to true, added as default param to avoid breaking old stuff, try setting to FALSE if not playing IF bClearSequenceTaskAtEnd CLEAR_SEQUENCE_TASK(iTaskSeq) ENDIF CDEBUG1LN(DEBUG_PROSTITUTE, "[SEX] Ped tasked to have sex") ENDIF ENDPROC FUNC BOOL IS_SEX_ANIMATION_PLAYING_MONEY_SHOT(PED_INDEX ped) RETURN ( IS_ENTITY_PLAYING_ANIM(ped, GET_ANIM_DICT_FOR_SEX_IN_LOW_VEHICLES(), GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_SEX_2_PROP_P1_F)) OR IS_ENTITY_PLAYING_ANIM(ped, GET_ANIM_DICT_FOR_SEX_IN_LOW_VEHICLES(), GET_ANIM_NAME_FOR_SEX_IN_LOW_VEHICLE(ANVL_BJ_2_PROP_P1_F)) OR IS_ENTITY_PLAYING_ANIM(ped, GET_ANIM_DICT_FOR_SEX_IN_NORM_VEHICLES(), GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_SEX_2_PROP_P1_F)) OR IS_ENTITY_PLAYING_ANIM(ped, GET_ANIM_DICT_FOR_SEX_IN_NORM_VEHICLES(), GET_ANIM_NAME_FOR_SEX_IN_NORM_VEHICLE(ANVN_BJ_2_PROP_P1_F)) ) ENDFUNC //EOF