New vehicle system based on weapons system
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / vehicles / vehicles.qh
1 // vehicle requests
2 #define VR_SETUP          1 // (BOTH) setup vehicle data
3 #define VR_THINK                  2 // (SERVER) logic to run every frame
4 #define VR_DEATH          3 // (SERVER) called when vehicle dies
5 #define VR_PRECACHE       4 // (BOTH) precaches models/sounds used by this vehicle
6 #define VR_ENTER          5 // (SERVER) called when a player enters this vehicle
7 #define VR_SPAWN          6 // (SERVER) called when the vehicle re-spawns
8 #define VR_IMPACT         7 // (SERVER) called when a vehicle hits something
9 #define VR_HUD            8 // (CLIENT) logic to run every frame
10
11 // functions:
12 entity get_vehicleinfo(float id);
13
14 // fields:
15 .entity tur_head;
16
17 // flags:
18 .float vehicle_flags;
19 const float VHF_ISVEHICLE               = 2; /// Indicates vehicle
20 const float VHF_HASSHIELD               = 4; /// Vehicle has shileding
21 const float VHF_SHIELDREGEN             = 8; /// Vehicles shield regenerates
22 const float VHF_HEALTHREGEN             = 16; /// Vehicles health regenerates
23 const float VHF_ENERGYREGEN             = 32; /// Vehicles energy regenerates
24 const float VHF_DEATHEJECT              = 64; /// Vehicle ejects pilot upon fatal damage
25 const float VHF_MOVE_GROUND             = 128; /// Vehicle moves on gound
26 const float VHF_MOVE_HOVER              = 256; /// Vehicle hover close to gound
27 const float VHF_MOVE_FLY                = 512; /// Vehicle is airborn
28 const float VHF_DMGSHAKE                = 1024; /// Add random velocity each frame if health < 50%
29 const float VHF_DMGROLL                 = 2048; /// Add random angles each frame if health < 50%
30 const float VHF_DMGHEADROLL             = 4096; /// Add random head angles each frame if health < 50%
31 const float VHF_MULTISLOT               = 8192; /// Vehicle has multiple player slots
32 const float VHF_PLAYERSLOT              = 16384; /// This ent is a player slot on a multi-person vehicle
33
34
35 // entity properties of vehicleinfo:
36 .float vehicleid; // VEH_...
37 .string netname; // short name
38 .string vehicle_name; // human readable name
39 .float(float) vehicle_func; // v_...
40 .string mdl; // currently a copy of the model
41 .string model; // full name of model
42 .string head_model; // full name of tur_head model
43 .string hud_model; // cockpit model
44 .string tag_head; // tur_head model tag
45 .string tag_hud; // hud model tag
46 .string tag_view; // cockpit model tag
47 .float() PlayerPhysplug; // player physics mod
48 .float spawnflags;
49 .vector mins, maxs; // vehicle hitbox size
50
51 // other useful macros
52 #define VEH_ACTION(vehicletype,mrequest) (get_vehicleinfo(vehicletype)).vehicle_func(mrequest)
53 #define VEH_NAME(vehicletype) (get_vehicleinfo(vehicletype)).vehicle_name
54
55 // =====================
56 //  Vehicle Registration
57 // =====================
58
59 float v_null(float dummy);
60 void register_vehicle(float id, float(float) func, float vehicleflags, vector min_s, vector max_s, string modelname, string headmodelname, string hudmodelname, string headtag, string hudtag, string viewtag, string shortname, string vname);
61 void register_vehicles_done();
62
63 const float VEH_MAXCOUNT = 24;
64 #define VEH_FIRST 1
65 float VEH_COUNT;
66 float VEH_LAST;
67
68 #define REGISTER_VEHICLE_2(id,func,vehicleflags,min_s,max_s,modelname,headmodelname,hudmodelname,headtag,hudtag,viewtag,shortname,vname) \
69         float id; \
70         float func(float); \
71         void RegisterVehicles_##id() \
72         { \
73                 VEH_LAST = (id = VEH_FIRST + VEH_COUNT); \
74                 ++VEH_COUNT; \
75                 register_vehicle(id,func,vehicleflags,min_s,max_s,modelname,headmodelname,hudmodelname,headtag,hudtag,viewtag,shortname,vname); \
76         } \
77         ACCUMULATE_FUNCTION(RegisterVehicles, RegisterVehicles_##id)
78 #ifdef MENUQC
79 #define REGISTER_VEHICLE(id,func,vehicleflags,min_s,max_s,modelname,headmodelname,hudmodelname,headtag,hudtag,viewtag,shortname,vname) \
80         REGISTER_VEHICLE_2(VEH_##id,v_null,vehicleflags,min_s,max_s,modelname,headmodelname,hudmodelname,headtag,hudtag,viewtag,shortname,vname)
81 #else
82 #define REGISTER_VEHICLE(id,func,vehicleflags,min_s,max_s,modelname,headmodelname,hudmodelname,headtag,hudtag,viewtag,shortname,vname) \
83         REGISTER_VEHICLE_2(VEH_##id,func,vehicleflags,min_s,max_s,modelname,headmodelname,hudmodelname,headtag,hudtag,viewtag,shortname,vname)
84 #endif
85
86 #include "all.qh"
87
88 #undef REGISTER_VEHICLE
89 ACCUMULATE_FUNCTION(RegisterVehicles, register_vehicles_done);