Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
Minecart.cs
Go to the documentation of this file.
1using System;
4
5namespace Terraria;
6
7public static class Minecart
8{
9 private enum TrackState
10 {
11 NoTrack = -1,
13 OnTrack,
17 OnFront,
18 OnBack
19 }
20
21 private const int TotalFrames = 36;
22
23 public const int LeftDownDecoration = 36;
24
25 public const int RightDownDecoration = 37;
26
27 public const int BouncyBumperDecoration = 38;
28
29 public const int RegularBumperDecoration = 39;
30
31 public const int Flag_OnTrack = 0;
32
33 public const int Flag_BouncyBumper = 1;
34
35 public const int Flag_UsedRamp = 2;
36
37 public const int Flag_HitSwitch = 3;
38
39 public const int Flag_BoostLeft = 4;
40
41 public const int Flag_BoostRight = 5;
42
43 private const int NoConnection = -1;
44
45 private const int TopConnection = 0;
46
47 private const int MiddleConnection = 1;
48
49 private const int BottomConnection = 2;
50
51 private const int BumperEnd = -1;
52
53 private const int BouncyEnd = -2;
54
55 private const int RampEnd = -3;
56
57 private const int OpenEnd = -4;
58
59 public const float BoosterSpeed = 4f;
60
61 private const int Type_Normal = 0;
62
63 private const int Type_Pressure = 1;
64
65 private const int Type_Booster = 2;
66
67 private static Vector2 _trackMagnetOffset = new Vector2(25f, 26f);
68
69 private const float MinecartTextureWidth = 50f;
70
71 private static int[] _leftSideConnection;
72
73 private static int[] _rightSideConnection;
74
75 private static int[] _trackType;
76
77 private static bool[] _boostLeft;
78
79 private static Vector2[] _texturePosition;
80
81 private static short _firstPressureFrame;
82
83 private static short _firstLeftBoostFrame;
84
85 private static short _firstRightBoostFrame;
86
87 private static int[][] _trackSwitchOptions;
88
89 private static int[][] _tileHeight;
90
91 public static void Initialize()
92 {
93 if (!Main.dedServ && (float)TextureAssets.MinecartMount.Width() != 50f)
94 {
95 throw new Exception("Be sure to update Minecart.textureWidth to match the actual texture size of " + 50f + ".");
96 }
97 _rightSideConnection = new int[36];
98 _leftSideConnection = new int[36];
99 _trackType = new int[36];
100 _boostLeft = new bool[36];
101 _texturePosition = new Vector2[40];
102 _tileHeight = new int[36][];
103 for (int i = 0; i < 36; i++)
104 {
105 int[] array = new int[8];
106 for (int j = 0; j < array.Length; j++)
107 {
108 array[j] = 5;
109 }
110 _tileHeight[i] = array;
111 }
112 int num = 0;
113 _leftSideConnection[num] = -1;
114 _rightSideConnection[num] = -1;
115 _tileHeight[num][0] = -4;
116 _tileHeight[num][7] = -4;
117 _texturePosition[num] = new Vector2(0f, 0f);
118 num++;
119 _leftSideConnection[num] = 1;
120 _rightSideConnection[num] = 1;
121 _texturePosition[num] = new Vector2(1f, 0f);
122 num++;
123 _leftSideConnection[num] = -1;
124 _rightSideConnection[num] = 1;
125 for (int k = 0; k < 4; k++)
126 {
127 _tileHeight[num][k] = -1;
128 }
129 _texturePosition[num] = new Vector2(2f, 1f);
130 num++;
131 _leftSideConnection[num] = 1;
132 _rightSideConnection[num] = -1;
133 for (int l = 4; l < 8; l++)
134 {
135 _tileHeight[num][l] = -1;
136 }
137 _texturePosition[num] = new Vector2(3f, 1f);
138 num++;
139 _leftSideConnection[num] = 2;
140 _rightSideConnection[num] = 1;
141 _tileHeight[num][0] = 1;
142 _tileHeight[num][1] = 2;
143 _tileHeight[num][2] = 3;
144 _tileHeight[num][3] = 3;
145 _tileHeight[num][4] = 4;
146 _tileHeight[num][5] = 4;
147 _texturePosition[num] = new Vector2(0f, 2f);
148 num++;
149 _leftSideConnection[num] = 1;
150 _rightSideConnection[num] = 2;
151 _tileHeight[num][2] = 4;
152 _tileHeight[num][3] = 4;
153 _tileHeight[num][4] = 3;
154 _tileHeight[num][5] = 3;
155 _tileHeight[num][6] = 2;
156 _tileHeight[num][7] = 1;
157 _texturePosition[num] = new Vector2(1f, 2f);
158 num++;
159 _leftSideConnection[num] = 1;
160 _rightSideConnection[num] = 0;
161 _tileHeight[num][4] = 6;
162 _tileHeight[num][5] = 6;
163 _tileHeight[num][6] = 7;
164 _tileHeight[num][7] = 8;
165 _texturePosition[num] = new Vector2(0f, 1f);
166 num++;
167 _leftSideConnection[num] = 0;
168 _rightSideConnection[num] = 1;
169 _tileHeight[num][0] = 8;
170 _tileHeight[num][1] = 7;
171 _tileHeight[num][2] = 6;
172 _tileHeight[num][3] = 6;
173 _texturePosition[num] = new Vector2(1f, 1f);
174 num++;
175 _leftSideConnection[num] = 0;
176 _rightSideConnection[num] = 2;
177 for (int m = 0; m < 8; m++)
178 {
179 _tileHeight[num][m] = 8 - m;
180 }
181 _texturePosition[num] = new Vector2(0f, 3f);
182 num++;
183 _leftSideConnection[num] = 2;
184 _rightSideConnection[num] = 0;
185 for (int n = 0; n < 8; n++)
186 {
187 _tileHeight[num][n] = n + 1;
188 }
189 _texturePosition[num] = new Vector2(1f, 3f);
190 num++;
191 _leftSideConnection[num] = 2;
192 _rightSideConnection[num] = -1;
193 _tileHeight[num][0] = 1;
194 _tileHeight[num][1] = 2;
195 for (int num2 = 2; num2 < 8; num2++)
196 {
197 _tileHeight[num][num2] = -1;
198 }
199 _texturePosition[num] = new Vector2(4f, 1f);
200 num++;
201 _leftSideConnection[num] = -1;
202 _rightSideConnection[num] = 2;
203 _tileHeight[num][6] = 2;
204 _tileHeight[num][7] = 1;
205 for (int num3 = 0; num3 < 6; num3++)
206 {
207 _tileHeight[num][num3] = -1;
208 }
209 _texturePosition[num] = new Vector2(5f, 1f);
210 num++;
211 _leftSideConnection[num] = 0;
212 _rightSideConnection[num] = -1;
213 _tileHeight[num][0] = 8;
214 _tileHeight[num][1] = 7;
215 _tileHeight[num][2] = 6;
216 for (int num4 = 3; num4 < 8; num4++)
217 {
218 _tileHeight[num][num4] = -1;
219 }
220 _texturePosition[num] = new Vector2(6f, 1f);
221 num++;
222 _leftSideConnection[num] = -1;
223 _rightSideConnection[num] = 0;
224 _tileHeight[num][5] = 6;
225 _tileHeight[num][6] = 7;
226 _tileHeight[num][7] = 8;
227 for (int num5 = 0; num5 < 5; num5++)
228 {
229 _tileHeight[num][num5] = -1;
230 }
231 _texturePosition[num] = new Vector2(7f, 1f);
232 num++;
233 _leftSideConnection[num] = -1;
234 _rightSideConnection[num] = 1;
235 _tileHeight[num][0] = -4;
236 _texturePosition[num] = new Vector2(2f, 0f);
237 num++;
238 _leftSideConnection[num] = 1;
239 _rightSideConnection[num] = -1;
240 _tileHeight[num][7] = -4;
241 _texturePosition[num] = new Vector2(3f, 0f);
242 num++;
243 _leftSideConnection[num] = 2;
244 _rightSideConnection[num] = -1;
245 for (int num6 = 0; num6 < 6; num6++)
246 {
247 _tileHeight[num][num6] = num6 + 1;
248 }
249 _tileHeight[num][6] = -3;
250 _tileHeight[num][7] = -3;
251 _texturePosition[num] = new Vector2(4f, 0f);
252 num++;
253 _leftSideConnection[num] = -1;
254 _rightSideConnection[num] = 2;
255 _tileHeight[num][0] = -3;
256 _tileHeight[num][1] = -3;
257 for (int num7 = 2; num7 < 8; num7++)
258 {
259 _tileHeight[num][num7] = 8 - num7;
260 }
261 _texturePosition[num] = new Vector2(5f, 0f);
262 num++;
263 _leftSideConnection[num] = 0;
264 _rightSideConnection[num] = -1;
265 for (int num8 = 0; num8 < 6; num8++)
266 {
267 _tileHeight[num][num8] = 8 - num8;
268 }
269 _tileHeight[num][6] = -3;
270 _tileHeight[num][7] = -3;
271 _texturePosition[num] = new Vector2(6f, 0f);
272 num++;
273 _leftSideConnection[num] = -1;
274 _rightSideConnection[num] = 0;
275 _tileHeight[num][0] = -3;
276 _tileHeight[num][1] = -3;
277 for (int num9 = 2; num9 < 8; num9++)
278 {
279 _tileHeight[num][num9] = num9 + 1;
280 }
281 _texturePosition[num] = new Vector2(7f, 0f);
282 num++;
283 _leftSideConnection[num] = -1;
284 _rightSideConnection[num] = -1;
285 _tileHeight[num][0] = -4;
286 _tileHeight[num][7] = -4;
287 _trackType[num] = 1;
288 _texturePosition[num] = new Vector2(0f, 4f);
289 num++;
290 _leftSideConnection[num] = 1;
291 _rightSideConnection[num] = 1;
292 _trackType[num] = 1;
293 _texturePosition[num] = new Vector2(1f, 4f);
294 num++;
295 _leftSideConnection[num] = -1;
296 _rightSideConnection[num] = 1;
297 _tileHeight[num][0] = -4;
298 _trackType[num] = 1;
299 _texturePosition[num] = new Vector2(0f, 5f);
300 num++;
301 _leftSideConnection[num] = 1;
302 _rightSideConnection[num] = -1;
303 _tileHeight[num][7] = -4;
304 _trackType[num] = 1;
305 _texturePosition[num] = new Vector2(1f, 5f);
306 num++;
307 _leftSideConnection[num] = -1;
308 _rightSideConnection[num] = 1;
309 for (int num10 = 0; num10 < 6; num10++)
310 {
311 _tileHeight[num][num10] = -2;
312 }
313 _texturePosition[num] = new Vector2(2f, 2f);
314 num++;
315 _leftSideConnection[num] = 1;
316 _rightSideConnection[num] = -1;
317 for (int num11 = 2; num11 < 8; num11++)
318 {
319 _tileHeight[num][num11] = -2;
320 }
321 _texturePosition[num] = new Vector2(3f, 2f);
322 num++;
323 _leftSideConnection[num] = 2;
324 _rightSideConnection[num] = -1;
325 _tileHeight[num][0] = 1;
326 _tileHeight[num][1] = 2;
327 for (int num12 = 2; num12 < 8; num12++)
328 {
329 _tileHeight[num][num12] = -2;
330 }
331 _texturePosition[num] = new Vector2(4f, 2f);
332 num++;
333 _leftSideConnection[num] = -1;
334 _rightSideConnection[num] = 2;
335 _tileHeight[num][6] = 2;
336 _tileHeight[num][7] = 1;
337 for (int num13 = 0; num13 < 6; num13++)
338 {
339 _tileHeight[num][num13] = -2;
340 }
341 _texturePosition[num] = new Vector2(5f, 2f);
342 num++;
343 _leftSideConnection[num] = 0;
344 _rightSideConnection[num] = -1;
345 _tileHeight[num][0] = 8;
346 _tileHeight[num][1] = 7;
347 _tileHeight[num][2] = 6;
348 for (int num14 = 3; num14 < 8; num14++)
349 {
350 _tileHeight[num][num14] = -2;
351 }
352 _texturePosition[num] = new Vector2(6f, 2f);
353 num++;
354 _leftSideConnection[num] = -1;
355 _rightSideConnection[num] = 0;
356 _tileHeight[num][5] = 6;
357 _tileHeight[num][6] = 7;
358 _tileHeight[num][7] = 8;
359 for (int num15 = 0; num15 < 5; num15++)
360 {
361 _tileHeight[num][num15] = -2;
362 }
363 _texturePosition[num] = new Vector2(7f, 2f);
364 num++;
365 _leftSideConnection[num] = 1;
366 _rightSideConnection[num] = 1;
367 _trackType[num] = 2;
368 _boostLeft[num] = false;
369 _texturePosition[num] = new Vector2(2f, 3f);
370 num++;
371 _leftSideConnection[num] = 1;
372 _rightSideConnection[num] = 1;
373 _trackType[num] = 2;
374 _boostLeft[num] = true;
375 _texturePosition[num] = new Vector2(3f, 3f);
376 num++;
377 _leftSideConnection[num] = 0;
378 _rightSideConnection[num] = 2;
379 for (int num16 = 0; num16 < 8; num16++)
380 {
381 _tileHeight[num][num16] = 8 - num16;
382 }
383 _trackType[num] = 2;
384 _boostLeft[num] = false;
385 _texturePosition[num] = new Vector2(4f, 3f);
386 num++;
387 _leftSideConnection[num] = 2;
388 _rightSideConnection[num] = 0;
389 for (int num17 = 0; num17 < 8; num17++)
390 {
391 _tileHeight[num][num17] = num17 + 1;
392 }
393 _trackType[num] = 2;
394 _boostLeft[num] = true;
395 _texturePosition[num] = new Vector2(5f, 3f);
396 num++;
397 _leftSideConnection[num] = 0;
398 _rightSideConnection[num] = 2;
399 for (int num18 = 0; num18 < 8; num18++)
400 {
401 _tileHeight[num][num18] = 8 - num18;
402 }
403 _trackType[num] = 2;
404 _boostLeft[num] = true;
405 _texturePosition[num] = new Vector2(6f, 3f);
406 num++;
407 _leftSideConnection[num] = 2;
408 _rightSideConnection[num] = 0;
409 for (int num19 = 0; num19 < 8; num19++)
410 {
411 _tileHeight[num][num19] = num19 + 1;
412 }
413 _trackType[num] = 2;
414 _boostLeft[num] = false;
415 _texturePosition[num] = new Vector2(7f, 3f);
416 num++;
417 _texturePosition[36] = new Vector2(0f, 6f);
418 _texturePosition[37] = new Vector2(1f, 6f);
419 _texturePosition[39] = new Vector2(0f, 7f);
420 _texturePosition[38] = new Vector2(1f, 7f);
421 for (int num20 = 0; num20 < _texturePosition.Length; num20++)
422 {
423 _texturePosition[num20] *= 18f;
424 }
425 for (int num21 = 0; num21 < _tileHeight.Length; num21++)
426 {
427 int[] array2 = _tileHeight[num21];
428 for (int num22 = 0; num22 < array2.Length; num22++)
429 {
430 if (array2[num22] >= 0)
431 {
432 array2[num22] = (8 - array2[num22]) * 2;
433 }
434 }
435 }
436 int[] array3 = new int[36];
437 _trackSwitchOptions = new int[64][];
438 for (int num23 = 0; num23 < 64; num23++)
439 {
440 int num24 = 0;
441 for (int num25 = 1; num25 < 256; num25 <<= 1)
442 {
443 if ((num23 & num25) == num25)
444 {
445 num24++;
446 }
447 }
448 int num26 = 0;
449 for (int num27 = 0; num27 < 36; num27++)
450 {
451 array3[num27] = -1;
452 int num28 = 0;
453 switch (_leftSideConnection[num27])
454 {
455 case 0:
456 num28 |= 1;
457 break;
458 case 1:
459 num28 |= 2;
460 break;
461 case 2:
462 num28 |= 4;
463 break;
464 }
465 switch (_rightSideConnection[num27])
466 {
467 case 0:
468 num28 |= 8;
469 break;
470 case 1:
471 num28 |= 0x10;
472 break;
473 case 2:
474 num28 |= 0x20;
475 break;
476 }
477 if (num24 < 2)
478 {
479 if (num23 != num28)
480 {
481 continue;
482 }
483 }
484 else if (num28 == 0 || (num23 & num28) != num28)
485 {
486 continue;
487 }
488 array3[num27] = num27;
489 num26++;
490 }
491 if (num26 == 0)
492 {
493 continue;
494 }
495 int[] array4 = new int[num26];
496 int num29 = 0;
497 for (int num30 = 0; num30 < 36; num30++)
498 {
499 if (array3[num30] != -1)
500 {
501 array4[num29] = array3[num30];
502 num29++;
503 }
504 }
505 _trackSwitchOptions[num23] = array4;
506 }
510 for (int num31 = 0; num31 < _trackType.Length; num31++)
511 {
512 switch (_trackType[num31])
513 {
514 case 1:
515 if (_firstPressureFrame == -1)
516 {
517 _firstPressureFrame = (short)num31;
518 }
519 break;
520 case 2:
521 if (_boostLeft[num31])
522 {
523 if (_firstLeftBoostFrame == -1)
524 {
526 }
527 }
528 else if (_firstRightBoostFrame == -1)
529 {
531 }
532 break;
533 }
534 }
535 }
536
537 public static bool IsPressurePlate(Tile tile)
538 {
539 if (tile == null)
540 {
541 return false;
542 }
543 if (tile.active() && tile.type == 314 && (tile.frameX == 20 || tile.frameX == 21))
544 {
545 return true;
546 }
547 return false;
548 }
549
550 public static BitsByte TrackCollision(Player Player, ref Vector2 Position, ref Vector2 Velocity, ref Vector2 lastBoost, int Width, int Height, bool followDown, bool followUp, int fallStart, bool trackOnly, Mount.MountDelegatesData delegatesData)
551 {
552 if (followDown && followUp)
553 {
554 followDown = false;
555 followUp = false;
556 }
557 Vector2 vector = new Vector2((float)(Width / 2) - 25f, Height / 2);
558 Vector2 vector2 = Position + new Vector2((float)(Width / 2) - 25f, Height / 2) + _trackMagnetOffset;
559 Vector2 vector3 = Velocity;
560 float num = vector3.Length();
561 vector3.Normalize();
562 Vector2 vector4 = vector2;
563 Tile tile = null;
564 bool flag = false;
565 bool flag2 = true;
566 int num2 = -1;
567 int num3 = -1;
568 int num4 = -1;
569 TrackState trackState = TrackState.NoTrack;
570 bool flag3 = false;
571 bool flag4 = false;
572 bool flag5 = false;
573 bool flag6 = false;
574 Vector2 vector5 = Vector2.Zero;
575 Vector2 vector6 = Vector2.Zero;
576 BitsByte result = default(BitsByte);
577 while (true)
578 {
579 int num5 = (int)(vector4.X / 16f);
580 int num6 = (int)(vector4.Y / 16f);
581 int num7 = (int)vector4.X % 16 / 2;
582 if (flag2)
583 {
584 num4 = num7;
585 }
586 bool flag7 = num7 != num4;
587 if ((trackState == TrackState.OnBack || trackState == TrackState.OnTrack || trackState == TrackState.OnFront) && num5 != num2)
588 {
589 int num8 = ((trackState != TrackState.OnBack) ? tile.FrontTrack() : tile.BackTrack());
590 switch ((!(vector3.X < 0f)) ? _rightSideConnection[num8] : _leftSideConnection[num8])
591 {
592 case 0:
593 num6--;
594 vector4.Y -= 2f;
595 break;
596 case 2:
597 num6++;
598 vector4.Y += 2f;
599 break;
600 }
601 }
602 TrackState trackState2 = TrackState.NoTrack;
603 bool flag8 = false;
604 if (num5 != num2 || num6 != num3)
605 {
606 if (flag2)
607 {
608 flag2 = false;
609 }
610 else
611 {
612 flag8 = true;
613 }
614 tile = Main.tile[num5, num6];
615 if (tile == null)
616 {
617 tile = new Tile();
618 Main.tile[num5, num6] = tile;
619 }
620 flag = ((tile.nactive() && tile.type == 314) ? true : false);
621 }
622 if (flag)
623 {
624 TrackState trackState3 = TrackState.NoTrack;
625 int num9 = tile.FrontTrack();
626 int num10 = tile.BackTrack();
627 int num11 = _tileHeight[num9][num7];
628 switch (num11)
629 {
630 case -4:
631 if (trackState == TrackState.OnFront)
632 {
633 if (trackOnly)
634 {
635 vector4 -= vector6;
636 num = 0f;
637 trackState2 = TrackState.OnFront;
638 flag6 = true;
639 }
640 else
641 {
642 trackState2 = TrackState.NoTrack;
643 flag5 = true;
644 }
645 }
646 break;
647 case -1:
648 if (trackState == TrackState.OnFront)
649 {
650 vector4 -= vector6;
651 num = 0f;
652 trackState2 = TrackState.OnFront;
653 flag6 = true;
654 }
655 break;
656 case -2:
657 if (trackState != TrackState.OnFront)
658 {
659 break;
660 }
661 if (trackOnly)
662 {
663 vector4 -= vector6;
664 num = 0f;
665 trackState2 = TrackState.OnFront;
666 flag6 = true;
667 break;
668 }
669 if (vector3.X < 0f)
670 {
671 float num14 = (float)(num5 * 16 + (num7 + 1) * 2) - vector4.X;
672 vector4.X += num14;
673 num += num14 / vector3.X;
674 }
675 vector3.X = 0f - vector3.X;
676 result[1] = true;
677 trackState2 = TrackState.OnFront;
678 break;
679 case -3:
680 if (trackState == TrackState.OnFront)
681 {
682 trackState = TrackState.NoTrack;
683 vector5 = Vector2.Transform(matrix: (Velocity.X > 0f) ? ((_leftSideConnection[num9] != 2) ? Matrix.CreateRotationZ((float)Math.PI / 4f) : Matrix.CreateRotationZ(-(float)Math.PI / 4f)) : ((_rightSideConnection[num9] != 2) ? Matrix.CreateRotationZ(-(float)Math.PI / 4f) : Matrix.CreateRotationZ((float)Math.PI / 4f)), position: new Vector2(Velocity.X, 0f));
684 vector5.X = Velocity.X;
685 flag4 = true;
686 num = 0f;
687 }
688 break;
689 default:
690 {
691 float num12 = num6 * 16 + num11;
692 if (num5 != num2 && trackState == TrackState.NoTrack && vector4.Y > num12 && vector4.Y - num12 < 2f)
693 {
694 flag8 = false;
695 trackState = TrackState.AboveFront;
696 }
697 TrackState trackState4 = ((!(vector4.Y < num12)) ? ((!(vector4.Y > num12)) ? TrackState.OnTrack : TrackState.BelowTrack) : TrackState.AboveTrack);
698 if (num10 != -1)
699 {
700 float num13 = num6 * 16 + _tileHeight[num10][num7];
701 trackState3 = ((!(vector4.Y < num13)) ? ((!(vector4.Y > num13)) ? TrackState.OnTrack : TrackState.BelowTrack) : TrackState.AboveTrack);
702 }
703 switch (trackState4)
704 {
705 case TrackState.OnTrack:
706 trackState2 = ((trackState3 == TrackState.OnTrack) ? TrackState.OnTrack : TrackState.OnFront);
707 break;
708 case TrackState.AboveTrack:
709 trackState2 = trackState3 switch
710 {
711 TrackState.OnTrack => TrackState.OnBack,
712 TrackState.BelowTrack => TrackState.AboveFront,
713 TrackState.AboveTrack => TrackState.AboveTrack,
714 _ => TrackState.AboveFront,
715 };
716 break;
717 case TrackState.BelowTrack:
718 trackState2 = trackState3 switch
719 {
720 TrackState.OnTrack => TrackState.OnBack,
721 TrackState.AboveTrack => TrackState.AboveBack,
722 TrackState.BelowTrack => TrackState.BelowTrack,
723 _ => TrackState.BelowTrack,
724 };
725 break;
726 }
727 break;
728 }
729 }
730 }
731 if (!flag8)
732 {
733 if (trackState != trackState2)
734 {
735 bool flag9 = false;
736 if (flag7 || vector3.Y > 0f)
737 {
738 switch (trackState)
739 {
740 case TrackState.AboveTrack:
741 switch (trackState2)
742 {
743 case TrackState.AboveFront:
744 trackState2 = TrackState.OnBack;
745 break;
746 case TrackState.AboveBack:
747 trackState2 = TrackState.OnFront;
748 break;
749 case TrackState.AboveTrack:
750 trackState2 = TrackState.OnTrack;
751 break;
752 }
753 break;
754 case TrackState.AboveFront:
755 if (trackState2 == TrackState.BelowTrack)
756 {
757 trackState2 = TrackState.OnFront;
758 }
759 break;
760 case TrackState.AboveBack:
761 if (trackState2 == TrackState.BelowTrack)
762 {
763 trackState2 = TrackState.OnBack;
764 }
765 break;
766 case TrackState.OnFront:
767 trackState2 = TrackState.OnFront;
768 flag9 = true;
769 break;
770 case TrackState.OnBack:
771 trackState2 = TrackState.OnBack;
772 flag9 = true;
773 break;
774 case TrackState.OnTrack:
775 {
776 int num15 = _tileHeight[tile.FrontTrack()][num7];
777 int num16 = _tileHeight[tile.BackTrack()][num7];
778 trackState2 = (followDown ? ((num15 >= num16) ? TrackState.OnFront : TrackState.OnBack) : ((!followUp) ? TrackState.OnFront : ((num15 >= num16) ? TrackState.OnBack : TrackState.OnFront)));
779 flag9 = true;
780 break;
781 }
782 }
783 int num17 = -1;
784 switch (trackState2)
785 {
786 case TrackState.OnTrack:
787 case TrackState.OnFront:
788 num17 = tile.FrontTrack();
789 break;
790 case TrackState.OnBack:
791 num17 = tile.BackTrack();
792 break;
793 }
794 if (num17 != -1)
795 {
796 if (!flag9 && Velocity.Y > Player.defaultGravity)
797 {
798 int num18 = (int)(Position.Y / 16f);
799 if (fallStart < num18 - 1)
800 {
801 delegatesData.MinecartLandingSound(Player, Position, Width, Height);
802 WheelSparks(delegatesData.MinecartDust, Position, Width, Height, 10);
803 }
804 }
805 if (trackState == TrackState.AboveFront && _trackType[num17] == 1)
806 {
807 flag3 = true;
808 }
809 vector3.Y = 0f;
810 vector4.Y = num6 * 16 + _tileHeight[num17][num7];
811 }
812 }
813 }
814 }
815 else if (trackState2 == TrackState.OnFront || trackState2 == TrackState.OnBack || trackState2 == TrackState.OnTrack)
816 {
817 if (flag && _trackType[tile.FrontTrack()] == 1)
818 {
819 flag3 = true;
820 }
821 vector3.Y = 0f;
822 }
823 if (trackState2 == TrackState.OnFront)
824 {
825 int num19 = tile.FrontTrack();
826 if (_trackType[num19] == 2 && lastBoost.X == 0f && lastBoost.Y == 0f)
827 {
828 lastBoost = new Vector2(num5, num6);
829 if (_boostLeft[num19])
830 {
831 result[4] = true;
832 }
833 else
834 {
835 result[5] = true;
836 }
837 }
838 }
839 num4 = num7;
840 trackState = trackState2;
841 num2 = num5;
842 num3 = num6;
843 if (num > 0f)
844 {
845 float num20 = vector4.X % 2f;
846 float num21 = vector4.Y % 2f;
847 float num22 = 3f;
848 float num23 = 3f;
849 if (vector3.X < 0f)
850 {
851 num22 = num20 + 0.125f;
852 }
853 else if (vector3.X > 0f)
854 {
855 num22 = 2f - num20;
856 }
857 if (vector3.Y < 0f)
858 {
859 num23 = num21 + 0.125f;
860 }
861 else if (vector3.Y > 0f)
862 {
863 num23 = 2f - num21;
864 }
865 if (num22 == 3f && num23 == 3f)
866 {
867 break;
868 }
869 float num24 = Math.Abs(num22 / vector3.X);
870 float num25 = Math.Abs(num23 / vector3.Y);
871 float num26 = ((num24 < num25) ? num24 : num25);
872 if (num26 > num)
873 {
874 vector6 = vector3 * num;
875 num = 0f;
876 }
877 else
878 {
879 vector6 = vector3 * num26;
880 num -= num26;
881 }
882 vector4 += vector6;
883 continue;
884 }
885 if (lastBoost.X != (float)num2 || lastBoost.Y != (float)num3)
886 {
887 lastBoost = Vector2.Zero;
888 }
889 break;
890 }
891 if (flag3)
892 {
893 result[3] = true;
894 }
895 if (flag5)
896 {
897 Velocity.X = vector4.X - vector2.X;
898 Velocity.Y = Player.defaultGravity;
899 }
900 else if (flag4)
901 {
902 result[2] = true;
903 Velocity = vector5;
904 }
905 else if (result[1])
906 {
907 Velocity.X = 0f - Velocity.X;
908 Position.X = vector4.X - _trackMagnetOffset.X - vector.X - Velocity.X;
909 if (vector3.Y == 0f)
910 {
911 Velocity.Y = 0f;
912 }
913 }
914 else
915 {
916 if (flag6)
917 {
918 Velocity.X = vector4.X - vector2.X;
919 }
920 if (vector3.Y == 0f)
921 {
922 Velocity.Y = 0f;
923 }
924 }
925 Position.Y += vector4.Y - vector2.Y - Velocity.Y;
926 Position.Y = (float)Math.Round(Position.Y, 2);
927 if (trackState == TrackState.OnTrack || (uint)(trackState - 5) <= 1u)
928 {
929 result[0] = true;
930 }
931 return result;
932 }
933
934 public static bool FrameTrack(int i, int j, bool pound, bool mute = false)
935 {
936 if (_trackType == null)
937 {
938 return false;
939 }
940 Tile tile = Main.tile[i, j];
941 if (tile == null)
942 {
943 tile = new Tile();
944 Main.tile[i, j] = tile;
945 }
946 if (mute && tile.type != 314)
947 {
948 return false;
949 }
950 int nearbyTilesSetLookupIndex = GetNearbyTilesSetLookupIndex(i, j);
951 int num = tile.FrontTrack();
952 int num2 = tile.BackTrack();
953 int num3 = ((num >= 0 && num < _trackType.Length) ? _trackType[num] : 0);
954 int num4 = -1;
955 int num5 = -1;
956 int[] array = _trackSwitchOptions[nearbyTilesSetLookupIndex];
957 if (array == null)
958 {
959 if (pound)
960 {
961 return false;
962 }
963 tile.FrontTrack(0);
964 tile.BackTrack(-1);
965 return false;
966 }
967 if (!pound)
968 {
969 int num6 = -1;
970 int num7 = -1;
971 bool flag = false;
972 for (int k = 0; k < array.Length; k++)
973 {
974 int num8 = array[k];
975 if (num2 == array[k])
976 {
977 num5 = k;
978 }
979 if (_trackType[num8] != num3)
980 {
981 continue;
982 }
983 if (_leftSideConnection[num8] == -1 || _rightSideConnection[num8] == -1)
984 {
985 if (num == array[k])
986 {
987 num4 = k;
988 flag = true;
989 }
990 if (num6 == -1)
991 {
992 num6 = k;
993 }
994 }
995 else
996 {
997 if (num == array[k])
998 {
999 num4 = k;
1000 flag = false;
1001 }
1002 if (num7 == -1)
1003 {
1004 num7 = k;
1005 }
1006 }
1007 }
1008 if (num7 != -1)
1009 {
1010 if (num4 == -1 || flag)
1011 {
1012 num4 = num7;
1013 }
1014 }
1015 else
1016 {
1017 if (num4 == -1)
1018 {
1019 switch (num3)
1020 {
1021 case 2:
1022 return false;
1023 case 1:
1024 return false;
1025 }
1026 num4 = num6;
1027 }
1028 num5 = -1;
1029 }
1030 }
1031 else
1032 {
1033 for (int l = 0; l < array.Length; l++)
1034 {
1035 if (num == array[l])
1036 {
1037 num4 = l;
1038 }
1039 if (num2 == array[l])
1040 {
1041 num5 = l;
1042 }
1043 }
1044 int num9 = 0;
1045 int num10 = 0;
1046 for (int m = 0; m < array.Length; m++)
1047 {
1048 if (_trackType[array[m]] == num3)
1049 {
1050 if (_leftSideConnection[array[m]] == -1 || _rightSideConnection[array[m]] == -1)
1051 {
1052 num10++;
1053 }
1054 else
1055 {
1056 num9++;
1057 }
1058 }
1059 }
1060 if (num9 < 2 && num10 < 2)
1061 {
1062 return false;
1063 }
1064 bool flag2 = num9 == 0;
1065 bool flag3 = false;
1066 if (!flag2)
1067 {
1068 while (!flag3)
1069 {
1070 num5++;
1071 if (num5 >= array.Length)
1072 {
1073 num5 = -1;
1074 break;
1075 }
1076 if ((_leftSideConnection[array[num5]] != _leftSideConnection[array[num4]] || _rightSideConnection[array[num5]] != _rightSideConnection[array[num4]]) && _trackType[array[num5]] == num3 && _leftSideConnection[array[num5]] != -1 && _rightSideConnection[array[num5]] != -1)
1077 {
1078 flag3 = true;
1079 }
1080 }
1081 }
1082 if (!flag3)
1083 {
1084 do
1085 {
1086 num4++;
1087 if (num4 >= array.Length)
1088 {
1089 num4 = -1;
1090 do
1091 {
1092 num4++;
1093 }
1094 while (_trackType[array[num4]] != num3 || (_leftSideConnection[array[num4]] == -1 || _rightSideConnection[array[num4]] == -1) != flag2);
1095 break;
1096 }
1097 }
1098 while (_trackType[array[num4]] != num3 || (_leftSideConnection[array[num4]] == -1 || _rightSideConnection[array[num4]] == -1) != flag2);
1099 }
1100 }
1101 bool flag4 = false;
1102 switch (num4)
1103 {
1104 case -2:
1105 if (tile.FrontTrack() != _firstPressureFrame)
1106 {
1107 flag4 = true;
1108 }
1109 break;
1110 case -1:
1111 if (tile.FrontTrack() != 0)
1112 {
1113 flag4 = true;
1114 }
1115 break;
1116 default:
1117 if (tile.FrontTrack() != array[num4])
1118 {
1119 flag4 = true;
1120 }
1121 break;
1122 }
1123 if (num5 == -1)
1124 {
1125 if (tile.BackTrack() != -1)
1126 {
1127 flag4 = true;
1128 }
1129 }
1130 else if (tile.BackTrack() != array[num5])
1131 {
1132 flag4 = true;
1133 }
1134 switch (num4)
1135 {
1136 case -2:
1137 tile.FrontTrack(_firstPressureFrame);
1138 break;
1139 case -1:
1140 tile.FrontTrack(0);
1141 break;
1142 default:
1143 tile.FrontTrack((short)array[num4]);
1144 break;
1145 }
1146 if (num5 == -1)
1147 {
1148 tile.BackTrack(-1);
1149 }
1150 else
1151 {
1152 tile.BackTrack((short)array[num5]);
1153 }
1154 if (pound && flag4 && !mute)
1155 {
1156 WorldGen.KillTile(i, j, fail: true);
1157 }
1158 return true;
1159 }
1160
1161 private static int GetNearbyTilesSetLookupIndex(int i, int j)
1162 {
1163 int num = 0;
1164 if (Main.tile[i - 1, j - 1] != null && Main.tile[i - 1, j - 1].type == 314)
1165 {
1166 num++;
1167 }
1168 if (Main.tile[i - 1, j] != null && Main.tile[i - 1, j].type == 314)
1169 {
1170 num += 2;
1171 }
1172 if (Main.tile[i - 1, j + 1] != null && Main.tile[i - 1, j + 1].type == 314)
1173 {
1174 num += 4;
1175 }
1176 if (Main.tile[i + 1, j - 1] != null && Main.tile[i + 1, j - 1].type == 314)
1177 {
1178 num += 8;
1179 }
1180 if (Main.tile[i + 1, j] != null && Main.tile[i + 1, j].type == 314)
1181 {
1182 num += 16;
1183 }
1184 if (Main.tile[i + 1, j + 1] != null && Main.tile[i + 1, j + 1].type == 314)
1185 {
1186 num += 32;
1187 }
1188 return num;
1189 }
1190
1191 public static bool GetOnTrack(int tileX, int tileY, ref Vector2 Position, int Width, int Height)
1192 {
1193 Tile tile = Main.tile[tileX, tileY];
1194 if (tile.type != 314)
1195 {
1196 return false;
1197 }
1198 Vector2 vector = new Vector2((float)(Width / 2) - 25f, Height / 2);
1199 Vector2 vector2 = Position + vector + _trackMagnetOffset;
1200 int num = (int)vector2.X % 16 / 2;
1201 int num2 = -1;
1202 int num3 = 0;
1203 for (int i = num; i < 8; i++)
1204 {
1205 num3 = _tileHeight[tile.frameX][i];
1206 if (num3 >= 0)
1207 {
1208 num2 = i;
1209 break;
1210 }
1211 }
1212 if (num2 == -1)
1213 {
1214 for (int num4 = num - 1; num4 >= 0; num4--)
1215 {
1216 num3 = _tileHeight[tile.frameX][num4];
1217 if (num3 >= 0)
1218 {
1219 num2 = num4;
1220 break;
1221 }
1222 }
1223 }
1224 if (num2 == -1)
1225 {
1226 return false;
1227 }
1228 vector2.X = tileX * 16 + num2 * 2;
1229 vector2.Y = tileY * 16 + num3;
1230 vector2 -= _trackMagnetOffset;
1231 vector2 -= vector;
1232 Position = vector2;
1233 return true;
1234 }
1235
1236 public static bool OnTrack(Vector2 Position, int Width, int Height)
1237 {
1238 Vector2 vector = Position + new Vector2((float)(Width / 2) - 25f, Height / 2) + _trackMagnetOffset;
1239 int num = (int)(vector.X / 16f);
1240 int num2 = (int)(vector.Y / 16f);
1241 if (Main.tile[num, num2] == null)
1242 {
1243 return false;
1244 }
1245 return Main.tile[num, num2].type == 314;
1246 }
1247
1248 public static float TrackRotation(Player player, ref float rotation, Vector2 Position, int Width, int Height, bool followDown, bool followUp, Mount.MountDelegatesData delegatesData)
1249 {
1250 GetWheelsPositions(player, Position, Width, Height, followDown, followUp, delegatesData, out var leftWheel, out var rightWheel);
1251 float num = rightWheel.Y - leftWheel.Y;
1252 float num2 = rightWheel.X - leftWheel.X;
1253 float num3 = num / num2;
1254 float num4 = leftWheel.Y + (Position.X - leftWheel.X) * num3;
1255 float num5 = (Position.X - (float)(int)Position.X) * num3;
1256 rotation = (float)Math.Atan2(num, num2);
1257 return num4 - Position.Y + num5;
1258 }
1259
1260 public static void GetWheelsPositions(Player player, Vector2 Position, int Width, int Height, bool followDown, bool followUp, Mount.MountDelegatesData delegatesData, out Vector2 leftWheel, out Vector2 rightWheel)
1261 {
1262 leftWheel = Position;
1263 rightWheel = Position;
1264 Vector2 lastBoost = Vector2.Zero;
1265 Vector2 Velocity = new Vector2(-12f, 0f);
1266 TrackCollision(player, ref leftWheel, ref Velocity, ref lastBoost, Width, Height, followDown, followUp, 0, trackOnly: true, delegatesData);
1267 leftWheel += Velocity;
1268 Velocity = new Vector2(12f, 0f);
1269 TrackCollision(player, ref rightWheel, ref Velocity, ref lastBoost, Width, Height, followDown, followUp, 0, trackOnly: true, delegatesData);
1270 rightWheel += Velocity;
1271 }
1272
1273 public static void HitTrackSwitch(Vector2 Position, int Width, int Height)
1274 {
1275 Vector2 magnetPosition = GetMagnetPosition(Position, Width, Height);
1276 int num = (int)(magnetPosition.X / 16f);
1277 int num2 = (int)(magnetPosition.Y / 16f);
1278 Wiring.HitSwitch(num, num2);
1279 NetMessage.SendData(59, -1, -1, null, num, num2);
1280 }
1281
1282 public static Vector2 GetMagnetPosition(Vector2 Position, int Width, int Height)
1283 {
1284 new Vector2((float)(Width / 2) - 25f, Height / 2);
1285 return Position + new Vector2((float)(Width / 2) - 25f, Height / 2) + _trackMagnetOffset;
1286 }
1287
1288 public static void FlipSwitchTrack(int i, int j)
1289 {
1290 Tile tileTrack = Main.tile[i, j];
1291 short num = tileTrack.FrontTrack();
1292 if (num == -1)
1293 {
1294 return;
1295 }
1296 switch (_trackType[num])
1297 {
1298 case 0:
1299 if (tileTrack.BackTrack() != -1)
1300 {
1301 tileTrack.FrontTrack(tileTrack.BackTrack());
1302 tileTrack.BackTrack(num);
1303 NetMessage.SendTileSquare(-1, i, j);
1304 }
1305 break;
1306 case 2:
1307 FrameTrack(i, j, pound: true, mute: true);
1308 NetMessage.SendTileSquare(-1, i, j);
1309 break;
1310 }
1311 }
1312
1313 public static void TrackColors(int i, int j, Tile trackTile, out int frontColor, out int backColor)
1314 {
1315 if (trackTile.type == 314)
1316 {
1317 frontColor = trackTile.color();
1318 backColor = frontColor;
1319 if (trackTile.frameY == -1)
1320 {
1321 return;
1322 }
1323 int num = _leftSideConnection[trackTile.frameX];
1324 int num2 = _rightSideConnection[trackTile.frameX];
1325 int num3 = _leftSideConnection[trackTile.frameY];
1326 int num4 = _rightSideConnection[trackTile.frameY];
1327 int num5 = 0;
1328 int num6 = 0;
1329 int num7 = 0;
1330 int num8 = 0;
1331 for (int k = 0; k < 4; k++)
1332 {
1333 int num9 = (k switch
1334 {
1335 1 => num2,
1336 2 => num3,
1337 3 => num4,
1338 _ => num,
1339 }) switch
1340 {
1341 0 => -1,
1342 1 => 0,
1343 2 => 1,
1344 _ => 0,
1345 };
1346 Tile tile = ((k % 2 != 0) ? Main.tile[i + 1, j + num9] : Main.tile[i - 1, j + num9]);
1347 int num10 = ((tile != null && tile.active() && tile.type == 314) ? tile.color() : 0);
1348 switch (k)
1349 {
1350 default:
1351 num5 = num10;
1352 break;
1353 case 1:
1354 num6 = num10;
1355 break;
1356 case 2:
1357 num7 = num10;
1358 break;
1359 case 3:
1360 num8 = num10;
1361 break;
1362 }
1363 }
1364 if (num == num3)
1365 {
1366 if (num6 != 0)
1367 {
1368 frontColor = num6;
1369 }
1370 else if (num5 != 0)
1371 {
1372 frontColor = num5;
1373 }
1374 if (num8 != 0)
1375 {
1376 backColor = num8;
1377 }
1378 else if (num7 != 0)
1379 {
1380 backColor = num7;
1381 }
1382 return;
1383 }
1384 if (num2 == num4)
1385 {
1386 if (num5 != 0)
1387 {
1388 frontColor = num5;
1389 }
1390 else if (num6 != 0)
1391 {
1392 frontColor = num6;
1393 }
1394 if (num7 != 0)
1395 {
1396 backColor = num7;
1397 }
1398 else if (num8 != 0)
1399 {
1400 backColor = num8;
1401 }
1402 return;
1403 }
1404 if (num6 == 0)
1405 {
1406 if (num5 != 0)
1407 {
1408 frontColor = num5;
1409 }
1410 }
1411 else if (num5 != 0)
1412 {
1413 frontColor = ((num2 <= num) ? num6 : num5);
1414 }
1415 if (num8 == 0)
1416 {
1417 if (num7 != 0)
1418 {
1419 backColor = num7;
1420 }
1421 }
1422 else if (num7 != 0)
1423 {
1424 backColor = ((num4 <= num3) ? num8 : num7);
1425 }
1426 }
1427 else
1428 {
1429 frontColor = 0;
1430 backColor = 0;
1431 }
1432 }
1433
1434 public static bool DrawLeftDecoration(int frameID)
1435 {
1436 if (frameID < 0 || frameID >= 36)
1437 {
1438 return false;
1439 }
1440 return _leftSideConnection[frameID] == 2;
1441 }
1442
1443 public static bool DrawRightDecoration(int frameID)
1444 {
1445 if (frameID < 0 || frameID >= 36)
1446 {
1447 return false;
1448 }
1449 return _rightSideConnection[frameID] == 2;
1450 }
1451
1452 public static bool DrawBumper(int frameID)
1453 {
1454 if (frameID < 0 || frameID >= 36)
1455 {
1456 return false;
1457 }
1458 if (_tileHeight[frameID][0] != -1)
1459 {
1460 return _tileHeight[frameID][7] == -1;
1461 }
1462 return true;
1463 }
1464
1465 public static bool DrawBouncyBumper(int frameID)
1466 {
1467 if (frameID < 0 || frameID >= 36)
1468 {
1469 return false;
1470 }
1471 if (_tileHeight[frameID][0] != -2)
1472 {
1473 return _tileHeight[frameID][7] == -2;
1474 }
1475 return true;
1476 }
1477
1478 public static void PlaceTrack(Tile trackCache, int style)
1479 {
1480 trackCache.active(active: true);
1481 trackCache.type = 314;
1482 trackCache.frameY = -1;
1483 switch (style)
1484 {
1485 case 0:
1486 trackCache.frameX = -1;
1487 break;
1488 case 1:
1489 trackCache.frameX = _firstPressureFrame;
1490 break;
1491 case 2:
1492 trackCache.frameX = _firstLeftBoostFrame;
1493 break;
1494 case 3:
1495 trackCache.frameX = _firstRightBoostFrame;
1496 break;
1497 }
1498 }
1499
1500 public static int GetTrackItem(Tile trackCache)
1501 {
1502 return _trackType[trackCache.frameX] switch
1503 {
1504 0 => 2340,
1505 1 => 2492,
1506 2 => 2739,
1507 _ => 0,
1508 };
1509 }
1510
1511 public static Rectangle GetSourceRect(int frameID, int animationFrame = 0)
1512 {
1513 if (frameID < 0 || frameID >= 40)
1514 {
1515 return new Rectangle(0, 0, 0, 0);
1516 }
1517 Vector2 vector = _texturePosition[frameID];
1518 Rectangle result = new Rectangle((int)vector.X, (int)vector.Y, 16, 16);
1519 if (frameID < 36 && _trackType[frameID] == 2)
1520 {
1521 result.Y += 18 * animationFrame;
1522 }
1523 return result;
1524 }
1525
1526 public static bool GetAreExpectationsForSidesMet(Point tileCoords, int? expectedYOffsetForLeft, int? expectedYOffsetForRight)
1527 {
1528 Tile tileTrack = Main.tile[tileCoords.X, tileCoords.Y];
1529 if (expectedYOffsetForLeft.HasValue)
1530 {
1531 short num = tileTrack.FrontTrack();
1532 int num2 = ConvertOffsetYToTrackConnectionValue(expectedYOffsetForLeft.Value);
1533 if (_leftSideConnection[num] != num2)
1534 {
1535 return false;
1536 }
1537 }
1538 if (expectedYOffsetForRight.HasValue)
1539 {
1540 short num3 = tileTrack.FrontTrack();
1541 int num4 = ConvertOffsetYToTrackConnectionValue(expectedYOffsetForRight.Value);
1542 if (_rightSideConnection[num3] != num4)
1543 {
1544 return false;
1545 }
1546 }
1547 return true;
1548 }
1549
1550 public static void TryFittingTileOrientation(Point tileCoords, int? expectedYOffsetForLeft, int? expectedYOffsetForRight)
1551 {
1552 int nearbyTilesSetLookupIndex = GetNearbyTilesSetLookupIndex(tileCoords.X, tileCoords.Y);
1553 int[] array = _trackSwitchOptions[nearbyTilesSetLookupIndex];
1554 if (array == null)
1555 {
1556 return;
1557 }
1558 Tile tileSafely = Framing.GetTileSafely(tileCoords);
1559 int num = _trackType[tileSafely.FrontTrack()];
1560 int? num2 = null;
1561 foreach (int num3 in array)
1562 {
1563 _ = _leftSideConnection[num3];
1564 _ = _rightSideConnection[num3];
1565 _ = _trackType[num3];
1566 if (expectedYOffsetForLeft.HasValue)
1567 {
1568 int num4 = ConvertOffsetYToTrackConnectionValue(expectedYOffsetForLeft.Value);
1569 if (_leftSideConnection[num3] != num4)
1570 {
1571 continue;
1572 }
1573 }
1574 if (expectedYOffsetForRight.HasValue)
1575 {
1576 int num5 = ConvertOffsetYToTrackConnectionValue(expectedYOffsetForRight.Value);
1577 if (_rightSideConnection[num3] != num5)
1578 {
1579 continue;
1580 }
1581 }
1582 if (_trackType[num3] == num)
1583 {
1584 num2 = num3;
1585 break;
1586 }
1587 }
1588 if (num2.HasValue)
1589 {
1590 tileSafely.FrontTrack((short)num2.Value);
1591 NetMessage.SendTileSquare(-1, tileCoords.X, tileCoords.Y);
1592 }
1593 }
1594
1595 private static int ConvertOffsetYToTrackConnectionValue(int offsetY)
1596 {
1597 return offsetY switch
1598 {
1599 -1 => 0,
1600 1 => 2,
1601 _ => 1,
1602 };
1603 }
1604
1605 private static int ConvertTrackConnectionValueToOffsetY(int trackConnectionValue)
1606 {
1607 return trackConnectionValue switch
1608 {
1609 0 => -1,
1610 2 => 1,
1611 _ => 0,
1612 };
1613 }
1614
1615 public static void WheelSparks(Action<Vector2> DustAction, Vector2 Position, int Width, int Height, int sparkCount)
1616 {
1617 Vector2 vector = new Vector2((float)(Width / 2) - 25f, Height / 2);
1619 for (int i = 0; i < sparkCount; i++)
1620 {
1621 DustAction(obj);
1622 }
1623 }
1624
1625 private static short FrontTrack(this Tile tileTrack)
1626 {
1627 return tileTrack.frameX;
1628 }
1629
1630 private static void FrontTrack(this Tile tileTrack, short trackID)
1631 {
1632 tileTrack.frameX = trackID;
1633 }
1634
1635 private static short BackTrack(this Tile tileTrack)
1636 {
1637 return tileTrack.frameY;
1638 }
1639
1640 private static void BackTrack(this Tile tileTrack, short trackID)
1641 {
1642 tileTrack.frameY = trackID;
1643 }
1644}
static double Atan2(double y, double x)
static decimal Round(decimal d)
Definition Math.cs:1096
static double Abs(double value)
const double PI
Definition Math.cs:16
static Tile GetTileSafely(Vector2 position)
Definition Framing.cs:419
static Asset< Texture2D > MinecartMount
static bool dedServ
Definition Main.cs:1226
static Tile[,] tile
Definition Main.cs:1675
static bool FrameTrack(int i, int j, bool pound, bool mute=false)
Definition Minecart.cs:934
const int Type_Normal
Definition Minecart.cs:61
const float BoosterSpeed
Definition Minecart.cs:59
const int LeftDownDecoration
Definition Minecart.cs:23
const int Flag_BouncyBumper
Definition Minecart.cs:33
const int RightDownDecoration
Definition Minecart.cs:25
const int BumperEnd
Definition Minecart.cs:51
static int[] _leftSideConnection
Definition Minecart.cs:71
static bool[] _boostLeft
Definition Minecart.cs:77
static void FrontTrack(this Tile tileTrack, short trackID)
Definition Minecart.cs:1630
static int[][] _trackSwitchOptions
Definition Minecart.cs:87
const int Type_Pressure
Definition Minecart.cs:63
static int ConvertOffsetYToTrackConnectionValue(int offsetY)
Definition Minecart.cs:1595
static BitsByte TrackCollision(Player Player, ref Vector2 Position, ref Vector2 Velocity, ref Vector2 lastBoost, int Width, int Height, bool followDown, bool followUp, int fallStart, bool trackOnly, Mount.MountDelegatesData delegatesData)
Definition Minecart.cs:550
static void TryFittingTileOrientation(Point tileCoords, int? expectedYOffsetForLeft, int? expectedYOffsetForRight)
Definition Minecart.cs:1550
static short FrontTrack(this Tile tileTrack)
Definition Minecart.cs:1625
const int Flag_OnTrack
Definition Minecart.cs:31
static bool DrawBouncyBumper(int frameID)
Definition Minecart.cs:1465
static short _firstPressureFrame
Definition Minecart.cs:81
static void PlaceTrack(Tile trackCache, int style)
Definition Minecart.cs:1478
const int BottomConnection
Definition Minecart.cs:49
static Vector2 GetMagnetPosition(Vector2 Position, int Width, int Height)
Definition Minecart.cs:1282
static bool DrawRightDecoration(int frameID)
Definition Minecart.cs:1443
static bool DrawBumper(int frameID)
Definition Minecart.cs:1452
const int Flag_HitSwitch
Definition Minecart.cs:37
static bool GetOnTrack(int tileX, int tileY, ref Vector2 Position, int Width, int Height)
Definition Minecart.cs:1191
const int NoConnection
Definition Minecart.cs:43
static short _firstRightBoostFrame
Definition Minecart.cs:85
static Rectangle GetSourceRect(int frameID, int animationFrame=0)
Definition Minecart.cs:1511
static void FlipSwitchTrack(int i, int j)
Definition Minecart.cs:1288
static bool OnTrack(Vector2 Position, int Width, int Height)
Definition Minecart.cs:1236
static Vector2[] _texturePosition
Definition Minecart.cs:79
const int Flag_UsedRamp
Definition Minecart.cs:35
const int Type_Booster
Definition Minecart.cs:65
const int TopConnection
Definition Minecart.cs:45
const int MiddleConnection
Definition Minecart.cs:47
static void Initialize()
Definition Minecart.cs:91
const int TotalFrames
Definition Minecart.cs:21
static void TrackColors(int i, int j, Tile trackTile, out int frontColor, out int backColor)
Definition Minecart.cs:1313
const int RampEnd
Definition Minecart.cs:55
static short _firstLeftBoostFrame
Definition Minecart.cs:83
static void GetWheelsPositions(Player player, Vector2 Position, int Width, int Height, bool followDown, bool followUp, Mount.MountDelegatesData delegatesData, out Vector2 leftWheel, out Vector2 rightWheel)
Definition Minecart.cs:1260
static bool IsPressurePlate(Tile tile)
Definition Minecart.cs:537
static void WheelSparks(Action< Vector2 > DustAction, Vector2 Position, int Width, int Height, int sparkCount)
Definition Minecart.cs:1615
static int[] _trackType
Definition Minecart.cs:75
static bool DrawLeftDecoration(int frameID)
Definition Minecart.cs:1434
const int Flag_BoostLeft
Definition Minecart.cs:39
const int BouncyEnd
Definition Minecart.cs:53
static float TrackRotation(Player player, ref float rotation, Vector2 Position, int Width, int Height, bool followDown, bool followUp, Mount.MountDelegatesData delegatesData)
Definition Minecart.cs:1248
const int OpenEnd
Definition Minecart.cs:57
static int GetTrackItem(Tile trackCache)
Definition Minecart.cs:1500
const int BouncyBumperDecoration
Definition Minecart.cs:27
static short BackTrack(this Tile tileTrack)
Definition Minecart.cs:1635
const float MinecartTextureWidth
Definition Minecart.cs:69
static int[] _rightSideConnection
Definition Minecart.cs:73
static Vector2 _trackMagnetOffset
Definition Minecart.cs:67
static int GetNearbyTilesSetLookupIndex(int i, int j)
Definition Minecart.cs:1161
static void BackTrack(this Tile tileTrack, short trackID)
Definition Minecart.cs:1640
static int[][] _tileHeight
Definition Minecart.cs:89
static void HitTrackSwitch(Vector2 Position, int Width, int Height)
Definition Minecart.cs:1273
static int ConvertTrackConnectionValueToOffsetY(int trackConnectionValue)
Definition Minecart.cs:1605
static bool GetAreExpectationsForSidesMet(Point tileCoords, int? expectedYOffsetForLeft, int? expectedYOffsetForRight)
Definition Minecart.cs:1526
const int Flag_BoostRight
Definition Minecart.cs:41
const int RegularBumperDecoration
Definition Minecart.cs:29
static void SendData(int msgType, int remoteClient=-1, int ignoreClient=-1, NetworkText text=null, int number=0, float number2=0f, float number3=0f, float number4=0f, int number5=0, int number6=0, int number7=0)
Definition NetMessage.cs:88
static void SendTileSquare(int whoAmi, int tileX, int tileY, int xSize, int ySize, TileChangeType changeType=TileChangeType.None)
static float defaultGravity
Definition Player.cs:2087
byte color()
Definition Tile.cs:555
bool nactive()
Definition Tile.cs:257
short frameY
Definition Tile.cs:24
ushort type
Definition Tile.cs:8
short frameX
Definition Tile.cs:22
bool active()
Definition Tile.cs:565
static void HitSwitch(int i, int j)
Definition Wiring.cs:237
static void KillTile(int i, int j, bool fail=false, bool effectOnly=false, bool noItem=false)
static Matrix CreateRotationZ(float radians)
Definition Matrix.cs:746
static Vector2 Transform(Vector2 position, Matrix matrix)
Definition Vector2.cs:317