From 75eda009792219a5977d35253992b17cf1ec88bc Mon Sep 17 00:00:00 2001 From: xezon <4720891+xezon@users.noreply.github.com> Date: Wed, 4 Jun 2025 19:45:58 +0200 Subject: [PATCH 1/2] [ZH] Minor refactors in OpenContain, TunnelContain --- .../GameLogic/Object/Contain/OpenContain.cpp | 30 +++++++------------ .../Object/Contain/TunnelContain.cpp | 20 +++++-------- 2 files changed, 19 insertions(+), 31 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/OpenContain.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/OpenContain.cpp index 3bfdce295d5..f622f51718b 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/OpenContain.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/OpenContain.cpp @@ -440,33 +440,25 @@ void OpenContain::killAllContained( void ) // to the host container, which then attempts to remove all remaining occupants // on the death of the host container. This is reproducible by shooting with // Neutron Shells on a GLA Technical containing GLA Terrorists. + ContainedItemsList list; list.swap(m_containList); m_containListSize = 0; ContainedItemsList::iterator it = list.begin(); - while ( it != list.end() ) + while ( it != list.end() ) { - Object *rider = *it; - - DEBUG_ASSERTCRASH( rider, ("Contain list must not contain NULL element")); - if ( rider ) - { - it = list.erase(it); - - onRemoving( rider ); - rider->onRemovedFrom( getObject() ); - rider->kill(); - - } - else - ++it; + Object *rider = *it++; - } // end while - - - DEBUG_ASSERTCRASH( m_containListSize == 0, ("killallcontain just made a booboo, list size != zero.") ); + DEBUG_ASSERTCRASH( rider, ("Contain list must not contain NULL element")); + if ( rider ) + { + onRemoving( rider ); + rider->onRemovedFrom( getObject() ); + rider->kill(); + } + } } // end killAllContained diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/TunnelContain.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/TunnelContain.cpp index f5f73efbf49..b220975dd05 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/TunnelContain.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/TunnelContain.cpp @@ -102,11 +102,6 @@ void TunnelContain::removeFromContain( Object *obj, Bool exposeStealthUnits ) if( owningPlayer == NULL ) return; //game tear down. We do the onRemove* stuff first because this is allowed to fail but that still needs to be done - if( ! owningPlayer->getTunnelSystem()->isInContainer( obj ) ) - { - return; - } - owningPlayer->getTunnelSystem()->removeFromContain( obj, exposeStealthUnits ); } @@ -177,16 +172,17 @@ void TunnelContain::killAllContained( void ) //------------------------------------------------------------------------------------------------- void TunnelContain::removeAllContained( Bool exposeStealthUnits ) { + ContainedItemsList list; Player *owningPlayer = getObject()->getControllingPlayer(); - const ContainedItemsList *fullList = owningPlayer->getTunnelSystem()->getContainedItemsList(); + owningPlayer->getTunnelSystem()->swapContainedItemsList(list); - Object *obj; - ContainedItemsList::const_iterator it; - it = (*fullList).begin(); - while( it != (*fullList).end() ) + ContainedItemsList::iterator it = list.begin(); + + while ( it != list.end() ) { - obj = *it; - it++; + Object *obj = *it++; + DEBUG_ASSERTCRASH( obj, ("Contain list must not contain NULL element")); + removeFromContain( obj, exposeStealthUnits ); } } From 406cb1285e4002ec21b596568b9e62df96cc0db5 Mon Sep 17 00:00:00 2001 From: xezon <4720891+xezon@users.noreply.github.com> Date: Wed, 4 Jun 2025 19:48:25 +0200 Subject: [PATCH 2/2] [GEN] Minor refactors in TunnelContain --- .../GameEngine/Include/Common/TunnelTracker.h | 1 + .../Source/Common/RTS/TunnelTracker.cpp | 7 +++++++ .../Object/Contain/TunnelContain.cpp | 20 ++++++++----------- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/Generals/Code/GameEngine/Include/Common/TunnelTracker.h b/Generals/Code/GameEngine/Include/Common/TunnelTracker.h index 5f708c5a860..9b0a65419ef 100644 --- a/Generals/Code/GameEngine/Include/Common/TunnelTracker.h +++ b/Generals/Code/GameEngine/Include/Common/TunnelTracker.h @@ -49,6 +49,7 @@ class TunnelTracker : public MemoryPoolObject, UnsignedInt getContainCount() const { return m_containListSize; } Int getContainMax() const; const ContainedItemsList* getContainedItemsList() const { return &m_containList; } + void swapContainedItemsList(ContainedItemsList& newList); Bool isValidContainerFor(const Object* obj, Bool checkCapacity) const; void addToContainList( Object *obj ); ///< add 'obj' to contain list diff --git a/Generals/Code/GameEngine/Source/Common/RTS/TunnelTracker.cpp b/Generals/Code/GameEngine/Source/Common/RTS/TunnelTracker.cpp index add19b3a7cf..c49dde9a72e 100644 --- a/Generals/Code/GameEngine/Source/Common/RTS/TunnelTracker.cpp +++ b/Generals/Code/GameEngine/Source/Common/RTS/TunnelTracker.cpp @@ -107,6 +107,13 @@ Int TunnelTracker::getContainMax() const return TheGlobalData->m_maxTunnelCapacity; } +// ------------------------------------------------------------------------ +void TunnelTracker::swapContainedItemsList(ContainedItemsList& newList) +{ + m_containList.swap(newList); + m_containListSize = (Int)m_containList.size(); +} + // ------------------------------------------------------------------------ void TunnelTracker::updateNemesis(const Object *target) { diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Contain/TunnelContain.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Contain/TunnelContain.cpp index c9ec85f6ec3..a0deeb7d770 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Contain/TunnelContain.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Contain/TunnelContain.cpp @@ -102,11 +102,6 @@ void TunnelContain::removeFromContain( Object *obj, Bool exposeStealthUnits ) if( owningPlayer == NULL ) return; //game tear down. We do the onRemove* stuff first because this is allowed to fail but that still needs to be done - if( ! owningPlayer->getTunnelSystem()->isInContainer( obj ) ) - { - return; - } - owningPlayer->getTunnelSystem()->removeFromContain( obj, exposeStealthUnits ); } @@ -116,16 +111,17 @@ void TunnelContain::removeFromContain( Object *obj, Bool exposeStealthUnits ) //------------------------------------------------------------------------------------------------- void TunnelContain::removeAllContained( Bool exposeStealthUnits ) { + ContainedItemsList list; Player *owningPlayer = getObject()->getControllingPlayer(); - const ContainedItemsList *fullList = owningPlayer->getTunnelSystem()->getContainedItemsList(); + owningPlayer->getTunnelSystem()->swapContainedItemsList(list); + + ContainedItemsList::iterator it = list.begin(); - Object *obj; - ContainedItemsList::const_iterator it; - it = (*fullList).begin(); - while( it != (*fullList).end() ) + while ( it != list.end() ) { - obj = *it; - it++; + Object *obj = *it++; + DEBUG_ASSERTCRASH( obj, ("Contain list must not contain NULL element")); + removeFromContain( obj, exposeStealthUnits ); } }