// this function calculates w_shotorg and w_shotdir based on the weapon model
// offset, trueaim and antilag, and won't put w_shotorg inside a wall.
// make sure you call makevectors first (FIXME?)
+.float prevstrengthsound;
+.float prevstrengthsoundattempt;
void W_SetupShot_Dir_ProjectileSize_Range(entity ent, vector s_forward, vector mi, vector ma, float antilag, float recoil, string snd, float maxdamage, float range)
{
float nudge = 1; // added to traceline target and subtracted from result
sound (ent, CHAN_WEAPON, snd, VOL_BASE, ATTN_NORM);
}
- if (ent.items & IT_STRENGTH)
- if (!g_minstagib)
- sound (ent, CHAN_AUTO, "weapons/strength_fire.wav", VOL_BASE, ATTN_NORM);
+ if(ent.items & IT_STRENGTH)
+ if(!g_minstagib)
+ if(
+ (time > ent.prevstrengthsound + cvar("sv_strengthsound_antispam_time"))
+ ||
+ (time > ent.prevstrengthsoundattempt + cvar("sv_strengthsound_antispam_refire_threshold"))
+ ) // prevent insane sound spam
+ {
+ sound(ent, CHAN_AUTO, "weapons/strength_fire.wav", VOL_BASE, ATTN_NORM);
+ ent.prevstrengthsound = time;
+ }
+ ent.prevstrengthsoundattempt = time;
// nudge w_shotend so a trace to w_shotend hits
w_shotend = w_shotend + normalize(w_shotend - w_shotorg) * nudge;
#define W_SetupShot(ent,antilag,recoil,snd,maxdamage) W_SetupShot_ProjectileSize(ent, '0 0 0', '0 0 0', antilag, recoil, snd, maxdamage)
#define W_SetupShot_Range(ent,antilag,recoil,snd,maxdamage,range) W_SetupShot_Dir_ProjectileSize_Range(ent, v_forward, '0 0 0', '0 0 0', antilag, recoil, snd, maxdamage, range)
-void LaserTarget_Think()
-{
- entity e;
- vector offset;
- float uselaser;
- uselaser = 0;
-
- // list of weapons that will use the laser, and the options that enable it
- if(self.owner.laser_on && self.owner.weapon == WEP_ROCKET_LAUNCHER && g_laserguided_missile)
- uselaser = 1;
- // example
- //if(self.owner.weapon == WEP_ELECTRO && cvar("g_laserguided_electro"))
- // uselaser = 1;
-
-
-
- // if a laser-enabled weapon isn't selected, delete any existing laser and quit
- if(!uselaser)
- {
- // rocket launcher isn't selected, so no laser target.
- if(self.lasertarget != world)
- {
- remove(self.lasertarget);
- self.lasertarget = world;
- }
- return;
- }
-
- if(!self.lasertarget)
- {
- // we don't have a lasertarget entity, so spawn one
- //bprint("create laser target\n");
- e = self.lasertarget = spawn();
- e.owner = self.owner; // Its owner is my owner
- e.classname = "laser_target";
- e.movetype = MOVETYPE_NOCLIP; // don't touch things
- setmodel(e, "models/laser_dot.mdl"); // what it looks like, precision set below
- e.scale = 1.25; // make it larger
- e.alpha = 0.25; // transparency
- e.colormod = '255 0 0' * (1/255) * 8; // change colors
- e.effects = EF_FULLBRIGHT | EF_LOWPRECISION;
- // make it dynamically glow
- // you should avoid over-using this, as it can slow down the player's computer.
- e.glow_color = 251; // red color
- e.glow_size = 12;
- }
- else
- e = self.lasertarget;
-
- // move the laser dot to where the player is looking
-
- makevectors(self.owner.v_angle); // set v_forward etc to the direction the player is looking
- offset = '0 0 26' + v_right*3;
- traceline(self.owner.origin + offset, self.owner.origin + offset + v_forward * MAX_SHOT_DISTANCE, FALSE, self); // trace forward until you hit something, like a player or wall
- setorigin(e, trace_endpos + v_forward*8); // move me to where the traceline ended
- if(trace_plane_normal != '0 0 0')
- e.angles = vectoangles(trace_plane_normal);
- else
- e.angles = vectoangles(v_forward);
-}
-
float CL_Weaponentity_CustomizeEntityForClient()
{
self.viewmodelforclient = self.owner;
self.owner.weapon_morph4origin = QCWEAPONANIMATION_ORIGIN(self);
}
-
- // create or update the lasertarget entity
- LaserTarget_Think();
};
void CL_ExteriorWeaponentity_Think()
for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.owner == self)
return FALSE;
+ if(self.weapon == self.switchweapon) // only play once BEFORE starting to switch weapons
+ sound (self, CHAN_AUTO, "weapons/dryfire.wav", VOL_BASE, ATTN_NORM);
+
W_SwitchToOtherWeapon(self);
return FALSE;
}