summaryrefslogtreecommitdiff
path: root/Client/Assembly-CSharp/Extensions.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Client/Assembly-CSharp/Extensions.cs')
-rw-r--r--Client/Assembly-CSharp/Extensions.cs409
1 files changed, 409 insertions, 0 deletions
diff --git a/Client/Assembly-CSharp/Extensions.cs b/Client/Assembly-CSharp/Extensions.cs
new file mode 100644
index 0000000..a653cea
--- /dev/null
+++ b/Client/Assembly-CSharp/Extensions.cs
@@ -0,0 +1,409 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using UnityEngine;
+
+public static class Extensions
+{
+ private static string[] ByteHex = (from x in Enumerable.Range(0, 256)
+ select x.ToString("X2")).ToArray<string>();
+
+ public static void TrimEnd(this StringBuilder self)
+ {
+ for (int i = self.Length - 1; i >= 0; i--)
+ {
+ char c = self[i];
+ if (c != ' ' && c != '\t' && c != '\n' && c != '\r')
+ {
+ break;
+ }
+ int length = self.Length;
+ self.Length = length - 1;
+ }
+ }
+
+ public static void AddUnique<T>(this IList<T> self, T item)
+ {
+ if (!self.Contains(item))
+ {
+ self.Add(item);
+ }
+ }
+
+ public static string ToTextColor(this Color c)
+ {
+ return string.Concat(new string[]
+ {
+ "[",
+ Extensions.ByteHex[(int)((byte)(c.r * 255f))],
+ Extensions.ByteHex[(int)((byte)(c.g * 255f))],
+ Extensions.ByteHex[(int)((byte)(c.b * 255f))],
+ Extensions.ByteHex[(int)((byte)(c.a * 255f))],
+ "]"
+ });
+ }
+
+ public static int ToInteger(this Color c, bool alpha)
+ {
+ if (alpha)
+ {
+ return (int)((byte)(c.r * 256f)) << 24 | (int)((byte)(c.g * 256f)) << 16 | (int)((byte)(c.b * 256f)) << 8 | (int)((byte)(c.a * 256f));
+ }
+ return (int)((byte)(c.r * 256f)) << 16 | (int)((byte)(c.g * 256f)) << 8 | (int)((byte)(c.b * 256f));
+ }
+
+ public static bool HasAnyBit(this int self, int bit)
+ {
+ return (self & bit) != 0;
+ }
+
+ public static bool HasAnyBit(this byte self, byte bit)
+ {
+ return (self & bit) > 0;
+ }
+
+ public static bool HasBit(this byte self, byte bit)
+ {
+ return (self & bit) == bit;
+ }
+
+ public static int BitCount(this byte self)
+ {
+ int num = 0;
+ for (int i = 0; i < 8; i++)
+ {
+ if ((1 << i & (int)self) != 0)
+ {
+ num++;
+ }
+ }
+ return num;
+ }
+
+ public static int IndexOf<T>(this T[] self, T item) where T : class
+ {
+ for (int i = 0; i < self.Length; i++)
+ {
+ if (self[i] == item)
+ {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ public static int IndexOfMin<T>(this T[] self, Func<T, float> comparer)
+ {
+ float num = float.MaxValue;
+ int result = -1;
+ for (int i = 0; i < self.Length; i++)
+ {
+ float num2 = comparer(self[i]);
+ if (num2 <= num)
+ {
+ result = i;
+ num = num2;
+ }
+ }
+ return result;
+ }
+
+ public static int IndexOfMax<T>(this T[] self, Func<T, int> comparer, out bool tie)
+ {
+ tie = false;
+ int num = int.MinValue;
+ int result = -1;
+ for (int i = 0; i < self.Length; i++)
+ {
+ int num2 = comparer(self[i]);
+ if (num2 > num)
+ {
+ result = i;
+ num = num2;
+ tie = false;
+ }
+ else if (num2 == num)
+ {
+ tie = true;
+ result = -1;
+ }
+ }
+ return result;
+ }
+
+ public static void SetAll<T>(this IList<T> self, T value)
+ {
+ for (int i = 0; i < self.Count; i++)
+ {
+ self[i] = value;
+ }
+ }
+
+ public static void AddAll<T>(this List<T> self, IList<T> other)
+ {
+ int num = self.Count + other.Count;
+ if (self.Capacity < num)
+ {
+ self.Capacity = num;
+ }
+ for (int i = 0; i < other.Count; i++)
+ {
+ self.Add(other[i]);
+ }
+ }
+
+ public static void RemoveDupes<T>(this IList<T> self) where T : class
+ {
+ for (int i = 0; i < self.Count; i++)
+ {
+ T t = self[i];
+ for (int j = self.Count - 1; j > i; j--)
+ {
+ if (self[j] == t)
+ {
+ self.RemoveAt(j);
+ }
+ }
+ }
+ }
+
+ public static void Shuffle<T>(this IList<T> self)
+ {
+ for (int i = 0; i < self.Count - 1; i++)
+ {
+ T value = self[i];
+ int index = UnityEngine.Random.Range(i, self.Count);
+ self[i] = self[index];
+ self[index] = value;
+ }
+ }
+
+ public static void Shuffle<T>(this System.Random r, IList<T> self)
+ {
+ for (int i = 0; i < self.Count; i++)
+ {
+ T value = self[i];
+ int index = r.Next(self.Count);
+ self[i] = self[index];
+ self[index] = value;
+ }
+ }
+
+ public static T[] RandomSet<T>(this IList<T> self, int length)
+ {
+ T[] array = new T[length];
+ self.RandomFill(array);
+ return array;
+ }
+
+ public static void RandomFill<T>(this IList<T> self, T[] target)
+ {
+ HashSet<int> hashSet = new HashSet<int>();
+ for (int i = 0; i < target.Length; i++)
+ {
+ int num;
+ do
+ {
+ num = self.RandomIdx<T>();
+ }
+ while (hashSet.Contains(num));
+ target[i] = self[num];
+ hashSet.Add(num);
+ if (hashSet.Count == self.Count)
+ {
+ return;
+ }
+ }
+ }
+
+ public static int RandomIdx<T>(this IList<T> self)
+ {
+ return UnityEngine.Random.Range(0, self.Count);
+ }
+
+ public static int RandomIdx<T>(this IEnumerable<T> self)
+ {
+ return UnityEngine.Random.Range(0, self.Count<T>());
+ }
+
+ public static T Random<T>(this IEnumerable<T> self)
+ {
+ return self.ToArray<T>().Random<T>();
+ }
+
+ public static T Random<T>(this IList<T> self)
+ {
+ if (self.Count > 0)
+ {
+ return self[UnityEngine.Random.Range(0, self.Count)];
+ }
+ return default(T);
+ }
+
+ public static Vector2 Div(this Vector2 a, Vector2 b)
+ {
+ return new Vector2(a.x / b.x, a.y / b.y);
+ }
+
+ public static Vector2 Mul(this Vector2 a, Vector2 b)
+ {
+ return new Vector2(a.x * b.x, a.y * b.y);
+ }
+
+ public static Vector3 Mul(this Vector3 a, Vector3 b)
+ {
+ return new Vector3(a.x * b.x, a.y * b.y, a.z * b.z);
+ }
+
+ public static Vector3 Inv(this Vector3 a)
+ {
+ return new Vector3(1f / a.x, 1f / a.y, 1f / a.z);
+ }
+
+ public static Rect Lerp(this Rect source, Rect target, float t)
+ {
+ return new Rect
+ {
+ position = Vector2.Lerp(source.position, target.position, t),
+ size = Vector2.Lerp(source.size, target.size, t)
+ };
+ }
+
+ public static void ForEach<T>(this IList<T> self, Action<T> todo)
+ {
+ for (int i = 0; i < self.Count; i++)
+ {
+ todo(self[i]);
+ }
+ }
+
+ public static T Max<T>(this IList<T> self, Func<T, float> comparer)
+ {
+ T t = self.First<T>();
+ float num = comparer(t);
+ for (int i = 0; i < self.Count; i++)
+ {
+ T t2 = self[i];
+ float num2 = comparer(t2);
+ if (num < num2 || (num == num2 && UnityEngine.Random.value > 0.5f))
+ {
+ num = num2;
+ t = t2;
+ }
+ }
+ return t;
+ }
+
+ public static T Max<T>(this IList<T> self, Func<T, decimal> comparer)
+ {
+ T t = self.First<T>();
+ decimal d = comparer(t);
+ for (int i = 0; i < self.Count; i++)
+ {
+ T t2 = self[i];
+ decimal num = comparer(t2);
+ if (d < num || (d == num && UnityEngine.Random.value > 0.5f))
+ {
+ d = num;
+ t = t2;
+ }
+ }
+ return t;
+ }
+
+ public static int Wrap(this int self, int max)
+ {
+ if (self >= 0)
+ {
+ return self % max;
+ }
+ return (self + -(self / max) * max + max) % max;
+ }
+
+ public static int IndexOf<T>(this T[] self, Predicate<T> pred)
+ {
+ for (int i = 0; i < self.Length; i++)
+ {
+ if (pred(self[i]))
+ {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ public static Vector2 MapToRectangle(this Vector2 del, Vector2 widthAndHeight)
+ {
+ del = del.normalized;
+ if (Mathf.Abs(del.x) > Mathf.Abs(del.y))
+ {
+ return new Vector2(Mathf.Sign(del.x) * widthAndHeight.x, del.y * widthAndHeight.y / 0.70710677f);
+ }
+ return new Vector2(del.x * widthAndHeight.x / 0.70710677f, Mathf.Sign(del.y) * widthAndHeight.y);
+ }
+
+ public static float AngleSignedRad(this Vector2 vector1, Vector2 vector2)
+ {
+ return Mathf.Atan2(vector2.y, vector2.x) - Mathf.Atan2(vector1.y, vector1.x);
+ }
+
+ public static float AngleSigned(this Vector2 vector1, Vector2 vector2)
+ {
+ return vector1.AngleSignedRad(vector2) * 57.29578f;
+ }
+
+ public static Vector2 Rotate(this Vector2 self, float degrees)
+ {
+ float f = 0.017453292f * degrees;
+ float num = Mathf.Cos(f);
+ float num2 = Mathf.Sin(f);
+ return new Vector2(self.x * num - num2 * self.y, self.x * num2 + num * self.y);
+ }
+
+ public static Vector3 RotateY(this Vector3 self, float degrees)
+ {
+ float f = 0.017453292f * degrees;
+ float num = Mathf.Cos(f);
+ float num2 = Mathf.Sin(f);
+ return new Vector3(self.x * num - num2 * self.z, self.y, self.x * num2 + num * self.z);
+ }
+
+ public static bool TryToEnum<TEnum>(this string strEnumValue, out TEnum enumValue)
+ {
+ enumValue = default(TEnum);
+ if (!Enum.IsDefined(typeof(TEnum), strEnumValue))
+ {
+ return false;
+ }
+ enumValue = (TEnum)((object)Enum.Parse(typeof(TEnum), strEnumValue));
+ return true;
+ }
+
+ public static TEnum ToEnum<TEnum>(this string strEnumValue)
+ {
+ if (!Enum.IsDefined(typeof(TEnum), strEnumValue))
+ {
+ return default(TEnum);
+ }
+ return (TEnum)((object)Enum.Parse(typeof(TEnum), strEnumValue));
+ }
+
+ public static TEnum ToEnum<TEnum>(this string strEnumValue, TEnum defaultValue)
+ {
+ if (!Enum.IsDefined(typeof(TEnum), strEnumValue))
+ {
+ return defaultValue;
+ }
+ return (TEnum)((object)Enum.Parse(typeof(TEnum), strEnumValue));
+ }
+
+ public static bool IsNullOrWhiteSpace(this string s)
+ {
+ if (s == null)
+ {
+ return true;
+ }
+ return !s.Any((char c) => !char.IsWhiteSpace(c));
+ }
+}