Beispiel #1
0
        public override bool PreKill(int timeLeft)
        {
            projectile.type = ProjectileID.Fireball;
            Main.PlaySound(2, (int)projectile.position.X, (int)projectile.position.Y, 10);
            for (int num315 = 0; num315 < 40; num315 = num315 + 1)
            {
                Vector2 randomcircle = new Vector2(Main.rand.Next(-8000, 8000), Main.rand.Next(-8000, 8000)); randomcircle.Normalize();
                randomcircle *= Main.rand.NextFloat(2f, 6f);
                int num316 = Dust.NewDust(new Vector2(projectile.position.X - 1, projectile.position.Y), projectile.width, projectile.height, mod.DustType("HotDust"), 0, 0, 50, Main.hslToRgb(0.15f, 1f, 1.00f), projectile.scale * 2f);
                Main.dust[num316].noGravity = false;
                Main.dust[num316].velocity  = new Vector2(randomcircle.X, randomcircle.Y);
            }
            if (projectile.width > 16)
            {
                for (int num315 = 1; num315 < 4; num315 = num315 + 1)
                {
                    Vector2 randomcircle = new Vector2(Main.rand.Next(-8000, 8000), Main.rand.Next(-8000, 8000)); randomcircle.Normalize();
                    float   velincrease  = Main.rand.NextFloat(4f, 8f);
                    int     thisone      = Projectile.NewProjectile(projectile.Center.X - projectile.velocity.X, projectile.Center.Y - projectile.velocity.Y, randomcircle.X * velincrease, randomcircle.Y * velincrease, ModContent.ProjectileType <LavaRocks>(), (int)(projectile.damage * 0.75), projectile.knockBack, projectile.owner, 0.0f, 0f);
                    Main.projectile[thisone].netUpdate = true;
                    Main.projectile[thisone].friendly  = projectile.friendly;
                    Main.projectile[thisone].hostile   = projectile.hostile;
                    Main.projectile[thisone].width     = Main.projectile[thisone].width - 6;
                    Main.projectile[thisone].height    = Main.projectile[thisone].height - 6;
                    if (hittile)
                    {
                        Main.projectile[thisone].velocity.Y = -Math.Abs(Main.projectile[thisone].velocity.Y);
                    }
                    IdgProjectile.Sync(thisone);
                }
            }

            int theproj = Projectile.NewProjectile(projectile.Center.X, projectile.Center.Y, 0, 0, mod.ProjectileType("Explosion"), (int)((double)projectile.damage * 0.15f), projectile.knockBack, projectile.owner, 0f, 0f);

            Main.projectile[theproj].magic = projectile.magic;

            return(true);
        }
        public override bool Shoot(Player player, ref Vector2 position, ref float speedX, ref float speedY, ref int type, ref int damage, ref float knockBack)
        {
            float speed             = 1.5f;
            float numberProjectiles = 3;
            float rotation          = MathHelper.ToRadians(16);
            //Main.PlaySound(SoundID.Item, player.Center,45);

            float speedvel = new Vector2(speedX, speedY).Length();

            Vector2 eree = player.itemRotation.ToRotationVector2();

            eree  *= player.direction;
            speedX = eree.X * speedvel;
            speedY = eree.Y * speedvel;

            position += eree * 45f;

            for (int i = 0; i < numberProjectiles; i++)
            {
                Vector2 perturbedSpeed = (new Vector2(speedX, speedY) * speed).RotatedBy(MathHelper.Lerp(-rotation, rotation, (float)Main.rand.Next(0, 100) / 100f)) * .2f;                         // Watch out for dividing by 0 if there is only 1 projectile.
                perturbedSpeed.RotatedBy(MathHelper.ToRadians(-45));
                perturbedSpeed *= Main.rand.NextFloat(0.8f, 1.2f);
                int proj = Projectile.NewProjectile(position.X, position.Y, perturbedSpeed.X, perturbedSpeed.Y, ProjectileID.DD2DarkMageBolt, (int)((float)damage * 1.00f), knockBack / 3f, player.whoAmI);
                Main.projectile[proj].melee      = true;
                Main.projectile[proj].magic      = false;
                Main.projectile[proj].hostile    = false;
                Main.projectile[proj].friendly   = true;
                Main.projectile[proj].netUpdate  = true;
                Main.projectile[proj].timeLeft   = 180;
                Main.projectile[proj].localAI[0] = 1f;
                Main.projectile[proj].velocity   = perturbedSpeed;
                IdgProjectile.Sync(proj);

                //NetMessage.SendData(MessageID.SyncProjectile, -1, -1, null, proj);
            }

            return(false);
        }
        public override bool Shoot(Player player, ref Vector2 position, ref float speedX, ref float speedY, ref int type, ref int damage, ref float knockBack)
        {
            if (type == ProjectileID.PoisonDartBlowgun || type == ProjectileID.PoisonDart)
            {
                type = ProjectileID.PoisonDartTrap;
            }
            //}
            int probg = Projectile.NewProjectile(position.X + (int)speedX * (type == ProjectileID.PoisonDartTrap ? 2 : 0), position.Y + (int)speedY * (type == ProjectileID.PoisonDartTrap ? 2 : 0), speedX, speedY, type, damage, knockBack, player.whoAmI);

            Main.projectile[probg].ranged   = true;
            Main.projectile[probg].friendly = true;
            Main.projectile[probg].hostile  = false;
            Vector2 perturbedSpeed = new Vector2(speedX, speedY).RotatedByRandom(MathHelper.ToRadians(5));

            Main.projectile[probg].velocity.X = perturbedSpeed.X;
            Main.projectile[probg].velocity.Y = perturbedSpeed.Y;
            Main.projectile[probg].owner      = player.whoAmI;
            SGAprojectile modeproj = Main.projectile[probg].GetGlobalProjectile <SGAprojectile>();

            modeproj.myplayer = player;
            IdgProjectile.Sync(probg);
            return(false);
        }
        public override void OnHitNPC(NPC target, int damage, float knockback, bool crit)
        {
            for (float u = 0; u < MathHelper.TwoPi; u += MathHelper.Pi)
            {
                Vector2 oldPos = new Vector2(1f, 0);
                oldPos = oldPos.RotatedBy(u + (projectile.rotation + (0f)));
                oldPos.Normalize();
                oldPos *= 24f;

                Vector2 torot = oldPos;
                torot.Normalize();

                int thisoned = Projectile.NewProjectile(projectile.Center + oldPos, torot * 8f, ProjectileID.ScutlixLaser, (int)(projectile.damage / 3), knockback, Main.myPlayer);
                //Main.projectile[thisoned].usesLocalNPCImmunity = true;
                //Main.projectile[thisoned].localNPCHitCooldown = -1;
                Main.projectile[thisoned].penetrate = 2;
                Main.projectile[thisoned].knockBack = 0f;
                Main.projectile[thisoned].usesIDStaticNPCImmunity = true;
                Main.projectile[thisoned].idStaticNPCHitCooldown  = 30;
                Main.projectile[thisoned].netUpdate = true;
                IdgProjectile.Sync(thisoned);
            }
        }
Beispiel #5
0
        public override bool Shoot(Player player, ref Vector2 position, ref float speedX, ref float speedY, ref int type, ref int damage, ref float knockBack)
        {
            DoTurn(player);
            Main.PlaySound(SoundID.Item11, player.position);
            float num2 = 12f + (float)Main.rand.Next(450) * 0.01f;
            float num3 = (float)Main.rand.Next(85, 105);
            float num4 = (float)Main.rand.Next(-35, 11);
            //int type = 166;
            //int damage = 35;
            //float knockBack = 3.5f;
            Vector2 vector = new Vector2(player.Center.X, player.Center.Y + 4);

            if (player.direction < 1)
            {
                num3     *= -1f;
                vector.X -= 36f;
            }
            else
            {
                vector.X += 36f;
            }
            float num5 = num3;
            float num6 = num4;
            float num7 = (float)Math.Sqrt((double)(num5 * num5 + num6 * num6));

            num7  = num2 / num7;
            num5 *= num7;
            num6 *= num7;
            int ittaz = Projectile.NewProjectile(vector.X, vector.Y, num5 * (type == mod.ProjectileType("JarateShurikensProg") ? 1.25f : 1f), num6, type, damage, knockBack, Main.myPlayer, 0f, 0f);

            Main.projectile[ittaz].trap      = true;
            Main.projectile[ittaz].ranged    = false;
            Main.projectile[ittaz].netUpdate = true;
            IdgProjectile.Sync(ittaz);

            return(false);
        }
        public override void OnThrow(int type, Player player, ref Vector2 position, ref float speedX, ref float speedY, ref int type2, ref int damage, ref float knockBack, JavelinProj madeproj)
        {
            if (type == 1)
            {
                Vector2 normalizedspeed = new Vector2(speedX, speedY);
                normalizedspeed.Normalize();
                normalizedspeed   *= (Throwspeed * player.Throwing().thrownVelocity);
                normalizedspeed.Y -= Math.Abs(normalizedspeed.Y * 0.1f);
                if (player.altFunctionUse == 2)
                {
                    for (int i = -15; i < 16; i += 30)
                    {
                        Vector2 perturbedSpeed = ((new Vector2(normalizedspeed.X, normalizedspeed.Y)).RotatedBy(MathHelper.ToRadians(i))).RotatedByRandom(MathHelper.ToRadians(10)) * 0.85f;
                        float   scale          = 1f - (Main.rand.NextFloat() * .01f);
                        perturbedSpeed = perturbedSpeed * scale;
                        type2          = mod.ProjectileType("JavelinProj");

                        int thisoneddddd = Projectile.NewProjectile(position.X, position.Y, perturbedSpeed.X, perturbedSpeed.Y, type2, damage, knockBack, Main.myPlayer);
                        Main.projectile[thisoneddddd].ai[1]             = Speartype;
                        Main.projectile[thisoneddddd].melee             = false;
                        Main.projectile[thisoneddddd].Throwing().thrown = true;

                        if (Speartype == (int)JavelinType.CrimsonCatastrophe)
                        {
                            Main.projectile[thisoneddddd].aiStyle = (-100 + i);
                        }


                        (Main.projectile[thisoneddddd].modProjectile as JavelinProj).maxstick     = madeproj.maxstick;
                        (Main.projectile[thisoneddddd].modProjectile as JavelinProj).maxStickTime = madeproj.maxStickTime;
                        Main.projectile[thisoneddddd].penetrate = madeproj.projectile.penetrate;
                        Main.projectile[thisoneddddd].netUpdate = true;
                        IdgProjectile.Sync(thisoneddddd);
                    }
                }
            }
        }
        public static void SpectralSummon(Player player, int type, int damage, Vector2 there)
        {
            float numberProjectiles = 1;
            float rotation          = MathHelper.ToRadians(16);

            List <NPC> guys = new List <NPC>();

            for (int a = 0; a < Main.maxNPCs; a++)
            {
                NPC        npchim = Main.npc[a];
                Projectile proj   = new Projectile();
                proj.SetDefaults(ProjectileID.ChlorophyteBullet);

                if (npchim.active && !npchim.friendly && npchim.CanBeChasedBy() && (npchim.Center - there).Length() < 400)
                {
                    guys.Add(npchim);
                }
            }
            if (guys.Count > 0)
            {
                for (int i = 0; i < numberProjectiles; i++)
                {
                    NPC theone = guys[Main.rand.Next(0, guys.Count)];

                    Vector2 perturbedSpeed = new Vector2(Main.rand.NextFloat(2f, 7f) * (Main.rand.NextBool() ? 1f : -1f), Main.rand.NextFloat(1f, 4f));                     // Watch out for dividing by 0 if there is only 1 projectile.
                    perturbedSpeed *= Main.rand.NextFloat(0.7f, 2.2f);
                    int proj = Projectile.NewProjectile((theone.Center.X - perturbedSpeed.X * ((float)(8f))) + ((perturbedSpeed.X > 0 ? -0.5f : 0.5f) * theone.width), (theone.Center.Y - 64) - perturbedSpeed.Y * 12f, perturbedSpeed.X, perturbedSpeed.Y, type, (int)((float)damage * 1f), 0, player.whoAmI);
                    Main.projectile[proj].melee     = true;
                    Main.projectile[proj].magic     = false;
                    Main.projectile[proj].hostile   = false;
                    Main.projectile[proj].friendly  = true;
                    Main.projectile[proj].netUpdate = true;
                    Main.PlaySound(SoundID.Item18, Main.projectile[proj].Center);
                    IdgProjectile.Sync(proj);
                }
            }
        }
        public override void Explode()
        {
            if (projectile.timeLeft == timeleftfirerate && projectile.ai[0] > 0)
            {
                Player owner = Main.player[projectile.owner];

                if (owner != null && !owner.dead && owner.channel)
                {
                    everyother += 1;
                    everyother %= 2;

                    Vector2 gotohere = new Vector2();
                    gotohere = projectile.velocity;                    //Main.MouseScreen - projectile.Center;
                    gotohere.Normalize();

                    Vector2 perturbedSpeed = new Vector2(gotohere.X, gotohere.Y).RotatedByRandom(MathHelper.ToRadians(15)) * projectile.velocity.Length();
                    if (everyother == 1)
                    {
                        int proj = Projectile.NewProjectile(new Vector2(projectile.Center.X, projectile.Center.Y), new Vector2(perturbedSpeed.X, perturbedSpeed.Y) * 2f, (int)projectile.ai[0], (int)(projectile.damage * 0.50f * damagescale), projectile.knockBack / 10f, owner.whoAmI);
                        Main.projectile[proj].magic     = true;
                        Main.projectile[proj].timeLeft  = 300;
                        Main.projectile[proj].penetrate = penetrate;
                        IdgProjectile.Sync(proj);
                    }


                    Vector2 backthere = (owner.Center - gotohere * 32) - (new Vector2(gotohere.X, gotohere.Y).RotatedByRandom(MathHelper.ToRadians(135)) * 96);
                    Vector2 gohere    = Main.MouseWorld - backthere;
                    gohere.Normalize();
                    gohere *= 28f;
                    gohere  = gohere.RotatedByRandom(MathHelper.ToRadians(20));

                    int proj2 = Projectile.NewProjectile(backthere, gohere, mod.ProjectileType("ProjectilePortalRealityShaperHit"), (int)(projectile.damage * damagescale), projectile.knockBack / 6f, owner.whoAmI, mod.ProjectileType("HotRound"));
                    IdgProjectile.Sync(proj2);
                }
            }
        }
Beispiel #9
0
        public override void AI()
        {
            projectile.ai[0] += 1;
            if (projectile.ai[0] % 40 == 0)
            {
                Vector2 avel = projectile.velocity.RotatedBy(MathHelper.ToRadians(projectile.ai[0] % 80 == 0 ? 90 : -90)) / 5f;
                int     proj = Projectile.NewProjectile(projectile.Center.X, projectile.Center.Y, avel.X, avel.Y, ProjectileID.SporeGas3, projectile.damage * 2, projectile.knockBack, projectile.owner);
                Main.projectile[proj].usesLocalNPCImmunity = true;
                Main.projectile[proj].localNPCHitCooldown  = -1;
                Main.projectile[proj].scale        = 0.5f;
                Main.projectile[proj].extraUpdates = 1;
                Main.projectile[proj].ranged       = true;
                Main.projectile[proj].netUpdate    = true;
                IdgProjectile.AddOnHitBuff(proj, mod.BuffType("AcidBurn"), 60 * 2);
                IdgProjectile.Sync(proj);
            }

            int dust = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, 6);

            Main.dust[dust].scale     = 0.8f;
            Main.dust[dust].noGravity = false;
            Main.dust[dust].velocity  = projectile.velocity * (float)(Main.rand.Next(20, 100) * 0.005f);
            projectile.rotation       = (float)Math.Atan2((double)projectile.velocity.Y, (double)projectile.velocity.X) + 1.57f;
        }
Beispiel #10
0
        public override bool Shoot(Player player, ref Vector2 position, ref float speedX, ref float speedY, ref int type, ref int damage, ref float knockBack)
        {
            projectiletype += 1;
            projectiletype  = projectiletype % 4;

            for (int a = 0; a < 360; a += 360 / 4)
            {
                for (int i = -4; i < 5; i += 8)
                {
                    Vector2 speez = new Vector2(speedX, speedY);
                    speez = speez.RotatedBy(MathHelper.ToRadians(a + (i > 0 ? 45 : 0)));
                    Vector2 offset = speez;
                    offset.Normalize();
                    offset *= 48f;
                    int probg = Projectile.NewProjectile(position.X + offset.X, position.Y + offset.Y, speez.X, speez.Y, type, damage, knockBack, player.whoAmI, (projectiletype), (float)i / 1.5f);
                    Main.projectile[probg].friendly  = true;
                    Main.projectile[probg].hostile   = false;
                    Main.projectile[probg].netUpdate = true;
                    IdgProjectile.Sync(probg);
                }
            }

            return(false);
        }
        public override void AI()
        {
            //if (projectile.owner == null || projectile.owner < 0)
            //return;


            Player player = Main.player[projectile.owner];

            if (player.dead || !player.active)
            {
                player.ClearBuff(ModContent.BuffType <MidasMinionBuff>());
            }
            if (player.HasBuff(ModContent.BuffType <MidasMinionBuff>()))
            {
                projectile.timeLeft = 2;
            }
            Vector2 gothere = player.Center;

            projectile.localAI[0] += 1;

            int target2 = Idglib.FindClosestTarget(0, projectile.Center, new Vector2(0f, 0f), true, true, true, projectile);
            NPC them    = Main.npc[target2];
            NPC oldthem = null;

            if (player.HasMinionAttackTargetNPC)
            {
                oldthem = them;
                them    = Main.npc[player.MinionAttackTargetNPC];
                gothere = them.Center;
            }

            if (them != null && them.active)
            {
                if ((them.Center - projectile.Center).Length() < 500 && Collision.CanHitLine(new Vector2(projectile.Center.X, projectile.Center.Y), 1, 1, new Vector2(them.Center.X, them.Center.Y), 1, 1) && them.CanBeChasedBy())
                {
                    projectile.ai[0] += 1;

                    if (projectile.ai[0] % 20 == 0)
                    {
                        Main.PlaySound(18, (int)projectile.Center.X, (int)projectile.Center.Y, 0, 1f, 0.25f);
                        int thisoned = Projectile.NewProjectile(projectile.Center.X, projectile.Center.Y, 0, 0, ProjectileID.GoldCoin, projectile.damage, projectile.knockBack, Main.player[projectile.owner].whoAmI);
                        Main.projectile[thisoned].minion   = true;
                        Main.projectile[thisoned].velocity = (them.Center - projectile.Center);
                        Main.projectile[thisoned].velocity.Normalize(); Main.projectile[thisoned].velocity *= 12f; Main.projectile[thisoned].velocity = Main.projectile[thisoned].velocity.RotateRandom(MathHelper.ToRadians(15));
                        Main.projectile[thisoned].penetrate = 1;
                        Main.projectile[thisoned].ranged    = false;
                        Main.projectile[thisoned].netUpdate = true;
                        IdgProjectile.AddOnHitBuff(thisoned, BuffID.Midas, 60 * 5);
                        IdgProjectile.Sync(thisoned);
                    }
                }

                if (oldthem != null)
                {
                    if ((oldthem.Center - projectile.Center).Length() < 500 && Collision.CanHitLine(new Vector2(projectile.Center.X, projectile.Center.Y), 1, 1, new Vector2(oldthem.Center.X, oldthem.Center.Y), 1, 1) && oldthem.CanBeChasedBy())
                    {
                        if (projectile.ai[0] % 35 == 0)
                        {
                            Main.PlaySound(18, (int)projectile.Center.X, (int)projectile.Center.Y, 0, 0.75f, -0.5f);
                            int thisoned = Projectile.NewProjectile(projectile.Center.X, projectile.Center.Y, 0, 0, ProjectileID.SilverCoin, (int)((float)projectile.damage * 0.75f), projectile.knockBack, Main.player[projectile.owner].whoAmI);
                            Main.projectile[thisoned].minion   = true;
                            Main.projectile[thisoned].velocity = (oldthem.Center - projectile.Center);
                            Main.projectile[thisoned].velocity.Normalize(); Main.projectile[thisoned].velocity *= 10f; Main.projectile[thisoned].velocity = Main.projectile[thisoned].velocity.RotateRandom(MathHelper.ToRadians(15));
                            Main.projectile[thisoned].penetrate = 1;
                            Main.projectile[thisoned].ranged    = false;
                            Main.projectile[thisoned].netUpdate = true;
                            IdgProjectile.AddOnHitBuff(thisoned, BuffID.Midas, 60 * 2);
                            IdgProjectile.Sync(thisoned);
                        }
                    }
                }
            }

            int dust = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, 124);

            Main.dust[dust].scale     = 0.7f;
            Main.dust[dust].velocity  = projectile.velocity * 0.2f;
            Main.dust[dust].noGravity = true;

            float us    = 0f;
            float maxus = 0f;

            for (int i = 0; i < Main.maxProjectiles; i++)             // Loop all projectiles
            {
                Projectile currentProjectile = Main.projectile[i];
                if (currentProjectile.active &&              // Make sure the projectile is active
                    currentProjectile.owner == Main.myPlayer &&             // Make sure the projectile's owner is the client's player
                    currentProjectile.type == projectile.type)
                {                 // Make sure the projectile is of the same type as this javelin
                    if (i == projectile.whoAmI)
                    {
                        us = maxus;
                    }
                    maxus += 1f;
                }
            }
            Vector2 there = player.Center;

            double  angles = MathHelper.ToRadians((float)((us / maxus) * 360.00) - 90f);
            float   dist   = 256f;        //Main.rand.NextFloat(54f, 96f);
            Vector2 here   = new Vector2((float)Math.Cos(angles), (float)Math.Sin(angles)) * dist;

            Vector2 where = gothere + here;

            if ((where - projectile.Center).Length() > 8f)
            {
                projectile.velocity += (where - projectile.Center) * 0.005f;
                projectile.velocity *= 0.975f;
            }
            float maxspeed = Math.Min(projectile.velocity.Length(), 16);

            projectile.velocity.Normalize();
            projectile.velocity *= maxspeed;



            Lighting.AddLight(projectile.Center, Color.Yellow.ToVector3() * 0.78f);
        }
Beispiel #12
0
        public virtual void OrderOfTheCrates(Player P)
        {
            nonaispin    = nonaispin + 1f;
            compressvar += (compressvargoal - compressvar) / 20;
            float themaxdist = 99999f;

            for (int a = 0; a < phase; a = a + 1)
            {
                Cratesperlayer[a] = 4 + (a * 4);
                for (int i = 0; i < Cratesperlayer[a]; i = i + 1)
                {
                    Cratesangle[a, i] = (a % 2 == 0 ? 1 : -1) * ((nonaispin * 0.01f) * (1f + a / 3f)) + 2.0 * Math.PI * ((i / (double)Cratesperlayer[a]));
                    Cratesdist[a, i]  = compressvar * 20f + ((float)a * 20f) * compressvar;
                    //if (compressvar<1.9){
                    //Cratesvector[a,i]= Cratesdist[a,i] * (new Vector2((float)Math.Cos(Cratesangle[a,i]), (float)Math.Sin(Cratesangle[a,i]))) + npc.Center;//npc.Size / 2f;
                    //}else{
                    float theexpand = 0f;

                    if (themode > 0)
                    {
                        theexpand = (((i / 1f) * (a + 1f))) * (themode / 30f);
                    }
                    Cratesvector[a, i] += ((Cratesdist[a, i] * (new Vector2((float)Math.Cos(Cratesangle[a, i]), (float)Math.Sin(Cratesangle[a, i]))) + npc.Center) - Cratesvector[a, i]) / (theexpand + (System.Math.Max((((compressvar) - 1) * (2 + (a * 1))), 1)));//npc.Size / 2f;
                    float sinner  = npc.ai[0] + ((float)(i * 5) + (a * 14));
                    float sinner2 = (float)(10f + (Math.Sin(sinner / 30f) * 7f));
                    if (compressvar > 1.01)
                    {
                        int []   projtype   = { ProjectileID.PlatinumCoin, ProjectileID.PlatinumCoin, ProjectileID.PlatinumCoin, ProjectileID.GoldCoin, ProjectileID.SilverCoin, ProjectileID.CopperCoin };
                        int []   projdamage = { 25, 30, 30, 50, 60, 60 };
                        float [] projspeed  = { 1f, 1f, 1f, 9f, 8f, 7f };
                        if (a == phase - 1)
                        {
                            if (sinner2 < 4 && (npc.ai[0] + (i * 4)) % 30 == 0)
                            {
                                List <Projectile> itz = Idglib.Shattershots(Cratesvector[a, i], P.position, new Vector2(P.width, P.height), projtype[a + 1], (int)((double)npc.damage * ((double)projdamage[a + 1] / (double)defaultdamage)), projspeed[a + 1], 0, 1, true, 0, false, 110);
                                if (projtype[a + 1] == ProjectileID.PlatinumCoin)
                                {
                                    itz[0].aiStyle = 18; IdgProjectile.AddOnHitBuff(itz[0].whoAmI, BuffID.ShadowFlame, 60 * 10);
                                }
                            }
                        }

                        Cratesvector[a, i] += ((P.Center - Cratesvector[a, i]) / (sinner2)) * ((System.Math.Max(compressvar - 1, 0) * 1));
                    }
                    float dist = (P.Center - Cratesvector[a, i]).Length();
                    if (dist < themaxdist)
                    {
                        themaxdist       = dist;
                        theclostestcrate = Cratesvector[a, i];
                    }
                    //}
                    Cratestype[a, i] = ItemID.WoodenCrate;
                    if (a == 3)
                    {
                        Cratestype[a, i] = ItemID.IronCrate;
                        if (npc.ai[3] > 100000 && i % 2 == 0)
                        {
                            Cratestype[a, i] = ItemID.HallowedFishingCrate;
                        }
                        else
                        {
                            if (npc.ai[3] < -100000 && i % 2 == 0)
                            {
                                Cratestype[a, i] = evilcratetype;
                            }
                        }
                    }
                    if (a == 2)
                    {
                        Cratestype[a, i] = (i % 2 == 0) ? ItemID.JungleFishingCrate : ItemID.DungeonFishingCrate;
                    }
                    if (a == 1)
                    {
                        Cratestype[a, i] = (i % 2 == 0) ? ItemID.HallowedFishingCrate : (evilcratetype);
                    }
                    if (a == 0)
                    {
                        Cratestype[a, i] = ItemID.FloatingIslandFishingCrate;
                    }

                    if (!(npc.target < 0 || npc.target == 255 || Main.player[npc.target].dead || !Main.player[npc.target].active || Main.dayTime))
                    {
                        //if (npc.ai[0]%600<350){
                        //if ((npc.ai[0]/100)%Cratesperlayer[a]==i){
                        //List<Projectile> projs=SgaLib.Shattershots(Cratesvector[a,i],P.position,new Vector2(P.width,P.height),ProjectileID.CopperCoin,35,12,0,1,true,0,true,150);
                    }
                }
            }
        }
        public override void AI()
        {
            Vector2 positiondust = Vector2.Normalize(new Vector2(projectile.velocity.X, projectile.velocity.Y)) * 8f;
            Player  owner        = Main.player[projectile.owner];

            if (projectile.ai[0] < 1f && owner.direction != 1)
            {
                projectile.rotation *= -1f;
            }


            owner.manaRegenDelay = (int)(owner.maxRegenDelay * 15);

            projectile.ai[0] += 1;



            projectile.velocity = new Vector2(0f, owner.itemAnimation > 12 ? -16f : 0);
            projectile.Center   = owner.Center + new Vector2(-24f + (owner.direction == 1 ? 10f : -5f), -16f);
            if (owner.itemAnimation < 8)
            {
                projectile.Center += new Vector2(0, (int)((8.0 - (double)owner.itemAnimation) * 2.5));
            }

            if (owner.itemAnimation < 2)
            {
                projectile.Kill();
            }


            projectile.rotation += (((float)(Math.PI / -4.0)) - projectile.rotation) / 6f;
            if (owner.itemAnimation == 30)
            {
                for (int i = 0; i < Main.maxNPCs; i++)
                {
                    NPC him = Main.npc[i];
                    if (him.active)
                    {
                        if (him.GetGlobalNPC <SGAnpcs>().InfinityWarStormbreakerint > 0 || him.GetGlobalNPC <SGAnpcs>().DosedInGas || him.dripping)
                        {
                            if (owner.statMana > 0)
                            {
                                owner.statMana      -= (int)(10f * owner.manaCost);
                                owner.manaRegenDelay = 180;
                                int rainmeansmore = (Main.raining || owner.GetModPlayer <SGAPlayer>().devempowerment[1] > 0) ? 2 : 0;

                                for (int x = 0; x < rainmeansmore + 1; x++)
                                {
                                    float   rotation       = MathHelper.ToRadians(3);
                                    Vector2 speed          = new Vector2(0f, 72f);
                                    Vector2 perturbedSpeed = speed.RotatedBy(MathHelper.Lerp(-rotation, rotation, (float)Main.rand.Next(0, 100) * 0.02f)) * .2f;                                     // Watch out for dividing by 0 if there is only 1 projectile.
                                    Vector2 starting       = new Vector2(him.Center.X + ((-200 + Main.rand.Next(0, 400)) * rainmeansmore), ((-150 + Main.rand.Next(0, 200)) * rainmeansmore) + him.Center.Y - Main.rand.Next(200, 540));
                                    int     proj           = Projectile.NewProjectile(starting.X, starting.Y, perturbedSpeed.X, perturbedSpeed.Y, ProjectileID.CultistBossLightningOrbArc, (int)((projectile.damage * 0.50f) * (1f - owner.manaSickReduction)), 15f, Main.player[projectile.owner].whoAmI, (him.Center - starting).ToRotation());
                                    Main.projectile[proj].friendly  = true;
                                    Main.projectile[proj].hostile   = false;
                                    Main.projectile[proj].penetrate = -1;
                                    Main.projectile[proj].timeLeft  = 300;
                                    //Main.projectile[proj].usesLocalNPCImmunity = true;
                                    Main.projectile[proj].localNPCHitCooldown = 8;
                                    Main.projectile[proj].thrown = true;
                                    IdgProjectile.Sync(proj);

                                    for (int q = 0; q < 50; q++)
                                    {
                                        int dust = Dust.NewDust(Main.projectile[proj].position - new Vector2(100, 0), 200, 12, DustID.Smoke, 0f, 0f, 100, Main.hslToRgb(0.6f, 0.8f, 0.28f), 4f);
                                        Main.dust[dust].noGravity = true;
                                        //Main.dust[dust].velocity *= 1.8f;
                                        //Main.dust[dust].velocity.Y -= 0.5f;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        public override void AI()
        {
            int DustID2 = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, mod.DustType("AcidDust"), projectile.velocity.X * 0.2f, projectile.velocity.Y * 0.2f, 20, default(Color), 1f);

            Main.dust[DustID2].noGravity = true;
            Player player = Main.player[projectile.owner];

            projectile.ai[1] += 1;
            if (player.dead)
            {
                projectile.Kill();
            }
            else
            {
                if ((projectile.ai[0] > 0 || player.statMana < 1) || !player.channel)
                {
                    projectile.ai[0] += 1;
                    if (projectile.ai[0] == 4)
                    {
                        for (int pro = 0; pro < Main.maxProjectiles; pro += 1)
                        {
                            Projectile proj = Main.projectile[pro];
                            if (proj.ai[0] == 0 && proj.type == ModContent.ProjectileType <AcidScepterVenom>() && proj.owner == projectile.owner)
                            {
                                proj.ai[0]     = 1;
                                proj.netUpdate = true;
                            }
                        }
                        projectile.Kill();
                    }
                }
                else
                {
                    projectile.timeLeft = 30;
                }
                if (projectile.ai[0] < 3)
                {
                    Vector2 mousePos = Main.MouseWorld;

                    if (projectile.owner == Main.myPlayer)
                    {
                        Vector2 diff = mousePos - player.Center;
                        diff.Normalize();
                        projectile.velocity  = diff;
                        projectile.direction = Main.MouseWorld.X > player.position.X ? 1 : -1;
                        projectile.netUpdate = true;
                        projectile.Center    = mousePos;
                    }
                    projectile.position -= projectile.Center;
                    int dir = projectile.direction;
                    player.ChangeDir(dir);
                    player.itemTime      = 40;
                    player.itemAnimation = 40;
                    float rotvalue = MathHelper.ToRadians(-90f + (float)Math.Sin(projectile.ai[1] / 10f) * 35f);
                    if (player.manaRegenDelay < 15)
                    {
                        player.manaRegenDelay = 15;
                    }
                    if (projectile.ai[0] > 0)
                    {
                        player.itemRotation = (float)Math.Atan2(projectile.velocity.Y * dir, projectile.velocity.X * dir);
                    }
                    else
                    {
                        player.itemRotation = MathHelper.ToRadians(-90f * player.direction + (float)Math.Sin(projectile.ai[1] / 10f) * 20f);

                        int counter = 0;

                        for (int pro = 0; pro < Main.maxProjectiles; pro += 1)
                        {
                            Projectile proj = Main.projectile[pro];
                            if (proj.ai[0] == 0 && proj.type == ModContent.ProjectileType <AcidScepterVenom>() && proj.owner == projectile.owner)
                            {
                                counter += 1;
                            }
                        }

                        if (projectile.ai[1] % 20 == 0 && projectile.ai[1] > 20 && counter < 10)
                        {
                            int thisoned = Projectile.NewProjectile(player.Center.X, player.Center.Y - 12, Main.rand.NextFloat(-1f, 1f), Main.rand.NextFloat(-1f, 1f), mod.ProjectileType("AcidScepterVenom"), projectile.damage, projectile.knockBack, Main.myPlayer);
                            IdgProjectile.Sync(thisoned);
                            Main.PlaySound(SoundID.Item, (int)player.Center.X, (int)player.Center.Y, 9, 0.25f, -0.25f);
                            player.CheckMana(player.HeldItem, 5, true);
                        }
                    }

                    projectile.Center    = (player.Center + rotvalue.ToRotationVector2() * 26f) + new Vector2(0, -24);
                    projectile.velocity *= 8f;
                }
            }
        }
Beispiel #15
0
        public override void AI()
        {
            Player player = Main.player[projectile.owner];

            if (player != null && player.active)
            {
                SGAPlayer modply = player.GetModPlayer <SGAPlayer>();

                if (projectile.ai[0] > 3000 || player.dead)
                {
                    projectile.Kill();
                }
                else
                {
                    Vector2 mousePos = Main.MouseWorld;

                    ///Holding

                    if (projectile.owner == Main.myPlayer)
                    {
                        Vector2 diff = mousePos - player.Center;
                        diff.Normalize();
                        if (player.channel && projectile.ai[0] < 200 && projectile.ai[1] < 1)
                        {
                            projectile.velocity  = diff;
                            projectile.direction = Main.MouseWorld.X > player.position.X ? 1 : -1;
                        }
                        projectile.netUpdate = true;
                    }

                    int dir = projectile.direction;
                    player.ChangeDir(dir);
                    projectile.direction = dir;

                    player.heldProj = projectile.whoAmI;

                    bool isholding = (player.channel && projectile.ai[0] < 200 && projectile.ai[1] < 1);

                    if (isholding)
                    {
                        player.itemRotation = (float)Math.Atan2(projectile.velocity.Y * dir, projectile.velocity.X * dir);
                        projectile.rotation = player.itemRotation - MathHelper.ToRadians(90);
                        projectile.timeLeft = cooldowntime;
                        projectile.ai[0]   += chargeuprate;
                        if ((int)projectile.ai[0] == (int)(chargeuprate * 3f))
                        {
                            Main.PlaySound(mod.GetLegacySoundSlot(SoundType.Custom, soundcharge).WithVolume(.7f).WithPitchVariance(.25f), projectile.Center);
                        }
                        //float speedzz = projectile.velocity.Length();
                        //projectile.velocity.Normalize();
                        //projectile.velocity*=(speedzz+0.05f);
                    }
                    projectile.Center    = (player.Center + new Vector2(dir * 6, 0)) + (projectile.velocity * 12f) - (projectile.velocity * (0.08f * projectile.ai[0]));
                    projectile.position -= projectile.velocity;
                    player.itemTime      = 2;
                    player.itemAnimation = 2;

                    //Projectiles



                    if (!isholding)
                    {
                        projectile.velocity /= 1.15f;

                        if (projectile.ai[1] < 1)
                        {
                            Vector2 position = projectile.Center;
                            Vector2 offset   = new Vector2(projectile.velocity.X, projectile.velocity.Y);
                            offset.Normalize();
                            offset *= 16f;
                            offset += projectile.velocity;

                            float damagescale = (projectile.damage * (1f + (projectile.ai[0] / 30f)));

                            Vector2 perturbedSpeed  = projectile.velocity.RotatedByRandom(MathHelper.ToRadians(0));
                            Vector2 perturbedSpeed2 = perturbedSpeed;
                            perturbedSpeed2.Normalize();
                            float basespeed = 1f + (GetType() == typeof(SBCCannonHoldingMK2) ? 0.4f : -0.4f);
                            float scale     = 1.5f + ((projectile.ai[0] / 30f) * basespeed);                    // - (Main.rand.NextFloat() * .2f);
                            perturbedSpeed  = perturbedSpeed * (scale * 4f);
                            perturbedSpeed += perturbedSpeed2;
                            offset         -= perturbedSpeed;
                            perturbedSpeed /= 2f;
                            int prog = Projectile.NewProjectile(position.X + offset.X, position.Y + offset.Y, perturbedSpeed.X, perturbedSpeed.Y, mod.ProjectileType("SBCBall"), (int)damagescale, projectile.knockBack, player.whoAmI, 0f, (float)projectile.damage);
                            IdgProjectile.Sync(prog);
                            Main.PlaySound(mod.GetLegacySoundSlot(SoundType.Custom, soundfire).WithVolume(.7f).WithPitchVariance(.25f), projectile.Center);
                        }


                        projectile.ai[1] = 1;
                    }
                }
            }
            else
            {
                projectile.Kill();
            }
        }
        private void OnHit(NPC npc, Player player, int damage, float knockback, bool crit, Item item, Projectile projectile, bool isproj = false)
        {
            SGAPlayer moddedplayer = player.GetModPlayer <SGAPlayer>();

            if (moddedplayer.HasGucciGauntlet())
            {
                if (player.ownedLargeGems[0] && Main.rand.Next(0, 10) == 0)
                {
                    npc.AddBuff(BuffID.ShadowFlame, 60 * 15);
                }
            }

            if (moddedplayer.flaskBuff != default && ((projectile != null && projectile.melee) || (item != null && item.melee)))
            {
                if (Main.rand.Next(0, moddedplayer.flaskBuff.Chance) == 0)
                {
                    npc.AddBuff(moddedplayer.flaskBuff.Debuff, moddedplayer.flaskBuff.Period);
                    moddedplayer.flaskBuff.OnRealHit(player, projectile, npc, damage);
                }
            }

            if (item != null && npc.life - damage < 1 && npc.lifeMax > 50)
            {
                if (item.type == mod.ItemType("Powerjack"))
                {
                    player.HealEffect(25, false);
                    player.netLife   = true;
                    player.statLife += 25;
                    if (player.statLife > player.statLifeMax2)
                    {
                        player.statLife = player.statLifeMax2;
                    }
                    NetMessage.SendData(66, -1, -1, null, player.whoAmI, (float)25f, 0f, 0f, 0, 0, 0);
                }
            }

            if (isproj)
            {
                if (projectile.minion && moddedplayer.IDGset)
                {
                    if (npc.immune[projectile.owner] > 0)
                    {
                        npc.immune[projectile.owner] = ((int)(npc.immune[projectile.owner] * 0.75f));
                    }

                    moddedplayer.digiStacks = Math.Min(moddedplayer.digiStacksMax, moddedplayer.digiStacks + (int)Math.Max((float)projectile.damage, (float)damage));
                }

                if (projectile.type == ProjectileID.CultistBossLightningOrbArc)
                {
                    immunitetolightning = projectile.localNPCHitCooldown;
                }

                bool trapdamage = false;
                if (projectile != null && projectile.trap)
                {
                    trapdamage = true;
                }


                if (trapdamage)
                {
                    if (moddedplayer.JaggedWoodenSpike)
                    {
                        if (Main.rand.Next(0, 100) < 15)
                        {
                            npc.AddBuff(mod.BuffType("MassiveBleeding"), 60 * 5);
                        }
                    }
                }

                if (moddedplayer.Mangroveset && player.ownedProjectileCounts[mod.ProjectileType("MangroveOrb")] < 4)
                {
                    if (crit && projectile.thrown)
                    {
                        player.AddBuff(BuffID.DryadsWard, 60 * 5);

                        int newDamage = damage;
                        if (newDamage > 50)
                        {
                            newDamage = 50 + (int)Math.Pow((damage - 50), 0.75f);
                        }

                        List <Projectile> itz = Idglib.Shattershots(player.Center, player.Center + (player.Center - npc.Center), new Vector2(0, 0), mod.ProjectileType("MangroveOrb"), newDamage, 8f, 120, 2, false, 0, false, 400);
                        //itz[0].damage = 30;
                        itz[0].owner = player.whoAmI; itz[0].friendly = true; itz[0].hostile = false;
                        itz[1].owner = player.whoAmI; itz[1].friendly = true; itz[1].hostile = false;
                        Main.projectile[itz[0].whoAmI].netUpdate = true;
                        Main.projectile[itz[1].whoAmI].netUpdate = true;

                        IdgProjectile.AddOnHitBuff(itz[0].whoAmI, BuffID.DryadsWardDebuff, 60 * 5);
                        IdgProjectile.AddOnHitBuff(itz[1].whoAmI, BuffID.DryadsWardDebuff, 60 * 5);

                        if (Main.netMode == 2 && itz[0].whoAmI < 200)
                        {
                            NetMessage.SendData(27, -1, -1, null, itz[0].whoAmI, 0f, 0f, 0f, 0, 0, 0);
                        }
                    }
                }
            }

            SGAWorld.overalldamagedone = ((int)damage) + SGAWorld.overalldamagedone;

            if (item != null)
            {
                if (moddedplayer.FieryheartBuff > 0)
                {
                    if (!npc.buffImmune[BuffID.Daybreak] || moddedplayer.FieryheartBuff > 15)
                    {
                        IdgNPC.AddBuffBypass(npc.whoAmI, 189, 1 * (20 + (int)(player.SGAPly().ExpertiseCollectedTotal / 250f)));
                    }
                }
            }

            if (projectile != null)
            {
                if (moddedplayer.FieryheartBuff > 0 && projectile.owner == player.whoAmI && projectile.friendly)
                {
                    if (!npc.buffImmune[BuffID.Daybreak] || moddedplayer.FieryheartBuff > 15)
                    {
                        IdgNPC.AddBuffBypass(npc.whoAmI, 189, 1 * (20 + (int)(player.SGAPly().ExpertiseCollectedTotal / 250f)));
                    }
                }
                if ((moddedplayer.CirnoWings) && projectile.owner == player.whoAmI)
                {
                    if (isproj && (projectile.magic == true && Main.rand.Next(0, 20) == 0) || projectile.coldDamage)
                    {
                        npc.AddBuff(BuffID.Frostburn, 4 * 60);
                    }
                }
                if ((moddedplayer.glacialStone) && projectile.owner == player.whoAmI && projectile.melee)
                {
                    if (isproj && projectile.melee == true)
                    {
                        npc.AddBuff(BuffID.Frostburn, Main.rand.Next(1, 6) * 60);
                    }
                }
            }

            if (moddedplayer.Redmanastar > 0)
            {
                if (isproj && projectile.magic == true)
                {
                    int[] buffids = { BuffID.OnFire, mod.BuffType("ThermalBlaze"), BuffID.Daybreak };
                    if (projectile != null && Main.rand.Next(0, 100) < 5)
                    {
                        npc.AddBuff(buffids[moddedplayer.Redmanastar - 1], 4 * 60);
                    }
                    if (projectile != null && Main.rand.Next(0, 100) < 1)
                    {
                        npc.buffImmune[buffids[moddedplayer.Redmanastar - 1]] = false;
                    }
                }
            }

            if (moddedplayer.SerratedTooth == true)
            {
                if (damage > npc.defense * 5)
                {
                    npc.AddBuff(mod.BuffType("MassiveBleeding"), Math.Min((int)(1f + ((float)damage - (float)npc.defense * 5f) * 0.02f) * 60, 60 * 5));
                }
            }

            if (moddedplayer.Blazewyrmset)
            {
                if (crit && ((item != null && item.melee && item.pick + item.axe + item.hammer < 1)) || (projectile != null && projectile.melee && (player.heldProj == projectile.whoAmI || (projectile.modProjectile != null && (projectile.modProjectile is IShieldBashProjectile || projectile.modProjectile is ITrueMeleeProjectile)))))
                {
                    if (player.SGAPly().AddCooldownStack(12 * 60))
                    {
                        Main.PlaySound(SoundID.Item45, npc.Center);
                        Projectile.NewProjectile(npc.Center.X, npc.Center.Y, 0f, 0f, mod.ProjectileType("BoulderBlast"), damage * 3, knockback * 3f, player.whoAmI, 0f, 0f);
                    }
                }
            }

            if (moddedplayer.alkalescentHeart)
            {
                int[] maxcrit = { player.meleeCrit, player.rangedCrit, player.magicCrit, player.Throwing().thrownCrit };
                Array.Sort(maxcrit);
                Array.Reverse(maxcrit);
                if (crit || (projectile != null && projectile.minion && Main.rand.Next(0, 100) < maxcrit[0]))
                {
                    Point point = new Point(0, 0);
                    point.X = (!npc.HasBuff(BuffID.Poisoned) ? BuffID.Poisoned : (!npc.HasBuff(BuffID.Venom) ? BuffID.Venom : (!npc.HasBuff(ModContent.BuffType <AcidBurn>()) ? ModContent.BuffType <AcidBurn>() : -1)));
                    if (point.X > -1)
                    {
                        point.Y = (point.X == ModContent.BuffType <AcidBurn>() ? 45 : point.X == BuffID.Venom ? 200 : point.X == BuffID.Poisoned ? 300 : 0);
                        npc.AddBuff(point.X, point.Y);
                        //if (Main.rand.Next(0, 10) == 0)
                        //	player.AddBuff(point.X, point.Y/2);
                    }
                }
            }

            bool hasabuff = false;

            if (npc.HasBuff(BuffID.OnFire))
            {
                hasabuff = true;
            }
            for (int i = 0; i < SGAmod.otherimmunes.Length; i++)
            {
                if (npc.HasBuff(SGAmod.otherimmunes[i]))
                {
                    hasabuff = true;
                }
            }


            if (DosedInGas && hasabuff)
            {
                Combusted = 60 * 6;
                int buff = npc.FindBuffIndex(mod.BuffType("DosedInGas"));

                if ((isproj && Main.player[projectile.owner].GetModPlayer <SGAPlayer>().MVMBoost) || (item != null && player.GetModPlayer <SGAPlayer>().MVMBoost))
                {
                    int prog = Projectile.NewProjectile(npc.Center.X, npc.Center.Y, Vector2.Zero.X, Vector2.Zero.Y, ProjectileID.GrenadeIII, 350, 5f, player.whoAmI);
                    Main.projectile[prog].thrown = false; Main.projectile[prog].ranged = false; Main.projectile[prog].timeLeft = 2; Main.projectile[prog].netUpdate = true;
                    IdgProjectile.Sync(prog);
                }


                if (buff > -1)
                {
                    npc.DelBuff(buff);
                    IdgNPC.AddBuffBypass(npc.whoAmI, BuffID.OnFire, 60 * 10);
                }
            }

            if (player != null && player.SGAPly().toxicity > 0 && npc.HasBuff(BuffID.Stinky))
            {
                if (Main.rand.Next(0, 50) == 0)
                {
                    SGAPlayer.SwearExplosion(npc.Center, player, (int)(damage * 0.5f));
                }
            }

            /*if (PinkyMinion>0)
             * {
             *      if ((npc.life-damage)<1 && ((projectile.penetrate<5 && projectile.penetrate >= 0) || projectile == null))
             *      {
             *              NPC[] findnpc = SGAUtils.ClosestEnemies(npc.Center, 1500, checkWalls: false, checkCanChase: false)?.ToArray();
             *              findnpc = findnpc != null ? findnpc.Where(testby => testby.type == ModContent.NPCType<NPCs.SPinkyTrue>()).ToArray() : null;
             *
             *              if (findnpc != null && findnpc.Count()>0 && findnpc[0].type == ModContent.NPCType<NPCs.SPinkyTrue>())
             *              Projectile.NewProjectile(npc.Center, Vector2.Normalize(findnpc[0].Center - npc.Center) * 10f, ModContent.ProjectileType<NPCs.PinkyMinionKilledProj>(), 500, 0);
             *      }
             * }*/
        }
Beispiel #17
0
        public override void Explode()
        {
            chargeup += 1;

            if (projectile.timeLeft == timeleftfirerate && projectile.ai[0] > 0)
            {
                Player owner = Main.player[projectile.owner];

                if (owner != null && !owner.dead && owner.channel)
                {
                    everyother += 1;
                    everyother %= 3;

                    Vector2 gotohere = new Vector2();
                    gotohere = projectile.velocity;                    //Main.MouseScreen - projectile.Center;
                    gotohere.Normalize();

                    float accuracy = Math.Max(0.005f, 1f - ((chargeup) / 500f));

                    Vector2 perturbedSpeed = new Vector2(gotohere.X, gotohere.Y).RotatedByRandom(MathHelper.ToRadians(0)) * projectile.velocity.Length();

                    for (int i = 2; i < 8; i += 1)
                    {
                        int proj = Projectile.NewProjectile(new Vector2(projectile.Center.X, projectile.Center.Y), (new Vector2(perturbedSpeed.X, perturbedSpeed.Y) * 2f).RotatedByRandom((MathHelper.ToRadians((i * 75))) * accuracy).RotatedByRandom(MathHelper.ToRadians(160f) * accuracy), mod.ProjectileType("RainbowBolt"), (int)((projectile.damage * 0.60f) * damagescale), projectile.knockBack / 10f, owner.whoAmI);
                        Main.projectile[proj].magic  = true;
                        Main.projectile[proj].minion = false;
                        IdgProjectile.Sync(proj);
                    }


                    if (everyother == 2)
                    {
                        Vector2 backthere = new Vector2(-100, 0).RotatedByRandom(MathHelper.ToRadians(80));

                        //int proj2 = Projectile.NewProjectile(backthere, gohere, mod.ProjectileType("ProjectilePortalRealityShaperHit"), (int)(projectile.damage * damagescale), projectile.knockBack / 10f, owner.whoAmI, mod.ProjectileType("HotRound"));

                        Func <Vector2, Vector2, float, float, Projectile, float> projectilefacingmore = delegate(Vector2 playerpos, Vector2 projpos, float time, float current, Projectile proj)
                        {
                            float val = current;
                            if (projectile.active)
                            {
                                if (time < 100)
                                {
                                    val = current.AngleLerp(projectile.velocity.ToRotation() + proj.ai[1], 0.15f);
                                }
                                else
                                {
                                    val = current.AngleLerp(projectile.velocity.ToRotation() + proj.ai[1], 0.05f);
                                }
                            }
                            return(val);
                        };
                        Func <Vector2, Vector2, float, Vector2, Projectile, Vector2> projectilemovingmore = delegate(Vector2 playerpos, Vector2 projpos, float time, Vector2 current, Projectile proj)
                        {
                            if (projectile.active)
                            {
                                Vector2 normspeed = projectile.velocity;
                                normspeed.Normalize();

                                Vector2 gothere333 = (playerpos + backthere.RotatedBy(projectile.velocity.ToRotation())) - normspeed * 128f;
                                Vector2 slideover  = gothere333 - projpos;
                                current = slideover / 2f;
                            }

                            current /= 1.125f;
                            if (projectile.active)
                            {
                                Vector2 speedz = current;
                                float   spzzed = speedz.Length();
                                speedz.Normalize();
                                if (spzzed > 100f)
                                {
                                    current = (speedz * spzzed);
                                }
                            }
                            else
                            {
                                proj.timeLeft = Math.Min(proj.timeLeft, 20);
                            }

                            return(current);
                        };

                        Func <float, bool> projectilepattern = (time) => (time == 20);

                        int ize2 = ParadoxMirror.SummonMirror(owner.Center, Vector2.Zero, (int)((projectile.damage * 3) * damagescale), 200, projectile.velocity.ToRotation(), mod.ProjectileType("HellionBeam"), projectilepattern, 2.5f, 145, true);
                        (Main.projectile[ize2].modProjectile as ParadoxMirror).projectilefacingmore = projectilefacingmore;
                        (Main.projectile[ize2].modProjectile as ParadoxMirror).projectilemovingmore = projectilemovingmore;
                        Main.PlaySound(SoundID.Item, (int)Main.projectile[ize2].position.X, (int)Main.projectile[ize2].position.Y, 33, 0.25f, 0.5f);
                        Main.projectile[ize2].owner                = projectile.owner;
                        Main.projectile[ize2].aiStyle              = -2;
                        Main.projectile[ize2].ai[1]                = Main.rand.NextFloat(-MathHelper.ToRadians(20), MathHelper.ToRadians(20));
                        Main.projectile[ize2].friendly             = true;
                        Main.projectile[ize2].hostile              = false;
                        Main.projectile[ize2].usesLocalNPCImmunity = true;
                        Main.projectile[ize2].localNPCHitCooldown  = 15;
                        Main.projectile[ize2].netUpdate            = true;


                        IdgProjectile.Sync(ize2);
                    }
                }
            }
        }
        public override bool Shoot(Player player, ref Vector2 position, ref float speedX, ref float speedY, ref int type, ref int damage, ref float knockBack)
        {
            Vector2 normalizedspeed = new Vector2(speedX, speedY);

            normalizedspeed.Normalize();
            bool  melee   = true;
            float basemul = item.shootSpeed;

            if (player.altFunctionUse == 2)
            {
                normalizedspeed   *= (Throwspeed * player.Throwing().thrownVelocity);
                normalizedspeed.Y -= Math.Abs(normalizedspeed.Y * 0.1f);
                Vector2 perturbedSpeed = new Vector2(normalizedspeed.X, normalizedspeed.Y).RotatedByRandom(MathHelper.ToRadians(10));
                float   scale          = 1f - (Main.rand.NextFloat() * .01f);
                perturbedSpeed = perturbedSpeed * scale;
                speedX         = normalizedspeed.X; speedY = normalizedspeed.Y;
                item.useStyle  = 1;
                type           = mod.ProjectileType("JavelinProj");
                melee          = false;
            }
            else
            {
                normalizedspeed *= Stabspeed * basemul;
                Vector2 perturbedSpeed = new Vector2(normalizedspeed.X, normalizedspeed.Y).RotatedByRandom(MathHelper.ToRadians(10));
                float   scale          = 1f - (Main.rand.NextFloat() * .01f);
                perturbedSpeed = perturbedSpeed * scale;
                item.useStyle  = 5;
                if (player.SGAPly().jabALot)
                {
                    normalizedspeed = normalizedspeed.RotatedByRandom(MathHelper.Pi * 0.25f);
                }

                speedX = normalizedspeed.X; speedY = normalizedspeed.Y;
                type   = mod.ProjectileType("JavelinProjMelee");
            }

            int thisoned = Projectile.NewProjectile(position.X, position.Y, speedX, speedY, type, damage, knockBack, Main.myPlayer);

            Main.projectile[thisoned].ai[1]             = Speartype;
            Main.projectile[thisoned].melee             = melee;
            Main.projectile[thisoned].Throwing().thrown = !melee;
            if (player.altFunctionUse == 2 && Speartype == 7)
            {
                Main.projectile[thisoned].aiStyle = 18;
            }
            if (player.altFunctionUse == 2)
            {
                (Main.projectile[thisoned].modProjectile as JavelinProj).maxstick    += (player.GetModPlayer <SGAPlayer>().JavelinSpearHeadBundle ? 1 : 0);
                (Main.projectile[thisoned].modProjectile as JavelinProj).maxStickTime = PierceTimer;
            }

            Main.projectile[thisoned].netUpdate = true;
            if (!melee)
            {
                Main.projectile[thisoned].penetrate = Penetrate;
            }
            IdgProjectile.Sync(thisoned);

            if (player.altFunctionUse == 2)
            {
                OnThrow(1, player, ref position, ref speedX, ref speedY, ref type, ref damage, ref knockBack, (Main.projectile[thisoned].modProjectile as JavelinProj));
            }
            else
            {
                OnThrow(0, player, ref position, ref speedX, ref speedY, ref type, ref damage, ref knockBack, (Main.projectile[thisoned].modProjectile as JavelinProj));
            }

            return(false);
        }
        public virtual void OrderOfTheCrates(Player P)
        {
            if (firstTimeSetup)
            {
                for (int layer = 0; layer < phase; layer++)
                {
                    Cratesperlayer[layer] = 4 + (layer * 4);
                    List <CratrosityInstancedCrate> cratesInThisLayer = new List <CratrosityInstancedCrate>();

                    for (int i = 0; i < Cratesperlayer[layer]; i = i + 1)
                    {
                        int crateType = ItemID.WoodenCrate;
                        if (layer == 3)
                        {
                            crateType = ItemID.IronCrate;
                            if (npc.ai[3] > 300000 && i % 2 == 0)
                            {
                                crateType = ModContent.ItemType <HavocGear.Items.DankCrate>();
                            }
                            else if (npc.ai[3] > 100000 && i % 2 == 0)
                            {
                                crateType = ItemID.HallowedFishingCrate;
                            }
                            else
                            {
                                if (npc.ai[3] < -100000 && i % 2 == 0)
                                {
                                    crateType = EvilCrateType;
                                }
                            }
                        }
                        if (layer == 2)
                        {
                            crateType = (i % 2 == 0) ? ItemID.JungleFishingCrate : ItemID.DungeonFishingCrate;
                        }
                        if (layer == 1)
                        {
                            crateType = (i % 2 == 0) ? ItemID.HallowedFishingCrate : (EvilCrateType);
                        }
                        if (layer == 0)
                        {
                            crateType = ItemID.FloatingIslandFishingCrate;
                        }
                        cratesInThisLayer.Add(new CratrosityInstancedCrate(this, crateType, 8, layer));
                    }
                    cratesPerRing.Add(cratesInThisLayer);
                }
                firstTimeSetup = false;
            }


            nonaispin    = nonaispin + 1f;
            compressvar += (compressvargoal - compressvar) / 20;
            float themaxdist = 99999f;

            for (int layer = 0; layer < phase; layer++)
            {
                for (int index = 0; index < cratesPerRing[layer].Count; index++)
                {
                    CratrosityInstancedCrate crate = cratesPerRing[layer][index];

                    if (!crate.Update())
                    {
                        continue;
                    }

                    crate.crateAngle = (layer % 2 == 0 ? 1 : -1) * ((nonaispin * 0.01f) * (1f + layer / 3f)) + MathHelper.TwoPi * ((index / (float)cratesPerRing[layer].Count));
                    crate.crateDist  = compressvar * 20f + ((float)layer * 20f) * compressvar;
                    //Cratesangle[a, i] = (a % 2 == 0 ? 1 : -1) * ((nonaispin * 0.01f) * (1f + a / 3f)) + 2.0 * Math.PI * ((i / (double)Cratesperlayer[a]));
                    //Cratesdist[a, i] = compressvar * 20f + ((float)a * 20f) * compressvar;

                    float theexpand = 0f;

                    if (themode > 0)
                    {
                        theexpand = (((index / 1f) * (layer + 1f))) * (themode / 30f);
                    }

                    crate.crateVector += ((crate.crateDist * (new Vector2((float)Math.Cos(crate.crateAngle), (float)Math.Sin(crate.crateAngle))) + npc.Center) - crate.crateVector) / (theexpand + (Math.Max((((compressvar) - 1) * (2 + (layer * 1))), 1)));
                    //if (index)
                    //crate.crateVector += Main.rand.NextVector2Circular(32, 32);

                    float sinner  = npc.ai[0] + ((float)(index * 5) + (layer * 14));
                    float sinner2 = (float)(10f + (Math.Sin(sinner / 30f) * 7f));

                    if (compressvar > 1.01)
                    {
                        int[]   projtype   = { ModContent.ProjectileType <GlowingPlatinumCoin>(), ModContent.ProjectileType <GlowingPlatinumCoin>(), ModContent.ProjectileType <GlowingPlatinumCoin>(), ModContent.ProjectileType <GlowingGoldCoin>(), ModContent.ProjectileType <GlowingSilverCoin>(), ModContent.ProjectileType <GlowingCopperCoin>() };
                        int[]   projdamage = { 60, 50, 40, 30, 20, 10 };
                        float[] projspeed  = { 1f, 1f, 1f, 9f, 8f, 7f };
                        if (layer == phase - 1)
                        {
                            if (sinner2 < 4 && (npc.ai[0] + (index * 4)) % 30 == 0)
                            {
                                List <Projectile> itz = Idglib.Shattershots(crate.crateVector, P.position, new Vector2(P.width, P.height), projtype[layer + 1], (int)((double)npc.damage * ((double)projdamage[layer + 1] / (double)defaultdamage)), projspeed[layer + 1], 0, 1, true, 0, false, 110);
                                if (projtype[layer + 1] == ModContent.ProjectileType <GlowingPlatinumCoin>())
                                {
                                    itz[0].aiStyle = 18; IdgProjectile.AddOnHitBuff(itz[0].whoAmI, BuffID.ShadowFlame, 60 * 10);
                                }
                            }
                        }

                        crate.crateVector += ((P.Center - crate.crateVector) / (sinner2)) * ((Math.Max(compressvar - 1, 0) * 1));
                    }
                    float dist = (P.Center - crate.crateVector).Length();
                    if (dist < themaxdist)
                    {
                        themaxdist       = dist;
                        theclostestcrate = crate.crateVector;
                    }
                }
            }
        }
        public void DoApoco(NPC npc, Projectile projectile, Player player, Item item, ref int damage, ref float knockback, ref bool crit, int bitBoldedEffects = 7, bool always = false)
        {
            bool effectSound     = (bitBoldedEffects & (1 << 1 - 1)) != 0;
            bool effectText      = (bitBoldedEffects & (1 << 2 - 1)) != 0;
            bool effectShockwave = (bitBoldedEffects & (1 << 3 - 1)) != 0;

            SGAPlayer moddedplayer = player.GetModPlayer <SGAPlayer>();
            int       chance       = -1;

            if (projectile != null)
            {
                if (projectile.melee)
                {
                    chance = 0;
                }
                if (projectile.ranged)
                {
                    chance = 1;
                }
                if (projectile.magic)
                {
                    chance = 2;
                }
                if (projectile.thrown || projectile.Throwing().thrown)
                {
                    chance = 3;
                }
            }
            if (item != null)
            {
                if (item.melee)
                {
                    chance = 0;
                }
                if (item.ranged)
                {
                    chance = 1;
                }
                if (item.magic)
                {
                    chance = 2;
                }
                if (item.thrown || item.Throwing().thrown)
                {
                    chance = 3;
                }
            }
            if (npc != null && (always || chance > -1))
            {
                double chanceboost = 0;
                if (projectile != null)
                {
                    chanceboost += projectile.GetGlobalProjectile <SGAprojectile>().extraApocoChance;
                }

                if (always || (crit && Main.rand.Next(0, 100) < (moddedplayer.apocalypticalChance[chance] + chanceboost)))
                {
                    if (moddedplayer.HoE && projectile != null)
                    {
                        float ammount = damage;
                        if (moddedplayer.lifestealentropy > 0)
                        {
                            projectile.vampireHeal((int)((ammount * moddedplayer.apocalypticalStrength)), npc.Center);
                            moddedplayer.lifestealentropy -= ammount;
                        }
                    }

                    if (moddedplayer.ninjaSash > 2)
                    {
                        for (int i = 0; i < Main.maxProjectiles; i += 1)
                        {
                            Projectile proj = Main.projectile[i];
                            if (proj.active && proj.owner == player.whoAmI)
                            {
                                if (proj.Throwing().thrown || proj.thrown)
                                {
                                    proj.SGAProj().Embue(projectile);
                                }
                            }
                        }
                    }

                    if (moddedplayer.SybariteGem)
                    {
                        float mul     = moddedplayer.apocalypticalStrength * (((float)damage * 3f) / (float)npc.lifeMax);
                        int   ammount = (int)((float)npc.value * mul);


                        Vector2 pos = new Vector2((int)npc.position.X, (int)npc.position.Y);
                        pos += new Vector2(Main.rand.Next(npc.width), Main.rand.Next(npc.height));
                        SGAUtils.SpawnCoins(pos, ammount, 10f + Math.Min(3f * mul, 20f));
                    }

                    if (moddedplayer.dualityshades)
                    {
                        int ammo = 0;
                        for (int i = 0; i < 4; i += 1)
                        {
                            if (moddedplayer.ammoinboxes[i] > 0)
                            {
                                int  ammox = moddedplayer.ammoinboxes[i];
                                Item itemx = new Item();
                                itemx.SetDefaults(ammox);
                                if (itemx.ammo == AmmoID.Bullet)
                                {
                                    ammo = ammox;
                                    break;
                                }
                            }
                        }
                        if (ammo > 0)
                        {
                            Item itemy = new Item();
                            itemy.SetDefaults(ammo);
                            int shootype = itemy.shoot;

                            for (int i = 128; i < 260; i += 128)
                            {
                                Vector2 anglez = new Vector2(Main.rand.Next(-8000, 8000), Main.rand.Next(-8000, 8000));
                                anglez.Normalize();

                                Main.PlaySound(SoundID.Item, (int)((npc.Center.X) + (anglez.X * i)), (int)((npc.Center.Y) + (anglez.Y * i)), 25, 0.5f, Main.rand.NextFloat(-0.9f, -0.25f));

                                int thisoned = Projectile.NewProjectile(npc.Center + (anglez * i), anglez * -16f, shootype, (int)(damage * 1.50f * moddedplayer.apocalypticalStrength), 0f, Main.myPlayer);
                                Main.projectile[thisoned].ranged = false;


                                for (float gg = 4f; gg > 0.25f; gg -= 0.15f)
                                {
                                    int  dustIndex = Dust.NewDust(npc.Center + new Vector2(-8, -8) + (anglez * i), 16, 16, DustID.AncientLight, -anglez.X * gg, -anglez.Y * gg, 150, Color.Purple, 3f);
                                    Dust dust      = Main.dust[dustIndex];
                                    dust.noGravity = true;
                                }

                                player.ConsumeItemRespectInfiniteAmmoTypes(ammo);
                            }
                        }
                    }

                    if (moddedplayer.RadSuit)
                    {
                        //IrradiatedAmmount = Math.Max(IrradiatedAmmount, 25);

                        IrradiatedExplosion(npc, (int)(damage * 1f * moddedplayer.apocalypticalStrength));

                        SoundEffectInstance sound = Main.PlaySound(SoundID.DD2_DarkMageHealImpact, (int)npc.Center.X, (int)npc.Center.Y);
                        if (sound != null)
                        {
                            sound.Pitch += 0.525f;
                        }

                        int proj;

                        if (projectile != null)
                        {
                            proj = Projectile.NewProjectile(projectile.Center, Vector2.Zero, ModContent.ProjectileType <RadioactivePool>(), (int)(damage * 0.5f * moddedplayer.apocalypticalStrength), projectile.knockBack, projectile.owner);
                        }
                        else
                        {
                            proj = Projectile.NewProjectile(npc.Center, Vector2.Zero, ModContent.ProjectileType <RadioactivePool>(), (int)(damage * 0.5f * moddedplayer.apocalypticalStrength), knockback, player.whoAmI);
                        }

                        Main.projectile[proj].width    += 80;
                        Main.projectile[proj].height   += 80;
                        Main.projectile[proj].timeLeft += (int)(30 * moddedplayer.apocalypticalStrength);
                        Main.projectile[proj].Center   -= new Vector2(40, 40);
                        Main.projectile[proj].netUpdate = true;
                    }

                    if (moddedplayer.CalamityRune)
                    {
                        Main.PlaySound(SoundID.Item45, npc.Center);
                        int boom = Projectile.NewProjectile(npc.Center.X, npc.Center.Y, 0f, 0f, mod.ProjectileType("BoulderBlast"), (int)((damage * 2) * moddedplayer.apocalypticalStrength), knockback * 2f, player.whoAmI, 0f, 0f);
                        Main.projectile[boom].usesLocalNPCImmunity = true;
                        Main.projectile[boom].localNPCHitCooldown  = -1;
                        Main.projectile[boom].netUpdate            = true;
                        IdgProjectile.AddOnHitBuff(boom, BuffID.Daybreak, (int)(60f * moddedplayer.apocalypticalStrength));
                        IdgProjectile.AddOnHitBuff(boom, mod.BuffType("EverlastingSuffering"), (int)(400f * moddedplayer.apocalypticalStrength));
                    }

                    damage = (int)(damage * (3f + (moddedplayer.apocalypticalStrength - 1f)));

                    if (moddedplayer.magatsuSet && npc.HasBuff(ModContent.BuffType <Watched>()))
                    {
                        Projectile.NewProjectile(npc.Center, Vector2.Zero, ModContent.ProjectileType <Items.Armors.Magatsu.ExplosionDarkSectorEye>(), 0, 0);

                        Point location;

                        if (projectile != null)
                        {
                            location = new Point((int)projectile.Center.X, (int)projectile.Center.Y);
                        }
                        else
                        {
                            location = new Point((int)npc.Center.X, (int)npc.Center.Y);
                        }

                        SoundEffectInstance sound = Main.PlaySound(SoundID.DD2_WyvernScream, (int)location.X, (int)location.Y);
                        if (sound != null)
                        {
                            sound.Pitch = 0.925f;
                        }

                        foreach (NPC enemy in Main.npc.Where(testby => testby.active && !testby.dontTakeDamage && !testby.friendly && testby != npc && (testby.Center - npc.Center).LengthSquared() < 400 * 400))
                        {
                            int damazz = Main.DamageVar(damage);
                            enemy.StrikeNPC(damazz, 16, -enemy.spriteDirection, true);

                            if (Main.netMode != 0)
                            {
                                NetMessage.SendData(MessageID.StrikeNPC, -1, -1, null, npc.whoAmI, damazz, 16f, (float)1, 0, 0, 0);
                            }
                        }
                    }

                    if (effectText)
                    {
                        CombatText.NewText(new Rectangle((int)npc.position.X, (int)npc.position.Y, npc.width, npc.height), Color.DarkRed, "Apocalyptical!", true, false);
                    }
                    if (SGAConfigClient.Instance.EpicApocalypticals)
                    {
                        if (effectShockwave)
                        {
                            RippleBoom.MakeShockwave(npc.Center, 8f, 1f, 10f, 60, 1f);
                            if (SGAmod.ScreenShake < 32)
                            {
                                SGAmod.AddScreenShake(24f, 1200, player.Center);
                            }
                        }
                        if (effectSound)
                        {
                            Main.PlaySound(mod.GetLegacySoundSlot(SoundType.Custom, "Sounds/Custom/crit_hit").WithVolume(.7f).WithPitchVariance(.25f), npc.Center);
                        }
                    }
                }
            }
        }
        public static void JavelinOnHit(NPC target, Projectile projectile, ref double damage)
        {
            if (projectile.ai[1] == (int)JavelinType.Ice)//Ice
            {
                if (Main.rand.Next(0, 4) == 1)
                {
                    target.AddBuff(BuffID.Frostburn, 60 * (projectile.type == ModContent.ProjectileType <JavelinProj>() ? 2 : 3));
                }
            }
            if (projectile.ai[1] == (int)JavelinType.Dynasty)//Dynasty
            {
                if (projectile.penetrate > 1)
                {
                    int thisoned = Projectile.NewProjectile(projectile.Center.X + Main.rand.NextFloat(-64, 64), projectile.Center.Y - 800, Main.rand.NextFloat(-2, 2), 14f, projectile.type, projectile.damage, projectile.knockBack, Main.player[projectile.owner].whoAmI);
                    Main.projectile[thisoned].ai[1]             = projectile.ai[1];
                    Main.projectile[thisoned].Throwing().thrown = true;
                    Main.projectile[thisoned].penetrate         = projectile.penetrate - 1;
                    Main.projectile[thisoned].netUpdate         = true;
                }
            }

            if (projectile.ai[1] == (int)JavelinType.Hallowed)//Hallow
            {
                if (Main.rand.Next(0, projectile.modProjectile.GetType() == typeof(JavelinProjMelee) ? 2 : 0) == 0)
                {
                    int thisoned = Projectile.NewProjectile(projectile.Center.X + Main.rand.NextFloat(-64, 64), projectile.Center.Y - 800, Main.rand.NextFloat(-2, 2), 14f, ProjectileID.HallowStar, (int)(projectile.damage * damage), projectile.knockBack, projectile.owner);
                    Main.projectile[thisoned].Throwing().thrown = true;
                    Main.projectile[thisoned].penetrate         = 2;
                    Main.projectile[thisoned].netUpdate         = true;
                    IdgProjectile.Sync(thisoned);
                    NetMessage.SendData(MessageID.SyncProjectile, -1, -1, null, thisoned);
                }
            }
            if (projectile.ai[1] == (int)JavelinType.Shadow)//Shadow
            {
                if (Main.rand.Next(0, 4) == 1)
                {
                    target.AddBuff(BuffID.ShadowFlame, 60 * (projectile.type == ModContent.ProjectileType <JavelinProj>() ? 3 : 5));
                }
            }
            if (projectile.ai[1] == (int)JavelinType.SanguineBident)//Sanguine Bident
            {
                int bleed = ModContent.BuffType <MassiveBleeding>();
                if (target.buffImmune[BuffID.Bleeding])
                {
                    damage += 0.25;
                }

                if (projectile.modProjectile.GetType() == typeof(JavelinProj))
                {
                    if (target.active && target.life > 0 && Main.rand.Next(0, 12) < (target.HasBuff(bleed) || target.HasBuff(BuffID.Bleeding) ? 8 : 1))
                    {
                        projectile.vampireHeal((int)(projectile.damage / 2f), projectile.Center);
                    }
                }
                else
                {
                    target.AddBuff(ModContent.BuffType <MassiveBleeding>(), 60 * 5);
                }
                projectile.netUpdate = true;
            }
            if (projectile.ai[1] == (int)JavelinType.TerraTrident)//Terra Trident
            {
                if (projectile.modProjectile.GetType() == typeof(JavelinProj))
                {
                    Main.PlaySound(SoundID.Item, (int)projectile.Center.X, (int)projectile.Center.Y, 60, 0.6f, 0.25f);
                    Vector2 velo = projectile.velocity; velo.Normalize();
                    int     prog = Projectile.NewProjectile(projectile.Center.X + (velo.X * 20f), projectile.Center.Y + (velo.Y * 20f), velo.X * 6f, velo.Y * 6f, SGAmod.Instance.ProjectileType("TerraTridentProj"), (int)(projectile.damage * 0.75), projectile.knockBack / 2f, Main.myPlayer);
                    Main.projectile[prog].penetrate         = 3;
                    Main.projectile[prog].timeLeft         /= 4;
                    Main.projectile[prog].melee             = false;
                    Main.projectile[prog].Throwing().thrown = true;
                    Main.projectile[prog].netUpdate         = true;
                    IdgProjectile.Sync(prog);
                    NetMessage.SendData(MessageID.SyncProjectile, -1, -1, null, prog);
                }
            }
            if (projectile.ai[1] == (int)JavelinType.CrimsonCatastrophe)//Crimson Catastrophe
            {
                int bleed = ModContent.BuffType <MassiveBleeding>();
                if (target.buffImmune[BuffID.Bleeding])
                {
                    damage += 0.50;
                }

                ModProjectile modproj = projectile.modProjectile;
                if (modproj.GetType() == typeof(JavelinProj))
                {
                    (modproj as JavelinProj).maxStickTime = (int)((modproj as JavelinProj).maxStickTime / 1.25);
                    foreach (NPC enemy in Main.npc.Where(enemy => enemy.active && enemy.active && enemy.life > 0 && !enemy.friendly && !enemy.dontTakeDamage && enemy.Distance(projectile.Center) < 500 && (modproj as JavelinProj).stickin != enemy.whoAmI && enemy.HasBuff(bleed)))
                    {
                        CrimsonCatastrophe.BloodyExplosion(enemy, projectile);
                    }
                }
                else
                {
                    target.AddBuff(bleed, 60 * 5);
                }
                projectile.netUpdate = true;
            }
            if (projectile.ai[1] == (int)JavelinType.Thermal)//Thermal
            {
                target.AddBuff(ModContent.BuffType <ThermalBlaze>(), 60 * (projectile.type == ModContent.ProjectileType <JavelinProj>() ? 2 : 5));
            }
            if (projectile.ai[1] == (int)JavelinType.SwampSovnya)//Swamp Sovnya
            {
                if (!target.buffImmune[BuffID.Poisoned])
                {
                    ModProjectile modproj = projectile.modProjectile;
                    if (modproj.GetType() == typeof(JavelinProj))
                    {
                        if (Main.rand.Next(0, 100) < 50 && !target.boss)
                        {
                            target.AddBuff(ModContent.BuffType <DankSlow>(), (int)(60 * 3f));
                        }
                    }
                }
                else
                {
                    damage += 0.25f;
                }
            }
        }
        public override void AI()
        {
            Vector2 positiondust = Vector2.Normalize(new Vector2(projectile.velocity.X, projectile.velocity.Y)) * 8f;
            Player  owner        = Main.player[projectile.owner];

            if (projectile.ai[0] < 1f && owner.direction != 1)
            {
                projectile.rotation *= -1f;
            }

            projectile.ai[0] += 1;

            projectile.velocity = new Vector2(0f, owner.itemAnimation > 12 ? -16f : 0);
            projectile.Center   = owner.Center + new Vector2(-24f + (owner.direction == 1 ? 10f : -5f), -16f);
            if (owner.itemAnimation < 8)
            {
                projectile.Center += new Vector2(0, (int)((8.0 - (double)owner.itemAnimation) * 2.5));
            }
            if (owner.itemAnimation < 1)
            {
                projectile.Kill();
            }


            //if (owner.timeLeft < 2)
            //	projectile.Kill();


            projectile.rotation += (((float)(Math.PI / -4.0)) - projectile.rotation) / 6f;
            if (projectile.timeLeft == 110)
            {
                int dist        = 1200 * 1200;
                int nummaxbolts = 5;
                foreach (NPC him in Main.npc.Where(testby => testby.active && (testby.GetGlobalNPC <SGAnpcs>().InfinityWarStormbreakerint > -0 || testby.GetGlobalNPC <SGAnpcs>().DosedInGas || testby.dripping) && (testby.Center - owner.Center).LengthSquared() < dist).OrderBy(testby => (testby.Center - owner.Center).LengthSquared()).Take(nummaxbolts))
                {
                    if (owner.SGAPly().ConsumeElectricCharge(100, 150))
                    {
                        int rainmeansmore = (Main.raining || owner.GetModPlayer <SGAPlayer>().devempowerment[1] > 0) ? 2 : 0;

                        for (int x = 0; x < rainmeansmore + 1; x++)
                        {
                            float   rotation       = MathHelper.ToRadians(5);
                            Vector2 speed          = new Vector2(0f, 72f);
                            Vector2 perturbedSpeed = speed.RotatedBy(MathHelper.Lerp(-rotation, rotation, (float)Main.rand.Next(0, 100) * 0.02f)) * .2f;                             // Watch out for dividing by 0 if there is only 1 projectile.
                            Vector2 starting       = new Vector2(him.Center.X + ((-200 + Main.rand.Next(0, 400)) * rainmeansmore), ((-150 + Main.rand.Next(0, 200)) * rainmeansmore) + him.Center.Y - Main.rand.Next(200, 540));
                            int     proj           = Projectile.NewProjectile(starting.X, starting.Y, perturbedSpeed.X, perturbedSpeed.Y, ProjectileID.CultistBossLightningOrbArc, (int)((projectile.damage * 0.75f) * (1f - owner.manaSickReduction)), 15f, Main.player[projectile.owner].whoAmI, (him.Center - starting).ToRotation());
                            Main.projectile[proj].friendly  = true;
                            Main.projectile[proj].hostile   = false;
                            Main.projectile[proj].penetrate = -1;
                            Main.projectile[proj].timeLeft  = 300;
                            //Main.projectile[proj].usesLocalNPCImmunity = true;
                            Main.projectile[proj].localNPCHitCooldown = 8;
                            Main.projectile[proj].Throwing().thrown   = true;
                            IdgProjectile.Sync(proj);

                            for (int q = 0; q < 50; q++)
                            {
                                int dust = Dust.NewDust(Main.projectile[proj].position - new Vector2(100, 0), 200, 12, DustID.Smoke, 0f, 0f, 100, Main.hslToRgb(0.6f, 0.8f, 0.28f), 4f);
                                Main.dust[dust].noGravity = true;
                            }
                        }
                    }
                }
            }
        }