Characters

This commit is contained in:
2025-10-05 18:21:16 +02:00
parent b52b3aa830
commit 174a399ee7
77 changed files with 14406 additions and 0 deletions

View File

@@ -0,0 +1,165 @@
using System;
using System.Collections.Generic;
using Steamworks;
using UnityEngine;
namespace MegaKoop.Game.Networking
{
/// <summary>
/// High level orchestrator for Steam lobby + P2P messaging. Keeps track of handlers per message type.
/// </summary>
[DisallowMultipleComponent]
public class SteamCoopNetworkManager : MonoBehaviour
{
public static SteamCoopNetworkManager Instance { get; private set; }
[SerializeField] private SteamLobbyManager lobbyManager;
[SerializeField] private SteamP2PTransport p2pTransport;
private readonly Dictionary<NetworkMessageType, Action<NetworkMessage>> handlers = new();
private bool isHost;
private bool isConnected;
public bool IsHost => isHost;
public bool IsConnected => isConnected;
public CSteamID ActiveLobby => lobbyManager != null ? lobbyManager.GetActiveLobby() : CSteamID.Nil;
private void Awake()
{
if (Instance != null)
{
Destroy(gameObject);
return;
}
Instance = this;
DontDestroyOnLoad(gameObject);
if (lobbyManager == null)
{
lobbyManager = GetComponentInChildren<SteamLobbyManager>();
}
if (p2pTransport == null)
{
p2pTransport = GetComponentInChildren<SteamP2PTransport>();
}
if (lobbyManager != null)
{
lobbyManager.LobbyCreated += HandleLobbyCreated;
lobbyManager.LobbyJoined += HandleLobbyJoined;
lobbyManager.LobbyMemberJoined += HandleLobbyMemberJoined;
lobbyManager.LobbyMemberLeft += HandleLobbyMemberLeft;
}
if (p2pTransport != null)
{
p2pTransport.MessageReceived += DispatchMessage;
}
}
private void OnDestroy()
{
if (Instance == this)
{
Instance = null;
}
if (lobbyManager != null)
{
lobbyManager.LobbyCreated -= HandleLobbyCreated;
lobbyManager.LobbyJoined -= HandleLobbyJoined;
lobbyManager.LobbyMemberJoined -= HandleLobbyMemberJoined;
lobbyManager.LobbyMemberLeft -= HandleLobbyMemberLeft;
}
if (p2pTransport != null)
{
p2pTransport.MessageReceived -= DispatchMessage;
}
}
public void RegisterHandler(NetworkMessageType type, Action<NetworkMessage> handler)
{
if (handlers.TryGetValue(type, out Action<NetworkMessage> existing))
{
existing += handler;
handlers[type] = existing;
}
else
{
handlers[type] = handler;
}
}
public void UnregisterHandler(NetworkMessageType type, Action<NetworkMessage> handler)
{
if (!handlers.TryGetValue(type, out Action<NetworkMessage> existing))
{
return;
}
existing -= handler;
if (existing == null)
{
handlers.Remove(type);
}
else
{
handlers[type] = existing;
}
}
public void SendToAll(NetworkMessageType type, byte[] payload, EP2PSend sendType = EP2PSend.k_EP2PSendReliable)
{
p2pTransport?.Broadcast(type, payload, sendType);
}
public void SendToPlayer(CSteamID target, NetworkMessageType type, byte[] payload, EP2PSend sendType = EP2PSend.k_EP2PSendReliable)
{
p2pTransport?.Send(target, type, payload, sendType);
}
private void DispatchMessage(NetworkMessage message)
{
if (handlers.TryGetValue(message.Type, out Action<NetworkMessage> handler))
{
handler?.Invoke(message);
}
}
private void HandleLobbyCreated(CSteamID lobbyId)
{
isHost = true;
isConnected = true;
p2pTransport?.SetActiveLobby(lobbyId);
}
private void HandleLobbyJoined(CSteamID lobbyId)
{
isConnected = true;
p2pTransport?.SetActiveLobby(lobbyId);
string ownerId = SteamMatchmaking.GetLobbyData(lobbyId, "owner");
if (!string.IsNullOrEmpty(ownerId) && ulong.TryParse(ownerId, out ulong ownerSteamId))
{
isHost = ownerSteamId == SteamUser.GetSteamID().m_SteamID;
}
else
{
isHost = SteamMatchmaking.GetLobbyOwner(lobbyId) == SteamUser.GetSteamID();
}
}
private void HandleLobbyMemberJoined(CSteamID member)
{
Debug.Log("[SteamCoopNetworkManager] Member joined: " + member);
}
private void HandleLobbyMemberLeft(CSteamID member)
{
Debug.Log("[SteamCoopNetworkManager] Member left: " + member);
}
}
}