void W_SetupShot_Dir_ProjectileSize_Range(entity ent, vector s_forward, vector mi, vector ma, float antilag, float recoil, string snd, float chan, float maxdamage, float range)
{
float nudge = 1; // added to traceline target and subtracted from result
- local float oldsolid;
+ float oldsolid;
vector vecs, dv;
oldsolid = ent.dphitcontentsmask;
if(ent.weapon == WEP_RIFLE)
vecs = ent.weaponentity.movedir;
else
vecs = '0 0 0';
- if(debug_shotorg != '0 0 0')
- vecs = debug_shotorg;
dv = v_right * -vecs_y + v_up * vecs_z;
w_shotorg = ent.origin + ent.view_ofs + dv;
// nudge w_shotend so a trace to w_shotend hits
w_shotend = w_shotend + normalize(w_shotend - w_shotorg) * nudge;
-};
+}
#define W_SetupShot_Dir_ProjectileSize(ent,s_forward,mi,ma,antilag,recoil,snd,chan,maxdamage) W_SetupShot_Dir_ProjectileSize_Range(ent, s_forward, mi, ma, antilag, recoil, snd, chan, maxdamage, MAX_SHOT_DISTANCE)
#define W_SetupShot_ProjectileSize(ent,mi,ma,antilag,recoil,snd,chan,maxdamage) W_SetupShot_Dir_ProjectileSize(ent, v_forward, mi, ma, antilag, recoil, snd, chan, maxdamage)
}
self.angles = '0 0 0';
- local float f;
+ float f;
f = 0;
if (self.state == WS_RAISE && !intermission_running)
{
f = 1;
self.angles_x = -90 * f * f;
}
-};
+}
void CL_ExteriorWeaponentity_Think()
{
}
else
setattachment(self, self.owner, "bip01 r hand");
-
- // if that didn't find a tag, hide the exterior weapon model
- if (!self.tag_index)
- self.model = "";
}
self.effects = self.owner.effects;
if(sv_pitch_min == sv_pitch_max)
self.glowmod = self.owner.weaponentity_glowmod;
self.colormap = self.owner.colormap;
-};
+
+ CSQCMODEL_AUTOUPDATE();
+}
// spawning weaponentity for client
void CL_SpawnWeaponentity()
self.exteriorweaponentity.angles = '0 0 0';
self.exteriorweaponentity.think = CL_ExteriorWeaponentity_Think;
self.exteriorweaponentity.nextthink = time;
-};
+
+ {
+ entity oldself = self;
+ self = self.exteriorweaponentity;
+ CSQCMODEL_AUTOINIT();
+ self = oldself;
+ }
+}
void Send_WeaponComplain (entity e, float wpn, string wpnname, float type)
{
float client_hasweapon(entity cl, float wpn, float andammo, float complain)
{
- local float weaponbit, f;
- local entity oldself;
+ float weaponbit, f;
+ entity oldself;
if(time < self.hasweapon_complain_spam)
complain = 0;
f = f + weapon_action(wpn, WR_CHECKAMMO2);
// always allow selecting the Mine Layer if we placed mines, so that we can detonate them
- local entity mine;
+ entity mine;
if(wpn == WEP_MINE_LAYER)
for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.owner == self)
f = 1;
play2(cl, "weapons/unavailable.wav");
}
return FALSE;
-};
+}
// Weapon subs
void w_clear()
self.weaponentity.state = WS_CLEAR;
self.weaponentity.effects = 0;
}
-};
+}
void w_ready()
{
if (self.weaponentity)
self.weaponentity.state = WS_READY;
weapon_thinkf(WFRAME_IDLE, 1000000, w_ready);
-};
+}
// Setup weapon for client (after this raise frame will be launched)
void weapon_setup(float windex)
entity e;
e = get_weaponinfo(windex);
self.items &~= IT_AMMO;
- self.items = self.items | e.items;
+ self.items = self.items | (e.items & IT_AMMO);
// the two weapon entities will notice this has changed and update their models
self.weapon = windex;
self.switchingweapon = windex; // to make sure
self.weaponname = e.mdl;
self.bulletcounter = 0;
-};
+}
// perform weapon to attack (weaponstate and attack_finished check is here)
void W_SwitchToOtherWeapon(entity pl)
if(ww)
W_SwitchWeapon_Force(pl, ww);
}
+
+string PrimaryOrSecondary(float secondary)
+{
+ if(secondary)
+ return "secondary";
+ else
+ return "primary";
+}
+
.float prevdryfire;
+.float prevwarntime;
float weapon_prepareattack_checkammo(float secondary)
{
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
if (!weapon_action(self.weapon, WR_CHECKAMMO1 + secondary))
{
// always keep the Mine Layer if we placed mines, so that we can detonate them
- local entity mine;
+ entity mine;
if(self.weapon == WEP_MINE_LAYER)
for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.owner == self)
return FALSE;
self.prevdryfire = time;
}
- W_SwitchToOtherWeapon(self);
+ if(weapon_action(self.weapon, WR_CHECKAMMO2 - secondary)) // check if the other firing mode has enough ammo
+ {
+ if(time - self.prevwarntime > 1)
+ {
+ sprint(self, strcat("^2", W_Name(self.weapon), " ", PrimaryOrSecondary(secondary), "^7 is unable to fire, but its ^2", PrimaryOrSecondary(1 - secondary), "^7 can.\n"));
+ }
+ self.prevwarntime = time;
+ }
+ else // this weapon is totally unable to fire, switch to another one
+ {
+ W_SwitchToOtherWeapon(self);
+ }
+
return FALSE;
}
return TRUE;
return FALSE;
}
- if (timeoutStatus == 2) //don't allow the player to shoot while game is paused
+ if (timeout_status == TIMEOUT_ACTIVE) //don't allow the player to shoot while game is paused
return FALSE;
// do not even think about shooting if switching
setanim(self, anim, FALSE, TRUE, TRUE);
}
}
-};
+}
void weapon_boblayer1(float spd, vector org)
{
// VorteX: haste can be added here
-};
+}
vector W_CalculateProjectileVelocity(vector pvelocity, vector mvelocity, float forceAbsolute)
{
// now begin the reloading process
- sound (self, CH_WEAPON_B, self.reload_sound, VOL_BASE, ATTN_NORM);
+ sound (self, CH_WEAPON_SINGLE, self.reload_sound, VOL_BASE, ATTN_NORM);
// do not set ATTACK_FINISHED in reload code any more. This causes annoying delays if eg: You start reloading a weapon,
// then quickly switch to another weapon and back. Reloading is canceled, but the reload delay is still there,