@@ -12,45 +12,47 @@ public unsafe class ResolvePathHooks : IDisposable
1212 public enum Type
1313 {
1414 Human ,
15- Weapon ,
1615 Other ,
1716 }
1817
19- private delegate nint GeneralResolveDelegate ( nint drawObject , nint path , nint unk3 , uint unk4 ) ;
20- private delegate nint MPapResolveDelegate ( nint drawObject , nint path , nint unk3 , uint unk4 , uint unk5 ) ;
21- private delegate nint MaterialResolveDelegate ( nint drawObject , nint path , nint unk3 , uint unk4 , ulong unk5 ) ;
22- private delegate nint EidResolveDelegate ( nint drawObject , nint path , nint unk3 ) ;
23-
24- private readonly Hook < GeneralResolveDelegate > _resolveDecalPathHook ;
25- private readonly Hook < EidResolveDelegate > _resolveEidPathHook ;
26- private readonly Hook < GeneralResolveDelegate > _resolveImcPathHook ;
27- private readonly Hook < MPapResolveDelegate > _resolveMPapPathHook ;
28- private readonly Hook < GeneralResolveDelegate > _resolveMdlPathHook ;
29- private readonly Hook < MaterialResolveDelegate > _resolveMtrlPathHook ;
30- private readonly Hook < MaterialResolveDelegate > _resolvePapPathHook ;
31- private readonly Hook < GeneralResolveDelegate > _resolvePhybPathHook ;
32- private readonly Hook < GeneralResolveDelegate > _resolveSklbPathHook ;
33- private readonly Hook < GeneralResolveDelegate > _resolveSkpPathHook ;
34- private readonly Hook < EidResolveDelegate > _resolveTmbPathHook ;
35- private readonly Hook < MaterialResolveDelegate > _resolveVfxPathHook ;
18+ private delegate nint MPapResolveDelegate ( nint drawObject , nint pathBuffer , nint pathBufferSize , uint slotIndex , uint sId ) ;
19+ private delegate nint NamedResolveDelegate ( nint drawObject , nint pathBuffer , nint pathBufferSize , uint slotIndex , nint name ) ;
20+ private delegate nint PerSlotResolveDelegate ( nint drawObject , nint pathBuffer , nint pathBufferSize , uint slotIndex ) ;
21+ private delegate nint SingleResolveDelegate ( nint drawObject , nint pathBuffer , nint pathBufferSize ) ;
22+ private delegate nint TmbResolveDelegate ( nint drawObject , nint pathBuffer , nint pathBufferSize , nint timelineName ) ;
23+ // Kept separate from NamedResolveDelegate because the 5th parameter has out semantics here, instead of in.
24+ private delegate nint VfxResolveDelegate ( nint drawObject , nint pathBuffer , nint pathBufferSize , uint slotIndex , nint unkOutParam ) ;
25+
26+ private readonly Hook < PerSlotResolveDelegate > _resolveDecalPathHook ;
27+ private readonly Hook < SingleResolveDelegate > _resolveEidPathHook ;
28+ private readonly Hook < PerSlotResolveDelegate > _resolveImcPathHook ;
29+ private readonly Hook < MPapResolveDelegate > _resolveMPapPathHook ;
30+ private readonly Hook < PerSlotResolveDelegate > _resolveMdlPathHook ;
31+ private readonly Hook < NamedResolveDelegate > _resolveMtrlPathHook ;
32+ private readonly Hook < NamedResolveDelegate > _resolvePapPathHook ;
33+ private readonly Hook < PerSlotResolveDelegate > _resolvePhybPathHook ;
34+ private readonly Hook < PerSlotResolveDelegate > _resolveSklbPathHook ;
35+ private readonly Hook < PerSlotResolveDelegate > _resolveSkpPathHook ;
36+ private readonly Hook < TmbResolveDelegate > _resolveTmbPathHook ;
37+ private readonly Hook < VfxResolveDelegate > _resolveVfxPathHook ;
3638
3739 private readonly PathState _parent ;
3840
3941 public ResolvePathHooks ( IGameInteropProvider interop , PathState parent , nint * vTable , Type type )
4042 {
4143 _parent = parent ;
42- _resolveDecalPathHook = Create < GeneralResolveDelegate > ( interop , vTable [ 83 ] , type , ResolveDecalWeapon , ResolveDecal ) ;
43- _resolveEidPathHook = Create < EidResolveDelegate > ( interop , vTable [ 85 ] , type , ResolveEidWeapon , ResolveEid ) ;
44- _resolveImcPathHook = Create < GeneralResolveDelegate > ( interop , vTable [ 81 ] , type , ResolveImcWeapon , ResolveImc ) ;
45- _resolveMPapPathHook = Create < MPapResolveDelegate > ( interop , vTable [ 79 ] , type , ResolveMPapWeapon , ResolveMPap ) ;
46- _resolveMdlPathHook = Create < GeneralResolveDelegate > ( interop , vTable [ 73 ] , type , ResolveMdlWeapon , ResolveMdl , ResolveMdlHuman ) ;
47- _resolveMtrlPathHook = Create < MaterialResolveDelegate > ( interop , vTable [ 82 ] , type , ResolveMtrlWeapon , ResolveMtrl ) ;
48- _resolvePapPathHook = Create < MaterialResolveDelegate > ( interop , vTable [ 76 ] , type , ResolvePapWeapon , ResolvePap , ResolvePapHuman ) ;
49- _resolvePhybPathHook = Create < GeneralResolveDelegate > ( interop , vTable [ 75 ] , type , ResolvePhybWeapon , ResolvePhyb , ResolvePhybHuman ) ;
50- _resolveSklbPathHook = Create < GeneralResolveDelegate > ( interop , vTable [ 72 ] , type , ResolveSklbWeapon , ResolveSklb , ResolveSklbHuman ) ;
51- _resolveSkpPathHook = Create < GeneralResolveDelegate > ( interop , vTable [ 74 ] , type , ResolveSkpWeapon , ResolveSkp , ResolveSkpHuman ) ;
52- _resolveTmbPathHook = Create < EidResolveDelegate > ( interop , vTable [ 77 ] , type , ResolveTmbWeapon , ResolveTmb ) ;
53- _resolveVfxPathHook = Create < MaterialResolveDelegate > ( interop , vTable [ 84 ] , type , ResolveVfxWeapon , ResolveVfx ) ;
44+ _resolveDecalPathHook = Create < PerSlotResolveDelegate > ( interop , vTable [ 83 ] , ResolveDecal ) ;
45+ _resolveEidPathHook = Create < SingleResolveDelegate > ( interop , vTable [ 85 ] , ResolveEid ) ;
46+ _resolveImcPathHook = Create < PerSlotResolveDelegate > ( interop , vTable [ 81 ] , ResolveImc ) ;
47+ _resolveMPapPathHook = Create < MPapResolveDelegate > ( interop , vTable [ 79 ] , ResolveMPap ) ;
48+ _resolveMdlPathHook = Create < PerSlotResolveDelegate > ( interop , vTable [ 73 ] , type , ResolveMdl , ResolveMdlHuman ) ;
49+ _resolveMtrlPathHook = Create < NamedResolveDelegate > ( interop , vTable [ 82 ] , ResolveMtrl ) ;
50+ _resolvePapPathHook = Create < NamedResolveDelegate > ( interop , vTable [ 76 ] , type , ResolvePap , ResolvePapHuman ) ;
51+ _resolvePhybPathHook = Create < PerSlotResolveDelegate > ( interop , vTable [ 75 ] , type , ResolvePhyb , ResolvePhybHuman ) ;
52+ _resolveSklbPathHook = Create < PerSlotResolveDelegate > ( interop , vTable [ 72 ] , type , ResolveSklb , ResolveSklbHuman ) ;
53+ _resolveSkpPathHook = Create < PerSlotResolveDelegate > ( interop , vTable [ 74 ] , type , ResolveSkp , ResolveSkpHuman ) ;
54+ _resolveTmbPathHook = Create < TmbResolveDelegate > ( interop , vTable [ 77 ] , ResolveTmb ) ;
55+ _resolveVfxPathHook = Create < VfxResolveDelegate > ( interop , vTable [ 84 ] , ResolveVfx ) ;
5456 }
5557
5658 public void Enable ( )
@@ -101,74 +103,74 @@ public void Dispose()
101103 _resolveVfxPathHook . Dispose ( ) ;
102104 }
103105
104- private nint ResolveDecal ( nint drawObject , nint path , nint unk3 , uint unk4 )
105- => ResolvePath ( drawObject , _resolveDecalPathHook . Original ( drawObject , path , unk3 , unk4 ) ) ;
106+ private nint ResolveDecal ( nint drawObject , nint pathBuffer , nint pathBufferSize , uint slotIndex )
107+ => ResolvePath ( drawObject , _resolveDecalPathHook . Original ( drawObject , pathBuffer , pathBufferSize , slotIndex ) ) ;
106108
107- private nint ResolveEid ( nint drawObject , nint path , nint unk3 )
108- => ResolvePath ( drawObject , _resolveEidPathHook . Original ( drawObject , path , unk3 ) ) ;
109+ private nint ResolveEid ( nint drawObject , nint pathBuffer , nint pathBufferSize )
110+ => ResolvePath ( drawObject , _resolveEidPathHook . Original ( drawObject , pathBuffer , pathBufferSize ) ) ;
109111
110- private nint ResolveImc ( nint drawObject , nint path , nint unk3 , uint unk4 )
111- => ResolvePath ( drawObject , _resolveImcPathHook . Original ( drawObject , path , unk3 , unk4 ) ) ;
112+ private nint ResolveImc ( nint drawObject , nint pathBuffer , nint pathBufferSize , uint slotIndex )
113+ => ResolvePath ( drawObject , _resolveImcPathHook . Original ( drawObject , pathBuffer , pathBufferSize , slotIndex ) ) ;
112114
113- private nint ResolveMPap ( nint drawObject , nint path , nint unk3 , uint unk4 , uint unk5 )
114- => ResolvePath ( drawObject , _resolveMPapPathHook . Original ( drawObject , path , unk3 , unk4 , unk5 ) ) ;
115+ private nint ResolveMPap ( nint drawObject , nint pathBuffer , nint pathBufferSize , uint slotIndex , uint unkSId )
116+ => ResolvePath ( drawObject , _resolveMPapPathHook . Original ( drawObject , pathBuffer , pathBufferSize , slotIndex , unkSId ) ) ;
115117
116- private nint ResolveMdl ( nint drawObject , nint path , nint unk3 , uint modelType )
117- => ResolvePath ( drawObject , _resolveMdlPathHook . Original ( drawObject , path , unk3 , modelType ) ) ;
118+ private nint ResolveMdl ( nint drawObject , nint pathBuffer , nint pathBufferSize , uint slotIndex )
119+ => ResolvePath ( drawObject , _resolveMdlPathHook . Original ( drawObject , pathBuffer , pathBufferSize , slotIndex ) ) ;
118120
119- private nint ResolveMtrl ( nint drawObject , nint path , nint unk3 , uint unk4 , ulong unk5 )
120- => ResolvePath ( drawObject , _resolveMtrlPathHook . Original ( drawObject , path , unk3 , unk4 , unk5 ) ) ;
121+ private nint ResolveMtrl ( nint drawObject , nint pathBuffer , nint pathBufferSize , uint slotIndex , nint mtrlFileName )
122+ => ResolvePath ( drawObject , _resolveMtrlPathHook . Original ( drawObject , pathBuffer , pathBufferSize , slotIndex , mtrlFileName ) ) ;
121123
122- private nint ResolvePap ( nint drawObject , nint path , nint unk3 , uint unk4 , ulong unk5 )
123- => ResolvePath ( drawObject , _resolvePapPathHook . Original ( drawObject , path , unk3 , unk4 , unk5 ) ) ;
124+ private nint ResolvePap ( nint drawObject , nint pathBuffer , nint pathBufferSize , uint unkAnimationIndex , nint animationName )
125+ => ResolvePath ( drawObject , _resolvePapPathHook . Original ( drawObject , pathBuffer , pathBufferSize , unkAnimationIndex , animationName ) ) ;
124126
125- private nint ResolvePhyb ( nint drawObject , nint path , nint unk3 , uint unk4 )
126- => ResolvePath ( drawObject , _resolvePhybPathHook . Original ( drawObject , path , unk3 , unk4 ) ) ;
127+ private nint ResolvePhyb ( nint drawObject , nint pathBuffer , nint pathBufferSize , uint partialSkeletonIndex )
128+ => ResolvePath ( drawObject , _resolvePhybPathHook . Original ( drawObject , pathBuffer , pathBufferSize , partialSkeletonIndex ) ) ;
127129
128- private nint ResolveSklb ( nint drawObject , nint path , nint unk3 , uint unk4 )
129- => ResolvePath ( drawObject , _resolveSklbPathHook . Original ( drawObject , path , unk3 , unk4 ) ) ;
130+ private nint ResolveSklb ( nint drawObject , nint pathBuffer , nint pathBufferSize , uint partialSkeletonIndex )
131+ => ResolvePath ( drawObject , _resolveSklbPathHook . Original ( drawObject , pathBuffer , pathBufferSize , partialSkeletonIndex ) ) ;
130132
131- private nint ResolveSkp ( nint drawObject , nint path , nint unk3 , uint unk4 )
132- => ResolvePath ( drawObject , _resolveSkpPathHook . Original ( drawObject , path , unk3 , unk4 ) ) ;
133+ private nint ResolveSkp ( nint drawObject , nint pathBuffer , nint pathBufferSize , uint partialSkeletonIndex )
134+ => ResolvePath ( drawObject , _resolveSkpPathHook . Original ( drawObject , pathBuffer , pathBufferSize , partialSkeletonIndex ) ) ;
133135
134- private nint ResolveTmb ( nint drawObject , nint path , nint unk3 )
135- => ResolvePath ( drawObject , _resolveTmbPathHook . Original ( drawObject , path , unk3 ) ) ;
136+ private nint ResolveTmb ( nint drawObject , nint pathBuffer , nint pathBufferSize , nint timelineName )
137+ => ResolvePath ( drawObject , _resolveTmbPathHook . Original ( drawObject , pathBuffer , pathBufferSize , timelineName ) ) ;
136138
137- private nint ResolveVfx ( nint drawObject , nint path , nint unk3 , uint unk4 , ulong unk5 )
138- => ResolvePath ( drawObject , _resolveVfxPathHook . Original ( drawObject , path , unk3 , unk4 , unk5 ) ) ;
139+ private nint ResolveVfx ( nint drawObject , nint pathBuffer , nint pathBufferSize , uint slotIndex , nint unkOutParam )
140+ => ResolvePath ( drawObject , _resolveVfxPathHook . Original ( drawObject , pathBuffer , pathBufferSize , slotIndex , unkOutParam ) ) ;
139141
140142
141- private nint ResolveMdlHuman ( nint drawObject , nint path , nint unk3 , uint modelType )
143+ private nint ResolveMdlHuman ( nint drawObject , nint pathBuffer , nint pathBufferSize , uint slotIndex )
142144 {
143145 var data = _parent . CollectionResolver . IdentifyCollection ( ( DrawObject * ) drawObject , true ) ;
144- using var eqdp = modelType > 9
146+ using var eqdp = slotIndex > 9
145147 ? DisposableContainer . Empty
146- : _parent . MetaState . ResolveEqdpData ( data . ModCollection , MetaState . GetHumanGenderRace ( drawObject ) , modelType < 5 , modelType > 4 ) ;
147- return ResolvePath ( data , _resolveMdlPathHook . Original ( drawObject , path , unk3 , modelType ) ) ;
148+ : _parent . MetaState . ResolveEqdpData ( data . ModCollection , MetaState . GetHumanGenderRace ( drawObject ) , slotIndex < 5 , slotIndex > 4 ) ;
149+ return ResolvePath ( data , _resolveMdlPathHook . Original ( drawObject , pathBuffer , pathBufferSize , slotIndex ) ) ;
148150 }
149151
150- private nint ResolvePapHuman ( nint drawObject , nint path , nint unk3 , uint unk4 , ulong unk5 )
152+ private nint ResolvePapHuman ( nint drawObject , nint pathBuffer , nint pathBufferSize , uint unkAnimationIndex , nint animationName )
151153 {
152154 using var est = GetEstChanges ( drawObject , out var data ) ;
153- return ResolvePath ( data , _resolvePapPathHook . Original ( drawObject , path , unk3 , unk4 , unk5 ) ) ;
155+ return ResolvePath ( data , _resolvePapPathHook . Original ( drawObject , pathBuffer , pathBufferSize , unkAnimationIndex , animationName ) ) ;
154156 }
155157
156- private nint ResolvePhybHuman ( nint drawObject , nint path , nint unk3 , uint unk4 )
158+ private nint ResolvePhybHuman ( nint drawObject , nint pathBuffer , nint pathBufferSize , uint partialSkeletonIndex )
157159 {
158160 using var est = GetEstChanges ( drawObject , out var data ) ;
159- return ResolvePath ( data , _resolvePhybPathHook . Original ( drawObject , path , unk3 , unk4 ) ) ;
161+ return ResolvePath ( data , _resolvePhybPathHook . Original ( drawObject , pathBuffer , pathBufferSize , partialSkeletonIndex ) ) ;
160162 }
161163
162- private nint ResolveSklbHuman ( nint drawObject , nint path , nint unk3 , uint unk4 )
164+ private nint ResolveSklbHuman ( nint drawObject , nint pathBuffer , nint pathBufferSize , uint partialSkeletonIndex )
163165 {
164166 using var est = GetEstChanges ( drawObject , out var data ) ;
165- return ResolvePath ( data , _resolveSklbPathHook . Original ( drawObject , path , unk3 , unk4 ) ) ;
167+ return ResolvePath ( data , _resolveSklbPathHook . Original ( drawObject , pathBuffer , pathBufferSize , partialSkeletonIndex ) ) ;
166168 }
167169
168- private nint ResolveSkpHuman ( nint drawObject , nint path , nint unk3 , uint unk4 )
170+ private nint ResolveSkpHuman ( nint drawObject , nint pathBuffer , nint pathBufferSize , uint partialSkeletonIndex )
169171 {
170172 using var est = GetEstChanges ( drawObject , out var data ) ;
171- return ResolvePath ( data , _resolveSkpPathHook . Original ( drawObject , path , unk3 , unk4 ) ) ;
173+ return ResolvePath ( data , _resolveSkpPathHook . Original ( drawObject , pathBuffer , pathBufferSize , partialSkeletonIndex ) ) ;
172174 }
173175
174176 private DisposableContainer GetEstChanges ( nint drawObject , out ResolveData data )
@@ -180,58 +182,21 @@ private DisposableContainer GetEstChanges(nint drawObject, out ResolveData data)
180182 data . ModCollection . TemporarilySetEstFile ( _parent . CharacterUtility , EstManipulation . EstType . Head ) ) ;
181183 }
182184
183- private nint ResolveDecalWeapon ( nint drawObject , nint path , nint unk3 , uint unk4 )
184- => ResolvePath ( drawObject , _resolveDecalPathHook . Original ( drawObject , path , unk3 , unk4 ) ) ;
185-
186- private nint ResolveEidWeapon ( nint drawObject , nint path , nint unk3 )
187- => ResolvePath ( drawObject , _resolveEidPathHook . Original ( drawObject , path , unk3 ) ) ;
188-
189- private nint ResolveImcWeapon ( nint drawObject , nint path , nint unk3 , uint unk4 )
190- => ResolvePath ( drawObject , _resolveImcPathHook . Original ( drawObject , path , unk3 , unk4 ) ) ;
191-
192- private nint ResolveMPapWeapon ( nint drawObject , nint path , nint unk3 , uint unk4 , uint unk5 )
193- => ResolvePath ( drawObject , _resolveMPapPathHook . Original ( drawObject , path , unk3 , unk4 , unk5 ) ) ;
194-
195- private nint ResolveMdlWeapon ( nint drawObject , nint path , nint unk3 , uint modelType )
196- => ResolvePath ( drawObject , _resolveMdlPathHook . Original ( drawObject , path , unk3 , modelType ) ) ;
197-
198- private nint ResolveMtrlWeapon ( nint drawObject , nint path , nint unk3 , uint unk4 , ulong unk5 )
199- => ResolvePath ( drawObject , _resolveMtrlPathHook . Original ( drawObject , path , unk3 , unk4 , unk5 ) ) ;
200-
201- private nint ResolvePapWeapon ( nint drawObject , nint path , nint unk3 , uint unk4 , ulong unk5 )
202- => ResolvePath ( drawObject , _resolvePapPathHook . Original ( drawObject , path , unk3 , unk4 , unk5 ) ) ;
203-
204- private nint ResolvePhybWeapon ( nint drawObject , nint path , nint unk3 , uint unk4 )
205- => ResolvePath ( drawObject , _resolvePhybPathHook . Original ( drawObject , path , unk3 , unk4 ) ) ;
206-
207- private nint ResolveSklbWeapon ( nint drawObject , nint path , nint unk3 , uint unk4 )
208- => ResolvePath ( drawObject , _resolveSklbPathHook . Original ( drawObject , path , unk3 , unk4 ) ) ;
209-
210- private nint ResolveSkpWeapon ( nint drawObject , nint path , nint unk3 , uint unk4 )
211- => ResolvePath ( drawObject , _resolveSkpPathHook . Original ( drawObject , path , unk3 , unk4 ) ) ;
212-
213- private nint ResolveTmbWeapon ( nint drawObject , nint path , nint unk3 )
214- => ResolvePath ( drawObject , _resolveTmbPathHook . Original ( drawObject , path , unk3 ) ) ;
215-
216- private nint ResolveVfxWeapon ( nint drawObject , nint path , nint unk3 , uint unk4 , ulong unk5 )
217- => ResolvePath ( drawObject , _resolveVfxPathHook . Original ( drawObject , path , unk3 , unk4 , unk5 ) ) ;
218-
219185
220186 [ MethodImpl ( MethodImplOptions . AggressiveInlining | MethodImplOptions . AggressiveOptimization ) ]
221- private static Hook < T > Create < T > ( IGameInteropProvider interop , nint address , Type type , T weapon , T other , T human ) where T : Delegate
187+ private static Hook < T > Create < T > ( IGameInteropProvider interop , nint address , Type type , T other , T human ) where T : Delegate
222188 {
223189 var del = type switch
224190 {
225191 Type . Human => human ,
226- Type . Weapon => weapon ,
227192 _ => other ,
228193 } ;
229194 return interop . HookFromAddress ( address , del ) ;
230195 }
231196
232197 [ MethodImpl ( MethodImplOptions . AggressiveInlining | MethodImplOptions . AggressiveOptimization ) ]
233- private static Hook < T > Create < T > ( IGameInteropProvider interop , nint address , Type type , T weapon , T other ) where T : Delegate
234- => Create ( interop , address , type , weapon , other , other ) ;
198+ private static Hook < T > Create < T > ( IGameInteropProvider interop , nint address , T del ) where T : Delegate
199+ => interop . HookFromAddress ( address , del ) ;
235200
236201
237202 // Implementation
0 commit comments