]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into z411/bai-server
authorz411 <z411@omaera.org>
Thu, 20 Oct 2022 03:18:00 +0000 (00:18 -0300)
committerz411 <z411@omaera.org>
Thu, 20 Oct 2022 03:18:00 +0000 (00:18 -0300)
25 files changed:
1  2 
gamemodes-server.cfg
qcsrc/client/hud/panel/scoreboard.qc
qcsrc/client/main.qc
qcsrc/common/constants.qh
qcsrc/common/gamemodes/gamemode/clanarena/clanarena.qh
qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qc
qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qh
qcsrc/common/gamemodes/gamemode/ctf/sv_ctf.qc
qcsrc/common/gamemodes/gamemode/freezetag/freezetag.qh
qcsrc/common/mapinfo.qh
qcsrc/common/mutators/mutator/overkill/oknex.qc
qcsrc/common/scores.qh
qcsrc/common/stats.qh
qcsrc/common/weapons/weapon/devastator.qc
qcsrc/common/weapons/weapon/electro.qc
qcsrc/common/weapons/weapon/mortar.qc
qcsrc/common/weapons/weapon/shotgun.qc
qcsrc/common/weapons/weapon/vaporizer.qc
qcsrc/common/weapons/weapon/vortex.qc
qcsrc/server/command/sv_cmd.qc
qcsrc/server/damage.qc
qcsrc/server/scores.qc
qcsrc/server/world.qc
qcsrc/server/world.qh
xonotic-server.cfg

Simple merge
Simple merge
Simple merge
Simple merge
index d1608e307a97d3b319e805c0289f86ab911cf6dc,d64ce3604a293b4221d21ab5c1de21da31a32bac..bbffd0f4b2e03edb7388d3062d321d1af40ed14f
@@@ -51,36 -45,94 +52,110 @@@ void CA_count_alive_players(
  
  void nades_Clear(entity player);
  
 +entity ca_LastPlayer(float tm)
 +{
 +      entity last_pl = NULL;
 +      FOREACH_CLIENT(IS_PLAYER(it) && it.team == tm, {
 +              if (!IS_DEAD(it))
 +              {
 +                      if (!last_pl)
 +                              last_pl = it;
 +                      else
 +                              return NULL;
 +              }
 +      });
 +      return last_pl;
 +}
 +
 +
+ int CA_PreventStalemate()
+ {
+       //LOG_INFO("PreventStalemate running");
+       int winnerTeam = 0;
+       int secondTeam = 0;
+       for(int i = 1; i <= AVAILABLE_TEAMS; i++)
+       {
+               if(!winnerTeam || Team_GetNumberOfAlivePlayers(Team_GetTeamFromIndex(i)) > Team_GetNumberOfAlivePlayers(Team_GetTeam(winnerTeam)))
+               {
+                       secondTeam = winnerTeam;
+                       winnerTeam = Team_IndexToTeam(i);
+               }
+               else
+               {
+                       if(!secondTeam || Team_GetNumberOfAlivePlayers(Team_GetTeamFromIndex(i)) > Team_GetNumberOfAlivePlayers(Team_GetTeam(secondTeam)))
+                               secondTeam = Team_IndexToTeam(i);
+               }
+       }
+       if(Team_GetNumberOfAlivePlayers(Team_GetTeam(winnerTeam)) != Team_GetNumberOfAlivePlayers(Team_GetTeam(secondTeam)))
+       {
+               LOG_INFOF("Stalemate broken by alive players. Best team: %s%s (%d)^7 - Trailing team: %s%s (%d)",
+                       Team_ColorCode(winnerTeam), Team_ColorName(winnerTeam), Team_GetNumberOfAlivePlayers(Team_GetTeam(winnerTeam)),
+                       Team_ColorCode(secondTeam), Team_ColorName(secondTeam), Team_GetNumberOfAlivePlayers(Team_GetTeam(secondTeam)));
+               return winnerTeam;
+       }
+       // Equality. Let's check which team has more health now
+       //LOG_INFO("Equality. Checking health now.");
+       winnerTeam = 0;
+       secondTeam = 0;
+       int winnerTeamHealth = 0;
+       int secondTeamHealth = 0;
+       int teamIndex, teamHealth;
+       for(int i = 1; i <= AVAILABLE_TEAMS; i++)
+       {
+               teamIndex = i;
+               teamHealth = 0;
+               // Add up health for the players in this team
+               FOREACH_CLIENT(IS_PLAYER(it) && Entity_HasValidTeam(it) && it.team == Team_IndexToTeam(teamIndex),
+               {
+                       if (IS_DEAD(it))
+                               continue;
+                       teamHealth += GetResource(it, RES_HEALTH) + GetResource(it, RES_ARMOR);
+               });
+               // Set the winner teams
+               if(!winnerTeam || teamHealth > winnerTeamHealth)
+               {
+                       secondTeam = winnerTeam;
+                       secondTeamHealth = winnerTeamHealth;
+                       winnerTeam = Team_IndexToTeam(i);
+                       winnerTeamHealth = teamHealth;
+               }
+               else
+               {
+                       if(!secondTeam || teamHealth > secondTeamHealth)
+                       {
+                               secondTeam = Team_IndexToTeam(i);
+                               secondTeamHealth = teamHealth;
+                       }
+               }
+       }
+       if(winnerTeamHealth != secondTeamHealth)
+       {
+               LOG_INFOF("Stalemate broken by team health. Best team: %s%s (%d)^7 - Trailing team: %s%s (%d)",
+                       Team_ColorCode(winnerTeam), Team_ColorName(winnerTeam), winnerTeamHealth,
+                       Team_ColorCode(secondTeam), Team_ColorName(secondTeam), secondTeamHealth);
+               return winnerTeam;
+       }
+       else
+               return -2; // Equality. Can't avoid the stalemate.
+ }
  float CA_CheckWinner()
  {
+       int winner_team = 0;
        if(round_handler_GetEndTime() > 0 && round_handler_GetEndTime() - time <= 0)
        {
-               Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_ROUND_OVER);
-               Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_ROUND_OVER);
-               Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_ROUND_OVER);
-               FOREACH_CLIENT(IS_PLAYER(it), { nades_Clear(it); });
-               allowed_to_spawn = false;
-               if(autocvar_g_ca_round_stop)
-                       game_stopped = true;
-               round_handler_Init(5, autocvar_g_ca_warmup, autocvar_g_ca_round_timelimit);
-               return 1;
+               if(autocvar_g_ca_prevent_stalemate)
+                       winner_team = CA_PreventStalemate();
+               else
+                       winner_team = -2;
        }
  
        CA_count_alive_players();
        {
                Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_ROUND_TIED);
                Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_ROUND_TIED);
 +              Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_ROUND_TIED);
        }
+       else if(winner_team == -2)
+       {
+               Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_ROUND_OVER);
+               Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_ROUND_OVER);
++              Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_ROUND_OVER);
+       }
  
        allowed_to_spawn = false;
 -      game_stopped = true;
 +      if(autocvar_g_ca_round_stop)
 +              game_stopped = true;
        round_handler_Init(5, autocvar_g_ca_warmup, autocvar_g_ca_round_timelimit);
  
 -      FOREACH_CLIENT(IS_PLAYER(it), { nades_Clear(it); });
 +      FOREACH_CLIENT(IS_PLAYER(it), {
 +              nades_Clear(it);
 +              
 +              // Give perfect medal if everyone in the winner team is alive
 +              if(perfect && it.team == winner_team) {
 +                      Give_Medal(it, PERFECT);
 +              }
 +              
 +              // Give accuracy medal for each weapon above 50%
 +              entity ra = it.roundaccuracy;
 +              for (int w = 0; w <= WEP_LAST - WEP_FIRST; ++w) {
 +                      if(ra.accuracy_fired[w] > 1 && (ra.accuracy_hit[w] / ra.accuracy_fired[w]) > 0.5) {
 +                              Give_Medal(it, ACCURACY);
 +                      }
 +              }
 +      });
  
        return 1;
  }
Simple merge
index 0b132a6b00942cf8c155c1618f0616cbd1555d07,3449f2b53ee5b950b2d2916d8e593509decdece3..fe89e72473dbd67a008186b81efd69b129aad04f
@@@ -86,33 -57,31 +57,57 @@@ REGISTER_SP(LMS_LIVES)
  REGISTER_SP(NEXBALL_GOALS);
  REGISTER_SP(NEXBALL_FAULTS);
  
- REGISTER_SP(ONS_TAKES);
  REGISTER_SP(ONS_CAPS);
+ REGISTER_SP(ONS_TAKES);
+ REGISTER_SP(SCORE);
+ REGISTER_SP(KILLS);
+ REGISTER_SP(DEATHS);
+ REGISTER_SP(TEAMKILLS);
+ REGISTER_SP(SUICIDES);
+ REGISTER_SP(DMG);
+ REGISTER_SP(DMGTAKEN);
+ REGISTER_SP(ELO); // not sortable
+ REGISTER_SP(FPS); // not sortable
+ // fields not networked via the score system
+ REGISTER_SP(END);
+ REGISTER_SP(PING);
+ REGISTER_SP(PL);
++REGISTER_SP(COUNTRY); //LegendGuard adds new column for country label 05-04-2021
+ REGISTER_SP(NAME);
+ REGISTER_SP(SEPARATOR);
+ REGISTER_SP(KDRATIO); // kills / deaths
+ REGISTER_SP(SUM); // kills - deaths
+ REGISTER_SP(FRAGS); // kills - suicides
 +
 +REGISTER_SP(MEDAL_AIRSHOT);
 +REGISTER_SP(MEDAL_DAMAGE);
 +REGISTER_SP(MEDAL_ELECTROBITCH);
 +REGISTER_SP(MEDAL_EXCELLENT);
 +REGISTER_SP(MEDAL_FIRSTBLOOD);
 +REGISTER_SP(MEDAL_HEADSHOT);
 +REGISTER_SP(MEDAL_HUMILIATION);
 +REGISTER_SP(MEDAL_IMPRESSIVE);
 +REGISTER_SP(MEDAL_YODA);
 +REGISTER_SP(MEDAL_TELEFRAG);
 +
 +REGISTER_SP(MEDAL_ACCURACY);
 +REGISTER_SP(MEDAL_ASSIST);
 +REGISTER_SP(MEDAL_CAPTURE);
 +REGISTER_SP(MEDAL_DEFENSE);
 +REGISTER_SP(MEDAL_PERFECT);
 +
 +REGISTER_SP(MEDAL_KILLSTREAK_03);
 +REGISTER_SP(MEDAL_KILLSTREAK_05);
 +REGISTER_SP(MEDAL_KILLSTREAK_10);
 +REGISTER_SP(MEDAL_KILLSTREAK_15);
 +
 +REGISTER_SP(SV_SURVIVALS);
 +REGISTER_SP(SV_HUNTS);
  #endif
  
  
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 41bcd53d9bd225c3de58695eb613978fd004b5c3,2cedc4aded31c9abce24c8fa5bafdcbe92987bac..9de96ac49c660d8d21217ce41df28df0bd87d3f1
@@@ -407,36 -417,30 +417,48 @@@ float PlayerScore_Compare(entity t1, en
  {
        if(!t1 || !t2) return (!t2) - !t1;
  
-       vector result = '0 0 0';
-       FOREACH(Scores, true, {
-               var .float f = scores(it);
-               result = ScoreField_Compare(t1, t2, f, scores_flags(it), result, strict);
-       });
+       int result = 0;
+       result = ScoreField_Compare(t1, t2, scores_primary, scores_flags_primary, result);
+       // NOTE: if (scores_secondary) doesn't work because it's a field pointer
+       if (result == 0 && scores_flags_secondary)
+               result = ScoreField_Compare(t1, t2, scores_secondary, scores_flags_secondary, result);
  
-       if (result.x == 0 && strict)
-               result.x = t1.owner.playerid - t2.owner.playerid;
+       if (result == 0 && strict)
+       {
+               FOREACH(Scores, true, {
+                       if (scores_flags(it) & SFL_SORT_PRIO_MASK)
+                               continue;
+                       if (scores_label(it) == "")
+                               continue;
+                       var .float f = scores(it);
+                       result = ScoreField_Compare(t1, t2, f, scores_flags(it), result);
+                       if (result) break;
+               });
+               if (result == 0)
+                       result = t1.owner.playerid - t2.owner.playerid;
+       }
  
-       return result.x;
+       return result;
  }
  
 +bool Score_NewLeader()
 +{
 +      if(teamplay) {
 +              if (WinningConditionHelper_winnerteam != WinningConditionHelper_winnerteam_last && (WinningConditionHelper_secondteam || WinningConditionHelper_equality))
 +              {
 +                      WinningConditionHelper_winnerteam_last = WinningConditionHelper_winnerteam;
 +                      return true;
 +              }
 +      } else {
 +              if (WinningConditionHelper_winner != WinningConditionHelper_winner_last && (WinningConditionHelper_second || WinningConditionHelper_equality))
 +              {
 +                      WinningConditionHelper_winner_last = WinningConditionHelper_winner;
 +                      return true;
 +              }
 +      }
 +      return false;
 +}
 +
  void WinningConditionHelper(entity this)
  {
        float c;
index 10bc0abafc10e73930e42433c52a0538958df816,4334cb422e3281c450a08034d14557046a80eac3..207af613ec7bda3bcaa2271872215c331c76126c
@@@ -2230,10 -2090,9 +2245,11 @@@ void readplayerstartcvars(
  
  void readlevelcvars()
  {
+       serverflags &= ~SERVERFLAG_ALLOW_FULLBRIGHT;
        if(cvar("sv_allow_fullbright"))
                serverflags |= SERVERFLAG_ALLOW_FULLBRIGHT;
 +      if(cvar("sv_forbid_pickuptimer"))
 +              serverflags |= SERVERFLAG_FORBID_PICKUPTIMER;
  
        sv_ready_restart_after_countdown = cvar("sv_ready_restart_after_countdown");
  
index 5d82deb6faa41569c6380956ae71529cc786b34b,48c0e38d4966bc0232567f2b1f3b3ed6bf766775..1908c8d1ff5f320784b316f429219d12e5eab511
@@@ -27,15 -27,8 +27,16 @@@ float autocvar_timelimit_max
  float autocvar_timelimit_overtime;
  int autocvar_timelimit_overtimes;
  float autocvar_timelimit_suddendeath;
+ bool autocvar_sv_gameplayfix_droptofloorstartsolid;
  
 +// z411
 +bool autocvar_sv_jingle_end;
 +string autocvar_sv_jingle_end_list;
 +float autocvar_sv_jingle_end_volume;
 +
 +float fragsleft;
 +int fragsleft_last;
 +
  float checkrules_equality;
  float checkrules_suddendeathwarning;
  float checkrules_suddendeathend;
Simple merge