+.entity accuracy;
+.float accuracy_frags[WEP_MAXCOUNT];
+FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(accuracy_frags);
+
float weaponstats_buffer;
void WeaponStats_Init()
self.anim_forwardleft = '20 1 1';
self.anim_backright = '21 1 1';
self.anim_backleft = '22 1 1';
+ self.anim_melee = '23 1 1';
+ self.anim_fly = '24 1 1';
animparseerror = FALSE;
animfilename = strcat(self.model, ".animinfo");
animfile = fopen(animfilename, FILE_READ);
self.anim_forwardleft = animparseline(animfile);
self.anim_backright = animparseline(animfile);
self.anim_backleft = animparseline(animfile);
+ self.anim_melee = animparseline(animfile);
+ self.anim_fly = animparseline(animfile);
fclose(animfile);
// derived anims
if (!self.animstate_override)
{
- if (!(self.flags & FL_ONGROUND))
+ if (!(self.flags & FL_ONGROUND) || self.BUTTON_JUMP)
{
- if (self.crouch)
- setanim(self, self.anim_duckjump, FALSE, TRUE, self.restart_jump);
- else
- setanim(self, self.anim_jump, FALSE, TRUE, self.restart_jump);
- self.restart_jump = FALSE;
+ if((self.animstate_startframe == self.anim_jump_x && time - self.animstate_starttime >= 21/25) || (self.animstate_startframe == self.anim_duckjump_x && time - self.animstate_starttime >= 21/25))
+ setanim(self, self.anim_fly, TRUE, FALSE, FALSE);
+
+ if(self.animstate_startframe != self.anim_fly_x) // no tracing if we're in the fly anim
+ {
+ if (self.crouch && self.animstate_startframe != self.anim_duckjump_x) // don't perform another trace if already playing the crouch jump anim
+ {
+ traceline(self.origin + '0 0 1' * PL_CROUCH_MIN_z, self.origin + '0 0 1' * (PL_CROUCH_MIN_z - autocvar_sv_player_jumpanim_minfall), TRUE, self);
+ if(!trace_startsolid && trace_fraction == 1 || self.animstate_startframe == self.anim_idle_x) // don't get stuck on idle animation in midair
+ {
+ setanim(self, self.anim_duckjump, FALSE, TRUE, self.restart_jump);
+ self.restart_jump = FALSE;
+ }
+ }
+ else if (self.animstate_startframe != self.anim_jump_x) // don't perform another trace if already playing the jump anim
+ {
+ traceline(self.origin + '0 0 1' * PL_MIN_z, self.origin + '0 0 1' * (PL_MIN_z - autocvar_sv_player_jumpanim_minfall), TRUE, self);
+ if(!trace_startsolid && trace_fraction == 1 || self.animstate_startframe == self.anim_idle_x) // don't get stuck on idle animation in midair
+ {
+ setanim(self, self.anim_jump, FALSE, TRUE, self.restart_jump);
+ self.restart_jump = FALSE;
+ }
+ }
+ }
}
else if (self.crouch)
{
if(sv_gentle < 1) {
if(self.classname != "body") // pain anim is BORKED on our ZYMs, FIXME remove this once we have good models
{
- if (random() > 0.5)
- setanim(self, self.anim_pain1, FALSE, TRUE, TRUE);
- else
- setanim(self, self.anim_pain2, FALSE, TRUE, TRUE);
+ if (!self.animstate_override)
+ {
+ if (random() > 0.5)
+ setanim(self, self.anim_pain1, FALSE, TRUE, TRUE);
+ else
+ setanim(self, self.anim_pain2, FALSE, TRUE, TRUE);
+ }
}
if(sound_allowed(MSG_BROADCAST, attacker))
{
// become fully visible
self.alpha = 1;
- // clear selected player display
- ClearSelectedPlayer();
// throw a weapon
SpawnThrownWeapon (self.origin + (self.mins + self.maxs) * 0.5, self.switchweapon);
}
race_PreDie();
DropAllRunes(self);
+ // increment frag counter for used weapon type
+ float w;
+ w = DEATH_WEAPONOF(deathtype);
+ if(WEP_VALID(w))
+ if(self.classname == "player")
+ if(self != attacker)
+ attacker.accuracy.(accuracy_frags[w-1]) += 1;
+
if(deathtype == DEATH_HURTTRIGGER && g_freezetag)
{
PutClientInServer();
frag_inflictor = inflictor;
frag_target = self;
MUTATOR_CALLHOOK(PlayerDies);
+ weapon_action(self.weapon, WR_PLAYERDEATH);
if(self.flagcarried)
{
if(sv_gentle > 0 || autocvar_ekg) {
// remove corpse
- PlayerCorpseDamage (inflictor, attacker, 100.0, deathtype, hitloc, force);
+ PlayerCorpseDamage (inflictor, attacker, autocvar_sv_gibhealth+1.0, deathtype, hitloc, force);
}
// reset fields the weapons may use just in case
}
}
-float UpdateSelectedPlayer_countvalue(float v)
-{
- return max(0, (v - 1.0) / 0.5);
-}
-
-// returns: -2 if no hit, otherwise cos of the angle
-// uses the global v_angle
-float UpdateSelectedPlayer_canSee(entity p, float mincosangle, float maxdist)
-{
- vector so, d;
- float c;
-
- if(p == self)
- return -2;
-
- if(p.deadflag)
- return -2;
-
- so = self.origin + self.view_ofs;
- d = p.origin - so;
-
- // misaimed?
- if(dist_point_line(d, '0 0 0', v_forward) > maxdist)
- return -2;
-
- // now find the cos of the angle...
- c = normalize(d) * v_forward;
-
- if(c <= mincosangle)
- return -2;
-
- // not visible in any way? forget it
- if(!checkpvs(so, p))
- return -2;
-
- traceline(so, p.origin, MOVE_NOMONSTERS, self);
- if(trace_fraction < 1)
- return -2;
-
- return c;
-}
-
-void ClearSelectedPlayer()
-{
- if(self.selected_player)
- {
- centerprint_expire(self, CENTERPRIO_POINT);
- self.selected_player = world;
- self.selected_player_display_needs_update = FALSE;
- }
-}
-
-void UpdateSelectedPlayer()
-{
- entity selected;
- float selected_score;
- selected = world;
- selected_score = 0.95; // 18 degrees
-
- if(!autocvar_sv_allow_shownames)
- return;
-
- if(clienttype(self) != CLIENTTYPE_REAL)
- return;
-
- if(self.cvar_cl_shownames == 0)
- return;
-
- if(self.cvar_cl_shownames == 1 && !teams_matter)
- return;
-
- makevectors(self.v_angle); // sets v_forward
-
- // 1. cursor trace is always right
- WarpZone_crosshair_trace(self);
- if(trace_ent && trace_ent.classname == "player" && !trace_ent.deadflag)
- {
- selected = trace_ent;
- }
- else
- {
- // 2. if we don't have a cursor trace, find the player which is least
- // mis-aimed at
- entity p;
- FOR_EACH_PLAYER(p)
- {
- float c;
- c = UpdateSelectedPlayer_canSee(p, selected_score, 100); // 100 = 2.5 meters
- if(c >= -1)
- {
- selected = p;
- selected_score = c;
- }
- }
- }
-
- if(selected)
- {
- self.selected_player_display_timeout = time + self.cvar_scr_centertime;
- }
- else
- {
- if(time < self.selected_player_display_timeout)
- if(UpdateSelectedPlayer_canSee(self.selected_player, 0.7, 200) >= -1) // 5 meters, 45 degrees
- selected = self.selected_player;
- }
-
- if(selected)
- {
- if(selected == self.selected_player)
- {
- float save;
- save = UpdateSelectedPlayer_countvalue(self.selected_player_count);
- self.selected_player_count = self.selected_player_count + frametime;
- if(save != UpdateSelectedPlayer_countvalue(self.selected_player_count))
- {
- string namestr, healthstr;
- namestr = playername(selected);
- if(teams_matter)
- {
- healthstr = ftos(floor(selected.health));
- if(self.team == selected.team)
- {
- namestr = strcat(namestr, " (", healthstr, "%)");
- self.selected_player_display_needs_update = TRUE;
- }
- }
- centerprint_atprio(self, CENTERPRIO_POINT, namestr);
- }
- }
- else
- {
- ClearSelectedPlayer();
- self.selected_player = selected;
- self.selected_player_time = time;
- self.selected_player_count = 0;
- self.selected_player_display_needs_update = FALSE;
- }
- }
- else
- {
- ClearSelectedPlayer();
- }
-
- if(self.selected_player)
- self.last_selected_player = self.selected_player;
-}
-
.float muted; // to be used by prvm_edictset server playernumber muted 1
float Say(entity source, float teamsay, entity privatesay, string msgin, float floodcontrol)
// message "": do not say, just test flood control