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