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