Example #1
0
 public Network(IResourceMover <TResource> resourceMover, float cyclesPerSecond)
 {
     Connection       = new Connections(this, resourceMover);
     _cyclesPerSecond = cyclesPerSecond;
     this.StartCoroutine(NetworkCycle(_cyclesPerSecond));
     CommonMonoBehaviour.Destroy += Dispose;
 }
Example #2
0
 protected void TryConnect <TResource>(IResourceMover <TResource> resourceMover) where TResource : IResource <TResource>, new()
 {
     Physics.OverlapSphere(transform.position, _maxConnectRadius)
     .Select(collider => collider.GetComponent <IResourceMover <TResource> >())
     .Where(mover => mover != null)
     .Foreach(networkMember => networkMember.Network.Connection.TryAdd(resourceMover, networkMember));
 }
Example #3
0
            public Connections(Network <TResource> network, IResourceMover <TResource> resourceMover)
            {
                _network = network;
                TryAdd(resourceMover);

                CommonMonoBehaviour.DrawGizmos += OnDrawGizmos;
            }
Example #4
0
            private Entry TryAddWithoutEntry(IResourceMover <TResource> resourceMover)
            {
                Entry newMoverEntry = new Entry(resourceMover);

                AddToNetwork(newMoverEntry);
                return(newMoverEntry);
            }
Example #5
0
            public void TryAdd(IResourceMover <TResource> resourceMover, IResourceMover <TResource> networkMember)
            {
                Entry newMoverEntry       = TryAdd(resourceMover);
                Entry connectedMoverEntry = EntryOrDefault(networkMember);

                connectedMoverEntry.ConnectedMovers.Add(newMoverEntry);
                newMoverEntry.ConnectedMovers.Add(connectedMoverEntry);
            }
Example #6
0
            private Entry TryAddFromOtherNetwork(IResourceMover <TResource> resourceMover)
            {
                Entry newMoverEntry = resourceMover.Network.Connection.EntryOrDefault(resourceMover);

                newMoverEntry.Mover.Network.Dispose();
                AddToNetwork(newMoverEntry);
                return(newMoverEntry);
            }
Example #7
0
            public void TryRemove(IResourceMover <TResource> resourceMover)
            {
                Entry removedMoverEntry = EntryOrDefault(resourceMover);

                if (removedMoverEntry != default)
                {
                    DisconnectAndDivide(removedMoverEntry);
                }
            }
Example #8
0
            private Entry TryAdd(IResourceMover <TResource> resourceMover)
            {
                if (resourceMover.Network?.Connection.EntryOrDefault(resourceMover) == default)
                {
                    return(TryAddWithoutEntry(resourceMover));
                }
                Entry newMoverEntry = EntryOrDefault(resourceMover);

                if (newMoverEntry == default)
                {
                    return(TryAddFromOtherNetwork(resourceMover));
                }
                return(newMoverEntry);
            }
Example #9
0
            private void RemoveFromNetwork(Entry removedMoverEntry)
            {
                IResourceMover <TResource> resourceMover = removedMoverEntry.Mover;

                if (resourceMover is IResourceReceiver <TResource> resourceReceiver)
                {
                    _network._receivers.Remove(resourceReceiver);
                }
                if (resourceMover is IResourceProducer <TResource> resourceProducer)
                {
                    _network._producers.Remove(resourceProducer);
                }

                _movers.Remove(removedMoverEntry);
            }
Example #10
0
            private void AddToNetwork(Entry newMoverEntry)
            {
                _movers.Add(newMoverEntry);

                IResourceMover <TResource> resourceMover = newMoverEntry.Mover;

                resourceMover.Network = _network;
                if (resourceMover is IResourceReceiver <TResource> resourceReceiver)
                {
                    _network._receivers.Add(resourceReceiver);
                }
                if (resourceMover is IResourceProducer <TResource> resourceProducer)
                {
                    _network._producers.Add(resourceProducer);
                }

                HookEntries(newMoverEntry);
            }
Example #11
0
 protected void TryDisconnect <TResource>(IResourceMover <TResource> resourceMover) where TResource : IResource <TResource>, new()
 {
     resourceMover.Network.Connection.TryRemove(resourceMover);
 }
Example #12
0
 public Entry(IResourceMover <TResource> mover, IEnumerable <Entry> connectedMovers) : this(mover)
 {
     ConnectedMovers.AddRange(connectedMovers);
 }
Example #13
0
 public Entry(IResourceMover <TResource> mover)
 {
     Mover = mover;
 }
Example #14
0
 private Entry EntryOrDefault(IResourceMover <TResource> resourceMover)
 {
     return(_movers.Where(entry => entry.Mover == resourceMover).FirstOrDefault());
 }