private void InitializeUpgradeHandlers() { QuickLogger.Debug($"UpgradeManager adding new UpgradeHandlers from external mods"); // First, register upgrades from other mods. foreach (KeyValuePair <CreateUpgradeHandler, string> pair in HandlerCreators) { CreateUpgradeHandler upgradeHandlerCreator = pair.Key; string assemblyName = pair.Value; UpgradeHandler upgrade = upgradeHandlerCreator.Invoke(Cyclops); if (upgrade == null) { QuickLogger.Warning($"UpgradeHandler from '{assemblyName}' was null"); } else if (!KnownsUpgradeModules.ContainsKey(upgrade.TechType)) { upgrade.RegisterSelf(KnownsUpgradeModules); } else { QuickLogger.Warning($"Duplicate UpgradeHandler for '{upgrade.TechType.AsString()}' from '{assemblyName}' was blocked"); } } // Next, if no external mod has provided an UpgradeHandler for the vanilla upgrades, they will be added here. // This is to allow other mods to provide new functionality to the original upgrades. QuickLogger.Debug($"UpgradeManager adding default UpgradeHandlers for unmanaged vanilla upgrades"); for (int i = 0; i < vanillaUpgrades.OriginalUpgradeIDs.Count; i++) { TechType upgradeID = vanillaUpgrades.OriginalUpgradeIDs[i]; if (!KnownsUpgradeModules.ContainsKey(upgradeID)) { UpgradeHandler vanillaUpgrade = vanillaUpgrades.CreateUpgradeHandler(upgradeID, Cyclops); vanillaUpgrade.RegisterSelf(KnownsUpgradeModules); } } upgradeHandlers = new UpgradeHandler[KnownsUpgradeModules.Count]; int u = 0; foreach (UpgradeHandler upgrade in KnownsUpgradeModules.Values) { upgradeHandlers[u++] = upgrade; } QuickLogger.Debug("Attaching events to Engine Room Upgrade Console"); if (engineRoomUpgradeConsole == null) { engineRoomUpgradeConsole = Cyclops.upgradeConsole.modules; } AttachEquipmentEvents(ref engineRoomUpgradeConsole); initialized = true; TooLateToRegister = true; }
internal static void RegisterHandlerCreator(CreateUpgradeHandler createEvent, string assemblyName) { if (HandlerCreators.ContainsKey(createEvent)) { QuickLogger.Warning($"Duplicate UpgradeHandlerCreator blocked from {assemblyName}"); return; } QuickLogger.Info($"Received UpgradeHandlerCreator from {assemblyName}"); HandlerCreators.Add(createEvent, assemblyName); }
/// <summary> /// Registers a <see cref="CreateUpgradeHandler" /> method that creates a new <see cref="UpgradeHandler" /> on demand.<para /> /// This method will be invoked only once for each Cyclops sub in the game world. /// </summary> /// <param name="createEvent">A method that takes no parameters a returns a new instance of an <see cref="UpgradeHandler" />.</param> public void CyclopsUpgradeHandler(CreateUpgradeHandler createEvent) { if (UpgradeManager.TooLateToRegister) { QuickLogger.Error("UpgradeHandlerCreators have already been invoked. This method should only be called during patch time."); } else { UpgradeManager.RegisterHandlerCreator(createEvent, Assembly.GetCallingAssembly().GetName().Name); } }