Skip to content

Commit 25ea18c

Browse files
authored
[GEN][ZH] Fix Hero Radar issues introduced by #1035 (#1240)
Enemy and friendly Hero units no longer show on Radar and no longer crash the game on save/load
1 parent 26bc2ca commit 25ea18c

File tree

8 files changed

+138
-62
lines changed

8 files changed

+138
-62
lines changed

Generals/Code/GameEngine/Include/Common/Radar.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,9 @@ class Radar : public Snapshot,
226226
virtual void xfer( Xfer *xfer );
227227
virtual void loadPostProcess( void );
228228

229+
virtual void onLocalRadarObjectAdded( const RadarObject* radarObject ) = 0;
230+
virtual void onLocalRadarObjectRemoved( const RadarObject* radarObject ) = 0;
231+
229232
/// internal method for creating a radar event with specific colors
230233
void internalCreateEvent( const Coord3D *world, RadarEventType type, Real secondsToLive,
231234
const RGBAColorInt *color1, const RGBAColorInt *color2 );
@@ -298,6 +301,8 @@ class RadarDummy : public Radar
298301
virtual void draw(Int pixelX, Int pixelY, Int width, Int height) { }
299302
virtual void clearShroud() { }
300303
virtual void setShroudLevel(Int x, Int y, CellShroudStatus setting) { }
304+
virtual void onLocalRadarObjectAdded(const RadarObject*) { }
305+
virtual void onLocalRadarObjectRemoved(const RadarObject*) { }
301306
};
302307

303308
#endif // __RADAR_H_

Generals/Code/GameEngine/Source/Common/System/Radar.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ void Radar::deleteListResources( void )
7171
while( m_localObjectList )
7272
{
7373

74+
onLocalRadarObjectRemoved( m_localObjectList );
75+
7476
// get next object
7577
nextObject = m_localObjectList->friend_getNext();
7678

@@ -539,6 +541,11 @@ bool Radar::addObject( Object *obj )
539541

540542
} // end else
541543

544+
if (list == &m_localObjectList)
545+
{
546+
onLocalRadarObjectAdded(newObj);
547+
}
548+
542549
return true;
543550
} // end addObject
544551

@@ -555,6 +562,10 @@ Bool Radar::deleteFromList( Object *obj, RadarObject **list )
555562

556563
if( radarObject->friend_getObject() == obj )
557564
{
565+
if (list == &m_localObjectList)
566+
{
567+
onLocalRadarObjectRemoved( radarObject );
568+
}
558569

559570
// unlink the object from list
560571
if( prevObject == NULL )

Generals/Code/GameEngineDevice/Include/W3DDevice/Common/W3DRadar.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,12 @@ class W3DRadar : public Radar
5555
W3DRadar( void );
5656
~W3DRadar( void );
5757

58+
virtual void xfer( Xfer *xfer );
59+
5860
virtual void init( void ); ///< subsystem init
5961
virtual void update( void ); ///< subsystem update
6062
virtual void reset( void ); ///< subsystem reset
6163

62-
virtual bool addObject( Object *obj ); ///< add object to radar
63-
virtual bool removeObject( Object *obj ); ///< remove object from radar
64-
6564
virtual void newMap( TerrainLogic *terrain ); ///< reset radar for new map
6665

6766
void draw( Int pixelX, Int pixelY, Int width, Int height ); ///< draw the radar
@@ -73,6 +72,11 @@ class W3DRadar : public Radar
7372

7473
protected:
7574

75+
virtual void onLocalRadarObjectAdded( const RadarObject* radarObject );
76+
virtual void onLocalRadarObjectRemoved( const RadarObject* radarObject );
77+
78+
void rebuildCachedHeroObjectList();
79+
7680
void drawSingleBeaconEvent( Int pixelX, Int pixelY, Int width, Int height, Int index );
7781
void drawSingleGenericEvent( Int pixelX, Int pixelY, Int width, Int height, Int index );
7882

Generals/Code/GameEngineDevice/Source/W3DDevice/Common/System/W3DRadar.cpp

Lines changed: 46 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -851,6 +851,18 @@ W3DRadar::~W3DRadar( void )
851851

852852
} // end ~W3DRadar
853853

854+
//-------------------------------------------------------------------------------------------------
855+
//-------------------------------------------------------------------------------------------------
856+
void W3DRadar::xfer( Xfer *xfer )
857+
{
858+
Radar::xfer(xfer);
859+
860+
if (xfer->getXferMode() == XFER_LOAD)
861+
{
862+
rebuildCachedHeroObjectList();
863+
}
864+
}
865+
854866
//-------------------------------------------------------------------------------------------------
855867
/** Radar initialization */
856868
//-------------------------------------------------------------------------------------------------
@@ -985,34 +997,6 @@ void W3DRadar::update( void )
985997

986998
} // end update
987999

988-
//-------------------------------------------------------------------------------------------------
989-
bool W3DRadar::addObject( Object *obj )
990-
{
991-
if (Radar::addObject(obj))
992-
{
993-
if (obj->isHero())
994-
{
995-
m_cachedHeroObjectList.push_back(obj);
996-
}
997-
return true;
998-
}
999-
return false;
1000-
}
1001-
1002-
//-------------------------------------------------------------------------------------------------
1003-
bool W3DRadar::removeObject( Object *obj )
1004-
{
1005-
if (Radar::removeObject(obj))
1006-
{
1007-
if (obj->isHero())
1008-
{
1009-
stl::find_and_erase_unordered(m_cachedHeroObjectList, obj);
1010-
}
1011-
return true;
1012-
}
1013-
return false;
1014-
}
1015-
10161000
//-------------------------------------------------------------------------------------------------
10171001
/** Reset the radar for the new map data being given to it */
10181002
//-------------------------------------------------------------------------------------------------
@@ -1478,7 +1462,41 @@ void W3DRadar::refreshTerrain( TerrainLogic *terrain )
14781462

14791463
} // end refreshTerrain
14801464

1465+
//-------------------------------------------------------------------------------------------------
1466+
//-------------------------------------------------------------------------------------------------
1467+
void W3DRadar::onLocalRadarObjectAdded( const RadarObject* radarObject )
1468+
{
1469+
const Object* obj = radarObject->friend_getObject();
1470+
if (obj->isHero())
1471+
{
1472+
m_cachedHeroObjectList.push_back(obj);
1473+
}
1474+
}
1475+
1476+
//-------------------------------------------------------------------------------------------------
1477+
//-------------------------------------------------------------------------------------------------
1478+
void W3DRadar::onLocalRadarObjectRemoved( const RadarObject* radarObject )
1479+
{
1480+
const Object* obj = radarObject->friend_getObject();
1481+
if (obj->isHero())
1482+
{
1483+
stl::find_and_erase_unordered(m_cachedHeroObjectList, obj);
1484+
}
1485+
}
1486+
1487+
//-------------------------------------------------------------------------------------------------
1488+
//-------------------------------------------------------------------------------------------------
1489+
void W3DRadar::rebuildCachedHeroObjectList()
1490+
{
1491+
m_cachedHeroObjectList.clear();
1492+
const RadarObject* radarObject = getLocalObjectList();
14811493

1494+
while (radarObject != NULL)
1495+
{
1496+
onLocalRadarObjectAdded(radarObject);
1497+
radarObject = radarObject->friend_getNext();
1498+
}
1499+
}
14821500

14831501

14841502

GeneralsMD/Code/GameEngine/Include/Common/Radar.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,9 @@ class Radar : public Snapshot,
226226
virtual void xfer( Xfer *xfer );
227227
virtual void loadPostProcess( void );
228228

229+
virtual void onLocalRadarObjectAdded( const RadarObject* radarObject ) = 0;
230+
virtual void onLocalRadarObjectRemoved( const RadarObject* radarObject ) = 0;
231+
229232
/// internal method for creating a radar event with specific colors
230233
void internalCreateEvent( const Coord3D *world, RadarEventType type, Real secondsToLive,
231234
const RGBAColorInt *color1, const RGBAColorInt *color2 );
@@ -300,6 +303,8 @@ class RadarDummy : public Radar
300303
virtual void draw(Int pixelX, Int pixelY, Int width, Int height) { }
301304
virtual void clearShroud() { }
302305
virtual void setShroudLevel(Int x, Int y, CellShroudStatus setting) { }
306+
virtual void onLocalRadarObjectAdded(const RadarObject*) { }
307+
virtual void onLocalRadarObjectRemoved(const RadarObject*) { }
303308
};
304309

305310
#endif // __RADAR_H_

GeneralsMD/Code/GameEngine/Source/Common/System/Radar.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ void Radar::deleteListResources( void )
7171
while( m_localObjectList )
7272
{
7373

74+
onLocalRadarObjectRemoved( m_localObjectList );
75+
7476
// get next object
7577
nextObject = m_localObjectList->friend_getNext();
7678

@@ -542,6 +544,11 @@ bool Radar::addObject( Object *obj )
542544

543545
} // end else
544546

547+
if (list == &m_localObjectList)
548+
{
549+
onLocalRadarObjectAdded(newObj);
550+
}
551+
545552
return true;
546553
} // end addObject
547554

@@ -558,6 +565,10 @@ Bool Radar::deleteFromList( Object *obj, RadarObject **list )
558565

559566
if( radarObject->friend_getObject() == obj )
560567
{
568+
if (list == &m_localObjectList)
569+
{
570+
onLocalRadarObjectRemoved( radarObject );
571+
}
561572

562573
// unlink the object from list
563574
if( prevObject == NULL )

GeneralsMD/Code/GameEngineDevice/Include/W3DDevice/Common/W3DRadar.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,12 @@ class W3DRadar : public Radar
5555
W3DRadar( void );
5656
~W3DRadar( void );
5757

58+
virtual void xfer( Xfer *xfer );
59+
5860
virtual void init( void ); ///< subsystem init
5961
virtual void update( void ); ///< subsystem update
6062
virtual void reset( void ); ///< subsystem reset
6163

62-
virtual bool addObject( Object *obj ); ///< add object to radar
63-
virtual bool removeObject( Object *obj ); ///< remove object from radar
64-
6564
virtual void newMap( TerrainLogic *terrain ); ///< reset radar for new map
6665

6766
void draw( Int pixelX, Int pixelY, Int width, Int height ); ///< draw the radar
@@ -73,6 +72,11 @@ class W3DRadar : public Radar
7372

7473
protected:
7574

75+
virtual void onLocalRadarObjectAdded( const RadarObject* radarObject );
76+
virtual void onLocalRadarObjectRemoved( const RadarObject* radarObject );
77+
78+
void rebuildCachedHeroObjectList();
79+
7680
void drawSingleBeaconEvent( Int pixelX, Int pixelY, Int width, Int height, Int index );
7781
void drawSingleGenericEvent( Int pixelX, Int pixelY, Int width, Int height, Int index );
7882

GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/Common/System/W3DRadar.cpp

Lines changed: 46 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -845,6 +845,18 @@ W3DRadar::~W3DRadar( void )
845845

846846
} // end ~W3DRadar
847847

848+
//-------------------------------------------------------------------------------------------------
849+
//-------------------------------------------------------------------------------------------------
850+
void W3DRadar::xfer( Xfer *xfer )
851+
{
852+
Radar::xfer(xfer);
853+
854+
if (xfer->getXferMode() == XFER_LOAD)
855+
{
856+
rebuildCachedHeroObjectList();
857+
}
858+
}
859+
848860
//-------------------------------------------------------------------------------------------------
849861
/** Radar initialization */
850862
//-------------------------------------------------------------------------------------------------
@@ -979,34 +991,6 @@ void W3DRadar::update( void )
979991

980992
} // end update
981993

982-
//-------------------------------------------------------------------------------------------------
983-
bool W3DRadar::addObject( Object *obj )
984-
{
985-
if (Radar::addObject(obj))
986-
{
987-
if (obj->isHero())
988-
{
989-
m_cachedHeroObjectList.push_back(obj);
990-
}
991-
return true;
992-
}
993-
return false;
994-
}
995-
996-
//-------------------------------------------------------------------------------------------------
997-
bool W3DRadar::removeObject( Object *obj )
998-
{
999-
if (Radar::removeObject(obj))
1000-
{
1001-
if (obj->isHero())
1002-
{
1003-
stl::find_and_erase_unordered(m_cachedHeroObjectList, obj);
1004-
}
1005-
return true;
1006-
}
1007-
return false;
1008-
}
1009-
1010994
//-------------------------------------------------------------------------------------------------
1011995
/** Reset the radar for the new map data being given to it */
1012996
//-------------------------------------------------------------------------------------------------
@@ -1466,7 +1450,41 @@ void W3DRadar::refreshTerrain( TerrainLogic *terrain )
14661450

14671451
} // end refreshTerrain
14681452

1453+
//-------------------------------------------------------------------------------------------------
1454+
//-------------------------------------------------------------------------------------------------
1455+
void W3DRadar::onLocalRadarObjectAdded( const RadarObject* radarObject )
1456+
{
1457+
const Object* obj = radarObject->friend_getObject();
1458+
if (obj->isHero())
1459+
{
1460+
m_cachedHeroObjectList.push_back(obj);
1461+
}
1462+
}
1463+
1464+
//-------------------------------------------------------------------------------------------------
1465+
//-------------------------------------------------------------------------------------------------
1466+
void W3DRadar::onLocalRadarObjectRemoved( const RadarObject* radarObject )
1467+
{
1468+
const Object* obj = radarObject->friend_getObject();
1469+
if (obj->isHero())
1470+
{
1471+
stl::find_and_erase_unordered(m_cachedHeroObjectList, obj);
1472+
}
1473+
}
1474+
1475+
//-------------------------------------------------------------------------------------------------
1476+
//-------------------------------------------------------------------------------------------------
1477+
void W3DRadar::rebuildCachedHeroObjectList()
1478+
{
1479+
m_cachedHeroObjectList.clear();
1480+
const RadarObject* radarObject = getLocalObjectList();
14691481

1482+
while (radarObject != NULL)
1483+
{
1484+
onLocalRadarObjectAdded(radarObject);
1485+
radarObject = radarObject->friend_getNext();
1486+
}
1487+
}
14701488

14711489

14721490

0 commit comments

Comments
 (0)