Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ AI_114_Dragonflies()

void Terraria.NPC.AI_114_Dragonflies ( )
inlineprivate

Definition at line 40930 of file NPC.cs.

40931 {
40932 if (localAI[0] == 0f && Main.netMode != 1)
40933 {
40934 localAI[0] = 1f;
40935 Vector2 center = base.Center;
40936 ai[2] = center.X;
40937 ai[3] = center.Y;
40938 velocity = (Main.rand.NextVector2Circular(5f, 3f) + Main.rand.NextVector2CircularEdge(5f, 3f)) * 0.4f;
40939 ai[1] = 0f;
40940 ai[0] = 1f;
40941 netUpdate = true;
40942 }
40943 switch ((int)ai[0])
40944 {
40945 case 0:
40946 velocity *= 0.94f;
40947 if (Main.netMode != 1 && (ai[1] += 1f) >= (float)(60 + Main.rand.Next(60)))
40948 {
40949 Vector2 vector = new Vector2(ai[2], ai[3]);
40950 if (Distance(vector) > 96f)
40951 {
40952 velocity = DirectionTo(vector) * 3f;
40953 }
40954 else if (Distance(vector) > 16f)
40955 {
40956 velocity = DirectionTo(vector) * 1f + Main.rand.NextVector2Circular(1f, 0.5f);
40957 }
40958 else
40959 {
40960 velocity = (Main.rand.NextVector2Circular(5f, 3f) + Main.rand.NextVector2CircularEdge(5f, 3f)) * 0.4f;
40961 }
40962 ai[1] = 0f;
40963 ai[0] = 1f;
40964 netUpdate = true;
40965 }
40966 break;
40967 case 1:
40968 {
40969 int num = 4;
40970 Vector2 other = new Vector2(ai[2], ai[3]);
40971 if (Distance(other) > 112f)
40972 {
40973 num = 200;
40974 }
40975 if ((ai[1] += 1f) >= (float)num)
40976 {
40977 ai[1] = 0f;
40978 ai[0] = 0f;
40979 netUpdate = true;
40980 }
40981 int num2 = (int)base.Center.X / 16;
40982 int num3 = (int)base.Center.Y / 16;
40983 int num4 = 3;
40984 for (int i = num3; i < num3 + num4; i++)
40985 {
40986 if (Main.tile[num2, i] != null && ((Main.tile[num2, i].nactive() && Main.tileSolid[Main.tile[num2, i].type]) || Main.tile[num2, i].liquid > 0))
40987 {
40988 if (velocity.Y > 0f)
40989 {
40990 velocity.Y *= 0.9f;
40991 }
40992 velocity.Y -= 0.2f;
40993 }
40994 }
40995 if (!(velocity.Y < 0f))
40996 {
40997 break;
40998 }
40999 int num5 = 30;
41000 bool flag = false;
41001 for (int j = num3; j < num3 + num5; j++)
41002 {
41003 if (Main.tile[num2, j] != null && Main.tile[num2, j].nactive() && Main.tileSolid[Main.tile[num2, j].type])
41004 {
41005 flag = true;
41006 break;
41007 }
41008 }
41009 if (!flag && velocity.Y < 0f)
41010 {
41011 velocity.Y *= 0.9f;
41012 }
41013 break;
41014 }
41015 }
41016 if (velocity.X != 0f)
41017 {
41018 direction = ((velocity.X > 0f) ? 1 : (-1));
41019 }
41020 if (wet)
41021 {
41022 velocity.Y = -3f;
41023 }
41024 if (localAI[1] > 0f)
41025 {
41026 localAI[1] -= 1f;
41027 return;
41028 }
41029 localAI[1] = 15f;
41030 float num6 = 0f;
41032 for (int k = 0; k < 200; k++)
41033 {
41034 NPC nPC = Main.npc[k];
41035 if (nPC.active && nPC.damage > 0 && !nPC.friendly && nPC.Hitbox.Distance(base.Center) <= 100f)
41036 {
41037 num6 += 1f;
41038 zero += DirectionFrom(nPC.Center);
41039 }
41040 }
41041 for (int l = 0; l < 255; l++)
41042 {
41043 Player player = Main.player[l];
41044 if (player.active && player.Hitbox.Distance(base.Center) <= 150f)
41045 {
41046 num6 += 1f;
41047 zero += DirectionFrom(player.Center);
41048 }
41049 }
41050 if (num6 > 0f)
41051 {
41052 float num7 = 2f;
41053 zero /= num6;
41054 zero *= num7;
41055 velocity += zero;
41056 if (velocity.Length() > 16f)
41057 {
41058 velocity = velocity.SafeNormalize(Vector2.Zero) * 16f;
41059 }
41060 Vector2 vector2 = base.Center + zero * 10f;
41061 ai[1] = -10f;
41062 ai[0] = 1f;
41063 ai[2] = vector2.X;
41064 ai[3] = vector2.Y;
41065 netUpdate = true;
41066 }
41067 else
41068 {
41069 if (Main.netMode == 1 || !((new Vector2(ai[2], ai[3]) - base.Center).Length() < 16f))
41070 {
41071 return;
41072 }
41073 int maxValue = 30;
41074 if (Main.tile[(int)ai[2] / 16, (int)ai[3] / 16].type != 519)
41075 {
41076 maxValue = 4;
41077 }
41078 if (Main.rand.Next(maxValue) != 0)
41079 {
41080 return;
41081 }
41082 int cattailX = (int)ai[2];
41083 int cattailY = (int)ai[2];
41084 if (FindCattailTop((int)ai[2] / 16, (int)ai[3] / 16, out cattailX, out cattailY))
41085 {
41086 ai[2] = cattailX * 16;
41087 ai[3] = cattailY * 16;
41088 netUpdate = true;
41089 return;
41090 }
41091 int num8 = (int)(base.Center.X / 16f);
41092 int m;
41093 for (m = (int)(base.Center.Y / 16f); !WorldGen.SolidTile(num8, m) && (double)m < Main.worldSurface; m++)
41094 {
41095 }
41096 m -= Main.rand.Next(3, 6);
41097 ai[2] = num8 * 16;
41098 ai[3] = m * 16;
41099 netUpdate = true;
41100 }
41101 }
Vector2 DirectionFrom(Vector2 Source)
Definition Entity.cs:202
Vector2 velocity
Definition Entity.cs:16
float Distance(Vector2 Other)
Definition Entity.cs:187
Vector2 DirectionTo(Vector2 Destination)
Definition Entity.cs:197
float[] localAI
Definition NPC.cs:449
float[] ai
Definition NPC.cs:447
static bool FindCattailTop(int landX, int landY, out int cattailX, out int cattailY)
Definition NPC.cs:76951
bool netUpdate
Definition NPC.cs:507

References Terraria.Entity.active, Terraria.NPC.ai, Terraria.Entity.Center, Terraria.Entity.direction, Terraria.Entity.DirectionFrom(), Terraria.Entity.DirectionTo(), Terraria.Entity.Distance(), Terraria.NPC.FindCattailTop(), Terraria.Entity.Hitbox, Microsoft.Xna.Framework.Vector2.Length(), Terraria.NPC.localAI, Terraria.Main.netMode, Terraria.NPC.netUpdate, Terraria.Main.npc, System.other, Terraria.Main.player, Terraria.Main.rand, Terraria.WorldGen.SolidTile(), Terraria.Main.tile, Terraria.Main.tileSolid, Microsoft.Xna.Framework.Graphics.Vector2, Terraria.Entity.velocity, Terraria.Entity.wet, Terraria.Main.worldSurface, Microsoft.Xna.Framework.Vector2.X, Microsoft.Xna.Framework.Vector2.Y, and Microsoft.Xna.Framework.Vector2.Zero.

Referenced by Terraria.NPC.AI().