private void CaravanDelivery()
        {
            PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms
            {
                faction   = SignedFaction.Faction,
                groupKind = PawnGroupKindDefOf.Trader,
                points    = Rand.Range(300, 1000),
                tile      = Settlement.Tile
            };

            Caravan = CaravanAIMaker.MakeCaravan(PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms), SignedFaction.Faction, Settlement.Tile, true, CaravanAIMaker.GetCaravanColor(SignedFaction.Faction, Faction.OfPlayer), true, true);
            TryGetRandomPawnGroupMaker(pawnGroupMakerParms, out PawnGroupMaker maker);

            foreach (var p in Caravan.PawnsListForReading)
            {
                p.inventory.innerContainer.Clear();
            }

            GenerateCarriers(pawnGroupMakerParms, maker, Items, Caravan);

            Items.ForEach(item =>
            {
                if (item is Pawn p)
                {
                    Find.WorldPawns.PassToWorld(p);
                    Caravan.AddPawn(p, false);
                }
            });
            Items.Clear();

            Caravan.pather.StartPath(DestinationMap.Tile, new CaravanArrivalAction_AIEnterCaravan(DestinationMap.Parent));

            Find.LetterStack.ReceiveLetter("TradeSchedulingAgreementComp_CaravanFormedTitle".Translate(), "TradeSchedulingAgreementComp_CaravanFormedDesc".Translate(), LetterDefOf.PositiveEvent, new LookTargets(Caravan));
        }
        protected override bool GiveWorkerTo(FactionArmy army, War war)
        {
            List <FactionInteraction> enemyis = war.GetEnemyList(army.Faction);

            if (enemyis != null)
            {
                if (Find.WorldObjects.Settlements.Where(x => x.Faction == army.Faction.Faction).TryRandomElement(out Settlement yourSettlement))
                {
                    //Settlement target = null;
                    //Observable.Start(() => TryFindEnemySettlement(yourSettlement, enemyis, out target)).ObserveOnMainThread().Subscribe(hasSettlement =>
                    //{
                    //    if (hasSettlement)
                    //    {
                    //        bool showCaravanInfo = (war.DeclaredWarFaction == war.PlayerInteraction && war.AssaultFactions.Contains(army.Faction))
                    //        || (war.DefendingFaction == war.PlayerInteraction && war.DefendingFactions.Contains(army.Faction));

                    //        float points = army.Faction.Faction.def.techLevel.ThreatRangeFor().RandomInRange * (1 - army.DepletionFromWar);

                    //        CaravanAI caravanAI = CaravanAIMaker.MakeCaravan(GeneratePawns(army, points), army.Faction.Faction, yourSettlement.Tile, true, CaravanAIMaker.GetCaravanColor(yourSettlement.Faction, target.Faction), showCaravanInfo, showCaravanInfo, false);
                    //        caravanAI.Threat = points;
                    //        caravanAI.Home = yourSettlement;

                    //        caravanAI.AddQueueAction(new CaravanArrivalAction_AIAttackSettlement(target, war), target.Tile);
                    //    }
                    //});

                    if (TryFindEnemySettlement(yourSettlement, enemyis, out Settlement target))
                    {
                        bool showCaravanInfo = (war.DeclaredWarFaction == war.PlayerInteraction && war.AssaultFactions.Contains(army.Faction)) ||
                                               (war.DefendingFaction == war.PlayerInteraction && war.DefendingFactions.Contains(army.Faction));

                        float points = army.Faction.Faction.def.techLevel.ThreatRangeFor().RandomInRange *(1 - army.DepletionFromWar);

                        CaravanAI caravanAI = CaravanAIMaker.MakeCaravan(GeneratePawns(army, points), army.Faction.Faction, yourSettlement.Tile, true, CaravanAIMaker.GetCaravanColor(yourSettlement.Faction, target.Faction), showCaravanInfo, showCaravanInfo, false);
                        caravanAI.Threat     = points;
                        caravanAI.Home       = yourSettlement;
                        caravanAI.ShowGizmos = false;

                        caravanAI.AddQueueAction(new CaravanArrivalAction_AIAttackSettlement(target, war), target.Tile);
                    }
                }
            }

            return(true);
        }