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); }
 }