X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_netmsg.pas;h=e838a9b7fff87f34eaceee923c3dc387feb14fe1;hb=ba177dd9743397cb43dad787fbe7748c8ea51cba;hp=d03760d06cb1e12ab2535ce7e1ae7e92e7edd443;hpb=9bd99e6d9059fb7e9baaa55f1e3a9e7b2ff83f9e;p=d2df-sdl.git diff --git a/src/game/g_netmsg.pas b/src/game/g_netmsg.pas index d03760d..e838a9b 100644 --- a/src/game/g_netmsg.pas +++ b/src/game/g_netmsg.pas @@ -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,7 +1074,7 @@ 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 @@ -2114,7 +2127,7 @@ 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 @@ -2781,6 +2794,9 @@ 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; @@ -2790,15 +2806,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 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 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)); + // 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 + 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 @@ -2830,7 +2861,13 @@ begin 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; - end + 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; @@ -2838,6 +2875,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;