├── FUNDING.yml ├── .gitattributes ├── package.json ├── README.md ├── .gitignore └── app.js /FUNDING.yml: -------------------------------------------------------------------------------- 1 | ko_fi: mmleczek 2 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mmVehiclesMetaMerger", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "app.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "mmleczek ", 10 | "license": "ISC", 11 | "dependencies": { 12 | "cli-table": "^0.3.11", 13 | "glob": "^7.2.0", 14 | "pkg": "^5.5.2", 15 | "prettytable": "^0.3.1", 16 | "readline": "^1.3.0", 17 | "xml2js": "^0.5.0" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # mmVehiclesMetaMerger 2 | Tool made to easily merge multiple GTA5 vehicle meta files. 3 | 4 | # Showcase 5 | Go to [Youtube video](https://youtu.be/YJn6Eea5Zrs). 6 | 7 | # Download 8 | Click [here](https://github.com/mmleczek/mmVehiclesMetaMerger/releases) to go to the releases page and download it. 9 | 10 | # License (custom one) 11 | You are allowed to edit this program, just do it as a GitHub fork. If you want to add new features, feel free to PR them. 12 | Please, do not claim my work as yours, put link to my GitHub profile in readme file. 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # parcel-bundler cache (https://parceljs.org/) 61 | .cache 62 | 63 | # next.js build output 64 | .next 65 | 66 | # nuxt.js build output 67 | .nuxt 68 | 69 | # vuepress build output 70 | .vuepress/dist 71 | 72 | # Serverless directories 73 | .serverless 74 | 75 | # FuseBox cache 76 | .fusebox/ 77 | app-linux 78 | app-macos 79 | *.meta 80 | *.exe 81 | output/*.meta 82 | output/*.txt 83 | errors.txt 84 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const path = require("path"); 3 | const xml2js = require("xml2js"); 4 | const rl = require("readline"); 5 | const Table = require("cli-table"); 6 | const colors = require("colors"); 7 | const glob = require("glob"); 8 | const parser = new xml2js.Parser(); 9 | 10 | const rli = rl.createInterface({ 11 | input: process.stdin, 12 | output: process.stdout 13 | }); 14 | 15 | let table = new Table({}); 16 | 17 | table.push( 18 | [ 1, "Merge vehicles.meta" ], 19 | [ 2, "Merge carcols.meta" ], 20 | [ 3, "Merge carvariations.meta" ], 21 | [ 4, "Merge handling.meta" ], 22 | [ 5, "Merge vehiclelayouts.meta" ], 23 | [ 6, "Merge all of the above".cyan ], 24 | [ 7, "Import all vehicles.meta files from directory".magenta ], 25 | [ 8, "Import all carcols.meta files from directory".magenta ], 26 | [ 9, "Import all carvariations.meta files from directory".magenta ], 27 | [ 10, "Import all handling.meta files from directory".magenta ], 28 | [ 11, "Import all vehiclelayouts.meta files from directory".magenta ], 29 | [ 12, "Import all of the above from directory".magenta ], 30 | [ 13, "Import other files from directory by search query".magenta ], 31 | [ 14, "Extract model names from vehicles.meta files".green ], 32 | [ 15, "Exit".red ], 33 | ); 34 | 35 | console.log(`mmVehiclesMetaMerger by ${"mmleczek.com".cyan} for ${"reective.com".cyan}`); 36 | 37 | ProgramStart(); 38 | 39 | function ProgramStart() { 40 | if (!fs.existsSync(`${getDir()}/vehicles_meta`)) fs.mkdirSync(`${getDir()}/vehicles_meta`, { recursive: true }); 41 | if (!fs.existsSync(`${getDir()}/carcols_meta`)) fs.mkdirSync(`${getDir()}/carcols_meta`, { recursive: true }); 42 | if (!fs.existsSync(`${getDir()}/carvariations_meta`)) fs.mkdirSync(`${getDir()}/carvariations_meta`, { recursive: true }); 43 | if (!fs.existsSync(`${getDir()}/handling_meta`)) fs.mkdirSync(`${getDir()}/handling_meta`, { recursive: true }); 44 | if (!fs.existsSync(`${getDir()}/vehiclelayouts_meta`)) fs.mkdirSync(`${getDir()}/vehiclelayouts_meta`, { recursive: true }); 45 | if (!fs.existsSync(`${getDir()}/output`)) fs.mkdirSync(`${getDir()}/output`, { recursive: true }); 46 | AskForFileType(); 47 | } 48 | 49 | function AskForFileType() { 50 | console.log(table.toString()); 51 | rli.question("Choose action (1 - 15): ", async (answer) => { 52 | if (Number(answer)) { 53 | console.log(answer); 54 | let a = Number(answer); 55 | if (a > 0 && a <= 15) { 56 | if (a == 1) { 57 | VehiclesMetaProcedure().then(() => AskForFileType()); 58 | } else if (a == 2) { 59 | CarcolsMetaProcedure().then(() => AskForFileType()); 60 | } else if (a == 3) { 61 | CarvariationsMetaProcedure().then(() => AskForFileType()); 62 | } else if (a == 4) { 63 | HandlingMetaProcedure().then(() => AskForFileType()); 64 | } else if (a == 5) { 65 | VehicleLayoutsMetaProcedure().then(() => AskForFileType()); 66 | } else if (a == 6) { 67 | await VehiclesMetaProcedure(); 68 | await CarcolsMetaProcedure(); 69 | await CarvariationsMetaProcedure(); 70 | await HandlingMetaProcedure(); 71 | await VehicleLayoutsMetaProcedure(); 72 | AskForFileType() 73 | } else if (a >= 7 && a < 13) { 74 | rli.question("Path to directory: ", async (path_) => { 75 | if (a == 7) { 76 | ImportVehiclesMetaFromDir(path_).then(() => AskForFileType()).catch((e) => { 77 | console.log(e); 78 | setTimeout(() => AskForFileType(), 1000); 79 | }); 80 | } else if (a == 8) { 81 | ImportCarcolsMetaFromDir(path_).then(() => AskForFileType()).catch((e) => { 82 | console.log(e); 83 | setTimeout(() => AskForFileType(), 1000); 84 | }); 85 | } else if (a == 9) { 86 | ImportCarvariationsMetaFromDir(path_).then(() => AskForFileType()).catch((e) => { 87 | console.log(e); 88 | setTimeout(() => AskForFileType(), 1000); 89 | }); 90 | } else if (a == 10) { 91 | ImportHandlingMetaFromDir(path_).then(() => AskForFileType()).catch((e) => { 92 | console.log(e); 93 | setTimeout(() => AskForFileType(), 1000); 94 | }); 95 | } else if (a == 11) { 96 | ImportVehicleLayoutsMetaFromDir(path_).then(() => AskForFileType()).catch((e) => { 97 | console.log(e); 98 | setTimeout(() => AskForFileType(), 1000); 99 | }); 100 | } else if (a == 12) { 101 | await ImportVehiclesMetaFromDir(path_).catch((e) => console.log(e)); 102 | await ImportCarcolsMetaFromDir(path_).catch((e) => console.log(e)); 103 | await ImportCarvariationsMetaFromDir(path_).catch((e) => console.log(e)); 104 | await ImportHandlingMetaFromDir(path_).catch((e) => console.log(e)); 105 | await ImportVehicleLayoutsMetaFromDir(path_).catch((e) => console.log(e)); 106 | AskForFileType(); 107 | } 108 | }); 109 | } else if (a == 13) { 110 | await ImportFileByQueryFromDir().catch((e) => console.log(e)); 111 | setTimeout(() => AskForFileType(), 1000); 112 | } else if (a == 14) { 113 | await ExtractModelNamesFromVehiclesMeta().catch((e) => console.log(e)); 114 | setTimeout(() => AskForFileType(), 1000); 115 | } else if (a == 15) { 116 | process.exit(0); 117 | } 118 | } else { 119 | console.log("Wrong number, program only accept number in range from 1 to 13.".red); 120 | console.log("\n"); 121 | AskForFileType(); 122 | } 123 | } else { 124 | console.log("Wrong number, try again".red); 125 | console.log("\n"); 126 | AskForFileType(); 127 | } 128 | }); 129 | } 130 | 131 | function ExtractModelNamesFromVehiclesMeta() { 132 | let e = new Promise(function(resolve, reject) { 133 | console.log("Extracting model names from vehicles.meta files...".cyan); 134 | GetFiles(`${getDir()}/vehicles_meta`, function(files) { 135 | ExtractModelNamesVehicleMetas(files); 136 | resolve(); 137 | }); 138 | }); 139 | return e; 140 | } 141 | 142 | function VehiclesMetaProcedure() { 143 | let e = new Promise(function(resolve, reject) { 144 | console.log("Merging all vehicles.meta files...".cyan); 145 | GetFiles(`${getDir()}/vehicles_meta`, function(files) { 146 | MergeVehicleMetas(files); 147 | resolve(); 148 | }); 149 | }); 150 | return e; 151 | } 152 | 153 | function CarcolsMetaProcedure() { 154 | let e = new Promise(function(resolve, reject) { 155 | console.log("Merging all carcols.meta files...".cyan); 156 | GetFiles(`${getDir()}/carcols_meta`, function(files) { 157 | MergeCarcolsMetas(files); 158 | resolve(); 159 | }); 160 | }); 161 | return e; 162 | } 163 | 164 | function CarvariationsMetaProcedure() { 165 | let e = new Promise(function(resolve, reject) { 166 | console.log("Merging all carvariations.meta files...".cyan); 167 | GetFiles(`${getDir()}/carvariations_meta`, function(files) { 168 | MergeCarvariationsMetas(files); 169 | resolve(); 170 | }); 171 | }); 172 | return e; 173 | } 174 | 175 | function HandlingMetaProcedure() { 176 | let e = new Promise(function(resolve, reject) { 177 | console.log("Merging all handling.meta files...".cyan); 178 | GetFiles(`${getDir()}/handling_meta`, function(files) { 179 | MergeHandlingMetas(files); 180 | resolve(); 181 | }); 182 | }); 183 | return e; 184 | } 185 | 186 | function VehicleLayoutsMetaProcedure() { 187 | let e = new Promise(function(resolve, reject) { 188 | console.log("Merging all vehiclelayouts.meta files...".cyan); 189 | GetFiles(`${getDir()}/vehiclelayouts_meta`, function(files) { 190 | MergeVehicleLayoutsMetas(files); 191 | resolve(); 192 | }); 193 | }); 194 | return e; 195 | } 196 | 197 | function ParseXML(data) { 198 | let e = new Promise(function(resolve, reject) { 199 | parser.parseString(data, function (err, result) { 200 | if (err) reject(err); 201 | else resolve(result); 202 | }); 203 | }); 204 | 205 | return e; 206 | } 207 | 208 | function GetFiles(path, cb) { 209 | let files_status = {} 210 | let files_to_merge = []; 211 | 212 | fs.readdir(path, async (err, files) => { 213 | if (err) console.error(err); 214 | else { 215 | if (files.length) { 216 | fs.writeFileSync(`${getDir()}/errors.txt`, ""); 217 | files.forEach(file => { files_status[file] = false; }); 218 | 219 | for (let i = 0; i < files.length; i++) { 220 | const file = files[i]; 221 | const data = await fs.promises.readFile(`${path}/${file}`); 222 | await ParseXML(data).then((result) => { 223 | files_to_merge.push(result); 224 | files_status[file] = true; 225 | if (IsEveryObjectTrue(files_status)) cb(files_to_merge); 226 | else { 227 | if (files.length == (i+1)) 228 | rli.question("Error occured, fix it before merging files. Press ENTER to exit.".red, (answer) => { 229 | rli.close; 230 | process.exit(0); 231 | }); 232 | } 233 | }).catch((e) => { 234 | console.log(`There was an error in file ${file}`.red); 235 | console.error(e); 236 | fs.appendFileSync(`${getDir()}/errors.txt`, `There was an error in file ${file}\n${e}\n\n`); 237 | }); 238 | }; 239 | } else { 240 | console.log(`There were not any files in given path: ${path}`.yellow) 241 | cb([]); 242 | } 243 | } 244 | }); 245 | } 246 | 247 | function ExtractModelNamesVehicleMetas(files) { 248 | if (files.length > 0) { 249 | let modelNames = ""; 250 | 251 | for (let i = 0; i < files.length; i++) { 252 | for (let j = 0; j < files[i].CVehicleModelInfo__InitDataList.InitDatas.length; j++) { 253 | if (typeof files[i].CVehicleModelInfo__InitDataList.InitDatas[j] == "object") { 254 | let obj = files[i].CVehicleModelInfo__InitDataList.InitDatas[j]; 255 | if (obj.Item && obj.Item[0] && obj.Item[0].modelName && obj.Item[0].modelName[0]) 256 | modelNames += `${obj.Item[0].modelName[0]}\n`; 257 | } 258 | } 259 | } 260 | 261 | fs.writeFileSync(`${getDir()}/output/exportedModelNames.txt`, modelNames); 262 | console.log("Extracting model names from vehicles.meta files done!".green); 263 | } 264 | } 265 | 266 | function MergeVehicleMetas(files) { 267 | if (files.length > 0) { 268 | let o = JSON.parse(JSON.stringify(files[0])); 269 | 270 | if (o.CVehicleModelInfo__InitDataList.InitDatas == undefined || o.CVehicleModelInfo__InitDataList.InitDatas == "") o.CVehicleModelInfo__InitDataList.InitDatas = []; 271 | if (o.CVehicleModelInfo__InitDataList.txdRelationships == undefined || o.CVehicleModelInfo__InitDataList.txdRelationships == "") o.CVehicleModelInfo__InitDataList.txdRelationships = []; 272 | 273 | for (let i = 1; i < files.length; i++) { 274 | for (let j = 0; j < files[i].CVehicleModelInfo__InitDataList.InitDatas.length; j++) { 275 | if (typeof files[i].CVehicleModelInfo__InitDataList.InitDatas[j] == "object") 276 | o.CVehicleModelInfo__InitDataList.InitDatas.push(files[i].CVehicleModelInfo__InitDataList.InitDatas[j]); 277 | } 278 | 279 | if (files[i].CVehicleModelInfo__InitDataList.txdRelationships) { 280 | for (let j = 0; j < files[i].CVehicleModelInfo__InitDataList.txdRelationships.length; j++) { 281 | if (typeof files[i].CVehicleModelInfo__InitDataList.txdRelationships[j] == "object") 282 | o.CVehicleModelInfo__InitDataList.txdRelationships.push(files[i].CVehicleModelInfo__InitDataList.txdRelationships[j]); 283 | } 284 | } 285 | } 286 | 287 | if (o.CVehicleModelInfo__InitDataList.InitDatas.length == 0) o.CVehicleModelInfo__InitDataList.InitDatas.push({}); 288 | if (o.CVehicleModelInfo__InitDataList.txdRelationships.length == 0) o.CVehicleModelInfo__InitDataList.txdRelationships.push({}); 289 | 290 | let builder = new xml2js.Builder(); 291 | let xml = builder.buildObject(o).toString(); 292 | 293 | xml = removeDuplicated("InitDatas", xml) 294 | xml = removeDuplicated("txdRelationships", xml) 295 | 296 | fs.writeFileSync(`${getDir()}/output/vehicles.meta`, xml); 297 | console.log("Merging all vehicles.meta files done!".green); 298 | } 299 | } 300 | 301 | function MergeCarcolsMetas(files) { 302 | if (files.length > 0) { 303 | let o = JSON.parse(JSON.stringify(files[0])); 304 | 305 | if (o.CVehicleModelInfoVarGlobal.Kits == undefined || o.CVehicleModelInfoVarGlobal.Kits == "") o.CVehicleModelInfoVarGlobal.Kits = []; 306 | if (o.CVehicleModelInfoVarGlobal.Lights == undefined || o.CVehicleModelInfoVarGlobal.Lights == "") o.CVehicleModelInfoVarGlobal.Lights = []; 307 | if (o.CVehicleModelInfoVarGlobal.Sirens == undefined || o.CVehicleModelInfoVarGlobal.Sirens == "") o.CVehicleModelInfoVarGlobal.Sirens = []; 308 | 309 | for (let i = 1; i < files.length; i++) { 310 | if (files[i].CVehicleModelInfoVarGlobal.Kits != undefined) { 311 | for (let j = 0; j < files[i].CVehicleModelInfoVarGlobal.Kits.length; j++) { 312 | if (typeof files[i].CVehicleModelInfoVarGlobal.Kits[j] == "object") 313 | o.CVehicleModelInfoVarGlobal.Kits.push(files[i].CVehicleModelInfoVarGlobal.Kits[j]); 314 | } 315 | } 316 | 317 | if (files[i].CVehicleModelInfoVarGlobal.Lights != undefined) { 318 | for (let j = 0; j < files[i].CVehicleModelInfoVarGlobal.Lights.length; j++) { 319 | if (typeof files[i].CVehicleModelInfoVarGlobal.Lights[j] == "object") 320 | o.CVehicleModelInfoVarGlobal.Lights.push(files[i].CVehicleModelInfoVarGlobal.Lights[j]); 321 | } 322 | } 323 | 324 | if (files[i].CVehicleModelInfoVarGlobal.Sirens != undefined) { 325 | for (let j = 0; j < files[i].CVehicleModelInfoVarGlobal.Sirens.length; j++) { 326 | if (typeof files[i].CVehicleModelInfoVarGlobal.Sirens[j] == "object") 327 | o.CVehicleModelInfoVarGlobal.Sirens.push(files[i].CVehicleModelInfoVarGlobal.Sirens[j]); 328 | } 329 | } 330 | } 331 | 332 | if (o.CVehicleModelInfoVarGlobal.Kits.length == 0) o.CVehicleModelInfoVarGlobal.Kits.push({}); 333 | if (o.CVehicleModelInfoVarGlobal.Lights.length == 0) o.CVehicleModelInfoVarGlobal.Lights.push({}); 334 | if (o.CVehicleModelInfoVarGlobal.Sirens.length == 0) o.CVehicleModelInfoVarGlobal.Sirens.push({}); 335 | 336 | let builder = new xml2js.Builder(); 337 | let xml = builder.buildObject(o).toString(); 338 | 339 | if (o.CVehicleModelInfoVarGlobal.Kits.length > 1) xml = removeDuplicated("Kits", xml); 340 | if (o.CVehicleModelInfoVarGlobal.Lights.length > 1) xml = removeDuplicated("Lights", xml); 341 | if (o.CVehicleModelInfoVarGlobal.Sirens.length > 1) xml = removeDuplicated("Sirens", xml); 342 | 343 | fs.writeFileSync(`${getDir()}/output/carcols.meta`, xml); 344 | console.log("Merging all carcols.meta files done!".green); 345 | } 346 | } 347 | 348 | function MergeCarvariationsMetas(files) { 349 | if (files.length > 0) { 350 | let o = JSON.parse(JSON.stringify(files[0])); 351 | 352 | if (o.CVehicleModelInfoVariation.variationData == undefined || o.CVehicleModelInfoVariation.variationData == "") o.CVehicleModelInfoVariation.variationData = []; 353 | 354 | for (let i = 1; i < files.length; i++) { 355 | if (files[i].CVehicleModelInfoVariation.variationData != undefined) { 356 | for (let j = 0; j < files[i].CVehicleModelInfoVariation.variationData.length; j++) { 357 | if (typeof files[i].CVehicleModelInfoVariation.variationData[j] == "object") 358 | o.CVehicleModelInfoVariation.variationData.push(files[i].CVehicleModelInfoVariation.variationData[j]); 359 | } 360 | } 361 | } 362 | 363 | if (o.CVehicleModelInfoVariation.variationData.length == 0) o.CVehicleModelInfoVariation.variationData.push({}); 364 | 365 | let builder = new xml2js.Builder(); 366 | let xml = builder.buildObject(o).toString(); 367 | 368 | xml = removeDuplicated("variationData", xml); 369 | fs.writeFileSync(`${getDir()}/output/carvariations.meta`, xml); 370 | console.log("Merging all carvariations.meta files done!".green); 371 | } 372 | } 373 | 374 | function MergeHandlingMetas(files) { 375 | if (files.length > 0) { 376 | let o = JSON.parse(JSON.stringify(files[0])); 377 | 378 | if (o.CHandlingDataMgr.HandlingData == undefined || o.CHandlingDataMgr.HandlingData == "") o.CHandlingDataMgr.HandlingData = []; 379 | 380 | for (let i = 1; i < files.length; i++) { 381 | if (files[i].CHandlingDataMgr.HandlingData != undefined) { 382 | for (let j = 0; j < files[i].CHandlingDataMgr.HandlingData.length; j++) { 383 | if (typeof files[i].CHandlingDataMgr.HandlingData[j] == "object") 384 | o.CHandlingDataMgr.HandlingData.push(files[i].CHandlingDataMgr.HandlingData[j]); 385 | } 386 | } 387 | } 388 | 389 | if (o.CHandlingDataMgr.HandlingData.length == 0) o.CHandlingDataMgr.HandlingData.push({}); 390 | 391 | let builder = new xml2js.Builder(); 392 | let xml = builder.buildObject(o).toString(); 393 | 394 | xml = removeDuplicated("HandlingData", xml); 395 | fs.writeFileSync(`${getDir()}/output/handling.meta`, xml); 396 | console.log("Merging all handling.meta files done!".green); 397 | } 398 | } 399 | 400 | function MergeVehicleLayoutsMetas(files) { 401 | if (files.length > 0) { 402 | let o = JSON.parse(JSON.stringify(files[0])); 403 | 404 | if (o.CVehicleMetadataMgr.AnimRateSets == undefined || o.CVehicleMetadataMgr.AnimRateSets == "") o.CVehicleMetadataMgr.AnimRateSets = []; 405 | if (o.CVehicleMetadataMgr.ClipSetMaps == undefined || o.CVehicleMetadataMgr.ClipSetMaps == "") o.CVehicleMetadataMgr.ClipSetMaps = []; 406 | if (o.CVehicleMetadataMgr.VehicleCoverBoundOffsetInfos == undefined || o.CVehicleMetadataMgr.VehicleCoverBoundOffsetInfos == "") o.CVehicleMetadataMgr.VehicleCoverBoundOffsetInfos = []; 407 | if (o.CVehicleMetadataMgr.BicycleInfos == undefined || o.CVehicleMetadataMgr.BicycleInfos == "") o.CVehicleMetadataMgr.BicycleInfos = []; 408 | if (o.CVehicleMetadataMgr.POVTuningInfos == undefined || o.CVehicleMetadataMgr.POVTuningInfos == "") o.CVehicleMetadataMgr.POVTuningInfos = []; 409 | if (o.CVehicleMetadataMgr.EntryAnimVariations == undefined || o.CVehicleMetadataMgr.EntryAnimVariations == "") o.CVehicleMetadataMgr.EntryAnimVariations = []; 410 | if (o.CVehicleMetadataMgr.VehicleExtraPointsInfos == undefined || o.CVehicleMetadataMgr.VehicleExtraPointsInfos == "") o.CVehicleMetadataMgr.VehicleExtraPointsInfos = []; 411 | if (o.CVehicleMetadataMgr.DrivebyWeaponGroups == undefined || o.CVehicleMetadataMgr.DrivebyWeaponGroups == "") o.CVehicleMetadataMgr.DrivebyWeaponGroups = []; 412 | if (o.CVehicleMetadataMgr.VehicleDriveByAnimInfos == undefined || o.CVehicleMetadataMgr.VehicleDriveByAnimInfos == "") o.CVehicleMetadataMgr.VehicleDriveByAnimInfos = []; 413 | if (o.CVehicleMetadataMgr.VehicleDriveByInfos == undefined || o.CVehicleMetadataMgr.VehicleDriveByInfos == "") o.CVehicleMetadataMgr.VehicleDriveByInfos = []; 414 | if (o.CVehicleMetadataMgr.VehicleSeatInfos == undefined || o.CVehicleMetadataMgr.VehicleSeatInfos == "") o.CVehicleMetadataMgr.VehicleSeatInfos = []; 415 | if (o.CVehicleMetadataMgr.VehicleSeatAnimInfos == undefined || o.CVehicleMetadataMgr.VehicleSeatAnimInfos == "") o.CVehicleMetadataMgr.VehicleSeatAnimInfos = []; 416 | if (o.CVehicleMetadataMgr.VehicleEntryPointInfos == undefined || o.CVehicleMetadataMgr.VehicleEntryPointInfos == "") o.CVehicleMetadataMgr.VehicleEntryPointInfos = []; 417 | if (o.CVehicleMetadataMgr.VehicleEntryPointAnimInfos == undefined || o.CVehicleMetadataMgr.VehicleEntryPointAnimInfos == "") o.CVehicleMetadataMgr.VehicleEntryPointAnimInfos = []; 418 | if (o.CVehicleMetadataMgr.VehicleExplosionInfos == undefined || o.CVehicleMetadataMgr.VehicleExplosionInfos == "") o.CVehicleMetadataMgr.VehicleExplosionInfos = []; 419 | if (o.CVehicleMetadataMgr.VehicleLayoutInfos == undefined || o.CVehicleMetadataMgr.VehicleLayoutInfos == "") o.CVehicleMetadataMgr.VehicleLayoutInfos = []; 420 | if (o.CVehicleMetadataMgr.VehicleScenarioLayoutInfos == undefined || o.CVehicleMetadataMgr.VehicleScenarioLayoutInfos == "") o.CVehicleMetadataMgr.VehicleScenarioLayoutInfos = []; 421 | if (o.CVehicleMetadataMgr.SeatOverrideAnimInfos == undefined || o.CVehicleMetadataMgr.SeatOverrideAnimInfos == "") o.CVehicleMetadataMgr.SeatOverrideAnimInfos = []; 422 | if (o.CVehicleMetadataMgr.InVehicleOverrideInfos == undefined || o.CVehicleMetadataMgr.InVehicleOverrideInfos == "") o.CVehicleMetadataMgr.InVehicleOverrideInfos = []; 423 | if (o.CVehicleMetadataMgr.FirstPersonDriveByLookAroundData == undefined || o.CVehicleMetadataMgr.FirstPersonDriveByLookAroundData == "") o.CVehicleMetadataMgr.FirstPersonDriveByLookAroundData = []; 424 | 425 | for (let i = 1; i < files.length; i++) { 426 | if (files[i].CVehicleMetadataMgr.AnimRateSets != undefined) { 427 | for (let j = 0; j < files[i].CVehicleMetadataMgr.AnimRateSets.length; j++) { 428 | if (typeof files[i].CVehicleMetadataMgr.AnimRateSets[j] == "object") 429 | o.CVehicleMetadataMgr.AnimRateSets.push(files[i].CVehicleMetadataMgr.AnimRateSets[j]); 430 | } 431 | } 432 | 433 | if (files[i].CVehicleMetadataMgr.ClipSetMaps != undefined) { 434 | for (let j = 0; j < files[i].CVehicleMetadataMgr.ClipSetMaps.length; j++) { 435 | if (typeof files[i].CVehicleMetadataMgr.ClipSetMaps[j] == "object") 436 | o.CVehicleMetadataMgr.ClipSetMaps.push(files[i].CVehicleMetadataMgr.ClipSetMaps[j]); 437 | } 438 | } 439 | 440 | if (files[i].CVehicleMetadataMgr.VehicleCoverBoundOffsetInfos != undefined) { 441 | for (let j = 0; j < files[i].CVehicleMetadataMgr.VehicleCoverBoundOffsetInfos.length; j++) { 442 | if (typeof files[i].CVehicleMetadataMgr.VehicleCoverBoundOffsetInfos[j] == "object") 443 | o.CVehicleMetadataMgr.VehicleCoverBoundOffsetInfos.push(files[i].CVehicleMetadataMgr.VehicleCoverBoundOffsetInfos[j]); 444 | } 445 | } 446 | 447 | if (files[i].CVehicleMetadataMgr.BicycleInfos != undefined) { 448 | for (let j = 0; j < files[i].CVehicleMetadataMgr.BicycleInfos.length; j++) { 449 | if (typeof files[i].CVehicleMetadataMgr.BicycleInfos[j] == "object") 450 | o.CVehicleMetadataMgr.BicycleInfos.push(files[i].CVehicleMetadataMgr.BicycleInfos[j]); 451 | } 452 | } 453 | 454 | if (files[i].CVehicleMetadataMgr.POVTuningInfos != undefined) { 455 | for (let j = 0; j < files[i].CVehicleMetadataMgr.POVTuningInfos.length; j++) { 456 | if (typeof files[i].CVehicleMetadataMgr.POVTuningInfos[j] == "object") 457 | o.CVehicleMetadataMgr.POVTuningInfos.push(files[i].CVehicleMetadataMgr.POVTuningInfos[j]); 458 | } 459 | } 460 | 461 | if (files[i].CVehicleMetadataMgr.EntryAnimVariations != undefined) { 462 | for (let j = 0; j < files[i].CVehicleMetadataMgr.EntryAnimVariations.length; j++) { 463 | if (typeof files[i].CVehicleMetadataMgr.EntryAnimVariations[j] == "object") 464 | o.CVehicleMetadataMgr.EntryAnimVariations.push(files[i].CVehicleMetadataMgr.EntryAnimVariations[j]); 465 | } 466 | } 467 | 468 | if (files[i].CVehicleMetadataMgr.VehicleExtraPointsInfos != undefined) { 469 | for (let j = 0; j < files[i].CVehicleMetadataMgr.VehicleExtraPointsInfos.length; j++) { 470 | if (typeof files[i].CVehicleMetadataMgr.VehicleExtraPointsInfos[j] == "object") 471 | o.CVehicleMetadataMgr.VehicleExtraPointsInfos.push(files[i].CVehicleMetadataMgr.VehicleExtraPointsInfos[j]); 472 | } 473 | } 474 | 475 | if (files[i].CVehicleMetadataMgr.DrivebyWeaponGroups != undefined) { 476 | for (let j = 0; j < files[i].CVehicleMetadataMgr.DrivebyWeaponGroups.length; j++) { 477 | if (typeof files[i].CVehicleMetadataMgr.DrivebyWeaponGroups[j] == "object") 478 | o.CVehicleMetadataMgr.DrivebyWeaponGroups.push(files[i].CVehicleMetadataMgr.DrivebyWeaponGroups[j]); 479 | } 480 | } 481 | 482 | if (files[i].CVehicleMetadataMgr.VehicleDriveByAnimInfos != undefined) { 483 | for (let j = 0; j < files[i].CVehicleMetadataMgr.VehicleDriveByAnimInfos.length; j++) { 484 | if (typeof files[i].CVehicleMetadataMgr.VehicleDriveByAnimInfos[j] == "object") 485 | o.CVehicleMetadataMgr.VehicleDriveByAnimInfos.push(files[i].CVehicleMetadataMgr.VehicleDriveByAnimInfos[j]); 486 | } 487 | } 488 | 489 | if (files[i].CVehicleMetadataMgr.VehicleDriveByInfos != undefined) { 490 | for (let j = 0; j < files[i].CVehicleMetadataMgr.VehicleDriveByInfos.length; j++) { 491 | if (typeof files[i].CVehicleMetadataMgr.VehicleDriveByInfos[j] == "object") 492 | o.CVehicleMetadataMgr.VehicleDriveByInfos.push(files[i].CVehicleMetadataMgr.VehicleDriveByInfos[j]); 493 | } 494 | } 495 | 496 | if (files[i].CVehicleMetadataMgr.VehicleSeatInfos != undefined) { 497 | for (let j = 0; j < files[i].CVehicleMetadataMgr.VehicleSeatInfos.length; j++) { 498 | if (typeof files[i].CVehicleMetadataMgr.VehicleSeatInfos[j] == "object") 499 | o.CVehicleMetadataMgr.VehicleSeatInfos.push(files[i].CVehicleMetadataMgr.VehicleSeatInfos[j]); 500 | } 501 | } 502 | 503 | if (files[i].CVehicleMetadataMgr.VehicleSeatAnimInfos != undefined) { 504 | for (let j = 0; j < files[i].CVehicleMetadataMgr.VehicleSeatAnimInfos.length; j++) { 505 | if (typeof files[i].CVehicleMetadataMgr.VehicleSeatAnimInfos[j] == "object") 506 | o.CVehicleMetadataMgr.VehicleSeatAnimInfos.push(files[i].CVehicleMetadataMgr.VehicleSeatAnimInfos[j]); 507 | } 508 | } 509 | 510 | if (files[i].CVehicleMetadataMgr.VehicleEntryPointInfos != undefined) { 511 | for (let j = 0; j < files[i].CVehicleMetadataMgr.VehicleEntryPointInfos.length; j++) { 512 | if (typeof files[i].CVehicleMetadataMgr.VehicleEntryPointInfos[j] == "object") 513 | o.CVehicleMetadataMgr.VehicleEntryPointInfos.push(files[i].CVehicleMetadataMgr.VehicleEntryPointInfos[j]); 514 | } 515 | } 516 | 517 | if (files[i].CVehicleMetadataMgr.VehicleEntryPointAnimInfos != undefined) { 518 | for (let j = 0; j < files[i].CVehicleMetadataMgr.VehicleEntryPointAnimInfos.length; j++) { 519 | if (typeof files[i].CVehicleMetadataMgr.VehicleEntryPointAnimInfos[j] == "object") 520 | o.CVehicleMetadataMgr.VehicleEntryPointAnimInfos.push(files[i].CVehicleMetadataMgr.VehicleEntryPointAnimInfos[j]); 521 | } 522 | } 523 | 524 | if (files[i].CVehicleMetadataMgr.VehicleExplosionInfos != undefined) { 525 | for (let j = 0; j < files[i].CVehicleMetadataMgr.VehicleExplosionInfos.length; j++) { 526 | if (typeof files[i].CVehicleMetadataMgr.VehicleExplosionInfos[j] == "object") 527 | o.CVehicleMetadataMgr.VehicleExplosionInfos.push(files[i].CVehicleMetadataMgr.VehicleExplosionInfos[j]); 528 | } 529 | } 530 | 531 | if (files[i].CVehicleMetadataMgr.VehicleLayoutInfos != undefined) { 532 | for (let j = 0; j < files[i].CVehicleMetadataMgr.VehicleLayoutInfos.length; j++) { 533 | if (typeof files[i].CVehicleMetadataMgr.VehicleLayoutInfos[j] == "object") 534 | o.CVehicleMetadataMgr.VehicleLayoutInfos.push(files[i].CVehicleMetadataMgr.VehicleLayoutInfos[j]); 535 | } 536 | } 537 | 538 | if (files[i].CVehicleMetadataMgr.VehicleScenarioLayoutInfos != undefined) { 539 | for (let j = 0; j < files[i].CVehicleMetadataMgr.VehicleScenarioLayoutInfos.length; j++) { 540 | if (typeof files[i].CVehicleMetadataMgr.VehicleScenarioLayoutInfos[j] == "object") 541 | o.CVehicleMetadataMgr.VehicleScenarioLayoutInfos.push(files[i].CVehicleMetadataMgr.VehicleScenarioLayoutInfos[j]); 542 | } 543 | } 544 | 545 | if (files[i].CVehicleMetadataMgr.SeatOverrideAnimInfos != undefined) { 546 | for (let j = 0; j < files[i].CVehicleMetadataMgr.SeatOverrideAnimInfos.length; j++) { 547 | if (typeof files[i].CVehicleMetadataMgr.SeatOverrideAnimInfos[j] == "object") 548 | o.CVehicleMetadataMgr.SeatOverrideAnimInfos.push(files[i].CVehicleMetadataMgr.SeatOverrideAnimInfos[j]); 549 | } 550 | } 551 | 552 | if (files[i].CVehicleMetadataMgr.InVehicleOverrideInfos != undefined) { 553 | for (let j = 0; j < files[i].CVehicleMetadataMgr.InVehicleOverrideInfos.length; j++) { 554 | if (typeof files[i].CVehicleMetadataMgr.InVehicleOverrideInfos[j] == "object") 555 | o.CVehicleMetadataMgr.InVehicleOverrideInfos.push(files[i].CVehicleMetadataMgr.InVehicleOverrideInfos[j]); 556 | } 557 | } 558 | 559 | if (files[i].CVehicleMetadataMgr.FirstPersonDriveByLookAroundData != undefined) { 560 | for (let j = 0; j < files[i].CVehicleMetadataMgr.FirstPersonDriveByLookAroundData.length; j++) { 561 | if (typeof files[i].CVehicleMetadataMgr.FirstPersonDriveByLookAroundData[j] == "object") 562 | o.CVehicleMetadataMgr.FirstPersonDriveByLookAroundData.push(files[i].CVehicleMetadataMgr.FirstPersonDriveByLookAroundData[j]); 563 | } 564 | } 565 | } 566 | 567 | if (o.CVehicleMetadataMgr.AnimRateSets.length == 0) o.CVehicleMetadataMgr.AnimRateSets.push({}); 568 | if (o.CVehicleMetadataMgr.ClipSetMaps.length == 0) o.CVehicleMetadataMgr.ClipSetMaps.push({}); 569 | if (o.CVehicleMetadataMgr.VehicleCoverBoundOffsetInfos.length == 0) o.CVehicleMetadataMgr.VehicleCoverBoundOffsetInfos.push({}); 570 | if (o.CVehicleMetadataMgr.BicycleInfos.length == 0) o.CVehicleMetadataMgr.BicycleInfos.push({}); 571 | if (o.CVehicleMetadataMgr.POVTuningInfos.length == 0) o.CVehicleMetadataMgr.POVTuningInfos.push({}); 572 | if (o.CVehicleMetadataMgr.EntryAnimVariations.length == 0) o.CVehicleMetadataMgr.EntryAnimVariations.push({}); 573 | if (o.CVehicleMetadataMgr.VehicleExtraPointsInfos.length == 0) o.CVehicleMetadataMgr.VehicleExtraPointsInfos.push({}); 574 | if (o.CVehicleMetadataMgr.DrivebyWeaponGroups.length == 0) o.CVehicleMetadataMgr.DrivebyWeaponGroups.push({}); 575 | if (o.CVehicleMetadataMgr.VehicleDriveByAnimInfos.length == 0) o.CVehicleMetadataMgr.VehicleDriveByAnimInfos.push({}); 576 | if (o.CVehicleMetadataMgr.VehicleDriveByInfos.length == 0) o.CVehicleMetadataMgr.VehicleDriveByInfos.push({}); 577 | if (o.CVehicleMetadataMgr.VehicleSeatInfos.length == 0) o.CVehicleMetadataMgr.VehicleSeatInfos.push({}); 578 | if (o.CVehicleMetadataMgr.VehicleSeatAnimInfos.length == 0) o.CVehicleMetadataMgr.VehicleSeatAnimInfos.push({}); 579 | if (o.CVehicleMetadataMgr.VehicleEntryPointInfos.length == 0) o.CVehicleMetadataMgr.VehicleEntryPointInfos.push({}); 580 | if (o.CVehicleMetadataMgr.VehicleEntryPointAnimInfos.length == 0) o.CVehicleMetadataMgr.VehicleEntryPointAnimInfos.push({}); 581 | if (o.CVehicleMetadataMgr.VehicleExplosionInfos.length == 0) o.CVehicleMetadataMgr.VehicleExplosionInfos.push({}); 582 | if (o.CVehicleMetadataMgr.VehicleLayoutInfos.length == 0) o.CVehicleMetadataMgr.VehicleLayoutInfos.push({}); 583 | if (o.CVehicleMetadataMgr.VehicleScenarioLayoutInfos.length == 0) o.CVehicleMetadataMgr.VehicleScenarioLayoutInfos.push({}); 584 | if (o.CVehicleMetadataMgr.SeatOverrideAnimInfos.length == 0) o.CVehicleMetadataMgr.SeatOverrideAnimInfos.push({}); 585 | if (o.CVehicleMetadataMgr.InVehicleOverrideInfos.length == 0) o.CVehicleMetadataMgr.InVehicleOverrideInfos.push({}); 586 | if (o.CVehicleMetadataMgr.FirstPersonDriveByLookAroundData.length == 0) o.CVehicleMetadataMgr.FirstPersonDriveByLookAroundData.push({}); 587 | 588 | let builder = new xml2js.Builder(); 589 | let xml = builder.buildObject(o).toString(); 590 | 591 | if (o.CVehicleMetadataMgr.AnimRateSets.length > 0) xml = removeDuplicated("AnimRateSets", xml); 592 | if (o.CVehicleMetadataMgr.ClipSetMaps.length > 0) xml = removeDuplicated("ClipSetMaps", xml); 593 | if (o.CVehicleMetadataMgr.VehicleCoverBoundOffsetInfos.length > 0) xml = removeDuplicated("VehicleCoverBoundOffsetInfos", xml); 594 | if (o.CVehicleMetadataMgr.BicycleInfos.length > 0) xml = removeDuplicated("BicycleInfos", xml); 595 | if (o.CVehicleMetadataMgr.POVTuningInfos.length > 0) xml = removeDuplicated("POVTuningInfos", xml); 596 | if (o.CVehicleMetadataMgr.EntryAnimVariations.length > 0) xml = removeDuplicated("EntryAnimVariations", xml); 597 | if (o.CVehicleMetadataMgr.VehicleExtraPointsInfos.length > 0) xml = removeDuplicated("VehicleExtraPointsInfos", xml); 598 | if (o.CVehicleMetadataMgr.DrivebyWeaponGroups.length > 0) xml = removeDuplicated("DrivebyWeaponGroups", xml); 599 | if (o.CVehicleMetadataMgr.VehicleDriveByAnimInfos.length > 0) xml = removeDuplicated("VehicleDriveByAnimInfos", xml); 600 | if (o.CVehicleMetadataMgr.VehicleDriveByInfos.length > 0) xml = removeDuplicated("VehicleDriveByInfos", xml); 601 | if (o.CVehicleMetadataMgr.VehicleSeatInfos.length > 0) xml = removeDuplicated("VehicleSeatInfos", xml); 602 | if (o.CVehicleMetadataMgr.VehicleSeatAnimInfos.length > 0) xml = removeDuplicated("VehicleSeatAnimInfos", xml); 603 | if (o.CVehicleMetadataMgr.VehicleEntryPointInfos.length > 0) xml = removeDuplicated("VehicleEntryPointInfos", xml); 604 | if (o.CVehicleMetadataMgr.VehicleEntryPointAnimInfos.length > 0) xml = removeDuplicated("VehicleEntryPointAnimInfos", xml); 605 | if (o.CVehicleMetadataMgr.VehicleExplosionInfos.length > 0) xml = removeDuplicated("VehicleExplosionInfos", xml); 606 | if (o.CVehicleMetadataMgr.VehicleLayoutInfos.length > 0) xml = removeDuplicated("VehicleLayoutInfos", xml); 607 | if (o.CVehicleMetadataMgr.VehicleScenarioLayoutInfos.length > 0) xml = removeDuplicated("VehicleScenarioLayoutInfos", xml); 608 | if (o.CVehicleMetadataMgr.SeatOverrideAnimInfos.length > 0) xml = removeDuplicated("SeatOverrideAnimInfos", xml); 609 | if (o.CVehicleMetadataMgr.InVehicleOverrideInfos.length > 0) xml = removeDuplicated("InVehicleOverrideInfos", xml); 610 | if (o.CVehicleMetadataMgr.FirstPersonDriveByLookAroundData.length > 0) xml = removeDuplicated("FirstPersonDriveByLookAroundData", xml); 611 | 612 | fs.writeFileSync(`${getDir()}/output/vehiclelayouts.meta`, xml); 613 | console.log("Merging all vehiclelayouts.meta files done!".green); 614 | } 615 | } 616 | 617 | function removeDuplicated(name, text) { 618 | let to_del = []; 619 | let lines = text.split(/\r?\n/); 620 | 621 | let firstInitData = false; 622 | 623 | for (let i = 0; i < lines.length; i++) { 624 | if (lines[i].includes(`<${name}>`)) { 625 | if (!firstInitData) firstInitData = true; 626 | else to_del.push(i); 627 | } 628 | } 629 | 630 | firstInitData = false; 631 | 632 | for (let i = lines.length-1; i > 0; i--) { 633 | if (lines[i].includes(``)) { 634 | if (!firstInitData) firstInitData = true; 635 | else to_del.push(i); 636 | } 637 | } 638 | 639 | to_del.sort((a, b) => { return b - a }); 640 | 641 | for (let i = 0; i < to_del.length; i++) { lines.splice(to_del[i], 1); } 642 | 643 | let x = ""; 644 | for (let i = 0; i < lines.length; i++) { x += `${lines[i].replace(" ", "").replace(` standalone="yes"`, "")}\n`; } 645 | 646 | return x 647 | } 648 | 649 | function IsEveryObjectTrue(key_val) { 650 | let _return = true; 651 | 652 | for (var key of Object.keys(key_val)) { 653 | if (key_val[key] == false) _return = false; 654 | } 655 | 656 | return _return; 657 | } 658 | 659 | function getDir() { 660 | if (process.pkg) { 661 | return path.resolve(process.execPath + "/.."); 662 | } else { 663 | return path.join(require.main ? require.main.path : process.cwd()); 664 | } 665 | } 666 | 667 | function ImportVehiclesMetaFromDir(directory) { 668 | let e = new Promise(function(resolve, reject) { 669 | console.log("Importing all vehicles.meta files...".magenta); 670 | fs.access(directory, (err) => { 671 | if (err) reject("Directory does not exist!".red); 672 | else { 673 | glob("**/vehicles.meta", { cwd: directory } , function (er, files) { 674 | if (er) reject(`Error occured during search for a files: ${er}`.red); 675 | for (let i = 0; i < files.length; i++) { 676 | fs.copyFile(path.join(directory, files[i]), `${getDir()}/vehicles_meta/vehicles${i}.meta`, (err) => { 677 | if (err) console.log(`Error occured during coping file:\nFrom: ${path.join(directory, files[i])}\nTo: ${`${getDir()}/vehicles_meta/vehicles${i}.meta`}`.red); 678 | }); 679 | } 680 | console.log("Importing all vehicles.meta files done!".magenta); 681 | resolve(); 682 | }); 683 | } 684 | }); 685 | }); 686 | return e; 687 | } 688 | 689 | function ImportCarcolsMetaFromDir(directory) { 690 | let e = new Promise(function(resolve, reject) { 691 | console.log("Importing all carcols.meta files...".magenta); 692 | fs.access(directory, (err) => { 693 | if (err) reject("Directory does not exist!".red); 694 | else { 695 | glob("**/carcols.meta", { cwd: directory } , function (er, files) { 696 | if (er) reject(`Error occured during search for a files: ${er}`.red); 697 | for (let i = 0; i < files.length; i++) { 698 | fs.copyFile(path.join(directory, files[i]), `${getDir()}/carcols_meta/carcols${i}.meta`, (err) => { 699 | if (err) console.log(`Error occured during coping file:\nFrom: ${path.join(directory, files[i])}\nTo: ${`${getDir()}/carcols_meta/carcols${i}.meta`}`.red); 700 | }); 701 | } 702 | console.log("Importing all carcols.meta files done!".magenta); 703 | resolve(); 704 | }); 705 | } 706 | }); 707 | }); 708 | return e; 709 | } 710 | 711 | function ImportCarvariationsMetaFromDir(directory) { 712 | let e = new Promise(function(resolve, reject) { 713 | console.log("Importing all carvariations.meta files...".magenta); 714 | fs.access(directory, (err) => { 715 | if (err) reject("Directory does not exist!".red); 716 | else { 717 | glob("**/carvariations.meta", { cwd: directory } , function (er, files) { 718 | if (er) reject(`Error occured during search for a files: ${er}`.red); 719 | for (let i = 0; i < files.length; i++) { 720 | fs.copyFile(path.join(directory, files[i]), `${getDir()}/carvariations_meta/carvariations${i}.meta`, (err) => { 721 | if (err) console.log(`Error occured during coping file:\nFrom: ${path.join(directory, files[i])}\nTo: ${`${getDir()}/carvariations_meta/carvariations${i}.meta`}`.red); 722 | }); 723 | } 724 | console.log("Importing all carvariations.meta files done!".magenta); 725 | resolve(); 726 | }); 727 | } 728 | }); 729 | }); 730 | return e; 731 | } 732 | 733 | function ImportHandlingMetaFromDir(directory) { 734 | let e = new Promise(function(resolve, reject) { 735 | console.log("Importing all handling.meta files...".magenta); 736 | fs.access(directory, (err) => { 737 | if (err) reject("Directory does not exist!".red); 738 | else { 739 | glob("**/handling.meta", { cwd: directory } , function (er, files) { 740 | if (er) reject(`Error occured during search for a files: ${er}`.red); 741 | for (let i = 0; i < files.length; i++) { 742 | fs.copyFile(path.join(directory, files[i]), `${getDir()}/handling_meta/handling${i}.meta`, (err) => { 743 | if (err) console.log(`Error occured during coping file:\nFrom: ${path.join(directory, files[i])}\nTo: ${`${getDir()}/handling_meta/handling${i}.meta`}`.red); 744 | }); 745 | } 746 | console.log("Importing all handling.meta files done!".magenta); 747 | resolve(); 748 | }); 749 | } 750 | }); 751 | }); 752 | return e; 753 | } 754 | 755 | function ImportVehicleLayoutsMetaFromDir(directory) { 756 | let e = new Promise(function(resolve, reject) { 757 | console.log("Importing all vehiclelayouts.meta files...".magenta); 758 | fs.access(directory, (err) => { 759 | if (err) reject("Directory does not exist!".red); 760 | else { 761 | glob("**/vehiclelayouts.meta", { cwd: directory } , function (er, files) { 762 | if (er) reject(`Error occured during search for a files: ${er}`.red); 763 | for (let i = 0; i < files.length; i++) { 764 | fs.copyFile(path.join(directory, files[i]), `${getDir()}/vehiclelayouts_meta/vehiclelayouts${i}.meta`, (err) => { 765 | if (err) console.log(`Error occured during coping file:\nFrom: ${path.join(directory, files[i])}\nTo: ${`${getDir()}/vehiclelayouts_meta/vehiclelayouts${i}.meta`}`.red); 766 | }); 767 | } 768 | console.log("Importing all vehiclelayouts.meta files done!".magenta); 769 | resolve(); 770 | }); 771 | } 772 | }); 773 | }); 774 | return e; 775 | } 776 | 777 | function ImportFileByQueryFromDir() { 778 | let e = new Promise(function(resolve, reject) { 779 | rli.question("Path to directory: ", (path_) => { 780 | fs.access(path_, (err) => { 781 | if (err) reject("Directory does not exist!".red); 782 | else { 783 | rli.question("Path to directory where to save files: ", (path_2) => { 784 | fs.access(path_2, (err2) => { 785 | if (err2) reject("Directory does not exist!".red); 786 | else { 787 | rli.question("Search query: ", (query) => { 788 | glob(query, { cwd: path_ } , function (er, files) { 789 | if (er) reject(`Error occured during search for a files: ${er}`.red); 790 | for (let i = 0; i < files.length; i++) { 791 | let file_path = path.join(path_, files[i]); 792 | let file_name = path.parse(file_path).name; 793 | let file_ext = path.parse(file_path).ext; 794 | let to_path = path.join(path_2, `${file_name}${file_ext}`); 795 | fs.copyFile(file_path, to_path, (err3) => { 796 | if (err3) console.log(`Error occured during coping file:\nFrom: ${file_path}\nTo: ${to_path}`.red); 797 | }); 798 | } 799 | console.log(`Importing all files by query: ${query} done!`.magenta); 800 | resolve(); 801 | }); 802 | }); 803 | } 804 | }); 805 | }); 806 | } 807 | }); 808 | }); 809 | }); 810 | return e; 811 | } --------------------------------------------------------------------------------