static void Postfix(Player __instance, ref bool __result, Piece piece, Player.RequirementMode mode, HashSet <string> ___m_knownMaterial, Dictionary <string, int> ___m_knownStations) { if (__result) { return; } if (piece.m_craftingStation) { if (mode == Player.RequirementMode.IsKnown || mode == Player.RequirementMode.CanAlmostBuild) { if (!___m_knownStations.ContainsKey(piece.m_craftingStation.m_name)) { return; } } else if (!CraftingStation.HaveBuildStationInRange(piece.m_craftingStation.m_name, __instance.transform.position)) { return; } } if (piece.m_dlc.Length > 0 && !DLCMan.instance.IsDLCInstalled(piece.m_dlc)) { return; } List <Container> nearbyContainers = GetNearbyContainers(__instance.transform.position); foreach (Piece.Requirement requirement in piece.m_resources) { if (requirement.m_resItem && requirement.m_amount > 0) { if (mode == Player.RequirementMode.IsKnown) { if (!___m_knownMaterial.Contains(requirement.m_resItem.m_itemData.m_shared.m_name)) { return; } } else if (mode == Player.RequirementMode.CanAlmostBuild) { if (!__instance.GetInventory().HaveItem(requirement.m_resItem.m_itemData.m_shared.m_name)) { bool hasItem = false; foreach (Container c in nearbyContainers) { if (c.GetInventory().HaveItem(requirement.m_resItem.m_itemData.m_shared.m_name)) { hasItem = true; break; } } if (!hasItem) { return; } } } else if (mode == Player.RequirementMode.CanBuild && __instance.GetInventory().CountItems(requirement.m_resItem.m_itemData.m_shared.m_name) < requirement.m_amount) { int hasItems = __instance.GetInventory().CountItems(requirement.m_resItem.m_itemData.m_shared.m_name); foreach (Container c in nearbyContainers) { hasItems += c.GetInventory().CountItems(requirement.m_resItem.m_itemData.m_shared.m_name); if (hasItems >= requirement.m_amount) { break; } } if (hasItems < requirement.m_amount) { return; } } } } __result = true; }
static public bool HaveRequiredItemCount(Player player, Piece piece, Player.RequirementMode mode, Inventory inventory, HashSet <string> knownMaterial) { List <Container> nearbyContainers = GetNearbyContainers(player.transform.position); foreach (Piece.Requirement resource in piece.m_resources) { if ((bool)(UnityEngine.Object)resource.m_resItem && resource.m_amount > 0) { switch (mode) { case Player.RequirementMode.CanBuild: int inInventory = inventory.CountItems(resource.m_resItem.m_itemData.m_shared.m_name); int itemCount = inInventory; if (itemCount < resource.m_amount) { bool enoughInContainers = false; foreach (Container c in nearbyContainers) { try { itemCount += c.GetInventory().CountItems(resource.m_resItem.m_itemData.m_shared.m_name); if (itemCount >= resource.m_amount) { enoughInContainers = true; break; } } catch { } } if (!enoughInContainers) { return(false); } } continue; case Player.RequirementMode.IsKnown: if (!knownMaterial.Contains(resource.m_resItem.m_itemData.m_shared.m_name)) { return(false); } continue; case Player.RequirementMode.CanAlmostBuild: if (!inventory.HaveItem(resource.m_resItem.m_itemData.m_shared.m_name)) { bool enoughInContainers = false; foreach (Container c in nearbyContainers) { if (c.GetInventory().HaveItem(resource.m_resItem.m_itemData.m_shared.m_name)) { enoughInContainers = true; break; } } if (!enoughInContainers) { return(false); } } continue; default: continue; } } } return(true); }