static bool GatherableInteraction_CharSpellTakeItem_Pre(GatherableInteraction __instance) { #region quit if (!__instance.m_validItem.TryAssign(out var item)) { return(true); } #endregion item.ReduceDurability(_gatheringDurabilityCost.Value.x + (_gatheringDurabilityCost.Value.y - 5) / 100f * item.MaxDurability); return(true); }
static bool GatherableInteraction_GetValidItem_Pre(GatherableInteraction __instance, ref Item __result, Character _character) { #region quit if (!_moreGatheringTools || !__instance.Gatherable.RequiredItem.TryAssign(out var requiredItem) || requiredItem.ItemID != "Mining Pick".ItemID() && requiredItem.ItemID != "Fishing Harpoon".ItemID()) { return(true); } #endregion // Cache Weapon.WeaponType requiredType = requiredItem.ItemID == "Fishing Harpoon".ItemID() ? Weapon.WeaponType.Spear_2H : Weapon.WeaponType.Mace_2H; List <Item> potentialTools = new List <Item>(); // Search bag & pouch List <ItemContainer> containers = new List <ItemContainer>(); if (_character.Inventory.EquippedBag.TryAssign(out var bag)) { containers.Add(bag.m_container); } if (_character.Inventory.Pouch.TryAssign(out var pouch)) { containers.Add(pouch); } foreach (var container in containers) { if (potentialTools.IsEmpty()) { foreach (var item in container.GetContainedItems()) { if (item.TryAs(out Weapon weapon) && weapon.Type == requiredType && weapon.DurabilityRatio > 0) { potentialTools.Add(item); } } } } // Search equipment if (potentialTools.IsEmpty() && _character.Inventory.Equipment.m_equipmentSlots[(int)EquipmentSlot.EquipmentSlotIDs.RightHand].EquippedItem.TryAs(out Weapon mainWeapon) && mainWeapon.Type == requiredType && mainWeapon.DurabilityRatio > 0) { potentialTools.Add(mainWeapon); } // Choose tool Item chosenTool = null; if (potentialTools.IsNotEmpty()) { int minValue = potentialTools.Min(tool => tool.RawCurrentValue); chosenTool = potentialTools.First(tool => tool.RawCurrentValue == minValue); } // Finalize __instance.m_validItem = chosenTool; __instance.m_isCurrentWeapon = chosenTool != null && chosenTool.IsEquipped; __result = chosenTool; return(false); }