コード例 #1
0
        public void ProcessMachineBuildings(List <MachineBuildingConfig> buildingConfigs)
        {
            var buildings = new List <MachineBuilding>();
            var farms     = Game1.locations.OfType <Farm>().ToList();

            if (buildingConfigs != null)
            {
                farms.ForEach(t =>
                {
                    var buildingsList = t.buildings.Where(b => buildingConfigs.Any(x => x.Name == b.buildingType)).ToList();
                    buildingsList.ForEach(b =>
                    {
                        var config = buildingConfigs.FirstOrDefault(x => x.Name == b.buildingType);
                        if (config == null)
                        {
                            return;
                        }

                        Chest inputChest = null;
                        if (b.GetType().GetField("input") != null)
                        {
                            inputChest = (Chest)b.GetType().GetField("input").GetValue(b);
                        }

                        Chest outputChest = null;
                        if (b.GetType().GetField("output") != null)
                        {
                            outputChest = (Chest)b.GetType().GetField("output").GetValue(b);
                        }

                        var machineBuilding = new MachineBuilding
                        {
                            BuildingConfig = config,
                            Input          = inputChest,
                            Output         = outputChest,
                            InputLocation  = new Vector2(b.tileX + config.InputXOffset, b.tileY + config.InputYOffset),
                            OutputLocation = new Vector2(b.tileX + config.OutputXOffset, b.tileY + config.OutputYOffset)
                        };
                        buildings.Add(machineBuilding);
                    });
                });
            }

            _monitor.Log("Starting search for connected locations at Farm");
            foreach (var building in buildings)
            {
                if (building.BuildingConfig.HasInput)
                {
                    ProcessMachineBuilding(building, "IN");
                }

                if (building.BuildingConfig.HasOutput)
                {
                    ProcessMachineBuilding(building, "OUT");
                }
            }
        }
コード例 #2
0
        private static void ProcessMachineBuilding(MachineBuilding building, string direction)
        {
            var connectedTileList = new List <ConnectedTile>
            {
                new ConnectedTile
                {
                    Location = (direction == "IN") ? building.InputLocation : building.OutputLocation,
                    Object   = (direction == "IN") ? building.Input : building.Output
                }
            };

            ItemFinder.FindConnectedLocations(Game1.getLocationFromName("Farm"), direction == "IN" ? building.InputLocation : building.OutputLocation, connectedTileList, false);
            var connectedTile = connectedTileList.FirstOrDefault(c => c.Chest != null);
            var chest         = connectedTile?.Chest;

            if (chest != null)
            {
                var items = new List <Object>();
                _monitor.Log($"{building.BuildingConfig.Name} found and chest connected.  Processing {direction.ToLower()}put.");
                try
                {
                    var i = 0;
                    switch (direction)
                    {
                    case "IN":
                        chest.items.Where(t =>
                        {
                            if (building.BuildingConfig.AcceptableObjects != null &&
                                building.BuildingConfig.AcceptableObjects.Any(b =>
                            {
                                if (b.Name != t.Name)
                                {
                                    return(b.Index == t.parentSheetIndex);
                                }

                                return(true);
                            }))
                            {
                                return(true);
                            }

                            return(building.BuildingConfig.AcceptableCategories != null && building.BuildingConfig.AcceptableCategories.Any(b => b.Index == t.category));
                        }).ToList().ForEach(x =>
                        {
                            if (building.Input.items.Count >= 36)
                            {
                                return;
                            }

                            var item = x as Object;

                            if (item != null)
                            {
                                items.Add(item);
                                ++i;
                            }
                        });
                        break;

                    case "OUT":
                        building.Output.items.ForEach(x =>
                        {
                            if (chest.items.Count >= 36)
                            {
                                return;
                            }

                            var item = x as Object;

                            if (item != null)
                            {
                                item.stack = x.Stack;
                                {
                                    var newItem   = item;
                                    newItem.stack = item.stack;
                                    items.Add(newItem);
                                    ++i;
                                }
                            }
                        });
                        break;
                    }

                    ItemHelper.TransferBetweenInventories((direction == "IN") ? chest : building.Output, (direction == "IN") ? building.Input : chest, items);
                    _monitor.Log($"{building.BuildingConfig.Name} {direction.ToLower()}put processed: {i} stacks moved.", LogLevel.Info);
                }
                catch (Exception exception)
                {
                    _monitor.Log(exception.Message, LogLevel.Error);
                }
            }
        }