Float:mtarad2deg(Float:radians) { if (radians == 0.0) { return 0.0; } new Float:retval = (360.0 + (radians / 0.0174532925)); while (retval >= 360.0) retval -= 360.0; while (retval < 0.0) retval += 360.0; return retval; } ParseMtaFile(filename[], slot) { if (!filename[0]) return 0; new File:map; if (!(map = fopen(filename, io_read))) return 0; new line[128]; new intag = 0; new Float:x , Float:y , Float:z ; new Float:rx, Float:ry, Float:rz; new model; new checkcount = 0; new objcount = 0; new startcount = 0; model = strfind(filename, "."); strmid(gRaceData[slot][NAME], filename, 14, model); model = 0; // MTA maps don't have name or lap information atm, assume they're all straight races gRaceData[slot][NUM_LAPS] = 0; while (fread(map, line)) { new index = 0; while (line[index] && line[index] < 'A') { index++; } if (!line[index]) continue; if (intag) { if (!strcmp(line[index], "object", true, 6)) { // We've collected all the data so create the object // NOTE: MTA map objects are in radians and we need degrees gRaceObjects[slot][objcount] = CreateVWDynamicObject(RACE_WORLD(slot), model, x, y, z, mtarad2deg(rx), mtarad2deg(ry), mtarad2deg(rz)); if (gRaceObjects[slot][objcount] != NO_OBJECT) objcount++; intag = 0; } else if (!strcmp(line[index], "checkpoint", true, 10)) { gRaceCheckpoints[slot][checkcount][0] = x; gRaceCheckpoints[slot][checkcount][1] = y; gRaceCheckpoints[slot][checkcount][2] = z; checkcount++; intag = 0; } else if (!strcmp(line[index], "spawnpoint", true, 10)) { gSpawnPoints[slot][startcount][0] = x; gSpawnPoints[slot][startcount][1] = y; gSpawnPoints[slot][startcount][2] = z; gSpawnPoints[slot][startcount][3] = rz; startcount++; intag = 0; } else if (!strcmp(line[index], "position", true, 8)) { // Set pos to the first position new pos = index + (8 + 1); // Get the position x = floatstr(line[pos++]); // Find the next point pos = strfind(line, " ", .pos = pos); // Repeat y = floatstr(line[pos++]); pos = strfind(line, " ", .pos = pos); z = floatstr(line[pos]); } else if (!strcmp(line[index], "rotation", true, 8)) { // Set pos to the first rotation new pos = index + (8 + 1); // Get the rotation (actually rz - they're backwards) rz = floatstr(line[pos++]); // Find the next point pos = strfind(line, " ", .pos = pos); // Repeat if (pos != -1) // Get start point single rotations { ry = floatstr(line[pos++]); pos = strfind(line, " ", .pos = pos); rx = floatstr(line[pos]); } } else if (!strcmp(line[index], "model", true, 5)) { // Get the model model = strval(line[index + (5 + 1)]); } } else { if (!strcmp(line[index], "object", true, 6) || !strcmp(line[index], "checkpoint", true, 10) || !strcmp(line[index], "spawnpoint", true, 10)) { // We've reached an object so start saving the data intag = 1; } } } gRaceData[slot][NUM_CHECKPOINTS] = checkcount; gRaceData[slot][NUM_OBJECTS] = objcount; gRaceData[slot][NUM_STARTS] = startcount; fclose(map); return 1; }