From 08253e1b71d21b714e7a2abf295453a48fc54094 Mon Sep 17 00:00:00 2001 From: xezon <4720891+xezon@users.noreply.github.com> Date: Mon, 7 Jul 2025 22:27:50 +0200 Subject: [PATCH 1/2] [ZH] Fix Hero Radar issues introduced by #1035 --- .../Code/GameEngine/Include/Common/Radar.h | 5 ++ .../GameEngine/Source/Common/System/Radar.cpp | 11 +++ .../Include/W3DDevice/Common/W3DRadar.h | 10 ++- .../W3DDevice/Common/System/W3DRadar.cpp | 74 ++++++++++++------- 4 files changed, 69 insertions(+), 31 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Include/Common/Radar.h b/GeneralsMD/Code/GameEngine/Include/Common/Radar.h index 6e4e4f21d3..718dfca82d 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/Radar.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/Radar.h @@ -226,6 +226,9 @@ class Radar : public Snapshot, virtual void xfer( Xfer *xfer ); virtual void loadPostProcess( void ); + virtual void onLocalRadarObjectAdded( const RadarObject* radarObject ) = 0; + virtual void onLocalRadarObjectRemoved( const RadarObject* radarObject ) = 0; + /// internal method for creating a radar event with specific colors void internalCreateEvent( const Coord3D *world, RadarEventType type, Real secondsToLive, const RGBAColorInt *color1, const RGBAColorInt *color2 ); @@ -300,6 +303,8 @@ class RadarDummy : public Radar virtual void draw(Int pixelX, Int pixelY, Int width, Int height) { } virtual void clearShroud() { } virtual void setShroudLevel(Int x, Int y, CellShroudStatus setting) { } + virtual void onLocalRadarObjectAdded(const RadarObject*) { } + virtual void onLocalRadarObjectRemoved(const RadarObject*) { } }; #endif // __RADAR_H_ diff --git a/GeneralsMD/Code/GameEngine/Source/Common/System/Radar.cpp b/GeneralsMD/Code/GameEngine/Source/Common/System/Radar.cpp index 025362552f..a6ba472fff 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/System/Radar.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/System/Radar.cpp @@ -71,6 +71,8 @@ void Radar::deleteListResources( void ) while( m_localObjectList ) { + onLocalRadarObjectRemoved( m_localObjectList ); + // get next object nextObject = m_localObjectList->friend_getNext(); @@ -542,6 +544,11 @@ bool Radar::addObject( Object *obj ) } // end else + if (list == &m_localObjectList) + { + onLocalRadarObjectAdded(newObj); + } + return true; } // end addObject @@ -558,6 +565,10 @@ Bool Radar::deleteFromList( Object *obj, RadarObject **list ) if( radarObject->friend_getObject() == obj ) { + if (list == &m_localObjectList) + { + onLocalRadarObjectRemoved( radarObject ); + } // unlink the object from list if( prevObject == NULL ) diff --git a/GeneralsMD/Code/GameEngineDevice/Include/W3DDevice/Common/W3DRadar.h b/GeneralsMD/Code/GameEngineDevice/Include/W3DDevice/Common/W3DRadar.h index f94c6fbaf6..7edd71e236 100644 --- a/GeneralsMD/Code/GameEngineDevice/Include/W3DDevice/Common/W3DRadar.h +++ b/GeneralsMD/Code/GameEngineDevice/Include/W3DDevice/Common/W3DRadar.h @@ -55,13 +55,12 @@ class W3DRadar : public Radar W3DRadar( void ); ~W3DRadar( void ); + virtual void xfer( Xfer *xfer ); + virtual void init( void ); ///< subsystem init virtual void update( void ); ///< subsystem update virtual void reset( void ); ///< subsystem reset - virtual bool addObject( Object *obj ); ///< add object to radar - virtual bool removeObject( Object *obj ); ///< remove object from radar - virtual void newMap( TerrainLogic *terrain ); ///< reset radar for new map void draw( Int pixelX, Int pixelY, Int width, Int height ); ///< draw the radar @@ -73,6 +72,11 @@ class W3DRadar : public Radar protected: + virtual void onLocalRadarObjectAdded( const RadarObject* radarObject ); + virtual void onLocalRadarObjectRemoved( const RadarObject* radarObject ); + + void rebuildCachedHeroObjectList(); + void drawSingleBeaconEvent( Int pixelX, Int pixelY, Int width, Int height, Int index ); void drawSingleGenericEvent( Int pixelX, Int pixelY, Int width, Int height, Int index ); diff --git a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/Common/System/W3DRadar.cpp b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/Common/System/W3DRadar.cpp index b3d8a659f6..a3d6565943 100644 --- a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/Common/System/W3DRadar.cpp +++ b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/Common/System/W3DRadar.cpp @@ -845,6 +845,18 @@ W3DRadar::~W3DRadar( void ) } // end ~W3DRadar +//------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------- +void W3DRadar::xfer( Xfer *xfer ) +{ + Radar::xfer(xfer); + + if (xfer->getXferMode() == XFER_LOAD) + { + rebuildCachedHeroObjectList(); + } +} + //------------------------------------------------------------------------------------------------- /** Radar initialization */ //------------------------------------------------------------------------------------------------- @@ -979,34 +991,6 @@ void W3DRadar::update( void ) } // end update -//------------------------------------------------------------------------------------------------- -bool W3DRadar::addObject( Object *obj ) -{ - if (Radar::addObject(obj)) - { - if (obj->isHero()) - { - m_cachedHeroObjectList.push_back(obj); - } - return true; - } - return false; -} - -//------------------------------------------------------------------------------------------------- -bool W3DRadar::removeObject( Object *obj ) -{ - if (Radar::removeObject(obj)) - { - if (obj->isHero()) - { - stl::find_and_erase_unordered(m_cachedHeroObjectList, obj); - } - return true; - } - return false; -} - //------------------------------------------------------------------------------------------------- /** Reset the radar for the new map data being given to it */ //------------------------------------------------------------------------------------------------- @@ -1466,7 +1450,41 @@ void W3DRadar::refreshTerrain( TerrainLogic *terrain ) } // end refreshTerrain +//------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------- +void W3DRadar::onLocalRadarObjectAdded( const RadarObject* radarObject ) +{ + const Object* obj = radarObject->friend_getObject(); + if (obj->isHero()) + { + m_cachedHeroObjectList.push_back(obj); + } +} + +//------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------- +void W3DRadar::onLocalRadarObjectRemoved( const RadarObject* radarObject ) +{ + const Object* obj = radarObject->friend_getObject(); + if (obj->isHero()) + { + stl::find_and_erase_unordered(m_cachedHeroObjectList, obj); + } +} + +//------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------- +void W3DRadar::rebuildCachedHeroObjectList() +{ + m_cachedHeroObjectList.clear(); + const RadarObject* radarObject = getLocalObjectList(); + while (radarObject != NULL) + { + onLocalRadarObjectAdded(radarObject); + radarObject = radarObject->friend_getNext(); + } +} From adb0242afdcc05c0ecc74ee93c96d4242ff2d230 Mon Sep 17 00:00:00 2001 From: xezon <4720891+xezon@users.noreply.github.com> Date: Tue, 8 Jul 2025 17:55:28 +0200 Subject: [PATCH 2/2] Replicate in Generals --- .../Code/GameEngine/Include/Common/Radar.h | 5 ++ .../GameEngine/Source/Common/System/Radar.cpp | 11 +++ .../Include/W3DDevice/Common/W3DRadar.h | 10 ++- .../W3DDevice/Common/System/W3DRadar.cpp | 74 ++++++++++++------- 4 files changed, 69 insertions(+), 31 deletions(-) diff --git a/Generals/Code/GameEngine/Include/Common/Radar.h b/Generals/Code/GameEngine/Include/Common/Radar.h index d5ec171e08..7ce1ca6f55 100644 --- a/Generals/Code/GameEngine/Include/Common/Radar.h +++ b/Generals/Code/GameEngine/Include/Common/Radar.h @@ -226,6 +226,9 @@ class Radar : public Snapshot, virtual void xfer( Xfer *xfer ); virtual void loadPostProcess( void ); + virtual void onLocalRadarObjectAdded( const RadarObject* radarObject ) = 0; + virtual void onLocalRadarObjectRemoved( const RadarObject* radarObject ) = 0; + /// internal method for creating a radar event with specific colors void internalCreateEvent( const Coord3D *world, RadarEventType type, Real secondsToLive, const RGBAColorInt *color1, const RGBAColorInt *color2 ); @@ -298,6 +301,8 @@ class RadarDummy : public Radar virtual void draw(Int pixelX, Int pixelY, Int width, Int height) { } virtual void clearShroud() { } virtual void setShroudLevel(Int x, Int y, CellShroudStatus setting) { } + virtual void onLocalRadarObjectAdded(const RadarObject*) { } + virtual void onLocalRadarObjectRemoved(const RadarObject*) { } }; #endif // __RADAR_H_ diff --git a/Generals/Code/GameEngine/Source/Common/System/Radar.cpp b/Generals/Code/GameEngine/Source/Common/System/Radar.cpp index 52d040cc63..b4bca94247 100644 --- a/Generals/Code/GameEngine/Source/Common/System/Radar.cpp +++ b/Generals/Code/GameEngine/Source/Common/System/Radar.cpp @@ -71,6 +71,8 @@ void Radar::deleteListResources( void ) while( m_localObjectList ) { + onLocalRadarObjectRemoved( m_localObjectList ); + // get next object nextObject = m_localObjectList->friend_getNext(); @@ -539,6 +541,11 @@ bool Radar::addObject( Object *obj ) } // end else + if (list == &m_localObjectList) + { + onLocalRadarObjectAdded(newObj); + } + return true; } // end addObject @@ -555,6 +562,10 @@ Bool Radar::deleteFromList( Object *obj, RadarObject **list ) if( radarObject->friend_getObject() == obj ) { + if (list == &m_localObjectList) + { + onLocalRadarObjectRemoved( radarObject ); + } // unlink the object from list if( prevObject == NULL ) diff --git a/Generals/Code/GameEngineDevice/Include/W3DDevice/Common/W3DRadar.h b/Generals/Code/GameEngineDevice/Include/W3DDevice/Common/W3DRadar.h index 500ddd65b0..0a26c857e1 100644 --- a/Generals/Code/GameEngineDevice/Include/W3DDevice/Common/W3DRadar.h +++ b/Generals/Code/GameEngineDevice/Include/W3DDevice/Common/W3DRadar.h @@ -55,13 +55,12 @@ class W3DRadar : public Radar W3DRadar( void ); ~W3DRadar( void ); + virtual void xfer( Xfer *xfer ); + virtual void init( void ); ///< subsystem init virtual void update( void ); ///< subsystem update virtual void reset( void ); ///< subsystem reset - virtual bool addObject( Object *obj ); ///< add object to radar - virtual bool removeObject( Object *obj ); ///< remove object from radar - virtual void newMap( TerrainLogic *terrain ); ///< reset radar for new map void draw( Int pixelX, Int pixelY, Int width, Int height ); ///< draw the radar @@ -73,6 +72,11 @@ class W3DRadar : public Radar protected: + virtual void onLocalRadarObjectAdded( const RadarObject* radarObject ); + virtual void onLocalRadarObjectRemoved( const RadarObject* radarObject ); + + void rebuildCachedHeroObjectList(); + void drawSingleBeaconEvent( Int pixelX, Int pixelY, Int width, Int height, Int index ); void drawSingleGenericEvent( Int pixelX, Int pixelY, Int width, Int height, Int index ); diff --git a/Generals/Code/GameEngineDevice/Source/W3DDevice/Common/System/W3DRadar.cpp b/Generals/Code/GameEngineDevice/Source/W3DDevice/Common/System/W3DRadar.cpp index 3dbdb1989e..ef533d0ff3 100644 --- a/Generals/Code/GameEngineDevice/Source/W3DDevice/Common/System/W3DRadar.cpp +++ b/Generals/Code/GameEngineDevice/Source/W3DDevice/Common/System/W3DRadar.cpp @@ -851,6 +851,18 @@ W3DRadar::~W3DRadar( void ) } // end ~W3DRadar +//------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------- +void W3DRadar::xfer( Xfer *xfer ) +{ + Radar::xfer(xfer); + + if (xfer->getXferMode() == XFER_LOAD) + { + rebuildCachedHeroObjectList(); + } +} + //------------------------------------------------------------------------------------------------- /** Radar initialization */ //------------------------------------------------------------------------------------------------- @@ -985,34 +997,6 @@ void W3DRadar::update( void ) } // end update -//------------------------------------------------------------------------------------------------- -bool W3DRadar::addObject( Object *obj ) -{ - if (Radar::addObject(obj)) - { - if (obj->isHero()) - { - m_cachedHeroObjectList.push_back(obj); - } - return true; - } - return false; -} - -//------------------------------------------------------------------------------------------------- -bool W3DRadar::removeObject( Object *obj ) -{ - if (Radar::removeObject(obj)) - { - if (obj->isHero()) - { - stl::find_and_erase_unordered(m_cachedHeroObjectList, obj); - } - return true; - } - return false; -} - //------------------------------------------------------------------------------------------------- /** Reset the radar for the new map data being given to it */ //------------------------------------------------------------------------------------------------- @@ -1478,7 +1462,41 @@ void W3DRadar::refreshTerrain( TerrainLogic *terrain ) } // end refreshTerrain +//------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------- +void W3DRadar::onLocalRadarObjectAdded( const RadarObject* radarObject ) +{ + const Object* obj = radarObject->friend_getObject(); + if (obj->isHero()) + { + m_cachedHeroObjectList.push_back(obj); + } +} + +//------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------- +void W3DRadar::onLocalRadarObjectRemoved( const RadarObject* radarObject ) +{ + const Object* obj = radarObject->friend_getObject(); + if (obj->isHero()) + { + stl::find_and_erase_unordered(m_cachedHeroObjectList, obj); + } +} + +//------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------- +void W3DRadar::rebuildCachedHeroObjectList() +{ + m_cachedHeroObjectList.clear(); + const RadarObject* radarObject = getLocalObjectList(); + while (radarObject != NULL) + { + onLocalRadarObjectAdded(radarObject); + radarObject = radarObject->friend_getNext(); + } +}