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

◆ SwitchTiles()

static bool Terraria.Collision.SwitchTiles ( Vector2 Position,
int Width,
int Height,
Vector2 oldPosition,
int objType )
inlinestatic

Definition at line 2700 of file Collision.cs.

2701 {
2702 int num = (int)(Position.X / 16f) - 1;
2703 int num2 = (int)((Position.X + (float)Width) / 16f) + 2;
2704 int num3 = (int)(Position.Y / 16f) - 1;
2705 int num4 = (int)((Position.Y + (float)Height) / 16f) + 2;
2706 if (num < 0)
2707 {
2708 num = 0;
2709 }
2710 if (num2 > Main.maxTilesX)
2711 {
2712 num2 = Main.maxTilesX;
2713 }
2714 if (num3 < 0)
2715 {
2716 num3 = 0;
2717 }
2718 if (num4 > Main.maxTilesY)
2719 {
2720 num4 = Main.maxTilesY;
2721 }
2722 Vector2 vector = default(Vector2);
2723 for (int i = num; i < num2; i++)
2724 {
2725 for (int j = num3; j < num4; j++)
2726 {
2727 if (Main.tile[i, j] == null)
2728 {
2729 continue;
2730 }
2731 int type = Main.tile[i, j].type;
2732 if (!Main.tile[i, j].active() || (type != 135 && type != 210 && type != 443 && type != 442))
2733 {
2734 continue;
2735 }
2736 vector.X = i * 16;
2737 vector.Y = j * 16 + 12;
2738 bool flag = false;
2739 if (type == 442)
2740 {
2741 if (objType == 4)
2742 {
2743 float r1StartX = 0f;
2744 float r1StartY = 0f;
2745 float r1Width = 0f;
2746 float r1Height = 0f;
2747 switch (Main.tile[i, j].frameX / 22)
2748 {
2749 case 0:
2750 r1StartX = i * 16;
2751 r1StartY = j * 16 + 16 - 10;
2752 r1Width = 16f;
2753 r1Height = 10f;
2754 break;
2755 case 1:
2756 r1StartX = i * 16;
2757 r1StartY = j * 16;
2758 r1Width = 16f;
2759 r1Height = 10f;
2760 break;
2761 case 2:
2762 r1StartX = i * 16;
2763 r1StartY = j * 16;
2764 r1Width = 10f;
2765 r1Height = 16f;
2766 break;
2767 case 3:
2768 r1StartX = i * 16 + 16 - 10;
2769 r1StartY = j * 16;
2770 r1Width = 10f;
2771 r1Height = 16f;
2772 break;
2773 }
2774 if (Utils.FloatIntersect(r1StartX, r1StartY, r1Width, r1Height, Position.X, Position.Y, Width, Height) && !Utils.FloatIntersect(r1StartX, r1StartY, r1Width, r1Height, oldPosition.X, oldPosition.Y, Width, Height))
2775 {
2776 Wiring.HitSwitch(i, j);
2777 NetMessage.SendData(59, -1, -1, null, i, j);
2778 return true;
2779 }
2780 }
2781 flag = true;
2782 }
2783 if (flag || !(Position.X + (float)Width > vector.X) || !(Position.X < vector.X + 16f) || !(Position.Y + (float)Height > vector.Y) || !((double)Position.Y < (double)vector.Y + 4.01))
2784 {
2785 continue;
2786 }
2787 if (type == 210)
2788 {
2789 WorldGen.ExplodeMine(i, j, fromWiring: false);
2790 }
2791 else
2792 {
2793 if (oldPosition.X + (float)Width > vector.X && oldPosition.X < vector.X + 16f && oldPosition.Y + (float)Height > vector.Y && (double)oldPosition.Y < (double)vector.Y + 16.01)
2794 {
2795 continue;
2796 }
2797 if (type == 443)
2798 {
2799 if (objType == 1)
2800 {
2801 Wiring.HitSwitch(i, j);
2802 NetMessage.SendData(59, -1, -1, null, i, j);
2803 }
2804 continue;
2805 }
2806 int num5 = Main.tile[i, j].frameY / 18;
2807 bool flag2 = true;
2808 if ((num5 == 4 || num5 == 2 || num5 == 3 || num5 == 6 || num5 == 7) && objType != 1)
2809 {
2810 flag2 = false;
2811 }
2812 if (num5 == 5 && (objType == 1 || objType == 4))
2813 {
2814 flag2 = false;
2815 }
2816 if (!flag2)
2817 {
2818 continue;
2819 }
2820 Wiring.HitSwitch(i, j);
2821 NetMessage.SendData(59, -1, -1, null, i, j);
2822 if (num5 == 7)
2823 {
2824 WorldGen.KillTile(i, j);
2825 if (Main.netMode == 1)
2826 {
2827 NetMessage.SendData(17, -1, -1, null, 0, i, j);
2828 }
2829 }
2830 return true;
2831 }
2832 }
2833 }
2834 return false;
2835 }

References Terraria.WorldGen.ExplodeMine(), Terraria.Utils.FloatIntersect(), Terraria.Wiring.HitSwitch(), Terraria.WorldGen.KillTile(), Terraria.Main.maxTilesX, Terraria.Main.maxTilesY, Terraria.Main.netMode, Terraria.NetMessage.SendData(), Terraria.Main.tile, System.type, Microsoft.Xna.Framework.Vector2.X, and Microsoft.Xna.Framework.Vector2.Y.

Referenced by Terraria.Projectile.AI_149_GolfBall(), Terraria.Projectile.HandleMovement(), Terraria.Player.Update(), Terraria.Projectile.Update(), and Terraria.NPC.UpdateNPC().