Пример #1
0
        public void CreateElite()
        {
            var eliteDef = new RoR2.EliteDef
            {
                name                = "Hypercharged",
                modifierToken       = "ARES_HYPERCHARGED",
                color               = Color.white,
                eliteEquipmentIndex = AffixEquipmentIndex
            };

            EliteIndex = EliteAPI.Add(new CustomElite(eliteDef, 2));
            LanguageAPI.Add(eliteDef.modifierToken, eliteDef.name + " {0}");

            EliteBuffDef.eliteIndex       = EliteIndex;
            EliteBuffIndex                = BuffAPI.Add(new CustomBuff(EliteBuffDef));
            AffixEquipmentDef.passiveBuff = EliteBuffIndex;

            EliteAffixCard = new EliteAffixCard
            {
                spawnWeight      = 0.5f,
                costMultiplier   = 30.0f,
                damageBoostCoeff = 2.0f,
                healthBoostCoeff = 4.5f,
                eliteOnlyScaling = 0.5f,
                eliteType        = EliteIndex
            };
            EsoLib.Cards.Add(EliteAffixCard);
        }
Пример #2
0
        public override void SetupAttributes()
        {
            base.SetupAttributes();
            equipmentDef.canDrop          = false;
            equipmentDef.enigmaCompatible = false;
            equipmentDef.cooldown         = 40;

            var buffDef = new BuffDef
            {
                name      = EliteBuffName,
                buffColor = new Color32(255, 255, 255, byte.MaxValue),
                iconPath  = EliteBuffIconPath,
                canStack  = false,
            };

            buffDef.eliteIndex = EliteIndex;
            var buffIndex = new CustomBuff(buffDef);

            EliteBuffIndex           = BuffAPI.Add(buffIndex);
            equipmentDef.passiveBuff = EliteBuffIndex;

            var eliteDef = new EliteDef
            {
                name          = ElitePrefixName,
                modifierToken = EliteModifierString,
                color         = buffDef.buffColor,
            };

            eliteDef.eliteEquipmentIndex = equipmentDef.equipmentIndex;
            var eliteIndex = new CustomElite(eliteDef, EliteTier);

            EliteIndex = EliteAPI.Add(eliteIndex);

            var card = new EliteAffixCard
            {
                spawnWeight      = 0.5f,
                costMultiplier   = 30.0f,
                damageBoostCoeff = 2.0f,
                healthBoostCoeff = 4.5f,
                eliteOnlyScaling = 0.5f,
                eliteType        = EliteIndex
            };

            EsoLib.Cards.Add(card);
            EliteCard = card;

            LanguageAPI.Add(eliteDef.modifierToken, ElitePrefixName + " {0}");

            //If we want to load our own, uncomment the one below.
            EliteMaterial = Resources.Load <Material>("@Aetherium:Assets/Textures/Materials/ApollosBrillianceMain.mat");
        }
Пример #3
0
        public override void SetupAttributes()
        {
            base.SetupAttributes();

            if (KaliberWrath_Enable)
            {
                equipmentDef.canDrop          = true;
                equipmentDef.enigmaCompatible = false;

                var jammedEliteDef = new CustomElite(
                    new EliteDef
                {
                    name                = "Jammed",
                    modifierToken       = "ROB_ELITE_MODIFIER_JAMMED",
                    color               = new Color32(150, 10, 10, 255),
                    eliteEquipmentIndex = equipmentDef.equipmentIndex
                }, 1);
                JammedEliteIndex = EliteAPI.Add(jammedEliteDef);
                LanguageAPI.Add(jammedEliteDef.EliteDef.modifierToken, "Jammed {0}");

                var jammedBuffDef = new CustomBuff(
                    new BuffDef
                {
                    name       = "Affix_Jammed",
                    buffColor  = new Color32(150, 10, 10, 255),
                    iconPath   = "",
                    eliteIndex = JammedEliteIndex,
                    canStack   = false
                });
                JammedBuffIndex          = BuffAPI.Add(jammedBuffDef);
                equipmentDef.passiveBuff = JammedBuffIndex;

                JammedEliteCard = new EliteAffixCard
                {
                    spawnWeight      = 0.8f,
                    costMultiplier   = 15.0f,
                    damageBoostCoeff = 1.0f,
                    healthBoostCoeff = 4.0f,
                    eliteOnlyScaling = 0.5f,
                    eliteType        = JammedEliteIndex,
                };

                EsoLib.Cards.Add(JammedEliteCard);
            }
        }
Пример #4
0
        public override void SetupAttributes()
        {
            base.SetupAttributes();
            equipmentDef.canDrop          = false;
            equipmentDef.enigmaCompatible = false;
            equipmentDef.cooldown         = 60;

            var buffDef = new RoR2.BuffDef
            {
                name      = EliteBuffName,
                buffColor = new Color32(255, 255, 255, byte.MaxValue),
                iconPath  = EliteBuffIconPath,
                canStack  = false,
            };

            buffDef.eliteIndex = EliteIndex;
            var buffIndex = new CustomBuff(buffDef);

            EliteBuffIndex           = BuffAPI.Add(buffIndex);
            equipmentDef.passiveBuff = EliteBuffIndex;

            var eliteDef = new RoR2.EliteDef
            {
                name          = ElitePrefixName,
                modifierToken = EliteModifierString,
                color         = buffDef.buffColor,
            };

            eliteDef.eliteEquipmentIndex = equipmentDef.equipmentIndex;
            var eliteIndex = new CustomElite(eliteDef, EliteTier);

            EliteIndex = EliteAPI.Add(eliteIndex);

            var card = new EliteAffixCard
            {
                spawnWeight      = 0.5f,
                costMultiplier   = 30.0f,
                damageBoostCoeff = 2.0f,
                healthBoostCoeff = 4.5f,
                eliteOnlyScaling = 0.5f,
                eliteType        = EliteIndex
            };

            EsoLib.Cards.Add(card);
            EliteCard = card;

            LanguageAPI.Add(eliteDef.modifierToken, ElitePrefixName + " {0}");

            //If we want to load a base game material, then we use this.

            /*GameObject worm = Resources.Load<GameObject>("Prefabs/characterbodies/ElectricWormBody");
             * Debug.Log($"WORM: {worm}");
             * var modelLocator = worm.GetComponent<ModelLocator>();
             * Debug.Log($"MODEL LOCATOR: {modelLocator}");
             * var model = modelLocator.modelTransform.GetComponent<CharacterModel>();
             * Debug.Log($"MODEL: {model}");
             * if (model)
             * {
             *  var rendererInfos = model.baseRendererInfos;
             *  foreach (CharacterModel.RendererInfo renderer in rendererInfos)
             *  {
             *      if (renderer.defaultMaterial.name == "matElectricWorm")
             *      {
             *          HyperchargedMaterial = renderer.defaultMaterial;
             *      }
             *  }
             * }*/

            //If we want to load our own, uncomment the one below.
            EliteMaterial = Resources.Load <Material>("@Aetherium:Assets/Textures/Materials/TheirReminder.mat");
        }
Пример #5
0
        public static bool Init()
        {
            On.RoR2.GlobalEventManager.ServerDamageDealt += GlobalEventManager_ServerDamageDealt;

            var equipDef = new EquipmentDef
            {
                name             = EquipName,
                cooldown         = 10f,
                pickupModelPath  = "",
                pickupIconPath   = "",
                nameToken        = EquipName,
                pickupToken      = "Pickup_Blightborne",
                descriptionToken = "Description_Blightborne",
                canDrop          = false,
                enigmaCompatible = false
            };

            var equip = new CustomEquipment(equipDef, new ItemDisplayRule[0]);

            var buffDef = new BuffDef
            {
                name      = BuffName,
                buffColor = new Color32(141, 51, 19, 255),
                iconPath  = "",
                canStack  = false
            };
            var buff = new CustomBuff(buffDef);

            var eliteDef = new EliteDef
            {
                name                = EliteName,
                modifierToken       = "ELITE_MODIFIER_BLIGHTBORNE",
                color               = buffDef.buffColor,
                eliteEquipmentIndex = _equipIndex
            };

            var elite = new CustomElite(eliteDef, 1);

            _eliteIndex = EliteAPI.Add(elite);
            _buffIndex  = BuffAPI.Add(buff);
            _equipIndex = ItemAPI.Add(equip);
            eliteDef.eliteEquipmentIndex = _equipIndex;
            equipDef.passiveBuff         = _buffIndex;
            buffDef.eliteIndex           = _eliteIndex;

            On.RoR2.CharacterBody.OnEquipmentLost   += CharacterBody_OnEquipmentLost;
            On.RoR2.CharacterBody.OnEquipmentGained += CharacterBody_OnEquipmentGained;
            var card = new EliteAffixCard
            {
                spawnWeight      = 0.5f,
                costMultiplier   = 16f,
                damageBoostCoeff = 2.0f,
                healthBoostCoeff = 8.0f,
                eliteOnlyScaling = 1f,
                eliteType        = _eliteIndex,
                onSpawned        = OnSpawned,
                isAvailable      = new Func <bool>(() => Run.instance.stageClearCount > 3 && Run.instance.selectedDifficulty != DifficultyIndex.Easy)
            };

            //Register the card for spawning if ESO is enabled
            EsoLib.Cards.Add(card);
            Card = card;

            //Description of elite in UI when boss
            LanguageAPI.Add(eliteDef.modifierToken, "Blightborne {0}");
            LanguageAPI.Add(equipDef.pickupToken, "Blight's Embrace");
            LanguageAPI.Add(equipDef.descriptionToken, "Become an aspect of Blight");

            return(true);
        }
Пример #6
0
        public static bool Init()
        {
            On.RoR2.GlobalEventManager.OnCharacterDeath += GlobalEventManager_OnCharacterDeath;

            var equipDef = new EquipmentDef
            {
                name             = EquipName,
                cooldown         = 10f,
                pickupModelPath  = "",
                pickupIconPath   = "",
                nameToken        = EquipName,
                pickupToken      = "Pickup_Tarborne",
                descriptionToken = "Description_Tarborne",
                canDrop          = false,
                enigmaCompatible = false
            };

            On.RoR2.CharacterBody.OnEquipmentLost   += CharacterBody_OnEquipmentLost;
            On.RoR2.CharacterBody.OnEquipmentGained += CharacterBody_OnEquipmentGained;
            var equip = new CustomEquipment(equipDef, new ItemDisplayRule[0]);

            var buffDef = new BuffDef
            {
                name      = BuffName,
                buffColor = new Color32(41, 41, 41, 255),
                iconPath  = "",
                canStack  = false
            };
            var buff = new CustomBuff(buffDef);

            var eliteDef = new EliteDef
            {
                name                = EliteName,
                modifierToken       = "ELITE_MODIFIER_TARBORNE",
                color               = buffDef.buffColor,
                eliteEquipmentIndex = _equipIndex
            };

            var elite = new CustomElite(eliteDef, 1);

            _eliteIndex = EliteAPI.Add(elite);
            _buffIndex  = BuffAPI.Add(buff);
            _equipIndex = ItemAPI.Add(equip);
            eliteDef.eliteEquipmentIndex = _equipIndex;
            equipDef.passiveBuff         = _buffIndex;
            buffDef.eliteIndex           = _eliteIndex;


            var card = new EliteAffixCard
            {
                spawnWeight      = 1f,
                costMultiplier   = 6f,
                damageBoostCoeff = 2.0f,
                healthBoostCoeff = 4.0f,
                eliteOnlyScaling = 1f,
                eliteType        = _eliteIndex,
                onSpawned        = OnSpawned,
                isAvailable      = new Func <bool>(() => true)
            };

            //Register the card for spawning if ESO is enabled
            EsoLib.Cards.Add(card);
            Card = card;

            //Description of elite in UI when boss
            LanguageAPI.Add(eliteDef.modifierToken, "Tarborne {0}");
            LanguageAPI.Add(equipDef.pickupToken, "Dunestrider's Dominion");
            LanguageAPI.Add(equipDef.descriptionToken, "Become an aspect of Tar");

            return(true);
        }
Пример #7
0
        public override void SetupAttributes()
        {
            base.SetupAttributes();
            equipmentDef.canDrop          = false;
            equipmentDef.enigmaCompatible = false;
            equipmentDef.cooldown         = 60;

            var buffDef = new RoR2.BuffDef
            {
                name      = EliteBuffName,
                buffColor = new Color32(255, 255, 255, byte.MaxValue),
                iconPath  = EliteBuffIconPath,
                canStack  = false,
            };

            buffDef.eliteIndex = EliteIndex;
            var buffIndex = new CustomBuff(buffDef);

            EliteBuffIndex           = BuffAPI.Add(buffIndex);
            equipmentDef.passiveBuff = EliteBuffIndex;

            var eliteDef = new RoR2.EliteDef
            {
                name          = ElitePrefixName,
                modifierToken = EliteModifierString,
                color         = buffDef.buffColor,
            };

            eliteDef.eliteEquipmentIndex = equipmentDef.equipmentIndex;
            var eliteIndex = new CustomElite(eliteDef, EliteTier);

            EliteIndex = EliteAPI.Add(eliteIndex);

            var card = new EliteAffixCard
            {
                spawnWeight      = 0.5f,
                costMultiplier   = 30.0f,
                damageBoostCoeff = 2.0f,
                healthBoostCoeff = 4.5f,
                eliteOnlyScaling = 0.5f,
                eliteType        = EliteIndex
            };

            EsoLib.Cards.Add(card);
            EliteCard = card;

            LanguageAPI.Add(eliteDef.modifierToken, ElitePrefixName + " {0}");

            //If we want to load a base game material, then we use this.

            /*GameObject worm = Resources.Load<GameObject>("Prefabs/characterbodies/ElectricWormBody");
             * Debug.Log($"WORM: {worm}");
             * var modelLocator = worm.GetComponent<ModelLocator>();
             * Debug.Log($"MODEL LOCATOR: {modelLocator}");
             * var model = modelLocator.modelTransform.GetComponent<CharacterModel>();
             * Debug.Log($"MODEL: {model}");
             * if (model)
             * {
             *  var rendererInfos = model.baseRendererInfos;
             *  foreach (CharacterModel.RendererInfo renderer in rendererInfos)
             *  {
             *      if (renderer.defaultMaterial.name == "matElectricWorm")
             *      {
             *          HyperchargedMaterial = renderer.defaultMaterial;
             *      }
             *  }
             * }*/

            //If we want to load our own, uncomment the one below.
            EliteMaterial = Resources.Load <Material>("@Aetherium:Assets/Textures/Materials/TheirReminder.mat");

            HyperchargedProjectile = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/Projectiles/LightningStake"), "HyperchargedProjectile", true);

            var controller = HyperchargedProjectile.GetComponent <ProjectileController>();

            controller.startSound = "Play_titanboss_shift_shoot";

            var impactExplosion = HyperchargedProjectile.GetComponent <RoR2.Projectile.ProjectileImpactExplosion>();

            impactExplosion.lifetime        = 0.5f;
            impactExplosion.impactEffect    = Resources.Load <GameObject>("Prefabs/Effects/ImpactEffects/LightningStrikeImpact");
            impactExplosion.blastRadius     = 7f;
            impactExplosion.bonusBlastForce = new Vector3(0, 750, 0);

            // register it for networking
            if (HyperchargedProjectile)
            {
                PrefabAPI.RegisterNetworkPrefab(HyperchargedProjectile);
            }

            // add it to the projectile catalog or it won't work in multiplayer
            RoR2.ProjectileCatalog.getAdditionalEntries += list =>
            {
                list.Add(HyperchargedProjectile);
            };
        }
Пример #8
0
        public override void SetupAttributes()
        {
            base.SetupAttributes();
            equipmentDef.canDrop          = false;
            equipmentDef.enigmaCompatible = false;
            equipmentDef.cooldown         = 40;

            var buffDef = new RoR2.BuffDef
            {
                name      = EliteBuffName,
                buffColor = new Color32(255, 255, 255, byte.MaxValue),
                iconPath  = EliteBuffIconPath,
                canStack  = false,
            };

            buffDef.eliteIndex = EliteIndex;
            var buffIndex = new CustomBuff(buffDef);

            EliteBuffIndex           = BuffAPI.Add(buffIndex);
            equipmentDef.passiveBuff = EliteBuffIndex;

            var eliteDef = new RoR2.EliteDef
            {
                name          = ElitePrefixName,
                modifierToken = EliteModifierString,
                color         = buffDef.buffColor,
            };

            eliteDef.eliteEquipmentIndex = equipmentDef.equipmentIndex;
            var eliteIndex = new CustomElite(eliteDef, EliteTier);

            EliteIndex = EliteAPI.Add(eliteIndex);

            var card = new EliteAffixCard
            {
                spawnWeight      = 0.5f,
                costMultiplier   = 30.0f,
                damageBoostCoeff = 2.0f,
                healthBoostCoeff = 4.5f,
                eliteOnlyScaling = 0.5f,
                eliteType        = EliteIndex
            };

            EsoLib.Cards.Add(card);
            EliteCard = card;

            LanguageAPI.Add(eliteDef.modifierToken, ElitePrefixName + " {0}");

            RadiantProjectile = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/Projectiles/Thermite"), "RadiantProjectile", true);

            var damage = RadiantProjectile.GetComponent <RoR2.Projectile.ProjectileDamage>();

            damage.damageType = DamageType.IgniteOnHit;

            var simpleProjectile = RadiantProjectile.GetComponent <ProjectileSimple>();

            simpleProjectile.velocity           = 100;
            simpleProjectile.oscillateMagnitude = 0;

            if (RadiantProjectile)
            {
                PrefabAPI.RegisterNetworkPrefab(RadiantProjectile);
            }

            RoR2.ProjectileCatalog.getAdditionalEntries += list =>
            {
                list.Add(RadiantProjectile);
            };

            //If we want to load a base game material, then we use this.

            /*GameObject worm = Resources.Load<GameObject>("Prefabs/characterbodies/ElectricWormBody");
             * Debug.Log($"WORM: {worm}");
             * var modelLocator = worm.GetComponent<ModelLocator>();
             * Debug.Log($"MODEL LOCATOR: {modelLocator}");
             * var model = modelLocator.modelTransform.GetComponent<CharacterModel>();
             * Debug.Log($"MODEL: {model}");
             * if (model)
             * {
             *  var rendererInfos = model.baseRendererInfos;
             *  foreach (CharacterModel.RendererInfo renderer in rendererInfos)
             *  {
             *      if (renderer.defaultMaterial.name == "matElectricWorm")
             *      {
             *          HyperchargedMaterial = renderer.defaultMaterial;
             *      }
             *  }
             * }*/

            //If we want to load our own, uncomment the one below.
            EliteMaterial = Resources.Load <Material>("@Aetherium:Assets/Textures/Materials/ApollosBrillianceMain.mat");
            //Shader hotpoo = Resources.Load<Shader>("Shaders/Deferred/hgstandard");
        }
Пример #9
0
        public void Test()
        {
            var defaultIcon = Addressables.LoadAssetAsync <Sprite>("RoR2/Base/Common/MiscIcons/texMysteryIcon.png").WaitForCompletion();

            Assert.True(defaultIcon);

            var eliteBuffDef = ScriptableObject.CreateInstance <BuffDef>();

            eliteBuffDef.name       = "R2APITest_EliteBuffDef";
            eliteBuffDef.buffColor  = new Color32(255, 255, 255, byte.MaxValue);
            eliteBuffDef.iconSprite = defaultIcon;
            eliteBuffDef.canStack   = false;

            const string EliteAffixToken = "R2APITEST_eliteEquipmentDefAffixToken";
            const string RegisteredToken = "_REGISTERED";

            LanguageAPI.Add(EliteAffixToken, EliteAffixToken + RegisteredToken);

            var eliteEquipmentDef = ScriptableObject.CreateInstance <EquipmentDef>();

            eliteEquipmentDef.name = "ELITE_EQUIPMENT_" + EliteAffixToken;
            LanguageAPI.Add(eliteEquipmentDef.name, eliteEquipmentDef.name + RegisteredToken);

            eliteEquipmentDef.nameToken = "ELITE_EQUIPMENT_" + EliteAffixToken + "_NAME";
            LanguageAPI.Add(eliteEquipmentDef.nameToken, eliteEquipmentDef.nameToken + RegisteredToken);

            eliteEquipmentDef.pickupToken = "ELITE_EQUIPMENT_" + EliteAffixToken + "_PICKUP";
            LanguageAPI.Add(eliteEquipmentDef.pickupToken, eliteEquipmentDef.pickupToken + RegisteredToken);

            eliteEquipmentDef.descriptionToken = "ELITE_EQUIPMENT_" + EliteAffixToken + "_DESCRIPTION";
            LanguageAPI.Add(eliteEquipmentDef.descriptionToken, eliteEquipmentDef.descriptionToken + RegisteredToken);

            eliteEquipmentDef.loreToken = "ELITE_EQUIPMENT_" + EliteAffixToken + "_LORETOKEN";
            LanguageAPI.Add(eliteEquipmentDef.loreToken, eliteEquipmentDef.loreToken + RegisteredToken);

            eliteEquipmentDef.pickupModelPrefab     = null;
            eliteEquipmentDef.pickupIconSprite      = defaultIcon;
            eliteEquipmentDef.appearsInSinglePlayer = true;
            eliteEquipmentDef.appearsInMultiPlayer  = true;
            eliteEquipmentDef.canDrop          = true;
            eliteEquipmentDef.cooldown         = 2;
            eliteEquipmentDef.enigmaCompatible = false;
            eliteEquipmentDef.isBoss           = false;
            eliteEquipmentDef.isLunar          = false;
            eliteEquipmentDef.passiveBuffDef   = eliteBuffDef;

            ItemDisplayRule[] itemDisplayRules = null;
            var customEquipment = new CustomEquipment(eliteEquipmentDef, itemDisplayRules);

            Assert.True(ItemAPI.Add(customEquipment));

            var customEliteTierDefs = new CombatDirector.EliteTierDef[]
            {
                new CombatDirector.EliteTierDef()
                {
                    costMultiplier = CombatDirector.baseEliteCostMultiplier,
                    eliteTypes     = Array.Empty <EliteDef>(),
                    isAvailable    = SetAvailability,
                },
            };

            foreach (var eliteTierDef in customEliteTierDefs)
            {
                EliteAPI.AddCustomEliteTier(eliteTierDef);
            }

            var customEliteDef = ScriptableObject.CreateInstance <EliteDef>();

            customEliteDef.healthBoostCoefficient = 2;
            customEliteDef.color                  = new Color32(255, 0, 0, byte.MaxValue);
            customEliteDef.eliteEquipmentDef      = eliteEquipmentDef;
            customEliteDef.damageBoostCoefficient = 2;
            customEliteDef.modifierToken          = "R2API_TEST_ELITEDEF_MODIFIERTOKEN";
            LanguageAPI.Add(customEliteDef.modifierToken, customEliteDef.modifierToken + RegisteredToken);

            customEliteDef.shaderEliteRampIndex = 0;

            eliteBuffDef.eliteDef = customEliteDef;

            Assert.True(EliteAPI.Add(new CustomElite(customEliteDef, customEliteTierDefs)));

            // this may break, but right now thats the index where our custom tier should end up
            const int ourIndex = 1;

            Assert.True(CombatDirector.eliteTiers[ourIndex].costMultiplier == 6);

            // Should be length 0 if its our custom tier def,
            // the eliteDef will be added when content packs get added to game content. (EliteAPI.AddElitesToGame)
            Assert.True(CombatDirector.eliteTiers[ourIndex].eliteTypes.Length == 0);
        }
Пример #10
0
        public override void SetupAttributes()
        {
            if (ItemBodyModelPrefab == null)
            {
                ItemBodyModelPrefab          = Resources.Load <GameObject>("@Aetherium:Assets/Models/Prefabs/HisVengeanceDisplay.prefab");
                SecondaryItemBodyModelPrefab = Resources.Load <GameObject>("@Aetherium:Assets/Models/Prefabs/HisVengeanceCluster.prefab");
                displayRules = GenerateItemDisplayRules();
            }
            base.SetupAttributes();
            equipmentDef.canDrop          = false;
            equipmentDef.enigmaCompatible = false;

            var buffDef = new RoR2.BuffDef
            {
                name      = EliteBuffName,
                buffColor = new Color32(255, 255, 255, byte.MaxValue),
                iconPath  = EliteBuffIconPath,
                canStack  = false,
            };

            buffDef.eliteIndex = EliteIndex;
            var buffIndex = new CustomBuff(buffDef);

            EliteBuffIndex           = BuffAPI.Add(buffIndex);
            equipmentDef.passiveBuff = EliteBuffIndex;

            var eliteDef = new RoR2.EliteDef
            {
                name          = ElitePrefixName,
                modifierToken = EliteModifierString,
                color         = buffDef.buffColor,
            };

            eliteDef.eliteEquipmentIndex = equipmentDef.equipmentIndex;
            var eliteIndex = new CustomElite(eliteDef, EliteTier);

            EliteIndex = EliteAPI.Add(eliteIndex);

            var card = new EliteAffixCard
            {
                spawnWeight      = 0.5f,
                costMultiplier   = 15.0f,
                damageBoostCoeff = 2.0f,
                healthBoostCoeff = 2.0f,
                eliteOnlyScaling = 0.5f,
                eliteType        = EliteIndex
            };

            EsoLib.Cards.Add(card);
            EliteCard = card;

            LanguageAPI.Add(eliteDef.modifierToken, ElitePrefixName + " {0}");

            EliteMaterial = Resources.Load <Material>("@Aetherium:Assets/Textures/Materials/HisVengeanceBody.mat");

            SplinteringProjectile = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("Prefabs/Projectiles/ImpVoidspikeProjectile"), "SplinteringProjectile", true);

            var model = Resources.Load <GameObject>("@Aetherium:Assets/Models/Prefabs/HisVengeanceProjectile.prefab");

            model.AddComponent <NetworkIdentity>();
            var ghost = model.AddComponent <RoR2.Projectile.ProjectileGhostController>();

            var controller = SplinteringProjectile.GetComponent <RoR2.Projectile.ProjectileController>();

            controller.procCoefficient = 0.25f;
            controller.ghostPrefab     = model;

            var damage = SplinteringProjectile.GetComponent <RoR2.Projectile.ProjectileDamage>();

            damage.damageType = DamageType.Generic;

            var impactExplosion = SplinteringProjectile.GetComponent <ProjectileImpactExplosion>();

            impactExplosion.impactEffect = Resources.Load <GameObject>("Prefabs/Effects/ImpactEffects/ImpactCrowbar");

            var stickOnImpact = SplinteringProjectile.GetComponent <RoR2.Projectile.ProjectileStickOnImpact>();

            stickOnImpact.stickSoundString = "Play_bellBody_attackLand";

            if (SplinteringProjectile)
            {
                PrefabAPI.RegisterNetworkPrefab(SplinteringProjectile);
            }

            RoR2.ProjectileCatalog.getAdditionalEntries += list =>
            {
                list.Add(SplinteringProjectile);
            };
        }