public virtual void GiveSoldThingToPlayer(Thing toGive, int countToGive, Pawn playerNegotiator)
        {
            Caravan caravan = playerNegotiator.GetCaravan();
            Thing   thing   = toGive.SplitOff(countToGive);

            thing.PreTraded(TradeAction.PlayerBuys, playerNegotiator, this.settlement);
            Pawn pawn = thing as Pawn;

            if (pawn != null)
            {
                caravan.AddPawn(pawn, true);
            }
            else
            {
                Pawn pawn2 = CaravanInventoryUtility.FindPawnToMoveInventoryTo(thing, caravan.PawnsListForReading, null, null);
                if (pawn2 == null)
                {
                    Log.Error("Could not find any pawn to give sold thing to.");
                    thing.Destroy(DestroyMode.Vanish);
                }
                else if (!pawn2.inventory.innerContainer.TryAdd(thing, true))
                {
                    Log.Error("Could not add sold thing to inventory.");
                    thing.Destroy(DestroyMode.Vanish);
                }
            }
        }
Example #2
0
        public void GiveSoldThingToPlayer(Thing toGive, int countToGive, Pawn playerNegotiator)
        {
            Caravan caravan = playerNegotiator.GetCaravan();
            Thing   thing   = toGive.SplitOff(countToGive);

            thing.PreTraded(TradeAction.PlayerBuys, playerNegotiator, this.caravan);
            Pawn pawn = thing as Pawn;

            if (pawn != null)
            {
                CaravanInventoryUtility.MoveAllInventoryToSomeoneElse(pawn, this.caravan.PawnsListForReading);
                caravan.AddPawn(pawn, addCarriedPawnToWorldPawnsIfAny: true);
                if (!pawn.IsWorldPawn() && caravan.Spawned)
                {
                    Find.WorldPawns.PassToWorld(pawn);
                }
                soldPrisoners.Remove(pawn);
                return;
            }
            Pawn pawn2 = CaravanInventoryUtility.FindPawnToMoveInventoryTo(thing, caravan.PawnsListForReading, null);

            if (pawn2 == null)
            {
                Log.Error("Could not find pawn to move bought thing to (bought by player). thing=" + thing);
                thing.Destroy();
            }
            else if (!pawn2.inventory.innerContainer.TryAdd(thing))
            {
                Log.Error("Could not add item to inventory.");
                thing.Destroy();
            }
        }
Example #3
0
        public static void GiveThing(Caravan caravan, Thing thing)
        {
            if (CaravanInventoryUtility.AllInventoryItems(caravan).Contains(thing))
            {
                Log.Error(string.Concat(new object[]
                {
                    "Tried to give the same item twice (",
                    thing,
                    ") to a caravan (",
                    caravan,
                    ")."
                }), false);
                return;
            }
            Pawn pawn = CaravanInventoryUtility.FindPawnToMoveInventoryTo(thing, caravan.PawnsListForReading, null, null);

            if (pawn == null)
            {
                Log.Error(string.Format("Failed to give item {0} to caravan {1}; item was lost", thing, caravan), false);
                thing.Destroy(DestroyMode.Vanish);
                return;
            }
            if (!pawn.inventory.innerContainer.TryAdd(thing, true))
            {
                Log.Error(string.Format("Failed to give item {0} to caravan {1}; item was lost", thing, caravan), false);
                thing.Destroy(DestroyMode.Vanish);
                return;
            }
        }
 private void GivePodContentsToCaravan(Caravan caravan)
 {
     for (int i = 0; i < this.pods.Count; i++)
     {
         TravelingTransportPods.tmpContainedThings.Clear();
         TravelingTransportPods.tmpContainedThings.AddRange(this.pods[i].innerContainer);
         for (int j = 0; j < TravelingTransportPods.tmpContainedThings.Count; j++)
         {
             this.pods[i].innerContainer.Remove(TravelingTransportPods.tmpContainedThings[j]);
             Pawn pawn = TravelingTransportPods.tmpContainedThings[j] as Pawn;
             if (pawn != null)
             {
                 caravan.AddPawn(pawn, true);
             }
             else
             {
                 Pawn pawn2 = CaravanInventoryUtility.FindPawnToMoveInventoryTo(TravelingTransportPods.tmpContainedThings[j], caravan.PawnsListForReading, null, null);
                 bool flag  = false;
                 if (pawn2 != null)
                 {
                     flag = pawn2.inventory.innerContainer.TryAdd(TravelingTransportPods.tmpContainedThings[j], true);
                 }
                 if (!flag)
                 {
                     TravelingTransportPods.tmpContainedThings[j].Destroy(DestroyMode.Vanish);
                 }
             }
         }
     }
     this.RemoveAllPods();
     Find.WorldObjects.Remove(this);
     TravelingTransportPods.tmpContainedThings.Clear();
     Messages.Message("MessageTransportPodsArrivedAndAddedToCaravan".Translate(), caravan, MessageTypeDefOf.TaskCompletion);
 }
        private void SpawnCaravanAtDestinationTile()
        {
            TravelingTransportPods.tmpPawns.Clear();
            for (int i = 0; i < this.pods.Count; i++)
            {
                ThingOwner innerContainer = this.pods[i].innerContainer;
                for (int j = innerContainer.Count - 1; j >= 0; j--)
                {
                    Pawn pawn = innerContainer[j] as Pawn;
                    if (pawn != null)
                    {
                        TravelingTransportPods.tmpPawns.Add(pawn);
                        innerContainer.Remove(pawn);
                    }
                }
            }
            int startingTile;

            if (!GenWorldClosest.TryFindClosestPassableTile(this.destinationTile, out startingTile))
            {
                startingTile = this.destinationTile;
            }
            Caravan o = CaravanMaker.MakeCaravan(TravelingTransportPods.tmpPawns, base.Faction, startingTile, true);

            for (int k = 0; k < this.pods.Count; k++)
            {
                TravelingTransportPods.tmpContainedThings.Clear();
                TravelingTransportPods.tmpContainedThings.AddRange(this.pods[k].innerContainer);
                for (int l = 0; l < TravelingTransportPods.tmpContainedThings.Count; l++)
                {
                    this.pods[k].innerContainer.Remove(TravelingTransportPods.tmpContainedThings[l]);
                    Pawn pawn2 = CaravanInventoryUtility.FindPawnToMoveInventoryTo(TravelingTransportPods.tmpContainedThings[l], TravelingTransportPods.tmpPawns, null, null);
                    bool flag  = false;
                    if (pawn2 != null)
                    {
                        flag = pawn2.inventory.innerContainer.TryAdd(TravelingTransportPods.tmpContainedThings[l], true);
                    }
                    if (!flag)
                    {
                        TravelingTransportPods.tmpContainedThings[l].Destroy(DestroyMode.Vanish);
                    }
                }
            }
            this.RemoveAllPods();
            Find.WorldObjects.Remove(this);
            TravelingTransportPods.tmpPawns.Clear();
            TravelingTransportPods.tmpContainedThings.Clear();
            Messages.Message("MessageTransportPodsArrived".Translate(), o, MessageTypeDefOf.TaskCompletion);
        }
Example #6
0
        private void MoveDraggedItemToInventory()
        {
            this.droppedDraggedItem = false;
            Pawn pawn = CaravanInventoryUtility.FindPawnToMoveInventoryTo(this.draggedItem, this.Pawns, null, null);

            if (pawn != null)
            {
                this.draggedItem.holdingOwner.TryTransferToContainer(this.draggedItem, pawn.inventory.innerContainer, 1, true);
            }
            else
            {
                Log.Warning("Could not find any pawn to move " + this.draggedItem + " to.");
            }
            this.draggedItem = null;
        }
Example #7
0
 public static void MoveInventoryToSomeoneElse(Pawn itemOwner, Thing item, List <Pawn> candidates, List <Pawn> ignoreCandidates, int numToMove)
 {
     if (numToMove < 0 || numToMove > item.stackCount)
     {
         Log.Warning("Tried to move item " + item + " with numToMove=" + numToMove + " (item stack count = " + item.stackCount + ")");
     }
     else
     {
         Pawn pawn = CaravanInventoryUtility.FindPawnToMoveInventoryTo(item, candidates, ignoreCandidates, itemOwner);
         if (pawn != null)
         {
             itemOwner.inventory.innerContainer.TryTransferToContainer(item, pawn.inventory.innerContainer, numToMove, true);
         }
     }
 }
Example #8
0
 public static void MoveAllEquipmentToSomeonesInventory(Pawn moveFrom, List <Pawn> candidates)
 {
     if (moveFrom.equipment != null)
     {
         CaravanInventoryUtility.tmpEquipment.Clear();
         CaravanInventoryUtility.tmpEquipment.AddRange(moveFrom.equipment.AllEquipmentListForReading);
         for (int i = 0; i < CaravanInventoryUtility.tmpEquipment.Count; i++)
         {
             moveFrom.equipment.Remove(CaravanInventoryUtility.tmpEquipment[i]);
             Pawn pawn = CaravanInventoryUtility.FindPawnToMoveInventoryTo(CaravanInventoryUtility.tmpEquipment[i], candidates, null, moveFrom);
             if (pawn != null)
             {
                 pawn.inventory.innerContainer.TryAdd(CaravanInventoryUtility.tmpEquipment[i], true);
             }
         }
         CaravanInventoryUtility.tmpEquipment.Clear();
     }
 }
Example #9
0
 public static void MoveAllApparelToSomeonesInventory(Pawn moveFrom, List <Pawn> candidates)
 {
     if (moveFrom.apparel != null)
     {
         CaravanInventoryUtility.tmpApparel.Clear();
         CaravanInventoryUtility.tmpApparel.AddRange(moveFrom.apparel.WornApparel);
         for (int i = 0; i < CaravanInventoryUtility.tmpApparel.Count; i++)
         {
             moveFrom.apparel.Remove(CaravanInventoryUtility.tmpApparel[i]);
             Pawn pawn = CaravanInventoryUtility.FindPawnToMoveInventoryTo(CaravanInventoryUtility.tmpApparel[i], candidates, null, moveFrom);
             if (pawn != null)
             {
                 pawn.inventory.innerContainer.TryAdd(CaravanInventoryUtility.tmpApparel[i], true);
             }
         }
         CaravanInventoryUtility.tmpApparel.Clear();
     }
 }
Example #10
0
        public void GiveSoldThingToTrader(Thing toGive, int countToGive, Pawn playerNegotiator)
        {
            if (Goods.Contains(toGive))
            {
                Log.Error("Tried to add " + toGive + " to stock (pawn's trader tracker), but it's already here.");
                return;
            }
            Caravan caravan = playerNegotiator.GetCaravan();
            Thing   thing   = toGive.SplitOff(countToGive);

            thing.PreTraded(TradeAction.PlayerSells, playerNegotiator, this.caravan);
            Pawn pawn = thing as Pawn;

            if (pawn != null)
            {
                CaravanInventoryUtility.MoveAllInventoryToSomeoneElse(pawn, caravan.PawnsListForReading);
                this.caravan.AddPawn(pawn, addCarriedPawnToWorldPawnsIfAny: false);
                if (pawn.IsWorldPawn() && !this.caravan.Spawned)
                {
                    Find.WorldPawns.RemovePawn(pawn);
                }
                if (pawn.RaceProps.Humanlike)
                {
                    soldPrisoners.Add(pawn);
                }
            }
            else
            {
                Pawn pawn2 = CaravanInventoryUtility.FindPawnToMoveInventoryTo(thing, this.caravan.PawnsListForReading, null);
                if (pawn2 == null)
                {
                    Log.Error("Could not find pawn to move sold thing to (sold by player). thing=" + thing);
                    thing.Destroy();
                }
                else if (!pawn2.inventory.innerContainer.TryAdd(thing))
                {
                    Log.Error("Could not add item to inventory.");
                    thing.Destroy();
                }
            }
        }
        private void MoveDraggedItemToInventory()
        {
            droppedDraggedItem = false;
            Apparel apparel;

            if ((apparel = draggedItem as Apparel) != null && CurrentWearerOf(apparel) != null && CurrentWearerOf(apparel).apparel.IsLocked(apparel))
            {
                Messages.Message("MessageCantUnequipLockedApparel".Translate(), CurrentWearerOf(apparel), MessageTypeDefOf.RejectInput, historical: false);
                draggedItem = null;
                return;
            }
            Pawn pawn = CaravanInventoryUtility.FindPawnToMoveInventoryTo(draggedItem, Pawns, null);

            if (pawn != null)
            {
                draggedItem.holdingOwner.TryTransferToContainer(draggedItem, pawn.inventory.innerContainer, 1);
            }
            else
            {
                Log.Warning(string.Concat("Could not find any pawn to move ", draggedItem, " to."));
            }
            draggedItem = null;
        }
Example #12
0
        public static void MoveInventoryToSomeoneElse(Pawn itemOwner, Thing item, List <Pawn> candidates, List <Pawn> ignoreCandidates, int numToMove)
        {
            if (numToMove < 0 || numToMove > item.stackCount)
            {
                Log.Warning(string.Concat(new object[]
                {
                    "Tried to move item ",
                    item,
                    " with numToMove=",
                    numToMove,
                    " (item stack count = ",
                    item.stackCount,
                    ")"
                }), false);
                return;
            }
            Pawn pawn = CaravanInventoryUtility.FindPawnToMoveInventoryTo(item, candidates, ignoreCandidates, itemOwner);

            if (pawn == null)
            {
                return;
            }
            itemOwner.inventory.innerContainer.TryTransferToContainer(item, pawn.inventory.innerContainer, numToMove, true);
        }
Example #13
0
        private void TryEquipDraggedItem(Pawn p)
        {
            this.droppedDraggedItem = false;
            if (this.draggedItem.def.IsWeapon)
            {
                if (p.story != null && p.story.WorkTagIsDisabled(WorkTags.Violent))
                {
                    Messages.Message("MessageCantEquipIncapableOfViolence".Translate(p.LabelShort), p, MessageTypeDefOf.RejectInput);
                    this.draggedItem = null;
                    return;
                }
                if (!p.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation))
                {
                    Messages.Message("MessageCantEquipIncapableOfManipulation".Translate(), p, MessageTypeDefOf.RejectInput);
                    this.draggedItem = null;
                    return;
                }
            }
            Apparel        apparel        = this.draggedItem as Apparel;
            ThingWithComps thingWithComps = this.draggedItem as ThingWithComps;

            if (apparel != null && p.apparel != null)
            {
                WITab_Caravan_Gear.tmpExistingApparel.Clear();
                WITab_Caravan_Gear.tmpExistingApparel.AddRange(p.apparel.WornApparel);
                for (int i = 0; i < WITab_Caravan_Gear.tmpExistingApparel.Count; i++)
                {
                    if (!ApparelUtility.CanWearTogether(apparel.def, WITab_Caravan_Gear.tmpExistingApparel[i].def, p.RaceProps.body))
                    {
                        p.apparel.Remove(WITab_Caravan_Gear.tmpExistingApparel[i]);
                        Pawn pawn = CaravanInventoryUtility.FindPawnToMoveInventoryTo(WITab_Caravan_Gear.tmpExistingApparel[i], this.Pawns, null, null);
                        if (pawn != null)
                        {
                            pawn.inventory.innerContainer.TryAdd(WITab_Caravan_Gear.tmpExistingApparel[i], true);
                        }
                        else
                        {
                            Log.Warning("Could not find any pawn to move " + WITab_Caravan_Gear.tmpExistingApparel[i] + " to.");
                            WITab_Caravan_Gear.tmpExistingApparel[i].Destroy(DestroyMode.Vanish);
                        }
                    }
                }
                p.apparel.Wear((Apparel)apparel.SplitOff(1), false);
                if (p.outfits != null)
                {
                    p.outfits.forcedHandler.SetForced(apparel, true);
                }
            }
            else if (thingWithComps != null && p.equipment != null)
            {
                WITab_Caravan_Gear.tmpExistingEquipment.Clear();
                WITab_Caravan_Gear.tmpExistingEquipment.AddRange(p.equipment.AllEquipmentListForReading);
                for (int j = 0; j < WITab_Caravan_Gear.tmpExistingEquipment.Count; j++)
                {
                    p.equipment.Remove(WITab_Caravan_Gear.tmpExistingEquipment[j]);
                    Pawn pawn2 = CaravanInventoryUtility.FindPawnToMoveInventoryTo(WITab_Caravan_Gear.tmpExistingEquipment[j], this.Pawns, null, null);
                    if (pawn2 != null)
                    {
                        pawn2.inventory.innerContainer.TryAdd(WITab_Caravan_Gear.tmpExistingEquipment[j], true);
                    }
                    else
                    {
                        Log.Warning("Could not find any pawn to move " + WITab_Caravan_Gear.tmpExistingEquipment[j] + " to.");
                        WITab_Caravan_Gear.tmpExistingEquipment[j].Destroy(DestroyMode.Vanish);
                    }
                }
                p.equipment.AddEquipment((ThingWithComps)thingWithComps.SplitOff(1));
            }
            else
            {
                Log.Warning("Could not make " + p + " equip or wear " + this.draggedItem);
            }
            this.draggedItem = null;
        }
        private void TryEquipDraggedItem(Pawn p)
        {
            droppedDraggedItem = false;
            if (!EquipmentUtility.CanEquip_NewTmp(draggedItem, p, out var cantReason))
            {
                Messages.Message("MessageCantEquipCustom".Translate(cantReason.CapitalizeFirst()), p, MessageTypeDefOf.RejectInput, historical: false);
                draggedItem = null;
                return;
            }
            if (draggedItem.def.IsWeapon)
            {
                if (p.guest.IsPrisoner)
                {
                    Messages.Message("MessageCantEquipCustom".Translate("MessagePrisonerCannotEquipWeapon".Translate(p.Named("PAWN"))), p, MessageTypeDefOf.RejectInput, historical: false);
                    draggedItem = null;
                    return;
                }
                if (p.WorkTagIsDisabled(WorkTags.Violent))
                {
                    Messages.Message("MessageCantEquipIncapableOfViolence".Translate(p.LabelShort, p), p, MessageTypeDefOf.RejectInput, historical: false);
                    draggedItem = null;
                    return;
                }
                if (!p.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation))
                {
                    Messages.Message("MessageCantEquipIncapableOfManipulation".Translate(), p, MessageTypeDefOf.RejectInput, historical: false);
                    draggedItem = null;
                    return;
                }
            }
            Apparel        apparel        = draggedItem as Apparel;
            ThingWithComps thingWithComps = draggedItem as ThingWithComps;

            if (apparel != null && p.apparel != null)
            {
                if (!ApparelUtility.HasPartsToWear(p, apparel.def))
                {
                    Messages.Message("MessageCantWearApparelMissingBodyParts".Translate(p.LabelShort, p), p, MessageTypeDefOf.RejectInput, historical: false);
                    draggedItem = null;
                    return;
                }
                if (CurrentWearerOf(apparel) != null && CurrentWearerOf(apparel).apparel.IsLocked(apparel))
                {
                    Messages.Message("MessageCantUnequipLockedApparel".Translate(), p, MessageTypeDefOf.RejectInput, historical: false);
                    draggedItem = null;
                    return;
                }
                if (p.apparel.WouldReplaceLockedApparel(apparel))
                {
                    Messages.Message("MessageWouldReplaceLockedApparel".Translate(p.LabelShort, p), p, MessageTypeDefOf.RejectInput, historical: false);
                    draggedItem = null;
                    return;
                }
                tmpExistingApparel.Clear();
                tmpExistingApparel.AddRange(p.apparel.WornApparel);
                for (int i = 0; i < tmpExistingApparel.Count; i++)
                {
                    if (!ApparelUtility.CanWearTogether(apparel.def, tmpExistingApparel[i].def, p.RaceProps.body))
                    {
                        p.apparel.Remove(tmpExistingApparel[i]);
                        Pawn pawn = CaravanInventoryUtility.FindPawnToMoveInventoryTo(tmpExistingApparel[i], Pawns, null);
                        if (pawn != null)
                        {
                            pawn.inventory.innerContainer.TryAdd(tmpExistingApparel[i]);
                            continue;
                        }
                        Log.Warning(string.Concat("Could not find any pawn to move ", tmpExistingApparel[i], " to."));
                        tmpExistingApparel[i].Destroy();
                    }
                }
                p.apparel.Wear((Apparel)apparel.SplitOff(1), dropReplacedApparel: false);
                if (p.outfits != null)
                {
                    p.outfits.forcedHandler.SetForced(apparel, forced: true);
                }
            }
            else if (thingWithComps != null && p.equipment != null)
            {
                string personaWeaponConfirmationText = EquipmentUtility.GetPersonaWeaponConfirmationText(draggedItem, p);
                if (!personaWeaponConfirmationText.NullOrEmpty())
                {
                    _ = draggedItem;
                    Find.WindowStack.Add(new Dialog_MessageBox(personaWeaponConfirmationText, "Yes".Translate(), delegate
                    {
                        AddEquipment();
                    }, "No".Translate()));
                    draggedItem = null;
                    return;
                }
                AddEquipment();
            }
            else
            {
                Log.Warning(string.Concat("Could not make ", p, " equip or wear ", draggedItem));
            }
            draggedItem = null;
            void AddEquipment()
            {
                tmpExistingEquipment.Clear();
                tmpExistingEquipment.AddRange(p.equipment.AllEquipmentListForReading);
                for (int j = 0; j < tmpExistingEquipment.Count; j++)
                {
                    p.equipment.Remove(tmpExistingEquipment[j]);
                    Pawn pawn2 = CaravanInventoryUtility.FindPawnToMoveInventoryTo(tmpExistingEquipment[j], Pawns, null);
                    if (pawn2 != null)
                    {
                        pawn2.inventory.innerContainer.TryAdd(tmpExistingEquipment[j]);
                    }
                    else
                    {
                        Log.Warning(string.Concat("Could not find any pawn to move ", tmpExistingEquipment[j], " to."));
                        tmpExistingEquipment[j].Destroy();
                    }
                }
                p.equipment.AddEquipment((ThingWithComps)thingWithComps.SplitOff(1));
            }
        }