Skip to content

Commit

Permalink
[custom-train-tracks] Fixed some crashes
Browse files Browse the repository at this point in the history
  • Loading branch information
jushar committed Jan 31, 2014
1 parent dc8f3ca commit 92a1f42
Show file tree
Hide file tree
Showing 6 changed files with 22 additions and 12 deletions.
8 changes: 8 additions & 0 deletions MTA10/game_sa/CTrainTrackManagerSA.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11723,6 +11723,7 @@ CTrainTrackManagerSA::~CTrainTrackManagerSA ( )
{
// there are 4 train tracks so delete them all
delete m_pTrainTracks[i];
m_pTrainTracks[i] = NULL;
}
}

Expand Down Expand Up @@ -11786,6 +11787,7 @@ void CTrainTrackManagerSA::Initialise ( )
MemPut <DWORD> ( 0x6F5C32, (DWORD)&m_fRailTrackLengths ); // 4
MemPut <DWORD> ( 0x6F745D, (DWORD)&m_fRailTrackLengths ); // 5
MemPut <DWORD> ( 0x6F8712, (DWORD)&m_fRailTrackLengths ); // 6
MemPut <DWORD> ( 0x6F6FE8, (DWORD)&m_fRailTrackLengths ); // 7

// iNumberOfTrackNodes 0xC38014
MemPut <DWORD> ( 0x6F59EB, (DWORD)&m_dwNumberOfTrackNodes ); // 1
Expand Down Expand Up @@ -11947,6 +11949,12 @@ bool CTrainTrackManagerSA::Reallocate ( CTrainTrackSA * pTrainTrack, unsigned in
GetOriginalRailNode ( 0, i, pNode );
}

// Fill gaps with zeroes
for ( unsigned int i = uiNodes; i < MAX_TOTAL_TRACKS; ++i )
{
m_pRailNodePointers[i] = NULL;
}

// If there was a previous allocation delete it
void * pRailNodes = m_pRailNodePointers[dwTrackID];
if ( pRailNodes != NULL )
Expand Down
6 changes: 3 additions & 3 deletions MTA10/mods/shared_logic/CClientVehicle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ CClientVehicle::CClientVehicle ( CClientManager* pManager, ElementID ID, unsigne
m_bTrainDirection = false;
m_fTrainSpeed = 0.0f;
m_fTrainPosition = -1.0f;
m_ucTrackID = -1;
m_ucTrackID = 0xFF;
m_bChainEngine = false;
m_bTaxiLightOn = false;
m_vecGravity = CVector ( 0.0f, 0.0f, -1.0f );
Expand Down Expand Up @@ -2561,10 +2561,10 @@ void CClientVehicle::Create ( void )
m_pVehicle->SetDerailable ( m_bIsDerailable );
m_pVehicle->SetTrainDirection ( m_bTrainDirection );
m_pVehicle->SetTrainSpeed ( m_fTrainSpeed );
if ( m_ucTrackID >= 0 )
if ( m_ucTrackID != 0xFF )
m_pVehicle->SetRailTrack ( m_ucTrackID );

if ( m_fTrainPosition >= 0 )
if ( m_fTrainPosition >= 0.0f )
m_pVehicle->SetTrainPosition ( m_fTrainPosition, false );

if ( m_bChainEngine )
Expand Down
5 changes: 5 additions & 0 deletions MTA10_Server/mods/deathmatch/logic/CTrainTrack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@ CTrainTrack::CTrainTrack( unsigned char ucTrackID, CTrainTrackManager * pManager
SetTypeName ( "train-track" );
}

CTrainTrack::~CTrainTrack ( void )
{
m_pManager->UnreferenceTrainTrack ( m_ucTrackID );
}

SRailNode * CTrainTrack::GetRailNode ( unsigned int uiNode )
{
// Make sure we are within the realm of possibility
Expand Down
1 change: 1 addition & 0 deletions MTA10_Server/mods/deathmatch/logic/CTrainTrack.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ class CTrainTrack : public CElement
friend class CTrainTrackManager;
public:
CTrainTrack ( unsigned char ucTrackID, CTrainTrackManager * pManager, CElement * pParent, CXMLNode * pNode );
~CTrainTrack ( void );

private:
void Recalculate ( );
Expand Down
12 changes: 4 additions & 8 deletions MTA10_Server/mods/deathmatch/logic/CTrainTrackManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11734,6 +11734,7 @@ CTrainTrackManager::~CTrainTrackManager ( )
{
// there are 4 train tracks so delete them all
delete m_pTrainTracks[i];
m_pTrainTracks[i] = NULL;
}
}

Expand All @@ -11760,7 +11761,7 @@ void CTrainTrackManager::Initialise ( )
else
{
m_pTrainTracks[i] = NULL;
DestroyTrainTrack ( i );
UnreferenceTrainTrack ( i );
}
}

Expand Down Expand Up @@ -11816,20 +11817,15 @@ CTrainTrack * CTrainTrackManager::CreateTrainTrack ( unsigned int uiNodes, CElem
return NULL;
}

bool CTrainTrackManager::DestroyTrainTrack ( DWORD dwTrackID )
bool CTrainTrackManager::UnreferenceTrainTrack ( DWORD dwTrackID )
{
if ( dwTrackID < MAX_TOTAL_TRACKS )
{
// Set our data to default
m_fRailTrackLengths[dwTrackID] = 0;
m_dwNumberOfTrackNodes[dwTrackID] = 1;

// Delete our train track
if ( m_pTrainTracks[dwTrackID] != NULL )
{
delete m_pTrainTracks[dwTrackID];
}

// Unreference our train track
m_pTrainTracks[dwTrackID] = NULL;

return true;
Expand Down
2 changes: 1 addition & 1 deletion MTA10_Server/mods/deathmatch/logic/CTrainTrackManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ class CTrainTrackManager
CTrainTrack * CreateTrainTrack ( unsigned int uiNodes, CElement * pParent, CXMLNode * pNode );


bool DestroyTrainTrack ( DWORD dwTrackID );
bool UnreferenceTrainTrack ( DWORD dwTrackID );

private:
bool Reallocate ( CTrainTrack * pTrainTrack, unsigned int uiNodes );
Expand Down

0 comments on commit 92a1f42

Please sign in to comment.