X-Git-Url: http://deadsoftware.ru/gitweb?p=d2df-sdl.git;a=blobdiff_plain;f=src%2Fgame%2Fg_netmsg.pas;h=a7ff31a9639fe68fdf2efdae7e308b54a1683a5d;hp=7cd1a7cc8ecd18dec4363db5ad4e55d1682206e8;hb=ef4db75afec0dcd71f0bbe75b5f0b20537c8eac1;hpb=c97b4f7894fd3d797ecea3de574b58499c43aa85 diff --git a/src/game/g_netmsg.pas b/src/game/g_netmsg.pas index 7cd1a7c..a7ff31a 100644 --- a/src/game/g_netmsg.pas +++ b/src/game/g_netmsg.pas @@ -16,8 +16,6 @@ {$INCLUDE ../shared/a_modes.inc} unit g_netmsg; -{.$DEFINE K8_XXX_WEAPON_DEBUG} - interface uses e_msg, g_net, g_triggers, Classes, SysUtils, md5; @@ -432,13 +430,12 @@ 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; - GT, wctr: LongWord; - newweapon: Byte; + GT: LongWord; begin Result := 0; if not gGameOn then Exit; @@ -456,25 +453,13 @@ begin NetTime := GT; kByte := M.ReadWord(); Dir := M.ReadByte(); - wctr := M.ReadLongWord(); - newweapon := M.ReadByte(); - if (wctr > Pl.NetWeapCtr) then - begin - if (newweapon <> CurrWeap) then - begin -{$IFDEF K8_XXX_WEAPON_DEBUG} - writeln('HOST PLRPOS: got: currweap=', CurrWeap, '; curfrm=', gTime, '; netweap=', newweapon, '; oldweap=', CurrWeap); -{$ENDIF} - SetWeaponHost(newweapon); - end; - Pl.NetWeapCtr := wctr; - end; + WeaponSelect := M.ReadWord(); //e_WriteLog(Format('R:ws=%d', [WeaponSelect]), MSG_WARNING); if Direction <> TDirection(Dir) then JustTeleported := False; SetDirection(TDirection(Dir)); - ReleaseKeysNoWeapon(); + ReleaseKeys; if kByte = NET_KEY_CHAT then begin @@ -489,10 +474,9 @@ 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 @@ -501,7 +485,6 @@ begin QueueWeaponSwitch(i); end; end; - *) end; // MH_SEND_PlayerPos(False, PID, C^.ID); @@ -1012,9 +995,7 @@ begin NetOut.Write(FPing); NetOut.Write(FLoss); if IsKeyPressed(KEY_CHAT) then - begin - kByte := NET_KEY_CHAT; - end + kByte := NET_KEY_CHAT else begin if IsKeyPressed(KEY_LEFT) then kByte := kByte or NET_KEY_LEFT; @@ -1027,10 +1008,6 @@ begin NetOut.Write(kByte); if Direction = TDirection.D_LEFT then NetOut.Write(Byte(0)) else NetOut.Write(Byte(1)); - - NetOut.Write(LongWord(Pl.NetWeapCtr)); - NetOut.Write(Byte(Pl.CurrWeap)); - NetOut.Write(GameX); NetOut.Write(GameY); NetOut.Write(GameVelX); @@ -1046,7 +1023,6 @@ procedure MH_SEND_PlayerStats(PID: Word; ID: Integer = NET_EVERYONE); var P: TPlayer; I: Integer; - ww: Word; begin P := g_Player_Get(PID); if P = nil then Exit; @@ -1065,10 +1041,8 @@ begin NetOut.Write(Lives); NetOut.Write(Team); - // collect all weapons in one word - ww := 0; - for I := WP_FIRST to WP_LAST do if (FWeapon[I]) then ww := ww or (1 shl (i-WP_FIRST)); - NetOut.Write(Word(ww)); + for I := WP_FIRST to WP_LAST do + NetOut.Write(Byte(FWeapon[I])); for I := A_BULLETS to A_HIGH do NetOut.Write(FAmmo[I]); @@ -1079,30 +1053,22 @@ begin for I := MR_SUIT to MR_MAX do NetOut.Write(LongWord(FMegaRulez[I])); - // collect all special flags in one byte - ww := 0; - if (R_ITEM_BACKPACK in FRulez) then ww := ww or $01; - if (R_KEY_RED in FRulez) then ww := ww or $02; - if (R_KEY_GREEN in FRulez) then ww := ww or $04; - if (R_KEY_BLUE in FRulez) then ww := ww or $08; - if (R_BERSERK in FRulez) then ww := ww or $10; - NetOut.Write(Byte(ww)); + NetOut.Write(Byte(R_ITEM_BACKPACK in FRulez)); + NetOut.Write(Byte(R_KEY_RED in FRulez)); + NetOut.Write(Byte(R_KEY_GREEN in FRulez)); + NetOut.Write(Byte(R_KEY_BLUE in FRulez)); + NetOut.Write(Byte(R_BERSERK in FRulez)); NetOut.Write(Frags); NetOut.Write(Death); - NetOut.Write(LongWord(NetWeapCtr)); - NetOut.Write(Byte(CurrWeap)); - - // other flags - ww := 0; - if (FSpectator) then ww := ww or $01; - if (FGhost) then ww := ww or $02; - if (FPhysics) then ww := ww or $04; - if (FNoRespawn) then ww := ww or $08; - if (FJetpack) then ww := ww or $10; - NetOut.Write(Byte(ww)); + NetOut.Write(CurrWeap); + NetOut.Write(Byte(FSpectator)); + NetOut.Write(Byte(FGhost)); + NetOut.Write(Byte(FPhysics)); + NetOut.Write(Byte(FNoRespawn)); + NetOut.Write(Byte(FJetpack)); NetOut.Write(FFireTime); end; @@ -2036,11 +2002,11 @@ end; function MC_RECV_PlayerPos(var M: TMsg): Word; var - GT, wctr: LongWord; + GT: LongWord; PID: Word; kByte: Word; Pl: TPlayer; - Dir, weapon: Byte; + Dir: Byte; TmpX, TmpY: Integer; begin Result := 0; @@ -2067,24 +2033,13 @@ begin kByte := M.ReadWord(); Dir := M.ReadByte(); - wctr := M.ReadLongWord(); - weapon := M.ReadByte(); - // `>=`, so server is still the authority - if (wctr >= Pl.NetWeapCtr) then - begin - Pl.CurrWeap := weapon; - Pl.NetWeapCtr := wctr; - end; - TmpX := M.ReadLongInt(); TmpY := M.ReadLongInt(); - ReleaseKeysNoWeapon; + ReleaseKeys; if (kByte = NET_KEY_CHAT) then - begin - PressKey(KEY_CHAT, 10000); - end + PressKey(KEY_CHAT, 10000) else begin if LongBool(kByte and NET_KEY_LEFT) then PressKey(KEY_LEFT, 10000); @@ -2113,9 +2068,6 @@ var I: Integer; OldJet: Boolean; NewTeam: Byte; - ww: Word; - newweapon: Byte; - wctr: LongWord; begin PID := M.ReadWord(); Pl := g_Player_Get(PID); @@ -2134,12 +2086,8 @@ begin Lives := M.ReadByte(); NewTeam := M.ReadByte(); - ww := M.ReadWord(); for I := WP_FIRST to WP_LAST do - begin - FWeapon[I] := ((ww and $01) <> 0); - ww := ww shr 1; - end; + FWeapon[I] := (M.ReadByte() <> 0); for I := A_BULLETS to A_HIGH do FAmmo[I] := M.ReadWord(); @@ -2151,33 +2099,23 @@ begin FMegaRulez[I] := M.ReadLongWord(); FRulez := []; - // unpack special flags - ww := M.ReadByte(); - if ((ww and $01) <> 0) then FRulez := FRulez+[R_ITEM_BACKPACK]; - if ((ww and $02) <> 0) then FRulez := FRulez+[R_KEY_RED]; - if ((ww and $04) <> 0) then FRulez := FRulez+[R_KEY_GREEN]; - if ((ww and $08) <> 0) then FRulez := FRulez+[R_KEY_BLUE]; - if ((ww and $10) <> 0) then FRulez := FRulez+[R_BERSERK]; + if (M.ReadByte() <> 0) then + FRulez := FRulez + [R_ITEM_BACKPACK]; + if (M.ReadByte() <> 0) then + FRulez := FRulez + [R_KEY_RED]; + if (M.ReadByte() <> 0) then + FRulez := FRulez + [R_KEY_GREEN]; + if (M.ReadByte() <> 0) then + FRulez := FRulez + [R_KEY_BLUE]; + if (M.ReadByte() <> 0) then + FRulez := FRulez + [R_BERSERK]; Frags := M.ReadLongInt(); Death := M.ReadLongInt(); - wctr := M.ReadLongWord(); - newweapon := M.ReadByte(); -{$IFDEF K8_XXX_WEAPON_DEBUG} - writeln('CLIENT PLRSTATS: got: currweap=', CurrWeap, '; curfrm=', gTime, '; netweap=', newweapon, '; lastnwfrm=', NetForceWeapFIdx); -{$ENDIF} - // `>=`, so server is still the authority - if (wctr >= NetWeapCtr) then - begin - SetWeaponHost(newweapon); - NetWeapCtr := wctr; - end; - - // other flags - ww := M.ReadByte(); + SetWeapon(M.ReadByte()); - FSpectator := ((ww and $01) <> 0); + FSpectator := M.ReadByte() <> 0; if FSpectator then begin if Pl = gPlayer1 then @@ -2198,12 +2136,11 @@ begin if (gPlayer2 = nil) and (gLMSPID2 > 0) then gPlayer2 := g_Player_Get(gLMSPID2); end; - - FGhost := ((ww and $02) <> 0); - FPhysics := ((ww and $04) <> 0); - FNoRespawn := ((ww and $08) <> 0); + FGhost := M.ReadByte() <> 0; + FPhysics := M.ReadByte() <> 0; + FNoRespawn := M.ReadByte() <> 0; OldJet := FJetpack; - FJetpack := ((ww and $10) <> 0); + FJetpack := M.ReadByte() <> 0; FFireTime := M.ReadLongInt(); if OldJet and not FJetpack then JetpackOff @@ -2785,7 +2722,7 @@ var kByte: Word; Predict: Boolean; strafeDir: Byte; - //WeaponSelect: Word = 0; + WeaponSelect: Word = 0; I: Integer; begin if not gGameOn then Exit; @@ -2822,9 +2759,6 @@ 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; @@ -2852,27 +2786,11 @@ begin end; if isKeyPressed(KeyFire, KeyFire2) then kByte := kByte or NET_KEY_FIRE; if isKeyPressed(KeyOpen, KeyOpen2) then kByte := kByte or NET_KEY_OPEN; - // 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; + 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 - begin if isKeyPressed(KeyWeapon[I], KeyWeapon2[I]) then - begin - //writeln('keyweapon #', i, ' is pressed; released=', Integer(gPlayer1.isWeaponSwitchKeyReleased(i)), '; frm=', gPlayer1.NetForceWeapFIdx, '; gTime=', gTime); - gPlayer1.weaponSwitchKeysStateChange(i, true); - if gPlayer1.isWeaponSwitchKeyReleased(i) then - begin - //writeln('keyweapon #', i, ' is pressed; released=', Integer(gPlayer1.isWeaponSwitchKeyReleased(i)), '; frm=', gPlayer1.NetForceWeapFIdx, '; gTime=', gTime); - 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 - gPlayer1.weaponSwitchKeysStateChange(i, false); - end; - end; + WeaponSelect := WeaponSelect or Word(1 shl I); end; // fix movebutton state P1MoveButton := P1MoveButton or (strafeDir shl 4); @@ -2880,19 +2798,11 @@ begin else kByte := NET_KEY_CHAT; - gPlayer1.weaponSwitchKeysShiftNewStates(); - NetOut.Write(Byte(NET_MSG_PLRPOS)); NetOut.Write(gTime); NetOut.Write(kByte); NetOut.Write(Byte(gPlayer1.Direction)); - NetOut.Write(LongWord(gPlayer1.NetWeapCtr)); - NetOut.Write(Byte(gPlayer1.CurrWeap)); -{$IFDEF K8_XXX_WEAPON_DEBUG} - if (kByte and NET_KEY_FIRE) <> 0 then writeln('FIRE: CurrWeap=', gPlayer1.CurrWeap); -{$ENDIF} - //e_WriteLog(Format('S:nwp=%d; nwfidx=%d', [Integer(gPlayer1.NetForceWeap), Integer(gPlayer1.NetForceWeapFIdx)]), TMsgType.Warning); - //NetOut.Write(WeaponSelect); + NetOut.Write(WeaponSelect); //e_WriteLog(Format('S:ws=%d', [WeaponSelect]), MSG_WARNING); g_Net_Client_Send(True, NET_CHAN_PLAYERPOS);