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

◆ AI_047_GolemFist()

void Terraria.NPC.AI_047_GolemFist ( )
inlineprivate

Definition at line 13035 of file NPC.cs.

13036 {
13037 float num = GetMyBalance();
13038 if (Main.getGoodWorld)
13039 {
13040 num += 3f;
13041 }
13042 if ((!Main.player[target].ZoneLihzhardTemple && !Main.player[target].ZoneJungle) || (double)Main.player[target].Center.Y < Main.worldSurface * 16.0)
13043 {
13044 num *= 2f;
13045 }
13046 if (golemBoss < 0)
13047 {
13048 StrikeNPCNoInteraction(9999, 0f, 0);
13049 return;
13050 }
13051 if (alpha > 0)
13052 {
13053 alpha -= 10;
13054 if (alpha < 0)
13055 {
13056 alpha = 0;
13057 }
13058 ai[1] = 0f;
13059 }
13060 Player player = Main.player[target];
13061 NPC nPC = Main.npc[golemBoss];
13062 Vector2 vector = nPC.Center + nPC.velocity + new Vector2(0f, -9f * scale);
13063 vector.X += (float)((type == 247) ? (-84) : 78) * scale;
13064 Vector2 vector2 = vector - base.Center;
13065 float num2 = vector2.Length();
13066 if (ai[0] == 0f)
13067 {
13068 noTileCollide = true;
13069 float num3 = 14f;
13070 if (life < lifeMax / 2)
13071 {
13072 num3 += 3f;
13073 }
13074 if (life < lifeMax / 4)
13075 {
13076 num3 += 3f;
13077 }
13078 if (Main.npc[golemBoss].life < Main.npc[golemBoss].lifeMax)
13079 {
13080 num3 += 8f;
13081 }
13082 num3 *= (num + 3f) / 4f;
13083 if (num3 > 32f)
13084 {
13085 num3 = 32f;
13086 }
13087 float x = vector2.X;
13088 float y = vector2.Y;
13089 float num4 = num2;
13090 if (num4 < 12f + num3)
13091 {
13092 rotation = 0f;
13093 velocity.X = x;
13094 velocity.Y = y;
13095 float num5 = num;
13096 ai[1] += num5;
13097 if (life < lifeMax / 2)
13098 {
13099 ai[1] += num5;
13100 }
13101 if (life < lifeMax / 4)
13102 {
13103 ai[1] += num5;
13104 }
13105 if (Main.npc[golemBoss].life < Main.npc[golemBoss].lifeMax)
13106 {
13107 ai[1] += 10f * num5;
13108 }
13109 if (ai[1] >= 60f)
13110 {
13111 TargetClosest();
13112 if ((type == 247 && base.Center.X + 100f > Main.player[target].Center.X) || (type == 248 && base.Center.X - 100f < Main.player[target].Center.X))
13113 {
13114 ai[1] = 0f;
13115 ai[0] = 1f;
13116 }
13117 else
13118 {
13119 ai[1] = 0f;
13120 }
13121 }
13122 }
13123 else
13124 {
13125 num4 = num3 / num4;
13126 velocity.X = x * num4;
13127 velocity.Y = y * num4;
13128 rotation = (float)Math.Atan2(0f - velocity.Y, 0f - velocity.X);
13129 if (type == 247)
13130 {
13131 rotation = (float)Math.Atan2(velocity.Y, velocity.X);
13132 }
13133 }
13134 }
13135 else if (ai[0] == 1f)
13136 {
13137 ai[1] += 1f;
13138 base.Center = vector;
13139 rotation = 0f;
13141 if (ai[1] <= 15f)
13142 {
13143 for (int i = 0; i < 1; i++)
13144 {
13145 Vector2 vector3 = Main.rand.NextVector2Circular(80f, 80f);
13146 Vector2 vector4 = vector3 * -1f * 0.05f;
13147 Vector2 vector5 = Main.rand.NextVector2Circular(20f, 20f);
13148 Dust dust = Dust.NewDustPerfect(base.Center + vector4 + vector3 + vector5, 228, vector4);
13149 dust.fadeIn = 1.5f;
13150 dust.scale = 0.5f;
13151 if (Main.getGoodWorld)
13152 {
13153 dust.noLight = true;
13154 }
13155 dust.noGravity = true;
13156 }
13157 }
13158 if (ai[1] >= 30f)
13159 {
13160 noTileCollide = true;
13161 collideX = false;
13162 collideY = false;
13163 ai[0] = 2f;
13164 ai[1] = 0f;
13165 float num6 = 12f;
13166 if (life < lifeMax / 2)
13167 {
13168 num6 += 4f;
13169 }
13170 if (life < lifeMax / 4)
13171 {
13172 num6 += 4f;
13173 }
13174 if (Main.npc[golemBoss].life < Main.npc[golemBoss].lifeMax)
13175 {
13176 num6 += 10f;
13177 }
13178 num6 *= (num + 3f) / 4f;
13179 if (num6 > 48f)
13180 {
13181 num6 = 48f;
13182 }
13183 Vector2 vector6 = new Vector2(base.Center.X, base.Center.Y);
13184 float num7 = Main.player[target].Center.X - vector6.X;
13185 float num8 = Main.player[target].Center.Y - vector6.Y;
13186 float num9 = (float)Math.Sqrt(num7 * num7 + num8 * num8);
13187 num9 = num6 / num9;
13188 velocity.X = num7 * num9;
13189 velocity.Y = num8 * num9;
13190 rotation = (float)Math.Atan2(velocity.Y, velocity.X);
13191 if (type == 247)
13192 {
13193 rotation = (float)Math.Atan2(0f - velocity.Y, 0f - velocity.X);
13194 }
13195 }
13196 }
13197 else if (ai[0] == 2f)
13198 {
13199 if (Main.netMode != 1 && Main.getGoodWorld)
13200 {
13201 for (int j = (int)(position.X / 16f) - 1; (float)j < (position.X + (float)width) / 16f + 1f; j++)
13202 {
13203 for (int k = (int)(position.Y / 16f) - 1; (float)k < (position.Y + (float)width) / 16f + 1f; k++)
13204 {
13205 if (Main.tile[j, k].type == 4)
13206 {
13207 Main.tile[j, k].active(active: false);
13208 if (Main.netMode == 2)
13209 {
13210 NetMessage.SendTileSquare(-1, j, k);
13211 }
13212 }
13213 }
13214 }
13215 }
13216 ai[1] += 1f;
13217 if (ai[1] == 1f)
13218 {
13220 }
13221 if (Main.rand.Next(2) == 0)
13222 {
13223 Vector2 vector7 = velocity * 0.5f;
13224 Vector2 vector8 = Main.rand.NextVector2Circular(20f, 20f);
13225 Dust.NewDustPerfect(base.Center + vector7 + vector8, 306, vector7, 0, Main.OurFavoriteColor).scale = 2f;
13226 }
13227 if (Math.Abs(velocity.X) > Math.Abs(velocity.Y))
13228 {
13229 if (velocity.X > 0f && base.Center.X > player.Center.X)
13230 {
13231 noTileCollide = false;
13232 }
13233 if (velocity.X < 0f && base.Center.X < player.Center.X)
13234 {
13235 noTileCollide = false;
13236 }
13237 }
13238 else
13239 {
13240 if (velocity.Y > 0f && base.Center.Y > player.Center.Y)
13241 {
13242 noTileCollide = false;
13243 }
13244 if (velocity.Y < 0f && base.Center.Y < player.Center.Y)
13245 {
13246 noTileCollide = false;
13247 }
13248 }
13249 if (num2 > 700f || collideX || collideY)
13250 {
13251 noTileCollide = true;
13252 ai[0] = 0f;
13253 }
13254 }
13255 else
13256 {
13257 if (ai[0] != 3f)
13258 {
13259 return;
13260 }
13261 noTileCollide = true;
13262 float num10 = 0.4f;
13263 Vector2 vector9 = new Vector2(base.Center.X, base.Center.Y);
13264 float num11 = Main.player[target].Center.X - vector9.X;
13265 float num12 = Main.player[target].Center.Y - vector9.Y;
13266 float num13 = (float)Math.Sqrt(num11 * num11 + num12 * num12);
13267 num13 = 12f / num13;
13268 num11 *= num13;
13269 num12 *= num13;
13270 if (velocity.X < num11)
13271 {
13272 velocity.X += num10;
13273 if (velocity.X < 0f && num11 > 0f)
13274 {
13275 velocity.X += num10 * 2f;
13276 }
13277 }
13278 else if (velocity.X > num11)
13279 {
13280 velocity.X -= num10;
13281 if (velocity.X > 0f && num11 < 0f)
13282 {
13283 velocity.X -= num10 * 2f;
13284 }
13285 }
13286 if (velocity.Y < num12)
13287 {
13288 velocity.Y += num10;
13289 if (velocity.Y < 0f && num12 > 0f)
13290 {
13291 velocity.Y += num10 * 2f;
13292 }
13293 }
13294 else if (velocity.Y > num12)
13295 {
13296 velocity.Y -= num10;
13297 if (velocity.Y > 0f && num12 < 0f)
13298 {
13299 velocity.Y -= num10 * 2f;
13300 }
13301 }
13302 rotation = (float)Math.Atan2(velocity.Y, velocity.X);
13303 if (type == 247)
13304 {
13305 rotation = (float)Math.Atan2(0f - velocity.Y, 0f - velocity.X);
13306 }
13307 }
13308 }
static double Atan2(double y, double x)
static double Sqrt(double d)
static double Abs(double value)
static void PlaySound(int type, Vector2 position, int style=1)
Vector2 velocity
Definition Entity.cs:16
Vector2 position
Definition Entity.cs:14
static readonly LegacySoundStyle Item14
Definition SoundID.cs:442
float GetMyBalance()
Definition NPC.cs:12262
int lifeMax
Definition NPC.cs:479
void TargetClosest(bool faceTarget=true)
Definition NPC.cs:69934
float[] ai
Definition NPC.cs:447
float scale
Definition NPC.cs:493
bool collideX
Definition NPC.cs:511
bool collideY
Definition NPC.cs:513
int type
Definition NPC.cs:445
int alpha
Definition NPC.cs:489
double StrikeNPCNoInteraction(int Damage, float knockBack, int hitDirection, bool crit=false, bool noEffect=false, bool fromNet=false)
Definition NPC.cs:78015
float rotation
Definition NPC.cs:501
bool noTileCollide
Definition NPC.cs:505
static int golemBoss
Definition NPC.cs:161
int life
Definition NPC.cs:477
int target
Definition NPC.cs:459

References System.Math.Abs(), Terraria.Entity.active, Terraria.NPC.ai, Terraria.NPC.alpha, System.Math.Atan2(), Terraria.Entity.Center, Terraria.NPC.collideX, Terraria.NPC.collideY, Terraria.Main.getGoodWorld, Terraria.NPC.GetMyBalance(), Terraria.NPC.golemBoss, Terraria.ID.SoundID.Item14, Terraria.NPC.life, Terraria.NPC.lifeMax, Terraria.Main.netMode, Terraria.Dust.NewDustPerfect(), Terraria.NPC.noTileCollide, Terraria.Main.npc, Terraria.Main.OurFavoriteColor, Terraria.Main.player, Terraria.Audio.SoundEngine.PlaySound(), Terraria.Entity.position, Terraria.Main.rand, Terraria.NPC.rotation, Terraria.NPC.scale, Terraria.NetMessage.SendTileSquare(), System.Math.Sqrt(), Terraria.NPC.StrikeNPCNoInteraction(), Terraria.NPC.target, Terraria.NPC.TargetClosest(), Terraria.Main.tile, Terraria.NPC.type, Microsoft.Xna.Framework.Graphics.Vector2, Terraria.Entity.velocity, 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().