Skip to content

Commit

Permalink
Lobby now can start game
Browse files Browse the repository at this point in the history
  • Loading branch information
LeonNikolai committed Dec 15, 2023
1 parent bdd0e73 commit 10ece37
Show file tree
Hide file tree
Showing 4 changed files with 184 additions and 73 deletions.
22 changes: 6 additions & 16 deletions Assets/Prefabs/MainMenu/Lobby Panel.prefab
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ MonoBehaviour:
m_HandleRect: {fileID: 3719022964703372218}
m_Direction: 0
m_Value: 0
m_Size: 0.9999999
m_Size: 1
m_NumberOfSteps: 0
m_OnValueChanged:
m_PersistentCalls:
Expand Down Expand Up @@ -357,19 +357,7 @@ MonoBehaviour:
m_TargetGraphic: {fileID: 7587524342438034078}
m_OnClick:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 0}
m_TargetAssemblyTypeName: SimpleController, Assembly-CSharp
m_MethodName: StartHost
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
m_Calls: []
--- !u!1 &1556768034155176302
GameObject:
m_ObjectHideFlags: 0
Expand Down Expand Up @@ -571,6 +559,8 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
LobbyCode: {fileID: 1694344644689806722}
JoinHostButton: {fileID: 3753036814003351734}
JoinHostButtonEvent: {fileID: 3083061545130787484}
LobbyPlayerPrefab: {fileID: 5124536854151712051, guid: 4cd1b238a4cf7854e95a132b22c8fd36, type: 3}
LobbyPlayerList: {fileID: 3940492800073087821}
--- !u!1 &3525120194205830878
Expand Down Expand Up @@ -606,7 +596,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0.000039100647, y: 3.2882855}
m_AnchoredPosition: {x: 0.000039100647, y: 0.00015776389}
m_SizeDelta: {x: 0, y: 300}
m_Pivot: {x: 0, y: 1}
--- !u!114 &2905229026941279225
Expand Down Expand Up @@ -890,7 +880,7 @@ MonoBehaviour:
m_HandleRect: {fileID: 3655414003106839415}
m_Direction: 2
m_Value: 0
m_Size: 0.37888187
m_Size: 1
m_NumberOfSteps: 0
m_OnValueChanged:
m_PersistentCalls:
Expand Down
56 changes: 11 additions & 45 deletions Assets/_Scripts/Services/LobbyManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,48 +25,23 @@ public static async Task<Lobby> CreateLobby(bool IsPrivate)
string lobbyName = "new lobby";
int maxPlayers = 4;
CreateLobbyOptions options = new CreateLobbyOptions();
// await RelayManager.CreateRelay(true);
// options.Data = new Dictionary<string, DataObject>()
// {
// {
// "RelayCode", new DataObject(
// visibility: DataObject.VisibilityOptions.Member,
// value: RelayManager.JoinCode,
// index: DataObject.IndexOptions.S1)
// },
// {
// "HasStarted", new DataObject(
// visibility: DataObject.VisibilityOptions.Member,
// value: "false",
// index: DataObject.IndexOptions.S1)
// },
// };

options.Data = new Dictionary<string, DataObject>()
{
{
"RelayCode", new DataObject(
visibility: DataObject.VisibilityOptions.Member,
value: "",
index: DataObject.IndexOptions.S1)
}
};
options.IsPrivate = IsPrivate;
Lobby lobby = await LobbyService.Instance.CreateLobbyAsync(lobbyName, maxPlayers, options);
Debug.Log($"Created lobby {lobby.Id} with code {lobby.LobbyCode} and host {lobby.HostId}");

Instance.StartCoroutine(HeartbeatLobbyCoroutine(lobby.Id, 15));
return lobby;
}

static IEnumerator HeartbeatLobbyCoroutine(string lobbyId, float waitTimeSeconds)
{
var delay = new WaitForSecondsRealtime(waitTimeSeconds);

while (true)
{
try
{
LobbyService.Instance.SendHeartbeatPingAsync(lobbyId);
}
catch (LobbyServiceException e)
{
Debug.Log(e);
break;
}
yield return delay;
}
}
public static async Task<Lobby> JoinLobby(string lobbyCode)
{
Lobby lobby = await LobbyService.Instance.JoinLobbyByCodeAsync(lobbyCode);
Expand All @@ -83,7 +58,6 @@ public static async Task<Lobby> Reconnect(string lobbyID)
Lobby lobby = await LobbyService.Instance.ReconnectToLobbyAsync(lobbyID);
if (lobby.HostId == AuthenticationService.Instance.PlayerId)
{
Instance.StartCoroutine(HeartbeatLobbyCoroutine(lobby.Id, 15));
}
if (lobby == null)
{
Expand All @@ -100,15 +74,7 @@ public static async Task<Lobby> QuickJoin()
try
{
// Quick-join a random lobby with a maximum capacity of 10 or more players.
QuickJoinLobbyOptions options = new QuickJoinLobbyOptions();
options.Filter = new List<QueryFilter>()
{
new QueryFilter(
field: QueryFilter.FieldOptions.MaxPlayers,
op: QueryFilter.OpOptions.GE,
value: "10")
};
Lobby lobby = await LobbyService.Instance.QuickJoinLobbyAsync(options);
Lobby lobby = await LobbyService.Instance.QuickJoinLobbyAsync();
return lobby;
}
catch (LobbyServiceException e)
Expand Down
11 changes: 11 additions & 0 deletions Assets/_Scripts/UI/LoadingScreenController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,23 @@ public class LoadingScreenController : MonoBehaviour
public async void StartHost()
{
await RelayManager.CreateRelay(true);
StartHostInternal();
}
public void StartHostInternal()
{
NetworkManager.Singleton.StartHost();
NetworkManager.Singleton.SceneManager.PostSynchronizationSceneUnloading = true;
NetworkManager.Singleton.SceneManager.SetClientSynchronizationMode(LoadSceneMode.Single);
NetworkManager.Singleton.SceneManager.ActiveSceneSynchronizationEnabled = true;
NetworkManager.Singleton.SceneManager.LoadScene(mapRef.Name, LoadSceneMode.Single);
}
public void StartClientInternal()
{
NetworkManager.Singleton.StartClient();
NetworkManager.Singleton.SceneManager.SetClientSynchronizationMode(LoadSceneMode.Single);
NetworkManager.Singleton.SceneManager.PostSynchronizationSceneUnloading = true;
NetworkManager.Singleton.SceneManager.ActiveSceneSynchronizationEnabled = true;
}

public async void StartClient()
{
Expand Down
168 changes: 156 additions & 12 deletions Assets/_Scripts/UI/LobbyInstance.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Net.Security;
using System.Threading.Tasks;
using TMPro;
using Unity.Services.Authentication;
using Unity.Services.Lobbies;
using Unity.Services.Lobbies.Models;
using UnityEngine;
using UnityEngine.UI;


// This class is used to render a lobby in the UI and handle all the lobby events
Expand All @@ -14,41 +17,154 @@ public class LobbyInstance : MonoBehaviour
public Lobby Lobby { get; set; }
[SerializeField] private TMP_Text LobbyCode;
[SerializeField] private TMP_Text JoinHostButton;

[SerializeField] private Button JoinHostButtonEvent;
[SerializeField] private GameObject LobbyPlayerPrefab;
[SerializeField] private Transform LobbyPlayerList;
private LobbyEventCallbacks callbacks = new LobbyEventCallbacks();
private LobbyEventCallbacks callbacks;
public string RelayCode { get; set; }
public bool HasStarted { get; set; }

private IEnumerator Start()
{
while (true)
{
yield return new WaitForSecondsRealtime(2f);
if (Lobby == null) continue;
// if (Lobby.HostId == AuthenticationService.Instance.PlayerId) HandleHearthBeat();
HandlePolling();
}
}
async void HandlePolling()
{
if (Lobby == null) return;
try
{
Lobby = await LobbyService.Instance.GetLobbyAsync(Lobby.Id);
RelayCode = Lobby.Data.TryGetValue("RelayCode", out var relayCode) ? relayCode.Value : "";
Debug.Log($"Lobby {Lobby.Id} has {Lobby.Players.Count} players and relay code {RelayCode}");
StartClient();
}
catch (LobbyServiceException e)
{
Debug.Log(e);
}
}
async void HandleHearthBeat()
{
await LobbyService.Instance.SendHeartbeatPingAsync(Lobby.Id);
}
public async void SetLobbyData(Lobby lobby)
{
Lobby = lobby;
LobbyCode.text = lobby.LobbyCode;
// RelayCode = lobby.Data["RelayCode"].Value;
await Lobbies.Instance.SubscribeToLobbyEventsAsync(lobby.Id, callbacks);
callbacks = new LobbyEventCallbacks();
callbacks.LobbyDeleted += CallbacksOnLobbyDeleted;
callbacks.LobbyChanged += CallbacksOnLobbyChanged;
callbacks.KickedFromLobby += CallbacksOnLobbyDeleted;
callbacks.PlayerJoined += CallbacksOnPlayerJoined;
callbacks.DataChanged += CallbacksOnLobbyDataChanged;
callbacks.PlayerLeft += CallbacksOnPlayerLeft;


try
{
await Lobbies.Instance.SubscribeToLobbyEventsAsync(lobby.Id, callbacks);
}
catch (LobbyServiceException ex)
{
switch (ex.Reason)
{
case LobbyExceptionReason.AlreadySubscribedToLobby: Debug.LogWarning($"Already subscribed to lobby[{Lobby.Id}]. We did not need to try and subscribe again. Exception Message: {ex.Message}"); break;
case LobbyExceptionReason.SubscriptionToLobbyLostWhileBusy: Debug.LogError($"Subscription to lobby events was lost while it was busy trying to subscribe. Exception Message: {ex.Message}"); throw;
case LobbyExceptionReason.LobbyEventServiceConnectionError: Debug.LogError($"Failed to connect to lobby events. Exception Message: {ex.Message}"); throw;
default: throw;
}
}
RenderPlayerList();

if (lobby.HostId == AuthenticationService.Instance.PlayerId)
{
JoinHostButton.text = "Start Game";
JoinHostButtonEvent.onClick.AddListener(async () =>
{
try
{
await RelayManager.CreateRelay(true);
UpdateLobbyOptions options = new UpdateLobbyOptions
{
HostId = AuthenticationService.Instance.PlayerId,
Data = new Dictionary<string, DataObject>()
{
{
"RelayCode", new DataObject(
visibility: DataObject.VisibilityOptions.Member,
value: RelayManager.JoinCode,
index: DataObject.IndexOptions.S1)
}
}
};
try
{
await LobbyService.Instance.UpdateLobbyAsync(Lobby.Id, options);
}
catch (LobbyServiceException e)
{
Debug.Log(e);
return;
}
FindFirstObjectByType<LoadingScreenController>()?.StartHostInternal();
}
catch (Exception e)
{
Debug.Log(e);
}
});
}
else
{
JoinHostButton.text = "Leave Lobby";
JoinHostButtonEvent.onClick.AddListener(() =>
{
Debug.Log("Leave Lobby");
LobbyService.Instance.RemovePlayerAsync(Lobby.Id, AuthenticationService.Instance.PlayerId);
});
}

RelayCode = Lobby.Data.TryGetValue("RelayCode", out var relayCode) ? relayCode.Value : "";
StartClient();
}

private void CallbacksOnPlayerLeft(List<int> list)
{
RenderPlayerList();
}

private void CallbacksOnLobbyDataChanged(Dictionary<string, ChangedOrRemovedLobbyValue<DataObject>> dictionary)
bool hasStartedClient = false;
public async void StartClient()
{
RelayCode = Lobby.Data["RelayCode"].Value;
HasStarted = Lobby.Data["HasStarted"].Value == "true" ? true : false;
Debug.Log("Data changed");
if (HasStarted)
if (hasStartedClient || string.IsNullOrEmpty(RelayCode))
{
Debug.Log("Game has started");
return;
}
try
{
await RelayManager.JoinRelay(RelayCode);
Debug.Log("Joined Relay");
}
catch (Exception e) { return; }
hasStartedClient = true;
Debug.Log("Trying to Starting Client");
FindFirstObjectByType<LoadingScreenController>()?.StartClientInternal();
}
private async void CallbacksOnLobbyDataChanged(Dictionary<string, ChangedOrRemovedLobbyValue<DataObject>> dictionary)
{
if (dictionary.TryGetValue("RelayCode", out var relayCode))
{
Debug.Log("RelayCode changed (DataChanged)" + relayCode.Value.Value);
// extract data
string code = relayCode.Value.Value;
RelayCode = code;

}
}

Expand All @@ -60,6 +176,9 @@ private void OnDisable()
callbacks.KickedFromLobby -= CallbacksOnLobbyDeleted;
callbacks.LobbyChanged -= CallbacksOnLobbyChanged;
callbacks.PlayerJoined -= CallbacksOnPlayerJoined;
callbacks.DataChanged -= CallbacksOnLobbyDataChanged;
callbacks.DataAdded -= CallbacksOnLobbyDataChanged;
callbacks.PlayerLeft -= CallbacksOnPlayerLeft;
}
}
private void CallbacksOnLobbyDeleted()
Expand Down Expand Up @@ -94,8 +213,33 @@ private void CallbacksOnPlayerJoined(List<LobbyPlayerJoined> list)
});
}

private void CallbacksOnLobbyChanged(ILobbyChanges changes)
private async void CallbacksOnLobbyChanged(ILobbyChanges changes)
{
if (changes.LobbyDeleted)
{
CallbacksOnLobbyDeleted();
return;
}
if (AuthenticationService.Instance.PlayerId == Lobby.HostId)
{
RenderPlayerList();
return;
}

if (changes.Data.Value.TryGetValue("RelayCode", out var relayCode))
{
Debug.Log("RelayCode changed (LobbyChanged)" + relayCode.Value.Value);
// extract data
string code = relayCode.Value.Value;
if (string.IsNullOrEmpty(code))
{
Debug.Log("RelayCode is empty");
return;
}
RelayCode = code;
await RelayManager.JoinRelay(RelayCode);
FindFirstObjectByType<LoadingScreenController>()?.StartClient();
}
RenderPlayerList();
}

Expand Down

0 comments on commit 10ece37

Please sign in to comment.