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

◆ Place()

static bool Terraria.TileObject.Place ( TileObject toBePlaced)
inlinestatic

Definition at line 29 of file TileObject.cs.

30 {
31 TileObjectData tileData = TileObjectData.GetTileData(toBePlaced.type, toBePlaced.style, toBePlaced.alternate);
32 if (tileData == null)
33 {
34 return false;
35 }
36 if (tileData.HookPlaceOverride.hook != null)
37 {
38 int arg;
39 int arg2;
41 {
42 arg = toBePlaced.xCoord;
43 arg2 = toBePlaced.yCoord;
44 }
45 else
46 {
47 arg = toBePlaced.xCoord + tileData.Origin.X;
48 arg2 = toBePlaced.yCoord + tileData.Origin.Y;
49 }
50 if (tileData.HookPlaceOverride.hook(arg, arg2, toBePlaced.type, toBePlaced.style, 1, toBePlaced.alternate) == tileData.HookPlaceOverride.badReturn)
51 {
52 return false;
53 }
54 }
55 else
56 {
57 ushort num = (ushort)toBePlaced.type;
58 int num2 = 0;
59 int num3 = 0;
60 int num4 = tileData.CalculatePlacementStyle(toBePlaced.style, toBePlaced.alternate, toBePlaced.random);
61 int num5 = 0;
62 if (tileData.StyleWrapLimit > 0)
63 {
64 num5 = num4 / tileData.StyleWrapLimit * tileData.StyleLineSkip;
65 num4 %= tileData.StyleWrapLimit;
66 }
67 if (tileData.StyleHorizontal)
68 {
69 num2 = tileData.CoordinateFullWidth * num4;
70 num3 = tileData.CoordinateFullHeight * num5;
71 }
72 else
73 {
74 num2 = tileData.CoordinateFullWidth * num5;
75 num3 = tileData.CoordinateFullHeight * num4;
76 }
77 int num6 = toBePlaced.xCoord;
78 int num7 = toBePlaced.yCoord;
79 for (int i = 0; i < tileData.Width; i++)
80 {
81 for (int j = 0; j < tileData.Height; j++)
82 {
83 Tile tileSafely = Framing.GetTileSafely(num6 + i, num7 + j);
84 if (tileSafely.active() && tileSafely.type != 484 && (Main.tileCut[tileSafely.type] || TileID.Sets.BreakableWhenPlacing[tileSafely.type]))
85 {
86 WorldGen.KillTile(num6 + i, num7 + j);
87 if (!Main.tile[num6 + i, num7 + j].active() && Main.netMode != 0)
88 {
89 NetMessage.SendData(17, -1, -1, null, 0, num6 + i, num7 + j);
90 }
91 }
92 }
93 }
94 for (int k = 0; k < tileData.Width; k++)
95 {
96 int num8 = num2 + k * (tileData.CoordinateWidth + tileData.CoordinatePadding);
97 int num9 = num3;
98 for (int l = 0; l < tileData.Height; l++)
99 {
100 Tile tileSafely2 = Framing.GetTileSafely(num6 + k, num7 + l);
101 if (!tileSafely2.active())
102 {
103 tileSafely2.active(active: true);
104 tileSafely2.frameX = (short)num8;
105 tileSafely2.frameY = (short)num9;
106 tileSafely2.type = num;
107 }
108 num9 += tileData.CoordinateHeights[l] + tileData.CoordinatePadding;
109 }
110 }
111 }
112 if (tileData.FlattenAnchors)
113 {
114 AnchorData anchorBottom = tileData.AnchorBottom;
115 if (anchorBottom.tileCount != 0 && (anchorBottom.type & AnchorType.SolidTile) == AnchorType.SolidTile)
116 {
117 int num10 = toBePlaced.xCoord + anchorBottom.checkStart;
118 int j2 = toBePlaced.yCoord + tileData.Height;
119 for (int m = 0; m < anchorBottom.tileCount; m++)
120 {
121 Tile tileSafely3 = Framing.GetTileSafely(num10 + m, j2);
122 if (Main.tileSolid[tileSafely3.type] && !Main.tileSolidTop[tileSafely3.type] && tileSafely3.blockType() != 0)
123 {
124 WorldGen.SlopeTile(num10 + m, j2);
125 }
126 }
127 }
128 anchorBottom = tileData.AnchorTop;
129 if (anchorBottom.tileCount != 0 && (anchorBottom.type & AnchorType.SolidTile) == AnchorType.SolidTile)
130 {
131 int num11 = toBePlaced.xCoord + anchorBottom.checkStart;
132 int j3 = toBePlaced.yCoord - 1;
133 for (int n = 0; n < anchorBottom.tileCount; n++)
134 {
135 Tile tileSafely4 = Framing.GetTileSafely(num11 + n, j3);
136 if (Main.tileSolid[tileSafely4.type] && !Main.tileSolidTop[tileSafely4.type] && tileSafely4.blockType() != 0)
137 {
138 WorldGen.SlopeTile(num11 + n, j3);
139 }
140 }
141 }
142 anchorBottom = tileData.AnchorRight;
143 if (anchorBottom.tileCount != 0 && (anchorBottom.type & AnchorType.SolidTile) == AnchorType.SolidTile)
144 {
145 int i2 = toBePlaced.xCoord + tileData.Width;
146 int num12 = toBePlaced.yCoord + anchorBottom.checkStart;
147 for (int num13 = 0; num13 < anchorBottom.tileCount; num13++)
148 {
149 Tile tileSafely5 = Framing.GetTileSafely(i2, num12 + num13);
150 if (Main.tileSolid[tileSafely5.type] && !Main.tileSolidTop[tileSafely5.type] && tileSafely5.blockType() != 0)
151 {
152 WorldGen.SlopeTile(i2, num12 + num13);
153 }
154 }
155 }
156 anchorBottom = tileData.AnchorLeft;
157 if (anchorBottom.tileCount != 0 && (anchorBottom.type & AnchorType.SolidTile) == AnchorType.SolidTile)
158 {
159 int i3 = toBePlaced.xCoord - 1;
160 int num14 = toBePlaced.yCoord + anchorBottom.checkStart;
161 for (int num15 = 0; num15 < anchorBottom.tileCount; num15++)
162 {
163 Tile tileSafely6 = Framing.GetTileSafely(i3, num14 + num15);
164 if (Main.tileSolid[tileSafely6.type] && !Main.tileSolidTop[tileSafely6.type] && tileSafely6.blockType() != 0)
165 {
166 WorldGen.SlopeTile(i3, num14 + num15);
167 }
168 }
169 }
170 }
171 return true;
172 }
static bool[] BreakableWhenPlacing
Definition TileID.cs:277
int CalculatePlacementStyle(int style, int alternate, int random)
static TileObjectData GetTileData(int type, int style, int alternate=0)
Func< int, int, int, int, int, int, int > hook

References Terraria.Tile.active(), Terraria.TileObject.alternate, Terraria.ObjectData.TileObjectData.AnchorBottom, Terraria.ObjectData.TileObjectData.AnchorLeft, Terraria.ObjectData.TileObjectData.AnchorRight, Terraria.ObjectData.TileObjectData.AnchorTop, Terraria.DataStructures.PlacementHook.badReturn, Terraria.Tile.blockType(), Terraria.ID.TileID.Sets.BreakableWhenPlacing, Terraria.ObjectData.TileObjectData.CalculatePlacementStyle(), Terraria.DataStructures.AnchorData.checkStart, Terraria.ObjectData.TileObjectData.CoordinateHeights, Terraria.ObjectData.TileObjectData.CoordinatePadding, Terraria.ObjectData.TileObjectData.FlattenAnchors, Terraria.ObjectData.TileObjectData.GetTileData(), Terraria.Framing.GetTileSafely(), Terraria.ObjectData.TileObjectData.Height, Terraria.DataStructures.PlacementHook.hook, Terraria.ObjectData.TileObjectData.HookPlaceOverride, Terraria.WorldGen.KillTile(), Terraria.Main.netMode, Terraria.ObjectData.TileObjectData.Origin, Terraria.DataStructures.PlacementHook.processedCoordinates, Terraria.TileObject.random, Terraria.NetMessage.SendData(), Terraria.WorldGen.SlopeTile(), Terraria.TileObject.style, Terraria.ObjectData.TileObjectData.StyleHorizontal, Terraria.ObjectData.TileObjectData.StyleLineSkip, Terraria.ObjectData.TileObjectData.StyleWrapLimit, Terraria.Main.tile, Terraria.DataStructures.AnchorData.tileCount, Terraria.Main.tileCut, Terraria.Main.tileSolid, Terraria.Main.tileSolidTop, Terraria.DataStructures.AnchorData.type, Terraria.Tile.type, Terraria.TileObject.type, Terraria.ObjectData.TileObjectData.Width, Terraria.DataStructures.Point16.X, Terraria.TileObject.xCoord, Terraria.DataStructures.Point16.Y, and Terraria.TileObject.yCoord.

Referenced by Terraria.WorldGen.PlaceChest(), Terraria.WorldGen.PlaceObject(), Terraria.Player.PlaceThing_Tiles_PlaceIt(), and Terraria.Player.TryReplantingTree().