return (get_weaponinfo(wpn)).weapon_func(wrequest);
}
-string W_Name(float weaponid)
-{
- return (get_weaponinfo(weaponid)).message;
-}
-
-float W_WeaponBit(float wpn)
-{
- return (get_weaponinfo(wpn)).weapons;
-}
-
-float W_AmmoItemCode(float wpn)
-{
- return (get_weaponinfo(wpn)).items & IT_AMMO;
-}
-
.float savenextthink;
void thrown_wep_think()
{
SUB_VanishOrRemove(self);
}
-void thrown_wep_ode_think()
-{
- self.nextthink = time;
- self.alpha = self.owner.alpha; // apply fading of the original weapon
- if(!self.owner.modelindex)
- remove(self); // the real weapon is gone, remove this
-}
-
// returns amount of ammo used as string, or -1 for failure, or 0 for no ammo count
string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vector velo)
{
wep.flags |= FL_TOSSED;
wep.colormap = own.colormap;
- if(W_WeaponBit(wpn) & WEPBIT_SUPERWEAPONS)
+ if(WEPSET_CONTAINS_AW(WEPBIT_SUPERWEAPONS, wpn))
{
if(own.items & IT_UNLIMITED_SUPERWEAPONS)
{
{
float superweapons = 1;
for(i = WEP_FIRST; i <= WEP_LAST; ++i)
- if(own.weapons & WEPBIT_SUPERWEAPONS & W_WeaponBit(i))
- ++superweapons;
+ if(WEPSET_CONTAINS_AW(WEPBIT_SUPERWEAPONS, i))
+ if(WEPSET_CONTAINS_EW(own, i))
+ ++superweapons;
if(superweapons <= 1)
{
wep.superweapons_finished = own.superweapons_finished;
wep.nextthink = min(wep.nextthink, time + 0.5);
wep.pickup_anyway = TRUE; // these are ALWAYS pickable
- // make the dropped weapon physical
- if(autocvar_physics_ode && autocvar_physics_ode_droppedweapon)
- {
- entity wep2;
- wep2 = spawn();
- setorigin(wep2, wep.origin);
- setmodel(wep2, wep.model);
- wep2.angles = wep.angles;
- wep2.velocity = velo;
- wep2.avelocity_x = random() * autocvar_physics_ode_droppedweapon_avelocity;
- wep2.avelocity_y = random() * autocvar_physics_ode_droppedweapon_avelocity;
- wep2.avelocity_z = random() * autocvar_physics_ode_droppedweapon_avelocity;
-
- wep2.classname = "droppedweapon2";
- wep2.owner = wep;
- wep2.solid = SOLID_BBOX;
- wep2.movetype = MOVETYPE_PHYSICS;
- wep2.takedamage = DAMAGE_AIM;
- wep2.colormap = wep.colormap;
- wep2.glowmod = wep.glowmod;
- wep2.damageforcescale = autocvar_physics_ode_droppedweapon_damageforcescale;
- wep2.effects |= EF_NOMODELFLAGS; // disable the spinning
-
- wep2.think = thrown_wep_ode_think;
- wep2.nextthink = time;
-
- wep.model = "null"; // don't use setmodel, we want to keep the size
- wep.movetype = MOVETYPE_FOLLOW;
- wep.aiment = wep2;
- }
-
return s;
}
}
float W_IsWeaponThrowable(float w)
{
- float wb, wa;
+ float wa;
if (!autocvar_g_pickup_items)
return 0;
if (g_weaponarena)
return 0;
- if (g_lms)
- return 0;
- if (g_ca)
- return 0;
if (g_cts)
return 0;
if (g_nexball && w == WEP_GRENADE_LAUNCHER)
return 0;
-
- wb = W_WeaponBit(w);
- if(!wb)
- return 0;
+ if(w == 0)
+ return 0;
+
wa = W_AmmoItemCode(w);
- if(start_weapons & wb)
+ if(WEPSET_CONTAINS_AW(start_weapons, w))
{
// start weapons that take no ammo can't be dropped (this prevents dropping the laser, as long as it continues to use no ammo)
if(start_items & IT_UNLIMITED_WEAPON_AMMO)
// toss current weapon
void W_ThrowWeapon(vector velo, vector delta, float doreduce)
{
- float w, wb;
+ float w;
string a;
w = self.weapon;
if(!W_IsWeaponThrowable(w))
return;
- wb = W_WeaponBit(w);
- if(self.weapons & wb != wb)
+ if(!WEPSET_CONTAINS_EW(self, w))
return;
+ WEPSET_ANDNOT_EW(self, w);
- self.weapons &~= wb;
W_SwitchWeapon_Force(self, w_getbestweapon(self));
a = W_ThrowNewWeapon(self, w, doreduce, self.origin + delta, velo);
- if not(a)
- return;
- if(a == "")
- sprint(self, strcat("You dropped the ^2", W_Name(w), "\n"));
- else
- sprint(self, strcat("You dropped the ^2", W_Name(w), " with ", a, "\n"));
+
+ if not(a) return;
+ Send_Notification(NOTIF_ONE, self, MSG_MULTI, ITEM_WEAPON_DROP, a, w);
+}
+
+float forbidWeaponUse()
+{
+ if(time < game_starttime && !autocvar_sv_ready_restart_after_countdown)
+ return 1;
+ if(round_handler_IsActive() && !round_handler_IsRoundStarted())
+ return 1;
+ if(self.player_blocked)
+ return 1;
+ if(self.freezetag_frozen)
+ return 1;
+ return 0;
}
-// Bringed back weapon frame
void W_WeaponFrame()
{
vector fo, ri, up;
if (frametime)
self.weapon_frametime = frametime;
- if(((arena_roundbased || g_ca || g_freezetag) && time < warmup) || ((time < game_starttime) && !autocvar_sv_ready_restart_after_countdown))
- return;
-
- if(self.freezetag_frozen == 1)
- return;
-
if (!self.weaponentity || self.health < 1)
return; // Dead player can't use weapons and injure impulse commands
+ if(forbidWeaponUse())
+ if(self.weaponentity.state != WS_CLEAR)
+ {
+ w_ready();
+ return;
+ }
+
if(!self.switchweapon)
{
self.weapon = 0;
//if (self.button0)
// print(ftos(frametime), " ", ftos(time), " >= ", ftos(ATTACK_FINISHED(self)), " >= ", ftos(self.weapon_nextthink), "\n");
- float wb;
- wb = W_WeaponBit(self.weapon);
+ float w;
+ w = self.weapon;
// call the think code which may fire the weapon
// and do so multiple times to resolve framerate dependency issues if the
while (c < W_TICSPERFRAME)
{
c = c + 1;
- if(wb && ((self.weapons & wb) == 0))
+ if(w && !WEPSET_CONTAINS_EW(self, w))
{
if(self.weapon == self.switchweapon)
W_SwitchWeapon_Force(self, w_getbestweapon(self));
- wb = 0;
+ w = 0;
}
v_forward = fo;
v_right = ri;
v_up = up;
- if(wb)
+ if(w)
weapon_action(self.weapon, WR_THINK);
else
weapon_action(self.weapon, WR_GONETHINK);
self.currentammo = 1;
#endif
}
+
+string W_Apply_Weaponreplace(string in)
+{
+ float n = tokenize_console(in);
+ string out = "";
+ float i;
+ for(i = 0; i < n; ++i)
+ {
+ string s = argv(i);
+ string r = cvar_string(strcat("g_weaponreplace_", s));
+ if(r == "")
+ out = strcat(out, " ", s);
+ else if(r != "0")
+ out = strcat(out, " ", r);
+ }
+ return substring(out, 1, -1);
+}