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);
self.anim_forwardleft = animparseline(animfile);
self.anim_backright = animparseline(animfile);
self.anim_backleft = animparseline(animfile);
+ self.anim_melee = animparseline(animfile);
fclose(animfile);
// derived anims
frag_inflictor = inflictor;
frag_target = self;
MUTATOR_CALLHOOK(PlayerDies);
+ weapon_action(self.weapon, WR_PLAYERDEATH);
if(self.flagcarried)
{
}
}
-void net_shownames(entity selected, float teammate)
+// sendflags use: 1 = origin, 2 = health (0 or 1 for dead/alive on enemies), 4 = armor, 0x80 = same team (includes health)
+float SendEntity_ShowNames(entity to, float sendflags)
{
- float teammate_health, teammate_armor;
- if(teammate)
+ 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)
{
- teammate_health = selected.health;
- teammate_armor = selected.armorvalue;
+ WriteShort(MSG_ENTITY, rint(self.origin_x));
+ WriteShort(MSG_ENTITY, rint(self.origin_y));
+ WriteShort(MSG_ENTITY, rint(self.origin_z));
}
-
- msg_entity = self;
- WRITESPECTATABLE_MSG_ONE({
- WriteByte(MSG_ONE, SVC_TEMPENTITY);
- WriteByte(MSG_ONE, TE_CSQC_SHOWNAMES);
- WriteString(MSG_ONE, playername(selected));
- WriteByte(MSG_ONE, teammate_health);
- WriteByte(MSG_ONE, teammate_armor);
- });
+ if(sendflags & 2)
+ {
+ WriteByte(MSG_ENTITY, the_health);
+ }
+ if(sendflags & 4)
+ {
+ WriteByte(MSG_ENTITY, self.armorvalue);
+ }
+ return TRUE;
}
-void UpdateSelectedPlayer()
+const vector SHOWNAMES_ORIGIN_OFFSET = '0 0 48';
+void shownames_think()
{
- entity selected;
- selected = world;
-
- if(!autocvar_sv_allow_shownames)
- return;
-
- if(clienttype(self) != CLIENTTYPE_REAL)
- return;
-
- if(self.cvar_cl_shownames == 0)
- return;
-
- makevectors(self.v_angle); // sets v_forward
-
- // cursor trace
- if(self.selected_player_display_timeout < time)
+ if(self.origin - SHOWNAMES_ORIGIN_OFFSET != self.owner.origin)
{
- WarpZone_crosshair_trace(self);
- if(trace_ent && trace_ent.classname == "player" && !trace_ent.deadflag)
- {
- selected = trace_ent;
- self.last_selected_player = selected;
- self.selected_player_display_timeout = time + 0.1; // update at 0.1s intervals
- }
+ setorigin(self, self.owner.origin + SHOWNAMES_ORIGIN_OFFSET);
+ self.SendFlags |= 1;
}
-
- if(selected)
- {
- if(teams_matter && self.team == selected.team)
- net_shownames(selected, 1);
- else
- net_shownames(selected, 0);
+ 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 |= 2;
}
+ if(self.armorvalue != max(0, floor(self.owner.armorvalue)))
+ {
+ self.armorvalue = max(0, floor(self.owner.armorvalue));
+ self.SendFlags |= 4;
+ }
+ self.nextthink = time;
+}
+
+float shownames_customize()
+{
+ if(self.owner.classname == "player") // only send players, no spectators!
+ if(self.owner != other) // no need to spam own coordinates
+ if(vlen(other.origin - self.origin) < autocvar_sv_shownames_cull_distance) // distance cull
+ if(self.owner.team == other.team || (self.owner.team != other.team && checkpvs(self.origin, other)))
+ return TRUE;
+
+ return FALSE;
}
.float muted; // to be used by prvm_edictset server playernumber muted 1