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

◆ TrackCollision()

static BitsByte Terraria.Minecart.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 )
inlinestatic

Definition at line 550 of file Minecart.cs.

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 }
static decimal Round(decimal d)
Definition Math.cs:1096
static double Abs(double value)
static int[] _leftSideConnection
Definition Minecart.cs:71
static bool[] _boostLeft
Definition Minecart.cs:77
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 int[] _rightSideConnection
Definition Minecart.cs:73
static Vector2 _trackMagnetOffset
Definition Minecart.cs:67
static int[][] _tileHeight
Definition Minecart.cs:89
static Vector2 Transform(Vector2 position, Matrix matrix)
Definition Vector2.cs:317

References Terraria.Minecart._boostLeft, Terraria.Minecart._leftSideConnection, Terraria.Minecart._rightSideConnection, Terraria.Minecart._tileHeight, Terraria.Minecart._trackMagnetOffset, Terraria.Minecart._trackType, System.Math.Abs(), Microsoft.Xna.Framework.Matrix.CreateRotationZ(), Terraria.Player.defaultGravity, Microsoft.Xna.Framework.Vector2.Length(), Terraria.Tile.nactive(), Microsoft.Xna.Framework.Vector2.Normalize(), System.Math.PI, System.Math.Round(), Terraria.Main.tile, Microsoft.Xna.Framework.Vector2.Transform(), Terraria.Minecart.WheelSparks(), Microsoft.Xna.Framework.Vector2.X, Microsoft.Xna.Framework.Vector2.Y, and Microsoft.Xna.Framework.Vector2.Zero.

Referenced by Terraria.Minecart.GetWheelsPositions(), and Terraria.Player.Update().