X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_net.pas;h=7dcffd78c8c27caf1eb32bc59cd80e2db2057eea;hb=cc289b13a569e26fa6fb389f215719af031c35a2;hp=251e06bb213071c07a958e9d2f0a4741b3b4cedd;hpb=ee8c45f6ae49d4f8a1e30a88926c41ef55961f8a;p=d2df-sdl.git diff --git a/src/game/g_net.pas b/src/game/g_net.pas index 251e06b..7dcffd7 100644 --- a/src/game/g_net.pas +++ b/src/game/g_net.pas @@ -90,6 +90,7 @@ type lastAckTime: Int64; // msecs; if not "in progress", we're waiting for the first ack inProgress: Boolean; diskBuffer: PChar; // of `chunkSize` bytes + resumed: Boolean; end; TNetClient = record @@ -181,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; @@ -1602,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 @@ -1767,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 @@ -1885,17 +1886,28 @@ var chunk: Integer; csize: Integer; buf: PChar = nil; + resumed: Boolean; //stx: Int64; begin + tf.resumed := false; + e_LogWritefln('file `%s`, size=%d (%d)', [tf.diskName, Integer(strm.size), tf.size], TMsgType.Notify); + // check if we should resume downloading + resumed := (strm.size > tf.chunkSize) and (strm.size < tf.size); // send request trans_omsg.Clear(); trans_omsg.Write(Byte(NTF_CLIENT_START)); - trans_omsg.Write(LongInt(0)); + if resumed then chunk := strm.size div tf.chunkSize else chunk := 0; + trans_omsg.Write(LongInt(chunk)); if not ftransSendClientMsg(trans_omsg) then begin result := -1; exit; end; + strm.Seek(chunk*tf.chunkSize, soFromBeginning); chunkTotal := (tf.size+tf.chunkSize-1) div tf.chunkSize; e_LogWritefln('receiving file `%s` (%d chunks)', [tf.diskName, chunkTotal], TMsgType.Notify); g_Game_SetLoadingText('downloading "'+ExtractFileName(tf.diskName)+'"', chunkTotal, False); + tf.resumed := resumed; + + if (chunk > 0) then g_Game_StepLoading(chunk); + nextChunk := chunk; // wait for reply data FillChar(ev, SizeOf(ev), 0); @@ -1935,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