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

◆ CheckLogicGate()

static void Terraria.Wiring.CheckLogicGate ( int lampX,
int lampY )
inlinestaticprivate

Definition at line 694 of file Wiring.cs.

695 {
696 if (!WorldGen.InWorld(lampX, lampY, 1))
697 {
698 return;
699 }
700 for (int i = lampY; i < Main.maxTilesY; i++)
701 {
702 Tile tile = Main.tile[lampX, i];
703 if (!tile.active())
704 {
705 break;
706 }
707 if (tile.type == 420)
708 {
709 _GatesDone.TryGetValue(new Point16(lampX, i), out var value);
710 int num = tile.frameY / 18;
711 bool flag = tile.frameX == 18;
712 bool flag2 = tile.frameX == 36;
713 if (num < 0)
714 {
715 break;
716 }
717 int num2 = 0;
718 int num3 = 0;
719 bool flag3 = false;
720 for (int num4 = i - 1; num4 > 0; num4--)
721 {
722 Tile tile2 = Main.tile[lampX, num4];
723 if (!tile2.active() || tile2.type != 419)
724 {
725 break;
726 }
727 if (tile2.frameX == 36)
728 {
729 flag3 = true;
730 break;
731 }
732 num2++;
733 num3 += (tile2.frameX == 18).ToInt();
734 }
735 bool flag4 = false;
736 switch (num)
737 {
738 default:
739 return;
740 case 0:
741 flag4 = num2 == num3;
742 break;
743 case 2:
744 flag4 = num2 != num3;
745 break;
746 case 1:
747 flag4 = num3 > 0;
748 break;
749 case 3:
750 flag4 = num3 == 0;
751 break;
752 case 4:
753 flag4 = num3 == 1;
754 break;
755 case 5:
756 flag4 = num3 != 1;
757 break;
758 }
759 bool flag5 = !flag3 && flag2;
760 bool flag6 = false;
761 if (flag3 && Framing.GetTileSafely(lampX, lampY).frameX == 36)
762 {
763 flag6 = true;
764 }
765 if (!(flag4 != flag || flag5 || flag6))
766 {
767 break;
768 }
769 _ = tile.frameX % 18 / 18;
770 tile.frameX = (short)(18 * flag4.ToInt());
771 if (flag3)
772 {
773 tile.frameX = 36;
774 }
775 SkipWire(lampX, i);
776 WorldGen.SquareTileFrame(lampX, i);
777 NetMessage.SendTileSquare(-1, lampX, i);
778 bool flag7 = !flag3 || flag6;
779 if (flag6)
780 {
781 if (num3 == 0 || num2 == 0)
782 {
783 flag7 = false;
784 }
785 flag7 = Main.rand.NextFloat() < (float)num3 / (float)num2;
786 }
787 if (flag5)
788 {
789 flag7 = false;
790 }
791 if (flag7)
792 {
793 if (!value)
794 {
795 _GatesNext.Enqueue(new Point16(lampX, i));
796 break;
797 }
798 Vector2 position = new Vector2(lampX, i) * 16f - new Vector2(10f);
799 Utils.PoofOfSmoke(position);
800 NetMessage.SendData(106, -1, -1, null, (int)position.X, position.Y);
801 }
802 break;
803 }
804 if (tile.type != 419)
805 {
806 break;
807 }
808 }
809 }
static void SkipWire(int x, int y)
Definition Wiring.cs:105
static Dictionary< Point16, bool > _GatesDone
Definition Wiring.cs:33
static Queue< Point16 > _GatesNext
Definition Wiring.cs:31

References Terraria.Wiring._GatesDone, Terraria.Wiring._GatesNext, Terraria.Tile.active(), Terraria.Framing.GetTileSafely(), Terraria.WorldGen.InWorld(), Terraria.Main.maxTilesY, Terraria.Utils.PoofOfSmoke(), Terraria.Main.rand, Terraria.NetMessage.SendData(), Terraria.NetMessage.SendTileSquare(), Terraria.Wiring.SkipWire(), Terraria.WorldGen.SquareTileFrame(), Terraria.Main.tile, Terraria.Tile.type, System.value, Microsoft.Xna.Framework.Vector2.X, and Microsoft.Xna.Framework.Vector2.Y.

Referenced by Terraria.Wiring.LogicGatePass().