X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_netmsg.pas;h=9563b8083f9fd7d1f7955a35fb0a36a96200cf35;hb=2ce8c39f1c6e2ade354a14bd7fce6be00c8c7b0a;hp=01dcc3ce0182044baf67cbcef01a4b57c49e7802;hpb=ec8ff55f97b6159f646c6e120a64a323d9fe8189;p=d2df-sdl.git diff --git a/src/game/g_netmsg.pas b/src/game/g_netmsg.pas index 01dcc3c..9563b80 100644 --- a/src/game/g_netmsg.pas +++ b/src/game/g_netmsg.pas @@ -16,6 +16,8 @@ {$INCLUDE ../shared/a_modes.inc} unit g_netmsg; +{.$DEFINE K8_XXX_WEAPON_DEBUG} + interface uses e_msg, g_net, g_triggers, Classes, SysUtils, md5; @@ -430,12 +432,13 @@ 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: LongWord; + newweapon: Byte; begin Result := 0; if not gGameOn then Exit; @@ -453,13 +456,22 @@ begin NetTime := GT; kByte := M.ReadWord(); Dir := M.ReadByte(); - WeaponSelect := M.ReadWord(); + //WeaponSelect := M.ReadWord(); + newweapon := M.ReadByte(); + if (newweapon <> CurrWeap) then + begin +{$IFDEF K8_XXX_WEAPON_DEBUG} + writeln('HOST PLRPOS: got: currweap=', CurrWeap, '; curfrm=', gTime, '; netweap=', newweapon, '; oldweap=', CurrWeap); +{$ENDIF} + //NetForceWeap := newweapon; + SetWeapon(newweapon); + end; //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 +486,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 +498,7 @@ begin QueueWeaponSwitch(i); end; end; + *) end; // MH_SEND_PlayerPos(False, PID, C^.ID); @@ -1023,6 +1037,7 @@ 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; @@ -1041,8 +1056,10 @@ begin NetOut.Write(Lives); NetOut.Write(Team); - for I := WP_FIRST to WP_LAST do - NetOut.Write(Byte(FWeapon[I])); + // 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 := A_BULLETS to A_HIGH do NetOut.Write(FAmmo[I]); @@ -1053,22 +1070,30 @@ begin for I := MR_SUIT to MR_MAX do NetOut.Write(LongWord(FMegaRulez[I])); - 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)); + // 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(Frags); NetOut.Write(Death); - NetOut.Write(CurrWeap); + //NetOut.Write(CurrWeap); + 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(Byte(FSpectator)); - NetOut.Write(Byte(FGhost)); - NetOut.Write(Byte(FPhysics)); - NetOut.Write(Byte(FNoRespawn)); - NetOut.Write(Byte(FJetpack)); NetOut.Write(FFireTime); end; @@ -2018,6 +2043,8 @@ begin Exit; end; gTime := GT; + if g_Game_IsClient and (gPlayer1 <> nil) and (gPlayer1.NetForceWeapFIdx >= gTime+15) then gPlayer1.NetForceWeapFIdx := 0; + if g_Game_IsClient and (gPlayer2 <> nil) and (gPlayer2.NetForceWeapFIdx >= gTime+15) then gPlayer2.NetForceWeapFIdx := 0; PID := M.ReadWord(); Pl := g_Player_Get(PID); @@ -2036,7 +2063,7 @@ begin TmpX := M.ReadLongInt(); TmpY := M.ReadLongInt(); - ReleaseKeys; + ReleaseKeysNoWeapon; if (kByte = NET_KEY_CHAT) then PressKey(KEY_CHAT, 10000) @@ -2068,6 +2095,8 @@ var I: Integer; OldJet: Boolean; NewTeam: Byte; + ww: Word; + newweapon: Byte; begin PID := M.ReadWord(); Pl := g_Player_Get(PID); @@ -2086,8 +2115,12 @@ begin Lives := M.ReadByte(); NewTeam := M.ReadByte(); + ww := M.ReadWord(); for I := WP_FIRST to WP_LAST do - FWeapon[I] := (M.ReadByte() <> 0); + begin + FWeapon[I] := ((ww and $01) <> 0); + ww := ww shr 1; + end; for I := A_BULLETS to A_HIGH do FAmmo[I] := M.ReadWord(); @@ -2099,23 +2132,32 @@ begin FMegaRulez[I] := M.ReadLongWord(); FRulez := []; - 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]; + // 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]; Frags := M.ReadLongInt(); Death := M.ReadLongInt(); - SetWeapon(M.ReadByte()); + newweapon := M.ReadByte(); +{$IFDEF K8_XXX_WEAPON_DEBUG} + writeln('CLIENT PLRSTATS: got: currweap=', CurrWeap, '; curfrm=', gTime, '; netweap=', newweapon, '; lastnwfrm=', NetForceWeapFIdx); +{$ENDIF} + if (gTime >= NetForceWeapFIdx) then + begin + //NetForceWeap := newweapon; + SetWeapon(newweapon); + end; + //SetWeapon(M.ReadByte()); - FSpectator := M.ReadByte() <> 0; + // other flags + ww := M.ReadByte(); + + FSpectator := ((ww and $01) <> 0); if FSpectator then begin if Pl = gPlayer1 then @@ -2136,11 +2178,12 @@ begin if (gPlayer2 = nil) and (gLMSPID2 > 0) then gPlayer2 := g_Player_Get(gLMSPID2); end; - FGhost := M.ReadByte() <> 0; - FPhysics := M.ReadByte() <> 0; - FNoRespawn := M.ReadByte() <> 0; + + FGhost := ((ww and $02) <> 0); + FPhysics := ((ww and $04) <> 0); + FNoRespawn := ((ww and $08) <> 0); OldJet := FJetpack; - FJetpack := M.ReadByte() <> 0; + FJetpack := ((ww and $10) <> 0); FFireTime := M.ReadLongInt(); if OldJet and not FJetpack then JetpackOff @@ -2722,7 +2765,7 @@ var kByte: Word; Predict: Boolean; strafeDir: Byte; - WeaponSelect: Word = 0; + //WeaponSelect: Word = 0; I: Integer; begin if not gGameOn then Exit; @@ -2789,14 +2832,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 @@ -2816,10 +2864,18 @@ begin NetOut.Write(gTime); NetOut.Write(kByte); NetOut.Write(Byte(gPlayer1.Direction)); - NetOut.Write(WeaponSelect); + 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); //e_WriteLog(Format('S:ws=%d', [WeaponSelect]), MSG_WARNING); g_Net_Client_Send(True, NET_CHAN_PLAYERPOS); + // force player weapon + //{if (gPlayer1.NetForceWeapFIdx < gTime) then} gPlayer1.SetWeapon(gPlayer1.NetForceWeap); + //kBytePrev := kByte; //kDirPrev := gPlayer1.Direction; end;