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

◆ AI_007_FindGoodRestingSpot()

void Terraria.NPC.AI_007_FindGoodRestingSpot ( int myTileX,
int myTileY,
out int floorX,
out int floorY )
inlineprivate

Definition at line 46090 of file NPC.cs.

46091 {
46092 floorX = homeTileX;
46093 floorY = homeTileY;
46094 if (floorX == -1 || floorY == -1)
46095 {
46096 return;
46097 }
46098 while (!WorldGen.SolidOrSlopedTile(floorX, floorY) && floorY < Main.maxTilesY - 20)
46099 {
46100 floorY++;
46101 }
46102 if (Main.dayTime || (ai[0] == 5f && Math.Abs(myTileX - floorX) < 7 && Math.Abs(myTileY - floorY) < 7))
46103 {
46104 return;
46105 }
46106 Point point = new Point(floorX, floorY);
46107 Point point2 = new Point(-1, -1);
46108 int num = -1;
46109 if (type == 638 || type == 656 || NPCID.Sets.IsTownSlime[type] || ai[0] == 5f)
46110 {
46111 return;
46112 }
46113 int num2 = 7;
46114 int num3 = 6;
46115 int num4 = 2;
46116 int num5 = 1;
46117 int num6 = 2;
46118 for (int i = point.X - num2; i <= point.X + num2; i += num5)
46119 {
46120 for (int num7 = point.Y + num4; num7 >= point.Y - num3; num7 -= num6)
46121 {
46122 Tile tile = Main.tile[i, num7];
46123 if (tile != null && tile.active() && TileID.Sets.CanBeSatOnForNPCs[tile.type] && (tile.frameY % 40 != 0 || num7 + 1 <= point.Y + num4))
46124 {
46125 int num8 = Math.Abs(i - point.X) + Math.Abs(num7 - point.Y);
46126 if (num == -1 || num8 < num)
46127 {
46128 num = num8;
46129 point2.X = i;
46130 point2.Y = num7;
46131 }
46132 }
46133 }
46134 }
46135 if (num == -1)
46136 {
46137 return;
46138 }
46139 Tile tile2 = Main.tile[point2.X, point2.Y];
46140 if (tile2.type == 497 || tile2.type == 15)
46141 {
46142 if (tile2.frameY % 40 != 0)
46143 {
46144 point2.Y--;
46145 }
46146 point2.Y += 2;
46147 }
46148 for (int j = 0; j < 200; j++)
46149 {
46150 if (Main.npc[j].active && Main.npc[j].aiStyle == 7 && Main.npc[j].townNPC && Main.npc[j].ai[0] == 5f && (Main.npc[j].Bottom + Vector2.UnitY * -2f).ToTileCoordinates() == point2)
46151 {
46152 return;
46153 }
46154 }
46155 floorX = point2.X;
46156 floorY = point2.Y;
46157 }
static double Abs(double value)
static bool[] IsTownSlime
Definition NPCID.cs:4101
static bool[] CanBeSatOnForNPCs
Definition TileID.cs:133
float[] ai
Definition NPC.cs:447
int homeTileX
Definition NPC.cs:543
int type
Definition NPC.cs:445
int homeTileY
Definition NPC.cs:545

References System.Math.Abs(), Terraria.Tile.active(), Terraria.NPC.ai, Terraria.ID.TileID.Sets.CanBeSatOnForNPCs, Terraria.Main.dayTime, Terraria.NPC.homeTileX, Terraria.NPC.homeTileY, Terraria.ID.NPCID.Sets.IsTownSlime, Terraria.Main.maxTilesY, Terraria.Main.npc, Microsoft.Xna.Framework.Graphics.Point, Terraria.WorldGen.SolidOrSlopedTile(), Terraria.Main.tile, Terraria.NPC.type, Terraria.Tile.type, Microsoft.Xna.Framework.Vector2.UnitY, Microsoft.Xna.Framework.Point.X, and Microsoft.Xna.Framework.Point.Y.

Referenced by Terraria.NPC.AI_007_TownEntities().