Custom Train Tracks
From Multi Theft Auto: Wiki
This branch makes it possible to make your own train tracks.
Status | Work in progress |
Branch | feature/custom-train-tracks |
Branch version | 1.5.3 |
Contents
Functions
Media
Development
API
-- trainNode is a Vector3, or table of three coordinates -- nodes is a table of trainNodes track = TrainTrack(...nodes) -- createTrack(node1, node2, node3, ...) track:getNodes() returns a table of Vector3s track:getLength() -- getTrainTrack(track) -- Default track functions TrainTrack.removeDefault(int trackID) TrainTrack.resetDefault(int trackID) -- These functions already exist, but I'm not sure how these lengths are used or what they are for
Findings
All information related custom train tracks are stored here.
Files
MTA10/game_sa ** CTrainTrackManagerSA.{cpp,h} ** CTrainTrackSA.{cpp,h} MTA10/mods/shared_logic ** CClientTrainTrack.{cpp,h} ** luadefs/CLuaTrainTrackDefs.{cpp,h} -- contain definitions for the Lua API MTA10/sdk/game ** CTrainTrack.h ** CTrainTrackManager.h MTA10_Server/mods/deathmatch/logic ** CTrainTrackManager.{cpp,h} ** CTrainTrack.{cpp,h} ** luadefs/CLuaTrainTrackDefs.{cpp,h} -- contain definitions for the Lua API
m_OriginalTrainTrackData
The m_OriginalTrainTrackData array contains the same values in CTrainTrackManager.cpp and CTrainTrackManagerSA.cpp.
The Init function is structured like so (pay special attention to the comments):
typedef struct { short sX; // x coordinate times 8 short sY; // y coordinate times 8 short sZ; // z coordinate times 8 float fRailDistance; // on-rail distance ( leave the client to calculate this ) void Init ( short sX, short sY, short sZ, unsigned short sRailDistance, WORD padding ) { this->sX = sX; this->sY = sY; this->sZ = sZ; this->fRailDistance = sRailDistance; } } SRailNode;
We need to make sense of the following things:
- Why is padding an argument here? (It doesn't do anything, and when Init() is called, real values are provided)
- Why are values repeated several times?
- Why does the last repeat have slightly different values?
Issues
- There may be some issues (relating to infinite loops) if a track runs across another or crosses another
- Infinite loop occurs at 006f8fda, see call stack. Occurs when a track of two nodes have same x/y, but different z. Only occurs for tracks that ONLY consist of nodes atop each other.
- Possible solution: when creation tracks, ensure that atleast one of the nodes has a different x/y to any other node.
- Infinite loop occurs at 006f8fda, see call stack. Occurs when a track of two nodes have same x/y, but different z. Only occurs for tracks that ONLY consist of nodes atop each other.
- Tracks may not be cleaned up -> See CTrainTrackManager::ResetTracks
- See CTrainTrackManager and CTrainTrackManagerSA - why is this file so big? Why are coordinates provided multiple times for the same track? Which ones are right?
int CWorldSA::FindClosestRailTrackNode needs updating. It needs to use MAX_TOTAL_TRACKS and the train manager.See 09e3ee8f25810c17742
Re-merge
Click to expand [+]
This section has been archived