internal static void FirstRun(Entity entity) { CargoTransferDB datablob = entity.GetDataBlob <CargoTransferDB>(); double?dv; if (entity.HasDataBlob <OrbitDB>() && datablob.CargoToEntity.HasDataBlob <OrbitDB>()) { dv = CalcDVDifferenceKmPerSecond(entity.GetDataBlob <OrbitDB>(), datablob.CargoToEntity.GetDataBlob <OrbitDB>()); } else { OrbitDB orbitDB; if (entity.HasDataBlob <ColonyInfoDB>()) { orbitDB = entity.GetDataBlob <ColonyInfoDB>().PlanetEntity.GetDataBlob <OrbitDB>(); } else//if (datablob.CargoToEntity.HasDataBlob<ColonyInfoDB>()) { orbitDB = datablob.CargoToEntity.GetDataBlob <ColonyInfoDB>().PlanetEntity.GetDataBlob <OrbitDB>(); } dv = Distance.AuToKm(OrbitMath.MeanOrbitalVelocityInAU(orbitDB)); } if (dv != null) { datablob.TransferRateInKG = CalcTransferRate((double)dv, datablob.CargoFromDB, datablob.CargoToDB); } }
/// <summary> /// Calculates the DVD ifference. /// </summary> /// <returns>The delaV Difference in Km/s, null if not in imediate orbit</returns> public static double?CalcDVDifferenceKmPerSecond(OrbitDB orbitDBFrom, OrbitDB orbitDBTo) { Entity toEntity = orbitDBTo.OwningEntity; double?dv = null; if (orbitDBFrom.Parent == toEntity) //Cargo going up the gravity well { dv = OrbitMath.MeanOrbitalVelocityInAU(orbitDBFrom); } else if (orbitDBFrom.Children.Contains(toEntity)) //Cargo going down the gravity well { dv = OrbitMath.MeanOrbitalVelocityInAU(orbitDBTo); } else if (orbitDBFrom.Parent == toEntity.GetDataBlob <OrbitDB>().Parent) //cargo going between objects orbiting the same body { dv = Math.Abs(OrbitMath.MeanOrbitalVelocityInAU(orbitDBFrom) - OrbitMath.MeanOrbitalVelocityInAU(orbitDBTo)); } if (dv == null) { return(dv); } else { return(Distance.AuToKm((double)dv)); } }