From b8ef4cd44a9adee93e92b696ee57a8508595907b Mon Sep 17 00:00:00 2001 From: Stubbjax Date: Fri, 5 Sep 2025 02:19:27 +1000 Subject: [PATCH 1/2] bugfix: Apply flame source to flammable update damage info --- .../Include/GameLogic/Module/FlammableUpdate.h | 1 + .../Object/Update/FlammableUpdate.cpp | 18 +++++++++++++++++- .../Include/GameLogic/Module/FlammableUpdate.h | 1 + .../Object/Update/FlammableUpdate.cpp | 18 +++++++++++++++++- 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/Generals/Code/GameEngine/Include/GameLogic/Module/FlammableUpdate.h b/Generals/Code/GameEngine/Include/GameLogic/Module/FlammableUpdate.h index ada7542a3f6..e1799e99d62 100644 --- a/Generals/Code/GameEngine/Include/GameLogic/Module/FlammableUpdate.h +++ b/Generals/Code/GameEngine/Include/GameLogic/Module/FlammableUpdate.h @@ -111,6 +111,7 @@ class FlammableUpdate : public UpdateModule, public DamageModuleInterface UnsignedInt m_damageEndFrame; AudioHandle m_audioHandle; Real m_flameDamageLimit; + ObjectID m_flameSource; UnsignedInt m_lastFlameDamageDealt; }; diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/FlammableUpdate.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/FlammableUpdate.cpp index 95888864883..e4e0ab92cb5 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/FlammableUpdate.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/FlammableUpdate.cpp @@ -84,6 +84,7 @@ FlammableUpdate::FlammableUpdate( Thing *thing, const ModuleData* moduleData ) : m_damageEndFrame = 0; m_audioHandle = NULL; m_flameDamageLimit = getFlammableUpdateModuleData()->m_flameDamageLimitData; + m_flameSource = INVALID_ID; m_lastFlameDamageDealt = 0; setWakeFrame(getObject(), UPDATE_SLEEP_FOREVER); @@ -110,6 +111,11 @@ void FlammableUpdate::onDamage( DamageInfo *damageInfo ) m_flameDamageLimit = getFlammableUpdateModuleData()->m_flameDamageLimitData; } m_lastFlameDamageDealt = now; +#if RETAIL_COMPATIBLE_CRC + m_flameSource = getObject()->getID(); +#else + m_flameSource = damageInfo->in.m_sourceID; +#endif Object *me = getObject(); if( !me->getStatusBits().test( OBJECT_STATUS_AFLAME ) && !me->getStatusBits().test( OBJECT_STATUS_BURNED ) ) @@ -229,7 +235,7 @@ void FlammableUpdate::doAflameDamage() DamageInfo info; info.in.m_amount = data->m_aflameDamageAmount; - info.in.m_sourceID = getObject()->getID(); + info.in.m_sourceID = m_flameSource; info.in.m_damageType = DAMAGE_FLAME; info.in.m_deathType = DEATH_BURNED; @@ -287,7 +293,11 @@ void FlammableUpdate::xfer( Xfer *xfer ) { // version +#if RETAIL_COMPATIBLE_XFER_SAVE XferVersion currentVersion = 1; +#else + XferVersion currentVersion = 2; +#endif XferVersion version = currentVersion; xfer->xferVersion( &version, currentVersion ); @@ -312,6 +322,12 @@ void FlammableUpdate::xfer( Xfer *xfer ) // last flame damage dealt xfer->xferUnsignedInt( &m_lastFlameDamageDealt ); +#if !RETAIL_COMPATIBLE_XFER_SAVE + if (version >= 2) + { + xfer->xferObjectID(&m_flameSource); + } +#endif } // ------------------------------------------------------------------------------------------------ diff --git a/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/FlammableUpdate.h b/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/FlammableUpdate.h index 34e79ff4b5e..be73de96568 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/FlammableUpdate.h +++ b/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/FlammableUpdate.h @@ -111,6 +111,7 @@ class FlammableUpdate : public UpdateModule, public DamageModuleInterface UnsignedInt m_damageEndFrame; AudioHandle m_audioHandle; Real m_flameDamageLimit; + ObjectID m_flameSource; UnsignedInt m_lastFlameDamageDealt; }; diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/FlammableUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/FlammableUpdate.cpp index b2bc9ffd2db..8a037414fb8 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/FlammableUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/FlammableUpdate.cpp @@ -84,6 +84,7 @@ FlammableUpdate::FlammableUpdate( Thing *thing, const ModuleData* moduleData ) : m_damageEndFrame = 0; m_audioHandle = NULL; m_flameDamageLimit = getFlammableUpdateModuleData()->m_flameDamageLimitData; + m_flameSource = INVALID_ID; m_lastFlameDamageDealt = 0; setWakeFrame(getObject(), UPDATE_SLEEP_FOREVER); @@ -110,6 +111,11 @@ void FlammableUpdate::onDamage( DamageInfo *damageInfo ) m_flameDamageLimit = getFlammableUpdateModuleData()->m_flameDamageLimitData; } m_lastFlameDamageDealt = now; +#if RETAIL_COMPATIBLE_CRC + m_flameSource = getObject()->getID(); +#else + m_flameSource = damageInfo->in.m_sourceID; +#endif Object *me = getObject(); if( !me->getStatusBits().test( OBJECT_STATUS_AFLAME ) && !me->getStatusBits().test( OBJECT_STATUS_BURNED ) ) @@ -229,7 +235,7 @@ void FlammableUpdate::doAflameDamage() DamageInfo info; info.in.m_amount = data->m_aflameDamageAmount; - info.in.m_sourceID = getObject()->getID(); + info.in.m_sourceID = m_flameSource; info.in.m_damageType = DAMAGE_FLAME; info.in.m_deathType = DEATH_BURNED; @@ -287,7 +293,11 @@ void FlammableUpdate::xfer( Xfer *xfer ) { // version +#if RETAIL_COMPATIBLE_XFER_SAVE XferVersion currentVersion = 1; +#else + XferVersion currentVersion = 2; +#endif XferVersion version = currentVersion; xfer->xferVersion( &version, currentVersion ); @@ -312,6 +322,12 @@ void FlammableUpdate::xfer( Xfer *xfer ) // last flame damage dealt xfer->xferUnsignedInt( &m_lastFlameDamageDealt ); +#if !RETAIL_COMPATIBLE_XFER_SAVE + if (version >= 2) + { + xfer->xferObjectID(&m_flameSource); + } +#endif } // ------------------------------------------------------------------------------------------------ From 7f21fd6311788a71c3fa7dd804cb0bebbe438107 Mon Sep 17 00:00:00 2001 From: Stubbjax Date: Wed, 17 Sep 2025 22:53:02 +1000 Subject: [PATCH 2/2] docs: Add comments --- .../Source/GameLogic/Object/Update/FlammableUpdate.cpp | 1 + .../Source/GameLogic/Object/Update/FlammableUpdate.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/FlammableUpdate.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/FlammableUpdate.cpp index e4e0ab92cb5..07aca03a0fd 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/FlammableUpdate.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/FlammableUpdate.cpp @@ -114,6 +114,7 @@ void FlammableUpdate::onDamage( DamageInfo *damageInfo ) #if RETAIL_COMPATIBLE_CRC m_flameSource = getObject()->getID(); #else + // TheSuperHackers @bugfix Stubbjax 03/09/2025 Allow flame damage to award xp to the flame source. m_flameSource = damageInfo->in.m_sourceID; #endif diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/FlammableUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/FlammableUpdate.cpp index 8a037414fb8..14c7b4a7257 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/FlammableUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/FlammableUpdate.cpp @@ -114,6 +114,7 @@ void FlammableUpdate::onDamage( DamageInfo *damageInfo ) #if RETAIL_COMPATIBLE_CRC m_flameSource = getObject()->getID(); #else + // TheSuperHackers @bugfix Stubbjax 03/09/2025 Allow flame damage to award xp to the flame source. m_flameSource = damageInfo->in.m_sourceID; #endif