1 #define spiderbot_MIN '-75 -75 0'
3 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_think()
57 self.nextthink = time;
58 if (self.owner.deadflag != DEAD_NO)
60 spiderbot_rocket_explode();
64 if not (self.owner.vehicle)
66 UpdateCSQCProjectile(self);
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");
79 UpdateCSQCProjectile(self);
82 void spiderbot_rocket_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
84 self.health -= damage;
85 self.velocity += force;
87 spiderbot_rocket_explode();
91 void spiderbot_rocket_do()
95 if(self.gun2.cnt > time)
98 if(self.tur_head.frame > 7)
99 self.tur_head.frame = 0;
101 if not (self.owner.BUTTON_ATCK2)
104 self.tur_head.frame += 1;
105 if(self.tur_head.frame > 7)
106 self.attack_finished_single = cvar("g_vehicle_spiderbot_rocket_reload");
108 self.attack_finished_single = cvar("g_vehicle_spiderbot_rocket_refire");
110 self.gun2.cnt = time + self.attack_finished_single;
112 sound (self, CHAN_WEAPON, "weapons/rocket_fire.wav", VOL_BASE, ATTN_NORM);
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);
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;
136 CSQCProjectile(rocket, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, has fly sound
139 void spiderbot_minigun_fire_Flash_Go() {
140 if (self.frame > 10){
146 self.frame = self.frame + 2;
147 self.alpha = self.alpha - 0.2;
149 self.nextthink = time + 0.02;
152 void spiderbot_minigun_fire(entity gun,float trail)
157 v = gettaginfo(gun,gettagindex(gun,"barrels"));
158 v_forward = normalize(v_forward);
160 sound (gun, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
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);
168 setattachment(gun.enemy , gun, "barrels");
169 setorigin(gun.enemy ,gun.enemy.origin + '52 0 0');
173 setmodel(flash, "models/uziflash.md3");
174 flash.think = spiderbot_minigun_fire_Flash_Go;
175 flash.nextthink = time + 0.02;
177 flash.angles_z = flash.v_angle_z + random() * 180;
179 flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
183 trailparticles(self, particleeffectnum("EF_MGTURRETTRAIL"), v, trace_endpos);
186 void spiderbot_miniguns_do()
190 if((self.vehicle_reload1 == 1) || (!self.owner.BUTTON_ATCK))
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;
201 if (self.owner.BUTTON_ATCK)
205 self.gun1.angles_z += (1440 * sys_frametime);
206 self.gun2.angles_z -= (1440 * sys_frametime);
207 if(self.gun1.angles_z >= 360)
209 self.gun1.angles_z = 0;
210 self.gun2.angles_z = 360;
213 if (self.tur_head.attack_finished_single < time)
215 // Fire bullets, alternating trails left<->right
217 if(self.uzi_bulletcounter == 1)
219 spiderbot_minigun_fire(self.vehicle.gun1, 0);
220 spiderbot_minigun_fire(self.vehicle.gun2, 1);
221 self.uzi_bulletcounter = 0;
225 spiderbot_minigun_fire(self.vehicle.gun1, 1);
226 spiderbot_minigun_fire(self.vehicle.gun2, 0);
227 self.uzi_bulletcounter += 1;
232 ftmp = cvar("g_vehicle_spiderbot_minigun_refire") / cvar("g_vehicle_spiderbot_minigun_heat");
233 self.owner.vehicle_reload1 += ftmp;
235 if(self.owner.vehicle_reload1 >= 1)
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;
242 self.tur_head.attack_finished_single = cvar("g_vehicle_spiderbot_minigun_refire") + time;
257 float spiderbot_pplug()
260 entity player,spider;
264 spider = self.vehicle;
267 self.BUTTON_ATCK = 0;
269 self.BUTTON_JUMP = 0;
270 self.BUTTON_ATCK2 = 0;
273 self.BUTTON_HOOK = 0;
274 self.BUTTON_INFO = 0;
276 self.BUTTON_CHAT = 0;
280 player.BUTTON_ZOOM = 0;
281 player.BUTTON_CROUCH = 0;
282 player.switchweapon = 0;
284 if(player.BUTTON_USE)
292 player.exteriormodeltoclient = spider.tur_head;
294 spider.tur_head.angles_x *= -1;
295 spider.angles_x *= -1;
296 makevectors(spider.angles);
298 ad = player.v_angle - (spider.tur_head.angles + spider.angles);
301 ftmp = cvar("g_vehicle_spiderbot_head_turnspeed") * sys_frametime;
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"));
307 ftmp = cvar("g_vehicle_spiderbot_head_pitchspeed") * sys_frametime;
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"));
312 spider.tur_head.angles_x *= -1;
313 spider.angles_x *= -1;
314 //player.angles_x *= -1;
317 ftmp = cvar("g_vehicle_spiderbot_turnspeed") * sys_frametime;
319 ftmp = bound(ftmp2,spider.tur_head.angles_y,ftmp);
322 if(spider.flags & FL_ONGROUND)
324 //if(spider.state != SBS_JUMP)
325 if(player.BUTTON_JUMP)
327 player.BUTTON_JUMP = 0;
328 spider.velocity = v_forward * 700 + v_up * 600;
329 spider.state = SBS_JUMP;
334 if(vlen(player.movement) == 0)
336 movelib_beak_simple(cvar("g_vehicle_spiderbot_speed_stop"));
337 spider.anim_start = 0;
339 spider.state = SBS_IDLE;
344 spider.angles_y = safeangle(spider.angles_y + ftmp);
345 spider.tur_head.angles_y -= ftmp;
347 if(player.movement_x != 0)
349 if(player.movement_x > 0)
351 player.movement_x = 1;
352 spider.state = SBS_WALK;
355 else if(player.movement_x < 0)
357 player.movement_x = -1;
358 spider.state = SBS_BACK;
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"));
364 else if(player.movement_y != 0)
366 if(player.movement_y < 0)
368 player.movement_y = -1;
369 spider.state = SBS_LEFT;
372 else if(player.movement_y > 0)
374 player.movement_y = 1;
375 spider.state = SBS_RIGHT;
378 movelib_move_simple(normalize(v_right * player.movement_y),cvar("g_vehicle_spiderbot_speed_strafe"),cvar("g_vehicle_spiderbot_movement_inertia"));
383 movelib_groundalign4point(300,100,0.25);
386 spiderbot_miniguns_do();
387 spiderbot_rocket_do();
388 vehicle_stdproc_shiledregen(CCVAR("_shield"), frametime);
389 vehicle_stdproc_healthregen(CCVAR("_health"), frametime);
391 player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
392 player.vehicle_ammo2 = spider.tur_head.frame;
394 if(spider.gun2.cnt <= time)
395 player.vehicle_reload2 = 1;
397 player.vehicle_reload2 = 1 - ((spider.gun2.cnt - time) / spider.attack_finished_single);
399 //setorigin(spider,spider.origin);
400 setorigin(player,spider.origin + '0 0 64');
401 player.velocity = spider.velocity;
408 void spiderbot_think()
410 if(self.flags & FL_ONGROUND)
412 movelib_beak_simple(cvar("g_vehicle_spiderbot_speed_stop"));
413 //movelib_groundalign4point(300,100);
416 self.nextthink = time;
419 void spiderbot_enter()
421 // Remove this when bots know how to use the spiderbot
422 if (clienttype(other) != CLIENTTYPE_REAL)
425 self.colormod = self.tur_head.colormod = '0 0 0';
429 if(self.team != other.team)
433 self.switchweapon = other.switchweapon;
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;
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;
457 //if(other.flags & FL_ONGROUND)
458 other.flags &~= FL_ONGROUND;
460 //if(self.flags & FL_ONGROUND)
461 self.flags &~= FL_ONGROUND;
463 self.team = self.owner.team;
464 self.flags -= FL_NOTARGET;
466 if(clienttype(other) == CLIENTTYPE_REAL)
469 WriteByte (MSG_ONE, SVC_SETVIEWPORT);
470 WriteEntity(MSG_ONE, self.vehicle_viewport);
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
479 void spiderbot_exit(float eject)
484 self.flags |= FL_NOTARGET;
486 e = findchain(classname,"spiderbot_rocket");
489 if(e.owner == self.owner)
491 e.realowner = self.owner;
497 self.owner.switchweapon = self.switchweapon;
499 self.velocity = '0 0 0';
500 if(clienttype(self.owner) == CLIENTTYPE_REAL)
502 msg_entity = self.owner;
503 WriteByte (MSG_ONE, SVC_SETVIEWPORT);
504 WriteEntity( MSG_ONE, self.owner);
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
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;
518 setsize(self.owner,PL_MIN,PL_MAX);
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;
527 self.colormap = 1024;
528 self.tur_head.colormap = 1024;
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;
540 self.vehicle_hudmodel.viewmodelforclient = self;
541 self.tur_head.nodrawtoclient = self;
543 setattachment(self.owner,world,"");
545 makevectors(self.angles);
548 setorigin(self.owner,self.origin + v_forward * 100 + '0 0 64');
549 self.owner.velocity = (v_up + v_forward * 0.25) * 750;
552 setorigin(self.owner,self.origin - v_forward * 200 + '0 0 64');
557 float spiderbot_crushable(entity e)
559 if(e.classname == "corpse")
562 if(e.classname == "player")
565 if(e.classname == "monster_zombie")
571 void spiderbot_touch()
575 if(vlen(self.velocity) == 0)
578 if not (spiderbot_crushable(other))
581 //todo: add check for velocity/angle here (so we dont cush players runing onto us from behind)
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") );
587 if(other.classname != "player")
590 if(other.deadflag != DEAD_NO)
593 if(other.vehicle != world)
599 float spiderbot_customizeentityforclient()
601 if(self.deadflag == DEAD_DEAD)
607 void spiderbot_spawn()
610 self.think = spiderbot_think;
611 self.nextthink = time;
613 setsize(self,spiderbot_MIN,spiderbot_MAX);
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;
633 setorigin(self,self.spiderbot_spawnpnt.origin + '0 0 1.25' * spiderbot_MAX_z);
634 self.angles = self.spiderbot_spawnpnt.angles;
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';
641 self.colormod = '0 0 0';
643 self.tur_head.colormod = self.colormod;
646 pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);
649 void spiderbot_blowup()
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);
654 RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_SBBLOWUP, world);
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;
661 setorigin(self, self.tur_aimpos);
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;
678 self.tur_head.frame = 0;
682 void vewhicle_spiderbot_dinit()
685 self.spiderbot_spawnpnt = spawn();
686 self.spiderbot_spawnpnt.angles = self.angles;
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);
694 dprint("ORG2:",vtos(self.origin),"\n");
696 //setorigin(self.spiderbot_spawnpnt,self.origin);
698 if(self.team && !teamplay)
701 self.spiderbot_spawnpnt.team = self.team;
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);
712 if (self.netname == "")
713 self.netname = "spiderbot";
715 self.tur_head = 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";
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");
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, "");
735 setattachment(self.gun1,self.tur_head, "tag_hardpoint01");
736 setattachment(self.gun2,self.tur_head, "tag_hardpoint02");
738 self.tur_head.owner = self;
739 self.customizeentityforclient = spiderbot_customizeentityforclient;
741 self.tur_aimpos = self.origin;
745 self.vehicle_die = spiderbot_die;
746 self.vehicle_exit = spiderbot_exit;
749 void spawnfunc_vehicle_spiderbot()
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");
758 precache_model ( "models/turrets/rocket.md3");
759 precache_sound ( "weapons/rocket_impact.wav" );
762 self.think = vewhicle_spiderbot_dinit;
763 self.nextthink = time + 0.5;