From 85f0d06ec81bc2e66f235f87cf5c6844487b26c6 Mon Sep 17 00:00:00 2001 From: Ketmar Dark Date: Mon, 1 Oct 2018 11:04:38 +0300 Subject: [PATCH] network: do not send weapon switch keys over the network, send actual selected weapon instead --- src/game/g_netmsg.pas | 33 +++++++++++++++++++++------------ src/game/g_player.pas | 27 +++++++++++++++++++++------ 2 files changed, 42 insertions(+), 18 deletions(-) diff --git a/src/game/g_netmsg.pas b/src/game/g_netmsg.pas index b170097..6d1f430 100644 --- a/src/game/g_netmsg.pas +++ b/src/game/g_netmsg.pas @@ -430,8 +430,8 @@ end; function MH_RECV_PlayerPos(C: pTNetClient; var M: TMsg): Word; var - Dir, i: Byte; - WeaponSelect: Word; + Dir{, i}: Byte; + //WeaponSelect: Word; PID: Word; kByte: Word; Pl: TPlayer; @@ -453,13 +453,14 @@ begin NetTime := GT; kByte := M.ReadWord(); Dir := M.ReadByte(); - WeaponSelect := M.ReadWord(); + //WeaponSelect := M.ReadWord(); + SetWeapon(M.ReadByte()); //e_WriteLog(Format('R:ws=%d', [WeaponSelect]), MSG_WARNING); if Direction <> TDirection(Dir) then JustTeleported := False; SetDirection(TDirection(Dir)); - ReleaseKeys; + ReleaseKeysNoWeapon(); if kByte = NET_KEY_CHAT then begin @@ -474,9 +475,10 @@ begin if LongBool(kByte and NET_KEY_JUMP) then PressKey(KEY_JUMP, 10000); if LongBool(kByte and NET_KEY_FIRE) then PressKey(KEY_FIRE, 10000); 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 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 @@ -485,6 +487,7 @@ begin QueueWeaponSwitch(i); end; end; + *) end; // MH_SEND_PlayerPos(False, PID, C^.ID); @@ -2046,7 +2049,7 @@ begin TmpX := M.ReadLongInt(); TmpY := M.ReadLongInt(); - ReleaseKeys; + ReleaseKeysNoWeapon; if (kByte = NET_KEY_CHAT) then PressKey(KEY_CHAT, 10000) @@ -2738,7 +2741,7 @@ var kByte: Word; Predict: Boolean; strafeDir: Byte; - WeaponSelect: Word = 0; + //WeaponSelect: Word = 0; I: Integer; begin if not gGameOn then Exit; @@ -2805,14 +2808,19 @@ begin 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) and gPlayer1.isWeaponSwitchKeyReleased(-1) then kByte := kByte or NET_KEY_NW; - if isKeyPressed(KeyPrevWeapon, KeyPrevWeapon2) and gPlayer1.isWeaponSwitchKeyReleased(-2) then kByte := kByte or NET_KEY_PW; + // do not send weapon switch keys, `MH_SEND_PlayerStats()` will send changed weapon anyway + if isKeyPressed(KeyNextWeapon, KeyNextWeapon2) and gPlayer1.isWeaponSwitchKeyReleased(-1) then gPlayer1.PressKey(KEY_NEXTWEAPON); //kByte := kByte or NET_KEY_NW; + if isKeyPressed(KeyPrevWeapon, KeyPrevWeapon2) and gPlayer1.isWeaponSwitchKeyReleased(-2) then gPlayer1.PressKey(KEY_PREVWEAPON); //kByte := kByte or NET_KEY_PW; for I := 0 to High(KeyWeapon) do begin if isKeyPressed(KeyWeapon[I], KeyWeapon2[I]) then begin gPlayer1.weaponSwitchKeysStateChange(i, true); - if gPlayer1.isWeaponSwitchKeyReleased(i) then WeaponSelect := WeaponSelect or Word(1 shl I); + if gPlayer1.isWeaponSwitchKeyReleased(i) then + begin + gPlayer1.QueueWeaponSwitch(i); // all choices are passed there, and god will take the best + //WeaponSelect := WeaponSelect or Word(1 shl I); + end; end else begin @@ -2832,7 +2840,8 @@ begin NetOut.Write(gTime); NetOut.Write(kByte); NetOut.Write(Byte(gPlayer1.Direction)); - NetOut.Write(WeaponSelect); + NetOut.Write(Byte(gPlayer1.CurrWeap)); + //NetOut.Write(WeaponSelect); //e_WriteLog(Format('S:ws=%d', [WeaponSelect]), MSG_WARNING); g_Net_Client_Send(True, NET_CHAN_PLAYERPOS); diff --git a/src/game/g_player.pas b/src/game/g_player.pas index 4604b3c..f9de619 100644 --- a/src/game/g_player.pas +++ b/src/game/g_player.pas @@ -274,6 +274,7 @@ type function GetRespawnPoint(): Byte; procedure PressKey(Key: Byte; Time: Word = 1); procedure ReleaseKeys(); + procedure ReleaseKeysNoWeapon(); procedure SetModel(ModelName: String); procedure SetColor(Color: TRGB); procedure SetWeapon(W: Byte); @@ -3589,7 +3590,7 @@ end; procedure TPlayer.QueueWeaponSwitch(Weapon: Byte); begin - if g_Game_IsClient then Exit; + //if g_Game_IsClient then Exit; if Weapon > High(FWeapon) then Exit; FNextWeap := FNextWeap or (1 shl Weapon); end; @@ -3841,13 +3842,13 @@ end; procedure TPlayer.NextWeapon(); begin - if g_Game_IsClient then Exit; + //if g_Game_IsClient then Exit; FNextWeap := $8000; end; procedure TPlayer.PrevWeapon(); begin - if g_Game_IsClient then Exit; + //if g_Game_IsClient then Exit; FNextWeap := $4000; end; @@ -4966,6 +4967,7 @@ begin DoLerp(4); if NetServer then + begin if FClientID >= 0 then begin FPing := NetClients[FClientID].Peer^.lastRoundTripTime; @@ -4978,6 +4980,7 @@ begin FPing := 0; FLoss := 0; end; + end; if FAlive and (FPunchAnim <> nil) then FPunchAnim.Update(); @@ -5008,8 +5011,8 @@ begin end; // no need to do that each second frame, weapon queue will take care of it - if FAlive and FKeys[KEY_NEXTWEAPON].Pressed and AnyServer then NextWeapon(); - if FAlive and FKeys[KEY_PREVWEAPON].Pressed and AnyServer then PrevWeapon(); + if FAlive and FKeys[KEY_NEXTWEAPON].Pressed {and AnyServer} then NextWeapon(); + if FAlive and FKeys[KEY_PREVWEAPON].Pressed {and AnyServer} then PrevWeapon(); if gTime mod (GAME_TICK*2) <> 0 then begin @@ -5829,6 +5832,18 @@ begin end; end; +procedure TPlayer.ReleaseKeysNoWeapon(); +var + a: Integer; +begin + for a := Low(FKeys) to High(FKeys) do + begin + if (a = KEY_PREVWEAPON) or (a = KEY_NEXTWEAPON) then continue; + FKeys[a].Pressed := False; + FKeys[a].Time := 0; + end; +end; + procedure TPlayer.OnDamage(Angle: SmallInt); begin end; @@ -7035,7 +7050,7 @@ begin end; end; - //HACK! (does it belongs there?) + //HACK! (does it belong there?) RealizeCurrentWeapon(); // Åñëè åñòü âîçìîæíûå öåëè: -- 2.29.2