123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- using System;
- using System.Collections.Generic;
- using System.Runtime.CompilerServices;
- namespace Mirror
- {
- public class NetworkConnectionToClient : NetworkConnection
- {
- public override string address =>
- Transport.activeTransport.ServerGetClientAddress(connectionId);
- /// <summary>NetworkIdentities that this connection can see</summary>
- // TODO move to server's NetworkConnectionToClient?
- public new readonly HashSet<NetworkIdentity> observing = new HashSet<NetworkIdentity>();
- /// <summary>All NetworkIdentities owned by this connection. Can be main player, pets, etc.</summary>
- // IMPORTANT: this needs to be <NetworkIdentity>, not <uint netId>.
- // fixes a bug where DestroyOwnedObjects wouldn't find the
- // netId anymore: https://github.com/vis2k/Mirror/issues/1380
- // Works fine with NetworkIdentity pointers though.
- public new readonly HashSet<NetworkIdentity> clientOwnedObjects = new HashSet<NetworkIdentity>();
- // unbatcher
- public Unbatcher unbatcher = new Unbatcher();
- public NetworkConnectionToClient(int networkConnectionId)
- : base(networkConnectionId) {}
- // Send stage three: hand off to transport
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- protected override void SendToTransport(ArraySegment<byte> segment, int channelId = Channels.Reliable) =>
- Transport.activeTransport.ServerSend(connectionId, segment, channelId);
- /// <summary>Disconnects this connection.</summary>
- public override void Disconnect()
- {
- // set not ready and handle clientscene disconnect in any case
- // (might be client or host mode here)
- isReady = false;
- Transport.activeTransport.ServerDisconnect(connectionId);
- // IMPORTANT: NetworkConnection.Disconnect() is NOT called for
- // voluntary disconnects from the other end.
- // -> so all 'on disconnect' cleanup code needs to be in
- // OnTransportDisconnect, where it's called for both voluntary
- // and involuntary disconnects!
- }
- internal void AddToObserving(NetworkIdentity netIdentity)
- {
- observing.Add(netIdentity);
- // spawn identity for this conn
- NetworkServer.ShowForConnection(netIdentity, this);
- }
- internal void RemoveFromObserving(NetworkIdentity netIdentity, bool isDestroyed)
- {
- observing.Remove(netIdentity);
- if (!isDestroyed)
- {
- // hide identity for this conn
- NetworkServer.HideForConnection(netIdentity, this);
- }
- }
- internal void RemoveFromObservingsObservers()
- {
- foreach (NetworkIdentity netIdentity in observing)
- {
- netIdentity.RemoveObserver(this);
- }
- observing.Clear();
- }
- internal void AddOwnedObject(NetworkIdentity obj)
- {
- clientOwnedObjects.Add(obj);
- }
- internal void RemoveOwnedObject(NetworkIdentity obj)
- {
- clientOwnedObjects.Remove(obj);
- }
- internal void DestroyOwnedObjects()
- {
- // create a copy because the list might be modified when destroying
- HashSet<NetworkIdentity> tmp = new HashSet<NetworkIdentity>(clientOwnedObjects);
- foreach (NetworkIdentity netIdentity in tmp)
- {
- if (netIdentity != null)
- {
- NetworkServer.Destroy(netIdentity.gameObject);
- }
- }
- // clear the hashset because we destroyed them all
- clientOwnedObjects.Clear();
- }
- }
- }
|