Terraria v1.4.4.9
Terraria source code documentation
All Classes Namespaces Files Functions Variables Enumerations Enumerator Properties Events Macros

◆ AI_037_Destroyer()

void Terraria.NPC.AI_037_Destroyer ( )
inlineprivate

Definition at line 42979 of file NPC.cs.

42980 {
42981 int num = 0;
42982 int num2 = 10;
42983 if (IsMechQueenUp && type != 134)
42984 {
42985 int num3 = (int)ai[1];
42986 while (num3 > 0 && num3 < 200)
42987 {
42988 if (Main.npc[num3].active && Main.npc[num3].type >= 134 && Main.npc[num3].type <= 136)
42989 {
42990 num++;
42991 if (Main.npc[num3].type == 134)
42992 {
42993 break;
42994 }
42995 if (num >= num2)
42996 {
42997 num = 0;
42998 break;
42999 }
43000 num3 = (int)Main.npc[num3].ai[1];
43001 continue;
43002 }
43003 num = 0;
43004 break;
43005 }
43006 }
43007 if (ai[3] > 0f)
43008 {
43009 realLife = (int)ai[3];
43010 }
43011 if (target < 0 || target == 255 || Main.player[target].dead)
43012 {
43013 TargetClosest();
43014 }
43015 if (type >= 134 && type <= 136)
43016 {
43017 velocity.Length();
43018 if (type == 134 || (type != 134 && Main.npc[(int)ai[1]].alpha < 128))
43019 {
43020 if (alpha != 0)
43021 {
43022 for (int i = 0; i < 2; i++)
43023 {
43024 int num4 = Dust.NewDust(new Vector2(position.X, position.Y), width, height, 182, 0f, 0f, 100, default(Color), 2f);
43025 Main.dust[num4].noGravity = true;
43026 Main.dust[num4].noLight = true;
43027 }
43028 }
43029 alpha -= 42;
43030 if (alpha < 0)
43031 {
43032 alpha = 0;
43033 }
43034 }
43035 }
43036 if (type > 134)
43037 {
43038 bool flag = false;
43039 if (ai[1] <= 0f)
43040 {
43041 flag = true;
43042 }
43043 else if (Main.npc[(int)ai[1]].life <= 0)
43044 {
43045 flag = true;
43046 }
43047 if (flag)
43048 {
43049 life = 0;
43050 HitEffect();
43051 checkDead();
43052 }
43053 }
43054 if (Main.netMode != 1)
43055 {
43056 if (ai[0] == 0f && type == 134)
43057 {
43058 ai[3] = whoAmI;
43059 realLife = whoAmI;
43060 int num5 = 0;
43061 int num6 = whoAmI;
43063 for (int j = 0; j <= destroyerSegmentsCount; j++)
43064 {
43065 int num7 = 135;
43067 {
43068 num7 = 136;
43069 }
43070 num5 = NewNPC(GetSpawnSourceForNPCFromNPCAI(), (int)(position.X + (float)(width / 2)), (int)(position.Y + (float)height), num7, whoAmI);
43071 Main.npc[num5].ai[3] = whoAmI;
43072 Main.npc[num5].realLife = whoAmI;
43073 Main.npc[num5].ai[1] = num6;
43074 Main.npc[num6].ai[0] = num5;
43075 NetMessage.SendData(23, -1, -1, null, num5);
43076 num6 = num5;
43077 }
43078 }
43079 if (type == 135)
43080 {
43081 localAI[0] += Main.rand.Next(4);
43082 if (localAI[0] >= (float)Main.rand.Next(1400, 26000))
43083 {
43084 localAI[0] = 0f;
43085 TargetClosest();
43086 if (Collision.CanHit(position, width, height, Main.player[target].position, Main.player[target].width, Main.player[target].height))
43087 {
43088 Vector2 vector = new Vector2(position.X + (float)width * 0.5f, position.Y + (float)(height / 2));
43089 float num8 = Main.player[target].position.X + (float)Main.player[target].width * 0.5f - vector.X + (float)Main.rand.Next(-20, 21);
43090 float num9 = Main.player[target].position.Y + (float)Main.player[target].height * 0.5f - vector.Y + (float)Main.rand.Next(-20, 21);
43091 float num10 = (float)Math.Sqrt(num8 * num8 + num9 * num9);
43092 num10 = 8f / num10;
43093 num8 *= num10;
43094 num9 *= num10;
43095 num8 += (float)Main.rand.Next(-20, 21) * 0.05f;
43096 num9 += (float)Main.rand.Next(-20, 21) * 0.05f;
43098 int num11 = 100;
43099 vector.X += num8 * 5f;
43100 vector.Y += num9 * 5f;
43101 int num12 = Projectile.NewProjectile(GetSpawnSource_ForProjectile(), vector.X, vector.Y, num8, num9, num11, attackDamage_ForProjectiles, 0f, Main.myPlayer);
43102 Main.projectile[num12].timeLeft = 300;
43103 netUpdate = true;
43104 }
43105 }
43106 }
43107 }
43108 int num13 = (int)(position.X / 16f) - 1;
43109 int num14 = (int)((position.X + (float)width) / 16f) + 2;
43110 int num15 = (int)(position.Y / 16f) - 1;
43111 int num16 = (int)((position.Y + (float)height) / 16f) + 2;
43112 if (num13 < 0)
43113 {
43114 num13 = 0;
43115 }
43116 if (num14 > Main.maxTilesX)
43117 {
43118 num14 = Main.maxTilesX;
43119 }
43120 if (num15 < 0)
43121 {
43122 num15 = 0;
43123 }
43124 if (num16 > Main.maxTilesY)
43125 {
43126 num16 = Main.maxTilesY;
43127 }
43128 bool flag2 = false;
43129 if (!flag2)
43130 {
43131 Vector2 vector2 = default(Vector2);
43132 for (int k = num13; k < num14; k++)
43133 {
43134 for (int l = num15; l < num16; l++)
43135 {
43136 if (Main.tile[k, l] != null && ((Main.tile[k, l].nactive() && (Main.tileSolid[Main.tile[k, l].type] || (Main.tileSolidTop[Main.tile[k, l].type] && Main.tile[k, l].frameY == 0))) || Main.tile[k, l].liquid > 64))
43137 {
43138 vector2.X = k * 16;
43139 vector2.Y = l * 16;
43140 if (position.X + (float)width > vector2.X && position.X < vector2.X + 16f && position.Y + (float)height > vector2.Y && position.Y < vector2.Y + 16f)
43141 {
43142 flag2 = true;
43143 break;
43144 }
43145 }
43146 }
43147 }
43148 }
43149 if (!flag2)
43150 {
43151 if (type != 135 || ai[2] != 1f)
43152 {
43153 Lighting.AddLight((int)((position.X + (float)(width / 2)) / 16f), (int)((position.Y + (float)(height / 2)) / 16f), 0.3f, 0.1f, 0.05f);
43154 }
43155 localAI[1] = 1f;
43156 if (type == 134)
43157 {
43159 int num17 = 1000;
43160 bool flag3 = true;
43161 if (position.Y > Main.player[target].position.Y)
43162 {
43163 for (int m = 0; m < 255; m++)
43164 {
43165 if (Main.player[m].active)
43166 {
43167 Rectangle rectangle2 = new Rectangle((int)Main.player[m].position.X - num17, (int)Main.player[m].position.Y - num17, num17 * 2, num17 * 2);
43168 if (rectangle.Intersects(rectangle2))
43169 {
43170 flag3 = false;
43171 break;
43172 }
43173 }
43174 }
43175 if (flag3)
43176 {
43177 flag2 = true;
43178 }
43179 }
43180 }
43181 }
43182 else
43183 {
43184 localAI[1] = 0f;
43185 }
43186 float num18 = 16f;
43187 if (Main.IsItDay() || Main.player[target].dead)
43188 {
43189 flag2 = false;
43190 velocity.Y += 1f;
43191 if ((double)position.Y > Main.worldSurface * 16.0)
43192 {
43193 velocity.Y += 1f;
43194 num18 = 32f;
43195 }
43196 if ((double)position.Y > Main.rockLayer * 16.0)
43197 {
43198 for (int n = 0; n < 200; n++)
43199 {
43200 if (Main.npc[n].aiStyle == aiStyle)
43201 {
43202 Main.npc[n].active = false;
43203 }
43204 }
43205 }
43206 }
43207 float num19 = 0.1f;
43208 float num20 = 0.15f;
43209 if (Main.getGoodWorld)
43210 {
43211 num19 *= 1.2f;
43212 num20 *= 1.2f;
43213 }
43214 Vector2 vector3 = new Vector2(position.X + (float)width * 0.5f, position.Y + (float)height * 0.5f);
43215 float num21 = Main.player[target].position.X + (float)(Main.player[target].width / 2);
43216 float num22 = Main.player[target].position.Y + (float)(Main.player[target].height / 2);
43217 num21 = (int)(num21 / 16f) * 16;
43218 num22 = (int)(num22 / 16f) * 16;
43219 vector3.X = (int)(vector3.X / 16f) * 16;
43220 vector3.Y = (int)(vector3.Y / 16f) * 16;
43221 num21 -= vector3.X;
43222 num22 -= vector3.Y;
43223 float num23 = (float)Math.Sqrt(num21 * num21 + num22 * num22);
43224 if (ai[1] > 0f && ai[1] < (float)Main.npc.Length)
43225 {
43226 int num24 = (int)(44f * scale);
43227 try
43228 {
43229 vector3 = new Vector2(position.X + (float)width * 0.5f, position.Y + (float)height * 0.5f);
43230 num21 = Main.npc[(int)ai[1]].position.X + (float)(Main.npc[(int)ai[1]].width / 2) - vector3.X;
43231 num22 = Main.npc[(int)ai[1]].position.Y + (float)(Main.npc[(int)ai[1]].height / 2) - vector3.Y;
43232 }
43233 catch
43234 {
43235 }
43236 if (num > 0)
43237 {
43238 float num25 = (float)num24 - (float)num24 * (((float)num - 1f) * 0.1f);
43239 if (num25 < 0f)
43240 {
43241 num25 = 0f;
43242 }
43243 if (num25 > (float)num24)
43244 {
43245 num25 = num24;
43246 }
43247 num22 = Main.npc[(int)ai[1]].position.Y + (float)(Main.npc[(int)ai[1]].height / 2) + num25 - vector3.Y;
43248 }
43249 rotation = (float)Math.Atan2(num22, num21) + 1.57f;
43250 num23 = (float)Math.Sqrt(num21 * num21 + num22 * num22);
43251 if (num > 0)
43252 {
43253 num24 = num24 / num2 * num;
43254 }
43255 num23 = (num23 - (float)num24) / num23;
43256 num21 *= num23;
43257 num22 *= num23;
43259 position.X += num21;
43260 position.Y += num22;
43261 num21 = Main.npc[(int)ai[1]].position.X + (float)(Main.npc[(int)ai[1]].width / 2) - vector3.X;
43262 num22 = Main.npc[(int)ai[1]].position.Y + (float)(Main.npc[(int)ai[1]].height / 2) - vector3.Y;
43263 rotation = (float)Math.Atan2(num22, num21) + 1.57f;
43264 }
43265 else
43266 {
43267 if (!flag2)
43268 {
43269 TargetClosest();
43270 velocity.Y += 0.15f;
43271 if (velocity.Y > num18)
43272 {
43273 velocity.Y = num18;
43274 }
43275 if ((double)(Math.Abs(velocity.X) + Math.Abs(velocity.Y)) < (double)num18 * 0.4)
43276 {
43277 if (velocity.X < 0f)
43278 {
43279 velocity.X -= num19 * 1.1f;
43280 }
43281 else
43282 {
43283 velocity.X += num19 * 1.1f;
43284 }
43285 }
43286 else if (velocity.Y == num18)
43287 {
43288 if (velocity.X < num21)
43289 {
43290 velocity.X += num19;
43291 }
43292 else if (velocity.X > num21)
43293 {
43294 velocity.X -= num19;
43295 }
43296 }
43297 else if (velocity.Y > 4f)
43298 {
43299 if (velocity.X < 0f)
43300 {
43301 velocity.X += num19 * 0.9f;
43302 }
43303 else
43304 {
43305 velocity.X -= num19 * 0.9f;
43306 }
43307 }
43308 }
43309 else
43310 {
43311 if (soundDelay == 0)
43312 {
43313 float num26 = num23 / 40f;
43314 if (num26 < 10f)
43315 {
43316 num26 = 10f;
43317 }
43318 if (num26 > 20f)
43319 {
43320 num26 = 20f;
43321 }
43322 soundDelay = (int)num26;
43323 SoundEngine.PlaySound(15, (int)position.X, (int)position.Y);
43324 }
43325 num23 = (float)Math.Sqrt(num21 * num21 + num22 * num22);
43326 float num27 = Math.Abs(num21);
43327 float num28 = Math.Abs(num22);
43328 float num29 = num18 / num23;
43329 num21 *= num29;
43330 num22 *= num29;
43331 if (((velocity.X > 0f && num21 > 0f) || (velocity.X < 0f && num21 < 0f)) && ((velocity.Y > 0f && num22 > 0f) || (velocity.Y < 0f && num22 < 0f)))
43332 {
43333 if (velocity.X < num21)
43334 {
43335 velocity.X += num20;
43336 }
43337 else if (velocity.X > num21)
43338 {
43339 velocity.X -= num20;
43340 }
43341 if (velocity.Y < num22)
43342 {
43343 velocity.Y += num20;
43344 }
43345 else if (velocity.Y > num22)
43346 {
43347 velocity.Y -= num20;
43348 }
43349 }
43350 if ((velocity.X > 0f && num21 > 0f) || (velocity.X < 0f && num21 < 0f) || (velocity.Y > 0f && num22 > 0f) || (velocity.Y < 0f && num22 < 0f))
43351 {
43352 if (velocity.X < num21)
43353 {
43354 velocity.X += num19;
43355 }
43356 else if (velocity.X > num21)
43357 {
43358 velocity.X -= num19;
43359 }
43360 if (velocity.Y < num22)
43361 {
43362 velocity.Y += num19;
43363 }
43364 else if (velocity.Y > num22)
43365 {
43366 velocity.Y -= num19;
43367 }
43368 if ((double)Math.Abs(num22) < (double)num18 * 0.2 && ((velocity.X > 0f && num21 < 0f) || (velocity.X < 0f && num21 > 0f)))
43369 {
43370 if (velocity.Y > 0f)
43371 {
43372 velocity.Y += num19 * 2f;
43373 }
43374 else
43375 {
43376 velocity.Y -= num19 * 2f;
43377 }
43378 }
43379 if ((double)Math.Abs(num21) < (double)num18 * 0.2 && ((velocity.Y > 0f && num22 < 0f) || (velocity.Y < 0f && num22 > 0f)))
43380 {
43381 if (velocity.X > 0f)
43382 {
43383 velocity.X += num19 * 2f;
43384 }
43385 else
43386 {
43387 velocity.X -= num19 * 2f;
43388 }
43389 }
43390 }
43391 else if (num27 > num28)
43392 {
43393 if (velocity.X < num21)
43394 {
43395 velocity.X += num19 * 1.1f;
43396 }
43397 else if (velocity.X > num21)
43398 {
43399 velocity.X -= num19 * 1.1f;
43400 }
43401 if ((double)(Math.Abs(velocity.X) + Math.Abs(velocity.Y)) < (double)num18 * 0.5)
43402 {
43403 if (velocity.Y > 0f)
43404 {
43405 velocity.Y += num19;
43406 }
43407 else
43408 {
43409 velocity.Y -= num19;
43410 }
43411 }
43412 }
43413 else
43414 {
43415 if (velocity.Y < num22)
43416 {
43417 velocity.Y += num19 * 1.1f;
43418 }
43419 else if (velocity.Y > num22)
43420 {
43421 velocity.Y -= num19 * 1.1f;
43422 }
43423 if ((double)(Math.Abs(velocity.X) + Math.Abs(velocity.Y)) < (double)num18 * 0.5)
43424 {
43425 if (velocity.X > 0f)
43426 {
43427 velocity.X += num19;
43428 }
43429 else
43430 {
43431 velocity.X -= num19;
43432 }
43433 }
43434 }
43435 }
43436 rotation = (float)Math.Atan2(velocity.Y, velocity.X) + 1.57f;
43437 if (type == 134)
43438 {
43439 if (flag2)
43440 {
43441 if (localAI[0] != 1f)
43442 {
43443 netUpdate = true;
43444 }
43445 localAI[0] = 1f;
43446 }
43447 else
43448 {
43449 if (localAI[0] != 0f)
43450 {
43451 netUpdate = true;
43452 }
43453 localAI[0] = 0f;
43454 }
43455 if (((velocity.X > 0f && oldVelocity.X < 0f) || (velocity.X < 0f && oldVelocity.X > 0f) || (velocity.Y > 0f && oldVelocity.Y < 0f) || (velocity.Y < 0f && oldVelocity.Y > 0f)) && !justHit)
43456 {
43457 netUpdate = true;
43458 }
43459 }
43460 }
43461 if (IsMechQueenUp && type == 134)
43462 {
43463 NPC nPC = Main.npc[mechQueen];
43464 Vector2 mechQueenCenter = nPC.GetMechQueenCenter();
43465 Vector2 vector4 = new Vector2(0f, 100f);
43467 float num30 = nPC.velocity.X * 0.025f;
43469 position = spinningpoint - base.Size / 2f + nPC.velocity;
43470 velocity.X = 0f;
43471 velocity.Y = 0f;
43472 rotation = num30 * 0.75f + (float)Math.PI;
43473 }
43474 }
static double Atan2(double y, double x)
static double Sqrt(double d)
static double Abs(double value)
const double PI
Definition Math.cs:16
static void PlaySound(int type, Vector2 position, int style=1)
Vector2 velocity
Definition Entity.cs:16
Vector2 position
Definition Entity.cs:14
Vector2 oldVelocity
Definition Entity.cs:20
static int GetDestroyerSegmentsCount()
Definition NPC.cs:44202
float[] localAI
Definition NPC.cs:449
void TargetClosest(bool faceTarget=true)
Definition NPC.cs:69934
int aiStyle
Definition NPC.cs:453
float[] ai
Definition NPC.cs:447
static bool IsMechQueenUp
Definition NPC.cs:834
float scale
Definition NPC.cs:493
int type
Definition NPC.cs:445
int alpha
Definition NPC.cs:489
float rotation
Definition NPC.cs:501
IEntitySource GetSpawnSourceForNPCFromNPCAI()
Definition NPC.cs:87546
static int NewNPC(IEntitySource source, int X, int Y, int Type, int Start=0, float ai0=0f, float ai1=0f, float ai2=0f, float ai3=0f, int Target=255)
Definition NPC.cs:77654
void checkDead()
Definition NPC.cs:70326
int GetAttackDamage_ForProjectiles(float normalDamage, float expertDamage)
Definition NPC.cs:1082
void HitEffect(int hitDirection=0, double dmg=10.0)
Definition NPC.cs:78386
bool justHit
Definition NPC.cs:455
static int mechQueen
Definition NPC.cs:581
int life
Definition NPC.cs:477
IEntitySource GetSpawnSource_ForProjectile()
Definition NPC.cs:87526
int soundDelay
Definition NPC.cs:437
int realLife
Definition NPC.cs:173
bool netUpdate
Definition NPC.cs:507
int target
Definition NPC.cs:459

References System.Math.Abs(), Terraria.Lighting.AddLight(), Terraria.NPC.ai, Terraria.NPC.aiStyle, Terraria.NPC.alpha, System.Math.Atan2(), Terraria.Collision.CanHit(), Terraria.NPC.checkDead(), Terraria.Main.dust, Terraria.NPC.GetAttackDamage_ForProjectiles(), Terraria.NPC.GetDestroyerSegmentsCount(), Terraria.Main.getGoodWorld, Terraria.NPC.GetSpawnSource_ForProjectile(), Terraria.NPC.GetSpawnSourceForNPCFromNPCAI(), Terraria.Entity.height, Terraria.NPC.HitEffect(), Terraria.Main.IsItDay(), Terraria.NPC.IsMechQueenUp, Terraria.NPC.justHit, Microsoft.Xna.Framework.Vector2.Length(), Terraria.NPC.life, Terraria.NPC.localAI, Terraria.Main.maxTilesX, Terraria.Main.maxTilesY, Terraria.NPC.mechQueen, Terraria.Main.myPlayer, Terraria.Main.netMode, Terraria.NPC.netUpdate, Terraria.Dust.NewDust(), Terraria.NPC.NewNPC(), Terraria.Projectile.NewProjectile(), Terraria.Main.npc, Terraria.Entity.oldVelocity, System.Math.PI, Terraria.Main.player, Terraria.Audio.SoundEngine.PlaySound(), Terraria.Entity.position, Terraria.Main.projectile, Terraria.Main.rand, Terraria.NPC.realLife, Terraria.Main.rockLayer, Terraria.NPC.rotation, Terraria.NPC.scale, Terraria.NetMessage.SendData(), Terraria.NPC.soundDelay, System.Math.Sqrt(), Terraria.NPC.target, Terraria.NPC.TargetClosest(), Terraria.Main.tile, Terraria.Main.tileSolid, Terraria.Main.tileSolidTop, Terraria.NPC.type, Microsoft.Xna.Framework.Graphics.Vector2, Terraria.Entity.velocity, Terraria.Entity.whoAmI, Terraria.Entity.width, Terraria.Main.worldSurface, Microsoft.Xna.Framework.Vector2.X, Microsoft.Xna.Framework.Vector2.Y, and Microsoft.Xna.Framework.Vector2.Zero.

Referenced by Terraria.NPC.AI().