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

◆ SlopeCollision()

static Vector4 Terraria.Collision.SlopeCollision ( Vector2 Position,
Vector2 Velocity,
int Width,
int Height,
float gravity = 0f,
bool fall = false )
inlinestatic

Definition at line 1580 of file Collision.cs.

1581 {
1582 stair = false;
1583 stairFall = false;
1584 bool[] array = new bool[5];
1585 float y = Position.Y;
1586 float y2 = Position.Y;
1587 sloping = false;
1590 Vector2 vector3 = Velocity;
1591 int value = (int)(Position.X / 16f) - 1;
1592 int value2 = (int)((Position.X + (float)Width) / 16f) + 2;
1593 int value3 = (int)(Position.Y / 16f) - 1;
1594 int value4 = (int)((Position.Y + (float)Height) / 16f) + 2;
1595 int num = Utils.Clamp(value, 0, Main.maxTilesX - 1);
1596 value2 = Utils.Clamp(value2, 0, Main.maxTilesX - 1);
1597 value3 = Utils.Clamp(value3, 0, Main.maxTilesY - 1);
1598 value4 = Utils.Clamp(value4, 0, Main.maxTilesY - 1);
1599 Vector2 vector4 = default(Vector2);
1600 for (int i = num; i < value2; i++)
1601 {
1602 for (int j = value3; j < value4; j++)
1603 {
1604 if (Main.tile[i, j] == null || !Main.tile[i, j].active() || Main.tile[i, j].inActive() || (!Main.tileSolid[Main.tile[i, j].type] && (!Main.tileSolidTop[Main.tile[i, j].type] || Main.tile[i, j].frameY != 0)))
1605 {
1606 continue;
1607 }
1608 vector4.X = i * 16;
1609 vector4.Y = j * 16;
1610 int num2 = 16;
1611 if (Main.tile[i, j].halfBrick())
1612 {
1613 vector4.Y += 8f;
1614 num2 -= 8;
1615 }
1616 if (!(Position.X + (float)Width > vector4.X) || !(Position.X < vector4.X + 16f) || !(Position.Y + (float)Height > vector4.Y) || !(Position.Y < vector4.Y + (float)num2))
1617 {
1618 continue;
1619 }
1620 bool flag = true;
1621 if (TileID.Sets.Platforms[Main.tile[i, j].type])
1622 {
1623 if (Velocity.Y < 0f)
1624 {
1625 flag = false;
1626 }
1627 if (Position.Y + (float)Height < (float)(j * 16) || Position.Y + (float)Height - (1f + Math.Abs(Velocity.X)) > (float)(j * 16 + 16))
1628 {
1629 flag = false;
1630 }
1631 if (((Main.tile[i, j].slope() == 1 && Velocity.X >= 0f) || (Main.tile[i, j].slope() == 2 && Velocity.X <= 0f)) && (Position.Y + (float)Height) / 16f - 1f == (float)j)
1632 {
1633 flag = false;
1634 }
1635 }
1636 if (!flag)
1637 {
1638 continue;
1639 }
1640 bool flag2 = false;
1641 if (fall && TileID.Sets.Platforms[Main.tile[i, j].type])
1642 {
1643 flag2 = true;
1644 }
1645 int num3 = Main.tile[i, j].slope();
1646 vector4.X = i * 16;
1647 vector4.Y = j * 16;
1648 if (!(Position.X + (float)Width > vector4.X) || !(Position.X < vector4.X + 16f) || !(Position.Y + (float)Height > vector4.Y) || !(Position.Y < vector4.Y + 16f))
1649 {
1650 continue;
1651 }
1652 float num4 = 0f;
1653 if (num3 == 3 || num3 == 4)
1654 {
1655 if (num3 == 3)
1656 {
1657 num4 = Position.X - vector4.X;
1658 }
1659 if (num3 == 4)
1660 {
1661 num4 = vector4.X + 16f - (Position.X + (float)Width);
1662 }
1663 if (num4 >= 0f)
1664 {
1665 if (Position.Y <= vector4.Y + 16f - num4)
1666 {
1667 float num5 = vector4.Y + 16f - vector.Y - num4;
1668 if (Position.Y + num5 > y2)
1669 {
1670 vector2.Y = Position.Y + num5;
1671 y2 = vector2.Y;
1672 if (vector3.Y < 0.0101f)
1673 {
1674 vector3.Y = 0.0101f;
1675 }
1676 array[num3] = true;
1677 }
1678 }
1679 }
1680 else if (Position.Y > vector4.Y)
1681 {
1682 float num6 = vector4.Y + 16f;
1683 if (vector2.Y < num6)
1684 {
1685 vector2.Y = num6;
1686 if (vector3.Y < 0.0101f)
1687 {
1688 vector3.Y = 0.0101f;
1689 }
1690 }
1691 }
1692 }
1693 if (num3 != 1 && num3 != 2)
1694 {
1695 continue;
1696 }
1697 if (num3 == 1)
1698 {
1699 num4 = Position.X - vector4.X;
1700 }
1701 if (num3 == 2)
1702 {
1703 num4 = vector4.X + 16f - (Position.X + (float)Width);
1704 }
1705 if (num4 >= 0f)
1706 {
1707 if (!(Position.Y + (float)Height >= vector4.Y + num4))
1708 {
1709 continue;
1710 }
1711 float num7 = vector4.Y - (vector.Y + (float)Height) + num4;
1712 if (!(Position.Y + num7 < y))
1713 {
1714 continue;
1715 }
1716 if (flag2)
1717 {
1718 stairFall = true;
1719 continue;
1720 }
1721 if (TileID.Sets.Platforms[Main.tile[i, j].type])
1722 {
1723 stair = true;
1724 }
1725 else
1726 {
1727 stair = false;
1728 }
1729 vector2.Y = Position.Y + num7;
1730 y = vector2.Y;
1731 if (vector3.Y > 0f)
1732 {
1733 vector3.Y = 0f;
1734 }
1735 array[num3] = true;
1736 continue;
1737 }
1738 if (TileID.Sets.Platforms[Main.tile[i, j].type] && !(Position.Y + (float)Height - 4f - Math.Abs(Velocity.X) <= vector4.Y))
1739 {
1740 if (flag2)
1741 {
1742 stairFall = true;
1743 }
1744 continue;
1745 }
1746 float num8 = vector4.Y - (float)Height;
1747 if (!(vector2.Y > num8))
1748 {
1749 continue;
1750 }
1751 if (flag2)
1752 {
1753 stairFall = true;
1754 continue;
1755 }
1756 if (TileID.Sets.Platforms[Main.tile[i, j].type])
1757 {
1758 stair = true;
1759 }
1760 else
1761 {
1762 stair = false;
1763 }
1764 vector2.Y = num8;
1765 if (vector3.Y > 0f)
1766 {
1767 vector3.Y = 0f;
1768 }
1769 }
1770 }
1771 Vector2 position = Position;
1772 Vector2 velocity = vector2 - Position;
1773 Vector2 vector5 = TileCollision(position, velocity, Width, Height);
1774 if (vector5.Y > velocity.Y)
1775 {
1776 float num9 = velocity.Y - vector5.Y;
1777 vector2.Y = Position.Y + vector5.Y;
1778 if (array[1])
1779 {
1780 vector2.X = Position.X - num9;
1781 }
1782 if (array[2])
1783 {
1784 vector2.X = Position.X + num9;
1785 }
1786 vector3.X = 0f;
1787 vector3.Y = 0f;
1788 up = false;
1789 }
1790 else if (vector5.Y < velocity.Y)
1791 {
1792 float num10 = vector5.Y - velocity.Y;
1793 vector2.Y = Position.Y + vector5.Y;
1794 if (array[3])
1795 {
1796 vector2.X = Position.X - num10;
1797 }
1798 if (array[4])
1799 {
1800 vector2.X = Position.X + num10;
1801 }
1802 vector3.X = 0f;
1803 vector3.Y = 0f;
1804 }
1805 return new Vector4(vector2, vector3.X, vector3.Y);
1806 }
static double Abs(double value)
static bool stair
Definition Collision.cs:20
static bool up
Definition Collision.cs:32
static bool stairFall
Definition Collision.cs:22
static bool sloping
Definition Collision.cs:28
static Vector2 TileCollision(Vector2 Position, Vector2 Velocity, int Width, int Height, bool fallThrough=false, bool fall2=false, int gravDir=1)
static bool[] Platforms
Definition TileID.cs:163

References System.Math.Abs(), System.array, Terraria.Main.maxTilesX, Terraria.Main.maxTilesY, Terraria.ID.TileID.Sets.Platforms, Terraria.Collision.sloping, Terraria.Collision.stair, Terraria.Collision.stairFall, Terraria.Main.tile, Terraria.Collision.TileCollision(), Terraria.Main.tileSolid, Terraria.Main.tileSolidTop, Terraria.Collision.up, System.value, Microsoft.Xna.Framework.Vector2.X, and Microsoft.Xna.Framework.Vector2.Y.

Referenced by Terraria.Player.CheckForGoodTeleportationSpot(), Terraria.NPC.Collision_MoveSlopesAndStairFall(), Terraria.NPC.Collision_MoveSnailOnSlopes(), Terraria.Collision.FindCollisionTile(), Terraria.Gore.Gore_UpdateLeaf(), Terraria.Projectile.HandleMovement(), Terraria.Collision.IsClearSpotTest(), Terraria.Item.MoveInWorld(), Terraria.Player.SlopingCollision(), Terraria.Gore.Update(), and Terraria.Projectile.UpdatePosition().