Rigs of Rods 2023.09
Soft-body Physics Simulation
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
Loading...
Searching...
No Matches
CacheSystem.h
Go to the documentation of this file.
1/*
2 This source file is part of Rigs of Rods
3 Copyright 2005-2012 Pierre-Michel Ricordel
4 Copyright 2007-2012 Thomas Fischer
5 Copyright 2013-2023 Petr Ohlidal
6
7 For more information, see http://www.rigsofrods.org/
8
9 Rigs of Rods is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License version 3, as
11 published by the Free Software Foundation.
12
13 Rigs of Rods is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with Rigs of Rods. If not, see <http://www.gnu.org/licenses/>.
20*/
21
26
27#pragma once
28
29#include "Application.h"
30#include "Language.h"
31#include "RefCountingObject.h"
33#include "RigDef_File.h"
34#include "SimData.h"
35
36#include <Ogre.h>
37#include <rapidjson/document.h>
38#include <string>
39#include <set>
40
41#define CACHE_FILE "mods.cache"
42#define CACHE_FILE_FORMAT 14
43#define CACHE_FILE_FRESHNESS 86400 // 60*60*24 = one day
44
45namespace RoR {
46
48{
49 int id = -1;
50 Ogre::String type;
51 Ogre::String name;
52 Ogre::String email;
53};
54
55class CacheEntry: public RefCountingObject<CacheEntry>
56{
57
58public:
59
61 CacheEntry();
63
65
66 Ogre::String fpath;
67 Ogre::String fname;
68 Ogre::String fname_without_uid;
69 Ogre::String fext;
70 Ogre::String dname;
71
73 Ogre::String categoryname;
74
75 std::time_t addtimestamp;
76 Ogre::String uniqueid;
77 Ogre::String guid;
78 int version;
79
82
83 std::time_t filetime;
84 bool deleted;
86 std::vector<AuthorInfo> authors;
87 Ogre::String filecachename;
88
89 Ogre::String resource_group;
90
96
97 // following all ADDONPART detail information:
98 std::set<std::string> addonpart_guids;
99 std::set<std::string> addonpart_filenames;
100
101 // following all TUNEUP detail information:
103
104 // following all TRUCK detail information:
105 Ogre::String description;
106 Ogre::String tags;
107 std::string default_skin;
127
129 float loadmass;
130 float minrpm;
131 float maxrpm;
132 float torque;
138
142 std::vector<Ogre::String> sectionconfigs;
143};
144
146
148{
149 CacheQueryResult(CacheEntryPtr entry, size_t score);
150
151 bool operator<(CacheQueryResult const& other) const;
152
154 size_t cqr_score;
155};
156
157enum class CacheSearchMethod // Always case-insensitive
158{
159 NONE,
160 FULLTEXT,
161 GUID,
162 AUTHORS,
163 WHEELS,
164 FILENAME
165};
166
193
195{
196 UNKNOWN,
197 VALID,
200};
201
203{
204 NONE,
205 DEFAULT,
208};
209
223
259
261{
264
265 // Subject (either name or ID applies depending on type)
266 std::string mpr_subject; // addonpart
267 int mpr_subject_id = -1; // wheel, prop, flexbody, node
268 int mpr_value_int; // forced wheel side
269};
270
284{
285 friend class ContentManager;
286public:
287 typedef std::map<int, Ogre::String> CategoryIdNameMap;
288
289 CacheSystem();
290
293 void LoadModCache(CacheValidity validity);
294 bool IsModCacheLoaded() { return m_loaded; }
296
299 CacheEntryPtr FindEntryByFilename(RoR::LoaderType type, bool partial, const std::string& _filename_maybe_bundlequalified);
301 CacheEntryPtr FetchSkinByName(std::string const & skin_name);
302 size_t Query(CacheQuery& query);
303 bool IsRepoFileInstalled(const std::string& repo_filename, std::string& out_filepath);
305
308 void LoadResource(CacheEntryPtr& t);
312 void LoadAssetPack(CacheEntryPtr& t_dest, Ogre::String const & assetpack_filename);
314
318 void ModifyProject(ModifyProjectRequest* request);
319 void DeleteProject(CacheEntryPtr& entry);
321
322 const std::vector<CacheEntryPtr> &GetEntries() const { return m_entries; }
324
325 Ogre::String GetPrettyName(Ogre::String fname);
326 std::string ActorTypeToName(ActorType driveable);
327
328 const std::vector<std::string>& GetContentDirs() const { return m_content_dirs; }
329
330 void DeleteResourceBundleByFilename(const std::string& bundle_filename);
331 void ParseSingleZip(Ogre::String path);
332
333private:
334
335 CacheValidity EvaluateCacheValidity(); // Called by `ContentManager` on startup only.
336
337 void WriteCacheFileJson();
338 void ExportEntryToJson(rapidjson::Value& j_entries, rapidjson::Document& j_doc, CacheEntryPtr const & entry);
340 void ImportEntryFromJson(rapidjson::Value& j_entry, CacheEntryPtr & out_entry);
341
342 static Ogre::String StripUIDfromString(Ogre::String uidstr);
343 static Ogre::String StripSHA1fromString(Ogre::String sha1str);
344 static std::string ComposeResourceGroupName(const CacheEntryPtr& entry);
345
346 void ParseZipArchives(Ogre::String group);
347 bool ParseKnownFiles(Ogre::String group); // returns true if no known files are found
348
349
350 void ClearCache(); // removes all files from the cache
351 void PruneCache(); // removes modified (or deleted) files from the cache
352 void ClearResourceGroups();
353
354 void AddFile(Ogre::String group, Ogre::FileInfo f, Ogre::String ext);
355
356 void DetectDuplicates();
357
360 void LoadAssociatedSkinDef(CacheEntryPtr& cache_entry);
361 void LoadAssociatedTuneupDef(CacheEntryPtr& cache_entry);
363
366 void FillTerrainDetailInfo(CacheEntryPtr &entry, Ogre::DataStreamPtr ds, Ogre::String fname);
367 void FillTruckDetailInfo(CacheEntryPtr &entry, Ogre::DataStreamPtr ds, Ogre::String fname, Ogre::String group);
368 void FillSkinDetailInfo(CacheEntryPtr &entry, std::shared_ptr<SkinDocument>& skin_def);
369 void FillAddonPartDetailInfo(CacheEntryPtr &entry, Ogre::DataStreamPtr ds);
370 void FillTuneupDetailInfo(CacheEntryPtr &entry, TuneupDefPtr& tuneup_def);
371 void FillAssetPackDetailInfo(CacheEntryPtr &entry, Ogre::DataStreamPtr ds);
372 void FillDashboardDetailInfo(CacheEntryPtr& entry, Ogre::DataStreamPtr ds);
373 void FillGadgetDetailInfo(CacheEntryPtr& entry, Ogre::DataStreamPtr ds);
375
377
378 void GenerateFileCache(CacheEntryPtr &entry, Ogre::String group);
379 void RemoveFileCache(CacheEntryPtr &entry);
380
381 bool Match(size_t& out_score, std::string data, std::string const& query, size_t );
382
383 bool IsPathContentDirRoot(const std::string& path) const;
384
385 bool m_loaded = false;
386 std::time_t m_update_time;
389 std::vector<CacheEntryPtr> m_entries;
390 std::vector<Ogre::String> m_known_extensions;
391 std::vector<std::string> m_content_dirs;
392 std::set<Ogre::String> m_resource_paths;
393 std::map<int, Ogre::String> m_categories = {
394 // these are the category numbers from the repository. do not modify them!
395
396 // vehicles
397 {108, _LC("ModCategory", "Other Land Vehicles")},
398
399 {146, _LC("ModCategory", "Street Cars")},
400 {147, _LC("ModCategory", "Light Racing Cars")},
401 {148, _LC("ModCategory", "Offroad Cars")},
402 {149, _LC("ModCategory", "Fantasy Cars")},
403 {150, _LC("ModCategory", "Bikes")},
404 {155, _LC("ModCategory", "Crawlers")},
405
406 {152, _LC("ModCategory", "Towercranes")},
407 {153, _LC("ModCategory", "Mobile Cranes")},
408 {154, _LC("ModCategory", "Other cranes")},
409
410 {107, _LC("ModCategory", "Buses")},
411 {151, _LC("ModCategory", "Tractors")},
412 {156, _LC("ModCategory", "Forklifts")},
413 {159, _LC("ModCategory", "Fantasy Trucks")},
414 {160, _LC("ModCategory", "Transport Trucks")},
415 {161, _LC("ModCategory", "Racing Trucks")},
416 {162, _LC("ModCategory", "Offroad Trucks")},
417
418 {110, _LC("ModCategory", "Boats")},
419
420 {113, _LC("ModCategory", "Helicopters")},
421 {114, _LC("ModCategory", "Aircraft")},
422
423 {117, _LC("ModCategory", "Trailers")},
424 {118, _LC("ModCategory", "Other Loads")},
425
426 // terrains
427 {129, _LC("ModCategory", "Addon Terrains")},
428
429 {859, _LC("ModCategory", "Container")},
430
431 {875, _LC("ModCategory", "Submarine")},
432
433 // dashboards
434 {200, _LC("ModCategory", "Dashboards - Generic")},
435 {201, _LC("ModCategory", "Dashboards - Truck")},
436 {202, _LC("ModCategory", "Dashboards - Boat")},
437
438 // gadgets
439 {CID_GadgetsGeneric, _LC("ModCategory", "Gadgets - Generic")},
440 {CID_GadgetsActor, _LC("ModCategory", "Gadgets - Actor")},
441 {CID_GadgetsTerrain, _LC("ModCategory", "Gadgets - Terrain")},
442
443 // note: these categories are NOT in the repository:
444 {5000, _LC("ModCategory", "Official Terrains")},
445 {5001, _LC("ModCategory", "Night Terrains")},
446
447 {CID_Projects, _LC("ModCategory", "Projects")},
448 {CID_Tuneups, _LC("ModCategory", "Tuneups")},
449
450 // do not use category numbers above 9000!
451 {CID_Unsorted, _LC("ModCategory", "Unsorted")},
452 {CID_All, _LC("ModCategory", "All")},
453 {CID_Fresh, _LC("ModCategory", "Fresh")},
454 {CID_Hidden, _LC("ModCategory", "Hidden")},
455 };
456};
457
458} // namespace RoR
Central state/object manager and communications hub.
#define _LC(ctx, str)
Definition Language.h:38
Data structures representing 'truck' file format, see https://docs.rigsofrods.org/vehicle-creation/fi...
Core data structures for simulation; Everything affected by by either physics, network or user intera...
Self reference-counting objects, as requred by AngelScript garbage collector.
Definition CacheSystem.h:56
float minrpm
float truckmass
Terrn2DocumentPtr terrn2_def
Cached terrain definition document.
Definition CacheSystem.h:95
int wheelcount
CacheEntryID_t number
Sequential number, assigned internally, used by Selector-GUI.
Definition CacheSystem.h:64
bool custom_particles
std::vector< Ogre::String > sectionconfigs
Ogre::String fname
filename
Definition CacheSystem.h:67
int version
file's version
Definition CacheSystem.h:78
Ogre::String description
Ogre::String fext
file's extension
Definition CacheSystem.h:69
std::set< std::string > addonpart_guids
GUIDs of all vehicles this addonpart is used with.
Definition CacheSystem.h:98
Ogre::String fpath
filepath relative to the .zip file
Definition CacheSystem.h:66
std::string tuneup_associated_filename
Value of 'filename' field in the tuneup file; always lowercase.
int categoryid
category id
Definition CacheSystem.h:72
TuneupDefPtr addonpart_data_only
Cached addonpart data (dummy tuneup), only used for evaluating conflicts, see AddonPartUtility::Recor...
Definition CacheSystem.h:94
Ogre::String dname
name parsed from the file
Definition CacheSystem.h:70
int commandscount
int propscount
int exhaustscount
std::vector< AuthorInfo > authors
authors
Definition CacheSystem.h:86
bool hasSubmeshs
int flexbodiescount
bool importcommands
int turbojetcount
SkinDocumentPtr skin_def
Cached skin info, added on first use or during cache rebuild.
Definition CacheSystem.h:92
std::time_t addtimestamp
timestamp when this file was added to the cache
Definition CacheSystem.h:75
bool forwardcommands
int numgears
bool rescuer
CacheEntry()
default constructor resets the data.
int hydroscount
bool customtach
Ogre::String tags
Ogre::String resource_group
Resource group of the loaded bundle. Empty if not loaded yet.
Definition CacheSystem.h:89
TuneupDefPtr tuneup_def
Cached tuning info, added on first use or during cache rebuild.
Definition CacheSystem.h:93
std::set< std::string > addonpart_filenames
File names of all vehicles this addonpart is used with. If empty, any filename goes.
Definition CacheSystem.h:99
int usagecounter
how much it was used already
Definition CacheSystem.h:85
Ogre::String fname_without_uid
filename
Definition CacheSystem.h:68
float torque
std::string resource_bundle_type
Archive type recognized by OGRE resource system: 'FileSystem' or 'Zip'.
Definition CacheSystem.h:80
std::string resource_bundle_path
Path of ZIP or directory which contains the media. Shared between CacheEntries, loaded only once.
Definition CacheSystem.h:81
int nodecount
int beamcount
int propwheelcount
float loadmass
int soundsourcescount
int fixescount
int shockcount
char enginetype
std::string default_skin
bool deleted
is this mod deleted?
Definition CacheSystem.h:84
Ogre::String categoryname
category name
Definition CacheSystem.h:73
ActorType driveable
int flarescount
~CacheEntry()
float maxrpm
Ogre::String filecachename
preview image filename
Definition CacheSystem.h:87
int rotatorscount
int fileformatversion
int turbopropscount
RigDef::DocumentPtr actor_def
Cached actor definition (aka truckfile) after first spawn.
Definition CacheSystem.h:91
int wingscount
std::time_t filetime
filetime
Definition CacheSystem.h:83
Ogre::String uniqueid
file's unique id
Definition CacheSystem.h:76
Ogre::String guid
global unique id; Type "addonpart" leaves this empty and uses addonpart_guids; Always lowercase.
Definition CacheSystem.h:77
A content database MOTIVATION: RoR users usually have A LOT of content installed.
void ReLoadResource(CacheEntryPtr &t)
Forces reloading the associated bundle.
void GenerateFileCache(CacheEntryPtr &entry, Ogre::String group)
void LoadSupplementaryDocuments(CacheEntryPtr &t)
Loads the associated .truck*, .skin and .tuneup files.
std::vector< std::string > m_content_dirs
the various mod directories we track in the cache system
std::vector< Ogre::String > m_known_extensions
the extensions we track in the cache system
void FillTerrainDetailInfo(CacheEntryPtr &entry, Ogre::DataStreamPtr ds, Ogre::String fname)
void UnLoadResource(CacheEntryPtr &t)
Unloads associated bundle, destroying all spawned actors.
void ParseZipArchives(Ogre::String group)
bool Match(size_t &out_score, std::string data, std::string const &query, size_t)
void RemoveFileCache(CacheEntryPtr &entry)
std::set< Ogre::String > m_resource_paths
A temporary list of existing resource paths.
void ModifyProject(ModifyProjectRequest *request)
std::time_t m_update_time
Ensures that all inserted files share the same timestamp.
const std::vector< CacheEntryPtr > & GetEntries() const
void LoadAssetPack(CacheEntryPtr &t_dest, Ogre::String const &assetpack_filename)
Adds asset pack to the requesting cache entry's resource group.
static Ogre::String StripSHA1fromString(Ogre::String sha1str)
void FillTuneupDetailInfo(CacheEntryPtr &entry, TuneupDefPtr &tuneup_def)
void FillTruckDetailInfo(CacheEntryPtr &entry, Ogre::DataStreamPtr ds, Ogre::String fname, Ogre::String group)
void FillSkinDetailInfo(CacheEntryPtr &entry, std::shared_ptr< SkinDocument > &skin_def)
std::string m_filenames_hash_loaded
hash from cachefile, for quick update detection
std::vector< CacheEntryPtr > m_entries
bool ParseKnownFiles(Ogre::String group)
void FillGadgetDetailInfo(CacheEntryPtr &entry, Ogre::DataStreamPtr ds)
CacheEntryPtr FindEntryByFilename(RoR::LoaderType type, bool partial, const std::string &_filename_maybe_bundlequalified)
Returns NULL if none found; "Bundle-qualified" format also specifies the ZIP/directory in modcache,...
const CategoryIdNameMap & GetCategories() const
Ogre::String GetPrettyName(Ogre::String fname)
void GenerateHashFromFilenames()
For quick detection of added/removed content.
void ImportEntryFromJson(rapidjson::Value &j_entry, CacheEntryPtr &out_entry)
void DeleteProject(CacheEntryPtr &entry)
void ParseSingleZip(Ogre::String path)
std::string ActorTypeToName(ActorType driveable)
CacheEntryPtr FetchSkinByName(std::string const &skin_name)
static Ogre::String StripUIDfromString(Ogre::String uidstr)
size_t Query(CacheQuery &query)
void LoadAssociatedTuneupDef(CacheEntryPtr &cache_entry)
Loads+parses the .tuneup file and updates all related CacheEntries.
std::map< int, Ogre::String > m_categories
void LoadAssociatedSkinDef(CacheEntryPtr &cache_entry)
Loads+parses the .skin file and updates all related CacheEntries.
void AddFile(Ogre::String group, Ogre::FileInfo f, Ogre::String ext)
CacheEntryPtr CreateProject(CreateProjectRequest *request)
Creates subdirectory in 'My Games\Rigs of Rods\projects', pre-populates it with files and adds modcac...
bool IsPathContentDirRoot(const std::string &path) const
bool IsRepoFileInstalled(const std::string &repo_filename, std::string &out_filepath)
Checks whether a ZIP archive from the online repository is installed in the local modcache.
CacheEntryPtr GetEntryByNumber(int modid)
void FillAddonPartDetailInfo(CacheEntryPtr &entry, Ogre::DataStreamPtr ds)
CacheValidity EvaluateCacheValidity()
std::map< int, Ogre::String > CategoryIdNameMap
const std::vector< std::string > & GetContentDirs() const
void ExportEntryToJson(rapidjson::Value &j_entries, rapidjson::Document &j_doc, CacheEntryPtr const &entry)
void FillDashboardDetailInfo(CacheEntryPtr &entry, Ogre::DataStreamPtr ds)
std::string m_filenames_hash_generated
stores hash over the content, for quick update detection
void LoadResource(CacheEntryPtr &t)
Loads the associated resource bundle if not already done.
static std::string ComposeResourceGroupName(const CacheEntryPtr &entry)
bool IsModCacheLoaded()
void FillAssetPackDetailInfo(CacheEntryPtr &entry, Ogre::DataStreamPtr ds)
void LoadModCache(CacheValidity validity)
CacheValidity LoadCacheFileJson()
void DeleteResourceBundleByFilename(const std::string &bundle_filename)
Deletes all CacheEntries which share the given resource bundle (ZIP or directory).
ActorType
< Aka 'Driveable'
Definition SimData.h:81
std::shared_ptr< Document > DocumentPtr
CacheValidity
LoaderType
< Search mode for ModCache::Query() & Operation mode for GUI::MainSelector
@ LT_None
CreateProjectRequestType
@ SAVE_TUNEUP
Dumps .tuneup file with CID_Tuneup from source actor, will not overwrite existing unless explicitly i...
@ DEFAULT
Copy files from source mod. Source mod Determines mod file extension.
@ ACTOR_PROJECT
Like DEFAULT but fixes up name + category in the truckfile.
ModifyProjectRequestType
@ TUNEUP_PROTECTED_WHEEL_RESET
'subject_id' is wheel ID.
@ TUNEUP_FORCED_VCAM_ROLE_RESET
'subject_id' is video camera ID.
@ TUNEUP_FORCEREMOVE_MANAGEDMAT_RESET
'subject' is managed material name.
@ TUNEUP_FORCEREMOVE_FLEXBODY_SET
'subject_id' is flexbody ID.
@ TUNEUP_PROTECTED_WHEEL_SET
'subject_id' is wheel ID.
@ TUNEUP_PROTECTED_MANAGEDMAT_SET
'subject' is managed material name.
@ TUNEUP_FORCEREMOVE_EXHAUST_SET
'subject_id' is exhaust ID.
@ TUNEUP_USE_ADDONPART_RESET
'subject' is addonpart filename.
@ TUNEUP_PROTECTED_PROP_SET
'subject_id' is prop ID.
@ TUNEUP_USE_ADDONPART_SET
'subject' is addonpart filename.
@ TUNEUP_FORCEREMOVE_PROP_SET
'subject_id' is prop ID.
@ TUNEUP_PROTECTED_EXHAUST_SET
'subject_id' is exhaust ID.
@ TUNEUP_PROTECTED_FLARE_SET
'subject_id' is flare ID.
@ TUNEUP_FORCED_WHEEL_SIDE_RESET
'subject_id' is wheel ID.
@ TUNEUP_FORCEREMOVE_MANAGEDMAT_SET
'subject' is managed material name.
@ TUNEUP_PROTECTED_FLEXBODY_RESET
'subject_id' is flexbody ID.
@ TUNEUP_PROTECTED_FLEXBODY_SET
'subject_id' is flexbody ID.
@ TUNEUP_FORCED_WHEEL_SIDE_SET
'subject_id' is wheel ID, 'value_int' is RoR::WheelSide
@ ACTOR_UPDATE_DEF_DOCUMENT
'subject' is empty; 'target_actor' is the actual subject. Propagates modifications from the live acto...
@ TUNEUP_PROTECTED_EXHAUST_RESET
'subject_id' is exhaust ID.
@ TUNEUP_PROTECTED_MANAGEDMAT_RESET
'subject' is managed material name.
@ TUNEUP_FORCED_VCAM_ROLE_SET
'subject_id' is video camera ID, 'value_int' is RoR::VideoCamRole
@ PROJECT_RESET_TUNEUP
'subject' is empty. This resets the auto-generated tuneup to orig. values.
@ TUNEUP_FORCEREMOVE_FLARE_RESET
'subject_id' is flare ID.
@ TUNEUP_PROTECTED_PROP_RESET
'subject_id' is prop ID.
@ TUNEUP_FORCEREMOVE_FLEXBODY_RESET
'subject_id' is flexbody ID.
@ TUNEUP_FORCEREMOVE_PROP_RESET
'subject_id' is prop ID.
@ TUNEUP_PROTECTED_FLARE_RESET
'subject_id' is flare ID.
@ TUNEUP_FORCEREMOVE_EXHAUST_RESET
'subject_id' is exhaust ID.
@ PROJECT_LOAD_TUNEUP
'subject' is tuneup filename. This overwrites the auto-generated tuneup with the save.
@ TUNEUP_FORCEREMOVE_FLARE_SET
'subject_id' is flare ID.
CacheSearchMethod
@ AUTHORS
Partial match in: author name/email.
@ FILENAME
Partial match in file name.
@ WHEELS
Wheel configuration, i.e. 4x4.
@ GUID
Partial match in: guid.
@ NONE
Ignore the search string and find all.
@ FULLTEXT
Partial match in: name, filename, description, author name/mail.
std::shared_ptr< Terrn2Document > Terrn2DocumentPtr
int CacheEntryID_t
index to CacheSystem::m_cache_entries, use RoR::CACHEENTRYNUM_INVALID as empty value.
@ CID_GadgetsActor
@ CID_Unsorted
@ CID_Projects
For truck files under 'projects/' directory, to allow listing from editors.
@ CID_GadgetsGeneric
@ CID_Fresh
@ CID_GadgetsTerrain
@ CID_Hidden
@ CID_Tuneups
For unsorted tuneup files.
@ CID_All
RefCountingObjectPtr< CacheEntry > CacheEntryPtr
std::shared_ptr< SkinDocument > SkinDocumentPtr
Ogre::String type
Definition CacheSystem.h:50
Ogre::String name
Definition CacheSystem.h:51
Ogre::String email
Definition CacheSystem.h:52
std::string cqy_filter_target_filename
Exact match (case-insensitive); leave empty to disable (currently only used with addonparts)
std::string cqy_filter_guid
Exact match (case-insensitive); leave empty to disable.
std::map< int, size_t > cqy_res_category_usage
Total usage (ignores search params + category filter)
std::time_t cqy_res_last_update
std::string cqy_search_string
CacheSearchMethod cqy_search_method
std::vector< CacheQueryResult > cqy_results
RoR::LoaderType cqy_filter_type
CacheEntryPtr cqr_entry
bool operator<(CacheQueryResult const &other) const
Creates subdirectory in 'My Games\Rigs of Rods\projects', pre-populates it with files and adds modcac...
std::string cpr_description
Optional, implemented for tuneups.
CreateProjectRequestType cpr_type
CacheEntryPtr cpr_source_entry
The original mod to copy files from.
std::string cpr_name
Directory and also the mod file (without extension).
ActorPtr cpr_source_actor
Only for type SAVE_TUNEUP
ModifyProjectRequestType mpr_type