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