1 const vector SPIDERBOT_MIN = '-75 -75 10';
2 const vector SPIDERBOT_MAX = '75 75 125';
5 float autocvar_g_vehicle_spiderbot;
7 float autocvar_g_vehicle_spiderbot_respawntime;
9 float autocvar_g_vehicle_spiderbot_speed_stop;
10 float autocvar_g_vehicle_spiderbot_speed_strafe;
11 float autocvar_g_vehicle_spiderbot_speed_walk;
12 float autocvar_g_vehicle_spiderbot_turnspeed;
13 float autocvar_g_vehicle_spiderbot_turnspeed_strafe;
14 float autocvar_g_vehicle_spiderbot_movement_inertia;
16 float autocvar_g_vehicle_spiderbot_springlength;
17 float autocvar_g_vehicle_spiderbot_springup;
18 float autocvar_g_vehicle_spiderbot_springblend;
19 float autocvar_g_vehicle_spiderbot_tiltlimit;
21 float autocvar_g_vehicle_spiderbot_head_pitchlimit_down;
22 float autocvar_g_vehicle_spiderbot_head_pitchlimit_up;
23 float autocvar_g_vehicle_spiderbot_head_turnlimit;
24 float autocvar_g_vehicle_spiderbot_head_turnspeed;
26 //float autocvar_g_vehicle_spiderbot_energy;
27 //float autocvar_g_vehicle_spiderbot_energy_regen;
28 //float autocvar_g_vehicle_spiderbot_energy_regen_pause;
30 float autocvar_g_vehicle_spiderbot_health;
31 float autocvar_g_vehicle_spiderbot_health_regen;
32 float autocvar_g_vehicle_spiderbot_health_regen_pause;
34 float autocvar_g_vehicle_spiderbot_shield;
35 float autocvar_g_vehicle_spiderbot_shield_regen;
36 float autocvar_g_vehicle_spiderbot_shield_regen_pause;
38 float autocvar_g_vehicle_spiderbot_minigun_damage;
39 float autocvar_g_vehicle_spiderbot_minigun_refire;
40 float autocvar_g_vehicle_spiderbot_minigun_spread;
41 float autocvar_g_vehicle_spiderbot_minigun_ammo_cost;
42 float autocvar_g_vehicle_spiderbot_minigun_ammo_max;
43 float autocvar_g_vehicle_spiderbot_minigun_ammo_regen;
44 float autocvar_g_vehicle_spiderbot_minigun_ammo_regen_pause;
45 float autocvar_g_vehicle_spiderbot_minigun_force;
46 float autocvar_g_vehicle_spiderbot_minigun_solidpenetration;
48 float autocvar_g_vehicle_spiderbot_rocket_damage;
49 float autocvar_g_vehicle_spiderbot_rocket_force;
50 float autocvar_g_vehicle_spiderbot_rocket_radius;
51 float autocvar_g_vehicle_spiderbot_rocket_speed;
52 float autocvar_g_vehicle_spiderbot_rocket_spread;
53 float autocvar_g_vehicle_spiderbot_rocket_refire;
54 float autocvar_g_vehicle_spiderbot_rocket_refire2;
55 float autocvar_g_vehicle_spiderbot_rocket_reload;
56 float autocvar_g_vehicle_spiderbot_rocket_health;
57 float autocvar_g_vehicle_spiderbot_rocket_noise;
58 float autocvar_g_vehicle_spiderbot_rocket_turnrate;
59 float autocvar_g_vehicle_spiderbot_rocket_lifetime;
61 vector autocvar_g_vehicle_spiderbot_bouncepain;
64 void spiderbot_exit(float eject);
65 void spiderbot_enter();
66 void spiderbot_spawn(float);
70 #define SBRM_ARTILLERY 2
73 void spiderbot_rocket_artillery()
75 self.nextthink = time;
76 UpdateCSQCProjectile(self);
79 void spiderbot_rocket_unguided()
81 vector newdir, olddir;
83 self.nextthink = time;
85 olddir = normalize(self.velocity);
86 newdir = normalize(self.pos1 - self.origin) + randomvec() * autocvar_g_vehicle_spiderbot_rocket_noise;
87 self.velocity = normalize(olddir + newdir * autocvar_g_vehicle_spiderbot_rocket_turnrate) * autocvar_g_vehicle_spiderbot_rocket_speed;
89 UpdateCSQCProjectile(self);
91 if (self.owner.deadflag != DEAD_NO || self.cnt < time || vlen(self.pos1 - self.origin) < 16)
95 void spiderbot_rocket_guided()
97 vector newdir, olddir;
99 self.nextthink = time;
101 if (!self.realowner.vehicle)
102 self.think = spiderbot_rocket_unguided;
104 crosshair_trace(self.realowner);
105 olddir = normalize(self.velocity);
106 newdir = normalize(trace_endpos - self.origin) + randomvec() * autocvar_g_vehicle_spiderbot_rocket_noise;
107 self.velocity = normalize(olddir + newdir * autocvar_g_vehicle_spiderbot_rocket_turnrate) * autocvar_g_vehicle_spiderbot_rocket_speed;
109 UpdateCSQCProjectile(self);
111 if (self.owner.deadflag != DEAD_NO || self.cnt < time)
115 void spiderbot_guide_release()
118 rkt = findchainentity(realowner, self.owner);
122 crosshair_trace(self.owner);
125 if(rkt.think == spiderbot_rocket_guided)
127 rkt.pos1 = trace_endpos;
128 rkt.think = spiderbot_rocket_unguided;
134 float spiberbot_calcartillery_flighttime;
135 vector spiberbot_calcartillery(vector org, vector tgt, float ht)
137 float grav, sdist, zdist, vs, vz, jumpheight;
140 grav = autocvar_sv_gravity;
141 zdist = tgt_z - org_z;
142 sdist = vlen(tgt - org - zdist * '0 0 1');
143 sdir = normalize(tgt - org - zdist * '0 0 1');
145 // how high do we need to go?
146 jumpheight = fabs(ht);
148 jumpheight = jumpheight + zdist;
151 vz = sqrt(2 * grav * jumpheight); // NOTE: sqrt(positive)!
153 // we start with downwards velocity only if it's a downjump and the jump apex should be outside the jump!
159 solution = solve_quadratic(0.5 * grav, -vz, zdist); // equation "z(ti) = zdist"
160 // ALWAYS solvable because jumpheight >= zdist
162 solution_y = solution_x; // just in case it is not solvable due to roundoff errors, assume two equal solutions at their center (this is mainly for the usual case with ht == 0)
164 solution_x = solution_y; // solution_x is 0 in this case, so don't use it, but rather use solution_y (which will be sqrt(0.5 * jumpheight / grav), actually)
171 // almost straight line type
172 // jump apex is before the jump
173 // we must take the larger one
174 spiberbot_calcartillery_flighttime = solution_y;
179 // jump apex is during the jump
180 // we must take the larger one too
181 spiberbot_calcartillery_flighttime = solution_y;
189 // almost straight line type
190 // jump apex is after the jump
191 // we must take the smaller one
192 spiberbot_calcartillery_flighttime = solution_x;
197 // jump apex is during the jump
198 // we must take the larger one
199 spiberbot_calcartillery_flighttime = solution_y;
202 vs = sdist / spiberbot_calcartillery_flighttime;
204 // finally calculate the velocity
205 return sdir * vs + '0 0 1' * vz;
208 void spiderbot_rocket_do()
212 entity rocket = world;
214 if (self.wait != -10)
216 if (self.owner.BUTTON_ATCK2 && self.vehicle_weapon2mode == SBRM_GUIDE)
219 if (self.tur_head.frame == 9 || self.tur_head.frame == 1)
221 if(self.gun2.cnt < time && self.tur_head.frame == 9)
222 self.tur_head.frame = 1;
231 spiderbot_guide_release();
237 if(self.gun2.cnt > time)
240 if (self.tur_head.frame >= 9)
242 self.tur_head.frame = 1;
246 if (self.wait != -10)
247 if (!self.owner.BUTTON_ATCK2)
251 v = gettaginfo(self.tur_head,gettagindex(self.tur_head,"tag_fire"));
253 switch(self.vehicle_weapon2mode)
256 rocket = vehicles_projectile("spiderbot_rocket_launch", "weapons/rocket_fire.wav",
257 v, normalize(randomvec() * autocvar_g_vehicle_spiderbot_rocket_spread + v_forward) * autocvar_g_vehicle_spiderbot_rocket_speed,
258 autocvar_g_vehicle_spiderbot_rocket_damage, autocvar_g_vehicle_spiderbot_rocket_radius, autocvar_g_vehicle_spiderbot_rocket_force, 1,
259 DEATH_VH_SPID_ROCKET, PROJECTILE_SPIDERROCKET, autocvar_g_vehicle_spiderbot_rocket_health, FALSE, TRUE, self.owner);
260 crosshair_trace(self.owner);
261 float _dist = (random() * autocvar_g_vehicle_spiderbot_rocket_radius) + vlen(v - trace_endpos);
262 _dist -= (random() * autocvar_g_vehicle_spiderbot_rocket_radius) ;
263 rocket.nextthink = time + (_dist / autocvar_g_vehicle_spiderbot_rocket_speed);
264 rocket.think = vehicles_projectile_explode;
266 if(self.owner.BUTTON_ATCK2 && self.tur_head.frame == 1)
270 rocket = vehicles_projectile("spiderbot_rocket_launch", "weapons/rocket_fire.wav",
271 v, normalize(v_forward) * autocvar_g_vehicle_spiderbot_rocket_speed,
272 autocvar_g_vehicle_spiderbot_rocket_damage, autocvar_g_vehicle_spiderbot_rocket_radius, autocvar_g_vehicle_spiderbot_rocket_force, 1,
273 DEATH_VH_SPID_ROCKET, PROJECTILE_SPIDERROCKET, autocvar_g_vehicle_spiderbot_rocket_health, FALSE, FALSE, self.owner);
274 crosshair_trace(self.owner);
275 rocket.pos1 = trace_endpos;
276 rocket.nextthink = time;
277 rocket.think = spiderbot_rocket_guided;
282 rocket = vehicles_projectile("spiderbot_rocket_launch", "weapons/rocket_fire.wav",
283 v, normalize(v_forward) * autocvar_g_vehicle_spiderbot_rocket_speed,
284 autocvar_g_vehicle_spiderbot_rocket_damage, autocvar_g_vehicle_spiderbot_rocket_radius, autocvar_g_vehicle_spiderbot_rocket_force, 1,
285 DEATH_VH_SPID_ROCKET, PROJECTILE_SPIDERROCKET, autocvar_g_vehicle_spiderbot_rocket_health, FALSE, TRUE, self.owner);
287 crosshair_trace(self.owner);
289 rocket.pos1 = trace_endpos + randomvec() * (0.75 * autocvar_g_vehicle_spiderbot_rocket_radius);
290 rocket.pos1_z = trace_endpos_z;
292 traceline(v, v + '0 0 1' * MAX_SHOT_DISTANCE, MOVE_WORLDONLY, self);
293 float h1 = 0.75 * vlen(v - trace_endpos);
296 traceline(v , rocket.pos1 + '0 0 1' * MAX_SHOT_DISTANCE, MOVE_WORLDONLY, self);
297 float h2 = 0.75 * vlen(rocket.pos1 - v);
299 rocket.velocity = spiberbot_calcartillery(v, rocket.pos1, ((h1 < h2) ? h1 : h2));
300 rocket.movetype = MOVETYPE_TOSS;
302 //rocket.think = spiderbot_rocket_artillery;
305 rocket.classname = "spiderbot_rocket";
307 rocket.cnt = time + autocvar_g_vehicle_spiderbot_rocket_lifetime;
309 self.tur_head.frame += 1;
310 if (self.tur_head.frame == 9)
311 self.attack_finished_single = autocvar_g_vehicle_spiderbot_rocket_reload;
313 self.attack_finished_single = ((self.vehicle_weapon2mode == SBRM_VOLLY) ? autocvar_g_vehicle_spiderbot_rocket_refire2 : autocvar_g_vehicle_spiderbot_rocket_refire);
315 self.gun2.cnt = time + self.attack_finished_single;
318 float spiderbot_aiframe()
323 float spiderbot_frame()
326 entity player, spider;
329 if(intermission_running)
333 spider = self.vehicle;
336 vehicles_painframe();
338 player.BUTTON_ZOOM = 0;
339 player.BUTTON_CROUCH = 0;
340 player.switchweapon = 0;
343 #if 1 // 0 to enable per-gun impact aux crosshairs
344 // Avarage gun impact point's -> aux cross
345 ad = gettaginfo(spider.tur_head, gettagindex(spider.tur_head, "tag_hardpoint01"));
347 ad += gettaginfo(spider.tur_head, gettagindex(spider.tur_head, "tag_hardpoint02"));
350 v_forward = vf * 0.5;
351 traceline(ad, ad + v_forward * MAX_SHOT_DISTANCE, MOVE_NORMAL, spider);
352 UpdateAuxiliaryXhair(player, trace_endpos, ('1 0 0' * player.vehicle_reload1) + ('0 1 0' * (1 - player.vehicle_reload1)), 0);
354 ad = gettaginfo(spider.gun1, gettagindex(spider.gun1, "barrels"));
355 traceline(ad, ad + v_forward * MAX_SHOT_DISTANCE, MOVE_NORMAL, spider);
356 UpdateAuxiliaryXhair(player, trace_endpos, ('1 0 0' * player.vehicle_reload1) + ('0 1 0' * (1 - player.vehicle_reload1)), 0);
358 ad = gettaginfo(spider.gun2, gettagindex(spider.gun2, "barrels"));
359 traceline(ad, ad + v_forward * MAX_SHOT_DISTANCE, MOVE_NORMAL, spider);
360 UpdateAuxiliaryXhair(player, trace_endpos, ('1 0 0' * player.vehicle_reload1) + ('0 1 0' * (1 - player.vehicle_reload1)), 1);
361 ad = 0.5 * (ad + vf);
364 crosshair_trace(player);
365 ad = vectoangles(normalize(trace_endpos - ad));
366 ad = AnglesTransform_ToAngles(AnglesTransform_LeftDivide(AnglesTransform_FromAngles(spider.angles), AnglesTransform_FromAngles(ad))) - spider.tur_head.angles;
367 ad = AnglesTransform_Normalize(ad, TRUE);
368 //UpdateAuxiliaryXhair(player, trace_endpos, ('1 0 0' * player.vehicle_reload2) + ('0 1 0' * (1 - player.vehicle_reload2)), 2);
371 ftmp = autocvar_g_vehicle_spiderbot_head_turnspeed * sys_frametime;
372 ad_y = bound(-ftmp, ad_y, ftmp);
373 spider.tur_head.angles_y = bound(autocvar_g_vehicle_spiderbot_head_turnlimit * -1, spider.tur_head.angles_y + ad_y, autocvar_g_vehicle_spiderbot_head_turnlimit);
376 ad_x = bound(ftmp * -1, ad_x, ftmp);
377 spider.tur_head.angles_x = bound(autocvar_g_vehicle_spiderbot_head_pitchlimit_down, spider.tur_head.angles_x + ad_x, autocvar_g_vehicle_spiderbot_head_pitchlimit_up);
380 //fixedmakevectors(spider.angles);
381 makevectors(spider.angles + '-2 0 0' * spider.angles_x);
383 movelib_groundalign4point(autocvar_g_vehicle_spiderbot_springlength, autocvar_g_vehicle_spiderbot_springup, autocvar_g_vehicle_spiderbot_springblend, autocvar_g_vehicle_spiderbot_tiltlimit);
385 if(spider.flags & FL_ONGROUND)
387 if(spider.frame == 4 && self.tur_head.wait != 0)
389 sound (self, CH_TRIGGER_SINGLE, "vehicles/spiderbot_land.wav", VOL_VEHICLEENGINE, ATTEN_NORM);
393 if(player.BUTTON_JUMP && self.tur_head.wait < time)
395 sound (self, CH_TRIGGER_SINGLE, "vehicles/spiderbot_jump.wav", VOL_VEHICLEENGINE, ATTEN_NORM);
396 //dprint("spiderbot_jump:", ftos(soundlength("vehicles/spiderbot_jump.wav")), "\n");
399 self.tur_head.wait = time + 2;
400 player.BUTTON_JUMP = 0;
401 spider.velocity = v_forward * 700 + v_up * 600;
406 if(vlen(player.movement) == 0)
408 if(self.sound_nexttime < time || self.delay != 3)
411 self.sound_nexttime = time + 6.486500; //soundlength("vehicles/spiderbot_idle.wav");
412 //dprint("spiderbot_idle:", ftos(soundlength("vehicles/spiderbot_idle.wav")), "\n");
413 sound (self, CH_TRIGGER_SINGLE, "vehicles/spiderbot_idle.wav", VOL_VEHICLEENGINE, ATTEN_NORM);
415 movelib_beak_simple(autocvar_g_vehicle_spiderbot_speed_stop);
421 if(player.movement_x == 0 && player.movement_y != 0)
422 ftmp = autocvar_g_vehicle_spiderbot_turnspeed_strafe * sys_frametime;
424 ftmp = autocvar_g_vehicle_spiderbot_turnspeed * sys_frametime;
426 ftmp = bound(-ftmp, spider.tur_head.angles_y, ftmp);
427 spider.angles_y = anglemods(spider.angles_y + ftmp);
428 spider.tur_head.angles_y -= ftmp;
430 if(player.movement_x != 0)
432 if(player.movement_x > 0)
434 player.movement_x = 1;
437 else if(player.movement_x < 0)
439 player.movement_x = -1;
442 player.movement_y = 0;
443 movelib_move_simple(normalize(v_forward * player.movement_x),autocvar_g_vehicle_spiderbot_speed_walk,autocvar_g_vehicle_spiderbot_movement_inertia);
445 if(self.sound_nexttime < time || self.delay != 1)
448 self.sound_nexttime = time + 6.486500; //soundlength("vehicles/spiderbot_walk.wav");
449 sound (self, CH_TRIGGER_SINGLE, "vehicles/spiderbot_walk.wav", VOL_VEHICLEENGINE, ATTEN_NORM);
450 //dprint("spiderbot_walk:", ftos(soundlength("vehicles/spiderbot_walk.wav")), "\n");
453 else if(player.movement_y != 0)
455 if(player.movement_y < 0)
457 player.movement_y = -1;
460 else if(player.movement_y > 0)
462 player.movement_y = 1;
465 movelib_move_simple(normalize(v_right * player.movement_y),autocvar_g_vehicle_spiderbot_speed_strafe,autocvar_g_vehicle_spiderbot_movement_inertia);
466 if(self.sound_nexttime < time || self.delay != 2)
469 self.sound_nexttime = time + 6.486500; //soundlength("vehicles/spiderbot_strafe.wav");
470 sound (self, CH_TRIGGER_SINGLE, "vehicles/spiderbot_strafe.wav", VOL_VEHICLEENGINE, ATTEN_NORM);
471 //dprint("spiderbot_strafe:", ftos(soundlength("vehicles/spiderbot_strafe.wav")), "\n");
478 self.angles_x = bound(-autocvar_g_vehicle_spiderbot_tiltlimit, self.angles_x, autocvar_g_vehicle_spiderbot_tiltlimit);
479 self.angles_z = bound(-autocvar_g_vehicle_spiderbot_tiltlimit, self.angles_z, autocvar_g_vehicle_spiderbot_tiltlimit);
481 if(player.BUTTON_ATCK)
484 if(spider.vehicle_ammo1 >= autocvar_g_vehicle_spiderbot_minigun_ammo_cost && spider.tur_head.attack_finished_single <= time)
488 spider.misc_bulletcounter += 1;
492 mod(spider.misc_bulletcounter, 2) ? gun = spider.gun1 : gun = spider.gun2;
493 v = gettaginfo(gun, gettagindex(gun, "barrels"));
494 v_forward = normalize(v_forward);
497 fireBullet(v, v_forward, autocvar_g_vehicle_spiderbot_minigun_spread, autocvar_g_vehicle_spiderbot_minigun_solidpenetration,
498 autocvar_g_vehicle_spiderbot_minigun_damage, autocvar_g_vehicle_spiderbot_minigun_force, DEATH_VH_SPID_MINIGUN, 0);
500 // fireBullet (v, v_forward, autocvar_g_vehicle_spiderbot_minigun_spread, autocvar_g_vehicle_spiderbot_minigun_damage,
501 // autocvar_g_vehicle_spiderbot_minigun_spread, DEATH_VH_SPID_MINIGUN, 0);
503 sound (gun, CH_WEAPON_A, "weapons/uzi_fire.wav", VOL_BASE, ATTEN_NORM);
504 //trailparticles(self, particleeffectnum("spiderbot_minigun_trail"), v, trace_endpos);
505 pointparticles(particleeffectnum("spiderbot_minigun_muzzleflash"), v, v_forward * 2500, 1);
509 spider.vehicle_ammo1 -= autocvar_g_vehicle_spiderbot_minigun_ammo_cost;
510 spider.tur_head.attack_finished_single = time + autocvar_g_vehicle_spiderbot_minigun_refire;
511 player.vehicle_ammo1 = (spider.vehicle_ammo1 / autocvar_g_vehicle_spiderbot_minigun_ammo_max) * 100;
512 spider.gun1.angles_z += 45;
513 spider.gun2.angles_z -= 45;
514 if(spider.gun1.angles_z >= 360)
516 spider.gun1.angles_z = 0;
517 spider.gun2.angles_z = 0;
522 vehicles_regen(spider.cnt, vehicle_ammo1, autocvar_g_vehicle_spiderbot_minigun_ammo_max,
523 autocvar_g_vehicle_spiderbot_minigun_ammo_regen_pause,
524 autocvar_g_vehicle_spiderbot_minigun_ammo_regen, frametime, FALSE);
527 spiderbot_rocket_do();
529 if(self.vehicle_flags & VHF_SHIELDREGEN)
530 vehicles_regen(spider.dmg_time, vehicle_shield, autocvar_g_vehicle_spiderbot_shield, autocvar_g_vehicle_spiderbot_shield_regen_pause, autocvar_g_vehicle_spiderbot_shield_regen, frametime, TRUE);
532 if(self.vehicle_flags & VHF_HEALTHREGEN)
533 vehicles_regen(spider.dmg_time, vehicle_health, autocvar_g_vehicle_spiderbot_health, autocvar_g_vehicle_spiderbot_health_regen_pause, autocvar_g_vehicle_spiderbot_health_regen, frametime, FALSE);
535 player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
536 player.vehicle_ammo2 = spider.tur_head.frame;
538 if(spider.gun2.cnt <= time)
539 player.vehicle_reload2 = 100;
541 player.vehicle_reload2 = 100 - ((spider.gun2.cnt - time) / spider.attack_finished_single) * 100;
543 setorigin(player, spider.origin + '0 0 1' * SPIDERBOT_MAX_z);
544 player.velocity = spider.velocity;
546 VEHICLE_UPDATE_PLAYER(player, health, spiderbot);
548 if(self.vehicle_flags & VHF_HASSHIELD)
549 VEHICLE_UPDATE_PLAYER(player, shield, spiderbot);
554 void spiderbot_think()
556 if(self.flags & FL_ONGROUND)
557 movelib_beak_simple(autocvar_g_vehicle_spiderbot_speed_stop);
559 self.nextthink = time;
562 void spiderbot_enter()
564 self.vehicle_weapon2mode = SBRM_GUIDE;
565 self.movetype = MOVETYPE_WALK;
566 CSQCVehicleSetup(self.owner, 0);
567 self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_spiderbot_health) * 100;
568 self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_spiderbot_shield) * 100;
570 if(self.owner.flagcarried)
572 setattachment(self.owner.flagcarried, self.tur_head, "");
573 setorigin(self.owner.flagcarried, '-20 0 120');
577 void spiderbot_exit(float eject)
582 e = findchain(classname,"spiderbot_rocket");
585 if(e.owner == self.owner)
587 e.realowner = self.owner;
593 //self.velocity = '0 0 0';
594 self.think = spiderbot_think;
595 self.nextthink = time;
597 self.movetype = MOVETYPE_WALK;
602 makevectors(self.angles);
605 spot = self.origin + v_forward * 100 + '0 0 64';
606 spot = vehicles_findgoodexit(spot);
607 setorigin(self.owner , spot);
608 self.owner.velocity = (v_up + v_forward * 0.25) * 750;
609 self.owner.oldvelocity = self.owner.velocity;
613 if(vlen(self.velocity) > autocvar_g_vehicle_spiderbot_speed_strafe)
615 self.owner.velocity = normalize(self.velocity) * vlen(self.velocity);
616 self.owner.velocity_z += 200;
617 spot = self.origin + v_forward * 128 + '0 0 64';
618 spot = vehicles_findgoodexit(spot);
622 self.owner.velocity = self.velocity * 0.5;
623 self.owner.velocity_z += 10;
624 spot = self.origin + v_forward * 256 + '0 0 64';
625 spot = vehicles_findgoodexit(spot);
627 self.owner.oldvelocity = self.owner.velocity;
628 setorigin(self.owner , spot);
631 antilag_clear(self.owner);
637 if(autocvar_g_vehicle_spiderbot_bouncepain_x)
638 vehilces_impact(autocvar_g_vehicle_spiderbot_bouncepain_x, autocvar_g_vehicle_spiderbot_bouncepain_y, autocvar_g_vehicle_spiderbot_bouncepain_z);
641 void spiderbot_headfade()
643 self.think = spiderbot_headfade;
644 self.nextthink = self.fade_time;
645 self.alpha = 1 - (time - self.fade_time) * self.fade_rate;
647 if(self.cnt < time || self.alpha < 0.1)
651 sound (self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTEN_NORM);
652 pointparticles(particleeffectnum("explosion_big"), self.origin + '0 0 100', '0 0 0', 1);
658 void spiderbot_blowup()
664 sound (self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTEN_NORM);
665 pointparticles(particleeffectnum("explosion_small"), randomvec() * 80 + (self.origin + '0 0 100'), '0 0 0', 1);
667 self.nextthink = time + 0.1;
677 setmodel(b, "models/vehicles/spiderbot.dpm");
678 setmodel(h, "models/vehicles/spiderbot_top.dpm");
679 setmodel(g1, "models/vehicles/spiderbot_barrels.dpm");
680 setmodel(g2, "models/vehicles/spiderbot_barrels.dpm");
682 setorigin(b, self.origin);
684 b.angles = self.angles;
685 setsize(b, self.mins, self.maxs);
687 setorigin(h, gettaginfo(self, gettagindex(self, "tag_head")));
688 h.movetype = MOVETYPE_BOUNCE;
689 h.solid = SOLID_BBOX;
690 h.velocity = v_up * (500 + random() * 500) + randomvec() * 128;
691 h.modelflags = MF_ROCKET;
692 h.effects = EF_FLAME | EF_LOWPRECISION;
693 h.avelocity = randomvec() * 360;
696 h.cnt = time + (3.5 * random());
697 h.fade_rate = 1 / min(autocvar_g_vehicle_spiderbot_respawntime, 10);
699 h.think = spiderbot_headfade;
702 setorigin(g1, gettaginfo(self.tur_head, gettagindex(self.tur_head, "tag_hardpoint01")));
703 g1.movetype = MOVETYPE_TOSS;
704 g1.solid = SOLID_CORPSE;
705 g1.velocity = v_forward * 700 + (randomvec() * 32);
706 g1.avelocity = randomvec() * 180;
708 setorigin(g2, gettaginfo(self.tur_head, gettagindex(self.tur_head, "tag_hardpoint02")));
709 g2.movetype = MOVETYPE_TOSS;
710 g2.solid = SOLID_CORPSE;
711 g2.velocity = v_forward * 700 + (randomvec() * 32);
712 g2.avelocity = randomvec() * 180;
714 h.colormod = b.colormod = g1.colormod = g2.colormod = '-2 -2 -2';
716 SUB_SetFade(b, time + 5, min(autocvar_g_vehicle_spiderbot_respawntime, 1));
717 //SUB_SetFade(h, time, min(autocvar_g_vehicle_spiderbot_respawntime, 10));
718 SUB_SetFade(g1, time, min(autocvar_g_vehicle_spiderbot_respawntime, 10));
719 SUB_SetFade(g2, time, min(autocvar_g_vehicle_spiderbot_respawntime, 10));
721 RadiusDamage (self, self.enemy, 250, 15, 250, world, world, 250, DEATH_VH_SPID_DEATH, world);
723 self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = -1;
724 self.movetype = MOVETYPE_NONE;
725 self.deadflag = DEAD_DEAD;
726 self.solid = SOLID_NOT;
727 self.tur_head.effects &= ~EF_FLAME;
728 self.vehicle_hudmodel.viewmodelforclient = self;
734 self.event_damage = func_null;
735 self.takedamage = DAMAGE_NO;
736 self.touch = func_null;
737 self.cnt = 3.4 + time + random() * 2;
738 self.think = spiderbot_blowup;
739 self.nextthink = time;
740 self.deadflag = DEAD_DYING;
742 self.tur_head.effects |= EF_FLAME;
743 self.colormod = self.tur_head.colormod = '-1 -1 -1';
745 self.movetype = MOVETYPE_TOSS;
748 float spiderbot_impulse(float _imp)
755 self.vehicle.vehicle_weapon2mode += 1;
756 if(self.vehicle.vehicle_weapon2mode > SBRM_LAST)
757 self.vehicle.vehicle_weapon2mode = SBRM_FIRST;
759 //centerprint(self, strcat("Rocket mode is ", ftos(self.vehicle.vehicle_weapon2mode)));
760 CSQCVehicleSetup(self, 0);
765 self.vehicle.vehicle_weapon2mode -= 1;
766 if(self.vehicle.vehicle_weapon2mode < SBRM_FIRST)
767 self.vehicle.vehicle_weapon2mode = SBRM_LAST;
769 //centerprint(self, strcat("Rocket mode is ", ftos(self.vehicle.vehicle_weapon2mode)));
770 CSQCVehicleSetup(self, 0);
774 case 17: // toss gun, could be used to exit?
776 case 20: // Manual minigun reload?
783 void spiderbot_spawn(float _f)
787 self.vehicles_impusle = spiderbot_impulse;
790 setmodel(self.gun1, "models/vehicles/spiderbot_barrels.dpm");
791 setmodel(self.gun2, "models/vehicles/spiderbot_barrels.dpm");
792 setattachment(self.gun1, self.tur_head, "tag_hardpoint01");
793 setattachment(self.gun2, self.tur_head, "tag_hardpoint02");
799 self.tur_head.frame = 1;
800 self.think = spiderbot_think;
801 self.nextthink = time;
802 self.vehicle_health = autocvar_g_vehicle_spiderbot_health;
803 self.vehicle_shield = autocvar_g_vehicle_spiderbot_shield;
804 self.movetype = MOVETYPE_WALK;
805 self.solid = SOLID_SLIDEBOX;
806 self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = 1;
807 self.tur_head.angles = '0 0 0';
809 setorigin(self, self.pos1 + '0 0 128');
810 self.angles = self.pos2;
811 self.vehicle_impact = spider_impact;
812 self.damageforcescale = 0.03;
815 void spawnfunc_vehicle_spiderbot()
817 if(!autocvar_g_vehicle_spiderbot)
823 self.vehicle_flags |= VHF_DMGSHAKE;
824 //self.vehicle_flags |= VHF_DMGROLL;
825 //self.vehicle_flags |= VHF_DMGHEADROLL;
827 precache_model ( "models/vhshield.md3");
828 precache_model ( "models/vehicles/spiderbot.dpm");
829 precache_model ( "models/vehicles/spiderbot_top.dpm");
830 precache_model ( "models/vehicles/spiderbot_barrels.dpm");
831 precache_model ( "models/vehicles/spiderbot_cockpit.dpm");
832 precache_model ( "models/uziflash.md3");
834 precache_sound ( "weapons/uzi_fire.wav" );
835 precache_sound ( "weapons/rocket_impact.wav");
837 precache_sound ( "vehicles/spiderbot_die.wav");
838 precache_sound ( "vehicles/spiderbot_idle.wav");
839 precache_sound ( "vehicles/spiderbot_jump.wav");
840 precache_sound ( "vehicles/spiderbot_strafe.wav");
841 precache_sound ( "vehicles/spiderbot_walk.wav");
842 precache_sound ( "vehicles/spiderbot_land.wav");
844 if(autocvar_g_vehicle_spiderbot_shield)
845 self.vehicle_flags |= VHF_HASSHIELD;
847 if(autocvar_g_vehicle_spiderbot_shield_regen)
848 self.vehicle_flags |= VHF_SHIELDREGEN;
850 if(autocvar_g_vehicle_spiderbot_health_regen)
851 self.vehicle_flags |= VHF_HEALTHREGEN;
853 if(!vehicle_initialize(
855 "models/vehicles/spiderbot.dpm",
856 "models/vehicles/spiderbot_top.dpm",
857 "models/vehicles/spiderbot_cockpit.dpm",
858 "tag_head", "tag_hud", "",
860 SPIDERBOT_MIN, SPIDERBOT_MAX,
862 spiderbot_spawn, autocvar_g_vehicle_spiderbot_respawntime,
864 spiderbot_enter, spiderbot_exit,
865 spiderbot_die, spiderbot_think,
867 autocvar_g_vehicle_spiderbot_health,
868 autocvar_g_vehicle_spiderbot_shield))