using System.Collections.Generic; using FishNet; using FishNet.Connection; using FishNet.Managing.Scened; using FishNet.Object; using Managers; using UnityEngine; using UnityEngine.EventSystems; public class SceneLoader : NetworkBehaviour, IPointerClickHandler { private static Dictionary playerScenes = new(); [SerializeField] private string sceneName; [SerializeField] private Vector3 spawnPosition; private int _stackedSceneHandle; private void Awake() { // InstanceFinder.NetworkManager.SceneManager.AddOwnerToDefaultScene(GetComponent()); } private void Start() { InstanceFinder.SceneManager.OnLoadEnd += SceneManager_OnLoadEnd; } private void OnDestroy() { if (InstanceFinder.SceneManager != null) InstanceFinder.SceneManager.OnLoadEnd -= SceneManager_OnLoadEnd; } private void OnCollisionEnter(Collision collision) { Debug.Log("OnCollisionEnter triggered"); } private void OnTriggerEnter2D(Collider2D other) { Debug.Log("OnTriggerEnter triggered"); if (!IsServerInitialized) return; Debug.Log("On Trigger ENTEREED"); var nob = other.gameObject.GetComponent(); // Debug.Log("Player with clientID " + other.gameObject.GetInstanceID() + " entered trigger"); var otherConnection = other.GetComponent().Owner; Debug.Log("Player with clientID " + otherConnection.ClientId + " entered trigger"); if (nob != null) LoadScene(InstanceFinder.ClientManager.Connection.ClientId); } public void OnPointerClick(PointerEventData eventData) { /*if (!IsOwner) { Debug.Log("Not local player owner, not loading scene"); return; }*/ Debug.Log("Clicked scene loader"); var clientId = InstanceFinder.ClientManager.Connection.ClientId; Debug.Log("Player with clientID " + clientId + " clicked scene loader"); LoadScene(clientId); } private void SceneManager_OnLoadEnd(SceneLoadEndEventArgs data) { if (!data.QueueData.AsServer) return; if (_stackedSceneHandle != 0) return; if (data.LoadedScenes.Length > 0) _stackedSceneHandle = data.LoadedScenes[0].handle; } public override void OnStartServer() { Debug.Log("SceneLoader OnStartServer"); base.OnStartServer(); // var networkObject = GetComponent(); // if (networkObject != null) networkObject.GiveOwnership(NetworkManager.ServerManager.Clients[0]); } [ServerRpc(RequireOwnership = false)] private void LoadScene(int clientId) { Debug.Log("Loading scene"); var sceneLoadData = new SceneLoadData(SceneLookupData.CreateData(sceneName)); sceneLoadData.ReplaceScenes = ReplaceOption.All; sceneLoadData.Options.AllowStacking = false; InstanceFinder.SceneManager.LoadConnectionScenes(InstanceFinder.ClientManager.Connection, sceneLoadData); InstanceFinder.SceneManager.UnloadConnectionScenes(InstanceFinder.ClientManager.Connection, new SceneUnloadData("StartMenu")); // Debug.Log("Moving player to spawn position for clientId" + clientId); // MovePlayerToSpawnPositionServerRpc(clientId); // StartCoroutine(MovePlayerToSpawnPosition(clientId)); var player = PlayerManager.GetPlayerManager(clientId).GetPlayerGo(); var playerCamera = PlayerManager.GetPlayerManager(clientId).GetPlayerCamera(); // get players network object if (player == null) { Debug.LogError("Player is null, can not move player to spawn position"); return; } Debug.Log("Moving player to spawn position: " + spawnPosition); player.transform.position = spawnPosition; playerCamera.gameObject.SetActive(true); // if (Camera.main != null) Camera.main.gameObject.SetActive(false); // playerCamera.gameObject.SetActive(true); UpdatePlayerPositionObserversRpc(player.gameObject.GetInstanceID(), spawnPosition); // SetupPlayerCameraObserversRpc(clientId); } [ObserversRpc] private void SetupPlayerCameraObserversRpc(int clientId) { var playerManager = PlayerManager.GetPlayerManager(clientId); if (playerManager == null) return; var playerGo = playerManager.GetPlayerGo(); if (playerGo == null) return; var camera = playerGo.GetComponentInChildren(); if (camera == null) return; // enable camera only for the local playerf if (playerManager.IsOwner) { camera.enabled = true; Camera.main.gameObject.SetActive(false); camera.tag = "MainCamera"; } else { camera.enabled = false; } playerManager.SetupCamera(); } // [ServerRpc(RequireOwnership = false)] // private void MovePlayerToSpawnPositionServerRpc(int clientId) // { // Debug.Log("Preparing to move player to spawn position (SERVERRPC) for clientId " + clientId); // StartCoroutine(MovePlayerToSpawnPosition(clientId)); // } // private IEnumerator MovePlayerToSpawnPosition(int clientId) // { // // yield return new WaitForEndOfFrame(); // // wait until the scence is finished loading // // yield return new WaitUntil(() => InstanceFinder.SceneManager // yield return new WaitForSeconds(0.5f); // Wait a short time to ensure everything is set up // // var player = PlayerManager.GetPlayerManager(clientId).GetPlayerGo(); // // get players network object // // if (player == null) // { // Debug.LogError("Player is null, can not move player to spawn position"); // yield return null; // } // // if (player != null) // { // Debug.Log("Moving player to spawn position: " + spawnPosition); // player.transform.position = spawnPosition; // // UpdatePlayerPositionObserversRpc(player.gameObject.GetInstanceID(), spawnPosition); // } // } // Get all scenes loaded for this connection [ServerRpc(RequireOwnership = false)] private void UnloadPreviousSceneServerRpc(NetworkConnection connection, string newSceneName) { var sceneConnections = InstanceFinder.SceneManager.SceneConnections; foreach (var kvp in sceneConnections) { var scene = kvp.Key; var connections = kvp.Value; // Check if this scene is loaded for the current connection if (connections.Contains(connection)) // Unload all scenes except the new one and any persistent scenes /*if (scene.name != newSceneName && !scene.name.Equals("PersistentScene")) { var unloadSceneData = new SceneUnloadData(scene.name); InstanceFinder.SceneManager.UnloadConnectionScenes(connection, unloadSceneData); }*/ // unload scenes where no players are connected if (scene.name != newSceneName) { var unloadSceneData = new SceneUnloadData(scene.name); InstanceFinder.SceneManager.UnloadConnectionScenes(connection, unloadSceneData); } } } [ObserversRpc] private void UpdatePlayerPositionObserversRpc(int playerObjectId, Vector3 position) { // var player = InstanceFinder.ClientManager.Objects.Spawned[playerObjectId]; if (InstanceFinder.ClientManager.Objects.Spawned.TryGetValue(playerObjectId, out var playerObject)) playerObject.transform.position = position; else Debug.LogWarning("Player not found"); } public void UnloadScene() { // if (_stackedScenceHandle == 0) // return; // InstanceFinder.SceneManager.UnloadScene(_stackedScenceHandle); // _stackedScenceHandle = 0; } }