Пример #1
0
        private void DirectorAPI_monsterActions(System.Collections.Generic.List <DirectorAPI.DirectorCardHolder> cards, DirectorAPI.StageInfo stage)
        {
            cards.Clear();
            CharacterSpawnCard turkeyCSC  = Resources.Load <CharacterSpawnCard>("SpawnCards/CharacterSpawnCards/cscVulture");
            DirectorCard       turkeyCard = new DirectorCard
            {
                allowAmbushSpawn        = true,
                forbiddenUnlockable     = "",
                minimumStageCompletions = 0,
                preventOverhead         = false,
                requiredUnlockable      = "",
                selectionWeight         = 5,
                spawnDistance           = DirectorCore.MonsterSpawnDistance.Standard,
                spawnCard = turkeyCSC
            };

            var tempCard1 = new DirectorAPI.DirectorCardHolder();

            tempCard1.SetCard(turkeyCard);
            tempCard1.SetInteractableCategory(DirectorAPI.InteractableCategory.None);
            tempCard1.SetMonsterCategory(DirectorAPI.MonsterCategory.BasicMonsters);
            cards.Add(tempCard1);
            var tempCard2 = new DirectorAPI.DirectorCardHolder();

            tempCard2.SetCard(turkeyCard);
            tempCard2.SetInteractableCategory(DirectorAPI.InteractableCategory.None);
            tempCard2.SetMonsterCategory(DirectorAPI.MonsterCategory.Minibosses);
            cards.Add(tempCard2);
            var tempCard3 = new DirectorAPI.DirectorCardHolder();

            tempCard3.SetCard(turkeyCard);
            tempCard3.SetInteractableCategory(DirectorAPI.InteractableCategory.None);
            tempCard3.SetMonsterCategory(DirectorAPI.MonsterCategory.Champions);
            cards.Add(tempCard3);
        }
Пример #2
0
        internal static DirectorCard CreateDirectorCard(string bossName, int cost, MapNodeGroup.GraphType nodeGraphType)
        {
            CharacterSpawnCard spawnCard = ScriptableObject.CreateInstance <CharacterSpawnCard>();

            spawnCard.noElites        = false;
            spawnCard.prefab          = Resources.Load <GameObject>("prefabs/charactermasters/" + bossName);
            spawnCard.forbiddenFlags  = NodeFlags.NoCharacterSpawn;
            spawnCard.requiredFlags   = NodeFlags.None;
            spawnCard.hullSize        = HullClassification.Human;
            spawnCard.occupyPosition  = false;
            spawnCard.sendOverNetwork = true;
            spawnCard.nodeGraphType   = nodeGraphType;
            spawnCard.name            = "csc" + bossName.Substring(0, bossName.IndexOf("Master"));

            DirectorCard directorCard = new DirectorCard();

            directorCard.spawnCard               = spawnCard;
            directorCard.cost                    = cost;
            directorCard.selectionWeight         = 1;
            directorCard.allowAmbushSpawn        = true;
            directorCard.forbiddenUnlockable     = "";
            directorCard.minimumStageCompletions = 0;
            directorCard.preventOverhead         = true;
            directorCard.spawnDistance           = DirectorCore.MonsterSpawnDistance.Standard;

            return(directorCard);
        }
Пример #3
0
        private static void BuildDirectorCard()
        {
            archWispCharacterSpawnCard = Resources.Load <CharacterSpawnCard>("spawncards/characterspawncards/cscarchwisp");

            archWispDirectorCardHolder = new DirectorAPI.DirectorCardHolder();
            archWispCharacterSpawnCard.directorCreditCost = 250;
            archWispCharacterSpawnCard.forbiddenAsBoss    = true;

            archWispDirectorCard = new DirectorCard
            {
                allowAmbushSpawn        = true,
                forbiddenUnlockable     = "",
                minimumStageCompletions = 4,
                preventOverhead         = false,
                requiredUnlockable      = "",
                selectionWeight         = 1,
                spawnCard     = archWispCharacterSpawnCard,
                spawnDistance = DirectorCore.MonsterSpawnDistance.Standard,
            };

            archWispDirectorCardHolder.Card = archWispDirectorCard;
            archWispDirectorCardHolder.InteractableCategory = InteractableCategory.None;
            archWispDirectorCardHolder.MonsterCategory      = DirectorAPI.MonsterCategory.Minibosses;

            MonsterActions += delegate(List <DirectorCardHolder> list, DirectorAPI.StageInfo stage)
            {
                if (!list.Contains(archWispDirectorCardHolder))
                {
                    list.Add(archWispDirectorCardHolder);
                }
            };
        }
Пример #4
0
        /// <summary>
        /// Spawn a particular elite type with the specified monster type at the specified location.  This will
        /// apply appropriate HP and Dmg scaling per the specifications on the affix card, as well as calling the affix onSpawned.
        /// This is primarily intended for testing, but could also be used to easily spawn elites for other purposes.
        /// Note that this does not set XP and Gold rewards, as it does not have access to the cost function; you will need to
        /// add those yourself if you want these.
        /// </summary>
        /// <param name="spawnCard">Card describing the type of monster to spawn</param>
        /// <param name="affixCard">Card describing the type of elite to spawn; may pass null to spawn a non-elite</param>
        /// <param name="placement">How to place the elite in the scene</param>
        /// <param name="rng">Random number generator to use for placement</param>
        /// <returns></returns>
        public static CharacterMaster TrySpawnElite(CharacterSpawnCard spawnCard, EliteAffixCard affixCard, DirectorPlacementRule placement, Xoroshiro128Plus rng)
        {
            var spawnRequest = new DirectorSpawnRequest(spawnCard, placement, rng)
            {
                teamIndexOverride     = TeamIndex.Monster,
                ignoreTeamMemberLimit = true
            };
            var spawned = DirectorCore.instance.TrySpawnObject(spawnRequest);

            if (spawned == null)
            {
                return(null);
            }

            //Configure as the chosen elite
            var spawnedMaster = spawned.GetComponent <CharacterMaster>();

            if (affixCard != null)
            {
                //Elites are boosted
                var healthBoost = affixCard.healthBoostCoeff;
                var damageBoost = affixCard.damageBoostCoeff;

                spawnedMaster.inventory.GiveItem(ItemIndex.BoostHp, Mathf.RoundToInt((float)((healthBoost - 1.0) * 10.0)));
                spawnedMaster.inventory.GiveItem(ItemIndex.BoostDamage, Mathf.RoundToInt((float)((damageBoost - 1.0) * 10.0)));
                var eliteDef = EliteCatalog.GetEliteDef(affixCard.eliteType);
                if (eliteDef != null)
                {
                    spawnedMaster.inventory.SetEquipmentIndex(eliteDef.eliteEquipmentIndex);
                }

                affixCard.onSpawned?.Invoke(spawnedMaster);
            }
            return(spawnedMaster);
        }
Пример #5
0
 public static void BuildGrandParents()
 {
     grandParent                   = Resources.Load <GameObject>("prefabs/characterbodies/GrandParentbody");
     grandParentMaster             = Resources.Load <GameObject>("prefabs/charactermasters/GrandParentMaster");
     grandParentCharacterSpawnCard = Resources.Load <CharacterSpawnCard>("spawncards/characterspawncards/titan/cscGrandParent");
     swipeEffect                   = Resources.Load <GameObject>("prefabs/effects/GrandparentGroundSwipeTrailEffect");
     parentPod    = Resources.Load <GameObject>("prefabs/characterbodies/ParentPodBody");
     skillLocator = grandParent.GetComponent <SkillLocator>();
     BuildBody();
     BuildDirectorCard();
     RebuildSkillDrivers();
     RebuildSkills();
     FixGrandParentSwipeEffect();
     ModifyParentPod();
     //Main.logger.LogInfo("Built Grandparents!");
 }
Пример #6
0
 public void CreateBossSpawncard()
 {
     BossHandler.bossSpawner                    = ScriptableObject.CreateInstance <CharacterSpawnCard>();
     BossHandler.bossSpawner.name               = "cscGroveMaster";
     BossHandler.bossSpawner.prefab             = PrefabHandler.masterPrefab;
     BossHandler.bossSpawner.sendOverNetwork    = true;
     BossHandler.bossSpawner.hullSize           = HullClassification.BeetleQueen;
     BossHandler.bossSpawner.nodeGraphType      = MapNodeGroup.GraphType.Ground;
     BossHandler.bossSpawner.requiredFlags      = NodeFlags.None;
     BossHandler.bossSpawner.forbiddenFlags     = NodeFlags.TeleporterOK;
     BossHandler.bossSpawner.directorCreditCost = 800;
     BossHandler.bossSpawner.occupyPosition     = false;
     BossHandler.bossSpawner.loadout            = new SerializableLoadout();
     BossHandler.bossSpawner.noElites           = false;
     BossHandler.bossSpawner.forbiddenAsBoss    = false;
 }
Пример #7
0
        private static void AddOnlyGupTest(ConCommandArgs args)
        {
            _myGupSpawnCard = Addressables.LoadAssetAsync <CharacterSpawnCard>(GupCharacterSpawnCard).WaitForCompletion();
            _myGupSpawnCard = UnityObject.Instantiate(_myGupSpawnCard);
            _myGupSpawnCard.directorCreditCost = 1;

            _myGupDC = new DirectorCard {
                spawnCard               = _myGupSpawnCard,
                selectionWeight         = 1,
                preventOverhead         = false,
                minimumStageCompletions = 0,
                spawnDistance           = DirectorCore.MonsterSpawnDistance.Standard
            };

            DirectorAPI.MonsterActions += OnlyGup;
        }
Пример #8
0
        private SpawnCard.SpawnResult SpawnAllyDummy(CharacterSpawnCard spawnCard, Vector3 center, float angle, float radius = 35f)//, GameObject summonerBody = null)
        {
            spawnCard.noElites = true;
            DirectorPlacementRule rule = new DirectorPlacementRule()
            {
                placementMode = DirectorPlacementRule.PlacementMode.Direct
            };
            DirectorSpawnRequest request = new DirectorSpawnRequest(spawnCard, rule, run.runRNG)
            {
                teamIndexOverride     = TeamIndex.Neutral,
                ignoreTeamMemberLimit = true,
                //summonerBodyObject = summonerBody,
            };
            Vector3 spawnPosition = FindGroundPosition(center, angle, radius);

            return(spawnCard.DoSpawn(spawnPosition, Quaternion.LookRotation((center - spawnPosition).normalized), request));
        }
Пример #9
0
        private static void BuildDirectorCard()
        {
            On.RoR2.CharacterSpawnCard.Awake += CharacterSpawnCard_Awake;
            CharacterSpawnCard characterSpawnCard = ScriptableObject.CreateInstance <CharacterSpawnCard>();

            On.RoR2.CharacterSpawnCard.Awake -= CharacterSpawnCard_Awake;

            DirectorAPI.DirectorCardHolder directorCardHolder = new DirectorAPI.DirectorCardHolder();
            DirectorCard directorCard = new DirectorCard();

            characterSpawnCard.directorCreditCost = 50;
            characterSpawnCard.forbiddenAsBoss    = false;
            characterSpawnCard.name = "cscClaymanDude";
            //characterSpawnCard.forbiddenFlags = RoR2.Navigation.NodeFlags.None;
            characterSpawnCard.hullSize        = HullClassification.Human;
            characterSpawnCard.nodeGraphType   = RoR2.Navigation.MapNodeGroup.GraphType.Ground;
            characterSpawnCard.noElites        = false;
            characterSpawnCard.prefab          = clayManMaster;
            characterSpawnCard.occupyPosition  = false;
            characterSpawnCard.sendOverNetwork = true;

            directorCard.allowAmbushSpawn        = true;
            directorCard.forbiddenUnlockable     = "";
            directorCard.minimumStageCompletions = 1;
            directorCard.preventOverhead         = false;
            directorCard.requiredUnlockable      = "";
            directorCard.selectionWeight         = 1;
            directorCard.spawnCard     = characterSpawnCard;
            directorCard.spawnDistance = DirectorCore.MonsterSpawnDistance.Standard;

            directorCardHolder.Card = directorCard;
            directorCardHolder.InteractableCategory = DirectorAPI.InteractableCategory.None;
            directorCardHolder.MonsterCategory      = DirectorAPI.MonsterCategory.BasicMonsters;

            DirectorAPI.MonsterActions += delegate(List <DirectorAPI.DirectorCardHolder> list, DirectorAPI.StageInfo stage)
            {
                if (stage.stage == DirectorAPI.Stage.SkyMeadow || stage.stage == DirectorAPI.Stage.AbandonedAqueduct || stage.stage == DirectorAPI.Stage.RallypointDelta || stage.stage == DirectorAPI.Stage.ScorchedAcres)
                {
                    if (!list.Contains(directorCardHolder))
                    {
                        list.Add(directorCardHolder);
                    }
                }
            };
        }
Пример #10
0
        //private void RegisterVIPRun(List<GameObject> obj)
        //{
        //    GameObject gameObject = new GameObject("VIPRun");
        //    gameObject.SetActive(false);
        //    DontDestroyOnLoad(gameObject);

        //    gameObject.AddComponent<NetworkIdentity>();
        //    gameObject.AddComponent<TeamManager>();
        //    gameObject.AddComponent<RunCameraManager>();

        //    VIPRun run = gameObject.AddComponent<VIPRun>();

        //    if (!gameObject.GetComponent<RunArtifactManager>())
        //    {
        //        Debug.LogError("REGISTERING RunArtifactManager");
        //        gameObject.AddComponent<RunArtifactManager>();
        //    }
        //    if (!gameObject.GetComponent<NetworkRuleBook>())
        //    {
        //        Debug.LogError("REGISTERING NetworkRuleBook");
        //        gameObject.AddComponent<NetworkRuleBook>();
        //    }

        //    run.userPickable = true;
        //    run.nameToken = "GAMEMODE_VIP_RUN_NAME";
        //    run.name = "VIPRun";

        //    SetupVIP(run.characterAllies);

        //    obj.Add(gameObject);
        //}

        private void SetupVIP(List <CharacterSpawnCard> characterAllies)
        {
            characterAllies.Add(LegacyResourcesAPI.Load <CharacterSpawnCard>("SpawnCards/CharacterSpawnCards/cscBeetle"));
            characterAllies.Add(LegacyResourcesAPI.Load <CharacterSpawnCard>("SpawnCards/CharacterSpawnCards/cscLemurian"));
            characterAllies.Add(LegacyResourcesAPI.Load <CharacterSpawnCard>("SpawnCards/CharacterSpawnCards/cscLemurianBruiser"));
            characterAllies.Add(LegacyResourcesAPI.Load <CharacterSpawnCard>("SpawnCards/CharacterSpawnCards/cscMiniMushroom"));
            characterAllies.Add(LegacyResourcesAPI.Load <CharacterSpawnCard>("SpawnCards/CharacterSpawnCards/cscParent"));
            characterAllies.Add(LegacyResourcesAPI.Load <CharacterSpawnCard>("SpawnCards/CharacterSpawnCards/cscVulture"));
            characterAllies.Add(LegacyResourcesAPI.Load <CharacterSpawnCard>("SpawnCards/CharacterSpawnCards/cscBison"));
            characterAllies.Add(LegacyResourcesAPI.Load <CharacterSpawnCard>("SpawnCards/CharacterSpawnCards/cscBell"));
            characterAllies.Add(LegacyResourcesAPI.Load <CharacterSpawnCard>("SpawnCards/CharacterSpawnCards/cscClayBruiser"));
            characterAllies.Add(LegacyResourcesAPI.Load <CharacterSpawnCard>("SpawnCards/CharacterSpawnCards/cscGolem"));
            characterAllies.Add(LegacyResourcesAPI.Load <CharacterSpawnCard>("SpawnCards/CharacterSpawnCards/cscImp"));
            characterAllies.Add(LegacyResourcesAPI.Load <CharacterSpawnCard>("SpawnCards/CharacterSpawnCards/cscScav"));

            string spawnCards = CustomSpawnCards.Value;

            if (string.IsNullOrWhiteSpace(spawnCards))
            {
                return;
            }

            foreach (var spawnCard in spawnCards.Split(';'))
            {
                string spawnCardSanitized = spawnCard.Trim();
                try
                {
                    CharacterSpawnCard csc = LegacyResourcesAPI.Load <CharacterSpawnCard>(spawnCardSanitized);
                    if (csc)
                    {
                        characterAllies.Add(csc);
                        Debug.Log($"Loaded custom Spawn Card: {spawnCardSanitized}");
                    }
                    else
                    {
                        Debug.LogError($"Could not load Spawn Card: {spawnCardSanitized}");
                    }
                }
                catch (Exception e)
                {
                    Debug.LogError($"Exception loading Spawn Card: {spawnCardSanitized}");
                    Debug.LogException(e);
                }
            }
        }
Пример #11
0
        private static void BuildDirectorCard()
        {
            On.RoR2.CharacterSpawnCard.Awake += CharacterSpawnCard_Awake;
            CharacterSpawnCard characterSpawnCard = ScriptableObject.CreateInstance <CharacterSpawnCard>();

            On.RoR2.CharacterSpawnCard.Awake -= CharacterSpawnCard_Awake;

            DirectorAPI.DirectorCardHolder directorCardHolder = new DirectorAPI.DirectorCardHolder();
            DirectorCard directorCard = new DirectorCard();

            characterSpawnCard.directorCreditCost = 325;
            characterSpawnCard.forbiddenAsBoss    = false;
            characterSpawnCard.name = "cscMegaMushrum";
            //characterSpawnCard.forbiddenFlags = RoR2.Navigation.NodeFlags.None;
            characterSpawnCard.hullSize        = HullClassification.Golem;
            characterSpawnCard.loadout         = new SerializableLoadout();
            characterSpawnCard.nodeGraphType   = RoR2.Navigation.MapNodeGroup.GraphType.Ground;
            characterSpawnCard.noElites        = false;
            characterSpawnCard.occupyPosition  = false;
            characterSpawnCard.prefab          = megaMushrumMaster;
            characterSpawnCard.sendOverNetwork = true;

            directorCard.allowAmbushSpawn        = true;
            directorCard.forbiddenUnlockable     = "";
            directorCard.minimumStageCompletions = 4;
            directorCard.preventOverhead         = false;
            directorCard.requiredUnlockable      = "";
            directorCard.selectionWeight         = 1;
            directorCard.spawnCard     = characterSpawnCard;
            directorCard.spawnDistance = DirectorCore.MonsterSpawnDistance.Standard;

            directorCardHolder.Card = directorCard;
            directorCardHolder.InteractableCategory = DirectorAPI.InteractableCategory.None;
            directorCardHolder.MonsterCategory      = DirectorAPI.MonsterCategory.BasicMonsters;

            DirectorAPI.MonsterActions += delegate(List <DirectorAPI.DirectorCardHolder> list, DirectorAPI.StageInfo stage)
            {
                if (!list.Contains(directorCardHolder) && stage.stage == DirectorAPI.Stage.SkyMeadow)
                {
                    list.Add(directorCardHolder);
                }
            };
        }
Пример #12
0
    public virtual void CreateDirectorCard()
    {
        On.RoR2.CharacterSpawnCard.Awake += CharacterSpawnCard_Awake;
        characterSpawnCard = ScriptableObject.CreateInstance <CharacterSpawnCard>();
        On.RoR2.CharacterSpawnCard.Awake     -= CharacterSpawnCard_Awake;
        characterSpawnCard.directorCreditCost = DirectorCost;
        characterSpawnCard.forbiddenAsBoss    = ForbiddenAsBoss;
        characterSpawnCard.name = "csc" + bodyName;
        //characterSpawnCard.forbiddenFlags = RoR2.Navigation.NodeFlags.None;
        characterSpawnCard.hullSize        = HullClassification;
        characterSpawnCard.loadout         = new SerializableLoadout();
        characterSpawnCard.nodeGraphType   = GraphType;
        characterSpawnCard.noElites        = NoElites;
        characterSpawnCard.occupyPosition  = false;
        characterSpawnCard.prefab          = masterPrefab;
        characterSpawnCard.sendOverNetwork = true;

        ModifySpawnCard(characterSpawnCard);

        DirectorCard directorCard = new DirectorCard
        {
            spawnCard        = characterSpawnCard,
            selectionWeight  = SelectionWeight,
            spawnDistance    = SpawnDistance,
            allowAmbushSpawn = AmbushSpawn,
            preventOverhead  = true,
        };

        ModifyDirectorCard(directorCard);

        if (StagesToSpawnOn.Length > 0)
        {
            foreach (DirectorAPI.Stage stage in StagesToSpawnOn)
            {
                DirectorAPI.Helpers.AddNewMonsterToStage(directorCard, MonsterCategory, stage);
            }
        }
        else
        {
            DirectorAPI.Helpers.AddNewMonster(directorCard, MonsterCategory);
        }
    }
Пример #13
0
#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member

        private CharacterSpawnCard ImpOriginSetup(CharacterSpawnCard origCsc, Material material, Texture icon, string name, string subtitle, int renderInfoIndex)
        {
            GameObject masterObject = origCsc.prefab;

            masterObject = masterObject.InstantiateClone(masterObject.name + originSuffix, true);
            masterObjects.Add(masterObject);
            CharacterMaster master     = masterObject.GetComponent <CharacterMaster>();
            GameObject      bodyObject = master.bodyPrefab;

            bodyObject = bodyObject.InstantiateClone(bodyObject.name + originSuffix, true);
            bodyObjects.Add(bodyObject);
            CharacterBody body = bodyObject.GetComponent <CharacterBody>();

            body.baseNameToken     += originSuffix;
            body.subtitleNameToken += originSuffix;
            LanguageAPI.Add(body.baseNameToken, name);
            LanguageAPI.Add(body.subtitleNameToken, subtitle);
            body.portraitIcon = icon;
            ModelLocator   bodyModelLocator         = bodyObject.GetComponent <ModelLocator>();
            GameObject     bodyModelTransformObject = bodyModelLocator.modelTransform.gameObject;
            CharacterModel bodyModel = bodyModelTransformObject.GetComponent <CharacterModel>();

            bodyModel.baseRendererInfos[renderInfoIndex].defaultMaterial = material;
            master.bodyPrefab = bodyObject;
            CharacterSpawnCard newCsc = ScriptableObject.CreateInstance <CharacterSpawnCard>();

            newCsc.name               = origCsc.name + originSuffix;
            newCsc.prefab             = masterObject;
            newCsc.sendOverNetwork    = origCsc.sendOverNetwork;
            newCsc.hullSize           = origCsc.hullSize;
            newCsc.nodeGraphType      = origCsc.nodeGraphType;
            newCsc.requiredFlags      = origCsc.requiredFlags;
            newCsc.forbiddenFlags     = origCsc.forbiddenFlags;
            newCsc.directorCreditCost = origCsc.directorCreditCost;
            newCsc.occupyPosition     = origCsc.occupyPosition;
            newCsc.loadout            = origCsc.loadout;
            newCsc.noElites           = origCsc.noElites;
            newCsc.forbiddenAsBoss    = true;
            return(newCsc);
        }
Пример #14
0
 private static void CharacterSpawnCard_Awake(On.RoR2.CharacterSpawnCard.orig_Awake orig, CharacterSpawnCard self)
 {
     self.loadout = new SerializableLoadout();
     orig(self);
 }
Пример #15
0
 public virtual void ModifySpawnCard(CharacterSpawnCard card)
 {
 }
Пример #16
0
        public static void PerroGrande()
        {
            GameObject fatAcridPrefab = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/CharacterBodies/CrocoBody"), "DireseekerBody");

            CharacterBody bodyComponent = fatAcridPrefab.GetComponent <CharacterBody>();

            LanguageAPI.Add("FATACRID_BODY_NAME", "Perro Grande");
            LanguageAPI.Add("FATACRID_BODY_SUBTITLE", "(Forma Gigante)");

            bodyComponent.name              = "FatAcridBody";
            bodyComponent.baseNameToken     = "FATACRID_BODY_NAME";
            bodyComponent.subtitleNameToken = "FATACRID_BODY_SUBTITLE";
            bodyComponent.baseMoveSpeed     = 3f;
            bodyComponent.baseMaxHealth     = 3800f;
            bodyComponent.levelMaxHealth    = 1140f;
            bodyComponent.baseDamage        = 4f;
            bodyComponent.levelDamage       = 0.8f;
            bodyComponent.isChampion        = true;

            //resize

            fatAcridPrefab.GetComponent <ModelLocator>().modelBaseTransform.gameObject.transform.localScale *= 6f;
            //fatAcridPrefab.GetComponent<ModelLocator>().modelBaseTransform.gameObject.transform.Translate(new Vector3(0f, 5.6f, 0f));

            foreach (KinematicCharacterMotor kinematicCharacterMotor in fatAcridPrefab.GetComponentsInChildren <KinematicCharacterMotor>())
            {
                kinematicCharacterMotor.SetCapsuleDimensions(kinematicCharacterMotor.Capsule.radius * 6f, kinematicCharacterMotor.Capsule.height * 6f, 6f);
            }

            //

            CharacterModel model = fatAcridPrefab.GetComponentInChildren <CharacterModel>();

            Material newMat = UnityEngine.Object.Instantiate <Material>(model.baseRendererInfos[0].defaultMaterial);

            newMat.SetTexture("_MainTex", Assets.mainAssetBundle.LoadAsset <Material>("matDireseeker").GetTexture("_MainTex"));
            newMat.SetTexture("_EmTex", Assets.mainAssetBundle.LoadAsset <Material>("matDireseeker").GetTexture("_EmissionMap"));
            newMat.SetFloat("_EmPower", 80f);

            model.baseRendererInfos[0].defaultMaterial = newMat;

            GameObject acridMasterPrefab = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/CharacterMasters/LemurianBruiserMaster"), "FatAcridMaster");

            CharacterMaster master = acridMasterPrefab.GetComponent <CharacterMaster>();

            master.bodyPrefab = fatAcridPrefab;
            master.isBoss     = true;

            DiggerPlugin.bodyPrefabs.Add(fatAcridPrefab);
            DiggerPlugin.masterPrefabs.Add(acridMasterPrefab);

            CharacterSpawnCard characterSpawnCard = ScriptableObject.CreateInstance <CharacterSpawnCard>();

            characterSpawnCard.name               = "cscFatAcrid";
            characterSpawnCard.prefab             = acridMasterPrefab;
            characterSpawnCard.sendOverNetwork    = true;
            characterSpawnCard.hullSize           = HullClassification.BeetleQueen;
            characterSpawnCard.nodeGraphType      = MapNodeGroup.GraphType.Ground;
            characterSpawnCard.requiredFlags      = NodeFlags.None;
            characterSpawnCard.forbiddenFlags     = NodeFlags.TeleporterOK;
            characterSpawnCard.directorCreditCost = 2000;
            characterSpawnCard.occupyPosition     = false;
            characterSpawnCard.loadout            = new SerializableLoadout();
            characterSpawnCard.noElites           = true;
            characterSpawnCard.forbiddenAsBoss    = false;

            DirectorCard card = new DirectorCard
            {
                spawnCard               = characterSpawnCard,
                selectionWeight         = 1,
                allowAmbushSpawn        = false,
                preventOverhead         = false,
                minimumStageCompletions = 5,
                spawnDistance           = DirectorCore.MonsterSpawnDistance.Close
            };

            DirectorAPI.DirectorCardHolder fatAcridCard = new DirectorAPI.DirectorCardHolder
            {
                Card                 = card,
                MonsterCategory      = DirectorAPI.MonsterCategory.Champions,
                InteractableCategory = DirectorAPI.InteractableCategory.None
            };

            DirectorAPI.MonsterActions += delegate(List <DirectorAPI.DirectorCardHolder> list, DirectorAPI.StageInfo stage)
            {
                if (stage.stage == DirectorAPI.Stage.AbandonedAqueduct || stage.stage == DirectorAPI.Stage.DistantRoost || stage.stage == DirectorAPI.Stage.RallypointDelta || stage.stage == DirectorAPI.Stage.SkyMeadow || stage.stage == DirectorAPI.Stage.VoidCell || stage.stage == DirectorAPI.Stage.WetlandAspect)
                {
                    if (!list.Contains(fatAcridCard))
                    {
                        list.Add(fatAcridCard);
                    }
                }
            };
        }
Пример #17
0
        public static void CreateDireseeker()
        {
            if (DiggerPlugin.direseekerInstalled)
            {
                AddUnlockComponent();
            }

            if (DiggerPlugin.fatAcrid.Value)
            {
                PerroGrande();
            }

            CreateProjectiles();

            LanguageAPI.Add("DIRESEEKER_BODY_NAME", "Direseeker");
            LanguageAPI.Add("DIRESEEKER_BODY_SUBTITLE", "Track and Kill");
            //LanguageAPI.Add("DIRESEEKER_BODY_LORE", "Direseeker\n\nDireseeker is a giant Elder Lemurian that acts as a boss in the Stage 4 area Magma Barracks. Upon defeating it, the player will unlock the Miner character for future playthroughs. The path leading to Direseeker's location only appears in one of the three variants of the level, and even then Direseeker may or may not spawn with random chance. Completing the teleporter event will also prevent it from spawning.\nNote that in online co-op the boss may spawn for the Host, but not others, although they can still damage it.\nActivating the Artifact of Kin does not prevent it from appearing.\n\nCategories: Enemies | Bosses | Unlisted Enemies\n\nLanguages: Español");
            LanguageAPI.Add("DIRESEEKER_BODY_LORE", "Legends tell of a monstrous beast that once roamed the underground barracks of Petrichor V.\n\nFeared by the bravest of survivors and the nastiest of monsters, the massive beast was unrivaled. It donned blood-red scales, tempered by hellfire. It had burning yellow eyes, with a glare so intense it made the largest of creatures stop dead in their tracks. It had smoldering breath, hot enough to melt metal in an instant.\n\nOnly once stopped by a survivor strong enough to slay Providence himself, it was believed that the beast had finally met its match.\n\n<style=cIsHealth>Until it showed its terrifying face once again.</style>");
            LanguageAPI.Add("DIRESEEKER_BODY_OUTRO_FLAVOR", "..and so it left, in search of new prey.");

            //skills and states
            LoadoutAPI.AddSkill(typeof(EntityStates.Direseeker.SpawnState));
            LoadoutAPI.AddSkill(typeof(EntityStates.Direseeker.ChargeUltraFireball));
            LoadoutAPI.AddSkill(typeof(EntityStates.Direseeker.FireUltraFireball));

            if (!DiggerPlugin.direseekerInstalled)
            {
                bodyPrefab = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/CharacterBodies/LemurianBruiserBody"), "DireseekerBody");

                CharacterBody bodyComponent = bodyPrefab.GetComponent <CharacterBody>();

                bodyComponent.name              = "DireseekerBody";
                bodyComponent.baseNameToken     = "DIRESEEKER_BODY_NAME";
                bodyComponent.subtitleNameToken = "DIRESEEKER_BODY_SUBTITLE";
                bodyComponent.baseMoveSpeed     = 11f;
                bodyComponent.baseMaxHealth     = 2800f;
                bodyComponent.levelMaxHealth    = 840f;
                bodyComponent.baseDamage        = 20f;
                bodyComponent.levelDamage       = 4f;
                bodyComponent.isChampion        = true;
                bodyComponent.portraitIcon      = Assets.mainAssetBundle.LoadAsset <Sprite>("texDireseekerIcon").texture;

                SkillSetup(bodyPrefab);

                var stateMachine = bodyComponent.GetComponentInChildren <EntityStateMachine>();
                if (stateMachine)
                {
                    stateMachine.initialStateType = new SerializableEntityStateType(typeof(EntityStates.Direseeker.SpawnState));
                }

                //resize

                bodyPrefab.GetComponent <ModelLocator>().modelBaseTransform.gameObject.transform.localScale *= 1.5f;
                //bodyPrefab.GetComponent<ModelLocator>().modelBaseTransform.gameObject.transform.Translate(new Vector3(0f, 5.6f, 0f));

                foreach (KinematicCharacterMotor kinematicCharacterMotor in bodyPrefab.GetComponentsInChildren <KinematicCharacterMotor>())
                {
                    kinematicCharacterMotor.SetCapsuleDimensions(kinematicCharacterMotor.Capsule.radius * 1.5f, kinematicCharacterMotor.Capsule.height * 1.5f, 1.5f);
                }

                //

                CharacterModel model = bodyPrefab.GetComponentInChildren <CharacterModel>();

                Material newMat = UnityEngine.Object.Instantiate <Material>(model.baseRendererInfos[0].defaultMaterial);
                newMat.SetTexture("_MainTex", Assets.mainAssetBundle.LoadAsset <Material>("matDireseeker").GetTexture("_MainTex"));
                newMat.SetTexture("_EmTex", Assets.mainAssetBundle.LoadAsset <Material>("matDireseeker").GetTexture("_EmissionMap"));
                newMat.SetFloat("_EmPower", 50f);

                model.baseRendererInfos[0].defaultMaterial = newMat;

                GameObject horn1 = Assets.mainAssetBundle.LoadAsset <GameObject>("DireHorn").InstantiateClone("DireseekerHorn", false);
                GameObject horn2 = Assets.mainAssetBundle.LoadAsset <GameObject>("DireHornBroken").InstantiateClone("DireseekerHornBroken", false);
                //GameObject rageFlame = Assets.mainAssetBundle.LoadAsset<GameObject>("DireseekerRageFlame").InstantiateClone("DireseekerRageFlame", false);
                GameObject burstFlame = Assets.mainAssetBundle.LoadAsset <GameObject>("DireseekerBurstFlame").InstantiateClone("DireseekerBurstFlame", false);

                ChildLocator childLocator = bodyPrefab.GetComponentInChildren <ChildLocator>();

                horn1.transform.SetParent(childLocator.FindChild("Head"));
                horn1.transform.localPosition = new Vector3(-2.5f, 1, -0.5f);
                horn1.transform.localRotation = Quaternion.Euler(new Vector3(45, 0, 90));
                horn1.transform.localScale    = new Vector3(100, 100, 100);

                horn2.transform.SetParent(childLocator.FindChild("Head"));
                horn2.transform.localPosition = new Vector3(2.5f, 1, -0.5f);
                horn2.transform.localRotation = Quaternion.Euler(new Vector3(45, 0, 90));
                horn2.transform.localScale    = new Vector3(100, -100, 100);

                /*rageFlame.transform.SetParent(childLocator.FindChild("Head"));
                 * rageFlame.transform.localPosition = new Vector3(0, 1, 0);
                 * rageFlame.transform.localRotation = Quaternion.Euler(new Vector3(270, 180, 0));
                 * rageFlame.transform.localScale = new Vector3(5, 5, 5);*/

                burstFlame.transform.SetParent(childLocator.FindChild("Head"));
                burstFlame.transform.localPosition = new Vector3(0, 1, 0);
                burstFlame.transform.localRotation = Quaternion.Euler(new Vector3(270, 180, 0));
                burstFlame.transform.localScale    = new Vector3(5, 5, 5);

                bodyPrefab.AddComponent <DireseekerController>().burstFlame = burstFlame.GetComponent <ParticleSystem>();

                Shader hotpoo = Resources.Load <Shader>("Shaders/Deferred/hgstandard");

                Material hornMat = horn1.GetComponentInChildren <MeshRenderer>().material;
                hornMat.shader = hotpoo;

                //add horns

                CharacterModel.RendererInfo[] infos    = model.baseRendererInfos;
                CharacterModel.RendererInfo[] newInfos = new CharacterModel.RendererInfo[]
                {
                    infos[0],
                    new CharacterModel.RendererInfo
                    {
                        renderer                 = horn1.GetComponentInChildren <MeshRenderer>(),
                        defaultMaterial          = hornMat,
                        defaultShadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On,
                        ignoreOverlays           = true
                    },
                    new CharacterModel.RendererInfo
                    {
                        renderer                 = horn2.GetComponentInChildren <MeshRenderer>(),
                        defaultMaterial          = hornMat,
                        defaultShadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On,
                        ignoreOverlays           = true
                    }
                };

                model.baseRendererInfos = newInfos;

                masterPrefab = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/CharacterMasters/LemurianBruiserMaster"), "DireseekerMaster");

                CharacterMaster master = masterPrefab.GetComponent <CharacterMaster>();

                master.bodyPrefab = bodyPrefab;
                master.isBoss     = false;

                DiggerPlugin.bodyPrefabs.Add(bodyPrefab);
                DiggerPlugin.masterPrefabs.Add(masterPrefab);

                if (DiggerPlugin.enableDireseeker.Value && !DiggerPlugin.direseekerInstalled)
                {
                    CharacterSpawnCard characterSpawnCard = ScriptableObject.CreateInstance <CharacterSpawnCard>();
                    characterSpawnCard.name               = "cscDireseeker";
                    characterSpawnCard.prefab             = masterPrefab;
                    characterSpawnCard.sendOverNetwork    = true;
                    characterSpawnCard.hullSize           = HullClassification.BeetleQueen;
                    characterSpawnCard.nodeGraphType      = MapNodeGroup.GraphType.Ground;
                    characterSpawnCard.requiredFlags      = NodeFlags.None;
                    characterSpawnCard.forbiddenFlags     = NodeFlags.TeleporterOK;
                    characterSpawnCard.directorCreditCost = 800;
                    characterSpawnCard.occupyPosition     = false;
                    characterSpawnCard.loadout            = new SerializableLoadout();
                    characterSpawnCard.noElites           = true;
                    characterSpawnCard.forbiddenAsBoss    = false;

                    DirectorCard card = new DirectorCard
                    {
                        spawnCard               = characterSpawnCard,
                        selectionWeight         = 1,
                        allowAmbushSpawn        = false,
                        preventOverhead         = false,
                        minimumStageCompletions = 2,
                        spawnDistance           = DirectorCore.MonsterSpawnDistance.Close
                    };

                    DirectorAPI.DirectorCardHolder direseekerCard = new DirectorAPI.DirectorCardHolder
                    {
                        Card                 = card,
                        MonsterCategory      = DirectorAPI.MonsterCategory.Champions,
                        InteractableCategory = DirectorAPI.InteractableCategory.None
                    };

                    DirectorAPI.MonsterActions += delegate(List <DirectorAPI.DirectorCardHolder> list, DirectorAPI.StageInfo stage)
                    {
                        if (stage.stage == DirectorAPI.Stage.AbyssalDepths)
                        {
                            if (!list.Contains(direseekerCard))
                            {
                                list.Add(direseekerCard);
                            }
                        }
                    };
                }
            }

            if (DiggerPlugin.enableDireseekerSurvivor.Value)
            {
                survivorPrefab = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/CharacterBodies/LemurianBruiserBody"), "DireseekerPlayerBody");

                CharacterBody bodyComponent2 = survivorPrefab.GetComponent <CharacterBody>();

                bodyComponent2.name              = "DireseekerPlayerBody";
                bodyComponent2.baseNameToken     = "DIRESEEKER_BODY_NAME";
                bodyComponent2.subtitleNameToken = "DIRESEEKER_BODY_SUBTITLE";
                bodyComponent2.baseMoveSpeed     = 11f;
                bodyComponent2.baseMaxHealth     = 2200f;
                bodyComponent2.levelMaxHealth    = 800f;
                bodyComponent2.baseRegen         = 0.5f;
                bodyComponent2.levelRegen        = 0.2f;
                bodyComponent2.baseDamage        = 20f;
                bodyComponent2.levelDamage       = 4f;
                bodyComponent2.isChampion        = false;
                bodyComponent2.portraitIcon      = Assets.mainAssetBundle.LoadAsset <Sprite>("texDireseekerPlayerIcon").texture;
                bodyComponent2.hideCrosshair     = true;

                SkillSetup(survivorPrefab);

                var stateMachine = survivorPrefab.GetComponentInChildren <EntityStateMachine>();
                if (stateMachine)
                {
                    stateMachine.initialStateType = new SerializableEntityStateType(typeof(EntityStates.Direseeker.SpawnState));
                }

                //resize

                survivorPrefab.GetComponent <ModelLocator>().modelBaseTransform.gameObject.transform.localScale *= 0.75f;
                survivorPrefab.transform.GetChild(0).localPosition = new Vector3(0, -2.75f, 0);
                survivorPrefab.transform.GetChild(2).localPosition = new Vector3(0, 0.8f, 1.5f);

                foreach (KinematicCharacterMotor kinematicCharacterMotor in survivorPrefab.GetComponentsInChildren <KinematicCharacterMotor>())
                {
                    kinematicCharacterMotor.SetCapsuleDimensions(kinematicCharacterMotor.Capsule.radius * 0.75f, kinematicCharacterMotor.Capsule.height * 0.75f, 0.75f);
                }

                //

                CharacterModel model2 = survivorPrefab.GetComponentInChildren <CharacterModel>();

                Material newMat = UnityEngine.Object.Instantiate <Material>(model2.baseRendererInfos[0].defaultMaterial);
                newMat.SetTexture("_MainTex", Assets.mainAssetBundle.LoadAsset <Material>("matDireseeker").GetTexture("_MainTex"));
                newMat.SetTexture("_EmTex", Assets.mainAssetBundle.LoadAsset <Material>("matDireseeker").GetTexture("_EmissionMap"));
                newMat.SetFloat("_EmPower", 50f);

                model2.baseRendererInfos[0].defaultMaterial = newMat;

                GameObject horn1b = Assets.mainAssetBundle.LoadAsset <GameObject>("DireHorn").InstantiateClone("DireseekerHorn", false);
                GameObject horn2b = Assets.mainAssetBundle.LoadAsset <GameObject>("DireHornBroken").InstantiateClone("DireseekerHornBroken", false);
                //GameObject rageFlame = Assets.mainAssetBundle.LoadAsset<GameObject>("DireseekerRageFlame").InstantiateClone("DireseekerRageFlame", false);
                GameObject burstFlame2 = Assets.mainAssetBundle.LoadAsset <GameObject>("DireseekerBurstFlame").InstantiateClone("DireseekerBurstFlame", false);

                ChildLocator childLocator2 = survivorPrefab.GetComponentInChildren <ChildLocator>();

                horn1b.transform.SetParent(childLocator2.FindChild("Head"));
                horn1b.transform.localPosition = new Vector3(-2.5f, 1, -0.5f);
                horn1b.transform.localRotation = Quaternion.Euler(new Vector3(45, 0, 90));
                horn1b.transform.localScale    = new Vector3(100, 100, 100);

                horn2b.transform.SetParent(childLocator2.FindChild("Head"));
                horn2b.transform.localPosition = new Vector3(2.5f, 1, -0.5f);
                horn2b.transform.localRotation = Quaternion.Euler(new Vector3(45, 0, 90));
                horn2b.transform.localScale    = new Vector3(100, -100, 100);

                /*rageFlame.transform.SetParent(childLocator.FindChild("Head"));
                 * rageFlame.transform.localPosition = new Vector3(0, 1, 0);
                 * rageFlame.transform.localRotation = Quaternion.Euler(new Vector3(270, 180, 0));
                 * rageFlame.transform.localScale = new Vector3(5, 5, 5);*/

                burstFlame2.transform.SetParent(childLocator2.FindChild("Head"));
                burstFlame2.transform.localPosition = new Vector3(0, 1, 0);
                burstFlame2.transform.localRotation = Quaternion.Euler(new Vector3(270, 180, 0));
                burstFlame2.transform.localScale    = new Vector3(5, 5, 5);

                survivorPrefab.AddComponent <DireseekerController>().burstFlame = burstFlame2.GetComponent <ParticleSystem>();

                Shader hotpoo = Resources.Load <Shader>("Shaders/Deferred/hgstandard");

                Material hornMat = horn1b.GetComponentInChildren <MeshRenderer>().material;
                hornMat.shader = hotpoo;

                //add horns

                CharacterModel.RendererInfo[] infos2    = model2.baseRendererInfos;
                CharacterModel.RendererInfo[] newInfos2 = new CharacterModel.RendererInfo[]
                {
                    infos2[0],
                    new CharacterModel.RendererInfo
                    {
                        renderer                 = horn1b.GetComponentInChildren <MeshRenderer>(),
                        defaultMaterial          = hornMat,
                        defaultShadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On,
                        ignoreOverlays           = true
                    },
                    new CharacterModel.RendererInfo
                    {
                        renderer                 = horn2b.GetComponentInChildren <MeshRenderer>(),
                        defaultMaterial          = hornMat,
                        defaultShadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On,
                        ignoreOverlays           = true
                    }
                };

                model2.baseRendererInfos = newInfos2;

                survivorPrefab.GetComponent <DeathRewards>().logUnlockableDef     = null;
                survivorPrefab.GetComponent <Interactor>().maxInteractionDistance = 5f;

                survivorPrefab.tag = "Player";

                SkinSetup();

                DiggerPlugin.bodyPrefabs.Add(survivorPrefab);

                GameObject displayPrefab = PrefabAPI.InstantiateClone(survivorPrefab.GetComponent <ModelLocator>().modelTransform.gameObject, "DireseekerDisplay", true);
                displayPrefab.AddComponent <NetworkIdentity>();
                displayPrefab.transform.localScale *= 0.5f;

                SurvivorDef survivorDef = new SurvivorDef
                {
                    displayNameToken = "DIRESEEKER_BODY_NAME",
                    descriptionToken = "MINER_DESCRIPTION",
                    primaryColor     = Color.red,
                    bodyPrefab       = survivorPrefab,
                    displayPrefab    = displayPrefab,
                    outroFlavorToken = "DIRESEEKER_BODY_OUTRO_FLAVOR"
                };

                SurvivorAPI.AddSurvivor(survivorDef);
            }
        }
Пример #18
0
        public void Awake()
        {
            On.EntityStates.ClaymanMonster.SwipeForward.OnEnter += (orig, self) =>
            {
                EntityStates.ClaymanMonster.SwipeForward.attackString       = "Play_merc_sword_swing";
                EntityStates.ClaymanMonster.SwipeForward.selfForceMagnitude = 1800f;
                EntityStates.ClaymanMonster.SwipeForward.baseDuration       = 1f;
                EntityStates.ClaymanMonster.SwipeForward.damageCoefficient  = 1.4f;
                orig(self);
            };

            On.EntityStates.ClaymanMonster.Leap.OnEnter += (orig, self) =>
            {
                EntityStates.ClaymanMonster.Leap.verticalJumpSpeed = 20f;
                EntityStates.ClaymanMonster.Leap.horizontalJumpSpeedCoefficient = 2.3f;
                orig(self);
            };

            On.EntityStates.ClaymanMonster.SpawnState.OnEnter += (orig, self) =>
            {
                EntityStates.ClaymanMonster.SpawnState.duration = 3.2f;
                orig(self);
            };

            clayObject = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("prefabs/characterbodies/ClayBody"), "MoffeinClayManBody", true);
            clayMaster = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("prefabs/charactermasters/ClaymanMaster"), "MoffeinClayManMaster", true);

            CharacterSpawnCard beetleCSC = Resources.Load <CharacterSpawnCard>("SpawnCards/CharacterSpawnCards/cscBeetle");

            //CharacterSpawnCard clayBossCSC = Resources.Load<CharacterSpawnCard>("SpawnCards/CharacterSpawnCards/cscClayBoss");

            ModifyClayMan();
            ItemDisplays.DisplayRules(clayObject);

            CharacterSpawnCard clayManCSC = ScriptableObject.CreateInstance <CharacterSpawnCard>();

            clayManCSC.name               = "cscClayMan";
            clayManCSC.prefab             = clayMaster;
            clayManCSC.sendOverNetwork    = true;
            clayManCSC.hullSize           = HullClassification.Human;
            clayManCSC.nodeGraphType      = MapNodeGroup.GraphType.Ground;
            clayManCSC.requiredFlags      = NodeFlags.None;
            clayManCSC.forbiddenFlags     = NodeFlags.NoCharacterSpawn;
            clayManCSC.directorCreditCost = 16;
            clayManCSC.occupyPosition     = false;
            clayManCSC.loadout            = new SerializableLoadout();
            clayManCSC.noElites           = false;
            clayManCSC.forbiddenAsBoss    = false;

            DirectorCard clayManDC = new DirectorCard
            {
                spawnCard               = clayManCSC,
                selectionWeight         = 1,
                allowAmbushSpawn        = true,
                preventOverhead         = false,
                minimumStageCompletions = 0,
                spawnDistance           = DirectorCore.MonsterSpawnDistance.Close
            };

            DirectorAPI.DirectorCardHolder clayManCard = new DirectorAPI.DirectorCardHolder
            {
                Card                 = clayManDC,
                MonsterCategory      = DirectorAPI.MonsterCategory.BasicMonsters,
                InteractableCategory = DirectorAPI.InteractableCategory.None
            };

            //This causes errors

            /*DirectorAPI.FamilyActions += delegate (List<DirectorAPI.MonsterFamilyHolder> list, DirectorAPI.StageInfo stage)
             * {
             *  foreach (DirectorAPI.MonsterFamilyHolder holder in list)
             *  {
             *      foreach (DirectorCard dC in holder.FamilyChampions)
             *      {
             *          if (dC.spawnCard == clayBossCSC)
             *          {
             *              if (!holder.FamilyBasicMonsters.Contains(clayManDC))
             *              {
             *                  holder.FamilyBasicMonsters.Add(clayManDC);
             *              }
             *          }
             *      }
             *  }
             * };*/

            DirectorAPI.MonsterActions += delegate(List <DirectorAPI.DirectorCardHolder> list, DirectorAPI.StageInfo stage)
            {
                bool addClayMan = false;
                switch (stage.stage)
                {
                case DirectorAPI.Stage.ArtifactReliquary:
                case DirectorAPI.Stage.VoidCell:
                case DirectorAPI.Stage.AbandonedAqueduct:
                case DirectorAPI.Stage.RallypointDelta:
                    foreach (DirectorAPI.DirectorCardHolder dc in list)
                    {
                        if (dc.Card.spawnCard == beetleCSC)
                        {
                            dc.Card.selectionWeight = 1;
                        }
                    }
                    addClayMan = true;
                    break;

                case DirectorAPI.Stage.ScorchedAcres:
                    addClayMan = true;
                    foreach (DirectorAPI.DirectorCardHolder dc in list)
                    {
                        if (dc.Card.spawnCard == beetleCSC)
                        {
                            dc.Card.selectionWeight = 0;
                        }
                    }
                    break;

                case DirectorAPI.Stage.Custom:
                    if (stage.CustomStageName == "rootjungle")
                    {
                        addClayMan = true;
                    }
                    break;

                default:
                    break;
                }
                if (addClayMan)
                {
                    if (!list.Contains(clayManCard))
                    {
                        list.Add(clayManCard);
                    }
                }
            };
            On.EntityStates.ClaymanMonster.SpawnState.OnEnter += (orig, self) =>
            {
                orig(self);
                Util.PlayAttackSpeedSound("Play_clayBruiser_attack2_shoot", self.outer.gameObject, 1f);
            };
            ContentManager.collectContentPackProviders += ContentManager_collectContentPackProviders;
        }
Пример #19
0
 private void Awake_On(HooksCore.RoR2.CharacterSpawnCard.Awake.Orig orig, CharacterSpawnCard self)
 {
     self.loadout = new SerializableLoadout();
     orig(self);
 }