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}