-
Notifications
You must be signed in to change notification settings - Fork 539
/
Copy pathPlayerServerCharacter.cs
90 lines (82 loc) · 3.43 KB
/
PlayerServerCharacter.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
using System;
using System.Collections.Generic;
using Unity.BossRoom.ConnectionManagement;
using Unity.Multiplayer.Samples.BossRoom;
using Unity.Netcode;
using UnityEngine;
namespace Unity.BossRoom.Gameplay.GameplayObjects.Character
{
/// <summary>
/// Attached to the player-characters' prefab, this maintains a list of active ServerCharacter objects for players.
/// </summary>
/// <remarks>
/// This is an optimization. In server code you can already get a list of players' ServerCharacters by
/// iterating over the active connections and calling GetComponent() on their PlayerObject. But we need
/// to iterate over all players quite often -- the monsters' IdleAIState does so in every Update() --
/// and all those GetComponent() calls add up! So this optimization lets us iterate without calling
/// GetComponent(). This will be refactored with a ScriptableObject-based approach on player collection.
/// </remarks>
[RequireComponent(typeof(ServerCharacter))]
public class PlayerServerCharacter : NetworkBehaviour
{
static List<ServerCharacter> s_ActivePlayers = new List<ServerCharacter>();
[SerializeField]
ServerCharacter m_CachedServerCharacter;
public override void OnNetworkSpawn()
{
if (IsServer)
{
s_ActivePlayers.Add(m_CachedServerCharacter);
}
else
{
enabled = false;
}
}
void OnDisable()
{
s_ActivePlayers.Remove(m_CachedServerCharacter);
}
public override void OnNetworkDespawn()
{
if (IsServer)
{
var movementTransform = m_CachedServerCharacter.Movement.transform;
SessionPlayerData? sessionPlayerData = SessionManager<SessionPlayerData>.Instance.GetPlayerData(OwnerClientId);
if (sessionPlayerData.HasValue)
{
var playerData = sessionPlayerData.Value;
playerData.PlayerPosition = movementTransform.position;
playerData.PlayerRotation = movementTransform.rotation;
playerData.CurrentHitPoints = m_CachedServerCharacter.HitPoints;
playerData.HasCharacterSpawned = true;
SessionManager<SessionPlayerData>.Instance.SetPlayerData(OwnerClientId, playerData);
}
}
}
/// <summary>
/// Returns a list of all active players' ServerCharacters. Treat the list as read-only!
/// The list will be empty on the client.
/// </summary>
public static List<ServerCharacter> GetPlayerServerCharacters()
{
return s_ActivePlayers;
}
/// <summary>
/// Returns the ServerCharacter owned by a specific client. Always returns null on the client.
/// </summary>
/// <param name="ownerClientId"></param>
/// <returns>The ServerCharacter owned by the client, or null if no ServerCharacter is found</returns>
public static ServerCharacter GetPlayerServerCharacter(ulong ownerClientId)
{
foreach (var playerServerCharacter in s_ActivePlayers)
{
if (playerServerCharacter.OwnerClientId == ownerClientId)
{
return playerServerCharacter;
}
}
return null;
}
}
}