diff --git a/Generals/Code/GameEngine/Include/GameLogic/Object.h b/Generals/Code/GameEngine/Include/GameLogic/Object.h index 49617d3fc0..827f06056b 100644 --- a/Generals/Code/GameEngine/Include/GameLogic/Object.h +++ b/Generals/Code/GameEngine/Include/GameLogic/Object.h @@ -213,6 +213,7 @@ class Object : public Thing, public Snapshot void scoreTheKill( const Object *victim ); ///< I just killed this object. void onVeterancyLevelChanged( VeterancyLevel oldLevel, VeterancyLevel newLevel, Bool provideFeedback = TRUE ); ///< I just achieved this level right this moment + void createVeterancyLevelFX(VeterancyLevel oldLevel, VeterancyLevel newLevel); ExperienceTracker* getExperienceTracker() {return m_experienceTracker;} const ExperienceTracker* getExperienceTracker() const {return m_experienceTracker;} VeterancyLevel getVeterancyLevel() const; diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Object.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Object.cpp index d0f4b52301..86c96bf980 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Object.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Object.cpp @@ -2789,6 +2789,12 @@ Bool Object::hasSpecialPower( SpecialPowerType type ) const //------------------------------------------------------------------------------------------------- void Object::onVeterancyLevelChanged( VeterancyLevel oldLevel, VeterancyLevel newLevel, Bool provideFeedback ) { +#if !RETAIL_COMPATIBLE_CRC + // TheSuperHackers @bugfix Stubbjax 10/12/2025 Do not play veterancy animations for dead units. + if (isEffectivelyDead()) + return; +#endif + updateUpgradeModules(); const UpgradeTemplate* up = TheUpgradeCenter->findVeterancyUpgrade(newLevel); @@ -2843,7 +2849,18 @@ void Object::onVeterancyLevelChanged( VeterancyLevel oldLevel, VeterancyLevel ne && outerDrawable && outerDrawable->isVisible(); - if( doAnimation && TheGameLogic->getDrawIconUI() ) + if (doAnimation) + createVeterancyLevelFX(oldLevel, newLevel); +} + +void Object::createVeterancyLevelFX(VeterancyLevel oldLevel, VeterancyLevel newLevel) +{ +#if RETAIL_COMPATIBLE_CRC + if (isEffectivelyDead()) + return; +#endif + + if (TheGameLogic->getDrawIconUI()) { if( TheAnim2DCollection && TheGlobalData->m_levelGainAnimationName.isEmpty() == FALSE ) { @@ -2863,7 +2880,6 @@ void Object::onVeterancyLevelChanged( VeterancyLevel oldLevel, VeterancyLevel ne soundToPlay.setObjectID( getID() ); TheAudio->addAudioEvent( &soundToPlay ); } - } //------------------------------------------------------------------------------------------------- diff --git a/GeneralsMD/Code/GameEngine/Include/GameLogic/Object.h b/GeneralsMD/Code/GameEngine/Include/GameLogic/Object.h index a2f51fe28b..4bd50049b5 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameLogic/Object.h +++ b/GeneralsMD/Code/GameEngine/Include/GameLogic/Object.h @@ -229,6 +229,7 @@ class Object : public Thing, public Snapshot void scoreTheKill( const Object *victim ); ///< I just killed this object. void onVeterancyLevelChanged( VeterancyLevel oldLevel, VeterancyLevel newLevel, Bool provideFeedback = TRUE ); ///< I just achieved this level right this moment + void createVeterancyLevelFX(VeterancyLevel oldLevel, VeterancyLevel newLevel); ExperienceTracker* getExperienceTracker() {return m_experienceTracker;} const ExperienceTracker* getExperienceTracker() const {return m_experienceTracker;} VeterancyLevel getVeterancyLevel() const; diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Object.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Object.cpp index 598e266bea..b9644c0fe3 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Object.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Object.cpp @@ -3104,6 +3104,12 @@ Bool Object::hasAnySpecialPower() const //------------------------------------------------------------------------------------------------- void Object::onVeterancyLevelChanged( VeterancyLevel oldLevel, VeterancyLevel newLevel, Bool provideFeedback ) { +#if !RETAIL_COMPATIBLE_CRC + // TheSuperHackers @bugfix Stubbjax 10/12/2025 Do not play veterancy animations for dead units. + if (isEffectivelyDead()) + return; +#endif + updateUpgradeModules(); const UpgradeTemplate* up = TheUpgradeCenter->findVeterancyUpgrade(newLevel); @@ -3158,7 +3164,18 @@ void Object::onVeterancyLevelChanged( VeterancyLevel oldLevel, VeterancyLevel ne && outerDrawable && outerDrawable->isVisible(); - if( doAnimation && TheGameLogic->getDrawIconUI() ) + if (doAnimation) + createVeterancyLevelFX(oldLevel, newLevel); +} + +void Object::createVeterancyLevelFX(VeterancyLevel oldLevel, VeterancyLevel newLevel) +{ +#if RETAIL_COMPATIBLE_CRC + if (isEffectivelyDead()) + return; +#endif + + if (TheGameLogic->getDrawIconUI()) { if( TheAnim2DCollection && TheGlobalData->m_levelGainAnimationName.isEmpty() == FALSE ) { @@ -3178,7 +3195,6 @@ void Object::onVeterancyLevelChanged( VeterancyLevel oldLevel, VeterancyLevel ne soundToPlay.setObjectID( getID() ); TheAudio->addAudioEvent( &soundToPlay ); } - } //-------------------------------------------------------------------------------------------------