X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_netmsg.pas;h=6e8106fc61701e20d9b29c2eede43ff50d6cec16;hb=8bce2673b0700750c270ec61fb8ed42b6956549a;hp=b24022f26280c1101adf89242f7ca0cfb0f2d1a9;hpb=652c380f1fe8a394de7793f6f386eb0df284d2aa;p=d2df-sdl.git diff --git a/src/game/g_netmsg.pas b/src/game/g_netmsg.pas index b24022f..6e8106f 100644 --- a/src/game/g_netmsg.pas +++ b/src/game/g_netmsg.pas @@ -1,3 +1,19 @@ +(* Copyright (C) DooM 2D:Forever Developers + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *) +{$MODE DELPHI} unit g_netmsg; interface @@ -5,8 +21,6 @@ interface uses g_net, g_triggers, Classes, SysUtils, md5; const - NET_PROTO_VERSION = 1; - NET_MSG_INFO = 100; NET_MSG_CHAT = 101; @@ -132,7 +146,7 @@ procedure MH_SEND_Everything(CreatePlayers: Boolean = False; ID: Integer = NET_E procedure MH_SEND_Info(ID: Byte); procedure MH_SEND_Chat(Txt: string; Mode: Byte; ID: Integer = NET_EVERYONE); procedure MH_SEND_Effect(X, Y: Integer; Ang: SmallInt; Kind: Byte; ID: Integer = NET_EVERYONE); -procedure MH_SEND_Sound(X, Y: Integer; Name: string; ID: Integer = NET_EVERYONE); +procedure MH_SEND_Sound(X, Y: Integer; Name: string; Pos: Boolean = True; ID: Integer = NET_EVERYONE); procedure MH_SEND_CreateShot(Proj: LongInt; ID: Integer = NET_EVERYONE); procedure MH_SEND_UpdateShot(Proj: LongInt; ID: Integer = NET_EVERYONE); procedure MH_SEND_DeleteShot(Proj: LongInt; X, Y: LongInt; Loud: Boolean = True; ID: Integer = NET_EVERYONE); @@ -256,8 +270,7 @@ uses Math, ENet, e_input, e_fixedbuffer, e_graphics, e_log, g_textures, g_gfx, g_sound, g_console, g_basic, g_options, g_main, g_game, g_player, g_map, g_panel, g_items, g_weapons, g_phys, g_gui, - g_language, g_monsters, g_netmaster, - WADEDITOR, MAPDEF; + g_language, g_monsters, g_netmaster, utils, wadreader, MAPDEF; const NET_KEY_LEFT = 1; @@ -312,10 +325,7 @@ var PID: Word; Color: TRGB; I: Integer; - ProtoVer, Zero: Byte; begin - Zero := e_Raw_Read_Byte(P); - ProtoVer := e_Raw_Read_Byte(P); Ver := e_Raw_Read_String(P); Pw := e_Raw_Read_String(P); PName := e_Raw_Read_String(P); @@ -325,7 +335,7 @@ begin B := e_Raw_Read_Byte(P); T := e_Raw_Read_Byte(P); - if (Ver <> GAME_VERSION) or (ProtoVer <> NET_PROTO_VERSION) or (Zero <> 0) then + if Ver <> GAME_VERSION then begin g_Console_Add(_lc[I_NET_MSG] + _lc[I_NET_MSG_HOST_REJECT] + _lc[I_NET_DISC_VERSION]); @@ -420,7 +430,7 @@ end; function MH_RECV_PlayerPos(C: pTNetClient; P: Pointer): Word; var - Dir: Byte; + Dir, WeaponSelect: Byte; PID: Word; kByte: Word; Pl: TPlayer; @@ -442,8 +452,10 @@ begin NetTime := GT; kByte := e_Raw_Read_Word(P); Dir := e_Raw_Read_Byte(P); + WeaponSelect := e_Raw_Read_Byte(P); if Direction <> TDirection(Dir) then JustTeleported := False; + SetDirection(TDirection(Dir)); ReleaseKeys; @@ -462,6 +474,9 @@ begin if LongBool(kByte and NET_KEY_OPEN) then PressKey(KEY_OPEN, 10000); if LongBool(kByte and NET_KEY_NW) then PressKey(KEY_NEXTWEAPON, 10000); if LongBool(kByte and NET_KEY_PW) then PressKey(KEY_PREVWEAPON, 10000); + + if WeaponSelect <> 255 then + QueueWeaponSwitch(WeaponSelect); end; // MH_SEND_PlayerPos(False, PID, C^.ID); @@ -653,14 +668,22 @@ begin for I := Low(gRenderForegrounds) to High(gRenderForegrounds) do if gRenderForegrounds[I] <> nil then with gRenderForegrounds[I] do + begin if (GetTextureCount > 1) then MH_SEND_PanelTexture(PanelType, I, LastAnimLoop, ID); + if Moved then + MH_SEND_PanelState(PanelType, I, ID); + end; if gRenderBackgrounds <> nil then for I := Low(gRenderBackgrounds) to High(gRenderBackgrounds) do if gRenderBackgrounds[I] <> nil then with gRenderBackgrounds[I] do - if GetTextureCount > 1 then + begin + if (GetTextureCount > 1) then MH_SEND_PanelTexture(PanelType, I, LastAnimLoop, ID); + if Moved then + MH_SEND_PanelState(PanelType, I, ID); + end; if gWater <> nil then for I := Low(gWater) to High(gWater) do if gWater[I] <> nil then @@ -719,7 +742,7 @@ procedure MH_SEND_Info(ID: Byte); var Map: string; begin - g_ProcessResourceStr(gMapInfo.Map, nil, nil, @Map); + Map := g_ExtractFileName(gMapInfo.Map); e_Buffer_Clear(@NetOut); @@ -820,12 +843,18 @@ begin g_Net_Host_Send(ID, False, NET_CHAN_GAME); end; -procedure MH_SEND_Sound(X, Y: Integer; Name: string; ID: Integer = NET_EVERYONE); +procedure MH_SEND_Sound(X, Y: Integer; Name: string; Pos: Boolean = True; ID: Integer = NET_EVERYONE); begin e_Buffer_Write(@NetOut, Byte(NET_MSG_SND)); e_Buffer_Write(@NetOut, Name); - e_Buffer_Write(@NetOut, X); - e_Buffer_Write(@NetOut, Y); + if Pos then + begin + e_Buffer_Write(@NetOut, Byte(1)); + e_Buffer_Write(@NetOut, X); + e_Buffer_Write(@NetOut, Y); + end + else + e_Buffer_Write(@NetOut, Byte(0)); g_Net_Host_Send(ID, False, NET_CHAN_GAME); end; @@ -1213,6 +1242,16 @@ begin TP := gWalls[PID]; PANEL_LIFTUP, PANEL_LIFTDOWN, PANEL_LIFTLEFT, PANEL_LIFTRIGHT: TP := gLifts[PID]; + PANEL_BACK: + begin + TP := gRenderBackgrounds[PID]; + TP.Moved := True; + end; + PANEL_FORE: + begin + TP := gRenderForegrounds[PID]; + TP.Moved := True; + end; else Exit; end; @@ -1222,6 +1261,8 @@ begin e_Buffer_Write(@NetOut, PID); e_Buffer_Write(@NetOut, Byte(TP.Enabled)); e_Buffer_Write(@NetOut, TP.LiftType); + e_Buffer_Write(@NetOut, TP.X); + e_Buffer_Write(@NetOut, TP.Y); g_Net_Host_Send(ID, True, NET_CHAN_LARGEDATA); end; @@ -1525,11 +1566,18 @@ procedure MC_RECV_Sound(P: Pointer); var Name: string; X, Y: Integer; + Pos: Boolean; begin Name := e_Raw_Read_String(P); - X := e_Raw_Read_LongInt(P); - Y := e_Raw_Read_LongInt(P); - g_Sound_PlayExAt(Name, X, Y); + Pos := e_Raw_Read_Byte(P) <> 0; + if Pos then + begin + X := e_Raw_Read_LongInt(P); + Y := e_Raw_Read_LongInt(P); + g_Sound_PlayExAt(Name, X, Y); + end + else + g_Sound_PlayEx(Name); end; procedure MC_RECV_CreateShot(P: Pointer); @@ -2417,12 +2465,15 @@ var E: Boolean; Lift: Byte; PType: Word; + X, Y: Integer; begin if not gGameOn then Exit; PType := e_Raw_Read_Word(P); ID := e_Raw_Read_LongWord(P); E := (e_Raw_Read_Byte(P) <> 0); Lift := e_Raw_Read_Byte(P); + X := e_Raw_Read_LongInt(P); + Y := e_Raw_Read_LongInt(P); case PType of PANEL_WALL, PANEL_OPENDOOR, PANEL_CLOSEDOOR: @@ -2433,6 +2484,18 @@ begin PANEL_LIFTUP, PANEL_LIFTDOWN, PANEL_LIFTLEFT, PANEL_LIFTRIGHT: g_Map_SetLift(ID, Lift); + + PANEL_BACK: + begin + gRenderBackgrounds[ID].X := X; + gRenderBackgrounds[ID].Y := Y; + end; + + PANEL_FORE: + begin + gRenderForegrounds[ID].X := X; + gRenderForegrounds[ID].Y := Y; + end; end; end; @@ -2691,8 +2754,6 @@ begin e_Buffer_Clear(@NetOut); e_Buffer_Write(@NetOut, Byte(NET_MSG_INFO)); - e_Buffer_Write(@NetOut, Byte(0)); // to kill old clients - e_Buffer_Write(@NetOut, Byte(NET_PROTO_VERSION)); e_Buffer_Write(@NetOut, GAME_VERSION); e_Buffer_Write(@NetOut, Password); e_Buffer_Write(@NetOut, gPlayer1Settings.Name); @@ -2714,10 +2775,20 @@ begin g_Net_Client_Send(True, NET_CHAN_CHAT); end; +function isKeyPressed (key1: Word; key2: Word): Boolean; +begin + if (key1 <> 0) and e_KeyPressed(key1) then begin result := true; exit; end; + if (key2 <> 0) and e_KeyPressed(key2) then begin result := true; exit; end; + result := false; +end; + procedure MC_SEND_PlayerPos(); var kByte: Word; Predict: Boolean; + strafeDir: Byte; + WeaponSelect: Byte = 255; + I: Integer; begin if not gGameOn then Exit; if gPlayers = nil then Exit; @@ -2727,25 +2798,30 @@ begin Predict := NetPredictSelf; // and (not NetGotKeys); if (not gConsoleShow) and (not gChatShow) and (g_ActiveWindow = nil) then + begin + strafeDir := P1MoveButton shr 4; + P1MoveButton := P1MoveButton and $0F; with gGameControls.P1Control do begin - if e_KeyPressed(KeyLeft) and (not e_KeyPressed(KeyRight)) then - P1MoveButton := 1 - else - if (not e_KeyPressed(KeyLeft)) and e_KeyPressed(KeyRight) then - P1MoveButton := 2 - else - if (not e_KeyPressed(KeyLeft)) and (not e_KeyPressed(KeyRight)) then - P1MoveButton := 0; + if isKeyPressed(KeyLeft, KeyLeft2) and (not isKeyPressed(KeyRight, KeyRight2)) then P1MoveButton := 1 + else if (not isKeyPressed(KeyLeft, KeyLeft2)) and isKeyPressed(KeyRight, KeyRight2) then P1MoveButton := 2 + else if (not isKeyPressed(KeyLeft, KeyLeft2)) and (not isKeyPressed(KeyRight, KeyRight2)) then P1MoveButton := 0; - if (P1MoveButton = 2) and e_KeyPressed(KeyLeft) then - gPlayer1.SetDirection(D_LEFT) + // strafing + if isKeyPressed(KeyStrafe, KeyStrafe2) then + begin + // new strafe mechanics + if (strafeDir = 0) then strafeDir := P1MoveButton; // start strafing + // now set direction according to strafe (reversed) + if (strafeDir = 2) then gPlayer1.SetDirection(D_LEFT) + else if (strafeDir = 1) then gPlayer1.SetDirection(D_RIGHT); + end else - if (P1MoveButton = 1) and e_KeyPressed(KeyRight) then - gPlayer1.SetDirection(D_RIGHT) - else - if P1MoveButton <> 0 then - gPlayer1.SetDirection(TDirection(P1MoveButton-1)); + begin + if (P1MoveButton = 2) and isKeyPressed(KeyLeft, KeyLeft2) then gPlayer1.SetDirection(D_LEFT) + else if (P1MoveButton = 1) and isKeyPressed(KeyRight, KeyRight2) then gPlayer1.SetDirection(D_RIGHT) + else if P1MoveButton <> 0 then gPlayer1.SetDirection(TDirection(P1MoveButton-1)); + end; gPlayer1.ReleaseKeys; if P1MoveButton = 1 then @@ -2758,26 +2834,32 @@ begin kByte := kByte or NET_KEY_RIGHT; if Predict then gPlayer1.PressKey(KEY_RIGHT, 10000); end; - if e_KeyPressed(KeyUp) then + if isKeyPressed(KeyUp, KeyUp2) then begin kByte := kByte or NET_KEY_UP; gPlayer1.PressKey(KEY_UP, 10000); end; - if e_KeyPressed(KeyDown) then + if isKeyPressed(KeyDown, KeyDown2) then begin kByte := kByte or NET_KEY_DOWN; gPlayer1.PressKey(KEY_DOWN, 10000); end; - if e_KeyPressed(KeyJump) then + if isKeyPressed(KeyJump, KeyJump2) then begin kByte := kByte or NET_KEY_JUMP; // gPlayer1.PressKey(KEY_JUMP, 10000); // TODO: Make a prediction option end; - if e_KeyPressed(KeyFire) then kByte := kByte or NET_KEY_FIRE; - if e_KeyPressed(KeyOpen) then kByte := kByte or NET_KEY_OPEN; - if e_KeyPressed(KeyNextWeapon) then kByte := kByte or NET_KEY_NW; - if e_KeyPressed(KeyPrevWeapon) then kByte := kByte or NET_KEY_PW; - end + if isKeyPressed(KeyFire, KeyFire2) then kByte := kByte or NET_KEY_FIRE; + if isKeyPressed(KeyOpen, KeyOpen2) then kByte := kByte or NET_KEY_OPEN; + if isKeyPressed(KeyNextWeapon, KeyNextWeapon2) then kByte := kByte or NET_KEY_NW; + if isKeyPressed(KeyPrevWeapon, KeyPrevWeapon2) then kByte := kByte or NET_KEY_PW; + for I := 0 to High(KeyWeapon) do + if isKeyPressed(KeyWeapon[I], KeyWeapon2[I]) then + WeaponSelect := I; + end; + // fix movebutton state + P1MoveButton := P1MoveButton or (strafeDir shl 4); + end else kByte := NET_KEY_CHAT; @@ -2785,6 +2867,7 @@ begin e_Buffer_Write(@NetOut, gTime); e_Buffer_Write(@NetOut, kByte); e_Buffer_Write(@NetOut, Byte(gPlayer1.Direction)); + e_Buffer_Write(@NetOut, WeaponSelect); g_Net_Client_Send(True, NET_CHAN_PLAYERPOS); //kBytePrev := kByte; @@ -2845,12 +2928,22 @@ end; function ReadFile(const FileName: TFileName): AByte; var - FileStream : TFileStream; + FileStream : TStream; + fname: string; begin + e_WriteLog(Format('NETWORK: looking for file "%s"', [FileName]), MSG_NOTIFY); + fname := findDiskWad(FileName); + if length(fname) = 0 then + begin + e_WriteLog(Format('NETWORK: file "%s" not found!', [FileName]), MSG_FATALERROR); + SetLength(Result, 0); + exit; + end; + e_WriteLog(Format('NETWORK: found file "%s"', [fname]), MSG_NOTIFY); Result := nil; - FileStream:= TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); + FileStream := openDiskFileRO(fname); try - if FileStream.Size>0 then + if FileStream.Size > 0 then begin SetLength(Result, FileStream.Size); FileStream.Read(Result[0], FileStream.Size);