]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/vehicles/spiderbot.qc
vehicles server & client code, disabled by default. see vehicles/vehicles.qh
[divverent/nexuiz.git] / data / qcsrc / server / vehicles / spiderbot.qc
1 #define MODEL_SPIDERBOT_FORWARD_START 1\r
2 #define MODEL_SPIDERBOT_FORWARD_END 31\r
3 #define MODEL_SPIDERBOT_FORWARD_LENGTH 31\r
4 \r
5 #define MODEL_SPIDERBOT_BACKWARDS_START 32\r
6 #define MODEL_SPIDERBOT_BACKWARDS_END 62\r
7 #define MODEL_SPIDERBOT_BACKWARDS_LENGTH 31\r
8 \r
9 #define MODEL_SPIDERBOT_LEFT_START 63\r
10 #define MODEL_SPIDERBOT_LEFT_END 93\r
11 #define MODEL_SPIDERBOT_LEFT_LENGTH 31\r
12 \r
13 #define MODEL_SPIDERBOT_RIGHT_START 94\r
14 #define MODEL_SPIDERBOT_RIGHT_END 124\r
15 #define MODEL_SPIDERBOT_RIGHT_LENGTH 31\r
16 \r
17 #define MODEL_SPIDERBOT_JUMP_START 125\r
18 #define MODEL_SPIDERBOT_JUMP_END 155\r
19 #define MODEL_SPIDERBOT_JUMP_LENGTH 31\r
20 \r
21 #define spiderbot_MIN '-75 -75 5'\r
22 #define spiderbot_MAX '75 75 105'\r
23 \r
24 /*\r
25 .void() anim_now;\r
26 .void() anim_next;\r
27 \r
28 void spider_anim_idle()\r
29 {\r
30     movelib_beak_simple(cvar("g_vehicle_spiderbot_speed_stop"));\r
31     if(self.anim_next != self.anim_now)\r
32         self.anim_now = self.anim_next;\r
33 }\r
34 \r
35 void spider_anim_forward()\r
36 {\r
37     movelib_move_simple(normalize(v_forward),cvar("g_vehicle_spiderbot_speed_walk"),cvar("g_vehicle_spiderbot_movement_inertia"));\r
38 \r
39     if((self.frame < MODEL_SPIDERBOT_FORWARD_START) || (self.frame > MODEL_SPIDERBOT_FORWARD_END))\r
40         self.frame = MODEL_SPIDERBOT_FORWARD_START;\r
41     else\r
42         self.frame += 0.8;\r
43 \r
44     if(self.frame > MODEL_SPIDERBOT_FORWARD_END)\r
45         self.anim_now = self.anim_next;\r
46 }\r
47 \r
48 void spider_anim_backward()\r
49 {\r
50     movelib_move_simple(normalize(v_forward * -1),cvar("g_vehicle_spiderbot_speed_walk"),cvar("g_vehicle_spiderbot_movement_inertia"));\r
51 \r
52     if(self.frame < MODEL_SPIDERBOT_BACKWARDS_START)\r
53         self.frame = MODEL_SPIDERBOT_BACKWARDS_START;\r
54     else\r
55         self.frame += 0.8;\r
56 \r
57     if(self.frame > MODEL_SPIDERBOT_BACKWARDS_END)\r
58         self.anim_now = self.anim_next;\r
59 }\r
60 \r
61 void spider_anim_strafel()\r
62 {\r
63     movelib_move_simple(normalize(v_right * -1),cvar("g_vehicle_spiderbot_speed_strafe"),cvar("g_vehicle_spiderbot_movement_inertia"));\r
64 \r
65     if(self.frame < MODEL_SPIDERBOT_LEFT_START)\r
66         self.frame = MODEL_SPIDERBOT_LEFT_START;\r
67     else\r
68         self.frame += 0.8;\r
69 \r
70     if(self.frame > MODEL_SPIDERBOT_LEFT_END)\r
71         self.anim_now = self.anim_next;\r
72 }\r
73 \r
74 void spider_anim_strafer()\r
75 {\r
76     movelib_move_simple(normalize(v_right),cvar("g_vehicle_spiderbot_speed_strafe"),cvar("g_vehicle_spiderbot_movement_inertia"));\r
77 \r
78     if(self.frame < MODEL_SPIDERBOT_RIGHT_START)\r
79         self.frame = MODEL_SPIDERBOT_RIGHT_START;\r
80     else\r
81         self.frame += 0.8;\r
82 \r
83     if(self.frame > MODEL_SPIDERBOT_RIGHT_END)\r
84         self.anim_now = self.anim_next;\r
85 }\r
86 \r
87 void spider_anim_jump()\r
88 {\r
89     //movelib_move_simple(normalize(v_forward),cvar("g_vehicle_spiderbot_speed_walk"),cvar("g_vehicle_spiderbot_movement_inertia"));\r
90 \r
91     if(self.frame < MODEL_SPIDERBOT_JUMP_START)\r
92         self.frame = MODEL_SPIDERBOT_JUMP_START;\r
93     else\r
94         self.frame += 1;\r
95 \r
96     if(self.frame <= 8)\r
97         movelib_beak_simple(cvar("g_vehicle_spiderbot_speed_stop"));\r
98 \r
99     if(self.frame == 9)\r
100         self.velocity = v_forward * 400 + v_up * 400;\r
101 \r
102     if(self.frame >= 19)\r
103         movelib_beak_simple(cvar("g_vehicle_spiderbot_speed_stop"));\r
104 \r
105     if(self.frame > MODEL_SPIDERBOT_JUMP_END)\r
106         self.anim_now = self.anim_next;\r
107 }\r
108 \r
109 void anim_do()\r
110 {\r
111     if not (self.anim_now)\r
112         self.anim_now = self.anim_next;\r
113 \r
114     self.anim_now();\r
115 }\r
116 \r
117 */\r
118 \r
119 void anim_do()\r
120 {\r
121     self.frame = self.frame + 0.8;\r
122     if ((self.frame < self.anim_start) || (self.frame > self.anim_end))\r
123         if(self.anim_start == 0)\r
124         {\r
125             self.frame = 0;\r
126             self.anim_end = 0;\r
127         }\r
128         else\r
129             self.frame = self.anim_start;\r
130 }\r
131 \r
132 void spiderbot_exit(float eject);\r
133 void spiderbot_enter();\r
134 \r
135 void spiderbot_rocket_explode()\r
136 {\r
137     vector org2;\r
138 \r
139     if(self.event_damage != SUB_Null)\r
140     {\r
141         self.event_damage = SUB_Null;\r
142         self.think = spiderbot_rocket_explode;\r
143         self.nextthink = time;\r
144         return;\r
145     }\r
146 \r
147     sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);\r
148     org2 = findbetterlocation (self.origin, 16);\r
149     pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);\r
150     w_deathtypestring = "dident escape the rocket barrage";\r
151 \r
152     if(!self.owner)\r
153         self.owner = self.realowner;\r
154 \r
155     RadiusDamage (self, self.owner,\r
156      cvar("g_vehicle_spiderbot_rocket_damage"),\r
157      cvar("g_vehicle_spiderbot_rocket_edgedamage"),\r
158      cvar("g_vehicle_spiderbot_rocket_radius"), world,\r
159      cvar("g_vehicle_spiderbot_rocket_force"), DEATH_TURRET, world);\r
160 \r
161     remove (self);\r
162 }\r
163 \r
164 void spiderbot_rocket_touch()\r
165 {\r
166     if(self.owner)\r
167     {\r
168         if(other == self.owner.vehicle)\r
169             return;\r
170 \r
171         if(other == self.owner.vehicle.tur_head)\r
172             return;\r
173     }\r
174 \r
175     PROJECTILE_TOUCH;\r
176     spiderbot_rocket_explode();\r
177 }\r
178 \r
179 void spiderbot_rocket_think()\r
180 {\r
181     vector newdir,olddir;\r
182 \r
183     self.nextthink  = time;\r
184     if not(self.owner)\r
185     {\r
186         UpdateCSQCProjectile(self);\r
187         return;\r
188     }\r
189 \r
190     self.solid      = SOLID_BBOX;\r
191     self.touch      = spiderbot_rocket_touch;\r
192     olddir = normalize(self.velocity);\r
193     newdir = normalize(self.owner.cursor_trace_endpos - self.origin);\r
194     newdir += randomvec() * cvar("g_vehicle_spiderbot_rocket_noise");\r
195     self.velocity = normalize(olddir + newdir * cvar("g_vehicle_spiderbot_rocket_turnrate")) * cvar("g_vehicle_spiderbot_rocket_speed");\r
196 \r
197     UpdateCSQCProjectile(self);\r
198 }\r
199 \r
200 void spiderbot_rocket_do()\r
201 {\r
202     entity missile;\r
203 \r
204     if(self.gun2.cnt > time)\r
205         return;\r
206 \r
207     if(self.tur_head.frame > 7)\r
208         self.tur_head.frame = 0;\r
209 \r
210     if not (self.owner.BUTTON_ATCK2)\r
211         return;\r
212 \r
213     self.tur_head.frame += 1;\r
214     if(self.tur_head.frame > 7)\r
215         self.attack_finished_single = cvar("g_vehicle_spiderbot_rocket_reload");\r
216     else\r
217         self.attack_finished_single = cvar("g_vehicle_spiderbot_rocket_refire");\r
218 \r
219     self.gun2.cnt = time + self.attack_finished_single;\r
220 \r
221     sound (self, CHAN_WEAPON, "weapons/rocket_fire.wav", VOL_BASE, ATTN_NORM);\r
222     missile                    = spawn ();\r
223     setsize (missile, '-3 -1 -1', '3 1 1'); // give it some size so it can be shot\r
224     setorigin(missile,gettaginfo(self.tur_head,gettagindex(self.tur_head,"tag_fire")));\r
225     te_explosion (missile.origin);\r
226 \r
227     missile.classname       = "spiderbot_rocket";\r
228     missile.owner           = self.owner;\r
229     missile.bot_dodge       = TRUE;\r
230     missile.bot_dodgerating = 75;\r
231     missile.nextthink       = time;// + 0.2;\r
232     missile.movetype        = MOVETYPE_FLYMISSILE;\r
233     missile.velocity        = normalize(v_forward + (v_up * 0.5) + randomvec() * 0.25) * cvar("g_vehicle_spiderbot_rocket_speed");\r
234     missile.angles          = vectoangles(missile.velocity);\r
235     missile.think           = spiderbot_rocket_think;\r
236     missile.flags           = FL_PROJECTILE;\r
237     missile.solid           = SOLID_NOT;\r
238 \r
239         CSQCProjectile(missile, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, has fly sound\r
240 }\r
241 \r
242 void spiderbot_minigun_fire_Flash_Go() {\r
243         if (self.frame > 10){\r
244                 self.alpha = -1;
245                 setmodel(self,"");\r
246                 return;\r
247         }\r
248 \r
249         self.frame = self.frame + 2;\r
250         self.alpha = self.alpha - 0.2;\r
251         self.nextthink = time + 0.02;\r
252 }\r
253 \r
254 void spiderbot_minigun_fire(entity gun,float trail)\r
255 {\r
256 \r
257     entity flash;\r
258     vector v;\r
259     v = gettaginfo(gun,gettagindex(gun,"barrels"));\r
260     v_forward = normalize(v_forward);\r
261 \r
262     sound (gun, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);\r
263 \r
264     fireBullet (v, v_forward, cvar("g_vehicle_spiderbot_minigun_spread"), cvar("g_vehicle_spiderbot_minigun_damage"),\r
265         cvar("g_vehicle_spiderbot_minigun_spread"), DEATH_TURRET, 0);\r
266 \r
267     if not (gun.enemy)\r
268     {\r
269         gun.enemy = spawn();\r
270         setattachment(gun.enemy , gun, "barrels");\r
271         setorigin(gun.enemy ,gun.enemy.origin + '48 0 0');\r
272     }\r
273 \r
274     flash = gun.enemy; //spawn();\r
275     setmodel(flash, "models/uziflash.md3"); // precision set below\r
276     flash.think = spiderbot_minigun_fire_Flash_Go;\r
277     flash.nextthink = time + 0.02;\r
278     flash.frame = 2;\r
279     flash.angles_z = flash.v_angle_z + random() * 180;\r
280     flash.alpha = 1;\r
281     flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;\r
282     if(trail)\r
283         trailparticles(self, particleeffectnum("EF_MGTURRETTRAIL"), v, trace_endpos);\r
284 }\r
285 \r
286 void spiderbot_miniguns_do()\r
287 {\r
288     if ((self.owner.BUTTON_ATCK) && (self.owner.vehicle_heat < 1) && (self.tur_head.attack_finished_single < time))\r
289     {\r
290 \r
291         self.gun1.angles_z += 36;\r
292         self.gun2.angles_z -= 36;\r
293         if(self.gun1.angles_z >= 360)\r
294         {\r
295             self.gun1.angles_z = 0;\r
296             self.gun2.angles_z = 360;\r
297         }\r
298 \r
299         self = self.owner;\r
300         if(self.uzi_bulletcounter == 1)\r
301         {\r
302             spiderbot_minigun_fire(self.vehicle.gun1,0);\r
303             spiderbot_minigun_fire(self.vehicle.gun2,1);\r
304             self.uzi_bulletcounter = 0;\r
305         }\r
306         else\r
307         {\r
308             spiderbot_minigun_fire(self.vehicle.gun1,1);\r
309             spiderbot_minigun_fire(self.vehicle.gun2,0);\r
310             self.uzi_bulletcounter += 1;\r
311         }\r
312 \r
313         self = self.vehicle;\r
314         self.owner.vehicle_heat += cvar("g_vehicle_spiderbot_minigun_heat");\r
315         if(self.owner.vehicle_heat >= 1)\r
316         {\r
317             self.vehicle_heat = 1;\r
318             self.owner.vehicle_heat = 1;\r
319             self.tur_head.attack_finished_single = (1/(cvar("g_vehicle_spiderbot_minigun_cooldown") * server_fps))+time;\r
320         }\r
321         else\r
322             self.tur_head.attack_finished_single = cvar("g_vehicle_spiderbot_minigun_refire") + time;\r
323 \r
324         return;\r
325     }\r
326     else\r
327         if(self.vehicle_heat != 0)\r
328         {\r
329             self.vehicle_heat = max(self.vehicle_heat - cvar("g_vehicle_spiderbot_minigun_cooldown"),0);\r
330             if(self.tur_head.attack_finished_single < time)\r
331             {\r
332                 self.vehicle_heat = 0;\r
333                 self.owner.vehicle_heat = 0;\r
334             }\r
335             else\r
336             {\r
337                 if(self.tur_head.uzi_bulletcounter < time)\r
338                 {\r
339                     self.tur_head.uzi_bulletcounter = time + 0.2;\r
340                     self.owner.vehicle_heat  = self.vehicle_heat;\r
341                 }\r
342                 else\r
343                     self.owner.vehicle_heat = 1;\r
344             }\r
345         }\r
346         else\r
347             self.owner.vehicle_heat = max(self.owner.vehicle_heat - cvar("g_vehicle_spiderbot_minigun_cooldown"),0);\r
348 \r
349 }\r
350 \r
351 float spiderbot_pplug()\r
352 {\r
353     vector ad;\r
354     entity player,spider;\r
355     float ftmp,ftmp2;\r
356 \r
357     player = self;\r
358     spider = self.vehicle;\r
359 \r
360 /*\r
361         self.BUTTON_ATCK = 0;\r
362         self.button1 = 0;\r
363         self.BUTTON_JUMP = 0;\r
364         self.BUTTON_ATCK2 = 0;\r
365 \r
366 \r
367         self.BUTTON_HOOK = 0;\r
368         self.BUTTON_INFO = 0;\r
369         self.button8 = 0;\r
370         self.BUTTON_CHAT = 0;\r
371         self.BUTTON_USE = 0;\r
372 */\r
373 \r
374     player.BUTTON_ZOOM = 0;\r
375     player.BUTTON_CROUCH = 0;\r
376 \r
377 \r
378     if(player.BUTTON_USE)\r
379     {\r
380         self = spider;\r
381         spiderbot_exit(0);\r
382         self = player;\r
383         return 0;\r
384     }\r
385 \r
386     player.exteriormodeltoclient = spider.tur_head;\r
387 \r
388     spider.tur_head.angles_x *= -1;\r
389     spider.angles_x *= -1;\r
390     //player.angles_x *= -1;\r
391     makevectors(spider.angles);\r
392 \r
393     //ad = player.v_angle - (spider.tur_head.angles + spider.angles);\r
394     ad = player.v_angle -  (spider.tur_head.angles + spider.angles);\r
395 \r
396     // Rotate head\r
397     ftmp = cvar("g_vehicle_spiderbot_head_turnspeed") / server_fps;\r
398     ftmp2 = ftmp * -1;\r
399     spider.tur_head.angles_y += bound(ftmp2,shortangle_f(ad_y,spider.tur_head.angles_y),ftmp);\r
400     spider.tur_head.angles_y = bound(cvar("g_vehicle_spiderbot_head_turnlimit") * -1,spider.tur_head.angles_y,cvar("g_vehicle_spiderbot_head_turnlimit"));\r
401 \r
402     // Pitch head\r
403     ftmp = cvar("g_vehicle_spiderbot_head_pitchspeed") / server_fps;\r
404     ftmp2 = ftmp * -1;\r
405     spider.tur_head.angles_x += bound(ftmp2,shortangle_f(ad_x,spider.tur_head.angles_x),ftmp);\r
406     spider.tur_head.angles_x = bound(cvar("g_vehicle_spiderbot_head_pitchlimit_down"),spider.tur_head.angles_x,cvar("g_vehicle_spiderbot_head_pitchlimit_up"));\r
407 \r
408     spider.tur_head.angles_x *= -1;\r
409     spider.angles_x *= -1;\r
410     //player.angles_x *= -1;\r
411 \r
412     // Turn Body\r
413     ftmp = cvar("g_vehicle_spiderbot_turnspeed") / server_fps;\r
414     ftmp2 = ftmp * -1;\r
415     ftmp = bound(ftmp2,spider.tur_head.angles_y,ftmp);\r
416 \r
417     self = spider;\r
418     if(spider.flags & FL_ONGROUND)\r
419     {\r
420         if(player.BUTTON_JUMP)\r
421         {\r
422             player.BUTTON_JUMP = 0;\r
423             spider.anim_start = MODEL_SPIDERBOT_JUMP_START;\r
424             spider.anim_end   = MODEL_SPIDERBOT_JUMP_END;\r
425             spider.velocity   = v_forward * 700 + v_up * 600;\r
426         }\r
427         else\r
428         {\r
429             if(vlen(player.movement) == 0)\r
430             {\r
431                 movelib_beak_simple(cvar("g_vehicle_spiderbot_speed_stop"));\r
432                 spider.anim_start = 0;\r
433                 spider.anim_end = 0;\r
434             }\r
435             else\r
436             {\r
437                 spider.angles_y = safeangle(spider.angles_y + ftmp);\r
438                 spider.tur_head.angles_y -= ftmp;\r
439 \r
440                 if(player.movement_x != 0)\r
441                 {\r
442                     if(player.movement_x > 0)\r
443                     {\r
444                         player.movement_x = 1;\r
445                         spider.anim_start = MODEL_SPIDERBOT_FORWARD_START;\r
446                         spider.anim_end   = MODEL_SPIDERBOT_FORWARD_END;\r
447                     }\r
448                     else if(player.movement_x < 0)\r
449                     {\r
450                         player.movement_x = -1;\r
451                         spider.anim_start = MODEL_SPIDERBOT_BACKWARDS_START;\r
452                         spider.anim_end   = MODEL_SPIDERBOT_BACKWARDS_END;\r
453 \r
454                     }\r
455                     player.movement_y = 0;\r
456                     movelib_move_simple(normalize(v_forward * player.movement_x),cvar("g_vehicle_spiderbot_speed_walk"),cvar("g_vehicle_spiderbot_movement_inertia"));\r
457                 }\r
458                 else if(player.movement_y != 0)\r
459                 {\r
460                     if(player.movement_y < 0)\r
461                     {\r
462                         player.movement_y = -1;\r
463                         spider.anim_start = MODEL_SPIDERBOT_LEFT_START;\r
464                         spider.anim_end   = MODEL_SPIDERBOT_LEFT_END;\r
465                     }\r
466                     else if(player.movement_y > 0)\r
467                     {\r
468                         player.movement_y = 1;\r
469                         spider.anim_start = MODEL_SPIDERBOT_RIGHT_START;\r
470                         spider.anim_end   = MODEL_SPIDERBOT_RIGHT_END;\r
471                     }\r
472                     movelib_move_simple(normalize(v_right * player.movement_y),cvar("g_vehicle_spiderbot_speed_strafe"),cvar("g_vehicle_spiderbot_movement_inertia"));\r
473                 }\r
474 \r
475             }\r
476         }\r
477         movelib_groundalign4point(300,100,0.25);\r
478     }\r
479 \r
480     anim_do();\r
481     spiderbot_miniguns_do();\r
482     spiderbot_rocket_do();\r
483     vehicle_stdproc_regen();\r
484 \r
485     player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;\r
486     player.rockets = spider.tur_head.frame;\r
487 \r
488     if(spider.gun2.cnt <= time)\r
489         player.rockets_reload = 1;\r
490     else\r
491         player.rockets_reload = 1 - ((spider.gun2.cnt - time) /spider.attack_finished_single);\r
492 \r
493     self = player;\r
494 \r
495     setorigin(player,spider.origin + '0 0 64');\r
496     player.velocity = spider.velocity;\r
497 \r
498     return 1;\r
499 }\r
500 \r
501 void spiderbot_think()\r
502 {\r
503     if(self.flags & FL_ONGROUND)\r
504     {\r
505         movelib_beak_simple(cvar("g_vehicle_spiderbot_speed_stop"));\r
506         //movelib_groundalign4point(300,100);\r
507     }\r
508 \r
509     self.nextthink = time;\r
510 }\r
511 \r
512 void spiderbot_enter()\r
513 {\r
514     self.owner = other;\r
515 \r
516     self.event_damage         = vehicle_stdproc_damage ;\r
517     self.colormap             = self.owner.colormap;\r
518     self.tur_head.colormap    = self.owner.colormap;\r
519     self.vehicle_hudmodel.viewmodelforclient = self.owner;\r
520     self.nextthink = 0;\r
521     self.owner.angles         = self.angles;\r
522     self.owner.takedamage     = DAMAGE_NO;\r
523     self.owner.solid          = SOLID_NOT;\r
524     self.owner.movetype       = MOVETYPE_NOCLIP;\r
525     self.owner.alpha          = -1;\r
526     self.owner.PlayerPhysplug = spiderbot_pplug;\r
527     self.owner.vehicle        = self;\r
528     self.owner.event_damage   = SUB_Null;\r
529     self.owner.hud            = HUD_SPIDEBOT;\r
530     self.owner.vehicle_health = (self.vehicle_health / cvar("g_vehicle_spiderbot_health"));\r
531     self.owner.vehicle_shield = (self.vehicle_shield / cvar("g_vehicle_spiderbot_shield"));\r
532     self.team                   = self.owner.team;\r
533 \r
534     //setorigin(self.owner,self.origin);\r
535     //setattachment(self.owner,self,"");\r
536     //setorigin(self.owner,'0 0 0');\r
537 \r
538     msg_entity = other;\r
539     WriteByte (MSG_ONE, SVC_SETVIEWPORT);\r
540     WriteEntity( MSG_ONE, self.vehicle_viewport);\r
541 \r
542     WriteByte (MSG_ONE, SVC_SETVIEWANGLES);  // 10 = SVC_SETVIEWANGLES\r
543     WriteAngle(MSG_ONE, self.tur_head.angles_x + self.angles_x);    // tilt\r
544     WriteAngle(MSG_ONE, self.tur_head.angles_y + self.angles_y);    // yaw\r
545     WriteAngle(MSG_ONE, 0);    // roll\r
546     //WriteAngle(MSG_ONE, self.tur_head.angles_z + self.angles_z);    // roll\r
547 \r
548     //self.owner.view_ofs = '0 0 0';\r
549     //self.tur_head.nodrawtoclient = self.owner;\r
550 }\r
551 \r
552 void spiderbot_exit(float eject)\r
553 {\r
554     entity e;\r
555 \r
556     e = findchain(classname,"spiderbot_rocket");\r
557     while(e)\r
558     {\r
559         if(e.owner == self.owner)\r
560         {\r
561             e.realowner = self.owner;\r
562             e.owner = world;\r
563             //e.solid = SOLID_BBOX;\r
564             //e.think = SUB_Null;\r
565             //e.nextthink = -1;\r
566         }\r
567         e = e.chain;\r
568     }\r
569 \r
570     self.velocity = '0 0 0';\r
571 \r
572     msg_entity = self.owner;\r
573     WriteByte (MSG_ONE, SVC_SETVIEWPORT);\r
574     WriteEntity( MSG_ONE, self.owner);\r
575 \r
576     WriteByte (MSG_ONE, SVC_SETVIEWANGLES);  // 10 = SVC_SETVIEWANGLES\r
577     WriteAngle(MSG_ONE, 0);    // tilt\r
578     WriteAngle(MSG_ONE, self.angles_y);    // yaw\r
579     WriteAngle(MSG_ONE, 0);    // roll\r
580 \r
581     //setattachment(self.owner,world,"");\r
582     self.think = spiderbot_think;\r
583     self.nextthink = time;\r
584     self.owner.takedamage     = DAMAGE_AIM;\r
585     self.owner.solid          = SOLID_SLIDEBOX;\r
586     self.owner.movetype       = MOVETYPE_WALK;\r
587 \r
588     setsize(self.owner,PL_MIN,PL_MAX);\r
589 \r
590     self.owner.alpha          = 1;\r
591     self.owner.PlayerPhysplug = SUB_Null;\r
592     self.owner.vehicle        = world;\r
593         self.owner.view_ofs       = PL_VIEW_OFS;\r
594         self.owner.hud            = HUD_NORMAL;\r
595         self.owner.event_damage   = PlayerDamage;\r
596 \r
597         self.colormap            = 1024;\r
598         self.tur_head.colormap   = 1024;\r
599     self.team                = -1;\r
600 \r
601         self.vehicle_hudmodel.viewmodelforclient = self;\r
602         self.tur_head.nodrawtoclient             = self;\r
603 \r
604     setattachment(self.owner,world,"");\r
605 \r
606         makevectors(self.angles);\r
607         if(eject)\r
608         {\r
609             setorigin(self.owner,self.origin + v_forward * 100 + '0 0 64');\r
610             self.owner.velocity = (v_up + v_forward * 0.25) * 750;\r
611         }\r
612         else\r
613         setorigin(self.owner,self.origin - v_forward * 200 + '0 0 64');\r
614 \r
615     self.owner = world;\r
616 }\r
617 \r
618 void spiderbot_touch()\r
619 {\r
620     if(self.owner)\r
621     {\r
622         if(vlen(self.velocity) == 0)\r
623             return;\r
624 \r
625         if(other.classname != "player")\r
626             return;\r
627 \r
628         //todo: add check for velocity here (so we dont cush players runing onto us from behind)\r
629 \r
630         Damage(other,self,self.owner,cvar("g_vehicle_spiderbot_crush_dmg"),DEATH_TURRET,'0 0 0', normalize(other.origin - self.origin) * cvar("g_vehicle_spiderbot_crush_force") );\r
631         return;\r
632     }\r
633 \r
634     if(other.classname != "player")\r
635         return;\r
636 \r
637     if(other.deadflag != DEAD_NO)\r
638         return;\r
639 \r
640     if(other.vehicle != world)\r
641         return;\r
642 \r
643     spiderbot_enter();\r
644 }\r
645 \r
646 float spiderbot_customizeentityforclient()\r
647 {\r
648     if(self.deadflag == DEAD_DEAD)\r
649         return FALSE;\r
650 \r
651     return TRUE;\r
652 }\r
653 \r
654 //void spiderbot_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force);\r
655 void spiderbot_spawn()\r
656 {\r
657     self.think = spiderbot_think;\r
658     self.nextthink = time;\r
659 \r
660     self.vehicle_health = CCVAR("_health");\r
661     self.vehicle_shield = CCVAR("_shield");\r
662     self.event_damage = vehicle_stdproc_damage;\r
663     self.iscreature = TRUE;\r
664     self.movetype   = MOVETYPE_WALK;\r
665     self.solid      = SOLID_SLIDEBOX;\r
666     self.takedamage = DAMAGE_AIM;\r
667     self.touch      = spiderbot_touch;\r
668     self.alpha      = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = 1;\r
669     self.tur_head.angles = '0 0 0';\r
670         self.colormap = 1024;\r
671         self.tur_head.colormap = 1024;\r
672         self.deadflag    = DEAD_NO;\r
673     self.bot_attack = TRUE;\r
674 \r
675     setsize(self,spiderbot_MIN,spiderbot_MAX);\r
676     setorigin(self,self.tur_aimpos);\r
677     pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);\r
678 }\r
679 \r
680 void spiderbot_blowup()\r
681 {\r
682     sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);\r
683     pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);\r
684 \r
685     RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_TURRET, world);\r
686 \r
687     self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = -1;\r
688     self.nextthink  = time + 10;\r
689     self.think      = spiderbot_spawn;\r
690 \r
691     setorigin(self,self.tur_aimpos);\r
692 }\r
693 \r
694 void spiderbot_die()\r
695 {\r
696 \r
697     self.health = 0;\r
698     self.event_damage = SUB_Null;\r
699     self.iscreature = FALSE;\r
700     self.solid      = SOLID_NOT;\r
701     self.takedamage = DAMAGE_NO;\r
702     self.touch      = SUB_Null;\r
703     self.nextthink  = time + random() * 2;\r
704     self.think      = spiderbot_blowup;\r
705     self.deadflag    = DEAD_DEAD;\r
706         self.vehicle_hudmodel.viewmodelforclient = self;\r
707         self.frame = 0;\r
708         self.tur_head.frame = 0;\r
709 \r
710 }\r
711 \r
712 void vewhicle_spiderbot_dinit()\r
713 {\r
714 \r
715     server_fps = (1 / sys_ticrate);\r
716 \r
717     addstat(STAT_HUD, AS_INT,  hud);\r
718         addstat(STAT_SPIDERBOT_ROCKETS, AS_INT,   rockets);\r
719         addstat(STAT_SPIDERBOT_RELOAD,  AS_FLOAT, rockets_reload);\r
720         addstat(STAT_SPIDERBOT_HEAT,    AS_FLOAT, vehicle_heat);\r
721         addstat(STAT_SPIDERBOT_HEALTH,  AS_FLOAT, vehicle_health);\r
722         addstat(STAT_SPIDERBOT_SHIELD,  AS_FLOAT, vehicle_shield);\r
723 \r
724     if (self.netname == "")      self.netname     = "spiderbot";\r
725 \r
726     self.tur_head = spawn();\r
727     self.gun1 = spawn();\r
728     self.gun2 = spawn();\r
729     self.vehicle_viewport = spawn();\r
730     self.gravity = 2;\r
731     self.vehicle_hudmodel = spawn();\r
732     self.vehicle_flags = VHF_HASSHIELD | VHF_SHIELDREGEN | VHF_HEALTHREGEN;\r
733     self.cvar_basename = "g_vehicle_spiderbot";\r
734 \r
735     setmodel (self.vehicle_hudmodel, "models/spiderbot/cp.md3");\r
736     setmodel (self.vehicle_viewport, "models/null.md3");\r
737     setmodel(self,"models/spiderbot/spiderbot.dpm");\r
738     setmodel(self.tur_head,"models/spiderbot/spiderbot_top.dpm");\r
739     setmodel(self.gun1,"models/spiderbot/spiderbot_barrels.dpm");\r
740     setmodel(self.gun2,"models/spiderbot/spiderbot_barrels.dpm");\r
741 \r
742     setattachment(self.tur_head,self,"tag_head");\r
743     setattachment(self.vehicle_hudmodel,self.tur_head,"");\r
744     setattachment(self.vehicle_viewport,self.vehicle_hudmodel,"");\r
745     setattachment(self.gun1,self.tur_head,"tag_hardpoint01");\r
746     setattachment(self.gun2,self.tur_head,"tag_hardpoint02");\r
747 \r
748     self.tur_head.owner = self;\r
749     self.customizeentityforclient          = spiderbot_customizeentityforclient;\r
750 \r
751     setorigin(self.vehicle_viewport,'35 0 -14');\r
752     self.tur_aimpos = self.origin;\r
753     spiderbot_spawn();\r
754 \r
755     self.vehicle_die = spiderbot_die;\r
756     self.vehicle_exit = spiderbot_exit;\r
757 }\r
758 \r
759 void spawnfunc_vehicle_spiderbot()\r
760 {\r
761     // g_turrets_common_precash();\r
762 \r
763     precache_model ( "models/spiderbot/cr.md3");\r
764     precache_model ( "models/vhshield.md3");\r
765     precache_model ( "models/spiderbot/cp.md3");\r
766     precache_model ( "models/spiderbot/spiderbot.dpm");\r
767     precache_model ( "models/spiderbot/spiderbot_top.dpm");\r
768     precache_model ( "models/spiderbot/spiderbot_barrels.dpm");\r
769 \r
770     precache_model ( "models/turrets/rocket.md3");\r
771     precache_sound ( "weapons/rocket_impact.wav" );\r
772 \r
773     self.team                = -1;\r
774     self.think = vewhicle_spiderbot_dinit;\r
775     self.nextthink = time + 0.5;\r
776 }\r