Exemplo n.º 1
0
        // Token: 0x0600030A RID: 778 RVA: 0x0000C330 File Offset: 0x0000A530
        public override void OnEnter()
        {
            base.OnEnter();
            if (this.arcVisualizerPrefab)
            {
                this.arcVisualizerLineRenderer            = UnityEngine.Object.Instantiate <GameObject>(this.arcVisualizerPrefab, base.transform.position, Quaternion.identity).GetComponent <LineRenderer>();
                this.calculateArcPointsJob                = default(AimThrowableBase.CalculateArcPointsJob);
                this.completeArcPointsVisualizerJobMethod = new Action(this.CompleteArcVisualizerJob);
                RoR2Application.onLateUpdate             += this.completeArcPointsVisualizerJobMethod;
            }
            if (this.endpointVisualizerPrefab)
            {
                this.endpointVisualizerTransform = UnityEngine.Object.Instantiate <GameObject>(this.endpointVisualizerPrefab, base.transform.position, Quaternion.identity).transform;
            }
            if (base.characterBody)
            {
                base.characterBody.hideCrosshair = true;
            }
            this.projectileBaseSpeed = this.projectilePrefab.GetComponent <ProjectileSimple>().velocity;
            this.minimumDuration     = this.baseMinimumDuration / this.attackSpeedStat;
            ProjectileImpactExplosion component = this.projectilePrefab.GetComponent <ProjectileImpactExplosion>();

            if (component)
            {
                this.detonationRadius = component.blastRadius;
                if (this.endpointVisualizerTransform)
                {
                    this.endpointVisualizerTransform.localScale = new Vector3(this.detonationRadius, this.detonationRadius, this.detonationRadius);
                }
            }
            this.UpdateVisualizers();
            SceneCamera.onSceneCameraPreRender += this.OnPreRenderSceneCam;
        }
Exemplo n.º 2
0
        private static void CreateBigBoulder()
        {
            bigBoulderPrefab = CloneProjectilePrefab("CommandoGrenadeProjectile", "GurrenBigBoulderProjectile");
            var collider = bigBoulderPrefab.GetComponent <SphereCollider>();

            collider.radius = 4f;
            ProjectileImpactExplosion impactExplosion = bigBoulderPrefab.GetComponent <ProjectileImpactExplosion>();

            impactExplosion.blastDamageCoefficient    = 1f;
            impactExplosion.blastProcCoefficient      = 1f;
            impactExplosion.bonusBlastForce           = Vector3.up * 10f;
            impactExplosion.childrenCount             = 0;
            impactExplosion.childrenDamageCoefficient = 0f;
            impactExplosion.childrenProjectilePrefab  = null;
            impactExplosion.destroyOnWorld            = true;
            impactExplosion.destroyOnEnemy            = true;
            impactExplosion.falloffModel                  = RoR2.BlastAttack.FalloffModel.None;
            impactExplosion.fireChildren                  = false;
            impactExplosion.lifetimeRandomOffset          = 0f;
            impactExplosion.offsetForLifetimeExpiredSound = 0f;
            impactExplosion.GetComponent <ProjectileDamage>().damageType = DamageType.Stun1s;
            impactExplosion.blastRadius          = 40f;
            impactExplosion.lifetime             = 12f;
            impactExplosion.timerAfterImpact     = false;
            impactExplosion.impactEffect         = Modules.Assets.gurrenBrokenBoulderEffect;
            impactExplosion.explosionSoundString = "Play_golem_impact";
            ProjectileController projectileController = bigBoulderPrefab.GetComponent <ProjectileController>();

            projectileController.ghostPrefab = CreateGhostPrefab("BigBoulderPrefab");
            projectileController.startSound  = "";
            //anim params = isHoldingObject
            //states = GURREN_LiftingObject, GURREN_HoldingObject, GURREN_ThrowingObject
        }
Exemplo n.º 3
0
        private static void CreateVoidBlast()
        {
            voidBlastPrefab = CloneProjectilePrefab("CommandoGrenadeProjectile", "NemryVoidBlastProjectile");

            ProjectileImpactExplosion bombImpactExplosion = voidBlastPrefab.GetComponent <ProjectileImpactExplosion>();

            InitializeImpactExplosion(bombImpactExplosion);

            bombImpactExplosion.blastRadius    = 8f;
            bombImpactExplosion.destroyOnEnemy = true;
            bombImpactExplosion.lifetime       = 12f;
            bombImpactExplosion.impactEffect   = Resources.Load <GameObject>("Prefabs/Effects/NullifierExplosion");
            //bombImpactExplosion.lifetimeExpiredSound = Modules.Assets.CreateNetworkSoundEventDef("HenryBombExplosion");
            bombImpactExplosion.timerAfterImpact    = true;
            bombImpactExplosion.lifetimeAfterImpact = 0.1f;

            ProjectileDamage bombDamage = voidBlastPrefab.GetComponent <ProjectileDamage>();

            bombDamage.damageType = DamageType.Nullify;

            ProjectileController bombController = voidBlastPrefab.GetComponent <ProjectileController>();

            bombController.ghostPrefab = Resources.Load <GameObject>("Prefabs/ProjectileGhosts/NullifierPreBombGhost");
            bombController.startSound  = "";

            voidBlastPrefab.GetComponent <Rigidbody>().useGravity = false;
        }
Exemplo n.º 4
0
        private static void CreateYokoExplosiveRound()
        {
            explosiveRifleRoundPrefab = CloneProjectilePrefab("CommandoGrenadeProjectile", "YokoExplosiveRifleProjectile");
            ProjectileImpactExplosion impactExplosion = explosiveRifleRoundPrefab.GetComponent <ProjectileImpactExplosion>();

            impactExplosion.blastDamageCoefficient    = 1f;
            impactExplosion.blastProcCoefficient      = 1f;
            impactExplosion.bonusBlastForce           = Vector3.zero;
            impactExplosion.childrenCount             = 3;
            impactExplosion.childrenDamageCoefficient = 0.3f;
            impactExplosion.childrenProjectilePrefab  = explosiveRifleClustersPrefab;
            impactExplosion.destroyOnWorld            = true;
            impactExplosion.destroyOnEnemy            = true;
            impactExplosion.falloffModel                  = RoR2.BlastAttack.FalloffModel.Linear;
            impactExplosion.fireChildren                  = false;
            impactExplosion.lifetimeRandomOffset          = 0f;
            impactExplosion.offsetForLifetimeExpiredSound = 0f;
            impactExplosion.GetComponent <ProjectileDamage>().damageType = DamageType.Generic;
            impactExplosion.blastRadius         = 20f;
            impactExplosion.lifetime            = 12f;
            impactExplosion.impactEffect        = Modules.Assets.yokoRifleExplosiveRoundExplosion;
            impactExplosion.timerAfterImpact    = true;
            impactExplosion.lifetimeAfterImpact = 0.1f;
            ProjectileController projectileController = explosiveRifleRoundPrefab.GetComponent <ProjectileController>();

            projectileController.ghostPrefab = CreateGhostPrefab("YokoRifleExplosiveRound");
            projectileController.startSound  = "";
        }
Exemplo n.º 5
0
        //Adds tracking grenade to projectile register list
        internal static void RegisterDebuffNade()
        {
            //Start with base engi grenade cause it has a nice grenade shape
            debuffGrenadePrefab = LegacyResourcesAPI.Load <GameObject>("prefabs/projectiles/engigrenadeprojectile").InstantiateClone("DebuffGrenade", true);
            //As long as it actually exists we can do stuff with it
            if (debuffGrenadePrefab)
            {
                //We want ours to go a bit faster than the shitty nade that engi uses
                debuffGrenadePrefab.GetComponent <ProjectileSimple>().desiredForwardSpeed *= 1.5f;

                //We gotta take hold of the impact explosion component
                ProjectileImpactExplosion debuffGrenadeExplosion = debuffGrenadePrefab.GetComponent <ProjectileImpactExplosion>();
                //We want ours to explode on impact instead of bouncing around
                debuffGrenadeExplosion.destroyOnWorld = true;
                //We want hella more radius
                debuffGrenadeExplosion.blastRadius = Configuration.GetConfigValue <float>(Configuration.CaptainDebuffnadeRadius);
                //Linear falloff, idk what it normally is but this way we know for sure its linear
                debuffGrenadeExplosion.falloffModel = BlastAttack.FalloffModel.Linear;
                //Implement our own proc coefficient-to-damage-type stuff
                debuffGrenadeExplosion.blastProcCoefficient = BuffsLoading.ProcToDamageTypeEncoder(BuffsLoading.trackingOnHit.procIndex, 1f);
                //Change the explosion fx to something cooler as well
                debuffGrenadeExplosion.impactEffect = LegacyResourcesAPI.Load <GameObject>("prefabs/effects/omnieffect/OmniExplosionVFXScavCannonImpactExplosion");

                //Nab the damage component of it
                ProjectileDamage debuffGrenadeDamage = debuffGrenadePrefab.GetComponent <ProjectileDamage>();
                //This lets us use our own special damage type, it converts back to generic when being read off
                debuffGrenadeDamage.damageType = DamageType.NonLethal;

                //Add the projectile to the list
                projList.Add(debuffGrenadePrefab);
            }
        }
Exemplo n.º 6
0
        private static void CreateBazookaRocket()
        {
            bazookaRocketPrefab = CloneProjectilePrefab("CommandoGrenadeProjectile", "HenryBazookaRocketProjectile");
            bazookaRocketPrefab.AddComponent <Modules.Components.BazookaRotation>();
            bazookaRocketPrefab.transform.localScale *= 2f;

            ProjectileImpactExplosion bazookaImpactExplosion = bazookaRocketPrefab.GetComponent <ProjectileImpactExplosion>();

            InitializeImpactExplosion(bazookaImpactExplosion);

            bazookaImpactExplosion.blastRadius    = 8f;
            bazookaImpactExplosion.destroyOnEnemy = true;
            bazookaImpactExplosion.lifetime       = 12f;
            bazookaImpactExplosion.impactEffect   = Modules.Assets.bazookaExplosionEffect;
            //bazookaImpactExplosion.lifetimeExpiredSound = Modules.Assets.CreateNetworkSoundEventDef("HenryBazookaExplosion");
            bazookaImpactExplosion.timerAfterImpact    = true;
            bazookaImpactExplosion.lifetimeAfterImpact = 0f;

            ProjectileController bazookaController = bazookaRocketPrefab.GetComponent <ProjectileController>();

            GameObject bazookaGhost = CreateGhostPrefab("HenryBazookaRocketGhost");

            bazookaGhost.GetComponentInChildren <ParticleSystem>().gameObject.AddComponent <Modules.Components.DetachOnDestroy>();

            bazookaController.ghostPrefab = bazookaGhost;
            bazookaController.startSound  = "";
        }
Exemplo n.º 7
0
        private static void Createprojectile()
        {
            ProjectileImpactExplosion projectileImpactExplosion = projectile.GetComponent <ProjectileImpactExplosion>();
            ProjectileDotZone         projectileDotZone         = dotZone.GetComponent <ProjectileDotZone>();

            projectileImpactExplosion.offsetForLifetimeExpiredSound = 0;
            projectileImpactExplosion.destroyOnWorld            = true;
            projectileImpactExplosion.timerAfterImpact          = true;
            projectileImpactExplosion.falloffModel              = BlastAttack.FalloffModel.None;
            projectileImpactExplosion.lifetime                  = 10;
            projectileImpactExplosion.lifetimeAfterImpact       = 0;
            projectileImpactExplosion.lifetimeRandomOffset      = 0;
            projectileImpactExplosion.blastRadius               = 10;
            projectileImpactExplosion.blastDamageCoefficient    = 6;
            projectileImpactExplosion.blastProcCoefficient      = 2;
            projectileImpactExplosion.blastAttackerFiltering    = default;
            projectileImpactExplosion.bonusBlastForce           = new Vector3(0.0f, 600.0f, 0.0f);
            projectileImpactExplosion.fireChildren              = true;
            projectileImpactExplosion.childrenProjectilePrefab  = dotZone;
            projectileImpactExplosion.childrenCount             = 1;
            projectileImpactExplosion.childrenDamageCoefficient = 1;

            projectileDotZone.overlapProcCoefficient = 0.5F;
            projectileDotZone.fireFrequency          = 15;
            projectileDotZone.resetFrequency         = 60;
            projectileDotZone.lifetime = 14;

            dotZone.transform.localScale = dotZone.transform.localScale * 3;
        }
Exemplo n.º 8
0
        private void EditNovaBomb()
        {
            GameObject novaProj = Resources.Load <GameObject>("Prefabs/Projectiles/MageLightningBombProjectile");

            ProjectileSimple novaSimp = novaProj.GetComponent <ProjectileSimple>();

            novaSimp.velocity *= 1.25f;

            Rigidbody rb = novaProj.GetComponent <Rigidbody>();

            rb.useGravity = true;
            rb.drag       = 1f;
            novaProj.GetComponent <Rigidbody>().useGravity = true;

            ProjectileImpactExplosion novaImpact = novaProj.GetComponent <ProjectileImpactExplosion>();

            novaImpact.blastDamageCoefficient = 1.0f;
            novaImpact.falloffModel           = RoR2.BlastAttack.FalloffModel.None;
            novaImpact.blastRadius            = 15f;

            ProjectileProximityBeamController novaBeams = novaProj.GetComponent <ProjectileProximityBeamController>();

            novaBeams.attackRange    *= 1.25f;
            novaBeams.attackInterval *= 0.9f;
            novaBeams.bounces        += 1;
        }
Exemplo n.º 9
0
        private void BuildFlareProjectile()
        {
            GameObject flareProjectile = Resources.Load <GameObject>("prefabs/projectiles/magefireboltbasic").InstantiateClone("SS2PyroFlare", true);

            ProjectileCatalog.getAdditionalEntries += delegate(List <GameObject> list)
            {
                list.Add(flareProjectile);
            };

            ProjectileSimple ps = flareProjectile.GetComponent <ProjectileSimple>();

            ps.lifetime = 18f;

            ProjectileImpactExplosion pie = flareProjectile.GetComponent <ProjectileImpactExplosion>();

            pie.blastRadius            = 8f;
            pie.blastDamageCoefficient = 1f;
            pie.blastProcCoefficient   = 1f;
            pie.timerAfterImpact       = false;
            pie.falloffModel           = BlastAttack.FalloffModel.None;
            pie.lifetime       = 18f;
            pie.destroyOnEnemy = true;
            pie.destroyOnWorld = true;

            ProjectileDamage pd = flareProjectile.GetComponent <ProjectileDamage>();

            pd.damage                       = 0f;
            pd.damageColorIndex             = DamageColorIndex.Default;
            pd.damageType                   = DamageType.IgniteOnHit;
            Flaregun.projectilePrefab       = flareProjectile;
            FireFlareBurst.projectilePrefab = flareProjectile;  //unused skill

            GameObject reflectProjectile = Resources.Load <GameObject>("prefabs/projectiles/magefireboltbasic").InstantiateClone("SS2PyroFlareReflect", true);

            ProjectileCatalog.getAdditionalEntries += delegate(List <GameObject> list)
            {
                list.Add(reflectProjectile);
            };
            ProjectileImpactExplosion pie2 = reflectProjectile.GetComponent <ProjectileImpactExplosion>();

            pie2.blastRadius            = 8f;
            pie2.blastDamageCoefficient = 1f;
            pie2.blastProcCoefficient   = 1f;
            pie2.timerAfterImpact       = false;
            pie2.falloffModel           = BlastAttack.FalloffModel.None;
            pie2.lifetime       = 18f;
            pie2.destroyOnEnemy = true;
            pie2.destroyOnWorld = true;

            ProjectileDamage pd2 = reflectProjectile.GetComponent <ProjectileDamage>();

            pd2.damage           = 0f;
            pd2.damageColorIndex = DamageColorIndex.Default;
            pd2.damageType       = DamageType.IgniteOnHit;

            HeatWave.reflectProjectilePrefab = reflectProjectile;
        }
Exemplo n.º 10
0
        public static void UpdateYokoExposionScale(float scale)
        {
            var explosionEffect = Modules.Assets.yokoRifleExplosiveRoundExplosion;

            explosionEffect.transform.localScale = Vector3.one * (5f * scale);
            ProjectileImpactExplosion impactExplosion = explosiveRifleRoundPrefab.GetComponent <ProjectileImpactExplosion>();

            impactExplosion.blastRadius = (20f * scale);
        }
Exemplo n.º 11
0
        //Adds nano beacon to the projectile register list
        internal static void RegisterNanoBeacon()
        {
            //Nab the projectile that's usually used for MUL-T scrap launcher
            nanoBeaconPrefab = LegacyResourcesAPI.Load <GameObject>("prefabs/projectiles/toolbotgrenadelauncherprojectile").InstantiateClone("NanoBeacon", true);
            //Ofc check if it actually exists
            if (nanoBeaconPrefab)
            {
                //Make it move at our own speed of choice
                nanoBeaconPrefab.GetComponent <ProjectileSimple>().desiredForwardSpeed = 140f;

                //Make it so it won't kersplode itself on impact
                ProjectileSingleTargetImpact nanoBeaconSingle = nanoBeaconPrefab.AddComponent <ProjectileSingleTargetImpact>();
                nanoBeaconSingle.destroyWhenNotAlive = false;
                nanoBeaconSingle.destroyOnWorld      = false;

                //This timed buff only applies on direct hit with nano beacon
                ProjectileInflictTimedBuff nanoDebuff = nanoBeaconPrefab.AddComponent <ProjectileInflictTimedBuff>();
                nanoDebuff.buffDef = BuffsLoading.buffDefTracking;
                //Tracking lasts for 5 seconds from this
                nanoDebuff.duration = 5f;

                //We do in fact want it to stick on impact
                ProjectileStickOnImpact nanoBeaconStick = nanoBeaconPrefab.AddComponent <ProjectileStickOnImpact>();
                //This makes it so it doesn't pass through anything
                nanoBeaconStick.ignoreCharacters = false;
                nanoBeaconStick.ignoreWorld      = false;
                //If we enable this the beacon sticks at gross angles, it feels more natural this way
                nanoBeaconStick.alignNormals = false;

                //This handles the 'explosion' of the beacon, we are changing it a lot
                ProjectileImpactExplosion nanoBeaconExplosion = nanoBeaconPrefab.GetComponent <ProjectileImpactExplosion>();
                //No more self-destruction
                nanoBeaconExplosion.destroyOnEnemy = false;
                nanoBeaconExplosion.destroyOnWorld = false;
                //No more blast radius
                nanoBeaconExplosion.blastRadius = 0f;
                //Live 'forever' or until our code says we want it to vanish
                nanoBeaconExplosion.lifetime = 100f;
                //Which is here, it should die 3.5 seconds after impact
                nanoBeaconExplosion.lifetimeAfterImpact = 3.5f;
                //No damage for the blast
                nanoBeaconExplosion.blastDamageCoefficient = 0f;
                //No blast force
                nanoBeaconExplosion.bonusBlastForce = Vector3.zero;
                //Basically no blast, so no falloffmodel either
                nanoBeaconExplosion.falloffModel = BlastAttack.FalloffModel.None;

                //This is our component that 'talks' to the MUL-T player's swarm component
                nanoBeaconPrefab.AddComponent <OnStuckCaller>();

                //Add it to the list
                projList.Add(nanoBeaconPrefab);
            }
        }
Exemplo n.º 12
0
 private static void CheckAndApplySkin(EffectData data, ProjectileImpactExplosion explosion)
 {
     if (explosion.explosionSoundString == Main.skinnedProjExplosionString)
     {
         var ownerBody = getController(explosion)?.owner?.GetComponent <CharacterBody>();
         if (ownerBody != null)
         {
             data.genericUInt = ownerBody.skinIndex;
         }
     }
 }
Exemplo n.º 13
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);
        }
Exemplo n.º 14
0
        private static GameObject CreateLightningWaveExplosion(float blastRadius, float blastDelay)
        {
            GameObject lightningExplosionPrefab = CloneProjectilePrefab("StickyBomb", "ManipulatorLightningExplosion");

            ProjectileImpactExplosion lightningExplosionImpact     = lightningExplosionPrefab.GetComponent <ProjectileImpactExplosion>();
            ProjectileController      lightningExplosionController = lightningExplosionPrefab.GetComponent <ProjectileController>();

            lightningExplosionController.ghostPrefab = CreateGhostPrefab("ManipulatorInvisibleSticky");
            lightningExplosionImpact.impactEffect    = Resources.Load <GameObject>("Prefabs/Effects/LightningStakeNova");
            lightningExplosionImpact.impactEffect.transform.localScale = new Vector3(1.4f, 1.4f, 1.4f);
            lightningExplosionImpact.lifetime               = blastDelay;
            lightningExplosionImpact.lifetimeAfterImpact    = StatValues.lightningBlastAfterLifetime;
            lightningExplosionImpact.blastRadius            = blastRadius;
            lightningExplosionImpact.blastDamageCoefficient = StatValues.lightningBlastCoefficient;
            lightningExplosionImpact.blastProcCoefficient   = 0f;
            lightningExplosionImpact.falloffModel           = BlastAttack.FalloffModel.None;

            UnityEngine.Object.Destroy(lightningExplosionPrefab.GetComponent <LoopSound>());
            return(lightningExplosionPrefab);
        }
Exemplo n.º 15
0
        private static void CreateBomb()
        {
            bombPrefab = CloneProjectilePrefab("CommandoGrenadeProjectile", "HenryBombProjectile");

            ProjectileImpactExplosion bombImpactExplosion = bombPrefab.GetComponent <ProjectileImpactExplosion>();

            InitializeImpactExplosion(bombImpactExplosion);

            bombImpactExplosion.blastRadius          = 16f;
            bombImpactExplosion.destroyOnEnemy       = true;
            bombImpactExplosion.lifetime             = 12f;
            bombImpactExplosion.impactEffect         = Modules.Assets.bombExplosionEffect;
            bombImpactExplosion.explosionSoundString = "HenryBombExplosion";
            bombImpactExplosion.timerAfterImpact     = true;
            bombImpactExplosion.lifetimeAfterImpact  = 0.1f;

            ProjectileController bombController = bombPrefab.GetComponent <ProjectileController>();

            bombController.ghostPrefab = CreateGhostPrefab("HenryBombGhost");
            bombController.startSound  = "";
        }
Exemplo n.º 16
0
        public override void SetupBehavior()
        {
            base.SetupBehavior();
            GameObject sporeGrenadeDotZonePrefab = Resources.Load <GameObject>("prefabs/projectiles/SporeGrenadeProjectileDotZone");

            WaterPoolPrefab = sporeGrenadeDotZonePrefab.InstantiateClone("Bulletstorm_WaterPool");

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

            projectileDotZone.attackerFiltering = AttackerFiltering.Default;
            projectileDotZone.lifetime          = CoolantLeak_Duration;

            ProjectileDamage projectileDamage = WaterPoolPrefab.GetComponent <ProjectileDamage>();

            projectileDamage.damageType = DamageType.Shock5s;
            projectileDamage.enabled    = false;

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

            WaterPoolPlacerPrefab = sporeGrenadePrefab.InstantiateClone("Bulletstorm_WaterPoolPlacer");
            WaterPoolPlacerPrefab.GetComponent <ProjectileDamage>().damageColorIndex = DamageColorIndex.Item;
            ProjectileImpactExplosion projectileImpactExplosion = WaterPoolPlacerPrefab.GetComponent <ProjectileImpactExplosion>();

            projectileImpactExplosion.impactEffect             = null;
            projectileImpactExplosion.childrenProjectilePrefab = WaterPoolPrefab;

            ProjectileCatalog.getAdditionalEntries += list => list.Add(WaterPoolPlacerPrefab);
            ProjectileCatalog.getAdditionalEntries += list => list.Add(WaterPoolPrefab);

            if (WaterPoolPlacerPrefab)
            {
                PrefabAPI.RegisterNetworkPrefab(WaterPoolPlacerPrefab);
            }
            if (WaterPoolPrefab)
            {
                PrefabAPI.RegisterNetworkPrefab(WaterPoolPrefab);
            }
        }
        // Base Stuff //
        private static void InitializeImpactExplosion(ProjectileImpactExplosion projectileImpactExplosion)
        {
            projectileImpactExplosion.blastDamageCoefficient    = 1f;
            projectileImpactExplosion.blastProcCoefficient      = 1f;
            projectileImpactExplosion.blastRadius               = 1f;
            projectileImpactExplosion.bonusBlastForce           = Vector3.zero;
            projectileImpactExplosion.childrenCount             = 0;
            projectileImpactExplosion.childrenDamageCoefficient = 0f;
            projectileImpactExplosion.childrenProjectilePrefab  = null;
            projectileImpactExplosion.destroyOnEnemy            = false;
            projectileImpactExplosion.destroyOnWorld            = false;
            //projectileImpactExplosion.explosionSoundString = "";
            projectileImpactExplosion.falloffModel        = RoR2.BlastAttack.FalloffModel.None;
            projectileImpactExplosion.fireChildren        = false;
            projectileImpactExplosion.impactEffect        = null;
            projectileImpactExplosion.lifetime            = 0f;
            projectileImpactExplosion.lifetimeAfterImpact = 0f;
            //projectileImpactExplosion.lifetimeExpiredSoundString = "";
            projectileImpactExplosion.lifetimeRandomOffset          = 0f;
            projectileImpactExplosion.offsetForLifetimeExpiredSound = 0f;
            projectileImpactExplosion.timerAfterImpact = false;

            projectileImpactExplosion.GetComponent <ProjectileDamage>().damageType = DamageType.Generic;
        }
Exemplo n.º 18
0
        //Adds cluster bomblets to projectile register list
        internal static void RegisterArrowBomblet()
        {
            //As usual grab the prefab we want to base it off of
            bombletPrefab = LegacyResourcesAPI.Load <GameObject>("prefabs/projectiles/engigrenadeprojectile").InstantiateClone("ClusterBomblets", true);
            //If it exists
            if (bombletPrefab)
            {
                //We want ours to actually be a quarter the speed of the actual engi bomblets
                bombletPrefab.GetComponent <ProjectileSimple>().desiredForwardSpeed /= 4;
                //This helps them not collide with things except the world
                bombletPrefab.gameObject.layer = 13;

                //Grab the explodey component
                ProjectileImpactExplosion bombletExplosion = bombletPrefab.GetComponent <ProjectileImpactExplosion>();
                //Higher blast radius
                bombletExplosion.blastRadius = 8;
                //Falloffmodel makes these feel bad so it's same damage regardless of the (small) distance
                bombletExplosion.falloffModel = BlastAttack.FalloffModel.None;
                //Reduce the proc coeff a bit for the sake of not making it busted
                bombletExplosion.blastProcCoefficient = 0.6f;
                //Make it a cooler kersplodey fx
                bombletExplosion.impactEffect = LegacyResourcesAPI.Load <GameObject>("prefabs/effects/omnieffect/OmniExplosionVFXCommandoGrenade");
                //We want it to blow up on world only, if it's on enemy it just instantly all explodes which is no fun
                bombletExplosion.destroyOnWorld = true;
                bombletExplosion.destroyOnEnemy = false;
                //The projectiles 'live' a long time after impact, but not actually
                bombletExplosion.lifetimeAfterImpact = 100f;
                //Explode themselves after 0.8 seconds
                bombletExplosion.lifetime = 0.8f;
                //Give or take one second
                bombletExplosion.lifetimeRandomOffset = 1f;

                //Add the projectile to the list
                projList.Add(bombletPrefab);
            }
        }
Exemplo n.º 19
0
        private static void CreateBomb()
        {
            bombPrefab = CloneProjectilePrefab("CommandoGrenadeProjectile", "HenryBombProjectile");

            ProjectileImpactExplosion bombImpactExplosion = bombPrefab.GetComponent <ProjectileImpactExplosion>();

            InitializeImpactExplosion(bombImpactExplosion);

            bombImpactExplosion.blastRadius    = 16f;
            bombImpactExplosion.destroyOnEnemy = true;
            bombImpactExplosion.lifetime       = 12f;
            bombImpactExplosion.impactEffect   = Modules.Assets.bombExplosionEffect;
            //bombImpactExplosion.lifetimeExpiredSound = Modules.Assets.CreateNetworkSoundEventDef("HenryBombExplosion");
            bombImpactExplosion.timerAfterImpact    = true;
            bombImpactExplosion.lifetimeAfterImpact = 0.1f;

            ProjectileController bombController = bombPrefab.GetComponent <ProjectileController>();

            if (Modules.Assets.mainAssetBundle.LoadAsset <GameObject>("HenryBombGhost") != null)
            {
                bombController.ghostPrefab = CreateGhostPrefab("HenryBombGhost");
            }
            bombController.startSound = "";
        }
Exemplo n.º 20
0
        public static void AddHook()
        {
            On.RoR2.HealthComponent.TakeDamage += (orig, self, damageInfo) =>
            {
                bool  aliveBeforeHit       = self.alive;
                bool  resetCooldownsOnKill = false;
                bool  isDynamiteBundle     = false;
                bool  isBarrage            = false;
                float resetDuration        = 0f;

                GracePeriodComponent graceComponent = self.gameObject.GetComponent <GracePeriodComponent>();
                if (!graceComponent)
                {
                    graceComponent = self.gameObject.AddComponent <GracePeriodComponent>();
                }
                bool banditAttacker         = false;
                AssignDynamiteTeamFilter ad = self.gameObject.GetComponent <AssignDynamiteTeamFilter>();
                if (ad)
                {
                    isDynamiteBundle = true;
                }


                CharacterBody attackerCB = null;
                if (damageInfo.attacker)
                {
                    attackerCB = damageInfo.attacker.GetComponent <CharacterBody>();
                    if (attackerCB)
                    {
                        banditAttacker = attackerCB.baseNameToken == "BANDITRELOADED_BODY_NAME";
                    }
                }

                if (banditAttacker && graceComponent)
                {
                    if ((damageInfo.damageType & DamageType.ResetCooldownsOnKill) > 0)
                    {
                        resetCooldownsOnKill = true;
                        if ((damageInfo.damageType & DamageType.SlowOnHit) > 0)
                        {
                            damageInfo.damageType &= ~DamageType.SlowOnHit;
                            isBarrage              = true;
                        }

                        int           debuffCount = 0;
                        DotController d           = DotController.FindDotController(self.gameObject);

                        foreach (BuffIndex buffType in BuffCatalog.debuffBuffIndices)
                        {
                            if (self.body.HasBuff(buffType))
                            {
                                if (buffType != ModContentPack.skullBuff.buffIndex)
                                {
                                    debuffCount++;
                                }
                                else
                                {
                                    debuffCount += self.body.GetBuffCount(buffType);
                                }
                            }
                        }
                        DotController dotController = DotController.FindDotController(self.gameObject);
                        if (dotController)
                        {
                            for (DotController.DotIndex dotIndex = DotController.DotIndex.Bleed; dotIndex < DotController.DotIndex.Count; dotIndex++)
                            {
                                if (dotController.HasDotActive(dotIndex))
                                {
                                    debuffCount++;
                                }
                            }
                        }

                        if (isBarrage && self.body.HasBuff(ModContentPack.lightsOutBuff))
                        {
                            debuffCount--;
                        }

                        float buffDamage     = 0f;
                        float buffBaseDamage = damageInfo.damage * specialDebuffBonus;
                        buffDamage         = buffBaseDamage * debuffCount;
                        damageInfo.damage += buffDamage;

                        bool lightWeight = false;
                        if (self.body)
                        {
                            Rigidbody rb = self.body.rigidbody;
                            if (rb)
                            {
                                if (rb.mass < 50f)
                                {
                                    lightWeight = true;
                                }
                            }
                        }

                        resetDuration = 3.6f;
                        if (!lightWeight)
                        {
                            resetDuration = GracePeriodComponent.graceDuration;
                        }
                    }

                    if (self.alive && (damageInfo.damageType & DamageType.ResetCooldownsOnKill) == 0 && graceComponent.HasReset(attackerCB))
                    {
                        damageInfo.damageType |= DamageType.ResetCooldownsOnKill;
                    }
                }

                if (isDynamiteBundle)
                {
                    if (!ad.fired && banditAttacker && (damageInfo.damageType & DamageType.AOE) == 0 && damageInfo.procCoefficient > 0f)
                    {
                        ad.fired                   = true;
                        damageInfo.crit            = true;
                        damageInfo.procCoefficient = 0f;
                        ProjectileImpactExplosion pie = self.gameObject.GetComponent <ProjectileImpactExplosion>();
                        if (pie)
                        {
                            pie.blastRadius *= 2f;
                        }

                        ProjectileDamage pd = self.gameObject.GetComponent <ProjectileDamage>();
                        if (pd)
                        {
                            if (resetCooldownsOnKill)
                            {
                                pd.damage *= 2f;

                                BanditNetworkCommands bnc = damageInfo.attacker.GetComponent <BanditNetworkCommands>();
                                if (bnc)
                                {
                                    bnc.RpcResetSpecialCooldown();
                                }
                            }
                            else
                            {
                                pd.damage *= 1.5f;
                            }
                        }
                    }
                    else
                    {
                        damageInfo.rejected = true;
                    }
                }

                orig(self, damageInfo);

                if (!self.alive && graceComponent)
                {
                    if (aliveBeforeHit && self.globalDeathEventChanceCoefficient > 0f && self.body && self.body.master)
                    {
                        graceComponent.TriggerEffects(attackerCB);
                    }
                }
                else if (!damageInfo.rejected && self.alive)
                {
                    if (banditAttacker)
                    {
                        if (resetCooldownsOnKill)
                        {
                            if (isBarrage)
                            {
                                self.body.AddTimedBuff(ModContentPack.skullBuff, 3f);
                            }
                            self.body.AddTimedBuff(ModContentPack.lightsOutBuff, resetDuration);

                            if (graceComponent && resetDuration > 0f)
                            {
                                graceComponent.AddTimer(attackerCB, damageInfo.damageType, resetDuration);
                            }
                        }
                    }

                    if (self.body.HasBuff(ModContentPack.lightsOutBuff) && specialExecuteThreshold > 0f)
                    {
                        if (((self.body.bodyFlags & CharacterBody.BodyFlags.ImmuneToExecutes) == 0 && !self.body.isChampion) || specialExecuteBosses)
                        {
                            float executeThreshold = specialExecuteThreshold;
                            float executeToAdd     = 0f;
                            if (self.body.isElite)
                            {
                                executeToAdd = damageInfo.inflictor.GetComponent <CharacterBody>().executeEliteHealthFraction;
                            }
                            if (self.isInFrozenState && executeToAdd < 0.3f)
                            {
                                executeToAdd = 0.3f;
                            }
                            executeThreshold += executeToAdd;

                            if (self.alive && (self.combinedHealthFraction < executeThreshold))
                            {
                                damageInfo.damage           = self.combinedHealth / 2f + 1f;
                                damageInfo.damageType       = (DamageType.ResetCooldownsOnKill | DamageType.BypassArmor);
                                damageInfo.procCoefficient  = 0f;
                                damageInfo.crit             = true;
                                damageInfo.damageColorIndex = DamageColorIndex.WeakPoint;
                                orig(self, damageInfo);
                            }
                        }
                    }
                }
            };
        }
Exemplo n.º 21
0
        private void CreateLightningSword(Int32 meshInd)
        {
            GameObject ghost = this.CreateLightningSwordGhost(meshInd);
            GameObject proj  = Resources.Load <GameObject>("Prefabs/Projectiles/LunarNeedleProjectile").InstantiateClone("LightningSwordProjectile" + meshInd.ToString());

            ProjectileCatalog.getAdditionalEntries += (list) => list.Add(proj);

            AltArtiPassive.lightningProjectile[meshInd] = proj;

            ProjectileController projController = proj.GetComponent <ProjectileController>();

            projController.ghostPrefab     = ghost;
            projController.procCoefficient = 0.2f;

            ProjectileSimple projSimple = proj.GetComponent <ProjectileSimple>();

            projSimple.enabled = true;
            projSimple.enableVelocityOverLifetime = false;
            projSimple.velocity = 60f;


            ProjectileDirectionalTargetFinder projTargetFind = proj.GetComponent <ProjectileDirectionalTargetFinder>();

            projTargetFind.enabled = false;

            ProjectileSteerTowardTarget projSteering = proj.GetComponent <ProjectileSteerTowardTarget>();

            projSteering.enabled       = true;
            projSteering.rotationSpeed = 140f;

            ProjectileStickOnImpact projStick = proj.GetComponent <ProjectileStickOnImpact>();

            //projStick.ignoreCharacters = false;
            //projStick.ignoreWorld = false;
            projStick.alignNormals = false;

            ProjectileImpactExplosion projExpl = proj.GetComponent <ProjectileImpactExplosion>();

            projExpl.impactEffect                  = Resources.Load <GameObject>("Prefabs/Effects/LightningStakeNova");
            projExpl.explosionSoundString          = "Play_item_lunar_primaryReplace_impact";
            projExpl.lifetimeExpiredSoundString    = "";
            projExpl.offsetForLifetimeExpiredSound = 0f;
            projExpl.destroyOnEnemy                = false;
            projExpl.destroyOnWorld                = false;
            projExpl.timerAfterImpact              = true;
            projExpl.falloffModel                  = BlastAttack.FalloffModel.None;
            projExpl.lifetime                  = 10f;
            projExpl.lifetimeAfterImpact       = 1f;
            projExpl.lifetimeRandomOffset      = 0f;
            projExpl.blastRadius               = 1f;
            projExpl.blastDamageCoefficient    = 1f;
            projExpl.blastProcCoefficient      = 0.2f;
            projExpl.bonusBlastForce           = Vector3.zero;
            projExpl.fireChildren              = false;
            projExpl.childrenProjectilePrefab  = null;
            projExpl.childrenCount             = 0;
            projExpl.childrenDamageCoefficient = 0f;
            projExpl.minAngleOffset            = Vector3.zero;
            projExpl.maxAngleOffset            = Vector3.zero;
            projExpl.transformSpace            = ProjectileImpactExplosion.TransformSpace.World;
            projExpl.projectileHealthComponent = null;

            ProjectileSingleTargetImpact projStimp = proj.GetComponent <ProjectileSingleTargetImpact>();

            projStimp.destroyOnWorld      = false;
            projStimp.hitSoundString      = "Play_item_proc_dagger_impact";
            projStimp.enemyHitSoundString = "Play_item_proc_dagger_impact";


            proj.AddComponent <Components.SoundOnAwake>().sound = "Play_item_proc_dagger_spawn";

            //UnityEngine.Object.DestroyImmediate( proj.GetComponent<ProjectileSingleTargetImpact>() );
            UnityEngine.Object.Destroy(proj.GetComponent <AwakeEvent>());
            UnityEngine.Object.Destroy(proj.GetComponent <DelayedEvent>());
        }
Exemplo n.º 22
0
        public static void UpdateYokoExplosionCluster(bool isCluster)
        {
            ProjectileImpactExplosion impactExplosion = explosiveRifleRoundPrefab.GetComponent <ProjectileImpactExplosion>();

            impactExplosion.fireChildren = isCluster;
        }