示例#1
0
 public static void TryUpdateInventory(Pawn_InventoryTracker tracker)
 {
     if (tracker != null && tracker.pawn != null)
     {
         TryUpdateInventory(tracker.pawn);
     }
 }
示例#2
0
        private void AddCorpseInventoryAndGearToTransferables(Corpse corpse)
        {
            Pawn_InventoryTracker inventory = corpse.InnerPawn.inventory;
            Pawn_ApparelTracker   apparel   = corpse.InnerPawn.apparel;
            Pawn_EquipmentTracker equipment = corpse.InnerPawn.equipment;

            for (int i = 0; i < inventory.innerContainer.Count; i++)
            {
                this.AddToTransferables(inventory.innerContainer[i], false);
            }
            if (apparel != null)
            {
                List <Apparel> wornApparel = apparel.WornApparel;
                for (int j = 0; j < wornApparel.Count; j++)
                {
                    this.AddToTransferables(wornApparel[j], false);
                }
            }
            if (equipment != null)
            {
                List <ThingWithComps> allEquipmentListForReading = equipment.AllEquipmentListForReading;
                for (int k = 0; k < allEquipmentListForReading.Count; k++)
                {
                    this.AddToTransferables(allEquipmentListForReading[k], false);
                }
            }
        }
        static void Postfix(Pawn_InventoryTracker __instance, ref Thing __result)
        {
            Pawn pawn = __instance.pawn;

            if (pawn?.story?.traits?.HasTrait(GMT_DefOf.GMT_Drunken_Master) ?? false)
            {
                for (int i = 0; i < __instance.innerContainer.Count; i++)
                {
                    Thing    thing    = __instance.innerContainer[i];
                    CompDrug compDrug = thing.TryGetComp <CompDrug>();
                    if (compDrug != null && compDrug.Props.chemical == ChemicalDefOf.Alcohol)
                    {
                        var doer = thing.def.ingestible.outcomeDoers.Find(
                            (IngestionOutcomeDoer x) => ((x as IngestionOutcomeDoer_GiveHediff)?.hediffDef ?? null) == HediffDefOf.AlcoholHigh
                            ) as IngestionOutcomeDoer_GiveHediff;
                        if (doer == null)
                        {
                            continue;
                        }

                        Hediff hediff = HediffMaker.MakeHediff(doer.hediffDef, pawn, null);
                        hediff.Severity = doer.severity;
                        // Only count this as a drug if it won't down the pawn
                        if (!pawn.health.WouldBeDownedAfterAddingHediff(hediff))
                        {
                            __result = thing;
                            break;
                        }
                    }
                }
            }
        }
        private static bool ThingInLoadout(Pawn_InventoryTracker inventory, int index)
        {
            CompAwesomeInventoryLoadout comp = inventory?.pawn?.TryGetComp <CompAwesomeInventoryLoadout>();

            if (comp?.Loadout != null)
            {
                Thing thingToUnload = inventory.innerContainer[index];
                foreach (ThingGroupSelector groupSelector in comp.Loadout)
                {
                    if (groupSelector.Allows(thingToUnload, out _) && !(comp.InventoryMargins[groupSelector] > 0))
                    {
                        return(true);
                    }
                }

                if (SimpleSidearmUtility.IsActive)
                {
                    return(SimpleSidearmUtility.InMemory(inventory.pawn, inventory.innerContainer[index]));
                }

                return(false);
            }
            else if (comp != null)
            {
                if (comp.InventoryMargins != null)
                {
                    Log.Error("Loadout and InventoryMargins are out of sync. This message is harmless. Resetting");
                    comp.RemoveLoadout();
                }
            }

            return(false);
        }
 public static void Postfix_Notify_ItemRemoved(Pawn_InventoryTracker __instance, Thing item)
 {
     if (item is SurvivalTool && __instance.pawn.TryGetComp <Pawn_SurvivalToolAssignmentTracker>() is Pawn_SurvivalToolAssignmentTracker assignmentTracker)
     {
         assignmentTracker.forcedHandler.SetForced(item, false);
     }
 }
示例#6
0
        // Verse.Pawn_InventoryTracker
        private static bool Vamp_BloodItemsDontSpawnForNormies(Pawn_InventoryTracker __instance, Thing item)
        {
            if (__instance?.pawn?.IsVampire() == false)
            {
                if (item?.def?.thingCategories?.Contains(VampDefOfTwo.ROMV_Blood) ?? false)
                {
                    return(false);
                }
            }

            return(true);
        }
示例#7
0
        public static void Postfix(Pawn_InventoryTracker __instance, ref ThingCount __result)
        {
            if (__result == default(ThingCount) ||
                !__result.Thing.def.IsWeapon)
            {
                return;
            }
            else
            {
                Pawn           pawn       = __instance.pawn;
                GoldfishModule pawnMemory = GoldfishModule.GetGoldfishForPawn(pawn);
                if (
                    pawnMemory == null ||
                    !pawn.IsColonist ||
                    pawn.equipment == null ||
                    __instance.innerContainer == null
                    )
                {
                    return;
                }
                List <ThingDefStuffDefPair> desiredSidearms = pawnMemory.RememberedWeapons.ListFullCopy();

                if (pawn.equipment.Primary != null)
                {
                    if (desiredSidearms.Contains(pawn.equipment.Primary.toThingDefStuffDefPair()))
                    {
                        desiredSidearms.Remove(pawn.equipment.Primary.toThingDefStuffDefPair());
                    }
                }


                int inventoryOffset = 0;

                //TODO: this does not preserve best possible weapon, just whichever one is first in inventory. Maybe fix?
                while (inventoryOffset < __instance.innerContainer.Count)
                {
                    Thing candidate = __instance.innerContainer[inventoryOffset];
                    if (candidate.def.IsWeapon & desiredSidearms.Contains(candidate.toThingDefStuffDefPair()))
                    {
                        desiredSidearms.Remove(candidate.toThingDefStuffDefPair());
                    }
                    else
                    {
                        __result = new ThingCount(candidate, candidate.stackCount);
                        return;
                    }
                    inventoryOffset++;
                }
                __result = default(ThingCount);
                return;
            }
        }
 public static void Postfix_InventoryTrackerTickRare(Pawn_InventoryTracker __instance)
 {
     if (SurvivalToolsSettings.toolLimit)
     {
         Pawn pawn = __instance.pawn;
         if (pawn.CanUseSurvivalTools() && pawn.GetHeldSurvivalTools().Count() > pawn.GetStatValue(ST_StatDefOf.SurvivalToolCarryCapacity) && pawn.CanRemoveExcessSurvivalTools())
         {
             Thing tool = pawn.GetHeldSurvivalTools().Last();
             Job   job  = pawn.DequipAndTryStoreSurvivalTool(tool);
             pawn.jobs.StartJob(job, JobCondition.InterruptForced, cancelBusyStances: false);
         }
     }
 }
示例#9
0
        public void GizmoStuff()
        {
            pawnHolding = pwaninve.pawn;
            pwaninve    = this.ParentHolder as Pawn_InventoryTracker;
            ThinkNode       jobGiver            = null;
            Pawn_JobTracker jobs                = pawnHolding.jobs;
            Job             job                 = this.TryMakeBipodJobComp();
            Job             newJob              = job;
            JobCondition    lastJobEndCondition = JobCondition.InterruptForced;
            Job             curJob              = pawnHolding.CurJob;

            jobs.StartJob(newJob, lastJobEndCondition, jobGiver, ((curJob != null) ? curJob.def : null) != job.def, true, null, null, false, false);
        }
示例#10
0
        public static bool TrySpawnHatchedOrBornPawn(Pawn pawn, Thing motherOrEgg)
        {
            bool result;

            if (motherOrEgg.SpawnedOrAnyParentSpawned)
            {
                result = (GenSpawn.Spawn(pawn, motherOrEgg.PositionHeld, motherOrEgg.MapHeld, WipeMode.Vanish) != null);
            }
            else
            {
                Pawn pawn2 = motherOrEgg as Pawn;
                if (pawn2 != null)
                {
                    if (pawn2.IsCaravanMember())
                    {
                        pawn2.GetCaravan().AddPawn(pawn, true);
                        Find.WorldPawns.PassToWorld(pawn, PawnDiscardDecideMode.Decide);
                        return(true);
                    }
                    if (pawn2.IsWorldPawn())
                    {
                        Find.WorldPawns.PassToWorld(pawn, PawnDiscardDecideMode.Decide);
                        return(true);
                    }
                }
                else if (motherOrEgg.ParentHolder != null)
                {
                    Pawn_InventoryTracker pawn_InventoryTracker = motherOrEgg.ParentHolder as Pawn_InventoryTracker;
                    if (pawn_InventoryTracker != null)
                    {
                        if (pawn_InventoryTracker.pawn.IsCaravanMember())
                        {
                            pawn_InventoryTracker.pawn.GetCaravan().AddPawn(pawn, true);
                            Find.WorldPawns.PassToWorld(pawn, PawnDiscardDecideMode.Decide);
                            return(true);
                        }
                        if (pawn_InventoryTracker.pawn.IsWorldPawn())
                        {
                            Find.WorldPawns.PassToWorld(pawn, PawnDiscardDecideMode.Decide);
                            return(true);
                        }
                    }
                }
                result = false;
            }
            return(result);
        }
示例#11
0
        // Token: 0x0600006D RID: 109 RVA: 0x00005354 File Offset: 0x00003554
        public static float GetInventoryWeight(Pawn pilot, bool includeCarried)
        {
            float weight = 0f;

            if (includeCarried)
            {
                Thing thing;
                if (pilot == null)
                {
                    thing = null;
                }
                else
                {
                    Pawn_CarryTracker carryTracker = pilot.carryTracker;
                    thing = (carryTracker?.CarriedThing);
                }
                Thing InvCarried = thing;
                if (InvCarried != null)
                {
                    weight += InvCarried.def.BaseMass * (float)InvCarried.stackCount;
                }
            }
            List <Thing> list;

            if (pilot == null)
            {
                list = null;
            }
            else
            {
                Pawn_InventoryTracker inventory = pilot.inventory;
                list = (inventory?.innerContainer.ToList <Thing>());
            }
            List <Thing> Inv = list;

            if (Inv != null && Inv.Count > 0)
            {
                for (int i = 0; i < Inv.Count; i++)
                {
                    weight += Inv[i].def.BaseMass * (float)Inv[i].stackCount;
                }
            }
            return(weight);
        }
示例#12
0
        private static bool ThingInLoadout(Pawn_InventoryTracker inventory, int index)
        {
            CompAwesomeInventoryLoadout comp = inventory?.pawn?.TryGetComp <CompAwesomeInventoryLoadout>();

            if (comp?.Loadout != null)
            {
                foreach (ThingGroupSelector groupSelector in comp.Loadout)
                {
                    if (groupSelector.Allows(inventory.innerContainer[index], out _))
                    {
                        return(true);
                    }
                }

                return(false);
            }

            return(false);
        }
示例#13
0
        private static void Pawn_InventoryTracker_PostFix(Pawn_InventoryTracker __instance, Thing item)
        {
            CompHauledToInventory takenToInventory = __instance.pawn.TryGetComp <CompHauledToInventory>();

            if (takenToInventory == null)
            {
                return;
            }

            HashSet <Thing> carriedThing = takenToInventory.GetHashSet();

            if (carriedThing?.Count > 0)
            {
                if (carriedThing.Contains(item))
                {
                    carriedThing.Remove(item);
                }
            }
        }
示例#14
0
        public static bool TrySpawnHatchedOrBornPawn(Pawn pawn, Thing motherOrEgg)
        {
            if (motherOrEgg.SpawnedOrAnyParentSpawned)
            {
                return(GenSpawn.Spawn(pawn, motherOrEgg.PositionHeld, motherOrEgg.MapHeld) != null);
            }
            Pawn pawn2 = motherOrEgg as Pawn;

            if (pawn2 != null)
            {
                if (pawn2.IsCaravanMember())
                {
                    pawn2.GetCaravan().AddPawn(pawn, addCarriedPawnToWorldPawnsIfAny: true);
                    Find.WorldPawns.PassToWorld(pawn);
                    return(true);
                }
                if (pawn2.IsWorldPawn())
                {
                    Find.WorldPawns.PassToWorld(pawn);
                    return(true);
                }
            }
            else if (motherOrEgg.ParentHolder != null)
            {
                Pawn_InventoryTracker pawn_InventoryTracker = motherOrEgg.ParentHolder as Pawn_InventoryTracker;
                if (pawn_InventoryTracker != null)
                {
                    if (pawn_InventoryTracker.pawn.IsCaravanMember())
                    {
                        pawn_InventoryTracker.pawn.GetCaravan().AddPawn(pawn, addCarriedPawnToWorldPawnsIfAny: true);
                        Find.WorldPawns.PassToWorld(pawn);
                        return(true);
                    }
                    if (pawn_InventoryTracker.pawn.IsWorldPawn())
                    {
                        Find.WorldPawns.PassToWorld(pawn);
                        return(true);
                    }
                }
            }
            return(false);
        }
        internal static void Remove(this ThingContainer _this, Thing item)
        {
            if (!_this.Contains(item))
            {
                return;
            }
            if (item.holdingContainer == _this)
            {
                item.holdingContainer = null;
            }
            List <Thing> innerList = (List <Thing>)innerListFieldInfo.GetValue(_this);    // Fetch innerList through reflection

            innerList.Remove(item);
            Pawn_InventoryTracker pawn_InventoryTracker = _this.owner as Pawn_InventoryTracker;

            if (pawn_InventoryTracker != null)
            {
                pawn_InventoryTracker.Notify_ItemRemoved(item);
            }
            CR_Utility.TryUpdateInventory(_this.owner as Pawn_InventoryTracker);           // Item was removed, update inventory
        }
示例#16
0
 public static void Postfix_FirstUnloadableThing(Pawn_InventoryTracker __instance, ref ThingCount __result)
 {
     if (__result.Thing is SurvivalTool tool && tool.InUse)
     {
         bool foundNewThing = false;
         // Had to iterate through because a lambda expression in this case isn't possible
         for (int i = 0; i < __instance.innerContainer.Count; i++)
         {
             Thing newThing = __instance.innerContainer[i];
             if (newThing as SurvivalTool == null || !((SurvivalTool)newThing).InUse)
             {
                 __result      = new ThingCount(newThing, newThing.stackCount);
                 foundNewThing = true;
                 break;
             }
         }
         if (!foundNewThing)
         {
             __result = default(ThingCount);
         }
     }
 }
        public static void DropUnmarkableNearPawn(Pawn_InventoryTracker inventory, IntVec3 pos, bool forbid = false, bool unforbid = false)
        {
            if (inventory.pawn.MapHeld == null)
            {
                Log.Error("Tried to drop all inventory near pawn but the pawn is unspawned. pawn=" + inventory.pawn, false);
                return;
            }
            List <Thing> tmpThingList = new List <Thing>();

            tmpThingList.AddRange(inventory.innerContainer);
            for (int i = 0; i < tmpThingList.Count; i++)
            {
                ThingWithComps twc = tmpThingList[i] as ThingWithComps;

                if (twc != null)
                {
                    continue;
                }

                Thing thing;
                inventory.innerContainer.TryDrop(tmpThingList[i], pos, inventory.pawn.MapHeld, ThingPlaceMode.Near, out thing, delegate(Thing t, int unused)
                {
                    if (forbid)
                    {
                        t.SetForbiddenIfOutsideHomeArea();
                    }
                    if (unforbid)
                    {
                        t.SetForbidden(false, false);
                    }
                    if (t.def.IsPleasureDrug)
                    {
                        LessonAutoActivator.TeachOpportunity(ConceptDefOf.DrugBurning, OpportunityType.Important);
                    }
                }, null);
            }
        }
 public static void Prefix(ref Thing __instance, Map map, bool respawningAfterLoad)
 {
     if (respawningAfterLoad)
     {
         Type           type     = __instance.GetType();
         ThingWithComps original = __instance as ThingWithComps;
         if (original != null)
         {
             try
             {
                 Pawn pawn = original as Pawn;
                 if (pawn != null)
                 {
                     //    if (AMAMod.Dev) Log.Message(string.Format("checking {0}", pawn.Name.ToStringFull ?? pawn.NameShortColored));
                     Pawn_EquipmentTracker equipmentTracker = pawn.equipment;
                     Pawn_ApparelTracker   apparelTracker   = pawn.apparel;
                     Pawn_InventoryTracker inventoryTracker = pawn.inventory;
                     if (equipmentTracker != null)
                     {
                         if (!equipmentTracker.AllEquipmentListForReading.NullOrEmpty())
                         {
                             //    if (AMAMod.Dev) Log.Message(string.Format("checking {0}'s equipment", pawn.NameShortColored));
                             for (int i = 0; i < equipmentTracker.AllEquipmentListForReading.Count; i++)
                             {
                                 if (ShouldUpdate(equipmentTracker.AllEquipmentListForReading[i]))
                                 {
                                     //    if (AMAMod.Dev) Log.Message(string.Format("repalce {0}'s equipment({1}) class", pawn.NameShortColored, equipmentTracker.AllEquipmentListForReading[i]));
                                     equipmentTracker.AllEquipmentListForReading[i] = ReplacedThing(equipmentTracker.AllEquipmentListForReading[i]) as ThingWithComps;
                                 }
                             }
                         }
                     }
                     if (apparelTracker != null)
                     {
                         if (!apparelTracker.WornApparel.NullOrEmpty())
                         {
                             //    if (AMAMod.Dev) Log.Message(string.Format("checking {0}'s apparel", pawn.NameShortColored));
                             for (int i = 0; i < apparelTracker.WornApparel.Count; i++)
                             {
                                 if (ShouldUpdate(apparelTracker.WornApparel[i]))
                                 {
                                     //   if (AMAMod.Dev) Log.Message(string.Format("repalce {0}'s apparel({1}) class", pawn.NameShortColored, apparelTracker.WornApparel[i]));
                                     apparelTracker.WornApparel[i] = ReplacedThing(apparelTracker.WornApparel[i]) as Apparel;
                                 }
                             }
                         }
                     }
                     if (inventoryTracker != null)
                     {
                         if (!inventoryTracker.GetDirectlyHeldThings().NullOrEmpty())
                         {
                             //    if (AMAMod.Dev) Log.Message(string.Format("checking {0}'s inventory", pawn.NameShortColored));
                             for (int i = inventoryTracker.GetDirectlyHeldThings().Count - 1; i > 0; i--)
                             {
                                 if (ShouldUpdate(inventoryTracker.GetDirectlyHeldThings()[i]))
                                 {
                                     //    if (AMAMod.Dev) Log.Message(string.Format("replace {0}'s inventory({1}) class", pawn.NameShortColored, inventoryTracker.GetDirectlyHeldThings()[i]));
                                     Thing replace = ReplacedThing(inventoryTracker.GetDirectlyHeldThings()[i] as ThingWithComps);
                                     inventoryTracker.GetDirectlyHeldThings().RemoveAt(i);
                                     inventoryTracker.GetDirectlyHeldThings().TryAdd(ReplacedThing(replace as ThingWithComps));
                                 }
                             }
                         }
                     }
                 }
                 else
                 {
                     if (ShouldUpdate(original))
                     {
                         __instance = ReplacedThing(original);
                     }
                 }
             }
             catch (Exception)
             {
                 if (AMAMod.Dev)
                 {
                     Log.Warning("Something went wrong trying to replace " + __instance.LabelCap + "'s ThingClass");
                 }
             }
             finally
             {
                 if (type != __instance.def.thingClass && type != typeof(Pawn))
                 {
                     if (AMAMod.Dev)
                     {
                         Log.Warning("Failed to replace " + __instance.LabelCap + "'s ThingClass(" + type.Name + ") to " + __instance.def.thingClass.Name);
                     }
                 }
             }
         }
     }
 }
        private static bool Prefix(Pawn_InventoryTracker __instance, ref ThingCount __result)
        {
            if (__instance.innerContainer.Count == 0)
            {
                __result = default;
                return(false);
            }

            tmpDrugsToKeep.Clear();

            if (__instance.pawn.drugs?.CurrentPolicy != null)
            {
                var currentPolicy = __instance.pawn.drugs.CurrentPolicy;
                for (var i = 0; i < currentPolicy.Count; i++)
                {
                    if (currentPolicy[i].takeToInventory > 0)
                    {
                        tmpDrugsToKeep.Add(new ThingDefCount(currentPolicy[i].drug, currentPolicy[i].takeToInventory));
                    }
                }
            }

            Thing bestInstrument = null;

            if (!__instance.pawn.NonHumanlikeOrWildMan() && !__instance.pawn.WorkTagIsDisabled(WorkTags.Artistic))
            {
                var artSkill = __instance.pawn.skills.GetSkill(SkillDefOf.Artistic).levelInt;

                IEnumerable <Thing> heldInstruments = __instance.innerContainer
                                                      .Where(PerformanceManager.IsInstrument)
                                                      .Where(x => !x.TryGetComp <CompMusicalInstrument>().Props.isBuilding)
                                                      .OrderByDescending(x => x.TryGetComp <CompMusicalInstrument>().WeightedSuitability(artSkill));

                if (heldInstruments.Any())
                {
                    bestInstrument = heldInstruments.FirstOrDefault();
                }
            }

            if (tmpDrugsToKeep.Any() || bestInstrument != null)
            {
                foreach (var thing in __instance.innerContainer)
                {
                    if (thing.def.IsDrug)
                    {
                        var num = -1;

                        for (var k = 0; k < tmpDrugsToKeep.Count; k++)
                        {
                            if (thing.def != tmpDrugsToKeep[k].ThingDef)
                            {
                                continue;
                            }

                            num = k;
                            break;
                        }

                        if (num < 0)
                        {
                            __result = new ThingCount(thing,
                                                      thing.stackCount);
                            return(false);
                        }

                        if (thing.stackCount > tmpDrugsToKeep[num].Count)
                        {
                            __result = new ThingCount(thing,
                                                      thing.stackCount - tmpDrugsToKeep[num].Count);
                            return(false);
                        }

                        tmpDrugsToKeep[num] = new ThingDefCount(tmpDrugsToKeep[num].ThingDef,
                                                                tmpDrugsToKeep[num].Count - thing.stackCount);
                    }
                    else if (PerformanceManager.IsInstrument(thing))
                    {
                        if (bestInstrument == null)
                        {
                            __result = new ThingCount(thing,
                                                      thing.stackCount);
                            return(false);
                        }

                        if (bestInstrument.GetHashCode() == thing.GetHashCode())
                        {
                            continue;
                        }

                        __result = new ThingCount(thing,
                                                  thing.stackCount);
                        return(false);
                    }
                    else
                    {
                        __result = new ThingCount(thing,
                                                  thing.stackCount);
                        return(false);
                    }
                }

                __result = default;
                return(false);
            }

            __result = new ThingCount(__instance.innerContainer[0], __instance.innerContainer[0].stackCount);
            return(false);
        }
        public static void Postfix(Caravan __instance, ref IEnumerable <Gizmo> __result)
        {
            float masss = 0;

            foreach (Pawn pawn in __instance.pawns.InnerListForReading)
            {
                for (int j = 0; j < pawn.inventory.innerContainer.Count; j++)
                {
                    if (pawn.inventory.innerContainer[j].def != USCMDefOf.RRY_USCM_DropshipUD4L)
                    {
                        masss += (pawn.inventory.innerContainer[j].def.BaseMass * pawn.inventory.innerContainer[j].stackCount);
                    }
                }
            }

            foreach (Pawn pawn in __instance.pawns.InnerListForReading)
            {
                Pawn_InventoryTracker pinv = pawn.inventory;
                for (int i = 0; i < pinv.innerContainer.Count; i++)
                {
                    if (pinv.innerContainer[i].def == USCMDefOf.RRY_USCM_DropshipUD4L)
                    {
                        Command_Action launch = new Command_Action();
                        launch.defaultLabel = "CommandSendShuttle".Translate();
                        launch.defaultDesc  = "CommandSendShuttleDesc".Translate();
                        launch.icon         = ContentFinder <Texture2D> .Get("UI/Commands/LaunchShip", true);

                        launch.alsoClickIfOtherInGroupClicked = false;
                        launch.action = delegate
                        {
                            float maxmass = pinv.innerContainer[i].TryGetComp <CompTransporter>().Props.massCapacity;
                            if (masss <= maxmass)
                            {
                                pinv.innerContainer[i].TryGetComp <CompUSCMDropship>().WorldStartChoosingDestination(__instance);
                            }
                            else
                            {
                                Messages.Message("TooBigTransportersMassUsage".Translate() + "(" + (maxmass - masss) + "KG)", MessageTypeDefOf.RejectInput, false);
                            }
                        };

                        List <Gizmo> newr = __result.ToList();
                        newr.Add(launch);

                        Command_Action addFuel = new Command_Action();
                        addFuel.defaultLabel = "USCM_Dropship_CommandAddFuel".Translate();
                        addFuel.defaultDesc  = "USCM_Dropship_CommandAddFuelDesc".Translate();
                        addFuel.icon         = ContentFinder <Texture2D> .Get("Things/Item/Resource/Chemfuel", true);

                        addFuel.alsoClickIfOtherInGroupClicked = false;
                        addFuel.action = delegate
                        {
                            bool           hasAddFuel = false;
                            int            fcont      = 0;
                            CompRefuelable comprf     = pinv.innerContainer[i].TryGetComp <CompRefuelable>();
                            List <Thing>   list       = CaravanInventoryUtility.AllInventoryItems(__instance);
                            //pinv.innerContainer.Count
                            for (int j = 0; j < list.Count; j++)
                            {
                                if (list[j].def == ThingDefOf.Chemfuel)
                                {
                                    fcont = list[j].stackCount;
                                    Pawn  ownerOf = CaravanInventoryUtility.GetOwnerOf(__instance, list[j]);
                                    float need    = comprf.Props.fuelCapacity - comprf.Fuel;

                                    if (need < 1f && need > 0)
                                    {
                                        fcont = 1;
                                    }
                                    if (fcont * 1f >= need)
                                    {
                                        fcont = (int)need;
                                    }



                                    // Log.Warning("f&n is "+fcont+"/"+need);
                                    if (list[j].stackCount * 1f <= fcont)
                                    {
                                        list[j].stackCount -= fcont;
                                        Thing thing = list[j];
                                        ownerOf.inventory.innerContainer.Remove(thing);
                                        thing.Destroy(DestroyMode.Vanish);
                                    }
                                    else
                                    {
                                        if (fcont != 0)
                                        {
                                            list[j].SplitOff(fcont).Destroy(DestroyMode.Vanish);
                                        }
                                    }


                                    Type      crtype = comprf.GetType();
                                    FieldInfo finfo  = crtype.GetField("fuel", BindingFlags.NonPublic | BindingFlags.Instance);
                                    finfo.SetValue(comprf, comprf.Fuel + fcont);
                                    hasAddFuel = true;
                                    break;
                                }
                            }
                            if (hasAddFuel)
                            {
                                Messages.Message("USCM_Dropship_AddFuelDoneMsg".Translate(fcont, comprf.Fuel), MessageTypeDefOf.PositiveEvent, false);
                            }
                            else
                            {
                                Messages.Message("USCM_Dropship_NoFuelMsg".Translate(), MessageTypeDefOf.RejectInput, false);
                            }
                        };

                        newr.Add(addFuel);

                        Gizmo_MapRefuelableFuelStatus fuelStat = new Gizmo_MapRefuelableFuelStatus
                        {
                            nowFuel   = pinv.innerContainer[i].TryGetComp <CompRefuelable>().Fuel,
                            maxFuel   = pinv.innerContainer[i].TryGetComp <CompRefuelable>().Props.fuelCapacity,
                            compLabel = pinv.innerContainer[i].TryGetComp <CompRefuelable>().Props.FuelGizmoLabel
                        };


                        newr.Add(fuelStat);

                        __result = newr;
                        return;
                    }
                }
            }
        }
示例#21
0
        public Pawn FromRealmPawn(RealmData realmData)
        {
            // This code is mainly a copy/paste of what happens in
            // PawnGenerator.DoGenerateNakedPawn()
            PawnKindDef kindDef = DefDatabase <PawnKindDef> .GetNamed(kindDefName);

            Pawn pawn = (Pawn)ThingMaker.MakeThing(kindDef.race);

            pawn.kindDef = kindDef;
            pawn.SetFactionDirect(Faction.OfPlayer);
            PawnComponentsUtility.CreateInitialComponents(pawn);
            pawn.gender = gender;

            // What is done in GenerateRandomAge()
            pawn.ageTracker.AgeBiologicalTicks    = ageBiologicalTicks;
            pawn.ageTracker.AgeChronologicalTicks = ageChronologicalTicks;

            // Ignored SetInitialLevels()
            // Ignored GenerateInitialHediffs()
            // Ignored GeneratePawnRelations()

            Pawn_StoryTracker story = pawn.story;

            story.melanin   = melanin;
            story.crownType = crownType;
            story.hairColor = new Color(hairColor[0], hairColor[1], hairColor[2], hairColor[3]);

            // What is done in GiveAppropriateBio()
            Name nameObj = pawn.Name;

            switch (name.Count())
            {
            case 1:
                nameObj = new NameSingle(name[0]);
                break;

            case 2:
                nameObj = new NameTriple(name[0], name[1], name[1]);
                break;

            case 3:
                nameObj = new NameTriple(name[0], name[1], name[2]);
                break;
            }
            pawn.Name = nameObj;

            if (!BackstoryDatabase.TryGetWithIdentifier(childhoodKey, out story.childhood))
            {
                throw new Exception(string.Format("Couldn't find backstory '{0}'", childhoodKey));
            }
            if (!string.IsNullOrEmpty(adulthoodKey) && !BackstoryDatabase.TryGetWithIdentifier(adulthoodKey, out story.adulthood))
            {
                throw new Exception(string.Format("Couldn't find backstory '{0}'", adulthoodKey));
            }

            story.hairDef = DefDatabase <HairDef> .GetNamed(hairDefName);

            // Done in GiveRandomTraits()
            foreach (RealmTrait trait in traits)
            {
                TraitDef traitDef = DefDatabase <TraitDef> .GetNamed(trait.traitDefName);

                story.traits.GainTrait(new Trait(traitDef, trait.degree));
            }

            // We attribute the skills level
            foreach (RealmSkillRecord rec in skills.AsEnumerable())
            {
                SkillDef skillDef = DefDatabase <SkillDef> .AllDefs.First((def) => def.label == rec.skillDefLabel);

                SkillRecord skill = pawn.skills.GetSkill(skillDef);
                skill.Level   = rec.level;
                skill.passion = rec.passion;
            }

            pawn.workSettings.EnableAndInitialize();

            // Once we've generated a new solid pawn, we generate the gear of it
            // GenerateStartingApparelFor()
            Pawn_ApparelTracker apparelTracker = pawn.apparel;

            foreach (RealmThing realmThing in apparels)
            {
                Apparel apparel = (Apparel)realmData.FromRealmThing(realmThing);

                apparelTracker.Wear(apparel);
            }

            // TryGenerateWeaponFor()
            Pawn_EquipmentTracker equipmentTracker = pawn.equipment;

            foreach (RealmThing realmThing in equipments)
            {
                ThingWithComps thingWithComps = (ThingWithComps)realmData.FromRealmThing(realmThing);

                equipmentTracker.AddEquipment(thingWithComps);
            }

            // GenerateInventoryFor()
            Pawn_InventoryTracker inventoryTracker = pawn.inventory;

            foreach (RealmThing realmThing in inventory)
            {
                Thing thing = realmData.FromRealmThing(realmThing);

                inventoryTracker.innerContainer.TryAdd(thing);
            }

            // GenerateHediffsFor()
            if (hediffs == null)
            {
                Log.Warning("RealmHediffs is null in received colonist");
            }

            foreach (RealmHediff hediff in hediffs ?? new List <RealmHediff>())
            {
                var definition = DefDatabase <HediffDef> .GetNamed(hediff.hediffDefName);

                BodyPartRecord bodypart = null;
                if (hediff.bodyPartIndex != -1)
                {
                    bodypart = pawn.RaceProps.body.GetPartAtIndex(hediff.bodyPartIndex);
                }

                pawn.health.AddHediff(definition, bodypart);
                var newdiff = pawn.health.hediffSet.hediffs.Last();
                newdiff.source   = (hediff.sourceDefName == null ? null : DefDatabase <ThingDef> .GetNamedSilentFail(hediff.sourceDefName));
                newdiff.ageTicks = hediff.ageTicks;
                newdiff.Severity = hediff.severity;

                if (!float.IsNaN(hediff.immunity) && !pawn.health.immunity.ImmunityRecordExists(definition))
                {
                    var handler = pawn.health.immunity;
                    handler.GetType().GetMethod("TryAddImmunityRecord", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).Invoke(handler, new object[] { definition });
                    var record = handler.GetImmunityRecord(definition);
                    record.immunity = hediff.immunity;
                }
            }

            var healthStateField = pawn.health.GetType().GetField("healthState", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

            if (healthStateField == null)
            {
                Log.Error("Unable to find healthState field");
            }
            else
            {
                healthStateField.SetValue(pawn.health, healthState);
            }

            // GenerateHediffsFor()
            if (workPriorities == null)
            {
                Log.Warning("WorkPriorities is null in received colonist");
            }

            foreach (KeyValuePair <string, int> priority in workPriorities ?? new Dictionary <string, int>())
            {
                var def = DefDatabase <WorkTypeDef> .GetNamedSilentFail(priority.Key);

                if (def == null)
                {
                    Log.Warning(String.Format("Ignoring unknown workType: {0}", priority.Key));
                    continue;
                }
                pawn.workSettings.SetPriority(def, priority.Value);
            }

            return(pawn);
        }
        public void TryLaunch(int destinationTile, TransportPodsArrivalAction arrivalAction, Caravan cafr = null)
        {
            if (cafr == null && !this.parent.Spawned)
            {
                Log.Error("Tried to launch " + (object)this.parent + ", but it's unspawned.", false);
            }
            else
            {
                if (this.parent.Spawned && !this.LoadingInProgressOrReadyToLaunch || (!this.AllInGroupConnectedToFuelingPort || !this.AllFuelingPortSourcesInGroupHaveAnyFuel))
                {
                    return;
                }
                if (cafr == null)
                {
                    Map map = this.parent.Map;
                    int num = Find.WorldGrid.TraversalDistanceBetween(map.Tile, destinationTile, true, int.MaxValue);
                    if (num > this.MaxLaunchDistance)
                    {
                        return;
                    }
                    this.Transporter.TryRemoveLord(map);
                    int             groupId           = this.Transporter.groupID;
                    float           amount            = Mathf.Max(CompLaunchableSRTS.FuelNeededToLaunchAtDist((float)num), 1f);
                    CompTransporter comp1             = this.FuelingPortSource.TryGetComp <CompTransporter>();
                    Building        fuelingPortSource = this.FuelingPortSource;
                    if (fuelingPortSource != null)
                    {
                        fuelingPortSource.TryGetComp <CompRefuelable>().ConsumeFuel(amount);
                    }
                    ThingOwner directlyHeldThings = comp1.GetDirectlyHeldThings();

                    // Neceros Edit
                    Thing thing = ThingMaker.MakeThing(ThingDef.Named(parent.def.defName), (ThingDef)null);
                    thing.SetFactionDirect(Faction.OfPlayer);
                    thing.Rotation = this.FuelingPortSource.Rotation;
                    CompRefuelable comp2 = thing.TryGetComp <CompRefuelable>();
                    comp2.GetType().GetField("fuel", BindingFlags.Instance | BindingFlags.NonPublic).SetValue((object)comp2, (object)fuelingPortSource.TryGetComp <CompRefuelable>().Fuel);
                    comp2.TargetFuelLevel = fuelingPortSource.TryGetComp <CompRefuelable>().TargetFuelLevel;
                    thing.stackCount      = 1;
                    directlyHeldThings.TryAddOrTransfer(thing, true);

                    // Neceros Edit
                    ActiveDropPod activeDropPod = (ActiveDropPod)ThingMaker.MakeThing(ThingDef.Named(parent.def.defName + "_Active"), null);
                    activeDropPod.Contents = new ActiveDropPodInfo();
                    activeDropPod.Contents.innerContainer.TryAddRangeOrTransfer((IEnumerable <Thing>)directlyHeldThings, true, true);

                    // Neceros Edit
                    SRTSLeaving srtsLeaving = (SRTSLeaving)SkyfallerMaker.MakeSkyfaller(ThingDef.Named(parent.def.defName + "_Leaving"), (Thing)activeDropPod);
                    srtsLeaving.rotation        = this.FuelingPortSource.Rotation;
                    srtsLeaving.groupID         = groupId;
                    srtsLeaving.destinationTile = destinationTile;
                    srtsLeaving.arrivalAction   = arrivalAction;
                    comp1.CleanUpLoadingVars(map);
                    IntVec3 position = fuelingPortSource.Position;
                    SRTSStatic.SRTSDestroy((Thing)fuelingPortSource, DestroyMode.Vanish);
                    GenSpawn.Spawn((Thing)srtsLeaving, position, map, WipeMode.Vanish);
                    CameraJumper.TryHideWorld();
                }
                else
                {
                    int num = Find.WorldGrid.TraversalDistanceBetween(this.carr.Tile, destinationTile, true, int.MaxValue);
                    if (num > this.MaxLaunchDistance)
                    {
                        return;
                    }
                    float amount = Mathf.Max(CompLaunchableSRTS.FuelNeededToLaunchAtDist((float)num), 1f);
                    if (this.FuelingPortSource != null)
                    {
                        this.FuelingPortSource.TryGetComp <CompRefuelable>().ConsumeFuel(amount);
                    }
                    ThingOwner <Pawn> directlyHeldThings = (ThingOwner <Pawn>)cafr.GetDirectlyHeldThings();
                    Thing             thing = null;
                    foreach (Pawn pawn in directlyHeldThings.InnerListForReading)
                    {
                        Pawn_InventoryTracker inventory = pawn.inventory;
                        for (int index = 0; index < inventory.innerContainer.Count; ++index)
                        {
                            // Neceros Edit
                            if (inventory.innerContainer[index].TryGetComp <CompLaunchableSRTS>() != null)
                            {
                                thing = inventory.innerContainer[index];
                                inventory.innerContainer[index].holdingOwner.Remove(inventory.innerContainer[index]);
                                break;
                            }
                        }
                    }
                    /*Add caravan items to SRTS - SmashPhil */
                    foreach (Pawn p in directlyHeldThings.InnerListForReading)
                    {
                        p.inventory.innerContainer.InnerListForReading.ForEach(x => AddThingsToSRTS(x));
                        p.inventory.innerContainer.Clear();
                    }

                    ThingOwner <Thing> thingOwner = new ThingOwner <Thing>();
                    foreach (Pawn pawn in directlyHeldThings.AsEnumerable <Pawn>().ToList <Pawn>())
                    {
                        thingOwner.TryAddOrTransfer((Thing)pawn, true);
                    }
                    if (thing != null && thing.holdingOwner == null)
                    {
                        thingOwner.TryAddOrTransfer(thing, false);
                    }

                    // Neceros Edit
                    ActiveDropPod activeDropPod = (ActiveDropPod)ThingMaker.MakeThing(ThingDef.Named(parent.def.defName + "_Active"), (ThingDef)null);
                    activeDropPod.Contents = new ActiveDropPodInfo();
                    activeDropPod.Contents.innerContainer.TryAddRangeOrTransfer((IEnumerable <Thing>)thingOwner, true, true);
                    activeDropPod.Contents.innerContainer.TryAddRangeOrTransfer((IEnumerable <Thing>)thingsInsideShip, true, true);
                    thingsInsideShip.Clear();

                    cafr.RemoveAllPawns();
                    if (cafr.Spawned)
                    {
                        Find.WorldObjects.Remove((WorldObject)cafr);
                    }
                    TravelingTransportPods travelingTransportPods = (TravelingTransportPods)WorldObjectMaker.MakeWorldObject(DefDatabase <WorldObjectDef> .GetNamed("TravelingSRTS", true));
                    travelingTransportPods.Tile = cafr.Tile;
                    travelingTransportPods.SetFaction(Faction.OfPlayer);
                    travelingTransportPods.destinationTile = destinationTile;
                    travelingTransportPods.arrivalAction   = arrivalAction;
                    Find.WorldObjects.Add((WorldObject)travelingTransportPods);
                    travelingTransportPods.AddPod(activeDropPod.Contents, true);
                    activeDropPod.Contents = (ActiveDropPodInfo)null;
                    activeDropPod.Destroy(DestroyMode.Vanish);
                    Find.WorldTargeter.StopTargeting();
                }
            }
        }
示例#23
0
        internal static void getWeaponLists(out List <Thing> ranged, out List <Thing> melee, Pawn_InventoryTracker inventory)
        {
            ranged = new List <Thing>();
            melee  = new List <Thing>();

            foreach (Thing item in inventory.innerContainer)
            {
                if (item.def.IsRangedWeapon)
                {
                    ranged.Add(item);
                }
                else if (item.def.IsMeleeWeapon)
                {
                    melee.Add(item);
                }
            }
        }
        // Token: 0x060028DA RID: 10458 RVA: 0x001352F0 File Offset: 0x001336F0
        public void TryLaunch(int destinationTile, TransportPodsArrivalAction arrivalAction, Caravan cafr = null)
        {
            //Log.Warning("CARR:" + this.carr+"/"+cafr);
            if (cafr == null)
            {
                if (!this.parent.Spawned)
                {
                    Log.Error("Tried to launch " + this.parent + ", but it's unspawned.", false);
                    return;
                }
            }

            /*
             * List<CompTransporter> transportersInGroup = this.TransportersInGroup;
             * if (transportersInGroup == null)
             * {
             *  Log.Error("Tried to launch " + this.parent + ", but it's not in any group.", false);
             *  return;
             * }
             */
            if (this.parent.Spawned)
            {
                if (!this.LoadingInProgressOrReadyToLaunch)
                {
                    return;
                }
            }
            if (!this.AllInGroupConnectedToFuelingPort || !this.AllFuelingPortSourcesInGroupHaveAnyFuel)
            {
                return;
            }
            if (cafr == null)
            {
                Map map = this.parent.Map;
                int num = Find.WorldGrid.TraversalDistanceBetween(map.Tile, destinationTile, true, int.MaxValue);
                if (num > this.MaxLaunchDistance)
                {
                    return;
                }
                this.Transporter.TryRemoveLord(map);
                int   groupID = this.Transporter.groupID;
                float amount  = Mathf.Max(CompLaunchableHelicopter.FuelNeededToLaunchAtDist((float)num), 1f);
                //for (int i = 0; i < transportersInGroup.Count; i++)

                CompTransporter compTransporter   = this.FuelingPortSource.TryGetComp <CompTransporter>(); //transportersInGroup[i];
                Building        fuelingPortSource = this.FuelingPortSource;                                //compTransporter.Launchable.FuelingPortSource;
                if (fuelingPortSource != null)
                {
                    fuelingPortSource.TryGetComp <CompRefuelable>().ConsumeFuel(amount);
                }
                ThingOwner directlyHeldThings = compTransporter.GetDirectlyHeldThings();

                Thing helicopter = ThingMaker.MakeThing(ThingDef.Named("Building_Helicopter"));
                helicopter.SetFactionDirect(Faction.OfPlayer);

                CompRefuelable compr  = helicopter.TryGetComp <CompRefuelable>();
                Type           tcr    = compr.GetType();
                FieldInfo      finfos = tcr.GetField("fuel", BindingFlags.NonPublic | BindingFlags.Instance);
                finfos.SetValue(compr, fuelingPortSource.TryGetComp <CompRefuelable>().Fuel);

                compr.TargetFuelLevel = fuelingPortSource.TryGetComp <CompRefuelable>().TargetFuelLevel;

                helicopter.stackCount = 1;
                directlyHeldThings.TryAddOrTransfer(helicopter);

                ActiveDropPod activeDropPod = (ActiveDropPod)ThingMaker.MakeThing(ThingDef.Named("ActiveHelicopter"), null);
                activeDropPod.Contents = new ActiveDropPodInfo();
                activeDropPod.Contents.innerContainer.TryAddRangeOrTransfer(directlyHeldThings, true, true);
                HelicopterLeaving dropPodLeaving = (HelicopterLeaving)SkyfallerMaker.MakeSkyfaller(ThingDef.Named("HelicopterLeaving"), activeDropPod);
                dropPodLeaving.groupID         = groupID;
                dropPodLeaving.destinationTile = destinationTile;
                dropPodLeaving.arrivalAction   = arrivalAction;
                compTransporter.CleanUpLoadingVars(map);
                //compTransporter.parent
                IntVec3 poc = fuelingPortSource.Position;
                // fuelingPortSource.Destroy(DestroyMode.Vanish);
                HelicopterStatic.HelicopterDestroy(fuelingPortSource, DestroyMode.Vanish);
                GenSpawn.Spawn(dropPodLeaving, poc, map, WipeMode.Vanish);

                CameraJumper.TryHideWorld();
            }
            else
            {
                int num = Find.WorldGrid.TraversalDistanceBetween(carr.Tile, destinationTile, true, int.MaxValue);
                if (num > this.MaxLaunchDistance)
                {
                    return;
                }
                float amount = Mathf.Max(CompLaunchableHelicopter.FuelNeededToLaunchAtDist((float)num), 1f);
                if (FuelingPortSource != null)
                {
                    FuelingPortSource.TryGetComp <CompRefuelable>().ConsumeFuel(amount);
                }


                ThingOwner <Pawn> directlyHeldThings = (ThingOwner <Pawn>)cafr.GetDirectlyHeldThings();
                Thing             helicopter         = null;
                foreach (Pawn pawn in directlyHeldThings.InnerListForReading)
                {
                    Pawn_InventoryTracker pinv = pawn.inventory;
                    for (int i = 0; i < pinv.innerContainer.Count; i++)
                    {
                        if (pinv.innerContainer[i].def.defName == ("Building_Helicopter"))
                        {
                            helicopter = pinv.innerContainer[i];
                            pinv.innerContainer[i].holdingOwner.Remove(pinv.innerContainer[i]);

                            break;
                        }
                    }
                }

                ThingOwner <Thing> finalto = new ThingOwner <Thing>();
                List <Pawn>        lpto    = directlyHeldThings.AsEnumerable <Pawn>().ToList();
                foreach (Pawn p in lpto)
                {
                    finalto.TryAddOrTransfer(p);
                }


                if (helicopter != null)
                {
                    // Log.Warning("TRY ADD"+helicopter);
                    if (helicopter.holdingOwner == null)
                    {
                        //Log.Warning("NULL");
                        //directlyHeldThings.
                        finalto.TryAddOrTransfer(helicopter, false);
                    }
                }


                ActiveDropPod activeDropPod = (ActiveDropPod)ThingMaker.MakeThing(ThingDef.Named("ActiveHelicopter"), null);
                activeDropPod.Contents = new ActiveDropPodInfo();
                activeDropPod.Contents.innerContainer.TryAddRangeOrTransfer(
                    //directlyHeldThings
                    finalto, true, true);

                cafr.RemoveAllPawns();
                if (cafr.Spawned)
                {
                    Find.WorldObjects.Remove(cafr);
                }

                TravelingTransportPods travelingTransportPods = (TravelingTransportPods)WorldObjectMaker.MakeWorldObject(DefDatabase <WorldObjectDef> .GetNamed("TravelingHelicopters", true));
                travelingTransportPods.Tile = cafr.Tile;
                travelingTransportPods.SetFaction(Faction.OfPlayer);
                travelingTransportPods.destinationTile = destinationTile;
                travelingTransportPods.arrivalAction   = arrivalAction;
                Find.WorldObjects.Add(travelingTransportPods);
                travelingTransportPods.AddPod(activeDropPod.Contents, true);
                activeDropPod.Contents = null;
                activeDropPod.Destroy(DestroyMode.Vanish);
                // CameraJumper.TryHideWorld();
                Find.WorldTargeter.StopTargeting();
            }
        }
示例#25
0
文件: Vehicle.cs 项目: BBream/Vehicle
        // ==================================
        public override void SpawnSetup()
        {
            base.SpawnSetup();

            tickTime = 0;
            this.training = null;
            callDriver = false;
            visibleInside = false;
            driverContainer = new ThingContainer(this, true);
            driverContainer.owner = this;
            inventory = new Pawn_InventoryTracker(this);

            //def.race.corpseDef = ThingDefOf.Steel;
            vehicleDef = def as VehicleDef;

            //Work setting
            this.drafter = new Pawn_DraftController(this);
            callDriver = false;
            isStandby = false;

            turretGuns = new List<Parts_TurretGun>();
            if (!vehicleDef.vehicle.turretGunDefs.NullOrEmpty())
                for (int i = 0; i < vehicleDef.vehicle.turretGunDefs.Count; i++)
                {
                    Parts_TurretGun turretGun = new Parts_TurretGun();
                    turretGun.parent = this;
                    turretGun.parts_TurretGunDef = vehicleDef.vehicle.turretGunDefs[i];
                    turretGun.SpawnSetup();
                    turretGuns.Add(turretGun);
                }
        }
示例#26
0
        public Pawn FromRealmPawn(RealmData realmData)
        {
            // This code is mainly a copy/paste of what happens in
            // PawnGenerator.DoGenerateNakedPawn()
            PawnKindDef kindDef = DefDatabase <PawnKindDef> .GetNamed(kindDefName);

            Pawn pawn = (Pawn)ThingMaker.MakeThing(kindDef.race);

            pawn.kindDef = kindDef;
            pawn.SetFactionDirect(Faction.OfPlayer);
            PawnComponentsUtility.CreateInitialComponents(pawn);
            pawn.gender = gender;

            // What is done in GenerateRandomAge()
            pawn.ageTracker.AgeBiologicalTicks    = ageBiologicalTicks;
            pawn.ageTracker.AgeChronologicalTicks = ageChronologicalTicks;

            // Ignored SetInitialLevels()
            // Ignored GenerateInitialHediffs()
            // Ignored GeneratePawnRelations()

            Pawn_StoryTracker story = pawn.story;

            story.melanin   = melanin;
            story.crownType = crownType;
            story.hairColor = new Color(hairColor[0], hairColor[1], hairColor[2], hairColor[3]);

            // What is done in GiveAppropriateBio()
            Name nameObj = pawn.Name;

            switch (name.Count())
            {
            case 1:
                nameObj = new NameSingle(name[0]);
                break;

            case 2:
                nameObj = new NameTriple(name[0], name[1], name[1]);
                break;

            case 3:
                nameObj = new NameTriple(name[0], name[1], name[2]);
                break;
            }
            pawn.Name = nameObj;

            if (!BackstoryDatabase.TryGetWithIdentifier(childhoodKey, out story.childhood))
            {
                throw new Exception(string.Format("Couldn't find backstory '{0}'", childhoodKey));
            }
            if (!BackstoryDatabase.TryGetWithIdentifier(adulthoodKey, out story.adulthood))
            {
                throw new Exception(string.Format("Couldn't find backstory '{0}'", adulthoodKey));
            }

            story.hairDef = DefDatabase <HairDef> .GetNamed(hairDefName);

            // Done in GiveRandomTraits()
            foreach (RealmTrait trait in traits)
            {
                TraitDef traitDef = DefDatabase <TraitDef> .GetNamed(trait.traitDefName);

                story.traits.GainTrait(new Trait(traitDef, trait.degree));
            }

            // We attribute the skills level
            foreach (RealmSkillRecord rec in skills.AsEnumerable())
            {
                SkillDef skillDef = DefDatabase <SkillDef> .AllDefs.First((def) => def.label == rec.skillDefLabel);

                SkillRecord skill = pawn.skills.GetSkill(skillDef);
                skill.Level   = rec.level;
                skill.passion = rec.passion;
            }

            pawn.workSettings.EnableAndInitialize();

            // Once we've generated a new solid pawn, we generate the gear of it
            // GenerateStartingApparelFor()
            Pawn_ApparelTracker apparelTracker = pawn.apparel;

            foreach (RealmThing realmThing in apparels)
            {
                Apparel apparel = (Apparel)realmData.FromRealmThing(realmThing);

                apparelTracker.Wear(apparel);
            }

            // TryGenerateWeaponFor()
            Pawn_EquipmentTracker equipmentTracker = pawn.equipment;

            foreach (RealmThing realmThing in equipments)
            {
                ThingWithComps thingWithComps = (ThingWithComps)realmData.FromRealmThing(realmThing);

                equipmentTracker.AddEquipment(thingWithComps);
            }

            // GenerateInventoryFor()
            Pawn_InventoryTracker inventoryTracker = pawn.inventory;

            foreach (RealmThing realmThing in inventory)
            {
                Thing thing = realmData.FromRealmThing(realmThing);

                inventoryTracker.innerContainer.TryAdd(thing);
            }

            return(pawn);
        }
示例#27
0
        public static void Postfix(Caravan __instance, ref IEnumerable <Gizmo> __result)
        {
            float masss = 0.0f;

            foreach (Pawn pawn in __instance.pawns.InnerListForReading)
            {
                for (int index = 0; index < pawn.inventory.innerContainer.Count; ++index)
                {
                    if (pawn.inventory.innerContainer[index].def.defName != "Building_Helicopter")
                    {
                        masss += pawn.inventory.innerContainer[index].def.BaseMass * (float)pawn.inventory.innerContainer[index].stackCount;
                    }
                }
            }
            foreach (Pawn pawn in __instance.pawns.InnerListForReading)
            {
                Pawn_InventoryTracker pinv = pawn.inventory;
                for (int i = 0; i < pinv.innerContainer.Count; i++)
                {
                    if (pinv.innerContainer[i].def.defName == "Building_Helicopter")
                    {
                        Command_Action commandAction1 = new Command_Action();
                        commandAction1.defaultLabel = "CommandLaunchGroup".Translate();
                        commandAction1.defaultDesc  = "CommandLaunchGroupDesc".Translate();
                        commandAction1.icon         = ContentFinder <Texture2D> .Get("UI/Commands/LaunchShip", true);

                        commandAction1.alsoClickIfOtherInGroupClicked = false;
                        commandAction1.action = (Action)(() =>
                        {
                            float massCapacity = pinv.innerContainer[i].TryGetComp <CompTransporter>().Props.massCapacity;
                            if ((double)masss <= (double)massCapacity)
                            {
                                pinv.innerContainer[i].TryGetComp <CompLaunchableHelicopter>().WorldStartChoosingDestination(__instance);
                            }
                            else
                            {
                                Messages.Message("TooBigTransportersMassUsage".Translate() + "(" + (object)(float)((double)massCapacity - (double)masss) + "KG)", MessageTypeDefOf.RejectInput, false);
                            }
                        });
                        List <Gizmo> list = __result.ToList <Gizmo>();
                        list.Add((Gizmo)commandAction1);
                        Command_Action commandAction2 = new Command_Action();
                        commandAction2.defaultLabel = "CommandAddFuel".Translate();
                        commandAction2.defaultDesc  = "CommandAddFuelDesc".Translate();
                        commandAction2.icon         = ContentFinder <Texture2D> .Get("Things/Item/Resource/Chemfuel", true);

                        commandAction2.alsoClickIfOtherInGroupClicked = false;
                        commandAction2.action = (Action)(() =>
                        {
                            bool flag = false;
                            int count = 0;
                            CompRefuelable comp = pinv.innerContainer[i].TryGetComp <CompRefuelable>();
                            List <Thing> thingList = CaravanInventoryUtility.AllInventoryItems(__instance);
                            for (int index = 0; index < thingList.Count; ++index)
                            {
                                if (thingList[index].def == ThingDefOf.Chemfuel)
                                {
                                    count = thingList[index].stackCount;
                                    Pawn ownerOf = CaravanInventoryUtility.GetOwnerOf(__instance, thingList[index]);
                                    float num = comp.Props.fuelCapacity - comp.Fuel;
                                    if ((double)num < 1.0 && (double)num > 0.0)
                                    {
                                        count = 1;
                                    }
                                    if ((double)count * 1.0 >= (double)num)
                                    {
                                        count = (int)num;
                                    }
                                    if ((double)thingList[index].stackCount * 1.0 <= (double)count)
                                    {
                                        thingList[index].stackCount -= count;
                                        Thing thing = thingList[index];
                                        ownerOf.inventory.innerContainer.Remove(thing);
                                        thing.Destroy(DestroyMode.Vanish);
                                    }
                                    else if ((uint)count > 0U)
                                    {
                                        thingList[index].SplitOff(count).Destroy(DestroyMode.Vanish);
                                    }
                                    comp.GetType().GetField("fuel", BindingFlags.Instance | BindingFlags.NonPublic).SetValue((object)comp, (object)(float)((double)comp.Fuel + (double)count));
                                    flag = true;
                                    break;
                                }
                            }
                            if (flag)
                            {
                                Messages.Message("AddFuelDoneMsg".Translate((object)count, (object)comp.Fuel), MessageTypeDefOf.PositiveEvent, false);
                            }
                            else
                            {
                                Messages.Message("NonOilMsg".Translate(), MessageTypeDefOf.RejectInput, false);
                            }
                        });
                        list.Add((Gizmo)commandAction2);
                        Gizmo_MapRefuelableFuelStatus refuelableFuelStatus = new Gizmo_MapRefuelableFuelStatus()
                        {
                            nowFuel   = pinv.innerContainer[i].TryGetComp <CompRefuelable>().Fuel,
                            maxFuel   = pinv.innerContainer[i].TryGetComp <CompRefuelable>().Props.fuelCapacity,
                            compLabel = pinv.innerContainer[i].TryGetComp <CompRefuelable>().Props.FuelGizmoLabel
                        };
                        list.Add((Gizmo)refuelableFuelStatus);
                        __result = (IEnumerable <Gizmo>)list;
                        return;
                    }
                }
            }
        }
 public static void Prefix(ref Thing __instance, Map map, bool respawningAfterLoad)
 {
     if (__instance?.def?.modContentPack != null && respawningAfterLoad)
     {
         ThingWithComps original = __instance as ThingWithComps;
         if (original != null)
         {
             try
             {
                 Pawn pawn = original as Pawn;
                 if (pawn != null)
                 {
                     Pawn_EquipmentTracker equipmentTracker = pawn.equipment;
                     Pawn_ApparelTracker   apparelTracker   = pawn.apparel;
                     Pawn_InventoryTracker inventoryTracker = pawn.inventory;
                     if (equipmentTracker != null)
                     {
                         if (!equipmentTracker.AllEquipmentListForReading.NullOrEmpty())
                         {
                             for (int i = 0; i < equipmentTracker.AllEquipmentListForReading.Count; i++)
                             {
                                 equipmentTracker.AllEquipmentListForReading[i] = ReplacedThing(equipmentTracker.AllEquipmentListForReading[i]) as ThingWithComps;
                             }
                         }
                     }
                     if (apparelTracker != null)
                     {
                         if (!apparelTracker.WornApparel.NullOrEmpty())
                         {
                             for (int i = 0; i < apparelTracker.WornApparel.Count; i++)
                             {
                                 apparelTracker.WornApparel[i] = ReplacedThing(apparelTracker.WornApparel[i]) as Apparel;
                             }
                         }
                     }
                     if (inventoryTracker != null)
                     {
                         if (!inventoryTracker.GetDirectlyHeldThings().NullOrEmpty())
                         {
                             for (int i = inventoryTracker.GetDirectlyHeldThings().Count - 1; i > 0; i--)
                             {
                                 Thing replace = ReplacedThing(inventoryTracker.GetDirectlyHeldThings()[i] as ThingWithComps);
                                 inventoryTracker.GetDirectlyHeldThings().RemoveAt(i);
                                 inventoryTracker.GetDirectlyHeldThings().TryAdd(ReplacedThing(replace as ThingWithComps));
                             }
                         }
                     }
                 }
                 else
                 {
                     __instance = ReplacedThing(original);
                 }
             }
             catch (Exception)
             {
                 Log.Warning("Something went wrong trying to replace " + __instance.LabelCap + "'s ThingClass");
             }
             finally
             {
                 if (__instance.GetType() != __instance.def.thingClass)
                 {
                     Log.Warning("Failed to replace " + __instance.LabelCap + "'s ThingClass");
                 }
             }
         }
     }
 }