1+ using System . Collections ;
2+ using System . Reflection ;
3+ using MelonLoader ;
4+ using UnhollowerBaseLib ;
5+ using UnhollowerRuntimeLib ;
6+ using UnityEngine ;
7+
8+ namespace ClassicPlates ;
9+
10+ internal static class AssetManager
11+ {
12+ internal static GameObject ? Nameplate ;
13+ private static AssetBundle ? _bundle ;
14+ public static readonly Dictionary < string , Sprite > ? SpriteDict = new Dictionary < string , Sprite > ( ) ;
15+ public static Il2CppReferenceArray < Sprite > ? SpeakingSprites ;
16+ public static Il2CppReferenceArray < Sprite > ? MutedSprites ;
17+
18+ private static GameObject LoadPrefab ( string @object )
19+ {
20+ if ( _bundle is null )
21+ {
22+ MelonLogger . Error ( "Failed to load Prefab: " + @object ) ;
23+ throw new FileLoadException ( ) ;
24+ }
25+ var go = _bundle . LoadAsset_Internal ( @object , Il2CppType . Of < GameObject > ( ) ) . Cast < GameObject > ( ) ;
26+ go . hideFlags |= HideFlags . DontUnloadUnusedAsset ;
27+ go . hideFlags = HideFlags . HideAndDontSave ;
28+ MelonDebug . Msg ( "Loaded Prefab: " + @object ) ;
29+ return go ;
30+ }
31+
32+ private static Sprite LoadSprite ( string sprite )
33+ {
34+ if ( _bundle is null )
35+ {
36+ MelonLogger . Error ( "Failed to load Sprite: " + sprite ) ;
37+ throw new FileLoadException ( ) ;
38+ }
39+ var sprite2 = _bundle . LoadAsset_Internal ( sprite , Il2CppType . Of < Sprite > ( ) ) . Cast < Sprite > ( ) ;
40+ sprite2 . hideFlags |= HideFlags . DontUnloadUnusedAsset ;
41+ sprite2 . hideFlags = HideFlags . HideAndDontSave ;
42+ MelonDebug . Msg ( "Loaded Sprite: " + sprite ) ;
43+ return sprite2 ;
44+ }
45+
46+ static IEnumerator LoadResources ( )
47+ {
48+ using var stream = Assembly . GetExecutingAssembly ( ) . GetManifestResourceStream ( "ClassicPlates.Resources.classicplates" ) ;
49+ if ( stream != null )
50+ {
51+ using var memoryStream = new MemoryStream ( ( int ) stream . Length ) ;
52+ stream . CopyTo ( memoryStream ) ;
53+ _bundle = AssetBundle . LoadFromMemory_Internal ( memoryStream . ToArray ( ) , 0 ) ;
54+ try
55+ {
56+ Nameplate = LoadPrefab ( "Nameplate.prefab" ) ?? throw new Exception ( "AssetLoadException" ) ;
57+
58+ SpriteDict ? . Add ( "bubble0" ,
59+ LoadSprite ( "bubble_0.png" ) ?? throw new Exception ( "AssetLoadException: bubble_0.png" ) ) ;
60+ SpriteDict ? . Add ( "bubble1" ,
61+ LoadSprite ( "bubble_1.png" ) ?? throw new Exception ( "AssetLoadException: bubble_1.png" ) ) ;
62+ SpriteDict ? . Add ( "bubble2" ,
63+ LoadSprite ( "bubble_2.png" ) ?? throw new Exception ( "AssetLoadException: bubble_2.png" ) ) ;
64+ SpriteDict ? . Add ( "bubble3" ,
65+ LoadSprite ( "bubble_3.png" ) ?? throw new Exception ( "AssetLoadException: bubble_3.png" ) ) ;
66+ SpriteDict ? . Add ( "bubblemute" ,
67+ LoadSprite ( "bubble_mute.png" ) ?? throw new Exception ( "AssetLoadException: bubble_mute.png" ) ) ;
68+
69+ SpriteDict ? . Add ( "ear" ,
70+ LoadSprite ( "ear.png" ) ?? throw new Exception ( "AssetLoadException: ear.png" ) ) ;
71+ SpriteDict ? . Add ( "earmute" ,
72+ LoadSprite ( "ear_mute.png" ) ?? throw new Exception ( "AssetLoadException: ear_mute.png" ) ) ;
73+
74+ SpriteDict ? . Add ( "defaulticon" ,
75+ LoadSprite ( "icon_default.png" ) ?? throw new Exception ( "AssetLoadException: icon_default.png" ) ) ;
76+ SpriteDict ? . Add ( "iconborder" ,
77+ LoadSprite ( "IconBorder.png" ) ?? throw new Exception ( "AssetLoadException: IconBorder.png" ) ) ;
78+ SpriteDict ? . Add ( "friend" ,
79+ LoadSprite ( "friend_icon.png" ) ?? throw new Exception ( "AssetLoadException: friend_icon.png" ) ) ;
80+ SpriteDict ? . Add ( "quest" ,
81+ LoadSprite ( "quest.png" ) ?? throw new Exception ( "AssetLoadException: quest.png" ) ) ;
82+ SpriteDict ? . Add ( "crown" ,
83+ LoadSprite ( "crown.png" ) ?? throw new Exception ( "AssetLoadException: crown.png" ) ) ;
84+
85+ SpriteDict ? . Add ( "nameplate" ,
86+ LoadSprite ( "NameplateSilent.png" ) ?? throw new Exception ( "AssetLoadException: NameplateSilent.png" ) ) ;
87+ SpriteDict ? . Add ( "nameplatetalk" ,
88+ LoadSprite ( "NameplateTalk.png" ) ?? throw new Exception ( "AssetLoadException: NameplateTalk.png" ) ) ;
89+ SpriteDict ? . Add ( "nameplatemask" ,
90+ LoadSprite ( "NameplateMask.png" ) ?? throw new Exception ( "AssetLoadException: NameplateMask.png" ) ) ;
91+
92+ SpriteDict ? . Add ( "fallback" ,
93+ LoadSprite ( "fallback_icon.png" ) ?? throw new Exception ( "AssetLoadException: fallback_icon.png" ) ) ;
94+ SpriteDict ? . Add ( "fallbackerror" ,
95+ LoadSprite ( "perf_fallback_error.png" ) ?? throw new Exception ( "AssetLoadException: perf_fallback_error.png" ) ) ;
96+ SpriteDict ? . Add ( "fallbackmissing" ,
97+ LoadSprite ( "perf_fallback_missing.png" ) ?? throw new Exception ( "AssetLoadException: perf_fallback_missing.png" ) ) ;
98+ SpriteDict ? . Add ( "fallbackgreat" ,
99+ LoadSprite ( "perf_fallback_great.png" ) ?? throw new Exception ( "AssetLoadException: perf_fallback_great.png" ) ) ;
100+ SpriteDict ? . Add ( "fallbackgood" ,
101+ LoadSprite ( "perf_fallback_good.png" ) ?? throw new Exception ( "AssetLoadException: perf_fallback_good.png" ) ) ;
102+ SpriteDict ? . Add ( "fallbackmedium" ,
103+ LoadSprite ( "perf_fallback_medium.png" ) ?? throw new Exception ( "AssetLoadException: perf_fallback_medium.png" ) ) ;
104+ SpriteDict ? . Add ( "fallbackpoor" ,
105+ LoadSprite ( "perf_fallback_poor.png" ) ?? throw new Exception ( "AssetLoadException: perf_fallback_poor.png" ) ) ;
106+ SpriteDict ? . Add ( "fallbackhorrible" ,
107+ LoadSprite ( "perf_fallback_horrible.png" ) ?? throw new Exception ( "AssetLoadException: perf_fallback_horrible.png" ) ) ;
108+
109+ SpriteDict ? . Add ( "great" ,
110+ LoadSprite ( "Perf_Great.png" ) ?? throw new Exception ( "AssetLoadException: Perf_Great.png" ) ) ;
111+ SpriteDict ? . Add ( "good" ,
112+ LoadSprite ( "Perf_Good.png" ) ?? throw new Exception ( "AssetLoadException: Perf_Good.png" ) ) ;
113+ SpriteDict ? . Add ( "medium" ,
114+ LoadSprite ( "Perf_Medium.png" ) ?? throw new Exception ( "AssetLoadException: Perf_Medium.png" ) ) ;
115+ SpriteDict ? . Add ( "poor" ,
116+ LoadSprite ( "Perf_Poor.png" ) ?? throw new Exception ( "AssetLoadException: Perf_Poor.png" ) ) ;
117+ SpriteDict ? . Add ( "horrible" ,
118+ LoadSprite ( "Perf_Horrible.png" ) ?? throw new Exception ( "AssetLoadException: Perf_Horrible.png" ) ) ;
119+ SpriteDict ? . Add ( "blocked" ,
120+ LoadSprite ( "Perf_Blocked.png" ) ?? throw new Exception ( "AssetLoadException: Perf_Blocked.png" ) ) ;
121+ SpriteDict ? . Add ( "imposter" ,
122+ LoadSprite ( "perf_impostor.png" ) ?? throw new Exception ( "AssetLoadException: perf_impostor.png" ) ) ;
123+
124+ SpriteDict ? . Add ( "physyes" ,
125+ LoadSprite ( "PhysYes.png" ) ?? throw new Exception ( "AssetLoadException: PhysYes.png" ) ) ;
126+ SpriteDict ? . Add ( "physno" ,
127+ LoadSprite ( "PhysNo.png" ) ?? throw new Exception ( "AssetLoadException: PhysNo.png" ) ) ;
128+
129+ CreateSpriteArrays ( ) ;
130+ }
131+ catch ( Exception e )
132+ {
133+ MelonLogger . Error ( $ "Nameplate Assets failed to load\n \n { e } ") ;
134+ }
135+ }
136+ else
137+ {
138+ MelonLogger . Error ( "Stream is null, Nameplates cannot load" ) ;
139+ }
140+
141+ yield break ;
142+ }
143+ public static void Init ( ) => MelonCoroutines . Start ( LoadResources ( ) ) ;
144+
145+
146+ private static void CreateSpriteArrays ( )
147+ {
148+ if ( SpriteDict == null ) return ;
149+
150+ SpeakingSprites = new Il2CppReferenceArray < Sprite > ( new [ ]
151+ {
152+ SpriteDict [ "bubble0" ] ,
153+ SpriteDict [ "bubble1" ] ,
154+ SpriteDict [ "bubble2" ] ,
155+ SpriteDict [ "bubble3" ]
156+ } ) ;
157+
158+ MutedSprites = new Il2CppReferenceArray < Sprite > ( new [ ]
159+ {
160+ SpriteDict [ "bubblemute" ]
161+ } ) ;
162+ }
163+ }
0 commit comments