Elin Decompiled Documentation EA 23.288 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 float ToFloat(this string str)
703 {
704 float result = 0f;
705 try
706 {
707 if (!float.TryParse(str, out result))
708 {
709 Debug.Log("exception: ToFlat1" + str);
710 result = 1f;
711 }
712 }
713 catch
714 {
715 Debug.Log("exception: ToFlat2" + str);
716 result = 1f;
717 }
718 return result;
719 }
720
721 public static string StripLastPun(this string str)
722 {
723 if (str != null)
724 {
725 return str.TrimEnd(Lang.words.period);
726 }
727 return str;
728 }
729
730 public static string StripPun(this string str, bool stripComma, bool insertSpaceForComma = false)
731 {
732 StringBuilder stringBuilder = new StringBuilder();
733 foreach (char c in str)
734 {
735 if (c == Lang.words.comma)
736 {
737 if (stripComma)
738 {
739 if (insertSpaceForComma)
740 {
741 stringBuilder.Append('\u3000');
742 }
743 }
744 else
745 {
746 stringBuilder.Append(c);
747 }
748 }
749 else if (c != Lang.words.period)
750 {
751 stringBuilder.Append(c);
752 }
753 }
754 return stringBuilder.ToString();
755 }
756
757 public static string Repeat(this string str, int count)
758 {
759 StringBuilder stringBuilder = new StringBuilder();
760 for (int i = 0; i < Mathf.Abs(count); i++)
761 {
762 stringBuilder.Append(str);
763 }
764 return stringBuilder.ToString();
765 }
766
767 public static string StripBrackets(this string str)
768 {
769 return str.Replace("\"", "").Replace("「", "").Replace("」", "")
770 .Replace("“", "")
771 .Replace("\"", "");
772 }
773
774 public static string TryAddExtension(this string s, string ext)
775 {
776 if (!s.Contains("." + ext))
777 {
778 return s + "." + ext;
779 }
780 return s;
781 }
782
783 public static bool IsEmpty(this string str)
784 {
785 if (str != null)
786 {
787 return str == "";
788 }
789 return true;
790 }
791
792 public static string IsEmpty(this string str, string defaultStr)
793 {
794 if (str != null && !(str == ""))
795 {
796 return str;
797 }
798 return defaultStr;
799 }
800
801 public static string TrimNewLines(this string text)
802 {
803 while (text.EndsWith(Environment.NewLine))
804 {
805 text = text.Substring(0, text.Length - Environment.NewLine.Length);
806 }
807 return text;
808 }
809
810 public static int[] SplitToInts(this string str, char separator)
811 {
812 string[] array = str.Split(separator);
813 int[] array2 = new int[array.Length];
814 for (int i = 0; i < array.Length; i++)
815 {
816 array2[i] = int.Parse(array[i]);
817 }
818 return array2;
819 }
820
821 public static string[] SplitNewline(this string str)
822 {
823 return str.Split(Environment.NewLine.ToCharArray());
824 }
825
826 public static bool Contains(this string[] strs, string id)
827 {
828 if (strs == null || strs.Length == 0)
829 {
830 return false;
831 }
832 for (int i = 0; i < strs.Length; i++)
833 {
834 if (strs[i] == id)
835 {
836 return true;
837 }
838 }
839 return false;
840 }
841
842 public static string Evalute(this string[] array, float val)
843 {
844 return array[(int)Mathf.Clamp((float)(array.Length - 1) * val, 0f, array.Length - 1)];
845 }
846
847 public static string ToShortNumber(this int a)
848 {
849 if (a < 0)
850 {
851 string text;
852 if (a > -1000000)
853 {
854 if (a <= -1000)
855 {
856 return a / 1000 + "K";
857 }
858 text = a.ToString();
859 if (text == null)
860 {
861 return "";
862 }
863 }
864 else
865 {
866 text = a / 1000000 + "M";
867 }
868 return text;
869 }
870 string text2;
871 if (a < 1000000)
872 {
873 if (a >= 1000)
874 {
875 return a / 1000 + "K";
876 }
877 text2 = a.ToString();
878 if (text2 == null)
879 {
880 return "";
881 }
882 }
883 else
884 {
885 text2 = a / 1000000 + "M";
886 }
887 return text2;
888 }
889
890 public static string ToFormat(this int a)
891 {
892 return $"{a:#,0}";
893 }
894
895 public static string ToFormat(this long a)
896 {
897 return $"{a:#,0}";
898 }
899
900 public static string ToText(this int a, bool skipIfZero = true)
901 {
902 object obj;
903 if (!(a == 0 && skipIfZero))
904 {
905 if (a >= 0)
906 {
907 return "+" + a;
908 }
909 obj = a.ToString();
910 if (obj == null)
911 {
912 return "";
913 }
914 }
915 else
916 {
917 obj = "";
918 }
919 return (string)obj;
920 }
921
922 public static string TagColor(this string s, Color c, string txt)
923 {
924 return s + "<color=" + c.ToHex() + ">" + txt + "</color>";
925 }
926
927 public static string TagColor(this string s, Color c)
928 {
929 return "<color=" + c.ToHex() + ">" + s + "</color>";
930 }
931
932 public static string TagSize(this string s, string txt, int size)
933 {
934 return s + "<size=" + size + ">" + txt + "</size>";
935 }
936
937 public static string TagSize(this string s, int size)
938 {
939 return "<size=" + size + ">" + s + "</size>";
940 }
941
942 public static bool HasTag(this string s, string id, char splitter = '/')
943 {
944 return s.Split(splitter).Contains(id);
945 }
946
947 public static string SetTag(this string s, string id, bool enable, char splitter = '/')
948 {
949 s = ((!enable) ? s.RemoveTag(id, splitter) : s.AddTag(id, splitter));
950 return s;
951 }
952
953 public static string AddTag(this string s, string id, char splitter = '/')
954 {
955 if (!s.HasTag(id, splitter))
956 {
957 s = s + (s.IsEmpty() ? "" : ((object)splitter))?.ToString() + id;
958 }
959 return s;
960 }
961
962 public static string RemoveTag(this string s, string id, char splitter = '/')
963 {
964 string[] array = s.Split(splitter);
965 s = "";
966 string[] array2 = array;
967 foreach (string text in array2)
968 {
969 if (!(text == id))
970 {
971 s.AddTag(text, splitter);
972 }
973 }
974 return s;
975 }
976
977 public static string GetFullFileNameWithoutExtension(this FileInfo fileInfo)
978 {
979 return fileInfo.Directory.FullName + "/" + Path.GetFileNameWithoutExtension(fileInfo.Name);
980 }
981
982 public static string GetFullFileNameWithoutExtension(this string path)
983 {
984 return new FileInfo(path).GetFullFileNameWithoutExtension();
985 }
986
987 public static string Pluralize(string s)
988 {
989 if (s == "talisman")
990 {
991 return "talismans";
992 }
993 return pluralizer.Pluralize(s);
994 }
995
996 public static string AddArticle(this string s)
997 {
998 if (!Lang.setting.addArticle || s.Length < 1)
999 {
1000 return s;
1001 }
1002 char c = s.ToLower()[0];
1003 s = ((c == 'a' || c == 'i' || c == 'u' || c == 'e' || c == 'o') ? "an " : "a ") + s;
1004 return s;
1005 }
1006
1007 public static string AddArticle(this string s, int num, ArticleStyle style = ArticleStyle.Default, string replace = null)
1008 {
1009 if (!Lang.setting.addArticle || s.Length < 1)
1010 {
1011 return s;
1012 }
1013 char c = s[0];
1014 string text = ((num >= 2) ? (num.ToFormat() + " ") : ((c == 'a' || c == 'i' || c == 'u' || c == 'e' || c == 'o') ? "an " : "a "));
1015 if (num >= 2 && Lang.setting.pluralize)
1016 {
1017 s = ((replace.IsEmpty() || !s.Contains(replace) || s.Contains("limestone stone")) ? Pluralize(s) : s.Replace(replace, Pluralize(replace)));
1018 }
1019 return style switch
1020 {
1021 ArticleStyle.The => "_the".lang().ToTitleCase() + " " + ((num > 1) ? (num + " ") : "") + s,
1022 ArticleStyle.None => ((num > 1) ? (num.ToFormat() + " ") : "") + s.ToTitleCase(),
1023 _ => text + s,
1024 };
1025 }
1026
1027 public static string ToTitleCase(this string s, bool wholeText = false)
1028 {
1029 if (!Lang.setting.capitalize)
1030 {
1031 return s;
1032 }
1033 char[] array = s.ToCharArray();
1034 bool flag = true;
1035 for (int i = 0; i < array.Length; i++)
1036 {
1037 if (flag)
1038 {
1039 array[i] = char.ToUpper(array[i]);
1040 flag = false;
1041 }
1042 if (!wholeText)
1043 {
1044 break;
1045 }
1046 if (array[i] == ' ')
1047 {
1048 flag = true;
1049 }
1050 }
1051 return new string(array);
1052 }
1053
1054 public static void LoopTail<T>(this List<T> list, bool vertical = false) where T : Selectable
1055 {
1056 if (list.Count > 1)
1057 {
1058 Navigation navigation = list[0].navigation;
1059 Navigation navigation2 = list[list.Count - 1].navigation;
1060 if (vertical)
1061 {
1062 navigation.selectOnUp = list[list.Count - 1];
1063 navigation2.selectOnDown = list[0];
1064 }
1065 else
1066 {
1067 navigation.selectOnLeft = list[list.Count - 1];
1068 navigation2.selectOnRight = list[0];
1069 }
1070 list[0].navigation = navigation;
1071 list[list.Count - 1].navigation = navigation2;
1072 }
1073 }
1074
1075 public static void SetNavigation(this Component a, Component b, bool vertical = false)
1076 {
1077 if (!a || !b)
1078 {
1079 return;
1080 }
1081 Selectable component = a.GetComponent<Selectable>();
1082 Selectable component2 = b.GetComponent<Selectable>();
1083 if ((bool)component && (bool)component2)
1084 {
1085 Navigation navigation = component.navigation;
1086 Navigation navigation2 = component2.navigation;
1087 if (vertical)
1088 {
1089 navigation.selectOnUp = component2;
1090 navigation2.selectOnDown = component;
1091 }
1092 else
1093 {
1094 navigation.selectOnLeft = component2;
1095 navigation2.selectOnRight = component;
1096 }
1097 component.navigation = navigation;
1098 component2.navigation = navigation2;
1099 }
1100 }
1101
1102 public static void LoopSelectable(this List<Selectable> sels, bool vertical = true, bool horizonal = true, bool asGroup = true)
1103 {
1104 for (int i = 0; i < sels.Count; i++)
1105 {
1106 Selectable selectable = sels[i];
1107 Selectable selectable2 = sels[0];
1108 Navigation navigation = selectable.navigation;
1109 if (horizonal)
1110 {
1111 navigation.selectOnRight = ((i + 1 < sels.Count) ? sels[i + 1] : selectable2);
1112 }
1113 if (asGroup)
1114 {
1115 for (int j = i + 1; j < sels.Count; j++)
1116 {
1117 if (sels[j].transform.position.y < selectable.transform.position.y)
1118 {
1119 selectable2 = sels[j];
1120 break;
1121 }
1122 }
1123 }
1124 else
1125 {
1126 selectable2 = ((i + 1 < sels.Count) ? sels[i + 1] : selectable2);
1127 }
1128 if (vertical)
1129 {
1130 navigation.selectOnDown = selectable2;
1131 }
1132 selectable.navigation = navigation;
1133 }
1134 for (int num = sels.Count - 1; num >= 0; num--)
1135 {
1136 Selectable selectable3 = sels[num];
1137 Selectable selectable4 = sels[sels.Count - 1];
1138 Navigation navigation2 = selectable3.navigation;
1139 if (horizonal)
1140 {
1141 navigation2.selectOnLeft = ((num > 0) ? sels[num - 1] : selectable4);
1142 }
1143 if (asGroup)
1144 {
1145 int num2 = sels.Count - 1;
1146 for (int num3 = num - 1; num3 >= 0; num3--)
1147 {
1148 if (sels[num3].transform.position.y > selectable3.transform.position.y)
1149 {
1150 num2 = num3;
1151 break;
1152 }
1153 }
1154 int num4 = num2;
1155 while (num4 >= 0 && !(sels[num4].transform.position.y > sels[num2].transform.position.y))
1156 {
1157 selectable4 = sels[num4];
1158 num4--;
1159 }
1160 }
1161 else
1162 {
1163 selectable4 = ((num > 0) ? sels[num - 1] : selectable4);
1164 }
1165 if (vertical)
1166 {
1167 navigation2.selectOnUp = ((selectable4 == selectable3) ? sels[sels.Count - 1] : selectable4);
1168 }
1169 navigation2.mode = Navigation.Mode.Explicit;
1170 selectable3.navigation = navigation2;
1171 }
1172 }
1173
1174 public static void LoopSelectable(this Transform l, bool vertical = true, bool horizonal = true, bool asGroup = true)
1175 {
1176 List<Selectable> list = l.GetComponentsInChildren<Selectable>().ToList();
1177 for (int num = list.Count - 1; num >= 0; num--)
1178 {
1179 if (!list[num].interactable || list[num].navigation.mode == Navigation.Mode.None)
1180 {
1181 list.RemoveAt(num);
1182 }
1183 }
1184 list.LoopSelectable(vertical, horizonal, asGroup);
1185 }
1186
1187 public static Color ToColor(this string s)
1188 {
1189 Color color = Color.white;
1190 ColorUtility.TryParseHtmlString("#" + s, out color);
1191 return color;
1192 }
1193
1194 public static void SetAlpha(this Image c, float a)
1195 {
1196 c.color = new Color(c.color.r, c.color.g, c.color.b, a);
1197 }
1198
1199 public static void SetAlpha(this RawImage c, float a)
1200 {
1201 c.color = new Color(c.color.r, c.color.g, c.color.b, a);
1202 }
1203
1204 public static Color SetAlpha(this Color c, float a)
1205 {
1206 c.a = a;
1207 return c;
1208 }
1209
1210 public static Color Multiply(this Color c, float mtp, float add)
1211 {
1212 return new Color(c.r * mtp + add, c.g * mtp + add, c.b * mtp + add, c.a);
1213 }
1214
1215 public static string Tag(this Color c)
1216 {
1217 return "<color=" + $"#{(int)(c.r * 255f):X2}{(int)(c.g * 255f):X2}{(int)(c.b * 255f):X2}" + ">";
1218 }
1219
1220 public static string ToHex(this Color c)
1221 {
1222 return $"#{(int)(c.r * 255f):X2}{(int)(c.g * 255f):X2}{(int)(c.b * 255f):X2}";
1223 }
1224
1225 public static void SetOnClick(this Button b, Action action)
1226 {
1227 b.onClick.RemoveAllListeners();
1228 b.onClick.AddListener(delegate
1229 {
1230 action();
1231 });
1232 }
1233
1234 public static void SetListener(this Button.ButtonClickedEvent e, Action action)
1235 {
1236 e.RemoveAllListeners();
1237 e.AddListener(delegate
1238 {
1239 action();
1240 });
1241 }
1242
1243 public static void SetAlpha(this Text text, float aloha = 1f)
1244 {
1245 text.color = new Color(text.color.r, text.color.g, text.color.b, aloha);
1246 }
1247
1248 public static void SetSlider(this Slider slider, float value, Func<float, string> action, bool notify)
1249 {
1250 slider.SetSlider(value, action, -1, -1, notify);
1251 }
1252
1253 public static void SetSlider(this Slider slider, float value, Func<float, string> action, int min = -1, int max = -1, bool notify = true)
1254 {
1255 slider.onValueChanged.RemoveAllListeners();
1256 slider.onValueChanged.AddListener(delegate(float a)
1257 {
1258 slider.GetComponentInChildren<Text>(includeInactive: true).text = action(a);
1259 });
1260 if (min != -1)
1261 {
1262 slider.minValue = min;
1263 slider.maxValue = max;
1264 }
1265 if (notify)
1266 {
1267 slider.value = value;
1268 }
1269 else
1270 {
1271 slider.SetValueWithoutNotify(value);
1272 }
1273 slider.GetComponentInChildren<Text>(includeInactive: true).text = action(value);
1274 }
1275
1276 public static T GetOrCreate<T>(this Component t) where T : Component
1277 {
1278 T val = t.gameObject.GetComponent<T>();
1279 if (!val)
1280 {
1281 val = t.gameObject.AddComponent<T>();
1282 }
1283 return val;
1284 }
1285
1286 public static RectTransform Rect(this Component c)
1287 {
1288 return c.transform as RectTransform;
1289 }
1290
1291 public static void CopyRect(this RectTransform r, RectTransform t)
1292 {
1293 r.pivot = t.pivot;
1294 r.sizeDelta = t.sizeDelta;
1295 r.anchorMin = t.anchorMin;
1296 r.anchorMax = t.anchorMax;
1297 r.anchoredPosition = t.anchoredPosition;
1298 }
1299
1300 public static void ToggleActive(this Component c)
1301 {
1302 c.SetActive(!c.gameObject.activeSelf);
1303 }
1304
1305 public static void SetActive(this Component c, bool enable)
1306 {
1307 if (c.gameObject.activeSelf != enable)
1308 {
1309 c.gameObject.SetActive(enable);
1310 }
1311 }
1312
1313 public static void SetActive(this Component c, bool enable, Action<bool> onChangeState)
1314 {
1315 if (c.gameObject.activeSelf != enable)
1316 {
1317 c.gameObject.SetActive(enable);
1318 onChangeState(enable);
1319 }
1320 }
1321
1322 public static Selectable GetSelectable(this GameObject go)
1323 {
1324 return go.GetComponentInChildren<Selectable>();
1325 }
1326
1327 public static void SetLayerRecursively(this GameObject obj, int layer)
1328 {
1329 obj.layer = layer;
1330 foreach (Transform item in obj.transform)
1331 {
1332 item.gameObject.SetLayerRecursively(layer);
1333 }
1334 }
1335
1336 public static bool IsInteractable(this GameObject obj)
1337 {
1338 Selectable selectable = (obj ? obj.GetComponent<Selectable>() : null);
1339 if ((bool)selectable)
1340 {
1341 return selectable.interactable;
1342 }
1343 return false;
1344 }
1345
1346 public static bool IsChildOf(this GameObject c, GameObject root)
1347 {
1348 if (c.transform == root.transform)
1349 {
1350 return true;
1351 }
1352 if ((bool)c.transform.parent)
1353 {
1354 return c.transform.parent.gameObject.IsChildOf(root);
1355 }
1356 return false;
1357 }
1358
1359 public static bool IsPrefab(this Component c)
1360 {
1361 return c.gameObject.scene.name == null;
1362 }
1363
1364 public static T CreateMold<T>(this Component c, string name = null) where T : Component
1365 {
1366 T result = null;
1367 for (int i = 0; i < c.transform.childCount; i++)
1368 {
1369 T component = c.transform.GetChild(i).GetComponent<T>();
1370 if ((bool)component && (name.IsEmpty() || name == component.name))
1371 {
1372 component.gameObject.SetActive(value: false);
1373 result = component;
1374 break;
1375 }
1376 }
1377 c.DestroyChildren();
1378 return result;
1379 }
1380
1381 public static Transform Find(this Component c, string name = null)
1382 {
1383 return c.Find<Transform>(name);
1384 }
1385
1386 public static T Find<T>(this Component c, string name = null, bool recursive = false) where T : Component
1387 {
1388 if (recursive)
1389 {
1390 T[] componentsInChildren = c.transform.GetComponentsInChildren<T>();
1391 foreach (T val in componentsInChildren)
1392 {
1393 if (name == null || name == val.name)
1394 {
1395 return val;
1396 }
1397 }
1398 return null;
1399 }
1400 for (int j = 0; j < c.transform.childCount; j++)
1401 {
1402 T component = c.transform.GetChild(j).GetComponent<T>();
1403 if ((bool)component && (name == null || name == component.name))
1404 {
1405 return component;
1406 }
1407 }
1408 return null;
1409 }
1410
1411 public static GameObject FindTagInParents(this Component c, string tag, bool includeInactive = true)
1412 {
1413 Transform transform = c.transform;
1414 for (int i = 0; i < transform.childCount; i++)
1415 {
1416 Transform child = transform.GetChild(i);
1417 if ((includeInactive || child.gameObject.activeSelf) && child.tag == tag)
1418 {
1419 return child.gameObject;
1420 }
1421 }
1422 if ((bool)transform.parent)
1423 {
1424 return transform.parent.FindTagInParents(tag, includeInactive);
1425 }
1426 return null;
1427 }
1428
1429 public static T GetComponentInChildrenExcludSelf<T>(this Transform c) where T : Component
1430 {
1431 for (int i = 0; i < c.childCount; i++)
1432 {
1433 T component = c.GetChild(i).GetComponent<T>();
1434 if ((bool)component)
1435 {
1436 return component;
1437 }
1438 }
1439 return null;
1440 }
1441
1442 public static List<T> GetComponentsInDirectChildren<T>(this Transform comp, bool includeInactive = true) where T : Component
1443 {
1444 List<T> list = new List<T>();
1445 Transform transform = comp.transform;
1446 for (int i = 0; i < transform.childCount; i++)
1447 {
1448 T component = transform.GetChild(i).GetComponent<T>();
1449 if ((bool)component && (includeInactive || component.gameObject.activeInHierarchy))
1450 {
1451 list.Add(component);
1452 }
1453 }
1454 return list;
1455 }
1456
1457 public static List<T> GetComponentsInDirectChildren<T>(this Component comp, bool includeInactive = true) where T : Component
1458 {
1459 List<T> list = new List<T>();
1460 Transform transform = comp.transform;
1461 for (int i = 0; i < transform.childCount; i++)
1462 {
1463 T component = transform.GetChild(i).GetComponent<T>();
1464 if ((bool)component && (includeInactive || component.gameObject.activeInHierarchy))
1465 {
1466 list.Add(component);
1467 }
1468 }
1469 return list;
1470 }
1471
1472 public static T GetComponentInDirectChildren<T>(this Component comp) where T : Component
1473 {
1474 Transform transform = comp.transform;
1475 for (int i = 0; i < transform.childCount; i++)
1476 {
1477 T component = transform.GetChild(i).GetComponent<T>();
1478 if ((bool)component)
1479 {
1480 return component;
1481 }
1482 }
1483 return null;
1484 }
1485
1486 public static void DestroyChildren(this Component component, bool destroyInactive = false, bool ignoreDestroy = true)
1487 {
1488 if (!component || !component.transform)
1489 {
1490 Debug.LogWarning("DestroyChlidren:" + component);
1491 return;
1492 }
1493 for (int num = component.transform.childCount - 1; num >= 0; num--)
1494 {
1495 GameObject gameObject = component.transform.GetChild(num).gameObject;
1496 if ((!ignoreDestroy || !(gameObject.tag == "IgnoreDestroy")) && (destroyInactive || gameObject.activeSelf))
1497 {
1498 UnityEngine.Object.DestroyImmediate(gameObject);
1499 }
1500 }
1501 }
1502
1503 public static bool IsMouseOver(this RectTransform r, Camera cam)
1504 {
1505 return RectTransformUtility.RectangleContainsScreenPoint(r, Input.mousePosition, cam);
1506 }
1507
1508 public static void RebuildLayout(this Component c, bool recursive = false)
1509 {
1510 if (recursive)
1511 {
1512 foreach (Transform item in c.transform)
1513 {
1514 if (item is RectTransform)
1515 {
1516 item.RebuildLayout(recursive: true);
1517 }
1518 }
1519 }
1520 LayoutRebuilder.ForceRebuildLayoutImmediate(c.transform as RectTransform);
1521 }
1522
1523 public static void RebuildLayoutTo<T>(this Component c) where T : Component
1524 {
1525 c.RebuildLayout();
1526 if ((bool)c.transform.parent && !c.transform.parent.GetComponent<T>())
1527 {
1528 c.transform.parent.RebuildLayoutTo<T>();
1529 }
1530 }
1531
1532 public static void RebuildLayoutTo(this Component c, Component target)
1533 {
1534 c.RebuildLayout();
1535 if (!(c == target) && (bool)c.transform.parent)
1536 {
1537 c.transform.parent.RebuildLayoutTo(target);
1538 }
1539 }
1540
1541 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)
1542 {
1543 r.SetPivot(pivotX, pivotY);
1544 r.SetAnchor(minX, minY, maxX, maxY);
1545 if (w != -1f)
1546 {
1547 r.sizeDelta = new Vector2(w, h);
1548 }
1549 r.anchoredPosition = new Vector2((x == -1f) ? r.anchoredPosition.x : x, (y == -1f) ? r.anchoredPosition.y : y);
1550 }
1551
1552 public static void SetPivot(this RectTransform r, float x, float y)
1553 {
1554 r.pivot = new Vector2(x, y);
1555 }
1556
1557 public static void SetAnchor(this RectTransform r, float minX, float minY, float maxX, float maxY)
1558 {
1559 r.anchorMin = new Vector2(minX, minY);
1560 r.anchorMax = new Vector2(maxX, maxY);
1561 }
1562
1563 public static void _SetAnchor(this RectTransform _rect, RectPosition anchor)
1564 {
1565 switch (anchor)
1566 {
1567 case RectPosition.TopCenter:
1568 _rect.SetAnchor(0.5f, 1f, 0.5f, 1f);
1569 break;
1570 case RectPosition.BottomCenter:
1571 _rect.SetAnchor(0.5f, 0f, 0.5f, 0f);
1572 break;
1573 case RectPosition.TopLEFT:
1574 _rect.SetAnchor(0f, 1f, 0f, 1f);
1575 break;
1576 case RectPosition.TopRIGHT:
1577 _rect.SetAnchor(1f, 1f, 1f, 1f);
1578 break;
1579 case RectPosition.BottomLEFT:
1580 _rect.SetAnchor(0f, 0f, 0f, 0f);
1581 break;
1582 case RectPosition.BottomRIGHT:
1583 _rect.SetAnchor(1f, 0f, 1f, 0f);
1584 break;
1585 case RectPosition.Left:
1586 _rect.SetAnchor(0f, 0.5f, 0f, 0.5f);
1587 break;
1588 case RectPosition.Right:
1589 _rect.SetAnchor(1f, 0.5f, 1f, 0.5f);
1590 break;
1591 default:
1592 _rect.SetAnchor(0.5f, 0.5f, 0.5f, 0.5f);
1593 break;
1594 }
1595 }
1596
1597 public static void SetAnchor(this RectTransform _rect, RectPosition anchor = RectPosition.Auto)
1598 {
1599 Vector3 position = _rect.position;
1600 _rect._SetAnchor((anchor == RectPosition.Auto) ? _rect.GetAnchor() : anchor);
1601 _rect.position = position;
1602 }
1603
1604 public static RectPosition GetAnchor(this RectTransform _rect)
1605 {
1606 Vector3 position = _rect.position;
1607 int width = Screen.width;
1608 int height = Screen.height;
1609 bool flag = position.y > (float)height * 0.5f;
1610 if (position.x > (float)width * 0.3f && position.x < (float)width * 0.7f)
1611 {
1612 if (position.y > (float)height * 0.3f && position.y < (float)height * 0.7f)
1613 {
1614 return RectPosition.Center;
1615 }
1616 if (!flag)
1617 {
1618 return RectPosition.BottomCenter;
1619 }
1620 return RectPosition.TopCenter;
1621 }
1622 if (position.x < (float)width * 0.5f)
1623 {
1624 if (!flag)
1625 {
1626 return RectPosition.BottomLEFT;
1627 }
1628 return RectPosition.TopLEFT;
1629 }
1630 if (!flag)
1631 {
1632 return RectPosition.BottomRIGHT;
1633 }
1634 return RectPosition.TopRIGHT;
1635 }
1636
1637 public static Transform GetLastChild(this Transform trans)
1638 {
1639 return trans.GetChild(trans.childCount - 1);
1640 }
1641
1642 public static Vector2 ToVector2(this Vector3 self)
1643 {
1644 return new Vector2(self.x, self.z);
1645 }
1646
1647 public static void SetScale(this SpriteRenderer renderer, float size)
1648 {
1649 float x = renderer.bounds.size.x;
1650 float y = renderer.bounds.size.y;
1651 float x2 = size / x;
1652 float y2 = size / y;
1653 renderer.transform.localScale = new Vector3(x2, y2, 1f);
1654 }
1655
1656 private static float GetForwardDiffPoint(Vector2 forward)
1657 {
1658 if (object.Equals(forward, Vector2.up))
1659 {
1660 return 90f;
1661 }
1662 object.Equals(forward, Vector2.right);
1663 return 0f;
1664 }
1665
1666 public static void LookAt2D(this Transform self, Transform target, Vector2 forward)
1667 {
1668 self.LookAt2D(target.position, forward);
1669 }
1670
1671 public static void LookAt2D(this Transform self, Vector3 target, Vector2 forward)
1672 {
1673 float forwardDiffPoint = GetForwardDiffPoint(forward);
1674 Vector3 vector = target - self.position;
1675 float num = Mathf.Atan2(vector.y, vector.x) * 57.29578f;
1676 self.rotation = Quaternion.AngleAxis(num - forwardDiffPoint, Vector3.forward);
1677 }
1678
1679 public static float Distance(this Transform t, Vector2 pos)
1680 {
1681 return Vector3.Distance(t.position, pos);
1682 }
1683
1684 public static Vector3 Plus(this Vector3 v, Vector2 v2)
1685 {
1686 v.x += v2.x;
1687 v.y += v2.y;
1688 return v;
1689 }
1690
1691 public static Vector3 SetZ(this Vector3 v, float a)
1692 {
1693 v.z = a;
1694 return v;
1695 }
1696
1697 public static Vector3 SetY(this Vector3 v, float a)
1698 {
1699 v.y = a;
1700 return v;
1701 }
1702
1703 public static Vector3 PlusX(this Vector3 v, float a)
1704 {
1705 v.x += a;
1706 return v;
1707 }
1708
1709 public static Vector3 PlusY(this Vector3 v, float a)
1710 {
1711 v.y += a;
1712 return v;
1713 }
1714
1715 public static Vector3 PlusZ(this Vector3 v, float a)
1716 {
1717 v.z += a;
1718 return v;
1719 }
1720
1721 public static void SetPosition(this Transform transform, float x, float y, float z)
1722 {
1723 vector3.Set(x, y, z);
1724 transform.position = vector3;
1725 }
1726
1727 public static void SetPositionX(this Transform transform, float x)
1728 {
1729 vector3.Set(x, transform.position.y, transform.position.z);
1730 transform.position = vector3;
1731 }
1732
1733 public static void SetPositionY(this Transform transform, float y)
1734 {
1735 vector3.Set(transform.position.x, y, transform.position.z);
1736 transform.position = vector3;
1737 }
1738
1739 public static void SetPositionZ(this Transform transform, float z)
1740 {
1741 vector3.Set(transform.position.x, transform.position.y, z);
1742 transform.position = vector3;
1743 }
1744
1745 public static void AddPosition(this Transform transform, float x, float y, float z)
1746 {
1747 vector3.Set(transform.position.x + x, transform.position.y + y, transform.position.z + z);
1748 transform.position = vector3;
1749 }
1750
1751 public static void AddPositionX(this Transform transform, float x)
1752 {
1753 vector3.Set(transform.position.x + x, transform.position.y, transform.position.z);
1754 transform.position = vector3;
1755 }
1756
1757 public static void AddPositionY(this Transform transform, float y)
1758 {
1759 vector3.Set(transform.position.x, transform.position.y + y, transform.position.z);
1760 transform.position = vector3;
1761 }
1762
1763 public static void AddPositionZ(this Transform transform, float z)
1764 {
1765 vector3.Set(transform.position.x, transform.position.y, transform.position.z + z);
1766 transform.position = vector3;
1767 }
1768
1769 public static void SetLocalPosition(this Transform transform, float x, float y, float z)
1770 {
1771 vector3.Set(x, y, z);
1772 transform.localPosition = vector3;
1773 }
1774
1775 public static void SetLocalPositionX(this Transform transform, float x)
1776 {
1777 vector3.Set(x, transform.localPosition.y, transform.localPosition.z);
1778 transform.localPosition = vector3;
1779 }
1780
1781 public static void SetLocalPositionY(this Transform transform, float y)
1782 {
1783 vector3.Set(transform.localPosition.x, y, transform.localPosition.z);
1784 transform.localPosition = vector3;
1785 }
1786
1787 public static void SetLocalPositionZ(this Transform transform, float z)
1788 {
1789 vector3.Set(transform.localPosition.x, transform.localPosition.y, z);
1790 transform.localPosition = vector3;
1791 }
1792
1793 public static void AddLocalPosition(this Transform transform, float x, float y, float z)
1794 {
1795 vector3.Set(transform.localPosition.x + x, transform.localPosition.y + y, transform.localPosition.z + z);
1796 transform.localPosition = vector3;
1797 }
1798
1799 public static void AddLocalPositionX(this Transform transform, float x)
1800 {
1801 vector3.Set(transform.localPosition.x + x, transform.localPosition.y, transform.localPosition.z);
1802 transform.localPosition = vector3;
1803 }
1804
1805 public static void AddLocalPositionY(this Transform transform, float y)
1806 {
1807 vector3.Set(transform.localPosition.x, transform.localPosition.y + y, transform.localPosition.z);
1808 transform.localPosition = vector3;
1809 }
1810
1811 public static void AddLocalPositionZ(this Transform transform, float z)
1812 {
1813 vector3.Set(transform.localPosition.x, transform.localPosition.y, transform.localPosition.z + z);
1814 transform.localPosition = vector3;
1815 }
1816
1817 public static void SetLocalScale(this Transform transform, float x, float y, float z)
1818 {
1819 vector3.Set(x, y, z);
1820 transform.localScale = vector3;
1821 }
1822
1823 public static void SetLocalScaleX(this Transform transform, float x)
1824 {
1825 vector3.Set(x, transform.localScale.y, transform.localScale.z);
1826 transform.localScale = vector3;
1827 }
1828
1829 public static void SetLocalScaleY(this Transform transform, float y)
1830 {
1831 vector3.Set(transform.localScale.x, y, transform.localScale.z);
1832 transform.localScale = vector3;
1833 }
1834
1835 public static void SetLocalScaleZ(this Transform transform, float z)
1836 {
1837 vector3.Set(transform.localScale.x, transform.localScale.y, z);
1838 transform.localScale = vector3;
1839 }
1840
1841 public static void AddLocalScale(this Transform transform, float x, float y, float z)
1842 {
1843 vector3.Set(transform.localScale.x + x, transform.localScale.y + y, transform.localScale.z + z);
1844 transform.localScale = vector3;
1845 }
1846
1847 public static void AddLocalScaleX(this Transform transform, float x)
1848 {
1849 vector3.Set(transform.localScale.x + x, transform.localScale.y, transform.localScale.z);
1850 transform.localScale = vector3;
1851 }
1852
1853 public static void AddLocalScaleY(this Transform transform, float y)
1854 {
1855 vector3.Set(transform.localScale.x, transform.localScale.y + y, transform.localScale.z);
1856 transform.localScale = vector3;
1857 }
1858
1859 public static void AddLocalScaleZ(this Transform transform, float z)
1860 {
1861 vector3.Set(transform.localScale.x, transform.localScale.y, transform.localScale.z + z);
1862 transform.localScale = vector3;
1863 }
1864
1865 public static void SetEulerAngles(this Transform transform, float x, float y, float z)
1866 {
1867 vector3.Set(x, y, z);
1868 transform.eulerAngles = vector3;
1869 }
1870
1871 public static void SetEulerAnglesX(this Transform transform, float x)
1872 {
1873 vector3.Set(x, transform.localEulerAngles.y, transform.localEulerAngles.z);
1874 transform.eulerAngles = vector3;
1875 }
1876
1877 public static void SetEulerAnglesY(this Transform transform, float y)
1878 {
1879 vector3.Set(transform.localEulerAngles.x, y, transform.localEulerAngles.z);
1880 transform.eulerAngles = vector3;
1881 }
1882
1883 public static void SetEulerAnglesZ(this Transform transform, float z)
1884 {
1885 vector3.Set(transform.localEulerAngles.x, transform.localEulerAngles.y, z);
1886 transform.eulerAngles = vector3;
1887 }
1888
1889 public static void AddEulerAngles(this Transform transform, float x, float y, float z)
1890 {
1891 vector3.Set(transform.eulerAngles.x + x, transform.eulerAngles.y + y, transform.eulerAngles.z + z);
1892 transform.eulerAngles = vector3;
1893 }
1894
1895 public static void AddEulerAnglesX(this Transform transform, float x)
1896 {
1897 vector3.Set(transform.eulerAngles.x + x, transform.eulerAngles.y, transform.eulerAngles.z);
1898 transform.eulerAngles = vector3;
1899 }
1900
1901 public static void AddEulerAnglesY(this Transform transform, float y)
1902 {
1903 vector3.Set(transform.eulerAngles.x, transform.eulerAngles.y + y, transform.eulerAngles.z);
1904 transform.eulerAngles = vector3;
1905 }
1906
1907 public static void AddEulerAnglesZ(this Transform transform, float z)
1908 {
1909 vector3.Set(transform.eulerAngles.x, transform.eulerAngles.y, transform.eulerAngles.z + z);
1910 transform.eulerAngles = vector3;
1911 }
1912
1913 public static void SetLocalEulerAngles(this Transform transform, float x, float y, float z)
1914 {
1915 vector3.Set(x, y, z);
1916 transform.localEulerAngles = vector3;
1917 }
1918
1919 public static void SetLocalEulerAnglesX(this Transform transform, float x)
1920 {
1921 vector3.Set(x, transform.localEulerAngles.y, transform.localEulerAngles.z);
1922 transform.localEulerAngles = vector3;
1923 }
1924
1925 public static void SetLocalEulerAnglesY(this Transform transform, float y)
1926 {
1927 vector3.Set(transform.localEulerAngles.x, y, transform.localEulerAngles.z);
1928 transform.localEulerAngles = vector3;
1929 }
1930
1931 public static void SetLocalEulerAnglesZ(this Transform transform, float z)
1932 {
1933 vector3.Set(transform.localEulerAngles.x, transform.localEulerAngles.y, z);
1934 transform.localEulerAngles = vector3;
1935 }
1936
1937 public static void AddLocalEulerAngles(this Transform transform, float x, float y, float z)
1938 {
1939 vector3.Set(transform.localEulerAngles.x + x, transform.localEulerAngles.y + y, transform.localEulerAngles.z + z);
1940 transform.localEulerAngles = vector3;
1941 }
1942
1943 public static void AddLocalEulerAnglesX(this Transform transform, float x)
1944 {
1945 vector3.Set(transform.localEulerAngles.x + x, transform.localEulerAngles.y, transform.localEulerAngles.z);
1946 transform.localEulerAngles = vector3;
1947 }
1948
1949 public static void AddLocalEulerAnglesY(this Transform transform, float y)
1950 {
1951 vector3.Set(transform.localEulerAngles.x, transform.localEulerAngles.y + y, transform.localEulerAngles.z);
1952 transform.localEulerAngles = vector3;
1953 }
1954
1955 public static void AddLocalEulerAnglesZ(this Transform transform, float z)
1956 {
1957 vector3.Set(transform.localEulerAngles.x, transform.localEulerAngles.y, transform.localEulerAngles.z + z);
1958 transform.localEulerAngles = vector3;
1959 }
1960
1961 public static void ToggleKeyword(this Material m, string id, bool enable)
1962 {
1963 if (enable)
1964 {
1965 m.EnableKeyword(id);
1966 }
1967 else
1968 {
1969 m.DisableKeyword(id);
1970 }
1971 }
1972
1973 public static void ForeachReverse<T>(this IList<T> items, Action<T> action)
1974 {
1975 for (int num = items.Count - 1; num >= 0; num--)
1976 {
1977 action(items[num]);
1978 }
1979 }
1980
1981 public static void ForeachReverse<T>(this IList<T> items, Func<T, bool> action)
1982 {
1983 int num = items.Count - 1;
1984 while (num >= 0 && !action(items[num]))
1985 {
1986 num--;
1987 }
1988 }
1989
1990 public static float ClampAngle(this float angle)
1991 {
1992 if (angle < 0f)
1993 {
1994 return 360f - (0f - angle) % 360f;
1995 }
1996 return angle % 360f;
1997 }
1998
1999 public static Vector3 Random(this Vector3 v)
2000 {
2001 return new Vector3(Rand.Range(0f - v.x, v.x), Rand.Range(0f - v.y, v.y), Rand.Range(0f - v.z, v.z));
2002 }
2003
2004 public static T Instantiate<T>(this T s) where T : ScriptableObject
2005 {
2006 string name = s.name;
2007 T val = UnityEngine.Object.Instantiate(s);
2008 val.name = name;
2009 return val;
2010 }
2011
2012 public static int GetRuntimeEventCount(this UnityEventBase unityEvent)
2013 {
2014 Type typeFromHandle = typeof(UnityEventBase);
2015 Assembly assembly = Assembly.GetAssembly(typeFromHandle);
2016 Type type = assembly.GetType("UnityEngine.Events.InvokableCallList");
2017 Type type2 = assembly.GetType("UnityEngine.Events.BaseInvokableCall");
2018 Type type3 = typeof(List<>).MakeGenericType(type2);
2019 FieldInfo field = typeFromHandle.GetField("m_Calls", BindingFlags.Instance | BindingFlags.NonPublic);
2020 FieldInfo field2 = type.GetField("m_RuntimeCalls", BindingFlags.Instance | BindingFlags.NonPublic);
2021 object value = field.GetValue(unityEvent);
2022 object value2 = field2.GetValue(value);
2023 return (int)type3.GetProperty("Count").GetValue(value2, null);
2024 }
2025}
ArticleStyle
Definition: ArticleStyle.cs:2
$
Definition: ModManager.cs:86
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 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