예제 #1
0
            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;
            }
예제 #2
0
        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);
        }