-
Notifications
You must be signed in to change notification settings - Fork 17
Expand file tree
/
Copy pathNgoNetProvider.cs
More file actions
129 lines (110 loc) · 3.9 KB
/
NgoNetProvider.cs
File metadata and controls
129 lines (110 loc) · 3.9 KB
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#if METAVC_NGO
using MetaVoiceChat.Utils;
using System;
using System.Collections.Generic;
using Unity.Netcode;
using UnityEngine;
namespace MetaVoiceChat.NetProviders.NGO
{
[RequireComponent(typeof(MetaVc))]
public class NGONetProvider : NetworkBehaviour, INetProvider
{
public static NGONetProvider LocalPlayerInstance { get; private set; }
private readonly static List<NGONetProvider> s_Instances = new();
public static IReadOnlyList<NGONetProvider> Instances => s_Instances;
public MetaVc MetaVc { get; private set; }
/* =========================================================================================
* NetworkBehaviour
=========================================================================================== */
public override void OnNetworkSpawn()
{
if (IsOwner)
{
LocalPlayerInstance = this;
}
s_Instances.Add(this);
static int GetMaxDataBytesPerPacket(NetworkManager netManager)
{
const int networkBatchHeaderSize = sizeof(ushort) // Magic
+ sizeof(ushort) // BatchCount
+ sizeof(int) // BatchSize
+ sizeof(ulong); // BatchHash
const int networkMessageHeaderSize = sizeof(uint) * 2; // MessageType, MessageSize
const int messageNameHashSize = sizeof(ulong); // MessageName hash
// Not sure about this overhead but it's essentially the same thing
// used internally for "Named" and "Unnamed" messages.
int bytes = netManager.MaximumTransmissionUnitSize
- networkMessageHeaderSize
- networkBatchHeaderSize
- messageNameHashSize;
bytes -= sizeof(int); // Index
bytes -= sizeof(double); // Timestamp
bytes -= sizeof(byte); // Additional latency
bytes -= sizeof(ushort); // Array length
return bytes;
}
MetaVc = GetComponent<MetaVc>();
MetaVc.StartClient(this, IsOwner, GetMaxDataBytesPerPacket(NetworkManager));
}
public override void OnNetworkDespawn()
{
if (IsOwner)
{
LocalPlayerInstance = null;
}
s_Instances.Remove(this);
MetaVc.StopClient();
}
/* =========================================================================================
* INetProvider
=========================================================================================== */
public bool IsLocalPlayerDeafened
{
get
{
// We cannot speak yet
if (LocalPlayerInstance == null)
return false;
return LocalPlayerInstance.MetaVc.isDeafened;
}
}
public void RelayFrame(int index, double timestamp, ReadOnlySpan<byte> data)
{
var array = FixedLengthArrayPool<byte>.Rent(data.Length);
data.CopyTo(array);
float additionalLatency = Time.deltaTime;
NGOFrame frame = new(index, timestamp, additionalLatency, array);
if (IsServer)
{
ReceiveFrameClientRpc(frame);
}
else
{
RelayFrameServerRpc(frame);
}
FixedLengthArrayPool<byte>.Return(array);
}
/* =========================================================================================
* RPCs
=========================================================================================== */
[Rpc(SendTo.Server, Delivery = RpcDelivery.Unreliable, RequireOwnership = false)]
private void RelayFrameServerRpc(NGOFrame frame, RpcParams rpcParams = default)
{
float additionalLatency = frame.additionalLatency + Time.deltaTime;
frame = new(frame.index, frame.timestamp, additionalLatency, frame.data);
ReceiveFrameClientRpc(frame);
}
[Rpc(SendTo.NotOwner, Delivery = RpcDelivery.Unreliable, RequireOwnership = false)]
private void ReceiveFrameClientRpc(NGOFrame frame, RpcParams rpcParams = default)
{
float latency = frame.additionalLatency;
if (IsServer)
{
// Don't apply server Time.deltaTime to additionalLatency -- this frame did not go over the network again.
latency -= Time.deltaTime;
}
MetaVc.ReceiveFrame(frame.index, frame.timestamp, latency, frame.data);
}
}
}
#endif