]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/vehicles/vehicles.qh
New vehicle system based on weapons system
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / vehicles / vehicles.qh
diff --git a/qcsrc/common/vehicles/vehicles.qh b/qcsrc/common/vehicles/vehicles.qh
new file mode 100644 (file)
index 0000000..db5bb8d
--- /dev/null
@@ -0,0 +1,89 @@
+// vehicle requests
+#define VR_SETUP          1 // (BOTH) setup vehicle data
+#define VR_THINK                 2 // (SERVER) logic to run every frame
+#define VR_DEATH          3 // (SERVER) called when vehicle dies
+#define VR_PRECACHE       4 // (BOTH) precaches models/sounds used by this vehicle
+#define VR_ENTER          5 // (SERVER) called when a player enters this vehicle
+#define VR_SPAWN          6 // (SERVER) called when the vehicle re-spawns
+#define VR_IMPACT         7 // (SERVER) called when a vehicle hits something
+#define VR_HUD            8 // (CLIENT) logic to run every frame
+
+// functions:
+entity get_vehicleinfo(float id);
+
+// fields:
+.entity tur_head;
+
+// flags:
+.float vehicle_flags;
+const float VHF_ISVEHICLE              = 2; /// Indicates vehicle
+const float VHF_HASSHIELD              = 4; /// Vehicle has shileding
+const float VHF_SHIELDREGEN            = 8; /// Vehicles shield regenerates
+const float VHF_HEALTHREGEN            = 16; /// Vehicles health regenerates
+const float VHF_ENERGYREGEN            = 32; /// Vehicles energy regenerates
+const float VHF_DEATHEJECT             = 64; /// Vehicle ejects pilot upon fatal damage
+const float VHF_MOVE_GROUND            = 128; /// Vehicle moves on gound
+const float VHF_MOVE_HOVER             = 256; /// Vehicle hover close to gound
+const float VHF_MOVE_FLY               = 512; /// Vehicle is airborn
+const float VHF_DMGSHAKE               = 1024; /// Add random velocity each frame if health < 50%
+const float VHF_DMGROLL                        = 2048; /// Add random angles each frame if health < 50%
+const float VHF_DMGHEADROLL            = 4096; /// Add random head angles each frame if health < 50%
+const float VHF_MULTISLOT              = 8192; /// Vehicle has multiple player slots
+const float VHF_PLAYERSLOT             = 16384; /// This ent is a player slot on a multi-person vehicle
+
+
+// entity properties of vehicleinfo:
+.float vehicleid; // VEH_...
+.string netname; // short name
+.string vehicle_name; // human readable name
+.float(float) vehicle_func; // v_...
+.string mdl; // currently a copy of the model
+.string model; // full name of model
+.string head_model; // full name of tur_head model
+.string hud_model; // cockpit model
+.string tag_head; // tur_head model tag
+.string tag_hud; // hud model tag
+.string tag_view; // cockpit model tag
+.float() PlayerPhysplug; // player physics mod
+.float spawnflags;
+.vector mins, maxs; // vehicle hitbox size
+
+// other useful macros
+#define VEH_ACTION(vehicletype,mrequest) (get_vehicleinfo(vehicletype)).vehicle_func(mrequest)
+#define VEH_NAME(vehicletype) (get_vehicleinfo(vehicletype)).vehicle_name
+
+// =====================
+//  Vehicle Registration
+// =====================
+
+float v_null(float dummy);
+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);
+void register_vehicles_done();
+
+const float VEH_MAXCOUNT = 24;
+#define VEH_FIRST 1
+float VEH_COUNT;
+float VEH_LAST;
+
+#define REGISTER_VEHICLE_2(id,func,vehicleflags,min_s,max_s,modelname,headmodelname,hudmodelname,headtag,hudtag,viewtag,shortname,vname) \
+       float id; \
+       float func(float); \
+       void RegisterVehicles_##id() \
+       { \
+               VEH_LAST = (id = VEH_FIRST + VEH_COUNT); \
+               ++VEH_COUNT; \
+               register_vehicle(id,func,vehicleflags,min_s,max_s,modelname,headmodelname,hudmodelname,headtag,hudtag,viewtag,shortname,vname); \
+       } \
+       ACCUMULATE_FUNCTION(RegisterVehicles, RegisterVehicles_##id)
+#ifdef MENUQC
+#define REGISTER_VEHICLE(id,func,vehicleflags,min_s,max_s,modelname,headmodelname,hudmodelname,headtag,hudtag,viewtag,shortname,vname) \
+       REGISTER_VEHICLE_2(VEH_##id,v_null,vehicleflags,min_s,max_s,modelname,headmodelname,hudmodelname,headtag,hudtag,viewtag,shortname,vname)
+#else
+#define REGISTER_VEHICLE(id,func,vehicleflags,min_s,max_s,modelname,headmodelname,hudmodelname,headtag,hudtag,viewtag,shortname,vname) \
+       REGISTER_VEHICLE_2(VEH_##id,func,vehicleflags,min_s,max_s,modelname,headmodelname,hudmodelname,headtag,hudtag,viewtag,shortname,vname)
+#endif
+
+#include "all.qh"
+
+#undef REGISTER_VEHICLE
+ACCUMULATE_FUNCTION(RegisterVehicles, register_vehicles_done);