Skip to content

Commit 6418de5

Browse files
authored
bugfix(module): Consistently yield experience for direct flame kills (#1539)
1 parent fa9bb64 commit 6418de5

File tree

4 files changed

+38
-2
lines changed

4 files changed

+38
-2
lines changed

Generals/Code/GameEngine/Include/GameLogic/Module/FlammableUpdate.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ class FlammableUpdate : public UpdateModule, public DamageModuleInterface
111111
UnsignedInt m_damageEndFrame;
112112
AudioHandle m_audioHandle;
113113
Real m_flameDamageLimit;
114+
ObjectID m_flameSource;
114115
UnsignedInt m_lastFlameDamageDealt;
115116
};
116117

Generals/Code/GameEngine/Source/GameLogic/Object/Update/FlammableUpdate.cpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ FlammableUpdate::FlammableUpdate( Thing *thing, const ModuleData* moduleData ) :
8484
m_damageEndFrame = 0;
8585
m_audioHandle = NULL;
8686
m_flameDamageLimit = getFlammableUpdateModuleData()->m_flameDamageLimitData;
87+
m_flameSource = INVALID_ID;
8788
m_lastFlameDamageDealt = 0;
8889

8990
setWakeFrame(getObject(), UPDATE_SLEEP_FOREVER);
@@ -110,6 +111,12 @@ void FlammableUpdate::onDamage( DamageInfo *damageInfo )
110111
m_flameDamageLimit = getFlammableUpdateModuleData()->m_flameDamageLimitData;
111112
}
112113
m_lastFlameDamageDealt = now;
114+
#if RETAIL_COMPATIBLE_CRC
115+
m_flameSource = getObject()->getID();
116+
#else
117+
// TheSuperHackers @bugfix Stubbjax 03/09/2025 Allow flame damage to award xp to the flame source.
118+
m_flameSource = damageInfo->in.m_sourceID;
119+
#endif
113120

114121
Object *me = getObject();
115122
if( !me->getStatusBits().test( OBJECT_STATUS_AFLAME ) && !me->getStatusBits().test( OBJECT_STATUS_BURNED ) )
@@ -229,7 +236,7 @@ void FlammableUpdate::doAflameDamage()
229236

230237
DamageInfo info;
231238
info.in.m_amount = data->m_aflameDamageAmount;
232-
info.in.m_sourceID = getObject()->getID();
239+
info.in.m_sourceID = m_flameSource;
233240
info.in.m_damageType = DAMAGE_FLAME;
234241
info.in.m_deathType = DEATH_BURNED;
235242

@@ -287,7 +294,11 @@ void FlammableUpdate::xfer( Xfer *xfer )
287294
{
288295

289296
// version
297+
#if RETAIL_COMPATIBLE_XFER_SAVE
290298
XferVersion currentVersion = 1;
299+
#else
300+
XferVersion currentVersion = 2;
301+
#endif
291302
XferVersion version = currentVersion;
292303
xfer->xferVersion( &version, currentVersion );
293304

@@ -312,6 +323,12 @@ void FlammableUpdate::xfer( Xfer *xfer )
312323
// last flame damage dealt
313324
xfer->xferUnsignedInt( &m_lastFlameDamageDealt );
314325

326+
#if !RETAIL_COMPATIBLE_XFER_SAVE
327+
if (version >= 2)
328+
{
329+
xfer->xferObjectID(&m_flameSource);
330+
}
331+
#endif
315332
}
316333

317334
// ------------------------------------------------------------------------------------------------

GeneralsMD/Code/GameEngine/Include/GameLogic/Module/FlammableUpdate.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ class FlammableUpdate : public UpdateModule, public DamageModuleInterface
111111
UnsignedInt m_damageEndFrame;
112112
AudioHandle m_audioHandle;
113113
Real m_flameDamageLimit;
114+
ObjectID m_flameSource;
114115
UnsignedInt m_lastFlameDamageDealt;
115116
};
116117

GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/FlammableUpdate.cpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ FlammableUpdate::FlammableUpdate( Thing *thing, const ModuleData* moduleData ) :
8484
m_damageEndFrame = 0;
8585
m_audioHandle = NULL;
8686
m_flameDamageLimit = getFlammableUpdateModuleData()->m_flameDamageLimitData;
87+
m_flameSource = INVALID_ID;
8788
m_lastFlameDamageDealt = 0;
8889

8990
setWakeFrame(getObject(), UPDATE_SLEEP_FOREVER);
@@ -110,6 +111,12 @@ void FlammableUpdate::onDamage( DamageInfo *damageInfo )
110111
m_flameDamageLimit = getFlammableUpdateModuleData()->m_flameDamageLimitData;
111112
}
112113
m_lastFlameDamageDealt = now;
114+
#if RETAIL_COMPATIBLE_CRC
115+
m_flameSource = getObject()->getID();
116+
#else
117+
// TheSuperHackers @bugfix Stubbjax 03/09/2025 Allow flame damage to award xp to the flame source.
118+
m_flameSource = damageInfo->in.m_sourceID;
119+
#endif
113120

114121
Object *me = getObject();
115122
if( !me->getStatusBits().test( OBJECT_STATUS_AFLAME ) && !me->getStatusBits().test( OBJECT_STATUS_BURNED ) )
@@ -229,7 +236,7 @@ void FlammableUpdate::doAflameDamage()
229236

230237
DamageInfo info;
231238
info.in.m_amount = data->m_aflameDamageAmount;
232-
info.in.m_sourceID = getObject()->getID();
239+
info.in.m_sourceID = m_flameSource;
233240
info.in.m_damageType = DAMAGE_FLAME;
234241
info.in.m_deathType = DEATH_BURNED;
235242

@@ -287,7 +294,11 @@ void FlammableUpdate::xfer( Xfer *xfer )
287294
{
288295

289296
// version
297+
#if RETAIL_COMPATIBLE_XFER_SAVE
290298
XferVersion currentVersion = 1;
299+
#else
300+
XferVersion currentVersion = 2;
301+
#endif
291302
XferVersion version = currentVersion;
292303
xfer->xferVersion( &version, currentVersion );
293304

@@ -312,6 +323,12 @@ void FlammableUpdate::xfer( Xfer *xfer )
312323
// last flame damage dealt
313324
xfer->xferUnsignedInt( &m_lastFlameDamageDealt );
314325

326+
#if !RETAIL_COMPATIBLE_XFER_SAVE
327+
if (version >= 2)
328+
{
329+
xfer->xferObjectID(&m_flameSource);
330+
}
331+
#endif
315332
}
316333

317334
// ------------------------------------------------------------------------------------------------

0 commit comments

Comments
 (0)