They Hunger: Various weapon fixes and improvements to the networking
This commit is contained in:
parent
efcbd465b2
commit
8a6cf34179
12 changed files with 930 additions and 247 deletions
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2016-2020 Marco Hladik <marco@icculus.org>
|
||||
* Copyright (c) 2016-2021 Marco Hladik <marco@icculus.org>
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
|
@ -14,49 +14,772 @@
|
|||
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
int input_sequence;
|
||||
/* all potential SendFlags bits we can possibly send */
|
||||
enumflags
|
||||
{
|
||||
PLAYER_KEEPALIVE,
|
||||
PLAYER_MODELINDEX,
|
||||
PLAYER_ORIGIN,
|
||||
PLAYER_ORIGIN_Z,
|
||||
PLAYER_ANGLES_X,
|
||||
PLAYER_ANGLES_Y,
|
||||
PLAYER_ANGLES_Z,
|
||||
PLAYER_VELOCITY,
|
||||
PLAYER_VELOCITY_Z,
|
||||
PLAYER_FLAGS,
|
||||
PLAYER_WEAPON,
|
||||
PLAYER_ITEMS,
|
||||
PLAYER_HEALTH,
|
||||
PLAYER_ARMOR,
|
||||
PLAYER_MOVETYPE,
|
||||
PLAYER_VIEWOFS,
|
||||
PLAYER_BASEFRAME,
|
||||
PLAYER_FRAME,
|
||||
PLAYER_AMMO1,
|
||||
PLAYER_AMMO2,
|
||||
PLAYER_AMMO3,
|
||||
PLAYER_UNUSED1,
|
||||
PLAYER_UNUSED2
|
||||
};
|
||||
|
||||
/* ammo 1 type updates */
|
||||
enumflags
|
||||
{
|
||||
AMMO1_GLOCK,
|
||||
AMMO1_MP5,
|
||||
AMMO1_PYTHON,
|
||||
AMMO1_SHOTGUN,
|
||||
AMMO1_CROSSBOW,
|
||||
AMMO1_RPG,
|
||||
AMMO1_SATCHEL
|
||||
};
|
||||
|
||||
/* ammo 2 type updates */
|
||||
enumflags
|
||||
{
|
||||
AMMO2_9MM,
|
||||
AMMO2_357,
|
||||
AMMO2_BUCKSHOT,
|
||||
AMMO2_BOLT,
|
||||
AMMO2_ROCKET,
|
||||
AMMO2_URANIUM,
|
||||
AMMO2_HANDGRENADE,
|
||||
AMMO2_SATCHEL,
|
||||
AMMO2_TRIPMINE,
|
||||
AMMO2_SNARK,
|
||||
AMMO2_HORNET,
|
||||
};
|
||||
|
||||
enumflags
|
||||
{
|
||||
AMMO3_M203_GRENADE,
|
||||
AMMO3_SHOTGUN_STATE,
|
||||
AMMO3_GAUSS_STATE,
|
||||
AMMO3_GAUSS_VOLUME,
|
||||
AMMO3_EGON_STATE,
|
||||
AMMO3_RPG_STATE,
|
||||
AMMO3_HANDGRENADE_STATE
|
||||
};
|
||||
|
||||
noref int input_sequence;
|
||||
class player:base_player
|
||||
{
|
||||
/* Weapon specific */
|
||||
int glock_mag;
|
||||
int glock_mag_net;
|
||||
int mp5_mag;
|
||||
int mp5_mag_net;
|
||||
int python_mag;
|
||||
int python_mag_net;
|
||||
int shotgun_mag;
|
||||
int shotgun_mag_net;
|
||||
int crossbow_mag;
|
||||
int crossbow_mag_net;
|
||||
int rpg_mag;
|
||||
int rpg_mag_net;
|
||||
int satchel_chg;
|
||||
int satchel_chg_net;
|
||||
|
||||
int ammo_9mm;
|
||||
int ammo_9mm_net;
|
||||
int ammo_357;
|
||||
int ammo_357_net;
|
||||
int ammo_buckshot;
|
||||
int ammo_buckshot_net;
|
||||
int ammo_bolt;
|
||||
int ammo_bolt_net;
|
||||
int ammo_rocket;
|
||||
int ammo_rocket_net;
|
||||
int ammo_uranium;
|
||||
int ammo_uranium_net;
|
||||
int ammo_handgrenade;
|
||||
int ammo_handgrenade_net;
|
||||
int ammo_satchel;
|
||||
int ammo_satchel_net;
|
||||
int ammo_tripmine;
|
||||
int ammo_tripmine_net;
|
||||
int ammo_snark;
|
||||
int ammo_snark_net;
|
||||
int ammo_hornet;
|
||||
int ammo_hornet_net;
|
||||
|
||||
int ammo_m203_grenade;
|
||||
int ammo_m203_grenade_net;
|
||||
int ammo_shotgun_state;
|
||||
int ammo_shotgun_state_net;
|
||||
int ammo_gauss_state;
|
||||
int ammo_gauss_state_net;
|
||||
int ammo_gauss_volume;
|
||||
int ammo_gauss_volume_net;
|
||||
int ammo_egon_state;
|
||||
int ammo_egon_state_net;
|
||||
int ammo_rpg_state;
|
||||
int ammo_rpg_state_net;
|
||||
int ammo_handgrenade_state;
|
||||
int ammo_handgrenade_state_net;
|
||||
|
||||
/* hunger */
|
||||
int sniper_mag; int sniper_mag_net;
|
||||
int chaingun_mag; int chaingun_mag_net;
|
||||
int ap9_mag; int ap9_mag_net;
|
||||
int taurus_mag; int taurus_mag_net;
|
||||
|
||||
int ammo_ap9; int ammo_ap9_net;
|
||||
int ammo_taurus; int ammo_taurus_net;
|
||||
int ammo_bolt; int ammo_bolt_net;
|
||||
int ammo_sniper; int ammo_sniper_net;
|
||||
int ammo_medkit; int ammo_medkit_net;
|
||||
int ammo_gas; int ammo_gas_net;
|
||||
int mode_silencer; int mode_silencer_net;
|
||||
|
||||
#ifdef CLIENT
|
||||
/* External model */
|
||||
entity p_model;
|
||||
int p_hand_bone;
|
||||
int p_model_bone;
|
||||
float lastweapon;
|
||||
|
||||
virtual void(void) gun_offset;
|
||||
virtual void(void) draw;
|
||||
virtual float() predraw;
|
||||
virtual void(void) postdraw;
|
||||
virtual void(float) ReceiveEntity;
|
||||
virtual void(void) PredictPreFrame;
|
||||
virtual void(void) PredictPostFrame;
|
||||
#else
|
||||
int glock_mag;
|
||||
int ap9_mag;
|
||||
int taurus_mag;
|
||||
int mp5_mag;
|
||||
int python_mag;
|
||||
int shotgun_mag;
|
||||
int crossbow_mag;
|
||||
int sniper_mag;
|
||||
int rpg_mag;
|
||||
int chaingun_mag;
|
||||
int satchel_chg;
|
||||
|
||||
int ammo_9mm;
|
||||
int ammo_357;
|
||||
int ammo_ap9;
|
||||
int ammo_taurus;
|
||||
int ammo_buckshot;
|
||||
int ammo_m203_grenade;
|
||||
int ammo_bolt;
|
||||
int ammo_sniper;
|
||||
int ammo_rocket;
|
||||
int ammo_uranium;
|
||||
int ammo_gas;
|
||||
int ammo_handgrenade;
|
||||
int ammo_satchel;
|
||||
int ammo_tripmine;
|
||||
int ammo_snark;
|
||||
int ammo_hornet;
|
||||
int ammo_medkit;
|
||||
virtual void(void) EvaluateEntity;
|
||||
virtual float(entity, float) SendEntity;
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef CLIENT
|
||||
void Weapons_AmmoUpdate(entity);
|
||||
/*
|
||||
=================
|
||||
player::ReceiveEntity
|
||||
=================
|
||||
*/
|
||||
void
|
||||
player::ReceiveEntity(float new)
|
||||
{
|
||||
float fl;
|
||||
if (new == FALSE) {
|
||||
/* Go through all the physics code between the last received frame
|
||||
* and the newest frame and keep the changes this time around instead
|
||||
* of rolling back, because we'll apply the new server-verified values
|
||||
* right after anyway. */
|
||||
/* FIXME: splitscreen */
|
||||
if (entnum == player_localentnum) {
|
||||
/* FIXME: splitscreen */
|
||||
pSeat = &g_seats[0];
|
||||
|
||||
for (int i = sequence+1; i <= servercommandframe; i++) {
|
||||
/* ...maybe the input state is too old? */
|
||||
if (!getinputstate(i)) {
|
||||
break;
|
||||
}
|
||||
input_sequence = i;
|
||||
PMove_Run();
|
||||
}
|
||||
|
||||
/* any differences in things that are read below are now
|
||||
* officially from prediction misses. */
|
||||
}
|
||||
}
|
||||
|
||||
/* seed for our prediction table */
|
||||
sequence = servercommandframe;
|
||||
|
||||
fl = readfloat();
|
||||
|
||||
/* HACK: we need to make this more reliable */
|
||||
if (fl == UPDATE_ALL) {
|
||||
/* we respawned */
|
||||
gravity = __NULL__;
|
||||
}
|
||||
|
||||
if (fl & PLAYER_MODELINDEX)
|
||||
modelindex = readshort();
|
||||
|
||||
if (fl & PLAYER_ORIGIN) {
|
||||
origin[0] = readcoord();
|
||||
origin[1] = readcoord();
|
||||
}
|
||||
|
||||
if (fl & PLAYER_ORIGIN_Z)
|
||||
origin[2] = readcoord();
|
||||
if (fl & PLAYER_ANGLES_X)
|
||||
pitch = readfloat();
|
||||
if (fl & PLAYER_ANGLES_Y)
|
||||
angles[1] = readfloat();
|
||||
if (fl & PLAYER_ANGLES_Z)
|
||||
angles[2] = readfloat();
|
||||
|
||||
if (fl & PLAYER_VELOCITY) {
|
||||
velocity[0] = readcoord();
|
||||
velocity[1] = readcoord();
|
||||
}
|
||||
|
||||
if (fl & PLAYER_VELOCITY_Z)
|
||||
velocity[2] = readcoord();
|
||||
if (fl & PLAYER_FLAGS) {
|
||||
flags = readfloat();
|
||||
gflags = readfloat();
|
||||
}
|
||||
if (fl & PLAYER_WEAPON)
|
||||
activeweapon = readbyte();
|
||||
if (fl & PLAYER_ITEMS)
|
||||
g_items = (__variant)readfloat();
|
||||
if (fl & PLAYER_HEALTH)
|
||||
health = readbyte();
|
||||
if (fl & PLAYER_ARMOR)
|
||||
armor = readbyte();
|
||||
if (fl & PLAYER_MOVETYPE)
|
||||
movetype = readbyte();
|
||||
if (fl & PLAYER_VIEWOFS)
|
||||
view_ofs[2] = readfloat();
|
||||
if (fl & PLAYER_BASEFRAME)
|
||||
baseframe = readbyte();
|
||||
if (fl & PLAYER_FRAME) {
|
||||
frame = readbyte();
|
||||
frame1time = 0.0f;
|
||||
frame2time = 0.0f;
|
||||
}
|
||||
|
||||
if (fl & PLAYER_AMMO1) {
|
||||
glock_mag = readbyte();
|
||||
mp5_mag = readbyte();
|
||||
python_mag = readbyte();
|
||||
shotgun_mag = readbyte();
|
||||
crossbow_mag = readbyte();
|
||||
rpg_mag = readbyte();
|
||||
satchel_chg = readbyte();
|
||||
|
||||
/* hunger */
|
||||
sniper_mag = readbyte();
|
||||
chaingun_mag = readbyte();
|
||||
ap9_mag = readbyte();
|
||||
taurus_mag = readbyte();
|
||||
}
|
||||
|
||||
if (fl & PLAYER_AMMO2) {
|
||||
ammo_9mm = readbyte();
|
||||
ammo_357 = readbyte();
|
||||
ammo_buckshot = readbyte();
|
||||
ammo_bolt = readbyte();
|
||||
ammo_rocket = readbyte();
|
||||
ammo_uranium = readbyte();
|
||||
ammo_handgrenade = readbyte();
|
||||
ammo_satchel = readbyte();
|
||||
ammo_tripmine = readbyte();
|
||||
ammo_snark = readbyte();
|
||||
ammo_hornet = readbyte();
|
||||
|
||||
/* hunger */
|
||||
ammo_ap9 = readbyte();
|
||||
ammo_taurus = readbyte();
|
||||
ammo_bolt = readbyte();
|
||||
ammo_sniper = readbyte();
|
||||
ammo_medkit = readbyte();
|
||||
ammo_gas = readbyte();
|
||||
}
|
||||
|
||||
if (fl & PLAYER_AMMO3) {
|
||||
ammo_m203_grenade = readbyte();
|
||||
ammo_shotgun_state = readbyte();
|
||||
ammo_gauss_state = readbyte();
|
||||
ammo_gauss_volume = readbyte();
|
||||
ammo_egon_state = readbyte();
|
||||
ammo_rpg_state = readbyte();
|
||||
ammo_handgrenade_state = readbyte();
|
||||
mode_silencer = readbyte();
|
||||
}
|
||||
|
||||
if (fl & PLAYER_AMMO1 || fl & PLAYER_AMMO2 || fl & PLAYER_AMMO3)
|
||||
Weapons_AmmoUpdate(this);
|
||||
|
||||
setorigin(this, origin);
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
player::PredictPostFrame
|
||||
|
||||
Save the last valid server values away in the _net variants of each field
|
||||
so we can roll them back later.
|
||||
=================
|
||||
*/
|
||||
void
|
||||
player::PredictPreFrame(void)
|
||||
{
|
||||
glock_mag_net = glock_mag;
|
||||
mp5_mag_net = mp5_mag;
|
||||
python_mag_net = python_mag;
|
||||
shotgun_mag_net = shotgun_mag;
|
||||
crossbow_mag_net = crossbow_mag;
|
||||
rpg_mag_net = rpg_mag;
|
||||
satchel_chg_net = satchel_chg;
|
||||
ammo_9mm_net = ammo_9mm;
|
||||
ammo_357_net = ammo_357;
|
||||
ammo_buckshot_net = ammo_buckshot;
|
||||
ammo_bolt_net = ammo_bolt;
|
||||
ammo_rocket_net = ammo_rocket;
|
||||
ammo_uranium_net = ammo_uranium;
|
||||
ammo_handgrenade_net = ammo_handgrenade;
|
||||
ammo_satchel_net = ammo_satchel;
|
||||
ammo_tripmine_net = ammo_tripmine;
|
||||
ammo_snark_net = ammo_snark;
|
||||
ammo_hornet_net = ammo_hornet;
|
||||
|
||||
ammo_m203_grenade_net = ammo_m203_grenade;
|
||||
ammo_shotgun_state_net = ammo_shotgun_state;
|
||||
ammo_gauss_state_net = ammo_gauss_state;
|
||||
ammo_gauss_volume_net = ammo_gauss_volume;
|
||||
ammo_egon_state_net = ammo_egon_state;
|
||||
ammo_rpg_state_net = ammo_rpg_state;
|
||||
ammo_handgrenade_state_net = ammo_handgrenade_state;
|
||||
|
||||
/* gearbox */
|
||||
sniper_mag_net = sniper_mag;
|
||||
chaingun_mag_net = chaingun_mag;
|
||||
ap9_mag_net = ap9_mag;
|
||||
taurus_mag_net = taurus_mag;
|
||||
|
||||
ammo_ap9_net = ammo_ap9;
|
||||
ammo_taurus_net = ammo_taurus;
|
||||
ammo_bolt_net = ammo_bolt;
|
||||
ammo_sniper_net = ammo_sniper;
|
||||
ammo_medkit_net = ammo_medkit;
|
||||
ammo_gas_net = ammo_gas;
|
||||
|
||||
mode_silencer_net = mode_silencer;
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
player::PredictPostFrame
|
||||
|
||||
Where we roll back our values to the ones last sent/verified by the server.
|
||||
=================
|
||||
*/
|
||||
void
|
||||
player::PredictPostFrame(void)
|
||||
{
|
||||
glock_mag = glock_mag_net;
|
||||
mp5_mag = mp5_mag_net;
|
||||
python_mag = python_mag_net;
|
||||
shotgun_mag = shotgun_mag_net;
|
||||
crossbow_mag = crossbow_mag_net;
|
||||
rpg_mag = rpg_mag_net;
|
||||
satchel_chg = satchel_chg_net;
|
||||
ammo_9mm = ammo_9mm_net;
|
||||
ammo_357 = ammo_357_net;
|
||||
ammo_buckshot = ammo_buckshot_net;
|
||||
ammo_m203_grenade = ammo_m203_grenade_net;
|
||||
ammo_bolt = ammo_bolt_net;
|
||||
ammo_rocket = ammo_rocket_net;
|
||||
ammo_uranium = ammo_uranium_net;
|
||||
ammo_handgrenade = ammo_handgrenade_net;
|
||||
ammo_satchel = ammo_satchel_net;
|
||||
ammo_tripmine = ammo_tripmine_net;
|
||||
ammo_snark = ammo_snark_net;
|
||||
ammo_hornet = ammo_hornet_net;
|
||||
|
||||
ammo_m203_grenade = ammo_m203_grenade_net;
|
||||
ammo_shotgun_state = ammo_shotgun_state_net;
|
||||
ammo_gauss_state = ammo_gauss_state_net;
|
||||
ammo_gauss_volume = ammo_gauss_volume_net;
|
||||
ammo_egon_state = ammo_egon_state_net;
|
||||
ammo_rpg_state = ammo_rpg_state_net;
|
||||
ammo_handgrenade_state = ammo_handgrenade_state_net;
|
||||
|
||||
/* hunger */
|
||||
sniper_mag = sniper_mag_net;
|
||||
chaingun_mag = chaingun_mag_net;
|
||||
ap9_mag = ap9_mag_net;
|
||||
taurus_mag = taurus_mag_net;
|
||||
|
||||
ammo_ap9 = ammo_ap9_net;
|
||||
ammo_taurus = ammo_taurus_net;
|
||||
ammo_bolt = ammo_bolt_net;
|
||||
ammo_sniper = ammo_sniper_net;
|
||||
ammo_medkit = ammo_medkit_net;
|
||||
ammo_gas = ammo_gas_net;
|
||||
|
||||
mode_silencer = mode_silencer_net;
|
||||
}
|
||||
|
||||
#else
|
||||
void
|
||||
player::EvaluateEntity(void)
|
||||
{
|
||||
SendFlags |= PLAYER_KEEPALIVE;
|
||||
|
||||
if (old_modelindex != modelindex)
|
||||
SendFlags |= PLAYER_MODELINDEX;
|
||||
|
||||
if (old_origin[0] != origin[0])
|
||||
SendFlags |= PLAYER_ORIGIN;
|
||||
|
||||
if (old_origin[1] != origin[1])
|
||||
SendFlags |= PLAYER_ORIGIN;
|
||||
|
||||
if (old_origin[2] != origin[2])
|
||||
SendFlags |= PLAYER_ORIGIN_Z;
|
||||
|
||||
if (old_angles[0] != v_angle[0])
|
||||
SendFlags |= PLAYER_ANGLES_X;
|
||||
|
||||
if (old_angles[1] != angles[1])
|
||||
SendFlags |= PLAYER_ANGLES_Y;
|
||||
|
||||
if (old_angles[2] != angles[2])
|
||||
SendFlags |= PLAYER_ANGLES_Z;
|
||||
|
||||
if (old_velocity[0] != velocity[0])
|
||||
SendFlags |= PLAYER_VELOCITY;
|
||||
|
||||
if (old_velocity[1] != velocity[1])
|
||||
SendFlags |= PLAYER_VELOCITY;
|
||||
|
||||
if (old_velocity[2] != velocity[2])
|
||||
SendFlags |= PLAYER_VELOCITY_Z;
|
||||
|
||||
if (old_flags != flags)
|
||||
SendFlags |= PLAYER_FLAGS;
|
||||
|
||||
if (old_gflags != gflags)
|
||||
SendFlags |= PLAYER_FLAGS;
|
||||
|
||||
if (old_activeweapon != activeweapon)
|
||||
SendFlags |= PLAYER_WEAPON;
|
||||
|
||||
if (old_items != g_items)
|
||||
SendFlags |= PLAYER_ITEMS;
|
||||
|
||||
if (old_health != health)
|
||||
SendFlags |= PLAYER_HEALTH;
|
||||
|
||||
if (old_armor != armor)
|
||||
SendFlags |= PLAYER_ARMOR;
|
||||
|
||||
if (old_movetype != movetype)
|
||||
SendFlags |= PLAYER_MOVETYPE;
|
||||
|
||||
if (old_viewofs != view_ofs[2])
|
||||
SendFlags |= PLAYER_VIEWOFS;
|
||||
|
||||
if (old_baseframe != baseframe)
|
||||
SendFlags |= PLAYER_BASEFRAME;
|
||||
|
||||
if (old_frame != frame)
|
||||
SendFlags |= PLAYER_FRAME;
|
||||
|
||||
/* ammo 1 type updates */
|
||||
if (glock_mag != glock_mag_net) {
|
||||
SendFlags |= PLAYER_AMMO1;
|
||||
}
|
||||
if (mp5_mag != mp5_mag_net) {
|
||||
SendFlags |= PLAYER_AMMO1;
|
||||
}
|
||||
if (python_mag != python_mag_net) {
|
||||
SendFlags |= PLAYER_AMMO1;
|
||||
}
|
||||
if (shotgun_mag != shotgun_mag_net) {
|
||||
SendFlags |= PLAYER_AMMO1;
|
||||
}
|
||||
if (crossbow_mag != crossbow_mag_net) {
|
||||
SendFlags |= PLAYER_AMMO1;
|
||||
}
|
||||
if (rpg_mag != rpg_mag_net) {
|
||||
SendFlags |= PLAYER_AMMO1;
|
||||
}
|
||||
if (satchel_chg != satchel_chg_net) {
|
||||
SendFlags |= PLAYER_AMMO1;
|
||||
}
|
||||
|
||||
/* ammo 2 type updates */
|
||||
if (ammo_9mm != ammo_9mm_net) {
|
||||
SendFlags |= PLAYER_AMMO2;
|
||||
}
|
||||
if (ammo_357 != ammo_357_net) {
|
||||
SendFlags |= PLAYER_AMMO2;
|
||||
}
|
||||
if (ammo_buckshot != ammo_buckshot_net) {
|
||||
SendFlags |= PLAYER_AMMO2;
|
||||
}
|
||||
if (ammo_bolt != ammo_bolt_net) {
|
||||
SendFlags |= PLAYER_AMMO2;
|
||||
}
|
||||
if (ammo_rocket != ammo_rocket_net) {
|
||||
SendFlags |= PLAYER_AMMO2;
|
||||
}
|
||||
if (ammo_uranium != ammo_uranium_net) {
|
||||
SendFlags |= PLAYER_AMMO2;
|
||||
}
|
||||
if (ammo_handgrenade != ammo_handgrenade_net) {
|
||||
SendFlags |= PLAYER_AMMO2;
|
||||
}
|
||||
if (ammo_satchel != ammo_satchel_net) {
|
||||
SendFlags |= PLAYER_AMMO2;
|
||||
}
|
||||
if (ammo_tripmine != ammo_tripmine_net) {
|
||||
SendFlags |= PLAYER_AMMO2;
|
||||
}
|
||||
if (ammo_snark != ammo_snark_net) {
|
||||
SendFlags |= PLAYER_AMMO2;
|
||||
}
|
||||
if (ammo_hornet != ammo_hornet_net) {
|
||||
SendFlags |= PLAYER_AMMO2;
|
||||
}
|
||||
|
||||
if (ammo_m203_grenade != ammo_m203_grenade_net) {
|
||||
SendFlags |= PLAYER_AMMO3;
|
||||
}
|
||||
if (ammo_shotgun_state != ammo_shotgun_state_net) {
|
||||
SendFlags |= PLAYER_AMMO3;
|
||||
}
|
||||
if (ammo_gauss_state != ammo_gauss_state_net) {
|
||||
SendFlags |= PLAYER_AMMO3;
|
||||
}
|
||||
if (ammo_gauss_volume != ammo_gauss_volume_net) {
|
||||
SendFlags |= PLAYER_AMMO3;
|
||||
}
|
||||
if (ammo_egon_state != ammo_egon_state_net) {
|
||||
SendFlags |= PLAYER_AMMO3;
|
||||
}
|
||||
if (ammo_rpg_state != ammo_rpg_state_net) {
|
||||
SendFlags |= PLAYER_AMMO3;
|
||||
}
|
||||
if (ammo_handgrenade_state != ammo_handgrenade_state_net) {
|
||||
SendFlags |= PLAYER_AMMO3;
|
||||
}
|
||||
|
||||
old_modelindex = modelindex;
|
||||
old_origin = origin;
|
||||
old_angles = angles;
|
||||
old_angles[0] = v_angle[0];
|
||||
old_velocity = velocity;
|
||||
old_flags = flags;
|
||||
old_gflags = gflags;
|
||||
old_activeweapon = activeweapon;
|
||||
old_items = g_items;
|
||||
old_health = health;
|
||||
old_armor = armor;
|
||||
old_movetype = movetype;
|
||||
old_viewofs = view_ofs[2];
|
||||
old_baseframe = baseframe;
|
||||
old_frame = frame;
|
||||
|
||||
glock_mag_net = glock_mag;
|
||||
mp5_mag_net = mp5_mag;
|
||||
python_mag_net = python_mag;
|
||||
shotgun_mag_net = shotgun_mag;
|
||||
crossbow_mag_net = crossbow_mag;
|
||||
rpg_mag_net = rpg_mag;
|
||||
satchel_chg_net = satchel_chg;
|
||||
|
||||
ammo_9mm_net = ammo_9mm;
|
||||
ammo_357_net = ammo_357;
|
||||
ammo_buckshot_net = ammo_buckshot;
|
||||
ammo_m203_grenade_net = ammo_m203_grenade;
|
||||
ammo_bolt_net = ammo_bolt;
|
||||
ammo_rocket_net = ammo_rocket;
|
||||
ammo_uranium_net = ammo_uranium;
|
||||
ammo_handgrenade_net = ammo_handgrenade;
|
||||
ammo_satchel_net = ammo_satchel;
|
||||
ammo_tripmine_net = ammo_tripmine;
|
||||
ammo_snark_net = ammo_snark;
|
||||
ammo_hornet_net = ammo_hornet;
|
||||
|
||||
ammo_m203_grenade_net = ammo_m203_grenade;
|
||||
ammo_shotgun_state_net = ammo_shotgun_state;
|
||||
ammo_gauss_state_net = ammo_gauss_state;
|
||||
ammo_gauss_volume_net = ammo_gauss_volume;
|
||||
ammo_egon_state_net = ammo_egon_state;
|
||||
ammo_rpg_state_net = ammo_rpg_state;
|
||||
ammo_handgrenade_state_net = ammo_handgrenade_state;
|
||||
|
||||
/* hunger */
|
||||
if (sniper_mag != sniper_mag_net)
|
||||
SendFlags |= PLAYER_AMMO1;
|
||||
if (chaingun_mag != chaingun_mag_net)
|
||||
SendFlags |= PLAYER_AMMO1;
|
||||
if (ap9_mag != ap9_mag_net)
|
||||
SendFlags |= PLAYER_AMMO1;
|
||||
if (taurus_mag != taurus_mag_net)
|
||||
SendFlags |= PLAYER_AMMO1;
|
||||
|
||||
if (ammo_ap9 != ammo_ap9_net)
|
||||
SendFlags |= PLAYER_AMMO2;
|
||||
if (ammo_taurus != ammo_taurus_net)
|
||||
SendFlags |= PLAYER_AMMO2;
|
||||
if (ammo_bolt != ammo_bolt_net)
|
||||
SendFlags |= PLAYER_AMMO2;
|
||||
if (ammo_sniper != ammo_sniper_net)
|
||||
SendFlags |= PLAYER_AMMO2;
|
||||
if (ammo_medkit != ammo_medkit_net)
|
||||
SendFlags |= PLAYER_AMMO2;
|
||||
if (ammo_gas != ammo_gas_net)
|
||||
SendFlags |= PLAYER_AMMO2;
|
||||
|
||||
if (mode_silencer != mode_silencer_net)
|
||||
SendFlags |= PLAYER_AMMO3;
|
||||
|
||||
sniper_mag_net = sniper_mag;
|
||||
chaingun_mag_net = chaingun_mag;
|
||||
ap9_mag_net = ap9_mag;
|
||||
taurus_mag_net = taurus_mag;
|
||||
|
||||
ammo_ap9_net = ammo_ap9;
|
||||
ammo_taurus_net = ammo_taurus;
|
||||
ammo_bolt_net = ammo_bolt;
|
||||
ammo_sniper_net = ammo_sniper;
|
||||
ammo_medkit_net = ammo_medkit;
|
||||
ammo_gas_net = ammo_gas;
|
||||
mode_silencer_net= mode_silencer;
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
player::SendEntity
|
||||
=================
|
||||
*/
|
||||
float
|
||||
player::SendEntity(entity ePEnt, float fChanged)
|
||||
{
|
||||
if (health <= 0 && ePEnt != this) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (clienttype(ePEnt) != CLIENTTYPE_REAL) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (ePEnt != self) {
|
||||
fChanged &= ~PLAYER_ITEMS;
|
||||
fChanged &= ~PLAYER_HEALTH;
|
||||
fChanged &= ~PLAYER_ARMOR;
|
||||
fChanged &= ~PLAYER_VIEWOFS;
|
||||
fChanged &= ~PLAYER_AMMO1;
|
||||
fChanged &= ~PLAYER_AMMO2;
|
||||
fChanged &= ~PLAYER_AMMO3;
|
||||
}
|
||||
|
||||
WriteByte(MSG_ENTITY, ENT_PLAYER);
|
||||
WriteFloat(MSG_ENTITY, fChanged);
|
||||
|
||||
/* really trying to get our moneys worth with 23 bits of mantissa */
|
||||
if (fChanged & PLAYER_MODELINDEX)
|
||||
WriteShort(MSG_ENTITY, modelindex);
|
||||
if (fChanged & PLAYER_ORIGIN) {
|
||||
WriteCoord(MSG_ENTITY, origin[0]);
|
||||
WriteCoord(MSG_ENTITY, origin[1]);
|
||||
}
|
||||
if (fChanged & PLAYER_ORIGIN_Z)
|
||||
WriteCoord(MSG_ENTITY, origin[2]);
|
||||
if (fChanged & PLAYER_ANGLES_X)
|
||||
WriteFloat(MSG_ENTITY, v_angle[0]);
|
||||
if (fChanged & PLAYER_ANGLES_Y)
|
||||
WriteFloat(MSG_ENTITY, angles[1]);
|
||||
if (fChanged & PLAYER_ANGLES_Z)
|
||||
WriteFloat(MSG_ENTITY, angles[2]);
|
||||
if (fChanged & PLAYER_VELOCITY) {
|
||||
WriteCoord(MSG_ENTITY, velocity[0]);
|
||||
WriteCoord(MSG_ENTITY, velocity[1]);
|
||||
}
|
||||
if (fChanged & PLAYER_VELOCITY_Z)
|
||||
WriteCoord(MSG_ENTITY, velocity[2]);
|
||||
if (fChanged & PLAYER_FLAGS) {
|
||||
WriteFloat(MSG_ENTITY, flags);
|
||||
WriteFloat(MSG_ENTITY, gflags);
|
||||
}
|
||||
if (fChanged & PLAYER_WEAPON)
|
||||
WriteByte(MSG_ENTITY, activeweapon);
|
||||
if (fChanged & PLAYER_ITEMS)
|
||||
WriteFloat(MSG_ENTITY, (__variant)g_items);
|
||||
if (fChanged & PLAYER_HEALTH)
|
||||
WriteByte(MSG_ENTITY, bound(0, health, 255));
|
||||
if (fChanged & PLAYER_ARMOR)
|
||||
WriteByte(MSG_ENTITY, armor);
|
||||
if (fChanged & PLAYER_MOVETYPE)
|
||||
WriteByte(MSG_ENTITY, movetype);
|
||||
if (fChanged & PLAYER_VIEWOFS)
|
||||
WriteFloat(MSG_ENTITY, view_ofs[2]);
|
||||
if (fChanged & PLAYER_BASEFRAME)
|
||||
WriteByte(MSG_ENTITY, baseframe);
|
||||
if (fChanged & PLAYER_FRAME)
|
||||
WriteByte(MSG_ENTITY, frame);
|
||||
|
||||
if (fChanged & PLAYER_AMMO1) {
|
||||
WriteByte(MSG_ENTITY, glock_mag);
|
||||
WriteByte(MSG_ENTITY, mp5_mag);
|
||||
WriteByte(MSG_ENTITY, python_mag);
|
||||
WriteByte(MSG_ENTITY, shotgun_mag);
|
||||
WriteByte(MSG_ENTITY, crossbow_mag);
|
||||
WriteByte(MSG_ENTITY, rpg_mag);
|
||||
WriteByte(MSG_ENTITY, satchel_chg);
|
||||
|
||||
/* hunger */
|
||||
WriteByte(MSG_ENTITY, sniper_mag);
|
||||
WriteByte(MSG_ENTITY, chaingun_mag);
|
||||
WriteByte(MSG_ENTITY, ap9_mag);
|
||||
WriteByte(MSG_ENTITY, taurus_mag);
|
||||
}
|
||||
|
||||
if (fChanged & PLAYER_AMMO2) {
|
||||
WriteByte(MSG_ENTITY, ammo_9mm);
|
||||
WriteByte(MSG_ENTITY, ammo_357);
|
||||
WriteByte(MSG_ENTITY, ammo_buckshot);
|
||||
WriteByte(MSG_ENTITY, ammo_bolt);
|
||||
WriteByte(MSG_ENTITY, ammo_rocket);
|
||||
WriteByte(MSG_ENTITY, ammo_uranium);
|
||||
WriteByte(MSG_ENTITY, ammo_handgrenade);
|
||||
WriteByte(MSG_ENTITY, ammo_satchel);
|
||||
WriteByte(MSG_ENTITY, ammo_tripmine);
|
||||
WriteByte(MSG_ENTITY, ammo_snark);
|
||||
WriteByte(MSG_ENTITY, ammo_hornet);
|
||||
|
||||
/* hunger */
|
||||
WriteByte(MSG_ENTITY, ammo_ap9);
|
||||
WriteByte(MSG_ENTITY, ammo_taurus);
|
||||
WriteByte(MSG_ENTITY, ammo_bolt);
|
||||
WriteByte(MSG_ENTITY, ammo_sniper);
|
||||
WriteByte(MSG_ENTITY, ammo_medkit);
|
||||
WriteByte(MSG_ENTITY, ammo_gas);
|
||||
}
|
||||
|
||||
if (fChanged & PLAYER_AMMO3) {
|
||||
WriteByte(MSG_ENTITY, ammo_m203_grenade);
|
||||
WriteByte(MSG_ENTITY, ammo_shotgun_state);
|
||||
WriteByte(MSG_ENTITY, ammo_gauss_state);
|
||||
WriteByte(MSG_ENTITY, ammo_gauss_volume);
|
||||
WriteByte(MSG_ENTITY, ammo_egon_state);
|
||||
WriteByte(MSG_ENTITY, ammo_rpg_state);
|
||||
WriteByte(MSG_ENTITY, ammo_handgrenade_state);
|
||||
WriteByte(MSG_ENTITY, mode_silencer);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -42,9 +42,7 @@ w_ap9_precache(void)
|
|||
void
|
||||
w_ap9_updateammo(player pl)
|
||||
{
|
||||
#ifdef SERVER
|
||||
Weapons_UpdateAmmo(pl, pl.ap9_mag, pl.ammo_ap9, -1);
|
||||
#endif
|
||||
}
|
||||
|
||||
string
|
||||
|
@ -109,19 +107,15 @@ w_ap9_primary(void)
|
|||
}
|
||||
|
||||
/* ammo check */
|
||||
#ifdef CLIENT
|
||||
if (!pl.a_ammo1) {
|
||||
return;
|
||||
}
|
||||
#else
|
||||
if (!pl.ap9_mag) {
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
pl.ap9_mag--;
|
||||
|
||||
/* actual firing */
|
||||
#ifdef CLIENT
|
||||
pl.a_ammo1--;
|
||||
pl.ap9_mag--;
|
||||
View_SetMuzzleflash(MUZZLE_SMALL);
|
||||
Weapons_ViewPunchAngle([-2,0,0]);
|
||||
|
||||
|
@ -139,7 +133,6 @@ w_ap9_primary(void)
|
|||
}
|
||||
|
||||
#else
|
||||
pl.ap9_mag--;
|
||||
TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 8, [0.1,0.1], WEAPON_AP9);
|
||||
Sound_Play(pl, CHAN_WEAPON, "weapon_ap9.fire");
|
||||
|
||||
|
@ -163,18 +156,12 @@ w_ap9_secondary(void)
|
|||
}
|
||||
|
||||
/* ammo check */
|
||||
#ifdef CLIENT
|
||||
if (!pl.a_ammo1) {
|
||||
if ((pl.ap9_mag - 3) < 0) {
|
||||
return;
|
||||
}
|
||||
#else
|
||||
if (!pl.ap9_mag) {
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
pl.ap9_mag -= 3;
|
||||
|
||||
#ifdef CLIENT
|
||||
pl.a_ammo1 -= 3;
|
||||
View_SetMuzzleflash(MUZZLE_SMALL);
|
||||
Weapons_ViewPunchAngle([-2,0,0]);
|
||||
|
||||
|
@ -191,7 +178,6 @@ w_ap9_secondary(void)
|
|||
break;
|
||||
}
|
||||
#else
|
||||
pl.ap9_mag -= 3;
|
||||
TraceAttack_FireBullets(3, pl.origin + pl.view_ofs, 8, [0.02,0.02], WEAPON_AP9);
|
||||
Sound_Play(pl, CHAN_WEAPON, "weapon_ap9.fire");
|
||||
|
||||
|
@ -213,24 +199,16 @@ w_ap9_reload(void)
|
|||
if (pl.w_attack_next > 0.0) {
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef CLIENT
|
||||
if (pl.a_ammo1 >= 40) {
|
||||
if (pl.ap9_mag >= 40) {
|
||||
return;
|
||||
}
|
||||
if (pl.a_ammo2 <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef CLIENT
|
||||
Weapons_ViewAnimation(AP9_RELOAD);
|
||||
#else
|
||||
if (pl.ap9_mag >= 40) {
|
||||
return;
|
||||
}
|
||||
if (pl.ammo_ap9 <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
Weapons_ReloadWeapon(pl, player::ap9_mag, player::ammo_ap9, 40);
|
||||
#endif
|
||||
|
||||
|
@ -245,7 +223,7 @@ w_ap9_release(void)
|
|||
|
||||
/* auto-reload if need be */
|
||||
if (pl.w_attack_next <= 0.0)
|
||||
if (pl.a_ammo1 == 0 && pl.a_ammo2 > 0) {
|
||||
if (pl.ap9_mag == 0 && pl.ammo_ap9 > 0) {
|
||||
Weapons_Reload();
|
||||
return;
|
||||
}
|
||||
|
@ -273,6 +251,16 @@ void
|
|||
w_ap9_hudpic(int selected, vector pos, float a)
|
||||
{
|
||||
#ifdef CLIENT
|
||||
player pl = (player)self;
|
||||
vector hud_col;
|
||||
|
||||
if (pl.ap9_mag == 0 && pl.ammo_ap9 == 0)
|
||||
hud_col = [1,0,0];
|
||||
else
|
||||
hud_col = g_hud_color;
|
||||
|
||||
HUD_DrawAmmoBar(pos, pl.ammo_ap9, MAX_A_AP9, a);
|
||||
|
||||
if (selected) {
|
||||
drawsubpic(
|
||||
pos,
|
||||
|
@ -280,7 +268,7 @@ w_ap9_hudpic(int selected, vector pos, float a)
|
|||
"sprites/tfchud05.spr_0.tga",
|
||||
[0,0],
|
||||
[170/256,45/256],
|
||||
g_hud_color,
|
||||
hud_col,
|
||||
a,
|
||||
DRAWFLAG_ADDITIVE
|
||||
);
|
||||
|
@ -291,7 +279,7 @@ w_ap9_hudpic(int selected, vector pos, float a)
|
|||
"sprites/tfchud05.spr_0.tga",
|
||||
[0,0],
|
||||
[170/256,45/256],
|
||||
g_hud_color,
|
||||
hud_col,
|
||||
a,
|
||||
DRAWFLAG_ADDITIVE
|
||||
);
|
||||
|
@ -302,7 +290,7 @@ w_ap9_hudpic(int selected, vector pos, float a)
|
|||
weapon_t w_ap9 =
|
||||
{
|
||||
.name = "ap9",
|
||||
.id = ITEM_AP9,
|
||||
.id = ITEM_AP9,
|
||||
.slot = 1,
|
||||
.slot_pos = 2,
|
||||
.draw = w_ap9_draw,
|
||||
|
|
|
@ -63,9 +63,7 @@ w_chaingun_pickup(int new, int startammo)
|
|||
void
|
||||
w_chaingun_updateammo(player pl)
|
||||
{
|
||||
#ifdef SERVER
|
||||
Weapons_UpdateAmmo(pl, pl.chaingun_mag, pl.ammo_9mm, -1);
|
||||
#endif
|
||||
}
|
||||
|
||||
string
|
||||
|
@ -108,7 +106,7 @@ w_chaingun_release(void)
|
|||
|
||||
/* auto-reload if need be */
|
||||
if (pl.w_attack_next <= 0.0)
|
||||
if (pl.a_ammo1 == 0 && pl.a_ammo2 > 0) {
|
||||
if (pl.chaingun_mag == 0 && pl.ammo_9mm > 0) {
|
||||
Weapons_Reload();
|
||||
return;
|
||||
}
|
||||
|
@ -118,9 +116,11 @@ w_chaingun_release(void)
|
|||
}
|
||||
|
||||
/* end firing */
|
||||
if (pl.a_ammo3 == 1) {
|
||||
pl.a_ammo3 = 0;
|
||||
if (pl.ammo_handgrenade_state == 1) {
|
||||
pl.ammo_handgrenade_state = 0;
|
||||
#ifdef SERVER
|
||||
Sound_Play(pl, CHAN_WEAPON, "weapon_chaingun.spindown");
|
||||
#endif
|
||||
Weapons_ViewAnimation(CHAINGUN_SPINDOWN);
|
||||
pl.w_attack_next = 1.0f;
|
||||
pl.w_idle_next = pl.w_attack_next;
|
||||
|
@ -128,8 +128,8 @@ w_chaingun_release(void)
|
|||
}
|
||||
|
||||
/* end reload */
|
||||
if (pl.a_ammo3 == 2) {
|
||||
pl.a_ammo3 = 0;
|
||||
if (pl.ammo_handgrenade_state == 2) {
|
||||
pl.ammo_handgrenade_state = 0;
|
||||
Weapons_ViewAnimation(CHAINGUN_DRAW);
|
||||
pl.w_attack_next = 1.0f;
|
||||
pl.w_idle_next = pl.w_attack_next;
|
||||
|
@ -152,7 +152,7 @@ w_chaingun_primary(void)
|
|||
player pl = (player)self;
|
||||
|
||||
/* in case we're spamming primary while reloading */
|
||||
if (pl.a_ammo3 == 2) {
|
||||
if (pl.ammo_handgrenade_state == 2) {
|
||||
w_chaingun_release();
|
||||
return;
|
||||
}
|
||||
|
@ -162,34 +162,29 @@ w_chaingun_primary(void)
|
|||
}
|
||||
|
||||
/* ammo check */
|
||||
#ifdef CLIENT
|
||||
if (pl.a_ammo1 <= 0) {
|
||||
return;
|
||||
}
|
||||
#else
|
||||
if (pl.chaingun_mag <= 0) {
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* spin up first */
|
||||
if (pl.a_ammo3 == 0) {
|
||||
pl.a_ammo3 = 1;
|
||||
if (pl.ammo_handgrenade_state == 0) {
|
||||
pl.ammo_handgrenade_state = 1;
|
||||
Weapons_ViewAnimation(CHAINGUN_SPINUP);
|
||||
#ifdef SERVER
|
||||
Sound_Play(pl, CHAN_WEAPON, "weapon_chaingun.spinup");
|
||||
#endif
|
||||
pl.w_attack_next = 0.5f;
|
||||
pl.w_idle_next = pl.w_attack_next;
|
||||
return;
|
||||
}
|
||||
pl.chaingun_mag--;
|
||||
|
||||
/* actual firing */
|
||||
#ifdef CLIENT
|
||||
pl.a_ammo1--;
|
||||
View_SetMuzzleflash(MUZZLE_RIFLE);
|
||||
Weapons_ViewAnimation(CHAINGUN_FIRE);
|
||||
Weapons_ViewPunchAngle([random(-2, 2),0,0]);
|
||||
#else
|
||||
pl.chaingun_mag--;
|
||||
TraceAttack_FireBullets(1, Weapons_GetCameraPos(), 8, [0.15,0.15], WEAPON_CHAINGUN);
|
||||
Sound_Play(pl, CHAN_WEAPON, "weapon_chaingun.fire");
|
||||
#endif
|
||||
|
@ -208,21 +203,12 @@ w_chaingun_reload(void)
|
|||
}
|
||||
|
||||
/* ammo check */
|
||||
#ifdef CLIENT
|
||||
if (pl.a_ammo1 >= 100) {
|
||||
return;
|
||||
}
|
||||
if (pl.a_ammo2 <= 0) {
|
||||
return;
|
||||
}
|
||||
#else
|
||||
if (pl.chaingun_mag >= 100) {
|
||||
return;
|
||||
}
|
||||
if (pl.ammo_9mm <= 0) {
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CLIENT
|
||||
Weapons_ViewAnimation(CHAINGUN_HOLSTER);
|
||||
|
@ -231,7 +217,7 @@ w_chaingun_reload(void)
|
|||
Weapons_ReloadWeapon(pl, player::chaingun_mag, player::ammo_9mm, 100);
|
||||
#endif
|
||||
|
||||
pl.a_ammo3 = 2;
|
||||
pl.ammo_handgrenade_state = 2;
|
||||
pl.w_attack_next = 10.0f;
|
||||
pl.w_idle_next = 1.5f;
|
||||
}
|
||||
|
@ -252,6 +238,16 @@ void
|
|||
w_chaingun_hudpic(int selected, vector pos, float a)
|
||||
{
|
||||
#ifdef CLIENT
|
||||
player pl = (player)self;
|
||||
vector hud_col;
|
||||
|
||||
if (pl.chaingun_mag == 0 && pl.ammo_9mm == 0)
|
||||
hud_col = [1,0,0];
|
||||
else
|
||||
hud_col = g_hud_color;
|
||||
|
||||
HUD_DrawAmmoBar(pos, pl.ammo_9mm, MAX_A_9MM, a);
|
||||
|
||||
if (selected) {
|
||||
drawsubpic(
|
||||
pos,
|
||||
|
@ -259,7 +255,7 @@ w_chaingun_hudpic(int selected, vector pos, float a)
|
|||
"sprites/tfchud04.spr_0.tga",
|
||||
[0,90/256],
|
||||
[170/256,45/256],
|
||||
g_hud_color,
|
||||
hud_col,
|
||||
a,
|
||||
DRAWFLAG_ADDITIVE
|
||||
);
|
||||
|
@ -270,7 +266,7 @@ w_chaingun_hudpic(int selected, vector pos, float a)
|
|||
"sprites/tfchud03.spr_0.tga",
|
||||
[0,45/256],
|
||||
[170/256,45/256],
|
||||
g_hud_color,
|
||||
hud_col,
|
||||
a,
|
||||
DRAWFLAG_ADDITIVE
|
||||
);
|
||||
|
@ -281,7 +277,7 @@ w_chaingun_hudpic(int selected, vector pos, float a)
|
|||
weapon_t w_chaingun =
|
||||
{
|
||||
.name = "chaingun",
|
||||
.id = ITEM_CHAINGUN,
|
||||
.id = ITEM_CHAINGUN,
|
||||
.slot = 3,
|
||||
.slot_pos = 3,
|
||||
.draw = w_chaingun_draw,
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2016-2020 Marco Hladik <marco@icculus.org>
|
||||
* Copyright (c) 2016-2021 Marco Hladik <marco@icculus.org>
|
||||
* Copyright (c) 2019-2020 Gethyn ThomasQuail <xylemon@posteo.net>
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
|
@ -45,9 +45,7 @@ w_flame_precache(void)
|
|||
void
|
||||
w_flame_updateammo(player pl)
|
||||
{
|
||||
#ifdef SERVER
|
||||
Weapons_UpdateAmmo(pl, __NULL__, pl.ammo_gas, __NULL__);
|
||||
#endif
|
||||
Weapons_UpdateAmmo(pl, -1, pl.ammo_gas, -1);
|
||||
}
|
||||
|
||||
string
|
||||
|
@ -120,23 +118,17 @@ w_flame_primary(void)
|
|||
}
|
||||
|
||||
/* Ammo check */
|
||||
#ifdef CLIENT
|
||||
if (pl.a_ammo2 <= 0) {
|
||||
return;
|
||||
}
|
||||
#else
|
||||
if (pl.ammo_gas <= 0) {
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
pl.ammo_gas--;
|
||||
|
||||
#ifdef CLIENT
|
||||
if (Weapons_GetAnimation() == EGON_IDLE1)
|
||||
Weapons_ViewAnimation(EGON_ALTFIREON);
|
||||
else if (Weapons_GetAnimation() == EGON_ALTFIREON)
|
||||
Weapons_ViewAnimation(EGON_ALTFIRECYCLE);
|
||||
|
||||
pl.a_ammo2--;
|
||||
#else
|
||||
|
||||
Sound_Play(pl, CHAN_WEAPON, "weapon_flame.fire");
|
||||
|
@ -156,7 +148,6 @@ w_flame_primary(void)
|
|||
flame.nextthink = time + 2.0f;*/
|
||||
flame.effects |= EF_BRIGHTLIGHT;
|
||||
setsize(flame, [0,0,0], [0,0,0]);
|
||||
pl.ammo_gas--;
|
||||
#endif
|
||||
|
||||
pl.w_attack_next = 0.2f;
|
||||
|
@ -197,6 +188,16 @@ void
|
|||
w_flame_hudpic(int selected, vector pos, float a)
|
||||
{
|
||||
#ifdef CLIENT
|
||||
player pl = (player)self;
|
||||
vector hud_col;
|
||||
|
||||
if (pl.ammo_gas == 0)
|
||||
hud_col = [1,0,0];
|
||||
else
|
||||
hud_col = g_hud_color;
|
||||
|
||||
HUD_DrawAmmoBar(pos, pl.ammo_gas, MAX_A_GAS, a);
|
||||
|
||||
if (selected) {
|
||||
drawsubpic(
|
||||
pos,
|
||||
|
@ -204,7 +205,7 @@ w_flame_hudpic(int selected, vector pos, float a)
|
|||
"sprites/tfchud04.spr_0.tga",
|
||||
[0,45/256],
|
||||
[170/256,45/256],
|
||||
g_hud_color,
|
||||
hud_col,
|
||||
a,
|
||||
DRAWFLAG_ADDITIVE
|
||||
);
|
||||
|
@ -215,7 +216,7 @@ w_flame_hudpic(int selected, vector pos, float a)
|
|||
"sprites/tfchud03.spr_0.tga",
|
||||
[0,0/256],
|
||||
[170/256,45/256],
|
||||
g_hud_color,
|
||||
hud_col,
|
||||
a,
|
||||
DRAWFLAG_ADDITIVE
|
||||
);
|
||||
|
@ -226,7 +227,7 @@ w_flame_hudpic(int selected, vector pos, float a)
|
|||
weapon_t w_flame =
|
||||
{
|
||||
.name = "flame",
|
||||
.id = ITEM_EGON,
|
||||
.id = ITEM_EGON,
|
||||
.slot = 3,
|
||||
.slot_pos = 2,
|
||||
.draw = w_flame_draw,
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2016-2020 Marco Hladik <marco@icculus.org>
|
||||
* Copyright (c) 2016-2021 Marco Hladik <marco@icculus.org>
|
||||
* Copyright (c) 2019-2020 Gethyn ThomasQuail <xylemon@posteo.net>
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
|
@ -39,9 +39,7 @@ w_medkit_precache(void)
|
|||
void
|
||||
w_medkit_updateammo(player pl)
|
||||
{
|
||||
#ifdef SERVER
|
||||
Weapons_UpdateAmmo(pl, -1, pl.ammo_medkit, -1);
|
||||
#endif
|
||||
}
|
||||
|
||||
string
|
||||
|
@ -97,8 +95,6 @@ w_medkit_primary(void)
|
|||
if (pl.w_attack_next > 0.0) {
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef SERVER
|
||||
if (!pl.ammo_medkit) {
|
||||
return;
|
||||
}
|
||||
|
@ -106,11 +102,15 @@ w_medkit_primary(void)
|
|||
/* Don't give the player more than 100 health */
|
||||
if (pl.health >= 100) {
|
||||
return;
|
||||
} else {
|
||||
Weapons_ViewAnimation(MEDKIT_USE);
|
||||
}
|
||||
|
||||
pl.ammo_medkit--;
|
||||
|
||||
#ifdef SERVER
|
||||
/* We want to only give health to the player & skip armor */
|
||||
Damage_Apply(pl, pl, -15, WEAPON_MEDKIT, DMG_GENERIC);
|
||||
pl.ammo_medkit--;
|
||||
|
||||
if (self.flags & FL_CROUCHING)
|
||||
Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f);
|
||||
|
@ -120,12 +120,6 @@ w_medkit_primary(void)
|
|||
Sound_Play(pl, CHAN_WEAPON, "weapon_medkit.heal");
|
||||
#endif
|
||||
|
||||
if (pl.health >= 100) {
|
||||
return;
|
||||
} else {
|
||||
Weapons_ViewAnimation(MEDKIT_USE);
|
||||
}
|
||||
|
||||
pl.w_attack_next = 2.4f;
|
||||
pl.w_idle_next = 5.0f;
|
||||
}
|
||||
|
@ -184,6 +178,16 @@ void
|
|||
w_medkit_hudpic(int selected, vector pos, float a)
|
||||
{
|
||||
#ifdef CLIENT
|
||||
player pl = (player)self;
|
||||
vector hud_col;
|
||||
|
||||
if (pl.ammo_medkit == 0)
|
||||
hud_col = [1,0,0];
|
||||
else
|
||||
hud_col = g_hud_color;
|
||||
|
||||
HUD_DrawAmmoBar(pos, pl.ammo_medkit, MAX_A_MEDKIT, a);
|
||||
|
||||
if (selected) {
|
||||
drawsubpic(
|
||||
pos,
|
||||
|
@ -191,7 +195,7 @@ w_medkit_hudpic(int selected, vector pos, float a)
|
|||
"sprites/tfchud05.spr_0.tga",
|
||||
[0,180/256],
|
||||
[170/256,45/256],
|
||||
g_hud_color,
|
||||
hud_col,
|
||||
a,
|
||||
DRAWFLAG_ADDITIVE
|
||||
);
|
||||
|
@ -202,7 +206,7 @@ w_medkit_hudpic(int selected, vector pos, float a)
|
|||
"sprites/tfchud06.spr_0.tga",
|
||||
[0,90/256],
|
||||
[170/256,45/256],
|
||||
g_hud_color,
|
||||
hud_col,
|
||||
a,
|
||||
DRAWFLAG_ADDITIVE
|
||||
);
|
||||
|
@ -213,7 +217,7 @@ w_medkit_hudpic(int selected, vector pos, float a)
|
|||
weapon_t w_medkit =
|
||||
{
|
||||
.name = "medkit",
|
||||
.id = ITEM_MEDKIT2,
|
||||
.id = ITEM_MEDKIT2,
|
||||
.slot = 4,
|
||||
.slot_pos = 4,
|
||||
.draw = w_medkit_draw,
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2016-2020 Marco Hladik <marco@icculus.org>
|
||||
* Copyright (c) 2016-2021 Marco Hladik <marco@icculus.org>
|
||||
* Copyright (c) 2019-2020 Gethyn ThomasQuail <xylemon@posteo.net>
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2016-2020 Marco Hladik <marco@icculus.org>
|
||||
* Copyright (c) 2016-2021 Marco Hladik <marco@icculus.org>
|
||||
* Copyright (c) 2019-2020 Gethyn ThomasQuail <xylemon@posteo.net>
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
|
@ -76,6 +76,15 @@ void
|
|||
w_silencer_draw(void)
|
||||
{
|
||||
w_glock_draw();
|
||||
|
||||
#ifdef CLIENT
|
||||
player pl = (player)self;
|
||||
if (pl.mode_silencer) {
|
||||
Weapons_SetGeomset("geomset 2 2\n");
|
||||
} else {
|
||||
Weapons_SetGeomset("geomset 2 0\n");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
void
|
||||
w_silencer_holster(void)
|
||||
|
@ -93,42 +102,30 @@ w_silencer_primary(void)
|
|||
}
|
||||
|
||||
/* ammo check */
|
||||
#ifdef CLIENT
|
||||
if (!pl.a_ammo1) {
|
||||
if (!pl.glock_mag) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (pl.a_ammo3 == 1) {
|
||||
View_SetMuzzleflash(0);
|
||||
|
||||
pl.glock_mag--;
|
||||
|
||||
/* actual firing */
|
||||
Weapons_ViewPunchAngle([-2,0,0]);
|
||||
|
||||
#ifdef CLIENT
|
||||
if (pl.mode_silencer == 1) {
|
||||
View_SetMuzzleflash(0);
|
||||
} else {
|
||||
View_SetMuzzleflash(MUZZLE_SMALL);
|
||||
}
|
||||
|
||||
Weapons_ViewPunchAngle([-2,0,0]);
|
||||
|
||||
#else
|
||||
if (!pl.glock_mag) {
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* actual firing */
|
||||
#ifdef CLIENT
|
||||
pl.a_ammo1--;
|
||||
View_SetMuzzleflash(MUZZLE_SMALL);
|
||||
Weapons_ViewPunchAngle([-2,0,0]);
|
||||
|
||||
if (pl.a_ammo1) {
|
||||
if (pl.glock_mag) {
|
||||
Weapons_ViewAnimation(GLOCK_SHOOT);
|
||||
} else {
|
||||
Weapons_ViewAnimation(GLOCK_SHOOT_EMPTY);
|
||||
}
|
||||
#else
|
||||
pl.glock_mag--;
|
||||
|
||||
/* Different sound & accuracy without silencer */
|
||||
if (pl.a_ammo3 == 1) {
|
||||
if (pl.mode_silencer == 1) {
|
||||
TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, Skill_GetValue("plr_9mm_bullet", 8), [0.01, 0.01], WEAPON_GLOCK);
|
||||
Sound_Play(pl, CHAN_WEAPON, "weapon_silencer.fire");
|
||||
|
||||
|
@ -144,11 +141,12 @@ w_silencer_primary(void)
|
|||
#endif
|
||||
|
||||
/* Fires faster without silencer */
|
||||
if (pl.a_ammo3 == 1) {
|
||||
if (pl.mode_silencer == 1) {
|
||||
pl.w_attack_next = 0.3f;
|
||||
} else {
|
||||
pl.w_attack_next = 0.2f;
|
||||
}
|
||||
|
||||
pl.w_idle_next = 5.0f;
|
||||
}
|
||||
|
||||
|
@ -162,19 +160,19 @@ w_silencer_secondary(void)
|
|||
}
|
||||
|
||||
/* toggle silencer */
|
||||
pl.a_ammo3 = 1 - pl.a_ammo3;
|
||||
pl.mode_silencer = 1 - pl.mode_silencer;
|
||||
|
||||
/* the sub model isn't setting right, need the right values */
|
||||
#ifdef CLIENT
|
||||
if (pl.a_ammo3) {
|
||||
Weapons_SetGeomset("geomset 1 3\n");
|
||||
if (pl.mode_silencer) {
|
||||
Weapons_SetGeomset("geomset 2 2\n");
|
||||
Weapons_ViewAnimation(GLOCK_SILENCER);
|
||||
} else {
|
||||
Weapons_SetGeomset("geomset 0 1\n");
|
||||
Weapons_SetGeomset("geomset 2 0\n");
|
||||
Weapons_ViewAnimation(GLOCK_HOLSTER);
|
||||
}
|
||||
#endif
|
||||
if (pl.a_ammo3) {
|
||||
if (pl.mode_silencer) {
|
||||
pl.w_attack_next = 3.3f;
|
||||
pl.w_idle_next = pl.w_attack_next;
|
||||
} else {
|
||||
|
@ -212,6 +210,16 @@ void
|
|||
w_silencer_hudpic(int selected, vector pos, float a)
|
||||
{
|
||||
#ifdef CLIENT
|
||||
player pl = (player)self;
|
||||
vector hud_col;
|
||||
|
||||
if (pl.glock_mag == 0 && pl.ammo_9mm == 0)
|
||||
hud_col = [1,0,0];
|
||||
else
|
||||
hud_col = g_hud_color;
|
||||
|
||||
HUD_DrawAmmoBar(pos, pl.ammo_9mm, MAX_A_9MM, a);
|
||||
|
||||
if (selected) {
|
||||
drawsubpic(
|
||||
pos,
|
||||
|
@ -219,7 +227,7 @@ w_silencer_hudpic(int selected, vector pos, float a)
|
|||
"sprites/tfchud05.spr_0.tga",
|
||||
[0,135/256],
|
||||
[170/256,45/256],
|
||||
g_hud_color,
|
||||
hud_col,
|
||||
a,
|
||||
DRAWFLAG_ADDITIVE
|
||||
);
|
||||
|
@ -230,7 +238,7 @@ w_silencer_hudpic(int selected, vector pos, float a)
|
|||
"sprites/tfchud06.spr_0.tga",
|
||||
[0,45/256],
|
||||
[170/256,45/256],
|
||||
g_hud_color,
|
||||
hud_col,
|
||||
a,
|
||||
DRAWFLAG_ADDITIVE
|
||||
);
|
||||
|
@ -241,7 +249,7 @@ w_silencer_hudpic(int selected, vector pos, float a)
|
|||
weapon_t w_silencer =
|
||||
{
|
||||
.name = "silencer",
|
||||
.id = ITEM_GLOCK,
|
||||
.id = ITEM_GLOCK,
|
||||
.slot = 1,
|
||||
.slot_pos = 0,
|
||||
.draw = w_silencer_draw,
|
||||
|
|
|
@ -59,9 +59,7 @@ w_sniper_pickup(int new, int startammo)
|
|||
void
|
||||
w_sniper_updateammo(player pl)
|
||||
{
|
||||
#ifdef SERVER
|
||||
Weapons_UpdateAmmo(pl, pl.sniper_mag, pl.ammo_sniper, -1);
|
||||
#endif
|
||||
}
|
||||
|
||||
string
|
||||
|
@ -106,7 +104,7 @@ w_sniper_release(void)
|
|||
|
||||
/* auto-reload if need be */
|
||||
if (pl.w_attack_next <= 0.0)
|
||||
if (pl.a_ammo1 == 0 && pl.a_ammo2 > 0) {
|
||||
if (pl.sniper_mag == 0 && pl.ammo_sniper > 0) {
|
||||
Weapons_Reload();
|
||||
return;
|
||||
}
|
||||
|
@ -115,9 +113,9 @@ w_sniper_release(void)
|
|||
return;
|
||||
}
|
||||
|
||||
if (pl.a_ammo3 == 1) {
|
||||
if (pl.ammo_handgrenade_state == 1) {
|
||||
Weapons_ViewAnimation(SNIPER_DRAW);
|
||||
pl.a_ammo3 = 0;
|
||||
pl.ammo_handgrenade_state = 0;
|
||||
pl.w_attack_next = 0.0f;
|
||||
pl.w_idle_next = 15.0f;
|
||||
return;
|
||||
|
@ -148,30 +146,22 @@ w_sniper_primary(void)
|
|||
}
|
||||
|
||||
/* Ammo check */
|
||||
#ifdef CLIENT
|
||||
if (pl.a_ammo1 <= 0) {
|
||||
return;
|
||||
}
|
||||
#else
|
||||
if (pl.sniper_mag <= 0) {
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
pl.sniper_mag--;
|
||||
|
||||
/* Actual firing */
|
||||
#ifdef CLIENT
|
||||
pl.a_ammo1--;
|
||||
View_SetMuzzleflash(MUZZLE_SMALL);
|
||||
Weapons_ViewPunchAngle([-20,0,0]);
|
||||
Weapons_ViewAnimation(SNIPER_FIRE1);
|
||||
#else
|
||||
pl.sniper_mag--;
|
||||
TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 40, [0.008, 0.008], WEAPON_SNIPER);
|
||||
|
||||
Sound_Play(pl, CHAN_WEAPON, "weapon_sniper.fire");
|
||||
#endif
|
||||
|
||||
|
||||
/* Simple toggle of fovs */
|
||||
if (pl.viewzoom == 1.0f) {
|
||||
pl.w_attack_next = 0.1f;
|
||||
|
@ -209,27 +199,21 @@ w_sniper_reload(void)
|
|||
w_sniper_release();
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef CLIENT
|
||||
if (pl.a_ammo1 >= 5) {
|
||||
return;
|
||||
}
|
||||
if (pl.a_ammo2 <= 0) {
|
||||
return;
|
||||
}
|
||||
Weapons_ViewAnimation(SNIPER_HOLSTER);
|
||||
#else
|
||||
if (pl.sniper_mag >= 5) {
|
||||
return;
|
||||
}
|
||||
if (pl.ammo_sniper <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef CLIENT
|
||||
Weapons_ViewAnimation(SNIPER_HOLSTER);
|
||||
#else
|
||||
Sound_Play(pl, CHAN_WEAPON, "weapon_sniper.reload");
|
||||
Weapons_ReloadWeapon(pl, player::sniper_mag, player::ammo_sniper, 5);
|
||||
#endif
|
||||
|
||||
pl.a_ammo3 = 1;
|
||||
pl.ammo_handgrenade_state = 1;
|
||||
pl.w_attack_next = 2.5f;
|
||||
pl.w_idle_next = 2.0f;
|
||||
}
|
||||
|
@ -301,6 +285,16 @@ void
|
|||
w_sniper_hudpic(int selected, vector pos, float a)
|
||||
{
|
||||
#ifdef CLIENT
|
||||
player pl = (player)self;
|
||||
vector hud_col;
|
||||
|
||||
if (pl.sniper_mag == 0 && pl.ammo_sniper == 0)
|
||||
hud_col = [1,0,0];
|
||||
else
|
||||
hud_col = g_hud_color;
|
||||
|
||||
HUD_DrawAmmoBar(pos, pl.ammo_sniper, MAX_A_SNIPER, a);
|
||||
|
||||
if (selected) {
|
||||
drawsubpic(
|
||||
pos,
|
||||
|
@ -308,7 +302,7 @@ w_sniper_hudpic(int selected, vector pos, float a)
|
|||
"sprites/tfchud02.spr_0.tga",
|
||||
[0,45/256],
|
||||
[170/256,45/256],
|
||||
g_hud_color,
|
||||
hud_col,
|
||||
a,
|
||||
DRAWFLAG_ADDITIVE
|
||||
);
|
||||
|
@ -319,7 +313,7 @@ w_sniper_hudpic(int selected, vector pos, float a)
|
|||
"sprites/tfchud01.spr_0.tga",
|
||||
[0,45/256],
|
||||
[170/256,45/256],
|
||||
g_hud_color,
|
||||
hud_col,
|
||||
a,
|
||||
DRAWFLAG_ADDITIVE
|
||||
);
|
||||
|
@ -330,7 +324,7 @@ w_sniper_hudpic(int selected, vector pos, float a)
|
|||
weapon_t w_sniper =
|
||||
{
|
||||
.name = "sniper",
|
||||
.id = ITEM_SNIPER,
|
||||
.id = ITEM_SNIPER,
|
||||
.slot = 2,
|
||||
.slot_pos = 3,
|
||||
.draw = w_sniper_draw,
|
||||
|
|
|
@ -56,9 +56,7 @@ w_sniper2_pickup(int new, int startammo)
|
|||
void
|
||||
w_sniper2_updateammo(player pl)
|
||||
{
|
||||
#ifdef SERVER
|
||||
Weapons_UpdateAmmo(pl, pl.sniper_mag, pl.ammo_sniper, -1);
|
||||
#endif
|
||||
}
|
||||
|
||||
string
|
||||
|
@ -100,7 +98,7 @@ w_sniper2_release(void)
|
|||
|
||||
/* auto-reload if need be */
|
||||
if (pl.w_attack_next <= 0.0)
|
||||
if (pl.a_ammo1 == 0 && pl.a_ammo2 > 0) {
|
||||
if (pl.sniper_mag == 0 && pl.ammo_sniper > 0) {
|
||||
Weapons_Reload();
|
||||
return;
|
||||
}
|
||||
|
@ -134,30 +132,22 @@ w_sniper2_primary(void)
|
|||
}
|
||||
|
||||
/* Ammo check */
|
||||
#ifdef CLIENT
|
||||
if (pl.a_ammo1 <= 0) {
|
||||
return;
|
||||
}
|
||||
#else
|
||||
if (pl.sniper_mag <= 0) {
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
pl.sniper_mag--;
|
||||
|
||||
/* Actual firing */
|
||||
#ifdef CLIENT
|
||||
pl.a_ammo1--;
|
||||
View_SetMuzzleflash(MUZZLE_SMALL);
|
||||
Weapons_ViewPunchAngle([-20,0,0]);
|
||||
Weapons_ViewAnimation(SNIPER_FIRE);
|
||||
#else
|
||||
pl.sniper_mag--;
|
||||
TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 40, [0.008, 0.008], WEAPON_SNIPER);
|
||||
|
||||
Sound_Play(pl, CHAN_WEAPON, "weapon_sniper.fire");
|
||||
#endif
|
||||
|
||||
|
||||
/* Simple toggle of fovs */
|
||||
if (pl.viewzoom == 1.0f) {
|
||||
pl.w_attack_next = 0.1f;
|
||||
|
@ -182,24 +172,19 @@ w_sniper2_reload(void)
|
|||
if (pl.w_attack_next > 0.0) {
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef CLIENT
|
||||
if (pl.a_ammo1 >= 5) {
|
||||
return;
|
||||
}
|
||||
if (pl.a_ammo2 <= 0) {
|
||||
return;
|
||||
}
|
||||
Weapons_ViewAnimation(SNIPER_RELOAD);
|
||||
#else
|
||||
if (pl.sniper_mag >= 5) {
|
||||
return;
|
||||
}
|
||||
if (pl.ammo_sniper <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef CLIENT
|
||||
Weapons_ViewAnimation(SNIPER_RELOAD);
|
||||
#else
|
||||
Weapons_ReloadWeapon(pl, player::sniper_mag, player::ammo_sniper, 5);
|
||||
#endif
|
||||
|
||||
pl.w_attack_next = 3.82f;
|
||||
pl.w_idle_next = 5.0f;
|
||||
}
|
||||
|
@ -227,7 +212,7 @@ w_sniper2_hudpic(int selected, vector pos, float a)
|
|||
weapon_t w_sniper2 =
|
||||
{
|
||||
.name = "sniper2",
|
||||
.id = ITEM_SNIPER2,
|
||||
.id = ITEM_SNIPER2,
|
||||
.slot = 2,
|
||||
.slot_pos = 4,
|
||||
.draw = w_sniper2_draw,
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2016-2020 Marco Hladik <marco@icculus.org>
|
||||
* Copyright (c) 2016-2021 Marco Hladik <marco@icculus.org>
|
||||
* Copyright (c) 2019-2020 Gethyn ThomasQuail <xylemon@posteo.net>
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
|
|
|
@ -44,9 +44,7 @@ w_taurus_precache(void)
|
|||
void
|
||||
w_taurus_updateammo(player pl)
|
||||
{
|
||||
#ifdef SERVER
|
||||
Weapons_UpdateAmmo(pl, pl.taurus_mag, pl.ammo_taurus, -1);
|
||||
#endif
|
||||
}
|
||||
|
||||
string
|
||||
|
@ -113,29 +111,23 @@ w_taurus_primary(void)
|
|||
}
|
||||
|
||||
/* ammo check */
|
||||
#ifdef CLIENT
|
||||
if (!pl.a_ammo1) {
|
||||
return;
|
||||
}
|
||||
#else
|
||||
if (!pl.taurus_mag) {
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
pl.taurus_mag--;
|
||||
|
||||
/* actual firing */
|
||||
#ifdef CLIENT
|
||||
pl.a_ammo1--;
|
||||
View_SetMuzzleflash(MUZZLE_SMALL);
|
||||
Weapons_ViewPunchAngle([-2,0,0]);
|
||||
|
||||
if (pl.a_ammo1) {
|
||||
if (pl.taurus_mag) {
|
||||
Weapons_ViewAnimation(TAURUS_SHOOT);
|
||||
} else {
|
||||
Weapons_ViewAnimation(TAURUS_SHOOT_EMPTY);
|
||||
}
|
||||
#else
|
||||
pl.taurus_mag--;
|
||||
TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 12, [0.01,0.01], WEAPON_TAURUS);
|
||||
Sound_Play(pl, CHAN_WEAPON, "weapon_taurus.fire");
|
||||
|
||||
|
@ -163,21 +155,6 @@ w_taurus_reload(void)
|
|||
if (pl.w_attack_next > 0.0) {
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef CLIENT
|
||||
if (pl.a_ammo1 >= 10) {
|
||||
return;
|
||||
}
|
||||
if (pl.a_ammo2 <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (pl.a_ammo1) {
|
||||
Weapons_ViewAnimation(TAURUS_RELOAD);
|
||||
} else {
|
||||
Weapons_ViewAnimation(TAURUS_RELOAD2);
|
||||
}
|
||||
#else
|
||||
if (pl.taurus_mag >= 10) {
|
||||
return;
|
||||
}
|
||||
|
@ -185,6 +162,13 @@ w_taurus_reload(void)
|
|||
return;
|
||||
}
|
||||
|
||||
#ifdef CLIENT
|
||||
if (pl.taurus_mag) {
|
||||
Weapons_ViewAnimation(TAURUS_RELOAD);
|
||||
} else {
|
||||
Weapons_ViewAnimation(TAURUS_RELOAD2);
|
||||
}
|
||||
#else
|
||||
Weapons_ReloadWeapon(pl, player::taurus_mag, player::ammo_taurus, 10);
|
||||
#endif
|
||||
|
||||
|
@ -200,7 +184,7 @@ w_taurus_release(void)
|
|||
|
||||
/* auto-reload if need be */
|
||||
if (pl.w_attack_next <= 0.0)
|
||||
if (pl.a_ammo1 == 0 && pl.a_ammo2 > 0) {
|
||||
if (pl.taurus_mag == 0 && pl.ammo_taurus > 0) {
|
||||
Weapons_Reload();
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2016-2020 Marco Hladik <marco@icculus.org>
|
||||
* Copyright (c) 2016-2021 Marco Hladik <marco@icculus.org>
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
|
@ -152,18 +152,18 @@ void w_tnt_release(void)
|
|||
return;
|
||||
}
|
||||
|
||||
if (pl.a_ammo3 == 1) {
|
||||
if (pl.ammo_handgrenade_state == 1) {
|
||||
#ifdef CLIENT
|
||||
pl.a_ammo2--;
|
||||
pl.ammo_handgrenade--;
|
||||
Weapons_ViewAnimation(HANDGRENADE_THROW1);
|
||||
#else
|
||||
pl.ammo_handgrenade--;
|
||||
w_tnt_throw();
|
||||
#endif
|
||||
pl.a_ammo3 = 2;
|
||||
pl.ammo_handgrenade_state = 2;
|
||||
pl.w_attack_next = 1.0f;
|
||||
pl.w_idle_next = 0.5f;
|
||||
} else if (pl.a_ammo3 == 2) {
|
||||
} else if (pl.ammo_handgrenade_state == 2) {
|
||||
#ifdef CLIENT
|
||||
Weapons_ViewAnimation(HANDGRENADE_DRAW);
|
||||
#else
|
||||
|
@ -173,7 +173,7 @@ void w_tnt_release(void)
|
|||
#endif
|
||||
pl.w_attack_next = 0.5f;
|
||||
pl.w_idle_next = 0.5f;
|
||||
pl.a_ammo3 = 0;
|
||||
pl.ammo_handgrenade_state = 0;
|
||||
} else {
|
||||
int r = (float)input_sequence % 8;
|
||||
if (r == 1) {
|
||||
|
|
Loading…
Reference in a new issue