X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_netmsg.pas;h=6d004e814fcb61fcb5aea62b26126a5cc3138778;hb=847038a14751d192fcc4af172d7a963e28144c72;hp=92c45168c620f9c1f450c3e5ffc650f1b20ad359;hpb=6820eae460a9c99136ab5e679ffe2f6236c3540f;p=d2df-sdl.git diff --git a/src/game/g_netmsg.pas b/src/game/g_netmsg.pas index 92c4516..6d004e8 100644 --- a/src/game/g_netmsg.pas +++ b/src/game/g_netmsg.pas @@ -282,17 +282,15 @@ uses g_language, g_monsters, g_netmaster, utils, wadreader, MAPDEF; const - NET_KEY_LEFT = 1; - NET_KEY_RIGHT = 2; - NET_KEY_UP = 4; - NET_KEY_DOWN = 8; - NET_KEY_JUMP = 16; - NET_KEY_FIRE = 32; - NET_KEY_OPEN = 64; - NET_KEY_NW = 256; - NET_KEY_PW = 512; - NET_KEY_CHAT = 2048; - NET_KEY_FORCEDIR = 4096; + NET_KEY_LEFT = 1 shl 0; + NET_KEY_RIGHT = 1 shl 1; + NET_KEY_UP = 1 shl 2; + NET_KEY_DOWN = 1 shl 3; + NET_KEY_JUMP = 1 shl 4; + NET_KEY_FIRE = 1 shl 5; + NET_KEY_OPEN = 1 shl 6; + NET_KEY_CHAT = 1 shl 7; + NET_KEY_FORCEDIR = 1 shl 8; //var //kBytePrev: Word = 0; @@ -495,7 +493,7 @@ begin else begin plr.Respawn(False); - if gLMSRespawn = LMS_RESPAWN_WARMUP then + if gLMSRespawn > LMS_RESPAWN_NONE then MH_SEND_GameEvent(NET_EV_LMS_WARMUP, gLMSRespawnTime - gTime, 'N', C.ID); end; end; @@ -519,6 +517,7 @@ end; function MH_RECV_PlayerPos(C: pTNetClient; var M: TMsg): Word; var Dir, i: Byte; + WeaponAct: Byte; WeaponSelect: Word; PID: Word; kByte: Word; @@ -541,6 +540,7 @@ begin NetTime := GT; kByte := M.ReadWord(); Dir := M.ReadByte(); + WeaponAct := M.ReadByte(); WeaponSelect := M.ReadWord(); //e_WriteLog(Format('R:ws=%d', [WeaponSelect]), MSG_WARNING); if Direction <> TDirection(Dir) then @@ -562,8 +562,15 @@ 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); + + for i := 0 to 7 do + begin + if (WeaponAct and Byte(1 shl i)) <> 0 then + begin + //e_WriteLog(Format(' R:wn=%d', [i]), MSG_WARNING); + ProcessWeaponAction(i); + end; + end; for i := 0 to 15 do begin @@ -595,7 +602,7 @@ begin begin if Pl.FSpectator then begin - if (gGameSettings.MaxLives = 0) or (gLMSRespawn = LMS_RESPAWN_WARMUP) then + if (gGameSettings.MaxLives = 0) or (gLMSRespawn > LMS_RESPAWN_NONE) then Pl.Respawn(False) else MH_SEND_GameEvent(NET_EV_LMS_NOSPAWN, Pl.UID); @@ -1110,9 +1117,10 @@ begin if IsKeyPressed(KEY_UP) then kByte := kByte or NET_KEY_UP; if IsKeyPressed(KEY_DOWN) then kByte := kByte or NET_KEY_DOWN; if IsKeyPressed(KEY_JUMP) then kByte := kByte or NET_KEY_JUMP; - if JustTeleported then kByte := kByte or NET_KEY_FORCEDIR; end; + if JustTeleported then kByte := kByte or NET_KEY_FORCEDIR; + NetOut.Write(kByte); if Direction = TDirection.D_LEFT then NetOut.Write(Byte(0)) else NetOut.Write(Byte(1)); NetOut.Write(GameX); @@ -1515,22 +1523,25 @@ begin if Mode <> NET_CHAT_SYSTEM then begin - if Mode = NET_CHAT_PLAYER then + if NetDeafLevel = 0 then begin - g_Console_Add(Txt, True); - e_WriteLog('[Chat] ' + b_Text_Unformat(Txt), TMsgType.Notify); - g_Game_ChatSound(b_Text_Unformat(Txt)); - end else - if (Mode = NET_CHAT_TEAM) and (gPlayer1 <> nil) then - begin - if gPlayer1.Team = TEAM_RED then - g_Console_Add(b_Text_Format('\r[Team] ') + Txt, True); - if gPlayer1.Team = TEAM_BLUE then - g_Console_Add(b_Text_Format('\b[Team] ') + Txt, True); - e_WriteLog('[Team Chat] ' + b_Text_Unformat(Txt), TMsgType.Notify); - g_Game_ChatSound(b_Text_Unformat(Txt)); + if Mode = NET_CHAT_PLAYER then + begin + g_Console_Add(Txt, True); + e_WriteLog('[Chat] ' + b_Text_Unformat(Txt), TMsgType.Notify); + g_Game_ChatSound(b_Text_Unformat(Txt)); + end else + if (Mode = NET_CHAT_TEAM) and (gPlayer1 <> nil) then + begin + if gPlayer1.Team = TEAM_RED then + g_Console_Add(b_Text_Format('\r[Team] ') + Txt, True); + if gPlayer1.Team = TEAM_BLUE then + g_Console_Add(b_Text_Format('\b[Team] ') + Txt, True); + e_WriteLog('[Team Chat] ' + b_Text_Unformat(Txt), TMsgType.Notify); + g_Game_ChatSound(b_Text_Unformat(Txt)); + end; end; - end else + end else if (NetDeafLevel < 2) then g_Console_Add(Txt, True); end; @@ -1768,8 +1779,6 @@ begin gTime := EvTime; - e_LogWritefln('EVENT %d %d', [EvType, EvNum]); - if (g_Res_received_map_start <> 0) then begin if (g_Res_received_map_start < 0) then exit; @@ -1843,10 +1852,13 @@ begin NET_EV_CHANGE_TEAM: begin - if EvNum = TEAM_RED then - g_Console_Add(Format(_lc[I_PLAYER_CHTEAM_RED], [EvStr]), True); - if EvNum = TEAM_BLUE then - g_Console_Add(Format(_lc[I_PLAYER_CHTEAM_BLUE], [EvStr]), True); + if NetDeafLevel < 2 then + begin + if EvNum = TEAM_RED then + g_Console_Add(Format(_lc[I_PLAYER_CHTEAM_RED], [EvStr]), True); + if EvNum = TEAM_BLUE then + g_Console_Add(Format(_lc[I_PLAYER_CHTEAM_BLUE], [EvStr]), True); + end; end; NET_EV_PLAYER_KICK: @@ -1879,7 +1891,7 @@ begin g_Console_Add('*** ' + _lc[I_MESSAGE_LMS_SURVIVOR] + ' ***', True); NET_EV_BIGTEXT: - g_Game_Message(AnsiUpperCase(EvStr), Word(EvNum)); + if NetDeafLevel < 2 then g_Game_Message(AnsiUpperCase(EvStr), Word(EvNum)); NET_EV_SCORE: begin @@ -2223,7 +2235,8 @@ begin end; end; - g_Console_Add(Format(_lc[I_PLAYER_JOIN], [PName]), True); + if NetDeafLevel < 3 then + g_Console_Add(Format(_lc[I_PLAYER_JOIN], [PName]), True); e_WriteLog('NET: Player ' + PName + ' [' + IntToStr(PID) + '] added.', TMsgType.Notify); Result := PID; end; @@ -2266,7 +2279,7 @@ begin ReleaseKeys; - if (kByte = NET_KEY_CHAT) then + if LongBool(kByte and NET_KEY_CHAT) then PressKey(KEY_CHAT, 10000) else begin @@ -2277,7 +2290,9 @@ begin if LongBool(kByte and NET_KEY_JUMP) then PressKey(KEY_JUMP, 10000); end; - if ((Pl <> gPlayer1) and (Pl <> gPlayer2)) or LongBool(kByte and NET_KEY_FORCEDIR) then + JustTeleported := LongBool(kByte and NET_KEY_FORCEDIR); + + if ((Pl <> gPlayer1) and (Pl <> gPlayer2)) or JustTeleported then SetDirection(TDirection(Dir)); GameVelX := M.ReadLongInt(); @@ -2346,12 +2361,12 @@ begin FSpectator := M.ReadByte() <> 0; if FSpectator then begin - if Pl = gPlayer1 then + if UID = NetPlrUID1 then begin gSpectLatchPID1 := UID; gPlayer1 := nil; end; - if Pl = gPlayer2 then + if UID = NetPlrUID2 then begin gSpectLatchPID2 := UID; gPlayer2 := nil; @@ -2454,7 +2469,8 @@ begin Result := 0; if Pl = nil then Exit; - g_Console_Add(Format(_lc[I_PLAYER_LEAVE], [Pl.Name]), True); + if NetDeafLevel < 3 then + g_Console_Add(Format(_lc[I_PLAYER_LEAVE], [Pl.Name]), True); e_WriteLog('NET: Player ' + Pl.Name + ' [' + IntToStr(PID) + '] removed.', TMsgType.Notify); g_Player_Remove(PID); @@ -2519,7 +2535,8 @@ begin if Pl.Name <> TmpName then begin - g_Console_Add(Format(_lc[I_PLAYER_NAME], [Pl.Name, TmpName]), True); + if NetDeafLevel < 3 then + g_Console_Add(Format(_lc[I_PLAYER_NAME], [Pl.Name, TmpName]), True); Pl.Name := TmpName; end; @@ -2913,18 +2930,19 @@ begin Str1 := M.ReadString(); Str2 := M.ReadString(); - case EvID of - NET_VE_STARTED: - g_Console_Add(Format(_lc[I_MESSAGE_VOTE_STARTED], [Str1, Str2, Int1]), True); - NET_VE_PASSED: - g_Console_Add(Format(_lc[I_MESSAGE_VOTE_PASSED], [Str1]), True); - NET_VE_FAILED: - g_Console_Add(_lc[I_MESSAGE_VOTE_FAILED], True); - NET_VE_VOTE: - g_Console_Add(Format(_lc[I_MESSAGE_VOTE_VOTE], [Str1, Int1, Int2]), True); - NET_VE_INPROGRESS: - g_Console_Add(Format(_lc[I_MESSAGE_VOTE_INPROGRESS], [Str1]), True); - end; + if NetDeafLevel < 2 then + case EvID of + NET_VE_STARTED: + g_Console_Add(Format(_lc[I_MESSAGE_VOTE_STARTED], [Str1, Str2, Int1]), True); + NET_VE_PASSED: + g_Console_Add(Format(_lc[I_MESSAGE_VOTE_PASSED], [Str1]), True); + NET_VE_FAILED: + g_Console_Add(_lc[I_MESSAGE_VOTE_FAILED], True); + NET_VE_VOTE: + g_Console_Add(Format(_lc[I_MESSAGE_VOTE_VOTE], [Str1, Int1, Int2]), True); + NET_VE_INPROGRESS: + g_Console_Add(Format(_lc[I_MESSAGE_VOTE_INPROGRESS], [Str1]), True); + end; end; // CLIENT SEND @@ -2960,6 +2978,7 @@ var kByte: Word; Predict: Boolean; strafeDir: Byte; + WeaponAct: Byte = 0; WeaponSelect: Word = 0; i: Integer; begin @@ -3033,11 +3052,15 @@ begin end; if gPlayerAction[0, ACTION_ATTACK] then kByte := kByte or NET_KEY_FIRE; if gPlayerAction[0, ACTION_ACTIVATE] then kByte := kByte or NET_KEY_OPEN; - if gPlayerAction[0, ACTION_WEAPNEXT] then kByte := kByte or NET_KEY_NW; - if gPlayerAction[0, ACTION_WEAPPREV] then kByte := kByte or NET_KEY_PW; - gPlayerAction[0, ACTION_WEAPNEXT] := False; // HACK, remove after readyweaon&pendinweapon implementation - gPlayerAction[0, ACTION_WEAPPREV] := False; // HACK, remove after readyweaon&pendinweapon implementation + for i := WP_FACT to WP_LACT do + begin + if gWeaponAction[0, i] then + begin + WeaponAct := WeaponAct or Byte(1 shl i); + gWeaponAction[0, i] := False + end + end; for i := WP_FIRST to WP_LAST do begin @@ -3058,6 +3081,7 @@ begin NetOut.Write(gTime); NetOut.Write(kByte); NetOut.Write(Byte(gPlayer1.Direction)); + NetOut.Write(WeaponAct); NetOut.Write(WeaponSelect); //e_WriteLog(Format('S:ws=%d', [WeaponSelect]), MSG_WARNING); g_Net_Client_Send(True, NET_CHAN_PLAYERPOS);