forked from cgvr/DeltaVR
		
	
		
			
				
	
	
		
			110 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using FishNet.Broadcast;
 | 
						|
using FishNet.Managing;
 | 
						|
using FishNet.Managing.Logging;
 | 
						|
using FishNet.Managing.Transporting;
 | 
						|
using FishNet.Transporting;
 | 
						|
using System;
 | 
						|
using System.Collections.Generic;
 | 
						|
using UnityEngine;
 | 
						|
 | 
						|
namespace FishNet.Connection
 | 
						|
{
 | 
						|
    public partial class NetworkConnection
 | 
						|
    {
 | 
						|
 | 
						|
        #region Private.
 | 
						|
        /// <summary>
 | 
						|
        /// PacketBundles to send to this connection. An entry will be made for each channel.
 | 
						|
        /// </summary>
 | 
						|
        private List<PacketBundle> _toClientBundles = new List<PacketBundle>();
 | 
						|
        /// <summary>
 | 
						|
        /// True if this object has been dirtied.
 | 
						|
        /// </summary>
 | 
						|
        private bool _serverDirtied;
 | 
						|
        #endregion
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Initializes this script.
 | 
						|
        /// </summary>
 | 
						|
        private void InitializeBuffer()
 | 
						|
        {
 | 
						|
            for (byte i = 0; i < TransportManager.CHANNEL_COUNT; i++)
 | 
						|
            {
 | 
						|
                int mtu = NetworkManager.TransportManager.GetLowestMTU(i);
 | 
						|
                _toClientBundles.Add(new PacketBundle(NetworkManager, mtu));
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Sends a broadcast to this connection.
 | 
						|
        /// </summary>
 | 
						|
        /// <typeparam name="T">Type of broadcast to send.</typeparam>
 | 
						|
        /// <param name="message">Broadcast data being sent; for example: an instance of your broadcast type.</param>
 | 
						|
        /// <param name="requireAuthenticated">True if the client must be authenticated for this broadcast to send.</param>
 | 
						|
        /// <param name="channel">Channel to send on.</param>
 | 
						|
        public void Broadcast<T>(T message, bool requireAuthenticated = true, Channel channel = Channel.Reliable) where T : struct, IBroadcast
 | 
						|
        {
 | 
						|
            if (!IsActive)
 | 
						|
                NetworkManager.LogError($"Connection is not valid, cannot send broadcast.");
 | 
						|
            else
 | 
						|
                NetworkManager.ServerManager.Broadcast<T>(this, message, requireAuthenticated, channel);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Sends data from the server to a client.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="forceNewBuffer">True to force data into a new buffer.</param>
 | 
						|
        internal void SendToClient(byte channel, ArraySegment<byte> segment, bool forceNewBuffer = false)
 | 
						|
        {
 | 
						|
            //Cannot send data when disconnecting.
 | 
						|
            if (Disconnecting)
 | 
						|
                return;
 | 
						|
 | 
						|
            if (!IsActive)
 | 
						|
            {
 | 
						|
                NetworkManager.LogWarning($"Data cannot be sent to connection {ClientId} because it is not active.");
 | 
						|
                return;
 | 
						|
            }
 | 
						|
            //If channel is out of bounds then default to the first channel.
 | 
						|
            if (channel >= _toClientBundles.Count)
 | 
						|
                channel = 0;
 | 
						|
 | 
						|
            _toClientBundles[channel].Write(segment, forceNewBuffer);
 | 
						|
            ServerDirty();
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Returns a PacketBundle for a channel. ResetPackets must be called afterwards.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="channel"></param>
 | 
						|
        /// <returns>True if PacketBundle is valid on the index and contains data.</returns>
 | 
						|
        internal bool GetPacketBundle(int channel, out PacketBundle packetBundle)
 | 
						|
        {
 | 
						|
            return PacketBundle.GetPacketBundle(channel, _toClientBundles, out packetBundle);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Indicates the server has data to send to this connection.
 | 
						|
        /// </summary>
 | 
						|
        private void ServerDirty()
 | 
						|
        {
 | 
						|
            bool wasDirty = _serverDirtied;
 | 
						|
            _serverDirtied = true;
 | 
						|
 | 
						|
            //If not yet dirty then tell transport manager this is dirty.
 | 
						|
            if (!wasDirty)
 | 
						|
                NetworkManager.TransportManager.ServerDirty(this);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Resets that there is data to send.
 | 
						|
        /// </summary>
 | 
						|
        internal void ResetServerDirty()
 | 
						|
        {
 | 
						|
            _serverDirtied = false;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
} |