Skip to main content

namigator_sys/
lib.rs

1#[cfg(test)]
2mod test;
3
4use core::ffi::{c_char, c_float, c_int, c_uchar, c_uint};
5
6#[repr(C)]
7#[derive(Debug)]
8pub struct Map {
9    _data: [u8; 0],
10    _marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
11}
12
13#[repr(C)]
14#[derive(Debug, Copy, Clone, PartialOrd, PartialEq, Default)]
15pub struct Vertex {
16    pub x: f32,
17    pub y: f32,
18    pub z: f32,
19}
20
21pub const SUCCESS: u8 = 0;
22pub const UNRECOGNIZED_EXTENSION: u8 = 1;
23pub const NO_MOGP_CHUNK: u8 = 2;
24pub const NO_MOPY_CHUNK: u8 = 3;
25pub const NO_MOVI_CHUNK: u8 = 4;
26pub const NO_MOVT_CHUNK: u8 = 5;
27pub const NO_MCNK_CHUNK: u8 = 6;
28
29pub const WDT_OPEN_FAILED: u8 = 7;
30pub const MPHD_NOT_FOUND: u8 = 8;
31pub const MAIN_NOT_FOUND: u8 = 9;
32pub const MDNM_NOT_FOUND: u8 = 10;
33pub const MONM_NOT_FOUND: u8 = 11;
34pub const MWMO_NOT_FOUND: u8 = 12;
35pub const MODF_NOT_FOUND: u8 = 13;
36
37pub const MVER_NOT_FOUND: u8 = 14;
38pub const MOMO_NOT_FOUND: u8 = 15;
39pub const MOHD_NOT_FOUND: u8 = 16;
40pub const MODS_NOT_FOUND: u8 = 17;
41pub const MODN_NOT_FOUND: u8 = 18;
42pub const MODD_NOT_FOUND: u8 = 19;
43
44pub const MHDR_NOT_FOUND: u8 = 20;
45
46pub const UNRECOGNIZED_DBC_FILE: u8 = 21;
47pub const FAILED_TO_OPEN_DBC: u8 = 22;
48
49pub const FAILED_TO_OPEN_ADT: u8 = 23;
50pub const ADT_VERSION_IS_INCORRECT: u8 = 24;
51pub const MVER_DOES_NOT_BEGIN_ADT_FILE: u8 = 25;
52
53pub const EMPTY_WMO_DOODAD_INSTANTIATED: u8 = 26;
54
55pub const FAILED_TO_OPEN_FILE_FOR_BINARY_STREAM: u8 = 27;
56
57pub const BAD_FORMAT_OF_GAMEOBJECT_FILE: u8 = 28;
58pub const FAILED_TO_OPEN_GAMEOBJECT_FILE: u8 = 29;
59pub const UNRECOGNIZED_MODEL_EXTENSION: u8 = 30;
60pub const GAME_OBJECT_REFERENCES_NON_EXISTENT_MODEL_ID: u8 = 31;
61
62pub const ADT_SERIALIZATION_FAILED_TO_OPEN_OUTPUT_FILE: u8 = 32;
63pub const WMO_SERIALIZATION_FAILED_TO_OPEN_OUTPUT_FILE: u8 = 33;
64
65pub const REQUESTED_BVH_NOT_FOUND: u8 = 34;
66pub const BVH_INDEX_FILE_NOT_FOUND: u8 = 35;
67
68pub const INCORRECT_FILE_SIGNATURE: u8 = 36;
69pub const INCORRECT_FILE_VERSION: u8 = 37;
70pub const NOT_WMO_NAV_FILE: u8 = 38;
71pub const NOT_WMO_TILE_COORDINATES: u8 = 39;
72pub const NOT_ADT_NAV_FILE: u8 = 40;
73pub const INVALID_MAP_FILE: u8 = 41;
74pub const INCORRECT_WMO_COORDINATES: u8 = 42;
75pub const DTNAVMESHQUERY_INIT_FAILED: u8 = 43;
76pub const UNKNOWN_WMO_INSTANCE_REQUESTED: u8 = 44;
77pub const UNKNOWN_DOODAD_INSTANCE_REQUESTED: u8 = 45;
78pub const COULD_NOT_DESERIALIZE_DOODAD: u8 = 46;
79pub const COULD_NOT_DESERIALIZE_WMO: u8 = 47;
80pub const INCORRECT_ADT_COORDINATES: u8 = 48;
81pub const TILE_NOT_FOUND_FOR_REQUESTED: u8 = 49;
82pub const COULD_NOT_FIND_WMO: u8 = 50;
83
84pub const DOODAD_PATH_NOT_FOUND: u8 = 51;
85pub const UNSUPPORTED_DOOAD_FORMAT: u8 = 52;
86pub const MAP_ID_NOT_FOUND: u8 = 53;
87pub const WMO_NOT_FOUND: u8 = 54;
88
89pub const BINARYSTREAM_COMPRESS_FAILED: u8 = 55;
90pub const MZ_INFLATEINIT_FAILED: u8 = 56;
91pub const MZ_INFLATE_FAILED: u8 = 57;
92
93pub const INVALID_ROW_COLUMN_FROM_DBC: u8 = 58;
94
95pub const GAMEOBJECT_WITH_SPECIFIED_GUID_ALREADY_EXISTS: u8 = 59;
96
97pub const TEMPORARY_WMO_OBSTACLES_ARE_NOT_SUPPORTED: u8 = 60;
98pub const NO_DOODAD_SET_SPECIFIED_FOR_WMO_GAME_OBJECT: u8 = 61;
99
100pub const BAD_MATRIX_ROW: u8 = 62;
101pub const INVALID_MATRIX_MULTIPLICATION: u8 = 63;
102pub const ONLY_4X4_MATRIX_IS_SUPPORTED: u8 = 64;
103pub const MATRIX_NOT_INVERTIBLE: u8 = 65;
104
105pub const UNEXPECTED_VERSION_MAGIC_IN_ALPHA_MODEL: u8 = 66;
106pub const UNEXPECTED_VERSION_SIZE_IN_ALPHA_MODEL: u8 = 67;
107pub const UNSUPPORTED_ALPHA_MODEL_VERSION: u8 = 68;
108pub const UNEXPECTED_VERTEX_MAGIC_IN_ALPHA_MODEL: u8 = 69;
109pub const UNEXPECTED_TRIANGLE_MAGIC_IN_ALPHA_MODEL: u8 = 70;
110pub const INVALID_DOODAD_FILE: u8 = 71;
111
112pub const COULD_NOT_OPEN_MPQ: u8 = 72;
113pub const GETROOTAREAID_INVALID_ID: u8 = 73;
114pub const NO_DATA_FILES_FOUND: u8 = 74;
115pub const MPQ_MANAGER_NOT_INIATIALIZED: u8 = 75;
116pub const ERROR_IN_SFILEOPENFILEX: u8 = 76;
117pub const ERROR_IN_SFILEREADFILE: u8 = 77;
118pub const MULTIPLE_CANDIDATES_IN_ALPHA_MPQ: u8 = 78;
119pub const TOO_MANY_FILES_IN_ALPHA_MPQ: u8 = 79;
120pub const NO_MPQ_CANDIDATE: u8 = 80;
121
122pub const RECAST_FAILURE: u8 = 81;
123
124pub const BUFFER_TOO_SMALL: u8 = 82;
125pub const UNKNOWN_PATH: u8 = 83;
126pub const UNKNOWN_HEIGHT: u8 = 84;
127pub const UNKNOWN_ZONE_AND_AREA: u8 = 85;
128pub const FAILED_TO_LOAD_ADT: u8 = 86;
129pub const MAP_DOES_NOT_HAVE_ADT: u8 = 87;
130
131pub const UNABLE_TO_FIND_RANDOM_POINT_IN_CIRCLE: u8 = 88;
132
133pub const FAILED_TO_FIND_POINT_BETWEEN_VECTORS: u8 = 89;
134
135pub const UNKNOWN_EXCEPTION: u8 = 0xFF;
136
137#[link(name = "namigator")]
138extern "C" {
139    pub fn pathfind_new_map(
140        data_path: *const c_char,
141        map_name: *const c_char,
142        result: *mut c_uchar,
143    ) -> *const Map;
144
145    pub fn pathfind_free_map(map: *const Map);
146
147    pub fn pathfind_load_all_adts(map: *const Map, amount_of_adts_loaded: *mut c_uint) -> c_uchar;
148
149    pub fn pathfind_load_adt(
150        map: *const Map,
151        x: c_int,
152        y: c_int,
153        out_adt_x: *mut c_float,
154        out_adt_y: *mut c_float,
155    ) -> c_uchar;
156
157    pub fn pathfind_load_adt_at(
158        map: *const Map,
159        x: c_float,
160        y: c_float,
161        out_adt_x: *mut c_float,
162        out_adt_y: *mut c_float,
163    ) -> c_uchar;
164
165    pub fn pathfind_unload_adt(map: *const Map, x: c_int, y: c_int) -> c_uchar;
166
167    pub fn pathfind_is_adt_loaded(
168        map: *const Map,
169        x: c_int,
170        y: c_int,
171        out_loaded: *mut u8,
172    ) -> c_uchar;
173
174    pub fn pathfind_has_adts(map: *const Map, has_adts: *mut bool) -> c_uchar;
175
176    pub fn pathfind_get_zone_and_area(
177        map: *const Map,
178        x: c_float,
179        y: c_float,
180        z: c_float,
181        out_zone: *mut c_uint,
182        out_area: *mut c_uint,
183    ) -> c_uchar;
184
185    pub fn pathfind_find_point_in_between_vectors(
186        map: *const Map,
187        distance: f32,
188        x1: f32,
189        y1: f32,
190        z1: f32,
191        x2: f32,
192        y2: f32,
193        z2: f32,
194        out_vertex: *mut Vertex,
195    ) -> c_uchar;
196
197    pub fn pathfind_find_path(
198        map: *const Map,
199        start_x: c_float,
200        start_y: c_float,
201        start_z: c_float,
202        stop_x: c_float,
203        stop_y: c_float,
204        stop_z: c_float,
205        buffer: *mut Vertex,
206        buffer_length: c_uint,
207        amount_of_vertices: *mut c_uint,
208    ) -> c_uchar;
209
210    pub fn pathfind_find_heights(
211        map: *const Map,
212        x: c_float,
213        y: c_float,
214        buffer: *mut c_float,
215        buffer_length: c_uint,
216        amount_of_heights: *mut c_uint,
217    ) -> c_uchar;
218
219    pub fn pathfind_find_height(
220        map: *const Map,
221        start_x: c_float,
222        start_y: c_float,
223        start_z: c_float,
224        stop_x: c_float,
225        stop_y: c_float,
226        out_stop_z: *mut c_float,
227    ) -> c_uchar;
228
229    pub fn pathfind_line_of_sight(
230        map: *const Map,
231        start_x: c_float,
232        start_y: c_float,
233        start_z: c_float,
234        stop_x: c_float,
235        stop_y: c_float,
236        stop_z: c_float,
237        line_of_sight: *mut u8,
238        doodads: u8,
239    ) -> c_uchar;
240
241    pub fn pathfind_find_random_point_around_circle(
242        map: *const Map,
243        x: c_float,
244        y: c_float,
245        z: c_float,
246        radius: c_float,
247        out_random_x: *mut c_float,
248        out_random_y: *mut c_float,
249        out_random_z: *mut c_float,
250    ) -> c_uchar;
251
252    pub fn mapbuild_build_bvh(
253        data_path: *const c_char,
254        output_path: *const c_char,
255        threads: c_uint,
256        amount_of_bvhs_built: *mut c_uint,
257    ) -> c_uchar;
258
259    pub fn mapbuild_build_map(
260        data_path: *const c_char,
261        output_path: *const c_char,
262        map_name: *const c_char,
263        gameobject_csv: *const c_char,
264        threads: c_uint,
265    ) -> c_uchar;
266
267    pub fn mapbuild_bvh_files_exist(output_path: *const c_char, exists: *mut u8) -> c_uchar;
268
269    pub fn mapbuild_map_files_exist(
270        output_path: *const c_char,
271        map_name: *const c_char,
272        exists: *mut u8,
273    ) -> c_uchar;
274}