132 lines
3.1 KiB
C
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);
|