]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Optimise sending survival statuses
authorDr. Jaska <drjaska83@gmail.com>
Thu, 3 Oct 2024 12:47:18 +0000 (12:47 +0000)
committerterencehill <piuntn@gmail.com>
Thu, 3 Oct 2024 12:47:18 +0000 (12:47 +0000)
qcsrc/common/gamemodes/gamemode/survival/sv_survival.qc
qcsrc/lib/net.qh

index deaae435c1b6e7289e826e1fa3965eb15bf8304b..9958bd6215d14d5b9152639f420eed3804fae184 100644 (file)
@@ -11,30 +11,28 @@ void nades_Clear(entity player);
 entity survivalStatuses;
 void SurvivalStatuses_Init();
 
-void SurvivalStatuses_Send()
-{
-       // SendFlags can be set to anything != 0, SurvivalStatuses_SendEntity won't use its value
-       // Dr. Jaska: this was a lie, the flags were not reset until now
-       survivalStatuses.SendFlags = 1;
-}
+#define STATUS_SEND_RESET   1
+#define STATUS_SEND_HUNTERS 2
 
 bool SurvivalStatuses_SendEntity(entity this, entity dest, float sendflags)
 {
        Stream out = MSG_ENTITY;
        WriteHeader(out, ENT_CLIENT_SURVIVALSTATUSES);
 
-       // TODO: optimize this instead of always setting it on
-       sendflags = BIT(0); // reset all flags and make all players survivors
-
-       if ((dest.survival_status == SURV_STATUS_HUNTER) || round_handler_AwaitingNextRound())
-               sendflags |= BIT(1); // send hunter statuses
+       // always send hunters their own status and their allies
+       if (dest.survival_status == SURV_STATUS_HUNTER)
+               sendflags |= STATUS_SEND_HUNTERS;
 
        serialize(byte, out, sendflags);
-       if (sendflags & BIT(1)) {
-               for (int i = 1; i <= maxclients; i += 8) {
+       if (sendflags & STATUS_SEND_HUNTERS)
+       {
+               for (int i = 1; i <= maxclients; i += 8)
+               {
                        int f = 0;
                        entity e = edict_num(i);
-                       for (int b = 0; b < 8; ++b, e = nextent(e)) {
+
+                       for (int b = 0; b < 8; ++b, e = nextent(e))
+                       {
                                bool is_hunter = (INGAME(e) && e.survival_status == SURV_STATUS_HUNTER);
                                if (is_hunter)
                                        f |= BIT(b);
@@ -98,7 +96,7 @@ float Surv_CheckWinner()
                allowed_to_spawn = false;
                game_stopped = true;
                round_handler_Init(5, autocvar_g_survival_warmup, autocvar_g_survival_round_timelimit);
-               SurvivalStatuses_Send();
+               survivalStatuses.SendFlags = STATUS_SEND_HUNTERS;
                return 1;
        }
 
@@ -156,7 +154,7 @@ float Surv_CheckWinner()
        allowed_to_spawn = false;
        game_stopped = true;
        round_handler_Init(5, autocvar_g_survival_warmup, autocvar_g_survival_round_timelimit);
-       SurvivalStatuses_Send();
+       survivalStatuses.SendFlags = STATUS_SEND_HUNTERS;
 
        FOREACH_CLIENT(true,
        {
@@ -191,7 +189,7 @@ void Surv_RoundStart()
                total_hunters++;
                it.survival_status = SURV_STATUS_HUNTER;
        });
-       SurvivalStatuses_Send();
+       survivalStatuses.SendFlags = STATUS_SEND_RESET;
 
        FOREACH_CLIENT(IS_PLAYER(it) && !IS_DEAD(it),
        {
@@ -335,7 +333,7 @@ MUTATOR_HOOKFUNCTION(surv, reset_map_players)
                }
        });
        bot_relinkplayerlist();
-       SurvivalStatuses_Send();
+       survivalStatuses.SendFlags = STATUS_SEND_RESET;
        return true;
 }
 
index 7c490fd157e477c70d723b3663b77116c2f6f833..af44475ceb0184cbfe4c2d3dca7d045cf90b68df 100644 (file)
@@ -114,6 +114,7 @@ STATIC_INIT(C2S_Protocol_renumber) { FOREACH(C2S_Protocol, true, it.m_id = i); }
 #ifdef SVQC
        const int MSG_ENTITY = 5;
 
+       // If SendFlags is set to non-0 it is networked
        .int SendFlags;
 
        IntrusiveList g_uncustomizables;