Skip to content

[GEN][ZH] Fix Hero Radar issues introduced by #1035 #1240

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jul 8, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions Generals/Code/GameEngine/Include/Common/Radar.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 );
Expand Down Expand Up @@ -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_
Expand Down
11 changes: 11 additions & 0 deletions Generals/Code/GameEngine/Source/Common/System/Radar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ void Radar::deleteListResources( void )
while( m_localObjectList )
{

onLocalRadarObjectRemoved( m_localObjectList );

// get next object
nextObject = m_localObjectList->friend_getNext();

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

} // end else

if (list == &m_localObjectList)
{
onLocalRadarObjectAdded(newObj);
}

return true;
} // end addObject

Expand All @@ -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 )
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 );

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
//-------------------------------------------------------------------------------------------------
Expand Down Expand Up @@ -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 */
//-------------------------------------------------------------------------------------------------
Expand Down Expand Up @@ -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();
}
}



Expand Down
5 changes: 5 additions & 0 deletions GeneralsMD/Code/GameEngine/Include/Common/Radar.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 );
Expand Down Expand Up @@ -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_
Expand Down
11 changes: 11 additions & 0 deletions GeneralsMD/Code/GameEngine/Source/Common/System/Radar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ void Radar::deleteListResources( void )
while( m_localObjectList )
{

onLocalRadarObjectRemoved( m_localObjectList );

// get next object
nextObject = m_localObjectList->friend_getNext();

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

} // end else

if (list == &m_localObjectList)
{
onLocalRadarObjectAdded(newObj);
}

return true;
} // end addObject

Expand All @@ -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 )
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 );

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
//-------------------------------------------------------------------------------------------------
Expand Down Expand Up @@ -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 */
//-------------------------------------------------------------------------------------------------
Expand Down Expand Up @@ -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();
}
}



Expand Down
Loading