public static void DrawBannerGame()
 {
     if (!ManagingGuardianHouses)
     {
         return;
     }
     try
     {
         string MouseText = "";
         for (int g = 0; g < WorldMod.MaxGuardianNpcsInWorld; g++)
         {
             WorldMod.GuardianTownNpcState townnpc = WorldMod.GuardianNPCsInWorld[g];
             if (townnpc != null && !townnpc.Homeless && WorldMod.IsGuardianNpcInWorld(townnpc.CharID))
             {
                 int BannerX = townnpc.HomeX, BannerY = townnpc.HomeY;
                 if (BannerX < 0 || BannerY < 0)
                 {
                     continue;
                 }
                 BannerY--;
                 if (Main.tile[BannerX, BannerY] == null)
                 {
                     continue;
                 }
                 bool EndsOnNullTile = false;
                 while (!Main.tile[BannerX, BannerY].active() || !Main.tileSolid[(int)Main.tile[BannerX, BannerY].type])
                 {
                     BannerY--;
                     if (BannerY < 10)
                     {
                         break;
                     }
                     if (Main.tile[BannerX, BannerY] == null)
                     {
                         EndsOnNullTile = true;
                         break;
                     }
                 }
                 if (EndsOnNullTile)
                 {
                     continue;
                 }
                 TerraGuardian guardian = null;
                 foreach (TerraGuardian tg in WorldMod.GuardianTownNPC)
                 {
                     if (townnpc.IsID(tg.ID, tg.ModID))
                     {
                         guardian = tg;
                         break;
                     }
                 }
                 if (guardian == null)
                 {
                     continue;
                 }
                 const int PaddingX = 8;
                 int       PaddingY = 18;
                 if (Main.tile[BannerX, BannerY].type == 19)
                 {
                     PaddingY -= 8;
                 }
                 BannerY++;
                 Vector2 BannerPosition = new Vector2(BannerX * 16 + PaddingX, BannerY * 16 + PaddingY) - Main.screenPosition;
                 DrawBanner(guardian, BannerPosition, Lighting.GetColor(BannerX, BannerY));
                 BannerPosition -= new Vector2(Main.HouseBannerTexture[1].Width * 0.5f, Main.HouseBannerTexture[1].Height * 0.5f);
                 if (Main.mouseX >= BannerPosition.X && Main.mouseX < BannerPosition.X + Main.HouseBannerTexture[1].Width &&
                     Main.mouseY >= BannerPosition.Y && Main.mouseY < BannerPosition.Y + Main.HouseBannerTexture[1].Height)
                 {
                     //MainPlayer.mouseInterface = true;
                     MouseText = guardian.Name;
                     if (Main.mouseRight && Main.mouseRightRelease)
                     {
                         if (!guardian.IsStarter && !guardian.IsPlayerBuddy(Main.LocalPlayer) && guardian.FriendshipLevel < guardian.Base.MoveInLevel)
                         {
                             Main.NewText(guardian.Name + (Main.rand.Next(2) == 0 ? " refuses to leave their house." : " doesn't want to be kicked out of their house."), Color.PaleVioletRed);
                         }
                         else
                         {
                             townnpc.Homeless  = true;
                             townnpc.HomeX     =
                                 townnpc.HomeY = -1;
                             townnpc.ValidateHouse();
                             Main.PlaySound(12, -1, -1, 1, 1f, 0f);
                         }
                     }
                 }
             }
         }
         if (MouseText != "")
         {
             Utils.DrawBorderString(Main.spriteBatch, MouseText, new Vector2(Main.mouseX, Main.mouseY + 16), Color.White, 1f, 0.5f);
         }
     }
     catch
     {
     }
 }
        public override void Update(TerraGuardian guardian)
        {
            if (guardian.OwnerPos > -1 || Main.invasionType <= 0)
            {
                InUse = false;
                return;
            }
            if (guardian.UsingFurniture)
            {
                guardian.LeaveFurniture();
            }
            switch (Step)
            {
            case 0:
            {
                int DefendX = 0, DefendY = 0;
                WorldMod.GuardianTownNpcState townnpc = guardian.GetTownNpcInfo;
                bool MoveLeft = Main.rand.Next(2) == 0;
                if (townnpc != null && !townnpc.Homeless)
                {
                    DefendX = townnpc.HomeX;
                    DefendY = townnpc.HomeY;
                    WorldMod.GuardianBuildingInfo house = townnpc.HouseInfo;
                    if (house != null)
                    {
                        float HouseXStack = 0;
                        byte  Count       = 0;
                        foreach (WorldMod.GuardianTownNpcState tgh in house.GuardiansLivingHere)
                        {
                            if (!tgh.Homeless)
                            {
                                HouseXStack += tgh.HomeX;
                                Count++;
                            }
                        }
                        if (Count > 0)
                        {
                            HouseXStack /= Count;
                            MoveLeft     = (DefendX >= HouseXStack);
                        }
                    }
                }
                else
                {
                    NPC   NearestNpc      = null;
                    float NearestDistance = 1000;
                    for (int i = 0; i < 200; i++)
                    {
                        if (Main.npc[i].active && Main.npc[i].townNPC && Main.npc[i].type != Terraria.ID.NPCID.OldMan && !Main.npc[i].homeless)
                        {
                            float Distance = (Main.npc[i].Center - guardian.CenterPosition).Length();
                            if (Distance < NearestDistance)
                            {
                                NearestNpc      = Main.npc[i];
                                NearestDistance = Distance;
                            }
                        }
                    }
                    if (NearestNpc != null)
                    {
                        DefendX = NearestNpc.homeTileX;
                        DefendY = NearestNpc.homeTileY;
                    }
                    else
                    {
                        DefendX = (int)(guardian.Position.X * (1f / 16));
                        DefendX = (int)(guardian.Position.Y * (1f / 16));
                    }
                }
                bool FoundDefendPosition = false;
                byte AttemptTime         = 40;
                while (!FoundDefendPosition)
                {
                    AttemptTime--;
                    if (AttemptTime == 0)
                    {
                        break;
                    }
                    Tile tile = Framing.GetTileSafely(DefendX, DefendY);
                    if (tile != null && tile.active() && Main.tileSolid[tile.type])
                    {
                        DefendY--;
                        continue;
                    }
                    if (Main.wallHouse[tile.wall])
                    {
                        DefendX += (MoveLeft ? -1 : 1);
                    }
                    else
                    {
                        tile = Framing.GetTileSafely(DefendX, DefendY + 1);
                        if (tile != null && (!tile.active() || !Main.tileSolid[tile.type]))
                        {
                            DefendY++;
                            continue;
                        }
                        bool Failed = false;
                        for (int x = -4; x < 5; x++)
                        {
                            for (int y = -1; y < 2; y++)
                            {
                                if (Failed)
                                {
                                    break;
                                }
                                if (x != 0 || y != 0)
                                {
                                    tile = Framing.GetTileSafely(DefendX + x, DefendY + y);
                                    if (tile != null && Main.wallHouse[tile.wall])
                                    {
                                        DefendX += (MoveLeft ? -1 : 1);
                                        Failed   = true;
                                    }
                                }
                            }
                        }
                        if (!Failed)
                        {
                            FoundDefendPosition = true;
                        }
                    }
                }
                if (AttemptTime == 0)
                {
                    DefendX = (int)(guardian.Position.X * (1f / 16));
                    DefendY = (int)(guardian.Position.Y * (1f / 16));
                }
                GuardPosition = new Vector2(DefendX, DefendY) * 16;
                ChangeStep();
            }
            break;

            case 1:
            {
                if (guardian.TargetID == -1 && guardian.TalkPlayerID == -1)
                {
                    guardian.MoveLeft = guardian.MoveRight = false;
                    guardian.WalkMode = false;
                    if (Math.Abs(guardian.Position.X - GuardPosition.X) > 20)
                    {
                        if (GuardPosition.X < guardian.Position.X)
                        {
                            guardian.MoveLeft = true;
                        }
                        else
                        {
                            guardian.MoveRight = true;
                        }
                    }
                    else
                    {
                    }
                }
            }
            break;
            }
        }