[nexuiz-commits] r8683 - in trunk/data: models/vehicles qcsrc/server/vehicles
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Sun Feb 28 14:33:07 EST 2010
Author: tzork
Date: 2010-02-28 14:33:07 -0500 (Sun, 28 Feb 2010)
New Revision: 8683
Modified:
trunk/data/models/vehicles/spiderbot_top.dpm
trunk/data/qcsrc/server/vehicles/spiderbot.qc
Log:
Vehicle Spiderbot:
Get rid of any cursor_*
Make aim accurate, even in chase mode.
Make rockets guided as long as you hold the secondary, when released rockets track the last spot aimed at before letting go. Do not refire rocket volleys as long as secondary is held.
Fix op part's animation (rocket reload).
Bit less messy turn/aim code.
Modified: trunk/data/models/vehicles/spiderbot_top.dpm
===================================================================
(Binary files differ)
Modified: trunk/data/qcsrc/server/vehicles/spiderbot.qc
===================================================================
--- trunk/data/qcsrc/server/vehicles/spiderbot.qc 2010-02-28 12:09:16 UTC (rev 8682)
+++ trunk/data/qcsrc/server/vehicles/spiderbot.qc 2010-02-28 19:33:07 UTC (rev 8683)
@@ -1,6 +1,6 @@
-#define spiderbot_MIN '-75 -75 0'
-//#define
+const vector spiderbot_MIN = '-75 -75 0';
const vector spiderbot_MAX = '75 75 100';
+
#define spiderbot_spawnpnt wkr_spawn
void spiderbot_exit(float eject);
@@ -50,12 +50,12 @@
spiderbot_rocket_explode();
}
-void spiderbot_rocket_think()
+void spiderbot_rocket_guided()
{
vector newdir,olddir;
self.nextthink = time;
- if (self.owner.deadflag != DEAD_NO)
+ if (self.owner.deadflag != DEAD_NO || self.cnt < time)
{
spiderbot_rocket_explode();
return;
@@ -67,18 +67,39 @@
return;
}
- self.solid = SOLID_BBOX;
- self.touch = spiderbot_rocket_touch;
olddir = normalize(self.velocity);
- // FIXME this uses prydon cursor
- //newdir = normalize(self.owner.cursor_trace_endpos - self.origin);
- newdir = normalize(self.pos1 - self.origin);
- newdir += randomvec() * cvar("g_vehicle_spiderbot_rocket_noise");
+ crosshair_trace(self.owner);
+ newdir = normalize(trace_endpos - self.origin) + randomvec() * cvar("g_vehicle_spiderbot_rocket_noise");
self.velocity = normalize(olddir + newdir * cvar("g_vehicle_spiderbot_rocket_turnrate")) * cvar("g_vehicle_spiderbot_rocket_speed");
UpdateCSQCProjectile(self);
}
+void spiderbot_rocket_unguided()
+{
+ vector newdir,olddir;
+
+ self.nextthink = time;
+ if (self.owner.deadflag != DEAD_NO || self.cnt < time)
+ {
+ spiderbot_rocket_explode();
+ return;
+ }
+
+ if not (self.owner.vehicle)
+ {
+ UpdateCSQCProjectile(self);
+ return;
+ }
+
+ olddir = normalize(self.velocity);
+ newdir = normalize(self.pos1 - self.origin) + randomvec() * cvar("g_vehicle_spiderbot_rocket_noise");
+ self.velocity = normalize(olddir + newdir * cvar("g_vehicle_spiderbot_rocket_turnrate")) * cvar("g_vehicle_spiderbot_rocket_speed");
+
+ UpdateCSQCProjectile(self);
+}
+
+
void spiderbot_rocket_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
{
self.health -= damage;
@@ -87,34 +108,69 @@
spiderbot_rocket_explode();
}
+void spiderbot_guide_release()
+{
+ entity rkt;
+ rkt = findchainentity(owner,self.owner);
+ if not (rkt)
+ return;
+ crosshair_trace(self.owner);
+
+ while(rkt)
+ {
+ if(rkt.think == spiderbot_rocket_guided)
+ {
+ rkt.pos1 = trace_endpos;
+ rkt.think = spiderbot_rocket_unguided;
+ }
+
+ rkt = rkt.chain;
+ }
+}
+
void spiderbot_rocket_do()
{
entity rocket;
+ if (self.owner.BUTTON_ATCK2)
+ {
+ if (self.wait == 1)
+ if (self.tur_head.frame == 9 || self.tur_head.frame == 1)
+ {
+ if(self.gun2.cnt < time && self.tur_head.frame == 9)
+ self.tur_head.frame = 1;
+
+ return;
+ }
+
+ self.wait = 1;
+ }
+ else
+ {
+ if(self.wait)
+ spiderbot_guide_release();
+
+ self.wait = 0;
+ }
+
if(self.gun2.cnt > time)
return;
- if(self.tur_head.frame > 7)
- self.tur_head.frame = 0;
+ if (self.tur_head.frame >= 9)
+ self.tur_head.frame = 1;
if not (self.owner.BUTTON_ATCK2)
return;
- self.tur_head.frame += 1;
- if(self.tur_head.frame > 7)
- self.attack_finished_single = cvar("g_vehicle_spiderbot_rocket_reload");
- else
- self.attack_finished_single = cvar("g_vehicle_spiderbot_rocket_refire");
-
- self.gun2.cnt = time + self.attack_finished_single;
-
sound (self, CHAN_WEAPON, "weapons/rocket_fire.wav", VOL_BASE, ATTN_NORM);
rocket = spawn ();
setsize (rocket, '-1 -1 -1', '1 1 1'); // give it some size so it can be shot
setorigin(rocket,gettaginfo(self.tur_head,gettagindex(self.tur_head,"tag_fire")));
te_explosion (rocket.origin);
+ crosshair_trace(self.owner);
+
rocket.classname = "spiderbot_rocket";
rocket.bot_dodge = TRUE;
rocket.bot_dodgerating = cvar("g_vehicle_spiderbot_rocket_damage");
@@ -127,17 +183,26 @@
rocket.movetype = MOVETYPE_FLYMISSILE;
rocket.velocity = normalize(v_forward + (v_up * 0.5) + randomvec() * 0.25) * cvar("g_vehicle_spiderbot_rocket_speed");
rocket.angles = vectoangles(rocket.velocity);
- rocket.think = spiderbot_rocket_think;
+ rocket.think = spiderbot_rocket_guided;
+ rocket.touch = spiderbot_rocket_touch;
rocket.flags = FL_PROJECTILE;
- rocket.solid = SOLID_NOT;
- // FIXME this uses prydon cursor
- rocket.pos1 = self.owner.cursor_trace_endpos;
+ rocket.solid = SOLID_TRIGGER;
+ rocket.pos1 = trace_endpos;
CSQCProjectile(rocket, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, has fly sound
+
+ self.tur_head.frame += 1;
+ if (self.tur_head.frame == 9)
+ self.attack_finished_single = cvar("g_vehicle_spiderbot_rocket_reload");
+ else
+ self.attack_finished_single = cvar("g_vehicle_spiderbot_rocket_refire");
+
+ self.gun2.cnt = time + self.attack_finished_single;
}
void spiderbot_minigun_fire_Flash_Go() {
- if (self.frame > 10){
+ if (self.frame > 10)
+ {
self.alpha = -1;
setmodel(self,"");
return;
@@ -258,25 +323,11 @@
{
vector ad;
entity player,spider;
- float ftmp,ftmp2;
+ float ftmp;
player = self;
spider = self.vehicle;
-/*
- self.BUTTON_ATCK = 0;
- self.button1 = 0;
- self.BUTTON_JUMP = 0;
- self.BUTTON_ATCK2 = 0;
-
-
- self.BUTTON_HOOK = 0;
- self.BUTTON_INFO = 0;
- self.button8 = 0;
- self.BUTTON_CHAT = 0;
- self.BUTTON_USE = 0;
-*/
-
player.BUTTON_ZOOM = 0;
player.BUTTON_CROUCH = 0;
player.switchweapon = 0;
@@ -289,44 +340,36 @@
return 0;
}
- player.exteriormodeltoclient = spider.tur_head;
+ crosshair_trace(player);
+ ad = vectoangles(normalize(trace_endpos - gettaginfo(spider.tur_head,gettagindex(spider.tur_head,"tag_hud")))) - (spider.tur_head.angles + spider.angles);
- spider.tur_head.angles_x *= -1;
- spider.angles_x *= -1;
- makevectors(spider.angles);
+ fixedmakevectors(spider.angles);
+ if(ad_x > 180) ad_x -= 360;
+ if(ad_x < -180) ad_x += 360;
+ if(ad_y > 180) ad_y -= 360;
+ if(ad_y < -180) ad_y += 360;
- ad = player.v_angle - (spider.tur_head.angles + spider.angles);
-
// Rotate head
ftmp = cvar("g_vehicle_spiderbot_head_turnspeed") * sys_frametime;
- ftmp2 = ftmp * -1;
- spider.tur_head.angles_y += bound(ftmp2,shortangle_f(ad_y,spider.tur_head.angles_y),ftmp);
- spider.tur_head.angles_y = bound(cvar("g_vehicle_spiderbot_head_turnlimit") * -1,spider.tur_head.angles_y,cvar("g_vehicle_spiderbot_head_turnlimit"));
+ ad_y = bound(-ftmp, ad_y, ftmp);
+ 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"));
// Pitch head
ftmp = cvar("g_vehicle_spiderbot_head_pitchspeed") * sys_frametime;
- ftmp2 = ftmp * -1;
- spider.tur_head.angles_x += bound(ftmp2,shortangle_f(ad_x,spider.tur_head.angles_x),ftmp);
- 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"));
+ ad_x = bound(-ftmp, ad_x, ftmp);
+ 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"));
- spider.tur_head.angles_x *= -1;
- spider.angles_x *= -1;
- //player.angles_x *= -1;
-
// Turn Body
ftmp = cvar("g_vehicle_spiderbot_turnspeed") * sys_frametime;
- ftmp2 = ftmp * -1;
- ftmp = bound(ftmp2,spider.tur_head.angles_y,ftmp);
+ ftmp = bound(-ftmp, spider.tur_head.angles_y, ftmp);
self = spider;
if(spider.flags & FL_ONGROUND)
{
- //if(spider.state != SBS_JUMP)
if(player.BUTTON_JUMP)
{
player.BUTTON_JUMP = 0;
spider.velocity = v_forward * 700 + v_up * 600;
- spider.state = SBS_JUMP;
spider.frame = 4;
}
else
@@ -334,9 +377,6 @@
if(vlen(player.movement) == 0)
{
movelib_beak_simple(cvar("g_vehicle_spiderbot_speed_stop"));
- spider.anim_start = 0;
- spider.anim_end = 0;
- spider.state = SBS_IDLE;
spider.frame = 5;
}
else
@@ -349,13 +389,11 @@
if(player.movement_x > 0)
{
player.movement_x = 1;
- spider.state = SBS_WALK;
spider.frame = 0;
}
else if(player.movement_x < 0)
{
player.movement_x = -1;
- spider.state = SBS_BACK;
spider.frame = 1;
}
player.movement_y = 0;
@@ -366,13 +404,11 @@
if(player.movement_y < 0)
{
player.movement_y = -1;
- spider.state = SBS_LEFT;
spider.frame = 2;
}
else if(player.movement_y > 0)
{
player.movement_y = 1;
- spider.state = SBS_RIGHT;
spider.frame = 3;
}
movelib_move_simple(normalize(v_right * player.movement_y),cvar("g_vehicle_spiderbot_speed_strafe"),cvar("g_vehicle_spiderbot_movement_inertia"));
@@ -578,7 +614,7 @@
if not (spiderbot_crushable(other))
return;
- //todo: add check for velocity/angle here (so we dont cush players runing onto us from behind)
+ //todo: add check for velocity/angle here (so we dont cush players runing into us from behind)
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") );
return;
@@ -629,6 +665,7 @@
self.bot_attack = TRUE;
self.flags |= FL_NOTARGET;
self.vehicle_hudmodel.viewmodelforclient = self;
+ self.tur_head.frame = 1;
setorigin(self,self.spiderbot_spawnpnt.origin + '0 0 1.25' * spiderbot_MAX_z);
self.angles = self.spiderbot_spawnpnt.angles;
@@ -675,7 +712,7 @@
self.deadflag = DEAD_DEAD;
self.vehicle_hudmodel.viewmodelforclient = self;
self.frame = 0;
- self.tur_head.frame = 0;
+ self.tur_head.frame = 1;
}
@@ -686,15 +723,9 @@
self.spiderbot_spawnpnt.angles = self.angles;
setorigin(self,self.origin);
- dprint("ORG1:",vtos(self.origin));
- //traceline(self.origin + '0 0 100', self.origin - '0 0 10000', MOVE_WORLDONLY, self);
tracebox(self.origin + '0 0 100', spiderbot_MIN, spiderbot_MAX, self.origin - '0 0 10000', MOVE_WORLDONLY, self);
setorigin(self.spiderbot_spawnpnt,trace_endpos);
- dprint("ORG2:",vtos(self.origin),"\n");
-
- //setorigin(self.spiderbot_spawnpnt,self.origin);
-
if(self.team && !teamplay)
self.team = 0;
else
@@ -732,8 +763,8 @@
setattachment(self.vehicle_hudmodel, self.tur_head, "tag_hud");
setattachment(self.vehicle_viewport, self.vehicle_hudmodel, "");
- setattachment(self.gun1,self.tur_head, "tag_hardpoint01");
- setattachment(self.gun2,self.tur_head, "tag_hardpoint02");
+ setattachment(self.gun1, self.tur_head, "tag_hardpoint01");
+ setattachment(self.gun2, self.tur_head, "tag_hardpoint02");
self.tur_head.owner = self;
self.customizeentityforclient = spiderbot_customizeentityforclient;
@@ -755,7 +786,6 @@
precache_model ( "models/vehicles/spiderbot_cockpit.dpm");
precache_model ( "models/uziflash.md3");
- precache_model ( "models/turrets/rocket.md3");
precache_sound ( "weapons/rocket_impact.wav" );
//self.team = -1;
More information about the nexuiz-commits
mailing list