/// <summary> /// Call ResourceUpdate on all part modules that have that method /// </summary> public void ResourceUpdate(VesselResources resources, double elapsed_s) { // only do this for loaded vessels. unloaded vessels will be handled in Background.cs if (!Vessel.loaded) { return; } if (resourceUpdateDelegates == null) { resourceUpdateDelegates = new List <ResourceUpdateDelegate>(); foreach (var part in Vessel.parts) { foreach (var module in part.Modules) { if (!module.isEnabled) { continue; } var resourceUpdateDelegate = ResourceUpdateDelegate.Instance(module); if (resourceUpdateDelegate != null) { resourceUpdateDelegates.Add(resourceUpdateDelegate); } } } } if (resourceUpdateDelegates.Count == 0) { return; } List <ResourceInfo> allResources = resources.GetAllResources(Vessel); // there might be some performance to be gained by caching the list of all resource Dictionary <string, double> availableResources = new Dictionary <string, double>(); foreach (var ri in allResources) { availableResources[ri.ResourceName] = ri.Amount; } List <KeyValuePair <string, double> > resourceChangeRequests = new List <KeyValuePair <string, double> >(); foreach (var resourceUpdateDelegate in resourceUpdateDelegates) { resourceChangeRequests.Clear(); string title = resourceUpdateDelegate.invoke(availableResources, resourceChangeRequests); foreach (var rc in resourceChangeRequests) { if (rc.Value > 0) { resources.Produce(Vessel, rc.Key, rc.Value * elapsed_s, title); } if (rc.Value < 0) { resources.Consume(Vessel, rc.Key, -rc.Value * elapsed_s, title); } } } }
private static void ProcessApiModule(Vessel v, ProtoPartSnapshot p, ProtoPartModuleSnapshot m, Part part_prefab, PartModule module_prefab, VesselResources resources, Dictionary <string, double> availableResources, List <KeyValuePair <string, double> > resourceChangeRequests, double elapsed_s) { resourceChangeRequests.Clear(); try { string title = BackgroundDelegate.Instance(module_prefab).invoke(v, p, m, module_prefab, part_prefab, availableResources, resourceChangeRequests, elapsed_s); foreach (var cr in resourceChangeRequests) { if (cr.Value > 0) { resources.Produce(v, cr.Key, cr.Value * elapsed_s, ResourceBroker.GetOrCreate(title)); } else if (cr.Value < 0) { resources.Consume(v, cr.Key, -cr.Value * elapsed_s, ResourceBroker.GetOrCreate(title)); } } } catch (Exception ex) { Lib.Log("BackgroundUpdate in PartModule " + module_prefab.moduleName + " excepted: " + ex.Message + "\n" + ex.ToString()); } }