public IEnumerator TransferData(ScienceHardDrive drive) { if(drive.StartXfering()) { float secTotal = 0f; float secRemaining = 0f; ScreenMessage msg = null; ScienceData data = null; IScienceDataContainer container = null; KeyValuePair<ScienceData, IScienceDataContainer> kvp = new KeyValuePair<ScienceData, IScienceDataContainer>(); while((kvp = QueueManager.instance.GetNextInXferQueue(drive)).Key != null) { data = kvp.Key; container = kvp.Value; if(data.dataAmount <= drive.capacity - drive.usedSpace) { secTotal = secRemaining = data.dataAmount / drive.xferRate; msg = new ScreenMessage("<color=#99ff00ff>Transfering " + data.title + " to " + drive.part.partInfo.title + ": 0%</color>", (float)secTotal + 5f, ScreenMessageStyle.UPPER_LEFT); ScreenMessages.PostScreenMessage(msg); while(secRemaining > 0 && Mathf.Round((float)drive.part.RequestResource("ElectricCharge", .1 * drive.powerUsage) * 10000) == .1 * drive.powerUsage * 10000) { yield return new WaitForSeconds(.1f); secRemaining -= .1f; msg.message = "<color=#99ff00ff>Transfering " + data.title + " to " + drive.part.partInfo.title + ": " + Mathf.Round(1000 * (secTotal - secRemaining) / secTotal) / 10 + "%</color>"; } if(secRemaining > 0) { ScreenMessages.RemoveMessage(msg); ScreenMessages.PostScreenMessage("<color=#ff9900ff>Ran out of Electric Charge while transfering " + data.title + " to " + drive.part.partInfo.title + ".</color>", 5f, ScreenMessageStyle.UPPER_LEFT); QueueManager.instance.ClearXferQueue(drive); } else { ScreenMessages.RemoveMessage(msg); ScreenMessages.PostScreenMessage("<color=#99ff00ff>" + data.title + " transfered to " + drive.part.partInfo.title + ".</color>", 5f, ScreenMessageStyle.UPPER_LEFT); drive.AddData(data); container.DumpData(data); } } else { Print(drive.part.partInfo.title + " doesn't have the room for " + data.title); } QueueManager.instance.RemvoeFromXferQueue(drive, data); } yield return new WaitForSeconds(1f); drive.StopXfering(); } else { Print(drive.part.partInfo.title + " is already transfering data."); } }