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