예제 #1
0
 public static void Postfix(MechLabInventoryWidget __instance)
 {
     if (__instance.gameObject.activeInHierarchy)
     {
         __instance.StartCoroutine(EndOfFrameScrollBarMovement(__instance));
     }
 }
예제 #2
0
 // auto strip engine when put back to inventory
 internal static void InventoryWidgetOnAddItem(MechLabInventoryWidget widget, MechLabPanel panel, IMechLabDraggableItem item)
 {
     if (StripEngine(panel, item))
     {
         widget.RefreshFilterToggles();
     }
 }
        public static void Postfix(MechLabInventoryWidget __instance, float ___mechTonnage,
                                   List <InventoryItemElement_NotListView> ___localInventory)
        {
            foreach (var item in ___localInventory)
            {
                MechComponentDef component = null;

                if (item.controller != null)
                {
                    component = item.controller.componentDef;
                }
                else if (item.ComponentRef != null)
                {
                    component = item.ComponentRef.Def;
                }

                if (component != null && component.IsStructure())
                {
                    var tonnage = component.GetStructureWeight();
//                    Control.mod.Logger.Log(string.Format("[{0}] found structure {1} {2}/{3}", Time.realtimeSinceStartup,
//                       component.Description.Id, tonnage, ___mechTonnage));
                    item.gameObject.SetActive(
                        (___mechTonnage < 0 ||
                         ___mechTonnage == tonnage) && item.gameObject.activeSelf
                        );
                }
            }
        }
 public static void OnItemGrab_Pre(MechLabInventoryWidget __instance, ref IMechLabDraggableItem item)
 {
     if (state != null && state.inventoryWidget == __instance)
     {
         try {
             LogDebug(string.Format("OnItemGrab"));
             var nlv    = item as InventoryItemElement_NotListView;
             var nlvtmp = state.instance.dataManager.PooledInstantiate(ListElementController_BASE_NotListView.INVENTORY_ELEMENT_PREFAB_NotListView
                                                                       , BattleTechResourceType.UIModulePrefabs, null, null, null)
                          .GetComponent <InventoryItemElement_NotListView>();
             var lec  = nlv.controller;
             var iw   = nlvtmp;
             var cref = state.GetRef(lec);
             iw.ClearEverything();
             iw.ComponentRef = cref;
             lec.ItemWidget  = iw;
             iw.SetData(lec, state.inventoryWidget, lec.quantity, false, null);
             lec.SetupLook(iw);
             iw.gameObject.SetActive(true);
             item = iw;
         } catch (Exception e) {
             LogException(e);
         }
     }
 }
예제 #5
0
        public static void Prefix(MechLabInventoryWidget __instance, DataManager ___dataManager, IMechLabDraggableItem item)
        {
            try
            {
                var panel = __instance.ParentDropTarget as MechLabPanel;
                if (panel == null)
                {
                    return;
                }

                if (panel.baseWorkOrder == null)
                {
                    return;
                }

                if (!panel.IsSimGame)
                {
                    return;
                }

                if (item == null)
                {
                    return;
                }

                EnginePersistence.InventoryWidgetOnAddItem(__instance, panel, item);
            }
            catch (Exception e)
            {
                Control.mod.Logger.LogError(e);
            }
        }
예제 #6
0
        public static List <InventoryItemElement_NotListView> PullItemsFromInventory(this MechLabPanel mechLabPanel, List <InventoryItemElement_Simple> requiredItems, List <InventoryItemElement_NotListView> requestedInventory)
        {
            MechLabInventoryWidget inventoryWidget = (MechLabInventoryWidget)AccessTools.Field(typeof(MechLabPanel), "inventoryWidget").GetValue(mechLabPanel);
            List <InventoryItemElement_NotListView> collectedItems = new List <InventoryItemElement_NotListView>();

            // Reverse iterate to be able to directly remove without exception
            // BEWARE: Throws exception if the inventory gets completely emptied during this process (very unlikely but possible)
            for (int i = requestedInventory.Count - 1; i >= 0; i--)
            {
                foreach (InventoryItemElement_Simple requiredItem in requiredItems)
                {
                    if (requestedInventory[i].ComponentRef.ComponentDefID == requiredItem.ComponentRef.ComponentDefID)
                    {
                        //if (requestedInventory[i].Quantity >= requiredItem.Quantity)
                        if (requestedInventory[i].controller.quantity >= requiredItem.Quantity)
                        {
                            for (int j = 0; j < requiredItem.Quantity; j++)
                            {
                                // Collect before removal just makes sense... :-)
                                collectedItems.Add(requestedInventory[i]);
                                inventoryWidget.RemoveItem(requestedInventory[i]);
                            }
                        }
                    }
                }
            }
            return(collectedItems);
        }
        // auto strip engine when put back to inventory
        internal static void InventoryWidgetOnAddItem(MechLabInventoryWidget widget, MechLabPanel panel, IMechLabDraggableItem item)
        {
            if (item.ItemType != MechLabDraggableItemType.MechComponentItem)
            {
                return;
            }

            var componentRef = item.ComponentRef;

            var engineRef = componentRef.GetEngineRef();

            if (engineRef == null)
            {
                return;
            }

            //Control.mod.Logger.LogDebug("MechLabInventoryWidget.OnAddItem " + componentRef.Def.Description.Id + " UID=" + componentRef.SimGameUID);

            foreach (var componentDefID in engineRef.GetInternalComponents())
            {
                //Control.mod.Logger.LogDebug("MechLabInventoryWidget.OnAddItem extracting componentDefID=" + componentDefID);
                var @ref = CreateMechComponentRef(componentDefID, panel.sim, panel.dataManager);

                var mechLabItemSlotElement = panel.CreateMechComponentItem(@ref, false, ChassisLocations.None, null);
                widget.OnAddItem(mechLabItemSlotElement, false);
            }
            //engineRef.ClearInternalComponents();

            //SaveEngineState(engineRef, panel);

            widget.RefreshFilterToggles();
        }
예제 #8
0
        private static IEnumerator EndOfFrameScrollBarMovement(MechLabInventoryWidget __instance)
        {
            yield return(new WaitForEndOfFrame());

            Scrollbar(__instance).verticalNormalizedPosition = Mathf.Clamp(m_scrollPos, 0f, 1f);
            yield break;
        }
예제 #9
0
 public static void Prefix(MechLabInventoryWidget __instance)
 {
     if (Traverse.Create(__instance).Field("currentSort").GetValue <Comparison <InventoryItemElement> >() != null)
     {
         m_scrollPos = Scrollbar(__instance).verticalNormalizedPosition;
         //Log("saving scroll (hover)");
     }
 }
        public static bool ResetFiltersPrefix(MechLabInventoryWidget __instance)
        {
            if (__instance != UIHandler.widget)
            {
                return(true);
            }

            //__instance.FilterAll();

            return(false);
        }
 // hide incompatible engines
 public static void Postfix(MechLabInventoryWidget __instance, float ___mechTonnage)
 {
     try
     {
         EngineMisc.RefreshAvailability(__instance, ___mechTonnage);
     }
     catch (Exception e)
     {
         Control.mod.Logger.LogError(e);
     }
 }
예제 #12
0
        public static void PreInit(MechLabPanel __instance, MechLabInventoryWidget ___inventoryWidget)
        {
            Control.LogDebug("MechLab.InitWidgets - Prefix");
            UIHandler.PreInit(__instance, ___inventoryWidget);

            var loadRequest = __instance.dataManager.CreateLoadRequest();

            foreach (var str in Control.Settings.Tabs.SelectMany(i => i.Buttons).Where(i => !string.IsNullOrEmpty(i.Icon)).Select(i => i.Icon))
            {
                loadRequest.AddLoadRequest <SVGAsset>(BattleTechResourceType.SVGAsset, str, null);
            }
            loadRequest.ProcessRequests();
        }
예제 #13
0
        public static void Prefix(MechLabInventoryWidget __instance)
        {
            var willBeFilteringJumpJet = !Traverse.Create(__instance).Field("filterEnabledJumpjet").GetValue <bool>();

            if (willBeFilteringJumpJet)
            {
                Traverse.Create(__instance).Field("filterEnabledHeatsink").SetValue(false);
                Traverse.Create(__instance).Field("EquipmentHeatsinkToggleObj").GetValue <HBSDOTweenToggle>().SetState(ButtonState.Enabled);

                Traverse.Create(__instance).Field("filterEnabledUpgrade").SetValue(false);
                Traverse.Create(__instance).Field("EquipmentUpgradeToggleObj").GetValue <HBSDOTweenToggle>().SetState(ButtonState.Enabled);
            }
        }
 public static bool ApplyFiltering_Pre(MechLabInventoryWidget __instance, bool refreshPositioning)
 {
     if (state != null && state.inventoryWidget == __instance && !PatchMechlabLimitItems.filterGuard)
     {
         LogDebug(string.Format("OnApplyFiltering (refresh-pos? {0})", refreshPositioning));
         state.FilterChanged(refreshPositioning);
         return(false);
     }
     else
     {
         return(true);
     }
 }
 public static bool OnAddItem_Pre(MechLabInventoryWidget __instance, IMechLabDraggableItem item)
 {
     if (state != null && state.inventoryWidget == __instance)
     {
         try {
             var nlv      = item as InventoryItemElement_NotListView;
             var quantity = nlv == null ? 1 : nlv.controller.quantity;
             var existing = state.FetchItem(item.ComponentRef);
             if (existing == null)
             {
                 LogDebug(string.Format("OnAddItem new {0}", quantity));
                 var controller = nlv == null ? null : nlv.controller;
                 if (controller == null)
                 {
                     if (item.ComponentRef.ComponentDefType == ComponentType.Weapon)
                     {
                         var ncontroller = new ListElementController_InventoryWeapon_NotListView();
                         ncontroller.InitAndCreate(item.ComponentRef, state.instance.dataManager, state.inventoryWidget, quantity, false);
                         controller = ncontroller;
                     }
                     else
                     {
                         var ncontroller = new ListElementController_InventoryGear_NotListView();
                         ncontroller.InitAndCreate(item.ComponentRef, state.instance.dataManager, state.inventoryWidget, quantity, false);
                         controller = ncontroller;
                     }
                 }
                 state.rawInventory.Add(controller);
                 state.rawInventory = state.Sort(state.rawInventory);
                 state.FilterChanged(false);
             }
             else
             {
                 LogDebug(string.Format("OnAddItem existing {0}", quantity));
                 if (existing.quantity != Int32.MinValue)
                 {
                     existing.ModifyQuantity(quantity);
                 }
                 state.Refresh(false);
             }
         } catch (Exception e) {
             LogException(e);
         }
         return(false);
     }
     else
     {
         return(true);
     }
 }
예제 #16
0
 public static void Postfix(MechLabInventoryWidget __instance)
 {
     // when a filter is applied, permit the default behaviour (scroll to top) unless we're in the mech bay
     if (m_scrollAfterFilter)
     {
         m_scrollAfterFilter = false;
         if (__instance.gameObject.activeInHierarchy)
         {
             __instance.StartCoroutine(EndOfFrameScrollBarMovement(__instance));
         }
     }
     //Log($"resetting selection index");
     m_selectedIdx = -1; // reset selection on filter as it will scroll to the top
 }
        public static bool ApplyFiltering(MechLabInventoryWidget __instance, bool refreshPositioning,
                                          List <InventoryItemElement_NotListView> ___localInventory)
        {
            if (__instance != UIHandler.widget || Control.Settings.BTPerfFix)
            {
                return(true);
            }

            foreach (var item in ___localInventory)
            {
                item.gameObject.SetActive(UIHandler.ApplyFilter(item.ComponentRef.Def));
            }

            return(false);
        }
 // hide incompatible engines
 public static void Postfix(MechLabInventoryWidget __instance, float ___mechTonnage)
 {
     try
     {
         if (!Control.settings.EnableAvailabilityChecks)
         {
             return;
         }
         EngineMisc.RefreshAvailability(__instance, ___mechTonnage);
     }
     catch (Exception e)
     {
         Control.mod.Logger.LogError(e);
     }
 }
 public static bool ApplySorting_Pre(MechLabInventoryWidget __instance)
 {
     if (state != null && state.inventoryWidget == __instance)
     {
         // it's a mechlab screen, we do our own sort.
         var _cs = new Traverse(__instance).Field("currentSort").GetValue <Comparison <InventoryItemElement_NotListView> >();
         var cst = _cs.Method;
         LogDebug(string.Format("OnApplySorting using {0}::{1}", cst.DeclaringType.FullName, cst.ToString()));
         state.FilterChanged(false);
         return(false);
     }
     else
     {
         return(true);
     }
 }
 public static bool ApplySorting_Pre(MechLabInventoryWidget __instance)
 {
     if (state != null && state.inventoryWidget == __instance)
     {
         // it's a mechlab screen, we do our own sort.
         var _cs = __instance.currentSort;
         var cst = _cs.Method;
         LogDebug(string.Format("OnApplySorting using {0}::{1}", cst.DeclaringType.FullName, cst.ToString()));
         state.FilterChanged(false);
         return(false);
     }
     else
     {
         return(true);
     }
 }
예제 #21
0
        public static void Prefix(MechLabInventoryWidget __instance)
        {
            var willBeFilteringEnergy = !Traverse.Create(__instance).Field("filterEnabledWeaponEnergy").GetValue <bool>();

            if (willBeFilteringEnergy)
            {
                Traverse.Create(__instance).Field("filterEnabledWeaponBallistic").SetValue(false);
                Traverse.Create(__instance).Field("WeaponBallisticToggleObj").GetValue <HBSDOTweenToggle>().SetState(ButtonState.Enabled);

                Traverse.Create(__instance).Field("filterEnabledWeaponMissile").SetValue(false);
                Traverse.Create(__instance).Field("WeaponMissileToggleObj").GetValue <HBSDOTweenToggle>().SetState(ButtonState.Enabled);

                Traverse.Create(__instance).Field("filterEnabledWeaponSmall").SetValue(false);
                Traverse.Create(__instance).Field("WeaponSmallToggleObj").GetValue <HBSDOTweenToggle>().SetState(ButtonState.Enabled);
            }
        }
예제 #22
0
        public static void Init(MechLabPanel mechLabPanel, MechLabInventoryWidget mechLabInventoryWidget)
        {
            inv_helper.filterBtnAll.Value.SetActive(false);
            inv_helper.filterBtnEquipmentHeatsink.Value.SetActive(false);
            inv_helper.filterBtnEquipmentJumpjet.Value.SetActive(false);
            inv_helper.filterBtnEquipmentUpgrade.Value.SetActive(false);

            inv_helper.filterBtnWeaponEnergy.Value.SetActive(false);
            inv_helper.filterBtnWeaponMissile.Value.SetActive(false);
            inv_helper.filterBtnWeaponBallistic.Value.SetActive(false);
            inv_helper.filterBtnWeaponSmall.Value.SetActive(false);

            tab_radioset.defaultButton = tabs.FirstOrDefault();
            tab_radioset.Reset();

            TabPressed(Control.Settings.Tabs.FirstOrDefault());
        }
예제 #23
0
        private static bool Prefix(MechLabInventoryWidget __instance)
        {
            Comparison <InventoryItemElement_NotListView> currComp = Traverse.Create(__instance).Field("currentSort").GetValue <Comparison <InventoryItemElement_NotListView> >();
            bool currDir = Traverse.Create(__instance).Field("invertSort").GetValue <bool>();

            try
            {
                Traverse.Create(__instance).Field("currentSort").SetValue(new Comparison <InventoryItemElement_NotListView>(Compare_NotListView));
                Traverse.Create(__instance).Field("invertSort").SetValue(true);
                return(true);
            }
            catch (Exception e)
            {
                BetterSorting.Log($"Failed to sort MechLabInventoryWidget, resetting to default.{Environment.NewLine}Details:{e.ToString()}");
                Traverse.Create(__instance).Field("currentSort").SetValue(currComp);
                Traverse.Create(__instance).Field("invertSort").SetValue(currDir);
                return(true);
            }
        }
예제 #24
0
        public static void Postfix(MechLabInventoryWidget __instance)
        {
            // start with ballistic selected
            Traverse.Create(__instance).Field("filterEnabledWeaponEnergy").SetValue(false);
            Traverse.Create(__instance).Field("WeaponEnergyToggleObj").GetValue <HBSDOTweenToggle>().SetState(ButtonState.Enabled);

            Traverse.Create(__instance).Field("filterEnabledWeaponMissile").SetValue(false);
            Traverse.Create(__instance).Field("WeaponMissileToggleObj").GetValue <HBSDOTweenToggle>().SetState(ButtonState.Enabled);

            Traverse.Create(__instance).Field("filterEnabledWeaponSmall").SetValue(false);
            Traverse.Create(__instance).Field("WeaponSmallToggleObj").GetValue <HBSDOTweenToggle>().SetState(ButtonState.Enabled);

            // start with upgrade selected
            Traverse.Create(__instance).Field("filterEnabledHeatsink").SetValue(false);
            Traverse.Create(__instance).Field("EquipmentHeatsinkToggleObj").GetValue <HBSDOTweenToggle>().SetState(ButtonState.Enabled);

            Traverse.Create(__instance).Field("filterEnabledJumpjet").SetValue(false);
            Traverse.Create(__instance).Field("EquipmentJumpjetToggleObj").GetValue <HBSDOTweenToggle>().SetState(ButtonState.Enabled);
        }
예제 #25
0
        public InventoryHelper(MechLabInventoryWidget widget)
        {
            Widget = widget;
            main   = new Traverse(widget);

            tabAllToggleObj       = main.Field <HBSDOTweenToggle>("tabAllToggleObj");
            tabWeaponsToggleObj   = main.Field <HBSDOTweenToggle>("tabWeaponsToggleObj");
            tabEquipmentToggleObj = main.Field <HBSDOTweenToggle>("tabEquipmentToggleObj");
            tabMechPartToggleObj  = main.Field <HBSDOTweenToggle>("tabMechPartToggleObj");

            filterRadioSet = main.Field <HBSRadioSet>("filterRadioSet");


            filterBtnAll               = main.Field <GameObject>("filterBtnAll");
            filterBtnWeaponBallistic   = main.Field <GameObject>("filterBtnWeaponBallistic");
            filterBtnWeaponEnergy      = main.Field <GameObject>("filterBtnWeaponEnergy");
            filterBtnWeaponMissile     = main.Field <GameObject>("filterBtnWeaponMissile");
            filterBtnWeaponSmall       = main.Field <GameObject>("filterBtnWeaponSmall");
            filterBtnEquipmentJumpjet  = main.Field <GameObject>("filterBtnEquipmentJumpjet");
            filterBtnEquipmentHeatsink = main.Field <GameObject>("filterBtnEquipmentHeatsink");
            filterBtnEquipmentUpgrade  = main.Field <GameObject>("filterBtnEquipmentUpgrade");
        }
예제 #26
0
        public static void PreInit(MechLabPanel mechLabPanel, MechLabInventoryWidget mechLabInventoryWidget)
        {
            if (tabs == null)
            {
                Control.LogDebug("No tabs found - create new");
                tabs    = new List <HBSDOTweenToggle>();
                buttons = new List <button_info>();
                InitTabs(mechLabPanel, mechLabInventoryWidget);
            }
            else if (mechlab != mechLabPanel)
            {
                Control.LogDebug("other mechlab widget, droping");
                foreach (var toggle in tabs)
                {
                    if (toggle != null)
                    {
                        toggle.gameObject.Destroy();
                    }
                }
                tabs.Clear();

                foreach (var b in buttons)
                {
                    if (b.go != null)
                    {
                        b.go.Destroy();
                    }
                }

                buttons.Clear();
                InitTabs(mechLabPanel, mechLabInventoryWidget);
            }
            else
            {
                Control.LogDebug("already modified");
                widget = mechLabInventoryWidget;
            }
        }
예제 #27
0
        internal static void RefreshAvailability(MechLabInventoryWidget widget, float tonnage)
        {
            if (tonnage <= 0)
            {
                return;
            }

            foreach (var element in widget.localInventory)
            {
                MechComponentDef componentDef;
                if (element.controller != null)
                {
                    componentDef = element.controller.componentDef;
                }
                else if (element.ComponentRef != null)
                {
                    componentDef = element.ComponentRef.Def;
                }
                else
                {
                    continue;
                }

                var engine = componentDef.GetComponent <EngineCoreDef>();
                if (engine == null)
                {
                    continue;
                }

                var movement = engine.GetMovement(tonnage);
                if (movement.Mountable)
                {
                    continue;
                }

                element.gameObject.SetActive(false);
            }
        }
예제 #28
0
        internal static void Postfix(MechLabInventoryWidget __instance, float ___mechTonnage,
                                     List <InventoryItemElement_NotListView> ___localInventory)
        {
            foreach (var item in ___localInventory)
            {
                //if item already hidden - skip
                if (!item.GameObject.activeSelf)
                {
                    continue;
                }

                var mechlab = __instance.ParentDropTarget as MechLabPanel;

                foreach (var filter in item.ComponentRef.GetComponents <IMechLabFilter>())
                {
                    if (!filter.CheckFilter(mechlab))
                    {
                        item.gameObject.SetActive(false);
                        break;
                    }
                }
            }
        }
예제 #29
0
        internal static void RefreshAvailability(MechLabInventoryWidget widget, float tonnage)
        {
            if (tonnage <= 0)
            {
                return;
            }

            foreach (var element in widget.localInventory)
            {
                MechComponentDef componentDef;
                if (element.controller != null)
                {
                    componentDef = element.controller.componentDef;
                }
                else if (element.ComponentRef != null)
                {
                    componentDef = element.ComponentRef.Def;
                }
                else
                {
                    continue;
                }

                var engine = componentDef.GetEngineDef();
                if (engine == null)
                {
                    continue;
                }

                if (Control.calc.CalcAvailability(engine, tonnage))
                {
                    continue;
                }

                element.gameObject.SetActive(false);
            }
        }
 public static void RemoveItem(this MechLabInventoryWidget inventoryWidget, InventoryItemElement_NotListView item)
 {
     if (item.controller != null)
     {
         //Logger.Debug("[Extensions.MechLabInventoryWidget.RemoveItem] item.controller != null");
         if (item.controller.quantity > 1)
         {
             item.controller.ModifyQuantity(-1);
             //Logger.Debug("[Extensions.MechLabInventoryWidget.RemoveItem] item.controller.quantity: " + item.controller.quantity);
         }
         else
         {
             //Logger.Debug("[Extensions.MechLabInventoryWidget.RemoveItem] item.controller.quantity <= 1: " + item.controller.quantity);
             inventoryWidget.localInventory.Remove(item);
             item.SetRadioParent(null);
             item.controller.Pool();
             ReflectionHelper.InvokePrivateMethode(inventoryWidget, "EndOfFrameScrollBarMovement", null);
         }
     }
     else if (item.Quantity > 1)
     {
         item.ModifyQuantity(-1);
     }
     else
     {
         inventoryWidget.localInventory.Remove(item);
         item.SetRadioParent(null);
         ReflectionHelper.InvokePrivateMethode(inventoryWidget, "EndOfFrameScrollBarMovement", null);
     }
     if (!inventoryWidget.localInventory.Contains(item))
     {
         //Logger.Debug("[Extensions.MechLabInventoryWidget.RemoveItem] !inventoryWidget.localInventory.Contains(item): HIDING item");
         item.ElementVisible = false;
     }
     inventoryWidget.ApplySorting(true);
 }