using Mirror; using Steamworks; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.UI; [System.Serializable] public class Lobby { public CSteamID lobbyID; public string name; public Lobby(CSteamID lobbyID, string name) { this.lobbyID = lobbyID; this.name = name; } } public class SteamLobby : MonoBehaviour { private const string HOST_ADDRESS_KEY = "HostAddress"; public static SteamLobby instance; public static CSteamID LobbyID; public List allLobbies = new List(); //CallBacks protected Callback lobbyCreated; protected Callback joinRequested; protected Callback lobbyEntered; protected Callback lobbyMatchList; private void Awake() { if (instance == null) instance = this; lobbyMatchList = Callback.Create(OnLobbyMatchList); } private void Start() { if (!SteamManager.Initialized) return; lobbyCreated = Callback.Create(OnLobbyCreated); joinRequested = Callback.Create(OnJoinRequest); lobbyEntered = Callback.Create(OnLobbyEntered); ReloadLobbyList(); } #region Steam Lobby public void ReloadLobbyList() { allLobbies.Clear(); SteamMatchmaking.AddRequestLobbyListDistanceFilter(ELobbyDistanceFilter.k_ELobbyDistanceFilterWorldwide); SteamMatchmaking.AddRequestLobbyListStringFilter("displayable", "true", ELobbyComparison.k_ELobbyComparisonEqual); SteamMatchmaking.RequestLobbyList(); } void OnLobbyMatchList(LobbyMatchList_t param) { for (int i = 0; i < param.m_nLobbiesMatching; i++) { CSteamID lobbyID = SteamMatchmaking.GetLobbyByIndex(i); CSteamID ownerID = SteamMatchmaking.GetLobbyOwner(lobbyID); allLobbies.Add(new Lobby(lobbyID, SteamMatchmaking.GetLobbyData(lobbyID, "name"))); } allLobbies.Sort((a, b) => SteamMatchmaking.GetNumLobbyMembers(b.lobbyID).CompareTo(SteamMatchmaking.GetNumLobbyMembers(a.lobbyID))); /*for (int i = 0; i < allLobbies.Count; i++) { if (SteamMatchmaking.GetLobbyData(allLobbies[i].lobbyID, "displayable") == "true") { var lobbyElement = Instantiate(MainMenu.instance.lobbyElementPrefab, MainMenu.instance.lobbyListContainer).GetComponent(); lobbyElement.Initialize(allLobbies[i]); allLobbies[i].listElement = lobbyElement.gameObject; } }*/ } public void CreateLobby() { SteamMatchmaking.CreateLobby(ELobbyType.k_ELobbyTypePublic, ((MyNetworkManager)NetworkManager.singleton).maxConnections); } public void JoinLobby(CSteamID lobby) { SteamMatchmaking.JoinLobby(lobby); } private void OnLobbyCreated(LobbyCreated_t callback) { if (callback.m_eResult != EResult.k_EResultOK) { return; } string lobbyName = SteamFriends.GetFriendPersonaName(SteamUser.GetSteamID()); LobbyID = new CSteamID(callback.m_ulSteamIDLobby); ((MyNetworkManager)NetworkManager.singleton).StartHost(); SteamMatchmaking.SetLobbyData(LobbyID, HOST_ADDRESS_KEY, SteamUser.GetSteamID().ToString()); SteamMatchmaking.SetLobbyData(LobbyID, "name", lobbyName); SteamMatchmaking.SetLobbyData(LobbyID, "displayable", "true"); SetLobbyLocation(); } private void OnJoinRequest(GameLobbyJoinRequested_t callback) { PopupManager.instance.Popup_Show("Joining Party"); SteamMatchmaking.JoinLobby(callback.m_steamIDLobby); } private void OnLobbyEntered(LobbyEnter_t callback) { //if lobby full leave if (callback.m_bLocked) { SteamMatchmaking.LeaveLobby((CSteamID)callback.m_ulSteamIDLobby); PopupManager.instance.Popup_Close(); return; } Debug.Log($"Entered Lobby {LobbyID}"); LobbyID = new CSteamID(callback.m_ulSteamIDLobby); if (NetworkServer.active) return; ((MyNetworkManager)NetworkManager.singleton).SetMultiplayer(true); ((MyNetworkManager)NetworkManager.singleton).networkAddress = SteamMatchmaking.GetLobbyData(new CSteamID(LobbyID.m_SteamID), HOST_ADDRESS_KEY); ((MyNetworkManager)NetworkManager.singleton).StartClient(); } #endregion public void Leave() { SteamMatchmaking.LeaveLobby(LobbyID); } public static void SetLobbyLocation() { SteamNetworkingUtils.GetLocalPingLocation(out SteamNetworkPingLocation_t pingLocation); SteamNetworkingUtils.ConvertPingLocationToString(ref pingLocation, out string result, 1024); SteamMatchmaking.SetLobbyData(LobbyID, "location", result); } public void FindMatch() { StartCoroutine(FindMatchRoutine()); } IEnumerator FindMatchRoutine() { PopupManager.instance.Popup_Show("Finding Match.."); bool foundMatch = false; while (!foundMatch) { ReloadLobbyList(); yield return new WaitForSeconds(1); foreach (var lobby in allLobbies) { if (SteamMatchmaking.GetNumLobbyMembers(lobby.lobbyID) < NetworkManager.singleton.maxConnections) { JoinLobby(lobby.lobbyID); foundMatch = true; } } } PopupManager.instance.Popup_Close(); } }