evershade/Assets/Scripts/SceneLoader.cs

213 lines
7.3 KiB
C#

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
{
[SerializeField] private string sceneName;
[SerializeField] private Vector3 spawnPosition;
private static Dictionary<int, string> playerScenes = new Dictionary<int, string>();
private int _stackedSceneHandle;
private void Awake()
{
}
private void Start()
{
InstanceFinder.SceneManager.OnLoadEnd += SceneManager_OnLoadEnd;
}
private void OnDestroy()
{
if (InstanceFinder.SceneManager != null)
InstanceFinder.SceneManager.OnLoadEnd -= SceneManager_OnLoadEnd;
}
private void OnTriggerEnter(Collider other)
{
var nob = other.GetComponent<NetworkObject>();
// Debug.Log("Player with clientID " + other.gameObject.GetInstanceID() + " entered trigger");
var otherConnection = other.GetComponent<NetworkObject>().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");
LoadSceneServerRpc(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;
}
[ServerRpc(RequireOwnership = false)]
private void LoadSceneServerRpc(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);
// 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<Camera>();
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;
}
}