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

◆ ProvideCandidate()

bool Terraria.GameContent.ObjectInteractions.TileSmartInteractCandidateProvider.ProvideCandidate ( SmartInteractScanSettings settings,
out ISmartInteractCandidate candidate )
inline

Implements Terraria.GameContent.ObjectInteractions.ISmartInteractCandidateProvider.

Definition at line 75 of file TileSmartInteractCandidateProvider.cs.

76 {
77 candidate = null;
78 Point point = settings.mousevec.ToTileCoordinates();
80 int num = -1;
81 int num2 = -1;
82 int num3 = -1;
83 int num4 = -1;
84 if (targets.Count > 0)
85 {
86 float num5 = -1f;
88 for (int i = 0; i < targets.Count; i++)
89 {
90 float num6 = Vector2.Distance(new Vector2(targets[i].Item1, targets[i].Item2) * 16f + Vector2.One * 8f, settings.mousevec);
91 if (num5 == -1f || num6 <= num5)
92 {
93 num5 = num6;
94 tuple = targets[i];
95 }
96 }
97 if (Collision.InTileBounds(tuple.Item1, tuple.Item2, settings.LX, settings.LY, settings.HX, settings.HY))
98 {
99 num = tuple.Item1;
100 num2 = tuple.Item2;
101 }
102 }
103 bool flag = false;
104 for (int j = 0; j < targets.Count; j++)
105 {
106 int item = targets[j].Item1;
107 int item2 = targets[j].Item2;
108 Tile tile = Main.tile[item, item2];
109 int num7 = 0;
110 int num8 = 0;
111 int num9 = 18;
112 int num10 = 18;
113 int num11 = 2;
114 switch (tile.type)
115 {
116 case 136:
117 case 144:
118 case 494:
119 num7 = 1;
120 num8 = 1;
121 num11 = 0;
122 break;
123 case 216:
124 case 338:
125 num7 = 1;
126 num8 = 2;
127 break;
128 case 15:
129 case 497:
130 num7 = 1;
131 num8 = 2;
132 num11 = 4;
133 break;
134 case 10:
135 num7 = 1;
136 num8 = 3;
137 num11 = 0;
138 break;
139 case 388:
140 case 389:
141 num7 = 1;
142 num8 = 5;
143 break;
144 case 29:
145 case 387:
146 num7 = 2;
147 num8 = 1;
148 break;
149 case 21:
150 case 55:
151 case 85:
152 case 97:
153 case 125:
154 case 132:
155 case 287:
156 case 335:
157 case 386:
158 case 411:
159 case 425:
160 case 441:
161 case 467:
162 case 468:
163 case 573:
164 case 621:
165 num7 = 2;
166 num8 = 2;
167 break;
168 case 79:
169 case 139:
170 case 510:
171 case 511:
172 num7 = 2;
173 num8 = 2;
174 num11 = 0;
175 break;
176 case 11:
177 case 356:
178 case 410:
179 case 470:
180 case 480:
181 case 509:
182 case 657:
183 case 658:
184 case 663:
185 num7 = 2;
186 num8 = 3;
187 num11 = 0;
188 break;
189 case 207:
190 num7 = 2;
191 num8 = 4;
192 num11 = 0;
193 break;
194 case 104:
195 num7 = 2;
196 num8 = 5;
197 break;
198 case 88:
199 num7 = 3;
200 num8 = 1;
201 num11 = 0;
202 break;
203 case 89:
204 case 215:
205 case 237:
206 case 377:
207 num7 = 3;
208 num8 = 2;
209 break;
210 case 354:
211 case 455:
212 case 491:
213 num7 = 3;
214 num8 = 3;
215 num11 = 0;
216 break;
217 case 487:
218 num7 = 4;
219 num8 = 2;
220 num11 = 0;
221 break;
222 case 212:
223 num7 = 4;
224 num8 = 3;
225 break;
226 case 209:
227 num7 = 4;
228 num8 = 3;
229 num11 = 0;
230 break;
231 case 102:
232 case 463:
233 case 475:
234 case 597:
235 num7 = 3;
236 num8 = 4;
237 break;
238 case 464:
239 num7 = 5;
240 num8 = 4;
241 break;
242 }
243 if (num7 == 0 || num8 == 0)
244 {
245 continue;
246 }
247 int num12 = item - tile.frameX % (num9 * num7) / num9;
248 int num13 = item2 - tile.frameY % (num10 * num8 + num11) / num10;
249 bool flag2 = Collision.InTileBounds(num, num2, num12, num13, num12 + num7 - 1, num13 + num8 - 1);
250 bool flag3 = Collision.InTileBounds(point.X, point.Y, num12, num13, num12 + num7 - 1, num13 + num8 - 1);
251 if (flag3)
252 {
253 num3 = point.X;
254 num4 = point.Y;
255 }
256 if (!settings.FullInteraction)
257 {
258 flag2 = flag2 && flag3;
259 }
260 if (flag)
261 {
262 flag2 = false;
263 }
264 for (int k = num12; k < num12 + num7; k++)
265 {
266 for (int l = num13; l < num13 + num8; l++)
267 {
268 Point item3 = new Point(k, l);
269 if (!Main.SmartInteractTileCoords.Contains(item3))
270 {
271 if (flag2)
272 {
273 Main.SmartInteractTileCoordsSelected.Add(item3);
274 }
275 if (flag2 || settings.FullInteraction)
276 {
277 Main.SmartInteractTileCoords.Add(item3);
278 }
279 }
280 }
281 }
282 if (!flag && flag2)
283 {
284 flag = true;
285 }
286 }
287 if (settings.DemandOnlyZeroDistanceTargets)
288 {
289 if (num3 != -1 && num4 != -1)
290 {
291 _candidate.Reuse(strictSettings: true, 0f, num3, num4, settings.LX - 10, settings.LY - 10, settings.HX + 10, settings.HY + 10);
293 return true;
294 }
295 return false;
296 }
297 if (num != -1 && num2 != -1)
298 {
299 float distanceFromCursor = new Rectangle(num * 16, num2 * 16, 16, 16).ClosestPointInRect(settings.mousevec).Distance(settings.mousevec);
300 _candidate.Reuse(strictSettings: false, distanceFromCursor, num, num2, settings.LX - 10, settings.LY - 10, settings.HX + 10, settings.HY + 10);
302 return true;
303 }
304 return false;
305 }
void Reuse(bool strictSettings, float distanceFromCursor, int AimedX, int AimedY, int LX, int LY, int HX, int HY)
static float Distance(Vector2 value1, Vector2 value2)
Definition Vector2.cs:91

References Terraria.GameContent.ObjectInteractions.TileSmartInteractCandidateProvider._candidate, System.Collections.Generic.List< T >.Count, Terraria.GameContent.ObjectInteractions.SmartInteractScanSettings.DemandOnlyZeroDistanceTargets, Microsoft.Xna.Framework.Vector2.Distance(), Terraria.GameContent.ObjectInteractions.TileSmartInteractCandidateProvider.FillPotentialTargetTiles(), Terraria.GameContent.ObjectInteractions.SmartInteractScanSettings.FullInteraction, Terraria.GameContent.ObjectInteractions.SmartInteractScanSettings.HX, Terraria.GameContent.ObjectInteractions.SmartInteractScanSettings.HY, Terraria.Collision.InTileBounds(), System.item, Terraria.GameContent.ObjectInteractions.SmartInteractScanSettings.LX, Terraria.GameContent.ObjectInteractions.SmartInteractScanSettings.LY, Terraria.GameContent.ObjectInteractions.SmartInteractScanSettings.mousevec, Microsoft.Xna.Framework.Vector2.One, Terraria.GameContent.ObjectInteractions.TileSmartInteractCandidateProvider.ReusableCandidate.Reuse(), Terraria.Main.SmartInteractTileCoords, Terraria.Main.SmartInteractTileCoordsSelected, Terraria.GameContent.ObjectInteractions.TileSmartInteractCandidateProvider.targets, Terraria.Main.tile, Terraria.Tile.type, Microsoft.Xna.Framework.Point.X, and Microsoft.Xna.Framework.Point.Y.