]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
holy crap it compiles
authorFruitieX <fruitiex@gmail.com>
Wed, 13 Apr 2011 08:54:41 +0000 (11:54 +0300)
committerFruitieX <fruitiex@gmail.com>
Wed, 13 Apr 2011 08:54:41 +0000 (11:54 +0300)
defaultXonotic.cfg
qcsrc/client/Main.qc
qcsrc/client/View.qc
qcsrc/client/autocvars.qh
qcsrc/client/progs.src
qcsrc/client/shownames.qc
qcsrc/server/cl_player.qc

index 3de99c2fc54a22f2d0b77a59cbd2f34467c5423d..ae05e4b8de7dbb0f45ef99f9ce0214cb904f2059 100644 (file)
@@ -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
index 1b0c36a646448ece99e7c9c142dd80f71620fb10..4f45acc2deb99cb19bfac5a2b605c4104b90561d 100644 (file)
@@ -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.
index 58b9e539bc5d8f45c9b4e4f6309ebe5160e954ed..ec01828fded4afe920c104012de46563a65ebae8 100644 (file)
@@ -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;
        }
index b9ea7b4baf4560bfe6b5ed765a2e1c98e202bfc4..11c1ff96efa07f481bb2d760b30f561d65dd7a28 100644 (file)
@@ -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;
index e8a9a8e9fa30a6fc1ff5d96da5f5fa7bd82a60a3..b219de5a8fccca9f6514c5d53229ac945eadf805 100644 (file)
@@ -63,6 +63,7 @@ Main.qc
 View.qc
 interpolate.qc
 waypointsprites.qc
+shownames.qc
 movetypes.qc
 prandom.qc
 bgmscript.qc
index 7b59e35e99365ac7db2a96ad71ac15deb16325df..9479584e2e4892a914235940166526aa86852413 100644 (file)
-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);
 }
-
index 0f5db8b65d88b4a25315732e6d96c8013d655ed1..0d57e3a3aa6747f574e18ab7f9582fc730b269eb 100644 (file)
@@ -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;