Files
gtav-src/script/dev_ng/singleplayer/scripts/Ambient/Misc/stripperhome.sc
T
2025-09-29 00:52:08 +02:00

3595 lines
118 KiB
Python
Executable File

//////////////////////////////////////////////////////////////////////////////////////////
// //
// SCRIPT NAME : stripperhome.sc //
// AUTHOR : Rob Bray
// Now Maintained : John R. Diaz
// DESCRIPTION : Take a dancer home from the strip club //
// //
//////////////////////////////////////////////////////////////////////////////////////////
///
USING "rage_builtins.sch"
USING "globals.sch"
USING "brains.sch"
USING "script_player.sch"
USING "commands_script.sch"
USING "commands_pad.sch"
USING "commands_graphics.sch"
USING "commands_camera.sch"
USING "commands_streaming.sch"
USING "commands_interiors.sch"
USING "commands_object.sch"
USING "script_drawing.sch"
USING "script_blips.sch"
USING "minigames_helpers.sch"
USING "dialogue_public.sch"
USING "stripclub_public.sch"
USING "rgeneral_include.sch"
USING "comms_control_public.sch"
USING "flow_processing_game.sch"
USING "oddjob_aggro.sch"
USING "script_oddjob_funcs.sch"
USING "sclub_stats.sch"
USING "common_sex.sch"
// Enums
ENUM STRIPPER_HOME_STAGE_ENUM
DEBUG_SKIP_MODE = -1,
STAGE_GO_TO_HOUSE = 0,
STAGE_ENTER_HOUSE,
PICK_UP_BOOTY_CALL,
FIND_QUITE_LOCATION_FOR_BOOTYCALL,
DROP_OFF_BOOTY_CALL,
SEND_STRIPPER_BACK_TO_WORK,
BOOTYCALL_FAILED
ENDENUM
ENUM ENTER_HOUSE_STAGE_ENUM
ENTER_HOUSE_INIT = 0,
ENTER_HOUSE_PARK_VEHICLE,
ENTER_HOUSE_SHOT_ALPHA,
ENTER_HOUSE_SHOT_ALPHA_TO_BETA,
ENTER_HOUSE_BETA_HOLD,
ENTER_HOUSE_SHOT_TOD,
ENTER_HOUSE_SHOT_HOLD_TOD,
ENTER_HOUSE_SHOT_CUT_TO_AFTER,
ENTER_HOUSE_SHOT_LERP_TO_GAMEPLAY,
ENTER_HOUSE_SHOT_CATCHUP,
ENTER_HOUSE_SHOT_OVER_SHOULDER,
ENTER_HOUSE_PAN,
ENTER_HOUSE_FADE_OUT,
ENTER_HOUSE_DONE
ENDENUM
ENUM FIND_QUITE_SPOT_ENUM
DRIVE_TO_SPOT = 0,
INIT_SEX,
HAVE_SEX
ENDENUM
ENUM FAIL_REASON_ENUM
FAIL_STRIPPER_DEAD = 0,
FAIL_STRIPPER_ABANDONED,
FAIL_STRIPPER_CANCELLED,
FAIL_STRIPPER_WALKING,
FAIL_STRIPPER_ATTACKED
ENDENUM
ENUM GO_TO_HOUSE_ENUM
GO_TO_HOUSE_INIT,
GO_TO_HOUSE_MEET,
GO_TO_HOUSE_GREET,
GO_TO_HOUSE_OBJ,
GO_TO_HOUSE_FOOT,
GO_TO_HOUSE_DRIVE,
GO_TO_HOUSE_STOP,
GO_TO_HOUSE_WALK_TO_DOOR,
GO_TO_HOUSE_LOSE_COPS,
GO_TO_HOUSE_RETURN
ENDENUM
ENUM HOUSE_BANTER_BIT_FLAGS
HOUSE_BANTER_NEAR_HOUSE = BIT0,
HOUSE_BANTER_NEED_CAR = BIT1,
HOUSE_BANTER_TOO_FAST = BIT2,
HOUSE_BANTER_TOO_SLOW = BIT3,
HOUSE_BANTER_NEW_CAR = BIT4,
HOUSE_BANTER_ONE_OFF = BIT5,
HOUSE_BANTER_BJD = BIT6,
HOUSE_BANTER_BJ_FINISHED = BIT7,
HOUSE_BANTER_BJ = BIT8,
HOUSE_BANTER_SEX = BIT9,
HOUSE_BANTER_NICE_CAR = BIT10,
HOUSE_BANTER_SEX_MALE = BIT11,
HOUSE_BANTER_LOSE_COPS = BIT12,
HOUSE_BANTER_ONE_OFF_1 = BIT13,
HOUSE_BANTER_ONE_OFF_2 = BIT14,
HOUSE_BANTER_ONE_OFF_3 = BIT15,
HOUSE_BANTER_ONE_OFF_DONE = BIT16,
HOUSE_BANTER_CRASHED_CAR = BIT17,
HOUSE_BANTER_STOLEN_CAR = BIT18,
HOUSE_BANTER_PLAYER_RESPONSE = BIT19
ENDENUM
ENUM HOUSE_GENERAL_BIT_FLAGS
HOUSE_MEET_UP_TEXT = BIT0,
HOUSE_MEET_IS_NEAR = BIT1,
HOUSE_MEET_BJ_STREAMED = BIT2,
HOUSE_MEET_BJ_ACTIVE = BIT3,
HOUSE_MEET_BJ_TRIGGERED = BIT4,
HOUSE_MEET_REQUEST_MODELS = BIT5,
HOUSE_MEET_INIT_CANCEL = BIT6,
HOUSE_MEET_INIT_CANCEL_HELP = BIT7,
HOUSE_MEET_REQUEST_IDLE_ANIM = BIT8,
HOUSE_MEET_GIRL_CANCEL = BIT9,
HOUSE_MEET_STRIPPER_CREATED = BIT10,
HOUSE_MEET_STRIPPER_TAKE_IN = BIT11,
HOUSE_MEET_AGGROED = BIT12,
HOUSE_DANCER_GOING_BACK_CLUB = BIT13,
HOUSE_WAITING_TO_CLOSE_DOOR = BIT14,
HOUSE_REQUEST_HAPPY_FACE_ANIMS = BIT15,
HOUSE_GEN_LUKE_MODE_SKIP_ON = BIT16,
HOUSE_GEN_HOME_SCENE_PLAYING = BIT17,
HOUSE_GEN_PLAY_SEX_ANIM = BIT18
ENDENUM
// Script-specific entitie
//Vehicle Saving
VEHICLE_SAVE_ARGS VehicleSaveArgsBootyCall
BOOL bVehicleSaved
REL_GROUP_HASH RELGROUPHASH_NEUTRAL_TO_PLAYER
TIMEOFDAY eTODCALLMade
STRIPPER_HOME_STAGE_ENUM currentMissionStage = STAGE_GO_TO_HOUSE
ENTER_HOUSE_STAGE_ENUM enterHouseStage
BOOTY_CALL_CONTACT_ENUM stripperID[MAX_NUMBER_STRIPPERS_TAKE_HOME]
GO_TO_HOUSE_ENUM eGoToHouseState = GO_TO_HOUSE_INIT
GO_TO_HOUSE_ENUM ePreviousGoToHouseState
FIND_QUITE_SPOT_ENUM stateFindingSpot
structPedsForConversation stripperConversation
structTimer tBanter
structTimer tCarCrash
structTimer tSpeed
structTimer tBJ
structTimer tWalking
structTimer tExitWait
structTimer tAggroTimer
//Aggro Checks
AGGRO_ARGS tAggroArgs
// Peds
PED_INDEX stripperPed[MAX_NUMBER_STRIPPERS_TAKE_HOME]
STRING sAfterSexAnimDict
STRING sThisWeatherType
// Models
STREAMED_MODEL takeHomeModels[MAX_NUMBER_STRIPPERS_TAKE_HOME]
// Blips
BLIP_INDEX houseVehicleBlip
BLIP_INDEX houseFootBlip
BLIP_INDEX stripperHomeBlip[MAX_NUMBER_STRIPPERS_TAKE_HOME]
// Cameras
CONST_INT NUM_BOOTY_CALL_CAMS 4
CAMERA_INDEX homeCam[NUM_BOOTY_CALL_CAMS]
structTimelapse tTimeLapse
//SCENARIO BLOCKING VOLUMES
SCENARIO_BLOCKING_INDEX sbiSHome
// Vectors
VECTOR vPlayerWalkToPos
VECTOR vHouseDoorPos
VECTOR vHouseInVehiclePos
VECTOR vHouseOnFootPos
VECTOR vAfterCutPos
VECTOR vPickUpGirlSpot
VECTOR vStarttWalkLoc
VECTOR vHeliPos
// Floats
FLOAT fAfterCutRot
FLOAT fVehicleHeading
FLOAT fHeliHeading
FLOAT fInitDistance = -1
// Ints
INT iTODSkipHour
INT iBanterBitFlags
INT candidateID = NO_CANDIDATE_ID
INT iGeneralBitFlags
INT iVehicleHealth
INT iRecordBlockPersistTimer = 0
BOOL bDropOffHome = TRUE
BOOL bIsMP = FALSE
BOOL bStoppingCar = FALSE
// Other variables
SEQUENCE_INDEX sequence
VEHICLE_INDEX iTakeHomeVehicle
CONST_FLOAT CONST_fCleanupDistance 100.00
CONST_FLOAT CONST_fAbandoned 200.0
CONST_FLOAT CONST_fMetUp 3.0
CONST_FLOAT CONST_fYParkOffset -5.0
CONST_FLOAT CONST_fTrigger 3.0
CONST_FLOAT CONST_fRoadNodeAreaWidth 15.0
CONST_FLOAT CONST_fVehicleTrigger 10.0
CONST_FLOAT CONST_fVehicleHomeTrigger 1.0
CONST_FLOAT CONST_fDoorTrigger 5.0
CONST_FLOAT CONST_fNearHouse 75.0
CONST_FLOAT CONST_fMaxWalkDist 100.0
CONST_FLOAT CONST_fMaxWalkTime 45.0
CONST_INT CONST_iBJDuration 30000
CONST_INT CONST_iMaxNumSexts 2
CONST_INT CONST_iTimeSextDelay 60000 //in milliseconds
CONST_FLOAT CONST_fHomeCam1stShotTime 1.0
CONST_FLOAT CONST_fHomePanUpTime 6.0
CONST_INT CONST_iHomePanUpTODTime 6000
CONST_INT CONST_iPanToPlayerTime 6000
CONST_INT CONST_iNumHoursToSkip 8
CONST_INT CONST_iShowDebugInfo 0
#IF IS_DEBUG_BUILD
// do a debug print prefixed by Strip Club
PROC DEBUG_PRINT_STRIPPER_HOME(STRING debugString)
IF g_bDebugDisplayStripClubAndBootyCall
PRINTSTRING("Stripper Home: ")
PRINTSTRING(debugString)
PRINTNL()
ENDIF
ENDPROC
PROC DEBUG_SHOW_STRIPPER_HOME_COORDS()
// DRAW_DEBUG_SPHERE(vHouseInVehiclePos,CONST_fVehicleHomeTrigger,255,255,0,120) //vehicle spot
// DRAW_DEBUG_SPHERE(vHouseOnFootPos,CONST_fDoorTrigger,0,0,255,120) //cutscene spot
// DRAW_DEBUG_SPHERE(vHouseDoorPos,CONST_fDoorTrigger,0,255,0,120) //door spot
ENDPROC
MODEL_NAMES eDebugTakeHomeVehicle = tailgater
VEHICLE_INDEX iDebugTakeHomeVehicle
BOOL bRequestedDebugVehicle
VECTOR vDebugTakeHomeVehicle = <<92.18, -1279.44, 28.77>>
FLOAT fDebugTakeHomeVehicle = 92.23
#ENDIF
FUNC STRING GET_BOOTY_CALL_END_FACE_ANIM()
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
RETURN "facials@p_m_zero@variations@happy"
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
RETURN "facials@p_m_one@variations@happy"
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
RETURN "facials@p_m_two@variations@happy"
ENDIF
RETURN "facials@p_m_zero@variations@happy"
ENDFUNC
FUNC STRING GET_RANDOM_HAPPY_FACE_MOOD()
INT iRandomSeed = GET_RANDOM_INT_IN_RANGE()
IF iRandomSeed <= 21666
CDEBUG1LN(DEBUG_BOOTY_CALL,"[HAPPY FACE] # 1" )
RETURN "mood_happy_1"
ELIF iRandomSeed > 21666 AND iRandomSeed <= 43333
CDEBUG1LN(DEBUG_BOOTY_CALL,"[HAPPY FACE] # 2" )
RETURN "mood_happy_2"
ELSE
CDEBUG1LN(DEBUG_BOOTY_CALL,"[HAPPY FACE] # 3" )
RETURN "mood_happy_3"
ENDIF
ENDFUNC
FUNC TEXT_LABEL_23 FIXUP_CONVO_LABELS(TEXT_LABEL_23 sBaseLabel)
sBaseLabel += "_"
INT iToAdd = ENUM_TO_INT(stripperID[0])
sBaseLabel += iToAdd
CDEBUG1LN(DEBUG_BOOTY_CALL,"*******Triggering Convo Label = ", sBaseLabel)
RETURN sBaseLabel
ENDFUNC
PROC FIXUP_CONVO_LABELS_FOR_PLAYER(TEXT_LABEL_23& sBaseLabel, BOOL bAppenedStripper)
sBaseLabel += "_"
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
sBaseLabel += "T"
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
sBaseLabel += "M"
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
sBaseLabel += "F"
ENDIF
IF bAppenedStripper
sBaseLabel = FIXUP_CONVO_LABELS(sBaseLabel)
ENDIF
ENDPROC
// can do stripper home god text?
FUNC BOOL CAN_DO_STRIPPER_HOME_GOD_TEXT()
IF IS_MESSAGE_BEING_DISPLAYED() // no messages
OR IS_SCRIPTED_CONVERSATION_ONGOING()
OR g_ConversationStatus <> CONV_STATE_FREE
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
FUNC BOOL CREATE_CONVERSATION_FOR_BOOTY_CALL( STRING sRoot, BOOL bPlayer = FALSE, BOOL bAppendStripper = FALSE,BOOL sReadFromSCLUB = FALSE)
IF CAN_DO_STRIPPER_HOME_GOD_TEXT()
TEXT_LABEL_23 sBaseLabel
sBaseLabel = sRoot
IF bPlayer
FIXUP_CONVO_LABELS_FOR_PLAYER(sBaseLabel,bAppendStripper)
ELSE
sBaseLabel = FIXUP_CONVO_LABELS(sBaseLabel)
ENDIF
STRING sGroupID
IF sReadFromSCLUB
sGroupID = "SCAUD"
ELSE
sGroupID = "SHAUD"
ENDIF
IF CREATE_CONVERSATION(stripperConversation, sGroupID, sBaseLabel, CONV_PRIORITY_MEDIUM)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC PLAY_BOOTY_CALL_GREETING()
IF stripperID[0] = BC_TAXI_LIZ
CREATE_CONVERSATION_FOR_BOOTY_CALL("SC_GREET")
ELSE
PLAY_PED_AMBIENT_SPEECH(stripperPed[0],"GENERIC_HI_FLIRTY",SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ENDIF
CDEBUG1LN(DEBUG_BOOTY_CALL,"[AUDIO] Booty call greeted the player." )
ENDPROC
PROC CREATE_STRIPPER_BLIP(INT index)
IF DOES_BLIP_EXIST(stripperHomeBlip[index])
REMOVE_BLIP(stripperHomeBlip[index])
ENDIF
stripperHomeBlip[index] = CREATE_BLIP_FOR_PED(stripperPed[index])
TEXT_LABEL sStripperName = GET_STRIPPER_NAME_AS_TEXT_LABEL(stripperID[index])
SET_BLIP_NAME_FROM_TEXT_FILE(stripperHomeBlip[index], sStripperName)
CDEBUG1LN(DEBUG_BOOTY_CALL,"Added blip to booty call." )
ENDPROC
PROC CLEAR_STRIPPER_BLIPS()
INT i
REPEAT MAX_NUMBER_STRIPPERS_TAKE_HOME i
IF DOES_BLIP_EXIST(stripperHomeBlip[i])
REMOVE_BLIP(stripperHomeBlip[i])
CDEBUG1LN(DEBUG_BOOTY_CALL,"Removing Stripper Blips" )
ENDIF
ENDREPEAT
ENDPROC
// clear blips
PROC CLEAR_ALL_BLIPS()
IF DOES_BLIP_EXIST(houseFootBlip)
REMOVE_BLIP(houseFootBlip)
ENDIF
IF DOES_BLIP_EXIST(houseVehicleBlip)
REMOVE_BLIP(houseVehicleBlip)
ENDIF
CLEAR_STRIPPER_BLIPS()
ENDPROC
FUNC STRING GET_SPECIFIC_WEATHER_FOR_BOOTY_CALL()
STRING sWeatherType
SWITCH stripperID[0]
CASE BC_STRIPPER_JULIET
sWeatherType = "CLEARING"
BREAK
CASE BC_STRIPPER_NIKKI
sWeatherType = "OVERCAST"
BREAK
CASE BC_STRIPPER_SAPPHIRE
sWeatherType = "CLOUDS"
BREAK
CASE BC_STRIPPER_INFERNUS
sWeatherType = "CLEAR"
BREAK
CASE BC_TAXI_LIZ
sWeatherType = "EXTRASUNNY"
BREAK
CASE BC_HITCHER_GIRL
sWeatherType = "RAIN"
BREAK
DEFAULT
sWeatherType = "EXTRASUNNY"
BREAK
ENDSWITCH
CDEBUG1LN(DEBUG_BOOTY_CALL,"[WEATHER ] = ", sWeatherType)
RETURN sWeatherType
ENDFUNC
PROC PRINT_HELP_WITH_STRIPPER_NAMES(STRING sHelpMessage, BOOTY_CALL_CONTACT_ENUM BootyCallID, BOOL bForever = FALSE)
TEXT_LABEL_23 sStripperName = GET_STRIPPER_NAME_AS_TEXT_LABEL(BootyCallID)
IF NOT IS_THIS_HELP_MESSAGE_WITH_STRING_BEING_DISPLAYED(sHelpMessage, sStripperName)
PRINTLN("Print help ", sHelpMessage, " using name ", sStripperName)
IF NOT bForever
PRINT_HELP_WITH_STRING(sHelpMessage, sStripperName)
ELSE
PRINT_HELP_FOREVER_WITH_STRING(sHelpMessage, sStripperName)
ENDIF
ENDIF
ENDPROC
PROC PRINT_OBJECTIVE_WITH_STRIPPER_NAMES(STRING sObjMessage, BOOTY_CALL_CONTACT_ENUM BootyCallID)
TEXT_LABEL_23 sStripperName = GET_STRIPPER_NAME_AS_TEXT_LABEL(BootyCallID)
PRINTLN("Print Objective ", sObjMessage, " using name ", sStripperName)
PRINT_STRING_IN_STRING_NOW( sObjMessage ,sStripperName, DEFAULT_GOD_TEXT_TIME, 1 )
ENDPROC
PROC GET_MORNING_AFTER_SEX_DICTIONARY()
sAfterSexAnimDict = "move_p_m_one_idles@generic"
REQUEST_ANIM_DICT(sAfterSexAnimDict)
CDEBUG1LN(DEBUG_BOOTY_CALL, "[MORNING_AFTER_ANIM] - Requested: ",sAfterSexAnimDict )
ENDPROC
/// PURPOSE: Sets the player to walk into the frame and play an idle anim post cutscene
///
PROC PLAY_MORNING_AFTER_ANIM()
IF NOT HAS_ANIM_DICT_LOADED(sAfterSexAnimDict)
CDEBUG1LN(DEBUG_BOOTY_CALL, "[MORNING_AFTER_ANIM] - Waiting for assets: ", sAfterSexAnimDict)
ELSE
// VECTOR vPosIntoFrame = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()),GET_ENTITY_HEADING(PLAYER_PED_ID()),<<0.0,2.5,0.0>>)
INT iWhichAnim = GET_RANDOM_INT_IN_RANGE(0, 50000)
CLEAR_PED_TASKS(PLAYER_PED_ID())
SEQUENCE_INDEX iSequenceIDPlayerOutro
OPEN_SEQUENCE_TASK(iSequenceIDPlayerOutro)
// TASK_GO_STRAIGHT_TO_COORD(NULL,vAfterCutPos,PEDMOVE_WALK,DEFAULT_TIME_NEVER_WARP,fAfterCutRot)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL,vAfterCutPos,PEDMOVE_WALK,DEFAULT_TIME_NEVER_WARP,DEFAULT_NAVMESH_RADIUS,ENAV_DEFAULT, fAfterCutRot)
IF iWhichAnim < 15000
TASK_PLAY_ANIM(NULL,sAfterSexAnimDict,"fidget_rub_hands",WALK_BLEND_IN, -1, -1, AF_EXIT_AFTER_INTERRUPTED | AF_ABORT_ON_PED_MOVEMENT)//, 0.757)
CDEBUG1LN(DEBUG_BOOTY_CALL, "[MORNING_AFTER_ANIM] - Rub hands")
ELIF iWhichAnim >= 15000 AND iWhichAnim < 35000
TASK_PLAY_ANIM(NULL,sAfterSexAnimDict,"fidget_rub_chin",WALK_BLEND_IN, -1, -1, AF_EXIT_AFTER_INTERRUPTED | AF_ABORT_ON_PED_MOVEMENT)//, 0.757)
CDEBUG1LN(DEBUG_BOOTY_CALL, "[MORNING_AFTER_ANIM] - Hand hips")
ELSE
TASK_PLAY_ANIM(NULL,sAfterSexAnimDict,"fidget_arm_swing",WALK_BLEND_IN, -1, -1, AF_EXIT_AFTER_INTERRUPTED | AF_ABORT_ON_PED_MOVEMENT)//, 0.757)
CDEBUG1LN(DEBUG_BOOTY_CALL, "[MORNING_AFTER_ANIM] - Muscle Flex")
ENDIF
CLOSE_SEQUENCE_TASK(iSequenceIDPlayerOutro)
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), iSequenceIDPlayerOutro)
CLEAR_SEQUENCE_TASK(iSequenceIDPlayerOutro)
SET_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_GEN_PLAY_SEX_ANIM)
ENDIF
ENDPROC
//If player takes too long to pick up the booty call, send her back to work
FUNC BOOL SHOULD_PLAY_BOOTY_CALL_RETURN_TO_WORK_CUTSCENE()
//Rule out non strippers
IF stripperID[0] = BC_TAXI_LIZ
OR stripperID[0] = BC_HITCHER_GIRL
OR GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(stripperPed[0],<<96.12,-1284.91,29.43>> ) > 10
// OR IS_ENTITY_OCCLUDED(stripperPed[0])
CDEBUG1LN(DEBUG_BOOTY_CALL, "[SHOULD_PLAY_RETURN_TO_WORK_CUTSCENE] - FALSE")
RETURN FALSE
ENDIF
CDEBUG1LN(DEBUG_BOOTY_CALL, "[SHOULD_PLAY_RETURN_TO_WORK_CUTSCENE] - TRUE")
RETURN TRUE
ENDFUNC
PROC SETUP_BACK_TO_WORK_CAM()
IF NOT IS_ENTITY_OCCLUDED(stripperPed[0])
AND CAN_PLAYER_START_CUTSCENE()
ODDJOB_ENTER_CUTSCENE(DEFAULT,DEFAULT,FALSE)
homeCam[0] = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA",<<90.1007, -1281.5734, 28.6661>>, <<2.4422, 0.0, -113.4013>>, 45.0,TRUE)
//POINT_CAM_AT_COORD(scriptedCamSex[XCAM_PASSENGER_WINDOW],vCameraLookAt)
//POINT_CAM_AT_ENTITY(scriptedCamSex[XCAM_PASSENGER_WINDOW],iPlayersVehicle,GET_0_VEC())
//ATTACH_CAM_TO_ENTITY(scriptedCamSex[XCAM_PASSENGER_WINDOW], iPlayersVehicle, <<2.0,-0.55, 0.85>>)
CDEBUG1LN(DEBUG_BOOTY_CALL, "[SETUP_BACK_TO_WORK_CAM] - Script cam active")
RENDER_SCRIPT_CAMS(TRUE,FALSE)
ELSE
CDEBUG1LN(DEBUG_BOOTY_CALL, "[SETUP_BACK_TO_WORK_CAM] - Cam not created.")
ENDIF
ENDPROC
PROC SEND_BOOTY_CALL_BACK_TO_WORK()
//Unlock the back door
SETUP_BACK_TO_WORK_CAM()
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(<<96.12,-1284.91,29.43>> , 5.0,PROP_MAGENTA_DOOR)
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(PROP_MAGENTA_DOOR,<<96.12,-1284.91,29.43>> ,FALSE, 0.0)
ENDIF
SET_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_WAITING_TO_CLOSE_DOOR)
FREEZE_ENTITY_POSITION(stripperPed[0],FALSE)
SET_PED_CONFIG_FLAG(stripperPed[0], PCF_OpenDoorArmIK, TRUE)
CDEBUG1LN(DEBUG_BOOTY_CALL, "[CONFIG_FLAG] - Enabling Open Door ArmIK.")
SEQUENCE_INDEX iBCSeq
OPEN_SEQUENCE_TASK(iBCSeq)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<98.2041, -1291.2522, 28.2688>>, PEDMOVE_WALK, -1, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING) //office
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<107.6303, -1304.7424, 27.7688>>, PEDMOVE_WALK, -1, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT) //dressing room
TASK_PLAY_ANIM(NULL, "mini@strip_club@idles@stripper", "stripper_idle_01", NORMAL_BLEND_IN, SLOW_BLEND_OUT, 15000, AF_LOOPING)
CLOSE_SEQUENCE_TASK(iBCSeq)
TASK_PERFORM_SEQUENCE(stripperPed[0], iBCSeq)
CLEAR_SEQUENCE_TASK(iBCSeq)
SET_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_DANCER_GOING_BACK_CLUB)
CDEBUG1LN(DEBUG_BOOTY_CALL, "[SEND_BOOTY_CALL_BACK_TO_WORK] - Dancer should be heading towards the club.")
ENDPROC
FUNC BOOL DID_LOCK_STRIP_CLUB_BACKDOOR_BEHIND_STRIPPER()
IF IS_ENTITY_DEAD(stripperPed[0])
RETURN TRUE
ENDIF
IF IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_DANCER_GOING_BACK_CLUB)
SET_PED_RESET_FLAG(stripperPed[0], PRF_SearchForClosestDoor, TRUE)
#IF IS_DEBUG_BUILD
#IF CONST_iShowDebugInfo
// DRAW_DEBUG_TEXT_2D("PRF_SearchForClosestDoor Flag Set", <<0.5, 0.2, 0.0>>)
#ENDIF
#ENDIF
//If player is too far, or stripper has made it back inside the club.
IF IS_ENTITY_AT_COORD(stripperPed[0], <<96.8033, -1287.5966, 28.2688>>, <<CONST_fDoorTrigger, CONST_fDoorTrigger, LOCATE_SIZE_HEIGHT>>, FALSE, TRUE, TM_ON_FOOT)
OR GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(),<<96.8033, -1287.5966, 28.2688>>) > CONST_fCleanupDistance
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(<<96.12,-1284.91,29.43>> , 5.0,PROP_MAGENTA_DOOR)
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(PROP_MAGENTA_DOOR,<<96.12,-1284.91,29.43>> ,TRUE, 0.0)
ENDIF
IF DOES_CAM_EXIST(homeCam[0])
IF IS_CAM_RENDERING(homeCam[0])
ODDJOB_EXIT_CUTSCENE(DEFAULT,DEFAULT,FALSE)
RENDER_SCRIPT_CAMS(FALSE,FALSE)
DESTROY_CAM(homeCam[0] ,TRUE)
CDEBUG1LN(DEBUG_BOOTY_CALL, "[SEND_BOOTY_CALL_BACK_TO_WORK] - Cam destroyed.")
ENDIF
ENDIF
DELETE_PED(stripperPed[0])
CDEBUG1LN(DEBUG_BOOTY_CALL, "[LOCK_STRIP_CLUB_BACKDOOR_BEHIND_STRIPPER] - Back door is LOCKED.")
RETURN TRUE
ELSE
CDEBUG1LN(DEBUG_BOOTY_CALL, "[LOCK_STRIP_CLUB_BACKDOOR_BEHIND_STRIPPER] - Waiting to CLOSE BACK DOOR at <<96.12,-1284.91,29.43>> ")
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC DO_STAGE_SEND_STRIPPER_TO_THE_CLUB()
CDEBUG1LN(DEBUG_BOOTY_CALL, "[DO_STAGE_SEND_STRIPPER_TO_THE_CLUB] - MAIN")
//Check if the dancer is going back to the club-------------------------------
IF NOT IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_DANCER_GOING_BACK_CLUB)
IF SHOULD_PLAY_BOOTY_CALL_RETURN_TO_WORK_CUTSCENE()
SEND_BOOTY_CALL_BACK_TO_WORK()
ELSE
CDEBUG1LN(DEBUG_BOOTY_CALL, "[DO_STAGE_SEND_STRIPPER_TO_THE_CLUB] - Setting to BOOTYCALL_FAILED.")
currentMissionStage = BOOTYCALL_FAILED
ENDIF
ENDIF
//Wait to lock door then call fail
IF IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_WAITING_TO_CLOSE_DOOR)
IF DID_LOCK_STRIP_CLUB_BACKDOOR_BEHIND_STRIPPER()
currentMissionStage = BOOTYCALL_FAILED
ENDIF
ENDIF
ENDPROC
// cleanup script
PROC MISSION_CLEANUP()
DEBUG_MESSAGE("Terminating stripperhome")
CDEBUG1LN(DEBUG_BOOTY_CALL, "[CLEANUP] Called ")
//Cleanup Widget
// g_bTurnOnLukeHCameraDebug = FALSE
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(FALSE)
SET_ALL_VEHICLE_GENERATORS_ACTIVE()
CLEAR_ALL_BLIPS()
CLEAR_PRINTS()
REMOVE_SCENARIO_BLOCKING_AREA(sbiSHome)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(vHouseInVehiclePos-<<CONST_fTrigger, CONST_fTrigger, CONST_fTrigger>>, vHouseInVehiclePos+<<CONST_fTrigger, CONST_fTrigger, CONST_fTrigger>>, TRUE)
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(vHouseInVehiclePos-<<CONST_fTrigger, CONST_fTrigger, CONST_fTrigger>>, vHouseInVehiclePos+<<CONST_fTrigger, CONST_fTrigger, CONST_fTrigger>>,CONST_fRoadNodeAreaWidth )
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
RENDER_SCRIPT_CAMS(FALSE, FALSE)
IF DOES_ENTITY_EXIST(stripperPed[0])
IF NOT IS_ENTITY_DEAD(stripperPed[0])
IF NOT IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_DANCER_GOING_BACK_CLUB)
TASK_WANDER_STANDARD(stripperPed[0])
ENDIF
SET_PED_KEEP_TASK(stripperPed[0], TRUE)
IF NOT DOES_RELATIONSHIP_GROUP_EXIST(RELGROUPHASH_NEUTRAL_TO_PLAYER)
ADD_RELATIONSHIP_GROUP("BootyCall", RELGROUPHASH_NEUTRAL_TO_PLAYER)
ENDIF
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_IGNORE,RELGROUPHASH_NEUTRAL_TO_PLAYER,RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_IGNORE,RELGROUPHASH_PLAYER,RELGROUPHASH_NEUTRAL_TO_PLAYER)
SET_PED_RELATIONSHIP_GROUP_HASH(stripperPed[0],RELGROUPHASH_NEUTRAL_TO_PLAYER)
ENDIF
SET_PED_AS_NO_LONGER_NEEDED(stripperPed[0])
ENDIF
IF candidateID != NO_CANDIDATE_ID
Mission_Over(candidateID)
ENDIF
IF bVehicleSaved
ODDJOB_RESTORE_SAVED_VEHICLE(VehicleSaveArgsBootyCall)
ENDIF
SET_ALL_NEUTRAL_RANDOM_PEDS_FLEE(PLAYER_ID(), FALSE)
SET_NEXT_STRIPPER_BOOTY_CALL_AVAILABLE_TIME(ENUM_TO_INT(stripperID[0]))
g_bootyCallData.bootyCallState = BOOTY_CALL_INACTIVE
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE( FALSE )
TERMINATE_THIS_THREAD()
ENDPROC
// mission passed
PROC MISSION_PASSED()
INC_BOOTYCALL_STAT_NUM_TIMES_FUCKED_BOOTYCALL()
REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL(CP_BOOTY)
STRIPCLUB_WRITE_TO_LEADERBOARD(FALSE)
MISSION_CLEANUP()
ENDPROC
// mission failed
PROC MISSION_FAILED(FAIL_REASON_ENUM reasonForFail)
IF ENUM_TO_INT(stripperID[0]) > -1 AND ENUM_TO_INT(stripperID[0]) < COUNT_OF(BOOTY_CALL_CONTACT_ENUM)
AND reasonForFail != FAIL_STRIPPER_CANCELLED //you called to cancel, it's okay
SET_LIKE_FOR_STRIPPER_ID( stripperID[0], GET_LIKE_FOR_STRIPPER_ID(stripperID[0])/2) //lose half the strippers like
ENDIF
CLEAR_ALL_BLIPS()
SWITCH reasonForFail
CASE FAIL_STRIPPER_DEAD
PRINT_OBJECTIVE_WITH_STRIPPER_NAMES( "SCLUB_HOME_D" , stripperID[0])
SET_LIKE_FOR_STRIPPER_ID( stripperID[0] , 0)
SET_STRIPPER_ATTACKED_ON_BOOTY_CALL(stripperID[0])
#IF IS_DEBUG_BUILD
CDEBUG1LN(DEBUG_BOOTY_CALL,"Booty Call - Player killed: ", GET_BOOTY_CALL_NAME_AS_STRING(stripperID[0]) )
#ENDIF
currentMissionStage = BOOTYCALL_FAILED
BREAK
CASE FAIL_STRIPPER_ABANDONED
CLEAR_PRINTS()
PRINT_HELP_WITH_STRIPPER_NAMES("SCLUB_HOME_A", stripperID[0])
currentMissionStage = SEND_STRIPPER_BACK_TO_WORK
BREAK
CASE FAIL_STRIPPER_CANCELLED
//Commenting out per B*1318362
//PRINT_NOW("SCLUB_HOME_C", DEFAULT_GOD_TEXT_TIME, 1)
CDEBUG1LN(DEBUG_BOOTY_CALL,"[FAIL] Booty Call - Sending back to work" )
currentMissionStage = SEND_STRIPPER_BACK_TO_WORK
BREAK
CASE FAIL_STRIPPER_ATTACKED
PRINT_OBJECTIVE_WITH_STRIPPER_NAMES( "SCLUB_HOME_D3" , stripperID[0])
currentMissionStage = BOOTYCALL_FAILED
BREAK
CASE FAIL_STRIPPER_WALKING
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(stripperPed[0] , <<92.5861, -1282.8604, 28.2548>> ) < 10.0
CDEBUG1LN(DEBUG_BOOTY_CALL,"[FAIL] Booty Call - Walking - Sending back to work" )
currentMissionStage = SEND_STRIPPER_BACK_TO_WORK
ELSE
currentMissionStage = BOOTYCALL_FAILED
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC HANDLE_BOOTY_CALL_AGGRO(EAggro &eAggroType)//, AGGRO_ARGS &aggroArgs)
SWITCH eAggroType
CASE EAggro_Aiming//----------------------------------------------
CASE EAggro_ShotNear//--------------------------------------------
CASE EAggro_Attacked//--------------------------------------------
//SET_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_MEET_GIRL_CANCEL)
//SET_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_MEET_AGGROED)
//INCREMENT_STRIPPER_NUM_BOOTY_DENIALS_BY_PLAYER(takeHomeInfo.stripperID[0])
RESET_BOOTY_CALL_TO_INACTIVE(TRUE)
BREAK
CASE EAggro_Wanted//----------------------------------------------
BREAK
ENDSWITCH
ENDPROC
FUNC BOOL HAS_PLAYER_AGGROED_BOOTY_CALL_PED(PED_INDEX ped, AGGRO_ARGS &aggroArgs, structTimer &timer)
EAggro aggroReason
VEHICLE_INDEX pedVeh
IF NOT IS_TIMER_STARTED(timer)
START_TIMER_NOW(timer)
ENDIF
IF GET_TIMER_IN_SECONDS(timer) > 3
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
pedVeh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
ENDIF
IF DO_AGGRO_CHECK(ped, pedVeh,aggroArgs, aggroReason)
HANDLE_BOOTY_CALL_AGGRO(aggroReason)
IF DOES_ENTITY_EXIST(ped)
IF NOT IS_ENTITY_DEAD(ped)
IF NOT DOES_RELATIONSHIP_GROUP_EXIST(RELGROUPHASH_NEUTRAL_TO_PLAYER)
ADD_RELATIONSHIP_GROUP("BootyCall", RELGROUPHASH_NEUTRAL_TO_PLAYER)
ENDIF
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_IGNORE, RELGROUPHASH_NEUTRAL_TO_PLAYER,RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_IGNORE, RELGROUPHASH_PLAYER,RELGROUPHASH_NEUTRAL_TO_PLAYER)
SET_PED_RELATIONSHIP_GROUP_HASH(ped, RELGROUPHASH_NEUTRAL_TO_PLAYER)
TASK_SMART_FLEE_PED(ped, PLAYER_PED_ID(),500,-1)
ENDIF
ENDIF
RESTART_TIMER_NOW( timer )
CDEBUG1LN(DEBUG_BOOTY_CALL,"Agrro Timer restarrted")
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC SET_BOOTY_CALL_SEX_CAM_SHAKE()
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
IF GET_TIMER_IN_SECONDS_SAFE( tSpeed ) >= 0.45
STOP_CAM_SHAKING(homeCam[1])
SHAKE_CAM(homeCam[1], "VIBRATE_SHAKE", 0.15)
SET_CONTROL_SHAKE(PLAYER_CONTROL, 250, 150)
RESTART_TIMER_NOW(tSpeed)
CDEBUG1LN(DEBUG_BOOTY_CALL,"[SEX CAM] - Trevor Hit")
ENDIF
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
IF GET_TIMER_IN_SECONDS_SAFE( tSpeed ) >= 0.75
STOP_CAM_SHAKING(homeCam[1])
SHAKE_CAM(homeCam[1], "VIBRATE_SHAKE", 0.1)
SET_CONTROL_SHAKE(PLAYER_CONTROL, 300, 100)
RESTART_TIMER_NOW(tSpeed)
CDEBUG1LN(DEBUG_BOOTY_CALL,"[SEX CAM] - Michael Hit")
ENDIF
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
IF GET_TIMER_IN_SECONDS_SAFE( tSpeed ) >= 0.6
STOP_CAM_SHAKING(homeCam[1])
SHAKE_CAM(homeCam[1], "VIBRATE_SHAKE", 0.2)
SET_CONTROL_SHAKE(PLAYER_CONTROL, 400, 250)
RESTART_TIMER_NOW(tSpeed)
CDEBUG1LN(DEBUG_BOOTY_CALL,"[SEX CAM] - Franklin Hit")
ENDIF
ENDIF
ENDPROC
FUNC BOOL CAN_USE_SEX_IN_CAR_METHOD()
SWITCH stripperID[0]
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 bIsMP
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
BREAK
DEFAULT
RETURN FALSE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
// get start pos for take-home stripper
PROC GET_INIT_TAKE_HOME_STRIPPER_LOC(VECTOR &vStorePos, FLOAT &fStoreRot, BOOL bPickUpFromHome)
vPickUpGirlSpot = vPickUpGirlSpot
SWITCH stripperID[0]
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 NOT bPickUpFromHome
vStorePos = <<92.8829, -1281.1230, 28.1845>>
fStoreRot = 15.0
ELSE
vStorePos = vAfterCutPos
fStoreRot = fAfterCutRot
ENDIF
vPickUpGirlSpot = vStorePos
BREAK
//CASE BC_FIXED_CAR
CASE BC_TAXI_LIZ
IF NOT bPickUpFromHome
vStorePos = << -1615.9908, 187.4827, 59.1337 >>
fStoreRot = 217.5474
ELSE
vStorePos = vAfterCutPos
fStoreRot = fAfterCutRot
ENDIF
vPickUpGirlSpot = vStorePos
BREAK
CASE BC_HITCHER_GIRL
IF NOT bPickUpFromHome
vStorePos = << 1538.4315, 3776.8496, 33.5178 >>
fStoreRot = 225.8821
ELSE
vStorePos = vAfterCutPos
fStoreRot = fAfterCutRot
ENDIF
vPickUpGirlSpot = vStorePos
BREAK
ENDSWITCH
ENDPROC
// get on foot and in vehicle locations to trigger mission pass
PROC GET_STRIPPER_HOME_POSITIONS()
SWITCH stripperID[0]
//Strip Club 1
CASE BC_STRIPPER_NIKKI
vPlayerWalkToPos = <<128.1002, -1895.0007, 22.4811>>
vHouseDoorPos = <<128.1059, -1896.8188, 22.6792>>
vHouseInVehiclePos = <<133.9411, -1881.8903, 22.5257>>
vHouseOnFootPos = <<130.1663, -1893.0575, 22.3748>>
vAfterCutPos = <<133.4958, -1891.6410, 22.4252>>//<<132.6200, -1893.2034, 22.4094>>//<<132.2298, -1894.2551, 22.4046>>//<<131.6968, -1895.2684, 22.3858>>
fAfterCutRot = 330.5705
fVehicleHeading = 244
vHeliPos = <<146.2930, -1888.0493, 22.2193>>
fHeliHeading = fVehicleHeading
BREAK
CASE BC_STRIPPER_JULIET
//ghetto
vPlayerWalkToPos = <<-161.9628, -1636.5010, 33.0339>>
vHouseDoorPos = <<-159.9415, -1637.3070, 33.0339>> // << 117.84, -1084.93, 28.43 >>
vHouseInVehiclePos = <<-178.6316, -1629.5216, 32.1789>>
vHouseOnFootPos = <<-166.1453, -1633.1024, 32.6574>> //<< 116.15, -1503.96, 28.61 >>
vAfterCutPos = <<-166.6636, -1633.2289, 32.6567>> //<< 118.01, -1051.65, 28.69 >>
fAfterCutRot = 108.072 //150.2975
fVehicleHeading = 180.9811 //-23.88
vHeliPos = vHouseInVehiclePos
fHeliHeading = fVehicleHeading
BREAK
// CASE BC_STRIPPER_CHASTITY
// //More upscale
// vHouseDoorPos = << -587.7217, -819.0717, 25.1546 >>
// vHouseInVehiclePos = << -580.28, -823.50, 26.02 >>
// vHouseOnFootPos = << -586.9907, -818.2007, 25.1889 >>
// vAfterCutPos = << -588.0719, -820.5512, 26.3 >>
// fAfterCutRot = 192.7169
// fVehicleHeading = 0.0
// BREAK
// CASE BC_STRIPPER_CHEETAH
// //More upscale venice
// vHouseDoorPos = << -986.4089, -1122.4113, 3.5502 >>
// vHouseInVehiclePos = << -987.9908, -1112.8301, 1.1375 >>
// vHouseOnFootPos = << -983.0440, -1128.8718, 1.1503 >>
// vAfterCutPos = << -990.6027, -1118.0056, 2.2 >>
// fAfterCutRot = 14.6192
// fVehicleHeading = -64.75
// BREAK
//Strip Club 2
CASE BC_STRIPPER_SAPPHIRE
vPlayerWalkToPos = <<-198.3824, 87.8785, 68.7436>>
vHouseDoorPos = << -197.2292, 86.3497, 68.7561 >>
vHouseInVehiclePos = <<-200.9078, 113.5370, 68.5518>>
vHouseOnFootPos = <<-200.1384, 96.9809, 68.5203>>
vAfterCutPos = <<-199.5068, 95.7042, 68.5193>>
fAfterCutRot = 48.99
fVehicleHeading = 64.3
vHeliPos = vHouseInVehiclePos
fHeliHeading = fVehicleHeading
BREAK
CASE BC_STRIPPER_INFERNUS
vPlayerWalkToPos = <<-849.0348, 510.6906, 89.8218>>
vHouseDoorPos = << -849.0408, 508.5767, 89.8218 >>
vHouseInVehiclePos = <<-846.1005, 520.2202, 89.6217>>
vHouseOnFootPos = <<-851.8972, 512.7300, 89.6217>>
vAfterCutPos = <<-851.8746, 513.6746, 89.6217>>
fAfterCutRot = 92.365
fVehicleHeading = 293
vHeliPos = <<-860.4819, 514.2496, 88.1473>>
fHeliHeading = fVehicleHeading
BREAK
// CASE BC_STRIPPER_FUFU // hard to park here
// vHouseDoorPos = << -516.55, 593.24, 120.84 >>
// vHouseInVehiclePos = <<-519.9916, 575.0677, 119.9987>>
// vHouseOnFootPos = << -512.26, 581.28, 120.77 >>
// vAfterCutPos = << -516.55, 593.24, 120.84 >>
// fAfterCutRot = -167.00
// fVehicleHeading = 87.45
// BREAK
// CASE BC_STRIPPER_PEACH
// vHouseDoorPos = << -456.7136, 92.7175, 62.5518 >>
// vHouseInVehiclePos = <<-449.4174, 99.9586, 62.1617>>
// vHouseOnFootPos = << -456.8262, 107.5538, 63.3997 >>
// vAfterCutPos =<< -457.1387, 104.2222, 63.3476 >>
// fAfterCutRot = 348.7793
// fVehicleHeading = 180.00
// BREAK
// non-stripper homes
// CASE BC_FIXED_CAR
// vHouseDoorPos = << -194.48, 141.08, 69.42 >>
// vHouseInVehiclePos = << -192.70, 132.82, 68.69 >>
// vHouseOnFootPos = << -195.63, 137.95, 69.05 >>
// vAfterCutPos = << -197.2565, 133.8592, 68.6438 >>
// fAfterCutRot = 162.78
// BREAK
CASE BC_TAXI_LIZ
vPlayerWalkToPos = <<-28.2427, -1555.8925, 29.6918>>
vHouseDoorPos = << -24.8589, -1556.8461, 29.6819 >>
vHouseInVehiclePos = << -41.8174, -1575.6086, 28.2831 >>
vHouseOnFootPos = <<-25.3404, -1556.3406, 29.6919>>//<<-27.7515, -1570.0551, 28.3246>>
vAfterCutPos = << -27.7382, -1570.5724, 29.3 >>
fAfterCutRot = 181.3520
fVehicleHeading = 47.9206
vHeliPos = vHouseInVehiclePos
fHeliHeading = fVehicleHeading
BREAK
CASE BC_HITCHER_GIRL
vPlayerWalkToPos = <<3313.4871, 5175.8306, 18.6190>>
vHouseDoorPos = <<3310.8157, 5176.3306, 18.6190>>
vHouseInVehiclePos = <<3334.3206, 5161.1221, 17.2996>>
vHouseOnFootPos = <<3317.7876, 5171.7070, 17.4471>>
vAfterCutPos = <<3318.0757, 5171.8052, 17.4385>>
fAfterCutRot = 236.4579
vHeliPos = <<3322.9268, 5148.6074, 17.3141>>
fHeliHeading = 310.8648
BREAK
/*
CASE STRIPPER_IVANA
CASE STRIPPER_JO
CASE STRIPPER_KRISTEN
CASE STRIPPER_LISA
vHouseDoorPos = <<1160.36, -1680.43, 34.39>>
vHouseInVehiclePos = <<1162.72, -1704.46, 35.08>>
vHouseOnFootPos = <<1159.90, -1700.96, 34.44>>
vAfterCutPos = <<1159.84, -1683.97, 34.42>>
fAfterCutRot = -178.29
BREAK
*/
ENDSWITCH
ENDPROC
// get attribs for home cam
PROC GET_HOME_CAMERA_ATTRIBUTES(VECTOR &vCamPos[NUM_BOOTY_CALL_CAMS], VECTOR &vCamRot[NUM_BOOTY_CALL_CAMS], FLOAT &fCamFOV[NUM_BOOTY_CALL_CAMS])
SWITCH stripperID[0]
CASE BC_STRIPPER_NIKKI
vCamPos[0] = <<140.9085, -1885.5271, 25.6959>>
vCamRot[0] = <<-9.0308, -0.0000, 126.3829>>
fCamFOV[0] = 40.0
vCamPos[1] = <<141.7120, -1884.9351, 30.7241>>
vCamRot[1] = <<4.7025, -0.0000, 129.5531>>
fCamFOV[1] = 40.0
vCamPos[2] = <<139.189865,-1885.865356,24.967369>>
vCamRot[2] = <<-3.535496,0.081819,135.130814>>
fCamFOV[2] = 50.0
vCamPos[3] = <<133.9669, -1893.2922, 23.9573>>
vCamRot[3] = <<-1.8669, -0.0329, -5.5828>>
fCamFOV[3] = 50.0
BREAK
CASE BC_STRIPPER_JULIET
vCamPos[0] = <<-186.5408, -1629.3278, 35.8275>>
vCamRot[0] = <<-1.5588, 0.0000, -118.8025>>
fCamFOV[0] = 40.0
vCamPos[1] = <<-186.1923, -1629.5049, 48.7132>>
vCamRot[1] = <<-1.2745, -0.0000, -116.9616>>
fCamFOV[1] = 40.0
vCamPos[2] = <<-184.959503,-1632.193237,36.323029>>
vCamRot[2] = <<-3.262451,0.073971,-100.675636>>
fCamFOV[2] = 40.0
vCamPos[3] = <<-164.7078, -1632.2499, 34.0944>>
vCamRot[3] = <<-3.7303, 0.0222, 108.1824>>
fCamFOV[3] = 40.0
BREAK
CASE BC_STRIPPER_SAPPHIRE
vCamPos[0] = <<-208.6886, 112.8581, 73.0855>>
vCamRot[0] = <<-0.1055, 0.0000, -156.0082>>
fCamFOV[0] = 40.0
vCamPos[1] = <<-208.9068, 113.3747, 85.2889>>
vCamRot[1] = <<3.8438, -0.0000, -157.0767>>
fCamFOV[1] = 40.0
vCamPos[2] =<<-206.235718,106.940987,72.075546>>
vCamRot[2] = <<-11.583810,0.084975,-158.970230>>
fCamFOV[2] = 45.0
vCamPos[3] = <<-197.6886, 94.7063, 69.8140>>
vCamRot[3] = <<0.5155, -0.0266, 48.8652>>
fCamFOV[3] = 45.0
BREAK
CASE BC_STRIPPER_INFERNUS
vCamPos[0] = <<-871.6285, 520.8466, 93.1945>>
vCamRot[0] = <<-0.1377, -1.3933, -105.9309>>
fCamFOV[0] = 40.0
vCamPos[1] = <<-871.5255, 521.1066, 104.6356>>
vCamRot[1] = <<3.1118, -1.3933, -105.9309>>
fCamFOV[1] = 40.0
vCamPos[2] = <<-866.643616,514.612061,92.902748>>
vCamRot[2] = <<-5.957637,-1.324997,-101.906235>>
fCamFOV[2] = 40.0
vCamPos[3] = <<-849.5522, 514.2322, 91.0095>>
vCamRot[3] = <<-1.6260, -1.3198, 92.3739>>
fCamFOV[3] = 40.0
BREAK
CASE BC_TAXI_LIZ
vCamPos[0] =<<-27.6980, -1584.6459, 31.1034>>
vCamRot[0] = <<0.0044, -0.0000, -1.9117>>
fCamFOV[0] = 40.0
vCamPos[1] = <<-27.6980, -1584.6459, 40.4849>>
vCamRot[1] = <<7.9810, 0.0000, -1.9117>>
fCamFOV[1] = 40.0
vCamPos[2] = <<-28.639044,-1579.740356,30.824232>>
vCamRot[2] = <<-7.527712,0.030218,-14.330508>>
fCamFOV[2] = 40.0
vCamPos[3] = <<-28.6719, -1568.0903, 29.7492>>
vCamRot[3] = <<-1.5414, -0.0000, -168.6005>>
fCamFOV[3] = 40.0
BREAK
CASE BC_HITCHER_GIRL
vCamPos[0] = <<3323.6306, 5148.8608, 20.9592>>
vCamRot[0] = <<1.1547, 1.0064, 21.8733>>
fCamFOV[0] = 40.0
vCamPos[1] = <<3323.8440, 5148.6719, 28.2303>>
vCamRot[1] = <<11.4168, 1.0064, 22.8025>>
fCamFOV[1] = 40.0
vCamPos[2] = <<3328.903809,5157.818359,20.579899>>
vCamRot[2] = <<-3.634001,1.039937,30.448088>>
fCamFOV[2] = 40.0
vCamPos[3] = <<3315.3682, 5171.7715, 18.9066>>
vCamRot[3] = <<-2.8773, 1.0064, -103.0585>>
fCamFOV[3] = 40.0
BREAK
ENDSWITCH
ENDPROC
FUNC VECTOR GET_PLAYER_WARP_POS_POST_SEX()
SWITCH stripperID[0]
CASE BC_STRIPPER_NIKKI
RETURN <<130.7462, -1896.5129, 22.3246>>
BREAK
CASE BC_STRIPPER_JULIET
RETURN <<-162.4315, -1635.1072, 32.6529>>
BREAK
CASE BC_STRIPPER_SAPPHIRE
RETURN <<-197.6542, 92.3329, 68.5846>>
BREAK
CASE BC_STRIPPER_INFERNUS
RETURN <<-848.9675, 510.0480, 89.8218>>
BREAK
CASE BC_TAXI_LIZ
RETURN <<-28.5266, -1565.7926, 28.9180>>
BREAK
CASE BC_HITCHER_GIRL
RETURN <<3315.0449, 5174.0801, 17.6765>>
BREAK
ENDSWITCH
RETURN <<0,0,0>>
ENDFUNC
FUNC FLOAT GET_PLAYER_WARP_HEADING_POST_SEX()
SWITCH stripperID[0]
CASE BC_STRIPPER_NIKKI
RETURN 325.6
BREAK
CASE BC_STRIPPER_JULIET
RETURN 52.89
BREAK
CASE BC_STRIPPER_SAPPHIRE
RETURN 14.5
BREAK
CASE BC_STRIPPER_INFERNUS
RETURN 43.85
BREAK
CASE BC_TAXI_LIZ
RETURN 193.5
BREAK
CASE BC_HITCHER_GIRL
RETURN 233.2
BREAK
ENDSWITCH
RETURN 0.0
ENDFUNC
PROC PRINT_PICK_UP_BOOTY_CALL(BOOL bPickUpFromHouse)
SWITCH stripperID[0]
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 bPickUpFromHouse
PRINT_OBJECTIVE_WITH_STRIPPER_NAMES( "SCLUB_HOME_MEE4" , stripperID[0])
ELSE
PRINT_OBJECTIVE_WITH_STRIPPER_NAMES( "SCLUB_HOME_MEET" , stripperID[0])
ENDIF
BREAK
CASE BC_TAXI_LIZ
PRINT_OBJECTIVE_WITH_STRIPPER_NAMES( "SCLUB_HOME_LIZ" , stripperID[0])
BREAK
CASE BC_HITCHER_GIRL
PRINT_OBJECTIVE_WITH_STRIPPER_NAMES( "SCLUB_HOME_HITCH" , stripperID[0])
BREAK
ENDSWITCH
ENDPROC
PROC PRINT_TAKE_BOOTY_CALL_HOME(BOOL bDropOffAtHome)
SWITCH stripperID[0]
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 bDropOffAtHome
PRINT_OBJECTIVE_WITH_STRIPPER_NAMES( "SCLUB_HOME_GO" , stripperID[0])
ELSE
PRINT_NOW("SCLUB_CLUB_GO", DEFAULT_GOD_TEXT_TIME, 1)
ENDIF
BREAK
//CASE BC_FIXED_CAR
CASE BC_TAXI_LIZ
CASE BC_HITCHER_GIRL
PRINT_NOW("SCLUB_HOME_GO3", DEFAULT_GOD_TEXT_TIME, 1)
BREAK
ENDSWITCH
ENDPROC
PROC GIVE_CALL_AND_LEAVE_TASK(PED_INDEX ped)
IF NOT IS_PED_INJURED(ped)
SET_PED_PATH_AVOID_FIRE(ped, TRUE)
IF GET_SCRIPT_TASK_STATUS( ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
CLEAR_SEQUENCE_TASK(sequence)
OPEN_SEQUENCE_TASK(sequence)
TASK_USE_MOBILE_PHONE_TIMED(NULL,8000)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vHouseDoorPos, 1.5/*PEDMOVE_WALK*/, -1, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT)
CLOSE_SEQUENCE_TASK(sequence)
TASK_PERFORM_SEQUENCE(ped, sequence)
CDEBUG1LN(DEBUG_BOOTY_CALL,"Booty Call - Chick got phone & walk task" )
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_STRIPPER_BEING_LEFT_BEHIND(PED_INDEX pedStripper, BOOL bOnFootZDist = FALSE)
VECTOR vPlayerCoords, vStripperCoords
vPlayerCoords = GET_ENTITY_COORDS( PLAYER_PED_ID() )
vStripperCoords = GET_ENTITY_COORDS( pedStripper )
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX vehPlayersLast = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF GET_PED_GROUP_INDEX(pedStripper) = PLAYER_GROUP_ID()
IF IS_VEHICLE_DRIVEABLE( vehPlayersLast )
IF NOT IS_PED_IN_VEHICLE(pedStripper, vehPlayersLast)
AND VDIST(vPlayerCoords, vStripperCoords ) > 10.0
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF bOnFootZDist
AND IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_MEET_IS_NEAR)
FLOAT fZDif = ABSF( vPlayerCoords.z - vStripperCoords.z )
IF fZDif > 8.0
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC HANDLE_STRIPPER_TEXT_FOR_BEING_STOOD_UP()
IF IS_FREEMODE()
EXIT //stripper does not contact player in freemode
ENDIF
CC_TextPart ePartStripper
ePartStripper = GET_TEXT_PARTID_FOR_STRIPPER(stripperID[0])
CDEBUG1LN(DEBUG_BOOTY_CALL,"[SEXT] Queueing sext to be sent ", GET_COMM_ID_DEBUG_STRING(TEXT_SEXT), " ", GET_TEXT_PART_DEBUG_STRING(ePartStripper), " ", GET_TEXT_PART_DEBUG_STRING(TPART_SEXT_STUP), ".")
REGISTER_COMPOSITE_TEXT_MESSAGE_FROM_CHARACTER_TO_PLAYER(
TEXT_SEXT,
ePartStripper,
TPART_SEXT_STUP,
CT_FRIEND,
GET_CURRENT_PLAYER_PED_BIT(),
GET_BOOTY_CALL_CONTACT_CONTACT_ENUM(stripperID[0]),
0)
ENDPROC
PROC SETUP_BOOTYCALL_WAIT_TIME(BOOL bHandleNearFail = FALSE)
//DEBUG TIME OF DAY DEADLINES
IF NOT Is_TIMEOFDAY_Valid(eTODCALLMade)
eTODCALLMade = GET_CURRENT_TIMEOFDAY()
ADD_TIME_TO_TIMEOFDAY(eTODCALLMade , 0, 0,GET_RANDOM_INT_IN_RANGE(BOOTY_CALL_WAIT_FOR_PLAYER_TIME_MIN, BOOTY_CALL_WAIT_FOR_PLAYER_TIME_MAX) )
CDEBUG1LN(DEBUG_BOOTY_CALL,"Time of Day Setup")
ELSE
//Debug Print the TOD that the call will end if the player takes too long
#IF IS_DEBUG_BUILD
#IF CONST_iShowDebugInfo
// TEXT_LABEL_63 sDebugTOD
//
// sDebugTOD = TIMEOFDAY_TO_TEXT_LABEL(eTODCALLMade)
// sDebugTOD += "Booty Call Ends"
// DRAW_DEBUG_TEXT_2D( sDebugTOD , <<0.1, 0.28, 0.0>>)
#ENDIF
#ENDIF
IF bHandleNearFail
IF NOT IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_MEET_GIRL_CANCEL)
IF IS_NOW_AFTER_TIMEOFDAY(eTODCALLMade)
AND IS_ENTITY_OCCLUDED(stripperPed[0])
IF stripperID[0] = BC_TAXI_LIZ
OR stripperID[0] = BC_HITCHER_GIRL
TEXT_LABEL_63 sCallLabel = "SC_CANCEL_"
sCallLabel += ENUM_TO_INT(stripperID[0])
ADD_PED_FOR_DIALOGUE(stripperConversation, 1, NULL, GET_BOOTY_CALL_NAME_AS_STRING(stripperID[0]))
CHAR_CALL_PLAYER_CELLPHONE_FORCE_ANSWER( stripperConversation, GET_BOOTY_CALL_CONTACT_CONTACT_ENUM(stripperID[0]),"SHAUD" ,sCallLabel, CONV_PRIORITY_MEDIUM)
ELSE
HANDLE_STRIPPER_TEXT_FOR_BEING_STOOD_UP()
ENDIF
GIVE_CALL_AND_LEAVE_TASK(stripperPed[0])
SET_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_MEET_GIRL_CANCEL)
ENDIF
//Chick has called and cancelled now process.
ELSE
IF WAS_LAST_CELLPHONE_CALL_INTERRUPTED()
CLEAR_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_MEET_GIRL_CANCEL)
CDEBUG1LN(DEBUG_BOOTY_CALL,"Booty Call - Player interupted phonecall" )
//There's a bug in here somewhere, when the player receives a call, it auto hangs up and cancels the mission.
ELIF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND HAS_CELLPHONE_CALL_FINISHED()
AND NOT WAS_LAST_CELLPHONE_CALL_INTERRUPTED()
CDEBUG1LN(DEBUG_BOOTY_CALL,"Booty Call - Player cancelled the booty call & not hung up 1 " )
RESET_BOOTY_CALL_TO_INACTIVE(TRUE)
MISSION_FAILED(FAIL_STRIPPER_CANCELLED)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC TEXT_LABEL_63 GET_BOOTY_CALL_CANCEL_LINE()
TEXT_LABEL_63 sBootyCallLabel
sBootyCallLabel = "BC_DECR_"
sBootyCallLabel += ENUM_TO_INT(stripperID[0])
CDEBUG1LN(DEBUG_BOOTY_CALL,"[CELLPHONE] Cancel Line = ", sBootyCallLabel)
RETURN sBootyCallLabel
ENDFUNC
FUNC STRING GET_WAYPOINT_RECORDING_NAME_FOR_BOOTY_CALL()
STRING sWaypointRecordingName
IF stripperID[0] = BC_STRIPPER_NIKKI
sWaypointRecordingName = "BC_NIKKI_H_F"
ENDIF
RETURN sWaypointRecordingName
ENDFUNC
PROC REQUEST_SPECIFIC_ASSETS_FOR_BOOTYCALL()
IF NOT IS_STRING_NULL_OR_EMPTY(GET_WAYPOINT_RECORDING_NAME_FOR_BOOTY_CALL())
REQUEST_WAYPOINT_RECORDING(GET_WAYPOINT_RECORDING_NAME_FOR_BOOTY_CALL())
CDEBUG1LN(DEBUG_BOOTY_CALL,"Requesting Waypoint Recording: ", GET_WAYPOINT_RECORDING_NAME_FOR_BOOTY_CALL() )
ENDIF
ENDPROC
FUNC BOOL HAVE_SPECIFIC_ASSETS_FOR_BOOTYCALL_LOADED()
IF IS_STRING_NULL_OR_EMPTY(GET_WAYPOINT_RECORDING_NAME_FOR_BOOTY_CALL())
RETURN TRUE
ELSE
IF GET_IS_WAYPOINT_RECORDING_LOADED(GET_WAYPOINT_RECORDING_NAME_FOR_BOOTY_CALL())
RETURN TRUE
ELSE
CDEBUG1LN(DEBUG_BOOTY_CALL,"Waiting to Load.....Waypoint Recording ", GET_WAYPOINT_RECORDING_NAME_FOR_BOOTY_CALL() )
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
// init script
FUNC BOOL INIT_MISSION(TAKE_HOME_STRIPPER_INFO& takeHomeInfo, BOOL bPickUpFromHome)
VECTOR vStorePos
FLOAT fStoreRot
GET_STRIPPER_HOME_POSITIONS()
GET_INIT_TAKE_HOME_STRIPPER_LOC(vStorePos, fStoreRot, bPickUpFromHome)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF (fInitDistance = -1)
fInitDistance = VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), vStorePos)
CDEBUG1LN(DEBUG_BOOTY_CALL,"Init Distance is: ", fInitDistance)
ENDIF
IF (candidateID = NO_CANDIDATE_ID)
candidateID = takeHomeInfo.myCandidateID
ENDIF
//Set up the booty call ped--------------------------------------------------------------------------------------
INT i
IF NOT IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_MEET_REQUEST_MODELS)
ADD_STREAMED_MODEL(takeHomeModels, GET_BOOTYCALL_MODEL_ENUM(takeHomeInfo.stripperID[0]))
REQUEST_ALL_MODELS(takeHomeModels)
SET_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_MEET_REQUEST_MODELS)
REQUEST_ANIM_DICT("mini@strip_club@idles@stripper")
REQUEST_ANIM_DICT("gestures@f@standing@casual")
REQUEST_SPECIFIC_ASSETS_FOR_BOOTYCALL()
RETURN FALSE
ELIF NOT ARE_MODELS_STREAMED(takeHomeModels)
OR NOT HAS_ANIM_DICT_LOADED("mini@strip_club@idles@stripper")
OR NOT HAVE_SPECIFIC_ASSETS_FOR_BOOTYCALL_LOADED()
RETURN FALSE
ENDIF
IF bIsMp
IF NOT CAN_REGISTER_MISSION_PEDS(1)
PRINTLN("Can't register bootycall ped")
RETURN FALSE
ENDIF
ENDIF
IF NOT IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_MEET_STRIPPER_CREATED)
DEBUG_MESSAGE("Creating stripper and adding to group")
#IF IS_DEBUG_BUILD
DEBUG_MESSAGE("INIT_MISSION: takeHomeInfo.stripperID[", GET_STRING_FROM_INT(0), "]: ", GET_BOOTY_CALL_NAME_AS_STRING(takeHomeInfo.stripperID[0]))
#ENDIF
stripperID[0] = takeHomeInfo.stripperID[0]
stripperPed[0] = CREATE_PED(PEDTYPE_MISSION, GET_BOOTYCALL_MODEL_ENUM(takeHomeInfo.stripperID[0]), vStorePos, fStoreRot) // takeHomeInfo.vInitPos[i], takeHomeInfo.fInitRot[i])
SETUP_SCLUB_STRIPPER_VARIATION(stripperPed[0], stripperID[0])
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(stripperPed[i], TRUE)
SET_PED_KEEP_TASK(stripperPed[0], TRUE)
SET_PED_DIES_WHEN_INJURED(stripperPed[0], TRUE)
SET_JACKET_VARIATION_ON_STRIPPER(stripperPed[0])
TASK_PLAY_ANIM(stripperPed[0], "mini@strip_club@idles@stripper", "stripper_idle_01", NORMAL_BLEND_IN, WALK_BLEND_OUT, -1, AF_LOOPING)
TASK_LOOK_AT_ENTITY(stripperPed[i], PLAYER_PED_ID(), INFINITE_TASK_TIME, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
//SET_PED_AS_GROUP_MEMBER(stripperPed[i], PLAYER_GROUP_ID())
CDEBUG1LN(DEBUG_BOOTY_CALL,"Booty Call - Add Ped 1" )
SET_PED_GROUP_MEMBER_PASSENGER_INDEX(stripperPed[0], VS_FRONT_RIGHT)
SET_AMBIENT_VOICE_NAME(stripperPed[0],GET_BOOTY_CALL_NAME_AS_STRING(takeHomeInfo.stripperID[0]))
ADD_PED_FOR_DIALOGUE(stripperConversation, 1, stripperPed[0], GET_BOOTY_CALL_NAME_AS_STRING(takeHomeInfo.stripperID[0]))
SET_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_MEET_STRIPPER_CREATED)
//DEBUG BYPASS
#IF IS_DEBUG_BUILD
IF g_bTurnOnLukeHCameraDebug
IF NOT IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_GEN_HOME_SCENE_PLAYING)
currentMissionStage = DEBUG_SKIP_MODE
ENDIF
RETURN TRUE
ENDIF
#ENDIF
ENDIF
//If player isn't in area-------------------------------------------------------------------------------------------------------------------
IF VDIST( GET_ENTITY_COORDS(PLAYER_PED_ID()), vStorePos) > CONST_fCleanupDistance
IF CAN_DO_STRIPPER_HOME_GOD_TEXT()
IF NOT IS_BITMASK_AS_ENUM_SET( iGeneralBitFlags, HOUSE_MEET_UP_TEXT )
PRINT_PICK_UP_BOOTY_CALL(bPickUpFromHome)
CREATE_STRIPPER_BLIP(0)
SET_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_MEET_UP_TEXT)
ENDIF
ENDIF
IF NOT IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_MEET_INIT_CANCEL)
AND NOT IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_MEET_GIRL_CANCEL)
IF IS_CALLING_CONTACT(GET_BOOTY_CALL_CONTACT_CONTACT_ENUM(takeHomeInfo.stripperID[0]))
TEXT_LABEL_63 sCallLabel = "BC_PLYRC_"
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
ADD_PED_FOR_DIALOGUE(stripperConversation, 0, PLAYER_PED_ID(), "TREVOR")
sCallLabel += "T"
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
ADD_PED_FOR_DIALOGUE(stripperConversation, 0, PLAYER_PED_ID(), "MICHAEL")
sCallLabel += "M"
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
ADD_PED_FOR_DIALOGUE(stripperConversation, 0, PLAYER_PED_ID(), "FRANKLIN")
sCallLabel += "F"
ENDIF
CDEBUG1LN(DEBUG_BOOTY_CALL,"[CELLPHONE] Cancel Player Line = ", sCallLabel)
ADD_PED_FOR_DIALOGUE(stripperConversation, 3, NULL, GET_BOOTY_CALL_NAME_AS_STRING(takeHomeInfo.stripperID[0]))
//Get booty call response line
TEXT_LABEL_63 sBootyCallCancelLabel
sBootyCallCancelLabel = GET_BOOTY_CALL_CANCEL_LINE()
PLAYER_CALL_CHAR_CELLPHONE_MULTIPART_WITH_2_LINES(stripperConversation,GET_BOOTY_CALL_CONTACT_CONTACT_ENUM(takeHomeInfo.stripperID[0]),"BCAUD",sCallLabel,sCallLabel,sBootyCallCancelLabel,sBootyCallCancelLabel,CONV_PRIORITY_FLOW_ONLY_USE_AMBIENT_SLOT)
SET_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_MEET_INIT_CANCEL)
ENDIF
//Player takes too long to pick up booty call.
IF IS_TIMEOFDAY_VALID( eTODCALLMade )
IF IS_NOW_AFTER_TIMEOFDAY(eTODCALLMade)
IF takeHomeInfo.stripperID[0] = BC_TAXI_LIZ
OR takeHomeInfo.stripperID[0] = BC_HITCHER_GIRL
TEXT_LABEL_63 sCallLabel = "SC_CANCEL_"
sCallLabel += ENUM_TO_INT(takeHomeInfo.stripperID[0])
ADD_PED_FOR_DIALOGUE(stripperConversation, 1, NULL, GET_BOOTY_CALL_NAME_AS_STRING(takeHomeInfo.stripperID[0]))
CHAR_CALL_PLAYER_CELLPHONE_FORCE_ANSWER( stripperConversation, GET_BOOTY_CALL_CONTACT_CONTACT_ENUM(takeHomeInfo.stripperID[0]),"SHAUD" ,sCallLabel, CONV_PRIORITY_FLOW_ONLY_USE_AMBIENT_SLOT)
ELSE
HANDLE_STRIPPER_TEXT_FOR_BEING_STOOD_UP()
ENDIF
SET_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_MEET_GIRL_CANCEL)
ENDIF
ENDIF
ELIF WAS_LAST_CELLPHONE_CALL_INTERRUPTED()
CLEAR_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_MEET_INIT_CANCEL)
CLEAR_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_MEET_GIRL_CANCEL)
CDEBUG1LN(DEBUG_BOOTY_CALL,"Booty Call - Player interupted phonecall" )
//ELIF NOT IS_CALLING_CONTACT(GET_BOOTY_CALL_CONTACT_CONTACT_ENUM(takeHomeInfo.stripperID[0]))
ELIF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND HAS_CELLPHONE_CALL_FINISHED()
AND NOT WAS_LAST_CELLPHONE_CALL_INTERRUPTED()
CDEBUG1LN(DEBUG_BOOTY_CALL,"Booty Call - Player cancelled the booty call & not hung up 2 " )
INCREMENT_STRIPPER_NUM_BOOTY_DENIALS_BY_PLAYER(takeHomeInfo.stripperID[0])
RESET_BOOTY_CALL_TO_INACTIVE(TRUE)
MISSION_FAILED(FAIL_STRIPPER_CANCELLED)
ENDIF
IF NOT IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_MEET_INIT_CANCEL_HELP)
IF NOT IS_PHONE_ONSCREEN()
PRINT_HELP_WITH_STRIPPER_NAMES( "SCLUB_HOME_C_H" ,stripperID[0])
SET_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_MEET_INIT_CANCEL_HELP)
ENDIF
ENDIF
//If my current distance is greater then my initail distance, plus some buffer, then I abbandon the stripper
IF VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), vStorePos) > (fInitDistance + (CONST_fAbandoned*3))
MISSION_FAILED(FAIL_STRIPPER_ABANDONED)
ELIF VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), vStorePos) < fInitDistance
//update initial distance as you approach the stripper
fInitDistance = VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), vStorePos)
ENDIF
#IF IS_DEBUG_BUILD
FLOAT fDebugThis = VDIST( GET_ENTITY_COORDS(PLAYER_PED_ID()), vStorePos)
CDEBUG1LN(DEBUG_BOOTY_CALL,"INIT MISSION - 1442, Dist = ",fDebugThis )
#ENDIF
RETURN FALSE
ENDIF
ELSE
RETURN FALSE
ENDIF
//Setup Player Conversations---------------------------------------------------------------------------------
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
ADD_PED_FOR_DIALOGUE(stripperConversation, 0, PLAYER_PED_ID(), "TREVOR")
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
ADD_PED_FOR_DIALOGUE(stripperConversation, 0, PLAYER_PED_ID(), "MICHAEL")
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
ADD_PED_FOR_DIALOGUE(stripperConversation, 0, PLAYER_PED_ID(), "FRANKLIN")
ENDIF
RETURN TRUE
ENDFUNC
PROC CHECK_FAIL_CONDITIONS()
IF IS_PED_INJURED(stripperPed[0])
IF NOT DOES_ENTITY_EXIST(stripperPed[0])
PRINTLN("Bootycall ", 0, " doesn't exist")
ELSE
IF IS_ENTITY_DEAD(stripperPed[0])
PRINTLN("Bootycall ", 0, " is dead")
ENDIF
ENDIF
DEBUG_MESSAGE("failling mission due to stripper being injured")
MISSION_FAILED(FAIL_STRIPPER_DEAD)
ENDIF
ENDPROC
PROC ADD_STRIPPERS_TO_GROUP()
IF NOT IS_PED_IN_GROUP(stripperPed[0])
AND VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(stripperPed[0]) ) < 10.0
SET_PED_AS_GROUP_MEMBER(stripperPed[0], PLAYER_GROUP_ID())
SET_PED_GROUP_MEMBER_PASSENGER_INDEX(stripperPed[0], INT_TO_ENUM(VEHICLE_SEAT, 0))
CDEBUG1LN(DEBUG_BOOTY_CALL,"Adding strippers to player's group" )
ENDIF
ENDPROC
PROC HANDLE_NICE_RIDE_CONVERSATION()
IF NOT IS_BITMASK_AS_ENUM_SET(iBanterBitFlags, HOUSE_BANTER_NICE_CAR)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_PLAYER_DRIVING_A_NICE_RIDE(stripperID[0])
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
PLAY_PED_AMBIENT_SPEECH(stripperPed[0], "NICE_CAR", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
SET_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_NICE_CAR)
PRINTLN("PLAYING NICE CAR LINE")
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
// setup camera
PROC SETUP_HOME_CAM()
INT iCamIterator
VECTOR vHomeCamPos[NUM_BOOTY_CALL_CAMS], vHomeCamRot[NUM_BOOTY_CALL_CAMS]
FLOAT fHomeCamFOV[NUM_BOOTY_CALL_CAMS]
GET_HOME_CAMERA_ATTRIBUTES(vHomeCamPos, vHomeCamRot, fHomeCamFOV)
REPEAT NUM_BOOTY_CALL_CAMS iCamIterator
IF NOT DOES_CAM_EXIST(homeCam[iCamIterator])
homeCam[iCamIterator] = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED,vHomeCamPos[iCamIterator],vHomeCamRot[iCamIterator],fHomeCamFOV[iCamIterator],FALSE)
SHAKE_CAM(homeCam[iCamIterator],"HAND_SHAKE",0.3)
ENDIF
ENDREPEAT
//Set up TOD cam based on the position
tTimeLapse.splineCamera = CREATE_CAM("DEFAULT_SPLINE_CAMERA")
ADD_CAM_SPLINE_NODE(tTimeLapse.splineCamera, vHomeCamPos[0], vHomeCamRot[0], CONST_iHomePanUpTODTime)
ADD_CAM_SPLINE_NODE(tTimeLapse.splineCamera, vHomeCamPos[1], vHomeCamRot[1], CONST_iHomePanUpTODTime)
SET_CAM_FOV(tTimeLapse.splineCamera, fHomeCamFOV[0])
ENDPROC
PROC SET_ENTITY_FACING(ENTITY_INDEX entity, vector vLookAt)
VECTOR vEntity = GET_ENTITY_COORDS(entity)
float fAngle
float dX = vLookAt.x - vEntity.x
float dY = vLookAt.y - vEntity.y
if dY != 0
fAngle = ATAN2(dX,dY)
ELSE
if dX < 0
fAngle = -90
ELSE
fAngle = 90
ENDIF
ENDIF
//flip because for some odd reason the coders think west is a heading of 90 degrees, so this'll match the output of commands such as GET_ENTITY_HEADING()
fAngle *= -1.0
SET_ENTITY_HEADING(entity, fAngle)
ENDPROC
// go to door
PROC GIVE_WALK_TO_DOOR_TASK(PED_INDEX ped,VECTOR vWalkToPos)
IF NOT IS_PED_INJURED(ped)
SET_PED_PATH_AVOID_FIRE(ped, TRUE)
IF GET_SCRIPT_TASK_STATUS( ped, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
CLEAR_SEQUENCE_TASK(sequence)
OPEN_SEQUENCE_TASK(sequence)
IF IS_PED_IN_ANY_VEHICLE(ped)
TASK_LEAVE_ANY_VEHICLE(NULL, 0, ECF_WAIT_FOR_ENTRY_POINT_TO_BE_CLEAR )
ENDIF
//Player only
IF ped = PLAYER_PED_ID()
FLOAT fDistanceToWalkToPos = VDIST( GET_ENTITY_COORDS(ped), vPlayerWalkToPos)
FLOAT fDistanceToFrontDoor = VDIST( GET_ENTITY_COORDS(ped), vHouseDoorPos )
IF fDistanceToFrontDoor < fDistanceToWalkToPos
TASK_TURN_PED_TO_FACE_ENTITY(NULL,stripperPed[0])
ELSE
IF NOT IS_STRING_NULL_OR_EMPTY(GET_WAYPOINT_RECORDING_NAME_FOR_BOOTY_CALL())
TASK_FOLLOW_WAYPOINT_RECORDING(NULL,GET_WAYPOINT_RECORDING_NAME_FOR_BOOTY_CALL(),0,EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS | EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_USE_TIGHTER_TURN_SETTINGS)
ELSE
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vPlayerWalkToPos, PEDMOVE_WALK, -1, DEFAULT_NAVMESH_RADIUS, ENAV_DONT_AVOID_OBJECTS)
ENDIF
ENDIF
CDEBUG1LN(DEBUG_BOOTY_CALL,"[COORDS]DistanceTo Walk Pos = ",fDistanceToWalkToPos, " Dist to Door =" , fDistanceToFrontDoor )
ENDIF
IF ped != PLAYER_PED_ID()
//If you have a waypoint recording use it, if not proceed to a simple nav task
IF NOT IS_STRING_NULL_OR_EMPTY(GET_WAYPOINT_RECORDING_NAME_FOR_BOOTY_CALL())
TASK_FOLLOW_WAYPOINT_RECORDING(NULL,GET_WAYPOINT_RECORDING_NAME_FOR_BOOTY_CALL(),0,EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS | EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT | EWAYPOINT_USE_TIGHTER_TURN_SETTINGS)
ELSE
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vWalkToPos, PEDMOVE_WALK, -1, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
ENDIF
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(ped, vWalkToPos) > 5.0
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID())
TASK_PLAY_ANIM(NULL, "gestures@f@standing@casual", "gesture_come_here_soft")
TASK_STAND_STILL(NULL,GET_RANDOM_INT_IN_RANGE(3000,6000))
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID())
TASK_PLAY_ANIM(NULL, "gestures@f@standing@casual", "gesture_come_here_soft")
TASK_STAND_STILL(NULL,GET_RANDOM_INT_IN_RANGE(3000,6000))
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID())
TASK_PLAY_ANIM(NULL, "gestures@f@standing@casual", "gesture_come_here_soft")
TASK_PLAY_ANIM(NULL, "mini@strip_club@idles@stripper", "stripper_idle_01", NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1, AF_DEFAULT)
ENDIF
ENDIF
CLOSE_SEQUENCE_TASK(sequence)
TASK_PERFORM_SEQUENCE(ped, sequence)
PRINTLN("Telling ped to walk to door at ", vWalkToPos)
ENDIF
ENDIF
ENDPROC
PROC MOVE_VEHICLE_TO_PARK_COORD(VEHICLE_INDEX iPlayerPedVeh)
IF NOT IS_ENTITY_DEAD(iPlayerPedVeh)
FREEZE_ENTITY_POSITION(iPlayerPedVeh, TRUE)
VECTOR vVehParkFrom = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vHouseInVehiclePos, fVehicleHeading, <<0, CONST_fYParkOffset, 0>>)
vVehParkFrom.z += 1.0
SET_ENTITY_COORDS(iPlayerPedVeh, vVehParkFrom)
SET_VEHICLE_ON_GROUND_PROPERLY(iPlayerPedVeh)
SET_ENTITY_HEADING(iPlayerPedVeh, fVehicleHeading)
FREEZE_ENTITY_POSITION(iPlayerPedVeh, FALSE)
ENDIF
ENDPROC
// park car
PROC GIVE_PARK_TASK(PED_INDEX iPlayerPed, VEHICLE_INDEX iPlayerPedVeh)
IF NOT IS_PED_INJURED(iPlayerPed) AND NOT IS_ENTITY_DEAD(iPlayerPedVeh)
TASK_VEHICLE_PARK(iPlayerPed, iPlayerPedVeh, vHouseInVehiclePos, fVehicleHeading, PARK_TYPE_PULL_OVER)
ENDIF
ENDPROC
FUNC INT GET_NEXT_STRIPPER_BANTER_IN_SEQUENCE()
IF NOT IS_BITMASK_AS_ENUM_SET(iBanterBitFlags, HOUSE_BANTER_ONE_OFF)
SET_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_ONE_OFF)
RETURN 0
ELIF NOT IS_BITMASK_AS_ENUM_SET(iBanterBitFlags, HOUSE_BANTER_ONE_OFF_1)
SET_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_ONE_OFF_1)
RETURN 1
ELIF NOT IS_BITMASK_AS_ENUM_SET(iBanterBitFlags, HOUSE_BANTER_ONE_OFF_2)
SET_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_ONE_OFF_2)
RETURN 2
ELIF NOT IS_BITMASK_AS_ENUM_SET(iBanterBitFlags, HOUSE_BANTER_ONE_OFF_3)
SET_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_ONE_OFF_3)
RETURN 3
ELIF NOT IS_BITMASK_AS_ENUM_SET(iBanterBitFlags, HOUSE_BANTER_ONE_OFF_DONE)
SET_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_ONE_OFF_DONE)
CDEBUG1LN(DEBUG_BOOTY_CALL,"GET_NEXT_STRIPPER_BANTER_IN_SEQUENCE - Banter Finished" )
ENDIF
RETURN -1
ENDFUNC
PROC DO_STAGE_MANAGE_STRIPPER_BANTER(FLOAT fStripperRange, VECTOR vHousePos)
//Handle player smashing into a new car
IF NOT IS_BITMASK_AS_ENUM_SET( iBanterBitFlags, HOUSE_BANTER_STOLEN_CAR)
IF DID_BOOTYCALL_WITNESS_PLAYER_STEALING_CAR(stripperPed[0] )
IF stripperID[0] = BC_TAXI_LIZ
CREATE_CONVERSATION_FOR_BOOTY_CALL("SC_STEALC")
ELSE
PLAY_PED_AMBIENT_SPEECH(stripperPed[0],"GENERIC_SHOCKED_MED",SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ENDIF
CDEBUG1LN(DEBUG_BOOTY_CALL,"Booty call witnessed player stealing car." )
//Piggy backing on this timer, figure it can't hurt, as it just will probably delay dialogue
RESTART_TIMER_NOW(tCarCrash)
SET_BITMASK_AS_ENUM( iBanterBitFlags, HOUSE_BANTER_STOLEN_CAR )
ENDIF
ELIF (GET_TIMER_IN_SECONDS(tCarCrash) > 10.0)
CLEAR_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_STOLEN_CAR)
RESTART_TIMER_NOW(tCarCrash)
ENDIF
IF fStripperRange > 5.0
OR NOT CAN_DO_STRIPPER_HOME_GOD_TEXT()
OR IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_MEET_BJ_STREAMED)
EXIT
ENDIF
IF NOT IS_BITMASK_AS_ENUM_SET(iBanterBitFlags, HOUSE_BANTER_NEAR_HOUSE)
AND NOT IS_BITMASK_AS_ENUM_SET(iBanterBitFlags, HOUSE_BANTER_BJ_FINISHED)
IF VDIST(vHousePos, GET_ENTITY_COORDS(PLAYER_PED_ID())) < CONST_fNearHouse
IF stripperID[0] = BC_TAXI_LIZ
OR stripperID[0] = BC_HITCHER_GIRL
IF CREATE_CONVERSATION_FOR_BOOTY_CALL("SC_NEAR")
SET_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_NEAR_HOUSE)
ENDIF
ELSE
SET_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_NEAR_HOUSE)
ENDIF
CLEAR_AREA_OF_VEHICLES(vHouseInVehiclePos,5.0)
ENDIF
ENDIF
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
EXIT
ENDIF
VEHICLE_INDEX iHousePlayerVehicle = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF NOT IS_VEHICLE_DRIVEABLE(iHousePlayerVehicle)
IF NOT IS_BITMASK_AS_ENUM_SET(iBanterBitFlags, HOUSE_BANTER_NEW_CAR)
PLAY_PED_AMBIENT_SPEECH(stripperPed[0], "NEED_A_VEHICLE", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
SET_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_NEW_CAR)
RESTART_TIMER_NOW(tBanter)
ENDIF
IF NOT IS_BITMASK_AS_ENUM_SET(iBanterBitFlags, HOUSE_BANTER_TOO_FAST)
CLEAR_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_TOO_FAST)
ENDIF
IF NOT IS_BITMASK_AS_ENUM_SET(iBanterBitFlags, HOUSE_BANTER_TOO_SLOW)
CLEAR_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_TOO_SLOW)
ENDIF
ELSE
FLOAT fHouseVehicleSpeed = GET_ENTITY_SPEED(iHousePlayerVehicle)
FLOAT fEstVehicleMaxSpeed = GET_VEHICLE_ESTIMATED_MAX_SPEED(iHousePlayerVehicle)
IF fHouseVehicleSpeed < (fEstVehicleMaxSpeed*0.9)
OR fHouseVehicleSpeed > (fEstVehicleMaxSpeed*0.1)
RESTART_TIMER_NOW(tSpeed)
ENDIF
IF NOT IS_BITMASK_AS_ENUM_SET(iBanterBitFlags, HOUSE_BANTER_TOO_FAST)
IF (GET_TIMER_IN_SECONDS(tBanter) > 15.0)
AND (GET_TIMER_IN_SECONDS(tSpeed) > 5.0)
PLAY_PED_AMBIENT_SPEECH(stripperPed[0], "DRIVEN_FAST", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
SET_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_TOO_FAST)
RESTART_TIMER_NOW(tBanter)
ENDIF
ELIF (GET_TIMER_IN_SECONDS(tBanter) < 5.0)
CLEAR_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_TOO_FAST)
RESTART_TIMER_NOW(tBanter)
ENDIF
IF NOT IS_BITMASK_AS_ENUM_SET(iBanterBitFlags, HOUSE_BANTER_TOO_SLOW)
IF (GET_TIMER_IN_SECONDS(tBanter) > 15.0)
AND (GET_TIMER_IN_SECONDS(tSpeed) > 5.0)
PLAY_PED_AMBIENT_SPEECH(stripperPed[0], "DRIVEN_SLOW", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
SET_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_TOO_FAST)
RESTART_TIMER_NOW(tBanter)
ENDIF
ELIF (GET_TIMER_IN_SECONDS(tBanter) < 5.0)
CLEAR_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_TOO_SLOW)
RESTART_TIMER_NOW(tBanter)
ENDIF
//B*1130487 - player crashing------------
IF NOT IS_BITMASK_AS_ENUM_SET(iBanterBitFlags, HOUSE_BANTER_CRASHED_CAR)
IF DID_PLAYERS_VEHICLE_TAKE_DAMAGE_WHILE_DRIVING(stripperPed[0],iVehicleHealth )
IF GET_TIMER_IN_SECONDS(tCarCrash) > 5.0
PLAY_PED_AMBIENT_SPEECH(stripperPed[0], "CRASH_GENERIC_DRIVEN", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
SET_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_CRASHED_CAR)
RESTART_TIMER_NOW(tBanter)
CDEBUG1LN(DEBUG_BOOTY_CALL,"Player's car took damage" )
ENDIF
ENDIF
ELIF (GET_TIMER_IN_SECONDS(tCarCrash) > 5.0)
CLEAR_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_CRASHED_CAR)
RESTART_TIMER_NOW(tCarCrash)
ENDIF
//Play Banter
IF NOT IS_BITMASK_AS_ENUM_SET(iBanterBitFlags, HOUSE_BANTER_ONE_OFF_DONE)
IF (GET_TIMER_IN_SECONDS(tBanter) > 30.0)
OR (GET_TIMER_IN_SECONDS(tBanter) > 10.0 AND NOT IS_BITMASK_AS_ENUM_SET(iBanterBitFlags, HOUSE_BANTER_ONE_OFF))
PLAY_PED_AMBIENT_SPEECH(stripperPed[0], "BOOTY_FLIRT", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
CDEBUG1LN(DEBUG_BOOTY_CALL,"[DIALOGUE] Booty Flirt triggered" )
SET_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_ONE_OFF)
SET_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_PLAYER_RESPONSE)
RESTART_TIMER_NOW(tBanter)
ELIF IS_BITMASK_AS_ENUM_SET(iBanterBitFlags, HOUSE_BANTER_PLAYER_RESPONSE)
IF NOT IS_AMBIENT_SPEECH_PLAYING(stripperPed[0])
AND GET_TIMER_IN_SECONDS(tBanter) > 4.0
PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(), "BOOTY_FLIRT_RESP", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
CLEAR_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_PLAYER_RESPONSE)
CDEBUG1LN(DEBUG_BOOTY_CALL,"[DIALOGUE] Booty Flirt PLAYER RESPONSE triggered" )
ENDIF
ELSE
#IF IS_DEBUG_BUILD
#IF CONST_iShowDebugInfo
// TEXT_LABEL_23 sDebugBanterTimer
// sDebugBanterTimer = "Banter In: "
// sDebugBanterTimer += ROUND(30.0 - GET_TIMER_IN_SECONDS_SAFE(tBanter))
// DRAW_DEBUG_TEXT_2D(sDebugBanterTimer, <<0.1, 0.16,0.0>>)
#ENDIF
#ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL DO_STAGE_GET_CORRECT_BJ_TRIGGER()
//add in radio stuff whenever we can
RETURN TRUE
ENDFUNC
FUNC BOOL DO_STAGE_CAN_DO_BLOW_JOB()
IF NOT CAN_DO_STRIPPER_HOME_GOD_TEXT()
RETURN FALSE
ENDIF
VECTOR vStorePos
FLOAT fStoreRot
GET_INIT_TAKE_HOME_STRIPPER_LOC(vStorePos, fStoreRot, FALSE)
#IF IS_DEBUG_BUILD
#IF CONST_iShowDebugInfo
//Draw Info to Screen------------------------------------------------------------
// IF IS_STRIPPER_IN_VEHICLE_SHE_CAN_GIVE_A_BJ_IN()
// DRAW_DEBUG_TEXT_2D("VEHICLE BJ : YES ", <<0.1, 0.2,0.0>>)
// ELSE
// DRAW_DEBUG_TEXT_2D("VEHICLE BJ : NO ", <<0.1, 0.2,0.0>>,255,0,0)
// ENDIF
//
// TEXT_LABEL_23 sDebugSexts
// sDebugSexts = "# Sexts: "
// sDebugSexts += GET_NUM_SEXTS_SENT_BY_STRIPPER(stripperID[0])
// IF GET_NUM_SEXTS_SENT_BY_STRIPPER(stripperID[0]) = 0
// DRAW_DEBUG_TEXT_2D(sDebugSexts, <<0.1, 0.22,0.0>>, 255,0,0)
// ELSE
// DRAW_DEBUG_TEXT_2D(sDebugSexts, <<0.1, 0.22,0.0>>)
// ENDIF
//
// TEXT_LABEL_31 sDebugHouseDistance
// sDebugHouseDistance = "House Dist: "
// sDebugHouseDistance += ROUND(VDIST(vHouseInVehiclePos, GET_ENTITY_COORDS(PLAYER_PED_ID())))
// DRAW_DEBUG_TEXT_2D(sDebugHouseDistance, <<0.1, 0.24,0.0>>)
//
// TEXT_LABEL_31 sDebugStorePos
// sDebugStorePos = "Store Pos Dist: "
// sDebugStorePos += ROUND(VDIST(vStorePos, GET_ENTITY_COORDS(PLAYER_PED_ID())))
// DRAW_DEBUG_TEXT_2D(sDebugStorePos, <<0.1, 0.26,0.0>>)
//End Info------------------------------------------------------------------------
IF (IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_LB) AND IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_RB))
RETURN TRUE
ENDIF
#ENDIF
#ENDIF
IF (VDIST(vHouseInVehiclePos, GET_ENTITY_COORDS(PLAYER_PED_ID())) > CONST_fNearHouse*2
AND VDIST(vStorePos, GET_ENTITY_COORDS(PLAYER_PED_ID())) > CONST_fNearHouse/2)
AND (GET_NUM_SEXTS_SENT_BY_STRIPPER(stripperID[0]) > 1)
AND IS_STRIPPER_IN_VEHICLE_SHE_CAN_GIVE_A_BJ_IN()
//OR DO_STAGE_GET_CORRECT_BJ_TRIGGER())
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC DO_STAGE_MANAGE_BLOW_JOB()
IF NOT IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_MEET_BJ_TRIGGERED)
IF DO_STAGE_CAN_DO_BLOW_JOB()
SET_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_MEET_BJ_TRIGGERED)
ELSE
EXIT
ENDIF
ENDIF
STRING sBJAnimDictionary = GET_ANIM_DICT_FOR_SEX_FOR_VEHICLE_PED_IS_IN(stripperPed[0])
IF NOT IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_MEET_BJ_ACTIVE)
IF NOT IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_MEET_BJ_STREAMED)
IF NOT IS_BITMASK_AS_ENUM_SET(iBanterBitFlags, HOUSE_BANTER_BJ)
IF stripperID[0] = BC_TAXI_LIZ
OR stripperID[0] = BC_HITCHER_GIRL
CREATE_CONVERSATION_FOR_BOOTY_CALL("SC_BJ")
ENDIF
SET_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_BJ)
ELSE
REQUEST_ANIM_DICT(sBJAnimDictionary)
SET_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_MEET_BJ_STREAMED)
ENDIF
ELIF HAS_ANIM_DICT_LOADED(sBJAnimDictionary)
TASK_PED_TO_HAVE_SEX_IN_VEHICLE(stripperPed[0],TRUE)
SET_PED_KEEP_TASK(stripperPed[0], TRUE)
START_TIMER_NOW(tBJ)
SET_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_MEET_BJ_ACTIVE)
ENDIF
ELSE
IF IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_MEET_BJ_STREAMED)
BOOL bCleanupBJ = FALSE
BOOL bDoingMoneyShot = IS_ENTITY_PLAYING_ANIM(stripperPed[0], sBJAnimDictionary, GET_ANIM_NAME_FOR_SEX_STATE(SEX_ACTION_TO_PROP_P2,TRUE,TRUE,IS_VEHICLE_LOW_FOR_SEX(iTakeHomeVehicle)))
BOOL bPlayerShootingFromCar = IS_PED_SHOOTING(PLAYER_PED_ID())
BOOL bBJIsComplete = (GET_SCRIPT_TASK_STATUS(stripperPed[0], SCRIPT_TASK_PERFORM_SEQUENCE) = FINISHED_TASK)
BOOL bPlayerInVeh = IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
BOOL bHasCarCollidedWithAnything = FALSE
IF bPlayerInVeh
IF DOES_ENTITY_EXIST(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) AND NOT IS_ENTITY_DEAD(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
bHasCarCollidedWithAnything = (HAS_ENTITY_COLLIDED_WITH_ANYTHING(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) AND (GET_ENTITY_SPEED(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) > 5.0))
ENDIF
ENDIF
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
OR (GET_TIMER_IN_SECONDS(tBJ) > 35.0)
OR (VDIST(vHouseInVehiclePos, GET_ENTITY_COORDS(PLAYER_PED_ID())) < CONST_fNearHouse)
OR bPlayerShootingFromCar
OR bHasCarCollidedWithAnything
IF NOT bBJIsComplete
AND NOT bDoingMoneyShot
TASK_PLAY_ANIM(stripperPed[0], sBJAnimDictionary, GET_ANIM_NAME_FOR_SEX_STATE(SEX_ACTION_TO_PROP_P2,TRUE,TRUE,IS_VEHICLE_LOW_FOR_SEX(iTakeHomeVehicle)), NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_DEFAULT)
ENDIF
IF bPlayerShootingFromCar
iRecordBlockPersistTimer = 2000 //B* 2463715
ENDIF
bCleanupBJ = TRUE
ELIF bBJIsComplete
bCleanupBJ = TRUE
ENDIF
IF bDoingMoneyShot
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME()
ENDIF
IF bCleanupBJ
AND bBJIsComplete
AND NOT bDoingMoneyShot
IF NOT bPlayerShootingFromCar
AND bPlayerInVeh
IF bHasCarCollidedWithAnything
SET_ENTITY_HEALTH(PLAYER_PED_ID(), GET_ENTITY_HEALTH(PLAYER_PED_ID())-CEIL(GET_PED_MAX_HEALTH(PLAYER_PED_ID())*0.1))
PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(),"GENERIC_CURSE_HIGH",SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ELSE
PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(),"SEX_CLIMAX",SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ENDIF
SET_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_BJ_FINISHED)
ENDIF
REMOVE_ANIM_DICT(sBJAnimDictionary)
CLEAR_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_MEET_BJ_STREAMED)
ENDIF
IF NOT IS_BITMASK_AS_ENUM_SET(iBanterBitFlags, HOUSE_BANTER_BJD)
IF (GET_TIMER_IN_SECONDS(tBJ) > ((CONST_iBJDuration/1000)/3))
PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(),"SEX_GENERIC",SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
PLAY_PED_AMBIENT_SPEECH(stripperPed[0],"SEX_ORAL",SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
SET_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_BJD)
ENDIF
ENDIF
DISABLE_CINEMATIC_BONNET_CAMERA_THIS_UPDATE()
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME() //Fix for bug 2246108
ENDIF
ENDIF
ENDPROC
PROC MANAGE_HOUSE_VEHICLE_BLIP(VECTOR vGoToPos)
IF DOES_BLIP_EXIST(houseFootBlip)
REMOVE_BLIP(houseFootBlip)
ENDIF
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
EXIT
ENDIF
VEHICLE_INDEX playersVehicle = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(playersVehicle) AND NOT IS_ENTITY_DEAD(playersVehicle)
IF IS_PED_IN_ANY_VEHICLE(stripperPed[0])
IF IS_PED_IN_VEHICLE(stripperPed[0], GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
IF NOT DOES_BLIP_EXIST(houseVehicleBlip)
//GET_GROUND_Z_FOR_3D_COORD(vGoToPos)
houseVehicleBlip = CREATE_BLIP_FOR_COORD(vGoToPos, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC REMOVE_STRIPPER_FROM_GROUP()
IF DOES_ENTITY_EXIST(stripperPed[0]) AND NOT IS_ENTITY_DEAD(stripperPed[0])
STOP_PED_SPEAKING(stripperPed[0],TRUE)
IF IS_PED_IN_GROUP(stripperPed[0])
PRINTLN("remvoing from group")
REMOVE_PED_FROM_GROUP(stripperPed[0])
CPRINTLN( DEBUG_BOOTY_CALL, "REMOVING STRIPPER FROM GROUP!!!" )
DEBUG_PRINTCALLSTACK()
ENDIF
ENDIF
ENDPROC
PROC DO_STAGE_HANDLE_TRANSPORTATION_MODE()
CLEAR_STRIPPER_BLIPS()
RESTART_TIMER_NOW(tBanter)
IF IS_PED_ON_FOOT(PLAYER_PED_ID())
// player is on foot
IF DOES_BLIP_EXIST(houseVehicleBlip)
REMOVE_BLIP(houseVehicleBlip)
ENDIF
IF NOT DOES_BLIP_EXIST(houseFootBlip)
houseFootBlip = CREATE_BLIP_FOR_COORD(vHouseOnFootPos)
CDEBUG1LN(DEBUG_BOOTY_CALL,"DO_STAGE_HANDLE_TRANSPORTATION_MODE" )
ENDIF
DEBUG_MESSAGE("DO_STAGE_GO_TO_HOUSE: Moving to GO_TO_HOUSE_FOOT")
RESTART_TIMER_NOW(tWalking)
vStarttWalkLoc = GET_ENTITY_COORDS(stripperPed[0])
eGoToHouseState = GO_TO_HOUSE_FOOT
CDEBUG1LN(DEBUG_BOOTY_CALL,"->GO_TO_HOUSE_FOOT" )
ELSE
RESTART_TIMER_NOW(tCarCrash)
MANAGE_HOUSE_VEHICLE_BLIP(vHouseInVehiclePos)
DEBUG_MESSAGE("DO_STAGE_GO_TO_HOUSE: Moving to GO_TO_HOUSE_DRIVE")
eGoToHouseState = GO_TO_HOUSE_DRIVE
CDEBUG1LN(DEBUG_BOOTY_CALL,"->GO_TO_HOUSE_DRIVE" )
ENDIF
ENDPROC
// stage: go to the house
PROC DO_STAGE_GO_TO_HOUSE(BOOL bTakeHomeMethod)
// check mission fail conditions
CHECK_FAIL_CONDITIONS()
TEXT_LABEL sStripperName
IF IS_ENTITY_DEAD(stripperPed[0])
EXIT //should never happen because of the above check, not even sure why this is here
ENDIF
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(vHouseInVehiclePos + <<1.0, 1.0, 0>>*10.0, vHouseInVehiclePos+ <<-1.0, -1.0, 0>>*10.0, FALSE)
FLOAT fDistToStripper = VDIST( GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(stripperPed[0]))
//PRINTLN("Distance to bootycall ", fDistToStripper ," dist till house retrun ", (CONST_fAbandoned/2))
IF eGoToHouseState != GO_TO_HOUSE_RETURN
IF fDistToStripper >= (CONST_fAbandoned/2)
AND CAN_DO_STRIPPER_HOME_GOD_TEXT()
AND NOT IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_MEET_IS_NEAR)
OR IS_STRIPPER_BEING_LEFT_BEHIND(stripperPed[0])
PRINTLN("Setting to GO_TO_HOUSE_RETURN")
IF DOES_BLIP_EXIST(houseFootBlip)
REMOVE_BLIP(houseFootBlip)
ENDIF
IF DOES_BLIP_EXIST(houseVehicleBlip)
REMOVE_BLIP(houseVehicleBlip)
ENDIF
CREATE_STRIPPER_BLIP(0)
PRINT_OBJECTIVE_WITH_STRIPPER_NAMES( "SCLUB_HOME_R" , stripperID[0])
CDEBUG1LN(DEBUG_BOOTY_CALL,"Stripper is being left behind - GO_TO_HOUSE_RETURN" )
eGoToHouseState = GO_TO_HOUSE_RETURN
ENDIF
ENDIF
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
IF eGoToHouseState != GO_TO_HOUSE_LOSE_COPS
IF DOES_BLIP_EXIST(houseFootBlip)
REMOVE_BLIP(houseFootBlip)
ENDIF
IF DOES_BLIP_EXIST(houseVehicleBlip)
REMOVE_BLIP(houseVehicleBlip)
ENDIF
eGoToHouseState = GO_TO_HOUSE_LOSE_COPS
ENDIF
ENDIF
IF HAS_PLAYER_AGGROED_BOOTY_CALL_PED(stripperPed[0], tAggroArgs, tAggroTimer)
MISSION_FAILED(FAIL_STRIPPER_ATTACKED)
ENDIF
//Check for player taking too long before picking up the booty call.
IF eGoToHouseState <= GO_TO_HOUSE_MEET
SETUP_BOOTYCALL_WAIT_TIME(TRUE)
ENDIF
SWITCH eGoToHouseState
CASE GO_TO_HOUSE_INIT
ePreviousGoToHouseState = GO_TO_HOUSE_INIT
IF CAN_DO_STRIPPER_HOME_GOD_TEXT()
IF NOT IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_MEET_UP_TEXT)
//B*1329405 - freeze sripper to prevent her floating
FREEZE_ENTITY_POSITION(stripperPed[0],TRUE)
PRINT_OBJECTIVE_WITH_STRIPPER_NAMES("SCLUB_HOME_MEET", stripperID[0])
CREATE_STRIPPER_BLIP(0)
SET_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_MEET_UP_TEXT)
ENDIF
DEBUG_MESSAGE("DO_STAGE_GO_TO_HOUSE: Moving to GO_TO_HOUSE_MEET")
CDEBUG1LN(DEBUG_BOOTY_CALL,"DO_STAGE_GO_TO_HOUSE: Moving to GO_TO_HOUSE_MEET" )
eGoToHouseState = GO_TO_HOUSE_MEET
ENDIF
BREAK
CASE GO_TO_HOUSE_MEET
ePreviousGoToHouseState = GO_TO_HOUSE_MEET
sStripperName = GET_STRIPPER_NAME_AS_TEXT_LABEL(stripperID[0])
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
iTakeHomeVehicle = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
iVehicleHealth = GET_ENTITY_HEALTH(iTakeHomeVehicle)
ENDIF
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_ENTITY_COORDS(stripperPed[0]), <<CONST_fTrigger, CONST_fTrigger, CONST_fTrigger>>)
OR (IS_VEHICLE_DRIVEABLE(iTakeHomeVehicle) AND GET_DISTANCE_BETWEEN_ENTITIES(iTakeHomeVehicle,stripperPed[0] ) <= CONST_fVehicleTrigger)
FREEZE_ENTITY_POSITION(stripperPed[0],FALSE)
IF DOES_ENTITY_EXIST(iTakeHomeVehicle)
AND ((GET_VEHICLE_MAX_NUMBER_OF_PASSENGERS(iTakeHomeVehicle) < 1)
OR (NOT bTakeHomeMethod AND NOT IS_THIS_MODEL_A_CAR(GET_ENTITY_MODEL(iTakeHomeVehicle)))) // you are having sex with her in the car, make sure player is using a car
IF NOT IS_THIS_HELP_MESSAGE_WITH_STRING_BEING_DISPLAYED("SCLUB_SMALL_CAR", sStripperName)
PRINT_HELP_WITH_STRIPPER_NAMES("SCLUB_SMALL_CAR", stripperID[0])
PLAY_PED_AMBIENT_SPEECH(stripperPed[0], "NEED_A_VEHICLE", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ENDIF
ELSE
CLEAR_HELP()
CLEAR_PED_TASKS(stripperPed[0])
ADD_STRIPPERS_TO_GROUP()
IF NOT IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_MEET_IS_NEAR)
SET_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_MEET_IS_NEAR)
ENDIF
PLAY_BOOTY_CALL_GREETING()
// IF DOES_ENTITY_EXIST(iTakeHomeVehicle)
// BRING_VEHICLE_TO_HALT(iTakeHomeVehicle, CONST_fTrigger, 2)
// ENDIF
CLEAR_ALL_BLIPS()
// Disable all mod shops
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE( CARMOD_SHOP_01_AP, TRUE )
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE( CARMOD_SHOP_05_ID2, TRUE )
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE( CARMOD_SHOP_06_BT1, TRUE )
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE( CARMOD_SHOP_07_CS1, TRUE )
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE( CARMOD_SHOP_08_CS6, TRUE )
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE( CARMOD_SHOP_SUPERMOD, TRUE )
DEBUG_MESSAGE("DO_STAGE_GO_TO_HOUSE: Moving to GO_TO_HOUSE_GREET")
CDEBUG1LN(DEBUG_BOOTY_CALL,"DO_STAGE_GO_TO_HOUSE: Moving to GO_TO_HOUSE_GREET" )
eGoToHouseState = GO_TO_HOUSE_GREET
ENDIF
ELSE
IF IS_THIS_HELP_MESSAGE_WITH_STRING_BEING_DISPLAYED("SCLUB_SMALL_CAR", sStripperName)
CLEAR_HELP()
ENDIF
ENDIF
BREAK
CASE GO_TO_HOUSE_GREET
ePreviousGoToHouseState = GO_TO_HOUSE_GREET
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(stripperPed[0])
CDEBUG1LN(DEBUG_BOOTY_CALL,"DO_STAGE_GO_TO_HOUSE: Moving to GO_TO_HOUSE_OBJ" )
DEBUG_MESSAGE("DO_STAGE_GO_TO_HOUSE: Moving to GO_TO_HOUSE_OBJ")
eGoToHouseState = GO_TO_HOUSE_OBJ
ENDIF
ELSE
PLAY_PED_AMBIENT_SPEECH(stripperPed[0], "NEED_A_VEHICLE", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
eGoToHouseState = GO_TO_HOUSE_OBJ
ENDIF
BREAK
CASE GO_TO_HOUSE_OBJ
ePreviousGoToHouseState = GO_TO_HOUSE_OBJ
// To Fix Bug # 914284 - DS
HANDLE_NICE_RIDE_CONVERSATION()
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF CAN_DO_STRIPPER_HOME_GOD_TEXT()
SET_ROADS_IN_AREA(vHouseInVehiclePos-<<CONST_fTrigger, CONST_fTrigger, CONST_fTrigger>>, vHouseInVehiclePos+<<CONST_fTrigger, CONST_fTrigger, CONST_fTrigger>>, FALSE)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(vHouseInVehiclePos-<<CONST_fTrigger, CONST_fTrigger, CONST_fTrigger>>, vHouseInVehiclePos+<<CONST_fTrigger, CONST_fTrigger, CONST_fTrigger>>, FALSE)
CLEAR_AREA_OF_VEHICLES(vHouseInVehiclePos, 10.0)
CLEAR_AREA_OF_PEDS(vHouseInVehiclePos, 10.0)
sbiSHome = ADD_SCENARIO_BLOCKING_AREA((vHouseInVehiclePos - <<35,35,35>>), (vHouseInVehiclePos + <<35,35,35>>))
CDEBUG1LN(DEBUG_BOOTY_CALL,"[SCENARIO BLOCKING] - ADDING BLOCKING VOLUME around house" )
RESTART_TIMER_NOW(tBanter)
IF bTakeHomeMethod
// IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
PRINT_TAKE_BOOTY_CALL_HOME(TRUE)
// ENDIF
DO_STAGE_HANDLE_TRANSPORTATION_MODE()
ELSE
currentMissionStage = FIND_QUITE_LOCATION_FOR_BOOTYCALL
CDEBUG1LN(DEBUG_BOOTY_CALL,"Line - 1748 - go to FIND_QUITE_LOCATION_FOR_BOOTYCALL" )
ENDIF
ENDIF
ENDIF
BREAK
CASE GO_TO_HOUSE_FOOT
ePreviousGoToHouseState = GO_TO_HOUSE_FOOT
DO_STAGE_MANAGE_STRIPPER_BANTER(fDistToStripper, vHouseOnFootPos)
#IF NOT IS_JAPANESE_BUILD
DO_STAGE_MANAGE_BLOW_JOB()
#ENDIF
IF (GET_TIMER_IN_SECONDS(tWalking) > CONST_fMaxWalkTime
OR VDIST2( GET_ENTITY_COORDS(PLAYER_PED_ID()), vStarttWalkLoc) > (CONST_fMaxWalkDist*CONST_fMaxWalkDist))
AND GET_DISTANCE_BETWEEN_ENTITY_AND_COORD( PLAYER_PED_ID(),vHouseOnFootPos) > CONST_fMaxWalkDist
IF stripperID[0] = BC_TAXI_LIZ
CREATE_CONVERSATION_FOR_BOOTY_CALL("SC_WALK")
ELSE
PLAY_PED_AMBIENT_SPEECH(stripperPed[0],"GENERIC_FUCK_YOU",SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ENDIF
MISSION_FAILED(FAIL_STRIPPER_WALKING)
ELSE
#IF IS_DEBUG_BUILD
DEBUG_SHOW_STRIPPER_HOME_COORDS()
#ENDIF
IF IS_STRIPPER_BEING_LEFT_BEHIND(stripperPed[0], TRUE)
PRINTLN("Setting to GO_TO_HOUSE_RETURN")
IF DOES_BLIP_EXIST(houseFootBlip)
REMOVE_BLIP(houseFootBlip)
ENDIF
IF DOES_BLIP_EXIST(houseVehicleBlip)
REMOVE_BLIP(houseVehicleBlip)
ENDIF
CREATE_STRIPPER_BLIP(0)
PRINT_OBJECTIVE_WITH_STRIPPER_NAMES( "SCLUB_HOME_R" , stripperID[0])
CDEBUG1LN(DEBUG_BOOTY_CALL,"Stripper is being left behind - GO_TO_HOUSE_RETURN" )
eGoToHouseState = GO_TO_HOUSE_RETURN
ELIF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vHouseInVehiclePos, <<CONST_fTrigger, CONST_fTrigger, LOCATE_SIZE_HEIGHT>>, TRUE, TRUE, TM_IN_VEHICLE)
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vHouseDoorPos,<<CONST_fDoorTrigger, CONST_fDoorTrigger, LOCATE_SIZE_HEIGHT>>, TRUE, TRUE, TM_ON_FOOT)
IF CAN_PLAYER_START_CUTSCENE()
currentMissionStage = STAGE_ENTER_HOUSE
ENDIF
ELIF NOT IS_PED_ON_FOOT(PLAYER_PED_ID())
DO_STAGE_HANDLE_TRANSPORTATION_MODE()
CDEBUG1LN(DEBUG_BOOTY_CALL,"Line - 1784 - DO_STAGE_HANDLE_TRANSPORTATION_MODE" )
ENDIF
ENDIF
BREAK
CASE GO_TO_HOUSE_DRIVE
ePreviousGoToHouseState = GO_TO_HOUSE_DRIVE
DO_STAGE_MANAGE_STRIPPER_BANTER(fDistToStripper, vHouseInVehiclePos)
#IF NOT IS_JAPANESE_BUILD
DO_STAGE_MANAGE_BLOW_JOB()
#ENDIF
ADD_STRIPPERS_TO_GROUP()
#IF IS_DEBUG_BUILD
DEBUG_SHOW_STRIPPER_HOME_COORDS()
#ENDIF
// advance stage if there
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vHouseInVehiclePos, <<CONST_fVehicleHomeTrigger, CONST_fVehicleHomeTrigger, LOCATE_SIZE_HEIGHT>>, TRUE, TRUE, TM_IN_VEHICLE)
eGoToHouseState = GO_TO_HOUSE_STOP
CDEBUG1LN(DEBUG_BOOTY_CALL,"Line - 2450 - GO_TO_HOUSE_STOP" )
ELSE
IF IS_PED_ON_FOOT(PLAYER_PED_ID())
DO_STAGE_HANDLE_TRANSPORTATION_MODE()
CDEBUG1LN(DEBUG_BOOTY_CALL,"Line - 1839 - DO_STAGE_HANDLE_TRANSPORTATION_MODE" )
ELSE
MANAGE_HOUSE_VEHICLE_BLIP(vHouseInVehiclePos)
ENDIF
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("SCLUB_HOME_WALK")
CLEAR_HELP()
ENDIF
ENDIF
BREAK
//Bring the player's vehicle to a stop.
CASE GO_TO_HOUSE_STOP
#IF IS_DEBUG_BUILD
DEBUG_SHOW_STRIPPER_HOME_COORDS()
#ENDIF
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), 3.0, 2, 0.5)
REMOVE_STRIPPER_FROM_GROUP()
GIVE_WALK_TO_DOOR_TASK(stripperPed[0],vHouseDoorPos)
IF stripperID[0] = BC_HITCHER_GIRL
OR stripperID[0] = BC_TAXI_LIZ
CREATE_CONVERSATION_FOR_BOOTY_CALL("SC_GO_DOOR")
ELSE
CREATE_CONVERSATION_FOR_BOOTY_CALL("SC_FOLLOWD",FALSE,FALSE,TRUE)
ENDIF
eGoToHouseState = GO_TO_HOUSE_WALK_TO_DOOR
CDEBUG1LN(DEBUG_BOOTY_CALL,"Line - 1829 - GO_TO_HOUSE_WALK_TO_DOOR" )
ENDIF
ENDIF
ELIF IS_PED_ON_FOOT(PLAYER_PED_ID())
CLEAR_PED_TASKS_IMMEDIATELY(stripperPed[0])
DO_STAGE_HANDLE_TRANSPORTATION_MODE()
CDEBUG1LN(DEBUG_BOOTY_CALL,"Line - 1833 - DO_STAGE_HANDLE_TRANSPORTATION_MODE" )
CLEAR_HELP()
ENDIF
BREAK
CASE GO_TO_HOUSE_WALK_TO_DOOR
ePreviousGoToHouseState = GO_TO_HOUSE_WALK_TO_DOOR
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND NOT IS_MESSAGE_BEING_DISPLAYED()
AND NOT IS_BITMASK_AS_ENUM_SET( iGeneralBitFlags, HOUSE_MEET_STRIPPER_TAKE_IN)
sStripperName = GET_STRIPPER_NAME_AS_TEXT_LABEL(stripperID[0])
PRINT_STRING_IN_STRING_NOW("SCLUB_FOLLOW_H", sStripperName, DEFAULT_GOD_TEXT_TIME, 1)
CLEAR_ALL_BLIPS()
CREATE_STRIPPER_BLIP(0)
SET_BITMASK_AS_ENUM( iGeneralBitFlags, HOUSE_MEET_STRIPPER_TAKE_IN)
CDEBUG1LN(DEBUG_BOOTY_CALL,"Line - 1872 - Stripper walking home...waiting for you" )
ENDIF
// advance stage if there
#IF IS_DEBUG_BUILD
DEBUG_SHOW_STRIPPER_HOME_COORDS()
#ENDIF
IF (IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vHouseOnFootPos, <<CONST_fDoorTrigger, CONST_fDoorTrigger, LOCATE_SIZE_HEIGHT>>, FALSE, TRUE, TM_ON_FOOT)
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vHouseDoorPos, <<CONST_fDoorTrigger, CONST_fDoorTrigger, LOCATE_SIZE_HEIGHT>>, FALSE, TRUE, TM_ON_FOOT))
AND IS_PED_ON_FOOT(PLAYER_PED_ID())
IF CAN_PLAYER_START_CUTSCENE()
currentMissionStage = STAGE_ENTER_HOUSE
CDEBUG1LN(DEBUG_BOOTY_CALL,"Line - 1884 - STAGE_ENTER_HOUSE" )
// ELSE
// CDEBUG1LN(DEBUG_BOOTY_CALL,"Line - 1886 - Can't start cutscene" )
ENDIF
// ELSE
// CDEBUG1LN(DEBUG_BOOTY_CALL,"Line - 1889 - Waiting on player" )
ENDIF
BREAK
CASE GO_TO_HOUSE_LOSE_COPS
IF NOT IS_BITMASK_AS_ENUM_SET(iBanterBitFlags, HOUSE_BANTER_LOSE_COPS)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_AMBIENT_SPEECH_PLAYING(stripperPed[0])
IF ePreviousGoToHouseState > GO_TO_HOUSE_MEET
OR VDIST2( GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(stripperPed[0])) < (CONST_fTrigger*CONST_fTrigger)
PLAY_PED_AMBIENT_SPEECH(stripperPed[0],"GENERIC_FRIGHTENED_MED",SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
SET_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_LOSE_COPS)
ENDIF
ENDIF
IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
eGoToHouseState = ePreviousGoToHouseState
ENDIF
BREAK
CASE GO_TO_HOUSE_RETURN
IF fDistToStripper > CONST_fAbandoned
CDEBUG1LN(DEBUG_BOOTY_CALL,"FAIL________ Distance to sripper is father then ",CONST_fAbandoned )
MISSION_FAILED(FAIL_STRIPPER_ABANDONED)
ELIF fDistToStripper <= (CONST_fAbandoned/2) AND NOT IS_STRIPPER_BEING_LEFT_BEHIND(stripperPed[0], TRUE)
CLEAR_PRINTS()
CDEBUG1LN(DEBUG_BOOTY_CALL,"Returned - Going to prev state - > ", ePreviousGoToHouseState )
eGoToHouseState = ePreviousGoToHouseState
IF IS_PED_ON_FOOT( PLAYER_PED_ID() )
DO_STAGE_HANDLE_TRANSPORTATION_MODE()
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE: Girl says sex lines
///
PROC PLAY_BOOTY_CALL_SEX_SPEECH()
IF NOT IS_ENTITY_DEAD(stripperPed[0])
IF stripperID[0] = BC_TAXI_LIZ
OR stripperID[0] = BC_HITCHER_GIRL
ADD_PED_FOR_DIALOGUE(stripperConversation, 1, NULL, GET_BOOTY_CALL_NAME_AS_STRING(stripperID[0]))
CREATE_CONVERSATION_FOR_BOOTY_CALL("SC_SEX")
ELSE
PLAY_PED_AMBIENT_SPEECH(stripperPed[0],"SEX_ORAL",SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ENDIF
ENDIF
ENDPROC
PROC DO_STAGE_DEBUG_MODE()
//Teleport everyone here, not in the debugger
IF NOT IS_ENTITY_DEAD(stripperPed[0])
// IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(),stripperPed[0]) > 20
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
SET_ENTITY_COORDS_GROUNDED(stripperPed[0],GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()),GET_ENTITY_HEADING(PLAYER_PED_ID()), <<0.0,2.0,0.0>>))
currentMissionStage = STAGE_ENTER_HOUSE
enterHouseStage = ENTER_HOUSE_INIT
CDEBUG1LN(DEBUG_BOOTY_CALL,"[DEBUG] Everyone should be in place -> enterHouseStage = ENTER_HOUSE_IN ")
ELSE
CDEBUG1LN(DEBUG_BOOTY_CALL,"[DEBUG] Loading scene")
ENDIF
ELSE
CDEBUG1LN(DEBUG_BOOTY_CALL,"[DEBUG] Booty Call Not Valid ")
ENDIF
ENDPROC
FUNC BOOL IS_VEHICLE_HELI( VEHICLE_INDEX viVeh )
IF IS_VEHICLE_MODEL( viVeh, BLIMP )
RETURN TRUE
ELIF IS_VEHICLE_MODEL( viVeh, CARGOBOB )
RETURN TRUE
ELIF IS_VEHICLE_MODEL( viVeh, CARGOBOB2 )
RETURN TRUE
ELIF IS_VEHICLE_MODEL( viVeh, CARGOBOB3 )
RETURN TRUE
ELIF IS_VEHICLE_MODEL( viVeh, BUZZARD )
RETURN TRUE
ELIF IS_VEHICLE_MODEL( viVeh, BUZZARD2 )
RETURN TRUE
ELIF IS_VEHICLE_MODEL( viVeh, MAVERICK )
RETURN TRUE
ELIF IS_VEHICLE_MODEL( viVeh, POLMAV )
RETURN TRUE
// ELIF IS_VEHICLE_MODEL( viVeh, SWIFT )
// RETURN TRUE
// ELIF IS_VEHICLE_MODEL( viVeh, VALKYRIE )
// RETURN TRUE
ELIF IS_VEHICLE_MODEL( viVeh, ANNIHILATOR )
RETURN TRUE
ELIF IS_VEHICLE_MODEL( viVeh, FROGGER )
RETURN TRUE
ELIF IS_VEHICLE_MODEL( viVeh, FROGGER2 )
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
// stage: walking into the house
PROC DO_STAGE_ENTER_HOUSE()
//SKIP THE CUTSCENE
IF enterHouseStage < ENTER_HOUSE_FADE_OUT AND enterHouseStage >= ENTER_HOUSE_SHOT_ALPHA
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY(3000)
DO_SCREEN_FADE_OUT(1000)
enterHouseStage = ENTER_HOUSE_FADE_OUT
DEBUG_MESSAGE("Moving to ENTER_HOUSE_FADE_OUT")
CDEBUG1LN(DEBUG_BOOTY_CALL,"Moving to ENTER_HOUSE_FADE_OUT - > ", ePreviousGoToHouseState )
ENDIF
ENDIF
IF NOT bVehicleSaved AND enterHouseStage >= ENTER_HOUSE_SHOT_TOD
//B* 1679720: if vehicle big and stripper is Infernus, move vehicle to safe spot
//CPRINTLN(debug_booty_call,"##### veh big: ",IS_BIG_VEHICLE(VehicleSaveArgsBootyCall.playerVehicle)," stripperID: ",stripperID[0]=BC_STRIPPER_INFERNUS)
VEHICLE_INDEX vehPlayersLastCar = GET_LAST_DRIVEN_VEHICLE()
IF IS_VEHICLE_DRIVEABLE(vehPlayersLastCar)
AND NOT IS_ENTITY_DEAD( vehPlayersLastCar )
IF GET_ENTITY_MODEL( vehPlayersLastCar ) = BLIMP2
bVehicleSaved = FALSE
//bVehicleSaved = ODDJOB_SAVE_VEHICLE(VehicleSaveArgsBootyCall)
ELIF IS_BIG_VEHICLE(GET_LAST_DRIVEN_VEHICLE()) AND stripperID[0]=BC_STRIPPER_INFERNUS
bVehicleSaved = ODDJOB_SAVE_VEHICLE_AND_WARP(VehicleSaveArgsBootyCall, <<-865,516.3,90>>, TRUE,15)
ELIF IS_VEHICLE_HELI(GET_LAST_DRIVEN_VEHICLE())
bVehicleSaved = ODDJOB_SAVE_VEHICLE_AND_WARP(VehicleSaveArgsBootyCall, vHeliPos, TRUE, fVehicleHeading)
CPRINTLN( DEBUG_BOOTY_CALL, "MOVING HELI" )
ELSE
CPRINTLN( DEBUG_BOOTY_CALL, "NOT A HELI" )
bVehicleSaved = ODDJOB_SAVE_VEHICLE_AND_WARP(VehicleSaveArgsBootyCall, vHouseInVehiclePos, TRUE,fVehicleHeading)
ENDIF
ENDIF
CPRINTLN( DEBUG_BOOTY_CALL, "Moved vehicle!" )
// CDEBUG1LN(DEBUG_BOOTY_CALL,"[SAVE] Player vehicle saved at ",vHouseInVehiclePos )
ENDIF
IF enterHouseStage > ENTER_HOUSE_INIT
AND enterHouseStage < ENTER_HOUSE_DONE
HIDE_HUD_AND_RADAR_THIS_FRAME()
ENDIF
SWITCH enterHouseStage
CASE ENTER_HOUSE_INIT
CLEAR_HELP()
CLEAR_PRINTS()
CLEAR_ALL_BLIPS()
REQUEST_SCRIPT_AUDIO_BANK("TIME_LAPSE")
ODDJOB_ENTER_CUTSCENE(SPC_REMOVE_PROJECTILES | SPC_REMOVE_EXPLOSIONS | SPC_REMOVE_FIRES,TRUE,FALSE)
IF NOT IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_GEN_HOME_SCENE_PLAYING)
SET_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_GEN_HOME_SCENE_PLAYING)
ENDIF
IF NOT IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_MEET_REQUEST_IDLE_ANIM)
GET_MORNING_AFTER_SEX_DICTIONARY()
SET_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_MEET_REQUEST_IDLE_ANIM)
ENDIF
//Request happy face anims
IF NOT IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_REQUEST_HAPPY_FACE_ANIMS)
REQUEST_ANIM_DICT(GET_BOOTY_CALL_END_FACE_ANIM())
SET_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_REQUEST_HAPPY_FACE_ANIMS)
ENDIF
IF NOT IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_MEET_REQUEST_IDLE_ANIM)
REQUEST_ANIM_DICT(GET_STRIP_CLUB_ANIM_DICT_BOUNCER_IDLE())
SET_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_MEET_REQUEST_IDLE_ANIM)
ENDIF
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
iTakeHomeVehicle = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
GIVE_PARK_TASK(PLAYER_PED_ID(), iTakeHomeVehicle)
enterHouseStage = ENTER_HOUSE_PARK_VEHICLE
ELSE
REMOVE_STRIPPER_FROM_GROUP()
GIVE_WALK_TO_DOOR_TASK(PLAYER_PED_ID(),vPlayerWalkToPos)
GIVE_WALK_TO_DOOR_TASK(stripperPed[0],vHouseDoorPos)
enterHouseStage = ENTER_HOUSE_SHOT_ALPHA
ENDIF
// setup cam
SETUP_HOME_CAM()
BREAK
CASE ENTER_HOUSE_PARK_VEHICLE
IF NOT IS_ENTITY_DEAD(iTakeHomeVehicle)
IF VDIST(GET_ENTITY_COORDS(iTakeHomeVehicle), vHouseInVehiclePos) < 2.0
REMOVE_STRIPPER_FROM_GROUP()
GIVE_WALK_TO_DOOR_TASK(PLAYER_PED_ID(),vPlayerWalkToPos)
GIVE_WALK_TO_DOOR_TASK(stripperPed[0],vHouseDoorPos)
// SET_ENTITY_LOD_DIST(stripperPed[0], 80)
// SET_PED_LOD_MULTIPLIER(stripperPed[0], 3.0)
// REMOVE_PED_FOR_DIALOGUE(stripperConversation,1)
NEW_LOAD_SCENE_STOP()
enterHouseStage = ENTER_HOUSE_SHOT_ALPHA
ELIF GET_GAME_TIMER() >= 10000
enterHouseStage = ENTER_HOUSE_DONE
ENDIF
ENDIF
BREAK
//1st Shot------------------
CASE ENTER_HOUSE_SHOT_ALPHA
IF NOT IS_CAM_RENDERING(homeCam[0])
SET_CAM_ACTIVE(homeCam[0],TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
IF NOT IS_ENTITY_DEAD( iTakeHomeVehicle )
IF GET_ENTITY_MODEL( iTakeHomeVehicle ) = BLIMP2
SET_ENTITY_VISIBLE( iTakeHomeVehicle, FALSE )
ENDIF
ENDIF
RESTART_TIMER_NOW(tBJ)
CDEBUG1LN(DEBUG_BOOTY_CALL,"[NEW FORREST CAM] ALPHA - Cam Rendering")
enterHouseStage = ENTER_HOUSE_SHOT_ALPHA_TO_BETA
ENDIF
BREAK
CASE ENTER_HOUSE_SHOT_ALPHA_TO_BETA
IF GET_TIMER_IN_SECONDS_SAFE(tBJ) > CONST_fHomeCam1stShotTime
// OR GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(),vPlayerWalkToPos) < 5.0
SET_CAM_ACTIVE_WITH_INTERP(homeCam[1],homeCam[0], CONST_iHomePanUpTODTime)
// SET_CAM_ACTIVE(tTimeLapse.splineCamera, TRUE)
SET_TODS_CUTSCENE_RUNNING(tTimeLapse, TRUE)
INT iCurrentHour
iCurrentHour = GET_CLOCK_HOURS()
iTODSkipHour = iCurrentHour + CONST_iNumHoursToSkip
IF iTODSkipHour > 23
iTODSkipHour -= 24
ENDIF
tTimeLapse.iTimeWindowStart = iCurrentHour
tTimeLapse.iTimeWindowEnd = iTODSkipHour
//
CDEBUG1LN(DEBUG_BOOTY_CALL,"[TOD]Setting ToD to: ", iTODSkipHour, "from ", iCurrentHour)
// RESTART_TIMER_NOW(tBJ)
CANCEL_TIMER(tBJ)
enterHouseStage = ENTER_HOUSE_BETA_HOLD
ENDIF
BREAK
CASE ENTER_HOUSE_BETA_HOLD
IF NOT IS_CAM_INTERPOLATING(homeCam[1]) AND IS_CAM_RENDERING(homeCam[1])
IF NOT IS_BITMASK_AS_ENUM_SET(iBanterBitFlags, HOUSE_BANTER_SEX)
IF DOES_ENTITY_EXIST(iTakeHomeVehicle) AND NOT IS_ENTITY_DEAD(iTakeHomeVehicle)
SET_VEHICLE_DOORS_SHUT(iTakeHomeVehicle, TRUE)
ENDIF
//START_PLAYER_TELEPORT(PLAYER_ID(),GET_PLAYER_WARP_POS_POST_SEX() ,GET_PLAYER_WARP_HEADING_POST_SEX(), FALSE,TRUE,FALSE)
SET_ENTITY_COORDS_GROUNDED( PLAYER_PED_ID(), GET_PLAYER_WARP_POS_POST_SEX() )
SET_ENTITY_HEADING( PLAYER_PED_ID(), GET_PLAYER_WARP_HEADING_POST_SEX() )
PLAY_BOOTY_CALL_SEX_SPEECH()
SET_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_SEX)
ELIF NOT IS_BITMASK_AS_ENUM_SET(iBanterBitFlags, HOUSE_BANTER_SEX_MALE)
//Player says sex lines
IF IS_ENTITY_DEAD(stripperPed[0])
CDEBUG1LN(DEBUG_BOOTY_CALL,"[ERROR] Shorty is dead")
ENDIF
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND NOT IS_AMBIENT_SPEECH_PLAYING(stripperPed[0])
PLAY_BOOTY_CALL_SEX_SPEECH()
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
STOP_CURRENT_PLAYING_AMBIENT_SPEECH(PLAYER_PED_ID())
PLAY_PED_AMBIENT_SPEECH_NATIVE(PLAYER_PED_ID(),"SEX_CLIMAX","SPEECH_PARAMS_FORCE_SHOUTED_CLEAR")
ENDIF
CDEBUG1LN(DEBUG_BOOTY_CALL,"[TOD] Restarting timer for TOD")
SET_BITMASK_AS_ENUM(iBanterBitFlags, HOUSE_BANTER_SEX_MALE)
//Advance time of day
RESTART_TIMER_NOW(tBJ)
sThisWeatherType = GET_SPECIFIC_WEATHER_FOR_BOOTY_CALL()
enterHouseStage = ENTER_HOUSE_SHOT_TOD
CDEBUG1LN(DEBUG_BOOTY_CALL,"[NEW FORREST CAM] BETA INTERP - ENTER_HOUSE_SHOT_TOD")
ENDIF
ENDIF
ENDIF
BREAK
CASE ENTER_HOUSE_SHOT_TOD
// IF SKIP_TO_TIME_DURING_SPLINE_CAMERA(iTODSkipHour, 0, "", "", tTimeLapse)
IF GET_TIMER_IN_SECONDS_SAFE(tBJ) > 1.0
CDEBUG1LN(DEBUG_BOOTY_CALL,"[TOD] Timer: ", GET_TIMER_IN_SECONDS_SAFE(tBJ)*0.2)
IF SKIP_TO_TIME_DURING_PHASE_WITH_SOUND(iTODSkipHour,0,sThisWeatherType,"", tTimeLapse,GET_TIMER_IN_SECONDS_SAFE(tBJ)*0.2)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF DOES_ENTITY_EXIST( iTakeHomeVehicle )
IF GET_ENTITY_MODEL( iTakeHomeVehicle ) <> BLIMP2
CLEAR_AREA(vHouseDoorPos, 20.0, TRUE )
ENDIF
ELSE
CLEAR_AREA(vHouseDoorPos, 20.0, TRUE)
ENDIF
IF DOES_ENTITY_EXIST(stripperPed[0])
SET_ENTITY_VISIBLE(stripperPed[0], FALSE)
ENDIF
SET_PED_PATH_AVOID_FIRE(PLAYER_PED_ID(), FALSE)
RESTART_TIMER_NOW(tBJ)
enterHouseStage = ENTER_HOUSE_SHOT_HOLD_TOD
CDEBUG1LN(DEBUG_BOOTY_CALL,"[NEW FORREST CAM] BETA INTERP - ENTER_HOUSE_SHOT_HOLD_TOD")
ENDIF
ENDIF
ENDIF
BREAK
CASE ENTER_HOUSE_SHOT_HOLD_TOD
CDEBUG1LN(DEBUG_BOOTY_CALL,"[NEW FORREST CAM] HOLDING TOD SHOT ", GET_TIMER_IN_SECONDS_SAFE(tBJ) )
SET_CURRENT_PED_WEAPON( PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
IF GET_TIMER_IN_SECONDS_SAFE(tBJ) > 1.5
IF bVehicleSaved
ODDJOB_RESTORE_SAVED_VEHICLE(VehicleSaveArgsBootyCall)
ENDIF
RESTART_TIMER_NOW(tBJ)
enterHouseStage = ENTER_HOUSE_SHOT_CUT_TO_AFTER
CDEBUG1LN(DEBUG_BOOTY_CALL,"[NEW FORREST CAM] BETA INTERP - ENTER_HOUSE_SHOT_CUT_TO_AFTER")
ENDIF
BREAK
CASE ENTER_HOUSE_SHOT_CUT_TO_AFTER
IF NOT IS_CAM_RENDERING(homeCam[2])
CASCADE_SHADOWS_INIT_SESSION()
CASCADE_SHADOWS_ENABLE_FREEZER(TRUE)
CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(TRUE)
SET_CAM_ACTIVE_WITH_INTERP(homeCam[2],homeCam[1], CONST_iPanToPlayerTime)
RESTART_TIMER_NOW(tBJ)
enterHouseStage = ENTER_HOUSE_SHOT_LERP_TO_GAMEPLAY
CDEBUG1LN(DEBUG_BOOTY_CALL,"[NEW FORREST CAM] CAM GAMMA - Lerping to player")
ENDIF
BREAK
CASE ENTER_HOUSE_SHOT_LERP_TO_GAMEPLAY
//Queue anim halfway through the lerp
IF NOT IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_GEN_PLAY_SEX_ANIM)
IF GET_TIMER_IN_SECONDS_SAFE(tBJ) >= 1.25
PLAY_MORNING_AFTER_ANIM()
ENDIF
ENDIF
//Camera is done lerping
IF GET_TIMER_IN_SECONDS_SAFE(tBJ) > CONST_fHomePanUpTime
SET_CAM_ACTIVE(homeCam[3],TRUE)
IF NOT IS_ENTITY_DEAD( iTakeHomeVehicle )
IF GET_ENTITY_MODEL( iTakeHomeVehicle ) = BLIMP2
SET_ENTITY_VISIBLE( iTakeHomeVehicle, TRUE )
ENDIF
SET_ENTITY_AS_MISSION_ENTITY(iTakeHomeVehicle, TRUE, TRUE)
SET_VEHICLE_ENGINE_HEALTH(iTakeHomeVehicle,1000)
SET_VEHICLE_PETROL_TANK_HEALTH(iTakeHomeVehicle,1000)
SET_VEHICLE_FIXED(iTakeHomeVehicle)
ENDIF
RESTART_TIMER_NOW(tBJ)
enterHouseStage = ENTER_HOUSE_SHOT_OVER_SHOULDER
CDEBUG1LN(DEBUG_BOOTY_CALL,"[NEW FORREST CAM] CAM GAMMA - Cleaning up catchup")
ENDIF
BREAK
CASE ENTER_HOUSE_SHOT_OVER_SHOULDER
IF GET_TIMER_IN_SECONDS_SAFE(tBJ) > 2.0
STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP()
enterHouseStage = ENTER_HOUSE_DONE
CDEBUG1LN(DEBUG_BOOTY_CALL,"[NEW FORREST CAM] CAM GAMMA - Cleaning up catchup")
ENDIF
BREAK
CASE ENTER_HOUSE_FADE_OUT
IF IS_SCREEN_FADED_OUT()
AND NOT IS_SCREEN_FADING_OUT()
CDEBUG1LN(DEBUG_BOOTY_CALL,"[NEW FORREST CAM] Player skipped scene")
IF NOT IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_GEN_PLAY_SEX_ANIM)
START_PLAYER_TELEPORT(PLAYER_ID(),vAfterCutPos ,fAfterCutRot, FALSE,TRUE,TRUE)
PLAY_MORNING_AFTER_ANIM()
ENDIF
IF NOT IS_ENTITY_DEAD( iTakeHomeVehicle )
IF GET_ENTITY_MODEL( iTakeHomeVehicle ) = BLIMP2
SET_ENTITY_VISIBLE( iTakeHomeVehicle, TRUE )
ENDIF
ENDIF
SET_CURRENT_PED_WEAPON( PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
IF NOT IS_ENTITY_DEAD(iTakeHomeVehicle)
SET_ENTITY_AS_MISSION_ENTITY(iTakeHomeVehicle, TRUE, TRUE)
SET_VEHICLE_ENGINE_HEALTH(iTakeHomeVehicle,1000)
SET_VEHICLE_PETROL_TANK_HEALTH(iTakeHomeVehicle,1000)
SET_VEHICLE_FIXED(iTakeHomeVehicle)
ENDIF
RESTART_TIMER_NOW(tBJ)
enterHouseStage = ENTER_HOUSE_DONE
ENDIF
BREAK
CASE ENTER_HOUSE_DONE
//CPRINTLN(DEBUG_BOOTY_CALL,"Enter_house_done here")
IF NOT IS_SCREEN_FADING_OUT()
AND GET_TIMER_IN_SECONDS_SAFE(tBJ) >= 1.0
//CPRINTLN(DEBUG_BOOTY_CALL, "Enter_house_done 1st IF")
ODDJOB_EXIT_CUTSCENE(DEFAULT,DEFAULT,FALSE)
SET_ENTITY_HEALTH(PLAYER_PED_ID(), GET_PED_MAX_HEALTH(PLAYER_PED_ID()))
SPECIAL_ABILITY_CHARGE_ABSOLUTE(PLAYER_ID(),30,TRUE)
IF IS_PED_MODEL(PLAYER_PED_ID(), GET_PLAYER_PED_MODEL(CHAR_MICHAEL))
SHRINK_ADD_SEX_TIMESTAMP()
ENDIF
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(vHouseInVehiclePos-<<CONST_fTrigger, CONST_fTrigger, CONST_fTrigger>>, vHouseInVehiclePos+<<CONST_fTrigger, CONST_fTrigger, CONST_fTrigger>>,CONST_fRoadNodeAreaWidth)
//CPRINTLN(debug_booty_call,"Is player car dead? ",IS_ENTITY_DEAD(iTakeHomeVehicle))
IF NOT IS_ENTITY_DEAD(iTakeHomeVehicle)
SET_ENTITY_AS_MISSION_ENTITY(iTakeHomeVehicle, TRUE, TRUE)
IF GET_ENTITY_MODEL( iTakeHomeVehicle ) <> BLIMP2
SET_ENTITY_COORDS(iTakeHomeVehicle, vHouseInVehiclePos)
SET_ENTITY_HEADING(iTakeHomeVehicle, fVehicleHeading)
//B* 1679720: Moving large vehicles outside Infernus' house
//CPRINTLN(DEBUG_BOOTY_CALL,"Is vehicle big: ",IS_BIG_VEHICLE(iTakeHomeVehicle))
IF IS_BIG_VEHICLE(iTakeHomeVehicle)
AND stripperID[0]=BC_STRIPPER_INFERNUS
SET_ENTITY_COORDS(iTakeHomeVehicle, <<-865,516.3,90>>)
SET_ENTITY_HEADING(iTakeHomeVehicle, 15)
ELIF IS_VEHICLE_HELI(iTakeHomeVehicle)
SET_ENTITY_COORDS(iTakeHomeVehicle, vHeliPos)
SET_ENTITY_HEADING(iTakeHomeVehicle, fHeliHeading)
CPRINTLN( DEBUG_BOOTY_CALL, "SETTING HELI POS" )
endif
SET_VEHICLE_ON_GROUND_PROPERLY(iTakeHomeVehicle)
ENDIF
ENDIF
IF NOT IS_SCREEN_FADED_OUT()
SET_TODS_CUTSCENE_RUNNING(tTimeLapse, FALSE,FALSE,2000,TRUE,FALSE)
ELSE
ADD_TO_CLOCK_TIME(CONST_iNumHoursToSkip, 0, 0)
ADVANCE_FRIEND_TIMERS(TO_FLOAT(CONST_iNumHoursToSkip))
DO_SCREEN_FADE_IN(2000)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
SET_TODS_CUTSCENE_RUNNING(tTimeLapse, FALSE)
CDEBUG1LN(DEBUG_BOOTY_CALL,"[FADE] Fade in called!!!!!!!!!!!!!!!!!!!!!!!")
ENDIF
IF DOES_ENTITY_EXIST(stripperPed[0])
DELETE_PED(stripperPed[0])
ENDIF
IF NOT IS_BOOTY_CALL_ID_ACTIVATED(stripperID[0])
IF stripperID[0] = BC_STRIPPER_INFERNUS
PRINT_HELP_WITH_STRIPPER_NAMES("SCLUB_PHON_HELP_ALT", stripperID[0])
ELSE
PRINT_HELP_WITH_STRIPPER_NAMES("SCLUB_PHON_HELP", stripperID[0])
ENDIF
SET_BOOTY_CALL_ID_ACTIVATED(stripperID[0], TRUE)
WAIT(4000)
ENDIF
//SEXTING-----------------------------------------------------------------------------------------------------------
INT iNumSexts
INCREMENT_NUM_SEXTS_SENT_BY_STRIPPER(stripperID[0])
iNumSexts = GET_NUM_SEXTS_SENT_BY_STRIPPER(stripperID[0])
CDEBUG1LN(DEBUG_BOOTY_CALL,"[SEXT] Num sexts = ",iNumSexts, ".")
IF iNumSexts <= CONST_iMaxNumSexts
CC_TextPart ePartStripper
CC_TextPart ePartCount
ePartStripper = GET_TEXT_PARTID_FOR_STRIPPER(stripperID[0])
ePartCount = GET_TEXT_PARTID_FOR_SEXT_COUNT(iNumSexts) //keep this to 1 or 2 with iNumSexts % 2
CDEBUG1LN(DEBUG_BOOTY_CALL,"[SEXT] Queueing sext to be sent for iNumsexts = ",iNumSexts, " ", GET_COMM_ID_DEBUG_STRING(TEXT_SEXT), " ", GET_TEXT_PART_DEBUG_STRING(ePartStripper), " ", GET_TEXT_PART_DEBUG_STRING(ePartCount), ".")
REGISTER_COMPOSITE_TEXT_MESSAGE_FROM_CHARACTER_TO_PLAYER(
TEXT_SEXT,
ePartStripper,
ePartCount,
CT_FRIEND,
GET_CURRENT_PLAYER_PED_BIT(),
GET_BOOTY_CALL_CONTACT_CONTACT_ENUM(stripperID[0]),
CONST_iTimeSextDelay) //will text a minute later
ENDIF
MISSION_PASSED()
ENDIF
BREAK
ENDSWITCH
ENDPROC
FUNC BOOL IS_SECLUDED_SPOT()
PED_INDEX closest_PED_to_player
VEHICLE_INDEX closest_VEHICLE_to_player
VEHICLE_INDEX iPlayersVehicle
VECTOR players_current_pos
FLOAT min_dist_to_interupt_sex = 25.0
VECTOR vInitPos
FLOAT fInitRot
GET_INIT_TAKE_HOME_STRIPPER_LOC(vInitPos, fInitRot, FALSE)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
iPlayersVehicle = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
ENDIF
players_current_pos = GET_ENTITY_COORDS(PLAYER_PED_ID())
// check for road
VECTOR node_pos
IF GET_CLOSEST_MAJOR_VEHICLE_NODE (players_current_pos, node_pos)
FLOAT fDistToClosestNode = VDIST (players_current_pos, node_pos)
IF ( fDistToClosestNode <= 10.0)//20.0)
RETURN FALSE
ELSE
PRINTLN("Distance to closest rode node is ", fDistToClosestNode)
ENDIF
ENDIF
IF VDIST(players_current_pos, vHouseInVehiclePos) < 20 OR
VDIST(players_current_pos, vInitPos) < 20
//player is too close to the starting and ending positions
RETURN FALSE
ENDIF
// check for cops
IF IS_COP_VEHICLE_IN_AREA_3D(players_current_pos - <<20, 20, 20>>, players_current_pos + <<20, 20, 20>>)
RETURN FALSE
ENDIF
// check for nearby ped
GET_CLOSEST_PED(players_current_pos, min_dist_to_interupt_sex, TRUE, TRUE, closest_PED_to_player)
IF NOT (closest_PED_to_player = NULL)
IF NOT IS_ENTITY_DEAD(closest_PED_to_player)
IF HAS_ENTITY_CLEAR_LOS_TO_ENTITY(closest_PED_to_player, PLAYER_PED_ID())
RETURN FALSE
ENDIF
ENDIF
ELSE
closest_VEHICLE_to_player = GET_RANDOM_VEHICLE_IN_SPHERE(players_current_pos, min_dist_to_interupt_sex, DUMMY_MODEL_FOR_SCRIPT,-1 )
IF NOT (closest_VEHICLE_to_player = NULL)
IF NOT (closest_VEHICLE_to_player = iPlayersVehicle)
// check it is satisfactory model
IF IS_VEHICLE_DRIVEABLE (closest_VEHICLE_to_player)
closest_PED_to_player = GET_PED_IN_VEHICLE_SEAT(closest_VEHICLE_to_player,VS_DRIVER )
IF NOT (closest_PED_to_player = NULL)
RETURN FALSE
ENDIF
ENDIF
ELSE
ENDIF
ELSE
// no VEHICLEs found
ENDIF
ENDIF
// check if inside
INTERIOR_INSTANCE_INDEX current_interior
current_interior = GET_INTERIOR_FROM_ENTITY(PLAYER_PED_ID())
IF NOT (current_interior = NULL)
RETURN FALSE
ENDIF
ENDIF
RETURN TRUE
ENDFUNC
FUNC BOOL INIT_SERVICE_ANIMS()
IF HAS_ANIM_DICT_LOADED(GET_ANIM_DICT_FOR_SEX_FOR_VEHICLE_PED_IS_IN(stripperPed[0]))
TASK_PED_TO_HAVE_SEX_IN_VEHICLE(stripperPed[0],FALSE)
TASK_PED_TO_HAVE_SEX_IN_VEHICLE(PLAYER_PED_ID(),FALSE,FALSE)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC DO_STAGE_FIND_QUITE_SPOT()
// check mission fail conditions
CHECK_FAIL_CONDITIONS()
CLEAR_ALL_BLIPS()
SWITCH stateFindingSpot
CASE DRIVE_TO_SPOT
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(stripperPed[0])
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("SCLUB_SECLUDED")
PRINT_HELP_FOREVER("SCLUB_SECLUDED")
ENDIF
IF IS_SECLUDED_SPOT() AND GET_ENTITY_SPEED(PLAYER_PED_ID()) = 0
PRINTLN("Found secluded spot")
CLEAR_HELP()
REQUEST_ANIM_DICT(GET_ANIM_DICT_FOR_SEX_FOR_VEHICLE_PED_IS_IN(stripperPed[0]))
stateFindingSpot = INIT_SEX
ENDIF
ELSE
ENDIF
ELSE
ENDIF
BREAK
CASE INIT_SEX
IF INIT_SERVICE_ANIMS()
stateFindingSpot = HAVE_SEX
ENDIF
BREAK
CASE HAVE_SEX
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME() //Fix for bug 2246108
IF GET_CLOCK_HOURS() > 20 OR GET_CLOCK_HOURS() < 4
bDropOffHome = FALSE //drop the stripper off at the club
ENDIF
//Restore 3rd Person Cam
SET_FOLLOW_PED_CAM_VIEW_MODE(ExitViewMode)
PRINT_TAKE_BOOTY_CALL_HOME(bDropOffHome)
currentMissionStage = DROP_OFF_BOOTY_CALL
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC DO_STAGE_DROP_OFF_BOOTY_CALL(BOOL bDropOffAtHome)
// check mission fail conditions
CHECK_FAIL_CONDITIONS()
VECTOR vDropOffSpot
FLOAt fStoreRot
IF bDropOffAtHome
vDropOffSpot = vHouseInVehiclePos
ELSE
GET_INIT_TAKE_HOME_STRIPPER_LOC(vDropOffSpot, fStoreRot, FALSE)
ENDIF
MANAGE_HOUSE_VEHICLE_BLIP(vDropOffSpot)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(stripperPed[0])
VEHICLE_INDEX vehTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(vehTemp) AND NOT IS_ENTITY_DEAD(vehTemp)
IF bStoppingCar
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(vehTemp, 4.0)
REMOVE_STRIPPER_FROM_GROUP()
TASK_LEAVE_ANY_VEHICLE(stripperPed[0],0, ECF_WAIT_FOR_ENTRY_POINT_TO_BE_CLEAR)
MISSION_PASSED()
ENDIF
ELIF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vDropOffSpot, <<4.0, 4.0, LOCATE_SIZE_HEIGHT>>, TRUE, TRUE, TM_IN_VEHICLE)
bStoppingCar = TRUE
ENDIF
ENDIF
ELSE
ENDIF
ELSE
ENDIF
ENDPROC
// debug
#IF IS_DEBUG_BUILD
PROC DO_DEBUG_SKIPS()
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)
MISSION_CLEANUP()
DEBUG_MESSAGE("HAS_FORCE_CLEANUP_OCCURRED")
CDEBUG1LN(DEBUG_BOOTY_CALL, "[CLEANUP] F Key Pressed ****************** ")
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
CLEAR_SMALL_PRINTS()
IF currentMissionStage = STAGE_GO_TO_HOUSE
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
//IF NOT IS_ENTITY_DEAD(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
//*SET_ENTITY_COORDS*/ SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), vHouseInVehiclePos)
MOVE_VEHICLE_TO_PARK_COORD(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
LOAD_SCENE(vHouseInVehiclePos)
ELSE
IF IS_ENTITY_DEAD(iDebugTakeHomeVehicle)
IF NOT bRequestedDebugVehicle
REQUEST_MODEL(eDebugTakeHomeVehicle)
bRequestedDebugVehicle = TRUE
ENDIF
ENDIF
/*SET_ENTITY_COORDS*/
//SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), vHouseOnFootPos)
ENDIF
ENDIF
ELIF bRequestedDebugVehicle
IF IS_ENTITY_DEAD(iDebugTakeHomeVehicle)
IF HAS_MODEL_LOADED(eDebugTakeHomeVehicle)
IF stripperID[0] = BC_TAXI_LIZ
//OR stripperID[0] = BC_FIXED_CAR
vDebugTakeHomeVehicle = <<-1612.5968, 183.5961, 58.7792>>
ELIF stripperID[0] = BC_HITCHER_GIRL
vDebugTakeHomeVehicle = << 1538.4315, 3776.8496, 33.5178 >>
ENDIF
iDebugTakeHomeVehicle = CREATE_VEHICLE(eDebugTakeHomeVehicle, vDebugTakeHomeVehicle, fDebugTakeHomeVehicle)
ENDIF
ELSE
IF IS_VEHICLE_DRIVEABLE(iDebugTakeHomeVehicle)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), iDebugTakeHomeVehicle, VS_DRIVER)
SET_PED_INTO_VEHICLE(stripperPed[0], iDebugTakeHomeVehicle, VS_FRONT_RIGHT)
bRequestedDebugVehicle = FALSE
ENDIF
ENDIF
ENDIF
IF g_bTurnOnLukeHCameraDebug
// DEBUG_PRINT_STATES()
// DEBUG_SHOW_STRIPPER_HOME_COORDS()
IF NOT IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_GEN_LUKE_MODE_SKIP_ON)
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(),vHouseInVehiclePos) <= 15.0
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
//Create chick
IF NOT IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_GEN_HOME_SCENE_PLAYING)
currentMissionStage = DEBUG_SKIP_MODE
ENDIF
SET_BITMASK_AS_ENUM(iGeneralBitFlags, HOUSE_GEN_LUKE_MODE_SKIP_ON)
CDEBUG1LN(DEBUG_BOOTY_CALL,"[DEBUG] Luke Mode Engaged - skipping to final scene" )
ENDIF
ENDIF
ENDIF
ENDPROC
#ENDIF
// main script
SCRIPT(TAKE_HOME_STRIPPER_INFO takeHomeInfo)
SET_SCRIPT_AS_NO_LONGER_NEEDED("stripperhome")
SET_MISSION_FLAG(TRUE)
SET_ALL_NEUTRAL_RANDOM_PEDS_FLEE(PLAYER_ID(), TRUE) //don't want people bothering me in the middle of a bootycall
DEBUG_MESSAGE("Launching stripper home script")
IF HAS_FORCE_CLEANUP_OCCURRED(FORCE_CLEANUP_FLAG_PLAYER_KILLED_OR_ARRESTED | FORCE_CLEANUP_FLAG_SP_TO_MP | FORCE_CLEANUP_FLAG_RANDOM_EVENTS | FORCE_CLEANUP_FLAG_REPEAT_PLAY)
DEBUG_MESSAGE("HAS_FORCE_CLEANUP_OCCURRED")
MISSION_CLEANUP()
ENDIF
bIsMP = takeHomeInfo.bIsMp
IF bIsMp
// This marks the script as a net script, and handles any instancing setup.
NETWORK_SET_THIS_SCRIPT_IS_NETWORK_SCRIPT(NUM_NETWORK_PLAYERS, FALSE)
// This makes sure the net script is active, waits untull it is.
HANDLE_NET_SCRIPT_INITIALISATION()
RESERVE_NETWORK_MISSION_PEDS(1)
SET_THIS_SCRIPT_CAN_BE_PAUSED(FALSE)
ENDIF
stripperID[0] = takeHomeInfo.stripperID[0]
g_StripclubGlobals.eCurrentBootyCall = stripperID[0]
BOOL bPickUpAtHome = FALSE
BOOL bHaveSexAtHouse = TRUE //having sex at house is the original method, having sex in car is new method
INT iCurrentHour = GET_CLOCK_HOURS()
IF CAN_USE_SEX_IN_CAR_METHOD() AND takeHomeInfo.bIsBootyCall //called stripper on phone, use sex in car method
bHaveSexAtHouse = FALSE
PRINTLN("Current Hour ", iCurrentHour)
IF iCurrentHour > 14 AND iCurrentHour < 22
bPickUpAtHome = TRUE //pick up stripper at home for sex in car method
ENDIF
ENDIF
WHILE NOT INIT_MISSION(takeHomeInfo, bPickUpAtHome) //Going to the stripper starting location
AND currentMissionStage != BOOTYCALL_FAILED
AND currentMissionStage != SEND_STRIPPER_BACK_TO_WORK
AND (currentMissionStage != DEBUG_SKIP_MODE OR NOT IS_BITMASK_AS_ENUM_SET(iGeneralBitFlags, HOUSE_MEET_STRIPPER_CREATED))
//DEBUG_MESSAGE("waiting on INIT_MISSION")
SETUP_BOOTYCALL_WAIT_TIME()
#IF IS_DEBUG_BUILD
// do debug skips
DO_DEBUG_SKIPS()
#ENDIF
WAIT(0)
//CDEBUG1LN(DEBUG_BOOTY_CALL,"[INIT] Waiting for pro to be created" )
ENDWHILE
SET_MODEL_AS_NO_LONGER_NEEDED(GET_STRIPPER_MODEL(0))
SET_MODEL_AS_NO_LONGER_NEEDED(GET_STRIPPER_MODEL(1))
IF NOT bHaveSexAtHouse
currentMissionStage = PICK_UP_BOOTY_CALL
ENDIF
WHILE TRUE
WAIT(0)
IF iRecordBlockPersistTimer > 0
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME()
iRecordBlockPersistTimer -= ROUND(GET_FRAME_TIME()*1000)
ENDIF
// run appropriate stage
SWITCH currentMissionStage
CASE DEBUG_SKIP_MODE
DO_STAGE_DEBUG_MODE()
BREAK
//states for taking girl home for sex
CASE STAGE_GO_TO_HOUSE
DO_STAGE_GO_TO_HOUSE(TRUE) //picking girl up from her starting location and driving her home
BREAK
CASE STAGE_ENTER_HOUSE
DO_STAGE_ENTER_HOUSE() //cutscene of player and stripper walking into the house and cleanup
BREAK
//States for bootycalls, drive to quite spot, and fuck
CASE PICK_UP_BOOTY_CALL
// pick girl up from a location, strippper : 2am - 6am - Club
// 6am - 2pm - no pickup
// 2pm - 2am - home
//
// Others : the other booty calls will use the take home method
DO_STAGE_GO_TO_HOUSE(FALSE)
BREAK
CASE FIND_QUITE_LOCATION_FOR_BOOTYCALL
//drive the girl to a quite spot and fuck
DO_STAGE_FIND_QUITE_SPOT()
BREAK
CASE DROP_OFF_BOOTY_CALL
//after the fucking drop her off, stripper: 8pm - 4am - Club
// 4am - 8pm - Home
// Others : the other booty calls will use the take home method
DO_STAGE_DROP_OFF_BOOTY_CALL(bDropOffHome)
BREAK
//B*1143123
CASE SEND_STRIPPER_BACK_TO_WORK
DO_STAGE_SEND_STRIPPER_TO_THE_CLUB()
BREAK
CASE BOOTYCALL_FAILED
IF NOT IS_TIMER_STARTED(tExitWait)
START_TIMER_NOW(tExitWait)
ELIF TIMER_DO_ONCE_WHEN_READY(tExitWait, 7.5)
MISSION_CLEANUP()
ENDIF
BREAK
ENDSWITCH
// init
#IF IS_DEBUG_BUILD
// do debug skips
DO_DEBUG_SKIPS()
#ENDIF
ENDWHILE
ENDSCRIPT