Terraria v1.4.4.9
Terraria source code documentation
All Classes Namespaces Files Functions Variables Enumerations Enumerator Properties Events Macros
PlayerSittingHelper.cs
Go to the documentation of this file.
2using Terraria.ID;
3
5
6public struct PlayerSittingHelper
7{
8 public const int ChairSittingMaxDistance = 40;
9
10 public bool isSitting;
11
13
15
16 public int sittingIndex;
17
18 public void GetSittingOffsetInfo(Player player, out Vector2 posOffset, out float seatAdjustment)
19 {
20 if (isSitting)
21 {
22 posOffset = new Vector2(sittingIndex * player.direction * 8, (float)sittingIndex * player.gravDir * -4f);
23 seatAdjustment = -4f;
24 seatAdjustment += (int)offsetForSeat.Y;
25 posOffset += offsetForSeat * player.Directions;
26 }
27 else
28 {
29 posOffset = Vector2.Zero;
30 seatAdjustment = 0f;
31 }
32 }
33
34 public bool TryGetSittingBlock(Player player, out Tile tile)
35 {
36 tile = null;
37 if (!isSitting)
38 {
39 return false;
40 }
41 Point pt = (player.Bottom + new Vector2(0f, -2f)).ToTileCoordinates();
42 if (!GetSittingTargetInfo(player, pt.X, pt.Y, out var _, out var _, out var _, out var _))
43 {
44 return false;
45 }
46 tile = Framing.GetTileSafely(pt);
47 return true;
48 }
49
50 public void UpdateSitting(Player player)
51 {
52 if (!isSitting)
53 {
54 return;
55 }
56 Point coords = (player.Bottom + new Vector2(0f, -2f)).ToTileCoordinates();
57 if (!GetSittingTargetInfo(player, coords.X, coords.Y, out var targetDirection, out var _, out var seatDownOffset, out var extraInfo))
58 {
59 SitUp(player);
60 return;
61 }
62 if (player.controlLeft || player.controlRight || player.controlUp || player.controlDown || player.controlJump || player.pulley || player.mount.Active || targetDirection != player.direction)
63 {
64 SitUp(player);
65 }
66 if (Main.sittingManager.GetNextPlayerStackIndexInCoords(coords) >= 2)
67 {
68 SitUp(player);
69 }
70 if (isSitting)
71 {
72 offsetForSeat = seatDownOffset;
73 details = extraInfo;
74 Main.sittingManager.AddPlayerAndGetItsStackedIndexInCoords(player.whoAmI, coords, out sittingIndex);
75 }
76 }
77
78 public void SitUp(Player player, bool multiplayerBroadcast = true)
79 {
80 if (isSitting)
81 {
82 isSitting = false;
84 sittingIndex = -1;
85 details = default(ExtraSeatInfo);
86 if (multiplayerBroadcast && Main.myPlayer == player.whoAmI)
87 {
88 NetMessage.SendData(13, -1, -1, null, player.whoAmI);
89 }
90 }
91 }
92
93 public void SitDown(Player player, int x, int y)
94 {
95 if (!GetSittingTargetInfo(player, x, y, out var targetDirection, out var playerSittingPosition, out var seatDownOffset, out var extraInfo))
96 {
97 return;
98 }
99 Vector2 offset = playerSittingPosition - player.Bottom;
100 bool flag = player.CanSnapToPosition(offset);
101 if (flag)
102 {
103 flag &= Main.sittingManager.GetNextPlayerStackIndexInCoords((playerSittingPosition + new Vector2(0f, -2f)).ToTileCoordinates()) < 2;
104 }
105 if (!flag)
106 {
107 return;
108 }
109 if (isSitting && player.Bottom == playerSittingPosition)
110 {
111 SitUp(player);
112 return;
113 }
114 player.StopVanityActions();
116 if (player.mount.Active)
117 {
118 player.mount.Dismount(player);
119 }
120 player.Bottom = playerSittingPosition;
121 player.ChangeDir(targetDirection);
122 isSitting = true;
123 details = extraInfo;
124 offsetForSeat = seatDownOffset;
125 Main.sittingManager.AddPlayerAndGetItsStackedIndexInCoords(player.whoAmI, new Point(x, y), out sittingIndex);
126 player.velocity = Vector2.Zero;
127 player.gravDir = 1f;
128 if (Main.myPlayer == player.whoAmI)
129 {
130 NetMessage.SendData(13, -1, -1, null, player.whoAmI);
131 }
132 }
133
134 public static bool GetSittingTargetInfo(Player player, int x, int y, out int targetDirection, out Vector2 playerSittingPosition, out Vector2 seatDownOffset, out ExtraSeatInfo extraInfo)
135 {
136 extraInfo = default(ExtraSeatInfo);
137 Tile tileSafely = Framing.GetTileSafely(x, y);
138 if (!TileID.Sets.CanBeSatOnForPlayers[tileSafely.type] || !tileSafely.active())
139 {
140 targetDirection = 1;
141 seatDownOffset = Vector2.Zero;
142 playerSittingPosition = default(Vector2);
143 return false;
144 }
145 int num = x;
146 int num2 = y;
147 targetDirection = 1;
148 seatDownOffset = Vector2.Zero;
149 int num3 = 6;
150 Vector2 zero = Vector2.Zero;
151 switch (tileSafely.type)
152 {
153 case 15:
154 case 497:
155 {
156 bool num6 = tileSafely.type == 15 && (tileSafely.frameY / 40 == 1 || tileSafely.frameY / 40 == 20);
157 bool value = tileSafely.type == 15 && tileSafely.frameY / 40 == 27;
158 seatDownOffset.Y = value.ToInt() * 4;
159 if (tileSafely.frameY % 40 != 0)
160 {
161 num2--;
162 }
163 targetDirection = -1;
164 if (tileSafely.frameX != 0)
165 {
166 targetDirection = 1;
167 }
168 if (num6 || tileSafely.type == 497)
169 {
170 extraInfo.IsAToilet = true;
171 }
172 break;
173 }
174 case 102:
175 {
176 int num4 = tileSafely.frameX / 18;
177 if (num4 == 0)
178 {
179 num++;
180 }
181 if (num4 == 2)
182 {
183 num--;
184 }
185 int num5 = tileSafely.frameY / 18;
186 if (num5 == 0)
187 {
188 num2 += 2;
189 }
190 if (num5 == 1)
191 {
192 num2++;
193 }
194 if (num5 == 3)
195 {
196 num2--;
197 }
198 targetDirection = player.direction;
199 num3 = 0;
200 break;
201 }
202 case 487:
203 {
204 int num7 = tileSafely.frameX % 72 / 18;
205 if (num7 == 1)
206 {
207 num--;
208 }
209 if (num7 == 2)
210 {
211 num++;
212 }
213 if (tileSafely.frameY / 18 != 0)
214 {
215 num2--;
216 }
217 targetDirection = (num7 <= 1).ToDirectionInt();
218 num3 = 0;
219 seatDownOffset.Y -= 1f;
220 break;
221 }
222 case 89:
223 {
224 targetDirection = player.direction;
225 num3 = 0;
226 Vector2 vector = new Vector2(-4f, 2f);
227 Vector2 vector2 = new Vector2(4f, 2f);
228 Vector2 vector3 = new Vector2(0f, 2f);
229 Vector2 zero2 = Vector2.Zero;
230 zero2.X = 1f;
231 zero.X = -1f;
232 switch (tileSafely.frameX / 54)
233 {
234 case 0:
235 vector3.Y = (vector.Y = (vector2.Y = 1f));
236 break;
237 case 1:
238 vector3.Y = 1f;
239 break;
240 case 2:
241 case 14:
242 case 15:
243 case 17:
244 case 20:
245 case 21:
246 case 22:
247 case 23:
248 case 25:
249 case 26:
250 case 27:
251 case 28:
252 case 35:
253 case 37:
254 case 38:
255 case 39:
256 case 40:
257 case 41:
258 case 42:
259 vector3.Y = (vector.Y = (vector2.Y = 1f));
260 break;
261 case 3:
262 case 4:
263 case 5:
264 case 7:
265 case 8:
266 case 9:
267 case 10:
268 case 11:
269 case 12:
270 case 13:
271 case 16:
272 case 18:
273 case 19:
274 case 36:
275 vector3.Y = (vector.Y = (vector2.Y = 0f));
276 break;
277 case 6:
278 vector3.Y = (vector.Y = (vector2.Y = -1f));
279 break;
280 case 24:
281 vector3.Y = 0f;
282 vector.Y = -4f;
283 vector.X = 0f;
284 vector2.X = 0f;
285 vector2.Y = -4f;
286 break;
287 }
288 if (tileSafely.frameY % 40 != 0)
289 {
290 num2--;
291 }
292 if ((tileSafely.frameX % 54 == 0 && targetDirection == -1) || (tileSafely.frameX % 54 == 36 && targetDirection == 1))
293 {
294 seatDownOffset = vector;
295 }
296 else if ((tileSafely.frameX % 54 == 0 && targetDirection == 1) || (tileSafely.frameX % 54 == 36 && targetDirection == -1))
297 {
298 seatDownOffset = vector2;
299 }
300 else
301 {
302 seatDownOffset = vector3;
303 }
304 seatDownOffset += zero2;
305 break;
306 }
307 }
308 playerSittingPosition = new Point(num, num2 + 1).ToWorldCoordinates(8f, 16f);
309 playerSittingPosition.X += targetDirection * num3;
310 playerSittingPosition += zero;
311 return true;
312 }
313}
Vector2 Bottom
Definition Entity.cs:115
static Tile GetTileSafely(Vector2 position)
Definition Framing.cs:419
static bool[] CanBeSatOnForPlayers
Definition TileID.cs:135
static int myPlayer
Definition Main.cs:1801
static AnchoredEntitiesCollection sittingManager
Definition Main.cs:2255
void Dismount(Player mountedPlayer)
Definition Mount.cs:5229
bool Active
Definition Mount.cs:345
static void SendData(int msgType, int remoteClient=-1, int ignoreClient=-1, NetworkText text=null, int number=0, float number2=0f, float number3=0f, float number4=0f, int number5=0, int number6=0, int number7=0)
Definition NetMessage.cs:88
bool controlRight
Definition Player.cs:1383
bool CanSnapToPosition(Vector2 offset)
Definition Player.cs:31160
void RemoveAllGrapplingHooks()
Definition Player.cs:31290
void ChangeDir(int dir)
Definition Player.cs:40136
Vector2 Directions
Definition Player.cs:3326
void StopVanityActions(bool multiplayerBroadcast=true)
Definition Player.cs:31204
short frameY
Definition Tile.cs:24
ushort type
Definition Tile.cs:8
short frameX
Definition Tile.cs:22
bool active()
Definition Tile.cs:565
bool TryGetSittingBlock(Player player, out Tile tile)
void GetSittingOffsetInfo(Player player, out Vector2 posOffset, out float seatAdjustment)
static bool GetSittingTargetInfo(Player player, int x, int y, out int targetDirection, out Vector2 playerSittingPosition, out Vector2 seatDownOffset, out ExtraSeatInfo extraInfo)
void SitUp(Player player, bool multiplayerBroadcast=true)
void SitDown(Player player, int x, int y)