156 lines
4.3 KiB
C#
156 lines
4.3 KiB
C#
|
using System;
|
||
|
using System.Globalization;
|
||
|
using Facepunch.Steamworks;
|
||
|
using JetBrains.Annotations;
|
||
|
using RoR2.Networking;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace RoR2;
|
||
|
|
||
|
internal static class SteamworksInviteManager
|
||
|
{
|
||
|
private const string rpConnect = "connect";
|
||
|
|
||
|
private const string rpStatus = "status";
|
||
|
|
||
|
private static void SetKeyValue([NotNull] string key, [CanBeNull] string value)
|
||
|
{
|
||
|
Client.Instance.User.SetRichPresence(key, value);
|
||
|
}
|
||
|
|
||
|
private static void OnNetworkStart()
|
||
|
{
|
||
|
string text = null;
|
||
|
PlatformID platformID = PlatformID.nil;
|
||
|
PlatformID platformID2 = PlatformID.nil;
|
||
|
string[] commandLineArgs = Environment.GetCommandLineArgs();
|
||
|
for (int i = 0; i < commandLineArgs.Length - 1; i++)
|
||
|
{
|
||
|
switch (commandLineArgs[i].ToLower(CultureInfo.InvariantCulture))
|
||
|
{
|
||
|
case "+connect":
|
||
|
{
|
||
|
if (AddressPortPair.TryParse(commandLineArgs[i + 1], out var addressPortPair))
|
||
|
{
|
||
|
text = addressPortPair.address + ":" + addressPortPair.port;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
case "+connect_steamworks_p2p":
|
||
|
{
|
||
|
if (PlatformID.TryParse(commandLineArgs[i + 1], out var result2))
|
||
|
{
|
||
|
platformID = result2;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
case "+steam_lobby_join":
|
||
|
{
|
||
|
if (PlatformID.TryParse(commandLineArgs[i + 1], out var result))
|
||
|
{
|
||
|
platformID2 = result;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (platformID2 != PlatformID.nil)
|
||
|
{
|
||
|
Console.instance.SubmitCmd(null, "steam_lobby_join " + platformID2.value);
|
||
|
}
|
||
|
else if (platformID != PlatformID.nil)
|
||
|
{
|
||
|
Console.instance.SubmitCmd(null, "connect_steamworks_p2p " + platformID.value);
|
||
|
}
|
||
|
else if (text != null)
|
||
|
{
|
||
|
Console.instance.SubmitCmd(null, "connect " + text);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static void OnLobbyChanged()
|
||
|
{
|
||
|
if (PlatformSystems.lobbyManager.isInLobby)
|
||
|
{
|
||
|
SetKeyValue("connect", "+steam_lobby_join " + PlatformSystems.lobbyManager.GetLobbyID());
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
SetKeyValue("connect", null);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static void OnInvitedToGame(SteamFriend steamFriend, string connectString)
|
||
|
{
|
||
|
Debug.LogFormat("OnGameRichPresenceJoinRequested connectString=\"{0}\" steamFriend=\"{1}\"", connectString, steamFriend.Name);
|
||
|
string[] array = connectString.Split(' ');
|
||
|
if (array.Length < 2)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
if (array[0] == "+connect_steamworks_p2p" && PlatformID.TryParse(array[1], out var result))
|
||
|
{
|
||
|
if (!PlatformSystems.lobbyManager.ownsLobby)
|
||
|
{
|
||
|
PlatformSystems.lobbyManager.LeaveLobby();
|
||
|
}
|
||
|
QuitConfirmationHelper.IssueQuitCommand(null, "connect_steamworks_p2p " + result.value);
|
||
|
}
|
||
|
if (!(array[0] == "+steam_lobby_join"))
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
if (!(PlatformSystems.lobbyManager as PCLobbyManager).CheckLobbyIdValidity(array[1]))
|
||
|
{
|
||
|
if (PlatformSystems.ShouldUseEpicOnlineSystems)
|
||
|
{
|
||
|
PCLobbyManager.ShowEnableCrossPlayPopup(isLobbyCrossplay: false);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
PCLobbyManager.ShowEnableCrossPlayPopup(isLobbyCrossplay: true);
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
bool shouldUseEpicOnlineSystems = PlatformSystems.ShouldUseEpicOnlineSystems;
|
||
|
if (PlatformID.TryParse(array[1], out var result2) || shouldUseEpicOnlineSystems)
|
||
|
{
|
||
|
if (!PlatformSystems.lobbyManager.ownsLobby)
|
||
|
{
|
||
|
PlatformSystems.lobbyManager.LeaveLobby();
|
||
|
}
|
||
|
string text = (shouldUseEpicOnlineSystems ? array[1] : result2.value.ToString());
|
||
|
QuitConfirmationHelper.IssueQuitCommand(null, "steam_lobby_join " + text);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static void OnGameServerChangeRequested(string address, string password)
|
||
|
{
|
||
|
Debug.LogFormat("OnGameServerChangeRequested address=\"{0}\"", address);
|
||
|
if (!PlatformSystems.lobbyManager.ownsLobby)
|
||
|
{
|
||
|
PlatformSystems.lobbyManager.LeaveLobby();
|
||
|
}
|
||
|
string consoleCmd = $"cl_password \"{Util.EscapeQuotes(password)}\"; connect \"{Util.EscapeQuotes(address)}\"";
|
||
|
QuitConfirmationHelper.IssueQuitCommand(null, consoleCmd);
|
||
|
}
|
||
|
|
||
|
private static void SetupCallbacks()
|
||
|
{
|
||
|
NetworkManagerSystem.onStartGlobal += OnNetworkStart;
|
||
|
LobbyManager lobbyManager = PlatformSystems.lobbyManager;
|
||
|
lobbyManager.onLobbyChanged = (Action)Delegate.Combine(lobbyManager.onLobbyChanged, new Action(OnLobbyChanged));
|
||
|
if (Client.Instance != null)
|
||
|
{
|
||
|
Client.Instance.Friends.OnInvitedToGame += OnInvitedToGame;
|
||
|
Client.Instance.Friends.OnGameServerChangeRequested = OnGameServerChangeRequested;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
|
||
|
private static void Init()
|
||
|
{
|
||
|
SteamworksClientManager.onLoaded += SetupCallbacks;
|
||
|
}
|
||
|
}
|