//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; }
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; }
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; }
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); }
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 } }
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 }; } }
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); } } } }