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

◆ TupleHitLine()

static bool Terraria.Collision.TupleHitLine ( int x1,
int y1,
int x2,
int y2,
int ignoreX,
int ignoreY,
List< Tuple< int, int > > ignoreTargets,
out Tuple< int, int > col )
inlinestatic

Definition at line 743 of file Collision.cs.

744 {
745 int value = x1;
746 int value2 = y1;
747 int value3 = x2;
748 int value4 = y2;
749 value = Utils.Clamp(value, 1, Main.maxTilesX - 1);
750 value3 = Utils.Clamp(value3, 1, Main.maxTilesX - 1);
751 value2 = Utils.Clamp(value2, 1, Main.maxTilesY - 1);
752 value4 = Utils.Clamp(value4, 1, Main.maxTilesY - 1);
753 float num = Math.Abs(value - value3);
754 float num2 = Math.Abs(value2 - value4);
755 if (num == 0f && num2 == 0f)
756 {
758 return true;
759 }
760 float num3 = 1f;
761 float num4 = 1f;
762 if (num == 0f || num2 == 0f)
763 {
764 if (num == 0f)
765 {
766 num3 = 0f;
767 }
768 if (num2 == 0f)
769 {
770 num4 = 0f;
771 }
772 }
773 else if (num > num2)
774 {
775 num3 = num / num2;
776 }
777 else
778 {
779 num4 = num2 / num;
780 }
781 float num5 = 0f;
782 float num6 = 0f;
783 int num7 = 1;
784 if (value2 < value4)
785 {
786 num7 = 2;
787 }
788 int num8 = (int)num;
789 int num9 = (int)num2;
790 int num10 = Math.Sign(value3 - value);
791 int num11 = Math.Sign(value4 - value2);
792 bool flag = false;
793 bool flag2 = false;
794 try
795 {
796 do
797 {
798 switch (num7)
799 {
800 case 2:
801 {
802 num5 += num3;
803 int num13 = (int)num5;
804 num5 %= 1f;
805 for (int j = 0; j < num13; j++)
806 {
807 if (Main.tile[value, value2 - 1] == null)
808 {
809 col = new Tuple<int, int>(value, value2 - 1);
810 return false;
811 }
812 if (Main.tile[value, value2 + 1] == null)
813 {
814 col = new Tuple<int, int>(value, value2 + 1);
815 return false;
816 }
817 Tile tile4 = Main.tile[value, value2 - 1];
818 Tile tile5 = Main.tile[value, value2 + 1];
819 Tile tile6 = Main.tile[value, value2];
821 {
822 if (ignoreY != -1 && num11 < 0 && !tile4.inActive() && tile4.active() && Main.tileSolid[tile4.type] && !Main.tileSolidTop[tile4.type])
823 {
824 col = new Tuple<int, int>(value, value2 - 1);
825 return true;
826 }
827 if (ignoreY != 1 && num11 > 0 && !tile5.inActive() && tile5.active() && Main.tileSolid[tile5.type] && !Main.tileSolidTop[tile5.type])
828 {
829 col = new Tuple<int, int>(value, value2 + 1);
830 return true;
831 }
832 if (!tile6.inActive() && tile6.active() && Main.tileSolid[tile6.type] && !Main.tileSolidTop[tile6.type])
833 {
835 return true;
836 }
837 }
838 if (num8 == 0 && num9 == 0)
839 {
840 flag = true;
841 break;
842 }
843 value += num10;
844 num8--;
845 if (num8 == 0 && num9 == 0 && num13 == 1)
846 {
847 flag2 = true;
848 }
849 }
850 if (num9 != 0)
851 {
852 num7 = 1;
853 }
854 break;
855 }
856 case 1:
857 {
858 num6 += num4;
859 int num12 = (int)num6;
860 num6 %= 1f;
861 for (int i = 0; i < num12; i++)
862 {
863 if (Main.tile[value - 1, value2] == null)
864 {
865 col = new Tuple<int, int>(value - 1, value2);
866 return false;
867 }
868 if (Main.tile[value + 1, value2] == null)
869 {
870 col = new Tuple<int, int>(value + 1, value2);
871 return false;
872 }
873 Tile tile = Main.tile[value - 1, value2];
874 Tile tile2 = Main.tile[value + 1, value2];
875 Tile tile3 = Main.tile[value, value2];
877 {
878 if (ignoreX != -1 && num10 < 0 && !tile.inActive() && tile.active() && Main.tileSolid[tile.type] && !Main.tileSolidTop[tile.type])
879 {
880 col = new Tuple<int, int>(value - 1, value2);
881 return true;
882 }
883 if (ignoreX != 1 && num10 > 0 && !tile2.inActive() && tile2.active() && Main.tileSolid[tile2.type] && !Main.tileSolidTop[tile2.type])
884 {
885 col = new Tuple<int, int>(value + 1, value2);
886 return true;
887 }
888 if (!tile3.inActive() && tile3.active() && Main.tileSolid[tile3.type] && !Main.tileSolidTop[tile3.type])
889 {
891 return true;
892 }
893 }
894 if (num8 == 0 && num9 == 0)
895 {
896 flag = true;
897 break;
898 }
899 value2 += num11;
900 num9--;
901 if (num8 == 0 && num9 == 0 && num12 == 1)
902 {
903 flag2 = true;
904 }
905 }
906 if (num8 != 0)
907 {
908 num7 = 2;
909 }
910 break;
911 }
912 }
913 if (Main.tile[value, value2] == null)
914 {
916 return false;
917 }
918 Tile tile7 = Main.tile[value, value2];
919 if (!ignoreTargets.Contains(new Tuple<int, int>(value, value2)) && !tile7.inActive() && tile7.active() && Main.tileSolid[tile7.type] && !Main.tileSolidTop[tile7.type])
920 {
922 return true;
923 }
924 }
925 while (!(flag || flag2));
927 return true;
928 }
929 catch
930 {
931 col = new Tuple<int, int>(x1, y1);
932 return false;
933 }
934 }
bool ICollection< KeyValuePair< TKey, TValue > >. Contains(KeyValuePair< TKey, TValue > keyValuePair)
static double Abs(double value)
static int Sign(decimal value)
Definition Math.cs:1202

References System.Math.Abs(), Terraria.Tile.active(), System.Collections.Generic.Dictionary< TKey, TValue >.Contains(), Terraria.Tile.inActive(), Terraria.Main.maxTilesX, Terraria.Main.maxTilesY, System.Math.Sign(), Terraria.Main.tile, Terraria.Main.tileSolid, Terraria.Main.tileSolidTop, Terraria.Tile.type, and System.value.

Referenced by Terraria.Collision.LaserScan(), and Terraria.GameContent.SmartCursorHelper.Step_Pickaxe_MineSolids().