// RimWorld.Pawn_ApparelTracker public static bool InterfaceDrop_PreFix(ITab_Pawn_Gear __instance, Thing t) { ThingWithComps thingWithComps = t as ThingWithComps; Apparel apparel = t as Apparel; Pawn __pawn = (Pawn)AccessTools.Method(typeof(ITab_Pawn_Gear), "get_SelPawnForGear").Invoke(__instance, new object[0]); if (__pawn != null) { if (apparel != null) { if (__pawn.apparel != null) { if (__pawn.apparel.WornApparel.Contains(apparel)) { if (__pawn.apparel.WornApparel != null) { CompInstalledPart installedPart = apparel.GetComp <CompInstalledPart>(); if (installedPart != null) { if (!installedPart.uninstalled) { return(false); } } } } } } } return(true); }
public void Notify_Installed(Pawn installer, Thing target) { this.uninstalled = false; //Installed on a character if (target is Pawn targetPawn) { if (this.parent.def != null) { //Add apparel if (this.parent.def.IsApparel) { if (targetPawn.apparel != null) { this.parent.DeSpawn(); targetPawn.apparel.Wear((Apparel)this.parent); } } //Add equipment if (this.parent.def.IsWeapon) { if (targetPawn.equipment != null) { if (targetPawn.equipment.Primary != null) { CompInstalledPart otherPart = targetPawn.equipment.Primary.GetComp <CompInstalledPart>(); if (otherPart != null) { Notify_Uninstalled(installer, targetPawn); } } this.parent.DeSpawn(); targetPawn.equipment.MakeRoomFor(this.parent); targetPawn.equipment.AddEquipment(this.parent); } } } } else { ThingOwner addableSource = target.TryGetInnerInteractableThingOwner(); if (addableSource != null) { this.parent.DeSpawn(); addableSource.TryAdd(this.parent); } } Messages.Message("CompInstalledPart_Installed".Translate(new object[] { installer.LabelShort, this.parent.LabelShort, target.LabelShort }), MessageSound.Benefit); }
// RimWorld.FloatMenuMakerMap public static void AddHumanlikeOrders_PostFix(Vector3 clickPos, Pawn pawn, List <FloatMenuOption> opts) { IntVec3 c = IntVec3.FromVector3(clickPos); foreach (Thing current in c.GetThingList(pawn.Map)) { //Handler for things on the ground if (current is ThingWithComps groundThing) { if (groundThing != null && pawn != null && pawn != groundThing) { CompInstalledPart groundPart = groundThing.GetComp <CompInstalledPart>(); if (groundPart != null) { if (pawn.equipment != null) { //Remove "Equip" option from right click. if (groundThing.GetComp <CompEquippable>() != null) { var optToRemove = opts.FirstOrDefault((x) => x.Label.Contains(groundThing.Label)); if (optToRemove != null) { opts.Remove(optToRemove); } } string text = "CompInstalledPart_Install".Translate(); opts.Add(new FloatMenuOption(text, delegate { CompProperties_InstalledPart props = groundPart.Props; if (props != null) { if (props.allowedToInstallOn != null && props.allowedToInstallOn.Count > 0) { SoundDefOf.TickTiny.PlayOneShotOnCamera(null); Find.Targeter.BeginTargeting(new TargetingParameters { canTargetPawns = true, canTargetBuildings = true, mapObjectTargetsMustBeAutoAttackable = false, validator = delegate(TargetInfo targ) { if (!targ.HasThing) { return(false); } return(props.allowedToInstallOn.Contains(targ.Thing.def)); } }, delegate(LocalTargetInfo target) { groundThing.SetForbidden(false); groundPart.GiveInstallJob(pawn, target.Thing); }, null, null, null); } else { Log.ErrorOnce("CompInstalledPart :: allowedToInstallOn list needs to be defined in XML.", 3242); } } }, MenuOptionPriority.Default, null, null, 29f, null, null)); } } } //Handler character with installed parts if (current is Pawn targetPawn) { if (targetPawn != null && pawn != null && pawn != targetPawn) { //Handle installed weapons if (targetPawn.equipment != null) { if (targetPawn.equipment.Primary != null) { CompInstalledPart installedEq = targetPawn.equipment.Primary.GetComp <CompInstalledPart>(); if (installedEq != null) { string text = "CompInstalledPart_Uninstall".Translate(targetPawn.equipment.Primary.LabelShort); opts.Add(new FloatMenuOption(text, delegate { SoundDefOf.TickTiny.PlayOneShotOnCamera(null); installedEq.GiveUninstallJob(pawn, targetPawn); }, MenuOptionPriority.Default, null, null, 29f, null, null)); } } } //Handle installed apparel if (targetPawn.apparel != null) { if (targetPawn.apparel.WornApparel != null && targetPawn.apparel.WornApparelCount > 0) { List <Apparel> installedApparel = targetPawn.apparel.WornApparel.FindAll((x) => x.GetComp <CompInstalledPart>() != null); if (installedApparel != null && installedApparel.Count > 0) { foreach (Apparel ap in installedApparel) { string text = "CompInstalledPart_Uninstall".Translate(ap.LabelShort); opts.Add(new FloatMenuOption(text, delegate { SoundDefOf.TickTiny.PlayOneShotOnCamera(null); ap.GetComp <CompInstalledPart>().GiveUninstallJob(pawn, targetPawn); }, MenuOptionPriority.Default, null, null, 29f, null, null)); } } } } } } } } }