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

5804 lines
203 KiB
XML
Executable File

//////////////////////////////////////////////////////////////////////////////////////////
// //
// SCRIPT NAME : Towing //
// AUTHOR : Steven Messinger //
// DESCRIPTION : Core logic for the tow truck oddjob //
// //
//////////////////////////////////////////////////////////////////////////////////////////
USING "Towing.sch"
USING "towing_cams.sch"
//USING "z_volumes.sch"
USING "cheat_controller_public.sch"
USING "doors_script_public.sch"
STRING strFailReason
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
//current size is 7
STREAMED_MODEL streamReqs[7]
STREAMED_ANIM streamReqsAnim[7]
#IF IS_DEBUG_BUILD
DEBUG_POS_DATA myDebugData
VECTOR vStartVec = << 1387.9126, -2535.6133, 47.4669 >>
FLOAT fStartFloat
#ENDIF
BOOL bFailRc = FALSE
BOOL bTriggeredEarly = FALSE
BOOL bPrintHook = TRUE
BOOL bPrintDest = TRUE
BOOL bPrintHintCam = TRUE
BOOL bTrainClose = FALSE
BOOL bRammedVehicle = FALSE
BOOL bTaskedBrokenDownPed = FALSE
BOOL bUnlockDoors = FALSE
BOOL bStopTimer = FALSE
BOOL bDisplayHelp = TRUE
BOOL bAggroedTonya = FALSE
BOOL bAbandonedTonya = FALSE
BOOL bSkipTutorial = FALSE
BOOL bPostTonya = FALSE
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 bSupressObjective = FALSE
BOOL bSuppressBlips = FALSE
BOOL bDoTutorial = FALSE
BOOL bRequiresPed = FALSE
BOOL bGenDisabled = FALSE
BOOL bAttack = 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 bTonyaReattachConvo = FALSE
BOOL bPrintReattach = FALSE
BOOL bPlayedCellPhoneCall = FALSE
BOOL bPlayedWayBackConvo = FALSE
BOOL bFailedToExit = FALSE
BOOL bGaveWarning = FALSE
BOOL bPlayedLastConvo = FALSE
BOOL bInterrupt = FALSE
BOOL bCarCameUnHooked = FALSE
BOOL bPrintObjective = FALSE
BOOL bStartTimer = FALSE
BOOL bPlayedNearEndingConvo = FALSE
BOOL bPlayedBackToImpountConvo = FALSE
BOOL bPlayedPostHookupConvo = FALSE
BOOL bPrintDriveToImpoundObjective = FALSE
BOOL bRunnningWithTonya = FALSE
BOOL bPrintGoToRepairShop = FALSE
BOOL bPlayBeckonLine = FALSE
BOOL bVehicleInDropoffArea = FALSE
BOOL bCurrentlyTonyaAbandoned = FALSE
BOOL bPrintAllowTonyaToEnter = FALSE
BOOL bKillAnyConversation = FALSE
BOOL bPlayWaitConvo = FALSE
BOOL bReturnHelpPrinted = FALSE
BOOL bClearedPrintsOnce = FALSE
BOOL bPrintHurryHelp = FALSE
BOOL bPlayStopConvo = FALSE
BOOL bPlayedGetOutConvo = FALSE
BOOL bPlayAbandonLine = FALSE
BOOL bPlayedDamagedVehicleLine = FALSE
BOOL bPlayHookedUpAudio = FALSE
BOOL bPrintSlowDownHelp = FALSE
BOOL bMovedVehicle = FALSE
BOOL bDrawCorona = FALSE
BOOL bRemovedCoordinateBlip = FALSE
//BOOL bFailForBeingWanted = FALSE
PED_INDEX piSpeakers[2]
PED_INDEX pedTrainDriver
PED_INDEX pedTonya
BLIP_INDEX myVehicleBlip
BLIP_INDEX tempBlip
BLIP_INDEX blipImpound
//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 iStageToUse = 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 iPostMissionTonyaStages
INT iNumPeds = 0
INT outOfVehicleTime = 0
INT iTonyaDropoffStages = 0
INT iPostDropOffStages = 0
INT iPedID
INT iAwayFromImpoundStages = 0
INT iPushStages = 0
VECTOR vExtra
VECTOR vExtra2
VECTOR vCarGenPosition = <<408.8376, -1638.9524, 28.2928>>
VECTOR vBDVPos // used to store off broken down vehicle position
VECTOR vSkipSpawnPosition = <<405.5971, -1635.6908, 28.2928>>
FLOAT fSkipSpawnHeading = 233.0139
VECTOR getPointVec
FLOAT getPointHead
FLOAT fConvoBufferTime = 5.0
TEXT_LABEL_63 sLastObjective
TEXT_LABEL_23 TestResumptionLabel
FAIL_REASON_ENUM failReason
structTimer printDelayTimer
structTimer genericTimer
structTimer totalTimer
structTimer printTimer
structTimer chaseTimer
structTimer failTimer
structTimer wakeTimer
structTimer tAdditionalHelpPrintTimer
structTimer tDropOffTimer
structTimer tAbandonTimer
structTimer tConvoBufferTimer
structTimer tLastChatTimer
structTimer tDelayPhoneCallTimer
structTimer tEndingTimer
structTimer tNearCarStallTimer
structTimer tStopTimer
//INT iAllowSkipCutsceneTime = 0
VEHICLE_INDEX myVehicle
VEHICLE_INDEX helperCar
PED_INDEX helperPed
SCENARIO_BLOCKING_INDEX sbi01, sbi02, sbi03
//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]
// GATE VARIABLES
ENUM TOWING_GATES
TOWING_GATES_SOUTH = 0,
TOWING_GATES_EAST
ENDENUM
MISSION_DOOR_STRUCT sMyDoors[2]
INT iGateStates
INT iGateSouth, iGateEast
//REPLAY VARIABLES
//VECTOR vPlayerFirstCheckpointPosition = <<-10.7897, -1471.2037, 29.5520>>
//FLOAT fPlayerFirstCheckpointHeading = 276.1668
//VECTOR vTonyaFirstCheckpointPosition = <<-10.9438, -1473.6119, 29.5508>>
//FLOAT fTonyaFirstCheckpointHeading = 264.1491
PROC HANDLE_GATE_OPENING()
SWITCH iGateStates
CASE 0
iGateSouth = HASH("SouthGate")
iGateEast = HASH("EastGate")
MISSION_DOORS_ADD_DOOR(sMyDoors[TOWING_GATES_SOUTH], iGateSouth, <<416.4166, -1652.7782, 28.2917>>, prop_facgate_08)
MISSION_DOORS_ADD_DOOR(sMyDoors[TOWING_GATES_EAST], iGateEast, <<415.2836, -1621.8584, 28.3294>>, prop_facgate_08)
CPRINTLN(DEBUG_MISSION, "iGateStates = 1")
iGateStates = 1
BREAK
CASE 1
IF GET_ENTITY_DISTANCE_FROM_LOCATION(PLAYER_PED_ID(), <<415.6646, -1622.2667, 28.2919>>) < 50.0
MISSION_DOORS_SET_DOOR_STATE(sMyDoors[TOWING_GATES_SOUTH], TRUE, 1.0, 2000)
MISSION_DOORS_SET_DOOR_STATE(sMyDoors[TOWING_GATES_EAST], TRUE, 1.0, 2000)
CPRINTLN(DEBUG_MISSION, "iGateStates = 2")
iGateStates = 2
ENDIF
BREAK
CASE 2
MISSION_DOORS_UPDATE(sMyDoors)
BREAK
ENDSWITCH
ENDPROC
PROC MISSION_CLEANUP(LoadQueueLarge &sLoadQueue, BOOL bTerminateThread = TRUE)
// To Fix Bug # 554724
CLEAR_HELP()
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(pedTonya)
IF DOES_ENTITY_EXIST(pedTonya)
IF IS_PED_IN_GROUP(pedTonya)
REMOVE_PED_FROM_GROUP(pedTonya)
PRINTLN("REMOVING pedTonya FROM GROUP")
ENDIF
ENDIF
IF bTerminateThread
SET_PED_KEEP_TASK(pedTonya, TRUE)
SET_PED_AS_NO_LONGER_NEEDED(pedTonya)
PRINTLN("SETTING PED - pedTonya AS NO LONGER NEEDED")
ENDIF
ENDIF
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 DOES_ENTITY_EXIST(brokenVehicles[0].blockingIndex) 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)
ENDIF
IF chosenNodeType = NODE_TYPE_TRAIN
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_LOAD_QUEUE_LARGE(sLoadQueue)
Set_Leave_Area_Flag_For_All_Blipped_Missions()
//CLEANUP_MINIGAME_INSTRUCTIONS(helpScaleform)
SET_WANTED_LEVEL_MULTIPLIER(1.0)
SET_VEHICLE_MODEL_IS_SUPPRESSED(TOWTRUCK, FALSE)
IF bTerminateThread
PRINTLN("TERMINATING THREAD")
TERMINATE_THIS_THREAD() // important, kills the script
ENDIF
ENDPROC
PROC MISSION_FAILED()
//Don't allow fail if the mission passed UI is up
IF curStage < MISSION_STATE_ENDUI_WAIT
// 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_MinigameFailed)
// 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_FRANKLIN_NO_EXIT
// PRINT_NOW("TOW_FAIL_08", DEFAULT_GOD_TEXT_TIME, 1)
strFailReason = "TOW_FAIL_17"
BREAK
CASE FAIL_ABANDONED_JOB
// PRINT_NOW("TOW_FAIL_08", DEFAULT_GOD_TEXT_TIME, 1)
strFailReason = "TOW_FAIL_08"
BREAK
CASE FAIL_ABANDONED_DRIVER
// PRINT_NOW("TOW_FAIL_08a", DEFAULT_GOD_TEXT_TIME, 1)
strFailReason = "TOW_FAIL_08a"
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_03a"
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_PED_THREATENED_WITH_WEAPON
// PRINT_NOW("TOW_FAIL_02b", DEFAULT_GOD_TEXT_TIME, 1)
strFailReason = "TOW_FAIL_02b"
BREAK
CASE FAIL_PED_THREATENED_WITH_WEAPON_AIMING
// PRINT_NOW("TOW_FAIL_02b", DEFAULT_GOD_TEXT_TIME, 1)
strFailReason = "TOW_FAIL_02b"
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
bFailRc = TRUE
// 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)
// SET_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, EAggro_ShotNear)
SET_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, EAggro_HeardShot)
SET_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, EAggro_Attacked)
SET_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, EAggro_Wanted)
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])
IF chosenNodeType = NODE_TYPE_ABANDON
carNames[0] = PRIMO
PRINTLN("carNames[0] = PRIMO")
ELIF chosenNodeType = NODE_TYPE_HANDI
carNames[0] = landstalker
PRINTLN("carNames[0] = landstalker")
ELIF chosenNodeType = NODE_TYPE_TRAIN
carNames[0] = schwarzer
PRINTLN("carNames[0] = schwarzer")
ELIF chosenNodeType = NODE_TYPE_DYNAMIC
carNames[0] = tailgater
PRINTLN("carNames[0] = tailgater")
ELIF chosenNodeType = NODE_TYPE_ACCIDENT
carNames[0] = INTRUDER
PRINTLN("carNames[0] = INTRUDER")
ENDIF
brokenVehicles[openIdx].vehicleIndex = CREATE_VEHICLE(carNames[0], spawnVec, fOrient)
SET_ENTITY_LOAD_COLLISION_FLAG(brokenVehicles[openIdx].vehicleIndex, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(carNames[0])
// SET_VEHICLE_COLOURS(brokenVehicles[openIdx].vehicleIndex, 0, 0)
PRINTLN("SETTING COLLISION FLAG ON CAR")
IF chosenNodeType = NODE_TYPE_DYNAMIC
SET_VEHICLE_COLOURS(brokenVehicles[openIdx].vehicleIndex, 27, 27)
PRINTLN("SETTING VEHICLE'S COLORS")
ENDIF
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)
PRINTLN("CREATING SPEED ZONE 1")
ENDIF
brokenVehicles[openIdx].speedIDB = ADD_ROAD_NODE_SPEED_ZONE(spawnVec, fMiddleCheck, 2.5)
PRINTLN("CREATING SPEED ZONE 2")
brokenVehicles[openIdx].speedIDC = ADD_ROAD_NODE_SPEED_ZONE(spawnVec, fOuterCheck, 4)
PRINTLN("CREATING SPEED ZONE 3")
//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_VEHICLE_ENGINE_CAN_DEGRADE(brokenVehicles[openIdx].vehicleIndex, FALSE)
PRINTLN("bDoFire IS TRUE")
ELSE
SET_DISABLE_VEHICLE_PETROL_TANK_FIRES(brokenVehicles[openIdx].vehicleIndex, TRUE)
SET_VEHICLE_ENGINE_HEALTH(brokenVehicles[openIdx].vehicleIndex, 1)
SET_VEHICLE_ENGINE_CAN_DEGRADE(brokenVehicles[openIdx].vehicleIndex, FALSE)
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)
PRINTLN("ADDING BLIP - brokenVehicles[openIdx].blipIndex")
ENDIF
ELSE
IF bSuppressBlips
PRINTLN("bSuppressBlips = TRUE")
ELSE
PRINTLN("bSuppressBlips = FALSE")
ENDIF
IF bBlip
PRINTLN("bBlip = TRUE")
ELSE
PRINTLN("bBlip = FALSE")
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
PROC CHECK_FOR_HOOKING_WRONG_CAR()
IF bRunnningWithTonya
IF NOT bVehicleInDropoffArea
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(MyLocalPedStruct, 3, pedTonya, "TONYA")
PRINT_HELP("TOW_TUT_07")
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
ELSE
// PRINTLN("bVehicleInDropoffArea IS TRUE")
ENDIF
ENDIF
ENDPROC
FUNC BOOL CHECK_TOW_ATTACHMENTS(STRING objective, VECTOR vDestination)
BOOL bProcede = TRUE
INT idx
CHECK_FOR_HOOKING_WRONG_CAR()
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()
IF NOT bClearedPrintsOnce
CLEAR_PRINTS()
bClearedPrintsOnce = TRUE
ENDIF
REPLAY_RECORD_BACK_FOR_TIME(3.0, 3.0, REPLAY_IMPORTANCE_LOWEST)
// 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)
IF DOES_BLIP_EXIST(brokenVehicles[idx].blipIndex)
SET_BLIP_ROUTE(brokenVehicles[idx].blipIndex, FALSE)
PRINTLN("CLEARING BLIP ROUTE - 01")
ENDIF
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)
IF DOES_BLIP_EXIST(brokenVehicles[idx].blipIndex)
SET_BLIP_COLOUR(brokenVehicles[idx].blipIndex, BLIP_COLOUR_YELLOW)
SET_BLIP_ROUTE(brokenVehicles[idx].blipIndex, TRUE)
ENDIF
IF NOT bDoTutorial
AND NOT (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya5")) = 1)
IF bPrintDest
PRINT_NOW(objective, DEFAULT_GOD_TEXT_TIME, 1)
PRINTLN("PRINTING OBJECTIVE IN CHECK TOW ATTACHMENTS")
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
PROC HANDLE_ADDITIONAL_HELP_PRINTS_AT_DROPOFF()
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vDest, <<30,30,LOCATE_SIZE_HEIGHT>>, FALSE)
IF NOT IS_TIMER_STARTED(tDropOffTimer)
START_TIMER_NOW(tDropOffTimer)
PRINTLN("STARTING TIMER - tDropOffTimer")
ELSE
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND 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 GET_TIMER_IN_SECONDS(tDropOffTimer) > 30
PRINT_HELP("TOWT_HELP_DP")
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
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 IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_ENTITY_DEAD(myVehicle) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex)
IF IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex)
bDrawCorona = TRUE
// PRINTLN("bDrawCorona = TRUE")
ELSE
bDrawCorona = FALSE
// PRINTLN("bDrawCorona = FALSE")
ENDIF
ENDIF
IF NOT bDoTutorial
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vDest, <<30,30,LOCATE_SIZE_HEIGHT>>, bDrawCorona)
// 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
ELIF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vDest, <<3,3,LOCATE_SIZE_HEIGHT>>, FALSE)
IF NOT IS_ENTITY_DEAD(myVehicle)
BRING_VEHICLE_TO_HALT(myVehicle, 1.0, 0)
ENDIF
// bUnlockDoors = FALSE
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
CLEAR_HELP()
bVehicleInDropoffArea = TRUE
// PRINTLN("bVehicleInDropoffArea = TRUE")
RETURN TRUE
ENDIF
ENDIF
ELSE
HANDLE_ADDITIONAL_HELP_PRINTS_AT_DROPOFF()
ENDIF
ENDIF
ENDIF
bVehicleInDropoffArea = FALSE
// PRINTLN("bVehicleInDropoffArea = FALSE")
RETURN FALSE
ENDFUNC
PROC HANDLE_NEAR_CAR_STALL_DIALOGUE()
VECTOR vPlayerPos, vCarPosition
IF bPlayWaitConvo
EXIT
ENDIF
IF bDoTutorial
EXIT
PRINTLN("DOING THE TUTORIAL, EXIT EARLY")
ENDIF
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya1")) = 1)
OR (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya2")) = 1)
IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<402.5694, -1632.3905, 28.2928>>, <<50,50,50>>, FALSE)
EXIT
PRINTLN("TOO FAR TO CARE ABOUT STALLING")
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
ENDIF
IF NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex)
vCarPosition = GET_ENTITY_COORDS(brokenVehicles[0].vehicleIndex)
ENDIF
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya5")) = 1)
IF NOT bPlayWaitConvo
IF VDIST2(vPlayerPos, <<-227.7806, -1170.6628, 21.8945>>) < 400 // 20m
IF GET_TIMER_IN_SECONDS(tNearCarStallTimer) > 90.0
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_WAITING3", CONV_PRIORITY_VERY_HIGH)
PRINTLN("bPlayWaitConvo = TRUE")
bPlayWaitConvo = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF VDIST2(vPlayerPos, vCarPosition) < 400 // 20m
IF NOT IS_TIMER_STARTED(tNearCarStallTimer)
START_TIMER_NOW(tNearCarStallTimer)
ELSE
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya1")) = 1)
IF GET_TIMER_IN_SECONDS(tNearCarStallTimer) > 25.0
IF NOT bPlayWaitConvo
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_WAIT", CONV_PRIORITY_VERY_HIGH)
PRINTLN("bPlayWaitConvo = TRUE")
bPlayWaitConvo = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya2")) = 1)
IF GET_TIMER_IN_SECONDS(tNearCarStallTimer) > 20.0
IF NOT bPlayWaitConvo
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_WAIT3", CONV_PRIORITY_VERY_HIGH)
PRINTLN("bPlayWaitConvo = TRUE")
bPlayWaitConvo = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
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
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)
OR (NOT IS_ENTITY_DEAD(pedTonya) AND IS_PED_IN_VEHICLE(pedTonya, myVehicle))
BRING_VEHICLE_TO_HALT(MyVehicle, 6, 2)
bDropComplete = TRUE
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya4")) = 1)
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)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<538.5295, -174.2699, 53.4930>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, 64.6725)
TASK_START_SCENARIO_IN_PLACE(NULL, "WORLD_HUMAN_STAND_MOBILE", 0, TRUE)
PRINTLN("USING - WORLD_HUMAN_STAND_MOBILE")
CLOSE_SEQUENCE_TASK(taskSequence)
TASK_PERFORM_SEQUENCE(brokenVehicles[curTowIndex].pedIndex, taskSequence)
CLEAR_SEQUENCE_TASK(taskSequence)
SET_PED_KEEP_TASK(brokenVehicles[curTowIndex].pedIndex, TRUE)
ENDIF
ELSE
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)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-215.5652, -1385.4003, 30.2583>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, 234.3862)
TASK_START_SCENARIO_IN_PLACE(NULL, "WORLD_HUMAN_STAND_MOBILE", 0, TRUE)
PRINTLN("USING - WORLD_HUMAN_STAND_MOBILE")
// 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_STAND_MOBILE", 0, TRUE)
// PRINTLN("USING - WORLD_HUMAN_STAND_MOBILE")
// ELIF iRand = 2
// TASK_START_SCENARIO_IN_PLACE(NULL, "WORLD_HUMAN_STAND_MOBILE", 0, TRUE)
// PRINTLN("USING - WORLD_HUMAN_STAND_MOBILE")
// 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
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
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya1")) = 1)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<398.966614,-1641.232666,27.292774>>, <<411.138153,-1626.688721,33.292782>>, 15.000000)
IF NOT bPlayedLastConvo
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_TUT_ENDa", CONV_PRIORITY_VERY_HIGH)//, DO_NOT_DISPLAY_SUBTITLES)
PRINTLN("PLAYING FIRST TONYA GOODBYE")
bPlayedLastConvo = TRUE
ENDIF
ENDIF
ENDIF
ELIF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya2")) = 1)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<398.966614,-1641.232666,27.292774>>, <<411.138153,-1626.688721,33.292782>>, 15.000000)
IF NOT bPlayedLastConvo
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_TUT_ENDb", CONV_PRIORITY_VERY_HIGH)//, DO_NOT_DISPLAY_SUBTITLES)
PRINTLN("PLAYING SECOND TONYA GOODBYE")
bPlayedLastConvo = TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF chosenNodeType = NODE_TYPE_DYNAMIC
CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_BREAK2", CONV_PRIORITY_VERY_HIGH)//, DO_NOT_DISPLAY_SUBTITLES
PRINTLN("PLAYING BROKEN DOWN, THANK YOU LINE.")
ELIF chosenNodeType = NODE_TYPE_TRAIN
CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_TRAIN_TK", CONV_PRIORITY_VERY_HIGH)//, DO_NOT_DISPLAY_SUBTITLES
PRINTLN("PLAYING TRAIN TRACK CLEARING, THANK YOU LINE.")
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
ELSE
HANDLE_NEAR_CAR_STALL_DIALOGUE()
ENDIF
// IF chosenNodeType = NODE_TYPE_TRAIN OR chosenNodeType = NODE_TYPE_DYNAMIC
// MANAGE_PED_CONVERSATION(MyLocalPedStruct, brokenVehicles, myVehicle)
// 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)
bCarCameUnHooked = TRUE
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya1")) = 1)
PRINTLN("INFORMING STAT STYSTEM - UNHOOK, TONYA 1")
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(TON1_UNHOOK)
ELIF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya2")) = 1)
PRINTLN("INFORMING STAT STYSTEM - UNHOOK, TONYA 2")
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(TON2_UNHOOK)
ELIF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya3")) = 1)
PRINTLN("INFORMING STAT STYSTEM - UNHOOK, TONYA 3")
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(TON3_UNHOOK)
ELIF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya4")) = 1)
PRINTLN("INFORMING STAT STYSTEM - UNHOOK, TONYA 4")
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(TON4_UNHOOK)
ELIF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya5")) = 1)
PRINTLN("INFORMING STAT STYSTEM - UNHOOK, TONYA 5")
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(TON5_UNHOOK)
ENDIF
IF DOES_BLIP_EXIST(brokenVehicles[curTowIndex].blipIndex)
SET_BLIP_ROUTE(brokenVehicles[curTowIndex].blipIndex, FALSE)
REMOVE_BLIP(brokenVehicles[curTowIndex].blipIndex)
PRINTLN("CLEARING BLIP ROUTE - 02")
ENDIF
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 bRunnningWithTonya
IF NOT bTonyaReattachConvo
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TONYA_DETACH", CONV_PRIORITY_VERY_HIGH)
PRINTLN("bTonyaReattachConvo = TRUE")
bTonyaReattachConvo = TRUE
ENDIF
ENDIF
ELSE
IF chosenNodeType = NODE_TYPE_TRAIN
IF NOT bTonyaReattachConvo
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_LOSTCAR", CONV_PRIORITY_VERY_HIGH)
PRINTLN("bTonyaReattachConvo = TRUE 01")
bTonyaReattachConvo = TRUE
ENDIF
ENDIF
ELIF chosenNodeType = NODE_TYPE_DYNAMIC
IF NOT bTonyaReattachConvo
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_CAR_UNHO", CONV_PRIORITY_VERY_HIGH)
PRINTLN("bTonyaReattachConvo = TRUE 02")
bTonyaReattachConvo = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RESTART_TIMER_NOW(genericTimer)
IF NOT bSupressObjective
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")
sLastObjective = sObjective
ENDIF
//bFirstTime = FALSE
PRINTLN("GOING TO STATE - MISSION_STATE_TOWING")
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
IF NOT bPrintSlowDownHelp
PRINT_HELP("TOWT_HELP_SL")
PRINTLN("bPrintSlowDownHelp = TRUE")
bPrintSlowDownHelp = TRUE
ENDIF
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)
VECTOR vPlayerPostion, vPedPostion
// FLOAT fTempDistance
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, 2, TRUE) OR bReverseOrder OR bTowHooked
IF NOT bTaskedBrokenDownPed
myFrameCount = 0
ODDJOB_STOP_SOUND(soundID3)
DEBUG_MESSAGE("Script Conversation")
DEBUG_MESSAGE("Clear ped tasks")
IF NOT IS_ENTITY_DEAD(brokenVehicles[idx].pedIndex)
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
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 (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya3")) = 1)
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(), "FRANKLIN")
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 3, brokenVehicles[idx].pedIndex, "TOWTRAINM")
CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_TRAIN1", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES)
PRINTLN("PLAYING LINE - SHIT MYSELF LINE")
SET_PED_MOVEMENT_CLIPSET(brokenVehicles[idx].pedIndex, "move_m@JOG@")
CLEAR_HELP()
IF NOT IS_ENTITY_DEAD(brokenVehicles[idx].pedIndex)
SET_VEHICLE_DOORS_LOCKED(myVehicle, VEHICLELOCK_UNLOCKED)
TASK_ENTER_VEHICLE(brokenVehicles[idx].pedIndex, myVehicle, DEFAULT_TIME_NEVER_WARP, VS_FRONT_RIGHT, PEDMOVEBLENDRATIO_RUN, ECF_BLOCK_SEAT_SHUFFLING | ECF_RESUME_IF_INTERRUPTED)
ENDIF
ELIF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya4")) = 1)
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(), "FRANKLIN")
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 3, brokenVehicles[idx].pedIndex, "TOWBREAKDOWN1")
CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", audioLine, CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES)
// SET_PED_MOVEMENT_CLIPSET(brokenVehicles[idx].pedIndex, "move_m@JOG@")
CLEAR_HELP()
IF NOT IS_ENTITY_DEAD(brokenVehicles[idx].pedIndex)
SET_VEHICLE_DOORS_LOCKED(myVehicle, VEHICLELOCK_UNLOCKED)
TASK_ENTER_VEHICLE(brokenVehicles[idx].pedIndex, myVehicle, DEFAULT_TIME_NEVER_WARP, VS_FRONT_RIGHT, PEDMOVEBLENDRATIO_WALK, ECF_BLOCK_SEAT_SHUFFLING | ECF_RESUME_IF_INTERRUPTED)
ENDIF
ELSE
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(), "FRANKLIN")
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, iPedID, brokenVehicles[idx].pedIndex, sCharacterName)
CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", audioLine, CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES)
SET_PED_MOVEMENT_CLIPSET(brokenVehicles[idx].pedIndex, "move_m@JOG@")
CLEAR_HELP()
IF NOT IS_ENTITY_DEAD(brokenVehicles[idx].pedIndex)
SET_VEHICLE_DOORS_LOCKED(myVehicle, VEHICLELOCK_UNLOCKED)
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
ENDIF
IF bReverseOrder
IF DOES_BLIP_EXIST(brokenVehicles[idx].blipIndex)
REMOVE_BLIP(brokenVehicles[idx].blipIndex)
PRINTLN("REMOVING BLIP - brokenVehicles[idx].blipIndex")
ENDIF
IF NOT DOES_BLIP_EXIST(brokenVehicles[idx].blipIndex)
IF DOES_ENTITY_EXIST(brokenVehicles[idx].pedIndex)
IF DOES_BLIP_EXIST(brokenVehicles[0].blipIndexPed)
REMOVE_BLIP(brokenVehicles[0].blipIndexPed)
PRINTLN("REMOVING BLIP - brokenVehicles[0].blipIndexPed") // To fix assert
ENDIF
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)
PRINTLN("ADDING BLIP - brokenVehicles[idx].blipIndex")
ENDIF
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 (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya4")) = 1)
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(), "FRANKLIN")
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 3, brokenVehicles[idx].pedIndex, "TOWBREAKDOWN1")
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_CALLOUT", 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 NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
vPlayerPostion = GET_ENTITY_COORDS(PLAYER_PED_ID())
ENDIF
IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex)
vPedPostion = GET_ENTITY_COORDS(brokenVehicles[0].pedIndex)
ENDIF
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya4")) = 1)
IF GET_SCRIPT_TASK_STATUS(brokenVehicles[0].pedIndex, SCRIPT_TASK_ENTER_VEHICLE) <> PERFORMING_TASK
TASK_ENTER_VEHICLE(brokenVehicles[idx].pedIndex, myVehicle, DEFAULT_TIME_NEVER_WARP, VS_FRONT_RIGHT, PEDMOVEBLENDRATIO_RUN, ECF_BLOCK_SEAT_SHUFFLING | ECF_RESUME_IF_INTERRUPTED)
PRINTLN("RETASKING TO ENTER TOW TRUCK")
ENDIF
ENDIF
// fTempDistance = VDIST(vPlayerPostion, vPedPostion)
// PRINTLN("fTempDistance = ", fTempDistance)
IF NOT bReturnHelpPrinted
IF VDIST2(vPlayerPostion, vPedPostion) > 2500 // 50m
PRINT_NOW("TOW_OBJ_REOWNER", DEFAULT_GOD_TEXT_TIME, 1)
bReturnHelpPrinted = TRUE
PRINTLN("bReturnHelpPrinted = TRUE")
ENDIF
ENDIF
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)
PRINTLN("bPedInTowTruck = TRUE")
ENDIF
ENDIF
IF IS_PED_IN_VEHICLE(brokenVehicles[idx].pedIndex, myVehicle) AND NOT IS_SCRIPTED_CONVERSATION_ONGOING()
IF bReverseOrder
CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_TRAIN2", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES)
ELSE
CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_BREAKS", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES)
ENDIF
PRINTLN("GOING TO STATE - BROKEN_STATE_HOOKING")
myState = BROKEN_STATE_HOOKING
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)
PRINTLN("INSIDE - CREATE_BROKEN_VEHICLE_ILLEGAL")
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)
SET_ENTITY_AS_MISSION_ENTITY(helperCar)
IF NOT IS_ENTITY_DEAD(helperCar)
SET_VEHICLE_SIREN(helperCar, TRUE)
SET_VEHICLE_ENGINE_ON(helperCar, TRUE, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(AMBULANCE)
ENDIF
IF DOES_ENTITY_EXIST(helperCar)
helperPed = CREATE_PED_INSIDE_VEHICLE(helperCar, PEDTYPE_CIVMALE, S_M_M_PARAMEDIC_01)
SET_ENTITY_AS_MISSION_ENTITY(helperPed)
PRINTLN("CREATING GUY IN AMBULANCE")
SET_MODEL_AS_NO_LONGER_NEEDED(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
PRINTLN("bPedCreated = TRUE - 01")
IF chosenNodeType = NODE_TYPE_TRAIN
brokenVehicles[0].pedIndex = CREATE_PED_INSIDE_VEHICLE(brokenVehicles[0].vehicleIndex, PEDTYPE_MISSION, A_M_M_BEVHILLS_02, VS_DRIVER)
SET_ENTITY_LOAD_COLLISION_FLAG(brokenVehicles[0].pedIndex, TRUE)
PRINTLN("OVERRIDING MODEL - A_M_M_BEVHILLS_02")
SET_PED_COMPONENT_VARIATION(brokenVehicles[0].pedIndex, INT_TO_ENUM(PED_COMPONENT,0), 0, 1, 0) //(head)
SET_PED_COMPONENT_VARIATION(brokenVehicles[0].pedIndex, INT_TO_ENUM(PED_COMPONENT,3), 1, 0, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(brokenVehicles[0].pedIndex, INT_TO_ENUM(PED_COMPONENT,4), 0, 2, 0) //(lowr)
SET_MODEL_AS_NO_LONGER_NEEDED(A_M_M_BEVHILLS_02)
ELSE
brokenVehicles[0].pedIndex = CREATE_PED_INSIDE_VEHICLE(brokenVehicles[0].vehicleIndex, PEDTYPE_MISSION, pedNames[0], VS_DRIVER)
PRINTLN("CREATING PED INSIDE - CREATE_BROKEN_VEHICLE_ILLEGAL")
SET_MODEL_AS_NO_LONGER_NEEDED(pedNames[0])
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)
PRINTLN("CREATING SPEED ZONE 4")
fBrokenDownVehicleHeading = GET_ENTITY_HEADING(brokenVehicles[openIdx].vehicleIndex)
PRINTLN("CREATING SPEED ZONE 5")
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] = <<vTemp.x, vTemp.y, vTemp.z+1>>
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 > 25 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
// sLine = "TOW_PED_ANCU"
// ELSE
// sLine = "TOW_PED_ANCU"
// ENDIF
piSpeakers[0] = brokenVehicles[0].pedIndex
piSpeakers[1] = brokenVehicles[0].pedIndexPass
bAngryPedGaveUp = TRUE
piSpeakers = piSpeakers
// 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
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()
IF soundID3 = -1
IF NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex)
IF GET_PED_IN_VEHICLE_SEAT(brokenVehicles[0].vehicleIndex) = brokenVehicles[0].pedIndex
ODDJOB_PLAY_SOUND("ENGINE_FAIL", soundID3, TRUE, brokenVehicles[0].vehicleIndex, 0, 0, 0, "TONYA_03_SOUNDSET")
ELSE
// PRINTLN("TRYING TO STOP SOUND 1")
ODDJOB_STOP_SOUND(soundID3)
ENDIF
ENDIF
ENDIF
SWITCH trainPedState
CASE TRAIN_STATE_PED_INIT
//DEBUG_MESSAGE("TRAIN_STATE_PED_INIT")
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(),"FRANKLIN")
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, iPedID, 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)
IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex)
TASK_PERFORM_SEQUENCE(brokenVehicles[0].pedIndex, taskSequence)
ENDIF
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
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, iPedID, brokenVehicles[0].pedIndex, "TOWTRAINM")
CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_TRN_PEDA", CONV_PRIORITY_HIGH)
trainPedState = TRAIN_STATE_PED_LOOK
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")
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 3, brokenVehicles[0].pedIndex, "TOWTRAINM")
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_GOTO_ENTITY_OFFSET(NULL, brokenVehicles[0].vehicleIndex, DEFAULT_TIME_BEFORE_WARP, 1.0, 0, PEDMOVE_WALK)
TASK_PLAY_ANIM(NULL, "oddjobs@towingpleadingidle_b", "idle_d", SLOW_BLEND_IN, SLOW_BLEND_OUT, 10000, AF_UPPERBODY)
CLOSE_SEQUENCE_TASK(taskSequence)
IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex)
TASK_PERFORM_SEQUENCE(brokenVehicles[0].pedIndex, taskSequence)
ENDIF
CLEAR_SEQUENCE_TASK(taskSequence)
SET_PED_MOVEMENT_CLIPSET(brokenVehicles[0].pedIndex, "move_m@JOG@")
trainPedState = TRAIN_STATE_PED_PENDING
ENDIF
ENDIF
ELSE
PRINTLN("VECTOR IS ZERO")
ENDIF
IF GET_ENTITY_DISTANCE_FROM_LOCATION(brokenVehicles[0].blockingIndex, illegalNodes[illegalIdx].vCarPos) < fPanicDist+15
//TOW_TRN_PPE1 //flee
//TOW_TRN_PPS1 //stuck
CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_TRN_PEDA", CONV_PRIORITY_VERY_HIGH)
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)
IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex)
TASK_PERFORM_SEQUENCE(brokenVehicles[0].pedIndex, taskSequence)
ENDIF
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 - 01")
bReverseOrder = TRUE
//Don't get out right away if skipped
IF TIMERB() > 3000
IF UPDATE_BROKEN_VEHICLE_PED(brokenState, 0, "TOW_TRAIN1")
PRINTLN("GOING TO STATE - TRAIN_STATE_PED_END")
trainPedState = TRAIN_STATE_PED_END
ENDIF
ENDIF
BREAK
CASE TRAIN_STATE_PED_END
//DEBUG_MESSAGE("TRAIN_STATE_PED_END")
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC HANDLE_TRAIN_EXPLODING_CAR()
IF NOT IS_ENTITY_DEAD(brokenVehicles[0].blockingIndex) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex)
IF IS_ENTITY_TOUCHING_ENTITY(brokenVehicles[0].blockingIndex, brokenVehicles[0].vehicleIndex)
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("TRAIN IS TOUCHING CAR, LET'S BLOW IT UP")
ENDIF
ENDIF
ENDPROC
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")
// PRINTLN("TRYING TO STOP SOUND 3")
ODDJOB_STOP_SOUND(soundID3)
ENDIF
ELIF NOT IS_PED_IN_VEHICLE(brokenVehicles[0].pedIndex, brokenVehicles[0].vehicleIndex)
// PRINTLN("TRYING TO STOP SOUND 2")
ODDJOB_STOP_SOUND(soundID3)
ELSE
// PRINTLN("bPedInTowTruck IS FALSE - 01")
ENDIF
ENDIF
HANDLE_TRAIN_EXPLODING_CAR()
SWITCH trainState
CASE TRAIN_STATE_PRINT
// DEBUG_MESSAGE("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)
PRINTLN("ADDING BLIP ON TRAIN")
ENDIF
pedTrainDriver = CREATE_PED_INSIDE_VEHICLE(brokenVehicles[0].blockingIndex, PEDTYPE_CIVMALE, S_M_M_LSMETRO_01)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedTrainDriver, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(S_M_M_LSMETRO_01)
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
// DEBUG_MESSAGE("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
DEBUG_MESSAGE("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
DEBUG_MESSAGE("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("TRAIN_BREAKS", soundID2, TRUE, brokenVehicles[0].blockingIndex, 0, 0, 0, "TONYA_03_SOUNDSET")
START_BREAKING_PFX(sparksEffects, brokenVehicles[0].blockingIndex)
ODDJOB_PLAY_SOUND("TRAIN_HORN", soundID, TRUE, brokenVehicles[0].blockingIndex, 0, 0, 0, "TONYA_03_SOUNDSET")
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)
#IF IS_DEBUG_BUILD
// tempb = GET_ENTITY_COORDS(brokenVehicles[0].vehicleIndex)
// fDistanceBetween = VDIST(tempa, tempb)
// PRINTLN("fDistanceBetween = ", fDistanceBetween)
#ENDIF
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
DEBUG_MESSAGE("TRAIN_STATE_STOP")
IF NOT bOutOfVehicle
IF NOT bTowHooked
PRINT_NOW("TOWT_OBJ_03G", DEFAULT_GOD_TEXT_TIME, 1)
ENDIF
ELSE
sLastObjective = "TOWT_OBJ_03G"
ENDIF
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
DEBUG_MESSAGE("TRAIN_STATE_OBJ")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT bOutOfVehicle
IF NOT bTowHooked
PRINT_NOW("TOWT_OBJ_03G", DEFAULT_GOD_TEXT_TIME, 1)
ENDIF
ELSE
sLastObjective = "TOWT_OBJ_03G"
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")
TEXT_LABEL_23 tTestLabel
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")
tTestLabel = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL()
IF bPlayInitialUpsetLine AND NOT bPlayFullConvo
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT bPrintSpecialCaseObj
PRINT_NOW("TOWT_OBJ_06", DEFAULT_GOD_TEXT_TIME, 1)
bPrintSpecialCaseObj = TRUE
ENDIF
IF bPrintSpecialCaseObj AND NOT IS_MESSAGE_BEING_DISPLAYED()
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_SEX_SCAR", CONV_PRIORITY_VERY_HIGH)
PRINTLN("PLAYING CONVO - TOW_SEX_SCAR")
bPlayFullConvo = TRUE
PRINTLN("GOING TO STATE - TOW_PED_CHASE")
pedDialougeState= TOW_PED_CHASE
ENDIF
ENDIF
ENDIF
ENDIF
IF ARE_STRINGS_EQUAL(tTestLabel, "TOW_SEX_SCAR_2")
IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex)
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
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
//Function used by handicap towing to trigger the ped that runs out and complaings that about you towing their car.
//TODO add suport for ped that attacks the player
FUNC BOOL UPDATE_ANGRY_PED()
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
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, A_M_M_GENFAT_01, 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(A_M_M_GENFAT_01)
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 6, brokenVehicles[0].pedIndex, "TOWILLEGALMAN1")
bPedCreated = TRUE
PRINTLN("bPedCreated = TRUE - 05")
angryPedRoot = "TOW_ILLEG2"
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
PRINTLN("bSupressObjective = TRUE 01")
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
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
VECTOR vPlayerPos, vBrokenVehiclePos
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)
// CLEAR_HELP()
// PRINTLN("EXITING EARLY")
EXIT
ENDIF
IF NOT IS_ENTITY_DEAD(myVehicle)
vPlayerPos = GET_ENTITY_COORDS(myVehicle)
ENDIF
IF NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex)
vBrokenVehiclePos = GET_ENTITY_COORDS(brokenVehicles[0].vehicleIndex)
ENDIF
BOOL bProcede = FALSE
IF VDIST2(vPlayerPos, vBrokenVehiclePos) < 900 // 30m
IF NOT IS_TIMER_STARTED(tAdditionalHelpPrintTimer)
START_TIMER_NOW(tAdditionalHelpPrintTimer)
PRINTLN("STARTING TIMER - tAdditionalHelpPrintTimer")
ELSE
IF GET_TIMER_IN_SECONDS(tAdditionalHelpPrintTimer) > 1
bProcede = TRUE
ENDIF
ENDIF
ELSE
IF VDIST2(vPlayerPos, vBrokenVehiclePos) > 2500 //50m
RESTART_TIMER_NOW(tAdditionalHelpPrintTimer)
// PRINTLN("WE'RE TOO FAR AWAY FROM BROKEN DOWN CAR, RESTART TIMER")
ENDIF
ENDIF
IF bProcede
SWITCH iAdditionalHelpPrintStages
CASE 0
IF NOT IS_HELP_MESSAGE_ON_SCREEN()
PRINT_HELP("TOW_TUT_02") // Align the tow truck so its back is flush with the target vehicle.
PRINTLN("PRINTING THIRD ADDITIONAL HELP MESSAGE")
RESTART_TIMER_NOW(tAdditionalHelpPrintTimer)
iAdditionalHelpPrintStages = 1
ENDIF
BREAK
//-------------------------------------------------------------------------
CASE 1
IF IS_TIMER_STARTED(tAdditionalHelpPrintTimer)
IF GET_TIMER_IN_SECONDS(tAdditionalHelpPrintTimer) > 14
IF NOT IS_HELP_MESSAGE_ON_SCREEN()
PRINT_HELP("TOW_TUT_03", DEFAULT_HELP_TEXT_TIME) // Use the ~INPUT_VEH_MOVE_UD~ to lower and raise the crane.
PRINTLN("PRINTING SECOND ADDITIONAL HELP MESSAGE")
RESTART_TIMER_NOW(tAdditionalHelpPrintTimer)
iAdditionalHelpPrintStages = 2
ENDIF
ENDIF
ENDIF
BREAK
//-------------------------------------------------------------------------
CASE 2
IF IS_TIMER_STARTED(tAdditionalHelpPrintTimer)
IF GET_TIMER_IN_SECONDS(tAdditionalHelpPrintTimer) > 14
IF NOT IS_HELP_MESSAGE_ON_SCREEN()
iRand = GET_RANDOM_INT_IN_RANGE() % 2
IF iRand = 0
PRINT_HELP("TOW_TUT_04C") // When a vehicle is attached to the tow truck, hold ~INPUT_VEH_HEADLIGHT~ to unhook the vehicle.
PRINTLN("PRINTING FIRST ADDITIONAL HELP MESSAGE - A")
ELIF iRand = 1
PRINT_HELP("TOWT_HELP_CR") // If a vehicle is attached, the crane can only be raised and lowered while the tow truck is stationary.
PRINTLN("PRINTING FIRST ADDITIONAL HELP MESSAGE - B")
ENDIF
iAdditionalHelpPrintStages = 3
ENDIF
ENDIF
ENDIF
BREAK
//-------------------------------------------------------------------------
CASE 3
BREAK
//-------------------------------------------------------------------------
ENDSWITCH
ENDIF
ENDPROC
FUNC BOOL HANDLE_TONYA_POST_DROPOFF()
VECTOR vPlayerPosition, vTonyaPosition
INT iRandInt
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID())
ENDIF
IF NOT IS_ENTITY_DEAD(pedTonya)
vTonyaPosition = GET_ENTITY_COORDS(pedTonya)
ELSE
vTonyaPosition = <<408.5002, -1624.5825, 29.2928>>
ENDIF
IF VDIST2(vPlayerPosition, vTonyaPosition) > 10000 // 100m
OR IS_ENTITY_DEAD(pedTonya)
// OR IS_PED_INJURED(pedTonya)
STOP_SCRIPTED_CONVERSATION(FALSE)
PRINTLN("RETURNING TRUE - HANDLE_TONYA_POST_DROPOFF")
RETURN TRUE
ENDIF
SWITCH iPostMissionTonyaStages
CASE 0
IF NOT IS_ENTITY_DEAD(pedTonya)
IF GET_SEQUENCE_PROGRESS(pedTonya) = 2
iRandInt = GET_RANDOM_INT_IN_RANGE() % 2
IF iRandInt = 0
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TONYA_CALL1", CONV_PRIORITY_HIGH)
PRINTLN("PLAYING CONVO - TONYA_CALL1")
PRINTLN("iPostMissionTonyaStages = 1")
iPostMissionTonyaStages = 1
ENDIF
ELSE
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TONYA_CALL2", CONV_PRIORITY_HIGH)
PRINTLN("PLAYING CONVO - TONYA_CALL2")
PRINTLN("iPostMissionTonyaStages = 1")
iPostMissionTonyaStages = 1
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF NOT IS_ENTITY_DEAD(pedTonya)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
TASK_START_SCENARIO_AT_POSITION(pedTonya, "WORLD_HUMAN_AA_SMOKE", <<408.5002, -1624.5825, 29.2928>>, 202.6928, -1, TRUE)
PRINTLN("iPostMissionTonyaStages = 2")
iPostMissionTonyaStages = 2
ENDIF
ENDIF
BREAK
CASE 2
IF VDIST2(vPlayerPosition, vTonyaPosition) < 25 //5m
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TONYA_MESS", CONV_PRIORITY_HIGH)
PRINTLN("iPostMissionTonyaStages = 3")
iPostMissionTonyaStages = 3
ENDIF
ENDIF
BREAK
CASE 3
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL HANDLE_TONYA_PHONECALL()
// FLOAT fTemp
IF NOT IS_TIMER_STARTED(tDelayPhoneCallTimer)
START_TIMER_NOW(tDelayPhoneCallTimer)
PRINTLN("tDelayPhoneCallTimer")
ENDIF
// fTemp = GET_TIMER_IN_SECONDS(tDelayPhoneCallTimer)
// PRINTLN("TIME = ", fTemp)
IF IS_TIMER_STARTED(tDelayPhoneCallTimer)
IF GET_TIMER_IN_SECONDS(tDelayPhoneCallTimer) > 7.0
IF NOT bPlayedCellPhoneCall
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
ENDIF
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(), "FRANKLIN")
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 3, NULL, "TONYA")
IF g_savedGlobals.sTowingData.iTowingJobsCompleted = 2
PLAYER_CALL_CHAR_CELLPHONE(MyLocalPedStruct, CHAR_TOW_TONYA, "TOWAUD", "TONYA_WRAP3", CONV_MISSION_CALL)
PRINTLN("TONYA 3 - PHONE CALL WRAP UP")
ELIF g_savedGlobals.sTowingData.iTowingJobsCompleted = 3
PLAYER_CALL_CHAR_CELLPHONE(MyLocalPedStruct, CHAR_TOW_TONYA, "TOWAUD", "TONYA_WRAP4", CONV_MISSION_CALL)
PRINTLN("TONYA 4 - PHONE CALL WRAP UP")
ENDIF
PRINTLN("TONYA - CELL PHONE CALL")
bPlayedCellPhoneCall = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF bPlayedCellPhoneCall AND HAS_CELLPHONE_CALL_FINISHED()
PRINTLN("RETURNING TRUE - TONYA - HAS_ENDING_CELL_PHONE_CALL_COMPLETED")
RETURN TRUE
ELSE
PRINTLN("WAITING FOR CELL PHONE CALL TO FINISH")
ENDIF
RETURN FALSE
ENDFUNC
PROC HANLDE_LEAVING_TOWTRUCK_TO_DROPOFF()
// Special Case Handling of leaving the tow truck
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_ENTITY_DEAD(myVehicle)
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), myVehicle)
// If we're out of the car, remove the impound blip
IF DOES_BLIP_EXIST(blipImpound)
PRINTLN("REMOVING BLIP - blipImpound")
REMOVE_BLIP(blipImpound)
ENDIF
// Add the blip on the tow truck
IF NOT DOES_BLIP_EXIST(myVehicleBlip)
myVehicleBlip = ADD_BLIP_FOR_ENTITY(myVehicle)
SET_BLIP_COLOUR(myVehicleBlip, BLIP_COLOUR_BLUE)
PRINTLN("ADDING BLIP - myVehicleBlip")
ENDIF
ELSE
// We're back in the tow truck, reblip the impound
IF NOT DOES_BLIP_EXIST(blipImpound)
SCRIPT_REMOVE_BLIP_SAFE(blipImpound)
blipImpound = ADD_BLIP_FOR_COORD(<<406.3804, -1635.8673, 28.2928>>)
SET_BLIP_ROUTE(blipImpound, TRUE)
PRINTLN("ADDING BLIP - blipImpound")
ENDIF
// We're back in the tow truck, remove the tow truck blip
IF DOES_BLIP_EXIST(myVehicleBlip)
PRINTLN("REMOVING BLIP - myVehicleBlip")
REMOVE_BLIP(myVehicleBlip)
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL HANDLE_TONYA_DROPOFF()
HANLDE_LEAVING_TOWTRUCK_TO_DROPOFF()
SWITCH iTonyaDropoffStages
CASE 0
vCurDestObjective[0] = <<406.3804, -1635.8673, 28.2928>>
fObjDist = GET_PLAYER_DISTANCE_FROM_LOCATION(vCurDestObjective[0], FALSE)
SCRIPT_REMOVE_BLIP_SAFE(blipImpound)
blipImpound = ADD_BLIP_FOR_COORD(<<406.3804, -1635.8673, 28.2928>>)
SET_BLIP_ROUTE(blipImpound, TRUE)
IF NOT IS_TIMER_STARTED(tLastChatTimer)
START_TIMER_NOW(tLastChatTimer)
PRINTLN("STARTING TIMER - tLastChatTimer")
ELSE
RESTART_TIMER_NOW(tLastChatTimer)
PRINTLN("RESTARTING TIMER - tLastChatTimer")
ENDIF
PRINTLN("iTonyaDropoffStages = 1")
iTonyaDropoffStages = 1
BREAK
//--------------------------------------------------------------------------
CASE 1
IF NOT bPlayedLastConvo
IF NOT IS_MESSAGE_BEING_DISPLAYED()
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_DROPS", CONV_PRIORITY_VERY_HIGH)//, DO_NOT_DISPLAY_SUBTITLES)
PRINTLN("PLAYING THIRD TONYA GOODBYE")
bPlayedLastConvo = TRUE
ENDIF
ENDIF
ELSE
IF NOT bPrintDriveToImpoundObjective
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
PRINT_NOW("TOWT_DRIVE", DEFAULT_GOD_TEXT_TIME, 1)
PRINTLN("bPrintDriveToImpoundObjective = TRUE")
bPrintDriveToImpoundObjective = TRUE
ENDIF
ENDIF
ENDIF
IF NOT bPlayedBackToImpountConvo AND bPlayedLastConvo
IF IS_TIMER_STARTED(tLastChatTimer)
IF GET_TIMER_IN_SECONDS(tLastChatTimer) > 25.0
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_LASTCHAT", CONV_PRIORITY_VERY_HIGH)
bPlayedBackToImpountConvo = TRUE
PRINTLN("bPlayedBackToImpountConvo = TRUE")
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_ENTITY_DEAD(pedTonya) AND NOT IS_ENTITY_DEAD(myVehicle)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), myVehicle) AND IS_PED_IN_VEHICLE(pedTonya, myVehicle)
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<406.3804, -1635.8673, 28.2928>>, <<5,5,LOCATE_SIZE_HEIGHT>>, TRUE)
IF DOES_BLIP_EXIST(blipImpound)
REMOVE_BLIP(blipImpound)
PRINTLN("REMOVING BLIP - blipImpound")
ENDIF
BRING_VEHICLE_TO_HALT(myVehicle, 5.0, 1)
SET_VEHICLE_DOORS_LOCKED(myVehicle, VEHICLELOCK_UNLOCKED)
CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_TUT_ENDC", CONV_PRIORITY_VERY_HIGH)//, DO_NOT_DISPLAY_SUBTITLES)
PRINTLN("PLAYING THIRD TONYA GOODBYE")
RETURN TRUE
ENDIF
ENDIF
ENDIF
BREAK
//--------------------------------------------------------------------------
CASE 2
IF NOT IS_ENTITY_DEAD(pedTonya) AND NOT IS_ENTITY_DEAD(myVehicle)
IF NOT IS_PED_IN_VEHICLE(pedTonya, myVehicle)
PRINTLN("RETURNING TRUE ON HANDLE_TONYA_DROPOFF")
RETURN TRUE
ELSE
PRINTLN("WAITING ON TONYA TO GET OUT")
ENDIF
ENDIF
BREAK
//--------------------------------------------------------------------------
CASE 3
BREAK
//--------------------------------------------------------------------------
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL HANDLE_POST_DROPOFF()
SWITCH iPostDropOffStages
CASE 0
IF NOT IS_ENTITY_DEAD(pedTonya)
IF IS_PED_IN_GROUP(pedTonya)
REMOVE_PED_FROM_GROUP(pedTonya)
PRINTLN("REMOVING TONYA FROM GROUP")
ENDIF
ENDIF
IF NOT bPlayedLastConvo
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_TUT_ENDa", CONV_PRIORITY_VERY_HIGH)//, DO_NOT_DISPLAY_SUBTITLES)
PRINTLN("PLAYING FIRST TONYA GOODBYE - 01")
bPlayedLastConvo = TRUE
ENDIF
ENDIF
IF bPlayedLastConvo
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_ENTITY_DEAD(myVehicle)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), myVehicle)
PRINT_NOW("TOW_OBJ_07", DEFAULT_GOD_TEXT_TIME, 1) // Exit the tow truck.
ENDIF
ENDIF
PRINTLN("iPostDropOffStages = 1")
iPostDropOffStages = 1
ELSE
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_ENTITY_DEAD(myVehicle)
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), myVehicle)
STOP_SCRIPTED_CONVERSATION(FALSE)
PRINTLN("EARLY EXIT: iPostDropOffStages = 1")
iPostDropOffStages = 1
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
//--------------------------------------------------------------------------
CASE 1
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_ENTITY_DEAD(myVehicle)
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), myVehicle)
SET_VEHICLE_DOORS_LOCKED(myVehicle, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
CLEAR_THIS_PRINT("TOW_OBJ_07")
IF NOT IS_ENTITY_DEAD(pedTonya)
IF NOT IS_PED_IN_VEHICLE(pedTonya, myVehicle)
TASK_ENTER_VEHICLE(pedTonya, myVehicle)
PRINTLN("TONYA IS OUTSIDE THE TRUCK, TASK HER TO ENTER")
ELSE
TASK_SHUFFLE_TO_NEXT_VEHICLE_SEAT(pedTonya, myVehicle)
PRINTLN("TONYA IS INSIDE THE TRUCK, TASK HER TO SHUFFLE SEATS")
ENDIF
PRINTLN("iPostDropOffStages = 2")
iPostDropOffStages = 2
ENDIF
ELSE
// Handle player not leaving the tow truck.
IF NOT IS_TIMER_STARTED(tAbandonTimer)
START_TIMER_NOW(tAbandonTimer)
PRINTLN("STARTING TIMER - tAbandonTimer")
ELSE
IF GET_TIMER_IN_SECONDS(tAbandonTimer) > 30
AND bGaveWarning
CLEAR_THIS_PRINT("TOW_OBJ_07")
PRINTLN("bFailedToExit = TRUE")
bFailedToExit = TRUE
ELIF GET_TIMER_IN_SECONDS(tAbandonTimer) > 10
IF NOT bGaveWarning
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TONYA_EXIT", CONV_PRIORITY_HIGH)
PRINTLN("bGaveWarning = TRUE")
bGaveWarning = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
// PRINTLN("FRANKLIN STILL IN TOW TRUCK")
// PRINT_NOW("TOW_OBJ_07", DEFAULT_GOD_TEXT_TIME, 1)
ENDIF
ENDIF
BREAK
//--------------------------------------------------------------------------
CASE 2
IF NOT IS_ENTITY_DEAD(pedTonya) AND NOT IS_ENTITY_DEAD(myVehicle)
IF GET_PED_IN_VEHICLE_SEAT(myVehicle) = pedTonya
TASK_VEHICLE_DRIVE_WANDER(pedTonya, myVehicle, 15, DRIVINGMODE_AVOIDCARS)
PRINTLN("iPostDropOffStages = 3")
iPostDropOffStages = 3
ENDIF
ENDIF
BREAK
//--------------------------------------------------------------------------
CASE 3
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC SAFELY_REMOVE_ASSETS()
VECTOR vPlayerPosition
INT idx
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID())
// PRINTLN("illegalNodes[illegalIdx].vCarPos = ", illegalNodes[illegalIdx].vCarPos)
ENDIF
IF chosenNodeType = NODE_TYPE_HANDI
IF VDIST2(vPlayerPosition, illegalNodes[illegalIdx].vCarPos) > 22500 // 150m
IF DOES_ENTITY_EXIST(brokenVehicles[0].pedIndex) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex)
IF IS_ENTITY_OCCLUDED(brokenVehicles[0].pedIndex)
DELETE_PED(brokenVehicles[0].pedIndex)
PRINTLN("DELETING PED - brokenVehicles[0].pedIndex")
ELSE
SET_PED_AS_NO_LONGER_NEEDED(brokenVehicles[0].pedIndex)
PRINTLN("SETTING PED AS NO LONGER NEEDED - brokenVehicles[0].pedIndex")
ENDIF
ENDIF
REMOVE_ANIM_DICT("oddjobs@towing")
REMOVE_ANIM_DICT("oddjobs@towingangryidle_a")
REMOVE_ANIM_DICT("oddjobs@towingpleadingidle_b")
REMOVE_ANIM_DICT("oddjobs@towingpleadingidle_a")
REMOVE_ANIM_DICT("RANDOM@BICYCLE_THIEF@IDLE_A")
REMOVE_ANIM_DICT("move_m@JOG@")
ELSE
// PRINTLN("FAILING DISTANCE CHECK")
ENDIF
ELIF chosenNodeType = NODE_TYPE_TRAIN
IF VDIST2(vPlayerPosition, illegalNodes[illegalIdx].vCarPos) > 22500 // 150m
IF DOES_ENTITY_EXIST(pedTrainDriver) AND NOT IS_ENTITY_DEAD(pedTrainDriver)
IF IS_ENTITY_OCCLUDED(pedTrainDriver)
DELETE_PED(pedTrainDriver)
PRINTLN("DELETING PED - pedTrainDriver")
ELSE
SET_PED_AS_NO_LONGER_NEEDED(pedTrainDriver)
PRINTLN("SETTING PED AS NO LONGER NEEDED - pedTrainDriver")
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(brokenVehicles[0].blockingIndex) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].blockingIndex)
IF IS_ENTITY_OCCLUDED(brokenVehicles[0].blockingIndex)
DELETE_MISSION_TRAIN(brokenVehicles[0].blockingIndex)
PRINTLN("DELETING MISSION TRAIN - brokenVehicles[0].blockingIndex")
ELSE
SET_VEHICLE_STAYS_FROZEN_WHEN_CLEANED_UP(brokenVehicles[0].blockingIndex, TRUE)
SET_MISSION_TRAIN_AS_NO_LONGER_NEEDED(brokenVehicles[0].blockingIndex)
PRINTLN("SETTING MISSION TRAIN AS NO LONGER NEEDED")
ENDIF
ENDIF
ENDIF
ELIF chosenNodeType = NODE_TYPE_ACCIDENT
REPEAT 2 idx
// Remove bystanders
IF DOES_ENTITY_EXIST(brokenVehicles[0].pedBystanders[idx]) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].pedBystanders[idx])
IF IS_ENTITY_OCCLUDED(brokenVehicles[0].pedBystanders[idx])
DELETE_PED(brokenVehicles[0].pedBystanders[idx])
PRINTLN("DELETING PED - brokenVehicles[0].pedBystanders[idx]")
ELSE
SET_PED_AS_NO_LONGER_NEEDED(brokenVehicles[0].pedBystanders[idx])
PRINTLN("SETTING PED AS NO LONGER NEEDED - brokenVehicles[0].pedBystanders[idx]")
ENDIF
ENDIF
ENDREPEAT
// Ambulance driver
IF DOES_ENTITY_EXIST(helperPed)
SET_PED_AS_NO_LONGER_NEEDED(helperPed)
PRINTLN("SETTING PED AS NO LONGER NEEDED - helperPed")
ENDIF
// Ambulance
IF DOES_ENTITY_EXIST(helperCar)
SET_VEHICLE_AS_NO_LONGER_NEEDED(helperCar)
PRINTLN("SETTING VEHICLE AS NO LONGER NEEDED - helperCar")
ENDIF
REMOVE_ANIM_DICT("REACTION@MALE_STAND@BIG_VARIATIONS@A")
REMOVE_ANIM_DICT("move_m@JOG@")
ENDIF
ENDPROC
PROC HANDLE_TOW_TALK_CONVO()
VECTOR vPlayerPos
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
ENDIF
// Special Case for Tonya 5
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya5")) = 1)
IF NOT bPlayedPostHookupConvo
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_REPAIR", CONV_PRIORITY_VERY_HIGH)
PRINTLN("bPlayedPostHookupConvo = TRUE")
bPlayedPostHookupConvo = TRUE
ENDIF
ELSE
IF bPlayedPostHookupConvo
IF NOT bPrintGoToRepairShop
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
PRINT_NOW("TOWT_OBJ_04", DEFAULT_GOD_TEXT_TIME, 1)
PRINTLN("bPrintGoToRepairShop = TRUE")
bPrintGoToRepairShop = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF VDIST2(vBDVPos, vPlayerPos) > 10000 //100m
SWITCH g_savedGlobals.sTowingData.iTowingJobsCompleted
CASE 0
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_ENTITY_DEAD(pedTonya) AND NOT IS_ENTITY_DEAD(myVehicle)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), myVehicle) AND IS_PED_IN_VEHICLE(pedTonya, myVehicle)
IF NOT bPlayedWayBackConvo
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_TALK", CONV_PRIORITY_HIGH)
bPlayedWayBackConvo = TRUE
PRINTLN("TONYA 1: PLAYING WAY BACK CONVO")
ENDIF
ENDIF
ELSE
IF bInterrupt
IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(MyLocalPedStruct, "TOWAUD", "TOW_TALK", TestResumptionLabel, CONV_PRIORITY_HIGH)
PRINTLN("TRYING TO RESUME INTERRUPTED LINE")
bInterrupt = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_ENTITY_DEAD(pedTonya) AND NOT IS_ENTITY_DEAD(myVehicle)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), myVehicle) AND IS_PED_IN_VEHICLE(pedTonya, myVehicle)
IF NOT bPlayedWayBackConvo
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_TALK2", CONV_PRIORITY_HIGH)
bPlayedWayBackConvo = TRUE
PRINTLN("TONYA 2: PLAYING WAY BACK CONVO")
ENDIF
ENDIF
ELSE
IF bInterrupt
IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(MyLocalPedStruct, "TOWAUD", "TOW_TALK2", TestResumptionLabel, CONV_PRIORITY_HIGH)
PRINTLN("TRYING TO RESUME INTERRUPTED LINE")
bInterrupt = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 4
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_ENTITY_DEAD(pedTonya) AND NOT IS_ENTITY_DEAD(myVehicle)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), myVehicle) AND IS_PED_IN_VEHICLE(pedTonya, myVehicle)
IF NOT bPlayedWayBackConvo
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_CHAT2", CONV_PRIORITY_HIGH)
bPlayedWayBackConvo = TRUE
PRINTLN("TONYA 5: PLAYING WAY BACK CONVO")
ENDIF
ENDIF
ELSE
IF bInterrupt
IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(MyLocalPedStruct, "TOWAUD", "TOW_CHAT2", TestResumptionLabel, CONV_PRIORITY_HIGH)
PRINTLN("TRYING TO RESUME INTERRUPTED LINE")
bInterrupt = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDPROC
PROC HANDLE_NEAR_ENDING_CONVO()
IF NOT bPlayedNearEndingConvo
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya2")) = 1)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<399.885345,-1649.834595,27.294472>>, <<432.558990,-1612.315796,35.341759>>, 35.000000)
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_DROP", CONV_PRIORITY_HIGH)
PRINTLN("bPlayedNearEndingConvo = TRUE")
bPlayedNearEndingConvo = TRUE
ENDIF
ENDIF
ENDIF
ELIF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya5")) = 1)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-233.339386,-1183.597900,21.073008>>, <<-232.138214,-1141.946289,29.081360>>, 29.250000)
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_SHOP", CONV_PRIORITY_HIGH)
PRINTLN("bPlayedNearEndingConvo = TRUE")
bPlayedNearEndingConvo = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC HANDLE_NEW_LOADING_VEHICLES()
// OVERRIDES
IF chosenNodeType = NODE_TYPE_ABANDON
REQUEST_MODEL(PRIMO)
PRINTLN("REQUESTING MODEL - PRIMO")
ELIF chosenNodeType = NODE_TYPE_HANDI
REQUEST_MODEL(landstalker)
PRINTLN("REQUESTING MODEL - landstalker")
REQUEST_MODEL(A_M_M_GENFAT_01)
PRINTLN("REQUESTING MODEL - A_M_M_GENFAT_01")
ELIF chosenNodeType = NODE_TYPE_TRAIN
REQUEST_MODEL(schwarzer)
PRINTLN("REQUESTING MODEL - schwarzer")
REQUEST_MODEL(A_M_M_BEVHILLS_02)
PRINTLN("REQUESTING MODEL - A_M_M_BEVHILLS_02")
ELIF chosenNodeType = NODE_TYPE_DYNAMIC
REQUEST_MODEL(tailgater)
PRINTLN("REQUESTING MODEL - tailgater")
REQUEST_MODEL(A_M_M_TOURIST_01)
PRINTLN("REQUESTING MODEL - A_M_M_TOURIST_01")
ELIF chosenNodeType = NODE_TYPE_ACCIDENT
REQUEST_MODEL(INTRUDER)
PRINTLN("REQUESTING MODEL - INTRUDER")
REQUEST_MODEL(S_M_M_PARAMEDIC_01)
PRINTLN("REQUESTING MODEL - S_M_M_PARAMEDIC_01")
REQUEST_MODEL(A_M_Y_GENSTREET_02)
PRINTLN("REQUESTING MODEL - A_M_Y_GENSTREET_02")
REQUEST_MODEL(A_M_M_BEVHILLS_02)
PRINTLN("REQUESTING MODEL - A_M_M_BEVHILLS_02")
ENDIF
// LOADING
IF chosenNodeType = NODE_TYPE_ABANDON
WHILE NOT HAS_MODEL_LOADED(PRIMO)
PRINTLN("WAITING ON MODEL TO LOAD - PRIMO")
WAIT(0)
ENDWHILE
ELIF chosenNodeType = NODE_TYPE_HANDI
WHILE NOT HAS_MODEL_LOADED(landstalker)
OR NOT HAS_MODEL_LOADED(A_M_M_GENFAT_01)
PRINTLN("WAITING ON MODEL TO LOAD - landstalker, A_M_M_GENFAT_01")
WAIT(0)
ENDWHILE
ELIF chosenNodeType = NODE_TYPE_TRAIN
WHILE NOT HAS_MODEL_LOADED(schwarzer)
OR NOT HAS_MODEL_LOADED(A_M_M_BEVHILLS_02)
PRINTLN("WAITING ON MODEL TO LOAD - schwarzer AND A_M_M_BEVHILLS_02")
WAIT(0)
ENDWHILE
ELIF chosenNodeType = NODE_TYPE_DYNAMIC
WHILE NOT HAS_MODEL_LOADED(tailgater)
OR NOT HAS_MODEL_LOADED(A_M_M_TOURIST_01)
PRINTLN("WAITING ON MODEL TO LOAD - tailgater AND A_M_M_TOURIST_01")
WAIT(0)
ENDWHILE
ELIF chosenNodeType = NODE_TYPE_ACCIDENT
WHILE NOT HAS_MODEL_LOADED(INTRUDER)
OR NOT HAS_MODEL_LOADED(S_M_M_PARAMEDIC_01)
OR NOT HAS_MODEL_LOADED(A_M_Y_GENSTREET_02)
OR NOT HAS_MODEL_LOADED(A_M_M_BEVHILLS_02)
PRINTLN("WAITING ON MODEL TO LOAD - INTRUDER")
WAIT(0)
ENDWHILE
ENDIF
ENDPROC
// initialise mission
FUNC BOOL INIT_MISSION(TOWING_LAUNCH_DATA& launchArgs, LoadQueueLarge &sLoadQueue)
PRINTLN("INSIDE INIT, TIME: ", TIMERA())
SET_AGGRO_FIELDS_TO_NOT_CHECK()
//INIT_ZVOLUME_WIDGETS()
HANDLE_NEW_LOADING_VEHICLES()
//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@")
// PRINTLN("ADDING JOGGER ANIMATION")
ELIF (launchArgs.nodeType = NODE_TYPE_HANDI OR launchArgs.nodeType = NODE_TYPE_ABANDON) AND NOT bDoTutorial
ADD_STREAMED_ANIM(streamReqsAnim, "Ped")
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, "RANDOM@BICYCLE_THIEF@IDLE_A")
ADD_STREAMED_ANIM(streamReqsAnim, "move_m@JOG@")
ENDIF
IF 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)
PRINTLN("REQUESTING MODEL - S_M_M_PARAMEDIC_01")
ADD_STREAMED_ANIM(streamReqsAnim, "move_m@JOG@")
SpecialAnims[0] = "react_big_variations_a"
SpecialAnims[1] = "react_big_variations_b"
SpecialAnims[2] = "react_big_variations_c"
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, "move_m@JOG@")
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)
ENDIF
gbCarList = gbCarList
gbPedList = gbPedList
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)
IF launchArgs.nodeType = NODE_TYPE_HANDI
WHILE NOT HAS_MODEL_LOADED(A_M_M_GENFAT_01)
DEBUG_MESSAGE("Waiting for A_M_M_GENFAT_01 to stream")
UPDATE_LOAD_QUEUE_LARGE(sLoadQueue)
WAIT(0)
ENDWHILE
ENDIF
WHILE NOT ARE_ANIMS_STREAMED(sLoadQueue)
DEBUG_MESSAGE("waiting for anims")
UPDATE_LOAD_QUEUE_LARGE(sLoadQueue)
WAIT(0)
ENDWHILE
WHILE NOT ARE_MODELS_STREAMED(streamReqs)
DEBUG_MESSAGE("Waiting for models to stream")
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()
UPDATE_LOAD_QUEUE_LARGE(sLoadQueue)
DEBUG_MESSAGE("waiting for audio / effects")
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
RETURN TRUE
ENDFUNC
PROC HANDLE_PLAYER_STALL()
FLOAT fTowTruckSpeed
IF NOT IS_ENTITY_DEAD(myVehicle)
fTowTruckSpeed = GET_ENTITY_SPEED(myVehicle)
ENDIF
IF fTowTruckSpeed < 1.0
AND (NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_ENTITY_DEAD(myVehicle) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), myVehicle, TRUE))
IF NOT IS_TIMER_STARTED(tStopTimer)
START_TIMER_NOW(tStopTimer)
PRINTLN("STARTING TIMER - tStopTimer")
ELSE
IF NOT bPlayStopConvo
IF GET_TIMER_IN_SECONDS(tStopTimer) > 30.0
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya3")) = 1)
OR (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya4")) = 1)
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya3")) = 1)
IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) AND IS_PED_IN_VEHICLE(brokenVehicles[0].pedIndex, myVehicle, TRUE)
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_DAWDLE", CONV_PRIORITY_VERY_HIGH)
PRINTLN("bPlayStopConvo = TRUE")
bPlayStopConvo = TRUE
ENDIF
ELSE
IF IS_TIMER_STARTED(tStopTimer)
RESTART_TIMER_NOW(tStopTimer)
ENDIF
ENDIF
ELIF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya4")) = 1)
IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) AND IS_PED_IN_VEHICLE(brokenVehicles[0].pedIndex, myVehicle, TRUE)
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_DAWDLE2", CONV_PRIORITY_VERY_HIGH)
PRINTLN("bPlayStopConvo = TRUE")
bPlayStopConvo = TRUE
ENDIF
ELSE
IF IS_TIMER_STARTED(tStopTimer)
RESTART_TIMER_NOW(tStopTimer)
ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_ENTITY_DEAD(pedTonya) AND IS_PED_IN_VEHICLE(pedTonya, myVehicle, TRUE)
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TONYA_STOP", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES)
PRINTLN("bPlayStopConvo = TRUE")
bPlayStopConvo = TRUE
ENDIF
ELSE
IF IS_TIMER_STARTED(tStopTimer)
RESTART_TIMER_NOW(tStopTimer)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF IS_TIMER_STARTED(tStopTimer)
RESTART_TIMER_NOW(tStopTimer)
ENDIF
ENDIF
ENDPROC
PROC HANDLE_CAR_DAMAGE_DIALOGUE()
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya3")) = 1)
OR (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya4")) = 1)
EXIT
ENDIF
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_ENTITY_DEAD(pedTonya) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(brokenVehicles[0].vehicleIndex, PLAYER_PED_ID())
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT bPlayedDamagedVehicleLine
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TONYA_CARDAM", CONV_PRIORITY_HIGH, DO_NOT_DISPLAY_SUBTITLES)
PRINTLN("bPlayedDamagedVehicleLine = TRUE")
bPlayedDamagedVehicleLine = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL HANDLE_PLAYER_BEING_AWAY_FROM_IMPOUND()
PRINTLN("HANDLE_PLAYER_BEING_AWAY_FROM_IMPOUND")
SWITCH iAwayFromImpoundStages
CASE 0
CLEAR_HELP()
IF NOT DOES_BLIP_EXIST(blipImpound)
SCRIPT_REMOVE_BLIP_SAFE(blipImpound)
blipImpound = ADD_BLIP_FOR_COORD(<<406.3804, -1635.8673, 28.2928>>)
SET_BLIP_ROUTE(blipImpound, TRUE)
ENDIF
PRINT_NOW("TOWT_DRIVE", DEFAULT_GOD_TEXT_TIME, 1)
PRINTLN("iAwayFromImpoundStages = 1")
iAwayFromImpoundStages = 1
BREAK
CASE 1
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_ENTITY_DEAD(pedTonya) AND NOT IS_ENTITY_DEAD(myVehicle)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), myVehicle) AND IS_PED_IN_VEHICLE(pedTonya, myVehicle)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<398.966614,-1641.232666,27.292774>>, <<411.138153,-1626.688721,33.292782>>, 15.000000)
IF DOES_BLIP_EXIST(blipImpound)
REMOVE_BLIP(blipImpound)
PRINTLN("REMOVING BLIP - blipImpound")
ENDIF
BRING_VEHICLE_TO_HALT(myVehicle, 5.0, 1)
SET_VEHICLE_DOORS_LOCKED(myVehicle, VEHICLELOCK_UNLOCKED)
PRINTLN("iAwayFromImpoundStages = 2")
iAwayFromImpoundStages = 2
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
PRINTLN("RETURNING TRUE - HANDLE_PLAYER_BEING_AWAY_FROM_IMPOUND")
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC HANDLE_BLIP_SWITCH()
VECTOR vPlayerPos, vVehiclePos
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
ENDIF
IF NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex)
vVehiclePos = GET_ENTITY_COORDS(brokenVehicles[0].vehicleIndex)
ENDIF
IF VDIST2(vPlayerPos, vVehiclePos) < 100 // 10m
IF NOT bRemovedCoordinateBlip
IF DOES_BLIP_EXIST(brokenVehicles[0].blipIndex)
REMOVE_BLIP(brokenVehicles[0].blipIndex)
PRINTLN("bRemovedCoordinateBlip = TRUE")
bRemovedCoordinateBlip = TRUE
ENDIF
ENDIF
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 - 01")
ELSE
PRINTLN("ENTITY DOES NOT EXIST")
ENDIF
ENDIF
ENDIF
ENDPROC
PROC HANDLE_TONYA_DIALOGUE_HANDI()
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya2")) = 1)
IF NOT IS_ENTITY_DEAD(pedTonya)
AND NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
AND NOT IS_ENTITY_DEAD(myVehicle)
AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), myVehicle) AND IS_PED_IN_VEHICLE(pedTonya, myVehicle)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex)
IF NOT bPlayHookedUpAudio
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_CANGO", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES)
PRINTLN("bPlayHookedUpAudio = TRUE")
bPlayHookedUpAudio = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC HANDLE_PLAYERS_LAST_DRIVEN_VEHICLE()
VECTOR vPlayerPosition, vLastVehiclePosition
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID())
ENDIF
IF DOES_ENTITY_EXIST(vehReplayVehicle) AND NOT IS_ENTITY_DEAD(vehReplayVehicle)
vLastVehiclePosition = GET_ENTITY_COORDS(vehReplayVehicle)
IF NOT bMovedVehicle
IF VDIST2(vPlayerPosition, vLastVehiclePosition) > 40000
IF NOT IS_ENTITY_ON_SCREEN(vehReplayVehicle)
AND NOT IS_BIG_VEHICLE(vehReplayVehicle) // To Fix Bug # 1975611
AND NOT IS_THIS_MODEL_A_BOAT(GET_ENTITY_MODEL(vehReplayVehicle))
AND NOT IS_THIS_MODEL_A_PLANE(GET_ENTITY_MODEL(vehReplayVehicle))
AND NOT IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(vehReplayVehicle))
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya1")) = 1)
SET_ENTITY_COORDS(vehReplayVehicle, <<417.5827, -1645.5754, 28.2928>>)
SET_ENTITY_HEADING(vehReplayVehicle, 230.2828)
PRINTLN("TONYA 1: MOVING VEHICLE TO LOCATION: ", <<417.5827, -1645.5754, 28.2928>>)
SET_VEHICLE_HAS_BEEN_DRIVEN_FLAG(vehReplayVehicle, FALSE)
SET_ENTITY_LOAD_COLLISION_FLAG(vehReplayVehicle, TRUE)
SET_MISSION_VEHICLE_GEN_VEHICLE(vehReplayVehicle, <<417.5827, -1645.5754, 28.2928>>, 230.2828) // Impound Lot
ELIF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya2")) = 1)
SET_ENTITY_COORDS(vehReplayVehicle, <<417.5827, -1645.5754, 28.2928>>)
SET_ENTITY_HEADING(vehReplayVehicle, 230.2828)
PRINTLN("TONYA 2: MOVING VEHICLE TO LOCATION: ", <<417.5827, -1645.5754, 28.2928>>)
SET_VEHICLE_HAS_BEEN_DRIVEN_FLAG(vehReplayVehicle, FALSE)
SET_ENTITY_LOAD_COLLISION_FLAG(vehReplayVehicle, TRUE)
SET_MISSION_VEHICLE_GEN_VEHICLE(vehReplayVehicle, <<417.5827, -1645.5754, 28.2928>>, 230.2828) // Impound Lot
ELIF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya3")) = 1)
SET_ENTITY_COORDS(vehReplayVehicle, <<-214.5613, -1397.9072, 30.2688>>)
SET_ENTITY_HEADING(vehReplayVehicle, 176.0831)
PRINTLN("TONYA 3: MOVING VEHICLE TO LOCATION: ", <<-214.5613, -1397.9072, 30.2688>>)
SET_VEHICLE_HAS_BEEN_DRIVEN_FLAG(vehReplayVehicle, FALSE)
SET_ENTITY_LOAD_COLLISION_FLAG(vehReplayVehicle, TRUE)
SET_MISSION_VEHICLE_GEN_VEHICLE(vehReplayVehicle, <<-214.5613, -1397.9072, 30.2688>>, 176.0831) // Yellow Repair Shop
ELIF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya4")) = 1)
SET_ENTITY_COORDS(vehReplayVehicle, <<537.5104, -168.8889, 53.5066>>)
SET_ENTITY_HEADING(vehReplayVehicle, 358.4492)
PRINTLN("TONYA 3: MOVING VEHICLE TO LOCATION: ", <<537.5104, -168.8889, 53.5066>>)
SET_VEHICLE_HAS_BEEN_DRIVEN_FLAG(vehReplayVehicle, FALSE)
SET_ENTITY_LOAD_COLLISION_FLAG(vehReplayVehicle, TRUE)
SET_MISSION_VEHICLE_GEN_VEHICLE(vehReplayVehicle, <<537.5104, -168.8889, 53.5066>>, 358.4492) // North Repair Shop
ELIF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya5")) = 1)
SET_ENTITY_COORDS(vehReplayVehicle, <<417.5827, -1645.5754, 28.2928>>)
SET_ENTITY_HEADING(vehReplayVehicle, 230.2828)
PRINTLN("TONYA 5: MOVING VEHICLE TO LOCATION: ", <<417.5827, -1645.5754, 28.2928>>)
SET_VEHICLE_HAS_BEEN_DRIVEN_FLAG(vehReplayVehicle, FALSE)
SET_ENTITY_LOAD_COLLISION_FLAG(vehReplayVehicle, TRUE)
SET_MISSION_VEHICLE_GEN_VEHICLE(vehReplayVehicle, <<417.5827, -1645.5754, 28.2928>>, 230.2828) // Impound Lot
ENDIF
bMovedVehicle = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC DISABLE_ALL_CONTROLS_EXCEPT_EXIT()
PRINTLN("DISABLE CONTROLS ON TOW TRUCK")
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_BRAKE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HANDBRAKE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_DUCK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_LR)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_UD)
// DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_AIM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HEADLIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HORN)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_NEXT_RADIO)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_PREV_RADIO)
ENDPROC
PROC ENABLE_CONTROLS_ON_TOWTRUCK()
PRINTLN("ENABLE CONTROLS ON TOW TRUCK")
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_BRAKE)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HANDBRAKE)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_DUCK)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_LR)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_UD)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_AIM)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HEADLIGHT)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HORN)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_NEXT_RADIO)
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_PREV_RADIO)
ENDPROC
PROC HANDLE_TRAIN_REMOVAL()
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")
ENDPROC
//Core logic for the traditional towing modes of broken down and illegally parked
FUNC BOOL UPDATE_TRADITIONAL(TOWING_LAUNCH_DATA launchArgs, LoadQueueLarge &sLoadQueue)
INT openIdx
STRING objective
VECTOR vAngledA, vAngledB, vPlayerPosition
FLOAT fWidth, fDistanceToSite
IF curStage > MISSION_STATE_CONVERSATION
IF bStartTimer
HANDLE_TIMER()
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_DisableVehicleDamageReactions , TRUE)
ENDIF
SWITCH curStage
CASE MISSION_STATE_INTRO
DEBUG_MESSAGE("MISSION_STATE_INTRO")
SET_VEH_RADIO_STATION(myVehicle, "RADIO_03_HIPHOP_NEW")
PRINTLN("SETTING STATION - RADIO_03_HIPHOP_NEW")
IF NOT IS_ENTITY_DEAD(myVehicle)
SET_VEHICLE_DOORS_LOCKED(myVehicle, VEHICLELOCK_LOCKED_NO_PASSENGERS)
PRINTLN("LOCKING PASSENGER DOORS")
ENDIF
IF DOES_ENTITY_EXIST(pedTonya) AND NOT IS_ENTITY_DEAD(pedTonya)
IF IS_PED_IN_GROUP(pedTonya)
REMOVE_PED_FROM_GROUP(pedTonya)
PRINTLN("REMOVING TONYA FROM PLAYER GROUP - TOWING.SCH")
ENDIF
ENDIF
IF chosenNodeType = NODE_TYPE_TRAIN
HANDLE_TRAIN_REMOVAL()
ENDIF
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(), "FRANKLIN")
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 3, pedTonya, "TONYA")
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 4, NULL, "TOWDISPATCH")
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(1, "towing_tonya_franklin_towing", TRUE)
// OVERRIDE_REPLAY_CHECKPOINT_VEHICLE(vehReplayVehicle)
IF chosenNodeType = NODE_TYPE_DYNAMIC
//we need to get starting data
IF GET_POINT(getPointVec, getPointHead, vExtra, vExtra2)
IF NOT IS_TIMER_STARTED(tConvoBufferTimer)
START_TIMER_NOW(tConvoBufferTimer)
PRINTLN("STARTING TIMER - tConvoBufferTimer")
ELSE
RESTART_TIMER_NOW(tConvoBufferTimer)
PRINTLN("RESTARTING TIMER - tConvoBufferTimer")
ENDIF
curStage = MISSION_STATE_CONVERSATION
DEBUG_MESSAGE("Calling GET_POINT")
ENDIF
ELSE
IF NOT IS_TIMER_STARTED(tConvoBufferTimer)
START_TIMER_NOW(tConvoBufferTimer)
PRINTLN("STARTING TIMER - tConvoBufferTimer")
ELSE
RESTART_TIMER_NOW(tConvoBufferTimer)
PRINTLN("RESTARTING TIMER - tConvoBufferTimer")
ENDIF
//we already have our data continue
curStage = MISSION_STATE_CONVERSATION
ENDIF
BREAK
CASE MISSION_STATE_CONVERSATION
DEBUG_MESSAGE("MISSION_STATE_CONVERSATION")
IF chosenNodeType = NODE_TYPE_DYNAMIC
illegalNodes[illegalIdx].vCarPos = <<-476.1537, 132.6556, 62.9586>>
PRINTLN("OVERRIDING CAR POSITION FOR TONYA 4")
ENDIF
IF NOT DOES_BLIP_EXIST(brokenVehicles[0].blipIndex)
IF NOT bWanted
brokenVehicles[0].blipIndex = ADD_BLIP_FOR_COORD(illegalNodes[illegalIdx].vCarPos)
SET_BLIP_COLOUR(brokenVehicles[0].blipIndex, BLIP_COLOUR_BLUE)
SET_BLIP_ROUTE(brokenVehicles[0].blipIndex, TRUE)
SET_BLIP_NAME_FROM_TEXT_FILE(brokenVehicles[0].blipIndex, "TOW_BLIP_VEH")
PRINTLN("CREATING TOWING BLIP - 02")
ELSE
PRINTLN("PLAYER WANTED, NOT ADDING OBJECTIVE BLIP YET")
ENDIF
vCurDestObjective[0] = illegalNodes[illegalIdx].vCarPos
PRINTLN("SETTING vCurDestObjective[0] = ", illegalNodes[illegalIdx].vCarPos)
ENDIF
IF IS_TIMER_STARTED(tConvoBufferTimer)
IF GET_TIMER_IN_SECONDS(tConvoBufferTimer) > fConvoBufferTime
IF NOT IS_MESSAGE_BEING_DISPLAYED()
SWITCH chosenNodeType
CASE NODE_TYPE_DYNAMIC
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(), "FRANKLIN")
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 3, NULL, "TOWDISPATCH")
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_ACC_EXP", CONV_PRIORITY_VERY_HIGH)
PRINTLN("DYNAMIC: GOING TO STATE - MISSION_STATE_CHECK_DISTANCE VIA MISSION_STATE_CONVERSATION")
curStage = MISSION_STATE_CHECK_DISTANCE
ENDIF
BREAK
CASE NODE_TYPE_ABANDON
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 4, NULL, "TOWDISPATCH")
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 3, pedTonya, "TONYA")
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(), "FRANKLIN")
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_ABN_EXP", CONV_PRIORITY_VERY_HIGH)
PRINTLN("ABANDON: GOING TO STATE - MISSION_STATE_CHECK_DISTANCE VIA MISSION_STATE_CONVERSATION")
curStage = MISSION_STATE_CHECK_DISTANCE
ENDIF
BREAK
CASE NODE_TYPE_HANDI
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(), "FRANKLIN")
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 4, NULL, "TOWDISPATCH")
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_HAN_EXP", CONV_PRIORITY_VERY_HIGH)
PRINTLN("HANDI: GOING TO STATE - MISSION_STATE_CHECK_DISTANCE VIA MISSION_STATE_CONVERSATION")
curStage = MISSION_STATE_CHECK_DISTANCE
ENDIF
BREAK
CASE NODE_TYPE_TRAIN
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(), "FRANKLIN")
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 3, NULL, "TOWDISPATCH")
IF illegalIdx = 28
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_TRN_EXP2", CONV_PRIORITY_VERY_HIGH)
PRINTLN("TRAIN: GOING TO STATE - MISSION_STATE_CHECK_DISTANCE VIA MISSION_STATE_CONVERSATION, OVERRIDE USED")
curStage = MISSION_STATE_CHECK_DISTANCE
ENDIF
ELSE
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_TRN_EXP", CONV_PRIORITY_VERY_HIGH)
PRINTLN("TRAIN: GOING TO STATE - MISSION_STATE_CHECK_DISTANCE VIA MISSION_STATE_CONVERSATION")
curStage = MISSION_STATE_CHECK_DISTANCE
ENDIF
ENDIF
BREAK
CASE NODE_TYPE_ACCIDENT
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 1, PLAYER_PED_ID(), "FRANKLIN")
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 4, NULL, "TOWDISPATCH")
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_ACD_EXP", CONV_PRIORITY_VERY_HIGH)
PRINTLN("ACCIDENT: GOING TO STATE - MISSION_STATE_CHECK_DISTANCE VIA MISSION_STATE_CONVERSATION")
curStage = MISSION_STATE_CHECK_DISTANCE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STATE_CHECK_DISTANCE
IF NOT bPrintObjective
IF chosenNodeType = NODE_TYPE_ABANDON
sMyObjective = "TOWT_OBJ_AB"
ELIF chosenNodeType = NODE_TYPE_HANDI
sMyObjective = "TOWT_OBJ_01B"
ELIF chosenNodeType = NODE_TYPE_TRAIN
sMyObjective = "TOWT_OBJ_TR"
ELIF chosenNodeType = NODE_TYPE_DYNAMIC
sMyObjective = "TOWT_OBJ_01"
ELIF chosenNodeType = NODE_TYPE_ACCIDENT
sMyObjective = "TOWT_OBJ_CC"
ENDIF
sLastObjective = sMyObjective
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND NOT bWanted
PRINT_NOW(sMyObjective, DEFAULT_GOD_TEXT_TIME, 1)
PRINTLN("PRINTING OBJECTIVE - sMyObjective")
bPrintObjective = TRUE
ENDIF
ENDIF
IF NOT bStartTimer
IF bPrintObjective
IF NOT IS_MESSAGE_BEING_DISPLAYED()
START_TIMER_NOW(failTimer)
PRINTLN("bStartTimer = TRUE")
bStartTimer = TRUE
ENDIF
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID())
ENDIF
fDistanceToSite = VDIST(vPlayerPosition, illegalNodes[illegalIdx].vCarPos)
// PRINTLN("fDistanceToSite = ", fDistanceToSite)
CHECK_FOR_HOOKING_WRONG_CAR()
HANDLE_PLAYERS_LAST_DRIVEN_VEHICLE()
HANDLE_PLAYER_STALL()
IF fDistanceToSite < 250
IF INIT_MISSION(launchArgs, sLoadQueue)
PRINTLN("ACCIDENT: GOING TO STATE - MISSION_STATE_CREATE VIA MISSION_STATE_INIT")
curStage = MISSION_STATE_CREATE
ENDIF
ENDIF
BREAK
CASE MISSION_STATE_CREATE
DEBUG_MESSAGE("MISSION_STATE_CREATE")
//SETUP_MINIGAME_INSTRUCTIONS(helpScaleform, TRUE, ICON_BUTTON_X,"TOW_CTRL_01", ICON_BUTTON_A,"TOW_CTRL_04", ICON_LSTICK_UPDOWN,"TOW_CTRL_02") //ICON_BUTTON_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()
PRINTLN("GOING TO STATE - MISSION_STATE_PRINTS - NODE_TYPE_DYNAMIC")
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 = <<vCurDestObjective[0].x+15.0, vCurDestObjective[0].y+15.0, vCurDestObjective[0].z+15.0>>
vMax = <<vCurDestObjective[0].x-15.0, vCurDestObjective[0].y-15.0, vCurDestObjective[0].z-15.0>>
// 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")
PRINTLN("GOING TO STATE - MISSION_STATE_PRINTS - NODE_TYPE_ABANDON")
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)
SET_VEHICLE_DOORS_LOCKED(brokenVehicles[0].vehicleIndex, VEHICLELOCK_LOCKED)
PRINTLN("LOCKING DOORS ON SUV IN TONYA 2")
PRINTLN("GOING TO STATE - MISSION_STATE_PRINTS - NODE_TYPE_HANDI")
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)
SET_VEHICLE_DOORS_LOCKED(brokenVehicles[0].vehicleIndex, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
PRINTLN("SETING VEHICLE AS UNDRIVEABLE - TRAIN")
FIND_CLOSE_GARAGE()
PRINTLN("GOING TO STATE - MISSION_STATE_PRINTS - NODE_TYPE_TRAIN")
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()
PRINTLN("GOING TO STATE - MISSION_STATE_PRINTS - NODE_TYPE_ACCIDENT")
curStage = MISSION_STATE_PRINTS
ENDIF
BREAK
DEFAULT
DEBUG_MESSAGE("NO node type selected")
BREAK
ENDSWITCH
BREAK
CASE MISSION_STATE_PED
// DEBUG_MESSAGE("MISSION_STATE_PED")
//TODO this should be pulled out
IF UPDATE_BROKEN_VEHICLE_PED(brokenState, 0, "TOW_BREAK1")
DEBUG_MESSAGE("GOING TO STATE - MISSION_STATE_TOWING - VIA MISSION_STATE_PED")
curStage = MISSION_STATE_TOWING
ENDIF
BREAK
CASE MISSION_STATE_PRINTS
// DEBUG_MESSAGE("MISSION_STATE_PRINTS")
IF chosenNodeType = NODE_TYPE_DYNAMIC
DEBUG_MESSAGE("GOING TO STATE - MISSION_STATE_PED - VIA MISSION_STATE_PRINTS")
curStage = MISSION_STATE_PED
ELSE
DEBUG_MESSAGE("GOING TO STATE - MISSION_STATE_TOWING - VIA MISSION_STATE_PRINTS")
curStage = MISSION_STATE_TOWING
ENDIF
BREAK
CASE MISSION_STATE_TOWING
// DEBUG_MESSAGE("MISSION_STATE_TOWING")
HANDLE_BLIP_SWITCH()
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
IF bTonyaReattachConvo
IF NOT bPrintReattach
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
PRINT_NOW("TOWT_OBJ_03Ga", DEFAULT_GOD_TEXT_TIME, 1)
sLastObjective = "TOWT_OBJ_03Ga"
bPrintReattach = TRUE
ENDIF
ENDIF
ELSE
IF bCarCameUnHooked AND NOT bTonyaReattachConvo
IF bDoTutorial
IF NOT IS_VEHICLE_IN_DROP_OFF_AREA(vAngledA, vAngledB, fWidth)
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TONYA_DETACH", CONV_PRIORITY_VERY_HIGH)
PRINTLN("bTonyaReattachConvo = TRUE - 01")
bTonyaReattachConvo = TRUE
ENDIF
ENDIF
ELSE
IF NOT IS_VEHICLE_IN_DROP_OFF_AREA(vAngledA, vAngledB, fWidth)
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya3")) = 1)
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_LOSTCAR", CONV_PRIORITY_VERY_HIGH)
PRINTLN("bTonyaReattachConvo = TRUE - 02")
bTonyaReattachConvo = TRUE
ENDIF
ELIF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya4")) = 1)
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_CAR_UNHO", CONV_PRIORITY_VERY_HIGH)
PRINTLN("bTonyaReattachConvo = TRUE - 03")
bTonyaReattachConvo = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF g_savedGlobals.sTowingData.iTowingJobsCompleted = 1
OR g_savedGlobals.sTowingData.iTowingJobsCompleted = 2
HANDLE_ADDITIONAL_HELP_PRINTS()
ENDIF
// Special Case Audio for Tonya 2
HANDLE_TONYA_DIALOGUE_HANDI()
IF IS_VECTOR_ZERO(vBDVPos)
IF NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex)
vBDVPos = GET_ENTITY_COORDS(brokenVehicles[0].vehicleIndex)
// PRINTLN("vBDVPos = ", vBDVPos)
ENDIF
ENDIF
HANDLE_PLAYER_STALL()
IF NOT bWanted
IF NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex)
SET_VEHICLE_DISABLE_TOWING(brokenVehicles[0].vehicleIndex, FALSE)
ENDIF
IF CHECK_TOW_ATTACHMENTS(objective, vDest)
// Reset bools
bCarCameUnHooked = FALSE
bTonyaReattachConvo = FALSE
bPrintReattach = FALSE
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)
PRINTLN("ADDING BLIP - brokenVehicles[0].blipIndexPed")
ENDIF
PRINTLN("GOING TO STATE - MISSION_STATE_PED")
curStage = MISSION_STATE_PED
ELSE
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(PROP_FACGATE_08, <<414.9510, -1623.8135, 28.2928>>, FALSE, 1.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(PROP_FACGATE_08, <<415.4840, -1653.1708, 28.2928>>, FALSE, 1.0)
PRINTLN("TRYING TO UNLOCK DOORS AND KEEP OPEN")
curStage = MISSION_STATE_DROPOFF
ENDIF
ENDIF
ELSE
IF NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex)
SET_VEHICLE_DISABLE_TOWING(brokenVehicles[0].vehicleIndex, TRUE)
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
SAFELY_REMOVE_ASSETS()
IF NOT bWanted
HANDLE_TOW_TALK_CONVO()
HANDLE_NEAR_ENDING_CONVO()
HANDLE_PLAYER_STALL()
IF CHECK_TOWING(objective)
SET_VEHICLE_AUTOMATICALLY_ATTACHES(brokenVehicles[0].vehicleIndex, FALSE)
SET_VEHICLE_DOORS_LOCKED(brokenVehicles[0].vehicleIndex, VEHICLELOCK_LOCKED)
PRINTLN("SETTING VEHICLE DOORS TO BE LOCKED ON BROKEN DOWN VEHCLE")
SET_VEHICLE_HAS_BEEN_DRIVEN_FLAG(myVehicle, FALSE)
IF curBrokenCarCount = 0
bDisplayHelp = FALSE
DEBUG_MESSAGE("curBrokenCarCount = 0")
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya1")) = 1)
OR (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya2")) = 1)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<395.946442,-1647.358887,26.292782>>, <<414.978851,-1623.999634,35.292778>>, 23.250000)
PRINTLN("GOING TO STATE - MISSION_STATE_POST_DROPOFF VIA - MISSION_STATE_DROPOFF")
curStage = MISSION_STATE_POST_DROPOFF
ELSE
PRINTLN("GOING TO STATE - MISSION_STATE_SPECIAL_CASE VIA - MISSION_STATE_DROPOFF")
curStage = MISSION_STATE_SPECIAL_CASE
ENDIF
ELIF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya3")) = 1)
OR (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya4")) = 1)
PRINTLN("GOING TO STATE - MISSION_STATE_TONYA_PHONE_CALL")
curStage = MISSION_STATE_TONYA_PHONE_CALL
ELSE
PRINTLN("GOING TO STATE - MISSION_STATE_DROPOFF_TONYA")
curStage = MISSION_STATE_DROPOFF_TONYA
ENDIF
ELSE
PRINTLN("curBrokenCarCount = ", curBrokenCarCount)
ENDIF
ENDIF
ELSE
IF NOT IS_ENTITY_DEAD(myVehicle) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex)
bTowHooked = IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex)
ENDIF
ENDIF
BREAK
CASE MISSION_STATE_SPECIAL_CASE
IF HANDLE_PLAYER_BEING_AWAY_FROM_IMPOUND()
PRINTLN("GOING TO STATE - MISSION_STATE_POST_DROPOFF VIA - MISSION_STATE_SPECIAL_CASE")
curStage = MISSION_STATE_POST_DROPOFF
ENDIF
BREAK
CASE MISSION_STATE_DROPOFF_TONYA
IF HANDLE_TONYA_DROPOFF()
PRINTLN("GOING TO STATE - MISSION_STATE_POST_DROPOFF VIA - MISSION_STATE_DROPOFF")
curStage = MISSION_STATE_POST_DROPOFF
ENDIF
BREAK
CASE MISSION_STATE_POST_DROPOFF
PRINTLN("MISSION_STATE_POST_DROPOFF")
IF DOES_BLIP_EXIST(blipImpound)
REMOVE_BLIP(blipImpound)
ENDIF
// SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
DISABLE_ALL_CONTROLS_EXCEPT_EXIT() // To Fix Bug # 1527410
SET_VEHICLE_DOORS_LOCKED(myVehicle, VEHICLELOCK_UNLOCKED)
PRINTLN("SETTING VEHICLE DOORS TO BE UNLOCKED ON TOW TRUCK")
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya1")) = 1)
IF NOT bPlayedLastConvo
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_TUT_ENDa", CONV_PRIORITY_VERY_HIGH)//, DO_NOT_DISPLAY_SUBTITLES)
PRINTLN("PLAYING FIRST TONYA GOODBYE")
bPlayedLastConvo = TRUE
ENDIF
ENDIF
ELIF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya2")) = 1)
IF NOT bPlayedLastConvo
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_TUT_ENDb", CONV_PRIORITY_VERY_HIGH)//, DO_NOT_DISPLAY_SUBTITLES)
PRINTLN("PLAYING FIRST TONYA GOODBYE")
bPlayedLastConvo = TRUE
ENDIF
ENDIF
ELIF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya5")) = 1)
IF NOT bPlayedLastConvo
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD","TOW_TUT_ENDc", CONV_PRIORITY_VERY_HIGH)//, DO_NOT_DISPLAY_SUBTITLES)
PRINTLN("PLAYING FIRST TONYA GOODBYE")
bPlayedLastConvo = TRUE
ENDIF
ENDIF
ENDIF
IF bPlayedLastConvo
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
CLEAR_SEQUENCE_TASK(taskSequence)
OPEN_SEQUENCE_TASK(taskSequence)
TASK_LEAVE_ANY_VEHICLE(NULL, 0)
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 LEAVE VEHICLE AND USE SCENARIO")
ENDIF
// CLEAR_SEQUENCE_TASK(taskSequence)
PRINTLN("GOING TO STATE - MISSION_STATE_ENDUI_SETUP VIA - MISSION_STATE_DROPOFF")
curStage = MISSION_STATE_ENDUI_SETUP
ENDIF
ENDIF
BREAK
CASE MISSION_STATE_TONYA_PHONE_CALL
IF HANDLE_TONYA_PHONECALL()
PRINTLN("GOING TO STATE - MISSION_STATE_ENDUI_SETUP VIA - MISSION_STATE_TONYA_PHONE_CALL")
curStage = MISSION_STATE_ENDUI_SETUP
ENDIF
BREAK
CASE MISSION_STATE_ENDUI_SETUP
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya1")) = 1)
OR (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya2")) = 1)
OR (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya5")) = 1)
DISABLE_ALL_CONTROLS_EXCEPT_EXIT()
ENDIF
HANDLE_TOW_SUCCESS()
CLEAR_HELP()
IF iTotalPayment > 0
CREDIT_BANK_ACCOUNT(GET_CURRENT_PLAYER_PED_ENUM(), BAAC_UNLOGGED_SMALL_ACTION, iTotalPayment)
ENDIF
IF NOT IS_TIMER_STARTED(tEndingTimer)
START_TIMER_NOW(tEndingTimer)
PRINTLN("STARTING tEndingTimer")
ENDIF
PRINTLN("GOING TO STATE - MISSION_STATE_COMPLETE")
curStage = MISSION_STATE_COMPLETE
BREAK
CASE MISSION_STATE_COMPLETE
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya1")) = 1)
OR (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya2")) = 1)
OR (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya5")) = 1)
DISABLE_ALL_CONTROLS_EXCEPT_EXIT()
ENDIF
IF IS_TIMER_STARTED(tEndingTimer)
IF GET_TIMER_IN_SECONDS(tEndingTimer) > 3.0
ENABLE_CONTROLS_ON_TOWTRUCK() // To Fix Bug # 1527410
// SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
RETURN TRUE
ENDIF
ENDIF
BREAK
ENDSWITCH
fUnhookStartTime = fUnhookStartTime
bRammedVehicle = bRammedVehicle
fTotalPayment = fTotalPayment
vImpound[0] = vImpound[0]
RETURN FALSE
ENDFUNC
FUNC VECTOR CONVERT_ROTATION_TO_DIRECTION_VECTOR(VECTOR vRot)
RETURN <<-SIN(vRot.z) * COS(vRot.x), COS(vRot.z) * COS(vRot.x), SIN(vRot.x)>>
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
FUNC BOOL IS_PED_IN_BROKEN_VEHICLE()
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya3")) = 1)
OR (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya4")) = 1)
IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex)
IF IS_PED_IN_VEHICLE(brokenVehicles[0].pedIndex, brokenVehicles[0].vehicleIndex)
PRINTLN("IS_PED_IN_BROKEN_VEHICLE IS TRUE")
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL UPDATE_DIST_FAIL_CONDITIONS()
BOOL bGarage = FALSE
BOOL bCar = FALSE
STRING sLine
// PRINTLN("vCurDestObjective[0] = ", vCurDestObjective[0])
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
PRINTLN("PLAYER IS WANTED - RETURN FALSE")
RETURN FALSE
ENDIF
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 + 250)
IF NOT bDistWarned
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
IF NOT IS_PED_IN_BROKEN_VEHICLE()
IF CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", sLine, CONV_PRIORITY_VERY_HIGH)
PRINTLN("PLAYING RETURN LINE")
bDistWarned = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF GET_PLAYER_DISTANCE_FROM_LOCATION(vCurDestObjective[0], FALSE) > (fObjDist + FAIL_DISTANCE)
IF IS_PED_IN_BROKEN_VEHICLE()
PRINTLN("failReason = FAIL_ABANDONED_DRIVER")
failReason = FAIL_ABANDONED_DRIVER
RETURN TRUE
ELSE
PRINTLN("Pringing abandon job because distance to cur objective is bigger than fObjDist + Fail")
failReason = FAIL_ABANDONED_JOB
RETURN TRUE
ENDIF
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
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 4, NULL, "TOWDISPATCH")
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 4, NULL, "TOWDISPATCH")
CREATE_CONVERSATION(MyLocalPedStruct, "TOWAUD", "TOW_DISP3", CONV_PRIORITY_VERY_HIGH)
//Do dialouge here to warn the player
ENDIF
ENDIF
IF NOT bPrintHurryHelp
IF curStage = MISSION_STATE_DROPOFF
IF bTimeWarned
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
PRINT_HELP("TOWT_HELP_TM")
bPrintHurryHelp = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//PRINTLN("Fail timer",GET_TIMER_IN_SECONDS(failTimer))
IF TIMER_DO_WHEN_READY(failTimer, FAIL_TIME_TOTAL)
failReason = FAIL_TIME_EXPIRED_TOTAL
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL ARE_TIRES_BURST()
// Mid and Front
IF IS_VEHICLE_TYRE_BURST(myVehicle, SC_WHEEL_CAR_MID_LEFT)
AND IS_VEHICLE_TYRE_BURST(myVehicle, SC_WHEEL_CAR_MID_RIGHT)
AND IS_VEHICLE_TYRE_BURST(myVehicle, SC_WHEEL_CAR_FRONT_RIGHT)
AND IS_VEHICLE_TYRE_BURST(myVehicle, SC_WHEEL_CAR_FRONT_LEFT)
PRINTLN("CHECK 1: RETURNING TRUE ON ARE_TIRES_BURST")
RETURN TRUE
ENDIF
// Rear and Front
IF IS_VEHICLE_TYRE_BURST(myVehicle, SC_WHEEL_CAR_REAR_LEFT)
AND IS_VEHICLE_TYRE_BURST(myVehicle, SC_WHEEL_CAR_REAR_RIGHT)
AND IS_VEHICLE_TYRE_BURST(myVehicle, SC_WHEEL_CAR_FRONT_RIGHT)
AND IS_VEHICLE_TYRE_BURST(myVehicle, SC_WHEEL_CAR_FRONT_LEFT)
PRINTLN("CHECK 2: RETURNING TRUE ON ARE_TIRES_BURST")
RETURN TRUE
ENDIF
// Rear and Mid
IF IS_VEHICLE_TYRE_BURST(myVehicle, SC_WHEEL_CAR_REAR_LEFT)
AND IS_VEHICLE_TYRE_BURST(myVehicle, SC_WHEEL_CAR_REAR_RIGHT)
AND IS_VEHICLE_TYRE_BURST(myVehicle, SC_WHEEL_CAR_MID_LEFT)
AND IS_VEHICLE_TYRE_BURST(myVehicle, SC_WHEEL_CAR_MID_RIGHT)
PRINTLN("CHECK 3: RETURNING TRUE ON ARE_TIRES_BURST")
RETURN TRUE
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 bFailedToExit
PRINTLN("FAIL - FAIL_FRANKLIN_NO_EXIT")
failReason = FAIL_FRANKLIN_NO_EXIT
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) > 50*50
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
OR ARE_TIRES_BURST()
DEBUG_MESSAGE("myVehicle isn't driveable")
failReason = FAIL_TRANSPORT_DESTROYED
RETURN TRUE
ENDIF
ELSE
PRINTLN("myVehicle DOESN'T EXIST")
failReason = FAIL_TRANSPORT_DESTROYED
RETURN TRUE
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 curStage <= MISSION_STATE_DROPOFF
IF UPDATE_TIME_FAIL_CONDITIONS()
RETURN TRUE
ENDIF
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
ENDIF
ENDIF
BREAK
ENDSWITCH
BREAK
ENDSWITCH
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
IF IS_VEHICLE_STUCK_TIMER_UP(myVehicle, VEH_STUCK_ON_ROOF, ROOF_TIME)
OR IS_VEHICLE_STUCK_TIMER_UP(myVehicle, VEH_STUCK_ON_SIDE, SIDE_TIME)
OR IS_VEHICLE_STUCK_TIMER_UP(myVehicle, VEH_STUCK_HUNG_UP, HUNG_UP_TIME)
OR IS_VEHICLE_STUCK_TIMER_UP(myVehicle, VEH_STUCK_JAMMED, JAMMED_TIME)
PRINTLN("STUCK TIMER - FAIL")
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_MinigameFailed)
//SET_BITMASK_AS_ENUM(g_savedGlobals.sTowingData.iBools, TOW_GLOBAL_60_DELAY)
//ODDJOB_AUTO_SAVE()
//MISSION_CLEANUP()
//SET_BITMASK_AS_ENUM(launchArgs.iTowFlags, TOWING_FLAG_PASSED)
//RETURN TRUE
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
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), <<401.6370, -1633.3003, 28.2928>>)
ENDIF
SET_ENTITY_HEADING(myVehicle, 231.5304)
ENDPROC
// debug builds only
#IF IS_DEBUG_BUILD
VECTOR vCoordinatesToWarp
FLOAT fHeadingToWarp
VECTOR vVehiclePosition
FLOAT fVehicleHeading, fTemp
// 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)
STOP_SCRIPTED_CONVERSATION(FALSE)
vTemp = vCurDestObjective[0]
IF NOT bTowHooked
IF NOT IS_ENTITY_DEAD(myVehicle)
IF chosenNodeType = NODE_TYPE_ABANDON
vTemp = <<226.5837, -854.3120, 28.9568>>
fTemp = 250.4885
PRINTLN("J-SKIPPING: ABANDON")
PRINTLN("vTemp = ", vTemp)
PRINTLN("fTemp = ", fTemp)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), vTemp)
SET_ENTITY_HEADING(myVehicle, fTemp)
ENDIF
IF DOES_ENTITY_EXIST(brokenVehicles[0].vehicleIndex) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex)
IF NOT IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(brokenVehicles[0].vehicleIndex, myVehicle)
ATTACH_VEHICLE_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex, -1, <<0,2.0,0>>)
PRINTLN("ATTACHING BROKEN DOWN VEHICLE TO TOW TRUCK")
ENDIF
ENDIF
ELIF chosenNodeType = NODE_TYPE_HANDI
vTemp = <<-604.2744, -889.6982, 24.1644>>
fTemp = 87.4990
PRINTLN("J-SKIPPING: HANDI")
PRINTLN("vTemp = ", vTemp)
PRINTLN("fTemp = ", fTemp)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), vTemp)
SET_ENTITY_HEADING(myVehicle, fTemp)
ENDIF
IF DOES_ENTITY_EXIST(brokenVehicles[0].vehicleIndex) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex)
IF NOT IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(brokenVehicles[0].vehicleIndex, myVehicle)
ATTACH_VEHICLE_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex, -1, <<0,-1.5,0>>)
PRINTLN("ATTACHING BROKEN DOWN VEHICLE TO TOW TRUCK")
ENDIF
ENDIF
ELIF chosenNodeType = NODE_TYPE_TRAIN
vTemp = <<211.1113, -2545.6040, 4.8816>>
fTemp = 98.9786
PRINTLN("J-SKIPPING: TRAIN")
PRINTLN("vTemp = ", vTemp)
PRINTLN("fTemp = ", fTemp)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), vTemp)
SET_ENTITY_HEADING(myVehicle, fTemp)
ENDIF
IF DOES_ENTITY_EXIST(brokenVehicles[0].vehicleIndex) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex)
IF NOT IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(brokenVehicles[0].vehicleIndex, myVehicle)
ATTACH_VEHICLE_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex, -1, <<0,1.5,0>>)
PRINTLN("ATTACHING BROKEN DOWN VEHICLE TO TOW TRUCK")
ENDIF
ENDIF
ELIF chosenNodeType = NODE_TYPE_DYNAMIC
vTemp = <<-469.1497, 132.3600, 63.1074>>
fTemp = 267.6505
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), vTemp)
SET_ENTITY_HEADING(myVehicle, fTemp)
ENDIF
IF DOES_ENTITY_EXIST(brokenVehicles[0].vehicleIndex) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex)
IF NOT IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(brokenVehicles[0].vehicleIndex, myVehicle)
ATTACH_VEHICLE_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex, -1, <<0,-1.5,0>>)
PRINTLN("ATTACHING BROKEN DOWN VEHICLE TO TOW TRUCK")
ENDIF
ENDIF
ELIF chosenNodeType = NODE_TYPE_ACCIDENT
vTemp = <<-698.9984, -844.8035, 22.5729>>
fTemp = 66.5962
PRINTLN("J-SKIPPING: ACCIDENT")
PRINTLN("vTemp = ", vTemp)
PRINTLN("fTemp = ", fTemp)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), vTemp)
SET_ENTITY_HEADING(myVehicle, fTemp)
ENDIF
IF DOES_ENTITY_EXIST(brokenVehicles[0].vehicleIndex) AND NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex)
IF NOT IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(brokenVehicles[0].vehicleIndex, myVehicle)
ATTACH_VEHICLE_TO_TOW_TRUCK(myVehicle, brokenVehicles[0].vehicleIndex, -1, <<0,-2.0,0>>)
PRINTLN("ATTACHING BROKEN DOWN VEHICLE TO TOW TRUCK")
ENDIF
ENDIF
ELSE
vVehiclePosition = GET_ENTITY_COORDS(brokenVehicles[0].vehicleIndex)
fVehicleHeading = GET_ENTITY_HEADING(brokenVehicles[0].vehicleIndex)
PRINTLN("fVehicleHeading = ", fVehicleHeading)
vTemp = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vVehiclePosition, fVehicleHeading, <<0,8,0>>)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), vTemp)
SET_ENTITY_HEADING(myVehicle, fVehicleHeading)
PRINTLN("J-SKIPPING: DEFAULT")
ENDIF
ENDIF
ELSE
PRINTLN("FAILING THIS CHECK - 01")
ENDIF
ELSE
IF ARE_VECTORS_ALMOST_EQUAL(vTemp, <<401.6046, -1632.7806, 28.2928>>)
vCoordinatesToWarp = <<405.6677, -1630.7886, 28.2928>>
fHeadingToWarp = 315.0
PRINTLN("J-SKIPPING: HOOOKED - VECTOR = ", vCoordinatesToWarp)
ELSE
vCoordinatesToWarp = vTemp
fHeadingToWarp = 24.3
PRINTLN("J-SKIPPING: NOT HOOOKED - VECTOR = ", vCoordinatesToWarp)
ENDIF
IF NOT ARE_VECTORS_ALMOST_EQUAL(vCoordinatesToWarp, <<0,0,0>>)
SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), vCoordinatesToWarp)
SET_ENTITY_HEADING(PLAYER_PED_ID(), fHeadingToWarp)
PRINTLN("USING ALTERNATE HEADING")
ENDIF
ENDIF
IF bTowHooked
IF IS_ENTITY_AT_COORD(myVehicle, vCoordinatesToWarp, <<20,20,20>>)
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)
PRINTLN("DETACHING VEHICLE")
ENDIF
ENDIF
ELSE
PRINTLN("NOT AT RIGHT COORDINATE")
ENDIF
ELSE
PRINTLN("bTowHooked IS FALSE")
ENDIF
IF chosenNodeType = NODE_TYPE_ACCIDENT
IF curStage = MISSION_STATE_DROPOFF_TONYA
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), <<406.3804, -1635.8673, 28.2928>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 315.0)
PRINTLN("J-SKIPPING: DROPPING OFF TONYA")
ENDIF
ENDIF
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()
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
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
iPedID = 2
PRINTLN("iPedID = ", iPedID)
ELSE
sCharacterName = "TOWABDATTACKM"//, TOWABDNATTACKF,
iPedID = 2
PRINTLN("iPedID = ", iPedID)
ENDIF
BREAK
CASE NODE_TYPE_ACCIDENT
//No peds in accident variation
BREAK
CASE NODE_TYPE_DYNAMIC
sCharacterName = "TOWBREAKDOWN1"//, TOWBREAKF
iPedID = 3
PRINTLN("iPedID = ", iPedID)
BREAK
CASE NODE_TYPE_HANDI
sCharacterName = "TOWHANDIBEGM" //, TOWHANDIBEGF
iPedID = 5
PRINTLN("iPedID = ", iPedID)
BREAK
CASE NODE_TYPE_TRAIN
sCharacterName = "TOWTRAINM" //, TOWTRAINF
iPedID = 3
PRINTLN("iPedID = ", iPedID)
BREAK
ENDSWITCH
ENDPROC
PROC HANDLE_TONYA_BLIPPING_TO_ENTER_CAR(VEHICLE_INDEX& vehTruck)
VEHICLE_INDEX vToCheck
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
vToCheck = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
ELIF NOT bTonyaAbandonWarning
CLEAR_THIS_PRINT("TOWT_WAIT")
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0
IF NOT DOES_BLIP_EXIST(myVehicleBlip)
myVehicleBlip = ADD_BLIP_FOR_ENTITY(vehTruck)
SET_BLIP_COLOUR(myVehicleBlip, BLIP_COLOUR_BLUE)
SET_BLIP_ROUTE(myVehicleBlip, TRUE)
PRINTLN("ADDING BACK IN TOW TRUCK BLIP")
ENDIF
ENDIF
IF DOES_BLIP_EXIST(blipTonya)
REMOVE_BLIP(blipTonya)
PRINTLN("REMOVING TONYA BLIP - EARLY")
ENDIF
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
AND NOT IS_ENTITY_DEAD(pedTonya)
AND DOES_ENTITY_EXIST(vToCheck)
AND NOT IS_ENTITY_DEAD(vToCheck)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vToCheck) AND NOT IS_PED_IN_VEHICLE(pedTonya, vToCheck)
CLEAR_THIS_PRINT("TOW_TUT_INTRUCK")
// Remove blip
IF DOES_BLIP_EXIST(myVehicleBlip)
REMOVE_BLIP(myVehicleBlip)
PRINTLN("REMOVING TRUCK BLIP - EARLY 01")
ENDIF
IF NOT DOES_BLIP_EXIST(blipTonya)
blipTonya = ADD_BLIP_FOR_ENTITY(pedTonya)
SET_BLIP_COLOUR(blipTonya, BLIP_COLOUR_BLUE)
SET_BLIP_SCALE(blipTonya, BLIP_SIZE_PED)
PRINTLN("ADDING TONYA BLIP - EARLY 01")
ENDIF
IF NOT bPrintAllowTonyaToEnter
PRINT("TOWT_WAIT", DEFAULT_GOD_TEXT_TIME, 1)
PRINTLN("SETTING - bPrintAllowTonyaToEnter = TRUE")
bPrintAllowTonyaToEnter = TRUE
ENDIF
ELSE
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vToCheck) AND IS_PED_IN_VEHICLE(pedTonya, vToCheck)
// Remove blip
IF DOES_BLIP_EXIST(blipTonya)
REMOVE_BLIP(blipTonya)
PRINTLN("REMOVING TONYA BLIP - EARLY")
ENDIF
CLEAR_THIS_PRINT("TOWT_WAIT")
// Update blip for truck
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0
IF NOT DOES_BLIP_EXIST(myVehicleBlip)
myVehicleBlip = ADD_BLIP_FOR_ENTITY(vehTruck)
SET_BLIP_COLOUR(myVehicleBlip, BLIP_COLOUR_BLUE)
SET_BLIP_ROUTE(myVehicleBlip, TRUE)
PRINTLN("ADDING BACK IN TOW TRUCK BLIP")
ENDIF
ENDIF
bPrintAllowTonyaToEnter = FALSE
ENDIF
ENDIF
ENDIF
ENDPROC
PROC HANDLE_REBLIP_TONYA_ABANDON_CHECK(BOOL bCheckCar = TRUE)
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(myVehicleBlip)
IF DOES_ENTITY_EXIST(myVehicle) AND NOT IS_ENTITY_DEAD(myVehicle)
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), myVehicle)
myVehicleBlip = ADD_BLIP_FOR_ENTITY(myVehicle)
PRINTLN("ADDING IN BLIP - myVehicleBlip VIA HANDLE_REBLIP_TONYA_ABANDON_CHECK")
IF curStage = MISSION_STATE_INTRO
SET_BLIP_COLOUR(myVehicleBlip, BLIP_COLOUR_BLUE)
SET_BLIP_ROUTE(myVehicleBlip, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF bCheckCar
IF NOT DOES_BLIP_EXIST(brokenVehicles[0].blipIndex)
IF NOT IS_VECTOR_ZERO(vCurDestObjective[0])
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
ENDIF
ENDPROC
FUNC BOOL HAS_PLAYER_ABANDONED_TONYA(BOOL bCheckCar = TRUE)
VECTOR vPlayerPostion, vTonyaPosition
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
OR bOutOfVehicle
RETURN FALSE
ENDIF
ENDIF
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 DOES_ENTITY_EXIST(pedTonya) AND NOT IS_ENTITY_DEAD(pedTonya)
IF VDIST2(vPlayerPostion, vTonyaPosition) > 20*20
IF NOT bTonyaAbandonWarning
CLEAR_PRINTS()
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
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 = CREATE_BLIP_FOR_ENTITY(pedTonya)
SET_BLIP_COLOUR(blipTonya, BLIP_COLOUR_BLUE)
PRINTLN("ADDING BLIP - blipTonya")
ENDIF
ENDIF
IF DOES_BLIP_EXIST(myVehicleBlip)
REMOVE_BLIP(myVehicleBlip)
PRINTLN("REMOVING BLIP - myVehicleBlip")
ENDIF
IF bCheckCar
IF DOES_BLIP_EXIST(brokenVehicles[0].blipIndex)
REMOVE_BLIP(brokenVehicles[0].blipIndex)
PRINTLN("REMOVING BLIP - brokenVehicles[0].blipIndex")
ENDIF
ENDIF
bCurrentlyTonyaAbandoned = TRUE
ENDIF
IF NOT bPlayAbandonLine
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF CREATE_CONVERSATION(pedConvo, "TOWAUD", "TONYA_ABAN", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES)
PRINTLN("PLAYING ABANDON LINE")
bPlayAbandonLine = TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF VDIST2(vPlayerPostion, vTonyaPosition) < 20*20
bPlayAbandonLine = FALSE
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(pedTonya)
HANDLE_REBLIP_TONYA_ABANDON_CHECK()
bCurrentlyTonyaAbandoned = FALSE
ENDIF
ELSE
HANDLE_REBLIP_TONYA_ABANDON_CHECK()
bCurrentlyTonyaAbandoned = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(pedTonya) AND NOT IS_ENTITY_DEAD(pedTonya)
IF VDIST2(vPlayerPostion, vTonyaPosition) > 150*150
IF bTonyaAbandonWarning
PRINTLN("RETURNING TRUE - HAS_PLAYER_ABANDONED_TONYA")
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC HANDLE_TONYA_FOOTSTEPS()
VECTOR vPlayerPos, vTonyaPos
IF NOT DOES_ENTITY_EXIST(pedTonya)
EXIT
ENDIF
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
ENDIF
IF NOT IS_ENTITY_DEAD(pedTonya)
vTonyaPos = GET_ENTITY_COORDS(pedTonya)
ENDIF
IF VDIST2(vPlayerPos, vTonyaPos) < 25 // 5m
SET_FORCE_FOOTSTEP_UPDATE(pedTonya, TRUE)
ELSE
SET_FORCE_FOOTSTEP_UPDATE(pedTonya, FALSE)
ENDIF
ENDPROC
PROC HANDLE_TONYA_NO_PUNCHING()
IF DOES_ENTITY_EXIST(pedTonya) AND NOT IS_ENTITY_DEAD(pedTonya)
SET_PED_RESET_FLAG(pedTonya, PRF_DisablePlayerMeleeFriendlyAttacks, TRUE)
ENDIF
ENDPROC
PROC HANDLE_TONYA_PEDS_FLEE()
IF DOES_ENTITY_EXIST(pedTonya) AND NOT IS_ENTITY_DEAD(pedTonya)
IF IS_PED_IN_GROUP(pedTonya)
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
ENDIF
ENDIF
ENDPROC
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))
AND (GET_ENTITY_MODEL(vehPlayer) != TOWTRUCK)
SET_VEHICLE_ON_GROUND_PROPERLY(vehPlayer)
ELSE
IF (GET_ENTITY_MODEL(vehPlayer) != TOWTRUCK)
PRINTLN("REPLAY VEHICLE IS A TOW TRUCK")
ENDIF
PRINTLN("DELETING REPLAY VEHICLE - DID NOT PASS TEST")
DELETE_VEHICLE(vehPlayer)
ENDIF
ENDIF
ENDPROC
//STRUCT
// main script
FUNC BOOL DO_TOWING_CORE(TOWING_LAUNCH_DATA& launchArgs, LoadQueueLarge &sLoadQueue)
// DEBUG_MESSAGE("DO_TOWING_CORE")
IF launchArgs.bInit
launchArgs.bInit = FALSE
DEBUG_MESSAGE("doing init")
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
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
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
//SELECTION_LOGIC()
chosenNodeType = launchArgs.nodeType //TODOx2.. 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, 4, 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
ELIF chosenNodeType = NODE_TYPE_ABANDON
bHomelessVariation = TRUE
PRINTLN("bHomelessVariation = TRUE")
ENDIF
//Broken down type requires a ped
IF chosenNodeType = NODE_TYPE_DYNAMIC OR chosenNodeType = NODE_TYPE_TRAIN
bRequiresPed = TRUE
iNumPeds = 1
PRINTLN("bRequiresPed = TRUE")
ELIF chosenNodeType = NODE_TYPE_ACCIDENT
iNumPeds = extraData[GET_IDX()].numBystanders
ENDIF
INIT_CHARACTER_NAME()
bPostTonya = FALSE
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
SET_ENTITY_AS_MISSION_ENTITY(myVehicle)
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)
TELEPORT_PLAYER(vStartVec)
ENDIF
#ENDIF
SET_WANTED_LEVEL_MULTIPLIER(0.1)
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
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya1")) = 1)
OR (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya2")) = 1)
OR (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Tonya5")) = 1)
MISSION_DOORS_SET_DOOR_STATE(sMyDoors[TOWING_GATES_EAST], FALSE)
MISSION_DOORS_SET_DOOR_STATE(sMyDoors[TOWING_GATES_SOUTH], FALSE)
MISSION_DOORS_CLEANUP_DOOR(sMyDoors[TOWING_GATES_EAST])
MISSION_DOORS_CLEANUP_DOOR(sMyDoors[TOWING_GATES_SOUTH])
bRunnningWithTonya = TRUE
PRINTLN("bRunnningWithTonya = TRUE")
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
AND (curStage != MISSION_STATE_TONYA_PHONE_CALL)
AND (curStage != MISSION_STATE_POST_DROPOFF)
AND (curStage != MISSION_STATE_DROPOFF_TONYA)
UPDATE_MISSION_CAR(myVehicle, myVehicleBlip, brokenVehicles, vCurDestObjective, sLastObjective, outOfVehicleTime,
iClosestIdx, bSuppressBlips, bGpsActive, bInCombat, bUnlockDoors, bWanted, curStage)
IF bOutOfVehicle
IF DOES_BLIP_EXIST(blipImpound)
REMOVE_BLIP(blipImpound)
ENDIF
IF chosenNodeType = NODE_TYPE_ABANDON
OR chosenNodeType = NODE_TYPE_HANDI
OR chosenNodeType = NODE_TYPE_ACCIDENT
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT bKillAnyConversation
TestResumptionLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
IF NOT bPlayedGetOutConvo
PRINTLN("KILLING ANY CONVERSATION THAT MIGHT BE ONGOING - PLAYER LEFT VEHICLE")
KILL_FACE_TO_FACE_CONVERSATION()
bKillAnyConversation = TRUE
ENDIF
ENDIF
ELSE
IF NOT bPlayedGetOutConvo
IF CREATE_CONVERSATION(pedConvo, "TOWAUD", "TONYA_GETOUT", CONV_PRIORITY_VERY_HIGH, DO_NOT_DISPLAY_SUBTITLES)
PRINTLN("PLAYING - TONYA_GETOUT - CONVO")
bPlayedGetOutConvo = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
bKillAnyConversation = FALSE
bPlayedGetOutConvo = FALSE
ENDIF
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SWITCH towVariation
CASE VARIATION_TRADIITONAL
IF curStage > MISSION_STATE_CONVERSATION 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 bRunnningWithTonya
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 NOT bWanted
UPDATE_TUTORIAL(myVehicle, brokenVehicles[0].vehicleIndex, myGarageData, brokenVehicles[0].blipIndex, vCurDestObjective, sLastObjective,
vDropOffPosition, bDoTutorial, pedTonya)
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
//no extra ped when we're doing a tutorial
IF NOT bDoTutorial
IF UPDATE_ANGRY_PED()
// MISSION_CLEANUP()
ENDIF
ELSE
// PRINTLN("bDoTutorial IS TRUE")
ENDIF
ELIF chosenNodeType = NODE_TYPE_TRAIN AND curStage > MISSION_STATE_CREATE AND curStage < MISSION_STATE_COMPLETE
IF UPDATE_TRAIN()
MISSION_CLEANUP(sLoadQueue)
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
IF NOT IS_ENTITY_DEAD(brokenVehicles[0].pedIndex)
CLEAR_PED_TASKS(brokenVehicles[0].pedIndex)
TASK_TURN_PED_TO_FACE_ENTITY(brokenVehicles[0].pedIndex, PLAYER_PED_ID())
ENDIF
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 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)
IF aggroReason = EAggro_ShotNear
PRINTLN("PLAYER AGGROED DRIVER WITH WEAPON")
failReason = FAIL_PED_THREATENED_WITH_WEAPON
ELIF aggroReason = EAggro_Aiming
PRINTLN("PLAYER AGGROED DRIVER FAIL_PED_THREATENED_WITH_WEAPON_AIMING WEAPON")
failReason = FAIL_PED_THREATENED_WITH_WEAPON_AIMING
ELSE
PRINTLN("PLAYER AGGROED DRIVER")
failReason = FAIL_PED_THREATENED
ENDIF
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)
IF aggroReason = EAggro_ShotNear
PRINTLN("PLAYER AGGROED PASSENGER WITH WEAPON")
failReason = FAIL_PED_THREATENED_WITH_WEAPON
ELSE
PRINTLN("PLAYER AGGROED PASSENGER 01")
failReason = FAIL_PED_THREATENED
ENDIF
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
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")
IF aggroReason = EAggro_ShotNear
PRINTLN("PLAYER AGGROED DRIVER WITH WEAPON - 01")
failReason = FAIL_PED_THREATENED_WITH_WEAPON
ELSE
PRINTLN("PLAYER AGGROED DRIVER- 01")
failReason = FAIL_PED_THREATENED
ENDIF
ENDIF
ENDIF
ELSE
IF bAttack
// PRINTLN("bAttack")
ENDIF
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)
IF NOT bTowHooked
// SET_CINEMATIC_BUTTON_ACTIVE(FALSE)
IF DOES_ENTITY_EXIST(brokenVehicles[0].vehicleIndex)
IF NOT IS_ENTITY_DEAD(brokenVehicles[0].vehicleIndex)
CONTROL_COORD_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, GET_ENTITY_COORDS(brokenVehicles[0].vehicleIndex))
IF IS_GAMEPLAY_HINT_ACTIVE()
IF NOT IS_AUDIO_SCENE_ACTIVE("TOWING_FOCUS_CAM_ON_CAR")
START_AUDIO_SCENE("TOWING_FOCUS_CAM_ON_CAR")
PRINTLN("STARING AUDIO SCENE - TOWING_FOCUS_CAM_ON_CAR")
ENDIF
ELSE
IF IS_AUDIO_SCENE_ACTIVE("TOWING_FOCUS_CAM_ON_CAR")
STOP_AUDIO_SCENE("TOWING_FOCUS_CAM_ON_CAR")
PRINTLN("STOPPING AUDIO SCENE - TOWING_FOCUS_CAM_ON_CAR")
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
CONTROL_COORD_CHASE_HINT_CAM_ANY_MEANS(localChaseHintCamStruct, vDest)
//KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
//SET_CINEMATIC_BUTTON_ACTIVE(TRUE)
ENDIF
ELSE
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
SET_CINEMATIC_BUTTON_ACTIVE(TRUE)
ENDIF
ENDIF
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
IF UPDATE_TRADITIONAL(launchArgs, sLoadQueue)
RETURN TRUE
ENDIF
ENDIF
IF curStage = MISSION_STATE_DROPOFF
HANDLE_CAR_DAMAGE_DIALOGUE()
ENDIF
IF chosenNodeType = NODE_TYPE_TRAIN
IF curStage = MISSION_STATE_DROPOFF
MANAGE_PED_CONVERSATION(MyLocalPedStruct, brokenVehicles, myVehicle)
ENDIF
ELIF chosenNodeType = NODE_TYPE_DYNAMIC
IF curStage = MISSION_STATE_TOWING
OR curStage = MISSION_STATE_DROPOFF
MANAGE_PED_CONVERSATION(MyLocalPedStruct, brokenVehicles, myVehicle)
ENDIF
ENDIF
BREAK
ENDSWITCH
SET_AMBIENT_PED_RANGE_MULTIPLIER_THIS_FRAME(1.5)
IF UPDATE_FAIL_CONDITIONS(launchArgs)
DEBUG_MESSAGE("Setting Fail")
MISSION_FAILED()
ENDIF
IF bFailRc
DEBUG_MESSAGE("Setting RC")
//SET_BITMASK_AS_ENUM(launchArgs.iTowFlags, TOWING_FLAG_FAILED)
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
DO_DEBUG_SKIPS()
#ENDIF
//ENDWHILE
RETURN FALSE
ENDFUNC