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

◆ SpawnOnPlayer()

static void Terraria.NPC.SpawnOnPlayer ( int plr,
int Type )
inlinestatic

Definition at line 77311 of file NPC.cs.

77312 {
77313 if (Main.netMode == 1 || (Type == 262 && AnyNPCs(262)))
77314 {
77315 return;
77316 }
77317 switch (Type)
77318 {
77319 case 245:
77320 if (AnyNPCs(245))
77321 {
77322 return;
77323 }
77324 try
77325 {
77326 int num2 = (int)Main.player[plr].Center.X / 16;
77327 int num3 = (int)Main.player[plr].Center.Y / 16;
77328 int num4 = 0;
77329 int num5 = 0;
77330 for (int j = num2 - 20; j < num2 + 20; j++)
77331 {
77332 for (int k = num3 - 20; k < num3 + 20; k++)
77333 {
77334 if (Main.tile[j, k].active() && Main.tile[j, k].type == 237 && Main.tile[j, k].frameX == 18 && Main.tile[j, k].frameY == 0)
77335 {
77336 num4 = j;
77337 num5 = k;
77338 }
77339 }
77340 }
77341 if (num4 <= 0 || num5 <= 0)
77342 {
77343 return;
77344 }
77345 int num6 = num5 - 15;
77346 int num7 = num5 - 15;
77347 for (int num8 = num5; num8 > num5 - 50; num8--)
77348 {
77349 if (WorldGen.SolidTile(num4, num8))
77350 {
77351 num6 = num8;
77352 break;
77353 }
77354 }
77355 for (int l = num5; l < num5 + 50; l++)
77356 {
77357 if (WorldGen.SolidTile(num4, l))
77358 {
77359 num7 = l;
77360 break;
77361 }
77362 }
77363 num5 = (num6 + num6 + num7) / 3;
77364 int num9 = NewNPC(GetBossSpawnSource(plr), num4 * 16 + 8, num5 * 16, 245);
77365 Main.npc[num9].target = plr;
77366 string typeName2 = Main.npc[num9].TypeName;
77367 if (Main.netMode == 0)
77368 {
77369 Main.NewText(Language.GetTextValue("Announcement.HasAwoken", typeName2), 175, 75);
77370 }
77371 else if (Main.netMode == 2)
77372 {
77373 ChatHelper.BroadcastChatMessage(NetworkText.FromKey("Announcement.HasAwoken", Main.npc[num9].GetTypeNetName()), new Color(175, 75, 255));
77374 }
77375 return;
77376 }
77377 catch
77378 {
77379 return;
77380 }
77381 case 370:
77382 {
77383 Player player2 = Main.player[plr];
77384 if (!player2.active || player2.dead)
77385 {
77386 return;
77387 }
77388 for (int i = 0; i < 1000; i++)
77389 {
77390 Projectile projectile = Main.projectile[i];
77391 if (projectile.active && projectile.bobber && projectile.owner == plr)
77392 {
77393 int num = NewNPC(GetBossSpawnSource(plr), (int)projectile.Center.X, (int)projectile.Center.Y + 100, 370);
77394 string typeName = Main.npc[num].TypeName;
77395 if (Main.netMode == 0)
77396 {
77397 Main.NewText(Language.GetTextValue("Announcement.HasAwoken", typeName), 175, 75);
77398 }
77399 else if (Main.netMode == 2)
77400 {
77401 ChatHelper.BroadcastChatMessage(NetworkText.FromKey("Announcement.HasAwoken", Main.npc[num].GetTypeNetName()), new Color(175, 75, 255));
77402 }
77403 break;
77404 }
77405 }
77406 return;
77407 }
77408 case 398:
77409 if (!AnyNPCs(Type))
77410 {
77411 Player player = Main.player[plr];
77412 NewNPC(GetBossSpawnSource(plr), (int)player.Center.X, (int)player.Center.Y - 150, Type);
77413 if (Main.netMode == 0)
77414 {
77415 Main.NewText(Language.GetTextValue("Announcement.HasAwoken", Language.GetTextValue("Enemies.MoonLord")), 175, 75);
77416 }
77417 else if (Main.netMode == 2)
77418 {
77419 ChatHelper.BroadcastChatMessage(NetworkText.FromKey("Announcement.HasAwoken", NetworkText.FromKey("Enemies.MoonLord")), new Color(175, 75, 255));
77420 }
77421 }
77422 return;
77423 }
77424 bool flag = false;
77425 int num10 = 0;
77426 int num11 = 0;
77427 int num12 = (int)(Main.player[plr].position.X / 16f) - spawnRangeX * 2;
77428 int num13 = (int)(Main.player[plr].position.X / 16f) + spawnRangeX * 2;
77429 int num14 = (int)(Main.player[plr].position.Y / 16f) - spawnRangeY * 2;
77430 int num15 = (int)(Main.player[plr].position.Y / 16f) + spawnRangeY * 2;
77431 int num16 = (int)(Main.player[plr].position.X / 16f) - safeRangeX;
77432 int num17 = (int)(Main.player[plr].position.X / 16f) + safeRangeX;
77433 int num18 = (int)(Main.player[plr].position.Y / 16f) - safeRangeY;
77434 int num19 = (int)(Main.player[plr].position.Y / 16f) + safeRangeY;
77435 if (num12 < 0)
77436 {
77437 num12 = 0;
77438 }
77439 if (num13 > Main.maxTilesX)
77440 {
77441 num13 = Main.maxTilesX;
77442 }
77443 if (num14 < 0)
77444 {
77445 num14 = 0;
77446 }
77447 if (num15 > Main.maxTilesY)
77448 {
77449 num15 = Main.maxTilesY;
77450 }
77451 for (int m = 0; m < 1000; m++)
77452 {
77453 for (int n = 0; n < 100; n++)
77454 {
77455 int num20 = Main.rand.Next(num12, num13);
77456 int num21 = Main.rand.Next(num14, num15);
77457 if (!Main.tile[num20, num21].nactive() || !Main.tileSolid[Main.tile[num20, num21].type])
77458 {
77459 if ((Main.wallHouse[Main.tile[num20, num21].wall] && m < 999) || (Type == 50 && m < 500 && Main.tile[num21, num21].wall > 0))
77460 {
77461 continue;
77462 }
77463 for (int num22 = num21; num22 < Main.maxTilesY; num22++)
77464 {
77465 if (Main.tile[num20, num22].nactive() && Main.tileSolid[Main.tile[num20, num22].type])
77466 {
77468 {
77469 _ = Main.tile[num20, num22].type;
77470 num10 = num20;
77471 num11 = num22;
77472 flag = true;
77473 }
77474 break;
77475 }
77476 }
77477 if (flag && Type == 50 && m < 900)
77478 {
77479 int num23 = 20;
77480 if (!Collision.CanHit(new Vector2(num10, num11 - 1) * 16f, 16, 16, new Vector2(num10, num11 - 1 - num23) * 16f, 16, 16) || !Collision.CanHit(new Vector2(num10, num11 - 1 - num23) * 16f, 16, 16, Main.player[plr].Center, 0, 0))
77481 {
77482 num10 = 0;
77483 num11 = 0;
77484 flag = false;
77485 }
77486 }
77487 if (flag && m < 999)
77488 {
77489 int num24 = num10 - spawnSpaceX / 2;
77490 int num25 = num10 + spawnSpaceX / 2;
77491 int num26 = num11 - spawnSpaceY;
77492 int num27 = num11;
77493 if (num24 < 0)
77494 {
77495 flag = false;
77496 }
77497 if (num25 > Main.maxTilesX)
77498 {
77499 flag = false;
77500 }
77501 if (num26 < 0)
77502 {
77503 flag = false;
77504 }
77505 if (num27 > Main.maxTilesY)
77506 {
77507 flag = false;
77508 }
77509 if (flag)
77510 {
77511 for (int num28 = num24; num28 < num25; num28++)
77512 {
77513 for (int num29 = num26; num29 < num27; num29++)
77514 {
77515 if (Main.tile[num28, num29].nactive() && Main.tileSolid[Main.tile[num28, num29].type])
77516 {
77517 flag = false;
77518 break;
77519 }
77520 }
77521 }
77522 }
77523 }
77524 }
77525 if (flag || flag)
77526 {
77527 break;
77528 }
77529 }
77530 if (flag && m < 999)
77531 {
77532 Rectangle rectangle = new Rectangle(num10 * 16, num11 * 16, 16, 16);
77533 for (int num30 = 0; num30 < 255; num30++)
77534 {
77535 if (Main.player[num30].active)
77536 {
77537 Rectangle rectangle2 = new Rectangle((int)(Main.player[num30].position.X + (float)(Main.player[num30].width / 2) - (float)(sWidth / 2) - (float)safeRangeX), (int)(Main.player[num30].position.Y + (float)(Main.player[num30].height / 2) - (float)(sHeight / 2) - (float)safeRangeY), sWidth + safeRangeX * 2, sHeight + safeRangeY * 2);
77538 if (rectangle.Intersects(rectangle2))
77539 {
77540 flag = false;
77541 }
77542 }
77543 }
77544 }
77545 if (flag)
77546 {
77547 break;
77548 }
77549 }
77550 if (flag)
77551 {
77552 int spawnPositionX = num10 * 16 + 8;
77553 int spawnPositionY = num11 * 16;
77555 }
77556 }
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 spawnRangeY
Definition NPC.cs:183
static void SpawnBoss(int spawnPositionX, int spawnPositionY, int Type, int targetPlayerIndex)
Definition NPC.cs:77584
static int safeRangeY
Definition NPC.cs:187
static int spawnSpaceX
Definition NPC.cs:121
static int spawnRangeX
Definition NPC.cs:181
static int sWidth
Definition NPC.cs:177
static bool AnyNPCs(int Type)
Definition NPC.cs:86689
static int safeRangeX
Definition NPC.cs:185
static int NewNPC(IEntitySource source, int X, int Y, int Type, int Start=0, float ai0=0f, float ai1=0f, float ai2=0f, float ai3=0f, int Target=255)
Definition NPC.cs:77654
static IEntitySource GetBossSpawnSource(int targetPlayerIndex)
Definition NPC.cs:77579
static int spawnSpaceY
Definition NPC.cs:123
static int sHeight
Definition NPC.cs:179

References Terraria.Entity.active, Terraria.Projectile.bobber, Terraria.Chat.ChatHelper.BroadcastChatMessage(), Terraria.Collision.CanHit(), Terraria.Entity.Center, Terraria.Localization.NetworkText.FromKey(), Terraria.Localization.Language.GetTextValue(), Terraria.Main.maxTilesX, Terraria.Main.maxTilesY, Terraria.Main.netMode, Terraria.Main.NewText(), Terraria.Main.npc, Terraria.Projectile.owner, Terraria.Main.player, Terraria.Main.projectile, Terraria.Main.rand, Terraria.WorldGen.SolidTile(), Terraria.Main.tile, Terraria.Main.tileSolid, Microsoft.Xna.Framework.Graphics.Vector2, Terraria.Main.wallHouse, Microsoft.Xna.Framework.Vector2.X, and Microsoft.Xna.Framework.Vector2.Y.

Referenced by Terraria.WorldGen.Check3x3(), Terraria.WorldGen.CheckJunglePlant(), Terraria.WorldGen.CheckOrb(), Terraria.WorldGen.CheckSign(), Terraria.NPC.DoDeathEvents(), Terraria.NPC.DoDeathEvents_AdvanceSlimeRain(), Terraria.MessageBuffer.GetData(), Terraria.Player.ItemCheck_CheckFishingBobber_PullBobber(), Terraria.Player.ItemCheck_UseBossSpawners(), Terraria.WorldGen.SmashAltar(), Terraria.NPC.SpawnMechQueen(), Terraria.GameContent.Events.DD2Event.SummonBetsy(), Terraria.Player.TileInteractionsUse(), and Terraria.Main.UpdateTime().