Beispiel #1
0
        public static Vector2 TileCollision(Vector2 Position, Vector2 Velocity, int Width, int Height, bool fallThrough = false, bool fall2 = false)
        {
            Vector2 vector = new Vector2(-9000f, -9000f);

            if (TMod.RunMethod(TMod.WorldHooks.TileCollision, vector, Position, Velocity, Width, Height, fallThrough, fall2))
            {
                vector = (Vector2)Codable.customMethodReturn;
                if (vector != new Vector2(-9000f, -9000f))
                {
                    return(vector);
                }
            }
            up   = false;
            down = false;
            Vector2 result  = Velocity;
            Vector2 vector2 = Velocity;
            Vector2 vector3 = Position + Velocity;
            Vector2 vector4 = Position;
            int     num     = (int)(Position.X / 16f) - 1;
            int     num2    = (int)((Position.X + (float)Width) / 16f) + 2;
            int     num3    = (int)(Position.Y / 16f) - 1;
            int     num4    = (int)((Position.Y + (float)Height) / 16f) + 2;
            int     num5    = -1;
            int     num6    = -1;
            int     num7    = -1;
            int     num8    = -1;

            if (num < 0)
            {
                num = 0;
            }
            if (num2 > Main.maxTilesX)
            {
                num2 = Main.maxTilesX;
            }
            if (num3 < 0)
            {
                num3 = 0;
            }
            if (num4 > Main.maxTilesY)
            {
                num4 = Main.maxTilesY;
            }
            Vector2 vector5 = default(Vector2);

            for (int i = num; i < num2; i++)
            {
                for (int j = num3; j < num4; j++)
                {
                    if (Main.tile[i, j] == null || !Main.tile[i, j].active || (!Main.tileSolid[Main.tile[i, j].type] && (!Main.tileSolidTop[Main.tile[i, j].type] || Main.tile[i, j].frameY != 0)))
                    {
                        continue;
                    }
                    vector5.X = i * 16;
                    vector5.Y = j * 16;
                    if (!(vector3.X + (float)Width > vector5.X) || !(vector3.X < vector5.X + 16f) || !(vector3.Y + (float)Height > vector5.Y) || !(vector3.Y < vector5.Y + 16f))
                    {
                        continue;
                    }
                    if (vector4.Y + (float)Height <= vector5.Y)
                    {
                        down = true;
                        if (!Main.tileSolidTop[Main.tile[i, j].type] || !fallThrough || (Velocity.Y > 1f && !fall2))
                        {
                            num7 = i;
                            num8 = j;
                            if (num7 != num5)
                            {
                                result.Y = vector5.Y - (vector4.Y + (float)Height);
                            }
                        }
                    }
                    else if (vector4.X + (float)Width <= vector5.X && !Main.tileSolidTop[Main.tile[i, j].type])
                    {
                        num5 = i;
                        num6 = j;
                        if (num6 != num8)
                        {
                            result.X = vector5.X - (vector4.X + (float)Width);
                        }
                        if (num7 == num5)
                        {
                            result.Y = vector2.Y;
                        }
                    }
                    else if (vector4.X >= vector5.X + 16f && !Main.tileSolidTop[Main.tile[i, j].type])
                    {
                        num5 = i;
                        num6 = j;
                        if (num6 != num8)
                        {
                            result.X = vector5.X + 16f - vector4.X;
                        }
                        if (num7 == num5)
                        {
                            result.Y = vector2.Y;
                        }
                    }
                    else if (vector4.Y >= vector5.Y + 16f && !Main.tileSolidTop[Main.tile[i, j].type])
                    {
                        up       = true;
                        num7     = i;
                        num8     = j;
                        result.Y = vector5.Y + 16f - vector4.Y;
                        if (num8 == num6)
                        {
                            result.X = vector2.X;
                        }
                    }
                }
            }
            return(result);
        }