mirror of
https://github.com/DerTyp7/defrain-shooter-unity.git
synced 2025-10-30 13:07:10 +01:00
Merging retry
This commit is contained in:
158
Assets/Scripts/Lobby/Lobby.cs
Normal file
158
Assets/Scripts/Lobby/Lobby.cs
Normal file
@@ -0,0 +1,158 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
using Mirror;
|
||||
using TMPro;
|
||||
|
||||
|
||||
/* TODO:
|
||||
* - Changing Lobby Title Objects causes bugs on client
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* The Lobby will always be the "Room", where all Players are connected to.
|
||||
* In-Game AND in LobbyScene!
|
||||
* It manages the Players
|
||||
*/
|
||||
|
||||
public class Lobby : NetworkBehaviour
|
||||
{
|
||||
NetManagerScript networkManager;
|
||||
public bool isLobbyScene;
|
||||
|
||||
//Player Lists
|
||||
[SyncVar]
|
||||
public List<Player> Players = new List<Player>();
|
||||
[SyncVar]
|
||||
public List<LobbyPlayer> LobbyPlayers = new List<LobbyPlayer>(); // All player a register themselves when they join (LobbyPlayer.cs)
|
||||
|
||||
//Scene switch to in-game
|
||||
[SerializeField] GameObject GamePlayerPrefab;
|
||||
[SerializeField] [Scene] string gameScene;
|
||||
|
||||
//Lobby Scene
|
||||
[SyncVar(hook = "ChangeTitle")]
|
||||
[SerializeField] string lobbyTitle; // Title/Name of the Lobby; Can only be changed by the host, because of "AuthHost"
|
||||
|
||||
[SyncVar]
|
||||
public bool allReady = false; // All players are ready?
|
||||
|
||||
void Start()
|
||||
{
|
||||
DontDestroyOnLoad(this);
|
||||
networkManager = GameObject.Find("NetManager").GetComponent<NetManagerScript>();
|
||||
}
|
||||
|
||||
void Update()
|
||||
{
|
||||
if(SceneManager.GetActiveScene().name == "Lobby") // Check if we are in-game
|
||||
isLobbyScene = true;
|
||||
else
|
||||
isLobbyScene = false;
|
||||
|
||||
if (isLobbyScene)
|
||||
{
|
||||
CheckLobbyPlayers(); // Checking the LobbyPlayer List
|
||||
allReady = CheckAllReady(); // Continous checking if all player are ready
|
||||
}
|
||||
else
|
||||
{
|
||||
CheckPlayers();// Checking the Player List
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void ChangeToPlayer(LobbyPlayer lobbyPlayer) //Convert/Change the LobbyPlayer to a Player
|
||||
{
|
||||
Debug.Log("Change");
|
||||
var conn = lobbyPlayer.connectionToClient;
|
||||
var newPlayerInstance = Instantiate(GamePlayerPrefab);
|
||||
|
||||
//newPlayerInstance.GetComponent<Player>().username = player.username;
|
||||
|
||||
NetworkServer.Destroy(conn.identity.gameObject);
|
||||
|
||||
NetworkServer.ReplacePlayerForConnection(conn, newPlayerInstance.gameObject);
|
||||
LobbyPlayers.Remove(lobbyPlayer);
|
||||
Players.Add(newPlayerInstance.gameObject.GetComponent<Player>());
|
||||
}
|
||||
|
||||
|
||||
|
||||
void CheckPlayers()
|
||||
{
|
||||
foreach (Player player in Players)
|
||||
{
|
||||
if (player == null)
|
||||
{
|
||||
Players.Remove(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#region InLobbyScene
|
||||
public void StartGame() // initializes the In-Game Scene
|
||||
{
|
||||
networkManager.ServerChangeScene(gameScene);
|
||||
}
|
||||
|
||||
public bool AuthHost(LobbyPlayer player) // Checks if player is the host
|
||||
{
|
||||
// In theory the host should always be the first connected player, which means he is index 0 in the LobbyPlayers-List
|
||||
if (LobbyPlayers.IndexOf(player) == 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void SetTitle(LobbyPlayer player, string text) // the host can set the LobbyTitle
|
||||
{
|
||||
if (AuthHost(player))
|
||||
{
|
||||
lobbyTitle = text;
|
||||
}
|
||||
}
|
||||
|
||||
public void RegisterLobbyPlayer(LobbyPlayer player) // Where a LobbyPlayer can register himself
|
||||
{
|
||||
LobbyPlayers.Add(player);
|
||||
}
|
||||
public void UnregisterLobbyPlayer(LobbyPlayer player) // Where a LobbyPlayer can unregister himself
|
||||
{
|
||||
LobbyPlayers.Remove(player);
|
||||
}
|
||||
|
||||
/* Checks */
|
||||
bool CheckAllReady() // Checks if all players are ready
|
||||
{
|
||||
// Check if all players are ready (if a player is not ready)
|
||||
foreach (LobbyPlayer player in LobbyPlayers)
|
||||
{
|
||||
if (!player.ready)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void CheckLobbyPlayers() // Checks if all LobbyPlayers in the list are still connected (having a GameObject) -> Clears missing players
|
||||
{
|
||||
foreach(LobbyPlayer player in LobbyPlayers)
|
||||
{
|
||||
if (player == null)
|
||||
{
|
||||
LobbyPlayers.Remove(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* HOOKS */
|
||||
void ChangeTitle(string oldTitle, string newTitle) // Changes the Title Object
|
||||
{
|
||||
GameObject.Find("title").GetComponent<TextMeshProUGUI>().text = newTitle;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
Reference in New Issue
Block a user