DEADSOFTWARE

net: slightly better detection of "map change" event in resource downloader
authorKetmar Dark <ketmar@ketmar.no-ip.org>
Sat, 12 Oct 2019 02:21:14 +0000 (05:21 +0300)
committerKetmar Dark <ketmar@ketmar.no-ip.org>
Sat, 12 Oct 2019 15:54:12 +0000 (18:54 +0300)
src/game/g_net.pas
src/game/g_netmsg.pas
src/game/g_res_downloader.pas

index db8db654355b63265729be6574a70106b1068872..7dcffd78c8c27caf1eb32bc59cd80e2db2057eea 100644 (file)
@@ -182,7 +182,7 @@ var
 
   NetDumpFile: TStream;
 
-  g_Res_received_map_start: Boolean = false; // set if we received "map change" event
+  g_Res_received_map_start: Integer = 0; // set if we received "map change" event
 
 
 function  g_Net_Init(): Boolean;
@@ -1603,7 +1603,7 @@ begin
                 //e_LogWritefln('g_Net_Wait_MapInfo: skip message from non-transfer channel', []);
                 freePacket := false;
                 g_Net_Client_HandlePacket(ev.packet, g_Net_ClientLightMsgHandler);
-                if (g_Res_received_map_start) then begin result := -666; exit; end;
+                if (g_Res_received_map_start < 0) then begin result := -666; exit; end;
               end
               else
               begin
@@ -1768,7 +1768,7 @@ begin
                 //e_LogWriteln('g_Net_Wait_Event: skip message from non-transfer channel');
                 freePacket := false;
                 g_Net_Client_HandlePacket(ev.packet, g_Net_ClientLightMsgHandler);
-                if (g_Res_received_map_start) then begin result := -666; exit; end;
+                if (g_Res_received_map_start < 0) then begin result := -666; exit; end;
               end
               else
               begin
@@ -1947,7 +1947,7 @@ begin
                 //e_LogWritefln('g_Net_Wait_Event: skip message from non-transfer channel', []);
                 freePacket := false;
                 g_Net_Client_HandlePacket(ev.packet, g_Net_ClientLightMsgHandler);
-                if (g_Res_received_map_start) then begin result := -666; exit; end;
+                if (g_Res_received_map_start < 0) then begin result := -666; exit; end;
               end
               else
               begin
index d8f8970c8ba6e950e29ec82975c1c9b2e8df8e33..15079d6b614449376ecb6e3bb94f539c55b425d3 100644 (file)
@@ -1691,6 +1691,7 @@ var
   i1, i2: TStrings_Locale;
   pln: String;
   cnt: Byte;
+  goodCmd: Boolean = true;
 begin
   FillChar(EvHash, Sizeof(EvHash), 0);
   EvType := M.ReadByte();
@@ -1706,35 +1707,60 @@ begin
 
   gTime := EvTime;
 
+  if (g_Res_received_map_start <> 0) then
+  begin
+    if (g_Res_received_map_start < 0) then exit;
+    goodCmd := false;
+    case EvType of
+      NET_EV_MAPSTART: goodCmd := true;
+      NET_EV_MAPEND: goodCmd := true;
+      NET_EV_PLAYER_KICK: goodCmd := true;
+      NET_EV_PLAYER_BAN: goodCmd := true;
+    end;
+    if not goodCmd then exit;
+  end;
+
   case EvType of
     NET_EV_MAPSTART:
     begin
-      g_Res_received_map_start := true;
-      gGameOn := False;
-      g_Game_ClearLoading();
-      g_Game_StopAllSounds(True);
+      if (g_Res_received_map_start <> 0) then
+      begin
+        g_Res_received_map_start := -1;
+      end
+      else
+      begin
+        gGameOn := False;
+        g_Game_ClearLoading();
+        g_Game_StopAllSounds(True);
 
-      gSwitchGameMode := Byte(EvNum);
-      gGameSettings.GameMode := gSwitchGameMode;
+        gSwitchGameMode := Byte(EvNum);
+        gGameSettings.GameMode := gSwitchGameMode;
 
-      gWADHash := EvHash;
-      if not g_Game_StartMap(EvStr, True) then
-      begin
-        if not isWadPath(EvStr) then
-          g_FatalError(Format(_lc[I_GAME_ERROR_MAP_LOAD], [gGameSettings.WAD + ':\' + EvStr]))
-        else
-          g_FatalError(Format(_lc[I_GAME_ERROR_MAP_LOAD], [EvStr]));
-        Exit;
-      end;
+        gWADHash := EvHash;
+        if not g_Game_StartMap(EvStr, True) then
+        begin
+          if not isWadPath(EvStr) then
+            g_FatalError(Format(_lc[I_GAME_ERROR_MAP_LOAD], [gGameSettings.WAD + ':\' + EvStr]))
+          else
+            g_FatalError(Format(_lc[I_GAME_ERROR_MAP_LOAD], [EvStr]));
+          Exit;
+        end;
 
-      MC_SEND_FullStateRequest;
+        MC_SEND_FullStateRequest;
+      end;
     end;
 
     NET_EV_MAPEND:
     begin
-      g_Res_received_map_start := true;
-      gMissionFailed := EvNum <> 0;
-      gExit := EXIT_ENDLEVELCUSTOM;
+      if (g_Res_received_map_start <> 0) then
+      begin
+        g_Res_received_map_start := -1;
+      end
+      else
+      begin
+        gMissionFailed := EvNum <> 0;
+        gExit := EXIT_ENDLEVELCUSTOM;
+      end;
     end;
 
     NET_EV_RCON:
@@ -1758,10 +1784,16 @@ begin
     end;
 
     NET_EV_PLAYER_KICK:
-      g_Console_Add(Format(_lc[I_PLAYER_KICK], [EvStr]), True);
+      begin
+        g_Console_Add(Format(_lc[I_PLAYER_KICK], [EvStr]), True);
+        if (g_Res_received_map_start <> 0) then g_Res_received_map_start := -1;
+      end;
 
     NET_EV_PLAYER_BAN:
-      g_Console_Add(Format(_lc[I_PLAYER_BAN], [EvStr]), True);
+      begin
+        g_Console_Add(Format(_lc[I_PLAYER_BAN], [EvStr]), True);
+        if (g_Res_received_map_start <> 0) then g_Res_received_map_start := -1;
+      end;
 
     NET_EV_LMS_WARMUP:
       g_Console_Add(Format(_lc[I_MSG_WARMUP_START], [EvNum]), True);
index b2844c651539202b622fdcdea8e46fd063b60652..0b8d352eaab736e29962ea5e09d368ca8f913484 100644 (file)
@@ -166,11 +166,11 @@ begin
   //SetLength(mapData.ExternalResources, 0);
   result := '';
   g_Res_ClearReplacementWads();
-  g_Res_received_map_start := false;
 
   resList := TStringList.Create();
 
   try
+    g_Res_received_map_start := 1;
     g_Console_Add(Format(_lc[I_NET_MAP_DL], [FileName]));
     e_WriteLog('Downloading map `' + FileName + '` from server', TMsgType.Notify);
     g_Game_SetLoadingText(FileName + '...', 0, False);
@@ -338,6 +338,7 @@ begin
     end;
   finally
     resList.Free;
+    g_Res_received_map_start := 0;
   end;
 end;