public void Join(ModuleReactorHolder holder) { if (holder.sharedEnergyNet != null) //MERGE { if (holder.sharedEnergyNet == this) { return; } var otherNet = holder.sharedEnergyNet; foreach (var block in otherNet.holders) { holders.Add(block); block.sharedEnergyNet = this; } NetMaxCap += otherNet.NetMaxCap; NetCharge += otherNet.NetCharge; otherNet.holders.Clear(); // Another one bites the dust } else { holders.Add(holder); NetMaxCap += holder.ThisCapacity; NetCharge += holder.ThisCharge; holder.ThisCharge = 0f; holder.sharedEnergyNet = this; } }
static void AttemptJoin(ModuleReactorHolder subject, TankBlock other) { if (other == null) { return; } var moduleHolder = other.GetComponent <ModuleReactorHolder>(); if (moduleHolder == null || moduleHolder.sharedEnergyNet == null) { return; } if (!moduleHolder.UseAPIDs) { moduleHolder.sharedEnergyNet.Join(subject); return; } else { for (int i = 0; i < moduleHolder.APIDs.Length; i++) { var check = moduleHolder.block.ConnectedBlocksByAP[moduleHolder.APIDs[i]]; if (check == subject.block) { moduleHolder.sharedEnergyNet.Join(subject); return; } } } }
public void Leave(ModuleReactorHolder holder) { holder.sharedEnergyNet = null; if (holders.Remove(holder)) { NetMaxCap -= holder.ThisCapacity; if (NetCharge > NetMaxCap) { holder.ThisCharge = NetCharge - NetMaxCap; NetCharge = NetMaxCap; } Revalidate(); } }
public static SharedEnergyNet Validate(ModuleReactorHolder holder) { if (holder.UseAPIDs) { for (int i = 0; i < holder.APIDs.Length; i++) { var other = holder.block.ConnectedBlocksByAP[holder.APIDs[i]]; AttemptJoin(holder, other); } } else { for (int i = 0; i < holder.block.attachPoints.Length; i++) { var other = holder.block.ConnectedBlocksByAP[i]; AttemptJoin(holder, other); } } if (holder.sharedEnergyNet == null) { new SharedEnergyNet().Join(holder); } return(holder.sharedEnergyNet); }