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