Files
BABA_YAGA/Assets/Scripts/Duy/_BasicSpawner.cs

156 lines
6.2 KiB
C#
Raw Normal View History

2026-04-11 18:13:40 +07:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Fusion;
using Fusion.Sockets;
using UnityEngine;
2026-04-28 19:04:09 +07:00
namespace Hallucinate.UI
2026-04-11 18:13:40 +07:00
{
2026-04-28 19:04:09 +07:00
public class _BasicSpawner : MonoBehaviour, INetworkRunnerCallbacks
{
private NetworkRunner _runner { get; set; }
2026-04-11 18:13:40 +07:00
2026-04-28 19:04:09 +07:00
public event Action<List<SessionInfo>> OnSessionListUpdatedEvent;
public event Action<string> OnShutdownEvent;
public event Action OnJoinStartedEvent;
public event Action OnJoinFailedEvent;
2026-04-11 18:13:40 +07:00
2026-04-28 19:04:09 +07:00
private void Awake()
2026-04-11 18:13:40 +07:00
{
2026-04-28 19:04:09 +07:00
if (_runner == null) _runner = gameObject.AddComponent<NetworkRunner>();
DontDestroyOnLoad(gameObject);
2026-04-11 18:13:40 +07:00
}
2026-04-28 19:04:09 +07:00
public _PlayerProfile LocalPlayerProfile { get; private set; }
public void SetLocalPlayerProfile(_PlayerProfile _profile)
2026-04-11 18:13:40 +07:00
{
2026-04-28 19:04:09 +07:00
LocalPlayerProfile = _profile;
2026-04-11 18:13:40 +07:00
}
2026-04-28 19:04:09 +07:00
public async Task StartLobby()
2026-04-11 18:13:40 +07:00
{
2026-04-28 19:04:09 +07:00
if (_runner == null) _runner = gameObject.AddComponent<NetworkRunner>();
_runner.ProvideInput = true;
_runner.AddCallbacks(this);
var result = await _runner.JoinSessionLobby(SessionLobby.ClientServer);
if (!result.Ok) Debug.LogError($"Failed to join lobby: {result.ShutdownReason}");
2026-04-11 18:13:40 +07:00
}
2026-04-28 19:04:09 +07:00
public async Task StartHost(string sessionName, string password = null)
2026-04-11 18:13:40 +07:00
{
2026-04-28 19:04:09 +07:00
OnJoinStartedEvent?.Invoke();
// Sử dụng SessionProperties để lưu mật khẩu
var customProps = new Dictionary<string, SessionProperty>();
if (!string.IsNullOrEmpty(password))
{
customProps.Add("pw", password);
}
var result = await _runner.StartGame(new StartGameArgs()
{
GameMode = GameMode.Host,
SessionName = sessionName,
SessionProperties = customProps,
PlayerCount = 2,
SceneManager = gameObject.AddComponent<NetworkSceneManagerDefault>()
});
if (!result.Ok)
{
Debug.LogError($"Failed to start host: {result.ShutdownReason}");
OnJoinFailedEvent?.Invoke();
}
2026-04-11 18:13:40 +07:00
}
2026-04-28 19:04:09 +07:00
public async Task StartClient(string sessionName, string password = null)
2026-04-11 18:13:40 +07:00
{
2026-04-28 19:04:09 +07:00
OnJoinStartedEvent?.Invoke();
2026-04-11 18:13:40 +07:00
2026-04-28 19:04:09 +07:00
var result = await _runner.StartGame(new StartGameArgs()
{
GameMode = GameMode.Client,
SessionName = sessionName,
SceneManager = gameObject.AddComponent<NetworkSceneManagerDefault>()
});
2026-04-11 18:13:40 +07:00
2026-04-28 19:04:09 +07:00
if (!result.Ok)
{
Debug.LogError($"Failed to join client: {result.ShutdownReason}");
OnJoinFailedEvent?.Invoke();
}
}
2026-04-11 18:13:40 +07:00
2026-04-28 19:04:09 +07:00
[SerializeField] private NetworkPrefabRef _playerPrefab;
private Dictionary<PlayerRef, NetworkObject> _spawnedCharacters = new Dictionary<PlayerRef, NetworkObject>();
public void OnPlayerJoined(NetworkRunner runner, PlayerRef player)
{
2026-04-11 18:13:40 +07:00
if (runner.IsServer)
{
2026-04-28 19:04:09 +07:00
Vector2 spawnPosition = (player == runner.LocalPlayer) ? new Vector2(-8, 0) : new Vector2(8, 0);
var networkPlayerObject = runner.Spawn(_playerPrefab, spawnPosition, Quaternion.identity, player);
_spawnedCharacters.Add(player, networkPlayerObject);
}
2026-04-11 18:13:40 +07:00
2026-04-28 19:04:09 +07:00
if (player == runner.LocalPlayer)
{
var pdm = FindFirstObjectByType<_PlayerDataManager>();
if (pdm != null)
2026-04-11 18:13:40 +07:00
{
2026-04-28 19:04:09 +07:00
var metaData = new _PlayerMetaData()
{
Name = LocalPlayerProfile.Name,
Role = LocalPlayerProfile.Role,
};
pdm.RPC_UpdatePlayerMetaData(player, metaData);
2026-04-11 18:13:40 +07:00
}
2026-04-28 19:04:09 +07:00
}
2026-04-11 18:13:40 +07:00
}
2026-04-28 19:04:09 +07:00
public void OnPlayerLeft(NetworkRunner runner, PlayerRef player)
2026-04-11 18:13:40 +07:00
{
2026-04-28 19:04:09 +07:00
if (_spawnedCharacters.TryGetValue(player, out NetworkObject networkObject))
2026-04-11 18:13:40 +07:00
{
2026-04-28 19:04:09 +07:00
runner.Despawn(networkObject);
_spawnedCharacters.Remove(player);
if (runner.IsServer) runner.Shutdown();
}
2026-04-11 18:13:40 +07:00
}
2026-04-28 19:04:09 +07:00
public void OnShutdown(NetworkRunner runner, ShutdownReason shutdownReason)
2026-04-11 18:13:40 +07:00
{
2026-04-28 19:04:09 +07:00
OnShutdownEvent?.Invoke(shutdownReason.ToString());
2026-04-11 18:13:40 +07:00
}
2026-04-28 19:04:09 +07:00
public void OnSessionListUpdated(NetworkRunner runner, List<SessionInfo> sessionList)
2026-04-11 18:13:40 +07:00
{
2026-04-28 19:04:09 +07:00
OnSessionListUpdatedEvent?.Invoke(sessionList);
2026-04-11 18:13:40 +07:00
}
2026-04-28 19:04:09 +07:00
public void OnInput(NetworkRunner runner, NetworkInput input)
2026-04-11 18:13:40 +07:00
{
2026-04-28 19:04:09 +07:00
var data = new _PlayerInputData();
data.direction = Input.GetAxis("Vertical");
input.Set(data);
2026-04-11 18:13:40 +07:00
}
2026-04-23 08:56:35 +07:00
2026-04-28 19:04:09 +07:00
public void OnConnectedToServer(NetworkRunner runner) { }
public void OnDisconnectedFromServer(NetworkRunner runner, NetDisconnectReason reason) { }
public void OnConnectRequest(NetworkRunner runner, NetworkRunnerCallbackArgs.ConnectRequest request, byte[] token) { }
public void OnConnectFailed(NetworkRunner runner, NetAddress remoteAddress, NetConnectFailedReason reason) { }
public void OnUserSimulationMessage(NetworkRunner runner, SimulationMessagePtr message) { }
public void OnReliableDataReceived(NetworkRunner runner, PlayerRef player, ReliableKey key, ArraySegment<byte> data) { }
public void OnReliableDataProgress(NetworkRunner runner, PlayerRef player, ReliableKey key, float progress) { }
public void OnInputMissing(NetworkRunner runner, PlayerRef player, NetworkInput input) { }
public void OnObjectExitAOI(NetworkRunner runner, NetworkObject obj, PlayerRef player) { }
public void OnObjectEnterAOI(NetworkRunner runner, NetworkObject obj, PlayerRef player) { }
public void OnCustomAuthenticationResponse(NetworkRunner runner, Dictionary<string, object> data) { }
public void OnHostMigration(NetworkRunner runner, HostMigrationToken hostMigrationToken) { }
public void OnSceneLoadDone(NetworkRunner runner) { }
public void OnSceneLoadStart(NetworkRunner runner) { }
2026-04-23 08:56:35 +07:00
}
2026-04-11 18:13:40 +07:00
}