TModLoader v1.4.4.9
TModLoader 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 1011 of file Collision.cs.

1012 {
1013 int value = x1;
1014 int value2 = y1;
1015 int value3 = x2;
1016 int value4 = y2;
1017 value = Utils.Clamp(value, 1, Main.maxTilesX - 1);
1018 value3 = Utils.Clamp(value3, 1, Main.maxTilesX - 1);
1019 value2 = Utils.Clamp(value2, 1, Main.maxTilesY - 1);
1020 value4 = Utils.Clamp(value4, 1, Main.maxTilesY - 1);
1021 float num = Math.Abs(value - value3);
1022 float num6 = Math.Abs(value2 - value4);
1023 if (num == 0f && num6 == 0f)
1024 {
1025 col = new Tuple<int, int>(value, value2);
1026 return true;
1027 }
1028 float num7 = 1f;
1029 float num8 = 1f;
1030 if (num == 0f || num6 == 0f)
1031 {
1032 if (num == 0f)
1033 {
1034 num7 = 0f;
1035 }
1036 if (num6 == 0f)
1037 {
1038 num8 = 0f;
1039 }
1040 }
1041 else if (num > num6)
1042 {
1043 num7 = num / num6;
1044 }
1045 else
1046 {
1047 num8 = num6 / num;
1048 }
1049 float num9 = 0f;
1050 float num10 = 0f;
1051 int num11 = 1;
1052 if (value2 < value4)
1053 {
1054 num11 = 2;
1055 }
1056 int num12 = (int)num;
1057 int num13 = (int)num6;
1058 int num2 = Math.Sign(value3 - value);
1059 int num3 = Math.Sign(value4 - value2);
1060 bool flag = false;
1061 bool flag2 = false;
1062 try
1063 {
1064 do
1065 {
1066 switch (num11)
1067 {
1068 case 2:
1069 {
1070 num9 += num7;
1071 int num5 = (int)num9;
1072 num9 %= 1f;
1073 for (int j = 0; j < num5; j++)
1074 {
1075 if (Main.tile[value, value2 - 1] == null)
1076 {
1077 col = new Tuple<int, int>(value, value2 - 1);
1078 return false;
1079 }
1080 if (Main.tile[value, value2 + 1] == null)
1081 {
1082 col = new Tuple<int, int>(value, value2 + 1);
1083 return false;
1084 }
1085 Tile tile4 = Main.tile[value, value2 - 1];
1086 Tile tile5 = Main.tile[value, value2 + 1];
1087 Tile tile6 = Main.tile[value, value2];
1088 if (!ignoreTargets.Contains(new Tuple<int, int>(value, value2)) && !ignoreTargets.Contains(new Tuple<int, int>(value, value2 - 1)) && !ignoreTargets.Contains(new Tuple<int, int>(value, value2 + 1)))
1089 {
1090 if (ignoreY != -1 && num3 < 0 && !tile4.inActive() && tile4.active() && Main.tileSolid[tile4.type] && !Main.tileSolidTop[tile4.type])
1091 {
1092 col = new Tuple<int, int>(value, value2 - 1);
1093 return true;
1094 }
1095 if (ignoreY != 1 && num3 > 0 && !tile5.inActive() && tile5.active() && Main.tileSolid[tile5.type] && !Main.tileSolidTop[tile5.type])
1096 {
1097 col = new Tuple<int, int>(value, value2 + 1);
1098 return true;
1099 }
1100 if (!tile6.inActive() && tile6.active() && Main.tileSolid[tile6.type] && !Main.tileSolidTop[tile6.type])
1101 {
1102 col = new Tuple<int, int>(value, value2);
1103 return true;
1104 }
1105 }
1106 if (num12 == 0 && num13 == 0)
1107 {
1108 flag = true;
1109 break;
1110 }
1111 value += num2;
1112 num12--;
1113 if (num12 == 0 && num13 == 0 && num5 == 1)
1114 {
1115 flag2 = true;
1116 }
1117 }
1118 if (num13 != 0)
1119 {
1120 num11 = 1;
1121 }
1122 break;
1123 }
1124 case 1:
1125 {
1126 num10 += num8;
1127 int num4 = (int)num10;
1128 num10 %= 1f;
1129 for (int i = 0; i < num4; i++)
1130 {
1131 if (Main.tile[value - 1, value2] == null)
1132 {
1133 col = new Tuple<int, int>(value - 1, value2);
1134 return false;
1135 }
1136 if (Main.tile[value + 1, value2] == null)
1137 {
1138 col = new Tuple<int, int>(value + 1, value2);
1139 return false;
1140 }
1141 Tile tile = Main.tile[value - 1, value2];
1142 Tile tile2 = Main.tile[value + 1, value2];
1143 Tile tile3 = Main.tile[value, value2];
1144 if (!ignoreTargets.Contains(new Tuple<int, int>(value, value2)) && !ignoreTargets.Contains(new Tuple<int, int>(value - 1, value2)) && !ignoreTargets.Contains(new Tuple<int, int>(value + 1, value2)))
1145 {
1146 if (ignoreX != -1 && num2 < 0 && !tile.inActive() && tile.active() && Main.tileSolid[tile.type] && !Main.tileSolidTop[tile.type])
1147 {
1148 col = new Tuple<int, int>(value - 1, value2);
1149 return true;
1150 }
1151 if (ignoreX != 1 && num2 > 0 && !tile2.inActive() && tile2.active() && Main.tileSolid[tile2.type] && !Main.tileSolidTop[tile2.type])
1152 {
1153 col = new Tuple<int, int>(value + 1, value2);
1154 return true;
1155 }
1156 if (!tile3.inActive() && tile3.active() && Main.tileSolid[tile3.type] && !Main.tileSolidTop[tile3.type])
1157 {
1158 col = new Tuple<int, int>(value, value2);
1159 return true;
1160 }
1161 }
1162 if (num12 == 0 && num13 == 0)
1163 {
1164 flag = true;
1165 break;
1166 }
1167 value2 += num3;
1168 num13--;
1169 if (num12 == 0 && num13 == 0 && num4 == 1)
1170 {
1171 flag2 = true;
1172 }
1173 }
1174 if (num12 != 0)
1175 {
1176 num11 = 2;
1177 }
1178 break;
1179 }
1180 }
1181 if (Main.tile[value, value2] == null)
1182 {
1183 col = new Tuple<int, int>(value, value2);
1184 return false;
1185 }
1186 Tile tile7 = Main.tile[value, value2];
1187 if (!ignoreTargets.Contains(new Tuple<int, int>(value, value2)) && !tile7.inActive() && tile7.active() && Main.tileSolid[tile7.type] && !Main.tileSolidTop[tile7.type])
1188 {
1189 col = new Tuple<int, int>(value, value2);
1190 return true;
1191 }
1192 }
1193 while (!(flag || flag2));
1194 col = new Tuple<int, int>(value, value2);
1195 return true;
1196 }
1197 catch
1198 {
1199 col = new Tuple<int, int>(x1, y1);
1200 return false;
1201 }
1202 }

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

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

+ Here is the call graph for this function:
+ Here is the caller graph for this function: