Skip to main content

samp_sdk/omp/generated/
npc.rs

1//! `INPC` — generated by `cargo xtask gen-omp` from `Server/Components/NPCs/npcs.hpp`.
2//! Implemented by `NPC` in the server's `NPCs`.
3//!
4//! Do not edit: change `xtask/omp-wrappers.toml` or the generator and
5//! regenerate. Slots are clang's layout of the header for each ABI, checked
6//! against the official binaries by `cargo xtask check-abi --generated`.
7
8#![allow(unused_imports)]
9
10use crate::omp::containers::{FlatSet, HybridString, Pair, Span};
11use crate::omp::types::{
12    Colour, GTAQuat, Hours, Microseconds, Milliseconds, Minutes, Seconds, StringView, TimePoint,
13    UID, Vector2, Vector3, Vector4, WorldTimePoint,
14};
15use crate::omp::vtable::{call_vtable_small_struct, opaque, slots, virtual_fns};
16use crate::omp::*;
17
18opaque! {
19    /// Opaque handle for `INPC*`.
20    pub INPC;
21}
22
23slots! {
24    /// `IPlayer * INPC::getPlayer()`
25    SLOT_GET_PLAYER: usize = 6, 5;
26    /// `Vector3 INPC::getPosition()`
27    SLOT_GET_POSITION: usize = 7, 6;
28    /// `void INPC::setPosition(const Vector3 &, bool)`
29    SLOT_SET_POSITION: usize = 8, 7;
30    /// `GTAQuat INPC::getRotation()`
31    SLOT_GET_ROTATION: usize = 9, 8;
32    /// `void INPC::setRotation(const GTAQuat &, bool)`
33    SLOT_SET_ROTATION: usize = 10, 9;
34    /// `int INPC::getVirtualWorld()`
35    SLOT_GET_VIRTUAL_WORLD: usize = 11, 10;
36    /// `void INPC::setVirtualWorld(int)`
37    SLOT_SET_VIRTUAL_WORLD: usize = 12, 11;
38    /// `void INPC::spawn()`
39    SLOT_SPAWN: usize = 13, 12;
40    /// `void INPC::respawn()`
41    SLOT_RESPAWN: usize = 14, 13;
42    /// `bool INPC::move(Vector3, NPCMoveType, float, float)`
43    SLOT_MOVE: usize = 15, 14;
44    /// `bool INPC::moveToPlayer(IPlayer &, NPCMoveType, float, float, Milliseconds, bool)`
45    SLOT_MOVE_TO_PLAYER: usize = 16, 15;
46    /// `void INPC::stopMove()`
47    SLOT_STOP_MOVE: usize = 17, 16;
48    /// `bool INPC::isMoving()`
49    SLOT_IS_MOVING: usize = 18, 17;
50    /// `void INPC::setSkin(int)`
51    SLOT_SET_SKIN: usize = 19, 18;
52    /// `bool INPC::isStreamedInForPlayer(const IPlayer &)`
53    SLOT_IS_STREAMED_IN_FOR_PLAYER: usize = 20, 19;
54    /// `const FlatPtrHashSet<IPlayer> & INPC::streamedForPlayers()`
55    SLOT_STREAMED_FOR_PLAYERS: usize = 21, 20;
56    /// `void INPC::setInterior(unsigned int)`
57    SLOT_SET_INTERIOR: usize = 22, 21;
58    /// `unsigned int INPC::getInterior()`
59    SLOT_GET_INTERIOR: usize = 23, 22;
60    /// `Vector3 INPC::getVelocity()`
61    SLOT_GET_VELOCITY: usize = 24, 23;
62    /// `void INPC::setVelocity(Vector3, bool)`
63    SLOT_SET_VELOCITY: usize = 25, 24;
64    /// `void INPC::setHealth(float)`
65    SLOT_SET_HEALTH: usize = 26, 25;
66    /// `float INPC::getHealth()`
67    SLOT_GET_HEALTH: usize = 27, 26;
68    /// `void INPC::setArmour(float)`
69    SLOT_SET_ARMOUR: usize = 28, 27;
70    /// `float INPC::getArmour()`
71    SLOT_GET_ARMOUR: usize = 29, 28;
72    /// `bool INPC::isDead()`
73    SLOT_IS_DEAD: usize = 30, 29;
74    /// `void INPC::setWeapon(uint8_t)`
75    SLOT_SET_WEAPON: usize = 31, 30;
76    /// `uint8_t INPC::getWeapon()`
77    SLOT_GET_WEAPON: usize = 32, 31;
78    /// `void INPC::setAmmo(int)`
79    SLOT_SET_AMMO: usize = 33, 32;
80    /// `int INPC::getAmmo()`
81    SLOT_GET_AMMO: usize = 34, 33;
82    /// `void INPC::setWeaponSkillLevel(PlayerWeaponSkill, int)`
83    SLOT_SET_WEAPON_SKILL_LEVEL: usize = 35, 34;
84    /// `int INPC::getWeaponSkillLevel(PlayerWeaponSkill)`
85    SLOT_GET_WEAPON_SKILL_LEVEL: usize = 36, 35;
86    /// `void INPC::setKeys(uint16_t, uint16_t, uint16_t)`
87    SLOT_SET_KEYS: usize = 37, 36;
88    /// `void INPC::getKeys(uint16_t &, uint16_t &, uint16_t &)`
89    SLOT_GET_KEYS: usize = 38, 37;
90    /// `void INPC::meleeAttack(int, bool)`
91    SLOT_MELEE_ATTACK: usize = 39, 38;
92    /// `void INPC::stopMeleeAttack()`
93    SLOT_STOP_MELEE_ATTACK: usize = 40, 39;
94    /// `bool INPC::isMeleeAttacking()`
95    SLOT_IS_MELEE_ATTACKING: usize = 41, 40;
96    /// `void INPC::setFightingStyle(PlayerFightingStyle)`
97    SLOT_SET_FIGHTING_STYLE: usize = 42, 41;
98    /// `PlayerFightingStyle INPC::getFightingStyle()`
99    SLOT_GET_FIGHTING_STYLE: usize = 43, 42;
100    /// `void INPC::enableReloading(bool)`
101    SLOT_ENABLE_RELOADING: usize = 44, 43;
102    /// `bool INPC::isReloadEnabled()`
103    SLOT_IS_RELOAD_ENABLED: usize = 45, 44;
104    /// `bool INPC::isReloading()`
105    SLOT_IS_RELOADING: usize = 46, 45;
106    /// `void INPC::enableInfiniteAmmo(bool)`
107    SLOT_ENABLE_INFINITE_AMMO: usize = 47, 46;
108    /// `bool INPC::isInfiniteAmmoEnabled()`
109    SLOT_IS_INFINITE_AMMO_ENABLED: usize = 48, 47;
110    /// `PlayerWeaponState INPC::getWeaponState()`
111    SLOT_GET_WEAPON_STATE: usize = 49, 48;
112    /// `void INPC::setAmmoInClip(int)`
113    SLOT_SET_AMMO_IN_CLIP: usize = 50, 49;
114    /// `int INPC::getAmmoInClip()`
115    SLOT_GET_AMMO_IN_CLIP: usize = 51, 50;
116    /// `void INPC::shoot(int, PlayerBulletHitType, uint8_t, const Vector3 &, const Vector3 &, bool, EntityCheckType)`
117    SLOT_SHOOT: usize = 52, 51;
118    /// `bool INPC::isShooting()`
119    SLOT_IS_SHOOTING: usize = 53, 52;
120    /// `void INPC::aimAt(const Vector3 &, bool, int, bool, const Vector3 &, EntityCheckType)`
121    SLOT_AIM_AT: usize = 54, 53;
122    /// `void INPC::aimAtPlayer(IPlayer &, bool, int, bool, const Vector3 &, const Vector3 &, EntityCheckType)`
123    SLOT_AIM_AT_PLAYER: usize = 55, 54;
124    /// `void INPC::stopAim()`
125    SLOT_STOP_AIM: usize = 56, 55;
126    /// `bool INPC::isAiming()`
127    SLOT_IS_AIMING: usize = 57, 56;
128    /// `bool INPC::isAimingAtPlayer(IPlayer &)`
129    SLOT_IS_AIMING_AT_PLAYER: usize = 58, 57;
130    /// `void INPC::setWeaponAccuracy(uint8_t, float)`
131    SLOT_SET_WEAPON_ACCURACY: usize = 59, 58;
132    /// `float INPC::getWeaponAccuracy(uint8_t)`
133    SLOT_GET_WEAPON_ACCURACY: usize = 60, 59;
134    /// `void INPC::setWeaponReloadTime(uint8_t, int)`
135    SLOT_SET_WEAPON_RELOAD_TIME: usize = 61, 60;
136    /// `int INPC::getWeaponReloadTime(uint8_t)`
137    SLOT_GET_WEAPON_RELOAD_TIME: usize = 62, 61;
138    /// `int INPC::getWeaponActualReloadTime(uint8_t)`
139    SLOT_GET_WEAPON_ACTUAL_RELOAD_TIME: usize = 63, 62;
140    /// `void INPC::setWeaponShootTime(uint8_t, int)`
141    SLOT_SET_WEAPON_SHOOT_TIME: usize = 64, 63;
142    /// `int INPC::getWeaponShootTime(uint8_t)`
143    SLOT_GET_WEAPON_SHOOT_TIME: usize = 65, 64;
144    /// `void INPC::setWeaponClipSize(uint8_t, int)`
145    SLOT_SET_WEAPON_CLIP_SIZE: usize = 66, 65;
146    /// `int INPC::getWeaponClipSize(uint8_t)`
147    SLOT_GET_WEAPON_CLIP_SIZE: usize = 67, 66;
148    /// `int INPC::getWeaponActualClipSize(uint8_t)`
149    SLOT_GET_WEAPON_ACTUAL_CLIP_SIZE: usize = 68, 67;
150    /// `void INPC::enterVehicle(IVehicle &, uint8_t, NPCMoveType)`
151    SLOT_ENTER_VEHICLE: usize = 69, 68;
152    /// `void INPC::exitVehicle()`
153    SLOT_EXIT_VEHICLE: usize = 70, 69;
154    /// `bool INPC::putInVehicle(IVehicle &, uint8_t)`
155    SLOT_PUT_IN_VEHICLE: usize = 71, 70;
156    /// `bool INPC::removeFromVehicle()`
157    SLOT_REMOVE_FROM_VEHICLE: usize = 72, 71;
158    /// `bool INPC::moveByPath(int, NPCMoveType, float, bool)`
159    SLOT_MOVE_BY_PATH: usize = 73, 72;
160    /// `void INPC::pausePath()`
161    SLOT_PAUSE_PATH: usize = 74, 73;
162    /// `void INPC::resumePath()`
163    SLOT_RESUME_PATH: usize = 75, 74;
164    /// `void INPC::stopPath()`
165    SLOT_STOP_PATH: usize = 76, 75;
166    /// `bool INPC::isMovingByPath()`
167    SLOT_IS_MOVING_BY_PATH: usize = 77, 76;
168    /// `bool INPC::isPathPaused()`
169    SLOT_IS_PATH_PAUSED: usize = 78, 77;
170    /// `int INPC::getCurrentPathId()`
171    SLOT_GET_CURRENT_PATH_ID: usize = 79, 78;
172    /// `int INPC::getCurrentPathPointIndex()`
173    SLOT_GET_CURRENT_PATH_POINT_INDEX: usize = 80, 79;
174    /// `IVehicle * INPC::getVehicle()`
175    SLOT_GET_VEHICLE: usize = 81, 80;
176    /// `int INPC::getVehicleSeat()`
177    SLOT_GET_VEHICLE_SEAT: usize = 82, 81;
178    /// `IVehicle * INPC::getEnteringVehicle()`
179    SLOT_GET_ENTERING_VEHICLE: usize = 83, 82;
180    /// `int INPC::getEnteringVehicleSeat()`
181    SLOT_GET_ENTERING_VEHICLE_SEAT: usize = 84, 83;
182    /// `void INPC::useVehicleSiren(bool)`
183    SLOT_USE_VEHICLE_SIREN: usize = 85, 84;
184    /// `bool INPC::isVehicleSirenUsed()`
185    SLOT_IS_VEHICLE_SIREN_USED: usize = 86, 85;
186    /// `void INPC::setVehicleHealth(float)`
187    SLOT_SET_VEHICLE_HEALTH: usize = 87, 86;
188    /// `float INPC::getVehicleHealth()`
189    SLOT_GET_VEHICLE_HEALTH: usize = 88, 87;
190    /// `void INPC::setVehicleHydraThrusters(int)`
191    SLOT_SET_VEHICLE_HYDRA_THRUSTERS: usize = 89, 88;
192    /// `int INPC::getVehicleHydraThrusters()`
193    SLOT_GET_VEHICLE_HYDRA_THRUSTERS: usize = 90, 89;
194    /// `void INPC::setVehicleGearState(int)`
195    SLOT_SET_VEHICLE_GEAR_STATE: usize = 91, 90;
196    /// `int INPC::getVehicleGearState()`
197    SLOT_GET_VEHICLE_GEAR_STATE: usize = 92, 91;
198    /// `void INPC::setVehicleTrainSpeed(float)`
199    SLOT_SET_VEHICLE_TRAIN_SPEED: usize = 93, 92;
200    /// `float INPC::getVehicleTrainSpeed()`
201    SLOT_GET_VEHICLE_TRAIN_SPEED: usize = 94, 93;
202    /// `void INPC::resetAnimation()`
203    SLOT_RESET_ANIMATION: usize = 95, 94;
204    /// `void INPC::setAnimation(int, float, bool, bool, bool, bool, int)`
205    SLOT_SET_ANIMATION: usize = 96, 95;
206    /// `void INPC::getAnimation(int &, float &, bool &, bool &, bool &, bool &, int &)`
207    SLOT_GET_ANIMATION: usize = 97, 96;
208    /// `void INPC::applyAnimation(const AnimationData &)`
209    SLOT_APPLY_ANIMATION: usize = 98, 97;
210    /// `void INPC::clearAnimations()`
211    SLOT_CLEAR_ANIMATIONS: usize = 99, 98;
212    /// `void INPC::setSpecialAction(PlayerSpecialAction)`
213    SLOT_SET_SPECIAL_ACTION: usize = 100, 99;
214    /// `PlayerSpecialAction INPC::getSpecialAction()`
215    SLOT_GET_SPECIAL_ACTION: usize = 101, 100;
216    /// `bool INPC::startPlayback(StringView, bool, const Vector3 &, const GTAQuat &)`
217    SLOT_START_PLAYBACK: usize = 102, 102;
218    /// `bool INPC::startPlayback(int, bool, const Vector3 &, const GTAQuat &)`
219    SLOT_START_PLAYBACK_ID: usize = 103, 101;
220    /// `void INPC::stopPlayback()`
221    SLOT_STOP_PLAYBACK: usize = 104, 103;
222    /// `void INPC::pausePlayback(bool)`
223    SLOT_PAUSE_PLAYBACK: usize = 105, 104;
224    /// `bool INPC::isPlayingPlayback()`
225    SLOT_IS_PLAYING_PLAYBACK: usize = 106, 105;
226    /// `bool INPC::isPlaybackPaused()`
227    SLOT_IS_PLAYBACK_PAUSED: usize = 107, 106;
228    /// `bool INPC::playNode(int, NPCMoveType, float, float, bool)`
229    SLOT_PLAY_NODE: usize = 108, 107;
230    /// `void INPC::stopPlayingNode()`
231    SLOT_STOP_PLAYING_NODE: usize = 109, 108;
232    /// `void INPC::pausePlayingNode()`
233    SLOT_PAUSE_PLAYING_NODE: usize = 110, 109;
234    /// `void INPC::resumePlayingNode()`
235    SLOT_RESUME_PLAYING_NODE: usize = 111, 110;
236    /// `bool INPC::isPlayingNodePaused()`
237    SLOT_IS_PLAYING_NODE_PAUSED: usize = 112, 111;
238    /// `bool INPC::isPlayingNode()`
239    SLOT_IS_PLAYING_NODE: usize = 113, 112;
240    /// `uint16_t INPC::changeNode(int, uint16_t)`
241    SLOT_CHANGE_NODE: usize = 114, 113;
242    /// `bool INPC::updateNodePoint(uint16_t)`
243    SLOT_UPDATE_NODE_POINT: usize = 115, 114;
244    /// `void INPC::setInvulnerable(bool)`
245    SLOT_SET_INVULNERABLE: usize = 116, 115;
246    /// `bool INPC::isInvulnerable()`
247    SLOT_IS_INVULNERABLE: usize = 117, 116;
248    /// `void INPC::setSurfingData(const PlayerSurfingData &)`
249    SLOT_SET_SURFING_DATA: usize = 118, 117;
250    /// `PlayerSurfingData INPC::getSurfingData()`
251    SLOT_GET_SURFING_DATA: usize = 119, 118;
252    /// `void INPC::resetSurfingData()`
253    SLOT_RESET_SURFING_DATA: usize = 120, 119;
254    /// `bool INPC::isMovingToPlayer(IPlayer &)`
255    SLOT_IS_MOVING_TO_PLAYER: usize = 121, 120;
256    /// `void INPC::kill(IPlayer *, uint8_t)`
257    SLOT_KILL: usize = 122, 121;
258    /// `IPlayer * INPC::getPlayerAimingAt()`
259    SLOT_GET_PLAYER_AIMING_AT: usize = 123, 122;
260    /// `IPlayer * INPC::getPlayerMovingTo()`
261    SLOT_GET_PLAYER_MOVING_TO: usize = 124, 123;
262    /// `void INPC::setWeaponState(PlayerWeaponState)`
263    SLOT_SET_WEAPON_STATE: usize = 125, 124;
264    /// `Vector3 INPC::getPositionMovingTo()`
265    SLOT_GET_POSITION_MOVING_TO: usize = 126, 125;
266}
267
268virtual_fns! {
269    /// `IPlayer * INPC::getPlayer()`.
270    ///
271    /// # Safety
272    /// `npc` must be a live `INPC`.
273    #[must_use]
274    pub fn npc_player(npc: INPC) -> *mut IPlayer = [0, SLOT_GET_PLAYER] or std::ptr::null_mut();
275
276    /// `Vector3 INPC::getPosition()`.
277    ///
278    /// # Safety
279    /// `npc` must be a live `INPC`.
280    #[must_use]
281    pub fn npc_position(npc: INPC) -> Vector3 = [0, SLOT_GET_POSITION] or Vector3::ZERO;
282
283    /// `void INPC::setPosition(const Vector3 &, bool)`.
284    ///
285    /// # Safety
286    /// `npc` must be a live `INPC`.
287    pub fn npc_set_position(
288        npc: INPC,
289        position: &Vector3,
290        immediate_update: bool,
291    ) = [0, SLOT_SET_POSITION];
292
293    /// `GTAQuat INPC::getRotation()`.
294    ///
295    /// # Safety
296    /// `npc` must be a live `INPC`.
297    #[must_use]
298    pub fn npc_rotation(npc: INPC) -> GTAQuat = [0, SLOT_GET_ROTATION] or GTAQuat::default();
299
300    /// `void INPC::setRotation(const GTAQuat &, bool)`.
301    ///
302    /// # Safety
303    /// `npc` must be a live `INPC`.
304    pub fn npc_set_rotation(
305        npc: INPC,
306        rotation: &GTAQuat,
307        immediate_update: bool,
308    ) = [0, SLOT_SET_ROTATION];
309
310    /// `int INPC::getVirtualWorld()`.
311    ///
312    /// # Safety
313    /// `npc` must be a live `INPC`.
314    #[must_use]
315    pub fn npc_virtual_world(npc: INPC) -> i32 = [0, SLOT_GET_VIRTUAL_WORLD] or 0;
316
317    /// `void INPC::setVirtualWorld(int)`.
318    ///
319    /// # Safety
320    /// `npc` must be a live `INPC`.
321    pub fn npc_set_virtual_world(npc: INPC, vw: i32) = [0, SLOT_SET_VIRTUAL_WORLD];
322
323    /// `void INPC::spawn()`.
324    ///
325    /// # Safety
326    /// `npc` must be a live `INPC`.
327    pub fn npc_spawn(npc: INPC) = [0, SLOT_SPAWN];
328
329    /// `void INPC::respawn()`.
330    ///
331    /// # Safety
332    /// `npc` must be a live `INPC`.
333    pub fn npc_respawn(npc: INPC) = [0, SLOT_RESPAWN];
334
335    /// `bool INPC::move(Vector3, NPCMoveType, float, float)`.
336    ///
337    /// # Safety
338    /// `npc` must be a live `INPC`.
339    #[must_use]
340    pub fn npc_move(
341        npc: INPC,
342        position: Vector3,
343        move_type: i32,
344        move_speed: f32,
345        stop_range: f32,
346    ) -> bool = [0, SLOT_MOVE] or false;
347
348    /// `bool INPC::moveToPlayer(IPlayer &, NPCMoveType, float, float, Milliseconds, bool)`.
349    ///
350    /// # Safety
351    /// `npc` must be a live `INPC`.
352    #[must_use]
353    pub fn npc_move_to_player(
354        npc: INPC,
355        target_player: *mut IPlayer,
356        move_type: i32,
357        move_speed: f32,
358        stop_range: f32,
359        pos_check_update_delay: Milliseconds,
360        auto_restart: bool,
361    ) -> bool = [0, SLOT_MOVE_TO_PLAYER] or false;
362
363    /// `void INPC::stopMove()`.
364    ///
365    /// # Safety
366    /// `npc` must be a live `INPC`.
367    pub fn npc_stop_move(npc: INPC) = [0, SLOT_STOP_MOVE];
368
369    /// `bool INPC::isMoving()`.
370    ///
371    /// # Safety
372    /// `npc` must be a live `INPC`.
373    #[must_use]
374    pub fn npc_is_moving(npc: INPC) -> bool = [0, SLOT_IS_MOVING] or false;
375
376    /// `void INPC::setSkin(int)`.
377    ///
378    /// # Safety
379    /// `npc` must be a live `INPC`.
380    pub fn npc_set_skin(npc: INPC, model: i32) = [0, SLOT_SET_SKIN];
381
382    /// `bool INPC::isStreamedInForPlayer(const IPlayer &)`.
383    ///
384    /// # Safety
385    /// `npc` must be a live `INPC`.
386    #[must_use]
387    pub fn npc_is_streamed_in_for_player(
388        npc: INPC,
389        other: *mut IPlayer,
390    ) -> bool = [0, SLOT_IS_STREAMED_IN_FOR_PLAYER] or false;
391
392    /// `const FlatPtrHashSet<IPlayer> & INPC::streamedForPlayers()`.
393    ///
394    /// # Safety
395    /// `npc` must be a live `INPC`.
396    #[must_use]
397    pub fn npc_streamed_for_players(
398        npc: INPC,
399    ) -> *const FlatSet<IPlayer> = [0, SLOT_STREAMED_FOR_PLAYERS] or std::ptr::null();
400
401    /// `void INPC::setInterior(unsigned int)`.
402    ///
403    /// # Safety
404    /// `npc` must be a live `INPC`.
405    pub fn npc_set_interior(npc: INPC, interior: u32) = [0, SLOT_SET_INTERIOR];
406
407    /// `unsigned int INPC::getInterior()`.
408    ///
409    /// # Safety
410    /// `npc` must be a live `INPC`.
411    #[must_use]
412    pub fn npc_interior(npc: INPC) -> u32 = [0, SLOT_GET_INTERIOR] or 0;
413
414    /// `Vector3 INPC::getVelocity()`.
415    ///
416    /// # Safety
417    /// `npc` must be a live `INPC`.
418    #[must_use]
419    pub fn npc_velocity(npc: INPC) -> Vector3 = [0, SLOT_GET_VELOCITY] or Vector3::ZERO;
420
421    /// `void INPC::setVelocity(Vector3, bool)`.
422    ///
423    /// # Safety
424    /// `npc` must be a live `INPC`.
425    pub fn npc_set_velocity(npc: INPC, position: Vector3, update: bool) = [0, SLOT_SET_VELOCITY];
426
427    /// `void INPC::setHealth(float)`.
428    ///
429    /// # Safety
430    /// `npc` must be a live `INPC`.
431    pub fn npc_set_health(npc: INPC, health: f32) = [0, SLOT_SET_HEALTH];
432
433    /// `float INPC::getHealth()`.
434    ///
435    /// # Safety
436    /// `npc` must be a live `INPC`.
437    #[must_use]
438    pub fn npc_health(npc: INPC) -> f32 = [0, SLOT_GET_HEALTH] or 0.0;
439
440    /// `void INPC::setArmour(float)`.
441    ///
442    /// # Safety
443    /// `npc` must be a live `INPC`.
444    pub fn npc_set_armour(npc: INPC, armour: f32) = [0, SLOT_SET_ARMOUR];
445
446    /// `float INPC::getArmour()`.
447    ///
448    /// # Safety
449    /// `npc` must be a live `INPC`.
450    #[must_use]
451    pub fn npc_armour(npc: INPC) -> f32 = [0, SLOT_GET_ARMOUR] or 0.0;
452
453    /// `bool INPC::isDead()`.
454    ///
455    /// # Safety
456    /// `npc` must be a live `INPC`.
457    #[must_use]
458    pub fn npc_is_dead(npc: INPC) -> bool = [0, SLOT_IS_DEAD] or false;
459
460    /// `void INPC::setWeapon(uint8_t)`.
461    ///
462    /// # Safety
463    /// `npc` must be a live `INPC`.
464    pub fn npc_set_weapon(npc: INPC, weapon: u8) = [0, SLOT_SET_WEAPON];
465
466    /// `uint8_t INPC::getWeapon()`.
467    ///
468    /// # Safety
469    /// `npc` must be a live `INPC`.
470    #[must_use]
471    pub fn npc_weapon(npc: INPC) -> u8 = [0, SLOT_GET_WEAPON] or 0;
472
473    /// `void INPC::setAmmo(int)`.
474    ///
475    /// # Safety
476    /// `npc` must be a live `INPC`.
477    pub fn npc_set_ammo(npc: INPC, ammo: i32) = [0, SLOT_SET_AMMO];
478
479    /// `int INPC::getAmmo()`.
480    ///
481    /// # Safety
482    /// `npc` must be a live `INPC`.
483    #[must_use]
484    pub fn npc_ammo(npc: INPC) -> i32 = [0, SLOT_GET_AMMO] or 0;
485
486    /// `void INPC::setWeaponSkillLevel(PlayerWeaponSkill, int)`.
487    ///
488    /// # Safety
489    /// `npc` must be a live `INPC`.
490    pub fn npc_set_weapon_skill_level(
491        npc: INPC,
492        weapon_skill: i32,
493        level: i32,
494    ) = [0, SLOT_SET_WEAPON_SKILL_LEVEL];
495
496    /// `int INPC::getWeaponSkillLevel(PlayerWeaponSkill)`.
497    ///
498    /// # Safety
499    /// `npc` must be a live `INPC`.
500    #[must_use]
501    pub fn npc_weapon_skill_level(
502        npc: INPC,
503        weapon_skill: i32,
504    ) -> i32 = [0, SLOT_GET_WEAPON_SKILL_LEVEL] or 0;
505
506    /// `void INPC::setKeys(uint16_t, uint16_t, uint16_t)`.
507    ///
508    /// # Safety
509    /// `npc` must be a live `INPC`.
510    pub fn npc_set_keys(
511        npc: INPC,
512        up_and_down: u16,
513        left_and_right: u16,
514        keys: u16,
515    ) = [0, SLOT_SET_KEYS];
516
517    /// `void INPC::getKeys(uint16_t &, uint16_t &, uint16_t &)`.
518    ///
519    /// # Safety
520    /// `npc` must be a live `INPC`.
521    pub fn npc_keys(
522        npc: INPC,
523        up_and_down: &mut u16,
524        left_and_right: &mut u16,
525        keys: &mut u16,
526    ) = [0, SLOT_GET_KEYS];
527
528    /// `void INPC::meleeAttack(int, bool)`.
529    ///
530    /// # Safety
531    /// `npc` must be a live `INPC`.
532    pub fn npc_melee_attack(
533        npc: INPC,
534        time: i32,
535        secondary_melee_attack: bool,
536    ) = [0, SLOT_MELEE_ATTACK];
537
538    /// `void INPC::stopMeleeAttack()`.
539    ///
540    /// # Safety
541    /// `npc` must be a live `INPC`.
542    pub fn npc_stop_melee_attack(npc: INPC) = [0, SLOT_STOP_MELEE_ATTACK];
543
544    /// `bool INPC::isMeleeAttacking()`.
545    ///
546    /// # Safety
547    /// `npc` must be a live `INPC`.
548    #[must_use]
549    pub fn npc_is_melee_attacking(npc: INPC) -> bool = [0, SLOT_IS_MELEE_ATTACKING] or false;
550
551    /// `void INPC::setFightingStyle(PlayerFightingStyle)`.
552    ///
553    /// # Safety
554    /// `npc` must be a live `INPC`.
555    pub fn npc_set_fighting_style(npc: INPC, style: i32) = [0, SLOT_SET_FIGHTING_STYLE];
556
557    /// `PlayerFightingStyle INPC::getFightingStyle()`.
558    ///
559    /// # Safety
560    /// `npc` must be a live `INPC`.
561    #[must_use]
562    pub fn npc_fighting_style(npc: INPC) -> i32 = [0, SLOT_GET_FIGHTING_STYLE] or 0;
563
564    /// `void INPC::enableReloading(bool)`.
565    ///
566    /// # Safety
567    /// `npc` must be a live `INPC`.
568    pub fn npc_enable_reloading(npc: INPC, toggle: bool) = [0, SLOT_ENABLE_RELOADING];
569
570    /// `bool INPC::isReloadEnabled()`.
571    ///
572    /// # Safety
573    /// `npc` must be a live `INPC`.
574    #[must_use]
575    pub fn npc_is_reload_enabled(npc: INPC) -> bool = [0, SLOT_IS_RELOAD_ENABLED] or false;
576
577    /// `bool INPC::isReloading()`.
578    ///
579    /// # Safety
580    /// `npc` must be a live `INPC`.
581    #[must_use]
582    pub fn npc_is_reloading(npc: INPC) -> bool = [0, SLOT_IS_RELOADING] or false;
583
584    /// `void INPC::enableInfiniteAmmo(bool)`.
585    ///
586    /// # Safety
587    /// `npc` must be a live `INPC`.
588    pub fn npc_enable_infinite_ammo(npc: INPC, enable: bool) = [0, SLOT_ENABLE_INFINITE_AMMO];
589
590    /// `bool INPC::isInfiniteAmmoEnabled()`.
591    ///
592    /// # Safety
593    /// `npc` must be a live `INPC`.
594    #[must_use]
595    pub fn npc_is_infinite_ammo_enabled(
596        npc: INPC,
597    ) -> bool = [0, SLOT_IS_INFINITE_AMMO_ENABLED] or false;
598
599    /// `PlayerWeaponState INPC::getWeaponState()`.
600    ///
601    /// # Safety
602    /// `npc` must be a live `INPC`.
603    #[must_use]
604    pub fn npc_weapon_state(npc: INPC) -> i8 = [0, SLOT_GET_WEAPON_STATE] or 0;
605
606    /// `void INPC::setAmmoInClip(int)`.
607    ///
608    /// # Safety
609    /// `npc` must be a live `INPC`.
610    pub fn npc_set_ammo_in_clip(npc: INPC, ammo: i32) = [0, SLOT_SET_AMMO_IN_CLIP];
611
612    /// `int INPC::getAmmoInClip()`.
613    ///
614    /// # Safety
615    /// `npc` must be a live `INPC`.
616    #[must_use]
617    pub fn npc_ammo_in_clip(npc: INPC) -> i32 = [0, SLOT_GET_AMMO_IN_CLIP] or 0;
618
619    /// `void INPC::shoot(int, PlayerBulletHitType, uint8_t, const Vector3 &, const Vector3 &, bool, EntityCheckType)`.
620    ///
621    /// # Safety
622    /// `npc` must be a live `INPC`.
623    pub fn npc_shoot(
624        npc: INPC,
625        hit_id: i32,
626        hit_type: u8,
627        weapon: u8,
628        end_point: &Vector3,
629        offset: &Vector3,
630        is_hit: bool,
631        between_check_flags: u8,
632    ) = [0, SLOT_SHOOT];
633
634    /// `bool INPC::isShooting()`.
635    ///
636    /// # Safety
637    /// `npc` must be a live `INPC`.
638    #[must_use]
639    pub fn npc_is_shooting(npc: INPC) -> bool = [0, SLOT_IS_SHOOTING] or false;
640
641    /// `void INPC::aimAt(const Vector3 &, bool, int, bool, const Vector3 &, EntityCheckType)`.
642    ///
643    /// # Safety
644    /// `npc` must be a live `INPC`.
645    pub fn npc_aim_at(
646        npc: INPC,
647        point: &Vector3,
648        shoot: bool,
649        shoot_delay: i32,
650        set_angle: bool,
651        offset_from: &Vector3,
652        between_check_flags: u8,
653    ) = [0, SLOT_AIM_AT];
654
655    /// `void INPC::aimAtPlayer(IPlayer &, bool, int, bool, const Vector3 &, const Vector3 &, EntityCheckType)`.
656    ///
657    /// # Safety
658    /// `npc` must be a live `INPC`.
659    pub fn npc_aim_at_player(
660        npc: INPC,
661        at_player: *mut IPlayer,
662        shoot: bool,
663        shoot_delay: i32,
664        set_angle: bool,
665        offset: &Vector3,
666        offset_from: &Vector3,
667        between_check_flags: u8,
668    ) = [0, SLOT_AIM_AT_PLAYER];
669
670    /// `void INPC::stopAim()`.
671    ///
672    /// # Safety
673    /// `npc` must be a live `INPC`.
674    pub fn npc_stop_aim(npc: INPC) = [0, SLOT_STOP_AIM];
675
676    /// `bool INPC::isAiming()`.
677    ///
678    /// # Safety
679    /// `npc` must be a live `INPC`.
680    #[must_use]
681    pub fn npc_is_aiming(npc: INPC) -> bool = [0, SLOT_IS_AIMING] or false;
682
683    /// `bool INPC::isAimingAtPlayer(IPlayer &)`.
684    ///
685    /// # Safety
686    /// `npc` must be a live `INPC`.
687    #[must_use]
688    pub fn npc_is_aiming_at_player(
689        npc: INPC,
690        player: *mut IPlayer,
691    ) -> bool = [0, SLOT_IS_AIMING_AT_PLAYER] or false;
692
693    /// `void INPC::setWeaponAccuracy(uint8_t, float)`.
694    ///
695    /// # Safety
696    /// `npc` must be a live `INPC`.
697    pub fn npc_set_weapon_accuracy(
698        npc: INPC,
699        weapon: u8,
700        accuracy: f32,
701    ) = [0, SLOT_SET_WEAPON_ACCURACY];
702
703    /// `float INPC::getWeaponAccuracy(uint8_t)`.
704    ///
705    /// # Safety
706    /// `npc` must be a live `INPC`.
707    #[must_use]
708    pub fn npc_weapon_accuracy(npc: INPC, weapon: u8) -> f32 = [0, SLOT_GET_WEAPON_ACCURACY] or 0.0;
709
710    /// `void INPC::setWeaponReloadTime(uint8_t, int)`.
711    ///
712    /// # Safety
713    /// `npc` must be a live `INPC`.
714    pub fn npc_set_weapon_reload_time(
715        npc: INPC,
716        weapon: u8,
717        time: i32,
718    ) = [0, SLOT_SET_WEAPON_RELOAD_TIME];
719
720    /// `int INPC::getWeaponReloadTime(uint8_t)`.
721    ///
722    /// # Safety
723    /// `npc` must be a live `INPC`.
724    #[must_use]
725    pub fn npc_weapon_reload_time(
726        npc: INPC,
727        weapon: u8,
728    ) -> i32 = [0, SLOT_GET_WEAPON_RELOAD_TIME] or 0;
729
730    /// `int INPC::getWeaponActualReloadTime(uint8_t)`.
731    ///
732    /// # Safety
733    /// `npc` must be a live `INPC`.
734    #[must_use]
735    pub fn npc_weapon_actual_reload_time(
736        npc: INPC,
737        weapon: u8,
738    ) -> i32 = [0, SLOT_GET_WEAPON_ACTUAL_RELOAD_TIME] or 0;
739
740    /// `void INPC::setWeaponShootTime(uint8_t, int)`.
741    ///
742    /// # Safety
743    /// `npc` must be a live `INPC`.
744    pub fn npc_set_weapon_shoot_time(
745        npc: INPC,
746        weapon: u8,
747        time: i32,
748    ) = [0, SLOT_SET_WEAPON_SHOOT_TIME];
749
750    /// `int INPC::getWeaponShootTime(uint8_t)`.
751    ///
752    /// # Safety
753    /// `npc` must be a live `INPC`.
754    #[must_use]
755    pub fn npc_weapon_shoot_time(
756        npc: INPC,
757        weapon: u8,
758    ) -> i32 = [0, SLOT_GET_WEAPON_SHOOT_TIME] or 0;
759
760    /// `void INPC::setWeaponClipSize(uint8_t, int)`.
761    ///
762    /// # Safety
763    /// `npc` must be a live `INPC`.
764    pub fn npc_set_weapon_clip_size(
765        npc: INPC,
766        weapon: u8,
767        size: i32,
768    ) = [0, SLOT_SET_WEAPON_CLIP_SIZE];
769
770    /// `int INPC::getWeaponClipSize(uint8_t)`.
771    ///
772    /// # Safety
773    /// `npc` must be a live `INPC`.
774    #[must_use]
775    pub fn npc_weapon_clip_size(npc: INPC, weapon: u8) -> i32 = [0, SLOT_GET_WEAPON_CLIP_SIZE] or 0;
776
777    /// `int INPC::getWeaponActualClipSize(uint8_t)`.
778    ///
779    /// # Safety
780    /// `npc` must be a live `INPC`.
781    #[must_use]
782    pub fn npc_weapon_actual_clip_size(
783        npc: INPC,
784        weapon: u8,
785    ) -> i32 = [0, SLOT_GET_WEAPON_ACTUAL_CLIP_SIZE] or 0;
786
787    /// `void INPC::enterVehicle(IVehicle &, uint8_t, NPCMoveType)`.
788    ///
789    /// # Safety
790    /// `npc` must be a live `INPC`.
791    pub fn npc_enter_vehicle(
792        npc: INPC,
793        vehicle: *mut IVehicle,
794        seat_id: u8,
795        move_type: i32,
796    ) = [0, SLOT_ENTER_VEHICLE];
797
798    /// `void INPC::exitVehicle()`.
799    ///
800    /// # Safety
801    /// `npc` must be a live `INPC`.
802    pub fn npc_exit_vehicle(npc: INPC) = [0, SLOT_EXIT_VEHICLE];
803
804    /// `bool INPC::putInVehicle(IVehicle &, uint8_t)`.
805    ///
806    /// # Safety
807    /// `npc` must be a live `INPC`.
808    #[must_use]
809    pub fn npc_put_in_vehicle(
810        npc: INPC,
811        vehicle: *mut IVehicle,
812        seat: u8,
813    ) -> bool = [0, SLOT_PUT_IN_VEHICLE] or false;
814
815    /// `bool INPC::removeFromVehicle()`.
816    ///
817    /// # Safety
818    /// `npc` must be a live `INPC`.
819    #[must_use]
820    pub fn npc_remove_from_vehicle(npc: INPC) -> bool = [0, SLOT_REMOVE_FROM_VEHICLE] or false;
821
822    /// `bool INPC::moveByPath(int, NPCMoveType, float, bool)`.
823    ///
824    /// # Safety
825    /// `npc` must be a live `INPC`.
826    #[must_use]
827    pub fn npc_move_by_path(
828        npc: INPC,
829        path_id: i32,
830        move_type: i32,
831        move_speed: f32,
832        reverse: bool,
833    ) -> bool = [0, SLOT_MOVE_BY_PATH] or false;
834
835    /// `void INPC::pausePath()`.
836    ///
837    /// # Safety
838    /// `npc` must be a live `INPC`.
839    pub fn npc_pause_path(npc: INPC) = [0, SLOT_PAUSE_PATH];
840
841    /// `void INPC::resumePath()`.
842    ///
843    /// # Safety
844    /// `npc` must be a live `INPC`.
845    pub fn npc_resume_path(npc: INPC) = [0, SLOT_RESUME_PATH];
846
847    /// `void INPC::stopPath()`.
848    ///
849    /// # Safety
850    /// `npc` must be a live `INPC`.
851    pub fn npc_stop_path(npc: INPC) = [0, SLOT_STOP_PATH];
852
853    /// `bool INPC::isMovingByPath()`.
854    ///
855    /// # Safety
856    /// `npc` must be a live `INPC`.
857    #[must_use]
858    pub fn npc_is_moving_by_path(npc: INPC) -> bool = [0, SLOT_IS_MOVING_BY_PATH] or false;
859
860    /// `bool INPC::isPathPaused()`.
861    ///
862    /// # Safety
863    /// `npc` must be a live `INPC`.
864    #[must_use]
865    pub fn npc_is_path_paused(npc: INPC) -> bool = [0, SLOT_IS_PATH_PAUSED] or false;
866
867    /// `int INPC::getCurrentPathId()`.
868    ///
869    /// # Safety
870    /// `npc` must be a live `INPC`.
871    #[must_use]
872    pub fn npc_current_path_id(npc: INPC) -> i32 = [0, SLOT_GET_CURRENT_PATH_ID] or 0;
873
874    /// `int INPC::getCurrentPathPointIndex()`.
875    ///
876    /// # Safety
877    /// `npc` must be a live `INPC`.
878    #[must_use]
879    pub fn npc_current_path_point_index(
880        npc: INPC,
881    ) -> i32 = [0, SLOT_GET_CURRENT_PATH_POINT_INDEX] or 0;
882
883    /// `IVehicle * INPC::getVehicle()`.
884    ///
885    /// # Safety
886    /// `npc` must be a live `INPC`.
887    #[must_use]
888    pub fn npc_vehicle(npc: INPC) -> *mut IVehicle = [0, SLOT_GET_VEHICLE] or std::ptr::null_mut();
889
890    /// `int INPC::getVehicleSeat()`.
891    ///
892    /// # Safety
893    /// `npc` must be a live `INPC`.
894    #[must_use]
895    pub fn npc_vehicle_seat(npc: INPC) -> i32 = [0, SLOT_GET_VEHICLE_SEAT] or 0;
896
897    /// `IVehicle * INPC::getEnteringVehicle()`.
898    ///
899    /// # Safety
900    /// `npc` must be a live `INPC`.
901    #[must_use]
902    pub fn npc_entering_vehicle(
903        npc: INPC,
904    ) -> *mut IVehicle = [0, SLOT_GET_ENTERING_VEHICLE] or std::ptr::null_mut();
905
906    /// `int INPC::getEnteringVehicleSeat()`.
907    ///
908    /// # Safety
909    /// `npc` must be a live `INPC`.
910    #[must_use]
911    pub fn npc_entering_vehicle_seat(npc: INPC) -> i32 = [0, SLOT_GET_ENTERING_VEHICLE_SEAT] or 0;
912
913    /// `void INPC::useVehicleSiren(bool)`.
914    ///
915    /// # Safety
916    /// `npc` must be a live `INPC`.
917    pub fn npc_use_vehicle_siren(npc: INPC, use_value: bool) = [0, SLOT_USE_VEHICLE_SIREN];
918
919    /// `bool INPC::isVehicleSirenUsed()`.
920    ///
921    /// # Safety
922    /// `npc` must be a live `INPC`.
923    #[must_use]
924    pub fn npc_is_vehicle_siren_used(npc: INPC) -> bool = [0, SLOT_IS_VEHICLE_SIREN_USED] or false;
925
926    /// `void INPC::setVehicleHealth(float)`.
927    ///
928    /// # Safety
929    /// `npc` must be a live `INPC`.
930    pub fn npc_set_vehicle_health(npc: INPC, health: f32) = [0, SLOT_SET_VEHICLE_HEALTH];
931
932    /// `float INPC::getVehicleHealth()`.
933    ///
934    /// # Safety
935    /// `npc` must be a live `INPC`.
936    #[must_use]
937    pub fn npc_vehicle_health(npc: INPC) -> f32 = [0, SLOT_GET_VEHICLE_HEALTH] or 0.0;
938
939    /// `void INPC::setVehicleHydraThrusters(int)`.
940    ///
941    /// # Safety
942    /// `npc` must be a live `INPC`.
943    pub fn npc_set_vehicle_hydra_thrusters(
944        npc: INPC,
945        direction: i32,
946    ) = [0, SLOT_SET_VEHICLE_HYDRA_THRUSTERS];
947
948    /// `int INPC::getVehicleHydraThrusters()`.
949    ///
950    /// # Safety
951    /// `npc` must be a live `INPC`.
952    #[must_use]
953    pub fn npc_vehicle_hydra_thrusters(
954        npc: INPC,
955    ) -> i32 = [0, SLOT_GET_VEHICLE_HYDRA_THRUSTERS] or 0;
956
957    /// `void INPC::setVehicleGearState(int)`.
958    ///
959    /// # Safety
960    /// `npc` must be a live `INPC`.
961    pub fn npc_set_vehicle_gear_state(npc: INPC, gear: i32) = [0, SLOT_SET_VEHICLE_GEAR_STATE];
962
963    /// `int INPC::getVehicleGearState()`.
964    ///
965    /// # Safety
966    /// `npc` must be a live `INPC`.
967    #[must_use]
968    pub fn npc_vehicle_gear_state(npc: INPC) -> i32 = [0, SLOT_GET_VEHICLE_GEAR_STATE] or 0;
969
970    /// `void INPC::setVehicleTrainSpeed(float)`.
971    ///
972    /// # Safety
973    /// `npc` must be a live `INPC`.
974    pub fn npc_set_vehicle_train_speed(npc: INPC, speed: f32) = [0, SLOT_SET_VEHICLE_TRAIN_SPEED];
975
976    /// `float INPC::getVehicleTrainSpeed()`.
977    ///
978    /// # Safety
979    /// `npc` must be a live `INPC`.
980    #[must_use]
981    pub fn npc_vehicle_train_speed(npc: INPC) -> f32 = [0, SLOT_GET_VEHICLE_TRAIN_SPEED] or 0.0;
982
983    /// `void INPC::resetAnimation()`.
984    ///
985    /// # Safety
986    /// `npc` must be a live `INPC`.
987    pub fn npc_reset_animation(npc: INPC) = [0, SLOT_RESET_ANIMATION];
988
989    /// `void INPC::setAnimation(int, float, bool, bool, bool, bool, int)`.
990    ///
991    /// # Safety
992    /// `npc` must be a live `INPC`.
993    pub fn npc_set_animation(
994        npc: INPC,
995        animation_id: i32,
996        delta: f32,
997        loop_value: bool,
998        lock_x: bool,
999        lock_y: bool,
1000        freeze: bool,
1001        time: i32,
1002    ) = [0, SLOT_SET_ANIMATION];
1003
1004    /// `void INPC::getAnimation(int &, float &, bool &, bool &, bool &, bool &, int &)`.
1005    ///
1006    /// # Safety
1007    /// `npc` must be a live `INPC`.
1008    pub fn npc_animation(
1009        npc: INPC,
1010        animation_id: &mut i32,
1011        delta: &mut f32,
1012        loop_value: &mut bool,
1013        lock_x: &mut bool,
1014        lock_y: &mut bool,
1015        freeze: &mut bool,
1016        time: &mut i32,
1017    ) = [0, SLOT_GET_ANIMATION];
1018
1019    /// `void INPC::applyAnimation(const AnimationData &)`.
1020    ///
1021    /// # Safety
1022    /// `npc` must be a live `INPC`.
1023    pub fn npc_apply_animation(
1024        npc: INPC,
1025        animation_data: &AnimationData,
1026    ) = [0, SLOT_APPLY_ANIMATION];
1027
1028    /// `void INPC::clearAnimations()`.
1029    ///
1030    /// # Safety
1031    /// `npc` must be a live `INPC`.
1032    pub fn npc_clear_animations(npc: INPC) = [0, SLOT_CLEAR_ANIMATIONS];
1033
1034    /// `void INPC::setSpecialAction(PlayerSpecialAction)`.
1035    ///
1036    /// # Safety
1037    /// `npc` must be a live `INPC`.
1038    pub fn npc_set_special_action(npc: INPC, action: i32) = [0, SLOT_SET_SPECIAL_ACTION];
1039
1040    /// `PlayerSpecialAction INPC::getSpecialAction()`.
1041    ///
1042    /// # Safety
1043    /// `npc` must be a live `INPC`.
1044    #[must_use]
1045    pub fn npc_special_action(npc: INPC) -> i32 = [0, SLOT_GET_SPECIAL_ACTION] or 0;
1046
1047    /// `bool INPC::startPlayback(StringView, bool, const Vector3 &, const GTAQuat &)`.
1048    ///
1049    /// # Safety
1050    /// `npc` must be a live `INPC`.
1051    #[must_use]
1052    pub fn npc_start_playback(
1053        npc: INPC,
1054        record_name: StringView,
1055        auto_unload: bool,
1056        point: &Vector3,
1057        rotation: &GTAQuat,
1058    ) -> bool = [0, SLOT_START_PLAYBACK] or false;
1059
1060    /// `bool INPC::startPlayback(int, bool, const Vector3 &, const GTAQuat &)`.
1061    ///
1062    /// # Safety
1063    /// `npc` must be a live `INPC`.
1064    #[must_use]
1065    pub fn npc_start_playback_id(
1066        npc: INPC,
1067        record_id: i32,
1068        auto_unload: bool,
1069        point: &Vector3,
1070        rotation: &GTAQuat,
1071    ) -> bool = [0, SLOT_START_PLAYBACK_ID] or false;
1072
1073    /// `void INPC::stopPlayback()`.
1074    ///
1075    /// # Safety
1076    /// `npc` must be a live `INPC`.
1077    pub fn npc_stop_playback(npc: INPC) = [0, SLOT_STOP_PLAYBACK];
1078
1079    /// `void INPC::pausePlayback(bool)`.
1080    ///
1081    /// # Safety
1082    /// `npc` must be a live `INPC`.
1083    pub fn npc_pause_playback(npc: INPC, paused: bool) = [0, SLOT_PAUSE_PLAYBACK];
1084
1085    /// `bool INPC::isPlayingPlayback()`.
1086    ///
1087    /// # Safety
1088    /// `npc` must be a live `INPC`.
1089    #[must_use]
1090    pub fn npc_is_playing_playback(npc: INPC) -> bool = [0, SLOT_IS_PLAYING_PLAYBACK] or false;
1091
1092    /// `bool INPC::isPlaybackPaused()`.
1093    ///
1094    /// # Safety
1095    /// `npc` must be a live `INPC`.
1096    #[must_use]
1097    pub fn npc_is_playback_paused(npc: INPC) -> bool = [0, SLOT_IS_PLAYBACK_PAUSED] or false;
1098
1099    /// `bool INPC::playNode(int, NPCMoveType, float, float, bool)`.
1100    ///
1101    /// # Safety
1102    /// `npc` must be a live `INPC`.
1103    #[must_use]
1104    pub fn npc_play_node(
1105        npc: INPC,
1106        node_id: i32,
1107        move_type: i32,
1108        move_speed: f32,
1109        radius: f32,
1110        set_angle: bool,
1111    ) -> bool = [0, SLOT_PLAY_NODE] or false;
1112
1113    /// `void INPC::stopPlayingNode()`.
1114    ///
1115    /// # Safety
1116    /// `npc` must be a live `INPC`.
1117    pub fn npc_stop_playing_node(npc: INPC) = [0, SLOT_STOP_PLAYING_NODE];
1118
1119    /// `void INPC::pausePlayingNode()`.
1120    ///
1121    /// # Safety
1122    /// `npc` must be a live `INPC`.
1123    pub fn npc_pause_playing_node(npc: INPC) = [0, SLOT_PAUSE_PLAYING_NODE];
1124
1125    /// `void INPC::resumePlayingNode()`.
1126    ///
1127    /// # Safety
1128    /// `npc` must be a live `INPC`.
1129    pub fn npc_resume_playing_node(npc: INPC) = [0, SLOT_RESUME_PLAYING_NODE];
1130
1131    /// `bool INPC::isPlayingNodePaused()`.
1132    ///
1133    /// # Safety
1134    /// `npc` must be a live `INPC`.
1135    #[must_use]
1136    pub fn npc_is_playing_node_paused(
1137        npc: INPC,
1138    ) -> bool = [0, SLOT_IS_PLAYING_NODE_PAUSED] or false;
1139
1140    /// `bool INPC::isPlayingNode()`.
1141    ///
1142    /// # Safety
1143    /// `npc` must be a live `INPC`.
1144    #[must_use]
1145    pub fn npc_is_playing_node(npc: INPC) -> bool = [0, SLOT_IS_PLAYING_NODE] or false;
1146
1147    /// `uint16_t INPC::changeNode(int, uint16_t)`.
1148    ///
1149    /// # Safety
1150    /// `npc` must be a live `INPC`.
1151    #[must_use]
1152    pub fn npc_change_node(
1153        npc: INPC,
1154        node_id: i32,
1155        target_point_id: u16,
1156    ) -> u16 = [0, SLOT_CHANGE_NODE] or 0;
1157
1158    /// `bool INPC::updateNodePoint(uint16_t)`.
1159    ///
1160    /// # Safety
1161    /// `npc` must be a live `INPC`.
1162    #[must_use]
1163    pub fn npc_update_node_point(
1164        npc: INPC,
1165        point_id: u16,
1166    ) -> bool = [0, SLOT_UPDATE_NODE_POINT] or false;
1167
1168    /// `void INPC::setInvulnerable(bool)`.
1169    ///
1170    /// # Safety
1171    /// `npc` must be a live `INPC`.
1172    pub fn npc_set_invulnerable(npc: INPC, toggle: bool) = [0, SLOT_SET_INVULNERABLE];
1173
1174    /// `bool INPC::isInvulnerable()`.
1175    ///
1176    /// # Safety
1177    /// `npc` must be a live `INPC`.
1178    #[must_use]
1179    pub fn npc_is_invulnerable(npc: INPC) -> bool = [0, SLOT_IS_INVULNERABLE] or false;
1180
1181    /// `void INPC::setSurfingData(const PlayerSurfingData &)`.
1182    ///
1183    /// # Safety
1184    /// `npc` must be a live `INPC`.
1185    pub fn npc_set_surfing_data(npc: INPC, data: &PlayerSurfingData) = [0, SLOT_SET_SURFING_DATA];
1186
1187    /// `PlayerSurfingData INPC::getSurfingData()`.
1188    ///
1189    /// # Safety
1190    /// `npc` must be a live `INPC`.
1191    #[must_use]
1192    pub fn npc_surfing_data(
1193        npc: INPC,
1194    ) -> PlayerSurfingData = [0, SLOT_GET_SURFING_DATA] or PlayerSurfingData::default();
1195
1196    /// `void INPC::resetSurfingData()`.
1197    ///
1198    /// # Safety
1199    /// `npc` must be a live `INPC`.
1200    pub fn npc_reset_surfing_data(npc: INPC) = [0, SLOT_RESET_SURFING_DATA];
1201
1202    /// `bool INPC::isMovingToPlayer(IPlayer &)`.
1203    ///
1204    /// # Safety
1205    /// `npc` must be a live `INPC`.
1206    #[must_use]
1207    pub fn npc_is_moving_to_player(
1208        npc: INPC,
1209        player: *mut IPlayer,
1210    ) -> bool = [0, SLOT_IS_MOVING_TO_PLAYER] or false;
1211
1212    /// `void INPC::kill(IPlayer *, uint8_t)`.
1213    ///
1214    /// # Safety
1215    /// `npc` must be a live `INPC`.
1216    pub fn npc_kill(npc: INPC, killer: *mut IPlayer, weapon: u8) = [0, SLOT_KILL];
1217
1218    /// `IPlayer * INPC::getPlayerAimingAt()`.
1219    ///
1220    /// # Safety
1221    /// `npc` must be a live `INPC`.
1222    #[must_use]
1223    pub fn npc_player_aiming_at(
1224        npc: INPC,
1225    ) -> *mut IPlayer = [0, SLOT_GET_PLAYER_AIMING_AT] or std::ptr::null_mut();
1226
1227    /// `IPlayer * INPC::getPlayerMovingTo()`.
1228    ///
1229    /// # Safety
1230    /// `npc` must be a live `INPC`.
1231    #[must_use]
1232    pub fn npc_player_moving_to(
1233        npc: INPC,
1234    ) -> *mut IPlayer = [0, SLOT_GET_PLAYER_MOVING_TO] or std::ptr::null_mut();
1235
1236    /// `void INPC::setWeaponState(PlayerWeaponState)`.
1237    ///
1238    /// # Safety
1239    /// `npc` must be a live `INPC`.
1240    pub fn npc_set_weapon_state(npc: INPC, state: i8) = [0, SLOT_SET_WEAPON_STATE];
1241
1242    /// `Vector3 INPC::getPositionMovingTo()`.
1243    ///
1244    /// # Safety
1245    /// `npc` must be a live `INPC`.
1246    #[must_use]
1247    pub fn npc_position_moving_to(
1248        npc: INPC,
1249    ) -> Vector3 = [0, SLOT_GET_POSITION_MOVING_TO] or Vector3::ZERO;
1250}