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); }