Files
gtav-src/script/dev_ng/singleplayer/include/public/common_sex.sch
T
2025-09-29 00:52:08 +02:00

1427 lines
42 KiB
Scheme
Executable File

/// 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