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

◆ SpawnTravelNPC()

static void Terraria.WorldGen.SpawnTravelNPC ( )
inlinestatic

Definition at line 1782 of file WorldGen.cs.

1783 {
1784 if (Main.eclipse || !Main.dayTime || (Main.invasionType > 0 && Main.invasionDelay == 0 && Main.invasionSize > 0))
1785 {
1786 return;
1787 }
1788 for (int i = 0; i < 200; i++)
1789 {
1790 if (Main.npc[i].active && Main.npc[i].type == 368)
1791 {
1792 return;
1793 }
1794 }
1795 Chest.SetupTravelShop();
1796 NetMessage.SendTravelShop(-1);
1797 int num = 0;
1798 int[] array = new int[200];
1799 int num2 = 0;
1800 for (int j = 0; j < 200; j++)
1801 {
1802 if (Main.npc[j].active && Main.npc[j].townNPC && Main.npc[j].type != 37 && !Main.npc[j].homeless)
1803 {
1804 array[num2] = j;
1805 num2++;
1806 }
1807 }
1808 if (num2 == 0)
1809 {
1810 return;
1811 }
1812 num = array[Main.rand.Next(num2)];
1813 bestX = Main.npc[num].homeTileX;
1814 bestY = Main.npc[num].homeTileY;
1815 int minValue = bestX;
1816 int num3 = bestX;
1817 int num4 = bestY;
1818 int num5 = bestX;
1819 while (num5 > bestX - 10 && (SolidTile(num5, num4) || Main.tileSolidTop[Main.tile[num5, num4].type]) && (!Main.tile[num5, num4 - 1].active() || !Main.tileSolid[Main.tile[num5, num4 - 1].type] || Main.tileSolidTop[Main.tile[num5, num4 - 1].type]) && (!Main.tile[num5, num4 - 2].active() || !Main.tileSolid[Main.tile[num5, num4 - 2].type] || Main.tileSolidTop[Main.tile[num5, num4 - 2].type]) && (!Main.tile[num5, num4 - 3].active() || !Main.tileSolid[Main.tile[num5, num4 - 3].type] || Main.tileSolidTop[Main.tile[num5, num4 - 3].type]))
1820 {
1821 minValue = num5;
1822 num5--;
1823 }
1824 for (int k = bestX; k < bestX + 10 && (SolidTile(k, num4) || Main.tileSolidTop[Main.tile[k, num4].type]) && (!Main.tile[k, num4 - 1].active() || !Main.tileSolid[Main.tile[k, num4 - 1].type] || Main.tileSolidTop[Main.tile[k, num4 - 1].type]) && (!Main.tile[k, num4 - 2].active() || !Main.tileSolid[Main.tile[k, num4 - 2].type] || Main.tileSolidTop[Main.tile[k, num4 - 2].type]) && (!Main.tile[k, num4 - 3].active() || !Main.tileSolid[Main.tile[k, num4 - 3].type] || Main.tileSolidTop[Main.tile[k, num4 - 3].type]); k++)
1825 {
1826 num3 = k;
1827 }
1828 for (int l = 0; l < 30; l++)
1829 {
1830 int num6 = Main.rand.Next(minValue, num3 + 1);
1831 if (l < 20)
1832 {
1834 {
1835 bestX = num6;
1836 break;
1837 }
1838 }
1839 else if (num6 != bestX)
1840 {
1841 bestX = num6;
1842 break;
1843 }
1844 }
1845 int num7 = bestX;
1846 int num8 = bestY;
1847 bool flag = false;
1848 if (!flag && !((double)num8 > Main.worldSurface))
1849 {
1850 for (int m = 20; m < 500; m++)
1851 {
1852 for (int n = 0; n < 2; n++)
1853 {
1854 num7 = ((n != 0) ? (bestX - m * 2) : (bestX + m * 2));
1855 if (num7 > 10 && num7 < Main.maxTilesX - 10)
1856 {
1857 int num9 = bestY - m;
1858 double num10 = bestY + m;
1859 if (num9 < 10)
1860 {
1861 num9 = 10;
1862 }
1863 if (num10 > Main.worldSurface)
1864 {
1865 num10 = Main.worldSurface;
1866 }
1867 for (int num11 = num9; (double)num11 < num10; num11++)
1868 {
1869 num8 = num11;
1870 if (!Main.tile[num7, num8].nactive() || !Main.tileSolid[Main.tile[num7, num8].type])
1871 {
1872 continue;
1873 }
1874 if (Main.tile[num7, num8 - 3].liquid != 0 || Main.tile[num7, num8 - 2].liquid != 0 || Main.tile[num7, num8 - 1].liquid != 0 || Collision.SolidTiles(num7 - 1, num7 + 1, num8 - 3, num8 - 1))
1875 {
1876 break;
1877 }
1878 flag = true;
1879 Rectangle value = new Rectangle(num7 * 16 + 8 - NPC.sWidth / 2 - NPC.safeRangeX, num8 * 16 + 8 - NPC.sHeight / 2 - NPC.safeRangeY, NPC.sWidth + NPC.safeRangeX * 2, NPC.sHeight + NPC.safeRangeY * 2);
1880 for (int num12 = 0; num12 < 255; num12++)
1881 {
1882 if (Main.player[num12].active && new Rectangle((int)Main.player[num12].position.X, (int)Main.player[num12].position.Y, Main.player[num12].width, Main.player[num12].height).Intersects(value))
1883 {
1884 flag = false;
1885 break;
1886 }
1887 }
1888 break;
1889 }
1890 }
1891 if (flag)
1892 {
1893 break;
1894 }
1895 }
1896 if (flag)
1897 {
1898 break;
1899 }
1900 }
1901 }
1902 int num13 = NPC.NewNPC(NPC.GetSpawnSourceForTownSpawn(), num7 * 16, num8 * 16, 368, 1);
1903 Main.npc[num13].homeTileX = bestX;
1904 Main.npc[num13].homeTileY = bestY;
1905 Main.npc[num13].homeless = true;
1906 if (num7 < bestX)
1907 {
1908 Main.npc[num13].direction = 1;
1909 }
1910 else if (num7 > bestX)
1911 {
1912 Main.npc[num13].direction = -1;
1913 }
1914 Main.npc[num13].netUpdate = true;
1915 string fullName = Main.npc[num13].FullName;
1916 if (Main.netMode == 0)
1917 {
1918 Main.NewText(Language.GetTextValue("Announcement.HasArrived", fullName), 50, 125);
1919 }
1920 else if (Main.netMode == 2)
1921 {
1922 ChatHelper.BroadcastChatMessage(NetworkText.FromKey("Announcement.HasArrived", Main.npc[num13].GetFullNetName()), new Color(50, 125, 255));
1923 }
1924 }
static void BroadcastChatMessage(NetworkText text, Color color, int excludedPlayer=-1)
Definition ChatHelper.cs:46
static string GetTextValue(string key)
Definition Language.cs:15
static NetworkText FromKey(string key, params object[] substitutions)
static int bestX
Definition WorldGen.cs:1070
static int bestY
Definition WorldGen.cs:1072
bool Intersects(Rectangle value)
Definition Rectangle.cs:129

References System.array, Terraria.WorldGen.bestX, Terraria.WorldGen.bestY, Terraria.Chat.ChatHelper.BroadcastChatMessage(), Terraria.Main.dayTime, Terraria.Main.eclipse, Terraria.Localization.NetworkText.FromKey(), Terraria.NPC.GetSpawnSourceForTownSpawn(), Terraria.Localization.Language.GetTextValue(), Microsoft.Xna.Framework.Rectangle.Intersects(), Terraria.Main.invasionDelay, Terraria.Main.invasionSize, Terraria.Main.invasionType, Terraria.Main.maxTilesX, Terraria.Main.netMode, Terraria.NPC.NewNPC(), Terraria.Main.NewText(), Terraria.Main.npc, Terraria.Main.player, Terraria.Main.rand, Terraria.NPC.safeRangeX, Terraria.NPC.safeRangeY, Terraria.NetMessage.SendTravelShop(), Terraria.Chest.SetupTravelShop(), Terraria.NPC.sHeight, Terraria.Enums.SolidTile, Terraria.Collision.SolidTiles(), Terraria.NPC.sWidth, Terraria.Main.tile, Terraria.Main.tileSolid, Terraria.Main.tileSolidTop, System.value, and Terraria.Main.worldSurface.

Referenced by Terraria.Main.UpdateTime().