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

◆ SpawnTownNPC()

static TownNPCSpawnResult Terraria.WorldGen.SpawnTownNPC ( int x,
int y )
inlinestatic

Definition at line 1926 of file WorldGen.cs.

1927 {
1928 if (Main.wallHouse[Main.tile[x, y].wall])
1929 {
1930 canSpawn = true;
1931 }
1932 if (!canSpawn)
1933 {
1934 return TownNPCSpawnResult.Blocked;
1935 }
1936 if (!StartRoomCheck(x, y))
1937 {
1938 return TownNPCSpawnResult.Blocked;
1939 }
1941 {
1942 return TownNPCSpawnResult.Blocked;
1943 }
1944 int num = FindAHomelessNPC();
1946 if (num != -1)
1947 {
1948 type = Main.npc[num].type;
1949 }
1951 bool flag = NPCID.Sets.IsTownPet[type] && TownManager.HasRoom(type, out roomPosition);
1952 if ((roomHasStinkbug || roomHasEchoStinkbug) && !flag)
1953 {
1954 return TownNPCSpawnResult.Blocked;
1955 }
1956 ScoreRoom(-1, type);
1957 if (hiScore <= 0)
1958 {
1959 return TownNPCSpawnResult.Blocked;
1960 }
1961 bool canSpawnNewTownNPC = true;
1963 {
1964 return TownNPCSpawnResult.Blocked;
1965 }
1967 if (num != -1)
1968 {
1969 Main.townNPCCanSpawn[prioritizedTownNPCType] = false;
1970 Main.npc[num].homeTileX = bestX;
1971 Main.npc[num].homeTileY = bestY;
1972 Main.npc[num].homeless = false;
1975 return TownNPCSpawnResult.RelocatedHomeless;
1976 }
1977 if (canSpawnNewTownNPC && num == -1)
1978 {
1980 {
1981 int num2 = bestX;
1982 int num3 = bestY;
1986 bestX = num2;
1987 bestY = num3;
1988 if (townNPCSpawnResult == TownNPCSpawnResult.Successful)
1989 {
1990 return townNPCSpawnResult;
1991 }
1992 }
1993 int num4 = bestX;
1994 int num5 = bestY;
1997 {
1998 return TownNPCSpawnResult.BlockedInfiHousing;
1999 }
2000 bool flag2 = false;
2001 if (!flag2)
2002 {
2003 flag2 = true;
2004 Rectangle value = new Rectangle(num4 * 16 + 8 - NPC.sWidth / 2 - NPC.safeRangeX, num5 * 16 + 8 - NPC.sHeight / 2 - NPC.safeRangeY, NPC.sWidth + NPC.safeRangeX * 2, NPC.sHeight + NPC.safeRangeY * 2);
2005 for (int i = 0; i < 255; i++)
2006 {
2007 if (Main.player[i].active && new Rectangle((int)Main.player[i].position.X, (int)Main.player[i].position.Y, Main.player[i].width, Main.player[i].height).Intersects(value))
2008 {
2009 flag2 = false;
2010 break;
2011 }
2012 }
2013 }
2014 if (!flag2 && !((double)num5 > Main.worldSurface))
2015 {
2016 for (int j = 1; j < 500; j++)
2017 {
2018 for (int k = 0; k < 2; k++)
2019 {
2020 num4 = ((k != 0) ? (bestX - j) : (bestX + j));
2021 if (num4 > 10 && num4 < Main.maxTilesX - 10)
2022 {
2023 int num6 = bestY - j;
2024 double num7 = bestY + j;
2025 if (num6 < 10)
2026 {
2027 num6 = 10;
2028 }
2029 if (num7 > Main.worldSurface)
2030 {
2031 num7 = Main.worldSurface;
2032 }
2033 for (int l = num6; (double)l < num7; l++)
2034 {
2035 num5 = l;
2036 if (!Main.tile[num4, num5].nactive() || !Main.tileSolid[Main.tile[num4, num5].type])
2037 {
2038 continue;
2039 }
2040 if (Collision.SolidTiles(num4 - 1, num4 + 1, num5 - 3, num5 - 1))
2041 {
2042 break;
2043 }
2044 flag2 = true;
2045 Rectangle value2 = new Rectangle(num4 * 16 + 8 - NPC.sWidth / 2 - NPC.safeRangeX, num5 * 16 + 8 - NPC.sHeight / 2 - NPC.safeRangeY, NPC.sWidth + NPC.safeRangeX * 2, NPC.sHeight + NPC.safeRangeY * 2);
2046 for (int m = 0; m < 255; m++)
2047 {
2048 if (Main.player[m].active && new Rectangle((int)Main.player[m].position.X, (int)Main.player[m].position.Y, Main.player[m].width, Main.player[m].height).Intersects(value2))
2049 {
2050 flag2 = false;
2051 break;
2052 }
2053 }
2054 break;
2055 }
2056 }
2057 if (flag2)
2058 {
2059 break;
2060 }
2061 }
2062 if (flag2)
2063 {
2064 break;
2065 }
2066 }
2067 }
2068 int num8 = NPC.NewNPC(NPC.GetSpawnSourceForTownSpawn(), num4 * 16, num5 * 16, type, 1);
2069 Main.townNPCCanSpawn[type] = false;
2070 Main.npc[num8].homeTileX = bestX;
2071 Main.npc[num8].homeTileY = bestY;
2072 if (num4 < bestX)
2073 {
2074 Main.npc[num8].direction = 1;
2075 }
2076 else if (num4 > bestX)
2077 {
2078 Main.npc[num8].direction = -1;
2079 }
2080 Main.npc[num8].netUpdate = true;
2081 string fullName = Main.npc[num8].FullName;
2082 if (Main.netMode == 0)
2083 {
2084 Main.NewText(Language.GetTextValue("Announcement.HasArrived", fullName), 50, 125);
2085 }
2086 else if (Main.netMode == 2)
2087 {
2088 ChatHelper.BroadcastChatMessage(NetworkText.FromKey("Announcement.HasArrived", Main.npc[num8].GetFullNetName()), new Color(50, 125, 255));
2089 }
2091 switch (Main.npc[num8].type)
2092 {
2093 case 160:
2095 NPC.unlockedTruffleSpawn = true;
2096 NetMessage.SendData(7);
2097 break;
2098 case 17:
2099 NPC.unlockedMerchantSpawn = true;
2100 break;
2101 case 207:
2102 NPC.unlockedDyeTraderSpawn = true;
2103 break;
2104 case 18:
2105 NPC.unlockedNurseSpawn = true;
2106 break;
2107 case 19:
2108 NPC.unlockedArmsDealerSpawn = true;
2109 break;
2110 case 38:
2111 NPC.unlockedDemolitionistSpawn = true;
2112 break;
2113 case 208:
2114 NPC.unlockedPartyGirlSpawn = true;
2115 break;
2116 case 663:
2117 NPC.unlockedPrincessSpawn = true;
2118 break;
2119 case 678:
2120 NPC.unlockedSlimeGreenSpawn = true;
2121 break;
2122 }
2125 }
2126 return TownNPCSpawnResult.Successful;
2127 }
static void BroadcastChatMessage(NetworkText text, Color color, int excludedPlayer=-1)
Definition ChatHelper.cs:46
static bool[] IsTownPet
Definition NPCID.cs:4099
static string GetTextValue(string key)
Definition Language.cs:15
static NetworkText FromKey(string key, params object[] substitutions)
static void CheckAchievement_RealEstateAndTownSlimes()
Definition WorldGen.cs:2158
static TownRoomManager TownManager
Definition WorldGen.cs:892
static bool IsThereASpawnablePrioritizedTownNPC(int x, int y, ref bool canSpawnNewTownNPC)
Definition WorldGen.cs:1612
static int prioritizedTownNPCType
Definition WorldGen.cs:1024
static bool roomHasEchoStinkbug
Definition WorldGen.cs:1090
static bool IsRoomConsideredAlreadyOccupied(int spawnTileX, int spawnTileY, int npcTypeToSpawn)
Definition WorldGen.cs:2143
static void ScoreRoom(int ignoreNPC=-1, int npcTypeAskingToScoreRoom=-1)
Definition WorldGen.cs:2380
static int hiScore
Definition WorldGen.cs:1074
static bool roomHasStinkbug
Definition WorldGen.cs:1088
static int FindAHomelessNPC()
Definition WorldGen.cs:2129
static bool StartRoomCheck(int x, int y)
Definition WorldGen.cs:2581
static bool RoomNeeds(int npcType)
Definition WorldGen.cs:2178
static bool canSpawn
Definition WorldGen.cs:1066
static int bestX
Definition WorldGen.cs:1070
static TownNPCSpawnResult SpawnTownNPC(int x, int y)
Definition WorldGen.cs:1926
static bool currentlyTryingToUseAlternateHousingSpot
Definition WorldGen.cs:1102
static int bestY
Definition WorldGen.cs:1072
bool Intersects(Rectangle value)
Definition Rectangle.cs:129

References Terraria.WorldGen.bestX, Terraria.WorldGen.bestY, Terraria.Chat.ChatHelper.BroadcastChatMessage(), Terraria.WorldGen.canSpawn, Terraria.WorldGen.CheckAchievement_RealEstateAndTownSlimes(), Terraria.WorldGen.currentlyTryingToUseAlternateHousingSpot, Terraria.WorldGen.FindAHomelessNPC(), Terraria.Localization.NetworkText.FromKey(), Terraria.NPC.GetSpawnSourceForTownSpawn(), Terraria.Localization.Language.GetTextValue(), Terraria.WorldGen.hiScore, Microsoft.Xna.Framework.Rectangle.Intersects(), Terraria.WorldGen.IsRoomConsideredAlreadyOccupied(), Terraria.WorldGen.IsThereASpawnablePrioritizedTownNPC(), Terraria.ID.NPCID.Sets.IsTownPet, Terraria.Main.maxTilesX, Terraria.Main.netMode, Terraria.NPC.NewNPC(), Terraria.Main.NewText(), Terraria.GameContent.Achievements.AchievementsHelper.NotifyProgressionEvent(), Terraria.Main.npc, Terraria.Main.player, Terraria.WorldGen.prioritizedTownNPCType, Terraria.WorldGen.roomHasEchoStinkbug, Terraria.WorldGen.roomHasStinkbug, Terraria.WorldGen.RoomNeeds(), Terraria.NPC.safeRangeX, Terraria.NPC.safeRangeY, Terraria.WorldGen.ScoreRoom(), Terraria.NetMessage.SendData(), Terraria.NPC.sHeight, Terraria.Collision.SolidTiles(), Terraria.WorldGen.SpawnTownNPC(), Terraria.WorldGen.StartRoomCheck(), Terraria.NPC.sWidth, Terraria.Main.tile, Terraria.Main.tileSolid, Terraria.WorldGen.TownManager, Terraria.Main.townNPCCanSpawn, System.type, System.value, Terraria.Main.wallHouse, Terraria.Main.worldSurface, and Microsoft.Xna.Framework.Point.Zero.

Referenced by Terraria.WorldGen.moveRoom(), and Terraria.WorldGen.SpawnTownNPC().