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