X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_netmsg.pas;h=b4612d3ec5cc8e7d676cc89ccac23d6f71d9066b;hb=94c8854f0ba3a87de3928f587e66d5d0e43d8f9b;hp=58b008f1d0edd09769d4a06c69d8c27d49c0a39e;hpb=3349a0b38bc1fae71b758cb1686d4f6d0bf4f926;p=d2df-sdl.git diff --git a/src/game/g_netmsg.pas b/src/game/g_netmsg.pas index 58b008f..b4612d3 100644 --- a/src/game/g_netmsg.pas +++ b/src/game/g_netmsg.pas @@ -13,7 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *) -{$MODE DELPHI} +{$INCLUDE g_amodes.inc} unit g_netmsg; interface @@ -430,7 +430,8 @@ end; function MH_RECV_PlayerPos(C: pTNetClient; P: Pointer): Word; var - Dir: Byte; + Dir, i: Byte; + WeaponSelect: Word; PID: Word; kByte: Word; Pl: TPlayer; @@ -452,8 +453,11 @@ begin NetTime := GT; kByte := e_Raw_Read_Word(P); Dir := e_Raw_Read_Byte(P); + WeaponSelect := e_Raw_Read_Word(P); + //e_WriteLog(Format('R:ws=%d', [WeaponSelect]), MSG_WARNING); if Direction <> TDirection(Dir) then JustTeleported := False; + SetDirection(TDirection(Dir)); ReleaseKeys; @@ -472,6 +476,15 @@ 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); + + for i := 0 to 15 do + begin + if (WeaponSelect and Word(1 shl i)) <> 0 then + begin + //e_WriteLog(Format(' R:wn=%d', [i]), MSG_WARNING); + QueueWeaponSwitch(i); + end; + end; end; // MH_SEND_PlayerPos(False, PID, C^.ID); @@ -1061,13 +1074,13 @@ begin e_Buffer_Write(@NetOut, Lives); e_Buffer_Write(@NetOut, Team); - for I := WEAPON_KASTET to WEAPON_SUPERPULEMET do + for I := WP_FIRST to WP_LAST do e_Buffer_Write(@NetOut, Byte(FWeapon[I])); - for I := A_BULLETS to A_CELLS do + for I := A_BULLETS to A_HIGH do e_Buffer_Write(@NetOut, FAmmo[I]); - for I := A_BULLETS to A_CELLS do + for I := A_BULLETS to A_HIGH do e_Buffer_Write(@NetOut, FMaxAmmo[I]); for I := MR_SUIT to MR_MAX do @@ -1089,6 +1102,7 @@ begin e_Buffer_Write(@NetOut, Byte(FPhysics)); e_Buffer_Write(@NetOut, Byte(FNoRespawn)); e_Buffer_Write(@NetOut, Byte(FJetpack)); + e_Buffer_Write(@NetOut, FFireTime); end; g_Net_Host_Send(ID, True, NET_CHAN_PLAYER); @@ -1365,6 +1379,7 @@ begin e_Buffer_Write(@NetOut, MonsterAmmo); e_Buffer_Write(@NetOut, MonsterPain); e_Buffer_Write(@NetOut, Byte(AnimIsReverse)); + e_Buffer_Write(@NetOut, FFireTime); end; g_Net_Host_Send(ID, True, NET_CHAN_MONSTER); @@ -2114,13 +2129,13 @@ begin Lives := e_Raw_Read_Byte(P); NewTeam := e_Raw_Read_Byte(P); - for I := WEAPON_KASTET to WEAPON_SUPERPULEMET do + for I := WP_FIRST to WP_LAST do FWeapon[I] := (e_Raw_Read_Byte(P) <> 0); - for I := A_BULLETS to A_CELLS do + for I := A_BULLETS to A_HIGH do FAmmo[I] := e_Raw_Read_Word(P); - for I := A_BULLETS to A_CELLS do + for I := A_BULLETS to A_HIGH do FMaxAmmo[I] := e_Raw_Read_Word(P); for I := MR_SUIT to MR_MAX do @@ -2169,6 +2184,7 @@ begin FNoRespawn := e_Raw_Read_Byte(P) <> 0; OldJet := FJetpack; FJetpack := e_Raw_Read_Byte(P) <> 0; + FFireTime := e_Raw_Read_LongInt(P); if OldJet and not FJetpack then JetpackOff else if not OldJet and FJetpack then @@ -2372,7 +2388,8 @@ begin else if gItems[ID].ItemType in [ITEM_WEAPON_SAW, ITEM_WEAPON_PISTOL, ITEM_WEAPON_SHOTGUN1, ITEM_WEAPON_SHOTGUN2, ITEM_WEAPON_CHAINGUN, ITEM_WEAPON_ROCKETLAUNCHER, ITEM_WEAPON_PLASMA, - ITEM_WEAPON_BFG, ITEM_WEAPON_SUPERPULEMET, ITEM_AMMO_BACKPACK] then + ITEM_WEAPON_BFG, ITEM_WEAPON_SUPERPULEMET, ITEM_WEAPON_FLAMETHROWER, + ITEM_AMMO_BACKPACK] then g_Sound_PlayExAt('SOUND_ITEM_GETWEAPON', gItems[ID].Obj.X, gItems[ID].Obj.Y) else @@ -2388,7 +2405,7 @@ begin else if gItems[ID].ItemType in [ITEM_WEAPON_SAW, ITEM_WEAPON_PISTOL, ITEM_WEAPON_SHOTGUN1, ITEM_WEAPON_SHOTGUN2, ITEM_WEAPON_CHAINGUN, ITEM_WEAPON_ROCKETLAUNCHER, ITEM_WEAPON_PLASMA, - ITEM_WEAPON_BFG, ITEM_WEAPON_SUPERPULEMET] then + ITEM_WEAPON_BFG, ITEM_WEAPON_SUPERPULEMET, ITEM_WEAPON_FLAMETHROWER] then g_Sound_PlayExAt('SOUND_ITEM_GETWEAPON', gItems[ID].Obj.X, gItems[ID].Obj.Y) else @@ -2654,6 +2671,7 @@ begin MonsterAmmo := e_Raw_Read_LongInt(P); MonsterPain := e_Raw_Read_LongInt(P); AnimRevert := e_Raw_Read_Byte(P) <> 0; + FFireTime := e_Raw_Read_LongInt(P); RevertAnim(AnimRevert); if MonsterState <> MState then @@ -2759,6 +2777,7 @@ begin e_Buffer_Write(@NetOut, gPlayer1Settings.Team); g_Net_Client_Send(True, NET_CHAN_SERVICE); + g_Net_Flush(); // send immediately, there's no frames yet end; procedure MC_SEND_Chat(Txt: string; Mode: Byte); @@ -2770,10 +2789,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: Word = 0; + I: Integer; begin if not gGameOn then Exit; if gPlayers = nil then Exit; @@ -2783,25 +2812,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 @@ -2814,26 +2848,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 := WeaponSelect or Word(1 shl I); + end; + // fix movebutton state + P1MoveButton := P1MoveButton or (strafeDir shl 4); + end else kByte := NET_KEY_CHAT; @@ -2841,6 +2881,8 @@ begin e_Buffer_Write(@NetOut, gTime); e_Buffer_Write(@NetOut, kByte); e_Buffer_Write(@NetOut, Byte(gPlayer1.Direction)); + e_Buffer_Write(@NetOut, WeaponSelect); + //e_WriteLog(Format('S:ws=%d', [WeaponSelect]), MSG_WARNING); g_Net_Client_Send(True, NET_CHAN_PLAYERPOS); //kBytePrev := kByte; @@ -2873,6 +2915,7 @@ begin e_Buffer_Write(@NetOut, Byte(NET_MSG_REQFST)); g_Net_Client_Send(True, NET_CHAN_SERVICE); + g_Net_Flush(); // send immediately, because loading end; procedure MC_SEND_CheatRequest(Kind: Byte); @@ -2945,9 +2988,11 @@ end; procedure ResDataMsgToBytes(var bytes: AByte; const ResData: TResDataMsg); var ResultStream: TMemoryStream; + dummy: Word = $FFFE; begin ResultStream := TMemoryStream.Create; + ResultStream.WriteBuffer(dummy, 2); //dummy length ResultStream.WriteBuffer(ResData.MsgId, SizeOf(ResData.MsgId)); //msgId ResultStream.WriteBuffer(ResData.FileSize, SizeOf(ResData.FileSize)); //file size ResultStream.WriteBuffer(ResData.FileData[0], ResData.FileSize); //file data @@ -2971,11 +3016,13 @@ procedure MapDataMsgToBytes(var bytes: AByte; const MapDataMsg: TMapDataMsg); var ResultStream: TMemoryStream; resCount: Integer; + dummy: Word = $FFFF; begin resCount := Length(MapDataMsg.ExternalResources); ResultStream := TMemoryStream.Create; + ResultStream.WriteBuffer(dummy, 2); //dummy length ResultStream.WriteBuffer(MapDataMsg.MsgId, SizeOf(MapDataMsg.MsgId)); //msgId ResultStream.WriteBuffer(MapDataMsg.FileSize, SizeOf(MapDataMsg.FileSize)); //file size ResultStream.WriteBuffer(MapDataMsg.FileData[0], MapDataMsg.FileSize); //file data