From 4bf6da74deaa56a43fa6b0ad15c1bf4054ac6fd4 Mon Sep 17 00:00:00 2001 From: fgsfds Date: Mon, 24 Feb 2020 20:04:37 +0300 Subject: [PATCH] clean up GameCVars; add sv_forwardports --- src/game/g_console.pas | 25 ++-- src/game/g_game.pas | 281 +++++++++++++++-------------------------- src/game/g_net.pas | 82 +++++++++++- 3 files changed, 190 insertions(+), 198 deletions(-) diff --git a/src/game/g_console.pas b/src/game/g_console.pas index cde25fe..cbfcf5f 100644 --- a/src/game/g_console.pas +++ b/src/game/g_console.pas @@ -906,12 +906,13 @@ begin AddCommand('d_joy', DebugCommands); AddCommand('d_mem', DebugCommands); - AddCommand('p1_name', GameCVars); - AddCommand('p2_name', GameCVars); - AddCommand('p1_color', GameCVars); - AddCommand('p2_color', GameCVars); - AddCommand('p1_model', GameCVars); - AddCommand('p2_model', GameCVars); + AddCommand('p1_name', PlayerSettingsCVars); + AddCommand('p2_name', PlayerSettingsCVars); + AddCommand('p1_color', PlayerSettingsCVars); + AddCommand('p2_color', PlayerSettingsCVars); + AddCommand('p1_model', PlayerSettingsCVars); + AddCommand('p2_model', PlayerSettingsCVars); + AddCommand('r_showscore', GameCVars); AddCommand('r_showlives', GameCVars); AddCommand('r_showstat', GameCVars); @@ -931,15 +932,13 @@ begin AddCommand('g_maxlives', GameCVars); AddCommand('g_warmuptime', GameCVars); AddCommand('g_spawn_invul', GameCVars); - AddCommand('net_interp', GameCVars); - AddCommand('net_forceplayerupdate', GameCVars); - AddCommand('net_predictself', GameCVars); - AddCommand('sv_name', GameCVars); - AddCommand('sv_passwd', GameCVars); - AddCommand('sv_maxplrs', GameCVars); - AddCommand('sv_public', GameCVars); AddCommand('sv_intertime', GameCVars); + AddCommand('sv_name', NetServerCVars); + AddCommand('sv_passwd', NetServerCVars); + AddCommand('sv_maxplrs', NetServerCVars); + AddCommand('sv_public', NetServerCVars); + AddCommand('quit', GameCommands); AddCommand('exit', GameCommands); AddCommand('pause', GameCommands); diff --git a/src/game/g_game.pas b/src/game/g_game.pas index 6b1e238..61fed94 100644 --- a/src/game/g_game.pas +++ b/src/game/g_game.pas @@ -132,6 +132,7 @@ procedure g_SimpleError(Text: String); function g_Game_IsTestMap(): Boolean; procedure g_Game_DeleteTestMap(); procedure GameCVars(P: SSArray); +procedure PlayerSettingsCVars(P: SSArray); procedure GameCommands(P: SSArray); procedure GameCheats(P: SSArray); procedure DebugCommands(P: SSArray); @@ -5381,7 +5382,7 @@ procedure GameCVars(P: SSArray); var a, b: Integer; stat: TPlayerStatArray; - cmd, s: string; + cmd: string; begin stat := nil; cmd := LowerCase(P[0]); @@ -5583,95 +5584,6 @@ begin [gGameSettings.SpawnInvul])); g_Console_Add(_lc[I_MSG_ONMAPCHANGE]); end - else if cmd = 'net_interp' then - begin - if (Length(P) > 1) then - NetInterpLevel := StrToIntDef(P[1], NetInterpLevel); - g_Console_Add('net_interp = ' + IntToStr(NetInterpLevel)); - end - else if cmd = 'net_forceplayerupdate' then - begin - if (Length(P) > 1) and ((P[1] = '1') or (P[1] = '0')) then - NetForcePlayerUpdate := (P[1][1] = '1'); - - if NetForcePlayerUpdate then - g_Console_Add('net_forceplayerupdate = 1') - else - g_Console_Add('net_forceplayerupdate = 0'); - end - else if cmd = 'net_predictself' then - begin - if (Length(P) > 1) and - ((P[1] = '1') or (P[1] = '0')) then - NetPredictSelf := (P[1][1] = '1'); - - if NetPredictSelf then - g_Console_Add('net_predictself = 1') - else - g_Console_Add('net_predictself = 0'); - end - else if cmd = 'sv_name' then - begin - if (Length(P) > 1) and (Length(P[1]) > 0) then - begin - NetServerName := P[1]; - if Length(NetServerName) > 64 then - SetLength(NetServerName, 64); - g_Net_Slist_ServerRenamed(); - end; - - g_Console_Add(cmd + ' = "' + NetServerName + '"'); - end - else if cmd = 'sv_passwd' then - begin - if (Length(P) > 1) and (Length(P[1]) > 0) then - begin - NetPassword := P[1]; - if Length(NetPassword) > 24 then - SetLength(NetPassword, 24); - g_Net_Slist_ServerRenamed(); - end; - - g_Console_Add(cmd + ' = "' + AnsiLowerCase(NetPassword) + '"'); - end - else if cmd = 'sv_maxplrs' then - begin - if (Length(P) > 1) then - begin - NetMaxClients := Min(Max(StrToIntDef(P[1], NetMaxClients), 1), NET_MAXCLIENTS); - if g_Game_IsServer and g_Game_IsNet then - begin - b := 0; - for a := 0 to High(NetClients) do - begin - if NetClients[a].Used then - begin - Inc(b); - if b > NetMaxClients then - begin - s := g_Player_Get(NetClients[a].Player).Name; - enet_peer_disconnect(NetClients[a].Peer, NET_DISC_FULL); - g_Console_Add(Format(_lc[I_PLAYER_KICK], [s])); - MH_SEND_GameEvent(NET_EV_PLAYER_KICK, 0, s); - end; - end; - end; - g_Net_Slist_ServerRenamed(); - end; - end; - - g_Console_Add(cmd + ' = ' + IntToStr(NetMaxClients)); - end - else if cmd = 'sv_public' then - begin - if (Length(P) > 1) then - begin - NetUseMaster := StrToIntDef(P[1], Byte(NetUseMaster)) > 0; - if NetUseMaster then g_Net_Slist_Public() else g_Net_Slist_Private(); - end; - - g_Console_Add(cmd + ' = ' + IntToStr(Byte(NetUseMaster))); - end else if cmd = 'sv_intertime' then begin if (Length(P) > 1) then @@ -5679,96 +5591,6 @@ begin g_Console_Add(cmd + ' = ' + IntToStr(gDefInterTime)); end - else if cmd = 'p1_name' then - begin - if (Length(P) > 1) then - begin - gPlayer1Settings.Name := b_Text_Unformat(P[1]); - if g_Game_IsClient then - MC_SEND_PlayerSettings - else if gGameOn and (gPlayer1 <> nil) then - begin - gPlayer1.Name := b_Text_Unformat(P[1]); - if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer1.UID); - end; - end; - end - else if cmd = 'p2_name' then - begin - if (Length(P) > 1) then - begin - gPlayer2Settings.Name := b_Text_Unformat(P[1]); - if g_Game_IsClient then - MC_SEND_PlayerSettings - else if gGameOn and (gPlayer2 <> nil) then - begin - gPlayer2.Name := b_Text_Unformat(P[1]); - if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer2.UID); - end; - end; - end - else if cmd = 'p1_color' then - begin - if Length(P) > 3 then - begin - gPlayer1Settings.Color := _RGB(EnsureRange(StrToIntDef(P[1], 0), 0, 255), - EnsureRange(StrToIntDef(P[2], 0), 0, 255), - EnsureRange(StrToIntDef(P[3], 0), 0, 255)); - if g_Game_IsClient then - MC_SEND_PlayerSettings - else if gGameOn and (gPlayer1 <> nil) then - begin - gPlayer1.SetColor(gPlayer1Settings.Color); - if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer1.UID); - end; - end; - end - else if cmd = 'p2_color' then - begin - if Length(P) > 3 then - begin - gPlayer2Settings.Color := _RGB(EnsureRange(StrToIntDef(P[1], 0), 0, 255), - EnsureRange(StrToIntDef(P[2], 0), 0, 255), - EnsureRange(StrToIntDef(P[3], 0), 0, 255)); - if g_Game_IsClient then - MC_SEND_PlayerSettings - else if gGameOn and (gPlayer2 <> nil) then - begin - gPlayer2.SetColor(gPlayer2Settings.Color); - if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer2.UID); - end; - end; - end - else if cmd = 'p1_model' then - begin - if (Length(P) > 1) then - begin - gPlayer1Settings.Model := P[1]; - if g_Game_IsClient then - MC_SEND_PlayerSettings - else if gGameOn and (gPlayer1 <> nil) then - begin - gPlayer1.FActualModelName := gPlayer1Settings.Model; - gPlayer1.SetModel(gPlayer1Settings.Model); - if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer1.UID); - end; - end; - end - else if cmd = 'p2_model' then - begin - if (Length(P) > 1) then - begin - gPlayer2Settings.Model := P[1]; - if g_Game_IsClient then - MC_SEND_PlayerSettings - else if gGameOn and (gPlayer2 <> nil) then - begin - gPlayer2.FActualModelName := gPlayer2Settings.Model; - gPlayer2.SetModel(gPlayer2Settings.Model); - if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer2.UID); - end; - end; - end else if cmd = 'r_showscore' then begin if (Length(P) > 1) and @@ -5900,6 +5722,105 @@ begin end; end; +procedure PlayerSettingsCVars(P: SSArray); +var + cmd: string; +begin + cmd := LowerCase(P[0]); + case cmd of + 'p1_name': + begin + if (Length(P) > 1) then + begin + gPlayer1Settings.Name := b_Text_Unformat(P[1]); + if g_Game_IsClient then + MC_SEND_PlayerSettings + else if gGameOn and (gPlayer1 <> nil) then + begin + gPlayer1.Name := b_Text_Unformat(P[1]); + if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer1.UID); + end; + end; + end; + 'p2_name': + begin + if (Length(P) > 1) then + begin + gPlayer2Settings.Name := b_Text_Unformat(P[1]); + if g_Game_IsClient then + MC_SEND_PlayerSettings + else if gGameOn and (gPlayer2 <> nil) then + begin + gPlayer2.Name := b_Text_Unformat(P[1]); + if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer2.UID); + end; + end; + end; + 'p1_color': + begin + if Length(P) > 3 then + begin + gPlayer1Settings.Color := _RGB(EnsureRange(StrToIntDef(P[1], 0), 0, 255), + EnsureRange(StrToIntDef(P[2], 0), 0, 255), + EnsureRange(StrToIntDef(P[3], 0), 0, 255)); + if g_Game_IsClient then + MC_SEND_PlayerSettings + else if gGameOn and (gPlayer1 <> nil) then + begin + gPlayer1.SetColor(gPlayer1Settings.Color); + if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer1.UID); + end; + end; + end; + 'p2_color': + begin + if Length(P) > 3 then + begin + gPlayer2Settings.Color := _RGB(EnsureRange(StrToIntDef(P[1], 0), 0, 255), + EnsureRange(StrToIntDef(P[2], 0), 0, 255), + EnsureRange(StrToIntDef(P[3], 0), 0, 255)); + if g_Game_IsClient then + MC_SEND_PlayerSettings + else if gGameOn and (gPlayer2 <> nil) then + begin + gPlayer2.SetColor(gPlayer2Settings.Color); + if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer2.UID); + end; + end; + end; + 'p1_model': + begin + if (Length(P) > 1) then + begin + gPlayer1Settings.Model := P[1]; + if g_Game_IsClient then + MC_SEND_PlayerSettings + else if gGameOn and (gPlayer1 <> nil) then + begin + gPlayer1.FActualModelName := gPlayer1Settings.Model; + gPlayer1.SetModel(gPlayer1Settings.Model); + if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer1.UID); + end; + end; + end; + 'p2_model': + begin + if (Length(P) > 1) then + begin + gPlayer2Settings.Model := P[1]; + if g_Game_IsClient then + MC_SEND_PlayerSettings + else if gGameOn and (gPlayer2 <> nil) then + begin + gPlayer2.FActualModelName := gPlayer2Settings.Model; + gPlayer2.SetModel(gPlayer2Settings.Model); + if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer2.UID); + end; + end; + end; + end; +end; + procedure PrintHeapStats(); var hs: TFPCHeapStatus; diff --git a/src/game/g_net.pas b/src/game/g_net.pas index 217825e..95b2319 100644 --- a/src/game/g_net.pas +++ b/src/game/g_net.pas @@ -18,7 +18,7 @@ unit g_net; interface uses - e_log, e_msg, ENet, Classes, md5, MAPDEF{$IFDEF USE_MINIUPNPC}, miniupnpc;{$ELSE};{$ENDIF} + e_log, e_msg, utils, ENet, Classes, md5, MAPDEF{$IFDEF USE_MINIUPNPC}, miniupnpc;{$ELSE};{$ENDIF} const NET_PROTOCOL_VER = 184; @@ -248,6 +248,8 @@ function g_Net_IsNetworkAvailable (): Boolean; procedure g_Net_InitLowLevel (); procedure g_Net_DeinitLowLevel (); +procedure NetServerCVars(P: SSArray); + implementation @@ -260,8 +262,7 @@ uses SysUtils, e_input, e_res, g_nethandler, g_netmsg, g_netmaster, g_player, g_window, g_console, - g_main, g_game, g_language, g_weapons, utils, ctypes, g_system, - g_map; + g_main, g_game, g_language, g_weapons, ctypes, g_system, g_map; const FILE_CHUNK_SIZE = 8192; @@ -2297,12 +2298,12 @@ begin if I <> 0 then begin - conwritefln('forwarding port %d failed: error %d', [NetPort + 1, I]); + conwritefln('forwarding port %d failed: error %d', [NET_PING_PORT, I]); NetPongForwarded := False; end else begin - conwritefln('forwarded port %d successfully', [NetPort + 1]); + conwritefln('forwarded port %d successfully', [NET_PING_PORT]); NetPongForwarded := True; end; end; @@ -2357,9 +2358,80 @@ begin end; {$ENDIF} +procedure NetServerCVars(P: SSArray); +var + cmd, s: string; + a, b: Integer; +begin + cmd := LowerCase(P[0]); + case cmd of + 'sv_name': + begin + if (Length(P) > 1) and (Length(P[1]) > 0) then + begin + NetServerName := P[1]; + if Length(NetServerName) > 64 then + SetLength(NetServerName, 64); + g_Net_Slist_ServerRenamed(); + end; + g_Console_Add(cmd + ' = "' + NetServerName + '"'); + end; + 'sv_passwd': + begin + if (Length(P) > 1) and (Length(P[1]) > 0) then + begin + NetPassword := P[1]; + if Length(NetPassword) > 24 then + SetLength(NetPassword, 24); + g_Net_Slist_ServerRenamed(); + end; + g_Console_Add(cmd + ' = "' + AnsiLowerCase(NetPassword) + '"'); + end; + 'sv_maxplrs': + begin + if (Length(P) > 1) then + begin + NetMaxClients := nclamp(StrToIntDef(P[1], NetMaxClients), 1, NET_MAXCLIENTS); + if g_Game_IsServer and g_Game_IsNet then + begin + b := 0; + for a := 0 to High(NetClients) do + begin + if NetClients[a].Used then + begin + Inc(b); + if b > NetMaxClients then + begin + s := g_Player_Get(NetClients[a].Player).Name; + enet_peer_disconnect(NetClients[a].Peer, NET_DISC_FULL); + g_Console_Add(Format(_lc[I_PLAYER_KICK], [s])); + MH_SEND_GameEvent(NET_EV_PLAYER_KICK, 0, s); + end; + end; + end; + g_Net_Slist_ServerRenamed(); + end; + end; + g_Console_Add(cmd + ' = ' + IntToStr(NetMaxClients)); + end; + 'sv_public': + begin + if (Length(P) > 1) then + begin + NetUseMaster := StrToIntDef(P[1], Byte(NetUseMaster)) > 0; + if NetUseMaster then g_Net_Slist_Public() else g_Net_Slist_Private(); + end; + g_Console_Add(cmd + ' = ' + IntToStr(Byte(NetUseMaster))); + end; + end; +end; initialization conRegVar('cl_downloadtimeout', @g_Net_DownloadTimeout, 0.0, 1000000.0, '', 'timeout in seconds, 0 to disable it'); + conRegVar('cl_predictself', @NetPredictSelf, '', 'predict local player'); + conRegVar('cl_forceplayerupdate', @NetForcePlayerUpdate, '', 'update net players on NET_MSG_PLRPOS'); + conRegVar('cl_interp', @NetInterpLevel, '', 'net player interpolation steps'); + conRegVar('sv_forwardports', @NetForwardPorts, '', 'forward server port using miniupnpc (requires server restart)'); SetLength(NetClients, 0); g_Net_DownloadTimeout := 60; NetIn.Alloc(NET_BUFSIZE); -- 2.29.2