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

5213 lines
192 KiB
XML
Executable File

USING "rage_builtins.sch"
USING "globals.sch"
USING "brains.sch"
USING "script_player.sch"
USING "script_drawing.sch"
USING "commands_audio.sch"
USING "commands_script.sch"
USING "commands_pad.sch"
USING "commands_graphics.sch"
USING "commands_camera.sch"
USING "commands_streaming.sch"
USING "commands_interiors.sch"
USING "commands_object.sch"
USING "commands_vehicle.sch"
USING "commands_player.sch"
USING "commands_water.sch"
USING "finance_control_public.sch"
USING "player_ped_public.sch"
USING "model_enums.sch"
USING "minigames_helpers.sch"
USING "Drug_Trafficking_core.sch"
USING "Traffick_Cams.sch"
USING "Traffick_UI.sch"
USING "Commands_pad.sch"
USING "chase_hint_cam.sch"
USING "script_oddjob_queues.sch"
USING "flow_public_game.sch"
//remove me
BOOL bLandingReminder = TRUE
BOOL bSkipped = FALSE
BOOL bHitATarget = FALSE
BOOL bPlayConvo = TRUE
BOOL bHitWater = FALSE
BOOL bJSkipped = FALSE
BOOL bFlareHelpPrint = FALSE
BOOL bRemoveHUD = FALSE
BOOL bTriggerUberMusic = FALSE
BOOL bUberReminder = TRUE
BOOL bSwitchedBombs = FALSE
structTimer tBombTimer
//VECTOR direction
REL_GROUP_HASH grpEnemies
//USING "Drug_Trafficking_Data.sch"
VECTOR vPlayerPos//, vTempFocus
AUTHORED_DATA authoredData
AUTHORED_DATE_PROPS authoredDataProps
// Widgets
FLOAT fCameraOffsetX, fCameraOffsetY, fCameraOffsetZ
FLOAT fCameraHeadingX, fCameraHeadingY, fCameraHeadingZ
CONST_FLOAT CARGO_DROP_TIME_RESET 1.7
CONST_FLOAT CARGO_DROP_SKIP_DELAY 1.0
CONST_INT LOCK_ON_BUFFER 550
CONST_INT FAIL_SAFE_TIME 30000 //30 seconds.. for uber
CONST_INT CAM_TIME 2500 //Lookback cam time
CONST_INT CONST_DROP_PRINT 200 //150
CONST_INT CONST_FIRST_PRINT_DIST_TUT 500
CONST_INT CONST_FIRST_PRINT_DIST 500
CONST_INT CONST_HELP_PRINT_DIST 1000
CONST_INT HOLDING_TIME 2400 //when we start the holding pattern
CONST_INT dropTimeout 28000
CONST_FLOAT MAX_SPEED_AUTO 35.0
CONST_FLOAT MIN_SPEED_AUTO 13.0
CONST_FLOAT CONST_TOO_CLOSE_GROUND 23.0
CONST_INT LIGHT_ON_HOUR 20
CONST_INT LIGHT_OFF_HOUR 6
structPedsForConversation MyLocalPedStruct
CHASE_HINT_CAM_STRUCT localChaseHintCamStruct
FLOAT minTime = 0.55
FLOAT maxTime = 0.6
CONST_FLOAT AUTO_Y_ROT 5.0
CONST_FLOAT CONST_LOCK_SOUND_MAX 200.0
//INT iLockOnTimeBufferStart
BOOL bTriggerAlarms = TRUE
INT iSirenSoundID = -1
INT iSirenSoundID2 = -1
INT iSirenSoundID3 = -1
INT iClosestTrainCarriage = -1
INT iIntroCutStages = 0
SEQUENCE_INDEX taskSequence
//Todo pass this in instead of being a header global
TUTORIAL_STATE tutorialState = TUTORIAL_STATE_PRE
STRING sTaxiHelp
BOOL bOutOfVehicle = FALSE
BOOL bCloseRange = FALSE
BOOL bDropPhaseComplete = FALSE
//BOOL bStartCutScene = FALSE
//BOOL bInRangeForPerfect = FALSE
BOOL bSwitchedTasks[MAX_NUMBER_DROPS]
BOOL bDisableHolding = FALSE
BOOL bClearPrints = FALSE
BOOL bGenericPrint = FALSE
BOOL bDistWarned = FALSE
BOOL bInActiveFight = FALSE
BOOL bCollisionDetected = FALSE
BOOL bPassed = FALSE
BOOL bEarlyFail = FALSE
BOOL bPrintDropZoneHelp = FALSE
BOOL bTriggerInAirMusic = FALSE
BOOL bRanLastConvo = FALSE
BOOL bKilledBuyer = FALSE
BOOL bClearedLandingHelp = FALSE
BOOL bCreateUberBomb[6]
BOOL bReplaying = FALSE
BOOL bPlaneTooLow = FALSE
// FLASH BOOLS
BOOL bIntroFlash = FALSE
BOOL bDoneFlash01 = FALSE
BOOL bDoneFlash02 = FALSE
//BOOL bCollisionImminent
//BOOL bCut = TRUE
//BOOL bPlayingLockDist = FALSE
//BOOL bPlayingLooping = FALSE
BOOL bUberActive = FALSE
BOOL bDoUberCam = FALSE
BOOL bUberSucess = FALSE
//BOOL bOneHit = FALSE
INT iUberSuccess = -1
//BOOL bWithinPrintRange = FALSE
//BOOL bToldAboutTargetCam[MAX_NUMBER_DROPS]
//BOOL bToldAboutCargoDrop[MAX_NUMBER_DROPS]
PLANE_PRINTS dropInstructState = PLANE_PRINTS_CAM
BOOL bTaskedPedToFlee[MAX_NUMBER_DROPS]
//Define reason for variables to be in struct vs global to the fial
BOOL bLocked = FALSE
INT iLockedIdx = -1
// For Abandon Check
FLOAT fGreatestDistanceToObjective, fAbandonDistance, fWarnDistance, fDistanceFromStart
BOOL bSetDistance = FALSE
CONST_FLOAT fAbandonAddOn 1400.0
CONST_FLOAT fWarnAddOn 800.0
//hack..
structTimer clusterTimer
structTimer tutorialTimer
//structTimer stLoadSceneTimer
structTimer tLastConvoTimer
//structTimer tEndingTimer
INT count = 0
CLUSTER_STATE clusterState = CLUSTER_STATE_INIT
//VECTOR vCargoOffset = <<-0.1776, 0.3160, -0.325>> //-0.2125>>
//VECTOR vCargoOffset2 = <<0.2445, 0.2969, -0.325>> //-0.1761>>
VECTOR vCargoOffset = <<-0.1776, 0.17, -0.325>> //-0.2125>>
VECTOR vCargoOffset2 = <<0.2445, 0.17, -0.325>> //-0.1761>>
VECTOR vReturn
VECTOR vNewEndingBlip = <<2022.3451, 4756.5522, 40.0605>>
//VECTOR vCarGenPlane = <<1470.90088, 3203.77368, 39.51754>>
//VECTOR vCarGenTruck = <<1775.92261, 3235.84937, 41.31895>>
VECTOR vDummyBombPostion
FLOAT LeftX, LeftY //, RightX, RightY
VECTOR vBombMoveOffset
// For Bomb Stationary Staging
VEHICLE_INDEX vehStationaryCars[MAX_NUMBER_DROPS][MAX_EXTRA_CARS]
PED_INDEX pedStationaryPeds[MAX_NUMBER_DROPS][MAX_NUMBER_DROPS]
OBJECT_INDEX oGazebo[MAX_NUMBER_DROPS]
CAMERA_INDEX camIntro
//INT iClosestDrop
PED_INDEX pedPilot[2]
FLOAT fMinGroundZ
MODEL_NAMES mnBombProp01
MODEL_NAMES mnChuteName = P_CARGO_CHUTE_S
VECTOR vChuteOffset = <<0,0,0.18>>
INT iFrameCounter
INT iFrameCounter01
VECTOR vSpawnPosition = <<2136.1331, 4780.5635, 39.9702>>
FLOAT fSpawnHeading = 25.29
VECTOR vBombVelocity
INT iFrameCounterCam = 5
FLOAT fBombHeading
// Debug
#IF IS_DEBUG_BUILD
BOOL pSkipping = FALSE
#ENDIF
PROC RESET_BOOLS(BOOL &bTemp[])
INT idx
REPEAT MAX_NUMBER_DROPS idx
bTemp[idx] = FALSE
ENDREPEAT
ENDPROC
FUNC BOOL SHOULD_CHECK_CARGO(PLANE_CARGO_ARGS& cargoArgs, INT idx)
IF IS_ENTITY_DEAD(cargoArgs.oCargoDrop[idx])
RETURN FALSE
ELIF IS_ENTITY_ATTACHED(cargoArgs.oCargoDrop[idx]) OR cargoArgs.bCargoComplete[idx]
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
PROC REMOVE_DISTANT_CONVOY_VEHICLES(PLANE_CARGO_ARGS& cargoArgs)
INT idx
VECTOR vGroupOneLeader
VECTOR vGroupTwoLeader
VECTOR vGroupThreeLeader
VECTOR vTempPos, vTempPos01, vTempPos02
IF iFrameCounter = 0
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[0])
vGroupOneLeader = GET_ENTITY_COORDS(cargoArgs.vehFinal[0])
ELSE
vGroupOneLeader = <<0,0,0>>
ENDIF
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[4])
vGroupTwoLeader = GET_ENTITY_COORDS(cargoArgs.vehFinal[4])
ELSE
vGroupTwoLeader = <<0,0,0>>
ENDIF
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[8])
vGroupThreeLeader = GET_ENTITY_COORDS(cargoArgs.vehFinal[8])
ELSE
vGroupThreeLeader = <<0,0,0>>
ENDIF
FOR idx = 1 TO 3
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[idx])
vTempPos = GET_ENTITY_COORDS(cargoArgs.vehFinal[idx])
IF NOT ARE_VECTORS_EQUAL(vGroupOneLeader, <<0,0,0>>)
IF VDIST(vTempPos, vGroupOneLeader) > 150.0
PRINTLN("DISTANCE HAS BEEN EXCEEDED: ", idx)
IF IS_ENTITY_OCCLUDED(cargoArgs.vehFinal[idx])
DELETE_VEHICLE(cargoArgs.vehFinal[idx])
PRINTLN("EXPLODING VEHICLE: ", idx)
IF DOES_BLIP_EXIST(cargoArgs.blipFinal[idx])
REMOVE_BLIP(cargoArgs.blipFinal[idx])
PRINTLN("REMOVING BLIP: ", idx)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDFOR
FOR idx = 5 TO 7
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[idx])
vTempPos01 = GET_ENTITY_COORDS(cargoArgs.vehFinal[idx])
IF NOT ARE_VECTORS_EQUAL(vGroupTwoLeader, <<0,0,0>>)
IF VDIST(vTempPos01, vGroupTwoLeader) > 150.0
PRINTLN("DISTANCE HAS BEEN EXCEEDED: ", idx)
IF IS_ENTITY_OCCLUDED(cargoArgs.vehFinal[idx])
DELETE_VEHICLE(cargoArgs.vehFinal[idx])
PRINTLN("EXPLODING VEHICLE: ", idx)
IF DOES_BLIP_EXIST(cargoArgs.blipFinal[idx])
REMOVE_BLIP(cargoArgs.blipFinal[idx])
PRINTLN("REMOVING BLIP: ", idx)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDFOR
FOR idx = 9 TO 11
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[idx])
vTempPos02 = GET_ENTITY_COORDS(cargoArgs.vehFinal[idx])
IF NOT ARE_VECTORS_EQUAL(vGroupThreeLeader, <<0,0,0>>)
IF VDIST(vTempPos02, vGroupThreeLeader) > 150.0
PRINTLN("DISTANCE HAS BEEN EXCEEDED: ", idx)
IF IS_ENTITY_OCCLUDED(cargoArgs.vehFinal[idx])
DELETE_VEHICLE(cargoArgs.vehFinal[idx])
PRINTLN("EXPLODING VEHICLE: ", idx)
IF DOES_BLIP_EXIST(cargoArgs.blipFinal[idx])
REMOVE_BLIP(cargoArgs.blipFinal[idx])
PRINTLN("REMOVING BLIP: ", idx)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDFOR
ENDIF
IF iFrameCounter > 10
iFrameCounter = 0
ELSE
iFrameCounter++
ENDIF
ENDPROC
PROC INIT_PROPER_PLANE_CARGO(ARGS& myArgs)
IF myArgs.bDoBomb
mnBombProp01 = PROP_LD_BOMB_ANIM
ELSE
mnBombProp01 = Prop_Drop_ArmsCrate_01b
ENDIF
IF myArgs.bDoUberBombs
mnBombProp01 = PROP_LD_BOMB_ANIM
ENDIF
ENDPROC
//important... funcitons that take basic types when possible
PROC RELEASE_CARGO(OBJECT_INDEX& myEntity, ENTITY_INDEX myPlane, INT& soundID, BOOL bPlaySound = TRUE, FLOAT fScale = -10.0)
fLerpCount = 0.0
bSwitchedBombs = FALSE
DEBUG_MESSAGE("Detaching entity")
DETACH_ENTITY(myEntity, FALSE)
VECTOR front, side, up, pos
IF bPlaySound
IF NOT IS_ENTITY_DEAD(myPlane)
ODDJOB_PLAY_SOUND("DRUG_TRAFFIC_AIR_BOMB_DROP_MASTER", soundID, FALSE, myPlane)
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(myPlane)
vBombVelocity = GET_ENTITY_VELOCITY(myPlane)
GET_ENTITY_MATRIX(myPlane, front, side, up, pos)
ENDIF
up = NORMALISE_VECTOR(up)
vBombVelocity = vBombVelocity + <<up.x* fScale, up.y* fScale, up.z * fScale>>
IF vBombVelocity.z <= -70
DEBUG_MESSAGE("overriding z to -70")
vBombVelocity.z = -70
ENDIF
vOrigOrientation = <<80, 0, GET_ENTITY_HEADING(myPlane)+180>> //GET_ENTITY_ROTATION(myEntity)
SET_ENTITY_MAX_SPEED(myEntity, 90)
SET_ENTITY_VELOCITY(myEntity, <<vBombVelocity.x, vBombVelocity.y, vBombVelocity.z>>)
PRINTLN("vBombVelocity = ", vBombVelocity)
ENDPROC
PROC UPDATE_VISIBLILITY_AND_COLLISION(OBJECT_INDEX& myBomb, PLANE_CARGO_ARGS &cargoArgs)
IF DOES_ENTITY_EXIST(myBomb)
SET_ENTITY_VISIBLE(myBomb, TRUE) //todo.. why the hell do we have to call this
SET_ENTITY_COLLISION(myBomb, TRUE)
ENDIF
IF DOES_ENTITY_EXIST(cargoArgs.oBombDummy)
SET_ENTITY_VISIBLE(cargoArgs.oBombDummy, FALSE)
SET_ENTITY_COLLISION(cargoArgs.oBombDummy,FALSE)
ENDIF
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), FALSE)
// Cannot set collision on a ped if that ped is in a vehicle
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), FALSE)
SET_ENTITY_COLLISION(PLAYER_PED_ID(), FALSE)
ENDIF
ENDPROC
// Called once original bomb orientation is reset. This ensures that the velocity remains
// unchanged. It is a pared down version of RELEASE_CARGO logic
PROC RESET_BOMB_VELOCITY(OBJECT_INDEX& myEntity, ENTITY_INDEX myPlane, FLOAT fScale = -5.0)
FLOAT iMaxVeloc = -60
//If we're higher up we can have it go faster.
IF GET_ENTITY_HEIGHT_ABOVE_GROUND(myPlane) > 150
fScale = -10.0
iMaxVeloc = -70
ENDIF
//Calculate distance from ground
VECTOR front, side, up, pos
IF NOT IS_ENTITY_DEAD(myPlane)
vBombVelocity = GET_ENTITY_VELOCITY(myPlane)
GET_ENTITY_MATRIX(myPlane, front, side, up, pos)
ENDIF
up = NORMALISE_VECTOR(up)
vBombVelocity = vBombVelocity + <<up.x* fScale, up.y* fScale, up.z * fScale>>
IF vBombVelocity.z <= iMaxVeloc
DEBUG_MESSAGE("RESET_BOMB_VELOCITY: overriding z to -70")
vBombVelocity.z = iMaxVeloc
ENDIF
vOrigOrientation = <<80, 0, GET_ENTITY_HEADING(myPlane)+180>>
IF DOES_ENTITY_HAVE_PHYSICS(myEntity)
SET_ENTITY_MAX_SPEED(myEntity, 90)
ENDIF
SET_ENTITY_VELOCITY(myEntity, <<vBombVelocity.x, vBombVelocity.y, vBombVelocity.z>>)
ENDPROC
PROC SIMULATE_NOSE_TIP_DOWN(OBJECT_INDEX& myBomb, PLANE_CARGO_ARGS &cargoArgs)
VECTOR vCurRot//, vCurRotDummy
vCurRot = GET_ENTITY_ROTATION(myBomb)
//PRINTLN("SIMULATE_NOSE_TIP_DOWN: The current bomb rotation is ", GET_STRING_FROM_VECTOR(vCurRot))
IF NOT bSwitchedBombs
IF vCurRot.x < EXPLOSION_CAM_BOMB_PITCH
vCurRot.x += 4.0
IF vCurRot.x > EXPLOSION_CAM_BOMB_PITCH
vCurRot.x = EXPLOSION_CAM_BOMB_PITCH
ENDIF
SET_ENTITY_ROTATION(myBomb, vCurRot)
ENDIF
IF DOES_ENTITY_EXIST(cargoArgs.oBombDummy)
SET_ENTITY_VISIBLE(cargoArgs.oBombDummy, FALSE)
ENDIF
IF IS_STREAMVOL_ACTIVE()
IF STREAMVOL_IS_VALID(cargoArgs.streamVolID)
IF NOT DOES_ENTITY_EXIST(cargoArgs.oBombDummy)
cargoArgs.oBombDummy = CREATE_OBJECT(Prop_LD_Bomb_01, GET_ENTITY_COORDS(myBomb))
SET_ENTITY_COLLISION(cargoArgs.oBombDummy, FALSE)
ELSE
SET_ENTITY_COORDS(cargoArgs.oBombDummy, GET_ENTITY_COORDS(myBomb))
SET_ENTITY_ROTATION(cargoArgs.oBombDummy, << EXPLOSION_CAM_BOMB_PITCH, vCurRot.y, vCurRot.z>>)
SET_ENTITY_VELOCITY(cargoArgs.oBombDummy, GET_ENTITY_VELOCITY(myBomb))
ENDIF
IF TIMER_DO_ONCE_WHEN_READY(tBombTimer, 0.50)
fBombHeading = GET_ENTITY_HEADING(cargoArgs.myPlane) - 180
IF fBombHeading < 0
fBombHeading += 360.0
ENDIF
cargoArgs.iCutGameTimeStart = GET_GAME_TIMER()
DO_EXPLOSION_CAM(cargoArgs, myBomb)
bSwitchedBombs = TRUE
UPDATE_VISIBLILITY_AND_COLLISION(myBomb, cargoArgs)
RESET_BOMB_VELOCITY(cargoArgs.oBombDummy, cargoArgs.myPlane)
RESET_BOMB_VELOCITY(myBomb, cargoArgs.myPlane)
vCurRot.x = EXPLOSION_CAM_BOMB_PITCH
SET_ENTITY_ROTATION(myBomb, vCurRot)
ENDIF
ENDIF
ENDIF
vCurRot.x = EXPLOSION_CAM_BOMB_PITCH
IF DOES_ENTITY_EXIST(cargoArgs.oBombDummy)
SET_ENTITY_COORDS(cargoArgs.oBombDummy, GET_ENTITY_COORDS(myBomb))
SET_ENTITY_ROTATION(cargoArgs.oBombDummy, vCurRot)
ENDIF
ELSE
IF DOES_CAM_EXIST(cargoArgs.CamExplosion)
IF IS_CAM_ACTIVE(cargoArgs.CamExplosion)
IF fBlurStrength <= 0.20
fBlurStrength += 0.01
//SET_CAM_MOTION_BLUR_STRENGTH(cargoArgs.CamExplosion, fBlurStrength)
ENDIF
ENDIF
ENDIF
vCurRot.x = EXPLOSION_CAM_BOMB_PITCH
vCurRot.y += GET_RANDOM_FLOAT_IN_RANGE(1.5.3.0)
IF vCurRot.y > 360.0
vCurRot.y -= 360.0
ENDIF
vBombVelocity = GET_ENTITY_VELOCITY(myBomb)
IF vBombVelocity.z > -70
vBombVelocity.z -= 0.25
SET_ENTITY_VELOCITY(myBomb, vBombVelocity)
SET_ENTITY_VELOCITY(cargoArgs.oBombDummy, vBombVelocity)
ENDIF
vOrigOrientation = vOrigOrientation
SET_ENTITY_ROTATION(myBomb, vCurRot)
IF DOES_ENTITY_EXIST(cargoArgs.oBombDummy)
SET_ENTITY_COORDS(cargoArgs.oBombDummy, GET_ENTITY_COORDS(myBomb))
ENDIF
ENDIF
ENDPROC
PROC SIMULATE_NOSE_TIP_DOWN_UBER(OBJECT_INDEX& myBomb)
VECTOR vCurRot//, vCurRotDummy
vCurRot = GET_ENTITY_ROTATION(myBomb)
FLOAT fRand = GET_RANDOM_FLOAT_IN_RANGE(1,2)
IF bSwitchedBombs
vCurRot.x = 80.0
ELSE
IF vCurRot.x < 80.0
vCurRot.x += fRand
ENDIF
ENDIF
fRand = GET_RANDOM_FLOAT_IN_RANGE(0.4,1.0)
vCurRot.y += fRand
IF vCurRot.y > 360.0
vCurRot.y -= 360.0
ENDIF
SET_ENTITY_ROTATION(myBomb, vCurRot)
// PRINTLN("SIMULATE_NOSE_TIP_DOWN UBER: The rotation of bomb is ", GET_STRING_FROM_VECTOR(GET_ENTITY_ROTATION(myBomb)))
ENDPROC
//Function used to apply a chute to the prop and animate it. Because the chute shows up for a half a second fully deployed we have to hack this to be invisible for a few frames
//INT& hideTime to track when we should make it visible
//BOOL& vVisible to track if it's visible or not
//OBJECT_INDEX myBox - The the box we're going to attache the chute too
//OBJECT_INDEX& myChute - The chute we're going to create and pass back by reference
PROC APPLY_CHUTE(OBJECT_INDEX& myChute, OBJECT_INDEX myBox, INT& hideTime, BOOL& bVisible)
VECTOR temp
temp = GET_ENTITY_COORDS(myBox)
PRINTLN("APPLY_CHUTE..new")
myChute = CREATE_OBJECT(mnChuteName, temp)
SET_ENTITY_VISIBLE(myChute, FALSE)
hideTime= GET_GAME_TIMER()
bVisible = FALSE
ATTACH_ENTITY_TO_ENTITY(myChute, myBox, 0, vChuteOffset, <<0,0,0>>)
//Moved this to the script that turns on visibility
//PLAY_ENTITY_ANIM(myChute, "p_cargo_chute_s_deploy", "p_cargo_chute_s", 1.0, FALSE, TRUE)
ENDPROC
//This function is now mainly just hardcoded since we only have one variation and no longer need to keep things data driven / madular
PROC CREATE_FINAL_STAGING(ARGS& myArgs, PLANE_CARGO_ARGS& cargoArgs, PLANE_DATA& myData)
INT idx, idx2
// SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(vCarGenPlane - <<7,7,7>>, vCarGenPlane + <<7,7,7>>, FALSE)
// SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(vCarGenTruck - <<7,7,7>>, vCarGenTruck + <<7,7,7>>, FALSE)
REPEAT MAX_NUMBER_FINAL_TARGETS idx
cargoArgs.vehFinal[idx] = CREATE_VEHICLE(myArgs.mnFinalTargets[idx], myData.vRunwayTargets[idx], myData.fRunwayTargets[idx])
SET_VEHICLE_ON_GROUND_PROPERLY(cargoArgs.vehFinal[idx])
//cargoArgs.blipFinal[idx] = ADD_BLIP_FOR_ENTITY(cargoArgs.vehFinal[idx])
SET_ENTITY_LOD_DIST(cargoArgs.vehFinal[idx], 1000)
SET_ENTITY_LOAD_COLLISION_FLAG(cargoArgs.vehFinal[idx], TRUE)
ENDREPEAT
cargoArgs.vehDropoff[0] = cargoArgs.vehFinal[0]
cargoArgs.vehDropoff[1] = cargoArgs.vehFinal[3]
cargoArgs.vehDropoff[2] = cargoArgs.vehFinal[6]
cargoArgs.vehFinalExtra[0] = CREATE_VEHICLE(myArgs.mnFinalTargets[0], << 1730.0139, 3314.9282, 41.7539 >>, 0)
SET_ENTITY_QUATERNION(cargoArgs.vehFinalExtra[0], -0.0017, 0.0226, 0.9922, -0.1222)
pedPilot[0] = CREATE_PED_INSIDE_VEHICLE(cargoArgs.vehFinalExtra[0], PEDTYPE_CIVMALE, myData.targetCarDriverNames[0])
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedPilot[0], TRUE)
cargoArgs.recordingStatus[0] = RECORD_STATUS_INIT
cargoArgs.vehFinalExtra[1] = CREATE_VEHICLE(myArgs.mnFinalTargets[4], << 1774.5613, 3235.6404, 41.9390 >>, 0)
SET_ENTITY_QUATERNION(cargoArgs.vehFinalExtra[1], -0.0128, -0.0072, 0.0939, 0.9955)
cargoArgs.recordingStatus[1] = RECORD_STATUS_INIT
cargoArgs.vehFinalExtra[2] = CREATE_VEHICLE(myArgs.mnFinalTargets[4], << 1646.4313, 3258.0586, 40.4998 >>, 0)
SET_ENTITY_QUATERNION(cargoArgs.vehFinalExtra[2], 0.0267, -0.0274, 0.8044, 0.5929)
cargoArgs.recordingStatus[2] = RECORD_STATUS_INIT
cargoArgs.vehFinalExtra[3] = CREATE_VEHICLE(myArgs.mnFinalTargets[1], <<1349.9443, 3155.6465, 41.0453>>, 0)
SET_ENTITY_QUATERNION(cargoArgs.vehFinalExtra[3], 0.0024, 0.0030, 0.7994, 0.6008)
pedPilot[1] = CREATE_PED_INSIDE_VEHICLE(cargoArgs.vehFinalExtra[3], PEDTYPE_CIVMALE, myData.targetCarDriverNames[0])
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedPilot[1], TRUE)
cargoArgs.recordingStatus[3] = RECORD_STATUS_INIT
cargoArgs.vehFinalExtra[4] = CREATE_VEHICLE(myArgs.mnFinalTargets[4], << 1120.4285, 3016.5684, 40.1836 >>, 0)
SET_ENTITY_QUATERNION(cargoArgs.vehFinalExtra[4], 0.0011, -0.0010, -0.5982, 0.8013)
cargoArgs.recordingStatus[4] = RECORD_STATUS_INIT
cargoArgs.vehFinalExtra[5] = CREATE_VEHICLE(myArgs.mnFinalTargets[4], << 1468.7660, 3013.5898, 40.3801 >>, 0)
SET_ENTITY_QUATERNION(cargoArgs.vehFinalExtra[5], -0.0091, -0.0121, -0.3688, 0.9294)
cargoArgs.recordingStatus[5] = RECORD_STATUS_INIT
pedStationaryPeds[0][0] = CREATE_PED(PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0], << 1587.4852, 3225.5764, 39.4216 >>)
pedStationaryPeds[0][1] = CREATE_PED(PEDTYPE_CRIMINAL, myData.targetCarDriverNames[1], << 1521.7310, 3206.7068, 39.4141 >>)
pedStationaryPeds[0][2] = CREATE_PED(PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0], << 1707.4034, 3258.0220, 40.0469 >>)
pedStationaryPeds[0][3] = CREATE_PED(PEDTYPE_CRIMINAL, myData.targetCarDriverNames[1], << 1716.1447, 3265.4775, 40.1539 >>)
pedStationaryPeds[1][0] = CREATE_PED(PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0], << 1513.6698, 3109.8762, 39.5341 >>)
pedStationaryPeds[1][1] = CREATE_PED(PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0], << 1514.7271, 3097.7983, 39.5341 >>)
pedStationaryPeds[1][2] = CREATE_PED(PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0], << 1589.6923, 3206.3936, 39.4834 >>)
pedStationaryPeds[1][3] = CREATE_PED(PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0], << 1573.4342, 3201.3796, 39.4925 >>)
pedStationaryPeds[2][0] = CREATE_PED(PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0], << 1773.3756, 3245.5645, 41.1507 >>)
pedStationaryPeds[2][1] = CREATE_PED(PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0], << 1796.5787, 3246.5784, 41.6352 >>)
pedStationaryPeds[2][2] = CREATE_PED(PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0], << 1460.6106, 3047.9028, 39.5341 >>)
pedStationaryPeds[2][3] = CREATE_PED(PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0], << 1408.7350, 3005.2290, 39.5435 >>)
pedStationaryPeds[3][0] = CREATE_PED(PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0], << 1658.3489, 3256.0186, 39.5491 >>)
pedStationaryPeds[3][1] = CREATE_PED(PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0], << 1619.2214, 3243.9282, 39.5161 >>)
pedStationaryPeds[3][2] = CREATE_PED(PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0], << 1700.0881, 3287.2615, 47.9222 >>)
pedStationaryPeds[3][3] = CREATE_PED(PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0], << 1785.4822, 3293.3582, 40.7863 >>)
ADD_RELATIONSHIP_GROUP("ENEMIES", grpEnemies)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, grpEnemies, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, grpEnemies)
//two cars by stunt planes
//Player Position = << 1525.3549, 3107.5337, 39.5341 >>, 128.4660 room: NONE
//Player Position = << 1519.9740, 3112.0833, 39.5341 >>, 131.7277 room: NONE
REPEAT 4 idx
REPEAT 4 idx2
IF idx = 1 OR idx = 3
GIVE_WEAPON_TO_PED(pedStationaryPeds[idx][idx2], WEAPONTYPE_ASSAULTRIFLE, 100, TRUE)
//SET_CURRENT_PED_WEAPON(pedStationaryPeds[idx][idx2], WEAPONTYPE_ASSAULTRIFLE, TRUE)
ELSE
GIVE_WEAPON_TO_PED(pedStationaryPeds[idx][idx2], WEAPONTYPE_ASSAULTRIFLE, 100, TRUE)
//SET_CURRENT_PED_WEAPON(pedStationaryPeds[idx][idx2], WEAPONTYPE_ASSAULTRIFLE, TRUE)
ENDIF
SET_PED_TO_INFORM_RESPECTED_FRIENDS(pedStationaryPeds[idx][idx2], 300, 10)
SET_PED_SEEING_RANGE(pedStationaryPeds[idx][idx2], 500.0)
SET_PED_RELATIONSHIP_GROUP_HASH(pedStationaryPeds[idx][idx2], grpEnemies)
SET_ENTITY_LOD_DIST(pedStationaryPeds[idx][idx2], 500)
SET_PED_ACCURACY(pedStationaryPeds[idx][idx2], 5)
TASK_COMBAT_PED(pedStationaryPeds[idx][idx2], PLAYER_PED_ID())
ENDREPEAT
ENDREPEAT
ENDPROC
PROC CREATE_FINAL_STAGING_REPEATABLE(ARGS& myArgs, PLANE_CARGO_ARGS& cargoArgs, PLANE_DATA& myData)
INT idx, idx2
REPEAT MAX_NUMBER_FINAL_TARGETS idx
cargoArgs.vehFinal[idx] = CREATE_VEHICLE(myArgs.mnFinalTargets[idx], myData.vRunwayTargets[idx], myData.fRunwayTargets[idx])
//cargoArgs.blipFinal[idx] = ADD_BLIP_FOR_ENTITY(cargoArgs.vehFinal[idx])
SET_ENTITY_LOD_DIST(cargoArgs.vehFinal[idx], 500)
SET_ENTITY_LOAD_COLLISION_FLAG(cargoArgs.vehFinal[idx], TRUE)
ENDREPEAT
cargoArgs.vehDropoff[0] = cargoArgs.vehFinal[0]
cargoArgs.vehDropoff[1] = cargoArgs.vehFinal[4]
cargoArgs.vehDropoff[2] = cargoArgs.vehFinal[8]
// Group 1
pedStationaryPeds[0][0] = CREATE_PED_INSIDE_VEHICLE(cargoArgs.vehFinal[0], PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0])
IF NOT IS_PED_INJURED(pedStationaryPeds[0][0])
TASK_VEHICLE_DRIVE_WANDER(pedStationaryPeds[0][0], cargoArgs.vehFinal[0], 8.0, DRIVINGMODE_STOPFORCARS)
ENDIF
pedStationaryPeds[0][1] = CREATE_PED_INSIDE_VEHICLE(cargoArgs.vehFinal[1], PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0])
IF NOT IS_PED_INJURED(pedStationaryPeds[0][1])
TASK_VEHICLE_MISSION(pedStationaryPeds[0][1], cargoArgs.vehFinal[1], cargoArgs.vehFinal[0], MISSION_ESCORT_REAR, 12.0, DRIVINGMODE_AVOIDCARS, -1, -1)
ENDIF
pedStationaryPeds[0][2] = CREATE_PED_INSIDE_VEHICLE(cargoArgs.vehFinal[2], PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0])
IF NOT IS_PED_INJURED(pedStationaryPeds[0][2])
TASK_VEHICLE_MISSION(pedStationaryPeds[0][2], cargoArgs.vehFinal[2], cargoArgs.vehFinal[1], MISSION_ESCORT_REAR, 12.0, DRIVINGMODE_AVOIDCARS, -1, -1)
ENDIF
pedStationaryPeds[0][3] = CREATE_PED_INSIDE_VEHICLE(cargoArgs.vehFinal[3], PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0])
IF NOT IS_PED_INJURED(pedStationaryPeds[0][3])
TASK_VEHICLE_MISSION(pedStationaryPeds[0][3], cargoArgs.vehFinal[3], cargoArgs.vehFinal[2], MISSION_ESCORT_REAR, 12.0, DRIVINGMODE_AVOIDCARS, -1, -1)
ENDIF
// Group 2
pedStationaryPeds[1][0] = CREATE_PED_INSIDE_VEHICLE(cargoArgs.vehFinal[4], PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0])
IF NOT IS_PED_INJURED(pedStationaryPeds[1][0])
TASK_VEHICLE_DRIVE_WANDER(pedStationaryPeds[1][0], cargoArgs.vehFinal[4], 8.0, DRIVINGMODE_STOPFORCARS)
ENDIF
pedStationaryPeds[1][1] = CREATE_PED_INSIDE_VEHICLE(cargoArgs.vehFinal[5], PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0])
IF NOT IS_PED_INJURED(pedStationaryPeds[1][1])
TASK_VEHICLE_MISSION(pedStationaryPeds[1][1], cargoArgs.vehFinal[5], cargoArgs.vehFinal[4], MISSION_ESCORT_REAR, 12.0, DRIVINGMODE_AVOIDCARS, -1, -1)
ENDIF
pedStationaryPeds[1][2] = CREATE_PED_INSIDE_VEHICLE(cargoArgs.vehFinal[6], PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0])
IF NOT IS_PED_INJURED(pedStationaryPeds[1][2])
TASK_VEHICLE_MISSION(pedStationaryPeds[1][2], cargoArgs.vehFinal[6], cargoArgs.vehFinal[5], MISSION_ESCORT_REAR, 12.0, DRIVINGMODE_AVOIDCARS, -1, -1)
ENDIF
pedStationaryPeds[1][3] = CREATE_PED_INSIDE_VEHICLE(cargoArgs.vehFinal[7], PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0])
IF NOT IS_PED_INJURED(pedStationaryPeds[1][3])
TASK_VEHICLE_MISSION(pedStationaryPeds[1][3], cargoArgs.vehFinal[7], cargoArgs.vehFinal[6], MISSION_ESCORT_REAR, 12.0, DRIVINGMODE_AVOIDCARS, -1, -1)
ENDIF
// Group 3
pedStationaryPeds[2][0] = CREATE_PED_INSIDE_VEHICLE(cargoArgs.vehFinal[8], PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0])
IF NOT IS_PED_INJURED(pedStationaryPeds[2][0])
TASK_VEHICLE_DRIVE_WANDER(pedStationaryPeds[2][0], cargoArgs.vehFinal[8], 8.0, DRIVINGMODE_STOPFORCARS)
ENDIF
// pedStationaryPeds[2][1] = CREATE_PED_INSIDE_VEHICLE(cargoArgs.vehFinal[9], PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0])
// IF NOT IS_PED_INJURED(pedStationaryPeds[2][1])
// TASK_VEHICLE_MISSION(pedStationaryPeds[2][1], cargoArgs.vehFinal[9], cargoArgs.vehFinal[8], MISSION_ESCORT_REAR, 12.0, DRIVINGMODE_AVOIDCARS, -1, -1)
// ENDIF
// pedStationaryPeds[2][2] = CREATE_PED_INSIDE_VEHICLE(cargoArgs.vehFinal[10], PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0])
// IF NOT IS_PED_INJURED(pedStationaryPeds[2][2])
// TASK_VEHICLE_MISSION(pedStationaryPeds[2][2], cargoArgs.vehFinal[10], cargoArgs.vehFinal[9], MISSION_ESCORT_REAR, 12.0, DRIVINGMODE_AVOIDCARS, -1, -1)
// ENDIF
// pedStationaryPeds[2][3] = CREATE_PED_INSIDE_VEHICLE(cargoArgs.vehFinal[11], PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0])
// IF NOT IS_PED_INJURED(pedStationaryPeds[2][3])
// TASK_VEHICLE_MISSION(pedStationaryPeds[2][3], cargoArgs.vehFinal[11], cargoArgs.vehFinal[10], MISSION_ESCORT_REAR, 12.0, DRIVINGMODE_AVOIDCARS, -1, -1)
// ENDIF
ADD_RELATIONSHIP_GROUP("ENEMIES", grpEnemies)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, grpEnemies, RELGROUPHASH_PLAYER)
//two cars by stunt planes
//Player Position = << 1525.3549, 3107.5337, 39.5341 >>, 128.4660 room: NONE
//Player Position = << 1519.9740, 3112.0833, 39.5341 >>, 131.7277 room: NONE
REPEAT 3 idx
REPEAT 4 idx2
GIVE_WEAPON_TO_PED(pedStationaryPeds[idx][idx2], WEAPONTYPE_SMG, 100, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedStationaryPeds[idx][idx2], TRUE)
SET_PED_RELATIONSHIP_GROUP_HASH(pedStationaryPeds[idx][idx2], grpEnemies)
SET_ENTITY_LOD_DIST(pedStationaryPeds[idx][idx2], 500)
ENDREPEAT
ENDREPEAT
ENDPROC
PROC REMOVE_DROPOFF_STAGING(ARGS& myArgs, PLANE_DATA& myData, PLANE_CARGO_ARGS& cargoArgs)
INT idx, idx2
REPEAT myData.iNumDrops idx
IF DOES_ENTITY_EXIST(cargoArgs.pedDropoff[idx])
DELETE_PED(cargoArgs.pedDropoff[idx])
PRINTLN("DELETING PED - cargoArgs.pedDropoff INDEX: ", idx)
ENDIF
IF DOES_ENTITY_EXIST(cargoArgs.vehDropoff[idx])
DELETE_VEHICLE(cargoArgs.vehDropoff[idx])
PRINTLN("DELETING VEHICLE - cargoArgs.vehDropoff INDEX: ", idx)
ENDIF
REPEAT 3 idx2
IF DOES_ENTITY_EXIST(vehStationaryCars[idx][idx2])
DELETE_VEHICLE(vehStationaryCars[idx][idx2])
ENDIF
ENDREPEAT
ENDREPEAT
REPEAT MAX_NUMBER_FINAL_TARGETS idx
IF DOES_ENTITY_EXIST(cargoArgs.vehFinal[idx])
DELETE_VEHICLE(cargoArgs.vehFinal[idx])
PRINTLN("DELETING VEHICLE - cargoArgs.vehFinal INDEX: ", idx)
ENDIF
ENDREPEAT
IF myArgs.bDoStationary
REPEAT MAX_NUMBER_STAGED_PROPS idx2
IF DOES_ENTITY_EXIST(cargoArgs.oStagingProps[idx2])
DELETE_OBJECT(cargoArgs.oStagingProps[idx2])
PRINTLN("DELETING OBJECT - cargoArgs.oStagingProps INDEX: ", idx2)
ENDIF
ENDREPEAT
ENDIF
IF DOES_ENTITY_EXIST(cargoArgs.vehFinalExtra[0])
DELETE_VEHICLE(cargoArgs.vehFinalExtra[0])
PRINTLN("DELETING VEHICLE - cargoArgs.vehFinalExtra[0]")
ENDIF
IF DOES_ENTITY_EXIST(cargoArgs.vehFinalExtra[1])
DELETE_VEHICLE(cargoArgs.vehFinalExtra[1])
PRINTLN("DELETING VEHICLE - cargoArgs.vehFinalExtra[1]")
ENDIF
IF DOES_ENTITY_EXIST(cargoArgs.vehFinalExtra[2])
DELETE_VEHICLE(cargoArgs.vehFinalExtra[2])
PRINTLN("DELETING VEHICLE - cargoArgs.vehFinalExtra[2]")
ENDIF
IF DOES_ENTITY_EXIST(cargoArgs.vehFinalExtra[3])
DELETE_VEHICLE(cargoArgs.vehFinalExtra[3])
PRINTLN("DELETING VEHICLE - cargoArgs.vehFinalExtra[3]")
ENDIF
REPEAT 3 idx
REPEAT 4 idx2
IF DOES_ENTITY_EXIST(pedStationaryPeds[idx][idx2])
DELETE_PED(pedStationaryPeds[idx][idx2])
PRINTLN("DELETING STATIONARY PED INDEX: ", idx, " INDEX 2: ", idx2)
ENDIF
ENDREPEAT
ENDREPEAT
ENDPROC
FUNC BOOL SHOULD_LIGHTS_BE_ON()
IF (GET_CLOCK_HOURS() >= LIGHT_ON_HOUR) OR (GET_CLOCK_HOURS() < LIGHT_OFF_HOUR)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC CREATE_DROPOFF_STAGING(ARGS& myArgs, PLANE_CARGO_ARGS& cargoArgs, PLANE_DATA& myData, AIR_VARIATION myVariation)
INT idx, idx2
myVariation = myVariation
UNUSED_PARAMETER(myArgs)
//TODO write custom setupt for the bomb drop
//IF myVariation <> AIR_VARIATION_BOMB
REPEAT myData.iNumDrops idx
VECTOR vTemp
//TODO create a interested drug scene instead of just one car
IF ARE_VECTORS_EQUAL(myData.dropData[idx].vDrugPickup, <<0,0,0>>)
vTemp = myData.dropData[idx].vCenterPos
ELSE
vTemp = myData.dropData[idx].vDrugPickup
ENDIF
// OBJECT_INDEX temp
authoredData = GET_AUTHORED_LOCATION_DATA(myArgs.dropLocations[idx], vTemp)
//
// Ceate Props
//
IF myArgs.bDoStationary
REPEAT MAX_NUMBER_STAGED_PROPS idx2
IF NOT IS_VECTOR_ZERO(authoredData.vPropPos[idx2])
// Crates
cargoArgs.oStagingProps[idx2] = CREATE_OBJECT(authoredDataProps.mnPropName[idx2], authoredData.vPropPos[idx2])
SET_ENTITY_HEADING(cargoArgs.oStagingProps[idx2], authoredData.fPropOri[idx2])
SET_ENTITY_LOD_DIST(cargoArgs.oStagingProps[idx2], 1000)
ENDIF
ENDREPEAT
ENDIF
//
// Create peds
//
cargoArgs.pedDropoff[idx] = CREATE_PED(PEDTYPE_CRIMINAL, myData.targetCarDriverNames[idx], authoredData.vPedPos[0], authoredData.fPedOri[0])
// Play animations on guy at drop location.
IF NOT IS_ENTITY_DEAD(cargoArgs.pedDropoff[idx]) AND NOT IS_PED_INJURED(cargoArgs.pedDropoff[idx])
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
GIVE_WEAPON_TO_PED(cargoArgs.pedDropoff[idx], WEAPONTYPE_ASSAULTRIFLE, 100, TRUE)
TASK_LOOK_AT_ENTITY(cargoArgs.pedDropoff[idx], PLAYER_PED_ID(), -1)
IF myArgs.bDoBomb
SET_PED_RELATIONSHIP_GROUP_HASH(cargoArgs.pedDropoff[idx], cargoArgs.relRivalRunners)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(cargoArgs.pedDropoff[idx], TRUE)
SET_PED_ACCURACY(cargoArgs.pedDropoff[idx], 0)
SET_COMBAT_FLOAT(cargoArgs.pedDropoff[idx], CCF_MAX_SHOOTING_DISTANCE, 200.0)
TASK_SHOOT_AT_ENTITY(cargoArgs.pedDropoff[idx], PLAYER_PED_ID(), -1, FIRING_TYPE_1_BURST)
ENDIF
ENDIF
IF myArgs.bDoStationary
count = 4 //GET_RANDOM_INT_IN_RANGE(1,4)
REPEAT count idx2
IF myData.targetCarDriverNames[idx2] != DUMMY_MODEL_FOR_SCRIPT
pedStationaryPeds[idx][idx2] = CREATE_PED(PEDTYPE_CRIMINAL, myData.targetCarDriverNames[idx2], authoredData.vPedPos[idx2+1], authoredData.fPedOri[idx2+1])
IF DOES_ENTITY_EXIST(pedStationaryPeds[idx][idx2])
GIVE_WEAPON_TO_PED(pedStationaryPeds[idx][idx2], WEAPONTYPE_ASSAULTRIFLE, 100, TRUE)
SET_PED_RELATIONSHIP_GROUP_HASH(pedStationaryPeds[idx][idx2], cargoArgs.relRivalRunners)
SET_CURRENT_PED_WEAPON(pedStationaryPeds[idx][idx2], WEAPONTYPE_ASSAULTRIFLE, TRUE)
SET_PED_SPHERE_DEFENSIVE_AREA(pedStationaryPeds[idx][idx2], authoredData.vPedPos[idx2], 20.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedStationaryPeds[idx][idx2], TRUE)
SET_PED_ACCURACY(pedStationaryPeds[idx][idx2], 0)
SET_COMBAT_FLOAT(pedStationaryPeds[idx][idx2], CCF_MAX_SHOOTING_DISTANCE, 200.0)
TASK_SHOOT_AT_ENTITY(pedStationaryPeds[idx][idx2], PLAYER_PED_ID(), -1, FIRING_TYPE_1_BURST)
PRINTLN("TASKING PED TO SHOOT AT ENTITY WITH INDEX: ", idx, " NUMBER: ", idx2)
ENDIF
ENDIF
ENDREPEAT
// Gazebo or large prop
IF NOT IS_VECTOR_ZERO(authoredData.vGazeboPos)
oGazebo[idx] = CREATE_OBJECT(authoredDataProps.mnGazeboProp[idx], authoredData.vGazeboPos)
IF DOES_ENTITY_EXIST(oGazebo[idx])
SET_ENTITY_LOD_DIST(oGazebo[idx], 1000)
ENDIF
ENDIF
ENDIF
//
// Create vehicles
//
IF myArgs.bDoStationary
cargoArgs.vehDropoff[idx] = CREATE_VEHICLE(myData.stationaryCarNames[idx], authoredData.vCarPos[0], authoredData.fCarOri[0])
SET_ENTITY_LOAD_COLLISION_FLAG(cargoArgs.vehDropoff[idx], TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(cargoArgs.vehDropoff[idx])
SET_ENTITY_LOD_DIST(cargoArgs.vehDropoff[idx], 1000)
IF SHOULD_LIGHTS_BE_ON()
SET_VEHICLE_LIGHTS(cargoArgs.vehDropoff[idx], FORCE_VEHICLE_LIGHTS_ON)
PRINTLN("TURNING LIGHTS ON VEHICLE")
ENDIF
// FREEZE_ENTITY_POSITION(cargoArgs.vehDropoff[idx], TRUE)
PRINTLN("STATIONARY - CREATING VEHICLE DROPOFF: ", idx, " AT LOCATION: ", authoredData.vCarPos[0])
// SET_ENTITY_LOAD_COLLISION_FLAG(cargoArgs.vehDropoff[idx], TRUE)
// Additional vehicles
count = 3 //GET_RANDOM_INT_IN_RANGE(1,4)
REPEAT count idx2
IF NOT IS_VECTOR_ZERO(authoredData.vCarPos[idx2+1])
PRINTLN("DropLocation: ", idx, " Car: ", idx2, " Posiiton: ", authoredData.vCarPos[idx2+1])
vehStationaryCars[idx][idx2] = CREATE_VEHICLE(myData.stationaryCarNames[idx2], authoredData.vCarPos[idx2+1], authoredData.fCarOri[idx2+1])
SET_VEHICLE_ON_GROUND_PROPERLY(vehStationaryCars[idx][idx2])
SET_ENTITY_LOD_DIST(vehStationaryCars[idx][idx2], 1000)
// FREEZE_ENTITY_POSITION(vehStationaryCars[idx][idx2], TRUE)
IF SHOULD_LIGHTS_BE_ON()
SET_VEHICLE_LIGHTS(vehStationaryCars[idx][idx2], FORCE_VEHICLE_LIGHTS_ON)
PRINTLN("TURNING LIGHTS ON VEHICLE")
ENDIF
IF authoredData.fCarOri[idx2+1] = 0
SET_ENTITY_HEADING(vehStationaryCars[idx][idx2], GET_RANDOM_FLOAT_IN_RANGE(0, 360))
ENDIF
ENDIF
ENDREPEAT
ELSE
cargoArgs.vehDropoff[idx] = CREATE_VEHICLE(myData.targetCarNames[idx], authoredData.vCarPos[0])
PRINTLN("CREATING VEHICLE DROPOFF: ", idx, " AT LOCATION: ", authoredData.vCarPos[0])
SET_ENTITY_LOAD_COLLISION_FLAG(cargoArgs.vehDropoff[idx], TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(cargoArgs.vehDropoff[idx])
PRINTLN("AFTER: CREATING VEHICLE DROPOFF: ", idx, " AT LOCATION: ", authoredData.vCarPos[0])
ENDIF
IF cargoArgs.PTFXflare[idx] = NULL
DEBUG_MESSAGE("Particle effect is null!!")
ENDIF
ENDREPEAT
//ENDIF
ENDPROC
PROC CREATE_FLARES_AT_DROP_SITES(PLANE_CARGO_ARGS &cargoArgs, PLANE_DATA& myData, ARGS& myArgs)
INT idx
REPEAT myData.iNumDrops idx
VECTOR vTemp, vColour
IF ARE_VECTORS_EQUAL(myData.dropData[idx].vDrugPickup, <<0,0,0>>)
vTemp = myData.dropData[idx].vCenterPos
ELSE
vTemp = myData.dropData[idx].vDrugPickup
ENDIF
IF NOT myArgs.bDoTrain AND NOT myArgs.bDoUberBombs
IF NOT myArgs.bDoBomb
vColour = <<1.0, 0.84, 0.0>>
ELSE
vColour = <<0.8, 0.18, 0.19>>
ENDIF
IF NOT DOES_PARTICLE_FX_LOOPED_EXIST(cargoArgs.PTFXflare[idx])
cargoArgs.PTFXflare[idx] = START_PARTICLE_FX_LOOPED_AT_COORD("scr_drug_traffic_flare_L", vTemp, <<0,0,0>>)
SET_PARTICLE_FX_LOOPED_COLOUR(cargoArgs.PTFXflare[idx], vColour.x, vColour.y, vColour.z)
PRINTLN("NEW: STARTING FLARE PARTICLE EFFECT")
ENDIF
ENDIF
ENDREPEAT
ENDPROC
PROC CREATE_DROPOFF_STAGING_TRAIN(ARGS& myArgs, PLANE_CARGO_ARGS& cargoArgs, PLANE_DATA& myData, AIR_VARIATION myVariation)
myVariation = myVariation
INT idx, idx2
VECTOR vSmallBoatOffset = <<0, -3.0, 0.8>>
ADD_RELATIONSHIP_GROUP("ENEMIES", grpEnemies)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, grpEnemies, RELGROUPHASH_PLAYER)
cargoArgs.vehDropoff[0] = CREATE_MISSION_TRAIN(6, myArgs.genVectors[0], myArgs.bGenBools[0])
IF NOT IS_ENTITY_DEAD(cargoArgs.vehDropoff[0])
SET_ENTITY_LOD_DIST(cargoArgs.vehDropoff[0], 1000)
SET_TRAIN_CRUISE_SPEED(cargoArgs.vehDropoff[0], 18.0)
SET_TRAIN_SPEED(cargoArgs.vehDropoff[0], 18.0)
ENDIF
REPEAT 4 idx
SET_ENTITY_LOD_DIST(GET_TRAIN_CARRIAGE(cargoArgs.vehDropoff[0], idx), 1000)
ENDREPEAT
// Yacht
cargoArgs.vehDropoff[1] = CREATE_VEHICLE(myData.boatNames[0], << -2020.55, 4735.80, 0.39 >>, 134.50)
SET_ENTITY_LOD_DIST(cargoArgs.vehDropoff[1], 1000)
pedStationaryPeds[0][0] = CREATE_PED_INSIDE_VEHICLE(cargoArgs.vehDropoff[1], PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0])
pedStationaryPeds[0][1] = CREATE_PED(PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0], << -1985.6525, 4769.1455, -3.6671 >>)
ATTACH_ENTITY_TO_ENTITY(pedStationaryPeds[0][1], cargoArgs.vehDropoff[1], 0, <<-0.16, -4.56, 1.45>>, <<0, 0, 90.72>>, TRUE, TRUE)
TASK_SHOOT_AT_ENTITY(pedStationaryPeds[0][1], PLAYER_PED_ID(), -1, FIRING_TYPE_DEFAULT)
//SET_ENTITY_LOAD_COLLISION_FLAG(cargoArgs.vehDropoff[1], TRUE)
// Small Boat
cargoArgs.vehFinalExtra[0] = CREATE_VEHICLE(myData.boatNames[1], << -2029.95, 4744.09, 0.39 >>, 77.31)
SET_ENTITY_LOD_DIST(cargoArgs.vehFinalExtra[0], 1000)
pedStationaryPeds[0][2] = CREATE_PED_INSIDE_VEHICLE(cargoArgs.vehFinalExtra[0], PEDTYPE_CRIMINAL, myData.targetCarDriverNames[1])
pedStationaryPeds[0][3] = CREATE_PED(PEDTYPE_CRIMINAL, myData.targetCarDriverNames[1], << -1976.4246, 4748.5498, -2.7524 >>)
ATTACH_ENTITY_TO_ENTITY(pedStationaryPeds[0][3], cargoArgs.vehFinalExtra[0], 0, vSmallBoatOffset, <<0, 0, 90.72>>, TRUE, TRUE)
TASK_SHOOT_AT_ENTITY(pedStationaryPeds[0][3], PLAYER_PED_ID(), -1, FIRING_TYPE_DEFAULT)
//SET_ENTITY_LOAD_COLLISION_FLAG(cargoArgs.vehFinalExtra[0], TRUE)
// Small Boat
cargoArgs.vehFinalExtra[1] = CREATE_VEHICLE(myData.boatNames[1], << -2028.16, 4739.94, 0.39 >>, 89.54)
SET_ENTITY_LOD_DIST(cargoArgs.vehFinalExtra[1], 1000)
pedStationaryPeds[1][0] = CREATE_PED_INSIDE_VEHICLE(cargoArgs.vehFinalExtra[1], PEDTYPE_CRIMINAL, myData.targetCarDriverNames[0])
pedStationaryPeds[1][1] = CREATE_PED(PEDTYPE_CRIMINAL, myData.targetCarDriverNames[1], << -1968.9366, 4758.7271, -2.8807 >>)
ATTACH_ENTITY_TO_ENTITY(pedStationaryPeds[1][1], cargoArgs.vehFinalExtra[1], 0, vSmallBoatOffset, <<0, 0, 90.72>>, TRUE, TRUE)
TASK_SHOOT_AT_ENTITY(pedStationaryPeds[1][1], PLAYER_PED_ID(), -1, FIRING_TYPE_DEFAULT)
//SET_ENTITY_LOAD_COLLISION_FLAG(cargoArgs.vehFinalExtra[1], TRUE)
// Yacht
cargoArgs.vehFinalExtra[2] = CREATE_VEHICLE(myData.boatNames[0], << -2035.27, 4735.40, -0.16 >>, 103.55)
SET_ENTITY_LOD_DIST(cargoArgs.vehFinalExtra[2], 1000)
pedStationaryPeds[1][2] = CREATE_PED_INSIDE_VEHICLE(cargoArgs.vehFinalExtra[2], PEDTYPE_CRIMINAL, myData.targetCarDriverNames[1])
pedStationaryPeds[1][3] = CREATE_PED(PEDTYPE_CRIMINAL, myData.targetCarDriverNames[1], << -1986.3005, 4768.8428, -3.6552 >>)
ATTACH_ENTITY_TO_ENTITY(pedStationaryPeds[1][3], cargoArgs.vehFinalExtra[2], 0, <<-0.16, -4.56, 1.45>>, <<0, 0, 90.72>>, TRUE, TRUE)
TASK_SHOOT_AT_ENTITY(pedStationaryPeds[1][3], PLAYER_PED_ID(), -1, FIRING_TYPE_DEFAULT)
//SET_ENTITY_LOAD_COLLISION_FLAG(cargoArgs.vehFinalExtra[2], TRUE)
// Small Boat
cargoArgs.vehFinalExtra[3] = CREATE_VEHICLE(myData.boatNames[1], << -2030.35, 4731.77, 0.39 >>, 127.40)
SET_ENTITY_LOD_DIST(cargoArgs.vehFinalExtra[3], 1000)
pedStationaryPeds[2][0] = CREATE_PED_INSIDE_VEHICLE(cargoArgs.vehFinalExtra[3], PEDTYPE_CRIMINAL, myData.targetCarDriverNames[1])
pedStationaryPeds[2][1] = CREATE_PED(PEDTYPE_CRIMINAL, myData.targetCarDriverNames[1], << -1975.3752, 4766.6040, -3.4422 >>)
ATTACH_ENTITY_TO_ENTITY(pedStationaryPeds[2][1], cargoArgs.vehFinalExtra[3], 0, vSmallBoatOffset, <<0, 0, 90.72>>, TRUE, TRUE)
TASK_SHOOT_AT_ENTITY(pedStationaryPeds[2][1], PLAYER_PED_ID(), -1, FIRING_TYPE_DEFAULT)
//SET_ENTITY_LOAD_COLLISION_FLAG(cargoArgs.vehFinalExtra[3], TRUE)
// Can't seemt o keep collision loaded, and boats are sinking underground...
cargoArgs.bTraf4_FreezeBoats = TRUE
REPEAT 3 idx
REPEAT 4 idx2
IF DOES_ENTITY_EXIST(pedStationaryPeds[idx][idx2])
GIVE_WEAPON_TO_PED(pedStationaryPeds[idx][idx2], WEAPONTYPE_ASSAULTRIFLE, -1, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedStationaryPeds[idx][idx2], TRUE)
SET_PED_RELATIONSHIP_GROUP_HASH(pedStationaryPeds[idx][idx2], grpEnemies)
SET_ENTITY_LOD_DIST(pedStationaryPeds[idx][idx2], 1000)
SET_PED_ACCURACY(pedStationaryPeds[idx][idx2], 0)
ENDIF
ENDREPEAT
ENDREPEAT
SET_RANDOM_TRAINS(FALSE)
ENDPROC
PROC STOP_ALL_PARTICLES(PLANE_CARGO_ARGS& cargoArgs, PLANE_DATA& myData)
DEBUG_MESSAGE("STOP_ALL_PARTICLES")
INT idx
REPEAT myData.iNumDrops idx
// IF cargoArgs.PTFXflare[idx] <> NULL
IF DOES_PARTICLE_FX_LOOPED_EXIST(cargoArgs.PTFXflare[idx])
DEBUG_MESSAGE("Stopping a particle effect")
STOP_PARTICLE_FX_LOOPED(cargoArgs.PTFXflare[idx])
// cargoArgs.PTFXflare[idx] = NULL
ENDIF
ENDREPEAT
ENDPROC
PROC HANDLE_RECORDING_START(VEHICLE_INDEX myVehicle, STRING recordingName, INT num, VECTOR checkLoc, RECORD_STATUS& myStatus, INT iTriggerDistance = 260, BOOL bExplodeEarly = FALSE)
FLOAT fTimePosition
SWITCH myStatus
CASE RECORD_STATUS_INIT
IF NOT IS_ENTITY_DEAD(myVehicle)
IF GET_DISTANCE_BETWEEN_COORDS(checkLoc, vPlayerPos, FALSE) < iTriggerDistance
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(myVehicle)
START_PLAYBACK_RECORDED_VEHICLE(myVehicle, num, recordingName)
SET_VEHICLE_ENGINE_ON(myVehicle, TRUE, TRUE)
myStatus = RECORD_STATUS_PLAYING
ENDIF
ENDIF
ENDIF
BREAK
CASE RECORD_STATUS_PLAYING
IF NOT IS_ENTITY_DEAD(myVehicle)
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(myVehicle)
EXPLODE_VEHICLE(myVehicle)
SET_VEHICLE_AS_NO_LONGER_NEEDED(myVehicle)
PRINTLN("SETTING VEHICLE AS NO LONGER NEEDED - 1")
myStatus = RECORD_STATUS_END
ELSE
IF bExplodeEarly
fTimePosition = GET_TIME_POSITION_IN_RECORDING(myVehicle)
// PRINTLN("fTimePosition = ", fTimePosition)
IF fTimePosition > 35500
EXPLODE_VEHICLE(myVehicle)
PRINTLN("EXPLODING PLANE EARLY")
SET_VEHICLE_AS_NO_LONGER_NEEDED(myVehicle)
PRINTLN("SETTING VEHICLE AS NO LONGER NEEDED - 2")
ENDIF
ENDIF
ENDIF
ELSE
SET_VEHICLE_AS_NO_LONGER_NEEDED(myVehicle)
PRINTLN("SETTING VEHICLE AS NO LONGER NEEDED - 3")
myStatus = RECORD_STATUS_END
ENDIF
BREAK
CASE RECORD_STATUS_END
BREAK
ENDSWITCH
ENDPROC
FUNC INT GET_NUMBER_OF_REMAINING_CARGO(INT& iTotalCargo, INT& iNumLanded)
RETURN (iTotalCargo - iNumLanded)
ENDFUNC
FUNC BOOL ARE_DROPS_COMPLETE(PLANE_CARGO_ARGS &cargoArgs, PLANE_DATA& myData)
INT idx
BOOL bAllDropsComplete = TRUE
REPEAT myData.iNumDrops idx
IF NOT cargoArgs.bCargoDropComplete[idx]
bAllDropsComplete = FALSE
ENDIF
ENDREPEAT
IF bAllDropsComplete
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
FUNC BOOL HAS_PLAYER_PASSED(ARGS& myArgs, PLANE_CARGO_ARGS &cargoArgs)
//Used to have a "money to pass" system.. myArgs.iMoneyToPass
INT fMoneyEarned = cargoArgs.iNumSuccessfulDrops * REWARD_MEDIUM
IF fMoneyEarned >= myArgs.iMoneyToPass
cargoArgs.bPassed = TRUE
RETURN TRUE
ELSE
cargoArgs.bPassed = FALSE
RETURN FALSE
ENDIF
ENDFUNC
FUNC STRING GET_FINAL_DIALOUGE_STRING(ARGS& myArgs, PLANE_DATA& myData, PLANE_CARGO_ARGS &cargoArgs, BOOL bSucess)
STRING returnString
INT iRandConvo
IF myArgs.bDoBomb
//If we're an overall fail
IF NOT HAS_PLAYER_PASSED(myArgs, cargoArgs)
//If we're an overall fail
returnString = "ARMS_AIR_BF"
ELSE
IF NOT bSucess
returnString = "ARMS_A_LBFB" //Oscar telling you your last bomb drop was a FAIL, you're out of bombs, and you now need to land
ELSE
IF GET_NUMBER_OF_REMAINING_CARGO(myData.iNumTotalCargo, cargoArgs.iNumLanded) = 0
returnString = "ARMS_A_LBPB" //Oscar telling you your last bomb drop was a sucess, you're out of bombs, and you now need to land
iRandConvo = GET_RANDOM_INT_IN_RANGE() % 4
IF iRandConvo = 0
returnString = "ARMS_A_LBPB" //Oscar telling you your last bomb drop was a sucess, you're out of targets, and you now need to land LBPT = "Land, bomb, pass, targets"
ELIF iRandConvo = 1
returnString = "ARMS_A_LBPB2"
ELIF iRandConvo = 2
returnString = "ARMS_A_LBPB3"
ELIF iRandConvo = 3
returnString = "ARMS_A_LBPB4"
ENDIF
ELSE
iRandConvo = GET_RANDOM_INT_IN_RANGE() % 4
IF iRandConvo = 0
returnString = "ARMS_A_LPPT" //Oscar telling you your last bomb drop was a sucess, you're out of targets, and you now need to land LBPT = "Land, bomb, pass, targets"
ELIF iRandConvo = 1
returnString = "ARMS_A_LPPT2"
ELIF iRandConvo = 2
returnString = "ARMS_A_LPPT3"
ELIF iRandConvo = 3
returnString = "ARMS_A_LPPT4"
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
//ARMS_AIR_PF Oscar telling you that you've failed to complete enough drops with pacakges
IF NOT HAS_PLAYER_PASSED(myArgs, cargoArgs)
//If we're an overall fail
returnString = "ARMS_AIR_PF"
ELSE
IF NOT bSucess
returnString = "ARMS_A_LPFP" //Oscar telling you your last package drop was a FAIL, you're out of packages, and you now need to land.
ELSE
IF GET_NUMBER_OF_REMAINING_CARGO(myData.iNumTotalCargo, cargoArgs.iNumLanded) = 0
iRandConvo = GET_RANDOM_INT_IN_RANGE() % 3
IF iRandConvo = 0
returnString = "ARMS_A_LPPP" // Oscar telling you your last package drop was a sucess, you're out of packages, and you now need to land.
ELIF iRandConvo = 1
returnString = "ARMS_A_LPPP2"
ELIF iRandConvo = 2
returnString = "ARMS_A_LPPP3"
ELIF iRandConvo = 3
returnString = "ARMS_A_LPPP4"
ENDIF
ELSE
iRandConvo = GET_RANDOM_INT_IN_RANGE() % 4
IF iRandConvo = 0
returnString = "ARMS_A_LBPT" // Oscar telling you your last package drop was a sucess, you're out of targerts, and you now need to land.
ELIF iRandConvo = 1
returnString = "ARMS_A_LBPT2"
ELIF iRandConvo = 2
returnString = "ARMS_A_LBPT3"
ELIF iRandConvo = 3
returnString = "ARMS_A_LBPT4"
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN returnString
ENDFUNC
PROC HANDLE_MUSIC_ON_SUCCESSFUL_DROPS(PLANE_CARGO_ARGS &cargoArgs, BOOL& bDoBomb, ARGS& myArgs)
IF g_savedGlobals.sTraffickingData.iAirRank >= 5
IF bDoBomb
IF myArgs.bDoTrain
TRIGGER_MUSIC_EVENT("OJDA4_TRAIN_HIT")
PRINTLN("REPEATABLE TRAIN: HANDLE_MUSIC_ON_SUCCESSFUL_DROPS MUSIC - OJDA4_TRAIN_HIT")
PRINTLN("REPEATABLE TRAIN: HANDLE_MUSIC_ON_SUCCESSFUL_DROPS: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
ELSE
TRIGGER_MUSIC_EVENT("OJDA3_BOMB_HIT")
PRINTLN("REPEATABLE BOMB: HANDLE_MUSIC_ON_SUCCESSFUL_DROPS - OJDA3_BOMB_HIT")
PRINTLN("REPEATABLE BOMB: HANDLE_MUSIC_ON_SUCCESSFUL_DROPS: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
ENDIF
ELSE
TRIGGER_MUSIC_EVENT("OJDA2_1ST_DROPPED")
PRINTLN("REPEATABLE DROP: HANDLE_MUSIC_ON_SUCCESSFUL_DROPS - OJDA2_1ST_DROPPED")
PRINTLN("REPEATABLE DROP: HANDLE_MUSIC_ON_SUCCESSFUL_DROPS: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
ENDIF
ENDIF
SWITCH g_savedGlobals.sTraffickingData.iAirRank
CASE 0
IF cargoArgs.iNumSuccessfulDrops = 0
TRIGGER_MUSIC_EVENT("OJDA1_1ST_DROPPED")
PRINTLN("TRIGGERING MUSIC - OJDA1_1ST_DROPPED")
ELIF cargoArgs.iNumSuccessfulDrops = 1
TRIGGER_MUSIC_EVENT("OJDA1_2ND_DROPPED")
PRINTLN("TRIGGERING MUSIC - OJDA1_2ND_DROPPED")
ENDIF
PRINTLN("g_savedGlobals.sTraffickingData.iAirRank = ", g_savedGlobals.sTraffickingData.iAirRank)
BREAK
//---------------------------------------------------------------------------------------------------------------------------
CASE 1
TRIGGER_MUSIC_EVENT("OJDA2_1ST_DROPPED")
PRINTLN("TRIGGERING MUSIC - OJDA2_1ST_DROPPED")
BREAK
//---------------------------------------------------------------------------------------------------------------------------
CASE 2
TRIGGER_MUSIC_EVENT("OJDA3_BOMB_HIT")
PRINTLN("TRIGGERING MUSIC - OJDA3_BOMB_HIT")
BREAK
//---------------------------------------------------------------------------------------------------------------------------
CASE 3
TRIGGER_MUSIC_EVENT("OJDA4_TRAIN_HIT")
PRINTLN("TRIGGERING MUSIC - OJDA4_TRAIN_HIT")
IF cargoArgs.iNumSuccessfulDrops = 0
TRIGGER_MUSIC_EVENT("OJDA4_1_LEFT")
PRINTLN("TRIGGERING MUSIC - OJDA4_1_LEFT")
ENDIF
BREAK
//---------------------------------------------------------------------------------------------------------------------------
CASE 4
BREAK
ENDSWITCH
ENDPROC
PROC HANDLE_DROP_SUCESS(PLANE_CARGO_ARGS &cargoArgs, PLANE_DATA& myData, AIR_VARIATION myVariation,
ARGS& myArgs, INT iCargo, INT iDrop, VECTOR& vCurDestObjective[], BOOL& bDoBomb, BOOL bUsedBomb = TRUE)
bUsedBomb = bUsedBomb
BOOL bDone = FALSE
myVariation = myVariation
STRING tempLine
INT iRandConvo
//on every successful drop we can do another warning.
bDistWarned = FALSE
HANDLE_MUSIC_ON_SUCCESSFUL_DROPS(cargoArgs, bDoBomb, myArgs)
cargoArgs.iNumSuccessfulDrops++
cargoArgs.bCargoSuccessful[iCargo] = TRUE
PRINTLN("CARGO SUCCESSFUL = ", iCargo)
cargoArgs.bDropSuccessful[iDrop] = TRUE
PRINTLN("DROP SUCCESSFUL = ", iDrop)
cargoArgs.bCargoDropComplete[iDrop] = TRUE
PRINTLN("DROP COMPLETE = ", iDrop)
cargoArgs.bCargoComplete[iCargo] = TRUE
PRINTLN("CARGO COMPLETE = ", iCargo)
cargoArgs.bCompletedOneDrop = TRUE
DEBUG_MESSAGE("cargoArgs.bCompletedOneDrop = TRUE")
PRINTNL()
// IF cargoArgs.fActualMaxHeight < myData.fmaxHeight
// DEBUG_MESSAGE("setting height bonus to true..")
// cargoArgs.bCargoHeightBonus[iDrop] = TRUE
// ELSE
// DEBUG_MESSAGE("setting height bonus to false..")
// cargoArgs.bCargoHeightBonus[iDrop] = FALSE
// ENDIF
cargoArgs.fActualMaxHeight = 0
IF cargoArgs.PTFXflare[iDrop] <> NULL
STOP_PARTICLE_FX_LOOPED(cargoArgs.PTFXflare[iDrop])
cargoArgs.PTFXflare[iDrop] = NULL
ENDIF
//If we're done we want to play specific dialouge
IF GET_NUMBER_OF_REMAINING_CARGO(myData.iNumTotalCargo, cargoArgs.iNumLanded) = 0
OR ARE_DROPS_COMPLETE(cargoArgs, myData)
bDone = TRUE
CLEAR_HELP()
bRemoveHUD = TRUE
ODDJOB_STOP_SOUND(iSirenSoundID)
ODDJOB_STOP_SOUND(iSirenSoundID2)
ODDJOB_STOP_SOUND(iSirenSoundID3)
STOP_SCRIPTED_CONVERSATION(FALSE)
IF IS_AUDIO_SCENE_ACTIVE("SIREN_SCENE")
STOP_AUDIO_SCENE("SIREN_SCENE")
PRINTLN("STOPPING AUDIO SCENE - SIREN_SCENE VIA HANDLE_DROP_SUCESS")
ENDIF
tempLine = GET_FINAL_DIALOUGE_STRING(myArgs, myData, cargoArgs, TRUE)
ENDIF
vCurDestObjective[iDrop] = <<0,0,0>>
IF myArgs.bDoBomb
IF NOT myArgs.bDoUberBombs
CLEANUP_EXPLOSION_CAM(cargoArgs, cargoARgs.oCargoDrop[iCargo], iCargo, 0, NOT bCollisionDetected)
ENDIF
DEBUG_MESSAGE("Handle_Drop_sucess clear prints")
CLEAR_PRINTS()
IF bDone
//final line is extra import.. add to queued system if conversation is currently going
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
REGISTER_QUICK_CONV_QUEUE(MyLocalPedStruct, "ARMSAUD", tempLine)
//Need to do our own conversation queue
ELSE
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", tempLine, CONV_PRIORITY_VERY_HIGH)
ENDIF
ELSE
IF myArgs.bDoUberBombs
iRandConvo = GET_RANDOM_INT_IN_RANGE() % 6
IF iRandConvo = 0
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_SMB", CONV_PRIORITY_VERY_HIGH)
PRINTLN("UBER BOMB SUCCESS: iRandConvo = ", iRandConvo)
ELIF iRandConvo = 1
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_SM2", CONV_PRIORITY_VERY_HIGH)
PRINTLN("UBER BOMB SUCCESS: iRandConvo = ", iRandConvo)
ELIF iRandConvo = 2
IF cargoArgs.iNumSuccessfulDrops = 2
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_SM3", CONV_PRIORITY_VERY_HIGH)
PRINTLN("SPECIAL CASE: UBER BOMB SUCCESS: iRandConvo = ", iRandConvo)
ELSE
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_SM4", CONV_PRIORITY_VERY_HIGH)
PRINTLN("SPECIAL CASE: UBER BOMB SUCCESS: iRandConvo = ", iRandConvo)
ENDIF
ELIF iRandConvo = 3
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_SM4", CONV_PRIORITY_VERY_HIGH)
PRINTLN("UBER BOMB SUCCESS: iRandConvo = ", iRandConvo)
ELIF iRandConvo = 4
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_SM5", CONV_PRIORITY_VERY_HIGH)
PRINTLN("UBER BOMB SUCCESS: iRandConvo = ", iRandConvo)
ELIF iRandConvo = 5
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_SM6", CONV_PRIORITY_VERY_HIGH)
PRINTLN("UBER BOMB SUCCESS: iRandConvo = ", iRandConvo)
ENDIF
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
REGISTER_QUICK_CONV_QUEUE(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_SB", TRUE)
ELSE
iRandConvo = GET_RANDOM_INT_IN_RANGE() % 3
IF iRandConvo = 0
PRINTLN("YEEHAH - PACKAGE SUCCESS: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "OSCAR_YEEHA", CONV_PRIORITY_VERY_HIGH)
ELSE
iRandConvo = GET_RANDOM_INT_IN_RANGE() % 6
IF iRandConvo = 0
PRINTLN("BOMB SUCCESS: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_SB", CONV_PRIORITY_VERY_HIGH)
ELIF iRandConvo = 1
PRINTLN("BOMB SUCCESS: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_SB2", CONV_PRIORITY_VERY_HIGH)
ELIF iRandConvo = 2
PRINTLN("BOMB SUCCESS: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_SB3", CONV_PRIORITY_VERY_HIGH)
ELIF iRandConvo = 3
PRINTLN("BOMB SUCCESS: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_SB4", CONV_PRIORITY_VERY_HIGH)
ELIF iRandConvo = 4
PRINTLN("BOMB SUCCESS: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_SB5", CONV_PRIORITY_VERY_HIGH)
ELIF iRandConvo = 5
PRINTLN("BOMB SUCCESS: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_SB6", CONV_PRIORITY_VERY_HIGH)
ENDIF
ENDIF
ENDIF
ENDIF
IF bUsedBomb
IF myArgs.bDoUberBombs
REGISTER_QUICK_DELAY("DTRFAIR_PASSC")
ELSE
REGISTER_QUICK_DELAY("DTRFAIR_PASSB")
ENDIF
ENDIF
ENDIF
ELSE
DEBUG_MESSAGE("Handle_Drop_sucess clear prints")
CLEAR_PRINTS()
PLAY_SOUND_FRONTEND(-1, "CONFIRM_BEEP", "HUD_MINI_GAME_SOUNDSET")
PRINTLN("PLAYING BEEP SOUND FROM FRONTEND")
IF bDone
//final line is extra import.. add to queued system if conversation is currently going
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
REGISTER_QUICK_CONV_QUEUE(MyLocalPedStruct, "ARMSAUD", tempLine)
//Need to do our own conversation queue
ELSE
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", tempLine, CONV_PRIORITY_VERY_HIGH)
ENDIF
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
REGISTER_QUICK_CONV_QUEUE(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_S", TRUE)
ELSE
iRandConvo = GET_RANDOM_INT_IN_RANGE() % 3
IF iRandConvo = 0
PRINTLN("YEEHAH - PACKAGE SUCCESS: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "OSCAR_YEEHA", CONV_PRIORITY_VERY_HIGH)
ELSE
iRandConvo = GET_RANDOM_INT_IN_RANGE() % 6
IF iRandConvo = 0
PRINTLN("PACKAGE SUCCESS: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_S", CONV_PRIORITY_VERY_HIGH)
ELIF iRandConvo = 1
PRINTLN("PACKAGE SUCCESS: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_S2", CONV_PRIORITY_VERY_HIGH)
ELIF iRandConvo = 2
PRINTLN("PACKAGE SUCCESS: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_S3", CONV_PRIORITY_VERY_HIGH)
ELIF iRandConvo = 3
PRINTLN("PACKAGE SUCCESS: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_S4", CONV_PRIORITY_VERY_HIGH)
ELIF iRandConvo = 4
PRINTLN("PACKAGE SUCCESS: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_S5", CONV_PRIORITY_VERY_HIGH)
ELIF iRandConvo = 5
PRINTLN("PACKAGE SUCCESS: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_S6", CONV_PRIORITY_VERY_HIGH)
ENDIF
ENDIF
ENDIF
IF bUsedBomb
REGISTER_QUICK_DELAY("DTRFAIR_PASS")
ENDIF
ENDIF
ENDIF
//DISPLAY_PACKAGE_PRINT(myARgs, cargoArgs, GET_NUMBER_OF_REMAINING_CARGO(myData.iNumTotalCargo, cargoArgs.iNumLanded), TRUE)
ENDPROC
PROC HANDLE_DROP_FAIL(PLANE_CARGO_ARGS &cargoArgs, PLANE_DATA& myData, AIR_VARIATION myVariation, ARGS& myArgs, INT iCargo)
BOOL bDone = FALSE
STRING tempLine
INT iRandConvo
IF cargoArgs.bCargoHitGround[iCargo] AND NOT cargoArgs.bCargoComplete[iCargo] AND NOT cargoArgs.bCargoSuccessful[iCargo]
//If we're done we want to play specific dialouge
IF GET_NUMBER_OF_REMAINING_CARGO(myData.iNumTotalCargo, cargoArgs.iNumLanded) = 0
OR ARE_DROPS_COMPLETE(cargoArgs, myData)
bDone = TRUE
STOP_SCRIPTED_CONVERSATION(FALSE)
tempLine = GET_FINAL_DIALOUGE_STRING(myArgs, myData, cargoArgs, FALSE)
ENDIF
IF myVariation = AIR_VARIATION_BOMB AND cargoArgs.iCutGameTimeStart <> 0
CLEANUP_EXPLOSION_CAM(cargoArgs, cargoARgs.oCargoDrop[iCargo], iCargo, 0, NOT bCollisionDetected)
ENDIF
IF myARgs.bDoLockOn
CLEANUP_QUICK_CAM(cargoArgs, bLocked, iLockedIdx)
ENDIF
//cargoArgs.iNumFailedDrops ++
cargoArgs.bCargoFailed[iCargo] = TRUE
cargoArgs.bCargoComplete[iCargo] = TRUE
SCRIPT_REMOVE_BLIP_SAFE(cargoArgs.blipCrateDrop[iCargo])
DEBUG_MESSAGE("HANDLE_DROP_FAIL")
CLEAR_PRINTS()
IF bDone
//final line is extra import.. add to queued system if conversation is currently going
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
REGISTER_QUICK_CONV_QUEUE(MyLocalPedStruct, "ARMSAUD", tempLine)
//Need to do our own conversation queue
ELSE
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", tempLine, CONV_PRIORITY_VERY_HIGH)
ENDIF
ELSE
IF myArgs.bDoUberBombs AND bHitATarget
PRINTLN("bHitATarget SHOULD BE TRUE")
IF bUberReminder
PRINT_HELP("DTRFAIR_HELPL")
bUberReminder = FALSE
ENDIF
iRandConvo = GET_RANDOM_INT_IN_RANGE() % 6
IF iRandConvo = 0
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_FMB", CONV_PRIORITY_VERY_HIGH)
REGISTER_QUICK_DELAY("DTRFAIR_OBJCF")
PRINTLN("PLAYING CONVO - ARMS_AIR_FMB, RANDOM: ", iRandConvo)
ELIF iRandConvo = 1
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_FM2", CONV_PRIORITY_VERY_HIGH)
REGISTER_QUICK_DELAY("DTRFAIR_OBJCF")
PRINTLN("PLAYING CONVO - ARMS_AIR_FM2, RANDOM: ", iRandConvo)
ELIF iRandConvo = 2
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_FM3", CONV_PRIORITY_VERY_HIGH)
REGISTER_QUICK_DELAY("DTRFAIR_OBJCF")
PRINTLN("PLAYING CONVO - ARMS_AIR_FM3, RANDOM: ", iRandConvo)
ELIF iRandConvo = 3
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_FM4", CONV_PRIORITY_VERY_HIGH)
REGISTER_QUICK_DELAY("DTRFAIR_OBJCF")
PRINTLN("PLAYING CONVO - ARMS_AIR_FM4, RANDOM: ", iRandConvo)
ELIF iRandConvo = 4
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_FM5", CONV_PRIORITY_VERY_HIGH)
REGISTER_QUICK_DELAY("DTRFAIR_OBJCF")
PRINTLN("PLAYING CONVO - ARMS_AIR_FM5, RANDOM: ", iRandConvo)
ELIF iRandConvo = 5
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_FM6", CONV_PRIORITY_VERY_HIGH)
REGISTER_QUICK_DELAY("DTRFAIR_OBJCF")
PRINTLN("PLAYING CONVO - ARMS_AIR_FM6, RANDOM: ", iRandConvo)
ENDIF
ELIF myArgs.bDoUberBombs AND NOT bHitATarget
PRINTLN("bHitATarget SHOULD BE FALSE - NO TARGETS HIT")
iRandConvo = GET_RANDOM_INT_IN_RANGE() % 6
IF iRandConvo = 0
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_A_FMBN", CONV_PRIORITY_VERY_HIGH)
REGISTER_QUICK_DELAY("DTRFAIR_OBJCF")
PRINTLN("PLAYING CONVO - ARMS_A_FMBN, RANDOM: ", iRandConvo)
ELIF iRandConvo = 1
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_A_FMB2", CONV_PRIORITY_VERY_HIGH)
REGISTER_QUICK_DELAY("DTRFAIR_OBJCF")
PRINTLN("PLAYING CONVO - ARMS_A_FMB2, RANDOM: ", iRandConvo)
ELIF iRandConvo = 2
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_A_FMB3", CONV_PRIORITY_VERY_HIGH)
REGISTER_QUICK_DELAY("DTRFAIR_OBJCF")
PRINTLN("PLAYING CONVO - ARMS_A_FMB3, RANDOM: ", iRandConvo)
ELIF iRandConvo = 3
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_A_FMB4", CONV_PRIORITY_VERY_HIGH)
REGISTER_QUICK_DELAY("DTRFAIR_OBJCF")
PRINTLN("PLAYING CONVO - ARMS_A_FMB4, RANDOM: ", iRandConvo)
ELIF iRandConvo = 4
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_A_FMB5", CONV_PRIORITY_VERY_HIGH)
REGISTER_QUICK_DELAY("DTRFAIR_OBJCF")
PRINTLN("PLAYING CONVO - ARMS_A_FMB5, RANDOM: ", iRandConvo)
ELIF iRandConvo = 5
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_A_FMB6", CONV_PRIORITY_VERY_HIGH)
REGISTER_QUICK_DELAY("DTRFAIR_OBJCF")
PRINTLN("PLAYING CONVO - ARMS_A_FMB6, RANDOM: ", iRandConvo)
ENDIF
ELIF myArgs.bDoBomb
iRandConvo = GET_RANDOM_INT_IN_RANGE() % 6
IF iRandConvo = 0
PRINTLN("BOMB FAIL: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_FB", CONV_PRIORITY_VERY_HIGH)
ELIF iRandConvo = 1
PRINTLN("BOMB FAIL: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_FB2", CONV_PRIORITY_VERY_HIGH)
ELIF iRandConvo = 2
PRINTLN("BOMB FAIL: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_FB3", CONV_PRIORITY_VERY_HIGH)
ELIF iRandConvo = 3
PRINTLN("BOMB FAIL: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_FB4", CONV_PRIORITY_VERY_HIGH)
ELIF iRandConvo = 4
PRINTLN("BOMB FAIL: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_FB5", CONV_PRIORITY_VERY_HIGH)
ELIF iRandConvo = 5
PRINTLN("BOMB FAIL: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_FB6", CONV_PRIORITY_VERY_HIGH)
ENDIF
REGISTER_QUICK_DELAY("DTRFAIR_OBJB")
ELSE
iRandConvo = GET_RANDOM_INT_IN_RANGE() % 6
IF iRandConvo = 0
PRINTLN("PACKAGE FAIL: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_F", CONV_PRIORITY_VERY_HIGH)
ELIF iRandConvo = 1
PRINTLN("PACKAGE FAIL: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_F2", CONV_PRIORITY_VERY_HIGH)
ELIF iRandConvo = 2
PRINTLN("PACKAGE FAIL: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_F3", CONV_PRIORITY_VERY_HIGH)
ELIF iRandConvo = 3
PRINTLN("PACKAGE FAIL: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_F4", CONV_PRIORITY_VERY_HIGH)
ELIF iRandConvo = 4
PRINTLN("PACKAGE FAIL: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_F5", CONV_PRIORITY_VERY_HIGH)
ELIF iRandConvo = 5
PRINTLN("PACKAGE FAIL: iRandConvo = ", iRandConvo)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_F6", CONV_PRIORITY_VERY_HIGH)
ENDIF
REGISTER_QUICK_DELAY("DTRFAIR_OBJ")
ENDIF
ENDIF
//DISPLAY_PACKAGE_PRINT(myARgs, cargoArgs, GET_NUMBER_OF_REMAINING_CARGO(myData.iNumTotalCargo, cargoArgs.iNumLanded), TRUE)
DEBUG_PRINT("PRINTING UNSUCCESSFUL DROP")
DEBUG_PRINT("DROP FAILED")
ENDIF
ENDPROC
PROC HANDLE_SIREN_AUDIO_SCENE()
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF (GET_PLAYER_DISTANCE_FROM_LOCATION(<<1701.1, 3292.2, 52.6>>) < 100 )
OR (GET_PLAYER_DISTANCE_FROM_LOCATION(<<1461.3,3091.2,45.8>>) < 100 )
IF NOT IS_AUDIO_SCENE_ACTIVE("SIREN_SCENE")
START_AUDIO_SCENE("SIREN_SCENE")
PRINTLN("STARTING AUDIO SCENE - SIREN_SCENE")
ENDIF
ELSE
IF IS_AUDIO_SCENE_ACTIVE("SIREN_SCENE")
STOP_AUDIO_SCENE("SIREN_SCENE")
PRINTLN("STOPPING AUDIO SCENE - SIREN_SCENE")
ENDIF
ENDIF
ENDIF
ENDPROC
PROC UPDATE_DROPOFF_STAGING(ARGS& myArgs, PLANE_CARGO_ARGS& cargoArgs, PLANE_DATA& myData, BLIP_INDEX& myLocationBlip[],
VECTOR& vCurDestObjective[], AIR_VARIATION myVariation, BOOL& bDoBomb)
UNUSED_PARAMETER(myArgs)
VECTOR myPos
INT idx, idx2, stationIdx
FLOAT fReturnz
//DEBUG_MESSAGE("UPDATE_DROPOFF_STAGING")
REPEAT myData.iNumDrops idx
// If the drop is complete, go ahead and stop the flare particle effect... TODO: make the guy at position do something too.
IF cargoArgs.bCargoDropComplete[idx]
IF cargoArgs.PTFXflare[idx] <> NULL
STOP_PARTICLE_FX_LOOPED(cargoArgs.PTFXflare[idx])
cargoArgs.PTFXflare[idx] = NULL
ENDIF
IF NOT bSwitchedTasks[idx]
IF NOT IS_ENTITY_DEAD(cargoArgs.pedDropoff[idx]) AND NOT IS_PED_INJURED(cargoArgs.pedDropoff[idx])
IF IS_VEHICLE_DRIVEABLE(cargoArgs.vehDropoff[idx])
CLEAR_PED_TASKS(cargoArgs.pedDropoff[idx])
SET_PED_INTO_VEHICLE(cargoArgs.pedDropoff[idx], cargoArgs.vehDropoff[idx])
TASK_VEHICLE_DRIVE_WANDER(cargoArgs.pedDropoff[idx], cargoArgs.vehDropoff[idx], 15.0, DRIVINGMODE_PLOUGHTHROUGH)
PRINTLN("TASKING VEHICLES TO WANDER ON DROP: ", idx)
SET_PED_KEEP_TASK(cargoArgs.pedDropoff[idx], TRUE)
bSwitchedTasks[idx] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF myArgs.bDoStationary or myArgs.bDoUberBombs
IF myArgs.bDoUberBombs
// Only do sirens on air trafficking 5
IF g_savedGlobals.sTraffickingData.iAirRank = 4
// HANDLE_RECORDING_START(cargoArgs.vehFinalExtra[0], "carpetbombplane", 101, << 1730.0139, 3314.9282, 41.7539 >>, cargoArgs.recordingStatus[0], 260, TRUE)
HANDLE_RECORDING_START(cargoArgs.vehFinalExtra[1], "carpetbombtruck", 101, << 1376.1750, 2968.6406, 41.7020 >>, cargoArgs.recordingStatus[1], 850)
HANDLE_RECORDING_START(cargoArgs.vehFinalExtra[2], "CarpetBombNew", 101, << 1498.5651, 3185.2371, 40.1012 >>, cargoArgs.recordingStatus[2])
HANDLE_RECORDING_START(cargoArgs.vehFinalExtra[3], "CarpetBombNew", 102, << 1469.9932, 3203.6406, 41.1834 >>, cargoArgs.recordingStatus[3])
HANDLE_RECORDING_START(cargoArgs.vehFinalExtra[4], "CarpetBombNew", 103, << 1120.4285, 3016.5684, 40.1836 >>, cargoArgs.recordingStatus[4])
HANDLE_RECORDING_START(cargoArgs.vehFinalExtra[5], "CarpetBombNew", 104, << 1468.7660, 3013.5898, 40.3801 >>, cargoArgs.recordingStatus[5])
//IF NOT IS_MESSAGE_BEING_DISPLAYED()
IF bTriggerAlarms AND ( GET_PLAYER_DISTANCE_FROM_LOCATION(<<1701.1, 3292.2, 52.6>>) < 75 OR GET_PLAYER_DISTANCE_FROM_LOCATION(<<1461.3,3091.2,45.8>>) < 75 )
ODDJOB_PLAY_SOUND("Generic_Alarms_Siren", iSirenSoundID, TRUE, NULL, 1701.1, 3292.2, 52.6)
ODDJOB_PLAY_SOUND("Generic_Alarms_Siren", iSirenSoundID2, TRUE, NULL, 1461.3,3091.2,45.8)
ODDJOB_PLAY_SOUND("Generic_Alarms_Siren", iSirenSoundID3, TRUE, NULL, 1261.3,3043.8,43.5)
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_A_CRPA", CONV_PRIORITY_VERY_HIGH)
bTriggerAlarms = FALSE
ENDIF
HANDLE_SIREN_AUDIO_SCENE()
//ENDIF
ENDIF
ELSE
//Only for bomb mode.. Lets try to detect if the player killed all the targets.
BOOL bExtraCarsDead = TRUE
IF NOT cargoArgs.bCargoDropComplete[idx]
//If this drop site hasn't been destroyed lets check to see if the player somehow killd all the extra cars.
REPEAT MAX_EXTRA_CARS idx2
IF NOT IS_ENTITY_DEAD(vehStationaryCars[idx][idx2])
bExtraCarsDead = FALSE
ENDIF
ENDREPEAT
//we manually destroyed a target site
IF bExtraCarsDead
SCRIPT_ASSERT("Triggering manual detection")
PRINTLN("SOMETHING FUCKED UP")
//How do we deal with iCargo.
//cargoArgs.bCargoSuccessful[iCargo] = TRUE
//cargoArgs.bCargoComplete[iCargo] = TRUE
cargoArgs.bDropSuccessful[idx] = TRUE
cargoArgs.bCargoDropComplete[idx] = TRUE
HANDLE_DROP_SUCESS(cargoARgs, myData, myVariation, myArgs, 0, idx, vCurDestObjective, bDoBomb, FALSE)
ENDIF
ENDIF
ENDIF
//Optimize.. why do we loop on this
REPEAT myData.iNumTotalCargo idx2
IF NOT bTaskedPedToFlee[idx]
IF SHOULD_CHECK_CARGO(cargoArgs, idx2)
IF NOT IS_PED_INJURED(cargoArgs.pedDropoff[idx])
IF GET_DISTANCE_BETWEEN_ENTITIES(cargoArgs.oCargoDrop[idx2], cargoArgs.pedDropoff[idx]) < 100
myPos = GET_ENTITY_COORDS(cargoArgs.oCargoDrop[idx2])
IF GET_GROUND_Z_FOR_3D_COORD(myPos, fReturnz)
myPos.z = fReturnz
ENDIF
CLEAR_PED_TASKS(cargoArgs.pedDropoff[idx])
TASK_SMART_FLEE_COORD(cargoArgs.pedDropoff[idx], myPos, 1000, -1)
PLAY_SOUND_FRONTEND(-1, "DRUG_TRAFFIC_AIR_SCREAMS")
PRINTLN("PLAYING PED AMBIENT SPEECH - GENERIC_SHOCKED_HIGH")
REPEAT MAX_NUMBER_DROPS stationIdx
IF NOT IS_ENTITY_DEAD(pedStationaryPeds[idx][stationIdx])
CLEAR_PED_TASKS(pedStationaryPeds[idx][stationIdx])
TASK_SMART_FLEE_COORD(pedStationaryPeds[idx][stationIdx], myPos, 1000, -1)
PRINTLN("PLAYING PED AMBIENT SPEECH - GENERIC_FRIGHTENED_HIGH")
ENDIF
ENDREPEAT
bTaskedPedToFlee[idx] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
//ENDIF
ELSE
IF NOT IS_ENTITY_DEAD(cargoArgs.pedDropoff[idx])
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), cargoArgs.pedDropoff[idx]) < 200
IF IS_PED_ARMED(PLAYER_PED_ID(), WF_INCLUDE_GUN|WF_INCLUDE_PROJECTILE)
IF IS_PED_SHOOTING(PLAYER_PED_ID()) OR IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), cargoArgs.pedDropoff[idx])
IF NOT bSwitchedTasks[idx]
CLEAR_PED_TASKS_IMMEDIATELY(cargoArgs.pedDropoff[idx])
GIVE_WEAPON_TO_PED(cargoArgs.pedDropoff[idx], WEAPONTYPE_PISTOL, 20)
TASK_COMBAT_PED(cargoArgs.pedDropoff[idx], PLAYER_PED_ID())
SET_PED_ACCURACY(cargoArgs.pedDropoff[idx], 0)
DEBUG_PRINT("bPlayerAggroing = TRUE")
bSwitchedTasks[idx] = TRUE
ENDIF
ENDIF
ENDIF
// TODO: switch to "Come Here" anims once available... use same as intro in towing.
IF NOT bSwitchedTasks[idx]
IF NOT IS_ENTITY_DEAD(cargoArgs.pedDropoff[idx]) AND NOT IS_PED_INJURED(cargoArgs.pedDropoff[idx])
IF (GET_SCRIPT_TASK_STATUS(cargoArgs.pedDropoff[idx], SCRIPT_TASK_PLAY_ANIM) <> PERFORMING_TASK)
AND NOT IS_ENTITY_PLAYING_ANIM(cargoArgs.pedDropoff[idx], "oddjobs@towingcome_here", "come_here_idle_a")
TASK_PLAY_ANIM(cargoArgs.pedDropoff[idx], "oddjobs@towingcome_here", "come_here_idle_a")
DEBUG_PRINT("TASKING AGAIN TO PLAY ANIMATION")
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
// Since the guy at the drop location is dead, make the drop a fail and remove blips.
cargoArgs.bDrugPurchaserDead[idx] = TRUE
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(cargoArgs.pedDropoff[idx], PLAYER_PED_ID())
bKilledBuyer = TRUE
PRINTLN("bKilledBuyer = TRUE")
ENDIF
// Zeroing out vector, so it does not get re-added when getting back in the plane.
vCurDestObjective[idx] = <<0,0,0>>
IF NOT cargoArgs.bCargoDropComplete[idx]
PRINT_HELP("DTRFAIR_HELPD")
PRINTLN("ATTEMPTING TO PRINT HELP - DTRFAIR_HELPD")
cargoArgs.bCargoDropComplete[idx] = TRUE
ENDIF
IF DOES_BLIP_EXIST(myLocationBlip[idx])
SCRIPT_REMOVE_BLIP_SAFE(myLocationBlip[idx])
ENDIF
// IF DOES_BLIP_EXIST(blipRadiusPerfect[idx])
// SCRIPT_REMOVE_BLIP_SAFE(blipRadiusPerfect[idx])
// ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDPROC
//Cleanup function to delete our bombs / packages
PROC DELETE_PROPS(PLANE_CARGO_ARGS &cargoArgs, ARGS& myArgs)
INT idx, idx2
REPEAT cargoArgs.iNumPackagesTotal idx
IF DOES_ENTITY_EXIST(cargoArgs.oCargoDrop[idx])
DELETE_OBJECT(cargoArgs.oCargoDrop[idx])
IF myArgs.bDoUberBombs
REPEAT MAX_NUMBER_CLUSTER idx2
IF DOES_ENTITY_EXIST(cargoArgs.oClusterDrop[idx][idx2])
DELETE_OBJECT(cargoArgs.oClusterDrop[idx][idx2])
ENDIF
ENDREPEAT
ENDIF
ENDIF
ENDREPEAT
ENDPROC
PROC CREATE_UBER_BOMB(PLANE_CARGO_ARGS &cargoArgs, INT iBomb, VEHICLE_INDEX & myVehicle)
INT idx2
REPEAT MAX_NUMBER_CLUSTER idx2
IF NOT IS_ENTITY_DEAD(myVehicle)
cargoArgs.oClusterDrop[iBomb][idx2] = CREATE_OBJECT(mnBombProp01, GET_ENTITY_COORDS(myVehicle))
SET_ENTITY_RECORDS_COLLISIONS(cargoArgs.oClusterDrop[iBomb][idx2], TRUE)
SET_ENTITY_LOD_DIST(cargoArgs.oClusterDrop[iBomb][idx2], 1000)
PRINTLN("CREATING CLUSTER BOMB: ", idx2, " FOR BOMB: ", iBomb)
IF idx2%2 = 0
vCargoOffset2.z -= 0.001
vCargoOffset2.y -= 0.001
ATTACH_ENTITY_TO_ENTITY(cargoArgs.oClusterDrop[iBomb][idx2], myVehicle, 0, vCargoOffset2, <<0,0,180>>)
ELSE
vCargoOffset.z -= 0.001
vCargoOffset.y -= 0.001
ATTACH_ENTITY_TO_ENTITY(cargoArgs.oClusterDrop[iBomb][idx2], myVehicle, 0, vCargoOffset, <<0,0,180>>)
ENDIF
ENDIF
ENDREPEAT
ENDPROC
PROC CREATE_UBER_BOMBS_IN_PLANE_AND_ATTACH(PLANE_CARGO_ARGS &cargoArgs, INT iBomb, VEHICLE_INDEX & myVehicle, ARGS& myArgs)
IF myArgs.bDoUberBombs
IF iBomb = 0
IF NOT bCreateUberBomb[0]
CREATE_UBER_BOMB(cargoArgs, iBomb, myVehicle)
PRINTLN("iBomb = ", iBomb)
bCreateUberBomb[0] = TRUE
ENDIF
ELIF iBomb = 1
IF NOT bCreateUberBomb[1]
CREATE_UBER_BOMB(cargoArgs, iBomb, myVehicle)
PRINTLN("iBomb = ", iBomb)
bCreateUberBomb[1] = TRUE
ENDIF
ELIF iBomb = 2
IF NOT bCreateUberBomb[2]
CREATE_UBER_BOMB(cargoArgs, iBomb, myVehicle)
PRINTLN("iBomb = ", iBomb)
bCreateUberBomb[2] = TRUE
ENDIF
ELIF iBomb = 3
IF NOT bCreateUberBomb[3]
CREATE_UBER_BOMB(cargoArgs, iBomb, myVehicle)
PRINTLN("iBomb = ", iBomb)
bCreateUberBomb[3] = TRUE
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL START_PLANE(VEHICLE_INDEX& myEntities[], VEHICLE_INDEX & myVehicle, PLANE_DATA& myData, PLANE_CARGO_ARGS &cargoArgs, BOOL& bInTransition, ARGS& myArgs, BOOL bTakeControl = TRUE, AIR_VARIATION myVariation = AIR_VARIATION_SIMPLE)
DEBUG_MESSAGE("START_PLANE")
INT idx
bInTransition = TRUE
// VECTOR vClosestNode[MAX_NUMBER_DROPS]
IF bTakeControl
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ENDIF
// Possible that the plane was passed in to us, if not, then create it. If so, then copy that.
IF IS_ENTITY_DEAD(myVehicle)
myData.myPlane = CREATE_VEHICLE(myData.sPlaneName, vSpawnPosition, fSpawnHeading)
myVehicle = myData.myPlane
SET_VEHICLE_COLOUR_COMBINATION(myVehicle, 2)
SET_VEHICLE_ENGINE_CAN_DEGRADE(myVehicle, FALSE)
SET_HELI_BLADES_SPEED(myVehicle, 1.0)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), myVehicle)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
PRINTLN("CREATING NEW PLANE ON RETRY")
ELSE
myData.myPlane = myVehicle
ENDIF
// Wipe the area we need collision for. We'll set this later.
cargoArgs.bTraf4_FreezeBoats = FALSE
SWITCH myVariation
CASE AIR_VARIATION_SIMPLE
BREAK
CASE AIR_VARIATION_LOW_ALT
CASE AIR_VARIATION_BOMB
CASE AIR_VARIATION_DROP
IF myArgs.bDoTrain
CREATE_DROPOFF_STAGING_TRAIN(myArgs, cargoArgs, myData, myVariation)
ELIF myArgs.bDoUberBombs
IF g_savedGlobals.sTraffickingData.iAirRank >= 5
CREATE_FINAL_STAGING_REPEATABLE(myArgs, cargoArgs, myData)
PRINTLN("CREATE FINAL STAGING - REPEATABLE MODE")
ELSE
CREATE_FINAL_STAGING(myArgs, cargoArgs, myData)
PRINTLN("CREATE FINAL STAGING - REGULAR MODE")
ENDIF
ELIF NOT myArgs.bDoMobile AND NOT(myVariation = AIR_VARIATION_BOMB AND NOT myArgs.bDoStationary)
// Create dropoff staging.. unless we're the mobile version
ADD_RELATIONSHIP_GROUP("relRivalRunners", cargoArgs.relRivalRunners)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, cargoArgs.relRivalRunners, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, cargoArgs.relRivalRunners)
CREATE_DROPOFF_STAGING(myArgs, cargoArgs, myData, myVariation)
ENDIF
REPEAT myData.iNumTotalCargo idx
IF DOES_ENTITY_EXIST(myVehicle) AND IS_VEHICLE_DRIVEABLE(myVehicle)
cargoArgs.oCargoDrop[idx] = CREATE_OBJECT(mnBombProp01, myData.vPlanePos)
SET_ENTITY_VISIBLE(cargoArgs.oCargoDrop[idx], TRUE)
SET_ENTITY_RECORDS_COLLISIONS(cargoArgs.oCargoDrop[idx], TRUE)
vCargoOffset.x += 0.01
//vCargoOffset2.x += 0.01
ATTACH_ENTITY_TO_ENTITY(cargoArgs.oCargoDrop[idx], myVehicle, 0, vCargoOffset, <<0,0,180>>)
RESET_BOOLS(cargoArgs.bCargoHitGround)
ENDIF
ENDREPEAT
BREAK
ENDSWITCH
IF myVariation = AIR_VARIATION_BOMB OR myArgs.bDoMobile
//Hack? //TODO why was this needed!?
//myData.endData.vCenterPos = myData.vBomReturnPos
REPEAT myData.iNumDrops idx
//If we're doing the stationary variation we use the drug locaiton data instead of vectors
IF NOT myArgs.bDoStationary
cargoArgs.vehDropoff[idx] = CREATE_VEHICLE(myData.targetCarNames[idx], myData.dropData[idx].vDrugPickup) //myData.vCarSpawnPos[idx])
PRINTLN("CREATING DROPOFF VEHICLE AT DROP: ", idx, " AT LOCATION: ", myData.dropData[idx].vDrugPickup)
SET_VEHICLE_EXTRA(cargoArgs.vehDropoff[idx], 1, TRUE)
cargoArgs.carDrivers[idx] = CREATE_PED_INSIDE_VEHICLE(cargoArgs.vehDropoff[idx], PEDTYPE_CRIMINAL, myData.targetCarDriverNames[idx])
SET_PED_RELATIONSHIP_GROUP_HASH(cargoArgs.carDrivers[idx], cargoArgs.relRivalRunners)
SET_VEHICLE_ON_GROUND_PROPERLY(cargoArgs.vehDropoff[idx])
IF NOT ARE_VECTORS_EQUAL(myArgs.genVectors[idx], <<0,0,0>>)
OPEN_SEQUENCE_TASK(taskSequence)
TASK_VEHICLE_DRIVE_TO_COORD(NULL, cargoArgs.vehDropoff[idx], myArgs.genVectors[idx], 10.0, DRIVINGSTYLE_NORMAL, PHANTOM, DRIVINGMODE_AVOIDCARS, 10, 10)
TASK_VEHICLE_DRIVE_WANDER(NULL, cargoArgs.vehDropoff[idx], 1.0, DRIVINGMODE_AVOIDCARS)
CLOSE_SEQUENCE_TASK(taskSequence)
TASK_PERFORM_SEQUENCE(cargoArgs.carDrivers[idx], taskSequence)
CLEAR_SEQUENCE_TASK(taskSequence)
SET_ENTITY_LOAD_COLLISION_FLAG(cargoArgs.vehDropoff[idx], TRUE)
ELSE
TASK_VEHICLE_DRIVE_WANDER(cargoArgs.carDrivers[idx], cargoArgs.vehDropoff[idx], 10.0, DRIVINGMODE_AVOIDCARS) //DRIVINGMODE_AVOIDCARS_STOPFORPEDS_OBEYLIGHTS)
SET_ENTITY_LOAD_COLLISION_FLAG(cargoArgs.vehDropoff[idx], TRUE)
ENDIF
ENDIF
// Storing off entities for blip tracking
myEntities[idx] = cargoArgs.vehDropoff[idx]
ENDREPEAT
ENDIF
IF NOT IS_ENTITY_DEAD(myData.myPlane)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_PLAYER_IN_PLANE(PLANE_DATA& myData)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) = myData.myPlane
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL PLAYER_HAS_ABANDONED_JOB_PLANE(PLANE_DATA& myData, VECTOR& vCurDestObjective[])
INT iDrop
FLOAT fCurrDistObj[MAX_NUMBER_DROPS]
// If we have set an abandon distance, get player's distance from start position.
IF bSetDistance
fDistanceFromStart = VDIST(vPlayerPos, myData.vPlanePos)
ENDIF
// Loop through all drops
REPEAT myData.iNumDrops iDrop
IF NOT ARE_VECTORS_EQUAL(vCurDestObjective[iDrop], <<0,0,0>>)
// Grab the distance between the player and drops
fCurrDistObj[iDrop] = VDIST(vPlayerPos, vCurDestObjective[iDrop])
IF fCurrDistObj[iDrop] > fGreatestDistanceToObjective
fGreatestDistanceToObjective = fCurrDistObj[iDrop]
ENDIF
ENDIF
ENDREPEAT
// Once the greatest distance has been found, add on the fAbandonAddOn and set as the fAbandonDistance.
IF NOT bSetDistance
IF fGreatestDistanceToObjective > 0
fAbandonDistance = fGreatestDistanceToObjective + fAbandonAddOn
fWarnDistance = fGreatestDistanceToObjective + fWarnAddOn
bSetDistance = TRUE
ENDIF
ENDIF
IF fDistanceFromStart > fWarnDistance AND NOT bDistWarned
bDistWarned = TRUE
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIR_D", CONV_PRIORITY_VERY_HIGH)
ELIF fDistanceFromStart > fAbandonDistance
DEBUG_PRINT("RETURNING TRUE ON PLAYER_HAS_ABANDONED_JOB_PLANE")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC HOLDING_PATTERN(VEHICLE_INDEX myVehicle, VECTOR& myPos, FLOAT& myHeading, INT timer)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
//DEBUG_MESSAGE("HOLDING_PATTERN")
timer = timer
SET_VEHICLE_ENGINE_ON(myVehicle, TRUE, TRUE)
SET_ENTITY_COORDS(myVehicle, myPos)
SET_ENTITY_HEADING(myVehicle, myHeading)
//60 top speed
//HACK FOR NOW override top speed
//SET_ENTITY_MAX_SPEED(myVehicle, 50)
SET_VEHICLE_FORWARD_SPEED(myVehicle, 40.0)
ENDPROC
FUNC BOOL HAS_PLANE_LANDED(VECTOR myLoc, VEHICLE_INDEX myPlane, VECTOR vLandPos)
myLoc = myLoc
IF NOT IS_ENTITY_DEAD(myPlane) AND IS_VEHICLE_DRIVEABLE(myPlane)
//IF fSpeed < 5.0 //AND IS_ENTITY_IN_ANGLED_AREA(myPlane, <<2153.2, 4817.9, 31.06>>, <<1958.6, 4726.4, 51.06>>, 25.0)
IF GET_ENTITY_DISTANCE_FROM_LOCATION(myPlane, <<2135.9922, 4776.9351, 39.9702>>) < LAND_RADIUS
IF GET_ENTITY_HEIGHT_ABOVE_GROUND(myPlane) < 2.0 AND vPlayerPos.z - vLandPos.z < 5.0
BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(myPlane, 6.0, 15)
PRINTLN("BRINGING PLANE TO A HALT")
TRIGGER_MUSIC_EVENT("OJDA_COMPLETE")
PRINTLN("STARTING MUSIC - OJDA_COMPLETE")
CLEAR_PRINTS()
CLEAR_HELP()
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
//FUNC BOOL IS_CROSSHAIR_OVER_TARGET(PLANE_CARGO_ARGS &cargoArgs, VECTOR vCrossHair, FLOAT fRadius, BOOL& bIsHighAlt, VECTOR vTarget, INT closestIndex)
// //INT idx
//
// IF bIsHighAlt
// IF bLocked
// bLocked = FALSE
// ODDJOB_STOP_SOUND(cargoArgs.soundID)
// ENDIF
//// DEBUG_PRINT("PLAYER IS TOO HIGH, RETURNING FALSE ON LOCK ON MODE")
// RETURN FALSE
// ENDIF
//
// FLOAT fDist = VDIST(vTarget, vCrossHair)
//
// IF fDist < fRadius
// IF NOT bLocked
// ODDJOB_PLAY_SOUND("DRUG_TRAFFIC_AIR_LOCK_ON_MASTER", cargoArgs.soundID, TRUE)
//
// ENDIF
// bLocked = TRUE
// iLockedIdx = closestIndex
// DEBUG_PRINT("bLocked = TRUE")
// RETURN TRUE
// ELSE
// IF (iLockedIdx = closestIndex) AND (iLockOnTimeBufferStart = 0)
// iLockOnTimeBufferStart = GET_GAME_TIMER()
// ENDIF
// ENDIF
//
// IF NOT bLocked and NOT bPlayingLockDist
// IF fDist < CONST_LOCK_SOUND_MAX
// //We want lock on master to play
// IF NOT bPlayingLockDist
// bPlayingLockDist = TRUE
// ODDJOB_PLAY_SOUND("DRUG_TRAFFIC_AIR_PRE_LOCK_ON_MASTER", cargoArgs.soundID, TRUE)
// ENDIF
// ENDIF
// ELIF bPlayingLockDist AND NOT bLocked
// fDist = fDist / CONST_LOCK_SOUND_MAX
// DEBUG_MESSAGE("Passing in normalized distance:")
// PRINTFLOAT(fDist)
// PRINTNL()
//// AUDIO_MG_SET_DRUG_TRAFFIC_TARGET_DIST(fDist)
// ENDIF
//
// IF iLockOnTimeBufferStart <> 0
// IF GET_GAME_TIMER() - iLockOnTimeBufferStart > LOCK_ON_BUFFER
// iLockedIdx = -1
// bLocked = FALSE
// ODDJOB_STOP_SOUND(cargoArgs.soundID)
// iLockOnTimeBufferStart = 0
// DEBUG_PRINT("bLocked = FALSE DUE TO BUFFER RUNNING OUT")
// ENDIF
// ENDIF
//
// RETURN FALSE
//ENDFUNC
////TODO optimize this function!!
////Special flying mode where the player can only turn the plane left and right
//PROC PLANE_BOMB_MODE(PLANE_CARGO_ARGS &cargoArgs, ARGS& myArgs, BOOL& bIsHighAlt, VECTOR& vCurDestObjective[])
// VECTOR tempRot, vTarget
// FLOAT xRot, zGround, zWater, fHeight, fRadius, forwardOffset, fPercentage, camRot, xpos, ypos
// FLOAt fSpeed = 45
// FLOAT fMaxRadius = 22
// FLOAT fMinRadius = 3.0
// INT LeftX, LeftY, RightX, RightY, delta, closestIndex
// INT idx
// //BOOL bVisible = FALSE
//
// //TODO use this to simulate LB and RB stearing
// //SET_VEHICLE_STEER_BIAS in the next build to adjust yaw, with values from -1 -> 1
//
// //for bomb mode we have to do this differently
// IF myArgs.bDoBomb OR myArgs.bDoLockOn
// //We are in bomb mode...
// closestIndex = FIND_CLOSEST_ENTITY_INDEX(cargoArgs.vehDropoff, vPlayerPos)
// IF closestIndex <> -1
// IF DOES_ENTITY_EXIST(vehStationaryCars[closestIndex])
// GET_SCREEN_COORD_FROM_WORLD_COORD(GET_ENTITY_COORDS(vehStationaryCars[closestIndex]),xpos,ypos)
// DRAW_SPRITE("helicopterhud", "hud_outline",xpos,ypos,0.1,0.1,0.1,255,0,0, 200)
// ENDIF
// vTarget = GET_ENTITY_COORDS(cargoArgs.vehDropoff[closestIndex])
// ENDIF
// ELSE
// closestIndex = FIND_CLOSEST_LOCATION_INDEX(vCurDestObjective, vPlayerPos)
// IF closestIndex <> -1
// vTarget = vCurDestObjective[closestIndex]
// ENDIF
// ENDIF
//
// DRAW_OFFSCREEN_ARROW_FOR_COORD(vTarget)
//
// GET_SCREEN_COORD_FROM_WORLD_COORD(vTarget,xpos,ypos)
//
// //support lock on
// IF myArgs.bDoLockOn AND bLocked
// DRAW_SPRITE("helicopterhud", "hud_outline",xpos,ypos,0.07,0.07,0.07,0,255,0, 200)
// ELSE
// IF NOT ARE_VECTORS_EQUAL(vTarget, <<0,0,0>>)
// DRAW_SPRITE("helicopterhud", "hud_outline",xpos,ypos,0.08,0.08,0.08,255,0,0, 200)
// ENDIF
// ENDIF
//
// IF myArgs.bDoUberBombs
// //TODO.. only draw the closest group of sprites
//
// //TODO clean this up.. this was done ultra quick to demo needs to be better engineered
// INT startIdx
// IF closestIndex <> -1
//
// startIdx = 1+closestIndex*4
// //0 means draw 1,2,3
// //1 means draw 5,6,7
// //2 means draw 9,10,11
// ENDIF
// REPEAT 3 idx
// IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[startIdx+idx])
// vTarget = GET_ENTITY_COORDS(cargoArgs.vehFinal[startIdx+idx])
// GET_SCREEN_COORD_FROM_WORLD_COORD(vTarget,xpos,ypos)
// DRAW_SPRITE("helicopterhud", "hud_outline",xpos,ypos,0.08,0.08,0.08,255,0,0, 200)
// ENDIF
// ENDREPEAT
// ENDIF
//
// GET_POSITION_OF_ANALOGUE_STICKS(PAD1, LeftX, LeftY, RightX, RightY)
// //tilt the camera from 65 to 35
// IF NOT IS_LOOK_INVERTED()
// RightY = -RightY
// ENDIF
// camRot = 65
// //180 to -180
// IF RightY > 0
// delta = RightY / 6
// camRot -= delta
// ELIF RightY < 0
// camRot = 65 //25 degrees rotated up from looking stright down
// ENDIF
//
// tempRot = GET_ENTITY_ROTATION(cargoArgs.myPlane)
// xRot = tempRot.x - camRot
// SET_CAM_ROT(cargoArgs.CamExplosion, <<xRot, tempRot.y, tempRot.z>>)
//
// IF myArgs.bDoLockOn
// fSpeed = 35
// fMaxRadius = fMinRadius
// ENDIF
//
// SET_TIMECYCLE_MODIFIER("blackNwhite")
// OVERLAY_SET_SECURITY_CAM(TRUE,FALSE)
//
// DISABLE_CONTROL_BUTTON(PLAYER_CONTROL, RIGHTSHOULDER2)
// DISABLE_CONTROL_BUTTON(PLAYER_CONTROL, LEFTSHOULDER2)
// DISABLE_CONTROL_BUTTON(PLAYER_CONTROL, LEFTSTICKX)
// DISABLE_CONTROL_BUTTON(PLAYER_CONTROL, LEFTSTICKY)
//
// SET_ENTITY_MAX_SPEED(cargoArgs.myPlane, fSpeed)
// SET_VEHICLE_FORWARD_SPEED(cargoArgs.myPlane, fSpeed)
// PLANE_AUTOPILOT(cargoArgs.myPlane, fSpeed, FALSE, 0.5)
//
// VECTOR planeCoord = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(cargoArgs.myPlane, <<0,15.0,0>>)
//
// BOOL bHasBounds = FALSE
// IF GET_GROUND_Z_FOR_3D_COORD(planeCoord, zGround)
// bHasBounds = TRUE
// ELIF GET_WATER_HEIGHT_NO_WAVES(planeCoord, zGround)
// bHasBounds = TRUE
// ENDIF
//
// IF bHasBounds
// //If the water is closer use that
// IF GET_WATER_HEIGHT_NO_WAVES(planeCoord, zWater)
// IF zWater > zGround
// zGround = zWater
// ENDIF
// ENDIF
//
// fHeight = planeCoord.z - zGround
//
// //90m is the max forward offset
// //15m is the min forward offset
// fPercentage = fHeight / 100
// forwardOffset = fPercentage * 25
// IF forwardOffset > 25
// forwardOffset = 25.0
// ELIF forwardOffset < 6.0
// forwardOffset = 6.0
// ENDIF
//
// //grab height again but off a point further in front of the player
// planeCoord = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(cargoArgs.myPlane, <<0,forwardOffset,0>>)
//
// //Use height to set the radius
// planeCoord.z = zGround
// fPercentage = fHeight / 100
// fRadius = fPercentage * fMaxRadius
//
// IF fRadius > fMaxRadius
// fRadius = fMaxRadius
// ELIF fRadius < fMinRadius
// fRadius = fMinRadius
// ENDIF
//
// IF myArgs.bDoLockOn
// IF IS_CROSSHAIR_OVER_TARGET(cargoArgs, planeCoord, 6.0, bIsHighAlt, vTarget, closestIndex)
// IF bLocked
//
// GET_SCREEN_COORD_FROM_WORLD_COORD(planeCoord, xpos, ypos)
// //DRAW_SCALEFORM_MOVIE(cargoArgs.sf_hud, 0.5, 0.5, 1.0, 1.0, 255, 0, 0, 255) //(cargoArgs.sf_hud, xpos, ypos, 0.218, 0.515, 255, 0, 0, 255)
// DRAW_SCALEFORM_MOVIE(cargoArgs.sf_hud, 0.5, 0.5, 1.0, 1.0, 255, 0, 0, 255)//(cargoArgs.sf_hud, xpos, ypos, 1.0, 1.0, 255, 0, 0, 255)
// //DRAW_CHECKPOINT(planeCoord, fRadius, 0, 255, 0)
// DEBUG_PRINT("DRAWING GREEN")
// ENDIF
// ELSE
// IF NOT bLocked
// GET_SCREEN_COORD_FROM_WORLD_COORD(planeCoord, xpos, ypos)
// DRAW_SCALEFORM_MOVIE(cargoArgs.sf_hud, 0.5, 0.5, 1.0, 1.0, 255, 0, 0, 255)//(cargoArgs.sf_hud, xpos, ypos, 1.0, 1.0, 255, 0, 0, 255)
// //DRAW_CHECKPOINT(planeCoord, fRadius, 255, 0, 0)
// ENDIF
// ENDIF
// ELSE
// GET_SCREEN_COORD_FROM_WORLD_COORD(planeCoord, xpos, ypos)
// DRAW_SCALEFORM_MOVIE(cargoArgs.sf_hud, 0.5, 0.5, 1.0, 1.0, 255, 0, 0, 255) //(cargoArgs.sf_hud, xpos, ypos, 0.218, 0.515, 255, 0, 0, 255)
// //DRAW_CHECKPOINT(planeCoord, fRadius, 255, 0, 0)
// ENDIF
// ELSE
// DRAW_SCALEFORM_MOVIE(cargoArgs.sf_hud, 0.5, 0.5, 1.0, 1.0, 255, 0, 0, 255) //(cargoArgs.sf_hud, 0.5, 0.5, 0.218, 0.515, 255, 0, 0, 255)
// ENDIF
//ENDPROC
FUNC BOOL IS_PLANE_RIGHTSIDEUP(PLANE_CARGO_ARGS& cargoArgs)
// FLOAT fRoll, fPitch
IF NOT IS_ENTITY_DEAD(cargoArgs.myPlane)
// fRoll = GET_ENTITY_ROLL(cargoArgs.myPlane)
// PRINTLN("PLANE'S ROLL = ", fRoll)
// fPitch = GET_ENTITY_PITCH(cargoArgs.myPlane)
// PRINTLN("PLANE'S PITCH = ", fPitch)
IF GET_ENTITY_ROLL(cargoArgs.myPlane) < -150 OR GET_ENTITY_ROLL(cargoArgs.myPlane) > 150
OR (GET_ENTITY_PITCH(cargoArgs.myPlane) < -150 OR GET_ENTITY_PITCH(cargoArgs.myPlane) > 150)
PRINTLN("PLANE IS UPDSIDEDOWN")
RETURN FALSE
ENDIF
ENDIF
RETURN TRUE
ENDFUNC
FUNC BOOL IS_PLANE_TOO_CLOSE_TO_GROUND(PLANE_CARGO_ARGS& cargoArgs)
VECTOR vPlanePosition
FLOAT fGroundZ
IF NOT IS_ENTITY_DEAD(cargoArgs.myPlane)
vPlanePosition = GET_ENTITY_COORDS(cargoArgs.myPlane)
// PRINTLN("PLANE POSITION = ", vPlanePosition)
ENDIF
GET_GROUND_Z_FOR_3D_COORD(vPlanePosition, fGroundZ)
// PRINTLN("GROUND Z FOR PLANE POSITION = ", fGroundZ)
IF ABSF(vPlanePosition.z - fGroundZ) < CONST_TOO_CLOSE_GROUND
bPlaneTooLow = TRUE
PRINTLN("WE'RE TOO CLOSE TO THE GROUND")
RETURN TRUE
ENDIF
bPlaneTooLow = FALSE
RETURN FALSE
ENDFUNC
PROC GET_OBJ_POSITION_AND_DIRECTION(OBJECT_INDEX objIndex, VECTOR& vMyPos, VECTOR& vDir)
IF NOT DOES_ENTITY_EXIST(objIndex)
EXIT
ENDIF
vMyPos = GET_ENTITY_COORDS(objIndex) + 0.5*vBombVelocity
SET_FOCUS_POS_AND_VEL(vMyPos, vBombVelocity)
vDir = <<-80, 0, GET_ENTITY_HEADING(objIndex)+180>>
// // Get the rotation of the object in world space
// vDir = GET_ENTITY_ROTATION(objIndex)
// vDir.x += 180 // Flip it around town
// vDir.x += 60 // Flip that thang down
// IF it is single bomb (probably will have to differentiate this on cargo type) then we want to flip
// Generate the direction from the entity's orientation
vDir = <<-SIN(vDir.z) * COS(vDir.x), COS(vDir.z) * COS(vDir.x), SIN(vDir.x)>>
ENDPROC
PROC HANDLE_BUTTON_PRESS_SUPPORT(ARGS& myArgs, PLANE_CARGO_ARGS& cargoArgs, AIR_VARIATION myVariation, FLOAT& fScale, INT idx)
cargoArgs.bButtonPressed = TRUE
IF NOT myArgs.bDoUberBombs
IF myVariation = AIR_VARIATION_BOMB
fScale = -16.0
IF NOT UPDATE_COLLISION_TESTS_NOW(collisionArgs, cargoArgs.myPlane)
AND NOT IS_PLANE_TOO_CLOSE_TO_GROUND(cargoArgs)
bCollisionDetected = FALSE
START_TIMER_NOW(tBombTimer)
ELSE
bCollisionDetected = TRUE
PRINTLN("Collision detected")
ENDIF
ELIF cargoArgs.bBombCam //once we've dropped a package exit the targeting cam
cargoArgs.bBombCam = FALSE
CLEANUP_CAM(cargoArgs, bClearPrints)
ENDIF
ELSE
IF bUberActive
EXIT
ENDIF
bDoUberCam = FALSE
IF NOT UPDATE_COLLISION_TESTS_NOW(collisionArgs, cargoArgs.myPlane)
AND NOT IS_PLANE_TOO_CLOSE_TO_GROUND(cargoArgs)
bDoUberCam = TRUE
ENDIF
bUberActive = TRUE
clusterState = CLUSTER_STATE_INIT
ENDIF
IF myArgs.bDoUberBombs
//RELEASE_CARGO(myArgs, cargoArgs.oCargoDrop[cargoArgs.iNumPackageDropped], cargoArgs.myPlane, cargoArgs.soundID, FALSE, -7.0)
//SET_ENTITY_VISIBLE(cargoArgs.oCargoDrop[cargoArgs.iNumPackageDropped], FALSE)
ELSE
idx = cargoArgs.iNumPackageDropped
//bCut = TRUE
IF DOES_ENTITY_EXIST(cargoArgs.oCargoDrop[idx])
SET_ENTITY_VISIBLE(cargoArgs.oCargoDrop[idx], TRUE) //todo.. why the hell do we have to call this
SET_ENTITY_COLLISION(cargoArgs.oCargoDrop[idx], TRUE)
ENDIF
IF DOES_ENTITY_EXIST(cargoArgs.oBombDummy)
SET_ENTITY_VISIBLE(cargoArgs.oBombDummy, FALSE)
SET_ENTITY_COLLISION(cargoArgs.oBombDummy,FALSE)
ENDIF
RELEASE_CARGO(cargoArgs.oCargoDrop[idx], cargoArgs.myPlane, cargoArgs.soundID, TRUE, fScale)
IF NOT myArgs.bDoBomb
PRINTLN("Applying chute")
APPLY_CHUTE(cargoArgs.oCargoChute[idx], cargoArgs.oCargoDrop[idx], cargoArgs.iCargoChuteTime[idx], cargoArgs.bCargoChuteVisible[idx])
ENDIF
IF myArgs.bDoBomb AND NOT myArgs.bDoUberBombs
IF NOT STREAMVOL_IS_VALID(cargoArgs.streamVolID)
VECTOR vStreamPos, vStreamDir
FLOAT fAngleHeight
fAngleHeight = 200 //Find suitable far clip based on height and direction of drop
GET_OBJ_POSITION_AND_DIRECTION(cargoArgs.oCargoDrop[idx], vStreamPos, vStreamDir)
PRINTLN("HANDLE_BUTTON_PRESS_SUPPORT: Created stream vol at: ", GET_STRING_FROM_VECTOR(vStreamPos))
cargoArgs.streamVolID = STREAMVOL_CREATE_FRUSTUM(vStreamPos, vStreamDir, fAngleHeight, FLAG_MAPDATA, STREAMVOL_LOD_FLAG_ALL)
ENDIF
ENDIF
IF NOT DOES_BLIP_EXIST(cargoArgs.blipCrateDrop[idx]) AND NOT myArgs.bDoUberBombs
cargoArgs.blipCrateDrop[idx] = ADD_BLIP_FOR_ENTITY(cargoArgs.oCargoDrop[idx])
SET_BLIP_COLOUR(cargoArgs.blipCrateDrop[idx], BLIP_COLOUR_GREEN)
SET_BLIP_SCALE(cargoArgs.blipCrateDrop[idx], 0.75)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(cargoArgs.oBombDummy)
PRINTLN("OUTSIDE Entity2 exists. Rotation: ", GET_STRING_FROM_VECTOR(GET_ENTITY_ROTATION(cargoArgs.oBombDummy)))
IF DOES_ENTITY_EXIST(cargoArgs.oCargoDrop[0])
PRINTLN("OUTSIDE Entity exists. Rotation: ", GET_STRING_FROM_VECTOR(GET_ENTITY_ROTATION(cargoArgs.oCargoDrop[0])))
ENDIF
ENDIF
cargoArgs.iNumReleased++
cargoArgs.bDetached[cargoArgs.iNumPackageDropped] = TRUE
cargoArgs.cargoTimes[cargoArgs.iNumPackageDropped] = GET_GAME_TIMER()
IF NOT IS_TIMER_STARTED(cargoArgs.tCargoDropTimer)
START_TIMER_NOW(cargoArgs.tCargoDropTimer)
ELSE
RESTART_TIMER_NOW(cargoArgs.tCargoDropTimer)
ENDIF
IF IS_TIMER_STARTED(cargoArgs.tBombBayTimer)
RESTART_TIMER_NOW(cargoArgs.tBombBayTimer)
PRINTLN("RESTARTING TIMER - cargoArgs.tBombBayTimer")
ENDIF
DEBUG_PRINT("DROPPED PACKAGE")
cargoArgs.iNumPackageDropped++
ENDPROC
PROC CHECK_FOR_BUTTON_PRESS(ARGS& myArgs, PLANE_CARGO_ARGS& cargoArgs, AIR_VARIATION myVariation)
INT idx
// If the player has completed the drop phase, do not allow them to drop anymore cargo/bombs.
IF bDropPhaseComplete
EXIT
ENDIF
IF NOT IS_PLANE_RIGHTSIDEUP(cargoArgs)
EXIT
ENDIF
//If we're not currently in a cam lets ensure we don't drop more bombs than we have
IF NOT bInCam AND NOT bDoUberCam
IF cargoArgs.iNumReleased = cargoArgs.iNumPackagesTotal
EXIT
ENDIF
ENDIF
FLOAT fScale = -4.0
BOOL bProcede = FALSE
IF NOT IS_TIMER_STARTED(cargoArgs.tCargoDropTimer)
bProcede = TRUE
ELSE
IF GET_TIMER_IN_SECONDS(cargoArgs.tCargoDropTimer) > CARGO_DROP_TIME_RESET
bProcede = TRUE
ENDIF
IF GET_TIMER_IN_SECONDS(cargoArgs.tCargoDropTimer) > CARGO_DROP_SKIP_DELAY AND (bInCam OR bDoUberCam)
bProcede = TRUE
ENDIF
ENDIF
IF cargoArgs.iCutGameTime <> 0
bProcede = FALSE
ENDIF
// If we're in either the uber or bomb cam and detect a collision, go ahead and cleanup cam sequence
IF iFrameCounter01 = 0
IF bInCam OR bDoUberCam
IF UPDATE_COLLISION_TESTS_NOW(collisionArgs, cargoArgs.myPlane)
OR IS_PLANE_TOO_CLOSE_TO_GROUND(cargoArgs)
PLAY_SOUND_FRONTEND(-1, "DRUG_TRAFFIC_AIR_BOMB_DROP_ERROR_MASTER")
CLEAR_HELP()
// IF myArgs.bDoUberBombs
// PRINT_HELP_WITH_NUMBER("DTRFAIR_BLFT1", cargoArgs.iNumPackagesTotal - cargoArgs.iNumReleased)
// ELSE
// PRINT_HELP_WITH_NUMBER("DTRFAIR_BLFT", cargoArgs.iNumPackagesTotal - cargoArgs.iNumReleased)
// ENDIF
VECTOR vPlaneRotation
IF NOT IS_ENTITY_DEAD(cargoArgs.myPlane)
vPlaneRotation = GET_ENTITY_ROTATION(cargoArgs.myPlane)
PRINTLN("BEFORE: PLANE'S ROTATION = ", vPlaneRotation)
SET_ENTITY_ROTATION(cargoArgs.myPlane, <<0, 0, vPlaneRotation.z>>)
PRINTLN("AFTER: PLANE'S ROTATION = ", vPlaneRotation)
ENDIF
IF STREAMVOL_IS_VALID(cargoArgs.streamVolID)
STREAMVOL_DELETE(cargoArgs.streamVolID)
CLEAR_FOCUS()
ENDIF
IF bDoUberCam
PRINTLN("CHECK_FOR_BUTTON_PRESS: Cleanup cluster cam")
CLEANUP_CLUSTER_CAM(cargoArgs, cargoArgs.oCargoDrop[cargoArgs.iNumPackageDropped-1])
ENDIF
bSkipped = TRUE
bDoUberCam = FALSE
CLEAR_FOCUS()
IF bInCam
PRINTLN("CHECK_FOR_BUTTON_PRESS: Cleanup explosion cam")
CLEANUP_EXPLOSION_CAM(cargoArgs, cargoARgs.oCargoDrop[cargoArgs.iNumReleased-1], cargoArgs.iNumReleased-1, 0, FALSE)
ENDIF
EXIT
ENDIF
ENDIF
ENDIF
IF bProcede
IF IS_VEHICLE_DRIVEABLE(cargoArgs.myPlane) AND NOT IS_ENTITY_DEAD(cargoArgs.myPlane)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), cargoArgs.myPlane)
//don't let the player press the button if he's on the ground.
IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_VEH_FLY_ATTACK) OR bCheckTime
CREATE_UBER_BOMBS_IN_PLANE_AND_ATTACH(cargoArgs, cargoArgs.iNumPackageDropped, cargoArgs.myPlane, myArgs)
bSkipped = FALSE
IF cargoArgs.iNumReleased <> cargoArgs.iNumLanded AND (bInCam OR bDoUberCam)
IF STREAMVOL_IS_VALID(cargoArgs.streamVolID)
STREAMVOL_DELETE(cargoArgs.streamVolID)
//CLEAR_FOCUS()
ENDIF
bSkipped = TRUE
bDoUberCam = FALSE
PRINTLN("CHECK_FOR_BUTTON_PRESS bProcede: CLEANUP_EXPLOSION_CAM")
CLEANUP_EXPLOSION_CAM(cargoArgs, cargoARgs.oCargoDrop[cargoArgs.iNumReleased-1], cargoArgs.iNumReleased-1, 0, FALSE)
EXIT
ENDIF
PRINTLN("EVALUATE_DROP_CONDITIONS VIA CHECK_FOR_BUTTON_PRESS")
IF EVALUATE_DROP_CONDITIONS(myArgs, cargoArgs, MyLocalPedStruct, bPlayConvo, myVariation, bInCam)
IF DOES_ENTITY_EXIST(cargoArgs.oCargoDrop[cargoArgs.iNumPackageDropped])
IF IS_ENTITY_ATTACHED(cargoArgs.oCargoDrop[cargoArgs.iNumPackageDropped])
IF NOT bSkipped
IF IS_HELP_MESSAGE_ON_SCREEN()
CLEAR_HELP()
PRINTLN("CH - 01")
ENDIF
IF NOT bBombBayDoorsOpen
IF NOT IS_ENTITY_DEAD(cargoArgs.myPlane)
OPEN_BOMB_BAY_DOORS(cargoArgs.myPlane)
PRINTLN("bBombBayDoorsOpen = TRUE - 01")
bBombBayDoorsOpen = TRUE
ODDJOB_PLAY_SOUND("DRUG_TRAFFIC_AIR_BAY_DOOR_OPEN_MASTER", cargoArgs.soundID, FALSE, cargoArgs.myPlane)
// WAIT(1000)
SETTIMERA(0)
bCheckTime = TRUE
ENDIF
ENDIF
IF bCheckTime
IF TIMERA() > 500
bCheckTime = FALSE
HANDLE_BUTTON_PRESS_SUPPORT(myArgs, cargoArgs, myVariation, fScale, idx)
ENDIF
ELSE
HANDLE_BUTTON_PRESS_SUPPORT(myArgs, cargoArgs, myVariation, fScale, idx)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF iFrameCounter01 > 10
iFrameCounter01 = 0
ELSE
iFrameCounter01++
ENDIF
ENDPROC
PROC HANDLE_DROP_CLEANUP(BLIP_INDEX cargoBlip, BLIP_INDEX locationBlip, VEHICLE_INDEX& vehicle)
SCRIPT_REMOVE_BLIP_SAFE(cargoBlip)
SCRIPT_REMOVE_BLIP_SAFE(locationBlip)
vehicle = NULL
ENDPROC
FUNC BOOL DID_BOMB_HIT_ANY_TARGET(PLANE_DATA& myData, ARGS& myArgs, VECTOR& vCargoPos[], PLANE_CARGO_ARGS& cargoArgs, INT iDrop, INT iCargo)
// PRINTLN("DID_BOMB_HIT_ANY_TARGET: ", " IDrop: ", iDrop, " ICargo: ", iCargo)
PRINTLN("DID_BOMB_HIT_ANY_TARGET - CHECKING DROP = ", iDrop)
PRINTLN("DID_BOMB_HIT_ANY_TARGET - CHECKING CARGO = ", iCargo)
INT idx
IF myArgs.bDoTrain
//4 train cars
//Only the first entity is a train now
IF iDrop = 0
REPEAT 4 idx
IF GET_ENTITY_DISTANCE_FROM_LOCATION(GET_TRAIN_CARRIAGE(cargoArgs.vehDropoff[iDrop], idx), vCargoPos[iCargo]) < 25 / 1.5
iClosestTrainCarriage = idx
PRINTLN("iClosestTrainCarriage = ", iClosestTrainCarriage)
RETURN TRUE
ENDIF
ENDREPEAT
// ELIF iDrop = 1
// IF GET_ENTITY_DISTANCE_FROM_LOCATION(cargoArgs.vehDropoff[iDrop], vCargoPos[iCargo]) < EXPLODE_RADIUS /// 1.5
// RETURN TRUE
// ENDIF
ENDIF
//don't think engine is counted as cariage?
IF GET_ENTITY_DISTANCE_FROM_LOCATION(cargoArgs.vehDropoff[iDrop], vCargoPos[iCargo]) < 20
RETURN TRUE
ENDIF
ELSE
IF NOT IS_ENTITY_DEAD(cargoArgs.vehDropoff[iDrop])
FLOAT fTemp
fTemp = VDIST(myData.dropData[iDrop].vCenterPos, vCargoPos[iCargo])
PRINTLN("myData.dropData[iDrop].vCenterPos = ", myData.dropData[iDrop].vCenterPos)
PRINTLN("vCargoPos[iCargo] = ", vCargoPos[iCargo])
PRINTLN("DISTANCE = ", fTemp)
fTemp = fTemp
IF VDIST(myData.dropData[iDrop].vCenterPos, vCargoPos[iCargo]) < EXPLODE_RADIUS OR (bUberSucess AND iUberSuccess = iDrop)
RETURN TRUE
ENDIF
ELSE
PRINTLN("cargoArgs.vehDropoff[iDrop] IS DEAD, ", iDrop)
//entity dead... return true
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
//This function is an ugly hack to check for uber drop being a success. Ideally this data would be stored better.. maybe in a 2d array or a struct.
//In the interest of quicly getting this done and in consideration that this is no just 1 static variation.. going with this ugly hack. StM
FUNC BOOL CHECK_UBER_DROP_RESULTS(INT checkIDX, PLANE_CARGO_ARGS& cargoArgs)
//in carpet bombing we just have 1 big array with all targets but they really should be stored in groups of four.
PRINTLN("CheckIDX = ", checkIDX)
PRINTLN("INSIDE CHECKING SUCCESS FUNCTION")
BOOL bSucess = TRUE
INT idx, idx2
IF checkIDX = 0 //0,1,2,3
FOR idx = 0 TO 2
PRINTLN("Checking idx: ", idx)
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[idx])
bSucess = FALSE
ELSE
REPEAT 4 idx2
IF NOT IS_ENTITY_DEAD(pedStationaryPeds[0][idx2]) AND NOT IS_PED_INJURED(pedStationaryPeds[0][idx2])
// EXPLODE_PED_HEAD(pedStationaryPeds[0][idx2])
SET_ENTITY_HEALTH(pedStationaryPeds[0][idx2], 0)
PRINTLN("SETTING PED'S HEALTH TO ZERO, GROUP 0: PED = ", idx2)
ENDIF
ENDREPEAT
PRINTLN("Entity is DEAD: ", idx)
ENDIF
ENDFOR
ELIF checkIDX = 1 //4,5,6,7
FOR idx = 3 TO 5
PRINTLN("Checking idx: ", idx)
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[idx])
bSucess = FALSE
ELSE
REPEAT 4 idx2
IF NOT IS_ENTITY_DEAD(pedStationaryPeds[1][idx2]) AND NOT IS_PED_INJURED(pedStationaryPeds[1][idx2])
// EXPLODE_PED_HEAD(pedStationaryPeds[1][idx2])
SET_ENTITY_HEALTH(pedStationaryPeds[1][idx2], 0)
PRINTLN("SETTING PED'S HEALTH TO ZERO, GROUP 1: PED = ", idx2)
ENDIF
ENDREPEAT
// There are four groups, and the extra group seems to be closest to Group 1
REPEAT 4 idx2
IF NOT IS_ENTITY_DEAD(pedStationaryPeds[3][idx2]) AND NOT IS_PED_INJURED(pedStationaryPeds[3][idx2])
IF idx2 = 0 OR idx2 = 2
// EXPLODE_PED_HEAD(pedStationaryPeds[3][idx2])
SET_ENTITY_HEALTH(pedStationaryPeds[3][idx2], 0)
PRINTLN("SETTING PED'S HEALTH TO ZERO, GROUP 3: PED = ", idx2)
ELSE
TASK_SMART_FLEE_PED(pedStationaryPeds[3][idx2], PLAYER_PED_ID(), 1000, -1)
ENDIF
ENDIF
ENDREPEAT
PRINTLN("Entity is DEAD: ", idx)
ENDIF
ENDFOR
ELIF checkIDX = 2//8,9,10,11
FOR idx = 6 TO 8
PRINTLN("Checking idx: ", idx)
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[idx])
bSucess = FALSE
ELSE
REPEAT 4 idx2
IF NOT IS_ENTITY_DEAD(pedStationaryPeds[2][idx2]) AND NOT IS_PED_INJURED(pedStationaryPeds[2][idx2])
// EXPLODE_PED_HEAD(pedStationaryPeds[2][idx2])
SET_ENTITY_HEALTH(pedStationaryPeds[2][idx2], 0)
PRINTLN("SETTING PED'S HEALTH TO ZERO, GROUP 2: PED = ", idx2)
ENDIF
ENDREPEAT
PRINTLN("Entity is DEAD: ", idx)
ENDIF
ENDFOR
ENDIF
PRINTLN("bSucess: ", bSucess)
RETURN bSucess
ENDFUNC
FUNC BOOL IS_DROP_SUCCESS(ARGS& myArgs, AIR_VARIATION myVariation, VECTOR& vCargoPos[], PLANE_CARGO_ARGS& cargoArgs, PLANE_DATA& myData, INT iDrop, INT iCargo, BLIP_INDEX &myLocationBlip[], VECTOR& vCurDestObjective[])
INT idx
VECTOR vOffset01 = <<3,0,0>>
VECTOR vOffset02 = <<-3,0,0>>
VECTOR vOffset03 = <<0,3,0>>
VECTOR vOffset04 = <<0,-3,0>>
VECTOR vTemp,vTemp01, vTemp02, vTemp03
DEBUG_MESSAGE("IS_DROP_SUCCESS")
PRINTLN("IS_DROP_SUCCESS - CHECKING DROP: ", iDrop)
IF NOT IS_ENTITY_DEAD(cargoArgs.oCargoDrop[iCargo]) AND NOT myArgs.bDoTrain //so train drops can now be in the water..
IF IS_ENTITY_IN_WATER(cargoArgs.oCargoDrop[iCargo])
DEBUG_PRINT("Package in the water")
RETURN FALSE
ENDIF
ENDIF
SWITCH myVariation
CASE AIR_VARIATION_BOMB
//REPEAT myData.iNumDrops idx
IF NOT IS_ENTITY_DEAD(cargoArgs.vehDropoff[iDrop])
IF DID_BOMB_HIT_ANY_TARGET(myData, myArgs, vCargoPos, cargoArgs, iDrop, iCargo)
//IF GET_ENTITY_DISTANCE_FROM_LOCATION(cargoArgs.vehDropoff[iDrop], vCargoPos[iCargo]) < EXPLODE_RADIUS OR (bUberSucess AND iUberSuccess = iDrop)
bUberSucess = FALSE
clusterState = CLUSTER_STATE_INIT
IF myArgs.bDoTrain
IF iDrop = 0
SET_ENTITY_RENDER_SCORCHED(cargoArgs.vehDropoff[iDrop], TRUE)
SET_RENDER_TRAIN_AS_DERAILED(cargoArgs.vehDropoff[iDrop], TRUE)
START_PARTICLE_FX_LOOPED_AT_COORD("scr_ojdg4_train_fire", GET_ENTITY_COORDS(cargoArgs.vehDropoff[iDrop]), <<0,0,0>>, 3.0)
SET_ENTITY_RENDER_SCORCHED(GET_TRAIN_CARRIAGE(cargoArgs.vehDropoff[iDrop], 1), TRUE)
SET_RENDER_TRAIN_AS_DERAILED(GET_TRAIN_CARRIAGE(cargoArgs.vehDropoff[iDrop], 1), TRUE)
SET_ENTITY_RENDER_SCORCHED(GET_TRAIN_CARRIAGE(cargoArgs.vehDropoff[iDrop], 2), TRUE)
SET_RENDER_TRAIN_AS_DERAILED(GET_TRAIN_CARRIAGE(cargoArgs.vehDropoff[iDrop], 2), TRUE)
SET_ENTITY_RENDER_SCORCHED(GET_TRAIN_CARRIAGE(cargoArgs.vehDropoff[iDrop], 3), TRUE)
SET_RENDER_TRAIN_AS_DERAILED(GET_TRAIN_CARRIAGE(cargoArgs.vehDropoff[iDrop], 3), TRUE)
SET_ENTITY_RENDER_SCORCHED(GET_TRAIN_CARRIAGE(cargoArgs.vehDropoff[iDrop], 4), TRUE)
SET_RENDER_TRAIN_AS_DERAILED(GET_TRAIN_CARRIAGE(cargoArgs.vehDropoff[iDrop], 4), TRUE)
IF iClosestTrainCarriage = 0
vTemp = GET_ENTITY_COORDS(GET_TRAIN_CARRIAGE(cargoArgs.vehDropoff[iDrop], 0))
ADD_EXPLOSION(vTemp + vOffset01, EXP_TAG_TRAIN)
ADD_EXPLOSION(vTemp + vOffset02, EXP_TAG_TRAIN)
ADD_EXPLOSION(vTemp + vOffset03, EXP_TAG_TRAIN)
START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_drug_grd_plane_exp", vTemp, <<0,0,0>>, 3.0)
START_PARTICLE_FX_LOOPED_AT_COORD("scr_ojdg4_train_fire", vTemp, <<0,0,0>>, 3.0)
PRINTLN("ADDING EXPLOSIONS - CARRIAGE = 0")
ELIF iClosestTrainCarriage = 1
vTemp = GET_ENTITY_COORDS(GET_TRAIN_CARRIAGE(cargoArgs.vehDropoff[iDrop], 1))
ADD_EXPLOSION(vTemp + vOffset01, EXP_TAG_TRAIN)
ADD_EXPLOSION(vTemp + vOffset02, EXP_TAG_TRAIN)
ADD_EXPLOSION(vTemp + vOffset03, EXP_TAG_TRAIN)
START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_drug_grd_plane_exp", vTemp, <<0,0,0>>, 3.0)
START_PARTICLE_FX_LOOPED_AT_COORD("scr_ojdg4_train_fire", vTemp, <<0,0,0>>, 3.0)
PRINTLN("ADDING EXPLOSIONS - CARRIAGE = 1")
ELIF iClosestTrainCarriage = 2
vTemp = GET_ENTITY_COORDS(GET_TRAIN_CARRIAGE(cargoArgs.vehDropoff[iDrop], 2))
ADD_EXPLOSION(vTemp + vOffset01, EXP_TAG_TRAIN)
ADD_EXPLOSION(vTemp + vOffset02, EXP_TAG_TRAIN)
ADD_EXPLOSION(vTemp + vOffset03, EXP_TAG_TRAIN)
START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_drug_grd_plane_exp", vTemp, <<0,0,0>>, 3.0)
START_PARTICLE_FX_LOOPED_AT_COORD("scr_ojdg4_train_fire", vTemp, <<0,0,0>>, 3.0)
PRINTLN("ADDING EXPLOSIONS - CARRIAGE = 2")
ELIF iClosestTrainCarriage = 3
vTemp = GET_ENTITY_COORDS(GET_TRAIN_CARRIAGE(cargoArgs.vehDropoff[iDrop], 3))
ADD_EXPLOSION(vTemp + vOffset01, EXP_TAG_TRAIN)
ADD_EXPLOSION(vTemp + vOffset02, EXP_TAG_TRAIN)
ADD_EXPLOSION(vTemp + vOffset03, EXP_TAG_TRAIN)
START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_drug_grd_plane_exp", vTemp, <<0,0,0>>, 3.0)
START_PARTICLE_FX_LOOPED_AT_COORD("scr_ojdg4_train_fire", vTemp, <<0,0,0>>, 3.0)
PRINTLN("ADDING EXPLOSIONS - CARRIAGE = 3")
ELIF iClosestTrainCarriage = 4
vTemp = GET_ENTITY_COORDS(GET_TRAIN_CARRIAGE(cargoArgs.vehDropoff[iDrop], 4))
ADD_EXPLOSION(vTemp + vOffset01, EXP_TAG_TRAIN)
ADD_EXPLOSION(vTemp + vOffset02, EXP_TAG_TRAIN)
ADD_EXPLOSION(vTemp + vOffset03, EXP_TAG_TRAIN)
START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_drug_grd_plane_exp", vTemp, <<0,0,0>>, 3.0)
START_PARTICLE_FX_LOOPED_AT_COORD("scr_ojdg4_train_fire", vTemp, <<0,0,0>>, 3.0)
PRINTLN("ADDING EXPLOSIONS - CARRIAGE = 4")
ENDIF
vTemp01 = GET_ENTITY_COORDS(GET_TRAIN_CARRIAGE(cargoArgs.vehDropoff[iDrop], 4))
ADD_EXPLOSION(vTemp01 + vOffset03, EXP_TAG_TRAIN)
PRINTLN("ADDING EXPLOSION - DEFAULT")
SET_TRAIN_CRUISE_SPEED(cargoArgs.vehDropoff[iDrop], 0.0)
EXPLODE_VEHICLE(cargoArgs.vehDropoff[iDrop])
PRINTLN("TRAIN 0 - ADDING EXPLOSION TO VEHICLE DROPOFF AT DROP: ", iDrop)
ELIF iDrop = 1
//The extra boats
EXPLODE_VEHICLE(cargoArgs.vehDropoff[iDrop])
PRINTLN("TRAIN 1 - ADDING EXPLOSION TO VEHICLE DROPOFF AT DROP: ", iDrop)
REPEAT 4 idx
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinalExtra[idx])
START_PARTICLE_FX_LOOPED_AT_COORD("scr_ojdg4_boat_wreck_fire", GET_ENTITY_COORDS(cargoArgs.vehFinalExtra[idx]), <<0,0,0>>, 3.0)
EXPLODE_VEHICLE(cargoArgs.vehFinalExtra[idx])
SET_BOAT_SINKS_WHEN_WRECKED(cargoArgs.vehFinalExtra[idx], TRUE)
ENDIF
ENDREPEAT
vTemp01 = GET_ENTITY_COORDS(cargoArgs.vehFinalExtra[2])
ADD_EXPLOSION(vTemp01 + vOffset03, EXP_TAG_TRAIN)
ENDIF
ELSE
// vTemp01 = GET_ENTITY_COORDS(cargoArgs.vehDropoff[iDrop])
vTemp01 = myData.dropData[iDrop].vCenterPos
PRINTLN("ADDING EXPLOSION TO VEHICLE DROPOFF AT DROP: ", iDrop)
START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_drug_grd_plane_exp", vTemp01, <<0,0,0>>, 3.0)
IF NOT myArgs.bDoUberBombs
// ADD_EXPLOSION(vTemp01 + vOffset01, EXP_TAG_TRAIN, 0.5, TRUE, TRUE)
PRINTLN("ADDING EXPLOSION TO VECTOR: ", vTemp01 + vOffset01)
START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_drug_grd_plane_exp", vTemp01 + vOffset01, <<0,0,0>>, 3.0)
START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_drug_grd_plane_exp", vTemp01 + vOffset02, <<0,0,0>>, 3.0)
START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_drug_grd_plane_exp", vTemp01 + vOffset03, <<0,0,0>>, 3.0)
START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_drug_grd_plane_exp", vTemp01 + vOffset04, <<0,0,0>>, 3.0)
ENDIF
IF myArgs.bDoStationary
REPEAT MAX_EXTRA_CARS idx
IF DOES_ENTITY_EXIST(vehStationaryCars[iDrop][idx]) AND NOT IS_ENTITY_DEAD(vehStationaryCars[iDrop][idx])
vTemp02 = GET_ENTITY_COORDS(vehStationaryCars[iDrop][idx])
ADD_EXPLOSION(vTemp02 + vOffset02, EXP_TAG_TRAIN, 0.5, TRUE, TRUE)
EXPLODE_VEHICLE(vehStationaryCars[iDrop][idx])
PRINTLN("ADDING EXPLOSION TO STATIONARY CAR AT DROP: ", iDrop, " INDEX = ", idx)
ENDIF
ENDREPEAT
REPEAT MAX_NUMBER_STAGED_PROPS idx
IF DOES_ENTITY_EXIST(cargoArgs.oStagingProps[idx])
vTemp03 = GET_ENTITY_COORDS(cargoArgs.oStagingProps[idx])
ADD_EXPLOSION(vTemp03, EXP_TAG_TRAIN, 0.5, TRUE, TRUE)
PRINTLN("ADDING EXPLOSION PROP AT DROP: ", iDrop, " INDEX = ", idx)
ENDIF
ENDREPEAT
REPEAT MAX_NUMBER_DROPS idx
IF NOT IS_ENTITY_DEAD(pedStationaryPeds[iDrop][idx])
SET_ENTITY_HEALTH(pedStationaryPeds[iDrop][idx], 0)
PRINTLN("SETTING PED'S HEALTH TO ZERO, DROP: ", iDrop, " PED: ", idx)
ENDIF
ENDREPEAT
ENDIF
ENDIF
HANDLE_DROP_CLEANUP(cargoArgs.blipCrateDrop[iCargo], myLocationBlip[iDrop], cargoArgs.vehDropoff[iDrop])
RETURN TRUE
ENDIF
ELSE
IF bUberSucess AND iUberSuccess = iDrop
bUberSucess = FALSE
clusterState = CLUSTER_STATE_INIT
ENDIF
DEBUG_MESSAGE("VEHICLE DROPOFF GUY IS DEAD")
HANDLE_DROP_CLEANUP(cargoArgs.blipCrateDrop[iCargo], myLocationBlip[iDrop], cargoArgs.vehDropoff[iDrop])
//uber bomb needs a special check
IF myArgs.bDoUberBombs
IF NOT CHECK_UBER_DROP_RESULTS(iDrop, cargoArgs)
RETURN FALSE
ENDIF
ENDIF
RETURN TRUE
ENDIF
//ENDREPEAT
BREAK
DEFAULT
IF myArgs.bDoLockOn
DEBUG_MESSAGE("myArgs.bDoLockOn ")
IF iLockedIdx = iDrop
DEBUG_MESSAGE("iLockedIdx = iDrop")
IF GET_ENTITY_DISTANCE_FROM_LOCATION(cargoArgs.vehDropoff[iDrop], vCargoPos[iCargo]) < 5
cargoArgs.vehDropoff[iDrop] = NULL
CLEANUP_QUICK_CAM(cargoArgs, bLocked, iLockedIdx)
SCRIPT_REMOVE_BLIP_SAFE(cargoArgs.blipCrateDrop[iCargo])
SCRIPT_REMOVE_BLIP_SAFE(myLocationBlip[iDrop])
RETURN TRUE
ENDIF
ENDIF
ELIF VDIST(myData.dropData[iDrop].vCenterPos, vCargoPos[iCargo]) < DROP_RADIUS
SCRIPT_REMOVE_BLIP_SAFE(cargoArgs.blipCrateDrop[iCargo])
SCRIPT_REMOVE_BLIP_SAFE(myLocationBlip[iDrop])
vCurDestObjective[iDrop] = <<0,0,0>>
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
SCRIPT_REMOVE_BLIP_SAFE(cargoArgs.blipCrateDrop[iCargo])
//SCRIPT_REMOVE_BLIP_SAFE(cargoArgs.blipCargoDrop[iDrop])
RETURN FALSE
ENDFUNC
PROC CHECK_DROP_RESULTS(ARGS& myArgs, INT iCargo, INT iDrop, PLANE_CARGO_ARGS& cargoArgs, PLANE_DATA& myData,
VECTOR& vCargoPos[], AIR_VARIATION myVariation, BLIP_INDEX &myLocationBlip[], VECTOR& vCurDestObjective[], BOOL& bDoBomb)
vCargoPos[iCargo] = GET_ENTITY_COORDS(cargoArgs.oCargoDrop[iCargo])
DEBUG_MESSAGE(" CHECK_DROP_RESULTS")
// Loop through number of drops and check the distance from the drop off spots
REPEAT myData.iNumDrops iDrop
PRINTLN("CHECK_DROP_RESULTS - CHECKING DROP: ", iDrop)
IF IS_ENTITY_DEAD(cargoArgs.oCargoDrop[iCargo])
DEBUG_MESSAGE("IS_ENTITY_DEAD(cargoArgs.oCargoDrop[iCargo] = TRUE")
ENDIF
IF cargoArgs.bDrugPurchaserDead[iDrop]
DEBUG_MESSAGE("cargoArgs.bDrugPurchaserDead[iDrop] = TRUE")
ENDIF
//IF NOT cargoArgs.bCargoComplete[iCargo]
IF NOT cargoArgs.bCargoDropComplete[iDrop] //AND NOT IS_ENTITY_DEAD(cargoArgs.oCargoDrop[iCargo])
// If the cargo has hit the ground, check the distance
IF NOT cargoArgs.bDrugPurchaserDead[iDrop]
IF IS_DROP_SUCCESS(myArgs, myVariation, vCargoPos, cargoArgs, myData, iDrop, iCargo, myLocationBlip, vCurDestObjective)
PRINTLN("DROP IS A SUCCESS - GOING TO HANDLE DROP SUCCESS")
HANDLE_DROP_SUCESS(cargoARgs, myData, myVariation, myArgs, iCargo, iDrop, vCurDestObjective, bDoBomb)
ELSE
//DEBUG_MESSAGE("Failed drop")
//CargoArgs.bCargoDropComplete[iDrop] = TRUE
ENDIF
ELSE
//argoArgs.bCargoDropComplete[iDrop]
DEBUG_MESSAGE("bDrugPurchaserDead = TRUE")
ENDIF
ENDIF
ENDREPEAT
ENDPROC
//hack function for now... need a vehicle where the entity actually stays in but for now do this
FUNC BOOL HAS_VEHICLE_LANDED_IN_CAR(OBJECT_INDEX myEntity, PLANE_CARGO_ARGS& cargoArgs, PLANE_DATA& myData)
INT idx
REPEAT myData.iNumDrops idx
IF DOES_ENTITY_EXIST(cargoArgs.vehDropoff[idx]) AND NOT IS_ENTITY_DEAD(cargoArgs.vehDropoff[idx])
IF IS_ENTITY_TOUCHING_ENTITY(cargoArgs.vehDropoff[idx], myEntity)
DEBUG_MESSAGE("HAS_VEHICLE_LANDED_IN_CAR true")
RETURN TRUE
ENDIF
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
FUNC BOOL UPDATE_DISTANCE_AND_PRINTS(AIR_VARIATION myVariation, PLANE_CARGO_ARGS& cargoArgs, PLANE_DATA& myData, ARGS& myArgs)
INT closestIndex
FLOAT fDist
STRING sCamDrop
UNUSED_PARAMETER(myData)
IF NOT cargoArgs.bCompletedOneDrop
IF g_savedGlobals.sTraffickingData.iAirRank >= 5 AND myArgs.bDoUberBombs
closestIndex = FIND_CLOSEST_ENTITY_INDEX(cargoArgs.vehFinal, vPlayerPos)
ELSE
closestIndex = FIND_CLOSEST_ENTITY_INDEX(cargoArgs.vehDropoff, vPlayerPos)
ENDIF
IF closestIndex <> -1
IF g_savedGlobals.sTraffickingData.iAirRank >= 5 AND myArgs.bDoUberBombs
fDist = GET_DISTANCE_BETWEEN_ENTITIES(cargoArgs.vehFinal[closestIndex], PLAYER_PED_ID(), FALSE)
ELSE
fDist = GET_DISTANCE_BETWEEN_ENTITIES(cargoArgs.vehDropoff[closestIndex], PLAYER_PED_ID(), FALSE)
ENDIF
SWITCH myVariation
CASE AIR_VARIATION_BOMB
//bombs
sCamDrop = "DTRFAIR_HELPB"
BREAK
CASE AIR_VARIATION_DROP
CASE AIR_VARIATION_LOW_ALT
//cargo
sCamDrop = "DTRFAIR_DPCG"
BREAK
ENDSWITCH
IF myArgs.bDoMobile
sCamDrop = "DTRFAIR_LOCK"
ENDIF
SWITCH dropInstructState
CASE PLANE_PRINTS_CAM
IF fDist < CONST_FIRST_PRINT_DIST
// To enter bomb cam press ~PAD_B~.
//PRINT_HELP("DTRFAIR_HELPE")
IF myArgs.bDoUberBombs
OPEN_BOMB_BAY_DOORS(myData.myPlane)
bBombBayDoorsOpen = TRUE
PRINTLN("OPENING BOMB BAY DOORS - UBER")
ODDJOB_PLAY_SOUND("DRUG_TRAFFIC_AIR_BAY_DOOR_OPEN_MASTER", cargoArgs.soundID, FALSE, myData.myPlane)
ENDIF
IF NOT myArgs.bDoTutorial
cargoArgs.bInstructionsPrinted = TRUE
ENDIF
IF g_savedGlobals.sTraffickingData.iAirRank = 2
TRIGGER_MUSIC_EVENT("OJDA3_HATCH")
PRINTLN("TRIGGERING MUSIC - OJDA3_HATCH")
ENDIF
dropInstructState = PLANE_PRINTS_STEAR
ENDIF
BREAK
CASE PLANE_PRINTS_STEAR
//Distance check.. if we're too close skip stearing controls
IF fDist < CONST_DROP_PRINT
dropInstructState = PLANE_PRINTS_DROP
ELSE
IF cargoArgs.bBombCam
// To steer press
IF IS_HELP_MESSAGE_ON_SCREEN()
CLEAR_HELP()
PRINTLN("CH - 02")
ENDIF
PRINT_HELP("DTRFAIR_TGTS")
dropInstructState = PLANE_PRINTS_DROP
ENDIF
ENDIF
BREAK
CASE PLANE_PRINTS_DROP
//to drop the bomb press
IF fDist < CONST_DROP_PRINT
IF cargoArgs.iNumReleased = 0
IF IS_HELP_MESSAGE_ON_SCREEN()
CLEAR_HELP()
PRINTLN("CH - 03")
ENDIF
PRINT_HELP(sCamDrop)
ENDIF
dropInstructState = PLANE_PRINTS_COMPLETE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL UPDATE_TUTORIAL(PLANE_CARGO_ARGS& cargoArgs, VECTOR& vCurDestObjective[], PLANE_STATE& myState)
// DEBUG_MESSAGE("UPDATE_TUTORIAL")
INT closestIndex
//VECTOR temp
closestIndex = FIND_CLOSEST_LOCATION_INDEX(vCurDestObjective, vPlayerPos)
// iClosestDrop = closestIndex
//
// IF iClosestDrop <> -1
// PRINTLN("iClosestDrop = ", iClosestDrop)
// ENDIF
//skip if we're told to land
IF myState = PLANE_STATE_LAND AND tutorialState < TUTORIAL_STATE_LANDING_GEAR
tutorialState = TUTORIAL_STATE_LANDING_GEAR
ENDIF
//If you get out of the vehicle reset and to go a pending state?
IF bOutOfVehicle
IF IS_HELP_MESSAGE_ON_SCREEN()
CLEAR_HELP()
PRINTLN("CH - 04")
ENDIF
tutorialState = TUTORIAL_STATE_PENDING
ENDIF
SWITCH tutorialState
CASE TUTORIAL_STATE_PENDING
IF NOT bOutOfVehicle
tutorialState = TUTORIAL_STATE_PRE
ENDIF
BREAK
CASE TUTORIAL_STATE_PRE
IF NOT IS_MESSAGE_BEING_DISPLAYED()
//Check to see if we're high enough in the air
IF GET_LANDING_GEAR_STATE(cargoArgs.myPlane) = LGS_LOCKED_UP OR GET_LANDING_GEAR_STATE(cargoArgs.myPlane) = LGS_RETRACTING
tutorialState = TUTORIAL_STATE_START
ELIF GET_ENTITY_HEIGHT_ABOVE_GROUND(PLAYER_PED_ID()) > 20
SETTIMERA(0)
// CLEAR_HELP()
IF g_replay.iReplayInt[0] < 3 //int used to track number of retries for the current mission. Only show tutorial messages for the first 3 retries
PRINT_HELP("DTRFAIR_TUTO3")
ENDIF
tutorialState = TUTORIAL_STATE_START
ENDIF
ENDIF
BREAK
CASE TUTORIAL_STATE_START
IF NOT cargoArgs.bCompletedOneDrop
IF NOT bClearedLandingHelp
IF GET_LANDING_GEAR_STATE(cargoArgs.myPlane) = LGS_LOCKED_UP
OR GET_LANDING_GEAR_STATE(cargoArgs.myPlane) = LGS_RETRACTING
CLEAR_HELP()
bClearedLandingHelp = TRUE
ENDIF
ENDIF
ENDIF
IF g_replay.iReplayInt[0] < 3 //int used to track number of retries for the current mission. Only show tutorial messages for the first 3 retries
IF closestIndex <> -1
IF GET_ENTITY_DISTANCE_FROM_LOCATION(PLAYER_PED_ID(), vCurDestObjective[closestIndex]) < 2300
IF NOT bFlareHelpPrint
PRINT_HELP("DTRFAIR_TUTO1")
bFlareHelpPrint = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF closestIndex <> -1
IF NOT (cargoArgs.bDropSuccessful[closestIndex])
//todo
IF GET_ENTITY_DISTANCE_FROM_LOCATION(PLAYER_PED_ID(), vCurDestObjective[closestIndex]) < 1500
SETTIMERA(0)
// CLEAR_HELP()
DEBUG_MESSAGE("Setting print position 1")
IF g_replay.iReplayInt[0] < 3 //int used to track number of retries for the current mission. Only show tutorial messages for the first 3 retries
IF NOT bPrintDropZoneHelp
IF NOT IS_HELP_MESSAGE_ON_SCREEN()
PRINT_HELP("DTRFAIR_HELPJ")
bPrintDropZoneHelp = TRUE
PRINTLN("PRINTING DROP ZONE HELP")
ENDIF
ENDIF
ENDIF
tutorialState = TUTORIAL_STATE_A
ENDIF
ENDIF
ENDIF
//ENDIF
BREAK
CASE TUTORIAL_STATE_A
closestIndex = FIND_CLOSEST_LOCATION_INDEX(vCurDestObjective, vPlayerPos)
//SET_HELP_MESSAGE_STYLE(HELP_MESSAGE_STYLE_TAGGABLE, HUD_COLOUR_NET_PLAYER15, 255, HELP_TEXT_SOUTH)
//DEBUG_MESSAGE("Setting print position 2")
//SET_HELP_MESSAGE_WORLD_POSITION(<<vCurDestObjective[closestIndex].x, vCurDestObjective[closestIndex].y, vCurDestObjective[closestIndex].z+25>> )
IF GET_ENTITY_DISTANCE_FROM_LOCATION(PLAYER_PED_ID(), vCurDestObjective[closestIndex]) < CONST_FIRST_PRINT_DIST_TUT - 50
PREPARE_MUSIC_EVENT("OJDA1_HATCH_OPEN")
PRINTLN("PREPARING MUSIC - OJDA1_HATCH_OPEN")
ENDIF
IF GET_ENTITY_DISTANCE_FROM_LOCATION(PLAYER_PED_ID(), vCurDestObjective[closestIndex]) < CONST_FIRST_PRINT_DIST_TUT
SETTIMERA(0)
// CLEAR_HELP()
IF NOT cargoArgs.bInstructionsPrinted
//Camera cut here!
OPEN_BOMB_BAY_DOORS(cargoArgs.myPlane)
bBombBayDoorsOpen = TRUE
PRINTLN("bBombBayDoorsOpen = TRUE - 03")
ODDJOB_PLAY_SOUND("DRUG_TRAFFIC_AIR_BAY_DOOR_OPEN_MASTER", cargoArgs.soundID, FALSE, cargoArgs.myPlane)
PRINTLN("PLAYING SOUND")
tutorialState = TUTORIAL_STATE_CUT
ELSE
SETTIMERA(1000)
tutorialState = TUTORIAL_STATE_B
ENDIF
ENDIF
BREAK
CASE TUTORIAL_STATE_CUT
// SETUP_OPEN_BOMB_CAM(myArgs, cargoArgs)
tutorialState = TUTORIAL_STATE_B
BREAK
CASE TUTORIAL_STATE_B
// IF TIMERA() > 1500
// cargoArgs.bInstructionsPrinted = TRUE
// CLEANUP_CAM(cargoArgs, bClearPrints)
// IF IS_HELP_MESSAGE_ON_SCREEN()
// CLEAR_HELP()
// PRINTLN("CH - 05")
// ENDIF
// tutorialState = TUTORIAL_STATE_E
//
// ENDIF
cargoArgs.bInstructionsPrinted = TRUE
tutorialState = TUTORIAL_STATE_E
BREAK
// CASE TUTORIAL_STATE_C
// SET_HELP_MESSAGE_STYLE(HELP_MESSAGE_STYLE_TAGGABLE, HUD_COLOUR_NET_PLAYER15, -1, HELP_TEXT_SOUTH)
// temp = vPlayerPos
// DEBUG_MESSAGE("Setting print position 4")
// SET_HELP_MESSAGE_WORLD_POSITION(temp)
// IF TIMERA() > 6000 OR cargoArgs.bBombCam
// CLEAR_HELP()
// tutorialState = TUTORIAL_STATE_D
// RETURN TRUE
// ENDIF
// BREAK
// CASE TUTORIAL_STATE_D
// IF GET_ENTITY_DISTANCE_FROM_LOCATION(PLAYER_PED_ID(), vCurDestObjective[closestIndex], FALSE) < CONST_DROP_PRINT
// //we're too closej ust print how to drop the bomb
// tutorialState = TUTORIAL_STATE_E
// ELIF cargoArgs.bBombCam
// //~s~To steer while in target cam press ~PAD_LB~. and ~PAD_RB~~s~
// PRINT_HELP("DTRFAIR_TGTS")
// tutorialState = TUTORIAL_STATE_E
// ENDIF
// BREAK
CASE TUTORIAL_STATE_E
//IF GET_ENTITY_DISTANCE_FROM_LOCATION(PLAYER_PED_ID(), vCurDestObjective[closestIndex], FALSE) < CONST_DROP_PRINT
// CLEAR_HELP()
PRINT_HELP("DTRFAIR_DPCG")
SETTIMERB(0)
//SET_HELP_MESSAGE_WORLD_POSITION(<<vCurDestObjective[closestIndex].x,vCurDestObjective[closestIndex].y,vCurDestObjective[closestIndex].z+2.0>>)
tutorialState = TUTORIAL_STATE_F
//ENDIF
BREAK
CASE TUTORIAL_STATE_F
IF cargoArgs.bCompletedOneDrop OR cargoArgs.bDroppedOne
//rely on clear help called in other scripts
tutorialState = TUTORIAL_STATE_REPEAT
BREAK
ELIF TIMERB() > 8000
IF IS_HELP_MESSAGE_ON_SCREEN()
CLEAR_HELP()
PRINTLN("CH - 06")
ENDIF
tutorialState = TUTORIAL_STATE_REPEAT
ENDIF
//SET_HELP_MESSAGE_STYLE(HELP_MESSAGE_STYLE_TAGGABLE, HUD_COLOUR_NET_PLAYER15, -1, HELP_TEXT_SOUTH)
//DEBUG_MESSAGE("Setting print position 6")
//SET_HELP_MESSAGE_WORLD_POSITION(vPlayerPos)
BREAK
CASE TUTORIAL_STATE_REPEAT
IF cargoArgs.bCompletedOneDrop
cargoArgs.bCompletedOneDrop = FALSE
tutorialState = TUTORIAL_STATE_START
ENDIF
BREAK
CASE TUTORIAL_STATE_LANDING_GEAR
//PRINTLN("In landing gear state destionation is: ", vCurDestObjective[0])
IF GET_ENTITY_DISTANCE_FROM_LOCATION(PLAYER_PED_ID(), vCurDestObjective[0], FALSE) < 800 //CONST_FIRST_PRINT_DIST_TUT
IF GET_LANDING_GEAR_STATE(cargoArgs.myPlane) = LGS_LOCKED_UP OR GET_LANDING_GEAR_STATE(cargoArgs.myPlane) = LGS_RETRACTING
START_TIMER_NOW(tutorialTimer)
CLEAR_HELP()
PRINT_HELP("DTRFAIR_TUTO4")
tutorialState = TUTORIAL_STATE_LANDING_WAIT
ELSE
tutorialState = TUTORIAL_STATE_END
ENDIF
ENDIF
BREAK
CASE TUTORIAL_STATE_LANDING_WAIT
DEBUG_MESSAGE("TUTORIAL_STATE_LANDING_WAIT")
IF GET_LANDING_GEAR_STATE(cargoArgs.myPlane) = LGS_LOCKED_DOWN OR TIMER_DO_WHEN_READY(tutorialTimer, 8)
DEBUG_MESSAGE("TUTORIAL_STATE_END")
tutorialState = TUTORIAL_STATE_END
ENDIF
BREAK
CASE TUTORIAL_STATE_END
//empty
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC UPDATE_HACK_HEAT_SINK(PLANE_CARGO_ARGS &cargoArgs, PLANE_DATA& myData, ENTITY_INDEX myPackage, ARGS& myArgs)
iFrameCounterCam++
IF iFrameCounterCam > 1
iFrameCounterCam = 0
LeftX = (0.5) * GET_DISABLED_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_SCRIPT_LEFT_AXIS_X)
LeftY = (0.5) * GET_DISABLED_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_SCRIPT_LEFT_AXIS_Y)
vBombMoveOffset = ROTATE_VECTOR_ABOUT_Z(<<-LeftX, LeftY, 0>>, fBombHeading)
ENDIF
IF myArgs.bDoBomb AND NOT bSkipped AND NOT bPlaneTooLow
PRINT_HELP("DTRFAIR_HELPK")
ENDIF
IF DOES_ENTITY_EXIST(myPackage)
AND DOES_ENTITY_EXIST(cargoArgs.oBombDummy)
IF NOT IS_ENTITY_DEAD(myPackage)
AND NOT IS_ENTITY_DEAD(cargoArgs.oBombDummy)
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(myPackage, APPLY_TYPE_IMPULSE, vBombMoveOffset, 0, FALSE, TRUE)
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(cargoArgs.oBombDummy, APPLY_TYPE_IMPULSE, vBombMoveOffset, 0, FALSE, TRUE)
ENDIF
ENDIF
myData.fPlayerRot = myData.fPlayerRot
ENDPROC
//broke this out for readbility. Checks to see if our bomb / package have hit the ground or water
FUNC BOOL HAS_DROP_HIT(PLANE_CARGO_ARGS &cargoArgs, INT iCargo)
//PRINTLN("HAS_DROP_HIT: ", " ICargo: ", iCargo)
BOOL bHit = FALSE
VECTOR vBombCoord = GET_ENTITY_COORDS(cargoArgs.oCargoDrop[iCargo])
FLOAT fBombHeight = vBombCoord.z
VECTOR vPlaneCoord = GET_ENTITY_COORDS(cargoArgs.myPlane)
FLOAT fPlaneHeight = vPlaneCoord.z
IF NOT bPlaneCollidable
IF VDIST2(GET_ENTITY_COORDS(cargoArgs.oCargoDrop[iCargo]), GET_ENTITY_COORDS(cargoArgs.myPlane)) > 16 // 4*4
SET_ENTITY_COLLISION(cargoArgs.myPlane, TRUE)
bPlaneCollidable = TRUE
ENDIF
ENDIF
// Has entity collided with anything other than plane (makes sure it has escaped the plane in the z)
IF (HAS_ENTITY_COLLIDED_WITH_ANYTHING(cargoArgs.oCargoDrop[iCargo]) AND NOT IS_ENTITY_ATTACHED_TO_ANY_VEHICLE(cargoArgs.oCargoDrop[iCargo]))
AND fBombHeight < (fPlaneHeight - 3)
PRINTLN("HAS_DROP_HIT: Entity collided with something")
bHit = TRUE
ENDIF
IF NOT bCreatedThisFrame
IF GET_ENTITY_SPEED(cargoArgs.oCargoDrop[iCargo]) = 0 AND NOT IS_ENTITY_ATTACHED_TO_ANY_VEHICLE(cargoArgs.oCargoDrop[iCargo])
PRINTLN("HAS_DROP_HIT: Entity speed is too low")
bHit = TRUE
ENDIF
ELSE
bCreatedThisFrame = FALSE
ENDIF
IF IS_ENTITY_IN_WATER(cargoArgs.oCargoDrop[iCargo])
PRINTLN("HAS_DROP_HIT: Entity has hit the water")
//need to track this for what explosion to trigger.
bHit = TRUE
bHitWater = TRUE
ELSE
bHitWater = FALSE
ENDIF
RETURN bHit
ENDFUNC
PROC UPDATE_DROP_STATUS(ARGS& myArgs, PLANE_CARGO_ARGS &cargoArgs, PLANE_DATA& myData, INT& iCargo, INT& iDrop,
VECTOR &vCurDestObjective[], VECTOR& vCargoPos[], BLIP_INDEX &myLocationBlip[], AIR_VARIATION &myVariation, BOOL& bDoBomb)
VECTOR vTemp, vOffset01, vOffset02, vOffset03, vOffset04
vOffset01 = <<7,0,0>>
vOffset02 = <<-7,0,0>>
vOffset03 = <<0,7,0>>
vOffset04 = <<0,-7,0>>
IF cargoArgs.iNumPackageDropped > 0 AND myArgs.bDoBomb
IF NOT IS_ENTITY_ATTACHED_TO_ANY_VEHICLE(cargoArgs.oCargoDrop[cargoArgs.iNumPackageDropped-1]) AND NOT cargoArgs.bCargoComplete[cargoArgs.iNumPackageDropped-1]
//UPDATE_VISIBLILITY_AND_COLLISION(cargoArgs.oCargoDrop[cargoArgs.iNumPackageDropped-1], cargoArgs)
SIMULATE_NOSE_TIP_DOWN(cargoArgs.oCargoDrop[cargoArgs.iNumPackageDropped-1], cargoArgs)
IF bSwitchedBombs
fCamFov = LERP_FLOAT(65.0, 25.0, fLerpCount/360)
fLerpCount += 1.0
IF fCamFov >= 25.0
IF DOES_CAM_EXIST(cargoArgs.CamExplosion)
IF IS_CAM_ACTIVE(cargoArgs.CamExplosion)
SET_CAM_FOV(cargoArgs.CamExplosion, fCamFov)
PRINTLN("CAM FOV = ", GET_CAM_FOV(cargoArgs.CamExplosion))
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
// Loop on number of cargo packages //
REPEAT myData.iNumTotalCargo iCargo
IF DOES_ENTITY_EXIST(cargoArgs.oCargoDrop[iCargo]) AND NOT cargoArgs.bCargoComplete[iCargo] AND NOT IS_ENTITY_ATTACHED_TO_ANY_VEHICLE(cargoArgs.oCargoDrop[iCargo])
//We're falling down... let's try to hack check early sucess and if too far away push the package towards the target
IF NOT myArgs.bDoUberBombs
UPDATE_HACK_HEAT_SINK(cargoArgs, myData, cargoArgs.oCargoDrop[iCargo], myArgs)
ENDIF
vBombVelocity = GET_ENTITY_VELOCITY(cargoArgs.oCargoDrop[iCargo])
IF vBombVelocity.z > -70
vBombVelocity.z -= 0.25
SET_ENTITY_VELOCITY(cargoArgs.oCargoDrop[iCargo], vBombVelocity)
IF DOES_ENTITY_EXIST(cargoArgs.oBombDummy)
SET_ENTITY_VELOCITY(cargoArgs.oBombDummy, vBombVelocity)
//VECTOR vTempRot = GET_ENTITY_ROTATION(cargoArgs.oBombDummy)
//VECTOR vTempRot2 = GET_ENTITY_ROTATION(cargoARgs.oCargoDrop[iCargo])
//vTempRot.x = vTempRot2.x
//SET_ENTITY_ROTATION(cargoArgs.oBombDummy, vTempRot)
//SET_ENTITY_COORDS(cargoArgs.oBombDummy, GET_ENTITY_COORDS(cargoArgs.oCargoDrop[iCargo]))
ENDIF
ENDIF
IF myVariation = AIR_VARIATION_DROP OR myVariation = AIR_VARIATION_LOW_ALT
IF NOT cargoArgs.bCargoChuteVisible[iCargo] AND DOES_ENTITY_EXIST(cargoArgs.oCargoChute[iCargo])
PRINTLN("Checking if we should turn on chute..")
IF GET_GAME_TIMER() - cargoArgs.iCargoChuteTime[iCargo] > 150
PRINTLN("Turning on the chute drawing")
PLAY_ENTITY_ANIM(cargoArgs.oCargoChute[iCargo], "p_cargo_chute_s_deploy", "p_cargo_chute_s", INSTANT_BLEND_IN, FALSE, FALSE)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(cargoArgs.oCargoChute[iCargo])
SET_ENTITY_VISIBLE(cargoArgs.oCargoChute[iCargo], TRUE)
cargoArgs.bCargoChuteVisible[iCargo] = TRUE
ENDIF
ENDIF
ENDIF
IF HAS_DROP_HIT(cargoArgs, iCargo)
IF NOT cargoArgs.bCargoHitGround[iCargo]
cargoArgs.iNumLanded ++
DEBUG_PRINT("INCREASING NUM LANDED")
cargoArgs.bCargoHitGround[iCargo] = TRUE
IF STREAMVOL_IS_VALID(cargoArgs.streamVolID)
STREAMVOL_DELETE(cargoArgs.streamVolID)
CLEAR_FOCUS()
ENDIF
//bSwitchedBombs = FALSE // Lets us drop bombs, son
IF myVariation = AIR_VARIATION_BOMB AND NOT myArgs.bDoUberBombs
vTemp = GET_ENTITY_COORDS(cargoArgs.oCargoDrop[iCargo])
IF bHitWater
START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_ojdg4_water_exp", vTemp, <<0,0,0>>, 1.0)
ODDJOB_PLAY_SOUND("WATER_EXPLOSION", cargoArgs.soundID)
ELSE
START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_ojdg4_boat_exp", vTemp, <<0,0,0>>, 3.0)
ADD_EXPLOSION(vTemp + vOffset01, EXP_TAG_TRUCK, 1.0,FALSE)
ADD_EXPLOSION(vTemp + vOffset02, EXP_TAG_TRAIN, 1.0,FALSE)
ADD_EXPLOSION(vTemp + vOffset03, EXP_TAG_TRUCK, 1.0,FALSE)
ADD_EXPLOSION(vTemp + vOffset04, EXP_TAG_TRAIN, 1.0,FALSE)
ADD_EXPLOSION(vTemp, EXP_TAG_TRAIN, 1.0,FALSE)
START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_drug_grd_plane_exp", vTemp, <<0,0,0>>, 3.0)
ODDJOB_PLAY_SOUND("DRUG_TRAFFIC_AIR_EXPLOSION_MASTER", cargoArgs.soundID)
ENDIF
ENDIF
CHECK_DROP_RESULTS(myArgs, iCargo, iDrop, cargoArgs, myData, vCargoPos, myVariation, myLocationBlip,
vCurDestObjective, bDoBomb)
//checks to see if it's a fail and handles it
HANDLE_DROP_FAIL(cargoArgs, myData, myVariation, myArgs, iCargo)
HANDLE_SIDE_UI_EXPLANATION(myArgs)
IF DOES_ENTITY_EXIST(cargoArgs.oCargoDrop[iCargo])
SET_ENTITY_VISIBLE(cargoArgs.oCargoDrop[iCargo], FALSE)
ENDIF
ENDIF
// ------------------------------------MAIN CHECK------------------------------------
ELIF cargoArgs.bDetached[iCargo]
//TODO take into account player height
IF (GET_GAME_TIMER() - cargoArgs.cargoTimes[iCargo]) > dropTimeout
// Adding block to prevent cargo drop from never ending
IF NOT cargoArgs.bCargoHitGround[iCargo]
cargoArgs.bBombCam = FALSE
CLEANUP_CAM(cargoArgs, bClearPrints)
//TODO CLEANUP_EXPLOSION_CAM should go here too?
DEBUG_PRINT("TIMED OUT PACKAGE!!!")
cargoArgs.iNumLanded ++
DEBUG_PRINT("INCREASING NUM LANDED VIA TIME OUT CHECK")
cargoArgs.bCargoHitGround[iCargo] = TRUE
cargoArgs.bCargoSuccessful[iCargo] = FALSE
//cargoArgs.bCargoPerfect[iCargo] = FALSE
//checks to see if it's a fail based on
HANDLE_DROP_FAIL(cargoArgs, myData, myVariation, myArgs, iCargo)
HANDLE_SIDE_UI_EXPLANATION(myArgs)
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDPROC
PROC INIT_BLIPPING(ARGS& myArgs, PLANE_CARGO_ARGS &cargoArgs, PLANE_DATA& myData, BLIP_INDEX &myLocationBlip[], VECTOR &vCurDestObjective[])
INT idx
IF myArgs.bDoUberBombs
IF g_savedGlobals.sTraffickingData.iAirRank >= 5
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[0])
myLocationBlip[0] = ADD_BLIP_FOR_ENTITY(cargoArgs.vehFinal[0])
SET_BLIP_COLOUR(myLocationBlip[0], BLIP_COLOUR_RED)
ENDIF
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[4])
myLocationBlip[1] = ADD_BLIP_FOR_ENTITY(cargoArgs.vehFinal[4])
SET_BLIP_COLOUR(myLocationBlip[1], BLIP_COLOUR_RED)
ENDIF
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[8])
myLocationBlip[2] = ADD_BLIP_FOR_ENTITY(cargoArgs.vehFinal[8])
SET_BLIP_COLOUR(myLocationBlip[2], BLIP_COLOUR_RED)
ENDIF
ELSE
myLocationBlip[0] = ADD_BLIP_FOR_COORD(<<1796.6689, 3287.4692, 41.4058>>)
SET_BLIP_COLOUR(myLocationBlip[0], BLIP_COLOUR_YELLOW)
SET_BLIP_SCALE(myLocationBlip[0], 1.0)
ENDIF
ENDIF
IF myArgs.bDoTrain
REPEAT myData.iNumDrops idx
myLocationBlip[idx] = ADD_BLIP_FOR_ENTITY(cargoArgs.vehDropoff[idx])
SET_BLIP_COLOUR(myLocationBlip[idx], BLIP_COLOUR_RED)
SET_BLIP_NAME_FROM_TEXT_FILE(myLocationBlip[idx], "DTRFAIR_TGT1")
ENDREPEAT
ELIF NOT myArgs.bDoUberBombs
REPEAT myData.iNumDrops idx
IF NOT DOES_BLIP_EXIST(myLocationBlip[idx])
myLocationBlip[idx] = ADD_BLIP_FOR_COORD(myData.dropData[idx].vCenterPos)
IF myArgs.bDoBomb
SET_BLIP_COLOUR(myLocationBlip[idx], BLIP_COLOUR_RED)
SET_BLIP_NAME_FROM_TEXT_FILE(myLocationBlip[idx], "DTRFAIR_TGT")
ELSE
SET_BLIP_COLOUR(myLocationBlip[idx], BLIP_COLOUR_YELLOW)
SET_BLIP_NAME_FROM_TEXT_FILE(myLocationBlip[idx], "DTRFAIR_DRP")
ENDIF
vCurDestObjective[idx] = myData.dropData[idx].vCenterPos
ENDIF
ENDREPEAT
ENDIF
ENDPROC
FUNC BOOL CHECK_FOR_EARLY_TERMINATION(PLANE_CARGO_ARGS &cargoArgs, PLANE_DATA& myData)
INT iRemainingCargo, iRemainingDrops
// PRINTLN("myData.iNumTotalCargo = ", myData.iNumTotalCargo)
// PRINTLN("cargoArgs.iNumLanded = ", cargoArgs.iNumLanded)
iRemainingCargo = GET_NUMBER_OF_REMAINING_CARGO(myData.iNumTotalCargo, cargoArgs.iNumLanded)
// PRINTLN("iRemainingCargo = ", iRemainingCargo)
//
// PRINTLN("planeData.iNumDrops = ", myData.iNumDrops)
// PRINTLN("cargoArgs.iNumSuccessfulDrops = ", cargoArgs.iNumSuccessfulDrops)
iRemainingDrops = (myData.iNumDrops - cargoArgs.iNumSuccessfulDrops)
// PRINTLN("iRemainingDrops = ", iRemainingDrops)
/* If the number of remaining cargo is less than the total needed to pass - the number successful drops, fail early...
because the player can't win at this point*/
IF iRemainingCargo < iRemainingDrops
PRINTLN("CHECK_FOR_EARLY_TERMINATION RETURNING - TRUE")
bEarlyFail = TRUE
RETURN TRUE
ELSE
// PRINTLN("CHECK_FOR_EARLY_TERMINATION RETURNING - FALSE")
RETURN FALSE
ENDIF
ENDFUNC
FUNC BOOL CARGO_DROPS_COMPLETE(ARGS& myArgs, PLANE_CARGO_ARGS &cargoArgs, PLANE_DATA& myData, DROP_STATE_CHECKS &dropStates, structTimer &tPrintHelp,
TEXT_LABEL_31& sLastObjective, VECTOR &vCurDestObjective[], BLIP_INDEX &myLocationBlip[], AIR_VARIATION &myVariation,
BOOL& bTimeExpired, BOOL& bIsHighAlt, BOOL& bDoBomb, PLANE_STATE planeState)
UNUSED_PARAMETER(bIsHighAlt)
VECTOR vCargoPos[MAX_NUMBER_PACKAGES]
INT iCargo, iDrop
SWITCH dropStates
CASE DROP_STATE_CHECKS_INITIALIZE
DEBUG_PRINT("INSIDE CASE DROP_STATE_CHECKS_INITIALIZE")
START_TIMER_NOW(tPrintHelp)
//INIT_BILPPING(myArgs, cargoArgs, myData, myLocationBlip, vCurDestObjective)
dropStates = DROP_STATE_CHECKS_RUNNING //DROP_STATE_CHECKS_PRE_RUNNING
BREAK
CASE DROP_STATE_CHECKS_RUNNING
//DEBUG_PRINT("DROP_STATE_CHECKS_RUNNING")
//UPDATE_UI(cargoArgs, myData, cargoArgs.bDetached, TRUE, myArgs.bDoBomb)
IF myArgs.bDoTutorial
UPDATE_TUTORIAL(cargoArgs, vCurDestObjective, planeState)
ENDIF
//We need to skip over if another bomb dropped..
//THIS cleans up the bomb follow cam and look back cam
IF myVariation = AIR_VARIATION_BOMB AND cargoArgs.iCutGameTime <> 0 AND cargoArgs.iCutGameTime <> 1
PLANE_AUTOPILOT(cargoArgs.myPlane, 20.0, FALSE, 10)
DEBUG_MESSAGE("PLANE_AUTOPILOT 1")
IF NOT bDoneFlash01
IF IS_PLAYER_IN_FIRST_PERSON_CAMERA()
IF GET_GAME_TIMER() - cargoArgs.iCutGameTime > 2200
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
DEBUG_MESSAGE("bDoneFlash01 = TRUE")
bDoneFlash01 = TRUE
ENDIF
ENDIF
ENDIF
IF GET_GAME_TIMER() - cargoArgs.iCutGameTime > CAM_TIME
OR IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_VEH_FLY_ATTACK)
OR IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_VEH_FLY_ATTACK)
// IF myArgs.bDoUberBombs
// PRINT_HELP_WITH_NUMBER("DTRFAIR_BLFT1", cargoArgs.iNumPackagesTotal - cargoArgs.iNumReleased)
// ELSE
// PRINT_HELP_WITH_NUMBER("DTRFAIR_BLFT", cargoArgs.iNumPackagesTotal - cargoArgs.iNumReleased)
// ENDIF
DEBUG_MESSAGE("RESETTING: bDoneFlash01 = FALSE")
bDoneFlash01 = FALSE
//auto piolot here too? or hold pattern?
CLEAR_FOCUS()
CLEANUP_CAM(cargoArgs, bClearPrints)
DEBUG_MESSAGE("Setting forward speed to 40")
SET_VEHICLE_FORWARD_SPEED(cargoArgs.myPlane, 40.0)
cargoArgs.iCutGameTime = 0
ELIF cargoArgs.iCutGameTimeStart <> 0
ENDIF
ENDIF
IF cargoArgs.bBombCam
//PLANE_BOMB_MODE(cargoArgs, myArgs, bIsHighAlt, vCurDestObjective)
ENDIF
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2220418
IF NOT myArgs.bDoTutorial
UPDATE_DISTANCE_AND_PRINTS(myVariation, cargoArgs, myData, myArgs)
ENDIF
IF myArgs.bDoUberBombs AND NOT bUberActive
UPDATE_DROP_STATUS(myArgs, cargoArgs, myData, iCargo, iDrop, vCurDestObjective, vCargoPos, myLocationBlip,
myVariation, bDoBomb)
IF g_savedGlobals.sTraffickingData.iAirRank >= 5
REMOVE_DISTANT_CONVOY_VEHICLES(cargoArgs)
ALTERNATE_FINAL_BLIP_REPEATABLE(cargoArgs, myLocationBlip, sLastObjective, bGenericPrint, bOutOfVehicle)
ELSE
ALTERNATE_FINAL_BLIP(cargoArgs, myLocationBlip, sLastObjective, bGenericPrint, bOutOfVehicle)
ENDIF
ELIF NOT myArgs.bDoUberBombs
UPDATE_DROP_STATUS(myArgs, cargoArgs, myData, iCargo, iDrop, vCurDestObjective, vCargoPos, myLocationBlip,
myVariation, bDoBomb)
ENDIF
// IF NOT myArgs.bDoTrain AND
IF NOT myArgs.bDoMobile AND NOT bOutOfVehicle AND NOT bInActiveFight AND NOT myArgs.bDoUberBombs
// Change blips from normal to radius
ALTERNATE_BLIP_STYLES(myArgs, myLocationBlip, vCurDestObjective, myData, cargoArgs, vPlayerPos, bDoBomb)
ELSE
IF NOT myArgs.bDoUberBombs
vReturn = UPDATE_BLIP_PROXIMITY(myLocationBlip, vCurDestObjective, cargoArgs.vehDropoff, FALSE)
IF NOT ARE_VECTORS_EQUAL(vReturn, <<0,0,0>>)
IF NOT myArgs.bDoStationary
vReturn.z += 3.0
//DRAW_CHECKPOINT(vReturn, 1.5, 0, 255, 0)
ENDIF
ENDIF
ENDIF
ENDIF
IF GET_NUMBER_OF_REMAINING_CARGO(myData.iNumTotalCargo, cargoArgs.iNumLanded) = 0
OR ARE_DROPS_COMPLETE(cargoArgs, myData)
OR CHECK_FOR_EARLY_TERMINATION(cargoArgs, myData)
OR bTimeExpired
OR bJSkipped
REMOVE_ALL_BLIPS(cargoArgs, myLocationBlip, vCurDestObjective)
//CLEANUP_CAM(cargoArgs, bClearPrints)
DEBUG_PRINT("RETURNING TRUE ON CARGO CHECK")
// to fix bug 1546889 - 7/15/13 - MB
IF ( DOES_CAM_EXIST(cargoArgs.CamExplosion) AND IS_CAM_ACTIVE(cargoArgs.CamExplosion) )
OR ( DOES_CAM_EXIST(cargoArgs.CamTransition) AND IS_CAM_ACTIVE(cargoArgs.CamTransition) )
SET_VEHICLE_FORWARD_SPEED(cargoArgs.myPlane, 40.0)
DEBUG_PRINT("SETTING FORWARD SPEED TO 40")
ENDIF
bDropPhaseComplete = TRUE
dropStates = DROP_STATE_CHECKS_FINAL
SETTIMERA(0)
ENDIF
BREAK
CASE DROP_STATE_CHECKS_FINAL
IF myVariation = AIR_VARIATION_BOMB AND cargoArgs.iCutGameTime <> 0
IF NOT bDoneFlash02
IF IS_PLAYER_IN_FIRST_PERSON_CAMERA()
IF GET_GAME_TIMER() - cargoArgs.iCutGameTime > 2200
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
DEBUG_MESSAGE("bDoneFlash02 = TRUE")
bDoneFlash02 = TRUE
ENDIF
ENDIF
ENDIF
IF GET_GAME_TIMER() - cargoArgs.iCutGameTime > CAM_TIME //OR IS_COLLISION_IMMINENT_WRAPPER(cargoArgs.myPlane)
DEBUG_PRINT("SECOND CHECK PASS")
IF DOES_CAM_EXIST(cargoArgs.CamTransition)
SET_CAM_ACTIVE(cargoArgs.CamTransition, FALSE)
ENDIF
CLEAR_FOCUS()
CLEANUP_CAM(cargoArgs, bClearPrints)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
cargoArgs.iCutGameTime = 0
ENDIF
ENDIF
// RENDER_SCRIPT_CAMS(FALSE, FALSE)
//UPDATE_UI(cargoArgs, myData, cargoArgs.bDetached, TRUE, myArgs.bDoBomb)
//todo add delay so we can see results
//This was fucking up my life and cutting the conversation short
IF TIMERA() > 3000 AND NOT IS_SCRIPTED_CONVERSATION_ONGOING()
OR bJSkipped
IF GET_GAME_TIMER() - cargoArgs.iCutGameTime > 4500
DEBUG_MESSAGE("Clear prints asd")
CLEAR_PRINTS()
CLEAR_FOCUS()
cargoArgs.bBombCam = FALSE
CLEANUP_CAM(cargoArgs, bClearPrints)
vCurDestObjective[0] = myData.endData.vCenterPos
RETURN TRUE
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
#IF IS_DEBUG_BUILD
PROC CREATE_OFFSET_WIDGETS()
START_WIDGET_GROUP("DrugDropCrateOffset")
DEBUG_PRINT("INSIDE CREATE WIDGETS")
ADD_WIDGET_FLOAT_SLIDER("crateOffsetX",fCameraOffsetX, -10, 10, 0.01)
ADD_WIDGET_FLOAT_SLIDER("crateOffsetY",fCameraOffsetY, -10, 10, 0.01)
ADD_WIDGET_FLOAT_SLIDER("crateOffsetZ",fCameraOffsetZ, -10, 10, 0.01)
ADD_WIDGET_FLOAT_SLIDER("crateHeadingX",fCameraHeadingX, -10, 10, 0.01)
ADD_WIDGET_FLOAT_SLIDER("crateHeadingY",fCameraHeadingY, -10, 10, 0.01)
ADD_WIDGET_FLOAT_SLIDER("crateHeadingZ",fCameraHeadingZ, -10, 10, 0.01)
STOP_WIDGET_GROUP()
ENDPROC
#ENDIF // IS_DEBUG_BUILD
PROC RUN_WIDGETS(VEHICLE_INDEX vehicle, OBJECT_INDEX &oCargoDrop[])
IF DOES_ENTITY_EXIST(vehicle)
DEBUG_PRINT("RUNNING WIDGETS")
IF NOT IS_ENTITY_DEAD(vehicle)
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehicle)
ATTACH_ENTITY_TO_ENTITY(oCargoDrop[0], vehicle, 0, <<fCameraOffsetX, fCameraOffsetY, fCameraOffsetZ>>, <<fCameraHeadingX, fCameraHeadingY, fCameraHeadingZ>> )
DEBUG_PRINT("INSIDE ATTACHMENT")
ENDIF
ENDIF
ENDIF
ENDPROC
//Wraper for all of the checks that tell us a bomb or package has hit something
FUNC BOOL RUN_HAS_HIT_LOGIC(PLANE_CARGO_ARGS &cargoArgs, INT iNum, INT idx)
VECTOR vTemp
IF DOES_ENTITY_EXIST(cargoArgs.oClusterDrop[iNum][idx]) AND NOT IS_ENTITY_ATTACHED_TO_ANY_VEHICLE(cargoArgs.oClusterDrop[iNum][idx])
IF HAS_ENTITY_COLLIDED_WITH_ANYTHING(cargoArgs.oClusterDrop[iNum][idx]) OR GET_ENTITY_SPEED(cargoArgs.oClusterDrop[iNum][idx]) = 0.0
OR IS_ENTITY_IN_WATER(cargoArgs.oClusterDrop[iNum][idx]) //OR (TIMERB() > FAIL_SAFE_TIME)
//fix for a single bomb falling through the world and holding up this from completing
vTemp = GET_ENTITY_COORDS(cargoArgs.oClusterDrop[iNum][idx])
IF fMinGroundZ > vTemp.z
//PRINTLN("Setting fMinGroundZ = ", vTemp.z)
fMinGroundZ = vTemp.z
ENDIF
//If at least one bomb in the cluster has hit
IF ABSF(vTemp.z - fMinGroundZ) > 20.0 AND vTemp.z < fMinGroundZ
DEBUG_MESSAGE("Fail safe hit")
ADD_EXPLOSION(vTemp, EXP_TAG_TRAIN, 1.0)
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN FALSE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_CAMERA_TOO_CLOSE_TO_GROUND(PLANE_CARGO_ARGS &cargoArgs)
VECTOR vCamPosition
FLOAT fCameraGroundZ
IF DOES_CAM_EXIST(cargoArgs.CamTransition01) AND IS_CAM_ACTIVE(cargoArgs.CamTransition01)
vCamPosition = GET_CAM_COORD(cargoArgs.CamTransition01)
// PRINTLN("vCamPosition = ", vCamPosition)
IF GET_GROUND_Z_FOR_3D_COORD(vCamPosition, fCameraGroundZ)
// PRINTLN("fCameraGroundZ = ", fCameraGroundZ)
IF ABSF(vCamPosition.z - fCameraGroundZ) < 5.0
PRINTLN("WE'RE TOO CLOSE TO THE GROUND, CUT OUT NOW. vCamPosition = ", GET_STRING_FROM_VECTOR(vCamPosition), " and fCameraGroundZ = ", fCameraGroundZ)
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC CHECK_FOR_UBER_COLLISIONS(PLANE_CARGO_ARGS &cargoArgs, INT iNum, BLIP_INDEX& myLocationBlip[])
BOOL bAllDropped = TRUE
BOOL bAllInvalid = TRUE
INT idx, iTarget
FLOAT fCheckingDistance
REPEAT MAX_NUMBER_CLUSTER idx
IF DOES_ENTITY_EXIST(cargoArgs.oClusterDrop[iNum][idx])
bAllInvalid = FALSE
// DEBUG_MESSAGE("bAllInvalid = FALSE")
IF NOT IS_ENTITY_ATTACHED_TO_ANY_VEHICLE(cargoArgs.oClusterDrop[iNum][idx])
// PRINTLN("Valid bomb that is detached and we are waiting for it to hit something")
SIMULATE_NOSE_TIP_DOWN_UBER(cargoArgs.oClusterDrop[iNum][idx])
ENDIF
IF (HAS_ENTITY_COLLIDED_WITH_ANYTHING(cargoArgs.oClusterDrop[iNum][idx]))
// SCRIPT_ASSERT("Prop hit something")
PRINTLN("Prop hit something")
ENDIF
IF GET_ENTITY_SPEED(cargoArgs.oClusterDrop[iNum][idx]) = 0
// PRINTLN("Prop speed is 0")
ENDIF
IF TIMERB() > FAIL_SAFE_TIME
PRINTLN("TIMERB() > FAIL_SAFE_TIME")
ENDIF
IF RUN_HAS_HIT_LOGIC(cargoArgs, iNum, idx)
// bOneHit = TRUE
IF NOT bUberSucess
REPEAT 4 iTarget
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinalExtra[iTarget])
FLOAT fTempDist
fTempDist = GET_DISTANCE_BETWEEN_ENTITIES(cargoArgs.vehFinalExtra[iTarget], cargoArgs.oClusterDrop[iNum][idx])
IF fTempDist < EXPLODE_RADIUS_CARPET
EXPLODE_VEHICLE(cargoArgs.vehFinalExtra[iTarget])
ENDIF
ENDIF
ENDREPEAT
//check for drop sucess
REPEAT MAX_NUMBER_FINAL_TARGETS iTarget
//checks car for now
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[iTarget])
fCheckingDistance = GET_DISTANCE_BETWEEN_ENTITIES(cargoArgs.vehFinal[iTarget], cargoArgs.oClusterDrop[iNum][idx])
PRINTLN("fCheckingDistance = ", fCheckingDistance)
IF fCheckingDistance < EXPLODE_RADIUS_CARPET
bHitATarget = TRUE
PRINTLN("SETTING: bHitATarget = TRUE")
EXPLODE_VEHICLE(cargoArgs.vehFinal[iTarget])
myLocationBlip[0] = myLocationBlip[0]
ENDIF
ENDIF
IF IS_ENTITY_DEAD(cargoArgs.vehFinal[iTarget]) AND DOES_BLIP_EXIST(cargoArgs.blipFinal[iTarget])
SCRIPT_REMOVE_BLIP_SAFE(cargoArgs.blipFinal[iTarget])
PRINTLN("REMOVING BLIP IN UPDATE_CLUSTER_BOMB: ", iTarget)
ENDIF
ENDREPEAT
ENDIF
// IF idx%2 = 0
// ADD_EXPLOSION(GET_ENTITY_COORDS(cargoArgs.oClusterDrop[iNum][idx]), EXP_TAG_TRAIN, 1.0)
// PRINTLN("DOING AN EXPLOSION")
// ELSE
START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_drug_grd_train_exp", GET_ENTITY_COORDS(cargoArgs.oClusterDrop[iNum][idx]), <<0,0,0>>, 3.0)
PRINTLN("DOING PARTICLE EFFECT")
// ENDIF
IF NOT bTriggerUberMusic
TRIGGER_MUSIC_EVENT("OJDA5_FIRST_BOMBS")
PRINTLN("TRIGGERING MUSIC - OJDA5_FIRST_BOMBS")
bTriggerUberMusic = TRUE
ENDIF
//ADD_EXPLOSION(GET_ENTITY_COORDS(cargoArgs.oClusterDrop[iNum][idx]), EXP_TAG_GAS_CANISTER, 0.5)
DELETE_OBJECT(cargoArgs.oClusterDrop[iNum][idx])
ELSE
bAllDropped = FALSE
// DEBUG_MESSAGE("bAllDropped = FALSE")
ENDIF
ENDIF
ENDREPEAT
IF bAllDropped OR bAllInvalid OR IS_CAMERA_TOO_CLOSE_TO_GROUND(cargoArgs)
DEBUG_MESSAGE("bAllDropped OR bAllInvalid")
SETTIMERB(0)
SCRIPT_REMOVE_BLIP_SAFE(cargoArgs.blipCrateDrop[iNum])
ODDJOB_STOP_SOUND(cargoArgs.soundID)
IF bDoUberCam
// SETTIMERB(0)
clusterState = CLUSTER_STATE_LAST_CUT
ELSE
bUberActive = FALSE
clusterState = CLUSTER_STATE_DONE
ENDIF
ENDIF
ENDPROC
PROC CREATE_DUMMY_BOMB(PLANE_CARGO_ARGS &cargoArgs, INT iNum)
IF DOES_ENTITY_EXIST(cargoArgs.oBombDummy)
DELETE_OBJECT(cargoArgs.oBombDummy)
PRINTLN("DELETING DUMMY BOMB")
ENDIF
cargoArgs.oBombDummy = CREATE_OBJECT(mnBombProp01, GET_ENTITY_COORDS(cargoArgs.oClusterDrop[iNum][count-1]))
SET_ENTITY_ROTATION(cargoArgs.oBombDummy, <<0, 0, GET_ENTITY_HEADING(cargoArgs.myPlane)+180>>)
PRINTLN("UBER: The rotation of dummy is ", GET_STRING_FROM_VECTOR(GET_ENTITY_ROTATION(cargoArgs.oBombDummy)))
PRINTLN("CREATING DUMMY BOMB")
SET_ENTITY_VISIBLE(cargoArgs.oBombDummy, FALSE)
SET_ENTITY_COLLISION(cargoArgs.oBombDummy, FALSE)
ENDPROC
PROC HACK_UPDATE_UBER_ANIMS(PLANE_CARGO_ARGS &cargoArgs)
INT idx, idx2
REPEAT cargoArgs.iNumPackagesTotal idx
REPEAT MAX_NUMBER_CLUSTER idx2
IF DOES_ENTITY_EXIST(cargoArgs.oClusterDrop[idx][idx2]) AND NOT IS_ENTITY_ATTACHED(cargoArgs.oClusterDrop[idx][idx2])
IF cargoArgs.iDropTime[idx][idx2] <> 0 AND (GET_GAME_TIMER() - cargoArgs.iDropTime[idx][idx2]) > 125
cargoArgs.iDropTime[idx][idx2] = 0
PLAY_ENTITY_ANIM(cargoArgs.oClusterDrop[idx][idx2], "BOMB_TAIL_OPEN_UP", "oddjobs@arms_traffic@", SLOW_BLEND_IN, FALSE, TRUE)
ENDIF
ENDIF
ENDREPEAT
ENDREPEAT
ENDPROC
FUNC BOOL UPDATE_CLUSTER_BOMB(ARGS& myArgs, PLANE_CARGO_ARGS &cargoArgs, INT iNum, PLANE_DATA& myData, BLIP_INDEX& myLocationBlip[])
//VECTOR velocity
UNUSED_PARAMETER(myData)
//FLOAT fTemp
// VECTOR vTemp
INT idx
// To Fix Bug # 1558096 - DS
IF clusterState > CLUSTER_STATE_INIT AND clusterState < CLUSTER_STATE_DONE
REPEAT MAX_NUMBER_FINAL_TARGETS idx
IF DOES_ENTITY_EXIST(cargoArgs.vehFinal[idx])
IF IS_ENTITY_DEAD(cargoArgs.vehFinal[idx])
SCRIPT_REMOVE_BLIP_SAFE(cargoArgs.blipFinal[idx])
PRINTLN("FAIL SAFE: REMOVING BLIP IN UPDATE_CLUSTER_BOMB: ", idx)
ENDIF
ENDIF
ENDREPEAT
ENDIF
SWITCH clusterState
CASE CLUSTER_STATE_INIT
DEBUG_MESSAGE("CLUSTER_STATE_INIT")
//set to large number
fMinGroundZ = 100000
cargoArgs.bBombCam = FALSE
CLEANUP_CAM(cargoArgs, bClearPrints)
count = 0
bUberSucess = FALSE
// bOneHit = FALSE
DEBUG_MESSAGE("CLUSTER_STATE_INIT")
RESTART_TIMER_NOW(clusterTimer)
IF bDoUberCam
PLANE_AUTOPILOT(cargoArgs.myPlane, MIN_SPEED_AUTO-1, FALSE, 0.5)
DEBUG_MESSAGE("PLANE_AUTOPILOT 2")
SETUP_CARPET_BOMB_CAM(myArgs, cargoArgs)
SET_ENTITY_INVINCIBLE(cargoArgs.myPlane, TRUE)
ENDIF
bHitATarget = FALSE
PRINTLN("SETTING: bHitATarget = FALSE")
minTime = 0.0
maxTime = 0.0
clusterState = CLUSTER_STATE_FIRST
BREAK
CASE CLUSTER_STATE_FIRST
RELEASE_CARGO(cargoArgs.oCargoDrop[cargoArgs.iNumPackageDropped-1], cargoArgs.myPlane, cargoArgs.soundID, TRUE, -7.0)
SET_ENTITY_VISIBLE(cargoArgs.oCargoDrop[cargoArgs.iNumPackageDropped-1], FALSE)
HACK_UPDATE_UBER_ANIMS(cargoArgs)
clusterState = CLUSTER_STATE_DROP
BREAK
CASE CLUSTER_STATE_DROP
DEBUG_MESSAGE("CLUSTER_STATE_DROP")
IF TIMER_DO_WHEN_READY(clusterTimer, GET_RANDOM_FLOAT_IN_RANGE(minTime, maxTime)) and count <> -1
RELEASE_CARGO(cargoArgs.oClusterDrop[iNum][count], cargoARgs.myPlane, cargoArgs.soundID, TRUE, -7)
cargoArgs.iDropTime[iNum][count] = GET_GAME_TIMER()
HACK_UPDATE_UBER_ANIMS(cargoArgs)
SETTIMERA(0)
count++
RESTART_TIMER_NOW(clusterTimer)
minTime = 0.55
maxTime = 0.6
IF count >= MAX_NUMBER_CLUSTER
CREATE_DUMMY_BOMB(cargoArgs, iNum)
//count = -1
SETTIMERB(0)
clusterState = CLUSTER_STATE_CAM
ELSE
clusterState = CLUSTER_STATE_DROPB
ENDIF
ENDIF
BREAK
//DROPB state is here in order to release bombs in a pair with a very slight delay
CASE CLUSTER_STATE_DROPB
CHECK_FOR_UBER_COLLISIONS(cargoArgs, iNum, myLocationBlip)
IF TIMERA() > 400 //150
DEBUG_MESSAGE("RELEASE CARGO OFFSET")
RELEASE_CARGO(cargoArgs.oClusterDrop[iNum][count], cargoARgs.myPlane, cargoArgs.soundID, TRUE, -7)
cargoArgs.iDropTime[iNum][count] = GET_GAME_TIMER()
HACK_UPDATE_UBER_ANIMS(cargoArgs)
SETTIMERA(0)
//SET_ENTITY_LOAD_COLLISION_FLAG(cargoArgs.oClusterDrop[iNum][count], TRUE)
count++
IF count >= MAX_NUMBER_CLUSTER
CREATE_DUMMY_BOMB(cargoArgs, iNum)
SETTIMERB(0)
clusterState = CLUSTER_STATE_CAM
ELSE
clusterState = CLUSTER_STATE_DROP
ENDIF
ENDIF
BREAK
CASE CLUSTER_STATE_CAM
CHECK_FOR_UBER_COLLISIONS(cargoArgs, iNum, myLocationBlip)
HACK_UPDATE_UBER_ANIMS(cargoArgs)
IF TIMERB() > 800 //200
//This is needed for the holding pattern stuff
SETTIMERB(0)
myData.vPlayerStart = GET_ENTITY_COORDS(cargoArgs.myPlane)
myData.fPlayerRot = GET_ENTITY_HEADING(cargoArgs.myPlane)
IF bDoUberCam
vDummyBombPostion = GET_ENTITY_COORDS(cargoArgs.oClusterDrop[iNum][count-1])
PRINTLN("REGULAR BOMB POSITION - FIRST FRAME = ", vDummyBombPostion)
SET_ENTITY_COORDS(cargoArgs.oBombDummy, vDummyBombPostion)
LAST_BOMB_CUT(cargoArgs, cargoArgs.oBombDummy)
ENDIF
// vOrigOrientation = <<80, 0, GET_ENTITY_HEADING(cargoArgs.myPlane)+180>>
clusterState = CLUSTER_STATE_WAIT
ENDIF
BREAK
CASE CLUSTER_STATE_WAIT
DEBUG_MESSAGE("CLUSTER_STATE_WAIT")
HACK_UPDATE_UBER_ANIMS(cargoArgs)
// fCamFov = (fCamFov + 0.4)
// PRINTLN("fCamFov = ", fCamFov)
// IF fCamFov > 35.0
// IF IS_CAM_ACTIVE(cargoArgs.CamTransition)
// SET_CAM_FOV(cargoArgs.CamTransition, fCamFov)
// ENDIF
// ENDIF
IF DOES_ENTITY_EXIST(cargoArgs.oClusterDrop[iNum][count-1])
vDummyBombPostion = GET_ENTITY_COORDS(cargoArgs.oClusterDrop[iNum][count-1])
PRINTLN("REGULAR BOMB POSITION = ", vDummyBombPostion)
ELSE
PRINTLN("cargoArgs.oClusterDrop DOES NOT EXIST")
ENDIF
IF NOT IS_VECTOR_ZERO(vDummyBombPostion)
SET_ENTITY_COORDS(cargoArgs.oBombDummy, vDummyBombPostion)
ELSE
PRINTLN("vDummyBombPostion EQUALS ZERO")
ENDIF
//SIMULATE_NOSE_TIP_DOWN_UBER(cargoArgs.oClusterDrop[iNum][count-1])
//Holding pattern hack... Can't update position once we're in holding pattern
IF TIMERB() < 1500
DEBUG_MESSAGE("Storing off posiitons 2")
myData.vPlayerStart = GET_ENTITY_COORDS(cargoArgs.myPlane)
myData.fPlayerRot = GET_ENTITY_HEADING(cargoArgs.myPlane)
ENDIF
CHECK_FOR_UBER_COLLISIONS(cargoArgs, iNum, myLocationBlip)
BREAK
CASE CLUSTER_STATE_LAST_CUT
// IF TIMERB() > 150
// SETTIMERB(0)
fCamFov = 65.0
IF DOES_ENTITY_EXIST(cargoArgs.oClusterDrop[iNum][count-1])
START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_drug_grd_plane_exp", GET_ENTITY_COORDS(cargoArgs.oClusterDrop[iNum][count-1]), <<0,0,0>>, 3.0)
DELETE_OBJECT(cargoArgs.oClusterDrop[iNum][count-1])
ENDIF
PRINTLN("UPDATE_CLUSTER_BOMB: Cleaning up cluster cam")
CLEANUP_CLUSTER_CAM(cargoArgs, cargoArgs.oCargoDrop[iNum])
clusterState = CLUSTER_STATE_DONE
// ENDIF
BREAK
CASE CLUSTER_STATE_DONE
IF TIMERB() > 1000
DEBUG_MESSAGE("CLUSTER_STATE_DONE")
SET_ENTITY_INVINCIBLE(cargoArgs.myPlane, FALSE)
bDoUberCam = FALSE
bUberActive = FALSE
ENDIF
BREAK
ENDSWITCH
IF bDoUberCam
IF clusterState <> CLUSTER_STATE_DONE
IF clusterState > CLUSTER_STATE_CAM AND clusterState < CLUSTER_STATE_LAST_CUT AND TIMERB() > 2500
DEBUG_MESSAGE("holding pattern cluster")
HOLDING_PATTERN(cargoArgs.myPlane, myData.vPlayerStart, myData.fPlayerRot, 3)
ELSE
//SET_ENTITY_MAX_SPEED(cargoArgs.myPlane, MIN_SPEED_AUTO)
PLANE_AUTOPILOT(cargoArgs.myPlane, MIN_SPEED_AUTO-1, FALSE, 2.0)
// DEBUG_MESSAGE("PLANE_AUTOPILOT 3")
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC HANDLE_DROPS_COMPLETE_MUSIC(ARGS& myArgs, BOOL& bDoBomb)
IF g_savedGlobals.sTraffickingData.iAirRank >= 5
IF bDoBomb
IF myArgs.bDoTrain
TRIGGER_MUSIC_EVENT("OJDA4_RETURN")
PRINTLN("REPEATABLE TRAIN: TRIGGERING MUSIC - OJDA4_RETURN")
PRINTLN("REPEATABLE TRAIN: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
ELSE
TRIGGER_MUSIC_EVENT("OJDA3_LAST_ONE")
PRINTLN("REPEATABLE BOMB: TRIGGERING MUSIC - OJDA3_LAST_ONE")
PRINTLN("REPEATABLE BOMB: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
ENDIF
ELSE
TRIGGER_MUSIC_EVENT("OJDA2_HEAD_BACK")
PRINTLN("REPEATABLE DROP: TRIGGERING MUSIC - OJDA2_HEAD_BACK")
PRINTLN("REPEATABLE DROP: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
ENDIF
ENDIF
SWITCH g_savedGlobals.sTraffickingData.iAirRank
CASE 0
// No music cues
BREAK
//--------------------------------------------------------------------------------------------------------------------------
CASE 1
TRIGGER_MUSIC_EVENT("OJDA2_HEAD_BACK")
PRINTLN("TRIGGERING MUSIC - OJDA2_HEAD_BACK")
PRINTLN("HANDLE_DROPS_COMPLETE_MUSIC: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
BREAK
//--------------------------------------------------------------------------------------------------------------------------
CASE 2
TRIGGER_MUSIC_EVENT("OJDA3_LAST_ONE")
PRINTLN("TRIGGERING MUSIC - OJDA3_LAST_ONE")
PRINTLN("HANDLE_DROPS_COMPLETE_MUSIC: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
BREAK
//--------------------------------------------------------------------------------------------------------------------------
CASE 3
TRIGGER_MUSIC_EVENT("OJDA4_RETURN")
PRINTLN("TRIGGERING MUSIC - OJDA4_RETURN")
PRINTLN("HANDLE_DROPS_COMPLETE_MUSIC: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
BREAK
//--------------------------------------------------------------------------------------------------------------------------
CASE 4
TRIGGER_MUSIC_EVENT("OJDA5_BASE_DESTROYED")
PRINTLN("TRIGGERING MUSIC - OJDA5_BASE_DESTROYED")
PRINTLN("HANDLE_DROPS_COMPLETE_MUSIC: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
BREAK
ENDSWITCH
ENDPROC
FUNC BOOL UPDATE_CARGO_DROP(ARGS& myArgs, PLANE_CARGO_ARGS &cargoArgs, PLANE_DATA& myData, DROP_STATE_CHECKS &dropStates, TEXT_LABEL_31& sLastObjective,
VECTOR &vCurDestObjective[], BLIP_INDEX &myLocationBlip[], AIR_VARIATION myVariation, BOOL& bTimeExpired, BOOL& bIsHighAlt, BOOL& bDoBomb,
SCRIPT_SCALEFORM_UI& helpScaleform, PLANE_STATE planeSate)
SWITCH cargoArgs.cargoState
CASE DROP_STATE_HELP
IF NOT IS_MESSAGE_BEING_DISPLAYED()
IF myVariation = AIR_VARIATION_LOW_ALT
PRINT_HELP_WITH_NUMBER("DTRFAIR_HELP_01", CEIL(myData.fmaxHeight))
ELIF NOT IS_STRING_NULL(sTaxiHelp) AND NOT myArgs.bDoUberBombs
PRINT_HELP(sTaxiHelp)
ENDIF
IF myArgs.bDoUberBombs
SETTIMERB(0)
cargoArgs.cargoState = DROP_STATE_CONVERSATION
ELSE
cargoArgs.cargoState = DROP_STATE_CHECK_DROPS
ENDIF
ENDIF
BREAK
CASE DROP_STATE_CONVERSATION
IF g_savedGlobals.sTraffickingData.iAirRank >= 5
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED() OR TIMERB() > 3000
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_A_CARPA", CONV_PRIORITY_VERY_HIGH)
cargoArgs.cargoState = DROP_STATE_CHECK_DROPS
ENDIF
ELSE
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED() OR TIMERB() > 3000
// CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_A_CARP", CONV_PRIORITY_VERY_HIGH)
cargoArgs.cargoState = DROP_STATE_CHECK_DROPS
ENDIF
ENDIF
BREAK
CASE DROP_STATE_CHECK_DROPS
//don't let the player drop cargo until he's told how
IF cargoArgs.bInstructionsPrinted = TRUE
UNUSED_PARAMETER(helpScaleform)
//DRAW_MINIGAME_INSTRUCTIONS(helpScaleform)
//SET_CINEMATIC_BUTTON_ACTIVE(FALSE)
CHECK_FOR_BUTTON_PRESS(myArgs, cargoArgs, myVariation)
ENDIF
IF CARGO_DROPS_COMPLETE(myArgs, cargoArgs, myData, dropStates, cargoArgs.tHelpPrintTimer, sLastObjective,
vCurDestObjective, myLocationBlip, myVariation, bTimeExpired, bIsHighAlt, bDoBomb, planeSate)
HANDLE_DROPS_COMPLETE_MUSIC(myArgs, bDoBomb)
cargoArgs.cargoState = DROP_STATE_FINAL
ENDIF
IF myArgs.bDoUberBombs AND bUberActive
UPDATE_CLUSTER_BOMB(myArgs, cargoArgs, cargoArgs.iNumPackageDropped-1, myData, myLocationBlip)
ENDIF
//if we're in lock on or we're in mobile bomb.
IF NOT myARgs.bDoMobile AND NOT (myVariation = AIR_VARIATION_BOMB AND NOT myArgs.bDoStationary) AND NOT myArgs.bDoTrain //AND NOT myArgs.bDoUberBombs
// Run updates on the guys at the dropoff locations
//DEBUG_MESSAGE("Running UPDATE_DROPOFF_STAGING")
UPDATE_DROPOFF_STAGING(myArgs, cargoArgs, myData, myLocationBlip, vCurDestObjective, myVariation, bDoBomb)
ENDIF
//cluster bombs have their own drop logic and camera stuff..
IF NOT myArgs.bDoUberBombs
//TODO re-use variables
IF cargoArgs.iCutGameTimeStart <> 0
IF (GET_GAME_TIMER() - cargoArgs.iCutGameTimeStart) > HOLDING_TIME and NOT bDisableHolding
//DEBUG_MESSAGE("Other Holding")
HOLDING_PATTERN(cargoArgs.myPlane, myData.vPlayerStart, myData.fPlayerRot, 3)
ELSE
//this is the actual auto pilot for the bomb drop
//SET_ENTITY_MAX_SPEED(cargoArgs.myPlane,15.0)
PLANE_AUTOPILOT(cargoArgs.myPlane, 9, FALSE, AUTO_Y_ROT)
DEBUG_MESSAGE("PLANE_AUTOPILOT 4")
//save off the positions
//SET_VEHICLE_FORWARD_SPEED(cargoArgs.myPlane, 40.0)
IF NOT IS_ENTITY_DEAD(cargoArgs.myPlane) //AND NOT IS_ENTITY_DEAD()
DEBUG_MESSAGE("Storing off posiitons 1")
myData.vPlayerStart = GET_ENTITY_COORDS(cargoArgs.myPlane)
myData.fPlayerRot = GET_ENTITY_HEADING(cargoArgs.myPlane)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE DROP_STATE_FINAL
SET_CINEMATIC_BUTTON_ACTIVE(TRUE)
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC HANDLE_MUSIC_START(BOOL& bDoBomb, ARGS& myArgs)
IF g_savedGlobals.sTraffickingData.iAirRank >= 5
IF bDoBomb
IF myArgs.bDoTrain
TRIGGER_MUSIC_EVENT("OJDA4_START")
PRINTLN("REPEATABLE TRAIN: TRIGGERING MUSIC - OJDA4_START")
PRINTLN("REPEATABLE TRAIN: HANDLE_MUSIC_START: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
ELSE
TRIGGER_MUSIC_EVENT("OJDA3_START")
PRINTLN("REPEATABLE BOMB: TRIGGERING MUSIC - OJDA3_START")
PRINTLN("REPEATABLE BOMB: HANDLE_MUSIC_START: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
ENDIF
ELSE
TRIGGER_MUSIC_EVENT("OJDA2_START")
PRINTLN("REPEATABLE DROP: TRIGGERING MUSIC - OJDA2_START")
PRINTLN("REPEATABLE DROP: HANDLE_MUSIC_START: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
ENDIF
ENDIF
SWITCH g_savedGlobals.sTraffickingData.iAirRank
CASE 0
TRIGGER_MUSIC_EVENT("OJDA1_START")
PRINTLN("TRIGGERING MUSIC - OJDA1_START")
PRINTLN("HANDLE_MUSIC_START: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
BREAK
//-----------------------------------------------------------------------------------------------------------------------------
CASE 1
TRIGGER_MUSIC_EVENT("OJDA2_START")
PRINTLN("TRIGGERING MUSIC - OJDA2_START")
PRINTLN("HANDLE_MUSIC_START: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
BREAK
//-----------------------------------------------------------------------------------------------------------------------------
CASE 2
TRIGGER_MUSIC_EVENT("OJDA3_START")
PRINTLN("TRIGGERING MUSIC - OJDA3_START")
PRINTLN("HANDLE_MUSIC_START: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
BREAK
//-----------------------------------------------------------------------------------------------------------------------------
CASE 3
TRIGGER_MUSIC_EVENT("OJDA4_START")
PRINTLN("TRIGGERING MUSIC - OJDA4_START")
PRINTLN("HANDLE_MUSIC_START: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
BREAK
//-----------------------------------------------------------------------------------------------------------------------------
CASE 4
TRIGGER_MUSIC_EVENT("OJDA5_START")
PRINTLN("TRIGGERING MUSIC - OJDA5_START")
PRINTLN("HANDLE_MUSIC_START: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
BREAK
ENDSWITCH
ENDPROC
PROC HANDLE_AIRBORNE_MUSIC(PLANE_DATA& myData, ARGS& myArgs, BOOL& bDoBomb)
IF NOT bTriggerInAirMusic
IF NOT IS_ENTITY_DEAD(myData.myPlane)
IF IS_ENTITY_IN_AIR(myData.myPlane)
IF g_savedGlobals.sTraffickingData.iAirRank >= 5
IF bDoBomb
IF myArgs.bDoTrain
TRIGGER_MUSIC_EVENT("OJDA4_AIRBORNE")
PRINTLN("REPEATABLE TRAIN: HANDLE_AIRBORNE_MUSIC - OJDA4_AIRBORNE")
PRINTLN("REPEATABLE TRAIN: HANDLE_AIRBORNE_MUSIC: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
bTriggerInAirMusic = TRUE
ELSE
TRIGGER_MUSIC_EVENT("OJDA3_AIRBORNE")
PRINTLN("REPEATABLE BOMB: HANDLE_AIRBORNE_MUSIC - OJDA3_AIRBORNE")
PRINTLN("REPEATABLE BOMB: HANDLE_AIRBORNE_MUSIC: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
bTriggerInAirMusic = TRUE
ENDIF
ELSE
TRIGGER_MUSIC_EVENT("OJDA2_AIRBORNE")
PRINTLN("REPEATABLE DROP: HANDLE_AIRBORNE_MUSIC - OJDA2_AIRBORNE")
PRINTLN("REPEATABLE DROP: HANDLE_AIRBORNE_MUSIC: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
bTriggerInAirMusic = TRUE
ENDIF
ENDIF
SWITCH g_savedGlobals.sTraffickingData.iAirRank
CASE 0
TRIGGER_MUSIC_EVENT("OJDA1_AIRBORNE")
PRINTLN("TRIGGERING MUSIC - OJDA1_AIRBORNE")
PRINTLN("HANDLE_AIRBORNE_MUSIC: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
bTriggerInAirMusic = TRUE
BREAK
//----------------------------------------------------------------------------------------------------------------------------
CASE 1
TRIGGER_MUSIC_EVENT("OJDA2_AIRBORNE")
PRINTLN("TRIGGERING MUSIC - OJDA2_AIRBORNE")
PRINTLN("HANDLE_AIRBORNE_MUSIC: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
bTriggerInAirMusic = TRUE
BREAK
//----------------------------------------------------------------------------------------------------------------------------
CASE 2
TRIGGER_MUSIC_EVENT("OJDA3_AIRBORNE")
PRINTLN("TRIGGERING MUSIC - OJDA3_AIRBORNE")
PRINTLN("HANDLE_AIRBORNE_MUSIC: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
bTriggerInAirMusic = TRUE
BREAK
//----------------------------------------------------------------------------------------------------------------------------
CASE 3
TRIGGER_MUSIC_EVENT("OJDA4_AIRBORNE")
PRINTLN("TRIGGERING MUSIC - OJDA4_AIRBORNE")
PRINTLN("HANDLE_AIRBORNE_MUSIC: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
bTriggerInAirMusic = TRUE
BREAK
//----------------------------------------------------------------------------------------------------------------------------
CASE 4
TRIGGER_MUSIC_EVENT("OJDA5_AIRBORNE")
PRINTLN("TRIGGERING MUSIC - OJDA5_AIRBORNE")
PRINTLN("HANDLE_AIRBORNE_MUSIC: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
bTriggerInAirMusic = TRUE
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDPROC
PROC REMOVE_INTRO_CAMERA(PLANE_CARGO_ARGS &cargoArgs)
IF NOT bIntroFlash
IF DOES_CAM_EXIST(camIntro)
IF NOT IS_ENTITY_DEAD(cargoArgs.myPlane)
IF VDIST(<<2131.70752, 4790.60596, 39.97022>>, GET_ENTITY_COORDS(cargoArgs.myPlane)) > 20
SETTIMERA(0)
IF IS_PLAYER_IN_FIRST_PERSON_CAMERA()
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
PRINTLN("bIntroFlash = TRUE")
bIntroFlash = TRUE
ELSE
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DESTROY_CAM(camIntro)
PRINTLN("NORMAL: DESTROYING - camIntro")
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF bIntroFlash
IF TIMERA() > 300
IF DOES_CAM_EXIST(camIntro)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DESTROY_CAM(camIntro)
PRINTLN("FIRST PERSON: DESTROYING - camIntro")
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL FINISH_INTRO_CAMERA_CUT(PLANE_CARGO_ARGS &cargoArgs, PLANE_DATA& myData)
SWITCH iIntroCutStages
CASE 0
IF NOT DOES_CAM_EXIST(camIntro)
IF bReplaying
END_REPLAY_SETUP()
ENDIF
IF NOT IS_ENTITY_DEAD(cargoArgs.myPlane)
SET_VEHICLE_FIXED(cargoArgs.myPlane)
ENDIF
DO_SCREEN_FADE_IN(500)
camIntro = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<2128.3669, 4834.3740, 43.0187>>, <<0.4794, 0.0000, -174.1694>>, 36.5100, TRUE)
POINT_CAM_AT_ENTITY(camIntro, myData.myPlane, <<0,0,0>>)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
SET_CAM_CONTROLS_MINI_MAP_HEADING(camIntro, TRUE)
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(<<2137.120361,4799.970215,39.678535>>, <<2116.639893,4790.416992,45.452946>>, 25.0, <<2140.62866, 4816.91357, 40.22365>>, 193.1398)
CLEAR_AREA_OF_VEHICLES(<< 2035.9138, 4765.7661, 40.0606 >>, 200, TRUE, FALSE)
PRINTLN("iIntroCutStages = 1")
iIntroCutStages = 1
ENDIF
BREAK
CASE 1
REMOVE_INTRO_CAMERA(cargoArgs)
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC HANDLE_LAST_CONVO()
SWITCH g_savedGlobals.sTraffickingData.iAirRank
CASE 0
IF IS_TIMER_STARTED(tLastConvoTimer)
IF GET_TIMER_IN_SECONDS(tLastConvoTimer) > 5.0
IF NOT bRanLastConvo
IF CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_CHAT1", CONV_PRIORITY_VERY_HIGH)
PRINTLN("RANK: ", g_savedGlobals.sTraffickingData.iAirRank)
PRINTLN("bRanLastConvo = TRUE")
bRanLastConvo = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF IS_TIMER_STARTED(tLastConvoTimer)
IF GET_TIMER_IN_SECONDS(tLastConvoTimer) > 15.0
IF NOT bRanLastConvo
IF CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_CHAT2", CONV_PRIORITY_VERY_HIGH)
PRINTLN("RANK: ", g_savedGlobals.sTraffickingData.iAirRank)
PRINTLN("bRanLastConvo = TRUE")
bRanLastConvo = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF IS_TIMER_STARTED(tLastConvoTimer)
IF GET_TIMER_IN_SECONDS(tLastConvoTimer) > 3.0
IF NOT bRanLastConvo
IF CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_CHAT3", CONV_PRIORITY_VERY_HIGH)
PRINTLN("RANK: ", g_savedGlobals.sTraffickingData.iAirRank)
PRINTLN("bRanLastConvo = TRUE")
bRanLastConvo = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 3
IF IS_TIMER_STARTED(tLastConvoTimer)
IF GET_TIMER_IN_SECONDS(tLastConvoTimer) > 15.0
IF NOT bRanLastConvo
IF CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_CHAT4", CONV_PRIORITY_VERY_HIGH)
PRINTLN("RANK: ", g_savedGlobals.sTraffickingData.iAirRank)
PRINTLN("bRanLastConvo = TRUE")
bRanLastConvo = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 4
IF IS_TIMER_STARTED(tLastConvoTimer)
IF GET_TIMER_IN_SECONDS(tLastConvoTimer) > 3.0
IF NOT bRanLastConvo
IF CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_CHAT5", CONV_PRIORITY_VERY_HIGH)
PRINTLN("RANK: ", g_savedGlobals.sTraffickingData.iAirRank)
PRINTLN("bRanLastConvo = TRUE")
bRanLastConvo = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC HANDLE_REPEATABLE_INTRO_DIALOGUE(ARGS& myArgs)
INT iRandConvo
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 3, NULL, "OSCAR")
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 2, PLAYER_PED_ID(), "TREVOR")
IF myArgs.bDoBomb
IF bUsingMexicans
PRINTLN("REPEATABLE MEXICANS")
iRandConvo = GET_RANDOM_INT_IN_RANGE() % 3
IF iRandConvo = 0
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIRB", CONV_PRIORITY_VERY_HIGH)
PRINTLN("REPEATABLE BOMB: iRandConvo = ", iRandConvo)
ELIF iRandConvo = 1
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIRB2", CONV_PRIORITY_VERY_HIGH)
PRINTLN("REPEATABLE BOMB: iRandConvo = ", iRandConvo)
ELIF iRandConvo = 2
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIRB3", CONV_PRIORITY_VERY_HIGH)
PRINTLN("REPEATABLE BOMB: iRandConvo = ", iRandConvo)
ENDIF
ELIF bUsingMarabunta
PRINTLN("REPEATABLE MARABUNTA")
iRandConvo = GET_RANDOM_INT_IN_RANGE() % 3
IF iRandConvo = 0
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_ELSAL1", CONV_PRIORITY_VERY_HIGH)
PRINTLN("REPEATABLE BOMB: iRandConvo = ", iRandConvo)
ELIF iRandConvo = 1
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_ELSAL2", CONV_PRIORITY_VERY_HIGH)
PRINTLN("REPEATABLE BOMB: iRandConvo = ", iRandConvo)
ELIF iRandConvo = 2
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_ELSAL3", CONV_PRIORITY_VERY_HIGH)
PRINTLN("REPEATABLE BOMB: iRandConvo = ", iRandConvo)
ENDIF
ELIF bUsingHillbillies
PRINTLN("REPEATABLE HILLBILLIES")
iRandConvo = GET_RANDOM_INT_IN_RANGE() % 3
IF iRandConvo = 0
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_HILLB1", CONV_PRIORITY_VERY_HIGH)
PRINTLN("REPEATABLE BOMB: iRandConvo = ", iRandConvo)
ELIF iRandConvo = 1
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_HILLB2", CONV_PRIORITY_VERY_HIGH)
PRINTLN("REPEATABLE BOMB: iRandConvo = ", iRandConvo)
ELIF iRandConvo = 2
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_HILLB3", CONV_PRIORITY_VERY_HIGH)
PRINTLN("REPEATABLE BOMB: iRandConvo = ", iRandConvo)
ENDIF
ENDIF
ELIF myArgs.bDoTrain
IF bUsingMexicans
PRINTLN("REPEATABLE MEXICANS")
iRandConvo = GET_RANDOM_INT_IN_RANGE() % 3
IF iRandConvo = 0
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIRT", CONV_PRIORITY_VERY_HIGH)
PRINTLN("REPEATABLE TRAIN: iRandConvo = ", iRandConvo)
ELIF iRandConvo = 1
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIRT2", CONV_PRIORITY_VERY_HIGH)
PRINTLN("REPEATABLE TRAIN: iRandConvo = ", iRandConvo)
ELIF iRandConvo = 2
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_AIRT3", CONV_PRIORITY_VERY_HIGH)
PRINTLN("REPEATABLE TRAIN: iRandConvo = ", iRandConvo)
ENDIF
ELIF bUsingMarabunta
PRINTLN("REPEATABLE MARABUNTA")
iRandConvo = GET_RANDOM_INT_IN_RANGE() % 3
IF iRandConvo = 0
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_ELSALT1", CONV_PRIORITY_VERY_HIGH)
PRINTLN("REPEATABLE TRAIN: iRandConvo = ", iRandConvo)
ELIF iRandConvo = 1
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_ELSALT2", CONV_PRIORITY_VERY_HIGH)
PRINTLN("REPEATABLE TRAIN: iRandConvo = ", iRandConvo)
ELIF iRandConvo = 2
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_ELSALT3", CONV_PRIORITY_VERY_HIGH)
PRINTLN("REPEATABLE TRAIN: iRandConvo = ", iRandConvo)
ENDIF
ELIF bUsingHillbillies
PRINTLN("REPEATABLE HILLBILLIES")
iRandConvo = GET_RANDOM_INT_IN_RANGE() % 3
IF iRandConvo = 0
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_HILLBT1", CONV_PRIORITY_VERY_HIGH)
PRINTLN("REPEATABLE TRAIN: iRandConvo = ", iRandConvo)
ELIF iRandConvo = 1
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_HILLBT2", CONV_PRIORITY_VERY_HIGH)
PRINTLN("REPEATABLE TRAIN: iRandConvo = ", iRandConvo)
ELIF iRandConvo = 2
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_HILLBT3", CONV_PRIORITY_VERY_HIGH)
PRINTLN("REPEATABLE TRAIN: iRandConvo = ", iRandConvo)
ENDIF
ENDIF
ELSE
IF NOT IS_STRING_EMPTY(myArgs.sConversation)
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 3, NULL, "OSCAR")
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 2, PLAYER_PED_ID(), "TREVOR")
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", myArgs.sConversation, CONV_PRIORITY_VERY_HIGH)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// There are certain updates we need to do for targets, so that they don't do things like fall through the world.
PROC HANDLE_AIR_TARGETS(PLANE_CARGO_ARGS &cargoArgs)
IF cargoArgs.bTraf4_FreezeBoats
INT idx
REPEAT 4 idx
IF NOT cargoArgs.bVehExtraFrozen[idx]
AND DOES_ENTITY_EXIST(cargoArgs.vehFinalExtra[idx]) AND IS_ENTITY_DEAD(cargoArgs.vehFinalExtra[idx])
FREEZE_ENTITY_POSITION(cargoArgs.vehFinalExtra[idx], TRUE)
cargoArgs.bVehExtraFrozen[idx] = TRUE
ENDIF
ENDREPEAT
// This freezes the boat, and not the train.
IF NOT cargoArgs.bVehDropoffFrozen[1]
AND DOES_ENTITY_EXIST(cargoArgs.vehDropoff[1]) AND IS_ENTITY_DEAD(cargoArgs.vehDropoff[1])
FREEZE_ENTITY_POSITION(cargoArgs.vehDropoff[1], TRUE)
cargoArgs.bVehDropoffFrozen[1] = TRUE
ENDIF
ENDIF
ENDPROC
FUNC BOOL UPDATE_PLANE(ARGS& myArgs, PLANE_STATE& myState, BLIP_INDEX& myVehicleBlip, PLANE_DATA& myData, TEXT_LABEL_31& sLastObjective,
VECTOR& vCurDestObjective[], BLIP_INDEX& myLocationBlip[], PLANE_CARGO_ARGS &cargoArgs, DROP_STATE_CHECKS &dropStates,
BOOL& bTimeExpired, BOOL& bIsHighAlt, BOOL& bDoBomb, SCRIPT_SCALEFORM_UI& helpScaleform, CustomCutsceneCaller fpAirTaxiCutscene,
CUTSCENE_ARGS& cutArgs, CAMERA_INDEX& myCamera,
AIR_VARIATION myVariation = AIR_VARIATION_SIMPLE)
BOOL bDropComplete
// FLOAT fPositionInRecording
//INT iTotalCash
// IF NOT IS_ENTITY_DEAD(myVehicle) AND IS_VEHICLE_DRIVEABLE(myVehicle)
// IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(myVehicle)
// fPositionInRecording = GET_POSITION_IN_RECORDING(myVehicle)
// PRINTLN("fPositionInRecording = ", fPositionInRecording)
// IF fPositionInRecording > 75.0
// STOP_PLAYBACK_RECORDED_VEHICLE(myVehicle)
// ENDIF
// ENDIF
// ENDIF
SWITCH myState
CASE PLANE_FADE_INTRO
IF FINISH_INTRO_CAMERA_CUT(cargoArgs, myData)
SETTIMERA(0)
DEBUG_MESSAGE("PLANE_STATE_PRINTS")
myState = PLANE_STATE_PRINTS
ENDIF
fpAirTaxiCutscene = fpAirTaxiCutscene
UNUSED_PARAMETER(cutArgs)
UNUSED_PARAMETER(myCamera)
myState = PLANE_FADE_WAIT
BREAK
CASE PLANE_FADE_WAIT
IF NOT IS_SCREEN_FADED_OUT() AND NOT IS_SCREEN_FADING_OUT()
myState = PLANE_STATE_TAXI
ENDIF
BREAK
//=====================================================================================================================================
CASE PLANE_STATE_TAXI
// IF IS_REPLAY_BEING_SET_UP()
// BREAK
// ENDIF
//
cargoArgs.myPlane = myData.myPlane
DEBUG_MESSAGE("PLANE_STATE_TAXI")
RESTART_TIMER_NOW(cargoArgs.tTotalTime)
#IF IS_DEBUG_BUILD
IF pSkipping
DO_SCREEN_FADE_IN(500)
ENDIF
#ENDIF
//carpet bombs
IF myArgs.bDoTrain
sTaxiHelp = "DTRFAIR_TRAIN"
ELIF myARgs.bDoUberBombs
sTaxiHelp = "DTRFAIR_FINAL"
// If we're doing mobile lock on, print help explaining mode.
ELIF myArgs.bDoMobile
sTaxiHelp = "DTRFAIR_HELPG"
// If we're doing bomb stationary, print help explaining mode.
ELIF myArgs.bDoStationary
sTaxiHelp = "DTRFAIR_HELPH"
// If we're doing bomb that's not stationary, print help explaining mode.
ELIF myArgs.bDoBomb AND NOT myArgs.bDoStationary
sTaxiHelp = "DTRFAIR_HELPI"
// Otherwise, print nothing... levels 1-4.
ELSE
sTaxiHelp = ""
ENDIF
HANDLE_MUSIC_START(bDoBomb, myArgs)
IF g_savedGlobals.sTraffickingData.iAirRank >= 5
KILL_ANY_CONVERSATION()
HANDLE_REPEATABLE_INTRO_DIALOGUE(myArgs)
ELSE
IF NOT IS_STRING_EMPTY(myArgs.sConversation)
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 3, NULL, "OSCAR")
ADD_PED_FOR_DIALOGUE(MyLocalPedStruct, 2, PLAYER_PED_ID(), "TREVOR")
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", myArgs.sConversation, CONV_PRIORITY_VERY_HIGH)
ENDIF
ENDIF
DEBUG_MESSAGE("PLANE_STATE_INTRO")
myState = PLANE_STATE_PRINTS
BREAK
CASE PLANE_STATE_PRINTS
// DEBUG_MESSAGE("INSIDE - PLANE_STATE_PRINTS")
CREATE_FLARES_AT_DROP_SITES(cargoArgs, myData, myArgs)
REMOVE_INTRO_CAMERA(cargoArgs)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
OR TIMERA() > 25000
SWITCH myVariation
CASE AIR_VARIATION_SIMPLE
PRINT("DTRSHRD_PLN_01",DEFAULT_GOD_TEXT_TIME,1)
//REGISTER_PRINT_DELAY()
SCRIPT_REMOVE_BLIP_SAFE(myVehicleBlip)
UNUSED_PARAMETER(sLastObjective)
sLastObjective = "DTRSHRD_PLN_01"
vCurDestObjective[0] = myData.endData.vCenterPos
myLocationBlip[0] = ADD_BLIP_FOR_COORD(myData.endData.vCenterPos)
SET_BLIP_SCALE(myLocationBlip[0], 1.0)
BREAK
CASE AIR_VARIATION_DROP
CASE AIR_VARIATION_LOW_ALT
SCRIPT_REMOVE_BLIP_SAFE(myVehicleBlip)
IF cargoArgs.bDoTimed
PRINT("DTRFAIR_OBJ_T", DEFAULT_GOD_TEXT_TIME, 1)
sLastObjective = "DTRFAIR_OBJ_T"
ELIF myArgs.bDoMobile
PRINT("DTRFAIR_OBJ_M", DEFAULT_GOD_TEXT_TIME, 1)
sLastObjective = "DTRFAIR_OBJ_M"
ELSE
PRINT("DTRFAIR_OBJ", DEFAULT_GOD_TEXT_TIME, 1)
sLastObjective = "DTRFAIR_OBJ"
ENDIF
BREAK
CASE AIR_VARIATION_BOMB
SCRIPT_REMOVE_BLIP_SAFE(myVehicleBlip)
IF myArgs.bDoUberBombs
IF g_savedGlobals.sTraffickingData.iAirRank >= 5
PRINT("DTRFAIR_OBJCF", DEFAULT_GOD_TEXT_TIME, 1)
sLastObjective = "DTRFAIR_OBJCF"
ELSE
PRINT("DTRFAIR_OBJBF", DEFAULT_GOD_TEXT_TIME, 1)
sLastObjective = "DTRFAIR_OBJBF"
ENDIF
ELIF myArgs.bDoTrain
PRINT("DTRFAIR_OBJT", DEFAULT_GOD_TEXT_TIME, 1)
sLastObjective = "DTRFAIR_OBJT"
ELSE
PRINT("DTRFAIR_OBJB", DEFAULT_GOD_TEXT_TIME, 1)
sLastObjective = "DTRFAIR_OBJB"
ENDIF
BREAK
ENDSWITCH
INIT_BLIPPING(myArgs, cargoArgs, myData, myLocationBlip, vCurDestObjective)
UPDATE_UI(cargoArgs, myData, myArgs.bDoBomb)
IF myVariation <> AIR_VARIATION_BOMB AND NOT myArgs.bDoMobile AND NOT bOutOfVehicle AND NOT bInActiveFight AND NOT myArgs.bDoUberBombs
// Change blips from normal to radius
ALTERNATE_BLIP_STYLES(myArgs, myLocationBlip, vCurDestObjective, myData, cargoArgs, vPlayerPos, bDoBomb)
PRINTLN("USING ALTERNATE_BLIP_STYLES")
ELSE
IF NOT myArgs.bDoUberBombs
vReturn = UPDATE_BLIP_PROXIMITY(myLocationBlip, vCurDestObjective, cargoArgs.vehDropoff)
IF NOT ARE_VECTORS_EQUAL(vReturn, <<0,0,0>>)
IF NOT myArgs.bDoStationary
vReturn.z += 3.0
//DRAW_CHECKPOINT(vReturn, 1.5, 0, 255, 0)
ENDIF
ENDIF
ENDIF
ENDIF
myState = PLANE_STATE_DROPOFF
ELSE
// DEBUG_MESSAGE("INSIDE - PLANE_STATE_PRINTS - Still running a convo.")
ENDIF
BREAK
CASE PLANE_STATE_DROPOFF
REMOVE_INTRO_CAMERA(cargoArgs)
// DEBUG_MESSAGE("INSIDE - PLANE_STATE_DROPOFF")
// STRING tempLine
bDropComplete = TRUE
IF bInActiveFight
bDropComplete = FALSE
ENDIF
// Update our targets.
IF myArgs.bDoTrain
HANDLE_AIR_TARGETS(cargoArgs)
ENDIF
// Airborne music cues
HANDLE_AIRBORNE_MUSIC(myData, myArgs, bDoBomb)
SWITCH myVariation
CASE AIR_VARIATION_SIMPLE
IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), myData.endData.vCenterPos, <<15,15,15>>, TRUE) //OR bOutOfVehicle
bDropComplete = FALSE
ENDIF
BREAK
CASE AIR_VARIATION_DROP
CASE AIR_VARIATION_LOW_ALT
CASE AIR_VARIATION_BOMB
IF NOT UPDATE_CARGO_DROP(MyArgs, cargoArgs, myData, dropStates, sLastObjective, vCurDestObjective,
myLocationBlip, myVariation, bTimeExpired, bIsHighAlt, bDoBomb, helpScaleform, myState)
bDropComplete = FALSE
ENDIF
BREAK
ENDSWITCH
IF bDropComplete
IF NOT IS_ENTITY_DEAD(myData.myPlane)
IF bBombBayDoorsOpen
CLOSE_BOMB_BAY_DOORS(myData.myPlane)
bBombBayDoorsOpen = FALSE
PRINTLN("bBombBayDoorsOpen = FALSE - 03")
ODDJOB_PLAY_SOUND("DRUG_TRAFFIC_AIR_BAY_DOOR_OPEN_MASTER", cargoArgs.soundID, FALSE, myData.myPlane)
PRINTLN("CLOSING BOMB BAY DOORS - 03")
ENDIF
ENDIF
IF IS_HELP_MESSAGE_ON_SCREEN()
CLEAR_HELP(TRUE)
PRINTLN("CH - 07")
ENDIF
// ODDJOB_PLAY_SOUND("DRUG_TRAFFIC_AIR_BAY_DOOR_OPEN_MASTER", cargoArgs.soundID)
STOP_ALL_PARTICLES(cargoArgs, myData)
ODDJOB_STOP_SOUND(cargoArgs.soundID)
ODDJOB_STOP_SOUND(soundIdAlarm)
ODDJOB_STOP_SOUND(testSoundID)
CONTROL_COORD_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, <<2134.0632, 4780.6826, 39.9702>>)
IF IS_AUDIO_SCENE_ACTIVE("SIREN_SCENE")
STOP_AUDIO_SCENE("SIREN_SCENE")
PRINTLN("STOPPING AUDIO SCENE - SIREN_SCENE VIA bDropComplete")
ENDIF
//Do we need to land or have we failed?
IF HAS_PLAYER_PASSED(myArgs, cargoArgs)
OR bJSkipped
REGISTER_QUICK_DELAY("DTRFAIR_LAND")
sLastObjective = "DTRFAIR_LAND"
vCurDestObjective[0] = myData.endData.vCenterPos
//Need some dialouge
SET_MINIMAP_COMPONENT(MINIMAP_COMPONENT_RUNWAY_3, TRUE)
SET_FAKE_MINIMAP_MAX_ALTIMETER_HEIGHT(0)
IF NOT IS_TIMER_STARTED(tLastConvoTimer)
START_TIMER_NOW(tLastConvoTimer)
PRINTLN("STARTING TIMER - tLastConvoTimer")
ENDIF
myState = PLANE_STATE_LAND
ELSE
myState = PLANE_STATE_FAILED
ENDIF
ENDIF
BREAK
CASE PLANE_STATE_LAND
// DEBUG_MESSAGE("INSIDE - PLANE_STATE_LAND")
CONTROL_COORD_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, <<2134.0632, 4780.6826, 39.9702>>)
ALTERNATE_LANDING_BLIP(myLocationBlip, cargoArgs.myPlane, vNewEndingBlip, bOutOfVehicle, vPlayerPos, bCloseRange)
HANDLE_LAST_CONVO()
IF myArgs.bDoTutorial
UPDATE_TUTORIAL(cargoArgs, vCurDestObjective, myState)
ELIF bLandingReminder
IF DOES_ENTITY_EXIST(cargoArgs.myPlane) AND NOT IS_ENTITY_DEAD(cargoArgs.myPlane)
IF GET_LANDING_GEAR_STATE(cargoArgs.myPlane) = LGS_LOCKED_UP AND GET_ENTITY_DISTANCE_FROM_LOCATION(PLAYER_PED_ID(), vCurDestObjective[0], FALSE) < CONST_FIRST_PRINT_DIST_TUT
IF NOT IS_MESSAGE_BEING_DISPLAYED()
bLandingReminder = FALSE
PRINT_HELP("DTRFAIR_TUTO4")
ENDIF
ENDIF
ENDIF
ENDIF
//Don't show elimination hud for now
//UPDATE_UI(cargoArgs, myData, cargoArgs.bDetached, FALSE, myArgs.bDoBomb)
IF HAS_PLANE_LANDED(myData.endData.vCenterPos, cargoArgs.myPlane, myData.endData.vCenterPos)
RELEASE_SCRIPT_AUDIO_BANK()
SET_VEHICLE_ENGINE_ON(cargoArgs.myPlane, FALSE, TRUE)
DEBUG_PRINT("TURNING OFF PLANE ENGINE")
SET_HELI_BLADES_SPEED(cargoArgs.myPlane, 0.2)
DEBUG_PRINT("SETTING BLADE SPEED = 0.2")
DEBUG_PRINT("PLANE HAS LANDED")
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
PRINTLN("GOING TO STATE - PLANE_STATE_CUTSCENE")
myState = PLANE_STATE_CUTSCENE
ENDIF
BREAK
// CASE PLANE_STATE_CUTSCENE_PREPARE
//
// PRINTLN("GOING TO STATE - PLANE_STATE_CUTSCENE")
// myState = PLANE_STATE_CUTSCENE
// BREAK
CASE PLANE_STATE_CUTSCENE
// IF CALL fpEndingCutscene()
// IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) AND NOT IS_ENTITY_DEAD(cargoArgs.myPlane)
// TASK_LEAVE_VEHICLE(PLAYER_PED_ID(), cargoArgs.myPlane)
// PRINTLN("TASKING PLAYER TO LEAVE VEHICLE")
// ENDIF
CLEAR_PRINTS()
CLEAR_HELP()
KILL_ANY_CONVERSATION()
bPassed = TRUE
DEBUG_PRINT("CUTSCENE COMPLETE")
SCRIPT_REMOVE_BLIP_SAFE(myLocationBlip[0])
SCRIPT_REMOVE_BLIP_SAFE(myLocationBlip[1])
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
PRINTLN("TURNING BACK ON VISIBILTY ON THE PLAYER")
ENDIF
myState = PLANE_STATE_FINAL //DONE
BREAK
CASE PLANE_STATE_FAILED
// No longer displaying "Mission Failed" screen... just saying why you failed in the retry screen.
// IF DISPLAY_ENDING_UI(cargoArgs, myData, fBonusT, cargoUI, myArgs, FALSE, FALSE)
// myState = PLANE_STATE_FINAL
// ENDIF
BREAK
CASE PLANE_STATE_FINAL
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC