Feat: Addresses Issue #44 by adding support for crossplay between Steam and Epic

This is a large revision for our server browser and match making system that we hope to eventually release as a stand alone game menu and server browser system like we did for Unreal 4. There were a lot of improvements including a friends only option and the ability to password the listen server. This isn't a secure authentication mechanism. It's a simple one that is designed to stop average users from joining a server they aren't invited to. We weren't able to make Unreal 5.1 work with crossplay while also offering the option for Steam users to optionally link their accounts to Epic. So, in this release, we are defaulting Steam users to unlinked accounts. This removes the ability for Steam users to join their friends and it also removes Steam friends lists. We hope to fix this in the future by offering optionally linked accounts by migrating to Unreal 5.3 which hopefully offers more fine tuning of the crossplay features.
This commit is contained in:
parvan 2026-02-08 20:18:47 -06:00
parent 1f7c1c238d
commit cfffa2be20
45 changed files with 628 additions and 180 deletions

View file

@ -19,10 +19,6 @@
"Name": "AdvancedSteamSessions",
"Enabled": true
},
{
"Name": "GitSourceControl",
"Enabled": true
},
{
"Name": "LoadingScreen",
"Enabled": true
@ -70,6 +66,18 @@
{
"Name": "WebBrowserWidget",
"Enabled": true
},
{
"Name": "OnlineServicesEOS",
"Enabled": true
},
{
"Name": "OnlineSubsystemEOS",
"Enabled": true
},
{
"Name": "SteamSockets",
"Enabled": true
}
]
}

View file

@ -1,3 +1,6 @@
[/Script/UnrealEd.AnalyticsPrivacySettings]
bSendUsageData=False
[UnrealEd.SimpleMap]
[EditoronlyBP]

View file

@ -29,34 +29,6 @@ PktLoss=0
PktOrder=0
PktDup=0
[/Script/Engine.GameEngine]
!NetDriverDefinitions=ClearArray
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="/Script/OnlineSubsystemSteam.SteamNetDriver",DriverClassNameFallback="/Script/OnlineSubsystemUtils.IpNetDriver")
[OnlineSubsystem]
DefaultPlatformService=Steam
PollingIntervalInMs=20
bHasVoiceEnabled=false
[OnlineSubsystemSteam]
bEnabled=true
SteamDevAppId=4020030
GameServerQueryPort=27015
bRelaunchInSteam=false
GameVersion=1.0
bVACEnabled=1
bAllowP2PPacketRelay=true
P2PConnectionTimeout=90
[/Script/OnlineSubsystemSteam.SteamNetDriver]
NetConnectionClassName="/Script/OnlineSubsystemSteam.SteamNetConnection"
[Voice]
bEnabled=false
[/Script/Engine.StreamingSettings]
s.EventDrivenLoaderEnabled=True
s.AsyncLoadingThreadEnabled=True
@ -215,3 +187,122 @@ ConnectionType=USBOnly
bUseManualIPAddress=False
ManualIPAddress=
;=============================================================================
; Enabling this section will make the logs "noisy" for troubleshooting.
;=============================================================================
;[Core.Log]
;LogOnline=VeryVerbose
;LogOnlineSessions=VeryVerbose
;LogOnlineIdentity=Verbose
;LogOnlineSubsystemEOS=Verbose
;LogEOS=VeryVerbose
;LogEOSSDK=VeryVerbose
;LogEOSAuth=Verbose
;LogEOSConnect=Verbose
;#########################################################################################################################
; The OnlineSubsystem config in /Config/DefaultEngine.ini goes below here.
; When packaging for crossplay using EOSPlus, paste OnlineSubsystemEOSPlus(Steam/Epic).ini below and make sure to add the artifacts.
; Note: Do not use OnlineSubsystemEOS.ini for EOSPlus. use OnlineSubsystemEOSPlusEpic.ini.
; When packaging for Steam without crossplay, paste OnlineSubsystemSteam.ini below.
; When packaging for EOS without crossplay, paste OnlineSubsystemEOS.ini below and make sure to add the artifacts.
;#########################################################################################################################
;=============================================================================
; EOSPlus Online Subsystem For Epic EOS. (Tested as of 02-2026)
; Note: If you do not add the Artifacts and Product Settings, this config defaults as if it's LAN without EOSPlus or EOS.
; The easiest method for packaging and testing is to use the OnlineSubsystemSteam.ini config since Steam allows use of their server lists without a login.
; Paste this to the bottom of DefaultEngine.ini when packaging an EOSPlus Epic EOS build of the game.
; !!! IMPORTANT !!!! Make sure to paste in the settings for the Epic Product Settings and Artifacts Section and
; !!! IMPORTANT !!!! DELETE them when you are done. Do not commit them! They are secrets.
;=============================================================================
[/Script/Engine.Engine]
!NetDriverDefinitions=ClearArray
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="/Script/SocketSubsystemEOS.NetDriverEOSBase",DriverClassNameFallback="/Script/OnlineSubsystemUtils.IpNetDriver")
[/Script/Engine.GameEngine]
!NetDriverDefinitions=ClearArray
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="/Script/SocketSubsystemEOS.NetDriverEOSBase",DriverClassNameFallback="/Script/OnlineSubsystemUtils.IpNetDriver")
[Voice]
bEnabled=false
[OnlineSubsystem]
DefaultPlatformService=EOS
NativePlatformService=EOS
[OnlineSubsystemEOS]
; Setting this to bEnabled=True and [/Script/OnlineSubsystemEOS.EOSSettings] bUseEAS=False,
; then Login User Auth Type "" "AccountPortal" or "External_Auth_Steam" sets the crossplay UniqueNetID.
; Server hosting then works. The UniqueNetID is set to the Local Computer Account if Steam is not running.
bEnabled=True
bEnableOverlay=True
; Allow fallbacks to relays if direct P2P fails. Added for testing NAT punchthrough on hotspots.
; This may increase latency. Use the console command Net.EOS.DumpICEStats to log and see if it says "Relay" vs "Host" or "Srflx"
; bUseRelay=True
; Force relays for all P2P connections. This will introduce latency. Double check if this is true. It's not verified.
; bUseP2PRelay=true or bForceRelay=true
; Before shipping, make sure to zero out this section below here and do not commit it. It's a secret.
; Start of the Epic Product Settings Section
; End of the Epic Product Settings Section
[OnlineSubsystemEOSPlus]
bEnabled=true
;bUseLobbies=false
[OnlineSubsystemSteam]
bEnabled=False
bUseSteamNetworking=False
[/Script/SocketSubsystemEOS.NetDriverEOSBase]
bIsUsingP2PSockets=true
[/Script/OnlineSubsystemUtils.OnlineEngineInterfaceImpl]
+CompatibleUniqueNetIdTypes=EOS
+CompatibleUniqueNetIdTypes=EOSPlus
+CompatibleUniqueNetIdTypes=Steam
MappedUniqueNetIdTypes=(("EOSPlus","EOS"),("EOSPlus","Steam"))
[/Script/OnlineSubsystemUtils.OnlineSessionClient]
bAllowJoinInProgress=True
[/Script/OnlineSubsystemUtils.IpNetDriver]
; How long to wait for the very first packet response. (Default is usually 60.0)
InitialConnectTimeout=20.0
; How long to wait for a connection that was previously working but went silent.
ConnectionTimeout=20.0
[/Script/OnlineSubsystemEOS.EOSSettings]
; If bUseEAS=True, then Login User Auth Type "AccountPortal" or "External_Auth_Steam"
; opens the Epic linking page instead of setting the crossplay UniqueNetID. "" Is untested.
; bUseEAS=False gives Steam users a crossplay UniqueNetID but they cannot trigger the linking overlay.
bUseEAS=True
bUseEOSConnect=True
bUseEOSSessions=True
bMirrorPresenceToEAS=True
bMirrorStatsToEOS=False
bMirrorAchievementsToEOS=False
bEnableOverlay=True
bEnableSocialOverlay=True
bEnableEditorOverlay=True
DefaultArtifactName="Cardinal Fall"
bShouldEnforceBeingLaunchedByEGS=False
TitleStorageReadChunkLength=0
CacheDir=CacheDir
TickBudgetInMilliseconds=0
; Before shipping, make sure to add the "Artifacts" section below here and do not commit it. It's a secret.
; Use either the Dev Sandbox (for internal testing) or the Live Sandbox (for releases)
; Start of the Artifacts Section
; End of the Artifacts Section
;#########################################################################################################################
; The OnlineSubsystem config in /Config/DefaultEngine.ini goes above here.
; Do Not Commit Anything Listed Below Here.
; The lines below were likely added by the editor.
; Put them in their proper place above before making a commit.
;#########################################################################################################################

View file

@ -4,7 +4,7 @@ ProjectName=Cardinal Fall
CompanyName=Metahusk
Homepage="http://metahusk.com"
Description=An Unreal Engine 4 Community Developed Game By Metahusk
ProjectVersion=0.0.0.5
ProjectVersion=0.1.5.3
CopyrightNotice=All Rights Reserved
ProjectDisplayedTitle=NSLOCTEXT("", "1106FCE8431748B3C91F6E83F252772B", "Cardinal Fall")
@ -33,8 +33,8 @@ IncludeDebugFiles=False
BlueprintNativizationMethod=Disabled
bIncludeNativizedAssetsInProjectGeneration=False
bExcludeMonolithicEngineHeadersInNativizedCode=False
UsePakFile=True
bUseIoStore=False
UsePakFile=False
bUseIoStore=True
bUseZenStore=False
bMakeBinaryConfig=False
bGenerateChunks=False

View file

@ -0,0 +1,65 @@
;==========================================================
; EOS Online Subsystem. Use the OnlineSubsystemEOSPlusEpic.ini config for crossplay. (Tested as of 02-2026)
; For use on the bottom of DefaultEngine.ini when packaging an Epic Store build of the game WITHOUT crossplay.
; !!! IMPORTANT !!!! Make sure to paste in the settings for the Artifacts and Product Settings section and DELETE them when you are done. They are secrets.
; Do not commit the changes to DefaultEngine.ini and delete it when you're done. This ini is a secret.
;==========================================================
[/Script/Engine.Engine]
!NetDriverDefinitions=ClearArray
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="/Script/SocketSubsystemEOS.NetDriverEOSBase",DriverClassNameFallback="/Script/OnlineSubsystemUtils.IpNetDriver")
[/Script/Engine.GameEngine]
!NetDriverDefinitions=ClearArray
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="/Script/SocketSubsystemEOS.NetDriverEOSBase",DriverClassNameFallback="/Script/OnlineSubsystemUtils.IpNetDriver")
[Voice]
bEnabled=False
[OnlineSubsystem]
DefaultPlatformService=EOS
[OnlineSubsystemEOS]
bEnabled=True
; Allow fallbacks to relays if direct P2P fails. Added for testing NAT punchthrough on hotspots.
; This may increase latency. Use the console command Net.EOS.DumpICEStats to log and see if it says "Relay" vs "Host" or "Srflx"
; bUseRelay=True
; Force relays for all P2P connections. This will introduce latency. Double check if this is true. It's not verified.
; bUseP2PRelay=true or bForceRelay=true
; Before shipping, make sure to zero out this section below here and do not commit it. It's a secret.
; Start of the Epic Product Settings Section
; End of the Epic Product Settings Section
[/Script/SocketSubsystemEOS.NetDriverEOSBase]
bIsUsingP2PSockets=True
[/Script/OnlineSubsystemUtils.OnlineSessionClient]
bAllowJoinInProgress=True
[/Script/OnlineSubsystemUtils.IpNetDriver]
; How long to wait for the VERY FIRST packet response (Default is usually 60.0)
InitialConnectTimeout=20.0
; How long to wait for a connection that was previously working but went silent
ConnectionTimeout=20.0
[/Script/OnlineSubsystemEOS.EOSSettings]
bUseEAS=True
bUseEOSConnect=True
bUseEOSSessions=True
bMirrorPresenceToEAS=True
bMirrorStatsToEOS=False
bMirrorAchievementsToEOS=False
bEnableOverlay=True
bEnableSocialOverlay=True
bEnableEditorOverlay=True
DefaultArtifactName="Cardinal Fall"
bShouldEnforceBeingLaunchedByEGS=False
TitleStorageReadChunkLength=0
CacheDir=CacheDir
TickBudgetInMilliseconds=0
; Before shipping, make sure to add the "Artifacts" section below here and do not commit it. It's a secret.
; Use either the Dev Sandbox (for internal testing) or the Live Sandbox (for releases)
; Start of the Artifacts Section
; End of the Artifacts Section

View file

@ -0,0 +1,89 @@
;=============================================================================
; EOSPlus Online Subsystem For Epic EOS. (Tested as of 02-2026)
; Note: If you do not have the Artifacts and Product Settings, this config defaults as if it's LAN without EOSPlus or EOS.
; The easiest method for packaging and testing is to use the OnlineSubsystemSteam.ini config since Steam allows use of their server lists without a login.
; Paste this to the bottom of DefaultEngine.ini when packaging an EOSPlus Epic EOS build of the game.
; !!! IMPORTANT !!!! Make sure to paste in the settings for the Epic Product Settings and Artifacts Section and
; !!! IMPORTANT !!!! DELETE them when you are done. Do not commit them! They are secrets.
;=============================================================================
[/Script/Engine.Engine]
!NetDriverDefinitions=ClearArray
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="/Script/SocketSubsystemEOS.NetDriverEOSBase",DriverClassNameFallback="/Script/OnlineSubsystemUtils.IpNetDriver")
[/Script/Engine.GameEngine]
!NetDriverDefinitions=ClearArray
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="/Script/SocketSubsystemEOS.NetDriverEOSBase",DriverClassNameFallback="/Script/OnlineSubsystemUtils.IpNetDriver")
[Voice]
bEnabled=false
[OnlineSubsystem]
DefaultPlatformService=EOS
NativePlatformService=EOS
[OnlineSubsystemEOS]
; Setting this to bEnabled=True and [/Script/OnlineSubsystemEOS.EOSSettings] bUseEAS=False,
; then Login User Auth Type "" "AccountPortal" or "External_Auth_Steam" sets the crossplay UniqueNetID.
; Server hosting then works. The UniqueNetID is set to the Local Computer Account if Steam is not running.
bEnabled=True
bEnableOverlay=True
; Allow fallbacks to relays if direct P2P fails. Added for testing NAT punchthrough on hotspots.
; This may increase latency. Use the console command Net.EOS.DumpICEStats to log and see if it says "Relay" vs "Host" or "Srflx"
; bUseRelay=True
; Force relays for all P2P connections. This will introduce latency. Double check if this is true. It's not verified.
; bUseP2PRelay=true or bForceRelay=true
; Before shipping, make sure to zero out this section below here and do not commit it. It's a secret.
; Start of the Epic Product Settings Section
; End of the Epic Product Settings Section
[OnlineSubsystemEOSPlus]
bEnabled=true
;bUseLobbies=false
[OnlineSubsystemSteam]
bEnabled=False
bUseSteamNetworking=False
[/Script/SocketSubsystemEOS.NetDriverEOSBase]
bIsUsingP2PSockets=true
[/Script/OnlineSubsystemUtils.OnlineEngineInterfaceImpl]
+CompatibleUniqueNetIdTypes=EOS
+CompatibleUniqueNetIdTypes=EOSPlus
+CompatibleUniqueNetIdTypes=Steam
MappedUniqueNetIdTypes=(("EOSPlus","EOS"),("EOSPlus","Steam"))
[/Script/OnlineSubsystemUtils.OnlineSessionClient]
bAllowJoinInProgress=True
[/Script/OnlineSubsystemUtils.IpNetDriver]
; How long to wait for the very first packet response. (Default is usually 60.0)
InitialConnectTimeout=20.0
; How long to wait for a connection that was previously working but went silent.
ConnectionTimeout=20.0
[/Script/OnlineSubsystemEOS.EOSSettings]
; If bUseEAS=True, then Login User Auth Type "AccountPortal" or "External_Auth_Steam"
; opens the Epic linking page instead of setting the crossplay UniqueNetID. "" Is untested.
; bUseEAS=False gives Steam users a crossplay UniqueNetID but they cannot trigger the linking overlay.
bUseEAS=True
bUseEOSConnect=True
bUseEOSSessions=True
bMirrorPresenceToEAS=True
bMirrorStatsToEOS=False
bMirrorAchievementsToEOS=False
bEnableOverlay=True
bEnableSocialOverlay=True
bEnableEditorOverlay=True
DefaultArtifactName="Cardinal Fall"
bShouldEnforceBeingLaunchedByEGS=False
TitleStorageReadChunkLength=0
CacheDir=CacheDir
TickBudgetInMilliseconds=0
; Before shipping, make sure to add the "Artifacts" section below here and do not commit it. It's a secret.
; Use either the Dev Sandbox (for internal testing) or the Live Sandbox (for releases)
; Start of the Artifacts Section
; End of the Artifacts Section

View file

@ -0,0 +1,96 @@
;=============================================================================
; EOSPlus Online Subsystem For Steam. (Tested as of 02-2026)
; Note: If you do not add the Artifacts and Product Settings, this config defaults as if it's Steam without EOSPlus, but it doesn't have the correct Steam config.
; The easiest method for packaging and testing is to use the OnlineSubsystemSteam.ini config since Steam allows use of their server lists without a login.
; Paste this to the bottom of DefaultEngine.ini when packaging an EOSPlus Steam build of the game.
; !!! IMPORTANT !!!! Make sure to paste in the settings for the Epic Product Settings and Artifacts Section and
; !!! IMPORTANT !!!! DELETE them when you are done. Do not commit them! They are secrets.
;=============================================================================
;=============================================================================
; Make sure to use the Steam VDF install scripts for the bootstrapper
; https://docs.redpoint.games/docs/setup/platforms/steam/
;=============================================================================
[/Script/Engine.Engine]
!NetDriverDefinitions=ClearArray
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="/Script/SocketSubsystemEOS.NetDriverEOSBase",DriverClassNameFallback="/Script/OnlineSubsystemUtils.IpNetDriver")
[/Script/Engine.GameEngine]
!NetDriverDefinitions=ClearArray
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="/Script/SocketSubsystemEOS.NetDriverEOSBase",DriverClassNameFallback="/Script/OnlineSubsystemUtils.IpNetDriver")
[Voice]
bEnabled=False
[OnlineSubsystem]
DefaultPlatformService=EOSPlus
NativePlatformService=Steam
[OnlineSubsystemEOS]
; Setting this to bEnabled=True and [/Script/OnlineSubsystemEOS.EOSSettings] bUseEAS=False,
; then Login User Auth Type "" "AccountPortal" or "External_Auth_Steam" sets the crossplay UniqueNetID.
; Server hosting then works. The UniqueNetID is set to the Local Computer Account if Steam is not running.
bEnabled=True
bEnableOverlay=False
; Allow fallback to relay if direct P2P fails. Added for testing NAT punchthrough on hotspots.
; This may increase latency. Use the console command Net.EOS.DumpICEStats to log and see if it says "Relay" vs "Host" or "Srflx"
; bUseRelay=True
; Force relays for all P2P connections. This will introduce latency. Double check if this is true. It's not verified.
; bUseP2PRelay=true or bForceRelay=true
; Before shipping, make sure to zero out this section below here and do not commit it. It's a secret.
; Start of the Epic Product Settings Section
; End of the Epic Product Settings Section
[OnlineSubsystemEOSPlus]
bEnabled=True
[OnlineSubsystemSteam]
bEnabled=True
SteamDevAppId=4020030
GameVersion=0.1.5.3
; For EOSPlus, make sure to turn this off.
bUseSteamNetworking=False
[/Script/SocketSubsystemEOS.NetDriverEOSBase]
bIsUsingP2PSockets=True
[/Script/OnlineSubsystemUtils.OnlineEngineInterfaceImpl]
+CompatibleUniqueNetIdTypes=EOS
+CompatibleUniqueNetIdTypes=EOSPlus
+CompatibleUniqueNetIdTypes=Steam
MappedUniqueNetIdTypes=(("EOSPlus","EOS"),("EOSPlus","Steam"))
[/Script/OnlineSubsystemUtils.OnlineSessionClient]
bAllowJoinInProgress=True
[/Script/OnlineSubsystemUtils.IpNetDriver]
; How long to wait for the very first packet response. (Default is usually 60.0)
InitialConnectTimeout=20.0
; How long to wait for a connection that was previously working but went silent.
ConnectionTimeout=20.0
[/Script/OnlineSubsystemEOS.EOSSettings]
; If bUseEAS=True, then Login User Auth Type "AccountPortal" or "External_Auth_Steam"
; opens the Epic linking page instead of setting the crossplay UniqueNetID. "" Is untested.
; bUseEAS=False gives Steam users a crossplay UniqueNetID but they cannot trigger the linking overlay.
bUseEAS=False
bUseEOSConnect=True
bUseEOSSessions=True
bMirrorPresenceToEAS=False
bMirrorStatsToEOS=False
bMirrorAchievementsToEOS=False
bEnableOverlay=False
bEnableSocialOverlay=False
bEnableEditorOverlay=False
DefaultArtifactName="Cardinal Fall"
bShouldEnforceBeingLaunchedByEGS=False
TitleStorageReadChunkLength=0
CacheDir=CacheDir
TickBudgetInMilliseconds=0
; Before shipping, make sure to add the "Artifacts" section below here and do not commit it. It's a secret.
; Use either the Dev Sandbox (for internal testing) or the Live Sandbox (for releases)
; Start of the Artifacts Section
; End of the Artifacts Section

View file

@ -0,0 +1,42 @@
;==========================================================
; Steam Online Subsystem. Use the OnlineSubsystemEOSPlusSteam.ini config for crossplay. (Tested as of 02-2026)
; Paste this to the bottom of DefaultEngine.ini when packaging an Steam build of the game WITHOUT crossplay.
;==========================================================
[/Script/Engine.GameEngine]
; Using Steam Sockets because it fixes the ping 9999 issue.
!NetDriverDefinitions=ClearArray
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="/Script/SteamSockets.SteamSocketsNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")
[OnlineSubsystem]
DefaultPlatformService=Steam
PollingIntervalInMs=20
bHasVoiceEnabled=False
[OnlineSubsystemSteam]
bEnabled=True
SteamDevAppId=4020030
GameServerQueryPort=27015
bRelaunchInSteam=False
GameVersion=0.1.5.3
bVACEnabled=1
bAllowP2PPacketRelay=True
P2PConnectionTimeout=90
;When not using lobbies, this makes a listen server visible in the global Steam server browser. Only tested with steam sockets.
bInitServerOnClient=True
[/Script/OnlineSubsystemSteam.SteamNetDriver]
; Using Steam Sockets because it fixes the ping 9999 issue.
NetConnectionClassName="SteamSockets.SteamSocketsNetConnection"
[Voice]
bEnabled=False
;A fix for Steam sockets not joining from the public list, but able to join from the friends list on Unreal 5.1.
[ConsoleVariables]
; Forces the correct protocol (in case this is a problem)
net.CurrentHandshakeVersion=2
net.MinHandshakeVersion=2
; Disables the buggy security checks in 5.1 (the failed security check stopped clients from joining public servers)
net.VerifyNetSessionID=0
net.VerifyNetClientID=0

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
Content/Cardinal/Maps/MainMenu.umap (Stored with Git LFS)

Binary file not shown.

View file

@ -1,27 +1,37 @@
Differences between Steam and Epic:
Multiplayer is disabled on Epic by having this file present: \Cardinal\Binaries\Win64\disable-multiplayer
The uninstaller is renamed and placed in the local directory because Epic cannot access the appdata folder.
Steam and Epic use different DefaultEngine.ini configs for their OnlineSubsystems.
The DLC is the same.
To push an update:
1. Build a "Shipping" copy of the game. Make sure the target folder is empty and BP_DebugGameSettings has all the variables unchecked.
2. Copy that "Shipping" build of the game into an Epic BuildPatch Tool folder named CardinalReleaseUpload.
1. Make sure the contents of /Config/OnlineSubsystemEOSPlusEpic.ini are in the /Config/DefaultEngine.ini, not EOSPlusSteam.
2. Paste the Artifacts and Product Settings secrets into /Config/DefaultEngine.ini (There are TWO artifacts sections.)
3. Re-open the project because the ini file doesn't load without an editor restart.
4. In Project Settings, set the Project Version.
5. Package a "Shipping" copy of the game. Make sure the target folder is empty and BP_DebugGameSettings has all the variables unchecked.
6. Copy that "Shipping" package of the game into an Epic BuildPatch Tool folder named CardinalReleaseUpload.
> For Example: C:\Unreal\Projects\BuildPatchTool_1.7.3.1\CardinalReleaseUpload
2. And paste a copy of the Credits.txt file into the root of CardinalReleaseUpload.
3. Also, paste a copy of the "Cardinal" folder from the ExtraFiles folder in the CardinalReleaseUpload folder. (This adds the "disable-multiplayer" file into the same directory as the binary.)
4. Then copy Epic_CardinalInstaller.exe, Epic_CardinalUninstaller.exe, and Epic_CardinalUninstaller.dat into the root of the CardinalReleaseUpload directory.
5. After that, create a CloudDir directory in the root of the Epic BuildPatch Tool directory. For Example: C:\Unreal\Projects\BuildPatchTool_1.7.3.1\CloudDir
6. (Untested without but maybe not needed?) Then after that, copy the file FileAttributeList.txt from the project's EpicGamesStore folder into the root of Epic's BuildPatch Tool directory. (Do not copy it into your upload directory)
7. And paste a copy of the Credits.txt file into the root of CardinalReleaseUpload.
8. Make sure the root of the CardinalReleaseUpload directory has Epic_CardinalInstaller.exe, Epic_CardinalUninstaller.exe, and Epic_CardinalUninstaller.dat.
9. Then after that, make sure there's a copy of the file FileAttributeList.txt from the project's Project\Distributions\EpicGamesStore folder in the root of Epic's BuildPatch Tool directory. (Do not copy it into your upload directory)
> For Example: copy C:\Unreal\Projects\cardinal-fall\EpicGamesStore\FileAttributeList.txt into C:\Unreal\Projects\BuildPatchTool_1.7.3.1
10. !!!IMPORTANT!!! Delete the Artifacts and Product Settings secrets. DO NOT commit those TWO sections. They're secrets!
In a command prompt, paste this and manually add the SECRET (ClientSecretEnvVar):
To start, In a command prompt, paste this and manually add the SECRET (ClientSecretEnvVar):
set EpicSecret=<YourClientSecret>
After that, paste this into a cmd prompt:
Important! To push an update for the game, change the BuildVersion. (It will say The artifact "ArtifactID" already has a binary registereed with version "BuildVersion".)
C:\Unreal\Projects\BuildPatchTool_1.7.3.1\Engine\Binaries\Win64\BuildPatchTool.exe -OrganizationId="o-av2at78fnjrda5k4xzj8duluewkzk8" -ProductId="4c095655c4144ced8f03b770c18dd906" -ArtifactId="8b788ebc4e1e462c8ce9bfbc6ffbef59" -ClientId="xyza7891KpEHJU5XXWJP4oFx5wbKfeva" -ClientSecretEnvVar="EpicSecret" -mode=UploadBinary -BuildRoot="C:\Unreal\Projects\BuildPatchTool_1.7.3.1\CardinalReleaseUpload" -CloudDir="C:\Unreal\Projects\BuildPatchTool_1.7.3.1\CloudDir" -BuildVersion="Release4.3" -AppLaunch="Cardinal.exe" -AppArgs="" -PrereqPath="Epic_CardinalInstaller.exe" -PrereqArgs="/verysilent" -UninstallActionPath="Epic_CardinalUninstaller.exe" -UninstallActionArgs="/verysilent" -FileAttributeList="C:\Unreal\Projects\cardinal-fall\EpicGamesStore\FileAttributeList.txt"
After that, paste this into a cmd prompt: (Make sure to set the -BuildVersion and -PrereqIds to a unique value each time. If the -PrereqIds is the same, it will not run the Epic_CardinalInstaller.exe on re-installs.)
Important!!! To push an update for the game, change the BuildVersion and the PrereqIds.
C:\Unreal\Projects\BuildPatchTool_1.7.3.1\Engine\Binaries\Win64\BuildPatchTool.exe -OrganizationId="o-av2at78fnjrda5k4xzj8duluewkzk8" -ProductId="4c095655c4144ced8f03b770c18dd906" -ArtifactId="8b788ebc4e1e462c8ce9bfbc6ffbef59" -ClientId="xyza7891KpEHJU5XXWJP4oFx5wbKfeva" -ClientSecretEnvVar="EpicSecret" -mode=UploadBinary -BuildRoot="C:\Unreal\Projects\BuildPatchTool_1.7.3.1\CardinalReleaseUpload" -CloudDir="C:\Unreal\Projects\BuildPatchTool_1.7.3.1\CloudDir" -AppLaunch="Cardinal.exe" -AppArgs="" -PrereqPath="Epic_CardinalInstaller.exe" -PrereqArgs="/verysilent" -UninstallActionPath="Epic_CardinalUninstaller.exe" -UninstallActionArgs="/verysilent" -FileAttributeList="C:\Unreal\Projects\BuildPatchTool_1.7.3.1\FileAttributeList.txt" -BuildVersion="0.1.5.3b" -PrereqIds="0.1.5.3b"
Double Check:
1. Make sure the correct settings and TWO settings were pasted into /Config/DefaultEngine.ini
2. Make sure it was a SHIPPING build with all the flags in BP_DebugGameSettings set to false / unchecked.
3. Make sure the artifact secrets were pasted into BOTH sections of the DefaultEngine.ini.
4. Make sure the current Credits.txt files is copied into the root of the folder.
5. Make sure the installer, uninstaller, and dat files are present in the root directory.
6. Make sure the BuildPatchTool root directory has the FileAttributeList.txt file.
7. MAKE SURE the TWO artifacts are DELETED.
For the DLC, from the Steam directory paste the dlc-bronze, dlc-silver, dlc-gold folders into the BuildPatch Tool root, and then run these in a cmd prompt:
Bronze:
@ -31,14 +41,6 @@ C:\Unreal\Projects\BuildPatchTool_1.7.3.1\Engine\Binaries\Win64\BuildPatchTool.e
Gold:
C:\Unreal\Projects\BuildPatchTool_1.7.3.1\Engine\Binaries\Win64\BuildPatchTool.exe -OrganizationId="o-av2at78fnjrda5k4xzj8duluewkzk8" -ProductId="4c095655c4144ced8f03b770c18dd906" -ArtifactId="56a328ff349b46f0bab68741ab258022" -ClientId="xyza7891KpEHJU5XXWJP4oFx5wbKfeva" -ClientSecretEnvVar="EpicSecret" -mode=UploadBinary -BuildRoot="C:\Unreal\Projects\BuildPatchTool_1.7.3.1\dlc-gold" -CloudDir="C:\Unreal\Projects\BuildPatchTool_1.7.3.1\CloudDir" -BuildVersion="Release2" -AppLaunch="" -AppArgs=""
Double Check:
1. Make sure it was a SHIPPING build with all the flags in BP_DebugGameSettings set to false / unchecked.
2. Make sure the ExtraFiles copied the file "disable-multiplayer" in the same directory as the binary.
3. Make sure the current Credits.txt files is copied into the root of the folder.
4. Make sure the installer and uninstaller files are present in the root directory.
5. It's unknown if the FileAttributeList.txt file is neccessary. It hasn't been tested without.
Testing:
Bug: The game asks for network priviledges. Epic doesn't have an easy way to fix this. It might require using a script?
To make the update active in the launcher:
1. Activate the Binary: In the Dev Portal, go to Epic Games Store > Artifacts and Binaries. Find your artifact, click Edit, and set your recently uploaded binary as the Active Binary
Note: To download, you will need to redeem the Dev version using the keys in Epic Games Store > Access Keys. Product Settings > Player Groups doesn't always work.

View file

@ -1,13 +1,10 @@
"AppBuild"
{
"AppID" "4020030" // Your AppID
"Desc" "Your build description here" // internal description for this build
// "Preview" "1" // make this a preview build only, nothing is uploaded
// "Local" "..\..\ContentServer\htdocs" // put content on local content server instead of uploading to Steam
// "SetLive" "AlphaTest" // set this build live on beta branch AlphaTest
"ContentRoot" "..\content\" // content root folder relative to this script file
// "BuildOutput" "D:\build_output\" // put build cache and log files on different drive for better performance
"verbose" "0" // spew more build details in console
"AppID" "4020030"
"Desc" "No Description" // consider updating your description or leave it and change it within Steam
// "SetLive" "alpha" // remove the comment to put this build on the beta branch
"ContentRoot" "..\content\"
"verbose" "0"
"Depots"
{
// file mapping instructions for each depot are in separate script files

View file

@ -1,30 +1,16 @@
"DepotBuild"
{
// Set your assigned depot ID here
"DepotID" "4020031"
// include all files recursivley
"ContentRoot" "."
// 1. Map the game files
"FileMapping"
{
// This can be a full path, or a path relative to ContentRoot
"LocalPath" "*"
// This is a path relative to the install folder of your game
"DepotPath" "."
// If LocalPath contains wildcards, setting this means that all
// matching files within subdirectories of LocalPath will also
// be included.
"Recursive" "1"
}
"FileMapping"
{
// copy the install script into the depot root folder
"LocalPath" "Steam_InstallScript.vdf"
"DepotPath" "."
}
"InstallScript" "Steam_InstallScript.vdf"
"FileMapping"
{
// copy the installer into the depot root folder
"LocalPath" "Steam_CardinalInstaller.exe"
"DepotPath" "."
}
}
// Set the install script
"InstallScript" "Steam_InstallScript.vdf"
// File exclusions
"FileExclusion" "*.pdb"
}

View file

@ -3,14 +3,23 @@
"Firewall"
{
"Cardinal Fall" "%INSTALLDIR%\\Cardinal.exe"
"Cardinal Fall - Game Engine" "%INSTALLDIR%\\Cardinal\\Binaries\\Win64\\Cardinal-Win64-Shipping.exe"
"Cardinal Fall - Dev Testing" "%INSTALLDIR%\\Cardinal\\Binaries\\Win64\\Cardinal.exe"
}
"Run Process"
{
"Steam_CardinalInstaller"
{
"Description" "Installing the uninstaller..."
"Process 1" "%INSTALLDIR%\\Steam_CardinalInstaller.exe"
"Command 1" "/verysilent"
}
// This is for crossplay with Epic Online Services. If the game doesn't use EOS, remove this.
"EpicOnlineServicesInstaller"
{
"Process 1" "%INSTALLDIR%\\EpicOnlineServicesInstaller.exe"
"Command 1" "/quiet /install productId=4c095655c4144ced8f03b770c18dd906"
}
}
"Run Process On Uninstall"
{

View file

@ -1,9 +1,46 @@
Differences between Steam and Epic:
Steam and Epic use different DefaultEngine.ini configs for their OnlineSubsystems.
The DLC is the same.
To update on Steam: (If SteamCMD is already set up)
1. Before opening the project, add these three things in the /Config/DefaultEngine.ini file:
1a. The EOSPlus Steam config from /Config/OnlineSubsystemEOSPlusSteam.ini.
1b. Set GameVersion=X under [OnlineSubsystemSteam].
1c. Add the Artifacts and Product Settings secrets. (There are TWO artifacts sections.)
2. Open the editor and in the Project Settings, set the Project Version.
3. Package a shipping copy of the game. Make sure the target folder is empty and the map's BP_DebugGameSettings has all the variables unchecked.
4. Copy that shipping package of the game into the Steam sdk at \sdk\tools\ContentBuilder\content\.
> Keep the Steam_InstallScript.vdf, EpicOnlineServicesInstaller.exe, and Steam_CardinalInstaller.exe files in the same directory.
5. And paste a current copy of the Credits.txt file into the same directory.
> Make sure the folder has Steam_CardinalInstaller.exe, EpicOnlineServicesInstaller.exe, and Steam_InstallScript.vdf.
> If you're not using crossplay with Epic, the content folder doesn't need EpicOnlineServicesInstaller.exe. Make sure to comment out the relative section in the Steam_InstallScript.vdf file.
6. Decide if the branch should be default or alpha. For an alpha, remove the \\ comment the "SetLive" vdf line on sdk\tools\ContentBuilder\scripts\Steam_AppBuild4020030.vdf to reflect this choice.
6. Then open Steam command.
> For Example: C:\Unreal\Projects\sdk_162\tools\ContentBuilder\builder\steamcmd.exe
7. And login.
> For example: login <account_name> <password>
8. Then build the depot (which uploads the project files in the content folder) For example: run_app_build ..\scripts\Steam_AppBuild4020030.vdf
> Quit when done by using the commnad quit.
9. After that, you will need to publish the changes on Steam by going to https://partner.steamgames.com/apps/builds/4020030, preview change, entering a comment, then Set Build Live.
10. !!!IMPORTANT!!! Delete the TWO Artifacts sections in the /Config/DefaultEngine.ini when finished. DO NOT commit the Artifact Sections. It's a secret!
Double Check:
1. Make sure the correct OnlineSubsystem section of the /Config/DefaultEngine.ini was set up.
2. Make sure a SHIPPING build was used with all the flags in BP_DebugGameSettings set to false / unchecked.
3. Make sure the root of the content folder has Credits.txt, Steam_CardinalInstaller.exe, EpicOnlineServicesInstaller.exe, and Steam_InstallScript.vdf
4. And when done, MAKE SURE the TWO ARTIFACTS section were DELETED!
To release on Steam:
Before opening the project to build, make sure the OnlineSubsystem section of the /Config/DefaultEngine.ini file has the EOSPlus Steam config from /Config/OnlineSubsystemEOSPlusSteam.ini.
Set the GameVersion=X under [OnlineSubsystemSteam] in the /Config/DefaultEngine.ini file.
Paste the Artifact and Product Settings secrets into the TWO sections of the Steam configuration of /Config/DefaultEngine.ini.
Open the project and in the Project Settings, set the Project Version.
Build a shipping copy of the game. Make sure the target folder is empty and BP_DebugGameSettings has all the variables unchecked.
Copy a "Shipping" build of the game into the Steam sdk that has BP_DebugGameSettings IsGameDebug? and all other flags set to false.
And paste a copy of the Credits.txt file into the same directory.
> For Example: C:\Unreal\Projects\sdk_162\tools\ContentBuilder\content
CopySteam_AppBuild4020030.vdf into into the Steam sdk's scripts directory.
Copy a "Shipping" build of the game into the Steam sdk at \tools\ContentBuilder\content\ that has BP_DebugGameSettings IsGameDebug? and all other flags set to false.
And paste a copy of the Credits.txt file into the same directory along with Steam_CardinalInstaller.exe and Steam_InstallScript.vdf.
> If you're using crossplay with Epic, make sure the folder has EpicOnlineServicesInstaller.exe from the EOS SDK in the \Tools folder.
CopySteam_AppBuild4020030.vdf into into the Steam sdk's scripts directory.
> For example: C:\Unreal\Projects\sdk_162\tools\ContentBuilder\scripts
Copy all the "depots" (e.g. Steam_DepotBuild4020031.vdf, SteamDLC_DepotBuild_Bronze.vdf, and etc) into into the Steam sdk's scripts directory.
> For example: C:\Unreal\Projects\sdk_162\tools\ContentBuilder\scripts
@ -20,24 +57,6 @@ And login.
Then build the depot (which uploads the project files in the content folder) For example: run_app_build ..\scripts\Steam_AppBuild4020030.vdf
Then quit.
>For example: quit
After that, you will need to publish the changes on Steam by going to https://partner.steamgames.com/apps/builds/4020030 then selecting the "default" branch, preview change, entering a comment, then Set Build Live
After that, you will need to publish the changes on Steam by going to https://partner.steamgames.com/apps/builds/4020030 then selecting the "default" branch, preview change, entering a comment, then Set Build Live.
!!!IMPORTANT!!! Delete the TWO Artifacts section of the /Config/DefaultEngine.ini when finished. DO NOT commit the Artifacts Sections. It's a secret!
To push an update on Steam if SteamCMD is already set up:
Build a shipping copy of the game. Make sure the target folder is empty and BP_DebugGameSettings has all the variables unchecked.
Copy a "Shipping" build of the game into the Steam sdk that has BP_DebugGameSettings IsGameDebug? and all other flags set to false.
> Keep the Steam_InstallScript.vdf and Steam_CardinalInstaller.exe files in the same directory.
And paste a copy of the Credits.txt file into the same directory.
> For Example: C:\Unreal\Projects\sdk_162\tools\ContentBuilder\content
Then open Steam command.
> For Example: C:\Unreal\Projects\sdk_162\tools\ContentBuilder\builder\steamcmd.exe
And login.
> For example: login <account_name> <password>
Then build the depot (which uploads the project files in the content folder) For example: run_app_build ..\scripts\Steam_AppBuild4020030.vdf
Then quit.
> For example: quit
After that, you will need to publish the changes on Steam by going to https://partner.steamgames.com/apps/builds/4020030 then selecting the "default" branch, preview change, entering a comment, then Set Build Live
Double Check:
1. Make sure it was a SHIPPING build with all the flags in BP_DebugGameSettings set to false / unchecked.
2. Make sure the current Credits.txt files is copied into the root of the folder.

View file

@ -8,7 +8,9 @@ public class CardinalTarget : TargetRules
Type = TargetType.Game;
ExtraModuleNames.Add("Cardinal");
bUsesSteam = true;
// Added for 4.26
// Added for UE4.26
DefaultBuildSettings = BuildSettingsVersion.V2;
// Added for UE5.1
IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1;
}
}

View file

@ -1,28 +1,50 @@
using UnrealBuildTool;
using System.Collections.Generic;
public class Cardinal : ModuleRules
{
public Cardinal(ReadOnlyTargetRules Target) : base(Target)
public Cardinal(ReadOnlyTargetRules Target) : base(Target)
{
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "AdvancedSessions", "OnlineSubsystem", "OnlineSubsystemUtils", "Networking", "Sockets", "OnlineSubsystemSteam", "OnlineSubsystemNull", "MoviePlayer", "DeveloperSettings" });
// -----------------------------
// Modern UE5 PCH and include order
// -----------------------------
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1;
PrivateDependencyModuleNames.AddRange(new string[] { "OnlineSubsystem", "Sockets", "Networking", "OnlineSubsystemSteam", "OnlineSubsystemNull" });
// -----------------------------
// Public modules (always included)
// -----------------------------
PublicDependencyModuleNames.AddRange(new string[]
{
"Core", // Engine core
"CoreUObject", // UObject system
"Engine", // Engine runtime
"InputCore", // Player input
"AdvancedSessions", // AdvancedSessions plugin
"OnlineSubsystem", // Generic OSS interfaces (IOnlineSubsystem)
"OnlineSubsystemUtils", // Session helpers (Find/Join/Create)
"Networking", // Low-level networking types used by AdvancedSessions
"Sockets", // Socket API required by AdvancedSessions
"OnlineSubsystemNull", // Null OSS for testing / server
"MoviePlayer", // For playing intro/loading movies
"DeveloperSettings" // UDeveloperSettings, used by plugins like Rama’s Victory plugin
});
//For 4.26
PrivatePCHHeaderFile = "Cardinal.h";
bLegacyPublicIncludePaths = true;
// -----------------------------
// Private modules (always included)
// -----------------------------
PrivateDependencyModuleNames.AddRange(new string[]
{
"OnlineSubsystemEOS", // Epic Online Services runtime
"EOSShared" // EOS SDK glue
});
// Uncomment if you are using Slate UI
// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
// Uncomment if you are using online features
//PrivateDependencyModuleNames.Add("OnlineSubsystem");
//if ((Target.Platform == UnrealTargetPlatform.Win32) || (Target.Platform == UnrealTargetPlatform.Win64))
//{
// if (UEBuildConfiguration.bCompileSteamOSS == true)
// {
// DynamicallyLoadedModuleNames.Add("OnlineSubsystemSteam");
// }
// }
// -----------------------------
// Conditional Steam inclusion
// -----------------------------
if (Target.bUsesSteam)
{
PrivateDependencyModuleNames.Add("OnlineSubsystemSteam"); // Steam OSS
}
}
}

View file

@ -7,7 +7,9 @@ public class CardinalEditorTarget : TargetRules
{
Type = TargetType.Editor;
ExtraModuleNames.Add("Cardinal");
// Added for 4.26
// Added for UE4.26
DefaultBuildSettings = BuildSettingsVersion.V2;
// Added for UE5.1
IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1;
}
}

View file

@ -7,7 +7,10 @@ public class CardinalServerTarget : TargetRules
{
Type = TargetType.Server;
ExtraModuleNames.Add("Cardinal");
// Added for 4.26
bUsesSteam = false;
// Added for UE4.26
DefaultBuildSettings = BuildSettingsVersion.V2;
// Added for UE5.1
IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1;
}
}