X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_netmsg.pas;h=d8f8970c8ba6e950e29ec82975c1c9b2e8df8e33;hb=8fdd9fdbead9da51719657ba98fab3ad9c83903b;hp=1bb60c2d53a4aa234445cb1e56a8090f677b1c35;hpb=793c463d8e71d5b31b0f99d050bd77870a7a9f2a;p=d2df-sdl.git diff --git a/src/game/g_netmsg.pas b/src/game/g_netmsg.pas index 1bb60c2..d8f8970 100644 --- a/src/game/g_netmsg.pas +++ b/src/game/g_netmsg.pas @@ -2,8 +2,7 @@ * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * the Free Software Foundation, version 3 of the License ONLY. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -72,6 +71,30 @@ const NET_MSG_RES_REQUEST = 203; NET_MSG_RES_RESPONSE = 204; + // chunked file transfers + // it goes this way: + // client requests file (FILE_REQUEST) + // server sends file header info (FILE_HEADER) + // client acks chunk -1 (CHUNK_ACK) to initiate transfer, or cancels (FILE_CANCEL) + // server start sending data chunks (one at a time, waiting for an ACK for each one) + // when client acks the last chunk, transfer is complete + // this scheme sux, of course; we can do better by spamming with unreliable unsequenced packets, + // and use client acks to drive server sends, but meh... let's do it this way first, and + // we can improve it later. + + // client: request a file + NET_MSG_FILE_REQUEST = 210; + // server: file info response + NET_MSG_FILE_HEADER = 211; + // client: request transfer cancellation + // server: something went wrong, transfer cancelled, bomb out + NET_MSG_FILE_CANCEL = 212; + // server: file chunk data + NET_MSG_FILE_CHUNK_DATA = 213; + // client: file chunk ack + NET_MSG_FILE_CHUNK_ACK = 214; + + NET_CHAT_SYSTEM = 0; NET_CHAT_PLAYER = 1; NET_CHAT_TEAM = 2; @@ -110,6 +133,7 @@ const NET_EV_KILLCOMBO = 17; NET_EV_PLAYER_TOUCH = 18; NET_EV_SECRET = 19; + NET_EV_INTER_READY = 20; NET_VE_STARTED = 1; NET_VE_PASSED = 2; @@ -125,6 +149,7 @@ const NET_CHEAT_SUICIDE = 1; NET_CHEAT_SPECTATE = 2; + NET_CHEAT_READY = 3; NET_MAX_DIFFTIME = 5000 div 36; @@ -138,8 +163,8 @@ procedure MH_RECV_PlayerSettings(C: pTNetClient; var M: TMsg); procedure MH_RECV_CheatRequest(C: pTNetClient; var M: TMsg); procedure MH_RECV_RCONPassword(C: pTNetClient; var M: TMsg); procedure MH_RECV_RCONCommand(C: pTNetClient; var M: TMsg); -procedure MH_RECV_MapRequest(C: pTNetClient; var M: TMsg); -procedure MH_RECV_ResRequest(C: pTNetClient; var M: TMsg); +//procedure MH_RECV_MapRequest(C: pTNetClient; var M: TMsg); +//procedure MH_RECV_ResRequest(C: pTNetClient; var M: TMsg); procedure MH_RECV_Vote(C: pTNetClient; var M: TMsg); // GAME @@ -240,8 +265,9 @@ procedure MC_SEND_RCONPassword(Password: string); procedure MC_SEND_RCONCommand(Cmd: string); procedure MC_SEND_Vote(Start: Boolean = False; Command: string = 'a'); // DOWNLOAD -procedure MC_SEND_MapRequest(); -procedure MC_SEND_ResRequest(const resName: AnsiString); +//procedure MC_SEND_MapRequest(); +//procedure MC_SEND_ResRequest(const resName: AnsiString); + type TExternalResourceInfo = record @@ -265,6 +291,9 @@ type function MapDataFromMsgStream(msgStream: TMemoryStream):TMapDataMsg; function ResDataFromMsgStream(msgStream: TMemoryStream):TResDataMsg; +function IsValidFileName(const S: String): Boolean; +function IsValidFilePath(const S: String): Boolean; + implementation uses @@ -511,6 +540,21 @@ begin else Pl.Spectate; end; + NET_CHEAT_READY: + begin + if gState <> STATE_INTERCUSTOM then Exit; + Pl.FReady := not Pl.FReady; + if Pl.FReady then + begin + MH_SEND_GameEvent(NET_EV_INTER_READY, Pl.UID, 'Y'); + Inc(gInterReadyCount); + end + else + begin + MH_SEND_GameEvent(NET_EV_INTER_READY, Pl.UID, 'N'); + Dec(gInterReadyCount); + end; + end; end; end; @@ -712,6 +756,8 @@ begin begin MH_SEND_GameEvent(NET_EV_LMS_WARMUP, (gLMSRespawnTime - gTime) div 1000, 'N', ID); end; + + g_Net_Flush(); end; procedure MH_SEND_Info(ID: Byte); @@ -1663,6 +1709,7 @@ begin case EvType of NET_EV_MAPSTART: begin + g_Res_received_map_start := true; gGameOn := False; g_Game_ClearLoading(); g_Game_StopAllSounds(True); @@ -1685,6 +1732,7 @@ begin NET_EV_MAPEND: begin + g_Res_received_map_start := true; gMissionFailed := EvNum <> 0; gExit := EXIT_ENDLEVELCUSTOM; end; @@ -1842,6 +1890,11 @@ begin end; end; + NET_EV_INTER_READY: + begin + pl := g_Player_Get(EvNum); + if pl <> nil then pl.FReady := (EvStr = 'Y'); + end; end; end; @@ -2555,12 +2608,13 @@ begin MPlaying := M.ReadByte() <> 0; MPos := M.ReadLongWord(); MPaused := M.ReadByte() <> 0; + MPos := MPos+1; //k8: stfu, fpc! if MPlaying then begin gMusic.SetByName(MName); gMusic.Play(True); - gMusic.SetPosition(MPos); + // gMusic.SetPosition(MPos); gMusic.SpecPause := MPaused; end else @@ -2812,13 +2866,17 @@ begin if gPlayerAction[0, ACTION_STRAFE] then begin // new strafe mechanics - if (strafeDir = 0) then strafeDir := P1MoveButton; // start strafing + if (strafeDir = 0) then + strafeDir := P1MoveButton; // start strafing // now set direction according to strafe (reversed) - if (strafeDir = 2) then gPlayer1.SetDirection(TDirection.D_LEFT) - else if (strafeDir = 1) then gPlayer1.SetDirection(TDirection.D_RIGHT); + if (strafeDir = 2) then + gPlayer1.SetDirection(TDirection.D_LEFT) + else if (strafeDir = 1) then + gPlayer1.SetDirection(TDirection.D_RIGHT) end else begin + strafeDir := 0; // not strafing anymore if (P1MoveButton = 2) and gPlayerAction[0, ACTION_MOVELEFT] then gPlayer1.SetDirection(TDirection.D_LEFT) else if (P1MoveButton = 1) and gPlayerAction[0, ACTION_MOVERIGHT] then @@ -2858,6 +2916,9 @@ begin if gPlayerAction[0, ACTION_WEAPNEXT] then kByte := kByte or NET_KEY_NW; if gPlayerAction[0, ACTION_WEAPPREV] then kByte := kByte or NET_KEY_PW; + gPlayerAction[0, ACTION_WEAPNEXT] := False; // HACK, remove after readyweaon&pendinweapon implementation + gPlayerAction[0, ACTION_WEAPPREV] := False; // HACK, remove after readyweaon&pendinweapon implementation + for i := WP_FIRST to WP_LAST do begin if gSelectWeapon[0, i] then @@ -3069,6 +3130,7 @@ begin Result := True; end; +{ procedure MC_SEND_MapRequest(); begin NetOut.Write(Byte(NET_MSG_MAP_REQUEST)); @@ -3084,8 +3146,8 @@ end; procedure MH_RECV_MapRequest(C: pTNetClient; var M: TMsg); var - payload: AByte; peer: pENetPeer; + payload: AByte; mapDataMsg: TMapDataMsg; begin e_WriteLog('NET: Received map request from ' + @@ -3131,5 +3193,7 @@ begin g_Net_SendData(payload, peer, True, NET_CHAN_DOWNLOAD); end; end; +} + end.