Пример #1
0
        //This part handles the attaching of a new motion modual after the projectile has landed on the enemy but the start event can be altered
        //This is the important bit!!!!!!!!!!
        //please dont use orbit group 100 it may cause issues with clashing idk  : )
        public void OnHitEnemy(Projectile proj, SpeculativeRigidbody body, bool yes)
        {
            BounceProjModifier bouncer = proj.gameObject.GetOrAddComponent <BounceProjModifier>();

            bouncer.name = "cation";

            int orbitersInGroup = OrbitProjectileMotionModule.GetOrbitersInGroup(100);

            if (orbitersInGroup >= 20)
            {
                return;
            }
            bouncer.projectile.specRigidbody.CollideWithTileMap = false;
            bouncer.projectile.ResetDistance();

            bouncer.projectile.baseData.range      = Mathf.Max(bouncer.projectile.baseData.range, 500f);
            bouncer.projectile.collidesWithEnemies = false;
            bouncer.specRigidbody.AddCollisionLayerIgnoreOverride(CollisionMask.LayerToMask(CollisionLayer.EnemyBulletBlocker, CollisionLayer.EnemyHitBox, CollisionLayer.EnemyCollider, CollisionLayer.BulletBlocker, CollisionLayer.BulletBreakable));
            OrbitProjectileMotionModule orbitProjectileMotionModule = new OrbitProjectileMotionModule();

            orbitProjectileMotionModule.lifespan = 4000f;
            if (bouncer.projectile.OverrideMotionModule != null && bouncer.projectile.OverrideMotionModule is HelixProjectileMotionModule)
            {
                orbitProjectileMotionModule.StackHelix  = true;
                orbitProjectileMotionModule.ForceInvert = (bouncer.projectile.OverrideMotionModule as HelixProjectileMotionModule).ForceInvert;
            }
            orbitProjectileMotionModule.usesAlternateOrbitTarget = true;
            orbitProjectileMotionModule.alternateOrbitTarget     = body;
            orbitProjectileMotionModule.MinRadius = 1;
            orbitProjectileMotionModule.MaxRadius = 1;
            spincheck = orbitProjectileMotionModule;
            bouncer.projectile.OverrideMotionModule = spincheck;
        }
Пример #2
0
        public void Spin(Projectile proj)
        {
            BounceProjModifier bouncer = proj.gameObject.GetOrAddComponent <BounceProjModifier>();

            bouncer.name = "afterimage";

            int orbitersInGroup = OrbitProjectileMotionModule.GetOrbitersInGroup(101);

            if (orbitersInGroup >= 20)
            {
                return;
            }
            bouncer.projectile.specRigidbody.CollideWithTileMap = false;
            bouncer.projectile.ResetDistance();

            bouncer.projectile.baseData.range = Mathf.Max(bouncer.projectile.baseData.range, 17f);

            OrbitProjectileMotionModule orbitProjectileMotionModule = new OrbitProjectileMotionModule();

            orbitProjectileMotionModule.lifespan = 8f;


            if (bouncer.projectile.OverrideMotionModule != null && bouncer.projectile.OverrideMotionModule is HelixProjectileMotionModule)
            {
                orbitProjectileMotionModule.StackHelix  = true;
                orbitProjectileMotionModule.ForceInvert = (bouncer.projectile.OverrideMotionModule as HelixProjectileMotionModule).ForceInvert;
            }


            orbitProjectileMotionModule.MinRadius = 3.5f;
            orbitProjectileMotionModule.MaxRadius = 3.5f;

            bouncer.projectile.OverrideMotionModule = orbitProjectileMotionModule;
        }
Пример #3
0
        private IEnumerator LerpToMaxRadius(Projectile proj)
        {
            if (!proj || proj.OverrideMotionModule == null)
            {
                yield break;
            }
            if (proj.OverrideMotionModule is OrbitProjectileMotionModule)
            {
                OrbitProjectileMotionModule motionMod = proj.OverrideMotionModule as OrbitProjectileMotionModule;

                float elapsed  = 0f;
                float duration = 0.5f;
                while (elapsed < duration)
                {
                    elapsed += m_projectile.LocalDeltaTime;
                    float t             = elapsed / duration;
                    float currentRadius = Mathf.Lerp(0.1f, 3, t);

                    FieldInfo field = typeof(OrbitProjectileMotionModule).GetField("m_radius", BindingFlags.Instance | BindingFlags.NonPublic);
                    field.SetValue(motionMod, currentRadius);
                    yield return(null);
                }
            }
            yield break;
        }
Пример #4
0
        private Projectile CreateBolaProjectile(bool isB = false, bool invert = false)
        {
            GameObject gameObject = SpawnManager.SpawnProjectile(bolaPrefab, m_projectile.specRigidbody.UnitCenter, Quaternion.Euler(0f, 0f, 0f), true);
            Projectile component  = gameObject.GetComponent <Projectile>();

            if (component != null)
            {
                component.Owner            = bolaOwna;
                component.Shooter          = bolaOwna.specRigidbody;
                component.baseData.damage *= bolaOwna.stats.GetStatValue(PlayerStats.StatType.Damage);
                component.baseData.speed  *= bolaOwna.stats.GetStatValue(PlayerStats.StatType.ProjectileSpeed);
                component.baseData.force  *= bolaOwna.stats.GetStatValue(PlayerStats.StatType.KnockbackMultiplier);
                component.UpdateSpeed();

                if (invert)
                {
                    component.baseData.speed *= -1;
                    component.UpdateSpeed();
                }
                component.specRigidbody.CollideWithTileMap = false;
                component.pierceMinorBreakables            = true;
                PierceProjModifier pierce = component.gameObject.GetOrAddComponent <PierceProjModifier>();
                pierce.penetration++;
                OrbitProjectileMotionModule orbitProjectileMotionModule = new OrbitProjectileMotionModule();

                orbitProjectileMotionModule.lifespan  = 50;
                orbitProjectileMotionModule.MinRadius = 0.1f;
                orbitProjectileMotionModule.MaxRadius = 0.1f;
                orbitProjectileMotionModule.usesAlternateOrbitTarget = true;
                orbitProjectileMotionModule.OrbitGroup           = -6;
                orbitProjectileMotionModule.alternateOrbitTarget = m_projectile.specRigidbody;
                if (isB)
                {
                    component.transform.localRotation = Quaternion.Euler(0f, 0f, component.transform.localRotation.z + 180);
                }

                bolaOwna.DoPostProcessProjectile(component);

                if (component.OverrideMotionModule != null && component.OverrideMotionModule is HelixProjectileMotionModule)
                {
                    orbitProjectileMotionModule.StackHelix  = true;
                    orbitProjectileMotionModule.ForceInvert = (component.OverrideMotionModule as HelixProjectileMotionModule).ForceInvert;
                }
                component.OverrideMotionModule = orbitProjectileMotionModule;
                StartCoroutine(LerpToMaxRadius(component));
                StartCoroutine(MakeProjectileSolid(component));
                return(component);
            }
            return(null);
        }
Пример #5
0
        public void hitenemyhandleruncharge(Projectile proj, SpeculativeRigidbody body, bool yes)
        {
            if (yes)
            {
                //BecomeOrbitProjectileModifier become = proj.gameObject.AddComponent<BecomeOrbitProjectileModifier>();
                OrbitProjectileMotionModule orbiter = proj.gameObject.GetComponent <OrbitProjectileMotionModule>();
                orbiter.lifespan  = 99999f;
                orbiter.MaxRadius = 3;
                orbiter.MinRadius = 3;

                orbiter.alternateOrbitTarget = body;

                /// WHY YOU NO SPIN AUUUUUUUUUUUGHHH
            }
        }
Пример #6
0
 public static void ConvertToHelixMotion(this Projectile bullet, bool isInverted)
 {
     if (bullet.OverrideMotionModule != null && bullet.OverrideMotionModule is OrbitProjectileMotionModule)
     {
         OrbitProjectileMotionModule orbitProjectileMotionModule = bullet.OverrideMotionModule as OrbitProjectileMotionModule;
         orbitProjectileMotionModule.StackHelix  = true;
         orbitProjectileMotionModule.ForceInvert = isInverted;
     }
     else if (!isInverted)
     {
         bullet.OverrideMotionModule = new HelixProjectileMotionModule();
     }
     else
     {
         bullet.OverrideMotionModule = new HelixProjectileMotionModule
         {
             ForceInvert = true
         };
     }
 }
Пример #7
0
        private void PostProcessProjectile(Projectile sourceProjectile, float effectChanceScalar)
        {
            if (sourceProjectile.GetComponent <MoonrockProjectile>())
            {
                return;
            }
            if (sourceProjectile is InstantDamageOneEnemyProjectile)
            {
                return;
            }
            if (sourceProjectile is InstantlyDamageAllProjectile)
            {
                return;
            }
            if (sourceProjectile.GetComponent <ArtfulDodgerProjectileController>())
            {
                return;
            }

            PlayerController owner = sourceProjectile.ProjectilePlayerOwner();

            int amtOfOrbiters = UnityEngine.Random.Range(0, 4);

            if (amtOfOrbiters > 0)
            {
                for (int i = 0; i < amtOfOrbiters; i++)
                {
                    GameObject gameObject = SpawnManager.SpawnProjectile(moonrockProjectile.gameObject, sourceProjectile.sprite.WorldCenter, Quaternion.Euler(0f, 0f, (base.Owner.CurrentGun == null) ? 0f : base.Owner.CurrentGun.CurrentAngle), true);
                    Projectile component  = gameObject.GetComponent <Projectile>();
                    if (component != null)
                    {
                        component.Owner            = owner;
                        component.Shooter          = owner.specRigidbody;
                        component.baseData.damage *= owner.stats.GetStatValue(PlayerStats.StatType.Damage);
                        component.baseData.speed  *= owner.stats.GetStatValue(PlayerStats.StatType.ProjectileSpeed);
                        component.baseData.force  *= owner.stats.GetStatValue(PlayerStats.StatType.KnockbackMultiplier);
                        component.UpdateSpeed();

                        component.specRigidbody.CollideWithTileMap = true;

                        BulletLifeTimer timer = component.gameObject.GetOrAddComponent <BulletLifeTimer>();
                        timer.secondsTillDeath = 30f;

                        OrbitProjectileMotionModule orbitProjectileMotionModule = new OrbitProjectileMotionModule();
                        orbitProjectileMotionModule.lifespan  = 50;
                        orbitProjectileMotionModule.MinRadius = 0.5f;
                        orbitProjectileMotionModule.MaxRadius = 2;
                        orbitProjectileMotionModule.usesAlternateOrbitTarget = true;
                        orbitProjectileMotionModule.OrbitGroup           = -5;
                        orbitProjectileMotionModule.alternateOrbitTarget = sourceProjectile.specRigidbody;
                        if (component.OverrideMotionModule != null && component.OverrideMotionModule is HelixProjectileMotionModule)
                        {
                            orbitProjectileMotionModule.StackHelix  = true;
                            orbitProjectileMotionModule.ForceInvert = (component.OverrideMotionModule as HelixProjectileMotionModule).ForceInvert;
                        }
                        component.OverrideMotionModule = orbitProjectileMotionModule;

                        component.gameObject.GetOrAddComponent <MoonrockProjectile>();

                        owner.DoPostProcessProjectile(component);
                    }
                }
            }
        }