Example #1
0
        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));
                }
            }
        }