X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fcl_player.qc;h=7bb1d6851d4ad637ee64fef59b2a4d54df186c0a;hb=e6003fb86e11cc3d537395e7205bd9c4cf4d5567;hp=035114b25f23a9e62b34885927e9269c6330e003;hpb=57c2420916f58ef57b78062b070c3645b1872695;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/cl_player.qc b/qcsrc/server/cl_player.qc index 035114b25..7bb1d6851 100644 --- a/qcsrc/server/cl_player.qc +++ b/qcsrc/server/cl_player.qc @@ -188,6 +188,7 @@ void player_setupanimsformodel() self.anim_forwardleft = '20 1 1'; self.anim_backright = '21 1 1'; self.anim_backleft = '22 1 1'; + self.anim_melee = '23 1 1'; animparseerror = FALSE; animfilename = strcat(self.model, ".animinfo"); animfile = fopen(animfilename, FILE_READ); @@ -214,6 +215,7 @@ void player_setupanimsformodel() self.anim_forwardleft = animparseline(animfile); self.anim_backright = animparseline(animfile); self.anim_backleft = animparseline(animfile); + self.anim_melee = animparseline(animfile); fclose(animfile); // derived anims @@ -604,8 +606,6 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht { // 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); } @@ -627,6 +627,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht frag_inflictor = inflictor; frag_target = self; MUTATOR_CALLHOOK(PlayerDies); + weapon_action(self.weapon, WR_PLAYERDEATH); if(self.flagcarried) { @@ -722,7 +723,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht 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 @@ -734,152 +735,59 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht } } -float UpdateSelectedPlayer_countvalue(float v) +// sendflags use: 1 = health (value is 0 or 1 for dead/alive on enemies), 2 = armor, 0x80 = same team (includes health) +float SendEntity_ShowNames(entity to, float sendflags) { - return max(0, (v - 1.0) / 0.5); + float the_health; + the_health = self.health; + + WriteByte(MSG_ENTITY, ENT_CLIENT_SHOWNAMES); + WriteByte(MSG_ENTITY, num_for_edict(self.owner)); + + sendflags = sendflags & 127; + if(teams_matter && self.owner.team == to.team) + sendflags |= 128; + else if(self.owner.health >= 1) + the_health = 1; + + WriteByte(MSG_ENTITY, sendflags); + if(sendflags & 1) + { + WriteByte(MSG_ENTITY, the_health); + } + if(sendflags & 2) + { + WriteByte(MSG_ENTITY, self.armorvalue); + } + return TRUE; } -// returns: -2 if no hit, otherwise cos of the angle -// uses the global v_angle -float UpdateSelectedPlayer_canSee(entity p, float mincosangle, float maxdist) +void shownames_think() { - 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; - } + self.origin = self.owner.origin + '0 0 1' * 48; + if(self.health != max(0, floor(self.owner.health)) || self.armorvalue != max(0, floor(self.owner.armorvalue))) + { + self.health = max(0, floor(self.owner.health)); + self.armorvalue = max(0, floor(self.owner.armorvalue)); + self.SendFlags |= 1; + } + if(self.armorvalue != max(0, floor(self.owner.armorvalue))) + { + self.armorvalue = max(0, floor(self.owner.armorvalue)); + self.SendFlags |= 2; + } + self.nextthink = time; } -void UpdateSelectedPlayer() +float shownames_customize() { - 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.owner.classname == "player") // only send players, no spectators! + if(self.owner != other) // no need to spam own info + if(vlen(other.origin - self.origin) < autocvar_sv_shownames_cull_distance) // distance cull + if((teams_matter && self.owner.team == other.team) || checkpvs(self.origin, other)) + return TRUE; - if(self.selected_player) - self.last_selected_player = self.selected_player; + return FALSE; } .float muted; // to be used by prvm_edictset server playernumber muted 1