public Network(IResourceMover <TResource> resourceMover, float cyclesPerSecond) { Connection = new Connections(this, resourceMover); _cyclesPerSecond = cyclesPerSecond; this.StartCoroutine(NetworkCycle(_cyclesPerSecond)); CommonMonoBehaviour.Destroy += Dispose; }
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)); }
public Connections(Network <TResource> network, IResourceMover <TResource> resourceMover) { _network = network; TryAdd(resourceMover); CommonMonoBehaviour.DrawGizmos += OnDrawGizmos; }
private Entry TryAddWithoutEntry(IResourceMover <TResource> resourceMover) { Entry newMoverEntry = new Entry(resourceMover); AddToNetwork(newMoverEntry); return(newMoverEntry); }
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); }
private Entry TryAddFromOtherNetwork(IResourceMover <TResource> resourceMover) { Entry newMoverEntry = resourceMover.Network.Connection.EntryOrDefault(resourceMover); newMoverEntry.Mover.Network.Dispose(); AddToNetwork(newMoverEntry); return(newMoverEntry); }
public void TryRemove(IResourceMover <TResource> resourceMover) { Entry removedMoverEntry = EntryOrDefault(resourceMover); if (removedMoverEntry != default) { DisconnectAndDivide(removedMoverEntry); } }
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); }
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); }
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); }
protected void TryDisconnect <TResource>(IResourceMover <TResource> resourceMover) where TResource : IResource <TResource>, new() { resourceMover.Network.Connection.TryRemove(resourceMover); }
public Entry(IResourceMover <TResource> mover, IEnumerable <Entry> connectedMovers) : this(mover) { ConnectedMovers.AddRange(connectedMovers); }
public Entry(IResourceMover <TResource> mover) { Mover = mover; }
private Entry EntryOrDefault(IResourceMover <TResource> resourceMover) { return(_movers.Where(entry => entry.Mover == resourceMover).FirstOrDefault()); }