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

132 lines
3.1 KiB
C

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <stdlib.h>
#define PATH "plugins/samp-npcs/Paths/"
#define STATIC_ASSERT(E) typedef char __static_assert_[(E)?1:-1]
#define EXPECT_SIZE(S,SIZE) STATIC_ASSERT(sizeof(S)==(SIZE))
#pragma pack(push, 1)
struct SerializedHeader {
unsigned int num_nodes;
unsigned int num_vehicle_nodes;
unsigned int num_ped_nodes;
unsigned int num_nav_nodes;
unsigned int num_links;
};
struct SerializedPathNode {
unsigned int _mem_addr, _nulls;
short position_x, position_y, position_z;
short cost;
unsigned short link, area, node;
unsigned char width;
unsigned char flood_fill;
unsigned int flags;
};
struct SerializedNavNode {
short position_x, position_y;
unsigned short area, node;
char direction_x, direction_y;
unsigned int flags;
};
struct SerializedLink {
unsigned short area, node;
};
struct SerializedNavLink {
unsigned short nav_node : 10;
unsigned short area : 6;
};
struct SerializedLinkLength {
unsigned char length;
};
struct SerializedIntersectionFlags {
bool road_cross : 1;
bool ped_traffic_light : 1;
};
struct NodeFlags {
unsigned char link_count : 4;
unsigned char traffic_level : 2;
unsigned char roadblocks : 1;
unsigned char boats : 1;
unsigned char emergency_vehicles_only : 1;
unsigned char _unknown_D : 1;
unsigned char _unknown_E : 1;
unsigned char _unknown_F : 1;
unsigned char not_highway : 1;
unsigned char highway : 1;
unsigned char _unknown_I : 1;
unsigned char _unknown_J : 1;
unsigned char spawn_probability : 4;
unsigned char _unknown_roadblock_O : 1;
unsigned char parking : 1;
unsigned char _unknown_Q : 1;
unsigned char _unknown_R : 1;
unsigned char _unknown_S : 8;
};
EXPECT_SIZE(NodeFlags, 4);
struct NavNodeFlags {
unsigned int width : 8;
unsigned int num_left_lanes : 3;
unsigned int num_right_lanes : 3;
unsigned int traffic_lights_direction_behavior : 1;
unsigned int _unused_F : 1;
unsigned int traffic_lights_behavior : 2;
unsigned int train_crossing : 1;
unsigned int _unused_M : 13;
};
EXPECT_SIZE(NavNodeFlags, 4);
#pragma pack(pop)
struct PathNode {
float position_x, position_y, position_z;
short cost;
unsigned short link, area, node;
unsigned char width;
unsigned char flood_fill;
NodeFlags flags;
};
struct NavNode {
float position_x, position_y;
unsigned short area, node;
float direction_x, direction_y;
NavNodeFlags flags;
};
struct Link : SerializedLink {};
struct NavLink : SerializedNavLink {};
struct LinkLength : SerializedLinkLength {};
struct IntersectionFlags : SerializedIntersectionFlags {};
struct PathsData : SerializedHeader {
PathNode* pathNodes;
NavNode* navNodes;
Link* links;
NavLink* navLinks;
LinkLength* linkLengths;
IntersectionFlags* intersectionFlags;
};
extern PathsData pathsData;
void loadPaths();
void parsePathsFile(FILE* file, PathsData* pathsData);
SerializedHeader parseHeader(FILE* file);
void parseNode(FILE* file, PathNode* node);
void parseNav(FILE* file, NavNode* node);
void parseLink(FILE* file, Link* link);
void parseNavLink(FILE* file, NavLink* link);
void parseLinkLengths(FILE* file, LinkLength* length);
void parseIntersectionFlags(FILE* file, IntersectionFlags* flags);