Files
BoneSync/BoneSync/Networking/LobbyManager/SteamLobbyManager.cs
Aaro Varis 9a468564e8 mogging
2025-03-23 23:54:44 +02:00

141 lines
4.8 KiB
C#

using BoneSync.Data;
using BoneSync.Player;
using BoneSync.Sync;
using Facepunch.Steamworks;
using Facepunch.Steamworks.Data;
using MelonLoader;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BoneSync.Networking.LobbyManager
{
internal class SteamLobbyManager : LobbyManager
{
public SteamLobbyManager()
{
SteamMatchmaking.OnLobbyCreated += (Result result, Lobby lobby) =>
{
_lobbyInstance = lobby;
SyncLogger.Msg("Created lobby " + lobby.Id);
UpdateLobbyData();
_lobbyInstance.SetPublic();
};
SteamMatchmaking.OnLobbyEntered += (Lobby lobby) =>
{
_lobbyInstance = lobby;
SyncLogger.Msg("Entered lobby " + lobby.Id);
UpdateLobbyData();
};
SteamMatchmaking.OnLobbyMemberLeave += (Lobby lobby, Friend friend) =>
{
if (friend.Id == SteamClient.SteamId)
{
SyncLogger.Msg("Left lobby " + lobby.Id);
_lobbyInstance = new Lobby();
}
SyncLogger.Msg("Member left " + friend.Id);
UpdateLobbyData();
};
SteamMatchmaking.OnLobbyMemberJoined += (Lobby lobby, Friend friend) =>
{
SyncLogger.Msg("Member joined " + friend.Id);
SteamFriends.SetPlayedWith(friend.Id);
UpdateLobbyData();
};
SyncLogger.Msg("SteamLobbyManager initialized");
SteamFriends.OnGameLobbyJoinRequested += (Lobby lobby, SteamId friend) =>
{
SyncLogger.Msg("Joining lobby " + lobby.Id);
JoinLobby(lobby.Id.Value);
};
SteamFriends.OnGameRichPresenceJoinRequested += (Friend friend, string connectString) =>
{
SyncLogger.Msg("Joining lobby " + connectString);
ulong lobbyId = ulong.Parse(connectString.Split(':')[1]);
JoinLobby(lobbyId);
};
//SteamMatchmaking.LobbyList.
}
private Lobby _lobbyInstance;
public Friend[] LobbyMembers
{
get;
private set;
}
public SteamId[] steamIds
{
get;
private set;
}
public override bool IsConnected()
{
return _lobbyInstance.Id.IsValid;
}
public override ulong[] GetPeers() => steamIds.Select(x => x.Value).ToArray();
public override ulong GetLocalId() => SteamClient.SteamId.Value;
public override ulong GetHostId() => _lobbyInstance.Owner.Id.Value;
public override ulong GetLobbyId() => _lobbyInstance.Id.Value;
private void UpdateLobbyData()
{
LobbyMembers = _lobbyInstance.Members.ToArray();
steamIds = LobbyMembers.Select(x => x.Id).ToArray();
if (_lobbyInstance.Id.IsValid)
{
SteamFriends.SetRichPresence("steam_display", "BoneSync - " + SceneSync.CurrentSceneDisplayName);
SteamFriends.SetRichPresence("steam_player_group", _lobbyInstance.Id.Value.ToString());
SteamFriends.SetRichPresence("steam_player_group_size", LobbyMembers.Length.ToString());
SteamFriends.SetRichPresence("connect", "lobby:" + _lobbyInstance.Id.Value);
SteamFriends.SetRichPresence("status", "In a lobby");
}
else
{
SteamFriends.SetRichPresence("steam_display", "BoneSync - SinglePlayer");
SteamFriends.SetRichPresence("steam_player_group", null);
SteamFriends.SetRichPresence("steam_player_group_size", null);
SteamFriends.SetRichPresence("connect", null);
SteamFriends.SetRichPresence("status", "Not in a multiplayer lobby");
}
_lobbyInstance.SetMemberData("sceneName", SceneSync.CurrentSceneDisplayName);
_lobbyInstance.SetMemberData("playerModel", "");
}
public override void CreateLobby()
{
LeaveLobby();
SyncLogger.Msg("Trying to create lobby");
_ = SteamMatchmaking.CreateLobbyAsync(16);
}
public override void JoinLobby(ulong lobbyId)
{
LeaveLobby();
SyncLogger.Msg("Trying to join lobby " + lobbyId);
_ = SteamMatchmaking.JoinLobbyAsync(lobbyId);
}
public override void LeaveLobby()
{
if (!IsConnected()) return;
_lobbyInstance.Leave();
_lobbyInstance = new Lobby();
BoneSync.transport.CleanUp();
}
}
}