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;
 | |
|         }
 | |
|     }
 | |
| 
 | |
| 
 | |
| } |