141 lines
4.8 KiB
C#
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();
|
|
}
|
|
|
|
|
|
}
|
|
}
|