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 + <> 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, <>) 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 + <> 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, <>) 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, <>) // // 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(<> ) 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(<>) 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, <>, <> ) 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