]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Create and use vehicles_projectile(...) to reduce code duplication. Spiderbot deaht...
authorJakob MG <jakob_mg@hotmail.com>
Sun, 3 Apr 2011 02:39:02 +0000 (04:39 +0200)
committerJakob MG <jakob_mg@hotmail.com>
Sun, 3 Apr 2011 02:39:02 +0000 (04:39 +0200)
16 files changed:
models/vehicles/spiderbot.dpm
models/vehicles/spiderbot.dpm.framegroups
models/vehicles/spiderbot_cockpit.dpm
models/vehicles/spiderbot_top.dpm
qcsrc/server/movelib.qc
qcsrc/server/vehicles/racer.qc
qcsrc/server/vehicles/raptor.qc
qcsrc/server/vehicles/spiderbot.qc
qcsrc/server/vehicles/vehicles.qc
scripts/vehicles.shader [new file with mode: 0644]
textures/spiderbot_reflect.tga [new file with mode: 0644]
textures/wakazachi_gloss.jpg [new file with mode: 0644]
textures/wakazachi_glow.tga [new file with mode: 0644]
textures/wakazachi_reflect.tga [new file with mode: 0644]
vehicle_racer.cfg
vehicle_raptor.cfg

index eeb5e92e7e37ec0e1a75677c0cd0d0455b7e025b..2b5624f03cc41d29029fa7fdd49885c1bc5bd87c 100644 (file)
Binary files a/models/vehicles/spiderbot.dpm and b/models/vehicles/spiderbot.dpm differ
index f9db7221e4f2e959f420eaee3a6e000ae3551ad1..835bd3bd176e2b806fcfb89773bcdbecf55d6878 100644 (file)
@@ -1,6 +1,17 @@
-1   30  20 1 // forward
-32  30  20 1 // backward
-63  30  20 1 // left
-94  30 20 1 // right
-125 30 20 0 // jump
-0   1   20 0 // idle
+/*
+Generated framegroups file for spiderbot
+Used by DarkPlaces to simulate frame groups in DPM models.
+*/
+
+1 31 30 1 // spiderbot forward
+32 31 30 1 // spiderbot backwards
+63 31 20 1 // spiderbot left
+94 31 20 1 // spiderbot right
+125 31 20 0 // spiderbot jump
+156 1 1 0 // spiderbot idle
+157 12 20 0 // spiderbot jump2
+169 7 20 0 // spiderbot jump_charge
+176 11 15 0 // spiderbot jump_fly
+187 21 20 0 // spiderbot jump_land
+208 51 15 0 // spiderbot death
+259 3 1 0 // spiderbot dead
index 8d64449d3c0adc908e5e9deba373c2b92a4d7a91..a851f3e0832cb42cfb76e27696ff4e3da878db03 100644 (file)
Binary files a/models/vehicles/spiderbot_cockpit.dpm and b/models/vehicles/spiderbot_cockpit.dpm differ
index 5085e6be2e9fd78a7d26280d3d86677ee5887b56..e9209ba9c773c0ddc950976ba0aa1869b2029389 100644 (file)
Binary files a/models/vehicles/spiderbot_top.dpm and b/models/vehicles/spiderbot_top.dpm differ
index 89feff9a49e3bbdf77de224226fd569adf8cfb9f..34eaf31aab158acf84d8beb352b2e0e6856bedd7 100644 (file)
@@ -161,10 +161,14 @@ void movelib_update(vector dir,float force)
 }
 */
 
+/*
 void movelib_move_simple(vector newdir,float velo,float blendrate)
 {
     self.velocity = self.velocity * (1 - blendrate) + (newdir * blendrate) * velo;
 }
+*/
+#define movelib_move_simple(newdir,velo,blendrate) \
+    self.velocity = self.velocity * (1 - blendrate) + (newdir * blendrate) * velo
 
 void movelib_beak_simple(float force)
 {
index 4a627fb4b6e094daa1353855c684f023987ff4cc..3915746b3cf9808b6f78844157b56feb79f1b207 100644 (file)
@@ -36,15 +36,18 @@ float autocvar_g_vehicle_racer_shield;
 float autocvar_g_vehicle_racer_shield_regen;
 float autocvar_g_vehicle_racer_shield_regen_pause;
 
-float autocvar_g_vehicle_racer_laser_cost;
-float autocvar_g_vehicle_racer_laser_damage;
-float autocvar_g_vehicle_racer_laser_radius;
-float autocvar_g_vehicle_racer_laser_refire;
-float autocvar_g_vehicle_racer_laser_speed;
+float autocvar_g_vehicle_racer_cannon_cost;
+float autocvar_g_vehicle_racer_cannon_damage;
+float autocvar_g_vehicle_racer_cannon_radius;
+float autocvar_g_vehicle_racer_cannon_refire;
+float autocvar_g_vehicle_racer_cannon_speed;
+float autocvar_g_vehicle_racer_cannon_spread;
+float autocvar_g_vehicle_racer_cannon_force;
 
 float autocvar_g_vehicle_racer_rocket_accel;
 float autocvar_g_vehicle_racer_rocket_damage;
 float autocvar_g_vehicle_racer_rocket_radius;
+float autocvar_g_vehicle_racer_rocket_force;
 float autocvar_g_vehicle_racer_rocket_refire;
 float autocvar_g_vehicle_racer_rocket_speed;
 float autocvar_g_vehicle_racer_rocket_turnrate;
@@ -113,61 +116,21 @@ void racer_align4point()
     self.angles_z *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * frametime);
 }
 
-void racer_rocket_explode()
-{
-       PROJECTILE_TOUCH;
-    if(other.owner == self.owner)
-        return;
-
-       self.event_damage = SUB_Null;
-
-    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-    pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);
-    RadiusDamage (self, self.realowner ,autocvar_g_vehicle_racer_rocket_damage, 0, autocvar_g_vehicle_racer_rocket_radius, world, 150, DEATH_WAKIROCKET, world);
-
-    remove (self);
-}
-
-void racer_bolt_explode()
-{
-       PROJECTILE_TOUCH;
-    pointparticles(particleeffectnum("wakizashi_gun_impact"), findbetterlocation (self.origin, 8), trace_plane_normal * 1000, 1);
-    RadiusDamage (self, self.realowner, autocvar_g_vehicle_racer_laser_damage, 0, autocvar_g_vehicle_racer_laser_radius, world, 150, DEATH_WAKIGUN, world);
-    sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
-    remove (self);
-}
-
 void racer_fire_cannon(string tagname)
 {
-    entity bolt;
     vector v;
+    entity bolt;
 
-    bolt = spawn();
-    sound (self, CHAN_WEAPON, "weapons/lasergun_fire.wav", VOL_BASE, ATTN_NORM);
-
-    setorigin(bolt, gettaginfo(self, gettagindex(self, tagname)));
-    PROJECTILE_MAKETRIGGER(bolt);
-
-    bolt.movetype        = MOVETYPE_FLYMISSILE;
-    bolt.flags           = FL_PROJECTILE | FL_NOTARGET;
-    bolt.owner           = self;
-    bolt.realowner       = self.owner;
-    bolt.touch           = racer_bolt_explode;
-    bolt.think           = racer_bolt_explode;
-    bolt.nextthink       = time + 9;
-
-    bolt.bot_dodge       = TRUE;
-    bolt.bot_dodgerating = autocvar_g_vehicle_racer_laser_damage;
+    v = gettaginfo(self, gettagindex(self, tagname));
+    bolt = vehicles_projectile("wakizashi_gun_impact", "weapons/laserimpact.wav", "wakizashi_gun_muzzleflash", "weapons/lasergun_fire.wav",
+                           v, normalize(v_forward + randomvec() * autocvar_g_vehicle_racer_cannon_spread) * autocvar_g_vehicle_racer_cannon_speed,
+                           autocvar_g_vehicle_racer_cannon_damage, autocvar_g_vehicle_racer_cannon_radius, autocvar_g_vehicle_racer_cannon_force,  0,
+                           DEATH_WAKIGUN, PROJECTILE_WAKICANNON, 0);
 
        // Fix z-aim (for chase mode)
     v = normalize(trace_endpos - bolt.origin);
     v_forward_z = v_z * 0.5;
-
-    bolt.velocity = v_forward * autocvar_g_vehicle_racer_laser_speed;
-
-    pointparticles(particleeffectnum("wakizashi_gun_muzzleflash"), bolt.origin, bolt.velocity, 1);
-
-    CSQCProjectile(bolt, TRUE, PROJECTILE_WAKICANNON, TRUE);
+    bolt.velocity = v_forward * autocvar_g_vehicle_racer_cannon_speed;
 }
 
 void racer_rocket_groundhugger()
@@ -177,9 +140,9 @@ void racer_rocket_groundhugger()
 
     self.nextthink  = time;
 
-    if ((self.owner.deadflag != DEAD_NO) || (self.cnt < time))
+    if(self.owner.deadflag != DEAD_NO || self.cnt < time)
     {
-        racer_rocket_explode();
+        self.use();
         return;
     }
 
@@ -225,9 +188,9 @@ void racer_rocket_tracker()
 
     self.nextthink  = time;
 
-    if ((self.owner.deadflag != DEAD_NO) || (self.cnt < time))
+    if (self.owner.deadflag != DEAD_NO || self.cnt < time)
     {
-        racer_rocket_explode();
+        self.use();
         return;
     }
 
@@ -265,36 +228,25 @@ void racer_rocket_tracker()
 
 void racer_fire_rocket(string tagname, entity trg)
 {
+    vector v;
     entity rocket;
 
-    sound (self, CHAN_WEAPON, "weapons/rocket_fire.wav", VOL_BASE, ATTN_NORM);
-
-    rocket = spawn();
-    setsize (rocket, '-1 -1 -1', '1 1 1');
-    setorigin(rocket, gettaginfo(self, gettagindex(self, tagname)));
+    v = gettaginfo(self, gettagindex(self, tagname));
+    rocket = vehicles_projectile("rocket_explode", "weapons/rocket_impact.wav", "", "weapons/rocket_fire.wav",
+                           v, v_forward * autocvar_g_vehicle_racer_rocket_speed,
+                           autocvar_g_vehicle_racer_rocket_damage, autocvar_g_vehicle_racer_rocket_radius, autocvar_g_vehicle_racer_rocket_force, 3,
+                           DEATH_WAKIROCKET, PROJECTILE_WAKIROCKET, 20);
 
     rocket.lip              = autocvar_g_vehicle_racer_rocket_accel * sys_frametime;
     rocket.wait             = autocvar_g_vehicle_racer_rocket_turnrate;
-    rocket.solid            = SOLID_BBOX;
-    rocket.movetype         = MOVETYPE_FLYMISSILE;
-    rocket.flags            = FL_PROJECTILE;
-    rocket.owner            = self;
-    rocket.realowner        = self.owner;
-    rocket.touch            = racer_rocket_explode;
-    rocket.bot_dodge        = TRUE;
-    rocket.bot_dodgerating  = autocvar_g_vehicle_racer_rocket_damage;
-    rocket.cnt              = time + 9;
-    rocket.velocity         = v_forward * autocvar_g_vehicle_racer_rocket_speed;
+    rocket.nextthink        = time;
+    rocket.enemy            = trg;
+    rocket.cnt              = time + 15;
 
     if(trg)
         rocket.think            = racer_rocket_tracker;
     else
         rocket.think            = racer_rocket_groundhugger;
-
-    rocket.nextthink        = time;
-    rocket.enemy            = trg;
-
-    CSQCProjectile(rocket, TRUE, PROJECTILE_WAKIROCKET, TRUE);
 }
 
 float racer_frame()
@@ -417,9 +369,9 @@ float racer_frame()
 
     if(player.BUTTON_ATCK)
     if(time > racer.attack_finished_single)
-    if(racer.vehicle_energy >= autocvar_g_vehicle_racer_laser_cost)
+    if(racer.vehicle_energy >= autocvar_g_vehicle_racer_cannon_cost)
     {
-        racer.vehicle_energy -= autocvar_g_vehicle_racer_laser_cost;
+        racer.vehicle_energy -= autocvar_g_vehicle_racer_cannon_cost;
         racer.wait = time;
 
         crosshair_trace(player);
@@ -433,7 +385,7 @@ float racer_frame()
             racer_fire_cannon("tag_fire2");
             racer.cnt = 1;
         }
-        racer.attack_finished_single = time + autocvar_g_vehicle_racer_laser_refire;
+        racer.attack_finished_single = time + autocvar_g_vehicle_racer_cannon_refire;
         self.owner.vehicle_energy = racer.vehicle_energy / autocvar_g_vehicle_racer_energy;
     }
 
@@ -682,7 +634,6 @@ void spawnfunc_vehicle_racer()
     precache_model ("models/vehicles/wakizashi.dpm");
     precache_model ("models/vehicles/wakizashi_cockpit.dpm");
 
-
     vehicles_configcheck("vehicle_racer.cfg", autocvar_g_vehicle_racer_health);
     if(autocvar_g_vehicle_racer_energy)
         if(autocvar_g_vehicle_racer_energy_regen)
index f002b45e4dbf3a7f2af2bba09f394e5e52c924bf..1ba6efbd272055745c62752ccffba91801dd3ec6 100644 (file)
@@ -42,7 +42,7 @@ float autocvar_g_vehicle_raptor_cannon_radius;
 float autocvar_g_vehicle_raptor_cannon_refire;
 float autocvar_g_vehicle_raptor_cannon_speed;
 float autocvar_g_vehicle_raptor_cannon_spread;
-
+float autocvar_g_vehicle_raptor_cannon_force;
 
 float autocvar_g_vehicle_raptor_energy;
 float autocvar_g_vehicle_raptor_energy_regen;
@@ -175,40 +175,16 @@ void raptor_bombdrop()
 
 }
 
-void raptor_bolt_explode()
-{
-       PROJECTILE_TOUCH;
-    pointparticles(particleeffectnum("raptor_cannon_impact"), findbetterlocation (self.origin, 8), trace_plane_normal * 1000, 1);
-    RadiusDamage (self, self.realowner, autocvar_g_vehicle_raptor_cannon_damage, 0, autocvar_g_vehicle_raptor_cannon_radius, world, 25, DEATH_WAKIGUN, world);
-    sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
-    remove (self);
-}
 
 void raptor_fire_cannon(entity gun, string tagname)
 {
     entity bolt;
-
-    bolt = spawn();
-
-    PROJECTILE_MAKETRIGGER(bolt);
-    sound (gun, CHAN_WEAPON, "weapons/lasergun_fire.wav", VOL_BASE, ATTN_NORM);
-    setorigin(bolt, gettaginfo(gun, gettagindex(gun, tagname)));
-
-    bolt.movetype        = MOVETYPE_FLYMISSILE;
-    bolt.flags           = FL_PROJECTILE | FL_NOTARGET;
-    bolt.owner           = self;
-    bolt.realowner       = self.owner;
-    bolt.touch           = raptor_bolt_explode;
-    bolt.think           = raptor_bolt_explode;
-    bolt.nextthink       = time + 9;
-    bolt.bot_dodge       = TRUE;
-    bolt.bot_dodgerating = autocvar_g_vehicle_raptor_cannon_damage;
-    bolt.velocity        = normalize(v_forward + randomvec() * autocvar_g_vehicle_raptor_cannon_spread) * autocvar_g_vehicle_raptor_cannon_speed;
-
-    pointparticles(particleeffectnum("raptor_cannon_muzzleflash"), bolt.origin, bolt.velocity, 1);
-    //pointparticles(particleeffectnum("spiderbot_minigun_muzzleflash"), bolt.origin, bolt.velocity, 1);
-
-    CSQCProjectile(bolt, TRUE, PROJECTILE_RAPTORCANNON, TRUE);
+    vector b_org;
+    b_org = gettaginfo(gun, gettagindex(gun, tagname));
+    bolt = vehicles_projectile("raptor_cannon_impact", "weapons/laserimpact.wav", "raptor_cannon_muzzleflash", "weapons/lasergun_fire.wav",
+                           b_org, normalize(v_forward + randomvec() * autocvar_g_vehicle_raptor_cannon_spread) * autocvar_g_vehicle_raptor_cannon_speed,
+                           autocvar_g_vehicle_raptor_cannon_damage, autocvar_g_vehicle_raptor_cannon_radius, autocvar_g_vehicle_raptor_cannon_force,  0,
+                           DEATH_WAKIGUN, PROJECTILE_RAPTORCANNON, 0);
 }
 
 void raptor_think()
@@ -281,8 +257,6 @@ void raptor_exit(float eject)
 float raptor_takeoff()
 {
     entity player, raptor;
-    float ftmp, ftmp2;
-    vector df;
 
     player = self;
     raptor = self.vehicle;
@@ -650,7 +624,6 @@ void raptor_dinit()
         remove(self);
         return;
     }
-    setorigin(self, self.origin + '0 0 50');
     //FIXME: Camera is in a bad place in HUD model.
     setorigin(self.vehicle_viewport, '25 0 5');
 
index 79d2504d15ef3dfa4e30210951b4dcc37f35e558..811ceb8721fbca74e0bf211a9780799cdd8df21f 100644 (file)
@@ -57,57 +57,12 @@ void spiderbot_exit(float eject);
 void spiderbot_enter();
 void spiderbot_spawn();
 
-void spiderbot_rocket_explode()
-{
-    vector org2;
-
-    if(self.event_damage != SUB_Null)
-    {
-        self.event_damage = SUB_Null;
-        self.think = spiderbot_rocket_explode;
-        self.nextthink = time;
-        return;
-    }
-
-    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-    org2 = findbetterlocation (self.origin, 16);
-    pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
-    w_deathtypestring = "dident escape the rocket barrage";
-
-    if(!self.owner)
-        self.owner = self.realowner;
-
-    RadiusDamage (self, self.owner,
-        autocvar_g_vehicle_spiderbot_rocket_damage,
-        autocvar_g_vehicle_spiderbot_rocket_edgedamage,
-        autocvar_g_vehicle_spiderbot_rocket_radius, world,
-        autocvar_g_vehicle_spiderbot_rocket_force, DEATH_SBROCKET, world);
-
-    remove (self);
-}
-
-void spiderbot_rocket_touch()
-{
-    if(self.owner)
-    {
-        if(other == self.owner.vehicle)
-            return;
-
-        if(other == self.owner.vehicle.tur_head)
-            return;
-    }
-
-    PROJECTILE_TOUCH;
-    spiderbot_rocket_explode();
-}
-
 void spiderbot_rocket_unguided()
 {
     vector newdir, olddir;
 
     self.nextthink  = time;
 
-
     olddir = normalize(self.velocity);
     newdir = normalize(self.pos1 - self.origin) + randomvec() * autocvar_g_vehicle_spiderbot_rocket_noise;
     self.velocity = normalize(olddir + newdir * autocvar_g_vehicle_spiderbot_rocket_turnrate) * autocvar_g_vehicle_spiderbot_rocket_speed;
@@ -115,8 +70,7 @@ void spiderbot_rocket_unguided()
     UpdateCSQCProjectile(self);
 
     if (self.owner.deadflag != DEAD_NO || self.cnt < time)
-        spiderbot_rocket_explode();
-
+        self.use();
 }
 
 void spiderbot_rocket_guided()
@@ -125,10 +79,10 @@ void spiderbot_rocket_guided()
 
     self.nextthink  = time;
 
-    if not (self.owner.vehicle)
+    if not (self.realowner.vehicle)
         self.think = spiderbot_rocket_unguided;
 
-    crosshair_trace(self.owner);
+    crosshair_trace(self.realowner);
     olddir = normalize(self.velocity);
     newdir = normalize(trace_endpos - self.origin) + randomvec() * autocvar_g_vehicle_spiderbot_rocket_noise;
     self.velocity = normalize(olddir + newdir * autocvar_g_vehicle_spiderbot_rocket_turnrate) * autocvar_g_vehicle_spiderbot_rocket_speed;
@@ -136,21 +90,13 @@ void spiderbot_rocket_guided()
     UpdateCSQCProjectile(self);
 
     if (self.owner.deadflag != DEAD_NO || self.cnt < time)
-        spiderbot_rocket_explode();
-}
-
-void spiderbot_rocket_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
-{
-    self.health -= damage;
-    self.velocity += force;
-    if(self.health < 1)
-        spiderbot_rocket_explode();
+        self.use();
 }
 
 void spiderbot_guide_release()
 {
     entity rkt;
-    rkt = findchainentity(owner,self.owner);
+    rkt = findchainentity(realowner, self.owner);
     if not (rkt)
         return;
 
@@ -168,6 +114,8 @@ void spiderbot_guide_release()
 
 void spiderbot_rocket_do()
 {
+
+    vector v;
     entity rocket;
 
     if (self.owner.BUTTON_ATCK2)
@@ -199,33 +147,21 @@ void spiderbot_rocket_do()
     if not (self.owner.BUTTON_ATCK2)
         return;
 
-    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 = autocvar_g_vehicle_spiderbot_rocket_damage;
-    rocket.cnt             = time + autocvar_g_vehicle_spiderbot_rocket_lifetime;
-    rocket.health          = autocvar_g_vehicle_spiderbot_rocket_health;
-    rocket.takedamage      = DAMAGE_AIM;
-    rocket.event_damage    = spiderbot_rocket_damage;
-    rocket.owner           = self.owner;
-    rocket.nextthink       = time;
-    rocket.movetype        = MOVETYPE_FLYMISSILE;
-    rocket.velocity        = normalize(v_forward + (v_up * 0.5) + randomvec() * 0.25) * autocvar_g_vehicle_spiderbot_rocket_speed;
-    rocket.angles          = vectoangles(rocket.velocity);
-    rocket.think           = spiderbot_rocket_guided;
-    rocket.touch           = spiderbot_rocket_touch;
-    rocket.flags           = FL_PROJECTILE;
-    rocket.solid           = SOLID_TRIGGER;
-    rocket.pos1            = trace_endpos;
-
-       CSQCProjectile(rocket, FALSE, PROJECTILE_SPIDERROCKET, FALSE); // no culling, has fly sound
+    v = gettaginfo(self.tur_head,gettagindex(self.tur_head,"tag_fire"));
+    rocket = vehicles_projectile("rocket_explode", "weapons/rocket_impact.wav", "", "weapons/rocket_fire.wav",
+                           v, normalize(v_forward + (v_up * 0.5) + randomvec() * 0.25) * autocvar_g_vehicle_spiderbot_rocket_speed,
+                           autocvar_g_vehicle_spiderbot_rocket_damage, autocvar_g_vehicle_spiderbot_rocket_radius, autocvar_g_vehicle_spiderbot_rocket_force, 1,
+                           DEATH_SBROCKET, PROJECTILE_SPIDERROCKET, autocvar_g_vehicle_spiderbot_rocket_health);
+
+    rocket.cnt        = time + 15;
+    rocket.classname  = "spiderbot_rocket";
+    rocket.pos1       = trace_endpos;
+    rocket.think      = spiderbot_rocket_guided;
+    rocket.nextthink  = time;
+    rocket.cnt        = time + autocvar_g_vehicle_spiderbot_rocket_lifetime;
+    te_explosion (rocket.origin);
 
     self.tur_head.frame += 1;
     if (self.tur_head.frame == 9)
@@ -234,6 +170,8 @@ void spiderbot_rocket_do()
         self.attack_finished_single = autocvar_g_vehicle_spiderbot_rocket_refire;
 
     self.gun2.cnt = time + self.attack_finished_single;
+
+
 }
 
 void spiderbot_minigun_fire(entity gun, float trail)
@@ -666,6 +604,10 @@ void spiderbot_blowup()
     setmodel(g2, "models/vehicles/spiderbot_barrels.dpm");
 
     setorigin(b, self.origin);
+    b.frame         = 11;
+    b.angles        = self.angles;
+    setsize(b, self.mins, self.maxs);
+
     setorigin(h, gettaginfo(self, gettagindex(self, "tag_head")));
     h.movetype      = MOVETYPE_BOUNCE;
     h.solid         = SOLID_BBOX;
@@ -692,11 +634,10 @@ void spiderbot_blowup()
     g2.solid        = SOLID_CORPSE;
     g2.velocity     = v_forward * 700 + (randomvec() * 32);
     g2.avelocity    = randomvec() * 180;
-    b.frame         = 5;
 
     h.colormod = b.colormod = g1.colormod = g2.colormod = '-2 -2 -2';
 
-    SUB_SetFade(b,  time, min(autocvar_g_vehicle_spiderbot_respawntime, 10));
+    SUB_SetFade(b,  time + 5, min(autocvar_g_vehicle_spiderbot_respawntime, 1));
     //SUB_SetFade(h,  time, min(autocvar_g_vehicle_spiderbot_respawntime, 10));
     SUB_SetFade(g1, time, min(autocvar_g_vehicle_spiderbot_respawntime, 10));
     SUB_SetFade(g2, time, min(autocvar_g_vehicle_spiderbot_respawntime, 10));
@@ -725,12 +666,14 @@ void spiderbot_die()
     self.event_damage   = SUB_Null;
     self.takedamage     = DAMAGE_NO;
     self.touch          = SUB_Null;
-    self.nextthink      = 1 + time + random() * 2;
+    self.nextthink      = 3.4 + time + random() * 2;
     self.think          = spiderbot_blowup;
     self.deadflag       = DEAD_DYING;
        self.frame          = 5;
        self.tur_head.effects        |= EF_FLAME;
        self.colormod = self.tur_head.colormod = '-1 -1 -1';
+       self.frame = 10;
+       self.movetype = MOVETYPE_TOSS;
 
 }
 
index aa221f08a64bef2dfe126f724caf8daa17d54f78..dbfb9f056a57c25f2fb058fcef1ab5be38b7f660 100644 (file)
@@ -178,7 +178,94 @@ vector vehicles_force_fromtag_maglev(string tag_name, float spring_length, float
     return v_forward  * force_fromtag_power;
 }
 
+void vehicles_projectile_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+    self.health -= damage;
+    self.velocity += force;
+    if(self.health < 1)
+    {
+        self.takedamage = DAMAGE_NO;
+        self.event_damage = SUB_Null;
+        self.think = self.use;
+        self.nextthink = time;
+    }
+
+}
+
+void vehicles_projectile_explode()
+{
+    if(self.owner && other != world)
+    {
+        if(other == self.owner.vehicle)
+            return;
+
+        if(other == self.owner.vehicle.tur_head)
+            return;
+    }
+
+       PROJECTILE_TOUCH;
+
+       self.event_damage = SUB_Null;
+    sound (self, CHAN_PROJECTILE, self.target2, VOL_BASE, ATTN_NORM);
+    pointparticles(particleeffectnum(self.target3), findbetterlocation (self.origin, 16), '0 0 0', 1);
+    RadiusDamage (self, self.realowner, self.shot_dmg, 0, self.shot_radius, self, self.shot_force, self.totalfrags, other);
 
+    remove (self);
+}
+
+entity vehicles_projectile(string _impactfx, string _impactsnd, string _mzlfx, string _mzlsound,
+                           vector _org, vector _vel,
+                           float _dmg, float _radi, float _force,  float _size,
+                           float _deahtype, float _projtype, float _health)
+{
+    entity proj;
+
+    proj = spawn();
+
+    PROJECTILE_MAKETRIGGER(proj);
+    setorigin(proj, _org);
+
+    proj.shot_dmg         = _dmg;
+    proj.shot_radius      = _radi;
+    proj.shot_force       = _force;
+    proj.totalfrags       = _deahtype;
+    proj.target2          = _impactsnd;
+    proj.target3          = _impactfx;
+    proj.solid            = SOLID_BBOX;
+    proj.movetype         = MOVETYPE_FLYMISSILE;
+    proj.flags            = FL_PROJECTILE;
+    proj.bot_dodge        = TRUE;
+    proj.bot_dodgerating  = _dmg;
+    proj.velocity         = _vel;
+    proj.touch            = vehicles_projectile_explode;
+    proj.use              = vehicles_projectile_explode;
+    proj.owner            = self;
+    proj.realowner        = self.owner;
+    proj.think            = SUB_Remove;
+    proj.nextthink        = time + 30;
+
+    if(_health)
+    {
+        proj.takedamage       = DAMAGE_AIM;
+        proj.event_damage     = vehicles_projectile_damage;
+        proj.health           = _health;
+    }
+    else
+        proj.flags           = FL_PROJECTILE | FL_NOTARGET;
+
+    if(_mzlsound)
+        sound (self, CHAN_WEAPON, _mzlsound, VOL_BASE, ATTN_NORM);
+
+    if(_mzlfx)
+        pointparticles(particleeffectnum(_mzlfx), proj.origin, proj.velocity, 1);
+
+
+    setsize (proj, '-1 -1 -1' * _size, '1 1 1' * _size);
+
+    CSQCProjectile(proj, TRUE, _projtype, TRUE);
+
+    return proj;
+}
 
 void vehicles_spawn()
 {
@@ -372,6 +459,7 @@ void vehicles_exit(float eject)
         self.owner.event_damage   = PlayerDamage;
         self.owner.hud            = HUD_NORMAL;
         self.owner.switchweapon   = self.switchweapon;
+        self.owner.BUTTON_USE     = 0;
     }
 
     if(self.deadflag == DEAD_NO)
diff --git a/scripts/vehicles.shader b/scripts/vehicles.shader
new file mode 100644 (file)
index 0000000..b8f0b0c
--- /dev/null
@@ -0,0 +1,16 @@
+spiderbot
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map textures/spiderbot.tga
+               rgbgen lightingDiffuse
+       }
+}
+wakazachi
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map textures/wakazachi.tga
+               rgbgen lightingDiffuse
+       }
+}
\ No newline at end of file
diff --git a/textures/spiderbot_reflect.tga b/textures/spiderbot_reflect.tga
new file mode 100644 (file)
index 0000000..a2a4a04
Binary files /dev/null and b/textures/spiderbot_reflect.tga differ
diff --git a/textures/wakazachi_gloss.jpg b/textures/wakazachi_gloss.jpg
new file mode 100644 (file)
index 0000000..2c7878c
Binary files /dev/null and b/textures/wakazachi_gloss.jpg differ
diff --git a/textures/wakazachi_glow.tga b/textures/wakazachi_glow.tga
new file mode 100644 (file)
index 0000000..89e4813
Binary files /dev/null and b/textures/wakazachi_glow.tga differ
diff --git a/textures/wakazachi_reflect.tga b/textures/wakazachi_reflect.tga
new file mode 100644 (file)
index 0000000..cb88c1a
Binary files /dev/null and b/textures/wakazachi_reflect.tga differ
index 63d7a78bc8319998c8d63501f3a610a56b7b2d58..cb6032f803bd6b7983cbf3b7bb372cc8c166cd34 100644 (file)
@@ -33,19 +33,23 @@ set g_vehicle_racer_pitchspeed         100
 set g_vehicle_racer_maxpitch           25
 set g_vehicle_racer_turnroll           32
 
-set g_vehicle_racer_laser_speed        9000
-set g_vehicle_racer_laser_damage       20
-set g_vehicle_racer_laser_radius       100
-set g_vehicle_racer_laser_refire       0.1
-set g_vehicle_racer_laser_cost         2
+set g_vehicle_racer_cannon_speed        9000
+set g_vehicle_racer_cannon_damage       20
+set g_vehicle_racer_cannon_radius       100
+set g_vehicle_racer_cannon_refire       0.1
+set g_vehicle_racer_cannon_cost         2
+set g_vehicle_racer_cannon_spread       0.0125
+set g_vehicle_racer_cannon_force        50
 
 set g_vehicle_racer_rocket_speed       1000
 set g_vehicle_racer_rocket_accel       1300
 set g_vehicle_racer_rocket_turnrate    0.14
 set g_vehicle_racer_rocket_damage      150
+set g_vehicle_racer_rocket_force       350
 set g_vehicle_racer_rocket_radius      100
 set g_vehicle_racer_rocket_refire      5
 set g_vehicle_racer_rocket_cost        0
+
 set g_vehicle_racer_rocket_locktarget           1
 set g_vehicle_racer_rocket_locking_time         0.45
 set g_vehicle_racer_rocket_locking_releasetime  1.2
index b74915a244158a6119bd470064fe1e8f6376d99a..164f2bbeff8bf6122347ccccaeb9de55346e2b8f 100644 (file)
@@ -44,6 +44,7 @@ set g_vehicle_raptor_cannon_radius   60
 set g_vehicle_raptor_cannon_refire   0.05
 set g_vehicle_raptor_cannon_speed    12000
 set g_vehicle_raptor_cannon_spread   0.01
+set g_vehicle_raptor_cannon_force    50
 
 set g_vehicle_raptor_energy             20
 set g_vehicle_raptor_energy_regen       10