Files
2025-09-29 00:52:08 +02:00

8972 lines
364 KiB
Python
Executable File

//////////////////////////////////////////////////////////////////////////////////////////
// //
// SCRIPT NAME : vehicle_gen_controller.sc //
// AUTHOR : Kenneth Ross //
// DESCRIPTION : Script version of the vehicle generation system. Data for //
// each vehicle is stored in the private header. Globals have //
// been setup to flag which vehicles are available and require //
// extra processing such as displaying help or sending txts. //
// //
//////////////////////////////////////////////////////////////////////////////////////////
USING "rage_builtins.sch"
USING "globals.sch"
USING "commands_script.sch"
USING "commands_streaming.sch"
USING "commands_camera.sch"
USING "commands_extrametadata.sch"
USING "script_player.sch"
USING "vehicle_gen_private.sch"
USING "vehicle_gen_public.sch"
USING "flow_help_public.sch"
USING "flow_public_core_override.sch"
USING "context_control_public.sch"
USING "commands_interiors.sch"
USING "website_public.sch"
USING "building_control_private.sch"
USING "random_events_public.sch"
USING "menu_public.sch"
USING "cellphone_public.sch"
USING "ambient_common.sch"
USING "beast_secret_peyote.sch"
#if not USE_CLF_DLC
#if not USE_NRM_DLC
USING "properties_public.sch"
#endif
#endif
USING "vehgen_garage_scene_public.sch"
CONST_INT MAX_IMPOUND_SLOTS 2
CONST_INT VEHGEN_BIT_FLAG_PLAYER_USED_VEHICLE 0
CONST_INT VEHGEN_BIT_FLAG_VEHICLE_HANDED_OVER 1
CONST_INT VEHGEN_BIT_FLAG_VEHICLE_MODEL_REQ 2
CONST_INT VEHGEN_BIT_FLAG_PLAYER_LEFT_HANDED_OVER_VEHICLE 3
INT iProcessSlot
INT iVehGenProcessFlags[NUMBER_OF_VEHICLES_TO_GEN]
MODEL_NAMES eVehicleModel[NUMBER_OF_VEHICLES_TO_GEN]
VECTOR vVehicleCoordsAtHandOver[NUMBER_OF_VEHICLES_TO_GEN]
BOOL bCarstealWallLoaded = FALSE
BOOL bCarstealWallUpdated = FALSE
CONST_INT CARSTEAL_WALL_MONROE 0
CONST_INT CARSTEAL_WALL_CHEETAH 1
CONST_INT CARSTEAL_WALL_STINGER 2
CONST_INT CARSTEAL_WALL_JB700 3
CONST_INT CARSTEAL_WALL_ENTITYXF 4
CONST_INT CARSTEAL_WALL_ZTYPE 5
OBJECT_INDEX oCarstealWallLine[6]
BOOL bCheckAllNearbyVehiclesInit
BOOL bForceCleanupSetup = FALSE
CONST_INT GVT_PLANE 0
CONST_INT GVT_BOAT 1
CONST_INT GVT_HELI 2
CONST_INT GVT_CAR 3
STRUCT GARAGE_SETUP_STRUCT
VEHICLE_GEN_NAME_ENUM eClosestGen
FLOAT fClosestDist
INT iPurchaseControl
INT iWarpControl
INT iTimer
INT iContextID
INT iVehicleType
MODEL_NAMES ePedModel
VEHICLE_GEN_DATA_STRUCT sVehGenData
PURCHASABLE_GARAGE_DATA_STRUCT sVehGenPurchData
CAMERA_INDEX camCutscene, camCutscene2
INTERIOR_INSTANCE_INDEX interiorInstanceIndex
VEHICLE_INDEX vehTrack
ENDSTRUCT
GARAGE_SETUP_STRUCT sGarageData
STRUCT DISPLAY_PURCHASE_MSG_STRUCT
SCALEFORM_INDEX siScaleform
BOOL bMessageSet
BOOL bMessageOut
BOOL bSoundPlayed
BANK_ACCOUNT_ACTION_SOURCE_BAAC baacType
ENDSTRUCT
DISPLAY_PURCHASE_MSG_STRUCT sPurchaseMsgData
//Purposefully "hidden" in amongst this script. We want it to be hard
//for hackers to spot these scripts in decompiled output. -BenR
#IF FEATURE_SP_DLC_BEAST_SECRET
#IF NOT FEATURE_SP_DLC_BEAST_SECRET_DEBUG
BeastPeyoteVars sBeastPeyoteVars
#ENDIF
#ENDIF
STRUCT_VEHGEN_GARAGE_SCENE sGarageVehicleWarpData
INT iVehicleMenuSelection
INT iVehicleMenuOptions[4]
INT iCustomVehicleSelection
INT iCustomVehicleOptions[1]
INT iVehicleMenuControl
INT iVehicleMenuContextID = NEW_CONTEXT_INTENTION
INT iGarageEntryContextID = NEW_CONTEXT_INTENTION
BOOL bMenuInitialised, bMenuRebuild, bConfirmUpdate, bRebuildHelp
INT iGarageEntrySynchSceneID = -1
INT iImpoundMenuSelection
INT iImpoundMenuOptions
INT iImpoundMenuSlotTrack[MAX_IMPOUND_SLOTS]
INT iImpoundMenuControl
INT iImpoundMenuContextID = NEW_CONTEXT_INTENTION
INT iContextCounter
BOOL bImpoundDoorOverride = FALSE
VEHICLE_INDEX vehImpoundedPlayerVehicle
enumCharacterList eCurrentPlayerPed
BOOL bCurrentVehicleGenSafeForPlayer
VEHICLE_GEN_DATA_STRUCT sData
PURCHASABLE_GARAGE_DATA_STRUCT sPurchData
VEHICLE_SETUP_STRUCT tempVehicleData
BOOL bDoTutorial
INT iEmailToProcess
BOOL bLeaveAreaAfterPurchase
BLIP_INDEX blipImpound
OBJECT_INDEX objForSaleSign[6]
BOOL bObjectRequested
INT iVehGenCheckCount
VEHICLE_GEN_NAME_ENUM eVehGenCheck[NUMBER_OF_VEHICLES_TO_GEN]
INT iVehGenCheck[(NUMBER_OF_VEHICLES_TO_GEN/32)+1]
VEHICLE_GEN_NAME_ENUM ePurchasedVehicleGen = VEHGEN_NONE
FLOAT fDistToVehGen[NUMBER_OF_VEHICLES_TO_GEN]
VEHICLE_STATS_FOR_CLASS_TEMP sVehStatsData
INT iWantedLevelBeforeWarp
INT iGarageHelpStage
BOOL bForceGarageChecks
BOOL bProcessingGarageChecks
//BOOL bExitGarageWhenSittingInVehicle = TRUE
BOOL bExitGarageInDLCVehicle
MODEL_NAMES eDLCModel
BOOL bRepeatPlayActiveState
TEXT_LABEL_15 tlSelectHelpPrinted, tlWarpHelpPrinted
VEHICLE_INDEX lastVehicleBeforeWarp
VEHICLE_INDEX vehPreviousCarToTrackForImpound
VEHICLE_INDEX vehLastMissionVehGenToStreamOut
BOOL bNozzelSet = FALSE
//BOOL bPropertyUnlockChecksProcessedThisFrame = FALSE
CONST_FLOAT fCONST_VEHGEN_TARGET_RADIUS 1.0
CONST_FLOAT fCONST_VEHGEN_STRAIGHT_LINE_DIST 100.0
BOOL bLoadSceneStartedFromVehGen = FALSE
BOOL bAnimDictLoadSceneStartedFromVehGen = FALSE
INT fakeGarageCarEnterCutsceneStage = 0
BOOL bFakeGarageReverse = FALSE
STRING sOpenGarageAnimClip
// url:bugstar:2108774
INT iGarageClear
FUNC BOOL IS_THIS_MODEL_SAFE_FOR_HANGAR(MODEL_NAMES eModel)
IF eModel = JET
RETURN FALSE
ENDIF
IF NOT IS_THIS_MODEL_A_PLANE(eModel)
AND eModel != MARSHALL
AND eModel != RHINO
AND eModel != BARRACKS
AND eModel != CRUSADER
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
FUNC BOOL IS_THIS_MODEL_SAFE_FOR_GARAGE(MODEL_NAMES eModel)
IF eModel = MARSHALL
OR eModel = BARRACKS
OR eModel = CRUSADER
RETURN FALSE
ENDIF
IF eModel = RHINO
RETURN FALSE
ENDIF
IF NOT IS_THIS_MODEL_A_CAR(eModel)
AND NOT IS_THIS_MODEL_A_BIKE(eModel)
AND NOT IS_THIS_MODEL_A_BICYCLE(eModel)
AND NOT IS_THIS_MODEL_A_QUADBIKE(eModel)
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
FUNC BOOL IS_VEHICLE_MODEL_SUITABLE_FOR_DYNAMIC_UPDATE(MODEL_NAMES eModel)
SWITCH sGarageData.iVehicleType
CASE GVT_PLANE
RETURN IS_THIS_MODEL_SAFE_FOR_HANGAR(eModel)
BREAK
CASE GVT_BOAT
IF (IS_THIS_MODEL_A_BOAT(eModel))
OR (IS_THIS_MODEL_A_JETSKI(eModel))
OR (eModel = SUBMERSIBLE2)
OR (eModel = DODO)
RETURN TRUE
ENDIF
BREAK
CASE GVT_CAR
RETURN IS_THIS_MODEL_SAFE_FOR_GARAGE(eModel)
BREAK
CASE GVT_HELI
RETURN IS_THIS_MODEL_A_HELI(eModel) AND eModel != SKYLIFT
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC FLOAT GET_INTERP_POINT_FLOAT(FLOAT fStartPos, FLOAT fEndPos, FLOAT fStartTime, FLOAT fEndTime, FLOAT fPointTime)
RETURN ((((fEndPos - fStartPos) / (fEndTime - fStartTime)) * (fPointTime - fStartTime)) + fStartPos)
ENDFUNC
FUNC VECTOR GET_INTERP_POINT_VECTOR(VECTOR vStartPos, VECTOR vEndPos, FLOAT fStartTime, FLOAT fEndTime, FLOAT fPointTime)
RETURN <<GET_INTERP_POINT_FLOAT(vStartPos.X, vEndPos.X, fStartTime, fEndTime, fPointTime), GET_INTERP_POINT_FLOAT(vStartPos.Y, vEndPos.Y, fStartTime, fEndTime, fPointTime), GET_INTERP_POINT_FLOAT(vStartPos.Z, vEndPos.Z, fStartTime, fEndTime, fPointTime)>>
ENDFUNC
#IF IS_DEBUG_BUILD
BOOL b_DebugGivePlayerAllGarages
#ENDIF
/// PURPOSE:
/// To clone a local version of a vehicle including any damage for a cutscene
FUNC BOOL CREATE_CUTSCENE_VEHICLE_CLONE(VEHICLE_INDEX &NewVehicleId, VEHICLE_INDEX VehToClone, VECTOR vPos, FLOAT fHeading)
model_names vehModel
INT irepeat
VEHICLE_SETUP_STRUCT fakeGarageVehicleSetupStructSp
RESET_VEHICLE_SETUP_STRUCT(fakeGarageVehicleSetupStructSp)
IF IS_VEHICLE_DRIVEABLE(VehToClone)
vehModel = GET_ENTITY_MODEL(VehToClone)
GET_VEHICLE_SETUP(VehToClone, fakeGarageVehicleSetupStructSp)
ELSE
#IF IS_DEBUG_BUILD
DEBUG_PRINTCALLSTACK()
SCRIPT_ASSERT("CREATE_CUTSCENE_VEHICLE_CLONE: IS_VEHICLE_DRIVEABLE = FALSE")
PRINTSTRING("CREATE_CUTSCENE_VEHICLE_CLONE - called by ") PRINTSTRING(GET_THIS_SCRIPT_NAME())
#ENDIF
ENDIF
#IF IS_DEBUG_BUILD
IF NOT REQUEST_LOAD_MODEL(vehModel)
DEBUG_PRINTCALLSTACK()
SCRIPT_ASSERT("CREATE_CUTSCENE_VEHICLE_CLONE: LOAD_MODEL() = FALSE")
ENDIF
PRINTSTRING("CREATE_CUTSCENE_VEHICLE_CLONE - called by ")PRINTSTRING(GET_THIS_SCRIPT_NAME())
PRINTSTRING(", Model = ")PRINTSTRING(GET_MODEL_NAME_FOR_DEBUG(vehModel))PRINTNL()
#ENDIF
IF NOT IS_VEHICLE_DRIVEABLE(NewVehicleId)
NewVehicleId = CREATE_VEHICLE(vehModel, vPos, fHeading, FALSE, FALSE)
GET_VEHICLE_SETUP(NewVehicleId, fakeGarageVehicleSetupStructSp)
IF NOT IS_THIS_MODEL_A_BIKE(vehModel)
FOR irepeat = ENUM_TO_INT(SC_DOOR_FRONT_LEFT) TO ENUM_TO_INT(SC_DOOR_BOOT)
IF IS_VEHICLE_DOOR_DAMAGED(VehToClone,INT_TO_ENUM(SC_DOOR_LIST,irepeat))
SET_VEHICLE_DOOR_BROKEN(NewVehicleId,INT_TO_ENUM(SC_DOOR_LIST,irepeat),TRUE)
ENDIF
ENDFOR
ENDIF
FOR irepeat = ENUM_TO_INT(SC_WHEEL_CAR_FRONT_LEFT) TO ENUM_TO_INT(SC_WHEEL_BIKE_REAR)
IF IS_VEHICLE_TYRE_BURST(VehToClone,INT_TO_ENUM(SC_WHEEL_LIST,irepeat),TRUE)
SET_VEHICLE_TYRE_BURST(NewVehicleId,INT_TO_ENUM(SC_WHEEL_LIST,irepeat),TRUE)
ELIF IS_VEHICLE_TYRE_BURST(VehToClone,INT_TO_ENUM(SC_WHEEL_LIST,irepeat))
SET_VEHICLE_TYRE_BURST(NewVehicleId,INT_TO_ENUM(SC_WHEEL_LIST,irepeat))
ENDIF
ENDFOR
IF NOT IS_THIS_MODEL_A_BIKE(vehModel)
FOR irepeat = ENUM_TO_INT(SC_WINDOW_FRONT_LEFT) TO ENUM_TO_INT(SC_WINDOW_REAR_RIGHT)
IF NOT IS_VEHICLE_WINDOW_INTACT(VehToClone,INT_TO_ENUM(SC_WINDOW_LIST,irepeat))
REMOVE_VEHICLE_WINDOW(NewVehicleId,INT_TO_ENUM(SC_WINDOW_LIST,irepeat))
ENDIF
ENDFOR
ENDIF
COPY_VEHICLE_DAMAGES(VehToClone, NewVehicleId)
ENDIF
IF IS_VEHICLE_DRIVEABLE(NewVehicleId)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
#IF IS_DEBUG_BUILD
PROC DRAW_DEBUG_VEHGEN_SCENE_TEXT(TEXT_LABEL_63 str, INT iWarpControl, FLOAT &fStrOffset, HUD_COLOURS hudColour = HUD_COLOUR_SIMPLEBLIP_DEFAULT, INT iColumn = 0)
INT iRed, iGreen, iBlue, iAlpha
IF (hudColour = HUD_COLOUR_SIMPLEBLIP_DEFAULT)
IF iWarpControl = 0
GET_HUD_COLOUR(HUD_COLOUR_RED, iRed, iGreen, iBlue, iAlpha)
ELIF iWarpControl < 10
GET_HUD_COLOUR(HUD_COLOUR_GREEN, iRed, iGreen, iBlue, iAlpha)
ELSE
GET_HUD_COLOUR(HUD_COLOUR_BLUE, iRed, iGreen, iBlue, iAlpha)
ENDIF
ELSE
GET_HUD_COLOUR(hudColour, iRed, iGreen, iBlue, iAlpha)
ENDIF
DRAW_DEBUG_TEXT_2D(str, <<0.2,0.1,0>>+(<<0.0,0.01,0>>*fStrOffset)+(<<0.2,0.0,0>>*TO_FLOAT(iColumn)), iRed, iGreen, iBlue, iAlpha)
IF iWarpControl > -1
IF fStrOffset = 0.0
PRINTLN(str)
ELSE
PRINTLN(" * ", str)
ENDIF
ELSE
PRINTLN(str)
ENDIF
fStrOffset += 1.0
ENDPROC
#ENDIF
VEHICLE_INDEX vehFakeGarageEnter
FLOAT fFakeVehicleOffset
INT iGarageCutTimer
//OBJECT_INDEX objFakeGarageDoor
//MODEL_NAMES fakeGarageDoorModel = V_ILEV_CSR_GARAGEDOOR
FUNC BOOL DO_FAKE_GARAGE_CAR_DRIVE(PED_INDEX PedIndex,
structSceneTool_Point mPoint, structSceneTool_Marker mMarker,
FLOAT fDurationMS,
structSceneTool_Placer mPlacer, CAMERA_GRAPH_TYPE camGraphTypeFakeGarage,
FLOAT &fStrOffset)
VECTOR vStartPoint = mPoint.vPos
VECTOR vStartRotation = mPoint.vRot
VECTOR vEndPoint = mMarker.vPos
VECTOR vEndRotation = mPoint.vRot
CONST_INT FAKE_GARAGE_CAR_ENTER_CUTSCENE_INIT 0
CONST_INT FAKE_GARAGE_CAR_ENTER_CUTSCENE_RUNNING 1
CONST_INT FAKE_GARAGE_CAR_ENTER_CUTSCENE_COMPLETE 2
#IF IS_DEBUG_BUILD
INT iRed, iGreen, iBlue, iAlpha
HUD_COLOURS hudColour = HUD_COLOUR_YELLOW
GET_HUD_COLOUR(hudColour, iRed, iGreen, iBlue, iAlpha)
TEXT_LABEL_63 str = ""
VECTOR vDiffPoint
FLOAT fPlacerHeading, fDiffHeading
vDiffPoint = vStartPoint - vEndPoint
fPlacerHeading = ((vStartRotation.z+vEndRotation.z) / 2.0) - 180.0
IF fPlacerHeading > 180
fPlacerHeading -= 360
ENDIF
IF fPlacerHeading < -180
fPlacerHeading += 360
ENDIF
fDiffHeading = GET_HEADING_FROM_VECTOR_2D(vDiffPoint.x, vDiffPoint.y)
IF fDiffHeading > 180
fDiffHeading -= 360
ENDIF
IF fDiffHeading < -180
fDiffHeading += 360
ENDIF
#ENDIF
IF (fakeGarageCarEnterCutsceneStage = FAKE_GARAGE_CAR_ENTER_CUTSCENE_INIT)
#IF IS_DEBUG_BUILD
str = "FAKE_GARAGE_CAR_ENTER_CUTSCENE_INIT"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, -1, fStrOffset, hudColour)
str = "vStartPoint: "
str += GET_STRING_FROM_FLOAT(vStartPoint.x)
str += ", "
str += GET_STRING_FROM_FLOAT(vStartPoint.y)
str += ", "
str += GET_STRING_FROM_FLOAT(vStartPoint.z)
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, -1, fStrOffset, hudColour)
str = "vEndPoint: "
str += GET_STRING_FROM_FLOAT(vEndPoint.x)
str += ", "
str += GET_STRING_FROM_FLOAT(vEndPoint.y)
str += ", "
str += GET_STRING_FROM_FLOAT(vEndPoint.z)
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, -1, fStrOffset, hudColour)
str = "heading: "
str += GET_STRING_FROM_FLOAT(fDiffHeading)
str += " ["
str += GET_STRING_FROM_FLOAT(fPlacerHeading)
str += "]"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, -1, fStrOffset, hudColour)
str = "distance: "
str += GET_STRING_FROM_FLOAT(VDIST(vStartPoint, vEndPoint))
str += "m"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, -1, fStrOffset, hudColour)
PRINTLN("")
#ENDIF
//Clones
VEHICLE_INDEX vehPlayer
vehPlayer = GET_VEHICLE_PED_IS_IN(PedIndex)
/* CREATE_CUTSCENE_VEHICLE_CLONE(vehFakeGarageEnter, vehPlayer, vStartPoint, vStartRotation.Z) */
vehFakeGarageEnter = vehPlayer
SET_VEHICLE_DOORS_SHUT(vehFakeGarageEnter, TRUE)
SET_VEHICLE_DOORS_LOCKED(vehFakeGarageEnter, VEHICLELOCK_UNLOCKED)
SET_VEHICLE_ON_GROUND_PROPERLY(vehFakeGarageEnter)
SET_VEHICLE_ENGINE_ON(vehFakeGarageEnter, TRUE, TRUE)
IF IS_PED_ON_ANY_BIKE(PedIndex)
GIVE_PED_HELMET(PedIndex, FALSE, PV_FLAG_NONE)
SET_PED_HELMET(PedIndex, TRUE)
ENDIF
VECTOR vFakeGaragePlayerCarCoords
vFakeGaragePlayerCarCoords = GET_ENTITY_COORDS(vehFakeGarageEnter)
fFakeVehicleOffset = vFakeGaragePlayerCarCoords.Z - vStartPoint.Z
SET_ENTITY_COORDS(vehFakeGarageEnter, vStartPoint + <<0.0, 0.0, -10.0>>)
IF IS_VEHICLE_DRIVEABLE(vehFakeGarageEnter)
SET_VEHICLE_LIGHTS(vehFakeGarageEnter, SET_VEHICLE_LIGHTS_ON)
ENDIF
iGarageCutTimer = GET_GAME_TIMER()
fakeGarageCarEnterCutsceneStage = FAKE_GARAGE_CAR_ENTER_CUTSCENE_RUNNING
ENDIF
IF (fakeGarageCarEnterCutsceneStage = FAKE_GARAGE_CAR_ENTER_CUTSCENE_RUNNING)
#IF IS_DEBUG_BUILD
str = "FAKE_GARAGE_CAR_ENTER_CUTSCENE_RUNNING"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, -1, fStrOffset, hudColour)
str = "iGarageCutTimer: "
str += GET_STRING_FROM_FLOAT(TO_FLOAT(iGarageCutTimer) / 1000.0)
str += "s, fDurationMS: "
str += GET_STRING_FROM_FLOAT((fDurationMS) / 1000.0)
str += "s"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, -1, fStrOffset, hudColour)
str = "iGarageCutTimer+fDurationMS: "
str += GET_STRING_FROM_FLOAT(((TO_FLOAT(iGarageCutTimer) + (fDurationMS)) - GET_GAME_TIMER()) / 1000.0)
str += "s"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, -1, fStrOffset, hudColour)
str = "GET_GAME_TIMER: "
str += GET_STRING_FROM_FLOAT(TO_FLOAT(GET_GAME_TIMER()) / 1000.0)
str += "s"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, -1, fStrOffset, hudColour)
str = "heading: "
str += GET_STRING_FROM_FLOAT(fDiffHeading)
str += " ["
str += GET_STRING_FROM_FLOAT(fPlacerHeading)
str += "]"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, -1, fStrOffset, hudColour)
FLOAT fDistanceInMeters
FLOAT fDurationInSeconds
fDistanceInMeters = VDIST(vStartPoint, vEndPoint)
fDurationInSeconds = fDurationMS/1000.0
FLOAT fDistanceInKilometers
FLOAT fDurationInHours
fDistanceInKilometers = fDistanceInMeters/1000.0
fDurationInHours = fDurationInSeconds/3600.0
FLOAT fSpeedInKilometersPerHour
fSpeedInKilometersPerHour = fDistanceInKilometers / fDurationInHours
str = "distance: "
str += GET_STRING_FROM_FLOAT(VDIST(vStartPoint, vEndPoint))
str += "m, speed: "
str += GET_STRING_FROM_FLOAT(fSpeedInKilometersPerHour)
str += " Km/h"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, -1, fStrOffset, hudColour)
IF bFakeGarageReverse
str = "bFakeGarageReverse"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, -1, fStrOffset, hudColour)
ELSE
str = "NOT bFakeGarageReverse"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, -1, fStrOffset, hudColour)
ENDIF
str = "GRAPH_TYPE_"
SWITCH camGraphTypeFakeGarage
CASE GRAPH_TYPE_LINEAR
str += "LINEAR"
BREAK
CASE GRAPH_TYPE_SIN_ACCEL_DECEL
str += "SIN_ACCEL_DECEL"
BREAK
CASE GRAPH_TYPE_ACCEL
str += "ACCEL"
BREAK
CASE GRAPH_TYPE_DECEL
str += "DECEL"
BREAK
DEFAULT
str += "UNKNOWN_"
str += ENUM_TO_INT(camGraphTypeFakeGarage)
BREAK
ENDSWITCH
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, -1, fStrOffset, hudColour)
CONST_FLOAT fReasonableSpeed 30.0
IF fSpeedInKilometersPerHour > fReasonableSpeed
/*
VECTOR vStartPoint = mPoint.vPos
VECTOR vStartRotation = mPoint.vRot
VECTOR vEndPoint = mMarker.vPos
VECTOR vEndRotation = mPoint.vRot
*/
IF sGarageData.iWarpControl = 3
CWARNINGLN(DEBUG_AMBIENT, "speed to damn high (enterVeh, vEndPoint: ",vEndPoint, ")")
ELIF sGarageData.iWarpControl = 13
CWARNINGLN(DEBUG_AMBIENT, "speed to damn high (exitVeh, vEndPoint: ",vEndPoint, ")")
ELSE
CWARNINGLN(DEBUG_AMBIENT, "speed to damn high (iWarpControl: ", sGarageData.iWarpControl, ")")
ENDIF
ENDIF
#ENDIF
IF DOES_ENTITY_EXIST(vehFakeGarageEnter)
AND IS_VEHICLE_DRIVEABLE(vehFakeGarageEnter)
FLOAT fStartTime = TO_FLOAT(iGarageCutTimer)
FLOAT fEndTime = fStartTime + fDurationMS
FLOAT fPointTime = CLAMP(TO_FLOAT(GET_GAME_TIMER()), fStartTime, fEndTime)
fPointTime -= fStartTime
fPointTime /= fDurationMS
IF camGraphTypeFakeGarage = GRAPH_TYPE_SIN_ACCEL_DECEL
fPointTime = GET_GRAPH_TYPE_SIN_ACCEL_DECEL(fPointTime)
ELIF camGraphTypeFakeGarage = GRAPH_TYPE_ACCEL
fPointTime = GET_GRAPH_TYPE_ACCEL(fPointTime)
ELIF camGraphTypeFakeGarage = GRAPH_TYPE_DECEL
fPointTime = GET_GRAPH_TYPE_DECEL(fPointTime)
ENDIF
fPointTime *= fDurationMS
fPointTime += fStartTime
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_BRAKE)
SET_ENTITY_COORDS_NO_OFFSET(vehFakeGarageEnter, GET_INTERP_POINT_VECTOR(
vStartPoint + <<0.0, 0.0, fFakeVehicleOffset>>, //VECTOR vStartPos
vEndPoint + <<0.0, 0.0, fFakeVehicleOffset>>, //VECTOR vEndPos
fStartTime, fEndTime, fPointTime))
#IF IS_DEBUG_BUILD
DRAW_DEBUG_SPHERE(vStartPoint + <<0.0, 0.0, fFakeVehicleOffset>>, 1.0, iRed, iGreen, iBlue, ROUND(TO_FLOAT(iAlpha) / 0.15))
DRAW_DEBUG_TEXT("vStartPoint", vStartPoint + <<0.0, 0.0, fFakeVehicleOffset>>, 255-iRed, 255-iGreen, 255-iBlue, ROUND(TO_FLOAT(iAlpha) / 0.15))
DRAW_DEBUG_SPHERE(vEndPoint + <<0.0, 0.0, fFakeVehicleOffset>>, 1.0, 255-iRed, 255-iGreen, 255-iBlue, ROUND(TO_FLOAT(iAlpha) / 0.15))
DRAW_DEBUG_TEXT("vEndPoint", vEndPoint + <<0.0, 0.0, fFakeVehicleOffset>>, iRed, iGreen, iBlue, ROUND(TO_FLOAT(iAlpha) / 0.15))
DRAW_DEBUG_LINE_WITH_TWO_COLOURS(
vStartPoint + <<0.0, 0.0, fFakeVehicleOffset>>,
vEndPoint + <<0.0, 0.0, fFakeVehicleOffset>>,
iRed, iGreen, iBlue, ROUND(TO_FLOAT(iAlpha) / 0.15),
255-iRed, 255-iGreen, 255-iBlue, ROUND(TO_FLOAT(iAlpha) / 0.15))
#ENDIF
IF bFakeGarageReverse AND NOT IS_PED_ON_ANY_BIKE(PedIndex)
SET_ENTITY_ROTATION(vehFakeGarageEnter, GET_INTERP_POINT_VECTOR(
<<0.0 - vStartRotation.X, 0.0 - vStartRotation.Y, vStartRotation.Z + 180.0>>,
<<0.0 - vEndRotation.X, 0.0 - vEndRotation.Y, vEndRotation.Z + 180.0>>,
fStartTime, fEndTime, fPointTime))
ELSE
IF NOT IS_PED_INJURED(PedIndex)
IF IS_PED_ON_ANY_BIKE(PedIndex)
SET_PED_RESET_FLAG(PedIndex, PRF_PreventGoingIntoStillInVehicleState, TRUE)
SET_PED_RESET_FLAG(PedIndex, PRF_DisableInVehicleActions, TRUE)
ENDIF
ENDIF
SET_ENTITY_ROTATION(vehFakeGarageEnter, GET_INTERP_POINT_VECTOR(
vStartRotation, vEndRotation,
fStartTime, fEndTime, fPointTime))
ENDIF
SET_ENTITY_COLLISION(vehFakeGarageEnter, FALSE)
FREEZE_ENTITY_POSITION(vehFakeGarageEnter, TRUE)
ELSE
fakeGarageCarEnterCutsceneStage = FAKE_GARAGE_CAR_ENTER_CUTSCENE_COMPLETE
RETURN FALSE
ENDIF
IF TO_FLOAT(GET_GAME_TIMER()) > TO_FLOAT(iGarageCutTimer) + (fDurationMS)
AND TO_FLOAT(GET_GAME_TIMER()) > TO_FLOAT(iGarageCutTimer) + (fDurationMS) + 2600.0 // + 1000 for bug 1635631
fakeGarageCarEnterCutsceneStage = FAKE_GARAGE_CAR_ENTER_CUTSCENE_COMPLETE
RETURN FALSE
ENDIF
ENDIF
IF (fakeGarageCarEnterCutsceneStage = FAKE_GARAGE_CAR_ENTER_CUTSCENE_COMPLETE)
#IF IS_DEBUG_BUILD
str = "FAKE_GARAGE_CAR_ENTER_CUTSCENE_COMPLETE"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, -1, fStrOffset, hudColour)
#ENDIF
SET_PED_RESET_FLAG(PedIndex, PRF_PreventGoingIntoStillInVehicleState, FALSE)
SET_PED_RESET_FLAG(PedIndex, PRF_DisableInVehicleActions, FALSE)
IF DOES_ENTITY_EXIST(vehFakeGarageEnter)
IF NOT ARE_VECTORS_EQUAL(mPlacer.vPos, <<0,0,0>>)
SET_ENTITY_COORDS(vehFakeGarageEnter, mPlacer.vPos)
SET_ENTITY_HEADING(vehFakeGarageEnter, mPlacer.fRot)
SET_VEHICLE_ON_GROUND_PROPERLY(vehFakeGarageEnter)
ENDIF
SET_ENTITY_COLLISION(vehFakeGarageEnter, TRUE)
FREEZE_ENTITY_POSITION(vehFakeGarageEnter, FALSE)
vehFakeGarageEnter = NULL
ENDIF
IF IS_PED_ON_ANY_BIKE(PedIndex)
REMOVE_PED_HELMET(PedIndex, FALSE)
ENDIF
RETURN TRUE
ENDIF
#IF NOT IS_DEBUG_BUILD
UNUSED_PARAMETER(fStrOffset)
#ENDIF
RETURN FALSE
ENDFUNC
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID wVehicleGenControllerWidget
BOOL bSetMissionVehGenDebug
BOOL bSetMissionVehGenDebug2
BOOL bCreateImpoundVehDebug
BOOL bClearImpoundVehDebug
BOOL bOutputImpoundVehDebug
BOOL bTrackImpoundVehDebug
INT iImpoundVehSlotChar
INT iImpoundVehSlotDebug
BOOL bOutputSpecialVehicleInfo
VEHICLE_INDEX vehImpound
INT iVehgen_garage_scene_type
structSceneTool_Launcher rag_vehgen_garage_scene
BOOL bSnapMarkerToPoint
BOOL bPlayTutorial
FUNC BOOL Debug_RUN_VEHGEN_GARAGE_SCENE(STRUCT_VEHGEN_GARAGE_SCENE &scene, enumVEHGEN_GARAGE_SCENE_Type eVehgen_garage_scene_type)
IF IS_PED_INJURED(PLAYER_PED_ID())
RETURN TRUE
ENDIF
enumVEHGEN_GARAGE_SCENE_Pans ePan
enumVEHGEN_GARAGE_SCENE_Markers eMarker
enumVEHGEN_GARAGE_SCENE_Placers ePlacers
enumVEHGEN_GARAGE_SCENE_Points ePoint
VEHICLE_INDEX currentVeh
OBJECT_INDEX garageObj
CAMERA_INDEX camCutscene, camCutscene2
WIDGET_GROUP_ID wDebugVehGenSceneWidget
BOOL bEditScene
FLOAT fSynchScenePhase
INT iGraph = ENUM_TO_INT(GRAPH_TYPE_LINEAR)
STRING sOpenGarageAnimDict = "ANIM@APT_TRANS@GARAGE"
REQUEST_ANIM_DICT(sOpenGarageAnimDict)
SWITCH eVehgen_garage_scene_type
CASE VEHGEN_GARAGE_SCENE_TYPE_enterPed
ePan = VEHGEN_GARAGE_SCENE_PAN_enterPed
eMarker = VEHGEN_GARAGE_SCENE_MARKER_MAX
ePlacers = VEHGEN_GARAGE_SCENE_PLACER_enterPed
ePoint = VEHGEN_GARAGE_SCENE_POINT_MAX
BREAK
CASE VEHGEN_GARAGE_SCENE_TYPE_enterVeh
ePan = VEHGEN_GARAGE_SCENE_PAN_enterVeh
eMarker = VEHGEN_GARAGE_SCENE_MARKER_enterVeh
ePlacers = VEHGEN_GARAGE_SCENE_PLACER_MAX
ePoint = VEHGEN_GARAGE_SCENE_POINT_enterVeh
iGraph = ENUM_TO_INT(GRAPH_TYPE_ACCEL)
BREAK
CASE VEHGEN_GARAGE_SCENE_TYPE_exitPedOpen
ePan = VEHGEN_GARAGE_SCENE_PAN_exitPedOpen
eMarker = VEHGEN_GARAGE_SCENE_MARKER_MAX
ePlacers = VEHGEN_GARAGE_SCENE_PLACER_exitPedOpen
ePoint = VEHGEN_GARAGE_SCENE_POINT_MAX
BREAK
// CASE VEHGEN_GARAGE_SCENE_TYPE_exitPedClose
// ePan = VEHGEN_GARAGE_SCENE_PAN_exitPedClose
// eMarker = VEHGEN_GARAGE_SCENE_MARKER_exitPedClose
// ePlacers = VEHGEN_GARAGE_SCENE_PLACER_exitPedClose
// ePoint = VEHGEN_GARAGE_SCENE_POINT_MAX
// BREAK
CASE VEHGEN_GARAGE_SCENE_TYPE_exitVeh
ePan = VEHGEN_GARAGE_SCENE_PAN_exitVeh
eMarker = VEHGEN_GARAGE_SCENE_MARKER_exitVeh
ePlacers = VEHGEN_GARAGE_SCENE_PLACER_exitVeh
ePoint = VEHGEN_GARAGE_SCENE_POINT_exitVeh
iGraph = ENUM_TO_INT(GRAPH_TYPE_DECEL)
BREAK
ENDSWITCH
IF eVehgen_garage_scene_type = VEHGEN_GARAGE_SCENE_TYPE_enterVeh
OR eVehgen_garage_scene_type = VEHGEN_GARAGE_SCENE_TYPE_exitVeh
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
currentVeh = GET_CLOSEST_VEHICLE(scene.mPoints[ePoint].vPos, 50.0, DUMMY_MODEL_FOR_SCRIPT, VEHICLE_SEARCH_FLAG_RETURN_RANDOM_VEHICLES)
IF DOES_ENTITY_EXIST(currentVeh)
IF NOT IS_VEHICLE_MODEL_SUITABLE_FOR_DYNAMIC_UPDATE(GET_ENTITY_MODEL(currentVeh))
PRINTLN("finding currentVeh - DELETE_VEHICLE(", GET_MODEL_NAME_OF_VEHICLE_FOR_DEBUG_ONLY(currentVeh), " not suitable for garage)")
SET_ENTITY_AS_MISSION_ENTITY(currentVeh)
DELETE_VEHICLE(currentVeh)
RETURN FALSE
ENDIF
PED_INDEX pedIndex = GET_PED_IN_VEHICLE_SEAT(currentVeh, VS_DRIVER)
IF DOES_ENTITY_EXIST(pedIndex)
SET_ENTITY_AS_MISSION_ENTITY(pedIndex)
CLEAR_PED_TASKS_IMMEDIATELY(pedIndex)
DELETE_PED(pedIndex)
ENDIF
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), currentVeh, VS_DRIVER)
ELSE
RETURN FALSE
ENDIF
ELSE
PRINTLN("finding currentVeh - DOES_ENTITY_EXIST(currentVeh)")
currentVeh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
ENDIF
IF DOES_ENTITY_EXIST(currentVeh)
AND IS_VEHICLE_DRIVEABLE(currentVeh)
SET_ENTITY_PROOFS(currentVeh, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE)
SET_ENTITY_COORDS(currentVeh, scene.mPoints[ePoint].vPos)
SET_ENTITY_HEADING(currentVeh, scene.mPoints[ePoint].vRot.z)
SET_VEHICLE_ON_GROUND_PROPERLY(currentVeh)
ENDIF
// REQUEST_MODEL(fakeGarageDoorModel)
//
// garageObj = CREATE_OBJECT_NO_OFFSET(fakeGarageDoorModel, scene.mPoints[VEHGEN_GARAGE_SCENE_POINT_garageDoor].vPos)
// SET_ENTITY_ROTATION(garageObj, scene.mPoints[VEHGEN_GARAGE_SCENE_POINT_garageDoor].vRot)
fakeGarageCarEnterCutsceneStage = 0
// TASK_VEHICLE_DRIVE_TO_COORD(PLAYER_PED_ID(), currentVeh, scene.mMarkers[eMarker].vPos, 5.0, DRIVINGSTYLE_NORMAL, DUMMY_MODEL_FOR_SCRIPT, DRIVINGMODE_AVOIDCARS_STOPFORPEDS_OBEYLIGHTS, fCONST_VEHGEN_TARGET_RADIUS, fCONST_VEHGEN_STRAIGHT_LINE_DIST)
SET_CURRENT_WIDGET_GROUP(rag_vehgen_garage_scene.hWidget)
wDebugVehGenSceneWidget = START_WIDGET_GROUP("wDebugVehGenSceneWidget")
ADD_WIDGET_BOOL("bEditScene", bEditScene)
START_NEW_WIDGET_COMBO()
ADD_TO_WIDGET_COMBO("GRAPH_TYPE_LINEAR")
ADD_TO_WIDGET_COMBO("GRAPH_TYPE_SIN_ACCEL_DECEL")
ADD_TO_WIDGET_COMBO("GRAPH_TYPE_ACCEL")
ADD_TO_WIDGET_COMBO("GRAPH_TYPE_DECEL")
STOP_WIDGET_COMBO("iGraph", iGraph)
STOP_WIDGET_GROUP()
CLEAR_CURRENT_WIDGET_GROUP(rag_vehgen_garage_scene.hWidget)
ELIF eVehgen_garage_scene_type = VEHGEN_GARAGE_SCENE_TYPE_enterPed
OR eVehgen_garage_scene_type = VEHGEN_GARAGE_SCENE_TYPE_exitPedOpen
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
ENDIF
SET_ENTITY_COORDS(PLAYER_PED_ID(), scene.mPlacers[ePlacers].vPos)
SET_ENTITY_HEADING(PLAYER_PED_ID(), scene.mPlacers[ePlacers].fRot)
SET_CURRENT_WIDGET_GROUP(wVehicleGenControllerWidget)
wDebugVehGenSceneWidget = START_WIDGET_GROUP("wDebugVehGenSceneWidget")
ADD_WIDGET_BOOL("bEditScene", bEditScene)
ADD_WIDGET_FLOAT_SLIDER("fSynchScenePhase", fSynchScenePhase, 0.0, 1.0, 0.01)
STOP_WIDGET_GROUP()
CLEAR_CURRENT_WIDGET_GROUP(wVehicleGenControllerWidget)
ELSE
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
ENDIF
SET_ENTITY_COORDS(PLAYER_PED_ID(), scene.mPlacers[ePlacers].vPos)
SET_ENTITY_HEADING(PLAYER_PED_ID(), scene.mPlacers[ePlacers].fRot)
TASK_GO_STRAIGHT_TO_COORD(PLAYER_PED_ID(), scene.mMarkers[eMarker].vPos, PEDMOVE_WALK)
SET_CURRENT_WIDGET_GROUP(wVehicleGenControllerWidget)
wDebugVehGenSceneWidget = START_WIDGET_GROUP("wDebugVehGenSceneWidget")
ADD_WIDGET_BOOL("bEditScene", bEditScene)
// ADD_WIDGET_FLOAT_SLIDER("fSynchScenePhase", fSynchScenePhase, 0.0, 1.0, 0.01)
STOP_WIDGET_GROUP()
CLEAR_CURRENT_WIDGET_GROUP(wVehicleGenControllerWidget)
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
SceneTool_ExecutePan(scene.mPans[ePan], camCutscene, camCutscene2)
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
SETTIMERA(0)
WHILE (TIMERA() <= ((scene.mPans[ePan].fDuration*1000)))
OR bEditScene
FLOAT fStrOffset = 0
TEXT_LABEL_63 str
IF NOT bEditScene
str = "Cam Timer: "
str += TIMERA()
str += " > "
str += ROUND(scene.mPans[ePan].fDuration*1000)
ELSE
SETTIMERA(0)
str = "fSynchScenePhase: "
str += GET_STRING_FROM_FLOAT(fSynchScenePhase)
ENDIF
SET_TEXT_COLOUR(255, 100, 255, 255)
SET_TEXT_SCALE(0.7, 0.8)
SET_TEXT_WRAP(0.0, 1.0)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.6, 0.85, "STRING", str)
IF eVehgen_garage_scene_type = VEHGEN_GARAGE_SCENE_TYPE_enterVeh
OR eVehgen_garage_scene_type = VEHGEN_GARAGE_SCENE_TYPE_exitVeh
structSceneTool_Placer mPlacer
IF ePlacers < VEHGEN_GARAGE_SCENE_PLACER_MAX
mPlacer = scene.mPlacers[ePlacers]
ELSE
mPlacer.vPos = <<0,0,0>>
mPlacer.fRot = 0.0
ENDIF
DO_FAKE_GARAGE_CAR_DRIVE(PLAYER_PED_ID(),
scene.mPoints[ePoint],
scene.mMarkers[eMarker],
(scene.mPans[ePan].fDuration*1000.0) - 0500,
mPlacer, INT_TO_ENUM(CAMERA_GRAPH_TYPE, iGraph),
fStrOffset)
ELIF eVehgen_garage_scene_type = VEHGEN_GARAGE_SCENE_TYPE_enterPed
OR eVehgen_garage_scene_type = VEHGEN_GARAGE_SCENE_TYPE_exitPedOpen
SWITCH GET_RANDOM_INT_IN_RANGE(0, 6)
CASE 0 sOpenGarageAnimClip = "gar_open_1_left" BREAK
CASE 1 sOpenGarageAnimClip = "gar_open_1_right" BREAK
CASE 2 sOpenGarageAnimClip = "gar_open_2_left" BREAK
CASE 3 sOpenGarageAnimClip = "gar_open_2_right" BREAK
CASE 4 sOpenGarageAnimClip = "gar_open_3_left" BREAK
CASE 5 sOpenGarageAnimClip = "gar_open_3_right" BREAK
ENDSWITCH
VECTOR vGarageEntrySynchScenePos21 = scene.mPlacers[ePlacers].vPos
FLOAT fGarageEntrySynchSceneHead21 = scene.mPlacers[ePlacers].fRot
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iGarageEntrySynchSceneID)
REQUEST_ANIM_DICT(sOpenGarageAnimDict)
IF HAS_ANIM_DICT_LOADED(sOpenGarageAnimDict)
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
iGarageEntrySynchSceneID = CREATE_SYNCHRONIZED_SCENE(vGarageEntrySynchScenePos21, <<0,0,fGarageEntrySynchSceneHead21>>)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iGarageEntrySynchSceneID,
sOpenGarageAnimDict, sOpenGarageAnimClip, NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
DEFAULT, //SYNCED_SCENE_PLAYBACK_FLAGS flags = SYNCED_SCENE_NONE,
DEFAULT, //RAGDOLL_BLOCKING_FLAGS ragdollFlags = RBF_NONE,
DEFAULT, //FLOAT moverBlendInDelta = INSTANT_BLEND_IN,
DEFAULT) //IK_CONTROL_FLAGS ikFlags = AIK_NONE)
ENDIF
ELSE
IF bEditScene
SET_SYNCHRONIZED_SCENE_ORIGIN(iGarageEntrySynchSceneID, vGarageEntrySynchScenePos21, <<0,0,fGarageEntrySynchSceneHead21>>)
SET_SYNCHRONIZED_SCENE_PHASE(iGarageEntrySynchSceneID, fSynchScenePhase)
ELSE
fSynchScenePhase = GET_SYNCHRONIZED_SCENE_PHASE(iGarageEntrySynchSceneID)
ENDIF
ENDIF
ENDIF
WAIT(0)
ENDWHILE
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
CLEAR_PED_TASKS(PLAYER_PED_ID())
ENDIF
IF DOES_ENTITY_EXIST(vehFakeGarageEnter)
SET_ENTITY_COLLISION(vehFakeGarageEnter, TRUE)
FREEZE_ENTITY_POSITION(vehFakeGarageEnter, FALSE)
vehFakeGarageEnter = NULL
ENDIF
IF DOES_ENTITY_EXIST(garageObj)
DELETE_OBJECT(garageObj)
ENDIF
RENDER_SCRIPT_CAMS(FALSE,FALSE)
IF DOES_CAM_EXIST(camCutscene)
SET_CAM_ACTIVE(camCutscene, FALSE)
DESTROY_CAM(camCutscene)
ENDIF
IF DOES_CAM_EXIST(camCutscene2)
SET_CAM_ACTIVE(camCutscene2, FALSE)
DESTROY_CAM(camCutscene2)
ENDIF
IF DOES_WIDGET_GROUP_EXIST(wDebugVehGenSceneWidget)
DELETE_WIDGET_GROUP(wDebugVehGenSceneWidget)
ENDIF
RETURN TRUE
ENDFUNC
PROC SETUP_VEHICLE_CONTROL_WIDGETS()
wVehicleGenControllerWidget = START_WIDGET_GROUP("Vehicle Gen Controller")
START_WIDGET_GROUP("CGtoNG")
ADD_WIDGET_BOOL("CGtoNG Player Debug", g_bLastGenPlayer)
ADD_WIDGET_BOOL("Stalion Unlocked", g_savedGlobals.sCountryRaceData.bStallionUnlocked)
ADD_WIDGET_BOOL("Gauntlet Unlocked", g_savedGlobals.sCountryRaceData.bGauntletUnlocked)
ADD_WIDGET_BOOL("Dominator Unlocked", g_savedGlobals.sCountryRaceData.bDominatorUnlocked)
ADD_WIDGET_BOOL("Buffalo Unlocked", g_savedGlobals.sCountryRaceData.bBuffaloUnlocked)
ADD_WIDGET_BOOL("Marshall Unlocked", g_savedGlobals.sCountryRaceData.bMarshallUnlocked)
STOP_WIDGET_GROUP()
ADD_WIDGET_BOOL("Always display impound help", g_bAlwaysDisplayImpoundHelp)
ADD_WIDGET_BOOL("Set mission vehgen", bSetMissionVehGenDebug)
ADD_WIDGET_BOOL("Set mission vehgen with coords", bSetMissionVehGenDebug2)
ADD_WIDGET_BOOL("Check nearby vehicles", g_sVehicleGenNSData.bCheckVehGensLoaded)
ADD_WIDGET_BOOL("Track current vehicle for impound", bTrackImpoundVehDebug)
ADD_WIDGET_BOOL("Create impound vehicle", bCreateImpoundVehDebug)
ADD_WIDGET_BOOL("Clear impound vehicle", bClearImpoundVehDebug)
ADD_WIDGET_BOOL("Output impound info", bOutputImpoundVehDebug)
ADD_WIDGET_BOOL("Output special vehicle info", bOutputSpecialVehicleInfo)
ADD_WIDGET_INT_SLIDER("Impound char slot (0 = Michael, 1 = Franklin, 2 = Trevor", iImpoundVehSlotChar, 0, 2, 1)
ADD_WIDGET_INT_SLIDER("Impound slot", iImpoundVehSlotDebug, 0, 1, 1)
ADD_WIDGET_INT_READ_ONLY("Purchase control", sGarageData.iPurchaseControl)
ADD_WIDGET_BOOL("bPlayTutorial", bPlayTutorial)
ADD_WIDGET_INT_READ_ONLY("Warp control", sGarageData.iWarpControl)
// ADD_WIDGET_BOOL("Exit garage when sitting in vehicle", bExitGarageWhenSittingInVehicle)
START_SCENETOOL_LAUNCHER("Player garage scene editor", rag_vehgen_garage_scene)
VEHICLE_GEN_NAME_ENUM eName
REPEAT VEHGEN_MISSION_VEH eName
IF eName = VEHGEN_WEB_CAR_MICHAEL
ADD_TO_WIDGET_COMBO("VEHGEN_WEB_CAR_MICHAEL")
ELIF eName = VEHGEN_WEB_CAR_FRANKLIN
ADD_TO_WIDGET_COMBO("VEHGEN_WEB_CAR_FRANKLIN")
ELIF eName = VEHGEN_WEB_CAR_TREVOR
ADD_TO_WIDGET_COMBO("VEHGEN_WEB_CAR_TREVOR")
ELSE
ADD_TO_WIDGET_COMBO("pick a building")
ENDIF
ENDREPEAT
STOP_SCENETOOL_LAUNCHER(rag_vehgen_garage_scene)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL rag_vehgen_garage_scene.iLaunchSceneID = ENUM_TO_INT(VEHGEN_WEB_CAR_MICHAEL) BREAK
CASE CHAR_FRANKLIN rag_vehgen_garage_scene.iLaunchSceneID = ENUM_TO_INT(VEHGEN_WEB_CAR_FRANKLIN) BREAK
CASE CHAR_TREVOR rag_vehgen_garage_scene.iLaunchSceneID = ENUM_TO_INT(VEHGEN_WEB_CAR_TREVOR) BREAK
ENDSWITCH
ADD_WIDGET_BOOL("bFakeGarageReverse", bFakeGarageReverse)
// START_WIDGET_GROUP("FAKE \"Drive into garage\" scene editor")
// ADD_WIDGET_BOOL("Play", bDebugFakeGarageInterp)
// ADD_WIDGET_BOOL("Pause", bDebugFakeGaragePause)
// ADD_WIDGET_BOOL("Loop", bDebugFakeGarageLoop)
// ADD_WIDGET_FLOAT_SLIDER("Phase", fDebugFakeGaragePhase, 0.0, 1.0, 0.1)
// ADD_WIDGET_STRING("")
// START_WIDGET_GROUP("Vehicle")
// ADD_WIDGET_BOOL("Set Start Point (At Car)", bDebugFakeGarageSetCar1)
// ADD_WIDGET_VECTOR_SLIDER("Start Point", vDebugFakeGaragePoint1, -10000.0, 10000.0, 0.01)
// ADD_WIDGET_VECTOR_SLIDER("Start Rotation", vDebugFakeGarageRotation1, -180.0, 180.0, 1.0)
// ADD_WIDGET_STRING("")
// ADD_WIDGET_BOOL("Set End Point (Ahead Of Car)", bDebugFakeGarageSetCar2)
// ADD_WIDGET_VECTOR_SLIDER("End Point", vDebugFakeGaragePoint2, -10000.0, 10000.0, 0.01)
// ADD_WIDGET_VECTOR_SLIDER("End Rotation", vDebugFakeGarageRotation2, -180.0, 180.0, 1.0)
// ADD_WIDGET_STRING("")
// ADD_WIDGET_INT_SLIDER("Duration", iDebugFakeGarageDuration, 0, 60000, 1)
// STOP_WIDGET_GROUP()
// START_WIDGET_GROUP("Camera")
// ADD_WIDGET_BOOL("Enable", bDebugFakeGarageCamEnable)
// ADD_WIDGET_STRING("")
// ADD_WIDGET_BOOL("Grab Start Camera", bDebugFakeGarageCamGrab1)
// ADD_WIDGET_VECTOR_SLIDER("Coordinates", vDebugFakeGarageCamCoord1, -10000.0, 10000.0, 0.01)
// ADD_WIDGET_VECTOR_SLIDER("Rotation", vDebugFakeGarageCamRot1, -180.0, 180.0, 1.0)
// ADD_WIDGET_FLOAT_SLIDER("FOV", fDebugFakeGarageCamFov1, 1.0, 130.0, 0.1)
// ADD_WIDGET_STRING("")
// ADD_WIDGET_BOOL("Grab End Camera", bDebugFakeGarageCamGrab2)
// ADD_WIDGET_VECTOR_SLIDER("Coordinates", vDebugFakeGarageCamCoord2, -10000.0, 10000.0, 0.01)
// ADD_WIDGET_VECTOR_SLIDER("Rotation", vDebugFakeGarageCamRot2, -180.0, 180.0, 1.0)
// ADD_WIDGET_FLOAT_SLIDER("FOV", fDebugFakeGarageCamFov2, 1.0, 130.0, 0.1)
// ADD_WIDGET_BOOL("Flip Rotation (if camera rotates the wrong way around)", bDebugFakeGarageCamRotateFlip)
// ADD_WIDGET_STRING("")
// ADD_WIDGET_INT_SLIDER("Pan Duration", iDebugFakeGarageCamDuration, 0, 60000, 1)
// ADD_WIDGET_FLOAT_SLIDER("Shake", fDebugFakeGarageCamShake, 0.0, 1.0, 0.01)
// START_NEW_WIDGET_COMBO()
// ADD_TO_WIDGET_COMBO("GRAPH_TYPE_LINEAR")
// ADD_TO_WIDGET_COMBO("GRAPH_TYPE_SIN_ACCEL_DECEL")
// ADD_TO_WIDGET_COMBO("GRAPH_TYPE_ACCEL")
// ADD_TO_WIDGET_COMBO("GRAPH_TYPE_DECEL")
// STOP_WIDGET_COMBO("GRAPH_TYPE", camGraphTypeFakeGarage)
// STOP_WIDGET_GROUP()
// ADD_WIDGET_STRING("")
// ADD_WIDGET_BOOL("Debug Lines", bDebugFakeGarageRender)
// ADD_WIDGET_BOOL("Ghost Cars", bDebugFakeGarageGhostCar)
// ADD_WIDGET_BOOL("Release Player Car", bDebugFakeGarageUnfreezeCar)
// ADD_WIDGET_STRING("")
// ADD_WIDGET_BOOL("Output Script", bDebugFakeGarageOutput)
// STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
ENDPROC
PROC MAINTAIN_VEHICLE_CONTROL_WIDGETS()
IF bTrackImpoundVehDebug
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX vehTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(vehTemp)
AND IS_VEHICLE_DRIVEABLE(vehTemp)
TRACK_VEHICLE_FOR_IMPOUND(vehTemp)
ENDIF
ENDIF
bTrackImpoundVehDebug = FALSE
ENDIF
IF bSetMissionVehGenDebug
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX vehTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(vehTemp)
AND IS_VEHICLE_DRIVEABLE(vehTemp)
SET_MISSION_VEHICLE_GEN_VEHICLE(vehTemp, GET_ENTITY_COORDS(vehTemp), GET_ENTITY_HEADING(vehTemp))
ENDIF
ENDIF
bSetMissionVehGenDebug = FALSE
ENDIF
IF bSetMissionVehGenDebug2
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX vehTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(vehTemp)
AND IS_VEHICLE_DRIVEABLE(vehTemp)
SET_MISSION_VEHICLE_GEN_VEHICLE(vehTemp, <<91.9203, -744.7191, 44.7552>>, 210.1958)
ENDIF
ENDIF
bSetMissionVehGenDebug2 = FALSE
ENDIF
IF bCreateImpoundVehDebug
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF NOT IS_VEHICLE_IMPOUND_SLOT_OCCUPIED(iImpoundVehSlotDebug, GET_CURRENT_PLAYER_PED_ENUM())
OR CREATE_IMPOUND_VEHICLE(vehImpound, iImpoundVehSlotDebug, GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_HEADING(PLAYER_PED_ID()), TRUE)
IF DOES_ENTITY_EXIST(vehImpound)
AND IS_VEHICLE_DRIVEABLE(vehImpound)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehImpound)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehImpound)
ENDIF
bCreateImpoundVehDebug = FALSE
ENDIF
ENDIF
ENDIF
IF bClearImpoundVehDebug
CLEAR_VEHICLE_IMPOUND_SLOT(iImpoundVehSlotDebug)
bClearImpoundVehDebug = FALSE
ENDIF
IF bOutputImpoundVehDebug
PRINTLN("IMPOUND VEHICLE INFO")
PRINTLN("...char = ", iImpoundVehSlotChar)
PRINTLN("...slot = ", iImpoundVehSlotDebug)
PRINTLN("...model = ", GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(g_savedGlobals.sVehicleGenData.sImpoundVehicles[iImpoundVehSlotChar][iImpoundVehSlotDebug].eModel))
PRINTLN("...plate = ", g_savedGlobals.sVehicleGenData.sImpoundVehicles[iImpoundVehSlotChar][iImpoundVehSlotDebug].tlPlateText)
bOutputImpoundVehDebug = FALSE
ENDIF
IF bPlayTutorial
sGarageData.iPurchaseControl = 2
iContextCounter = 0
sGarageData.iTimer = GET_GAME_TIMER()
RELEASE_CONTEXT_INTENTION(sGarageData.iContextID)
bDoTutorial = TRUE
bPlayTutorial = FALSE
ENDIF
IF rag_vehgen_garage_scene.bEnableTool
Private_EDIT_VEHGEN_GARAGE_SCENE(rag_vehgen_garage_scene, INT_TO_ENUM(VEHICLE_GEN_NAME_ENUM, rag_vehgen_garage_scene.iLaunchSceneID), &Debug_RUN_VEHGEN_GARAGE_SCENE, iVehgen_garage_scene_type, bSnapMarkerToPoint) //, objFakeGarageDoor)
rag_vehgen_garage_scene.bEnableTool = FALSE
b_DebugGivePlayerAllGarages = FALSE
ENDIF
// //fake garage debug
// IF bDebugFakeGarageInterp
// BOOL bCleanupInterp = FALSE
// IF fDebugFakeGarageStartTime = -1
// fDebugFakeGarageStartTime = TO_FLOAT(GET_GAME_TIMER())
//
// IF bDebugFakeGarageCamEnable
// IF NOT DOES_CAM_EXIST(camFakeGarage)
// camFakeGarage = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vDebugFakeGarageCamCoord1, vDebugFakeGarageCamRot1, fDebugFakeGarageCamFov1)
// //SET_CAM_PARAMS(camFakeGarage, vDebugFakeGarageCamCoord2, vDebugFakeGarageCamRot2, fDebugFakeGarageCamFov2, iDebugFakeGarageCamDuration, INT_TO_ENUM(CAMERA_GRAPH_TYPE, camGraphTypeFakeGarage), INT_TO_ENUM(CAMERA_GRAPH_TYPE, camGraphTypeFakeGarage))
// SHAKE_CAM(camFakeGarage, "HAND_SHAKE", fDebugFakeGarageCamShake)
// SET_CAM_SHAKE_AMPLITUDE(camFakeGarage, fDebugFakeGarageCamShake)
// SET_CAM_ACTIVE(camFakeGarage, TRUE)
// RENDER_SCRIPT_CAMS(TRUE, FALSE)
// ELSE
// SET_CAM_PARAMS(camFakeGarage, vDebugFakeGarageCamCoord1, vDebugFakeGarageCamRot1, fDebugFakeGarageCamFov1)
// //SET_CAM_PARAMS(camFakeGarage, vDebugFakeGarageCamCoord2, vDebugFakeGarageCamRot2, fDebugFakeGarageCamFov2, iDebugFakeGarageCamDuration, INT_TO_ENUM(CAMERA_GRAPH_TYPE, camGraphTypeFakeGarage), INT_TO_ENUM(CAMERA_GRAPH_TYPE, camGraphTypeFakeGarage))
// SHAKE_CAM(camFakeGarage, "HAND_SHAKE", fDebugFakeGarageCamShake)
// SET_CAM_SHAKE_AMPLITUDE(camFakeGarage, fDebugFakeGarageCamShake)
// SET_CAM_ACTIVE(camFakeGarage, TRUE)
// RENDER_SCRIPT_CAMS(TRUE, FALSE)
// ENDIF
// ENDIF
// ELIF TO_FLOAT(GET_GAME_TIMER()) > fDebugFakeGarageStartTime + TO_FLOAT(iDebugFakeGarageDuration)
// AND bDebugFakeGaragePause = FALSE
// AND TO_FLOAT(GET_GAME_TIMER()) > fDebugFakeGarageStartTime + TO_FLOAT(iDebugFakeGarageCamDuration)
// bCleanupInterp = TRUE
// ELSE
// // SET_GLOBAL_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK
// // SET_ADDITIONAL_ROTATION_FOR_RECORDED_VEHICLE_PLAYBACK
// IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
// VEHICLE_INDEX vehIndex = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
// IF NOT IS_ENTITY_DEAD(vehIndex)
// SET_ENTITY_COORDS_NO_OFFSET(vehIndex, GET_INTERP_POINT_VECTOR(vDebugFakeGaragePoint1, vDebugFakeGaragePoint2, fDebugFakeGarageStartTime, fDebugFakeGarageStartTime + TO_FLOAT(iDebugFakeGarageDuration), CLAMP(TO_FLOAT(GET_GAME_TIMER()), fDebugFakeGarageStartTime, fDebugFakeGarageStartTime + TO_FLOAT(iDebugFakeGarageDuration))))
// SET_ENTITY_ROTATION(vehIndex, GET_INTERP_POINT_VECTOR(vDebugFakeGarageRotation1, vDebugFakeGarageRotation2, fDebugFakeGarageStartTime, fDebugFakeGarageStartTime + TO_FLOAT(iDebugFakeGarageDuration), CLAMP(TO_FLOAT(GET_GAME_TIMER()), fDebugFakeGarageStartTime, fDebugFakeGarageStartTime + TO_FLOAT(iDebugFakeGarageDuration))))
// SET_ENTITY_COLLISION(vehIndex, FALSE)
// FREEZE_ENTITY_POSITION(vehIndex, TRUE)
// SET_VEHICLE_ENGINE_ON(vehIndex, TRUE, TRUE)
// PRINTLN("VEH_GEN_CONTROLLER: Setting car position in debug")
//
// IF DOES_CAM_EXIST(camFakeGarage)
// FLOAT fPhase
//
// IF INT_TO_ENUM(CAMERA_GRAPH_TYPE, camGraphTypeFakeGarage) = GRAPH_TYPE_LINEAR
// fPhase = (1.0 / TO_FLOAT(iDebugFakeGarageCamDuration)) * CLAMP(TO_FLOAT(GET_GAME_TIMER()) - fDebugFakeGarageStartTime, 0.0, TO_FLOAT(iDebugFakeGarageCamDuration))
// ELIF INT_TO_ENUM(CAMERA_GRAPH_TYPE, camGraphTypeFakeGarage) = GRAPH_TYPE_SIN_ACCEL_DECEL
// fPhase = GET_GRAPH_TYPE_SIN_ACCEL_DECEL(fDebugFakeGaragePhase)
// ELIF INT_TO_ENUM(CAMERA_GRAPH_TYPE, camGraphTypeFakeGarage) = GRAPH_TYPE_ACCEL
// fPhase = GET_GRAPH_TYPE_ACCEL(fDebugFakeGaragePhase)
// ELIF INT_TO_ENUM(CAMERA_GRAPH_TYPE, camGraphTypeFakeGarage) = GRAPH_TYPE_DECEL
// fPhase = GET_GRAPH_TYPE_DECEL(fDebugFakeGaragePhase)
// ENDIF
//
// SET_CAM_ACTIVE(camFakeGarage, TRUE)
// SET_CAM_PARAMS(camFakeGarage,
// GET_INTERP_POINT_VECTOR(vDebugFakeGarageCamCoord1, vDebugFakeGarageCamCoord2, 0.0, 1.0, fPhase),
// GET_INTERP_POINT_VECTOR(vDebugFakeGarageCamRot1, vDebugFakeGarageCamRot2, 0.0, 1.0, fPhase),
// GET_INTERP_POINT_FLOAT(fDebugFakeGarageCamFov1, fDebugFakeGarageCamFov2, 0.0, 1.0, fPhase))
// ENDIF
// ELSE
// bCleanupInterp = TRUE
// ENDIF
// ELSE
// bCleanupInterp = TRUE
// ENDIF
// ENDIF
// IF bCleanupInterp
// fDebugFakeGarageStartTime = -1
// bDebugFakeGarageInterp = FALSE
// ENDIF
// ENDIF
// IF bDebugFakeGaragePause
// fDebugFakeGarageStartTime = TO_FLOAT(GET_GAME_TIMER()) - fDebugFakeGaragePauseTime
// IF fDebugFakeGaragePauseTime <> (TO_FLOAT(iDebugFakeGarageDuration) * fDebugFakeGaragePhase)
// IF iDebugFakeGarageDuration >= iDebugFakeGarageCamDuration
// fDebugFakeGaragePauseTime = (TO_FLOAT(iDebugFakeGarageDuration) * fDebugFakeGaragePhase)
// ELSE
// fDebugFakeGaragePauseTime = (TO_FLOAT(iDebugFakeGarageCamDuration) * fDebugFakeGaragePhase)
// ENDIF
// ENDIF
// ELSE
// IF iDebugFakeGarageDuration >= iDebugFakeGarageCamDuration
// fDebugFakeGaragePhase = (1.0 / TO_FLOAT(iDebugFakeGarageDuration)) * CLAMP(TO_FLOAT(GET_GAME_TIMER()) - fDebugFakeGarageStartTime, 0.0, TO_FLOAT(iDebugFakeGarageDuration))
// ELSE
// fDebugFakeGaragePhase = (1.0 / TO_FLOAT(iDebugFakeGarageCamDuration)) * CLAMP(TO_FLOAT(GET_GAME_TIMER()) - fDebugFakeGarageStartTime, 0.0, TO_FLOAT(iDebugFakeGarageCamDuration))
// ENDIF
// IF GET_GAME_TIMER() < fDebugFakeGarageStartTime + TO_FLOAT(iDebugFakeGarageDuration)
// IF iDebugFakeGarageDuration >= iDebugFakeGarageCamDuration
// fDebugFakeGaragePauseTime = (TO_FLOAT(iDebugFakeGarageDuration) * fDebugFakeGaragePhase)
// ELSE
// fDebugFakeGaragePauseTime = (TO_FLOAT(iDebugFakeGarageCamDuration) * fDebugFakeGaragePhase)
// ENDIF
// ENDIF
// ENDIF
// IF bDebugFakeGarageLoop
// IF bDebugFakeGarageInterp = FALSE
// bDebugFakeGarageInterp = TRUE
// ENDIF
// ENDIF
// IF bDebugFakeGarageSetCar1
// IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
// VEHICLE_INDEX vehIndex = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
// IF NOT IS_ENTITY_DEAD(vehIndex)
// vDebugFakeGaragePoint1 = GET_ENTITY_COORDS(vehIndex)
// vDebugFakeGarageRotation1 = GET_ENTITY_ROTATION(vehIndex)
// ENDIF
// ENDIF
//
// bDebugFakeGarageSetCar1 = FALSE
// ENDIF
// IF bDebugFakeGarageSetCar2
// IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
// VEHICLE_INDEX vehIndex = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
// IF NOT IS_ENTITY_DEAD(vehIndex)
// vDebugFakeGaragePoint2 = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehIndex, <<0.0, 10.0, 0.0>>)
// vDebugFakeGarageRotation2 = GET_ENTITY_ROTATION(vehIndex)
// ENDIF
// ENDIF
//
// bDebugFakeGarageSetCar2 = FALSE
// ENDIF
// IF bDebugFakeGarageRender
// SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
//
// DRAW_DEBUG_SPHERE(vDebugFakeGaragePoint1, 0.5)
// DRAW_DEBUG_SPHERE(vDebugFakeGaragePoint2, 0.5)
// DRAW_DEBUG_LINE(vDebugFakeGaragePoint1, vDebugFakeGaragePoint2)
// ENDIF
// IF bDebugFakeGarageGhostCar
// BOOL bCleanupGhostCar = FALSE
// IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
// VEHICLE_INDEX vehIndex = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
// MODEL_NAMES vehModel = GET_ENTITY_MODEL(vehIndex)
// IF NOT IS_ENTITY_DEAD(vehIndex)
// IF NOT DOES_ENTITY_EXIST(vehGhost1)
// OR NOT DOES_ENTITY_EXIST(vehGhost2)
// REQUEST_MODEL(vehModel)
// IF HAS_MODEL_LOADED(vehModel)
// IF NOT DOES_ENTITY_EXIST(vehGhost1)
// vehGhost1 = CREATE_VEHICLE(vehModel, vDebugFakeGaragePoint1, vDebugFakeGarageRotation1.Z)
// FREEZE_ENTITY_POSITION(vehGhost1, TRUE)
// SET_ENTITY_COLLISION(vehGhost1, FALSE)
// SET_ENTITY_INVINCIBLE(vehGhost1, TRUE)
// ENDIF
// IF NOT DOES_ENTITY_EXIST(vehGhost2)
// vehGhost2 = CREATE_VEHICLE(vehModel, vDebugFakeGaragePoint2, vDebugFakeGarageRotation2.Z)
// FREEZE_ENTITY_POSITION(vehGhost2, TRUE)
// SET_ENTITY_COLLISION(vehGhost2, FALSE)
// SET_ENTITY_INVINCIBLE(vehGhost2, TRUE)
// ENDIF
// SET_MODEL_AS_NO_LONGER_NEEDED(vehModel)
// ENDIF
// ELSE
// IF GET_ENTITY_MODEL(vehGhost1) = vehModel
// SET_ENTITY_COORDS_NO_OFFSET(vehGhost1, vDebugFakeGaragePoint1)
// SET_ENTITY_ROTATION(vehGhost1, vDebugFakeGarageRotation1)
// ELSE
// bCleanupGhostCar = TRUE
// ENDIF
//
// IF GET_ENTITY_MODEL(vehGhost2) = vehModel
// SET_ENTITY_COORDS_NO_OFFSET(vehGhost2, vDebugFakeGaragePoint2)
// SET_ENTITY_ROTATION(vehGhost2, vDebugFakeGarageRotation2)
// ELSE
// bCleanupGhostCar = TRUE
// ENDIF
// ENDIF
// ENDIF
// ENDIF
// IF bCleanupGhostCar
// IF DOES_ENTITY_EXIST(vehGhost1)
// DELETE_VEHICLE(vehGhost1)
// ENDIF
// IF DOES_ENTITY_EXIST(vehGhost2)
// DELETE_VEHICLE(vehGhost2)
// ENDIF
// ENDIF
// ELSE
// IF DOES_ENTITY_EXIST(vehGhost1)
// DELETE_VEHICLE(vehGhost1)
// ENDIF
// IF DOES_ENTITY_EXIST(vehGhost2)
// DELETE_VEHICLE(vehGhost2)
// ENDIF
// ENDIF
// IF bDebugFakeGarageOutput
// SAVE_NEWLINE_TO_DEBUG_FILE()
// SAVE_NEWLINE_TO_DEBUG_FILE()
// SAVE_STRING_TO_DEBUG_FILE("--- VEH GEN CONTROLLER ---")
// SAVE_NEWLINE_TO_DEBUG_FILE()
// SAVE_NEWLINE_TO_DEBUG_FILE()
// SAVE_STRING_TO_DEBUG_FILE("vStartPoint = ")SAVE_VECTOR_TO_DEBUG_FILE(vDebugFakeGaragePoint1)SAVE_NEWLINE_TO_DEBUG_FILE()
// SAVE_STRING_TO_DEBUG_FILE("vStartRotation = ")SAVE_VECTOR_TO_DEBUG_FILE(vDebugFakeGarageRotation1)SAVE_NEWLINE_TO_DEBUG_FILE()
// SAVE_STRING_TO_DEBUG_FILE("vEndPoint = ")SAVE_VECTOR_TO_DEBUG_FILE(vDebugFakeGaragePoint2)SAVE_NEWLINE_TO_DEBUG_FILE()
// SAVE_STRING_TO_DEBUG_FILE("vEndRotation = ")SAVE_VECTOR_TO_DEBUG_FILE(vDebugFakeGarageRotation2)SAVE_NEWLINE_TO_DEBUG_FILE()
// SAVE_STRING_TO_DEBUG_FILE("fDuration = ")SAVE_INT_TO_DEBUG_FILE(iDebugFakeGarageDuration)SAVE_NEWLINE_TO_DEBUG_FILE()
//
// IF bDebugFakeGarageCamEnable
// SAVE_NEWLINE_TO_DEBUG_FILE()
// SAVE_STRING_TO_DEBUG_FILE("fakeGarageDriveData.vCamCoord1 = ")SAVE_VECTOR_TO_DEBUG_FILE(vDebugFakeGarageCamCoord1)SAVE_NEWLINE_TO_DEBUG_FILE()
// SAVE_STRING_TO_DEBUG_FILE("fakeGarageDriveData.vCamRot1 = ")SAVE_VECTOR_TO_DEBUG_FILE(vDebugFakeGarageCamRot1)SAVE_NEWLINE_TO_DEBUG_FILE()
// SAVE_STRING_TO_DEBUG_FILE("fakeGarageDriveData.fCamFov1 = ")SAVE_FLOAT_TO_DEBUG_FILE(fDebugFakeGarageCamFov1)SAVE_NEWLINE_TO_DEBUG_FILE()
// SAVE_STRING_TO_DEBUG_FILE("fakeGarageDriveData.vCamCoord2 = ")SAVE_VECTOR_TO_DEBUG_FILE(vDebugFakeGarageCamCoord2)SAVE_NEWLINE_TO_DEBUG_FILE()
// SAVE_STRING_TO_DEBUG_FILE("fakeGarageDriveData.vCamRot2 = ")SAVE_VECTOR_TO_DEBUG_FILE(vDebugFakeGarageCamRot2)SAVE_NEWLINE_TO_DEBUG_FILE()
// SAVE_STRING_TO_DEBUG_FILE("fakeGarageDriveData.fCamFov2 = ")SAVE_FLOAT_TO_DEBUG_FILE(fDebugFakeGarageCamFov2)SAVE_NEWLINE_TO_DEBUG_FILE()
// SAVE_STRING_TO_DEBUG_FILE("fDuration = ")SAVE_INT_TO_DEBUG_FILE(iDebugFakeGarageCamDuration)SAVE_NEWLINE_TO_DEBUG_FILE()
// SAVE_STRING_TO_DEBUG_FILE("fakeGarageDriveData.fCamShake = ")SAVE_FLOAT_TO_DEBUG_FILE(fDebugFakeGarageCamShake)SAVE_NEWLINE_TO_DEBUG_FILE()
//
// IF INT_TO_ENUM(CAMERA_GRAPH_TYPE, camGraphTypeFakeGarage) = GRAPH_TYPE_LINEAR
// SAVE_STRING_TO_DEBUG_FILE("camGraphType = GRAPH_TYPE_LINEAR")
// ELIF INT_TO_ENUM(CAMERA_GRAPH_TYPE, camGraphTypeFakeGarage) = GRAPH_TYPE_SIN_ACCEL_DECEL
// SAVE_STRING_TO_DEBUG_FILE("camGraphType = GRAPH_TYPE_SIN_ACCEL_DECEL")
// ELIF INT_TO_ENUM(CAMERA_GRAPH_TYPE, camGraphTypeFakeGarage) = GRAPH_TYPE_ACCEL
// SAVE_STRING_TO_DEBUG_FILE("camGraphType = GRAPH_TYPE_ACCEL")
// ELIF INT_TO_ENUM(CAMERA_GRAPH_TYPE, camGraphTypeFakeGarage) = GRAPH_TYPE_DECEL
// SAVE_STRING_TO_DEBUG_FILE("camGraphType = GRAPH_TYPE_DECEL")
// ENDIF
// SAVE_NEWLINE_TO_DEBUG_FILE()
// ENDIF
// SAVE_NEWLINE_TO_DEBUG_FILE()
// SAVE_STRING_TO_DEBUG_FILE("-----------------------------")
// SAVE_NEWLINE_TO_DEBUG_FILE()
// SAVE_NEWLINE_TO_DEBUG_FILE()
//
// bDebugFakeGarageOutput = FALSE
// ENDIF
// IF bDebugFakeGarageCamGrab1
// vDebugFakeGarageCamCoord1 = GET_FINAL_RENDERED_CAM_COORD()
// vDebugFakeGarageCamRot1 = GET_FINAL_RENDERED_CAM_ROT()
// fDebugFakeGarageCamFov1 = GET_FINAL_RENDERED_CAM_FOV()
//
// bDebugFakeGarageCamGrab1 = FALSE
// ENDIF
// IF bDebugFakeGarageCamGrab2
// vDebugFakeGarageCamCoord2 = GET_FINAL_RENDERED_CAM_COORD()
// vDebugFakeGarageCamRot2 = GET_FINAL_RENDERED_CAM_ROT()
// fDebugFakeGarageCamFov2 = GET_FINAL_RENDERED_CAM_FOV()
//
// bDebugFakeGarageCamGrab2 = FALSE
// ENDIF
// IF bDebugFakeGarageCamRotateFlip
// IF vDebugFakeGarageCamRot2.Z < vDebugFakeGarageCamRot1.Z
// vDebugFakeGarageCamRot2.Z += 360.0
// ELSE
// vDebugFakeGarageCamRot2.Z -= 360.0
// ENDIF
//
// bDebugFakeGarageCamRotateFlip = FALSE
// ENDIF
// IF bDebugFakeGarageUnfreezeCar
// IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
// VEHICLE_INDEX vehIndex = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
// IF NOT IS_ENTITY_DEAD(vehIndex)
// SET_ENTITY_COORDS_NO_OFFSET(vehIndex, vDebugFakeGaragePoint1)
// SET_ENTITY_ROTATION(vehIndex, vDebugFakeGarageRotation1)
// SET_ENTITY_COLLISION(vehIndex, TRUE)
// FREEZE_ENTITY_POSITION(vehIndex, FALSE)
// SET_VEHICLE_ON_GROUND_PROPERLY(vehIndex)
// ENDIF
// ENDIF
//
// IF DOES_CAM_EXIST(camFakeGarage)
// SET_CAM_ACTIVE(camFakeGarage, FALSE)
// STOP_CAM_SHAKING(camFakeGarage, TRUE)
// RENDER_SCRIPT_CAMS(FALSE, FALSE)
// DESTROY_CAM(camFakeGarage)
// ENDIF
//
// bDebugFakeGarageUnfreezeCar = FALSE
// ENDIF
// IF NOT bDebugFakeGarageCamEnable
// IF DOES_CAM_EXIST(camFakeGarage)
// SET_CAM_ACTIVE(camFakeGarage, FALSE)
// STOP_CAM_SHAKING(camFakeGarage, TRUE)
// RENDER_SCRIPT_CAMS(FALSE, FALSE)
// DESTROY_CAM(camFakeGarage)
// ENDIF
// ENDIF
IF NOT b_DebugGivePlayerAllGarages
IF GET_COMMANDLINE_PARAM_EXISTS("sc_DebugGivePlayerAllGarages")
SAVE_STRING_TO_DEBUG_FILE("b_DebugGivePlayerAllGarages\n")
VEHICLE_GEN_NAME_ENUM eVehGen
REPEAT VEHGEN_TREV1_SMASHED_TRAILER eVehGen
SET_VEHICLE_GEN_AVAILABLE(eVehGen, TRUE)
SET_VEHICLE_GEN_SAVED_FLAG_STATE(eVehGen, VEHGEN_S_FLAG_ACQUIRED, TRUE)
IF DOES_BLIP_EXIST(g_sVehicleGenNSData.blipID[eVehGen])
REMOVE_BLIP(g_sVehicleGenNSData.blipID[eVehGen])
ENDIF
ENDREPEAT
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
SAVE_NEWLINE_TO_DEBUG_FILE()
g_bLastGenPlayer = TRUE
g_savedGlobals.sCountryRaceData.bStallionUnlocked = TRUE
g_savedGlobals.sCountryRaceData.bGauntletUnlocked = TRUE
g_savedGlobals.sCountryRaceData.bDominatorUnlocked = TRUE
g_savedGlobals.sCountryRaceData.bBuffaloUnlocked = TRUE
b_DebugGivePlayerAllGarages = TRUE
ENDIF
ENDIF
ENDPROC
/*
BOOL bHandOverToMissionVehGen
BOOL bWarp[NUMBER_OF_VEHICLES_TO_GEN]
BOOL bDelete[NUMBER_OF_VEHICLES_TO_GEN]
BOOL bMakeAvailable[NUMBER_OF_VEHICLES_TO_GEN]
BOOL bMakeUnavailable[NUMBER_OF_VEHICLES_TO_GEN]
VEHICLE_GEN_DATA_STRUCT sTempDataForWidget
PROC SETUP_VEHICLE_CONTROL_WIDGETS()
START_WIDGET_GROUP("Vehicle Gen Controller")
ADD_WIDGET_BOOL("Blocked on mission", g_sVehicleGenNSData.bDisabledForMissions)
ADD_WIDGET_BOOL("Handover to mision veh gen", bHandOverToMissionVehGen)
INT i
REPEAT NUMBER_OF_VEHICLES_TO_GEN i
IF GET_VEHICLE_GEN_DATA(sTempDataForWidget, INT_TO_ENUM(VEHICLE_GEN_NAME_ENUM, i))
ADD_BIT_FIELD_WIDGET(sTempDataForWidget.dbg_name, g_savedGlobals.sVehicleGenData.iProperties[i])
ADD_WIDGET_BOOL("Warp", bWarp[i])
ADD_WIDGET_BOOL("Delete", bDelete[i])
ADD_WIDGET_BOOL("Make Available", bMakeAvailable[i])
ADD_WIDGET_BOOL("Make Unavailable", bMakeUnavailable[i])
ADD_WIDGET_BOOL("Leave area before creating", g_sVehicleGenNSData.bLeaveAreaBeforeCreating[i])
ENDIF
ENDREPEAT
STOP_WIDGET_GROUP()
ENDPROC
PROC MAINTAIN_VEHICLE_CONTROL_WIDGETS()
INT i
REPEAT NUMBER_OF_VEHICLES_TO_GEN i
IF bWarp[i]
IF GET_VEHICLE_GEN_DATA(sTempDataForWidget, INT_TO_ENUM(VEHICLE_GEN_NAME_ENUM, i))
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), sTempDataForWidget.coords-<<0.0, 3.0, 0.0>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 0.0)
WAIT(0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
ENDIF
ENDIF
bWarp[i] = FALSE
ENDIF
IF bDelete[i]
DELETE_VEHICLE_GEN_VEHICLE(INT_TO_ENUM(VEHICLE_GEN_NAME_ENUM, i))
bDelete[i] = FALSE
ENDIF
IF bMakeAvailable[i]
SET_VEHICLE_GEN_AVAILABLE(INT_TO_ENUM(VEHICLE_GEN_NAME_ENUM, i), TRUE)
bMakeAvailable[i] = FALSE
ENDIF
IF bMakeUnavailable[i]
SET_VEHICLE_GEN_AVAILABLE(INT_TO_ENUM(VEHICLE_GEN_NAME_ENUM, i), FALSE)
bMakeUnavailable[i] = FALSE
ENDIF
ENDREPEAT
/*IF bUpdateDynamicVeh
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX tempVeh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(tempVeh)
AND IS_VEHICLE_DRIVEABLE(tempVeh)
VEHICLE_SETUP_STRUCT sTempVehStruct
GET_VEHICLE_SETUP(tempVeh, sTempVehStruct)
UPDATE_DYNAMIC_VEHICLE_GEN_DATA(VEHGEN_DYNAMIC_TEST, sTempVehStruct, GET_ENTITY_COORDS(tempVeh), GET_ENTITY_HEADING(tempVeh))
SET_VEHICLE_GEN_VEHICLE(VEHGEN_DYNAMIC_TEST, tempVeh)
ENDIF
ENDIF
bUpdateDynamicVeh = FALSE
ENDIF*/
/*IF bHandOverToMissionVehGen
SET_MISSION_VEHICLE_GEN_VEHICLE(GET_PLAYERS_LAST_VEHICLE(), <<0.0,0.0,0.0>>, 0.0)
bHandOverToMissionVehGen = FALSE
ENDIF
ENDPROC*/
#ENDIF
/// PURPOSE: Prints out debug text with vehicle gen prefix.
PROC PRINT_VEHGEN_DBG(STRING sDebugString)
IF NOT Is_String_Null_Or_Empty(sDebugString)
#IF IS_DEBUG_BUILD
PRINTSTRING("\n[")PRINTSTRING(sData.dbg_name)PRINTSTRING("] ")PRINTSTRING(sDebugString)PRINTNL()
#ENDIF
ENDIF
ENDPROC
/// PURPOSE: Prints out debug text with vehicle gen prefix.
PROC PRINT_VEHGEN_DBG_WITH_FLOAT(STRING sDebugString, FLOAT f)
IF NOT Is_String_Null_Or_Empty(sDebugString)
// just to stop it crying during a release build
IF (f <> 0.0)
ENDIF
#IF IS_DEBUG_BUILD
PRINTSTRING("\n[")PRINTSTRING(sData.dbg_name)PRINTSTRING("] ")PRINTSTRING(sDebugString)PRINTSTRING(" ")PRINTFLOAT(f)PRINTNL()
#ENDIF
ENDIF
ENDPROC
/// PURPOSE: Prints out debug text with vehicle gen prefix.
PROC PRINT_VEHGEN_DBG_WITH_INT(STRING sDebugString, INT i)
IF NOT Is_String_Null_Or_Empty(sDebugString)
// just to stop it crying during a release build
IF (i <> 0)
ENDIF
#IF IS_DEBUG_BUILD
PRINTSTRING("\n[")PRINTSTRING(sData.dbg_name)PRINTSTRING("] ")PRINTSTRING(sDebugString)PRINTSTRING(" ")PRINTINT(i)PRINTNL()
#ENDIF
ENDIF
ENDPROC
/// PURPOSE: Prints out debug text with vehicle gen prefix.
PROC PRINT_VEHGEN_DBG_WITH_VECTOR(STRING sDebugString, VECTOR v)
IF NOT Is_String_Null_Or_Empty(sDebugString)
// just to stop it crying during a release build
IF (v.x <> 0.0)
ENDIF
#IF IS_DEBUG_BUILD
PRINTSTRING("\n[")PRINTSTRING(sData.dbg_name)PRINTSTRING("] ")PRINTSTRING(sDebugString)PRINTSTRING(" ")PRINTVECTOR(v)PRINTNL()
#ENDIF
ENDIF
ENDPROC
/// PURPOSE: Determines if the controller is allowed to run
FUNC BOOL IS_CONTROLLER_SAFE_TO_RUN()
// Debug flag not set
#IF IS_DEBUG_BUILD
IF NOT g_savedGlobals.sFlow.isGameflowActive
AND NOT g_bVehicleGenAvailableInDebug
AND NOT IS_REPEAT_PLAY_ACTIVE()
RETURN FALSE
ENDIF
#ENDIF
// No issues found so assume it is safe to run
RETURN TRUE
ENDFUNC
/// PURPOSE: Marks the vehicle model as no longer needed if it is has been requested
/// NOTE: The sData struct must be set using GET_VEHICLE_GEN_DATA(...) before this function is called.
PROC CLEANUP_VEHICLE_MODEL(VEHICLE_GEN_NAME_ENUM eName)
IF eVehicleModel[eName] <> DUMMY_MODEL_FOR_SCRIPT
SET_MODEL_AS_NO_LONGER_NEEDED(eVehicleModel[eName])
eVehicleModel[eName] = DUMMY_MODEL_FOR_SCRIPT
ENDIF
ENDPROC
/// PURPOSE: Marks the vehicle model as no longer needed if it is has been requested
/// NOTE: The sData struct must be set using GET_VEHICLE_GEN_DATA(...) before this function is called.
PROC CLEANUP_ONE_TIME_VEH_GEN(VEHICLE_GEN_NAME_ENUM eName)
// Mark as unavailable
IF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_ONLY_AVAILABLE_ONCE))
SET_VEHICLE_GEN_AVAILABLE(eName, FALSE)
ENDIF
ENDPROC
/// PURPOSE: Apply damages to a vehicle when we create it
PROC APPLY_CUSTOM_VEHICLE_DAMAGE(VEHICLE_INDEX vehID, VEHICLE_GEN_NAME_ENUM eName)
IF DOES_ENTITY_EXIST(vehID)
AND IS_VEHICLE_DRIVEABLE(vehID)
SWITCH eName
CASE VEHGEN_BJXL_CRASH_POST_ARM3
SET_VEHICLE_DAMAGE(vehID, <<-0.84, 2.21, 0.22>>, 100.0, 400.0, TRUE)
SET_VEHICLE_DAMAGE(vehID, <<0.67, 2.12, -0.06>>, 100.0, 400.0, TRUE)
SET_VEHICLE_DAMAGE(vehID, <<0.05, 1.97, 0.2>>, 100.0, 400.0, TRUE)
BREAK
case VEHGEN_TREV1_SMASHED_TRAILER
SET_VEHICLE_EXTRA(vehID,6,FALSE)
SET_VEHICLE_EXTRA(vehID,1,TRUE)
break
ENDSWITCH
ENDIF
ENDPROC
FUNC INT GET_NUMBER_OF_SPECIAL_VEHICLES()
INT iTotalVehicles = 0
// INT iVeh
// scrShopVehicleData vehicleData
// ///////////////////////////////////////
// /// COLLECTORS EDITION
// IF IS_COLLECTORS_EDITION_GAME()
// IF NOT NETWORK_IS_GAME_IN_PROGRESS()
// iTotalVehicles++//HOTKNIFE
// iTotalVehicles++//CARBONRS
// ENDIF
// IF NETWORK_IS_GAME_IN_PROGRESS()
// iTotalVehicles++//KHAMELION
// ENDIF
// ENDIF
///////////////////////////////////////
/// SOCIAL CLUB
IF IS_GAME_LINKED_TO_SOCIAL_CLUB(TRUE, TRUE)
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
iTotalVehicles++//ELEGY2
ENDIF
ENDIF
///////////////////////////////////////
/// SPACE DOCKER
IF IS_BIT_SET(g_savedGlobals.sRandomChars.savedRC[ENUM_TO_INT(RC_OMEGA_2)].rcFlags, ENUM_TO_INT(RC_FLAG_COMPLETED))
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
iTotalVehicles++//DUNE2
ENDIF
ENDIF
///////////////////////////////////////
/// CG TO NG
IF IS_LAST_GEN_PLAYER()
AND NOT NETWORK_IS_GAME_IN_PROGRESS()
IF IS_RANDOM_EVENT_COMPLETE(RE_MONKEYPHOTO)
AND NOT IS_TEXT_MESSAGE_REGISTERED(TEXT_MONKEY_CAR_UNLOCK)
iTotalVehicles++//BLISTA3
ENDIF
IF g_savedGlobals.sCountryRaceData.bStallionUnlocked
iTotalVehicles++//STALION2
ENDIF
IF g_savedGlobals.sCountryRaceData.bGauntletUnlocked
iTotalVehicles++//GAUNTLET2
ENDIF
IF g_savedGlobals.sCountryRaceData.bDominatorUnlocked
iTotalVehicles++//DOMINATOR2
ENDIF
IF g_savedGlobals.sCountryRaceData.bBuffaloUnlocked
iTotalVehicles++//BUFFALO3
ENDIF
IF g_savedGlobals.sCountryRaceData.bMarshallUnlocked
iTotalVehicles++//MARSHALL
ENDIF
ENDIF
///////////////////////////////////////
/// DLC
// REPEAT GET_NUM_DLC_VEHICLES() iVeh
// IF GET_DLC_VEHICLE_DATA(iVeh, vehicleData)
// IF NOT IS_CONTENT_ITEM_LOCKED(vehicleData.m_lockHash)
// AND NOT IS_DLC_VEHICLE_LOCKED_BY_SCRIPT(GET_DLC_VEHICLE_MODEL(iVeh))
// IF IS_THIS_MODEL_A_BIKE(GET_DLC_VEHICLE_MODEL(iVeh))
// OR IS_THIS_MODEL_A_CAR(GET_DLC_VEHICLE_MODEL(iVeh))
// // These have been added to the websites.
// ELSE
// iTotalVehicles++
// ENDIF
// ENDIF
// ENDIF
// ENDREPEAT
RETURN iTotalVehicles
ENDFUNC
FUNC MODEL_NAMES GET_SPECIAL_VEHICLE_MODEL(INT iSlot)
INT iModel//, iVeh
MODEL_NAMES eVehModels[128] //[10]
// scrShopVehicleData vehicleData
// ///////////////////////////////////////
// /// COLLECTORS EDITION
// IF IS_COLLECTORS_EDITION_GAME()
// IF NOT NETWORK_IS_GAME_IN_PROGRESS()
// IF iModel < COUNT_OF(eVehModels)-1
// eVehModels[iModel] = HOTKNIFE
// iModel++
// ENDIF
//
// IF iModel < COUNT_OF(eVehModels)-1
// eVehModels[iModel] = CARBONRS
// iModel++
// ENDIF
// ENDIF
// IF NETWORK_IS_GAME_IN_PROGRESS()
// IF iModel < COUNT_OF(eVehModels)-1
// eVehModels[iModel] = KHAMELION
// iModel++
// ENDIF
// ENDIF
// ENDIF
///////////////////////////////////////
/// SOCIAL CLUB
IF IS_GAME_LINKED_TO_SOCIAL_CLUB(TRUE, TRUE)
IF iModel < COUNT_OF(eVehModels)-1
eVehModels[iModel] = ELEGY2
iModel++
ENDIF
ENDIF
///////////////////////////////////////
/// SPACE DOCKER
IF IS_BIT_SET(g_savedGlobals.sRandomChars.savedRC[ENUM_TO_INT(RC_OMEGA_2)].rcFlags, ENUM_TO_INT(RC_FLAG_COMPLETED))
IF iModel < COUNT_OF(eVehModels)-1
eVehModels[iModel] = DUNE2
iModel++
ENDIF
ENDIF
///////////////////////////////////////
/// CG TO NG
IF IS_LAST_GEN_PLAYER()
AND NOT NETWORK_IS_GAME_IN_PROGRESS()
IF IS_RANDOM_EVENT_COMPLETE(RE_MONKEYPHOTO)
AND NOT IS_TEXT_MESSAGE_REGISTERED(TEXT_MONKEY_CAR_UNLOCK)
eVehModels[iModel] = BLISTA3
iModel++
ENDIF
IF g_savedGlobals.sCountryRaceData.bStallionUnlocked
eVehModels[iModel] = STALION2
iModel++
ENDIF
IF g_savedGlobals.sCountryRaceData.bGauntletUnlocked
eVehModels[iModel] = GAUNTLET2
iModel++
ENDIF
IF g_savedGlobals.sCountryRaceData.bDominatorUnlocked
eVehModels[iModel] = DOMINATOR2
iModel++
ENDIF
IF g_savedGlobals.sCountryRaceData.bBuffaloUnlocked
eVehModels[iModel] = BUFFALO3
iModel++
ENDIF
IF g_savedGlobals.sCountryRaceData.bMarshallUnlocked
eVehModels[iModel] = MARSHALL
iModel++
ENDIF
ENDIF
// ///////////////////////////////////////
// /// DLC
// REPEAT GET_NUM_DLC_VEHICLES() iVeh
// IF GET_DLC_VEHICLE_DATA(iVeh, vehicleData)
// IF NOT IS_CONTENT_ITEM_LOCKED(vehicleData.m_lockHash)
// AND NOT IS_DLC_VEHICLE_LOCKED_BY_SCRIPT(GET_DLC_VEHICLE_MODEL(iVeh))
// IF iModel < COUNT_OF(eVehModels)-1
// IF IS_THIS_MODEL_A_BIKE(GET_DLC_VEHICLE_MODEL(iVeh))
// OR IS_THIS_MODEL_A_CAR(GET_DLC_VEHICLE_MODEL(iVeh))
// // These have been added to the websites.
// ELSE
// eVehModels[iModel] = GET_DLC_VEHICLE_MODEL(iVeh)
// iModel++
// ENDIF
// ENDIF
// ENDIF
// ENDIF
// ENDREPEAT
IF iSlot >= 0 AND iSlot < iModel
RETURN eVehModels[iSlot]
ENDIF
RETURN DUMMY_MODEL_FOR_SCRIPT
ENDFUNC
FUNC BOOL HAS_SPAWN_VEHICLE_GOT_CUSTOM_SETUP(MODEL_NAMES eModel)
SWITCH eModel
CASE MARSHALL
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_SAME_VEHICLE_MODEL_NEARBY_PLAYER(MODEL_NAMES eModel, INT iLiveryCheck = -1)
VEHICLE_INDEX nearbyVehicles[50]
INT iVeh
INT iVehicleCount = GET_PED_NEARBY_VEHICLES(PLAYER_PED_ID(), nearbyVehicles)
REPEAT iVehicleCount iVeh
IF DOES_ENTITY_EXIST(nearbyVehicles[iVeh])
AND IS_VEHICLE_DRIVEABLE(nearbyVehicles[iVeh])
AND GET_ENTITY_MODEL(nearbyVehicles[iVeh]) = eModel
IF iLiveryCheck = -1 OR GET_VEHICLE_LIVERY(nearbyVehicles[iVeh]) = iLiveryCheck
RETURN TRUE
ENDIF
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
FUNC BOOL IS_SAME_VEHICLE_MODEL_NEARBY_VEHGEN(MODEL_NAMES eModel, INT iLiveryCheck = -1)
INT iFlags = VEHICLE_SEARCH_FLAG_RETURN_MISSION_VEHICLES|VEHICLE_SEARCH_FLAG_RETURN_RANDOM_VEHICLES|VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_CONTAINING_GROUP_MEMBERS|VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_CONTAINING_A_PLAYER|VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_CONTAINING_A_DEAD_OR_DYING_PED|VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_WITH_PEDS_ENTERING_OR_EXITING|VEHICLE_SEARCH_FLAG_ALLOW_VEHICLE_OCCUPANTS_TO_BE_PERFORMING_A_SCRIPTED_TASK
VEHICLE_INDEX nearbyVehicle = GET_CLOSEST_VEHICLE(sData.coords, VEHICLE_GEN_CREATE_RANGE, eModel, iFlags)
IF DOES_ENTITY_EXIST(nearbyVehicle)
AND IS_VEHICLE_DRIVEABLE(nearbyVehicle)
AND GET_ENTITY_MODEL(nearbyVehicle) = eModel
IF iLiveryCheck = -1 OR GET_VEHICLE_LIVERY(nearbyVehicle) = iLiveryCheck
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Don't spawn this specific vehicle gen with model.
FUNC BOOL BLOCK_SPECIFIC_VEHICLE_GEN_CREATION(VEHICLE_GEN_NAME_ENUM eName)
IF eName = VEHGEN_WEB_HELIPAD_TREVOR_COUNTRY
// Don't spawn TPI frogger if one already exists.
IF sData.model = FROGGER2
IF IS_SAME_VEHICLE_MODEL_NEARBY_PLAYER(sData.model, -1)//g_savedGlobals.sVehicleGenData.sDynamicData[sData.dynamicSlotIndex].iLivery)
OR IS_SAME_VEHICLE_MODEL_NEARBY_VEHGEN(sData.model, -1)//g_savedGlobals.sVehicleGenData.sDynamicData[sData.dynamicSlotIndex].iLivery)
OR GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("exile2")) > 0
//B* 1816732: Check if FIB2 mission has been completed
OR NOT GET_MISSION_COMPLETE_STATE(SP_MISSION_FBI_2)
RETURN TRUE
ENDIF
ENDIF
ENDIF
//B* 1892051
IF eName = VEHGEN_MISSION_VEH
IF DOES_ENTITY_EXIST(g_sVehicleGenNSData.vehicleSelectID[VEHGEN_WEB_HELIPAD_TREVOR_COUNTRY])
AND NOT IS_ENTITY_DEAD(g_sVehicleGenNSData.vehicleSelectID[VEHGEN_WEB_HELIPAD_TREVOR_COUNTRY])
AND IS_VEHICLE_DRIVEABLE(g_sVehicleGenNSData.vehicleSelectID[VEHGEN_WEB_HELIPAD_TREVOR_COUNTRY])
IF sData.model = GET_ENTITY_MODEL(g_sVehicleGenNSData.vehicleSelectID[VEHGEN_WEB_HELIPAD_TREVOR_COUNTRY])
INT c1,c2
GET_VEHICLE_COLOURS(g_sVehicleGenNSData.vehicleSelectID[VEHGEN_WEB_HELIPAD_TREVOR_COUNTRY],c1,c2)
IF c1 = sData.colour1 AND c2 = sData.colour2
DELETE_VEHICLE_GEN_VEHICLE(VEHGEN_WEB_HELIPAD_TREVOR_COUNTRY)
ENDIF
ENDIF
ENDIF
ENDIF
// ///////////////////////////////////////
// /// COLLECTORS EDITION
// IF NOT IS_COLLECTORS_EDITION_GAME()
// IF sData.model = HOTKNIFE
// OR sData.model = CARBONRS
// RETURN TRUE
// ENDIF
// ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Checks to see if the player is close to the vehicle !! model must be loaded !!
FUNC BOOL IS_PLAYER_IN_VEHICLE_BOUNDS(MODEL_NAMES eModel, VECTOR vCoords, BOOL bIgnoreForStartup = TRUE)
IF bIgnoreForStartup
AND IS_SCREEN_FADED_OUT()
AND GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("startup_positioning")) > 0
PRINT_VEHGEN_DBG("player is in vehicle bounds - \"startup_positioning\" is running.")
RETURN FALSE
ENDIF
VECTOR vMin, vMax
GET_MODEL_DIMENSIONS(eModel, vMin, vMax)
FLOAT fLength = GET_DISTANCE_BETWEEN_COORDS(vMax, vMin, TRUE)
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vCoords) < (fLength*0.5)
PRINT_VEHGEN_DBG_WITH_FLOAT("player is in vehicle bounds - fLength: ", fLength)
PRINT_VEHGEN_DBG_WITH_FLOAT("player is in vehicle bounds - fDistance: ", GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vCoords))
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC KEEP_DEFAULT_VEHICLE_FLAGS_WITH_SPECIAL_CASE_MODELS(INT bitsetFrom, INT &bitsetTo, MODEL_NAMES model)
INT bsMask = HIGHEST_INT
//B* 2098125: Skip special bits for some vehicles; ADD NEW MODELS HERE
SWITCH model
CASE COQUETTE2
CLEAR_BIT(bsMask,VEHICLE_SETUP_FLAG_EXTRA_0)
CLEAR_BIT(bsMask,VEHICLE_SETUP_FLAG_EXTRA_1)
BREAK
CASE KALAHARI
CLEAR_BIT(bsMask,VEHICLE_SETUP_FLAG_EXTRA_0)
CLEAR_BIT(bsMask,VEHICLE_SETUP_FLAG_EXTRA_1)
CLEAR_BIT(bsMask,VEHICLE_SETUP_FLAG_EXTRA_2)
BREAK
CASE VOLTIC
CLEAR_BIT(bsMask,VEHICLE_SETUP_FLAG_EXTRA_0)
CLEAR_BIT(bsMask,VEHICLE_SETUP_FLAG_EXTRA_1)
CLEAR_BIT(bsMask,VEHICLE_SETUP_FLAG_EXTRA_2)
BREAK
CASE BANSHEE
CLEAR_BIT(bsMask,VEHICLE_SETUP_FLAG_EXTRA_0)
BREAK
CASE STALION
CLEAR_BIT(bsMask,VEHICLE_SETUP_FLAG_EXTRA_0)
CLEAR_BIT(bsMask,VEHICLE_SETUP_FLAG_EXTRA_1)
CLEAR_BIT(bsMask,VEHICLE_SETUP_FLAG_EXTRA_2)
BREAK
CASE CHINO
CLEAR_BIT(bsMask, VEHICLE_SETUP_FLAG_EXTRA_0)
CLEAR_BIT(bsMask, VEHICLE_SETUP_FLAG_EXTRA_1)
CLEAR_BIT(bsMask, VEHICLE_SETUP_FLAG_EXTRA_2)
BREAK
ENDSWITCH
INT bsNotMask = HIGHEST_INT - bsMask
CDEBUG1LN(DEBUG_AMBIENT,"Combining vehicle flags (value)|(mask) ",bitsetFrom,"|",bsMask," with ",bitsetTo,"|",bsNotMask)
//Get the masked bits from both bitsets
bsMask = bsMask & bitsetFrom
bsNotMask = bitsetTo & bsNotMask
//Set the final bit
bitsetTo = bsMask | bsNotMask
CDEBUG1LN(DEBUG_AMBIENT, "Setting vehicle flags for model ",GET_MODEL_NAME_FOR_DEBUG(model)," - old|new ",bsMask,"|",bsNotMasK)
// Old logic:
// REPEAT NUMBER_OF_VEHICLE_EXTRAS iExtra
// IF IS_BIT_SET(bsMask, iExtra)
// IF IS_BIT_SET(bsMask, GET_VEHICLE_EXTRA_FLAG_FOR_EXTRA_INDEX(iExtra+1))
// SET_BIT(bitsetTo, GET_VEHICLE_EXTRA_FLAG_FOR_EXTRA_INDEX(iExtra+1))
// ELSE
// CLEAR_BIT(bitsetTo, GET_VEHICLE_EXTRA_FLAG_FOR_EXTRA_INDEX(iExtra+1))
// ENDIF
// ENDIF
// ENDREPEAT
ENDPROC
/// PURPOSE: Deals with creating/removing a vehicle
/// NOTE: The sData struct must be set using GET_VEHICLE_GEN_DATA(...) before this function is called.
PROC PROCESS_VEHICLE(VEHICLE_GEN_NAME_ENUM eName)
FLOAT cleanupRange = VEHICLE_GEN_CLEANUP_RANGE
FLOAT createRange = VEHICLE_GEN_CREATE_RANGE
// Cleanup the vehicle model if we no longer require it
IF NOT IS_BIT_SET(iVehGenProcessFlags[eName], VEHGEN_BIT_FLAG_VEHICLE_MODEL_REQ)
CLEANUP_VEHICLE_MODEL(eName)
ENDIF
CLEAR_BIT(iVehGenProcessFlags[eName], VEHGEN_BIT_FLAG_VEHICLE_MODEL_REQ)
FLOAT fPlayerHandoverDistance
IF IS_BIT_SET(iVehGenProcessFlags[eName], VEHGEN_BIT_FLAG_VEHICLE_HANDED_OVER)
fPlayerHandoverDistance = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), vVehicleCoordsAtHandOver[eName])
ELSE
fPlayerHandoverDistance = 99999.99
ENDIF
IF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_USE_LONG_RANGE_DIST_CHECKS))
IF sData.model = BLIMP
cleanupRange = VEHICLE_GEN_CLEANUP_RANGE_BLIMP
createRange = VEHICLE_GEN_CREATE_RANGE_BLIMP
ELSE
cleanupRange = VEHICLE_GEN_CLEANUP_RANGE_LONG
createRange = VEHICLE_GEN_CREATE_RANGE_LONG
ENDIF
ELIF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_USE_SHORT_RANGE_DIST_CHECKS))
cleanupRange = VEHICLE_GEN_CLEANUP_RANGE_SHORT
createRange = VEHICLE_GEN_CREATE_RANGE_SHORT
ELIF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_PLAYER_VEH_BIKE))
OR IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_PLAYER_VEH_CAR))
OR eName = VEHGEN_MISSION_VEH
OR eName = VEHGEN_MISSION_VEH_FBI4_PREP
cleanupRange = VEHICLE_GEN_CLEANUP_RANGE_HIGH_PRIORITY
createRange = VEHICLE_GEN_CREATE_RANGE_HIGH_PRIORITY
ELIF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_USE_WORLD_RANGE_DIST_CHECKS))
AND (eCurrentPlayerPed = CHAR_MICHAEL AND sGarageData.eClosestGen = VEHGEN_WEB_CAR_MICHAEL
OR eCurrentPlayerPed = CHAR_MICHAEL AND sGarageData.eClosestGen = VEHGEN_WEB_CAR_FRANKLIN
OR eCurrentPlayerPed = CHAR_MICHAEL AND sGarageData.eClosestGen = VEHGEN_WEB_CAR_TREVOR)
cleanupRange = VEHICLE_GEN_CLEANUP_RANGE_WORLD
createRange = VEHICLE_GEN_CREATE_RANGE_WORLD
ENDIF
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Vehicle cleanup + updates
///
IF DOES_ENTITY_EXIST(g_sVehicleGenNSData.vehicleID[eName])
IF IS_VEHICLE_DRIVEABLE(g_sVehicleGenNSData.vehicleID[eName])
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
// Last player character to use mission vehgen
IF eName = VEHGEN_MISSION_VEH
PED_INDEX piTemp = GET_PED_IN_VEHICLE_SEAT(g_sVehicleGenNSData.vehicleID[eName])
IF NOT DOES_ENTITY_EXIST(piTemp)
piTemp = GET_LAST_PED_IN_VEHICLE_SEAT(g_sVehicleGenNSData.vehicleID[eName])
ENDIF
enumCharacterList eTempPed = GET_PLAYER_PED_ENUM(piTemp)
IF eTempPed != g_savedGlobals.sVehicleGenData.eLastCharToUseMissionVehGen
IF IS_PLAYER_PED_PLAYABLE(eTempPed)
PRINT_VEHGEN_DBG_WITH_INT("Updating last character to use vehicle gen", ENUM_TO_INT(eTempPed))
g_savedGlobals.sVehicleGenData.eLastCharToUseMissionVehGen = eTempPed
ENDIF
ENDIF
ENDIF
// Owned by other script
IF NOT DOES_ENTITY_BELONG_TO_THIS_SCRIPT(g_sVehicleGenNSData.vehicleID[eName])
PRINT_VEHGEN_DBG("No longer needed: Vehicle owned by other script")
IF eName = VEHGEN_MISSION_VEH
AND NOT IS_VEHICLE_IN_TEMP_PLAYER_VEHICLE_ID_LIST(g_sVehicleGenNSData.vehicleID[eName])
AND NOT IS_VEHICLE_IN_TEMP_NPC_VEHICLE_ID_LIST(g_sVehicleGenNSData.vehicleID[eName])
AND GET_ENTITY_MODEL(g_sVehicleGenNSData.vehicleID[eName]) != MONSTER
SET_VEHICLE_CAN_SAVE_IN_GARAGE(g_sVehicleGenNSData.vehicleID[eName], TRUE)
ENDIF
g_sVehicleGenNSData.vehicleID[eName] = NULL
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
CLEANUP_ONE_TIME_VEH_GEN(eName)
EXIT
ENDIF
// Player used vehicle (allow mission vehgens to be used)
IF IS_BIT_SET(iVehGenProcessFlags[eName], VEHGEN_BIT_FLAG_PLAYER_USED_VEHICLE)
AND NOT IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_BLOCK_CLEANUP_ON_ENTRY))
AND eName != VEHGEN_MISSION_VEH AND eName != VEHGEN_MISSION_VEH_FBI4_PREP
PRINT_VEHGEN_DBG("No longer needed: Player used vehicle")
IF eName = VEHGEN_MISSION_VEH
AND NOT IS_VEHICLE_IN_TEMP_PLAYER_VEHICLE_ID_LIST(g_sVehicleGenNSData.vehicleID[eName])
AND NOT IS_VEHICLE_IN_TEMP_NPC_VEHICLE_ID_LIST(g_sVehicleGenNSData.vehicleID[eName])
AND GET_ENTITY_MODEL(g_sVehicleGenNSData.vehicleID[eName]) != MONSTER
SET_VEHICLE_CAN_SAVE_IN_GARAGE(g_sVehicleGenNSData.vehicleID[eName], TRUE)
ENDIF
SET_VEHICLE_AS_NO_LONGER_NEEDED(g_sVehicleGenNSData.vehicleID[eName])
g_sVehicleGenNSData.vehicleID[eName] = NULL
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
CLEANUP_ONE_TIME_VEH_GEN(eName)
EXIT
ENDIF
// Player damaged vehicle (allow mission vehgens to be used)
IF NOT IS_BIT_SET(iVehGenProcessFlags[eName], VEHGEN_BIT_FLAG_VEHICLE_HANDED_OVER)
AND eName != VEHGEN_MISSION_VEH AND eName != VEHGEN_MISSION_VEH_FBI4_PREP
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(g_sVehicleGenNSData.vehicleID[eName], PLAYER_PED_ID())
PRINT_VEHGEN_DBG("No longer needed: Player damaged vehicle")
IF eName = VEHGEN_MISSION_VEH
AND NOT IS_VEHICLE_IN_TEMP_PLAYER_VEHICLE_ID_LIST(g_sVehicleGenNSData.vehicleID[eName])
AND NOT IS_VEHICLE_IN_TEMP_NPC_VEHICLE_ID_LIST(g_sVehicleGenNSData.vehicleID[eName])
AND GET_ENTITY_MODEL(g_sVehicleGenNSData.vehicleID[eName]) != MONSTER
SET_VEHICLE_CAN_SAVE_IN_GARAGE(g_sVehicleGenNSData.vehicleID[eName], TRUE)
ENDIF
SET_VEHICLE_AS_NO_LONGER_NEEDED(g_sVehicleGenNSData.vehicleID[eName])
g_sVehicleGenNSData.vehicleID[eName] = NULL
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
CLEANUP_ONE_TIME_VEH_GEN(eName)
EXIT
ENDIF
ENDIF
// Vehicle has been moved
FLOAT fMoveDistCheck = 8.0
IF eName = VEHGEN_MISSION_VEH
OR eName = VEHGEN_MISSION_VEH_FBI4_PREP
OR eName = VEHGEN_WEB_CAR_MICHAEL
OR eName = VEHGEN_WEB_CAR_FRANKLIN
OR eName = VEHGEN_WEB_CAR_TREVOR
OR eName = VEHGEN_MICHAEL_GARAGE_1
OR eName = VEHGEN_MICHAEL_GARAGE_2
OR eName = VEHGEN_MICHAEL_GARAGE_3
OR eName = VEHGEN_FRANKLIN_GARAGE_1
OR eName = VEHGEN_FRANKLIN_GARAGE_2
OR eName = VEHGEN_FRANKLIN_GARAGE_3
OR eName = VEHGEN_TREVOR_GARAGE_1
OR eName = VEHGEN_TREVOR_GARAGE_2
OR eName = VEHGEN_TREVOR_GARAGE_3
fMoveDistCheck = 20.0
ENDIF
IF (IS_BIT_SET(iVehGenProcessFlags[eName], VEHGEN_BIT_FLAG_VEHICLE_HANDED_OVER) AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(g_sVehicleGenNSData.vehicleID[eName]), vVehicleCoordsAtHandOver[eName]) > fMoveDistCheck)
OR (NOT IS_BIT_SET(iVehGenProcessFlags[eName], VEHGEN_BIT_FLAG_VEHICLE_HANDED_OVER) AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(g_sVehicleGenNSData.vehicleID[eName]), sData.coords) > fMoveDistCheck)
PRINT_VEHGEN_DBG("No longer needed: Vehicle has been moved")
PRINTLN("...", GET_STRING_FROM_VECTOR(GET_ENTITY_COORDS(g_sVehicleGenNSData.vehicleID[eName])))
IF eName = VEHGEN_MISSION_VEH
AND NOT IS_VEHICLE_IN_TEMP_PLAYER_VEHICLE_ID_LIST(g_sVehicleGenNSData.vehicleID[eName])
AND NOT IS_VEHICLE_IN_TEMP_NPC_VEHICLE_ID_LIST(g_sVehicleGenNSData.vehicleID[eName])
AND GET_ENTITY_MODEL(g_sVehicleGenNSData.vehicleID[eName]) != MONSTER
SET_VEHICLE_CAN_SAVE_IN_GARAGE(g_sVehicleGenNSData.vehicleID[eName], TRUE)
ENDIF
SET_VEHICLE_AS_NO_LONGER_NEEDED(g_sVehicleGenNSData.vehicleID[eName])
g_sVehicleGenNSData.vehicleID[eName] = NULL
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
CLEANUP_ONE_TIME_VEH_GEN(eName)
EXIT
ENDIF
// Vehicle gen no longer available
IF NOT GET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_AVAILABLE)
PRINT_VEHGEN_DBG("No longer needed: Vehicle gen no longer available")
IF eName = VEHGEN_MISSION_VEH
AND NOT IS_VEHICLE_IN_TEMP_PLAYER_VEHICLE_ID_LIST(g_sVehicleGenNSData.vehicleID[eName])
AND NOT IS_VEHICLE_IN_TEMP_NPC_VEHICLE_ID_LIST(g_sVehicleGenNSData.vehicleID[eName])
AND GET_ENTITY_MODEL(g_sVehicleGenNSData.vehicleID[eName]) != MONSTER
SET_VEHICLE_CAN_SAVE_IN_GARAGE(g_sVehicleGenNSData.vehicleID[eName], TRUE)
ENDIF
SET_VEHICLE_AS_NO_LONGER_NEEDED(g_sVehicleGenNSData.vehicleID[eName])
g_sVehicleGenNSData.vehicleID[eName] = NULL
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
CLEANUP_ONE_TIME_VEH_GEN(eName)
EXIT
ENDIF
// Mission vehicle gen moved to garage.
IF eName = VEHGEN_MISSION_VEH
IF IS_VEHICLE_IN_PLAYERS_GARAGE(g_sVehicleGenNSData.vehicleID[eName], eCurrentPlayerPed, TRUE)
AND NOT IS_VEHICLE_IN_TEMP_PLAYER_VEHICLE_ID_LIST(g_sVehicleGenNSData.vehicleID[eName])
AND NOT IS_VEHICLE_IN_TEMP_NPC_VEHICLE_ID_LIST(g_sVehicleGenNSData.vehicleID[eName])
PRINT_VEHGEN_DBG("No longer needed: Mission vehicle gen moved to players garage")
IF GET_ENTITY_MODEL(g_sVehicleGenNSData.vehicleID[eName]) != MONSTER
SET_VEHICLE_CAN_SAVE_IN_GARAGE(g_sVehicleGenNSData.vehicleID[eName], TRUE)
ENDIF
g_sVehicleGenNSData.vehicleID[eName] = NULL
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
CLEANUP_ONE_TIME_VEH_GEN(eName)
EXIT
ENDIF
ENDIF
// Player out of range
IF fDistToVehGen[eName] > cleanupRange
AND (NOT IS_BIT_SET(iVehGenProcessFlags[eName], VEHGEN_BIT_FLAG_VEHICLE_HANDED_OVER) OR fPlayerHandoverDistance > cleanupRange)
// [IMPOUND] Send mission vehicle gen to impound if it's not been used
IF eName = VEHGEN_MISSION_VEH
TIMEOFDAY eCurrentTOD = GET_CURRENT_TIMEOFDAY()
TIMEOFDAY eHandOverTOD = g_savedGlobals.sVehicleGenData.eMissionVehTimeStamp
ADD_TIME_TO_TIMEOFDAY(eHandOverTOD, 0, 0, 17)
IF IS_TIMEOFDAY_AFTER_TIMEOFDAY(eCurrentTOD, eHandOverTOD)
IF NOT IS_VEHICLE_IN_TEMP_PLAYER_VEHICLE_ID_LIST(g_sVehicleGenNSData.vehicleID[eName])
AND NOT IS_VEHICLE_IN_TEMP_NPC_VEHICLE_ID_LIST(g_sVehicleGenNSData.vehicleID[eName])
AND GET_ENTITY_MODEL(g_sVehicleGenNSData.vehicleID[eName]) != MONSTER
SET_VEHICLE_CAN_SAVE_IN_GARAGE(g_sVehicleGenNSData.vehicleID[eName], TRUE)
ENDIF
TRACK_VEHICLE_FOR_IMPOUND(g_sVehicleGenNSData.vehicleID[eName], g_savedGlobals.sVehicleGenData.eLastCharToUseMissionVehGen)
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
CLEANUP_ONE_TIME_VEH_GEN(eName)
ELSE
// [IMPOUND FIX 2] Copy the data incase we overwrite it when it's streamed out
IF IS_VEHICLE_SAFE_FOR_IMPOUND(g_sVehicleGenNSData.vehicleID[eName])
PRINTLN("IMPOUND FIX 2 - cache the mission vehgen data as vehicle is streaming out")
GET_VEHICLE_SETUP(g_sVehicleGenNSData.vehicleID[eName], g_sPreviousMissionVehGenData)
g_ePreviousMissionVehGenPed = g_savedGlobals.sVehicleGenData.eLastCharToUseMissionVehGen
vehLastMissionVehGenToStreamOut = g_sVehicleGenNSData.vehicleID[eName]
ENDIF
ENDIF
ENDIF
PRINT_VEHGEN_DBG("No longer needed: Player out for range")
SET_VEHICLE_AS_NO_LONGER_NEEDED(g_sVehicleGenNSData.vehicleID[eName])
CLEAR_AREA(sData.coords, 3.0, FALSE)
CLEAR_AREA_OF_VEHICLES(sData.coords, 3.0)
g_sVehicleGenNSData.vehicleID[eName] = NULL
// [PVB] Player is going out of range so switch over to using the coords
IF (eName = VEHGEN_MICHAEL_SAVEHOUSE AND eCurrentPlayerPed = CHAR_MICHAEL)
OR (eName = VEHGEN_TREVOR_SAVEHOUSE_COUNTRY AND eCurrentPlayerPed = CHAR_TREVOR)
OR (eName = VEHGEN_FRANKLIN_SAVEHOUSE_CAR AND eCurrentPlayerPed = CHAR_FRANKLIN)
g_sVehicleGenNSData.vPlayerVehicleCoords = sData.coords
g_sVehicleGenNSData.vPlayerVehicleCoordsCached = <<0,0,0>>
ENDIF
EXIT
ENDIF
// anchor when no collision
IF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_ANCHOR_WHEN_NO_COLLISION))
IF NOT IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_ANCHORED))
IF NOT HAS_ENTITY_COLLIDED_WITH_ANYTHING(g_sVehicleGenNSData.vehicleID[eName])
AND NOT IS_ENTITY_ATTACHED(g_sVehicleGenNSData.vehicleID[eName])
VECTOR vAnchorPos = GET_ENTITY_COORDS(g_sVehicleGenNSData.vehicleID[eName])
IF vAnchorPos.z >= GET_ANCHOR_HEIGHT_FOR_VEHICLE_GEN(eName)
SET_BOAT_ANCHOR(g_sVehicleGenNSData.vehicleID[eName], TRUE)
SET_BIT(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_ANCHORED))
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
// No need to process creation
EXIT
ENDIF
ELSE
g_sVehicleGenNSData.vehicleID[eName] = NULL
ENDIF
// Vehicle destroyed
IF DOES_ENTITY_EXIST(g_sVehicleGenNSData.vehicleID[eName])
// Owned by other script
/*
// If we get a bug about not owning the vehicle then we will need
// a 'bCheckDead' flag on the DOES_ENTITY_BELONG_TO_THIS_SCRIPT command.
IF NOT DOES_ENTITY_BELONG_TO_THIS_SCRIPT(g_sVehicleGenNSData.vehicleID[eName])
PRINT_VEHGEN_DBG("No longer needed: Vehicle owned by other script")
g_sVehicleGenNSData.vehicleID[eName] = NULL
EXIT
ENDIF*/
PRINT_VEHGEN_DBG("No longer needed: Vehicle not driveable")
SET_VEHICLE_AS_NO_LONGER_NEEDED(g_sVehicleGenNSData.vehicleID[eName])
g_sVehicleGenNSData.vehicleID[eName] = NULL
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
CLEANUP_ONE_TIME_VEH_GEN(eName)
EXIT
ENDIF
IF IS_PED_INJURED(PLAYER_PED_ID())
EXIT
ENDIF
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Vehicle create
///
//Check if a script is trying to handover a vehicle to this gen.
IF g_eVehGenToRecieveVehicle = eName
PRINT_VEHGEN_DBG("Processing a vehgen vehicle handover request.")
//Take ownership of handover vehicle.
IF DOES_ENTITY_EXIST(g_vehHandoverToGen)
AND IS_VEHICLE_DRIVEABLE(g_vehHandoverToGen)
// Cleanup current vehicle index if it exists.
IF DOES_ENTITY_EXIST(g_sVehicleGenNSData.vehicleID[eName])
AND IS_VEHICLE_DRIVEABLE(g_sVehicleGenNSData.vehicleID[eName])
// Ignore if we already have this vehicle
IF g_sVehicleGenNSData.vehicleID[eName] = g_vehHandoverToGen
PRINT_VEHGEN_DBG("Vehicle to be handed over is the same vehicle.")
g_eVehGenToRecieveVehicle = VEHGEN_NONE
g_vehHandoverToGen = NULL
EXIT
ELSE
PRINT_VEHGEN_DBG("No longer needed: Ready to accept handover vehicle.")
IF eName = VEHGEN_MISSION_VEH
AND NOT IS_VEHICLE_IN_TEMP_PLAYER_VEHICLE_ID_LIST(g_sVehicleGenNSData.vehicleID[eName])
AND NOT IS_VEHICLE_IN_TEMP_NPC_VEHICLE_ID_LIST(g_sVehicleGenNSData.vehicleID[eName])
AND GET_ENTITY_MODEL(g_sVehicleGenNSData.vehicleID[eName]) != MONSTER
SET_VEHICLE_CAN_SAVE_IN_GARAGE(g_sVehicleGenNSData.vehicleID[eName], TRUE)
ENDIF
SET_VEHICLE_AS_NO_LONGER_NEEDED(g_sVehicleGenNSData.vehicleID[eName])
g_sVehicleGenNSData.vehicleID[eName] = NULL
ENDIF
ENDIF
g_sVehicleGenNSData.vehicleID[eName] = g_vehHandoverToGen
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
CLEAR_BIT(iVehGenProcessFlags[eName], VEHGEN_BIT_FLAG_PLAYER_USED_VEHICLE)
SET_BIT(iVehGenProcessFlags[eName], VEHGEN_BIT_FLAG_VEHICLE_HANDED_OVER)
CLEAR_BIT(iVehGenProcessFlags[eName], VEHGEN_BIT_FLAG_PLAYER_LEFT_HANDED_OVER_VEHICLE)
vVehicleCoordsAtHandOver[eName] = GET_ENTITY_COORDS(g_vehHandoverToGen)
g_eVehGenToRecieveVehicle = VEHGEN_NONE
// Track index so we can delete when spawning a new vehicle for vehicle select menu
IF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_DYNAMIC_DATA))
VEHICLE_SETUP_STRUCT sHandOverData
GET_VEHICLE_SETUP(g_vehHandoverToGen, sHandOverData)
IF g_bVehHandoverUseVehicleCoords
UPDATE_DYNAMIC_VEHICLE_GEN_DATA(eName, sHandOverData, GET_ENTITY_COORDS(g_vehHandoverToGen), GET_ENTITY_HEADING(g_vehHandoverToGen), GET_PLAYER_PED_PERSONAL_VEHICLE_BELONGS_TO(g_vehHandoverToGen))
ELSE
UPDATE_DYNAMIC_VEHICLE_GEN_DATA(eName, sHandOverData, g_savedGlobals.sVehicleGenData.vDynamicCoords[sData.dynamicSlotIndex], g_savedGlobals.sVehicleGenData.fDynamicHeading[sData.dynamicSlotIndex], GET_PLAYER_PED_PERSONAL_VEHICLE_BELONGS_TO(g_vehHandoverToGen))
ENDIF
g_sVehicleGenNSData.vehicleID[eName] = g_vehHandoverToGen // need to set this again
g_sVehicleGenNSData.vehicleSelectID[eName] = g_sVehicleGenNSData.vehicleID[eName]
ENDIF
IF eName = VEHGEN_MISSION_VEH_FBI4_PREP //#1581646
enumCharacterList ePed = GET_CURRENT_PLAYER_PED_ENUM()
IF IS_PLAYER_PED_PLAYABLE(ePed)
PRINT_VEHGEN_DBG("Players stored switch vehicle cleared for prep getaway.")
g_vPlayerVeh[ePed] = NULL
ENDIF
ENDIF
SET_ENTITY_AS_MISSION_ENTITY(g_sVehicleGenNSData.vehicleID[eName], TRUE, TRUE)
IF eName = VEHGEN_MISSION_VEH
SET_VEHICLE_CAN_SAVE_IN_GARAGE(g_sVehicleGenNSData.vehicleID[eName], FALSE)
ENDIF
g_vehHandoverToGen = NULL
// [IMPOUND FIX 2] Send the last vehicle gen to the impound
IF g_sPreviousMissionVehGenData.eModel != DUMMY_MODEL_FOR_SCRIPT
PRINTLN("IMPOUND FIX 2 - we have a new mission vehgen and the old one is cached - send to impound")
SEND_VEHICLE_DATA_TO_IMPOUND_USING_SETUP(g_sPreviousMissionVehGenData, g_ePreviousMissionVehGenPed)
g_sPreviousMissionVehGenData.eModel = DUMMY_MODEL_FOR_SCRIPT
ENDIF
EXIT
ENDIF
// [IMPOUND FIX 2] Send the last vehicle gen to the impound
IF g_sPreviousMissionVehGenData.eModel != DUMMY_MODEL_FOR_SCRIPT
PRINTLN("IMPOUND FIX 2 - we have a new mission vehgen and the old one is cached - send to impound")
SEND_VEHICLE_DATA_TO_IMPOUND_USING_SETUP(g_sPreviousMissionVehGenData, g_ePreviousMissionVehGenPed)
g_sPreviousMissionVehGenData.eModel = DUMMY_MODEL_FOR_SCRIPT
ENDIF
PRINT_VEHGEN_DBG("Vehicle to be handed over doesn't exist.")
g_eVehGenToRecieveVehicle = VEHGEN_NONE
g_vehHandoverToGen = NULL
ENDIF
// Player must leave the area
IF g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName]
IF fDistToVehGen[eName] >= cleanupRange
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = FALSE
PRINT_VEHGEN_DBG("Leave area flag cleared")
ENDIF
// [PVB] Clear the coords for the vehicle
IF (eName = VEHGEN_MICHAEL_SAVEHOUSE AND eCurrentPlayerPed = CHAR_MICHAEL)
OR (eName = VEHGEN_TREVOR_SAVEHOUSE_COUNTRY AND eCurrentPlayerPed = CHAR_TREVOR)
OR (eName = VEHGEN_FRANKLIN_SAVEHOUSE_CAR AND eCurrentPlayerPed = CHAR_FRANKLIN)
g_sVehicleGenNSData.vPlayerVehicleCoords = <<0,0,0>>
g_sVehicleGenNSData.vPlayerVehicleCoordsCached = <<0,0,0>>
ENDIF
EXIT
ENDIF
BOOL bContinuePVChecks = FALSE
// Player not in range
IF fDistToVehGen[eName] > createRange
// [IMPOUND] Send mission vehicle gen to impound if it's not been used
IF eName = VEHGEN_MISSION_VEH
AND g_savedGlobals.sVehicleGenData.iPlayerVehicle[sData.dynamicSlotIndex] != 0 // +1 so we dont have to initiailise to -1
AND g_savedGlobals.sVehicleGenData.iPlayerVehicle[sData.dynamicSlotIndex] > NUM_OF_PLAYABLE_PEDS //
AND sData.model != DUMMY_MODEL_FOR_SCRIPT
AND GET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_AVAILABLE)
AND IS_VEHICLE_AVAILABLE_FOR_GAME(sData.model)
TIMEOFDAY eCurrentTOD = GET_CURRENT_TIMEOFDAY()
TIMEOFDAY eHandOverTOD = g_savedGlobals.sVehicleGenData.eMissionVehTimeStamp
ADD_TIME_TO_TIMEOFDAY(eHandOverTOD, 0, 0, 17)
IF IS_TIMEOFDAY_AFTER_TIMEOFDAY(eCurrentTOD, eHandOverTOD)
SEND_VEHICLE_DATA_TO_IMPOUND_USING_SETUP(g_savedGlobals.sVehicleGenData.sDynamicData[sData.dynamicSlotIndex], g_savedGlobals.sVehicleGenData.eLastCharToUseMissionVehGen)
CLEANUP_ONE_TIME_VEH_GEN(eName)
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
PRINT_VEHGEN_DBG("Cannot be created: Vehicle ready for impound")
// [IMPOUND FIX 2] Clear the cached data as we will no longer need to monitor this.
g_sPreviousMissionVehGenData.eModel = DUMMY_MODEL_FOR_SCRIPT
EXIT
ENDIF
ENDIF
// [PVB] Player is not in range but allow the normal checks to be processed so we can check if it's safe to blip
IF (eName = VEHGEN_MICHAEL_SAVEHOUSE AND eCurrentPlayerPed = CHAR_MICHAEL)
OR (eName = VEHGEN_TREVOR_SAVEHOUSE_COUNTRY AND eCurrentPlayerPed = CHAR_TREVOR)
OR (eName = VEHGEN_FRANKLIN_SAVEHOUSE_CAR AND eCurrentPlayerPed = CHAR_FRANKLIN)
bContinuePVChecks = TRUE
ELSE
EXIT
ENDIF
ENDIF
// [PVB] Clear the coords for the vehicle and only set them if the vehicle is safe to create
IF (eName = VEHGEN_MICHAEL_SAVEHOUSE AND eCurrentPlayerPed = CHAR_MICHAEL)
OR (eName = VEHGEN_TREVOR_SAVEHOUSE_COUNTRY AND eCurrentPlayerPed = CHAR_TREVOR)
OR (eName = VEHGEN_FRANKLIN_SAVEHOUSE_CAR AND eCurrentPlayerPed = CHAR_FRANKLIN)
g_sVehicleGenNSData.vPlayerVehicleCoords = <<0,0,0>>
g_sVehicleGenNSData.vPlayerVehicleCoordsCached = <<0,0,0>>
ENDIF
// Vehicle details invalid
IF sData.model = DUMMY_MODEL_FOR_SCRIPT
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
PRINT_VEHGEN_DBG("Cannot be created: Dummy model")
EXIT
ENDIF
IF NOT IS_VEHICLE_AVAILABLE_FOR_GAME(sData.model)
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
PRINT_VEHGEN_DBG("Cannot be created: Vehicle gen model is no longer installed")
EXIT
ENDIF
// Vehicle gen not available
IF NOT GET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_AVAILABLE)
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
PRINT_VEHGEN_DBG("Cannot be created: Vehicle gen not available")
EXIT
ENDIF
// Vehicle gen not purchased
IF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_PURCHASABLE))
AND NOT GET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_ACQUIRED)
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
PRINT_VEHGEN_DBG("Cannot be created: Vehicle gen not purchased")
EXIT
ENDIF
// Not available on mission
IF (IS_VEHCILE_GEN_DISABLED_ON_MISSION() AND IS_CURRENTLY_ON_MISSION_TO_TYPE() AND eName != VEHGEN_MISSION_VEH AND eName != VEHGEN_MISSION_VEH_FBI4_PREP AND eName != VEHGEN_TREV1_SMASHED_TRAILER)
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
PRINT_VEHGEN_DBG("Cannot be created: Vehicle gens blocked on mission")
EXIT
ENDIF
// Character not suitable
IF NOT bCurrentVehicleGenSafeForPlayer
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
PRINT_VEHGEN_DBG("Cannot be created: Player character not valid")
EXIT
ENDIF
// Dynamic vehicle still exists
IF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_DYNAMIC_DATA))
IF DOES_ENTITY_EXIST(g_sVehicleGenNSData.vehicleSelectID[eName])
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
PRINT_VEHGEN_DBG("Cannot be created: Previous dyanmic vehicle still exists")
EXIT
ELSE
g_sVehicleGenNSData.vehicleSelectID[eName] = NULL
ENDIF
ENDIF
// Same vehicle model nearby gen location
IF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_DO_NEARBY_MODEL_CHECK))
IF IS_SAME_VEHICLE_MODEL_NEARBY_PLAYER(sData.model)
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
PRINT_VEHGEN_DBG("Cannot be created: Same vehicle model found nearby player")
EXIT
ENDIF
IF IS_SAME_VEHICLE_MODEL_NEARBY_VEHGEN(sData.model)
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
PRINT_VEHGEN_DBG("Cannot be created: Same vehicle model found nearby gen location")
EXIT
ENDIF
ENDIF
// Not in garage
IF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_ONLY_SPAWN_IN_GARAGE))
IF sGarageData.iWarpControl = 0
EXIT
ENDIF
ENDIF
// Vehicle gen+model specific checks
IF BLOCK_SPECIFIC_VEHICLE_GEN_CREATION(eName)
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
PRINT_VEHGEN_DBG("Cannot be created: Vehgen+model specific checks failed")
EXIT
ENDIF
// Player is doing a short range switch
IF IS_PLAYER_SWITCH_IN_PROGRESS()
AND GET_PLAYER_SWITCH_TYPE() = SWITCH_TYPE_SHORT
IF eName = VEHGEN_WEB_HANGAR_MICHAEL
OR eName = VEHGEN_WEB_HANGAR_FRANKLIN
OR eName = VEHGEN_WEB_HANGAR_TREVOR
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
PRINT_VEHGEN_DBG("Cannot be created: Short range switch in progress")
EXIT
ENDIF
ENDIF
VEHICLE_CREATE_TYPE_ENUM eVehicleType = VEHICLE_TYPE_DEFAULT
IF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_PLAYER_VEH_BIKE))
eVehicleType = VEHICLE_TYPE_BIKE
ELIF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_PLAYER_VEH_CAR))
eVehicleType = VEHICLE_TYPE_CAR
ENDIF
IF eName = VEHGEN_MISSION_VEH
AND g_savedGlobals.sVehicleGenData.iPlayerVehicle[sData.dynamicSlotIndex] > 0 // +1 so we dont have to initiailise to -1
AND g_savedGlobals.sVehicleGenData.iPlayerVehicle[sData.dynamicSlotIndex] <= NUM_OF_PLAYABLE_PEDS //
IF IS_THIS_MODEL_A_BIKE(sData.model)
eVehicleType = VEHICLE_TYPE_BIKE
sData.ped = INT_TO_ENUM(enumCharacterList, g_savedGlobals.sVehicleGenData.iPlayerVehicle[sData.dynamicSlotIndex]-1)
ELIF IS_THIS_MODEL_A_CAR(sData.model)
eVehicleType = VEHICLE_TYPE_CAR
sData.ped = INT_TO_ENUM(enumCharacterList, g_savedGlobals.sVehicleGenData.iPlayerVehicle[sData.dynamicSlotIndex]-1)
ENDIF
ENDIF
IF eVehicleType != VEHICLE_TYPE_DEFAULT
// Player vehicle already exists in map
IF IS_PLAYER_VEHICLE_IN_AREA(sData.ped, eVehicleType, sData.coords, -1) // -1 checks if any exist
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
PRINT_VEHGEN_DBG("Cannot be created: Same player vehicle found nearby gen location")
IF eName = VEHGEN_MISSION_VEH
SET_VEHICLE_GEN_AVAILABLE(eName, FALSE)
ENDIF
EXIT
ENDIF
// Player vehicle just been cleaned up (ignore mission vehgen)
IF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_PLAYER_VEH_BIKE))
OR IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_PLAYER_VEH_CAR))
IF eVehicleType = VEHICLE_TYPE_BIKE
IF g_iCreatedPlayerVehicleCleanupTimer[sData.ped][SAVED_VEHICLE_SLOT_BIKE] != -1
AND (GET_GAME_TIMER() - g_iCreatedPlayerVehicleCleanupTimer[sData.ped][SAVED_VEHICLE_SLOT_BIKE]) < (GET_MILLISECONDS_PER_GAME_MINUTE()*180)
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
PRINT_VEHGEN_DBG("Cannot be created: Same player vehicle cleaned up within the last 3 hours")
TEXT_LABEL_23 tlTimeLeft = "..."
tlTimeLeft += ((GET_MILLISECONDS_PER_GAME_MINUTE()*180) - (GET_GAME_TIMER() - g_iCreatedPlayerVehicleCleanupTimer[sData.ped][SAVED_VEHICLE_SLOT_BIKE])) / 1000
tlTimeLeft += " seconds"
PRINT_VEHGEN_DBG(tlTimeLeft)
EXIT
ENDIF
ELIF eVehicleType = VEHICLE_TYPE_CAR
IF g_iCreatedPlayerVehicleCleanupTimer[sData.ped][SAVED_VEHICLE_SLOT_CAR] != -1
AND (GET_GAME_TIMER() - g_iCreatedPlayerVehicleCleanupTimer[sData.ped][SAVED_VEHICLE_SLOT_CAR]) < (GET_MILLISECONDS_PER_GAME_MINUTE()*180)
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
PRINT_VEHGEN_DBG("Cannot be created: Same player vehicle cleaned up within the last 3 hours")
TEXT_LABEL_23 tlTimeLeft = "..."
tlTimeLeft += ((GET_MILLISECONDS_PER_GAME_MINUTE()*180) - (GET_GAME_TIMER() - g_iCreatedPlayerVehicleCleanupTimer[sData.ped][SAVED_VEHICLE_SLOT_BIKE])) / 1000
tlTimeLeft += " seconds"
PRINT_VEHGEN_DBG(tlTimeLeft)
EXIT
ENDIF
ENDIF
ENDIF
ENDIF
// [PVB] Player vehicle is safe to create so set the coords until it has actually spawned
IF (eName = VEHGEN_MICHAEL_SAVEHOUSE AND eCurrentPlayerPed = CHAR_MICHAEL)
OR (eName = VEHGEN_TREVOR_SAVEHOUSE_COUNTRY AND eCurrentPlayerPed = CHAR_TREVOR)
OR (eName = VEHGEN_FRANKLIN_SAVEHOUSE_CAR AND eCurrentPlayerPed = CHAR_FRANKLIN)
g_sVehicleGenNSData.vPlayerVehicleCoords = sData.coords
ENDIF
// [PVB] Player vehicle is out of the range but we still processed the other checks so we can add a blip at the correct coords
IF bContinuePVChecks
EXIT
ENDIF
IF eVehicleType != VEHICLE_TYPE_DEFAULT
// Model not loaded
eVehicleModel[eName] = GET_PLAYER_VEH_MODEL(sData.ped, eVehicleType)
REQUEST_MODEL(eVehicleModel[eName])
SET_BIT(iVehGenProcessFlags[eName], VEHGEN_BIT_FLAG_VEHICLE_MODEL_REQ)
IF NOT HAS_MODEL_LOADED(eVehicleModel[eName])
PRINT_VEHGEN_DBG("Cannot be created: Waiting for player vehicle model to load")
EXIT
ENDIF
IF IS_PLAYER_IN_VEHICLE_BOUNDS(eVehicleModel[eName], sData.coords)
PRINT_VEHGEN_DBG("Cannot be created: Player is too close to spawn position (default vehicle type)")
EXIT
ENDIF
// All conditions met so clear things up and create the vehicle
CLEAR_AREA(sData.coords, 3.0, FALSE)
CLEAR_AREA_OF_VEHICLES(sData.coords, 3.0)
IF eVehicleType = VEHICLE_TYPE_BIKE
CREATE_PLAYER_VEHICLE(g_sVehicleGenNSData.vehicleID[eName], sData.ped, sData.coords, sData.heading, FALSE, VEHICLE_TYPE_BIKE)
ELIF eVehicleType = VEHICLE_TYPE_CAR
CREATE_PLAYER_VEHICLE(g_sVehicleGenNSData.vehicleID[eName], sData.ped, sData.coords, sData.heading, FALSE, VEHICLE_TYPE_CAR)
ELSE
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
PRINT_VEHGEN_DBG("Cannot be created: Invalid player vehicle type specified")
EXIT
ENDIF
ELSE
// Model not loaded
REQUEST_MODEL(sData.model)
eVehicleModel[eName] = sData.model
SET_BIT(iVehGenProcessFlags[eName], VEHGEN_BIT_FLAG_VEHICLE_MODEL_REQ)
IF NOT HAS_MODEL_LOADED(sData.model)
PRINT_VEHGEN_DBG("Cannot be created: Waiting for model to load")
EXIT
ENDIF
IF IS_PLAYER_IN_VEHICLE_BOUNDS(sData.model, sData.coords)
PRINT_VEHGEN_DBG("Cannot be created: Player is too close to spawn position (specific vehicle type)")
EXIT
ENDIF
// All conditions met so clear things up and create the vehicle
CLEAR_AREA(sData.coords, 3.0, FALSE)
CLEAR_AREA_OF_VEHICLES(sData.coords, 3.0)
IF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_USE_LONG_RANGE_DIST_CHECKS))
REQUEST_COLLISION_AT_COORD(sData.coords)
ENDIF
IF eName = VEHGEN_WEB_MARINA_MICHAEL
OR eName = VEHGEN_WEB_MARINA_FRANKLIN
OR eName = VEHGEN_WEB_MARINA_TREVOR
IF sData.model = SUBMERSIBLE2
//sData.coords = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(sData.coords, sData.heading, <<0.5, 0.0, 0.0>>)
sData.coords.z = -3.0
ENDIF
ENDIF
g_sVehicleGenNSData.vehicleID[eName] = CREATE_VEHICLE(sData.model, sData.coords, sData.heading)
IF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_DYNAMIC_DATA))
//B* 2005584: Setting the landing gear on planes to the default state of OUT
IF IS_THIS_MODEL_A_PLANE(sData.model)
SET_BIT(g_savedGlobals.sVehicleGenData.sDynamicData[sData.dynamicSlotIndex].iFlags,VEHICLE_SETUP_FLAG_LANDING_GEAR_OUT)
ENDIF
// Fix for bug # 1853505 - Need to keep default extras!
IF IS_BIT_SET(g_savedGlobals.sVehicleGenData.sDynamicData[sData.dynamicSlotIndex].iFlags, VEHICLE_SETUP_FLAG_KEEP_DEFAULT_EXTRAS)
GET_VEHICLE_SETUP(g_sVehicleGenNSData.vehicleID[eName], tempVehicleData)
KEEP_DEFAULT_VEHICLE_FLAGS_WITH_SPECIAL_CASE_MODELS(tempVehicleData.iFlags,g_savedGlobals.sVehicleGenData.sDynamicData[sData.dynamicSlotIndex].iFlags,sData.model)
CLEAR_BIT(g_savedGlobals.sVehicleGenData.sDynamicData[sData.dynamicSlotIndex].iFlags, VEHICLE_SETUP_FLAG_KEEP_DEFAULT_EXTRAS)
ENDIF
SET_VEHICLE_SETUP(g_sVehicleGenNSData.vehicleID[eName], g_savedGlobals.sVehicleGenData.sDynamicData[sData.dynamicSlotIndex])
// Track index so we can delete when spawning a new vehicle for vehicle select menu
g_sVehicleGenNSData.vehicleSelectID[eName] = g_sVehicleGenNSData.vehicleID[eName]
ELSE
IF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_FORCE_COLOURS))
SET_VEHICLE_COLOURS(g_sVehicleGenNSData.vehicleID[eName], sData.colour1, sData.colour2)
ENDIF
IF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_NON_INTERACTABLE))
SET_VEHICLE_DOORS_LOCKED(g_sVehicleGenNSData.vehicleID[eName], VEHICLELOCK_LOCKED)
SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(g_sVehicleGenNSData.vehicleID[eName], FALSE)
SET_VEHICLE_CAN_BE_TARGETTED(g_sVehicleGenNSData.vehicleID[eName], FALSE)
SET_VEHICLE_CAN_BREAK(g_sVehicleGenNSData.vehicleID[eName], FALSE)
SET_VEHICLE_CAN_LEAK_OIL(g_sVehicleGenNSData.vehicleID[eName], FALSE)
SET_VEHICLE_CAN_LEAK_PETROL(g_sVehicleGenNSData.vehicleID[eName], FALSE)
SET_VEHICLE_TYRES_CAN_BURST(g_sVehicleGenNSData.vehicleID[eName], FALSE)
SET_ENTITY_INVINCIBLE(g_sVehicleGenNSData.vehicleID[eName], TRUE)
FREEZE_ENTITY_POSITION(g_sVehicleGenNSData.vehicleID[eName], TRUE)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(g_sVehicleGenNSData.vehicleID[eName])
PRINT_VEHGEN_DBG_WITH_VECTOR("Created - Coords: ", sData.coords)
PRINT_VEHGEN_DBG_WITH_FLOAT("Created - Dist From Player:", fDistToVehGen[eName])
// [PVB] Player vehicle has been created so clear the coords
IF (eName = VEHGEN_MICHAEL_SAVEHOUSE AND eCurrentPlayerPed = CHAR_MICHAEL)
OR (eName = VEHGEN_TREVOR_SAVEHOUSE_COUNTRY AND eCurrentPlayerPed = CHAR_TREVOR)
OR (eName = VEHGEN_FRANKLIN_SAVEHOUSE_CAR AND eCurrentPlayerPed = CHAR_FRANKLIN)
g_sVehicleGenNSData.vPlayerVehicleCoords = <<0,0,0>>
ENDIF
SWITCH sData.model
CASE MILJET // Fix for bug # 1880278 - Need to set milject plane white
SET_VEHICLE_COLOURS(g_sVehicleGenNSData.vehicleID[eName], 121, 21)
SET_VEHICLE_EXTRA_COLOURS(g_sVehicleGenNSData.vehicleID[eName], 8, 156)
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: PROCESS_VEHICLE -> MILJET colours [121, 21], extra colours [8, 156]")
BREAK
CASE BESRA // Fix for bug # 1957537 - Need to set besra plane match wiki
SET_VEHICLE_COLOURS(g_sVehicleGenNSData.vehicleID[eName], 122, 89)
SET_VEHICLE_EXTRA_COLOURS(g_sVehicleGenNSData.vehicleID[eName], 25, 121)
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: PROCESS_VEHICLE -> BESRA colours [122, 89], extra colours [25, 121]")
BREAK
CASE BUZZARD // Fix for bug # 2056616 - Buzzard - The Buzzard is completely white when buying it through the Warstock Cache and Carry website.
CASE BUZZARD2
SET_VEHICLE_COLOURS(g_sVehicleGenNSData.vehicleID[eName], 0, 0)
SET_VEHICLE_EXTRA_COLOURS(g_sVehicleGenNSData.vehicleID[eName], 5, 156)
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: PROCESS_VEHICLE -> BUZZARD colours [0, 0], extra colours [5, 156]")
BREAK
CASE DUKES2 //No longer setting Dukes2 colour, see B* 2539535
BREAK
CASE RHINO // Fix for bug # 2349206 - [Rhino Tank] The Rhino Tank has missing textures on some parts of the vehicle. Some areas appear completely black.
SET_VEHICLE_COLOURS(g_sVehicleGenNSData.vehicleID[eName], 131, 132)
SET_VEHICLE_EXTRA_COLOURS(g_sVehicleGenNSData.vehicleID[eName], 132, 156)
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: PROCESS_VEHICLE -> RHINO colours [131, 132], extra colours [132, 156]")
BREAK
CASE LUXOR2 // Fix for bug # 2336050 - Both the Luxor Deluxe and Swift Deluxe spawn in black rather than gold
CASE SWIFT2
SET_VEHICLE_COLOURS(g_sVehicleGenNSData.vehicleID[eName], 159, 0)
SET_VEHICLE_EXTRA_COLOURS(g_sVehicleGenNSData.vehicleID[eName], 160, 156)
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: PROCESS_VEHICLE -> LUXOR2/SWIFT2 colours [159, 0], extra colours [160, 156]")
BREAK
#IF IS_DEBUG_BUILD
CASE CUBAN800
CASE DUSTER
INT ReturnColour1, ReturnColour2, ReturnExtraCarColour1, ReturnExtraCarColour2
GET_VEHICLE_COLOURS(g_sVehicleGenNSData.vehicleID[eName], ReturnColour1, ReturnColour2)
GET_VEHICLE_EXTRA_COLOURS(g_sVehicleGenNSData.vehicleID[eName], ReturnExtraCarColour1, ReturnExtraCarColour2)
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: PROCESS_VEHICLE -> ", GET_MODEL_NAME_FOR_DEBUG(sData.model), " colours [", ReturnColour1, ", ", ReturnColour2, "], extra colours [", ReturnExtraCarColour1, ", ", ReturnExtraCarColour2, "]")
BREAK
#ENDIF
// DEFAULT
// SITE_BUYABLE_VEHICLE veh
// veh = GET_WEBSITE_BUYABLE_VEHICLE_FROM_MODEL(sData.model)
// IF IS_SBV_A_VEHICLE_WITH_LIVERIES(veh)
// // Fix for bug # 2071091 - The Buckingham Swift is delivered to the player's helipad in the alternative livery to what was ordered
// VEHICLE_SETUP_STRUCT vss
// CONFIGURE_STRUCT_FOR_BUYABLE_VEHICLE(veh, vss, FALSE, eCurrentPlayerPed)
// SET_VEHICLE_SETUP(g_sVehicleGenNSData.vehicleID[eName], vss, DEFAULT, DEFAULT)
//
// IF vss.iLivery >= 0
// CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: PROCESS_VEHICLE -> ", GET_MODEL_NAME_FOR_DEBUG(sData.model), " configured colours [", vss.iColour1, ", ", vss.iColour2, "], extra colours [", vss.iColourExtra1, ", livery: ", vss.iColourExtra2, "], ", vss.iLivery)
// ELSE
// CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: PROCESS_VEHICLE -> ", GET_MODEL_NAME_FOR_DEBUG(sData.model), " configured colours [", vss.iColour1, ", ", vss.iColour2, "], extra colours [", vss.iColourExtra1, ", ", vss.iColourExtra2, "]")
// ENDIF
//
// ENDIF
// BREAK
ENDSWITCH
// Anchor sea-based vehicles....arr!
IF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_ANCHOR_WHEN_CREATED))
SET_BOAT_ANCHOR(g_sVehicleGenNSData.vehicleID[eName], TRUE)
ENDIF
IF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_ANCHOR_WHEN_NO_COLLISION))
CLEAR_BIT(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_ANCHORED))
ENDIF
IF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_LOCK_DOORS))
SET_VEHICLE_DOORS_LOCKED(g_sVehicleGenNSData.vehicleID[eName], VEHICLELOCK_LOCKED_BUT_CAN_BE_DAMAGED) // B*1513943 - Trevor should have to break into the MrsPhilips2 veh gens
SET_VEHICLE_ALARM(g_sVehicleGenNSData.vehicleID[eName], TRUE) // B*1552531 - Drugs vans are now alarmed
ENDIF
APPLY_CUSTOM_VEHICLE_DAMAGE(g_sVehicleGenNSData.vehicleID[eName], eName)
IF NOT IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_ONLY_SPAWN_IN_GARAGE))
AND NOT IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_ANCHOR_WHEN_NO_COLLISION))
SET_VEHICLE_ON_GROUND_PROPERLY(g_sVehicleGenNSData.vehicleID[eName])
ENDIF
SET_VEHICLE_DIRT_LEVEL(g_sVehicleGenNSData.vehicleID[eName], 0.0)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(g_sVehicleGenNSData.vehicleID[eName], TRUE)
SET_VEHICLE_CAN_SAVE_IN_GARAGE(g_sVehicleGenNSData.vehicleID[eName], IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_CAN_SAVE_IN_GARAGE)))
ENDIF
// So we can tell if the player has picked up the vehicle
CLEAR_BIT(iVehGenProcessFlags[eName], VEHGEN_BIT_FLAG_PLAYER_USED_VEHICLE)
// So we know if we created the vehicle from scratch or if it was handed over by another script
CLEAR_BIT(iVehGenProcessFlags[eName], VEHGEN_BIT_FLAG_VEHICLE_HANDED_OVER)
// So we don't instantly create another vehicle if the player destroys this one
g_sVehicleGenNSData.bLeaveAreaBeforeCreating[eName] = TRUE
// So player has to wait some time for player vehicle to be returned to savehouse once destroyed
IF eVehicleType != VEHICLE_TYPE_DEFAULT
g_sVehicleGenNSData.bCheckPlayerVehicleCleanupTimer[eName] = TRUE
ENDIF
// [IMPOUND FIX 1] If we created a new version of the vehicle we last tracked for impound then update the vehicle index
INT iTrackedVehGen = GET_PACKED_STAT_INT(PACKED_SP_VEHGEN_TRACKED_FOR_IMPOUND)
IF iTrackedVehGen != 0
AND iTrackedVehGen = ENUM_TO_INT(eName)
vehPreviousCarToTrackForImpound = g_sVehicleGenNSData.vehicleID[eName]
PRINTLN("IMPOUND FIX 1 - vehgen has been re-created so updating previous impound track vehicle index")
ENDIF
// [IMPOUND FIX 2] Clear the cached data as we will no longer need to monitor this.
IF eName = VEHGEN_MISSION_VEH
g_sPreviousMissionVehGenData.eModel = DUMMY_MODEL_FOR_SCRIPT
ENDIF
ENDPROC
/// PURPOSE: Perform any necessary checks before we process the blips, help, txts, and vehicle
PROC PROCESS_CHECKS(VEHICLE_GEN_NAME_ENUM eName)
// Suitable for current character
IF NOT IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_DO_PED_CHECK))
OR sData.ped = eCurrentPlayerPed
bCurrentVehicleGenSafeForPlayer = TRUE
ELSE
bCurrentVehicleGenSafeForPlayer = FALSE
ENDIF
//B* 2194503: Disable vehicle gens in Director mode
IF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR)
bCurrentVehicleGenSafeForPlayer = FALSE
ENDIF
// Closest vehicle gen for purchase check
IF bCurrentVehicleGenSafeForPlayer
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
AND IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_PURCHASABLE))
IF sGarageData.iPurchaseControl = 0
AND sGarageData.iWarpControl = 0
IF fDistToVehGen[eName] < sGarageData.fClosestDist
OR sGarageData.eClosestGen = eName
IF sGarageData.eClosestGen != eName
#IF IS_DEBUG_BUILD
PRINTLN("DO_VEHICLE_GEN_PROCESING() - Updating closest vehicle gen to ", sData.dbg_name)
#ENDIF
sGarageData.sVehGenData = sData
sGarageData.sVehGenPurchData = sPurchData
sGarageData.eClosestGen = eName
INT iWebVeh
REPEAT COUNT_OF(g_sVehicleGenNSData.eWebVehicles) iWebVeh
g_sVehicleGenNSData.eWebVehicles[iWebVeh] = UNSET_BUYABLE_VEHICLE
ENDREPEAT
sGarageData.iVehicleType = -1
IF sGarageData.eClosestGen = VEHGEN_WEB_HANGAR_MICHAEL
OR sGarageData.eClosestGen = VEHGEN_WEB_HANGAR_FRANKLIN
OR sGarageData.eClosestGen = VEHGEN_WEB_HANGAR_TREVOR
sGarageData.iVehicleType = GVT_PLANE
ELIF sGarageData.eClosestGen = VEHGEN_WEB_MARINA_MICHAEL
OR sGarageData.eClosestGen = VEHGEN_WEB_MARINA_FRANKLIN
OR sGarageData.eClosestGen = VEHGEN_WEB_MARINA_TREVOR
sGarageData.iVehicleType = GVT_BOAT
ELIF sGarageData.eClosestGen = VEHGEN_WEB_HELIPAD_MICHAEL
OR sGarageData.eClosestGen = VEHGEN_WEB_HELIPAD_FRANKLIN
OR sGarageData.eClosestGen = VEHGEN_WEB_HELIPAD_TREVOR_COUNTRY
sGarageData.iVehicleType = GVT_HELI
ELIF sGarageData.eClosestGen = VEHGEN_WEB_CAR_MICHAEL
OR sGarageData.eClosestGen = VEHGEN_WEB_CAR_FRANKLIN
OR sGarageData.eClosestGen = VEHGEN_WEB_CAR_TREVOR
sGarageData.iVehicleType = GVT_CAR
ENDIF
#IF IS_DEBUG_BUILD
INT iIncreaseCount
#ENDIF
INT iStoredWebVehs
MODEL_NAMES eWebVehModel
REPEAT ENUM_TO_INT(NUMBER_OF_BUYABLE_VEHICLES_SP) iWebVeh
eWebVehModel = GET_MODEL_FOR_BUYABLE_VEHICLE(INT_TO_ENUM(SITE_BUYABLE_VEHICLE, iWebVeh))
IF eWebVehModel != DUMMY_MODEL_FOR_SCRIPT
IF iStoredWebVehs < COUNT_OF(g_sVehicleGenNSData.eWebVehicles)
SWITCH sGarageData.iVehicleType
CASE GVT_CAR
IF IS_THIS_MODEL_SAFE_FOR_GARAGE(eWebVehModel)
g_sVehicleGenNSData.eWebVehicles[iStoredWebVehs] = INT_TO_ENUM(SITE_BUYABLE_VEHICLE, iWebVeh)
iStoredWebVehs++
ENDIF
BREAK
CASE GVT_HELI
IF IS_THIS_MODEL_A_HELI(eWebVehModel)
g_sVehicleGenNSData.eWebVehicles[iStoredWebVehs] = INT_TO_ENUM(SITE_BUYABLE_VEHICLE, iWebVeh)
iStoredWebVehs++
ENDIF
BREAK
CASE GVT_BOAT
IF IS_THIS_MODEL_A_BOAT(eWebVehModel)
OR IS_THIS_MODEL_A_JETSKI(eWebVehModel)
OR (eWebVehModel = SUBMERSIBLE2)
g_sVehicleGenNSData.eWebVehicles[iStoredWebVehs] = INT_TO_ENUM(SITE_BUYABLE_VEHICLE, iWebVeh)
iStoredWebVehs++
ENDIF
BREAK
CASE GVT_PLANE
IF IS_THIS_MODEL_SAFE_FOR_HANGAR(eWebVehModel)
g_sVehicleGenNSData.eWebVehicles[iStoredWebVehs] = INT_TO_ENUM(SITE_BUYABLE_VEHICLE, iWebVeh)
iStoredWebVehs++
ENDIF
BREAK
ENDSWITCH
ELSE
#IF IS_DEBUG_BUILD
iIncreaseCount++
#ENDIF
ENDIF
ENDIF
ENDREPEAT
#IF IS_DEBUG_BUILD
IF iIncreaseCount != 0
PRINTLN("Web vehicle count has increased by ", iIncreaseCount)
SCRIPT_ASSERT("Web vehicle count has increased. Add bug for Kenneth R.")
ENDIF
#ENDIF
ENDIF
sGarageData.fClosestDist = fDistToVehGen[eName]
ENDIF
ENDIF
ELIF sGarageData.eClosestGen = eName
sGarageData.eClosestGen = VEHGEN_NONE
sGarageData.fClosestDist = 99999.99
ENDIF
// Player used vehicle
IF NOT IS_BIT_SET(iVehGenProcessFlags[eName], VEHGEN_BIT_FLAG_PLAYER_USED_VEHICLE)
IF DOES_ENTITY_EXIST(g_sVehicleGenNSData.vehicleID[eName])
IF IS_VEHICLE_DRIVEABLE(g_sVehicleGenNSData.vehicleID[eName])
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), g_sVehicleGenNSData.vehicleID[eName])
// Wait for player to leave handed over vehicles.
IF NOT IS_BIT_SET(iVehGenProcessFlags[eName], VEHGEN_BIT_FLAG_VEHICLE_HANDED_OVER) OR IS_BIT_SET(iVehGenProcessFlags[eName], VEHGEN_BIT_FLAG_PLAYER_LEFT_HANDED_OVER_VEHICLE)
SET_BIT(iVehGenProcessFlags[eName], VEHGEN_BIT_FLAG_PLAYER_USED_VEHICLE)
// Update the saved states that relate to a vehicle being used
SET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_PLAYER_USED_VEH, TRUE)
SET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_BLIP_PROCESSED, TRUE)
ENDIF
ELSE
SET_BIT(iVehGenProcessFlags[eName], VEHGEN_BIT_FLAG_PLAYER_LEFT_HANDED_OVER_VEHICLE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
// Fix for bug # 1872855 - Vulkan / Hydra spawns in VTOL mode by default in SP hangars, which makes it hard to navigate out of.
IF eName = VEHGEN_WEB_HANGAR_TREVOR
IF DOES_ENTITY_EXIST(g_sVehicleGenNSData.vehicleSelectID[eName])
AND IS_VEHICLE_DRIVEABLE(g_sVehicleGenNSData.vehicleSelectID[eName])
AND (GET_ENTITY_MODEL(g_sVehicleGenNSData.vehicleSelectID[eName]) = HYDRA)
IF NOT bNozzelSet
IF IS_ENTITY_IN_ANGLED_AREA(g_sVehicleGenNSData.vehicleSelectID[eName], <<1738.686401,3283.422607,45.242832>>, <<1724.511108,3328.807861,39.597805>>, 21.000000)
SET_VEHICLE_FLIGHT_NOZZLE_POSITION(g_sVehicleGenNSData.vehicleSelectID[eName], 0)
bNozzelSet = TRUE
ENDIF
ELSE
IF NOT IS_ENTITY_IN_ANGLED_AREA(g_sVehicleGenNSData.vehicleSelectID[eName], <<1738.686401,3283.422607,45.242832>>, <<1724.511108,3328.807861,39.597805>>, 21.000000)
SET_VEHICLE_FLIGHT_NOZZLE_POSITION(g_sVehicleGenNSData.vehicleSelectID[eName], 1.0)
bNozzelSet = FALSE
ENDIF
ENDIF
ELSE
bNozzelSet = FALSE
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Handle the help text
PROC PROCESS_HELP(VEHICLE_GEN_NAME_ENUM eName)
// The sData struct must be set using GET_VEHICLE_GEN_DATA(...)
// before this function is called.
// Check that the vehicle gen is available and help not processed
IF GET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_AVAILABLE)
AND NOT GET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_HELP_PROCESSED)
// Player must have used vehicle before we process the help
IF GET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_PLAYER_USED_VEH)
// Print a help message if any help flag has been set
IF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_PRINT_HELP_ONCE))
ADD_HELP_TO_FLOW_QUEUE(sData.help)
SET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_HELP_PROCESSED, TRUE)
ELSE
// No help text for this vehicle gen so mark as processed
SET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_HELP_PROCESSED, TRUE)
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Handle the vehicle blips
PROC PROCESS_BLIP(VEHICLE_GEN_NAME_ENUM eName)
// The sData struct must be set using GET_VEHICLE_GEN_DATA(...)
// before this function is called.
BOOL bRemoveBlip = TRUE
// Blip the vehicle gen if it is available and requires a constant blip or needs temp blip
IF GET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_AVAILABLE)
AND bCurrentVehicleGenSafeForPlayer
// Add a blip if any blip flag has been set
IF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_BLIP))
OR (IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_BLIP_ONCE)) AND NOT GET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_BLIP_PROCESSED))
// And not on mission
IF (NOT IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_HIDE_BLIP_ON_MISSION))
OR (NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_FRIENDS)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_PREP)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_RANDOM_CHAR)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_MINIGAME)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_MINIGAME_FRIENDS)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_ANIMAL)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR)))
AND (GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0 OR GET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_ACQUIRED) OR NOT IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_HIDE_BLIP_ON_WANTED)))
bRemoveBlip = FALSE
IF NOT DOES_BLIP_EXIST(g_sVehicleGenNSData.blipID[eName])
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_ARMENIAN_1)
// Use the purchase blip/coords
IF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_PURCHASABLE))
AND NOT GET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_ACQUIRED)
g_sVehicleGenNSData.blipID[eName] = ADD_BLIP_FOR_COORD(sPurchData.vBlipCoords)
IF sPurchData.eBlipSprite != RADAR_TRACE_INVALID
SET_BLIP_SPRITE(g_sVehicleGenNSData.blipID[eName], sPurchData.eBlipSprite)
//SHOW_FOR_SALE_ICON_ON_BLIP(g_sVehicleGenNSData.blipID[eName], TRUE)
IF NOT IS_STRING_NULL_OR_EMPTY(sPurchData.tl15BlipLabel)
SET_BLIP_NAME_FROM_TEXT_FILE(g_sVehicleGenNSData.blipID[eName], sPurchData.tl15BlipLabel)
ENDIF
ENDIF
// Use vehicle spawn menu coords
ELIF GET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_ACQUIRED)
AND (eName = VEHGEN_WEB_CAR_MICHAEL OR eName = VEHGEN_WEB_CAR_FRANKLIN OR eName = VEHGEN_WEB_CAR_TREVOR OR eName = VEHGEN_WEB_HANGAR_TREVOR)
g_sVehicleGenNSData.blipID[eName] = ADD_BLIP_FOR_COORD(sPurchData.vBlipCoords)
IF sData.blip != RADAR_TRACE_INVALID
SET_BLIP_SPRITE(g_sVehicleGenNSData.blipID[eName], sData.blip)
//SHOW_FOR_SALE_ICON_ON_BLIP(g_sVehicleGenNSData.blipID[eName], FALSE)
IF NOT IS_STRING_NULL_OR_EMPTY(sPurchData.tl15BlipLabel)
SET_BLIP_NAME_FROM_TEXT_FILE(g_sVehicleGenNSData.blipID[eName], sPurchData.tl15BlipLabel)
ENDIF
// Change colour to match character.
//IF eName != VEHGEN_WEB_HANGAR_TREVOR // Do not set colour for the hangar, just the cars.
// Rob - 2118987 - blip storage properties the correct colour
INT iBlipCol
IF sData.ped = CHAR_MICHAEL
iBlipCol = BLIP_COLOUR_MICHAEL
ELIF sData.ped = CHAR_FRANKLIN
iBlipCol = BLIP_COLOUR_FRANKLIN
ELIF sData.ped = CHAR_TREVOR
iBlipCol = BLIP_COLOUR_TREVOR
ENDIF
SET_BLIP_COLOUR(g_sVehicleGenNSData.blipID[eName], iBlipCol)
//ENDIF
ENDIF
// Use default blip/coords
ELSE
g_sVehicleGenNSData.blipID[eName] = ADD_BLIP_FOR_COORD(sData.coords)
IF sData.blip != RADAR_TRACE_INVALID
SET_BLIP_SPRITE(g_sVehicleGenNSData.blipID[eName], sData.blip)
//SHOW_FOR_SALE_ICON_ON_BLIP(g_sVehicleGenNSData.blipID[eName], FALSE)
IF NOT IS_STRING_NULL_OR_EMPTY(sPurchData.tl15BlipLabel)
SET_BLIP_NAME_FROM_TEXT_FILE(g_sVehicleGenNSData.blipID[eName], sPurchData.tl15BlipLabel)
ENDIF
// Rob - 2118987 - blip storage properties the correct colour
IF eName = VEHGEN_WEB_HANGAR_MICHAEL
OR eName = VEHGEN_WEB_HANGAR_FRANKLIN
OR eName = VEHGEN_WEB_HANGAR_TREVOR
OR eName = VEHGEN_WEB_MARINA_MICHAEL
OR eName = VEHGEN_WEB_MARINA_FRANKLIN
OR eName = VEHGEN_WEB_MARINA_TREVOR
OR eName = VEHGEN_WEB_HELIPAD_MICHAEL
OR eName = VEHGEN_WEB_HELIPAD_FRANKLIN
OR eName = VEHGEN_WEB_HELIPAD_TREVOR_COUNTRY
INT iBlipCol
IF sData.ped = CHAR_MICHAEL
iBlipCol = BLIP_COLOUR_MICHAEL
ELIF sData.ped = CHAR_FRANKLIN
iBlipCol = BLIP_COLOUR_FRANKLIN
ELIF sData.ped = CHAR_TREVOR
iBlipCol = BLIP_COLOUR_TREVOR
ENDIF
SET_BLIP_COLOUR(g_sVehicleGenNSData.blipID[eName], iBlipCol)
ENDIF
ENDIF
ENDIF
SET_BLIP_AS_SHORT_RANGE(g_sVehicleGenNSData.blipID[eName], NOT IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_BLIP_LONG_RANGE)))
SET_BLIP_FLASHES(g_sVehicleGenNSData.blipID[eName], FALSE)
SET_BLIP_PRIORITY(g_sVehicleGenNSData.blipID[eName], BLIPPRIORITY_LOW)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF bRemoveBlip
IF DOES_BLIP_EXIST(g_sVehicleGenNSData.blipID[eName])
REMOVE_BLIP(g_sVehicleGenNSData.blipID[eName])
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Handle the txt messages
PROC PROCESS_TXT(VEHICLE_GEN_NAME_ENUM eName)
// The sData struct must be set using GET_VEHICLE_GEN_DATA(...)
// before this function is called.
// Check that the vehicle gen is available and txt not processed
IF GET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_AVAILABLE)
AND NOT GET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_TXT_PROCESSED)
// Send a txt if any txt flag has been set
IF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_SEND_TXT_ONCE))
// [TODO] Handle txt messages
// If we need to wait for the player to leave then hold off on the txt...
// Add a switch case for each vehgen
// CARAPP, send from social club.
SET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_TXT_PROCESSED, TRUE)
ELSE
// Not required to send a txt so mark as processed
SET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_TXT_PROCESSED, TRUE)
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Handle the acquired state when linked to propery
PROC PROCESS_PROPERTY(VEHICLE_GEN_NAME_ENUM eName)
// The sData struct must be set using GET_VEHICLE_GEN_DATA(...)
// before this function is called.
IF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_LINKED_TO_PROPERTY))
IF GET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_AVAILABLE)
AND NOT GET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_ACQUIRED)
enumCharacterList ePedProperty = NO_CHARACTER
IF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_PROPERTY_CAR))
ePedProperty = GET_CURRENT_PROPERTY_OWNER(PROPERTY_CAR_SCRAP_YARD)
ELIF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_PROPERTY_MODSHOP))
ePedProperty = GET_CURRENT_PROPERTY_OWNER(PROPERTY_CAR_MOD_SHOP)
ENDIF
IF ePedProperty = sData.ped
SET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_ACQUIRED, TRUE)
ENDIF
ENDIF
ENDIF
// IF IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_PURCHASABLE))
// IF NOT GET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_ACQUIRED)
// AND NOT bPropertyUnlockChecksProcessedThisFrame
// // Franklin gets garage for free in the special edition game
// IF eName = VEHGEN_WEB_CAR_FRANKLIN
// IF IS_GAME_LINKED_TO_SOCIAL_CLUB(TRUE, TRUE)
// SET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_AVAILABLE, TRUE)
// SET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_ACQUIRED, TRUE)
// IF DOES_BLIP_EXIST(g_sVehicleGenNSData.blipID[eName])
// REMOVE_BLIP(g_sVehicleGenNSData.blipID[eName])
// ENDIF
// ENDIF
// ENDIF
//
// // Give free garage when we have special vehicles available/installed
// INT iVehicleTypeToCheck = GVT_CAR
//
// IF eName = VEHGEN_WEB_CAR_FRANKLIN
// OR eName = VEHGEN_WEB_CAR_MICHAEL
// OR eName = VEHGEN_WEB_CAR_TREVOR
// iVehicleTypeToCheck = GVT_CAR
// ELIF eName = VEHGEN_WEB_HELIPAD_MICHAEL
// OR eName = VEHGEN_WEB_HELIPAD_FRANKLIN
// iVehicleTypeToCheck = GVT_HELI
// ELIF eName = VEHGEN_WEB_HANGAR_MICHAEL
// OR eName = VEHGEN_WEB_HANGAR_FRANKLIN
// OR eName = VEHGEN_WEB_HANGAR_TREVOR
// iVehicleTypeToCheck = GVT_PLANE
// ELIF eName = VEHGEN_WEB_MARINA_MICHAEL
// OR eName = VEHGEN_WEB_MARINA_FRANKLIN
// OR eName = VEHGEN_WEB_MARINA_TREVOR
// iVehicleTypeToCheck = GVT_BOAT
// ENDIF
//
// // Check special vehicles
// INT iDLCVehCount, iDLCVeh
// iDLCVehCount = GET_NUMBER_OF_SPECIAL_VEHICLES()
// REPEAT iDLCVehCount iDLCVeh
// IF IS_THIS_MODEL_A_PLANE(GET_SPECIAL_VEHICLE_MODEL(iDLCVeh)) AND iVehicleTypeToCheck = GVT_PLANE
// OR IS_THIS_MODEL_A_BOAT(GET_SPECIAL_VEHICLE_MODEL(iDLCVeh)) AND iVehicleTypeToCheck = GVT_BOAT
// OR IS_THIS_MODEL_A_CAR(GET_SPECIAL_VEHICLE_MODEL(iDLCVeh)) AND iVehicleTypeToCheck = GVT_CAR
// OR IS_THIS_MODEL_A_BIKE(GET_SPECIAL_VEHICLE_MODEL(iDLCVeh)) AND iVehicleTypeToCheck = GVT_CAR
// OR IS_THIS_MODEL_A_HELI(GET_SPECIAL_VEHICLE_MODEL(iDLCVeh)) AND iVehicleTypeToCheck = GVT_HELI
// SET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_AVAILABLE, TRUE)
// SET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_ACQUIRED, TRUE)
// IF DOES_BLIP_EXIST(g_sVehicleGenNSData.blipID[eName])
// REMOVE_BLIP(g_sVehicleGenNSData.blipID[eName])
// ENDIF
// iDLCVeh = iDLCVehCount+1//Bail
// ENDIF
// ENDREPEAT
//
// bPropertyUnlockChecksProcessedThisFrame = TRUE
// ENDIF
// ENDIF
ENDPROC
/// PURPOSE: Handle the blocking areas for a vehgen
PROC PROCESS_BLOCKING_AREAS(VEHICLE_GEN_NAME_ENUM eName)
// The sData struct must be set using GET_VEHICLE_GEN_DATA(...)
// before this function is called.
BOOL bBlockArea = FALSE
IF GET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_AVAILABLE)
AND (NOT IS_BIT_SET(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_PURCHASABLE)) OR GET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_ACQUIRED))
bBlockArea = TRUE
ENDIF
IF g_sVehicleGenNSData.bScenarioBlockSet[eName] != bBlockArea
IF NOT ARE_VECTORS_EQUAL(sData.scenario_block_minXYZ, <<0.0,0.0,0.0>>)
IF NOT bBlockArea
IF g_sVehicleGenNSData.bScenarioBlockSet[eName]
REMOVE_SCENARIO_BLOCKING_AREA(g_sVehicleGenNSData.scenarioBlock[eName])
#IF IS_DEBUG_BUILD
PRINTLN("PROCESS_BLOCKING_AREAS - Removed scenario block for vehgen ", sData.dbg_name, ".")
#ENDIF
ENDIF
ELSE
IF NOT g_sVehicleGenNSData.bScenarioBlockSet[eName]
g_sVehicleGenNSData.scenarioBlock[eName] = ADD_SCENARIO_BLOCKING_AREA(sData.scenario_block_minXYZ, sData.scenario_block_maxXYZ)
#IF IS_DEBUG_BUILD
PRINTLN("PROCESS_BLOCKING_AREAS - Adding scenario block for vehgen ", sData.dbg_name, ".")
#ENDIF
ENDIF
ENDIF
ENDIF
g_sVehicleGenNSData.bScenarioBlockSet[eName] = bBlockArea
ENDIF
ENDPROC
PROC PROCESS_FOR_SALE_SIGN(VEHICLE_GEN_NAME_ENUM eName)
IF IS_PED_INJURED(PLAYER_PED_ID())
EXIT
ENDIF
BOOL bCreateForSaleSign = FALSE
VECTOR vCoords
FLOAT fHeading
INT iSign = -1
MODEL_NAMES signModel = Prop_forSale_DYN_01
SWITCH eName
CASE VEHGEN_WEB_HANGAR_MICHAEL
CASE VEHGEN_WEB_HANGAR_FRANKLIN
bCreateForSaleSign = (NOT GET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_ACQUIRED))
vCoords = << -961.42, -2794.47, 12.96 >>
fHeading = -209.22
iSign = 0
signModel = INT_TO_ENUM(MODEL_NAMES, HASH("Prop_Airport_Sale_Sign"))
BREAK
CASE VEHGEN_WEB_MARINA_MICHAEL
CASE VEHGEN_WEB_MARINA_FRANKLIN
CASE VEHGEN_WEB_MARINA_TREVOR
bCreateForSaleSign = (NOT GET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_ACQUIRED))
vCoords = <<-827.93, -1368.14, 3.9982 >>
fHeading = -68.75
iSign = 1
BREAK
CASE VEHGEN_WEB_HELIPAD_MICHAEL
CASE VEHGEN_WEB_HELIPAD_FRANKLIN
bCreateForSaleSign = (NOT GET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_ACQUIRED))
bCreateForSaleSign = TRUE
vCoords = << -710.07, -1414.31, 4.00 >>
fHeading = -41.25
iSign = 2
BREAK
CASE VEHGEN_WEB_CAR_MICHAEL
bCreateForSaleSign = (NOT GET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_ACQUIRED))
vCoords = <<-66.21, 77.76, 70.51>>
fHeading = -27.00
iSign = 3
BREAK
CASE VEHGEN_WEB_CAR_FRANKLIN
bCreateForSaleSign = (NOT GET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_ACQUIRED))
vCoords = <<-76.02, -1825.61, 25.88>>
fHeading = -129.67
iSign = 4
BREAK
CASE VEHGEN_WEB_CAR_TREVOR
bCreateForSaleSign = (NOT GET_VEHICLE_GEN_SAVED_FLAG_STATE(eName, VEHGEN_S_FLAG_ACQUIRED))
vCoords = <<-218.68, -1165.76, 21.99>>
fHeading = 89.95
iSign = 5
BREAK
ENDSWITCH
IF bCreateForSaleSign
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vCoords) < 250
IF NOT DOES_ENTITY_EXIST(objForSaleSign[iSign])
REQUEST_MODEL(signModel)
bObjectRequested = TRUE
IF HAS_MODEL_LOADED(signModel)
IF bObjectRequested
objForSaleSign[iSign] = CREATE_OBJECT_NO_OFFSET(signModel, vCoords, FALSE)
SET_ENTITY_ROTATION(objForSaleSign[iSign], <<0,0,fHeading>>)
SET_ENTITY_CAN_BE_DAMAGED(objForSaleSign[iSign], FALSE)
FREEZE_ENTITY_POSITION(objForSaleSign[iSign], TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(signModel)
bObjectRequested = FALSE
ENDIF
ENDIF
ENDIF
ELIF iSign != -1
IF DOES_ENTITY_EXIST(objForSaleSign[iSign])
AND NOT IS_ENTITY_ON_SCREEN(objForSaleSign[iSign])
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vCoords) > 255
DELETE_OBJECT(objForSaleSign[iSign])
IF bObjectRequested
SET_MODEL_AS_NO_LONGER_NEEDED(signModel)
bObjectRequested = FALSE
ENDIF
ENDIF
ENDIF
ENDPROC
PROC ADD_VEHICLE_GEN_TO_PROCESS_LIST(VEHICLE_GEN_NAME_ENUM eName)
INT iVehBitset = ENUM_TO_INT(eName)/32
INT iVehBit = ENUM_TO_INT(eName)%32
IF NOT IS_BIT_SET(iVehGenCheck[iVehBitset], iVehBit)
SET_BIT(iVehGenCheck[iVehBitset], iVehBit)
eVehGenCheck[iVehGenCheckCount] = eName
iVehGenCheckCount++
ENDIF
ENDPROC
/// PURPOSE: Calls the appropriate procs for the current frame
PROC DO_VEHICLE_GEN_PROCESING()
// We only process property unlock checks once per frame, clear it here.
// bPropertyUnlockChecksProcessedThisFrame = FALSE
IF g_sVehicleGenNSData.bCheckVehGensLoaded
IF NOT bCheckAllNearbyVehiclesInit
g_sVehicleGenNSData.iCheckVehGensLoadedCounter = 0
bCheckAllNearbyVehiclesInit = TRUE
ELIF g_sVehicleGenNSData.iCheckVehGensLoadedCounter >= NUMBER_OF_VEHICLES_TO_GEN
#IF IS_DEBUG_BUILD
PRINTLN("PROCESS_ALL_VEHICLE_GENS_LOADED - All vehicle gens loaded near player")
#ENDIF
g_sVehicleGenNSData.bCheckVehGensLoaded = FALSE
bCheckAllNearbyVehiclesInit = FALSE
ENDIF
ELSE
bCheckAllNearbyVehiclesInit = FALSE
ENDIF
// Cycle through all the vehicles in the check list
INT i
VEHICLE_GEN_NAME_ENUM eName
REPEAT iVehGenCheckCount i
eName = eVehGenCheck[i]
// Set up the data before we process
IF GET_VEHICLE_GEN_DATA(sData, eName)
GET_PURCHASABLE_GARAGE_DATA(sPurchData, eName)
IF (sPurchData.bWarpToGarage AND sGarageData.iWarpControl = 0)
OR (eName = VEHGEN_WEB_HANGAR_TREVOR)
fDistToVehGen[eName] = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), sPurchData.vBlipCoords, FALSE)
ELSE
fDistToVehGen[eName] = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), sData.coords, FALSE)
ENDIF
IF IS_CONTROLLER_SAFE_TO_RUN()
PROCESS_CHECKS(eName)
PROCESS_HELP(eName)
PROCESS_BLIP(eName)
PROCESS_TXT(eName)
PROCESS_PROPERTY(eName)
PROCESS_BLOCKING_AREAS(eName)
PROCESS_FOR_SALE_SIGN(eName)
PROCESS_VEHICLE(eName)
IF IS_BIT_SET(iVehGenProcessFlags[eName], VEHGEN_BIT_FLAG_VEHICLE_MODEL_REQ)
IF g_sVehicleGenNSData.bCheckVehGensLoaded
#IF IS_DEBUG_BUILD
PRINTLN("PROCESS_ALL_VEHICLE_GENS_LOADED - WAIT: Currently creating ", sData.dbg_name, ".")
#ENDIF
bCheckAllNearbyVehiclesInit = FALSE
ENDIF
// Requesting model so keep processing
ADD_VEHICLE_GEN_TO_PROCESS_LIST(eName)
ENDIF
ELSE
CLEANUP_VEHICLE_MODEL(eName)
ENDIF
ENDIF
ENDREPEAT
// Check what vehgens need to be processed
INT iVehGenCheckCount_Temp = iVehGenCheckCount
iVehGenCheckCount = 0
REPEAT (COUNT_OF(iVehGenCheck)) i
iVehGenCheck[i] = 0
ENDREPEAT
REPEAT iVehGenCheckCount_Temp i
// If the shop is still in range add it to the new list
IF IS_BIT_SET(iVehGenProcessFlags[eVehGenCheck[i]], VEHGEN_BIT_FLAG_VEHICLE_MODEL_REQ)
ADD_VEHICLE_GEN_TO_PROCESS_LIST(eVehGenCheck[i])
ENDIF
ENDREPEAT
IF ePurchasedVehicleGen != VEHGEN_NONE
ADD_VEHICLE_GEN_TO_PROCESS_LIST(ePurchasedVehicleGen)
ePurchasedVehicleGen = VEHGEN_NONE
ENDIF
// Update next default vehicle to watch
iProcessSlot++
IF iProcessSlot >= NUMBER_OF_VEHICLES_TO_GEN
iProcessSlot = 0
ENDIF
ADD_VEHICLE_GEN_TO_PROCESS_LIST(INT_TO_ENUM(VEHICLE_GEN_NAME_ENUM, iProcessSlot))
IF bForceGarageChecks
ADD_VEHICLE_GEN_TO_PROCESS_LIST(VEHGEN_WEB_CAR_MICHAEL)
ADD_VEHICLE_GEN_TO_PROCESS_LIST(VEHGEN_WEB_CAR_FRANKLIN)
ADD_VEHICLE_GEN_TO_PROCESS_LIST(VEHGEN_WEB_CAR_TREVOR)
bForceGarageChecks = FALSE
bProcessingGarageChecks = TRUE
ELIF bProcessingGarageChecks
bProcessingGarageChecks = FALSE
ENDIF
IF g_sVehicleGenNSData.bCheckVehGensLoaded
g_sVehicleGenNSData.iCheckVehGensLoadedCounter++
ENDIF
ENDPROC
PROC CLEANUP_CARSTEAL_WALL()
PRINTLN("<VEHGEN> Cleaning up carsteal wall area in chopshop.")
INT iLineIndex
REPEAT 6 iLineIndex
IF DOES_ENTITY_EXIST(oCarstealWallLine[iLineIndex])
DELETE_OBJECT(oCarstealWallLine[iLineIndex])
ENDIF
ENDREPEAT
ENDPROC
//Updates the black-lit wall in the chop shop to show the names of the cars that have been stolen on the
//carsteal missions. Wasn't sure the best script to use to handle this, but it is closely related to the
//carsteal cargens so it runs in the vehgen thread for now. BenR.
PROC DO_CARSTEAL_WALL_PROCESSING()
FLOAT lineZFwd = -1308.545
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()),<<475.1920, -1313.4802, 28.2074>>) < 1000
IF NOT bCarstealWallUpdated
REQUEST_MODEL(V_ILEV_UVLINE)
bCarstealWallLoaded = TRUE
IF HAS_MODEL_LOADED(V_ILEV_UVLINE)
PRINTLN("<VEHGEN> Updated Car Steal wall on entering chopshop area.")
// Create line stroke objects.
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_CARSTEAL_1)
PRINTLN("<VEHGEN> Carsteal 1 complete. Marking EntityXF and Cheetah as stolen.")
oCarstealWallLine[CARSTEAL_WALL_ENTITYXF] = CREATE_OBJECT(V_ILEV_UVLINE, <<471.48, lineZFwd, 30.33>>)
SET_ENTITY_COORDS(oCarstealWallLine[CARSTEAL_WALL_ENTITYXF], <<471.48, lineZFwd, 30.33>>)
SET_ENTITY_ROTATION(oCarstealWallLine[CARSTEAL_WALL_ENTITYXF], <<0.0000, 0.0000, 116.9000>>)
oCarstealWallLine[CARSTEAL_WALL_CHEETAH] = CREATE_OBJECT(V_ILEV_UVLINE, <<471.48, lineZFwd, 30.15>>)
SET_ENTITY_COORDS(oCarstealWallLine[CARSTEAL_WALL_CHEETAH], <<471.48, lineZFwd, 30.15>>)
SET_ENTITY_ROTATION(oCarstealWallLine[CARSTEAL_WALL_CHEETAH], <<0.0000, 0.0000, 116.9000>>)
ENDIF
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_CARSTEAL_2)
PRINTLN("<VEHGEN> Carsteal 2 complete. Marking ZType as stolen.")
oCarstealWallLine[CARSTEAL_WALL_ZTYPE] = CREATE_OBJECT(V_ILEV_UVLINE, <<471.48, lineZFwd, 29.98>>)
SET_ENTITY_COORDS(oCarstealWallLine[CARSTEAL_WALL_ZTYPE], <<471.48, lineZFwd, 29.98>>)
SET_ENTITY_ROTATION(oCarstealWallLine[CARSTEAL_WALL_ZTYPE], <<0.0000, 0.0000, 116.9000>>)
ENDIF
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_CARSTEAL_3)
PRINTLN("<VEHGEN> Carsteal 3 complete. Marking JB700 as stolen.")
oCarstealWallLine[CARSTEAL_WALL_JB700] = CREATE_OBJECT(V_ILEV_UVLINE, <<471.48, lineZFwd, 29.82>>)
SET_ENTITY_COORDS(oCarstealWallLine[CARSTEAL_WALL_JB700], <<471.48, lineZFwd, 29.82>>)
SET_ENTITY_ROTATION(oCarstealWallLine[CARSTEAL_WALL_JB700], <<0.0000, 0.0000, 116.9000>>)
ENDIF
/* OLD Create line stroke objects.
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_CARSTEAL_1)
PRINTLN("<VEHGEN> Carsteal 1 complete. Marking EntityXF and Cheetah as stolen.")
oCarstealWallLine[CARSTEAL_WALL_ENTITYXF] = CREATE_OBJECT(V_ILEV_UVLINE, <<471.4763, -1308.540, 29.665>>)
SET_ENTITY_COORDS_NO_OFFSET(oCarstealWallLine[CARSTEAL_WALL_ENTITYXF], <<471.4763, -1308.540, 29.665>>)
SET_ENTITY_ROTATION(oCarstealWallLine[CARSTEAL_WALL_ENTITYXF], <<0.0000, 0.0000, 116.9000>>)
oCarstealWallLine[CARSTEAL_WALL_CHEETAH] = CREATE_OBJECT(V_ILEV_UVLINE, <<471.4763, -1308.540, 30.145>>)
SET_ENTITY_COORDS_NO_OFFSET(oCarstealWallLine[CARSTEAL_WALL_CHEETAH], <<471.4763, -1308.540, 30.145>>)
SET_ENTITY_ROTATION(oCarstealWallLine[CARSTEAL_WALL_CHEETAH], <<0.0000, 0.0000, 116.9000>>)
ENDIF
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_CARSTEAL_2)
PRINTLN("<VEHGEN> Carsteal 2 complete. Marking ZType as stolen.")
oCarstealWallLine[CARSTEAL_WALL_ZTYPE] = CREATE_OBJECT(V_ILEV_UVLINE, <<471.476, -1308.540, 29.525>>)
SET_ENTITY_COORDS_NO_OFFSET(oCarstealWallLine[CARSTEAL_WALL_ZTYPE], <<471.476, -1308.540, 29.525>>)
SET_ENTITY_ROTATION(oCarstealWallLine[CARSTEAL_WALL_ZTYPE], <<0.0000, 0.0000, 116.9000>>)
ENDIF
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_CARSTEAL_3)
PRINTLN("<VEHGEN> Carsteal 3 complete. Marking JB700 as stolen.")
oCarstealWallLine[CARSTEAL_WALL_JB700] = CREATE_OBJECT(V_ILEV_UVLINE, <<471.4763, -1308.540, 29.815>>)
SET_ENTITY_COORDS_NO_OFFSET(oCarstealWallLine[CARSTEAL_WALL_JB700], <<471.4763, -1308.540, 29.815>>)
SET_ENTITY_ROTATION(oCarstealWallLine[CARSTEAL_WALL_JB700], <<0.0000, 0.0000, 116.9000>>)
ENDIF
*/
//Configure objects.
INTERIOR_INSTANCE_INDEX intChopshop = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<475.1920, -1313.4802, 28.2074>>, "v_chopshop")
INT iLineIndex
REPEAT 6 iLineIndex
IF DOES_ENTITY_EXIST(oCarstealWallLine[iLineIndex])
SET_ENTITY_VISIBLE(oCarstealWallLine[iLineIndex], TRUE)
SET_ENTITY_ALWAYS_PRERENDER(oCarstealWallLine[iLineIndex], TRUE)
RETAIN_ENTITY_IN_INTERIOR(oCarstealWallLine[iLineIndex], intChopshop)
ENDIF
ENDREPEAT
SET_MODEL_AS_NO_LONGER_NEEDED(V_ILEV_UVLINE)
bCarstealWallUpdated = TRUE
ENDIF
ENDIF
ELSE
IF bCarstealWallLoaded
PRINTLN("<VEHGEN> Unloaded carsteal wall assets.")
SET_MODEL_AS_NO_LONGER_NEEDED(V_ILEV_UVLINE)
bCarstealWallLoaded = FALSE
ENDIF
IF bCarstealWallUpdated
PRINTLN("<VEHGEN> Left car steal wall area in chopshop.")
CLEANUP_CARSTEAL_WALL()
bCarstealWallUpdated = FALSE
ENDIF
ENDIF
ENDIF
ENDPROC
PROC SEND_DYNAMIC_EMAIL_FOR_PROPERTY_PURCHASE(VEHICLE_GEN_NAME_ENUM paramPurchased)
//Work out the dynamic thread and email thread to use.
DYNAMIC_EMAIL_THREAD_NAMES eDynamicThread
EMAIL_MESSAGE_ENUMS eEmailThread
SWITCH paramPurchased
CASE VEHGEN_WEB_CAR_MICHAEL
eDynamicThread = DYNAMIC_THREAD_BOUGHT_GARAGE_MIKE
eEmailThread = EMAIL_GARAGE_MIKE
BREAK
CASE VEHGEN_WEB_CAR_FRANKLIN
eDynamicThread = DYNAMIC_THREAD_BOUGHT_GARAGE_FRANKLIN
eEmailThread = EMAIL_GARAGE_FRANK
BREAK
CASE VEHGEN_WEB_CAR_TREVOR
eDynamicThread = DYNAMIC_THREAD_BOUGHT_GARAGE_TREVOR
eEmailThread = EMAIL_GARAGE_TREV
BREAK
CASE VEHGEN_WEB_HANGAR_MICHAEL
eDynamicThread = DYNAMIC_THREAD_BOUGHT_HANGAR_MIKE
eEmailThread = EMAIL_HANGAR_MIKE
BREAK
CASE VEHGEN_WEB_HANGAR_FRANKLIN
eDynamicThread = DYNAMIC_THREAD_BOUGHT_HANGAR_FRANKLIN
eEmailThread = EMAIL_HANGAR_FRANK
BREAK
CASE VEHGEN_WEB_HANGAR_TREVOR
eDynamicThread = DYNAMIC_THREAD_BOUGHT_HANGAR_TREVOR
eEmailThread = EMAIL_HANGAR_TREV
BREAK
CASE VEHGEN_WEB_MARINA_MICHAEL
eDynamicThread = DYNAMIC_THREAD_BOUGHT_MARINA_MIKE
eEmailThread = EMAIL_MARINA_MIKE
BREAK
CASE VEHGEN_WEB_MARINA_FRANKLIN
eDynamicThread = DYNAMIC_THREAD_BOUGHT_MARINA_FRANKLIN
eEmailThread = EMAIL_MARINA_FRANK
BREAK
CASE VEHGEN_WEB_MARINA_TREVOR
eDynamicThread = DYNAMIC_THREAD_BOUGHT_MARINA_TREVOR
eEmailThread = EMAIL_MARINA_TREV
BREAK
CASE VEHGEN_WEB_HELIPAD_MICHAEL
eDynamicThread = DYNAMIC_THREAD_BOUGHT_HELIPAD_MIKE
eEmailThread = EMAIL_HELIPAD_MIKE
BREAK
CASE VEHGEN_WEB_HELIPAD_FRANKLIN
eDynamicThread = DYNAMIC_THREAD_BOUGHT_HELIPAD_FRANKLIN
eEmailThread = EMAIL_HELIPAD_FRANK
BREAK
ENDSWITCH
ASSIGN_BUFFER_TO_DYNAMIC_EMAIL_THREAD(eDynamicThread)
INT iPrime = PRIME_EMAIL_FOR_FIRING_INTO_DYNAMIC_THREAD_IN_HOURS(eDynamicThread, eEmailThread, 1)
IF iPrime != 0
ELSE
//Couldn't do delayed send, purge.
RELEASE_DYNAMIC_THREAD_HOLD_ON_BUFFER(eDynamicThread)
//Try immediate send.
IF FIRE_EMAIL_INTO_DYNAMIC_THREAD(eDynamicThread, eEmailThread,TRUE)
PUSH_FEEDIFICATION_OF_DYNAMIC_THREAD(eDynamicThread)
RELEASE_DYNAMIC_THREAD_HOLD_ON_BUFFER(eDynamicThread)
ELSE
//Failed to make dynamic thread for this notification.
SCRIPT_ASSERT("SEND_DYNAMIC_EMAIL_FOR_PROPERTY_PURCHASE: Failed to send purchase notification email.")
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Query to find which player character owns each purchasable garage. Returns no
/// character for none purchasable garage vehicle gens.
FUNC enumCharacterList GET_PURCHASABLE_GARAGE_OWNER(VEHICLE_GEN_NAME_ENUM eGarage)
SWITCH eGarage
CASE VEHGEN_WEB_CAR_MICHAEL
CASE VEHGEN_MICHAEL_GARAGE_1
CASE VEHGEN_MICHAEL_GARAGE_2
CASE VEHGEN_MICHAEL_GARAGE_3
RETURN CHAR_MICHAEL
BREAK
CASE VEHGEN_WEB_CAR_TREVOR
CASE VEHGEN_TREVOR_GARAGE_1
CASE VEHGEN_TREVOR_GARAGE_2
CASE VEHGEN_TREVOR_GARAGE_3
RETURN CHAR_TREVOR
BREAK
CASE VEHGEN_WEB_CAR_FRANKLIN
CASE VEHGEN_FRANKLIN_GARAGE_1
CASE VEHGEN_FRANKLIN_GARAGE_2
CASE VEHGEN_FRANKLIN_GARAGE_3
RETURN CHAR_FRANKLIN
BREAK
ENDSWITCH
RETURN NO_CHARACTER
ENDFUNC
/// PURPOSE: Displays a menu allows the player to change the dyanmic vehicle data
PROC PROCESS_GARAGE_VEHICLE_SELECT()
// Placeholder stuff for now - only works with hangar
// This is tied into the purchasable vehicle gens
VEHICLE_SETUP_STRUCT_MP VehicleSetupMP
VEHICLE_SETUP_STRUCT sDLCVeh
BOOL bDisplayNoVehicleHelp = FALSE
BOOL bCursorAccept = FALSE
IF iVehicleMenuControl > 0
AND iVehicleMenuControl != 99
IF sGarageData.eClosestGen = VEHGEN_NONE
OR IS_PED_INJURED(PLAYER_PED_ID())
OR IS_PLAYER_BEING_ARRESTED(PLAYER_ID())
OR NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), sGarageData.sVehGenPurchData.vMenuPos1, sGarageData.sVehGenPurchData.vMenuPos2, sGarageData.sVehGenPurchData.fMenuWidth)
//OR IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE) B*1157533 let us use plane selector when in a vehicle - disable radio
OR (DOES_ENTITY_EXIST(g_sVehicleGenNSData.vehicleSelectID[sGarageData.eClosestGen]) AND IS_VEHICLE_DRIVEABLE(g_sVehicleGenNSData.vehicleSelectID[sGarageData.eClosestGen]) AND (IS_PED_ON_SPECIFIC_VEHICLE(PLAYER_PED_ID(), g_sVehicleGenNSData.vehicleSelectID[sGarageData.eClosestGen]) OR IS_PED_IN_VEHICLE(PLAYER_PED_ID(), g_sVehicleGenNSData.vehicleSelectID[sGarageData.eClosestGen], TRUE)))
OR ((DOES_ENTITY_EXIST(g_sVehicleGenNSData.vehicleSelectID[sGarageData.eClosestGen]) AND DOES_ENTITY_EXIST(PLAYER_PED_ID())) AND ( (GET_ENTITY_HEIGHT_ABOVE_GROUND(PLAYER_PED_ID()) - 1.0) > 0.15 AND IS_ENTITY_TOUCHING_ENTITY( PLAYER_PED_ID(), g_sVehicleGenNSData.vehicleSelectID[sGarageData.eClosestGen] ) ) ) // B* 2330436
OR ( ( DOES_ENTITY_EXIST( g_sVehicleGenNSData.vehicleSelectID[ sGarageData.eClosestGen ] ) AND DOES_ENTITY_EXIST( PLAYER_PED_ID() ) ) AND ( IS_PED_IN_VEHICLE( PLAYER_PED_ID(), g_sVehicleGenNSData.vehicleSelectID[ sGarageData.eClosestGen ], TRUE ) ) )
OR ( ( DOES_ENTITY_EXIST(PLAYER_PED_ID() ) ) AND ( IS_PED_GETTING_INTO_A_VEHICLE( PLAYER_PED_ID() ) ) )
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_FRIENDS)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_PREP)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_RANDOM_CHAR)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR)
OR (IS_REPEAT_PLAY_ACTIVE() != bRepeatPlayActiveState)
OR bDoTutorial
OR IS_PLAYER_UNDER_ATTACK()
CDEBUG1LN(DEBUG_GOLF, "[RBJ] - Kicked out here...")
iVehicleMenuControl = 99
ENDIF
ENDIF
SWITCH iVehicleMenuControl
CASE 0
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
AND NOT g_bBrowserVisible
AND NOT bDoTutorial
AND NOT IS_SCREEN_FADED_OUT()
IF sGarageData.sVehGenPurchData.bDataSet
AND sGarageData.iPurchaseControl = 0 // not running cutscne
AND (g_sVehicleGenNSData.eWebVehicles[0] != UNSET_BUYABLE_VEHICLE OR GET_NUMBER_OF_SPECIAL_VEHICLES() != 0)
AND sGarageData.eClosestGen != VEHGEN_NONE
AND NOT bExitGarageInDLCVehicle
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_FRIENDS)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_PREP)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_RANDOM_CHAR)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR)
AND NOT IS_PLAYER_UNDER_ATTACK()
IF (iGarageEntryContextID != NEW_CONTEXT_INTENTION)
//do nothing
ELSE
IF GET_VEHICLE_GEN_SAVED_FLAG_STATE(sGarageData.eClosestGen, VEHGEN_S_FLAG_AVAILABLE)
AND GET_VEHICLE_GEN_SAVED_FLAG_STATE(sGarageData.eClosestGen, VEHGEN_S_FLAG_ACQUIRED)
// IF NOT bLeaveAreaAfterPurchase
// DRAW_MARKER_FOR_TRIGGER_LOCATION(sGarageData.sVehGenPurchData.vBlipCoords)
// ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), sGarageData.sVehGenPurchData.vMenuPos1, sGarageData.sVehGenPurchData.vMenuPos2, sGarageData.sVehGenPurchData.fMenuWidth)
AND NOT IS_PED_CLIMBING(PLAYER_PED_ID())
AND NOT IS_ENTITY_ATTACHED(PLAYER_PED_ID())
IF NOT DOES_ENTITY_EXIST(g_sVehicleGenNSData.vehicleSelectID[sGarageData.eClosestGen])
OR NOT IS_VEHICLE_DRIVEABLE(g_sVehicleGenNSData.vehicleSelectID[sGarageData.eClosestGen])
OR (NOT IS_PED_ON_SPECIFIC_VEHICLE(PLAYER_PED_ID(), g_sVehicleGenNSData.vehicleSelectID[sGarageData.eClosestGen]) AND NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), g_sVehicleGenNSData.vehicleSelectID[sGarageData.eClosestGen], TRUE))
// Only allow the trigger if we have a vehicle...
INT i, j
// Check special vehicles
INT iDLCVehCount, iDLCVeh
iDLCVehCount = GET_NUMBER_OF_SPECIAL_VEHICLES()
REPEAT iDLCVehCount iDLCVeh
IF IS_VEHICLE_MODEL_SUITABLE_FOR_DYNAMIC_UPDATE(GET_SPECIAL_VEHICLE_MODEL(iDLCVeh))
j++
ENDIF
ENDREPEAT
// Check website vehicles
REPEAT COUNT_OF(g_sVehicleGenNSData.eWebVehicles) i
IF g_sVehicleGenNSData.eWebVehicles[i] != UNSET_BUYABLE_VEHICLE
IF GET_HAS_VEHICLE_BEEN_BOUGHT_FROM_WEBSITE(g_sVehicleGenNSData.eWebVehicles[i], eCurrentPlayerPed)
AND g_savedGlobals.sVehicleGenData.sWebVehicles[eCurrentPlayerPed].todEmailDate[g_sVehicleGenNSData.eWebVehicles[i]] = INVALID_TIMEOFDAY
AND (g_sVehicleGenNSData.eWebVehicles[i] != BV_NG_MARSHALL OR NOT g_savedGlobals.sCountryRaceData.bMarshallUnlocked)
j++
ENDIF
ENDIF
ENDREPEAT
IF j > 0
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
bLeaveAreaAfterPurchase = TRUE
IF sGarageData.iVehicleType = GVT_CAR
REGISTER_CONTEXT_INTENTION(iVehicleMenuContextID, CP_MEDIUM_PRIORITY, "WEB_VEH_TRIG2") // Press ~a~ to browse special vehicles.
ELSE
REGISTER_CONTEXT_INTENTION(iVehicleMenuContextID, CP_MEDIUM_PRIORITY, "WEB_VEH_TRIG") // Press ~a~ to change vehicle.
ENDIF
bRepeatPlayActiveState = IS_REPEAT_PLAY_ACTIVE()
iVehicleMenuControl++
ENDIF
ELIF NOT bLeaveAreaAfterPurchase
IF sGarageData.iVehicleType = GVT_PLANE
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("HANGAR_NO")
PRINT_HELP("HANGAR_NO")
tlSelectHelpPrinted = "HANGAR_NO"
ENDIF
bDisplayNoVehicleHelp = TRUE
ELIF sGarageData.iVehicleType = GVT_BOAT
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("MARINA_NO")
PRINT_HELP("MARINA_NO")
tlSelectHelpPrinted = "MARINA_NO"
ENDIF
bDisplayNoVehicleHelp = TRUE
ELIF sGarageData.iVehicleType = GVT_HELI
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("HELIPAD_NO")
PRINT_HELP("HELIPAD_NO")
tlSelectHelpPrinted = "HELIPAD_NO"
ENDIF
bDisplayNoVehicleHelp = TRUE
ELIF sGarageData.iVehicleType = GVT_CAR
TEXT_LABEL_15 tlLabel
tlLabel = "CAR_GAR_NO"
IF IS_PS3_VERSION()
OR IS_PLAYSTATION_PLATFORM()
tlLabel += "_1"
ELIF IS_XBOX360_VERSION()
OR IS_XBOX_PLATFORM()
tlLabel += "_2"
ENDIF
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(tlLabel)
PRINT_HELP(tlLabel)
tlSelectHelpPrinted = tlLabel
ENDIF
bDisplayNoVehicleHelp = TRUE
ENDIF
ENDIF
ENDIF
ELSE
bLeaveAreaAfterPurchase = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND LOAD_MENU_ASSETS()
IF (iGarageEntryContextID != NEW_CONTEXT_INTENTION)
iVehicleMenuControl = 0
EXIT
ENDIF
IF HAS_CONTEXT_BUTTON_TRIGGERED(iVehicleMenuContextID)
CLEAR_PED_TASKS(PLAYER_PED_ID())
IF (GET_CAM_VIEW_MODE_FOR_CONTEXT(GET_CAM_ACTIVE_VIEW_MODE_CONTEXT()) = CAM_VIEW_MODE_FIRST_PERSON)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ELSE
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
ENDIF
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_VEHICLE_DRIVEABLE(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
SET_VEHICLE_RADIO_ENABLED(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), FALSE) // B*1157533 - disable radio if player is using selector in a vehicle
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: PROCESS_GARAGE_VEHICLE_SELECT -> player's vehicle radio disabled")
ENDIF
ENDIF
SET_CURSOR_POSITION_FOR_MENU()
bMenuInitialised = FALSE
bMenuRebuild = FALSE
bConfirmUpdate = FALSE
iVehicleMenuSelection = -1
iVehicleMenuControl++
EXIT
ENDIF
ENDIF
BREAK
// Select vehicle
CASE 2
// Build the menu
IF NOT bMenuInitialised OR bMenuRebuild
CLEAR_MENU_DATA()
SET_MENU_ITEM_LAYOUT(MENU_ITEM_TEXT, MENU_ITEM_ICON)
SET_MENU_ITEM_JUSTIFICATION(FONT_LEFT, FONT_RIGHT)
SET_MENU_TITLE("WEB_VEH_TITLE")
INT i
REPEAT COUNT_OF(iVehicleMenuOptions) i
iVehicleMenuOptions[i] = 0
ENDREPEAT
INT iFirstMenuItem
iFirstMenuItem = -1
BOOL bVehicleSelectionCurrent
bVehicleSelectionCurrent = FALSE
INT iVeh, iItem
GET_VEHICLE_GEN_DATA(sGarageData.sVehGenData, sGarageData.eClosestGen)
// Grab the current item.
iItem = 0
// Check special vehicles
INT iDLCVehCount
iDLCVehCount = GET_NUMBER_OF_SPECIAL_VEHICLES()
REPEAT iDLCVehCount iVeh
IF IS_VEHICLE_MODEL_SUITABLE_FOR_DYNAMIC_UPDATE(GET_SPECIAL_VEHICLE_MODEL(iVeh))
IF iFirstMenuItem = -1
iFirstMenuItem = iItem
ENDIF
IF sGarageData.sVehGenData.model = GET_SPECIAL_VEHICLE_MODEL(iVeh)
PRINTLN("***Special vehicle is stored as default - veh=", iVeh, ", item=", iItem)
iVehicleMenuSelection = iItem
bVehicleSelectionCurrent = TRUE
ENDIF
iItem++
ENDIF
ENDREPEAT
// Check website vehicles
REPEAT COUNT_OF(g_sVehicleGenNSData.eWebVehicles) iVeh
IF g_sVehicleGenNSData.eWebVehicles[iVeh] != UNSET_BUYABLE_VEHICLE
IF GET_HAS_VEHICLE_BEEN_BOUGHT_FROM_WEBSITE(g_sVehicleGenNSData.eWebVehicles[iVeh], eCurrentPlayerPed)
AND g_savedGlobals.sVehicleGenData.sWebVehicles[eCurrentPlayerPed].todEmailDate[g_sVehicleGenNSData.eWebVehicles[iVeh]] = INVALID_TIMEOFDAY
AND (g_sVehicleGenNSData.eWebVehicles[iVeh] != BV_NG_MARSHALL OR NOT g_savedGlobals.sCountryRaceData.bMarshallUnlocked)
CONFIGURE_STRUCT_FOR_BUYABLE_VEHICLE(g_sVehicleGenNSData.eWebVehicles[iVeh], VehicleSetupMP, FALSE, eCurrentPlayerPed)
IF iFirstMenuItem = -1
iFirstMenuItem = iItem
ENDIF
IF sGarageData.sVehGenData.model = VehicleSetupMP.VehicleSetup.eModel
PRINTLN("***WEB vehicle is stored as default - veh=", iVeh, ", item=", iItem)
iVehicleMenuSelection = iItem
bVehicleSelectionCurrent = TRUE
ENDIF
iItem++
ENDIF
ENDIF
ENDREPEAT
IF iVehicleMenuSelection = -1
iVehicleMenuSelection = iFirstMenuItem
ENDIF
// Build the menu
iItem = 0
// Check special vehicles
iDLCVehCount = GET_NUMBER_OF_SPECIAL_VEHICLES()
REPEAT iDLCVehCount iVeh
IF IS_VEHICLE_MODEL_SUITABLE_FOR_DYNAMIC_UPDATE(GET_SPECIAL_VEHICLE_MODEL(iVeh))
//PRINTLN("DLC vehicle[", iVeh, "] name = ", GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(GET_SPECIAL_VEHICLE_MODEL(iVeh)))
PRINTLN("BUILD MENU: Adding special vehicle ", iVeh, " to menu slot ", iItem, ", label = ", GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(GET_SPECIAL_VEHICLE_MODEL(iVeh)))
SET_BIT(iVehicleMenuOptions[iItem/32], iItem%32)
ADD_MENU_ITEM_TEXT(iItem, GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(GET_SPECIAL_VEHICLE_MODEL(iVeh)))
IF iVehicleMenuSelection = iItem
AND bVehicleSelectionCurrent
AND sGarageData.iVehicleType != GVT_CAR
ADD_MENU_ITEM_ICON(iItem, MENU_ICON_TICK)
ELSE
ADD_MENU_ITEM_ICON(iItem, MENU_ICON_DUMMY)
ENDIF
iItem++
ENDIF
ENDREPEAT
// Check for website vehicles
REPEAT COUNT_OF(g_sVehicleGenNSData.eWebVehicles) iVeh
IF g_sVehicleGenNSData.eWebVehicles[iVeh] != UNSET_BUYABLE_VEHICLE
IF GET_HAS_VEHICLE_BEEN_BOUGHT_FROM_WEBSITE(g_sVehicleGenNSData.eWebVehicles[iVeh], eCurrentPlayerPed)
AND g_savedGlobals.sVehicleGenData.sWebVehicles[eCurrentPlayerPed].todEmailDate[g_sVehicleGenNSData.eWebVehicles[iVeh]] = INVALID_TIMEOFDAY
AND (g_sVehicleGenNSData.eWebVehicles[iVeh] != BV_NG_MARSHALL OR NOT g_savedGlobals.sCountryRaceData.bMarshallUnlocked)
PRINTLN("BUILD MENU: Adding WEB vehicle ", iVeh, " \"", GET_LABEL_BUYABLE_VEHICLE(g_sVehicleGenNSData.eWebVehicles[iVeh]), "\" to menu slot ", iItem)
SET_BIT(iVehicleMenuOptions[iItem/32], iItem%32)
CONFIGURE_STRUCT_FOR_BUYABLE_VEHICLE(g_sVehicleGenNSData.eWebVehicles[iVeh], VehicleSetupMP, FALSE, eCurrentPlayerPed)
IF (g_sVehicleGenNSData.eWebVehicles[iVeh] != BV_DLC_SWIFT)
ADD_MENU_ITEM_TEXT(iItem, GET_LABEL_BUYABLE_VEHICLE(g_sVehicleGenNSData.eWebVehicles[iVeh]))
ELSE
IF (VehicleSetupMP.VehicleSetup.iLivery = 0)
ADD_MENU_ITEM_TEXT(iItem,"TWOSTRINGS",2)
ADD_MENU_ITEM_TEXT_COMPONENT_STRING(GET_LABEL_BUYABLE_VEHICLE(g_sVehicleGenNSData.eWebVehicles[iVeh]))
ADD_MENU_ITEM_TEXT_COMPONENT_STRING("VNX_SWFTC") //Classic
ELIF (VehicleSetupMP.VehicleSetup.iLivery = 1)
ADD_MENU_ITEM_TEXT(iItem,"TWOSTRINGS",2)
ADD_MENU_ITEM_TEXT_COMPONENT_STRING(GET_LABEL_BUYABLE_VEHICLE(g_sVehicleGenNSData.eWebVehicles[iVeh]))
ADD_MENU_ITEM_TEXT_COMPONENT_STRING("VNX_SWFTB") //Flying Bravo
ELSE
ADD_MENU_ITEM_TEXT(iItem, GET_LABEL_BUYABLE_VEHICLE(g_sVehicleGenNSData.eWebVehicles[iVeh]))
ENDIF
ENDIF
IF iVehicleMenuSelection = iItem
AND bVehicleSelectionCurrent
ADD_MENU_ITEM_ICON(iItem, MENU_ICON_TICK)
ELSE
ADD_MENU_ITEM_ICON(iItem, MENU_ICON_DUMMY)
ENDIF
iItem++
ENDIF
ENDIF
ENDREPEAT
SET_CURRENT_MENU_ITEM(iVehicleMenuSelection)
bRebuildHelp = TRUE
bMenuRebuild = FALSE
bMenuInitialised = TRUE
ELSE
///////////////////////////////////
// Mouse menu support
bCursorAccept = FALSE
IF IS_PC_VERSION()
IF IS_USING_CURSOR(FRONTEND_CONTROL)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_LR)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_UD)
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_PAUSE_ALTERNATE)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CURSOR_ACCEPT)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CURSOR_CANCEL)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CURSOR_SCROLL_UP)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CURSOR_SCROLL_DOWN)
HANDLE_CURSOR_HIGHLIGHTED_MENU_ITEMS()
HANDLE_MENU_CURSOR(FALSE)
IF IS_MENU_CURSOR_ACCEPT_RELEASED()
IF g_iMenuCursorItem != iVehicleMenuSelection
PLAY_SOUND_FRONTEND(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET")
iVehicleMenuSelection = g_iMenuCursorItem
SET_CURRENT_MENU_ITEM(iVehicleMenuSelection)
bRebuildHelp = TRUE
ELSE
bCursorAccept = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
// Up
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_UP)
OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_SCROLL_UP)
bRebuildHelp = TRUE
PLAY_SOUND_FRONTEND(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET")
INT i
BOOL bItemFound
FOR i = (iVehicleMenuSelection-1) TO 0 STEP -1
IF IS_BIT_SET(iVehicleMenuOptions[i/32], i%32)
iVehicleMenuSelection = i
bItemFound = TRUE
i = 0 // Bail
ENDIF
ENDFOR
IF NOT bItemFound
FOR i = (COUNT_OF(iVehicleMenuOptions)*32)-1 TO (iVehicleMenuSelection+1) STEP -1
IF IS_BIT_SET(iVehicleMenuOptions[i/32], i%32)
iVehicleMenuSelection = i
bItemFound = TRUE
i = 0 // Bail
ENDIF
ENDFOR
ENDIF
IF bItemFound
SET_CURRENT_MENU_ITEM(iVehicleMenuSelection)
ENDIF
// Down
ELIF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_DOWN)
OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_SCROLL_DOWN)
bRebuildHelp = TRUE
PLAY_SOUND_FRONTEND(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET")
INT i
BOOL bItemFound
FOR i = (iVehicleMenuSelection+1) TO (COUNT_OF(iVehicleMenuOptions)*32)-1
IF IS_BIT_SET(iVehicleMenuOptions[i/32], i%32)
iVehicleMenuSelection = i
bItemFound = TRUE
i = (COUNT_OF(iVehicleMenuOptions)*32)+1 // Bail
ENDIF
ENDFOR
IF NOT bItemFound
FOR i = 0 TO (iVehicleMenuSelection-1)
IF IS_BIT_SET(iVehicleMenuOptions[i/32], i%32)
iVehicleMenuSelection = i
bItemFound = TRUE
i = (COUNT_OF(iVehicleMenuOptions)*32)+1 // Bail
ENDIF
ENDFOR
ENDIF
IF bItemFound
SET_CURRENT_MENU_ITEM(iVehicleMenuSelection)
ENDIF
// Select
ELIF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
OR bCursorAccept = TRUE
BOOL bVehicleSelected
bVehicleSelected = FALSE
bCursorAccept = FALSE
PLAY_SOUND_FRONTEND(-1, "SELECT", "HUD_FRONTEND_DEFAULT_SOUNDSET")
// Update stored vehicle
INT i, j
j = 0
// Special vehicles
INT iDLCVehCount
iDLCVehCount = GET_NUMBER_OF_SPECIAL_VEHICLES()
REPEAT iDLCVehCount i
IF IS_VEHICLE_MODEL_SUITABLE_FOR_DYNAMIC_UPDATE(GET_SPECIAL_VEHICLE_MODEL(i))
IF iVehicleMenuSelection = j
AND (sGarageData.sVehGenData.model != GET_SPECIAL_VEHICLE_MODEL(i)
OR NOT DOES_ENTITY_EXIST(g_sVehicleGenNSData.vehicleSelectID[sGarageData.eClosestGen])
OR NOT IS_VEHICLE_DRIVEABLE(g_sVehicleGenNSData.vehicleSelectID[sGarageData.eClosestGen])
OR sGarageData.eClosestGen = VEHGEN_WEB_CAR_MICHAEL OR sGarageData.eClosestGen = VEHGEN_WEB_CAR_FRANKLIN OR sGarageData.eClosestGen = VEHGEN_WEB_CAR_TREVOR)
PRINTLN("***DLC vehicle selected veh=", i, ", item=", j)
bVehicleSelected = TRUE
// Confirm
IF (NOT bConfirmUpdate AND sGarageData.sVehGenData.model != GET_SPECIAL_VEHICLE_MODEL(i))
OR (NOT bConfirmUpdate AND sGarageData.eClosestGen = VEHGEN_WEB_CAR_MICHAEL)
OR (NOT bConfirmUpdate AND sGarageData.eClosestGen = VEHGEN_WEB_CAR_FRANKLIN)
OR (NOT bConfirmUpdate AND sGarageData.eClosestGen = VEHGEN_WEB_CAR_TREVOR)
// IF sGarageData.iVehicleType = GVT_CAR
// SET_CURRENT_MENU_ITEM_DESCRIPTION("VEH_SELECT_CNF")
// ELSE
SET_CURRENT_MENU_ITEM_DESCRIPTION("VEH_SELECT_CNFA")
// ENDIF
REMOVE_MENU_HELP_KEYS()
ADD_MENU_HELP_KEY_INPUT( INPUT_FRONTEND_ACCEPT, "ITEM_YES")
ADD_MENU_HELP_KEY_INPUT( INPUT_FRONTEND_CANCEL, "ITEM_NO")
bConfirmUpdate = TRUE
i = GET_NUMBER_OF_SPECIAL_VEHICLES()+1 // Bail
ELSE
IF sGarageData.iVehicleType = GVT_CAR
IF HAS_SPAWN_VEHICLE_GOT_CUSTOM_SETUP(GET_SPECIAL_VEHICLE_MODEL(i))
eDLCModel = GET_SPECIAL_VEHICLE_MODEL(i)
bMenuInitialised = FALSE
bMenuRebuild = FALSE
iCustomVehicleSelection = 0
iVehicleMenuControl++
ELSE
bExitGarageInDLCVehicle = TRUE // Spawn player inside DLC vehicle
eDLCModel = GET_SPECIAL_VEHICLE_MODEL(i)
iVehicleMenuControl = 99
ENDIF
ELIF sGarageData.iVehicleType = GVT_PLANE // MARSHALL GOES TO HANGAR
AND HAS_SPAWN_VEHICLE_GOT_CUSTOM_SETUP(GET_SPECIAL_VEHICLE_MODEL(i))
eDLCModel = GET_SPECIAL_VEHICLE_MODEL(i)
bMenuInitialised = FALSE
bMenuRebuild = FALSE
iCustomVehicleSelection = 0
iVehicleMenuControl++
ELSE
// Delete the previous vehicle if it still exists
IF DOES_ENTITY_EXIST(g_sVehicleGenNSData.vehicleSelectID[sGarageData.eClosestGen])
SET_ENTITY_AS_MISSION_ENTITY(g_sVehicleGenNSData.vehicleSelectID[sGarageData.eClosestGen], FALSE, TRUE)
DELETE_VEHICLE(g_sVehicleGenNSData.vehicleSelectID[sGarageData.eClosestGen])
ENDIF
sDLCVeh.eModel = GET_SPECIAL_VEHICLE_MODEL(i)
SET_BIT(sDLCVeh.iFlags, VEHICLE_SETUP_FLAG_KEEP_DEFAULT_EXTRAS)
// // Fix for bug # 1950776 - Pick a random livery for this vehicle
// IF sDLCVeh.eModel = SWIFT
// sDLCVeh.iLivery = GET_RANDOM_INT_IN_RANGE(0, 2) // Possible return values {0,1}
// ENDIF
UPDATE_DYNAMIC_VEHICLE_GEN_DATA(sGarageData.eClosestGen, sDLCVeh, <<0,0,0>>, -1)
CLEAR_MUST_LEAVE_AREA_VEHICLE_GEN_FLAG(sGarageData.eClosestGen)
// Update the vehicle data...
GET_VEHICLE_GEN_DATA(sGarageData.sVehGenData, sGarageData.eClosestGen)
i = GET_NUMBER_OF_SPECIAL_VEHICLES()+1 // Bail
bMenuRebuild = TRUE
ENDIF
ENDIF
ENDIF
j++
ENDIF
ENDREPEAT
// Website vehicles
IF NOT bVehicleSelected
REPEAT COUNT_OF(g_sVehicleGenNSData.eWebVehicles) i
IF g_sVehicleGenNSData.eWebVehicles[i] != UNSET_BUYABLE_VEHICLE
IF GET_HAS_VEHICLE_BEEN_BOUGHT_FROM_WEBSITE(g_sVehicleGenNSData.eWebVehicles[i], eCurrentPlayerPed)
AND g_savedGlobals.sVehicleGenData.sWebVehicles[eCurrentPlayerPed].todEmailDate[g_sVehicleGenNSData.eWebVehicles[i]] = INVALID_TIMEOFDAY
AND (g_sVehicleGenNSData.eWebVehicles[i] != BV_NG_MARSHALL OR NOT g_savedGlobals.sCountryRaceData.bMarshallUnlocked)
CONFIGURE_STRUCT_FOR_BUYABLE_VEHICLE(g_sVehicleGenNSData.eWebVehicles[i], VehicleSetupMP, FALSE, eCurrentPlayerPed)
IF iVehicleMenuSelection = j
AND (sGarageData.sVehGenData.model != VehicleSetupMP.VehicleSetup.eModel
OR NOT DOES_ENTITY_EXIST(g_sVehicleGenNSData.vehicleSelectID[sGarageData.eClosestGen])
OR NOT IS_VEHICLE_DRIVEABLE(g_sVehicleGenNSData.vehicleSelectID[sGarageData.eClosestGen]))
PRINTLN("***WEB vehicle selected veh=", i, ", item=", j, ", VehicleSetupMP.VehicleSetup.eModel=", GET_MODEL_NAME_FOR_DEBUG(VehicleSetupMP.VehicleSetup.eModel))
bVehicleSelected = TRUE
// Confirm
IF NOT bConfirmUpdate
IF sGarageData.iVehicleType = GVT_CAR
SET_CURRENT_MENU_ITEM_DESCRIPTION("VEH_SELECT_CNF")
ELSE
SET_CURRENT_MENU_ITEM_DESCRIPTION("VEH_SELECT_CNFA")
ENDIF
REMOVE_MENU_HELP_KEYS()
ADD_MENU_HELP_KEY_INPUT( INPUT_FRONTEND_ACCEPT, "ITEM_YES")
ADD_MENU_HELP_KEY_INPUT( INPUT_FRONTEND_CANCEL, "ITEM_NO")
bConfirmUpdate = TRUE
i = COUNT_OF(g_sVehicleGenNSData.eWebVehicles)+1 // Bail
ELIF VehicleSetupMP.VehicleSetup.eModel = MARSHALL
iVehicleMenuControl = 3
bMenuRebuild = TRUE
i = COUNT_OF(g_sVehicleGenNSData.eWebVehicles)+1 // Bail
ELSE
// Delete the previous vehicle if it still exists
IF DOES_ENTITY_EXIST(g_sVehicleGenNSData.vehicleSelectID[sGarageData.eClosestGen])
SET_ENTITY_AS_MISSION_ENTITY(g_sVehicleGenNSData.vehicleSelectID[sGarageData.eClosestGen], FALSE, TRUE)
DELETE_VEHICLE(g_sVehicleGenNSData.vehicleSelectID[sGarageData.eClosestGen])
ENDIF
CONFIGURE_STRUCT_FOR_BUYABLE_VEHICLE(g_sVehicleGenNSData.eWebVehicles[i], VehicleSetupMP, FALSE, eCurrentPlayerPed)
SET_BIT(VehicleSetupMP.VehicleSetup.iFlags, VEHICLE_SETUP_FLAG_KEEP_DEFAULT_EXTRAS)
// Deploy landing gear for planes
IF IS_THIS_MODEL_A_PLANE(VehicleSetupMP.VehicleSetup.eModel)
SET_BIT(VehicleSetupMP.VehicleSetup.iFlags, VEHICLE_SETUP_FLAG_LANDING_GEAR_OUT)
ENDIF
UPDATE_DYNAMIC_VEHICLE_GEN_DATA(sGarageData.eClosestGen, VehicleSetupMP.VehicleSetup, <<0,0,0>>, -1)
CLEAR_MUST_LEAVE_AREA_VEHICLE_GEN_FLAG(sGarageData.eClosestGen)
// Update the vehicle data...
GET_VEHICLE_GEN_DATA(sGarageData.sVehGenData, sGarageData.eClosestGen)
i = COUNT_OF(g_sVehicleGenNSData.eWebVehicles)+1 // Bail
bMenuRebuild = TRUE
ENDIF
ENDIF
j++
ENDIF
ENDIF
ENDREPEAT
ENDIF
// Exit/Decline
ELIF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
OR IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_CURSOR_CANCEL)
PLAY_SOUND_FRONTEND(-1, "BACK", "HUD_FRONTEND_DEFAULT_SOUNDSET")
// Decline
IF bConfirmUpdate
bRebuildHelp = TRUE
bConfirmUpdate = FALSE
ELSE
iVehicleMenuControl = 99
ENDIF
ENDIF
ENDIF
HIDE_HUD_AND_RADAR_THIS_FRAME()
IF bRebuildHelp
SET_CURRENT_MENU_ITEM_DESCRIPTION("")
REMOVE_MENU_HELP_KEYS()
ADD_MENU_HELP_KEY_INPUT( INPUT_FRONTEND_ACCEPT, "ITEM_SELECT")
ADD_MENU_HELP_KEY_INPUT( INPUT_FRONTEND_CANCEL, "ITEM_EXIT")
bConfirmUpdate = FALSE
bRebuildHelp = FALSE
ENDIF
DRAW_MENU()
BREAK
// Select custom setup
CASE 3
// Build the menu
IF NOT bMenuInitialised OR bMenuRebuild
CLEAR_MENU_DATA()
SET_MENU_ITEM_LAYOUT(MENU_ITEM_TEXT)
SET_MENU_ITEM_JUSTIFICATION(FONT_LEFT)
INT i
REPEAT COUNT_OF(iCustomVehicleOptions) i
iCustomVehicleOptions[i] = 0
ENDREPEAT
// Add all the custom spawn options for this vehicle.
SET_MENU_TITLE("WEB_VEH_TITLE2") // SELECT FLAG
TEXT_LABEL_15 tlTempLabel
REPEAT 25 i
tlTempLabel = "WEB_VEH_FLAG_"
tlTempLabel += i
ADD_MENU_ITEM_TEXT(i, tlTempLabel)
SET_BIT(iCustomVehicleOptions[i/32], i%32)
ENDREPEAT
IF sData.ped = CHAR_MICHAEL
iCustomVehicleSelection = ENUM_TO_INT(g_savedGlobals.sBuyableVehicleSavedData.g_eOwnedVehicleColoursM[BV_NG_MARSHALL])
ELIF sData.ped = CHAR_FRANKLIN
iCustomVehicleSelection = ENUM_TO_INT(g_savedGlobals.sBuyableVehicleSavedData.g_eOwnedVehicleColoursF[BV_NG_MARSHALL])
ELSE
iCustomVehicleSelection = ENUM_TO_INT(g_savedGlobals.sBuyableVehicleSavedData.g_eOwnedVehicleColoursT[BV_NG_MARSHALL])
ENDIF
SET_CURRENT_MENU_ITEM(iCustomVehicleSelection)
bRebuildHelp = TRUE
bMenuRebuild = FALSE
bMenuInitialised = TRUE
ELSE
///////////////////////////////////
// Mouse menu support
bCursorAccept = FALSE
IF IS_PC_VERSION()
IF IS_USING_CURSOR(FRONTEND_CONTROL)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_LR)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_UD)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CURSOR_ACCEPT)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CURSOR_CANCEL)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CURSOR_SCROLL_UP)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CURSOR_SCROLL_DOWN)
HANDLE_CURSOR_HIGHLIGHTED_MENU_ITEMS()
HANDLE_MENU_CURSOR(FALSE)
IF IS_MENU_CURSOR_ACCEPT_RELEASED()
IF g_iMenuCursorItem != iCustomVehicleSelection
PLAY_SOUND_FRONTEND(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET")
iCustomVehicleSelection = g_iMenuCursorItem
SET_CURRENT_MENU_ITEM(iCustomVehicleSelection)
bRebuildHelp = TRUE
ELSE
bCursorAccept = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
// Up
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_UP)
OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_SCROLL_UP)
bRebuildHelp = TRUE
PLAY_SOUND_FRONTEND(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET")
INT i
BOOL bItemFound
FOR i = (iCustomVehicleSelection-1) TO 0 STEP -1
IF IS_BIT_SET(iCustomVehicleOptions[i/32], i%32)
iCustomVehicleSelection = i
bItemFound = TRUE
i = 0 // Bail
ENDIF
ENDFOR
IF NOT bItemFound
FOR i = 31 TO (iCustomVehicleSelection+1) STEP -1
IF IS_BIT_SET(iCustomVehicleOptions[i/32], i%32)
iCustomVehicleSelection = i
bItemFound = TRUE
i = iCustomVehicleSelection // Bail
ENDIF
ENDFOR
ENDIF
IF bItemFound
SET_CURRENT_MENU_ITEM(iCustomVehicleSelection)
ENDIF
// Down
ELIF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_DOWN)
OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_SCROLL_DOWN)
bRebuildHelp = TRUE
PLAY_SOUND_FRONTEND(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET")
INT i
BOOL bItemFound
FOR i = (iCustomVehicleSelection+1) TO 31
IF IS_BIT_SET(iCustomVehicleOptions[i/32], i%32)
iCustomVehicleSelection = i
bItemFound = TRUE
i = 31 // Bail
ENDIF
ENDFOR
IF NOT bItemFound
FOR i = 0 TO (iCustomVehicleSelection-1)
IF IS_BIT_SET(iCustomVehicleOptions[i/32], i%32)
iCustomVehicleSelection = i
bItemFound = TRUE
i = iCustomVehicleSelection // Bail
ENDIF
ENDFOR
ENDIF
IF bItemFound
SET_CURRENT_MENU_ITEM(iCustomVehicleSelection)
ENDIF
// Select
ELIF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
OR bCursorAccept = TRUE
bCursorAccept = FALSE
PLAY_SOUND_FRONTEND(-1, "SELECT", "HUD_FRONTEND_DEFAULT_SOUNDSET")
// Delete the previous vehicle if it still exists
IF DOES_ENTITY_EXIST(g_sVehicleGenNSData.vehicleSelectID[sGarageData.eClosestGen])
SET_ENTITY_AS_MISSION_ENTITY(g_sVehicleGenNSData.vehicleSelectID[sGarageData.eClosestGen], FALSE, TRUE)
DELETE_VEHICLE(g_sVehicleGenNSData.vehicleSelectID[sGarageData.eClosestGen])
ENDIF
SITE_BUYABLE_VEHICLE_COLOURS eCol
eCol = INT_TO_ENUM(SITE_BUYABLE_VEHICLE_COLOURS, iCustomVehicleSelection+1)
PRINTLN("***WEB vehicle selected eCol=", eCol)
IF eCurrentPlayerPed = CHAR_MICHAEL
g_savedGlobals.sBuyableVehicleSavedData.g_eOwnedVehicleColoursM[BV_NG_MARSHALL] = eCol
ELIF eCurrentPlayerPed = CHAR_FRANKLIN
g_savedGlobals.sBuyableVehicleSavedData.g_eOwnedVehicleColoursF[BV_NG_MARSHALL] = eCol
ELIF eCurrentPlayerPed = CHAR_TREVOR
g_savedGlobals.sBuyableVehicleSavedData.g_eOwnedVehicleColoursT[BV_NG_MARSHALL] = eCol
ELSE
PRINTLN("***WEB vehicle selected invalid eCurrentPlayerPed=", eCurrentPlayerPed)
ENDIF
CONFIGURE_STRUCT_FOR_BUYABLE_VEHICLE(BV_NG_MARSHALL, VehicleSetupMP, FALSE, eCurrentPlayerPed)
SET_BIT(VehicleSetupMP.VehicleSetup.iFlags, VEHICLE_SETUP_FLAG_KEEP_DEFAULT_EXTRAS)
// Deploy landing gear for planes
IF IS_THIS_MODEL_A_PLANE(VehicleSetupMP.VehicleSetup.eModel)
SET_BIT(VehicleSetupMP.VehicleSetup.iFlags, VEHICLE_SETUP_FLAG_LANDING_GEAR_OUT)
ENDIF
UPDATE_DYNAMIC_VEHICLE_GEN_DATA(sGarageData.eClosestGen, VehicleSetupMP.VehicleSetup, <<0,0,0>>, -1)
CLEAR_MUST_LEAVE_AREA_VEHICLE_GEN_FLAG(sGarageData.eClosestGen)
// Update the vehicle data...
GET_VEHICLE_GEN_DATA(sGarageData.sVehGenData, sGarageData.eClosestGen)
bMenuRebuild = TRUE
iVehicleMenuControl = 2
// Backup
ELIF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
OR IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_CURSOR_CANCEL)
PLAY_SOUND_FRONTEND(-1, "BACK", "HUD_FRONTEND_DEFAULT_SOUNDSET")
// Backup
bMenuInitialised = FALSE
bMenuRebuild = FALSE
iVehicleMenuControl--
ENDIF
ENDIF
HIDE_HUD_AND_RADAR_THIS_FRAME()
IF bRebuildHelp
SET_CURRENT_MENU_ITEM_DESCRIPTION("")
REMOVE_MENU_HELP_KEYS()
ADD_MENU_HELP_KEY_INPUT( INPUT_FRONTEND_ACCEPT, "ITEM_SELECT")
ADD_MENU_HELP_KEY_INPUT( INPUT_FRONTEND_CANCEL, "ITEM_EXIT")
bConfirmUpdate = FALSE
bRebuildHelp = FALSE
ENDIF
DRAW_MENU()
BREAK
CASE 70
BREAK
CASE 99
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_VEHICLE_DRIVEABLE(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
IF NOT IS_PLAYER_VEH_RADIO_ENABLE()
SET_VEHICLE_RADIO_ENABLED(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), TRUE) // B*1157533 - disable radio if player is using selector in a vehicle
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: PROCESS_GARAGE_VEHICLE_SELECT -> player's vehicle radio enabled")
ENDIF
ENDIF
ENDIF
CLEANUP_MENU_ASSETS()
iVehicleMenuControl = 0
RELEASE_CONTEXT_INTENTION(iVehicleMenuContextID)
iVehicleMenuContextID = NEW_CONTEXT_INTENTION
BREAK
ENDSWITCH
IF NOT bDisplayNoVehicleHelp
AND IS_HELP_MESSAGE_BEING_DISPLAYED()
IF NOT IS_STRING_NULL_OR_EMPTY(tlSelectHelpPrinted)
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("HANGAR_NO")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("MARINA_NO")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("HELIPAD_NO")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CAR_GAR_NO_1")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CAR_GAR_NO_2")
CLEAR_HELP()
ENDIF
tlSelectHelpPrinted = ""
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Update the dyanmic vehicle gen if player lands/parks a new vehicle on the spot.
PROC PROCESS_GARAGE_VEHICLE_DROPOFF()
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF sGarageData.sVehGenPurchData.bDataSet
AND NOT sGarageData.sVehGenPurchData.bWarpToGarage // no longer allowing car garage to use dropoff method.
AND sGarageData.eClosestGen != VEHGEN_NONE
AND GET_VEHICLE_GEN_SAVED_FLAG_STATE(sGarageData.eClosestGen, VEHGEN_S_FLAG_AVAILABLE)
AND GET_VEHICLE_GEN_SAVED_FLAG_STATE(sGarageData.eClosestGen, VEHGEN_S_FLAG_ACQUIRED)
AND GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("michael1")) = 0
IF NOT DOES_ENTITY_EXIST(sGarageData.vehTrack)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX vehTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(vehTemp)
AND IS_VEHICLE_DRIVEABLE(vehTemp)
MODEL_NAMES eModel = GET_ENTITY_MODEL(vehTemp)
IF IS_VEHICLE_MODEL_SUITABLE_FOR_DYNAMIC_UPDATE(eModel)
sGarageData.vehTrack = vehTemp
ENDIF
ENDIF
ENDIF
ELIF IS_VEHICLE_DRIVEABLE(sGarageData.vehTrack)
AND IS_VEHICLE_MODEL_SUITABLE_FOR_DYNAMIC_UPDATE(GET_ENTITY_MODEL(sGarageData.vehTrack))
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sGarageData.vehTrack)
IF IS_ENTITY_IN_ANGLED_AREA(sGarageData.vehTrack, sGarageData.sVehGenPurchData.vStorePos1, sGarageData.sVehGenPurchData.vStorePos2, sGarageData.sVehGenPurchData.fStoreWidth)
IF NOT IS_VEHICLE_IN_TEMP_PLAYER_VEHICLE_ID_LIST(sGarageData.vehTrack)
AND NOT IS_VEHICLE_IN_TEMP_NPC_VEHICLE_ID_LIST(sGarageData.vehTrack)
AND sGarageData.vehTrack != g_sVehicleGenNSData.vehicleSelectID[sGarageData.eClosestGen]
#IF IS_DEBUG_BUILD
PRINTLN("PROCESS_GARAGE_VEHICLE_DROPOFF - Player has left a vehicle in the garage area for vehgen ", sGarageData.sVehGenData.dbg_name, ".")
#ENDIF
SET_VEHICLE_GEN_VEHICLE(sGarageData.eClosestGen, sGarageData.vehTrack)
ENDIF
sGarageData.vehTrack = NULL
ENDIF
ENDIF
ELSE
sGarageData.vehTrack = NULL
ENDIF
ELSE
sGarageData.vehTrack = NULL
ENDIF
ENDIF
ENDPROC
FUNC VEHICLE_GEN_NAME_ENUM GET_GARAGE_VEHICLE_GEN_PLAYER_IS_IN()
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX vehID = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(vehID)
AND IS_VEHICLE_DRIVEABLE(vehID)
IF vehID = g_sVehicleGenNSData.vehicleSelectID[VEHGEN_WEB_CAR_MICHAEL] RETURN VEHGEN_WEB_CAR_MICHAEL ENDIF
IF vehID = g_sVehicleGenNSData.vehicleSelectID[VEHGEN_MICHAEL_GARAGE_1] RETURN VEHGEN_MICHAEL_GARAGE_1 ENDIF
IF vehID = g_sVehicleGenNSData.vehicleSelectID[VEHGEN_MICHAEL_GARAGE_2] RETURN VEHGEN_MICHAEL_GARAGE_2 ENDIF
IF vehID = g_sVehicleGenNSData.vehicleSelectID[VEHGEN_MICHAEL_GARAGE_3] RETURN VEHGEN_MICHAEL_GARAGE_3 ENDIF
IF vehID = g_sVehicleGenNSData.vehicleSelectID[VEHGEN_WEB_CAR_FRANKLIN] RETURN VEHGEN_WEB_CAR_FRANKLIN ENDIF
IF vehID = g_sVehicleGenNSData.vehicleSelectID[VEHGEN_FRANKLIN_GARAGE_1] RETURN VEHGEN_FRANKLIN_GARAGE_1 ENDIF
IF vehID = g_sVehicleGenNSData.vehicleSelectID[VEHGEN_FRANKLIN_GARAGE_2] RETURN VEHGEN_FRANKLIN_GARAGE_2 ENDIF
IF vehID = g_sVehicleGenNSData.vehicleSelectID[VEHGEN_FRANKLIN_GARAGE_3] RETURN VEHGEN_FRANKLIN_GARAGE_3 ENDIF
IF vehID = g_sVehicleGenNSData.vehicleSelectID[VEHGEN_WEB_CAR_TREVOR] RETURN VEHGEN_WEB_CAR_TREVOR ENDIF
IF vehID = g_sVehicleGenNSData.vehicleSelectID[VEHGEN_TREVOR_GARAGE_1] RETURN VEHGEN_TREVOR_GARAGE_1 ENDIF
IF vehID = g_sVehicleGenNSData.vehicleSelectID[VEHGEN_TREVOR_GARAGE_2] RETURN VEHGEN_TREVOR_GARAGE_2 ENDIF
IF vehID = g_sVehicleGenNSData.vehicleSelectID[VEHGEN_TREVOR_GARAGE_3] RETURN VEHGEN_TREVOR_GARAGE_3 ENDIF
ENDIF
ENDIF
RETURN VEHGEN_NONE
ENDFUNC
FUNC BOOL IS_PLAYER_IN_SUITABLE_STAGE_FOR_GARAGE()
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
OR GET_FREE_VEHICLE_GEN_SLOT_IN_GARAGE(sGarageData.eClosestGen) != VEHGEN_NONE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC EARLY_REQUEST_GARAGE_VEHICLES(VEHICLE_GEN_NAME_ENUM eGarage)
INT i, iSlot //Dynamic vehicle slot
VEHICLE_GEN_NAME_ENUM eName
REPEAT 4 i //4 vehicle gens per garage
eName = eGarage
iSlot = 9 + ENUM_TO_INT(eName - VEHGEN_WEB_CAR_MICHAEL) //Web_Car_Michael starts at 1
IF i > 0
//This section grabs all the related player garage vehicle slots, check the Enum order for the formula
//If the enums change/move this WILL BREAK
eName = INT_TO_ENUM(VEHICLE_GEN_NAME_ENUM,ENUM_TO_INT(eName) + 2 + i*3)
iSlot = 9 + ENUM_TO_INT(eName - VEHGEN_WEB_CAR_MICHAEL) - 2
ENDIF
eVehicleModel[eName] = g_savedGlobals.sVehicleGenData.sDynamicData[iSlot].eModel
IF eVehicleModel[eName] != INT_TO_ENUM(MODEL_NAMES, 0)
IF NOT IS_BIT_SET(iVehGenProcessFlags[eName], VEHGEN_BIT_FLAG_VEHICLE_MODEL_REQ)
REQUEST_MODEL(eVehicleModel[eName])
SET_BIT(iVehGenProcessFlags[eName], VEHGEN_BIT_FLAG_VEHICLE_MODEL_REQ)
ADD_VEHICLE_GEN_TO_PROCESS_LIST(eName)
ENDIF
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE: Warp the player into their garage and manage vehicles.
PROC PROCESS_GARAGE_VEHICLE_WARP()
// Note, we only deal with v_garagem in singleplayer to cool to hardcode values here for quickness.
PED_INDEX nearbyPeds[10]
BOOL bPrintWarpHelp = FALSE
VEHICLE_INDEX currentVeh
CONST_INT iCONST_WARP_0 0
CONST_INT iCONST_WARP_1 1
CONST_INT iCONST_WARP_2 2
CONST_INT iCONST_WARP_3_enterVeh 3
CONST_INT iCONST_WARP_3_5 35
CONST_INT iCONST_WARP_4_enterPed 4
CONST_INT iCONST_WARP_5_fadingOutPed 5
CONST_INT iCONST_WARP_6_fadingInPed 6
CONST_INT iCONST_WARP_10 10
CONST_INT iCONST_WARP_11_exitPed 11
CONST_INT iCONST_WARP_12_exitVehInt 12
CONST_INT iCONST_WARP_13_exitFadingOut 13
CONST_INT iCONST_WARP_14_exitFadein 14
CONST_INT iCONST_WARP_15_exitVehExt 15
CONST_INT iCONST_WARP_16 16
CONST_INT iCONST_WARP_17 17
CONST_INT iCONST_WARP_18 18
IF (sGarageData.sVehGenPurchData.bDataSet
AND sGarageData.sVehGenPurchData.bWarpToGarage
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
AND sGarageData.iPurchaseControl = 0
AND sGarageData.eClosestGen != VEHGEN_NONE
AND GET_VEHICLE_GEN_SAVED_FLAG_STATE(sGarageData.eClosestGen, VEHGEN_S_FLAG_AVAILABLE)
AND GET_VEHICLE_GEN_SAVED_FLAG_STATE(sGarageData.eClosestGen, VEHGEN_S_FLAG_ACQUIRED)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_FRIENDS)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_PREP)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_RANDOM_CHAR)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_RANDOM_EVENT)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR)
AND NOT g_bBrowserVisible
AND NOT IS_REPEAT_PLAY_ACTIVE(TRUE)
AND NOT IS_PLAYER_PED_SWITCH_IN_PROGRESS())
OR (sGarageData.iWarpControl > iCONST_WARP_1 AND NOT IS_REPEAT_PLAY_ACTIVE() AND NOT IS_PED_INJURED(PLAYER_PED_ID()) AND NOT IS_PLAYER_PED_SWITCH_IN_PROGRESS())
Private_GET_GARAGE_VEHICLE_WARP_DATA(sGarageData.eClosestGen, sGarageVehicleWarpData)
FLOAT fStrOffset = 0.0
#IF IS_DEBUG_BUILD
INT iRed, iGreen, iBlue, iAlpha
IF sGarageData.iWarpControl = iCONST_WARP_0
GET_HUD_COLOUR(HUD_COLOUR_RED, iRed, iGreen, iBlue, iAlpha)
ELIF sGarageData.iWarpControl < iCONST_WARP_10
GET_HUD_COLOUR(HUD_COLOUR_GREEN, iRed, iGreen, iBlue, iAlpha)
ELSE
GET_HUD_COLOUR(HUD_COLOUR_BLUE, iRed, iGreen, iBlue, iAlpha)
ENDIF
TEXT_LABEL_63 str = "sGarageData.iWarpControl: iCONST_WARP_"
str += sGarageData.iWarpControl
IF sGarageData.iWarpControl > iCONST_WARP_0
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
ENDIF
#ENDIF
STRING sOpenGarageAnimDict = "ANIM@APT_TRANS@GARAGE"
VECTOR vGarageM_SP_coord = <<198.3659, -1020.2732, -100.0000>>
VECTOR vGarageInteriorPos = vGarageM_SP_coord
VECTOR vGarageOnfootWarp = <<198.9538, -1026.1301, -100.0000>>
CONST_INT iGarageHold 2250
CONST_FLOAT fGARAGE_OPEN_PHASE 0.4 //0.5
enumCharacterList eClosestGarageOwner = GET_PURCHASABLE_GARAGE_OWNER(sGarageData.eClosestGen)
SWITCH sGarageData.iWarpControl
CASE iCONST_WARP_0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<207.433578,-1019.795410,-100.472763>>, <<189.933777,-1019.623474,-95.568832>>, 17.187500)
AND NOT IS_PLAYER_SWITCH_IN_PROGRESS()
sGarageData.iWarpControl = iCONST_WARP_10
PRINTLN("PROCESS_GARAGE_VEHICLE_WARP - set player as \"inside garage\" since he IS inside garage!")
EXIT
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), sGarageData.sVehGenPurchData.vBuyPos1, sGarageData.sVehGenPurchData.vBuyPos2, sGarageData.sVehGenPurchData.fBuyWidth)
AND (IS_HEADING_ACCEPTABLE(GET_ENTITY_HEADING(PLAYER_PED_ID()), sGarageData.sVehGenPurchData.fDoorHeading, 90.0) OR IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID()))
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
AND NOT IS_PED_BEING_JACKED(PLAYER_PED_ID())
AND NOT IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID())
AND NOT GET_IS_TASK_ACTIVE(PLAYER_PED_ID(), CODE_TASK_EXIT_VEHICLE)
AND (eClosestGarageOwner = eCurrentPlayerPed OR eClosestGarageOwner = NO_CHARACTER)
IF IS_PLAYER_IN_SUITABLE_STAGE_FOR_GARAGE()
BOOL bSafe
bSafe = TRUE
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE)
currentVeh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID(), TRUE)
IF DOES_ENTITY_EXIST(currentVeh)
IF IS_VEHICLE_DRIVEABLE(currentVeh)
MODEL_NAMES eModel
eModel = GET_ENTITY_MODEL(currentVeh)
IF NOT IS_VEHICLE_MODEL_SUITABLE_FOR_DYNAMIC_UPDATE(eModel)
OR IS_VEHICLE_IN_TEMP_PLAYER_VEHICLE_ID_LIST(currentVeh)
OR IS_VEHICLE_IN_TEMP_NPC_VEHICLE_ID_LIST(currentVeh)
OR NOT IS_VEHICLE_AVAILABLE_FOR_GAME(eModel)
OR IS_BIG_VEHICLE(currentVeh)
OR (NOT IS_THIS_MODEL_A_CAR(eModel) AND NOT IS_THIS_MODEL_A_BIKE(eModel) AND NOT IS_THIS_MODEL_A_QUADBIKE(eModel))
OR eModel = MONSTER
OR IS_ENTITY_ON_FIRE(currentVeh)
OR IS_VEHICLE_ATTACHED_TO_TRAILER(currentVeh)
OR (IS_PED_IN_ANY_TAXI(PLAYER_PED_ID()) AND GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("taxi_procedural")) > 0)
bSafe = FALSE
ENDIF
ELSE
bSafe = FALSE
ENDIF
ENDIF
ELSE
IF DOES_ANIM_DICT_EXIST(sOpenGarageAnimDict)
REQUEST_ANIM_DICT(sOpenGarageAnimDict)
IF NOT HAS_ANIM_DICT_LOADED(sOpenGarageAnimDict)
bSafe = FALSE
ENDIF
ENDIF
ENDIF
IF bSafe
REGISTER_CONTEXT_INTENTION(iGarageEntryContextID, CP_MEDIUM_PRIORITY, "WEB_VEH_ENTER") // Press ~a~ to enter garage.
bFakeGarageReverse = FALSE
sGarageData.iWarpControl = iCONST_WARP_1
ELSE
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE)
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("WEB_VEH_INV")
PRINT_HELP("WEB_VEH_INV")
tlWarpHelpPrinted = "WEB_VEH_INV"
bPrintWarpHelp = TRUE
ENDIF
ELSE
//waiting on animation...
ENDIF
ENDIF
ELSE
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("WEB_VEH_FULL")
PRINT_HELP("WEB_VEH_FULL")
tlWarpHelpPrinted = "WEB_VEH_FULL"
bPrintWarpHelp = TRUE
ENDIF
ENDIF
ENDIF
BREAK
CASE iCONST_WARP_1
IF NOT bAnimDictLoadSceneStartedFromVehGen
IF NOT IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
bAnimDictLoadSceneStartedFromVehGen = FALSE
REQUEST_ANIM_DICT(sOpenGarageAnimDict)
IF HAS_ANIM_DICT_LOADED(sOpenGarageAnimDict)
PRINTLN("PROCESS_GARAGE_VEHICLE_WARP - anim dict \"", sOpenGarageAnimDict, "\" loaded")
bAnimDictLoadSceneStartedFromVehGen = TRUE
ENDIF
ELSE
PRINTLN("PROCESS_GARAGE_VEHICLE_WARP - remove anim dict \"", sOpenGarageAnimDict, "\"")
REMOVE_ANIM_DICT(sOpenGarageAnimDict)
bAnimDictLoadSceneStartedFromVehGen = TRUE
ENDIF
ENDIF
BOOL bSafe
bSafe = TRUE
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE)
currentVeh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID(), TRUE)
IF DOES_ENTITY_EXIST(currentVeh)
IF IS_VEHICLE_DRIVEABLE(currentVeh)
MODEL_NAMES eModel
eModel = GET_ENTITY_MODEL(currentVeh)
IF NOT IS_VEHICLE_MODEL_SUITABLE_FOR_DYNAMIC_UPDATE(eModel)
OR IS_VEHICLE_IN_TEMP_PLAYER_VEHICLE_ID_LIST(currentVeh)
OR IS_VEHICLE_IN_TEMP_NPC_VEHICLE_ID_LIST(currentVeh)
OR IS_BIG_VEHICLE(currentVeh)
OR (NOT IS_THIS_MODEL_A_CAR(eModel) AND NOT IS_THIS_MODEL_A_BIKE(eModel) AND NOT IS_THIS_MODEL_A_QUADBIKE(eModel))
OR eModel = MONSTER
OR IS_ENTITY_ON_FIRE(currentVeh)
OR IS_VEHICLE_ATTACHED_TO_TRAILER(currentVeh)
OR (IS_PED_IN_ANY_TAXI(PLAYER_PED_ID()) AND GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("taxi_procedural")) > 0)
bSafe = FALSE
ENDIF
ELSE
bSafe = FALSE
ENDIF
ENDIF
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), sGarageData.sVehGenPurchData.vBuyPos1, sGarageData.sVehGenPurchData.vBuyPos2, sGarageData.sVehGenPurchData.fBuyWidth)
AND (IS_HEADING_ACCEPTABLE(GET_ENTITY_HEADING(PLAYER_PED_ID()), sGarageData.sVehGenPurchData.fDoorHeading, 90.0) OR IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID()))
AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
AND IS_PLAYER_IN_SUITABLE_STAGE_FOR_GARAGE()
AND NOT IS_PED_BEING_JACKED(PLAYER_PED_ID())
AND NOT IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID())
AND NOT GET_IS_TASK_ACTIVE(PLAYER_PED_ID(), CODE_TASK_EXIT_VEHICLE)
AND NOT IS_PLAYER_PED_SWITCH_IN_PROGRESS()
AND (eClosestGarageOwner = eCurrentPlayerPed OR eClosestGarageOwner = NO_CHARACTER)
AND bSafe
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
OR (HAS_ANIM_DICT_LOADED(sOpenGarageAnimDict) OR NOT DOES_ANIM_DICT_EXIST(sOpenGarageAnimDict))
IF HAS_CONTEXT_BUTTON_TRIGGERED(iGarageEntryContextID)
RELEASE_CONTEXT_INTENTION(iGarageEntryContextID)
bAnimDictLoadSceneStartedFromVehGen = FALSE
sGarageData.iWarpControl = iCONST_WARP_2
ENDIF
SET_INTERIOR_CAPPED(INTERIOR_V_GARAGEM_SP, FALSE)
SET_INTERIOR_DISABLED(INTERIOR_V_GARAGEM_SP, FALSE)
//pin the interior into memory ///
sGarageData.interiorInstanceIndex = GET_INTERIOR_AT_COORDS_WITH_TYPE(vGarageM_SP_coord, "v_garagem_sp")
IF IS_VALID_INTERIOR(sGarageData.interiorInstanceIndex)
IF NOT IS_INTERIOR_READY(sGarageData.interiorInstanceIndex)
//PIN_INTERIOR_IN_MEMORY(sGarageData.interiorInstanceIndex)
#IF IS_DEBUG_BUILD
str = "interior NOT READY"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset, HUD_COLOUR_REDDARK)
#ENDIF
IF GET_FRAME_COUNT() % 10 = 0
#IF IS_DEBUG_BUILD
str = "interior REQUESTING"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset, HUD_COLOUR_REDDARK)
#ENDIF
PIN_INTERIOR_IN_MEMORY(sGarageData.interiorInstanceIndex)
ENDIF
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: PROCESS_GARAGE_PURCHASE -> interior pinned in memory request. frame = ", GET_FRAME_COUNT())
ELSE
#IF IS_DEBUG_BUILD
str = "interior ready"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
ENDIF
g_tlIgnoreBuildingControllerChecks = "v_garagem_sp"
ELSE
#IF IS_DEBUG_BUILD
str = "interior NOT VALID"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset, HUD_COLOUR_RED)
#ENDIF
ENDIF
//*********************
IF NOT bLoadSceneStartedFromVehGen
AND NOT IS_NEW_LOAD_SCENE_ACTIVE()
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_GEN_NAME_ENUM eCurrentVehGen
eCurrentVehGen = GET_FREE_VEHICLE_GEN_SLOT_IN_GARAGE(sGarageData.eClosestGen)
VEHICLE_GEN_DATA_STRUCT sVehGenData
GET_VEHICLE_GEN_DATA(sVehGenData, eCurrentVehGen)
vGarageInteriorPos = sVehGenData.coords
PRINTLN("PROCESS_GARAGE_VEHICLE_WARP - start vehicle load scene [", vGarageInteriorPos, ", eCurrentVehGen: ", eCurrentVehGen, "]")
NEW_LOAD_SCENE_START_SPHERE(vGarageInteriorPos, 20.0)
ELSE
PRINTLN("PROCESS_GARAGE_VEHICLE_WARP - start ped load scene [", vGarageOnfootWarp, "+<<0,0,1>>]")
NEW_LOAD_SCENE_START_SPHERE(vGarageOnfootWarp+<<0,0,1>>, 20.0)
ENDIF
bLoadSceneStartedFromVehGen = TRUE
ENDIF
#IF IS_DEBUG_BUILD
IF bLoadSceneStartedFromVehGen
IF (NOT IS_NEW_LOAD_SCENE_ACTIVE())
#IF IS_DEBUG_BUILD
str = "load scene not active"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset, HUD_COLOUR_RED)
#ENDIF
ELIF (IS_NEW_LOAD_SCENE_LOADED())
#IF IS_DEBUG_BUILD
str = "load scene loaded"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
ELSE
#IF IS_DEBUG_BUILD
str = "wait for load scene"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset, HUD_COLOUR_REDDARK)
#ENDIF
ENDIF
ENDIF
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_HEADING_ACCEPTABLE(GET_ENTITY_HEADING(PLAYER_PED_ID()), sGarageData.sVehGenPurchData.fDoorHeading, 90.0, TRUE)
str = "heading is acceptable"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
ELSE
str = "heading is NOT acceptable"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
ENDIF
ELSE
IF NOT DOES_ANIM_DICT_EXIST(sOpenGarageAnimDict)
str = "anim dict \""
str += (sOpenGarageAnimDict)
str += "\" doesn't exist"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset, HUD_COLOUR_BLACK)
ELIF HAS_ANIM_DICT_LOADED(sOpenGarageAnimDict)
str = "loaded anim dict \""
str += (sOpenGarageAnimDict)
str += "\""
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
ELSE
str = "waiting for anim dict \""
str += (sOpenGarageAnimDict)
str += "\""
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
ENDIF
VECTOR vBuyMidPos1, vBuyMidPos2
vBuyMidPos1 = ((sGarageData.sVehGenPurchData.vBuyPos1*2.0)+(sGarageData.sVehGenPurchData.vBuyPos2*1.0))/3.0
vBuyMidPos2 = ((sGarageData.sVehGenPurchData.vBuyPos1*1.0)+(sGarageData.sVehGenPurchData.vBuyPos2*2.0))/3.0
BOOL bFoundAngledArea
bFoundAngledArea = FALSE
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(),
sGarageData.sVehGenPurchData.vBuyPos1,
<<vBuyMidPos1.x, vBuyMidPos1.y, sGarageData.sVehGenPurchData.vBuyPos2.z>>,
sGarageData.sVehGenPurchData.fBuyWidth)
str = "left garage clip"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
bFoundAngledArea = TRUE
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(),
<<vBuyMidPos1.x, vBuyMidPos1.y, sGarageData.sVehGenPurchData.vBuyPos1.z>>,
<<vBuyMidPos2.x, vBuyMidPos2.y, sGarageData.sVehGenPurchData.vBuyPos2.z>>,
sGarageData.sVehGenPurchData.fBuyWidth)
str = "centre garage clip"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
bFoundAngledArea = TRUE
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(),
<<vBuyMidPos2.x, vBuyMidPos2.y, sGarageData.sVehGenPurchData.vBuyPos1.z>>,
sGarageData.sVehGenPurchData.vBuyPos2,
sGarageData.sVehGenPurchData.fBuyWidth)
str = "right garage clip"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
bFoundAngledArea = TRUE
ENDIF
IF NOT bFoundAngledArea
str = "UNKNOWN garage clip"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
ENDIF
ENDIF
#ENDIF
ELSE
#IF IS_DEBUG_BUILD
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
str = "ped sitting in any vehicle"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
ELSE
IF NOT DOES_ANIM_DICT_EXIST(sOpenGarageAnimDict)
str = "anim dict \""
str += (sOpenGarageAnimDict)
str += "\" doesn't exist"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset, HUD_COLOUR_BLACK)
ELIF HAS_ANIM_DICT_LOADED(sOpenGarageAnimDict)
str = "loaded anim dict \""
str += (sOpenGarageAnimDict)
str += "\""
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
ELSE
str = "waiting for anim dict \""
str += (sOpenGarageAnimDict)
str += "\""
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
ENDIF
ENDIF
#ENDIF
ENDIF
ELSE
IF bLoadSceneStartedFromVehGen
AND IS_NEW_LOAD_SCENE_ACTIVE()
PRINTLN("PROCESS_GARAGE_VEHICLE_WARP - stop load scene")
NEW_LOAD_SCENE_STOP()
bLoadSceneStartedFromVehGen = FALSE
ENDIF
bAnimDictLoadSceneStartedFromVehGen = FALSE
RELEASE_CONTEXT_INTENTION(iGarageEntryContextID)
REMOVE_ANIM_DICT(sOpenGarageAnimDict)
sGarageData.iWarpControl = iCONST_WARP_0
ENDIF
BREAK
CASE iCONST_WARP_2
SET_INTERIOR_CAPPED(INTERIOR_V_GARAGEM_SP, FALSE)
SET_INTERIOR_DISABLED(INTERIOR_V_GARAGEM_SP, FALSE)
FORCE_CLEANUP(FORCE_CLEANUP_FLAG_RANDOM_EVENTS)
g_sVehicleGenNSData.bInGarage = TRUE
g_sVehicleGenNSData.vGarageEntryCoords = sGarageData.sVehGenPurchData.vBlipCoords
iWantedLevelBeforeWarp = GET_PLAYER_WANTED_LEVEL(PLAYER_ID())
CLEAR_PED_TASKS(PLAYER_PED_ID())
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
currentVeh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(currentVeh)
AND IS_VEHICLE_DRIVEABLE(currentVeh)
IF IS_HEADING_ACCEPTABLE(GET_ENTITY_HEADING(currentVeh), sGarageData.sVehGenPurchData.fDoorHeading, 90.0 #IF IS_DEBUG_BUILD , TRUE #ENDIF)
bFakeGarageReverse = FALSE
ELSE
bFakeGarageReverse = TRUE
ENDIF
SET_ENTITY_PROOFS(currentVeh, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE)
CLEAR_AREA_OF_OBJECTS(sGarageVehicleWarpData.mPoints[VEHGEN_GARAGE_SCENE_POINT_enterVeh].vPos, 20)
CLEAR_AREA_OF_PROJECTILES(sGarageVehicleWarpData.mPoints[VEHGEN_GARAGE_SCENE_POINT_enterVeh].vPos, 20)
REMOVE_PARTICLE_FX_IN_RANGE(sGarageVehicleWarpData.mPoints[VEHGEN_GARAGE_SCENE_POINT_enterVeh].vPos, 7)
SET_ENTITY_COORDS(currentVeh, sGarageVehicleWarpData.mPoints[VEHGEN_GARAGE_SCENE_POINT_enterVeh].vPos)
IF bFakeGarageReverse AND NOT IS_PED_ON_ANY_BIKE(PLAYER_PED_ID())
SET_ENTITY_HEADING(currentVeh, sGarageVehicleWarpData.mPoints[VEHGEN_GARAGE_SCENE_POINT_enterVeh].vRot.z+180.0)
ELSE
SET_ENTITY_HEADING(currentVeh, sGarageVehicleWarpData.mPoints[VEHGEN_GARAGE_SCENE_POINT_enterVeh].vRot.z)
ENDIF
IF IS_PED_ON_ANY_BIKE(PLAYER_PED_ID())
GIVE_PED_HELMET(PLAYER_PED_ID(), FALSE, PV_FLAG_NONE)
SET_PED_HELMET(PLAYER_PED_ID(), TRUE)
ENDIF
SET_VEHICLE_ON_GROUND_PROPERLY(currentVeh)
ENDIF
// objFakeGarageDoor = CREATE_OBJECT_NO_OFFSET(fakeGarageDoorModel, sGarageVehicleWarpData.mPoints[VEHGEN_GARAGE_SCENE_POINT_garageDoor].vPos)
// SET_ENTITY_ROTATION(objFakeGarageDoor, sGarageVehicleWarpData.mPoints[VEHGEN_GARAGE_SCENE_POINT_garageDoor].vRot)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
SceneTool_ExecutePan(sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_enterVeh], sGarageData.camCutscene, sGarageData.camCutscene2)
sGarageData.iWarpControl = iCONST_WARP_3_enterVeh
ELSE
// rob - 2114869 - clear previous lastVehicleBeforeWarp
IF DOES_ENTITY_EXIST(lastVehicleBeforeWarp)
AND NOT IS_ENTITY_DEAD( lastVehicleBeforeWarp )
IF IS_ENTITY_A_MISSION_ENTITY(lastVehicleBeforeWarp)
AND DOES_ENTITY_BELONG_TO_THIS_SCRIPT(lastVehicleBeforeWarp)
SET_VEHICLE_AS_NO_LONGER_NEEDED(lastVehicleBeforeWarp)
ENDIF
ENDIF
lastVehicleBeforeWarp = GET_PLAYERS_LAST_VEHICLE()
IF DOES_ENTITY_EXIST(lastVehicleBeforeWarp)
AND IS_VEHICLE_DRIVEABLE(lastVehicleBeforeWarp)
AND NOT IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(lastVehicleBeforeWarp))
AND NOT IS_THIS_MODEL_A_PLANE(GET_ENTITY_MODEL(lastVehicleBeforeWarp))
AND NOT IS_THIS_MODEL_A_BOAT(GET_ENTITY_MODEL(lastVehicleBeforeWarp))
IF NOT IS_ENTITY_A_MISSION_ENTITY(lastVehicleBeforeWarp)
SET_ENTITY_AS_MISSION_ENTITY(lastVehicleBeforeWarp, FALSE, FALSE)
ENDIF
IF DOES_ENTITY_EXIST(lastVehicleBeforeWarp)
AND IS_VEHICLE_DRIVEABLE(lastVehicleBeforeWarp)
BOOL bWarpLastVehicleForEntry
IF NOT bWarpLastVehicleForEntry
IF IS_ENTITY_IN_ANGLED_AREA(lastVehicleBeforeWarp,
sGarageData.sVehGenPurchData.vBuyPos1,
sGarageData.sVehGenPurchData.vBuyPos2,
sGarageData.sVehGenPurchData.fBuyWidth)
PRINTLN("vehicle is in area, reposition")
bWarpLastVehicleForEntry = TRUE
ENDIF
ENDIF
IF NOT bWarpLastVehicleForEntry
FLOAT fDist2
fDist2 = VDIST2(GET_ENTITY_COORDS(lastVehicleBeforeWarp), sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_enterPed].mStart.vPos)
IF fDist2 < (5.0*5.0)
PRINTLN("vehicle close to camera (", SQRT(fDist2), "m), reposition")
bWarpLastVehicleForEntry = TRUE
ENDIF
ENDIF
IF bWarpLastVehicleForEntry
//bug:2343256 using veh gen to make sure cars dont just disapear when going in and out of the garages
VEHICLE_INDEX tempVeh
tempVeh = GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MISSION_VEH)
IF GET_VEHICLE_GEN_VEHICLE_SETUP_SAVED_DATA(tempVehicleData,VEHGEN_MISSION_VEH)
SEND_VEHICLE_DATA_TO_IMPOUND_USING_SETUP(tempVehicleData,GET_CURRENT_PLAYER_PED_ENUM())
//Delete if it exists
IF DOES_ENTITY_EXIST(tempVeh)
DELETE_VEHICLE(tempVeh)
ENDIF
ENDIF
IF sGarageData.eClosestGen = VEHGEN_WEB_CAR_MICHAEL
CLEAR_AREA(<<-89.3770, 92.6583, 71.2349>>, 5.0, TRUE)
SET_MISSION_VEHICLE_GEN_VEHICLE(lastVehicleBeforeWarp,<<-89.3770, 92.6583, 71.2349>>,154.4846)
ELIF sGarageData.eClosestGen = VEHGEN_WEB_CAR_FRANKLIN
CLEAR_AREA(<<-62.0307, -1839.8585, 25.6787>>, 5.0, TRUE)
SET_MISSION_VEHICLE_GEN_VEHICLE(lastVehicleBeforeWarp,<<-62.0307, -1839.8585, 25.6787>>,319.6985)
ELIF sGarageData.eClosestGen = VEHGEN_WEB_CAR_TREVOR
CLEAR_AREA(<<-234.7648, -1150.3105, 21.9224>>, 5.0, TRUE)
SET_MISSION_VEHICLE_GEN_VEHICLE(lastVehicleBeforeWarp,<<-234.7648, -1150.3105, 21.9224>>,270.8741)
ENDIF
SET_VEHICLE_ON_GROUND_PROPERLY(lastVehicleBeforeWarp)
PRINTLN("vehicle has been repositioned")
ELSE
PRINTLN("vehicle NOT in area, leave where is")
ENDIF
ENDIF
ELSE
lastVehicleBeforeWarp = NULL
ENDIF
VECTOR vBuyMidPos1, vBuyMidPos2
vBuyMidPos1 = ((sGarageData.sVehGenPurchData.vBuyPos1*2.0)+(sGarageData.sVehGenPurchData.vBuyPos2*1.0))/3.0
vBuyMidPos2 = ((sGarageData.sVehGenPurchData.vBuyPos1*1.0)+(sGarageData.sVehGenPurchData.vBuyPos2*2.0))/3.0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(),
sGarageData.sVehGenPurchData.vBuyPos1,
<<vBuyMidPos1.x, vBuyMidPos1.y, sGarageData.sVehGenPurchData.vBuyPos2.z>>,
sGarageData.sVehGenPurchData.fBuyWidth)
sOpenGarageAnimClip = ""
SWITCH GET_RANDOM_INT_IN_RANGE(0, 2)
CASE 0 sOpenGarageAnimClip = "gar_open_1_left" BREAK
CASE 1 sOpenGarageAnimClip = "gar_open_2_left" BREAK
ENDSWITCH
PRINTLN("PROCESS_GARAGE_VEHICLE_WARP - left garage clip \"", sOpenGarageAnimClip, "\".")
ELIF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(),
<<vBuyMidPos1.x, vBuyMidPos1.y, sGarageData.sVehGenPurchData.vBuyPos1.z>>,
<<vBuyMidPos2.x, vBuyMidPos2.y, sGarageData.sVehGenPurchData.vBuyPos2.z>>,
sGarageData.sVehGenPurchData.fBuyWidth)
sOpenGarageAnimClip = ""
SWITCH GET_RANDOM_INT_IN_RANGE(0, 2)
CASE 0 sOpenGarageAnimClip = "gar_open_1_left" BREAK
CASE 1 sOpenGarageAnimClip = "gar_open_1_right" BREAK
ENDSWITCH
PRINTLN("PROCESS_GARAGE_VEHICLE_WARP - centre garage clip \"", sOpenGarageAnimClip, "\".")
ELIF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(),
<<vBuyMidPos2.x, vBuyMidPos2.y, sGarageData.sVehGenPurchData.vBuyPos1.z>>,
sGarageData.sVehGenPurchData.vBuyPos2,
sGarageData.sVehGenPurchData.fBuyWidth)
sOpenGarageAnimClip = ""
SWITCH GET_RANDOM_INT_IN_RANGE(0, 2)
CASE 0 sOpenGarageAnimClip = "gar_open_1_right" BREAK
CASE 1 sOpenGarageAnimClip = "gar_open_2_right" BREAK
ENDSWITCH
PRINTLN("PROCESS_GARAGE_VEHICLE_WARP - right garage clip \"", sOpenGarageAnimClip, "\".")
ELSE
sOpenGarageAnimClip = ""
SWITCH GET_RANDOM_INT_IN_RANGE(0, 6)
CASE 0 sOpenGarageAnimClip = "gar_open_1_left" BREAK
CASE 1 sOpenGarageAnimClip = "gar_open_1_right" BREAK
CASE 2 sOpenGarageAnimClip = "gar_open_2_left" BREAK
CASE 3 sOpenGarageAnimClip = "gar_open_2_right" BREAK
CASE 4 sOpenGarageAnimClip = "gar_open_3_left" BREAK
CASE 5 sOpenGarageAnimClip = "gar_open_3_right" BREAK
ENDSWITCH
PRINTLN("PROCESS_GARAGE_VEHICLE_WARP - garage clip \"", sOpenGarageAnimClip, "\".")
ENDIF
CLEAR_AREA_OF_OBJECTS(sGarageVehicleWarpData.mPlacers[VEHGEN_GARAGE_SCENE_PLACER_enterPed].vPos, 20)
CLEAR_AREA_OF_PROJECTILES(sGarageVehicleWarpData.mPoints[VEHGEN_GARAGE_SCENE_PLACER_enterPed].vPos, 20)
SET_ENTITY_COORDS(PLAYER_PED_ID(), sGarageVehicleWarpData.mPlacers[VEHGEN_GARAGE_SCENE_PLACER_enterPed].vPos)
SET_ENTITY_HEADING(PLAYER_PED_ID(), sGarageVehicleWarpData.mPlacers[VEHGEN_GARAGE_SCENE_PLACER_enterPed].fRot)
iGarageEntrySynchSceneID = CREATE_SYNCHRONIZED_SCENE(
sGarageVehicleWarpData.mPlacers[VEHGEN_GARAGE_SCENE_PLACER_enterPed].vPos,
<<0,0,sGarageVehicleWarpData.mPlacers[VEHGEN_GARAGE_SCENE_PLACER_enterPed].fRot>>)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iGarageEntrySynchSceneID,
sOpenGarageAnimDict, sOpenGarageAnimClip, NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
DEFAULT, //SYNCED_SCENE_PLAYBACK_FLAGS flags = SYNCED_SCENE_NONE,
DEFAULT, //RAGDOLL_BLOCKING_FLAGS ragdollFlags = RBF_NONE,
DEFAULT, //FLOAT moverBlendInDelta = INSTANT_BLEND_IN,
DEFAULT) //IK_CONTROL_FLAGS ikFlags = AIK_NONE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
SceneTool_ExecutePan(sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_enterPed], sGarageData.camCutscene, sGarageData.camCutscene2)
sGarageData.iWarpControl = iCONST_WARP_4_enterPed
ENDIF
//pin the interior into memory
sGarageData.interiorInstanceIndex = GET_INTERIOR_AT_COORDS_WITH_TYPE(vGarageM_SP_coord, "v_garagem_sp")
IF IS_VALID_INTERIOR(sGarageData.interiorInstanceIndex)
IF NOT IS_INTERIOR_READY(sGarageData.interiorInstanceIndex)
PIN_INTERIOR_IN_MEMORY(sGarageData.interiorInstanceIndex)
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: PROCESS_GARAGE_PURCHASE -> interior pinned in memory request. frame = ", GET_FRAME_COUNT())
ENDIF
g_tlIgnoreBuildingControllerChecks = "v_garagem_sp"
ENDIF
IF NOT bLoadSceneStartedFromVehGen
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_GEN_NAME_ENUM eCurrentVehGen
eCurrentVehGen = GET_FREE_VEHICLE_GEN_SLOT_IN_GARAGE(sGarageData.eClosestGen)
VEHICLE_GEN_DATA_STRUCT sVehGenData
GET_VEHICLE_GEN_DATA(sVehGenData, eCurrentVehGen)
vGarageInteriorPos = sVehGenData.coords
PRINTLN("PROCESS_GARAGE_VEHICLE_WARP - start vehicle load scene [", vGarageInteriorPos, ", eCurrentVehGen: ", eCurrentVehGen, "]")
NEW_LOAD_SCENE_START_SPHERE(vGarageInteriorPos, 20.0)
ELSE
PRINTLN("PROCESS_GARAGE_VEHICLE_WARP - start ped load scene [", vGarageOnfootWarp, "]")
NEW_LOAD_SCENE_START_SPHERE(vGarageOnfootWarp, 20.0)
ENDIF
ENDIF
SET_BIT(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_USE_WORLD_RANGE_DIST_CHECKS))
DELETE_VEHICLE_GEN_VEHICLES_IN_AREA(<<198.0043, -999.7775, -100.0000>>, 50.0)
CLEAR_MUST_LEAVE_AREA_VEHICLE_GEN_FLAG(sGarageData.eClosestGen)
CLEAR_MUST_LEAVE_AREA_VEHICLE_GEN_FLAG(VEHGEN_MICHAEL_GARAGE_1)
CLEAR_MUST_LEAVE_AREA_VEHICLE_GEN_FLAG(VEHGEN_MICHAEL_GARAGE_2)
CLEAR_MUST_LEAVE_AREA_VEHICLE_GEN_FLAG(VEHGEN_MICHAEL_GARAGE_3)
CLEAR_MUST_LEAVE_AREA_VEHICLE_GEN_FLAG(VEHGEN_TREVOR_GARAGE_1)
CLEAR_MUST_LEAVE_AREA_VEHICLE_GEN_FLAG(VEHGEN_TREVOR_GARAGE_2)
CLEAR_MUST_LEAVE_AREA_VEHICLE_GEN_FLAG(VEHGEN_TREVOR_GARAGE_3)
CLEAR_MUST_LEAVE_AREA_VEHICLE_GEN_FLAG(VEHGEN_FRANKLIN_GARAGE_1)
CLEAR_MUST_LEAVE_AREA_VEHICLE_GEN_FLAG(VEHGEN_FRANKLIN_GARAGE_2)
CLEAR_MUST_LEAVE_AREA_VEHICLE_GEN_FLAG(VEHGEN_FRANKLIN_GARAGE_3)
SETTIMERA(0)
fakeGarageCarEnterCutsceneStage = 0
BREAK
CASE iCONST_WARP_4_enterPed
#IF IS_DEBUG_BUILD
str = "TIMERA(): "
str += TIMERA()
str += " "
str += ROUND(sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_enterPed].fDuration*1000)
IF (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()))
str += " (veh)"
ELSE
str += " (ped)"
ENDIF
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
DRAW_DEBUG_LINE(sGarageVehicleWarpData.mPlacers[VEHGEN_GARAGE_SCENE_PLACER_enterPed].vPos+<<0,0,1>>, sGarageVehicleWarpData.mPlacers[VEHGEN_GARAGE_SCENE_PLACER_enterPed].vPos+<<0,0,1>>,
iRed, iGreen, iBlue, iAlpha)
DRAW_DEBUG_SPHERE(sGarageVehicleWarpData.mPlacers[VEHGEN_GARAGE_SCENE_PLACER_enterPed].vPos+<<0,0,1>>, 0.1,
iRed, iGreen, iBlue, iAlpha)
DRAW_DEBUG_SPHERE(sGarageVehicleWarpData.mPlacers[VEHGEN_GARAGE_SCENE_PLACER_enterPed].vPos+<<0,0,1>>, 0.1,
iRed, iGreen, iBlue, iAlpha)
#ENDIF
BOOL bProgessPastStage4
bProgessPastStage4 = TRUE
IF (NOT IS_NEW_LOAD_SCENE_ACTIVE())
#IF IS_DEBUG_BUILD
str = "load scene not active"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset, HUD_COLOUR_RED)
#ENDIF
ELIF (IS_NEW_LOAD_SCENE_LOADED())
#IF IS_DEBUG_BUILD
str = "load scene loaded"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
ELSE
#IF IS_DEBUG_BUILD
str = "wait for load scene"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset, HUD_COLOUR_REDDARK)
#ENDIF
bProgessPastStage4 = FALSE
ENDIF
IF IS_VALID_INTERIOR(sGarageData.interiorInstanceIndex)
IF NOT IS_INTERIOR_READY(sGarageData.interiorInstanceIndex)
#IF IS_DEBUG_BUILD
str = "interior NOT READY"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset, HUD_COLOUR_REDDARK)
#ENDIF
PIN_INTERIOR_IN_MEMORY(sGarageData.interiorInstanceIndex)
ELSE
#IF IS_DEBUG_BUILD
str = "interior ready"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
ENDIF
g_tlIgnoreBuildingControllerChecks = "v_garagem_sp"
ELSE
#IF IS_DEBUG_BUILD
str = "interior NOT VALID"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset, HUD_COLOUR_RED)
#ENDIF
sGarageData.interiorInstanceIndex = GET_INTERIOR_AT_COORDS_WITH_TYPE(vGarageM_SP_coord, "v_garagem_sp")
ENDIF
IF HAVE_ALL_VEHICLE_GENS_LOADED_NEAR_PLAYER()
ELSE
#IF IS_DEBUG_BUILD
str = "two - wait for vehgens"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage4 = FALSE
ENDIF
IF (DOES_CAM_EXIST(sGarageData.camCutscene) AND IS_CAM_RENDERING(sGarageData.camCutscene))
IF IS_CAM_INTERPOLATING(sGarageData.camCutscene)
#IF IS_DEBUG_BUILD
str = "camCutscene - camCutscene interping"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage4 = FALSE
ENDIF
IF (TIMERA() <= ((sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_enterPed].fDuration*1000)))
#IF IS_DEBUG_BUILD
str = "camCutscene - timera: "
str += TIMERA()
str += " < "
str += ROUND(sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_enterPed].fDuration*1000)
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage4 = FALSE
ENDIF
ELIF (DOES_CAM_EXIST(sGarageData.camCutscene2) AND IS_CAM_RENDERING(sGarageData.camCutscene2))
IF IS_CAM_INTERPOLATING(sGarageData.camCutscene2)
#IF IS_DEBUG_BUILD
str = "camCutscene2 - camCutscene2 interping"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage4 = FALSE
ENDIF
IF (TIMERA() <= ((sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_enterPed].fDuration*1000)))
#IF IS_DEBUG_BUILD
str = "camCutscene2 - timera: "
str += TIMERA()
str += " < "
str += ROUND(sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_enterPed].fDuration*1000)
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage4 = FALSE
ENDIF
ELSE
#IF IS_DEBUG_BUILD
str = "four-five"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage4 = FALSE
ENDIF
IF IS_SYNCHRONIZED_SCENE_RUNNING(iGarageEntrySynchSceneID)
FLOAT fSynchScenePhase
fSynchScenePhase = GET_SYNCHRONIZED_SCENE_PHASE(iGarageEntrySynchSceneID)
IF fSynchScenePhase < fGARAGE_OPEN_PHASE
#IF IS_DEBUG_BUILD
str = "synch scene["
str += iGarageEntrySynchSceneID
str += "] running "
str += GET_STRING_FROM_FLOAT(fSynchScenePhase)
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
str = "sOpenGarageAnimClip \""
str += sOpenGarageAnimClip
str += "\" "
str += GET_STRING_FROM_FLOAT(GET_ANIM_DURATION(sOpenGarageAnimDict, sOpenGarageAnimClip))
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage4 = FALSE
ELSE
#IF IS_DEBUG_BUILD
str = "synch scene["
str += iGarageEntrySynchSceneID
str += "] ending "
str += GET_STRING_FROM_FLOAT(fSynchScenePhase)
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD
str = "synch scene["
str += iGarageEntrySynchSceneID
str += "] NOT running"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
ENDIF
#IF IS_DEBUG_BUILD
IF sGarageVehicleWarpData.bPlaceholder[VEHGEN_GARAGE_SCENE_PAN_enterPed]
SET_TEXT_COLOUR(100, 255, 255, 255)
SET_TEXT_SCALE(0.7, 0.8)
SET_TEXT_WRAP(0.0, 1.0)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.6, 0.85, "STRING", "PLACEHOLDER CAMERA")
ENDIF
#ENDIF
IF bProgessPastStage4
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
sGarageData.iWarpControl = iCONST_WARP_5_fadingOutPed
ENDIF
BREAK
CASE iCONST_WARP_5_fadingOutPed
#IF IS_DEBUG_BUILD
str = "TIMERA(): "
str += TIMERA()
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
IF IS_SCREEN_FADED_OUT()
INT iSoundID
iSoundID = GET_SOUND_ID()
PLAY_SOUND_FRONTEND(iSoundID,"GARAGE_DOOR_SCRIPTED_CLOSE")
SET_VARIABLE_ON_SOUND(iSoundID, "hold", iGarageHold/1000.0)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
RENDER_SCRIPT_CAMS(FALSE,FALSE)
IF DOES_CAM_EXIST(sGarageData.camCutscene)
SET_CAM_ACTIVE(sGarageData.camCutscene, FALSE)
DESTROY_CAM(sGarageData.camCutscene)
ENDIF
IF DOES_CAM_EXIST(sGarageData.camCutscene2)
SET_CAM_ACTIVE(sGarageData.camCutscene2, FALSE)
DESTROY_CAM(sGarageData.camCutscene2)
ENDIF
IF DOES_ENTITY_EXIST(vehFakeGarageEnter)
SET_ENTITY_COLLISION(vehFakeGarageEnter, TRUE)
FREEZE_ENTITY_POSITION(vehFakeGarageEnter, FALSE)
vehFakeGarageEnter = NULL
ENDIF
// IF DOES_ENTITY_EXIST(objFakeGarageDoor)
// DELETE_OBJECT(objFakeGarageDoor)
// ENDIF
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
FORCE_CLEANUP(FORCE_CLEANUP_FLAG_RANDOM_EVENTS)
IF IS_SYNCHRONIZED_SCENE_RUNNING(iGarageEntrySynchSceneID)
DETACH_SYNCHRONIZED_SCENE(iGarageEntrySynchSceneID)
ENDIF
iGarageEntrySynchSceneID = -1
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<194.5394215,-1026.319946, -100.0000>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 334.1665)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SETTIMERA(0)
sGarageData.iWarpControl = iCONST_WARP_6_fadingInPed
ENDIF
BREAK
CASE iCONST_WARP_6_fadingInPed
#IF IS_DEBUG_BUILD
str = "TIMERA(): "
str += TIMERA()
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
//Request the vehicle models early
EARLY_REQUEST_GARAGE_VEHICLES(sGarageData.eClosestGen)
IF IS_SCREEN_FADED_OUT()
AND TIMERA() > iGarageHold
REMOVE_ANIM_DICT(sOpenGarageAnimDict)
RESET_VEHICLE_GEN_LOADED_CHECKS()
IF IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_STOP()
ENDIF
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
SETTIMERA(0)
iGarageHelpStage = 0
bLoadSceneStartedFromVehGen = FALSE
sGarageData.iWarpControl = iCONST_WARP_10
ENDIF
BREAK
CASE iCONST_WARP_3_enterVeh
#IF IS_DEBUG_BUILD
str = "TIMERA(): "
str += TIMERA()
str += " "
str += ROUND(sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_enterVeh].fDuration*1000)
str += " (veh)"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
//Request the vehicle models early
EARLY_REQUEST_GARAGE_VEHICLES(sGarageData.eClosestGen)
BOOL bProgessPastStage3
bProgessPastStage3 = TRUE
IF (NOT IS_NEW_LOAD_SCENE_ACTIVE())
#IF IS_DEBUG_BUILD
str = "load scene not active"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset, HUD_COLOUR_RED)
#ENDIF
ELIF (IS_NEW_LOAD_SCENE_LOADED())
#IF IS_DEBUG_BUILD
str = "load scene loaded"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
ELSE
#IF IS_DEBUG_BUILD
str = "wait for load scene"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset, HUD_COLOUR_REDDARK)
#ENDIF
bProgessPastStage3 = FALSE
ENDIF
IF IS_VALID_INTERIOR(sGarageData.interiorInstanceIndex)
IF NOT IS_INTERIOR_READY(sGarageData.interiorInstanceIndex)
#IF IS_DEBUG_BUILD
str = "interior NOT READY"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset, HUD_COLOUR_REDDARK)
#ENDIF
PIN_INTERIOR_IN_MEMORY(sGarageData.interiorInstanceIndex)
ELSE
#IF IS_DEBUG_BUILD
str = "interior ready"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
ENDIF
g_tlIgnoreBuildingControllerChecks = "v_garagem_sp"
ELSE
#IF IS_DEBUG_BUILD
str = "interior NOT VALID"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset, HUD_COLOUR_RED)
#ENDIF
sGarageData.interiorInstanceIndex = GET_INTERIOR_AT_COORDS_WITH_TYPE(vGarageM_SP_coord, "v_garagem_sp")
ENDIF
IF HAVE_ALL_VEHICLE_GENS_LOADED_NEAR_PLAYER()
ELSE
#IF IS_DEBUG_BUILD
str = "two - wait for vehgens"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage3 = FALSE
ENDIF
IF (DOES_CAM_EXIST(sGarageData.camCutscene) AND IS_CAM_RENDERING(sGarageData.camCutscene))
IF IS_CAM_INTERPOLATING(sGarageData.camCutscene)
#IF IS_DEBUG_BUILD
str = "camCutscene - camCutscene interping"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage3 = FALSE
ENDIF
IF (TIMERA() <= ((sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_enterVeh].fDuration*1000)))
#IF IS_DEBUG_BUILD
str = "camCutscene - timera: "
str += TIMERA()
str += " < "
str += ROUND(sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_enterVeh].fDuration*1000)
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage3 = FALSE
ENDIF
ELIF (DOES_CAM_EXIST(sGarageData.camCutscene2) AND IS_CAM_RENDERING(sGarageData.camCutscene2))
IF IS_CAM_INTERPOLATING(sGarageData.camCutscene2)
#IF IS_DEBUG_BUILD
str = "camCutscene2 - camCutscene2 interping"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage3 = FALSE
ENDIF
IF (TIMERA() <= ((sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_enterVeh].fDuration*1000)))
#IF IS_DEBUG_BUILD
str = "camCutscene2 - timera: "
str += TIMERA()
str += " < "
str += ROUND(sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_enterVeh].fDuration*1000)
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage3 = FALSE
ENDIF
ELSE
#IF IS_DEBUG_BUILD
str = "four-five"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage3 = FALSE
ENDIF
#IF IS_DEBUG_BUILD
IF sGarageVehicleWarpData.bPlaceholder[VEHGEN_GARAGE_SCENE_PAN_enterVeh]
SET_TEXT_COLOUR(100, 255, 255, 255)
SET_TEXT_SCALE(0.7, 0.8)
SET_TEXT_WRAP(0.0, 1.0)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.6, 0.85, "STRING", "PLACEHOLDER CAMERA")
ENDIF
#ENDIF
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
structSceneTool_Placer mPlacer
mPlacer.vPos = <<0,0,0>>
mPlacer.fRot = 0.0
DO_FAKE_GARAGE_CAR_DRIVE(PLAYER_PED_ID(),
sGarageVehicleWarpData.mPoints[VEHGEN_GARAGE_SCENE_POINT_enterVeh],
sGarageVehicleWarpData.mMarkers[VEHGEN_GARAGE_SCENE_MARKER_enterVeh],
(sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_enterVeh].fDuration*1000.0) - 0500,
mPlacer, GRAPH_TYPE_ACCEL,
fStrOffset)
ENDIF
IF bProgessPastStage3
RESET_VEHICLE_GEN_LOADED_CHECKS()
// //DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
// RENDER_SCRIPT_CAMS(FALSE,FALSE)
// IF DOES_CAM_EXIST(sGarageData.camCutscene)
// SET_CAM_ACTIVE(sGarageData.camCutscene, FALSE)
// DESTROY_CAM(sGarageData.camCutscene)
// ENDIF
// IF DOES_CAM_EXIST(sGarageData.camCutscene2)
// SET_CAM_ACTIVE(sGarageData.camCutscene2, FALSE)
// DESTROY_CAM(sGarageData.camCutscene2)
// ENDIF
// IF DOES_ENTITY_EXIST(vehFakeGarageEnter)
// SET_ENTITY_COLLISION(vehFakeGarageEnter, TRUE)
// FREEZE_ENTITY_POSITION(vehFakeGarageEnter, FALSE)
// vehFakeGarageEnter = NULL
// ENDIF
//// IF DOES_ENTITY_EXIST(objFakeGarageDoor)
//// DELETE_OBJECT(objFakeGarageDoor)
//// ENDIF
//
// CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
// SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
//
// FORCE_CLEANUP(FORCE_CLEANUP_FLAG_RANDOM_EVENTS)
//
// IF IS_NEW_LOAD_SCENE_ACTIVE()
// NEW_LOAD_SCENE_STOP()
// ENDIF
//
// IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
// currentVeh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
// IF DOES_ENTITY_EXIST(currentVeh)
// AND IS_VEHICLE_DRIVEABLE(currentVeh)
//
// VEHICLE_GEN_NAME_ENUM eCurrentVehGen
// eCurrentVehGen = GET_FREE_VEHICLE_GEN_SLOT_IN_GARAGE(sGarageData.eClosestGen)
//
// VEHICLE_GEN_DATA_STRUCT sVehGenData
// GET_VEHICLE_GEN_DATA(sVehGenData, eCurrentVehGen)
// SET_ENTITY_COORDS(currentVeh, sVehGenData.coords)
// SET_ENTITY_HEADING(currentVeh, sVehGenData.heading)
//
// SET_VEHICLE_DOORS_SHUT(currentVeh)
// SET_VEHICLE_ENGINE_ON(currentVeh, FALSE, TRUE)
// SET_VEHICLE_LIGHTS(currentVeh, SET_VEHICLE_LIGHTS_OFF)
// SET_VEHICLE_INDICATOR_LIGHTS(currentVeh, TRUE, FALSE)
// SET_VEHICLE_INDICATOR_LIGHTS(currentVeh, FALSE, FALSE)
// SET_VEHICLE_RADIO_ENABLED(currentVeh, FALSE)
// SET_ENTITY_PROOFS(currentVeh, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE)
//
// TASK_LEAVE_VEHICLE(PLAYER_PED_ID(), currentVeh)
//
// FREEZE_ENTITY_POSITION(currentVeh, FALSE)
//
// VEHICLE_SETUP_STRUCT sVehgenSetup
// GET_VEHICLE_SETUP(currentVeh, sVehgenSetup)
// UPDATE_DYNAMIC_VEHICLE_GEN_DATA(eCurrentVehGen, sVehgenSetup, <<0,0,0>>, -1)
//
// SET_VEHICLE_GEN_VEHICLE(eCurrentVehGen, currentVeh)
//
// STOP_TRACKING_VEHICLE_FOR_IMPOUND(currentVeh)
// ENDIF
//
// SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
// SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
// ELSE
// //
// ENDIF
//
// // Reposition buddies
// INT iNearbyPedCount
// INT iNearbyPed
// iNearbyPedCount = GET_PED_NEARBY_PEDS(PLAYER_PED_ID(), nearbyPeds)
// REPEAT iNearbyPedCount iNearbyPed
// IF DOES_ENTITY_EXIST(nearbyPeds[iNearbyPed])
// AND NOT IS_PED_INJURED(nearbyPeds[iNearbyPed])
// AND IS_PED_GROUP_MEMBER(nearbyPeds[iNearbyPed], GET_PLAYER_GROUP(PLAYER_ID()))
// CPRINTLN(DEBUG_AMBIENT, "PROCESS_GARAGE_VEHICLE_WARP -> reposition player group member [", iNearbyPed, ":", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(nearbyPeds[iNearbyPed])), "] to inside garage")
//
// SET_ENTITY_COORDS_NO_OFFSET(nearbyPeds[iNearbyPed], <<206.8020, -1018.0115, -100.0000>>)
// ENDIF
// ENDREPEAT
SETTIMERA(0)
// iGarageHelpStage = 0
// bLoadSceneStartedFromVehGen = FALSE
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
sGarageData.iWarpControl = iCONST_WARP_3_5
ENDIF
BREAK
CASE iCONST_WARP_3_5
#IF IS_DEBUG_BUILD
str = "TIMERA(): "
str += TIMERA()
str += " "
str += ROUND(sGarageVehicleWarpData.fHold[VEHGEN_GARAGE_SCENE_PAN_enterVeh]*1000)
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
BOOL bProgessPastStage35
bProgessPastStage35 = TRUE
//Request the vehicle models early
EARLY_REQUEST_GARAGE_VEHICLES(sGarageData.eClosestGen)
IF (TIMERA() <= ((sGarageVehicleWarpData.fHold[VEHGEN_GARAGE_SCENE_PAN_enterVeh]*1000)))
#IF IS_DEBUG_BUILD
str = "fHold: "
str += TIMERA()
str += " < "
str += ROUND(sGarageVehicleWarpData.fHold[VEHGEN_GARAGE_SCENE_PAN_enterVeh]*1000)
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage35 = FALSE
ENDIF
IF bProgessPastStage35
RESET_VEHICLE_GEN_LOADED_CHECKS()
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
//DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
RENDER_SCRIPT_CAMS(FALSE,FALSE)
IF DOES_CAM_EXIST(sGarageData.camCutscene)
SET_CAM_ACTIVE(sGarageData.camCutscene, FALSE)
DESTROY_CAM(sGarageData.camCutscene)
ENDIF
IF DOES_CAM_EXIST(sGarageData.camCutscene2)
SET_CAM_ACTIVE(sGarageData.camCutscene2, FALSE)
DESTROY_CAM(sGarageData.camCutscene2)
ENDIF
IF DOES_ENTITY_EXIST(vehFakeGarageEnter)
SET_ENTITY_COLLISION(vehFakeGarageEnter, TRUE)
FREEZE_ENTITY_POSITION(vehFakeGarageEnter, FALSE)
vehFakeGarageEnter = NULL
ENDIF
// IF DOES_ENTITY_EXIST(objFakeGarageDoor)
// DELETE_OBJECT(objFakeGarageDoor)
// ENDIF
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
FORCE_CLEANUP(FORCE_CLEANUP_FLAG_RANDOM_EVENTS)
IF IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_STOP()
ENDIF
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
currentVeh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(currentVeh)
AND IS_VEHICLE_DRIVEABLE(currentVeh)
VEHICLE_GEN_NAME_ENUM eCurrentVehGen
eCurrentVehGen = GET_FREE_VEHICLE_GEN_SLOT_IN_GARAGE(sGarageData.eClosestGen)
VEHICLE_GEN_DATA_STRUCT sVehGenData
GET_VEHICLE_GEN_DATA(sVehGenData, eCurrentVehGen)
SET_ENTITY_COORDS(currentVeh, sVehGenData.coords)
SET_ENTITY_HEADING(currentVeh, sVehGenData.heading)
SET_VEHICLE_DOORS_SHUT(currentVeh)
SET_VEHICLE_ENGINE_ON(currentVeh, FALSE, TRUE)
SET_VEHICLE_LIGHTS(currentVeh, SET_VEHICLE_LIGHTS_OFF)
SET_VEHICLE_INDICATOR_LIGHTS(currentVeh, TRUE, FALSE)
SET_VEHICLE_INDICATOR_LIGHTS(currentVeh, FALSE, FALSE)
SET_VEHICLE_RADIO_ENABLED(currentVeh, FALSE)
SET_ENTITY_PROOFS(currentVeh, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE)
TASK_LEAVE_VEHICLE(PLAYER_PED_ID(), currentVeh)
FREEZE_ENTITY_POSITION(currentVeh, FALSE)
VEHICLE_SETUP_STRUCT sVehgenSetup
GET_VEHICLE_SETUP(currentVeh, sVehgenSetup)
UPDATE_DYNAMIC_VEHICLE_GEN_DATA(eCurrentVehGen, sVehgenSetup, <<0,0,0>>, -1)
SET_VEHICLE_GEN_VEHICLE(eCurrentVehGen, currentVeh)
STOP_TRACKING_VEHICLE_FOR_IMPOUND(currentVeh)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
ELSE
//
ENDIF
// Reposition buddies
INT iNearbyPedCount
INT iNearbyPed
iNearbyPedCount = GET_PED_NEARBY_PEDS(PLAYER_PED_ID(), nearbyPeds)
REPEAT iNearbyPedCount iNearbyPed
IF DOES_ENTITY_EXIST(nearbyPeds[iNearbyPed])
AND NOT IS_PED_INJURED(nearbyPeds[iNearbyPed])
AND IS_PED_GROUP_MEMBER(nearbyPeds[iNearbyPed], GET_PLAYER_GROUP(PLAYER_ID()))
CPRINTLN(DEBUG_AMBIENT, "PROCESS_GARAGE_VEHICLE_WARP -> reposition player group member [", iNearbyPed, ":", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(nearbyPeds[iNearbyPed])), "] to inside garage")
SET_ENTITY_COORDS_NO_OFFSET(nearbyPeds[iNearbyPed], <<206.8020, -1018.0115, -100.0000>>)
ENDIF
ENDREPEAT
SETTIMERA(0)
iGarageHelpStage = 0
bLoadSceneStartedFromVehGen = FALSE
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
sGarageData.iWarpControl = iCONST_WARP_10
ENDIF
BREAK
CASE iCONST_WARP_10
#IF IS_DEBUG_BUILD
str = "TIMERA(): "
str += TIMERA()
str += " iGarageHelpStage: "
str += iGarageHelpStage
str += " \""
str += tlWarpHelpPrinted
str += "\""
#ENDIF
IF TIMERA() < 7000
OR NOT g_savedGlobals.sVehicleGenData.bGarageIntroRun
#IF IS_DEBUG_BUILD
str = "bGarageIntroRun = FALSE, iGarageHelpStage: "
str += iGarageHelpStage
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
IF NOT g_savedGlobals.sVehicleGenData.bGarageIntroRun
IF (iGarageHelpStage = 0)
PRINT_HELP("CAR_GAR_05")
tlWarpHelpPrinted = "CAR_GAR_05"
bPrintWarpHelp = TRUE
IF TIMERA() >= 7000
SETTIMERA(0)
iGarageHelpStage++
ENDIF
ELIF (iGarageHelpStage = 1)
PRINT_HELP("CAR_GAR_06")
tlWarpHelpPrinted = "CAR_GAR_06"
bPrintWarpHelp = TRUE
IF TIMERA() >= 7000
SETTIMERA(0)
g_savedGlobals.sVehicleGenData.bGarageIntroRun = TRUE
ENDIF
ENDIF
ELSE
PRINT_HELP("CAR_GAR_EXIT")
tlWarpHelpPrinted = "CAR_GAR_EXIT"
bPrintWarpHelp = TRUE
ENDIF
ELSE
g_savedGlobals.sVehicleGenData.bGarageIntroRun = TRUE
ENDIF
BOOL bProgessPastStage10
bProgessPastStage10 = FALSE
IF (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()))
IF (iGarageEntryContextID != NEW_CONTEXT_INTENTION)
RELEASE_CONTEXT_INTENTION(iGarageEntryContextID)
ENDIF
currentVeh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(currentVeh)
AND IS_VEHICLE_DRIVEABLE(currentVeh)
IF GET_IS_VEHICLE_ENGINE_RUNNING(currentVeh)
OR IS_PED_ON_ANY_BIKE(PLAYER_PED_ID())
IF NOT (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND NOT IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID()))
#IF IS_DEBUG_BUILD
str = "Wait for ACCELERATE or BRAKE"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
IF (GET_DISABLED_CONTROL_UNBOUND_NORMAL(PLAYER_CONTROL, INPUT_VEH_ACCELERATE) != 0
OR IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
OR IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
OR IS_DISABLED_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_ACCELERATE))
bProgessPastStage10 = TRUE
ENDIF
IF (GET_DISABLED_CONTROL_UNBOUND_NORMAL(PLAYER_CONTROL, INPUT_VEH_BRAKE) != 0
OR IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_VEH_BRAKE)
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_BRAKE)
OR IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_VEH_BRAKE)
OR IS_DISABLED_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_BRAKE))
bProgessPastStage10 = TRUE
ENDIF
ELSE
#IF IS_DEBUG_BUILD
str = "entering/exiting the vehicle"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
ENDIF
ENDIF
ENDIF
ELSE
REQUEST_ANIM_DICT(sOpenGarageAnimDict)
#IF IS_DEBUG_BUILD
IF NOT DOES_ANIM_DICT_EXIST(sOpenGarageAnimDict)
str = "anim dict \""
str += (sOpenGarageAnimDict)
str += "\" doesn't exist"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset, HUD_COLOUR_BLACK)
ELIF HAS_ANIM_DICT_LOADED(sOpenGarageAnimDict)
str = "loaded anim dict \""
str += (sOpenGarageAnimDict)
str += "\""
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
ELSE
str = "waiting for anim dict \""
str += (sOpenGarageAnimDict)
str += "\""
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
ENDIF
IF (iGarageEntryContextID = NEW_CONTEXT_INTENTION)
str = "iGarageEntryContextID = NEW_CONTEXT_INTENTION"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
ELSE
INT iContext
iContext = GET_CONTEXT_INTENTION_ARRAY_INDEX(iGarageEntryContextID)
str = "iGarageEntryContextID = \""
IF (iContext >= 0)
AND (iContext < MAX_CONTEXT_INTENTION)
str += g_IntentionList[iContext].helpLabel
ELSE
str += "unknown_"
str += iContext
ENDIF
str += "\""
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
ENDIF
IF (iVehicleMenuContextID = NEW_CONTEXT_INTENTION)
str = "iVehicleMenuContextID = NEW_CONTEXT_INTENTION"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
ELSE
INT iContext
iContext = GET_CONTEXT_INTENTION_ARRAY_INDEX(iVehicleMenuContextID)
str = "iVehicleMenuContextID = \""
IF (iContext >= 0)
AND (iContext < MAX_CONTEXT_INTENTION)
str += g_IntentionList[iContext].helpLabel
ELSE
str += "unknown_"
str += iContext
ENDIF
str += "\""
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
ENDIF
#ENDIF
IF ((IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<191.049149,-1026.318237,-104.999962>>, <<198.029694,-1026.321655,-96.812462>>, 2.062500)
AND IS_HEADING_ACCEPTABLE(GET_ENTITY_HEADING(PLAYER_PED_ID()), 180.0, 90.0)))
IF iVehicleMenuContextID != NEW_CONTEXT_INTENTION
RELEASE_CONTEXT_INTENTION(iVehicleMenuContextID)
ENDIF
IF (iGarageEntryContextID = NEW_CONTEXT_INTENTION)
REGISTER_CONTEXT_INTENTION(iGarageEntryContextID, CP_MEDIUM_PRIORITY, "WEB_VEH_EXIT") // Press ~a~ to exit garage.
ENDIF
IF NOT (iVehicleMenuContextID != NEW_CONTEXT_INTENTION)
AND NOT (iGarageEntryContextID = NEW_CONTEXT_INTENTION)
IF HAS_CONTEXT_BUTTON_TRIGGERED(iGarageEntryContextID)
RELEASE_CONTEXT_INTENTION(iGarageEntryContextID)
bProgessPastStage10 = TRUE
ENDIF
ENDIF
ELSE
IF (iGarageEntryContextID != NEW_CONTEXT_INTENTION)
RELEASE_CONTEXT_INTENTION(iGarageEntryContextID)
ENDIF
ENDIF
ENDIF
IF bExitGarageInDLCVehicle
bProgessPastStage10 = TRUE
ENDIF
IF bProgessPastStage10
AND NOT IS_CUSTOM_MENU_ON_SCREEN()
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
OR bExitGarageInDLCVehicle
SETTIMERA(0)
NEW_LOAD_SCENE_START_SPHERE(sGarageVehicleWarpData.mPlacers[VEHGEN_GARAGE_SCENE_PLACER_exitVeh].vPos, 20.0)
IF (iGarageEntryContextID != NEW_CONTEXT_INTENTION)
RELEASE_CONTEXT_INTENTION(iGarageEntryContextID)
ENDIF
sGarageData.iWarpControl = iCONST_WARP_12_exitVehInt
ELSE
IF HAS_ANIM_DICT_LOADED(sOpenGarageAnimDict)
sOpenGarageAnimClip = ""
SWITCH GET_RANDOM_INT_IN_RANGE(0, 6)
CASE 0 sOpenGarageAnimClip = "gar_open_1_left" BREAK
CASE 1 sOpenGarageAnimClip = "gar_open_1_right" BREAK
CASE 2 sOpenGarageAnimClip = "gar_open_2_left" BREAK
CASE 3 sOpenGarageAnimClip = "gar_open_2_right" BREAK
CASE 4 sOpenGarageAnimClip = "gar_open_3_left" BREAK
CASE 5 sOpenGarageAnimClip = "gar_open_3_right" BREAK
ENDSWITCH
iGarageEntrySynchSceneID = CREATE_SYNCHRONIZED_SCENE(
sGarageVehicleWarpData.mPlacers[VEHGEN_GARAGE_SCENE_PLACER_exitPedOpen].vPos,
<<0,0,sGarageVehicleWarpData.mPlacers[VEHGEN_GARAGE_SCENE_PLACER_exitPedOpen].fRot>>)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iGarageEntrySynchSceneID,
sOpenGarageAnimDict, sOpenGarageAnimClip, NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
DEFAULT, //SYNCED_SCENE_PLAYBACK_FLAGS flags = SYNCED_SCENE_NONE,
DEFAULT, //RAGDOLL_BLOCKING_FLAGS ragdollFlags = RBF_NONE,
DEFAULT, //FLOAT moverBlendInDelta = INSTANT_BLEND_IN,
DEFAULT) //IK_CONTROL_FLAGS ikFlags = AIK_NONE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
SceneTool_ExecutePan(sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_exitPedOpen], sGarageData.camCutscene, sGarageData.camCutscene2)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
NEW_LOAD_SCENE_START_SPHERE(sGarageVehicleWarpData.mPlacers[VEHGEN_GARAGE_SCENE_PLACER_exitVeh].vPos, 20.0)
SETTIMERA(0)
IF (iGarageEntryContextID != NEW_CONTEXT_INTENTION)
RELEASE_CONTEXT_INTENTION(iGarageEntryContextID)
ENDIF
sGarageData.iWarpControl = iCONST_WARP_11_exitPed
ELIF NOT DOES_ANIM_DICT_EXIST(sOpenGarageAnimDict)
SET_ENTITY_COORDS(PLAYER_PED_ID(), sGarageVehicleWarpData.mPlacers[VEHGEN_GARAGE_SCENE_PLACER_exitPedOpen].vPos)
SET_ENTITY_HEADING(PLAYER_PED_ID(), sGarageVehicleWarpData.mPlacers[VEHGEN_GARAGE_SCENE_PLACER_exitPedOpen].fRot)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
SceneTool_ExecutePan(sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_exitPedOpen], sGarageData.camCutscene, sGarageData.camCutscene2)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
NEW_LOAD_SCENE_START_SPHERE(sGarageVehicleWarpData.mPlacers[VEHGEN_GARAGE_SCENE_PLACER_exitVeh].vPos, 20.0)
SETTIMERA(0)
IF (iGarageEntryContextID != NEW_CONTEXT_INTENTION)
RELEASE_CONTEXT_INTENTION(iGarageEntryContextID)
ENDIF
sGarageData.iWarpControl = iCONST_WARP_11_exitPed
ENDIF
ENDIF
ENDIF
BREAK
CASE iCONST_WARP_11_exitPed
#IF IS_DEBUG_BUILD
str = "TIMERA(): "
str += TIMERA()
str += " "
str += ROUND(sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_exitPedOpen].fDuration*1000)
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
DRAW_DEBUG_LINE(sGarageVehicleWarpData.mPlacers[VEHGEN_GARAGE_SCENE_PLACER_exitPedOpen].vPos+<<0,0,1>>, sGarageVehicleWarpData.mPlacers[VEHGEN_GARAGE_SCENE_PLACER_exitPedOpen].vPos+<<0,0,1>>,
iRed, iGreen, iBlue, iAlpha)
DRAW_DEBUG_SPHERE(sGarageVehicleWarpData.mPlacers[VEHGEN_GARAGE_SCENE_PLACER_exitPedOpen].vPos+<<0,0,1>>, 0.1,
iRed, iGreen, iBlue, iAlpha)
DRAW_DEBUG_SPHERE(sGarageVehicleWarpData.mPlacers[VEHGEN_GARAGE_SCENE_PLACER_exitPedOpen].vPos+<<0,0,1>>, 0.1,
iRed, iGreen, iBlue, iAlpha)
#ENDIF
BOOL bProgessPastStage11
bProgessPastStage11 = TRUE
IF (NOT IS_NEW_LOAD_SCENE_ACTIVE())
#IF IS_DEBUG_BUILD
str = "load scene not active"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset, HUD_COLOUR_REDDARK)
#ENDIF
ELIF (IS_NEW_LOAD_SCENE_LOADED())
#IF IS_DEBUG_BUILD
str = "load scene loaded"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
ELSE
#IF IS_DEBUG_BUILD
str = "wait for load scene"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset, HUD_COLOUR_RED)
#ENDIF
bProgessPastStage11 = FALSE
ENDIF
IF HAVE_ALL_VEHICLE_GENS_LOADED_NEAR_PLAYER()
ELSE
#IF IS_DEBUG_BUILD
str = "two - wait for vehgens"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage11 = FALSE
ENDIF
// IF (TIMERA() > ((sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_exitPedOpen].fDuration*1000)+1000))
//
// ELSE
// str = "emergency timer! - timera: "
// str += TIMERA()
// str += " < "
// str += ROUND((sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_exitPedOpen].fDuration*1000)+1000)
// DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
//
// bProgessPastStage11 = FALSE
// ENDIF
IF (DOES_CAM_EXIST(sGarageData.camCutscene) AND IS_CAM_RENDERING(sGarageData.camCutscene))
IF IS_CAM_INTERPOLATING(sGarageData.camCutscene)
#IF IS_DEBUG_BUILD
str = "camCutscene - camCutscene interping"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage11 = FALSE
ENDIF
IF (TIMERA() <= ((sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_exitPedOpen].fDuration*1000)))
#IF IS_DEBUG_BUILD
str = "camCutscene - timera: "
str += TIMERA()
str += " < "
str += ROUND(sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_exitPedOpen].fDuration*1000)
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage11 = FALSE
ENDIF
ELIF (DOES_CAM_EXIST(sGarageData.camCutscene2) AND IS_CAM_RENDERING(sGarageData.camCutscene2))
IF IS_CAM_INTERPOLATING(sGarageData.camCutscene2)
#IF IS_DEBUG_BUILD
str = "camCutscene2 - camCutscene2 interping"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage11 = FALSE
ENDIF
IF (TIMERA() <= ((sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_exitPedOpen].fDuration*1000)))
#IF IS_DEBUG_BUILD
str = "camCutscene2 - timera: "
str += TIMERA()
str += " < "
str += ROUND(sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_exitPedOpen].fDuration*1000)
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage11 = FALSE
ENDIF
ELSE
#IF IS_DEBUG_BUILD
str = "four-five"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage11 = FALSE
ENDIF
IF IS_SYNCHRONIZED_SCENE_RUNNING(iGarageEntrySynchSceneID)
FLOAT fSynchScenePhase
fSynchScenePhase = GET_SYNCHRONIZED_SCENE_PHASE(iGarageEntrySynchSceneID)
IF fSynchScenePhase < fGARAGE_OPEN_PHASE
#IF IS_DEBUG_BUILD
str = "synch scene["
str += iGarageEntrySynchSceneID
str += "] running "
str += GET_STRING_FROM_FLOAT(fSynchScenePhase)
str += " < "
str += GET_STRING_FROM_FLOAT(fGARAGE_OPEN_PHASE)
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
str = "sOpenGarageAnimClip \""
str += sOpenGarageAnimClip
str += "\" "
str += GET_STRING_FROM_FLOAT(GET_ANIM_DURATION(sOpenGarageAnimDict, sOpenGarageAnimClip))
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage11 = FALSE
ELSE
#IF IS_DEBUG_BUILD
str = "synch scene["
str += iGarageEntrySynchSceneID
str += "] ending "
str += GET_STRING_FROM_FLOAT(fSynchScenePhase)
str += " >= "
str += GET_STRING_FROM_FLOAT(fGARAGE_OPEN_PHASE)
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD
str = "synch scene["
str += iGarageEntrySynchSceneID
str += "] NOT running"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
ENDIF
#IF IS_DEBUG_BUILD
IF sGarageVehicleWarpData.bPlaceholder[VEHGEN_GARAGE_SCENE_PAN_exitPedOpen]
SET_TEXT_COLOUR(100, 255, 255, 255)
SET_TEXT_SCALE(0.7, 0.8)
SET_TEXT_WRAP(0.0, 1.0)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.6, 0.85, "STRING", "PLACEHOLDER CAMERA")
ENDIF
#ENDIF
IF bProgessPastStage11
iGarageHelpStage = 0
bLoadSceneStartedFromVehGen = FALSE
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
SETTIMERA(0)
sGarageData.iWarpControl = iCONST_WARP_13_exitFadingOut
ENDIF
BREAK
CASE iCONST_WARP_12_exitVehInt
#IF IS_DEBUG_BUILD
str = "TIMERA(): "
str += TIMERA()
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
IF (TIMERA() > 0500)
VEHICLE_GEN_NAME_ENUM eCurrentVehGen
eCurrentVehGen = GET_GARAGE_VEHICLE_GEN_PLAYER_IS_IN()
IF eCurrentVehGen = VEHGEN_WEB_CAR_MICHAEL
OR eCurrentVehGen = VEHGEN_WEB_CAR_FRANKLIN
OR eCurrentVehGen = VEHGEN_WEB_CAR_TREVOR
VEHICLE_SETUP_STRUCT sDummyStruct
UPDATE_DYNAMIC_VEHICLE_GEN_DATA(eCurrentVehGen, sDummyStruct, <<0,0,0>>, -1)
CLEANUP_VEHICLE_GEN_VEHICLE(eCurrentVehGen)
ELIF eCurrentVehGen != VEHGEN_NONE
IF NOT bExitGarageInDLCVehicle
SET_VEHICLE_GEN_AVAILABLE(eCurrentVehGen, FALSE)
CLEANUP_VEHICLE_GEN_VEHICLE(eCurrentVehGen)
ENDIF
ENDIF
CLEAR_PED_TASKS(PLAYER_PED_ID())
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
REMOVE_ANIM_DICT(sOpenGarageAnimDict)
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
sGarageData.iWarpControl = iCONST_WARP_13_exitFadingOut
ENDIF
BREAK
CASE iCONST_WARP_13_exitFadingOut
#IF IS_DEBUG_BUILD
str = "TIMERA(): "
str += TIMERA()
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
IF IS_SCREEN_FADED_OUT()
INT iSoundID
iSoundID = GET_SOUND_ID()
PLAY_SOUND_FRONTEND(iSoundID,"GARAGE_DOOR_SCRIPTED_CLOSE")
SET_VARIABLE_ON_SOUND(iSoundID, "hold", iGarageHold/1000.0)
RENDER_SCRIPT_CAMS(FALSE,FALSE)
IF DOES_CAM_EXIST(sGarageData.camCutscene)
SET_CAM_ACTIVE(sGarageData.camCutscene, FALSE)
DESTROY_CAM(sGarageData.camCutscene)
ENDIF
IF DOES_CAM_EXIST(sGarageData.camCutscene2)
SET_CAM_ACTIVE(sGarageData.camCutscene2, FALSE)
DESTROY_CAM(sGarageData.camCutscene2)
ENDIF
IF DOES_ENTITY_EXIST(vehFakeGarageEnter)
SET_ENTITY_COLLISION(vehFakeGarageEnter, TRUE)
FREEZE_ENTITY_POSITION(vehFakeGarageEnter, FALSE)
vehFakeGarageEnter = NULL
ENDIF
// IF DOES_ENTITY_EXIST(objFakeGarageDoor)
// DELETE_OBJECT(objFakeGarageDoor)
// ENDIF
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
//SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
FORCE_CLEANUP(FORCE_CLEANUP_FLAG_RANDOM_EVENTS)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF NOT bExitGarageInDLCVehicle
currentVeh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(currentVeh)
AND IS_VEHICLE_DRIVEABLE(currentVeh)
CLEAR_PED_TASKS(PLAYER_PED_ID())
SET_ENTITY_COORDS(currentVeh, sGarageData.sVehGenPurchData.vGarageExitCoords[1])
SET_ENTITY_HEADING(currentVeh, sGarageData.sVehGenPurchData.fGarageExitHeading[1])
SET_VEHICLE_ON_GROUND_PROPERLY(currentVeh)
ENDIF
ENDIF
ELSE
IF IS_SYNCHRONIZED_SCENE_RUNNING(iGarageEntrySynchSceneID)
DETACH_SYNCHRONIZED_SCENE(iGarageEntrySynchSceneID)
ENDIF
iGarageEntrySynchSceneID = -1
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), sGarageData.sVehGenPurchData.vGarageExitCoords[1])
SET_ENTITY_HEADING(PLAYER_PED_ID(), sGarageData.sVehGenPurchData.fGarageExitHeading[1])
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SETTIMERA(0)
sGarageData.iWarpControl = iCONST_WARP_14_exitFadein
ENDIF
BREAK
CASE iCONST_WARP_14_exitFadein
#IF IS_DEBUG_BUILD
str = "TIMERA(): "
str += TIMERA()
str += " > "
str += iGarageHold
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
IF (IS_SCREEN_FADED_OUT() AND TIMERA() > iGarageHold)
BOOL bProgessPastStage12
bProgessPastStage12 = TRUE
IF bExitGarageInDLCVehicle
REQUEST_MODEL(eDLCModel)
IF HAS_MODEL_LOADED(eDLCModel)
VEHICLE_INDEX tempVeh
tempVeh = CREATE_VEHICLE(eDLCModel, sGarageData.sVehGenPurchData.vGarageExitCoords[0], sGarageData.sVehGenPurchData.fGarageExitHeading[0])
IF eDLCModel = WINDSOR
//B* 2326886: Create default blank livery
SET_VEHICLE_LIVERY(tempveh,0)
ENDIF
IF DOES_ENTITY_EXIST(tempVeh)
AND IS_VEHICLE_DRIVEABLE(tempVeh)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), tempVeh)
SET_VEHICLE_DIRT_LEVEL(tempVeh, 0.0)
SET_MODEL_AS_NO_LONGER_NEEDED(eDLCModel)
// Custom setups.
IF HAS_SPAWN_VEHICLE_GOT_CUSTOM_SETUP(eDLCModel)
PRINTLN("HAS_SPAWN_VEHICLE_GOT_CUSTOM_SETUP = TRUE")
SWITCH eDLCModel
CASE MARSHALL
PRINTLN("...setting livery on MARSHALL, iCustomVehicleSelection = ", iCustomVehicleSelection)
SET_VEHICLE_LIVERY(tempVeh, iCustomVehicleSelection)
BREAK
ENDSWITCH
ENDIF
SET_VEHICLE_AS_NO_LONGER_NEEDED(tempVeh)
ENDIF
bExitGarageInDLCVehicle = FALSE
ELSE
#IF IS_DEBUG_BUILD
str = "model \""
str += GET_MODEL_NAME_FOR_DEBUG(eDLCModel)
str += "\" not loaded"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset, HUD_COLOUR_RED)
#ENDIF
bProgessPastStage12 = FALSE
ENDIF
ENDIF
IF (NOT IS_NEW_LOAD_SCENE_ACTIVE())
#IF IS_DEBUG_BUILD
str = "load scene not active"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset, HUD_COLOUR_RED)
#ENDIF
ELIF (IS_NEW_LOAD_SCENE_LOADED())
#IF IS_DEBUG_BUILD
str = "load scene loaded"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
ELSE
#IF IS_DEBUG_BUILD
str = "wait for load scene"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset, HUD_COLOUR_REDDARK)
#ENDIF
bProgessPastStage12 = FALSE
ENDIF
IF bProgessPastStage12
IF DOES_ENTITY_EXIST(lastVehicleBeforeWarp)
AND IS_VEHICLE_DRIVEABLE(lastVehicleBeforeWarp)
//bug:2343256 using veh gen to make sure cars dont just disapear when going in and out of the garages
VEHICLE_INDEX tempVeh
tempVeh = GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MISSION_VEH)
IF GET_VEHICLE_GEN_VEHICLE_SETUP_SAVED_DATA(tempVehicleData,VEHGEN_MISSION_VEH)
SEND_VEHICLE_DATA_TO_IMPOUND_USING_SETUP(tempVehicleData,GET_CURRENT_PLAYER_PED_ENUM())
//Delete if it exists
IF DOES_ENTITY_EXIST(tempVeh)
DELETE_VEHICLE(tempVeh)
ENDIF
ENDIF
IF sGarageData.eClosestGen = VEHGEN_WEB_CAR_MICHAEL
CLEAR_AREA(<<-89.3770, 92.6583, 71.2349>>, 5.0, TRUE)
SET_ENTITY_COORDS(lastVehicleBeforeWarp, <<-89.3770, 92.6583, 71.2349>>)
SET_ENTITY_HEADING(lastVehicleBeforeWarp, 154.4846)
SET_MISSION_VEHICLE_GEN_VEHICLE(lastVehicleBeforeWarp,<<-89.3770, 92.6583, 71.2349>>,154.4846)
ELIF sGarageData.eClosestGen = VEHGEN_WEB_CAR_FRANKLIN
CLEAR_AREA(<<-62.0307, -1839.8585, 25.6787>>, 5.0, TRUE)
SET_ENTITY_COORDS(lastVehicleBeforeWarp, <<-62.0307, -1839.8585, 25.6787>>)
SET_ENTITY_HEADING(lastVehicleBeforeWarp, 319.6985)
SET_MISSION_VEHICLE_GEN_VEHICLE(lastVehicleBeforeWarp,<<-62.0307, -1839.8585, 25.6787>>,319.6985)
ELIF sGarageData.eClosestGen = VEHGEN_WEB_CAR_TREVOR
CLEAR_AREA(<<-234.7648, -1150.3105, 21.9224>>, 5.0, TRUE)
SET_ENTITY_COORDS(lastVehicleBeforeWarp, <<-234.7648, -1150.3105, 21.9224>>)
SET_ENTITY_HEADING(lastVehicleBeforeWarp, 270.8741)
SET_MISSION_VEHICLE_GEN_VEHICLE(lastVehicleBeforeWarp,<<-234.7648, -1150.3105, 21.9224>>,270.8741)
ENDIF
SET_VEHICLE_ON_GROUND_PROPERLY(lastVehicleBeforeWarp)
PRINTLN("Previous vehicle has been repositioned near the garage, added to the MISSION_VEHICLE_GEN")
ENDIF
IF (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()))
currentVeh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(currentVeh)
AND IS_VEHICLE_DRIVEABLE(currentVeh)
SET_ENTITY_COORDS(currentVeh, sGarageVehicleWarpData.mMarkers[VEHGEN_GARAGE_SCENE_MARKER_exitVeh].vPos)
SET_ENTITY_HEADING(currentVeh, sGarageData.sVehGenPurchData.fGarageExitHeading[0])
SET_VEHICLE_ON_GROUND_PROPERLY(currentVeh)
IF eDLCModel = MONSTER
OR eDLCModel = MARSHALL
OR eDLCModel = RHINO
SET_VEHICLE_CAN_SAVE_IN_GARAGE(currentVeh, FALSE)
ELSE
SET_VEHICLE_CAN_SAVE_IN_GARAGE(currentVeh, TRUE)
ENDIF
IF IS_PED_ON_ANY_BIKE(PLAYER_PED_ID())
GIVE_PED_HELMET(PLAYER_PED_ID(), FALSE, PV_FLAG_NONE)
SET_PED_HELMET(PLAYER_PED_ID(), TRUE)
ENDIF
SET_VEHICLE_RADIO_ENABLED(currentVeh, TRUE)
UPDATE_PLAYER_PED_SAVED_VEHICLE(GET_CURRENT_PLAYER_PED_ENUM(), currentVeh, SAVED_VEHICLE_SLOT_MODDED, TRUE)
ENDIF
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
// TASK_VEHICLE_DRIVE_TO_COORD(PLAYER_PED_ID(), currentVeh, sGarageVehicleWarpData.mMarkers[VEHGEN_GARAGE_SCENE_MARKER_exitVeh].vPos, 5.0, DRIVINGSTYLE_NORMAL, DUMMY_MODEL_FOR_SCRIPT, DRIVINGMODE_AVOIDCARS_STOPFORPEDS_OBEYLIGHTS, fCONST_VEHGEN_TARGET_RADIUS, fCONST_VEHGEN_STRAIGHT_LINE_DIST)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
SceneTool_ExecutePan(sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_exitVeh], sGarageData.camCutscene, sGarageData.camCutscene2)
bFakeGarageReverse = FALSE
iGarageClear = -1
sGarageData.iWarpControl = iCONST_WARP_15_exitVehExt
ELSE
REMOVE_ANIM_DICT(sOpenGarageAnimDict)
RESET_VEHICLE_GEN_LOADED_CHECKS()
//DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
RENDER_SCRIPT_CAMS(FALSE,FALSE)
IF DOES_CAM_EXIST(sGarageData.camCutscene)
SET_CAM_ACTIVE(sGarageData.camCutscene, FALSE)
DESTROY_CAM(sGarageData.camCutscene)
ENDIF
IF DOES_CAM_EXIST(sGarageData.camCutscene2)
SET_CAM_ACTIVE(sGarageData.camCutscene2, FALSE)
DESTROY_CAM(sGarageData.camCutscene2)
ENDIF
IF DOES_ENTITY_EXIST(vehFakeGarageEnter)
SET_ENTITY_COLLISION(vehFakeGarageEnter, TRUE)
FREEZE_ENTITY_POSITION(vehFakeGarageEnter, FALSE)
vehFakeGarageEnter = NULL
ENDIF
// IF DOES_ENTITY_EXIST(objFakeGarageDoor)
// DELETE_OBJECT(objFakeGarageDoor)
// ENDIF
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
// IF IS_SYNCHRONIZED_SCENE_RUNNING(iGarageEntrySynchSceneID)
// DETACH_SYNCHRONIZED_SCENE(iGarageEntrySynchSceneID)
// ENDIF
// iGarageEntrySynchSceneID = -1
FORCE_CLEANUP(FORCE_CLEANUP_FLAG_RANDOM_EVENTS)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
// SET_ENTITY_COORDS(PLAYER_PED_ID(), <<198.9538, -1026.1301, -100.0000>>)
// SET_ENTITY_HEADING(PLAYER_PED_ID(), 334.1665)
SET_ENTITY_COORDS(PLAYER_PED_ID(), sGarageData.sVehGenPurchData.vGarageExitCoords[1])
SET_ENTITY_HEADING(PLAYER_PED_ID(), sGarageData.sVehGenPurchData.fGarageExitHeading[1])
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
SETTIMERA(0)
// Moved here due to url:bugstar:2108774
DELETE_VEHICLE_GEN_VEHICLES_IN_AREA(<<198.0043, -999.7775, -100.0000>>, 50.0)
// TASK_GO_STRAIGHT_TO_COORD(PLAYER_PED_ID(), sGarageVehicleWarpData.mMarkers[VEHGEN_GARAGE_SCENE_MARKER_exitPedClose].vPos, PEDMOVE_WALK)
// SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
// SceneTool_ExecutePan(sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_exitPedClose], sGarageData.camCutscene, sGarageData.camCutscene2)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
sGarageData.iWarpControl = iCONST_WARP_16
ENDIF
IF sGarageData.iWarpControl <> iCONST_WARP_16
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ENDIF
//SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
SETTIMERA(0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
// Reposition buddies
INT iNearbyPedCount
INT iNearbyPed
iNearbyPedCount = GET_PED_NEARBY_PEDS(PLAYER_PED_ID(), nearbyPeds)
REPEAT iNearbyPedCount iNearbyPed
IF DOES_ENTITY_EXIST(nearbyPeds[iNearbyPed])
AND NOT IS_PED_INJURED(nearbyPeds[iNearbyPed])
AND IS_PED_GROUP_MEMBER(nearbyPeds[iNearbyPed], GET_PLAYER_GROUP(PLAYER_ID()))
IF (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()))
currentVeh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(currentVeh)
AND IS_VEHICLE_DRIVEABLE(currentVeh)
AND (GET_VEHICLE_MAX_NUMBER_OF_PASSENGERS(currentVeh) > iNearbyPed) // GET_VEHICLE_NUMBER_OF_PASSENGERS(currentVeh))
CPRINTLN(DEBUG_AMBIENT, "PROCESS_GARAGE_VEHICLE_WARP -> reposition player group member [", iNearbyPed, ":", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(nearbyPeds[iNearbyPed])), "] into players vehicle")
SET_PED_INTO_VEHICLE(nearbyPeds[iNearbyPed], currentVeh, INT_TO_ENUM( VEHICLE_SEAT, iNearbyPed ) )
ENDIF
ELSE
CPRINTLN(DEBUG_AMBIENT, "PROCESS_GARAGE_VEHICLE_WARP -> reposition player group member [", iNearbyPed, ":", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(nearbyPeds[iNearbyPed])), "] to exterior ", sGarageData.sVehGenPurchData.vGarageExitCoords[1])
SET_ENTITY_COORDS_NO_OFFSET(nearbyPeds[iNearbyPed], sGarageData.sVehGenPurchData.vGarageExitCoords[1])
ENDIF
ENDIF
ENDREPEAT
//DELETE_VEHICLE_GEN_VEHICLES_IN_AREA(<<198.0043, -999.7775, -100.0000>>, 50.0) - Moved due to url:bugstar:2108774
FORCE_CLEANUP(FORCE_CLEANUP_FLAG_RANDOM_EVENTS)
fakeGarageCarEnterCutsceneStage = 0
ENDIF
ENDIF
BREAK
CASE iCONST_WARP_15_exitVehExt
#IF IS_DEBUG_BUILD
str = "TIMERA(): "
str += TIMERA()
str += " > "
str += ROUND(sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_exitVeh].fDuration*1000)
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
BOOL bProgessPastStage13
bProgessPastStage13 = TRUE
IF (NOT IS_NEW_LOAD_SCENE_ACTIVE())
#IF IS_DEBUG_BUILD
str = "load scene not active"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset, HUD_COLOUR_RED)
#ENDIF
ELIF (IS_NEW_LOAD_SCENE_LOADED())
#IF IS_DEBUG_BUILD
str = "load scene loaded"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
ELSE
#IF IS_DEBUG_BUILD
str = "wait for load scene"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset, HUD_COLOUR_REDDARK)
#ENDIF
bProgessPastStage13 = FALSE
ENDIF
IF HAVE_ALL_VEHICLE_GENS_LOADED_NEAR_PLAYER()
ELSE
#IF IS_DEBUG_BUILD
str = "two - wait for vehgens"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage13 = FALSE
ENDIF
// IF (TIMERA() > ((sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_exitVeh].fDuration*1000)+1000))
//
// ELSE
// str = "emergency timer! - timera: "
// str += TIMERA()
// str += " < "
// str += ROUND((sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_exitVeh].fDuration*1000)+1000)
// DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
//
// bProgessPastStage13 = FALSE
// ENDIF
IF (DOES_CAM_EXIST(sGarageData.camCutscene) AND IS_CAM_RENDERING(sGarageData.camCutscene))
IF IS_CAM_INTERPOLATING(sGarageData.camCutscene)
#IF IS_DEBUG_BUILD
str = "camCutscene - camCutscene interping"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage13 = FALSE
ENDIF
IF (TIMERA() <= ((sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_exitVeh].fDuration*1000)))
#IF IS_DEBUG_BUILD
str = "camCutscene - timera: "
str += TIMERA()
str += " < "
str += ROUND(sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_exitVeh].fDuration*1000)
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage13 = FALSE
ENDIF
ELIF (DOES_CAM_EXIST(sGarageData.camCutscene2) AND IS_CAM_RENDERING(sGarageData.camCutscene2))
IF IS_CAM_INTERPOLATING(sGarageData.camCutscene2)
#IF IS_DEBUG_BUILD
str = "camCutscene2 - camCutscene2 interping"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage13 = FALSE
ENDIF
IF (TIMERA() <= ((sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_exitVeh].fDuration*1000)))
#IF IS_DEBUG_BUILD
str = "camCutscene2 - timera: "
str += TIMERA()
str += " < "
str += ROUND(sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_exitVeh].fDuration*1000)
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage13 = FALSE
ENDIF
ELSE
#IF IS_DEBUG_BUILD
str = "four-five"
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage13 = FALSE
ENDIF
#IF IS_DEBUG_BUILD
IF sGarageVehicleWarpData.bPlaceholder[VEHGEN_GARAGE_SCENE_PAN_exitVeh]
SET_TEXT_COLOUR(100, 255, 255, 255)
SET_TEXT_SCALE(0.7, 0.8)
SET_TEXT_WRAP(0.0, 1.0)
DISPLAY_TEXT_WITH_LITERAL_STRING(0.6, 0.85, "STRING", "PLACEHOLDER CAMERA")
ENDIF
#ENDIF
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
DO_FAKE_GARAGE_CAR_DRIVE(PLAYER_PED_ID(),
sGarageVehicleWarpData.mPoints[VEHGEN_GARAGE_SCENE_POINT_exitVeh],
sGarageVehicleWarpData.mMarkers[VEHGEN_GARAGE_SCENE_MARKER_exitVeh],
(sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_exitVeh].fDuration*1000.0) - 0500,
sGarageVehicleWarpData.mPlacers[VEHGEN_GARAGE_SCENE_PLACER_exitVeh],
GRAPH_TYPE_DECEL,
fStrOffset)
ENDIF
// Moved here due to url:bugstar:2108774
// Clear gararge once player is outside
IF iGarageClear < 1
AND GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), <<198.0043, -999.7775, -100.0000>>) > 55
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc iGarageClear = ", iGarageClear)
IF iGarageClear = 0
DELETE_VEHICLE_GEN_VEHICLES_IN_AREA(<<198.0043, -999.7775, -100.0000>>, 50.0)
ENDIF
iGarageClear++
ENDIF
IF bProgessPastStage13
SETTIMERA(0)
sGarageData.iWarpControl = iCONST_WARP_16
ELSE
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ENDIF
BREAK
CASE iCONST_WARP_16
#IF IS_DEBUG_BUILD
str = "TIMERA(): "
str += TIMERA()
str += " "
str += ROUND(sGarageVehicleWarpData.fHold[VEHGEN_GARAGE_SCENE_PAN_exitVeh]*1000)
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
BOOL bProgessPastStage16
bProgessPastStage16 = TRUE
IF (TIMERA() <= ((sGarageVehicleWarpData.fHold[VEHGEN_GARAGE_SCENE_PAN_exitVeh]*1000)))
#IF IS_DEBUG_BUILD
str = "fHold: "
str += TIMERA()
str += " < "
str += ROUND(sGarageVehicleWarpData.fHold[VEHGEN_GARAGE_SCENE_PAN_exitVeh]*1000)
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
bProgessPastStage16 = FALSE
ENDIF
IF bProgessPastStage16
sGarageData.iWarpControl = iCONST_WARP_17
ENDIF
BREAK
CASE iCONST_WARP_17
#IF IS_DEBUG_BUILD
str = "TIMERA(): "
str += TIMERA()
str += " "
str += ROUND(sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_exitVeh].fDuration*1000)
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
IF IS_VALID_INTERIOR(sGarageData.interiorInstanceIndex)
UNPIN_INTERIOR(sGarageData.interiorInstanceIndex)
ENDIF
g_tlIgnoreBuildingControllerChecks = ""
IF IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_STOP()
ENDIF
SET_INTERIOR_CAPPED_ON_EXIT(INTERIOR_V_GARAGEM_SP, TRUE)
SET_INTERIOR_DISABLED_ON_EXIT(INTERIOR_V_GARAGEM_SP, TRUE)
g_sVehicleGenNSData.bInGarage = FALSE
IF IS_SCREEN_FADED_OUT()
OR IS_SCREEN_FADING_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME_SHORT)
ENDIF
SETTIMERA(0)
//DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
RENDER_SCRIPT_CAMS(FALSE,FALSE)
IF DOES_CAM_EXIST(sGarageData.camCutscene)
SET_CAM_ACTIVE(sGarageData.camCutscene, FALSE)
DESTROY_CAM(sGarageData.camCutscene)
ENDIF
IF DOES_CAM_EXIST(sGarageData.camCutscene2)
SET_CAM_ACTIVE(sGarageData.camCutscene2, FALSE)
DESTROY_CAM(sGarageData.camCutscene2)
ENDIF
IF DOES_ENTITY_EXIST(vehFakeGarageEnter)
SET_ENTITY_COLLISION(vehFakeGarageEnter, TRUE)
FREEZE_ENTITY_POSITION(vehFakeGarageEnter, FALSE)
vehFakeGarageEnter = NULL
ENDIF
// IF DOES_ENTITY_EXIST(objFakeGarageDoor)
// DELETE_OBJECT(objFakeGarageDoor)
// ENDIF
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
currentVeh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(currentVeh)
AND IS_VEHICLE_DRIVEABLE(currentVeh)
SET_ENTITY_COORDS(currentVeh, sGarageVehicleWarpData.mPlacers[VEHGEN_GARAGE_SCENE_PLACER_exitVeh].vPos)
SET_ENTITY_HEADING(currentVeh, sGarageVehicleWarpData.mPlacers[VEHGEN_GARAGE_SCENE_PLACER_exitVeh].fRot)
SET_VEHICLE_ON_GROUND_PROPERLY(currentVeh)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
ENDIF
ENDIF
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
CLEAR_PED_TASKS(PLAYER_PED_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
IF iWantedLevelBeforeWarp > 0
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), iWantedLevelBeforeWarp, FALSE)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID(), FALSE)
ENDIF
IF DOES_ENTITY_EXIST(lastVehicleBeforeWarp)
//AND IS_VEHICLE_DRIVEABLE(lastVehicleBeforeWarp) - rob - 2114869 - ensure the lastvehiclebeforewarp is cleaned up even if dead
AND IS_ENTITY_A_MISSION_ENTITY(lastVehicleBeforeWarp)
AND DOES_ENTITY_BELONG_TO_THIS_SCRIPT(lastVehicleBeforeWarp, FALSE)
AND lastVehicleBeforeWarp <> GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MISSION_VEH) // - 2357715 - Don't delete vehicle if it's being used by the mission vehicle gen
SET_VEHICLE_AS_NO_LONGER_NEEDED(lastVehicleBeforeWarp)
ENDIF
CLEAR_BIT(sData.flags, ENUM_TO_INT(VEHGEN_NS_FLAG_USE_WORLD_RANGE_DIST_CHECKS))
bLoadSceneStartedFromVehGen = FALSE
sGarageData.iWarpControl = iCONST_WARP_18
BREAK
CASE iCONST_WARP_18
#IF IS_DEBUG_BUILD
str = "TIMERA(): "
str += TIMERA()
str += " "
str += ROUND(sGarageVehicleWarpData.mPans[VEHGEN_GARAGE_SCENE_PAN_exitVeh].fDuration*1000)
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iWarpControl, fStrOffset)
#ENDIF
IF IS_SCREEN_FADED_IN()
sGarageData.iWarpControl = iCONST_WARP_0
ENDIF
BREAK
ENDSWITCH
ELSE
IF g_sVehicleGenNSData.bInGarage
PRINTLN("Cleaning up garage interior as garage entry is not allowed.")
SET_INTERIOR_CAPPED_ON_EXIT(INTERIOR_V_GARAGEM_SP, TRUE)
SET_INTERIOR_DISABLED_ON_EXIT(INTERIOR_V_GARAGEM_SP, TRUE)
g_sVehicleGenNSData.bInGarage = FALSE
ENDIF
sGarageData.iWarpControl = iCONST_WARP_0
IF (iGarageEntryContextID != NEW_CONTEXT_INTENTION)
RELEASE_CONTEXT_INTENTION(iGarageEntryContextID)
ENDIF
ENDIF
IF g_sVehicleGenNSData.bInGarage
HIDE_MINIMAP_EXTERIOR_MAP_THIS_FRAME()
DISABLE_SELECTOR_THIS_FRAME()
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON_UNARMED)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON_MELEE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON_HANDGUN)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON_SHOTGUN)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON_SMG)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON_AUTO_RIFLE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON_SNIPER)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON_HEAVY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON_SPECIAL)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_WEAPON_WHEEL_NEXT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_WEAPON_WHEEL_PREV)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_WEAPON_SPECIAL)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_WEAPON_SPECIAL_TWO)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_ALTERNATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_BLOCK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_BLOCK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DETONATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_PICKUP)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_JUMP)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_AIM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_PASSENGER_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SELECT_NEXT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_FLY_SELECT_NEXT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_TALK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_AIM)
ENDIF
IF NOT bPrintWarpHelp
AND sGarageData.iPurchaseControl = 0
IF IS_HELP_MESSAGE_BEING_DISPLAYED()
IF NOT IS_STRING_NULL_OR_EMPTY(tlWarpHelpPrinted)
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("WEB_VEH_INV")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("WEB_VEH_FULL")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CAR_GAR_05")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CAR_GAR_06")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CAR_GAR_EXIT")
CLEAR_HELP()
ENDIF
tlWarpHelpPrinted = ""
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Process the purchase of a garage
PROC PROCESS_GARAGE_PURCHASE()
IF IS_PED_INJURED(PLAYER_PED_ID())
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_FRIENDS)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_PREP)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_RANDOM_CHAR)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR)
OR NOT IS_PLAYER_PED_PLAYABLE(eCurrentPlayerPed)
EXIT
ENDIF
// Emails for vehicles purchases via website
IF NOT g_bBrowserVisible
IF g_savedGlobals.sVehicleGenData.sWebVehicles[eCurrentPlayerPed].todEmailDate[iEmailToProcess] != INVALID_TIMEOFDAY
IF NOT g_sVehicleGenNSData.bLeaveAreaBeforeCreating[g_savedGlobals.sVehicleGenData.sWebVehicles[eCurrentPlayerPed].eVehGen[iEmailToProcess]]
IF IS_TIMEOFDAY_AFTER_TIMEOFDAY(GET_CURRENT_TIMEOFDAY(), g_savedGlobals.sVehicleGenData.sWebVehicles[eCurrentPlayerPed].todEmailDate[iEmailToProcess])
WEBSITE_INDEX_ENUM eSiteID = INT_TO_ENUM(WEBSITE_INDEX_ENUM, g_savedGlobals.sVehicleGenData.sWebVehicles[eCurrentPlayerPed].iSiteID[iEmailToProcess])
CPRINTLN(DEBUG_INTERNET, "SEND_SITE_VEHICLE_CONFIRMATION_MAIL: Site = ",
GET_WEBSITE_FROM_INDEX(eSiteID),
", Veh = ",
GET_LABEL_BUYABLE_VEHICLE(INT_TO_ENUM(SITE_BUYABLE_VEHICLE, iEmailToProcess)),
", Ped = ",
GET_PLAYER_PED_STRING(eCurrentPlayerPed))
SEND_SITE_VEHICLE_CONFIRMATION_MAIL(eSiteID, INT_TO_ENUM(SITE_BUYABLE_VEHICLE, iEmailToProcess), eCurrentPlayerPed)
VEHICLE_GEN_DATA_STRUCT sTempData
GET_VEHICLE_GEN_DATA(sTempData, g_savedGlobals.sVehicleGenData.sWebVehicles[eCurrentPlayerPed].eVehGen[iEmailToProcess])
IF sTempData.model = DUMMY_MODEL_FOR_SCRIPT
//commented out as the car was getting added twice if they took it out of the garage before it hit this. bug:2331192
// VEHICLE_SETUP_STRUCT vss
// CONFIGURE_STRUCT_FOR_BUYABLE_VEHICLE(INT_TO_ENUM(SITE_BUYABLE_VEHICLE, iEmailToProcess), vss, FALSE, eCurrentPlayerPed)
// SET_BIT(vss.iFlags, VEHICLE_SETUP_FLAG_KEEP_DEFAULT_EXTRAS)
// UPDATE_DYNAMIC_VEHICLE_GEN_DATA(g_savedGlobals.sVehicleGenData.sWebVehicles[eCurrentPlayerPed].eVehGen[iEmailToProcess], vss, <<0,0,0>>, -1)
ELSE
// Make sure it is available.
SET_VEHICLE_GEN_AVAILABLE(g_savedGlobals.sVehicleGenData.sWebVehicles[eCurrentPlayerPed].eVehGen[iEmailToProcess], TRUE)
ENDIF
g_savedGlobals.sVehicleGenData.sWebVehicles[eCurrentPlayerPed].todEmailDate[iEmailToProcess] = INVALID_TIMEOFDAY
ENDIF
ENDIF
ENDIF
iEmailToProcess++
IF iEmailToProcess >= ENUM_TO_INT(NUMBER_OF_BUYABLE_VEHICLES_SP)
iEmailToProcess = 0
ENDIF
ENDIF
CONST_INT iCONST_PURCHASE_0 0
CONST_INT iCONST_PURCHASE_1 1
CONST_INT iCONST_PURCHASE_2 2
CONST_INT iCONST_PURCHASE_3 3
CONST_INT iCONST_PURCHASE_4 4
CONST_INT iCONST_PURCHASE_5 5
CONST_INT iCONST_PURCHASE_6 6
CONST_INT iCONST_PURCHASE_7 7
CONST_INT iCONST_PURCHASE_8 8
CONST_INT iCONST_PURCHASE_9 9
CONST_INT iCONST_PURCHASE_90 90
CONST_INT iCONST_PURCHASE_99 99
#IF IS_DEBUG_BUILD
FLOAT fStrOffset = 0
TEXT_LABEL_63 str = "sGarageData.iPurchaseControl: iCONST_PURCHASE_"
str += sGarageData.iPurchaseControl
IF sGarageData.iPurchaseControl > iCONST_PURCHASE_0
DRAW_DEBUG_VEHGEN_SCENE_TEXT(str, sGarageData.iPurchaseControl, fStrOffset, DEFAULT, 1)
ENDIF
#ENDIF
// We update the sGarageData.eClosestGen during the vehicle gen update process
// Clear any previous data and reset
IF GET_ENTITY_MODEL(PLAYER_PED_ID()) != sGarageData.ePedModel
OR sGarageData.iPurchaseControl = iCONST_PURCHASE_99
IF sGarageData.iContextID != NEW_CONTEXT_INTENTION
RELEASE_CONTEXT_INTENTION(sGarageData.iContextID)
ENDIF
IF sGarageData.iPurchaseControl > iCONST_PURCHASE_0
CLEAR_HELP()
ENDIF
sGarageData.ePedModel = GET_ENTITY_MODEL(PLAYER_PED_ID())
sGarageData.iContextID = NEW_CONTEXT_INTENTION
sGarageData.iPurchaseControl = iCONST_PURCHASE_0
sGarageData.iTimer = 0
IF bDoTutorial
IF IS_HELP_MESSAGE_BEING_DISPLAYED()
CLEAR_HELP(TRUE)
ENDIF
RENDER_SCRIPT_CAMS(FALSE,FALSE)
IF DOES_CAM_EXIST(sGarageData.camCutscene)
CDEBUG2LN(DEBUG_AMBIENT, "Destroying Cam1...")
SET_CAM_ACTIVE(sGarageData.camCutscene, FALSE)
DESTROY_CAM(sGarageData.camCutscene)
ENDIF
IF DOES_CAM_EXIST(sGarageData.camCutscene2)
CDEBUG1LN(DEBUG_AMBIENT, "Destroying Cam2...")
SET_CAM_ACTIVE(sGarageData.camCutscene2, FALSE)
DESTROY_CAM(sGarageData.camCutscene2)
ENDIF
SET_ENTITY_VISIBLE(PLAYER_PED_ID(),TRUE)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_EVERYONE_IGNORE_PLAYER(PLAYER_ID(), FALSE)
ENDIF
VEHICLE_INDEX vehLastCar
vehLastCar = GET_PLAYERS_LAST_VEHICLE()
IF DOES_ENTITY_EXIST(vehLastCar)
AND IS_VEHICLE_DRIVEABLE(vehLastCar)
SET_ENTITY_VISIBLE(vehLastCar, TRUE)
FREEZE_ENTITY_POSITION(vehLastCar, FALSE)
IF DOES_ENTITY_BELONG_TO_THIS_SCRIPT(vehLastCar)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehLastCar)
ENDIF
ENDIF
INT iMaxTime, iTimer
iMaxTime = 5000
iTimer = GET_GAME_TIMER()
WHILE NOT IS_GAMEPLAY_CAM_RENDERING()
AND GET_GAME_TIMER() - iTimer < iMaxTime
WAIT(0)
ENDWHILE
IF IS_VALID_INTERIOR(sGarageData.interiorInstanceIndex)
UNPIN_INTERIOR(sGarageData.interiorInstanceIndex)
ENDIF
g_tlIgnoreBuildingControllerChecks = ""
IF sGarageData.eClosestGen = VEHGEN_WEB_CAR_MICHAEL
OR sGarageData.eClosestGen = VEHGEN_WEB_CAR_FRANKLIN
OR sGarageData.eClosestGen = VEHGEN_WEB_CAR_TREVOR
CDEBUG2LN(DEBUG_AMBIENT, "Disabling the interior...")
SET_INTERIOR_CAPPED(INTERIOR_V_GARAGEM_SP, TRUE)
SET_INTERIOR_DISABLED(INTERIOR_V_GARAGEM_SP, TRUE)
ENDIF
NEW_LOAD_SCENE_STOP()
CLEAR_FOCUS()
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
bDoTutorial = FALSE
g_bCurrentlyBuyingProperty = FALSE
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: PROCESS_GARAGE_PURCHASE -> cleaned up cutscene early")
ENDIF
ENDIF
BOOL bSuppressStartPurchase = FALSE
IF (NOT bDoTutorial AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), sGarageData.sVehGenPurchData.vBuyPos1, sGarageData.sVehGenPurchData.vBuyPos2, sGarageData.sVehGenPurchData.fBuyWidth))
OR (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE) AND NOT sGarageData.sVehGenPurchData.bWarpToGarage)
OR (NOT IS_PED_ON_FOOT(PLAYER_PED_ID()) AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE))
OR (NOT bDoTutorial AND GET_VEHICLE_GEN_SAVED_FLAG_STATE(sGarageData.eClosestGen, VEHGEN_S_FLAG_ACQUIRED))
OR (NOT bDoTutorial AND IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_PAUSE))
OR (NOT bDoTutorial AND IS_PAUSE_MENU_ACTIVE())
OR NOT CAN_MISSION_TYPE_START_AGAINST_CURRENT_TYPE(MISSION_TYPE_STORY)
OR GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
OR IS_PED_CLIMBING(PLAYER_PED_ID())
OR IS_PED_ON_VEHICLE(PLAYER_PED_ID())
OR g_bPlayerHasActiveProstitute
OR (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND IS_PED_BEING_JACKED(PLAYER_PED_ID()))
IF sGarageData.iPurchaseControl > iCONST_PURCHASE_0
AND sGarageData.iPurchaseControl != iCONST_PURCHASE_90
bForceGarageChecks = TRUE
sGarageData.iPurchaseControl = iCONST_PURCHASE_99
ENDIF
bSuppressStartPurchase = TRUE
ENDIF
TEXT_LABEL_15 tl15HelpText
FLOAT fStreamingFarClip = 20
NEWLOADSCENE_FLAGS loadSceneFlags = NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE | NEWLOADSCENE_FLAG_REQUIRE_COLLISION
VECTOR vLoadSceneDir
SWITCH sGarageData.iPurchaseControl
CASE iCONST_PURCHASE_0
IF sGarageData.eClosestGen != VEHGEN_NONE
AND GET_VEHICLE_GEN_SAVED_FLAG_STATE(sGarageData.eClosestGen, VEHGEN_S_FLAG_AVAILABLE)
AND NOT GET_VEHICLE_GEN_SAVED_FLAG_STATE(sGarageData.eClosestGen, VEHGEN_S_FLAG_ACQUIRED)
AND NOT bProcessingGarageChecks
AND NOT bSuppressStartPurchase
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), sGarageData.sVehGenPurchData.vBuyPos1, sGarageData.sVehGenPurchData.vBuyPos2, sGarageData.sVehGenPurchData.fBuyWidth)
AND NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
tl15HelpText = sGarageData.sVehGenPurchData.tl15HelpText
tl15HelpText += "_01" // Press ~a~ to buy
REGISTER_CONTEXT_INTENTION(sGarageData.iContextID, CP_MEDIUM_PRIORITY, tl15HelpText)
sGarageData.iPurchaseControl = iCONST_PURCHASE_1
ENDIF
ENDIF
BREAK
CASE iCONST_PURCHASE_1
IF HAS_CONTEXT_BUTTON_TRIGGERED(sGarageData.iContextID)
IF (GET_TOTAL_CASH(eCurrentPlayerPed) < sGarageData.sVehGenPurchData.iCost)
sGarageData.iTimer = GET_GAME_TIMER()
RELEASE_CONTEXT_INTENTION(sGarageData.iContextID)
iContextCounter = 0
sGarageData.iPurchaseControl = iCONST_PURCHASE_90
ELSE
iContextCounter = 0
sGarageData.iTimer = GET_GAME_TIMER()
RELEASE_CONTEXT_INTENTION(sGarageData.iContextID)
sGarageData.iPurchaseControl = iCONST_PURCHASE_2
ENDIF
ENDIF
BREAK
CASE iCONST_PURCHASE_2
iContextCounter++
IF iContextCounter >= 3
tl15HelpText = sGarageData.sVehGenPurchData.tl15HelpText
tl15HelpText += "_02" // Press ~a~ to confirm
REGISTER_CONTEXT_INTENTION(sGarageData.iContextID, CP_MEDIUM_PRIORITY, tl15HelpText)
sGarageData.iPurchaseControl = iCONST_PURCHASE_3
ENDIF
BREAK
CASE iCONST_PURCHASE_3
IF HAS_CONTEXT_BUTTON_TRIGGERED(sGarageData.iContextID)
IF (GET_TOTAL_CASH(eCurrentPlayerPed) < sGarageData.sVehGenPurchData.iCost)
sGarageData.iTimer = GET_GAME_TIMER()
sGarageData.iPurchaseControl = iCONST_PURCHASE_90
ELSE
PLAY_SOUND_FRONTEND(-1, "PROPERTY_PURCHASE_MEDIUM", "HUD_PROPERTY_SOUNDSET")
bDoTutorial = FALSE
IF sGarageData.eClosestGen = VEHGEN_WEB_MARINA_MICHAEL
OR sGarageData.eClosestGen = VEHGEN_WEB_MARINA_TREVOR
OR sGarageData.eClosestGen = VEHGEN_WEB_MARINA_FRANKLIN
//DEBIT_BANK_ACCOUNT(eCurrentPlayerPed, BAAC_PROP_MARINA, sGarageData.sVehGenPurchData.iCost)
sPurchaseMsgData.baacType = BAAC_PROP_MARINA
bDoTutorial = TRUE
ELIF sGarageData.eClosestGen = VEHGEN_WEB_HELIPAD_MICHAEL
OR sGarageData.eClosestGen = VEHGEN_WEB_HELIPAD_FRANKLIN
//DEBIT_BANK_ACCOUNT(eCurrentPlayerPed, BAAC_PROP_HELIPAD, sGarageData.sVehGenPurchData.iCost)
sPurchaseMsgData.baacType = BAAC_PROP_HELIPAD
bDoTutorial = TRUE
ELIF sGarageData.eClosestGen = VEHGEN_WEB_HANGAR_MICHAEL
OR sGarageData.eClosestGen = VEHGEN_WEB_HANGAR_FRANKLIN
//DEBIT_BANK_ACCOUNT(eCurrentPlayerPed, BAAC_PROP_HANGAR, sGarageData.sVehGenPurchData.iCost)
sPurchaseMsgData.baacType = BAAC_PROP_HANGAR
bDoTutorial = TRUE
ELIF sGarageData.eClosestGen = VEHGEN_WEB_CAR_MICHAEL
OR sGarageData.eClosestGen = VEHGEN_WEB_CAR_FRANKLIN
OR sGarageData.eClosestGen = VEHGEN_WEB_CAR_TREVOR
//DEBIT_BANK_ACCOUNT(eCurrentPlayerPed, BAAC_PROP_GARAGE, sGarageData.sVehGenPurchData.iCost)
sPurchaseMsgData.baacType = BAAC_PROP_GARAGE
bDoTutorial = TRUE
ENDIF
// Request the scaleform movie to display at the end
sPurchaseMsgData.siScaleform = REQUEST_SCALEFORM_MOVIE("MIDSIZED_MESSAGE")
sPurchaseMsgData.bMessageSet = FALSE
sPurchaseMsgData.bSoundPlayed = FALSE
sPurchaseMsgData.bMessageOut = FALSE
bLeaveAreaAfterPurchase = TRUE
//Set the buying property global bool to TRUE early
g_bCurrentlyBuyingProperty = TRUE
IF bDoTutorial
// Vehicle garage also within an interior.
IF sGarageData.eClosestGen = VEHGEN_WEB_CAR_MICHAEL
OR sGarageData.eClosestGen = VEHGEN_WEB_CAR_FRANKLIN
OR sGarageData.eClosestGen = VEHGEN_WEB_CAR_TREVOR
SET_INTERIOR_CAPPED(INTERIOR_V_GARAGEM_SP, FALSE)
SET_INTERIOR_DISABLED(INTERIOR_V_GARAGEM_SP, FALSE)
//pin the interior into memory
sGarageData.interiorInstanceIndex = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<198.3659, -1020.2732, -100.0000>>, "v_garagem_sp")
IF IS_VALID_INTERIOR(sGarageData.interiorInstanceIndex)
IF NOT IS_INTERIOR_READY(sGarageData.interiorInstanceIndex)
PIN_INTERIOR_IN_MEMORY(sGarageData.interiorInstanceIndex)
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: PROCESS_GARAGE_PURCHASE -> interior pinned in memory request. frame = ", GET_FRAME_COUNT())
ENDIF
g_tlIgnoreBuildingControllerChecks = "v_garagem_sp"
ENDIF
ENDIF
// rob - 2109875 - set player invincible while loading tutorial assets
SET_PLAYER_INVINCIBLE(PLAYER_ID(), TRUE)
NEW_LOAD_SCENE_STOP()
sGarageData.iTimer = GET_GAME_TIMER()
sGarageData.iPurchaseControl = iCONST_PURCHASE_4
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: PROCESS_GARAGE_PURCHASE -> tutorial set to go ahead")
ELSE
sGarageData.iPurchaseControl = iCONST_PURCHASE_8
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: PROCESS_GARAGE_PURCHASE -> tutorial skipped")
ENDIF
RELEASE_CONTEXT_INTENTION(sGarageData.iContextID)
ENDIF
ENDIF
BREAK
CASE iCONST_PURCHASE_4
BOOL bSafeToContinue
bSafeToContinue = TRUE
// Wait for interior to be uncapped/enabled...
IF sGarageData.eClosestGen = VEHGEN_WEB_CAR_MICHAEL
OR sGarageData.eClosestGen = VEHGEN_WEB_CAR_FRANKLIN
OR sGarageData.eClosestGen = VEHGEN_WEB_CAR_TREVOR
sGarageData.interiorInstanceIndex = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<198.3659, -1020.2732, -100.0000>>, "v_garagem_sp")
IF NOT IS_VALID_INTERIOR(sGarageData.interiorInstanceIndex)
OR IS_INTERIOR_CAPPED(sGarageData.interiorInstanceIndex)
OR IS_INTERIOR_DISABLED(sGarageData.interiorInstanceIndex)
SET_INTERIOR_CAPPED(INTERIOR_V_GARAGEM_SP, FALSE)
SET_INTERIOR_DISABLED(INTERIOR_V_GARAGEM_SP, FALSE)
bSafeToContinue = FALSE
ENDIF
ENDIF
IF bSafeToContinue
// tweak the default values for the hangar setups
IF sGarageData.eClosestGen = VEHGEN_WEB_HANGAR_MICHAEL
fStreamingFarClip = 95.0 // for use with NEW_LOAD_SCENE_START bigger dist for hangars as the shot is pulled out a lot
loadSceneFlags = NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE
ELIF sGarageData.eClosestGen = VEHGEN_WEB_HANGAR_FRANKLIN
fStreamingFarClip = 150.0 // for use with NEW_LOAD_SCENE_START bigger dist for hangars as the shot is pulled out a lot
loadSceneFlags = NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE
ELIF sGarageData.eClosestGen = VEHGEN_WEB_CAR_MICHAEL
OR sGarageData.eClosestGen = VEHGEN_WEB_CAR_FRANKLIN
OR sGarageData.eClosestGen = VEHGEN_WEB_CAR_TREVOR
fStreamingFarClip = 150.0 // for use with NEW_LOAD_SCENE_START bigger dist for hangars as the shot is pulled out a lot
loadSceneFlags = NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE
ENDIF
vLoadSceneDir = <<COS(sGarageData.sVehGenPurchData.mPans1.mStart.vRot.Z+90), SIN(sGarageData.sVehGenPurchData.mPans1.mStart.vRot.Z+90), 0.0>>
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: PROCESS_GARAGE_PURCHASE -> NEW_LOAD_SCENE_START - Pos : ", sGarageData.sVehGenPurchData.mPans2.mStart.vPos,
" vLoadSceneDir was :", vLoadSceneDir, " fStreamingFarClip : ", fStreamingFarClip, " loadSceneFlags : ", loadSceneFlags)
IF sGarageData.eClosestGen = VEHGEN_WEB_CAR_MICHAEL
OR sGarageData.eClosestGen = VEHGEN_WEB_CAR_FRANKLIN
OR sGarageData.eClosestGen = VEHGEN_WEB_CAR_TREVOR
IF NEW_LOAD_SCENE_START_SPHERE(<<200.4651, -1020.6310, -100.0000>>, 50.0)
OR ((GET_GAME_TIMER() - sGarageData.iTimer) > 3500) // fail safe for NEW_LOAD_SCENE_START() not returning TRUE
sGarageData.iTimer = GET_GAME_TIMER()
sGarageData.iPurchaseControl = iCONST_PURCHASE_5
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: PROCESS_GARAGE_PURCHASE -> load scene for cutscene setup.
Fail safe timer at - (GET_GAME_TIMER() - sGarageData.iTimer) > 3500) : ", ((GET_GAME_TIMER() - sGarageData.iTimer) > 3500))
ENDIF
ELSE
// B*1155612 - stream in area ready for the cutscene shot
IF NEW_LOAD_SCENE_START(sGarageData.sVehGenPurchData.mPans1.mStart.vPos, vLoadSceneDir, fStreamingFarClip, loadSceneFlags)
OR ((GET_GAME_TIMER() - sGarageData.iTimer) > 3500) // fail safe for NEW_LOAD_SCENE_START() not returning TRUE
sGarageData.iTimer = GET_GAME_TIMER()
sGarageData.iPurchaseControl = iCONST_PURCHASE_5
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: PROCESS_GARAGE_PURCHASE -> load scene for cutscene setup.
Fail safe timer at - (GET_GAME_TIMER() - sGarageData.iTimer) > 3500) : ", ((GET_GAME_TIMER() - sGarageData.iTimer) > 3500))
ENDIF
ENDIF
ENDIF
BREAK
CASE iCONST_PURCHASE_5
IF (IS_NEW_LOAD_SCENE_ACTIVE()
AND IS_NEW_LOAD_SCENE_LOADED()
AND (NOT IS_VALID_INTERIOR(sGarageData.interiorInstanceIndex) OR IS_INTERIOR_READY(sGarageData.interiorInstanceIndex)))
OR ((GET_GAME_TIMER() - sGarageData.iTimer) > 10000) // fail safe for IS_NEW_LOAD_SCENE_LOADED() not returning TRUE
sGarageData.iTimer = GET_GAME_TIMER()
sGarageData.iPurchaseControl = iCONST_PURCHASE_6
ELSE
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: PROCESS_GARAGE_PURCHASE -> cutscene waiting on load scene : ", ((GET_GAME_TIMER() - sGarageData.iTimer)))
ENDIF
BREAK
CASE iCONST_PURCHASE_6
IF ((GET_GAME_TIMER() - sGarageData.iTimer) > 1000) // hold load scene for a second
// rob - 2114869 - clear previous lastVehicleBeforeWarp
IF DOES_ENTITY_EXIST(lastVehicleBeforeWarp)
AND IS_ENTITY_A_MISSION_ENTITY(lastVehicleBeforeWarp)
AND DOES_ENTITY_BELONG_TO_THIS_SCRIPT(lastVehicleBeforeWarp)
SET_VEHICLE_AS_NO_LONGER_NEEDED(lastVehicleBeforeWarp)
ENDIF
lastVehicleBeforeWarp = GET_PLAYERS_LAST_VEHICLE()
IF DOES_ENTITY_EXIST(lastVehicleBeforeWarp)
AND IS_VEHICLE_DRIVEABLE(lastVehicleBeforeWarp)
AND NOT IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(lastVehicleBeforeWarp))
AND NOT IS_THIS_MODEL_A_PLANE(GET_ENTITY_MODEL(lastVehicleBeforeWarp))
AND NOT IS_THIS_MODEL_A_BOAT(GET_ENTITY_MODEL(lastVehicleBeforeWarp))
IF NOT IS_ENTITY_A_MISSION_ENTITY(lastVehicleBeforeWarp)
SET_ENTITY_AS_MISSION_ENTITY(lastVehicleBeforeWarp, FALSE, FALSE)
ENDIF
ELSE
lastVehicleBeforeWarp = NULL
ENDIF
SET_ENTITY_VISIBLE(PLAYER_PED_ID(),FALSE)
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_REMOVE_EXPLOSIONS)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_REMOVE_PROJECTILES)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_REENABLE_CONTROL_ON_DEATH)
SET_EVERYONE_IGNORE_PLAYER(PLAYER_ID(), TRUE)
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
CLEAR_PRINTS()
CLEAR_HELP()
//vLoadSceneDir = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(sGarageData.sVehGenPurchData.mPans2.mStart.vPos, sGarageData.sVehGenPurchData.mPans2.mStart.vPos.Z, <<0.0,1.0,0.0>>) // works but gives negative values whic the load scene func asserts about
vLoadSceneDir = <<COS(sGarageData.sVehGenPurchData.mPans1.mStart.vRot.Z+90), SIN(sGarageData.sVehGenPurchData.mPans1.mStart.vRot.Z+90), 0.0>>
IF NOT sGarageData.sVehGenPurchData.bWarpToGarage
SET_FOCUS_POS_AND_VEL(sGarageData.sVehGenPurchData.mPans1.mStart.vPos, vLoadSceneDir) // sGarageData.sVehGenData.coords, << 0.0, 0.0, 0.0 >>) // B*1155612 - streaming improvement
ENDIF
// Setup the cutscene camera
IF NOT DOES_CAM_EXIST(sGarageData.camCutscene)
sGarageData.camCutscene = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
ENDIF
IF DOES_CAM_EXIST(sGarageData.camCutscene)
IF sGarageData.sVehGenPurchData.bWarpToGarage
SET_ROOM_FOR_GAME_VIEWPORT_BY_NAME("GtaMloRoom001")
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
// SET_CAM_PARAMS(sGarageData.camCutscene,sGarageData.sVehGenPurchData.vCamPos1,sGarageData.sVehGenPurchData.vCamRot1,sGarageData.sVehGenPurchData.fCamFov1, 0)
// SET_CAM_PARAMS(sGarageData.camCutscene,sGarageData.sVehGenPurchData.vCamPos2,sGarageData.sVehGenPurchData.vCamRot2,sGarageData.sVehGenPurchData.fCamFov2, 7500, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
// SHAKE_CAM(sGarageData.camCutscene,"HAND_SHAKE",0.2)
SceneTool_ExecutePan(sGarageData.sVehGenPurchData.mPans1, sGarageData.camCutscene, sGarageData.camCutscene2)
ENDIF
RENDER_SCRIPT_CAMS(TRUE,FALSE)
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
NEW_LOAD_SCENE_STOP()
sGarageData.iPurchaseControl = iCONST_PURCHASE_7
sGarageData.iTimer = GET_GAME_TIMER()
RELEASE_CONTEXT_INTENTION(sGarageData.iContextID)
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: PROCESS_GARAGE_PURCHASE -> start cutscene")
ENDIF
BREAK
CASE iCONST_PURCHASE_7
IF (GET_GAME_TIMER() - sGarageData.iTimer) < 7000
AND NOT IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
tl15HelpText = sGarageData.sVehGenPurchData.tl15HelpText
tl15HelpText += "_05" //Updated for B*1155613
// Helipad - Helicopters purchased from websites or that you land here will be stored here.
// Marina - Boats purchased from websites or that you dock here will be stored here.
// Hangar - Planes purchased from websites or that you land here will be stored here.
// Garafe - Vehicles purchased from websites or driven into the garage will be stored here.
PRINT_HELP(tl15HelpText)
// stream in the area for the next camera shot ready
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
// tweak the default values for the hangar setups
IF sGarageData.eClosestGen = VEHGEN_WEB_HANGAR_MICHAEL
OR sGarageData.eClosestGen = VEHGEN_WEB_HANGAR_FRANKLIN
fStreamingFarClip = 85.0 // for use with NEW_LOAD_SCENE_START bigger dist for hangars as the shot is pulled out a lot
loadSceneFlags = NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE
ENDIF
vLoadSceneDir = <<COS(sGarageData.sVehGenPurchData.mPans2.mStart.vPos.Z+90), SIN(sGarageData.sVehGenPurchData.mPans2.mStart.vPos.Z+90), 0.0>>
NEW_LOAD_SCENE_START(sGarageData.sVehGenPurchData.mPans2.mStart.vPos, vLoadSceneDir, fStreamingFarClip, loadSceneFlags)
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: PROCESS_GARAGE_PURCHASE -> NEW_LOAD_SCENE_START - Pos : ", sGarageData.sVehGenPurchData.mPans2.mStart.vPos,
" vLoadSceneDir was :", vLoadSceneDir, " fStreamingFarClip : ", fStreamingFarClip, " loadSceneFlags : ", loadSceneFlags)
ENDIF
ELSE
IF DOES_CAM_EXIST(sGarageData.camCutscene)
IF sGarageData.sVehGenPurchData.bWarpToGarage
SET_ROOM_FOR_GAME_VIEWPORT_BY_NAME("GtaMloRoom001")
ENDIF
// SET_CAM_PARAMS(sGarageData.camCutscene,sGarageData.sVehGenPurchData.vCamPos3,sGarageData.sVehGenPurchData.vCamRot3,sGarageData.sVehGenPurchData.fCamFov3, 0)
// SET_CAM_PARAMS(sGarageData.camCutscene,sGarageData.sVehGenPurchData.vCamPos4,sGarageData.sVehGenPurchData.vCamRot4,sGarageData.sVehGenPurchData.fCamFov4, 11500, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
// SHAKE_CAM(sGarageData.camCutscene,"HAND_SHAKE",0.2)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
SceneTool_ExecutePan(sGarageData.sVehGenPurchData.mPans2, sGarageData.camCutscene, sGarageData.camCutscene2)
ENDIF
CLEAR_FOCUS()
CLEAR_HELP()
sGarageData.iTimer = GET_GAME_TIMER()
sGarageData.iPurchaseControl = iCONST_PURCHASE_8
ENDIF
BREAK
CASE iCONST_PURCHASE_8
IF (GET_GAME_TIMER() - sGarageData.iTimer) < 7000
AND NOT IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
tl15HelpText = sGarageData.sVehGenPurchData.tl15HelpText
tl15HelpText += "_06" //Updated for B*1155613
// Helipad - Whilst at the helipad use ~PAD_DPAD_RIGHT~ to select which helicopter you want to pilot.
// Marina - Whilst at the slip use ~PAD_DPAD_RIGHT~ to select which boat you want to pilot.
// Hangar - Whilst in the hangar use ~PAD_DPAD_RIGHT~ to select which plane you want to pilot.
// Garage - Special vehicles will also be stored here. Visit PlayStation®Store to find new downloadable content.
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
PRINT_HELP(tl15HelpText, 7000)
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: Printing 'Whilst in the hangar'... help")
ENDIF
ELSE
CLEAR_HELP()
sGarageData.iTimer = GET_GAME_TIMER()
sGarageData.iPurchaseControl = iCONST_PURCHASE_9
ENDIF
BREAK
CASE iCONST_PURCHASE_9
IF (GET_GAME_TIMER() - sGarageData.iTimer) < 3500
AND NOT IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
tl15HelpText = sGarageData.sVehGenPurchData.tl15HelpText
tl15HelpText += "_03" // Purchased
//PRINT_HELP(tl15HelpText)
IF HAS_SCALEFORM_MOVIE_LOADED(sPurchaseMsgData.siScaleform)
IF sPurchaseMsgData.bMessageSet
// The property type has been passed to the scaleform message to display it
IF NOT sPurchaseMsgData.bSoundPlayed
PLAY_SOUND_FRONTEND(-1, "UNDER_THE_BRIDGE", "HUD_AWARDS")
sPurchaseMsgData.bSoundPlayed = TRUE
ENDIF
DRAW_SCALEFORM_MOVIE_FULLSCREEN(sPurchaseMsgData.siScaleform, 255, 255, 255, 255)
ELSE
BEGIN_SCALEFORM_MOVIE_METHOD(sPurchaseMsgData.siScaleform, "SHOW_SHARD_MIDSIZED_MESSAGE")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(tl15HelpText)
END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE()
sPurchaseMsgData.bMessageSet = TRUE
ENDIF
ENDIF
ELIF (GET_GAME_TIMER() - sGarageData.iTimer) < 4000
AND NOT IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
IF HAS_SCALEFORM_MOVIE_LOADED(sPurchaseMsgData.siScaleform)
IF sPurchaseMsgData.bMessageOut
DRAW_SCALEFORM_MOVIE_FULLSCREEN(sPurchaseMsgData.siScaleform, 255, 255, 255, 255)
ELSE
BEGIN_SCALEFORM_MOVIE_METHOD(sPurchaseMsgData.siScaleform, "SHARD_ANIM_OUT")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(HUD_COLOUR_WHITE))
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(0.33)
END_SCALEFORM_MOVIE_METHOD()
sPurchaseMsgData.bMessageOut = TRUE
ENDIF
ENDIF
ELSE
IF bDoTutorial // cutscene cleanup (also done if we drop out early...update this to do it in one place to keep things in sync)
/*IF IS_HELP_MESSAGE_BEING_DISPLAYED()
CLEAR_HELP(TRUE)
ENDIF*/
RENDER_SCRIPT_CAMS(FALSE,FALSE)
IF DOES_CAM_EXIST(sGarageData.camCutscene)
CDEBUG2LN(DEBUG_AMBIENT, "Destroying Cam1...")
SET_CAM_ACTIVE(sGarageData.camCutscene, FALSE)
DESTROY_CAM(sGarageData.camCutscene)
ENDIF
IF DOES_CAM_EXIST(sGarageData.camCutscene2)
CDEBUG1LN(DEBUG_AMBIENT, "Destroying Cam2...")
SET_CAM_ACTIVE(sGarageData.camCutscene2, FALSE)
DESTROY_CAM(sGarageData.camCutscene2)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
SET_ENTITY_VISIBLE(PLAYER_PED_ID(),TRUE)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
VEHICLE_INDEX vehLastCar
vehLastCar = GET_PLAYERS_LAST_VEHICLE()
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_EVERYONE_IGNORE_PLAYER(PLAYER_ID(), FALSE)
IF DOES_ENTITY_EXIST(vehLastCar)
AND IS_VEHICLE_DRIVEABLE(vehLastCar)
AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehLastCar)
SET_ENTITY_COORDS(vehLastCar, sGarageData.sVehGenPurchData.vPlayerCoords, TRUE, TRUE)
SET_ENTITY_HEADING(vehLastCar, sGarageData.sVehGenPurchData.fPlayerHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(vehLastCar)
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), sGarageData.sVehGenPurchData.vPlayerCoords, TRUE, TRUE)
SET_ENTITY_HEADING(PLAYER_PED_ID(), sGarageData.sVehGenPurchData.fPlayerHeading)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(lastVehicleBeforeWarp)
AND IS_VEHICLE_DRIVEABLE(lastVehicleBeforeWarp)
//bug:2343256 using veh gen to make sure cars dont just disapear when going in and out of the garages
VEHICLE_INDEX tempVeh
tempveh = GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MISSION_VEH)
IF GET_VEHICLE_GEN_VEHICLE_SETUP_SAVED_DATA(tempVehicleData,VEHGEN_MISSION_VEH)
SEND_VEHICLE_DATA_TO_IMPOUND_USING_SETUP(tempVehicleData,GET_CURRENT_PLAYER_PED_ENUM())
//Delete if it exists
IF DOES_ENTITY_EXIST(tempVeh)
DELETE_VEHICLE(tempVeh)
ENDIF
ENDIF
IF sGarageData.eClosestGen = VEHGEN_WEB_CAR_MICHAEL
CLEAR_AREA(<<-89.3770, 92.6583, 71.2349>>, 5.0, TRUE)
SET_ENTITY_COORDS(lastVehicleBeforeWarp, <<-89.3770, 92.6583, 71.2349>>)
SET_ENTITY_HEADING(lastVehicleBeforeWarp, 154.4846)
SET_MISSION_VEHICLE_GEN_VEHICLE(lastVehicleBeforeWarp,<<-89.3770, 92.6583, 71.2349>>,154.4846)
ELIF sGarageData.eClosestGen = VEHGEN_WEB_CAR_FRANKLIN
CLEAR_AREA(<<-62.0307, -1839.8585, 25.6787>>, 5.0, TRUE)
SET_ENTITY_COORDS(lastVehicleBeforeWarp, <<-62.0307, -1839.8585, 25.6787>>)
SET_ENTITY_HEADING(lastVehicleBeforeWarp, 319.6985)
SET_MISSION_VEHICLE_GEN_VEHICLE(lastVehicleBeforeWarp,<<-62.0307, -1839.8585, 25.6787>>,319.6985)
ELIF sGarageData.eClosestGen = VEHGEN_WEB_CAR_TREVOR
CLEAR_AREA(<<-234.7648, -1150.3105, 21.9224>>, 5.0, TRUE)
SET_ENTITY_COORDS(lastVehicleBeforeWarp, <<-234.7648, -1150.3105, 21.9224>>)
SET_ENTITY_HEADING(lastVehicleBeforeWarp, 270.8741)
SET_MISSION_VEHICLE_GEN_VEHICLE(lastVehicleBeforeWarp,<<-234.7648, -1150.3105, 21.9224>>,270.8741)
ENDIF
SET_VEHICLE_ON_GROUND_PROPERLY(lastVehicleBeforeWarp)
ENDIF
IF DOES_ENTITY_EXIST(vehLastCar)
AND IS_VEHICLE_DRIVEABLE(vehLastCar)
SET_ENTITY_VISIBLE(vehLastCar, TRUE)
FREEZE_ENTITY_POSITION(vehLastCar, FALSE)
IF DOES_ENTITY_BELONG_TO_THIS_SCRIPT(vehLastCar)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehLastCar)
ENDIF
ENDIF
INT iMaxTime, iTimer
iMaxTime = 5000
iTimer = GET_GAME_TIMER()
WHILE NOT IS_GAMEPLAY_CAM_RENDERING()
AND GET_GAME_TIMER() - iTimer < iMaxTime
WAIT(0)
ENDWHILE
IF IS_VALID_INTERIOR(sGarageData.interiorInstanceIndex)
UNPIN_INTERIOR(sGarageData.interiorInstanceIndex)
ENDIF
g_tlIgnoreBuildingControllerChecks = ""
IF sGarageData.eClosestGen = VEHGEN_WEB_CAR_MICHAEL
OR sGarageData.eClosestGen = VEHGEN_WEB_CAR_FRANKLIN
OR sGarageData.eClosestGen = VEHGEN_WEB_CAR_TREVOR
CDEBUG2LN(DEBUG_AMBIENT, "Disabling the interior...")
SET_INTERIOR_CAPPED(INTERIOR_V_GARAGEM_SP, TRUE)
SET_INTERIOR_DISABLED(INTERIOR_V_GARAGEM_SP, TRUE)
g_savedGlobals.sVehicleGenData.bGarageIntroRun = TRUE
ENDIF
NEW_LOAD_SCENE_STOP()
CLEAR_FOCUS()
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
bDoTutorial = FALSE
g_bCurrentlyBuyingProperty = FALSE
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: PROCESS_GARAGE_PURCHASE -> finished cutscene")
ENDIF
IF HAS_SCALEFORM_MOVIE_LOADED(sPurchaseMsgData.siScaleform)
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(sPurchaseMsgData.siScaleform)
ENDIF
DEBIT_BANK_ACCOUNT(eCurrentPlayerPed, sPurchaseMsgData.baacType, sGarageData.sVehGenPurchData.iCost)
SET_VEHICLE_GEN_SAVED_FLAG_STATE(sGarageData.eClosestGen, VEHGEN_S_FLAG_ACQUIRED, TRUE)
//Queue up a dynamic email for this property purchase.
SEND_DYNAMIC_EMAIL_FOR_PROPERTY_PURCHASE(sGarageData.eClosestGen)
// Delete the blip so we can change sprite when it gets re-created at the spawn coords
IF DOES_BLIP_EXIST(g_sVehicleGenNSData.blipID[sGarageData.eClosestGen])
REMOVE_BLIP(g_sVehicleGenNSData.blipID[sGarageData.eClosestGen])
ENDIF
ePurchasedVehicleGen = sGarageData.eClosestGen
MAKE_AUTOSAVE_REQUEST()
sGarageData.iPurchaseControl = iCONST_PURCHASE_99
ENDIF
BREAK
CASE iCONST_PURCHASE_90
iContextCounter++
IF iContextCounter >= 3
IF (GET_GAME_TIMER() - sGarageData.iTimer) < 4000
tl15HelpText = sGarageData.sVehGenPurchData.tl15HelpText
tl15HelpText += "_04" // You can't afford
PRINT_HELP_FOREVER(tl15HelpText)
ELSE
sGarageData.iPurchaseControl = iCONST_PURCHASE_99
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE: Allows player to purchase a save garage and store/select vehicles.
PROC DO_PURCHASABLE_GARAGE_PROCESSING()
PROCESS_GARAGE_PURCHASE()
PROCESS_GARAGE_VEHICLE_WARP()
PROCESS_GARAGE_VEHICLE_SELECT()
PROCESS_GARAGE_VEHICLE_DROPOFF()
ENDPROC
PROC DO_PLAYER_VEHICLE_BLIP_MANAGEMENT()
// Remove the blip
IF DOES_BLIP_EXIST(g_sVehicleGenNSData.blipPlayerVehicle)
BOOL bRemoveBlip = FALSE
// Remove blip if the character has changed.
IF eCurrentPlayerPed != g_sVehicleGenNSData.ePlayerVehiclePed
PRINTLN("[PVB] DO_PLAYER_VEHICLE_BLIP_MANAGEMENT - Removing player vehicle blip for character swap")
bRemoveBlip = TRUE
// Do not show the blip on mission.
ELIF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_FRIENDS)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_PREP)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_RANDOM_CHAR)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_ANIMAL)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR)
PRINTLN("[PVB] DO_PLAYER_VEHICLE_BLIP_MANAGEMENT - Removing player vehicle blip for mission")
bRemoveBlip = TRUE
// If we added for coords, make sure it's still safe
ELIF g_sVehicleGenNSData.bPlayerVehicleBlipUsingCoords
IF NOT ARE_VECTORS_ALMOST_EQUAL(g_sVehicleGenNSData.vPlayerVehicleCoords, GET_BLIP_COORDS(g_sVehicleGenNSData.blipPlayerVehicle))
OR GET_NUMBER_OF_SCRIPT_CREATED_PLAYER_VEHICLES(g_sVehicleGenNSData.ePlayerVehiclePed, GET_PLAYER_VEH_MODEL(g_sVehicleGenNSData.ePlayerVehiclePed, VEHICLE_TYPE_CAR)) > 0
PRINTLN("[PVB] DO_PLAYER_VEHICLE_BLIP_MANAGEMENT - Removing player vehicle blip at coords")
bRemoveBlip = TRUE
ENDIF
ELIF g_sVehicleGenNSData.bPlayerVehicleBlipUsingCoordsCached
IF NOT ARE_VECTORS_ALMOST_EQUAL(g_sVehicleGenNSData.vPlayerVehicleCoordsCached, GET_BLIP_COORDS(g_sVehicleGenNSData.blipPlayerVehicle))
OR GET_NUMBER_OF_SCRIPT_CREATED_PLAYER_VEHICLES(g_sVehicleGenNSData.ePlayerVehiclePed, GET_PLAYER_VEH_MODEL(g_sVehicleGenNSData.ePlayerVehiclePed, VEHICLE_TYPE_CAR)) > 0
PRINTLN("[PVB] DO_PLAYER_VEHICLE_BLIP_MANAGEMENT - Removing player vehicle blip at cached coords")
bRemoveBlip = TRUE
ENDIF
// Otherwise check the vehicle is still safe
ELSE
IF NOT DOES_ENTITY_EXIST(g_sVehicleGenNSData.vehPlayerVehicle)
OR NOT IS_VEHICLE_DRIVEABLE(g_sVehicleGenNSData.vehPlayerVehicle)
OR (NOT IS_PED_INJURED(PLAYER_PED_ID()) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), g_sVehicleGenNSData.vehPlayerVehicle))
// If the vehicle exists but has been destroyed we should clear out the cached coords.
IF DOES_ENTITY_EXIST(g_sVehicleGenNSData.vehPlayerVehicle)
AND NOT IS_VEHICLE_DRIVEABLE(g_sVehicleGenNSData.vehPlayerVehicle)
g_sVehicleGenNSData.vPlayerVehicleCoordsCached = <<0,0,0>>
ENDIF
PRINTLN("[PVB] DO_PLAYER_VEHICLE_BLIP_MANAGEMENT - Removing player vehicle blip on vehicle")
bRemoveBlip = TRUE
ELSE
// - To prevent blips popping in and out as we wait for the vehgen update to take place
// we cache the coords so we can estimate the position
// If the vehicle exists but has been destroyed we should clear out the cached coords.
IF DOES_ENTITY_EXIST(g_sVehicleGenNSData.vehPlayerVehicle)
IF IS_VEHICLE_DRIVEABLE(g_sVehicleGenNSData.vehPlayerVehicle)
g_sVehicleGenNSData.vPlayerVehicleCoordsCached = GET_ENTITY_COORDS(g_sVehicleGenNSData.vehPlayerVehicle)
ELSE
g_sVehicleGenNSData.vPlayerVehicleCoordsCached = <<0,0,0>>
ENDIF
ENDIF
ENDIF
ENDIF
IF bRemoveBlip
REMOVE_BLIP(g_sVehicleGenNSData.blipPlayerVehicle)
g_sVehicleGenNSData.bPlayerVehicleBlipUsingCoords = FALSE
g_sVehicleGenNSData.bPlayerVehicleBlipUsingCoordsCached = FALSE
g_sVehicleGenNSData.vehPlayerVehicle = NULL
ENDIF
ELSE
g_sVehicleGenNSData.bPlayerVehicleBlipUsingCoords = FALSE
g_sVehicleGenNSData.bPlayerVehicleBlipUsingCoordsCached = FALSE
g_sVehicleGenNSData.vehPlayerVehicle = NULL
ENDIF
// Add the blip
IF NOT DOES_BLIP_EXIST(g_sVehicleGenNSData.blipPlayerVehicle)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_FRIENDS)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_PREP)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_RANDOM_CHAR)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_ANIMAL)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR)
// Get the current players vehicle.
BOOL bVehicleAvailable = FALSE
INT i
REPEAT NUM_PLAYER_VEHICLE_IDS i
IF g_eCreatedPlayerVehiclePed[i] != NO_CHARACTER
AND g_eCreatedPlayerVehicleModel[i] != DUMMY_MODEL_FOR_SCRIPT
AND DOES_ENTITY_EXIST(g_viCreatedPlayerVehicleIDs[i])
AND IS_VEHICLE_DRIVEABLE(g_viCreatedPlayerVehicleIDs[i])
AND NOT DOES_BLIP_EXIST(GET_BLIP_FROM_ENTITY(g_viCreatedPlayerVehicleIDs[i]))
AND g_eCreatedPlayerVehiclePed[i] = eCurrentPlayerPed
AND IS_THIS_MODEL_A_CAR(GET_ENTITY_MODEL(g_viCreatedPlayerVehicleIDs[i]))
IF (NOT IS_PED_INJURED(PLAYER_PED_ID()) AND NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), g_viCreatedPlayerVehicleIDs[i]))
PRINTLN("[PVB] DO_PLAYER_VEHICLE_BLIP_MANAGEMENT - Adding player vehicle blip for vehicle")
g_sVehicleGenNSData.vehPlayerVehicle = g_viCreatedPlayerVehicleIDs[i]
g_sVehicleGenNSData.ePlayerVehiclePed = eCurrentPlayerPed
g_sVehicleGenNSData.bPlayerVehicleBlipUsingCoords = FALSE
g_sVehicleGenNSData.blipPlayerVehicle = ADD_BLIP_FOR_ENTITY(g_sVehicleGenNSData.vehPlayerVehicle)
ENDIF
i = NUM_PLAYER_VEHICLE_IDS+1// Bail
bVehicleAvailable = TRUE
ENDIF
ENDREPEAT
IF NOT bVehicleAvailable
// No vehicle? Try vehgen coords.
IF NOT DOES_BLIP_EXIST(g_sVehicleGenNSData.blipPlayerVehicle)
AND NOT ARE_VECTORS_EQUAL(g_sVehicleGenNSData.vPlayerVehicleCoords, <<0,0,0>>)
PRINTLN("[PVB] DO_PLAYER_VEHICLE_BLIP_MANAGEMENT - Adding player vehicle blip for coords")
g_sVehicleGenNSData.vehPlayerVehicle = NULL
g_sVehicleGenNSData.ePlayerVehiclePed = eCurrentPlayerPed
g_sVehicleGenNSData.bPlayerVehicleBlipUsingCoords = TRUE
g_sVehicleGenNSData.blipPlayerVehicle = ADD_BLIP_FOR_COORD(g_sVehicleGenNSData.vPlayerVehicleCoords)
ENDIF
// No vehicle? Try cached coords.
IF NOT DOES_BLIP_EXIST(g_sVehicleGenNSData.blipPlayerVehicle)
AND NOT ARE_VECTORS_EQUAL(g_sVehicleGenNSData.vPlayerVehicleCoordsCached, <<0,0,0>>)
PRINTLN("[PVB] DO_PLAYER_VEHICLE_BLIP_MANAGEMENT - Adding player vehicle blip for cached coords")
g_sVehicleGenNSData.vehPlayerVehicle = NULL
g_sVehicleGenNSData.ePlayerVehiclePed = eCurrentPlayerPed
g_sVehicleGenNSData.bPlayerVehicleBlipUsingCoordsCached = TRUE
g_sVehicleGenNSData.blipPlayerVehicle = ADD_BLIP_FOR_COORD(g_sVehicleGenNSData.vPlayerVehicleCoordsCached)
ENDIF
ELSE
// Clear out some flags
g_sVehicleGenNSData.bPlayerVehicleBlipUsingCoords = FALSE
g_sVehicleGenNSData.bPlayerVehicleBlipUsingCoordsCached = FALSE
ENDIF
// Configure the blip
IF DOES_BLIP_EXIST(g_sVehicleGenNSData.blipPlayerVehicle)
SET_BLIP_SPRITE(g_sVehicleGenNSData.blipPlayerVehicle, RADAR_TRACE_GANG_VEHICLE)
SET_BLIP_NAME_FROM_TEXT_FILE(g_sVehicleGenNSData.blipPlayerVehicle, "PVEHICLE")
SET_BLIP_AS_SHORT_RANGE(g_sVehicleGenNSData.blipPlayerVehicle, FALSE)
SET_BLIP_PRIORITY(g_sVehicleGenNSData.blipPlayerVehicle, BLIPPRIORITY_LOW)
INT iBlipCol
IF eCurrentPlayerPed = CHAR_MICHAEL
iBlipCol = BLIP_COLOUR_MICHAEL
ELIF eCurrentPlayerPed = CHAR_FRANKLIN
iBlipCol = BLIP_COLOUR_FRANKLIN
ELIF eCurrentPlayerPed = CHAR_TREVOR
iBlipCol = BLIP_COLOUR_TREVOR
ENDIF
SET_BLIP_COLOUR(g_sVehicleGenNSData.blipPlayerVehicle, iBlipCol)
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_ANY_VEHICLE_IMPOUND_SLOT_OCCUPIED(enumCharacterList ePed)
INT i
REPEAT MAX_IMPOUND_SLOTS i
IF IS_VEHICLE_IMPOUND_SLOT_OCCUPIED(i, ePed)
RETURN TRUE
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
FUNC BOOL IS_IMPOUND_AREA_OCCUPIED_BY_VEHICLES_OR_PEDS()
IF IS_POSITION_OCCUPIED(<<431.442352,-997.730835,24.761612>>, 4.75, FALSE, TRUE, TRUE, FALSE, FALSE)
RETURN TRUE
ELIF IS_POSITION_OCCUPIED(<<436.691315,-997.586914,24.755816>>, 4.75, FALSE, TRUE, TRUE, FALSE, FALSE)
RETURN TRUE
ELIF IS_POSITION_OCCUPIED(<<431.07, -1005.57, 26.20>>, 4.75, FALSE, TRUE, TRUE, FALSE, FALSE)
RETURN TRUE
ELIF IS_POSITION_OCCUPIED(<<436.52, -1005.47, 26.17>>, 4.75, FALSE, TRUE, TRUE, FALSE, FALSE)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Disables player controls, but enables certain actions like frontend up/down, accept/cancel and looking around with the right stick
PROC DISABLE_PLAYER_CONTROLS()
DISABLE_ALL_CONTROL_ACTIONS(PLAYER_CONTROL)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_FRONTEND_UP)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_FRONTEND_DOWN)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_FRONTEND_ACCEPT)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_FRONTEND_CANCEL)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_LR)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_UD)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CURSOR_X)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CURSOR_Y)
ENDPROC
PROC DO_IMPOUND_SELECT_PROCESSING()
BOOL bCursorAccept = FALSE
//////////////////////////////////////////////////////
/// LAST CAR FOR IMPOUND
///
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("startup_positioning")) = 0
IF g_savedGlobals.sVehicleGenData.bTrackingImpoundVehicle
IF NOT DOES_ENTITY_EXIST(g_vCarToTrackForImpound)
SEND_VEHICLE_DATA_TO_IMPOUND_USING_SETUP(g_savedGlobals.sVehicleGenData.sCarForImpound, g_savedGlobals.sVehicleGenData.eCurrentTrackedChar)
g_savedGlobals.sVehicleGenData.bTrackingImpoundVehicle = FALSE
ELIF NOT IS_VEHICLE_DRIVEABLE(g_vCarToTrackForImpound)
OR IS_VEHICLE_IN_PLAYERS_GARAGE(g_vCarToTrackForImpound, g_savedGlobals.sVehicleGenData.eCurrentTrackedChar, TRUE)
g_savedGlobals.sVehicleGenData.bTrackingImpoundVehicle = FALSE
PRINTLN("DO_IMPOUND_SELECT_PROCESSING - Impound track vehicle chracter has entered garage - stop tracking")
ELSE
// Update the last character to use the vehicle gen so we send it to the correct impound slot.
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) = g_vCarToTrackForImpound
AND GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) != g_savedGlobals.sVehicleGenData.eCurrentTrackedChar
PRINTLN("DO_IMPOUND_SELECT_PROCESSING - Impound track vehicle chracter has changed, updating eCurrentTrackedChar.")
g_savedGlobals.sVehicleGenData.eCurrentTrackedChar = GET_PLAYER_PED_ENUM(PLAYER_PED_ID())
ENDIF
// Stop tracking if this is owned by the vehicle gen controller script
IF g_vCarToTrackForImpound != vehImpoundedPlayerVehicle
INT iInstanceID
STRING sScriptName = GET_ENTITY_SCRIPT(g_vCarToTrackForImpound, iInstanceID)
IF NOT IS_STRING_NULL_OR_EMPTY(sScriptName)
IF GET_HASH_KEY(sScriptName) = GET_HASH_KEY("vehicle_gen_controller")
PRINTLN("DO_IMPOUND_SELECT_PROCESSING - Impound track vehicle is now owned by vehicle gen controller, not sending to impound. model: ",GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(g_vCarToTrackForImpound)))
g_savedGlobals.sVehicleGenData.bTrackingImpoundVehicle = FALSE
// Keep a hold of this vehicle ID so we can re-track if it is no longer owned by the vehicle gen script.
vehPreviousCarToTrackForImpound = g_vCarToTrackForImpound
IF g_sVehicleGenNSData.vehicleID[VEHGEN_MISSION_VEH] = g_vCarToTrackForImpound
OR (g_vehHandoverToGen = g_vCarToTrackForImpound AND g_eVehGenToRecieveVehicle = VEHGEN_MISSION_VEH)
SET_PACKED_STAT_INT(PACKED_SP_VEHGEN_TRACKED_FOR_IMPOUND, ENUM_TO_INT(VEHGEN_MISSION_VEH))
ELSE
SET_PACKED_STAT_INT(PACKED_SP_VEHGEN_TRACKED_FOR_IMPOUND, 0)
ENDIF
g_vCarToTrackForImpound = NULL
ENDIF
ENDIF
ENDIF
// Stop tracking if we have switched away and the switch system has a handle to this vehicle.
IF g_savedGlobals.sVehicleGenData.eCurrentTrackedChar != GET_CURRENT_PLAYER_PED_ENUM()
AND g_sPlayerLastVeh[g_savedGlobals.sVehicleGenData.eCurrentTrackedChar].model = g_savedGlobals.sVehicleGenData.sCarForImpound.eModel
AND ARE_STRINGS_EQUAL(g_sPlayerLastVeh[g_savedGlobals.sVehicleGenData.eCurrentTrackedChar].tlNumberPlate, g_savedGlobals.sVehicleGenData.sCarForImpound.tlPlateText)
AND NOT IS_PLAYER_SWITCH_IN_PROGRESS()
PRINTLN("DO_IMPOUND_SELECT_PROCESSING - Impound track vehicle is now stored in switch data, not sending to impound.")
CLONE_VEHICLE_SETUP_STRUCT(g_savedGlobals.sVehicleGenData.sCarForImpound, g_savedGlobals.sVehicleGenData.sImpoundSwitchVehicles[g_savedGlobals.sVehicleGenData.eCurrentTrackedChar])
g_savedGlobals.sVehicleGenData.bTrackingImpoundVehicle = FALSE
PRINTLN("IMPOUND FIX 1 - previous impound track is now handled by the switch vehicle - ignore")
vehPreviousCarToTrackForImpound = NULL
SET_PACKED_STAT_INT(PACKED_SP_VEHGEN_TRACKED_FOR_IMPOUND, 0)
g_vCarToTrackForImpound = NULL
ENDIF
ENDIF
ELSE
// Track again if player removes from garage
IF DOES_ENTITY_EXIST(g_vCarToTrackForImpound)
AND IS_VEHICLE_DRIVEABLE(g_vCarToTrackForImpound)
AND NOT IS_VEHICLE_IN_PLAYERS_GARAGE(g_vCarToTrackForImpound, g_savedGlobals.sVehicleGenData.eCurrentTrackedChar, TRUE)
g_savedGlobals.sVehicleGenData.bTrackingImpoundVehicle = TRUE
PRINTLN("DO_IMPOUND_SELECT_PROCESSING - Impound track vehicle chracter has left garage - start tracking")
ENDIF
ENDIF
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// IMPOUND FIX 1 - If a previous impound vehicle was owned by a vehicle gen script, re-track if it's no longer owned by it.
///
IF DOES_ENTITY_EXIST(vehPreviousCarToTrackForImpound)
AND IS_VEHICLE_DRIVEABLE(vehPreviousCarToTrackForImpound)
IF NOT g_savedGlobals.sVehicleGenData.bTrackingImpoundVehicle
AND vehPreviousCarToTrackForImpound != g_vCarToTrackForImpound
AND vehPreviousCarToTrackForImpound != vehLastMissionVehGenToStreamOut
AND NOT DOES_ENTITY_BELONG_TO_THIS_SCRIPT(vehPreviousCarToTrackForImpound)
PRINTLN("IMPOUND FIX 1 - previous impound track is no longer a vehgen - re-track")
TRACK_VEHICLE_FOR_IMPOUND(vehPreviousCarToTrackForImpound)
vehPreviousCarToTrackForImpound = NULL
SET_PACKED_STAT_INT(PACKED_SP_VEHGEN_TRACKED_FOR_IMPOUND, 0)
ENDIF
ELSE
IF vehPreviousCarToTrackForImpound != NULL
PRINTLN("IMPOUND FIX 1 - previous impound track is no longer valid - ignore")
vehPreviousCarToTrackForImpound = NULL
SET_PACKED_STAT_INT(PACKED_SP_VEHGEN_TRACKED_FOR_IMPOUND, 0)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vehLastMissionVehGenToStreamOut)
AND IS_VEHICLE_DRIVEABLE(vehLastMissionVehGenToStreamOut)
// Nothing to do just now.
ELSE
IF vehLastMissionVehGenToStreamOut != NULL
PRINTLN("IMPOUND FIX 1 - mission vehicle gen streamed out by code so clear vehicle index")
vehLastMissionVehGenToStreamOut = NULL
ENDIF
ENDIF
ENDIF
//////////////////////////////////////////////////////
/// LAST MISSION VEHGEN FOR IMPOUND
///
IF sTempImpoundVehData.eModel != DUMMY_MODEL_FOR_SCRIPT
AND g_vehHandoverToGen = NULL
SEND_VEHICLE_DATA_TO_IMPOUND_USING_SETUP(sTempImpoundVehData, eTempImpoundChar)
sTempImpoundVehData.eModel = DUMMY_MODEL_FOR_SCRIPT
ENDIF
VECTOR vLocatePos1 = <<433.672119,-1006.537537,25.963509>>
VECTOR vLocatePos2 = <<433.657806,-1017.500000,32.098953>>
FLOAT fWidth = 11.25
IF iImpoundMenuControl > 0
AND iImpoundMenuControl < 99
IF iImpoundMenuControl != 3
IF IS_PED_INJURED(PLAYER_PED_ID())
OR NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), vLocatePos1, vLocatePos2, fWidth)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_FRIENDS)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_PREP)
OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR)
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Cancel impound retrieval...")
iImpoundMenuControl = 99
ENDIF
ENDIF
ENDIF
IF IS_ANY_VEHICLE_IMPOUND_SLOT_OCCUPIED(eCurrentPlayerPed)
IF NOT DOES_BLIP_EXIST(blipImpound)
IF (IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_OFF_MISSION) OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_EXILE))
AND iImpoundMenuControl != 3
// AND GET_TOTAL_CASH(eCurrentPlayerPed) >= 250
AND NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
blipImpound = CREATE_BLIP_FOR_COORD(<<428.37, -1013.50, 27.93>>)
SET_BLIP_SPRITE(blipImpound, RADAR_TRACE_GANG_VEHICLE)
SET_BLIP_NAME_FROM_TEXT_FILE(blipImpound, "IMPOUND_BLIPNAME")
SET_BLIP_AS_SHORT_RANGE(blipImpound, TRUE)
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Car impounded, blip created")
ENDIF
ELIF NOT (IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_OFF_MISSION) OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_EXILE))
OR iImpoundMenuControl = 3
// OR GET_TOTAL_CASH(eCurrentPlayerPed) < 250
OR IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
REMOVE_BLIP(blipImpound)
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Removed blip because player is on-mission, wanted or still collecting")
ENDIF
ELSE
IF DOES_BLIP_EXIST(blipImpound)
REMOVE_BLIP(blipImpound)
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> No cars impounded, removing blip")
ENDIF
ENDIF
SWITCH iImpoundMenuControl
CASE 0
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF sGarageData.iPurchaseControl = 0 // not running cutscne
and (IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_OFF_MISSION) OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_EXILE))
AND NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
IF IS_ANY_VEHICLE_IMPOUND_SLOT_OCCUPIED(eCurrentPlayerPed)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), vLocatePos1, vLocatePos2, fWidth)
if GET_TOTAL_CASH(eCurrentPlayerPed) >= 250
INT iNumOccupiedSlots
iNumOccupiedSlots = 0
INT i
REPEAT MAX_IMPOUND_SLOTS i
IF IS_VEHICLE_IMPOUND_SLOT_OCCUPIED(i, eCurrentPlayerPed)
iNumOccupiedSlots++
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Player can start impound retrieval")
IF iNumOccupiedSlots > 1
REGISTER_CONTEXT_INTENTION(iImpoundMenuContextID, CP_MEDIUM_PRIORITY, "IMPOUND_TRIG2") // Press ~a~ to retrieve an impounded vehicle.
ELSE
REGISTER_CONTEXT_INTENTION(iImpoundMenuContextID, CP_MEDIUM_PRIORITY, "IMPOUND_TRIG1") // Press ~a~ to retrieve an impounded vehicle for $250.
ENDIF
iImpoundMenuControl = 1
else
PRINT_HELP("SCLUB_NO_MONEY")
endif
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND LOAD_MENU_ASSETS()
//CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Waiting to start impound retrieval...")
IF HAS_CONTEXT_BUTTON_TRIGGERED(iImpoundMenuContextID)
RELEASE_CONTEXT_INTENTION(iImpoundMenuContextID)
CLEAR_PED_TASKS(PLAYER_PED_ID())
DISABLE_PLAYER_CONTROLS()
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Player began impound retrieval")
INT iNumOccupiedSlots
iNumOccupiedSlots = 0
INT i
REPEAT MAX_IMPOUND_SLOTS i
IF IS_VEHICLE_IMPOUND_SLOT_OCCUPIED(i, eCurrentPlayerPed)
iNumOccupiedSlots++
ENDIF
ENDREPEAT
IF iNumOccupiedSlots > 1
bMenuInitialised = FALSE
bMenuRebuild = FALSE
bConfirmUpdate = FALSE
iImpoundMenuSelection = -1
iImpoundMenuControl++
ELSE
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Only 1 impound car, skipping menu!")
INT iVeh
REPEAT MAX_IMPOUND_SLOTS iVeh
IF IS_VEHICLE_IMPOUND_SLOT_OCCUPIED(iVeh, eCurrentPlayerPed)
VECTOR vSpawnLoc
IF iVeh = 0
// Use the 'first' location
vSpawnLoc = <<431.40, -997.33, 24.76>>
// 179.24
ELSE
// Use the 'second' location
vSpawnLoc = <<436.39, -997.25, 24.76>>
// 179.24
ENDIF
WHILE NOT CREATE_IMPOUND_VEHICLE(vehImpoundedPlayerVehicle, iVeh, vSpawnLoc, 179.24, TRUE)
WAIT(0)
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Waiting to create Impound car...")
ENDWHILE
IF DOES_ENTITY_EXIST(vehImpoundedPlayerVehicle)
IF iVeh = 0
LOCK_AUTOMATIC_DOOR_OPEN(AUTODOOR_IMPOUND_L, TRUE, FALSE)
ELSE
LOCK_AUTOMATIC_DOOR_OPEN(AUTODOOR_IMPOUND_R, TRUE, FALSE)
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Impound car created")
// Charge the player here
DEBIT_BANK_ACCOUNT(eCurrentPlayerPed, BAAC_POLICE_STATION_SC, 250)
CLEAR_VEHICLE_IMPOUND_SLOT(iVeh)
TRACK_VEHICLE_FOR_IMPOUND(vehImpoundedPlayerVehicle, GET_CURRENT_PLAYER_PED_ENUM())
CLEANUP_MENU_ASSETS()
iImpoundMenuControl = 3
RELEASE_CONTEXT_INTENTION(iImpoundMenuContextID)
iImpoundMenuContextID = NEW_CONTEXT_INTENTION
bConfirmUpdate = FALSE
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
INT n
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
n = 0
BREAK
CASE CHAR_FRANKLIN
n = 1
BREAK
CASE CHAR_TREVOR
n = 2
BREAK
ENDSWITCH
DISABLE_PLAYER_CONTROLS()
//CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Disabling vehicle cinematic cam")
// Build the menu
IF NOT bMenuInitialised OR bMenuRebuild
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Initialising menu")
CLEAR_MENU_DATA()
SET_MENU_ITEM_LAYOUT(MENU_ITEM_TEXT, MENU_ITEM_TEXT)
SET_MENU_ITEM_JUSTIFICATION(FONT_LEFT, FONT_RIGHT)
SET_MENU_TITLE("IMPOUND_TITLE")
iImpoundMenuOptions = 0
INT iFirstMenuItem
iFirstMenuItem = -1
INT iVeh, iItem
// Grab the current item.
iItem = 0
REPEAT MAX_IMPOUND_SLOTS iVeh
IF IS_VEHICLE_IMPOUND_SLOT_OCCUPIED(iVeh, eCurrentPlayerPed)
ADD_MENU_ITEM_TEXT(iItem, GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(g_savedGlobals.sVehicleGenData.sImpoundVehicles[n][iVeh].eModel))
IF iFirstMenuItem = -1
iFirstMenuItem = iItem
iImpoundMenuSelection = iItem
ENDIF
SET_BIT(iImpoundMenuOptions, iItem)
iImpoundMenuSlotTrack[iItem] = iVeh // Store which impound slot this vehicle is in
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> ","BUILD MENU: Adding impounded vehicle ", iVeh, " to menu slot ", iItem)
ADD_MENU_ITEM_TEXT(iItem, "IMPOUND_COST", 1)
ADD_MENU_ITEM_TEXT_COMPONENT_INT(250) //This may change to some sort of algorithmic thing based on how much the vehicle costs
iItem++
ENDIF
ENDREPEAT
iItem = 0
SET_CURRENT_MENU_ITEM(iImpoundMenuSelection)
bRebuildHelp = TRUE
bMenuRebuild = FALSE
bMenuInitialised = TRUE
ELSE
///////////////////////////////////
// Mouse menu support
bCursorAccept = FALSE
IF IS_PC_VERSION()
IF IS_USING_CURSOR(FRONTEND_CONTROL)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_LR)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_UD)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CURSOR_ACCEPT)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CURSOR_CANCEL)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CURSOR_SCROLL_UP)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CURSOR_SCROLL_DOWN)
HANDLE_CURSOR_HIGHLIGHTED_MENU_ITEMS()
HANDLE_MENU_CURSOR(FALSE)
IF IS_MENU_CURSOR_ACCEPT_RELEASED()
IF g_iMenuCursorItem != iImpoundMenuSelection
PLAY_SOUND_FRONTEND(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET")
iImpoundMenuSelection = g_iMenuCursorItem
SET_CURRENT_MENU_ITEM(iImpoundMenuSelection)
bRebuildHelp = TRUE
ELSE
bCursorAccept = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
// Up
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_UP)
OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_SCROLL_UP)
IF NOT bConfirmUpdate
bRebuildHelp = TRUE
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Player UP")
PLAY_SOUND_FRONTEND(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET")
INT i
BOOL bItemFound
FOR i = (iImpoundMenuSelection-1) TO 0 STEP -1
IF IS_BIT_SET(iImpoundMenuOptions, i)
iImpoundMenuSelection = i
bItemFound = TRUE
i = 0 // Bail
ENDIF
ENDFOR
IF NOT bItemFound
FOR i = 31 TO (iImpoundMenuSelection+1) STEP -1
IF IS_BIT_SET(iImpoundMenuOptions, i)
iImpoundMenuSelection = i
bItemFound = TRUE
i = iImpoundMenuSelection // Bail
ENDIF
ENDFOR
ENDIF
IF bItemFound
SET_CURRENT_MENU_ITEM(iImpoundMenuSelection)
ENDIF
ELSE
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Player confirming choice, disable directions!")
ENDIF
// Down
ELIF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_DOWN)
OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_SCROLL_DOWN)
IF NOT bConfirmUpdate
bRebuildHelp = TRUE
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Player DOWN")
PLAY_SOUND_FRONTEND(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET")
INT i
BOOL bItemFound
FOR i = (iImpoundMenuSelection+1) TO 31
IF IS_BIT_SET(iImpoundMenuOptions, i)
iImpoundMenuSelection = i
bItemFound = TRUE
i = 31 // Bail
ENDIF
ENDFOR
IF NOT bItemFound
FOR i = 0 TO (iImpoundMenuSelection-1)
IF IS_BIT_SET(iImpoundMenuOptions, i)
iImpoundMenuSelection = i
bItemFound = TRUE
i = iImpoundMenuSelection // Bail
ENDIF
ENDFOR
ENDIF
IF bItemFound
SET_CURRENT_MENU_ITEM(iImpoundMenuSelection)
ENDIF
ELSE
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Player confirming choice, disable directions!")
ENDIF
// Select
ELIF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
OR bCursorAccept = TRUE
bCursorAccept = FALSE
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Player ACCEPT")
PLAY_SOUND_FRONTEND(-1, "SELECT", "HUD_FRONTEND_DEFAULT_SOUNDSET")
// Confirm
IF (NOT bConfirmUpdate)
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Player confirming...")
SET_CURRENT_MENU_ITEM_DESCRIPTION("IMPOUND_CNF")
REMOVE_MENU_HELP_KEYS()
ADD_MENU_HELP_KEY_INPUT( INPUT_FRONTEND_ACCEPT, "ITEM_YES")
ADD_MENU_HELP_KEY_INPUT( INPUT_FRONTEND_CANCEL, "ITEM_NO")
bConfirmUpdate = TRUE
ELSE
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Player confirmed!")
VECTOR vSpawnLoc
IF iImpoundMenuSelection = 0
// Use the 'first' location
vSpawnLoc = <<431.40, -997.33, 24.76>>
// 179.24
ELSE
// Use the 'second' location
vSpawnLoc = <<436.39, -997.25, 24.76>>
// 179.24
ENDIF
IF IS_VEHICLE_IMPOUND_SLOT_OCCUPIED(iImpoundMenuSlotTrack[iImpoundMenuSelection], eCurrentPlayerPed)
WHILE NOT CREATE_IMPOUND_VEHICLE(vehImpoundedPlayerVehicle, iImpoundMenuSlotTrack[iImpoundMenuSelection], vSpawnLoc, 179.24, TRUE)
WAIT(0)
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Waiting to create Impound car...")
ENDWHILE
IF DOES_ENTITY_EXIST(vehImpoundedPlayerVehicle)
IF iImpoundMenuSelection = 0
LOCK_AUTOMATIC_DOOR_OPEN(AUTODOOR_IMPOUND_L, TRUE, FALSE)
ELSE
LOCK_AUTOMATIC_DOOR_OPEN(AUTODOOR_IMPOUND_R, TRUE, FALSE)
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Impound car created")
// Charge the player here
DEBIT_BANK_ACCOUNT(eCurrentPlayerPed, BAAC_POLICE_STATION_SC, 250)
CLEAR_VEHICLE_IMPOUND_SLOT(iImpoundMenuSlotTrack[iImpoundMenuSelection])
TRACK_VEHICLE_FOR_IMPOUND(vehImpoundedPlayerVehicle, GET_CURRENT_PLAYER_PED_ENUM())
CLEANUP_MENU_ASSETS()
iImpoundMenuControl++
RELEASE_CONTEXT_INTENTION(iImpoundMenuContextID)
iImpoundMenuContextID = NEW_CONTEXT_INTENTION
bConfirmUpdate = FALSE
ENDIF
ENDIF
bMenuRebuild = TRUE
ENDIF
// Exit/Decline
ELIF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
OR IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_CURSOR_CANCEL)
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Player CANCEL")
PLAY_SOUND_FRONTEND(-1, "BACK", "HUD_FRONTEND_DEFAULT_SOUNDSET")
// Decline
IF bConfirmUpdate
bRebuildHelp = TRUE
bConfirmUpdate = FALSE
ELSE
iImpoundMenuControl = 99
ENDIF
ENDIF
ENDIF
HIDE_HUD_AND_RADAR_THIS_FRAME()
IF bRebuildHelp
SET_CURRENT_MENU_ITEM_DESCRIPTION("")
REMOVE_MENU_HELP_KEYS()
ADD_MENU_HELP_KEY_INPUT( INPUT_FRONTEND_ACCEPT, "ITEM_SELECT")
ADD_MENU_HELP_KEY_INPUT( INPUT_FRONTEND_CANCEL, "ITEM_EXIT")
bConfirmUpdate = FALSE
bRebuildHelp = FALSE
ENDIF
IF LOAD_MENU_ASSETS()
DRAW_MENU()
ENDIF
BREAK
CASE 3
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), <<431.40, -997.33, 24.76>>) > 20
AND NOT IS_IMPOUND_AREA_OCCUPIED_BY_VEHICLES_OR_PEDS()
// Player has left the immediate area and it is clear of things in the way
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Player recovered vehicle, area clear, closing normally...")
TRACK_VEHICLE_FOR_IMPOUND(vehImpoundedPlayerVehicle, GET_CURRENT_PLAYER_PED_ENUM())
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Player vehicle being tracked for impound")
iImpoundMenuControl = 99
ELIF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), <<431.40, -997.33, 24.76>>) > 100
// Player has left the area but there are vehicles/peds in the way of the doors
IF DOES_ENTITY_EXIST(vehImpoundedPlayerVehicle)
IF NOT IS_ENTITY_DEAD(vehImpoundedPlayerVehicle)
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehImpoundedPlayerVehicle)
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(vehImpoundedPlayerVehicle), GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE)) > 100
IF NOT IS_ENTITY_ON_SCREEN(vehImpoundedPlayerVehicle)
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Player recovered vehicle, didn't drive it away, area not clear!")
SEND_VEHICLE_DATA_TO_IMPOUND_USING_VEHICLE(vehImpoundedPlayerVehicle, TRUE) //Re-impound vehicle if player didn't take it
DELETE_VEHICLE(vehImpoundedPlayerVehicle) //Remove this instance of the vehicle
CLEAR_AREA_OF_VEHICLES(<<431.40, -997.33, 24.76>>, 10.0, DEFAULT, DEFAULT, TRUE, TRUE) //Remove all the left vehicles around the impound
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Vehicle re-impounded, area cleared")
iImpoundMenuControl = 99
ENDIF
ELIF IS_PED_IN_VEHICLE(PLAYER_PED_ID(),vehImpoundedPlayerVehicle)
// If the player is in the new vehicle, assume they don't care about anything left behind
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Player recovered vehicle, area not clear!")
CLEAR_AREA_OF_VEHICLES(<<431.40, -997.33, 24.76>>, 10.0, DEFAULT, DEFAULT, TRUE, TRUE) //Remove all the left vehicles around the impound
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Area cleared")
TRACK_VEHICLE_FOR_IMPOUND(vehImpoundedPlayerVehicle, GET_CURRENT_PLAYER_PED_ENUM())
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Player vehicle being tracked for impound")
iImpoundMenuControl = 99
ENDIF
ELSE
// If the new vehicle was created but is now dead, clear the area now we're far enough away
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Recovered vehicle dead? Clearing up area...")
CLEAR_AREA_OF_VEHICLES(<<431.40, -997.33, 24.76>>, 10.0, DEFAULT, DEFAULT, TRUE, TRUE) //Remove all the left vehicles around the impound
iImpoundMenuControl = 99
ENDIF
ELSE
// If the new vehicle doesn't exist or wasn't created, why are we here?
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Recovered vehicle doesn't exist!? Clearing up area...")
CLEAR_AREA_OF_VEHICLES(<<431.40, -997.33, 24.76>>, 10.0, DEFAULT, DEFAULT, TRUE, TRUE) //Remove all the left vehicles around the impound
iImpoundMenuControl = 99
ENDIF
ENDIF
BREAK
CASE 99
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
RELEASE_CONTEXT_INTENTION(iImpoundMenuContextID)
INT i
REPEAT MAX_IMPOUND_SLOTS i
iImpoundMenuSlotTrack[i] = -1
ENDREPEAT
LOCK_AUTOMATIC_DOOR_OPEN(AUTODOOR_IMPOUND_L, FALSE, FALSE)
LOCK_AUTOMATIC_DOOR_OPEN(AUTODOOR_IMPOUND_R, FALSE, FALSE)
IF DOES_ENTITY_EXIST(vehImpoundedPlayerVehicle)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehImpoundedPlayerVehicle)
ENDIF
CPRINTLN(DEBUG_AMBIENT, "vehicle_gen_controller.sc: DO_IMPOUND_SELECT_PROCESSING -> Done!")
iImpoundMenuControl = 0
BREAK
ENDSWITCH
// Fix for 2039985 - Opening door if player is locked inside.
IF iImpoundMenuControl = 0
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<428.292847,-996.683411,24.488642>>, <<439.543823,-996.711365,28.103334>>, 8.687500)
IF NOT bImpoundDoorOverride
PRINTLN("IMPOUND_DOOR - Unlocking impound door as player is stuck inside")
LOCK_AUTOMATIC_DOOR_OPEN(AUTODOOR_IMPOUND_L, TRUE, FALSE)
bImpoundDoorOverride = TRUE
ENDIF
ELIF bImpoundDoorOverride
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<431.271484,-1004.058960,23.981976>>, <<431.039429,-993.620972,27.618681>>, 6.812500)
PRINTLN("IMPOUND_DOOR - Locking impound door as player is no longer stuck inside")
LOCK_AUTOMATIC_DOOR_OPEN(AUTODOOR_IMPOUND_L, FALSE, FALSE)
bImpoundDoorOverride = FALSE
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Cleans up any assets that may have been created
PROC CLEANUP_SCRIPT()
INT i
REPEAT NUMBER_OF_VEHICLES_TO_GEN i
IF DOES_BLIP_EXIST(g_sVehicleGenNSData.blipID[i])
REMOVE_BLIP(g_sVehicleGenNSData.blipID[i])
ENDIF
IF DOES_ENTITY_EXIST(g_sVehicleGenNSData.vehicleID[i])
IF IS_VEHICLE_DRIVEABLE(g_sVehicleGenNSData.vehicleID[i])
IF DOES_ENTITY_BELONG_TO_THIS_SCRIPT(g_sVehicleGenNSData.vehicleID[i])
SET_VEHICLE_AS_NO_LONGER_NEEDED(g_sVehicleGenNSData.vehicleID[i])
g_sVehicleGenNSData.vehicleID[i] = NULL
ENDIF
ENDIF
ENDIF
ENDREPEAT
IF DOES_CAM_EXIST(sGarageData.camCutscene)
SET_CAM_ACTIVE(sGarageData.camCutscene, FALSE)
DESTROY_CAM(sGarageData.camCutscene)
ENDIF
IF DOES_CAM_EXIST(sGarageData.camCutscene2)
SET_CAM_ACTIVE(sGarageData.camCutscene2, FALSE)
DESTROY_CAM(sGarageData.camCutscene2)
ENDIF
IF sGarageData.iWarpControl != 0
RESET_VEHICLE_GEN_LOADED_CHECKS()
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
ENDIF
IF DOES_BLIP_EXIST(g_sVehicleGenNSData.blipPlayerVehicle)
REMOVE_BLIP(g_sVehicleGenNSData.blipPlayerVehicle)
ENDIF
IF (iGarageEntryContextID != NEW_CONTEXT_INTENTION)
RELEASE_CONTEXT_INTENTION(iGarageEntryContextID)
ENDIF
IF iVehicleMenuContextID != NEW_CONTEXT_INTENTION
RELEASE_CONTEXT_INTENTION(iVehicleMenuContextID)
ENDIF
IF sGarageData.iContextID != NEW_CONTEXT_INTENTION
RELEASE_CONTEXT_INTENTION(sGarageData.iContextID)
ENDIF
IF iImpoundMenuContextID != NEW_CONTEXT_INTENTION
RELEASE_CONTEXT_INTENTION(iImpoundMenuContextID)
ENDIF
// Fix for 2269369. Ensure "inGarage" flag is cleared if the veh gen controller cleans up
// while the player is in the garage.
IF sGarageData.iWarpControl > 0
IF g_sVehicleGenNSData.bInGarage
PRINTLN("Cleaning up garage interior as veh_gen_controller cleans up.")
SET_INTERIOR_CAPPED_ON_EXIT(INTERIOR_V_GARAGEM_SP, TRUE)
SET_INTERIOR_DISABLED_ON_EXIT(INTERIOR_V_GARAGEM_SP, TRUE)
g_sVehicleGenNSData.bInGarage = FALSE
sGarageData.iWarpControl = 0 //Reset warp state
ENDIF
ENDIF
// Fix for 2294541. Ensure that the vehicle gen loaded checks are cancelled if this script
// cleans up early. Stops startup positioning hanging forever if we transition to MP at a
// bad time. -BenR
g_sVehicleGenNSData.bCheckVehGensLoaded = FALSE
TERMINATE_THIS_THREAD()
ENDPROC
PROC RUN_VALID_MODEL_CHECK_FOR_STORED_VEHICLES()
// Fix for bugs 1666251, 1666378, and 1666444
// If the getaway vehicle is no longer valid, replace with a standard vehicle.
// CASE VEHGEN_MISSION_VEH_FBI4_PREP
// sData.dynamicSlotIndex = 22
IF IS_VEHICLE_GEN_AVAILABLE(VEHGEN_MISSION_VEH_FBI4_PREP)
IF g_savedGlobals.sVehicleGenData.sDynamicData[22].eModel != DUMMY_MODEL_FOR_SCRIPT
AND NOT IS_VEHICLE_AVAILABLE_FOR_GAME(g_savedGlobals.sVehicleGenData.sDynamicData[22].eModel)
PRINTLN("RUN_VALID_MODEL_CHECK_FOR_STORED_VEHICLES - Prep vehicle no longer valid, replacing with FUGITIVE")
g_savedGlobals.sVehicleGenData.sDynamicData[22].eModel = FUGITIVE
g_savedGlobals.sVehicleGenData.sDynamicData[22].iFlags = 0
g_savedGlobals.sVehicleGenData.sDynamicData[22].iWindowTintColour = 0
g_savedGlobals.sVehicleGenData.sDynamicData[22].iTyreR = 255
g_savedGlobals.sVehicleGenData.sDynamicData[22].iTyreG = 255
g_savedGlobals.sVehicleGenData.sDynamicData[22].iTyreB = 255
g_savedGlobals.sVehicleGenData.sDynamicData[22].iColour1 = 0
g_savedGlobals.sVehicleGenData.sDynamicData[22].iColour2 = 0
g_savedGlobals.sVehicleGenData.sDynamicData[22].iColourExtra1 = 0
g_savedGlobals.sVehicleGenData.sDynamicData[22].iColourExtra2 = 156
INT i
REPEAT MAX_VEHICLE_MOD_SLOTS i
g_savedGlobals.sVehicleGenData.sDynamicData[22].iModIndex[i] = 0
ENDREPEAT
REPEAT MAX_VEHICLE_MOD_VAR_SLOTS i
g_savedGlobals.sVehicleGenData.sDynamicData[22].iModVariation[i] = 0
ENDREPEAT
ENDIF
ENDIF
// Fix for bug 1666179
// If the garage vehicle models are no longer valid, set a dummy model so the slot can be re-used in GET_FREE_VEHICLE_GEN_SLOT_IN_GARAGE
//CASE VEHGEN_WEB_CAR_MICHAEL
// sData.dynamicSlotIndex = 9
IF IS_VEHICLE_GEN_AVAILABLE(VEHGEN_WEB_CAR_MICHAEL)
AND g_savedGlobals.sVehicleGenData.sDynamicData[9].eModel != DUMMY_MODEL_FOR_SCRIPT
AND NOT IS_VEHICLE_AVAILABLE_FOR_GAME(g_savedGlobals.sVehicleGenData.sDynamicData[9].eModel)
g_savedGlobals.sVehicleGenData.sDynamicData[9].eModel = DUMMY_MODEL_FOR_SCRIPT
PRINTLN("RUN_VALID_MODEL_CHECK_FOR_STORED_VEHICLES - VEHGEN_WEB_CAR_MICHAEL longer valid")
ENDIF
//CASE VEHGEN_WEB_CAR_FRANKLIN
// sData.dynamicSlotIndex = 10
IF IS_VEHICLE_GEN_AVAILABLE(VEHGEN_WEB_CAR_FRANKLIN)
AND g_savedGlobals.sVehicleGenData.sDynamicData[10].eModel != DUMMY_MODEL_FOR_SCRIPT
AND NOT IS_VEHICLE_AVAILABLE_FOR_GAME(g_savedGlobals.sVehicleGenData.sDynamicData[10].eModel)
g_savedGlobals.sVehicleGenData.sDynamicData[10].eModel = DUMMY_MODEL_FOR_SCRIPT
PRINTLN("RUN_VALID_MODEL_CHECK_FOR_STORED_VEHICLES - VEHGEN_WEB_CAR_FRANKLIN longer valid")
ENDIF
//CASE VEHGEN_WEB_CAR_TREVOR
// sData.dynamicSlotIndex = 11
IF IS_VEHICLE_GEN_AVAILABLE(VEHGEN_WEB_CAR_TREVOR)
AND g_savedGlobals.sVehicleGenData.sDynamicData[11].eModel != DUMMY_MODEL_FOR_SCRIPT
AND NOT IS_VEHICLE_AVAILABLE_FOR_GAME(g_savedGlobals.sVehicleGenData.sDynamicData[11].eModel)
g_savedGlobals.sVehicleGenData.sDynamicData[11].eModel = DUMMY_MODEL_FOR_SCRIPT
PRINTLN("RUN_VALID_MODEL_CHECK_FOR_STORED_VEHICLES - VEHGEN_WEB_CAR_TREVOR longer valid")
ENDIF
//CASE VEHGEN_MICHAEL_GARAGE_1
//CASE VEHGEN_FRANKLIN_GARAGE_1
//CASE VEHGEN_TREVOR_GARAGE_1
// iOffset = (ENUM_TO_INT(eName) - ENUM_TO_INT(VEHGEN_MICHAEL_GARAGE_1))
// sData.dynamicSlotIndex = 12 + iOffset
IF IS_VEHICLE_GEN_AVAILABLE(VEHGEN_MICHAEL_GARAGE_1)
AND NOT IS_VEHICLE_AVAILABLE_FOR_GAME(g_savedGlobals.sVehicleGenData.sDynamicData[12].eModel)
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_MICHAEL_GARAGE_1, FALSE)
PRINTLN("RUN_VALID_MODEL_CHECK_FOR_STORED_VEHICLES - VEHGEN_MICHAEL_GARAGE_1 longer valid")
ENDIF
IF IS_VEHICLE_GEN_AVAILABLE(VEHGEN_FRANKLIN_GARAGE_1)
AND NOT IS_VEHICLE_AVAILABLE_FOR_GAME(g_savedGlobals.sVehicleGenData.sDynamicData[13].eModel)
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_FRANKLIN_GARAGE_1, FALSE)
PRINTLN("RUN_VALID_MODEL_CHECK_FOR_STORED_VEHICLES - VEHGEN_FRANKLIN_GARAGE_1 longer valid")
ENDIF
IF IS_VEHICLE_GEN_AVAILABLE(VEHGEN_TREVOR_GARAGE_1)
AND NOT IS_VEHICLE_AVAILABLE_FOR_GAME(g_savedGlobals.sVehicleGenData.sDynamicData[14].eModel)
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_TREVOR_GARAGE_1, FALSE)
PRINTLN("RUN_VALID_MODEL_CHECK_FOR_STORED_VEHICLES - VEHGEN_TREVOR_GARAGE_1 longer valid")
ENDIF
//CASE VEHGEN_MICHAEL_GARAGE_2
//CASE VEHGEN_FRANKLIN_GARAGE_2
//CASE VEHGEN_TREVOR_GARAGE_2
// iOffset = (ENUM_TO_INT(eName) - ENUM_TO_INT(VEHGEN_MICHAEL_GARAGE_2))
// sData.dynamicSlotIndex = 15 + iOffset
IF IS_VEHICLE_GEN_AVAILABLE(VEHGEN_MICHAEL_GARAGE_2)
AND NOT IS_VEHICLE_AVAILABLE_FOR_GAME(g_savedGlobals.sVehicleGenData.sDynamicData[15].eModel)
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_MICHAEL_GARAGE_2, FALSE)
PRINTLN("RUN_VALID_MODEL_CHECK_FOR_STORED_VEHICLES - VEHGEN_MICHAEL_GARAGE_2 longer valid")
ENDIF
IF IS_VEHICLE_GEN_AVAILABLE(VEHGEN_FRANKLIN_GARAGE_2)
AND NOT IS_VEHICLE_AVAILABLE_FOR_GAME(g_savedGlobals.sVehicleGenData.sDynamicData[16].eModel)
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_FRANKLIN_GARAGE_2, FALSE)
PRINTLN("RUN_VALID_MODEL_CHECK_FOR_STORED_VEHICLES - VEHGEN_FRANKLIN_GARAGE_2 longer valid")
ENDIF
IF IS_VEHICLE_GEN_AVAILABLE(VEHGEN_TREVOR_GARAGE_2)
AND NOT IS_VEHICLE_AVAILABLE_FOR_GAME(g_savedGlobals.sVehicleGenData.sDynamicData[17].eModel)
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_TREVOR_GARAGE_2, FALSE)
PRINTLN("RUN_VALID_MODEL_CHECK_FOR_STORED_VEHICLES - VEHGEN_TREVOR_GARAGE_2 longer valid")
ENDIF
//CASE VEHGEN_MICHAEL_GARAGE_3
//CASE VEHGEN_FRANKLIN_GARAGE_3
//CASE VEHGEN_TREVOR_GARAGE_3
// iOffset = (ENUM_TO_INT(eName) - ENUM_TO_INT(VEHGEN_MICHAEL_GARAGE_3))
// sData.dynamicSlotIndex = 18 + iOffset
IF IS_VEHICLE_GEN_AVAILABLE(VEHGEN_MICHAEL_GARAGE_3)
AND NOT IS_VEHICLE_AVAILABLE_FOR_GAME(g_savedGlobals.sVehicleGenData.sDynamicData[18].eModel)
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_MICHAEL_GARAGE_3, FALSE)
PRINTLN("RUN_VALID_MODEL_CHECK_FOR_STORED_VEHICLES - VEHGEN_MICHAEL_GARAGE_3 longer valid")
ENDIF
IF IS_VEHICLE_GEN_AVAILABLE(VEHGEN_FRANKLIN_GARAGE_3)
AND NOT IS_VEHICLE_AVAILABLE_FOR_GAME(g_savedGlobals.sVehicleGenData.sDynamicData[19].eModel)
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_FRANKLIN_GARAGE_3, FALSE)
PRINTLN("RUN_VALID_MODEL_CHECK_FOR_STORED_VEHICLES - VEHGEN_FRANKLIN_GARAGE_3 longer valid")
ENDIF
IF IS_VEHICLE_GEN_AVAILABLE(VEHGEN_TREVOR_GARAGE_3)
AND NOT IS_VEHICLE_AVAILABLE_FOR_GAME(g_savedGlobals.sVehicleGenData.sDynamicData[20].eModel)
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_TREVOR_GARAGE_3, FALSE)
PRINTLN("RUN_VALID_MODEL_CHECK_FOR_STORED_VEHICLES - VEHGEN_TREVOR_GARAGE_3 longer valid")
ENDIF
ENDPROC
SCRIPT
PRINTSTRING("\nStarting vehicle_gen_controller")PRINTNL()
// Setup some debug widgets
#IF IS_DEBUG_BUILD
SETUP_VEHICLE_CONTROL_WIDGETS()
#ENDIF
SET_THIS_SCRIPT_CAN_BE_PAUSED(FALSE)
// Proprety vehgens need to be available from start, they will get set to acquired
// when the correct character owns the property.
//SET_VEHICLE_GEN_AVAILABLE(VEHGEN_LOCKUP_MICHAEL_CAR_SCRAP_YARD, TRUE)
// Ensure we creat the helipad blip each time the script launches
sGarageData.iContextID = NEW_CONTEXT_INTENTION
sGarageData.eClosestGen = VEHGEN_NONE
sGarageData.fClosestDist = 99999.99
//Purposefully "hidden" in amongst this script. We want it to be hard
//for hackers to spot these scripts in decompiled output. -BenR
#IF FEATURE_SP_DLC_BEAST_SECRET
#IF NOT FEATURE_SP_DLC_BEAST_SECRET_DEBUG
Reset_Beast_Peyote_Variables(sBeastPeyoteVars)
#IF IS_DEBUG_BUILD
Create_Beast_Peyote_Widgets(sBeastPeyoteVars, wVehicleGenControllerWidget)
#ENDIF
#ENDIF
#ENDIF
// Clear create timers
INT i
REPEAT NUM_OF_PLAYABLE_PEDS i
g_iCreatedPlayerVehicleCleanupTimer[i][0] = -1
g_iCreatedPlayerVehicleCleanupTimer[i][1] = -1
ENDREPEAT
IF NOT g_savedGlobals.sVehicleGenData.bInitialDataSetup
REPEAT NUMBER_OF_BUYABLE_VEHICLES_SP i
g_savedGlobals.sVehicleGenData.sWebVehicles[0].todEmailDate[i] = INVALID_TIMEOFDAY
g_savedGlobals.sVehicleGenData.sWebVehicles[1].todEmailDate[i] = INVALID_TIMEOFDAY
g_savedGlobals.sVehicleGenData.sWebVehicles[2].todEmailDate[i] = INVALID_TIMEOFDAY
ENDREPEAT
REPEAT NUMBER_OF_DYNAMIC_VEHICLE_GENS i
g_savedGlobals.sVehicleGenData.fDynamicHeading[i] = -1
ENDREPEAT
g_savedGlobals.sVehicleGenData.eMissionVehTimeStamp = INVALID_TIMEOFDAY
g_savedGlobals.sVehicleGenData.bInitialDataSetup = TRUE
ENDIF
// remove the blimp vehicle gens if the DLC has been removed
IF NOT IS_PREORDER_GAME()
AND NOT IS_SPECIAL_EDITION_GAME()
AND NOT IS_COLLECTORS_EDITION_GAME()
AND NOT IS_JAPANESE_SPECIAL_EDITION_GAME()
CPRINTLN(DEBUG_REPEAT, "Removing blip vehicle gen as DLC has been removed.")
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_BLIMP_CASINO, FALSE)
SET_VEHICLE_GEN_AVAILABLE(VEHGEN_BLIMP_DOCKS, FALSE)
ENDIF
RUN_VALID_MODEL_CHECK_FOR_STORED_VEHICLES()
// Blast through all the vehicle gens to see what needs loaded on startup
REPEAT NUMBER_OF_VEHICLES_TO_GEN i
// If the shop is still in range add it to the new list
ADD_VEHICLE_GEN_TO_PROCESS_LIST(INT_TO_ENUM(VEHICLE_GEN_NAME_ENUM, i))
ENDREPEAT
// Main loop
WHILE (TRUE)
// This script needs to cleanup only when the game moves from SP to MP.
IF NOT bForceCleanupSetup
PRINTLN("...vehicle_gen_controller.sc setting up a new force cleanup.")
bForceCleanupSetup = TRUE
IF (HAS_FORCE_CLEANUP_OCCURRED(FORCE_CLEANUP_FLAG_SP_TO_MP|FORCE_CLEANUP_FLAG_MAGDEMO|FORCE_CLEANUP_FLAG_REPEAT_PLAY))
PRINTLN("...vehicle_gen_controller.sc has been forced to cleanup.")
//Only clean up with a REPEAT_PLAY flag if we know it is for a recording playback.
IF GET_CAUSE_OF_MOST_RECENT_FORCE_CLEANUP() = FORCE_CLEANUP_FLAG_REPEAT_PLAY
IF NOT g_bForceCleaupVehgenForRecordingPlayback
PRINTLN("...vehicle_gen_controller.sc has found a repeat play cleanup without the recoring playback flag.")
PRINTLN("...vehicle_gen_controller.sc skipping force cleanup.")
bForceCleanupSetup = FALSE //Set up a new force cleanup next frame.
ELSE
PRINTLN("...vehicle_gen_controller.sc cleaning up for recording playback.")
CLEANUP_CARSTEAL_WALL()
CLEANUP_SCRIPT()
ENDIF
g_bForceCleaupVehgenForRecordingPlayback = FALSE
ELSE
PRINTLN("...vehicle_gen_controller.sc cleaning up for multiplayer or magdemo.")
CLEANUP_CARSTEAL_WALL()
CLEANUP_SCRIPT()
ENDIF
ENDIF
ENDIF
WAIT(0)
IF (GET_INDEX_OF_CURRENT_LEVEL() != LEVEL_NET_TEST)
// Maintain the debug widgets
#IF IS_DEBUG_BUILD
MAINTAIN_VEHICLE_CONTROL_WIDGETS()
IF bOutputSpecialVehicleInfo
PRINTLN("SPECIAL VEHICLE INFO")
INT iSpecialVehs = GET_NUMBER_OF_SPECIAL_VEHICLES()
INT iSpecialVeh
PRINTLN("...Total = ", iSpecialVehs)
REPEAT iSpecialVehs iSpecialVeh
IF IS_THIS_MODEL_A_PLANE(GET_SPECIAL_VEHICLE_MODEL(iSpecialVeh))
PRINTLN("...vehicle[", iSpecialVeh, "] name='", GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(GET_SPECIAL_VEHICLE_MODEL(iSpecialVeh)), "', type='plane'")
ELIF IS_THIS_MODEL_A_BOAT(GET_SPECIAL_VEHICLE_MODEL(iSpecialVeh))
PRINTLN("...vehicle[", iSpecialVeh, "] name='", GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(GET_SPECIAL_VEHICLE_MODEL(iSpecialVeh)), "', type='boat'")
ELIF IS_THIS_MODEL_A_CAR(GET_SPECIAL_VEHICLE_MODEL(iSpecialVeh))
PRINTLN("...vehicle[", iSpecialVeh, "] name='", GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(GET_SPECIAL_VEHICLE_MODEL(iSpecialVeh)), "', type='car'")
ELIF IS_THIS_MODEL_A_BIKE(GET_SPECIAL_VEHICLE_MODEL(iSpecialVeh))
PRINTLN("...vehicle[", iSpecialVeh, "] name='", GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(GET_SPECIAL_VEHICLE_MODEL(iSpecialVeh)), "', type='bike'")
ELIF IS_THIS_MODEL_A_HELI(GET_SPECIAL_VEHICLE_MODEL(iSpecialVeh))
PRINTLN("...vehicle[", iSpecialVeh, "] name='", GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(GET_SPECIAL_VEHICLE_MODEL(iSpecialVeh)), "', type='heli'")
ELSE
PRINTLN("...vehicle[", iSpecialVeh, "] name='", GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(GET_SPECIAL_VEHICLE_MODEL(iSpecialVeh)), "', type='invalid'")
ENDIF
ENDREPEAT
bOutputSpecialVehicleInfo = FALSE
ENDIF
#ENDIF
eCurrentPlayerPed = GET_CURRENT_PLAYER_PED_ENUM()
DO_VEHICLE_GEN_PROCESING()
DO_CARSTEAL_WALL_PROCESSING()
//Purposefully "hidden" in amongst this script. We want it to be hard
//for hackers to spot these scripts in decompiled output. -BenR
#IF FEATURE_SP_DLC_BEAST_SECRET
#IF NOT FEATURE_SP_DLC_BEAST_SECRET_DEBUG
Maintain_Beast_Peyote_Progression(sBeastPeyoteVars)
#ENDIF
#ENDIF
DO_IMPOUND_SELECT_PROCESSING()
DO_PURCHASABLE_GARAGE_PROCESSING()
// #IF IS_DEBUG_BUILD
// IF GET_COMMANDLINE_PARAM_EXISTS("sc_BlipSPVehicle")
DO_PLAYER_VEHICLE_BLIP_MANAGEMENT()
// ENDIF
// #ENDIF
GENERATE_VEHICLE_STATS_FOR_ALL_VEHICLE_CLASSES(sVehStatsData)
ENDIF
//Purposefully "hidden" in amongst this script. We want it to be hard
//for hackers to spot these scripts in decompiled output. -BenR
#IF FEATURE_SP_DLC_BEAST_SECRET
#IF NOT FEATURE_SP_DLC_BEAST_SECRET_DEBUG
Maintain_Play_Beast_Peyote_Sound(sBeastPeyoteVars)
#IF IS_DEBUG_BUILD
Update_Beast_Peyote_Widgets(sBeastPeyoteVars)
#ENDIF
#ENDIF
#ENDIF
ENDWHILE
ENDSCRIPT