X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_net.pas;h=8f8488f904fad54e4e014f62db6a1afd15de329c;hb=8ab76228a45f13481cc1162b6d84cb3bdb50b9c6;hp=251e06bb213071c07a958e9d2f0a4741b3b4cedd;hpb=ee8c45f6ae49d4f8a1e30a88926c41ef55961f8a;p=d2df-sdl.git diff --git a/src/game/g_net.pas b/src/game/g_net.pas index 251e06b..8f8488f 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; @@ -1458,64 +1459,6 @@ begin e_KeyPressed(JOY3_JUMP) end; -{ -function g_Net_Wait_Event(msgId: Word): TMemoryStream; - var - ev: ENetEvent; - rMsgId: Byte; - Ptr: Pointer; - stream: TMemoryStream; - status: cint; -begin - FillChar(ev, SizeOf(ev), 0); - stream := nil; - repeat - status := enet_host_service(NetHost, @ev, Trunc(g_Net_DownloadTimeout * 1000)); - if status > 0 then - begin - case ev.kind of - ENET_EVENT_TYPE_RECEIVE: - begin - Ptr := ev.packet^.data; - rMsgId := Byte(Ptr^); - if rMsgId = msgId then - begin - stream := TMemoryStream.Create; - stream.SetSize(ev.packet^.dataLength); - stream.WriteBuffer(Ptr^, ev.packet^.dataLength); - stream.Seek(0, soFromBeginning); - status := 1 (* received *) - end - else - begin - (* looks that game state always received, so ignore it *) - e_LogWritefln('g_Net_Wait_Event(%s): skip message %s', [msgId, rMsgId]); - status := 2 (* continue *) - end - end; - ENET_EVENT_TYPE_DISCONNECT: - begin - if (ev.data <= NET_DISC_MAX) then - g_Console_Add(_lc[I_NET_MSG_ERROR] + _lc[I_NET_ERR_CONN] + ' ' + _lc[TStrings_Locale(Cardinal(I_NET_DISC_NONE) + ev.data)], True); - status := -2 (* error: disconnected *) - end; - else - g_Console_Add(_lc[I_NET_MSG_ERROR] + _lc[I_NET_ERR_CONN] + ' unknown ENet event ' + IntToStr(Ord(ev.kind)), True); - status := -3 (* error: unknown event *) - end; - enet_packet_destroy(ev.packet) - end - else - begin - g_Console_Add(_lc[I_NET_MSG_ERROR] + _lc[I_NET_ERR_CONN] + ' timeout reached', True); - status := 0 (* error: timeout *) - end; - ProcessLoading(true); - until (status <> 2) or g_Net_UserRequestExit(); - Result := stream -end; -} - function getNewTimeoutEnd (): Int64; begin @@ -1602,7 +1545,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 +1710,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 +1828,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 +1889,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