Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
PlayerSleepingHelper.cs
Go to the documentation of this file.
1using System;
3using Terraria.ID;
4
6
8{
9 public const int BedSleepingMaxDistance = 96;
10
11 public const int TimeToFullyFallAsleep = 120;
12
13 public bool isSleeping;
14
15 public int sleepingIndex;
16
17 public int timeSleeping;
18
20
22 {
23 get
24 {
25 if (isSleeping)
26 {
27 return timeSleeping >= 120;
28 }
29 return false;
30 }
31 }
32
33 public void GetSleepingOffsetInfo(Player player, out Vector2 posOffset)
34 {
35 if (isSleeping)
36 {
37 posOffset = visualOffsetOfBedBase * player.Directions + new Vector2(0f, (float)sleepingIndex * player.gravDir * -4f);
38 }
39 else
40 {
41 posOffset = Vector2.Zero;
42 }
43 }
44
46 {
47 if (NPC.AnyDanger(quickBossNPCCheck: true))
48 {
49 return true;
50 }
51 if (Main.bloodMoon && !Main.dayTime)
52 {
53 return true;
54 }
55 if (Main.eclipse && Main.dayTime)
56 {
57 return true;
58 }
59 if (player.itemAnimation > 0)
60 {
61 return true;
62 }
63 return false;
64 }
65
67 {
68 if (isSleeping != state)
69 {
71 if (state)
72 {
73 player.fullRotation = (float)Math.PI / 2f * (float)(-player.direction);
74 return;
75 }
76 player.fullRotation = 0f;
78 }
79 }
80
81 public void UpdateState(Player player)
82 {
83 if (!isSleeping)
84 {
85 timeSleeping = 0;
86 return;
87 }
90 {
91 timeSleeping = 0;
92 }
93 Point coords = (player.Bottom + new Vector2(0f, -2f)).ToTileCoordinates();
94 if (!GetSleepingTargetInfo(coords.X, coords.Y, out var targetDirection, out var _, out var visualoffset))
95 {
96 StopSleeping(player);
97 return;
98 }
99 if (player.controlLeft || player.controlRight || player.controlUp || player.controlDown || player.controlJump || player.pulley || player.mount.Active || targetDirection != player.direction)
100 {
101 StopSleeping(player);
102 }
103 bool flag = false;
104 if (player.itemAnimation > 0)
105 {
106 Item heldItem = player.HeldItem;
107 if (heldItem.damage > 0 && !heldItem.noMelee)
108 {
109 flag = true;
110 }
111 if (heldItem.fishingPole > 0)
112 {
113 flag = true;
114 }
115 bool? flag2 = ItemID.Sets.ForcesBreaksSleeping[heldItem.type];
116 if (flag2.HasValue)
117 {
118 flag = flag2.Value;
119 }
120 }
121 if (flag)
122 {
123 StopSleeping(player);
124 }
125 if (Main.sleepingManager.GetNextPlayerStackIndexInCoords(coords) >= 2)
126 {
127 StopSleeping(player);
128 }
129 if (isSleeping)
130 {
131 visualOffsetOfBedBase = visualoffset;
132 Main.sleepingManager.AddPlayerAndGetItsStackedIndexInCoords(player.whoAmI, coords, out sleepingIndex);
133 }
134 }
135
136 public void StopSleeping(Player player, bool multiplayerBroadcast = true)
137 {
138 if (isSleeping)
139 {
141 timeSleeping = 0;
142 sleepingIndex = -1;
144 if (multiplayerBroadcast && Main.myPlayer == player.whoAmI)
145 {
146 NetMessage.SendData(13, -1, -1, null, player.whoAmI);
147 }
148 }
149 }
150
151 public void StartSleeping(Player player, int x, int y)
152 {
153 GetSleepingTargetInfo(x, y, out var targetDirection, out var anchorPosition, out var visualoffset);
154 Vector2 offset = anchorPosition - player.Bottom;
155 bool flag = player.CanSnapToPosition(offset);
156 if (flag)
157 {
158 flag &= Main.sleepingManager.GetNextPlayerStackIndexInCoords((anchorPosition + new Vector2(0f, -2f)).ToTileCoordinates()) < 2;
159 }
160 if (!flag)
161 {
162 return;
163 }
164 if (isSleeping && player.Bottom == anchorPosition)
165 {
166 StopSleeping(player);
167 return;
168 }
169 player.StopVanityActions();
172 if (player.mount.Active)
173 {
174 player.mount.Dismount(player);
175 }
176 player.Bottom = anchorPosition;
177 player.ChangeDir(targetDirection);
178 Main.sleepingManager.AddPlayerAndGetItsStackedIndexInCoords(player.whoAmI, new Point(x, y), out sleepingIndex);
179 player.velocity = Vector2.Zero;
180 player.gravDir = 1f;
182 visualOffsetOfBedBase = visualoffset;
183 if (Main.myPlayer == player.whoAmI)
184 {
185 NetMessage.SendData(13, -1, -1, null, player.whoAmI);
186 }
187 }
188
189 public static bool GetSleepingTargetInfo(int x, int y, out int targetDirection, out Vector2 anchorPosition, out Vector2 visualoffset)
190 {
191 Tile tileSafely = Framing.GetTileSafely(x, y);
192 if (!TileID.Sets.CanBeSleptIn[tileSafely.type] || !tileSafely.active())
193 {
194 targetDirection = 1;
195 anchorPosition = default(Vector2);
196 visualoffset = default(Vector2);
197 return false;
198 }
199 int num = y;
200 int num2 = x - tileSafely.frameX % 72 / 18;
201 if (tileSafely.frameY % 36 != 0)
202 {
203 num--;
204 }
205 targetDirection = 1;
206 int num3 = tileSafely.frameX / 72;
207 int num4 = num2;
208 switch (num3)
209 {
210 case 0:
211 targetDirection = -1;
212 num4++;
213 break;
214 case 1:
215 num4 += 2;
216 break;
217 }
218 anchorPosition = new Point(num4, num + 1).ToWorldCoordinates(8f, 16f);
219 visualoffset = SetOffsetbyBed(tileSafely.frameY / 36);
220 return true;
221 }
222
223 private static Vector2 SetOffsetbyBed(int bedStyle)
224 {
225 switch (bedStyle)
226 {
227 default:
228 return new Vector2(-9f, 1f);
229 case 8:
230 return new Vector2(-11f, 1f);
231 case 10:
232 return new Vector2(-9f, -1f);
233 case 11:
234 return new Vector2(-11f, 1f);
235 case 13:
236 return new Vector2(-11f, -3f);
237 case 15:
238 case 16:
239 case 17:
240 return new Vector2(-7f, -3f);
241 case 18:
242 return new Vector2(-9f, -3f);
243 case 19:
244 return new Vector2(-3f, -1f);
245 case 20:
246 return new Vector2(-9f, -5f);
247 case 21:
248 return new Vector2(-9f, 5f);
249 case 22:
250 return new Vector2(-7f, 1f);
251 case 23:
252 return new Vector2(-5f, -1f);
253 case 24:
254 case 25:
255 return new Vector2(-7f, 1f);
256 case 27:
257 return new Vector2(-9f, 3f);
258 case 28:
259 return new Vector2(-9f, 5f);
260 case 29:
261 return new Vector2(-11f, -1f);
262 case 30:
263 return new Vector2(-9f, 3f);
264 case 31:
265 return new Vector2(-7f, 5f);
266 case 32:
267 return new Vector2(-7f, -1f);
268 case 34:
269 case 35:
270 case 36:
271 case 37:
272 return new Vector2(-13f, 1f);
273 case 38:
274 return new Vector2(-11f, -3f);
275 }
276 }
277}
const double PI
Definition Math.cs:16
Vector2 Bottom
Definition Entity.cs:115
static Tile GetTileSafely(Vector2 position)
Definition Framing.cs:419
static ? bool[] ForcesBreaksSleeping
Definition ItemID.cs:116
static bool[] CanBeSleptIn
Definition TileID.cs:137
int fishingPole
Definition Item.cs:97
bool noMelee
Definition Item.cs:255
int damage
Definition Item.cs:167
static AnchoredEntitiesCollection sleepingManager
Definition Main.cs:2257
static int myPlayer
Definition Main.cs:1801
static bool dayTime
Definition Main.cs:1282
static bool bloodMoon
Definition Main.cs:1296
static bool eclipse
Definition Main.cs:1312
void Dismount(Player mountedPlayer)
Definition Mount.cs:5229
bool Active
Definition Mount.cs:345
static bool AnyDanger(bool quickBossNPCCheck=false, bool ignorePillarsAndMoonlordCountdown=false)
Definition NPC.cs:77014
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 RemoveAllFishingBobbers()
Definition Player.cs:31304
void RemoveAllGrapplingHooks()
Definition Player.cs:31290
void ChangeDir(int dir)
Definition Player.cs:40136
void StopVanityActions(bool multiplayerBroadcast=true)
Definition Player.cs:31204
short frameY
Definition Tile.cs:24
ushort type
Definition Tile.cs:8
bool active()
Definition Tile.cs:565
void StartSleeping(Player player, int x, int y)
static bool GetSleepingTargetInfo(int x, int y, out int targetDirection, out Vector2 anchorPosition, out Vector2 visualoffset)
void StopSleeping(Player player, bool multiplayerBroadcast=true)
void SetIsSleepingAndAdjustPlayerRotation(Player player, bool state)
void GetSleepingOffsetInfo(Player player, out Vector2 posOffset)