float t;
t = 1.0 / g_weaponratefactor;
+ weapon_rate = t;
+ MUTATOR_CALLHOOK(WeaponRateFactor);
+ t = weapon_rate;
+
return t;
}
for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.owner == self)
return FALSE;
+ if(self.weapon == WEP_SHOTGUN)
+ if(!secondary && WEP_CVAR(shotgun, secondary) == 1)
+ return FALSE; // no clicking, just allow
+
if(self.weapon == self.switchweapon && time - self.prevdryfire > 1) // only play once BEFORE starting to switch weapons
{
sound (self, CH_WEAPON_A, "weapons/dryfire.wav", VOL_BASE, ATTEN_NORM);
return 1;
if(self.player_blocked)
return 1;
- if(self.freezetag_frozen)
+ if(self.frozen)
+ return 1;
+ if(self.weapon_blocked)
return 1;
return 0;
}
self.switchingweapon = self.switchweapon;
entity newwep = get_weaponinfo(self.switchweapon);
- //self.items &= ~IT_AMMO;
- //self.items = self.items | (newwep.items & IT_AMMO);
-
// the two weapon entities will notice this has changed and update their models
self.weapon = self.switchweapon;
self.weaponname = newwep.mdl;
- self.bulletcounter = 0; // WEAPONTODO
+ self.bulletcounter = 0;
//self.ammo_field = newwep.ammo_field;
WEP_ACTION(self.switchweapon, WR_SETUP);
self.weaponentity.state = WS_RAISE;
else
self.clip_load = self.clip_size = 0;
- // VorteX: add player model weapon select frame here
- // setcustomframe(PlayerWeaponRaise);
weapon_thinkf(WFRAME_IDLE, newwep.switchdelay_raise, w_ready);
- //print(sprintf("W_WeaponFrame(): cvar: %s, value: %f\n", sprintf("g_balance_%s_switchdelay_raise", newwep.netname), cvar(sprintf("g_balance_%s_switchdelay_raise", newwep.netname))));
}
else if (self.weaponentity.state == WS_DROP)
{
{
// start switching!
self.switchingweapon = self.switchweapon;
-
entity oldwep = get_weaponinfo(self.weapon);
-
-#ifndef INDEPENDENT_ATTACK_FINISHED
+
+ // set up weapon switch think in the future, and start drop anim
+ #ifndef INDEPENDENT_ATTACK_FINISHED
if(ATTACK_FINISHED(self) <= time + self.weapon_frametime * 0.5)
{
-#endif
- sound (self, CH_WEAPON_SINGLE, "weapons/weapon_switch.wav", VOL_BASE, ATTN_NORM);
- self.weaponentity.state = WS_DROP;
- // set up weapon switch think in the future, and start drop anim
- weapon_thinkf(WFRAME_DONTCHANGE, oldwep.switchdelay_drop, w_clear);
- //print(sprintf("W_WeaponFrame(): cvar: %s, value: %f\n", sprintf("g_balance_%s_switchdelay_drop", oldwep.netname), cvar(sprintf("g_balance_%s_switchdelay_drop", oldwep.netname))));
-#ifndef INDEPENDENT_ATTACK_FINISHED
+ #endif
+ sound(self, CH_WEAPON_SINGLE, "weapons/weapon_switch.wav", VOL_BASE, ATTN_NORM);
+ self.weaponentity.state = WS_DROP;
+ weapon_thinkf(WFRAME_DONTCHANGE, oldwep.switchdelay_drop, w_clear);
+ #ifndef INDEPENDENT_ATTACK_FINISHED
}
-#endif
+ #endif
}
}
{
entity wep = get_weaponinfo(self.weapon);
+ if(cvar("g_overkill"))
+ if(self.ok_use_ammocharge)
+ {
+ ok_DecreaseCharge(self, self.weapon);
+ return; // TODO
+ }
+
if((self.items & IT_UNLIMITED_WEAPON_AMMO) && !wep.reloading_ammo)
return;
self.clip_load -= ammo_use;
self.(weapon_load[self.weapon]) = self.clip_load;
}
- else
+ else if(wep.ammo_field != ammo_none)
+ {
self.(wep.ammo_field) -= ammo_use;
+ if(self.(wep.ammo_field) < 0)
+ {
+ backtrace(sprintf(
+ "W_DecreaseAmmo(%.2f): '%s' subtracted too much %s from '%s', resulting with '%.2f' left... "
+ "Please notify Samual immediately with a copy of this backtrace!\n",
+ ammo_use,
+ wep.netname,
+ GetAmmoPicture(wep.ammo_field),
+ self.netname,
+ self.(wep.ammo_field)
+ ));
+ }
+ }
}
// weapon reloading code
entity e;
e = get_weaponinfo(self.weapon);
+ if(cvar("g_overkill"))
+ if(self.ok_use_ammocharge)
+ return; // TODO
+
self.reload_ammo_min = sent_ammo_min;
self.reload_ammo_amount = e.reloading_ammo;;
self.reload_time = e.reloading_time;
self.old_clip_load = self.clip_load;
self.clip_load = self.(weapon_load[self.weapon]) = -1;
}
+
+entity weapon_dropevent_item;
+void W_DropEvent(float event, entity player, float weapon_type, entity weapon_item)
+{
+ entity oldself = self;
+ self = player;
+ weapon_dropevent_item = weapon_item;
+ WEP_ACTION(weapon_type, event);
+ self = oldself;
+}