private static void AfterEnterSlot_UpdateName(UIModuleManufacturing __instance, IManufacturableUIElement item) { if (!(item is GeoManufactureItem mItem)) { return; } if (!(mItem.Manufacturable is GeoUnitWrapper geoUnit)) { return; } __instance.Tooltip.InfoPanel.ItemNameTextComp.text = geoUnit.GetName(); GeoSite site = null; if (geoUnit is GeoPlaneWrapper plane) { site = plane.Vehicle.CurrentSite; } else if (geoUnit is GeoTankWrapper tank) { site = TankSites?[tank.GroundVehicle]; } if (site != null) { var region = site.GetComponent <GeoPhoenixBase>()?.LocationDescription.Localize(); if (!string.IsNullOrWhiteSpace(region)) { region = ", " + region; } __instance.Tooltip.InfoPanel.ItemDescriptionTextComp.text += "\n" + site.Name + region; } }
// Enable vehicle scrap tab private static void AfterRefreshFilters_EnableVehicleTab(UIModuleManufacturing __instance, PhoenixGeneralButton ____activeFilterButton) { try { if (__instance.Mode != UIModuleManufacturing.UIMode.Scrap) { return; } __instance.VehiclesFilterButton.SetInteractable(true); __instance.VehiclesFilterButton.GetComponent <UITooltipText>().TipKey = __instance.VehiclesTooltipText; /* // Show / hide class filters as appropiate - disabled because filter state is not restored correctly after toggle * UiType.GetMethod( "SetClassFiltersAvailability", NonPublic | Instance ) * .Invoke( __instance, new object[]{ ____activeFilterButton != __instance.VehiclesFilterButton } ); */ } catch (Exception ex) { Error(ex); } }
// Show confirmation popup which callback OnScrapConfirmation private static bool BeforeOnItemAction_ConfirmScrap(UIModuleManufacturing __instance, GeoManufactureItem item, MessageBox ____confirmationBox, GeoscapeViewContext ____context) { try { if (item.Manufacturable is GeoUnitWrapper unit) { Verbo("Confirming scraping of {0}", unit.GetName()); string scrapTxt = TitleCase(__instance.ScrapModeButton.GetComponentInChildren <Text>()?.text ?? "Scrap"); if (scrapTxt == "Scrap Item") { scrapTxt = "Scrap"; } string translation = scrapTxt + " " + unit.GetName() + "?"; ____confirmationBox.ShowSimplePrompt(translation, MessageBoxIcon.Warning, MessageBoxButtons.YesNo, answer => OnScrapConfirmation(__instance, answer, unit, ____context), __instance, MessageBox.DialogMode.DialogBox); return(false); } return(true); } catch (Exception ex) { return(Error(ex)); } }
// Do the scrap after user confirmation private static void OnScrapConfirmation(UIModuleManufacturing me, MessageBoxCallbackResult answer, IManufacturable item, GeoscapeViewContext context) { try { if (answer.DialogResult != MessageBoxResult.Yes) { return; } GeoFaction faction = context.ViewerFaction; GeoLevelController geoLevel = context.Level; if (item is GeoUnitWrapper) { if (item is GeoPlaneWrapper plane) { Info("Scraping airplane {0}", plane.GetName()); GeoVehicle vehicle = plane.Vehicle; GeoSite site = vehicle.CurrentSite; foreach (GeoCharacter chr in vehicle.Characters.ToList()) { Info("Moving {0} to {1}", chr.DisplayName, site.Name); vehicle.RemoveCharacter(chr); site.AddCharacter(chr); } faction.ScrapItem(plane); vehicle.Travelling = true; // Unset vehicle.CurrentSite and triggers site.VehicleLeft vehicle.Destroy(); } else if (item is GeoTankWrapper tank) { Info("Scraping tank {0}", tank.GetName()); faction.ScrapItem(tank); faction.RemoveCharacter(tank.GroundVehicle); geoLevel.DestroyTacUnit(tank.GroundVehicle); } } Info("Scrap done, refreshing list"); typeof(UIModuleManufacturing).GetMethod("DoFilter", NonPublic | Instance).Invoke(me, new object[] { null, null }); } catch (Exception ex) { Error(ex); } }
private static bool IsScrappingVehicles(UIModuleManufacturing __instance, PhoenixGeneralButton _activeFilterButton) { return(IsScrapping(__instance) && _activeFilterButton == __instance.VehiclesFilterButton); }
private static bool IsScrapping(UIModuleManufacturing __instance) { return(__instance.Mode == UIModuleManufacturing.UIMode.Scrap); }
// Replace scrap list with individual vehicles when applicable private static void BeforeRefreshItemList_FillWithVehicle(UIModuleManufacturing __instance, ref IEnumerable <IManufacturable> availableItemRecipes, PhoenixGeneralButton ____activeFilterButton, GeoscapeViewContext ____context) { try { if (availableItemRecipes == null || availableItemRecipes.GetType() == typeof(List <IManufacturable>)) { return; } if (!IsScrappingVehicles(__instance, ____activeFilterButton)) { return; } List <IManufacturable> vList = new List <IManufacturable>(); GeoPhoenixFaction faction = ____context.ViewerFaction as GeoPhoenixFaction; TankSites = new Dictionary <GeoTacUnit, GeoSite>(); if (faction.Vehicles.Count() > 1) { foreach (GeoVehicle plane in faction.Vehicles) { if (CanScrap(plane, true)) { Verbo("Can scrap airplane {0}", plane.Name); vList.Add(new GeoPlaneWrapper(plane)); foreach (var chr in plane.Characters) { if (chr.ClassDef.IsVehicle || chr.ClassDef.IsMutog) { TankSites.Add(chr, plane.CurrentSite); } } } } } foreach (GeoPhoenixBase pxbase in faction.Bases) { var units = pxbase.Site.TacUnits; if (!units.Any()) { continue; } foreach (var chr in units) { if (chr.ClassDef.IsMutog) { TankSites.Add(chr, pxbase.Site); } } if (CanScrapVehicles(pxbase)) { Verbo("Can scrap tanks at {0}", pxbase.Site.Name); foreach (var chr in units) { if (chr.ClassDef.IsVehicle) { TankSites.Add(chr, pxbase.Site); } } } } foreach (GeoCharacter tank in faction.GroundVehicles) { if (!TankSites.ContainsKey(tank)) { continue; } Verbo("Can scrap tank {0}", tank.DisplayName); vList.Add(new GeoTankWrapper(tank)); } Info("Can scrap {0} vehicles", vList.Count); availableItemRecipes = from t in vList select t; } catch (Exception ex) { Error(ex); } }
// Check whether scrap list need to be populated private static void AfterSetupClassFilter_CheckScrapMode(UIModuleManufacturing __instance, ItemStorage ____scrapStorage) { try { NeedToAddVehicles = IsScrapping(__instance) && ____scrapStorage.IsEmpty; } catch (Exception ex) { Error(ex); } }