// ***************************************************************************************** // ***************************************************************************************** // // MISSION NAME : Barry1.sc // AUTHOR : Aaron Gandaa / Stefan Arnold // DESCRIPTION : First Barry Mission // // ***************************************************************************************** // ***************************************************************************************** //Compile out Title Update changes to header functions. //Must be before includes. //CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R. //---------------------- // INCLUDES //---------------------- USING "rage_builtins.sch" USING "globals.sch" USING "cutscene_public.sch" USING "commands_cutscene.sch" USING "commands_entity.sch" USING "commands_script.sch" USING "commands_shapetest.sch" USING "script_player.sch" USING "randomChar_public.sch" USING "rgeneral_include.sch" USING "dialogue_public.sch" USING "RC_Helper_Functions.sch" USING "RC_Area_public.sch" USING "CompletionPercentage_public.sch" USING "replay_public.sch" USING "shop_public.sch" USING "initial_scenes_barry.sch" USING "RC_Asset_public.sch" USING "cheat_controller_public.sch" USING "commands_recording.sch" USING "taxi_functions.sch" #IF IS_DEBUG_BUILD USING "select_mission_stage.sch" USING "shared_debug.sch" #ENDIF //---------------------- // ENUMS //---------------------- ENUM ALIEN_STATE AS_NULL, AS_DELAY, // this is the wait between us creating the alien and him starting teleport AS_TELEPORT_FXSTART, AS_TELEPORT, AS_TELEPORT_OUT_START, AS_TELEPORT_OUT, AS_RELOCATE, AS_DYING, AS_DEAD, AS_ACTIVE, // all battle states need to come after here or IS_ALIEN_IN_BATTLE_STATE() will break AS_SUMMON_RUSH, // run towards the player AS_SUMMON_START, AS_SUMMON_FAIL, AS_WATCH_SUMMON, AS_WATCH_SUMMON_END, AS_CHARGE_RUSH, AS_CHARGE_START, AS_CHARGE, AS_BEAM_START, AS_BEAM, AS_BEAM_KNOCKDOWN ENDENUM ENUM STAGE_ENUM SE_LEAD_IN = -1, SE_INTRO = 0, SE_FIRSTCONTACT, SE_WAVE1, SE_WAVE2, SE_PASSOUT, SE_OUTRO, SE_FAILED, SE_ABDUCT ENDENUM ENUM PASS_OUT_STAGE POS_SETUP, POS_WAIT_FOR_TIRED, POS_START_DIALOG, POS_WAIT_DIALOGUE, POS_TRANSITION_FX, POS_WAIT_PASS_OUT ENDENUM //---------------------- // STRUCTURES //---------------------- STRUCT ALIEN_PED BOOL bIsActive = FALSE ALIEN_STATE aState PED_INDEX pedID BLIP_INDEX blipID OBJECT_INDEX projectorID OBJECT_INDEX impactID OBJECT_INDEX screenImpactID INT iTimer INT iNextDamageTime INT iLastImpactFrame FLOAT fDistToPlayer FLOAT fRunRatio FLOAT fBeamLength FLOAT fBeamEvoValue FLOAT fBeamTriggerRange // fAlienBeamStartRange + (rand (-fAlienBeamTriggerVariance, fAlienBeamTriggerVariance) * fAlienBeamStartRange) FLOAT fPedAlpha = 0.0 INT iClickSoundTimer INT mindCtrlSoundID = -1 INT iButtonMashCount = 0 INT iNextSummonEffectTime INT fOldMashSign = 0 PTFX_ID fxSummonID PTFX_ID fxChargeID PTFX_ID fxBeamID PTFX_ID fxImpactID PTFX_ID fxScreenImpactID SHAPETEST_INDEX sBeamLOS VECTOR vLastHitPoint INT iAlienIndex BOOL bHasDamaged = FALSE BOOL bWallSpawn = FALSE ENDSTRUCT //---------------------- // CONSTANTS //---------------------- CONST_INT MISSION_VERSION 015 // this so i can be sure that my changes have been accepted CONST_INT MAX_ALIEN_PEDS 8 // reducing from 10 to reduce difficulty CONST_INT GENDELAY_TIME 500 CONST_INT TELEPORT_TIME 450 CONST_INT ALIEN_FADE_TIME 1000 CONST_INT CHAIN_KILL_AMOUNT 5 // number of aliens to kill to do the chain CONST_INT CHAIN_KILL_TIME 10000 // number of ms to complete the chain CONST_INT MUSICEVENT_RC18A_START_DELAY 58500 // 33500 // 2m 07s in the FOV changes in cutscene CONST_INT MUSICEVENT_RC18A_INCREASE_DELAY 70500 // 45500 // 12 seconds after MUSICEVENT_RC18A_START_DELAY CONST_INT FAIL_WARNING_TIME 10000 // @SBA - Max aliens after initial rush CONST_INT kiMaxStartingAliens 3 // @SBA - number of aliens considered already dead if you start in wave2 (this is currently for debug z-skip) CONST_INT kiDeadAliensStartingWave2 29 // match up with object array in g_structRCScriptArgs (see initial_scenes_barry.sch) CONST_INT OBJ_TABLE 0 CONST_INT OBJ_CHAIR 1 CONST_INT OBJ_PAPERS 2 CONST_INT OBJ_LIGHTER 3 CONST_INT OBJ_JOINT 4 CONST_INT OBJ_SIGN 5 //---------------------- // CHECKPOINTS //---------------------- // @SBA - currently not using this, and it wasn't fully implemented yet //CONST_INT CP_MISSION_START 0 //CONST_INT CP_MID_STAGE 1 //CONST_INT CP_OUTRO 2 CONST_INT Z_SKIP_INTRO 0 CONST_INT Z_SKIP_BATTLE 1 CONST_INT Z_SKIP_BATTLE_2 2 // @SBA - inserting this CONST_INT Z_SKIP_PASSOUT 3 CONST_INT Z_SKIP_OUTRO 4 CONST_INT MAX_SKIP_MENU_LENGTH 5 //---------------------- // RC VARIABLES //---------------------- g_structRCScriptArgs sRCLauncherDataLocal //---------------------- // VARIABLES //---------------------- INT iStateTimeOut INT iFailTimer STRING sFailString = "" STAGE_ENUM stageEnum = SE_LEAD_IN PASS_OUT_STAGE ePassOutStage STAGE_PROGRESS stageProgress OBJECT_INDEX gunObject INT iDbgStageJump // now also used in checkpoint / replay stuff SCENARIO_BLOCKING_INDEX scenarioBlock VECTOR vPlayerCarRespot = <<174.6435, -1012.3608, 28.3152>> FLOAT fPlayerCarRespot = 30.2623 VECTOR vBattleCenter = <<180.5319, -970.6324, 29.0923>> FLOAT fBattleRadius = 100.0 VECTOR vMissionStart = << 188.86, -955.83, 30.09 >> FLOAT fMissionStart = 62.08 FLOAT fPlayerWeaponDamageModifier = 1.0 FLOAT fRegenMultiplier = 1.0 FLOAT fTimeScale = 0.8 BOOL bIsPlayerInBattleArea = TRUE INT iMissionAbandonedTimer = 0 BLIP_INDEX locationBlip BOOL bDebugTTYSpew = FALSE BOOL bUseIsAreaOccupied = FALSE INT iAlphaCounter = 0 INT iSummonEscapeCount = 0 // @SBA - Weapons WEAPON_TYPE wtSniperRifle = WEAPONTYPE_SNIPERRIFLE WEAPON_TYPE wtPistol = WEAPONTYPE_COMBATPISTOL WEAPON_TYPE wtGrenLauncher = WEAPONTYPE_GRENADELAUNCHER //WEAPON_TYPE wtStunGun = WEAPONTYPE_STUNGUN WEAPON_TYPE wtMiniGun = WEAPONTYPE_MINIGUN ANGLED_AREA respotVehicleArea ANGLED_AREA missionBoundary FLOAT fPlayerAlpha = 255.0 WEAPON_TYPE playerWeapon = WEAPONTYPE_MINIGUN//wtSniperRifle ASSET_REQUESTER assetRequester //---------------------- // ANIM / CS VARIABLES //---------------------- STRING sSceneHandleBarry = "Barry" STRING sSceneHandleChair = "Barrys_chair" STRING sSceneHandleTable = "Barrys_protest_table" STRING sSceneHandleWeapon = "Michaels_Weapon" STRING sSceneHandlePapers = "Barry_Pamphlet_1" STRING sSceneHandleLighter = "Lighter_Michael" STRING sSceneHandleJoint = "Cig_Michael" STRING FX_DrugsIn = "DrugsMichaelAliensFightIn" STRING FX_DrugsSkip = "DrugsMichaelAliensFight" STRING FX_DrugsOut = "DrugsMichaelAliensFightOut" STRING sMissionAnimDictionary = "rcmbarry" STRING sLeadInAnimDictionary = "rcmbarryleadinout" STRING sndAlienAmbientScene = "BARRY_01_DRUGS" // mini game anims STRING sAlienGrabIntroAnim = "bar_1_attack_intro_aln" STRING sAlienGrabbedIntroAnim = "bar_1_attack_intro_mic" STRING sAlienGrabAnim = "bar_1_attack_idle_aln" STRING sAlienGrabbedAnim = "bar_1_attack_idle_mic" STRING sAlienGrabFailAnim = "bar_1_attack_michael_wins_aln" STRING sAlienGrabbedFailAnim = "bar_1_attack_michael_wins_mic" STRING sAlienGrabWinAnim = "bar_1_attack_alien_wins_aln" STRING sAlienGrabbedWinAnim = "bar_1_attack_alien_wins_mic" STRING sAlienWatchAnim = "m_cower_01" STRING sAlienTeleportAnim = "bar_1_teleport_aln" STRING sMichaelTeleportAnim = "bar_1_teleport_mic" STRING sExhaustedAnimEnter = "enter" STRING sExhaustedAnim = "idle_d" BOOL bHasMusicStarted = FALSE BOOL bHasMusicIncreased = FALSE BOOL bHasPlayerCameraExitState = FALSE //---------------------- // MODEL VARIABLES //---------------------- MODEL_NAMES alienModel = S_M_M_MOVALIEN_01 MODEL_NAMES beamDummyModel = PROP_LD_TEST_01 MODEL_NAMES mnProtestSign = Prop_Protest_Sign_01 //---------------------- // DIALOG VARIABLES //---------------------- BOOL bHasInitialOutburst INT iFirstDialogTime INT iNextFightDialogTime INT iNextFreakDialogTime INT iNextDamageDialogTime LOCATES_HEADER_DATA sLocateData structPedsForConversation convoMichael STRING sAmbientZone = "AZ_BARRY_01_AMBIENCE" //---------------------- // ALIEN VARIABLES //---------------------- BOOL bAutoCreateAliens = FALSE BOOL bKillAliensOnTeleportOut = TRUE BOOL bSummonRushFlagActive = FALSE BOOL bSummonFlagActive = FALSE BOOL bAllowSummoning = FALSE INT iAlienSummonerIndex = -1 INT iAlienWatchSummonTimeOut = 3500 INT iAlienNextSummonTime INT iAlienNextSummonTimeOut = 15000 INT iAlienButtonMashLimit = 1 INT iAlienSummonTimeLength = 6000 INT iAlienMaxHP = 500 INT iAlienMinClickTime = 1000 INT iAlienMaxClickTime = 2000 FLOAT fAlienSummonRange = 5.0 FLOAT fAlienImpactEffectSize = 0.375 FLOAT fAlienChargeEffectSize = 0.8 FLOAT fAlienTeleportEffectSize = 2.0 FLOAT fAlienDeathEffectSize = 1.0 BOOL bUseAlienSpawnPoint = TRUE VECTOR vAlienSpawnPoint = <<183.58, -967.10, 29.09>> FLOAT fAlienSpawnPointRadius = 38.250 FLOAT fAlienMinSpawnRadius = 30.0 FLOAT fAlienMaxSpawnRadius = 60.0 // auto alien gen CONST_INT kiAlienAutoGenDeltaTime 200 CONST_INT kiAlienMinAutoGenBaseTime 600 CONST_INT kiAlienMaxAutoGenBaseTime 1000 INT iAlienAutoGenTime INT iAlienMinAutoGenTime = kiAlienMinAutoGenBaseTime INT iAlienMaxAutoGenTime = kiAlienMaxAutoGenBaseTime INT iAlienAutoGenDeltaTime = kiAlienAutoGenDeltaTime ALIEN_PED alienPed[MAX_ALIEN_PEDS] //---------------------- // ALIEN BEAM VARIABLES //---------------------- BOOL bAlienBeamKnockDown = FALSE BOOL bBeamArmorHelpDisplayed = FALSE INT iAlienBeamDamage = 1 INT iAlienBeamDamageDelay = 100 INT iAlienBeamChargeTime = 2000 INT iAlienBeamShootTime = 6000 FLOAT fAlienBeamStartRange = 15.0 FLOAT fAlienBeamEffectSize = 0.75 FLOAT fAlienBeamMaximumLength = 100.0 FLOAT fAlienBeamLengthInc = 0.125 // 2.5 FLOAT fAlienMinBeamTriggerVariance = -0.1 FLOAT fAlienMaxBeamTriggerVariance = 0.3 FLOAT fAlienBeamKnockDownForce = 1.75 VECTOR vAlienBeamEmitterOffset = <<0.3, 0.3, 0>> VECTOR vAlienBeamRotationVector = <<270.0, 0.0, 0>> FLOAT fAlienScreenImpactShift = 0.10 //FLOAT fAlienBeamEvoIncrease = 0.0125 //VECTOR vCameraForward //VECTOR vCameraCoords //FLOAT fCameraNearClip //---------------------- // STATS VARIABLES //---------------------- INT iMaxActiveAliens = kiMaxStartingAliens INT iMaxKillChain = 0 INT iKillChain = 0 INT iKillChainEndTime = 0 INT iTotalAlienSummonCount = 0 INT iTotalAlienSpawnCount = 0 INT iTotalAlienDeadCount = 0 INT iTotalAlienDeadRequired = 31 INT iAlienAliveCount = 0 //---------------------- // DEBUG VARIABLES //---------------------- #IF IS_DEBUG_BUILD MissionStageMenuTextStruct sSkipMenu[MAX_SKIP_MENU_LENGTH] WIDGET_GROUP_ID m_WidgetGroup BOOL bUpdateWidgets = TRUE BOOL bShowAlienPos = FALSE #ENDIF //---------------------- // @SBA - ADDITIONAL CONSTANTS/VARIABLES //---------------------- CONST_INT kiSniperAmmo 10 CONST_INT kiPistolAmmo 30 CONST_INT kiGrenLaunchAmmo 10 CONST_INT kiMinigunAmmo INFINITE_AMMO CONST_FLOAT kfMinClickSoundDist 20.0 // Min gap between fight/freak lines CONST_INT kiDialogTimeCheck 2500 // @SBA - new pos to point at the advancing aliens VECTOR vPlayerStartPos = << 188.86, -955.83, 29.09 >> CONST_FLOAT kfPlayerStartHead 327.2303 BOOL bSkipAllowed = FALSE OBJECT_INDEX oiMichaelsWeapon // Aliens left to kill to end 1st wave CONST_INT kiAliensLeftToKill 5 // aliens to add when player gerts minigun INT iAliensToAdd = kiAliensLeftToKill // Position and radius for first contact random starts VECTOR v1stContactStartCtr = <<216.765884,-908.962097,29.692392>> FLOAT f1stContactStartRadius = 7.00 structTIMER tmr1stContactSpawn FLOAT f1stContactSpawnTime // To put some time between the end of one stage and the start of the next structTIMER tmrStageTimer CONST_INT kiAlienWallSpawnArraySize 9 STRUCT ALIEN_WALL_SPAWN_DATA VECTOR vAlienWallSpawnLoc ENDSTRUCT ALIEN_WALL_SPAWN_DATA AlienWallSpawnData[kiAlienWallSpawnArraySize] // Top of structure for possible abduction use later //VECTOR vTopStructure = <<214.2620, -921.4756, 59.6946>> //VECTOR vTopStructureCamPos = <<214.4669, -921.1708, 64.5663>> //VECTOR vTopStructureCamRot = <<-89.4999, 0.0000, 54.8117>> // car stuff VECTOR vPlayerVehicleLoc FLOAT fPlayerVehicleHead BOOL bPlayerVehicleMoved //---------------------- // MISC FUNCTIONS //---------------------- // Populate a single indes in the array PROC POPULATE_ALIEN_WALL_SPAWN_DATUM(ALIEN_WALL_SPAWN_DATA &DataStruct[], INT iArrayIndex, VECTOR vSpawnLoc) DataStruct[iArrayIndex].vAlienWallSpawnLoc = vSpawnLoc //CPRINTLN(DEBUG_MISSION, "POPULATE_ALIEN_WALL_SPAWN_DATUM: Populating specific array datum. Spawn location = ", DataStruct[iArrayIndex].vAlienWallSpawnLoc) ENDPROC // populate the wall spawn data array PROC POPULATE_ALIEN_WALL_SPAWN_DATA() POPULATE_ALIEN_WALL_SPAWN_DATUM(AlienWallSpawnData, 0, (<<175.5842, -964.2895, 35.0957>>)) POPULATE_ALIEN_WALL_SPAWN_DATUM(AlienWallSpawnData, 1, (<<183.1626, -970.6071, 35.0957>>)) POPULATE_ALIEN_WALL_SPAWN_DATUM(AlienWallSpawnData, 2, (<<179.9724, -943.0597, 34.0921>>)) POPULATE_ALIEN_WALL_SPAWN_DATUM(AlienWallSpawnData, 3, (<<185.2821, -935.3659, 34.0922>>)) POPULATE_ALIEN_WALL_SPAWN_DATUM(AlienWallSpawnData, 4, (<<199.9392, -951.7982, 35.0511>>)) POPULATE_ALIEN_WALL_SPAWN_DATUM(AlienWallSpawnData, 5, (<<190.3101, -976.7255, 35.0916>>)) POPULATE_ALIEN_WALL_SPAWN_DATUM(AlienWallSpawnData, 6, (<<205.6451, -974.7205, 35.0476>>)) POPULATE_ALIEN_WALL_SPAWN_DATUM(AlienWallSpawnData, 7, (<<212.8866, -936.2545, 33.7047>>)) POPULATE_ALIEN_WALL_SPAWN_DATUM(AlienWallSpawnData, 8, (<<194.1555, -957.8777, 33.3463>>)) // cube ENDPROC /// PURPOSE: /// @SBA - Resets the array to default values PROC RESET_LOCAL_ALIEN_WALL_SPAWN_DATA(ALIEN_WALL_SPAWN_DATA &DataStruct[]) INT idx REPEAT COUNT_OF(DataStruct) idx POPULATE_ALIEN_WALL_SPAWN_DATUM(DataStruct, idx, (<<0,0,0>>)) ENDREPEAT ENDPROC /// PURPOSE: /// Get a vector from the data for a wall spawn /// PARAMS: /// vOut - returns the vector /// RETURNS: /// Returns TRUE if there's a valid vector to use FUNC BOOL GET_SPECIFIC_WALL_SPAWN_DATA(VECTOR &vOut) INT idx INT iIndex = 0 ALIEN_WALL_SPAWN_DATA localAlienWallSpawnData[kiAlienWallSpawnArraySize] RESET_LOCAL_ALIEN_WALL_SPAWN_DATA(localAlienWallSpawnData) // comb the permanent data REPEAT kiAlienWallSpawnArraySize idx // Make sure there's room in the array IF iIndex < COUNT_OF(localAlienWallSpawnData) // Make sure peds aren't too close to the prospective spawn location // Any more condtions? Do we want a max distance too? IF NOT IS_ANY_PED_NEAR_POINT(AlienWallSpawnData[idx].vAlienWallSpawnLoc, 1.5) POPULATE_ALIEN_WALL_SPAWN_DATUM(localAlienWallSpawnData, iIndex, AlienWallSpawnData[idx].vAlienWallSpawnLoc) iIndex ++ ELSE //CPRINTLN(DEBUG_MISSION, "GET_SPECIFIC_WALL_SPAWN_DATA: *** Spawn point ", AlienWallSpawnData[idx].vAlienWallSpawnLoc, " is too close to an existing ped ***") ENDIF ELSE CPRINTLN(DEBUG_MISSION, "GET_SPECIFIC_WALL_SPAWN_DATA: *** Wha' hoppend? Array Is Full! ***") idx = kiAlienWallSpawnArraySize ENDIF ENDREPEAT IF iIndex = 0 CPRINTLN(DEBUG_MISSION, "GET_SPECIFIC_WALL_SPAWN_DATA: *** No good spawn locations for wall spawn! ***") ELSE // Pick a random index for the specific data array INT iReturnSpecificIndex = GET_RANDOM_INT_IN_RANGE(0, iIndex) vOut = localAlienWallSpawnData[iReturnSpecificIndex].vAlienWallSpawnLoc IF ARE_VECTORS_EQUAL(localAlienWallSpawnData[iReturnSpecificIndex].vAlienWallSpawnLoc, (<<0,0,0>>)) CPRINTLN(DEBUG_MISSION, "GET_SPECIFIC_WALL_SPAWN_DATA: WHOOPS! Random index = ", iReturnSpecificIndex,". Spawn location = ", vOut, ".") ELSE //CPRINTLN(DEBUG_MISSION, "GET_SPECIFIC_WALL_SPAWN_DATA: Returning TRUE. Random index = ", iReturnSpecificIndex,". Spawn location = ", vOut, ".") RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Obtain a valid wall spawn location and heading, if we want one /// PARAMS: /// vOut - returns a wall spawn location /// fSpawnChance - chance of getting a wall spawn (or try to at least) /// RETURNS: /// TRUE if we've chosen a valid location to spawn; FALSE otherwise FUNC BOOL GENERATE_ALIEN_WALL_SPAWN(VECTOR &vOut, FLOAT fSpawnChance = 0.10) IF NOT bIsPlayerInBattleArea RETURN FALSE ENDIF // Do we want a wall spawn this time? FLOAT rnd = GET_RANDOM_FLOAT_IN_RANGE() IF rnd > fSpawnChance RETURN FALSE ENDIF VECTOR vWallLoc IF GET_SPECIFIC_WALL_SPAWN_DATA(vWallLoc) vOut = vWallLoc RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Resolve cars for mission PROC RESOLVE_MISSION_VEHICLES_FOR_CUTSCENE() CPRINTLN(DEBUG_MISSION, "Vehicles Resolved For Intro") IF IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR(), TRUE) CPRINTLN(DEBUG_MISSION, "Setting post-mission respawn location to where vehicle was") IF IS_ENTITY_ALIVE(GET_MISSION_START_VEHICLE_INDEX()) vPlayerVehicleLoc = GET_ENTITY_COORDS(GET_MISSION_START_VEHICLE_INDEX()) fPlayerVehicleHead = GET_ENTITY_HEADING(GET_MISSION_START_VEHICLE_INDEX()) ENDIF ENDIF IF NOT IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR(), TRUE) OR GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(GET_MISSION_START_VEHICLE_INDEX(), vMissionStart) < 10.0 vPlayerVehicleLoc = vPlayerCarRespot fPlayerVehicleHead = fPlayerCarRespot ENDIF CPRINTLN(DEBUG_MISSION, "Vehicles Loc = ", vPlayerVehicleLoc) CPRINTLN(DEBUG_MISSION, "Vehicles Head = ", fPlayerVehicleHead) RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(respotVehicleArea.vPosition[0], respotVehicleArea.vPosition[1], respotVehicleArea.fWidth, vPlayerCarRespot, fPlayerCarRespot, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR()) IF IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR(), TRUE) SET_MISSION_VEHICLE_GEN_VEHICLE(GET_MISSION_START_VEHICLE_INDEX(), vPlayerVehicleLoc, fPlayerVehicleHead) ENDIF CPRINTLN(DEBUG_MISSION, "Vehicles Loc (after gen) = ", vPlayerVehicleLoc) CPRINTLN(DEBUG_MISSION, "Vehicles Head (after gen) = ", fPlayerVehicleHead) ENDPROC PROC MOVE_PLAYERS_VEHICLE() CPRINTLN(DEBUG_MISSION, "MOVE_PLAYERS_VEHICLE") IF bPlayerVehicleMoved CPRINTLN(DEBUG_MISSION, "Vehicle already moved") EXIT ENDIF IF DOES_ENTITY_EXIST(GET_MISSION_START_VEHICLE_INDEX()) AND NOT ARE_VECTORS_EQUAL(vPlayerVehicleLoc, vPlayerCarRespot) CLEAR_AREA(vPlayerVehicleLoc, 3.0, TRUE) IF IS_ENTITY_ALIVE(GET_MISSION_START_VEHICLE_INDEX()) SET_ENTITY_COORDS(GET_MISSION_START_VEHICLE_INDEX(), vPlayerVehicleLoc) SET_ENTITY_HEADING(GET_MISSION_START_VEHICLE_INDEX(), fPlayerVehicleHead) SET_VEHICLE_ON_GROUND_PROPERLY(GET_MISSION_START_VEHICLE_INDEX()) ENDIF IF IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR(), TRUE) SET_MISSION_VEHICLE_GEN_VEHICLE(GET_MISSION_START_VEHICLE_INDEX(), vPlayerVehicleLoc, fPlayerVehicleHead) ENDIF CPRINTLN(DEBUG_MISSION, "Vehicles Loc = ", vPlayerVehicleLoc) CPRINTLN(DEBUG_MISSION, "Vehicles Head = ", fPlayerVehicleHead) ENDIF bPlayerVehicleMoved = TRUE ENDPROC /// PURPOSE: /// Tells us if the mission is in combat state FUNC BOOL IS_MISSION_IN_COMBAT_STAGE() INT i1 = ENUM_TO_INT(SE_INTRO) INT i2 = ENUM_TO_INT(SE_PASSOUT) INT i = ENUM_TO_INT(stageEnum) RETURN (i > i1) AND (i < i2) ENDFUNC /// PURPOSE: /// Resets all the values that we set up - useful for z menu PROC RESET_MISSION_COUNTERS() iAlienNextSummonTime = GET_GAME_TIMER() bSummonRushFlagActive = FALSE bSummonFlagActive = FALSE bAllowSummoning = FALSE iAlienSummonerIndex = -1 iTotalAlienSummonCount = 0 iTotalAlienSpawnCount = 0 iTotalAlienDeadCount = 0 iKillChain = 0 iKillChainEndTime = 0 iMaxActiveAliens = kiMaxStartingAliens ENDPROC /// PURPOSE: /// Resets all the values that we set up - useful for z menu PROC RESET_MISSION_PARAMETERS() // @SBA - ADDED BY REQUEST (just minigun) playerWeapon = WEAPONTYPE_MINIGUN fAlienSummonRange = 7.5 iAlienButtonMashLimit = 10 iAlienSummonTimeLength = 6000 fAlienBeamStartRange = 15.0 iAlienBeamChargeTime = 1500 iAlienBeamShootTime = 4500 fAlienImpactEffectSize = 0.375 fAlienChargeEffectSize = 0.8 fAlienTeleportEffectSize = 2.0 fAlienBeamEffectSize = 0.75 fAlienBeamMaximumLength = 100.0 fAlienBeamLengthInc = 2.0 fAlienMinBeamTriggerVariance = -0.1 fAlienMaxBeamTriggerVariance = 0.3 fAlienMinSpawnRadius = 30.0 fAlienMaxSpawnRadius = 40.0 fAlienBeamKnockDownForce = 1.75 bAlienBeamKnockDown = FALSE iAlienBeamDamage = 1 iAlienBeamDamageDelay = 75 iAlienWatchSummonTimeOut = 3500 iAlienMinAutoGenTime = kiAlienMinAutoGenBaseTime iAlienMaxAutoGenTime = kiAlienMaxAutoGenBaseTime iAlienAutoGenDeltaTime = kiAlienAutoGenDeltaTime fTimeScale = 0.8 bPlayerVehicleMoved = FALSE ENDPROC PROC CLEANUP_SCREEN_FX() IF ANIMPOSTFX_IS_RUNNING(FX_DrugsIn) ANIMPOSTFX_STOP(FX_DrugsIn) ENDIF IF ANIMPOSTFX_IS_RUNNING(FX_DrugsSkip) ANIMPOSTFX_STOP(FX_DrugsSkip) ENDIF IF ANIMPOSTFX_IS_RUNNING(FX_DrugsOut) ANIMPOSTFX_STOP(FX_DrugsOut) ENDIF ENDPROC /// PURPOSE: /// Sets the mission fail reason and goes into the fail state PROC SET_MISSION_FAILED_ABDUCTED() IF (stageEnum <> SE_ABDUCT) AND (stageEnum <> SE_FAILED) stageProgress = SP_LOADING stageEnum = SE_ABDUCT ENDIF ENDPROC /// PURPOSE: /// Sets the mission fail reason and goes into the fail state /// PARAMS: /// sFailReason - text label of fail reason PROC SET_MISSION_FAILED(STRING sFailReason) IF stageEnum <> SE_FAILED CPRINTLN(DEBUG_MISSION, "Setting mission as failed. ", sFailReason) sFailString = sFailReason stageProgress = SP_LOADING stageEnum = SE_FAILED ENDIF ENDPROC /// PURPOSE: /// Handles the death sequence /// PARAMS: /// beamDirection - direction of beam that kills player PROC ABDUCT_SEQUENCE_END() IF GET_GAME_TIMER() > iFailTimer AND iFailTimer <> -1 IF IS_ENTITY_OK(PLAYER_PED_ID()) SET_ENTITY_VISIBLE(PLAYER_PED_ID(), FALSE) ENDIF RC_END_CUTSCENE_MODE(TRUE, FALSE) iFailTimer = -1 ENDIF ENDPROC /// PURPOSE: /// Handles the death sequence /// PARAMS: /// beamDirection - direction of beam that kills player PROC DEATH_SEQUENCE(VECTOR beamOrigin, VECTOR beamImpact, BOOL bKillPlayer = TRUE) //VECTOR v #IF IS_DEBUG_BUILD IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Player got lasered to death") ENDIF #ENDIF SET_PLAYER_HEALTH_RECHARGE_MULTIPLIER(PLAYER_ID(), 0) IF NOT IS_VECTOR_ZERO(beamOrigin) AND NOT IS_VECTOR_ZERO(beamImpact) // SHOOT_SINGLE_BULLET_BETWEEN_COORDS(beamOrigin, beamImpact, 100000, TRUE, WEAPONTYPE_PISTOL, NULL, FALSE) - IS THIS CRASHING IT? ENDIF gunObject = CREATE_FAKE_WEAPON_FOR_PLAYER(playerWeapon) SAFE_RELEASE_OBJECT(gunObject) IF (bKillPlayer = TRUE) APPLY_DAMAGE_TO_PED(PLAYER_PED_ID(), 100000, TRUE) EXPLODE_PED_HEAD(PLAYER_PED_ID()) ENDIF ENDPROC PROC HANDLE_LOCK_PLAYER_IN_FRONT_OF_TABLE() IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) IF IS_PLAYER_CONTROL_ON(PLAYER_ID()) IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), (<<189.13988, -955.80487, 29.09192>>), (<<187.52740, -955.01056,31.091919>>), 2.5000000) CPRINTLN(DEBUG_MISSION, "HANDLE_LOCK_PLAYER_IN_FRONT_OF_TABLE: Locking player") SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON) IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0]) TASK_TURN_PED_TO_FACE_ENTITY(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[0]) ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Given a point does a ground z check, checks it not in a no spawn zone and there are no peds too close /// PARAMS: /// pos - position to check /// bUseSmallerPlayerRange - decrease player range so aliens can spawn closer /// RETURNS: /// True / False FUNC BOOL CHECK_SPAWN_POINT_IS_OK(VECTOR &pos, BOOL bUseSmallerPlayerRange = FALSE) VECTOR spawnPos FLOAT fPlayerRange = 15.0 // do a safety check here IF NOT GET_SAFE_COORD_FOR_PED(pos, FALSE, spawnPos, GSC_FLAG_NOT_ISOLATED | GSC_FLAG_NOT_INTERIOR | GSC_FLAG_NOT_WATER) CPRINTLN(DEBUG_MISSION, "CHECK SPAWN POINT IS OK - FAILED - CAN'T GET A SAFE COORD FOR POS:[", pos.x, ",", pos.y, ",", pos.z, "]") RETURN FALSE ENDIF IF bUseSmallerPlayerRange fPlayerRange = 2.5 ELIF iTotalAlienDeadCount > 27 fPlayerRange = 10.0 ENDIF IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), spawnPos, fPlayerRange) CPRINTLN(DEBUG_MISSION, "CHECK SPAWN POINT IS OK - FAILED - PLAYER WITHIN RANGE OF SPAWN POS:[", spawnPos.x, ",", spawnPos.y, ",", spawnPos.z, "] - RANGE:", fPlayerRange) RETURN FALSE ENDIF // check there isn't a ped in the same area //IF IS_ANY_PED_IN_SPHERE(spawnPos, 2.0, PLAYER_PED_ID()) /// don't need to exclude player as the check above will do that IF (GET_DISTANCE_BETWEEN_COORDS(spawnPos, vBattleCenter) > fBattleRadius) CPRINTLN(DEBUG_MISSION, "CHECK SPAWN POINT IS OK - FAILED - SPAWN POS:[", spawnPos.x, ",", spawnPos.y, ",", spawnPos.z, "] IS TOO FAR AWAY FROM BATTLE CENTER") RETURN FALSE ENDIF IF NOT IS_POINT_IN_ANGLED_AREA(spawnPos, missionBoundary.vPosition[0], missionBoundary.vPosition[1], missionBoundary.fWidth) CPRINTLN(DEBUG_MISSION, "CHECK SPAWN POINT IS OK - FAILED - SPAWN POS:[", spawnPos.x, ",", spawnPos.y, ",", spawnPos.z, "] IS NOT WITHIN MISSION BOUNDARY") RETURN FALSE ENDIF IF (bUseIsAreaOccupied) IF IS_ANY_PED_IN_SPHERE(spawnPos, 2.0) CPRINTLN(DEBUG_MISSION, "CHECK SPAWN POINT IS OK - FAILED - IS_ANY_PED_IN_SPHERE - SPAWN POS:[", spawnPos.x, ",", spawnPos.y, ",", spawnPos.z, "] THERE IS ANOTHER ALIEN WITHIN 2 METERS") RETURN FALSE ENDIF ELSE IF IS_ANY_PED_NEAR_POINT(spawnPos, 2.0) CPRINTLN(DEBUG_MISSION, "CHECK SPAWN POINT IS OK - FAILED - IS_ANY_PED_NEAR_POINT - SPAWN POS:[", spawnPos.x, ",", spawnPos.y, ",", spawnPos.z, "] THERE IS ANOTHER ALIEN WITHIN 2 METERS") RETURN FALSE ENDIF ENDIF pos = spawnPos RETURN TRUE ENDFUNC //---------------------- // @SBA - MISC FUNCTIONS //---------------------- /// PURPOSE: /// Generates a ped spawn point in range of player - also uses CHECK_SPAWN_POINT_IS_OK() /// PARAMS: /// out - new position /// minrange - desired minimum range /// maxrange - desired maximum range /// RETURNS: /// True on success FUNC BOOL GENERATE_ALIEN_SPAWN_POINT(VECTOR &out) IF (bIsPlayerInBattleArea = FALSE) RETURN FALSE ENDIF IF (bUseAlienSpawnPoint) out = GET_RANDOM_POINT_IN_DISC(vAlienSpawnPoint, fAlienSpawnPointRadius, 6.0) ELSE out = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_RANDOM_FLOAT_IN_RANGE(0.0, 360.0), <<0, GET_RANDOM_FLOAT_IN_RANGE(fAlienMinSpawnRadius, fAlienMaxSpawnRadius), 6.0>>) ENDIF RETURN CHECK_SPAWN_POINT_IS_OK(out) ENDFUNC /// PURPOSE: /// @SBA - a verion of GENERATE_ALIEN_SPAWN_POINT that takes a vector and radius /// (Added this to keep the functionality of the two distinct) /// PARAMS: /// vIn - Centerpoint /// fRadius - radius of disc /// out - new position /// RETURNS: /// TRUE if a useable spawn vector is found FUNC BOOL GENERATE_ALIEN_SPAWN_POINT_NEAR_LOCATION(VECTOR vIn, FLOAT fRadius, VECTOR &out) IF (bIsPlayerInBattleArea = FALSE) RETURN FALSE ENDIF CPRINTLN(DEBUG_MISSION, "GENERATE_ALIEN_SPAWN_POINT_NEAR_LOCATION - TRYING GENERATE POINT WITHIN ", fRadius, " METERS OF [", vIn.x, ",", vIn.y, "," ,vIn.z, "]") out = GET_RANDOM_POINT_IN_DISC(vIn, fRadius, 6.0) RETURN CHECK_SPAWN_POINT_IS_OK(out, TRUE) ENDFUNC /// PURPOSE: /// Gets which weapon the player ought to have next /// PARAMS: /// wtPlayerWeapon - the player's current weapon /// RETURNS: /// The next weapon in the list FUNC WEAPON_TYPE GET_PLAYERS_NEXT_WEAPON(WEAPON_TYPE wtPlayerWeapon) WEAPON_TYPE wtNextWeapon IF wtPlayerWeapon = wtSniperRifle wtNextWeapon = wtPistol ELIF wtPlayerWeapon = wtPistol wtNextWeapon = wtGrenLauncher ELIF wtPlayerWeapon = wtGrenLauncher wtNextWeapon = wtMiniGun //@TODO - change this to wtStunGun when I get it working // ELIF wtPlayerWeapon = wtStunGun // wtNextWeapon = wtMiniGun ELSE CPRINTLN(DEBUG_MISSION, "*** GET_PLAYERS_NEXT_WEAPON: How'd we get to DEFAULT case?! ***") wtNextWeapon = wtMiniGun ENDIF CPRINTLN(DEBUG_MISSION, "GET_PLAYERS_NEXT_WEAPON: Next weapon = ", GET_WEAPON_NAME(wtNextWeapon)) RETURN wtNextWeapon ENDFUNC /// PURPOSE: /// Gets the appropriate ammount of ammo depending on the weapon type /// PARAMS: /// wtPlayerWeapon - The weapon type to check /// RETURNS: /// The ammount of ammo that weapon should have FUNC INT GET_ALLOWED_AMMO_FOR_WEAPON(WEAPON_TYPE wtPlayerWeapon) INT iAmmoAllowed IF wtPlayerWeapon = wtSniperRifle iAmmoAllowed = kiSniperAmmo ELIF wtPlayerWeapon = wtPistol iAmmoAllowed = kiPistolAmmo ELIF wtPlayerWeapon = wtGrenLauncher iAmmoAllowed = kiGrenLaunchAmmo // ELIF wtPlayerWeapon = wtStunGun // iAmmoAllowed = INFINITE_AMMO ELIF wtPlayerWeapon = wtMiniGun iAmmoAllowed = kiMinigunAmmo ELSE CPRINTLN(DEBUG_MISSION, "*** GET_ALLOWED_AMMO_FOR_WEAPON: How'd we get to DEFAULT case?! ***") iAmmoAllowed = INFINITE_AMMO ENDIF CPRINTLN(DEBUG_MISSION, "GET_ALLOWED_AMMO_FOR_WEAPON: Returning ammo ammount = ", iAmmoAllowed) RETURN iAmmoAllowed ENDFUNC /// PURPOSE: /// Checks if the player has the wepaon passed in and if it has no ammo in it /// PARAMS: /// wtPlayerWeapon - the weapon to check /// RETURNS: /// TRUE if out of ammo for this weapon; FALSE otherwise FUNC BOOL IS_PLAYER_OUT_OF_AMMO(WEAPON_TYPE wtPlayerWeapon) IF IS_PED_INJURED(PLAYER_PED_ID()) RETURN FALSE ENDIF IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), wtPlayerWeapon) CPRINTLN(DEBUG_MISSION, "IS_PLAYER_OUT_OF_AMMO: *** Player does not have weapon type: ", GET_WEAPON_NAME(wtPlayerWeapon)) RETURN FALSE ENDIF IF GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), wtPlayerWeapon) = 0 CPRINTLN(DEBUG_MISSION, "IS_PLAYER_OUT_OF_AMMO: Yes! Empty!") RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Give the player the next weapon he should have /// PARAMS: /// wtPlayerWeapon - Pass by ref the player's weapon type PROC SWAP_THE_PLAYERS_WEAPON(WEAPON_TYPE &wtPlayerWeapon) IF IS_PED_INJURED(PLAYER_PED_ID()) EXIT ENDIF // Remove existing weapon IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), wtPlayerWeapon) REMOVE_WEAPON_FROM_PED(PLAYER_PED_ID(), wtPlayerWeapon) CPRINTLN(DEBUG_MISSION, "SWAP_THE_PLAYERS_WEAPON: Removing player's weapon: ", GET_WEAPON_NAME(wtPlayerWeapon)) ENDIF // init the next weapon and get its ammo wtPlayerWeapon = GET_PLAYERS_NEXT_WEAPON(wtPlayerWeapon) INT iAmmo = GET_ALLOWED_AMMO_FOR_WEAPON(wtPlayerWeapon) // give it to the player GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), wtPlayerWeapon, iAmmo, TRUE) IF wtPlayerWeapon = wtMiniGun SET_PED_INFINITE_AMMO(PLAYER_PED_ID(), TRUE, wtPlayerWeapon) ELSE // @SBA - make sure he has the right ammount of ammo (this seems really convoluted) SET_AMMO_IN_CLIP(PLAYER_PED_ID(), wtPlayerWeapon, 0) SET_PED_AMMO(PLAYER_PED_ID(), wtPlayerWeapon, 0) ADD_AMMO_TO_PED(PLAYER_PED_ID(), wtPlayerWeapon, iAmmo) ENDIF CPRINTLN(DEBUG_MISSION, "SWAP_THE_PLAYERS_WEAPON: Player given new weapon: ", GET_WEAPON_NAME(wtPlayerWeapon)) CPRINTLN(DEBUG_MISSION, "SWAP_THE_PLAYERS_WEAPON: Ammo in new weapon = ", GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), wtPlayerWeapon)) ENDPROC /// PURPOSE: /// Forces the players weapon PROC FORCE_PLAYER_WEAPON(WEAPON_TYPE wtWeaponToGive) WEAPON_TYPE wpn //playerWeapon = wtWeaponToGive IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), wtWeaponToGive) GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), wtWeaponToGive, 10, TRUE, TRUE) CPRINTLN(DEBUG_MISSION, "Player doesn't have a minigun lets give him one.") ELSE IF NOT GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), wpn) OR (wpn <> wtWeaponToGive) CPRINTLN(DEBUG_MISSION, "Player has a minigun but doesn't want to equip it for some reason.") SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), wtWeaponToGive, TRUE) ELSE CPRINTLN(DEBUG_MISSION, "Player - Should have the minigun and it should be in his hand") ENDIF ENDIF // @SBA - we don't always want the weapon to have inifinite ammo now // @SBA - COMMENTING OUT BY REQUEST // SET_AMMO_IN_CLIP(PLAYER_PED_ID(), wtWeaponToGive, 0) // SET_PED_AMMO(PLAYER_PED_ID(), wtWeaponToGive, 0) ADD_AMMO_TO_PED(PLAYER_PED_ID(), wtWeaponToGive, 10000) // OLD = 10000 // 10 SET_PED_INFINITE_AMMO(PLAYER_PED_ID(), TRUE, wtWeaponToGive) SET_PED_CURRENT_WEAPON_VISIBLE(PLAYER_PED_ID(), TRUE) SET_PED_CAN_SWITCH_WEAPON(PLAYER_PED_ID(), FALSE) REFILL_AMMO_INSTANTLY(PLAYER_PED_ID()) SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE, -1) //FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ACTIONMODE_IDLE, TRUE) ENDIF ENDPROC //---------------------- // DIALOG FUNCTIONS //---------------------- /// PURPOSE: /// Returns True if God Text is on FUNC BOOL ARE_OBJECTIVES_BEING_DISPLAYED() IF IS_THIS_PRINT_BEING_DISPLAYED("PRIME2") // Kill the ~r~clowns.~s~ RETURN TRUE ENDIF IF IS_THIS_PRINT_BEING_DISPLAYED("B1_WARN") // Return to the ~r~battle.~s~ RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Returns True if God Text is on FUNC BOOL ARE_OBJECTIVES_OR_TEXT_BEING_DISPLAYED() IF IS_THIS_PRINT_BEING_DISPLAYED("PRIME2") // Kill the ~r~clowns.~s~ RETURN TRUE ENDIF IF IS_THIS_PRINT_BEING_DISPLAYED("B1_WARN") // Return to the ~r~battle.~s~ RETURN TRUE ENDIF IF IS_ANY_TEXT_BEING_DISPLAYED(sLocateData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Initial sets up Michaels Ranting during the battle PROC SETUP_MICHAEL_DIALOG() ADD_PED_FOR_DIALOGUE(convoMichael, ENUM_TO_INT(CHAR_MICHAEL), PLAYER_PED_ID(), "MICHAEL") iFirstDialogTime = GET_GAME_TIMER() + 1500 iNextFreakDialogTime = iFirstDialogTime + GET_RANDOM_INT_IN_RANGE(20000, 40000) iNextFightDialogTime = iFirstDialogTime + GET_RANDOM_INT_IN_RANGE(12000, 18000) iNextDamageDialogTime = GET_GAME_TIMER() bHasInitialOutburst = FALSE ENDPROC /// PURPOSE: /// Runs the fight rants Michael can shout out during the battle PROC PLAY_MICHAEL_FREAK_DIALOG_LINES() IF IS_SCRIPTED_CONVERSATION_ONGOING() EXIT ENDIF IF (GET_GAME_TIMER() < iNextFreakDialogTime) EXIT ENDIF IF (NOT bHasInitialOutburst) EXIT ENDIF IF ARE_OBJECTIVES_OR_TEXT_BEING_DISPLAYED() EXIT ENDIF #IF IS_DEBUG_BUILD IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Trying to play Michael Freak Rant - Time:", (GET_GAME_TIMER() - iMissionDebugTime) / 1000) ENDIF #ENDIF ADD_PED_FOR_DIALOGUE(convoMichael, ENUM_TO_INT(CHAR_MICHAEL), PLAYER_PED_ID(), "MICHAEL") IF CREATE_CONVERSATION(convoMichael, "BARY1AU", "BARY1_FREAK", CONV_PRIORITY_LOW) #IF IS_DEBUG_BUILD IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Michael Freak Rant - Time:", (GET_GAME_TIMER() - iMissionDebugTime) / 1000) ENDIF #ENDIF iNextFreakDialogTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(20000, 40000) // don't let fight line play too quickly after IF iNextFightDialogTime - GET_GAME_TIMER() < kiDialogTimeCheck CPRINTLN(DEBUG_MISSION, "Fight Rant Time too soon: resetting.") iNextFightDialogTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3000, 5000) ENDIF ENDIF ENDPROC /// PURPOSE: /// Runs the fight rants Michael can shout out during the battle PROC PLAY_MICHAEL_FIGHT_DIALOG_LINES() IF IS_SCRIPTED_CONVERSATION_ONGOING() EXIT ENDIF IF (GET_GAME_TIMER() < iNextFightDialogTime) EXIT ENDIF IF (NOT bHasInitialOutburst) EXIT ENDIF IF ARE_OBJECTIVES_OR_TEXT_BEING_DISPLAYED() EXIT ENDIF #IF IS_DEBUG_BUILD IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Trying to play Michael Fight Rant - Time:", (GET_GAME_TIMER() - iMissionDebugTime) / 1000) ENDIF #ENDIF ADD_PED_FOR_DIALOGUE(convoMichael, ENUM_TO_INT(CHAR_MICHAEL), PLAYER_PED_ID(), "MICHAEL") IF CREATE_CONVERSATION(convoMichael, "BARY1AU", "BARY1_FIGHT", CONV_PRIORITY_LOW) #IF IS_DEBUG_BUILD IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Michael Fight Rant - Time:", (GET_GAME_TIMER() - iMissionDebugTime) / 1000) ENDIF #ENDIF iNextFightDialogTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 20000) // don't let freak line play too quickly after IF iNextFreakDialogTime - GET_GAME_TIMER() < kiDialogTimeCheck CPRINTLN(DEBUG_MISSION, "Freak Rant Time too soon: resetting.") iNextFreakDialogTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3000, 5000) ENDIF ENDIF ENDPROC /// PURPOSE: /// Runs the one shot rants Michael can shout at mission start PROC PLAY_MICHAEL_DIALOG_LINES() IF (GET_GAME_TIMER() < iNextDamageDialogTime) EXIT ENDIF IF IS_SCRIPTED_CONVERSATION_ONGOING() EXIT ENDIF #IF IS_DEBUG_BUILD IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Trying to play Michael Damage Rant - Time:", (GET_GAME_TIMER() - iMissionDebugTime) / 1000) ENDIF #ENDIF ADD_PED_FOR_DIALOGUE(convoMichael, ENUM_TO_INT(CHAR_MICHAEL), PLAYER_PED_ID(), "MICHAEL") IF CREATE_CONVERSATION(convoMichael, "BARY1AU", "BARY1_DAMAGE", CONV_PRIORITY_HIGH, DO_NOT_DISPLAY_SUBTITLES, DO_NOT_ADD_TO_BRIEF_SCREEN) #IF IS_DEBUG_BUILD IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Michael Damage Rant - Time:", (GET_GAME_TIMER() - iMissionDebugTime) / 1000) ENDIF #ENDIF iNextDamageDialogTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 7000) ENDIF ENDPROC /// PURPOSE: /// Runs the one shot rants Michael can shout at mission start PROC PLAY_MICHAEL_INITIAL_LINE() IF (GET_GAME_TIMER() < iFirstDialogTime) EXIT ENDIF IF IS_SCRIPTED_CONVERSATION_ONGOING() EXIT ENDIF IF (bHasInitialOutburst) EXIT ENDIF TEXT_LABEL linename = "BARY1_1SHOT_" linename += (GET_RANDOM_INT_IN_RANGE(0, 3) + 1) #IF IS_DEBUG_BUILD IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Michael First Line Rant:", linename) ENDIF #ENDIF ADD_PED_FOR_DIALOGUE(convoMichael, ENUM_TO_INT(CHAR_MICHAEL), PLAYER_PED_ID(), "MICHAEL") IF PLAY_SINGLE_LINE_FROM_CONVERSATION(convoMichael, "BARY1AU", "BARY1_1SHOT", linename, CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES) CPRINTLN(DEBUG_MISSION, "Initial Rant Played Time:", (GET_GAME_TIMER() - iMissionDebugTime) / 1000) bHasInitialOutburst = TRUE ENDIF ENDPROC /// PURPOSE: /// Runs the fight rants Michael can say during abduction PROC PLAY_MICHAEL_ABDUCT_DIALOG_LINE() IF IS_SCRIPTED_CONVERSATION_ONGOING() EXIT ENDIF IF (NOT bHasInitialOutburst) EXIT ENDIF IF ARE_OBJECTIVES_OR_TEXT_BEING_DISPLAYED() EXIT ENDIF #IF IS_DEBUG_BUILD IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Trying to play Michael Freak Rant - Time:", (GET_GAME_TIMER() - iMissionDebugTime) / 1000) ENDIF #ENDIF ADD_PED_FOR_DIALOGUE(convoMichael, ENUM_TO_INT(CHAR_MICHAEL), PLAYER_PED_ID(), "MICHAEL") IF CREATE_CONVERSATION(convoMichael, "BARY1AU", "BARY1_ABDUCT", CONV_PRIORITY_LOW) #IF IS_DEBUG_BUILD IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Michael Abduct Rant - Time:", (GET_GAME_TIMER() - iMissionDebugTime) / 1000) ENDIF #ENDIF ENDIF ENDPROC //---------------------- // ALIEN FUNCTIONS //---------------------- /// PURPOSE: /// Fills the index - this wouldn't be necessary if i could store references to objects... PROC POPULATE_ALIEN_INDEX() INT i = 0 REPEAT COUNT_OF(alienPed) i alienPed[i].iAlienIndex = i ENDREPEAT ENDPROC /// PURPOSE: /// Returns True if this alien can do summon /// PARAMS: /// rp - reference to alien ped FUNC BOOL CAN_ALIEN_SUMMON(ALIEN_PED &rp) IF rp.bWallSpawn RETURN FALSE ENDIF IF (iAlienSummonerIndex = -1) RETURN FALSE ELSE RETURN (bAllowSummoning = TRUE) AND (GET_GAME_TIMER() > iAlienNextSummonTime) AND (rp.iAlienIndex = iAlienSummonerIndex) ENDIF ENDFUNC /// PURPOSE: /// Returns True if alien ped is living /// PARAMS: /// rp - reference to alien ped FUNC BOOL IS_ALIEN_PED_ALIVE(ALIEN_PED &rp) IF NOT rp.bIsActive RETURN FALSE ENDIF RETURN (rp.aState <> AS_DYING) AND (rp.aState <> AS_DEAD) AND IS_ENTITY_ALIVE(rp.pedID) ENDFUNC /// PURPOSE: /// Returns True if alien ped is in dying state (or dead) /// PARAMS: /// rp - reference to alien ped FUNC BOOL IS_ALIEN_DYING(ALIEN_PED &rp) RETURN (rp.aState = AS_DYING) OR (rp.aState = AS_DEAD) ENDFUNC /// PURPOSE: /// Returns True if alien ped is in dying state (or dead) /// PARAMS: /// rp - reference to alien ped FUNC BOOL HAS_ALIEN_FINSHED_DYING(ALIEN_PED &rp) IF (rp.aState <> AS_DYING) RETURN FALSE ENDIF IF NOT IS_ENTITY_DEAD(rp.pedID) RETURN FALSE ENDIF IF NOT ARE_VECTORS_ALMOST_EQUAL(GET_ENTITY_VELOCITY(rp.pedID), <<0, 0, 0>>, 0.125) IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Alien ", rp.iAlienIndex, " is dying but still moving") ENDIF RETURN FALSE ENDIF IF IS_PED_RAGDOLL(rp.pedID) OR IS_PED_RUNNING_RAGDOLL_TASK(rp.pedID) //CPRINTLN(DEBUG_MISSION, "Alien ", rp.iAlienIndex, " is dying but still doing ragdoll stuff") RETURN FALSE ENDIF RETURN TRUE ENDFUNC /// PURPOSE: /// Tells us if this is in summon state /// PARAMS: /// alien - alien reference /// RETURNS: /// True or False FUNC BOOL IS_ALIEN_IN_BEAM_STATE(ALIEN_PED &alien) RETURN (alien.aState = AS_BEAM_KNOCKDOWN) OR (alien.aState = AS_BEAM) OR (alien.aState = AS_BEAM_START) OR (alien.aState = AS_CHARGE) OR (alien.aState = AS_CHARGE_RUSH) ENDFUNC /// PURPOSE: /// Tells us if this is in summon state /// PARAMS: /// alien - alien reference /// RETURNS: /// True or False FUNC BOOL IS_ALIEN_IN_SUMMON_STATE(ALIEN_PED &alien) RETURN (alien.aState = AS_SUMMON_RUSH) OR (alien.aState = AS_SUMMON_START) ENDFUNC /// PURPOSE: /// Tells us if this is in battle state /// PARAMS: /// alien - alien reference /// RETURNS: /// True or False FUNC BOOL IS_ALIEN_IN_BATTLE_STATE(ALIEN_PED &alien) INT asnum = ENUM_TO_INT(alien.aState) RETURN (asnum >= ENUM_TO_INT(AS_ACTIVE)) ENDFUNC /// PURPOSE: /// Returns True if alien ped is ready to be re-used /// PARAMS: /// rp - reference to alien ped FUNC BOOL IS_ALIEN_PED_FREE(ALIEN_PED &rp) RETURN NOT rp.bIsActive ENDFUNC /// PURPOSE: /// Returns active number of alien peds FUNC INT GET_ALIVE_ALIEN_PED_COUNT() INT i = 0 INT cnt = 0 REPEAT (COUNT_OF(alienPed)) i IF IS_ALIEN_PED_ALIVE(alienPed[i]) cnt ++ ENDIF ENDREPEAT RETURN cnt ENDFUNC /// PURPOSE: /// Grabs an index to the first alive alien /// PARAMS: /// out - index in array to next free alien (this gets overwritten) FUNC BOOL GET_FIRST_ALIVE_ALIEN_PED_INDEX(INT &out) INT i = 0 out = -1 REPEAT (COUNT_OF(alienPed)) i IF IS_ALIEN_PED_ALIVE(alienPed[i]) out = i RETURN TRUE ENDIF ENDREPEAT RETURN FALSE ENDFUNC /// PURPOSE: /// Returns True if a alien ped is ready to be re-used /// PARAMS: /// out - index in array to next free alien (this gets overwritten) FUNC BOOL GET_FREE_ALIEN_PED_INDEX(INT &out) INT i = 0 out = -1 REPEAT (COUNT_OF(alienPed)) i IF (alienPed[i].bIsActive = FALSE) out = i RETURN TRUE ENDIF ENDREPEAT RETURN FALSE ENDFUNC /// PURPOSE: /// Kills all alien peds PROC KILL_ALL_ALIEN_PEDS() INT i = 0 REPEAT (COUNT_OF(alienPed)) i IF IS_ALIEN_PED_ALIVE(alienPed[i]) AND NOT IS_ENTITY_DEAD(alienPed[i].pedID) EXPLODE_PED_HEAD(alienPed[i].pedID) ENDIF ENDREPEAT ENDPROC /// PURPOSE: /// Common things which are called in both delete and cleanup /// PARAMS: /// ent - PROC REMOVE_ALIEN_PARTICLE_FX(ALIEN_PED &ent) SAFE_REMOVE_PARTICLE_FX(ent.fxSummonID) SAFE_REMOVE_PARTICLE_FX(ent.fxChargeID) SAFE_REMOVE_PARTICLE_FX(ent.fxBeamID) SAFE_REMOVE_PARTICLE_FX(ent.fxImpactID) SAFE_REMOVE_PARTICLE_FX(ent.fxScreenImpactID) ENDPROC /// PURPOSE: /// Tells all alien peds to flee PROC FLEE_ALL_ALIEN_PEDS() INT i = 0 IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) ENDIF REPEAT COUNT_OF(alienPed) i IF IS_ALIEN_PED_ALIVE(alienPed[i]) REMOVE_ALIEN_PARTICLE_FX(alienPed[i]) alienPed[i].aState = AS_NULL TASK_SMART_FLEE_COORD(alienPed[i].pedID, GET_ENTITY_COORDS(PLAYER_PED_ID()), 400.0, -1) ENDIF ENDREPEAT ENDPROC /// PURPOSE: /// Common things which are called in both delete and cleanup /// PARAMS: /// ent - PROC SHARED_DELETE_CLEANUP(ALIEN_PED &ent) IF IS_ALIEN_IN_SUMMON_STATE(ent) bSummonRushFlagActive = FALSE bSummonFlagActive = FALSE ENDIF SAFE_REMOVE_BLIP(ent.blipID) SAFE_DELETE_OBJECT(ent.screenImpactID) SAFE_DELETE_OBJECT(ent.projectorID) SAFE_DELETE_OBJECT(ent.impactID) SAFE_STOP_AND_RELEASE_SOUND_ID(ent.mindCtrlSoundID) REMOVE_ALIEN_PARTICLE_FX(ent) ent.iButtonMashCount = 0 ent.sBeamLOS = NULL ENDPROC /// PURPOSE: /// Force everything off for hard reset PROC STOP_ALL_ALIEN_EVERYTHING() INT i = 0 REPEAT COUNT_OF(alienPed) i SHARED_DELETE_CLEANUP(alienPed[i]) ENDREPEAT ENDPROC /// PURPOSE: /// Cleans up a single alien ped /// PARAMS: /// ent - reference to alien ped /// keepTask - set this to keep tasks after cleanup PROC CLEANUP_ALIEN_PED(ALIEN_PED &ent, BOOL keepTask = TRUE) IF (ent.bIsActive = FALSE) EXIT ENDIF SHARED_DELETE_CLEANUP(ent) SAFE_RELEASE_PED(ent.pedID, keepTask, FALSE) ent.bIsActive = FALSE ENDPROC /// PURPOSE: /// Cleans up a single alien ped /// PARAMS: /// ent - reference to alien ped /// keepTask - set this to keep tasks after cleanup PROC DELETE_ALIEN_PED(ALIEN_PED &ent) IF (ent.bIsActive = FALSE) EXIT ENDIF SHARED_DELETE_CLEANUP(ent) SAFE_DELETE_PED(ent.pedID) ent.bIsActive = FALSE ENDPROC /// PURPOSE: /// Cleans all alien peds /// PARAMS: /// keepTask - set this to keep tasks after cleanup PROC CLEANUP_ALL_ALIEN_PEDS(BOOL keepTask = TRUE) INT i = 0 REPEAT COUNT_OF(alienPed) i CLEANUP_ALIEN_PED(alienPed[i], keepTask) ENDREPEAT ENDPROC /// PURPOSE: /// Deletes all alien peds PROC DELETE_ALL_ALIEN_PEDS() INT i = 0 REPEAT COUNT_OF(alienPed) i DELETE_ALIEN_PED(alienPed[i]) ENDREPEAT ENDPROC PROC HANDLE_PLAYING_ALIEN_CLICKING_SOUND(ALIEN_PED &alien) IF alien.aState != AS_ACTIVE OR alien.bWallSpawn // so as not to interfere with attack sound EXIT ENDIF IF (GET_GAME_TIMER() > alien.iClickSoundTimer) IF alien.fDistToPlayer < kfMinClickSoundDist alien.iClickSoundTimer = GET_GAME_TIMER() +(GET_RANDOM_INT_IN_RANGE(iAlienMinClickTime, iAlienMaxClickTime)) EXIT ENDIF //CPRINTLN(DEBUG_MISSION, "Playing click speech for alien ", alien.iAlienIndex) PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(alien.pedID, "ALIEN_CLICKS", "ALIENS", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR) alien.iClickSoundTimer = GET_GAME_TIMER() +(GET_RANDOM_INT_IN_RANGE(iAlienMinClickTime, iAlienMaxClickTime)) ENDIF ENDPROC /// PURPOSE: /// Creates one alien ped /// PARAMS /// alien - alien ped reference /// pos - alien spawn point /// rank - this dicates the order people spawn in FUNC BOOL CREATE_ALIEN_PED(ALIEN_PED &alien, VECTOR pos, INT rank = 0, BOOL checkSpt = TRUE) // do a safety check here IF (checkSpt) IF NOT CHECK_SPAWN_POINT_IS_OK(pos) RETURN FALSE ENDIF ENDIF // create the alien alien.pedID = CREATE_PED(PEDTYPE_MISSION, alienModel, pos) IF NOT DOES_ENTITY_EXIST(alien.pedID) RETURN FALSE ENDIF CLEAR_PED_TASKS_IMMEDIATELY(alien.pedID) SET_ENTITY_COORDS_GROUNDED(alien.pedID, pos) SET_ENTITY_HEADING_FACE_PLAYER(alien.pedID) SET_PED_RELATIONSHIP_GROUP_HASH(alien.pedID, RELGROUPHASH_HATES_PLAYER) SET_PED_CONFIG_FLAG(alien.pedID, PCF_DisableMelee, TRUE) STOP_PED_SPEAKING(alien.pedID, TRUE) DISABLE_PED_PAIN_AUDIO(alien.pedID, TRUE) SET_AMBIENT_VOICE_NAME(alien.pedID, "ALIENS") SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(alien.pedID, TRUE) SET_PED_DEFAULT_COMPONENT_VARIATION(alien.pedID) SET_PED_AS_ENEMY(alien.pedID, TRUE) SET_PED_MONEY(alien.pedID, 0) FREEZE_ENTITY_POSITION(alien.pedID, TRUE) SET_ENTITY_INVINCIBLE(alien.pedID, TRUE) SET_ENTITY_COLLISION(alien.pedID, FALSE) SET_ENTITY_VISIBLE(alien.pedID, FALSE) SET_ENTITY_CAN_BE_TARGETED_WITHOUT_LOS(alien.pedID, FALSE) SET_PED_CAN_BE_TARGETTED(alien.pedID, FALSE) SET_ENTITY_IS_TARGET_PRIORITY(alien.pedID, TRUE) SET_ENTITY_MAX_HEALTH(alien.pedID, iAlienMaxHP) SET_ENTITY_HEALTH(alien.pedID, iAlienMaxHP) // create beam projector alien.projectorID = CREATE_OBJECT_NO_OFFSET(beamDummyModel, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(alien.pedID, <<0, -5, 0>>)) IF IS_ENTITY_OK(alien.projectorID) SET_ENTITY_COLLISION(alien.projectorID, FALSE) SET_ENTITY_VISIBLE(alien.projectorID, FALSE) FREEZE_ENTITY_POSITION(alien.projectorID, TRUE) ENDIF // create impact object alien.impactID = CREATE_OBJECT_NO_OFFSET(beamDummyModel, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(alien.pedID, <<0, -5, 0>>)) IF IS_ENTITY_OK(alien.impactID) SET_ENTITY_COLLISION(alien.impactID, FALSE) SET_ENTITY_VISIBLE(alien.impactID, FALSE) FREEZE_ENTITY_POSITION(alien.impactID, TRUE) ENDIF alien.screenImpactID = CREATE_OBJECT_NO_OFFSET(beamDummyModel, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(alien.pedID, <<0, 5, 0>>)) IF IS_ENTITY_OK(alien.screenImpactID) SET_ENTITY_COLLISION(alien.screenImpactID, FALSE) SET_ENTITY_VISIBLE(alien.screenImpactID, FALSE) FREEZE_ENTITY_POSITION(alien.screenImpactID, TRUE) ENDIF // turn him on alien.aState = AS_DELAY alien.bIsActive = TRUE alien.bWallSpawn = FALSE alien.iTimer = GET_GAME_TIMER() + (rank * GENDELAY_TIME) alien.iClickSoundTimer = GET_GAME_TIMER() + (GET_RANDOM_INT_IN_RANGE(iAlienMinClickTime, iAlienMaxClickTime)) alien.fDistToPlayer = GET_DISTANCE_BETWEEN_ENTITIES(alien.pedID, PLAYER_PED_ID()) alien.fRunRatio = GET_RANDOM_FLOAT_IN_RANGE(PEDMOVE_RUN, PEDMOVE_SPRINT) alien.fBeamTriggerRange = fAlienBeamStartRange + (GET_RANDOM_FLOAT_IN_RANGE(fAlienMinBeamTriggerVariance, fAlienMaxBeamTriggerVariance) * fAlienBeamStartRange) alien.fPedAlpha = 0 IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " Beam Trigger Range = ", alien.fBeamTriggerRange ) ENDIF TASK_PLAY_ANIM(alien.pedID, sMissionAnimDictionary, sAlienTeleportAnim, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) iTotalAlienSpawnCount ++ RETURN TRUE ENDFUNC /// PURPOSE: /// Set the alien to be more easily killed /// PARAMS: /// alien - alien struct PROC SET_ALIEN_WEAK(ALIEN_PED &alien) IF NOT IS_PED_INJURED(alien.pedID) CPRINTLN(DEBUG_MISSION, "SET_ALIEN_WEAK" ) SET_ENTITY_HEALTH(alien.pedID, iAlienMaxHP/4) SET_PED_DIES_WHEN_INJURED(alien.pedID, TRUE) SET_PED_SUFFERS_CRITICAL_HITS(alien.pedID, TRUE) ENDIF ENDPROC /// PURPOSE: /// Spawn in a new alien under certain conditions /// PARAMS: /// iAlienCount - PROC SPAWN_NEXT_ALIEN_NEAR_LOCATION(VECTOR vCenterPt, FLOAT fRadius, INT iAlienCount = 5, BOOL bSetAsWeak = FALSE) INT i VECTOR v // If the alien count drops low enough, spawn a new one if timer is up IF (iAlienAliveCount < iAlienCount) IF TIMER_DO_ONCE_WHEN_READY(tmr1stContactSpawn, f1stContactSpawnTime) IF GET_FREE_ALIEN_PED_INDEX(i) IF GENERATE_ALIEN_SPAWN_POINT_NEAR_LOCATION(vCenterPt, fRadius, v) IF CREATE_ALIEN_PED(alienPed[i], v, 0, FALSE) CPRINTLN(DEBUG_MISSION, "SPAWN_NEXT_ALIEN_NEAR_LOCATION: Alien ", alienPed[i].iAlienIndex, " Spawned!" ) IF bSetAsWeak SET_ALIEN_WEAK(alienPed[i]) ENDIF ELSE CPRINTLN(DEBUG_MISSION, "SPAWN_NEXT_ALIEN_NEAR_LOCATION: Could not spawn alien: ", alienPed[i].iAlienIndex) ENDIF START_TIMER_NOW(tmr1stContactSpawn) f1stContactSpawnTime = GET_RANDOM_FLOAT_IN_RANGE(1.500, 2.500) ELSE CPRINTLN(DEBUG_MISSION, "SPAWN_NEXT_ALIEN_NEAR_LOCATION: Could not generate a spawn point for alien: ", alienPed[i].iAlienIndex) START_TIMER_NOW(tmr1stContactSpawn) f1stContactSpawnTime = 1.000 ENDIF ENDIF ENDIF ENDIF ENDPROC PROC HANDLE_AUTO_ALIEN_GENERATION() // increase the alien auto gen delay timer as the number of allowed aliens rises INT m = 0 IF iMaxActiveAliens > kiMaxStartingAliens m = iMaxActiveAliens - kiMaxStartingAliens iAlienAutoGenDeltaTime = kiAlienAutoGenDeltaTime * m iAlienMinAutoGenTime = kiAlienMinAutoGenBaseTime + iAlienAutoGenDeltaTime iAlienMaxAutoGenTime = kiAlienMaxAutoGenBaseTime + iAlienAutoGenDeltaTime ENDIF // run the gauntlet of checks, reset timer // is auto create active IF NOT bAutoCreateAliens iAlienAutoGenTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(iAlienMinAutoGenTime, iAlienMaxAutoGenTime) EXIT ENDIF // are we doing an abduction attempt (if so, wait a little longer before spawning new aliens) IF bSummonFlagActive iAlienAutoGenTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(iAlienMinAutoGenTime*3, iAlienMaxAutoGenTime*2) EXIT ENDIF // do we have enough aliens already IF (iAlienAliveCount >= iMaxActiveAliens) iAlienAutoGenTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(iAlienMinAutoGenTime, iAlienMaxAutoGenTime) EXIT ENDIF INT i VECTOR v // timer so we don't spawn all possible aliens ones at once IF GET_GAME_TIMER() > iAlienAutoGenTime IF GET_FREE_ALIEN_PED_INDEX(i) IF GENERATE_ALIEN_WALL_SPAWN(v, 0.4) CREATE_ALIEN_PED(alienPed[i], v, 0, FALSE) alienPed[i].bWallSpawn = TRUE alienPed[i].fBeamTriggerRange = 150 iAlienAutoGenTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(iAlienMinAutoGenTime, iAlienMaxAutoGenTime) SET_ALIEN_WEAK(alienPed[i]) //CPRINTLN(DEBUG_MISSION, "HANDLE_AUTO_ALIEN_GENERATION: (Wall spawn) Time until next alien spawn = ", iAlienAutoGenTime - GET_GAME_TIMER()) ELIF GENERATE_ALIEN_SPAWN_POINT(v) CREATE_ALIEN_PED(alienPed[i], v, 0, FALSE) iAlienAutoGenTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(iAlienMinAutoGenTime, iAlienMaxAutoGenTime) //CPRINTLN(DEBUG_MISSION, "HANDLE_AUTO_ALIEN_GENERATION: Time until next alien spawn = ", iAlienAutoGenTime - GET_GAME_TIMER()) ENDIF ENDIF ENDIF ENDPROC //---------------------- // ALIEN UPDATE FUNCTIONS //---------------------- /// PURPOSE: /// Dead Checking /// PARAMS: /// alien - alien reference /// RETURNS: /// Return true if the alien is dead FUNC BOOL UPDATE_ALIEN_DEAD_CHECKING(ALIEN_PED &alien) IF NOT IS_ALIEN_DYING(alien) alien.fDistToPlayer = GET_DISTANCE_BETWEEN_ENTITIES(alien.pedID, PLAYER_PED_ID(), FALSE) IF IS_ENTITY_DEAD(alien.pedID) OR IS_PED_INJURED(alien.pedID) IF IS_ALIEN_IN_SUMMON_STATE(alien) bSummonRushFlagActive = FALSE bSummonFlagActive = FALSE ENDIF IF alien.aState = AS_SUMMON_START CPRINTLN(DEBUG_MISSION, "Alien Summon aborted because he died") IF(GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK) // Because he's perfoming a sequence, stopping the intro anim can put him into the looping anim. // Failsafe so player isn't stuck, plus he'll just straighten up rather than play his "win" anim. CPRINTLN(DEBUG_MISSION, "Clearing player tasks, player should be free.") CLEAR_PED_TASKS(PLAYER_PED_ID()) ENDIF IF IS_GAMEPLAY_HINT_ACTIVE() STOP_GAMEPLAY_HINT() ENDIF SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) ENDIF PLAY_AMBIENT_SPEECH_FROM_POSITION("ALIEN_DEATH", "ALIENS", GET_ENTITY_COORDS(alien.pedID), SPEECH_PARAMS_FORCE_SHOUTED_CLEAR) REMOVE_ALIEN_PARTICLE_FX(alien) SAFE_STOP_AND_RELEASE_SOUND_ID(alien.mindCtrlSoundID) SAFE_DELETE_OBJECT(alien.projectorID) SAFE_DELETE_OBJECT(alien.impactID) SAFE_DELETE_OBJECT(alien.screenImpactID) PLAY_MICHAEL_FIGHT_DIALOG_LINES() SAFE_REMOVE_BLIP(alien.blipID) alien.iTimer = GET_GAME_TIMER() + 2500 IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " is dying") ENDIF iTotalAlienDeadCount ++ CPRINTLN(DEBUG_MISSION, "TOTAL DEAD ALIENS = ", iTotalAlienDeadCount) IF (iKillChain = 0) iKillChainEndTime = GET_GAME_TIMER() + CHAIN_KILL_TIME ENDIF iKillChain ++ IF (iKillChain > iMaxKillChain) iMaxKillChain = iKillChain ENDIF IF (iKillChain >= CHAIN_KILL_AMOUNT) INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(BA1_KILLCHAIN) CPRINTLN(DEBUG_MISSION, "INFORM STATS OF KILL CHAIN") ENDIF IF (iTotalAlienDeadCount % 5 = 0) IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "WAVE CLEAR") ENDIF iMaxActiveAliens ++ IF alien.aState != AS_SUMMON_START IF (bAllowSummoning = FALSE) CPRINTLN(DEBUG_MISSION, "UPDATE_ALIEN_DEAD_CHECKING: Reactivating Summon.") bAllowSummoning = TRUE ENDIF ELSE IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "UPDATE_ALIEN_DEAD_CHECKING: Alien was summoning, don't reactivate summon this time.") ENDIF ENDIF fAlienMinSpawnRadius -= 4.0 IF (fAlienMinSpawnRadius < 10.0) fAlienMinSpawnRadius = 10.0 ENDIF IF (iMaxActiveAliens >= COUNT_OF(alienPed)) iMaxActiveAliens = COUNT_OF(alienPed) ENDIF ENDIF alien.aState = AS_DYING RETURN TRUE ENDIF ELSE alien.fDistToPlayer = -1.0 ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Updates the next possible alien to be allowed to summon PROC UPDATE_NEXT_ALIEN_SUMMONER_INDEX() INT i = 0 FLOAT minDist = -1 IF (bAllowSummoning = FALSE) iAlienSummonerIndex = -1 EXIT ENDIF REPEAT (COUNT_OF(alienPed)) i IF IS_ALIEN_PED_ALIVE(alienPed[i]) AND (alienPed[i].aState = AS_ACTIVE) IF (minDist = -1) OR ((alienPed[i].fDistToPlayer < minDist) AND (alienPed[i].fDistToPlayer <> -1)) iAlienSummonerIndex = i alienPed[i].fDistToPlayer = minDist ENDIF ENDIF ENDREPEAT ENDPROC /// PURPOSE: /// This handles the aliens day to day stuff /// PARAMS /// alien - alien ped reference //PROC UPDATE_ALIEN_PED_BEAM_EVO(ALIEN_PED &alien) // VECTOR v // FLOAT sx, sy // INT side1, side2 // // SET_ENTITY_COORDS_NO_OFFSET(alien.screenImpactID, GET_ENTITY_COORDS(alien.projectorID)) // GET_LINE_PLANE_INTERSECT(v, GET_ENTITY_COORDS(alien.projectorID), GET_ENTITY_COORDS(alien.impactID), vCameraForward, vCameraCoords + (vCameraForward * fCameraNearClip)) // // IF NOT GET_SCREEN_COORD_FROM_WORLD_COORD(v, sx, sy) // SAFE_REMOVE_PARTICLE_FX(alien.fxScreenImpactID) // // alien.fBeamEvoValue -= fAlienBeamEvoIncrease // IF (alien.fBeamEvoValue < 0.0) // alien.fBeamEvoValue = 0.0 // ENDIF // ELSE // side1 = ENUM_TO_INT(GET_PLANE_SIDE(vCameraForward, vCameraCoords, GET_ENTITY_COORDS(alien.projectorID))) // side2 = ENUM_TO_INT(GET_PLANE_SIDE(vCameraForward, vCameraCoords, GET_ENTITY_COORDS(alien.impactID))) // // IF (side1 > 0) AND (side2 < 0) // SET_ENTITY_COORDS_NO_OFFSET(alien.screenImpactID, v - (GET_ENTITY_FORWARD_VECTOR(alien.projectorID) * fAlienScreenImpactShift)) // ELIF (side1 < 0) AND (side2 > 0) // SET_ENTITY_COORDS_NO_OFFSET(alien.screenImpactID, v + (GET_ENTITY_FORWARD_VECTOR(alien.projectorID) * fAlienScreenImpactShift)) // ENDIF // // alien.fBeamEvoValue = 1.0 // IF NOT DOES_PARTICLE_FX_LOOPED_EXIST(alien.fxScreenImpactID) // alien.fxScreenImpactID = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_alien_impact", alien.screenImpactID, <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>, fAlienImpactEffectSize / 3.0) // ENDIF // // //alien.fBeamLength = GET_DISTANCE_BETWEEN_ENTITIES(alien.screenImpactID, alien.projectorID) // ENDIF // // IF DOES_PARTICLE_FX_LOOPED_EXIST(alien.fxBeamID) // SET_PARTICLE_FX_LOOPED_EVOLUTION(alien.fxBeamID, "angle", alien.fBeamEvoValue) // ENDIF //ENDPROC /// PURPOSE: /// Converts a rotation vector into a normalised direction vector (basically the direction an entity would move if it moved forward at the current rotation). /// For example: a rotation of <<0.0, 0.0, 45.0>> gives a direction vector of <<-0.707107, 0.707107, 0.0>> /// PARAMS: /// v_rot - The rotation vector /// RETURNS: /// The direction vector FUNC VECTOR CONVERT_ROT_TO_DIR_VECTOR(VECTOR v_rot) RETURN <<-SIN(v_rot.z) * COS(v_rot.x), COS(v_rot.z) * COS(v_rot.x), SIN(v_rot.x)>> ENDFUNC PROC UPDATE_BEAM_CAMERA_IMPACT(ALIEN_PED &alien) VECTOR camPos = GET_FINAL_RENDERED_CAM_COORD() VECTOR camDir = CONVERT_ROT_TO_DIR_VECTOR(GET_FINAL_RENDERED_CAM_ROT()) VECTOR cameraPlanePos = camPos + (camDir * GET_FINAL_RENDERED_CAM_NEAR_CLIP()) VECTOR impactPoint FLOAT fBeamToScreenLength FLOAT fScreenImpactEffectSize = fAlienImpactEffectSize * 1.25 INT side1, side2 IF GET_LINE_PLANE_INTERSECT(impactPoint, GET_ENTITY_COORDS(alien.projectorID), GET_ENTITY_COORDS(alien.impactID), camDir, cameraPlanePos) // 1st param is a reference //CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex,"'s beam is intersecting the camera plane") IF IS_SPHERE_VISIBLE(impactPoint, 0.5) //CPRINTLN(DEBUG_MISSION, "Impact sphere is visible for Alien ", alien.iAlienIndex) side1 = ENUM_TO_INT(GET_PLANE_SIDE(camDir, camPos, GET_ENTITY_COORDS(alien.projectorID))) side2 = ENUM_TO_INT(GET_PLANE_SIDE(camDir, camPos, GET_ENTITY_COORDS(alien.impactID))) // projector side IF (side1 > 0) AND (side2 < 0) impactPoint = impactPoint - (GET_ENTITY_FORWARD_VECTOR(alien.projectorID) * fAlienScreenImpactShift) // far side ELIF (side1 < 0) AND (side2 > 0) impactPoint = impactPoint + (GET_ENTITY_FORWARD_VECTOR(alien.projectorID) * (fAlienScreenImpactShift * 4.5)) ENDIF // draw particles at impactpoint to hide hard edge. IF NOT DOES_PARTICLE_FX_LOOPED_EXIST(alien.fxScreenImpactID) alien.fxScreenImpactID = START_PARTICLE_FX_LOOPED_AT_COORD("scr_alien_impact", impactPoint, (<<0.0, 0.0, 0.0>>), fScreenImpactEffectSize) // / 3.0) ENDIF //set beam length to be distance from beamStart to impactPoint fBeamToScreenLength = GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(alien.projectorID, impactPoint) // If we've already impacted something, don't extend beam // But if we hit the camera first, let it through to hit the player IF alien.fBeamLength >= fBeamToScreenLength AND (side1 > 0) AND (side2 < 0) alien.fBeamLength = fBeamToScreenLength ENDIF ELSE SAFE_REMOVE_PARTICLE_FX(alien.fxScreenImpactID) ENDIF ELSE SAFE_REMOVE_PARTICLE_FX(alien.fxScreenImpactID) ENDIF ENDPROC /// PURPOSE: /// This handles summon rush /// PARAMS /// alien - alien ped reference PROC UPDATE_ALIEN_SUMMON_RUSH(ALIEN_PED &alien) REMOVE_ALIEN_PARTICLE_FX(alien) SET_PED_RESET_FLAG(alien.pedID, PRF_InfiniteStamina, TRUE) SET_PED_NAME_DEBUG(alien.pedID, "S-RUSH") SET_PED_MOVE_RATE_OVERRIDE(alien.pedID, 1.15) SET_PED_DESIRED_MOVE_BLEND_RATIO(alien.pedID, PEDMOVE_SPRINT) IF GET_SCRIPT_TASK_STATUS(alien.pedID, SCRIPT_TASK_GO_TO_ENTITY) <> PERFORMING_TASK TASK_GO_TO_ENTITY(alien.pedID, PLAYER_PED_ID()) ENDIF IF (bSummonRushFlagActive) ENDIF IF (alien.fDistToPlayer > fAlienSummonRange) EXIT ENDIF IF NOT IS_MISSION_IN_COMBAT_STAGE() EXIT ENDIF IF IS_PED_FALLING(alien.pedID) OR IS_PED_GETTING_UP(alien.pedID) OR IS_PED_RAGDOLL(alien.pedID) OR IS_PED_RUNNING_RAGDOLL_TASK(alien.pedID) CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " is down - cannot start summon") EXIT ENDIF IF NOT IS_PED_IN_PED_VIEW_CONE(alien.pedID, PLAYER_PED_ID()) EXIT ENDIF IF NOT HAS_ENTITY_CLEAR_LOS_TO_ENTITY_IN_FRONT(alien.pedID, PLAYER_PED_ID()) EXIT ENDIF SEQUENCE_INDEX seq SET_ENTITY_HEADING_FACE_PLAYER(alien.pedID) OPEN_SEQUENCE_TASK(seq) //TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID()) // not quick enough TASK_PLAY_ANIM(NULL, sMissionAnimDictionary, sAlienGrabIntroAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_DEFAULT) TASK_PLAY_ANIM(NULL, sMissionAnimDictionary, sAlienGrabAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) CLOSE_SEQUENCE_TASK(seq) TASK_PERFORM_SEQUENCE(alien.pedID, seq) CLEAR_SEQUENCE_TASK(seq) FORCE_PED_AI_AND_ANIMATION_UPDATE(alien.pedID) SET_ENTITY_HEADING_FACE_ENTITY(PLAYER_PED_ID(), alien.pedID) OPEN_SEQUENCE_TASK(seq) TASK_PLAY_ANIM(NULL, sMissionAnimDictionary, sAlienGrabbedIntroAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1) TASK_PLAY_ANIM(NULL, sMissionAnimDictionary, sAlienGrabbedAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) CLOSE_SEQUENCE_TASK(seq) TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), seq) CLEAR_SEQUENCE_TASK(seq) FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " has started summon") ENDIF alien.aState = AS_SUMMON_START PLAY_MICHAEL_ABDUCT_DIALOG_LINE() // on the first time this happens give the player more time IF (iTotalAlienSummonCount = 0) IF NOT IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) PRINT_HELP("BAR1_GRAB_HLP") // Michael is being abducted. Move ~INPUT_MOVE_LR~ rapidly to escape. ELSE PRINT_HELP("BAR1_GRAB_HPC") // Michael is being abducted. Rapidly press ~INPUT_MOVE_LR~ alternately to escape. ENDIF alien.iTimer = GET_GAME_TIMER() + iAlienSummonTimeLength + 2000 SET_GAMEPLAY_PED_HINT(alien.pedID, <<0, 0, 0>>, TRUE, iAlienSummonTimeLength + 2000) ELSE alien.iTimer = GET_GAME_TIMER() + iAlienSummonTimeLength SET_GAMEPLAY_PED_HINT(alien.pedID, <<0, 0, 0>>, TRUE, iAlienSummonTimeLength) ENDIF iTotalAlienSummonCount ++ alien.iButtonMashCount = 0 SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) fRegenMultiplier = 0.0 SAFE_STOP_AND_RELEASE_SOUND_ID(alien.mindCtrlSoundID) alien.mindCtrlSoundID = GET_SOUND_ID() PLAY_SOUND_FROM_ENTITY(alien.mindCtrlSoundID, "PLAYER_BEAMED_UP", alien.pedID, "BARRY_01_SOUNDSET") // start fx START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_alien_teleport", PLAYER_PED_ID(), <<0, 0, 0>>, <<0, 0, 0>>, fAlienTeleportEffectSize) alien.iNextSummonEffectTime = GET_GAME_TIMER() + 2000 ENDPROC /// PURPOSE: /// This handles summon /// PARAMS /// alien - alien ped reference PROC UPDATE_ALIEN_SUMMON(ALIEN_PED &alien) INT sgn // check for button mash iAlienNextSummonTime = GET_GAME_TIMER() + iAlienNextSummonTimeOut bSummonFlagActive = TRUE STOP_GAMEPLAY_HINT_BEING_CANCELLED_THIS_UPDATE(TRUE) SET_PED_NAME_DEBUG(alien.pedID, "SUMMON") RC_PLAYER_TRIGGER_SCENE_LOCK_IN() // Steve R - Changed from script inputs to normal move inputs to fix PC mapping issues. Controls are disabled during this section so using disabled controls check. sgn = FSGN(GET_DISABLED_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_MOVE_LR)) IF IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_MOVE_LR) OR (sgn <> alien.fOldMashSign) alien.fOldMashSign = sgn alien.iButtonMashCount ++ ENDIF // start fx IF (GET_GAME_TIMER() > alien.iNextSummonEffectTime) START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_alien_teleport", PLAYER_PED_ID(), <<0, 0, 0>>, <<0, 0, 0>>, fAlienTeleportEffectSize) alien.iNextSummonEffectTime = GET_GAME_TIMER() + 2000 ENDIF // stop if we mash enough or if alien is interupted IF (alien.iButtonMashCount > iAlienButtonMashLimit) OR GET_SCRIPT_TASK_STATUS(alien.pedID, SCRIPT_TASK_PERFORM_SEQUENCE) > PERFORMING_TASK IF IS_ENTITY_PLAYING_ANIM(alien.pedID, sMissionAnimDictionary, sAlienGrabAnim) OR IS_ENTITY_PLAYING_ANIM(alien.pedID, sMissionAnimDictionary, sAlienGrabIntroAnim) TASK_PLAY_ANIM(alien.pedID, sMissionAnimDictionary, sAlienGrabFailAnim) ENDIF IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedAnim) CPRINTLN(DEBUG_MISSION, "UPDATE_ALIEN_SUMMON: Player was playing ", sAlienGrabbedAnim) //STOP_ANIM_TASK(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedAnim) CLEAR_PED_TASKS(PLAYER_PED_ID()) TASK_PLAY_ANIM(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedFailAnim, NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1) FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) ELIF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedIntroAnim) CPRINTLN(DEBUG_MISSION, "UPDATE_ALIEN_SUMMON: Player was playing ", sAlienGrabbedIntroAnim) //STOP_ANIM_TASK(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedIntroAnim) CLEAR_PED_TASKS(PLAYER_PED_ID()) TASK_PLAY_ANIM(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedFailAnim, NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1) FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) ELSE CPRINTLN(DEBUG_MISSION, "UPDATE_ALIEN_SUMMON: Failsafe: Player was playing non-standard anim.") CLEAR_PED_TASKS(PLAYER_PED_ID()) TASK_PLAY_ANIM(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedFailAnim, NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1) FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) ENDIF IF IS_GAMEPLAY_HINT_ACTIVE() STOP_GAMEPLAY_HINT() ENDIF //SET_PED_TO_RAGDOLL(alien.pedID, 6000, 6500, TASK_RELAX, FALSE, FALSE) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) SAFE_STOP_AND_RELEASE_SOUND_ID(alien.mindCtrlSoundID) IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " summon has failed") ENDIF //PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(PLAYER_PED_ID(), "CANT_LOSE_ENEMY_DRUNK", "MICHAEL_DRUNK", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) SAFE_REMOVE_PARTICLE_FX(alien.fxSummonID) bSummonRushFlagActive = FALSE //bSummonFlagActive = FALSE alien.iButtonMashCount = 0 alien.aState = AS_SUMMON_FAIL alien.iTimer = GET_GAME_TIMER() + 2000 IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("BAR1_GRAB_HLP") CLEAR_HELP() ENDIF // this records the player getting grabbed IF (iSummonEscapeCount = 0) FLOAT fRecordTime = (TO_FLOAT(iAlienSummonTimeLength + 2000) / 1000.0) CPRINTLN(DEBUG_MISSION, "Recording the Last ", fRecordTime ," seconds of game play as player broke out of abduction") REPLAY_RECORD_BACK_FOR_TIME(fRecordTime, 2.0, REPLAY_IMPORTANCE_LOW) ENDIF iSummonEscapeCount ++ EXIT ENDIF // else fail the mission IF (GET_GAME_TIMER() > alien.iTimer) TASK_PLAY_ANIM(alien.pedID, sMissionAnimDictionary, sAlienGrabWinAnim) SAFE_STOP_AND_RELEASE_SOUND_ID(alien.mindCtrlSoundID) SET_MISSION_FAILED_ABDUCTED() ENDIF ENDPROC /// PURPOSE: /// This handles start of charge /// PARAMS /// alien - alien ped reference PROC UPDATE_ALIEN_CHARGE_START(ALIEN_PED &alien) INT hits SHAPETEST_STATUS st SEQUENCE_INDEX seqTask VECTOR v1, pos, norm ENTITY_INDEX hitEntity v1 = GET_ENTITY_COORDS(alien.projectorID) IF NOT alien.bWallSpawn IF GET_SCRIPT_TASK_STATUS(alien.pedID, SCRIPT_TASK_GO_TO_ENTITY) <> PERFORMING_TASK TASK_GO_TO_ENTITY(alien.pedID, PLAYER_PED_ID()) ENDIF ELSE IF GET_SCRIPT_TASK_STATUS(alien.pedID, SCRIPT_TASK_STAND_STILL) <> PERFORMING_TASK TASK_STAND_STILL(alien.pedID, -1) alien.iTimer = GET_GAME_TIMER() + iAlienBeamChargeTime * 2 ENDIF ENDIF IF NOT IS_MISSION_IN_COMBAT_STAGE() EXIT ENDIF IF (alien.sBeamLOS = NULL) pos = GET_PED_BONE_COORDS(PLAYER_PED_ID(), BONETAG_HEAD, <<0, 0, 0>>) alien.sBeamLOS = START_SHAPE_TEST_LOS_PROBE(v1, pos, SCRIPT_INCLUDE_ALL, PLAYER_PED_ID()) IF GET_GAME_TIMER() > alien.iTimer AND alien.bWallSpawn SAFE_STOP_AND_RELEASE_SOUND_ID(alien.mindCtrlSoundID) alien.mindCtrlSoundID = GET_SOUND_ID() PLAY_SOUND_FROM_ENTITY(alien.mindCtrlSoundID, "MIND_CONTROL", alien.pedID, "BARRY_01_SOUNDSET") alien.aState = AS_CHARGE ENDIF ELSE st = GET_SHAPE_TEST_RESULT(alien.sBeamLOS, hits, pos, norm, hitEntity) IF (st = SHAPETEST_STATUS_RESULTS_READY) IF (hits = 0) AND IS_MISSION_IN_COMBAT_STAGE() OPEN_SEQUENCE_TASK(seqTask) TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID()) TASK_PLAY_ANIM(NULL, sMissionAnimDictionary, "MIND_CONTROL_B_Enter", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_HOLD_LAST_FRAME) CLOSE_SEQUENCE_TASK(seqTask) TASK_PERFORM_SEQUENCE(alien.pedID, seqTask) CLEAR_SEQUENCE_TASK(seqTask) IF NOT DOES_PARTICLE_FX_LOOPED_EXIST(alien.fxChargeID) alien.fxChargeID = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_alien_charging", alien.projectorID, <<0, 0, 0>>, <<0, 0, 0>>, fAlienChargeEffectSize) ENDIF SET_ENTITY_COORDS(alien.impactID, v1) IF NOT DOES_PARTICLE_FX_LOOPED_EXIST(alien.fxImpactID) alien.fxImpactID = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_alien_impact", alien.impactID, <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>, fAlienImpactEffectSize) ENDIF alien.aState = AS_CHARGE IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " has started charging") ENDIF alien.iTimer = GET_GAME_TIMER() + iAlienBeamChargeTime SAFE_STOP_AND_RELEASE_SOUND_ID(alien.mindCtrlSoundID) alien.mindCtrlSoundID = GET_SOUND_ID() PLAY_SOUND_FROM_ENTITY(alien.mindCtrlSoundID, "MIND_CONTROL", alien.pedID, "BARRY_01_SOUNDSET") ENDIF alien.sBeamLOS = NULL ELIF (st = SHAPETEST_STATUS_NONEXISTENT) alien.sBeamLOS = NULL ENDIF ENDIF ENDPROC /// PURPOSE: /// This handles beam /// PARAMS /// alien - alien ped reference PROC UPDATE_ALIEN_BEAM(ALIEN_PED &alien) INT hits SHAPETEST_STATUS st VECTOR plyrPos VECTOR v1, v2, pos, norm ENTITY_INDEX hitEntity SET_PED_NAME_DEBUG(alien.pedID, "BEAM") IF (GET_GAME_TIMER() >= alien.iTimer) SAFE_STOP_AND_RELEASE_SOUND_ID(alien.mindCtrlSoundID) REMOVE_ALIEN_PARTICLE_FX(alien) IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " is teleporting out") ENDIF alien.aState = AS_TELEPORT_OUT_START EXIT ENDIF // abort entirely if summon is going on IF (bSummonFlagActive = TRUE) SAFE_STOP_AND_RELEASE_SOUND_ID(alien.mindCtrlSoundID) REMOVE_ALIEN_PARTICLE_FX(alien) alien.aState = AS_WATCH_SUMMON EXIT ENDIF // update beam movement IF (GET_FRAME_COUNT() >= alien.iLastImpactFrame + 8) alien.fBeamLength += fAlienBeamLengthInc IF (alien.fBeamLength > fAlienBeamMaximumLength) alien.fBeamLength = fAlienBeamMaximumLength ENDIF ENDIF // if the alien is falling over or getting up or if another alien is summoning - turn off beam IF IS_ENTITY_ALIVE(alien.pedID) IF IS_PED_FALLING(alien.pedID) OR IS_PED_GETTING_UP(alien.pedID) OR IS_PED_RAGDOLL(alien.pedID) OR IS_PED_RUNNING_RAGDOLL_TASK(alien.pedID) //SAFE_REMOVE_PARTICLE_FX(alien.fxImpactID) REMOVE_ALIEN_PARTICLE_FX(alien) SAFE_STOP_AND_RELEASE_SOUND_ID(alien.mindCtrlSoundID) alien.fBeamLength = 0 alien.aState = AS_BEAM_KNOCKDOWN ENDIF ENDIF // if the ped isn't playing anim - drop into beam knockdown state where we wait until he is playing the anim and re-orient the beam IF GET_SCRIPT_TASK_STATUS(alien.pedID, SCRIPT_TASK_PLAY_ANIM) <> PERFORMING_TASK alien.fBeamLength = 0 IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " has been knocked out of beam firing") ENDIF alien.sBeamLOS = NULL alien.aState = AS_BEAM_KNOCKDOWN alien.fBeamLength = 0 ENDIF IF (alien.fBeamLength <= 0) IF DOES_PARTICLE_FX_LOOPED_EXIST(alien.fxBeamID) SET_PARTICLE_FX_LOOPED_FAR_CLIP_DIST(alien.fxBeamID, alien.fBeamLength) ENDIF SAFE_STOP_AND_RELEASE_SOUND_ID(alien.mindCtrlSoundID) SAFE_REMOVE_PARTICLE_FX(alien.fxImpactID) alien.sBeamLOS = NULL EXIT ELSE //UPDATE_ALIEN_PED_BEAM_EVO(alien) UPDATE_BEAM_CAMERA_IMPACT(alien) ENDIF // do collision //SET_ENTITY_RENDER_SCORCHED(PLAYER_PED_ID(), FALSE) v1 = GET_ENTITY_COORDS(alien.projectorID) v2 = v1 + (GET_ENTITY_FORWARD_VECTOR(alien.projectorID) * (alien.fBeamLength + 3)) IF (alien.sBeamLOS = NULL) alien.sBeamLOS = START_SHAPE_TEST_LOS_PROBE(v1, v2, SCRIPT_INCLUDE_ALL, alien.pedID) ELSE st = GET_SHAPE_TEST_RESULT(alien.sBeamLOS, hits, pos, norm, hitEntity) IF (st = SHAPETEST_STATUS_NONEXISTENT) alien.sBeamLOS = NULL ELIF (st = SHAPETEST_STATUS_RESULTS_READY) IF (hits > 0) alien.iLastImpactFrame = GET_FRAME_COUNT() SET_ENTITY_RENDER_SCORCHED(PLAYER_PED_ID(), TRUE) alien.vLastHitPoint = GET_CLOSEST_POINT_ON_LINE(pos, v1, v2, FALSE) SET_ENTITY_COORDS(alien.impactID, alien.vLastHitPoint) alien.fBeamLength = GET_DISTANCE_BETWEEN_ENTITIES(alien.impactID, alien.projectorID) // check for hit damage plyrPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) IF GET_DISTANCE_BETWEEN_COORDS(alien.vLastHitPoint, plyrPos) <= 0.70 fRegenMultiplier = 0.0 IF ABSF(alien.vLastHitPoint.z - plyrPos.z) < 1.0 // fake a reaction by the player character IF GET_FRAME_COUNT() % 20 = 0 SHOOT_SINGLE_BULLET_BETWEEN_COORDS(v1, v2, 0, TRUE, WEAPONTYPE_PISTOL, NULL, FALSE) ENDIF IF (bAlienBeamKnockDown = TRUE) APPLY_FORCE_TO_ENTITY(PLAYER_PED_ID(), APPLY_TYPE_IMPULSE, fAlienBeamKnockDownForce * GET_ENTITY_FORWARD_VECTOR(alien.projectorID), <<0,0,0>>, 0, FALSE, TRUE, TRUE) ENDIF // B*942972 IF (bBeamArmorHelpDisplayed = FALSE) IF (GET_PED_ARMOUR(PLAYER_PED_ID()) > 0) PRINT_HELP("BAR1_MIND_HLP") bBeamArmorHelpDisplayed = TRUE ENDIF ENDIF // damage outpuy IF (GET_GAME_TIMER() > alien.iNextDamageTime) PLAY_MICHAEL_DIALOG_LINES() hits = GET_RANDOM_INT_IN_RANGE(0, 6) SWITCH GET_RANDOM_INT_IN_RANGE(0, 3) CASE 0 APPLY_PED_BLOOD_SPECIFIC(PLAYER_PED_ID(),hits,0.657,0.566,126.360,0.07,1,0,"cs_trev1_blood") BREAK CASE 1 APPLY_PED_BLOOD_SPECIFIC(PLAYER_PED_ID(),hits,0.582,0.383,111.360,0.05,3,0,"cs_trev1_blood") BREAK CASE 2 APPLY_PED_BLOOD_SPECIFIC(PLAYER_PED_ID(),hits,0.709,0.396,126.360,0.00,3,0,"cs_trev1_blood") BREAK DEFAULT APPLY_PED_BLOOD_SPECIFIC(PLAYER_PED_ID(),hits,0.582,0.383,200.360,0.1,2,0,"cs_trev1_blood") BREAK ENDSWITCH IF ((GET_ENTITY_HEALTH(PLAYER_PED_ID()) - iAlienBeamDamage) <= 100) FLEE_ALL_ALIEN_PEDS() CLEANUP_ALL_ALIEN_PEDS(TRUE) DEATH_SEQUENCE(v1, v2)// GET_ENTITY_FORWARD_VECTOR(alien.projectorID)) EXIT ELSE APPLY_DAMAGE_TO_PED(PLAYER_PED_ID(), iAlienBeamDamage, FALSE) ENDIF alien.iNextDamageTime = GET_GAME_TIMER() + ROUND(iAlienBeamDamageDelay * 1.25) SET_CONTROL_SHAKE(PLAYER_CONTROL, iAlienBeamDamageDelay / 2, 255) SET_CONTROL_SHAKE(PLAYER_CONTROL, iAlienBeamDamageDelay / 2, 255) ENDIF ENDIF ENDIF ENDIF alien.sBeamLOS = NULL ENDIF ENDIF IF IS_ENTITY_ALIVE(alien.impactID) SET_ENTITY_COORDS(alien.impactID, GET_ENTITY_COORDS(alien.projectorID) + (GET_ENTITY_FORWARD_VECTOR(alien.projectorID) * alien.fBeamLength)) ENDIF IF DOES_PARTICLE_FX_LOOPED_EXIST(alien.fxBeamID) SET_PARTICLE_FX_LOOPED_FAR_CLIP_DIST(alien.fxBeamID, alien.fBeamLength) ENDIF IF NOT DOES_PARTICLE_FX_LOOPED_EXIST(alien.fxImpactID) alien.fxImpactID = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_alien_impact", alien.impactID, <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>, fAlienImpactEffectSize) ENDIF ENDPROC /// PURPOSE: /// This handles the aliens day to day stuff /// PARAMS /// alien - alien ped reference PROC UPDATE_ALIEN_PED(ALIEN_PED &alien) VECTOR pos FLOAT z // handle clean up IF NOT DOES_ENTITY_EXIST(alien.pedID) CLEANUP_ALIEN_PED(alien) EXIT ENDIF IF UPDATE_ALIEN_DEAD_CHECKING(alien) IF (iAlienSummonerIndex = alien.iAlienIndex) IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Alien Summoner ", alien.iAlienIndex, " has been vanquished") ENDIF iAlienSummonerIndex = -1 ENDIF ENDIF HANDLE_PLAYING_ALIEN_CLICKING_SOUND(alien) // update the beam projector IF DOES_ENTITY_EXIST(alien.projectorID) pos = GET_PED_BONE_COORDS(alien.pedID, BONETAG_HEAD, vAlienBeamEmitterOffset) SET_ENTITY_COORDS_NO_OFFSET(alien.projectorID, pos) SET_ENTITY_COLLISION(alien.projectorID, FALSE) ENDIF // if the alien is in a beam state while summon is going on kick him out of it IF IS_ALIEN_IN_BEAM_STATE(alien) AND (bSummonFlagActive = TRUE) IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Alien", alien.iAlienIndex, " is watching summon") ENDIF TASK_PLAY_ANIM(alien.pedID, sMissionAnimDictionary, sAlienWatchAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) REMOVE_ALIEN_PARTICLE_FX(alien) SAFE_STOP_AND_RELEASE_SOUND_ID(alien.mindCtrlSoundID) alien.aState = AS_WATCH_SUMMON alien.sBeamLOS = NULL ENDIF // shut down blip if player leaves area so we can put the direction blip back on IF NOT (bIsPlayerInBattleArea) IF (alien.blipID <> NULL) SAFE_REMOVE_BLIP(alien.blipID) ENDIF ELIF IS_ALIEN_IN_BATTLE_STATE(alien) AND (alien.blipID = NULL) alien.blipID = CREATE_PED_BLIP(alien.pedID) ENDIF // update states SWITCH (alien.aState) CASE AS_DELAY // delay before teleport in IF (GET_GAME_TIMER() > alien.iTimer) alien.bHasDamaged = FALSE alien.sBeamLOS = NULL alien.aState = AS_TELEPORT_FXSTART alien.fPedAlpha = 0.0 SET_ENTITY_ALPHA(alien.pedID, FLOOR(alien.fPedAlpha), FALSE) ENDIF BREAK CASE AS_TELEPORT_FXSTART // start teleport SET_ENTITY_COLLISION(alien.pedID, FALSE) FREEZE_ENTITY_POSITION(alien.pedID, TRUE) SET_PED_CAN_BE_TARGETTED(alien.pedID, FALSE) SET_ENTITY_HEADING_FACE_PLAYER(alien.pedID) //SET_PED_RELATIONSHIP_GROUP_HASH(alien.pedID, RELGROUPHASH_PLAYER) TASK_PLAY_ANIM(alien.pedID, sMissionAnimDictionary, sAlienTeleportAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_alien_teleport", alien.pedID, <<0, 0, 0>>, <<0, 0, 0>>, fAlienTeleportEffectSize) alien.iTimer = GET_GAME_TIMER() + TELEPORT_TIME alien.aState = AS_TELEPORT SET_PED_NAME_DEBUG(alien.pedID, "TELEPORT ST") PLAY_SOUND_FROM_ENTITY(-1, "SPAWN", alien.pedID, "BARRY_01_SOUNDSET") SAFE_REMOVE_BLIP(alien.blipID) BREAK CASE AS_TELEPORT alien.fPedAlpha += GET_FRAME_TIME() * 512.0 IF (alien.fPedAlpha >= 255) alien.fPedAlpha = 255 ENDIF IF (GET_GAME_TIMER() > alien.iTimer) FREEZE_ENTITY_POSITION(alien.pedID, FALSE) SET_ENTITY_INVINCIBLE(alien.pedID, FALSE) SET_PED_CAN_BE_TARGETTED(alien.pedID, TRUE) SET_ENTITY_COLLISION(alien.pedID, TRUE) SET_ENTITY_VISIBLE(alien.pedID, TRUE) alien.fPedAlpha = 255 SET_PED_RELATIONSHIP_GROUP_HASH(alien.pedID, RELGROUPHASH_HATES_PLAYER) SET_PED_NAME_DEBUG(alien.pedID, "ACTIVE") alien.aState = AS_ACTIVE ENDIF IF (alien.fPedAlpha < 255) SET_PED_ALPHA(alien.pedID, FLOOR(alien.fPedAlpha), iAlphaCounter) ELSE RESET_ENTITY_ALPHA(alien.pedID) ENDIF BREAK CASE AS_TELEPORT_OUT_START FREEZE_ENTITY_POSITION(alien.pedID, TRUE) SET_ENTITY_INVINCIBLE(alien.pedID, TRUE) SET_ENTITY_COLLISION(alien.pedID, FALSE) SET_PED_CAN_BE_TARGETTED(alien.pedID, FALSE) TASK_PLAY_ANIM(alien.pedID, sMissionAnimDictionary, sAlienTeleportAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) //SET_PED_RELATIONSHIP_GROUP_HASH(alien.pedID, RELGROUPHASH_PLAYER) REMOVE_ALIEN_PARTICLE_FX(alien) SAFE_REMOVE_BLIP(alien.blipID) SAFE_STOP_AND_RELEASE_SOUND_ID(alien.mindCtrlSoundID) START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_alien_teleport", GET_ENTITY_COORDS(alien.pedID), GET_ENTITY_ROTATION(alien.pedID), fAlienTeleportEffectSize) PLAY_SOUND_FROM_ENTITY(-1, "SPAWN", alien.pedID, "BARRY_01_SOUNDSET") alien.iTimer = GET_GAME_TIMER() + TELEPORT_TIME alien.aState = AS_TELEPORT_OUT SET_PED_NAME_DEBUG(alien.pedID, "TPORT OUT") BREAK CASE AS_TELEPORT_OUT alien.fPedAlpha = ((alien.iTimer - GET_GAME_TIMER()) * 255) / TO_FLOAT(TELEPORT_TIME) //CPRINTLN(DEBUG_MISSION, "ALIEN ALPHA", alien.fPedAlpha ) IF (alien.fPedAlpha < 0.0) alien.fPedAlpha = 0.0 ENDIF SET_PED_ALPHA(alien.pedID, FLOOR(alien.fPedAlpha), iAlphaCounter) IF (GET_GAME_TIMER() > alien.iTimer) OR (alien.fPedAlpha = 0.0) SET_PED_NAME_DEBUG(alien.pedID, "RELOCATE") alien.aState = AS_RELOCATE ENDIF BREAK CASE AS_RELOCATE //SET_PED_RELATIONSHIP_GROUP_HASH(alien.pedID, RELGROUPHASH_PLAYER) SET_ENTITY_VISIBLE(alien.pedID, FALSE) SET_ENTITY_COLLISION(alien.pedID, FALSE) SET_PED_CAN_BE_TARGETTED(alien.pedID, FALSE) IF (bKillAliensOnTeleportOut = TRUE) DELETE_ALIEN_PED(alien) alien.bIsActive = FALSE EXIT ENDIF // teleport to a new location IF GENERATE_ALIEN_SPAWN_POINT(pos) SET_ENTITY_COORDS_GROUNDED(alien.pedID, pos) alien.iTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1250, 2000) alien.fBeamTriggerRange = fAlienBeamStartRange + (GET_RANDOM_FLOAT_IN_RANGE(fAlienMinBeamTriggerVariance, fAlienMaxBeamTriggerVariance) * fAlienBeamStartRange) IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " Beam Trigger Range = ", alien.fBeamTriggerRange ) ENDIF alien.aState = AS_DELAY ENDIF BREAK CASE AS_ACTIVE SET_PED_NAME_DEBUG(alien.pedID, "ACTIVE") IF NOT alien.bWallSpawn IF GET_SCRIPT_TASK_STATUS(alien.pedID, SCRIPT_TASK_GO_TO_ENTITY) <> PERFORMING_TASK TASK_GO_TO_ENTITY(alien.pedID, PLAYER_PED_ID()) ENDIF ENDIF IF NOT IS_MISSION_IN_COMBAT_STAGE() EXIT ENDIF IF CAN_ALIEN_SUMMON(alien) SET_PED_DESIRED_MOVE_BLEND_RATIO(alien.pedID, PEDMOVE_SPRINT) IF (alien.fDistToPlayer < (fAlienSummonRange + 8.0)) alien.aState = AS_SUMMON_RUSH IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " has started summon rush") ENDIF bSummonRushFlagActive = TRUE ENDIF ELIF (alien.fDistToPlayer < (alien.fBeamTriggerRange + 12.0)) IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " has started charge rush") ENDIF alien.aState = AS_CHARGE_RUSH ENDIF BREAK CASE AS_SUMMON_RUSH UPDATE_ALIEN_SUMMON_RUSH(alien) BREAK CASE AS_SUMMON_START UPDATE_ALIEN_SUMMON(alien) BREAK CASE AS_SUMMON_FAIL SET_PED_NAME_DEBUG(alien.pedID, "SUMMON FAIL") IF (iAlienSummonerIndex = alien.iAlienIndex) iAlienSummonerIndex = -1 ENDIF // Speed up and shorten Michael's win anim to get back in the action faster IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedFailAnim) //SET_ENTITY_ANIM_SPEED(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedFailAnim, 1.5) //IF GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedFailAnim) >= 0.735 // CPRINTLN(DEBUG_MISSION, "AS_SUMMON_FAIL: Stopping anim ", sAlienGrabbedFailAnim) // STOP_ANIM_TASK(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedFailAnim, SLOW_BLEND_OUT) //ENDIF ELIF (GET_GAME_TIMER() > alien.iTimer) IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "AS_SUMMON_FAIL: Alien ", alien.iAlienIndex, " is teleporting out") ENDIF IF NOT IS_PED_USING_ACTION_MODE(PLAYER_PED_ID()) CPRINTLN(DEBUG_MISSION, "Putting Player back into action mode") SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE) ENDIF // @SBA - fix rare case in which player is unable to reload after an abduction attempt IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), PlayerWeapon) IF GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), PlayerWeapon) > 0 INT iAmmoLeft //CPRINTLN(DEBUG_MISSION, "AS_SUMMON_FAIL: Player's weapon ", GET_WEAPON_NAME(PlayerWeapon), " has ammo.") IF GET_AMMO_IN_CLIP(PLAYER_PED_ID(), PlayerWeapon, iAmmoLeft) IF iAmmoLeft = 0 CPRINTLN(DEBUG_MISSION, "AS_SUMMON_FAIL: Player's clip is empty for weapon ", GET_WEAPON_NAME(PlayerWeapon), ". Refilling clip.") REFILL_AMMO_INSTANTLY(PLAYER_PED_ID()) ENDIF ENDIF ENDIF ENDIF bSummonFlagActive = FALSE alien.aState = AS_TELEPORT_OUT_START EXIT ENDIF BREAK CASE AS_WATCH_SUMMON SET_PED_NAME_DEBUG(alien.pedID, "WATCH") IF (bSummonFlagActive = TRUE) IF GET_SCRIPT_TASK_STATUS(alien.pedID, SCRIPT_TASK_PLAY_ANIM) <> PERFORMING_TASK TASK_PLAY_ANIM(alien.pedID, sMissionAnimDictionary, sAlienWatchAnim, SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING) ENDIF EXIT ENDIF alien.aState = AS_WATCH_SUMMON_END alien.iTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(iAlienWatchSummonTimeOut - 1500, iAlienWatchSummonTimeOut - 500) BREAK CASE AS_WATCH_SUMMON_END SET_PED_NAME_DEBUG(alien.pedID, "WATCH END") IF (GET_GAME_TIMER() > alien.iTimer) AND NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedFailAnim) alien.aState = AS_ACTIVE ENDIF BREAK CASE AS_CHARGE_RUSH REMOVE_ALIEN_PARTICLE_FX(alien) SET_PED_RESET_FLAG(alien.pedID, PRF_InfiniteStamina, TRUE) SET_PED_NAME_DEBUG(alien.pedID, "C-RUSH") IF NOT alien.bWallSpawn SET_PED_MOVE_RATE_OVERRIDE(alien.pedID, 1.15) SET_PED_DESIRED_MOVE_BLEND_RATIO(alien.pedID, PEDMOVE_SPRINT) IF GET_SCRIPT_TASK_STATUS(alien.pedID, SCRIPT_TASK_GO_TO_ENTITY) <> PERFORMING_TASK TASK_GO_TO_ENTITY(alien.pedID, PLAYER_PED_ID()) ENDIF ENDIF IF (alien.fDistToPlayer < alien.fBeamTriggerRange) AND IS_MISSION_IN_COMBAT_STAGE() PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(alien.pedID, "ALIEN_HOSTILE", "ALIENS", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR) alien.aState = AS_CHARGE_START alien.sBeamLOS = NULL ELIF bSummonFlagActive alien.aState = AS_WATCH_SUMMON ENDIF BREAK CASE AS_CHARGE SET_ENTITY_COORDS(alien.impactID, GET_ENTITY_COORDS(alien.projectorID)) SET_PED_NAME_DEBUG(alien.pedID, "CHARGE") IF (GET_GAME_TIMER() > alien.iTimer) IF IS_MISSION_IN_COMBAT_STAGE() SAFE_REMOVE_PARTICLE_FX(alien.fxSummonID) SAFE_REMOVE_PARTICLE_FX(alien.fxChargeID) SAFE_REMOVE_PARTICLE_FX(alien.fxBeamID) SAFE_REMOVE_PARTICLE_FX(alien.fxImpactID) IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " is firing") ENDIF alien.aState = AS_BEAM_START ENDIF ENDIF BREAK CASE AS_CHARGE_START UPDATE_ALIEN_CHARGE_START(alien) BREAK CASE AS_BEAM_START IF NOT IS_PED_RUNNING_RAGDOLL_TASK(alien.pedID) SET_PED_NAME_DEBUG(alien.pedID, "BEAM ST") SET_ENTITY_HEADING_FACE_PLAYER(alien.pedID) pos = GET_PED_BONE_COORDS(PLAYER_PED_ID(), BONETAG_HEAD, <<0, 0, 0>>) SET_ENTITY_ROTATION_FACE_COORDS(alien.projectorID, pos) alien.iTimer = GET_GAME_TIMER() + iAlienBeamShootTime SAFE_REMOVE_PARTICLE_FX(alien.fxSummonID) SAFE_REMOVE_PARTICLE_FX(alien.fxChargeID) SAFE_REMOVE_PARTICLE_FX(alien.fxBeamID) SAFE_REMOVE_PARTICLE_FX(alien.fxImpactID) alien.fBeamLength = 0.0 alien.fxChargeID = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_alien_impact", alien.projectorID, <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>, fAlienImpactEffectSize / 3.0) alien.fxBeamID = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_alien_beam", alien.projectorID, <<0.0, 0.0, 0.0>>, vAlienBeamRotationVector, fAlienBeamEffectSize) SET_PARTICLE_FX_LOOPED_FAR_CLIP_DIST(alien.fxBeamID, alien.fBeamLength) TASK_PLAY_ANIM(alien.pedID, sMissionAnimDictionary, "MIND_CONTROL_B_Loop", SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) alien.aState = AS_BEAM ENDIF BREAK CASE AS_BEAM UPDATE_ALIEN_BEAM(alien) BREAK CASE AS_BEAM_KNOCKDOWN alien.fBeamLength = 0 IF IS_ENTITY_ALIVE(alien.pedID) IF IS_PED_FALLING(alien.pedID) OR IS_PED_GETTING_UP(alien.pedID) OR IS_PED_RAGDOLL(alien.pedID) OR IS_PED_RUNNING_RAGDOLL_TASK(alien.pedID) EXIT ENDIF ENDIF IF GET_SCRIPT_TASK_STATUS(alien.pedID, SCRIPT_TASK_PLAY_ANIM) <> PERFORMING_TASK TASK_PLAY_ANIM(alien.pedID, sMissionAnimDictionary, "MIND_CONTROL_B_LOOP", REALLY_SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) ENDIF IF GET_SCRIPT_TASK_STATUS(alien.pedID, SCRIPT_TASK_PLAY_ANIM) = PERFORMING_TASK SET_ENTITY_HEADING(alien.projectorID, GET_ENTITY_HEADING(alien.pedID)) IF NOT DOES_PARTICLE_FX_LOOPED_EXIST(alien.fxChargeID) alien.fxChargeID = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_alien_charging", alien.projectorID, <<0, 0, 0>>, <<0, 0, 0>>, fAlienChargeEffectSize) ENDIF IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " has resumed beam firing") ENDIF alien.aState = AS_BEAM ENDIF BREAK CASE AS_DYING IF HAS_ALIEN_FINSHED_DYING(alien) OR (GET_GAME_TIMER() > alien.iTimer) pos = GET_ENTITY_COORDS(alien.pedID) IF GET_GROUND_Z_FOR_3D_COORD(pos, z) pos.z = z ENDIF START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_alien_disintegrate", alien.pedID, <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>, fAlienDeathEffectSize) PLAY_SOUND_FROM_COORD(-1, "DESPAWN", pos, "BARRY_01_SOUNDSET") IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " is started dead") ENDIF alien.aState = AS_DEAD SET_PED_NAME_DEBUG(alien.pedID, "DEAD") alien.iTimer = GET_GAME_TIMER() + ALIEN_FADE_TIME ENDIF BREAK CASE AS_DEAD alien.fPedAlpha = ((alien.iTimer - GET_GAME_TIMER()) * 255) / TO_FLOAT(ALIEN_FADE_TIME) //CPRINTLN(DEBUG_MISSION, "ALIEN ALPHA", alien.fPedAlpha ) IF (alien.fPedAlpha < 0.0) alien.fPedAlpha = 0.0 ENDIF IF IS_ENTITY_ON_SCREEN(alien.pedID) SET_PED_ALPHA(alien.pedID, FLOOR(alien.fPedAlpha), iAlphaCounter) ELSE RESET_ENTITY_ALPHA(alien.pedID) ENDIF IF (GET_GAME_TIMER() > alien.iTimer) OR (alien.fPedAlpha <= 0.0) IF bDebugTTYSpew = TRUE CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " is dead") ENDIF RESET_ENTITY_ALPHA(alien.pedID) DELETE_ALIEN_PED(alien) alien.bIsActive = FALSE EXIT ENDIF BREAK ENDSWITCH ENDPROC /// PURPOSE: /// This handles all aliens day to day stuff PROC UPDATE_ALIEN_PEDS() INT i = 0 iAlienAliveCount = 0 REPEAT (COUNT_OF(alienPed)) i IF (alienPed[i].bIsActive) UPDATE_ALIEN_PED(alienPed[i]) iAlienAliveCount ++ ENDIF ENDREPEAT // clear the summoner index if time out is active IF (GET_GAME_TIMER() < iAlienNextSummonTime) iAlienSummonerIndex = -1 ELIF (iAlienSummonerIndex = -1) UPDATE_NEXT_ALIEN_SUMMONER_INDEX() ENDIF ENDPROC /// PURPOSE: /// This teleports out all aliens /// PARAMS: /// tWait - If this is set pause script for 2000ms while aliens teleport out PROC TELEPORT_OUT_ALL_ALIEN_PEDS(BOOL tWait = FALSE) INT i = 0 INT n = 0 bKillAliensOnTeleportOut = TRUE REPEAT COUNT_OF(alienPed) i IF IS_ALIEN_PED_ALIVE(alienPed[i]) alienPed[i].aState = AS_TELEPORT_OUT_START n ++ ENDIF ENDREPEAT IF (tWait = FALSE) OR (n = 0) EXIT ENDIF i = GET_GAME_TIMER() + 2000 WHILE (GET_GAME_TIMER() < i) UPDATE_ALIEN_PEDS() WAIT(0) ENDWHILE ENDPROC //---------------------- // DEBUG FUNCTIONS //---------------------- #IF IS_DEBUG_BUILD /// PURPOSE: /// Initializes Debug Widgets PROC SETUP_DEBUG_WIDGETS() SET_PROFILING_OF_THIS_SCRIPT(TRUE) m_WidgetGroup = START_WIDGET_GROUP("Barry 1 Config") START_WIDGET_GROUP("Test Options") ADD_WIDGET_BOOL("Show Debug Stuff", bDebugTTYSpew) ADD_WIDGET_BOOL("Show Mission Timer", bShowDebugMissionTime) ADD_WIDGET_BOOL("Update Widgets", bUpdateWidgets) ADD_WIDGET_BOOL("Show Alien Pos", bShowAlienPos) ADD_WIDGET_BOOL("bUseIsAreaOccupied", bUseIsAreaOccupied) ADD_WIDGET_FLOAT_READ_ONLY("Player Regen Muliplier", fRegenMultiplier) ADD_WIDGET_FLOAT_SLIDER("Player Damage Muliplier", fPlayerWeaponDamageModifier, 0.0, 5.0, 0.05) STOP_WIDGET_GROUP() START_WIDGET_GROUP("Spawn Options") ADD_WIDGET_INT_SLIDER("Max Active Aliens", iMaxActiveAliens, 0, COUNT_OF(alienPed) - 1, 1) ADD_WIDGET_FLOAT_SLIDER("Minimum Spawn Range", fAlienMinSpawnRadius, 5.0, 100.0, 0.5) ADD_WIDGET_FLOAT_SLIDER("Maximum Spawn Range", fAlienMaxSpawnRadius, 10.0, 150.0, 0.5) ADD_WIDGET_INT_SLIDER("Aliens Kill Limit", iTotalAlienDeadRequired, 1, 100, 1) ADD_WIDGET_INT_SLIDER("Alien Max HP", iAlienMaxHP, 200, 20000, 125) ADD_WIDGET_BOOL("Use Custom Spawn Point", bUseAlienSpawnPoint) ADD_WIDGET_VECTOR_SLIDER("Spawn Point Position", vAlienSpawnPoint, -6000.0, 6000.0, 0.5) ADD_WIDGET_FLOAT_SLIDER("Spawn Point Radius", fAlienSpawnPointRadius, 5.0, 100.0, 0.5) STOP_WIDGET_GROUP() START_WIDGET_GROUP("Area Options") ADD_WIDGET_BOOL("Player In Battle Area", bIsPlayerInBattleArea) ADD_WIDGET_VECTOR_SLIDER("Battle Center", vBattleCenter, -6000.0, 6000.0, 0.5) ADD_WIDGET_FLOAT_SLIDER("Battle Range", fBattleRadius, 5.0, 1000.0, 0.5) STOP_WIDGET_GROUP() START_WIDGET_GROUP("Beam Special Attack") START_WIDGET_GROUP("Parameters") ADD_WIDGET_FLOAT_SLIDER("Attack Range", fAlienBeamStartRange, 1, 40.0, 0.5) ADD_WIDGET_INT_SLIDER("Charge Time", iAlienBeamChargeTime, 500, 20000, 500) ADD_WIDGET_INT_SLIDER("Duration", iAlienBeamShootTime, 3000, 60000, 500) ADD_WIDGET_FLOAT_SLIDER("Maximum Length", fAlienBeamMaximumLength, 0, 200.0, 0.5) ADD_WIDGET_FLOAT_SLIDER("Length Increase", fAlienBeamLengthInc, 0.1, 20.0, 0.5) ADD_WIDGET_FLOAT_SLIDER("Min Trigger Variance", fAlienMinBeamTriggerVariance, -1.0, 0.0, 0.05) ADD_WIDGET_FLOAT_SLIDER("Max Trigger Variance", fAlienMaxBeamTriggerVariance, 0.0, 1.0, 0.05) STOP_WIDGET_GROUP() START_WIDGET_GROUP("Damage Options") ADD_WIDGET_BOOL("Apply Pushback Force", bAlienBeamKnockDown) ADD_WIDGET_FLOAT_SLIDER("Force Scalar", fAlienBeamKnockDownForce, 0, 20.0, 0.25) ADD_WIDGET_INT_SLIDER("Damage", iAlienBeamDamage, 0, 100, 1) ADD_WIDGET_INT_SLIDER("Damage Rate", iAlienBeamDamageDelay, 1, 2000, 25) STOP_WIDGET_GROUP() START_WIDGET_GROUP("Emitter Options") ADD_WIDGET_VECTOR_SLIDER("Beam Rotation", vAlienBeamRotationVector, -360.0, 360.0, 0.5) ADD_WIDGET_VECTOR_SLIDER("Beam Offset", vAlienBeamEmitterOffset, -10.0, 10.0, 0.5) ADD_WIDGET_FLOAT_SLIDER("Radius", fAlienBeamEffectSize, 0.001, 10.0, 0.025) STOP_WIDGET_GROUP() START_WIDGET_GROUP("FX Options") ADD_WIDGET_FLOAT_SLIDER("Charge Effect Scale", fAlienChargeEffectSize, 0, 5.0, 0.025) ADD_WIDGET_FLOAT_SLIDER("Death Effect Scale", fAlienDeathEffectSize, 0, 5.0, 0.025) ADD_WIDGET_FLOAT_SLIDER("Impact Effect Scale", fAlienImpactEffectSize, 0, 5.0, 0.025) ADD_WIDGET_FLOAT_SLIDER("Teleport Effect Scale", fAlienTeleportEffectSize, 0, 5.0, 0.025) STOP_WIDGET_GROUP() STOP_WIDGET_GROUP() START_WIDGET_GROUP("Summon Special Attack") ADD_WIDGET_BOOL("Allow Summoning", bAllowSummoning) START_WIDGET_GROUP("Parameters") ADD_WIDGET_FLOAT_SLIDER("Attack Range", fAlienSummonRange, 1, 20.0, 0.5) ADD_WIDGET_INT_SLIDER("Mash Limit", iAlienButtonMashLimit, 1, 20, 1) ADD_WIDGET_INT_SLIDER("Duration", iAlienSummonTimeLength, 3000, 20000, 500) ADD_WIDGET_INT_SLIDER("Time Out", iAlienNextSummonTimeOut, 3000, 60000, 500) ADD_WIDGET_INT_SLIDER("Watch Time Out", iAlienWatchSummonTimeOut, 1000, 8000, 500) STOP_WIDGET_GROUP() START_WIDGET_GROUP("Read Only Values") ADD_WIDGET_INT_READ_ONLY("Current Game Time", iCurrentGameTime) ADD_WIDGET_INT_READ_ONLY("Next Summon Time", iAlienNextSummonTime) ADD_WIDGET_INT_READ_ONLY("Summoner Index", iAlienSummonerIndex) ADD_WIDGET_BOOL("Is Summon Rush Active", bSummonRushFlagActive) ADD_WIDGET_BOOL("Is Summon Active", bSummonFlagActive) STOP_WIDGET_GROUP() STOP_WIDGET_GROUP() START_WIDGET_GROUP("Read Only Values") ADD_WIDGET_INT_READ_ONLY("Current Game Time", iCurrentGameTime) START_WIDGET_GROUP("Dialog Stats") ADD_WIDGET_BOOL("Has First Outburst", bHasInitialOutburst) ADD_WIDGET_INT_READ_ONLY("Initial Speech Time", iFirstDialogTime) ADD_WIDGET_INT_READ_ONLY("Next Fight Dialog Time", iNextFightDialogTime) ADD_WIDGET_INT_READ_ONLY("Next Freak Dialog Time", iNextFreakDialogTime) ADD_WIDGET_INT_READ_ONLY("Next Damage Dialog Time", iNextDamageDialogTime) STOP_WIDGET_GROUP() START_WIDGET_GROUP("Mission Stats") ADD_WIDGET_INT_READ_ONLY("Total Aliens Spawned", iTotalAlienSpawnCount) ADD_WIDGET_INT_READ_ONLY("Total Aliens Killed", iTotalAlienDeadCount) ADD_WIDGET_INT_READ_ONLY("Total Summon Attempts", iTotalAlienSummonCount) ADD_WIDGET_INT_READ_ONLY("Current Kill Chain", iKillChain) ADD_WIDGET_INT_READ_ONLY("Maximum Kill Chain", iMaxKillChain) STOP_WIDGET_GROUP() STOP_WIDGET_GROUP() STOP_WIDGET_GROUP() ENDPROC /// PURPOSE: /// Removes Debug Widgets PROC CLEANUP_DEBUG_WIDGETS() IF DOES_WIDGET_GROUP_EXIST(m_WidgetGroup) DELETE_WIDGET_GROUP(m_WidgetGroup) ENDIF ENDPROC #ENDIF //---------------------- // SCRIPT FLOW //---------------------- /// PURPOSE: /// Handles the Pass Out Sequence, it's animations and dialog /// PARAMS: /// pWait - Do we wait 2.5 seconds FUNC BOOL PASS_OUT_SEQUENCE(BOOL bPass = FALSE) VECTOR v BOOL bOK = FALSE SEQUENCE_INDEX seqTask CAMERA_INDEX cCamera // do global stuff here UPDATE_ALIEN_PEDS() IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Michael", PLAYER_PED_ID(), GET_ENTITY_MODEL(PLAYER_PED_ID())) SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE) ENDIF SET_CUTSCENE_PED_PROP_VARIATION(sSceneHandleBarry, ANCHOR_EYES, 0) CPRINTLN(DEBUG_MISSION, "PED CUTSCENE VARIATIONS SET") ENDIF // flow of the pass out sequence SWITCH ePassOutStage CASE POS_SETUP // -----setup-------------------------------- IF (bPass = TRUE) RC_REQUEST_CUTSCENE("bar_2_rcm") REQUEST_SCRIPT("postRC_Barry1and2") ENDIF // make player tired [B*540333] //FLEE_ALL_ALIEN_PEDS() PREPARE_MUSIC_EVENT("RC18A_END_OS") CPRINTLN(DEBUG_MISSION, "Interactive Music Event: RC18A_COLLAPSE Prepared") CPRINTLN(DEBUG_MISSION, "Pass Out - 2.5 Second Warm Up") SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) ePassOutStage = POS_WAIT_FOR_TIRED STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 2.0) BREAK CASE POS_WAIT_FOR_TIRED // -----wait for tired-------------------------------- IF (bPass = FALSE) IF IS_ENTITY_OK(gunObject) DETACH_ENTITY(gunObject, DEFAULT, FALSE) ENDIF CPRINTLN(DEBUG_MISSION, "Pass Out - Should be playing the tired anim here") OPEN_SEQUENCE_TASK(seqTask) TASK_PLAY_ANIM(NULL, sMissionAnimDictionary, sExhaustedAnimEnter, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1) TASK_PLAY_ANIM(NULL, sMissionAnimDictionary, sExhaustedAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) CLOSE_SEQUENCE_TASK(seqTask) TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), seqTask) CLEAR_SEQUENCE_TASK(seqTask) ENDIF cCamera = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", GET_GAMEPLAY_CAM_COORD(), GET_GAMEPLAY_CAM_ROT(), GET_GAMEPLAY_CAM_FOV(), TRUE) v = GET_ENTITY_COORDS(PLAYER_PED_ID()) - GET_GAMEPLAY_CAM_COORD() ATTACH_CAM_TO_ENTITY(cCamera, PLAYER_PED_ID(), -v) IF DOES_CAM_EXIST(cCamera) SET_CAM_ACTIVE(cCamera, TRUE) ENDIF // fail safe iFailTimer = GET_GAME_TIMER() + 6000 ADD_PED_FOR_DIALOGUE(convoMichael, ENUM_TO_INT(CHAR_MICHAEL), PLAYER_PED_ID(), "MICHAEL") CPRINTLN(DEBUG_MISSION, "Pass Out - Start Dialog - Going to Start Dialog State") ePassOutStage = POS_START_DIALOG BREAK CASE POS_START_DIALOG // -----start dialog-------------------------------- bOK = FALSE IF (bPass = TRUE) IF CREATE_CONVERSATION(convoMichael, "BARY1AU", "BARY1_PREOUT", CONV_PRIORITY_HIGH) OR (GET_GAME_TIMER() > iFailTimer) IF (GET_GAME_TIMER() < iFailTimer) CPRINTLN(DEBUG_MISSION, "Pass Out - Start Dialog - Conversation Created") ELSE CPRINTLN(DEBUG_MISSION, "Pass Out - Start Dialog - Conversation Not Created - Emergency Abort") ENDIF iFailTimer = GET_GAME_TIMER() + 4500 bOK = TRUE ENDIF ELSE IF PLAY_SINGLE_LINE_FROM_CONVERSATION(convoMichael, "BARY1AU", "BARY1_PREOUT", "BARY1_PREOUT_2", CONV_PRIORITY_HIGH) OR (GET_GAME_TIMER() > iFailTimer) iFailTimer = GET_GAME_TIMER() + 2000 IF (GET_GAME_TIMER() < iFailTimer) CPRINTLN(DEBUG_MISSION, "Pass Out - Start Dialog - Conversation Created") ELSE CPRINTLN(DEBUG_MISSION, "Pass Out - Start Dialog - Conversation Not Created - Emergency Abort") ENDIF bOK = TRUE ENDIF ENDIF IF (bOK = TRUE) CPRINTLN(DEBUG_MISSION, "Pass Out - Start Dialog - We should be ready to play line now") ePassOutStage = POS_TRANSITION_FX ENDIF BREAK CASE POS_TRANSITION_FX bOK = FALSE IF (bPass = TRUE) IF (GET_GAME_TIMER() > iFailTimer) // @SBA - filter for passing out CLEANUP_SCREEN_FX() ANIMPOSTFX_PLAY(FX_DrugsOut, 0, FALSE) // wait for FX white out iFailTimer = GET_GAME_TIMER() + 3500 bOK = TRUE ENDIF ELSE bOK = TRUE ENDIF IF (bOK = TRUE) CPRINTLN(DEBUG_MISSION, "Pass Out - FX should be transitioning") ePassOutStage = POS_WAIT_DIALOGUE ENDIF BREAK CASE POS_WAIT_DIALOGUE IF (bPass = TRUE) bOK = (GET_GAME_TIMER() > iFailTimer) ELSE IF (GET_GAME_TIMER() < iFailTimer) CPRINTLN(DEBUG_MISSION, "Pass Out - Start Dialog - Conversation Finished") ELSE CPRINTLN(DEBUG_MISSION, "Pass Out - Start Dialog - Conversation Not Finished - Emergency Abort") ENDIF CPRINTLN(DEBUG_MISSION, "Pass Out - Setting Player To Rag Doll") CPRINTLN(DEBUG_MISSION, "Interactive Music Event: RC18A_COLLAPSE") // To slow down his ragdoll fall SET_TIME_SCALE(0.6) // make the player pass out gunObject = CREATE_FAKE_WEAPON_FOR_PLAYER(playerWeapon) IF IS_ENTITY_OK(PLAYER_PED_ID()) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) SET_PED_TO_RAGDOLL(PLAYER_PED_ID(), 7000, 7500, TASK_RELAX, FALSE, FALSE) // if for any reason the gun hasn't detached... IF IS_ENTITY_OK(gunObject) AND IS_ENTITY_ATTACHED(gunObject) DETACH_ENTITY(gunObject, DEFAULT, FALSE) ENDIF ENDIF bOK = TRUE ENDIF IF (bOK = TRUE) CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_END_OS") TRIGGER_MUSIC_EVENT("RC18A_END_OS") iFailTimer = GET_GAME_TIMER() + 1000 //3500 ePassOutStage = POS_WAIT_PASS_OUT ENDIF BREAK CASE POS_WAIT_PASS_OUT // ----wait for player to pass out-------------------------------- IF GET_GAME_TIMER() > iFailTimer IF (bPass = TRUE) // put this in a proc and call in fail too??? //CLEANUP_ALL_ALIEN_PEDS(FALSE) SAFE_DELETE_OBJECT(gunObject) IF DOES_CAM_EXIST(cCamera) SET_CAM_ACTIVE(cCamera, FALSE) DESTROY_CAM(cCamera) ENDIF SHAKE_GAMEPLAY_CAM("DRUNK_SHAKE", 0) SET_TIME_SCALE(1.0) DEACTIVATE_AUDIO_SLOWMO_MODE("BARRY_01_SLOWMO") SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", FALSE) SET_AUDIO_FLAG("AllowAmbientSpeechInSlowMo", FALSE) CLEAR_AREA_OF_VEHICLES(vMissionStart, 200.0) REMOVE_DECALS_IN_RANGE(vMissionStart, 500.0) CLEAR_AMBIENT_ZONE_STATE(sAmbientZone, TRUE) IF IS_ENTITY_OK(PLAYER_PED_ID()) RESET_PED_VISIBLE_DAMAGE(PLAYER_PED_ID()) CLEAR_PED_BLOOD_DAMAGE(PLAYER_PED_ID()) ENDIF ENDIF CPRINTLN(DEBUG_MISSION, "Pass Out - Complete") RETURN TRUE // completed the pass out sequence ENDIF BREAK ENDSWITCH RETURN FALSE // not completed the pass out sequence ENDFUNC /// PURPOSE: /// Loads Mission Assets /// PARAMS: /// loadWait - if this is true pause script until all assets are loaded PROC REQUEST_MISSION_ASSETS() ADD_ASSET_REQUEST_FOR_WEAPON(assetRequester, 0, wtMiniGun) ADD_ASSET_REQUEST_FROM_STRING(assetRequester, 1, ASSET_AUDIOBANK, "SCRIPT\\BARRY_01_ALIEN_A") ADD_ASSET_REQUEST_FROM_STRING(assetRequester, 2, ASSET_AUDIOBANK, "SCRIPT\\BARRY_01_ALIEN_B") ADD_ASSET_REQUEST_FROM_STRING(assetRequester, 3, ASSET_AUDIOBANK, "SCRIPT\\BARRY_01_ALIEN_C") ADD_ASSET_REQUEST_FOR_MODEL(assetRequester, 4, alienModel) ADD_ASSET_REQUEST_FOR_MODEL(assetRequester, 5, beamDummyModel) ADD_ASSET_REQUEST_FOR_TEXT(assetRequester, 6, "BARY1", MISSION_TEXT_SLOT) ADD_ASSET_REQUEST_FOR_PTFX(assetRequester, 7) ADD_ASSET_REQUEST_FROM_STRING(assetRequester, 8, ASSET_ANIMDICT, sMissionAnimDictionary) // @SBA - adding new assests below here ADD_ASSET_REQUEST_FOR_MODEL(assetRequester, 9, mnProtestSign) //ADD_ASSET_REQUEST_FOR_WEAPON(assetRequester, 9, wtSniperRifle) //ADD_ASSET_REQUEST_FOR_WEAPON(assetRequester, 10, wtPistol) //ADD_ASSET_REQUEST_FOR_WEAPON(assetRequester, 11, wtGrenLauncher) ENDPROC /// PURPOSE: /// Unloads all current mission assets - marks models as not needed etc PROC UNLOAD_MISSION_ASSETS() UNLOAD_REQUESTED_ASSETS(assetRequester) //CLEAR_ADDITIONAL_TEXT(MISSION_DIALOGUE_TEXT_SLOT, FALSE) ENDPROC /// PURPOSE: /// Cleans mission PROC MISSION_SETUP() // my mission setup - these things are only done once CPRINTLN(DEBUG_MISSION, " ") CPRINTLN(DEBUG_MISSION, "BARRY 1 - VERSION:", MISSION_VERSION) // setup z skip menu #IF IS_DEBUG_BUILD sSkipMenu[Z_SKIP_INTRO].sTxtLabel = "INTRO" sSkipMenu[Z_SKIP_BATTLE].sTxtLabel = "BATTLE" sSkipMenu[Z_SKIP_BATTLE_2].sTxtLabel = "BATTLE P.2" sSkipMenu[Z_SKIP_PASSOUT].sTxtLabel = "COLLAPSE" sSkipMenu[Z_SKIP_OUTRO].sTxtLabel = "OUTRO" SETUP_DEBUG_WIDGETS() #ENDIF // turn off debug lines just in case i forget and shops SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(FALSE) SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(TRUE) // stop police bothering me IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) SET_MAX_WANTED_LEVEL(0) SET_PLAYER_WANTED_LEVEL(GET_PLAYER_INDEX(), 0) SET_PLAYER_WANTED_LEVEL_NOW(GET_PLAYER_INDEX()) ENDIF ENABLE_ALL_DISPATCH_SERVICES(FALSE) DISABLE_CELLPHONE(TRUE) // set weather transition SET_WEATHER_TYPE_OVERTIME_PERSIST("extrasunny", 10.000) SET_ANGLED_AREA(missionBoundary, <<126.585876,-903.245178,87.535141>>, <<266.423584,-956.580627,27.452606>>, 230.000000) // @SBA - set a lager area to cover most of the battle zone //SET_ANGLED_AREA(respotVehicleArea, <<176.729996,-969.593384,37.092262>>, <<195.129456,-941.357605,27.191963>>, 21.500000) SET_ANGLED_AREA(respotVehicleArea, <<168.850021,-1001.023804,23.091291>>, <<225.904175,-862.596924,34.092327>>, 55.000000) // if you don't call this line summmoning will fail POPULATE_ALIEN_INDEX() RESET_MISSION_PARAMETERS() POPULATE_ALIEN_WALL_SPAWN_DATA() SPECIAL_ABILITY_LOCK(GET_PLAYER_PED_MODEL(CHAR_MICHAEL)) SPECIAL_ABILITY_RESET(PLAYER_ID()) DISABLE_CHEAT(CHEAT_TYPE_GIVE_WEAPONS, TRUE) DISABLE_TAXI_HAILING(TRUE) IF IS_REPLAY_IN_PROGRESS()= TRUE // Set up the initial scene for replays CPRINTLN(DEBUG_MISSION, "REPLAY IN PROGRESS", MISSION_VERSION) g_bSceneAutoTrigger = TRUE eInitialSceneStage = IS_REQUEST_SCENE WHILE NOT SetupScene_BARRY_1(sRCLauncherDataLocal) WAIT(0) ENDWHILE g_bSceneAutoTrigger = FALSE ENABLE_AMBIENT_PEDS_AND_VEHICLES(FALSE, FALSE, TRUE, TRUE) BLOCK_SCENARIOS_AND_AMBIENT(scenarioBlock) SET_AMBIENT_ZONE_STATE(sAmbientZone, TRUE) REQUEST_MISSION_ASSETS() WHILE NOT HAVE_ASSET_REQUESTS_LOADED(assetRequester) WAIT(0) ENDWHILE START_REPLAY_SETUP(vPlayerStartPos, kfPlayerStartHead, FALSE) CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_RESTART") TRIGGER_MUSIC_EVENT("RC18A_RESTART") stageEnum = SE_FIRSTCONTACT stageProgress = SP_LOADING IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) CPRINTLN(DEBUG_MISSION, "Please Stop T-Posing...") IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedAnim) STOP_ANIM_TASK(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedAnim) ENDIF IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedIntroAnim) STOP_ANIM_TASK(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedIntroAnim) ENDIF SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE) // store weapons on replay CPRINTLN(DEBUG_MISSION, "REPLAY: STORING PLAYER'S WEAPONS") STORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID()) REMOVE_ALL_PED_WEAPONS(PLAYER_PED_ID()) CPRINTLN(DEBUG_MISSION, "Wait for it...") ENDIF // @SBA - Adding in replay stuff (put back in if we want it) // INT iReplayStage = GET_REPLAY_MID_MISSION_STAGE() // // IF g_bShitskipAccepted = TRUE // iReplayStage++ // player is skipping this stage // ENDIF // // SWITCH iReplayStage // CASE CP_MISSION_START // Do_Z_Skip(Z_SKIP_BATTLE) // skip to the inital wave // BREAK // CASE CP_MID_STAGE // SETUP_MICHAEL_DIALOG() // Do_Z_Skip(Z_SKIP_BATTLE_2) // skip to part 2 of the battle // PRINT_NOW("PRIME2", DEFAULT_GOD_TEXT_TIME, 1) // Kill the aliens // BREAK // CASE CP_OUTRO // SAFE_FADE_SCREEN_OUT_TO_BLACK() // Do_Z_Skip(Z_SKIP_OUTRO) // skip to the end // BREAK // // DEFAULT // SCRIPT_ASSERT("Replay in progress: Unknown checkpoint selected") // BREAK // ENDSWITCH END_REPLAY_SETUP() SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() IF NOT ANIMPOSTFX_IS_RUNNING(FX_DrugsSkip) ANIMPOSTFX_PLAY(FX_DrugsSkip, 0, TRUE) ENDIF SET_TIME_SCALE(fTimeScale) ACTIVATE_AUDIO_SLOWMO_MODE("BARRY_01_SLOWMO") SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", TRUE) SET_AUDIO_FLAG("AllowAmbientSpeechInSlowMo", TRUE) ENDIF ENABLE_ALIEN_BLOOD_VFX(TRUE) CPRINTLN(DEBUG_MISSION, "SETUP DONE") ENDPROC // PURPOSE: /// Cleans mission PROC MISSION_CLEANUP() IF IS_AUDIO_SCENE_ACTIVE(sndAlienAmbientScene) STOP_AUDIO_SCENE(sndAlienAmbientScene) ENDIF CLEAR_AMBIENT_ZONE_STATE(sAmbientZone, TRUE) IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.pedID[0]) DELETE_PED(sRCLauncherDataLocal.pedID[0]) ENDIF SET_PLAYER_HEALTH_RECHARGE_MULTIPLIER(PLAYER_ID(), 1.0) SET_PLAYER_WEAPON_DAMAGE_MODIFIER(GET_PLAYER_INDEX(), 1.0) SET_PED_CAN_SWITCH_WEAPON(PLAYER_PED_ID(), TRUE) SPECIAL_ABILITY_UNLOCK(GET_PLAYER_PED_MODEL(CHAR_MICHAEL)) SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE) DELETE_ALL_ALIEN_PEDS() ENABLE_ALIEN_BLOOD_VFX(FALSE) //SAFE_REMOVE_BLIP(locationBlip) ENDPROC /// PURPOSE: /// Cleanups Script and terminates thread - this should be the last function called PROC SCRIPT_CLEANUP() // Ensure launcher is cleaned up RC_CLEANUP_LAUNCHER() // If the mission was triggered then additional mission cleanup will be required. IF (Random_Character_Cleanup_If_Triggered()) #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "Random Character Script was triggered so additional cleanup required") #ENDIF ENDIF SET_PLAYER_HEALTH_RECHARGE_MULTIPLIER(GET_PLAYER_INDEX(), 1.0) SET_PLAYER_WEAPON_DAMAGE_MODIFIER(GET_PLAYER_INDEX(), 1.0) IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedAnim) STOP_ANIM_TASK(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedAnim) ENDIF IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedIntroAnim) STOP_ANIM_TASK(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedIntroAnim) ENDIF ENDIF // @SBA - reset for minigun IF playerWeapon = wtMiniGun AND HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), playerWeapon) SET_PED_INFINITE_AMMO(PLAYER_PED_ID(), FALSE, playerWeapon) ENDIF g_RestoreStoredWeaponsOnDeath = TRUE DISABLE_CHEAT(CHEAT_TYPE_GIVE_WEAPONS, FALSE) CLEANUP_SCREEN_FX() STOP_ALL_ALIEN_EVERYTHING() MISSION_CLEANUP() UNLOAD_REQUESTED_ASSETS(assetRequester) SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(FALSE) SET_CONTROL_SHAKE(PLAYER_CONTROL, 0, 0) DISABLE_TAXI_HAILING(FALSE) #IF IS_DEBUG_BUILD CLEANUP_DEBUG_WIDGETS() #ENDIF // restore world based things SHAKE_GAMEPLAY_CAM("DRUNK_SHAKE", 0) SAFE_REMOVE_BLIP(locationBlip) CLEAR_PED_BLOOD_DAMAGE(PLAYER_PED_ID()) //CLEAR_AREA_OF_VEHICLES(vMainLocation, 30.0) REMOVE_DECALS_IN_RANGE(vMissionStart, 500.0) SET_TIME_SCALE(1.0) DEACTIVATE_AUDIO_SLOWMO_MODE("BARRY_01_SLOWMO") SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", FALSE) SET_AUDIO_FLAG("AllowAmbientSpeechInSlowMo", FALSE) ENABLE_ALL_DISPATCH_SERVICES(TRUE) CLEAR_ALL_PICKUP_REWARD_TYPE_SUPPRESSION() DISABLE_CELLPHONE(FALSE) ENABLE_AMBIENT_PEDS_AND_VEHICLES(TRUE, TRUE) UNBLOCK_SCENARIOS_AND_AMBIENT(scenarioBlock) CLEAR_WEATHER_TYPE_PERSIST() MOVE_PLAYERS_VEHICLE() FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) CLEAR_AMBIENT_ZONE_STATE(sAmbientZone, TRUE) RC_CleanupSceneEntities(sRCLauncherDataLocal, FALSE) TERMINATE_THIS_THREAD() ENDPROC /// PURPOSE: /// Handles Mission Passed PROC SCRIPT_PASSED() #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "Mission Passed") #ENDIF //FLEE_ALL_ALIEN_PEDS() // @SBA - reset for minigun IF playerWeapon = wtMiniGun AND HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), playerWeapon) SET_PED_INFINITE_AMMO(PLAYER_PED_ID(), FALSE, playerWeapon) ENDIF // ADD_CONTACT_TO_PHONEBOOK(CHAR_BARRY, MICHAEL_BOOK) // This needs to be done before random character passed as the replay values are reset IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) CPRINTLN(DEBUG_MISSION, "Barry1 passed: weapons restored") RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID(), TRUE) STORE_PLAYER_PED_WEAPONS(PLAYER_PED_ID()) ENDIF CPRINTLN(DEBUG_MISSION, "Starting postRC_Barry1and2") START_NEW_SCRIPT("postRC_Barry1and2", DEFAULT_STACK_SIZE) SET_SCRIPT_AS_NO_LONGER_NEEDED("postRC_Barry1and2") Random_Character_Passed(CP_RAND_C_BAR1) SCRIPT_CLEANUP() ENDPROC //---------------------- // STATE FUNCTIONS //---------------------- FUNC BOOL HAS_LEADIN_ANIM_FINISHED(PED_INDEX ped, STRING str) IF NOT IS_ENTITY_PLAYING_ANIM(ped, sLeadInAnimDictionary, str) RETURN TRUE ENDIF IF HAS_ENTITY_ANIM_FINISHED(ped, sLeadInAnimDictionary, str) RETURN TRUE ENDIF IF (GET_ENTITY_ANIM_CURRENT_TIME(ped, sLeadInAnimDictionary, str) >= 1.0) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Updates Leading Sequence /// PARAMS: /// prog - stage progress enum, tells us what state we are in PROC UPDATE_STAGE_LEADIN(STAGE_PROGRESS &prog) RC_PLAYER_TRIGGER_SCENE_LOCK_IN() DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DETONATE) SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID()) HANDLE_LOCK_PLAYER_IN_FRONT_OF_TABLE() SWITCH (prog) CASE SP_LOADING REQUEST_MISSION_ASSETS() SECURE_REQUEST_AND_LOAD_ANIM_DICT(sLeadInAnimDictionary, FALSE) prog = SP_SETUP IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0]) IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON SET_GAMEPLAY_ENTITY_HINT(sRCLauncherDataLocal.pedID[0], (<<0.0, 0, 0.8>>), TRUE, -1, 3000) SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(0.0) ELSE SET_GAMEPLAY_ENTITY_HINT(sRCLauncherDataLocal.pedID[0], (<<0.5, 0, 0.8>>), TRUE, -1, 3000) SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(-0.04) ENDIF SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(0.43) //SET_GAMEPLAY_HINT_BASE_ORBIT_PITCH_OFFSET(1.0) SET_GAMEPLAY_HINT_CAMERA_RELATIVE_VERTICAL_OFFSET(0.02) SET_GAMEPLAY_HINT_FOV(30.00) SET_GAMEPLAY_HINT_CAMERA_BLEND_TO_FOLLOW_PED_MEDIUM_VIEW_MODE(TRUE) ENDIF // IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) // SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON) // TASK_FOLLOW_NAV_MESH_TO_COORD(PLAYER_PED_ID(), (<<187.2756, -954.7941, 29.0919>>), PEDMOVE_WALK, -1, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, 242.2959) // TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), sRCLauncherDataLocal.ped[0], 4000) // ENDIF /* IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0]) IF GET_PLANE_SIDE(GET_ENTITY_FORWARD_VECTOR(sRCLauncherDataLocal.pedID[0]), GET_ENTITY_COORDS(sRCLauncherDataLocal.pedID[0]), GET_ENTITY_COORDS(PLAYER_PED_ID())) = BEHIND_PLANE stageEnum = SE_INTRO prog = SP_LOADING ELSE SECURE_REQUEST_AND_LOAD_ANIM_DICT(sLeadInAnimDictionary, FALSE) CPRINTLN(DEBUG_MISSION, "LEAD IN - STARTED - PLAYER IS ON WRONG SIDE") prog = SP_SETUP ENDIF ENDIF */ BREAK CASE SP_SETUP IF HAS_ANIM_DICT_LOADED(sLeadInAnimDictionary) AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() CPRINTLN(DEBUG_MISSION, "LEAD-IN ANIMS LOADED") structPedsForConversation sConversation ADD_PED_FOR_DIALOGUE(sConversation, 0, PLAYER_PED_ID(), "MICHAEL") ADD_PED_FOR_DIALOGUE(sConversation, 5, sRCLauncherDataLocal.pedID[0], "BARRY") IF CREATE_CONVERSATION(sConversation ,"BARY1AU", "BARY1_LEADIN", CONV_PRIORITY_MEDIUM, DISPLAY_SUBTITLES) TASK_PLAY_ANIM(sRCLauncherDataLocal.pedID[0], sLeadInAnimDictionary, "leadin", NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1, AF_HOLD_LAST_FRAME) TASK_LOOK_AT_ENTITY(sRCLauncherDataLocal.pedID[0], PLAYER_PED_ID(), INFINITE_TASK_TIME, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH) CPRINTLN(DEBUG_MISSION, "STARTED PLAYING LEAD-IN CONVERSATION") prog = SP_RUNNING iStateTimeOut = GET_GAME_TIMER() + 30000 ENDIF ENDIF BREAK CASE SP_RUNNING IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0]) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() OR (GET_GAME_TIMER() > iStateTimeOut ) prog = SP_CLEANUP ENDIF ENDIF BREAK CASE SP_CSKIPPED BREAK CASE SP_CLEANUP IF IS_GAMEPLAY_HINT_ACTIVE() STOP_GAMEPLAY_HINT() ENDIF CPRINTLN(DEBUG_MISSION, "LEAD IN FINISHED") stageEnum = SE_INTRO prog = SP_LOADING BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Updates Intro Sequence /// PARAMS: /// prog - stage progress enum, tells us what state we are in PROC UPDATE_STAGE_INTRO(STAGE_PROGRESS &prog) SWITCH (prog) CASE SP_LOADING //DELETE_ALL_ALIEN_PEDS() CPRINTLN(DEBUG_MISSION, "REQUESTED CUTSCENE") RC_REQUEST_CUTSCENE("bar_1_rcm_p2") stageProgress = SP_SETUP START_MISSION_DEBUG_TIMER() bHasPlayerCameraExitState = FALSE IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) CLEAR_PED_BLOOD_DAMAGE(PLAYER_PED_ID()) // store weapons CPRINTLN(DEBUG_MISSION, "STORING PLAYER'S WEAPONS") STORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID()) REMOVE_ALL_PED_WEAPONS(PLAYER_PED_ID()) ENDIF BREAK CASE SP_SETUP CPRINTLN(DEBUG_MISSION, "CHECKING TO SEE IF CUTSCENE IS OK TO START") IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Michael", PLAYER_PED_ID(), GET_ENTITY_MODEL(PLAYER_PED_ID())) ENDIF SET_CUTSCENE_PED_PROP_VARIATION(sSceneHandleBarry, ANCHOR_EYES, 0) CPRINTLN(DEBUG_MISSION, "PED CUTSCENE VARIATIONS SET") ENDIF IF RC_IS_CUTSCENE_OK_TO_START() CPRINTLN(DEBUG_MISSION, "CUTSCENE IS OK TO START") IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0]) REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.pedID[0], sSceneHandleBarry, CU_ANIMATE_EXISTING_SCRIPT_ENTITY) CPRINTLN(DEBUG_MISSION, "REGISTERED BARRY") ELSE REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.pedID[0], sSceneHandleBarry, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_NPC_PED_MODEL(CHAR_BARRY)) CPRINTLN(DEBUG_MISSION, "REGISTERED NEW BARRY") ENDIF IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[OBJ_TABLE]) REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.objID[OBJ_TABLE], sSceneHandleTable, CU_ANIMATE_EXISTING_SCRIPT_ENTITY) CPRINTLN(DEBUG_MISSION, "REGISTERED TABLE") ELSE REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.objID[OBJ_TABLE], sSceneHandleTable, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, PROP_PROTEST_TABLE_01) CPRINTLN(DEBUG_MISSION, "REGISTERED NEW TABLE") ENDIF IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[OBJ_CHAIR]) REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.objID[OBJ_CHAIR], sSceneHandleChair, CU_ANIMATE_EXISTING_SCRIPT_ENTITY) CPRINTLN(DEBUG_MISSION, "REGISTERED CHAIR") ELSE REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.objID[OBJ_CHAIR], sSceneHandleChair, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, PROP_CHAIR_08) CPRINTLN(DEBUG_MISSION, "REGISTERED NEW CHAIR") ENDIF IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[OBJ_PAPERS]) REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.objID[OBJ_PAPERS], sSceneHandlePapers, CU_ANIMATE_EXISTING_SCRIPT_ENTITY) CPRINTLN(DEBUG_MISSION, "REGISTERED PAPERS") ELSE REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.objID[OBJ_PAPERS], sSceneHandlePapers, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, P_A4_Sheets_S) CPRINTLN(DEBUG_MISSION, "REGISTERED NEW PAPERS") ENDIF IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[OBJ_LIGHTER]) REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.objID[OBJ_LIGHTER], sSceneHandleLighter, CU_ANIMATE_EXISTING_SCRIPT_ENTITY) CPRINTLN(DEBUG_MISSION, "REGISTERED LIGHTER") ELSE REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.objID[OBJ_LIGHTER], sSceneHandleLighter, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, P_CS_Lighter_01) CPRINTLN(DEBUG_MISSION, "REGISTERED NEW LIGHTER") ENDIF IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[OBJ_JOINT]) REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.objID[OBJ_JOINT], sSceneHandleJoint, CU_ANIMATE_EXISTING_SCRIPT_ENTITY) CPRINTLN(DEBUG_MISSION, "REGISTERED JOINT") ELSE REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.objID[OBJ_JOINT], sSceneHandleJoint, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, P_CS_JOINT_01) CPRINTLN(DEBUG_MISSION, "REGISTERED NEW JOINT") ENDIF IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) CPRINTLN(DEBUG_MISSION, "REGISTERED MICHAEL") ENDIF // mini-gun GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), playerWeapon, INFINITE_AMMO, FALSE, FALSE) oiMichaelsWeapon = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID(), playerWeapon) REGISTER_ENTITY_FOR_CUTSCENE(oiMichaelsWeapon, sSceneHandleWeapon, CU_ANIMATE_EXISTING_SCRIPT_ENTITY) // Cleanup launcher which will remove mission blip RC_CLEANUP_LAUNCHER() START_CUTSCENE() REPLAY_START_EVENT(REPLAY_IMPORTANCE_LOW) SET_CUTSCENE_CAN_BE_SKIPPED(FALSE) bHasPlayerCameraExitState = FALSE WAIT(0) // @SBA - assert fix IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[OBJ_JOINT]) IF IS_ENTITY_ATTACHED(sRCLauncherDataLocal.objID[OBJ_JOINT]) DETACH_ENTITY(sRCLauncherDataLocal.objID[OBJ_JOINT]) ENDIF ENDIF ENABLE_AMBIENT_PEDS_AND_VEHICLES(FALSE, FALSE, TRUE, FALSE) RESOLVE_MISSION_VEHICLES_FOR_CUTSCENE() RC_START_CUTSCENE_MODE(vMissionStart, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE) BLOCK_SCENARIOS_AND_AMBIENT(scenarioBlock) CLEANUP_SCREEN_FX() bSkipAllowed = FALSE CREATE_STANDING_SIGN(sRCLauncherDataLocal.objID[OBJ_SIGN], mnProtestSign) SAFE_FADE_SCREEN_IN_FROM_BLACK(500, FALSE) REQUEST_MISSION_ASSETS() stageProgress = SP_RUNNING ENDIF BREAK CASE SP_RUNNING INT iCutTime IF NOT IS_CUTSCENE_PLAYING() REPLAY_STOP_EVENT() RC_END_CUTSCENE_MODE(TRUE, FALSE) FORCE_PLAYER_WEAPON(playerWeapon) stageProgress = SP_CLEANUP ELSE iCutTime = GET_CUTSCENE_TIME() CPRINTLN(DEBUG_MISSION, "Cutscene Time = ", iCutTime) IF (bShowDebugMissionTime) SET_TEXT_SCALE(0.5, 0.5) DISPLAY_TEXT_WITH_NUMBER(0.1, 0.1, "NUMBER", GET_CUTSCENE_TIME()) ENDIF IF HAVE_ASSET_REQUESTS_LOADED(assetRequester) IF NOT bSkipAllowed SET_CUTSCENE_CAN_BE_SKIPPED(TRUE) bSkipAllowed = TRUE ENDIF // not sure this is really used - skipping seems built in IF (iCutTime < 68000) IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY() stageProgress = SP_CSKIPPED CPRINTLN(DEBUG_MISSION, "Cutscene Skipped - Assets Loaded") EXIT ENDIF ENDIF ENDIF IF NOT bHasPlayerCameraExitState SET_GAMEPLAY_CAM_RELATIVE_PITCH() SET_GAMEPLAY_CAM_RELATIVE_HEADING() ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael") CPRINTLN(DEBUG_MISSION, "EXIT STATE FOR PLAYER SET") bHasPlayerCameraExitState = TRUE ENDIF IF IS_ENTITY_ALIVE(oiMichaelsWeapon) REQUEST_WEAPON_HIGH_DETAIL_MODEL(oiMichaelsWeapon) IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandleWeapon) GIVE_WEAPON_OBJECT_TO_PED(oiMichaelsWeapon, PLAYER_PED_ID()) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandlePapers) IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[OBJ_PAPERS]) CPRINTLN(DEBUG_MISSION, "EXIT STATE FOR PAPERS - DELETING") DELETE_OBJECT(sRCLauncherDataLocal.objID[OBJ_PAPERS]) ENDIF ENDIF // B*750704 - Interactive Music Event IF (bHasMusicStarted = FALSE) IF (iCutTime >= MUSICEVENT_RC18A_START_DELAY) bHasMusicStarted = TRUE STRING FXname FXname = FX_DrugsIn IF WAS_CUTSCENE_SKIPPED() CPRINTLN(DEBUG_MISSION, "Starting screen effect (cs skipped)") FXname = FX_DrugsSkip ENDIF ANIMPOSTFX_PLAY(FXname, 0, TRUE) CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_START") TRIGGER_MUSIC_EVENT("RC18A_START") ENDIF ENDIF IF (bHasMusicIncreased = FALSE) IF (iCutTime >= MUSICEVENT_RC18A_INCREASE_DELAY) bHasMusicIncreased = TRUE CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_INCREASE") TRIGGER_MUSIC_EVENT("RC18A_INCREASE") ENDIF ENDIF ENDIF BREAK CASE SP_CSKIPPED SET_CUTSCENE_FADE_VALUES(false, false, FALSE, false) SAFE_FADE_SCREEN_OUT_TO_BLACK(250, FALSE) IF IS_CUTSCENE_PLAYING() WAIT_FOR_CUTSCENE_TO_STOP() ENDIF RC_END_CUTSCENE_MODE(TRUE, FALSE) // just in case the player skips the cutscene we still need to play the event IF (bHasMusicStarted = FALSE) bHasMusicStarted = TRUE CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_CS_SKIP_BEFORE - Cutscene Skip") TRIGGER_MUSIC_EVENT("RC18A_CS_SKIP_BEFORE") IF NOT ANIMPOSTFX_IS_RUNNING(FX_DrugsSkip) ANIMPOSTFX_PLAY(FX_DrugsSkip, 0, TRUE) ENDIF ELSE CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_CS_SKIP_AFTER - Cutscene Skip") TRIGGER_MUSIC_EVENT("RC18A_CS_SKIP_AFTER") bHasMusicIncreased = TRUE ENDIF IF IS_ENTITY_ALIVE(oiMichaelsWeapon) SAFE_DELETE_OBJECT(oiMichaelsWeapon) ENDIF CPRINTLN(DEBUG_MISSION, "Cutscene skipped - player's heading: ", kfPlayerStartHead) SET_ENTITY_COORDS_GROUNDED(PLAYER_PED_ID(), vMissionStart) SET_ENTITY_HEADING(PLAYER_PED_ID(), kfPlayerStartHead)// @SBA OLD = fMissionStart FORCE_PLAYER_WEAPON(playerWeapon) // SET_GAMEPLAY_CAM_RELATIVE_PITCH() // SET_GAMEPLAY_CAM_RELATIVE_HEADING() WAIT(500) stageProgress = SP_CLEANUP BREAK CASE SP_CLEANUP stageProgress = SP_LOADING stageEnum = SE_FIRSTCONTACT IF WAS_CUTSCENE_SKIPPED() IF (bHasMusicStarted = FALSE) bHasMusicStarted = TRUE CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_CS_SKIP_BEFORE - Cutscene Skip") TRIGGER_MUSIC_EVENT("RC18A_CS_SKIP_BEFORE") ELIF (bHasMusicIncreased = FALSE) CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_CS_SKIP_AFTER - Cutscene Skip") TRIGGER_MUSIC_EVENT("RC18A_CS_SKIP_AFTER") bHasMusicIncreased = TRUE ENDIF ENDIF BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Updates First Contact (Initial wave of 3 aliens) /// PARAMS: /// prog - stage progress enum, tells us what state we are in PROC UPDATE_STAGE_FIRSTCONTACT(STAGE_PROGRESS &prog) INT ind SWITCH (prog) CASE SP_LOADING SET_TIME_SCALE(fTimeScale) DEACTIVATE_AUDIO_SLOWMO_MODE("BARRY_01_SLOWMO") // assert fix ACTIVATE_AUDIO_SLOWMO_MODE("BARRY_01_SLOWMO") SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", TRUE) SET_AUDIO_FLAG("AllowAmbientSpeechInSlowMo", TRUE) IF NOT HAVE_ASSET_REQUESTS_LOADED(assetRequester) REQUEST_MISSION_ASSETS() ENDIF prog = SP_SETUP SETUP_MICHAEL_DIALOG() RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE, FALSE) RC_CleanupSceneEntities(sRCLauncherDataLocal, TRUE, TRUE, FALSE) START_MISSION_DEBUG_TIMER() FORCE_PLAYER_WEAPON(playerWeapon) SET_AMBIENT_ZONE_STATE(sAmbientZone, TRUE) BREAK CASE SP_SETUP CLEAR_PRINTS() START_AUDIO_SCENE(sndAlienAmbientScene) CLEAR_PED_BLOOD_DAMAGE(PLAYER_PED_ID()) // reset summon flags and counters iTotalAlienSpawnCount = 0 iTotalAlienDeadCount = 0 iAlienNextSummonTime = 0 bSummonRushFlagActive = FALSE bSummonFlagActive = FALSE bAllowSummoning = FALSE iAlienSummonerIndex = -1 iMaxActiveAliens = kiMaxStartingAliens fAlienMinSpawnRadius = 40.0 fAlienMaxSpawnRadius = 60.0 // @SBA - updating these first aliens IF GET_FREE_ALIEN_PED_INDEX(ind) CREATE_ALIEN_PED(alienPed[ind], <<212.9178, -920.5014, 30.6922>>, 0, FALSE) //<<181.1, -951.9, 30.1>> alienPed[ind].fBeamTriggerRange = 15 SET_ALIEN_WEAK(alienPed[ind]) ENDIF IF GET_FREE_ALIEN_PED_INDEX(ind) CREATE_ALIEN_PED(alienPed[ind], <<213.2008, -917.9012, 30.6923>>, 2, FALSE) // <<173.0, -956.9, 30.1>> alienPed[ind].fBeamTriggerRange = 15 SET_ALIEN_WEAK(alienPed[ind]) ENDIF IF GET_FREE_ALIEN_PED_INDEX(ind) CREATE_ALIEN_PED(alienPed[ind], <<217.8108, -916.8170, 30.6923>>, 4, FALSE) // <<174.7, -948.1, 30.1>> alienPed[ind].fBeamTriggerRange = 15 SET_ALIEN_WEAK(alienPed[ind]) ENDIF // @SBA - adding some more to this wave IF GET_FREE_ALIEN_PED_INDEX(ind) CREATE_ALIEN_PED(alienPed[ind], <<211.0789, -912.2070, 30.6923>>, 8, FALSE) alienPed[ind].fBeamTriggerRange = 15 SET_ALIEN_WEAK(alienPed[ind]) ENDIF SAFE_FADE_SCREEN_IN_FROM_BLACK(500, FALSE) PRINT_NOW("PRIME2", DEFAULT_GOD_TEXT_TIME, 1) // Kill the Aliens INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(PLAYER_PED_ID()) // @SBA - spawn timer START_TIMER_NOW(tmr1stContactSpawn) f1stContactSpawnTime = 5.000 prog = SP_RUNNING BREAK CASE SP_RUNNING PLAY_MICHAEL_INITIAL_LINE() SPAWN_NEXT_ALIEN_NEAR_LOCATION(v1stContactStartCtr, f1stContactStartRadius, 5, TRUE) // update kill chain IF (iKillChainEndTime <> 0) AND (GET_GAME_TIMER() > iKillChainEndTime) CPRINTLN(DEBUG_MISSION, "KILL CHAIN FAIL!!") iKillChainEndTime = 0 iKillChain = 0 ENDIF // @SBA - CHANGING BY REQUEST // IF (iAlienAliveCount = 0) // OR IS_PLAYER_OUT_OF_AMMO(PlayerWeapon) IF (iTotalAlienDeadCount >= 10) CPRINTLN(DEBUG_MISSION, "GOING TO FIRST CONTACT CLEANUP") // @SBA - CHANGING BY REQUEST //SWAP_THE_PLAYERS_WEAPON(PlayerWeapon) prog = SP_CLEANUP ENDIF BREAK CASE SP_CLEANUP prog = SP_LOADING stageEnum = SE_WAVE1 //prog = SP_LOADING //stageEnum = SE_PASSOUT BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Updates first wave /// PARAMS: /// prog - stage progress enum, tells us what state we are in PROC UPDATE_STAGE_WAVE_1(STAGE_PROGRESS &prog) SWITCH (prog) CASE SP_LOADING CPRINTLN(DEBUG_MISSION, "LOADING FIRST WAVE") START_TIMER_NOW(tmrStageTimer) prog = SP_SETUP BREAK CASE SP_SETUP // @SBA - give a little space before new aliens start spawning in IF TIMER_DO_ONCE_WHEN_READY(tmrStageTimer, 5.000) CPRINTLN(DEBUG_MISSION, "FIRST WAVE TIMER IS UP") bAutoCreateAliens = TRUE bAllowSummoning = TRUE iMaxActiveAliens = kiMaxStartingAliens iAlienAutoGenTime = 0 prog = SP_RUNNING ENDIF BREAK CASE SP_RUNNING // update kill chain IF (iKillChainEndTime <> 0) AND (GET_GAME_TIMER() > iKillChainEndTime) CPRINTLN(DEBUG_MISSION, "KILL CHAIN FAIL!!") iKillChainEndTime = 0 iKillChain = 0 ENDIF // drugs effect and other thing IF IS_AUDIO_SCENE_ACTIVE(sndAlienAmbientScene) SET_AUDIO_SCENE_VARIABLE(sndAlienAmbientScene, "DrugsEffect", (SIN(((TO_FLOAT(GET_GAME_TIMER())/1000)*45)%360))*0.25+0.25) ENDIF // @SBA - advance through the weapons we want the player to use IF IS_PLAYER_OUT_OF_AMMO(PlayerWeapon) SWAP_THE_PLAYERS_WEAPON(PlayerWeapon) ENDIF // auto create aliens as supplies run low HANDLE_AUTO_ALIEN_GENERATION() PLAY_MICHAEL_FREAK_DIALOG_LINES() //SET_TIME_SCALE(fTimeScale) // @SBA - conditions to end wave 1 IF (iTotalAlienDeadCount >= iTotalAlienDeadRequired - kiAliensLeftToKill) bAutoCreateAliens = FALSE CPRINTLN(DEBUG_MISSION, "GOING TO FIRST WAVE CLEANUP") prog = SP_CLEANUP ENDIF BREAK CASE SP_CLEANUP prog = SP_LOADING stageEnum = SE_WAVE2 BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Updates first wave /// PARAMS: /// prog - stage progress enum, tells us what state we are in PROC UPDATE_STAGE_WAVE_2(STAGE_PROGRESS &prog) SWITCH (prog) CASE SP_LOADING CASE SP_SETUP CPRINTLN(DEBUG_MISSION, "LOADING SECOND WAVE") bAutoCreateAliens = TRUE prog = SP_RUNNING BREAK CASE SP_RUNNING // update kill chain IF (iKillChainEndTime <> 0) AND (GET_GAME_TIMER() > iKillChainEndTime) CPRINTLN(DEBUG_MISSION, "KILL CHAIN FAIL!!") iKillChainEndTime = 0 iKillChain = 0 ENDIF // drugs effect and other thing IF IS_AUDIO_SCENE_ACTIVE(sndAlienAmbientScene) SET_AUDIO_SCENE_VARIABLE(sndAlienAmbientScene, "DrugsEffect", (SIN(((TO_FLOAT(GET_GAME_TIMER())/1000)*45)%360))*0.25+0.25) ENDIF // @SBA - advance through the weapons we want the player to use // Note Mini-gun (last weapon) gets infinite ammo IF IS_PLAYER_OUT_OF_AMMO(PlayerWeapon) SWAP_THE_PLAYERS_WEAPON(PlayerWeapon) IF PlayerWeapon = wtMiniGun AND iTotalAlienDeadCount >= iTotalAlienDeadRequired CPRINTLN(DEBUG_MISSION, "UPDATE_STAGE_WAVE_2: Player just got minigun, adding ",iAliensToAdd, " more aliens to the required kill total." ) iTotalAlienDeadRequired += iAliensToAdd ENDIF ENDIF // auto create aliens as supplies run low HANDLE_AUTO_ALIEN_GENERATION() PLAY_MICHAEL_FREAK_DIALOG_LINES() //SET_TIME_SCALE(fTimeScale) // @SBA - make sure the player has gotten the mini-gun first IF PlayerWeapon = wtMiniGun // then check dead count IF (iTotalAlienDeadCount > iTotalAlienDeadRequired) bAutoCreateAliens = FALSE IF (iAlienAliveCount = 0) CPRINTLN(DEBUG_MISSION, "GOING TO FIRST WAVE CLEANUP") prog = SP_CLEANUP ENDIF ENDIF ENDIF BREAK CASE SP_CLEANUP prog = SP_LOADING stageEnum = SE_PASSOUT BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Updates The Pass Out Sequence /// PARAMS: /// prog - stage progress enum, tells us what state we are in PROC UPDATE_STAGE_PASSOUT(STAGE_PROGRESS &prog) SWITCH (prog) CASE SP_LOADING CASE SP_SETUP //TELEPORT_OUT_ALL_ALIEN_PEDS() SAFE_FADE_SCREEN_IN_FROM_BLACK(500, FALSE) CPRINTLN(DEBUG_MISSION, "ENTERING UPDATE STAGE PASSOUT") CLEAR_PRINTS() CLEAR_HELP() prog = SP_RUNNING BREAK CASE SP_RUNNING IF PASS_OUT_SEQUENCE(TRUE) prog = SP_CLEANUP ENDIF BREAK CASE SP_CLEANUP prog = SP_LOADING stageEnum = SE_OUTRO BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Updates Outro /// PARAMS: /// prog - stage progress enum, tells us what state we are in PROC UPDATE_STAGE_OUTRO(STAGE_PROGRESS &prog) IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Michael", PLAYER_PED_ID(), GET_ENTITY_MODEL(PLAYER_PED_ID())) SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE) ENDIF SET_CUTSCENE_PED_PROP_VARIATION(sSceneHandleBarry, ANCHOR_EYES, 0) CPRINTLN(DEBUG_MISSION, "PED CUTSCENE VARIATIONS SET") ENDIF SWITCH (prog) CASE SP_LOADING CPRINTLN(DEBUG_MISSION, "REQUESTING CUTSCENE - bar_2_rcm") RC_REQUEST_CUTSCENE("bar_2_rcm") WAIT_FOR_WORLD_TO_LOAD(vMissionStart) IF NOT HAS_SCRIPT_LOADED("postRC_Barry1and2") REQUEST_SCRIPT("postRC_Barry1and2") ENDIF prog = SP_SETUP BREAK CASE SP_SETUP IF RC_IS_CUTSCENE_OK_TO_START() AND HAS_SCRIPT_LOADED("postRC_Barry1and2") bHasPlayerCameraExitState = FALSE IF IS_ENTITY_OK(PLAYER_PED_ID()) RESET_PED_VISIBLE_DAMAGE(PLAYER_PED_ID()) CLEAR_PED_BLOOD_DAMAGE(PLAYER_PED_ID()) ENDIF MISSION_CLEANUP() CLEAR_AREA_OF_VEHICLES(vMissionStart, 250.0) CLEAR_AREA_OF_PEDS(vMissionStart, 50.0) CLEAR_AREA_OF_OBJECTS(vMissionStart, 30.0) REMOVE_DECALS_IN_RANGE(vMissionStart, 500.0) CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID()) MOVE_PLAYERS_VEHICLE() REGISTER_ENTITY_FOR_CUTSCENE(NULL, sSceneHandleBarry, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_NPC_PED_MODEL(CHAR_BARRY)) REGISTER_ENTITY_FOR_CUTSCENE(NULL, sSceneHandleTable, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, PROP_PROTEST_TABLE_01) REGISTER_ENTITY_FOR_CUTSCENE(NULL, sSceneHandleChair, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, PROP_CHAIR_08) IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, PLAYER_ZERO) CPRINTLN(DEBUG_MISSION, "REGISTERED MICHAEL") ENDIF REPLAY_START_EVENT(REPLAY_IMPORTANCE_LOW) START_CUTSCENE() WAIT(0) SAFE_FADE_SCREEN_IN_FROM_BLACK(1000, FALSE) // RESOLVE_MISSION_VEHICLES_FOR_CUTSCENE() RC_START_CUTSCENE_MODE(<<0, 0, 0>>, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE) CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_STOP") TRIGGER_MUSIC_EVENT("RC18A_STOP") //SET_CUTSCENE_CAN_BE_SKIPPED(FALSE) prog = SP_RUNNING ENDIF BREAK CASE SP_RUNNING // Don't look back IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) ENDIF IF NOT IS_CUTSCENE_PLAYING() CPRINTLN(DEBUG_MISSION, "PRE RC_END_CUTSCENE_MODE") RC_END_CUTSCENE_MODE() IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) ENDIF REPLAY_STOP_EVENT() CPRINTLN(DEBUG_MISSION, "POST RC_END_CUTSCENE_MODE") prog = SP_CLEANUP ELSE IF NOT bHasPlayerCameraExitState SET_GAMEPLAY_CAM_RELATIVE_PITCH() SET_GAMEPLAY_CAM_RELATIVE_HEADING() ENDIF IF NOT IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[OBJ_SIGN]) CREATE_STANDING_SIGN(sRCLauncherDataLocal.objID[OBJ_SIGN], mnProtestSign) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael") CPRINTLN(DEBUG_MISSION, "SET EXIT STATE FOR MICHAEL") FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT) SIMULATE_PLAYER_INPUT_GAIT(player_id(), pedmove_walk, 2000) bHasPlayerCameraExitState = TRUE ENDIF // register things as we exit IF NOT IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0]) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandleBarry)) sRCLauncherDataLocal.pedID[0] = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandleBarry)) SET_PED_PROP_INDEX(sRCLauncherDataLocal.pedID[0], ANCHOR_EYES, 0) //Glasses prop. ENDIF ENDIF IF NOT IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[OBJ_TABLE]) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandleTable)) sRCLauncherDataLocal.objID[OBJ_TABLE] = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandleTable)) ENDIF ENDIF IF NOT IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[OBJ_CHAIR]) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandleChair)) sRCLauncherDataLocal.objID[OBJ_CHAIR] = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandleChair)) ENDIF ENDIF IF CAN_SET_ENTER_STATE_FOR_REGISTERED_ENTITY(sSceneHandleTable) IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[OBJ_TABLE]) AND IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[OBJ_PAPERS]) ATTACH_ENTITY_TO_ENTITY(sRCLauncherDataLocal.objID[OBJ_PAPERS], sRCLauncherDataLocal.objID[OBJ_TABLE], 0, <<0, -0.25, 0>>, <<0, 0, 0>>) CPRINTLN(DEBUG_MISSION, "PAPERS REATTACHED TO TABLE") ENDIF ENDIF /* SET_CUTSCENE_CAN_BE_SKIPPED(TRUE) IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY() stageProgress = SP_CSKIPPED ENDIF */ ENDIF BREAK CASE SP_CSKIPPED SET_CUTSCENE_FADE_VALUES(false, false, FALSE, false) SAFE_FADE_SCREEN_OUT_TO_BLACK(250, FALSE) IF IS_CUTSCENE_PLAYING() WAIT_FOR_CUTSCENE_TO_STOP() ENDIF RC_END_CUTSCENE_MODE() SET_ENTITY_COORDS_GROUNDED(PLAYER_PED_ID(), vMissionStart) SET_ENTITY_HEADING(PLAYER_PED_ID(), fMissionStart) SET_GAMEPLAY_CAM_RELATIVE_PITCH() SET_GAMEPLAY_CAM_RELATIVE_HEADING() WAIT(250) SAFE_FADE_SCREEN_IN_FROM_BLACK(250, FALSE) SCRIPT_PASSED() BREAK CASE SP_CLEANUP CPRINTLN(DEBUG_MISSION, "SP_CLEANUP") IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) ENDIF DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_BEHIND) SCRIPT_PASSED() BREAK ENDSWITCH ENDPROC // @SBA - Quick and dirty prototype of pulling camera into the sky and dropping Michael from there CAMERA_INDEX ciDropCam SELECTOR_CAM_STRUCT scsCamDetails INT iTest = 0 INT iTimeFadeOut VECTOR vSkyCam = <<184.8, -961.5, 200.0>> VECTOR vSkyCamRot = <<-90, 0.0, -109.6>> FUNC BOOL OPERATION_DROP_MICHAEL() SWITCH iTest // set up CASE 0 ciDropCam = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", vSkyCam, vSkyCamRot, 50.0) scsCamDetails.camSky = ciDropCam iTimeFadeOut = GET_GAME_TIMER() + 400 iTest ++ BREAK // sky cam and fade CASE 1 IF GET_GAME_TIMER() > iTimeFadeOut IF NOT IS_SCREEN_FADED_OUT() AND NOT IS_SCREEN_FADING_OUT() DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME) ENDIF ENDIF IF NOT RUN_CAM_SPLINE_FROM_PLAYER_TO_SKY_CAM(scsCamDetails, 0.8) iTest ++ ENDIF BREAK // start black screen timer CASE 2 IF IS_SCREEN_FADED_OUT() // reusing timer iTimeFadeOut = GET_GAME_TIMER() + 500 iTest ++ ENDIF BREAK // Drop player CASE 3 IF GET_GAME_TIMER() > iTimeFadeOut SET_ENTITY_COORDS(PLAYER_PED_ID(), vSkyCam) //SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON) FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE) SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), FALSE) SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE) IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) <> CAM_VIEW_MODE_FIRST_PERSON IF DOES_CAM_EXIST(ciDropCam) SET_CAM_ROT(ciDropCam, vSkyCamRot) SET_CAM_ACTIVE(ciDropCam, TRUE) ATTACH_CAM_TO_ENTITY(ciDropCam, PLAYER_PED_ID(), <<0,0,4>>, FALSE) ENDIF ELSE RENDER_SCRIPT_CAMS(FALSE, FALSE) ENDIF DELETE_ALL_ALIEN_PEDS() iTest ++ ENDIF BREAK // fade in CASE 4 DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME) sFailString = "B1_FAIL3" iTest ++ BREAK // return camera near impact CASE 5 VECTOR vPlayerCoord vPlayerCoord = GET_ENTITY_COORDS(PLAYER_PED_ID()) IF vPlayerCoord.z < 32.0 // be sure to alter this according to ground height RENDER_SCRIPT_CAMS(FALSE, TRUE) iTest ++ ENDIF BREAK // clean up CASE 6 IF IS_GAMEPLAY_CAM_RENDERING() IF DOES_CAM_EXIST(ciDropCam) SET_CAM_ACTIVE(ciDropCam, FALSE) DESTROY_CAM(ciDropCam) ENDIF RETURN TRUE ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC /// PURPOSE: /// Updates failed stage /// PARAMS: /// prog - stage progress enum, tells us what state we are in PROC UPDATE_STAGE_ABDUCT(STAGE_PROGRESS &prog) SEQUENCE_INDEX seqTask SWITCH (prog) CASE SP_LOADING CASE SP_SETUP CPRINTLN(DEBUG_MISSION, "Player Abducted") iTest = 0 //RC_START_CUTSCENE_MODE(<<0.0,0.0,0.0>>, <<0.0,0.0,0.0>>, 0.0, FALSE, FALSE) gunObject = CREATE_FAKE_WEAPON_FOR_PLAYER(playerWeapon) IF IS_ENTITY_OK(gunObject) AND IS_ENTITY_ATTACHED(gunObject) DETACH_ENTITY(gunObject) ENDIF OPEN_SEQUENCE_TASK(seqTask) TASK_PLAY_ANIM(NULL, sMissionAnimDictionary, sAlienGrabbedWinAnim) TASK_PLAY_ANIM(NULL, sMissionAnimDictionary, sMichaelTeleportAnim, NORMAL_BLEND_IN, REALLY_SLOW_BLEND_OUT) CLOSE_SEQUENCE_TASK(seqTask) TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), seqTask) CLEAR_SEQUENCE_TASK(seqTask) prog = SP_RUNNING BREAK CASE SP_RUNNING IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_PERFORM_SEQUENCE) = FINISHED_TASK FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE) SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), TRUE) START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_alien_teleport", GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_ROTATION(PLAYER_PED_ID()), fAlienTeleportEffectSize) PLAY_SOUND_FROM_ENTITY(-1, "SPAWN", PLAYER_PED_ID(), "BARRY_01_SOUNDSET") fPlayerAlpha = 255.0 prog = SP_CLEANUP ENDIF BREAK CASE SP_CLEANUP fPlayerAlpha -= (GET_FRAME_TIME() * 512.0) CPRINTLN(DEBUG_MISSION, "PLAYER GETTING TELEPORTED OUT - ALPHA:", fPlayerAlpha) IF (fPlayerAlpha <= 0.0) fPlayerAlpha = 0.0 RESET_ENTITY_ALPHA(PLAYER_PED_ID()) SET_ENTITY_VISIBLE(PLAYER_PED_ID(), FALSE) prog = SP_CSKIPPED EXIT ENDIF SET_PED_ALPHA(PLAYER_PED_ID(), FLOOR(fPlayerAlpha), iAlphaCounter) BREAK // @SBA - prototyping case CASE SP_CSKIPPED IF OPERATION_DROP_MICHAEL() SET_MISSION_FAILED("B1_FAIL3") iFailTimer = GET_GAME_TIMER() + 50 ENDIF BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Updates failed stage /// PARAMS: /// prog - stage progress enum, tells us what state we are in PROC UPDATE_STAGE_FAILED(STAGE_PROGRESS &prog) SWITCH (prog) CASE SP_LOADING CASE SP_SETUP CPRINTLN(DEBUG_MISSION, "Mission Failed") CLEAR_PRINTS() CLEAR_HELP() // Remove all blips here // Make all aliens flee STOP_ALL_ALIEN_EVERYTHING() FLEE_ALL_ALIEN_PEDS() CLEANUP_ALL_ALIEN_PEDS(TRUE) // stop mission music CPRINTLN(DEBUG_MISSION, "FAIL STRING = ", sFailString) CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_STOP") TRIGGER_MUSIC_EVENT("RC18A_STOP") // B*938802 - No more delay fades IF IS_STRING_NULL_OR_EMPTY(sFailString) Random_Character_Failed() ELSE Random_Character_Failed_With_Reason(sFailString, TRUE) ///, bDelayFade) ENDIF prog = SP_RUNNING BREAK CASE SP_RUNNING IF GET_MISSION_FLOW_SAFE_TO_CLEANUP() // Set warp locations MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<165.4821, -990.5140, 29.0923>>, 166.7554) SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION(vPlayerVehicleLoc, fPlayerVehicleHead) // delete everything here! //DeleteEverything()? //CLEANUP_ALL_ALIEN_PEDS(TRUE)? // script_cleanup should terminate the thread RC_END_CUTSCENE_MODE(TRUE, FALSE) CPRINTLN(DEBUG_MISSION, "Barry1 fail stage: Restore weapons on fail") IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID(), TRUE) STORE_PLAYER_PED_WEAPONS(PLAYER_PED_ID()) ENDIF Script_Cleanup() ELSE // not finished fading out // you may want to handle dialogue etc here. IF ARE_STRINGS_EQUAL(sFailString, "B1_FAIL") // Fled the battle IF PASS_OUT_SEQUENCE() AND IS_REPEAT_PLAY_ACTIVE() CPRINTLN(DEBUG_MISSION, "Repeat Play - Emergency Exit") Script_Cleanup() ENDIF ELIF ARE_STRINGS_EQUAL(sFailString, "B1_FAIL2") // Abducted ABDUCT_SEQUENCE_END() ENDIF ENDIF BREAK ENDSWITCH ENDPROC //---------------------- // CHECKPNT FUNCTIONS //---------------------- /// PURPOSE: /// Performs Z Skip /// PARAMS: /// iTargetStage - which stage to jump to PROC DO_Z_SKIP(INT iTargetStage) DO_SCREEN_FADE_OUT(0) RC_START_Z_SKIP() SWITCH iTargetStage CASE Z_SKIP_INTRO CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_STOP") TRIGGER_MUSIC_EVENT("RC18A_STOP") CPRINTLN(DEBUG_MISSION, "Skip to intro - player heading set to: ", kfPlayerStartHead) SET_ENTITY_COORDS_GROUNDED(PLAYER_PED_ID(), vMissionStart) SET_ENTITY_HEADING(PLAYER_PED_ID(), kfPlayerStartHead) // @SBA OLD = fMissionStart iDbgStageJump = 0 BREAK CASE Z_SKIP_BATTLE RESET_MISSION_COUNTERS() #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "Z-Skip or Replay: Start Music") #ENDIF CPRINTLN(DEBUG_MISSION, "Skip to battle - player heading set to: ", kfPlayerStartHead) SET_ENTITY_COORDS_GROUNDED(PLAYER_PED_ID(), vMissionStart) SET_ENTITY_HEADING(PLAYER_PED_ID(), kfPlayerStartHead) // @SBA OLD = fMissionStart iDbgStageJump = ENUM_TO_INT(SE_FIRSTCONTACT) BREAK // @SBA - adding case (will need to update weapon, dead count, etc. if ever used for a checkpoint!) CASE Z_SKIP_BATTLE_2 RESET_MISSION_COUNTERS() #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "Z-Skip or Replay: Battle2") #ENDIF // Set number of dead aliens iTotalAlienDeadCount = kiDeadAliensStartingWave2 PlayerWeapon = wtGrenLauncher//wtPistol // @TODO - should be wtGrenLauncher, to swap to mini gaun SWAP_THE_PLAYERS_WEAPON(PlayerWeapon) SET_ENTITY_COORDS_GROUNDED(PLAYER_PED_ID(), vMissionStart) SET_ENTITY_HEADING(PLAYER_PED_ID(), fMissionStart) iDbgStageJump = ENUM_TO_INT(SE_WAVE2) BREAK CASE Z_SKIP_PASSOUT iDbgStageJump = ENUM_TO_INT(SE_PASSOUT) BREAK CASE Z_SKIP_OUTRO iDbgStageJump = ENUM_TO_INT(SE_OUTRO) BREAK ENDSWITCH // delete and unload everything stageEnum = INT_TO_ENUM(STAGE_ENUM, iDbgStageJump) stageProgress = SP_LOADING DELETE_ALL_ALIEN_PEDS() ENABLE_AMBIENT_PEDS_AND_VEHICLES(FALSE, FALSE, TRUE, TRUE) SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() SET_TIME_SCALE(fTimeScale) DEACTIVATE_AUDIO_SLOWMO_MODE("BARRY_01_SLOWMO") ACTIVATE_AUDIO_SLOWMO_MODE("BARRY_01_SLOWMO") SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", TRUE) SET_AUDIO_FLAG("AllowAmbientSpeechInSlowMo", TRUE) RC_END_Z_SKIP() ENDPROC //---------------------- // DEBUG FUNCTIONS //---------------------- #IF IS_DEBUG_BUILD /// PURPOSE: /// Operates S, F, J and Z keys PROC UPDATE_DEBUG_KEYS() UPDATE_MISSION_DEBUG_TIMER() IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S) IF IS_CUTSCENE_PLAYING() WAIT_FOR_CUTSCENE_TO_STOP(TRUE, FALSE) ENDIF WHILE NOT HAS_SCRIPT_LOADED("postRC_Barry1and2") REQUEST_SCRIPT("postRC_Barry1and2") WAIT(0) ENDWHILE IF IS_GAMEPLAY_HINT_ACTIVE() STOP_GAMEPLAY_HINT() ENDIF CLEANUP_SCREEN_FX() CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_STOP") TRIGGER_MUSIC_EVENT("RC18A_STOP") TELEPORT_OUT_ALL_ALIEN_PEDS(TRUE) SCRIPT_PASSED() ENDIF IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F) IF IS_CUTSCENE_PLAYING() WAIT_FOR_CUTSCENE_TO_STOP(TRUE, FALSE) ENDIF SET_MISSION_FAILED("") ENDIF IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P) IF IS_CUTSCENE_PLAYING() WAIT_FOR_CUTSCENE_TO_STOP(TRUE, FALSE) ENDIF IF (stageEnum = SE_INTRO) OR (stageEnum = SE_FIRSTCONTACT) DO_Z_SKIP(Z_SKIP_INTRO) ELSE DO_Z_SKIP(Z_SKIP_BATTLE) ENDIF ENDIF IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J) IF IS_CUTSCENE_PLAYING() WAIT_FOR_CUTSCENE_TO_STOP(TRUE, FALSE) ENDIF IF (stageEnum = SE_INTRO) DO_Z_SKIP(Z_SKIP_BATTLE) ELIF (stageEnum = SE_OUTRO) CLEANUP_SCREEN_FX() CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_STOP") TRIGGER_MUSIC_EVENT("RC18A_STOP") SCRIPT_PASSED() ELSE DO_Z_SKIP(Z_SKIP_OUTRO) ENDIF ENDIF IF LAUNCH_MISSION_STAGE_MENU(sSkipMenu, iDbgStageJump) DO_Z_SKIP(iDbgStageJump) ENDIF ENDPROC /// PURPOSE: /// Updates Debug Widgets and draw debug stuff PROC UPDATE_DEBUG_WIDGETS() INT i VECTOR v = GET_ENTITY_COORDS(PLAYER_PED_ID()) DEBUG_DRAW_ANGLED_AREA_EX(respotVehicleArea, 255, 128, 0) IF (bUseAlienSpawnPoint) DRAW_DEBUG_CIRCLE(vAlienSpawnPoint, fAlienSpawnPointRadius, 255, 0, 0, 255, 32) ELSE DRAW_DEBUG_CIRCLE(v, fAlienMinSpawnRadius, 255, 0, 0, 255, 32) DRAW_DEBUG_CIRCLE(v, fAlienMaxSpawnRadius, 0, 255, 0, 255, 32) ENDIF IF (bShowAlienPos) REPEAT COUNT_OF(alienPed) i IF IS_ALIEN_PED_ALIVE(alienPed[i]) DRAW_DEBUG_LINE(v, GET_ENTITY_COORDS(alienPed[i].pedID)) ENDIF ENDREPEAT ENDIF DRAW_DEBUG_CIRCLE(vBattleCenter, fBattleRadius) ENDPROC #ENDIF /// PURPOSE: /// Check to see if player has left battle area if so handle failure PROC UPDATE_PLAYER_AREA_CHECK() BOOL chk = (GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vBattleCenter) < (fBattleRadius + 10.0)) IF (bIsPlayerInBattleArea) IF (chk = FALSE) AND (bSummonFlagActive = FALSE) PRINT_NOW("B1_WARN", DEFAULT_GOD_TEXT_TIME, 1) // Return to the ~y~battleground.~s~ SAFE_REMOVE_BLIP(locationBlip) locationBlip = CREATE_COORD_BLIP(vBattleCenter) iMissionAbandonedTimer = GET_GAME_TIMER() + FAIL_WARNING_TIME TELEPORT_OUT_ALL_ALIEN_PEDS() bIsPlayerInBattleArea = FALSE ENDIF ELSE IF (GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vBattleCenter) > fBattleRadius) IF (GET_GAME_TIMER() > iMissionAbandonedTimer) AND (bSummonFlagActive = FALSE) SET_MISSION_FAILED("B1_FAIL") // ~r~You fled the battle. The aliens took over.~s~ ENDIF ELSE PRINT_NOW("PRIME2", DEFAULT_GOD_TEXT_TIME, 1) // Kill the ~r~aliens.~s~ SAFE_REMOVE_BLIP(locationBlip) bIsPlayerInBattleArea = TRUE ENDIF ENDIF ENDPROC //---------------------- // MAIN SCRIPT //---------------------- SCRIPT(g_structRCScriptArgs sRCLauncherDataIn) VECTOR amin, amax sRCLauncherDataLocal = sRCLauncherDataIn RC_TakeEntityOwnership(sRCLauncherDataLocal) SET_MISSION_FLAG(TRUE) sFailString = "" // clean up any live projectiles near Barry CLEAR_AREA_OF_PROJECTILES((<<190.2424, -956.3790, 28.63>>), 6.0) //BREAK_ON_NATIVE_COMMAND("CLEAR_AREA_OF_OBJECTS", FALSE) // Setup callback when player is killed, arrested or goes to multiplayer IF HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS | FORCE_CLEANUP_FLAG_DEBUG_MENU) CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_STOP") TRIGGER_MUSIC_EVENT("RC18A_STOP") CPRINTLN(DEBUG_MISSION, "Barry1 Force Cleanup: Restore weapons on fail") IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID()) STORE_PLAYER_PED_WEAPONS(PLAYER_PED_ID()) ELSE RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT_FOR_CHAR(CHAR_MICHAEL) ENDIF PRINT_LAUNCHER_DEBUG("Force cleanup [TERMINATING]") // abduction IF ARE_STRINGS_EQUAL(sFailString, "B1_FAIL3") Random_Character_Failed_With_Reason("B1_FAIL3") // death (custom text) ELIF IS_PLAYER_DEAD(PLAYER_ID()) Random_Character_Failed_With_Reason("B1_FAIL2") ELSE Random_Character_Failed() ENDIF SCRIPT_CLEANUP() ENDIF // setup areas MISSION_SETUP() // @SBA SECURE_REQUEST_AND_LOAD_WEAPON_ASSET(wtMiniGun, TRUE) //SECURE_REQUEST_AND_LOAD_WEAPON_ASSET(wtSniperRifle, TRUE) CALCULATE_MIN_MAX_FROM_POSITION_AND_RADIUS(<<181.3, -969.1, 30.3>>, 200.0, amin, amax) DUMMY_REFERENCE_INT(iTotalAlienSpawnCount) IF IS_REPEAT_PLAY_ACTIVE() if not is_screen_faded_in() if not is_screen_fading_in() do_screen_fade_in(default_fade_time) endif endif ENDIF // main loop WHILE (TRUE) REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_GRM") UPDATE_MISSION_NAME_DISPLAYING(sRCLauncherDataLocal.sIntroCutscene) // globals fRegenMultiplier = 1.0 iAlphaCounter = 0 NO_AMBIENT_MALARKY_THIS_FRAME() // for beam FX evo // vCameraForward = GET_FINAL_RENDERED_CAM_ROT() // vCameraCoords = GET_FINAL_RENDERED_CAM_COORD() // fCameraNearClip = GET_FINAL_RENDERED_CAM_NEAR_CLIP() SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID()) SET_PED_NON_CREATION_AREA(amin, amax) SET_PLAYER_MAY_NOT_ENTER_ANY_VEHICLE(GET_PLAYER_INDEX()) // update aliens DISABLE_CELLPHONE_THIS_FRAME_ONLY() UPDATE_ALIEN_PEDS() /* B*1182105 IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedFailAnim) RC_PLAYER_TRIGGER_SCENE_LOCK_IN() ENDIF */ // main switch SWITCH (stageEnum) CASE SE_LEAD_IN UPDATE_STAGE_LEADIN(stageProgress) BREAK CASE SE_INTRO UPDATE_STAGE_INTRO(stageProgress) BREAK CASE SE_FIRSTCONTACT UPDATE_STAGE_FIRSTCONTACT(stageProgress) BREAK CASE SE_WAVE1 UPDATE_STAGE_WAVE_1(stageProgress) BREAK CASE SE_WAVE2 UPDATE_STAGE_WAVE_2(stageProgress) BREAK CASE SE_PASSOUT UPDATE_STAGE_PASSOUT(stageProgress) BREAK CASE SE_OUTRO UPDATE_STAGE_OUTRO(stageProgress) BREAK CASE SE_ABDUCT UPDATE_STAGE_ABDUCT(stageProgress) BREAK CASE SE_FAILED UPDATE_STAGE_FAILED(stageProgress) BREAK ENDSWITCH SET_PLAYER_HEALTH_RECHARGE_MULTIPLIER(GET_PLAYER_INDEX(), fRegenMultiplier) SET_PLAYER_WEAPON_DAMAGE_MODIFIER(GET_PLAYER_INDEX(), fPlayerWeaponDamageModifier) IF IS_MISSION_IN_COMBAT_STAGE() UPDATE_PLAYER_AREA_CHECK() ENDIF WAIT(0) #IF IS_DEBUG_BUILD IF (stageEnum <> SE_FAILED) UPDATE_DEBUG_KEYS() ENDIF IF (bUpdateWidgets) UPDATE_DEBUG_WIDGETS() ENDIF #ENDIF ENDWHILE // Script should never reach here. Always terminate with cleanup function. ENDSCRIPT