From: Ketmar Dark Date: Sat, 12 Oct 2019 02:21:14 +0000 (+0300) Subject: net: slightly better detection of "map change" event in resource downloader X-Git-Url: http://deadsoftware.ru/gitweb?p=d2df-sdl.git;a=commitdiff_plain;h=cc289b13a569e26fa6fb389f215719af031c35a2 net: slightly better detection of "map change" event in resource downloader --- diff --git a/src/game/g_net.pas b/src/game/g_net.pas index db8db65..7dcffd7 100644 --- a/src/game/g_net.pas +++ b/src/game/g_net.pas @@ -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 diff --git a/src/game/g_netmsg.pas b/src/game/g_netmsg.pas index d8f8970..15079d6 100644 --- a/src/game/g_netmsg.pas +++ b/src/game/g_netmsg.pas @@ -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); diff --git a/src/game/g_res_downloader.pas b/src/game/g_res_downloader.pas index b2844c6..0b8d352 100644 --- a/src/game/g_res_downloader.pas +++ b/src/game/g_res_downloader.pas @@ -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;