Terraria 1.4.0.5 Source Code
This commit is contained in:
commit
05205f009e
1059 changed files with 563450 additions and 0 deletions
238
GameContent/PlayerSleepingHelper.cs
Normal file
238
GameContent/PlayerSleepingHelper.cs
Normal file
|
@ -0,0 +1,238 @@
|
|||
// Decompiled with JetBrains decompiler
|
||||
// Type: Terraria.GameContent.PlayerSleepingHelper
|
||||
// Assembly: Terraria, Version=1.4.0.5, Culture=neutral, PublicKeyToken=null
|
||||
// MVID: 67F9E73E-0A81-4937-A22C-5515CD405A83
|
||||
// Assembly location: C:\Users\mikeyisbaeyt\Downloads\depotdownloader-2.4.5\depots\105601\6707058\Terraria.exe
|
||||
|
||||
using Microsoft.Xna.Framework;
|
||||
using Terraria.ID;
|
||||
|
||||
namespace Terraria.GameContent
|
||||
{
|
||||
public struct PlayerSleepingHelper
|
||||
{
|
||||
public const int BedSleepingMaxDistance = 96;
|
||||
public const int TimeToFullyFallAsleep = 120;
|
||||
public bool isSleeping;
|
||||
public int sleepingIndex;
|
||||
public int timeSleeping;
|
||||
public Vector2 visualOffsetOfBedBase;
|
||||
|
||||
public bool FullyFallenAsleep => this.isSleeping && this.timeSleeping >= 120;
|
||||
|
||||
public void GetSleepingOffsetInfo(Player player, out Vector2 posOffset)
|
||||
{
|
||||
if (this.isSleeping)
|
||||
posOffset = this.visualOffsetOfBedBase * player.Directions + new Vector2(0.0f, (float) ((double) this.sleepingIndex * (double) player.gravDir * -4.0));
|
||||
else
|
||||
posOffset = Vector2.Zero;
|
||||
}
|
||||
|
||||
private bool DoesPlayerHaveReasonToActUpInBed(Player player) => NPC.AnyDanger(true) || Main.bloodMoon && !Main.dayTime || Main.eclipse && Main.dayTime || player.itemAnimation > 0;
|
||||
|
||||
public void SetIsSleepingAndAdjustPlayerRotation(Player player, bool state)
|
||||
{
|
||||
if (this.isSleeping == state)
|
||||
return;
|
||||
this.isSleeping = state;
|
||||
if (state)
|
||||
{
|
||||
player.fullRotation = 1.570796f * (float) -player.direction;
|
||||
}
|
||||
else
|
||||
{
|
||||
player.fullRotation = 0.0f;
|
||||
this.visualOffsetOfBedBase = new Vector2();
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateState(Player player)
|
||||
{
|
||||
if (!this.isSleeping)
|
||||
{
|
||||
this.timeSleeping = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
++this.timeSleeping;
|
||||
if (this.DoesPlayerHaveReasonToActUpInBed(player))
|
||||
this.timeSleeping = 0;
|
||||
Point tileCoordinates = (player.Bottom + new Vector2(0.0f, -2f)).ToTileCoordinates();
|
||||
int targetDirection;
|
||||
Vector2 visualoffset;
|
||||
if (!PlayerSleepingHelper.GetSleepingTargetInfo(tileCoordinates.X, tileCoordinates.Y, out targetDirection, out Vector2 _, out visualoffset))
|
||||
{
|
||||
this.StopSleeping(player);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (player.controlLeft || player.controlRight || player.controlUp || player.controlDown || player.controlJump || player.pulley || player.mount.Active || targetDirection != player.direction)
|
||||
this.StopSleeping(player);
|
||||
bool flag = false;
|
||||
if (player.itemAnimation > 0)
|
||||
{
|
||||
Item heldItem = player.HeldItem;
|
||||
if (heldItem.damage > 0 && !heldItem.noMelee)
|
||||
flag = true;
|
||||
if (heldItem.fishingPole > 0)
|
||||
flag = true;
|
||||
bool? nullable = ItemID.Sets.ForcesBreaksSleeping[heldItem.type];
|
||||
if (nullable.HasValue)
|
||||
flag = nullable.Value;
|
||||
}
|
||||
if (flag)
|
||||
this.StopSleeping(player);
|
||||
if (Main.sleepingManager.GetNextPlayerStackIndexInCoords(tileCoordinates) >= 2)
|
||||
this.StopSleeping(player);
|
||||
if (!this.isSleeping)
|
||||
return;
|
||||
this.visualOffsetOfBedBase = visualoffset;
|
||||
Main.sleepingManager.AddPlayerAndGetItsStackedIndexInCoords(player.whoAmI, tileCoordinates, out this.sleepingIndex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void StopSleeping(Player player, bool multiplayerBroadcast = true)
|
||||
{
|
||||
if (!this.isSleeping)
|
||||
return;
|
||||
this.SetIsSleepingAndAdjustPlayerRotation(player, false);
|
||||
this.timeSleeping = 0;
|
||||
this.sleepingIndex = -1;
|
||||
this.visualOffsetOfBedBase = new Vector2();
|
||||
if (!multiplayerBroadcast || Main.myPlayer != player.whoAmI)
|
||||
return;
|
||||
NetMessage.SendData(13, number: player.whoAmI);
|
||||
}
|
||||
|
||||
public void StartSleeping(Player player, int x, int y)
|
||||
{
|
||||
int targetDirection;
|
||||
Vector2 anchorPosition;
|
||||
Vector2 visualoffset;
|
||||
PlayerSleepingHelper.GetSleepingTargetInfo(x, y, out targetDirection, out anchorPosition, out visualoffset);
|
||||
Vector2 offset = anchorPosition - player.Bottom;
|
||||
bool position = player.CanSnapToPosition(offset);
|
||||
if (position)
|
||||
position &= Main.sleepingManager.GetNextPlayerStackIndexInCoords((anchorPosition + new Vector2(0.0f, -2f)).ToTileCoordinates()) < 2;
|
||||
if (!position)
|
||||
return;
|
||||
if (this.isSleeping && player.Bottom == anchorPosition)
|
||||
{
|
||||
this.StopSleeping(player);
|
||||
}
|
||||
else
|
||||
{
|
||||
player.StopVanityActions();
|
||||
player.RemoveAllGrapplingHooks();
|
||||
player.RemoveAllFishingBobbers();
|
||||
if (player.mount.Active)
|
||||
player.mount.Dismount(player);
|
||||
player.Bottom = anchorPosition;
|
||||
player.ChangeDir(targetDirection);
|
||||
Main.sleepingManager.AddPlayerAndGetItsStackedIndexInCoords(player.whoAmI, new Point(x, y), out this.sleepingIndex);
|
||||
player.velocity = Vector2.Zero;
|
||||
player.gravDir = 1f;
|
||||
this.SetIsSleepingAndAdjustPlayerRotation(player, true);
|
||||
this.visualOffsetOfBedBase = visualoffset;
|
||||
if (Main.myPlayer != player.whoAmI)
|
||||
return;
|
||||
NetMessage.SendData(13, number: player.whoAmI);
|
||||
}
|
||||
}
|
||||
|
||||
public static bool GetSleepingTargetInfo(
|
||||
int x,
|
||||
int y,
|
||||
out int targetDirection,
|
||||
out Vector2 anchorPosition,
|
||||
out Vector2 visualoffset)
|
||||
{
|
||||
Tile tileSafely = Framing.GetTileSafely(x, y);
|
||||
if (!TileID.Sets.CanBeSleptIn[(int) tileSafely.type] || !tileSafely.active())
|
||||
{
|
||||
targetDirection = 1;
|
||||
anchorPosition = new Vector2();
|
||||
visualoffset = new Vector2();
|
||||
return false;
|
||||
}
|
||||
int num1 = x;
|
||||
int num2 = y;
|
||||
int num3 = (int) tileSafely.frameX % 72 / 18;
|
||||
int num4 = num1 - num3;
|
||||
if ((int) tileSafely.frameY % 36 != 0)
|
||||
--num2;
|
||||
targetDirection = 1;
|
||||
int num5 = (int) tileSafely.frameX / 72;
|
||||
int x1 = num4;
|
||||
switch (num5)
|
||||
{
|
||||
case 0:
|
||||
targetDirection = -1;
|
||||
++x1;
|
||||
break;
|
||||
case 1:
|
||||
x1 += 2;
|
||||
break;
|
||||
}
|
||||
anchorPosition = new Point(x1, num2 + 1).ToWorldCoordinates(autoAddY: 16f);
|
||||
visualoffset = PlayerSleepingHelper.SetOffsetbyBed((int) tileSafely.frameY / 36);
|
||||
return true;
|
||||
}
|
||||
|
||||
private static Vector2 SetOffsetbyBed(int bedStyle)
|
||||
{
|
||||
switch (bedStyle)
|
||||
{
|
||||
case 8:
|
||||
return new Vector2(-11f, 1f);
|
||||
case 10:
|
||||
return new Vector2(-9f, -1f);
|
||||
case 11:
|
||||
return new Vector2(-11f, 1f);
|
||||
case 13:
|
||||
return new Vector2(-11f, -3f);
|
||||
case 15:
|
||||
case 16:
|
||||
case 17:
|
||||
return new Vector2(-7f, -3f);
|
||||
case 18:
|
||||
return new Vector2(-9f, -3f);
|
||||
case 19:
|
||||
return new Vector2(-3f, -1f);
|
||||
case 20:
|
||||
return new Vector2(-9f, -5f);
|
||||
case 21:
|
||||
return new Vector2(-9f, 5f);
|
||||
case 22:
|
||||
return new Vector2(-7f, 1f);
|
||||
case 23:
|
||||
return new Vector2(-5f, -1f);
|
||||
case 24:
|
||||
case 25:
|
||||
return new Vector2(-7f, 1f);
|
||||
case 27:
|
||||
return new Vector2(-9f, 3f);
|
||||
case 28:
|
||||
return new Vector2(-9f, 5f);
|
||||
case 29:
|
||||
return new Vector2(-11f, -1f);
|
||||
case 30:
|
||||
return new Vector2(-9f, 3f);
|
||||
case 31:
|
||||
return new Vector2(-7f, 5f);
|
||||
case 32:
|
||||
return new Vector2(-7f, -1f);
|
||||
case 34:
|
||||
case 35:
|
||||
case 36:
|
||||
case 37:
|
||||
return new Vector2(-13f, 1f);
|
||||
case 38:
|
||||
return new Vector2(-11f, -3f);
|
||||
default:
|
||||
return new Vector2(-9f, 1f);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue