////////////////////////////////////////////////////////////////////////////////////////// // // // SCRIPT NAME : Towing // // AUTHOR : Steven Messinger // // DESCRIPTION : Core logic for the tow truck oddjob // // // ////////////////////////////////////////////////////////////////////////////////////////// //Compile out Title Update changes to header functions. //Must be before includes. //CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R. USING "Towing.sch" USING "towing_cams.sch" USING "end_screen.sch" USING "minigame_midsized_message.sch" USING "load_queue_public.sch" SCRIPT_SHARD_BIG_MESSAGE endMessage STRING angryPedRoot = "" //STRING angryPedLine = "" STRING SpecialAnimDict = "REACTION@MALE_STAND@BIG_VARIATIONS@A" //TODO these should be linked in a struct with the peds that need them STRING SpecialAnims[MAX_NUM_BYSTANDERS] STRING sCharacterName VECTOR vCurDestObjective[MAX_NUM_NODES] VECTOR vDest //used by traditional towing mode to set a destinatino VECTOR vMin, vMax //END_SCREEN_DATASET towingEndScreen //current size is 7 STREAMED_MODEL streamReqs[9] STREAMED_ANIM streamReqsAnim[7] LoadQueueLarge sLoadQueue #IF IS_DEBUG_BUILD DEBUG_POS_DATA myDebugData VECTOR vStartVec = << 1387.9126, -2535.6133, 47.4669 >> FLOAT fStartFloat BOOL bDebugInTutorial = FALSE #ENDIF //BOOL bFirstTime = TRUE BOOL bTriggeredEarly = FALSE BOOL bPrintHook = TRUE BOOL bPrintDest = TRUE BOOL bPrintHintCam = TRUE BOOL bTrainClose = FALSE BOOL bRammedVehicle = FALSE BOOL bTaskedBrokenDownPed = FALSE BOOL bPlayedSound = FALSE BOOL bGrabbedSoundID = FALSE BOOL bUnlockDoors = FALSE BOOL bStopTimer = FALSE BOOL bDisplayHelp = TRUE BOOL bAggroedTonya = FALSE BOOL bAbandonedTonya = FALSE BOOL bSkipTutorial = FALSE BOOL bPostTonya = FALSE BOOL bPlayTooCloseConvo = FALSE //BOOL bEnableBonusCam = TRUE BOOL bDisablePedCam = FALSE BOOL bDisableCin = FALSE BOOL bInCombat = FALSE BOOL bSpawnPed = FALSE BOOL bTimeWarned = FALSE BOOL bDistWarned = FALSE BOOL bReverseOrder = FALSE BOOL bDisableCam = FALSE BOOL bRunningTwoOrFive = FALSE BOOL bRunningThreeOrFour = FALSE BOOL bSupressObjective = FALSE BOOL bSuppressBlips = FALSE BOOL bDoTutorial = FALSE BOOL bTrainsDisabled = FALSE BOOL bRequiresPed = FALSE BOOL bStreamPeds = FALSE BOOL bGenDisabled = FALSE BOOL bAttack = FALSE BOOL bSexVariation = FALSE BOOL bHomelessVariation = FALSE BOOL bGpsActive = FALSE BOOL bTonyaAbandonWarning = FALSE BOOL bReplayVehicleAvailable = FALSE BOOL bDriverGotCarBack = FALSE BOOL bAngryPedGaveUp = FALSE BOOL bWrongCarAttached = FALSE BOOL bPlayInitialUpsetLine = FALSE BOOL bPlayFullConvo = FALSE BOOL bPrintSpecialCaseObj = FALSE BOOL bShakeCar = TRUE BOOL bPlayBeckonLine = FALSE BOOL bReattachConvo = FALSE BOOL bWakeUp = FALSE //TEXT_LABEL_23 TestResumptionLabel PED_INDEX piSpeakers[2] PED_INDEX pedTrainDriver PED_INDEX pedTonya BLIP_INDEX myVehicleBlip BLIP_INDEX tempBlip //TOW_NODE towNodes[MAX_NUM_NODES] MODEL_NAMES carNames[MAX_NUM_CAR_NAMES] MODEL_NAMES pedNames[MAX_NUM_PED_NAMES] VARIATION towVariation = VARIATION_TRADIITONAL TOW_CAM_ARGS towArgs REL_GROUP_HASH grpBuddies BROKEN_VEHICLE brokenVehicles[MAX_NUM_BROKEN_CARS] GARAGE_DATA myGarageData INT curTowIndex = -1 INT curBrokenCarCount = 0 INT curCarNameIdx = 0 INT iToggle = 0 INT fPanicDist = 0 //Car health info INT iLastHealth = 0 INT iHealthDelta = 0 INT iInitialHealth = 0 //Tow Truck health info INT iTruckLastHealth = 0 INT iTruckHealthDelta = 0 INT iClosestIdx INT iSpeedNode01 INT iSpeedNode02 INT iAdditionalHelpPrintStages INT iNumPeds = 0 INT outOfVehicleTime = 0 INT iPushStages = 0 VECTOR vExtra VECTOR vExtra2 VECTOR vCarGenPosition = <<-229.8159, -1171.9999, 21.8557>> VECTOR getPointVec FLOAT getPointHead FLOAT fMissionTime TEXT_LABEL_63 sLastObjective FAIL_REASON_ENUM failReason structTimer printDelayTimer structTimer genericTimer structTimer totalTimer structTimer printTimer structTimer chaseTimer structTimer failTimer structTimer wakeTimer //structTimer tEndingTimer structTimer tAdditionalHelpPrintTimer //INT iAllowSkipCutsceneTime = 0 VEHICLE_INDEX myVehicle VEHICLE_INDEX helperCar PED_INDEX helperPed SCENARIO_BLOCKING_INDEX sbi01, sbi02 //INT iGpsIndex = -1 STRING sMyObjective //STRING sMyHelp MISSION_STATE curStage = MISSION_STATE_INTRO STAGING_STATE stagingState = STAGING_STATE_INIT BROKEN_STATE brokenState = BROKEN_STATE_VISIBLE ANGRY_PED pedState = ANGRY_PED_INIT TRAIN_STATE trainState = TRAIN_STATE_PRINT TRAIN_STATE_PED trainPedState = TRAIN_STATE_PED_INIT TOW_PED_DIALOUGE pedDialougeState = TOW_PED_BEG DAMAGE_PRINTS printState = DAMAGE_PRINTS_FIRST DAMAGE_PRINTS truckPrintState = DAMAGE_PRINTS_FIRST GIVEUP_ARGS giveUpArgs PTFX_ID sparksEffects[8] #IF NOT IS_JAPANESE_BUILD BOOL bPlaySexyConvo = FALSE BOOL bGuyTryingToEnterCar = FALSE #ENDIF #IF IS_JAPANESE_BUILD INT iPedID #ENDIF PROC MISSION_CLEANUP() SET_DEFAULT_RICH_PRESENCE_FOR_SP() PRINTLN("SETTING RICH PRESENCE BACK TO DEFAULT") // To Fix Bug # 554724 CLEAR_HELP() CLEAR_ADDITIONAL_TEXT(ODDJOB_TEXT_SLOT, TRUE) IF HAS_SCALEFORM_MOVIE_LOADED(endMessage.siMovie) SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(endMessage.siMovie) ENDIF IF NOT IS_ENTITY_DEAD(myVehicle) SET_VEHICLE_DOORS_LOCKED(myVehicle, VEHICLELOCK_UNLOCKED) SET_VEHICLE_SIREN(myVehicle, FALSE) ENDIF REMOVE_ROAD_NODE_SPEED_ZONE(iSpeedNode01) REMOVE_ROAD_NODE_SPEED_ZONE(iSpeedNode02) REMOVE_SCENARIO_BLOCKING_AREA(sbi01) REMOVE_SCENARIO_BLOCKING_AREA(sbi02) SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA((vCarGenPosition - <<15,15,15>>), (vCarGenPosition + <<15,15,15>>), TRUE) INT idx REPEAT MAX_NUM_BROKEN_CARS idx //IF brokenVehicles[openIdx].speedIDA REMOVE_ROAD_NODE_SPEED_ZONE(brokenVehicles[idx].speedIDA) REMOVE_ROAD_NODE_SPEED_ZONE(brokenVehicles[idx].speedIDB) REMOVE_ROAD_NODE_SPEED_ZONE(brokenVehicles[idx].speedIDC) ENDREPEAT IF NOT IS_VECTOR_ZERO(extraData[GET_IDX()].vMin) ALLOW_PEDS_TO_BE_IN_AREA(sblockingIndex, extraData[GET_IDX()].vMin, extraData[GET_IDX()].vMax) ENDIF SET_VEHICLE_AS_NO_LONGER_NEEDED(brokenVehicles[0].vehicleIndex) IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) SET_PED_AS_NO_LONGER_NEEDED(brokenVehicles[0].pedIndex) PRINTLN("SETTING PED - brokenVehicles[0].pedIndex AS NO LONGER NEEDED") IF DOES_ENTITY_EXIST(brokenVehicles[0].pedIndex) IF IS_PED_IN_GROUP(brokenVehicles[0].pedIndex) REMOVE_PED_FROM_GROUP(brokenVehicles[0].pedIndex) PRINTLN("REMOVING PED FROM GROUP") ENDIF ENDIF ENDIF IF DOES_ENTITY_EXIST(pedTrainDriver) IF NOT IS_ENTITY_DEAD(pedTrainDriver) SET_PED_AS_NO_LONGER_NEEDED(pedTrainDriver) PRINTLN("SETTING PED - pedTrainDriver AS NO LONGER NEEDED") ENDIF ENDIF IF NOT IS_ENTITY_DEAD(myVehicle) SET_ENTITY_AS_MISSION_ENTITY(myVehicle, TRUE, TRUE) SET_VEHICLE_AS_NO_LONGER_NEEDED(myVehicle) PRINTLN("SETTING TOW TRUCK AS NO LONGER NEEDED VIA MISSION CLEANUP") ENDIF //Turn back on car spawning IF bGenDisabled SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(vMin, vMax, TRUE) ENDIF // cleanup anything you need to. You don't need to dereference script-created entities like peds and vehicles, // as code will do this automatically when the script terminates. IF bTrainsDisabled AND NOT IS_ENTITY_DEAD(brokenVehicles[0].blockingIndex) SET_VEHICLE_STAYS_FROZEN_WHEN_CLEANED_UP(brokenVehicles[0].blockingIndex, TRUE) SET_MISSION_TRAIN_AS_NO_LONGER_NEEDED(brokenVehicles[0].blockingIndex) SET_RANDOM_TRAINS(TRUE) SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_MAIN, TRUE) SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_QUARRY, FALSE) SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_CAR_STEAL_SETPIECE, FALSE) SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_METRO, TRUE) SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_FIRST_HOOD_SETPIECE, FALSE) SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_SECOND_HOOD_SETPIECE, FALSE) SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_SECOND_FAME_OR_SHAME_SETPIECE, FALSE) SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_DOWNTOWN_SETPIECE, FALSE) SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_THIRD_HOOD_SETPIECE, FALSE) SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_PROLOGUE, FALSE) SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_JEWEL_HEIST_SETPIECE, FALSE) SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_PROLOGUE_2, FALSE) PRINTLN("PUTTING TRAINS BACK TO INITIALIZATION VALUES") ENDIF ODDJOB_STOP_SOUND(soundID) ODDJOB_STOP_SOUND(soundID2) STOP_BREAKING_PFX(sparksEffects) ODDJOB_STOP_SOUND(soundID3) KILL_CHASE_HINT_CAM(localChaseHintCamStruct) IF DOES_CAM_EXIST(towArgs.towCam) CLEANUP_CAM(towArgs) ENDIF //CLEANUP_MINIGAME_INSTRUCTIONS(helpScaleform) SET_WANTED_LEVEL_MULTIPLIER(1.0) SET_VEHICLE_MODEL_IS_SUPPRESSED(TOWTRUCK, FALSE) PRINTLN("TERMINATING THREAD") TERMINATE_THIS_THREAD() // important, kills the script ENDPROC PROC MISSION_FAILED() //Don't allow fail if the mission passed UI is up IF curStage < MISSION_STATE_ENDUI_WAIT STRING strFailReason // anything that should happen when mission fails CLEAR_PRINTS() STOP_SCRIPTED_CONVERSATION(TRUE) PRINTLN("FAILING MISSION") // This sets us up for a replay through the launcher. SET_BITMASK_AS_ENUM(sLauncherData.iLauncherFlags, LAUNCHED_SCRIPT_TowingFailed) // will usually print a line of god text on fail describing the reason SWITCH failReason CASE FAIL_TRANSPORT_DESTROYED // PRINT_NOW("TOW_FAIL_05", DEFAULT_GOD_TEXT_TIME, 1) strFailReason = "TOW_FAIL_05" BREAK CASE FAIL_ABANDONED_CAR // PRINT_NOW("TOW_FAIL_10", DEFAULT_GOD_TEXT_TIME, 1) strFailReason = "TOW_FAIL_10" BREAK CASE FAIL_TIME_EXPIRED // PRINT_NOW("DTRSHRD_FAIL_03", DEFAULT_GOD_TEXT_TIME, 1) strFailReason = "DTRSHRD_FAIL_03" BREAK CASE FAIL_DISTANCE_FAIL // PRINT_NOW("TOW_FAIL_08", DEFAULT_GOD_TEXT_TIME, 1) strFailReason = "TOW_FAIL_08" BREAK CASE FAIL_ABANDONED_JOB // PRINT_NOW("TOW_FAIL_08", DEFAULT_GOD_TEXT_TIME, 1) strFailReason = "TOW_FAIL_08" BREAK CASE FAIL_DRIVER_GOT_CAR_BACK // PRINT_NOW("TOW_FAIL_16", DEFAULT_GOD_TEXT_TIME, 1) strFailReason = "TOW_FAIL_16" BREAK CASE FAIL_VEHICLE_DISABLED // PRINT_NOW("TOW_FAIL_12", DEFAULT_GOD_TEXT_TIME, 1) strFailReason = "TOW_FAIL_12" BREAK CASE FAIL_TOW_DESTROYED // PRINT_NOW("TOW_FAIL_01", DEFAULT_GOD_TEXT_TIME, 1) strFailReason = "TOW_FAIL_01" BREAK // CASE FAIL_COMMUTE_TIME // PRINT_WITH_NUMBER("", FLOOR(MAX_COMMUTE), DEFAULT_GOD_TEXT_TIME, 1) // BREAK CASE FAIL_WANTED // PRINT_NOW("TOW_FAIL_03", DEFAULT_GOD_TEXT_TIME, 1) strFailReason = "TOW_FAIL_03" BREAK CASE FAIL_PED_KILLED // PRINT_NOW("TOW_FAIL_04", DEFAULT_GOD_TEXT_TIME, 1) strFailReason = "TOW_FAIL_04" BREAK CASE FAIL_PED_KILLED_PASSENGER // PRINT_NOW("TOW_FAIL_04a", DEFAULT_GOD_TEXT_TIME, 1) strFailReason = "TOW_FAIL_04a" BREAK CASE FAIL_TIME_EXPIRED_TOTAL // PRINT_NOW("TOW_FAIL_06", DEFAULT_GOD_TEXT_TIME, 1) strFailReason = "TOW_FAIL_06" BREAK CASE FAIL_DAMAGE // PRINT_NOW("TOW_FAIL_07", DEFAULT_GOD_TEXT_TIME, 1) strFailReason = "TOW_FAIL_07" BREAK CASE FAIL_PED_ATTACKED // PRINT_NOW("TOW_FAIL_09", DEFAULT_GOD_TEXT_TIME, 1) strFailReason = "TOW_FAIL_09" BREAK CASE FAIL_PED_ATTACKED_TRAMP // PRINT_NOW("TOW_FAIL_09a", DEFAULT_GOD_TEXT_TIME, 1) strFailReason = "TOW_FAIL_09a" BREAK CASE FAIL_PED_THREATENED // PRINT_NOW("TOW_FAIL_02", DEFAULT_GOD_TEXT_TIME, 1) strFailReason = "TOW_FAIL_02" BREAK CASE FAIL_ATTACKED_TOW_TRUCK_OWNER // PRINT_NOW("TOW_FAIL_11", DEFAULT_GOD_TEXT_TIME, 1) strFailReason = "TOW_FAIL_11" BREAK CASE FAIL_ATTACKED_TONYA // PRINT_NOW("TOW_FAIL_13", DEFAULT_GOD_TEXT_TIME, 1) strFailReason = "TOW_FAIL_13" BREAK CASE FAIL_ABANDONED_TONYA // PRINT_NOW("TOW_FAIL_14", DEFAULT_GOD_TEXT_TIME, 1) strFailReason = "TOW_FAIL_14" BREAK ENDSWITCH IF IS_ENTITY_DEAD(PLAYER_PED_ID()) PRINTLN("PLAYER IS DEAD") strFailReason = "TOW_FAIL_15" ENDIF IF NOT IS_STRING_NULL_OR_EMPTY(strFailReason) MISSION_FLOW_SET_FAIL_REASON(strFailReason) ENDIF SET_FORCE_CLEANUP_FAIL_REASON() PRINTLN("Setting us up for a replay!") Setup_Minigame_Replay(GET_THIS_SCRIPT_NAME()) // Wait for replay controller to fade the screen out WHILE NOT GET_MISSION_FLOW_SAFE_TO_CLEANUP() WAIT(0) ENDWHILE MISSION_CLEANUP() ENDIF ENDPROC PROC SET_AGGRO_FIELDS_TO_NOT_CHECK() SET_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, EAggro_Aiming) ENDPROC ///////////////////////////////////////////////////////////////////////////////////////////////////////// //Name: CREATE_CAR //Purpose: Creates a car at INT openIdx in the vehicle array brokenVehicles ///////////////////////////////////////////////////////////////////////////////////////////////////////// FUNC BOOL CREATE_CAR(VECTOR spawnVec, FLOAT fOrient, INT& openIdx, BOOL bDoDamaged = TRUE, BOOL bBlip = TRUE) DEBUG_MESSAGE("CREATE_CAR") openIdx = FIND_FIRST_OPEN(brokenVehicles) FLOAT fClosestCheck, fMiddleCheck, fOuterCheck IF openIdx = -1 SCRIPT_ASSERT("There is no open spot in the broken Vehicle array") RETURN FALSE ENDIF IF curCarNameIdx >= MAX_NUM_PED_NAMES curCarNameIdx = 0 ENDIF PRINTLN("Trying to create car enum:", carNames[curCarNameIdx]) brokenVehicles[openIdx].vehicleIndex = CREATE_VEHICLE(carNames[curCarNameIdx], spawnVec, fOrient) SET_ENTITY_LOAD_COLLISION_FLAG(brokenVehicles[openIdx].vehicleIndex, TRUE) PRINTLN("SETTING COLLISION FLAG ON CAR") curCarNameIdx++ fObjDist = GET_PLAYER_DISTANCE_FROM_LOCATION(spawnVec, FALSE) IF chosenNodeType = NODE_TYPE_TRAIN fClosestCheck = 20 fMiddleCheck = 40 fOuterCheck = 60 ELSE fClosestCheck = 4 fMiddleCheck = 20 fOuterCheck = 40 ENDIF PRINTLN("fClosestCheck = ", fClosestCheck) PRINTLN("fMiddleCheck = ", fMiddleCheck) PRINTLN("fOuterCheck = ", fOuterCheck) IF NOT IS_VECTOR_ZERO(illegalNodes[illegalIdx].vSpeedNodeLocation) brokenVehicles[openIdx].speedIDA = ADD_ROAD_NODE_SPEED_ZONE(illegalNodes[illegalIdx].vSpeedNodeLocation, fClosestCheck, 0) ELSE brokenVehicles[openIdx].speedIDA = ADD_ROAD_NODE_SPEED_ZONE(spawnVec, fClosestCheck, 0) ENDIF brokenVehicles[openIdx].speedIDB = ADD_ROAD_NODE_SPEED_ZONE(spawnVec, fMiddleCheck, 2.5) brokenVehicles[openIdx].speedIDC = ADD_ROAD_NODE_SPEED_ZONE(spawnVec, fOuterCheck, 4) //SET_ROADS_IN_AREA(vMin, vMax, FALSE) //SCRIPT_ASSERT("Turning off roads in area") //ADD_BLIP_FOR_COORD(vMin) //ADD_BLIP_FOR_COORD(vMax) IF bDoDamaged IF brokenVehicles[openIdx].bDoFire //-100 is a hood fire SET_DISABLE_VEHICLE_PETROL_TANK_FIRES(brokenVehicles[openIdx].vehicleIndex, TRUE) SET_VEHICLE_ENGINE_HEALTH(brokenVehicles[openIdx].vehicleIndex, 1) SET_DISABLE_VEHICLE_ENGINE_FIRES(brokenVehicles[openIdx].vehicleIndex, TRUE) PRINTLN("bDoFire IS TRUE") ELSE SET_DISABLE_VEHICLE_PETROL_TANK_FIRES(brokenVehicles[openIdx].vehicleIndex, TRUE) SET_VEHICLE_ENGINE_HEALTH(brokenVehicles[openIdx].vehicleIndex, 1) SET_DISABLE_VEHICLE_ENGINE_FIRES(brokenVehicles[openIdx].vehicleIndex, TRUE) PRINTLN("bDoFire IS FALSE") //front //SET_VEHICLE_DAMAGE(brokenVehicles[openIdx].vehicleIndex, <<0.0, 1.2, 0.0>>, 1600.0, 1600.0, TRUE) ENDIF //windshield //SET_VEHICLE_DAMAGE(brokenVehicles[openIdx].vehicleIndex, <<0.0, 0.75, 0.05>>, 1600.0, 1600.0, TRUE) //left window //SET_VEHICLE_DAMAGE(brokenVehicles[openIdx].vehicleIndex, <<-0.7, 0.0, 0.0>>, 1600.0, 1600.0, TRUE) //right window //SET_VEHICLE_DAMAGE(brokenVehicles[openIdx].vehicleIndex, <<0.7, 0.0, 0.0>>, 1600.0, 1600.0, TRUE) //front //SET_VEHICLE_DAMAGE(brokenVehicles[openIdx].vehicleIndex, <<0.0, 1.2, 0.0>>, 1600.0, 1600.0, TRUE) //We don't want to add a blip if we're patrol and currently towing ENDIF IF NOT bSuppressBlips AND bBlip IF DOES_ENTITY_EXIST(brokenVehicles[openIdx].vehicleIndex) brokenVehicles[openIdx].blipIndex = ADD_BLIP_FOR_ENTITY(brokenVehicles[openIdx].vehicleIndex) //SET_BLIP_SCALE(brokenVehicles[openIdx].blipIndex, 0.75) SET_BLIP_COLOUR(brokenVehicles[openIdx].blipIndex, BLIP_COLOUR_BLUE) ENDIF ENDIF curBrokenCarCount++ //totalBrokenCarCount++ START_TIMER_NOW(brokenVehicles[openIdx].carTimer) RETURN TRUE ENDFUNC FUNC BOOL EXTRA_HOOK_CHECK() IF bDoTutorial IF bHookPlayed AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() RETURN TRUE ENDIF ELSE RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL CHECK_TOW_ATTACHMENTS(STRING objective, VECTOR vDestination) BOOL bProcede = TRUE INT idx IF NOT bPostTonya AND NOT bRunningThreeOrFour IF DOES_ENTITY_EXIST(myVehicle) AND NOT IS_ENTITY_DEAD(myVehicle) ENTITY_INDEX vehHookedCar vehHookedCar = GET_ENTITY_ATTACHED_TO_TOW_TRUCK(myVehicle) IF DOES_ENTITY_EXIST(vehHookedCar) AND NOT IS_ENTITY_DEAD(vehHookedCar) IF IS_ENTITY_A_VEHICLE(vehHookedCar) IF GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(vehHookedCar) <> brokenVehicles[0].vehicleIndex IF NOT bWrongCarAttached ADD_PED_FOR_DIALOGUE(pedConvo, 3, pedTonya, "TONYA") IF CREATE_CONVERSATION(pedConvo, "TOWAUD", "TONYA_WRONG", CONV_PRIORITY_VERY_HIGH) PRINTLN("bWrongCarAttached = TRUE") bWrongCarAttached = TRUE ENDIF ENDIF ENDIF ENDIF ELSE bWrongCarAttached = FALSE ENDIF ENDIF ENDIF REPEAT MAX_NUM_BROKEN_CARS idx IF DOES_ENTITY_EXIST(brokenVehicles[idx].vehicleIndex) IF NOT IS_ENTITY_DEAD(myVehicle) AND NOT IS_ENTITY_DEAD(brokenVehicles[idx].vehicleIndex) IF IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[idx].vehicleIndex) AND EXTRA_HOOK_CHECK() // SET_VEHICLE_LIGHTS(myVehicle, FORCE_VEHICLE_LIGHTS_ON) SET_VEHICLE_SIREN(myVehicle, TRUE) CLEAR_TEXT_ON_HOOKING() KILL_CHASE_HINT_CAM(localChaseHintCamStruct) bTowHooked = TRUE IF bRequiresPed AND NOT IS_PED_IN_VEHICLE(brokenVehicles[idx].pedIndex, myVehicle) bProcede = FALSE PRINTLN("bProcede = FALSE") //We are hooked skip ahead and get the ped in the car IF trainPedState < TRAIN_STATE_PED_PENDING SETTIMERB(0) DEBUG_MESSAGE("Setting timer b to 0") trainPedState = TRAIN_STATE_PED_ENTER_TRUCK ENDIF ENDIF IF bProcede PRINTLN("bProcede = TRUE") //don't print bjective if we jsut hooked CLEAR_PRINT_DELAY(printTimer) SET_BLIP_ROUTE(brokenVehicles[idx].blipIndex, FALSE) bGpsActive = FALSE SCRIPT_REMOVE_BLIP_SAFE(brokenVehicles[idx].blipIndex) brokenVehicles[idx].pickupTime = GET_TIMER_IN_SECONDS(brokenVehicles[idx].carTimer) //TODO it's preferable to not have any specific checks in here... IF towVariation = VARIATION_TRADIITONAL brokenVehicles[idx].blipIndex = ADD_BLIP_FOR_COORD(vDestination) fObjDist = GET_PLAYER_DISTANCE_FROM_LOCATION(vDestination, FALSE) PRINTLN("ATTEMPTING TO ADD BLIP") vCurDestObjective[0] = vDestination ENDIF IF chosenNodeType = NODE_TYPE_ACCIDENT SET_VEHICLE_DOOR_SHUT(brokenVehicles[0].vehicleIndex, SC_DOOR_FRONT_LEFT, FALSE) PRINTLN("CLOSING DOOR ON ACCIDENT VEHICLE") ENDIF RESTART_TIMER_NOW(failTimer) SET_BLIP_COLOUR(brokenVehicles[idx].blipIndex, BLIP_COLOUR_YELLOW) SET_BLIP_ROUTE(brokenVehicles[idx].blipIndex, TRUE) IF chosenNodeType = NODE_TYPE_HANDI AND bSexVariation // SPECIAL CASE - HANDLED IN HANDICAP VARIATION ELSE IF bPrintDest PRINT_NOW(objective, DEFAULT_GOD_TEXT_TIME, 1) bPrintDest = FALSE ENDIF ENDIF sLastObjective = objective CLEAR_AREA_OF_VEHICLES(vCurDestObjective[0], 6.0) curTowIndex = idx RETURN TRUE ENDIF ENDIF ENDIF ENDIF ENDREPEAT RETURN FALSE ENDFUNC FUNC BOOL IS_VEHICLE_IN_DROP_OFF_AREA(VECTOR& vAngledA, VECTOR& vAngledB, FLOAT& fWidth) IF curTowIndex <> -1 //If this location has a process zone require the player to be in it IF NOT IS_VECTOR_ZERO(myGarageData.vProcessZone) vDest = myGarageData.vProcessZone //PRINTLN("Useing vDropZoneA because processizng zone was non o:", myGarageData.vDropZoneA) vAngledA = myGarageData.vDropZoneA vAngledB = myGarageData.vDropZoneB fWidth = myGarageData.fDropZoneW ELSE //PRINTLN("Useing vCoordinate01 because processizng zone was o:", myGarageData.vCoordinate01) vAngledA = myGarageData.vCoordinate01 vAngledB = myGarageData.vCoordinate02 fWidth = myGarageData.fWidth ENDIF IF NOT bDoTutorial IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vDest, <<30,30,LOCATE_SIZE_HEIGHT>>, TRUE) // Do nothing... need this for the chevron // PRINTLN("DOING CHECK FOR VEHICLE INSIDE DROP OFF") IF chosenNodeType = NODE_TYPE_HANDI OR chosenNodeType = NODE_TYPE_ACCIDENT IF NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) SET_VEHICLE_DOORS_LOCKED(brokenVehicles[0].vehicleIndex, VEHICLELOCK_UNLOCKED) PRINTLN("UNLOCKING DOORS ON BROKEN DOWN CAR") bUnlockDoors = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF IF DOES_ENTITY_EXIST(brokenVehicles[curTowIndex].vehicleIndex) IF IS_ENTITY_IN_ANGLED_AREA(brokenVehicles[curTowIndex].vehicleIndex, vAngledA, vAngledB, fWidth, FALSE, FALSE) // AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() - To Fix Bug # 971799, no need to wait until the conversation is done IF bDisplayHelp PRINT_HELP("TOWT_HELP_UH") // PRINTLN("PRINTING HELP 1") ENDIF IF NOT IS_ENTITY_DEAD(myVehicle) AND NOT IS_ENTITY_DEAD(brokenVehicles[curTowIndex].vehicleIndex) IF NOT IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[curTowIndex].vehicleIndex) //OR NOT bDoTutorial OR (IS_PED_IN_VEHICLE(PLAYER_PED_ID(), brokenVehicles[curTowIndex].vehicleIndex) AND NOT IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[curTowIndex].vehicleIndex)) IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_ANY_CONVERSATION() ENDIF KILL_CHASE_HINT_CAM(localChaseHintCamStruct) RETURN TRUE ENDIF ENDIF ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL CHECK_TOWING(STRING sObjective) //INT idx VECTOR vAngledA VECTOR vAngledB FLOAT fWidth INT iRand IF curTowIndex = -1 SCRIPT_ASSERT("curTowIndex = -1") ENDIF IF brokenVehicles[curTowIndex].bDoFire IF (GET_TIMER_IN_SECONDS(brokenVehicles[curTowIndex].carTimer) - brokenVehicles[curTowIndex].pickupTime) > 120.0 EXPLODE_VEHICLE(brokenVehicles[curTowIndex].vehicleIndex) ENDIF ENDIF //Stop banter when you arrive at the destination // IF IS_ENTITY_IN_ANGLED_AREA(brokenVehicles[curTowIndex].vehicleIndex, myGarageData.vCoordinate01, myGarageData.vCoordinate02, myGarageData.fWidth, FALSE, FALSE) // IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // STOP_SCRIPTED_CONVERSATION(FALSE) // ENDIF // ENDIF // IF IS_VEHICLE_IN_DROP_OFF_AREA(vAngledA, vAngledB, fWidth) IF NOT IS_ENTITY_DEAD(brokenVehicles[curTowIndex].pedIndex) AND IS_PED_IN_VEHICLE(brokenVehicles[curTowIndex].pedIndex, myVehicle) BRING_VEHICLE_TO_HALT(MyVehicle, 6, 2) bDropComplete = TRUE // VECTOR COORD = GET_ENTITY_COORDS(brokenVehicles[curTowIndex].vehicleIndex) IF DOES_ENTITY_EXIST(brokenVehicles[curTowIndex].pedIndex) AND NOT IS_ENTITY_DEAD(brokenVehicles[curTowIndex].pedIndex) // Peds for Broken Down and Train Track Clearing OPEN_SEQUENCE_TASK(taskSequence) TASK_CLEAR_LOOK_AT(NULL) TASK_LEAVE_ANY_VEHICLE(NULL) // IF DOES_SCENARIO_EXIST_IN_AREA(COORD, 50, TRUE) // TASK_USE_NEAREST_SCENARIO_TO_COORD(NULL, COORD, 50, -1) // PRINTLN("TASKING PED TO USE SCENARIO") // ELSE // TASK_WANDER_STANDARD(NULL) // PRINTLN("TASKING PED TO GO TO COORDINATE") // ENDIF TASK_GOTO_ENTITY_OFFSET(NULL, brokenVehicles[0].vehicleIndex, DEFAULT_TIME_BEFORE_WARP, 2.0, 0, PEDMOVE_WALK) iRand = GET_RANDOM_INT_IN_RANGE() % 3 IF iRand = 0 TASK_START_SCENARIO_IN_PLACE(NULL, "WORLD_HUMAN_STAND_MOBILE", 0, TRUE) PRINTLN("USING - WORLD_HUMAN_STAND_MOBILE") ELIF iRand = 1 TASK_START_SCENARIO_IN_PLACE(NULL, "WORLD_HUMAN_SMOKING", 0, TRUE) PRINTLN("USING - WORLD_HUMAN_SMOKING") ELIF iRand = 2 TASK_START_SCENARIO_IN_PLACE(NULL, "WORLD_HUMAN_STAND_IMPATIENT", 0, TRUE) PRINTLN("USING - WORLD_HUMAN_STAND_IMPATIENT") ELSE TASK_START_SCENARIO_IN_PLACE(NULL, "WORLD_HUMAN_STAND_MOBILE", 0, TRUE) PRINTLN("USING - WORLD_HUMAN_STAND_MOBILE") ENDIF CLOSE_SEQUENCE_TASK(taskSequence) TASK_PERFORM_SEQUENCE(brokenVehicles[curTowIndex].pedIndex, taskSequence) CLEAR_SEQUENCE_TASK(taskSequence) SET_PED_KEEP_TASK(brokenVehicles[curTowIndex].pedIndex, TRUE) ENDIF // Tonya IF g_savedGlobals.sTowingData.iTowingJobsCompleted = 0 OR g_savedGlobals.sTowingData.iTowingJobsCompleted = 1 OR g_savedGlobals.sTowingData.iTowingJobsCompleted = 4 IF DOES_ENTITY_EXIST(pedTonya) AND NOT IS_ENTITY_DEAD(pedTonya) OPEN_SEQUENCE_TASK(taskSequence) TASK_LEAVE_ANY_VEHICLE(NULL) TASK_WANDER_STANDARD(NULL, 227.0820) CLOSE_SEQUENCE_TASK(taskSequence) IF NOT IS_ENTITY_DEAD(pedTonya) TASK_PERFORM_SEQUENCE(pedTonya, taskSequence) SET_PED_KEEP_TASK(pedTonya, TRUE) PRINTLN("TASKING TONYA TO EXIT") ENDIF CLEAR_SEQUENCE_TASK(taskSequence) ELSE PRINTLN("TONYA SHOULD EXIT, BUT SHE DOESN'T") ENDIF ELSE PRINTLN("TONYA SHOULD NOT EXIST") ENDIF IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() PRINTLN("KILLING CONVERSATION, SO WE CAN HEAR THANK YOU LINE.") KILL_ANY_CONVERSATION() ENDIF IF g_savedGlobals.sTowingData.iTowingJobsCompleted = 0 OR g_savedGlobals.sTowingData.iTowingJobsCompleted = 1 OR g_savedGlobals.sTowingData.iTowingJobsCompleted = 4 IF g_savedGlobals.sTowingData.iTowingJobsCompleted = 0 CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_TUT_ENDA", CONV_PRIORITY_VERY_HIGH)//, DO_NOT_DISPLAY_SUBTITLES) PRINTLN("PLAYING FIRST TONYA GOODBYE") ELIF g_savedGlobals.sTowingData.iTowingJobsCompleted = 1 CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_TUT_ENDB", CONV_PRIORITY_VERY_HIGH)//, DO_NOT_DISPLAY_SUBTITLES) PRINTLN("PLAYING SECOND TONYA GOODBYE") ELIF g_savedGlobals.sTowingData.iTowingJobsCompleted = 4 CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_TUT_ENDC", CONV_PRIORITY_VERY_HIGH)//, DO_NOT_DISPLAY_SUBTITLES) PRINTLN("PLAYING THIRD TONYA GOODBYE") ENDIF ELSE IF chosenNodeType = NODE_TYPE_DYNAMIC IF g_savedGlobals.sTowingData.iBreakDownCompleted = 0 OR g_savedGlobals.sTowingData.iBreakDownCompleted = 1 ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 5, brokenVehicles[0].pedIndex, "TOWBREAKM") CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_BRK_THNK", CONV_PRIORITY_VERY_HIGH)//, DO_NOT_DISPLAY_SUBTITLES PRINTLN("g_savedGlobals.sTowingData.iBreakDownCompleted = ", g_savedGlobals.sTowingData.iBreakDownCompleted) PRINTLN("PLAYING BROKEN DOWN, THANK YOU LINE.") ELIF g_savedGlobals.sTowingData.iBreakDownCompleted = 2 ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 6, brokenVehicles[0].pedIndex, "TOWBREAKHIPM") CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_BRK_THAN", CONV_PRIORITY_VERY_HIGH)//, DO_NOT_DISPLAY_SUBTITLES PRINTLN("g_savedGlobals.sTowingData.iBreakDownCompleted = ", g_savedGlobals.sTowingData.iBreakDownCompleted) PRINTLN("PLAYING BROKEN DOWN, THANK YOU LINE.") ELSE // ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 5, brokenVehicles[0].pedIndex, "TOWBREAKM") // // NEED - Generic "Thank you." // CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_BRK_THNK", CONV_PRIORITY_VERY_HIGH)//, DO_NOT_DISPLAY_SUBTITLES // PRINTLN("g_savedGlobals.sTowingData.iBreakDownCompleted = ", g_savedGlobals.sTowingData.iBreakDownCompleted) // PRINTLN("PLAYING BROKEN DOWN, THANK YOU LINE.") ENDIF ELIF chosenNodeType = NODE_TYPE_TRAIN IF g_savedGlobals.sTowingData.iTrainCompleted = 0 OR g_savedGlobals.sTowingData.iTrainCompleted = 1 ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 5, brokenVehicles[0].pedIndex, "TOWTRAINF") CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_THANK", CONV_PRIORITY_VERY_HIGH)//, DO_NOT_DISPLAY_SUBTITLES PRINTLN("g_savedGlobals.sTowingData.iTrainCompleted = ", g_savedGlobals.sTowingData.iTrainCompleted) PRINTLN("PLAYING TRAIN TRACK CLEARING, THANK YOU LINE.") ELIF g_savedGlobals.sTowingData.iTrainCompleted = 2 ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 6, brokenVehicles[0].pedIndex, "TOWILLEGALMAN2") CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_THANK2", CONV_PRIORITY_VERY_HIGH)//, DO_NOT_DISPLAY_SUBTITLES PRINTLN("g_savedGlobals.sTowingData.iTrainCompleted = ", g_savedGlobals.sTowingData.iTrainCompleted) PRINTLN("PLAYING TRAIN TRACK CLEARING, THANK YOU LINE.") ELSE // ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 6, brokenVehicles[0].pedIndex, "TOWTRAINM") // // NEED - Generic "Thank you." // CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_TRAIN_TK", CONV_PRIORITY_VERY_HIGH)//, DO_NOT_DISPLAY_SUBTITLES // PRINTLN("g_savedGlobals.sTowingData.iTrainCompleted = ", g_savedGlobals.sTowingData.iTrainCompleted) // PRINTLN("PLAYING TRAIN TRACK CLEARING, THANK YOU LINE.") ENDIF ENDIF ENDIF ELSE //BRING_VEHICLE_TO_HALT(PLAYER_PED_ID(), MyVehicle, 6, 1) ENDIF // PRINT_NOW("TOW_OBJ_04", DEFAULT_GOD_TEXT_TIME, 1) IF NOT bDoTutorial //DETACH_VEHICLE_FROM_TOW_TRUCK(myVehicle, brokenVehicles[curTowIndex].vehicleIndex) ENDIF bTowHooked = FALSE REMOVE_BLIP(brokenVehicles[curTowIndex].blipIndex) //brokenVehicles[curTowIndex].vehicleIndex = NULL RESTART_TIMER_NOW(genericTimer) curBrokenCarCount-- RETURN TRUE ENDIF //Check for tow breaking //IF NOT bUnlockDoors IF NOT IS_ENTITY_DEAD(myVehicle) AND NOT IS_ENTITY_DEAD(brokenVehicles[curTowIndex].vehicleIndex) IF NOT IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[curTowIndex].vehicleIndex) bTowHooked = FALSE KILL_CHASE_HINT_CAM(localChaseHintCamStruct) SET_BLIP_ROUTE(brokenVehicles[curTowIndex].blipIndex, FALSE) REMOVE_BLIP(brokenVehicles[curTowIndex].blipIndex) IF DOES_ENTITY_EXIST(brokenVehicles[curTowIndex].vehicleIndex) AND NOT IS_ENTITY_DEAD(brokenVehicles[curTowIndex].vehicleIndex) IF NOT DOES_BLIP_EXIST(brokenVehicles[curTowIndex].blipIndex) brokenVehicles[curTowIndex].blipIndex = ADD_BLIP_FOR_ENTITY(brokenVehicles[curTowIndex].vehicleIndex) SET_BLIP_COLOUR(brokenVehicles[curTowIndex].blipIndex, BLIP_COLOUR_BLUE) ENDIF ENDIF // IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // TestResumptionLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION() // PRINTLN("KILLING ANY CONVERSATION THAT MIGHT BE ONGOING") // KILL_FACE_TO_FACE_CONVERSATION() // // bInterrupt = TRUE // PRINTLN("bInterrupt = TRUE") // ENDIF IF chosenNodeType = NODE_TYPE_TRAIN IF g_savedGlobals.sTowingData.iTrainCompleted = 0 OR g_savedGlobals.sTowingData.iTrainCompleted = 1 ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(), "FRANKLIN") ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 5, brokenVehicles[0].pedIndex, "TOWTRAINF") IF NOT bReattachConvo IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_UNHOOK", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES) PRINTLN("bReattachConvo = TRUE") bReattachConvo = TRUE ENDIF ENDIF ELIF g_savedGlobals.sTowingData.iTrainCompleted = 2 ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(), "FRANKLIN") ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 6, brokenVehicles[0].pedIndex, "TOWILLEGALMAN2") IF NOT bReattachConvo IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_UNHOOK2", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES) PRINTLN("bReattachConvo = TRUE") bReattachConvo = TRUE ENDIF ENDIF ENDIF ELIF chosenNodeType = NODE_TYPE_DYNAMIC IF g_savedGlobals.sTowingData.iBreakDownCompleted = 0 OR g_savedGlobals.sTowingData.iBreakDownCompleted = 1 ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(), "FRANKLIN") ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 5, brokenVehicles[0].pedIndex, "TOWBREAKM") IF NOT bReattachConvo IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_BRK_UNHK", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES) PRINTLN("bReattachConvo = TRUE") bReattachConvo = TRUE ENDIF ENDIF ELIF g_savedGlobals.sTowingData.iBreakDownCompleted = 2 ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(), "FRANKLIN") ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 6, brokenVehicles[0].pedIndex, "TOWBREAKHIPM") IF NOT bReattachConvo IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_BRK_HOOK", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES) PRINTLN("bReattachConvo = TRUE") bReattachConvo = TRUE ENDIF ENDIF ENDIF ENDIF RESTART_TIMER_NOW(genericTimer) IF NOT bSupressObjective IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() STOP_SCRIPTED_CONVERSATION (TRUE) PRINTLN("STOPPING CONVERSATION TO PRINT REHOOK OBJECTIVE") CLEAR_PRINTS() PRINT_NOW(sObjective, DEFAULT_GOD_TEXT_TIME, 1) ENDIF IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF bPrintHook CLEAR_PRINTS() PRINT_NOW(sObjective, DEFAULT_GOD_TEXT_TIME, 1) bPrintHook = FALSE PRINTLN("PRINTING OBJECTIVE TO REATTACH - 01") ELSE CLEAR_PRINTS() PRINT_NOW(sObjective, DEFAULT_GOD_TEXT_TIME, 1) PRINTLN("PRINTING OBJECTIVE TO REATTACH - 02") ENDIF sLastObjective = sObjective ENDIF ELSE PRINTLN("bSupressObjective IS TRUE") ENDIF //bFirstTime = FALSE curStage = MISSION_STATE_TOWING ENDIF ENDIF //ENDIF RETURN FALSE ENDFUNC PROC REMOVE_ALL_BLIPS(INT exceptMe) bSuppressBlips = TRUE INT idx REPEAT MAX_NUM_BROKEN_CARS idx IF idx <> exceptMe IF DOES_BLIP_EXIST(brokenVehicles[idx].blipIndex) REMOVE_BLIP(brokenVehicles[idx].blipIndex) ENDIF ENDIF ENDREPEAT ENDPROC PROC ADD_ALL_BLIPS() bSuppressBlips = FALSE INT idx REPEAT MAX_NUM_BROKEN_CARS idx IF DOES_ENTITY_EXIST(brokenVehicles[idx].vehicleIndex) AND NOT IS_ENTITY_DEAD(brokenVehicles[idx].vehicleIndex) brokenVehicles[idx].blipIndex = ADD_BLIP_FOR_ENTITY(brokenVehicles[idx].vehicleIndex) SET_BLIP_COLOUR(brokenVehicles[idx].blipIndex, BLIP_COLOUR_BLUE) ENDIF ENDREPEAT ENDPROC FUNC BOOL HAS_PLAYER_BUMPED_ENTITY(ENTITY_INDEX myEntity) VEHICLE_INDEX vehicle IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) vehicle = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) ENDIF IF IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), myEntity) OR IS_ENTITY_TOUCHING_ENTITY(vehicle, myEntity) RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL IS_PLAYER_MOVING_WITH_BROKEN_VEHICLE() FLOAT fTempSpeed IF NOT IS_ENTITY_DEAD(myVehicle) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) IF IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex) fTempSpeed = GET_ENTITY_SPEED(myVehicle) // PRINTLN("TOW TRUCK SPEED = ", fTempSpeed) IF fTempSpeed > 1.0 RETURN TRUE ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL UPDATE_BROKEN_VEHICLE_PED(BROKEN_STATE& myState, INT idx, STRING audioLine) //VEHICLE_INDEX vehicle, PED_INDEX myPed) audioLine = audioLine SWITCH myState CASE BROKEN_STATE_VISIBLE DEBUG_MESSAGE("BROKEN_STATE_VISIBLE") PRINTLN("UPDATE_BROKEN_VEHICLE_PED: idx = ", idx) IF NOT bSuppressBlips IF SHOULD_TRIGGER_ENTITY(brokenVehicles[idx].vehicleIndex, myVehicle, myFrameCount, 10, 150, 4, TRUE) OR bReverseOrder OR bTowHooked IF NOT bTaskedBrokenDownPed myFrameCount = 0 ODDJOB_STOP_SOUND(soundID3) DEBUG_MESSAGE("Script Conversation") DEBUG_MESSAGE("Clear ped tasks") IF GET_SCRIPT_TASK_STATUS(brokenVehicles[idx].pedIndex, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY) <> PERFORMING_TASK TASK_TURN_PED_TO_FACE_ENTITY(brokenVehicles[idx].pedIndex, PLAYER_PED_ID(), -1) PRINTLN("TASKING PED TO FACE ENTITY") ENDIF bTaskedBrokenDownPed = TRUE ENDIF IF bTaskedBrokenDownPed IF IS_ENTITY_AT_COORD(myVehicle, GET_ENTITY_COORDS(brokenVehicles[idx].pedIndex), <<25,25,25>>) IF IS_ENTITY_PLAYING_ANIM(brokenVehicles[idx].pedIndex, "oddjobs@towingcome_here", "come_here_idle_a") STOP_ANIM_TASK(brokenVehicles[idx].pedIndex, "oddjobs@towingcome_here", "come_here_idle_a", SLOW_BLEND_OUT) ENDIF IF NOT IS_PLAYER_MOVING_WITH_BROKEN_VEHICLE() IF chosenNodeType = NODE_TYPE_TRAIN IF g_savedGlobals.sTowingData.iTrainCompleted = 0 OR g_savedGlobals.sTowingData.iTrainCompleted = 1 ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(), "FRANKLIN") ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 5, brokenVehicles[idx].pedIndex, "TOWTRAINF") CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_GREET", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES) PRINTLN("PROCEDURAL TOWING TRAIN 0 AND 1") ELIF g_savedGlobals.sTowingData.iTrainCompleted = 2 ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(), "FRANKLIN") ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 6, brokenVehicles[idx].pedIndex, "TOWILLEGALMAN2") CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_GREET2", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES) PRINTLN("PROCEDURAL TOWING TRAIN 2") ELSE PRINTLN("PROCEDURAL TOWING TRAIN DEFAULT") ENDIF TASK_ENTER_VEHICLE(brokenVehicles[idx].pedIndex, myVehicle, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT, PEDMOVEBLENDRATIO_RUN, ECF_BLOCK_SEAT_SHUFFLING | ECF_RESUME_IF_INTERRUPTED) ELIF chosenNodeType = NODE_TYPE_DYNAMIC IF g_savedGlobals.sTowingData.iBreakDownCompleted = 0 OR g_savedGlobals.sTowingData.iBreakDownCompleted = 1 ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(), "FRANKLIN") ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 5, brokenVehicles[idx].pedIndex, "TOWBREAKM") CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_BRK_GRT", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES) PRINTLN("PROCEDURAL TOWING BROKEN 0 AND 1") ELIF g_savedGlobals.sTowingData.iBreakDownCompleted = 2 ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(), "FRANKLIN") ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 6, brokenVehicles[idx].pedIndex, "TOWBREAKHIPM") CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_BRK_GRT2", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES) PRINTLN("PROCEDURAL TOWING BROKEN 2") ELSE PRINTLN("PROCEDURAL TOWING DEFAULT") ENDIF TASK_ENTER_VEHICLE(brokenVehicles[idx].pedIndex, myVehicle, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT, PEDMOVEBLENDRATIO_RUN, ECF_BLOCK_SEAT_SHUFFLING | ECF_RESUME_IF_INTERRUPTED) ENDIF IF bReverseOrder REMOVE_BLIP(brokenVehicles[idx].blipIndex) IF DOES_ENTITY_EXIST(brokenVehicles[idx].pedIndex) brokenVehicles[idx].blipIndex = ADD_BLIP_FOR_ENTITY(brokenVehicles[idx].pedIndex) SET_BLIP_COLOUR(brokenVehicles[idx].blipIndex, BLIP_COLOUR_BLUE) SET_BLIP_SCALE(brokenVehicles[idx].blipIndex, BLIP_SIZE_PED) ENDIF ENDIF //in train we ned to do this only //remove blip from vehicle and blip the ped SETTIMERA(0) myState = BROKEN_STATE_PED_TALK ENDIF ELIF IS_ENTITY_AT_COORD(myVehicle, GET_ENTITY_COORDS(brokenVehicles[idx].pedIndex), <<50,50,50>>) IF NOT bPlayBeckonLine IF g_savedGlobals.sTowingData.iBreakDownCompleted = 0 OR g_savedGlobals.sTowingData.iBreakDownCompleted = 1 ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(), "FRANKLIN") ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 5, brokenVehicles[idx].pedIndex, "TOWBREAKM") IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_CALLING", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES) bPlayBeckonLine = TRUE ENDIF ELIF g_savedGlobals.sTowingData.iBreakDownCompleted = 2 ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(), "FRANKLIN") ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 6, brokenVehicles[idx].pedIndex, "TOWBREAKHIPM") IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_BRK_CALL", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES) bPlayBeckonLine = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ELSE DEBUG_MESSAGE("bSuppressBlips is true") ENDIF BREAK CASE BROKEN_STATE_PED_TALK DEBUG_MESSAGE("BROKEN_STATE_PED_TALK") // IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND TIMERA() > 3000 bStopTimer = TRUE RESTART_TIMER_NOW(failTimer) RESTART_TIMER_NOW(printDelayTimer) SCRIPT_REMOVE_BLIP_SAFE(brokenVehicles[idx].blipIndex) IF NOT DOES_BLIP_EXIST(brokenVehicles[0].blipIndexPed) IF DOES_ENTITY_EXIST(brokenVehicles[idx].pedIndex) brokenVehicles[0].blipIndexPed = ADD_BLIP_FOR_ENTITY(brokenVehicles[idx].pedIndex) SET_BLIP_COLOUR(brokenVehicles[0].blipIndexPed, BLIP_COLOUR_BLUE) SET_BLIP_SCALE(brokenVehicles[0].blipIndexPed, BLIP_SIZE_PED) ENDIF ENDIF PRINT_NOW("TOWT_OBJ_02", DEFAULT_GOD_TEXT_TIME, 1) DEBUG_MESSAGE("Tasking player to enter tow truck") myState = BROKEN_STATE_PED_ENTER // ENDIF BREAK CASE BROKEN_STATE_PED_ENTER DEBUG_MESSAGE("BROKEN_STATE_PED_ENTER") //brokenVehicles[idx].bPedTasked = TRUE //CLEAR_PED_TASKS(brokenVehicles[idx].pedIndex) ADD_RELATIONSHIP_GROUP("TOWBUDDIES", grpBuddies) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, grpBuddies, RELGROUPHASH_PLAYER) // SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), grpBuddies) SET_PED_RELATIONSHIP_GROUP_HASH(brokenVehicles[idx].pedIndex, grpBuddies) // bEnableBonusCam = FALSE REMOVE_ALL_BLIPS(idx) // IF bReverseOrder // myState = BROKEN_STATE_HOOKING // ELSE myState = BROKEN_STATE_DIALOUGE // ENDIF BREAK CASE BROKEN_STATE_DIALOUGE //DEBUG_MESSAGE("BROKEN_STATE_DIALOUGE") IF NOT IS_PED_IN_VEHICLE(brokenVehicles[idx].pedIndex, myVehicle) IF UPDATE_GIVE_UP(giveUpArgs, brokenVehicles[idx].pedIndex) PRINTLN("Pringing abandon job because UPDATE_GIVE_UP returned true") failReason = FAIL_ABANDONED_JOB MISSION_FAILED() ENDIF ENDIF // DEBUG_MESSAGE("BROKEN_STATE_DIALOUGE") IF IS_PED_IN_VEHICLE(brokenVehicles[idx].pedIndex, myVehicle) IF NOT IS_ENTITY_DEAD(myVehicle) SET_VEHICLE_DOORS_LOCKED(myVehicle, VEHICLELOCK_LOCKED_NO_PASSENGERS) SCRIPT_REMOVE_BLIP_SAFE(brokenVehicles[0].blipIndexPed) ENDIF ENDIF IF IS_PED_IN_VEHICLE(brokenVehicles[idx].pedIndex, myVehicle) AND NOT IS_SCRIPTED_CONVERSATION_ONGOING() IF chosenNodeType = NODE_TYPE_TRAIN IF g_savedGlobals.sTowingData.iTrainCompleted = 0 OR g_savedGlobals.sTowingData.iTrainCompleted = 1 IF bReverseOrder ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 5, brokenVehicles[0].pedIndex, "TOWTRAINF") CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_INTRUCK", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES) ELSE ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 5, brokenVehicles[0].pedIndex, "TOWTRAINF") CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_INTRUCK", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES) ENDIF ELIF g_savedGlobals.sTowingData.iTrainCompleted = 2 IF bReverseOrder ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 6, brokenVehicles[0].pedIndex, "TOWILLEGALMAN2") CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_GETIN", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES) ELSE ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 6, brokenVehicles[0].pedIndex, "TOWILLEGALMAN2") CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_GETIN", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES) ENDIF ENDIF myState = BROKEN_STATE_HOOKING ELIF chosenNodeType = NODE_TYPE_DYNAMIC IF g_savedGlobals.sTowingData.iBreakDownCompleted = 0 OR g_savedGlobals.sTowingData.iBreakDownCompleted = 1 IF bReverseOrder ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 5, brokenVehicles[0].pedIndex, "TOWBREAKM") CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_BRK_STRT", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES) ELSE ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 5, brokenVehicles[0].pedIndex, "TOWBREAKM") CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_BRK_STRT", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES) ENDIF ELIF g_savedGlobals.sTowingData.iBreakDownCompleted = 2 IF bReverseOrder ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 6, brokenVehicles[0].pedIndex, "TOWBREAKHIPM") CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_BRK_STR2", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES) ELSE ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 6, brokenVehicles[0].pedIndex, "TOWBREAKHIPM") CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_BRK_STR2", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES) ENDIF ENDIF myState = BROKEN_STATE_HOOKING ENDIF ENDIF BREAK CASE BROKEN_STATE_HOOKING DEBUG_MESSAGE("BROKEN_STATE_HOOKING") IF IS_PED_IN_VEHICLE(brokenVehicles[idx].pedIndex, myVehicle) //AND NOT IS_SCRIPTED_CONVERSATION_ONGOING() //At this point we need to de-blip the rest of the cars REMOVE_ALL_BLIPS(idx) IF NOT IS_ENTITY_DEAD(myVehicle) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) IF bReverseOrder AND IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex) PRINTLN("bReverseOrder AND bTowHooked returning true.") RETURN TRUE ENDIF ENDIF IF NOT DOES_BLIP_EXIST(brokenVehicles[0].blipIndex) IF DOES_ENTITY_EXIST(brokenVehicles[idx].vehicleIndex) AND NOT IS_ENTITY_DEAD(brokenVehicles[idx].vehicleIndex) brokenVehicles[0].blipIndex = ADD_BLIP_FOR_ENTITY(brokenVehicles[idx].vehicleIndex) SET_BLIP_COLOUR(brokenVehicles[idx].blipIndex, BLIP_COLOUR_BLUE) ENDIF ENDIF IF NOT IS_ENTITY_DEAD(myVehicle) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) IF NOT IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex) PRINT_NOW("TOWT_OBJ_03", DEFAULT_GOD_TEXT_TIME, 1) sLastObjective = "TOWT_OBJ_03" ENDIF ENDIF RESTART_TIMER_NOW(printDelayTimer) myState = BROKEN_STATE_VISIBLE RETURN TRUE PRINTLN("**TRUE!!") ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC FUNC BOOL CREATE_BROKEN_VEHICLE_ILLEGAL(BOOL bWithPed = FALSE, BOOL bBlip = FALSE) INT num = 0 IF NOT CREATE_CAR(illegalNodes[illegalIdx].vCarPos, illegalNodes[illegalIdx].fCarRot, num, FALSE, bBlip) RETURN FALSE ENDIF fObjDist = GET_PLAYER_DISTANCE_FROM_LOCATION(illegalNodes[illegalIdx].vCarPos, FALSE) vCurDestObjective[0] = illegalNodes[illegalIdx].vCarPos IF illegalNodes[illegalIdx].myType = NODE_TYPE_ABANDON //front SET_VEHICLE_DAMAGE(brokenVehicles[0].vehicleIndex, <<0.0, 1.2, 0.0>>, 1600.0, 1600.0, TRUE) //windshield SET_VEHICLE_DAMAGE(brokenVehicles[0].vehicleIndex, <<0.0, 0.75, 0.05>>, 1600.0, 1600.0, TRUE) //left window SET_VEHICLE_DAMAGE(brokenVehicles[0].vehicleIndex, <<-0.7, 0.0, 0.0>>, 1600.0, 1600.0, TRUE) //right window SET_VEHICLE_DAMAGE(brokenVehicles[0].vehicleIndex, <<0.7, 0.0, 0.0>>, 1600.0, 1600.0, TRUE) ELIF illegalNodes[illegalIdx].myType = NODE_TYPE_ACCIDENT //DOORS //SET_VEHICLE_DOORS_BROKEN // SCRIPT_ASSERT("here") getPointHead = -1.0 bSpawnPed = TRUE //we want peds to be spawned //Need to create the ambulance as well. helperCar = CREATE_VEHICLE(AMBULANCE, extraData[GET_IDX()].vTrafficPos, extraData[GET_IDX()].fTrafficOrient) IF NOT IS_ENTITY_DEAD(helperCar) SET_VEHICLE_SIREN(helperCar, TRUE) SET_VEHICLE_ENGINE_ON(helperCar, TRUE, TRUE) helperPed = CREATE_PED_INSIDE_VEHICLE(helperCar, PEDTYPE_CIVMALE, S_M_M_PARAMEDIC_01) ENDIF IF NOT IS_VECTOR_ZERO(extraData[GET_IDX()].vMin) sblockingIndex = PREVENT_PEDS_FROM_BEING_IN_AREA(extraData[GET_IDX()].vMin, extraData[GET_IDX()].vMax) ENDIF SWITCH illegalNodes[illegalIdx].myDamage CASE DAMAGE_FRONT_LEFT //Front Left SET_VEHICLE_DAMAGE(brokenVehicles[0].vehicleIndex, <<-0.5223, 2.4550, 0.0784>>, 200, 250, TRUE) SET_VEHICLE_DAMAGE(brokenVehicles[0].vehicleIndex, <<-1.0,1.5,-0.5>>, 200, 250, TRUE) BREAK CASE DAMAGE_FRONT_RIGHT //Front Right SET_VEHICLE_DAMAGE(brokenVehicles[0].vehicleIndex, <<0.6012, 2.4222, 0.0245>>, 200, 250, TRUE) SET_VEHICLE_DAMAGE(brokenVehicles[0].vehicleIndex, <<1.0,1.5,-0.5>>, 200, 250, TRUE) BREAK CASE DAMAGE_HEAD_ON SET_VEHICLE_DAMAGE(brokenVehicles[0].vehicleIndex, <<0.1414, 1.8401, 0.0342>>, 200, 350, TRUE) BREAK ENDSWITCH SET_VEHICLE_DOOR_OPEN(brokenVehicles[0].vehicleIndex, SC_DOOR_FRONT_LEFT) ENDIF IF bWithPed bPedCreated = TRUE IF g_savedGlobals.sTowingData.iTrainCompleted = 0 OR g_savedGlobals.sTowingData.iTrainCompleted = 1 brokenVehicles[0].pedIndex = CREATE_PED_INSIDE_VEHICLE(brokenVehicles[0].vehicleIndex, PEDTYPE_MISSION, A_F_M_BEVHILLS_01, VS_DRIVER) PRINTLN("1ST TRAIN EVENT: PROCEDURAL - PED CREATION - SHOULD BE FEMALE") ELIF g_savedGlobals.sTowingData.iTrainCompleted = 2 brokenVehicles[0].pedIndex = CREATE_PED_INSIDE_VEHICLE(brokenVehicles[0].vehicleIndex, PEDTYPE_MISSION, A_M_Y_GENSTREET_02, VS_DRIVER) PRINTLN("2ND TRAIN EVENT: PROCEDURAL - PED CREATION - SHOULD BE MALE") ELSE PRINTLN("bPedCreated = TRUE - 01") brokenVehicles[0].pedIndex = CREATE_PED_INSIDE_VEHICLE(brokenVehicles[0].vehicleIndex, PEDTYPE_MISSION, pedNames[0], VS_DRIVER) PRINTLN("CREATING PED INSIDE - CREATE_BROKEN_VEHICLE_ILLEGAL") ENDIF ENDIF RETURN TRUE ENDFUNC FUNC BOOL CREATE_BROKEN_VEHICLE_ACCIDENT(BOOL bBlip = FALSE) INT num = 0 IF NOT CREATE_CAR(illegalNodes[illegalIdx].vCarPos, illegalNodes[illegalIdx].fCarRot, num, FALSE, bBlip) RETURN FALSE ENDIF fObjDist = GET_PLAYER_DISTANCE_FROM_LOCATION(illegalNodes[illegalIdx].vCarPos, FALSE) vCurDestObjective[0] = illegalNodes[illegalIdx].vCarPos RETURN TRUE ENDFUNC //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //NAME: CREATE_BROKEN_DOWN_VEHICLE //Description: Calls the comm shared CREATE_CAR but does anything custom needed by the Traditional Towing Mode //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// FUNC BOOL CREATE_BROKEN_DOWN_VEHICLE(VECTOR spawnVec, FLOAT fOrient, INT& openIdx, BOOL bBlip = FALSE) VECTOR vTemp, vModelMin, vModelMax // vEngineOffset VECTOR vDimensions VECTOR vBrokenDownVehiclePosition FLOAT fBrokenDownVehicleHeading //Created a care at openIdx in the vehicle array brokenVehicles IF NOT CREATE_CAR(spawnVec, fOrient, openIdx, TRUE, bBlip) RETURN FALSE ENDIF DEBUG_MESSAGE("CREATE_BROKEN_DOWN_VEHICLE") IF openIdx = -1 SCRIPT_ASSERT("openIdx = -1") ENDIF SET_VEHICLE_DOOR_OPEN(brokenVehicles[openIdx].vehicleIndex, SC_DOOR_BONNET) GET_MODEL_DIMENSIONS(GET_ENTITY_MODEL(brokenVehicles[openIdx].vehicleIndex), vModelMin, vModelMax) PRINTLN("MINIMUM = ", vModelMin) PRINTLN("MAXIMUM = ", vModelMax) vDimensions = vModelMax - vModelMin PRINTLN("DIMENSIONS = ", vDimensions) vDimensions = vDimensions / 2.0 PRINTLN("USABLE DIMENSIONS = ", vDimensions) bSpawnPed = TRUE PRINTLN("bSpawnPed = TRUE") vTemp = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(brokenVehicles[openIdx].vehicleIndex, <<1.5,0,0>>) //vEngineOffset) vBrokenDownVehiclePosition = GET_ENTITY_COORDS(brokenVehicles[openIdx].vehicleIndex) fBrokenDownVehicleHeading = GET_ENTITY_HEADING(brokenVehicles[openIdx].vehicleIndex) iSpeedNode01 = ADD_ROAD_NODE_SPEED_ZONE(GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vBrokenDownVehiclePosition, fBrokenDownVehicleHeading, <<-1.5,-30,0>>), 10, 0) iSpeedNode02 = ADD_ROAD_NODE_SPEED_ZONE(GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vBrokenDownVehiclePosition, fBrokenDownVehicleHeading, <<-1.5,30,0>>), 10, 0) CLEAR_AREA_OF_VEHICLES(vTemp, 30) extraData[GET_IDX()].vUtilityPos[0] = <> RETURN TRUE ENDFUNC PROC UPDATE_PED_GIVE_UP(BOOL bCheckDetach = FALSE) BOOL bGiveUp = FALSE FLOAT fDist STRING sLine fDist = GET_DISTANCE_BETWEEN_ENTITIES(brokenVehicles[0].pedIndex, brokenVehicles[0].vehicleIndex) IF bCheckDetach IF NOT IS_ENTITY_DEAD(myVehicle) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) IF IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex) AND NOT IS_PED_IN_VEHICLE(brokenVehicles[0].pedIndex, brokenVehicles[0].vehicleIndex) bGiveUp = TRUE ENDIF ENDIF ENDIF IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(brokenVehicles[0].pedIndex, PLAYER_PED_ID()) OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(PLAYER_PED_ID(), brokenVehicles[0].pedIndex) RESTART_TIMER_NOW(chaseTimer) CLEAR_ENTITY_LAST_DAMAGE_ENTITY(brokenVehicles[0].pedIndex) CLEAR_ENTITY_LAST_DAMAGE_ENTITY(PLAYER_PED_ID()) ENDIF ENDIF IF IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) pedState = ANGRY_PED_DONE ELIF fDist > 35 OR (GET_TIMER_IN_SECONDS(chaseTimer) > 30 AND fDist > 5) OR bGiveUp OR (NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND IS_PED_ARMED(PLAYER_PED_ID(), WF_INCLUDE_GUN|WF_INCLUDE_PROJECTILE)) DEBUG_MESSAGE("Give up") IF bAttack ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 5, brokenVehicles[0].pedIndex, "TOWABDHANDMAN2") sLine = "TOW_PED_ANCU" ELIF bSexVariation ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 5, brokenVehicles[0].pedIndex, "TOWSEXMANLYGUY") sLine = "TOW_YELL" ELSE ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 6, brokenVehicles[0].pedIndex, "TOWABDHANDMAN1") sLine = "TOW_PED_ANC2" ENDIF piSpeakers[0] = brokenVehicles[0].pedIndex piSpeakers[1] = brokenVehicles[0].pedIndexPass bAngryPedGaveUp = TRUE ODDJOB_START_CONVERSATION(MyLocalPedStruct, "TOWAUD", sLine, piSpeakers) //CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", sLine, CONV_PRIORITY_VERY_HIGH) REMOVE_BLIP(brokenVehicles[0].blipIndexPed) IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) CLEAR_PED_TASKS(brokenVehicles[0].pedIndex) TASK_SMART_FLEE_PED(brokenVehicles[0].pedIndex, PLAYER_PED_ID(), 1000, -1) ENDIF //TASK_WANDER_STANDARD(brokenVehicles[0].pedIndex) pedState = ANGRY_PED_DONE ENDIF ENDPROC PROC HANDLE_ENGINE_START_AUDIO() FLOAT fAnimTime IF bDisablePedCam OR (NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) AND NOT IS_PED_IN_VEHICLE(brokenVehicles[0].pedIndex, brokenVehicles[0].vehicleIndex)) // PRINTLN("bDisablePedCam = TRUE") IF soundID3 <> - 1 STOP_SOUND(soundID3) RELEASE_SOUND_ID(soundID3) soundID3 = -1 PRINTLN("STOPPING SOUND") EXIT ENDIF ENDIF IF NOT bGrabbedSoundID soundID3 = GET_SOUND_ID() PRINTLN("soundID3 = ", soundID3) bGrabbedSoundID = TRUE ENDIF IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) IF IS_ENTITY_PLAYING_ANIM(brokenVehicles[0].pedIndex, "oddjobs@towing", "Start_Engine_Loop") fAnimTime = GET_ENTITY_ANIM_CURRENT_TIME(brokenVehicles[0].pedIndex, "oddjobs@towing", "Start_Engine_Loop") // PRINTLN("fAnimTime = ", fAnimTime) IF (fAnimTime >= 0.190 AND fAnimTime <= 0.262) OR (fAnimTime >= 0.400 AND fAnimTime <= 0.600) OR (fAnimTime >= 0.900 AND fAnimTime <= 1.0) IF (fAnimTime >= 0.190 AND fAnimTime <= 0.262) // PRINTLN("CASE 1 MET") ENDIF IF (fAnimTime >= 0.400 AND fAnimTime <= 0.600) // PRINTLN("CASE 2 MET") ENDIF IF (fAnimTime >= 0.900 AND fAnimTime <= 1.0) // PRINTLN("CASE 3 MET") ENDIF IF NOT bPlayedSound PLAY_SOUND_FROM_ENTITY(soundID3, "TOWING_ENGINE_TURNING_MASTER", brokenVehicles[0].vehicleIndex) PRINTLN("PLAYING SOUND soundID3 = ", soundID3) bPlayedSound = TRUE ENDIF ELSE STOP_SOUND(soundID3) PRINTLN("STOPPING SOUND: ", soundID3) bPlayedSound = FALSE ENDIF ELSE ENDIF ENDIF ENDPROC FUNC BOOL HAS_PED_PLAYED_ANIM_WHEN_PUSHED() IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) IF bPushedOffTrack SWITCH iPushStages CASE 0 IF GET_SEQUENCE_PROGRESS(brokenVehicles[0].pedIndex) = 1 PRINTLN("iPushStages = 1") iPushStages = 1 ENDIF BREAK CASE 1 IF NOT IS_ENTITY_PLAYING_ANIM(brokenVehicles[0].pedIndex, "oddjobs@towingpleadingidle_b", "idle_d") PRINTLN("iPushStages = 2") iPushStages = 2 ENDIF BREAK CASE 2 RETURN TRUE BREAK ENDSWITCH ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL UPDATE_TRAIN_PED() HANDLE_ENGINE_START_AUDIO() SWITCH trainPedState CASE TRAIN_STATE_PED_INIT //DEBUG_MESSAGE("TRAIN_STATE_PED_INIT") ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 0, PLAYER_PED_ID(),"FRANKLIN") ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 3, brokenVehicles[0].pedIndex, sCharacterName) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(brokenVehicles[0].pedIndex, TRUE) fPanicDist = GET_RANDOM_INT_IN_RANGE(35, 80) trainPedState = TRAIN_STATE_PED_FIRST BREAK CASE TRAIN_STATE_PED_FIRST //DEBUG_MESSAGE("TRAIN_STATE_PED_FIRST") OPEN_SEQUENCE_TASK(taskSequence) //TASK_PLAY_ANIM(NULL, "oddjobs@towing","Start_Engine_Enter",NORMAL_BLEND_IN,NORMAL_BLEND_OUT)//, -1, AF_LOOPING) TASK_PLAY_ANIM(NULL, "oddjobs@towing","Start_Engine_Loop",NORMAL_BLEND_IN,NORMAL_BLEND_OUT, -1, AF_LOOPING) CLOSE_SEQUENCE_TASK(taskSequence) TASK_PERFORM_SEQUENCE(brokenVehicles[0].pedIndex, taskSequence) CLEAR_SEQUENCE_TASK(taskSequence) //SET_ENTITY_ANIM_CURRENT_TIME() //GET_SCRIPT_TASK_STATUS() //Trigger first line about stalled car if the player is close enough to hear it or in the cam IF GET_PLAYER_DISTANCE_FROM_LOCATION(illegalNodes[illegalIdx].vCarPos) < 40 OR towArgs.iCamTime > 0 IF chosenNodeType = NODE_TYPE_TRAIN IF g_savedGlobals.sTowingData.iTrainCompleted = 0 OR g_savedGlobals.sTowingData.iTrainCompleted = 1 ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 5, brokenVehicles[0].pedIndex, "TOWTRAINF") CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_GETOUT", CONV_PRIORITY_HIGH) trainPedState = TRAIN_STATE_PED_LOOK ELIF g_savedGlobals.sTowingData.iTrainCompleted = 2 ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 6, brokenVehicles[0].pedIndex, "TOWILLEGALMAN2") CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_GETOUT2", CONV_PRIORITY_HIGH) trainPedState = TRAIN_STATE_PED_LOOK ENDIF ENDIF ELIF GET_ENTITY_DISTANCE_FROM_LOCATION(brokenVehicles[0].blockingIndex, illegalNodes[illegalIdx].vCarPos) < fPanicDist+10 TASK_PLAY_ANIM(NULL, "oddjobs@towing","Start_Engine_Exit",NORMAL_BLEND_IN,NORMAL_BLEND_OUT) //skip ahead if the train is getting close trainPedState = TRAIN_STATE_PED_LOOK ENDIF BREAK CASE TRAIN_STATE_PED_LOOK //DEBUG_MESSAGE("TRAIN_STATE_PED_LOOK") //temp remove this check IF NOT IS_VECTOR_ZERO(illegalNodes[illegalIdx].vAngledPos1) illegalNodes[illegalIdx].vAngledPos1.z = 45 illegalNodes[illegalIdx].vAngledPos2.z = -45 IF NOT IS_ENTITY_IN_ANGLED_AREA(brokenVehicles[0].vehicleIndex, illegalNodes[illegalIdx].vAngledPos1, illegalNodes[illegalIdx].vAngledPos2, illegalNodes[illegalIdx].fAngledWidth) //SCRIPT_ASSERT("entity isn't in angeled area") // CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_TRN_PUSH", CONV_PRIORITY_VERY_HIGH) ODDJOB_STOP_SOUND(soundID3) bDisablePedCam = TRUE bDisableCam = TRUE bPushedOffTrack = TRUE PRINTLN("SETTING bDisablePedCam = TRUE BECAUSE PED IS OUTSIDE ANGLED AREA") IF IS_PED_IN_ANY_VEHICLE(brokenVehicles[0].pedIndex) OPEN_SEQUENCE_TASK(taskSequence) TASK_LEAVE_ANY_VEHICLE(NULL) TASK_PLAY_ANIM(NULL, "oddjobs@towingpleadingidle_b", "idle_d", SLOW_BLEND_IN, SLOW_BLEND_OUT, 10000, AF_UPPERBODY) CLOSE_SEQUENCE_TASK(taskSequence) TASK_PERFORM_SEQUENCE(brokenVehicles[0].pedIndex, taskSequence) CLEAR_SEQUENCE_TASK(taskSequence) trainPedState = TRAIN_STATE_PED_PENDING ENDIF ENDIF ENDIF IF GET_ENTITY_DISTANCE_FROM_LOCATION(brokenVehicles[0].blockingIndex, illegalNodes[illegalIdx].vCarPos) < fPanicDist+15 //TOW_TRN_PPE1 //flee //TOW_TRN_PPS1 //stuck IF g_savedGlobals.sTowingData.iTrainCompleted = 0 OR g_savedGlobals.sTowingData.iTrainCompleted = 1 ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 5, brokenVehicles[0].pedIndex, "TOWTRAINF") CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_GETOUT", CONV_PRIORITY_VERY_HIGH) PRINTLN("PLAYING AUDIO LINE - TOW_GETOUT") ELIF g_savedGlobals.sTowingData.iTrainCompleted = 2 ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 6, brokenVehicles[0].pedIndex, "TOWILLEGALMAN2") CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_GETOUT2", CONV_PRIORITY_VERY_HIGH) PRINTLN("PLAYING AUDIO LINE - TOW_GETOUT2") ENDIF ODDJOB_STOP_SOUND(soundID3) TASK_LOOK_AT_ENTITY(brokenVehicles[0].pedIndex, brokenVehicles[0].blockingIndex, -1, SLF_FAST_TURN_RATE) SETTIMERB(0) DEBUG_MESSAGE("Setting timer b to 0") trainPedState = TRAIN_STATE_PED_PANIC ENDIF BREAK CASE TRAIN_STATE_PED_PANIC //DEBUG_MESSAGE("TRAIN_STATE_PED_PANIC") //look for at least a second //IF TIMERB() > 3000 IF GET_ENTITY_DISTANCE_FROM_LOCATION(brokenVehicles[0].blockingIndex, illegalNodes[illegalIdx].vCarPos) < fPanicDist //have ped exit car and run IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) IF iToggle = 1 CLEANUP_CAM(towArgs) ENDIF bDisablePedCam = TRUE IF IS_PED_IN_ANY_VEHICLE(brokenVehicles[0].pedIndex) OPEN_SEQUENCE_TASK(taskSequence) TASK_LEAVE_ANY_VEHICLE(NULL) // TASK_SMART_FLEE_COORD(NULL, illegalNodes[illegalIdx].vCarPos, 15.0, 3000) TASK_GO_TO_COORD_ANY_MEANS(NULL, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(illegalNodes[illegalIdx].vCarPos, illegalNodes[illegalIdx].fCarRot, << 0, 15, 0 >>), PEDMOVEBLENDRATIO_SPRINT, NULL) TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), -1) CLOSE_SEQUENCE_TASK(taskSequence) SET_PED_FLEE_ATTRIBUTES(brokenVehicles[0].pedIndex, FA_RETURN_TO_ORIGNAL_POSITION_AFTER_FLEE, FALSE) TASK_PERFORM_SEQUENCE(brokenVehicles[0].pedIndex, taskSequence) CLEAR_SEQUENCE_TASK(taskSequence) DEBUG_MESSAGE("TRAIN_STATE_PED_PENDING") trainPedState = TRAIN_STATE_PED_PENDING ENDIF ENDIF ENDIF //ENDIF BREAK CASE TRAIN_STATE_PED_PENDING //DEBUG_MESSAGE("TRAIN_STATE_PED_PENDING") IF trainState = TRAIN_STATE_DONE AND bTowHooked OR HAS_PED_PLAYED_ANIM_WHEN_PUSHED() // bEnableBonusCam = FALSE SETTIMERB(3000) DEBUG_MESSAGE("TRAIN_STATE_PED_ENTER_TRUCK") trainPedState = TRAIN_STATE_PED_ENTER_TRUCK ENDIF //If the train moves past and the tow truck is attached then transition to the tow truck. BREAK CASE TRAIN_STATE_PED_ENTER_TRUCK //DEBUG_MESSAGE("TRAIN_STATE_PED_ENTER_TRUCK") bReverseOrder = TRUE //Don't get out right away if skipped IF TIMERB() > 3000 IF UPDATE_BROKEN_VEHICLE_PED(brokenState, 0, "TOW_TRAIN1") trainPedState = TRAIN_STATE_PED_END ENDIF ENDIF BREAK CASE TRAIN_STATE_PED_END //DEBUG_MESSAGE("TRAIN_STATE_PED_END") BREAK ENDSWITCH RETURN FALSE ENDFUNC FUNC BOOL UPDATE_TRAIN() VECTOR tempa #IF IS_DEBUG_BUILD VECTOR tempb FLOAT fDistanceBetween #ENDIF // IS_DEBUG_BUILD IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) AND NOT IS_ENTITY_DEAD(myVehicle) IF IS_PED_IN_VEHICLE(brokenVehicles[0].pedIndex, myVehicle) IF DOES_BLIP_EXIST(brokenVehicles[0].blipIndexExtra) REMOVE_BLIP(brokenVehicles[0].blipIndexExtra) PRINTLN("REMOVING BLIP - brokenVehicles[0].blipIndexExtra") ODDJOB_STOP_SOUND(soundID3) ENDIF ELIF NOT IS_PED_IN_VEHICLE(brokenVehicles[0].pedIndex, brokenVehicles[0].vehicleIndex) ODDJOB_STOP_SOUND(soundID3) ENDIF ENDIF SWITCH trainState CASE TRAIN_STATE_PRINT IF GET_PLAYER_DISTANCE_FROM_LOCATION(illegalNodes[illegalIdx].vCarPos) < 100 brokenVehicles[0].blockingIndex = CREATE_MISSION_TRAIN(6, illegalNodes[illegalIdx].vPedPos, illegalNodes[illegalIdx].bBackward) IF DOES_ENTITY_EXIST(brokenVehicles[0].blockingIndex) brokenVehicles[0].blipIndexExtra = ADD_BLIP_FOR_ENTITY(brokenVehicles[0].blockingIndex) ENDIF pedTrainDriver = CREATE_PED_INSIDE_VEHICLE(brokenVehicles[0].blockingIndex, PEDTYPE_CIVMALE, S_M_M_LSMETRO_01) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedTrainDriver, TRUE) IF NOT IS_ENTITY_DEAD(brokenVehicles[0].blockingIndex) SET_TRAIN_CRUISE_SPEED(brokenVehicles[0].blockingIndex, 0.0) ENDIF PRINT_NOW("TOW_OBJ_05", DEFAULT_GOD_TEXT_TIME, 1) SETTIMERA(0) PRINTLN("Initial Train Distance:", VDIST(illegalNodes[illegalIdx].vPedPos, illegalNodes[illegalIdx].vCarPos), " Train index: ", illegalIdx) ODDJOB_PLAY_SOUND("CROSSING_BELL", soundID4, TRUE, NULL, 226.8878, -2538.4209, 4.8665, "TONYA_03_SOUNDSET") trainState = TRAIN_STATE_WAIT ENDIF BREAK CASE TRAIN_STATE_WAIT IF GET_PLAYER_DISTANCE_FROM_LOCATION(illegalNodes[illegalIdx].vCarPos) < 80 OR TIMERA() > 10000 // Start oncoming train scene IF NOT IS_AUDIO_SCENE_ACTIVE("TOWING_ONCOMING_TRAIN_SCENE") START_AUDIO_SCENE("TOWING_ONCOMING_TRAIN_SCENE") PRINTLN("STARTING AUDIO SCENE - TOWING_ONCOMING_TRAIN_SCENE") ENDIF trainState = TRAIN_STATE_START ENDIF BREAK CASE TRAIN_STATE_START //PRINTLN(GET_DISTANCE_BETWEEN_ENTITIES(brokenVehicles[0].blockingIndex, brokenVehicles[0].vehicleIndex)) IF NOT IS_ENTITY_DEAD(brokenVehicles[0].blockingIndex) PRINTLN("Setting the train speed to 22.0") SET_TRAIN_CRUISE_SPEED(brokenVehicles[0].blockingIndex, 26.0) SET_TRAIN_SPEED(brokenVehicles[0].blockingIndex, 22.0) ENDIF trainState = TRAIN_STATE_BREAK BREAK CASE TRAIN_STATE_BREAK IF NOT IS_ENTITY_DEAD(brokenVehicles[0].blockingIndex) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) IF GET_ENTITY_DISTANCE_FROM_LOCATION(brokenVehicles[0].blockingIndex, illegalNodes[illegalIdx].vCarPos) < 175 SIMULATE_BREAKING(brokenVehicles[0].blockingIndex) ODDJOB_PLAY_SOUND("TOWING_TRAIN_BRAKES_MASTER", soundID2, TRUE, brokenVehicles[0].blockingIndex) START_BREAKING_PFX(sparksEffects, brokenVehicles[0].blockingIndex) ODDJOB_PLAY_SOUND("TOWING_TRAIN_HORN_MASTER", soundID, TRUE, brokenVehicles[0].blockingIndex) trainState = TRAIN_STATE_CHECKS ENDIF ELSE trainState = TRAIN_STATE_DONE ENDIF BREAK CASE TRAIN_STATE_CHECKS DEBUG_MESSAGE("Checks") IF NOT IS_ENTITY_DEAD(brokenVehicles[0].blockingIndex) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) SIMULATE_BREAKING(brokenVehicles[0].blockingIndex) IF NOT IS_ENTITY_IN_ANGLED_AREA(brokenVehicles[0].vehicleIndex, illegalNodes[illegalIdx].vAngledPos1, illegalNodes[illegalIdx].vAngledPos2, illegalNodes[illegalIdx].fAngledWidth) STOP_BREAKING_PFX(sparksEffects) // PRINTLN("STOPPING BREAKING EFFECTS, SINCE WE'RE NOT ON THE TRACKS") ENDIF tempa = GET_ENTITY_COORDS(brokenVehicles[0].blockingIndex) PRINTLN("tempa = ", tempa) #IF IS_DEBUG_BUILD tempb = GET_ENTITY_COORDS(brokenVehicles[0].vehicleIndex) fDistanceBetween = VDIST(tempa, tempb) PRINTLN("fDistanceBetween = ", fDistanceBetween) #ENDIF // IS_DEBUG_BUILD IF GET_ENTITY_DISTANCE_FROM_LOCATION(brokenVehicles[0].blockingIndex, illegalNodes[illegalIdx].vCarPos) < 3 bTrainClose = TRUE ENDIF PRINTLN("Is entity touching entity:", "Train pos: ", tempa, " Car pos: ", tempb) IF IS_ENTITY_TOUCHING_ENTITY(brokenVehicles[0].blockingIndex, brokenVehicles[0].vehicleIndex) PRINTLN("Train is touching car") IF NOT IS_ENTITY_DEAD(myVehicle) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) IF IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex) DETACH_VEHICLE_FROM_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex) ENDIF ENDIF EXPLODE_VEHICLE(brokenVehicles[0].vehicleIndex) trainState = TRAIN_STATE_STOP ELIF GET_ENTITY_DISTANCE_FROM_LOCATION(brokenVehicles[0].vehicleIndex, tempa) < 10 AND IS_ENTITY_IN_ANGLED_AREA(brokenVehicles[0].vehicleIndex, illegalNodes[illegalIdx].vAngledPos1, illegalNodes[illegalIdx].vAngledPos2, illegalNodes[illegalIdx].fAngledWidth) bTrainClose = TRUE // HACK: Adding in to fix entity touching entity bug IF NOT IS_ENTITY_DEAD(myVehicle) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) IF IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex) DETACH_VEHICLE_FROM_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex) ENDIF ENDIF EXPLODE_VEHICLE(brokenVehicles[0].vehicleIndex) PRINTLN("HITTING DITANCE CHECK!") // HACK: Adding in to fix entity touching entity bug ENDIF //The train was close to the target vehicle but now is getting further away. IF bTrainClose AND GET_ENTITY_DISTANCE_FROM_LOCATION(brokenVehicles[0].blockingIndex, illegalNodes[illegalIdx].vCarPos) > 4 PRINTLN("Train is getting further away") trainState = TRAIN_STATE_STOP ENDIF ELSE trainState = TRAIN_STATE_STOP ENDIF BREAK CASE TRAIN_STATE_STOP IF NOT bTowHooked PRINT_NOW("TOWT_OBJ_03G", DEFAULT_GOD_TEXT_TIME, 1) IF DOES_BLIP_EXIST(brokenVehicles[0].blipIndexExtra) REMOVE_BLIP(brokenVehicles[0].blipIndexExtra) PRINTLN("REMOVING BLIP - brokenVehicles[0].blipIndexExtra - NOT bTowHooked") ENDIF ENDIF DEBUG_MESSAGE("Stop") REMOVE_BLIP(brokenVehicles[0].blipIndexExtra) ODDJOB_STOP_SOUND(soundID) ODDJOB_STOP_SOUND(soundID2) STOP_BREAKING_PFX(sparksEffects) ODDJOB_STOP_SOUND(soundID3) ODDJOB_STOP_SOUND(soundID4) trainState = TRAIN_STATE_OBJ BREAK CASE TRAIN_STATE_OBJ IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF NOT bTowHooked PRINT_NOW("TOWT_OBJ_03G", DEFAULT_GOD_TEXT_TIME, 1) ENDIF IF IS_AUDIO_SCENE_ACTIVE("TOWING_ONCOMING_TRAIN_SCENE") STOP_AUDIO_SCENE("TOWING_ONCOMING_TRAIN_SCENE") PRINTLN("STOPPING AUDIO SCENE - TOWING_ONCOMING_TRAIN_SCENE VIA MAIN UPDATE") ENDIF trainState = TRAIN_STATE_DONE ENDIF BREAK CASE TRAIN_STATE_DONE BREAK ENDSWITCH RETURN FALSE ENDFUNC FUNC BOOL UPDATE_PED_DIALOUGE() // PRINTLN("UPDATE_PED_DIALOUGE") SWITCH pedDialougeState CASE TOW_PED_BEG // PRINTLN("TOW_PED_BEG") // //should be able to just let this trigger: CREATE_CONVERSATION_FROM_SPECIFIC_LINE() IF GET_SEQUENCE_PROGRESS(brokenVehicles[0].pedIndex) >= 1 AND NOT IS_MESSAGE_BEING_DISPLAYED() PRINTLN("GOING TO STATE - TOW_PED_FACE") pedDialougeState = TOW_PED_FACE ENDIF BREAK CASE TOW_PED_FACE // PRINTLN("TOW_PED_FACE") IF bPlayInitialUpsetLine AND NOT bPlayFullConvo IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF NOT bPrintSpecialCaseObj IF NOT bWakeUp PRINT_NOW("TOWT_OBJ_06", DEFAULT_GOD_TEXT_TIME, 1) bPrintSpecialCaseObj = TRUE PRINTLN("bWakeUp IS FALSE, PRINT OBJECTIVE") ELSE PRINTLN("bWakeUp IS TRUE, DO NOT PRINT OBJECTIVE") ENDIF ENDIF IF bPrintSpecialCaseObj AND NOT IS_MESSAGE_BEING_DISPLAYED() IF GET_SCRIPT_TASK_STATUS(brokenVehicles[0].pedIndex, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY) <> PERFORMING_TASK TASK_TURN_PED_TO_FACE_ENTITY(brokenVehicles[0].pedIndex, brokenVehicles[0].pedIndexPass) ENDIF PRINTLN("PLAYING CONVO - TOW_SEX_SCAR") bPlayFullConvo = TRUE PRINTLN("GOING TO STATE - TOW_PED_CHASE") pedDialougeState= TOW_PED_CHASE ENDIF ENDIF ENDIF IF GET_PLAYER_DISTANCE_FROM_ENTITY(brokenVehicles[0].pedIndex) > 20.0 PRINTLN("STOPPING SCRIPTED CONVERSATION, BECAUSE PLAYER HAS EXCEEDED 90M DISTANCE - 01") STOP_SCRIPTED_CONVERSATION(TRUE) RETURN TRUE ENDIF BREAK CASE TOW_PED_CHASE IF GET_PLAYER_DISTANCE_FROM_ENTITY(brokenVehicles[0].pedIndex) > 20.0 PRINTLN("STOPPING SCRIPTED CONVERSATION, BECAUSE PLAYER HAS EXCEEDED 90M DISTANCE - 02") STOP_SCRIPTED_CONVERSATION(TRUE) RETURN TRUE ENDIF IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() PRINTLN("RETURN TRUE - UPDATE_PED_DIALOUGE - 02") RETURN TRUE ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC PROC HANDLE_PLAYER_CLOSE_TO_SEX_COUPLE() VECTOR vPlayerPosition, vBrokenDownVehiclePosition IF NOT bPlayTooCloseConvo IF DOES_ENTITY_EXIST(brokenVehicles[0].vehicleIndex) IF NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) vBrokenDownVehiclePosition = GET_ENTITY_COORDS(brokenVehicles[0].vehicleIndex) ENDIF ENDIF IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID()) ENDIF IF bSexVariation IF VDIST2(vPlayerPosition, vBrokenDownVehiclePosition) < 5*5 STOP_SCRIPTED_CONVERSATION(TRUE) #IF NOT FEATURE_GEN9_RELEASE IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() TASK_LOOK_AT_ENTITY(brokenVehicles[0].pedIndex, PLAYER_PED_ID(), 5000) ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 5, brokenVehicles[0].pedIndex, "TOWSEXMANLYGUY") IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_HANDI_CL", CONV_PRIORITY_VERY_HIGH) PRINTLN("PLAYING PLAYER TOO CLOSE - CONVO") bPlayTooCloseConvo = TRUE ENDIF ENDIF #ENDIF #IF FEATURE_GEN9_RELEASE bPlayTooCloseConvo = TRUE //Bypass playing any dialogue here #ENDIF ENDIF ENDIF ENDIF ENDPROC #IF NOT IS_JAPANESE_BUILD FUNC BOOL UPDATE_ANGRY_PED() SEQUENCE_INDEX iSeq VECTOR vPlayerPosition HANDLE_PLAYER_CLOSE_TO_SEX_COUPLE() SWITCH pedState CASE ANGRY_PED_INIT IF bSexVariation IF NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) brokenVehicles[0].pedIndex = CREATE_PED_INSIDE_VEHICLE(brokenVehicles[0].vehicleIndex, PEDTYPE_MISSION, pedNames[0], VS_BACK_LEFT) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(brokenVehicles[0].pedIndex, TRUE) ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 5, brokenVehicles[0].pedIndex, "TOWSEXMANLYGUY") brokenVehicles[0].pedIndexPass = CREATE_PED_INSIDE_VEHICLE(brokenVehicles[0].vehicleIndex, PEDTYPE_MISSION, mnExtraModel, VS_BACK_RIGHT) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(brokenVehicles[0].pedIndexPass, TRUE) SET_PED_CONFIG_FLAG(brokenVehicles[0].pedIndexPass, PCF_DontInfluenceWantedLevel, TRUE) ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 6, brokenVehicles[0].pedIndexPass, "TOWSEXPRISSYGUY") #IF NOT FEATURE_GEN9_RELEASE TASK_PLAY_ANIM(brokenVehicles[0].pedIndex, "oddjobs@towing", "m_blow_job_loop", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) TASK_PLAY_ANIM(brokenVehicles[0].pedIndexPass, "oddjobs@towing", "f_blow_job_loop", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) #ENDIF IF NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) SET_VEHICLE_DOORS_LOCKED(brokenVehicles[0].vehicleIndex, VEHICLELOCK_CANNOT_ENTER) ENDIF bPedCreated = TRUE PRINTLN("bPedCreated = TRUE - 02") ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 0, PLAYER_PED_ID(), "FRANKLIN") PRINTLN("CREATING PED - bSexVariation") ENDIF ELIF bHomelessVariation IF NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) brokenVehicles[0].pedIndex = CREATE_PED_INSIDE_VEHICLE(brokenVehicles[0].vehicleIndex, PEDTYPE_MISSION, pedNames[0], VS_FRONT_RIGHT) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(brokenVehicles[0].pedIndex, TRUE) SET_PED_CONFIG_FLAG(brokenVehicles[0].pedIndex, PCF_DontInfluenceWantedLevel, TRUE) ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 2, brokenVehicles[0].pedIndex, sCharacterName) TASK_PLAY_ANIM(brokenVehicles[0].pedIndex,"RANDOM@CAR_SLEEPING","Sleeping_Idle",NORMAL_BLEND_IN,NORMAL_BLEND_OUT,-1,AF_LOOPING) bPedCreated = TRUE PRINTLN("bPedCreated = TRUE - 03") PRINTLN("CREATING PED - bHomelessVariation") ELSE PRINTLN("VEHICLE DEAD - NO PED CREATION") ENDIF ELIF GET_RANDOM_BOOL() DEBUG_MESSAGE("bAttack = TRUE") bAttack = TRUE ELSE DEBUG_MESSAGE("bAttack = FALSE") bAttack = FALSE ENDIF pedState = ANGRY_PED_CREATE BREAK CASE ANGRY_PED_CREATE //Once the player is close to the tow car spawn the angry ped IF bSexVariation #IF NOT FEATURE_GEN9_RELEASE IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_ENTITY_COORDS(brokenVehicles[0].vehicleIndex), <<15,15,15>>) IF NOT bPlaySexyConvo IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_SEX_SNDS", CONV_PRIORITY_VERY_HIGH) PRINTLN("bPlaySexyConvo = TRUE - 01") bPlaySexyConvo = TRUE ENDIF ENDIF ENDIF ENDIF #ENDIF #IF FEATURE_GEN9_RELEASE IF NOT bPlaySexyConvo bPlaySexyConvo = TRUE //Bypass playing any conversations here ENDIF #ENDIF ENDIF //attaching the hook and bumping / horn should wake her up.. IF NOT IS_ENTITY_DEAD(myVehicle) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) IF IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex) OR SHOULD_WAKE_UP(myVehicle, brokenVehicles[0].vehicleIndex, NOT(bSexVariation OR bHomelessVariation) ) IF SHOULD_WAKE_UP(myVehicle, brokenVehicles[0].vehicleIndex, NOT(bSexVariation OR bHomelessVariation) ) bWakeUp = TRUE PRINTLN("bWakeUp = TRUE") ENDIF IF NOT bHomelessVariation START_TIMER_AT(wakeTimer, 1.0) ELSE START_TIMER_NOW(wakeTimer) ENDIF ENDIF ENDIF IF IS_TIMER_STARTED(wakeTimer) AND GET_TIMER_IN_SECONDS(wakeTimer) > 1.0 IF bSexVariation AND IS_TIMER_STARTED(wakeTimer) IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_ANY_CONVERSATION() //Hey what the hell is going on! Can't a guy fuck in peace? ENDIF //jump out all angry and bShakeCar = FALSE IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) OPEN_SEQUENCE_TASK(taskSequence) TASK_LEAVE_ANY_VEHICLE(NULL, 750) // TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, GET_GOTO_POS(brokenVehicles[0].vehicleIndex), PEDMOVEBLENDRATIO_RUN) // TASK_GO_TO_COORD_ANY_MEANS(NULL, GET_GOTO_POS(brokenVehicles[0].vehicleIndex), PEDMOVEBLENDRATIO_RUN, NULL) TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID()) //pick one of these two.. TASK_PLAY_ANIM(NULL, "oddjobs@towingpleadingidle_b", "idle_d", NORMAL_BLEND_OUT, SLOW_BLEND_DURATION, -1, AF_LOOPING) CLOSE_SEQUENCE_TASK(taskSequence) TASK_PERFORM_SEQUENCE(brokenVehicles[0].pedIndex, taskSequence) CLEAR_SEQUENCE_TASK(taskSequence) OPEN_SEQUENCE_TASK(taskSequence) TASK_LEAVE_ANY_VEHICLE(NULL) // TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, GET_GOTO_POS_PASSENGER(brokenVehicles[0].vehicleIndex), PEDMOVEBLENDRATIO_RUN) // TASK_GO_TO_COORD_ANY_MEANS(NULL, GET_GOTO_POS_PASSENGER(brokenVehicles[0].vehicleIndex), PEDMOVEBLENDRATIO_RUN, NULL) TASK_TURN_PED_TO_FACE_ENTITY(NULL, brokenVehicles[0].pedIndex) TASK_PLAY_ANIM(NULL, "oddjobs@towingpleadingidle_a", "idle_c", SLOW_BLEND_DURATION, SLOW_BLEND_DURATION, 30000, AF_LOOPING) TASK_SMART_FLEE_PED(NULL, brokenVehicles[0].pedIndex, 1000, -1) TASK_WANDER_STANDARD(NULL) CLOSE_SEQUENCE_TASK(taskSequence) IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndexPass) TASK_PERFORM_SEQUENCE(brokenVehicles[0].pedIndexPass, taskSequence) ENDIF CLEAR_SEQUENCE_TASK(taskSequence) // bEnableBonusCam = FALSE ENDIF PRINTLN("GOING TO STATE - ANGRY_PED_EXIT") pedState = ANGRY_PED_EXIT ELIF bHomelessVariation //homeless attack variation. IF g_savedGlobals.sTowingData.iAbandonCompleted% 2 = 0 IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) OPEN_SEQUENCE_TASK(taskSequence) TASK_LEAVE_ANY_VEHICLE(NULL) TASK_GO_TO_ENTITY(NULL, myVehicle, DEFAULT_TIME_BEFORE_WARP, 9.0, PEDMOVEBLENDRATIO_WALK) TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID()) TASK_PLAY_ANIM(NULL, "oddjobs@towingangryidle_a", "idle_b", NORMAL_BLEND_OUT, SLOW_BLEND_DURATION, 7000) TASK_WANDER_STANDARD(NULL) CLOSE_SEQUENCE_TASK(taskSequence) TASK_PERFORM_SEQUENCE(brokenVehicles[0].pedIndex, taskSequence) CLEAR_SEQUENCE_TASK(taskSequence) // bEnableBonusCam = FALSE ENDIF ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 2, brokenVehicles[0].pedIndex, "TOWABDBITCHM") CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_HOM_ANGR", CONV_PRIORITY_VERY_HIGH) ELSE IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) SETUP_PED_FOR_COMBAT(brokenVehicles[0].pedIndex) SET_PED_COMBAT_ATTRIBUTES(brokenVehicles[0].pedIndex, CA_USE_COVER, FALSE) SET_PED_COMBAT_ATTRIBUTES(brokenVehicles[0].pedIndex, CA_USE_VEHICLE, FALSE) OPEN_SEQUENCE_TASK(taskSequence) TASK_LEAVE_ANY_VEHICLE(NULL) TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID()) //TASK_PLAY_ANIM(NULL, "gestures@male", "anger_a") TASK_COMBAT_PED(NULL, PLAYER_PED_ID()) CLOSE_SEQUENCE_TASK(taskSequence) TASK_PERFORM_SEQUENCE(brokenVehicles[0].pedIndex, taskSequence) CLEAR_SEQUENCE_TASK(taskSequence) IF DOES_ENTITY_EXIST(brokenVehicles[0].pedIndex) tempBlip = ADD_BLIP_FOR_ENTITY(brokenVehicles[0].pedIndex) SET_BLIP_COLOUR(tempBlip, BLIP_COLOUR_RED) SET_BLIP_SCALE(tempBlip, BLIP_SIZE_PED) REGISTER_BLIPPED_ENTITY(brokenVehicles[0].pedIndex, tempBlip, TRUE) PRINTLN("ADDING RED BLIP FOR PED") ENDIF bAttack = TRUE PRINTLN("SETTING bAttack = TRUE VIA bHomelessVariation") // bEnableBonusCam = FALSE ENDIF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_HOM_DRG", CONV_PRIORITY_VERY_HIGH) ENDIF //who woke me up? pedState = ANGRY_PED_EXIT ELIF bAttack brokenVehicles[0].pedIndex = CREATE_PED(PEDTYPE_CIVMALE, pedNames[0], illegalNodes[illegalIdx].vPedPos, illegalNodes[illegalIdx].fPedRot) PRINTLN("CREATING PED - bAttack IS TRUE") //GIVE_WEAPON_TO_PED(brokenVehicles[0].pedIndex, WEAPONTYPE_PISTOL, 200) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(brokenVehicles[0].pedIndex, TRUE) SET_PED_CONFIG_FLAG(brokenVehicles[0].pedIndex, PCF_DontInfluenceWantedLevel, TRUE) bPedCreated = TRUE PRINTLN("bPedCreated = TRUE - 04") angryPedRoot = "TOW_PED_ANGR" bPedCreated = FALSE IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) OPEN_SEQUENCE_TASK(taskSequence) TASK_GO_TO_ENTITY(NULL, myVehicle, DEFAULT_TIME_BEFORE_WARP, 15.0, PEDMOVEBLENDRATIO_SPRINT) //brokenVehicles[0].vehicleIndex TASK_COMBAT_PED(NULL, PLAYER_PED_ID()) CLOSE_SEQUENCE_TASK(taskSequence) TASK_PERFORM_SEQUENCE(brokenVehicles[0].pedIndex, taskSequence) CLEAR_SEQUENCE_TASK(taskSequence) // bEnableBonusCam = FALSE ENDIF pedState = ANGRY_PED_WAIT ELSE brokenVehicles[0].pedIndex = CREATE_PED(PEDTYPE_CIVMALE, pedNames[0], illegalNodes[illegalIdx].vPedPos, illegalNodes[illegalIdx].fPedRot) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(brokenVehicles[0].pedIndex, TRUE) SET_PED_CONFIG_FLAG(brokenVehicles[0].pedIndex, PCF_DontInfluenceWantedLevel, TRUE) PRINTLN("CREATING PED - REGULAR") SET_ENTITY_LOAD_COLLISION_FLAG(brokenVehicles[0].pedIndex, TRUE) bPedCreated = TRUE PRINTLN("bPedCreated = TRUE - 05") angryPedRoot = "TOW_ILLEG1" IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) OPEN_SEQUENCE_TASK(taskSequence) TASK_GOTO_ENTITY_OFFSET(NULL, PLAYER_PED_ID(), DEFAULT_TIME_BEFORE_WARP, 12.0, 0, PEDMOVEBLENDRATIO_SPRINT) //TASK_GOTO_ENTITY_OFFSET_XY(NULL, PLAYER_PED_ID(), DEFAULT_TIME_BEFORE_WARP, 12.0, 0, 2, PEDMOVEBLENDRATIO_SPRINT) //TASK_GO_TO_ENTITY(NULL, myVehicle, DEFAULT_TIME_BEFORE_WARP, 10.0, PEDMOVEBLENDRATIO_SPRINT) //brokenVehicles[0].vehicleIndex TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID()) //TASK_PLAY_ANIM(NULL, "gestures@male", "anger_a") CLOSE_SEQUENCE_TASK(taskSequence) TASK_PERFORM_SEQUENCE(brokenVehicles[0].pedIndex, taskSequence) CLEAR_SEQUENCE_TASK(taskSequence) // bEnableBonusCam = FALSE ENDIF pedState = ANGRY_PED_WAIT ENDIF ENDIF BREAK CASE ANGRY_PED_EXIT // PRINTLN("INSIDE STATE - ANGRY_PED_EXIT") IF bSexVariation #IF NOT FEATURE_GEN9_RELEASE IF NOT bPlayInitialUpsetLine IF IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex) OR bWakeUp IF NOT IS_MESSAGE_BEING_DISPLAYED() IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_SEX_INIT", CONV_PRIORITY_VERY_HIGH) PRINTLN("PLAYING CONVO - TOW_SEX_SCAR - 01") bPlayInitialUpsetLine = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF #ENDIF #IF FEATURE_GEN9_RELEASE bPlayInitialUpsetLine = TRUE //Skip playing any conversations here #ENDIF ENDIF IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) IF NOT IS_PED_IN_ANY_VEHICLE(brokenVehicles[0].pedIndex) IF bHomelessVariation IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF GET_SCRIPT_TASK_STATUS(brokenVehicles[0].pedIndex, SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK IF GET_SEQUENCE_PROGRESS(brokenVehicles[0].pedIndex) = 2 // check task status IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID()) ENDIF IF VDIST2(vPlayerPosition, GET_ENTITY_COORDS(brokenVehicles[0].pedIndex)) < (20*20) IF g_savedGlobals.sTowingData.iAbandonCompleted% 2 = 0 //TODO pick the right enums for variaitons.. male - female CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_HOM_ANG1", CONV_PRIORITY_VERY_HIGH) ELSE CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_HOM_ANG2", CONV_PRIORITY_VERY_HIGH) ENDIF ENDIF PRINTLN("GOING TO STATE - ANGRY_PED_DONE") pedState = ANGRY_PED_DONE ENDIF ENDIF ENDIF ELSE IF NOT IS_ENTITY_DEAD(myVehicle) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) IF UPDATE_PED_DIALOUGE() OR (NOT IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex) AND NOT bWakeUp) // IF NOT IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex) KILL_ANY_CONVERSATION() PRINTLN("KILLING CONVERSATION - TOW TRUCK NO LONGER ATTACHED") PRINTLN("GOING TO STATE - ANGRY_PED_CHASE") pedState = ANGRY_PED_CHASE // ENDIF ELSE IF NOT IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex) AND bWakeUp IF bPlayInitialUpsetLine IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() PRINTLN("GOING TO STATE - ANGRY_PED_CHASE - BUMP CASE") pedState = ANGRY_PED_CHASE ENDIF ENDIF ENDIF ENDIF ELSE // PRINTLN("STOPPED HERE") ENDIF ENDIF ENDIF ENDIF BREAK CASE ANGRY_PED_WAIT // DEBUG_MESSAGE("ANGRY_PED_WAIT") IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) //IF GET_SEQUENCE_PROGRESS(brokenVehicles[0].pedIndex) >= 1 IF GET_DISTANCE_BETWEEN_ENTITIES(brokenVehicles[0].pedIndex, PLAYER_PED_ID()) < 12 //HACK.. TASK_GO_TO_ENTITY has a LONG delay before thinking it's done CLEAR_PED_TASKS(brokenVehicles[0].pedIndex) IF bAttack TASK_COMBAT_PED(brokenVehicles[0].pedIndex, PLAYER_PED_ID()) ELIF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) DEBUG_MESSAGE("play anim") OPEN_SEQUENCE_TASK(taskSequence) TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID()) TASK_PLAY_ANIM(NULL, "oddjobs@towingpleadingidle_a", "idle_c", NORMAL_BLEND_OUT, SLOW_BLEND_DURATION, 5000) CLOSE_SEQUENCE_TASK(taskSequence) TASK_PERFORM_SEQUENCE(brokenVehicles[0].pedIndex, taskSequence) CLEAR_SEQUENCE_TASK(taskSequence) ENDIF DEBUG_MESSAGE(">= 1 or within 20m") bInCombat = TRUE IF bSexVariation pedState = ANGRY_PED_CHASE ELSE pedState = ANGRY_PED_DIALOUGE ENDIF ENDIF ENDIF BREAK CASE ANGRY_PED_DIALOUGE // DEBUG_MESSAGE("ANGRY_PED_DIALOUGE") IF DOES_ENTITY_EXIST(brokenVehicles[0].pedIndex) brokenVehicles[0].blipIndexPed = ADD_BLIP_FOR_ENTITY(brokenVehicles[0].pedIndex) IF bAttack SET_BLIP_COLOUR(brokenVehicles[0].blipIndexPed, BLIP_COLOUR_RED) SET_BLIP_SCALE(brokenVehicles[0].blipIndexPed, BLIP_SIZE_PED) PRINTLN("SETTING BLIP TO BE RED, BECAUSE bAttack IS TRUE") ELSE SET_BLIP_COLOUR(brokenVehicles[0].blipIndexPed, BLIP_COLOUR_BLUE) SET_BLIP_SCALE(brokenVehicles[0].blipIndexPed, BLIP_SIZE_PED) PRINTLN("SETTING BLIP TO BE BLUE, BECAUSE bAttack IS FALSE") ENDIF ENDIF IF bAttack IF chosenNodeType = NODE_TYPE_HANDI ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(), "FRANKLIN") ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 5, brokenVehicles[0].pedIndex, "TOWABDHANDMAN2") PRINTLN("SETTING UP DIALOGUE FOR HANDICAP - ATTACK") REGISTER_QUICK_CONV_QUEUE(MyLocalPedStruct, "TOWAUD", "TOW_PED_ANGR") ELSE ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(), "FRANKLIN") ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 2, brokenVehicles[0].pedIndex, "TOWABDATTACKM") PRINTLN("SETTING UP DIALOGUE FOR ABANDON - ATTACK") REGISTER_QUICK_CONV_QUEUE(MyLocalPedStruct, "TOWAUD", "TOW_HOM_DRG") ENDIF ELSE ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(), "FRANKLIN") ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 3, brokenVehicles[0].pedIndex, sCharacterName) PRINTLN("SETTING UP DIALOGUE - REGULAR ?") REGISTER_QUICK_CONV_QUEUE(MyLocalPedStruct, "TOWAUD", angryPedRoot) ENDIF bSupressObjective = TRUE SETTIMERA(0) IF bAttack RESTART_TIMER_NOW(chaseTimer) pedState = ANGRY_PED_ENTER ELSE pedState = ANGRY_PED_CHASE ENDIF BREAK CASE ANGRY_PED_CHASE // PRINTLN("INSIDE - ANGRY_PED_CHASE") IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF bSexVariation SETTIMERB(0) ENDIF RESTART_TIMER_NOW(chaseTimer) IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) AND NOT IS_ENTITY_DEAD(myVehicle) IF IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex) TASK_FOLLOW_TO_OFFSET_OF_ENTITY(brokenVehicles[0].pedIndex, brokenVehicles[0].vehicleIndex, <<0,0,0>>, PEDMOVEBLENDRATIO_SPRINT, -1, 10.0) PRINTLN("TASK GUY TO CHASE SINCE THE VEHICLE IS STILL ATTACHED TO TOW TRUCK") ELSE IF NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) SET_VEHICLE_DOORS_LOCKED(brokenVehicles[0].vehicleIndex, VEHICLELOCK_UNLOCKED) ENDIF CLEAR_SEQUENCE_TASK(iSeq) OPEN_SEQUENCE_TASK(iSeq) TASK_ENTER_VEHICLE(NULL, brokenVehicles[0].vehicleIndex) TASK_VEHICLE_DRIVE_WANDER(NULL, brokenVehicles[0].vehicleIndex, 5.0, DRIVINGMODE_AVOIDCARS_OBEYLIGHTS) CLOSE_SEQUENCE_TASK(iSeq) IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) TASK_PERFORM_SEQUENCE(brokenVehicles[0].pedIndex, iSeq) PRINTLN("TASKING GUY TO ENTER AND WANDER SINCE VEHICLE IS NO LONGER ATTACHED") ENDIF CLEAR_SEQUENCE_TASK(iSeq) bGuyTryingToEnterCar = TRUE ENDIF ENDIF PRINTLN("GOING TO STATE - ANGRY_PED_ENTER") pedState = ANGRY_PED_ENTER ENDIF BREAK CASE ANGRY_PED_ENTER // PRINTLN("INSIDE STATE - ANGRY_PED_ENTER") UPDATE_PED_GIVE_UP() IF NOT bAngryPedGaveUp // Adding this flag here to prevent the ped from giving up then getting a late task to re-enter //take into account the sex ped IF NOT IS_ENTITY_DEAD(myVehicle) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) IF NOT IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex) IF bSexVariation IF TIMERB() > 8000 RESTART_TIMER_NOW(chaseTimer) IF NOT bGuyTryingToEnterCar SET_VEHICLE_DOORS_LOCKED(brokenVehicles[0].vehicleIndex, VEHICLELOCK_UNLOCKED) TASK_ENTER_VEHICLE(brokenVehicles[0].pedIndex, brokenVehicles[0].vehicleIndex, DEFAULT_TIME_BEFORE_WARP) PRINTLN("TASKING PED TO ENTER VEHICLE") ENDIF PRINTLN("GOING TO STATE - ANGRY_PED_DRIVE - 01") pedState = ANGRY_PED_DRIVE ENDIF ELSE RESTART_TIMER_NOW(chaseTimer) SET_VEHICLE_DOORS_LOCKED(brokenVehicles[0].vehicleIndex, VEHICLELOCK_UNLOCKED) TASK_ENTER_VEHICLE(brokenVehicles[0].pedIndex, brokenVehicles[0].vehicleIndex, DEFAULT_TIME_BEFORE_WARP) PRINTLN("GOING TO STATE - ANGRY_PED_DRIVE - 02") pedState = ANGRY_PED_DRIVE ENDIF ELSE IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) IF TIMERB() > 7000 IF NOT bAttack IF IS_PED_IN_VEHICLE(brokenVehicles[0].pedIndex, brokenVehicles[0].vehicleIndex) IF NOT IS_ENTITY_DEAD(myVehicle) IF GET_ENTITY_SPEED(myVehicle) < 2.0 IF GET_SCRIPT_TASK_STATUS(brokenVehicles[0].pedIndex, SCRIPT_TASK_VEHICLE_DRIVE_WANDER) <> PERFORMING_TASK TASK_VEHICLE_DRIVE_WANDER(brokenVehicles[0].pedIndex, brokenVehicles[0].vehicleIndex, 2.0, DRIVINGMODE_AVOIDCARS_OBEYLIGHTS) // PRINTLN("TASKING GUY DRIVE WANDER") ENDIF ELSE CLEAR_SEQUENCE_TASK(iSeq) OPEN_SEQUENCE_TASK(iSeq) TASK_LEAVE_ANY_VEHICLE(NULL, 5000, ECF_JUMP_OUT) TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 1000, -1) CLOSE_SEQUENCE_TASK(iSeq) IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) TASK_PERFORM_SEQUENCE(brokenVehicles[0].pedIndex, iSeq) PRINTLN("TASKING GUY TO JUMP OUT") ENDIF CLEAR_SEQUENCE_TASK(iSeq) PRINTLN("GOING TO STATE - ANGRY_PED_DRIVE - 03") pedState = ANGRY_PED_DRIVE ENDIF ENDIF ELSE IF NOT IS_ENTITY_DEAD(myVehicle) IF GET_ENTITY_SPEED(myVehicle) < 5.0 IF GET_SCRIPT_TASK_STATUS(brokenVehicles[0].pedIndex, SCRIPT_TASK_ENTER_VEHICLE) <> PERFORMING_TASK IF IS_VEHICLE_SEAT_FREE(brokenVehicles[0].vehicleIndex) TASK_ENTER_VEHICLE(brokenVehicles[0].pedIndex, brokenVehicles[0].vehicleIndex, DEFAULT_TIME_NEVER_WARP) // PRINTLN("TASKING HANDI CAP PED 2 TO ENTER HIS VEHICLE") ENDIF ENDIF ELSE IF GET_SCRIPT_TASK_STATUS(brokenVehicles[0].pedIndex, SCRIPT_TASK_FOLLOW_TO_OFFSET_OF_ENTITY) <> PERFORMING_TASK TASK_FOLLOW_TO_OFFSET_OF_ENTITY(brokenVehicles[0].pedIndex, brokenVehicles[0].vehicleIndex, <<0,0,0>>, PEDMOVEBLENDRATIO_SPRINT, -1, 10.0) // PRINTLN("TASKING HANDI CAP PED 2 TO FOLLOW VEHICLE AGAIN") ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF BREAK CASE ANGRY_PED_DRIVE UPDATE_PED_GIVE_UP(TRUE) //TODO add a give up time or if you re-hook IF IS_PED_IN_ANY_VEHICLE(brokenVehicles[0].pedIndex) AND NOT IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex) IF bAttack angryPedRoot = "TOW_PED_ANTH" ELIF bSexVariation angryPedRoot = "TOW_ILLEG_SE" ENDIF PRINTLN("ANGRY PED IS IN HIS VEHICLE") bDriverGotCarBack = TRUE CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", angryPedRoot, CONV_PRIORITY_VERY_HIGH) bSupressObjective = FALSE TASK_VEHICLE_DRIVE_WANDER(brokenVehicles[0].pedIndex, brokenVehicles[0].vehicleIndex, 5.0, DRIVINGMODE_AVOIDCARS_OBEYLIGHTS) //TASK_VEHICLE_DRIVE_WANDER(brokenVehicles[0].pedIndex, brokenVehicles[0].vehicleInde, 5.0, DRIVINGMODE_AVOIDCARS_OBEYLIGHTS) pedState = ANGRY_PED_DONE RETURN TRUE ENDIF BREAK CASE ANGRY_PED_DONE // PRINTLN("INSIDE STATE - ANGRY_PED_DONE") bInCombat = FALSE bSupressObjective = FALSE IF DOES_BLIP_EXIST(brokenVehicles[0].blipIndexPed) REMOVE_BLIP(brokenVehicles[0].blipIndexPed) ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC #ENDIF #IF IS_JAPANESE_BUILD FUNC BOOL UPDATE_ANGRY_PED_CLEAN() SWITCH pedState CASE ANGRY_PED_INIT IF bHomelessVariation IF NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) brokenVehicles[0].pedIndex = CREATE_PED_INSIDE_VEHICLE(brokenVehicles[0].vehicleIndex, PEDTYPE_MISSION, pedNames[0], VS_FRONT_RIGHT) SET_MODEL_AS_NO_LONGER_NEEDED(pedNames[0]) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(brokenVehicles[0].pedIndex, TRUE) SET_PED_CONFIG_FLAG(brokenVehicles[0].pedIndex, PCF_DontInfluenceWantedLevel, TRUE) ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, iPedID, brokenVehicles[0].pedIndex, sCharacterName) TASK_PLAY_ANIM(brokenVehicles[0].pedIndex,"RANDOM@CAR_SLEEPING","Sleeping_Idle",NORMAL_BLEND_IN,NORMAL_BLEND_OUT,-1,AF_LOOPING) bPedCreated = TRUE PRINTLN("bPedCreated = TRUE - 03") ELSE PRINTLN("VEHICLE DEAD - NO PED CREATION") ENDIF ELIF GET_RANDOM_BOOL() DEBUG_MESSAGE("bAttack = TRUE") bAttack = FALSE ELSE DEBUG_MESSAGE("bAttack = FALSE") bAttack = FALSE ENDIF pedState = ANGRY_PED_CREATE BREAK CASE ANGRY_PED_CREATE //attaching the hook and bumping / horn should wake her up.. IF NOT IS_ENTITY_DEAD(myVehicle) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) IF IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex) IF NOT bHomelessVariation START_TIMER_AT(wakeTimer, 1.0) ELSE START_TIMER_NOW(wakeTimer) ENDIF ENDIF ENDIF IF IS_TIMER_STARTED(wakeTimer) AND GET_TIMER_IN_SECONDS(wakeTimer) > 1.0 IF IS_TIMER_STARTED(wakeTimer) IF bHomelessVariation //homeless attack variation. IF g_savedGlobals.sTowingData.iAbandonCompleted% 2 = 0 IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) OPEN_SEQUENCE_TASK(taskSequence) TASK_LEAVE_ANY_VEHICLE(NULL) TASK_GO_TO_ENTITY(NULL, myVehicle, DEFAULT_TIME_BEFORE_WARP, 9.0, PEDMOVEBLENDRATIO_WALK) TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID()) TASK_PLAY_ANIM(NULL, "oddjobs@towingangryidle_a", "idle_b", NORMAL_BLEND_OUT, SLOW_BLEND_DURATION, 7000) TASK_WANDER_STANDARD(NULL) CLOSE_SEQUENCE_TASK(taskSequence) IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) TASK_PERFORM_SEQUENCE(brokenVehicles[0].pedIndex, taskSequence) ENDIF CLEAR_SEQUENCE_TASK(taskSequence) // bEnableBonusCam = FALSE ENDIF ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 2, brokenVehicles[0].pedIndex, "TOWABDBITCHM") CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_HOM_ANGR", CONV_PRIORITY_VERY_HIGH) ELSE IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) SETUP_PED_FOR_COMBAT(brokenVehicles[0].pedIndex) SET_PED_COMBAT_ATTRIBUTES(brokenVehicles[0].pedIndex, CA_USE_COVER, FALSE) SET_PED_COMBAT_ATTRIBUTES(brokenVehicles[0].pedIndex, CA_USE_VEHICLE, FALSE) OPEN_SEQUENCE_TASK(taskSequence) TASK_LEAVE_ANY_VEHICLE(NULL) TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID()) //TASK_PLAY_ANIM(NULL, "gestures@male", "anger_a") TASK_COMBAT_PED(NULL, PLAYER_PED_ID()) CLOSE_SEQUENCE_TASK(taskSequence) IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) TASK_PERFORM_SEQUENCE(brokenVehicles[0].pedIndex, taskSequence) ENDIF CLEAR_SEQUENCE_TASK(taskSequence) IF DOES_ENTITY_EXIST(brokenVehicles[0].pedIndex) tempBlip = ADD_BLIP_FOR_ENTITY(brokenVehicles[0].pedIndex) SET_BLIP_COLOUR(tempBlip, BLIP_COLOUR_RED) SET_BLIP_SCALE(tempBlip, BLIP_SIZE_PED) REGISTER_BLIPPED_ENTITY(brokenVehicles[0].pedIndex, tempBlip, TRUE) PRINTLN("ADDING RED BLIP FOR PED") ENDIF bAttack = TRUE PRINTLN("SETTING bAttack = TRUE VIA bHomelessVariation") // bEnableBonusCam = FALSE ENDIF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_HOM_DRG", CONV_PRIORITY_VERY_HIGH) ENDIF //who woke me up? pedState = ANGRY_PED_EXIT ELIF bAttack brokenVehicles[0].pedIndex = CREATE_PED(PEDTYPE_CIVMALE, pedNames[0], illegalNodes[illegalIdx].vPedPos, illegalNodes[illegalIdx].fPedRot) PRINTLN("CREATING PED - bAttack IS TRUE") //GIVE_WEAPON_TO_PED(brokenVehicles[0].pedIndex, WEAPONTYPE_PISTOL, 200) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(brokenVehicles[0].pedIndex, TRUE) SET_PED_CONFIG_FLAG(brokenVehicles[0].pedIndex, PCF_DontInfluenceWantedLevel, TRUE) bPedCreated = TRUE PRINTLN("bPedCreated = TRUE - 04") angryPedRoot = "TOW_PED_ANGR" bPedCreated = FALSE IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) OPEN_SEQUENCE_TASK(taskSequence) TASK_GO_TO_ENTITY(NULL, myVehicle, DEFAULT_TIME_BEFORE_WARP, 15.0, PEDMOVEBLENDRATIO_SPRINT) //brokenVehicles[0].vehicleIndex TASK_COMBAT_PED(NULL, PLAYER_PED_ID()) CLOSE_SEQUENCE_TASK(taskSequence) TASK_PERFORM_SEQUENCE(brokenVehicles[0].pedIndex, taskSequence) CLEAR_SEQUENCE_TASK(taskSequence) // bEnableBonusCam = FALSE ENDIF pedState = ANGRY_PED_WAIT ELSE brokenVehicles[0].pedIndex = CREATE_PED(PEDTYPE_CIVMALE, pedNames[0], illegalNodes[illegalIdx].vPedPos, illegalNodes[illegalIdx].fPedRot) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(brokenVehicles[0].pedIndex, TRUE) SET_PED_CONFIG_FLAG(brokenVehicles[0].pedIndex, PCF_DontInfluenceWantedLevel, TRUE) PRINTLN("CREATING PED - REGULAR") SET_ENTITY_LOAD_COLLISION_FLAG(brokenVehicles[0].pedIndex, TRUE) SET_PED_MOVEMENT_CLIPSET(brokenVehicles[0].pedIndex, "move_m@JOG@") SET_MODEL_AS_NO_LONGER_NEEDED(pedNames[0]) ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 5, brokenVehicles[0].pedIndex, "TOWHANDIBEGM") bPedCreated = TRUE PRINTLN("bPedCreated = TRUE - 05") angryPedRoot = "TOW_ILLEG1" IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) OPEN_SEQUENCE_TASK(taskSequence) TASK_GOTO_ENTITY_OFFSET(NULL, PLAYER_PED_ID(), DEFAULT_TIME_BEFORE_WARP, 8.0, 0, PEDMOVEBLENDRATIO_RUN) TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID()) //TASK_PLAY_ANIM(NULL, "gestures@male", "anger_a") CLOSE_SEQUENCE_TASK(taskSequence) IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) TASK_PERFORM_SEQUENCE(brokenVehicles[0].pedIndex, taskSequence) ENDIF CLEAR_SEQUENCE_TASK(taskSequence) // bEnableBonusCam = FALSE ENDIF pedState = ANGRY_PED_WAIT ENDIF ENDIF ENDIF BREAK CASE ANGRY_PED_EXIT // PRINTLN("INSIDE STATE - ANGRY_PED_EXIT") IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) IF NOT IS_PED_IN_ANY_VEHICLE(brokenVehicles[0].pedIndex) IF bHomelessVariation IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF GET_SCRIPT_TASK_STATUS(brokenVehicles[0].pedIndex, SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK IF GET_SEQUENCE_PROGRESS(brokenVehicles[0].pedIndex) = 2 // check task status IF g_savedGlobals.sTowingData.iAbandonCompleted% 2 = 0 //TODO pick the right enums for variaitons.. male - female CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_HOM_ANG1", CONV_PRIORITY_VERY_HIGH) ELSE CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_HOM_ANG2", CONV_PRIORITY_VERY_HIGH) ENDIF PRINTLN("GOING TO STATE - ANGRY_PED_DONE") pedState = ANGRY_PED_DONE ENDIF ENDIF ENDIF ELSE IF NOT IS_ENTITY_DEAD(myVehicle) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) IF UPDATE_PED_DIALOUGE() OR NOT IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex) // IF NOT IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex) KILL_ANY_CONVERSATION() PRINTLN("KILLING CONVERSATION - TOW TRUCK NO LONGER ATTACHED") PRINTLN("GOING TO STATE - ANGRY_PED_CHASE") pedState = ANGRY_PED_CHASE // ENDIF ENDIF ELSE // PRINTLN("STOPPED HERE") ENDIF ENDIF ENDIF ENDIF BREAK CASE ANGRY_PED_WAIT // DEBUG_MESSAGE("ANGRY_PED_WAIT") IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) //IF GET_SEQUENCE_PROGRESS(brokenVehicles[0].pedIndex) >= 1 IF GET_DISTANCE_BETWEEN_ENTITIES(brokenVehicles[0].pedIndex, PLAYER_PED_ID()) < 12 //HACK.. TASK_GO_TO_ENTITY has a LONG delay before thinking it's done IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) CLEAR_PED_TASKS(brokenVehicles[0].pedIndex) ENDIF IF bAttack TASK_COMBAT_PED(brokenVehicles[0].pedIndex, PLAYER_PED_ID()) ELIF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) DEBUG_MESSAGE("play anim") OPEN_SEQUENCE_TASK(taskSequence) TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID()) TASK_PLAY_ANIM(NULL, "oddjobs@towingpleadingidle_a", "idle_c", NORMAL_BLEND_OUT, SLOW_BLEND_DURATION, -1, AF_LOOPING) CLOSE_SEQUENCE_TASK(taskSequence) IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) TASK_PERFORM_SEQUENCE(brokenVehicles[0].pedIndex, taskSequence) ENDIF CLEAR_SEQUENCE_TASK(taskSequence) ENDIF DEBUG_MESSAGE(">= 1 or within 20m") bInCombat = TRUE SETTIMERB(0) RESTART_TIMER_NOW(chaseTimer) PRINTLN("GOING TO STATE - ANGRY_PED_DIALOUGE - 01") pedState = ANGRY_PED_DIALOUGE ENDIF ENDIF BREAK CASE ANGRY_PED_DIALOUGE // DEBUG_MESSAGE("ANGRY_PED_DIALOUGE") ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(), "FRANKLIN") ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, iPedID, brokenVehicles[0].pedIndex, sCharacterName) bSupressObjective = TRUE REGISTER_QUICK_CONV_QUEUE(MyLocalPedStruct, "TOWAUD", angryPedRoot) SETTIMERA(0) IF bAttack RESTART_TIMER_NOW(chaseTimer) pedState = ANGRY_PED_ENTER ELSE PRINTLN("GOING TO STATE - ANGRY_PED_ENTER - 01") pedState = ANGRY_PED_ENTER ENDIF BREAK CASE ANGRY_PED_CHASE // PRINTLN("INSIDE - ANGRY_PED_CHASE") IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() RESTART_TIMER_NOW(chaseTimer) IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) AND NOT IS_ENTITY_DEAD(myVehicle) IF IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex) TASK_FOLLOW_TO_OFFSET_OF_ENTITY(brokenVehicles[0].pedIndex, brokenVehicles[0].vehicleIndex, <<0,0,0>>, PEDMOVEBLENDRATIO_RUN, -1, 10.0) PRINTLN("TASK GUY TO CHASE SINCE THE VEHICLE IS STILL ATTACHED TO TOW TRUCK") ENDIF ENDIF PRINTLN("GOING TO STATE - ANGRY_PED_ENTER - 02") pedState = ANGRY_PED_ENTER ENDIF BREAK CASE ANGRY_PED_ENTER // PRINTLN("INSIDE STATE - ANGRY_PED_ENTER") UPDATE_PED_GIVE_UP(FALSE) IF NOT bAngryPedGaveUp // Adding this flag here to prevent the ped from giving up then getting a late task to re-enter //take into account the sex ped IF NOT IS_ENTITY_DEAD(myVehicle) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) IF NOT IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex) // IF TIMERB() > 5000 // // RESTART_TIMER_NOW(chaseTimer) // SET_VEHICLE_DOORS_LOCKED(brokenVehicles[0].vehicleIndex, VEHICLELOCK_UNLOCKED) // IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) // TASK_ENTER_VEHICLE(brokenVehicles[0].pedIndex, brokenVehicles[0].vehicleIndex, DEFAULT_TIME_BEFORE_WARP) // PRINTLN("GOING TO STATE - ANGRY_PED_DRIVE - 02") // ENDIF pedState = ANGRY_PED_DRIVE // ENDIF ELSE PRINTLN("GOING TO STATE - ANGRY_PED_DRIVE - 03") pedState = ANGRY_PED_DRIVE ENDIF ENDIF ENDIF BREAK CASE ANGRY_PED_DRIVE UPDATE_PED_GIVE_UP(FALSE) //TODO add a give up time or if you re-hook IF DOES_ENTITY_EXIST(brokenVehicles[0].pedIndex) IF IS_PED_IN_ANY_VEHICLE(brokenVehicles[0].pedIndex) AND (NOT IS_ENTITY_DEAD(myVehicle) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) AND NOT IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex)) IF bAttack angryPedRoot = "TOW_PED_ANTH" ENDIF PRINTLN("ANGRY PED IS IN HIS VEHICLE") bDriverGotCarBack = TRUE CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", angryPedRoot, CONV_PRIORITY_VERY_HIGH) bSupressObjective = FALSE TASK_VEHICLE_DRIVE_WANDER(brokenVehicles[0].pedIndex, brokenVehicles[0].vehicleIndex, 5.0, DRIVINGMODE_AVOIDCARS_OBEYLIGHTS) //TASK_VEHICLE_DRIVE_WANDER(brokenVehicles[0].pedIndex, brokenVehicles[0].vehicleInde, 5.0, DRIVINGMODE_AVOIDCARS_OBEYLIGHTS) pedState = ANGRY_PED_DONE RETURN TRUE ENDIF ENDIF BREAK CASE ANGRY_PED_DONE // PRINTLN("INSIDE STATE - ANGRY_PED_DONE") bInCombat = FALSE bSupressObjective = FALSE IF DOES_BLIP_EXIST(brokenVehicles[0].blipIndexPed) REMOVE_BLIP(brokenVehicles[0].blipIndexPed) ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC #ENDIF FUNC BOOL HANDLE_CREATE_STATE(STRING sObjective, STRING sHelp, INT& openIdx, BOOL bDynamic = FALSE, BOOL bWithPed = FALSE) DEBUG_MESSAGE("HANDLE_CREATE_STATE") fObjDist = GET_PLAYER_DISTANCE_FROM_LOCATION(getPointVec, FALSE) vCurDestObjective[0] = getPointVec //Moved actual prints to MISSION_STATE_PRINTS.. not ideal but needed to get cars spawning earlier. sMyObjective = sObjective sHelp = sHelp //sMyHelp = sHelp IF bDynamic IF CREATE_BROKEN_DOWN_VEHICLE(getPointVec, getPointHead, openIdx, FALSE) INIT_DAMAGE_TRACKING(brokenVehicles[0].vehicleIndex, iLastHealth, iInitialHealth) SET_FORCE_HD_VEHICLE(brokenVehicles[0].vehicleIndex, TRUE) SET_VEHICLE_TYRES_CAN_BURST(brokenVehicles[0].vehicleIndex, FALSE) SET_ENTITY_LOAD_COLLISION_FLAG(brokenVehicles[0].vehicleIndex, TRUE) SET_VEHICLE_HAS_STRONG_AXLES(brokenVehicles[0].vehicleIndex, TRUE) PRINTLN("HANDLE_CREATE_STATE - bDynamic IS TRUE") RETURN TRUE ENDIF ELSE IF CREATE_BROKEN_VEHICLE_ILLEGAL(bWithPed, FALSE) INIT_DAMAGE_TRACKING(brokenVehicles[0].vehicleIndex, iLastHealth, iInitialHealth) SET_FORCE_HD_VEHICLE(brokenVehicles[0].vehicleIndex, TRUE) SET_VEHICLE_TYRES_CAN_BURST(brokenVehicles[0].vehicleIndex, FALSE) SET_ENTITY_LOAD_COLLISION_FLAG(brokenVehicles[0].vehicleIndex, TRUE) SET_VEHICLE_HAS_STRONG_AXLES(brokenVehicles[0].vehicleIndex, TRUE) PRINTLN("HANDLE_CREATE_STATE - bDynamic IS FALSE") RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC PROC FIND_CLOSE_GARAGE() INT idx idx = FIND_CLOSEST_LOCATION_INDEX(vGarages, vCurDestObjective[0], 400) IF idx <> -1 vDest = vGarages[idx] GET_DATA_FROM_GARAGE_LOCATION(idx, myGarageData) ELSE SCRIPT_ASSERT("Couldn't find a garage defaulting to 0") vDest = vGarages[0] ENDIF ENDPROC PROC HANDLE_TIMER() IF NOT bStopTimer INT iTimer = ROUND((FAIL_TIME_TOTAL - GET_TIMER_IN_SECONDS_SAFE(failTimer)) * 1000.0) // PRINTLN("TIMER = ", iTimer) IF chosenNodeType = NODE_TYPE_DYNAMIC IF iTimer/1000 < 60 DRAW_GENERIC_TIMER(iTimer, "TOW_TIME", 0, TIMER_STYLE_DONTUSEMILLISECONDS, -1, PODIUMPOS_NONE, HUDORDER_DONTCARE, FALSE, HUD_COLOUR_RED) ELSE DRAW_GENERIC_TIMER(iTimer, "TOW_TIME") ENDIF ENDIF ENDIF ENDPROC PROC HANDLE_ADDITIONAL_HELP_PRINTS() INT iRand IF NOT IS_ENTITY_DEAD(myVehicle) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) AND IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex) OR ((g_savedGlobals.sTowingData.iTowingJobsCompleted = 0) OR g_savedGlobals.sTowingData.iTowingJobsCompleted > 2) // PRINTLN("EXITING EARLY") EXIT ENDIF SWITCH iAdditionalHelpPrintStages CASE 0 IF NOT IS_TIMER_STARTED(tAdditionalHelpPrintTimer) START_TIMER_NOW(tAdditionalHelpPrintTimer) PRINTLN("STARTING TIMER - tAdditionalHelpPrintTimer") iAdditionalHelpPrintStages = 1 ENDIF BREAK //------------------------------------------------------------------------- CASE 1 IF IS_TIMER_STARTED(tAdditionalHelpPrintTimer) IF GET_TIMER_IN_SECONDS(tAdditionalHelpPrintTimer) > 10 IF NOT IS_HELP_MESSAGE_ON_SCREEN() AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() iRand = GET_RANDOM_INT_IN_RANGE() % 2 IF iRand = 0 PRINT_HELP("TOW_TUT_04C") PRINTLN("PRINTING FIRST ADDITIONAL HELP MESSAGE - A") ELIF iRand = 1 PRINT_HELP("TOW_TUT_02") PRINTLN("PRINTING FIRST ADDITIONAL HELP MESSAGE - B") ELSE PRINT_HELP("TOW_TUT_04C") PRINTLN("PRINTING FIRST ADDITIONAL HELP MESSAGE - C") ENDIF RESTART_TIMER_NOW(tAdditionalHelpPrintTimer) iAdditionalHelpPrintStages = 2 ENDIF ENDIF ENDIF BREAK //------------------------------------------------------------------------- CASE 2 IF IS_TIMER_STARTED(tAdditionalHelpPrintTimer) IF GET_TIMER_IN_SECONDS(tAdditionalHelpPrintTimer) > 15 IF NOT IS_HELP_MESSAGE_ON_SCREEN() AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() PRINT_HELP("TOW_TUT_03") PRINTLN("PRINTING SECOND ADDITIONAL HELP MESSAGE") RESTART_TIMER_NOW(tAdditionalHelpPrintTimer) iAdditionalHelpPrintStages = 3 ENDIF ENDIF ENDIF BREAK //------------------------------------------------------------------------- CASE 3 IF IS_TIMER_STARTED(tAdditionalHelpPrintTimer) IF GET_TIMER_IN_SECONDS(tAdditionalHelpPrintTimer) > 15 IF NOT IS_HELP_MESSAGE_ON_SCREEN() AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() PRINT_HELP("TOW_TUT_01") PRINTLN("PRINTING THIRD ADDITIONAL HELP MESSAGE") iAdditionalHelpPrintStages = 4 ENDIF ENDIF ENDIF BREAK //------------------------------------------------------------------------- CASE 4 BREAK //------------------------------------------------------------------------- ENDSWITCH ENDPROC PROC SET_SCALEFORM_MIDSIZED_MESSAGE_WITH_THREE_NUMBERS_IN_STRAPLINE(SCRIPT_SHARD_BIG_MESSAGE & scaleformStruct, STRING labeToDisp, INT iNum, INT iNum2, INT iNum3, STRING strapLine, INT iDuration = 4000, HUD_COLOURS eHudColor = HUD_COLOUR_YELLOW) BEGIN_SCALEFORM_MOVIE_METHOD(scaleformStruct.siMovie, "SHOW_SHARD_MIDSIZED_MESSAGE") BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING") SET_COLOUR_OF_NEXT_TEXT_COMPONENT(eHudColor) ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(labeToDisp) END_TEXT_COMMAND_SCALEFORM_STRING() BEGIN_TEXT_COMMAND_SCALEFORM_STRING(strapline) ADD_TEXT_COMPONENT_INTEGER(iNum) ADD_TEXT_COMPONENT_INTEGER(iNum2) ADD_TEXT_COMPONENT_INTEGER(iNum3) END_TEXT_COMMAND_SCALEFORM_STRING() END_SCALEFORM_MOVIE_METHOD() // Restart our timer for updating. RESTART_TIMER_NOW(scaleformStruct.movieTimer) // Store the duration. scaleformStruct.iDuration = iDuration scaleformStruct.eEndFlash = HUD_COLOUR_WHITE ENDPROC //Core logic for the traditional towing modes of broken down and illegally parked FUNC BOOL UPDATE_TRADITIONAL() INT openIdx, iStatsTime STRING objective VECTOR vAngledA, vAngledB FLOAT fWidth SWITCH curStage CASE MISSION_STATE_INTRO DEBUG_MESSAGE("MISSION_STATE_INTRO") SET_RICH_PRESENCE_FOR_SP_MINIGAME(MINIGAME_TOWING) PRINTLN("SETTING RICH PRESENCE AT START") IF chosenNodeType = NODE_TYPE_DYNAMIC //we need to get starting data IF GET_POINT(getPointVec, getPointHead, vExtra, vExtra2) curStage = MISSION_STATE_CONVERSATION DEBUG_MESSAGE("Calling GET_POINT") ENDIF ELSE //we already have our data continue curStage = MISSION_STATE_CONVERSATION ENDIF BREAK CASE MISSION_STATE_CONVERSATION // DEBUG_MESSAGE("MISSION_STATE_CONVERSATION") IF NOT IS_MESSAGE_BEING_DISPLAYED() SWITCH chosenNodeType CASE NODE_TYPE_DYNAMIC ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 4, NULL, "TOWDISPATCH") IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_ACC_EXP2", CONV_PRIORITY_VERY_HIGH) PRINTLN("DYNAMIC: GOING TO STATE - MISSION_STATE_CREATE VIA MISSION_STATE_CONVERSATION") curStage = MISSION_STATE_CREATE ENDIF BREAK CASE NODE_TYPE_ABANDON ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 4, NULL, "TOWDISPATCH") IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_ABN_EXP2", CONV_PRIORITY_VERY_HIGH) PRINTLN("ABANDON: GOING TO STATE - MISSION_STATE_CREATE VIA MISSION_STATE_CONVERSATION") curStage = MISSION_STATE_CREATE ENDIF BREAK CASE NODE_TYPE_HANDI ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 4, NULL, "TOWDISPATCH") IF bSexVariation IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_HAN_EXP2", CONV_PRIORITY_VERY_HIGH) PRINTLN("HANDI-SEX: GOING TO STATE - MISSION_STATE_CREATE VIA MISSION_STATE_CONVERSATION") curStage = MISSION_STATE_CREATE ENDIF ELSE IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_HAN_EXP2", CONV_PRIORITY_VERY_HIGH) PRINTLN("HANDI-REG: GOING TO STATE - MISSION_STATE_CREATE VIA MISSION_STATE_CONVERSATION") curStage = MISSION_STATE_CREATE ENDIF ENDIF BREAK CASE NODE_TYPE_TRAIN ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 4, NULL, "TOWDISPATCH") IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_TRN_EXP2", CONV_PRIORITY_VERY_HIGH) PRINTLN("TRAIN: GOING TO STATE - MISSION_STATE_CREATE VIA MISSION_STATE_CONVERSATION") curStage = MISSION_STATE_CREATE ENDIF BREAK CASE NODE_TYPE_ACCIDENT ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 4, NULL, "TOWDISPATCH") IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_ACD_EXP2", CONV_PRIORITY_VERY_HIGH) PRINTLN("ACCIDENT: GOING TO STATE - MISSION_STATE_CREATE VIA MISSION_STATE_CONVERSATION") curStage = MISSION_STATE_CREATE ENDIF BREAK ENDSWITCH ENDIF BREAK CASE MISSION_STATE_CREATE DEBUG_MESSAGE("MISSION_STATE_CREATE") //SETUP_MINIGAME_INSTRUCTIONS(helpScaleform, TRUE, GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_FRONTEND_X),"TOW_CTRL_01", GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT),"TOW_CTRL_04", GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_FRONTEND_AXIS_Y),"TOW_CTRL_02") //GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_FRONTEND_RB),"TOW_CTRL_03", SWITCH chosenNodeType CASE NODE_TYPE_DYNAMIC DEBUG_MESSAGE("NODE_TYPE_DYNAMIC") IF HANDLE_CREATE_STATE("TOWT_OBJ_01", "TOWT_HELP_01", openIdx, TRUE) IF NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) SET_VEHICLE_DOORS_LOCKED(brokenVehicles[0].vehicleIndex, VEHICLELOCK_CANNOT_ENTER) ENDIF FIND_CLOSE_GARAGE() START_TIMER_NOW(failTimer) curStage = MISSION_STATE_PRINTS ENDIF BREAK CASE NODE_TYPE_ABANDON DEBUG_MESSAGE("NODE_TYPE_ABANDON") IF HANDLE_CREATE_STATE("TOWT_OBJ_AB", "TOWT_HELP_AB", openIdx, FALSE) vMin = <> vMax = <> SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(vMin, vMax, FALSE) bGenDisabled = TRUE SET_VEHICLE_UNDRIVEABLE(brokenVehicles[0].vehicleIndex, TRUE) PRINTLN("SETING VEHICLE AS UNDRIVEABLE - ABANDONDED") START_TIMER_NOW(failTimer) curStage = MISSION_STATE_PRINTS ENDIF BREAK CASE NODE_TYPE_HANDI DEBUG_MESSAGE("NODE_TYPE_HANDI") IF HANDLE_CREATE_STATE("TOWT_OBJ_01B", "TOWT_HELP_03", openIdx, FALSE) START_TIMER_NOW(failTimer) curStage = MISSION_STATE_PRINTS ENDIF BREAK CASE NODE_TYPE_TRAIN DEBUG_MESSAGE("NODE_TYPE_TRAIN") IF HANDLE_CREATE_STATE("TOWT_OBJ_TR", "TOWT_HELP_TR", openIdx, FALSE, TRUE) SET_VEHICLE_UNDRIVEABLE(brokenVehicles[0].vehicleIndex, TRUE) PRINTLN("SETING VEHICLE AS UNDRIVEABLE - TRAIN") FIND_CLOSE_GARAGE() SET_RANDOM_TRAINS(FALSE) SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_MAIN, FALSE) SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_QUARRY, FALSE) SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_CAR_STEAL_SETPIECE, FALSE) SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_METRO, FALSE) SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_FIRST_HOOD_SETPIECE, FALSE) SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_SECOND_HOOD_SETPIECE, FALSE) SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_SECOND_FAME_OR_SHAME_SETPIECE, FALSE) SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_DOWNTOWN_SETPIECE, FALSE) SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_THIRD_HOOD_SETPIECE, FALSE) SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_PROLOGUE, FALSE) SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_JEWEL_HEIST_SETPIECE, FALSE) SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_PROLOGUE_2, FALSE) CPRINTLN(DEBUG_MISSION, "DISABLING TRAINS") bTrainsDisabled = TRUE START_TIMER_NOW(failTimer) curStage = MISSION_STATE_PRINTS ENDIF BREAK CASE NODE_TYPE_ACCIDENT DEBUG_MESSAGE("NODE_TYPE_ACCIDENT") IF HANDLE_CREATE_STATE("TOWT_OBJ_CC", "TOWT_HELP_04", openIdx, FALSE, FALSE) SET_VEHICLE_UNDRIVEABLE(brokenVehicles[0].vehicleIndex, TRUE) PRINTLN("SETING VEHICLE AS UNDRIVEABLE - ACCIDENT") FIND_CLOSE_GARAGE() START_TIMER_NOW(failTimer) curStage = MISSION_STATE_PRINTS ENDIF BREAK DEFAULT DEBUG_MESSAGE("NO node type selected") BREAK ENDSWITCH IF NOT DOES_BLIP_EXIST(brokenVehicles[0].blipIndex) IF DOES_ENTITY_EXIST(brokenVehicles[0].vehicleIndex) brokenVehicles[0].blipIndex = ADD_BLIP_FOR_ENTITY(brokenVehicles[0].vehicleIndex) SET_BLIP_COLOUR(brokenVehicles[0].blipIndex, BLIP_COLOUR_BLUE) SET_BLIP_ROUTE(brokenVehicles[0].blipIndex, TRUE) PRINTLN("CREATING TOWING BLIP") ENDIF ENDIF BREAK CASE MISSION_STATE_PED // DEBUG_MESSAGE("MISSION_STATE_PED") HANDLE_TIMER() //TODO this should be pulled out IF UPDATE_BROKEN_VEHICLE_PED(brokenState, 0, "TOW_BREAK1") curStage = MISSION_STATE_TOWING ENDIF BREAK CASE MISSION_STATE_PRINTS // DEBUG_MESSAGE("MISSION_STATE_PRINTS") IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() //SETUP_MINIGAME_INSTRUCTIONS(helpScaleform, TRUE, GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_FRONTEND_X),"TOW_CTRL_01", GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT),"TOW_CTRL_04", GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_FRONTEND_AXIS_Y),"TOW_CTRL_02") //GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_FRONTEND_RB),"TOW_CTRL_03", PRINT_NOW(sMyObjective, DEFAULT_GOD_TEXT_TIME, 1) sLastObjective = sMyObjective //REGISTER_PRINT_DELAY(printTimer, sMyHelp) IF chosenNodeType = NODE_TYPE_DYNAMIC curStage = MISSION_STATE_PED ELSE curStage = MISSION_STATE_TOWING ENDIF ENDIF BREAK CASE MISSION_STATE_TOWING // DEBUG_MESSAGE("MISSION_STATE_TOWING") SWITCH chosenNodeType CASE NODE_TYPE_DYNAMIC CASE NODE_TYPE_TRAIN CASE NODE_TYPE_ACCIDENT objective = "TOWT_OBJ_04" BREAK CASE NODE_TYPE_ABANDON CASE NODE_TYPE_HANDI //if we havn't already set VDest IF IS_VECTOR_ZERO(vDest) vDest = vImpound[0] ENDIF GET_DATA_FROM_GARAGE_LOCATION(8, myGarageData) // because the impound is the last case //tow to impound objective = "TOWT_OBJ_06" BREAK ENDSWITCH IF chosenNodeType = NODE_TYPE_TRAIN AND NOT IS_PED_IN_VEHICLE(brokenVehicles[0].pedIndex, myVehicle) bSupressObjective = TRUE ENDIF HANDLE_ADDITIONAL_HELP_PRINTS() IF CHECK_TOW_ATTACHMENTS(objective, vDest) IF chosenNodeType = NODE_TYPE_TRAIN AND NOT IS_PED_IN_VEHICLE(brokenVehicles[0].pedIndex, myVehicle) bSupressObjective = FALSE bReverseOrder = TRUE IF DOES_ENTITY_EXIST(brokenVehicles[0].pedIndex) brokenVehicles[0].blipIndexPed = ADD_BLIP_FOR_ENTITY(brokenVehicles[0].pedIndex) SET_BLIP_COLOUR(brokenVehicles[0].blipIndexPed, BLIP_COLOUR_BLUE) SET_BLIP_SCALE(brokenVehicles[0].blipIndexPed, BLIP_SIZE_PED) ENDIF curStage = MISSION_STATE_PED ELSE curStage = MISSION_STATE_DROPOFF ENDIF ENDIF //Added support for pushing the vehicle in the proper spot IF IS_VEHICLE_IN_DROP_OFF_AREA(vAngledA, vAngledB, fWidth) //Rammed! bRammedVehicle = TRUE curStage = MISSION_STATE_DROPOFF ENDIF BREAK CASE MISSION_STATE_DROPOFF // PRINTLN("MISSION_STATE_DROPOFF") //todo this is a bit hacky..lets solve this better IF chosenNodeType = NODE_TYPE_DYNAMIC //broken down vehicle objective = "TOWT_OBJ_03a" ELSE objective = "TOWT_OBJ_03Ga" ENDIF IF CHECK_TOWING(objective) KILL_CHASE_HINT_CAM(localChaseHintCamStruct) SET_VEHICLE_AUTOMATICALLY_ATTACHES(brokenVehicles[0].vehicleIndex, FALSE) IF curBrokenCarCount = 0 bDisplayHelp = FALSE DEBUG_MESSAGE("curBrokenCarCount = 0") curStage = MISSION_STATE_ENDUI_SETUP ELSE PRINT_NOW("TOWT_OBJ_05", DEFAULT_GOD_TEXT_TIME, 1) sLastObjective = "TOWT_OBJ_05" curStage = MISSION_STATE_TOWING ENDIF ENDIF BREAK CASE MISSION_STATE_ENDUI_SETUP // PRINTLN("UPDATING MISSION_STATE_ENDUI_SETUP") // IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() HANDLE_TOW_SUCCESS() IF bUnlockDoors IF DOES_BLIP_EXIST(myVehicleBlip) REMOVE_BLIP(myVehicleBlip) PRINTLN("REMOVING BLIP - myVehicleBlip VIA bUnlockDoors") ELSE PRINTLN("BLIP DOESN'T EXIST") ENDIF ELSE PRINTLN("bUnlockDoors IS FALSE") ENDIF CLEAR_HELP() fTotalPayment += PAYMENT_NORMAL PRINTLN("BEFORE: fTotalPayment = ", fTotalPayment) // SET_ENDSCREEN_DATASET_HEADER(towingEndScreen, "TOW_PASS", "TOW_TITLE") IF fUnhookStartTime <> 0 AND NOT bRammedVehicle //no bonus if you rammed it in //Add a bonus for getting vehicle in the processing zone quickly IF bPostTonya IF GET_GAME_TIMER() - fUnhookStartTime < 12000 // ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(towingEndScreen, ESEF_RAW_INTEGER, "TOW_UI04B", "", 50, 0, ESCM_CHECKED) fTotalPayment += 50 PRINTLN("UNHOOK BONUS: fTotalPayment = ", fTotalPayment) ELSE // ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(towingEndScreen, ESEF_RAW_INTEGER, "TOW_UI04B", "", 0, 0, ESCM_NO_MARK) ENDIF PRINTLN("Unhook time: ", GET_GAME_TIMER() - fUnhookStartTime) ENDIF ENDIF IF NOT bPostTonya fTotalPayment = 0 PRINTLN("SINCE WE'RE DOING TONYA MISSIONS, NO PAYMENT GIVEN") ENDIF fMissionTime = GET_TIMER_IN_SECONDS(totalTimer) fMissionTime = (fMissionTime*1000) PRINTLN("MISSION TIME = ") iStatsTime = ROUND(fMissionTime) PRINTLN("iStatsTime = ", iStatsTime) // Stat Tracking PLAYSTATS_ODDJOB_DONE(iStatsTime, ENUM_TO_INT(MINIGAME_TOWING)) PRINTLN("CALLING PLAYSTATS_ODDJOB_DONE - MINIGAME_TOWING") // ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(towingEndScreen, ESEF_TIME_M_S, "TOW_UI03", "", FLOOR(fMissionTime), 0, ESCM_NO_MARK) IF chosenNodeType <> NODE_TYPE_ABANDON //Abandoned doesn't need these two // ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(towingEndScreen, ESEF_RAW_INTEGER, "TOW_UI04", "", ROUND(fTotalFine), 0, ESCM_NO_MARK) // ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(towingEndScreen, ESEF_RAW_INTEGER, "TOW_UI05", "", ROUND(fTotalPayment), 0, ESCM_NO_MARK) ENDIF IF bPostTonya fTotalPayment -= fTotalFine PRINTLN("AFTER: fTotalPayment = ", fTotalPayment) ELSE PRINTLN("WE'RE NOT POST TONYA") ENDIF //ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(towingEndScreen, ESEF_RAW_INTEGER, "TOW_UI06", "", ROUND(fTotalPayment), 0, ESCM_NO_MARK) iTotalPayment = ROUND(fTotalPayment) PRINTLN("iTotalPayment = ", iTotalPayment) // SET_SCALEFORM_BIG_MESSAGE_WITH_NUMBER_IN_STRAPLINE(endMessage, "TOW_UI07", ROUND(fTotalPayment), "TOW_UI08", 4000, HUD_COLOUR_WHITE, MG_BIG_MESSAGE_MIDSIZED) SET_SCALEFORM_MIDSIZED_MESSAGE_WITH_THREE_NUMBERS_IN_STRAPLINE(endMessage, "TOW_UI07", 500, ROUND(fTotalFine), ROUND(fTotalPayment), "TOW_UI08", 4000, HUD_COLOUR_WHITE) IF iTotalPayment > 0 //CREDIT_BANK_ACCOUNT(GET_CURRENT_PLAYER_PED_ENUM(), BAAC_UNLOGGED_SMALL_ACTION, iTotalPayment) PROPERTY_PAY_INCOME(PROPERTY_TOWING_IMPOUND, iTotalPayment) ENDIF MISSION_FLOW_PLAY_END_OF_MISSION_MUSIC(TRUE) curStage = MISSION_STATE_ENDUI_WAIT // ENDIF BREAK CASE MISSION_STATE_ENDUI_WAIT IF IS_HELP_MESSAGE_ON_SCREEN() CLEAR_HELP() ENDIF // IF ENDSCREEN_PREPARE(towingEndScreen) IF NOT UPDATE_SHARD_BIG_MESSAGE(endMessage) CLEAR_THIS_PRINT("TOW_TUT_04A") CLEAR_THIS_PRINT("TOWT_OBJ_03Ga") // PRINTLN("LAUNCH_MINIGAME_MISSION_TRACKER HAS RETURNED TRUE") // IF NOT IS_TIMER_STARTED(tEndingTimer) // START_TIMER_NOW(tEndingTimer) // PRINTLN("STARTING tEndingTimer") // ENDIF curStage = MISSION_STATE_COMPLETE ENDIF BREAK CASE MISSION_STATE_COMPLETE PRINTLN("TOWING SCRIPT IS DONE") RETURN TRUE //Hack.. menu doesn't seem to dispaly properly if we shut down // IF RENDER_ENDSCREEN(towingEndScreen, TRUE) // IF IS_TIMER_STARTED(tEndingTimer) // IF GET_TIMER_IN_SECONDS(tEndingTimer) > 1.5 // PRINTLN("TOWING SCRIPT IS DONE") // RETURN TRUE // ELSE // // PRINTLN("WAITING ON tEndingTimer") // ENDIF // ELSE // PRINTLN("tEndingTimer IS NOT STARTED") // ENDIF // ENDIF BREAK ENDSWITCH vImpound[0] = vImpound[0] RETURN FALSE ENDFUNC PROC TELEPORT_PLAYER(VECTOR myPos) WHILE NOT FADE_DOWN() WAIT(0) ENDWHILE LOAD_SCENE(myPos) IF DOES_ENTITY_EXIST(PLAYER_PED_ID()) AND DOES_ENTITY_EXIST(myVehicle) IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_ENTITY_DEAD(myVehicle) CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), myVehicle) ENDIF ENDIF WAIT(500) SET_GAMEPLAY_CAM_RELATIVE_HEADING() WHILE NOT FADE_UP() WAIT(0) ENDWHILE ENDPROC // initialise mission PROC INIT_MISSION(TOWING_LAUNCH_DATA& launchArgs) INT idx, numPedCohices SET_AGGRO_FIELDS_TO_NOT_CHECK() //INIT_ZVOLUME_WIDGETS() endMessage.siMovie = REQUEST_MG_MIDSIZED_MESSAGE() //only for ones with a ped IF launchArgs.nodeType = NODE_TYPE_DYNAMIC SpecialAnims[0] = "base" ADD_STREAMED_ANIM(streamReqsAnim, "amb@world_human_smoking@male@male_a@base") ADD_STREAMED_ANIM(streamReqsAnim, "oddjobs@towingcome_here") ADD_STREAMED_ANIM(streamReqsAnim, "move_m@JOG@") ELIF (launchArgs.nodeType = NODE_TYPE_HANDI OR launchArgs.nodeType = NODE_TYPE_ABANDON) AND NOT bDoTutorial ADD_STREAMED_ANIM(streamReqsAnim, "Ped") // ADD_STREAMED_ANIM(streamReqsAnim, "GESTURES@MALE") ADD_STREAMED_ANIM(streamReqsAnim, "oddjobs@towing") ADD_STREAMED_ANIM(streamReqsAnim, "oddjobs@towingangryidle_a") ADD_STREAMED_ANIM(streamReqsAnim, "oddjobs@towingpleadingidle_b") ADD_STREAMED_ANIM(streamReqsAnim, "oddjobs@towingpleadingidle_a") ADD_STREAMED_ANIM(streamReqsAnim, "move_m@JOG@") ELIF bDoTutorial ADD_STREAMED_ANIM(streamReqsAnim, "amb@world_human_smoking@male@male_a@base") ADD_STREAMED_ANIM(streamReqsAnim, "oddjobs@towing") ENDIF IF launchArgs.nodeType = NODE_TYPE_ABANDON // ADD_STREAMED_ANIM(streamReqsAnim, "GESTURES@MALE") ADD_STREAMED_ANIM(streamReqsAnim, "RANDOM@CAR_SLEEPING") ELIF launchArgs.nodeType = NODE_TYPE_ACCIDENT //We need to stream an ambulance SpecialAnimDict = "REACTION@MALE_STAND@BIG_VARIATIONS@A" ADD_STREAMED_ANIM(streamReqsAnim, SpecialAnimDict) ADD_STREAMED_MODEL(streamReqs, AMBULANCE) ADD_STREAMED_MODEL(streamReqs, S_M_M_PARAMEDIC_01) SpecialAnims[0] = "react_big_variations_a" SpecialAnims[1] = "react_big_variations_b" SpecialAnims[2] = "react_big_variations_c" ADD_STREAMED_ANIM(streamReqsAnim, "move_m@JOG@") ENDIF SET_VEHICLE_MODEL_IS_SUPPRESSED(TOWTRUCK, TRUE) IF launchArgs.nodeType = NODE_TYPE_TRAIN REQUEST_PTFX_ASSET() ADD_STREAMED_ANIM(streamReqsAnim, "oddjobs@towing") ADD_STREAMED_ANIM(streamReqsAnim, "amb@world_human_smoking@male@male_a@base") ADD_STREAMED_ANIM(streamReqsAnim, "oddjobs@towingpleadingidle_b") // ADD_STREAMED_ANIM(streamReqsAnim, "GESTURES@MALE") ADD_STREAMED_MODEL(streamReqs, FREIGHTCONT1) ADD_STREAMED_MODEL(streamReqs, TANKERCAR) ADD_STREAMED_MODEL(streamReqs, FREIGHT) ADD_STREAMED_MODEL(streamReqs, FREIGHTCAR) ADD_STREAMED_MODEL(streamReqs, S_M_M_LSMETRO_01) ADD_STREAMED_MODEL(streamReqs, A_F_M_BEVHILLS_01) ADD_STREAMED_MODEL(streamReqs, A_M_Y_GENSTREET_02) ENDIF IF launchArgs.nodeType = NODE_TYPE_ABANDON POPULATE_SHIT_CARS() ELIF launchArgs.nodeType = NODE_TYPE_ACCIDENT carNames[idx] = illegalNodes[illegalIdx].mnSpecificCar ELSE POPULATE_CARS() ENDIF REPEAT MAX_NUM_CAR_NAMES idx IF carNames[idx] = DUMMY_MODEL_FOR_SCRIPT carNames[idx] = GET_UNUSED_RANDOM_MODEL(carNames, gbCarList, MAX_NUM_CAR_CHOICES) REQUEST_VEHICLE_ASSET(carNames[idx]) ENDIF IF bSexVariation carNames[idx] = LANDSTALKER ADD_STREAMED_MODEL(streamReqs, carNames[idx]) REQUEST_VEHICLE_ASSET(carNames[idx]) ELIF carNames[idx] <> DUMMY_MODEL_FOR_SCRIPT ADD_STREAMED_MODEL(streamReqs, carNames[idx]) REQUEST_VEHICLE_ASSET(carNames[idx]) ELSE SCRIPT_ASSERT("Invalid car model...") ENDIF ENDREPEAT //We don't always need a ped! IF NOT bDoTutorial AND bStreamPeds //Use this instead IF bSexVariation POPULATE_ACTORS_SEXY_MEN(numPedCohices) mnExtraModel = A_M_M_TranVest_01 #IF FEATURE_GEN9_RELEASE mnExtraModel = A_M_Y_Hipster_01 #ENDIF ADD_STREAMED_MODEL(streamReqs, mnExtraModel) PRINTLN("POPULATING ACTORS FOR bSexVariation") ELIF bHomelessVariation POPULATE_ACTORS_HOMELESS(numPedCohices) PRINTLN("POPULATING ACTORS FOR bHomelessVariation") ELIF launchArgs.nodeType = NODE_TYPE_DYNAMIC POPULATE_ACTORS(numPedCohices, TRUE) PRINTLN("POPULATING ACTORS FOR NODE_TYPE_DYNAMIC") ELIF (launchArgs.nodeType = NODE_TYPE_HANDI AND NOT bSexVariation) POPULATE_ACTORS(numPedCohices, TRUE) PRINTLN("POPULATING ACTORS FOR ATTACK - MALE ONLY") ELSE POPULATE_ACTORS(numPedCohices) PRINTLN("POPULATING ACTORS FOR DEFAULT") ENDIF REPEAT MAX_NUM_PED_NAMES idx pedNames[idx] = GET_UNUSED_RANDOM_MODEL(pedNames, gbPedList, numPedCohices) IF pedNames[idx] <> DUMMY_MODEL_FOR_SCRIPT ADD_STREAMED_MODEL(streamReqs, pedNames[idx]) ELSE SCRIPT_ASSERT("Invalid ped model...") ENDIF ENDREPEAT ENDIF ADD_STREAMED_MODEL(streamReqs, missionCarName) LOAD_QUEUE_LARGE_ADD_ADDITIONAL_TEXT(sLoadQueue, "TOW", ODDJOB_TEXT_SLOT) // load text for the mission LOAD_QUEUE_LARGE_ADD_ADDITIONAL_TEXT(sLoadQueue, "DTRSHRD", MINIGAME_TEXT_SLOT) // load text for the mission //6 REQUEST_ALL_MODELS(streamReqs) REQUEST_ALL_ANIMS(streamReqsAnim, sLoadQueue) WHILE NOT HAS_SCALEFORM_MOVIE_LOADED(endMessage.siMovie) DEBUG_MESSAGE("Waiting on scaleform movie to load") UPDATE_LOAD_QUEUE_LARGE(sLoadQueue) WAIT(0) ENDWHILE WHILE NOT ARE_MODELS_STREAMED(streamReqs) OR NOT HAS_VEHICLE_ASSET_LOADED(carNames[0]) DEBUG_MESSAGE("Waiting for models to stream") UPDATE_LOAD_QUEUE_LARGE(sLoadQueue) WAIT(0) ENDWHILE WHILE NOT ARE_ANIMS_STREAMED(sLoadQueue) DEBUG_MESSAGE("waiting for anims") UPDATE_LOAD_QUEUE_LARGE(sLoadQueue) WAIT(0) ENDWHILE IF launchArgs.nodeType = NODE_TYPE_TRAIN WHILE NOT REQUEST_SCRIPT_AUDIO_BANK("SCRIPT\\TOWING_TRAIN") OR NOT HAS_PTFX_ASSET_LOADED() DEBUG_MESSAGE("waiting for audio / effects") UPDATE_LOAD_QUEUE_LARGE(sLoadQueue) WAIT(0) ENDWHILE ENDIF WHILE NOT HAS_ADDITIONAL_TEXT_LOADED(ODDJOB_TEXT_SLOT) OR NOT HAS_ADDITIONAL_TEXT_LOADED(MINIGAME_TEXT_SLOT) DEBUG_MESSAGE("trying to load string table") UPDATE_LOAD_QUEUE_LARGE(sLoadQueue) WAIT(0) ENDWHILE ENDPROC FUNC BOOL UPDATE_DIST_FAIL_CONDITIONS() BOOL bGarage = FALSE BOOL bCar = FALSE STRING sLine IF chosenNodeType = NODE_TYPE_DYNAMIC //only breakdown currently goes to a garage bGarage = TRUE ENDIF IF curStage < MISSION_STATE_DROPOFF //still going to car bCar = TRUE ENDIF IF bCar sLine = "TOW_DISP_CAR" ELSE IF bGarage sLine = "TOW_DISP_GAR" ELSE sLine = "TOW_DISP_IMP" ENDIF ENDIF //Abandon check IF NOT IS_VECTOR_ZERO(vCurDestObjective[0]) IF NOT bDistWarned IF GET_PLAYER_DISTANCE_FROM_LOCATION(vCurDestObjective[0], FALSE) > (fObjDist + WARN_DISTANCE) CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", sLine, CONV_PRIORITY_VERY_HIGH) bDistWarned = TRUE ENDIF ENDIF IF GET_PLAYER_DISTANCE_FROM_LOCATION(vCurDestObjective[0], FALSE) > (fObjDist + FAIL_DISTANCE) PRINTLN("Pringing abandon job because distance to cur objective is bigger than fObjDist + Fail") failReason = FAIL_ABANDONED_JOB RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL UPDATE_TIME_FAIL_CONDITIONS() //DEBUG_MESSAGE("UPDATE_TIME_FAIL_CONDITIONS") IF NOT bTimeWarned IF TIMER_DO_WHEN_READY(failTimer, WARN_TIME_TOTAL) bTimeWarned = TRUE CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_DISP3", CONV_PRIORITY_VERY_HIGH) //Do dialouge here to warn the player ENDIF ENDIF //PRINTLN("Fail timer",GET_TIMER_IN_SECONDS(failTimer)) IF TIMER_DO_WHEN_READY(failTimer, FAIL_TIME_TOTAL) IF chosenNodeType <> NODE_TYPE_ABANDON failReason = FAIL_TIME_EXPIRED_TOTAL RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL UPDATE_FAIL_CONDITIONS(TOWING_LAUNCH_DATA launchArgs) VECTOR vPlayerPosition, vTowTruckPosition IF bDriverGotCarBack PRINTLN("FAIL - FAIL_DRIVE_GOT_CAR_BACK") failReason = FAIL_DRIVER_GOT_CAR_BACK RETURN TRUE ENDIF IF IS_PLAYER_IN_ANY_SHOP() PRINTLN("PLAYER HAS ABANDONED TOWING JOB BY GOING INTO ANY SHOP") failReason = FAIL_ABANDONED_JOB RETURN TRUE ENDIF IF DOES_ENTITY_EXIST(brokenVehicles[0].vehicleIndex) IF NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) IF IS_VEHICLE_STUCK_TIMER_UP(brokenVehicles[0].vehicleIndex, VEH_STUCK_ON_ROOF, ROOF_TIME) DEBUG_MESSAGE("FAIL_DAMAGE - UPSIDEDOWN") failReason = FAIL_DAMAGE RETURN TRUE ENDIF ENDIF ENDIF IF bOutOfVehicle //if the player has been out of the vehicle for more than 5 seconds fail him IF (GET_GAME_TIMER() - outOfVehicleTime) > FAIL_TIME IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID()) ENDIF IF DOES_ENTITY_EXIST(myVehicle) AND NOT IS_ENTITY_DEAD(myVehicle) vTowTruckPosition = GET_ENTITY_COORDS(myVehicle) ENDIF IF VDIST2(vPlayerPosition, vTowTruckPosition) > 25*25 DEBUG_MESSAGE("FAIL_ABANDONED_CAR") failReason = FAIL_ABANDONED_CAR RETURN TRUE ENDIF ENDIF ENDIF IF bAggroedTonya failReason = FAIL_ATTACKED_TONYA PRINTLN("failReason = FAIL_ATTACKED_TONYA") RETURN TRUE ENDIF IF bAbandonedTonya failReason = FAIL_ABANDONED_TONYA PRINTLN("failReason = FAIL_ABANDONED_TONYA") RETURN TRUE ENDIF IF DOES_ENTITY_EXIST(myVehicle) IF NOT IS_VEHICLE_DRIVEABLE(myVehicle) //AND bDrugsLoaded DEBUG_MESSAGE("myVehicle isn't driveable") failReason = FAIL_TRANSPORT_DESTROYED RETURN TRUE ENDIF ELSE PRINTLN("myVehicle DOESN'T EXIST") ENDIF IF DOES_ENTITY_EXIST(myVehicle) IF IS_ENTITY_DEAD(myVehicle) //AND bDrugsLoaded//IS_VEHICLE_DRIVEABLE(myVehicle) DEBUG_MESSAGE("myVehicle is dead") failReason = FAIL_TRANSPORT_DESTROYED RETURN TRUE ENDIF ENDIF SWITCH launchArgs.launchMode CASE TOWING_MODE_TRADITIONAL IF curStage > MISSION_STATE_CREATE AND curStage < MISSION_STATE_COMPLETE IF DOES_ENTITY_EXIST(brokenVehicles[0].vehicleIndex) IF IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) DEBUG_MESSAGE("brokenVehicles[0].vehicleIndex is dead") failReason = FAIL_TOW_DESTROYED RETURN TRUE ELSE IF UPDATE_DIST_FAIL_CONDITIONS() DEBUG_MESSAGE("UPDATE_DIST_FAIL_CONDITIONS") RETURN TRUE ENDIF ENDIF ENDIF ENDIF IF UPDATE_TIME_FAIL_CONDITIONS() RETURN TRUE ENDIF SWITCH chosenNodeType CASE NODE_TYPE_DYNAMIC CASE NODE_TYPE_TRAIN CASE NODE_TYPE_HANDI //CASE NODE_TYPE_ABANDON IF bPedCreated IF NOT bAttack // PRINTLN("bAttack = FALSE") IF DOES_ENTITY_EXIST(brokenVehicles[0].pedIndex) IF IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) failReason = FAIL_PED_KILLED RETURN TRUE ENDIF ENDIF ELSE PRINTLN("bAttack = TRUE") ENDIF IF bSexVariation IF DOES_ENTITY_EXIST(brokenVehicles[0].pedIndexPass) IF IS_ENTITY_DEAD(brokenVehicles[0].pedIndexPass) PRINTLN("failReason = FAIL_PED_KILLED_PASSENGER") failReason = FAIL_PED_KILLED_PASSENGER RETURN TRUE ENDIF ENDIF ENDIF ENDIF BREAK ENDSWITCH BREAK ENDSWITCH IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0 DEBUG_MESSAGE("wanted") failReason = FAIL_WANTED RETURN TRUE ENDIF IF NOT DOES_VEHICLE_HAVE_STUCK_VEHICLE_CHECK(myVehicle) ADD_VEHICLE_UPSIDEDOWN_CHECK(myVehicle) PRINTLN("ADD_VEHICLE_UPSIDEDOWN_CHECK for myVehicle") ELIF IS_VEHICLE_STUCK_ON_ROOF(myVehicle) failReason = FAIL_VEHICLE_DISABLED RETURN TRUE ENDIF RETURN FALSE ENDFUNC PROC MISSION_SKIP() PRINTLN("INSIDE - MISSION_SKIP") IF curStage < MISSION_STATE_ENDUI_SETUP curStage = MISSION_STATE_ENDUI_SETUP PRINTLN("S-SKIP: GOING TO STATE MISSION_STATE_ENDUI_SETUP") ELSE PRINTLN("curStage > MISSION_STATE_ENDUI_SETUP") ENDIF ENDPROC PROC MISSION_PASSED() CLEAR_BITMASK_AS_ENUM(sLauncherData.iLauncherFlags, LAUNCHED_SCRIPT_TowingFailed) SET_BITMASK_AS_ENUM(g_savedGlobals.sTowingData.iBools, TOW_GLOBAL_60_DELAY) ODDJOB_AUTO_SAVE() MISSION_CLEANUP() ENDPROC PROC HANLDE_PLACING_PLAYER_AND_TONYA_INTO_TOWTRUCK_AND_MOVING() IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_ENTITY_DEAD(myVehicle) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), myVehicle) PRINTLN("SETTING THE PLAYER INTO THE TRUCK") ENDIF IF DOES_ENTITY_EXIST(pedTonya) AND NOT IS_ENTITY_DEAD(pedTonya) AND NOT IS_ENTITY_DEAD(myVehicle) SET_PED_INTO_VEHICLE(pedTonya, myVehicle, VS_FRONT_RIGHT) PRINTLN("SETTING TONYA INTO THE TRUCK") ENDIF SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), <<408.8376, -1638.9524, 28.2928>>) SET_ENTITY_HEADING(myVehicle, 230.2387) ENDPROC // debug builds only #IF IS_DEBUG_BUILD // debug skips PROC DO_DEBUG_SKIPS() VECTOR vTemp // mission pass S IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S) PRINTLN("HIT - S KEY") IF NOT bSkipTutorial bSkipTutorial = TRUE PRINTLN("bSkipTutorial = TRUE") ENDIF MISSION_SKIP() ENDIF // mission failed F IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F) failReason = FAIL_TRANSPORT_DESTROYED MISSION_FAILED() ENDIF // skip stage J IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J) IF bDebugInTutorial OR bRunningTwoOrFive IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) KILL_ANY_CONVERSATION() CLEAR_PRINTS() CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) PRINTLN("CLEARING PLAYER'S TASKS") IF bDoTutorial OR bRunningTwoOrFive IF DOES_ENTITY_EXIST(pedTonya) AND NOT IS_ENTITY_DEAD(pedTonya) IF IS_PED_IN_ANY_VEHICLE(pedTonya) CLEAR_PED_TASKS_IMMEDIATELY(pedTonya) PRINTLN("CLEARING TONYA'S TASKS") ENDIF ENDIF ENDIF IF NOT DOES_ENTITY_EXIST(myVehicle) myVehicle = CREATE_VEHICLE(missionCarName, <<408.8376, -1638.9524, 28.2928>>, 230.2387) PRINTLN("CREATING TUTORIAL TRUCK") HANLDE_PLACING_PLAYER_AND_TONYA_INTO_TOWTRUCK_AND_MOVING() PRINTLN("CREATED TRUCK: WE'RE IN A VEHICLE - MOVE PLAYER AND TONYA") ELSE HANLDE_PLACING_PLAYER_AND_TONYA_INTO_TOWTRUCK_AND_MOVING() PRINTLN("WE'RE IN A VEHICLE - MOVE PLAYER AND TONYA") ENDIF ELSE HANLDE_PLACING_PLAYER_AND_TONYA_INTO_TOWTRUCK_AND_MOVING() PRINTLN("WE'RE NOT IN A VEHICLE - MOVE PLAYER AND TONYA") ENDIF ENDIF ELSE vTemp = vCurDestObjective[0] IF NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) AND NOT bTowHooked vTemp = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(brokenVehicles[0].vehicleIndex, <<0,-9.0,0>>) ENDIF IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) //offset SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), vTemp) ENDIF // skip forward a stage ENDIF ENDIF // previous stage P IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P) // skip back a stage ENDIF ENDPROC #ENDIF PROC HANDLE_CINEMATIC_CAM() //SET_CINEMATIC_BUTTON_ACTIVE(FALSE) VECTOR vPlayerPos, vBrokenDownPos FLOAT fDeltaZ IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) ENDIF IF NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) vBrokenDownPos = GET_ENTITY_COORDS(brokenVehicles[0].vehicleIndex) ENDIF fDeltaZ = (vPlayerPos.z - vBrokenDownPos.z) // PRINTLN("fDeltaZ = ", fDeltaZ) IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_ENTITY_DEAD(myVehicle) IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), myVehicle) EXIT ENDIF ENDIF IF fDeltaZ > 5 EXIT ENDIF IF DOES_ENTITY_EXIST(brokenVehicles[0].vehicleIndex) IF bPrintHintCam AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) IF chosenNodeType = NODE_TYPE_TRAIN IF trainState > TRAIN_STATE_PRINT AND trainState < TRAIN_STATE_DONE PRINT_HELP("TOW_HELP_CIN") bPrintHintCam = FALSE ENDIF ELSE IF NOT bTowHooked AND GET_PLAYER_DISTANCE_FROM_ENTITY(brokenVehicles[0].vehicleIndex) < 75 PRINT_HELP("TOW_HELP_CIN") bPrintHintCam = FALSE ENDIF ENDIF ENDIF ENDIF IF DOES_CAM_EXIST(towArgs.towCam) AND NOT VALIDATE_HINT_CAM() KILL_CHASE_HINT_CAM(localChaseHintCamStruct) CLEANUP_CAM(towArgs) ENDIF bDisableCin = TRUE IF SHOULD_CONTROL_CHASE_HINT_CAM(localChaseHintCamStruct) IF NOT DOES_CAM_EXIST(towArgs.towCam) SWITCH chosenNodeType CASE NODE_TYPE_TRAIN IF trainState > TRAIN_STATE_PRINT AND trainState < TRAIN_STATE_DONE AND NOT bDisableCam SETUP_TRAIN_CAM(towArgs, brokenVehicles[0].pedIndex, brokenVehicles[0].blockingIndex, iToggle, bDisablePedCam) ELSE //bEnableBonusCam = FALSE SET_CINEMATIC_BUTTON_ACTIVE(TRUE) ENDIF BREAK DEFAULT IF VALIDATE_HINT_CAM() AND GET_PLAYER_DISTANCE_FROM_ENTITY(brokenVehicles[0].vehicleIndex) < 100 //speical case IF chosenNodeType = NODE_TYPE_HANDI IF bSexVariation SETUP_SPECIAL_CAM(towArgs, brokenVehicles[0].vehicleIndex, iToggle) ENDIF ELSE SETUP_SPECIAL_CAM(towArgs, brokenVehicles[0].vehicleIndex, iToggle) ENDIF ELSE //bEnableBonusCam = FALSE SET_CINEMATIC_BUTTON_ACTIVE(TRUE) ENDIF BREAK ENDSWITCH ENDIF ELSE IF DOES_CAM_EXIST(towArgs.towCam) CLEANUP_CAM(towArgs) ENDIF ENDIF ENDPROC #IF IS_DEBUG_BUILD INT idx PROC PRINT_DEBUG_INFO() REPEAT MAX_NUM_ILLEGAL_NODES idx IF illegalNodes[idx].myType = NODE_TYPE_TRAIN PRINTLN("Towing Node: ", idx, " Train distance: ", VDIST(illegalNodes[idx].vCarPos, illegalNodes[idx].vPedPos)) ENDIF ENDREPEAT ENDPROC #ENDIF PROC INIT_CHARACTER_NAME() //TODO.. factor in maile or female SWITCH chosenNodeType CASE NODE_TYPE_ABANDON IF g_savedGlobals.sTowingData.iAbandonCompleted% 2 = 0 sCharacterName = "TOWABDBITCHM"//, TOWABDBITCHM ELSE sCharacterName = "TOWABDATTACKM"//, TOWABDNATTACKF, ENDIF BREAK CASE NODE_TYPE_ACCIDENT //No peds in accident variation BREAK CASE NODE_TYPE_DYNAMIC sCharacterName = "TOWBREAKM"//, TOWBREAKF BREAK CASE NODE_TYPE_HANDI IF bSexVariation //This is handeled in the handi setup.. //TOWSEXMANLYGUY //TOWSEXPRISSYGUY ELSE sCharacterName = "TOWHANDIBEGM" //, TOWHANDIBEGF ENDIF BREAK CASE NODE_TYPE_TRAIN sCharacterName = "TOWTRAINM" //, TOWTRAINF BREAK ENDSWITCH ENDPROC FUNC BOOL HAS_PLAYER_ABANDONED_TONYA() VECTOR vPlayerPostion, vTonyaPosition IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) vPlayerPostion = GET_ENTITY_COORDS(PLAYER_PED_ID()) ENDIF IF DOES_ENTITY_EXIST(pedTonya) AND NOT IS_ENTITY_DEAD(pedTonya) vTonyaPosition = GET_ENTITY_COORDS(pedTonya) ENDIF IF VDIST2(vPlayerPostion, vTonyaPosition) > 50*50 IF NOT bTonyaAbandonWarning PRINT("TOW_TUT_RETONYA", DEFAULT_GOD_TEXT_TIME, 1) bTonyaAbandonWarning = TRUE PRINTLN("GIVING PLAYER WARNING ON ABANDONING TONYA") IF NOT DOES_BLIP_EXIST(blipTonya) IF NOT IS_ENTITY_DEAD(pedTonya) blipTonya = ADD_BLIP_FOR_ENTITY(pedTonya) SET_BLIP_COLOUR(blipTonya, BLIP_COLOUR_BLUE) SET_BLIP_SCALE(blipTonya, 0.5) PRINTLN("ADDING BLIP - blipTonya") ENDIF ENDIF IF DOES_BLIP_EXIST(brokenVehicles[0].blipIndex) REMOVE_BLIP(brokenVehicles[0].blipIndex) PRINTLN("REMOVING BLIP - brokenVehicles[0].blipIndex") ENDIF ENDIF ELSE IF bTonyaAbandonWarning bTonyaAbandonWarning = FALSE PRINTLN("SETTING - bTonyaAbandonWarning = FALSE") IF DOES_BLIP_EXIST(blipTonya) REMOVE_BLIP(blipTonya) PRINTLN("REMOVING BLIP - blipTonya") ENDIF IF NOT DOES_BLIP_EXIST(brokenVehicles[0].blipIndex) brokenVehicles[0].blipIndex = ADD_BLIP_FOR_COORD(vCurDestObjective[0]) IF bTowHooked SET_BLIP_COLOUR(brokenVehicles[0].blipIndex, BLIP_COLOUR_YELLOW) SET_BLIP_ROUTE(brokenVehicles[0].blipIndex, TRUE) SET_BLIP_ROUTE_COLOUR(brokenVehicles[0].blipIndex, BLIP_COLOUR_YELLOW) ELSE SET_BLIP_COLOUR(brokenVehicles[0].blipIndex, BLIP_COLOUR_BLUE) SET_BLIP_ROUTE(brokenVehicles[0].blipIndex, TRUE) SET_BLIP_ROUTE_COLOUR(brokenVehicles[0].blipIndex, BLIP_COLOUR_BLUE) ENDIF PRINTLN("ADDING BLIP - brokenVehicles[0].blipIndex INSIDE ABANDON TONYA CHECK") ENDIF ENDIF ENDIF IF VDIST2(vPlayerPostion, vTonyaPosition) > 150*150 IF bTonyaAbandonWarning PRINTLN("RETURNING TRUE - HAS_PLAYER_ABANDONED_TONYA") RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC PROC HANDLE_REPLAY_VEHICLE(VECTOR vVehiclePos, FLOAT fVehHeading) IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE() PRINTLN("REPLAY VEHICLE IS AVAILABLE - TOWING") bReplayVehicleAvailable = TRUE ELSE PRINTLN("REPLAY VEHICLE IS NOT AVAILABLE - TOWING") ENDIF IF bReplayVehicleAvailable REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL() WHILE NOT HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED() PRINTLN("TOWING: Waiting for HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED") WAIT(0) ENDWHILE ENDIF IF bReplayVehicleAvailable //create the replay vehicle but make sure it isnt a water based vehicle (so we dont spawn it on land) VEHICLE_INDEX vehPlayer vehPlayer = CREATE_REPLAY_CHECKPOINT_VEHICLE(vVehiclePos, fVehHeading) IF NOT IS_THIS_MODEL_A_BOAT(GET_ENTITY_MODEL(vehPlayer)) AND NOT IS_THIS_MODEL_A_PLANE(GET_ENTITY_MODEL(vehPlayer)) AND NOT IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(vehPlayer)) SET_VEHICLE_ON_GROUND_PROPERLY(vehPlayer) ELSE DELETE_VEHICLE(vehPlayer) ENDIF ENDIF ENDPROC PROC CHECK_FOR_RIGHT_CHARACTER() enumCharacterList ePlayer ePlayer = GET_CURRENT_PLAYER_PED_ENUM() IF (ePlayer != CHAR_FRANKLIN) PRINTLN("WE'RE NOT FRANKLIN, CLEANING UP") MISSION_CLEANUP() ENDIF ENDPROC // main script SCRIPT(TOWING_LAUNCH_DATA launchArgs) DEBUG_MESSAGE("Towing Start") SET_MISSION_FLAG(TRUE) IF HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS|FORCE_CLEANUP_FLAG_REPEAT_PLAY) IF NOT IS_REPLAY_BEING_PROCESSED() SET_BITMASK_AS_ENUM(sLauncherData.iLauncherFlags, LAUNCHED_SCRIPT_TowingFailed) Setup_Minigame_Replay(GET_THIS_SCRIPT_NAME()) ENDIF DEBUG_MESSAGE("FORCE CLEANUP HAS OCCURRED!!!") MISSION_FAILED() ENDIF IF DOES_ENTITY_EXIST(launchArgs.tutorialPed) AND DOES_ENTITY_EXIST(launchArgs.tutorialTruck) IF NOT IS_ENTITY_DEAD(launchArgs.tutorialPed) AND NOT IS_ENTITY_DEAD(launchArgs.tutorialTruck) SET_ENTITY_AS_MISSION_ENTITY(launchArgs.tutorialPed, TRUE, TRUE) SET_ENTITY_AS_MISSION_ENTITY(launchArgs.tutorialTruck, TRUE, TRUE) ENDIF ENDIF IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, FALSE) ENDIF POPULATE_ILLEGAL_NODES(illegalNodes) POPULATE_EXTRA_DATA(extraData) POPULATE_LOCATIONS() INT selectedNode = 0 #IF IS_DEBUG_BUILD myDebugData.iNode = -1 AddWidgets(myDebugData) #ENDIF #IF IS_DEBUG_BUILD PRINT_DEBUG_INFO() IF launchArgs.bSpecifyNode IF IS_SCREEN_FADED_OUT() CLEAR_AREA(<<408.8376, -1638.9524, 28.2928>>, 8.0, TRUE) DO_SCREEN_FADE_IN(500) ENDIF WHILE NOT myDebugData.bNodeSelected WAIT(0) // PRINTLN("WAITING ON SPECIFIC NODE") ENDWHILE PRINTLN("INSIDE HERE") //so we've selected a node selectedNode = myDebugData.iNode launchArgs.nodeType = illegalNodes[myDebugData.iNode].myType launchArgs.launchMode = TOWING_MODE_TRADITIONAL ENDIF #ENDIF START_TIMER_NOW(totalTimer) SWITCH launchArgs.launchMode CASE TOWING_MODE_TRADITIONAL IF launchArgs.bDebug // AND NOT IS_BITMASK_AS_ENUM_SET(g_savedGlobals.sTowingData.iBools, TOW_GLOBAL_SWITCH) DEBUG_MESSAGE("launchArgs.bDebug is TRUE") chosenNodeType = launchArgs.nodeType IF selectedNode > 0 illegalIdx = selectedNode ELSE illegalIdx = FIND_VALID_NODE(100000, chosenNodeType, g_savedGlobals.sTowingData.iLastNodeIndex) ENDIF //illegalIdx = 49 //for now not tutorial unless launched in flow //IF g_savedGlobals.sTowingData.iTowingJobsCompleted = 0 //bDoTutorial = TRUE //ENDIF // IF NOT IS_BITMASK_AS_ENUM_SET(g_savedGlobals.sTowingData.iBools, TOW_GLOBAL_SWITCH) // SET_BITMASK_AS_ENUM(g_savedGlobals.sTowingData.iBools, TOW_GLOBAL_SWITCH) // PRINTLN("SWITCHING FROM DEBUG") // ENDIF DEBUG_MESSAGE("This is a debug run of Towing.. selecting specific node type") //This is a debug launch.. need to warp the player and do a manual setup ELSE DEBUG_MESSAGE("launchArgs.bDebug is FALSE") IF g_savedGlobals.sTowingData.iTowingJobsCompleted = 0 // bEnableBonusCam = FALSE bDoTutorial = TRUE ENDIF IF NOT IS_REPLAY_IN_PROGRESS() SELECTION_LOGIC() PRINTLN("NO REPLAY, CHOSEN INDEX = ", illegalIdx) ELSE illegalIdx = g_savedGlobals.sTowingData.iLastNodeIndex PRINTLN("REPLAY, CHOSEN INDEX = ", illegalIdx) chosenNodeType = g_savedGlobals.sTowingData.lastNodeType PRINTLN("REPLAY, CHOSEN NODE TYPE = ", chosenNodeType) ENDIF launchArgs.nodeType = chosenNodeType //TODO.. this is problematic.. two variables for the same thing.. some confusion here ENDIF DEBUG_MESSAGE("TOWING_TRADITIONAL") towVariation = VARIATION_TRADIITONAL BREAK ENDSWITCH //If it's the first time we actually have the dispatch guy there. Otherwise he's NULL IF NOT bDoTutorial ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 3, NULL, "TOWDISPATCH") //ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 0, PLAYER_PED_ID(), "FRANKLIN") ENDIF //this should be in seleciton logic bHomelessVariation IF chosenNodeType = NODE_TYPE_HANDI bStreamPeds = TRUE IF g_savedGlobals.sTowingData.iHandiCompleted% 2 = 0 bSexVariation = TRUE PRINTLN("bSexVariation = TRUE") ENDIF ELIF chosenNodeType = NODE_TYPE_ABANDON bHomelessVariation = TRUE bStreamPeds = TRUE PRINTLN("bHomelessVariation = TRUE") ENDIF //Broken down type requires a ped IF chosenNodeType = NODE_TYPE_DYNAMIC OR chosenNodeType = NODE_TYPE_TRAIN bRequiresPed = TRUE bStreamPeds = TRUE iNumPeds = 1 PRINTLN("bRequiresPed = TRUE") ELIF chosenNodeType = NODE_TYPE_ACCIDENT bStreamPeds = TRUE iNumPeds = extraData[GET_IDX()].numBystanders ENDIF INIT_CHARACTER_NAME() INIT_MISSION(launchArgs) IF g_savedGlobals.sTowingData.iTowingJobsCompleted >= 5 bPostTonya = TRUE PRINTLN("bPostTonya = TRUE") bPostTonya = bPostTonya ENDIF IF DOES_ENTITY_EXIST(PLAYER_PED_ID()) IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) myVehicle = launchArgs.tutorialTruck//GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) PRINTLN("PLAYER IS IN A TOW TRUCK ALREADY - 01") VEHICLE_INDEX vehTemp vehTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) IF DOES_ENTITY_EXIST(vehTemp) AND NOT IS_ENTITY_DEAD(vehTemp) IF GET_ENTITY_MODEL(vehTemp) = TOWTRUCK OR GET_ENTITY_MODEL(vehTemp) = TOWTRUCK2 myVehicle = vehTemp PRINTLN("VEHICLE ASSIGNMENT IN PLACE") ENDIF ENDIF ENDIF ENDIF #IF IS_DEBUG_BUILD IF IS_BITMASK_AS_ENUM_SET(g_savedGlobals.sTowingData.iBools, TOW_GLOBAL_LaunchedViaDebug) CLEAR_BITMASK_AS_ENUM(g_savedGlobals.sTowingData.iBools, TOW_GLOBAL_LaunchedViaDebug) SWITCH towVariation CASE VARIATION_TRADIITONAL vStartVec = << 522.2961, -1669.1116, 28.2273 >> //<< -67.7942, -1344.1104, 28.2917 >> fStartFloat = 52.2 //171.5033 BREAK ENDSWITCH REQUEST_MODEL(missionCarName) WHILE NOT HAS_MODEL_LOADED(missionCarName) WAIT(0) ENDWHILE PRINTLN("SETTING PLAYER INTO TOWING TRUCK VEHICLE") myVehicle = CREATE_VEHICLE(missionCarName, vStartVec, fStartFloat) IF g_savedGlobals.sTowingData.iAbandonCompleted = 0 g_savedGlobals.sTowingData.iAbandonCompleted = 1 ENDIF IF g_savedGlobals.sTowingData.iHandiCompleted = 0 g_savedGlobals.sTowingData.iHandiCompleted = 1 ENDIF IF g_savedGlobals.sTowingData.iTrainCompleted = 0 g_savedGlobals.sTowingData.iTrainCompleted = 1 ENDIF IF g_savedGlobals.sTowingData.iBreakDownCompleted = 0 g_savedGlobals.sTowingData.iBreakDownCompleted = 1 ENDIF IF g_savedGlobals.sTowingData.iAccidentCompleted = 0 g_savedGlobals.sTowingData.iAccidentCompleted = 1 ENDIF TELEPORT_PLAYER(vStartVec) ENDIF #ENDIF SET_CINEMATIC_BUTTON_ACTIVE(FALSE) SET_WANTED_LEVEL_MULTIPLIER(0.2) IF DOES_ENTITY_EXIST(myVehicle) IF NOT IS_ENTITY_DEAD(myVehicle) SET_ENTITY_AS_MISSION_ENTITY(myVehicle, TRUE, TRUE) ADD_VEHICLE_UPSIDEDOWN_CHECK(myVehicle) SET_VEHICLE_CAN_LEAK_PETROL(myVehicle, FALSE) SET_VEHICLE_HAS_STRONG_AXLES(myVehicle, TRUE) ENDIF ENDIF sbi01 = ADD_SCENARIO_BLOCKING_AREA((<<414.1398, -640.0020, 27.5001>> - <<50,50,50>>), (<<414.1398, -640.0020, 27.5001>> + <<50,50,50>>)) sbi02 = ADD_SCENARIO_BLOCKING_AREA((<<-229.8159, -1171.9999, 21.8557>> - <<50,50,50>>), (<<-229.8159, -1171.9999, 21.8557>> + <<50,50,50>>)) SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA((vCarGenPosition - <<15,15,15>>), (vCarGenPosition + <<15,15,15>>), FALSE) REMOVE_VEHICLES_FROM_GENERATORS_IN_AREA((vCarGenPosition - <<15,15,15>>), (vCarGenPosition + <<15,15,15>>)) SET_CELLPHONE_PROFILE_TO_NORMAL() WHILE TRUE // main loop WAIT(0) UPDATE_LOAD_QUEUE_LARGE(sLoadQueue) CHECK_FOR_RIGHT_CHARACTER() SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID()) IF bPostTonya AND NOT IS_PED_IN_ANY_TAXI(PLAYER_PED_ID()) IF IS_SCREEN_FADED_OUT() NEW_LOAD_SCENE_START(<<408.8376, -1638.9524, 28.2928>>, << -3.2400, 0.0000, -62.6001 >>, 20.0) WHILE NOT IS_NEW_LOAD_SCENE_LOADED() WAIT(0) PRINTLN("WAITING ON NEW SCENE TO LOAD") ENDWHILE NEW_LOAD_SCENE_STOP() SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() CLEAR_AREA_OF_VEHICLES(<<408.8376, -1638.9524, 28.2928>>, 8.0) DO_SCREEN_FADE_IN(500) ENDIF ENDIF //UPDATE_ZVOLUME_WIDGETS() // IF NOT bPlayerInTowTruck // CHECK_FOR_PLAYER_IN_TOW_TRUCK() // ENDIF #IF IS_DEBUG_BUILD IF myDebugData.bTurnOnDebugPos myDebugData.bTurnOnDebugPos = FALSE DEBUG_DARW_BLIPS() ENDIF #ENDIF IF curStage < MISSION_STATE_ENDUI_SETUP UPDATE_MISSION_CAR(myVehicle, myVehicleBlip, brokenVehicles, vCurDestObjective, sLastObjective, outOfVehicleTime, iClosestIdx, bSuppressBlips, bGpsActive, bInCombat, bUnlockDoors, bWanted, curStage) ENDIF IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SWITCH towVariation CASE VARIATION_TRADIITONAL IF curStage > MISSION_STATE_CREATE AND curStage < MISSION_STATE_ENDUI_SETUP IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), myVehicle) //DRAW_MINIGAME_INSTRUCTIONS(helpScaleform) ENDIF IF chosenNodeType <> NODE_TYPE_ABANDON AND chosenNodeType <> NODE_TYPE_ACCIDENT IF NOT UPDATE_DAMAGE_TRACKING(printState, brokenVehicles[0].vehicleIndex, myVehicle, iLastHealth, iHealthDelta, bPostTonya) failReason = FAIL_DAMAGE MISSION_FAILED() //mission failed on damage ENDIF ENDIF IF bDoTutorial OR bRunningTwoOrFive UPDATE_TOWTRUCK_DAMAGE_TRACKING(truckPrintState, myVehicle, iTruckLastHealth, iTruckHealthDelta, bPostTonya) ENDIF ENDIF //TODO! Tutorial needs to supress other prints IF bDoTutorial //OR curStage = MISSION_STATE_DROPOFF IF curStage >= MISSION_STATE_TOWING //IF chosenNodeType = NODE_TYPE_ABANDON OR chosenNodeType = NODE_TYPE_DYNAMIC UPDATE_TUTORIAL(myVehicle, brokenVehicles[0].vehicleIndex, myGarageData, brokenVehicles[0].blipIndex, vCurDestObjective, sLastObjective, vDropOffPosition, bDoTutorial, brokenVehicles[0].pedIndex) //ENDIF ENDIF ENDIF bDisableCin = FALSE IF (chosenNodeType = NODE_TYPE_HANDI OR chosenNodeType = NODE_TYPE_ABANDON) AND curStage > MISSION_STATE_CREATE AND curStage < MISSION_STATE_COMPLETE IF bSexVariation AND bShakeCar #IF NOT IS_JAPANESE_BUILD #IF NOT FEATURE_GEN9_RELEASE REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME() SHAKE_CAR(brokenVehicles[0].vehicleIndex, brokenVehicles[0].pedIndex) #ENDIF #ENDIF ENDIF //no extra ped when we're doing a tutorial IF NOT bDoTutorial #IF IS_JAPANESE_BUILD UPDATE_ANGRY_PED_CLEAN() #ENDIF #IF NOT IS_JAPANESE_BUILD UPDATE_ANGRY_PED() #ENDIF ENDIF ELIF chosenNodeType = NODE_TYPE_TRAIN AND curStage > MISSION_STATE_CREATE AND curStage < MISSION_STATE_COMPLETE IF UPDATE_TRAIN() MISSION_CLEANUP() ENDIF IF trainState > TRAIN_STATE_PRINT //AND trainState < TRAIN_STATE_DONE UPDATE_TRAIN_PED() ENDIF ELIF chosenNodeType = NODE_TYPE_DYNAMIC //we need this special check because if the ped get's out of the vehicle we stop updating the main logic //which means we stop updating the ped checks in this case.. look into a better solution for this. IF curStage = MISSION_STATE_PED AND brokenState < BROKEN_STATE_PED_TALK AND NOT bTriggeredEarly IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) IF IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), brokenVehicles[0].vehicleIndex) bTriggeredEarly = TRUE CLEAR_PED_TASKS(brokenVehicles[0].pedIndex) TASK_TURN_PED_TO_FACE_ENTITY(brokenVehicles[0].pedIndex, PLAYER_PED_ID()) ENDIF ENDIF ENDIF ENDIF IF bSpawnPed AND NOT bPedCreated SPAWN_PED(extraData[GET_IDX()].vUtilityPos, extraData[GET_IDX()].vBloodSplatter, illegalNodes[illegalIdx].vCarPos, brokenVehicles[0].pedIndex, brokenVehicles[0].pedBystanders, pedNames, getPointHead, SpecialAnimDict, SpecialAnims, iNumPeds) ELSE ENDIF IF chosenNodeType = NODE_TYPE_ACCIDENT UPDATE_STAGING(stagingState, helperCar, helperPed, myVehicle, brokenVehicles[0].pedBystanders, iNumPeds, SpecialAnimDict, SpecialAnims, pedTonya, bPostTonya, brokenVehicles[0].vehicleIndex) ENDIF IF NOT bPostTonya IF DOES_ENTITY_EXIST(pedTonya) AND NOT IS_ENTITY_DEAD(pedTonya) IF DO_AGGRO_CHECK(pedTonya, NULL, aggroArgs, aggroReason, FALSE, TRUE, FALSE, TRUE, FALSE) bAggroedTonya = TRUE PRINTLN("TONYA ATTACKED OUTSIDE TUTORIAL LOOP") TASK_SMART_FLEE_PED(pedTonya, PLAYER_PED_ID(), 1000, -1) ENDIF IF HAS_PLAYER_ABANDONED_TONYA() bAbandonedTonya = TRUE PRINTLN("PLAYER HAS ABANDONED TONYA - POST TUTORIAL") ENDIF ENDIF ENDIF IF bPedCreated AND NOT bAttack IF DO_AGGRO_CHECK(brokenVehicles[0].pedIndex, brokenVehicles[0].vehicleIndex, aggroArgs, aggroReason, FALSE, TRUE, TRUE, TRUE, FALSE) PRINTLN("PLAYER AGGROED brokenVehicles[0].pedIndex") KILL_ANY_CONVERSATION() IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) CLEAR_PED_TASKS(brokenVehicles[0].pedIndex) SET_PED_KEEP_TASK(brokenVehicles[0].pedIndex, TRUE) TASK_SMART_FLEE_PED(brokenVehicles[0].pedIndex, PLAYER_PED_ID(), 1000, -1) PRINTLN("PLAYER AGGROED DRIVER") failReason = FAIL_PED_THREATENED ENDIF IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndexPass) CLEAR_PED_TASKS(brokenVehicles[0].pedIndexPass) SET_PED_KEEP_TASK(brokenVehicles[0].pedIndexPass, TRUE) CLEAR_SEQUENCE_TASK(taskSequence) OPEN_SEQUENCE_TASK(taskSequence) TASK_LEAVE_ANY_VEHICLE(NULL, 1, ECF_DONT_CLOSE_DOOR) TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 1000, -1) CLOSE_SEQUENCE_TASK(taskSequence) IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndexPass) TASK_PERFORM_SEQUENCE(brokenVehicles[0].pedIndexPass, taskSequence) ENDIF CLEAR_SEQUENCE_TASK(taskSequence) PRINTLN("PLAYER AGGROED PASSENGER 01") failReason = FAIL_PED_THREATENED ENDIF IF NOT bDoTutorial SWITCH aggroReason CASE EAggro_Attacked IF chosenNodeType = NODE_TYPE_ABANDON failReason = FAIL_PED_ATTACKED_TRAMP PRINTLN("failReason = FAIL_PED_ATTACKED_TRAMP") MISSION_FAILED() ELSE failReason = FAIL_PED_ATTACKED PRINTLN("failReason = FAIL_PED_ATTACKED") MISSION_FAILED() ENDIF BREAK CASE EAggro_Wanted CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_DISP_LAW", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES) failReason = FAIL_WANTED MISSION_FAILED() BREAK // DEFAULT // failReason = FAIL_PED_THREATENED // BREAK ENDSWITCH ELSE failReason = FAIL_ATTACKED_TOW_TRUCK_OWNER MISSION_FAILED() ENDIF IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) MISSION_FAILED() ENDIF ENDIF IF DO_AGGRO_CHECK(brokenVehicles[0].pedIndexPass, brokenVehicles[0].vehicleIndex, aggroArgs, aggroReason, FALSE, TRUE, FALSE, TRUE, FALSE) KILL_ANY_CONVERSATION() IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndexPass) CLEAR_PED_TASKS(brokenVehicles[0].pedIndexPass) SET_PED_KEEP_TASK(brokenVehicles[0].pedIndexPass, TRUE) TASK_SMART_FLEE_PED(brokenVehicles[0].pedIndexPass, PLAYER_PED_ID(), 1000, -1) PRINTLN("PLAYER AGGROED PASSENGER 02") failReason = FAIL_PED_THREATENED ENDIF ENDIF ELSE IF bAttack // PRINTLN("bAttack") ENDIF ENDIF // IF chosenNodeType = NODE_TYPE_DYNAMIC // bEnableBonusCam = FALSE // ENDIF // // IF bEnableBonusCam // HANDLE_CINEMATIC_CAM() // ELIF DOES_CAM_EXIST(towArgs.towCam) // CLEANUP_CAM(towArgs) // ENDIF //TODO switch to destination IF NOT bDisableCin AND VALIDATE_HINT_CAM(FALSE) IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_ENTITY_DEAD(myVehicle) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), myVehicle) // PRINTLN("DOING A HINT CAM!!!") IF NOT bTowHooked IF DOES_ENTITY_EXIST(brokenVehicles[0].vehicleIndex) IF NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) CONTROL_COORD_CHASE_HINT_CAM_ANY_MEANS(localChaseHintCamStruct, GET_ENTITY_COORDS(brokenVehicles[0].vehicleIndex)) ENDIF ENDIF ELSE CONTROL_COORD_CHASE_HINT_CAM_ANY_MEANS(localChaseHintCamStruct, vDest) ENDIF ENDIF ENDIF //In this case we don't want to check hookec because when hooked we look at destination IF NOT VALIDATE_HINT_CAM(FALSE) KILL_CHASE_HINT_CAM(localChaseHintCamStruct) ENDIF UPDATE_PRINT_DELAY(printTimer, 7, TRUE) UPDATE_QUICK_CONV_QUEUE() //UPDATE_CLOSEST_NODE() UPDATE_BLIPPED_ENTITIES() IF (NOT bOutOfVehicle OR curStage >= MISSION_STATE_ENDUI_SETUP) OR bSkipTutorial OR bUnlockDoors // PRINTLN("PASSING THIS CHECK") IF UPDATE_TRADITIONAL() MISSION_PASSED() ENDIF ENDIF IF curStage = MISSION_STATE_DROPOFF IF chosenNodeType = NODE_TYPE_TRAIN OR chosenNodeType = NODE_TYPE_DYNAMIC MANAGE_PED_CONVERSATION(MyLocalPedStruct, brokenVehicles, myVehicle) ENDIF ENDIF BREAK ENDSWITCH IF UPDATE_FAIL_CONDITIONS(launchArgs) MISSION_FAILED() ENDIF ENDIF #IF IS_DEBUG_BUILD bDebugInTutorial = FALSE DO_DEBUG_SKIPS() #ENDIF ENDWHILE ENDSCRIPT