Exemplo n.º 1
0
        public override void Apply(User user, RealmData realmData)
        {
            // We spawn the object with a DropPod
            Log.Message("Drop pod to spawn !");
            Thing thing = realmData.FromRealmThing(realmThing);

            IntVec3 position = DropCellFinder.RandomDropSpot();

            DropPodUtility.DropThingsNear(position, new Thing[] { thing });

            Find.LetterStack.ReceiveLetter(
                "Ship pod",
                "A pod was sent from " + userFrom.name + " containing " + thing.Label,
                LetterType.Good,
                position
                );
        }
Exemplo n.º 2
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);
        }
Exemplo n.º 3
0
        // Token: 0x06000038 RID: 56 RVA: 0x000030B0 File Offset: 0x000012B0
        public Pawn FromRealmPawn(RealmData realmData)
        {
            var named = DefDatabase <PawnKindDef> .GetNamed(kindDefName);

            var pawn = (Pawn)ThingMaker.MakeThing(named.race);

            foreach (var pawn2 in Find.WorldPawns.ForcefullyKeptPawns)
            {
                var   health = pawn2.health;
                float?num;
                if (health == null)
                {
                    num = null;
                }
                else
                {
                    var hediffSet = health.hediffSet;
                    if (hediffSet == null)
                    {
                        num = null;
                    }
                    else
                    {
                        var firstHediffOfDef = hediffSet.GetFirstHediffOfDef(PhiHediffDefOf.Phi_Key);
                        num = firstHediffOfDef != null ? new float?(firstHediffOfDef.Severity) : null;
                    }
                }

                var   num2 = num ?? -1f;
                var   list = hediffs;
                float?num3;
                if (list == null)
                {
                    num3 = null;
                }
                else
                {
                    var realmHediff = list.First(h => h.hediffDefName == PhiHediffDefOf.Phi_Key.defName);
                    num3 = realmHediff != null ? new float?(realmHediff.severity) : null;
                }

                if (num2 != num3)
                {
                    continue;
                }

                pawn = pawn2;
                break;
            }

            pawn.kindDef = named;
            pawn.SetFactionDirect(Faction.OfPlayer);
            PawnComponentsUtility.CreateInitialComponents(pawn);
            var pawnName = pawn.Name;

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

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

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

            pawn.Name   = pawnName;
            pawn.gender = gender;
            pawn.ageTracker.AgeBiologicalTicks    = ageBiologicalTicks;
            pawn.ageTracker.AgeChronologicalTicks = ageChronologicalTicks;
            var story = pawn.story;

            if (story != null)
            {
                story.melanin   = melanin;
                story.crownType = crownType;
                story.hairColor = new Color(hairColor[0], hairColor[1], hairColor[2], hairColor[3]);
                if (!BackstoryDatabase.TryGetWithIdentifier(childhoodKey, out story.childhood))
                {
                    throw new Exception($"Couldn't find backstory '{childhoodKey}'");
                }

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

                story.bodyType = DefDatabase <BodyTypeDef> .GetNamed(bodyTypeDefName);

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

                story.traits.allTraits.Clear();
                foreach (var realmTrait in traits)
                {
                    var named2 = DefDatabase <TraitDef> .GetNamed(realmTrait.traitDefName);

                    story.traits.GainTrait(new Trait(named2, realmTrait.degree));
                }
            }

            if (skills != null)
            {
                using var enumerator3 = skills.AsEnumerable().GetEnumerator();
                while (enumerator3.MoveNext())
                {
                    var item2    = enumerator3.Current;
                    var skillDef = DefDatabase <SkillDef> .AllDefs.First(def => def.label == item2?.skillDefLabel);

                    var skill = pawn.skills.GetSkill(skillDef);
                    if (item2 == null)
                    {
                        continue;
                    }

                    skill.Level   = item2.level;
                    skill.passion = item2.passion;
                }
            }

            var workSettings = pawn.workSettings;

            workSettings?.EnableAndInitialize();

            if (apparels != null)
            {
                var pawn_ApparelTracker = new Pawn_ApparelTracker(pawn);
                foreach (var realmThing in apparels)
                {
                    var apparel = (Apparel)realmData.FromRealmThing(realmThing);
                    pawn_ApparelTracker.Wear(apparel);
                }
            }

            if (equipments != null)
            {
                var pawn_EquipmentTracker = new Pawn_EquipmentTracker(pawn);
                foreach (var realmThing2 in equipments)
                {
                    var newEq = (ThingWithComps)realmData.FromRealmThing(realmThing2);
                    pawn_EquipmentTracker.AddEquipment(newEq);
                }
            }

            if (inventory != null)
            {
                var pawn_InventoryTracker = pawn.inventory;
                foreach (var realmThing3 in inventory)
                {
                    var item = realmData.FromRealmThing(realmThing3);
                    pawn_InventoryTracker.innerContainer.TryAdd(item);
                }
            }

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

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

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

                pawn.health.AddHediff(named3, part);
                var hediff = pawn.health.hediffSet.hediffs.Last();
                hediff.source = realmHediff2.sourceDefName == null
                    ? null
                    : DefDatabase <ThingDef> .GetNamedSilentFail(realmHediff2.sourceDefName);

                hediff.ageTicks = realmHediff2.ageTicks;
                hediff.Severity = realmHediff2.severity;
                if (float.IsNaN(realmHediff2.immunity) || pawn.health.immunity.ImmunityRecordExists(named3))
                {
                    continue;
                }

                var immunity = pawn.health.immunity;
                immunity.GetType().GetMethod("TryAddImmunityRecord", BindingFlags.Instance | BindingFlags.NonPublic)
                .Invoke(immunity, new object[]
                {
                    named3
                });
                immunity.GetImmunityRecord(named3).immunity = realmHediff2.immunity;
            }

            if (training != null)
            {
                pawn.training = new Pawn_TrainingTracker(pawn);
                foreach (var realmTrainingRecord in training)
                {
                    var named4 = DefDatabase <TrainableDef> .GetNamed(realmTrainingRecord.trainingDefLabel);

                    if (realmTrainingRecord.wanted)
                    {
                        pawn.training.SetWantedRecursive(named4, false);
                    }

                    if (realmTrainingRecord.learned)
                    {
                        pawn.training.Train(named4, null, true);
                    }
                }
            }

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

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

            if (workPriorities == null)
            {
                return(pawn);
            }

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

                if (namedSilentFail == null)
                {
                    Log.Warning($"Ignoring unknown workType: {keyValuePair.Key}");
                }
                else
                {
                    pawn.workSettings.SetPriority(namedSilentFail, keyValuePair.Value);
                }
            }

            return(pawn);
        }
Exemplo n.º 4
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);
        }