/************************************************************************* * ModernUO * * Copyright (C) 2019-2020 - ModernUO Development Team * * Email: hi@modernuo.com * * File: Rectangle2D.cs - Created: 2020/05/31 - Updated: 2020/05/31 * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see . * *************************************************************************/ namespace Server { [NoSort] [Parsable] [PropertyObject] public struct Rectangle2D { private Point2D m_Start; private Point2D m_End; public Rectangle2D(IPoint2D start, IPoint2D end) { m_Start = new Point2D(start); m_End = new Point2D(end); } public Rectangle2D(int x, int y, int width, int height) { m_Start = new Point2D(x, y); m_End = new Point2D(x + width, y + height); } public void Set(int x, int y, int width, int height) { m_Start = new Point2D(x, y); m_End = new Point2D(x + width, y + height); } public static Rectangle2D Parse(string value) { var start = value.IndexOf('('); var end = value.IndexOf(',', start + 1); Utility.ToInt32(value.Substring(start + 1, end - (start + 1)).Trim(), out int x); start = end; end = value.IndexOf(',', start + 1); Utility.ToInt32(value.Substring(start + 1, end - (start + 1)).Trim(), out int y); start = end; end = value.IndexOf(',', start + 1); Utility.ToInt32(value.Substring(start + 1, end - (start + 1)).Trim(), out int w); start = end; end = value.IndexOf(')', start + 1); Utility.ToInt32(value.Substring(start + 1, end - (start + 1)).Trim(), out int h); return new Rectangle2D(x, y, w, h); } [CommandProperty(AccessLevel.Counselor)] public Point2D Start { get => m_Start; set => m_Start = value; } [CommandProperty(AccessLevel.Counselor)] public Point2D End { get => m_End; set => m_End = value; } [CommandProperty(AccessLevel.Counselor)] public int X { get => m_Start.m_X; set => m_Start.m_X = value; } [CommandProperty(AccessLevel.Counselor)] public int Y { get => m_Start.m_Y; set => m_Start.m_Y = value; } [CommandProperty(AccessLevel.Counselor)] public int Width { get => m_End.m_X - m_Start.m_X; set => m_End.m_X = m_Start.m_X + value; } [CommandProperty(AccessLevel.Counselor)] public int Height { get => m_End.m_Y - m_Start.m_Y; set => m_End.m_Y = m_Start.m_Y + value; } public void MakeHold(Rectangle2D r) { if (r.m_Start.m_X < m_Start.m_X) m_Start.m_X = r.m_Start.m_X; if (r.m_Start.m_Y < m_Start.m_Y) m_Start.m_Y = r.m_Start.m_Y; if (r.m_End.m_X > m_End.m_X) m_End.m_X = r.m_End.m_X; if (r.m_End.m_Y > m_End.m_Y) m_End.m_Y = r.m_End.m_Y; } public bool Contains(Point3D p) => m_Start.m_X <= p.m_X && m_Start.m_Y <= p.m_Y && m_End.m_X > p.m_X && m_End.m_Y > p.m_Y; public bool Contains(Point2D p) => m_Start.m_X <= p.m_X && m_Start.m_Y <= p.m_Y && m_End.m_X > p.m_X && m_End.m_Y > p.m_Y; public bool Contains(IPoint2D p) => m_Start <= p && m_End > p; public override string ToString() => $"({X}, {Y})+({Width}, {Height})"; } }