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"); } } }
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); } } }