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); } } } } }
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); } }
// 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 }); }
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)); }
/// <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); }