public void DoWork(Colony colony, RoamingJobState machineState) { if (machineState.NextTimeForWork < Time.SecondsSinceStartDouble && machineState.GetActionEnergy(MachineConstants.REPAIR) > 0 && machineState.GetActionEnergy(MachineConstants.REFUEL) > 0) { machineState.SubtractFromActionEnergy(MachineConstants.REPAIR, 0.02f); machineState.SubtractFromActionEnergy(MachineConstants.REFUEL, 0.05f); if (World.TryGetTypeAt(machineState.Position.Add(0, -1, 0), out ItemTypes.ItemType itemBelow) && itemBelow.CustomDataNode != null && itemBelow.CustomDataNode.TryGetAs("minerIsMineable", out bool minable) && minable) { var itemList = itemBelow.OnRemoveItems; if (itemList != null && itemList.Count > 0) { var mineTime = itemBelow.CustomDataNode.GetAsOrDefault("minerMiningTime", machineState.RoamingJobSettings.WorkTime); machineState.NextTimeForWork = mineTime + Time.SecondsSinceStartDouble; var items = machineState.TempValues.GetOrDefault <List <InventoryItem> >("MinedItems", new List <InventoryItem>()); int remainingItems = Math.RoundToInt(machineState.GetActionEnergy(MachineConstants.INVENTORY) / .05f) - items.Count; if (remainingItems != 0) { for (var i = 0; i < itemList.Count; i++) { if (Random.NextDouble() <= itemList[i].chance) { if (remainingItems != 0) { items.Add(itemList[i].item); remainingItems--; machineState.SubtractFromActionEnergy(MachineConstants.INVENTORY, .05f); } } } } machineState.TempValues.Set("MinedItems", items); if (remainingItems != 0) { AudioManager.SendAudio(machineState.Position.Vector, GameLoader.NAMESPACE + ".MiningMachineAudio"); Indicator.SendIconIndicatorNear(machineState.Position.Add(0, 1, 0).Vector, new IndicatorState(mineTime, itemList.FirstOrDefault().item.Type)); } else { machineState.SetActionEnergy(MachineConstants.INVENTORY, 0); Indicator.SendIconIndicatorNear(machineState.Position.Add(0, 1, 0).Vector, new IndicatorState(mineTime, GameLoader.NAMESPACE + ".Inventory", true, false)); } } else { machineState.NextTimeForWork = machineState.RoamingJobSettings.WorkTime + Time.SecondsSinceStartDouble; Indicator.SendIconIndicatorNear(machineState.Position.Add(0, 1, 0).Vector, new IndicatorState(machineState.RoamingJobSettings.WorkTime, ColonyBuiltIn.ItemTypes.ERRORIDLE.Name)); } } else { machineState.NextTimeForWork = machineState.RoamingJobSettings.WorkTime + Time.SecondsSinceStartDouble; Indicator.SendIconIndicatorNear(machineState.Position.Add(0, 1, 0).Vector, new IndicatorState(machineState.RoamingJobSettings.WorkTime, ColonyBuiltIn.ItemTypes.ERRORIDLE.Name)); } } }