Example #1
0
        public void AddApparel(Apparel a)
        {
#if DEBUG
            Log.Warning("AddApparel " + a.Label + " Spawned: " + a.Spawned + " IsForbidden: " + a.IsForbidden(Faction.OfPlayer));
#endif
            if (a != null)
            {
                if (this.settings.AllowedToAccept(a))
                {
                    if (a.Spawned)
                    {
                        a.DeSpawn();
                    }
                    this.StoredApparel.AddApparel(a);
                }
                else // Not Allowed
                {
                    if (!WorldComp.AddApparel(a))
                    {
                        if (!a.Spawned)
                        {
                            BuildingUtil.DropThing(a, this, this.CurrentMap, false);
                        }
                    }
                }
            }
        }
Example #2
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            List <Toil> toils = base.MakeNewToils().ToList();

            toils.RemoveLast();
            Toil replaceToil = new Toil
            {
                initAction = () =>
                {
                    Apparel apparel  = (Apparel)this.job.targetA.Thing;
                    Apparel dropThis = (Apparel)this.job.targetB.Thing;

                    Log.Message(this.pawn + " dropping " + dropThis);
                    this.pawn.inventory.innerContainer.TryDrop(dropThis, ThingPlaceMode.Near, 1, out Thing dummy);
                    Log.Message(this.pawn + " equippin " + apparel);
                    apparel.DeSpawn();
                    this.pawn.inventory.innerContainer.TryAdd(apparel);
                },
                defaultCompleteMode = ToilCompleteMode.Instant
            };

            toils.Add(replaceToil);
            return(toils);
        }
    }
Example #3
0
        // Most part is from the source code
        public static void Wear(Pawn pawn, Apparel newApparel, bool dropReplacedApparel = true)
        {
            ValidateArg.NotNull(newApparel, nameof(newApparel));
            ValidateArg.NotNull(pawn, nameof(pawn));

            if (newApparel.Spawned)
            {
                newApparel.DeSpawn();
            }

            if (!ApparelUtility.HasPartsToWear(pawn, newApparel.def))
            {
                Log.Warning(pawn + " tried to wear " + newApparel + " but he has no body parts required to wear it.");
                return;
            }

            List <Apparel> apparelsToReplace = new List <Apparel>();

            for (int num = pawn.apparel.WornApparelCount - 1; num >= 0; num--)
            {
                Apparel oldApparel = pawn.apparel.WornApparel[num];
                if (!ApparelUtility.CanWearTogether(newApparel.def, oldApparel.def, pawn.RaceProps.body))
                {
                    apparelsToReplace.Add(oldApparel);
                }
            }

            foreach (Apparel apparel in apparelsToReplace)
            {
                if (dropReplacedApparel)
                {
                    bool forbid = pawn.Faction != null && pawn.Faction.HostileTo(Faction.OfPlayer);
                    if (!pawn.apparel.TryDrop(apparel, out Apparel _, pawn.PositionHeld, forbid))
                    {
                        Messages.Message(UIText.FailToDrop.Translate(pawn, apparel), MessageTypeDefOf.NeutralEvent);
                        return;
                    }
                }
                else
                {
                    pawn.inventory.innerContainer.TryAddOrTransfer(apparel);
                }
            }

            if (newApparel.Wearer != null)
            {
                Log.Warning(pawn + " is trying to wear " + newApparel + " but this apparel already has a wearer (" + newApparel.Wearer + "). This may or may not cause bugs.");
            }

            // Circumvene accessibility restriction and add apparel directly to inner list.
            object wornApparel = pawn.apparel
                                 .GetType()
                                 .GetField("wornApparel", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
                                 .GetValue(pawn.apparel);

            wornApparel.GetType().GetMethod("TryAdd", new Type[] { typeof(Thing), typeof(bool) }).Invoke(wornApparel, new object[] { newApparel, false });
        }
Example #4
0
        internal static void Wear(this Pawn_ApparelTracker _this, Apparel newApparel, bool dropReplacedApparel = true)
        {
            SlotGroupUtility.Notify_TakingThing(newApparel);
            if (newApparel.Spawned)
            {
                newApparel.DeSpawn();
            }
            if (!ApparelUtility.HasPartsToWear(_this.pawn, newApparel.def))
            {
                Log.Warning(string.Concat(new object[]
                {
                    _this.pawn,
                    " tried to wear ",
                    newApparel,
                    " but he has no body parts required to wear it."
                }));
                return;
            }
            for (int i = _this.WornApparel.Count - 1; i >= 0; i--)
            {
                Apparel apparel = _this.WornApparel[i];
                if (!ApparelUtility.CanWearTogether(newApparel.def, apparel.def))
                {
                    bool forbid = _this.pawn.Faction.HostileTo(Faction.OfPlayer);
                    if (dropReplacedApparel)
                    {
                        Apparel apparel2;
                        if (!_this.TryDrop(apparel, out apparel2, _this.pawn.Position, forbid))
                        {
                            Log.Error(_this.pawn + " could not drop " + apparel);
                            return;
                        }
                    }
                    else
                    {
                        _this.WornApparel.Remove(apparel);
                    }
                }
            }
            _this.WornApparel.Add(newApparel);
            newApparel.wearer = _this.pawn;
            _this.SortWornApparelIntoDrawOrder();
            _this.ApparelChanged();

            Utility.TryUpdateInventory(_this.pawn);     // Apparel was added, update inventory
            MethodInfo methodInfo = typeof(Pawn_ApparelTracker).GetMethod("SortWornApparelIntoDrawOrder", BindingFlags.Instance | BindingFlags.NonPublic);

            methodInfo.Invoke(_this, new object[] { });

            LongEventHandler.ExecuteWhenFinished(new Action(_this.ApparelChanged));
        }
Example #5
0
        /// <summary>
        /// Order <paramref name="pawn"/> to wear new apparel.
        /// </summary>
        /// <param name="pawn"> Pawn who is about to wear <paramref name="newApparel"/>. </param>
        /// <param name="newApparel"> Apparel to wear. </param>
        /// <param name="dropReplacedApparel"> If true, drop the old apparel. </param>
        public static void Wear(Pawn pawn, Apparel newApparel, bool dropReplacedApparel = true)
        {
            ValidateArg.NotNull(newApparel, nameof(newApparel));
            ValidateArg.NotNull(pawn, nameof(pawn));

            if (newApparel.Spawned)
            {
                newApparel.DeSpawn();
            }

            if (!ApparelUtility.HasPartsToWear(pawn, newApparel.def))
            {
                Log.Warning(pawn + " tried to wear " + newApparel + " but he has no body parts required to wear it.");
                return;
            }

            List <Apparel> apparelsToReplace = new List <Apparel>();

            for (int num = pawn.apparel.WornApparelCount - 1; num >= 0; num--)
            {
                Apparel oldApparel = pawn.apparel.WornApparel[num];
                if (!ApparelUtility.CanWearTogether(newApparel.def, oldApparel.def, pawn.RaceProps.body))
                {
                    apparelsToReplace.Add(oldApparel);
                }
            }

            foreach (Apparel apparel in apparelsToReplace)
            {
                if (dropReplacedApparel)
                {
                    bool forbid = pawn.Faction != null && pawn.Faction.HostileTo(Faction.OfPlayer);
                    if (!pawn.apparel.TryDrop(apparel, out Apparel _, pawn.PositionHeld, forbid))
                    {
                        Messages.Message(UIText.FailToDrop.Translate(pawn, apparel), MessageTypeDefOf.NeutralEvent);
                        return;
                    }
                }
                else
                {
                    pawn.inventory.innerContainer.TryAddOrTransfer(apparel);
                }
            }

            if (newApparel.Wearer != null)
            {
                Log.Warning(pawn + " is trying to wear " + newApparel + " but this apparel already has a wearer (" + newApparel.Wearer + "). This may or may not cause bugs.");
            }

            pawn.apparel.GetDirectlyHeldThings().TryAdd(newApparel);
        }