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

◆ AI_065_Butterflies()

void Terraria.NPC.AI_065_Butterflies ( )
inlineprivate

Definition at line 38028 of file NPC.cs.

38029 {
38030 float num = ai[0];
38031 float num2 = ai[1];
38032 if (type == 661)
38033 {
38034 Vector3 rgb = Main.hslToRgb(Main.GlobalTimeWrappedHourly * 0.33f % 1f, 1f, 0.5f).ToVector3() * 0.3f;
38035 rgb += Vector3.One * 0.1f;
38036 Lighting.AddLight(base.Center, rgb);
38037 int num3 = 60;
38038 bool flag = false;
38039 int num4 = 50;
38041 if (targetData.Invalid || targetData.Center.Distance(base.Center) >= 300f)
38042 {
38043 flag = true;
38044 }
38045 if (!Main.remixWorld && !targetData.Invalid && targetData.Type == NPCTargetType.Player && !Main.player[target].ZoneHallow)
38046 {
38047 num4 = num3;
38048 flag = true;
38049 }
38050 ai[2] = MathHelper.Clamp(ai[2] + (float)flag.ToDirectionInt(), 0f, num4);
38051 if (ai[2] >= (float)num3)
38052 {
38053 active = false;
38054 if (Main.netMode != 1)
38055 {
38056 NetMessage.SendData(23, -1, -1, null, whoAmI);
38057 }
38058 return;
38059 }
38060 Opacity = Utils.GetLerpValue(num3, (float)num4 / 2f, ai[2], clamped: true);
38061 if (ai[2] > 0f)
38062 {
38063 int num5 = 1;
38064 for (int i = 0; i < num5; i++)
38065 {
38066 if (Main.rand.Next(5) == 0)
38067 {
38068 float num6 = MathHelper.Lerp(0.9f, 0.6f, Opacity);
38069 Color newColor = Main.hslToRgb(Main.GlobalTimeWrappedHourly * 0.3f % 1f, 1f, 0.5f) * 0.5f;
38070 int num7 = Dust.NewDust(position, width, height, 267, 0f, 0f, 0, newColor);
38071 Main.dust[num7].position = base.Center + Main.rand.NextVector2Circular(width, height);
38072 Main.dust[num7].velocity *= Main.rand.NextFloat() * 0.8f;
38073 Main.dust[num7].velocity += velocity * 0.6f;
38074 Main.dust[num7].noGravity = true;
38075 Main.dust[num7].fadeIn = 0.6f + Main.rand.NextFloat() * 0.7f * num6;
38076 Main.dust[num7].scale = 0.35f;
38077 if (num7 != 6000)
38078 {
38079 Dust dust = Dust.CloneDust(num7);
38080 dust.scale /= 2f;
38081 dust.fadeIn *= 0.85f;
38082 dust.color = new Color(255, 255, 255, 255) * 0.5f;
38083 }
38084 }
38085 }
38086 }
38087 dontTakeDamage = ai[2] >= (float)(num4 / 2);
38088 }
38089 if (Main.netMode != 1)
38090 {
38091 if (ai[2] == 0f && type != 661)
38092 {
38093 int num8 = 0;
38094 int num9 = 4;
38095 int num10 = 6;
38096 int num11 = 3;
38097 int num12 = 7;
38098 int num13 = 2;
38099 int num14 = 1;
38100 int num15 = 5;
38101 int num16 = Main.rand.Next(100);
38102 num16 = ((num16 == 0) ? num15 : ((num16 < 3) ? num14 : ((num16 < 9) ? num13 : ((num16 < 19) ? num12 : ((num16 < 34) ? num11 : ((num16 < 53) ? num10 : ((num16 >= 75) ? num8 : num9)))))));
38103 ai[2] = 1 + num16;
38104 }
38105 if (ai[3] == 0f)
38106 {
38107 ai[3] = (float)Main.rand.Next(75, 111) * 0.01f;
38108 }
38109 localAI[0] -= 1f;
38110 if (localAI[0] <= 0f)
38111 {
38112 localAI[0] = Main.rand.Next(90, 240);
38113 TargetClosest();
38114 float num17 = Math.Abs(base.Center.X - Main.player[target].Center.X);
38115 if (num17 > 700f && localAI[3] == 0f)
38116 {
38117 float num18 = (float)Main.rand.Next(50, 151) * 0.01f;
38118 if (num17 > 1000f)
38119 {
38120 num18 = (float)Main.rand.Next(150, 201) * 0.01f;
38121 }
38122 else if (num17 > 850f)
38123 {
38124 num18 = (float)Main.rand.Next(100, 151) * 0.01f;
38125 }
38126 int num19 = direction * Main.rand.Next(100, 251);
38127 int num20 = Main.rand.Next(-50, 51);
38128 if (position.Y > Main.player[target].position.Y - 100f)
38129 {
38130 num20 -= Main.rand.Next(100, 251);
38131 }
38132 float num21 = num18 / (float)Math.Sqrt(num19 * num19 + num20 * num20);
38133 num = (float)num19 * num21;
38134 num2 = (float)num20 * num21;
38135 }
38136 else
38137 {
38138 localAI[3] = 1f;
38139 float num22 = (float)Main.rand.Next(26, 301) * 0.01f;
38140 int num23 = Main.rand.Next(-100, 101);
38141 int num24 = Main.rand.Next(-100, 101);
38142 float num25 = num22 / (float)Math.Sqrt(num23 * num23 + num24 * num24);
38143 num = (float)num23 * num25;
38144 num2 = (float)num24 * num25;
38145 }
38146 netUpdate = true;
38147 }
38148 }
38149 scale = ai[3];
38150 int num26 = 60;
38151 velocity.X = (velocity.X * (float)(num26 - 1) + num) / (float)num26;
38152 velocity.Y = (velocity.Y * (float)(num26 - 1) + num2) / (float)num26;
38153 if (velocity.Y > 0f)
38154 {
38155 int num27 = 3;
38156 int num28 = (int)base.Center.X / 16;
38157 int num29 = (int)base.Center.Y / 16;
38158 for (int j = num29; j < num29 + num27; j++)
38159 {
38160 if (Main.tile[num28, j] != null && ((Main.tile[num28, j].nactive() && Main.tileSolid[Main.tile[num28, j].type]) || Main.tile[num28, j].liquid > 0))
38161 {
38162 num2 *= -1f;
38163 if (velocity.Y > 0f)
38164 {
38165 velocity.Y *= 0.9f;
38166 }
38167 }
38168 }
38169 }
38170 if (velocity.Y < 0f)
38171 {
38172 int num30 = 30;
38173 bool flag2 = false;
38174 int num31 = (int)base.Center.X / 16;
38175 int num32 = (int)base.Center.Y / 16;
38176 for (int k = num32; k < num32 + num30; k++)
38177 {
38178 if (Main.tile[num31, k] != null && Main.tile[num31, k].nactive() && Main.tileSolid[Main.tile[num31, k].type])
38179 {
38180 flag2 = true;
38181 }
38182 }
38183 if (!flag2)
38184 {
38185 num2 *= -1f;
38186 if (velocity.Y < 0f)
38187 {
38188 velocity.Y *= 0.9f;
38189 }
38190 }
38191 }
38192 if (localAI[1] > 0f)
38193 {
38194 localAI[1] -= 1f;
38195 }
38196 else
38197 {
38198 localAI[1] = 15f;
38199 if (type == 661)
38200 {
38201 localAI[1] = 10f;
38202 }
38203 float num33 = 0f;
38205 for (int l = 0; l < 200; l++)
38206 {
38207 NPC nPC = Main.npc[l];
38208 if (nPC.active && nPC.damage > 0 && !nPC.friendly && nPC.Hitbox.Distance(base.Center) <= 100f)
38209 {
38210 num33 += 1f;
38211 zero += DirectionFrom(nPC.Center);
38212 }
38213 }
38214 if (num33 > 0f)
38215 {
38216 zero /= num33;
38217 zero *= 2f;
38218 velocity += zero;
38219 if (velocity.Length() > 16f)
38220 {
38221 velocity = velocity.SafeNormalize(Vector2.Zero) * 16f;
38222 }
38223 }
38224 }
38225 if (collideX)
38226 {
38227 num = ((!(velocity.X < 0f)) ? (0f - Math.Abs(num)) : Math.Abs(num));
38228 velocity.X *= -0.2f;
38229 }
38230 if (velocity.X < 0f)
38231 {
38232 direction = -1;
38233 }
38234 if (velocity.X > 0f)
38235 {
38236 direction = 1;
38237 }
38238 ai[0] = num;
38239 ai[1] = num2;
38240 if (type == 356)
38241 {
38242 catchItem = (short)(1994f + ai[2] - 1f);
38243 }
38244 if (type == 653)
38245 {
38247 Lighting.AddLight((int)base.Center.X / 16, (int)base.Center.Y / 16, 0.6f, 0.3f, 0.1f);
38248 if (Main.rand.Next(60) == 0)
38249 {
38250 int num34 = Dust.NewDust(position, width, height, 6, 0f, 0f, 254);
38251 Main.dust[num34].velocity *= 0f;
38252 }
38254 }
38255 }
static float Lerp(float value1, float value2, float amount)
Definition MathHelper.cs:53
static float Clamp(float value, float min, float max)
Definition MathHelper.cs:46
static double Sqrt(double d)
static double Abs(double value)
Vector2 DirectionFrom(Vector2 Source)
Definition Entity.cs:202
Vector2 velocity
Definition Entity.cs:16
Vector2 position
Definition Entity.cs:14
Vector2 netOffset
Definition NPC.cs:103
float[] localAI
Definition NPC.cs:449
float Opacity
Definition NPC.cs:810
void TargetClosest(bool faceTarget=true)
Definition NPC.cs:69934
NPCAimedTarget GetTargetData(bool ignorePlayerTankPets=true)
Definition NPC.cs:864
float[] ai
Definition NPC.cs:447
bool dontTakeDamage
Definition NPC.cs:527
float scale
Definition NPC.cs:493
bool collideX
Definition NPC.cs:511
int type
Definition NPC.cs:445
short catchItem
Definition NPC.cs:105
bool netUpdate
Definition NPC.cs:507
int target
Definition NPC.cs:459

References System.Math.Abs(), Terraria.Entity.active, Terraria.Lighting.AddLight(), Terraria.NPC.ai, Terraria.NPC.catchItem, Microsoft.Xna.Framework.MathHelper.Clamp(), Terraria.Dust.CloneDust(), Terraria.NPC.collideX, Microsoft.Xna.Framework.Graphics.Color, Terraria.Entity.direction, Terraria.Entity.DirectionFrom(), Terraria.NPC.dontTakeDamage, Terraria.Main.dust, Terraria.Utils.GetLerpValue(), Terraria.NPC.GetTargetData(), Terraria.Main.GlobalTimeWrappedHourly, Terraria.Entity.height, Terraria.Main.hslToRgb(), Microsoft.Xna.Framework.Vector2.Length(), Microsoft.Xna.Framework.MathHelper.Lerp(), Terraria.NPC.localAI, Terraria.Main.netMode, Terraria.NPC.netOffset, Terraria.NPC.netUpdate, Terraria.Dust.NewDust(), Terraria.Main.npc, Terraria.NPC.Opacity, Terraria.Main.player, Terraria.Entity.position, Terraria.Main.rand, Terraria.Main.remixWorld, Terraria.NPC.scale, Terraria.NetMessage.SendData(), System.Math.Sqrt(), Terraria.NPC.target, Terraria.NPC.TargetClosest(), Terraria.Main.tile, Terraria.Main.tileSolid, Terraria.NPC.type, Terraria.Entity.velocity, Terraria.Entity.whoAmI, Terraria.Entity.width, Microsoft.Xna.Framework.Vector2.X, Microsoft.Xna.Framework.Vector2.Y, and Microsoft.Xna.Framework.Vector2.Zero.

Referenced by Terraria.NPC.AI().