1111
1212#include " StdInc.h"
1313#include " CDamageManagerSA.h"
14+ #include " CAutomobileSA.h"
1415
1516BYTE CDamageManagerSA::GetEngineStatus ()
1617{
@@ -98,7 +99,7 @@ void CDamageManagerSA::SetWheelStatus(eWheelPosition bWheel, BYTE bTireStatus)
9899 }
99100}
100101
101- void CDamageManagerSA::SetPanelStatus (BYTE bPanel, BYTE bPanelStatus)
102+ void CDamageManagerSA::SetPanelStatus (BYTE bPanel, BYTE bPanelStatus, bool spawnFlyingComponent, bool breakGlass )
102103{
103104 // Valid index?
104105 if (bPanel < MAX_PANELS && bPanelStatus <= 3 )
@@ -122,70 +123,41 @@ void CDamageManagerSA::SetPanelStatus(BYTE bPanel, BYTE bPanelStatus)
122123 // Intact?
123124 if (bPanelStatus == DT_PANEL_INTACT)
124125 {
125- // Grab the car node index for the given panel
126- static int s_iCarNodeIndexes[7 ] = {0x0F , 0x0E , 0x00 /* ?*/ , 0x00 /* ?*/ , 0x12 , 0x0C , 0x0D };
127-
128126 // Call CAutomobile::FixPanel to update the vehicle
129127 dwFunction = 0x6A3670 ;
130128 dwThis = (DWORD)internalEntityInterface;
131- int iCarNodeIndex = s_iCarNodeIndexes[bPanel];
129+ int carNodeIndex = GetCarNodeIndexFromPanel (bPanel);
130+ if (carNodeIndex < 0 )
131+ return ;
132+
132133 _asm
133134 {
134135 mov ecx, dwThis
135136 push dwPanel
136- push iCarNodeIndex
137+ push carNodeIndex
137138 call dwFunction
138139 }
139140 }
140141 else
141- {
142- // Call CAutomobile::SetPanelDamage to update the vehicle
143- dwFunction = 0x6B1480 ;
144- dwThis = (DWORD)internalEntityInterface;
145- bool bUnknown = false ;
146- _asm
147- {
148- mov ecx, dwThis
149- push bUnknown
150- push dwPanel
151- call dwFunction
152- }
153- }
142+ reinterpret_cast <CAutomobileSAInterface*>(internalEntityInterface)->SetPanelDamage (dwPanel, breakGlass, spawnFlyingComponent);
154143 }
155144 }
156145}
157146
158- void CDamageManagerSA::SetPanelStatus (unsigned long ulStatus)
147+ void CDamageManagerSA::SetPanelStatus (unsigned long ulStatus, bool spawnFlyingComponent, bool breakGlass )
159148{
160149 unsigned int uiIndex;
161150
162151 for (uiIndex = 0 ; uiIndex < MAX_PANELS; uiIndex++)
163152 {
164- SetPanelStatus (static_cast <eDoors>(uiIndex), static_cast <unsigned char >(ulStatus));
153+ SetPanelStatus (static_cast <eDoors>(uiIndex), static_cast <unsigned char >(ulStatus), spawnFlyingComponent, breakGlass );
165154 ulStatus >>= 4 ;
166155 }
167156}
168157
169- BYTE CDamageManagerSA::GetPanelStatus (BYTE bPanel)
158+ BYTE CDamageManagerSA::GetPanelStatus (BYTE bPanel) const
170159{
171- if (bPanel < MAX_PANELS)
172- {
173- DWORD dwFunction = FUNC_GetPanelStatus;
174- DWORD dwPointer = (DWORD)internalInterface;
175- BYTE bReturn = 0 ;
176- DWORD dwPanel = bPanel;
177- _asm
178- {
179- mov ecx, dwPointer
180- push dwPanel
181- call dwFunction
182- mov bReturn, al
183- }
184-
185- return bReturn;
186- }
187-
188- return 0 ;
160+ return internalInterface->GetPanelStatus (bPanel);
189161}
190162
191163unsigned long CDamageManagerSA::GetPanelStatus ()
@@ -275,3 +247,29 @@ void CDamageManagerSA::FuckCarCompletely(bool bKeepWheels)
275247 call dwFunc
276248 }
277249}
250+
251+ int CDamageManagerSA::GetCarNodeIndexFromPanel (std::uint8_t panelId) noexcept
252+ {
253+ int index = -1 ;
254+
255+ switch (panelId)
256+ {
257+ case 0 :
258+ index = 15 ; // PANEL_WING_LF
259+ break ;
260+ case 1 :
261+ index = 14 ; // PANEL_WING_RF
262+ break ;
263+ case 4 :
264+ index = 18 ; // PANEL_WINDSCREEN
265+ break ;
266+ case 5 :
267+ index = 12 ; // BUMP_FRONT
268+ break ;
269+ case 6 :
270+ index = 13 ; // BUMP_REAR
271+ break ;
272+ }
273+
274+ return index;
275+ }
0 commit comments