private static BlueprintFeature AddSpiderCompanion()
        {
            PortraitData portraitData = new PortraitData("AdvancedMartialArtsSpider");

            BlueprintPortrait portrait = Helpers.Create <BlueprintPortrait>();

            portrait.Data = portraitData;
            Main.library.AddAsset(portrait, Helpers.getGuid("GiantSpiderPortrait"));

            BlueprintUnitFact reducedReachFact = Main.library.Get <BlueprintUnitFact>("c33f2d68d93ceee488aa4004347dffca");
            BlueprintFeature  weaponFinesse    = Main.library.Get <BlueprintFeature>("90e54424d682d104ab36436bd527af09");

            BlueprintFeature animalCompanionUpgradeCentipede = Main.library.Get <BlueprintFeature>("c938099ca0438b242b3edecfa9083e9f");
            BlueprintUnit    animalCompanionUnitCentipede    = Main.library.Get <BlueprintUnit>("f9df16ffd0c8cec4d99a0ae6f025a3f8");

            BlueprintUnit giantSpider = Main.library.CopyAndAdd <BlueprintUnit>("c4b33e5fd3d3a6f46b2aade647b0bf25", "GiantSpiderCompanion", Helpers.getGuid("GiantSpiderCompanion"));

            BlueprintItemWeapon Bite1d6         = Main.library.Get <BlueprintItemWeapon>("a000716f88c969c499a535dadcf09286");
            BlueprintItemWeapon EmptyHandWeapon = Main.library.Get <BlueprintItemWeapon>("20375b5a0c9243d45966bd72c690ab74");

            giantSpider.Brain           = animalCompanionUnitCentipede.Brain;
            giantSpider.ComponentsArray = animalCompanionUnitCentipede.ComponentsArray;
            giantSpider.Body            = animalCompanionUnitCentipede.Body;
            giantSpider.AddFacts        = giantSpider.AddFacts.AddToArray(weaponFinesse);
            giantSpider.Faction         = Main.library.Get <BlueprintFaction>("d8de50cc80eb4dc409a983991e0b77ad"); // Neutral faction

            Helpers.SetField(giantSpider, "m_Portrait", portrait);

            BlueprintUnitAsksList giantSpiderBarks = Main.library.CopyAndAdd <BlueprintUnitAsksList>("7d340f75a57c47d45b0e79200a6b5eac", "SpiderAnimalCompanionBarks", Helpers.getGuid("SpiderAnimalCompanionBarks"));
            UnitAsksComponent     component        = giantSpiderBarks.GetComponent <UnitAsksComponent>();

            foreach (var componentAnimationBark in component.AnimationBarks)
            {
                if (componentAnimationBark.AnimationEvent == MappedAnimationEventType.AlertSound1 || componentAnimationBark.AnimationEvent == MappedAnimationEventType.AlertSound2)
                {
                    componentAnimationBark.Cooldown = 10f;
                    componentAnimationBark.DelayMin = 5f;
                }
            }

            ChangeUnitSize unitSize = Helpers.Create <ChangeUnitSize>(x => x.SizeDelta = 1);

            FieldInfo typeField = unitSize.GetType().GetField("m_Type", BindingFlags.NonPublic | BindingFlags.Instance);
            object    delta     = unitSize.GetType().GetNestedType("ChangeType", BindingFlags.NonPublic).GetField("Delta").GetValue(unitSize);

            typeField.SetValue(unitSize, delta);

            AddMechanicsFeature addMechanicsFeature = Helpers.Create <AddMechanicsFeature>();

            Traverse traverse = Traverse.Create(addMechanicsFeature);

            traverse.Field("m_Feature").SetValue(AddMechanicsFeature.MechanicsFeatureType.IterativeNaturalAttacks);


            typeField.SetValue(unitSize, delta);

            BlueprintFeature animalCompanionFeatureSpider = Main.library.CopyAndAdd <BlueprintFeature>("f9ef7717531f5914a9b6ecacfad63f46", "AnimalCompanionFeatureGiantSpider", Helpers.getGuid("AnimalCompanionFeatureGiantSpider"));

            animalCompanionFeatureSpider.SetNameDescription("Animal Companion — Giant Spider", "Size Medium\nSpeed 30 ft.\nAC +1 natural armor\nAttack bite (1d6 plus poison)\nAbility Scores Str 11, Dex 17, Con 12, Int 1, Wis 10, Cha 2\nSpecial Attacks poison (frequency 1 round (4); effect 1d2 Str damage; cure 1 save; Con-based DC)\nCMD +8 vs. trip.\nAt 7th level size becomes Large, Str +2, Dex +8, Con +4, +2 natural armor.");

            AddPet addPetFact = animalCompanionFeatureSpider.ComponentsArray.OfType <AddPet>().First();

            animalCompanionFeatureSpider.RemoveComponent(addPetFact);
            addPetFact = UnityEngine.Object.Instantiate(addPetFact);
            animalCompanionFeatureSpider.AddComponent(addPetFact);

            addPetFact.Pet            = giantSpider;
            addPetFact.UpgradeFeature = Helpers.CreateFeature(
                "AnimalCompanionUpgradeGiantSpider",
                "",
                "",
                Helpers.getGuid("AnimalCompanionUpgradeGiantSpider"),
                animalCompanionUpgradeCentipede.Icon,
                FeatureGroup.None,
                unitSize,
                Helpers.Create <AddStatBonus>(x =>
            {
                x.Stat       = StatType.AC;
                x.Value      = 2;
                x.Descriptor = ModifierDescriptor.NaturalArmor;
            }),
                Helpers.Create <AddStatBonus>(x =>
            {
                x.Stat  = StatType.Strength;
                x.Value = 2;
            }),
                Helpers.Create <AddStatBonus>(x =>
            {
                x.Stat  = StatType.Dexterity;
                x.Value = 8;
            }),
                Helpers.Create <AddStatBonus>(x =>
            {
                x.Stat  = StatType.Constitution;
                x.Value = 4;
            }),
                addMechanicsFeature,
                Helpers.CreateAddFacts(reducedReachFact)
                );
            addPetFact.UpgradeLevel = 7;
            return(animalCompanionFeatureSpider);
        }
        // Token: 0x06000038 RID: 56 RVA: 0x0000227B File Offset: 0x0000047B
        private static bool Prefix(EntityCreationController __instance, BlueprintUnit unit, Vector3 position, Quaternion rotation, SceneEntitiesState state, ref UnitEntityData __result)
        {
            if (unit == null)
            {
                Main.DebugLog("Trying to spawn null unit");
                return(true);
            }
            if (unit.CustomizationPreset != null)
            {
                // Main.DebugLog("a");

                UnitCustomizationVariation unitCustomizationVariation;
#if DEBUG
                /*if (!first)
                 * {
                 * unitCustomizationVariation = unit.CustomizationPreset.SelectVariation(unit, null);
                 *
                 *
                 * }
                 * else
                 * {
                 *  unitCustomizationVariation = Main.preset;
                 * }*/
#endif
                unitCustomizationVariation = unit.CustomizationPreset.SelectVariation(unit, null);

                if (unitCustomizationVariation == null)
                {
                    //

                    Main.DebugLog($"Failed to select customization variation for unit {unit.name} (preset = {unit.CustomizationPreset.name})");

                    if (Main.allVariations == null || Main.allVariations.Count() == 0)
                    {
                        Main.Init();
                    }


                    if (Main.allVariations.ContainsKey(unit.Prefab))
                    {
                        //ucv.Prefab == blueprintUnit.Prefab
                        Main.preset = Main.allVariations[unit.Prefab];
//                        Main.DebugLog(Main.preset.Prefab.AssetId);
                    }
                    else
                    {
                        Main.notRandom = true;
                    }


                    UnitEntityView prefab2 = unit.Prefab.Load(false);
                    //  Main.DebugLog("g");
                    __result = __instance.SpawnUnit(unit, prefab2, position, rotation, state);



                    return(false);
                }

                /*
                 * if (unitCustomizationVariation == null)
                 * {
                 *
                 *  List<UnitCustomizationPreset> presets = ResourcesLibrary.GetBlueprints<UnitCustomizationPreset>().ToList();
                 *
                 *  foreach (UnitCustomizationPreset preset in presets.Where(x => x.name != unit.CustomizationPreset.name))
                 *  {
                 *
                 *      unitCustomizationVariation = preset.SelectVariation(unit, null);
                 *
                 *      if (unitCustomizationVariation != null)
                 *      {
                 *          break;
                 *      }
                 *
                 * }
                 *
                 *
                 *
                 * }
                 */
                Main.preset = unitCustomizationVariation;


                BlueprintUnitAsksList voice = unit.CustomizationPreset.SelectVoice(unitCustomizationVariation.Gender);
                //  Main.DebugLog("c");
                bool leftHanded = unit.CustomizationPreset.SelectLeftHanded();
                //  Main.DebugLog("d");
                using (unitCustomizationVariation.CreateSpawningData(voice, leftHanded))
                {
                    // Main.DebugLog("e");
                    UnitEntityView prefab = unitCustomizationVariation.Prefab.Load(false);
                    // Main.DebugLog("Spawn1: "+prefab.name);
                    //   Main.DebugLog("f");
                    __result = __instance.SpawnUnit(unit, prefab, position, rotation, state);
                    return(false);
                }
            }
            else
            {
                Main.notRandom = true;
                //  Main.DebugLog("NO CUSTOMPRESET!!!");
            }


            UnitEntityView prefab3 = unit.Prefab.Load(false);
            //  Main.DebugLog("g");
            __result = __instance.SpawnUnit(unit, prefab3, position, rotation, state);


            return(false);
        }
 public bool SelectVoice(BlueprintUnitAsksList voice)
 {
     this.RemoveAction <SelectVoice>(null);
     return(this.AddAction(new SelectVoice(voice), false));
 }