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

◆ CanHitLine()

static bool Terraria.Collision.CanHitLine ( Vector2 Position1,
int Width1,
int Height1,
Vector2 Position2,
int Width2,
int Height2 )
inlinestatic

Definition at line 551 of file Collision.cs.

552 {
553 int num = (int)((Position1.X + (float)(Width1 / 2)) / 16f);
554 int num2 = (int)((Position1.Y + (float)(Height1 / 2)) / 16f);
555 int num3 = (int)((Position2.X + (float)(Width2 / 2)) / 16f);
556 int num4 = (int)((Position2.Y + (float)(Height2 / 2)) / 16f);
557 if (num <= 1)
558 {
559 num = 1;
560 }
561 if (num >= Main.maxTilesX)
562 {
563 num = Main.maxTilesX - 1;
564 }
565 if (num3 <= 1)
566 {
567 num3 = 1;
568 }
569 if (num3 >= Main.maxTilesX)
570 {
571 num3 = Main.maxTilesX - 1;
572 }
573 if (num2 <= 1)
574 {
575 num2 = 1;
576 }
577 if (num2 >= Main.maxTilesY)
578 {
579 num2 = Main.maxTilesY - 1;
580 }
581 if (num4 <= 1)
582 {
583 num4 = 1;
584 }
585 if (num4 >= Main.maxTilesY)
586 {
587 num4 = Main.maxTilesY - 1;
588 }
589 float num5 = Math.Abs(num - num3);
590 float num6 = Math.Abs(num2 - num4);
591 if (num5 == 0f && num6 == 0f)
592 {
593 return true;
594 }
595 float num7 = 1f;
596 float num8 = 1f;
597 if (num5 == 0f || num6 == 0f)
598 {
599 if (num5 == 0f)
600 {
601 num7 = 0f;
602 }
603 if (num6 == 0f)
604 {
605 num8 = 0f;
606 }
607 }
608 else if (num5 > num6)
609 {
610 num7 = num5 / num6;
611 }
612 else
613 {
614 num8 = num6 / num5;
615 }
616 float num9 = 0f;
617 float num10 = 0f;
618 int num11 = 1;
619 if (num2 < num4)
620 {
621 num11 = 2;
622 }
623 int num12 = (int)num5;
624 int num13 = (int)num6;
625 int num14 = Math.Sign(num3 - num);
626 int num15 = Math.Sign(num4 - num2);
627 bool flag = false;
628 bool flag2 = false;
629 try
630 {
631 do
632 {
633 switch (num11)
634 {
635 case 2:
636 {
637 num9 += num7;
638 int num17 = (int)num9;
639 num9 %= 1f;
640 for (int j = 0; j < num17; j++)
641 {
642 if (Main.tile[num, num2 - 1] == null)
643 {
644 return false;
645 }
646 if (Main.tile[num, num2] == null)
647 {
648 return false;
649 }
650 if (Main.tile[num, num2 + 1] == null)
651 {
652 return false;
653 }
654 Tile tile4 = Main.tile[num, num2 - 1];
655 Tile tile5 = Main.tile[num, num2 + 1];
656 Tile tile6 = Main.tile[num, num2];
657 if ((!tile4.inActive() && tile4.active() && Main.tileSolid[tile4.type] && !Main.tileSolidTop[tile4.type]) || (!tile5.inActive() && tile5.active() && Main.tileSolid[tile5.type] && !Main.tileSolidTop[tile5.type]) || (!tile6.inActive() && tile6.active() && Main.tileSolid[tile6.type] && !Main.tileSolidTop[tile6.type]))
658 {
659 return false;
660 }
661 if (num12 == 0 && num13 == 0)
662 {
663 flag = true;
664 break;
665 }
666 num += num14;
667 num12--;
668 if (num12 == 0 && num13 == 0 && num17 == 1)
669 {
670 flag2 = true;
671 }
672 }
673 if (num13 != 0)
674 {
675 num11 = 1;
676 }
677 break;
678 }
679 case 1:
680 {
681 num10 += num8;
682 int num16 = (int)num10;
683 num10 %= 1f;
684 for (int i = 0; i < num16; i++)
685 {
686 if (Main.tile[num - 1, num2] == null)
687 {
688 return false;
689 }
690 if (Main.tile[num, num2] == null)
691 {
692 return false;
693 }
694 if (Main.tile[num + 1, num2] == null)
695 {
696 return false;
697 }
698 Tile tile = Main.tile[num - 1, num2];
699 Tile tile2 = Main.tile[num + 1, num2];
700 Tile tile3 = Main.tile[num, num2];
701 if ((!tile.inActive() && tile.active() && Main.tileSolid[tile.type] && !Main.tileSolidTop[tile.type]) || (!tile2.inActive() && tile2.active() && Main.tileSolid[tile2.type] && !Main.tileSolidTop[tile2.type]) || (!tile3.inActive() && tile3.active() && Main.tileSolid[tile3.type] && !Main.tileSolidTop[tile3.type]))
702 {
703 return false;
704 }
705 if (num12 == 0 && num13 == 0)
706 {
707 flag = true;
708 break;
709 }
710 num2 += num15;
711 num13--;
712 if (num12 == 0 && num13 == 0 && num16 == 1)
713 {
714 flag2 = true;
715 }
716 }
717 if (num12 != 0)
718 {
719 num11 = 2;
720 }
721 break;
722 }
723 }
724 if (Main.tile[num, num2] == null)
725 {
726 return false;
727 }
728 Tile tile7 = Main.tile[num, num2];
729 if (!tile7.inActive() && tile7.active() && Main.tileSolid[tile7.type] && !Main.tileSolidTop[tile7.type])
730 {
731 return false;
732 }
733 }
734 while (!(flag || flag2));
735 return true;
736 }
737 catch
738 {
739 return false;
740 }
741 }
static double Abs(double value)
static int Sign(decimal value)
Definition Math.cs:1202

References System.Math.Abs(), Terraria.Tile.active(), Terraria.Tile.inActive(), Terraria.Main.maxTilesX, Terraria.Main.maxTilesY, System.Math.Sign(), Terraria.Main.tile, Terraria.Main.tileSolid, Terraria.Main.tileSolidTop, and Terraria.Tile.type.

Referenced by Terraria.NPC.AI(), Terraria.Projectile.AI_001(), Terraria.NPC.AI_003_Fighters(), Terraria.NPC.AI_006_Worms(), Terraria.NPC.AI_007_TownEntities(), Terraria.Projectile.AI_026(), Terraria.Projectile.AI_062(), Terraria.Projectile.AI_100_Medusa(), Terraria.NPC.AI_107_ImprovedWalkers(), Terraria.NPC.AI_109_DarkMage(), Terraria.NPC.AI_121_QueenSlime(), Terraria.Projectile.AI_130_FlameBurstTower_FindTarget(), Terraria.Projectile.AI_134_Ballista_FindTarget(), Terraria.Projectile.AI_137_CanHit(), Terraria.NPC.BloodNautilus_CallForHelp(), Terraria.Player.CanHit(), Terraria.Projectile.CanHitWithMeleeWeapon(), Terraria.Projectile.CanHitWithOwnBody(), Terraria.Mount.CastSuperCartLaser(), Terraria.GameContent.UI.EmoteBubble.CheckForNPCsToReactToEmoteBubble(), Terraria.Projectile.Colliding(), Terraria.Projectile.Damage(), Terraria.Projectile.FindTargetWithinRange(), Terraria.Player.GetFarthestSpawnPositionOnLine(), Terraria.WorldGen.GrowMoreVines(), Terraria.Projectile.HandleMovement(), Terraria.NPC.HitEffect(), Terraria.Player.ItemCheck_Shoot(), Terraria.Projectile.Kill(), Terraria.Player.QuickMinecart(), Terraria.Player.QuickMinecartSnap(), Terraria.Player.SpawnHallucination(), Terraria.GameInput.LockOnHelper.Update(), and Terraria.Mount.UpdateEffects().