public static bool ItemTransferValidNew(InventoryItem invitem, UIInventoryGridItem from, UIInventoryGridItem to,
                                                out string error, bool alreadyHeld = false)
        {
            UIInventoryItemZone owner;

            error = string.Empty;
            if (invitem == null || invitem.baseItem == null)
            {
                return(true);
            }
            if (from == to && UIGlobalInventory.Instance.DragOwnerIsSame())
            {
                return(true);
            }
            InventoryItem       inventoryItem       = invitem;
            UIInventoryGridItem uIInventoryGridItem = from;

            if (!to)
            {
                owner = null;
            }
            else
            {
                owner = to.Owner;
            }
            if (!UIInventoryGridItem.ItemTransferValid(inventoryItem, uIInventoryGridItem, owner, out error, alreadyHeld))
            {
                return(false);
            }
            if (!UIInventoryGridItem.ItemTakeValid(to, out error))
            {
                return(false);
            }

            //!+ ADDED CODE
            // this is to disallow items TO
            if (IEModOptions.UnlockCombatInv && GameState.InCombat &&
                (to.EquipmentSlot == Equippable.EquipmentSlot.Armor || ForbiddenToMoveItems.Contains(invitem.BaseItem.Name)))
            {
                // doesn't allow equipping/unequipping armor during combat, as well as summoned magical items such as druid cat claws
                error = GUIUtils.GetText(0xd7);
                return(false);
            }
            //!+ END ADD

            if (to && (to.Locked || to.Blocked || !to.EquipmentModifyValid()))
            {
                return(false);
            }
            if (to && to.EquipmentSlot != Equippable.EquipmentSlot.None)
            {
                error = GUIUtils.GetText(217);
                Equippable        equippable = invitem.baseItem as Equippable;
                EquipmentSoulbind component  = invitem.baseItem.GetComponent <EquipmentSoulbind>();
                if (!equippable)
                {
                    return(false);
                }
                if (!equippable.CanUseSlot(to.EquipmentSlot))
                {
                    return(false);
                }
                if (to.WeaponSetBuddy != null && !to.WeaponSetBuddy.Empty)
                {
                    if (equippable.BothPrimaryAndSecondarySlot)
                    {
                        error = GUIUtils.GetText(1737);
                        return(false);
                    }
                    Equippable invItem = to.WeaponSetBuddy.InvItem.baseItem as Equippable;
                    if (invItem && invItem.BothPrimaryAndSecondarySlot)
                    {
                        error = GUIUtils.GetText(1737);
                        return(false);
                    }
                }
                Equipment selectedEquipment = UIInventoryManager.Instance.Equipment.SelectedEquipment;
                if (selectedEquipment && selectedEquipment.IsSlotLocked(to.EquipmentSlot))
                {
                    return(false);
                }
                Equippable.CantEquipReason cantEquipReason =
                    equippable.WhyCantEquip(UIInventoryManager.Instance.SelectedCharacter.gameObject);
                if (cantEquipReason != Equippable.CantEquipReason.None)
                {
                    CharacterStats selectedCharacter = UIInventoryManager.Instance.SelectedCharacter;
                    switch (cantEquipReason)
                    {
                    case Equippable.CantEquipReason.EquipmentLocked: {
                        object[] name = new object[] {
                            invitem.baseItem.Name,
                            CharacterStats.Name(selectedCharacter)
                        };
                        error = GUIUtils.Format(1003, name);
                        break;
                    }

                    case Equippable.CantEquipReason.ClassMismatch: {
                        error = GUIUtils.Format(1003, new object[] {
                                invitem.baseItem.Name,
                                GUIUtils.GetClassString(selectedCharacter.CharacterClass, selectedCharacter.Gender)
                            });
                        break;
                    }

                    case Equippable.CantEquipReason.SoulboundToOther: {
                        error = GUIUtils.Format(2038, new object[] {
                                equippable.Name,
                                CharacterStats.Name(component.BoundGuid)
                            });
                        break;
                    }

                    default: {
                        goto case Equippable.CantEquipReason.EquipmentLocked;
                    }
                    }
                    return(false);
                }
            }
            if (from.EquipmentSlot != Equippable.EquipmentSlot.None)
            {
                Equipment equipment = UIInventoryManager.Instance.Equipment.SelectedEquipment;
                if (equipment && to && equipment.IsSlotLocked(to.EquipmentSlot))
                {
                    return(false);
                }
            }
            if (to && to.EquipmentSlot == Equippable.EquipmentSlot.Grimoire &&
                UIInventoryManager.Instance.SelectedCharacter.SpellCastingDisabled > 0)
            {
                error = GUIUtils.GetText(1738);
                return(false);
            }
            if (to && to.RestrictByFilter != UIInventoryFilter.ItemFilterType.NONE &&
                (invitem.baseItem.FilterType & to.RestrictByFilter) == UIInventoryFilter.ItemFilterType.NONE)
            {
                if (to.OrAllowEquipment == Equippable.EquipmentSlot.None || !(invitem.baseItem is Equippable) ||
                    !(invitem.baseItem as Equippable).CanUseSlot(to.OrAllowEquipment))
                {
                    return(false);
                }
            }
            return(true);
        }
        public static bool ItemTransferValidNew(InventoryItem invitem, UIInventoryGridItem from, UIInventoryGridItem to, out string error)
        {
            error = string.Empty;
            if ((invitem == null) || (invitem.baseItem == null))
            {
                return(true);
            }
            if ((@from == to) && UIGlobalInventory.Instance.DragOwnerIsSame())
            {
                return(true);
            }
            if (!ItemTransferValid(invitem, @from, to.Owner, out error))
            {
                return(false);
            }

            // this is to disallow items TO
            // added code
            if (IEModOptions.UnlockCombatInv && GameState.InCombat && (to.EquipmentSlot == Equippable.EquipmentSlot.Armor || ForbiddenToMoveItems.Contains(invitem.BaseItem.Name)))             // added this line
            {
                error = GUIUtils.GetText(0xd7);
                return(false);                // added this line // doesn't allow equipping/unequipping armor during combat, as well as summoned magical items such as druid cat claws
            }
            // end of added code

            if ((to.Locked || to.Blocked) || !to.EquipmentModifyValid())
            {
                return(false);
            }
            if (to.EquipmentSlot != Equippable.EquipmentSlot.None)
            {
                error = GUIUtils.GetText(0xd9);
                Equippable baseItem = invitem.baseItem as Equippable;
                if (baseItem == null)
                {
                    return(false);
                }
                if (!baseItem.CanUseSlot(to.EquipmentSlot))
                {
                    return(false);
                }
                if ((to.WeaponSetBuddy != null) && !to.WeaponSetBuddy.Empty)
                {
                    if (baseItem.BothPrimaryAndSecondarySlot)
                    {
                        error = GUIUtils.GetText(0x6c9);
                        return(false);
                    }
                    Equippable equippable2 = to.WeaponSetBuddy.InvItem.baseItem as Equippable;
                    if ((equippable2 != null) && equippable2.BothPrimaryAndSecondarySlot)
                    {
                        error = GUIUtils.GetText(0x6c9);
                        return(false);
                    }
                }
                Equipment selectedEquipment = UIInventoryManager.Instance.Equipment.SelectedEquipment;
                if ((selectedEquipment != null) && selectedEquipment.IsSlotLocked(to.EquipmentSlot))
                {
                    return(false);
                }
                if (!baseItem.CanEquip(UIInventoryManager.Instance.SelectedCharacter.gameObject))
                {
                    CharacterStats selectedCharacter = UIInventoryManager.Instance.SelectedCharacter;
                    object[]       parameters        = new object[] { invitem.baseItem.Name, GUIUtils.GetClassString(selectedCharacter.CharacterClass, selectedCharacter.Gender) };
                    error = GUIUtils.Format(0x3eb, parameters);
                    return(false);
                }
            }
            if (@from.EquipmentSlot != Equippable.EquipmentSlot.None)
            {
                Equipment equipment2 = UIInventoryManager.Instance.Equipment.SelectedEquipment;
                if ((equipment2 != null) && equipment2.IsSlotLocked(to.EquipmentSlot))
                {
                    return(false);
                }
            }
            if ((to.EquipmentSlot == Equippable.EquipmentSlot.Grimoire) && (UIInventoryManager.Instance.SelectedCharacter.SpellCastingDisabled > 0))
            {
                error = GUIUtils.GetText(0x6ca);
                return(false);
            }
            if (((to.RestrictByFilter != UIInventoryFilter.ItemFilterType.NONE) && ((invitem.baseItem.FilterType & to.RestrictByFilter) == UIInventoryFilter.ItemFilterType.NONE)) && (((to.OrAllowEquipment == Equippable.EquipmentSlot.None) || !(invitem.baseItem is Equippable)) || !(invitem.baseItem as Equippable).CanUseSlot(to.OrAllowEquipment)))
            {
                return(false);
            }
            return(true);
        }