private void Explode() { Player player = Main.player[projectile.owner]; //get player // Play explosion sound Main.PlaySound(SoundID.Item14, projectile.position); // Smoke Dust spawn for (int i = 0; i < 50; i++) { int dustIndex = Dust.NewDust(new Vector2(projectile.position.X + (projectile.width / 4), projectile.position.Y + (projectile.height / 4)), projectile.width / 2, projectile.height / 2, 31, 0f, 0f, 100, default(Color), 2f); Main.dust[dustIndex].velocity *= 1.4f; } // Fire Dust spawn for (int i = 0; i < 80; i++) { int dustIndex = Dust.NewDust(new Vector2(projectile.position.X + (projectile.width / 4), projectile.position.Y + (projectile.height / 4)), projectile.width / 2, projectile.height / 2, 6, 0f, 0f, 100, default(Color), 3f); Main.dust[dustIndex].noGravity = true; Main.dust[dustIndex].velocity *= 5f; dustIndex = Dust.NewDust(new Vector2(projectile.position.X + (projectile.width / 4), projectile.position.Y + (projectile.height / 4)), projectile.width / 2, projectile.height / 2, 6, 0f, 0f, 100, default(Color), 2f); Main.dust[dustIndex].velocity *= 3f; } // Large Smoke Gore spawn for (int g = 0; g < 2; g++) { int goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (projectile.width / 2) - 24f, projectile.position.Y + (projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X + 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y + 1.5f; goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (projectile.width / 2) - 24f, projectile.position.Y + (projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X - 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y + 1.5f; goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (projectile.width / 2) - 24f, projectile.position.Y + (projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X + 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y - 1.5f; goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (projectile.width / 2) - 24f, projectile.position.Y + (projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X - 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y - 1.5f; } //how many blocks to explode int explosionRadius = projectile.width / 16 / 4; //find min/max x/y tiles in circle around projectile int minTileX = (int)(player.Center.X / 16f - (float)explosionRadius); int maxTileX = (int)(player.Center.X / 16f + (float)explosionRadius); int minTileY = (int)(player.Center.Y / 16f - (float)explosionRadius); int maxTileY = (int)(player.Center.Y / 16f + (float)explosionRadius); //clamp tile range inside world if (minTileX < 0) { minTileX = 0; } if (maxTileX > Main.maxTilesX) { maxTileX = Main.maxTilesX; } if (minTileY < 0) { minTileY = 0; } if (maxTileY > Main.maxTilesY) { maxTileY = Main.maxTilesY; } bool canKillWalls = false; //only get walls inside a circle for (int x = minTileX; x <= maxTileX; x++) { for (int y = minTileY; y <= maxTileY; y++) { float diffX = Math.Abs((float)x - player.Center.X / 16f); float diffY = Math.Abs((float)y - player.Center.Y / 16f); double distance = Math.Sqrt((double)(diffX * diffX + diffY * diffY)); if (distance < (double)explosionRadius && Main.tile[x, y] != null && Main.tile[x, y].wall == 0) { canKillWalls = true; break; } } } //only get tiles inside a circle for (int i = minTileX; i <= maxTileX; i++) { for (int j = minTileY; j <= maxTileY; j++) { float diffX = Math.Abs((float)i - player.Center.X / 16f); float diffY = Math.Abs((float)j - player.Center.Y / 16f); double distanceToTile = Math.Sqrt((double)(diffX * diffX + diffY * diffY)); if (distanceToTile < (double)explosionRadius) { bool canKillTile = true; if (Main.tile[i, j] != null && Main.tile[i, j].active()) { canKillTile = true; if (Main.tileDungeon[(int)Main.tile[i, j].type] || Main.tile[i, j].type == 88 || Main.tile[i, j].type == 21 || Main.tile[i, j].type == 26 || Main.tile[i, j].type == 107 || Main.tile[i, j].type == 108 || Main.tile[i, j].type == 111 || Main.tile[i, j].type == 226 || Main.tile[i, j].type == 237 || Main.tile[i, j].type == 221 || Main.tile[i, j].type == 222 || Main.tile[i, j].type == 223 || Main.tile[i, j].type == 211 || Main.tile[i, j].type == 404) { canKillTile = false; //cant kill dungeon walls } if (!Main.hardMode && Main.tile[i, j].type == 58) { canKillTile = false; //cant kill ? walls } if (!TileLoader.CanExplode(i, j)) { canKillTile = false; //cant kill unexplodable walls } if (canKillTile) { //kill tile WorldGen.KillTile(i, j, false, false, false); if (!Main.tile[i, j].active() && Main.netMode != 0) { NetMessage.SendData(17, -1, -1, null, 0, (float)i, (float)j, 0f, 0, 0, 0); } } } if (canKillTile) { for (int x = i - 1; x <= i + 1; x++) { for (int y = j - 1; y <= j + 1; y++) { if (Main.tile[x, y] != null && Main.tile[x, y].wall > 0 && canKillWalls && WallLoader.CanExplode(x, y, Main.tile[x, y].wall)) { WorldGen.KillWall(x, y, false); if (Main.tile[x, y].wall == 0 && Main.netMode != 0) { NetMessage.SendData(17, -1, -1, null, 2, (float)x, (float)y, 0f, 0, 0, 0); } } } } } } } } }
public override void Kill(int timeLeft) { // If we are the original projectile, spawn the 5 child projectiles if (projectile.ai[1] == 0) { for (int i = 0; i < 5; i++) { // Random upward vector. Vector2 vel = new Vector2(Main.rand.NextFloat(-3, 3), Main.rand.NextFloat(-10, -8)); Projectile.NewProjectile(projectile.Center, vel, projectile.type, projectile.damage, projectile.knockBack, projectile.owner, 0, 1); } } // Play explosion sound Main.PlaySound(SoundID.Item15, projectile.position); // Smoke Dust spawn for (int i = 0; i < 50; i++) { int dustIndex = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, 31, 0f, 0f, 100, default(Color), 2f); Main.dust[dustIndex].velocity *= 1.4f; } // Fire Dust spawn for (int i = 0; i < 80; i++) { int dustIndex = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, 6, 0f, 0f, 100, default(Color), 3f); Main.dust[dustIndex].noGravity = true; Main.dust[dustIndex].velocity *= 5f; dustIndex = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, 6, 0f, 0f, 100, default(Color), 2f); Main.dust[dustIndex].velocity *= 3f; } // Large Smoke Gore spawn for (int g = 0; g < 2; g++) { int goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (float)(projectile.width / 2) - 24f, projectile.position.Y + (float)(projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X + 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y + 1.5f; goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (float)(projectile.width / 2) - 24f, projectile.position.Y + (float)(projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X - 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y + 1.5f; goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (float)(projectile.width / 2) - 24f, projectile.position.Y + (float)(projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X + 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y - 1.5f; goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (float)(projectile.width / 2) - 24f, projectile.position.Y + (float)(projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X - 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y - 1.5f; } // reset size to normal width and height. projectile.position.X = projectile.position.X + (float)(projectile.width / 2); projectile.position.Y = projectile.position.Y + (float)(projectile.height / 2); projectile.width = 10; projectile.height = 10; projectile.position.X = projectile.position.X - (float)(projectile.width / 2); projectile.position.Y = projectile.position.Y - (float)(projectile.height / 2); // TODO, tmodloader helper method { int explosionRadius = 3; //if (projectile.type == 29 || projectile.type == 470 || projectile.type == 637) { explosionRadius = 7; } int minTileX = (int)(projectile.position.X / 16f - (float)explosionRadius); int maxTileX = (int)(projectile.position.X / 16f + (float)explosionRadius); int minTileY = (int)(projectile.position.Y / 16f - (float)explosionRadius); int maxTileY = (int)(projectile.position.Y / 16f + (float)explosionRadius); if (minTileX < 0) { minTileX = 0; } if (maxTileX > Main.maxTilesX) { maxTileX = Main.maxTilesX; } if (minTileY < 0) { minTileY = 0; } if (maxTileY > Main.maxTilesY) { maxTileY = Main.maxTilesY; } bool canKillWalls = false; for (int x = minTileX; x <= maxTileX; x++) { for (int y = minTileY; y <= maxTileY; y++) { float diffX = Math.Abs((float)x - projectile.position.X / 16f); float diffY = Math.Abs((float)y - projectile.position.Y / 16f); double distance = Math.Sqrt((double)(diffX * diffX + diffY * diffY)); if (distance < (double)explosionRadius && Main.tile[x, y] != null && Main.tile[x, y].wall == 0) { canKillWalls = true; break; } } } AchievementsHelper.CurrentlyMining = true; for (int i = minTileX; i <= maxTileX; i++) { for (int j = minTileY; j <= maxTileY; j++) { float diffX = Math.Abs((float)i - projectile.position.X / 16f); float diffY = Math.Abs((float)j - projectile.position.Y / 16f); double distanceToTile = Math.Sqrt((double)(diffX * diffX + diffY * diffY)); if (distanceToTile < (double)explosionRadius) { bool canKillTile = true; if (Main.tile[i, j] != null && Main.tile[i, j].active()) { canKillTile = true; if (Main.tileDungeon[(int)Main.tile[i, j].type] || Main.tile[i, j].type == 88 || Main.tile[i, j].type == 21 || Main.tile[i, j].type == 26 || Main.tile[i, j].type == 107 || Main.tile[i, j].type == 108 || Main.tile[i, j].type == 111 || Main.tile[i, j].type == 226 || Main.tile[i, j].type == 237 || Main.tile[i, j].type == 221 || Main.tile[i, j].type == 222 || Main.tile[i, j].type == 223 || Main.tile[i, j].type == 211 || Main.tile[i, j].type == 404) { canKillTile = false; } if (!Main.hardMode && Main.tile[i, j].type == 58) { canKillTile = false; } if (!TileLoader.CanExplode(i, j)) { canKillTile = false; } if (canKillTile) { WorldGen.KillTile(i, j, false, false, false); if (!Main.tile[i, j].active() && Main.netMode != 0) { NetMessage.SendData(17, -1, -1, null, 0, (float)i, (float)j, 0f, 0, 0, 0); } } } if (canKillTile) { for (int x = i - 1; x <= i + 1; x++) { for (int y = j - 1; y <= j + 1; y++) { if (Main.tile[x, y] != null && Main.tile[x, y].wall > 0 && canKillWalls && WallLoader.CanExplode(x, y, Main.tile[x, y].wall)) { WorldGen.KillWall(x, y, false); if (Main.tile[x, y].wall == 0 && Main.netMode != 0) { NetMessage.SendData(17, -1, -1, null, 2, (float)x, (float)y, 0f, 0, 0, 0); } } } } } } } } AchievementsHelper.CurrentlyMining = false; } }
public static void Explode(Vector2 position, int explosionRadius = 5) { int minTileX = (int)(position.X / 16f - (float)explosionRadius); int maxTileX = (int)(position.X / 16f + (float)explosionRadius); int minTileY = (int)(position.Y / 16f - (float)explosionRadius); int maxTileY = (int)(position.Y / 16f + (float)explosionRadius); if (minTileX < 0) { minTileX = 0; } if (maxTileX > Main.maxTilesX) { maxTileX = Main.maxTilesX; } if (minTileY < 0) { minTileY = 0; } if (maxTileY > Main.maxTilesY) { maxTileY = Main.maxTilesY; } bool canKillWalls = false; for (int x = minTileX; x <= maxTileX; x++) { for (int y = minTileY; y <= maxTileY; y++) { float diffX = Math.Abs((float)x - position.X / 16f); float diffY = Math.Abs((float)y - position.Y / 16f); double distance = Math.Sqrt((double)(diffX * diffX + diffY * diffY)); if (distance < (double)explosionRadius && Main.tile[x, y] != null && Main.tile[x, y].wall == 0) { canKillWalls = true; break; } } } AchievementsHelper.CurrentlyMining = true; for (int i = minTileX; i <= maxTileX; i++) { for (int j = minTileY; j <= maxTileY; j++) { float diffX = Math.Abs((float)i - position.X / 16f); float diffY = Math.Abs((float)j - position.Y / 16f); double distanceToTile = Math.Sqrt((double)(diffX * diffX + diffY * diffY)); if (distanceToTile < (double)explosionRadius) { bool canKillTile = true; if (Main.tile[i, j] != null && Main.tile[i, j].active()) { canKillTile = true; if (Main.tileDungeon[(int)Main.tile[i, j].type] || Main.tile[i, j].type == 88 || Main.tile[i, j].type == 21 || Main.tile[i, j].type == 26 || Main.tile[i, j].type == 107 || Main.tile[i, j].type == 108 || Main.tile[i, j].type == 111 || Main.tile[i, j].type == 226 || Main.tile[i, j].type == 237 || Main.tile[i, j].type == 221 || Main.tile[i, j].type == 222 || Main.tile[i, j].type == 223 || Main.tile[i, j].type == 211 || Main.tile[i, j].type == 404) { canKillTile = false; } if (!Main.hardMode && Main.tile[i, j].type == 58) { canKillTile = false; } if (!TileLoader.CanExplode(i, j)) { canKillTile = false; } if (canKillTile) { WorldGen.KillTile(i, j, false, false, false); if (!Main.tile[i, j].active() && Main.netMode != 0) { NetMessage.SendData(17, -1, -1, null, 0, (float)i, (float)j, 0f, 0, 0, 0); } } } if (canKillTile) { for (int x = i - 1; x <= i + 1; x++) { for (int y = j - 1; y <= j + 1; y++) { if (Main.tile[x, y] != null && Main.tile[x, y].wall > 0 && canKillWalls && WallLoader.CanExplode(x, y, Main.tile[x, y].wall)) { WorldGen.KillWall(x, y, false); if (Main.tile[x, y].wall == 0 && Main.netMode != 0) { NetMessage.SendData(17, -1, -1, null, 2, (float)x, (float)y, 0f, 0, 0, 0); } } } } } } } } AchievementsHelper.CurrentlyMining = false; }
public override void AI() { int dustIndex = Dust.NewDust(projectile.position, 0, 0, 107); Main.dust[dustIndex].noGravity = true; int explosionRadius = 3; int minTileX = (int)(projectile.position.X / 16f - explosionRadius); int maxTileX = (int)(projectile.position.X / 16f + explosionRadius); int minTileY = (int)(projectile.position.Y / 16f - explosionRadius); int maxTileY = (int)(projectile.position.Y / 16f + explosionRadius); if (minTileX < 0) { minTileX = 0; } if (maxTileX > Main.maxTilesX) { maxTileX = Main.maxTilesX; } if (minTileY < 0) { minTileY = 0; } if (maxTileY > Main.maxTilesY) { maxTileY = Main.maxTilesY; } bool canKillWalls = false; for (int x = minTileX; x <= maxTileX; x++) { for (int y = minTileY; y <= maxTileY; y++) { float diffX = Math.Abs(x - projectile.position.X / 16f); float diffY = Math.Abs(y - projectile.position.Y / 16f); double distance = Math.Sqrt(diffX * diffX + diffY * diffY); if (distance < explosionRadius && Main.tile[x, y]?.wall == 0) { canKillWalls = true; break; } } } AchievementsHelper.CurrentlyMining = true; for (int i = minTileX; i <= maxTileX; i++) { for (int j = minTileY; j <= maxTileY; j++) { float diffX = Math.Abs(i - projectile.position.X / 16f); float diffY = Math.Abs(j - projectile.position.Y / 16f); double distanceToTile = Math.Sqrt(diffX * diffX + diffY * diffY); if (distanceToTile < explosionRadius) { bool canKillTile = true; if (Main.tile[i, j]?.active() == true) { canKillTile = true; if (canKillTile) { WorldGen.KillTile(i, j, false, false, true); if (!Main.tile[i, j].active() && Main.netMode != NetmodeID.SinglePlayer) { NetMessage.SendData(MessageID.TileChange, -1, -1, null, 0, i, j); } } } if (canKillTile) { for (int x = i - 1; x <= i + 1; x++) { for (int y = j - 1; y <= j + 1; y++) { if (Main.tile[x, y]?.wall > 0 && canKillWalls && WallLoader.CanExplode(x, y, Main.tile[x, y].wall)) { WorldGen.KillWall(x, y, false); if (Main.tile[x, y]?.wall == 0 && Main.netMode != NetmodeID.SinglePlayer) { NetMessage.SendData(MessageID.TileChange, -1, -1, null, 2, x, y); } } } } } } } } AchievementsHelper.CurrentlyMining = false; }
public override void AI() { if (projectile.owner == Main.myPlayer && projectile.timeLeft == 297) { projectile.position = projectile.Center; projectile.position.X = projectile.position.X + (float)(projectile.width / 2); projectile.position.Y = projectile.position.Y + (float)(projectile.height / 2); projectile.width = 0; projectile.height = 0; projectile.Center = projectile.position; projectile.position.X = projectile.position.X - (float)(projectile.width / 2); projectile.position.Y = projectile.position.Y - (float)(projectile.height / 2); } else if (projectile.owner == Main.myPlayer && projectile.timeLeft > 297) { projectile.tileCollide = false; // change the hitbox size, centered about the original projectile center. This makes the projectile damage enemies during the explosion. projectile.position = projectile.Center; //projectile.position.X = projectile.position.X + (float)(projectile.width / 2); //projectile.position.Y = projectile.position.Y + (float)(projectile.height / 2); projectile.width = 300; projectile.height = 300; playerCenterX = projectile.position.X; playerCenterY = projectile.position.Y; projectile.Center = projectile.position; //projectile.position.X = projectile.position.X - (float)(projectile.width / 2); //projectile.position.Y = projectile.position.Y - (float)(projectile.height / 2); // Play explosion sound Main.PlaySound(SoundID.Item14, projectile.position); Main.PlaySound(SoundID.Item14, projectile.position); Main.PlaySound(SoundID.Item14, projectile.position); // Smoke Dust spawn for (int i = 0; i < 50; i++) { int dustIndex = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, 31, 0f, 0f, 100, default(Color), 2f); Main.dust[dustIndex].velocity *= 1.4f; } // Fire Dust spawn for (int i = 0; i < 80; i++) { int dustIndex = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, 6, 0f, 0f, 100, default(Color), 3f); Main.dust[dustIndex].noGravity = true; Main.dust[dustIndex].velocity *= 5f; dustIndex = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, 6, 0f, 0f, 100, default(Color), 2f); Main.dust[dustIndex].velocity *= 3f; } // Large Smoke Gore spawn for (int g = 0; g < 2; g++) { int goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (float)(projectile.width / 2) - 24f, projectile.position.Y + (float)(projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X + 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y + 1.5f; goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (float)(projectile.width / 2) - 24f, projectile.position.Y + (float)(projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X - 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y + 1.5f; goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (float)(projectile.width / 2) - 24f, projectile.position.Y + (float)(projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X + 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y - 1.5f; goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (float)(projectile.width / 2) - 24f, projectile.position.Y + (float)(projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X - 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y - 1.5f; } { int explosionRadius = 15; int minTileX = (int)(playerCenterX / 16f - (float)explosionRadius); int maxTileX = (int)(playerCenterX / 16f + (float)explosionRadius); int minTileY = (int)(playerCenterY / 16f - (float)explosionRadius); int maxTileY = (int)(playerCenterY / 16f + (float)explosionRadius); if (minTileX < 0) { minTileX = 0; } if (maxTileX > Main.maxTilesX) { maxTileX = Main.maxTilesX; } if (minTileY < 0) { minTileY = 0; } if (maxTileY > Main.maxTilesY) { maxTileY = Main.maxTilesY; } bool canKillWalls = false; for (int x = minTileX; x <= maxTileX; x++) { for (int y = minTileY; y <= maxTileY; y++) { float diffX = Math.Abs((float)x - playerCenterX / 16f); float diffY = Math.Abs((float)y - playerCenterY / 16f); double distance = Math.Sqrt((double)(diffX * diffX + diffY * diffY)); if (distance < (double)explosionRadius && Main.tile[x, y] != null && Main.tile[x, y].wall == 0) { canKillWalls = true; break; } } } AchievementsHelper.CurrentlyMining = true; for (int i = minTileX; i <= maxTileX; i++) { for (int j = minTileY; j <= maxTileY; j++) { float diffX = Math.Abs((float)i - playerCenterX / 16f); float diffY = Math.Abs((float)j - playerCenterY / 16f); double distanceToTile = Math.Sqrt((double)(diffX * diffX + diffY * diffY)); if (distanceToTile < (double)explosionRadius) { bool canKillTile = true; if (Main.tile[i, j] != null && Main.tile[i, j].active()) { canKillTile = true; if (Main.tileDungeon[(int)Main.tile[i, j].type] || Main.tile[i, j].type == 88 || Main.tile[i, j].type == 21 || Main.tile[i, j].type == 26 || Main.tile[i, j].type == 107 || Main.tile[i, j].type == 108 || Main.tile[i, j].type == 111 || Main.tile[i, j].type == 226 || Main.tile[i, j].type == 237 || Main.tile[i, j].type == 221 || Main.tile[i, j].type == 222 || Main.tile[i, j].type == 223 || Main.tile[i, j].type == 211 || Main.tile[i, j].type == 404) { canKillTile = false; } if (!Main.hardMode && Main.tile[i, j].type == 58) { canKillTile = false; } if (!TileLoader.CanExplode(i, j)) { canKillTile = false; } if (canKillTile) { WorldGen.KillTile(i, j, false, false, false); if (!Main.tile[i, j].active() && Main.netMode != NetmodeID.SinglePlayer) { NetMessage.SendData(MessageID.TileChange, -1, -1, null, 0, (float)i, (float)j, 0f, 0, 0, 0); } } } if (canKillTile) { for (int x = i - 1; x <= i + 1; x++) { for (int y = j - 1; y <= j + 1; y++) { if (Main.tile[x, y] != null && Main.tile[x, y].wall > 0 && canKillWalls && WallLoader.CanExplode(x, y, Main.tile[x, y].wall)) { WorldGen.KillWall(x, y, false); if (Main.tile[x, y].wall == 0 && Main.netMode != NetmodeID.SinglePlayer) { NetMessage.SendData(MessageID.TileChange, -1, -1, null, 2, (float)x, (float)y, 0f, 0, 0, 0); } } } } } } } } AchievementsHelper.CurrentlyMining = false; } } return; }
public override void Kill(int timeLeft) { //Main.PlaySound(SoundID.Item14, projectile.position); switch (Main.rand.Next(4)) { case 1: Main.PlaySound(mod.GetLegacySoundSlot(SoundType.Custom, "Sounds/Custom/Explode1"), projectile.position); break; case 2: Main.PlaySound(mod.GetLegacySoundSlot(SoundType.Custom, "Sounds/Custom/Explode2"), projectile.position); break; case 3: Main.PlaySound(mod.GetLegacySoundSlot(SoundType.Custom, "Sounds/Custom/Explode3"), projectile.position); break; default: Main.PlaySound(mod.GetLegacySoundSlot(SoundType.Custom, "Sounds/Custom/Explode4"), projectile.position); break; } { projectile.position.X = projectile.position.X + (float)(projectile.width / 2); projectile.position.Y = projectile.position.Y + (float)(projectile.height / 2); projectile.width = 32; projectile.height = 32; projectile.position.X = projectile.position.X - (float)(projectile.width / 2); projectile.position.Y = projectile.position.Y - (float)(projectile.height / 2); int num4; for (int i = 0; i < 30; i++) { int index = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, 31, 0f, 0f, 100, default(Color), 1.5f); Dust dust = Main.dust[index]; dust.velocity *= 1.4f; } for (int i = 0; i < 20; i++) { int index = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, 6, 0f, 0f, 100, default(Color), 3.5f); Main.dust[index].noGravity = true; Dust dust = Main.dust[index]; dust.velocity *= 7f; index = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, 6, 0f, 0f, 100, default(Color), 1.5f); dust = Main.dust[index]; dust.velocity *= 3f; } for (int i = 0; i < 10; i++) { int index = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, 6, 0f, 0f, 100, default(Color), 3.5f); Main.dust[index].noGravity = true; Dust dust = Main.dust[index]; dust.velocity *= 14f; index = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, 6, 0f, 0f, 100, default(Color), 1.5f); dust = Main.dust[index]; dust.velocity *= 7f; } for (int i = 0; i < 4; i++) { float scaleFactor9 = 1.2f; if (i <= 1) { scaleFactor9 = 2.4f; } Vector2 position48 = new Vector2(projectile.position.X, projectile.position.Y); Vector2 vector = default(Vector2); int index = Gore.NewGore(position48, vector, Main.rand.Next(61, 64), 1f); Gore gore = Main.gore[index]; gore.velocity *= scaleFactor9; Gore gore110 = Main.gore[index]; gore110.velocity.X = gore110.velocity.X + 1f; Gore gore111 = Main.gore[index]; gore111.velocity.Y = gore111.velocity.Y + 1f; Vector2 position49 = new Vector2(projectile.position.X, projectile.position.Y); vector = default(Vector2); index = Gore.NewGore(position49, vector, Main.rand.Next(61, 64), 1f); gore = Main.gore[index]; gore.velocity *= scaleFactor9; Gore gore112 = Main.gore[index]; gore112.velocity.X = gore112.velocity.X - 1f; Gore gore113 = Main.gore[index]; gore113.velocity.Y = gore113.velocity.Y + 1f; Vector2 position50 = new Vector2(projectile.position.X, projectile.position.Y); vector = default(Vector2); index = Gore.NewGore(position50, vector, Main.rand.Next(61, 64), 1f); gore = Main.gore[index]; gore.velocity *= scaleFactor9; Gore gore114 = Main.gore[index]; gore114.velocity.X = gore114.velocity.X + 1f; Gore gore115 = Main.gore[index]; gore115.velocity.Y = gore115.velocity.Y - 1f; Vector2 position51 = new Vector2(projectile.position.X, projectile.position.Y); vector = default(Vector2); index = Gore.NewGore(position51, vector, Main.rand.Next(61, 64), 1f); gore = Main.gore[index]; gore.velocity *= scaleFactor9; Gore gore116 = Main.gore[index]; gore116.velocity.X = gore116.velocity.X - 1f; Gore gore117 = Main.gore[index]; gore117.velocity.Y = gore117.velocity.Y - 1f; } } { int explosionRadius = 8; int minTileX = (int)(projectile.position.X / 16f - (float)explosionRadius); int maxTileX = (int)(projectile.position.X / 16f + (float)explosionRadius); int minTileY = (int)(projectile.position.Y / 16f - (float)explosionRadius); int maxTileY = (int)(projectile.position.Y / 16f + (float)explosionRadius); if (minTileX < 0) { minTileX = 0; } if (maxTileX > Main.maxTilesX) { maxTileX = Main.maxTilesX; } if (minTileY < 0) { minTileY = 0; } if (maxTileY > Main.maxTilesY) { maxTileY = Main.maxTilesY; } bool canKillWalls = false; for (int x = minTileX; x <= maxTileX; x++) { for (int y = minTileY; y <= maxTileY; y++) { float diffX = Math.Abs((float)x - projectile.position.X / 16f); float diffY = Math.Abs((float)y - projectile.position.Y / 16f); double distance = Math.Sqrt((double)(diffX * diffX + diffY * diffY)); if (distance < (double)explosionRadius && Main.tile[x, y] != null && Main.tile[x, y].wall == 0) { canKillWalls = true; break; } } } for (int i = minTileX; i <= maxTileX; i++) { for (int j = minTileY; j <= maxTileY; j++) { float diffX = Math.Abs((float)i - projectile.position.X / 16f); float diffY = Math.Abs((float)j - projectile.position.Y / 16f); double distanceToTile = Math.Sqrt((double)(diffX * diffX + diffY * diffY)); if (distanceToTile < (double)explosionRadius) { bool canKillTile = true; if (Main.tile[i, j] != null && Main.tile[i, j].active()) { canKillTile = true; if (Main.tileDungeon[(int)Main.tile[i, j].type] || Main.tile[i, j].type == 88 || Main.tile[i, j].type == 21 || Main.tile[i, j].type == 26 || Main.tile[i, j].type == 107 || Main.tile[i, j].type == 108 || Main.tile[i, j].type == 111 || Main.tile[i, j].type == 226 || Main.tile[i, j].type == 237 || Main.tile[i, j].type == 221 || Main.tile[i, j].type == 222 || Main.tile[i, j].type == 223 || Main.tile[i, j].type == 211 || Main.tile[i, j].type == 404) { canKillTile = false; } if (!Main.hardMode && Main.tile[i, j].type == 58) { canKillTile = false; } if (!TileLoader.CanExplode(i, j)) { canKillTile = false; } if (canKillTile) { WorldGen.KillTile(i, j, false, false, false); if (!Main.tile[i, j].active() && Main.netMode != 0) { NetMessage.SendData(17, -1, -1, null, 0, (float)i, (float)j, 0f, 0, 0, 0); } } } if (canKillTile) { for (int x = i - 1; x <= i + 1; x++) { for (int y = j - 1; y <= j + 1; y++) { if (Main.tile[x, y] != null && Main.tile[x, y].wall > 0 && canKillWalls && WallLoader.CanExplode(x, y, Main.tile[x, y].wall)) { WorldGen.KillWall(x, y, false); if (Main.tile[x, y].wall == 0 && Main.netMode != 0) { NetMessage.SendData(17, -1, -1, null, 2, (float)x, (float)y, 0f, 0, 0, 0); } } } } } } } } } }
public override void AI() { Player player = Main.player[projectile.owner]; if (projectile.timeLeft == 10 || projectile.penetrate == 1) { projectile.position += new Vector2(-50, -50); projectile.width = 150; projectile.height = 150; projectile.timeLeft = 9; projectile.alpha = 255; projectile.penetrate = -1; projectile.tileCollide = false; projectile.friendly = false; projectile.hostile = true; } if (projectile.timeLeft == 9) { Main.PlaySound(2, (int)projectile.position.X, (int)projectile.position.Y, 14); } if (projectile.timeLeft < 10) { projectile.velocity = new Vector2(0, 0); } if (projectile.timeLeft == 3) { projectile.width = 22; projectile.height = 32; projectile.position += new Vector2(60, 60); } // Adapted a tiny bit from ExampleMod's Example Explosive. if (projectile.timeLeft == 1) { int explosionRadius = 6; int minTileX = (int)(projectile.position.X / 16f - (float)explosionRadius); int maxTileX = (int)(projectile.position.X / 16f + (float)explosionRadius); int minTileY = (int)(projectile.position.Y / 16f - (float)explosionRadius); int maxTileY = (int)(projectile.position.Y / 16f + (float)explosionRadius); if (minTileX < 0) { minTileX = 0; } if (maxTileX > Main.maxTilesX) { maxTileX = Main.maxTilesX; } if (minTileY < 0) { minTileY = 0; } if (maxTileY > Main.maxTilesY) { maxTileY = Main.maxTilesY; } bool canKillWalls = false; for (int x = minTileX; x <= maxTileX; x++) { for (int y = minTileY; y <= maxTileY; y++) { float diffX = Math.Abs((float)x - projectile.position.X / 16f); float diffY = Math.Abs((float)y - projectile.position.Y / 16f); double distance = Math.Sqrt((double)(diffX * diffX + diffY * diffY)); if (distance < (double)explosionRadius && Main.tile[x, y] != null && Main.tile[x, y].wall == 0) { canKillWalls = true; break; } } } AchievementsHelper.CurrentlyMining = true; for (int i = minTileX; i <= maxTileX; i++) { for (int j = minTileY; j <= maxTileY; j++) { float diffX = Math.Abs((float)i - projectile.position.X / 16f); float diffY = Math.Abs((float)j - projectile.position.Y / 16f); double distanceToTile = Math.Sqrt((double)(diffX * diffX + diffY * diffY)); if (distanceToTile < (double)explosionRadius) { bool canKillTile = true; if (Main.tile[i, j] != null && Main.tile[i, j].active()) { canKillTile = true; if (Main.tileDungeon[(int)Main.tile[i, j].type] || Main.tile[i, j].type == 88 || Main.tile[i, j].type == 21 || Main.tile[i, j].type == 26 || Main.tile[i, j].type == 107 || Main.tile[i, j].type == 108 || Main.tile[i, j].type == 111 || Main.tile[i, j].type == 226 || Main.tile[i, j].type == 237 || Main.tile[i, j].type == 221 || Main.tile[i, j].type == 222 || Main.tile[i, j].type == 223 || Main.tile[i, j].type == 211 || Main.tile[i, j].type == 404) { canKillTile = false; } if (!Main.hardMode && Main.tile[i, j].type == 58) { canKillTile = false; } if (!TileLoader.CanExplode(i, j)) { canKillTile = false; } if (canKillTile) { WorldGen.KillTile(i, j, false, false, false); if (!Main.tile[i, j].active() && Main.netMode != 0) { NetMessage.SendData(17, -1, -1, null, 0, (float)i, (float)j, 0f, 0, 0, 0); } } } if (canKillTile) { for (int x = i - 1; x <= i + 1; x++) { for (int y = j - 1; y <= j + 1; y++) { if (Main.tile[x, y] != null && Main.tile[x, y].wall > 0 && canKillWalls && WallLoader.CanExplode(x, y, Main.tile[x, y].wall)) { WorldGen.KillWall(x, y, false); if (Main.tile[x, y].wall == 0 && Main.netMode != 0) { NetMessage.SendData(17, -1, -1, null, 2, (float)x, (float)y, 0f, 0, 0, 0); } } } } } } } } AchievementsHelper.CurrentlyMining = false; } for (int i = 0; i < 2; i++) { int dust = Dust.NewDust(projectile.position, projectile.width, projectile.height, 63, 0f, 0f, 50, default(Color), 1f); Main.dust[dust].noGravity = true; } Lighting.AddLight(projectile.Center, 0.4f, 0.4f, 0.6f); }
public override void Kill(int timeLeft) { Vector2 position = projectile.Center; Main.PlaySound(mod.GetLegacySoundSlot(SoundType.Custom, "Sounds/Hallelujah"), (int)position.X, (int)position.Y); for (int i = 0; i < 50; i++) { int dustIndex = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, 31, 0f, 0f, 100, default(Color), 2f); Main.dust[dustIndex].velocity *= 1.4f; } for (int i = 0; i < 80; i++) { int dustIndex = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, DustID.GoldFlame, 0f, 0f, 100, default(Color), 3f); Main.dust[dustIndex].noGravity = true; Main.dust[dustIndex].velocity *= 5f; dustIndex = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, DustID.GoldFlame, 0f, 0f, 100, default(Color), 2f); Main.dust[dustIndex].velocity *= 3f; } for (int g = 0; g < 2; g++) { int goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (float)(projectile.width / 2) - 24f, projectile.position.Y + (float)(projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X + 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y + 1.5f; goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (float)(projectile.width / 2) - 24f, projectile.position.Y + (float)(projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X - 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y + 1.5f; goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (float)(projectile.width / 2) - 24f, projectile.position.Y + (float)(projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X + 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y - 1.5f; goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (float)(projectile.width / 2) - 24f, projectile.position.Y + (float)(projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X - 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y - 1.5f; } projectile.position.X = projectile.position.X + (float)(projectile.width / 2); projectile.position.Y = projectile.position.Y + (float)(projectile.height / 2); projectile.width = 15; projectile.height = 15; projectile.position.X = projectile.position.X - (float)(projectile.width / 2); projectile.position.Y = projectile.position.Y - (float)(projectile.height / 2); { int explosionRadius = 15; int minTileX = (int)(projectile.position.X / 16f - (float)explosionRadius); int maxTileX = (int)(projectile.position.X / 16f + (float)explosionRadius); int minTileY = (int)(projectile.position.Y / 16f - (float)explosionRadius); int maxTileY = (int)(projectile.position.Y / 16f + (float)explosionRadius); if (minTileX < 0) { minTileX = 0; } if (maxTileX > Main.maxTilesX) { maxTileX = Main.maxTilesX; } if (minTileY < 0) { minTileY = 0; } if (maxTileY > Main.maxTilesY) { maxTileY = Main.maxTilesY; } bool canKillWalls = false; for (int x = minTileX; x <= maxTileX; x++) { for (int y = minTileY; y <= maxTileY; y++) { float diffX = Math.Abs((float)x - projectile.position.X / 16f); float diffY = Math.Abs((float)y - projectile.position.Y / 16f); double distance = Math.Sqrt((double)(diffX * diffX + diffY * diffY)); if (distance < (double)explosionRadius && Main.tile[x, y] != null && Main.tile[x, y].wall == 0) { canKillWalls = true; break; } } } AchievementsHelper.CurrentlyMining = true; for (int i = minTileX; i <= maxTileX; i++) { for (int j = minTileY; j <= maxTileY; j++) { float diffX = Math.Abs((float)i - projectile.position.X / 16f); float diffY = Math.Abs((float)j - projectile.position.Y / 16f); double distanceToTile = Math.Sqrt((double)(diffX * diffX + diffY * diffY)); if (distanceToTile < (double)explosionRadius) { bool canKillTile = true; if (Main.tile[i, j] != null && Main.tile[i, j].active()) { canKillTile = true; if (Main.tileDungeon[(int)Main.tile[i, j].type] || Main.tile[i, j].type == 88 || Main.tile[i, j].type == 21 || Main.tile[i, j].type == 26 || Main.tile[i, j].type == 107 || Main.tile[i, j].type == 108 || Main.tile[i, j].type == 111 || Main.tile[i, j].type == 226 || Main.tile[i, j].type == 237 || Main.tile[i, j].type == 221 || Main.tile[i, j].type == 222 || Main.tile[i, j].type == 223 || Main.tile[i, j].type == 211 || Main.tile[i, j].type == 404) { canKillTile = false; } if (!Main.hardMode && Main.tile[i, j].type == 58) { canKillTile = false; } if (!TileLoader.CanExplode(i, j)) { canKillTile = false; } if (canKillTile) { WorldGen.KillTile(i, j, false, false, false); if (!Main.tile[i, j].active() && Main.netMode != 0) { NetMessage.SendData(17, -1, -1, null, 0, (float)i, (float)j, 0f, 0, 0, 0); } } } if (canKillTile) { for (int x = i - 1; x <= i + 1; x++) { for (int y = j - 1; y <= j + 1; y++) { if (Main.tile[x, y] != null && Main.tile[x, y].wall > 0 && canKillWalls && WallLoader.CanExplode(x, y, Main.tile[x, y].wall)) { WorldGen.KillWall(x, y, false); if (Main.tile[x, y].wall == 0 && Main.netMode != 0) { NetMessage.SendData(17, -1, -1, null, 2, (float)x, (float)y, 0f, 0, 0, 0); } } } } } } } } AchievementsHelper.CurrentlyMining = false; } }
public override void Kill(int timeLeft) { Main.PlaySound(SoundID.Item14, base.projectile.position); for (int i = 0; i < 50; i++) { int dustIndex = Dust.NewDust(new Vector2(base.projectile.position.X, base.projectile.position.Y), base.projectile.width, base.projectile.height, 31, 0f, 0f, 100, default(Color), 2f); Main.dust[dustIndex].velocity *= 1.4f; } for (int j = 0; j < 80; j++) { int dustIndex2 = Dust.NewDust(new Vector2(base.projectile.position.X, base.projectile.position.Y), base.projectile.width, base.projectile.height, 6, 0f, 0f, 100, default(Color), 3f); Main.dust[dustIndex2].noGravity = true; Main.dust[dustIndex2].velocity *= 5f; dustIndex2 = Dust.NewDust(new Vector2(base.projectile.position.X, base.projectile.position.Y), base.projectile.width, base.projectile.height, 6, 0f, 0f, 100, default(Color), 2f); Main.dust[dustIndex2].velocity *= 3f; } for (int g = 0; g < 2; g++) { int goreIndex = Gore.NewGore(new Vector2(base.projectile.position.X + (float)(base.projectile.width / 2) - 24f, base.projectile.position.Y + (float)(base.projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X + 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y + 1.5f; goreIndex = Gore.NewGore(new Vector2(base.projectile.position.X + (float)(base.projectile.width / 2) - 24f, base.projectile.position.Y + (float)(base.projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X - 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y + 1.5f; } base.projectile.position.X = base.projectile.position.X + (float)(base.projectile.width / 2); base.projectile.position.Y = base.projectile.position.Y + (float)(base.projectile.height / 2); base.projectile.width = 10; base.projectile.height = 10; base.projectile.position.X = base.projectile.position.X - (float)(base.projectile.width / 2); base.projectile.position.Y = base.projectile.position.Y - (float)(base.projectile.height / 2); int explosionRadius = 5; int minTileX = (int)(base.projectile.position.X / 16f - (float)explosionRadius); int maxTileX = (int)(base.projectile.position.X / 16f + (float)explosionRadius); int minTileY = (int)(base.projectile.position.Y / 16f - (float)explosionRadius); int maxTileY = (int)(base.projectile.position.Y / 16f + (float)explosionRadius); bool flag = minTileX < 0; if (flag) { minTileX = 0; } bool flag2 = maxTileX > Main.maxTilesX; if (flag2) { maxTileX = Main.maxTilesX; } bool flag3 = minTileY < 0; if (flag3) { minTileY = 0; } bool flag4 = maxTileY > Main.maxTilesY; if (flag4) { maxTileY = Main.maxTilesY; } bool canKillWalls = false; for (int x = minTileX; x <= maxTileX; x++) { for (int y = minTileY; y <= maxTileY; y++) { float diffX = Math.Abs((float)x - base.projectile.position.X / 16f); float diffY = Math.Abs((float)y - base.projectile.position.Y / 16f); double distance = Math.Sqrt((double)(diffX * diffX + diffY * diffY)); bool flag5 = distance < (double)explosionRadius && Main.tile[x, y] != null && Main.tile[x, y].wall == 0; if (flag5) { canKillWalls = true; break; } } } for (int m = minTileX; m <= maxTileX; m++) { for (int n = minTileY; n <= maxTileY; n++) { float diffX3 = Math.Abs((float)m - base.projectile.position.X / 16f); float diffY3 = Math.Abs((float)n - base.projectile.position.Y / 16f); double distanceToTile2 = Math.Sqrt((double)(diffX3 * diffX3 + diffY3 * diffY3)); bool flag7 = distanceToTile2 < (double)explosionRadius; if (flag7) { bool canKillTile = true; bool flag8 = Main.tile[m, n] != null && Main.tile[m, n].active(); if (flag8) { canKillTile = true; bool flag9 = Main.tileDungeon[(int)Main.tile[m, n].type] || Main.tile[m, n].type == 88 || Main.tile[m, n].type == 21 || Main.tile[m, n].type == 26 || Main.tile[m, n].type == 107 || Main.tile[m, n].type == 108 || Main.tile[m, n].type == 111 || Main.tile[m, n].type == 226 || Main.tile[m, n].type == 237 || Main.tile[m, n].type == 221 || Main.tile[m, n].type == 222 || Main.tile[m, n].type == 223 || Main.tile[m, n].type == 211 || Main.tile[m, n].type == 404; if (flag9) { canKillTile = false; } bool flag10 = !Main.hardMode && Main.tile[m, n].type == 58; if (flag10) { canKillTile = false; } bool flag11 = !TileLoader.CanExplode(m, n); if (flag11) { canKillTile = false; } bool flag12 = canKillTile; if (flag12) { WorldGen.KillTile(m, n, false, false, false); bool flag13 = !Main.tile[m, n].active() && Main.netMode != NetmodeID.SinglePlayer; if (flag13) { NetMessage.SendData(MessageID.TileChange, -1, -1, null, 0, (float)m, (float)n, 0f, 0, 0, 0); } } } bool flag14 = canKillTile; if (flag14) { for (int x2 = m - 1; x2 <= m + 1; x2++) { for (int y2 = n - 1; y2 <= n + 1; y2++) { bool flag15 = Main.tile[x2, y2] != null && Main.tile[x2, y2].wall > 0 && canKillWalls && WallLoader.CanExplode(x2, y2, (int)Main.tile[x2, y2].wall); if (flag15) { WorldGen.KillWall(x2, y2, false); bool flag16 = Main.tile[x2, y2].wall == 0 && Main.netMode != NetmodeID.SinglePlayer; if (flag16) { NetMessage.SendData(MessageID.TileChange, -1, -1, null, 2, (float)x2, (float)y2, 0f, 0, 0, 0); } } } } } } } } }
public override void Kill(int timeLeft) { // Play explosion sound Main.PlaySound(SoundID.Item15, projectile.position); // Smoke Dust spawn for (int i = 0; i < 50; i++) { int dustIndex = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, 31, 0f, 0f, 100, default(Color), 2f); Main.dust[dustIndex].velocity *= 1.4f; } // Fire Dust spawn for (int i = 0; i < 80; i++) { int dustIndex = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, 6, 0f, 0f, 100, default(Color), 3f); Main.dust[dustIndex].noGravity = true; Main.dust[dustIndex].velocity *= 5f; dustIndex = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, 6, 0f, 0f, 100, default(Color), 2f); Main.dust[dustIndex].velocity *= 3f; } // Large Smoke Gore spawn for (int g = 0; g < 2; g++) { int goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (float)(projectile.width / 2) - 24f, projectile.position.Y + (float)(projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X + 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y + 1.5f; goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (float)(projectile.width / 2) - 24f, projectile.position.Y + (float)(projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X - 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y + 1.5f; goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (float)(projectile.width / 2) - 24f, projectile.position.Y + (float)(projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X + 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y - 1.5f; goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (float)(projectile.width / 2) - 24f, projectile.position.Y + (float)(projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X - 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y - 1.5f; } // reset size to normal width and height. projectile.position.X = projectile.position.X + (float)(projectile.width / 2); projectile.position.Y = projectile.position.Y + (float)(projectile.height / 2); projectile.width = 10; projectile.height = 10; projectile.position.X = projectile.position.X - (float)(projectile.width / 2); projectile.position.Y = projectile.position.Y - (float)(projectile.height / 2); // TODO, tmodloader helper method if (ModContent.GetInstance <Configs>().MobGriefing) { int explosionRadius = 8; //if (projectile.type == 29 || projectile.type == 470 || projectile.type == 637) { explosionRadius = 8; } int minTileX = (int)(projectile.position.X / 16f - (float)explosionRadius); int maxTileX = (int)(projectile.position.X / 16f + (float)explosionRadius); int minTileY = (int)(projectile.position.Y / 16f - (float)explosionRadius); int maxTileY = (int)(projectile.position.Y / 16f + (float)explosionRadius); if (minTileX < 0) { minTileX = 0; } if (maxTileX > Main.maxTilesX) { maxTileX = Main.maxTilesX; } if (minTileY < 0) { minTileY = 0; } if (maxTileY > Main.maxTilesY) { maxTileY = Main.maxTilesY; } bool canKillWalls = false; for (int x = minTileX; x <= maxTileX; x++) { for (int y = minTileY; y <= maxTileY; y++) { float diffX = Math.Abs((float)x - projectile.position.X / 16f); float diffY = Math.Abs((float)y - projectile.position.Y / 16f); double distance = Math.Sqrt((double)(diffX * diffX + diffY * diffY)); if (distance < (double)explosionRadius && Main.tile[x, y] != null && Main.tile[x, y].wall == 0) { canKillWalls = true; break; } } } AchievementsHelper.CurrentlyMining = true; for (int i = minTileX; i <= maxTileX; i++) { for (int j = minTileY; j <= maxTileY; j++) { float diffX = Math.Abs((float)i - projectile.position.X / 16f); float diffY = Math.Abs((float)j - projectile.position.Y / 16f); double distanceToTile = Math.Sqrt((double)(diffX * diffX + diffY * diffY)); if (distanceToTile < (double)explosionRadius) { bool canKillTile = true; if (Main.tile[i, j] != null && Main.tile[i, j].active()) { canKillTile = true; if (!Main.hardMode && Main.tile[i, j].type == 58) { canKillTile = false; } if (!TileLoader.CanExplode(i, j)) { canKillTile = false; } if (canKillTile) { WorldGen.KillTile(i, j, false, false, false); if (!Main.tile[i, j].active() && Main.netMode != NetmodeID.SinglePlayer) { NetMessage.SendData(MessageID.TileChange, -1, -1, null, 0, (float)i, (float)j, 0f, 0, 0, 0); } } } if (canKillTile) { for (int x = i - 1; x <= i + 1; x++) { for (int y = j - 1; y <= j + 1; y++) { if (Main.tile[x, y] != null && Main.tile[x, y].wall > 0 && canKillWalls && WallLoader.CanExplode(x, y, Main.tile[x, y].wall)) { WorldGen.KillWall(x, y, false); if (Main.tile[x, y].wall == 0 && Main.netMode != NetmodeID.SinglePlayer) { NetMessage.SendData(MessageID.TileChange, -1, -1, null, 2, (float)x, (float)y, 0f, 0, 0, 0); } } } } } } } } AchievementsHelper.CurrentlyMining = false; } else { AchievementsHelper.CurrentlyMining = false; } }
public override void Kill(int timeLeft) { // Play explosion sound Main.PlaySound(mod.GetLegacySoundSlot(Terraria.ModLoader.SoundType.Custom, "Sounds/Custom/WarheadSound"), projectile.position); // Smoke Dust spawn for (int i = 0; i < 50; i++) { int dustIndex = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, 31, 0f, 0f, 100, default(Color), 2f); Main.dust[dustIndex].velocity *= 1.4f; } // Fire Dust spawn for (int i = 0; i < 80; i++) { int dustIndex = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, 6, 0f, 0f, 100, default(Color), 3f); Main.dust[dustIndex].noGravity = true; Main.dust[dustIndex].velocity *= 5f; dustIndex = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, 6, 0f, 0f, 100, default(Color), 2f); Main.dust[dustIndex].velocity *= 3f; } // Large Smoke Gore spawn for (int g = 0; g < 2; g++) { int goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (float)(projectile.width / 2) - 24f, projectile.position.Y + (float)(projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X + 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y + 1.5f; goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (float)(projectile.width / 2) - 24f, projectile.position.Y + (float)(projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X - 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y + 1.5f; goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (float)(projectile.width / 2) - 24f, projectile.position.Y + (float)(projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X + 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y - 1.5f; goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (float)(projectile.width / 2) - 24f, projectile.position.Y + (float)(projectile.height / 2) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f); Main.gore[goreIndex].scale = 1.5f; Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X - 1.5f; Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y - 1.5f; } // reset size to normal width and height. projectile.position.X = projectile.position.X + (float)(projectile.width / 2); projectile.position.Y = projectile.position.Y + (float)(projectile.height / 2); projectile.width = 10; projectile.height = 10; projectile.position.X = projectile.position.X - (float)(projectile.width / 2); projectile.position.Y = projectile.position.Y - (float)(projectile.height / 2); // TODO, tmodloader helper method { int explosionRadius = 75; int minTileX = (int)(projectile.position.X / 16f - (float)explosionRadius); int maxTileX = (int)(projectile.position.X / 16f + (float)explosionRadius); int minTileY = (int)(projectile.position.Y / 16f - (float)explosionRadius); int maxTileY = (int)(projectile.position.Y / 16f + (float)explosionRadius); // fix to not alter blocks outside of the world if (minTileX < 0) { minTileX = 0; } if (maxTileX > Main.maxTilesX) { maxTileX = Main.maxTilesX; } if (minTileY < 0) { minTileY = 0; } if (maxTileY > Main.maxTilesY) { maxTileY = Main.maxTilesY; } bool canKillWalls = false; for (int x = minTileX; x <= maxTileX; x++) { for (int y = minTileY; y <= maxTileY; y++) { float diffX = Math.Abs((float)x - projectile.position.X / 16f); float diffY = Math.Abs((float)y - projectile.position.Y / 16f); double distance = Math.Sqrt((double)(diffX * diffX + diffY * diffY)); if (distance < (double)explosionRadius && Main.tile[x, y] != null && Main.tile[x, y].wall == 0) { canKillWalls = true; break; } } } AchievementsHelper.CurrentlyMining = true; for (int i = minTileX; i <= maxTileX; i++) { for (int j = minTileY; j <= maxTileY; j++) { float diffX = Math.Abs((float)i - projectile.position.X / 16f); float diffY = Math.Abs((float)j - projectile.position.Y / 16f); double distanceToTile = Math.Sqrt((double)(diffX * diffX + diffY * diffY)); if (distanceToTile < (double)explosionRadius) { bool canKillTile = true; if (Main.tile[i, j] != null && Main.tile[i, j].active()) { canKillTile = true; //dungeon blocks if (Main.tileDungeon[(int)Main.tile[i, j].type] || Main.tile[i, j].type == 88 || Main.tile[i, j].type == 21 || Main.tile[i, j].type == 26 || Main.tile[i, j].type == 107 || Main.tile[i, j].type == 108 || Main.tile[i, j].type == 111 || Main.tile[i, j].type == 226 || Main.tile[i, j].type == 237 || Main.tile[i, j].type == 221 || Main.tile[i, j].type == 222 || Main.tile[i, j].type == 223 || Main.tile[i, j].type == 211 || Main.tile[i, j].type == 404) { canKillTile = false; } if (!Main.hardMode && Main.tile[i, j].type == 58) //hardmode allow destruction of Hellstone { canKillTile = false; } if (!TileLoader.CanExplode(i, j)) //verify if tile can fundamentally be blown up or not { canKillTile = false; } if (canKillTile) { WorldGen.KillTile(i, j, false, false, false); if (!Main.tile[i, j].active() && Main.netMode != NetmodeID.SinglePlayer) { NetMessage.SendData(MessageID.TileChange, -1, -1, null, 0, (float)i, (float)j, 0f, 0, 0, 0); } } } if (canKillTile) { for (int x = i - 1; x <= i + 1; x++) { for (int y = j - 1; y <= j + 1; y++) { if (Main.tile[x, y] != null && Main.tile[x, y].wall > 0 && canKillWalls && WallLoader.CanExplode(x, y, Main.tile[x, y].wall)) { WorldGen.KillWall(x, y, false); if (Main.tile[x, y].wall == 0 && Main.netMode != NetmodeID.SinglePlayer) { NetMessage.SendData(MessageID.TileChange, -1, -1, null, 2, (float)x, (float)y, 0f, 0, 0, 0); } } } } } } } } AchievementsHelper.CurrentlyMining = false; } }