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