示例#1
0
 public static void AddThings(Dialog_FormCaravan dialog, Map map)
 {
     //Add manifest
     if (Mod.settings.caravanSaveManifest && SaveManifest.caravan &&
         map == SaveManifest.savedMap && SaveManifest.savedMap != null)
     {
         foreach (ThingCountUNLIMITED thingCount in SaveManifest.savedManifest)
         {
             Log.Message($"Loading {thingCount.thing}:{thingCount.count}");
             TransferableOneWay transferableOneWay = TransferableUtility.TransferableMatching <TransferableOneWay>(thingCount.thing, dialog.transferables, TransferAsOneMode.PodsOrCaravanPacking);
             transferableOneWay?.AdjustTo(transferableOneWay.ClampAmount(transferableOneWay.CountToTransfer + thingCount.count));
         }
     }
     //Add selection
     else if (Mod.settings.caravanLoadSelection)
     {
         foreach (object obj in Find.Selector.SelectedObjectsListForReading.Where(o => o is Thing))
         {
             if (obj is Thing thing)
             {
                 Log.Message($"Adding Selected {thing}:{thing.stackCount}");
                 TransferableOneWay transferableOneWay = TransferableUtility.TransferableMatching <TransferableOneWay>(thing, dialog.transferables, TransferAsOneMode.PodsOrCaravanPacking);
                 transferableOneWay?.AdjustTo(transferableOneWay.ClampAmount(transferableOneWay.CountToTransfer + thing.stackCount));
             }
         }
     }
 }
示例#2
0
        private void RemoveCarriedItemFromTransferablesOrDrop(Thing carried, Pawn carrier, List <TransferableOneWay> transferables)
        {
            TransferableOneWay transferableOneWay = TransferableUtility.TransferableMatchingDesperate(carried, transferables, TransferAsOneMode.PodsOrCaravanPacking);
            int num;

            if (transferableOneWay == null)
            {
                num = carried.stackCount;
            }
            else if (transferableOneWay.CountToTransfer >= carried.stackCount)
            {
                transferableOneWay.AdjustBy(-carried.stackCount);
                transferableOneWay.things.Remove(carried);
                num = 0;
            }
            else
            {
                num = carried.stackCount - transferableOneWay.CountToTransfer;
                transferableOneWay.AdjustTo(0);
            }
            if (num > 0)
            {
                Thing thing = carried.SplitOff(num);
                if (carrier.SpawnedOrAnyParentSpawned)
                {
                    GenPlace.TryPlaceThing(thing, carrier.PositionHeld, carrier.MapHeld, ThingPlaceMode.Near, null, null);
                }
                else
                {
                    thing.Destroy(DestroyMode.Vanish);
                }
            }
        }
        public void AddToTheToLoadList(TransferableOneWay t, int count)
        {
            if (!t.HasAnyThing || t.CountToTransfer <= 0)
            {
                return;
            }

            if (leftToLoad == null)
            {
                leftToLoad = new List <TransferableOneWay>();
            }

            if (TransferableUtility.TransferableMatching(t.AnyThing, leftToLoad,
                                                         TransferAsOneMode.PodsOrCaravanPacking) != null)
            {
                Log.Error("Transferable already exists.");
                return;
            }

            var transferableOneWay = new TransferableOneWay();

            leftToLoad.Add(transferableOneWay);
            transferableOneWay.things.AddRange(t.things);
            transferableOneWay.AdjustTo(count);
        }
示例#4
0
        public static float ApproxDaysWorthOfFood_Ship(ShipBase ship, List <TransferableOneWay> transferables, bool canEatPlants)
        {
            tmpTransferables.Clear();

            for (int i = 0; i < transferables.Count; i++)
            {
                TransferableOneWay oneWay = new TransferableOneWay();
                oneWay.things.AddRange(transferables[i].things);
                oneWay.AdjustTo(transferables[i].CountToTransfer);
                Pawn pawn = oneWay.AnyThing as Pawn;

                tmpTransferables.Add(oneWay);
            }

            foreach (Pawn current in ship.GetDirectlyHeldThings().Where(x => x is Pawn))
            {
                DropShipUtility.AddThingsToTransferables(tmpTransferables, current);
            }
            for (int i = 0; i < ship.GetDirectlyHeldThings().Count; i++)
            {
                if (!(ship.GetDirectlyHeldThings()[i] is Pawn))
                {
                    DropShipUtility.AddThingsToTransferables(tmpTransferables, ship.GetDirectlyHeldThings()[i]);
                }
            }
            return(DaysWorthOfFoodCalculator.ApproxDaysWorthOfFood(tmpTransferables, canEatPlants, IgnorePawnsInventoryMode.DontIgnore));
        }
示例#5
0
        public static float ApproxDaysWorthOfFood_Ship(ShipBase ship, List <TransferableOneWay> transferables, bool canEatPlants)
        {
            tmpTransferables.Clear();

            for (int i = 0; i < transferables.Count; i++)
            {
                TransferableOneWay oneWay = new TransferableOneWay();
                oneWay.things.AddRange(transferables[i].things);
                oneWay.AdjustTo(transferables[i].CountToTransfer);
                Pawn pawn = oneWay.AnyThing as Pawn;

                tmpTransferables.Add(oneWay);
            }

            foreach (Pawn current in ship.GetDirectlyHeldThings().Where(x => x is Pawn))
            {
                DropShipUtility.AddThingsToTransferables(tmpTransferables, current);
            }
            for (int i = 0; i < ship.GetDirectlyHeldThings().Count; i++)
            {
                if (!(ship.GetDirectlyHeldThings()[i] is Pawn))
                {
                    DropShipUtility.AddThingsToTransferables(tmpTransferables, ship.GetDirectlyHeldThings()[i]);
                }
            }
            var potentialFood = tmpTransferables.Where(t => (t.AnyThing is Pawn) == false).SelectMany(x => x.things).ToList();
            var pawns         = tmpTransferables.Where(t => t.AnyThing is Pawn).SelectMany(x => x.things).Cast <Pawn>().ToList();

            return(DaysWorthOfFoodCalculator.ApproxDaysWorthOfFood(pawns, potentialFood, 0, IgnorePawnsInventoryMode.DontIgnore, ship.Faction));
        }
 public static void Load(List <TransferableOneWay> transferables)
 {
     foreach (ThingCountUNLIMITED thingCount in SaveManifest.savedManifest)
     {
         Log.Message($"Loading {thingCount.thing}:{thingCount.count}");
         TransferableOneWay transferableOneWay = TransferableUtility.TransferableMatching <TransferableOneWay>(thingCount.thing, transferables, TransferAsOneMode.PodsOrCaravanPacking);
         transferableOneWay?.AdjustTo(transferableOneWay.ClampAmount(transferableOneWay.CountToTransfer + thingCount.count));
     }
 }
示例#7
0
        public bool TryInsertThing(Thing thing)
        {
            if (requester.CanAcceptThing(thing))
            {
                transferableThings.things.Add(thing);

                transferableThings.AdjustTo(this.reqAmount);

                return(true);
            }
            else
            {
                return(false);
            }
        }
示例#8
0
 public static void Postfix(Dialog_LoadTransporters __instance, Map ___map)
 {
     //Add manifest
     if (Mod.settings.caravanSaveManifest && !SaveManifest.caravan &&
         ___map == SaveManifest.savedMap && SaveManifest.savedMap != null)
     {
         foreach (ThingCountUNLIMITED thingCount in SaveManifest.savedManifest)
         {
             Log.Message($"Loading {thingCount.thing}:{thingCount.count}");
             TransferableOneWay transferableOneWay = TransferableUtility.TransferableMatching <TransferableOneWay>(thingCount.thing, __instance.Transferables(), TransferAsOneMode.PodsOrCaravanPacking);
             transferableOneWay?.AdjustTo(transferableOneWay.ClampAmount(transferableOneWay.CountToTransfer + thingCount.count));
         }
     }
     //No selection like caravans - you're already selecting pods!
 }
示例#9
0
        public void AddToTheToLoadList(TransferableOneWay t, int count)
        {
            if (!t.HasAnyThing || t.CountToTransfer <= 0)
            {
                //Log.Message("NoThingsToTransfer");
                return;
            }
            if (this.leftToLoad == null)
            {
                this.leftToLoad = new List <TransferableOneWay>();
            }
            if (TransferableUtility.TransferableMatching <TransferableOneWay>(t.AnyThing, this.leftToLoad) != null)
            {
                Log.Error("Transferable already exists.");
                return;
            }

            TransferableOneWay transferableOneWay = new TransferableOneWay();

            this.leftToLoad.Add(transferableOneWay);
            transferableOneWay.things.AddRange(t.things);
            transferableOneWay.AdjustTo(count);
        }