From 7c0186b3f1e66e80377d14364f0cec949e44e615 Mon Sep 17 00:00:00 2001 From: Ketmar Dark Date: Sun, 30 Sep 2018 02:11:06 +0300 Subject: [PATCH] fixed weapon switching over the network; bumped protocol version WARNING! all weapon selection logic is done by The Server (including priorities), so we cannot simply do it on a client and send a new weapon number (at least not yet). it means that client and server code should be in sync, and you have to bump protocol version if weapon priorities changes. --- src/game/g_net.pas | 2 +- src/game/g_netmsg.pas | 20 +++++++++++++++++--- src/game/g_player.pas | 1 + 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/game/g_net.pas b/src/game/g_net.pas index c15df2b..4eeeede 100644 --- a/src/game/g_net.pas +++ b/src/game/g_net.pas @@ -22,7 +22,7 @@ uses e_log, e_msg, ENet, Classes, MAPDEF{$IFDEF USE_MINIUPNPC}, miniupnpc;{$ELSE};{$ENDIF} const - NET_PROTOCOL_VER = 174; + NET_PROTOCOL_VER = 175; NET_MAXCLIENTS = 24; NET_CHANS = 11; diff --git a/src/game/g_netmsg.pas b/src/game/g_netmsg.pas index a7ff31a..01dcc3c 100644 --- a/src/game/g_netmsg.pas +++ b/src/game/g_netmsg.pas @@ -2759,6 +2759,9 @@ begin end; gPlayer1.ReleaseKeys; + gPlayer1.weaponSwitchKeysStateChange(-1, isKeyPressed(KeyNextWeapon, KeyNextWeapon2)); + gPlayer1.weaponSwitchKeysStateChange(-2, isKeyPressed(KeyPrevWeapon, KeyPrevWeapon2)); + if P1MoveButton = 1 then begin kByte := kByte or NET_KEY_LEFT; @@ -2786,11 +2789,20 @@ 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) then kByte := kByte or NET_KEY_NW; - if isKeyPressed(KeyPrevWeapon, KeyPrevWeapon2) then kByte := kByte or NET_KEY_PW; + 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; for I := 0 to High(KeyWeapon) do + begin if isKeyPressed(KeyWeapon[I], KeyWeapon2[I]) then - WeaponSelect := WeaponSelect or Word(1 shl I); + begin + gPlayer1.weaponSwitchKeysStateChange(i, true); + if gPlayer1.isWeaponSwitchKeyReleased(i) then WeaponSelect := WeaponSelect or Word(1 shl I); + end + else + begin + gPlayer1.weaponSwitchKeysStateChange(i, false); + end; + end; end; // fix movebutton state P1MoveButton := P1MoveButton or (strafeDir shl 4); @@ -2798,6 +2810,8 @@ begin else kByte := NET_KEY_CHAT; + gPlayer1.weaponSwitchKeysShiftNewStates(); + NetOut.Write(Byte(NET_MSG_PLRPOS)); NetOut.Write(gTime); NetOut.Write(kByte); diff --git a/src/game/g_player.pas b/src/game/g_player.pas index 39aab01..4604b3c 100644 --- a/src/game/g_player.pas +++ b/src/game/g_player.pas @@ -4230,6 +4230,7 @@ begin Result := True; remove := True; FFireTime := 0; + //k8:do we need it? if g_Game_IsNet and g_Game_IsServer then MH_SEND_PlayerStats(FUID); end; if FHealth < PLAYER_HP_SOFT then begin -- 2.29.2