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

1970 lines
61 KiB
Scheme
Executable File

//////////////////////////////////////////////////////////////////////////////////////////
// //
// SCRIPT NAME : stripclub_public.sc //
// AUTHOR : Rob Bray //
// DESCRIPTION : Common functions used across strip club and booty calls //
// //
//////////////////////////////////////////////////////////////////////////////////////////
USING "rage_builtins.sch"
USING "globals.sch"
USING "commands_script.sch"
USING "cellphone_public.sch"
USING "player_ped_public.sch"
USING "friendActivity_public.sch"
USING "net_common_functions.sch"
USING "commands_event.sch"
USING "common_sex.sch"
// constants
CONST_INT MP_STRIPCLUB_MAX_PLAYERS NUM_NETWORK_PLAYERS
CONST_INT MAX_NUMBER_CLUB_STAFF 5
CONST_INT MAX_NUMBER_NAMED_STRIPPERS 4
CONST_INT MAX_NUMBER_NAMED_STRIPPERS_MP 3
CONST_INT MAX_NUMBER_OF_CLUB_EMPLOYEES (MAX_NUMBER_CLUB_STAFF+MAX_NUMBER_NAMED_STRIPPERS)
CONST_INT MAX_NUMBER_OF_STRIPCLUB_CASH_OBJECTS 6
CONST_INT MAX_NUMBER_STRIPPERS_TAKE_HOME 1
CONST_INT NUM_DENIALS_TO_TRIGGER_SEXT 2
CONST_INT ADVANCE_NEXT_BOOTY_CALL_AVAILABLE_TIME_MIN 20*60*1000 //The player can only solicit a booty call once every 20 - 35 minutes
CONST_INT ADVANCE_NEXT_BOOTY_CALL_AVAILABLE_TIME_MAX 35*60*1000
CONST_INT BOOTY_CALL_WAIT_FOR_PLAYER_TIME_MIN 5 //The booty call will wait at least 5 hours for the player to pick her up
CONST_INT BOOTY_CALL_WAIT_FOR_PLAYER_TIME_MAX 7 //The booty call will wait at most 7 hours for the player to pick her up.
CONST_INT STRIPPER_MAX_LIKE 7500
CONST_INT ADVANCE_NEXT_CALL_PLAYER_TIME_MIN 6*60*60*1000 //you can only get a bootycall from anyone once every 6 - 7 hours
CONST_INT ADVANCE_NEXT_CALL_PLAYER_TIME_MAX 7*60*60*1000
CONST_INT INITIAL_NEXT_CALL_PLAYER_TIME_MIN 30*60*1000 // the first time you get the number she will call you much sooner
CONST_INT INITIAL_NEXT_CALL_PLAYER_TIME_MAX 35*60*1000
CONST_FLOAT STRIPCLUB_MP_ACTIVATION_RANGE 25.0
CONST_FLOAT STRIPPER_DUO_DANCE_THRESHOLD 0.70
CONST_FLOAT STRIPPER_COME_HOME_LIKE_THRESHOLD 0.95
CONST_FLOAT STRIPPER_COME_BACK_HOME_LIKE_THRESHOLD 0.80
ENUM BOUNCER_STATE
BOUNCER_GOTO_STAND_LOCATION,
BOUNCER_ACHIEVE_HEADING,
BOUNCER_IDLE_PHASE1,
BOUNCER_IDLE_PHASE2,
BOUNCER_IDLE_PHASE3,
BOUNCER_STOP,
BOUNCER_STOP2,
BOUNCER_MOVE_ASIDE_ENTER,
BOUNCER_MOVE_ASIDE_EXIT,
BOUNCER_GREET,
BOUNCER_NONE
ENDENUM
// pass info into take home script
STRUCT TAKE_HOME_STRIPPER_INFO
BOOTY_CALL_CONTACT_ENUM stripperID[MAX_NUMBER_STRIPPERS_TAKE_HOME]
//VECTOR vInitPos[MAX_NUMBER_STRIPPERS_TAKE_HOME]
//FLOAT fInitRot[MAX_NUMBER_STRIPPERS_TAKE_HOME]
INT iNumStrippers
INT myCandidateID
BOOL bIsBootyCall
BOOL bIsMp
ENDSTRUCT
STRUCT OUTSIDE_BOUNCER_INFO
BOOL bIsMp
ENDSTRUCT
// get guard anim dict
FUNC STRING GET_STRIP_CLUB_ANIM_DICT_BOUNCER_IDLE()
RETURN "mini@strip_club@idles@bouncer@base"
ENDFUNC
FUNC BOOL IS_ENTITY_IN_STRIPCLUB(ENTITY_INDEX checkEntity)
IF NOT DOES_ENTITY_EXIST(checkEntity)
RETURN FALSE
ENDIF
IF IS_ENTITY_DEAD(checkEntity)
//dead entities can still be in the club
ENDIF
RETURN GET_INTERIOR_FROM_ENTITY(checkEntity) = g_Interior_Instance_Strip_Club_Low
ENDFUNC
FUNC BOOL IS_PED_NEAR_STRIPCLUB_ENTRYWAY(PED_INDEX ped)
RETURN VDIST2(GET_ENTITY_COORDS(ped, FALSE), <<128.70, -1298.22, 29.31>>) < 9.0
ENDFUNC
FUNC enumConversationPriority GET_STRIPCLUB_SPEECH_PRIORITY()
RETURN CONV_PRIORITY_AMBIENT_MEDIUM
ENDFUNC
// is it big trev
FUNC BOOL STRIP_CLUB_IS_PLAYER_TREVOR()
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL DOES_TREVOR_OWN_CLUB()
#if USE_CLF_DLC
return false
#endif
#if USE_NRM_DLC
return false
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
RETURN Is_Savehouse_Respawn_Available(SAVEHOUSE_TREVOR_SC)
#endif
#endif
ENDFUNC
FUNC BOOL IS_BOOTYCALL_STRIPPER(BOOTY_CALL_CONTACT_ENUM bootyCallEnum)
SWITCH bootyCallEnum
CASE BC_STRIPPER_JULIET
CASE BC_STRIPPER_NIKKI
CASE BC_STRIPPER_CHASTITY
CASE BC_STRIPPER_CHEETAH
CASE BC_STRIPPER_SAPPHIRE
CASE BC_STRIPPER_INFERNUS
CASE BC_STRIPPER_FUFU
CASE BC_STRIPPER_PEACH
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL DOES_STRIPPER_LIKE_PLAYERS_RIDE( BOOTY_CALL_CONTACT_ENUM bootyCallEnum, MODEL_NAMES vehModel )
SWITCH vehModel
//Classics
CASE MANANA
CASE TORNADO
CASE TORNADO3
CASE TORNADO4
CASE ZTYPE
CASE REGINA
IF bootyCallEnum = BC_STRIPPER_JULIET
RETURN TRUE
ENDIF
BREAK
//Compacts or Cute or hybrid looking
CASE BLISTA
CASE SURGE
CASE DILETTANTE
//Sporty / Japanese
CASE PENUMBRA
CASE ASTEROPE
IF bootyCallEnum = BC_STRIPPER_NIKKI
RETURN TRUE
ENDIF
BREAK
//Muscle / AMERICAN
CASE DOMINATOR
CASE GAUNTLET
CASE PHOENIX
CASE SABREGT
CASE BULLET
CASE BANSHEE
CASE PEYOTE
CASE BUFFALO
CASE BUFFALO2
IF bootyCallEnum = BC_STRIPPER_CHASTITY
RETURN TRUE
ENDIF
BREAK
//Luxury/ Exotic
CASE CHEETAH
CASE COGCABRIO
CASE JB700
CASE STINGERGT
CASE MONROE
CASE COMET2
CASE ORACLE
CASE ORACLE2
CASE INTRUDER
CASE JACKAL
CASE EXEMPLAR
CASE FELON
CASE SUPERD
CASE INFERNUS
CASE ENTITYXF
CASE ADDER
CASE VACCA
IF bootyCallEnum = BC_STRIPPER_CHEETAH
OR bootyCallEnum = BC_STRIPPER_INFERNUS
RETURN TRUE
ENDIF
BREAK
//TRUCKS
CASE BALLER
CASE BISON
CASE DUBSTA
CASE GRANGER
CASE PATRIOT
CASE BALLER2
CASE BJXL
CASE CAVALCADE
CASE CAVALCADE2
CASE GRESLEY
CASE LANDSTALKER
CASE MESA
CASE RANCHERXL
CASE SANDKING
CASE REBEL
//STRANGE
CASE STRETCH
CASE ROMERO
CASE COACH
CASE BUS
IF bootyCallEnum = BC_STRIPPER_SAPPHIRE
OR bootyCallEnum = BC_STRIPPER_PEACH
RETURN TRUE
ENDIF
BREAK
//Convertible
CASE SURANO
CASE RAPIDGT2
CASE NINEF2
CASE ZION2
CASE TORNADO2
CASE SENTINEL2
CASE ISSI2
CASE FELON2
IF bootyCallEnum = BC_STRIPPER_FUFU
OR bootyCallEnum = BC_STRIPPER_NIKKI
RETURN TRUE
ENDIF
BREAK
//BIKES
CASE VADER
CASE AKUMA
CASE BAGGER
CASE BATI
CASE BATI2
CASE DOUBLE
CASE HEXER
CASE NEMESIS
CASE RUFFIAN
IF bootyCallEnum = BC_TAXI_LIZ
RETURN TRUE
ENDIF
BREAK
//Service
CASE FBI
CASE TAXI
CASE PRANGER
CASE AMBULANCE
CASE POLICE3
IF bootyCallEnum = BC_HITCHER_GIRL
//OR bootyCallEnum = BC_FIXED_CAR
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_PLAYER_DRIVING_A_NICE_RIDE(BOOTY_CALL_CONTACT_ENUM bootyCallEnum)
VEHICLE_INDEX vehPlayersLast = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
MODEL_NAMES vehModel
IF IS_VEHICLE_DRIVEABLE( vehPlayersLast )
vehModel = GET_ENTITY_MODEL( vehPlayersLast )
IF DOES_STRIPPER_LIKE_PLAYERS_RIDE(bootyCallEnum, vehModel)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_STRIPPER_IN_VEHICLE_SHE_CAN_GIVE_A_BJ_IN()
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
RETURN FALSE
ENDIF
VEHICLE_INDEX vehPlayersLast = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
MODEL_NAMES vehModel
IF IS_VEHICLE_DRIVEABLE( vehPlayersLast )
vehModel = GET_ENTITY_MODEL( vehPlayersLast )
IF IS_VEHICLE_MODEL_SUITABLE_FOR_SEX( vehModel, FALSE)
AND IS_VEHICLE_LAYOUT_VALID_FOR_SEX(vehPlayersLast)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC MODEL_NAMES GET_STRIPPER_MODEL(INT iModelVariant, BOOL bHighQuality = FALSE)
IF iModelVariant = 0
IF bHighQuality
RETURN CSB_STRIPPER_01
ELSE
RETURN S_F_Y_STRIPPER_01
ENDIF
ELIF iModelVariant = 1
IF bHighQuality
RETURN CSB_STRIPPER_02
ELSE
RETURN S_F_Y_STRIPPER_02
ENDIF
ENDIF
RETURN DUMMY_MODEL_FOR_SCRIPT
ENDFUNC
FUNC TEXT_LABEL_23 STRIPCLUB_FIXUP_PLAYER_LABEL(STRING sBaseLabel)
TEXT_LABEL_23 sFixup = sBaseLabel
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
sFixup += "_T"
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
sFixup += "_M"
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
sFixup += "_F"
ENDIF
//PRINTLN("Changed label to ", sFixup)
RETURN sFixup
ENDFUNC
// set stripper variation fields
PROC SET_HEAD_VARIATION_ON_STRIPPER(PED_INDEX ped, INT iHeD, INT iHeT)
IF IS_PED_COMPONENT_VARIATION_VALID(ped, PED_COMP_HEAD, iHeD, iHeT)
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_HEAD, iHeD, iHeT)
ELSE
SCRIPT_ASSERT("bad PED_COMP_HEAD combo")
ENDIF
ENDPROC
PROC SET_HAIR_VARIATION_ON_STRIPPER(PED_INDEX ped, INT iHaD, INT iHaT)
IF IS_PED_COMPONENT_VARIATION_VALID(ped, PED_COMP_HAIR, iHaD, iHaT)
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_HAIR, iHaD, iHaT)
ELSE
PRINTLN("Drawable ", iHaD, " Texture ", iHaT)
SCRIPT_ASSERT("bad PED_COMP_HAIR combo")
ENDIF
ENDPROC
PROC SET_TORSO_VARIATION_ON_STRIPPER(PED_INDEX ped, INT iToD, INT iToT)
IF IS_PED_COMPONENT_VARIATION_VALID(ped, PED_COMP_TORSO, iToD, iToT)
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_TORSO, iToD, iToT)
ELSE
SCRIPT_ASSERT("bad PED_COMP_TORSO combo")
ENDIF
ENDPROC
PROC SET_LEG_VARIATION_ON_STRIPPER(PED_INDEX ped, INT iLeD, INT iLeT)
IF IS_PED_COMPONENT_VARIATION_VALID(ped, PED_COMP_LEG, iLeD, iLeT)
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_LEG, iLeD, iLeT)
ELSE
SCRIPT_ASSERT("bad PED_COMP_LEG combo")
ENDIF
ENDPROC
PROC SET_FEET_VARIATION_ON_STRIPPER(PED_INDEX ped, INT iLeD, INT iLeT)
IF IS_PED_COMPONENT_VARIATION_VALID(ped, PED_COMP_FEET, iLeD, iLeT)
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_FEET, iLeD, iLeT)
ELSE
SCRIPT_ASSERT("bad PED_COMP_FEET combo")
ENDIF
ENDPROC
PROC SET_SPECIAL_VARIATION_ON_STIPPER(PED_INDEX ped, INT iDraw, INT iTexture)
IF IS_PED_COMPONENT_VARIATION_VALID(ped, PED_COMP_SPECIAL, iDraw, iTexture)
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_SPECIAL, iDraw, iTexture)
ELSE
SCRIPT_ASSERT("bad PED_COMP_SPECIAL combo")
ENDIF
ENDPROC
PROC SET_JBIB_VARIATION_ON_STIPPER(PED_INDEX ped, INT iDraw, INT iTexture)
IF IS_PED_COMPONENT_VARIATION_VALID(ped, PED_COMP_JBIB, iDraw, iTexture)
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_JBIB, iDraw, iTexture)
ELSE
SCRIPT_ASSERT("bad PED_COMP_JBIB combo")
ENDIF
ENDPROC
PROC SET_JACKET_VARIATION_ON_STRIPPER(PED_INDEX ped)
IF GET_ENTITY_MODEL(ped) = S_F_Y_Stripper_02
SET_SPECIAL_VARIATION_ON_STIPPER(ped, 2,GET_RANDOM_INT_IN_RANGE(0,3)) //jacket
SET_TORSO_VARIATION_ON_STRIPPER(ped, 2,GET_RANDOM_INT_IN_RANGE(0,3)) //blouse
SET_FEET_VARIATION_ON_STRIPPER(ped, 0,0) //boots
ENDIF
ENDPROC
PROC SETUP_TOPLESS_VARIATION_ON_STRIPPER(PED_INDEX paramPed, BOOL bTopLess, INT iTattoo = -1, INT iJewelry = -1)
IF IS_ENTITY_DEAD(paramPed)
EXIT
ENDIF
MODEL_NAMES stripperModelName = GET_ENTITY_MODEL(paramPed)
IF stripperModelName = GET_STRIPPER_MODEL(0)
OR stripperModelName = GET_STRIPPER_MODEL(0, TRUE)
IF bTopLess
SET_TORSO_VARIATION_ON_STRIPPER(paramPed, 2, 0)
SET_SPECIAL_VARIATION_ON_STIPPER(paramPed, 1, 0) // no skirt, just thongs
ENDIF
ELIF stripperModelName = GET_STRIPPER_MODEL(1)
OR stripperModelName = GET_STRIPPER_MODEL(1, TRUE)
IF bTopLess
SET_TORSO_VARIATION_ON_STRIPPER(paramPed, 0, iTattoo)
SET_FEET_VARIATION_ON_STRIPPER(paramPed, iJewelry, 0)
SET_SPECIAL_VARIATION_ON_STIPPER(paramPed, 1, 0)
ENDIF
ELIF stripperModelName = MP_F_STRIPPERLITE
IF bTopLess
SET_SPECIAL_VARIATION_ON_STIPPER(paramPed, 1, 0)
ENDIF
ENDIF
ENDPROC
// set stripper variations
PROC SETUP_SCLUB_STRIPPER_VARIATION(PED_INDEX ped, BOOTY_CALL_CONTACT_ENUM stripperID, BOOL bTopless = FALSE)
IF NOT IS_PED_INJURED(ped)
SET_PED_DEFAULT_COMPONENT_VARIATION(ped)
//SET_PED_COMPONENT_VARIATION(ped, PED_COMP_SPECIAL, 1, 0)
// For Stripper_01
// Head has textures [0-1] (eyes)
// Hair has textures [0-1]
// Torso has drawables [0-2], 2 has no textures, 0-1 has textures [0-2]
// Lower has textures [0-2]
// Special has drawables [0-1], 1 has no textures, 0 has textures [0-1]
// For Stripper_02
// Head has textures [0-1] (eyes)
// Hair has drawables [0-2], [0] and [2] have textures [0-2], [1] has textures [0-1]
// Torso has textures [0-1]
// Lower has textures [0-2]
// Feet has drawabes [0-1], [0] has no textures, [1] has textures [0-2]...just use 0, 1 is a skirt
// Special has drawables [0-2], 0 has textures [0-3], [1-2] has textures [0-2] ... use 0 for bikini top, 1 for tape
BOOL bUsingLiteModel = FALSE
IF GET_ENTITY_MODEL(ped) = MP_F_STRIPPERLITE
bUsingLiteModel = TRUE
//EXIT
ENDIF
SWITCH stripperID
CASE BC_STRIPPER_JULIET //GET_STRIPPER_MODEL(0)
//DEBUG_MESSAGE("Setting up BC_STRIPPER_JULIET")
IF bUsingLiteModel
SET_HEAD_VARIATION_ON_STRIPPER(ped, 1, 0)
SET_HAIR_VARIATION_ON_STRIPPER(ped, 1, 0)
SET_TORSO_VARIATION_ON_STRIPPER(ped, 1, 0)
SET_LEG_VARIATION_ON_STRIPPER(ped, 1, 0)
SETUP_TOPLESS_VARIATION_ON_STRIPPER(ped, TRUE) //all white mp strippers dont wear bikini
ELSE
SET_HEAD_VARIATION_ON_STRIPPER(ped, 1, 1)
SET_HAIR_VARIATION_ON_STRIPPER(ped, 2, 0)
SET_TORSO_VARIATION_ON_STRIPPER(ped, 0, 0)
SET_LEG_VARIATION_ON_STRIPPER(ped, 0, 0)
SET_SPECIAL_VARIATION_ON_STIPPER(ped, 1, 0)
SET_JBIB_VARIATION_ON_STIPPER(ped, 0, 0)
SETUP_TOPLESS_VARIATION_ON_STRIPPER(ped, bTopless)
ENDIF
BREAK
CASE BC_STRIPPER_NIKKI //GET_STRIPPER_MODEL(1)
//DEBUG_MESSAGE("Setting up BC_STRIPPER_NIKKI")
IF bUsingLiteModel
SET_HEAD_VARIATION_ON_STRIPPER(ped, 0, 0)
SET_HAIR_VARIATION_ON_STRIPPER(ped, 0, 0)
SET_TORSO_VARIATION_ON_STRIPPER(ped, 0, 0)
SET_LEG_VARIATION_ON_STRIPPER(ped, 0, 0)
SET_SPECIAL_VARIATION_ON_STIPPER(ped, 0, 0)
SETUP_TOPLESS_VARIATION_ON_STRIPPER(ped, bTopless)
ELSE
SET_HEAD_VARIATION_ON_STRIPPER(ped, 0, 0)
SET_HAIR_VARIATION_ON_STRIPPER(ped, 0, 0)
SET_TORSO_VARIATION_ON_STRIPPER(ped, 0, 0) //no tats
SET_LEG_VARIATION_ON_STRIPPER(ped, 0, 0)
SET_FEET_VARIATION_ON_STRIPPER(ped, 4, 0) //jewl 4
SET_SPECIAL_VARIATION_ON_STIPPER(ped, 0, 0) //has bikini
SETUP_TOPLESS_VARIATION_ON_STRIPPER(ped, bTopless, 0, 4)
ENDIF
BREAK
CASE BC_STRIPPER_CHASTITY //GET_STRIPPER_MODEL(0)
//DEBUG_MESSAGE("Setting up BC_STRIPPER_CHASTITY")
IF bUsingLiteModel
SET_HEAD_VARIATION_ON_STRIPPER(ped, 1, 0)
SET_HAIR_VARIATION_ON_STRIPPER(ped, 1, 1)
SET_TORSO_VARIATION_ON_STRIPPER(ped, 1, 0)
SET_LEG_VARIATION_ON_STRIPPER(ped, 1, 0)
SETUP_TOPLESS_VARIATION_ON_STRIPPER(ped, TRUE)
ELSE
SET_HEAD_VARIATION_ON_STRIPPER(ped, 0, 1)
SET_HAIR_VARIATION_ON_STRIPPER(ped, 1, 1)
SET_TORSO_VARIATION_ON_STRIPPER(ped, 1, 0)
SET_LEG_VARIATION_ON_STRIPPER(ped, 1, 1)
SET_SPECIAL_VARIATION_ON_STIPPER(ped, 1, 0)
SET_JBIB_VARIATION_ON_STIPPER(ped, 1, 0)
SETUP_TOPLESS_VARIATION_ON_STRIPPER(ped, bTopless)
ENDIF
BREAK
CASE BC_STRIPPER_CHEETAH //GET_STRIPPER_MODEL(1)
//DEBUG_MESSAGE("Setting up BC_STRIPPER_CHEETAH")
IF bUsingLiteModel
SET_HEAD_VARIATION_ON_STRIPPER(ped, 0, 0)
SET_HAIR_VARIATION_ON_STRIPPER(ped, 0, 1)
SET_TORSO_VARIATION_ON_STRIPPER(ped, 0, 1)
SET_LEG_VARIATION_ON_STRIPPER(ped, 0, 1)
SET_SPECIAL_VARIATION_ON_STIPPER(ped, 0, 0)
SETUP_TOPLESS_VARIATION_ON_STRIPPER(ped, bTopless)
ELSE
SET_HEAD_VARIATION_ON_STRIPPER(ped, 0, 0)
SET_HAIR_VARIATION_ON_STRIPPER(ped, 2, 0)
SET_TORSO_VARIATION_ON_STRIPPER(ped, 0, 2) //tatto number 2
SET_LEG_VARIATION_ON_STRIPPER(ped, 1, 1)
SET_FEET_VARIATION_ON_STRIPPER(ped, 0, 0) //No skirt or jewelry
SET_SPECIAL_VARIATION_ON_STIPPER(ped, 0, 0) //has bikini
SETUP_TOPLESS_VARIATION_ON_STRIPPER(ped, bTopless, 2, 0)//tat 2, no jewl
ENDIF
BREAK
CASE BC_STRIPPER_SAPPHIRE //GET_STRIPPER_MODEL(0)
//DEBUG_MESSAGE("Setting up BC_STRIPPER_SAPPHIRE")
IF bUsingLiteModel
SET_HEAD_VARIATION_ON_STRIPPER(ped, 1, 0)
SET_HAIR_VARIATION_ON_STRIPPER(ped, 1, 0)
SET_TORSO_VARIATION_ON_STRIPPER(ped, 1, 0)
SET_LEG_VARIATION_ON_STRIPPER(ped, 1, 0)
SETUP_TOPLESS_VARIATION_ON_STRIPPER(ped, TRUE)
ELSE
SET_HEAD_VARIATION_ON_STRIPPER(ped, 1, 0)
SET_HAIR_VARIATION_ON_STRIPPER(ped, 2, 1)
SET_TORSO_VARIATION_ON_STRIPPER(ped, 1, 2)
SET_LEG_VARIATION_ON_STRIPPER(ped, 0, 2)
SET_SPECIAL_VARIATION_ON_STIPPER(ped, 1, 0)
SET_JBIB_VARIATION_ON_STIPPER(ped, 1, 2)
SETUP_TOPLESS_VARIATION_ON_STRIPPER(ped, bTopless)
ENDIF
BREAK
CASE BC_STRIPPER_INFERNUS //GET_STRIPPER_MODEL(1)
//DEBUG_MESSAGE("Setting up BC_STRIPPER_INFERNUS")
IF bUsingLiteModel
SET_HEAD_VARIATION_ON_STRIPPER(ped, 0, 0)
SET_HAIR_VARIATION_ON_STRIPPER(ped, 0, 0)
SET_TORSO_VARIATION_ON_STRIPPER(ped, 0, 0)
SET_LEG_VARIATION_ON_STRIPPER(ped, 0, 0)
SET_SPECIAL_VARIATION_ON_STIPPER(ped, 0, 0)
SETUP_TOPLESS_VARIATION_ON_STRIPPER(ped, bTopless)
ELSE
SET_HEAD_VARIATION_ON_STRIPPER(ped, 1, 1)
SET_HAIR_VARIATION_ON_STRIPPER(ped, 1, 0)
SET_TORSO_VARIATION_ON_STRIPPER(ped, 0, 1) //tat one
SET_LEG_VARIATION_ON_STRIPPER(ped, 0, 2)
SET_FEET_VARIATION_ON_STRIPPER(ped, 2, 0) //wearing jewl 2
SET_SPECIAL_VARIATION_ON_STIPPER(ped, 0, 0) //has bikini
SETUP_TOPLESS_VARIATION_ON_STRIPPER(ped, bTopless, 1, 2)
ENDIF
BREAK
CASE BC_STRIPPER_FUFU //GET_STRIPPER_MODEL(0)
//DEBUG_MESSAGE("Setting up BC_STRIPPER_FUFU")
IF bUsingLiteModel
SET_HEAD_VARIATION_ON_STRIPPER(ped, 1, 0)
SET_HAIR_VARIATION_ON_STRIPPER(ped, 1, 0)
SET_TORSO_VARIATION_ON_STRIPPER(ped, 1, 0)
SET_LEG_VARIATION_ON_STRIPPER(ped, 1, 0)
SETUP_TOPLESS_VARIATION_ON_STRIPPER(ped, TRUE)
ELSE
SET_HEAD_VARIATION_ON_STRIPPER(ped, 0, 0)
SET_HAIR_VARIATION_ON_STRIPPER(ped, 1, 0)
SET_TORSO_VARIATION_ON_STRIPPER(ped, 0, 1)
SET_LEG_VARIATION_ON_STRIPPER(ped, 0, 1)
SET_SPECIAL_VARIATION_ON_STIPPER(ped, 1, 0)
SET_JBIB_VARIATION_ON_STIPPER(ped, 0, 1)
SETUP_TOPLESS_VARIATION_ON_STRIPPER(ped, bTopless, 0, 1)
ENDIF
BREAK
CASE BC_STRIPPER_PEACH //GET_STRIPPER_MODEL(1)
//DEBUG_MESSAGE("Setting up BC_STRIPPER_PEACH")
IF bUsingLiteModel
SET_HEAD_VARIATION_ON_STRIPPER(ped, 0, 0)
SET_HAIR_VARIATION_ON_STRIPPER(ped, 0, 1)
SET_TORSO_VARIATION_ON_STRIPPER(ped, 0, 0)
SET_LEG_VARIATION_ON_STRIPPER(ped, 0, 0)
SET_SPECIAL_VARIATION_ON_STIPPER(ped, 0, 0)
SETUP_TOPLESS_VARIATION_ON_STRIPPER(ped, bTopless)
ELSE
SET_HEAD_VARIATION_ON_STRIPPER(ped, 1, 0)
SET_HAIR_VARIATION_ON_STRIPPER(ped, 0, 2)
SET_TORSO_VARIATION_ON_STRIPPER(ped, 1, 1) //no tats, shirt top
SET_LEG_VARIATION_ON_STRIPPER(ped, 0, 1)
SET_FEET_VARIATION_ON_STRIPPER(ped, 0, 0) //No skirt or jewelry
SET_SPECIAL_VARIATION_ON_STIPPER(ped, 1, 0) //no bikini
SETUP_TOPLESS_VARIATION_ON_STRIPPER(ped, bTopless, 0, 0)
ENDIF
BREAK
// //non-stripper booty call
// CASE BC_FIXED_CAR //A_F_Y_Fitness_02
// //DEBUG_MESSAGE("Setting up BC_FIXED_CAR")
//
// SET_PED_COMPONENT_VARIATION(ped, PED_COMP_HEAD, 1, 0, 0)
// SET_PED_COMPONENT_VARIATION(ped, PED_COMP_HAIR, 0, 1, 0)
// SET_PED_COMPONENT_VARIATION(ped, PED_COMP_LEG, 1, 4, 0)
// SET_PED_COMPONENT_VARIATION(ped, PED_COMP_TORSO, 0, 3, 0)
// SET_PED_COMPONENT_VARIATION(ped, PED_COMP_SPECIAL, 1, 0, 0)
//
// BREAK
CASE BC_TAXI_LIZ
// A_F_Y_EASTSA_03
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_TORSO, 2, 0)
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_LEG, 0, 1)
BREAK
CASE BC_HITCHER_GIRL
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_HEAD, 0, 1, 0) //(head)
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_HAIR, 0, 1, 0) //(hair)
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_TORSO, 0, 0, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_LEG, 0, 1, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_SPECIAL, 1, 0, 0) //(accs)
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_DECL, 0, 0, 0) //(decl)
BREAK
ENDSWITCH
ENDIF
ENDPROC
FUNC STRING GET_BOOTY_CALL_VOICE(BOOTY_CALL_CONTACT_ENUM bootyCall, BOOL bIsMp = FALSE)
SWITCH bootyCall
CASE BC_STRIPPER_JULIET
RETURN "Juliet"
BREAK
CASE BC_STRIPPER_NIKKI
IF bIsMp
RETURN "NIKKI_MP"
ELSE
RETURN "Nikki"
ENDIF
BREAK
CASE BC_STRIPPER_CHASTITY
IF bIsMp
RETURN "CHASTITY_MP"
ELSE
RETURN "Chastity"
ENDIF
BREAK
CASE BC_STRIPPER_CHEETAH
RETURN "Cheetah"
BREAK
CASE BC_STRIPPER_SAPPHIRE
RETURN "Sapphire"
BREAK
CASE BC_STRIPPER_INFERNUS
RETURN "Infernus"
BREAK
CASE BC_STRIPPER_FUFU
IF bIsMp
RETURN "FUFU_MP"
ELSE
RETURN "Fufu"
ENDIF
BREAK
CASE BC_STRIPPER_PEACH
RETURN "Peach"
BREAK
// CASE BC_FIXED_CAR
// RETURN "BDownHotChick"
// BREAK
CASE BC_TAXI_LIZ
RETURN "TaxiLiz"
BREAK
CASE BC_HITCHER_GIRL
RETURN "REHH2Hiker"
BREAK
ENDSWITCH
RETURN "Invalid name"
ENDFUNC
// get booty call name as string
FUNC STRING GET_BOOTY_CALL_NAME_AS_STRING(BOOTY_CALL_CONTACT_ENUM bootyCall)
SWITCH bootyCall
CASE BC_STRIPPER_JULIET
RETURN "Juliet"
BREAK
CASE BC_STRIPPER_NIKKI
RETURN "Nikki"
BREAK
CASE BC_STRIPPER_CHASTITY
RETURN "Chastity"
BREAK
CASE BC_STRIPPER_CHEETAH
RETURN "Cheetah"
BREAK
CASE BC_STRIPPER_SAPPHIRE
RETURN "Sapphire"
BREAK
CASE BC_STRIPPER_INFERNUS
RETURN "Infernus"
BREAK
CASE BC_STRIPPER_FUFU
RETURN "Fufu"
BREAK
CASE BC_STRIPPER_PEACH
RETURN "Peach"
BREAK
// CASE BC_FIXED_CAR
// RETURN "BDownHotChick"
// BREAK
CASE BC_TAXI_LIZ
RETURN "TaxiLiz"
BREAK
CASE BC_HITCHER_GIRL
RETURN "REHH2Hiker"
BREAK
ENDSWITCH
RETURN "Invalid name"
ENDFUNC
FUNC TEXT_LABEL_15 GET_STRIPPER_NAME_AS_TEXT_LABEL(BOOTY_CALL_CONTACT_ENUM stripper)
TEXT_LABEL_15 tName = "SCLUB_NM_"
tName += ENUM_TO_INT(stripper)
RETURN tName
ENDFUNC
FUNC TEXT_LABEL_15 GET_STRIPPER_LIKE_METER_TEXT_LABEL(BOOTY_CALL_CONTACT_ENUM stripper)
TEXT_LABEL_15 tName = "SCLUB_METER_"
tName += ENUM_TO_INT(stripper)
RETURN tName
ENDFUNC
// get stripper contact enum
FUNC enumCharacterList GET_BOOTY_CALL_CONTACT_CONTACT_ENUM(BOOTY_CALL_CONTACT_ENUM bootyCall)
SWITCH bootyCall
CASE BC_STRIPPER_JULIET
RETURN CHAR_STRIPPER_JULIET
BREAK
CASE BC_STRIPPER_NIKKI
RETURN CHAR_STRIPPER_NIKKI
BREAK
CASE BC_STRIPPER_CHASTITY
RETURN CHAR_STRIPPER_CHASTITY
BREAK
CASE BC_STRIPPER_CHEETAH
RETURN CHAR_STRIPPER_CHEETAH
BREAK
CASE BC_STRIPPER_SAPPHIRE
RETURN CHAR_STRIPPER_SAPPHIRE
BREAK
CASE BC_STRIPPER_INFERNUS
RETURN CHAR_STRIPPER_INFERNUS
BREAK
CASE BC_STRIPPER_FUFU
RETURN CHAR_STRIPPER_FUFU
BREAK
CASE BC_STRIPPER_PEACH
RETURN CHAR_STRIPPER_PEACH
BREAK
// CASE BC_FIXED_CAR
// RETURN CHAR_BROKEN_DOWN_GIRL
// BREAK
CASE BC_TAXI_LIZ
RETURN CHAR_TAXI_LIZ
BREAK
CASE BC_HITCHER_GIRL
RETURN CHAR_HITCHER_GIRL
BREAK
ENDSWITCH
RETURN NO_CHARACTER
ENDFUNC
// get stripper contact from contact enum //CDM 19/8/2013
FUNC BOOTY_CALL_CONTACT_ENUM GET_BOOTY_CALL_CONTACT_ENUM_FROM_CHAR_ENUM(enumCharacterList bootyCallChar)
SWITCH bootyCallChar
CASE CHAR_STRIPPER_JULIET
RETURN BC_STRIPPER_JULIET
BREAK
CASE CHAR_STRIPPER_NIKKI
RETURN BC_STRIPPER_NIKKI
BREAK
CASE CHAR_STRIPPER_CHASTITY
RETURN BC_STRIPPER_CHASTITY
BREAK
CASE CHAR_STRIPPER_CHEETAH
RETURN BC_STRIPPER_CHEETAH
BREAK
CASE CHAR_STRIPPER_SAPPHIRE
RETURN BC_STRIPPER_SAPPHIRE
BREAK
CASE CHAR_STRIPPER_INFERNUS
RETURN BC_STRIPPER_INFERNUS
BREAK
CASE CHAR_STRIPPER_FUFU
RETURN BC_STRIPPER_FUFU
BREAK
CASE CHAR_STRIPPER_PEACH
RETURN BC_STRIPPER_PEACH
BREAK
// CASE BC_FIXED_CAR
// RETURN CHAR_BROKEN_DOWN_GIRL
// BREAK
CASE CHAR_TAXI_LIZ
RETURN BC_TAXI_LIZ
BREAK
CASE CHAR_HITCHER_GIRL
RETURN BC_HITCHER_GIRL
BREAK
ENDSWITCH
RETURN BC_STRIPPER_JULIET
ENDFUNC
FUNC MODEL_NAMES GET_NAMED_STRIPPER_MODEL_ENUM(BOOTY_CALL_CONTACT_ENUM stripperID, BOOL bHighQuality, BOOL mpStripclub = FALSE)
IF mpStripclub
RETURN mp_f_Stripperlite
ENDIF
SWITCH stripperID
CASE BC_STRIPPER_JULIET
RETURN GET_STRIPPER_MODEL(0, bHighQuality)
BREAK
CASE BC_STRIPPER_NIKKI
RETURN GET_STRIPPER_MODEL(1, bHighQuality)
BREAK
CASE BC_STRIPPER_CHASTITY
RETURN GET_STRIPPER_MODEL(0, bHighQuality)
BREAK
CASE BC_STRIPPER_CHEETAH
RETURN GET_STRIPPER_MODEL(1, bHighQuality)
BREAK
CASE BC_STRIPPER_SAPPHIRE
RETURN GET_STRIPPER_MODEL(0, bHighQuality)
BREAK
CASE BC_STRIPPER_INFERNUS
RETURN GET_STRIPPER_MODEL(1, bHighQuality)
BREAK
CASE BC_STRIPPER_FUFU
RETURN GET_STRIPPER_MODEL(0, bHighQuality)
BREAK
CASE BC_STRIPPER_PEACH
RETURN GET_STRIPPER_MODEL(1, bHighQuality)
BREAK
ENDSWITCH
RETURN GET_STRIPPER_MODEL(0, bHighQuality)
ENDFUNC
// set stripper variations
FUNC MODEL_NAMES GET_BOOTYCALL_MODEL_ENUM(BOOTY_CALL_CONTACT_ENUM stripperID, BOOL mpStripclub = FALSE)
IF mpStripclub
RETURN mp_f_Stripperlite
ENDIF
enumCharacterList eCharBootyCall = GET_BOOTY_CALL_CONTACT_CONTACT_ENUM(stripperID)
IF eCharBootyCall != NO_CHARACTER
RETURN GET_NPC_PED_MODEL(eCharBootyCall)
ENDIF
RETURN GET_STRIPPER_MODEL(0)
ENDFUNC
// get stripper touch threshold
FUNC INT GET_STRIPPER_TOUCH_THRESHOLD(BOOTY_CALL_CONTACT_ENUM stripper)
SWITCH stripper
CASE BC_STRIPPER_JULIET
RETURN FLOOR(0.40*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_NIKKI
RETURN FLOOR(0.42*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_CHASTITY
RETURN FLOOR(0.44*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_CHEETAH
RETURN FLOOR(0.39*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_SAPPHIRE
RETURN FLOOR(0.51*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_INFERNUS
RETURN FLOOR(0.53*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_FUFU
RETURN FLOOR(0.52*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_PEACH
RETURN FLOOR(0.57*STRIPPER_MAX_LIKE)
BREAK
ENDSWITCH
RETURN 0
ENDFUNC
FUNC INT GET_STRIPPER_DUO_DANCE_THRESHOLD(BOOTY_CALL_CONTACT_ENUM stripper)
SWITCH stripper
CASE BC_STRIPPER_JULIET
RETURN FLOOR(STRIPPER_DUO_DANCE_THRESHOLD*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_NIKKI
RETURN FLOOR(STRIPPER_DUO_DANCE_THRESHOLD*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_CHASTITY
RETURN FLOOR(STRIPPER_DUO_DANCE_THRESHOLD*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_CHEETAH
RETURN FLOOR(STRIPPER_DUO_DANCE_THRESHOLD*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_SAPPHIRE
RETURN FLOOR(STRIPPER_DUO_DANCE_THRESHOLD*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_INFERNUS
RETURN FLOOR(STRIPPER_DUO_DANCE_THRESHOLD*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_FUFU
RETURN FLOOR(STRIPPER_DUO_DANCE_THRESHOLD*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_PEACH
RETURN FLOOR(STRIPPER_DUO_DANCE_THRESHOLD*STRIPPER_MAX_LIKE)
BREAK
ENDSWITCH
RETURN 0
ENDFUNC
// get stripper come home threshold
FUNC INT GET_STRIPPER_COME_HOME_THRESHOLD(BOOTY_CALL_CONTACT_ENUM stripper)
SWITCH stripper
CASE BC_STRIPPER_JULIET
RETURN FLOOR(STRIPPER_COME_HOME_LIKE_THRESHOLD*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_NIKKI
RETURN FLOOR(STRIPPER_COME_HOME_LIKE_THRESHOLD*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_CHASTITY
RETURN FLOOR(STRIPPER_COME_HOME_LIKE_THRESHOLD*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_CHEETAH
RETURN FLOOR(STRIPPER_COME_HOME_LIKE_THRESHOLD*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_SAPPHIRE
RETURN FLOOR(STRIPPER_COME_HOME_LIKE_THRESHOLD*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_INFERNUS
RETURN FLOOR(STRIPPER_COME_HOME_LIKE_THRESHOLD*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_FUFU
RETURN FLOOR(STRIPPER_COME_HOME_LIKE_THRESHOLD*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_PEACH
RETURN FLOOR(STRIPPER_COME_HOME_LIKE_THRESHOLD*STRIPPER_MAX_LIKE)
BREAK
ENDSWITCH
RETURN 0
ENDFUNC
// If you've lost the strippers trust, to regain it, is much easier then the last time.
FUNC INT GET_STRIPPER_COME_BACK_HOME_THRESHOLD(BOOTY_CALL_CONTACT_ENUM stripper)
SWITCH stripper
CASE BC_STRIPPER_JULIET
RETURN FLOOR(STRIPPER_COME_BACK_HOME_LIKE_THRESHOLD*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_NIKKI
RETURN FLOOR(STRIPPER_COME_BACK_HOME_LIKE_THRESHOLD*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_CHASTITY
RETURN FLOOR(STRIPPER_COME_BACK_HOME_LIKE_THRESHOLD*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_CHEETAH
RETURN FLOOR(STRIPPER_COME_BACK_HOME_LIKE_THRESHOLD*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_SAPPHIRE
RETURN FLOOR(STRIPPER_COME_BACK_HOME_LIKE_THRESHOLD*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_INFERNUS
RETURN FLOOR(STRIPPER_COME_BACK_HOME_LIKE_THRESHOLD*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_FUFU
RETURN FLOOR(STRIPPER_COME_BACK_HOME_LIKE_THRESHOLD*STRIPPER_MAX_LIKE)
BREAK
CASE BC_STRIPPER_PEACH
RETURN FLOOR(STRIPPER_COME_BACK_HOME_LIKE_THRESHOLD*STRIPPER_MAX_LIKE)
BREAK
//Else - will never come back B*739659
// BC_FIXED_CAR,
// BC_TAXI_LIZ,
// BC_HITCHER_GIRL
DEFAULT
RETURN STRIPPER_MAX_LIKE
BREAK
ENDSWITCH
RETURN 0
ENDFUNC
FUNC BOOL IS_STRIPPER_BOOTYCALL_STRIPPER(BOOTY_CALL_CONTACT_ENUM stripper)
SWITCH stripper
CASE BC_STRIPPER_JULIET
CASE BC_STRIPPER_NIKKI
CASE BC_STRIPPER_SAPPHIRE
CASE BC_STRIPPER_INFERNUS
RETURN TRUE
BREAK
//These strippers will never be willing for bootycall
CASE BC_STRIPPER_CHASTITY
CASE BC_STRIPPER_CHEETAH
CASE BC_STRIPPER_FUFU
CASE BC_STRIPPER_PEACH
RETURN FALSE
BREAK
//CASE BC_FIXED_CAR
CASE BC_TAXI_LIZ
CASE BC_HITCHER_GIRL
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_STRIPPER_AVAILABLE_AT_THIS_TIME_OF_DAY(BOOTY_CALL_CONTACT_ENUM stripper)
SWITCH stripper
CASE BC_STRIPPER_JULIET
CASE BC_STRIPPER_NIKKI
CASE BC_STRIPPER_CHASTITY
CASE BC_STRIPPER_CHEETAH
CASE BC_STRIPPER_SAPPHIRE
CASE BC_STRIPPER_INFERNUS
CASE BC_STRIPPER_FUFU
CASE BC_STRIPPER_PEACH
IF GET_CLOCK_HOURS() < 6 OR GET_CLOCK_HOURS() > 14 //the stripper will only agree if it's not between the hours of 6am-2pm
RETURN TRUE
ENDIF
BREAK
//CASE BC_FIXED_CAR
CASE BC_TAXI_LIZ
CASE BC_HITCHER_GIRL
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC STRIP_CLUB_PLAYER_CHAR_ENUM GET_STRIP_CLUB_PLAYER_PED_ENUM()
enumCharacterList PlayerChar = GET_CURRENT_PLAYER_PED_ENUM()
SWITCH PlayerChar
CASE CHAR_MICHAEL
RETURN STRIP_CLUB_PLAYER_CHAR_MICHAEL
BREAK
CASE CHAR_FRANKLIN
RETURN STRIP_CLUB_PLAYER_CHAR_FRANKLIN
BREAK
CASE CHAR_TREVOR
RETURN STRIP_CLUB_PLAYER_CHAR_TREVOR
BREAK
DEFAULT
//Must be in MP, get appopiate MP enum
// PRINTLN("Get Stripclub MP ID for slot ", GET_SLOT_NUMBER(-1))
SWITCH GET_SLOT_NUMBER(-1)
CASE 0
RETURN STRIP_CLUB_PLAYER_CHAR_MULTI_0
BREAK
CASE 1
RETURN STRIP_CLUB_PLAYER_CHAR_MULTI_1
BREAK
CASE 2
RETURN STRIP_CLUB_PLAYER_CHAR_MULTI_2
BREAK
CASE 3
RETURN STRIP_CLUB_PLAYER_CHAR_MULTI_3
BREAK
CASE 4
RETURN STRIP_CLUB_PLAYER_CHAR_MULTI_4
BREAK
DEFAULT
SCRIPT_ASSERT("Invalid stripclub player ID")
BREAK
ENDSWITCH
BREAK
ENDSWITCH
RETURN STRIP_CLUB_PLAYER_CHAR_MULTI_0
ENDFUNC
PROC SET_STRIPCLUB_USING_BAR(BOOL bUsing)
IF bUsing
SET_BITMASK_AS_ENUM(g_StripclubGlobals.iStripclubFlags, GSF_USING_BAR)
ELSE
CLEAR_BITMASK_AS_ENUM(g_StripclubGlobals.iStripclubFlags, GSF_USING_BAR)
ENDIF
ENDPROC
FUNC BOOL IS_STRIPCLUB_USING_BAR()
RETURN IS_BITMASK_AS_ENUM_SET(g_StripclubGlobals.iStripclubFlags, GSF_USING_BAR)
ENDFUNC
FUNC INT GET_STRIPCLUB_AMOUNT_OF_ALCOHOL()
RETURN Get_Peds_Drunk_Alcohol_Hit_Count(PLAYER_PED_ID())
ENDFUNC
PROC INC_STRIPCLUB_DRINKS()
Player_Takes_Alcohol_Hit(PLAYER_PED_ID())
ENDPROC
PROC SET_STRIPCLUB_GLOBAL_HOSTILE(BOOL bIsHostile)
IF bIsHostile
SET_BITMASK_AS_ENUM(g_StripclubGlobals.iStripclubFlags, GSF_SENT_CLUB_HOSTILE)
ELSE
CLEAR_BITMASK_AS_ENUM(g_StripclubGlobals.iStripclubFlags, GSF_SENT_CLUB_HOSTILE)
ENDIF
ENDPROC
FUNC BOOL IS_STRIPCLUB_GLOBAL_HOSTILE_FLAG_SET()
RETURN IS_BITMASK_AS_ENUM_SET(g_StripclubGlobals.iStripclubFlags, GSF_SENT_CLUB_HOSTILE)
ENDFUNC
PROC SET_STRIPCLUB_GLOBAL_FRONT_BOUNCER_DEAD(BOOL bIsDead)
IF bIsDead
SET_BITMASK_AS_ENUM(g_StripclubGlobals.iStripclubFlags, GSF_FRONT_BOUNCER_DEAD)
ELSE
CLEAR_BITMASK_AS_ENUM(g_StripclubGlobals.iStripclubFlags, GSF_FRONT_BOUNCER_DEAD)
ENDIF
ENDPROC
PROC SET_STRIPCLUB_GLOBAL_FRONT_BOUNCER_HAS_BEEN_CREATED(BOOL bIsCreated)
IF bIsCreated
SET_BITMASK_AS_ENUM(g_StripclubGlobals.iStripclubFlags, GSF_FRONT_BOUNCER_EXISTS)
ELSE
CLEAR_BITMASK_AS_ENUM(g_StripclubGlobals.iStripclubFlags, GSF_FRONT_BOUNCER_EXISTS)
ENDIF
ENDPROC
PROC SET_STRIPCLUB_GLOBAL_FORCE_CREATE_FRONT_BOUNCER(BOOL bIsCreated)
IF bIsCreated
SET_BITMASK_AS_ENUM(g_StripclubGlobals.iStripclubFlags, GSF_FORCE_CREATE_FRONT_BOUNCER)
ELSE
CLEAR_BITMASK_AS_ENUM(g_StripclubGlobals.iStripclubFlags, GSF_FORCE_CREATE_FRONT_BOUNCER)
ENDIF
ENDPROC
FUNC BOOL IS_STRIPCLUB_GLOBAL_FRONT_BOUNCER_DEAD()
RETURN IS_BITMASK_AS_ENUM_SET(g_StripclubGlobals.iStripclubFlags, GSF_FRONT_BOUNCER_DEAD)
ENDFUNC
FUNC BOOL HAS_STRIPCLUB_GLOBAL_FRONT_BOUNCER_BEEN_CREATED()
RETURN IS_BITMASK_AS_ENUM_SET(g_StripclubGlobals.iStripclubFlags, GSF_FRONT_BOUNCER_EXISTS)
ENDFUNC
FUNC BOOL IS_STRIPCLUB_GLOBAL_FORCE_FRONT_BOUNCER_BE_CREATED()
RETURN IS_BITMASK_AS_ENUM_SET(g_StripclubGlobals.iStripclubFlags, GSF_FORCE_CREATE_FRONT_BOUNCER)
ENDFUNC
PROC SET_STRIPCLUB_GLOBAL_GETTING_LAPDANCE(BOOL bSet)
IF bSet
SET_BITMASK_AS_ENUM(g_StripclubGlobals.iStripclubFlags, GSF_GETTING_LAP_DANCE)
ELSE
CLEAR_BITMASK_AS_ENUM(g_StripclubGlobals.iStripclubFlags, GSF_GETTING_LAP_DANCE)
ENDIF
ENDPROC
PROC SET_STRIPCLUB_GLOBAL_THROWN_OUT(BOOL bSet)
IF bSet
SET_BITMASK_AS_ENUM(g_StripclubGlobals.iStripclubFlags, GSF_THROWN_OUT_OF_CLUB)
ELSE
CLEAR_BITMASK_AS_ENUM(g_StripclubGlobals.iStripclubFlags, GSF_THROWN_OUT_OF_CLUB)
ENDIF
ENDPROC
FUNC BOOL IS_STRIPCLUB_GLOBAL_THROWN_OUT_SET()
RETURN IS_BITMASK_AS_ENUM_SET(g_StripclubGlobals.iStripclubFlags, GSF_THROWN_OUT_OF_CLUB)
ENDFUNC
PROC SET_STRIPCLUB_POST_HEIST_SCENE_PLAYING(BOOL bSet)
IF bSet
SET_BITMASK_AS_ENUM(g_StripclubGlobals.iStripclubFlags, GSF_POST_HEIST_SCENE_IS_PLAYING)
ELSE
CLEAR_BITMASK_AS_ENUM(g_StripclubGlobals.iStripclubFlags, GSF_POST_HEIST_SCENE_IS_PLAYING)
ENDIF
ENDPROC
FUNC BOOL IS_STRIPCLUB_POST_HEIST_SCENE_PLAYING()
RETURN IS_BITMASK_AS_ENUM_SET(g_StripclubGlobals.iStripclubFlags, GSF_POST_HEIST_SCENE_IS_PLAYING)
ENDFUNC
// get like for stripper ID
FUNC INT GET_LIKE_FOR_STRIPPER_ID(BOOTY_CALL_CONTACT_ENUM stripperID)
RETURN g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[stripperID].iLike
ENDFUNC
// set like for stripper ID
PROC SET_LIKE_FOR_STRIPPER_ID(BOOTY_CALL_CONTACT_ENUM stripperID, INT i)
g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[stripperID].iLike = i
ENDPROC
FUNC BOOL WAS_STRIPPER_ATTACKED_ON_BOOTY_CALL(BOOTY_CALL_CONTACT_ENUM stripperID)
RETURN IS_BITMASK_AS_ENUM_SET(g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[stripperID].iBCCBits,GBF_INJURED_ON_CALL)
ENDFUNC
PROC SET_STRIPPER_ATTACKED_ON_BOOTY_CALL(BOOTY_CALL_CONTACT_ENUM stripperID, BOOL bWasAttacked = TRUE)
IF bWasAttacked
SET_BITMASK_AS_ENUM(g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[stripperID].iBCCBits,GBF_INJURED_ON_CALL)
ELSE
CLEAR_BITMASK_AS_ENUM(g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[stripperID].iBCCBits,GBF_INJURED_ON_CALL)
ENDIF
ENDPROC
FUNC BOOL WAS_STRIPPER_CALLED_AFTER_ATTACKED(BOOTY_CALL_CONTACT_ENUM stripperID)
RETURN IS_BITMASK_AS_ENUM_SET(g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[stripperID].iBCCBits,GBF_CALLED_AFTER_INJURED)
ENDFUNC
PROC SET_STRIPPER_CALLED_AFTER_ATTACKED(BOOTY_CALL_CONTACT_ENUM stripperID, BOOL bWasCalled = TRUE)
IF bWasCalled
SET_BITMASK_AS_ENUM(g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[stripperID].iBCCBits,GBF_CALLED_AFTER_INJURED)
ELSE
CLEAR_BITMASK_AS_ENUM(g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[stripperID].iBCCBits,GBF_CALLED_AFTER_INJURED)
ENDIF
ENDPROC
PROC SET_STRIPPER_HAS_MEET_PLAYER(BOOTY_CALL_CONTACT_ENUM stripperID, BOOL bSet)
IF bSet
SET_BITMASK_AS_ENUM(g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[stripperID].iBCCBits, GBF_MEET_PLAYER)
ELSE
CLEAR_BITMASK_AS_ENUM(g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[stripperID].iBCCBits, GBF_MEET_PLAYER)
ENDIF
ENDPROC
FUNC BOOL HAS_STRIPPER_MEET_PLAYER(BOOTY_CALL_CONTACT_ENUM stripperID)
RETURN IS_BITMASK_AS_ENUM_SET(g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[stripperID].iBCCBits, GBF_MEET_PLAYER)
ENDFUNC
FUNC BOOL DOES_STRIPPER_LIKE_PLAYER_ENOUGH_TO_COME_HOME(BOOTY_CALL_CONTACT_ENUM stripper )
IF WAS_STRIPPER_ATTACKED_ON_BOOTY_CALL(stripper)
RETURN GET_LIKE_FOR_STRIPPER_ID(stripper) >= GET_STRIPPER_COME_BACK_HOME_THRESHOLD(stripper)
ELSE
RETURN GET_LIKE_FOR_STRIPPER_ID(stripper) >= GET_STRIPPER_COME_HOME_THRESHOLD(stripper)
ENDIF
ENDFUNC
// get reputation in club
FUNC INT GET_CLUB_REPUTATION(STRIP_CLUB_ENUM sCE)
RETURN g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].stripClub[sCE].iReputation
ENDFUNC
FUNC INT GET_CLUB_DISLIKE_THRESHOLD(STRIP_CLUB_ENUM sCE)
IF sCE = STRIP_CLUB_LOW
RETURN 35
ENDIF
RETURN 35
ENDFUNC
// does the club as a whole dislike the player?
FUNC BOOL IS_PLAYER_DISLIKED_BY_CLUB(STRIP_CLUB_ENUM sCE)
IF GET_CLUB_REPUTATION(sCE) <= GET_CLUB_DISLIKE_THRESHOLD(sCE)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
// does the club as a whole like the player?
FUNC BOOL IS_PLAYER_LIKED_BY_CLUB(STRIP_CLUB_ENUM sCE)
INT iLikeThreshold
SWITCH sCE
CASE STRIP_CLUB_LOW
iLikeThreshold = 65
BREAK
ENDSWITCH
IF GET_CLUB_REPUTATION(sCE) >= iLikeThreshold
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
// get is booty call for stripper ID
FUNC BOOL IS_BOOTY_CALL_ID_ACTIVATED(BOOTY_CALL_CONTACT_ENUM bootyCallID, STRIP_CLUB_PLAYER_CHAR_ENUM forCharacter = -1)
IF forCharacter < STRIP_CLUB_PLAYER_CHAR_MICHAEL
forCharacter = GET_STRIP_CLUB_PLAYER_PED_ENUM()
ENDIF
RETURN g_savedGlobals.sStripClubData[forCharacter].bootyCall[bootyCallID].bActivated
ENDFUNC
// set the # of times that the player has ignored the stripper's booty call
PROC SET_STRIPPER_NUM_BOOTY_DENIALS_BY_PLAYER(BOOTY_CALL_CONTACT_ENUM bootyCallID, INT iNumDenials)
//set # of denials to zero
g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[bootyCallID].iNumPlayerDenials = iNumDenials
ENDPROC
// get the # of times that the player has ignored the stripper's booty call
FUNC INT GET_STRIPPER_NUM_BOOTY_DENIALS_BY_PLAYER(BOOTY_CALL_CONTACT_ENUM bootyCallID)
IF g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[bootyCallID].iNumPlayerDenials < 0
g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[bootyCallID].iNumPlayerDenials = 0
ENDIF
RETURN g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[bootyCallID].iNumPlayerDenials
ENDFUNC
// increment the # of times that the player has ignored the stripper's booty call
PROC INCREMENT_STRIPPER_NUM_BOOTY_DENIALS_BY_PLAYER(BOOTY_CALL_CONTACT_ENUM bootyCallID)
IF g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[bootyCallID].iNumPlayerDenials < 0
g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[bootyCallID].iNumPlayerDenials = 0
ENDIF
++g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[bootyCallID].iNumPlayerDenials
ENDPROC
// set the # of times that the player has ignored the stripper's booty call
PROC SET_NUM_SEXTS_SENT_BY_STRIPPER(BOOTY_CALL_CONTACT_ENUM bootyCallID, INT iSextsSent)
g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[bootyCallID].iSextsSent = iSextsSent
ENDPROC
// get the # of times that the player has ignored the stripper's booty call
FUNC INT GET_NUM_SEXTS_SENT_BY_STRIPPER(BOOTY_CALL_CONTACT_ENUM bootyCallID)
RETURN g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[bootyCallID].iSextsSent
ENDFUNC
// increments the # of times that the player has ignored the stripper's booty call
PROC INCREMENT_NUM_SEXTS_SENT_BY_STRIPPER(BOOTY_CALL_CONTACT_ENUM bootyCallID)
IF GET_NUM_SEXTS_SENT_BY_STRIPPER(bootyCallID) < 0
SET_NUM_SEXTS_SENT_BY_STRIPPER(bootyCallID, 0)
ENDIF
++g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[bootyCallID].iSextsSent
ENDPROC
// get a specific strippers text message composite part ID for a sext.
// used to build up a text message label on the comms controller at time of sending.
// NB. comms string data now found in x:\gta5\script\dev\singleplayer\include\public\comms_control_data_GTA5.sch. -BenR
FUNC CC_TextPart GET_TEXT_PARTID_FOR_STRIPPER(BOOTY_CALL_CONTACT_ENUM stripper)
SWITCH stripper
CASE BC_STRIPPER_JULIET RETURN TPART_SEXT_JULIET BREAK
CASE BC_STRIPPER_NIKKI RETURN TPART_SEXT_NIKKI BREAK
CASE BC_STRIPPER_SAPPHIRE RETURN TPART_SEXT_SAPPHIRE BREAK
CASE BC_STRIPPER_INFERNUS RETURN TPART_SEXT_INFERNUS BREAK
CASE BC_TAXI_LIZ RETURN TPART_SEXT_LIZ BREAK
CASE BC_HITCHER_GIRL RETURN TPART_SEXT_HITCHER BREAK
ENDSWITCH
SCRIPT_ASSERT("GET_TEXT_PARTID_FOR_STRIPPER: Invalid stripper enum passed.")
RETURN TPART_NONE
ENDFUNC
// get a sext count specific text message composite part ID for a sext.
// used to build up a text message label on the comms controller at time of sending.
// NB. comms string data now found in x:\gta5\script\dev\singleplayer\include\public\comms_control_data_GTA5.sch. -BenR
FUNC CC_TextPart GET_TEXT_PARTID_FOR_SEXT_COUNT(INT iNoSextsSent)
SWITCH iNoSextsSent
CASE 0 RETURN TPART_SEXT_NEED BREAK
CASE 1 RETURN TPART_SEXT_1 BREAK
CASE 2 RETURN TPART_SEXT_2 BREAK
ENDSWITCH
SCRIPT_ASSERT("GET_TEXT_PARTID_FOR_SEXT_COUNT: Trying to get TextPart ID for a stripper who has sent too many sexts.")
RETURN TPART_NONE
ENDFUNC
// get correct phonebook to add stripper to
FUNC enumPhonebookPresence GET_PHONEBOOK_TO_ADD_STRIPPER(STRIP_CLUB_PLAYER_CHAR_ENUM forCharacter)
SWITCH forCharacter
CASE STRIP_CLUB_PLAYER_CHAR_MICHAEL
RETURN MICHAEL_BOOK
BREAK
CASE STRIP_CLUB_PLAYER_CHAR_TREVOR
RETURN TREVOR_BOOK
BREAK
CASE STRIP_CLUB_PLAYER_CHAR_FRANKLIN
RETURN FRANKLIN_BOOK
BREAK
CASE STRIP_CLUB_PLAYER_CHAR_MULTI_0
CASE STRIP_CLUB_PLAYER_CHAR_MULTI_1
CASE STRIP_CLUB_PLAYER_CHAR_MULTI_2
CASE STRIP_CLUB_PLAYER_CHAR_MULTI_3
CASE STRIP_CLUB_PLAYER_CHAR_MULTI_4
RETURN MULTIPLAYER_BOOK
BREAK
ENDSWITCH
RETURN ALL_OWNERS_BOOKS
ENDFUNC
// advance next call player time
PROC SET_NEXT_CALL_PLAYER_TIME(INT i = -1)
PRINTLN("Setting next girl sext player time to ", i)
IF i <> -1
// if we passed in an int, adjust by this time
g_bootyCallData.iNextCallPlayerTime = GET_GAME_TIMER() + i
ELSE
// otherwise increase by a random time
g_bootyCallData.iNextCallPlayerTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(ADVANCE_NEXT_CALL_PLAYER_TIME_MIN, ADVANCE_NEXT_CALL_PLAYER_TIME_MAX)
ENDIF
ENDPROC
// advance next available time
PROC SET_NEXT_STRIPPER_BOOTY_CALL_AVAILABLE_TIME(INT i, INT iTime = -1)
IF iTime > -1
g_bootyCallData.iNextAvailableTime[i] = GET_GAME_TIMER() + iTime
ELSE
g_bootyCallData.iNextAvailableTime[i] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(ADVANCE_NEXT_BOOTY_CALL_AVAILABLE_TIME_MIN, ADVANCE_NEXT_BOOTY_CALL_AVAILABLE_TIME_MAX)
ENDIF
ENDPROC
// set is booty call for stripper ID
PROC SET_BOOTY_CALL_ID_ACTIVATED(BOOTY_CALL_CONTACT_ENUM bootyCallID, BOOl bSetIsBootyCall, STRIP_CLUB_PLAYER_CHAR_ENUM forCharacter = -1)
IF forCharacter < STRIP_CLUB_PLAYER_CHAR_MICHAEL
forCharacter = GET_STRIP_CLUB_PLAYER_PED_ENUM()
ENDIF
IF GET_PHONEBOOK_TO_ADD_STRIPPER(forCharacter) = ALL_OWNERS_BOOKS
//this should never happen. Adding assert at the request of Keith
SCRIPT_ASSERT("Trying to add stripper number to ALL_OWNERS. Shouldn't be doing this.")
ENDIF
BOOL bAlreadySet = g_savedGlobals.sStripClubData[forCharacter].bootyCall[bootyCallID].bActivated
//B*-2383107
//if marked as already in phonebook, double check phone book.
IF bAlreadySet
IF NETWORK_IS_GAME_IN_PROGRESS()
IF NOT IS_CONTACT_IN_PHONEBOOK(GET_BOOTY_CALL_CONTACT_CONTACT_ENUM(bootyCallID), MULTIPLAYER_BOOK)
bAlreadySet = FALSE
ENDIF
ELSE
IF NOT IS_CONTACT_IN_PHONEBOOK(GET_BOOTY_CALL_CONTACT_CONTACT_ENUM(bootyCallID), ALL_OWNERS_BOOKS)
bAlreadySet = FALSE
ENDIF
ENDIF
ENDIF
//B*-2383107
g_savedGlobals.sStripClubData[forCharacter].bootyCall[bootyCallID].bActivated = bSetIsBootyCall
IF bSetIsBootyCall
// add to the phone book if not already added
IF NOT bAlreadySet
SET_STRIPPER_NUM_BOOTY_DENIALS_BY_PLAYER(bootyCallID, 0)
ADD_CONTACT_TO_PHONEBOOK(GET_BOOTY_CALL_CONTACT_CONTACT_ENUM(bootyCallID), GET_PHONEBOOK_TO_ADD_STRIPPER(forCharacter))
INT AvilableTime = GET_RANDOM_INT_IN_RANGE(INITIAL_NEXT_CALL_PLAYER_TIME_MIN, INITIAL_NEXT_CALL_PLAYER_TIME_MAX)
#IF USE_TU_CHANGES
SWITCH forCharacter
CASE STRIP_CLUB_PLAYER_CHAR_MULTI_0
CASE STRIP_CLUB_PLAYER_CHAR_MULTI_1
CASE STRIP_CLUB_PLAYER_CHAR_MULTI_2
CASE STRIP_CLUB_PLAYER_CHAR_MULTI_3
CASE STRIP_CLUB_PLAYER_CHAR_MULTI_4
SET_BIT(g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iStripperUnlockedBS,ENUM_TO_INT(bootyCallID))
PRINTLN("SET_BOOTY_CALL_ID_ACTIVATED: setting stripper gave player number for #", ENUM_TO_INT(bootyCallID))
REQUEST_SAVE(SSR_REASON_STRIP_CLUB, STAT_SAVETYPE_SCRIPT_MP_GLOBALS)
BREAK
ENDSWITCH
#ENDIF // USE_TU_CHANGES
SET_NEXT_CALL_PLAYER_TIME(AvilableTime)
SET_NEXT_STRIPPER_BOOTY_CALL_AVAILABLE_TIME(ENUM_TO_INT(bootyCallID), AvilableTime)
g_bootyCallData.iAddNumberTime[ENUM_TO_INT(bootyCallID)] = GET_GAME_TIMER()
ENDIF
ELSE
// remove from the phone book if in there
IF bAlreadySet
REMOVE_CONTACT_FROM_INDIVIDUAL_PHONEBOOK(GET_BOOTY_CALL_CONTACT_CONTACT_ENUM(bootyCallID), GET_PHONEBOOK_TO_ADD_STRIPPER(forCharacter))
ENDIF
ENDIF
// set the debug widget tickbox for activated
#IF IS_DEBUG_BUILD
g_bDebugSetAsBootyCall[ENUM_TO_INT(bootyCallID)][forCharacter] = bSetIsBootyCall
#ENDIF
ENDPROC
// is take home script currently running?
FUNC BOOL IS_PLAYER_ON_BOOTY_CALL()
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("stripperhome")) > 0
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL STRIPCLUB_IS_PLAYER_ON_MISSION()
IF IS_CURRENTLY_ON_MISSION_OF_ANY_TYPE()
IF NOT DOES_ENTITY_EXIST(FRIEND_A_PED_ID()) // on friend activity
AND NOT IS_PLAYER_ON_BOOTY_CALL() //running bootycall script, not on real mission
AND NOT Is_Player_Timetable_Scene_In_Progress()
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
// can we start a take home?
FUNC BOOL CAN_TAKE_HOME_STRIPPER()
IF IS_CURRENTLY_ON_MISSION_OF_ANY_TYPE()
OR g_bPreventStripperApproach
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
// prevent stripper approach (for heists, might be useful somewhere else?)
PROC SET_STRIPPER_APPROACH_ENABLED(BOOL bEnabled)
IF bEnabled
g_bPreventStripperApproach = FALSE
ELSE
g_bPreventStripperApproach = TRUE
ENDIF
ENDPROC
// disable strip club
PROC DISABLE_STRIP_CLUBS()
#IF IS_DEBUG_BUILD
PRINTSTRING("DISABLE_STRIP_CLUBS() called by script ") PRINTSTRING(GET_THIS_SCRIPT_NAME()) PRINTNL()
#ENDIF
g_bDisableStripClubs = TRUE
ENDPROC
// enable strip club
PROC ENABLE_STRIP_CLUBS()
#IF IS_DEBUG_BUILD
PRINTSTRING("ENABLE_STRIP_CLUBS() called by script ") PRINTSTRING(GET_THIS_SCRIPT_NAME()) PRINTNL()
#ENDIF
g_bDisableStripClubs = FALSE
ENDPROC
// set back to inactive
PROC RESET_BOOTY_CALL_TO_INACTIVE(BOOL bSetNextCallTime)
g_bootyCallData.bootyCallState = BOOTY_CALL_INACTIVE
g_bootyCallData.iStripperCalling = -1
g_bootyCallData.iBootyCallID = -1
IF bSetNextCallTime
SET_NEXT_CALL_PLAYER_TIME()
ENDIF
ENDPROC
FUNC INT GET_STRIPPER_INITIAL_LIKE_FOR_PLAYER(STRIP_CLUB_PLAYER_CHAR_ENUM ePlayer, BOOTY_CALL_CONTACT_ENUM eStripper)
FLOAT fInitialLikePercent = 0.0
IF ePlayer >= STRIP_CLUB_PLAYER_CHAR_MULTI_0
RETURN FLOOR(0.10*STRIPPER_MAX_LIKE)
ENDIF
SWITCH eStripper
CASE BC_STRIPPER_JULIET
IF ePlayer = STRIP_CLUB_PLAYER_CHAR_MICHAEL
fInitialLikePercent = 0.3
ELIF ePlayer = STRIP_CLUB_PLAYER_CHAR_FRANKLIN
fInitialLikePercent = 0.3
ELIF ePlayer = STRIP_CLUB_PLAYER_CHAR_TREVOR
fInitialLikePercent = 0.01
ENDIF
BREAK
CASE BC_STRIPPER_NIKKI
IF ePlayer = STRIP_CLUB_PLAYER_CHAR_MICHAEL
fInitialLikePercent = 0.15
ELIF ePlayer = STRIP_CLUB_PLAYER_CHAR_FRANKLIN
fInitialLikePercent = 0.15
ELIF ePlayer = STRIP_CLUB_PLAYER_CHAR_TREVOR
fInitialLikePercent = 0.01
ENDIF
BREAK
CASE BC_STRIPPER_CHASTITY
IF ePlayer = STRIP_CLUB_PLAYER_CHAR_MICHAEL
fInitialLikePercent = 0.15
ELIF ePlayer = STRIP_CLUB_PLAYER_CHAR_FRANKLIN
fInitialLikePercent = 0.3
ELIF ePlayer = STRIP_CLUB_PLAYER_CHAR_TREVOR
fInitialLikePercent = 0.15
ENDIF
BREAK
CASE BC_STRIPPER_CHEETAH
IF ePlayer = STRIP_CLUB_PLAYER_CHAR_MICHAEL
fInitialLikePercent = 0.1
ELIF ePlayer = STRIP_CLUB_PLAYER_CHAR_FRANKLIN
fInitialLikePercent = 0.3
ELIF ePlayer = STRIP_CLUB_PLAYER_CHAR_TREVOR
fInitialLikePercent = 0.1
ENDIF
BREAK
CASE BC_STRIPPER_SAPPHIRE
IF ePlayer = STRIP_CLUB_PLAYER_CHAR_MICHAEL
fInitialLikePercent = 0.3
ELIF ePlayer = STRIP_CLUB_PLAYER_CHAR_FRANKLIN
fInitialLikePercent = 0.15
ELIF ePlayer = STRIP_CLUB_PLAYER_CHAR_TREVOR
fInitialLikePercent = 0.01
ENDIF
BREAK
CASE BC_STRIPPER_INFERNUS
IF ePlayer = STRIP_CLUB_PLAYER_CHAR_MICHAEL
fInitialLikePercent = 0.15
ELIF ePlayer = STRIP_CLUB_PLAYER_CHAR_FRANKLIN
fInitialLikePercent = 0.30
ELIF ePlayer = STRIP_CLUB_PLAYER_CHAR_TREVOR
fInitialLikePercent = 0.01
ENDIF
BREAK
CASE BC_STRIPPER_FUFU
IF ePlayer = STRIP_CLUB_PLAYER_CHAR_MICHAEL
fInitialLikePercent = 0.30
ELIF ePlayer = STRIP_CLUB_PLAYER_CHAR_FRANKLIN
fInitialLikePercent = 0.15
ELIF ePlayer = STRIP_CLUB_PLAYER_CHAR_TREVOR
fInitialLikePercent = 0.01
ENDIF
BREAK
CASE BC_STRIPPER_PEACH
IF ePlayer = STRIP_CLUB_PLAYER_CHAR_MICHAEL
fInitialLikePercent = 0.15
ELIF ePlayer = STRIP_CLUB_PLAYER_CHAR_FRANKLIN
fInitialLikePercent = 0.15
ELIF ePlayer = STRIP_CLUB_PLAYER_CHAR_TREVOR
fInitialLikePercent = 0.30
ENDIF
BREAK
ENDSWITCH
RETURN FLOOR(fInitialLikePercent*STRIPPER_MAX_LIKE)
ENDFUNC
// initialise all strip club data on clean boot
PROC Initialise_Strip_Club_Global_Variables_On_Startup()
INT i, j
REPEAT COUNT_OF(STRIP_CLUB_PLAYER_CHAR_ENUM) j
// initialise club rep
REPEAT COUNT_OF(STRIP_CLUB_ENUM) i
g_savedGlobals.sStripClubData[j].stripClub[i].iReputation = 50
ENDREPEAT
// initialise stripper like
REPEAT COUNT_OF(BOOTY_CALL_CONTACT_ENUM) i
g_savedGlobals.sStripClubData[j].bootyCall[i].iLike = GET_STRIPPER_INITIAL_LIKE_FOR_PLAYER(INT_TO_ENUM(STRIP_CLUB_PLAYER_CHAR_ENUM, j), INT_TO_ENUM(BOOTY_CALL_CONTACT_ENUM, i))
g_savedGlobals.sStripClubData[j].bootyCall[i].bActivated = FALSE
ENDREPEAT
ENDREPEAT
ENDPROC
FUNC BOOL DID_BOOTYCALL_WITNESS_PLAYER_STEALING_CAR(PED_INDEX bootyCallPed)
IF NOT IS_ENTITY_DEAD(bootyCallPed)
IF IS_SHOCKING_EVENT_IN_SPHERE( EVENT_SHOCKING_SEEN_CAR_STOLEN, GET_ENTITY_COORDS(PLAYER_PED_ID()) ,10.0)
AND HAS_ENTITY_CLEAR_LOS_TO_ENTITY_IN_FRONT(bootyCallPed,PLAYER_PED_ID())
//CDEBUG1LN(DEBUG_BOOTY_CALL,"DID_BOOTYCALL_WITNESS_PLAYER_STEALING_CAR - Booty call witnessed player stealing new car")
RETURN TRUE
// ELSE
// CDEBUG1LN(DEBUG_BOOTY_CALL,"DID_BOOTYCALL_WITNESS_PLAYER_STEALING_CAR - Waiting....")
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL DID_PLAYERS_VEHICLE_TAKE_DAMAGE_WHILE_DRIVING(PED_INDEX bootyCallPed, INT& iVehicleHealth)
VEHICLE_INDEX vehPlayers = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF IS_VEHICLE_DRIVEABLE(vehPlayers)
IF IS_PED_SITTING_IN_VEHICLE(bootyCallPed,vehPlayers )
IF HAS_ENTITY_COLLIDED_WITH_ANYTHING(vehPlayers)
INT iCurrentVehicleHealth = GET_ENTITY_HEALTH(vehPlayers)
INT iSizeOfImpact = iVehicleHealth - iCurrentVehicleHealth
iVehicleHealth = iCurrentVehicleHealth
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(vehPlayers)
IF iSizeOfImpact > 10
CDEBUG1LN(DEBUG_BOOTY_CALL,"DID_PLAYERS_VEHICLE_TAKE_DAMAGE_WHILE_DRIVING - Car got hit!")
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL DID_PLAYER_HIT_PED_IN_WHILE_DRIVING()
VEHICLE_INDEX vehPlayers = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
//Hit Peds
IF IS_VEHICLE_DRIVEABLE(vehPlayers)
IF GET_PED_IN_VEHICLE_SEAT(vehPlayers,VS_DRIVER) = PLAYER_PED_ID()
IF HAS_PLAYER_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CDEBUG1LN(DEBUG_BOOTY_CALL,"DID_PLAYER_HIT_PED_IN_WHILE_DRIVING - Somebody got hit!")
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
#IF IS_DEBUG_BUILD
// debug: create widgets for strip club/booty calls
PROC CREATE_STRIP_CLUB_WIDGETS(WIDGET_GROUP_ID scWidgetGroup)
INT i, j, k
// placate the unreferenced variable spirits
scWidgetGroup = scWidgetGroup
scWidgetGroup = START_WIDGET_GROUP("Strip Club/Booty Calls")
ADD_WIDGET_STRING("****For Camera Team****")
ADD_WIDGET_BOOL("Launch Final Scene Widget for Luke", g_bTurnOnLukeHCameraDebug)
ADD_WIDGET_STRING("Strip Club Specific")
ADD_WIDGET_BOOL("Disable Strip Club",g_bDisableStripClubs)
ADD_WIDGET_BOOL("Update Strip Club Info", g_bDebugRefreshOnce)
ADD_WIDGET_BOOL("Show stripper stand points", g_bDebugDisplayStripperPoints)
ADD_WIDGET_STRING("Booty Call Specific")
ADD_WIDGET_INT_READ_ONLY("Next call player time", g_bootyCallData.iNextCallPlayerTime)
ADD_WIDGET_BOOL("Force bootycall accept", g_bDebugForceBootyCall)
ADD_WIDGET_BOOL("Force bootycall decline", g_bDebugForceBootyCallDecline)
ADD_WIDGET_BOOL("Advance next booty call time", g_bDebugAdvanceBootyCallTimes)
ADD_WIDGET_BOOL("Max out like", g_bDebugMaxOutLike)
START_WIDGET_GROUP("Add Booty Call Contacts:")
ADD_WIDGET_BOOL("Juliet", g_bDebugAddContact[BC_STRIPPER_JULIET])
ADD_WIDGET_INT_READ_ONLY("Like",g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[BC_STRIPPER_JULIET].iLike)
ADD_WIDGET_BOOL("Nikki", g_bDebugAddContact[BC_STRIPPER_NIKKI])
ADD_WIDGET_INT_READ_ONLY("Like",g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[BC_STRIPPER_NIKKI].iLike)
ADD_WIDGET_BOOL("Sapphire", g_bDebugAddContact[BC_STRIPPER_SAPPHIRE])
ADD_WIDGET_INT_READ_ONLY("Like",g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[BC_STRIPPER_SAPPHIRE].iLike)
ADD_WIDGET_BOOL("Infernus", g_bDebugAddContact[BC_STRIPPER_INFERNUS])
ADD_WIDGET_INT_READ_ONLY("Like",g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[BC_STRIPPER_INFERNUS].iLike)
ADD_WIDGET_BOOL("Liz", g_bDebugAddContact[BC_TAXI_LIZ])
ADD_WIDGET_INT_READ_ONLY("Like",g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[BC_TAXI_LIZ].iLike)
ADD_WIDGET_BOOL("Hitcher", g_bDebugAddContact[BC_HITCHER_GIRL])
ADD_WIDGET_INT_READ_ONLY("Like",g_savedGlobals.sStripClubData[GET_STRIP_CLUB_PLAYER_PED_ENUM()].bootyCall[BC_HITCHER_GIRL].iLike)
STOP_WIDGET_GROUP()
REPEAT COUNT_OF(STRIP_CLUB_PLAYER_CHAR_ENUM) k
SWITCH k
CASE 0
START_WIDGET_GROUP("Michael")
BREAK
CASE 1
START_WIDGET_GROUP("Franklin")
BREAK
CASE 2
START_WIDGET_GROUP("Trevor")
BREAK
CASE 3
START_WIDGET_GROUP("Multi 0")
BREAK
CASE 4
START_WIDGET_GROUP("Multi 1")
BREAK
CASE 5
START_WIDGET_GROUP("Multi 2")
BREAK
CASE 6
START_WIDGET_GROUP("Multi 3")
BREAK
CASE 7
START_WIDGET_GROUP("Multi 4")
BREAK
ENDSWITCH
REPEAT COUNT_OF(STRIP_CLUB_ENUM) i
SWITCH i
CASE 0
ADD_WIDGET_STRING("VANILLA UNICORN")
BREAK
/*
CASE 1
ADD_WIDGET_STRING("MEDIUM")
BREAK
CASE 2
ADD_WIDGET_STRING("HIGH")
BREAK
*/
ENDSWITCH
ADD_WIDGET_INT_SLIDER("Reputation", g_savedGlobals.sStripClubData[k].stripClub[i].iReputation, 0, 100, 1)
ENDREPEAT
ADD_WIDGET_STRING("")
REPEAT COUNT_OF(BOOTY_CALL_CONTACT_ENUM) j
BOOTY_CALL_CONTACT_ENUM thisStripper = INT_TO_ENUM(BOOTY_CALL_CONTACT_ENUM, j)
g_bDebugSetAsBootyCall[ENUM_TO_INT(thisStripper)][k] = g_savedGlobals.sStripClubData[k].bootyCall[thisStripper].bActivated
ADD_WIDGET_STRING(GET_BOOTY_CALL_NAME_AS_STRING(thisStripper))
ADD_WIDGET_INT_SLIDER("Like", g_savedGlobals.sStripClubData[k].bootyCall[thisStripper].iLike, 0, STRIPPER_MAX_LIKE, 1)
ADD_WIDGET_BOOL("Active as Booty Call?", g_bDebugSetAsBootyCall[ENUM_TO_INT(thisStripper)][k])
ENDREPEAT
STOP_WIDGET_GROUP()
ENDREPEAT
STOP_WIDGET_GROUP()
ENDPROC
// debug: delete widgets for booty call
PROC DELETE_STRIP_CLUB_WIDGETS(WIDGET_GROUP_ID scWidgetGroup)
IF DOES_WIDGET_GROUP_EXIST(scWidgetGroup)
DELETE_WIDGET_GROUP(scWidgetGroup)
ENDIF
ENDPROC
// debug: monitor debug activation of booty call pool
PROC MONITOR_BOOTY_CALL_DEBUG_ACTIVATION()
INT i, j
IF g_bDebugRefreshOnce
REPEAT COUNT_OF(BOOTY_CALL_CONTACT_ENUM) i
REPEAT COUNT_OF(STRIP_CLUB_PLAYER_CHAR_ENUM) j
IF g_bDebugSetAsBootyCall[i][j]
// if ticked
IF NOT IS_BOOTY_CALL_ID_ACTIVATED(INT_TO_ENUM(BOOTY_CALL_CONTACT_ENUM, i), INT_TO_ENUM(STRIP_CLUB_PLAYER_CHAR_ENUM, j))
SET_BOOTY_CALL_ID_ACTIVATED(INT_TO_ENUM(BOOTY_CALL_CONTACT_ENUM, i), TRUE, INT_TO_ENUM(STRIP_CLUB_PLAYER_CHAR_ENUM, j))
ENDIF
ELSE
// if unticked
IF IS_BOOTY_CALL_ID_ACTIVATED(INT_TO_ENUM(BOOTY_CALL_CONTACT_ENUM, i), INT_TO_ENUM(STRIP_CLUB_PLAYER_CHAR_ENUM, j))
SET_BOOTY_CALL_ID_ACTIVATED(INT_TO_ENUM(BOOTY_CALL_CONTACT_ENUM, i), FALSE, INT_TO_ENUM(STRIP_CLUB_PLAYER_CHAR_ENUM, j))
ENDIF
ENDIF
ENDREPEAT
ENDREPEAT
//g_bDebugRefreshOnce = FALSE
ENDIF
// advance times
IF g_bDebugAdvanceBootyCallTimes
REPEAT COUNT_OF(BOOTY_CALL_CONTACT_ENUM) i
REPEAT COUNT_OF(STRIP_CLUB_PLAYER_CHAR_ENUM) j
IF g_bDebugSetAsBootyCall[i][j]
g_bootyCallData.iNextAvailableTime[i] = GET_GAME_TIMER() + 2000
g_bootyCallData.iAddNumberTime[i] = GET_GAME_TIMER() - 60*60*1000
ENDIF
ENDREPEAT
ENDREPEAT
g_bootyCallData.iNextCallPlayerTime = GET_GAME_TIMER() + 2000
g_bDebugAdvanceBootyCallTimes = FALSE
ENDIF
// max out like
IF g_bDebugMaxOutLike
REPEAT COUNT_OF(STRIP_CLUB_PLAYER_CHAR_ENUM) j
REPEAT COUNT_OF(STRIP_CLUB_ENUM) i
g_savedGlobals.sStripClubData[j].stripClub[i].iReputation = 100
ENDREPEAT
REPEAT COUNT_OF(BOOTY_CALL_CONTACT_ENUM) i
g_savedGlobals.sStripClubData[j].bootyCall[i].iLike = STRIPPER_MAX_LIKE
g_bDebugSetAsBootyCall[i][j] = TRUE
ENDREPEAT
ENDREPEAT
g_bDebugMaxOutLike = FALSE
ENDIF
//Add Booty Call Contacts------------------------------------------------
INT iTempIter
REPEAT COUNT_OF(BOOTY_CALL_CONTACT_ENUM) iTempIter
IF g_bDebugAddContact[iTempIter]
g_bDebugMaxOutLike = TRUE
IF NOT IS_BOOTY_CALL_ID_ACTIVATED(INT_TO_ENUM(BOOTY_CALL_CONTACT_ENUM, iTempIter ))
SET_BOOTY_CALL_ID_ACTIVATED(INT_TO_ENUM(BOOTY_CALL_CONTACT_ENUM, iTempIter ), TRUE)
ENDIF
g_bDebugAddContact[iTempIter] = FALSE
ENDIF
ENDREPEAT
IF g_bDebugForceSext
g_bootyCallData.iNextCallPlayerTime = GET_GAME_TIMER()
g_bootyCallData.iNextAvailableTime[BC_STRIPPER_JULIET] = GET_GAME_TIMER()
IF GET_STRIPPER_NUM_BOOTY_DENIALS_BY_PLAYER(BC_STRIPPER_JULIET) < NUM_DENIALS_TO_TRIGGER_SEXT//
SET_STRIPPER_NUM_BOOTY_DENIALS_BY_PLAYER(BC_STRIPPER_JULIET, NUM_DENIALS_TO_TRIGGER_SEXT)
ENDIF
g_bDebugForceSext = FALSE
ENDIF
//Launch Luke Camera Mode Widgets----------------------------------------------------------------------
IF g_bTurnOnLukeHCameraDebug
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("bootycall_debug_controller")) = 0
REQUEST_SCRIPT("bootycall_debug_controller")
IF HAS_SCRIPT_LOADED("bootycall_debug_controller")
START_NEW_SCRIPT("bootycall_debug_controller", DEFAULT_STACK_SIZE)
SET_SCRIPT_AS_NO_LONGER_NEEDED("bootycall_debug_controller")
ENDIF
ENDIF
ENDIF
ENDPROC
#ENDIF