Exemple #1
0
        private void Copied_AI_003_Fighters_Type_430()
        {
            if (Main.player[npc.target].position.Y + (float)Main.player[npc.target].height == npc.position.Y + (float)npc.height)
            {
                npc.directionY = -1;
            }
            bool flag  = false;
            bool flag5 = false;
            bool flag6 = false;

            if (npc.velocity.X == 0f)
            {
                flag6 = true;
            }
            if (npc.justHit)
            {
                flag6 = false;
            }
            int  num52  = 60;
            bool flag7  = false;
            bool flag8  = false;
            bool flag9  = false;
            bool flag10 = true;

            if (!flag9 && flag10)
            {
                if (npc.velocity.Y == 0f && ((npc.velocity.X > 0f && npc.direction < 0) || (npc.velocity.X < 0f && npc.direction > 0)))
                {
                    flag7 = true;
                }
                if (npc.position.X == npc.oldPosition.X || npc.ai[3] >= (float)num52 || flag7)
                {
                    npc.ai[3] += 1f;
                }
                else if ((double)Math.Abs(npc.velocity.X) > 0.9 && npc.ai[3] > 0f)
                {
                    npc.ai[3] -= 1f;
                }
                if (npc.ai[3] > (float)(num52 * 10))
                {
                    npc.ai[3] = 0f;
                }
                if (npc.justHit)
                {
                    npc.ai[3] = 0f;
                }
                if (npc.ai[3] == (float)num52)
                {
                    npc.velocity.X = -npc.velocity.X;
                    npc.direction  = -npc.direction;
                    npc.netUpdate  = true;
                }
                if (Main.player[npc.target].Hitbox.Intersects(npc.Hitbox))
                {
                    npc.ai[3] = 0f;
                }
                if (npc.ai[3] <= 2f || npc.ai[3] >= 300f)
                {
                    npc.TargetClosest();
                }
            }
            if (npc.ai[2] == 0f)
            {
                npc.damage = npc.defDamage;
                float num95 = 1f;
                num95 *= 2f + (1f - npc.scale);
                if (npc.velocity.X < -num95 || npc.velocity.X > num95)
                {
                    if (npc.velocity.Y == 0f)
                    {
                        npc.velocity *= 0.8f;
                    }
                }
                else if (npc.velocity.X < num95 && npc.direction == 1)
                {
                    npc.velocity.X = npc.velocity.X + 0.07f;
                    if (npc.velocity.X > num95)
                    {
                        npc.velocity.X = num95;
                    }
                }
                else if (npc.velocity.X > -num95 && npc.direction == -1)
                {
                    npc.velocity.X = npc.velocity.X - 0.07f;
                    if (npc.velocity.X < -num95)
                    {
                        npc.velocity.X = -num95;
                    }
                }
                if (npc.velocity.Y == 0f && !Main.player[npc.target].dead && !Main.player[npc.target].npcTypeNoAggro[npc.type])
                {
                    Vector2 vector15 = npc.Center - Main.player[npc.target].Center;
                    int     num96    = 32 + (int)(npc.width * 0.5f);                                                                  // NPC宽度外的2格都属于搜索范围
                    if (vector15.Length() < (float)num96 && Collision.CanHit(npc.Center, 1, 1, Main.player[npc.target].Center, 1, 1)) // 如果他能打到玩家
                    {
                        npc.velocity.X   = npc.velocity.X * 0.7f;
                        npc.ai[2]        = 1f; // 将ai[2]设为非0数,即开启攻击模式
                        npc.frameCounter = 0;
                    }
                }
            }
            else // 攻击模式
            {
                npc.damage     = (int)((double)npc.defDamage * 1.5);
                npc.ai[3]      = 1f;
                npc.velocity.X = npc.velocity.X * 0.9f;
                if ((double)Math.Abs(npc.velocity.X) < 0.1)
                {
                    npc.velocity.X = 0f;
                }
                npc.ai[2] += 1f;
                if (npc.ai[2] >= 20f || npc.velocity.Y != 0f)
                {
                    npc.ai[2]        = 0f;
                    npc.frameCounter = 0;
                }
            }
            if (npc.velocity.Y == 0f || flag)
            {
                int  num163 = (int)(npc.position.Y + (float)npc.height + 7f) / 16;
                int  num164 = (int)(npc.position.Y - 9f) / 16;
                int  num165 = (int)npc.position.X / 16;
                int  num166 = (int)(npc.position.X + (float)npc.width) / 16;
                int  num167 = (int)(npc.position.X + 8f) / 16;
                int  num168 = (int)(npc.position.X + (float)npc.width - 8f) / 16;
                bool flag20 = false;
                for (int num169 = num167; num169 <= num168; num169++)
                {
                    if (num169 >= num165 && num169 <= num166 && Main.tile[num169, num163] == null)
                    {
                        flag20 = true;
                    }
                    else
                    {
                        if (Main.tile[num169, num164] != null && Main.tile[num169, num164].nactive() && Main.tileSolid[(int)Main.tile[num169, num164].type])
                        {
                            flag5 = false;
                            break;
                        }
                        if (!flag20 && num169 >= num165 && num169 <= num166 && Main.tile[num169, num163].nactive() && Main.tileSolid[(int)Main.tile[num169, num163].type])
                        {
                            flag5 = true;
                        }
                    }
                }
                if (!flag5 && npc.velocity.Y < 0f)
                {
                    npc.velocity.Y = 0f;
                }
                if (flag20)
                {
                    return;
                }
            }
            if (npc.velocity.Y >= 0f)
            {
                int num170 = 0;
                if (npc.velocity.X < 0f)
                {
                    num170 = -1;
                }
                if (npc.velocity.X > 0f)
                {
                    num170 = 1;
                }
                Vector2 position3 = npc.position;
                position3.X += npc.velocity.X;
                int num171 = (int)((position3.X + (float)(npc.width / 2) + (float)((npc.width / 2 + 1) * num170)) / 16f);
                int num172 = (int)((position3.Y + (float)npc.height - 1f) / 16f);
                if (WorldGen.InWorld(num171, num172, 4))
                {
                    if (Main.tile[num171, num172] == null)
                    {
                        Main.tile[num171, num172] = new Tile();
                    }
                    if (Main.tile[num171, num172 - 1] == null)
                    {
                        Main.tile[num171, num172 - 1] = new Tile();
                    }
                    if (Main.tile[num171, num172 - 2] == null)
                    {
                        Main.tile[num171, num172 - 2] = new Tile();
                    }
                    if (Main.tile[num171, num172 - 3] == null)
                    {
                        Main.tile[num171, num172 - 3] = new Tile();
                    }
                    if (Main.tile[num171, num172 + 1] == null)
                    {
                        Main.tile[num171, num172 + 1] = new Tile();
                    }
                    if (Main.tile[num171 - num170, num172 - 3] == null)
                    {
                        Main.tile[num171 - num170, num172 - 3] = new Tile();
                    }
                    if ((float)(num171 * 16) < position3.X + (float)npc.width && (float)(num171 * 16 + 16) > position3.X && ((Main.tile[num171, num172].nactive() && !Main.tile[num171, num172].topSlope() && !Main.tile[num171, num172 - 1].topSlope() && Main.tileSolid[(int)Main.tile[num171, num172].type] && !Main.tileSolidTop[(int)Main.tile[num171, num172].type]) || (Main.tile[num171, num172 - 1].halfBrick() && Main.tile[num171, num172 - 1].nactive())) && (!Main.tile[num171, num172 - 1].nactive() || !Main.tileSolid[(int)Main.tile[num171, num172 - 1].type] || Main.tileSolidTop[(int)Main.tile[num171, num172 - 1].type] || (Main.tile[num171, num172 - 1].halfBrick() && (!Main.tile[num171, num172 - 4].nactive() || !Main.tileSolid[(int)Main.tile[num171, num172 - 4].type] || Main.tileSolidTop[(int)Main.tile[num171, num172 - 4].type]))) && (!Main.tile[num171, num172 - 2].nactive() || !Main.tileSolid[(int)Main.tile[num171, num172 - 2].type] || Main.tileSolidTop[(int)Main.tile[num171, num172 - 2].type]) && (!Main.tile[num171, num172 - 3].nactive() || !Main.tileSolid[(int)Main.tile[num171, num172 - 3].type] || Main.tileSolidTop[(int)Main.tile[num171, num172 - 3].type]) && (!Main.tile[num171 - num170, num172 - 3].nactive() || !Main.tileSolid[(int)Main.tile[num171 - num170, num172 - 3].type]))
                    {
                        float num173 = (float)(num172 * 16);
                        if (Main.tile[num171, num172].halfBrick())
                        {
                            num173 += 8f;
                        }
                        if (Main.tile[num171, num172 - 1].halfBrick())
                        {
                            num173 -= 8f;
                        }
                        if (num173 < position3.Y + (float)npc.height)
                        {
                            float num174 = position3.Y + (float)npc.height - num173;
                            float num175 = 16.1f;
                            if (num174 <= num175)
                            {
                                npc.gfxOffY   += npc.position.Y + (float)npc.height - num173;
                                npc.position.Y = num173 - (float)npc.height;
                                if (num174 < 9f)
                                {
                                    npc.stepSpeed = 2f;
                                }
                                else
                                {
                                    npc.stepSpeed = 4f;
                                }
                            }
                        }
                    }
                }
            }
            if (flag5)
            {
                int num176 = (int)((npc.position.X + (float)(npc.width / 2) + (float)(15 * npc.direction)) / 16f);
                int num177 = (int)((npc.position.Y + (float)npc.height - 15f) / 16f);
                if (Main.tile[num176, num177] == null)
                {
                    Main.tile[num176, num177] = new Tile();
                }
                if (Main.tile[num176, num177 - 1] == null)
                {
                    Main.tile[num176, num177 - 1] = new Tile();
                }
                if (Main.tile[num176, num177 - 2] == null)
                {
                    Main.tile[num176, num177 - 2] = new Tile();
                }
                if (Main.tile[num176, num177 - 3] == null)
                {
                    Main.tile[num176, num177 - 3] = new Tile();
                }
                if (Main.tile[num176, num177 + 1] == null)
                {
                    Main.tile[num176, num177 + 1] = new Tile();
                }
                if (Main.tile[num176 + npc.direction, num177 - 1] == null)
                {
                    Main.tile[num176 + npc.direction, num177 - 1] = new Tile();
                }
                if (Main.tile[num176 + npc.direction, num177 + 1] == null)
                {
                    Main.tile[num176 + npc.direction, num177 + 1] = new Tile();
                }
                if (Main.tile[num176 - npc.direction, num177 + 1] == null)
                {
                    Main.tile[num176 - npc.direction, num177 + 1] = new Tile();
                }
                Main.tile[num176, num177 + 1].halfBrick();
                if (Main.tile[num176, num177 - 1].nactive() && (Main.tile[num176, num177 - 1].type == 10 || Main.tile[num176, num177 - 1].type == 388) && flag8)
                {
                    npc.ai[2] += 1f;
                    npc.ai[3]  = 0f;
                    if (npc.ai[2] >= 60f)
                    {
                        npc.velocity.X = 0.5f * (float)-(float)npc.direction;
                        int num178 = 5;
                        if (Main.tile[num176, num177 - 1].type == 388)
                        {
                            num178 = 2;
                        }
                        npc.ai[1] += (float)num178;
                        npc.ai[2]  = 0f;
                        bool flag23 = false;
                        if (npc.ai[1] >= 10f)
                        {
                            flag23    = true;
                            npc.ai[1] = 10f;
                        }
                        WorldGen.KillTile(num176, num177 - 1, true, false, false);
                        if ((Main.netMode != NetmodeID.MultiplayerClient || !flag23) && flag23 && Main.netMode != NetmodeID.MultiplayerClient)
                        {
                            if (Main.tile[num176, num177 - 1].type == 10)
                            {
                                bool flag24 = WorldGen.OpenDoor(num176, num177 - 1, npc.direction);
                                if (!flag24)
                                {
                                    npc.ai[3]     = (float)num52;
                                    npc.netUpdate = true;
                                }
                                if (Main.netMode == NetmodeID.Server && flag24)
                                {
                                    NetMessage.SendData(MessageID.ChangeDoor, -1, -1, null, 0, (float)num176, (float)(num177 - 1), (float)npc.direction, 0, 0, 0);
                                }
                            }
                            if (Main.tile[num176, num177 - 1].type == 388)
                            {
                                npc.ai[3]     = (float)num52;
                                npc.netUpdate = true;
                            }
                        }
                    }
                }
                // 跳跃功能为僵尸的1/3
                else
                {
                    int num179 = npc.spriteDirection;
                    if ((npc.velocity.X < 0f && num179 == -1) || (npc.velocity.X > 0f && num179 == 1))
                    {
                        if (npc.height >= 32 && Main.tile[num176, num177 - 2].nactive() && Main.tileSolid[(int)Main.tile[num176, num177 - 2].type])
                        {
                            if (Main.tile[num176, num177 - 3].nactive() && Main.tileSolid[(int)Main.tile[num176, num177 - 3].type])
                            {
                                npc.velocity.Y = -8f / 2.5f;
                                npc.netUpdate  = true;
                            }
                            else
                            {
                                npc.velocity.Y = -7f / 2.5f;
                                npc.netUpdate  = true;
                            }
                        }
                        else if (Main.tile[num176, num177 - 1].nactive() && Main.tileSolid[(int)Main.tile[num176, num177 - 1].type])
                        {
                            npc.velocity.Y = -6f / 2.5f;
                            npc.netUpdate  = true;
                        }
                        else if (npc.position.Y + (float)npc.height - (float)(num177 * 16) > 20f && Main.tile[num176, num177].nactive() && !Main.tile[num176, num177].topSlope() && Main.tileSolid[(int)Main.tile[num176, num177].type])
                        {
                            npc.velocity.Y = -5f / 2.5f;
                            npc.netUpdate  = true;
                        }
                        else if (npc.directionY < 0 && (!Main.tile[num176, num177 + 1].nactive() || !Main.tileSolid[(int)Main.tile[num176, num177 + 1].type]) && (!Main.tile[num176 + npc.direction, num177 + 1].nactive() || !Main.tileSolid[(int)Main.tile[num176 + npc.direction, num177 + 1].type]))
                        {
                            npc.velocity.Y = -8f / 2.5f;
                            npc.velocity.X = npc.velocity.X * 1.5f;
                            npc.netUpdate  = true;
                        }
                        else if (flag8)
                        {
                            npc.ai[1] = 0f;
                            npc.ai[2] = 0f;
                        }
                        if (npc.velocity.Y == 0f && flag6 && npc.ai[3] == 1f)
                        {
                            npc.velocity.Y = -5f / 2.5f;
                        }
                        if (npc.velocity.Y == 0f && Main.player[npc.target].Bottom.Y < npc.Top.Y && Math.Abs(npc.Center.X - Main.player[npc.target].Center.X) < (float)(Main.player[npc.target].width * 3) && ModHelper.CanHit(npc, Main.player[npc.target]))
                        {
                            if (npc.velocity.Y == 0f)
                            {
                                int num182 = 6;
                                if (Main.player[npc.target].Bottom.Y > npc.Top.Y - (float)(num182 * 16))
                                {
                                    npc.velocity.Y = -7.9f / 2.5f;
                                }
                                else
                                {
                                    int num183 = (int)(npc.Center.X / 16f);
                                    int num184 = (int)(npc.Bottom.Y / 16f) - 1;
                                    for (int num185 = num184; num185 > num184 - num182; num185--)
                                    {
                                        if (Main.tile[num183, num185].nactive() && TileID.Sets.Platforms[(int)Main.tile[num183, num185].type])
                                        {
                                            npc.velocity.Y = -7.9f / 2.5f;
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                        // NPC下平台
                        npc.TryDownstairs();
                    }
                }
            }
            else if (flag8)
            {
                npc.ai[1] = 0f;
                npc.ai[2] = 0f;
            }
        }