From: Jakob MG Date: Sun, 3 Apr 2011 02:39:02 +0000 (+0200) Subject: Create and use vehicles_projectile(...) to reduce code duplication. Spiderbot deaht... X-Git-Tag: xonotic-v0.5.0~199^2~11^2~89 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=4cdb193503b8a1e6c77437ca35a6824e8508eaea;p=xonotic%2Fxonotic-data.pk3dir.git Create and use vehicles_projectile(...) to reduce code duplication. Spiderbot deaht aimations. New spiderbot top & cockpit models. Aditional textures for spider and racer --- diff --git a/models/vehicles/spiderbot.dpm b/models/vehicles/spiderbot.dpm index eeb5e92e7..2b5624f03 100644 Binary files a/models/vehicles/spiderbot.dpm and b/models/vehicles/spiderbot.dpm differ diff --git a/models/vehicles/spiderbot.dpm.framegroups b/models/vehicles/spiderbot.dpm.framegroups index f9db7221e..835bd3bd1 100644 --- a/models/vehicles/spiderbot.dpm.framegroups +++ b/models/vehicles/spiderbot.dpm.framegroups @@ -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 diff --git a/models/vehicles/spiderbot_cockpit.dpm b/models/vehicles/spiderbot_cockpit.dpm index 8d64449d3..a851f3e08 100644 Binary files a/models/vehicles/spiderbot_cockpit.dpm and b/models/vehicles/spiderbot_cockpit.dpm differ diff --git a/models/vehicles/spiderbot_top.dpm b/models/vehicles/spiderbot_top.dpm index 5085e6be2..e9209ba9c 100644 Binary files a/models/vehicles/spiderbot_top.dpm and b/models/vehicles/spiderbot_top.dpm differ diff --git a/qcsrc/server/movelib.qc b/qcsrc/server/movelib.qc index 89feff9a4..34eaf31aa 100644 --- a/qcsrc/server/movelib.qc +++ b/qcsrc/server/movelib.qc @@ -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) { diff --git a/qcsrc/server/vehicles/racer.qc b/qcsrc/server/vehicles/racer.qc index 4a627fb4b..3915746b3 100644 --- a/qcsrc/server/vehicles/racer.qc +++ b/qcsrc/server/vehicles/racer.qc @@ -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) diff --git a/qcsrc/server/vehicles/raptor.qc b/qcsrc/server/vehicles/raptor.qc index f002b45e4..1ba6efbd2 100644 --- a/qcsrc/server/vehicles/raptor.qc +++ b/qcsrc/server/vehicles/raptor.qc @@ -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'); diff --git a/qcsrc/server/vehicles/spiderbot.qc b/qcsrc/server/vehicles/spiderbot.qc index 79d2504d1..811ceb872 100644 --- a/qcsrc/server/vehicles/spiderbot.qc +++ b/qcsrc/server/vehicles/spiderbot.qc @@ -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; } diff --git a/qcsrc/server/vehicles/vehicles.qc b/qcsrc/server/vehicles/vehicles.qc index aa221f08a..dbfb9f056 100644 --- a/qcsrc/server/vehicles/vehicles.qc +++ b/qcsrc/server/vehicles/vehicles.qc @@ -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 index 000000000..b8f0b0ca8 --- /dev/null +++ b/scripts/vehicles.shader @@ -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 index 000000000..a2a4a047e 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 index 000000000..2c7878cb1 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 index 000000000..89e481356 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 index 000000000..cb88c1ad7 Binary files /dev/null and b/textures/wakazachi_reflect.tga differ diff --git a/vehicle_racer.cfg b/vehicle_racer.cfg index 63d7a78bc..cb6032f80 100644 --- a/vehicle_racer.cfg +++ b/vehicle_racer.cfg @@ -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 diff --git a/vehicle_raptor.cfg b/vehicle_raptor.cfg index b74915a24..164f2bbef 100644 --- a/vehicle_raptor.cfg +++ b/vehicle_raptor.cfg @@ -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