예제 #1
0
 // 6
 private void AIWorm(NPC npc, bool flag)
 {
     if (npc.target < 0 || npc.target == 255 || Main.players[npc.target].dead)
     {
         npc.TargetClosest(true);
     }
     if (Main.players[npc.target].dead && npc.timeLeft > 10)
     {
         npc.timeLeft = 10;
     }
     if ((npc.Type == 7 || npc.Type == 8 || npc.Type == 10 || npc.Type == 11 || npc.Type == 13 || npc.Type == 14 || npc.Type == 39 || npc.Type == 40) && npc.ai[0] == 0f)
     {
         if (npc.Type == 7 || npc.Type == 10 || npc.Type == 13 || npc.Type == 39)
         {
             npc.ai[2] = (float)Main.rand.Next(8, 13);
             if (npc.Type == 10)
             {
                 npc.ai[2] = (float)Main.rand.Next(4, 7);
             }
             if (npc.Type == 13)
             {
                 npc.ai[2] = (float)Main.rand.Next(45, 56);
             }
             if (npc.Type == 39)
             {
                 npc.ai[2] = (float)Main.rand.Next(12, 19);
             }
             npc.ai[0] = (float)NPC.NewNPC((int)(npc.Position.X + (float)(npc.Width / 2)), (int)(npc.Position.Y + (float)npc.Height), npc.Type + 1, npc.whoAmI);
         }
         else
         {
             if ((npc.Type == 8 || npc.Type == 11 || npc.Type == 14 || npc.Type == 40) && npc.ai[2] > 0f)
             {
                 npc.ai[0] = (float)NPC.NewNPC((int)(npc.Position.X + (float)(npc.Width / 2)), (int)(npc.Position.Y + (float)npc.Height), npc.Type, npc.whoAmI);
             }
             else
             {
                 npc.ai[0] = (float)NPC.NewNPC((int)(npc.Position.X + (float)(npc.Width / 2)), (int)(npc.Position.Y + (float)npc.Height), npc.Type + 1, npc.whoAmI);
             }
         }
         Main.npcs[(int)npc.ai[0]].ai[1] = (float)npc.whoAmI;
         Main.npcs[(int)npc.ai[0]].ai[2] = npc.ai[2] - 1f;
         npc.netUpdate = true;
     }
     if ((npc.Type == 8 || npc.Type == 9 || npc.Type == 11 || npc.Type == 12 || npc.Type == 40 || npc.Type == 41) && (!Main.npcs[(int)npc.ai[1]].Active || Main.npcs[(int)npc.ai[1]].aiStyle != npc.aiStyle))
     {
         npc.life = 0;
         npc.HitEffect(0, 10.0);
         npc.Active = false;
     }
     if ((npc.Type == 7 || npc.Type == 8 || npc.Type == 10 || npc.Type == 11 || npc.Type == 39 || npc.Type == 40) && !Main.npcs[(int)npc.ai[0]].Active)
     {
         npc.life = 0;
         npc.HitEffect(0, 10.0);
         npc.Active = false;
     }
     if (npc.type == NPCType.N13_EATER_OF_WORLDS_HEAD || npc.type == NPCType.N14_EATER_OF_WORLDS_BODY || npc.type == NPCType.N15_EATER_OF_WORLDS_TAIL)
     {
         //If this segment has no segment before or after it, DIE!
         if (!Main.npcs[(int)npc.ai[1]].Active && !Main.npcs[(int)npc.ai[0]].Active)
         {
             npc.life = 0;
             npc.HitEffect(0, 10.0);
             npc.Active = false;
         }
         //If we are a head connected to nothing, DIE!
         if (npc.type == NPCType.N13_EATER_OF_WORLDS_HEAD && !Main.npcs[(int)npc.ai[0]].Active)
         {
             npc.life = 0;
             npc.HitEffect(0, 10.0);
             npc.Active = false;
         }
         //If we are a tail connected to nothing, DIE!
         if (npc.type == NPCType.N15_EATER_OF_WORLDS_TAIL && !Main.npcs[(int)npc.ai[1]].Active)
         {
             npc.life = 0;
             npc.HitEffect(0, 10.0);
             npc.Active = false;
         }
         //If the next segment forward has died, become a head
         if (npc.type == NPCType.N14_EATER_OF_WORLDS_BODY && !Main.npcs[(int)npc.ai[1]].Active)
         {
             npc.type = NPCType.N13_EATER_OF_WORLDS_HEAD;
             int num52 = npc.whoAmI;
             float num53 = (float)npc.life / (float)npc.lifeMax;
             float num54 = npc.ai[0];
             //npc.SetDefaults(npc.Type, -1f);
             //npc = Registries.NPC.Create(npc.Type); WTF!?
             Registries.NPC.SetDefaults(npc, 13); //FIXME: remember to tweak
             npc.Active = true;
             npc.life = (int)((float)npc.lifeMax * num53);
             npc.ai[0] = num54;
             npc.TargetClosest(true);
             npc.netUpdate = true;
             npc.whoAmI = num52;
         }
         //If the next segment behind us has died, become a tail
         if (npc.type == NPCType.N14_EATER_OF_WORLDS_BODY && !Main.npcs[(int)npc.ai[0]].Active)
         {
             npc.type = NPCType.N15_EATER_OF_WORLDS_TAIL;
             int num55 = npc.whoAmI;
             float num56 = (float)npc.life / (float)npc.lifeMax;
             float num57 = npc.ai[1];
             //npc.SetDefaults(npc.Type, -1f);
             //npc = Registries.NPC.Create(npc.Type);
             Registries.NPC.SetDefaults(npc, 14); //FIXME: remember to tweak
             npc.Active = true;
             npc.life = (int)((float)npc.lifeMax * num56);
             npc.ai[1] = num57;
             npc.TargetClosest(true);
             npc.netUpdate = true;
             npc.whoAmI = num55;
         }
         if (npc.life == 0)
         {
             bool flag6 = true;
             for (int l = 0; l < MAX_NPCS; l++)
             {
                 if (Main.npcs[l].Active && (Main.npcs[l].type == NPCType.N13_EATER_OF_WORLDS_HEAD ||
                                              Main.npcs[l].type == NPCType.N14_EATER_OF_WORLDS_BODY ||
                                              Main.npcs[l].type == NPCType.N15_EATER_OF_WORLDS_TAIL))
                 {
                     flag6 = false;
                     break;
                 }
             }
             if (flag6)
             {
                 npc.boss = true;
                 npc.NPCLoot();
             }
         }
     }
     if (!npc.Active)
     {
         NetMessage.SendData(28, -1, -1, "", npc.whoAmI, -1f, 0f, 0f, 0);
     }
     int num58 = (int)(npc.Position.X / 16f) - 1;
     int num59 = (int)((npc.Position.X + (float)npc.Width) / 16f) + 2;
     int num60 = (int)(npc.Position.Y / 16f) - 1;
     int num61 = (int)((npc.Position.Y + (float)npc.Height) / 16f) + 2;
     if (num58 < 0)
     {
         num58 = 0;
     }
     if (num59 > Main.maxTilesX)
     {
         num59 = Main.maxTilesX;
     }
     if (num60 < 0)
     {
         num60 = 0;
     }
     if (num61 > Main.maxTilesY)
     {
         num61 = Main.maxTilesY;
     }
     bool flag7 = false;
     for (int m = num58; m < num59; m++)
     {
         for (int n = num60; n < num61; n++)
         {
             if (Main.tile.At(m, n).Exists && ((Main.tile.At(m, n).Active && (Main.tileSolid[(int)Main.tile.At(m, n).Type] || (Main.tileSolidTop[(int)Main.tile.At(m, n).Type] && Main.tile.At(m, n).FrameY == 0))) || Main.tile.At(m, n).Liquid > 64))
             {
                 Vector2 vector9;
                 vector9.X = (float)(m * 16);
                 vector9.Y = (float)(n * 16);
                 if (npc.Position.X + (float)npc.Width > vector9.X && npc.Position.X < vector9.X + 16f && npc.Position.Y + (float)npc.Height > vector9.Y && npc.Position.Y < vector9.Y + 16f)
                 {
                     flag7 = true;
                     if (Main.rand.Next(40) == 0 && Main.tile.At(m, n).Active)
                     {
                         WorldModify.KillTile(m, n, true, true, false);
                     }
                     //if (Main.tile.At(m, n).Type == 2)
                     //{
                     //    byte arg_4656_0 = Main.tile.At(m, n - 1).Type;
                     //}
                 }
             }
         }
     }
     if (!flag7 && (npc.Type == 7 || npc.Type == 10 || npc.Type == 13 || npc.Type == 39))
     {
         Rectangle rectangle = new Rectangle((int)npc.Position.X, (int)npc.Position.Y, npc.Width, npc.Height);
         int num62 = 1000;
         bool flag8 = true;
         for (int num63 = 0; num63 < 255; num63++)
         {
             if (Main.players[num63].Active)
             {
                 Rectangle rectangle2 = new Rectangle((int)Main.players[num63].Position.X - num62, (int)Main.players[num63].Position.Y - num62, num62 * 2, num62 * 2);
                 if (rectangle.Intersects(rectangle2))
                 {
                     flag8 = false;
                     break;
                 }
             }
         }
         if (flag8)
         {
             flag7 = true;
         }
     }
     float num64 = 8f;
     float num65 = 0.07f;
     if (npc.Type == 10)
     {
         num64 = 6f;
         num65 = 0.05f;
     }
     if (npc.Type == 13)
     {
         num64 = 10f;
         num65 = 0.07f;
     }
     Vector2 vector10 = new Vector2(npc.Position.X + (float)npc.Width * 0.5f, npc.Position.Y + (float)npc.Height * 0.5f);
     float num66 = Main.players[npc.target].Position.X + (float)(Main.players[npc.target].Width / 2) - vector10.X;
     float num67 = Main.players[npc.target].Position.Y + (float)(Main.players[npc.target].Height / 2) - vector10.Y;
     float num68 = (float)Math.Sqrt((double)(num66 * num66 + num67 * num67));
     if (npc.ai[1] > 0f)
     {
         num66 = Main.npcs[(int)npc.ai[1]].Position.X + (float)(Main.npcs[(int)npc.ai[1]].Width / 2) - vector10.X;
         num67 = Main.npcs[(int)npc.ai[1]].Position.Y + (float)(Main.npcs[(int)npc.ai[1]].Height / 2) - vector10.Y;
         npc.rotation = (float)Math.Atan2((double)num67, (double)num66) + 1.57f;
         num68 = (float)Math.Sqrt((double)(num66 * num66 + num67 * num67));
         num68 = (num68 - (float)npc.Width) / num68;
         num66 *= num68;
         num67 *= num68;
         npc.Velocity = default(Vector2);
         npc.Position.X = npc.Position.X + num66;
         npc.Position.Y = npc.Position.Y + num67;
         return;
     }
     if (!flag7)
     {
         npc.TargetClosest(true);
         npc.Velocity.Y = npc.Velocity.Y + 0.11f;
         if (npc.Velocity.Y > num64)
         {
             npc.Velocity.Y = num64;
         }
         if ((double)(Math.Abs(npc.Velocity.X) + Math.Abs(npc.Velocity.Y)) < (double)num64 * 0.4)
         {
             if (npc.Velocity.X < 0f)
             {
                 npc.Velocity.X = npc.Velocity.X - num65 * 1.1f;
             }
             else
             {
                 npc.Velocity.X = npc.Velocity.X + num65 * 1.1f;
             }
         }
         else
         {
             if (npc.Velocity.Y == num64)
             {
                 if (npc.Velocity.X < num66)
                 {
                     npc.Velocity.X = npc.Velocity.X + num65;
                 }
                 else
                 {
                     if (npc.Velocity.X > num66)
                     {
                         npc.Velocity.X = npc.Velocity.X - num65;
                     }
                 }
             }
             else
             {
                 if (npc.Velocity.Y > 4f)
                 {
                     if (npc.Velocity.X < 0f)
                     {
                         npc.Velocity.X = npc.Velocity.X + num65 * 0.9f;
                     }
                     else
                     {
                         npc.Velocity.X = npc.Velocity.X - num65 * 0.9f;
                     }
                 }
             }
         }
     }
     else
     {
         if (npc.soundDelay == 0)
         {
             float num69 = num68 / 40f;
             if (num69 < 10f)
             {
                 num69 = 10f;
             }
             if (num69 > 20f)
             {
                 num69 = 20f;
             }
             npc.soundDelay = (int)num69;
         }
         num68 = (float)Math.Sqrt((double)(num66 * num66 + num67 * num67));
         float num70 = Math.Abs(num66);
         float num71 = Math.Abs(num67);
         num68 = num64 / num68;
         num66 *= num68;
         num67 *= num68;
         if ((npc.Type == 13 || npc.Type == 7) && !Main.players[npc.target].zoneEvil)
         {
             bool flag9 = true;
             for (int num72 = 0; num72 < 255; num72++)
             {
                 if (Main.players[num72].Active && !Main.players[num72].dead && Main.players[num72].zoneEvil)
                 {
                     flag9 = false;
                 }
             }
             if (flag9)
             {
                 if ((double)(npc.Position.Y / 16f) > (Main.rockLayer + (double)Main.maxTilesY) / 2.0)
                 {
                     npc.Active = false;
                     int num73 = (int)npc.ai[0];
                     while (num73 > 0 && num73 < MAX_NPCS && Main.npcs[num73].Active && Main.npcs[num73].aiStyle == npc.aiStyle)
                     {
                         int num74 = (int)Main.npcs[num73].ai[0];
                         Main.npcs[num73].Active = false;
                         npc.life = 0;
                         NetMessage.SendData(23, -1, -1, "", num73, 0f, 0f, 0f, 0);
                         num73 = num74;
                     }
                     NetMessage.SendData(23, -1, -1, "", npc.whoAmI, 0f, 0f, 0f, 0);
                 }
                 num66 = 0f;
                 num67 = num64;
             }
         }
         if ((npc.Velocity.X > 0f && num66 > 0f) || (npc.Velocity.X < 0f && num66 < 0f) || (npc.Velocity.Y > 0f && num67 > 0f) || (npc.Velocity.Y < 0f && num67 < 0f))
         {
             if (npc.Velocity.X < num66)
             {
                 npc.Velocity.X = npc.Velocity.X + num65;
             }
             else
             {
                 if (npc.Velocity.X > num66)
                 {
                     npc.Velocity.X = npc.Velocity.X - num65;
                 }
             }
             if (npc.Velocity.Y < num67)
             {
                 npc.Velocity.Y = npc.Velocity.Y + num65;
             }
             else
             {
                 if (npc.Velocity.Y > num67)
                 {
                     npc.Velocity.Y = npc.Velocity.Y - num65;
                 }
             }
         }
         else
         {
             if (num70 > num71)
             {
                 if (npc.Velocity.X < num66)
                 {
                     npc.Velocity.X = npc.Velocity.X + num65 * 1.1f;
                 }
                 else
                 {
                     if (npc.Velocity.X > num66)
                     {
                         npc.Velocity.X = npc.Velocity.X - num65 * 1.1f;
                     }
                 }
                 if ((double)(Math.Abs(npc.Velocity.X) + Math.Abs(npc.Velocity.Y)) < (double)num64 * 0.5)
                 {
                     if (npc.Velocity.Y > 0f)
                     {
                         npc.Velocity.Y = npc.Velocity.Y + num65;
                     }
                     else
                     {
                         npc.Velocity.Y = npc.Velocity.Y - num65;
                     }
                 }
             }
             else
             {
                 if (npc.Velocity.Y < num67)
                 {
                     npc.Velocity.Y = npc.Velocity.Y + num65 * 1.1f;
                 }
                 else
                 {
                     if (npc.Velocity.Y > num67)
                     {
                         npc.Velocity.Y = npc.Velocity.Y - num65 * 1.1f;
                     }
                 }
                 if ((double)(Math.Abs(npc.Velocity.X) + Math.Abs(npc.Velocity.Y)) < (double)num64 * 0.5)
                 {
                     if (npc.Velocity.X > 0f)
                     {
                         npc.Velocity.X = npc.Velocity.X + num65;
                     }
                     else
                     {
                         npc.Velocity.X = npc.Velocity.X - num65;
                     }
                 }
             }
         }
     }
     npc.rotation = (float)Math.Atan2((double)npc.Velocity.Y, (double)npc.Velocity.X) + 1.57f;
     return;
 }
        // 6 - 1.1.2
        private void AIWorm(NPC npc, bool flag, Func<Int32, Int32, ITile> TileRefs)
        {
            if (npc.type == NPCType.N117_LEECH_HEAD && npc.localAI[1] == 0f)
            {
                npc.localAI[1] = 1f;
            }
            if (npc.type >= NPCType.N13_EATER_OF_WORLDS_HEAD && npc.type <= NPCType.N15_EATER_OF_WORLDS_TAIL)
            {
                npc.realLife = -1;
            }
            else if (npc.ai[3] > 0f)
            {
                npc.realLife = (int)npc.ai[3];
            }

            if (npc.target < 0 || npc.target == 255 || Main.players[npc.target].dead)
            {
                npc.TargetClosest(true);
            }
            if (Main.players[npc.target].dead && npc.timeLeft > 300)
            {
                npc.timeLeft = 300;
            }

            if (npc.type == NPCType.N87_WYVERN_HEAD && npc.ai[0] == 0f)
            {
                npc.ai[3] = (float)npc.whoAmI;
                npc.realLife = npc.whoAmI;
                int num96 = npc.whoAmI;
                for (int num97 = 0; num97 < 14; num97++)
                {
                    int num98 = 89;
                    if (num97 == 1 || num97 == 8)
                    {
                        num98 = 88;
                    }
                    else if (num97 == 11)
                    {
                        num98 = 90;
                    }
                    else if (num97 == 12)
                    {
                        num98 = 91;
                    }
                    else if (num97 == 13)
                    {
                        num98 = 92;
                    }
                    int num99 = NewNPC((int)(npc.Position.X + (float)(npc.Width / 2)),
                        (int)(npc.Position.Y + (float)npc.Height), num98, npc.whoAmI, true);
                    Main.npcs[num99].ai[3] = (float)npc.whoAmI;
                    Main.npcs[num99].realLife = npc.whoAmI;
                    Main.npcs[num99].ai[1] = (float)num96;
                    Main.npcs[num96].ai[0] = (float)num99;
                    NetMessage.SendData(23, -1, -1, "", num99, 0f, 0f, 0f, 0);
                    num96 = num99;
                }
            }
            if ((npc.type == NPCType.N07_DEVOURER_HEAD || npc.type == NPCType.N08_DEVOURER_BODY || npc.type == NPCType.N10_GIANT_WORM_HEAD ||
                npc.type == NPCType.N11_GIANT_WORM_BODY || npc.type == NPCType.N13_EATER_OF_WORLDS_HEAD || npc.type == NPCType.N14_EATER_OF_WORLDS_BODY ||
                npc.type == NPCType.N39_BONE_SERPENT_HEAD || npc.type == NPCType.N40_BONE_SERPENT_BODY || npc.type == NPCType.N95_DIGGER_HEAD ||
                npc.type == NPCType.N96_DIGGER_BODY || npc.type == NPCType.N98_SEEKER_HEAD || npc.type == NPCType.N99_SEEKER_BODY || npc.type == NPCType.N117_LEECH_HEAD ||
                npc.type == NPCType.N118_LEECH_BODY) && npc.ai[0] == 0f)
            {
                if (npc.type == NPCType.N07_DEVOURER_HEAD || npc.type == NPCType.N10_GIANT_WORM_HEAD || npc.type == NPCType.N13_EATER_OF_WORLDS_HEAD ||
                    npc.type == NPCType.N39_BONE_SERPENT_HEAD || npc.type == NPCType.N95_DIGGER_HEAD || npc.type == NPCType.N98_SEEKER_HEAD ||
                    npc.type == NPCType.N117_LEECH_HEAD)
                {
                    if (npc.type < NPCType.N13_EATER_OF_WORLDS_HEAD || npc.type > NPCType.N15_EATER_OF_WORLDS_TAIL)
                    {
                        npc.ai[3] = (float)npc.whoAmI;
                        npc.realLife = npc.whoAmI;
                    }
                    npc.ai[2] = (float)Main.rand.Next(8, 13);
                    if (npc.type == NPCType.N10_GIANT_WORM_HEAD)
                    {
                        npc.ai[2] = (float)Main.rand.Next(4, 7);
                    }
                    if (npc.type == NPCType.N13_EATER_OF_WORLDS_HEAD)
                    {
                        npc.ai[2] = (float)Main.rand.Next(45, 56);
                    }
                    if (npc.type == NPCType.N39_BONE_SERPENT_HEAD)
                    {
                        npc.ai[2] = (float)Main.rand.Next(12, 19);
                    }
                    if (npc.type == NPCType.N95_DIGGER_HEAD)
                    {
                        npc.ai[2] = (float)Main.rand.Next(6, 12);
                    }
                    if (npc.type == NPCType.N98_SEEKER_HEAD)
                    {
                        npc.ai[2] = (float)Main.rand.Next(20, 26);
                    }
                    if (npc.type == NPCType.N117_LEECH_HEAD)
                    {
                        npc.ai[2] = (float)Main.rand.Next(3, 6);
                    }
                    npc.ai[0] = (float)NewNPC((int)(npc.Position.X + (float)(npc.Width / 2)), (int)(npc.Position.Y + (float)npc.Height),
                        (int)npc.type + 1, npc.whoAmI, true);
                }
                else
                {
                    if ((npc.type == NPCType.N08_DEVOURER_BODY || npc.type == NPCType.N11_GIANT_WORM_BODY || npc.type == NPCType.N14_EATER_OF_WORLDS_BODY ||
                        npc.type == NPCType.N40_BONE_SERPENT_BODY || npc.type == NPCType.N96_DIGGER_BODY || npc.type == NPCType.N99_SEEKER_BODY ||
                        npc.type == NPCType.N118_LEECH_BODY) && npc.ai[2] > 0f)
                    {
                        npc.ai[0] = (float)NewNPC((int)(npc.Position.X + (float)(npc.Width / 2)), (int)(npc.Position.Y + (float)npc.Height),
                            (int)npc.type, npc.whoAmI, true);
                    }
                    else
                    {
                        npc.ai[0] = (float)NewNPC((int)(npc.Position.X + (float)(npc.Width / 2)), (int)(npc.Position.Y + (float)npc.Height),
                            (int)npc.type + 1, npc.whoAmI, true);
                    }
                }
                if (npc.type < NPCType.N13_EATER_OF_WORLDS_HEAD || npc.type > NPCType.N15_EATER_OF_WORLDS_TAIL)
                {
                    Main.npcs[(int)npc.ai[0]].ai[3] = npc.ai[3];
                    Main.npcs[(int)npc.ai[0]].realLife = npc.realLife;
                }
                Main.npcs[(int)npc.ai[0]].ai[1] = (float)npc.whoAmI;
                Main.npcs[(int)npc.ai[0]].ai[2] = npc.ai[2] - 1f;
                npc.netUpdate = true;
            }
            if ((npc.type == NPCType.N08_DEVOURER_BODY || npc.type == NPCType.N09_DEVOURER_TAIL || npc.type == NPCType.N11_GIANT_WORM_BODY ||
                npc.type == NPCType.N12_GIANT_WORM_TAIL || npc.type == NPCType.N40_BONE_SERPENT_BODY || npc.type == NPCType.N41_BONE_SERPENT_TAIL ||
                npc.type == NPCType.N96_DIGGER_BODY || npc.type == NPCType.N97_DIGGER_TAIL || npc.type == NPCType.N99_SEEKER_BODY || npc.type == NPCType.N100_SEEKER_TAIL ||
                (npc.type > NPCType.N87_WYVERN_HEAD && npc.type <= NPCType.N90_WYVERN_BODY_2) ||
                npc.type == NPCType.N118_LEECH_BODY || npc.type == NPCType.N119_LEECH_TAIL) &&
                (!Main.npcs[(int)npc.ai[1]].Active || Main.npcs[(int)npc.ai[1]].aiStyle != npc.aiStyle))
            {
                npc.life = 0;
                npc.HitEffect(0, 10.0);
                npc.Active = false;
            }
            if ((npc.type == NPCType.N07_DEVOURER_HEAD || npc.type == NPCType.N08_DEVOURER_BODY || npc.type == NPCType.N10_GIANT_WORM_HEAD ||
                npc.type == NPCType.N11_GIANT_WORM_BODY || npc.type == NPCType.N39_BONE_SERPENT_HEAD || npc.type == NPCType.N40_BONE_SERPENT_BODY ||
                npc.type == NPCType.N95_DIGGER_HEAD || npc.type == NPCType.N96_DIGGER_BODY || npc.type == NPCType.N98_SEEKER_HEAD || npc.type == NPCType.N99_SEEKER_BODY ||
                (npc.type >= NPCType.N87_WYVERN_HEAD && npc.type < NPCType.N92_WYVERN_TAIL) || npc.type == NPCType.N117_LEECH_HEAD || npc.type == NPCType.N118_LEECH_BODY) &&
                (!Main.npcs[(int)npc.ai[0]].Active || Main.npcs[(int)npc.ai[0]].aiStyle != npc.aiStyle))
            {
                npc.life = 0;
                npc.HitEffect(0, 10.0);
                npc.Active = false;
            }
            if (npc.type == NPCType.N13_EATER_OF_WORLDS_HEAD || npc.type == NPCType.N14_EATER_OF_WORLDS_BODY || npc.type == NPCType.N15_EATER_OF_WORLDS_TAIL)
            {
                if (!Main.npcs[(int)npc.ai[1]].Active && !Main.npcs[(int)npc.ai[0]].Active)
                {
                    npc.life = 0;
                    npc.HitEffect(0, 10.0);
                    npc.Active = false;
                }
                if (npc.type == NPCType.N13_EATER_OF_WORLDS_HEAD && !Main.npcs[(int)npc.ai[0]].Active)
                {
                    npc.life = 0;
                    npc.HitEffect(0, 10.0);
                    npc.Active = false;
                }
                if (npc.type == NPCType.N15_EATER_OF_WORLDS_TAIL && !Main.npcs[(int)npc.ai[1]].Active)
                {
                    npc.life = 0;
                    npc.HitEffect(0, 10.0);
                    npc.Active = false;
                }
                if (npc.type == NPCType.N14_EATER_OF_WORLDS_BODY && (!Main.npcs[(int)npc.ai[1]].Active || Main.npcs[(int)npc.ai[1]].aiStyle != npc.aiStyle))
                {
                    npc.type = NPCType.N13_EATER_OF_WORLDS_HEAD;
                    int num100 = npc.whoAmI;
                    float num101 = (float)npc.life / (float)npc.lifeMax;
                    float num102 = npc.ai[0];
                    npc.SetDefaults((int)npc.type);
                    npc.life = (int)((float)npc.lifeMax * num101);
                    npc.ai[0] = num102;
                    npc.TargetClosest(true);
                    npc.netUpdate = true;
                    npc.whoAmI = num100;
                }
                if (npc.type == NPCType.N14_EATER_OF_WORLDS_BODY && (!Main.npcs[(int)npc.ai[0]].Active || Main.npcs[(int)npc.ai[0]].aiStyle != npc.aiStyle))
                {
                    int num103 = npc.whoAmI;
                    float num104 = (float)npc.life / (float)npc.lifeMax;
                    float num105 = npc.ai[1];
                    npc.SetDefaults((int)npc.type);
                    npc.life = (int)((float)npc.lifeMax * num104);
                    npc.ai[1] = num105;
                    npc.TargetClosest(true);
                    npc.netUpdate = true;
                    npc.whoAmI = num103;
                }
                if (npc.life == 0)
                {
                    bool EoWAlive = false;
                    for (int npcId = 0; npcId < MAX_NPCS; npcId++)
                    {
                        var fNpc = Main.npcs[npcId];

                        if (fNpc.Active)
                        {
                            EoWAlive = (
                                fNpc.type == NPCType.N13_EATER_OF_WORLDS_HEAD ||
                                fNpc.type == NPCType.N14_EATER_OF_WORLDS_BODY ||
                                fNpc.type == NPCType.N15_EATER_OF_WORLDS_TAIL);

                            if (EoWAlive)
                                break;
                        }
                    }

                    if (!EoWAlive)
                    {
                        npc.boss = true;
                        npc.NPCLoot();
                    }
                }
            }
            if (!npc.Active)
            {
                NetMessage.SendData(28, -1, -1, "", npc.whoAmI, -1f, 0f, 0f, 0);
            }

            int num107 = (int)(npc.Position.X / 16f) - 1;
            int num108 = (int)((npc.Position.X + (float)npc.Width) / 16f) + 2;
            int num109 = (int)(npc.Position.Y / 16f) - 1;
            int num110 = (int)((npc.Position.Y + (float)npc.Height) / 16f) + 2;
            if (num107 < 0)
            {
                num107 = 0;
            }
            if (num108 > Main.maxTilesX)
            {
                num108 = Main.maxTilesX;
            }
            if (num109 < 0)
            {
                num109 = 0;
            }
            if (num110 > Main.maxTilesY)
            {
                num110 = Main.maxTilesY;
            }
            bool flag11 = false;
            if (npc.type >= NPCType.N87_WYVERN_HEAD && npc.type <= NPCType.N92_WYVERN_TAIL)
            {
                flag11 = true;
            }
            if (!flag11)
            {
                for (int num111 = num107; num111 < num108; num111++)
                {
                    for (int num112 = num109; num112 < num110; num112++)
                    {
                        if (((Main.tile.At(num111, num112).Active && (Main.tileSolid[(int)Main.tile.At(num111, num112).Type] ||
                            (Main.tileSolidTop[(int)Main.tile.At(num111, num112).Type] && Main.tile.At(num111, num112).FrameY == 0))) ||
                                Main.tile.At(num111, num112).Liquid > 64))
                        {
                            Vector2 vector13;
                            vector13.X = (float)(num111 * 16);
                            vector13.Y = (float)(num112 * 16);
                            if (npc.Position.X + (float)npc.Width > vector13.X && npc.Position.X < vector13.X + 16f && npc.Position.Y + (float)npc.Height > vector13.Y && npc.Position.Y < vector13.Y + 16f)
                            {
                                flag11 = true;
                                if (Main.rand.Next(100) == 0 && npc.type != NPCType.N117_LEECH_HEAD && Main.tile.At(num111, num112).Active)
                                {
                                    WorldModify.KillTile(TileRefs, null, num111, num112, true, true);
                                }
                            }
                        }
                    }
                }
            }
            if (!flag11 && (npc.type == NPCType.N07_DEVOURER_HEAD || npc.type == NPCType.N10_GIANT_WORM_HEAD || npc.type == NPCType.N13_EATER_OF_WORLDS_HEAD ||
                npc.type == NPCType.N39_BONE_SERPENT_HEAD || npc.type == NPCType.N95_DIGGER_HEAD || npc.type == NPCType.N98_SEEKER_HEAD || npc.type == NPCType.N117_LEECH_HEAD))
            {
                Rectangle rectangle = new Rectangle((int)npc.Position.X, (int)npc.Position.Y, npc.Width, npc.Height);
                int num113 = 1000;
                bool flag12 = true;
                for (int num114 = 0; num114 < 255; num114++)
                {
                    if (Main.players[num114].Active)
                    {
                        Rectangle rectangle2 = new Rectangle((int)Main.players[num114].Position.X - num113, (int)Main.players[num114].Position.Y - num113, num113 * 2, num113 * 2);
                        if (rectangle.Intersects(rectangle2))
                        {
                            flag12 = false;
                            break;
                        }
                    }
                }
                if (flag12)
                {
                    flag11 = true;
                }
            }
            if (npc.type >= NPCType.N87_WYVERN_HEAD && npc.type <= NPCType.N92_WYVERN_TAIL)
            {
                if (npc.Velocity.X < 0f)
                {
                    npc.spriteDirection = 1;
                }
                else if (npc.Velocity.X > 0f)
                {
                    npc.spriteDirection = -1;
                }
            }
            float num115 = 8f;
            float num116 = 0.07f;
            if (npc.type == NPCType.N95_DIGGER_HEAD)
            {
                num115 = 5.5f;
                num116 = 0.045f;
            }
            if (npc.type == NPCType.N10_GIANT_WORM_HEAD)
            {
                num115 = 6f;
                num116 = 0.05f;
            }
            if (npc.type == NPCType.N13_EATER_OF_WORLDS_HEAD)
            {
                num115 = 10f;
                num116 = 0.07f;
            }
            if (npc.type == NPCType.N87_WYVERN_HEAD)
            {
                num115 = 11f;
                num116 = 0.25f;
            }
            if (npc.type == NPCType.N117_LEECH_HEAD && Main.WallOfFlesh >= 0)
            {
                float num117 = (float)Main.npcs[Main.WallOfFlesh].life / (float)Main.npcs[Main.WallOfFlesh].lifeMax;
                if ((double)num117 < 0.5)
                {
                    num115 += 1f;
                    num116 += 0.1f;
                }
                if ((double)num117 < 0.25)
                {
                    num115 += 1f;
                    num116 += 0.1f;
                }
                if ((double)num117 < 0.1)
                {
                    num115 += 2f;
                    num116 += 0.1f;
                }
            }
            Vector2 vector14 = new Vector2(npc.Position.X + (float)npc.Width * 0.5f, npc.Position.Y + (float)npc.Height * 0.5f);
            float num118 = Main.players[npc.target].Position.X + (float)(Main.players[npc.target].Width / 2);
            float num119 = Main.players[npc.target].Position.Y + (float)(Main.players[npc.target].Height / 2);
            num118 = (float)((int)(num118 / 16f) * 16);
            num119 = (float)((int)(num119 / 16f) * 16);
            vector14.X = (float)((int)(vector14.X / 16f) * 16);
            vector14.Y = (float)((int)(vector14.Y / 16f) * 16);
            num118 -= vector14.X;
            num119 -= vector14.Y;
            float num120 = (float)Math.Sqrt((double)(num118 * num118 + num119 * num119));
            if (npc.ai[1] > 0f && npc.ai[1] < (float)Main.npcs.Length)
            {
                try
                {
                    vector14 = new Vector2(npc.Position.X + (float)npc.Width * 0.5f, npc.Position.Y + (float)npc.Height * 0.5f);
                    num118 = Main.npcs[(int)npc.ai[1]].Position.X + (float)(Main.npcs[(int)npc.ai[1]].Width / 2) - vector14.X;
                    num119 = Main.npcs[(int)npc.ai[1]].Position.Y + (float)(Main.npcs[(int)npc.ai[1]].Height / 2) - vector14.Y;
                }
                catch
                { }

                npc.rotation = (float)Math.Atan2((double)num119, (double)num118) + 1.57f;
                num120 = (float)Math.Sqrt((double)(num118 * num118 + num119 * num119));
                int num121 = npc.Width;
                if (npc.type >= NPCType.N87_WYVERN_HEAD && npc.type <= NPCType.N92_WYVERN_TAIL)
                {
                    num121 = 42;
                }
                num120 = (num120 - (float)num121) / num120;
                num118 *= num120;
                num119 *= num120;
                npc.Velocity = default(Vector2);
                npc.Position.X = npc.Position.X + num118;
                npc.Position.Y = npc.Position.Y + num119;
                if (npc.type >= NPCType.N87_WYVERN_HEAD && npc.type <= NPCType.N92_WYVERN_TAIL)
                {
                    if (num118 < 0f)
                    {
                        npc.spriteDirection = 1;
                        return;
                    }
                    if (num118 > 0f)
                    {
                        npc.spriteDirection = -1;
                        return;
                    }
                }
            }
            else if (!flag11)
            {
                npc.TargetClosest(true);
                npc.Velocity.Y = npc.Velocity.Y + 0.11f;
                if (npc.Velocity.Y > num115)
                {
                    npc.Velocity.Y = num115;
                }
                if ((double)(Math.Abs(npc.Velocity.X) + Math.Abs(npc.Velocity.Y)) < (double)num115 * 0.4)
                {
                    if (npc.Velocity.X < 0f)
                    {
                        npc.Velocity.X = npc.Velocity.X - num116 * 1.1f;
                    }
                    else
                    {
                        npc.Velocity.X = npc.Velocity.X + num116 * 1.1f;
                    }
                }
                else if (npc.Velocity.Y == num115)
                {
                    if (npc.Velocity.X < num118)
                    {
                        npc.Velocity.X = npc.Velocity.X + num116;
                    }
                    else if (npc.Velocity.X > num118)
                    {
                        npc.Velocity.X = npc.Velocity.X - num116;
                    }
                }
                else if (npc.Velocity.Y > 4f)
                {
                    if (npc.Velocity.X < 0f)
                    {
                        npc.Velocity.X = npc.Velocity.X + num116 * 0.9f;
                    }
                    else
                    {
                        npc.Velocity.X = npc.Velocity.X - num116 * 0.9f;
                    }
                }
            }
            else
            {
                if (npc.type != NPCType.N87_WYVERN_HEAD && npc.type != NPCType.N117_LEECH_HEAD && npc.soundDelay == 0)
                {
                    float num122 = num120 / 40f;
                    if (num122 < 10f)
                    {
                        num122 = 10f;
                    }
                    if (num122 > 20f)
                    {
                        num122 = 20f;
                    }
                    npc.soundDelay = (int)num122;
                }
                num120 = (float)Math.Sqrt((double)(num118 * num118 + num119 * num119));
                float num123 = Math.Abs(num118);
                float num124 = Math.Abs(num119);
                float num125 = num115 / num120;
                num118 *= num125;
                num119 *= num125;
                if ((npc.type == NPCType.N13_EATER_OF_WORLDS_HEAD || npc.type == NPCType.N07_DEVOURER_HEAD) && !Main.players[npc.target].zoneEvil)
                {
                    bool flag13 = true;
                    for (int num126 = 0; num126 < 255; num126++)
                    {
                        if (Main.players[num126].Active && !Main.players[num126].dead && Main.players[num126].zoneEvil)
                        {
                            flag13 = false;
                        }
                    }
                    if (flag13 & !npc.MadeSpawn)
                    {
                        if ((double)(npc.Position.Y / 16f) > (Main.rockLayer + (double)Main.maxTilesY) / 2.0)
                        {
                            npc.Active = false;
                            int num127 = (int)npc.ai[0];
                            while (num127 > 0 && num127 < 200 && Main.npcs[num127].Active && Main.npcs[num127].aiStyle == npc.aiStyle)
                            {
                                int num128 = (int)Main.npcs[num127].ai[0];
                                Main.npcs[num127].Active = false;
                                npc.life = 0;

                                NetMessage.SendData(23, -1, -1, "", num127);

                                num127 = num128;
                            }

                            NetMessage.SendData(23, -1, -1, "", npc.whoAmI);
                        }
                        num118 = 0f;
                        num119 = num115;
                    }
                }
                bool flag14 = false;
                if (npc.type == NPCType.N87_WYVERN_HEAD)
                {
                    if (((npc.Velocity.X > 0f && num118 < 0f) || (npc.Velocity.X < 0f && num118 > 0f) || (npc.Velocity.Y > 0f && num119 < 0f) || (npc.Velocity.Y < 0f && num119 > 0f)) && Math.Abs(npc.Velocity.X) + Math.Abs(npc.Velocity.Y) > num116 / 2f && num120 < 300f)
                    {
                        flag14 = true;
                        if (Math.Abs(npc.Velocity.X) + Math.Abs(npc.Velocity.Y) < num115)
                        {
                            npc.Velocity *= 1.1f;
                        }
                    }
                    if (npc.Position.Y > Main.players[npc.target].Position.Y || (double)(Main.players[npc.target].Position.Y / 16f) > Main.worldSurface || Main.players[npc.target].dead)
                    {
                        flag14 = true;
                        if (Math.Abs(npc.Velocity.X) < num115 / 2f)
                        {
                            if (npc.Velocity.X == 0f)
                            {
                                npc.Velocity.X = npc.Velocity.X - (float)npc.direction;
                            }
                            npc.Velocity.X = npc.Velocity.X * 1.1f;
                        }
                        else if (npc.Velocity.Y > -num115)
                        {
                            npc.Velocity.Y = npc.Velocity.Y - num116;
                        }
                    }
                }
                if (!flag14)
                {
                    if ((npc.Velocity.X > 0f && num118 > 0f) || (npc.Velocity.X < 0f && num118 < 0f) || (npc.Velocity.Y > 0f && num119 > 0f) || (npc.Velocity.Y < 0f && num119 < 0f))
                    {
                        if (npc.Velocity.X < num118)
                        {
                            npc.Velocity.X = npc.Velocity.X + num116;
                        }
                        else if (npc.Velocity.X > num118)
                        {
                            npc.Velocity.X = npc.Velocity.X - num116;
                        }

                        if (npc.Velocity.Y < num119)
                        {
                            npc.Velocity.Y = npc.Velocity.Y + num116;
                        }
                        else if (npc.Velocity.Y > num119)
                        {
                            npc.Velocity.Y = npc.Velocity.Y - num116;
                        }

                        if ((double)Math.Abs(num119) < (double)num115 * 0.2 && ((npc.Velocity.X > 0f && num118 < 0f) || (npc.Velocity.X < 0f && num118 > 0f)))
                        {
                            if (npc.Velocity.Y > 0f)
                            {
                                npc.Velocity.Y = npc.Velocity.Y + num116 * 2f;
                            }
                            else
                            {
                                npc.Velocity.Y = npc.Velocity.Y - num116 * 2f;
                            }
                        }
                        if ((double)Math.Abs(num118) < (double)num115 * 0.2 && ((npc.Velocity.Y > 0f && num119 < 0f) || (npc.Velocity.Y < 0f && num119 > 0f)))
                        {
                            if (npc.Velocity.X > 0f)
                            {
                                npc.Velocity.X = npc.Velocity.X + num116 * 2f;
                            }
                            else
                            {
                                npc.Velocity.X = npc.Velocity.X - num116 * 2f;
                            }
                        }
                    }
                    else if (num123 > num124)
                    {
                        if (npc.Velocity.X < num118)
                        {
                            npc.Velocity.X = npc.Velocity.X + num116 * 1.1f;
                        }
                        else if (npc.Velocity.X > num118)
                        {
                            npc.Velocity.X = npc.Velocity.X - num116 * 1.1f;
                        }
                        if ((double)(Math.Abs(npc.Velocity.X) + Math.Abs(npc.Velocity.Y)) < (double)num115 * 0.5)
                        {
                            if (npc.Velocity.Y > 0f)
                            {
                                npc.Velocity.Y = npc.Velocity.Y + num116;
                            }
                            else
                            {
                                npc.Velocity.Y = npc.Velocity.Y - num116;
                            }
                        }
                    }
                    else
                    {
                        if (npc.Velocity.Y < num119)
                        {
                            npc.Velocity.Y = npc.Velocity.Y + num116 * 1.1f;
                        }
                        else if (npc.Velocity.Y > num119)
                        {
                            npc.Velocity.Y = npc.Velocity.Y - num116 * 1.1f;
                        }

                        if ((double)(Math.Abs(npc.Velocity.X) + Math.Abs(npc.Velocity.Y)) < (double)num115 * 0.5)
                        {
                            if (npc.Velocity.X > 0f)
                            {
                                npc.Velocity.X = npc.Velocity.X + num116;
                            }
                            else
                            {
                                npc.Velocity.X = npc.Velocity.X - num116;
                            }
                        }
                    }
                }
            }

            npc.rotation = (float)Math.Atan2((double)npc.Velocity.Y, (double)npc.Velocity.X) + 1.57f;
            if (npc.type == NPCType.N07_DEVOURER_HEAD || npc.type == NPCType.N10_GIANT_WORM_HEAD ||
                npc.type == NPCType.N13_EATER_OF_WORLDS_HEAD || npc.type == NPCType.N39_BONE_SERPENT_HEAD || npc.type == NPCType.N95_DIGGER_HEAD ||
                npc.type == NPCType.N98_SEEKER_HEAD || npc.type == NPCType.N117_LEECH_HEAD)
            {
                if (flag11)
                {
                    if (npc.localAI[0] != 1f)
                    {
                        npc.netUpdate = true;
                    }
                    npc.localAI[0] = 1f;
                }
                else
                {
                    if (npc.localAI[0] != 0f)
                    {
                        npc.netUpdate = true;
                    }
                    npc.localAI[0] = 0f;
                }
                if (((npc.Velocity.X > 0f && npc.oldVelocity.X < 0f) || (npc.Velocity.X < 0f && npc.oldVelocity.X > 0f) || (npc.Velocity.Y > 0f && npc.oldVelocity.Y < 0f) || (npc.Velocity.Y < 0f && npc.oldVelocity.Y > 0f)) && !npc.justHit)
                {
                    npc.netUpdate = true;
                    return;
                }
            }
        }