From 71706fb0c729585ea68dc16f0a38b2de9f1d09f7 Mon Sep 17 00:00:00 2001 From: tintinhamans <5984296+tintinhamans@users.noreply.github.com> Date: Sun, 13 Sep 2026 06:44:14 +0200 Subject: [PATCH] bugfix(contain): Route Helix attachment experience --- .../Source/GameLogic/Object/Contain/HelixContain.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/HelixContain.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/HelixContain.cpp index c6da15c17c5..55be272b728 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/HelixContain.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/HelixContain.cpp @@ -39,6 +39,7 @@ #include "Common/ThingFactory.h" #include "GameClient/ControlBar.h" #include "GameClient/Drawable.h" +#include "GameLogic/ExperienceTracker.h" #include "GameLogic/Module/BodyModule.h" #include "GameLogic/Module/HelixContain.h" #include "GameLogic/Object.h" @@ -272,6 +273,12 @@ void HelixContain::addToContain( Object *obj ) m_portableStructureID = obj->getID(); obj->friend_setContainedBy( getObject() );//fool portable into thinking my object is his container +#if !RETAIL_COMPATIBLE_CRC + // Portable structures bypass onContaining(), so route their kill XP here. + if ( obj->getExperienceTracker() ) + obj->getExperienceTracker()->setExperienceSink( getObject()->getID() ); +#endif + DEBUG_ASSERTCRASH(getObject() == nullptr || !getObject()->isDestroyed(), ("HelixContain::addToContain - Adding to a destroyed container")); } @@ -401,7 +408,6 @@ void HelixContain::onContaining( Object *obj, Bool wasSelected ) obj->setWeaponBonusCondition( WEAPONBONUSCONDITION_GARRISONED ); obj->setDisabled( DISABLED_HELD ); - if ( obj->isKindOf( KINDOF_PORTABLE_STRUCTURE ) && getObject()->testStatus( OBJECT_STATUS_STEALTHED ) ) { StealthUpdate *myStealth = obj->getStealth();