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