1 const vector spiderbot_MIN = '-75 -75 0';
2 const vector spiderbot_MAX = '75 75 100';
4 #define spiderbot_spawnpnt wkr_spawn
6 void spiderbot_exit(float eject);
7 void spiderbot_enter();
9 void spiderbot_rocket_explode()
13 if(self.event_damage != SUB_Null)
15 self.event_damage = SUB_Null;
16 self.think = spiderbot_rocket_explode;
17 self.nextthink = time;
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";
27 self.owner = self.realowner;
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);
38 void spiderbot_rocket_touch()
42 if(other == self.owner.vehicle)
45 if(other == self.owner.vehicle.tur_head)
50 spiderbot_rocket_explode();
53 void spiderbot_rocket_guided()
57 self.nextthink = time;
58 if (self.owner.deadflag != DEAD_NO || self.cnt < time)
60 spiderbot_rocket_explode();
64 if not (self.owner.vehicle)
66 UpdateCSQCProjectile(self);
70 olddir = normalize(self.velocity);
71 crosshair_trace(self.owner);
72 newdir = normalize(trace_endpos - self.origin) + randomvec() * cvar("g_vehicle_spiderbot_rocket_noise");
73 self.velocity = normalize(olddir + newdir * cvar("g_vehicle_spiderbot_rocket_turnrate")) * cvar("g_vehicle_spiderbot_rocket_speed");
75 UpdateCSQCProjectile(self);
78 void spiderbot_rocket_unguided()
82 self.nextthink = time;
83 if (self.owner.deadflag != DEAD_NO || self.cnt < time)
85 spiderbot_rocket_explode();
89 if not (self.owner.vehicle)
91 UpdateCSQCProjectile(self);
95 olddir = normalize(self.velocity);
96 newdir = normalize(self.pos1 - self.origin) + randomvec() * cvar("g_vehicle_spiderbot_rocket_noise");
97 self.velocity = normalize(olddir + newdir * cvar("g_vehicle_spiderbot_rocket_turnrate")) * cvar("g_vehicle_spiderbot_rocket_speed");
99 UpdateCSQCProjectile(self);
103 void spiderbot_rocket_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
105 self.health -= damage;
106 self.velocity += force;
108 spiderbot_rocket_explode();
111 void spiderbot_guide_release()
114 rkt = findchainentity(owner,self.owner);
118 crosshair_trace(self.owner);
122 if(rkt.think == spiderbot_rocket_guided)
124 rkt.pos1 = trace_endpos;
125 rkt.think = spiderbot_rocket_unguided;
132 void spiderbot_rocket_do()
136 if (self.owner.BUTTON_ATCK2)
139 if (self.tur_head.frame == 9 || self.tur_head.frame == 1)
141 if(self.gun2.cnt < time && self.tur_head.frame == 9)
142 self.tur_head.frame = 1;
152 spiderbot_guide_release();
157 if(self.gun2.cnt > time)
160 if (self.tur_head.frame >= 9)
161 self.tur_head.frame = 1;
163 if not (self.owner.BUTTON_ATCK2)
166 sound (self, CHAN_WEAPON, "weapons/rocket_fire.wav", VOL_BASE, ATTN_NORM);
168 setsize (rocket, '-1 -1 -1', '1 1 1'); // give it some size so it can be shot
169 setorigin(rocket,gettaginfo(self.tur_head,gettagindex(self.tur_head,"tag_fire")));
170 te_explosion (rocket.origin);
172 crosshair_trace(self.owner);
174 rocket.classname = "spiderbot_rocket";
175 rocket.bot_dodge = TRUE;
176 rocket.bot_dodgerating = cvar("g_vehicle_spiderbot_rocket_damage");
177 rocket.cnt = time + cvar("g_vehicle_spiderbot_rocket_lifetime");
178 rocket.health = cvar("g_vehicle_spiderbot_rocket_health");
179 rocket.takedamage = DAMAGE_AIM;
180 rocket.event_damage = spiderbot_rocket_damage;
181 rocket.owner = self.owner;
182 rocket.nextthink = time;
183 rocket.movetype = MOVETYPE_FLYMISSILE;
184 rocket.velocity = normalize(v_forward + (v_up * 0.5) + randomvec() * 0.25) * cvar("g_vehicle_spiderbot_rocket_speed");
185 rocket.angles = vectoangles(rocket.velocity);
186 rocket.think = spiderbot_rocket_guided;
187 rocket.touch = spiderbot_rocket_touch;
188 rocket.flags = FL_PROJECTILE;
189 rocket.solid = SOLID_TRIGGER;
190 rocket.pos1 = trace_endpos;
192 CSQCProjectile(rocket, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, has fly sound
194 self.tur_head.frame += 1;
195 if (self.tur_head.frame == 9)
196 self.attack_finished_single = cvar("g_vehicle_spiderbot_rocket_reload");
198 self.attack_finished_single = cvar("g_vehicle_spiderbot_rocket_refire");
200 self.gun2.cnt = time + self.attack_finished_single;
203 void spiderbot_minigun_fire_Flash_Go() {
211 self.frame = self.frame + 2;
212 self.alpha = self.alpha - 0.2;
214 self.nextthink = time + 0.02;
217 void spiderbot_minigun_fire(entity gun,float trail)
222 v = gettaginfo(gun,gettagindex(gun,"barrels"));
223 v_forward = normalize(v_forward);
225 sound (gun, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
227 fireBullet (v, v_forward, cvar("g_vehicle_spiderbot_minigun_spread"), cvar("g_vehicle_spiderbot_minigun_damage"),
228 cvar("g_vehicle_spiderbot_minigun_spread"), DEATH_SBMINIGUN, 0);
233 setattachment(gun.enemy , gun, "barrels");
234 setorigin(gun.enemy ,gun.enemy.origin + '52 0 0');
238 setmodel(flash, "models/uziflash.md3");
239 flash.think = spiderbot_minigun_fire_Flash_Go;
240 flash.nextthink = time + 0.02;
242 flash.angles_z = flash.v_angle_z + random() * 180;
244 flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
248 trailparticles(self, particleeffectnum("EF_MGTURRETTRAIL"), v, trace_endpos);
251 void spiderbot_miniguns_do()
255 if((self.vehicle_reload1 == 1) || (!self.owner.BUTTON_ATCK))
258 ftmp = 1 / cvar("g_vehicle_spiderbot_minigun_cooldown") * sys_frametime;
259 self.owner.vehicle_reload1 = max(self.owner.vehicle_reload1 - ftmp, 0);
260 if(self.owner.vehicle_reload1 <= 0)
261 self.vehicle_reload1 = 0;
266 if (self.owner.BUTTON_ATCK)
270 self.gun1.angles_z += (1440 * sys_frametime);
271 self.gun2.angles_z -= (1440 * sys_frametime);
272 if(self.gun1.angles_z >= 360)
274 self.gun1.angles_z = 0;
275 self.gun2.angles_z = 360;
278 if (self.tur_head.attack_finished_single < time)
280 // Fire bullets, alternating trails left<->right
282 if(self.uzi_bulletcounter == 1)
284 spiderbot_minigun_fire(self.vehicle.gun1, 0);
285 spiderbot_minigun_fire(self.vehicle.gun2, 1);
286 self.uzi_bulletcounter = 0;
290 spiderbot_minigun_fire(self.vehicle.gun1, 1);
291 spiderbot_minigun_fire(self.vehicle.gun2, 0);
292 self.uzi_bulletcounter += 1;
297 ftmp = cvar("g_vehicle_spiderbot_minigun_refire") / cvar("g_vehicle_spiderbot_minigun_heat");
298 self.owner.vehicle_reload1 += ftmp;
300 if(self.owner.vehicle_reload1 >= 1)
302 self.vehicle_reload1 = 1;
303 self.owner.vehicle_reload1 = 1;
304 self.tur_head.attack_finished_single = cvar("g_vehicle_spiderbot_minigun_cooldown") + time;
307 self.tur_head.attack_finished_single = cvar("g_vehicle_spiderbot_minigun_refire") + time;
322 float spiderbot_pplug()
325 entity player,spider;
329 spider = self.vehicle;
331 player.BUTTON_ZOOM = 0;
332 player.BUTTON_CROUCH = 0;
333 player.switchweapon = 0;
335 if(player.BUTTON_USE)
343 crosshair_trace(player);
344 ad = vectoangles(normalize(trace_endpos - gettaginfo(spider.tur_head,gettagindex(spider.tur_head,"tag_hud")))) - (spider.tur_head.angles + spider.angles);
346 fixedmakevectors(spider.angles);
347 if(ad_x > 180) ad_x -= 360;
348 if(ad_x < -180) ad_x += 360;
349 if(ad_y > 180) ad_y -= 360;
350 if(ad_y < -180) ad_y += 360;
353 ftmp = cvar("g_vehicle_spiderbot_head_turnspeed") * sys_frametime;
354 ad_y = bound(-ftmp, ad_y, ftmp);
355 spider.tur_head.angles_y = bound(cvar("g_vehicle_spiderbot_head_turnlimit") * -1, spider.tur_head.angles_y + ad_y, cvar("g_vehicle_spiderbot_head_turnlimit"));
358 ftmp = cvar("g_vehicle_spiderbot_head_pitchspeed") * sys_frametime;
359 ad_x = bound(-ftmp, ad_x, ftmp);
360 spider.tur_head.angles_x = bound(cvar("g_vehicle_spiderbot_head_pitchlimit_down"), spider.tur_head.angles_x + ad_x, cvar("g_vehicle_spiderbot_head_pitchlimit_up"));
363 ftmp = cvar("g_vehicle_spiderbot_turnspeed") * sys_frametime;
364 ftmp = bound(-ftmp, spider.tur_head.angles_y, ftmp);
367 if(spider.flags & FL_ONGROUND)
369 if(player.BUTTON_JUMP)
371 player.BUTTON_JUMP = 0;
372 spider.velocity = v_forward * 700 + v_up * 600;
377 if(vlen(player.movement) == 0)
379 movelib_beak_simple(cvar("g_vehicle_spiderbot_speed_stop"));
384 spider.angles_y = safeangle(spider.angles_y + ftmp);
385 spider.tur_head.angles_y -= ftmp;
387 if(player.movement_x != 0)
389 if(player.movement_x > 0)
391 player.movement_x = 1;
394 else if(player.movement_x < 0)
396 player.movement_x = -1;
399 player.movement_y = 0;
400 movelib_move_simple(normalize(v_forward * player.movement_x),cvar("g_vehicle_spiderbot_speed_walk"),cvar("g_vehicle_spiderbot_movement_inertia"));
402 else if(player.movement_y != 0)
404 if(player.movement_y < 0)
406 player.movement_y = -1;
409 else if(player.movement_y > 0)
411 player.movement_y = 1;
414 movelib_move_simple(normalize(v_right * player.movement_y),cvar("g_vehicle_spiderbot_speed_strafe"),cvar("g_vehicle_spiderbot_movement_inertia"));
419 movelib_groundalign4point(300,100,0.25);
422 spiderbot_miniguns_do();
423 spiderbot_rocket_do();
424 vehicle_stdproc_shiledregen(CCVAR("_shield"), frametime);
425 vehicle_stdproc_healthregen(CCVAR("_health"), frametime);
427 player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
428 player.vehicle_ammo2 = spider.tur_head.frame;
430 if(spider.gun2.cnt <= time)
431 player.vehicle_reload2 = 1;
433 player.vehicle_reload2 = 1 - ((spider.gun2.cnt - time) / spider.attack_finished_single);
435 //setorigin(spider,spider.origin);
436 setorigin(player,spider.origin + '0 0 64');
437 player.velocity = spider.velocity;
444 void spiderbot_think()
446 if(self.flags & FL_ONGROUND)
448 movelib_beak_simple(cvar("g_vehicle_spiderbot_speed_stop"));
449 //movelib_groundalign4point(300,100);
452 self.nextthink = time;
455 void spiderbot_enter()
457 // Remove this when bots know how to use the spiderbot
458 if (clienttype(other) != CLIENTTYPE_REAL)
461 self.colormod = self.tur_head.colormod = '0 0 0';
465 if(self.team != other.team)
469 self.switchweapon = other.switchweapon;
471 self.event_damage = vehicle_stdproc_damage ;
472 self.colormap = self.owner.colormap;
473 self.tur_head.colormap = self.owner.colormap;
474 self.vehicle_hudmodel.viewmodelforclient = self.owner;
476 self.owner.angles = self.angles;
477 self.owner.takedamage = DAMAGE_NO;
478 self.owner.solid = SOLID_NOT;
479 self.owner.movetype = MOVETYPE_NOCLIP;
480 self.owner.alpha = -1;
481 self.owner.PlayerPhysplug = spiderbot_pplug;
482 self.owner.vehicle = self;
483 self.owner.event_damage = SUB_Null;
484 self.owner.hud = HUD_SPIDERBOT;
485 self.owner.vehicle_health = (self.vehicle_health / cvar("g_vehicle_spiderbot_health"));
486 self.owner.vehicle_shield = (self.vehicle_shield / cvar("g_vehicle_spiderbot_shield"));
487 self.owner.view_ofs = '0 0 0';
488 self.owner.vehicle_ammo1 = self.vehicle_ammo1;
489 self.owner.vehicle_ammo2 = self.vehicle_ammo2;
490 self.owner.vehicle_reload1 = self.vehicle_reload1;
491 self.owner.vehicle_reload2 = self.vehicle_reload2;
493 //if(other.flags & FL_ONGROUND)
494 other.flags &~= FL_ONGROUND;
496 //if(self.flags & FL_ONGROUND)
497 self.flags &~= FL_ONGROUND;
499 self.team = self.owner.team;
500 self.flags -= FL_NOTARGET;
502 if(clienttype(other) == CLIENTTYPE_REAL)
505 WriteByte (MSG_ONE, SVC_SETVIEWPORT);
506 WriteEntity(MSG_ONE, self.vehicle_viewport);
508 WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES
509 WriteAngle(MSG_ONE, self.tur_head.angles_x + self.angles_x); // tilt
510 WriteAngle(MSG_ONE, self.tur_head.angles_y + self.angles_y); // yaw
511 WriteAngle(MSG_ONE, 0); // roll
515 void spiderbot_exit(float eject)
520 self.flags |= FL_NOTARGET;
522 e = findchain(classname,"spiderbot_rocket");
525 if(e.owner == self.owner)
527 e.realowner = self.owner;
533 self.owner.switchweapon = self.switchweapon;
535 self.velocity = '0 0 0';
536 if(clienttype(self.owner) == CLIENTTYPE_REAL)
538 msg_entity = self.owner;
539 WriteByte (MSG_ONE, SVC_SETVIEWPORT);
540 WriteEntity( MSG_ONE, self.owner);
542 WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES
543 WriteAngle(MSG_ONE, 0); // tilt
544 WriteAngle(MSG_ONE, self.angles_y); // yaw
545 WriteAngle(MSG_ONE, 0); // roll
548 self.think = spiderbot_think;
549 self.nextthink = time;
550 self.owner.takedamage = DAMAGE_AIM;
551 self.owner.solid = SOLID_SLIDEBOX;
552 self.owner.movetype = MOVETYPE_WALK;
554 setsize(self.owner,PL_MIN,PL_MAX);
556 self.owner.alpha = 1;
557 self.owner.PlayerPhysplug = SUB_Null;
558 self.owner.vehicle = world;
559 self.owner.view_ofs = PL_VIEW_OFS;
560 self.owner.hud = HUD_NORMAL;
561 self.owner.event_damage = PlayerDamage;
563 self.colormap = 1024;
564 self.tur_head.colormap = 1024;
570 self.team = self.spiderbot_spawnpnt.team ;
571 if (self.team == COLOR_TEAM1) self.colormod = '1.4 0.8 0.8';
572 if (self.team == COLOR_TEAM2) self.colormod = '0.8 0.8 1.4';
573 self.tur_head.colormod = self.colormod;
576 self.vehicle_hudmodel.viewmodelforclient = self;
577 self.tur_head.nodrawtoclient = self;
579 setattachment(self.owner,world,"");
581 makevectors(self.angles);
584 setorigin(self.owner,self.origin + v_forward * 100 + '0 0 64');
585 self.owner.velocity = (v_up + v_forward * 0.25) * 750;
588 setorigin(self.owner,self.origin - v_forward * 200 + '0 0 64');
593 float spiderbot_crushable(entity e)
595 if(e.classname == "corpse")
598 if(e.classname == "player")
601 if(e.classname == "monster_zombie")
607 void spiderbot_touch()
611 if(vlen(self.velocity) == 0)
614 if not (spiderbot_crushable(other))
617 //todo: add check for velocity/angle here (so we dont cush players runing into us from behind)
619 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") );
623 if(other.classname != "player")
626 if(other.deadflag != DEAD_NO)
629 if(other.vehicle != world)
635 float spiderbot_customizeentityforclient()
637 if(self.deadflag == DEAD_DEAD)
643 void spiderbot_spawn()
646 self.think = spiderbot_think;
647 self.nextthink = time;
649 setsize(self,spiderbot_MIN,spiderbot_MAX);
651 self.velocity = '0 0 0';
652 self.vehicle_health = CCVAR("_health");
653 self.vehicle_shield = CCVAR("_shield");
654 self.event_damage = vehicle_stdproc_damage;
655 self.iscreature = TRUE;
656 self.movetype = MOVETYPE_WALK;
657 self.solid = SOLID_SLIDEBOX;
658 self.takedamage = DAMAGE_AIM;
659 self.touch = spiderbot_touch;
660 self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = 1;
661 self.tur_head.angles = '0 0 0';
662 self.colormap = 1024;
663 self.tur_head.colormap = 1024;
664 self.deadflag = DEAD_NO;
665 self.bot_attack = TRUE;
666 self.flags |= FL_NOTARGET;
667 self.vehicle_hudmodel.viewmodelforclient = self;
668 self.tur_head.frame = 1;
670 setorigin(self,self.spiderbot_spawnpnt.origin + '0 0 1.25' * spiderbot_MAX_z);
671 self.angles = self.spiderbot_spawnpnt.angles;
673 if (self.team == COLOR_TEAM1)
674 self.colormod = '1.4 0.8 0.8';
675 else if (self.team == COLOR_TEAM2)
676 self.colormod = '0.8 0.8 1.4';
678 self.colormod = '0 0 0';
680 self.tur_head.colormod = self.colormod;
683 pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);
686 void spiderbot_blowup()
688 sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
689 pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);
691 RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_SBBLOWUP, world);
693 self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = -1;
694 self.nextthink = time + cvar("g_vehicle_spiderbot_respawntime");
695 self.think = spiderbot_spawn;
696 self.movetype = MOVETYPE_NONE;
698 setorigin(self, self.tur_aimpos);
705 self.event_damage = SUB_Null;
706 self.iscreature = FALSE;
707 self.solid = SOLID_NOT;
708 self.takedamage = DAMAGE_NO;
709 self.touch = SUB_Null;
710 self.nextthink = time + random() * 2;
711 self.think = spiderbot_blowup;
712 self.deadflag = DEAD_DEAD;
713 self.vehicle_hudmodel.viewmodelforclient = self;
715 self.tur_head.frame = 1;
719 void vewhicle_spiderbot_dinit()
722 self.spiderbot_spawnpnt = spawn();
723 self.spiderbot_spawnpnt.angles = self.angles;
725 setorigin(self,self.origin);
726 tracebox(self.origin + '0 0 100', spiderbot_MIN, spiderbot_MAX, self.origin - '0 0 10000', MOVE_WORLDONLY, self);
727 setorigin(self.spiderbot_spawnpnt,trace_endpos);
729 if(self.team && !teamplay)
732 self.spiderbot_spawnpnt.team = self.team;
734 addstat(STAT_HUD, AS_INT, hud);
735 addstat(STAT_VEHICLESTAT_HEALTH, AS_FLOAT, vehicle_health);
736 addstat(STAT_VEHICLESTAT_SHIELD, AS_FLOAT, vehicle_shield);
737 addstat(STAT_VEHICLESTAT_ENERGY, AS_FLOAT, vehicle_energy);
738 addstat(STAT_VEHICLESTAT_AMMO1, AS_INT, vehicle_ammo1);
739 addstat(STAT_VEHICLESTAT_RELOAD1, AS_FLOAT, vehicle_reload1);
740 addstat(STAT_VEHICLESTAT_AMMO2, AS_INT, vehicle_ammo2);
741 addstat(STAT_VEHICLESTAT_RELOAD2, AS_FLOAT, vehicle_reload2);
743 if (self.netname == "")
744 self.netname = "spiderbot";
746 self.tur_head = spawn();
749 self.vehicle_viewport = spawn();
750 self.vehicle_hudmodel = spawn();
751 self.vehicle_flags = VHF_HASSHIELD | VHF_SHIELDREGEN | VHF_HEALTHREGEN | VHF_DEATHEJECT;
752 self.cvar_basename = "g_vehicle_spiderbot";
755 setmodel(self, "models/vehicles/spiderbot.dpm");
756 setmodel(self.tur_head, "models/vehicles/spiderbot_top.dpm");
757 setmodel(self.gun1, "models/vehicles/spiderbot_barrels.dpm");
758 setmodel(self.gun2, "models/vehicles/spiderbot_barrels.dpm");
759 setmodel(self.vehicle_hudmodel, "models/vehicles/spiderbot_cockpit.dpm");
760 setmodel(self.vehicle_viewport, "null");
762 setattachment(self.tur_head, self, "tag_head");
763 setattachment(self.vehicle_hudmodel, self.tur_head, "tag_hud");
764 setattachment(self.vehicle_viewport, self.vehicle_hudmodel, "");
766 setattachment(self.gun1, self.tur_head, "tag_hardpoint01");
767 setattachment(self.gun2, self.tur_head, "tag_hardpoint02");
769 self.tur_head.owner = self;
770 self.customizeentityforclient = spiderbot_customizeentityforclient;
772 self.tur_aimpos = self.origin;
776 self.vehicle_die = spiderbot_die;
777 self.vehicle_exit = spiderbot_exit;
780 void spawnfunc_vehicle_spiderbot()
782 precache_model ( "models/vhshield.md3");
783 precache_model ( "models/vehicles/spiderbot.dpm");
784 precache_model ( "models/vehicles/spiderbot_top.dpm");
785 precache_model ( "models/vehicles/spiderbot_barrels.dpm");
786 precache_model ( "models/vehicles/spiderbot_cockpit.dpm");
787 precache_model ( "models/uziflash.md3");
789 precache_sound ( "weapons/rocket_impact.wav" );
792 self.think = vewhicle_spiderbot_dinit;
793 self.nextthink = time + 0.5;