Files
samp-npcs/samp-npcs/paths.cpp
2020-12-27 02:11:48 +01:00

130 lines
3.9 KiB
C++

#include "paths.h"
#include <filesystem>
#include <regex>
PathsData pathsData;
void loadPaths() {
std::vector<FILE*> files;
for (const auto& entry : std::filesystem::directory_iterator(PATH)) {
const auto path = entry.path().string();
if (!std::regex_match(path, std::regex(".*NODES\\d{1,2}\\.DAT", std::regex_constants::icase)))
continue;
files.push_back(fopen(path.c_str(), "rb"));
}
for (FILE* file : files) {
SerializedHeader header = parseHeader(file);
pathsData.num_nodes += header.num_nodes;
pathsData.num_vehicle_nodes += header.num_vehicle_nodes;
pathsData.num_ped_nodes += header.num_ped_nodes;
pathsData.num_nav_nodes += header.num_nav_nodes;
pathsData.num_links += header.num_links;
fseek(file, 0, SEEK_SET);
}
pathsData.pathNodes = (PathNode*)malloc(pathsData.num_nodes * sizeof(PathNode));
pathsData.navNodes = (NavNode*)malloc(pathsData.num_nav_nodes * sizeof(NavNode));
pathsData.links = (Link*)malloc(pathsData.num_links * sizeof(Link));
pathsData.navLinks = (NavLink*)malloc(pathsData.num_links * sizeof(NavLink));
pathsData.linkLengths = (LinkLength*)malloc(pathsData.num_links * sizeof(LinkLength));
pathsData.intersectionFlags = (IntersectionFlags*)malloc(pathsData.num_links * sizeof(IntersectionFlags));
PathsData pathsDataPointers = pathsData;
for (FILE* file : files) {
parsePathsFile(file, &pathsDataPointers);
}
for (FILE* file : files) {
fclose(file);
}
}
void parsePathsFile(FILE* file, PathsData* pathsData) {
SerializedHeader header = parseHeader(file);
for (unsigned int i = 0; i < header.num_nodes; i++) {
parseNode(file, pathsData->pathNodes);
pathsData->pathNodes++;
}
for (unsigned int i = 0; i < header.num_nav_nodes; i++) {
parseNav(file, pathsData->navNodes);
pathsData->navNodes++;
}
for (unsigned int i = 0; i < header.num_links; i++) {
parseLink(file, pathsData->links);
pathsData->links++;
}
fseek(file, 768, SEEK_CUR); // Filler?
for (unsigned int i = 0; i < header.num_links; i++) {
parseNavLink(file, pathsData->navLinks);
pathsData->navLinks++;
}
for (unsigned int i = 0; i < header.num_links; i++) {
parseLinkLengths(file, pathsData->linkLengths);
pathsData->linkLengths++;
}
for (unsigned int i = 0; i < header.num_links; i++) {
parseIntersectionFlags(file, pathsData->intersectionFlags);
pathsData->intersectionFlags++;
}
}
SerializedHeader parseHeader(FILE* file) {
SerializedHeader header;
fread(&header, sizeof(header), 1, file);
return header;
}
void parseNode(FILE* file, PathNode* node) {
SerializedPathNode serializedNode;
fread(&serializedNode, sizeof(serializedNode), 1, file);
node->position_x = serializedNode.position_x / 8.f;
node->position_y = serializedNode.position_y / 8.f;
node->position_z = serializedNode.position_z / 8.f;
node->cost = serializedNode.cost;
node->link = serializedNode.link;
node->area = serializedNode.area;
node->node = serializedNode.node;
node->width = serializedNode.width;
node->flood_fill = serializedNode.flood_fill;
node->flags = *(NodeFlags*)&serializedNode.flags;
}
void parseNav(FILE* file, NavNode* node) {
SerializedNavNode serializedNode;
fread(&serializedNode, sizeof(serializedNode), 1, file);
node->position_x = serializedNode.position_x / 8.f;
node->position_y = serializedNode.position_y / 8.f;
node->area = serializedNode.area;
node->node = serializedNode.node;
node->direction_x = serializedNode.direction_x / 100.f;
node->direction_y = serializedNode.direction_y / 100.f;
node->flags = *(NavNodeFlags*)&serializedNode.flags;
}
void parseLink(FILE* file, Link* link) {
fread(link, sizeof(Link), 1, file);
}
void parseNavLink(FILE* file, NavLink* link) {
fread(link, sizeof(NavLink), 1, file);
}
void parseLinkLengths(FILE* file, LinkLength* length) {
fread(length, sizeof(LinkLength), 1, file);
}
void parseIntersectionFlags(FILE* file, IntersectionFlags* flags) {
fread(flags, sizeof(IntersectionFlags), 1, file);
}