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

◆ AI_015_Flails()

void Terraria.Projectile.AI_015_Flails ( )
inlineprivate

Definition at line 35797 of file Projectile.cs.

35798 {
35799 Player player = Main.player[owner];
35800 if (!player.active || player.dead || player.noItems || player.CCed || Vector2.Distance(base.Center, player.Center) > 900f)
35801 {
35802 Kill();
35803 return;
35804 }
35805 if (Main.myPlayer == owner && Main.mapFullscreen)
35806 {
35807 Kill();
35808 return;
35809 }
35810 if (type == 948 && wet && !lavaWet)
35811 {
35812 type = 947;
35813 netUpdate = true;
35814 }
35815 Vector2 mountedCenter = player.MountedCenter;
35816 bool doFastThrowDust = false;
35817 bool flag = true;
35818 bool flag2 = false;
35819 int num = 10;
35820 float num2 = 24f;
35821 float num3 = 800f;
35822 float num4 = 3f;
35823 float num5 = 16f;
35824 float num6 = 6f;
35825 float num7 = 48f;
35826 float num8 = 1f;
35827 float num9 = 14f;
35828 int num10 = 60;
35829 int num11 = 10;
35830 int num12 = 15;
35831 int num13 = 10;
35832 int num14 = num + 5;
35833 switch (type)
35834 {
35835 case 947:
35836 case 948:
35837 num = 13;
35838 num2 = 12f;
35839 num5 = 8f;
35840 num7 = 13f;
35841 break;
35842 case 25:
35843 num = 15;
35844 num2 = 14f;
35845 num5 = 10f;
35846 num7 = 15f;
35847 break;
35848 case 154:
35849 num = 15;
35850 num2 = 15f;
35851 num5 = 11f;
35852 num7 = 16f;
35853 break;
35854 case 26:
35855 num = 15;
35856 num2 = 16f;
35857 num5 = 12f;
35858 num7 = 16f;
35859 break;
35860 case 35:
35861 num = 15;
35862 num2 = 17f;
35863 num5 = 14f;
35864 num7 = 18f;
35865 break;
35866 case 63:
35867 num = 13;
35868 num2 = 21f;
35869 num5 = 20f;
35870 num7 = 24f;
35871 num12 = 12;
35872 break;
35873 case 757:
35874 num = 13;
35875 num2 = 22f;
35876 num5 = 22f;
35877 num7 = 26f;
35878 num12 = 12;
35879 break;
35880 case 247:
35881 num = 13;
35882 num2 = 23f;
35883 num12 = 12;
35884 break;
35885 }
35886 float meleeSpeed = player.meleeSpeed;
35887 float num15 = 1f / meleeSpeed;
35888 num2 *= num15;
35889 num8 *= num15;
35890 num9 *= num15;
35891 num4 *= num15;
35892 num5 *= num15;
35893 num6 *= num15;
35894 num7 *= num15;
35895 float num16 = num2 * (float)num;
35896 float num17 = num16 + 160f;
35898 switch ((int)ai[0])
35899 {
35900 case 0:
35901 {
35902 flag2 = true;
35903 if (owner == Main.myPlayer)
35904 {
35905 Vector2 origin = mountedCenter;
35906 Vector2 mouseWorld = Main.MouseWorld;
35907 Vector2 vector3 = origin.DirectionTo(mouseWorld).SafeNormalize(Vector2.UnitX * player.direction);
35908 player.ChangeDir((vector3.X > 0f) ? 1 : (-1));
35909 if (!player.channel)
35910 {
35911 ai[0] = 1f;
35912 ai[1] = 0f;
35913 velocity = vector3 * num2 + player.velocity;
35914 base.Center = mountedCenter;
35915 netUpdate = true;
35918 break;
35919 }
35920 }
35921 localAI[1] += 1f;
35922 Vector2 vector4 = new Vector2(player.direction).RotatedBy((float)Math.PI * 10f * (localAI[1] / 60f) * (float)player.direction);
35923 vector4.Y *= 0.8f;
35924 if (vector4.Y * player.gravDir > 0f)
35925 {
35926 vector4.Y *= 0.5f;
35927 }
35928 base.Center = mountedCenter + vector4 * 30f;
35931 break;
35932 }
35933 case 1:
35934 {
35935 doFastThrowDust = true;
35936 bool flag3 = ai[1]++ >= (float)num;
35938 if (player.controlUseItem)
35939 {
35940 ai[0] = 6f;
35941 ai[1] = 0f;
35942 netUpdate = true;
35943 velocity *= 0.2f;
35944 if (Main.myPlayer == owner && type == 757)
35945 {
35946 NewProjectile(GetProjectileSource_FromThis(), base.Center, velocity, 928, damage, knockBack, Main.myPlayer);
35947 }
35948 break;
35949 }
35950 if (flag3)
35951 {
35952 ai[0] = 2f;
35953 ai[1] = 0f;
35954 netUpdate = true;
35955 velocity *= 0.3f;
35956 if (Main.myPlayer == owner && type == 757)
35957 {
35958 NewProjectile(GetProjectileSource_FromThis(), base.Center, velocity, 928, damage, knockBack, Main.myPlayer);
35959 }
35960 }
35961 player.ChangeDir((player.Center.X < base.Center.X) ? 1 : (-1));
35963 break;
35964 }
35965 case 2:
35966 {
35968 if (Distance(mountedCenter) <= num5)
35969 {
35970 Kill();
35971 return;
35972 }
35973 if (player.controlUseItem)
35974 {
35975 ai[0] = 6f;
35976 ai[1] = 0f;
35977 netUpdate = true;
35978 velocity *= 0.2f;
35979 }
35980 else
35981 {
35982 velocity *= 0.98f;
35983 velocity = velocity.MoveTowards(vector * num5, num4);
35984 player.ChangeDir((player.Center.X < base.Center.X) ? 1 : (-1));
35985 }
35986 break;
35987 }
35988 case 3:
35989 {
35990 if (!player.controlUseItem)
35991 {
35992 ai[0] = 4f;
35993 ai[1] = 0f;
35994 netUpdate = true;
35995 break;
35996 }
35997 float num18 = Distance(mountedCenter);
35998 tileCollide = ai[1] == 1f;
35999 bool flag4 = num18 <= num16;
36000 if (flag4 != tileCollide)
36001 {
36003 ai[1] = (tileCollide ? 1 : 0);
36004 netUpdate = true;
36005 }
36006 if (num18 > (float)num10)
36007 {
36008 if (num18 >= num16)
36009 {
36010 velocity *= 0.5f;
36011 velocity = velocity.MoveTowards(DirectionTo(mountedCenter).SafeNormalize(Vector2.Zero) * num9, num9);
36012 }
36013 velocity *= 0.98f;
36014 velocity = velocity.MoveTowards(DirectionTo(mountedCenter).SafeNormalize(Vector2.Zero) * num9, num8);
36015 }
36016 else
36017 {
36018 if (velocity.Length() < 6f)
36019 {
36020 velocity.X *= 0.96f;
36021 velocity.Y += 0.2f;
36022 }
36023 if (player.velocity.X == 0f)
36024 {
36025 velocity.X *= 0.96f;
36026 }
36027 }
36028 player.ChangeDir((player.Center.X < base.Center.X) ? 1 : (-1));
36029 break;
36030 }
36031 case 4:
36032 {
36033 tileCollide = false;
36035 if (Distance(mountedCenter) <= num7)
36036 {
36037 Kill();
36038 return;
36039 }
36040 velocity *= 0.98f;
36041 velocity = velocity.MoveTowards(vector2 * num7, num6);
36042 Vector2 target = base.Center + velocity;
36043 Vector2 value = mountedCenter.DirectionFrom(target).SafeNormalize(Vector2.Zero);
36044 if (Vector2.Dot(vector2, value) < 0f)
36045 {
36046 Kill();
36047 return;
36048 }
36049 player.ChangeDir((player.Center.X < base.Center.X) ? 1 : (-1));
36050 break;
36051 }
36052 case 5:
36053 if (ai[1]++ >= (float)num14)
36054 {
36055 ai[0] = 6f;
36056 ai[1] = 0f;
36057 netUpdate = true;
36058 }
36059 else
36060 {
36062 velocity.Y += 0.6f;
36063 velocity.X *= 0.95f;
36064 player.ChangeDir((player.Center.X < base.Center.X) ? 1 : (-1));
36065 }
36066 break;
36067 case 6:
36068 if (!player.controlUseItem || Distance(mountedCenter) > num17)
36069 {
36070 ai[0] = 4f;
36071 ai[1] = 0f;
36072 netUpdate = true;
36073 break;
36074 }
36075 if (!shimmerWet)
36076 {
36077 velocity.Y += 0.8f;
36078 }
36079 velocity.X *= 0.95f;
36080 player.ChangeDir((player.Center.X < base.Center.X) ? 1 : (-1));
36081 break;
36082 }
36083 int num19 = type;
36084 if (num19 == 247)
36085 {
36086 flag = false;
36087 float num20 = (Math.Abs(velocity.X) + Math.Abs(velocity.Y)) * 0.01f;
36088 rotation += ((velocity.X > 0f) ? num20 : (0f - num20));
36089 if (ai[0] == 0f)
36090 {
36091 rotation += (float)Math.PI * 2f / 15f * (float)player.direction;
36092 }
36093 float num21 = 600f;
36094 NPC nPC = null;
36095 if (owner == Main.myPlayer)
36096 {
36097 localAI[0] += 1f;
36098 if (localAI[0] >= 20f)
36099 {
36100 localAI[0] = 17f;
36101 for (int i = 0; i < 200; i++)
36102 {
36103 NPC nPC2 = Main.npc[i];
36104 if (nPC2.CanBeChasedBy(this))
36105 {
36106 float num22 = Distance(nPC2.Center);
36107 if (!(num22 >= num21) && Collision.CanHit(position, width, height, nPC2.position, nPC2.width, nPC2.height))
36108 {
36109 nPC = nPC2;
36110 num21 = num22;
36111 }
36112 }
36113 }
36114 }
36115 if (nPC != null)
36116 {
36117 localAI[0] = 0f;
36118 float num23 = 14f;
36119 Vector2 center = base.Center;
36120 Vector2 vector5 = center.DirectionTo(nPC.Center) * num23;
36121 NewProjectile(GetProjectileSource_FromThis(), center, vector5, 248, (int)((double)damage / 1.5), knockBack / 2f, Main.myPlayer);
36122 }
36123 }
36124 }
36125 direction = ((velocity.X > 0f) ? 1 : (-1));
36128 if (flag)
36129 {
36130 if (velocity.Length() > 1f)
36131 {
36132 rotation = velocity.ToRotation() + velocity.X * 0.1f;
36133 }
36134 else
36135 {
36136 rotation += velocity.X * 0.1f;
36137 }
36138 }
36139 timeLeft = 2;
36140 player.heldProj = whoAmI;
36141 player.SetDummyItemTime(2);
36142 player.itemRotation = DirectionFrom(mountedCenter).ToRotation();
36143 if (base.Center.X < mountedCenter.X)
36144 {
36145 player.itemRotation += (float)Math.PI;
36146 }
36147 player.itemRotation = MathHelper.WrapAngle(player.itemRotation);
36149 }
static float WrapAngle(float angle)
Definition MathHelper.cs:87
static double Abs(double value)
const double PI
Definition Math.cs:16
Vector2 DirectionFrom(Vector2 Source)
Definition Entity.cs:202
bool shimmerWet
Definition Entity.cs:32
Vector2 velocity
Definition Entity.cs:16
float Distance(Vector2 Other)
Definition Entity.cs:187
Vector2 position
Definition Entity.cs:14
Vector2 DirectionTo(Vector2 Destination)
Definition Entity.cs:197
IEntitySource GetProjectileSource_FromThis()
void ResetLocalNPCHitImmunity()
void AI_015_Flails_Dust(bool doFastThrowDust)
static int NewProjectile(IEntitySource spawnSource, Vector2 position, Vector2 velocity, int Type, int Damage, float KnockBack, int Owner=-1, float ai0=0f, float ai1=0f, float ai2=0f)
static float Dot(Vector2 value1, Vector2 value2)
Definition Vector2.cs:121
static float Distance(Vector2 value1, Vector2 value2)
Definition Vector2.cs:91

References System.Math.Abs(), Terraria.Entity.active, Terraria.Collision.CanHit(), Terraria.Player.CCed, Terraria.Entity.Center, Terraria.Player.ChangeDir(), Terraria.Player.channel, Terraria.Player.controlUseItem, Terraria.Player.dead, Terraria.Entity.direction, Microsoft.Xna.Framework.Vector2.Distance(), Microsoft.Xna.Framework.Vector2.Dot(), Terraria.Player.gravDir, Terraria.Player.itemRotation, Terraria.Main.mapFullscreen, Terraria.Player.meleeSpeed, Terraria.Player.MountedCenter, Terraria.Main.MouseWorld, Terraria.Main.myPlayer, Terraria.Player.noItems, Terraria.Main.npc, System.Math.PI, Terraria.Main.player, Terraria.Player.SetDummyItemTime(), System.type, Microsoft.Xna.Framework.Vector2.UnitX, System.value, Terraria.Entity.velocity, Microsoft.Xna.Framework.MathHelper.WrapAngle(), Microsoft.Xna.Framework.Vector2.X, and Microsoft.Xna.Framework.Vector2.Zero.