X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_netmsg.pas;h=b170097d80296ec8ad3b7c7ed96e0bea1b54ccb4;hb=8b7ced631d49879ce68703ac84389e3b4780c3db;hp=b98681b1c42dd705a623edf16a4cb2d1f280b76c;hpb=5929d2a7e4ac7aef4d49bdef3bef3ef506e4b9b0;p=d2df-sdl.git diff --git a/src/game/g_netmsg.pas b/src/game/g_netmsg.pas index b98681b..b170097 100644 --- a/src/game/g_netmsg.pas +++ b/src/game/g_netmsg.pas @@ -1023,6 +1023,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 +1042,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 +1056,29 @@ 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(Byte(FSpectator)); - NetOut.Write(Byte(FGhost)); - NetOut.Write(Byte(FPhysics)); - NetOut.Write(Byte(FNoRespawn)); - NetOut.Write(Byte(FJetpack)); + // 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(FFireTime); end; @@ -2068,6 +2078,7 @@ var I: Integer; OldJet: Boolean; NewTeam: Byte; + ww: Word; begin PID := M.ReadWord(); Pl := g_Player_Get(PID); @@ -2086,8 +2097,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 +2114,23 @@ 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()); - FSpectator := M.ReadByte() <> 0; + // other flags + ww := M.ReadByte(); + + FSpectator := ((ww and $01) <> 0); if FSpectator then begin if Pl = gPlayer1 then @@ -2136,11 +2151,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 @@ -2456,16 +2472,19 @@ begin if gTriggers[I].ClientID = SID then with gTriggers[I] do begin - if SPlaying then + if Sound <> nil then begin - if tgcLocal then - Sound.PlayVolumeAt(X+(Width div 2), Y+(Height div 2), tgcVolume/255.0) + if SPlaying then + begin + if tgcLocal then + Sound.PlayVolumeAt(X+(Width div 2), Y+(Height div 2), tgcVolume/255.0) + else + Sound.PlayPanVolume((tgcPan-127.0)/128.0, tgcVolume/255.0); + Sound.SetPosition(SPos); + end else - Sound.PlayPanVolume((tgcPan-127.0)/128.0, tgcVolume/255.0); - Sound.SetPosition(SPos); - end - else - if Sound.IsPlaying then Sound.Stop; + if Sound.IsPlaying then Sound.Stop; + end; SoundPlayCount := SCount; end; @@ -2756,6 +2775,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; @@ -2783,11 +2805,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); @@ -2795,6 +2826,8 @@ begin else kByte := NET_KEY_CHAT; + gPlayer1.weaponSwitchKeysShiftNewStates(); + NetOut.Write(Byte(NET_MSG_PLRPOS)); NetOut.Write(gTime); NetOut.Write(kByte); @@ -3011,10 +3044,10 @@ var mapDataMsg: TMapDataMsg; begin e_WriteLog('NET: Received map request from ' + - DecodeIPV4(C.Peer.address.host), TMsgType.Notify); + DecodeIPV4(C^.Peer.address.host), TMsgType.Notify); mapDataMsg := CreateMapDataMsg(MapsDir + gGameSettings.WAD, gExternalResources); - peer := NetClients[C.ID].Peer; + peer := NetClients[C^.ID].Peer; MapDataMsgToBytes(payload, mapDataMsg); g_Net_SendData(payload, peer, True, NET_CHAN_DOWNLOAD); @@ -3033,7 +3066,7 @@ var begin FileName := ExtractFileName(M.ReadString()); e_WriteLog('NET: Received res request: ' + FileName + - ' from ' + DecodeIPV4(C.Peer.address.host), TMsgType.Notify); + ' from ' + DecodeIPV4(C^.Peer.address.host), TMsgType.Notify); if not IsValidFilePath(FileName) then begin @@ -3041,7 +3074,7 @@ begin exit; end; - peer := NetClients[C.ID].Peer; + peer := NetClients[C^.ID].Peer; if gExternalResources.IndexOf(FileName) > -1 then begin