X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_net.pas;h=e6c1fbccb6b19deaec6cbb8e58ec3d41c9681eab;hb=a4da798da0df5a8d54bdfe1d9563e1b254b697e7;hp=4deca1e4c2f65356a7a2ebfcb886a0480bfb9aef;hpb=5ecb6dd44de6bb04536ce3bddd5a4ef977a77420;p=d2df-sdl.git diff --git a/src/game/g_net.pas b/src/game/g_net.pas index 4deca1e..e6c1fbc 100644 --- a/src/game/g_net.pas +++ b/src/game/g_net.pas @@ -72,7 +72,7 @@ const BANLIST_FILENAME = 'banlist.txt'; NETDUMP_FILENAME = 'netdump'; - {$IFDEF FREEBSD} + {$IF DEFINED(FREEBSD) OR DEFINED(DARWIN)} NilThreadId = nil; {$ELSE} NilThreadId = 0; @@ -108,6 +108,7 @@ type Peer: pENetPeer; Player: Word; RequestedFullUpdate: Boolean; + WaitForFirstSpawn: Boolean; // set to `true` in server, used to spawn a player on first full state request RCONAuth: Boolean; Voted: Boolean; Transfer: TNetFileTransfer; // only one transfer may be active @@ -243,23 +244,49 @@ function g_Net_RequestResFileInfo (resIndex: LongInt; out tf: TNetFileTransfer): function g_Net_AbortResTransfer (var tf: TNetFileTransfer): Boolean; function g_Net_ReceiveResourceFile (resIndex: LongInt; var tf: TNetFileTransfer; strm: TStream): Integer; +function g_Net_IsNetworkAvailable (): Boolean; +procedure g_Net_InitLowLevel (); +procedure g_Net_DeinitLowLevel (); + implementation uses SysUtils, e_input, g_nethandler, g_netmsg, g_netmaster, g_player, g_window, g_console, - g_main, g_game, g_language, g_weapons, utils, ctypes, + g_main, g_game, g_language, g_weapons, utils, ctypes, g_system, g_map; const FILE_CHUNK_SIZE = 8192; var + enet_init_success: Boolean = false; g_Net_DownloadTimeout: Single; trans_omsg: TMsg; +function g_Net_IsNetworkAvailable (): Boolean; +begin + result := enet_init_success; +end; + +procedure g_Net_InitLowLevel (); +begin + if enet_init_success then raise Exception.Create('wuta?!'); + enet_init_success := (enet_initialize() = 0); +end; + +procedure g_Net_DeinitLowLevel (); +begin + if enet_init_success then + begin + enet_deinitialize(); + enet_init_success := false; + end; +end; + + //************************************************************************** // // SERVICE FUNCTIONS @@ -1274,6 +1301,7 @@ begin NetClients[N].Used := True; NetClients[N].ID := N; NetClients[N].RequestedFullUpdate := False; + NetClients[N].WaitForFirstSpawn := False; NetClients[N].RCONAuth := False; NetClients[N].Voted := False; NetClients[N].Player := 0; @@ -1283,6 +1311,7 @@ begin Result := N; end; + function g_Net_Init(): Boolean; var F: TextFile; @@ -1316,7 +1345,8 @@ begin g_Net_SaveBanList(); end; - Result := (enet_initialize() = 0); + //Result := (enet_initialize() = 0); + Result := enet_init_success; end; procedure g_Net_Flush(); @@ -1383,7 +1413,8 @@ begin NetPeer := nil; NetHost := nil; - g_Net_Slist_Disconnect(false); // do not spam console + g_Net_Slist_NetworkStopped(); + //g_Net_Slist_Disconnect(false); // do not spam console NetMyID := -1; NetPlrUID1 := -1; NetPlrUID2 := -1; @@ -1411,7 +1442,7 @@ procedure g_Net_Free(); begin g_Net_Cleanup(); - enet_deinitialize(); + //enet_deinitialize(); NetInitDone := False; end; @@ -1518,7 +1549,8 @@ begin end; clearNetClients(false); // don't clear array - if (g_Net_Slist_IsConnectionActive) then g_Net_Slist_Disconnect; + //if (g_Net_Slist_IsConnectionActive) then g_Net_Slist_Disconnect; + g_Net_Slist_NetworkStopped(); if NetPongSock <> ENET_SOCKET_NULL then enet_socket_destroy(NetPongSock); @@ -1588,7 +1620,8 @@ begin NetOut.Write(Byte(Ord('F'))); NetOut.Write(NetPort); NetOut.Write(ClTime); - g_Net_Slist_WriteInfo(); + //g_Net_Slist_WriteInfo(); + TMasterHost.writeInfo(NetOut); NPl := 0; if gPlayer1 <> nil then Inc(NPl); if gPlayer2 <> nil then Inc(NPl); @@ -1615,7 +1648,11 @@ begin IP := ''; Result := 0; - if NetUseMaster then g_Net_Slist_Check; + if NetUseMaster then + begin + //g_Net_Slist_Check; + g_Net_Slist_Pulse(); + end; g_Net_Host_CheckPings; while (enet_host_service(NetHost, @NetEvent, 0) > 0) do @@ -1711,6 +1748,7 @@ begin TC^.Peer := nil; TC^.Player := 0; TC^.RequestedFullUpdate := False; + TC^.WaitForFirstSpawn := False; TC^.NetOut[NET_UNRELIABLE].Free(); TC^.NetOut[NET_RELIABLE].Free(); @@ -1719,7 +1757,11 @@ begin g_Console_Add(_lc[I_NET_MSG] + Format(_lc[I_NET_MSG_HOST_DISC], [ID])); Dec(NetClientCount); - if NetUseMaster then g_Net_Slist_Update; + if NetUseMaster then + begin + //g_Net_Slist_Update; + g_Net_Slist_Pulse(); + end; end; end; end; @@ -1896,7 +1938,7 @@ begin end; // предупредить что ждем слишком долго через N секунд - TimeoutTime := GetTimer() + NET_CONNECT_TIMEOUT; + TimeoutTime := sys_GetTicks() + NET_CONNECT_TIMEOUT; OuterLoop := True; while OuterLoop do @@ -1917,7 +1959,7 @@ begin end; end; - T := GetTimer(); + T := sys_GetTicks(); if T > TimeoutTime then begin TimeoutTime := T + NET_CONNECT_TIMEOUT * 100; // одного предупреждения хватит