]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/vehicles/racer.qc
de-junk vehicles/racer.qc slightly.
[divverent/nexuiz.git] / data / qcsrc / server / vehicles / racer.qc
1 #define RACER_MIN '-40 -40 0'\r
2 #define RACER_MAX '40 40 44'\r
3 \r
4 void racer_exit(float eject);\r
5 void racer_enter();\r
6 \r
7 float  jetfromtag_power;
8 float  jetfromtag_normpower;
9 float  jetfromtag_nosolid;\r
10 vector jetfromtag_origin;
11 \r
12 vector jetfromtag(string tagname,float jet_length,float air_power,float solid_power)\r
13 {\r
14     vector force_dir;
15     float  air_frac, solid_frac, air_pwr, solid_pwr;\r
16 \r
17     jetfromtag_origin = gettaginfo(self,gettagindex(self,tagname));
18     v_forward = normalize(v_forward);
19 \r
20     force_dir = jetfromtag_origin - v_forward * jet_length;\r
21     traceline(jetfromtag_origin, force_dir, MOVE_NORMAL, self);\r
22 \r
23     solid_frac = 1 - trace_fraction;\r
24     air_frac   = trace_fraction;
25
26     if(solid_frac < 0.1)
27         jetfromtag_nosolid += 1;
28
29     solid_pwr = solid_frac * solid_power;
30     air_pwr   = air_frac * air_power;
31
32     jetfromtag_power     = solid_pwr + air_pwr;
33     jetfromtag_normpower = jetfromtag_power / (air_power+solid_power);
34     if(trace_fraction == 1)
35         return v_forward;\r
36     else\r
37         return v_forward * (jetfromtag_power + cvar("g_vehicle_racer_power_min"));\r
38 }\r
39 \r
40 void racer_align4point(float spring_length,float spring_up,float blendrate)\r
41 {\r
42     vector fl_org,fl_force,fr_org,fr_force,bl_org,bl_force,br_org,br_force;
43     vector push_vector,align;\r
44     float fl_push, fr_push, bl_push, br_push;\r
45
46     jetfromtag_nosolid = 0;\r
47
48     fr_force = jetfromtag("tag_engine_fr",spring_length,cvar("g_vehicle_racer_power_air"), cvar("g_vehicle_racer_power_solid"));\r
49     fr_org   = jetfromtag_origin; fr_push = jetfromtag_normpower;
50 \r
51     fl_force = jetfromtag("tag_engine_fl",spring_length,cvar("g_vehicle_racer_power_air"), cvar("g_vehicle_racer_power_solid"));
52     fl_org   = jetfromtag_origin; fl_push = jetfromtag_normpower;
53
54     br_force = jetfromtag("tag_engine_br",spring_length,cvar("g_vehicle_racer_power_air"), cvar("g_vehicle_racer_power_solid"));
55     br_org   = jetfromtag_origin; br_push = jetfromtag_normpower;
56 \r
57     bl_force = jetfromtag("tag_engine_bl",spring_length,cvar("g_vehicle_racer_power_air"), cvar("g_vehicle_racer_power_solid"));
58     bl_org   = jetfromtag_origin; bl_push = jetfromtag_normpower;
59
60     push_vector = fr_force + fl_force + br_force + bl_force;
61
62     align = align;\r
63 \r
64     align_x = (fl_push - bl_push);
65     align_x += (fr_push - br_push);
66     align_x *= 360;
67 \r
68     align_z = (fl_push - fr_push);
69     align_z += (bl_push - br_push);
70     align_z *= 360;
71
72     self.angles_x *= 0.96;
73     self.angles_z *= 0.96;
74
75     self.angles_x += align_x * frametime;
76     self.angles_z += align_z * frametime;
77
78     self.velocity =  self.velocity + (push_vector * frametime);
79     self.velocity_z -= sv_gravity * frametime;\r
80 }\r
81 \r
82 void racer_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)\r
83 {\r
84     self.velocity += force;\r
85 }\r
86 \r
87 float racer_pplug()\r
88 {\r
89     entity player,racer;\r
90     float ftmp,ftmp2;\r
91 \r
92 \r
93     player = self;\r
94     racer = self.vehicle;\r
95     player.fixangle = FALSE;\r
96 \r
97     player.BUTTON_ZOOM = 0;\r
98     player.BUTTON_CROUCH = 0;\r
99 \r
100     self = racer;\r
101 \r
102     if(player.BUTTON_USE)\r
103     {\r
104         self = racer;\r
105         racer_exit(0);\r
106         self = player;\r
107         return 0;\r
108     }\r
109 \r
110     racer.angles_x *= -1;\r
111     makevectors(racer.angles);\r
112     racer.angles_x *= -1;\r
113 \r
114     // Turn Body\r
115     ftmp = cvar("g_vehicle_racer_turnspeed") / server_fps;\r
116     ftmp2 = ftmp * -1;\r
117 \r
118     ftmp = bound(ftmp2,shortangle_f(player.v_angle_y - racer.angles_y,racer.angles_y),ftmp);\r
119 \r
120     {\r
121         racer.angles_y = safeangle(racer.angles_y + ftmp);\r
122         if(player.BUTTON_JUMP)\r
123         {\r
124             player.BUTTON_JUMP = 0;\r
125             racer.velocity  = racer.velocity  + v_forward * 250 + v_up * 600;\r
126         }\r
127         else\r
128         {\r
129             if(vlen(player.movement) == 0)\r
130             {\r
131                 self = racer;\r
132                 ftmp = self.velocity_z;\r
133                 self.velocity = self.velocity - self.velocity * cvar("g_vehicle_racer_speed_stop");\r
134                 self.velocity_z = ftmp;\r
135             }\r
136             else\r
137             {\r
138 \r
139                 if(player.movement_x != 0)\r
140                 {\r
141                     if(player.movement_x > 0)\r
142                         player.movement_x = 1;\r
143                     else if(player.movement_x < 0)\r
144                         player.movement_x = -1;\r
145                 }\r
146 \r
147                 if(player.movement_y != 0)\r
148                 {\r
149                     if(player.movement_y < 0)\r
150                         player.movement_y = -1;\r
151                     else if(player.movement_y > 0)\r
152                         player.movement_y = 1;\r
153                 }\r
154 \r
155                 self = racer;\r
156                 self.velocity  = self.velocity + ((v_right * player.movement_y) * cvar("g_vehicle_racer_speed_strafe")) * frametime;\r
157                 self.velocity  = self.velocity + ((v_forward * player.movement_x) * cvar("g_vehicle_racer_speed_forward")) * frametime;\r
158             }\r
159         }\r
160         self = racer;\r
161     }
162 \r
163     vector df;\r
164 \r
165     self = racer;\r
166
167     df = vlen(self.velocity) * cvar("g_vehicle_racer_downforce") * v_up;
168     self.velocity = self.velocity - df;\r
169     player.movement = racer.velocity;\r
170     racer_align4point(cvar("g_vehicle_racer_springlength"),100,cvar("g_vehicle_racer_inert"));\r
171 \r
172     if(cvar("g_vehicle_racer_drag"))\r
173         self.velocity  = movelib_dragvec(cvar("g_vehicle_racer_drag"),cvar("g_vehicle_racer_dragexp"));
174
175     self = player;\r
176     player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;\r
177     setorigin(player,racer.origin + '0 0 32');\r
178     player.velocity = racer.velocity;\r
179 \r
180     return 1;\r
181 }\r
182 \r
183 void racer_think()\r
184 {\r
185     movelib_beak_simple(cvar("g_vehicle_racer_speed_stop"));\r
186 \r
187     self.nextthink = time;\r
188 }\r
189 \r
190 void racer_enter()\r
191 {\r
192     self.owner = other;\r
193     self.owner.angles = self.angles;\r
194 \r
195     //setattachment(other,self,"");\r
196     self.nextthink = 0;\r
197     self.think = SUB_Null;\r
198     self.owner.takedamage     = DAMAGE_NO;\r
199     self.owner.solid          = SOLID_NOT;\r
200     self.owner.movetype       = MOVETYPE_NOCLIP;\r
201     //setsize(self.owner,spiderbot_MIN,spiderbot_MAX);\r
202     self.owner.alpha          = -1;\r
203     self.owner.PlayerPhysplug = racer_pplug;\r
204     self.owner.vehicle        = self;\r
205     self.owner.event_damage   = SUB_Null;\r
206     //self.event_damage         = vehicle_stdproc_damage ;\r
207     self.colormap             = self.owner.colormap;\r
208     //self.tur_head.colormap    = self.owner.colormap;\r
209     //self.vehicle_hudmodel.viewmodelforclient = self.owner;\r
210     //self.owner.hud            = HUD_SPIDEBOT;\r
211     //self.owner.vehicle_health = (self.vehicle_health / cvar("g_vehicle_spiderbot_health"));\r
212     //self.owner.vehicle_shield = (self.vehicle_shield / cvar("g_vehicle_spiderbot_shield"));\r
213 \r
214     //setorigin(self.owner,self.origin);\r
215     //setattachment(self.owner,self,"");\r
216     //setorigin(self.owner,'0 0 0');\r
217 \r
218     msg_entity = other;\r
219     WriteByte (MSG_ONE, SVC_SETVIEWPORT);\r
220     WriteEntity( MSG_ONE, self.vehicle_viewport);\r
221 \r
222     WriteByte (MSG_ONE, SVC_SETVIEWANGLES);  // 10 = SVC_SETVIEWANGLES\r
223     WriteAngle(MSG_ONE,  self.angles_x);    // tilt\r
224     WriteAngle(MSG_ONE,  self.angles_y);    // yaw\r
225     WriteAngle(MSG_ONE,  0);                // roll\r
226 \r
227     //self.owner.view_ofs = '0 0 0';\r
228     //self.tur_head.nodrawtoclient = self.owner;\r
229 }\r
230 \r
231 void racer_exit(float eject)\r
232 {\r
233     self.velocity = '0 0 0';\r
234 \r
235     msg_entity = self.owner;\r
236     WriteByte (MSG_ONE, SVC_SETVIEWPORT);\r
237     WriteEntity( MSG_ONE, self.owner);\r
238 \r
239     WriteByte (MSG_ONE, SVC_SETVIEWANGLES);  // 10 = SVC_SETVIEWANGLES\r
240     WriteAngle(MSG_ONE,  0);                // tilt\r
241     WriteAngle(MSG_ONE,  self.angles_y);    // yaw\r
242     WriteAngle(MSG_ONE,  0);                // roll\r
243 \r
244     self.think = racer_think;\r
245     self.nextthink = time;\r
246 \r
247     self.owner.takedamage     = DAMAGE_AIM;\r
248     self.owner.solid          = SOLID_SLIDEBOX;\r
249     self.owner.movetype       = MOVETYPE_WALK;\r
250 \r
251     setsize(self.owner,PL_MIN,PL_MAX);\r
252 \r
253     self.owner.alpha          = 1;\r
254     self.owner.PlayerPhysplug = SUB_Null;\r
255     self.owner.vehicle        = world;\r
256         self.owner.view_ofs       = PL_VIEW_OFS;\r
257         self.owner.event_damage   = PlayerDamage;\r
258         //self.owner.hud            = HUD_NORMAL;\r
259 \r
260         self.colormap            = 1024;\r
261         //self.tur_head.colormap = 1024;\r
262 \r
263         //self.vehicle_hudmodel.viewmodelforclient = self;\r
264         //self.tur_head.nodrawtoclient             = self;\r
265     setattachment(self.owner,world,"");\r
266 \r
267         if(eject)\r
268         {\r
269             makevectors(self.angles);\r
270             setorigin(self.owner,self.origin + v_forward * 100);\r
271             self.owner.velocity = (v_up + v_forward * 0.25) * 750;\r
272         }\r
273         else\r
274         setorigin(self.owner,self.origin + '0 0 64' - v_forward * 200);\r
275 \r
276     self.owner = world;\r
277 }\r
278 \r
279 \r
280 void racer_touch()\r
281 {\r
282     if(self.owner)\r
283     {\r
284         if(vlen(self.velocity) == 0)\r
285             return;\r
286 \r
287         if(other.classname != "player")\r
288             return;\r
289 \r
290         vector a;\r
291         a = normalize(other.origin - self.origin);\r
292         a = a - normalize(self.velocity);\r
293 \r
294         return;\r
295     }\r
296 \r
297     if(other.classname != "player")\r
298         return;\r
299 \r
300     if(other.deadflag != DEAD_NO)\r
301         return;\r
302 \r
303     if(other.vehicle != world)\r
304         return;\r
305 \r
306     racer_enter();\r
307 }\r
308 \r
309 /*\r
310 float racer_customizeentityforclient()\r
311 {\r
312     if(self.deadflag == DEAD_DEAD)\r
313         return FALSE;\r
314 \r
315     return TRUE;\r
316 }\r
317 */\r
318 \r
319 void racer_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force);\r
320 void racer_spawn()\r
321 {\r
322     self.think = racer_think;\r
323     self.nextthink = time;\r
324 \r
325     //self.vehicle_health = CCVAR("_health");\r
326     //self.vehicle_shield = CCVAR("_shield");\r
327     //self.event_damage = vehicle_stdproc_damage;\r
328     self.event_damage = racer_damage;\r
329     //self.iscreature = TRUE;\r
330     self.scale = 0.5;\r
331     self.movetype   = MOVETYPE_FLY;\r
332     self.solid      = SOLID_SLIDEBOX;\r
333     //self.takedamage = DAMAGE_AIM;\r
334     self.touch      = racer_touch;\r
335     //self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = 1;\r
336     self.alpha = 1;\r
337     //self.tur_head.angles = '0 0 0';\r
338         //self.colormap = 1024;\r
339         //self.tur_head.colormap = 1024;\r
340         self.deadflag    = DEAD_NO;\r
341     self.bot_attack = TRUE;\r
342     setorigin(self,self.origin + '0 0 128');\r
343     setsize(self,RACER_MIN*0.5,RACER_MAX*0.5);\r
344     setorigin(self,self.tur_aimpos);\r
345     pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);\r
346 }\r
347 \r
348 void racer_blowup()\r
349 {\r
350     /*\r
351     sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);\r
352     pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);\r
353 \r
354     //RadiusDamage (self, self.owner, self.owner.shot_dmg, self.owner.shot_dmg * 0.5, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);\r
355     RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_TURRET, world);\r
356 \r
357     self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = -1;\r
358     self.nextthink  = time + 10;\r
359     self.think      = spiderbot_spawn;\r
360 \r
361     setorigin(self,self.tur_aimpos);\r
362     */\r
363 }\r
364 \r
365 void racer_die()\r
366 {\r
367 \r
368     /*\r
369     self.health = 0;\r
370     self.event_damage = SUB_Null;\r
371     self.iscreature = FALSE;\r
372     self.solid      = SOLID_NOT;\r
373     self.takedamage = DAMAGE_NO;\r
374     self.touch      = SUB_Null;\r
375     self.nextthink  = time + random() * 2;\r
376     self.think      = spiderbot_blowup;\r
377     self.deadflag    = DEAD_DEAD;\r
378         self.vehicle_hudmodel.viewmodelforclient = self;\r
379         self.frame = 0;\r
380         self.tur_head.frame = 0;\r
381         */\r
382 }\r
383 \r
384 void racer_dinit()\r
385 {\r
386 \r
387     server_fps = (1 / sys_ticrate);\r
388 \r
389     /*\r
390     addstat(STAT_HUD, AS_INT,  hud);\r
391         addstat(STAT_SPIDERBOT_ROCKETS, AS_INT,   rockets);\r
392         addstat(STAT_SPIDERBOT_RELOAD,  AS_FLOAT, rockets_reload);\r
393         addstat(STAT_SPIDERBOT_HEAT,    AS_FLOAT, vehicle_heat);\r
394         addstat(STAT_SPIDERBOT_HEALTH,  AS_FLOAT, vehicle_health);\r
395         addstat(STAT_SPIDERBOT_SHIELD,  AS_FLOAT, vehicle_shield);\r
396         */\r
397 \r
398     if (self.netname == "")      self.netname     = "Race PoD";\r
399 \r
400     self.vehicle_viewport = spawn();\r
401     self.event_damage = racer_damage;\r
402     //self.gravity = 2;\r
403     //self.vehicle_hudmodel = spawn();\r
404     //self.vehicle_flags = VHF_HASSHIELD | VHF_SHIELDREGEN | VHF_HEALTHREGEN;\r
405     //self.cvar_basename = "g_vehicle_spiderbot";\r
406 \r
407     setmodel (self.vehicle_viewport, "models/null.md3");\r
408     setmodel(self,"models/racers/waka.dpm");\r
409 \r
410     setattachment(self.vehicle_viewport,self,"");\r
411     //self.tur_head.customizeentityforclient = spiderbot_customizeentityforclient;\r
412 \r
413     setorigin(self.vehicle_viewport,'-400 0 40');\r
414     self.tur_aimpos = self.origin;\r
415     racer_spawn();\r
416 \r
417     //self.vehicle_die = spiderbot_die;\r
418     //self.vehicle_exit = spiderbot_exit;\r
419 }\r
420 \r
421 void spawnfunc_racer()\r
422 {\r
423     g_turrets_common_precash();\r
424 \r
425     precache_model ( "models/racers/waka.dpm");\r
426 \r
427     self.think = racer_dinit;\r
428     self.nextthink = time + 0.5;\r
429 }\r