private static float ApproxDaysWorthOfWater(List <Pawn> pawns, List <ThingCount> extraWater, IgnorePawnsInventoryMode ignoreInventory)
        {
            if (!DaysWorthOfWaterCalculator.AnyNonTerrainDrinkingPawn(pawns))
            {
                return(1000f);
            }
            List <ThingCount> tmpWater = new List <ThingCount>();

            tmpWater.Clear();
            if (extraWater != null)
            {
                for (int i = 0; i < extraWater.Count; i++)
                {
                    bool canGetWater = false;
                    for (int j = 0; j < extraWater[i].ThingDef.comps.Count; j++)
                    {
                        var compprop = extraWater[i].ThingDef.comps[j] as CompProperties_WaterSource;
                        if (compprop != null && compprop.sourceType == CompProperties_WaterSource.SourceType.Item && compprop.waterAmount > 0.0f)
                        {
                            canGetWater = true;
                            break;
                        }
                    }
                    if (canGetWater && extraWater[i].Count > 0)
                    {
                        tmpWater.Add(extraWater[i]);
                    }
                }
            }
            for (int j = 0; j < pawns.Count; j++)
            {
                if (!InventoryCalculatorsUtility.ShouldIgnoreInventoryOf(pawns[j], ignoreInventory))
                {
                    ThingOwner <Thing> innerContainer = pawns[j].inventory.innerContainer;
                    for (int k = 0; k < innerContainer.Count; k++)
                    {
                        if (innerContainer[k].CanGetWater())
                        {
                            tmpWater.Add(new ThingCount(innerContainer[k].def, innerContainer[k].stackCount));
                        }
                    }
                }
            }
            if (!tmpWater.Any <ThingCount>())
            {
                return(0f);
            }
            List <float> tmpDaysWorthOfFoodPerPawn      = new List <float>();
            List <bool>  tmpAnyFoodLeftIngestibleByPawn = new List <bool>();

            tmpDaysWorthOfFoodPerPawn.Clear();
            tmpAnyFoodLeftIngestibleByPawn.Clear();
            for (int l = 0; l < pawns.Count; l++)
            {
                tmpDaysWorthOfFoodPerPawn.Add(0f);
                tmpAnyFoodLeftIngestibleByPawn.Add(true);
            }
            float num = 0f;
            bool  flag;

            do
            {
                flag = false;
                for (int m = 0; m < pawns.Count; m++)
                {
                    Pawn pawn = pawns[m];
                    if (tmpAnyFoodLeftIngestibleByPawn[m])
                    {
                        do
                        {
                            int num2 = DaysWorthOfWaterCalculator.BestEverGetWaterIndexFor(pawns[m], tmpWater);
                            if (num2 < 0)
                            {
                                tmpAnyFoodLeftIngestibleByPawn[m] = false;
                                break;
                            }
                            CompProperties_WaterSource compprop = null;
                            for (int x = 0; x < tmpWater[num2].ThingDef.comps.Count; x++)
                            {
                                compprop = tmpWater[num2].ThingDef.comps[x] as CompProperties_WaterSource;
                                if (compprop != null && compprop.sourceType == CompProperties_WaterSource.SourceType.Item)
                                {
                                    break;
                                }
                            }
                            if (compprop == null)
                            {
                                tmpAnyFoodLeftIngestibleByPawn[m] = false;
                                break;
                            }
                            Need_Water need_water = pawn.needs.water();
                            if (need_water == null)
                            {
                                tmpAnyFoodLeftIngestibleByPawn[m] = false;
                                break;
                            }
                            float num3 = Mathf.Min(compprop.waterAmount, need_water.WaterAmountBetweenThirstyAndHealthy);
                            float num4 = num3 / need_water.WaterAmountBetweenThirstyAndHealthy * (float)need_water.TicksUntilThirstyWhenHealthy / 60000f;
                            tmpDaysWorthOfFoodPerPawn[m] = tmpDaysWorthOfFoodPerPawn[m] + num4;
                            tmpWater[num2] = tmpWater[num2].WithCount(tmpWater[num2].Count - 1);
                            flag           = true;
                        }while (tmpDaysWorthOfFoodPerPawn[m] < num);
                        num = Mathf.Max(num, tmpDaysWorthOfFoodPerPawn[m]);
                    }
                }
            }while (flag);
            float num6 = 1000f;

            for (int n = 0; n < pawns.Count; n++)
            {
                num6 = Mathf.Min(num6, tmpDaysWorthOfFoodPerPawn[n]);
            }
            return(num6);
        }
        private static float ApproxDaysWorthOfWater(
            List <Pawn> pawns,
            List <ThingDefCount> extraWater,
            IgnorePawnsInventoryMode ignoreInventory)
        {
            if (!AnyNonTerrainDrinkingPawn(pawns))
            {
                return(1000f);
            }

            var tmpWater = new List <ThingDefCount>();

            tmpWater.Clear();

            if (extraWater != null)
            {
                foreach (var thingDefCount in extraWater)
                {
                    var canGetWater = false;
                    foreach (var compProperties in thingDefCount.ThingDef.comps)
                    {
                        if (!(compProperties is CompProperties_WaterSource compprop) ||
                            compprop.sourceType != CompProperties_WaterSource.SourceType.Item ||
                            !(compprop.waterAmount > 0.0f))
                        {
                            continue;
                        }

                        canGetWater = true;
                        break;
                    }

                    if (canGetWater && thingDefCount.Count > 0)
                    {
                        tmpWater.Add(thingDefCount);
                    }
                }
            }

            foreach (var pawn in pawns)
            {
                if (InventoryCalculatorsUtility.ShouldIgnoreInventoryOf(pawn, ignoreInventory))
                {
                    continue;
                }

                var innerContainer = pawn.inventory.innerContainer;
                foreach (var thing in innerContainer)
                {
                    if (thing.CanGetWater())
                    {
                        tmpWater.Add(new ThingDefCount(thing.def, thing.stackCount));
                    }
                }
            }

            if (!tmpWater.Any())
            {
                return(0f);
            }

            var tmpDaysWorthOfFoodPerPawn      = new List <float>();
            var tmpAnyFoodLeftIngestibleByPawn = new List <bool>();

            tmpDaysWorthOfFoodPerPawn.Clear();
            tmpAnyFoodLeftIngestibleByPawn.Clear();
            for (var l = 0; l < pawns.Count; l++)
            {
                tmpDaysWorthOfFoodPerPawn.Add(0f);
                tmpAnyFoodLeftIngestibleByPawn.Add(true);
            }

            var  num = 0f;
            bool flag;

            do
            {
                flag = false;
                for (var m = 0; m < pawns.Count; m++)
                {
                    var pawn = pawns[m];
                    if (!tmpAnyFoodLeftIngestibleByPawn[m])
                    {
                        continue;
                    }

                    do
                    {
                        var num2 = BestEverGetWaterIndexFor(tmpWater);
                        if (num2 < 0)
                        {
                            tmpAnyFoodLeftIngestibleByPawn[m] = false;
                            break;
                        }

                        CompProperties_WaterSource compprop = null;
                        foreach (var compProperties in tmpWater[num2].ThingDef.comps)
                        {
                            compprop = compProperties as CompProperties_WaterSource;
                            if (compprop != null && compprop.sourceType == CompProperties_WaterSource.SourceType.Item)
                            {
                                break;
                            }
                        }

                        if (compprop == null)
                        {
                            tmpAnyFoodLeftIngestibleByPawn[m] = false;
                            break;
                        }

                        var need_water = pawn.needs.Water();
                        if (need_water == null)
                        {
                            tmpAnyFoodLeftIngestibleByPawn[m] = false;
                            break;
                        }

                        var num3 = Mathf.Min(compprop.waterAmount, need_water.WaterAmountBetweenThirstyAndHealthy);
                        var num4 = num3 / need_water.WaterAmountBetweenThirstyAndHealthy
                                   * need_water.TicksUntilThirstyWhenHealthy / 60000f;
                        tmpDaysWorthOfFoodPerPawn[m] = tmpDaysWorthOfFoodPerPawn[m] + num4;
                        tmpWater[num2] = tmpWater[num2].WithCount(tmpWater[num2].Count - 1);
                        flag           = true;
                    }while (tmpDaysWorthOfFoodPerPawn[m] < num);

                    num = Mathf.Max(num, tmpDaysWorthOfFoodPerPawn[m]);
                }
            }while (flag);

            var num6 = 1000f;

            for (var n = 0; n < pawns.Count; n++)
            {
                num6 = Mathf.Min(num6, tmpDaysWorthOfFoodPerPawn[n]);
            }

            return(num6);
        }