-
-
Notifications
You must be signed in to change notification settings - Fork 413
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
Custom train tracks #250
Closed
Closed
Custom train tracks #250
Changes from all commits
Commits
Show all changes
70 commits
Select commit
Hold shift + click to select a range
27c72c2
Add custom train tracks
Cazomino05 2197e5c
Add missing files and fixed compile errors
Cazomino05 aed13cd
Small custom train tracks fix
09fce4e
Fix some custom train track crashes
jushar d4cae83
Fix build and merges for CTT
qaisjp 3a60da9
Fix crash when creating a new track
qaisjp 09e3ee8
Fix FindClosestRailTrackNode to use CTrainTrackManager
qaisjp 1f83de2
clean up a lot of the CTT api
qaisjp bebe6b5
allow ints for get/setTrainTrack
qaisjp 7e0039b
rework createTrainTrack function
qaisjp b1f85e4
remove set node position/count
qaisjp 0455429
improve clientside api
qaisjp 5cc1de4
move ResetTracks() call
qaisjp 1f46669
tweak headers
qaisjp fedd97e
Revert "move ResetTracks() call"
qaisjp de2676c
Merge branch 'master' into feature/custom-train-tracks
jushar 94349a0
Move new files
jushar 1bbd37b
Remove duplicate track nodes
jushar 72fa62d
Move train track nodes into shared file
jushar c99498d
Refactor CTrainTrackManagerSA
jushar fbc95d3
Refactor CTrainTrackSA
jushar e84d17e
Implement missing functionality in GameSA module
jushar e58383c
Implement CTrainTrackManager::Reset
jushar 9aa846a
Add required changes to DM module
jushar 9063a3d
Refactor server CTrainTrack*
jushar 19d74ad
Implement all left stuff
jushar 1fb5e1c
Fix a bunch of issues
jushar b02f96d
More fixes
jushar 3225fd9
Merge branch 'master' into feature/custom-train-tracks
jushar 8203466
Update Lua train tracks API
jushar 81f990a
Re-enable get-/setTrainTrack
jushar adc94e3
Linux compile fixes
jushar 5709ae9
Fix linkLastNodes==true and document some variables
jushar 62baa4c
Merge branch 'master' into feature/custom-train-tracks
jushar 082f785
Fix issues when destroying a track
jushar 2cf9dfb
Accept a table of track nodes instead of varargs
jushar bf56f8f
Fix linux compile errors
jushar f59bc41
Merge branch 'master' into feature/custom-train-tracks
jushar 5782e59
Use 2d length for track length calculation
jushar 79407b5
Merge branch 'master' into feature/custom-train-tracks
jushar 5d743da
Fix default track sync
jushar 1565ab5
Merge branch 'master' into feature/custom-train-tracks
qaisjp d09969b
Tweak train track oop
qaisjp e62edbb
Merge branch 'master' into feature/custom-train-tracks
qaisjp 39945b1
Merge branch 'master' into feature/custom-train-tracks
qaisjp a905fd8
Merge branch 'master' into feature/custom-train-tracks
qaisjp 5b6ee37
Merge branch 'master' into feature/custom-train-tracks
qaisjp a59dca4
Add client veh train track oopdefs
qaisjp 7e56130
Merge branch 'master' into feature/custom-train-tracks
qaisjp f8b5d9c
Fix build by applying refactors from master
qaisjp 7fe49d9
Fix crash when using tram
qaisjp c1758fa
Fix default track sync issue introduced in 5d743da34d9
qaisjp 8e2fb7b
Merge commit 'master' into feature/custom-train-tracks
qaisjp 7426bb0
Merge branch 'master' into feature/custom-train-tracks
qaisjp c2742ea
Merge branch 'master' into feature/custom-train-tracks
qaisjp dff4f6c
Merge branch 'master' into feature/custom-train-tracks
qaisjp 5a2e8ae
Fix line endings
qaisjp 7442da7
Fix IterBegin not being present
qaisjp 33b6674
Mute extra whitespace annoyance
qaisjp 15a8acf
Don't use asm for createMissionTrain
qaisjp 84e0c70
Return normal numbers for getTrackNodePosition
qaisjp 18916b8
Prevent empty tracks from being created because it crashes
qaisjp fff401e
Merge branch 'master' into feature/custom-train-tracks
qaisjp c874a80
Fix build
qaisjp a4217e5
tweak some formatting
qaisjp 3cecd29
Use new parser for some shared things
qaisjp 884fe2b
Remove "Track" from (Get|Set)TrackNodePosition
qaisjp 6217a8b
Reimplement Lua API in new parser
qaisjp 6eba15f
Tweak some defines
qaisjp a2569ad
Merge branch 'master' into feature/custom-train-tracks
patrikjuvonen File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,188 @@ | ||
/***************************************************************************** | ||
* | ||
* PROJECT: Multi Theft Auto | ||
* LICENSE: See LICENSE in the top level directory | ||
* FILE: game_sa/CTrainTrackManagerSA.cpp | ||
* PURPOSE: Train Node Manager class | ||
* DEVELOPERS: Cazomino05 <Cazomino05@gmail.com> | ||
* | ||
* Multi Theft Auto is available from http://www.multitheftauto.com/ | ||
* | ||
*****************************************************************************/ | ||
#include "StdInc.h" | ||
#include <algorithm> | ||
#include "CTrainTrackSA.h" | ||
|
||
CTrainTrackManagerSA::CTrainTrackManagerSA() | ||
{ | ||
// Disable CTrain::InitTrains | ||
MemPut(0x6F7440, 0xC3); // Write retn | ||
} | ||
|
||
CTrainTrack* CTrainTrackManagerSA::CreateTrainTrack(const std::vector<STrackNode>& nodes, bool bLinkedLastNode) | ||
{ | ||
if (m_Tracks.size() >= 255) | ||
return nullptr; | ||
|
||
// Dynamically allocate new track | ||
auto index = AllocateTrainTrackIndex(); | ||
auto pTrainTrack = std::make_unique<CTrainTrackSA>(index, nodes, bLinkedLastNode, this); | ||
|
||
// Add to tracks list | ||
m_Tracks.push_back(std::move(pTrainTrack)); | ||
|
||
// Patch track count | ||
PatchNumberOfTracks(static_cast<std::uint8_t>(m_Tracks.size())); | ||
|
||
return m_Tracks.back().get(); | ||
} | ||
|
||
void CTrainTrackManagerSA::UpdateTrackData(CTrainTrackSA* pTrainTrack) | ||
{ | ||
auto trackIndex = pTrainTrack->GetIndex(); | ||
|
||
// Update length | ||
m_TrackLengths[trackIndex] = pTrainTrack->GetLength(); | ||
|
||
// Update track nodes amount | ||
m_NumberOfTrackNodes[trackIndex] = pTrainTrack->GetNumberOfNodes(); | ||
|
||
// Update nodes pointers in array | ||
m_TrackNodePointers[trackIndex] = pTrainTrack->GetNodesData(); | ||
} | ||
|
||
CTrainTrack* CTrainTrackManagerSA::GetTrainTrackByIndex(uint trackIndex) | ||
{ | ||
auto iter = std::find_if(m_Tracks.begin(), m_Tracks.end(), [trackIndex](auto& pTrainTrack) { return pTrainTrack->GetIndex() == trackIndex; }); | ||
if (iter == m_Tracks.end()) | ||
return nullptr; | ||
|
||
return iter->get(); | ||
} | ||
|
||
void CTrainTrackManagerSA::DestroyTrainTrack(CTrainTrack* pTrainTrack) | ||
{ | ||
// Remove track from arrays | ||
auto trackIndex = pTrainTrack->GetIndex(); | ||
m_TrackNodePointers[trackIndex] = nullptr; // Mark as free | ||
m_TrackLengths[trackIndex] = 0.0f; | ||
m_NumberOfTrackNodes[trackIndex] = 0; | ||
|
||
// Remove track from list | ||
m_Tracks.erase(std::remove_if(m_Tracks.begin(), m_Tracks.end(), [pTrainTrack](auto& pTrack) { return pTrack.get() == pTrainTrack; })); | ||
|
||
// Patch track count | ||
PatchNumberOfTracks(static_cast<std::uint8_t>(m_Tracks.size())); | ||
} | ||
|
||
void CTrainTrackManagerSA::Reset() | ||
{ | ||
// Clear tracks | ||
m_Tracks.clear(); | ||
|
||
// Clear SA data | ||
if (m_TrackNodePointers != nullptr) | ||
{ | ||
delete m_TrackNodePointers; | ||
delete m_TrackLengths; | ||
delete m_NumberOfTrackNodes; | ||
} | ||
m_TrackNodePointers = nullptr; | ||
m_TrackLengths = nullptr; | ||
m_NumberOfTrackNodes = nullptr; | ||
m_CurrentTrackNodeSize = 0; | ||
} | ||
|
||
uint CTrainTrackManagerSA::AllocateTrainTrackIndex() | ||
{ | ||
// Check if there is a free index | ||
for (uint i = 0; i < m_CurrentTrackNodeSize; ++i) | ||
{ | ||
if (m_TrackNodePointers[i] == nullptr) | ||
return i; | ||
} | ||
|
||
// We ran out-of-space, so allocate some more tracks | ||
auto previousTrackNodeSize = m_CurrentTrackNodeSize; | ||
m_CurrentTrackNodeSize += 10; | ||
auto trackNodePtrs = new STrackNode*[m_CurrentTrackNodeSize]; | ||
std::memset(trackNodePtrs, 0, m_CurrentTrackNodeSize * sizeof(STrackNode**)); | ||
auto trackLengths = new float[m_CurrentTrackNodeSize]; | ||
auto numTrackNodes = new std::uint32_t[m_CurrentTrackNodeSize]; | ||
|
||
if (m_TrackNodePointers != nullptr) | ||
{ | ||
// Copy previous data into these arrays | ||
std::memcpy(trackNodePtrs, m_TrackNodePointers, previousTrackNodeSize * sizeof(STrackNode**)); | ||
std::memcpy(trackLengths, m_TrackLengths, previousTrackNodeSize * sizeof(float*)); | ||
std::memcpy(numTrackNodes, m_NumberOfTrackNodes, previousTrackNodeSize * sizeof(std::uint32_t*)); | ||
|
||
// Delete old memory | ||
delete m_TrackNodePointers; | ||
delete m_TrackLengths; | ||
delete m_NumberOfTrackNodes; | ||
} | ||
|
||
// Replace with new | ||
m_TrackNodePointers = trackNodePtrs; | ||
m_TrackLengths = trackLengths; | ||
m_NumberOfTrackNodes = numTrackNodes; | ||
|
||
// Patch references | ||
PatchReferences(); | ||
|
||
// Return new id | ||
return previousTrackNodeSize; | ||
} | ||
|
||
void CTrainTrackManagerSA::PatchReferences() | ||
{ | ||
// pGlobalTrainNodes 0xC38014 | ||
MemPut(0x6F58D2, m_TrackNodePointers); // 1 | ||
MemPut(0x6F59FE, m_TrackNodePointers); // 2 | ||
MemPut(0x6F6C06, m_TrackNodePointers); // 3 | ||
MemPut(0x6F6D0A, m_TrackNodePointers); // 4 | ||
MemPut(0x6F6EB1, m_TrackNodePointers); // 5 | ||
MemPut(0x6F6F79, m_TrackNodePointers); // 6 | ||
MemPut(0x6F7442, m_TrackNodePointers); // 7 | ||
MemPut(0x6F7467, m_TrackNodePointers); // 8 | ||
MemPut(0x6F74EC, m_TrackNodePointers); // 9 | ||
MemPut(0x6F75B7, m_TrackNodePointers); // 10 | ||
MemPut(0x6F7B73, m_TrackNodePointers); // 11 | ||
MemPut(0x6F7C60, m_TrackNodePointers); // 12 | ||
MemPut(0x6F7DC5, m_TrackNodePointers); // 13 | ||
MemPut(0x6F7EE9, m_TrackNodePointers); // 14 | ||
MemPut(0x6F8007, m_TrackNodePointers); // 15 | ||
MemPut(0x6F809C, m_TrackNodePointers); // 16 | ||
MemPut(0x6F871C, m_TrackNodePointers); // 17 | ||
|
||
// fRailTrackOneLength 0xC37FEC | ||
MemPut(0x6F5BC4, m_TrackLengths); // 1 | ||
MemPut(0x6F5BD9, m_TrackLengths); // 2 | ||
MemPut(0x6F5C15, m_TrackLengths); // 3 | ||
MemPut(0x6F5C32, m_TrackLengths); // 4 | ||
MemPut(0x6F745D, m_TrackLengths); // 5 | ||
MemPut(0x6F8712, m_TrackLengths); // 6 | ||
MemPut(0x6F6FE8, m_TrackLengths); // 7 | ||
|
||
// iNumberOfTrackNodes 0xC38014 | ||
MemPut(0x6F59EB, m_NumberOfTrackNodes); // 1 | ||
MemPut(0x6F6BF3, m_NumberOfTrackNodes); // 2 | ||
MemPut(0x6F6C96, m_NumberOfTrackNodes); // 3 | ||
MemPut(0x6F6CD1, m_NumberOfTrackNodes); // 4 | ||
MemPut(0x6F6D04, m_NumberOfTrackNodes); // 5 | ||
MemPut(0x6F6F52, m_NumberOfTrackNodes); // 6 | ||
MemPut(0x6F7DB6, m_NumberOfTrackNodes); // 7 | ||
MemPut(0x6F7F05, m_NumberOfTrackNodes); // 8 | ||
MemPut(0x6F7F12, m_NumberOfTrackNodes); // 9 | ||
MemPut(0x6F8001, m_NumberOfTrackNodes); // 10 | ||
MemPut(0x6F80B6, m_NumberOfTrackNodes); // 11 | ||
MemPut(0x6F80C3, m_NumberOfTrackNodes); // 12 | ||
MemPut(0x6F8723, m_NumberOfTrackNodes); // 13 | ||
} | ||
|
||
void CTrainTrackManagerSA::PatchNumberOfTracks(std::uint8_t numTracks) | ||
{ | ||
// .text:006F6CA7 cmp esi, 4 | ||
MemPut(0x6F6CA9, numTracks); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
/***************************************************************************** | ||
* | ||
* PROJECT: Multi Theft Auto | ||
* LICENSE: See LICENSE in the top level directory | ||
* FILE: game_sa/CTrainTrackManagerSA.h | ||
* PURPOSE: Header file for train node manager class | ||
* DEVELOPERS: Cazomino05 <Cazomino05@gmail.com> | ||
* | ||
* Multi Theft Auto is available from http://www.multitheftauto.com/ | ||
* | ||
*****************************************************************************/ | ||
#pragma once | ||
#include <game/CTrainTrackManager.h> | ||
#include <game/CTrainTrack.h> | ||
|
||
struct STrackNode; | ||
class CTrainTrackSA; | ||
|
||
class CTrainTrackManagerSA : public CTrainTrackManager | ||
{ | ||
public: | ||
CTrainTrackManagerSA(); | ||
|
||
virtual CTrainTrack* CreateTrainTrack(const std::vector<STrackNode>& nodes, bool bLinkedLastNode) override; | ||
virtual void DestroyTrainTrack(CTrainTrack* pTrainTrack) override; | ||
|
||
virtual void Reset() override; | ||
|
||
void UpdateTrackData(CTrainTrackSA* pTrainTrack); | ||
|
||
virtual CTrainTrack* GetTrainTrackByIndex(uint trackIndex) override; | ||
|
||
virtual std::size_t GetNumberOfTrainTracks() const override { return m_Tracks.size(); } | ||
virtual const std::vector<std::unique_ptr<CTrainTrack>>& GetTrackNodes() const override { return m_Tracks; } | ||
|
||
private: | ||
uint AllocateTrainTrackIndex(); | ||
void PatchReferences(); | ||
void PatchNumberOfTracks(std::uint8_t numTracks); | ||
|
||
std::vector<std::unique_ptr<CTrainTrack>> m_Tracks; | ||
|
||
// Arrays that are directly passed to SA | ||
uint m_CurrentTrackNodeSize = 0; | ||
STrackNode** m_TrackNodePointers = nullptr; | ||
float* m_TrackLengths = nullptr; | ||
std::uint32_t* m_NumberOfTrackNodes = nullptr; | ||
}; | ||
|
||
/* | ||
DOCUMENTATION: | ||
- m_Tracks: Currently used train tracks (includes new tracks as well) | ||
- m_TrackNodePointers: Contains ALL track nodes for ALL tracks | ||
- m_TrackLengths: Contains overall track lengths | ||
|
||
MEMORY ADDRESSES: | ||
- 0xC38014: NUM_RAILTRACKS dwords | ||
- 0xC37FEC: Track Length floats | ||
- 0xC38024: NUM_RAILTRACKS pointers to arrays of STrackNode | ||
- 0x6F6BD0: int GetTrainNodeNearPoint(float x, float y, float z, int* pTrackID) places track ID in *pTrackID and returns node ID | ||
*/ |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
TODO: we could set the train position here? otherwise the client's train will not match what the server requested it to be. there might be a better time for setting the train position than here, though, such as when the train streams in