8972 lines
364 KiB
Python
Executable File
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
|