551 {
552 if (followDown && followUp)
553 {
554 followDown = false;
555 followUp = false;
556 }
557 Vector2 vector =
new Vector2((
float)(Width / 2) - 25f, Height / 2);
560 float num = vector3.
Length();
564 bool flag = false;
565 bool flag2 = true;
566 int num2 = -1;
567 int num3 = -1;
568 int num4 = -1;
570 bool flag3 = false;
571 bool flag4 = false;
572 bool flag5 = false;
573 bool flag6 = false;
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;
588 {
589 int num8 = ((trackState !=
TrackState.OnBack) ? tile.FrontTrack() : tile.BackTrack());
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 }
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 {
618 Main.tile[num5, num6] = tile;
619 }
620 flag = ((tile.nactive() && tile.type == 314) ? true : false);
621 }
622 if (flag)
623 {
625 int num9 = tile.FrontTrack();
626 int num10 = tile.BackTrack();
628 switch (num11)
629 {
630 case -4:
632 {
633 if (trackOnly)
634 {
635 vector4 -= vector6;
636 num = 0f;
638 flag6 = true;
639 }
640 else
641 {
643 flag5 = true;
644 }
645 }
646 break;
647 case -1:
649 {
650 vector4 -= vector6;
651 num = 0f;
653 flag6 = true;
654 }
655 break;
656 case -2:
658 {
659 break;
660 }
661 if (trackOnly)
662 {
663 vector4 -= vector6;
664 num = 0f;
666 flag6 = true;
667 break;
668 }
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;
678 break;
679 case -3:
681 {
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;
696 }
698 if (num10 != -1)
699 {
700 float num13 = num6 * 16 +
_tileHeight[num10][num7];
702 }
703 switch (trackState4)
704 {
707 break;
709 trackState2 = trackState3 switch
710 {
712 TrackState.BelowTrack =>
TrackState.AboveFront,
713 TrackState.AboveTrack =>
TrackState.AboveTrack,
715 };
716 break;
718 trackState2 = trackState3 switch
719 {
721 TrackState.AboveTrack =>
TrackState.AboveBack,
722 TrackState.BelowTrack =>
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 {
741 switch (trackState2)
742 {
745 break;
748 break;
751 break;
752 }
753 break;
756 {
758 }
759 break;
762 {
764 }
765 break;
768 flag9 = true;
769 break;
772 flag9 = true;
773 break;
775 {
779 flag9 = true;
780 break;
781 }
782 }
783 int num17 = -1;
784 switch (trackState2)
785 {
788 num17 = tile.FrontTrack();
789 break;
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);
803 }
804 }
806 {
807 flag3 = true;
808 }
809 vector3.Y = 0f;
811 }
812 }
813 }
814 }
816 {
817 if (flag &&
_trackType[tile.FrontTrack()] == 1)
818 {
819 flag3 = true;
820 }
821 vector3.Y = 0f;
822 }
824 {
825 int num19 = tile.FrontTrack();
826 if (
_trackType[num19] == 2 && lastBoost.X == 0f && lastBoost.Y == 0f)
827 {
828 lastBoost =
new Vector2(num5, num6);
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;
850 {
851 num22 = num20 + 0.125f;
852 }
853 else if (vector3.
X > 0f)
854 {
855 num22 = 2f - num20;
856 }
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 {
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;
910 {
911 Velocity.Y = 0f;
912 }
913 }
914 else
915 {
916 if (flag6)
917 {
918 Velocity.X = vector4.X - vector2.
X;
919 }
921 {
922 Velocity.Y = 0f;
923 }
924 }
925 Position.Y += vector4.Y - vector2.Y - Velocity.Y;
927 if (trackState ==
TrackState.OnTrack || (uint)(trackState - 5) <= 1u)
928 {
929 result[0] = true;
930 }
931 return result;
932 }
static decimal Round(decimal d)
static double Abs(double value)
static int[] _leftSideConnection
static void WheelSparks(Action< Vector2 > DustAction, Vector2 Position, int Width, int Height, int sparkCount)
static int[] _rightSideConnection
static Vector2 _trackMagnetOffset
static int[][] _tileHeight
static Vector2 Transform(Vector2 position, Matrix matrix)