/// <summary> /// When the server receives a greeting from the client. /// This makes us aware that the user has VChat installed. /// </summary> private static void OnServerMessage(long senderId, string version) { if (senderId != ZNet.instance.GetServerPeer()?.m_uid) { var peer = ZRoutedRpc.instance?.GetPeer(senderId); if (peer != null) { VChatPlugin.Log($"Greeting received from client \"{peer?.m_playerName}\" ({senderId}) with version {version}."); GreetingMessagePeerInfo peerInfo; if (PeerInfo.TryGetValue(senderId, out GreetingMessagePeerInfo previousGreeting)) { peerInfo = previousGreeting; peerInfo.Version = version; peerInfo.HasReceivedGreeting = true; } else { peerInfo = new GreetingMessagePeerInfo() { PeerId = senderId, Version = version, HasReceivedGreeting = true, HasSentGreeting = false, }; } PeerInfo.AddOrUpdate(senderId, peerInfo, (long oldKey, GreetingMessagePeerInfo oldValue) => peerInfo); } else { VChatPlugin.LogWarning($"Received greeting from an unconnected peer with id {senderId}."); } } else { VChatPlugin.LogWarning($"Received a greeting from a peer with the server id..."); } }
/// <summary> /// Send a VChat greeting message to a client, this should only be called on a server. /// </summary> public static void SendToClient(long peerId) { if (ZNet.m_isServer) { var parameters = new object[] { VChatPlugin.Version }; ZRoutedRpc.instance.InvokeRoutedRPC(peerId, GreetingHashName, parameters); // Add or update peer info GreetingMessagePeerInfo peerInfo; if (PeerInfo.TryGetValue(peerId, out GreetingMessagePeerInfo previousGreeting)) { if (previousGreeting.HasSentGreeting) { VChatPlugin.LogWarning($"Player \"{ZNet.instance.GetPeer(peerId)?.m_playerName}\" ({peerId}) has already been greeted, but sending anyway."); } peerInfo = previousGreeting; peerInfo.HasSentGreeting = true; } else { peerInfo = new GreetingMessagePeerInfo() { PeerId = peerId, Version = null, HasReceivedGreeting = false, HasSentGreeting = true, }; } PeerInfo.AddOrUpdate(peerId, peerInfo, (long oldKey, GreetingMessagePeerInfo oldValue) => peerInfo); } else { VChatPlugin.LogWarning($"Cannot send the greeing to a client."); } }