From: FruitieX Date: Wed, 13 Apr 2011 08:54:41 +0000 (+0300) Subject: holy crap it compiles X-Git-Tag: xonotic-v0.5.0~293 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=f9022df7c1157ff02082475bdc1d070b7c83a682;p=xonotic%2Fxonotic-data.pk3dir.git holy crap it compiles --- diff --git a/defaultXonotic.cfg b/defaultXonotic.cfg index 3de99c2fc..ae05e4b8d 100644 --- a/defaultXonotic.cfg +++ b/defaultXonotic.cfg @@ -1488,7 +1488,9 @@ seta hud_contents_water_color "0.4 0.3 0.3" seta hud_shownames 1 "draw names and health/armor of nearby players" seta hud_shownames_enemies 1 "also draw names of enemies" -seta hud_shownames_status 1 "draw health/armor status of teammates" +seta hud_shownames_status 2 "1 = draw health/armor status of teammates, 2 = same as 1, but draw health/armor icons with a question mark on enemies" +seta hud_shownames_height 10 "height in pixels" +seta hud_shownames_aspect 6 "aspect ratio" // scoreboard seta scoreboard_columns default diff --git a/qcsrc/client/Main.qc b/qcsrc/client/Main.qc index 1b0c36a64..4f45acc2d 100644 --- a/qcsrc/client/Main.qc +++ b/qcsrc/client/Main.qc @@ -907,7 +907,7 @@ void Ent_ReadAccuracy(void) } } -.float healthvalue, armorvalue; +.float healthvalue, armorvalue, isactive, sameteam; void Ent_ShowNames() { float sf, the_entnum; @@ -915,6 +915,13 @@ void Ent_ShowNames() sf = ReadByte(); the_entnum = ReadByte(); + if(sf & 4) // entity is out of range/culled by pvs, i.e. we do not need any origin/status info, only the knowledge that we should ignore this ent + { + playerslots[the_entnum-1].isactive = FALSE; + return; + } + playerslots[the_entnum-1].isactive = TRUE; // otherwise, player is in range + if(sf & 1) { playerslots[the_entnum-1].origin_x = ReadShort(); @@ -927,33 +934,10 @@ void Ent_ShowNames() playerslots[the_entnum-1].armorvalue = ReadByte(); } - /* - string thename; - float thehealth, thearmor; - - if(shownames_netname) - strunzone(shownames_netname); - thename = strzone(ReadString()); - thehealth = ReadByte(); - thearmor = ReadByte(); - - if(autocvar_hud_panel_shownames == 1 && thehealth > 0) // teammates only - { - shownames_netname = thename; - shownames_health = thehealth; - shownames_armor = thearmor; - - shownames_time = time + autocvar_hud_panel_shownames_sustain; - } - else if(autocvar_hud_panel_shownames == 2) - { - shownames_netname = thename; - shownames_health = thehealth; - shownames_armor = thearmor; - - shownames_time = time + autocvar_hud_panel_shownames_sustain; - } - */ + if(sf & 128) // same team + playerslots[the_entnum-1].sameteam = TRUE; + else + playerslots[the_entnum-1].sameteam = FALSE; } // CSQC_Ent_Update : Called every frame that the server has indicated an update to the SSQC / CSQC entity has occured. diff --git a/qcsrc/client/View.qc b/qcsrc/client/View.qc index 58b9e539b..ec01828fd 100644 --- a/qcsrc/client/View.qc +++ b/qcsrc/client/View.qc @@ -1548,6 +1548,7 @@ const float STAT_VEHICLESTAT_RELOAD2 = 66; } +void View_ShowNames(); void CSQC_common_hud(void) { @@ -1559,6 +1560,8 @@ void CSQC_common_hud(void) switch(hud) { case HUD_NORMAL: + View_ShowNames(); + // do some accuracy var caching float i; if(!(gametype == GAME_RACE || gametype == GAME_CTS)) @@ -1605,10 +1608,12 @@ void CSQC_common_hud(void) break; case HUD_SPIDERBOT: + View_ShowNames(); CSQC_SPIDER_HUD(); break; case HUD_WAKIZASHI: + View_ShowNames(); CSQC_WAKIZASHI_HUD(); break; } diff --git a/qcsrc/client/autocvars.qh b/qcsrc/client/autocvars.qh index b9ea7b4ba..11c1ff96e 100644 --- a/qcsrc/client/autocvars.qh +++ b/qcsrc/client/autocvars.qh @@ -242,8 +242,6 @@ float autocvar_hud_panel_radar_scale; float autocvar_hud_panel_radar_zoommode; float autocvar_hud_panel_score; float autocvar_hud_panel_score_rankings; -float autocvar_hud_panel_shownames; -float autocvar_hud_panel_shownames_sustain; float autocvar_hud_panel_timer; float autocvar_hud_panel_timer_increment; float autocvar_hud_panel_vote; @@ -274,6 +272,11 @@ float autocvar_hud_panel_weapons_timeout_effect; float autocvar_hud_progressbar_alpha; float autocvar_hud_showbinds; float autocvar_hud_showbinds_limit; +float autocvar_hud_shownames; +float autocvar_hud_shownames_enemies; +float autocvar_hud_shownames_status; +float autocvar_hud_shownames_height; +float autocvar_hud_shownames_aspect; string autocvar_hud_skin; float autocvar_loddebug; float autocvar_menu_mouse_speed; diff --git a/qcsrc/client/progs.src b/qcsrc/client/progs.src index e8a9a8e9f..b219de5a8 100644 --- a/qcsrc/client/progs.src +++ b/qcsrc/client/progs.src @@ -63,6 +63,7 @@ Main.qc View.qc interpolate.qc waypointsprites.qc +shownames.qc movetypes.qc prandom.qc bgmscript.qc diff --git a/qcsrc/client/shownames.qc b/qcsrc/client/shownames.qc index 7b59e35e9..9479584e2 100644 --- a/qcsrc/client/shownames.qc +++ b/qcsrc/client/shownames.qc @@ -1,243 +1,101 @@ -void Draw_WaypointSprite() +// playerslots[i].isactive = player is in range and coordinates/status (health and armor) are up to date +// playerslots[i].origin = player origin TODO: should maybe move this so it's the origin of the shownames tag already in SSQC for culling? +// playerslots[i].healthvalue +// playerslots[i].armorvalue +// playerslots[i].sameteam = player is on same team as local client +// +void View_ShowNames() { if(!autocvar_hud_shownames) return; - string spriteimage; - float t; - - if(self.lifetime) - self.alpha = pow(bound(0, (self.fadetime - time) / self.lifetime, 1), waypointsprite_timealphaexponent); - else - self.alpha = 1; - - if(self.hideflags & 2) - return; // radar only - - if(autocvar_cl_hidewaypoints >= 2) - return; - - if(self.hideflags & 1) - if(autocvar_cl_hidewaypoints) - return; // fixed waypoint - - InterpolateOrigin_Do(); - - t = GetPlayerColor(player_localentnum - 1) + 1; - - spriteimage = ""; - - // choose the sprite - switch(self.rule) + float i; + for(i = 0; i <= 255; ++i) // 255 players is engine limit { - case SPRITERULE_DEFAULT: - if(self.team) - { - if(self.team == t) - spriteimage = self.netname; - else - spriteimage = ""; - } - else - spriteimage = self.netname; - break; - case SPRITERULE_TEAMPLAY: - if(t == COLOR_SPECTATOR + 1) - spriteimage = self.netname3; - else if(self.team == t) - spriteimage = self.netname2; - else - spriteimage = self.netname; - break; - default: - error("Invalid waypointsprite rule!"); - break; - } - - if(spriteimage == "") - return; - - float dist; - dist = vlen(self.origin - view_origin); - - float a; - a = self.alpha * autocvar_hud_panel_fg_alpha; - - if(self.maxdistance > waypointsprite_normdistance) - a *= pow(bound(0, (self.maxdistance - dist) / (self.maxdistance - waypointsprite_normdistance), 1), waypointsprite_distancealphaexponent); - else if(self.maxdistance > 0) - a *= pow(bound(0, (waypointsprite_fadedistance - dist) / (waypointsprite_fadedistance - waypointsprite_normdistance), 1), waypointsprite_distancealphaexponent) * (1 - waypointsprite_minalpha) + waypointsprite_minalpha; - - if(a <= 0) - return; - - // draw the sprite image - vector o; - float rot; - o = project_3d_to_2d(self.origin); - rot = 0; - - if(o_z < 0 || o_x < 0 || o_y < 0 || o_x > vid_conwidth || o_y > vid_conheight) - { - // scale it to be just in view - vector d; - float f1, f2; - - // get the waypoint angle vector - /* - d_x = view_right * (self.origin - view_origin) * vid_conwidth / vid_width; - d_y = -view_up * (self.origin - view_origin) * vid_conheight / (vid_height * vid_pixelheight); - d_z = 0; - */ - - d = o - '0.5 0 0' * vid_conwidth - '0 0.5 0' * vid_conheight; - - /* - if(autocvar_v_flipped) - d_x = -d_x; - */ - - f1 = d_x / vid_conwidth; - f2 = d_y / vid_conheight; - - if(max(f1, -f1) > max(f2, -f2)) - { - if(d_z * f1 > 0) - { - // RIGHT edge - d = d * (0.5 / f1); - rot = 3; - } - else - { - // LEFT edge - d = d * (-0.5 / f1); - rot = 1; - } - } - else + if(playerslots[i].isactive) // are the player coordinates/status current? + if(playerslots[i].sameteam || (!playerslots[i].sameteam && autocvar_hud_shownames_enemies)) { - if(d_z * f2 > 0) - { - // BOTTOM edge - d = d * (0.5 / f2); - rot = 0; - } - else - { - // TOP edge - d = d * (-0.5 / f2); - rot = 2; - } - } - - o = d + '0.5 0 0' * vid_conwidth + '0 0.5 0' * vid_conheight; - } - o_z = 0; + float t; - float vidscale; - vidscale = max(vid_conwidth / vid_width, vid_conheight / vid_height); + float a; + a = autocvar_hud_panel_fg_alpha; - t = stof(db_get(tempdb, strcat("/spriteframes/", spriteimage))); - if(t == 0) - spriteimage = strcat("models/sprites/", spriteimage); - else - spriteimage = strcat("models/sprites/", spriteimage, "_frame", ftos(mod(floor((max(0, time - self.spawntime)) * 2), t))); + t = GetPlayerColor(player_localentnum - 1) + 1; - float edgedistance_min, crosshairdistance; - edgedistance_min = min4(o_y, o_x,vid_conwidth - o_x, vid_conheight - o_y); + float dist; + dist = vlen(self.origin - view_origin); + - crosshairdistance = sqrt( pow(o_x - vid_conwidth/2, 2) + pow(o_y - vid_conheight/2, 2) ); + if(self.maxdistance > waypointsprite_normdistance) + a *= pow(bound(0, (self.maxdistance - dist) / (self.maxdistance - waypointsprite_normdistance), 1), waypointsprite_distancealphaexponent); + else if(self.maxdistance > 0) + a *= pow(bound(0, (waypointsprite_fadedistance - dist) / (waypointsprite_fadedistance - waypointsprite_normdistance), 1), waypointsprite_distancealphaexponent) * (1 - waypointsprite_minalpha) + waypointsprite_minalpha; - t = waypointsprite_scale * vidscale; - a *= waypointsprite_alpha; + if(a <= 0) + return; + + entity oldself; + oldself = self; + self = playerslots[i]; + InterpolateOrigin_Do(); + self = oldself; - { - a = a * (1 - (1 - waypointsprite_distancefadealpha) * (bound(0, dist/waypointsprite_distancefadedistance, 1))); - t = t * (1 - (1 - waypointsprite_distancefadescale) * (bound(0, dist/waypointsprite_distancefadedistance, 1))); - } - if (edgedistance_min < waypointsprite_edgefadedistance) { - a = a * (1 - (1 - waypointsprite_edgefadealpha) * (1 - bound(0, edgedistance_min/waypointsprite_edgefadedistance, 1))); - t = t * (1 - (1 - waypointsprite_edgefadescale) * (1 - bound(0, edgedistance_min/waypointsprite_edgefadedistance, 1))); - } - if(crosshairdistance < waypointsprite_crosshairfadedistance) { - a = a * (1 - (1 - waypointsprite_crosshairfadealpha) * (1 - bound(0, crosshairdistance/waypointsprite_crosshairfadedistance, 1))); - t = t * (1 - (1 - waypointsprite_crosshairfadescale) * (1 - bound(0, crosshairdistance/waypointsprite_crosshairfadedistance, 1))); - } - drawrotpic(o, rot * 90 * DEG2RAD, spriteimage, SPRITE_SIZE * t, SPRITE_HOTSPOT * t, '1 1 1', a, DRAWFLAG_MIPMAP); + // draw the sprite image + vector o; + o = project_3d_to_2d(playerslots[i].origin); - if(self.build_finished) - { - if(time < self.build_finished + 0.25) - { - if(time < self.build_started) - self.health = self.build_starthealth; - else if(time < self.build_finished) - self.health = (time - self.build_started) / (self.build_finished - self.build_started) * (1 - self.build_starthealth) + self.build_starthealth; - else - self.health = 1; - } - else - self.health = -1; - } + o_z = 0; - if(self.health >= 0) - { - float align; - if(self.build_finished) - align = 0.5; - else - align = 0; - drawhealthbar(o, rot * 90 * DEG2RAD, self.health, SPRITE_SIZE * t, SPRITE_HOTSPOT * t, SPRITE_HEALTHBAR_WIDTH * t, SPRITE_HEALTHBAR_HEIGHT * t, SPRITE_HEALTHBAR_MARGIN * t, SPRITE_HEALTHBAR_BORDER * t, align, self.teamradar_color, a * SPRITE_HEALTHBAR_BORDERALPHA, self.teamradar_color, a * SPRITE_HEALTHBAR_HEALTHALPHA, DRAWFLAG_NORMAL); - } -} + vector myPos, mySize; + mySize = (eX * autocvar_hud_shownames_aspect + eY) * autocvar_hud_shownames_height; + myPos = o - '0.5 0 0' * mySize_x - '0 1 0' * mySize_y; -float shownames_alpha; -void HUD_ShowNames(void) -{ - // for each playerslot etc + vector iconpos, iconsize; + vector namepos, namesize; - vector iconpos, iconsize; - vector namepos, namesize; - if(mySize_x/mySize_y > 6) - { - iconpos = myPos; - iconsize = eX * 2 * mySize_y + eY * mySize_y; + iconpos = myPos; - namepos = myPos + eX * 2 * mySize_y; - namesize = eX * mySize_x - eX * 2 * mySize_y + eY * mySize_y; - } - else - { - iconpos = myPos + eX * 0.5 * mySize_x - eX * 0.5 * mySize_y; - iconsize = eX * mySize_y + eY * 0.5 * mySize_y; - - namepos = myPos + eY * 0.5 * mySize_y; - namesize = eX * mySize_x + eY * 0.5 * mySize_y; - } + if(autocvar_hud_shownames_status) + { + if(playerslots[i].sameteam) + { + iconsize = eX * 2 * mySize_y + eY * mySize_y; + // "ghost" backgrounds + drawpic_aspect_skin(iconpos, "health", '1 1 0' * iconsize_y, '0 0 0', a * 0.5, DRAWFLAG_NORMAL); + drawpic_aspect_skin(iconpos + '0.5 0 0' * iconsize_x, "armor", '1 1 0' * iconsize_y, '0 0 0', a * 0.5, DRAWFLAG_NORMAL); + + drawsetcliparea(0, myPos_y + iconsize_y - iconsize_y * min(1, playerslots[i].healthvalue/autocvar_hud_panel_healtharmor_maxhealth), vid_conwidth, myPos_y + iconsize_y); + drawpic_aspect_skin(iconpos, "health", '1 1 0' * iconsize_y, '1 1 1', a, DRAWFLAG_NORMAL); + + drawsetcliparea(0, myPos_y + iconsize_y - iconsize_y * min(1, playerslots[i].armorvalue/autocvar_hud_panel_healtharmor_maxarmor), vid_conwidth, myPos_y + iconsize_y); + drawpic_aspect_skin(iconpos + '0.5 0 0' * iconsize_x, "armor", '1 1 0' * iconsize_y, '1 1 1', a, DRAWFLAG_NORMAL); + drawresetcliparea(); + } + else if(autocvar_hud_shownames_status == 2) + { + iconsize = eX * 2 * mySize_y + eY * mySize_y; + drawpic_aspect_skin(iconpos, "health_unknown", '1 1 0' * iconsize_y, '0 0 0', a, DRAWFLAG_NORMAL); + drawpic_aspect_skin(iconpos + '0.5 0 0' * iconsize_x, "armor_unknown", '1 1 0' * iconsize_y, '0 0 0', a, DRAWFLAG_NORMAL); + } + } - if(shownames_health > 0) // otherwise player is an enemy - { - // "ghost" backgrounds - drawpic_aspect_skin(iconpos, "health", '1 1 0' * iconsize_y, '0 0 0', panel_fg_alpha * 0.5, DRAWFLAG_NORMAL); - drawpic_aspect_skin(iconpos + '0.5 0 0' * iconsize_x, "armor", '1 1 0' * iconsize_y, '0 0 0', panel_fg_alpha * 0.5, DRAWFLAG_NORMAL); + namepos = myPos + eX * 2 * iconsize_y; + namesize = eX * mySize_x - eX * 2 * iconsize_y + eY * mySize_y; - drawsetcliparea(0, myPos_y + iconsize_y - iconsize_y * min(1, shownames_health/autocvar_hud_panel_healtharmor_maxhealth), vid_conwidth, myPos_y + iconsize_y); - drawpic_aspect_skin(iconpos, "health", '1 1 0' * iconsize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + drawcolorcodedstring_aspect(namepos, GetPlayerName(i), namesize, a, DRAWFLAG_NORMAL); - drawsetcliparea(0, myPos_y + iconsize_y - iconsize_y * min(1, shownames_armor/autocvar_hud_panel_healtharmor_maxarmor), vid_conwidth, myPos_y + iconsize_y); - drawpic_aspect_skin(iconpos + '0.5 0 0' * iconsize_x, "armor", '1 1 0' * iconsize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); - drawresetcliparea(); - } - else - { - drawpic_aspect_skin(iconpos, "health_unknown", '1 1 0' * iconsize_y, '0 0 0', panel_fg_alpha, DRAWFLAG_NORMAL); - drawpic_aspect_skin(iconpos + '0.5 0 0' * iconsize_x, "armor_unknown", '1 1 0' * iconsize_y, '0 0 0', panel_fg_alpha, DRAWFLAG_NORMAL); + /* Or maybe a health bar instead? + * + if(self.health >= 0) + { + float align; + if(self.build_finished) + align = 0.5; + else + align = 0; + drawhealthbar(o, rot * 90 * DEG2RAD, self.health, SPRITE_SIZE * t, SPRITE_HOTSPOT * t, SPRITE_HEALTHBAR_WIDTH * t, SPRITE_HEALTHBAR_HEIGHT * t, SPRITE_HEALTHBAR_MARGIN * t, SPRITE_HEALTHBAR_BORDER * t, align, self.teamradar_color, a * SPRITE_HEALTHBAR_BORDERALPHA, self.teamradar_color, a * SPRITE_HEALTHBAR_HEALTHALPHA, DRAWFLAG_NORMAL); + } + */ + } } - - if(autocvar__hud_configure) - drawcolorcodedstring_aspect(namepos, "Player1234", namesize, panel_fg_alpha, DRAWFLAG_NORMAL); - else - drawcolorcodedstring_aspect(namepos, shownames_netname, namesize, panel_fg_alpha, DRAWFLAG_NORMAL); } - diff --git a/qcsrc/server/cl_player.qc b/qcsrc/server/cl_player.qc index 0f5db8b65..0d57e3a3a 100644 --- a/qcsrc/server/cl_player.qc +++ b/qcsrc/server/cl_player.qc @@ -732,13 +732,20 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht } } -// sendflags use: 1 = origin, 2 = health/armor, 0x80 = same team (includes health) +// sendflags use: 1 = origin, 2 = health/armor, 0x80 = same team (includes health), 4 = entity out of range/culled float SendEntity_ShowNames(entity to, float sendflags) { - if(vlen(to.origin - self.origin) < autocvar_sv_shownames_cull_distance) // distance cull - return FALSE; + if(self.owner == to) // no need to spam own coordinates/health + return TRUE; WriteByte(MSG_ENTITY, ENT_CLIENT_SHOWNAMES); + if(vlen(to.origin - self.origin) < autocvar_sv_shownames_cull_distance) + { + WriteByte(MSG_ENTITY, sendflags | 4); + WriteByte(MSG_ENTITY, num_for_edict(self.owner)); + return FALSE; + } + sendflags = sendflags & 127; if(teams_matter && self.owner.team == to.team) sendflags |= 128;