Elin Decompiled Documentation EA 23.315 Nightly
Loading...
Searching...
No Matches
ClassExtension.cs
Go to the documentation of this file.
1using System;
2using System.Collections;
3using System.Collections.Generic;
4using System.IO;
5using System.Linq;
6using System.Reflection;
7using System.Text;
8using System.Text.RegularExpressions;
9using Pluralize.NET;
10using UnityEngine;
11using UnityEngine.Events;
12using UnityEngine.UI;
13
14public static class ClassExtension
15{
16 private static Vector3 vector3;
17
18 public static IPluralize pluralizer = new Pluralizer();
19
20 public static string lang(this string s)
21 {
22 return Lang.Get(s);
23 }
24
25 public static string langPlural(this string s, int i)
26 {
27 string text = Lang.Get(s);
28 return Lang.Parse((i <= 1 || !Lang.setting.pluralize) ? text : pluralizer.Pluralize(text), i.ToString() ?? "");
29 }
30
31 public static string lang(this string s, string ref1, string ref2 = null, string ref3 = null, string ref4 = null, string ref5 = null)
32 {
33 return Lang.Parse(s, ref1, ref2, ref3, ref4, ref5);
34 }
35
36 public static string[] langList(this string s)
37 {
38 return Lang.GetList(s);
39 }
40
41 public static string langGame(this string s)
42 {
43 return Lang.Game.Get(s);
44 }
45
46 public static string langGame(this string s, string ref1, string ref2 = null, string ref3 = null, string ref4 = null)
47 {
48 return Lang.Game.Parse(s, ref1, ref2, ref3, ref4);
49 }
50
51 public static string Parentheses(this string str)
52 {
53 return "(" + str + ")";
54 }
55
56 public static string Bracket(this string str, int type = 0)
57 {
58 return type switch
59 {
60 -1 => str,
61 1 => "「" + str + "」",
62 2 => "『" + str + "』",
63 3 => "《" + str + "》",
64 4 => "(" + str + ")",
65 _ => "_bracketLeft".lang() + str + "_bracketRight".lang(),
66 };
67 }
68
69 public static byte[] ToBytes(this BitArray bits)
70 {
71 byte[] array = new byte[(bits.Length - 1) / 8 + 1];
72 bits.CopyTo(array, 0);
73 return array;
74 }
75
76 public static bool GetBit(this byte pByte, int bitNo)
77 {
78 return (pByte & (1 << bitNo)) != 0;
79 }
80
81 public static byte SetBit(this byte pByte, int bitNo, bool value)
82 {
83 if (!value)
84 {
85 return Convert.ToByte(pByte & ~(1 << bitNo));
86 }
87 return Convert.ToByte(pByte | (1 << bitNo));
88 }
89
90 public static int ToInt3(this float a)
91 {
92 return (int)(a * 1000f);
93 }
94
95 public static float FromInt3(this int a)
96 {
97 return (float)a / 1000f;
98 }
99
100 public static int ToInt2(this float a)
101 {
102 return (int)(a * 100f);
103 }
104
105 public static float FromInt2(this int a)
106 {
107 return (float)a / 100f;
108 }
109
110 public static int Minimum(this int i)
111 {
112 if (i != 0)
113 {
114 if (i <= 0)
115 {
116 return -1;
117 }
118 return 1;
119 }
120 return 0;
121 }
122
123 public static bool IsNull(this object o)
124 {
125 return o == null;
126 }
127
128 public static bool IsOn(this int data, int digit)
129 {
130 BitArray32 bitArray = default(BitArray32);
131 bitArray.SetInt(data);
132 return bitArray[digit];
133 }
134
135 public static T ToEnum<T>(this int value)
136 {
137 return (T)Enum.ToObject(typeof(T), value);
138 }
139
140 public static T ToEnum<T>(this long value)
141 {
142 return (T)Enum.ToObject(typeof(T), value);
143 }
144
145 public static T ToEnum<T>(this string value, bool ignoreCase = true)
146 {
147 return (T)Enum.Parse(typeof(T), value, ignoreCase);
148 }
149
150 public static Type ToType(this string value)
151 {
152 return Type.GetType("Elona." + value + ", Assembly-CSharp");
153 }
154
155 public static T NextEnum<T>(this T src) where T : struct
156 {
157 return ((T[])Enum.GetValues(src.GetType())).NextItem(src);
158 }
159
160 public static T PrevEnum<T>(this T src) where T : struct
161 {
162 return ((T[])Enum.GetValues(src.GetType())).PrevItem(src);
163 }
164
165 public static bool Within(this int v, int v2, int range)
166 {
167 if (v - v2 >= range)
168 {
169 return v - v2 < -range;
170 }
171 return true;
172 }
173
174 public static bool Within(this byte v, byte v2, byte range)
175 {
176 if (v - v2 >= range)
177 {
178 return v - v2 < -range;
179 }
180 return true;
181 }
182
183 public static int Clamp(this int v, int min, int max, bool loop = false)
184 {
185 if (v < min)
186 {
187 v = ((!loop) ? min : max);
188 }
189 else if (v > max)
190 {
191 v = ((!loop) ? max : min);
192 }
193 return v;
194 }
195
196 public static int ClampMin(this int v, int min)
197 {
198 if (v >= min)
199 {
200 return v;
201 }
202 return min;
203 }
204
205 public static int ClampMax(this int v, int max)
206 {
207 if (v <= max)
208 {
209 return v;
210 }
211 return max;
212 }
213
214 public static T ToField<T>(this string s, object o)
215 {
216 return (T)o.GetType().GetField(s).GetValue(o);
217 }
218
219 public static bool HasField<T>(this object o, string name)
220 {
221 FieldInfo field = o.GetType().GetField(name);
222 if (field != null)
223 {
224 return typeof(T).IsAssignableFrom(field.FieldType);
225 }
226 return false;
227 }
228
229 public static T GetField<T>(this object o, string name)
230 {
231 return (T)o.GetType().GetField(name).GetValue(o);
232 }
233
234 public static void SetField<T>(this object o, string name, T value)
235 {
236 o.GetType().GetField(name).SetValue(o, value);
237 }
238
239 public static T GetProperty<T>(this object o, string name)
240 {
241 return (T)o.GetType().GetProperty(name).GetValue(o);
242 }
243
244 public static void SetProperty<T>(this object o, string name, T value)
245 {
246 o.GetType().GetProperty(name).SetValue(o, value);
247 }
248
249 public static void Sort<T>(this IList<T> list, Comparison<T> comparison)
250 {
251 if (list is List<T>)
252 {
253 ((List<T>)list).Sort(comparison);
254 return;
255 }
256 List<T> list2 = new List<T>(list);
257 list2.Sort(comparison);
258 for (int i = 0; i < list.Count; i++)
259 {
260 list[i] = list2[i];
261 }
262 }
263
264 public static TValue TryGet<TValue>(this IList<TValue> array, int index, int defIndex = -1)
265 {
266 if (array.Count != 0)
267 {
268 if (index >= array.Count)
269 {
270 if (defIndex != -1)
271 {
272 if (array.Count <= defIndex)
273 {
274 return array[Mathf.Max(0, array.Count - 1)];
275 }
276 return array[defIndex];
277 }
278 return array[Mathf.Max(0, array.Count - 1)];
279 }
280 return array[Math.Max(0, index)];
281 }
282 return default(TValue);
283 }
284
285 public static TValue TryGet<TValue>(this IList<TValue> array, int index, bool returnNull)
286 {
287 if (index >= array.Count)
288 {
289 return default(TValue);
290 }
291 return array[index];
292 }
293
294 public static bool IsEmpty(this Array array)
295 {
296 if (array != null)
297 {
298 return array.Length == 0;
299 }
300 return true;
301 }
302
303 public static int IndexOf(this IList<Component> list, GameObject go)
304 {
305 if (!go)
306 {
307 return -1;
308 }
309 for (int i = 0; i < list.Count; i++)
310 {
311 if (list[i].gameObject == go)
312 {
313 return i;
314 }
315 }
316 return -1;
317 }
318
319 public static TValue Move<TValue>(this IList<TValue> list, TValue target, int a)
320 {
321 int num = list.IndexOf(target);
322 int num2 = num + a;
323 if (num2 < 0)
324 {
325 num2 = list.Count - 1;
326 }
327 if (num2 >= list.Count)
328 {
329 num2 = 0;
330 }
331 list.Remove(target);
332 list.Insert(num2, target);
333 return list[num];
334 }
335
336 public static IList<TValue> Copy<TValue>(this IList<TValue> list)
337 {
338 return list.ToList();
339 }
340
341 public static void Each<TValue>(this IList<TValue> list, Action<TValue> action)
342 {
343 for (int num = list.Count - 1; num >= 0; num--)
344 {
345 action(list[num]);
346 }
347 }
348
349 public static IList<TValue> Shuffle<TValue>(this IList<TValue> list)
350 {
351 int num = list.Count;
352 while (num > 1)
353 {
354 int index = Rand._random.Next(num);
355 num--;
356 TValue value = list[num];
357 list[num] = list[index];
358 list[index] = value;
359 }
360 return list;
361 }
362
363 public static TValue TryGetValue<TKey, TValue>(this IDictionary<TKey, TValue> source, TKey key, TValue fallback = default(TValue))
364 {
365 TValue value = default(TValue);
366 if (key != null && source.TryGetValue(key, out value))
367 {
368 return value;
369 }
370 return fallback;
371 }
372
373 public static TValue TryGetValue<TKey, TValue>(this IDictionary<TKey, TValue> source, TKey key, TKey key_fallback)
374 {
375 TValue value = default(TValue);
376 if (key != null && source.TryGetValue(key, out value))
377 {
378 return value;
379 }
380 return source[key_fallback];
381 }
382
383 public static TValue GetOrCreate<TKey, TValue>(this IDictionary<TKey, TValue> dict, TKey key, Func<TValue> func = null)
384 {
385 TValue val = dict.TryGetValue(key);
386 if (val == null)
387 {
388 val = ((func != null) ? func() : Activator.CreateInstance<TValue>());
389 dict.Add(key, val);
390 }
391 return val;
392 }
393
394 public static TKey[] CopyKeys<TKey, TValue>(this IDictionary<TKey, TValue> dict)
395 {
396 TKey[] array = new TKey[dict.Keys.Count];
397 dict.Keys.CopyTo(array, 0);
398 return array;
399 }
400
401 public static TValue[] CopyValues<TKey, TValue>(this IDictionary<TKey, TValue> dict)
402 {
403 TValue[] array = new TValue[dict.Keys.Count];
404 dict.Values.CopyTo(array, 0);
405 return array;
406 }
407
408 public static T RandomItem<T>(this IEnumerable<T> ie)
409 {
410 int num = ie.Count();
411 if (num == 0)
412 {
413 return default(T);
414 }
415 return ie.ElementAt(Rand.rnd(num));
416 }
417
418 public static TValue RandomItem<TKey, TValue>(this IDictionary<TKey, TValue> source)
419 {
420 if (source.Count != 0)
421 {
422 return source.ElementAt(Rand.rnd(source.Count)).Value;
423 }
424 return default(TValue);
425 }
426
427 public static TValue RandomItem<TValue>(this IList<TValue> source)
428 {
429 if (source.Count != 0)
430 {
431 return source[Rand.rnd(source.Count)];
432 }
433 return default(TValue);
434 }
435
436 public static TValue RandomItem<TValue>(this IList<TValue> source, TValue exclude)
437 {
438 return source.RandomItem(source.IndexOf(exclude));
439 }
440
441 public static TValue RandomItem<TValue>(this IList<TValue> source, int exclude)
442 {
443 if (source.Count > 1)
444 {
445 int num;
446 do
447 {
448 num = Rand.rnd(source.Count);
449 }
450 while (num == exclude);
451 return source[num];
452 }
453 if (source.Count == 1)
454 {
455 return source[0];
456 }
457 return default(TValue);
458 }
459
460 public static TValue RandomItem<TValue>(this IList<TValue> source, Func<TValue, bool> funcValid, TValue defaultValue = default(TValue))
461 {
462 for (int i = 0; i < 100; i++)
463 {
464 TValue val = source[Rand.rnd(source.Count)];
465 if (funcValid(val))
466 {
467 return val;
468 }
469 }
470 return defaultValue;
471 }
472
473 public static TValue RandomItemWeighted<TValue>(this IList<TValue> source, Func<TValue, float> getWeight)
474 {
475 if (source.Count == 0)
476 {
477 return default(TValue);
478 }
479 if (source.Count == 1)
480 {
481 return source[0];
482 }
483 float num = 0f;
484 foreach (TValue item in source)
485 {
486 num += getWeight(item);
487 }
488 float num2 = Rand.Range(0f, num);
489 num = 0f;
490 foreach (TValue item2 in source)
491 {
492 num += getWeight(item2);
493 if (num2 < num)
494 {
495 return item2;
496 }
497 }
498 return source.First();
499 }
500
501 public static TValue Remainder<TValue>(this IList<TValue> source, int divider)
502 {
503 if (source.Count != 0)
504 {
505 return source[divider % source.Count];
506 }
507 return default(TValue);
508 }
509
510 public static TValue FirstItem<TKey, TValue>(this IDictionary<TKey, TValue> source)
511 {
512 if (source == null)
513 {
514 return default(TValue);
515 }
516 return source[source.First().Key];
517 }
518
519 public static TValue LastItem<TValue>(this IList<TValue> source)
520 {
521 if (source.Count != 0)
522 {
523 return source[source.Count - 1];
524 }
525 return default(TValue);
526 }
527
528 public static TValue NextItem<TValue>(this IList<TValue> source, ref int index)
529 {
530 index++;
531 if (index >= source.Count)
532 {
533 index = 0;
534 }
535 if (source.Count != 0)
536 {
537 return source[index];
538 }
539 return default(TValue);
540 }
541
542 public static int NextIndex<TValue>(this IList<TValue> source, TValue val)
543 {
544 if (val == null)
545 {
546 return 0;
547 }
548 int num = source.IndexOf(val) + 1;
549 if (num >= source.Count)
550 {
551 num = 0;
552 }
553 return num;
554 }
555
556 public static TValue NextItem<TValue>(this IList<TValue> source, TValue val)
557 {
558 int num = source.IndexOf(val) + 1;
559 if (num >= source.Count)
560 {
561 num = 0;
562 }
563 if (source.Count != 0)
564 {
565 return source[num];
566 }
567 return default(TValue);
568 }
569
570 public static TValue PrevItem<TValue>(this IList<TValue> source, TValue val)
571 {
572 int num = source.IndexOf(val) - 1;
573 if (num < 0)
574 {
575 num = source.Count - 1;
576 }
577 if (source.Count != 0)
578 {
579 return source[num];
580 }
581 return default(TValue);
582 }
583
584 public static TValue Clamp<TValue>(this IList<TValue> source, int i)
585 {
586 if (i < 0)
587 {
588 i = 0;
589 }
590 else if (i >= source.Count)
591 {
592 i = source.Count - 1;
593 }
594 return source[i];
595 }
596
597 public static List<T> GetList<T>(this IDictionary source)
598 {
599 List<T> list = new List<T>();
600 foreach (object value in source.Values)
601 {
602 if (value is T)
603 {
604 list.Add((T)value);
605 }
606 }
607 return list;
608 }
609
610 public static void ToDictionary<T>(this IList<UPair<T>> list, ref Dictionary<string, T> dic)
611 {
612 dic = new Dictionary<string, T>();
613 for (int i = 0; i < list.Count; i++)
614 {
615 dic.Add(list[i].name, list[i].value);
616 }
617 }
618
619 public static T FindMax<T>(this List<T> list, Func<T, int> func)
620 {
621 int num = int.MinValue;
622 T result = default(T);
623 foreach (T item in list)
624 {
625 int num2 = func(item);
626 if (num2 > num)
627 {
628 num = num2;
629 result = item;
630 }
631 }
632 return result;
633 }
634
635 public static void Set<T1, T2>(this Dictionary<T1, T2> dic, Dictionary<T1, T2> from)
636 {
637 dic.Clear();
638 foreach (KeyValuePair<T1, T2> item in from)
639 {
640 dic[item.Key] = item.Value;
641 }
642 }
643
644 public static string[] SplitByNewline(this string text)
645 {
646 if (string.IsNullOrEmpty(text))
647 {
648 return new string[0];
649 }
650 return text.Split(new string[3] { "\r\n", "\n", "\r" }, StringSplitOptions.None);
651 }
652
653 public static string RemoveNewline(this string text)
654 {
655 if (string.IsNullOrEmpty(text))
656 {
657 return text;
658 }
659 return text.Replace("\r", "").Replace("\n", "");
660 }
661
662 public static string RemoveAllTags(this string text)
663 {
664 if (string.IsNullOrEmpty(text))
665 {
666 return text;
667 }
668 return Regex.Replace(text, "<.*?>", "");
669 }
670
671 public static int Calc(this string str, int power = 0, int ele = 0, int p2 = 0)
672 {
673 return Cal.Calcuate(str.Replace("p2", p2.ToString() ?? "").Replace("p", power.ToString() ?? "").Replace("e", ele.ToString() ?? "")
674 .Replace(";", ","));
675 }
676
677 public static int ToInt<T>(this string str)
678 {
679 return str.ToInt(typeof(T));
680 }
681
682 public static int ToInt(this string str, Type type)
683 {
684 FieldInfo field = type.GetField(str, BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy);
685 if (field == null)
686 {
687 Debug.LogError("Field is null:" + str + "/" + type);
688 return -1;
689 }
690 return (int)field.GetValue(null);
691 }
692
693 public static int ToInt(this string str)
694 {
695 if (int.TryParse(str, out var result))
696 {
697 return result;
698 }
699 return 0;
700 }
701
702 public static long ToLong(this string str)
703 {
704 if (long.TryParse(str, out var result))
705 {
706 return result;
707 }
708 return 0L;
709 }
710
711 public static float ToFloat(this string str)
712 {
713 float result = 0f;
714 try
715 {
716 if (!float.TryParse(str, out result))
717 {
718 Debug.Log("exception: ToFlat1" + str);
719 result = 1f;
720 }
721 }
722 catch
723 {
724 Debug.Log("exception: ToFlat2" + str);
725 result = 1f;
726 }
727 return result;
728 }
729
730 public static string StripLastPun(this string str)
731 {
732 if (str != null)
733 {
734 return str.TrimEnd(Lang.words.period);
735 }
736 return str;
737 }
738
739 public static string StripPun(this string str, bool stripComma, bool insertSpaceForComma = false)
740 {
741 StringBuilder stringBuilder = new StringBuilder();
742 foreach (char c in str)
743 {
744 if (c == Lang.words.comma)
745 {
746 if (stripComma)
747 {
748 if (insertSpaceForComma)
749 {
750 stringBuilder.Append('\u3000');
751 }
752 }
753 else
754 {
755 stringBuilder.Append(c);
756 }
757 }
758 else if (c != Lang.words.period)
759 {
760 stringBuilder.Append(c);
761 }
762 }
763 return stringBuilder.ToString();
764 }
765
766 public static string Repeat(this string str, int count)
767 {
768 StringBuilder stringBuilder = new StringBuilder();
769 for (int i = 0; i < Mathf.Abs(count); i++)
770 {
771 stringBuilder.Append(str);
772 }
773 return stringBuilder.ToString();
774 }
775
776 public static string StripBrackets(this string str)
777 {
778 HashSet<char> brackets = new HashSet<char> { '"', '「', '」', '“', '”' };
779 return string.Concat(str.Where((char c) => !brackets.Contains(c)));
780 }
781
782 public static string TryAddExtension(this string s, string ext)
783 {
784 if (!s.Contains("." + ext))
785 {
786 return s + "." + ext;
787 }
788 return s;
789 }
790
791 public static bool IsEmpty(this string str)
792 {
793 if (str != null)
794 {
795 return str == "";
796 }
797 return true;
798 }
799
800 public static string IsEmpty(this string str, string defaultStr)
801 {
802 if (str != null && !(str == ""))
803 {
804 return str;
805 }
806 return defaultStr;
807 }
808
809 public static string TrimNewLines(this string text)
810 {
811 while (text.EndsWith(Environment.NewLine))
812 {
813 text = text.Substring(0, text.Length - Environment.NewLine.Length);
814 }
815 return text;
816 }
817
818 public static int[] SplitToInts(this string str, char separator)
819 {
820 string[] array = str.Split(separator);
821 int[] array2 = new int[array.Length];
822 for (int i = 0; i < array.Length; i++)
823 {
824 array2[i] = int.Parse(array[i]);
825 }
826 return array2;
827 }
828
829 public static string[] SplitNewline(this string str)
830 {
831 return str.Split(Environment.NewLine.ToCharArray());
832 }
833
834 public static bool Contains(this string[] strs, string id)
835 {
836 if (strs == null || strs.Length == 0)
837 {
838 return false;
839 }
840 for (int i = 0; i < strs.Length; i++)
841 {
842 if (strs[i] == id)
843 {
844 return true;
845 }
846 }
847 return false;
848 }
849
850 public static string Evalute(this string[] array, float val)
851 {
852 return array[(int)Mathf.Clamp((float)(array.Length - 1) * val, 0f, array.Length - 1)];
853 }
854
855 public static string ToShortNumber(this int a)
856 {
857 if (a < 0)
858 {
859 string text;
860 if (a > -1000000)
861 {
862 if (a <= -1000)
863 {
864 return a / 1000 + "K";
865 }
866 text = a.ToString();
867 if (text == null)
868 {
869 return "";
870 }
871 }
872 else
873 {
874 text = a / 1000000 + "M";
875 }
876 return text;
877 }
878 string text2;
879 if (a < 1000000)
880 {
881 if (a >= 1000)
882 {
883 return a / 1000 + "K";
884 }
885 text2 = a.ToString();
886 if (text2 == null)
887 {
888 return "";
889 }
890 }
891 else
892 {
893 text2 = a / 1000000 + "M";
894 }
895 return text2;
896 }
897
898 public static string ToFormat(this int a)
899 {
900 return $"{a:#,0}";
901 }
902
903 public static string ToFormat(this long a)
904 {
905 return $"{a:#,0}";
906 }
907
908 public static string ToText(this int a, bool skipIfZero = true)
909 {
910 object obj;
911 if (!(a == 0 && skipIfZero))
912 {
913 if (a >= 0)
914 {
915 return "+" + a;
916 }
917 obj = a.ToString();
918 if (obj == null)
919 {
920 return "";
921 }
922 }
923 else
924 {
925 obj = "";
926 }
927 return (string)obj;
928 }
929
930 public static string TagColor(this string s, Color c, string txt)
931 {
932 return s + "<color=" + c.ToHex() + ">" + txt + "</color>";
933 }
934
935 public static string TagColor(this string s, Color c)
936 {
937 return "<color=" + c.ToHex() + ">" + s + "</color>";
938 }
939
940 public static string TagSize(this string s, string txt, int size)
941 {
942 return s + "<size=" + size + ">" + txt + "</size>";
943 }
944
945 public static string TagSize(this string s, int size)
946 {
947 return "<size=" + size + ">" + s + "</size>";
948 }
949
950 public static bool HasTag(this string s, string id, char splitter = '/')
951 {
952 return s.Split(splitter).Contains(id);
953 }
954
955 public static string SetTag(this string s, string id, bool enable, char splitter = '/')
956 {
957 s = ((!enable) ? s.RemoveTag(id, splitter) : s.AddTag(id, splitter));
958 return s;
959 }
960
961 public static string AddTag(this string s, string id, char splitter = '/')
962 {
963 if (!s.HasTag(id, splitter))
964 {
965 s = s + (s.IsEmpty() ? "" : ((object)splitter))?.ToString() + id;
966 }
967 return s;
968 }
969
970 public static string RemoveTag(this string s, string id, char splitter = '/')
971 {
972 string[] array = s.Split(splitter);
973 s = "";
974 string[] array2 = array;
975 foreach (string text in array2)
976 {
977 if (!(text == id))
978 {
979 s.AddTag(text, splitter);
980 }
981 }
982 return s;
983 }
984
985 public static string GetFullFileNameWithoutExtension(this FileInfo fileInfo)
986 {
987 return fileInfo.Directory.FullName + "/" + Path.GetFileNameWithoutExtension(fileInfo.Name);
988 }
989
990 public static string GetFullFileNameWithoutExtension(this string path)
991 {
992 return new FileInfo(path).GetFullFileNameWithoutExtension();
993 }
994
995 public static string Pluralize(string s)
996 {
997 if (s == "talisman")
998 {
999 return "talismans";
1000 }
1001 return pluralizer.Pluralize(s);
1002 }
1003
1004 public static string AddArticle(this string s)
1005 {
1006 if (!Lang.setting.addArticle || s.Length < 1)
1007 {
1008 return s;
1009 }
1010 char c = s.ToLower()[0];
1011 s = ((c == 'a' || c == 'i' || c == 'u' || c == 'e' || c == 'o') ? "an " : "a ") + s;
1012 return s;
1013 }
1014
1015 public static string AddArticle(this string s, int num, ArticleStyle style = ArticleStyle.Default, string replace = null)
1016 {
1017 if (!Lang.setting.addArticle || s.Length < 1)
1018 {
1019 return s;
1020 }
1021 char c = s[0];
1022 string text = ((num >= 2) ? (num.ToFormat() + " ") : ((c == 'a' || c == 'i' || c == 'u' || c == 'e' || c == 'o') ? "an " : "a "));
1023 if (num >= 2 && Lang.setting.pluralize)
1024 {
1025 s = ((replace.IsEmpty() || !s.Contains(replace) || s.Contains("limestone stone")) ? Pluralize(s) : s.Replace(replace, Pluralize(replace)));
1026 }
1027 return style switch
1028 {
1029 ArticleStyle.The => "_the".lang().ToTitleCase() + " " + ((num > 1) ? (num + " ") : "") + s,
1030 ArticleStyle.None => ((num > 1) ? (num.ToFormat() + " ") : "") + s.ToTitleCase(),
1031 _ => text + s,
1032 };
1033 }
1034
1035 public static string ToTitleCase(this string s, bool wholeText = false)
1036 {
1037 if (!Lang.setting.capitalize)
1038 {
1039 return s;
1040 }
1041 char[] array = s.ToCharArray();
1042 bool flag = true;
1043 for (int i = 0; i < array.Length; i++)
1044 {
1045 if (flag)
1046 {
1047 array[i] = char.ToUpper(array[i]);
1048 flag = false;
1049 }
1050 if (!wholeText)
1051 {
1052 break;
1053 }
1054 if (array[i] == ' ')
1055 {
1056 flag = true;
1057 }
1058 }
1059 return new string(array);
1060 }
1061
1062 public static void LoopTail<T>(this List<T> list, bool vertical = false) where T : Selectable
1063 {
1064 if (list.Count > 1)
1065 {
1066 Navigation navigation = list[0].navigation;
1067 Navigation navigation2 = list[list.Count - 1].navigation;
1068 if (vertical)
1069 {
1070 navigation.selectOnUp = list[list.Count - 1];
1071 navigation2.selectOnDown = list[0];
1072 }
1073 else
1074 {
1075 navigation.selectOnLeft = list[list.Count - 1];
1076 navigation2.selectOnRight = list[0];
1077 }
1078 list[0].navigation = navigation;
1079 list[list.Count - 1].navigation = navigation2;
1080 }
1081 }
1082
1083 public static void SetNavigation(this Component a, Component b, bool vertical = false)
1084 {
1085 if (!a || !b)
1086 {
1087 return;
1088 }
1089 Selectable component = a.GetComponent<Selectable>();
1090 Selectable component2 = b.GetComponent<Selectable>();
1091 if ((bool)component && (bool)component2)
1092 {
1093 Navigation navigation = component.navigation;
1094 Navigation navigation2 = component2.navigation;
1095 if (vertical)
1096 {
1097 navigation.selectOnUp = component2;
1098 navigation2.selectOnDown = component;
1099 }
1100 else
1101 {
1102 navigation.selectOnLeft = component2;
1103 navigation2.selectOnRight = component;
1104 }
1105 component.navigation = navigation;
1106 component2.navigation = navigation2;
1107 }
1108 }
1109
1110 public static void LoopSelectable(this List<Selectable> sels, bool vertical = true, bool horizonal = true, bool asGroup = true)
1111 {
1112 for (int i = 0; i < sels.Count; i++)
1113 {
1114 Selectable selectable = sels[i];
1115 Selectable selectable2 = sels[0];
1116 Navigation navigation = selectable.navigation;
1117 if (horizonal)
1118 {
1119 navigation.selectOnRight = ((i + 1 < sels.Count) ? sels[i + 1] : selectable2);
1120 }
1121 if (asGroup)
1122 {
1123 for (int j = i + 1; j < sels.Count; j++)
1124 {
1125 if (sels[j].transform.position.y < selectable.transform.position.y)
1126 {
1127 selectable2 = sels[j];
1128 break;
1129 }
1130 }
1131 }
1132 else
1133 {
1134 selectable2 = ((i + 1 < sels.Count) ? sels[i + 1] : selectable2);
1135 }
1136 if (vertical)
1137 {
1138 navigation.selectOnDown = selectable2;
1139 }
1140 selectable.navigation = navigation;
1141 }
1142 for (int num = sels.Count - 1; num >= 0; num--)
1143 {
1144 Selectable selectable3 = sels[num];
1145 Selectable selectable4 = sels[sels.Count - 1];
1146 Navigation navigation2 = selectable3.navigation;
1147 if (horizonal)
1148 {
1149 navigation2.selectOnLeft = ((num > 0) ? sels[num - 1] : selectable4);
1150 }
1151 if (asGroup)
1152 {
1153 int num2 = sels.Count - 1;
1154 for (int num3 = num - 1; num3 >= 0; num3--)
1155 {
1156 if (sels[num3].transform.position.y > selectable3.transform.position.y)
1157 {
1158 num2 = num3;
1159 break;
1160 }
1161 }
1162 int num4 = num2;
1163 while (num4 >= 0 && !(sels[num4].transform.position.y > sels[num2].transform.position.y))
1164 {
1165 selectable4 = sels[num4];
1166 num4--;
1167 }
1168 }
1169 else
1170 {
1171 selectable4 = ((num > 0) ? sels[num - 1] : selectable4);
1172 }
1173 if (vertical)
1174 {
1175 navigation2.selectOnUp = ((selectable4 == selectable3) ? sels[sels.Count - 1] : selectable4);
1176 }
1177 navigation2.mode = Navigation.Mode.Explicit;
1178 selectable3.navigation = navigation2;
1179 }
1180 }
1181
1182 public static void LoopSelectable(this Transform l, bool vertical = true, bool horizonal = true, bool asGroup = true)
1183 {
1184 List<Selectable> list = l.GetComponentsInChildren<Selectable>().ToList();
1185 for (int num = list.Count - 1; num >= 0; num--)
1186 {
1187 if (!list[num].interactable || list[num].navigation.mode == Navigation.Mode.None)
1188 {
1189 list.RemoveAt(num);
1190 }
1191 }
1192 list.LoopSelectable(vertical, horizonal, asGroup);
1193 }
1194
1195 public static Color ToColor(this string s)
1196 {
1197 Color color = Color.white;
1198 ColorUtility.TryParseHtmlString("#" + s, out color);
1199 return color;
1200 }
1201
1202 public static void SetAlpha(this Image c, float a)
1203 {
1204 c.color = new Color(c.color.r, c.color.g, c.color.b, a);
1205 }
1206
1207 public static void SetAlpha(this RawImage c, float a)
1208 {
1209 c.color = new Color(c.color.r, c.color.g, c.color.b, a);
1210 }
1211
1212 public static Color SetAlpha(this Color c, float a)
1213 {
1214 c.a = a;
1215 return c;
1216 }
1217
1218 public static Color Multiply(this Color c, float mtp, float add)
1219 {
1220 return new Color(c.r * mtp + add, c.g * mtp + add, c.b * mtp + add, c.a);
1221 }
1222
1223 public static string Tag(this Color c)
1224 {
1225 return "<color=" + $"#{(int)(c.r * 255f):X2}{(int)(c.g * 255f):X2}{(int)(c.b * 255f):X2}" + ">";
1226 }
1227
1228 public static string ToHex(this Color c)
1229 {
1230 return $"#{(int)(c.r * 255f):X2}{(int)(c.g * 255f):X2}{(int)(c.b * 255f):X2}";
1231 }
1232
1233 public static void SetOnClick(this Button b, Action action)
1234 {
1235 b.onClick.RemoveAllListeners();
1236 b.onClick.AddListener(delegate
1237 {
1238 action();
1239 });
1240 }
1241
1242 public static void SetListener(this Button.ButtonClickedEvent e, Action action)
1243 {
1244 e.RemoveAllListeners();
1245 e.AddListener(delegate
1246 {
1247 action();
1248 });
1249 }
1250
1251 public static void SetAlpha(this Text text, float aloha = 1f)
1252 {
1253 text.color = new Color(text.color.r, text.color.g, text.color.b, aloha);
1254 }
1255
1256 public static void SetSlider(this Slider slider, float value, Func<float, string> action, bool notify)
1257 {
1258 slider.SetSlider(value, action, -1, -1, notify);
1259 }
1260
1261 public static void SetSlider(this Slider slider, float value, Func<float, string> action, int min = -1, int max = -1, bool notify = true)
1262 {
1263 slider.onValueChanged.RemoveAllListeners();
1264 slider.onValueChanged.AddListener(delegate(float a)
1265 {
1266 slider.GetComponentInChildren<Text>(includeInactive: true).text = action(a);
1267 });
1268 if (min != -1)
1269 {
1270 slider.minValue = min;
1271 slider.maxValue = max;
1272 }
1273 if (notify)
1274 {
1275 slider.value = value;
1276 }
1277 else
1278 {
1279 slider.SetValueWithoutNotify(value);
1280 }
1281 slider.GetComponentInChildren<Text>(includeInactive: true).text = action(value);
1282 }
1283
1284 public static T GetOrCreate<T>(this Component t) where T : Component
1285 {
1286 T val = t.gameObject.GetComponent<T>();
1287 if (!val)
1288 {
1289 val = t.gameObject.AddComponent<T>();
1290 }
1291 return val;
1292 }
1293
1294 public static RectTransform Rect(this Component c)
1295 {
1296 return c.transform as RectTransform;
1297 }
1298
1299 public static void CopyRect(this RectTransform r, RectTransform t)
1300 {
1301 r.pivot = t.pivot;
1302 r.sizeDelta = t.sizeDelta;
1303 r.anchorMin = t.anchorMin;
1304 r.anchorMax = t.anchorMax;
1305 r.anchoredPosition = t.anchoredPosition;
1306 }
1307
1308 public static void ToggleActive(this Component c)
1309 {
1310 c.SetActive(!c.gameObject.activeSelf);
1311 }
1312
1313 public static void SetActive(this Component c, bool enable)
1314 {
1315 if (c.gameObject.activeSelf != enable)
1316 {
1317 c.gameObject.SetActive(enable);
1318 }
1319 }
1320
1321 public static void SetActive(this Component c, bool enable, Action<bool> onChangeState)
1322 {
1323 if (c.gameObject.activeSelf != enable)
1324 {
1325 c.gameObject.SetActive(enable);
1326 onChangeState(enable);
1327 }
1328 }
1329
1330 public static Selectable GetSelectable(this GameObject go)
1331 {
1332 return go.GetComponentInChildren<Selectable>();
1333 }
1334
1335 public static void SetLayerRecursively(this GameObject obj, int layer)
1336 {
1337 obj.layer = layer;
1338 foreach (Transform item in obj.transform)
1339 {
1340 item.gameObject.SetLayerRecursively(layer);
1341 }
1342 }
1343
1344 public static bool IsInteractable(this GameObject obj)
1345 {
1346 Selectable selectable = (obj ? obj.GetComponent<Selectable>() : null);
1347 if ((bool)selectable)
1348 {
1349 return selectable.interactable;
1350 }
1351 return false;
1352 }
1353
1354 public static bool IsChildOf(this GameObject c, GameObject root)
1355 {
1356 if (c.transform == root.transform)
1357 {
1358 return true;
1359 }
1360 if ((bool)c.transform.parent)
1361 {
1362 return c.transform.parent.gameObject.IsChildOf(root);
1363 }
1364 return false;
1365 }
1366
1367 public static bool IsPrefab(this Component c)
1368 {
1369 return c.gameObject.scene.name == null;
1370 }
1371
1372 public static T CreateMold<T>(this Component c, string name = null) where T : Component
1373 {
1374 T result = null;
1375 for (int i = 0; i < c.transform.childCount; i++)
1376 {
1377 T component = c.transform.GetChild(i).GetComponent<T>();
1378 if ((bool)component && (name.IsEmpty() || name == component.name))
1379 {
1380 component.gameObject.SetActive(value: false);
1381 result = component;
1382 break;
1383 }
1384 }
1385 c.DestroyChildren();
1386 return result;
1387 }
1388
1389 public static Transform Find(this Component c, string name = null)
1390 {
1391 return c.Find<Transform>(name);
1392 }
1393
1394 public static T Find<T>(this Component c, string name = null, bool recursive = false) where T : Component
1395 {
1396 if (recursive)
1397 {
1398 T[] componentsInChildren = c.transform.GetComponentsInChildren<T>();
1399 foreach (T val in componentsInChildren)
1400 {
1401 if (name == null || name == val.name)
1402 {
1403 return val;
1404 }
1405 }
1406 return null;
1407 }
1408 for (int j = 0; j < c.transform.childCount; j++)
1409 {
1410 T component = c.transform.GetChild(j).GetComponent<T>();
1411 if ((bool)component && (name == null || name == component.name))
1412 {
1413 return component;
1414 }
1415 }
1416 return null;
1417 }
1418
1419 public static GameObject FindTagInParents(this Component c, string tag, bool includeInactive = true)
1420 {
1421 Transform transform = c.transform;
1422 for (int i = 0; i < transform.childCount; i++)
1423 {
1424 Transform child = transform.GetChild(i);
1425 if ((includeInactive || child.gameObject.activeSelf) && child.tag == tag)
1426 {
1427 return child.gameObject;
1428 }
1429 }
1430 if ((bool)transform.parent)
1431 {
1432 return transform.parent.FindTagInParents(tag, includeInactive);
1433 }
1434 return null;
1435 }
1436
1437 public static T GetComponentInChildrenExcludSelf<T>(this Transform c) where T : Component
1438 {
1439 for (int i = 0; i < c.childCount; i++)
1440 {
1441 T component = c.GetChild(i).GetComponent<T>();
1442 if ((bool)component)
1443 {
1444 return component;
1445 }
1446 }
1447 return null;
1448 }
1449
1450 public static List<T> GetComponentsInDirectChildren<T>(this Transform comp, bool includeInactive = true) where T : Component
1451 {
1452 List<T> list = new List<T>();
1453 Transform transform = comp.transform;
1454 for (int i = 0; i < transform.childCount; i++)
1455 {
1456 T component = transform.GetChild(i).GetComponent<T>();
1457 if ((bool)component && (includeInactive || component.gameObject.activeInHierarchy))
1458 {
1459 list.Add(component);
1460 }
1461 }
1462 return list;
1463 }
1464
1465 public static List<T> GetComponentsInDirectChildren<T>(this Component comp, bool includeInactive = true) where T : Component
1466 {
1467 List<T> list = new List<T>();
1468 Transform transform = comp.transform;
1469 for (int i = 0; i < transform.childCount; i++)
1470 {
1471 T component = transform.GetChild(i).GetComponent<T>();
1472 if ((bool)component && (includeInactive || component.gameObject.activeInHierarchy))
1473 {
1474 list.Add(component);
1475 }
1476 }
1477 return list;
1478 }
1479
1480 public static T GetComponentInDirectChildren<T>(this Component comp) where T : Component
1481 {
1482 Transform transform = comp.transform;
1483 for (int i = 0; i < transform.childCount; i++)
1484 {
1485 T component = transform.GetChild(i).GetComponent<T>();
1486 if ((bool)component)
1487 {
1488 return component;
1489 }
1490 }
1491 return null;
1492 }
1493
1494 public static void DestroyChildren(this Component component, bool destroyInactive = false, bool ignoreDestroy = true)
1495 {
1496 if (!component || !component.transform)
1497 {
1498 Debug.LogWarning("DestroyChlidren:" + component);
1499 return;
1500 }
1501 for (int num = component.transform.childCount - 1; num >= 0; num--)
1502 {
1503 GameObject gameObject = component.transform.GetChild(num).gameObject;
1504 if ((!ignoreDestroy || !(gameObject.tag == "IgnoreDestroy")) && (destroyInactive || gameObject.activeSelf))
1505 {
1506 UnityEngine.Object.DestroyImmediate(gameObject);
1507 }
1508 }
1509 }
1510
1511 public static bool IsMouseOver(this RectTransform r, Camera cam)
1512 {
1513 return RectTransformUtility.RectangleContainsScreenPoint(r, Input.mousePosition, cam);
1514 }
1515
1516 public static void RebuildLayout(this Component c, bool recursive = false)
1517 {
1518 if (recursive)
1519 {
1520 foreach (Transform item in c.transform)
1521 {
1522 if (item is RectTransform)
1523 {
1524 item.RebuildLayout(recursive: true);
1525 }
1526 }
1527 }
1528 LayoutRebuilder.ForceRebuildLayoutImmediate(c.transform as RectTransform);
1529 }
1530
1531 public static void RebuildLayoutTo<T>(this Component c) where T : Component
1532 {
1533 c.RebuildLayout();
1534 if ((bool)c.transform.parent && !c.transform.parent.GetComponent<T>())
1535 {
1536 c.transform.parent.RebuildLayoutTo<T>();
1537 }
1538 }
1539
1540 public static void RebuildLayoutTo(this Component c, Component target)
1541 {
1542 c.RebuildLayout();
1543 if (!(c == target) && (bool)c.transform.parent)
1544 {
1545 c.transform.parent.RebuildLayoutTo(target);
1546 }
1547 }
1548
1549 public static void SetRect(this RectTransform r, float x, float y, float w, float h, float pivotX, float pivotY, float minX, float minY, float maxX, float maxY)
1550 {
1551 r.SetPivot(pivotX, pivotY);
1552 r.SetAnchor(minX, minY, maxX, maxY);
1553 if (w != -1f)
1554 {
1555 r.sizeDelta = new Vector2(w, h);
1556 }
1557 r.anchoredPosition = new Vector2((x == -1f) ? r.anchoredPosition.x : x, (y == -1f) ? r.anchoredPosition.y : y);
1558 }
1559
1560 public static void SetPivot(this RectTransform r, float x, float y)
1561 {
1562 r.pivot = new Vector2(x, y);
1563 }
1564
1565 public static void SetAnchor(this RectTransform r, float minX, float minY, float maxX, float maxY)
1566 {
1567 r.anchorMin = new Vector2(minX, minY);
1568 r.anchorMax = new Vector2(maxX, maxY);
1569 }
1570
1571 public static void _SetAnchor(this RectTransform _rect, RectPosition anchor)
1572 {
1573 switch (anchor)
1574 {
1575 case RectPosition.TopCenter:
1576 _rect.SetAnchor(0.5f, 1f, 0.5f, 1f);
1577 break;
1578 case RectPosition.BottomCenter:
1579 _rect.SetAnchor(0.5f, 0f, 0.5f, 0f);
1580 break;
1581 case RectPosition.TopLEFT:
1582 _rect.SetAnchor(0f, 1f, 0f, 1f);
1583 break;
1584 case RectPosition.TopRIGHT:
1585 _rect.SetAnchor(1f, 1f, 1f, 1f);
1586 break;
1587 case RectPosition.BottomLEFT:
1588 _rect.SetAnchor(0f, 0f, 0f, 0f);
1589 break;
1590 case RectPosition.BottomRIGHT:
1591 _rect.SetAnchor(1f, 0f, 1f, 0f);
1592 break;
1593 case RectPosition.Left:
1594 _rect.SetAnchor(0f, 0.5f, 0f, 0.5f);
1595 break;
1596 case RectPosition.Right:
1597 _rect.SetAnchor(1f, 0.5f, 1f, 0.5f);
1598 break;
1599 default:
1600 _rect.SetAnchor(0.5f, 0.5f, 0.5f, 0.5f);
1601 break;
1602 }
1603 }
1604
1605 public static void SetAnchor(this RectTransform _rect, RectPosition anchor = RectPosition.Auto)
1606 {
1607 Vector3 position = _rect.position;
1608 _rect._SetAnchor((anchor == RectPosition.Auto) ? _rect.GetAnchor() : anchor);
1609 _rect.position = position;
1610 }
1611
1612 public static RectPosition GetAnchor(this RectTransform _rect)
1613 {
1614 Vector3 position = _rect.position;
1615 int width = Screen.width;
1616 int height = Screen.height;
1617 bool flag = position.y > (float)height * 0.5f;
1618 if (position.x > (float)width * 0.3f && position.x < (float)width * 0.7f)
1619 {
1620 if (position.y > (float)height * 0.3f && position.y < (float)height * 0.7f)
1621 {
1622 return RectPosition.Center;
1623 }
1624 if (!flag)
1625 {
1626 return RectPosition.BottomCenter;
1627 }
1628 return RectPosition.TopCenter;
1629 }
1630 if (position.x < (float)width * 0.5f)
1631 {
1632 if (!flag)
1633 {
1634 return RectPosition.BottomLEFT;
1635 }
1636 return RectPosition.TopLEFT;
1637 }
1638 if (!flag)
1639 {
1640 return RectPosition.BottomRIGHT;
1641 }
1642 return RectPosition.TopRIGHT;
1643 }
1644
1645 public static Transform GetLastChild(this Transform trans)
1646 {
1647 return trans.GetChild(trans.childCount - 1);
1648 }
1649
1650 public static Vector2 ToVector2(this Vector3 self)
1651 {
1652 return new Vector2(self.x, self.z);
1653 }
1654
1655 public static void SetScale(this SpriteRenderer renderer, float size)
1656 {
1657 float x = renderer.bounds.size.x;
1658 float y = renderer.bounds.size.y;
1659 float x2 = size / x;
1660 float y2 = size / y;
1661 renderer.transform.localScale = new Vector3(x2, y2, 1f);
1662 }
1663
1664 private static float GetForwardDiffPoint(Vector2 forward)
1665 {
1666 if (object.Equals(forward, Vector2.up))
1667 {
1668 return 90f;
1669 }
1670 object.Equals(forward, Vector2.right);
1671 return 0f;
1672 }
1673
1674 public static void LookAt2D(this Transform self, Transform target, Vector2 forward)
1675 {
1676 self.LookAt2D(target.position, forward);
1677 }
1678
1679 public static void LookAt2D(this Transform self, Vector3 target, Vector2 forward)
1680 {
1681 float forwardDiffPoint = GetForwardDiffPoint(forward);
1682 Vector3 vector = target - self.position;
1683 float num = Mathf.Atan2(vector.y, vector.x) * 57.29578f;
1684 self.rotation = Quaternion.AngleAxis(num - forwardDiffPoint, Vector3.forward);
1685 }
1686
1687 public static float Distance(this Transform t, Vector2 pos)
1688 {
1689 return Vector3.Distance(t.position, pos);
1690 }
1691
1692 public static Vector3 Plus(this Vector3 v, Vector2 v2)
1693 {
1694 v.x += v2.x;
1695 v.y += v2.y;
1696 return v;
1697 }
1698
1699 public static Vector3 SetZ(this Vector3 v, float a)
1700 {
1701 v.z = a;
1702 return v;
1703 }
1704
1705 public static Vector3 SetY(this Vector3 v, float a)
1706 {
1707 v.y = a;
1708 return v;
1709 }
1710
1711 public static Vector3 PlusX(this Vector3 v, float a)
1712 {
1713 v.x += a;
1714 return v;
1715 }
1716
1717 public static Vector3 PlusY(this Vector3 v, float a)
1718 {
1719 v.y += a;
1720 return v;
1721 }
1722
1723 public static Vector3 PlusZ(this Vector3 v, float a)
1724 {
1725 v.z += a;
1726 return v;
1727 }
1728
1729 public static void SetPosition(this Transform transform, float x, float y, float z)
1730 {
1731 vector3.Set(x, y, z);
1732 transform.position = vector3;
1733 }
1734
1735 public static void SetPositionX(this Transform transform, float x)
1736 {
1737 vector3.Set(x, transform.position.y, transform.position.z);
1738 transform.position = vector3;
1739 }
1740
1741 public static void SetPositionY(this Transform transform, float y)
1742 {
1743 vector3.Set(transform.position.x, y, transform.position.z);
1744 transform.position = vector3;
1745 }
1746
1747 public static void SetPositionZ(this Transform transform, float z)
1748 {
1749 vector3.Set(transform.position.x, transform.position.y, z);
1750 transform.position = vector3;
1751 }
1752
1753 public static void AddPosition(this Transform transform, float x, float y, float z)
1754 {
1755 vector3.Set(transform.position.x + x, transform.position.y + y, transform.position.z + z);
1756 transform.position = vector3;
1757 }
1758
1759 public static void AddPositionX(this Transform transform, float x)
1760 {
1761 vector3.Set(transform.position.x + x, transform.position.y, transform.position.z);
1762 transform.position = vector3;
1763 }
1764
1765 public static void AddPositionY(this Transform transform, float y)
1766 {
1767 vector3.Set(transform.position.x, transform.position.y + y, transform.position.z);
1768 transform.position = vector3;
1769 }
1770
1771 public static void AddPositionZ(this Transform transform, float z)
1772 {
1773 vector3.Set(transform.position.x, transform.position.y, transform.position.z + z);
1774 transform.position = vector3;
1775 }
1776
1777 public static void SetLocalPosition(this Transform transform, float x, float y, float z)
1778 {
1779 vector3.Set(x, y, z);
1780 transform.localPosition = vector3;
1781 }
1782
1783 public static void SetLocalPositionX(this Transform transform, float x)
1784 {
1785 vector3.Set(x, transform.localPosition.y, transform.localPosition.z);
1786 transform.localPosition = vector3;
1787 }
1788
1789 public static void SetLocalPositionY(this Transform transform, float y)
1790 {
1791 vector3.Set(transform.localPosition.x, y, transform.localPosition.z);
1792 transform.localPosition = vector3;
1793 }
1794
1795 public static void SetLocalPositionZ(this Transform transform, float z)
1796 {
1797 vector3.Set(transform.localPosition.x, transform.localPosition.y, z);
1798 transform.localPosition = vector3;
1799 }
1800
1801 public static void AddLocalPosition(this Transform transform, float x, float y, float z)
1802 {
1803 vector3.Set(transform.localPosition.x + x, transform.localPosition.y + y, transform.localPosition.z + z);
1804 transform.localPosition = vector3;
1805 }
1806
1807 public static void AddLocalPositionX(this Transform transform, float x)
1808 {
1809 vector3.Set(transform.localPosition.x + x, transform.localPosition.y, transform.localPosition.z);
1810 transform.localPosition = vector3;
1811 }
1812
1813 public static void AddLocalPositionY(this Transform transform, float y)
1814 {
1815 vector3.Set(transform.localPosition.x, transform.localPosition.y + y, transform.localPosition.z);
1816 transform.localPosition = vector3;
1817 }
1818
1819 public static void AddLocalPositionZ(this Transform transform, float z)
1820 {
1821 vector3.Set(transform.localPosition.x, transform.localPosition.y, transform.localPosition.z + z);
1822 transform.localPosition = vector3;
1823 }
1824
1825 public static void SetLocalScale(this Transform transform, float x, float y, float z)
1826 {
1827 vector3.Set(x, y, z);
1828 transform.localScale = vector3;
1829 }
1830
1831 public static void SetLocalScaleX(this Transform transform, float x)
1832 {
1833 vector3.Set(x, transform.localScale.y, transform.localScale.z);
1834 transform.localScale = vector3;
1835 }
1836
1837 public static void SetLocalScaleY(this Transform transform, float y)
1838 {
1839 vector3.Set(transform.localScale.x, y, transform.localScale.z);
1840 transform.localScale = vector3;
1841 }
1842
1843 public static void SetLocalScaleZ(this Transform transform, float z)
1844 {
1845 vector3.Set(transform.localScale.x, transform.localScale.y, z);
1846 transform.localScale = vector3;
1847 }
1848
1849 public static void AddLocalScale(this Transform transform, float x, float y, float z)
1850 {
1851 vector3.Set(transform.localScale.x + x, transform.localScale.y + y, transform.localScale.z + z);
1852 transform.localScale = vector3;
1853 }
1854
1855 public static void AddLocalScaleX(this Transform transform, float x)
1856 {
1857 vector3.Set(transform.localScale.x + x, transform.localScale.y, transform.localScale.z);
1858 transform.localScale = vector3;
1859 }
1860
1861 public static void AddLocalScaleY(this Transform transform, float y)
1862 {
1863 vector3.Set(transform.localScale.x, transform.localScale.y + y, transform.localScale.z);
1864 transform.localScale = vector3;
1865 }
1866
1867 public static void AddLocalScaleZ(this Transform transform, float z)
1868 {
1869 vector3.Set(transform.localScale.x, transform.localScale.y, transform.localScale.z + z);
1870 transform.localScale = vector3;
1871 }
1872
1873 public static void SetEulerAngles(this Transform transform, float x, float y, float z)
1874 {
1875 vector3.Set(x, y, z);
1876 transform.eulerAngles = vector3;
1877 }
1878
1879 public static void SetEulerAnglesX(this Transform transform, float x)
1880 {
1881 vector3.Set(x, transform.localEulerAngles.y, transform.localEulerAngles.z);
1882 transform.eulerAngles = vector3;
1883 }
1884
1885 public static void SetEulerAnglesY(this Transform transform, float y)
1886 {
1887 vector3.Set(transform.localEulerAngles.x, y, transform.localEulerAngles.z);
1888 transform.eulerAngles = vector3;
1889 }
1890
1891 public static void SetEulerAnglesZ(this Transform transform, float z)
1892 {
1893 vector3.Set(transform.localEulerAngles.x, transform.localEulerAngles.y, z);
1894 transform.eulerAngles = vector3;
1895 }
1896
1897 public static void AddEulerAngles(this Transform transform, float x, float y, float z)
1898 {
1899 vector3.Set(transform.eulerAngles.x + x, transform.eulerAngles.y + y, transform.eulerAngles.z + z);
1900 transform.eulerAngles = vector3;
1901 }
1902
1903 public static void AddEulerAnglesX(this Transform transform, float x)
1904 {
1905 vector3.Set(transform.eulerAngles.x + x, transform.eulerAngles.y, transform.eulerAngles.z);
1906 transform.eulerAngles = vector3;
1907 }
1908
1909 public static void AddEulerAnglesY(this Transform transform, float y)
1910 {
1911 vector3.Set(transform.eulerAngles.x, transform.eulerAngles.y + y, transform.eulerAngles.z);
1912 transform.eulerAngles = vector3;
1913 }
1914
1915 public static void AddEulerAnglesZ(this Transform transform, float z)
1916 {
1917 vector3.Set(transform.eulerAngles.x, transform.eulerAngles.y, transform.eulerAngles.z + z);
1918 transform.eulerAngles = vector3;
1919 }
1920
1921 public static void SetLocalEulerAngles(this Transform transform, float x, float y, float z)
1922 {
1923 vector3.Set(x, y, z);
1924 transform.localEulerAngles = vector3;
1925 }
1926
1927 public static void SetLocalEulerAnglesX(this Transform transform, float x)
1928 {
1929 vector3.Set(x, transform.localEulerAngles.y, transform.localEulerAngles.z);
1930 transform.localEulerAngles = vector3;
1931 }
1932
1933 public static void SetLocalEulerAnglesY(this Transform transform, float y)
1934 {
1935 vector3.Set(transform.localEulerAngles.x, y, transform.localEulerAngles.z);
1936 transform.localEulerAngles = vector3;
1937 }
1938
1939 public static void SetLocalEulerAnglesZ(this Transform transform, float z)
1940 {
1941 vector3.Set(transform.localEulerAngles.x, transform.localEulerAngles.y, z);
1942 transform.localEulerAngles = vector3;
1943 }
1944
1945 public static void AddLocalEulerAngles(this Transform transform, float x, float y, float z)
1946 {
1947 vector3.Set(transform.localEulerAngles.x + x, transform.localEulerAngles.y + y, transform.localEulerAngles.z + z);
1948 transform.localEulerAngles = vector3;
1949 }
1950
1951 public static void AddLocalEulerAnglesX(this Transform transform, float x)
1952 {
1953 vector3.Set(transform.localEulerAngles.x + x, transform.localEulerAngles.y, transform.localEulerAngles.z);
1954 transform.localEulerAngles = vector3;
1955 }
1956
1957 public static void AddLocalEulerAnglesY(this Transform transform, float y)
1958 {
1959 vector3.Set(transform.localEulerAngles.x, transform.localEulerAngles.y + y, transform.localEulerAngles.z);
1960 transform.localEulerAngles = vector3;
1961 }
1962
1963 public static void AddLocalEulerAnglesZ(this Transform transform, float z)
1964 {
1965 vector3.Set(transform.localEulerAngles.x, transform.localEulerAngles.y, transform.localEulerAngles.z + z);
1966 transform.localEulerAngles = vector3;
1967 }
1968
1969 public static void ToggleKeyword(this Material m, string id, bool enable)
1970 {
1971 if (enable)
1972 {
1973 m.EnableKeyword(id);
1974 }
1975 else
1976 {
1977 m.DisableKeyword(id);
1978 }
1979 }
1980
1981 public static void ForeachReverse<T>(this IList<T> items, Action<T> action)
1982 {
1983 for (int num = items.Count - 1; num >= 0; num--)
1984 {
1985 action(items[num]);
1986 }
1987 }
1988
1989 public static void ForeachReverse<T>(this IList<T> items, Func<T, bool> action)
1990 {
1991 int num = items.Count - 1;
1992 while (num >= 0 && !action(items[num]))
1993 {
1994 num--;
1995 }
1996 }
1997
1998 public static float ClampAngle(this float angle)
1999 {
2000 if (angle < 0f)
2001 {
2002 return 360f - (0f - angle) % 360f;
2003 }
2004 return angle % 360f;
2005 }
2006
2007 public static Vector3 Random(this Vector3 v)
2008 {
2009 return new Vector3(Rand.Range(0f - v.x, v.x), Rand.Range(0f - v.y, v.y), Rand.Range(0f - v.z, v.z));
2010 }
2011
2012 public static T Instantiate<T>(this T s) where T : ScriptableObject
2013 {
2014 string name = s.name;
2015 T val = UnityEngine.Object.Instantiate(s);
2016 val.name = name;
2017 return val;
2018 }
2019
2020 public static int GetRuntimeEventCount(this UnityEventBase unityEvent)
2021 {
2022 Type typeFromHandle = typeof(UnityEventBase);
2023 Assembly assembly = Assembly.GetAssembly(typeFromHandle);
2024 Type type = assembly.GetType("UnityEngine.Events.InvokableCallList");
2025 Type type2 = assembly.GetType("UnityEngine.Events.BaseInvokableCall");
2026 Type type3 = typeof(List<>).MakeGenericType(type2);
2027 FieldInfo field = typeFromHandle.GetField("m_Calls", BindingFlags.Instance | BindingFlags.NonPublic);
2028 FieldInfo field2 = type.GetField("m_RuntimeCalls", BindingFlags.Instance | BindingFlags.NonPublic);
2029 object value = field.GetValue(unityEvent);
2030 object value2 = field2.GetValue(value);
2031 return (int)type3.GetProperty("Count").GetValue(value2, null);
2032 }
2033}
ArticleStyle
Definition: ArticleStyle.cs:2
RectPosition
Definition: RectPosition.cs:2
static string TryAddExtension(this string s, string ext)
static string StripLastPun(this string str)
static byte SetBit(this byte pByte, int bitNo, bool value)
static T GetComponentInChildrenExcludSelf< T >(this Transform c)
static int[] SplitToInts(this string str, char separator)
static void SetEulerAnglesZ(this Transform transform, float z)
static T CreateMold< T >(this Component c, string name=null)
static void SetAnchor(this RectTransform r, float minX, float minY, float maxX, float maxY)
static T GetField< T >(this object o, string name)
static void SetPosition(this Transform transform, float x, float y, float z)
static string TagColor(this string s, Color c, string txt)
static void SetEulerAnglesX(this Transform transform, float x)
static int NextIndex< TValue >(this IList< TValue > source, TValue val)
static string RemoveAllTags(this string text)
static int ClampMax(this int v, int max)
static void Each< TValue >(this IList< TValue > list, Action< TValue > action)
static void AddLocalPosition(this Transform transform, float x, float y, float z)
static T PrevEnum< T >(this T src)
static string langGame(this string s, string ref1, string ref2=null, string ref3=null, string ref4=null)
static Vector3 vector3
static string Pluralize(string s)
static TKey[] CopyKeys< TKey, TValue >(this IDictionary< TKey, TValue > dict)
static void AddLocalEulerAnglesY(this Transform transform, float y)
static IList< TValue > Shuffle< TValue >(this IList< TValue > list)
static string Parentheses(this string str)
static void AddLocalScale(this Transform transform, float x, float y, float z)
static string ToTitleCase(this string s, bool wholeText=false)
static T Find< T >(this Component c, string name=null, bool recursive=false)
static TValue Clamp< TValue >(this IList< TValue > source, int i)
static TValue TryGetValue< TKey, TValue >(this IDictionary< TKey, TValue > source, TKey key, TValue fallback=default(TValue))
static void SetLocalEulerAngles(this Transform transform, float x, float y, float z)
static string ToFormat(this int a)
static void LoopSelectable(this List< Selectable > sels, bool vertical=true, bool horizonal=true, bool asGroup=true)
static string langPlural(this string s, int i)
static void SetScale(this SpriteRenderer renderer, float size)
static int ToInt(this string str, Type type)
static float GetForwardDiffPoint(Vector2 forward)
static T ToEnum< T >(this int value)
static bool IsChildOf(this GameObject c, GameObject root)
static int Calc(this string str, int power=0, int ele=0, int p2=0)
static void AddLocalScaleY(this Transform transform, float y)
static void SetSlider(this Slider slider, float value, Func< float, string > action, int min=-1, int max=-1, bool notify=true)
static string StripPun(this string str, bool stripComma, bool insertSpaceForComma=false)
static int IndexOf(this IList< Component > list, GameObject go)
static Vector3 SetY(this Vector3 v, float a)
static void AddPositionX(this Transform transform, float x)
static void LoopTail< T >(this List< T > list, bool vertical=false)
static T GetOrCreate< T >(this Component t)
static bool IsOn(this int data, int digit)
static IList< TValue > Copy< TValue >(this IList< TValue > list)
static float FromInt2(this int a)
static Selectable GetSelectable(this GameObject go)
static string AddArticle(this string s, int num, ArticleStyle style=ArticleStyle.Default, string replace=null)
static void SetLocalPositionZ(this Transform transform, float z)
static void SetLocalEulerAnglesZ(this Transform transform, float z)
static void RebuildLayoutTo(this Component c, Component target)
static bool IsEmpty(this string str)
static bool IsPrefab(this Component c)
static void SetActive(this Component c, bool enable)
static void ToDictionary< T >(this IList< UPair< T > > list, ref Dictionary< string, T > dic)
static string RemoveTag(this string s, string id, char splitter='/')
static void AddEulerAnglesZ(this Transform transform, float z)
static void SetProperty< T >(this object o, string name, T value)
static bool Within(this byte v, byte v2, byte range)
static void SetAlpha(this Text text, float aloha=1f)
static void ToggleActive(this Component c)
static bool Contains(this string[] strs, string id)
static int GetRuntimeEventCount(this UnityEventBase unityEvent)
static string[] SplitByNewline(this string text)
static void SetLayerRecursively(this GameObject obj, int layer)
static void SetActive(this Component c, bool enable, Action< bool > onChangeState)
static void SetLocalEulerAnglesY(this Transform transform, float y)
static bool Within(this int v, int v2, int range)
static Vector2 ToVector2(this Vector3 self)
static bool HasTag(this string s, string id, char splitter='/')
static void LoopSelectable(this Transform l, bool vertical=true, bool horizonal=true, bool asGroup=true)
static string[] langList(this string s)
static Color ToColor(this string s)
static void AddLocalEulerAnglesX(this Transform transform, float x)
static void SetLocalPosition(this Transform transform, float x, float y, float z)
static void AddPositionY(this Transform transform, float y)
static RectPosition GetAnchor(this RectTransform _rect)
static bool GetBit(this byte pByte, int bitNo)
static void ToggleKeyword(this Material m, string id, bool enable)
static string Tag(this Color c)
static T NextEnum< T >(this T src)
static void SetPositionX(this Transform transform, float x)
static void SetLocalScaleX(this Transform transform, float x)
static TValue GetOrCreate< TKey, TValue >(this IDictionary< TKey, TValue > dict, TKey key, Func< TValue > func=null)
static Vector3 PlusY(this Vector3 v, float a)
static bool IsEmpty(this Array array)
static T GetProperty< T >(this object o, string name)
static void SetLocalPositionX(this Transform transform, float x)
static void SetLocalEulerAnglesX(this Transform transform, float x)
static float Distance(this Transform t, Vector2 pos)
static void AddLocalScaleX(this Transform transform, float x)
static float FromInt3(this int a)
static void AddEulerAngles(this Transform transform, float x, float y, float z)
static string TagSize(this string s, int size)
static void AddLocalScaleZ(this Transform transform, float z)
static void SetAlpha(this RawImage c, float a)
static void AddEulerAnglesX(this Transform transform, float x)
static Transform Find(this Component c, string name=null)
static void DestroyChildren(this Component component, bool destroyInactive=false, bool ignoreDestroy=true)
static bool IsInteractable(this GameObject obj)
static void Sort< T >(this IList< T > list, Comparison< T > comparison)
static int ToInt3(this float a)
static TValue RandomItem< TKey, TValue >(this IDictionary< TKey, TValue > source)
static string StripBrackets(this string str)
static string ToHex(this Color c)
static TValue RandomItemWeighted< TValue >(this IList< TValue > source, Func< TValue, float > getWeight)
static string lang(this string s)
static float ToFloat(this string str)
static Vector3 SetZ(this Vector3 v, float a)
static void AddLocalEulerAnglesZ(this Transform transform, float z)
static bool IsNull(this object o)
static void SetAlpha(this Image c, float a)
static void SetAnchor(this RectTransform _rect, RectPosition anchor=RectPosition.Auto)
static bool IsMouseOver(this RectTransform r, Camera cam)
static Vector3 PlusX(this Vector3 v, float a)
static List< T > GetComponentsInDirectChildren< T >(this Transform comp, bool includeInactive=true)
static string RemoveNewline(this string text)
static void SetSlider(this Slider slider, float value, Func< float, string > action, bool notify)
static string langGame(this string s)
static void SetNavigation(this Component a, Component b, bool vertical=false)
static TValue RandomItem< TValue >(this IList< TValue > source)
static void AddLocalEulerAngles(this Transform transform, float x, float y, float z)
static int ClampMin(this int v, int min)
static TValue FirstItem< TKey, TValue >(this IDictionary< TKey, TValue > source)
static void SetPivot(this RectTransform r, float x, float y)
static TValue NextItem< TValue >(this IList< TValue > source, ref int index)
static T FindMax< T >(this List< T > list, Func< T, int > func)
static void SetField< T >(this object o, string name, T value)
static TValue TryGet< TValue >(this IList< TValue > array, int index, int defIndex=-1)
static TValue Move< TValue >(this IList< TValue > list, TValue target, int a)
static T GetComponentInDirectChildren< T >(this Component comp)
static void SetRect(this RectTransform r, float x, float y, float w, float h, float pivotX, float pivotY, float minX, float minY, float maxX, float maxY)
static Type ToType(this string value)
static string AddTag(this string s, string id, char splitter='/')
static void ForeachReverse< T >(this IList< T > items, Action< T > action)
static TValue PrevItem< TValue >(this IList< TValue > source, TValue val)
static void RebuildLayout(this Component c, bool recursive=false)
static Vector3 Plus(this Vector3 v, Vector2 v2)
static GameObject FindTagInParents(this Component c, string tag, bool includeInactive=true)
static string GetFullFileNameWithoutExtension(this string path)
static int ToInt< T >(this string str)
static string ToShortNumber(this int a)
static void SetEulerAnglesY(this Transform transform, float y)
static IPluralize pluralizer
static void AddLocalPositionX(this Transform transform, float x)
static string IsEmpty(this string str, string defaultStr)
static void Set< T1, T2 >(this Dictionary< T1, T2 > dic, Dictionary< T1, T2 > from)
static T RandomItem< T >(this IEnumerable< T > ie)
static T Instantiate< T >(this T s)
static string TagSize(this string s, string txt, int size)
static string Repeat(this string str, int count)
static Transform GetLastChild(this Transform trans)
static int ToInt(this string str)
static void SetPositionY(this Transform transform, float y)
static string ToFormat(this long a)
static string ToText(this int a, bool skipIfZero=true)
static void _SetAnchor(this RectTransform _rect, RectPosition anchor)
static Vector3 Random(this Vector3 v)
static string SetTag(this string s, string id, bool enable, char splitter='/')
static string GetFullFileNameWithoutExtension(this FileInfo fileInfo)
static void SetListener(this Button.ButtonClickedEvent e, Action action)
static void RebuildLayoutTo< T >(this Component c)
static void SetOnClick(this Button b, Action action)
static string Bracket(this string str, int type=0)
static void AddPosition(this Transform transform, float x, float y, float z)
static RectTransform Rect(this Component c)
static void AddLocalPositionZ(this Transform transform, float z)
static long ToLong(this string str)
static string Evalute(this string[] array, float val)
static string lang(this string s, string ref1, string ref2=null, string ref3=null, string ref4=null, string ref5=null)
static int Minimum(this int i)
static void LookAt2D(this Transform self, Transform target, Vector2 forward)
static void SetLocalScaleZ(this Transform transform, float z)
static void SetEulerAngles(this Transform transform, float x, float y, float z)
static float ClampAngle(this float angle)
static int Clamp(this int v, int min, int max, bool loop=false)
static string TrimNewLines(this string text)
static string TagColor(this string s, Color c)
static string[] SplitNewline(this string str)
static void CopyRect(this RectTransform r, RectTransform t)
static Color Multiply(this Color c, float mtp, float add)
static TValue[] CopyValues< TKey, TValue >(this IDictionary< TKey, TValue > dict)
static void SetLocalPositionY(this Transform transform, float y)
static Vector3 PlusZ(this Vector3 v, float a)
static void SetPositionZ(this Transform transform, float z)
static Color SetAlpha(this Color c, float a)
static void SetLocalScaleY(this Transform transform, float y)
static TValue LastItem< TValue >(this IList< TValue > source)
static byte[] ToBytes(this BitArray bits)
static T ToField< T >(this string s, object o)
static void SetLocalScale(this Transform transform, float x, float y, float z)
static string AddArticle(this string s)
static TValue Remainder< TValue >(this IList< TValue > source, int divider)
static int ToInt2(this float a)
static List< T > GetList< T >(this IDictionary source)
static void AddLocalPositionY(this Transform transform, float y)
static void AddPositionZ(this Transform transform, float z)
static bool HasField< T >(this object o, string name)
static void AddEulerAnglesY(this Transform transform, float y)
static void LookAt2D(this Transform self, Vector3 target, Vector2 forward)
bool pluralize
Definition: LangSetting.cs:32
bool addArticle
Definition: LangSetting.cs:30
bool capitalize
Definition: LangSetting.cs:34
char period
Definition: Lang.cs:20
char comma
Definition: Lang.cs:18
Definition: Lang.cs:7
static Words words
Definition: Lang.cs:27
static LangSetting setting
Definition: Lang.cs:55
static string Get(string id)
Definition: Lang.cs:94
static string[] GetList(string id)
Definition: Lang.cs:117
static LangGame Game
Definition: Lang.cs:49
static string Parse(string idLang, string val1, string val2=null, string val3=null, string val4=null, string val5=null)
Definition: Lang.cs:150
Definition: Rand.cs:4
static Random _random
Definition: Rand.cs:9
static int Range(int min, int max)
Definition: Rand.cs:49
static int rnd(int max)
Definition: Rand.cs:59
string Get(string id)
Definition: SourceLang.cs:12
string Parse(string idLang, string val1, string val2=null, string val3=null, string val4=null)
Definition: SourceLang.cs:43
Definition: UPair.cs:5
void SetInt(int i)
Definition: BitArray32.cs:89