Files
UnrealEngineUWP/Engine/Source/Programs/AutomationTool/AutomationUtils/ProjectParams.cs
Andrew Grant fc4e09feb7 Copying //UE4/Orion-Staging to //UE4/Main (Source: //Orion/Dev-General @ 3271386)
#lockdown Nick.Penwarden

Change 3270776 on 2017/01/24 by Laurent.Delayen

	Fixed missing call to CacheBones in AnimNode_SubInstance. Fixes Mudang crash.

	#c0der3view benn.ghallager, lina.halper
	#tests does not crash
	#rb none

Change 3270483 on 2017/01/24 by Shaun.Kime

	Removing the ensure and making it behave safely whenever the scene count is out of sync. Since Paragon isn't using the primary driving feature of MaterialParameterCollections in the UI that required this feature, Nick Darnell and I deemed this okay.

	#jira OR-34919
	#rb  nick.darnell
	#tests PIE and golden path

Change 3270067 on 2017/01/24 by Laurent.Delayen

	Fixed crash when recompiling Mudang's AnimBP. (SubInstances array holding null references)

	#rb benn.ghallager
	#tests doesn not crash

Change 3269760 on 2017/01/24 by Daniel.Lamb

	Added more files to inisettings blacklist.
	#rb Trivial
	#test cook paragon.

Change 3269578 on 2017/01/24 by jason.bestimt

	#ORION_MAIN - Merge 37.2 @ CL 3269468

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3269570 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

	#R0BOMERGE-SAYS: Unresolved conflicts. jason.bestimt, please merge this change by hand.
	//R0BOMERGE_ORION_Dev_General/OrionGame/Content/Characters/Heroes/Grux/Abilities/Stampede/GA_Grux_Stampede.uasset
	//R0BOMERGE_ORION_Dev_General/OrionGame/Content/Characters/Heroes/Ice/Icons/Minimap_char_portrait_Ice.uasset
	//R0BOMERGE_ORION_Dev_General/OrionGame/Content/Characters/Heroes/Ice/Icons/PORT_Ice.uasset
	#c0der3view: jason.bestimt

Change 3269141 on 2017/01/23 by Mieszko.Zielinski

	TSimpleCellGrid::InvalidCell refactor to avoid it being a static member variable #UE4

	#rb Lukasz.Furman
	#test golden path

Change 3268953 on 2017/01/23 by Jason.Bestimt

	#ORION_DG - R0BOMERGE resolution from MAIN to DG of compile fix and banner stuff

	#RB:none
	#Tests:none

	#c0der3view: matt.schembari, andrew.grant

Change 3268576 on 2017/01/23 by John.Pollard

	Add DemoNetDriver to the level collection earlier to remove small window where World->DemoNetDriver could be null as a result of FScopedLevelCollectionContextSwitch

	#rb RyanG
	#tests Live game play + replays + instant replay

Change 3268119 on 2017/01/23 by Daniel.Lamb

	Added support for splitting up chunks into maximum sizes.
	#rb Andrew.Grant
	#test Cook paragon ps4 windows windowserver

Change 3268020 on 2017/01/23 by Dan.Hertzka

	Moving TreeFilterHandler.h out into Slate/Public via branch & delete

	#c0der3view Nick.Darnell
	#rb none
	#tests compile

Change 3267820 on 2017/01/23 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 37.2 @ CL 3267733

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3267817 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3266798 on 2017/01/20 by Daniel.Lamb

	Make the diff files commandlet more helpful.
	#rb Trivial
	#test Diff files commandlet.

Change 3266795 on 2017/01/20 by Daniel.Lamb

	Fixed issue with Cooked packages trying to load dependencies from a dependency offset which is incorrect.
	#rb Gil.Gribb
	#c0der3view Gil.Gribb
	#test Load cooked packages using the editor.

Change 3266310 on 2017/01/20 by Daniel.Lamb

	Fixed issue with cook ont he fly not resolving string asset reference redirectors on load.
	Added fastcook to the iterative cook detection.
	#rb Jamie.Dale
	#test Cook Paragon

Change 3265879 on 2017/01/20 by Jon.Lietz

	fixing PS4 compile error

	#rb none
	#tests compiles
	#c0der3view andrew.grant

Change 3265756 on 2017/01/20 by Jon.Lietz

	quest evaluator

	- added in an ability type that will evaluate in game events and increments player stats for quests, these abilities can be granted by quests or the hero data
	- added support to the ability system to have ability specs not replicated to the client, this will allow for passive only abillities for quest evaluation to only live and exicute on the dedicated server
	-  now support loading in data for quest info asynchronously
	- orion quests can now grant evaluator abilities to the players that own the quests
	- AOrionPlayerState_Game::GiveAbilityData() now grabs all the abilities from active quests
	- at the end of the match unload any data loaded by the quests

	#RB david.ratti
	#test granting abilities

Change 3265658 on 2017/01/20 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 37 @ CL 3265610

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3265627 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3265530 on 2017/01/20 by Robert.Manuszewski

	Making sure all package dependencies are loaded before post loading its objects

	#jira OR-34891
	#tests Golden path x 12
	#rb none

Change 3265126 on 2017/01/19 by Frank.Gigliotti

	Notifies for abilities waiting on input confirmation;

	* Ability tasks waiting for input confirmation will now notify the ability when it begins and ends waiting.

	#RB Dave.Ratti
	#Tests PIE

Change 3264489 on 2017/01/19 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: andrew.grant
	Merged fix from 36.2.
	#rb #tests na

	#R0BOMERGE-SOURCE: CL 3264488 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3263948 on 2017/01/19 by Andrew.Grant

	Non-unity fixes.
	#tests compiled WIn64 editor
	#rb na
	#R0BOMERGE: Main, 37

Change 3263755 on 2017/01/19 by Laurent.Delayen

	OR-34970 FRootMotionSource_ConstantForce now has DisablePartialEndTick set, so we end up with a consistent velocity when the root motion ends.
	Added VelocityOnFinishMode to UAbilityTask_ApplyRootMotionConstantForce so we can optionally override or clamp velocity.
	CVarDebugRootMotionSources now displays Velocity and LastPreAdditiveVelocity on HUD to help debugging RootMotionSources.

	#rb frank.gigliotti
	#tests Ice Q

Change 3263616 on 2017/01/19 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 37 @ CL 3263608

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3263613 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3262543 on 2017/01/18 by Eric.Newman

	Added GetAttributeSetValues feature to Ability System.  Allows for pulling attribute rows without needing an Actor or AbilitySystemComponent
	#rb david.ratti
	#c0der3view david.ratti
	#tests used to export paragon hero attributes
	#jira TON-25429

Change 3262414 on 2017/01/18 by Laurent.Delayen

	Fixed crash opening up Ice's AnimBP.

	#rb lina.halper
	#c0der3view thomas.sarkanen
	#tests opening up AnimBP doesn't crash anymore.

Change 3262291 on 2017/01/18 by Ryan.Gerleve

	Cache the network role of AbilitySystemComponents in PreNetReceive, to make sure the role is correct during serialization if properties are received before BeginPlay.
	Factor out the caching into its own function to reduce code duplication.

	#rb david.ratti
	#tests golden path, bug repro
	#jira OR-31424

Change 3262062 on 2017/01/18 by Max.Chen

	Sequencer: Fixed crash caused by lingering persistent evaluation data

	Copy from Release-4.15

	#jira UE-40775
	#rb andrew.rodham
	#tests none

Change 3262061 on 2017/01/18 by Max.Chen

	Sequencer: Evaluation templates are now only fully rebuilt in PIE, and will not re-cycle track identifiers
	  - This addresses issues with newly compiled tracks recycling the persistent data of old stale tracks.
	  - This commit also ensures we don't fully rebuild templates in the editor when in Sequencer

	Copy from Release-4.15

	#jira UE-40775
	#rb andrew.rodham
	#tests none

Change 3261946 on 2017/01/18 by Jason.Bestimt

	#ORION_DG - Fix for event tracks in sequencer

	#RB:none
	#Tests:none

	#R0BOMERGE: MAIN
	#c0der3view: Max.Chen, andrew.rodham, scott.james

Change 3261812 on 2017/01/18 by Mieszko.Zielinski

	Made bos' perception component vlog information #Orion

	#rb Lukasz.Furman
	#test golden path

Change 3261731 on 2017/01/18 by Benn.Gallagher

	Readded fix to clothing index buffer overflow (lost in merge a while back)
	#tests Editor, assigned clothing to skel mesh
	#rb Tom.Sarkanen

Change 3261730 on 2017/01/18 by Robert.Manuszewski

	Build script sdk upgrade

	#rb none
	#tests Ran the script that was upgraded

Change 3261392 on 2017/01/17 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: andrew.grant
	non-unity fix
	#rb none
	#tests compiled

	#R0BOMERGE-SOURCE: CL 3261391 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3261096 on 2017/01/17 by Laurent.Delayen

	OR-33666 Removed 'bImpartsVelocityOnRemoval' for additive root motion sources, as that can create a 'bouncing' effect when Velocity is modified externally.

	#rb frank.gigliotti
	#tests Preflight QA test  https://jira.it.epicgames.net/browse/PQATC-8713

Change 3261030 on 2017/01/17 by Laurent.Delayen

	Fix crash in Persona.

	#rb none
	#tests doesn't crash

Change 3260561 on 2017/01/17 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: andrew.grant
	Merging Fix from UE 4.15

	Look at the body instance's desired collision enabled value rather than the primitive component's current collision enabled value when determining whether physics state should be created
	#rb Ori.Cohen
	#jira UE-39994
	#tests na

	#R0BOMERGE-SOURCE: CL 3260557 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3260553 on 2017/01/17 by Ryan.Gerleve

	Change cvar in UDemoNetDriver::ShouldSaveCheckpoint to use GetValueOnAnyThread. Fixes OR-34759.

	#rb john.pollard
	#tests bug repro, golden path

Change 3260202 on 2017/01/17 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 37/36.2 @ CL 3260077

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3260201 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3259560 on 2017/01/16 by Marcus.Wassmer

	Fix reflections
	#rb none
	#c0der3view Brian.Karis
	#tests added some reflections

Change 3259348 on 2017/01/16 by Daniel.Lamb

	Moved automation maps from alwayscookmaps to AllAutomationMaps.
	#rb Andrew.Grant
	#test Cook Paragon + Fast Cook Paragon + Preflight Cook Paragon

Change 3259113 on 2017/01/16 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: andrew.grant
	#ORION_MAIN - Merge 36.2 @ CL 3258788

	#RB:none
	#Tests:compiled Win64 editor

	#R0BOMERGE-SOURCE: CL 3258986 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3259090 on 2017/01/16 by Chris.Bunner

	Duplicating CL 3246830: Allow AllocGBuffer call when in simple-forward so dummy uniform buffer creation can occur.
	#rb None
	#tests Editor, -game, epic and min settings

Change 3258910 on 2017/01/16 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - DAILY DG @ CL 3258854

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3258871 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3258807 on 2017/01/16 by Rolando.Caloca

	O - Fix for outlines
	#rb Chris.Bunner
	#tests Ran sovereign2 game
	#c0der3view Andrew.Grant

Change 3258637 on 2017/01/16 by Charles.Anderson

	Removing wrongly added files (agrant)

Change 3258601 on 2017/01/16 by Andrew.Grant

	Temp fix for rendering crash by disabling custom depth rendering
	#rb na
	#tests PIE'd

Change 3258590 on 2017/01/16 by Tom.Wright

	One of these files are not syncing properly in my UnrealGameSync so I'm adding them manually (the .exe).

Change 3258523 on 2017/01/16 by Andrew.Grant

	Removing intermediate build file that was checked in
	#rb #tests na

Change 3258464 on 2017/01/16 by Andrew.Grant

	Fixes for non-unity
	#R0BOMERGE: Main
	#tests compiled Win64
	#rb na

Change 3258208 on 2017/01/15 by Mieszko.Zielinski

	FMetaNavMeshPath's Waypoints have been expanded to store user flags. #UE4

	#rb none
	#test golden path

Change 3258042 on 2017/01/14 by andrew.grant

	Merging test framework changes from //Orion/Release-36.2 to Main (//Orion/Main)
	#rb #tests preflighted

	#R0BOMERGE-SOURCE: CL 3258036 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

	#R0BOMERGE-SAYS: Beep boop! I couldn't merge this change. Please do it yourself, human.
	//R0BOMERGE_ORION_Dev_General/OrionGame/Build/OrionBuild.xml
	#c0der3view: andrew.grant, jason.bestimt

Change 3258035 on 2017/01/14 by Andrew.Grant

	Disable MfMedia plugin by default

Change 3257936 on 2017/01/14 by Andrew.Grant

	Merging from //UE4/Main @ 3253977 through Orion-Staging
	#rb na
	#tests QA smoke in staging, built locally, preflighted

Change 3257583 on 2017/01/13 by Daniel.Lamb

	Removed nomcp from the commandline when running on PC
	#rb Trivial
	#test Buildcookrun paragon windows

Change 3257320 on 2017/01/13 by Cody.Haskell

	#Orion

	- Ansel Integration into Replay Mode
	- Updated Ansel SDK
	- Bug Fix for Ansel plugin
	- Made it not look terrible when you pause the game in regular replay mode

	#rb Andrew
	#r3view-3256093 @andrew.grant
	#tests Golden Path, compiles on PS4
	#lockdown Andrew.Grant

Change 3257239 on 2017/01/13 by Frank.Gigliotti

	ApplyRootMotionJumpForce end velocity options;

	* "ApplyRootMotionJumpForce" task now supports setting the end velocity.

	* Moved root motion end velocity options from the individual tasks into the base class.

	* Fixed a property on UAbilityTask_ApplyRootMotionConstantForce not replicating properly.

	#RB None
	#Tests PIE

Change 3256173 on 2017/01/12 by Laurent.Delayen

	Added additional debug message to ShowResaveMessage.

	#rb lina.halper
	#test loaded broken Femme assets.

Change 3256082 on 2017/01/12 by Andrew.Grant

	Temp fix for BuildHealth warning. Following up with BP team
	#rb none
	#tests verifierd compile warnings are gone

Change 3255991 on 2017/01/12 by Ben.Woodhouse

	Cherry pick NV gpu hang fix from //ue4/release-4.14 @3238182
	Disable timestamp queries on pre-Maxwell nvidia hardware. Local testing suggests that this is the major cause of instability in the UE4.14 release.

	It's possible that we could be more targeted by only excluding Fermi and older hardware, but identifying fermi hardware by device ID is difficult in practice, since the range overlaps with Kepler.
	#jira OR-22580
	#rb none (r3viewed for 4.14 by Marcus Wassmer)
	#tests run locally on PC (change is windows-specific)

Change 3255185 on 2017/01/12 by John.Nielson

	Made it so that PS4 compiles without warning from misordered initialization.

	#RB: r3view
	#r3view-3255186: Andrew.Grant
	#Test: None

Change 3254885 on 2017/01/11 by Michael.Trepka

	CIS fix

	#rb none
	#tests none

Change 3254568 on 2017/01/11 by Andrew.Grant

	Merging relay fix from //Orion/Release-36.2 to Dev-General (//Orion/Dev-General)
	#rb #tests na

Change 3254544 on 2017/01/11 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: andrew.grant
	Robomerging previous fix to Dev-Gen
	#rb #tests na

	#R0BOMERGE-SOURCE: CL 3254532 in //Orion/Release-36.1/... via CL 3254537 via CL 3254540
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3254204 on 2017/01/11 by Michael.Trepka

	Added title bar area to the game layer manager, so that games can easily setup custom title bar content when using borderless windows. Disabled/hidden by default

	#rb none
	#tests Tested in editor build on PC

Change 3254074 on 2017/01/11 by Ryan.Gerleve

	Fix for gameplay tags not being recorded in client replays.

	#rb david.ratti
	#tests golden path, replays

Change 3254035 on 2017/01/11 by Laurent.Delayen

	OR-28756 Added WaitForMovementInput Ability Task to use with Emote ability.

	#rb dave.ratti, frank.gigliotti
	#tests Kallari's emotes

Change 3253736 on 2017/01/11 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 36.2 @ CL 3253668

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3253715 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3252981 on 2017/01/10 by Daniel.Lamb

	Added async load package delegate.
	#rb Trivial
	#test BuildCookRun Paragon with local server

Change 3252975 on 2017/01/10 by Daniel.Lamb

	Added EditorPerProjectUserSettings to the ignore config field for iterative cooking
	#rb None
	#test cook paragon.

Change 3252784 on 2017/01/10 by Daniel.Lamb

	Integrated fix for rebuild lighting commandlet from Greg Korman @ Impulse Gear.
	#rb Daniel.Lamb
	#test Rebuild lighting Paragon

Change 3252460 on 2017/01/10 by Aaron.Eady

	#jira UE-40390 Fix crash saving blueprint with an inherited DataTable/CurveTable reference. Delta serialization meant that the necessary name wasn't in the name table, so adding it manually now.
	#rb robert.manuszewski
	Copied from CL #3252418
	Written by Ben.Zeigler
	#c0der3view Ben.Zeigler, David.Ratti, Andrew.Grant
	#tests PIE

Change 3252222 on 2017/01/10 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 36.2 @ CL 3252019

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3252221 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3251379 on 2017/01/09 by Ori.Cohen

	Fix build

	#rb none
	#tests none

Change 3251242 on 2017/01/09 by buildmachine

	BuildPhysX.Automation: Deploying PhysX & APEX Win64 libs.
	#rb none
	#lockdown Nick.Penwarden
	#tests none

Change 3251240 on 2017/01/09 by buildmachine

	BuildPhysX.Automation: Deploying PhysX & APEX Win32 libs.
	#rb none
	#lockdown Nick.Penwarden
	#tests none

Change 3251224 on 2017/01/09 by buildmachine

	BuildPhysX.Automation: Deploying PhysX & APEX Linux_x86_64-unknown-linux-gnu libs.
	#rb none
	#lockdown Nick.Penwarden
	#tests none

Change 3251220 on 2017/01/09 by buildmachine

	BuildPhysX.Automation: Deploying PhysX & APEX PS4 libs.
	#rb none
	#lockdown Nick.Penwarden
	#tests none

Change 3251206 on 2017/01/09 by Ori.Cohen

	Add logging to possible physx infinite loop.

	#JIRA OR-32515
	#rb Dave.Ratti
	#tests none

Change 3250847 on 2017/01/09 by Daniel.Lamb

	Added excution time stat to unrealpak.
	#rb Trivial
	#test BuildCookRun Paragon with timing info.

Change 3250761 on 2017/01/09 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 36.2 @ CL 3250717

	#RB: none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3250759 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3249410 on 2017/01/06 by Chris.Bunner

	Duplicating CL 3249213: Fixed up logic for windowed/fullscreen output display selection when working with HDR. Now selects the most appropriate display if HDR enabled, else current monitor window is on. FullscreenDisplay commandline functions regardless of HDR support.
	#rb None
	#tests -game windowed/fullscreen behavior

Change 3249285 on 2017/01/06 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 36.2 @ CL 3249117

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3249278 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3247989 on 2017/01/05 by Dan.Hertzka

	Re-adding the null checks from CL 3247771 in Release-36 (the R0BOMERGEd submit didn't include these for some reason)

	#c0der3view Andrew.Grant
	#rb none
	#tests Compiled and didn't crash on editor startup
	#R0BOMERGE: Main

Change 3247790 on 2017/01/05 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: andrew.grant
	Robomerging!
	#tests #rb na

	#R0BOMERGE-SOURCE: CL 3247786 in //Orion/Release-36/... via CL 3247787 via CL 3247788 via CL 3247789
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3247717 on 2017/01/05 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 36.2 @ CL 3247673

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3247716 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3247575 on 2017/01/05 by David.Ratti

	-Fix crash if GE has a null linked target GE
	-Change FGameplayEFfectContext::Ability to be AbilityCDO via TWeakObjectPtr rather than a TSubclass. TSubclass is not weak, so if a class was GC'd while still in a GEEC somewhere, it could crash.

	#rb none
	#tests pie

Change 3247032 on 2017/01/04 by Ori.Cohen

	Touch engine file to re-link physx libs
	#JIRA OR-32839

	#rb none
	#tests none

Change 3247006 on 2017/01/04 by buildmachine

	BuildPhysX.Automation: Deploying PhysX & APEX PS4 libs.
	#rb none
	#lockdown Nick.Penwarden
	#tests none

Change 3246987 on 2017/01/04 by Ori.Cohen

	Add newline for ps4

	#rb none
	#tests none

Change 3246986 on 2017/01/04 by buildmachine

	BuildPhysX.Automation: Deploying PhysX & APEX Win64 libs.
	#rb none
	#lockdown Nick.Penwarden
	#tests none

Change 3246981 on 2017/01/04 by buildmachine

	BuildPhysX.Automation: Deploying PhysX & APEX Linux_x86_64-unknown-linux-gnu libs.
	#rb none
	#lockdown Nick.Penwarden
	#tests none

Change 3246969 on 2017/01/04 by buildmachine

	BuildPhysX.Automation: Deploying PhysX & APEX Win32 libs.
	#rb none
	#lockdown Nick.Penwarden
	#tests none

Change 3246921 on 2017/01/04 by Ori.Cohen

	Fix automation to include #tests none

	#rb none
	#tests none

Change 3246900 on 2017/01/04 by Ori.Cohen

	Fix newline issues for ps4.

	#rb none
	#tests none

Change 3246666 on 2017/01/04 by Chad.Garyet

	Updating physx build to include switch and linux-arm64
	integrate/resolve from dev-physics-upgrade
	#c0der3view ori.cohen

Change 3246450 on 2017/01/04 by Arciel.Rekman

	Fix for sweeps taking too long time (OR-32839).

	- Exhaustive investigation uncovered apparent numerical problems in this code (when compiling with clang 3.9.x with -ffast-math).
	- Current solution can result in overshoot for certain trace extents, but they are not expected to be a practical problem in Unreal.
	- NVidia is aware and will investigate a better solution.

	#rb Ori.Cohen
	#c0der3view Ori.Cohen
	#tests Compiled Linux server with the changed PhysX and continuously ran bot matches for about a day.

Change 3246229 on 2017/01/04 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 36.2 @ CL 3246134

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3246204 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3245068 on 2017/01/03 by Lukasz.Furman

	improving obstacle grid avoidance: adjusting start location when inside obstacle, fixes for string pulling
	#jira OR-33318
	#rb none
	#c0der3view Mieszko.Zielinski
	#tests PIE

Change 3244698 on 2017/01/03 by Lukasz.Furman

	compilation fix: removed optimization pragmas from AISense_Sight.cpp
	#rb none
	#tests none

Change 3244679 on 2017/01/03 by David.Ratti

	Unify linked gameplay effect spec creation:
	-Linked GEs
	-Conditional Execution GEs
	-Overflow GEs
	-Expiration GEs (premature/routine)

	These now create the dependant GE Spec the same way, by duplicating the original context and copying spec tags, MINUS the original GE's asset tags. Actor tags are still recaptured at the moment the spec is created.

	#rb Lietz
	#tests golden path
	#c0der3view Billy.Bramer, Fred.Kimberley

Change 3244499 on 2017/01/02 by Mieszko.Zielinski

	Major AI tactics upgrade #Orion

	Introduction of new objective dealing algorithm (CSP inspired)
	Bots can now place wards
	Bots can now destroy wards and other appopriately marked up OrionDamagableActors (content change in following CL, allows bots to see these actors)
	Switched OrionAIBot.CurrentEnemy to AActor type
	Removed code related to Jungle Rig objectives

	#rb none
	#test golden path

Change 3242918 on 2016/12/22 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 36.2 @ CL 3242890

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3242917 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3241817 on 2016/12/21 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 36.2 @ CL 3241745

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3241811 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3240916 on 2016/12/20 by Ben.Marsh

	Add metadata properties to jobs that create promotable artifacts and execute promotions, for consumption by the pipeline tool. Properties are added to /job[XXX]/Pipeline/Promotable-<Platform>-<Type> or /Promotion-<Platform>-<Type>.

	#rb none
	#c0der3view David.Vossel, Trevor.Pounds
	#tests Ran through preflight

Change 3240857 on 2016/12/20 by Lina.Halper

	Added ensure to track marker sync crash

	#rb: Laurent.Delayen
	#code r3view: Martin.Wilson
	#tests: PIE with  mudangs

Change 3240856 on 2016/12/20 by Laurent.Delayen

	Potential fix for sync marker crash.

	#rb lina.halper
	#c0der3view martin.wilson, lina.halper
	#tests Mudang

Change 3240813 on 2016/12/20 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 36.2 @ CL 3240768

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3240812 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3239624 on 2016/12/19 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 36.2 @ CL 3239590

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3239623 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3238573 on 2016/12/16 by Andrew.Grant

	Moved console vars to source file to avoid multiple definitions (OR-33470)
	#rb none
	#tests compiled

Change 3238077 on 2016/12/16 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 36 @ CL 3238017

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3238059 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3237176 on 2016/12/15 by Laurent.Delayen

	Moved FloatRK4SpringInterpolator and VectorRK4Interpolator from Orion to Engine.

	#rb ori.cohen
	#c0der3view lina.halper, james.golding
	#tests Twinblast and Ice

Change 3236911 on 2016/12/15 by Lukasz.Furman

	changed navgrid projection to use 2D poly search for more accurate results
	#orion
	#rb none
	#tests PIE

Change 3236660 on 2016/12/15 by Jamie.Dale

	Updating Orion text block to upper-case its text in a localized way

	This also prevents it clobbering the text property value with the transformed text, resulting in key stability issues.

	#jira OR-32716
	#rb Dan.Hertzka
	#tests Ran Orion and verified that the "all caps" text was correct, and responded to live-culture changes
	#R0BOMERGE: Main, Release-36

Change 3236658 on 2016/12/15 by Jamie.Dale

	Adding FText::ToLower and FText::ToUpper

	These also track history and rebuild when the text they were generated from is changed.

	#jira OR-32716
	#rb Dan.Hertzka
	#tests Ran Orion and verified that the "all caps" text was correct, and responded to live-culture changes
	#R0BOMERGE: Main, Release-36

Change 3236501 on 2016/12/15 by Lukasz.Furman

	enabled navigation grid avoidance for jungle minions
	#jira OR-33318
	#rb Mieszko.Zielinski
	#tests PIE

Change 3236479 on 2016/12/15 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 36 @ CL 3236423

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3236474 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3236399 on 2016/12/15 by Andrew.Grant

	Fixed pkg warning "Patch created by newer SDK must contain sce_module files" by not excluding "libSceNpToolkit.prx"
	#rb none
	#tests none
	#R0BOMERGE: Main,36

Change 3236280 on 2016/12/15 by Benn.Gallagher

	Fixed crash when clothing cooked data is updated on a client that is not powerful enough to run multithreaded physics (2 or fewer cores)
	#rb Ori.Cohen
	#jira OR-33248
	#tests - Editor + PIE, running through multiple character viewer screens in menu (as per repro), forced single threaded physics and re-ran tests

Change 3235666 on 2016/12/14 by Matt.Schembari

	Merging 3200968 from Dev-Editor for OR-32947.

	#c0der3view Andrew.Grant,Arthur.Flew
	#tests compile

	-------
	Fixed localization gather including texts that were instanced or otherwise unchanged

	- It now uses the archetype when exporting to diff against the default property value, and will only gather text that has changed from the default.
	- UMG widgets that are instanced from another UMG asset now only gather overridden values, and skip all child instances.

	#rb Nick.Darnell

	---------

Change 3235315 on 2016/12/14 by Adric.Worley

	Fix FText parse warning spam when dragging in world outliner

	#jira UE-29099
	#tests editor
	#rb Matt.Kuhlenschmidt

Change 3235177 on 2016/12/14 by Sam.Zamani

	Chat toxicity info added to every out-going party/team chat message
	Added optional "chat-info" XML element to XMPP chat stanzas being sent to a MUC room
	The chat info is added to the room's configuration via ChatInterface OSS
	Currently capturing playlist id, team size, and party size with each chat message

	OGS-479 Add extra attributes to XMPP chat messages for toxicity processing

	#rb: josh.markiewicz, rob.cannaday
	#coderview: ian.fox
	#tests: none

Change 3235093 on 2016/12/14 by Arciel.Rekman

	Linux: switched PhysX/APEX debug info to DWARF3 and rebuilt the libs

	- Also fixed an unrelated compile error (by suppressing the warning - do not merge back to main).

	#rb Ori.Cohen, Andrew.Grant
	#c0der3view Ori.Cohen, Andrew.Grant
	#tests Compiled the server

Change 3234913 on 2016/12/14 by Andrew.Grant

	Duplicated 3200382 from Dev-Core as suspected fix for OR-33328
	#rb #tests na

Change 3234910 on 2016/12/14 by Laurent.Delayen

	Added AnimNotifyState_DisableRootMotion to turn off root motion during a RootMotion Montage, and give control back to the player.

	#rb martin.wilson
	#tests Ice RootMotion Ult networked.

Change 3234823 on 2016/12/14 by Lukasz.Furman

	added capsule support for local navigation grids
	#orion
	#rb none
	#tests PIE

Change 3234768 on 2016/12/14 by Lukasz.Furman

	fixed crash in registering debug scene proxies of gameplay debugger tool
	#orion
	#rb none
	#tests PIE

Change 3234682 on 2016/12/14 by Chad.Garyet

	Adding physx build to dev-general

Change 3234643 on 2016/12/14 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 35.2/36 @ CL 3234401

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3234640 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3234597 on 2016/12/14 by Wes.Hunt

	Merging RealMoneyPurchaseComplete delegate from CatalogHelper into Orion
	* Hooked it up so CatalogHelper doesn't take a persistent reference to the analytics provider.

	Extensive refactor of Orion's AnalyticsProvider lifetime and management.
	* More tightly controlled provider lifetime, eliminated need to recreate the providers unnecessarily.
	* Made provider access functions simpler and clarified creation vs. access (no more lazy getters).
	* Improved handling of GameSessionIDs and UserIDs outside of match to improve data clarity for the analytics backend.

	Details:
	AnalyticsProviderET
	* Added Get/SetAppID APIs to allow the AppID to change without recreating the provider (needed for CompQA support, which isn't always known when the provider is created).
	* SetAppID and SetSessionID now flush their cached events before changing them.
	* SetUserID still does not Flush because we inadvertently rely on this so the UserID can be set several frames later and all events will be sent with a valid UserID.
	OrionAnalytics
	* Simplified contract for correctly creating a new provider: CreateAnalyticsProvider now takes an AccountID and GameSessionID so the provider can be fully initialized with a single call.
	* Exposed CreateAppID function so the places where the AppID needed to dynamically change (CompQA purposes) could use shared Orion naming conventions.
	* Exposed SetDefaultAttributes function so game code could share the logic for setting default attributes.
	* Add assert to CreateAnalyticsProvider because we never expect it to fail, and outside code doesn't have to do it.
	DemoNetDriver
	* Exposed UDemoNetDriver::GetDemoSessionID to allow analytics to set a consistent GameSessionID during replay that is NOT the game session ID of the original match, which was throwing heartbeat events for replays into the same session on the backend, if the replay was watched fast enough.
	OrionGameInstance
	* Server's analytics provider moved to GameInstance as it's lifetime is more appropriate than the GameMode.
	* SetUserID now works in PIE, and sets it to PIE_INSTANCE so we don't pollute our account data with random GUIDs
	GameInstanceCommon
	* When playing back a replay, use the DemoNetDriver's SessionID instead of the Game Session ID of the game being replayed.
	OrionGameMode_MOBA
	* Moved Login functionality to GameMode_Base so it will work properly in all Orion GameModes (ie, DraftLobby).
	OrionGameMode_Base
	* Removed SetAnalyticsProvider. This was confusing the interface and making it seem like providers could change dynamically (they couldn't).
	* GetAnalyticsProvider changed to just get it from the GameInstance where it is really stored now.
	OrionPlayerController_Base
	* Removed SetAnalyticsProvider. No external code should be changing the provider.
	* Exposed an explicit CreateAnalyticsProvider so GetAnalyticsProvider() no longer has to lazily create the provider.
	* Added some asserts on preconditions to CreateAnalyticsProvider to ensure we are not creating them at the wrong times.
	OrionGameSession
	* The Server Analytics provider now sets a UserID that is a combination of the machine name, PID, and a GUID unqiue to that run. This makes server analytics easier to trace back to servers.
	OrionGameState_Base
	* CreateGameSessionID renamed to StoreGameSessionID to better reflect that it isn't creating anything.
	* Remove the code that sets a random GUID for non game modes, which was just confusing the session handling code on the analytics backend.
	* Ensure that demo playback sets the demo session ID and not the replayed game's session ID.
	OrionGameStateMain
	* GameSessionID is always set to the empty string for non game modes.
	McpContext
	* InitAnalytics no longer needs to create the analytics provider or restart any session, etc. It just sets the new AppID (if we now know we are CompQA) and the UserID (since we just logged in).

	#c0der3view:john.pollard,ryan.gerleve,josh.markiewicz
	#rb josh.markiewicz
	#tests extensive runs of the game, dedicated server, menu, and match traveral, and replay watching. Also editor, PIE standalone, PIE w/ dedicated server, and nomcp configurations to ensure no crashes and the providers are created as expected, not recreated, and get the proper Session and GameSessionIDs at the expected times.

	#R0BOMERGE-AUTHOR: david.nikdel
	#CatalogHelper #Analytics:
	- Added a RealMoneyPurchaseComplete multicast delegate to CatalogHelper mostly intended for apps to be able to listen for this event (not as a completion delegate) and do their own analytics events.
	- Rolled up a bunch of the params into a struct for forward compatibility
	- Moved the ECom.ClientInAppPurchase code into a helper on the struct (would like to get this out of catalog helper now that the delegate is there)
	[c0der3viewed]: Ian.Fox, Wes.Hunt

	#R0BOMERGE-SOURCE: CL 3209122 in //WEX/Release-05/... via CL 3209123
	#R0BOMERGE-BOT: OGS (BattleBreakers -> Main)
	#AUTOMERGE using branch ROBO://GamePlugins/Main->//Orion/Dev-General of change#3209125 by Jason.Bestimt on 2016/11/23 12:33:06.
	#R0BOMERGE-AUTHOR: david.nikdel
	Why does the compiler think a parameter can "hide" a non-static member from an outer class. That is most definitely not in scope...

	#R0BOMERGE-SOURCE: CL 3209212 in //WEX/Release-05/... via CL 3209213
	#R0BOMERGE-BOT: OGS (BattleBreakers -> Main)
	#AUTOMERGE using branch ROBO://GamePlugins/Main->//Orion/Dev-General of change#3209214 by Jason.Bestimt on 2016/11/23 14:00:12.
	#R0BOMERGE-AUTHOR: david.nikdel
	#CatalogHelper: Change to AnalyticsProvider to shared reference
	[c0der3viewed]: Ian.Fox

	#R0BOMERGE-SOURCE: CL 3209222 in //WEX/Release-05/... via CL 3209223
	#R0BOMERGE-BOT: OGS (BattleBreakers -> Main)
	#AUTOMERGE using branch ROBO://GamePlugins/Main->//Orion/Dev-General of change#3209225 by Jason.Bestimt on 2016/11/23 14:07:47.
	#R0BOMERGE-AUTHOR: wes.hunt
	Ensure that Heartbeat events will not clog the retry queue if the data router cannot be reached.
	* Renamed to Usage.Heartbeat and Context to match the more "non-gamey" naming we want to move to (also can't have WorldExplorers prefix).
	* Removed the Analytics provider from McpCatalogHelper and use the callback delegate instead. This removes analytics assumptions from the McpCatalog code and allows the analytics provider references to not leak outside of WExpAnalytics. This allows us to put ensures in the shutdown code to make sure it doesn't leak and sessions are closed when we expect. Also cleaned up some code that tried to work around the fact that outside code held onto a reference when trying to end the session.
	[c0der3viewed]:david.nikdel
	#jira wex-4038

	#R0BOMERGE-SOURCE: CL 3209575 in //WEX/Main/WEX/Plugins/...
	#R0BOMERGE-BOT: OGS (BattleBreakers -> Main)
	#AUTOMERGE using branch ROBO://GamePlugins/Main->//Orion/Dev-General of change#3209653 by Jason.Bestimt on 2016/11/24 01:43:48.

Change 3233911 on 2016/12/13 by Andrew.Grant

	Duplicating 3203865 from //UE4/Dev-Sequencer/...
	#tests #rb na

Change 3233789 on 2016/12/13 by Olaf.Piesche

	Replicating 3233289 from Dev-Rendering - light component distance fade properties not initialized

	#c0der3view marcus.wassmer
	#rb marcus.wassmer

	#tests build

Change 3233016 on 2016/12/13 by Ryan.Gerleve

	Fix for conditional properties being evaluated incorrectly when recording replay checkpoints. Fixes heroes appearing as grey boxes in deathcam and replays.

	#jira OR-32926
	#tests golden path, deathcam, replays
	#rb john.pollard

Change 3232909 on 2016/12/13 by Laurent.Delayen

	Renamed USkeletalMeshComponent::IsPlayingRootMotion() to ::IsPlayingNetworkedRootMotionMontage() to better match what the function does, and match definitions in ACharacter. (Also checks for RootMotionMode to be FromMontageOnly).
	Added proper IsPlayingRootMotion() to match ACharacter.
	Also constified these functions.

	#rb Martin.Wilson
	#tests Ice Root Motion ult

Change 3232336 on 2016/12/13 by David.Ratti

	Spot merge async loading fix
	#rb Gil
	#tests cooked build front end store

Change 3231733 on 2016/12/12 by Andrew.Grant

	Added code to dump out deferred engine commands when frametime is above desired
	#rb Michael.Noland
	#tests compiled, ran server
	#R0BOMERGE: Main

Change 3231406 on 2016/12/12 by Laurent.Delayen

	CharacterMovementComponent: allow physics rotation to be performed during AnimRootMotion.

	#rb none
	#tests Ice

Change 3230272 on 2016/12/10 by Andrew.Grant

	Fix for automation code being dead-stripped
	#rb none
	#tests verified automation works

Change 3229976 on 2016/12/09 by Ryan.Gerleve

	Fix multiple UI/HUD issues during deathcam playback:
	No longer switch the local player's PlayerController during deathcam playback. The game player controller will now set it viewtarget to the hero in the deathcam replay.
	Add an option for the recording DemoNetDriver to not spawn a spectator controller at all.
	Clean up some hacks that were needed when the player controller did switch to make the card shop close properly.
	Remove other code that was related to the player controller switch.
	Add a deathcam camera component to hero characters and activate it during deathcam playback.
	Factor out the code common to the spectator chase camera and the deathcam camera into a helper struct that both camera components use.
	Client notifies the server when it starts and stops deathcam, so the server knows not to update the client's viewtarget for the duration.

	#jira OR-32433, OR-32568, OR-31299, OR-31197
	#rb john.pollard, jon.lietz
	#tests golden path, deathcam, replays

Change 3229790 on 2016/12/09 by Lina.Halper

	#DUPEFIX of CL 3219688
	Merging using //Orion/Dev-General_to_//UE4/Dev-Framework

	Expected fix for cooking issue of animation

	#rb: Martin.Wilson
	#code r3view: Martin.Wilson, Laurent.Delayen
	#tests: none

Change 3228731 on 2016/12/09 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 35.2 @ CL 3228573

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3228715 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3228602 on 2016/12/09 by Benn.Gallagher

	Added temporary CVar to fix broken clothing imports due to errant transposition of bone bind matrices on apx file import.
	This should not be integrated to main - hoping on a fix soon from Nvidia for this issue to be fully solved, this just gets our content creators back up and running while Nvidia investigates
	#tests Win64 Editor, importing clothing files for Twinblast and Fallen Angel
	#rb Lina.Halper

Change 3227456 on 2016/12/08 by Andrew.Grant

	Stopped _BUiltData from being dirtied by autosave (copied from 3223169 in Dev-Editor)
	#rb #tests na

Change 3227417 on 2016/12/08 by David.Ratti

	Fix category on gameplay tag settings
	#rb none
	#tests none

Change 3227401 on 2016/12/08 by David.Ratti

	GameplayTag category restrictions remapping support. This allows engine properties to specify categories that can be specified/expanded by projects.

	Added categories for gameplayeffect tags

	#rb BenZ
	#tests editor, golden path

	#c0der3view Billy.Bramer, Fred.Kimberly

Change 3227368 on 2016/12/08 by Uriel.Doyon

	Simple forward shading now disables self shadowed translucency (because it samples an invalid volumetric light buffer).
	#jira OR-32645
	#tests Loaded editor,  tested in game at different quality settings
	#rb daniel.wright

Change 3227243 on 2016/12/08 by David.Ratti

	Spot integrate CL 3225990 to fix tag sorting
	#rb none
	#tests compile

Change 3227029 on 2016/12/08 by Laurent.Delayen

	Fixed crash when creating a new Montage from scratch.

	#rb Lina.Halper
	#tests no more crashing when creating a montage from scratch

Change 3226877 on 2016/12/08 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 35.2 @ CL 3226846

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3226876 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3226157 on 2016/12/07 by Aaron.McLeran

	Implementing UE-39421 fix into Orion-DevGeneral2

	#rb none
	#tests Be able to view sound class graphs without destroying links.

Change 3225422 on 2016/12/07 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - PhysX libs null merge from 35.2

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3225413 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3224772 on 2016/12/07 by David.Ratti

	Fix for Rentry in gameplaycue GetWorld functions
	#rb none
	#tests golden path

Change 3224771 on 2016/12/07 by David.Ratti

	Reset RemoetInstanceHasended in UGameplayAbility::PreActivate
	#rb none
	#tests pie

Change 3224752 on 2016/12/07 by Ben.Marsh

	Merge CL 3224750 from //UE4/Main: Removing -forcelogflush parameter from UAT invocations of the editor to improve cook times.

	#rb none
	#tests preflight

Change 3224691 on 2016/12/07 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 35.2 @ CL 3224223

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3224690 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3224166 on 2016/12/06 by Daniel.Lamb

	Reenabled iterative cooking inisettings saving.
	#rb Trivial
	#test Cook paragon

Change 3223965 on 2016/12/06 by Uriel.Doyon

	Building texture streaming data for materials does not wait for pending shaders to finish compilation anymore.
	Added more options to allow the user to cancel this build also.
	#rb daniel.wright
	#tests modified different shaders in the material editor and also in the material instance editor

Change 3223953 on 2016/12/06 by Frank.Gigliotti

	Root motion time stamp reset;

	* The character movement time stamp is now decremented by MinTimeBetweenTimeStampResets instead of being reset to 0.

	* The character movement time stamp reset is now applied to the start times on root motions.  This fixes root motions being stuck on since the time stamp could potentially never reach the start time.

	* Changed how root motion detects invalid start times since a negative start time is now valid.

	#RB zak.middleton, laurent.delayen
	#c0der3view zak.middleton, laurent.delayen
	#Tests PIE

Change 3223463 on 2016/12/06 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 35.2 @ CL 3223380

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3223458 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3223219 on 2016/12/06 by Daniel.Lamb

	Added more stats to saving asset registry code.
	#rb None
	#test cook

Change 3222459 on 2016/12/05 by Uriel.Doyon

	"Texture Streaming Build" now updates the map check after execution.
	Removed texture streaming data for primitives hidden in game.
	Fixed an issue where build all would not rebuild texture streaming data.
	#rb none
	#jira OR-32771
	#tests rebuilt texture streaming data in different maps

Change 3222246 on 2016/12/05 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: andrew.grant
	Suppress warning when converting from int when the dest is floating point and the converted values are the same
	#rb none
	#tests verified converting -1 to -1.000 no longer results in a warning

	#R0BOMERGE-SOURCE: CL 3222245 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3221951 on 2016/12/05 by Daniel.Lamb

	More stats into saving asset registry.
	#rb None
	#test cook paragon

Change 3221518 on 2016/12/05 by Daniel.Lamb

	Added some more ini settings parsing stats.
	Removed SaveCurrentIniSettings when not using iterative builds as it is slow will reenable when it's fast again.
	#rb None
	#test Cook paragon

Change 3221475 on 2016/12/05 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: andrew.grant
	Fix for atrac9 logging issue on PS4
	#rb none
	#tests compiled PS4 client in unity

	#R0BOMERGE-SOURCE: CL 3221474 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3221403 on 2016/12/05 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 35.2 @ CL 3221235

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3221399 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3221247 on 2016/12/05 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: andrew.grant
	Third-try at fixing non-unity compile issue
	#rb none
	#tests compiled PS4 client

	#R0BOMERGE-SOURCE: CL 3221242 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3219738 on 2016/12/02 by Daniel.Lamb

	Integrate Dev-Platform -> Dev-General
	Added support to rebuild lightmaps commandlet for building lightmaps in seperate files.
	#rb Daniel.Wright
	#test rebuild lighting Custom QAGame maps.
	#jira OR-31907

Change 3219133 on 2016/12/02 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: guillaume.abadie
	Cherry picks Dev-Rendering's 3209305: Fix contact shadow's assemption on objects thickness

	#rb None

	#R0BOMERGE-SOURCE: CL 3219131 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3219081 on 2016/12/02 by Andrew.Grant

	Merging material fixes in 3208490 from
	//UE4/Dev-Rendering/... to //Orion/Dev-General/...
	#rb none
	#tests compiled WIn64 editor

Change 3218980 on 2016/12/02 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 35.2 @ CL 3218942

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3218979 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3218970 on 2016/12/02 by Andrew.Grant

	Second attempt at unity / non-unity fix
	#rb none
	#tests compiled PS4 Client

Change 3218807 on 2016/12/02 by Andrew.Grant

	Fix for non-unity issue
	#rb none
	#tests compiled Win64 editor

Change 3218472 on 2016/12/01 by Andrew.Grant

	Temp fix to allow checked-out blueprint to compile
	#rb none
	#tests none

Change 3218417 on 2016/12/01 by Andrew.Grant

	Merging //UE4/Main @ 3205566 through //UE4/Orion-Stating
	#rb #tests na

Change 3218140 on 2016/12/01 by Arciel.Rekman

	Linux: report server hangs by crashing the hung thread (UE-39164).

	#rb Michael.Trepka
	#c0der3view Bart.Hawthorne, Andrew.Grant.
	#tests none in this branch

	(Merging 3218133 from Dev-Platform to to //Orion/Dev-General)

Change 3216959 on 2016/12/01 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 35.2 @ CL 3216930

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3216954 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3216341 on 2016/11/30 by Michael.Noland

	Engine: Reduced the length of the hitch when turning off ToggleDebugCamera while showdebug was active by removing expired strings from the back of the array instead of the front
	(the underlying issue of strings accumulating while not being displayed / processed is covered by UE-39226)
	#rb marc.audy
	#tests showdebug significancemanager + toggledebugcamera + wait 30 s + toggledebugcamera

Change 3216233 on 2016/11/30 by Andrew.Grant

	Generate symbols for PS4 as a post-build UBT step
	At runtime do a better job of searching paths for symbols
	#rb Marcus.Wassmer
	#tests verified symbols are generated and valid

Change 3215522 on 2016/11/30 by David.Ratti

	Fixes from Simon for particle significance overriding explicit call to SetEmitterEnabled by game code.

	#rb none
	#tests pie
	#c0der3view Simon.Tovey

Change 3215444 on 2016/11/30 by Aaron.McLeran

	OR-19392 (and now) OR-32017  Reintroducing CL 2943174 after it was lost due to integration issues!

	#rb none
	#tests none

Change 3215110 on 2016/11/30 by jason.bestimt

	#ORION_MAIN - Merge 35.2 @ CL 3215050

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3215097 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

	#R0BOMERGE-SAYS: Beep boop! I couldn't merge this change. Please do it yourself, human.
	//R0BOMERGE_ORION_Dev_General/OrionGame/Content/Characters/Heroes/Rampage/Skins/Rampage_v001_IceBlue/M_RampageV001_MASTER.uasset
	#c0der3view: jason.bestimt

Change 3213268 on 2016/11/29 by jason.bestimt

	#ORION_MAIN - Merge 35.2 @ CL 3213062

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3213118 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

	#R0BOMERGE-SAYS: Beep boop! I couldn't merge this change. Please do it yourself, human.
	//R0BOMERGE_ORION_Dev_General/OrionGame/Source/BlueprintContext/Private/BannerContext.cpp
	#c0der3view: jason.bestimt

Change 3212226 on 2016/11/28 by Aaron.McLeran

	OR-32363 Client ensure with USoundWave::GetResourceSize() v35 DevGen

	Ensure is not valid since it's possible for the sound wave to have its resource size queried before its finished decoded in the case of precache on load.

	Rather than report ResourceSize (the compressed asset size), we're going to just report the fully decompressed data size (RawPCMDataSize) since that's what it will be when it finishes decoding.

	#tests none
	#rb zak.middleton

Change 3208273 on 2016/11/22 by Tim.Elek

	Fix for Tonemapping sharpen black border for HDR

	#rb marc.olano
	#c0der3view marcus.wassmer, jordan.walker, andrew.grant

Change 3207881 on 2016/11/22 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: andrew.grant
	If a requested package can't be found and async loading is not an option, load the object instead of hoping that FlushAsyncLoading() will make things right...

	This flaw was spotted while investigating OR-31699 which was due to a different issue, but should have been handled by this codepath.

	#rb none
	#tests Faked a condition where a package  wasn't loaded on the client but became referenced by a object from the server
	[c0der3viewed] Ben.Ziegler

	#R0BOMERGE-SOURCE: CL 3207880 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3207807 on 2016/11/22 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: andrew.grant
	Fix for OR-31699
	While preloading packages check that a package has actually been loaded. Previously this could result in a package failing to load because FindObjectFast would return it to itself (!)
	#rb none
	[c0der3viewed] Michael.Noland
	#tests verified can load into Monolith and get the shadow buff

	#R0BOMERGE-SOURCE: CL 3207806 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3207756 on 2016/11/22 by David.Ratti

	rollback networking changes since they seem to be causing side effects and v35 isnt the version to take chances on
	#rb none
	#tests compile

Change 3206348 on 2016/11/21 by Dan.Hertzka

	Re-added lost type checking changes to the widget BP compiler when evaluating whether to bind a widget

	Also added the type check when renaming a widget - if the property name is taken by a BindWidget property, but the widget isn't of a valid type, the rename now fails

	#c0der3view Nick.Darnell
	#rb Nick.Darnell
	#tests Widget BP binding

Change 3205882 on 2016/11/21 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 34.3 @ CL 3205612

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3205880 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3205802 on 2016/11/21 by Daniel.Lamb

	Fixed commandlet used for diffing cooked packages and generating serialization callstacks.
	#rb None
	#test Diff cooked package commandlet

Change 3204959 on 2016/11/18 by Ryan.Gerleve

	World time is no longer adjusted when scrubbing in replays. Fixes several issues related to deathcam. Originally done to to fix ability cooldowns in replays, but shouldn't be necessary.

	#rb john.pollard
	#jira OR-30918, OR-31268, OR-31302
	#tests golden path, deathcam, replays

Change 3204805 on 2016/11/18 by Frank.Gigliotti

	Don't clamp root motion finish velocity if it doesn't need it.

	#RB None
	#Tests PIE

Change 3204327 on 2016/11/18 by Mieszko.Zielinski

	Extended UBTDecorator_IsAtLocation with an option of using regular geometric distances rather than pathfollowing-based test #UE4

	#rb Lukasz.Furman
	#test golden path

Change 3204078 on 2016/11/18 by Ryan.Gerleve

	Flip incorrect sort when there are multiple viewpoints in the significance manager (duplicate of CL 3203997 from Dev-Framework).
	Fixes objects having incorrect significance in deathcam playback.

	#rb marc.audy
	#tests golden path, deathcam

Change 3204041 on 2016/11/18 by John.Pollard

	Fix issue where old player controller from draft lobby was hanging around, causing replication warnings

	#rb BartH
	#tests Replays

Change 3203971 on 2016/11/18 by John.Pollard

	Fix assert that can occur in player controller iterator when last element cast's to nullptr

	#rb BartH
	#tests Live + replays

Change 3203843 on 2016/11/18 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 34.3 @ CL 3203682

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3203842 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3202948 on 2016/11/17 by Daniel.Lamb

	Disabled warning about invalidating cook due to unparsable ini setting.
	This occurs when you don't have any previously cooked content (like on build machine).
	#jira OR-31916
	#rb trivial
	#test cook paragon

Change 3202798 on 2016/11/17 by David.Ratti

	Fix logic error around bSuppressGameplayCues
	#rb none
	#tests compile

Change 3202761 on 2016/11/17 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: david.ratti
	Use FObjectKey instead of UClass* for function acceleration map. Speculative fix for rare client crash.

	#rb none
	#test pie

	#R0BOMERGE-SOURCE: CL 3202552 in //Orion/Release-34.3/... via CL 3202760
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3202688 on 2016/11/17 by Michael.Noland

	Engine: Adding stats to performance assassians GetAllActorsWithInterface and GetAllActorsWithTag to make them clearer in dumphitches reports (also in GetAllActorsOfClass, which is usually fine unless used with something really broad like AActor or AStaticMeshActor)
	#rb none
	#tests Compiled and ran on PS4

Change 3202687 on 2016/11/17 by Michael.Noland

	Engine: Changed console variables and commands to allow using ? immediately following the command (without a space) to bring up the help text, in addition to the existing behavior of using ? as the first parameter
	#tests Tested with/without spaces on both a console variable and a console command
	#rb nick.darnell

Change 3202686 on 2016/11/17 by Michael.Noland

	Engine: Made help console command open the generated HTML file via LaunchURL on windows
	#tests Tested help command on Windows (LaunchURL with file:// use is only enabled for Windows now, but will be tested on Mac and possibly enabled later)
	#rb nick.darnell

Change 3202622 on 2016/11/17 by Ryan.Gerleve

	Support duplication of UReflectionCaptureComponents that were loaded from cooked data. Needed to support deathcam in Monolith.

	#rb daniel.wright
	#tests golden path on monolith with deathcam enabled on PS4

Change 3202575 on 2016/11/17 by Dan.Hertzka

	Blur widget updates
	- Renamed to SBackgroundBlur/UBackgroundBlur
	- Split SBackgroundBlur out into its own file
	- Added bApplyAlphaToBlur - when true, the strength of the blur is modulated by the widget alpha
	- Updated BlurRadius to be TOptional, so we auto-calculate radius when it isn't set
	- Added a UBackgroundBlurSlot, but left it unattached so it can be done in dev-editor (and update based on the engine version)
	- Updated OrionBlurWidget to export dll symbols and set up default low quality fallback image

	#c0der3view Matt.Kuhlenschmidt
	#rb none
	#tests PIE & widget designer

Change 3202533 on 2016/11/17 by Mieszko.Zielinski

	Fixed new toggleable nav links not working in client-server environment #Orion

	#rb none
	#test golden path

Change 3202456 on 2016/11/17 by Mieszko.Zielinski

	Introduced a new constant to Recast soruces to be used as initial value of tile salt variables #UE4

	#rb none
	#test golden path

Change 3202414 on 2016/11/17 by Chris.Bunner

	Clamp eye adapation working area to match scene viewrect.
	#rb Marcus.Wassmer
	#tests Editor
	#jira OR-31821

Change 3202205 on 2016/11/17 by David.Ratti

	Networking fix:
	-Fix ensure about Delayed Prediction Key being flushed while invalid
	-Fix issue where predicted GE would be removed due to prediction key catch up, but would be added to the removed predicted GE list, causing the later replicated GE to be ignored incorrrectly. This can cause cooldowns to not appear on client, making abilities appear to not function.

	#rb none
	#tests golden path, latency
	#c0der3view Frank.Gigliotti

Change 3202063 on 2016/11/17 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: nicholas.davies
	#jira OR-31641 Chat logs overlap text box when pressing enter
	Jamie Dale fix for adjusting text spacing when lines are removed from TextLayouts
	[c0der3viewed] Jamie.Dale
	#RB Jamie.Dale
	#TESTS Chat should no longer overlap when more than 40 messages have been added

	#R0BOMERGE-SOURCE: CL 3202062 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3201964 on 2016/11/17 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 34.3 @ CL 3201880

	#RB:none
	#Tests:none

	#R0BOMERGE-SOURCE: CL 3201956 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3201426 on 2016/11/16 by Mieszko.Zielinski

	Implemented a generic way to set up simple point navigation links that could be disabled at runtime on static navmesh #Orion

	#rb none
	#test golden path

Change 3201174 on 2016/11/16 by John.Pollard

	Increase number of retries when refreshing viewer fails + refactor so that a refresh doesn't starve other REST calls

	#rb BartH
	#tests Replays

Change 3200669 on 2016/11/16 by Jason.Bestimt

	#R0BOMERGE-AUTHOR: andrew.grant
	Merging test framework changes from Release-34 to resolve some known conflicts
	#rb #tests na

	#R0BOMERGE-SOURCE: CL 3200668 in //Orion/Main/...
	#R0BOMERGE-BOT: ORION (Main -> Dev-General)

Change 3199192 on 2016/11/15 by Lina.Halper

	Extra ensure for the crash with OR-31795

	#jira: OR-31795
	#rb: Laurent.Delayen
	#tests: cooked, and test AI_Test with 9 bots

Change 3199187 on 2016/11/15 by Aaron.McLeran

	UE-35533 Implementing from CL 3112097 Dev-Framework for joey

	#tests Perform tests described in JIRA

	#rb Jeff.Campeau

Change 3199094 on 2016/11/15 by Eric.Newman

	Only ping Slate last interaction time for analog input outside the deadzone
	Orion now only reports handled for analog  movements outside the deadzone
	#c0der3view matt.kulhenschmidt,chris.gagnon
	#rb cody.haskell
	#tests golden path w/ ps4 controller on PC

Change 3199085 on 2016/11/15 by Laurent.Delayen

	Potential fix for https://jira.it.epicgames.net/browse/OR-31795

	#rb lina.halper
	#tests twinblast ult multiPIE

Change 3198934 on 2016/11/15 by Frank.Gigliotti

	Fixed out of sync root motion ability tasks;

	* Root motion ability tasks were out of sync and ending before the root motion was finished.  The tasks now wait for the root motion to say it is done.

	#RB Laurent.Delayen
	#Tests PIE

Change 3198486 on 2016/11/15 by David.Ratti

	Iniitalize EffectContext to default ASC EffectContext when no context is specified in AddGameplayCue_Internal. Fixes some GC translation issues.

	#rb none
	#tests pie

Change 3198424 on 2016/11/15 by Rob.Cannaday

	Fix JSON_SERIALIZE_OBJECT_SERIALIZABLE macro in write mode not beginning a JSON object
	#rb ian.fox
	#tests class using JSON macros that writes a named subobject (BEGIN_JSON_SERIALIZER/JSON_SERIALIZE_OBJECT_SERIALIZABLE("name", obj)/END_JSON_SERIALIZER)

Change 3198418 on 2016/11/15 by Rob.Cannaday

	More profiling for hitch when receiving friend request
	#jira OR-30503
	#rb ian.fox
	#tests front end add/remove friend
	#lockdown nicholas.davies

Change 3198214 on 2016/11/15 by David.Ratti

	Ability System: Added support for some advanced client prediction with the intention of removing latency from the effective duration of predictive gameplay effects.

	1. Predicted GameplayEffect reconciliation.
	Predicted GEs are now reconciled with their replicated counter parts. Previously the predicted GE would be removed when the replicated one came in. Now we reconcile the predicted GE with the replicated GE, and throw out the replicated GE as if it was never added. To the outside, the predicted GE becomes the replicated GE seamlessly.

	2. Server retry client activation fails.
	When a client ability activation fails on the server, the server can retry the activation for a few frames before officially failing it. This is to combat minor discrepencies caused by different server frame rate or jitter in networking conditions. The common example is that we handle RPCs at the top of the frame, before we update timer manager and removed expired GEs or end animations.

	Both features can be disabled with -DisableAdvancedClientPrediction. They can be toggled individually via config file.

	#QAr3view:
	1. Verify ping time no longer affects attack speed OR-30123. We still expect packet loss to have some effect on rate of fire.

	2. Be on the look out for "ability stuck" type of issues

	3. If there are resources, I would like to get 2 people to give qualitative feedback on this. Have them lane 1v1 for ~7 minutes with 200 ms of ping (no packet loss). Do this twice, once normally and again with -DisableAdvancedClientPrediction on both client AND server. Do it blind: don't tell them which run has which setting, just see if they notice differences. The hope is that your LMB attacks feel consistent with respect to timing and match what the UI shows in terms of cooldown. I would recommend testing with Murdock and maybe a melee like Crunch

	#rb frank
	#c0der3view Frank.Gigliotti, Billy.Bramer, Fred.Kimberley
	#tests pie, golden path

Change 3197309 on 2016/11/14 by Laurent.Delayen

	Additional debugging info for https://jira.it.epicgames.net/browse/OR-31266

	#rb none
	#tests riftmage + venus VS riftmage multiPIE

Change 3196654 on 2016/11/14 by Laurent.Delayen

	Additional debug info to track down https://jira.it.epicgames.net/browse/OR-31677

	#rb none
	#tests compiles

[CL 3276432 by Andrew Grant in Main branch]
2017-01-27 23:32:44 -05:00

2438 lines
94 KiB
C#

// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnrealBuildTool;
using System.IO;
using System.Reflection;
namespace AutomationTool
{
[Help("targetplatform=PlatformName", "target platform for building, cooking and deployment (also -Platform)")]
[Help("servertargetplatform=PlatformName", "target platform for building, cooking and deployment of the dedicated server (also -ServerPlatform)")]
public class ProjectParams
{
#region Constructors
/// <summary>
/// Gets a parameter from the command line if it hasn't been specified in the constructor.
/// If the command line is not available, default value will be used.
/// </summary>
/// <param name="Command">Command to parse the command line for. Can be null.</param>
/// <param name="SpecifiedValue">Value specified in the constructor (or not)</param>
/// <param name="Default">Default value.</param>
/// <param name="ParamNames">Command line parameter names to parse.</param>
/// <returns>Parameter value.</returns>
bool GetParamValueIfNotSpecified(BuildCommand Command, bool? SpecifiedValue, bool Default, params string[] ParamNames)
{
if (SpecifiedValue.HasValue)
{
return SpecifiedValue.Value;
}
else if (Command != null)
{
foreach (var Param in ParamNames)
{
if (Command.ParseParam(Param))
{
return true;
}
}
}
return Default;
}
/// <summary>
/// Gets optional parameter from the command line if it hasn't been specified in the constructor.
/// If the command line is not available or the command has not been specified in the command line, default value will be used.
/// </summary>
/// <param name="Command">Command to parse the command line for. Can be null.</param>
/// <param name="SpecifiedValue">Value specified in the constructor (or not)</param>
/// <param name="Default">Default value.</param>
/// <param name="TrueParam">Name of a parameter that sets the value to 'true', for example: -clean</param>
/// <param name="FalseParam">Name of a parameter that sets the value to 'false', for example: -noclean</param>
/// <returns>Parameter value or default value if the paramater has not been specified</returns>
bool? GetOptionalParamValueIfNotSpecified(BuildCommand Command, bool? SpecifiedValue, bool? Default, string TrueParam, string FalseParam)
{
if (SpecifiedValue.HasValue)
{
return SpecifiedValue.Value;
}
else if (Command != null)
{
bool? Value = null;
if (!String.IsNullOrEmpty(TrueParam) && Command.ParseParam(TrueParam))
{
Value = true;
}
else if (!String.IsNullOrEmpty(FalseParam) && Command.ParseParam(FalseParam))
{
Value = false;
}
if (Value.HasValue)
{
return Value;
}
}
return Default;
}
/// <summary>
/// Gets a parameter value from the command line if it hasn't been specified in the constructor.
/// If the command line is not available, default value will be used.
/// </summary>
/// <param name="Command">Command to parse the command line for. Can be null.</param>
/// <param name="SpecifiedValue">Value specified in the constructor (or not)</param>
/// <param name="ParamName">Command line parameter name to parse.</param>
/// <param name="Default">Default value</param>
/// <param name="bTrimQuotes">If set, the leading and trailing quotes will be removed, e.g. instead of "/home/User Name" it will return /home/User Name</param>
/// <returns>Parameter value.</returns>
string ParseParamValueIfNotSpecified(BuildCommand Command, string SpecifiedValue, string ParamName, string Default = "", bool bTrimQuotes = false)
{
string Result = Default;
if (SpecifiedValue != null)
{
Result = SpecifiedValue;
}
else if (Command != null)
{
Result = Command.ParseParamValue(ParamName, Default);
}
return bTrimQuotes ? Result.Trim( new char[]{'\"'} ) : Result;
}
/// <summary>
/// Sets up platforms
/// </summary>
/// <param name="DependentPlatformMap">Set with a mapping from source->destination if specified on command line</param>
/// <param name="Command">The command line to parse</param>
/// <param name="OverrideTargetPlatforms">If passed use this always</param>
/// <param name="DefaultTargetPlatforms">Use this if nothing is passed on command line</param>
/// <param name="AllowPlatformParams">Allow raw -platform options</param>
/// <param name="PlatformParamNames">Possible -parameters to check for</param>
/// <returns>List of platforms parsed from the command line</returns>
private List<TargetPlatformDescriptor> SetupTargetPlatforms(ref Dictionary<TargetPlatformDescriptor, TargetPlatformDescriptor> DependentPlatformMap, BuildCommand Command, List<TargetPlatformDescriptor> OverrideTargetPlatforms, List<TargetPlatformDescriptor> DefaultTargetPlatforms, bool AllowPlatformParams, params string[] PlatformParamNames)
{
List<TargetPlatformDescriptor> TargetPlatforms = null;
if (CommandUtils.IsNullOrEmpty(OverrideTargetPlatforms))
{
if (Command != null)
{
// Parse the command line, we support the following params:
// -'PlatformParamNames[n]'=Platform_1+Platform_2+...+Platform_k
// or (if AllowPlatformParams is true)
// -Platform_1 -Platform_2 ... -Platform_k
string CmdLinePlatform = null;
foreach (var ParamName in PlatformParamNames)
{
CmdLinePlatform = Command.ParseParamValue(ParamName);
if (!String.IsNullOrEmpty(CmdLinePlatform))
{
break;
}
}
List<string> CookFlavors = null;
{
string CmdLineCookFlavor = Command.ParseParamValue("cookflavor");
if (!String.IsNullOrEmpty(CmdLineCookFlavor))
{
CookFlavors = new List<string>(CmdLineCookFlavor.Split('+'));
}
}
if (!String.IsNullOrEmpty(CmdLinePlatform))
{
// Get all platforms from the param value: Platform_1+Platform_2+...+Platform_k
TargetPlatforms = new List<TargetPlatformDescriptor>();
var PlatformNames = new List<string>(CmdLinePlatform.Split('+'));
foreach (var PlatformName in PlatformNames)
{
// Look for dependent platforms, Source_1.Dependent_1+Source_2.Dependent_2+Standalone_3
var SubPlatformNames = new List<string>(PlatformName.Split('.'));
foreach (var SubPlatformName in SubPlatformNames)
{
UnrealTargetPlatform NewPlatformType = (UnrealTargetPlatform)Enum.Parse(typeof(UnrealTargetPlatform), SubPlatformName, true);
// generate all valid platform descriptions for this platform type + cook flavors
List<TargetPlatformDescriptor> PlatformDescriptors = Platform.GetValidTargetPlatforms(NewPlatformType, CookFlavors);
TargetPlatforms.AddRange(PlatformDescriptors);
if (SubPlatformName != SubPlatformNames[0])
{
// This is not supported with cook flavors
if (!CommandUtils.IsNullOrEmpty(CookFlavors))
{
throw new AutomationException("Cook flavors are not supported for dependent platforms!");
}
// We're a dependent platform so add ourselves to the map, pointing to the first element in the list
UnrealTargetPlatform FirstPlatformType = (UnrealTargetPlatform)Enum.Parse(typeof(UnrealTargetPlatform), SubPlatformNames[0], true);
DependentPlatformMap.Add(new TargetPlatformDescriptor(NewPlatformType), new TargetPlatformDescriptor(FirstPlatformType));
}
}
}
}
else if (AllowPlatformParams)
{
// Look up platform names in the command line: -Platform_1 -Platform_2 ... -Platform_k
TargetPlatforms = new List<TargetPlatformDescriptor>();
foreach (UnrealTargetPlatform PlatType in Enum.GetValues(typeof(UnrealTargetPlatform)))
{
if (PlatType != UnrealTargetPlatform.Unknown)
{
if (Command.ParseParam(PlatType.ToString()))
{
List<TargetPlatformDescriptor> PlatformDescriptors = Platform.GetValidTargetPlatforms(PlatType, CookFlavors);
TargetPlatforms.AddRange(PlatformDescriptors);
}
}
}
}
}
}
else
{
TargetPlatforms = OverrideTargetPlatforms;
}
if (CommandUtils.IsNullOrEmpty(TargetPlatforms))
{
// Revert to single default platform - the current platform we're running
TargetPlatforms = DefaultTargetPlatforms;
}
return TargetPlatforms;
}
public ProjectParams(ProjectParams InParams)
{
//
//// Use this.Name with properties and fields!
//
this.RawProjectPath = InParams.RawProjectPath;
this.MapsToCook = InParams.MapsToCook;
this.MapIniSectionsToCook = InParams.MapIniSectionsToCook;
this.DirectoriesToCook = InParams.DirectoriesToCook;
this.InternationalizationPreset = InParams.InternationalizationPreset;
this.CulturesToCook = InParams.CulturesToCook;
this.BasedOnReleaseVersion = InParams.BasedOnReleaseVersion;
this.CreateReleaseVersion = InParams.CreateReleaseVersion;
this.GeneratePatch = InParams.GeneratePatch;
this.DLCName = InParams.DLCName;
this.DLCIncludeEngineContent = InParams.DLCIncludeEngineContent;
this.DiffCookedContentPath = InParams.DiffCookedContentPath;
this.NewCook = InParams.NewCook;
this.OldCook = InParams.OldCook;
this.AdditionalCookerOptions = InParams.AdditionalCookerOptions;
this.ClientCookedTargets = InParams.ClientCookedTargets;
this.ServerCookedTargets = InParams.ServerCookedTargets;
this.EditorTargets = InParams.EditorTargets;
this.ProgramTargets = InParams.ProgramTargets;
this.ClientTargetPlatforms = InParams.ClientTargetPlatforms;
this.ClientDependentPlatformMap = InParams.ClientDependentPlatformMap;
this.ServerTargetPlatforms = InParams.ServerTargetPlatforms;
this.ServerDependentPlatformMap = InParams.ServerDependentPlatformMap;
this.Build = InParams.Build;
this.Run = InParams.Run;
this.Cook = InParams.Cook;
this.IterativeCooking = InParams.IterativeCooking;
this.IterateSharedCookedBuild = InParams.IterateSharedCookedBuild;
this.CookAll = InParams.CookAll;
this.CookPartialGC = InParams.CookPartialGC;
this.CookInEditor = InParams.CookInEditor;
this.CookMapsOnly = InParams.CookMapsOnly;
this.SkipCook = InParams.SkipCook;
this.SkipCookOnTheFly = InParams.SkipCookOnTheFly;
this.Prebuilt = InParams.Prebuilt;
this.RunTimeoutSeconds = InParams.RunTimeoutSeconds;
this.Clean = InParams.Clean;
this.Pak = InParams.Pak;
this.SignPak = InParams.SignPak;
this.SignedPak = InParams.SignedPak;
this.SkipPak = InParams.SkipPak;
this.NoXGE = InParams.NoXGE;
this.CookOnTheFly = InParams.CookOnTheFly;
this.CookOnTheFlyStreaming = InParams.CookOnTheFlyStreaming;
this.UnversionedCookedContent = InParams.UnversionedCookedContent;
this.EncryptIniFiles = InParams.EncryptIniFiles;
this.EncryptEverything = InParams.EncryptEverything;
this.SkipCookingEditorContent = InParams.SkipCookingEditorContent;
this.NumCookersToSpawn = InParams.NumCookersToSpawn;
this.FileServer = InParams.FileServer;
this.DedicatedServer = InParams.DedicatedServer;
this.Client = InParams.Client;
this.NoClient = InParams.NoClient;
this.LogWindow = InParams.LogWindow;
this.Stage = InParams.Stage;
this.SkipStage = InParams.SkipStage;
this.StageDirectoryParam = InParams.StageDirectoryParam;
this.Manifests = InParams.Manifests;
this.CreateChunkInstall = InParams.CreateChunkInstall;
this.UE4Exe = InParams.UE4Exe;
this.NoDebugInfo = InParams.NoDebugInfo;
this.NoCleanStage = InParams.NoCleanStage;
this.MapToRun = InParams.MapToRun;
this.AdditionalServerMapParams = InParams.AdditionalServerMapParams;
this.Foreign = InParams.Foreign;
this.ForeignCode = InParams.ForeignCode;
this.StageCommandline = InParams.StageCommandline;
this.BundleName = InParams.BundleName;
this.RunCommandline = InParams.RunCommandline;
this.ServerCommandline = InParams.ServerCommandline;
this.Package = InParams.Package;
this.Deploy = InParams.Deploy;
this.DeployFolder = InParams.DeployFolder;
this.IterativeDeploy = InParams.IterativeDeploy;
this.IgnoreCookErrors = InParams.IgnoreCookErrors;
this.FastCook = InParams.FastCook;
this.Devices = InParams.Devices;
this.DeviceNames = InParams.DeviceNames;
this.ServerDevice = InParams.ServerDevice;
this.NullRHI = InParams.NullRHI;
this.FakeClient = InParams.FakeClient;
this.EditorTest = InParams.EditorTest;
this.RunAutomationTests = InParams.RunAutomationTests;
this.RunAutomationTest = InParams.RunAutomationTest;
this.CrashIndex = InParams.CrashIndex;
this.Port = InParams.Port;
this.SkipServer = InParams.SkipServer;
this.Unattended = InParams.Unattended;
this.ServerDeviceAddress = InParams.ServerDeviceAddress;
this.DeviceUsername = InParams.DeviceUsername;
this.DevicePassword = InParams.DevicePassword;
this.CrashReporter = InParams.CrashReporter;
this.ClientConfigsToBuild = InParams.ClientConfigsToBuild;
this.ServerConfigsToBuild = InParams.ServerConfigsToBuild;
this.NumClients = InParams.NumClients;
this.Compressed = InParams.Compressed;
this.UseDebugParamForEditorExe = InParams.UseDebugParamForEditorExe;
this.bUsesSteam = InParams.bUsesSteam;
this.bUsesCEF3 = InParams.bUsesCEF3;
this.bUsesSlate = InParams.bUsesSlate;
this.bDebugBuildsActuallyUseDebugCRT = InParams.bDebugBuildsActuallyUseDebugCRT;
this.Archive = InParams.Archive;
this.ArchiveDirectoryParam = InParams.ArchiveDirectoryParam;
this.ArchiveMetaData = InParams.ArchiveMetaData;
this.CreateAppBundle = InParams.CreateAppBundle;
this.Distribution = InParams.Distribution;
this.Prereqs = InParams.Prereqs;
this.AppLocalDirectory = InParams.AppLocalDirectory;
this.NoBootstrapExe = InParams.NoBootstrapExe;
this.Prebuilt = InParams.Prebuilt;
this.RunTimeoutSeconds = InParams.RunTimeoutSeconds;
this.bIsCodeBasedProject = InParams.bIsCodeBasedProject;
this.bCodeSign = InParams.bCodeSign;
this.TitleID = InParams.TitleID;
this.bTreatNonShippingBinariesAsDebugFiles = InParams.bTreatNonShippingBinariesAsDebugFiles;
this.RunAssetNativization = InParams.RunAssetNativization;
}
/// <summary>
/// Constructor. Be sure to use this.ParamName to set the actual property name as parameter names and property names
/// overlap here.
/// If a parameter value is not set, it will be parsed from the command line; if the command is null, the default value will be used.
/// </summary>
public ProjectParams(
FileReference RawProjectPath,
BuildCommand Command = null,
string Device = null,
string MapToRun = null,
string AdditionalServerMapParams = null,
ParamList<string> Port = null,
string RunCommandline = null,
string StageCommandline = null,
string BundleName = null,
string StageDirectoryParam = null,
string UE4Exe = null,
string SignPak = null,
List<UnrealTargetConfiguration> ClientConfigsToBuild = null,
List<UnrealTargetConfiguration> ServerConfigsToBuild = null,
ParamList<string> MapsToCook = null,
ParamList<string> MapIniSectionsToCook = null,
ParamList<string> DirectoriesToCook = null,
string InternationalizationPreset = null,
ParamList<string> CulturesToCook = null,
ParamList<string> ClientCookedTargets = null,
ParamList<string> EditorTargets = null,
ParamList<string> ServerCookedTargets = null,
List<TargetPlatformDescriptor> ClientTargetPlatforms = null,
Dictionary<TargetPlatformDescriptor, TargetPlatformDescriptor> ClientDependentPlatformMap = null,
List<TargetPlatformDescriptor> ServerTargetPlatforms = null,
Dictionary<TargetPlatformDescriptor, TargetPlatformDescriptor> ServerDependentPlatformMap = null,
bool? Build = null,
bool? Cook = null,
bool? Run = null,
bool? SkipServer = null,
bool? Clean = null,
bool? Compressed = null,
bool? UseDebugParamForEditorExe = null,
bool? IterativeCooking = null,
bool? IterateSharedCookedBuild = null,
bool? CookAll = null,
bool? CookPartialGC = null,
bool? CookInEditor = null,
bool? CookMapsOnly = null,
bool? CookOnTheFly = null,
bool? CookOnTheFlyStreaming = null,
bool? UnversionedCookedContent = null,
bool? EncryptIniFiles = null,
bool? EncryptEverything = null,
bool? SkipCookingEditorContent = null,
int? NumCookersToSpawn = null,
string AdditionalCookerOptions = null,
string BasedOnReleaseVersion = null,
string CreateReleaseVersion = null,
string CreateReleaseVersionBasePath = null,
string BasedOnReleaseVersionBasePath = null,
bool? GeneratePatch = null,
string DLCName = null,
string DiffCookedContentPath = null,
bool? DLCIncludeEngineContent = null,
bool? NewCook = null,
bool? OldCook = null,
bool? CrashReporter = null,
bool? DedicatedServer = null,
bool? Client = null,
bool? Deploy = null,
string DeployFolder = null,
bool? FileServer = null,
bool? Foreign = null,
bool? ForeignCode = null,
bool? LogWindow = null,
bool? NoCleanStage = null,
bool? NoClient = null,
bool? NoDebugInfo = null,
bool? NoXGE = null,
bool? Package = null,
bool? Pak = null,
bool? Prereqs = null,
string AppLocalDirectory = null,
bool? NoBootstrapExe = null,
bool? SignedPak = null,
bool? NullRHI = null,
bool? FakeClient = null,
bool? EditorTest = null,
bool? RunAutomationTests = null,
string RunAutomationTest = null,
int? CrashIndex = null,
bool? SkipCook = null,
bool? SkipCookOnTheFly = null,
bool? SkipPak = null,
bool? SkipStage = null,
bool? Stage = null,
bool? Manifests = null,
bool? CreateChunkInstall = null,
bool? Unattended = null,
int? NumClients = null,
bool? Archive = null,
string ArchiveDirectoryParam = null,
bool? ArchiveMetaData = null,
bool? CreateAppBundle = null,
ParamList<string> ProgramTargets = null,
bool? Distribution = null,
bool? Prebuilt = null,
int? RunTimeoutSeconds = null,
string SpecifiedArchitecture = null,
bool? IterativeDeploy = null,
bool? FastCook = null,
bool? IgnoreCookErrors = null,
bool? RunAssetNativization = null,
bool? CodeSign = null,
bool? TreatNonShippingBinariesAsDebugFiles = null,
string Provision = null,
string Certificate = null,
ParamList<string> InMapsToRebuildLightMaps = null,
ParamList<string> TitleID = null
)
{
//
//// Use this.Name with properties and fields!
//
this.RawProjectPath = RawProjectPath;
if (DirectoriesToCook != null)
{
this.DirectoriesToCook = DirectoriesToCook;
}
this.InternationalizationPreset = ParseParamValueIfNotSpecified(Command, InternationalizationPreset, "i18npreset");
// If not specified in parameters, check commandline.
if (CulturesToCook == null)
{
if (Command != null)
{
var CookCulturesString = Command.ParseParamValue("CookCultures");
if (CookCulturesString != null)
{
this.CulturesToCook = new ParamList<string>(CookCulturesString.Split(','));
}
}
}
else
{
this.CulturesToCook = CulturesToCook;
}
if (ClientCookedTargets != null)
{
this.ClientCookedTargets = ClientCookedTargets;
}
if (ServerCookedTargets != null)
{
this.ServerCookedTargets = ServerCookedTargets;
}
if (EditorTargets != null)
{
this.EditorTargets = EditorTargets;
}
if (ProgramTargets != null)
{
this.ProgramTargets = ProgramTargets;
}
// Parse command line params for client platforms "-TargetPlatform=Win64+Mac", "-Platform=Win64+Mac" and also "-Win64", "-Mac" etc.
if (ClientDependentPlatformMap != null)
{
this.ClientDependentPlatformMap = ClientDependentPlatformMap;
}
List<TargetPlatformDescriptor> DefaultTargetPlatforms = new ParamList<TargetPlatformDescriptor>(new TargetPlatformDescriptor(HostPlatform.Current.HostEditorPlatform));
this.ClientTargetPlatforms = SetupTargetPlatforms(ref this.ClientDependentPlatformMap, Command, ClientTargetPlatforms, DefaultTargetPlatforms, true, "TargetPlatform", "Platform");
// Parse command line params for server platforms "-ServerTargetPlatform=Win64+Mac", "-ServerPlatform=Win64+Mac". "-Win64" etc is not allowed here
if (ServerDependentPlatformMap != null)
{
this.ServerDependentPlatformMap = ServerDependentPlatformMap;
}
this.ServerTargetPlatforms = SetupTargetPlatforms(ref this.ServerDependentPlatformMap, Command, ServerTargetPlatforms, this.ClientTargetPlatforms, false, "ServerTargetPlatform", "ServerPlatform");
this.Build = GetParamValueIfNotSpecified(Command, Build, this.Build, "build");
this.Run = GetParamValueIfNotSpecified(Command, Run, this.Run, "run");
this.Cook = GetParamValueIfNotSpecified(Command, Cook, this.Cook, "cook");
this.NewCook = GetParamValueIfNotSpecified(Command, NewCook, this.NewCook, "NewCook");
this.OldCook = GetParamValueIfNotSpecified(Command, OldCook, this.OldCook, "OldCook");
this.CreateReleaseVersionBasePath = ParseParamValueIfNotSpecified(Command, CreateReleaseVersionBasePath, "createreleaseversionroot", String.Empty);
this.BasedOnReleaseVersionBasePath = ParseParamValueIfNotSpecified(Command, BasedOnReleaseVersionBasePath, "basedonreleaseversionroot", String.Empty);
this.CreateReleaseVersion = ParseParamValueIfNotSpecified(Command, CreateReleaseVersion, "createreleaseversion", String.Empty);
this.BasedOnReleaseVersion = ParseParamValueIfNotSpecified(Command, BasedOnReleaseVersion, "basedonreleaseversion", String.Empty);
this.GeneratePatch = GetParamValueIfNotSpecified(Command, GeneratePatch, this.GeneratePatch, "GeneratePatch");
this.AdditionalCookerOptions = ParseParamValueIfNotSpecified(Command, AdditionalCookerOptions, "AdditionalCookerOptions", String.Empty);
this.DLCName = ParseParamValueIfNotSpecified(Command, DLCName, "DLCName", String.Empty);
this.DiffCookedContentPath = ParseParamValueIfNotSpecified(Command, DiffCookedContentPath, "DiffCookedContentPath", String.Empty);
this.DLCIncludeEngineContent = GetParamValueIfNotSpecified(Command, DLCIncludeEngineContent, this.DLCIncludeEngineContent, "DLCIncludeEngineContent");
this.SkipCook = GetParamValueIfNotSpecified(Command, SkipCook, this.SkipCook, "skipcook");
if (this.SkipCook)
{
this.Cook = true;
}
this.Clean = GetOptionalParamValueIfNotSpecified(Command, Clean, this.Clean, "clean", null);
this.SignPak = ParseParamValueIfNotSpecified(Command, SignPak, "signpak", String.Empty);
this.SignedPak = !String.IsNullOrEmpty(this.SignPak) || GetParamValueIfNotSpecified(Command, SignedPak, this.SignedPak, "signedpak");
if (string.IsNullOrEmpty(this.SignPak))
{
this.SignPak = Path.Combine(RawProjectPath.Directory.FullName, @"Build\NoRedist\Keys.txt");
if (!File.Exists(this.SignPak))
{
this.SignPak = null;
}
}
this.Pak = GetParamValueIfNotSpecified(Command, Pak, this.Pak, "pak");
this.SkipPak = GetParamValueIfNotSpecified(Command, SkipPak, this.SkipPak, "skippak");
if (this.SkipPak)
{
this.Pak = true;
}
this.NoXGE = GetParamValueIfNotSpecified(Command, NoXGE, this.NoXGE, "noxge");
this.CookOnTheFly = GetParamValueIfNotSpecified(Command, CookOnTheFly, this.CookOnTheFly, "cookonthefly");
if (this.CookOnTheFly && this.SkipCook)
{
this.Cook = false;
}
this.CookOnTheFlyStreaming = GetParamValueIfNotSpecified(Command, CookOnTheFlyStreaming, this.CookOnTheFlyStreaming, "cookontheflystreaming");
this.UnversionedCookedContent = GetParamValueIfNotSpecified(Command, UnversionedCookedContent, this.UnversionedCookedContent, "UnversionedCookedContent");
this.EncryptIniFiles = GetParamValueIfNotSpecified(Command, EncryptIniFiles, this.EncryptIniFiles, "EncryptIniFiles");
this.EncryptEverything = GetParamValueIfNotSpecified(Command, EncryptEverything, this.EncryptEverything, "EncryptEverything");
this.SkipCookingEditorContent = GetParamValueIfNotSpecified(Command, SkipCookingEditorContent, this.SkipCookingEditorContent, "SkipCookingEditorContent");
if (NumCookersToSpawn.HasValue)
{
this.NumCookersToSpawn = NumCookersToSpawn.Value;
}
else if (Command != null)
{
this.NumCookersToSpawn = Command.ParseParamInt("NumCookersToSpawn");
}
this.Compressed = GetParamValueIfNotSpecified(Command, Compressed, this.Compressed, "compressed");
this.UseDebugParamForEditorExe = GetParamValueIfNotSpecified(Command, UseDebugParamForEditorExe, this.UseDebugParamForEditorExe, "UseDebugParamForEditorExe");
this.IterativeCooking = GetParamValueIfNotSpecified(Command, IterativeCooking, this.IterativeCooking, new string[] { "iterativecooking", "iterate" });
this.IterateSharedCookedBuild = GetParamValueIfNotSpecified(Command, IterateSharedCookedBuild, this.IterateSharedCookedBuild, new string[] { "IterateSharedCookedBuild"});
this.SkipCookOnTheFly = GetParamValueIfNotSpecified(Command, SkipCookOnTheFly, this.SkipCookOnTheFly, "skipcookonthefly");
this.CookAll = GetParamValueIfNotSpecified(Command, CookAll, this.CookAll, "CookAll");
this.CookPartialGC = GetParamValueIfNotSpecified(Command, CookPartialGC, this.CookPartialGC, "CookPartialGC");
this.CookInEditor = GetParamValueIfNotSpecified(Command, CookInEditor, this.CookInEditor, "CookInEditor");
this.CookMapsOnly = GetParamValueIfNotSpecified(Command, CookMapsOnly, this.CookMapsOnly, "CookMapsOnly");
this.FileServer = GetParamValueIfNotSpecified(Command, FileServer, this.FileServer, "fileserver");
this.DedicatedServer = GetParamValueIfNotSpecified(Command, DedicatedServer, this.DedicatedServer, "dedicatedserver", "server");
this.Client = GetParamValueIfNotSpecified(Command, Client, this.Client, "client");
/*if( this.Client )
{
this.DedicatedServer = true;
}*/
this.NoClient = GetParamValueIfNotSpecified(Command, NoClient, this.NoClient, "noclient");
this.LogWindow = GetParamValueIfNotSpecified(Command, LogWindow, this.LogWindow, "logwindow");
this.Stage = GetParamValueIfNotSpecified(Command, Stage, this.Stage, "stage");
this.SkipStage = GetParamValueIfNotSpecified(Command, SkipStage, this.SkipStage, "skipstage");
if (this.SkipStage)
{
this.Stage = true;
}
this.StageDirectoryParam = ParseParamValueIfNotSpecified(Command, StageDirectoryParam, "stagingdirectory", String.Empty, true);
this.bCodeSign = GetParamValueIfNotSpecified(Command, CodeSign, CommandUtils.IsBuildMachine, "CodeSign");
this.bTreatNonShippingBinariesAsDebugFiles = GetParamValueIfNotSpecified(Command, TreatNonShippingBinariesAsDebugFiles, false, "TreatNonShippingBinariesAsDebugFiles");
this.Manifests = GetParamValueIfNotSpecified(Command, Manifests, this.Manifests, "manifests");
this.CreateChunkInstall = GetParamValueIfNotSpecified(Command, CreateChunkInstall, this.CreateChunkInstall, "createchunkinstall");
this.ChunkInstallDirectory = ParseParamValueIfNotSpecified(Command, ChunkInstallDirectory, "chunkinstalldirectory", String.Empty, true);
this.ChunkInstallVersionString = ParseParamValueIfNotSpecified(Command, ChunkInstallVersionString, "chunkinstallversion", String.Empty, true);
this.Archive = GetParamValueIfNotSpecified(Command, Archive, this.Archive, "archive");
this.ArchiveDirectoryParam = ParseParamValueIfNotSpecified(Command, ArchiveDirectoryParam, "archivedirectory", String.Empty, true);
this.ArchiveMetaData = GetParamValueIfNotSpecified(Command, ArchiveMetaData, this.ArchiveMetaData, "archivemetadata");
this.CreateAppBundle = GetParamValueIfNotSpecified(Command, CreateAppBundle, true, "createappbundle");
this.Distribution = GetParamValueIfNotSpecified(Command, Distribution, this.Distribution, "distribution");
this.Prereqs = GetParamValueIfNotSpecified(Command, Prereqs, this.Prereqs, "prereqs");
this.AppLocalDirectory = ParseParamValueIfNotSpecified(Command, AppLocalDirectory, "applocaldirectory", String.Empty, true);
this.NoBootstrapExe = GetParamValueIfNotSpecified(Command, NoBootstrapExe, this.NoBootstrapExe, "nobootstrapexe");
this.Prebuilt = GetParamValueIfNotSpecified(Command, Prebuilt, this.Prebuilt, "prebuilt");
if (this.Prebuilt)
{
this.SkipCook = true;
/*this.SkipPak = true;
this.SkipStage = true;
this.Pak = true;
this.Stage = true;*/
this.Cook = true;
this.Archive = true;
this.Deploy = true;
this.Run = true;
//this.StageDirectoryParam = this.PrebuiltDir;
}
this.NoDebugInfo = GetParamValueIfNotSpecified(Command, NoDebugInfo, this.NoDebugInfo, "nodebuginfo");
this.NoCleanStage = GetParamValueIfNotSpecified(Command, NoCleanStage, this.NoCleanStage, "nocleanstage");
this.MapToRun = ParseParamValueIfNotSpecified(Command, MapToRun, "map", String.Empty);
this.AdditionalServerMapParams = ParseParamValueIfNotSpecified(Command, AdditionalServerMapParams, "AdditionalServerMapParams", String.Empty);
this.Foreign = GetParamValueIfNotSpecified(Command, Foreign, this.Foreign, "foreign");
this.ForeignCode = GetParamValueIfNotSpecified(Command, ForeignCode, this.ForeignCode, "foreigncode");
this.StageCommandline = ParseParamValueIfNotSpecified(Command, StageCommandline, "cmdline");
this.BundleName = ParseParamValueIfNotSpecified(Command, BundleName, "bundlename");
this.RunCommandline = ParseParamValueIfNotSpecified(Command, RunCommandline, "addcmdline");
this.RunCommandline = this.RunCommandline.Replace('\'', '\"'); // replace any single quotes with double quotes
this.ServerCommandline = ParseParamValueIfNotSpecified(Command, ServerCommandline, "servercmdline");
this.ServerCommandline = this.ServerCommandline.Replace('\'', '\"'); // replace any single quotes with double quotes
this.Package = GetParamValueIfNotSpecified(Command, Package, this.Package, "package");
this.Deploy = GetParamValueIfNotSpecified(Command, Deploy, this.Deploy, "deploy");
this.DeployFolder = ParseParamValueIfNotSpecified(Command, DeployFolder, "deploy", null);
// if the user specified -deploy but no folder, set the default
if (this.Deploy && string.IsNullOrEmpty(this.DeployFolder))
{
this.DeployFolder = this.ShortProjectName;
}
else if (string.IsNullOrEmpty(this.DeployFolder) == false)
{
// if the user specified a folder set deploy to true.
//@todo - remove 'deploy' var and check deployfolder != null?
this.Deploy = true;
}
if (string.IsNullOrEmpty(this.DeployFolder))
this.IterativeDeploy = GetParamValueIfNotSpecified(Command, IterativeDeploy, this.IterativeDeploy, new string[] {"iterativedeploy", "iterate" } );
this.FastCook = GetParamValueIfNotSpecified(Command, FastCook, this.FastCook, "FastCook");
this.IgnoreCookErrors = GetParamValueIfNotSpecified(Command, IgnoreCookErrors, this.IgnoreCookErrors, "IgnoreCookErrors");
this.RunAssetNativization = GetParamValueIfNotSpecified(Command, RunAssetNativization, this.RunAssetNativization, "nativizeAssets");
string DeviceString = ParseParamValueIfNotSpecified(Command, Device, "device", String.Empty).Trim(new char[] { '\"' });
if(DeviceString == "")
{
this.Devices = new ParamList<string>("");
this.DeviceNames = new ParamList<string>("");
}
else
{
this.Devices = new ParamList<string>(DeviceString.Split('+'));
this.DeviceNames = new ParamList<string>();
foreach (var d in this.Devices)
{
// strip the platform prefix the specified device.
if (d.Contains("@"))
{
this.DeviceNames.Add(d.Substring(d.IndexOf("@") + 1));
}
else
{
this.DeviceNames.Add(d);
}
}
}
this.Provision = ParseParamValueIfNotSpecified(Command, Provision, "provision", String.Empty, true);
this.Certificate = ParseParamValueIfNotSpecified(Command, Certificate, "certificate", String.Empty, true);
this.ServerDevice = ParseParamValueIfNotSpecified(Command, ServerDevice, "serverdevice", this.Devices.Count > 0 ? this.Devices[0] : "");
this.NullRHI = GetParamValueIfNotSpecified(Command, NullRHI, this.NullRHI, "nullrhi");
this.FakeClient = GetParamValueIfNotSpecified(Command, FakeClient, this.FakeClient, "fakeclient");
this.EditorTest = GetParamValueIfNotSpecified(Command, EditorTest, this.EditorTest, "editortest");
this.RunAutomationTest = ParseParamValueIfNotSpecified(Command, RunAutomationTest, "RunAutomationTest");
this.RunAutomationTests = this.RunAutomationTest != "" || GetParamValueIfNotSpecified(Command, RunAutomationTests, this.RunAutomationTests, "RunAutomationTests");
this.SkipServer = GetParamValueIfNotSpecified(Command, SkipServer, this.SkipServer, "skipserver");
this.UE4Exe = ParseParamValueIfNotSpecified(Command, UE4Exe, "ue4exe", "UE4Editor-Cmd.exe");
this.Unattended = GetParamValueIfNotSpecified(Command, Unattended, this.Unattended, "unattended");
this.DeviceUsername = ParseParamValueIfNotSpecified(Command, DeviceUsername, "deviceuser", String.Empty);
this.DevicePassword = ParseParamValueIfNotSpecified(Command, DevicePassword, "devicepass", String.Empty);
this.CrashReporter = GetParamValueIfNotSpecified(Command, CrashReporter, this.CrashReporter, "crashreporter");
this.SpecifiedArchitecture = ParseParamValueIfNotSpecified(Command, SpecifiedArchitecture, "specifiedarchitecture", String.Empty);
if (ClientConfigsToBuild == null)
{
if (Command != null)
{
var ClientConfig = Command.ParseParamValue("clientconfig");
if (ClientConfig == null)
ClientConfig = Command.ParseParamValue("config");
if (ClientConfig != null)
{
this.ClientConfigsToBuild = new List<UnrealTargetConfiguration>();
var Configs = new ParamList<string>(ClientConfig.Split('+'));
foreach (var ConfigName in Configs)
{
this.ClientConfigsToBuild.Add((UnrealTargetConfiguration)Enum.Parse(typeof(UnrealTargetConfiguration), ConfigName, true));
}
}
}
}
else
{
this.ClientConfigsToBuild = ClientConfigsToBuild;
}
if (Port == null)
{
if( Command != null )
{
this.Port = new ParamList<string>();
var PortString = Command.ParseParamValue("port");
if (String.IsNullOrEmpty(PortString) == false)
{
var Ports = new ParamList<string>(PortString.Split('+'));
foreach (var P in Ports)
{
this.Port.Add(P);
}
}
}
}
else
{
this.Port = Port;
}
if (MapsToCook == null)
{
if (Command != null)
{
this.MapsToCook = new ParamList<string>();
var MapsString = Command.ParseParamValue("MapsToCook");
if (String.IsNullOrEmpty(MapsString) == false)
{
var MapNames = new ParamList<string>(MapsString.Split('+'));
foreach ( var M in MapNames )
{
this.MapsToCook.Add( M );
}
}
}
}
else
{
this.MapsToCook = MapsToCook;
}
if (MapIniSectionsToCook == null)
{
if (Command != null)
{
this.MapIniSectionsToCook = new ParamList<string>();
var MapsString = Command.ParseParamValue("MapIniSectionsToCook");
if (String.IsNullOrEmpty(MapsString) == false)
{
var MapNames = new ParamList<string>(MapsString.Split('+'));
foreach (var M in MapNames)
{
this.MapIniSectionsToCook.Add(M);
}
}
}
}
else
{
this.MapIniSectionsToCook = MapIniSectionsToCook;
}
if (String.IsNullOrEmpty(this.MapToRun) == false)
{
this.MapsToCook.Add(this.MapToRun);
}
if (InMapsToRebuildLightMaps == null)
{
if (Command != null)
{
this.MapsToRebuildLightMaps = new ParamList<string>();
var MapsString = Command.ParseParamValue("MapsToRebuildLightMaps");
if (String.IsNullOrEmpty(MapsString) == false)
{
var MapNames = new ParamList<string>(MapsString.Split('+'));
foreach (var M in MapNames)
{
this.MapsToRebuildLightMaps.Add(M);
}
}
}
}
else
{
this.MapsToRebuildLightMaps = InMapsToRebuildLightMaps;
}
if (TitleID == null)
{
if (Command != null)
{
this.TitleID = new ParamList<string>();
var TitleString = Command.ParseParamValue("TitleID");
if (String.IsNullOrEmpty(TitleString) == false)
{
var TitleIDs = new ParamList<string>(TitleString.Split('+'));
foreach (var T in TitleIDs)
{
this.TitleID.Add(T);
}
}
}
}
else
{
this.TitleID = TitleID;
}
if (ServerConfigsToBuild == null)
{
if (Command != null)
{
var ServerConfig = Command.ParseParamValue("serverconfig");
if (ServerConfig == null)
ServerConfig = Command.ParseParamValue("config");
if (ServerConfig != null)
{
this.ServerConfigsToBuild = new List<UnrealTargetConfiguration>();
var Configs = new ParamList<string>(ServerConfig.Split('+'));
foreach (var ConfigName in Configs)
{
this.ServerConfigsToBuild.Add((UnrealTargetConfiguration)Enum.Parse(typeof(UnrealTargetConfiguration), ConfigName, true));
}
}
}
}
else
{
this.ServerConfigsToBuild = ServerConfigsToBuild;
}
if (NumClients.HasValue)
{
this.NumClients = NumClients.Value;
}
else if (Command != null)
{
this.NumClients = Command.ParseParamInt("numclients");
}
if (CrashIndex.HasValue)
{
this.CrashIndex = CrashIndex.Value;
}
else if (Command != null)
{
this.CrashIndex = Command.ParseParamInt("CrashIndex");
}
if (RunTimeoutSeconds.HasValue)
{
this.RunTimeoutSeconds = RunTimeoutSeconds.Value;
}
else if (Command != null)
{
this.RunTimeoutSeconds = Command.ParseParamInt("runtimeoutseconds");
}
AutodetectSettings(false);
ValidateAndLog();
}
#endregion
#region Shared
/// <summary>
/// Shared: Full path to the .uproject file
/// </summary>
public FileReference RawProjectPath { private set; get; }
/// <summary>
/// Shared: The current project is a foreign project, commandline: -foreign
/// </summary>
[Help("foreign", "Generate a foreign uproject from blankproject and use that")]
public bool Foreign { private set; get; }
/// <summary>
/// Shared: The current project is a foreign project, commandline: -foreign
/// </summary>
[Help("foreigncode", "Generate a foreign code uproject from platformergame and use that")]
public bool ForeignCode { private set; get; }
/// <summary>
/// Shared: true if we should build crash reporter
/// </summary>
[Help("CrashReporter", "true if we should build crash reporter")]
public bool CrashReporter { private set; get; }
/// <summary>
/// Shared: Determines if the build is going to use cooked data, commandline: -cook, -cookonthefly
/// </summary>
[Help("cook, -cookonthefly", "Determines if the build is going to use cooked data")]
public bool Cook { private set; get; }
/// <summary>
/// Shared: Determines if the build is going to use cooked data, commandline: -cook, -cookonthefly
/// </summary>
[Help("skipcook", "use a cooked build, but we assume the cooked data is up to date and where it belongs, implies -cook")]
public bool SkipCook { private set; get; }
/// <summary>
/// Shared: In a cookonthefly build, used solely to pass information to the package step. This is necessary because you can't set cookonthefly and cook at the same time, and skipcook sets cook.
/// </summary>
[Help("skipcookonthefly", "in a cookonthefly build, used solely to pass information to the package step")]
public bool SkipCookOnTheFly { private set; get; }
/// <summary>
/// Shared: Determines if the intermediate folders will be wiped before building, commandline: -clean
/// </summary>
[Help("clean", "wipe intermediate folders before building")]
public bool? Clean { private set; get; }
/// <summary>
/// Shared: Assumes no user is sitting at the console, so for example kills clients automatically, commandline: -Unattended
/// </summary>
[Help("unattended", "assumes no operator is present, always terminates without waiting for something.")]
public bool Unattended { private set; get; }
/// <summary>
/// Shared: Sets platforms to build for non-dedicated servers. commandline: -TargetPlatform
/// </summary>
public List<TargetPlatformDescriptor> ClientTargetPlatforms = new List<TargetPlatformDescriptor>();
/// <summary>
/// Shared: Dictionary that maps client dependent platforms to "source" platforms that it should copy data from. commandline: -TargetPlatform=source.dependent
/// </summary>
public Dictionary<TargetPlatformDescriptor, TargetPlatformDescriptor> ClientDependentPlatformMap = new Dictionary<TargetPlatformDescriptor, TargetPlatformDescriptor>();
/// <summary>
/// Shared: Sets platforms to build for dedicated servers. commandline: -ServerTargetPlatform
/// </summary>
public List<TargetPlatformDescriptor> ServerTargetPlatforms = new List<TargetPlatformDescriptor>();
/// <summary>
/// Shared: Dictionary that maps server dependent platforms to "source" platforms that it should copy data from: -ServerTargetPlatform=source.dependent
/// </summary>
public Dictionary<TargetPlatformDescriptor, TargetPlatformDescriptor> ServerDependentPlatformMap = new Dictionary<TargetPlatformDescriptor, TargetPlatformDescriptor>();
/// <summary>
/// Shared: True if pak file should be generated.
/// </summary>
[Help("pak", "generate a pak file")]
public bool Pak { private set; get; }
/// <summary>
///
/// </summary>
public bool UsePak(Platform PlatformToCheck)
{
return Pak || PlatformToCheck.RequiresPak(this) == Platform.PakType.Always;
}
private string SignPakInternal { get; set; }
/// <summary>
/// Shared: Encryption keys used for signing the pak file.
/// </summary>
[Help("signpak=keys", "sign the generated pak file with the specified key, i.e. -signpak=C:\\Encryption.keys. Also implies -signedpak.")]
public string SignPak
{
private set
{
if (string.IsNullOrEmpty(value) || value.StartsWith("0x", StringComparison.InvariantCultureIgnoreCase))
{
SignPakInternal = value;
}
else
{
SignPakInternal = Path.GetFullPath(value);
}
}
get
{
return SignPakInternal;
}
}
/// <summary>
/// Shared: the game will use only signed content.
/// </summary>
[Help("signed", "the game should expect to use a signed pak file.")]
public bool SignedPak { private set; get; }
/// <summary>
/// Shared: true if this build is staged, command line: -stage
/// </summary>
[Help("skippak", "use a pak file, but assume it is already built, implies pak")]
public bool SkipPak { private set; get; }
/// <summary>
/// Shared: true if this build is staged, command line: -stage
/// </summary>
[Help("stage", "put this build in a stage directory")]
public bool Stage { private set; get; }
/// <summary>
/// Shared: true if this build is staged, command line: -stage
/// </summary>
[Help("skipstage", "uses a stage directory, but assumes everything is already there, implies -stage")]
public bool SkipStage { private set; get; }
/// <summary>
/// Shared: true if this build is using streaming install manifests, command line: -manifests
/// </summary>
[Help("manifests", "generate streaming install manifests when cooking data")]
public bool Manifests { private set; get; }
/// <summary>
/// Shared: true if this build chunk install streaming install data, command line: -createchunkinstalldata
/// </summary>
[Help("createchunkinstall", "generate streaming install data from manifest when cooking data, requires -stage & -manifests")]
public bool CreateChunkInstall { private set; get; }
/// <summary>
/// Shared: Directory to use for built chunk install data, command line: -chunkinstalldirectory=
/// </summary>
public string ChunkInstallDirectory { set; get; }
/// <summary>
/// Shared: Version string to use for built chunk install data, command line: -chunkinstallversion=
/// </summary>
public string ChunkInstallVersionString { set; get; }
/// <summary>
/// Shared: Directory to copy the client to, command line: -stagingdirectory=
/// </summary>
public string BaseStageDirectory
{
get
{
if( !String.IsNullOrEmpty(StageDirectoryParam ) )
{
return Path.GetFullPath( StageDirectoryParam );
}
if ( HasDLCName )
{
return Path.GetFullPath( CommandUtils.CombinePaths(Path.GetDirectoryName(RawProjectPath.FullName), "Plugins", DLCName, "Saved", "StagedBuilds" ) );
}
// default return the project saved\stagedbuilds directory
return Path.GetFullPath( CommandUtils.CombinePaths(Path.GetDirectoryName(RawProjectPath.FullName), "Saved", "StagedBuilds") );
}
}
[Help("stagingdirectory=Path", "Directory to copy the builds to, i.e. -stagingdirectory=C:\\Stage")]
public string StageDirectoryParam;
[Help("ue4exe=ExecutableName", "Name of the UE4 Editor executable, i.e. -ue4exe=UE4Editor.exe")]
public string UE4Exe;
/// <summary>
/// Shared: true if this build is archived, command line: -archive
/// </summary>
[Help("archive", "put this build in an archive directory")]
public bool Archive { private set; get; }
/// <summary>
/// Shared: Directory to archive the client to, command line: -archivedirectory=
/// </summary>
public string BaseArchiveDirectory
{
get
{
return Path.GetFullPath(String.IsNullOrEmpty(ArchiveDirectoryParam) ? CommandUtils.CombinePaths(Path.GetDirectoryName(RawProjectPath.FullName), "ArchivedBuilds") : ArchiveDirectoryParam);
}
}
[Help("archivedirectory=Path", "Directory to archive the builds to, i.e. -archivedirectory=C:\\Archive")]
public string ArchiveDirectoryParam;
/// <summary>
/// Whether the project should use non monolithic staging
/// </summary>
[Help("archivemetadata", "Archive extra metadata files in addition to the build (e.g. build.properties)")]
public bool ArchiveMetaData;
/// <summary>
/// When archiving for Mac, set this to true to package it in a .app bundle instead of normal loose files
/// </summary>
[Help("createappbundle", "When archiving for Mac, set this to true to package it in a .app bundle instead of normal loose files")]
public bool CreateAppBundle;
/// <summary>
/// Determines if Blueprint assets should be substituted with auto-generated code.
/// </summary>
[Help("nativizeAssets", "Runs a \"nativization\" pass on Blueprint assets, converting then into C++ (replacing the assets with the generated source).")]
public bool RunAssetNativization;
public struct BlueprintPluginKey
{
public bool Client;
public UnrealTargetPlatform TargetPlatform;
}
/// <summary>
/// Shared: Ref to an auto-generated plugin file that should be incorporated into the project's build
/// </summary>
public Dictionary<BlueprintPluginKey, FileReference> BlueprintPluginPaths = new Dictionary<BlueprintPluginKey, FileReference>();
#endregion
#region Build
/// <summary>
/// Build: True if build step should be executed, command: -build
/// </summary>
[Help("build", "True if build step should be executed")]
public bool Build { private set; get; }
/// <summary>
/// Build: True if XGE should NOT be used for building.
/// </summary>
[Help("noxge", "True if XGE should NOT be used for building")]
public bool NoXGE { private set; get; }
/// <summary>
/// Build: List of maps to cook.
/// </summary>
private ParamList<string> EditorTargetsList = null;
public ParamList<string> EditorTargets
{
set { EditorTargetsList = value; }
get
{
if (EditorTargetsList == null)
{
// Lazy auto-initialization
AutodetectSettings(false);
}
return EditorTargetsList;
}
}
/// <summary>
/// Build: List of maps to cook.
/// </summary>
private ParamList<string> ProgramTargetsList = null;
public ParamList<string> ProgramTargets
{
set { ProgramTargetsList = value; }
get
{
if (ProgramTargetsList == null)
{
// Lazy auto-initialization
AutodetectSettings(false);
}
return ProgramTargetsList;
}
}
/// <summary>
/// Build: List of client configurations
/// </summary>
public List<UnrealTargetConfiguration> ClientConfigsToBuild = new List<UnrealTargetConfiguration>() { UnrealTargetConfiguration.Development };
///<summary>
/// Build: List of Server configurations
/// </summary>
public List<UnrealTargetConfiguration> ServerConfigsToBuild = new List<UnrealTargetConfiguration>() { UnrealTargetConfiguration.Development };
/// <summary>
/// Build: List of client cooked build targets.
/// </summary>
private ParamList<string> ClientCookedTargetsList = null;
public ParamList<string> ClientCookedTargets
{
set { ClientCookedTargetsList = value; }
get
{
if (ClientCookedTargetsList == null)
{
// Lazy auto-initialization
AutodetectSettings(false);
}
return ClientCookedTargetsList;
}
}
/// <summary>
/// Build: List of Server cooked build targets.
/// </summary>
private ParamList<string> ServerCookedTargetsList = null;
public ParamList<string> ServerCookedTargets
{
set { ServerCookedTargetsList = value; }
get
{
if (ServerCookedTargetsList == null)
{
// Lazy auto-initialization
AutodetectSettings(false);
}
return ServerCookedTargetsList;
}
}
#endregion
#region Cook
/// <summary>
/// Cook: List of maps to cook.
/// </summary>
public ParamList<string> MapsToCook = new ParamList<string>();
/// <summary>
/// Cook: List of map inisections to cook (see allmaps)
/// </summary>
public ParamList<string> MapIniSectionsToCook = new ParamList<string>();
/// <summary>
/// Cook: List of directories to cook.
/// </summary>
public ParamList<string> DirectoriesToCook = new ParamList<string>();
/// <summary>
/// Cook: Internationalization preset to cook.
/// </summary>
public string InternationalizationPreset;
/// <summary>
/// Cook: Create a cooked release version. Also, the version. e.g. 1.0
/// </summary>
public string CreateReleaseVersion;
/// <summary>
/// Cook: Use new cooker (temporary cooker option until it's enabled permanently)
/// </summary>
public bool NewCook { private set; get; }
/// <summary>
/// Cook: Use old cooker (temporary cooker options until new cook replaces it)
/// </summary>
public bool OldCook { private set; get; }
/// <summary>
/// Cook: While cooking clean up packages as we go along rather then cleaning everything (and potentially having to reload some of it) when we run out of space
/// </summary>
[Help("CookPartialgc", "while cooking clean up packages as we are done with them rather then cleaning everything up when we run out of space")]
public bool CookPartialGC { private set; get; }
/// <summary>
/// Stage: Did we cook in the editor instead of from UAT (cook in editor uses a different staging directory)
/// </summary>
[Help("CookInEditor", "Did we cook in the editor instead of in UAT")]
public bool CookInEditor { private set; get; }
/// <summary>
/// Cook: Base this cook of a already released version of the cooked data
/// </summary>
public string BasedOnReleaseVersion;
/// <summary>
/// Cook: Path to the root of the directory where we store released versions of the game for a given version
/// </summary>
public string BasedOnReleaseVersionBasePath;
/// <summary>
/// Cook: Path to the root of the directory to create a new released version of the game.
/// </summary>
public string CreateReleaseVersionBasePath;
/// <summary>
/// Are we generating a patch, generate a patch from a previously released version of the game (use CreateReleaseVersion to create a release).
/// this requires BasedOnReleaseVersion
/// see also CreateReleaseVersion, BasedOnReleaseVersion
/// </summary>
public bool GeneratePatch;
/// <summary>
/// Name of dlc to cook and package (if this paramter is supplied cooks the dlc and packages it into the dlc directory)
/// </summary>
public string DLCName;
/// <summary>
/// Enable cooking of engine content when cooking dlc
/// not included in original release but is referenced by current cook
/// </summary>
public bool DLCIncludeEngineContent;
/// <summary>
/// After cook completes diff the cooked content against another cooked content directory.
/// report all errors to the log
/// </summary>
public string DiffCookedContentPath;
/// <summary>
/// Cook: Additional cooker options to include on the cooker commandline
/// </summary>
public string AdditionalCookerOptions;
/// <summary>
/// Cook: List of cultures to cook.
/// </summary>
public ParamList<string> CulturesToCook;
/// <summary>
/// Compress packages during cook.
/// </summary>
public bool Compressed;
/// <summary>
/// Encrypt ini files which are packaged into the pak file. Only valid when encryption keys and building pak file specified.
/// </summary>
public bool EncryptIniFiles;
/// <summary>
/// Encrypt all files which are packaged into the pak file. Only valid when encryption keys and building pak file specified.
/// </summary>
public bool EncryptEverything;
/// <summary>
/// put -debug on the editorexe commandline
/// </summary>
public bool UseDebugParamForEditorExe;
/// <summary>
/// Cook: Do not include a version number in the cooked content
/// </summary>
public bool UnversionedCookedContent = true;
/// <summary>
/// Cook: Uses the iterative cooking, command line: -iterativecooking or -iterate
/// </summary>
[Help( "iterativecooking", "Uses the iterative cooking, command line: -iterativecooking or -iterate" )]
public bool IterativeCooking;
/// <summary>
/// Cook: Iterate from a shared cooked build
/// </summary>
[Help("Iteratively cook from a shared cooked build")]
public bool IterateSharedCookedBuild;
/// <summary>
/// Cook: Only cook maps (and referenced content) instead of cooking everything only affects -cookall flag
/// </summary>
[Help("CookMapsOnly", "Cook only maps this only affects usage of -cookall the flag")]
public bool CookMapsOnly;
/// <summary>
/// Cook: Only cook maps (and referenced content) instead of cooking everything only affects cookall flag
/// </summary>
[Help("CookAll", "Cook all the things in the content directory for this project")]
public bool CookAll;
/// <summary>
/// Cook: Skip cooking editor content
/// </summary>
[Help("SkipCookingEditorContent", "Skips content under /Engine/Editor when cooking")]
public bool SkipCookingEditorContent;
/// <summary>
/// Cook: number of additional cookers to spawn while cooking
/// </summary>
public int NumCookersToSpawn;
/// <summary>
/// Cook: Uses the iterative deploy, command line: -iterativedeploy or -iterate
/// </summary>
[Help("iterativecooking", "Uses the iterative cooking, command line: -iterativedeploy or -iterate")]
public bool IterativeDeploy;
[Help("FastCook", "Uses fast cook path if supported by target")]
public bool FastCook;
/// <summary>
/// Cook: Ignores cook errors and continues with packaging etc.
/// </summary>
[Help("IgnoreCookErrors", "Ignores cook errors and continues with packaging etc")]
public bool IgnoreCookErrors { private set; get; }
#endregion
#region Stage
/// <summary>
/// Stage: Commanndline: -nodebuginfo
/// </summary>
[Help("nodebuginfo", "do not copy debug files to the stage")]
public bool NoDebugInfo { private set; get; }
/// <summary>
/// true if the staging directory is to be cleaned: -cleanstage (also true if -clean is specified)
/// </summary>
[Help("nocleanstage", "skip cleaning the stage directory")]
public bool NoCleanStage { set { bNoCleanStage = value; } get { return SkipStage || bNoCleanStage; } }
private bool bNoCleanStage;
/// <summary>
/// Stage: If non-empty, the contents will be put into the stage
/// </summary>
[Help("cmdline", "command line to put into the stage in UE4CommandLine.txt")]
public string StageCommandline;
/// <summary>
/// Stage: If non-empty, the contents will be used for the bundle name
/// </summary>
[Help("bundlename", "string to use as the bundle name when deploying to mobile device")]
public string BundleName;
/// <summary>
/// Whether the project uses Steam (todo: substitute with more generic functionality)
/// </summary>
public bool bUsesSteam;
/// <summary>
/// Whether the project uses CEF3
/// </summary>
public bool bUsesCEF3;
/// <summary>
/// Whether the project uses visual Slate UI (as opposed to the low level windowing/messaging which is alway used)
/// </summary>
public bool bUsesSlate = true;
/// <summary>
/// By default we use the Release C++ Runtime (CRT), even when compiling Debug builds. This is because the Debug C++
/// Runtime isn't very useful when debugging Unreal Engine projects, and linking against the Debug CRT libraries forces
/// our third party library dependencies to also be compiled using the Debug CRT (and often perform more slowly.) Often
/// it can be inconvenient to require a separate copy of the debug versions of third party static libraries simply
/// so that you can debug your program's code.
/// </summary>
public bool bDebugBuildsActuallyUseDebugCRT = false;
/// <summary>
/// On Windows, adds an executable to the root of the staging directory which checks for prerequisites being
/// installed and launches the game with a path to the .uproject file.
/// </summary>
public bool NoBootstrapExe { get; set; }
/// <summary>
/// By default we don't code sign unless it is required or requested
/// </summary>
public bool bCodeSign = false;
/// <summary>
/// Provision to use
/// </summary>
public string Provision = null;
/// <summary>
/// Certificate to use
/// </summary>
public string Certificate = null;
/// <summary>
/// TitleID to package
/// </summary>
public ParamList<string> TitleID = new ParamList<string>();
/// <summary>
/// If true, non-shipping binaries will be considered DebugUFS files and will appear on the debugfiles manifest
/// </summary>
public bool bTreatNonShippingBinariesAsDebugFiles = false;
#endregion
#region Run
/// <summary>
/// Run: True if the Run step should be executed, command: -run
/// </summary>
[Help("run", "run the game after it is built (including server, if -server)")]
public bool Run { private set; get; }
/// <summary>
/// Run: The client runs with cooked data provided by cook on the fly server, command line: -cookonthefly
/// </summary>
[Help("cookonthefly", "run the client with cooked data provided by cook on the fly server")]
public bool CookOnTheFly { private set; get; }
/// <summary>
/// Run: The client should run in streaming mode when connecting to cook on the fly server
/// </summary>
[Help("Cookontheflystreaming", "run the client in streaming cook on the fly mode (don't cache files locally instead force reget from server each file load)")]
public bool CookOnTheFlyStreaming { private set; get; }
/// <summary>
/// Run: The client runs with cooked data provided by UnrealFileServer, command line: -fileserver
/// </summary>
[Help("fileserver", "run the client with cooked data provided by UnrealFileServer")]
public bool FileServer { private set; get; }
/// <summary>
/// Run: The client connects to dedicated server to get data, command line: -dedicatedserver
/// </summary>
[Help("dedicatedserver", "build, cook and run both a client and a server (also -server)")]
public bool DedicatedServer { private set; get; }
/// <summary>
/// Run: Uses a client target configuration, also implies -dedicatedserver, command line: -client
/// </summary>
[Help( "client", "build, cook and run a client and a server, uses client target configuration" )]
public bool Client { private set; get; }
/// <summary>
/// Run: Whether the client should start or not, command line (to disable): -noclient
/// </summary>
[Help("noclient", "do not run the client, just run the server")]
public bool NoClient { private set; get; }
/// <summary>
/// Run: Client should create its own log window, command line: -logwindow
/// </summary>
[Help("logwindow", "create a log window for the client")]
public bool LogWindow { private set; get; }
/// <summary>
/// Run: Map to run the game with.
/// </summary>
[Help("map", "map to run the game with")]
public string MapToRun;
/// <summary>
/// Run: Additional server map params.
/// </summary>
[Help("AdditionalServerMapParams", "Additional server map params, i.e ?param=value")]
public string AdditionalServerMapParams;
/// <summary>
/// Run: The target device to run the game on. Comes in the form platform@devicename.
/// </summary>
[Help("device", "Devices to run the game on")]
public ParamList<string> Devices;
/// <summary>
/// Run: The target device to run the game on. No platform prefix.
/// </summary>
[Help("device", "Device names without the platform prefix to run the game on")]
public ParamList<string> DeviceNames;
/// <summary>
/// Run: the target device to run the server on
/// </summary>
[Help("serverdevice", "Device to run the server on")]
public string ServerDevice;
/// <summary>
/// Run: The indicated server has already been started
/// </summary>
[Help("skipserver", "Skip starting the server")]
public bool SkipServer;
/// <summary>
/// Run: The indicated server has already been started
/// </summary>
[Help("numclients=n", "Start extra clients, n should be 2 or more")]
public int NumClients;
/// <summary>
/// Run: Additional command line arguments to pass to the program
/// </summary>
[Help("addcmdline", "Additional command line arguments for the program")]
public string RunCommandline;
/// <summary>
/// Run: Additional command line arguments to pass to the server
/// </summary>
[Help("servercmdline", "Additional command line arguments for the program")]
public string ServerCommandline;
/// <summary>
/// Run:adds -nullrhi to the client commandline
/// </summary>
[Help("nullrhi", "add -nullrhi to the client commandlines")]
public bool NullRHI;
/// <summary>
/// Run:adds ?fake to the server URL
/// </summary>
[Help("fakeclient", "adds ?fake to the server URL")]
public bool FakeClient;
/// <summary>
/// Run:adds ?fake to the server URL
/// </summary>
[Help("editortest", "rather than running a client, run the editor instead")]
public bool EditorTest;
/// <summary>
/// Run:when running -editortest or a client, run all automation tests, not compatible with -server
/// </summary>
[Help("RunAutomationTests", "when running -editortest or a client, run all automation tests, not compatible with -server")]
public bool RunAutomationTests;
/// <summary>
/// Run:when running -editortest or a client, run all automation tests, not compatible with -server
/// </summary>
[Help("RunAutomationTests", "when running -editortest or a client, run a specific automation tests, not compatible with -server")]
public string RunAutomationTest;
/// <summary>
/// Run: Adds commands like debug crash, debug rendercrash, etc based on index
/// </summary>
[Help("Crash=index", "when running -editortest or a client, adds commands like debug crash, debug rendercrash, etc based on index")]
public int CrashIndex;
public ParamList<string> Port;
/// <summary>
/// Run: Linux username for unattended key genereation
/// </summary>
[Help("deviceuser", "Linux username for unattended key genereation")]
public string DeviceUsername;
/// <summary>
/// Run: Linux password for unattended key genereation
/// </summary>
[Help("devicepass", "Linux password")]
public string DevicePassword;
/// <summary>
/// Run: Server device IP address
/// </summary>
public string ServerDeviceAddress;
#endregion
#region Package
[Help("package", "package the project for the target platform")]
public bool Package { get; set; }
[Help("distribution", "package for distribution the project")]
public bool Distribution { get; set; }
[Help("prereqs", "stage prerequisites along with the project")]
public bool Prereqs { get; set; }
[Help("applocaldir", "location of prerequisites for applocal deployment")]
public string AppLocalDirectory { get; set; }
[Help("Prebuilt", "this is a prebuilt cooked and packaged build")]
public bool Prebuilt { get; private set; }
[Help("RunTimeoutSeconds", "timeout to wait after we lunch the game")]
public int RunTimeoutSeconds;
[Help("SpecifiedArchitecture", "Determine a specific Minimum OS")]
public string SpecifiedArchitecture;
#endregion
#region Deploy
[Help("deploy", "deploy the project for the target platform")]
public bool Deploy { get; set; }
[Help("deploy", "Location to deploy to on the target platform")]
public string DeployFolder { get; set; }
#endregion
#region Misc
[Help("MapsToRebuildLightMaps", "List of maps that need light maps rebuilding")]
public ParamList<string> MapsToRebuildLightMaps = new ParamList<string>();
[Help("IgnoreLightMapErrors", "Whether Light Map errors should be treated as critical")]
public bool IgnoreLightMapErrors { get; set; }
#endregion
#region Initialization
private Dictionary<TargetRules.TargetType, SingleTargetProperties> DetectedTargets;
private Dictionary<UnrealTargetPlatform, ConfigHierarchy> LoadedEngineConfigs;
private Dictionary<UnrealTargetPlatform, ConfigHierarchy> LoadedGameConfigs;
private void AutodetectSettings(bool bReset)
{
if (bReset)
{
EditorTargetsList = null;
ClientCookedTargetsList = null;
ServerCookedTargetsList = null;
ProgramTargetsList = null;
ProjectBinariesPath = null;
ProjectGameExePath = null;
}
List<UnrealTargetPlatform> ClientTargetPlatformTypes = ClientTargetPlatforms.ConvertAll(x => x.Type).Distinct().ToList();
var Properties = ProjectUtils.GetProjectProperties(RawProjectPath, ClientTargetPlatformTypes, RunAssetNativization);
bUsesSteam = Properties.bUsesSteam;
bUsesCEF3 = Properties.bUsesCEF3;
bUsesSlate = Properties.bUsesSlate;
bDebugBuildsActuallyUseDebugCRT = Properties.bDebugBuildsActuallyUseDebugCRT;
bIsCodeBasedProject = Properties.bIsCodeBasedProject;
DetectedTargets = Properties.Targets;
LoadedEngineConfigs = Properties.EngineConfigs;
LoadedGameConfigs = Properties.GameConfigs;
var GameTarget = String.Empty;
var EditorTarget = String.Empty;
var ServerTarget = String.Empty;
var ProgramTarget = String.Empty;
var ProjectType = TargetRules.TargetType.Game;
if (!bIsCodeBasedProject)
{
GameTarget = "UE4Game";
EditorTarget = "UE4Editor";
ServerTarget = "UE4Server";
}
else if (!CommandUtils.CmdEnv.HasCapabilityToCompile)
{
var ShortName = ProjectUtils.GetShortProjectName(RawProjectPath);
GameTarget = ShortName;
EditorTarget = ShortName + "Editor";
ServerTarget = ShortName + "Server";
}
else if (!CommandUtils.IsNullOrEmpty(Properties.Targets))
{
SingleTargetProperties TargetData;
var GameTargetType = TargetRules.TargetType.Game;
if( Client )
{
if( HasClientTargetDetected )
{
GameTargetType = TargetRules.TargetType.Client;
}
else
{
throw new AutomationException( "Client target not found!" );
}
}
var ValidGameTargetTypes = new TargetRules.TargetType[]
{
GameTargetType,
TargetRules.TargetType.Program
};
foreach (var ValidTarget in ValidGameTargetTypes)
{
if (DetectedTargets.TryGetValue(ValidTarget, out TargetData))
{
GameTarget = TargetData.TargetName;
bDebugBuildsActuallyUseDebugCRT = TargetData.Rules.bDebugBuildsActuallyUseDebugCRT;
bUsesSlate = TargetData.Rules.bUsesSlate;
bUsesSteam = TargetData.Rules.bUsesSteam;
bUsesCEF3 = TargetData.Rules.bUsesCEF3;
ProjectType = ValidTarget;
break;
}
}
if (DetectedTargets.TryGetValue(TargetRules.TargetType.Editor, out TargetData))
{
EditorTarget = TargetData.TargetName;
}
if (DetectedTargets.TryGetValue(TargetRules.TargetType.Server, out TargetData))
{
ServerTarget = TargetData.TargetName;
}
if (DetectedTargets.TryGetValue(TargetRules.TargetType.Program, out TargetData))
{
ProgramTarget = TargetData.TargetName;
}
}
else if (!CommandUtils.IsNullOrEmpty(Properties.Programs))
{
SingleTargetProperties TargetData = Properties.Programs[0];
bDebugBuildsActuallyUseDebugCRT = TargetData.Rules.bDebugBuildsActuallyUseDebugCRT;
bUsesSlate = TargetData.Rules.bUsesSlate;
bUsesSteam = TargetData.Rules.bUsesSteam;
bUsesCEF3 = TargetData.Rules.bUsesCEF3;
ProjectType = TargetRules.TargetType.Program;
ProgramTarget = TargetData.TargetName;
GameTarget = TargetData.TargetName;
}
else if (!this.Build)
{
var ShortName = ProjectUtils.GetShortProjectName(RawProjectPath);
GameTarget = ShortName;
EditorTarget = ShortName + "Editor";
ServerTarget = ShortName + "Server";
}
else
{
throw new AutomationException("{0} does not look like uproject file but no targets have been found!", RawProjectPath);
}
IsProgramTarget = ProjectType == TargetRules.TargetType.Program;
if (String.IsNullOrEmpty(EditorTarget) && ProjectType != TargetRules.TargetType.Program && CommandUtils.IsNullOrEmpty(EditorTargetsList))
{
if (Properties.bWasGenerated)
{
EditorTarget = "UE4Editor";
}
else
{
throw new AutomationException("Editor target not found!");
}
}
if (String.IsNullOrEmpty(GameTarget) && Run && !NoClient && (Cook || CookOnTheFly) && CommandUtils.IsNullOrEmpty(ClientCookedTargetsList))
{
throw new AutomationException("Game target not found. Game target is required with -cook or -cookonthefly");
}
if (EditorTargetsList == null)
{
if (!GlobalCommandLine.NoCompileEditor && (ProjectType != TargetRules.TargetType.Program) && !String.IsNullOrEmpty(EditorTarget))
{
EditorTargetsList = new ParamList<string>(EditorTarget);
}
else
{
EditorTargetsList = new ParamList<string>();
}
}
if (ProgramTargetsList == null)
{
if (ProjectType == TargetRules.TargetType.Program)
{
ProgramTargetsList = new ParamList<string>(ProgramTarget);
}
else
{
ProgramTargetsList = new ParamList<string>();
}
}
if (ClientCookedTargetsList == null && !NoClient && (Cook || CookOnTheFly || Prebuilt))
{
if (String.IsNullOrEmpty(GameTarget))
{
throw new AutomationException("Game target not found. Game target is required with -cook or -cookonthefly");
}
else
{
ClientCookedTargetsList = new ParamList<string>(GameTarget);
}
}
else if (ClientCookedTargetsList == null)
{
ClientCookedTargetsList = new ParamList<string>();
}
if (ServerCookedTargetsList == null && DedicatedServer && (Cook || CookOnTheFly))
{
if (String.IsNullOrEmpty(ServerTarget))
{
throw new AutomationException("Server target not found. Server target is required with -server and -cook or -cookonthefly");
}
ServerCookedTargetsList = new ParamList<string>(ServerTarget);
}
else if (ServerCookedTargetsList == null)
{
ServerCookedTargetsList = new ParamList<string>();
}
if (String.IsNullOrEmpty(ProjectBinariesPath) || String.IsNullOrEmpty(ProjectGameExePath))
{
if ( ClientTargetPlatforms.Count > 0 )
{
var ProjectClientBinariesPath = ProjectUtils.GetClientProjectBinariesRootPath(RawProjectPath, ProjectType, Properties.bIsCodeBasedProject);
ProjectBinariesPath = ProjectUtils.GetProjectClientBinariesFolder(ProjectClientBinariesPath, ClientTargetPlatforms[0].Type);
ProjectGameExePath = CommandUtils.CombinePaths(ProjectBinariesPath, GameTarget + Platform.GetExeExtension(ClientTargetPlatforms[0].Type));
}
}
}
#endregion
#region Utilities
public bool HasEditorTargets
{
get { return !CommandUtils.IsNullOrEmpty(EditorTargets); }
}
public bool HasCookedTargets
{
get { return !CommandUtils.IsNullOrEmpty(ClientCookedTargets) || !CommandUtils.IsNullOrEmpty(ServerCookedTargets); }
}
public bool HasServerCookedTargets
{
get { return !CommandUtils.IsNullOrEmpty(ServerCookedTargets); }
}
public bool HasClientCookedTargets
{
get { return !CommandUtils.IsNullOrEmpty(ClientCookedTargets); }
}
public bool HasProgramTargets
{
get { return !CommandUtils.IsNullOrEmpty(ProgramTargets); }
}
public bool HasMapsToCook
{
get { return !CommandUtils.IsNullOrEmpty(MapsToCook); }
}
public bool HasMapIniSectionsToCook
{
get { return !CommandUtils.IsNullOrEmpty(MapIniSectionsToCook); }
}
public bool HasDirectoriesToCook
{
get { return !CommandUtils.IsNullOrEmpty(DirectoriesToCook); }
}
public bool HasInternationalizationPreset
{
get { return !String.IsNullOrEmpty(InternationalizationPreset); }
}
public bool HasBasedOnReleaseVersion
{
get { return !String.IsNullOrEmpty(BasedOnReleaseVersion); }
}
public bool HasAdditionalCookerOptions
{
get { return !String.IsNullOrEmpty(AdditionalCookerOptions); }
}
public bool HasDLCName
{
get { return !String.IsNullOrEmpty(DLCName); }
}
public bool HasDiffCookedContentPath
{
get { return !String.IsNullOrEmpty(DiffCookedContentPath); }
}
public bool HasCreateReleaseVersion
{
get { return !String.IsNullOrEmpty(CreateReleaseVersion); }
}
public bool HasCulturesToCook
{
get { return CulturesToCook != null; }
}
public bool HasGameTargetDetected
{
get { return ProjectTargets.ContainsKey(TargetRules.TargetType.Game); }
}
public bool HasClientTargetDetected
{
get { return ProjectTargets.ContainsKey( TargetRules.TargetType.Client ); }
}
public bool HasDedicatedServerAndClient
{
get { return Client && DedicatedServer; }
}
/// <summary>
/// Project name (name of the uproject file without extension or directory name where the project is localed)
/// </summary>
public string ShortProjectName
{
get { return ProjectUtils.GetShortProjectName(RawProjectPath); }
}
/// <summary>
/// True if this project contains source code.
/// </summary>
public bool IsCodeBasedProject
{
get
{
return bIsCodeBasedProject;
}
}
private bool bIsCodeBasedProject;
public FileReference CodeBasedUprojectPath
{
get { return IsCodeBasedProject ? RawProjectPath : null; }
}
/// <summary>
/// True if this project is a program.
/// </summary>
public bool IsProgramTarget { get; private set; }
/// <summary>
/// Path where the project's game (or program) binaries are built.
/// </summary>
public string ProjectBinariesFolder
{
get
{
if (String.IsNullOrEmpty(ProjectBinariesPath))
{
AutodetectSettings(false);
}
return ProjectBinariesPath;
}
}
private string ProjectBinariesPath;
/// <summary>
/// Get the path to the directory of the version we are basing a diff or a patch on.
/// </summary>
public String GetBasedOnReleaseVersionPath(DeploymentContext SC, bool bIsClientOnly)
{
String BasePath = BasedOnReleaseVersionBasePath;
String Platform = SC.StageTargetPlatform.GetCookPlatform(SC.DedicatedServer, bIsClientOnly);
if (String.IsNullOrEmpty(BasePath))
{
BasePath = CommandUtils.CombinePaths(SC.ProjectRoot, "Releases", BasedOnReleaseVersion, Platform);
}
else
{
BasePath = CommandUtils.CombinePaths(BasePath, BasedOnReleaseVersion, Platform);
}
/*if ( TitleID != null && TitleID.Count == 1 )
{
BasePath = CommandUtils.CombinePaths( BasePath, TitleID[0]);
}*/
return BasePath;
}
/// <summary>
/// Get the path to the target directory for creating a new release version
/// </summary>
/// <param name="SC"></param>
/// <returns></returns>
public String GetCreateReleaseVersionPath(DeploymentContext SC, bool bIsClientOnly)
{
String BasePath = CreateReleaseVersionBasePath;
String Platform = SC.StageTargetPlatform.GetCookPlatform(SC.DedicatedServer, bIsClientOnly);
if (String.IsNullOrEmpty(BasePath))
{
BasePath = CommandUtils.CombinePaths(SC.ProjectRoot, "Releases", CreateReleaseVersion, Platform);
}
else
{
BasePath = CommandUtils.CombinePaths(BasePath, CreateReleaseVersion, Platform);
}
/*if (TitleID != null && TitleID.Count == 1)
{
BasePath = CommandUtils.CombinePaths(BasePath, TitleID[0]);
}*/
return BasePath;
}
/// <summary>
/// True if we are generating a patch
/// </summary>
public bool IsGeneratingPatch
{
get { return GeneratePatch; }
}
/// <summary>
/// Filename of the target game exe (or program exe).
/// </summary>
public string ProjectGameExeFilename
{
get
{
if (String.IsNullOrEmpty(ProjectGameExePath))
{
AutodetectSettings(false);
}
return ProjectGameExePath;
}
}
private string ProjectGameExePath;
public List<Platform> ClientTargetPlatformInstances
{
get
{
List<Platform> ClientPlatformInstances = new List<Platform>();
foreach ( var ClientPlatform in ClientTargetPlatforms )
{
ClientPlatformInstances.Add(Platform.Platforms[ClientPlatform]);
}
return ClientPlatformInstances;
}
}
public TargetPlatformDescriptor GetCookedDataPlatformForClientTarget(TargetPlatformDescriptor TargetPlatformDesc)
{
if (ClientDependentPlatformMap.ContainsKey(TargetPlatformDesc))
{
return ClientDependentPlatformMap[TargetPlatformDesc];
}
return TargetPlatformDesc;
}
public List<Platform> ServerTargetPlatformInstances
{
get
{
List<Platform> ServerPlatformInstances = new List<Platform>();
foreach (var ServerPlatform in ServerTargetPlatforms)
{
ServerPlatformInstances.Add(Platform.Platforms[ServerPlatform]);
}
return ServerPlatformInstances;
}
}
public TargetPlatformDescriptor GetCookedDataPlatformForServerTarget(TargetPlatformDescriptor TargetPlatformType)
{
if (ServerDependentPlatformMap.ContainsKey(TargetPlatformType))
{
return ServerDependentPlatformMap[TargetPlatformType];
}
return TargetPlatformType;
}
/// <summary>
/// All auto-detected targets for this project
/// </summary>
public Dictionary<TargetRules.TargetType, SingleTargetProperties> ProjectTargets
{
get
{
if (DetectedTargets == null)
{
AutodetectSettings(false);
}
return DetectedTargets;
}
}
/// <summary>
/// List of all Engine ini files for this project
/// </summary>
public Dictionary<UnrealTargetPlatform, ConfigHierarchy> EngineConfigs
{
get
{
if (LoadedEngineConfigs == null)
{
AutodetectSettings(false);
}
return LoadedEngineConfigs;
}
}
/// <summary>
/// List of all Game ini files for this project
/// </summary>
public Dictionary<UnrealTargetPlatform, ConfigHierarchy> GameConfigs
{
get
{
if (LoadedGameConfigs == null)
{
AutodetectSettings(false);
}
return LoadedGameConfigs;
}
}
public void Validate()
{
if (RawProjectPath == null)
{
throw new AutomationException("RawProjectPath can't be empty.");
}
if (!RawProjectPath.HasExtension(".uproject"))
{
throw new AutomationException("RawProjectPath {0} must end with .uproject", RawProjectPath);
}
if (!CommandUtils.FileExists_NoExceptions(RawProjectPath.FullName))
{
throw new AutomationException("RawProjectPath {0} file must exist", RawProjectPath);
}
if (FileServer && !Cook)
{
throw new AutomationException("Only cooked builds can use a fileserver be staged, use -cook");
}
if (Stage && !Cook && !CookOnTheFly && !IsProgramTarget)
{
throw new AutomationException("Only cooked builds or programs can be staged, use -cook or -cookonthefly.");
}
if (Manifests && !Cook && !Stage && !Pak)
{
throw new AutomationException("Only staged pakd and cooked builds can generate streaming install manifests");
}
if (Pak && !Stage)
{
throw new AutomationException("Only staged builds can be paked, use -stage or -skipstage.");
}
if (Deploy && !Stage)
{
throw new AutomationException("Only staged builds can be deployed, use -stage or -skipstage.");
}
if ((Pak || Stage || Cook || CookOnTheFly || FileServer || DedicatedServer) && EditorTest)
{
throw new AutomationException("None of pak, stage, cook, CookOnTheFly or DedicatedServer can be used with EditorTest");
}
if (DedicatedServer && RunAutomationTests)
{
throw new AutomationException("DedicatedServer cannot be used with RunAutomationTests");
}
if ((CookOnTheFly || FileServer) && DedicatedServer)
{
throw new AutomationException("Don't use either -cookonthefly or -fileserver with -server.");
}
if (NoClient && !DedicatedServer && !CookOnTheFly)
{
throw new AutomationException("-noclient can only be used with -server or -cookonthefly.");
}
if (Build && !HasCookedTargets && !HasEditorTargets && !HasProgramTargets)
{
throw new AutomationException("-build is specified but there are no targets to build.");
}
if (Pak && FileServer)
{
throw new AutomationException("Can't use -pak and -fileserver at the same time.");
}
if (Cook && CookOnTheFly)
{
throw new AutomationException("Can't use both -cook and -cookonthefly.");
}
if (!HasDLCName && DLCIncludeEngineContent)
{
throw new AutomationException("DLCIncludeEngineContent flag is only valid when cooking dlc.");
}
if ((IsGeneratingPatch || HasDLCName) && !HasBasedOnReleaseVersion)
{
throw new AutomationException("Require based on release version to build patches or dlc");
}
if (HasCreateReleaseVersion && (IsGeneratingPatch || HasDLCName))
{
throw new AutomationException("Can't create a release version at the same time as creating dlc.");
}
if (HasBasedOnReleaseVersion && (IterativeCooking || IterativeDeploy || IterateSharedCookedBuild))
{
throw new AutomationException("Can't use iterative cooking / deploy on dlc or patching or creating a release");
}
/*if (Compressed && !Pak)
{
throw new AutomationException("-compressed can only be used with -pak");
}*/
if (CreateChunkInstall && (!(Manifests || HasDLCName) || !Stage))
{
throw new AutomationException("-createchunkinstall can only be used with -manifests & -stage");
}
if (CreateChunkInstall && String.IsNullOrEmpty(ChunkInstallDirectory))
{
throw new AutomationException("-createchunkinstall must specify the chunk install data directory with -chunkinstalldirectory=");
}
if (CreateChunkInstall && String.IsNullOrEmpty(ChunkInstallVersionString))
{
throw new AutomationException("-createchunkinstall must specify the chunk install data version string with -chunkinstallversion=");
}
}
protected bool bLogged = false;
public virtual void ValidateAndLog()
{
// Avoid spamming, log only once
if (!bLogged)
{
// In alphabetical order.
CommandUtils.LogLog("Project Params **************");
CommandUtils.LogLog("AdditionalServerMapParams={0}", AdditionalServerMapParams);
CommandUtils.LogLog("Archive={0}", Archive);
CommandUtils.LogLog("ArchiveMetaData={0}", ArchiveMetaData);
CommandUtils.LogLog("CreateAppBundle={0}", CreateAppBundle);
CommandUtils.LogLog("BaseArchiveDirectory={0}", BaseArchiveDirectory);
CommandUtils.LogLog("BaseStageDirectory={0}", BaseStageDirectory);
CommandUtils.LogLog("Build={0}", Build);
CommandUtils.LogLog("Cook={0}", Cook);
CommandUtils.LogLog("Clean={0}", Clean);
CommandUtils.LogLog("Client={0}", Client);
CommandUtils.LogLog("ClientConfigsToBuild={0}", string.Join(",", ClientConfigsToBuild));
CommandUtils.LogLog("ClientCookedTargets={0}", ClientCookedTargets.ToString());
CommandUtils.LogLog("ClientTargetPlatform={0}", string.Join(",", ClientTargetPlatforms));
CommandUtils.LogLog("Compressed={0}", Compressed);
CommandUtils.LogLog("UseDebugParamForEditorExe={0}", UseDebugParamForEditorExe);
CommandUtils.LogLog("CookOnTheFly={0}", CookOnTheFly);
CommandUtils.LogLog("CookOnTheFlyStreaming={0}", CookOnTheFlyStreaming);
CommandUtils.LogLog("UnversionedCookedContent={0}", UnversionedCookedContent);
CommandUtils.LogLog("EncryptIniFiles={0}", EncryptIniFiles);
CommandUtils.LogLog("EncryptEverything={0}", EncryptEverything);
CommandUtils.LogLog("SkipCookingEditorContent={0}", SkipCookingEditorContent);
CommandUtils.LogLog("NumCookersToSpawn={0}", NumCookersToSpawn);
CommandUtils.LogLog("GeneratePatch={0}", GeneratePatch);
CommandUtils.LogLog("CreateReleaseVersion={0}", CreateReleaseVersion);
CommandUtils.LogLog("BasedOnReleaseVersion={0}", BasedOnReleaseVersion);
CommandUtils.LogLog("DLCName={0}", DLCName);
CommandUtils.LogLog("DLCIncludeEngineContent={0}", DLCIncludeEngineContent);
CommandUtils.LogLog("DiffCookedContentPath={0}", DiffCookedContentPath);
CommandUtils.LogLog("AdditionalCookerOptions={0}", AdditionalCookerOptions);
CommandUtils.LogLog("DedicatedServer={0}", DedicatedServer);
CommandUtils.LogLog("DirectoriesToCook={0}", DirectoriesToCook.ToString());
CommandUtils.LogLog("CulturesToCook={0}", CommandUtils.IsNullOrEmpty(CulturesToCook) ? "<Not Specified> (Use Defaults)" : CulturesToCook.ToString());
CommandUtils.LogLog("EditorTargets={0}", EditorTargets.ToString());
CommandUtils.LogLog("Foreign={0}", Foreign);
CommandUtils.LogLog("IsCodeBasedProject={0}", IsCodeBasedProject.ToString());
CommandUtils.LogLog("IsProgramTarget={0}", IsProgramTarget.ToString());
CommandUtils.LogLog("IterativeCooking={0}", IterativeCooking);
CommandUtils.LogLog("IterateSharedCookedBuild={0}", IterateSharedCookedBuild);
CommandUtils.LogLog("CookAll={0}", CookAll);
CommandUtils.LogLog("CookPartialGC={0}", CookPartialGC);
CommandUtils.LogLog("CookInEditor={0}", CookInEditor);
CommandUtils.LogLog("CookMapsOnly={0}", CookMapsOnly);
CommandUtils.LogLog("Deploy={0}", Deploy);
CommandUtils.LogLog("IterativeDeploy={0}", IterativeDeploy);
CommandUtils.LogLog("FastCook={0}", FastCook);
CommandUtils.LogLog("LogWindow={0}", LogWindow);
CommandUtils.LogLog("Manifests={0}", Manifests);
CommandUtils.LogLog("MapToRun={0}", MapToRun);
CommandUtils.LogLog("NoClient={0}", NoClient);
CommandUtils.LogLog("NumClients={0}", NumClients);
CommandUtils.LogLog("NoDebugInfo={0}", NoDebugInfo);
CommandUtils.LogLog("NoCleanStage={0}", NoCleanStage);
CommandUtils.LogLog("NoXGE={0}", NoXGE);
CommandUtils.LogLog("MapsToCook={0}", MapsToCook.ToString());
CommandUtils.LogLog("MapIniSectionsToCook={0}", MapIniSectionsToCook.ToString());
CommandUtils.LogLog("Pak={0}", Pak);
CommandUtils.LogLog("Package={0}", Package);
CommandUtils.LogLog("NullRHI={0}", NullRHI);
CommandUtils.LogLog("FakeClient={0}", FakeClient);
CommandUtils.LogLog("EditorTest={0}", EditorTest);
CommandUtils.LogLog("RunAutomationTests={0}", RunAutomationTests);
CommandUtils.LogLog("RunAutomationTest={0}", RunAutomationTest);
CommandUtils.LogLog("RunTimeoutSeconds={0}", RunTimeoutSeconds);
CommandUtils.LogLog("CrashIndex={0}", CrashIndex);
CommandUtils.LogLog("ProgramTargets={0}", ProgramTargets.ToString());
CommandUtils.LogLog("ProjectBinariesFolder={0}", ProjectBinariesFolder);
CommandUtils.LogLog("ProjectBinariesPath={0}", ProjectBinariesPath);
CommandUtils.LogLog("ProjectGameExeFilename={0}", ProjectGameExeFilename);
CommandUtils.LogLog("ProjectGameExePath={0}", ProjectGameExePath);
CommandUtils.LogLog("Distribution={0}", Distribution);
CommandUtils.LogLog("Prebuilt={0}", Prebuilt);
CommandUtils.LogLog("Prereqs={0}", Prereqs);
CommandUtils.LogLog("AppLocalDirectory={0}", AppLocalDirectory);
CommandUtils.LogLog("NoBootstrapExe={0}", NoBootstrapExe);
CommandUtils.LogLog("RawProjectPath={0}", RawProjectPath);
CommandUtils.LogLog("Run={0}", Run);
CommandUtils.LogLog("ServerConfigsToBuild={0}", string.Join(",", ServerConfigsToBuild));
CommandUtils.LogLog("ServerCookedTargets={0}", ServerCookedTargets.ToString());
CommandUtils.LogLog("ServerTargetPlatform={0}", string.Join(",", ServerTargetPlatforms));
CommandUtils.LogLog("ShortProjectName={0}", ShortProjectName.ToString());
CommandUtils.LogLog("SignedPak={0}", SignedPak);
CommandUtils.LogLog("SignPak={0}", SignPak);
CommandUtils.LogLog("SkipCook={0}", SkipCook);
CommandUtils.LogLog("SkipCookOnTheFly={0}", SkipCookOnTheFly);
CommandUtils.LogLog("SkipPak={0}", SkipPak);
CommandUtils.LogLog("SkipStage={0}", SkipStage);
CommandUtils.LogLog("Stage={0}", Stage);
CommandUtils.LogLog("bUsesSteam={0}", bUsesSteam);
CommandUtils.LogLog("bUsesCEF3={0}", bUsesCEF3);
CommandUtils.LogLog("bUsesSlate={0}", bUsesSlate);
CommandUtils.LogLog("bDebugBuildsActuallyUseDebugCRT={0}", bDebugBuildsActuallyUseDebugCRT);
CommandUtils.LogLog("bTreatNonShippingBinariesAsDebugFiles={0}", bTreatNonShippingBinariesAsDebugFiles);
CommandUtils.LogLog("NativizeAssets={0}", RunAssetNativization);
CommandUtils.LogLog("Project Params **************");
}
bLogged = true;
Validate();
}
#endregion
}
}