177 lines
5.7 KiB
C#
177 lines
5.7 KiB
C#
|
using System;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Threading.Tasks;
|
||
|
using Steamworks;
|
||
|
using Steamworks.Data;
|
||
|
using UnityEngine;
|
||
|
using UnityEngine.Events;
|
||
|
using UnityEngine.UI;
|
||
|
|
||
|
|
||
|
public class SteamLobbyManager : MonoBehaviour
|
||
|
{
|
||
|
public static Lobby CurrentLobby;
|
||
|
public static bool UserInLobby;
|
||
|
public UnityEvent onLobbyCreated;
|
||
|
public UnityEvent onLobbyJoined;
|
||
|
public UnityEvent onLobbyLeave;
|
||
|
|
||
|
|
||
|
public GameObject inLobbyFriend;
|
||
|
public Transform content;
|
||
|
|
||
|
public Dictionary<SteamId, GameObject> inLobby = new();
|
||
|
|
||
|
private void Start()
|
||
|
{
|
||
|
DontDestroyOnLoad(this);
|
||
|
|
||
|
SteamMatchmaking.OnLobbyCreated += OnLobbyCreatedCallBack;
|
||
|
SteamMatchmaking.OnLobbyEntered += OnLobbyEntered;
|
||
|
SteamMatchmaking.OnLobbyMemberJoined += OnLobbyMemberJoined;
|
||
|
SteamMatchmaking.OnChatMessage += OnChatMessage;
|
||
|
SteamMatchmaking.OnLobbyMemberDisconnected += OnLobbyMemberDisconnected;
|
||
|
SteamMatchmaking.OnLobbyMemberLeave += OnLobbyMemberDisconnected;
|
||
|
SteamMatchmaking.OnLobbyGameCreated += OnLobbyGameCreated;
|
||
|
SteamFriends.OnGameLobbyJoinRequested += OnGameLobbyJoinRequest;
|
||
|
SteamMatchmaking.OnLobbyInvite += OnLobbyInvite;
|
||
|
}
|
||
|
|
||
|
private void OnLobbyInvite(Friend friend, Lobby lobby)
|
||
|
{
|
||
|
Debug.Log($"{friend.Name} invited you to his lobby.");
|
||
|
}
|
||
|
|
||
|
|
||
|
private void OnLobbyGameCreated(Lobby lobby, uint ip, ushort port, SteamId id)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
private async void OnLobbyMemberJoined(Lobby lobby, Friend friend)
|
||
|
{
|
||
|
Debug.Log($"{friend.Name} joined the lobby");
|
||
|
var obj = Instantiate(inLobbyFriend, content);
|
||
|
obj.GetComponentInChildren<Text>().text = friend.Name;
|
||
|
obj.GetComponentInChildren<RawImage>().texture =
|
||
|
await SteamFriendsManager.GetTextureFromSteamIdAsync(friend.Id);
|
||
|
inLobby.Add(friend.Id, obj);
|
||
|
}
|
||
|
|
||
|
private void OnLobbyMemberDisconnected(Lobby lobby, Friend friend)
|
||
|
{
|
||
|
Debug.Log($"{friend.Name} left the lobby");
|
||
|
Debug.Log($"New lobby owner is {CurrentLobby.Owner}");
|
||
|
if (inLobby.ContainsKey(friend.Id))
|
||
|
{
|
||
|
Destroy(inLobby[friend.Id]);
|
||
|
inLobby.Remove(friend.Id);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void OnChatMessage(Lobby lobby, Friend friend, string message)
|
||
|
{
|
||
|
Debug.Log($"incoming chat message from {friend.Name} : {message}");
|
||
|
}
|
||
|
|
||
|
private async void OnGameLobbyJoinRequest(Lobby joinedLobby, SteamId id)
|
||
|
{
|
||
|
var joinedLobbySuccess = await joinedLobby.Join();
|
||
|
if (joinedLobbySuccess != RoomEnter.Success)
|
||
|
Debug.Log("failed to join lobby : " + joinedLobbySuccess);
|
||
|
else
|
||
|
CurrentLobby = joinedLobby;
|
||
|
}
|
||
|
|
||
|
private void OnLobbyCreatedCallBack(Result result, Lobby lobby)
|
||
|
{
|
||
|
if (result != Result.OK)
|
||
|
{
|
||
|
Debug.Log("lobby creation result not ok : " + result);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
onLobbyCreated.Invoke();
|
||
|
Debug.Log("lobby creation result ok");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private async void OnLobbyEntered(Lobby lobby)
|
||
|
{
|
||
|
Debug.Log("Client joined the lobby");
|
||
|
UserInLobby = true;
|
||
|
foreach (var user in inLobby.Values) Destroy(user);
|
||
|
inLobby.Clear();
|
||
|
|
||
|
var obj = Instantiate(inLobbyFriend, content);
|
||
|
obj.GetComponentInChildren<Text>().text = SteamClient.Name;
|
||
|
obj.GetComponentInChildren<RawImage>().texture =
|
||
|
await SteamFriendsManager.GetTextureFromSteamIdAsync(SteamClient.SteamId);
|
||
|
|
||
|
inLobby.Add(SteamClient.SteamId, obj);
|
||
|
|
||
|
foreach (var friend in CurrentLobby.Members)
|
||
|
if (friend.Id != SteamClient.SteamId)
|
||
|
{
|
||
|
var obj2 = Instantiate(inLobbyFriend, content);
|
||
|
obj2.GetComponentInChildren<Text>().text = friend.Name;
|
||
|
obj2.GetComponentInChildren<RawImage>().texture =
|
||
|
await SteamFriendsManager.GetTextureFromSteamIdAsync(friend.Id);
|
||
|
|
||
|
inLobby.Add(friend.Id, obj2);
|
||
|
}
|
||
|
|
||
|
onLobbyJoined.Invoke();
|
||
|
}
|
||
|
|
||
|
|
||
|
public async void CreateLobbyAsync()
|
||
|
{
|
||
|
var result = await CreateLobby();
|
||
|
if (!result)
|
||
|
{
|
||
|
//Invoke a error message.
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static async Task<bool> CreateLobby()
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
var createLobbyOutput = await SteamMatchmaking.CreateLobbyAsync();
|
||
|
if (!createLobbyOutput.HasValue)
|
||
|
{
|
||
|
Debug.Log("Lobby created but not correctly instantiated.");
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
CurrentLobby = createLobbyOutput.Value;
|
||
|
|
||
|
CurrentLobby.SetPublic();
|
||
|
//currentLobby.SetPrivate();
|
||
|
CurrentLobby.SetJoinable(true);
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
catch (Exception exception)
|
||
|
{
|
||
|
Debug.Log("Failed to create multiplayer lobby : " + exception);
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void LeaveLobby()
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
UserInLobby = false;
|
||
|
CurrentLobby.Leave();
|
||
|
onLobbyLeave.Invoke();
|
||
|
foreach (var user in inLobby.Values) Destroy(user);
|
||
|
inLobby.Clear();
|
||
|
}
|
||
|
catch
|
||
|
{
|
||
|
}
|
||
|
}
|
||
|
}
|