1
+ using IL2CPPAssetBundleAPI ;
2
+ using MelonLoader ;
3
+ using System ;
4
+ using System . Collections . Generic ;
5
+ using System . Linq ;
6
+ using UnityEngine ;
7
+ using Object = UnityEngine . Object ;
8
+
9
+ namespace GizmosAPI
10
+ {
11
+ public class Gizmos
12
+ {
13
+ private static bool ? _enabled = null ;
14
+ private static bool ? _overrender = null ;
15
+ private static readonly string PrefsKey = "Gizmos" ;
16
+
17
+ private static GameObject Template ;
18
+
19
+ internal static void Init ( IL2CPPAssetBundle Bundle )
20
+ {
21
+ if ( Bundle == null )
22
+ {
23
+ return ;
24
+ }
25
+
26
+ Template = Bundle . Load < GameObject > ( "Sphere" ) ;
27
+ Template . hideFlags = HideFlags . DontUnloadUnusedAsset ;
28
+ }
29
+
30
+ /// <summary>
31
+ /// Toggles wether the gizmos could be drawn or not.
32
+ /// </summary>
33
+ internal static bool Enabled
34
+ {
35
+ get
36
+ {
37
+ if ( _enabled == null )
38
+ {
39
+ _enabled = PlayerPrefs . GetInt ( $ "{ PrefsKey } .Enabled", 1 ) == 1 ;
40
+ }
41
+
42
+ return _enabled . Value ;
43
+ }
44
+ set
45
+ {
46
+ if ( _enabled != value )
47
+ {
48
+ _enabled = value ;
49
+ PlayerPrefs . SetInt ( $ "{ PrefsKey } .Enabled", value ? 1 : 0 ) ;
50
+ }
51
+
52
+ Objects = Objects . Where ( o => o != null ) . ToList ( ) ;
53
+
54
+ foreach ( var Obj in Objects )
55
+ {
56
+ Obj ? . SetActive ( value ) ;
57
+ }
58
+ }
59
+ }
60
+
61
+ internal static bool Overrender
62
+ {
63
+ get
64
+ {
65
+ if ( _overrender == null )
66
+ {
67
+ _overrender = ( ! PlayerPrefs . HasKey ( $ "{ PrefsKey } .Overrender") || ( PlayerPrefs . GetInt ( $ "{ PrefsKey } .Overrender", 1 ) == 1 ) ) ;
68
+ }
69
+
70
+ return _overrender . Value ;
71
+ }
72
+ set
73
+ {
74
+ if ( _overrender != value )
75
+ {
76
+ _overrender = value ;
77
+ PlayerPrefs . SetInt ( $ "{ PrefsKey } .Overrender", value ? 1 : 0 ) ;
78
+ }
79
+
80
+ Objects = Objects . Where ( o => o != null ) . ToList ( ) ;
81
+
82
+ foreach ( var Obj in Objects )
83
+ {
84
+ Obj ? . GetComponent < MeshRenderer > ( ) . material . SetFloat ( "_ZTest" , value ? 0f : 4f ) ;
85
+ }
86
+ }
87
+ }
88
+
89
+ private static float ColourInterval = 0f ;
90
+ private static float ScaleInterval = 0f ;
91
+ internal static void Update ( )
92
+ {
93
+ if ( Enabled )
94
+ {
95
+ if ( Time . time > ColourInterval )
96
+ {
97
+ ColourInterval = Time . time + 0.1f ;
98
+
99
+ foreach ( var Influence in ObjectInfluences )
100
+ {
101
+ if ( Influence . Item1 != null && Influence . Item2 != null )
102
+ {
103
+ var NewColour = Influence . Item3 ( ) ;
104
+
105
+ if ( Influence . Item2 . material . GetColor ( "_WireColor" ) != NewColour )
106
+ {
107
+ Influence . Item2 . material . SetColor ( "_WireColor" , NewColour ) ;
108
+ }
109
+ }
110
+ }
111
+ }
112
+
113
+ if ( Time . time > ScaleInterval )
114
+ {
115
+ ScaleInterval = Time . time + 1f ;
116
+
117
+ foreach ( var RawScale in ObjectScales )
118
+ {
119
+ if ( RawScale . Item1 != null )
120
+ {
121
+ var Scale = RawScale . Item2 ( ) * 2f ;
122
+ var NewScale = new Vector3 ( Scale , Scale , Scale ) ;
123
+
124
+ if ( RawScale . Item1 . transform . localScale != NewScale )
125
+ {
126
+ RawScale . Item1 . transform . localScale = NewScale ;
127
+ }
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }
133
+
134
+ public static List < GameObject > Objects = new List < GameObject > ( ) ;
135
+ public static List < ( GameObject , MeshRenderer , Func < Color > ) > ObjectInfluences = new List < ( GameObject , MeshRenderer , Func < Color > ) > ( ) ;
136
+ public static List < ( GameObject , Func < float > ) > ObjectScales = new List < ( GameObject , Func < float > ) > ( ) ;
137
+
138
+ public static GameObject MakeOutline ( MeshRenderer renderer , Func < Color > ColourInfluence = null )
139
+ {
140
+ var Filter = renderer ? . GetComponent < MeshFilter > ( ) ;
141
+
142
+ if ( Filter != null && ! GetChildren ( renderer . transform ) . Any ( o => o != null && o . GetComponentInChildren < MeshRenderer > ( true ) is var rendererthing && rendererthing ? . material ? . shader ? . name != null && rendererthing . material . shader . name . Contains ( "Outline" ) ) )
143
+ {
144
+ var NewObj = Object . Instantiate ( Template , renderer . transform ) ;
145
+ NewObj . hideFlags = HideFlags . DontUnloadUnusedAsset ;
146
+
147
+ NewObj . transform . localPosition = Vector3 . zero ;
148
+ NewObj . transform . localRotation = new Quaternion ( 0f , 0f , 0f , 0f ) ;
149
+
150
+ NewObj . transform . localScale = new Vector3 ( 1f , 1f , 1f ) ;
151
+
152
+ NewObj . GetComponent < MeshFilter > ( ) . sharedMesh = null ;
153
+ NewObj . GetComponent < MeshFilter > ( ) . sharedMesh = Filter . sharedMesh ;
154
+
155
+ if ( ColourInfluence != null )
156
+ {
157
+ ObjectInfluences . Add ( ( NewObj , NewObj ? . GetComponent < MeshRenderer > ( ) , ColourInfluence ) ) ;
158
+ ObjectInfluences = ObjectInfluences . Where ( o => o . Item1 != null ) . ToList ( ) ;
159
+ }
160
+
161
+ Objects . Add ( NewObj ) ;
162
+
163
+ Objects = Objects . Where ( o => o != null ) . ToList ( ) ;
164
+
165
+ NewObj . SetActive ( Enabled ) ;
166
+
167
+ if ( Overrender )
168
+ {
169
+ NewObj . GetComponent < MeshRenderer > ( ) . material . SetFloat ( "_ZTest" , 0f ) ;
170
+ }
171
+
172
+ return NewObj ;
173
+ }
174
+
175
+ MelonLogger . Error ( "Renderer Or Filter Is Null!" ) ;
176
+
177
+ return null ;
178
+ }
179
+
180
+ public static GameObject MakeOutline ( GameObject obj , float Radius , Color Colour )
181
+ {
182
+ if ( obj != null && ! GetChildren ( obj . transform ) . Any ( o => o != null && o . GetComponentInChildren < MeshRenderer > ( true ) is var rendererthing && rendererthing ? . material ? . shader ? . name != null && rendererthing . material . shader . name . Contains ( "Outline" ) ) )
183
+ {
184
+ var NewObj = Object . Instantiate ( Template , obj . transform ) ;
185
+ NewObj . hideFlags = HideFlags . DontUnloadUnusedAsset ;
186
+
187
+ NewObj . transform . localPosition = Vector3 . zero ;
188
+ NewObj . transform . localRotation = new Quaternion ( 0f , 0f , 0f , 0f ) ;
189
+
190
+ var Scale = Radius * 2f ;
191
+ NewObj . transform . localScale = new Vector3 ( Scale , Scale , Scale ) ;
192
+
193
+ NewObj . GetComponent < MeshRenderer > ( ) . material = new Material ( NewObj ? . GetComponent < MeshRenderer > ( ) . material ) ;
194
+
195
+ NewObj . GetComponent < MeshRenderer > ( ) . material . SetColor ( "_WireColor" , Colour ) ;
196
+
197
+ Objects . Add ( NewObj ) ;
198
+
199
+ Objects = Objects . Where ( o => o != null ) . ToList ( ) ;
200
+
201
+ NewObj . SetActive ( Enabled ) ;
202
+
203
+ if ( Overrender )
204
+ {
205
+ NewObj . GetComponent < MeshRenderer > ( ) . material . SetFloat ( "_ZTest" , 0f ) ;
206
+ }
207
+
208
+ return NewObj ;
209
+ }
210
+
211
+ MelonLogger . Error ( "Object Is Null!" ) ;
212
+
213
+ return null ;
214
+ }
215
+
216
+ public static GameObject MakeOutline ( GameObject obj , float Radius , Func < Color > ColourInfluence = null )
217
+ {
218
+ if ( obj != null && ! GetChildren ( obj . transform ) . Any ( o => o != null && o . GetComponentInChildren < MeshRenderer > ( true ) is var rendererthing && rendererthing ? . material ? . shader ? . name != null && rendererthing . material . shader . name . Contains ( "Outline" ) ) )
219
+ {
220
+ var NewObj = Object . Instantiate ( Template , obj . transform ) ;
221
+ NewObj . hideFlags = HideFlags . DontUnloadUnusedAsset ;
222
+
223
+ NewObj . transform . localPosition = Vector3 . zero ;
224
+ NewObj . transform . localRotation = new Quaternion ( 0f , 0f , 0f , 0f ) ;
225
+
226
+ var Scale = Radius * 2f ;
227
+ NewObj . transform . localScale = new Vector3 ( Scale , Scale , Scale ) ;
228
+
229
+ NewObj . GetComponent < MeshRenderer > ( ) . material = new Material ( NewObj ? . GetComponent < MeshRenderer > ( ) . material ) ;
230
+
231
+ if ( ColourInfluence != null )
232
+ {
233
+ ObjectInfluences . Add ( ( NewObj , NewObj ? . GetComponent < MeshRenderer > ( ) , ColourInfluence ) ) ;
234
+ ObjectInfluences = ObjectInfluences . Where ( o => o . Item1 != null ) . ToList ( ) ;
235
+ }
236
+
237
+ Objects . Add ( NewObj ) ;
238
+
239
+ Objects = Objects . Where ( o => o != null ) . ToList ( ) ;
240
+
241
+ NewObj . SetActive ( Enabled ) ;
242
+
243
+ if ( Overrender )
244
+ {
245
+ NewObj . GetComponent < MeshRenderer > ( ) . material . SetFloat ( "_ZTest" , 0f ) ;
246
+ }
247
+
248
+ return NewObj ;
249
+ }
250
+
251
+ MelonLogger . Error ( "Object Is Null!" ) ;
252
+
253
+ return null ;
254
+ }
255
+
256
+ public static GameObject MakeOutline ( GameObject obj , Func < float > Radius , Func < Color > ColourInfluence = null )
257
+ {
258
+ if ( obj != null && ! GetChildren ( obj . transform ) . Any ( o => o != null && o . GetComponentInChildren < MeshRenderer > ( true ) is var rendererthing && rendererthing ? . material ? . shader ? . name != null && rendererthing . material . shader . name . Contains ( "Outline" ) ) )
259
+ {
260
+ var NewObj = Object . Instantiate ( Template , obj . transform ) ;
261
+ NewObj . hideFlags = HideFlags . DontUnloadUnusedAsset ;
262
+
263
+ NewObj . transform . localPosition = Vector3 . zero ;
264
+ NewObj . transform . localRotation = new Quaternion ( 0f , 0f , 0f , 0f ) ;
265
+
266
+ var Scale = Radius ( ) * 2f ;
267
+ ObjectScales . Add ( ( NewObj , Radius ) ) ;
268
+ ObjectScales = ObjectScales . Where ( o => o . Item1 != null ) . ToList ( ) ;
269
+
270
+ NewObj . transform . localScale = new Vector3 ( Scale , Scale , Scale ) ;
271
+
272
+ if ( ColourInfluence != null )
273
+ {
274
+ ObjectInfluences . Add ( ( NewObj , NewObj ? . GetComponent < MeshRenderer > ( ) , ColourInfluence ) ) ;
275
+ }
276
+
277
+ Objects . Add ( NewObj ) ;
278
+
279
+ Objects = Objects . Where ( o => o != null ) . ToList ( ) ;
280
+
281
+ NewObj . SetActive ( Enabled ) ;
282
+
283
+ if ( Overrender )
284
+ {
285
+ NewObj . GetComponent < MeshRenderer > ( ) . material . SetFloat ( "_ZTest" , 0f ) ;
286
+ }
287
+
288
+ return NewObj ;
289
+ }
290
+
291
+ MelonLogger . Error ( "Object Is Null!" ) ;
292
+
293
+ return null ;
294
+ }
295
+
296
+ private static List < Transform > GetChildren ( Transform Parent )
297
+ {
298
+ var Children = new List < Transform > ( ) ;
299
+
300
+ for ( var i = 0 ; i < Parent . childCount ; i ++ )
301
+ {
302
+ Children . Add ( Parent . GetChild ( i ) ) ;
303
+ }
304
+
305
+ return Children ;
306
+ }
307
+ }
308
+ }
0 commit comments