| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510 |
- using System.Drawing;
- using System.IO.Compression;
- using System.Runtime.Serialization.Formatters.Binary;
- public static class Functions
- {
- public static bool CompareBytes(byte[] a, byte[] b)
- {
- if (a == b) return true;
- if (a == null || b == null || a.Length != b.Length) return false;
- for (int i = 0; i < a.Length; i++) if (a[i] != b[i]) return false;
- return true;
- }
- public static string ConvertByteSize(double byteCount)
- {
- string size = "0 Bytes";
- if (byteCount >= 1073741824.0)
- size = String.Format("{0:##.##}", byteCount / 1073741824.0) + " GB";
- else if (byteCount >= 1048576.0)
- size = String.Format("{0:##.##}", byteCount / 1048576.0) + " MB";
- else if (byteCount >= 1024.0)
- size = String.Format("{0:##.##}", byteCount / 1024.0) + " KB";
- else if (byteCount > 0 && byteCount < 1024.0)
- size = byteCount.ToString() + " Bytes";
- return size;
- }
- public static bool TryParse(string s, out Point temp)
- {
- temp = Point.Empty;
- if (String.IsNullOrWhiteSpace(s)) return false;
- string[] data = s.Split(',');
- if (data.Length <= 1) return false;
- if (!Int32.TryParse(data[0], out int tempX))
- return false;
- if (!Int32.TryParse(data[1], out int tempY))
- return false;
- temp = new Point(tempX, tempY);
- return true;
- }
- public static Point Subtract(this Point p1, Point p2)
- {
- return new Point(p1.X - p2.X, p1.Y - p2.Y);
- }
- public static Point Subtract(this Point p1, int x, int y)
- {
- return new Point(p1.X - x, p1.Y - y);
- }
- public static Point Add(this Point p1, Point p2)
- {
- return new Point(p1.X + p2.X, p1.Y + p2.Y);
- }
- public static Point Add(this Point p1, int x, int y)
- {
- return new Point(p1.X + x, p1.Y + y);
- }
- public static string PointToString(Point p)
- {
- return String.Format("{0}, {1}", p.X, p.Y);
- }
- public static bool InRange(Point a, Point b, int i)
- {
- return Math.Abs(a.X - b.X) <= i && Math.Abs(a.Y - b.Y) <= i;
- }
- public static bool FacingEachOther(MirDirection dirA, Point pointA, MirDirection dirB, Point pointB)
- {
- if (dirA == DirectionFromPoint(pointA, pointB) && dirB == DirectionFromPoint(pointB, pointA))
- {
- return true;
- }
- return false;
- }
- public static string PrintTimeSpanFromSeconds(double secs, bool accurate = true)
- {
- TimeSpan t = TimeSpan.FromSeconds(secs);
- string answer;
- if (t.TotalMinutes < 1.0)
- {
- answer = string.Format("{0}s", t.Seconds);
- }
- else if (t.TotalHours < 1.0)
- {
- answer = accurate ? string.Format("{0}m {1:D2}s", t.Minutes, t.Seconds) : string.Format("{0}m", t.Minutes);
- }
- else if (t.TotalDays < 1.0)
- {
- answer = accurate ? string.Format("{0}h {1:D2}m {2:D2}s", (int)t.Hours, t.Minutes, t.Seconds) : string.Format("{0}h {1:D2}m", (int)t.TotalHours, t.Minutes);
- }
- else // more than 1 day
- {
- answer = accurate ? string.Format("{0}d {1:D2}h {2:D2}m {3:D2}s", (int)t.Days, (int)t.Hours, t.Minutes, t.Seconds) : string.Format("{0}d {1}h {2:D2}m", (int)t.TotalDays, (int)t.Hours, t.Minutes);
- }
- return answer;
- }
- public static string PrintTimeSpanFromMilliSeconds(double milliSeconds)
- {
- TimeSpan t = TimeSpan.FromMilliseconds(milliSeconds);
- string answer;
- if (t.TotalMinutes < 1.0)
- {
- answer = string.Format("{0}.{1}s", t.Seconds, (decimal)(t.Milliseconds / 100));
- }
- else if (t.TotalHours < 1.0)
- {
- answer = string.Format("{0}m {1:D2}s", t.TotalMinutes, t.Seconds);
- }
- else if (t.TotalDays < 1.0)
- {
- answer = string.Format("{0}h {1:D2}m {2:D2}s", (int)t.TotalHours, t.Minutes, t.Seconds);
- }
- else
- {
- answer = string.Format("{0}d {1}h {2:D2}m {3:D2}s", (int)t.Days, (int)t.Hours, t.Minutes, t.Seconds);
- }
- return answer;
- }
- public static MirDirection PreviousDir(MirDirection d)
- {
- switch (d)
- {
- case MirDirection.Up:
- return MirDirection.UpLeft;
- case MirDirection.UpRight:
- return MirDirection.Up;
- case MirDirection.Right:
- return MirDirection.UpRight;
- case MirDirection.DownRight:
- return MirDirection.Right;
- case MirDirection.Down:
- return MirDirection.DownRight;
- case MirDirection.DownLeft:
- return MirDirection.Down;
- case MirDirection.Left:
- return MirDirection.DownLeft;
- case MirDirection.UpLeft:
- return MirDirection.Left;
- default: return d;
- }
- }
- public static MirDirection NextDir(MirDirection d)
- {
- switch (d)
- {
- case MirDirection.Up:
- return MirDirection.UpRight;
- case MirDirection.UpRight:
- return MirDirection.Right;
- case MirDirection.Right:
- return MirDirection.DownRight;
- case MirDirection.DownRight:
- return MirDirection.Down;
- case MirDirection.Down:
- return MirDirection.DownLeft;
- case MirDirection.DownLeft:
- return MirDirection.Left;
- case MirDirection.Left:
- return MirDirection.UpLeft;
- case MirDirection.UpLeft:
- return MirDirection.Up;
- default: return d;
- }
- }
- public static MirDirection DirectionFromPoint(Point source, Point dest)
- {
- if (source.X < dest.X)
- {
- if (source.Y < dest.Y)
- return MirDirection.DownRight;
- if (source.Y > dest.Y)
- return MirDirection.UpRight;
- return MirDirection.Right;
- }
- if (source.X > dest.X)
- {
- if (source.Y < dest.Y)
- return MirDirection.DownLeft;
- if (source.Y > dest.Y)
- return MirDirection.UpLeft;
- return MirDirection.Left;
- }
- return source.Y < dest.Y ? MirDirection.Down : MirDirection.Up;
- }
- public static MirDirection ShiftDirection(MirDirection dir, int i)
- {
- return (MirDirection)(((int)dir + i + 8) % 8);
- }
- public static Size Add(this Size p1, Size p2)
- {
- return new Size(p1.Width + p2.Width, p1.Height + p2.Height);
- }
- public static Size Add(this Size p1, int width, int height)
- {
- return new Size(p1.Width + width, p1.Height + height);
- }
- public static Point PointMove(Point p, MirDirection d, int i)
- {
- switch (d)
- {
- case MirDirection.Up:
- p.Offset(0, -i);
- break;
- case MirDirection.UpRight:
- p.Offset(i, -i);
- break;
- case MirDirection.Right:
- p.Offset(i, 0);
- break;
- case MirDirection.DownRight:
- p.Offset(i, i);
- break;
- case MirDirection.Down:
- p.Offset(0, i);
- break;
- case MirDirection.DownLeft:
- p.Offset(-i, i);
- break;
- case MirDirection.Left:
- p.Offset(-i, 0);
- break;
- case MirDirection.UpLeft:
- p.Offset(-i, -i);
- break;
- }
- return p;
- }
- public static Point Left(Point p, MirDirection d)
- {
- switch (d)
- {
- case MirDirection.Up:
- p.Offset(-1, 0);
- break;
- case MirDirection.UpRight:
- p.Offset(-1, -1);
- break;
- case MirDirection.Right:
- p.Offset(0, -1);
- break;
- case MirDirection.DownRight:
- p.Offset(1, -1);
- break;
- case MirDirection.Down:
- p.Offset(1, 0);
- break;
- case MirDirection.DownLeft:
- p.Offset(1, 1);
- break;
- case MirDirection.Left:
- p.Offset(0, 1);
- break;
- case MirDirection.UpLeft:
- p.Offset(-1, 1);
- break;
- }
- return p;
- }
- public static Point Right(Point p, MirDirection d)
- {
- switch (d)
- {
- case MirDirection.Up:
- p.Offset(1, 0);
- break;
- case MirDirection.UpRight:
- p.Offset(1, 1);
- break;
- case MirDirection.Right:
- p.Offset(0, 1);
- break;
- case MirDirection.DownRight:
- p.Offset(-1, 1);
- break;
- case MirDirection.Down:
- p.Offset(-1, 0);
- break;
- case MirDirection.DownLeft:
- p.Offset(-1, -1);
- break;
- case MirDirection.Left:
- p.Offset(0, -1);
- break;
- case MirDirection.UpLeft:
- p.Offset(1, -1);
- break;
- }
- return p;
- }
- public static int MaxDistance(Point p1, Point p2)
- {
- return Math.Max(Math.Abs(p1.X - p2.X), Math.Abs(p1.Y - p2.Y));
- }
- public static MirDirection ReverseDirection(MirDirection dir)
- {
- switch (dir)
- {
- case MirDirection.Up:
- return MirDirection.Down;
- case MirDirection.UpRight:
- return MirDirection.DownLeft;
- case MirDirection.Right:
- return MirDirection.Left;
- case MirDirection.DownRight:
- return MirDirection.UpLeft;
- case MirDirection.Down:
- return MirDirection.Up;
- case MirDirection.DownLeft:
- return MirDirection.UpRight;
- case MirDirection.Left:
- return MirDirection.Right;
- case MirDirection.UpLeft:
- return MirDirection.DownRight;
- default:
- return dir;
- }
- }
- public static ItemInfo GetRealItem(ItemInfo Origin, ushort Level, MirClass job, List<ItemInfo> ItemList)
- {
- if (Origin.ClassBased && Origin.LevelBased)
- return GetClassAndLevelBasedItem(Origin, job, Level, ItemList);
- if (Origin.ClassBased)
- return GetClassBasedItem(Origin, job, ItemList);
- if (Origin.LevelBased)
- return GetLevelBasedItem(Origin, Level, ItemList);
- return Origin;
- }
- public static ItemInfo GetLevelBasedItem(ItemInfo Origin, ushort level, List<ItemInfo> ItemList)
- {
- ItemInfo output = Origin;
- for (int i = 0; i < ItemList.Count; i++)
- {
- ItemInfo info = ItemList[i];
- if (info.Name.StartsWith(Origin.Name))
- if ((info.RequiredType == RequiredType.Level) && (info.RequiredAmount <= level) && (output.RequiredAmount < info.RequiredAmount) && (Origin.RequiredGender == info.RequiredGender))
- output = info;
- }
- return output;
- }
- public static ItemInfo GetClassBasedItem(ItemInfo Origin, MirClass job, List<ItemInfo> ItemList)
- {
- for (int i = 0; i < ItemList.Count; i++)
- {
- ItemInfo info = ItemList[i];
- if (info.Name.StartsWith(Origin.Name))
- if (((byte)info.RequiredClass == (1 << (byte)job)) && (Origin.RequiredGender == info.RequiredGender))
- return info;
- }
- return Origin;
- }
- public static ItemInfo GetClassAndLevelBasedItem(ItemInfo Origin, MirClass job, ushort level, List<ItemInfo> ItemList)
- {
- ItemInfo output = Origin;
- for (int i = 0; i < ItemList.Count; i++)
- {
- ItemInfo info = ItemList[i];
- if (info.Name.StartsWith(Origin.Name))
- if ((byte)info.RequiredClass == (1 << (byte)job))
- if ((info.RequiredType == RequiredType.Level) && (info.RequiredAmount <= level) && (output.RequiredAmount <= info.RequiredAmount) && (Origin.RequiredGender == info.RequiredGender))
- output = info;
- }
- return output;
- }
- public static string StringOverLines(string line, int maxWordsPerLine, int maxLettersPerLine)
- {
- string newString = string.Empty;
- string[] words = line.Split(' ');
- int lineLength = 0;
- for (int i = 0; i < words.Length; i++)
- {
- lineLength += words[i].Length + 1;
- newString += words[i] + " ";
- if (i > 0 && i % maxWordsPerLine == 0 && lineLength > maxLettersPerLine)
- {
- lineLength = 0;
- newString += "\r\n";
- }
- }
- return newString;
- }
- public static IEnumerable<byte[]> SplitArray(byte[] value, int bufferLength)
- {
- int countOfArray = value.Length / bufferLength;
- if (value.Length % bufferLength > 0)
- countOfArray++;
- for (int i = 0; i < countOfArray; i++)
- {
- yield return value.Skip(i * bufferLength).Take(bufferLength).ToArray();
- }
- }
- public static byte[] CombineArray(List<byte[]> arrays)
- {
- byte[] rv = new byte[arrays.Sum(x => x.Length)];
- int offset = 0;
- foreach (byte[] array in arrays)
- {
- System.Buffer.BlockCopy(array, 0, rv, offset, array.Length);
- offset += array.Length;
- }
- return rv;
- }
- public static byte[] SerializeToBytes<T>(T item)
- {
- #pragma warning disable SYSLIB0011
- var formatter = new BinaryFormatter();
- using (var stream = new MemoryStream())
- {
- formatter.Serialize(stream, item);
- stream.Seek(0, SeekOrigin.Begin);
- #pragma warning restore SYSLIB0011
- return stream.ToArray();
- }
- }
- public static object DeserializeFromBytes(byte[] bytes)
- {
- #pragma warning disable SYSLIB0011
- var formatter = new BinaryFormatter();
- using (var stream = new MemoryStream(bytes))
- {
- var deserialized = formatter.Deserialize(stream);
- #pragma warning restore SYSLIB0011
- return deserialized;
- }
- }
- /// <summary>
- /// Chop a List into chunks
- /// </summary>
- /// <param name="width">The amount of Chunks desired</param>
- /// <param name="originalList">The list to Chop into Chunks</param>
- /// <returns>Original List in Chunks within a List</returns>
- public static List<List<T>> SplitList<T>(int width, List<T> originalList)
- {
- var _tempChunks = new List<List<T>>();
- if (width == 0)
- _tempChunks.Add(originalList);
- else
- {
- // Determine how many lists are required
- var numberOfLists = (originalList.Count / width);
- for (var i = 0; i <= numberOfLists; i++)
- {
- var newChunk = originalList.Skip(i * width).Take(width).ToList();
- _tempChunks.Add(newChunk);
- }
- }
- return _tempChunks;
- }
- public static byte[] CompressBytes(byte[] raw)
- {
- using (var memory = new MemoryStream())
- {
- using (var gzip = new GZipStream(memory, CompressionMode.Compress, true))
- {
- gzip.Write(raw, 0, raw.Length);
- }
- return memory.ToArray();
- }
- }
- public static byte[] DecompressBytes(byte[] gzip)
- {
- using (var stream = new GZipStream(new MemoryStream(gzip), CompressionMode.Decompress))
- {
- using (var memory = new MemoryStream())
- {
- stream.CopyTo(memory, 4096);
- return memory.ToArray();
- }
- }
- }
- }
|