Esempio n. 1
0
        public override void SetupBehavior()
        {
            base.SetupBehavior();
            GameObject commandoGrenadePrefab = Resources.Load <GameObject>("prefabs/projectiles/CommandoGrenadeProjectile");

            BombPrefab = commandoGrenadePrefab.InstantiateClone("Bulletstorm_Bomb", true);
            var BombScale = 1.15f;

            BombPrefab.transform.localScale = new Vector3(BombScale, BombScale, BombScale);
            BombPrefab.GetComponent <ProjectileSimple>().desiredForwardSpeed   = 25; //default 50
            BombPrefab.GetComponent <ProjectileSimple>().lifetime              = 5;  //default 5
            BombPrefab.GetComponent <ProjectileDamage>().damageColorIndex      = DamageColorIndex.Item;
            BombPrefab.GetComponent <ProjectileImpactExplosion>().falloffModel = BlastAttack.FalloffModel.None;
            //Object.Destroy(BombPrefab.GetComponent<ApplyTorqueOnStart>());

            var model      = assetBundle.LoadAsset <GameObject>(ProjectileModelPath);
            var modelScale = 0.20f;

            model.transform.localScale = new Vector3(modelScale, modelScale, modelScale);
            model.AddComponent <NetworkIdentity>();
            model.AddComponent <ProjectileGhostController>();

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

            controller.ghostPrefab = model;
            //controller.transform.localScale = new Vector3(0.25f, 0.25f, 0.25f);

            ProjectileAPI.Add(BombPrefab);
            if (BombPrefab)
            {
                PrefabAPI.RegisterNetworkPrefab(BombPrefab);
            }
        }
        internal override void SetupAttributes()
        {
            var oldDef = Resources.Load <SkillDef>("skilldefs/commandobody/ThrowGrenade");

            myDef = CloneSkillDef(oldDef);

            var nametoken = "ANCIENTSCEPTER_SCEPCOMMANDO_GRENADENAME";

            newDescToken = "ANCIENTSCEPTER_SCEPCOMMANDO_GRENADEDESC";
            oldDescToken = oldDef.skillDescriptionToken;
            var namestr = "Carpet Bomb";

            LanguageAPI.Add(nametoken, namestr);

            myDef.skillName             = namestr;
            myDef.skillNameToken        = nametoken;
            myDef.skillDescriptionToken = newDescToken;
            myDef.icon = Assets.mainAssetBundle.LoadAsset <Sprite>("texCommandoR2");

            LoadoutAPI.AddSkillDef(myDef);

            projReplacer = Resources.Load <GameObject>("prefabs/projectiles/CommandoGrenadeProjectile").InstantiateClone("CIScepCommandoGrenade");
            var pie = projReplacer.GetComponent <ProjectileImpactExplosion>();

            pie.blastDamageCoefficient *= 0.5f;
            pie.bonusBlastForce        *= 0.5f;

            ProjectileAPI.Add(projReplacer);
        }
        internal override void SetupAttributes()
        {
            var oldDef = Resources.Load <SkillDef>("skilldefs/loaderbody/ChargeZapFist");

            myDef = CloneSkillDef(oldDef);

            var nametoken = "ANCIENTSCEPTER_SCEPLOADER_CHARGEZAPFISTNAME";

            newDescToken = "ANCIENTSCEPTER_SCEPLOADER_CHARGEZAPFISTDESC";
            oldDescToken = oldDef.skillDescriptionToken;
            var namestr = "Thundercrash";

            LanguageAPI.Add(nametoken, namestr);

            myDef.skillName             = namestr;
            myDef.skillNameToken        = nametoken;
            myDef.skillDescriptionToken = newDescToken;
            myDef.icon = Assets.mainAssetBundle.LoadAsset <Sprite>("texLoaderU2");

            LoadoutAPI.AddSkillDef(myDef);

            projReplacer = Resources.Load <GameObject>("prefabs/projectiles/LoaderZapCone").InstantiateClone("CIScepLoaderThundercrash");
            var proxb = projReplacer.GetComponent <ProjectileProximityBeamController>();

            proxb.attackFireCount *= 3;
            proxb.maxAngleFilter   = 180f;
            projReplacer.transform.Find("Effect").localScale *= 3f;

            ProjectileAPI.Add(projReplacer);
        }
Esempio n. 4
0
        public override void SetupBehavior()
        {
            base.SetupBehavior();
            GameObject engiMinePrefab = Resources.Load <GameObject>("prefabs/projectiles/EngiMine");

            minePrefab = engiMinePrefab.InstantiateClone("PanicMine", true);
            Object.Destroy(minePrefab.GetComponent <ProjectileDeployToOwner>());

            GameObject engiMineGhostPrefab = Resources.Load <GameObject>("prefabs/projectileghosts/EngiMineGhost");

            mineGhostPrefab = engiMineGhostPrefab.InstantiateClone("PanicMineGhost", false);
            SkinnedMeshRenderer mesh = mineGhostPrefab.GetComponentInChildren <SkinnedMeshRenderer>();

            mesh.material.color = new Color32(255, 168, 0, 255);
            minePrefab.GetComponent <ProjectileController>().ghostPrefab = mineGhostPrefab;

            ProjectileAPI.Add(minePrefab);

            if (Compat_ItemStats.enabled)
            {
                Compat_ItemStats.CreateItemStatDef(itemDef,
                                                   (
                                                       (count, inv, master) => { return(baseDmg + (count - 1) * stackDmg); },
                                                       (value, inv, master) => { return($"Damage: {Pct(value, 1)}"); }
                                                   ),
                                                   (
                                                       (count, inv, master) => { return(count); },
                                                       (value, inv, master) => { return($"Mines: {value}"); }
                                                   ));
            }
        }
        public void CreateProjectiles()
        {
            //needs to be declared first
            GameObject sporeGrenadeDotZonePrefab = Resources.Load <GameObject>("prefabs/projectiles/SporeGrenadeProjectileDotZone");

            MolotovDotZonePrefab = sporeGrenadeDotZonePrefab.InstantiateClone("Bulletstorm_MolotovDotZone", true);
            MolotovDotZonePrefab.GetComponent <ProjectileDamage>().damageType = DamageType.IgniteOnHit;
            ProjectileDotZone projectileDotZone = MolotovDotZonePrefab.GetComponent <ProjectileDotZone>();

            projectileDotZone.damageCoefficient = PercentDamagePerTick;
            projectileDotZone.resetFrequency    = Mathf.Clamp(FrequencyOfTicks, 0f, 60f);
            projectileDotZone.lifetime          = DurationAoE;
            //projectileDotZone.impactEffect = GlassBreakEffect;

            GameObject sporeGrenadePrefab = Resources.Load <GameObject>("prefabs/projectiles/SporeGrenadeProjectile");

            MolotovPrefab = sporeGrenadePrefab.InstantiateClone("Bulletstorm_Molotov", true);
            MolotovPrefab.GetComponent <ProjectileDamage>().damageColorIndex = DamageColorIndex.Item;

            var PIE = MolotovPrefab.GetComponent <ProjectileImpactExplosion>();

            if (DurationAoE > 0)
            {
                PIE.childrenProjectilePrefab = MolotovDotZonePrefab;
            }
            else
            {
                Object.Destroy(PIE);
            }
            MolotovPrefab.GetComponent <ProjectileSimple>().desiredForwardSpeed = 35; //50

            ApplyTorqueOnStart applyTorque = MolotovPrefab.AddComponent <ApplyTorqueOnStart>();

            applyTorque.randomize   = true;
            applyTorque.localTorque = new Vector3(400f, 10f, 400f);

            GameObject model = MainAssets.LoadAsset <GameObject>(ProjectileModelPath);

            model.AddComponent <NetworkIdentity>();
            model.AddComponent <ProjectileGhostController>();
            model.transform.localScale = new Vector3(0.25f, 0.25f, 0.25f);

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

            controller.ghostPrefab = model;

            ProjectileAPI.Add(MolotovPrefab);
            ProjectileAPI.Add(MolotovDotZonePrefab);

            if (MolotovPrefab)
            {
                PrefabAPI.RegisterNetworkPrefab(MolotovPrefab);
            }
            if (MolotovDotZonePrefab)
            {
                PrefabAPI.RegisterNetworkPrefab(MolotovDotZonePrefab);
            }
        }
        /// <summary>
        /// Sets up the mortar projectile. Always invoke the method if one needs to borrow the mortar prefab.
        /// </summary>
        public static void SetupMortarProjectile()
        {
            if (mortarPrefab)
            {
                return;
            }
            GameObject paladinRocket = Resources.Load <GameObject>("prefabs/projectiles/PaladinRocket");

            mortarPrefab = paladinRocket.InstantiateClone("MortarProjectile", true);
            mortarPrefab.AddComponent <MortarGravity>();
            ProjectileAPI.Add(mortarPrefab);
        }
        public override void SetupBehavior()
        {
            base.SetupBehavior();
            GameObject engiMinePrefab = Resources.Load <GameObject>("prefabs/projectiles/EngiMine");

            minePrefab = engiMinePrefab.InstantiateClone("FootMine", true);
            Object.Destroy(minePrefab.GetComponent <ProjectileDeployToOwner>());

            GameObject engiMineGhostPrefab = Resources.Load <GameObject>("prefabs/projectileghosts/EngiMineGhost");

            mineGhostPrefab = engiMineGhostPrefab.InstantiateClone("FootMineGhost", false);
            SkinnedMeshRenderer mesh = mineGhostPrefab.GetComponentInChildren <SkinnedMeshRenderer>();

            mesh.material.color = Color.green;
            minePrefab.GetComponent <ProjectileController>().ghostPrefab = mineGhostPrefab;

            ProjectileAPI.Add(minePrefab);

            poisonBuff = ScriptableObject.CreateInstance <BuffDef>();
            //poisonBuff.buffColor = new Color32(1, 121, 91, 255);
            poisonBuff.isDebuff   = true;
            poisonBuff.canStack   = true;
            poisonBuff.name       = "CCIFootPoison";
            poisonBuff.iconSprite = assetBundle.LoadAsset <Sprite>("Assets/ClassicItems/icons/footmine_buff_icon.png");

            CustomBuff poisonCustomBuff = new CustomBuff(poisonBuff);

            BuffAPI.Add(poisonCustomBuff);

            DotController.DotDef poisonDotDef = new DotController.DotDef
            {
                interval          = 1,
                damageCoefficient = 1,
                damageColorIndex  = DamageColorIndex.Poison,
                associatedBuff    = poisonBuff
            };
            poisonDot = DotAPI.RegisterDotDef(poisonDotDef);

            if (Compat_ItemStats.enabled)
            {
                Compat_ItemStats.CreateItemStatDef(itemDef,
                                                   (
                                                       (count, inv, master) => { return(baseDmg + (count - 1) * stackDmg); },
                                                       (value, inv, master) => { return($"Poison Damage/Second: {Pct(value, 1)}"); }
                                                   ),
                                                   (
                                                       (count, inv, master) => { return(baseTicks + (count - 1) * stackTicks); },
                                                       (value, inv, master) => { return($"Duration: {value} seconds"); }
                                                   ));
            }
        }
Esempio n. 8
0
        public static void SetupMortarProjectile()
        {
            GameObject paladinRocket = Resources.Load <GameObject>("prefabs/projectiles/PaladinRocket");

            mortarPrefab = paladinRocket.InstantiateClone("MortarProjectile");
            mortarPrefab.AddComponent <MortarGravity>();
            var model = MainAssets.LoadAsset <GameObject>("MortarMissile.prefab");

            model.AddComponent <NetworkIdentity>();
            model.AddComponent <RoR2.Projectile.ProjectileGhostController>();
            var controller = mortarPrefab.GetComponent <RoR2.Projectile.ProjectileController>();

            controller.ghostPrefab = model;
            ProjectileAPI.Add(mortarPrefab);
        }
Esempio n. 9
0
        internal override void SetupAttributes()
        {
            var oldDef = Resources.Load <SkillDef>("skilldefs/huntressbody/HuntressBodyArrowRain");

            myDef = CloneSkillDef(oldDef);

            var nametoken = "ANCIENTSCEPTER_SCEPHUNTRESS_RAINNAME";

            newDescToken = "ANCIENTSCEPTER_SCEPHUNTRESS_RAINDESC";
            oldDescToken = oldDef.skillDescriptionToken;
            var namestr = "Burning Rain";

            LanguageAPI.Add(nametoken, namestr);

            myDef.skillName             = namestr;
            myDef.skillNameToken        = nametoken;
            myDef.skillDescriptionToken = newDescToken;
            myDef.icon = Resources.Load <Sprite>("@AncientScepter:Assets/AssetBundle/AncientScepter/Icons/Skills/texHuntressR1.png");

            LoadoutAPI.AddSkillDef(myDef);

            projReplacer = Resources.Load <GameObject>("prefabs/projectiles/HuntressArrowRain").InstantiateClone("CIScepHuntressRain");
            projReplacer.GetComponent <ProjectileDamage>().damageType |= DamageType.IgniteOnHit;
            projReplacer.GetComponent <ProjectileDotZone>().lifetime  *= 1.5f;
            projReplacer.transform.localScale = new Vector3(22.5f, 15f, 22.5f);
            var fx    = projReplacer.transform.Find("FX");
            var afall = fx.Find("ArrowsFalling");

            afall.GetComponent <ParticleSystemRenderer>().material.SetVector("_TintColor", new Vector4(3f, 0.1f, 0.04f, 1.5f));
            var aimp = fx.Find("ImpaledArrow");

            aimp.GetComponent <ParticleSystemRenderer>().material.SetVector("_TintColor", new Vector4(3f, 0.1f, 0.04f, 1.5f));
            var radInd = fx.Find("RadiusIndicator");

            radInd.GetComponent <MeshRenderer>().material.SetVector("_TintColor", new Vector4(3f, 0.1f, 0.04f, 1.25f));
            var flash = fx.Find("ImpactFlashes");
            var psm   = flash.GetComponent <ParticleSystem>().main;

            psm.startColor = new Color(1f, 0.7f, 0.4f);
            flash.GetComponent <ParticleSystemRenderer>().material.SetVector("_TintColor", new Vector4(3f, 0.1f, 0.04f, 1.5f));
            var flashlight = flash.Find("Point Light");

            flashlight.GetComponent <Light>().color = new Color(1f, 0.5f, 0.3f);
            flashlight.GetComponent <Light>().range = 15f;
            flashlight.gameObject.SetActive(true);

            ProjectileAPI.Add(projReplacer);
        }
Esempio n. 10
0
        private void SetupProjectile()
        {
            //CharacterBody component = this.owner.GetComponent<CharacterBody>();
            //if (component)
            //{

            //    RoR2.Projectile.ProjectileManager.instance.FireProjectile()
            //    Vector2 vector = UnityEngine.Random.insideUnitCircle * this.randomCircleRange;
            //    ProjectileManager.instance.FireProjectile(this.projectilePrefab, base.transform.position + new Vector3(vector.x, 0f, vector.y), Util.QuaternionSafeLookRotation(Vector3.up + new Vector3(vector.x, 0f, vector.y)), this.owner, component.damage * this.damageCoefficient, 200f, this.crit, DamageColorIndex.Item, null, -1f);
            //}
            AspectProjectile = PrefabAPI.InstantiateClone(
                Resources.Load <GameObject>("prefabs/projectiles/MissileProjectile"), "Aspect Projectile", true);

            // Add required components
            // May be redundant since I already copy from missile, but it doesn't hurt to configure it again
            // Who knows, maybe they remove some of the components in the future
            TryGetComponent <ProjectileTargetComponent>(AspectProjectile);

            var projectileDirectionalTargetFinder = TryGetComponent <ProjectileDirectionalTargetFinder>(AspectProjectile);

            projectileDirectionalTargetFinder.lookRange            = 250;
            projectileDirectionalTargetFinder.lookCone             = 160;
            projectileDirectionalTargetFinder.targetSearchInterval = 0.1f;
            projectileDirectionalTargetFinder.onlySearchIfNoTarget = true;
            projectileDirectionalTargetFinder.allowTargetLoss      = false;
            projectileDirectionalTargetFinder.testLoS   = false;
            projectileDirectionalTargetFinder.ignoreAir = false;
            projectileDirectionalTargetFinder.flierAltitudeTolerance = float.PositiveInfinity;

            var projectileHoming = TryGetComponent <ProjectileSteerTowardTarget>(AspectProjectile);

            projectileHoming.rotationSpeed = 90;
            projectileHoming.yAxisOnly     = false;

            var projectileSimple = TryGetComponent <ProjectileSimple>(AspectProjectile);

            //projectileSimple.enableVelocityOverLifetime = true;
            projectileSimple.updateAfterFiring   = true;
            projectileSimple.desiredForwardSpeed = 100;
            //projectileSimple.velocityOverLifetime = new AnimationCurve(new Keyframe[] { new Keyframe(0, 40), new Keyframe(2, 100) });
            projectileSimple.lifetime = 10;

            PrefabAPI.RegisterNetworkPrefab(AspectProjectile);
            ProjectileAPI.Add(AspectProjectile);
        }
        public override void SetupBehavior()
        {
            base.SetupBehavior();
            GameObject engiMinePrefab = Resources.Load <GameObject>("prefabs/projectiles/EngiMine");

            minePrefab = engiMinePrefab.InstantiateClone("InstantMine", true);
            Object.Destroy(minePrefab.GetComponent <ProjectileDeployToOwner>());

            GameObject engiMineGhostPrefab = Resources.Load <GameObject>("prefabs/projectileghosts/EngiMineGhost");

            mineGhostPrefab = engiMineGhostPrefab.InstantiateClone("InstantMineGhost", false);
            SkinnedMeshRenderer mesh = mineGhostPrefab.GetComponentInChildren <SkinnedMeshRenderer>();

            mesh.material.color = new Color32(111, 95, 52, 255);
            minePrefab.GetComponent <ProjectileController>().ghostPrefab = mineGhostPrefab;

            ProjectileAPI.Add(minePrefab);
        }
Esempio n. 12
0
        private static void SetupProjectiles()
        {
            projectileBombletsPrefab = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("prefabs/projectiles/CryoCanisterBombletsProjectile"), "ClusterBombletsArrow");
            ProjectileImpactExplosion projectileImpactExplosion1 = projectileBombletsPrefab.GetComponent <ProjectileImpactExplosion>();

            projectileImpactExplosion1.lifetime = 0.5f;
            projectileBombletsPrefab.GetComponent <ProjectileDamage>().damageType = DamageType.Generic;


            projectilePrefab = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("prefabs/projectiles/PaladinRocket"), "ClusterBombletsArrow");

            var projectileSimple = projectilePrefab.GetComponent <ProjectileSimple>();

            projectileSimple.desiredForwardSpeed = 150;

            var projectileImpactExplosion = projectilePrefab.GetComponent <ProjectileImpactExplosion>();

            projectileImpactExplosion.lifetime            = 8;
            projectileImpactExplosion.lifetimeAfterImpact = 0;
            //projectileImpactExplosion.blastRadius = 0;
            projectileImpactExplosion.blastDamageCoefficient    = clusterBombDamageCoefficient;
            projectileImpactExplosion.blastProcCoefficient      = 0;
            projectileImpactExplosion.blastAttackerFiltering    = AttackerFiltering.Default;
            projectileImpactExplosion.fireChildren              = true;
            projectileImpactExplosion.childrenProjectilePrefab  = projectileBombletsPrefab;
            projectileImpactExplosion.childrenCount             = clusterBombChildCount;
            projectileImpactExplosion.childrenDamageCoefficient = clusterBombChildDamageCoefficient;
            projectileImpactExplosion.minAngleOffset            = new Vector3(-2, -2, -2);
            projectileImpactExplosion.maxAngleOffset            = new Vector3(2, 2, 2);
            projectileImpactExplosion.useLocalSpaceForChildren  = false;


            if (projectileBombletsPrefab)
            {
                PrefabAPI.RegisterNetworkPrefab(projectileBombletsPrefab);
            }
            if (projectilePrefab)
            {
                PrefabAPI.RegisterNetworkPrefab(projectilePrefab);
            }

            ProjectileAPI.Add(projectileBombletsPrefab);
            ProjectileAPI.Add(projectilePrefab);
        }
        internal override void SetupAttributes()
        {
            var oldDef = Resources.Load <SkillDef>("skilldefs/magebody/MageBodyFlamethrower");

            myDef = CloneSkillDef(oldDef);

            var nametoken = "ANCIENTSCEPTER_SCEPMAGE_FLAMETHROWERNAME";

            newDescToken = "ANCIENTSCEPTER_SCEPMAGE_FLAMETHROWERDESC";
            oldDescToken = oldDef.skillDescriptionToken;
            var namestr = "Dragon's Breath";

            LanguageAPI.Add(nametoken, namestr);

            myDef.skillName             = namestr;
            myDef.skillNameToken        = nametoken;
            myDef.skillDescriptionToken = newDescToken;
            myDef.icon = Assets.mainAssetBundle.LoadAsset <Sprite>("texArtiR1");

            LoadoutAPI.AddSkillDef(myDef);

            projCloud = Resources.Load <GameObject>("prefabs/projectiles/BeetleQueenAcid").InstantiateClone("CIScepMageFlamethrowerCloud");
            var pdz = projCloud.GetComponent <ProjectileDotZone>();

            pdz.lifetime      = 10f;
            pdz.impactEffect  = null;
            pdz.fireFrequency = 2f;
            var fxObj = projCloud.transform.Find("FX");

            fxObj.Find("Spittle").gameObject.SetActive(false);
            fxObj.Find("Decal").gameObject.SetActive(false);
            fxObj.Find("Gas").gameObject.SetActive(false);
            foreach (var x in fxObj.GetComponents <AnimateShaderAlpha>())
            {
                x.enabled = false;
            }
            var fxcloud = UnityEngine.Object.Instantiate(Resources.Load <GameObject>("prefabs/FireTrail").GetComponent <DamageTrail>().segmentPrefab, fxObj.transform);
            var psmain  = fxcloud.GetComponent <ParticleSystem>().main;

            psmain.duration        = 10f;
            psmain.gravityModifier = -0.05f;
            var pstartx = psmain.startSizeX;

            pstartx.constantMin *= 0.75f;
            pstartx.constantMax *= 0.75f;
            var pstarty = psmain.startSizeY;

            pstarty.constantMin *= 0.75f;
            pstarty.constantMax *= 0.75f;
            var pstartz = psmain.startSizeZ;

            pstartz.constantMin *= 0.75f;
            pstartz.constantMax *= 0.75f;
            var pslife = psmain.startLifetime;

            pslife.constantMin = 0.75f;
            pslife.constantMax = 1.5f;
            fxcloud.GetComponent <DestroyOnTimer>().enabled = false;
            fxcloud.transform.localPosition = Vector3.zero;
            fxcloud.transform.localScale    = Vector3.one;
            var psshape = fxcloud.GetComponent <ParticleSystem>().shape;

            psshape.shapeType = ParticleSystemShapeType.Sphere;
            psshape.scale     = Vector3.one * 1.5f;
            var psemit = fxcloud.GetComponent <ParticleSystem>().emission;

            psemit.rateOverTime = AncientScepterItem.artiFlamePerformanceMode ? 4f : 20f;
            var lightObj = fxObj.Find("Point Light").gameObject;

            if (AncientScepterItem.artiFlamePerformanceMode)
            {
                UnityEngine.Object.Destroy(lightObj);
            }
            else
            {
                var lightCpt = lightObj.GetComponent <Light>();
                lightCpt.color     = new Color(1f, 0.5f, 0.2f);
                lightCpt.intensity = 3.5f;
                lightCpt.range     = 5f;
            }

            ProjectileAPI.Add(projCloud);
        }
Esempio n. 14
0
        private static void SetupProjectiles()
        {
            SetupAcidPool();
            SetupAcidPoolDrop();
            void SetupAcidPool()
            {
                acidPool = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("prefabs/projectiles/CrocoLeapAcid"), "CrocoSpeedAcid");
                acidPool.transform.localScale *= acidPoolScale;
                var buffWard = acidPool.AddComponent <BuffWard>();

                buffWard.buffDef         = RoR2Content.Buffs.CloakSpeed;
                buffWard.buffDuration    = CausticSludgeBuffDuration;
                buffWard.expires         = false;
                buffWard.floorWard       = true;
                buffWard.radius          = CausticSludgeActualScale;
                buffWard.requireGrounded = true;
                buffWard.interval       *= 0.5f;

                var enemyBuffWard = acidPool.AddComponent <BuffWard>();

                enemyBuffWard.buffDef          = RoR2Content.Buffs.Slow60;
                enemyBuffWard.buffDuration     = CausticSludgeBuffDuration;
                enemyBuffWard.expires          = false;
                enemyBuffWard.floorWard        = true;
                enemyBuffWard.radius           = CausticSludgeActualScale;
                enemyBuffWard.requireGrounded  = true;
                enemyBuffWard.invertTeamFilter = true;

                ProjectileDotZone projectileDotZone = acidPool.GetComponent <ProjectileDotZone>();

                projectileDotZone.damageCoefficient      = CausticSludgeDamageCoefficient;
                projectileDotZone.lifetime               = CausticSludgeLifetime;
                projectileDotZone.overlapProcCoefficient = 0f;

                PoisonSplatController poisonSplatController = acidPool.AddComponent <PoisonSplatController>();

                poisonSplatController.destroyOnTimer       = acidPool.GetComponent <DestroyOnTimer>();
                poisonSplatController.projectileDotZone    = projectileDotZone;
                poisonSplatController.projectileController = acidPool.GetComponent <ProjectileController>();

                ProjectileAPI.Add(acidPool);

                LeapDropAcid.groundedAcid = acidPool;
            }

            void SetupAcidPoolDrop()
            {
                Debug.Log("Setting up AcidPoolDrop");
                acidPoolDrop = PrefabAPI.InstantiateClone(Resources.Load <GameObject>("prefabs/projectiles/SporeGrenadeProjectile"), "CrocoSpeedAcidDrop");

                acidPoolDrop.GetComponent <ProjectileSimple>().desiredForwardSpeed = 0;

                var atos = acidPoolDrop.AddComponent <ApplyTorqueOnStart>();

                atos.localTorque = Vector3.down * 3f;
                atos.randomize   = false;

                var projectileImpactExplosion = acidPoolDrop.GetComponent <ProjectileImpactExplosion>();

                projectileImpactExplosion.blastDamageCoefficient   = 0f;
                projectileImpactExplosion.childrenProjectilePrefab = acidPool;
                projectileImpactExplosion.impactEffect             = null;
                projectileImpactExplosion.destroyOnEnemy           = false;

                acidPoolDrop.AddComponent <PoisonFallController>();

                ProjectileAPI.Add(acidPoolDrop);
            }

            LeapDropAcid.projectilePrefab = acidPoolDrop;
        }