diff options
| author | SushiTee <weichel.sascha@gmail.com> | 2010-06-03 15:21:12 +0200 |
|---|---|---|
| committer | SushiTee <weichel.sascha@gmail.com> | 2010-06-03 15:21:12 +0200 |
| commit | 0115161463266a77bbe98d41f271f8ec49da43aa (patch) | |
| tree | 91fe8eb865502398fa149c3974d807d954513ba0 /src | |
| parent | c37335b115f69f8ab54403742640faff384d2747 (diff) | |
| parent | 5988b9d38801f0987f38c99fb944e1a861d07ef3 (diff) | |
| download | zcatch-0115161463266a77bbe98d41f271f8ec49da43aa.tar.gz zcatch-0115161463266a77bbe98d41f271f8ec49da43aa.zip | |
mergend stuff
Diffstat (limited to 'src')
| -rw-r--r-- | src/engine/server/server.cpp | 23 | ||||
| -rw-r--r-- | src/engine/server/server.h | 1 | ||||
| -rw-r--r-- | src/engine/shared/config_variables.h | 1 | ||||
| -rw-r--r-- | src/engine/shared/network.h | 6 | ||||
| -rw-r--r-- | src/engine/shared/network_server.cpp | 37 | ||||
| -rw-r--r-- | src/game/client/components/hud.cpp | 12 | ||||
| -rw-r--r-- | src/game/client/components/menus.cpp | 2 | ||||
| -rw-r--r-- | src/game/editor/ed_editor.cpp | 8 | ||||
| -rw-r--r-- | src/tools/fake_server.cpp | 2 |
9 files changed, 77 insertions, 15 deletions
diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp index 7380235d..6dd5a959 100644 --- a/src/engine/server/server.cpp +++ b/src/engine/server/server.cpp @@ -1016,7 +1016,7 @@ int CServer::Run() } - if(!m_NetServer.Open(BindAddr, g_Config.m_SvMaxClients, 0)) + if(!m_NetServer.Open(BindAddr, g_Config.m_SvMaxClients, g_Config.m_SvMaxClientsPerIP, 0)) { dbg_msg("server", "couldn't open socket. port might already be in use"); return -1; @@ -1248,12 +1248,16 @@ void CServer::ConStatus(IConsole::IResult *pResult, void *pUser) for(i = 0; i < MAX_CLIENTS; i++) { - if(pServer->m_aClients[i].m_State == CClient::STATE_INGAME) + if(pServer->m_aClients[i].m_State != CClient::STATE_EMPTY) { Addr = pServer->m_NetServer.ClientAddr(i); - str_format(aBuf, sizeof(aBuf), "id=%d addr=%d.%d.%d.%d:%d name='%s' score=%d", - i, Addr.ip[0], Addr.ip[1], Addr.ip[2], Addr.ip[3], Addr.port, - pServer->m_aClients[i].m_aName, pServer->m_aClients[i].m_Score); + if(pServer->m_aClients[i].m_State == CClient::STATE_INGAME) + str_format(aBuf, sizeof(aBuf), "id=%d addr=%d.%d.%d.%d:%d name='%s' score=%d", + i, Addr.ip[0], Addr.ip[1], Addr.ip[2], Addr.ip[3], Addr.port, + pServer->m_aClients[i].m_aName, pServer->m_aClients[i].m_Score); + else + str_format(aBuf, sizeof(aBuf), "id=%d addr=%d.%d.%d.%d:%d connecting", + i, Addr.ip[0], Addr.ip[1], Addr.ip[2], Addr.ip[3], Addr.port); pServer->Console()->Print(aBuf); dbg_msg("server", "%s", aBuf); } @@ -1289,6 +1293,13 @@ void CServer::ConchainSpecialInfoupdate(IConsole::IResult *pResult, void *pUserD ((CServer *)pUserData)->UpdateServerInfo(); } +void CServer::ConchainMaxclientsperipUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) +{ + pfnCallback(pResult, pCallbackUserData); + if(pResult->NumArguments()) + ((CServer *)pUserData)->m_NetServer.SetMaxClientsPerIP(pResult->GetInteger(0)); +} + void CServer::RegisterCommands() { m_pConsole = Kernel()->RequestInterface<IConsole>(); @@ -1307,6 +1318,8 @@ void CServer::RegisterCommands() Console()->Chain("sv_name", ConchainSpecialInfoupdate, this); Console()->Chain("password", ConchainSpecialInfoupdate, this); + + Console()->Chain("sv_max_clients_per_ip", ConchainMaxclientsperipUpdate, this); } diff --git a/src/engine/server/server.h b/src/engine/server/server.h index 895a4bd1..70c8899c 100644 --- a/src/engine/server/server.h +++ b/src/engine/server/server.h @@ -185,6 +185,7 @@ public: static void ConStopRecord(IConsole::IResult *pResult, void *pUser); static void ConMapReload(IConsole::IResult *pResult, void *pUser); static void ConchainSpecialInfoupdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); + static void ConchainMaxclientsperipUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); void RegisterCommands(); diff --git a/src/engine/shared/config_variables.h b/src/engine/shared/config_variables.h index cc36b932..e11eab6d 100644 --- a/src/engine/shared/config_variables.h +++ b/src/engine/shared/config_variables.h @@ -64,6 +64,7 @@ MACRO_CONFIG_INT(SvPort, sv_port, 8303, 0, 0, CFGFLAG_SERVER, "Port to use for t MACRO_CONFIG_INT(SvExternalPort, sv_external_port, 0, 0, 0, CFGFLAG_SERVER, "External port to report to the master servers") MACRO_CONFIG_STR(SvMap, sv_map, 128, "dm1", CFGFLAG_SERVER, "Map to use on the server") MACRO_CONFIG_INT(SvMaxClients, sv_max_clients, 8, 1, MAX_CLIENTS, CFGFLAG_SERVER, "Maximum number of clients that are allowed on a server") +MACRO_CONFIG_INT(SvMaxClientsPerIP, sv_max_clients_per_ip, 8, 1, MAX_CLIENTS, CFGFLAG_SERVER, "Maximum number of clients with the same IP that can connect to the server") MACRO_CONFIG_INT(SvHighBandwidth, sv_high_bandwidth, 0, 0, 1, CFGFLAG_SERVER, "Use high bandwidth mode. Doubles the bandwidth required for the server. LAN use only") MACRO_CONFIG_INT(SvRegister, sv_register, 1, 0, 1, CFGFLAG_SERVER, "Register server with master server for public listing") MACRO_CONFIG_STR(SvRconPassword, sv_rcon_password, 32, "", CFGFLAG_SERVER, "Remote console password") diff --git a/src/engine/shared/network.h b/src/engine/shared/network.h index 11a1b70d..7de534a4 100644 --- a/src/engine/shared/network.h +++ b/src/engine/shared/network.h @@ -244,6 +244,7 @@ private: NETSOCKET m_Socket; CSlot m_aSlots[NET_MAX_CLIENTS]; int m_MaxClients; + int m_MaxClientsPerIP; CBan *m_aBans[256]; CBan m_BanPool[NET_SERVER_MAXBANS]; @@ -262,7 +263,7 @@ public: int SetCallbacks(NETFUNC_NEWCLIENT pfnNewClient, NETFUNC_DELCLIENT pfnDelClient, void *pUser); // - bool Open(NETADDR BindAddr, int MaxClients, int Flags); + bool Open(NETADDR BindAddr, int MaxClients, int MaxClientsPerIP, int Flags); int Close(); // @@ -283,6 +284,9 @@ public: NETADDR ClientAddr(int ClientID) const { return m_aSlots[ClientID].m_Connection.PeerAddress(); } NETSOCKET Socket() const { return m_Socket; } int MaxClients() const { return m_MaxClients; } + + // + void SetMaxClientsPerIP(int Max); }; diff --git a/src/engine/shared/network_server.cpp b/src/engine/shared/network_server.cpp index 32b08bf6..2d30a7d1 100644 --- a/src/engine/shared/network_server.cpp +++ b/src/engine/shared/network_server.cpp @@ -24,7 +24,7 @@ #define MACRO_LIST_FIND(Start, Next, Expression) \ { while(Start && !(Expression)) Start = Start->Next; } -bool CNetServer::Open(NETADDR BindAddr, int MaxClients, int Flags) +bool CNetServer::Open(NETADDR BindAddr, int MaxClients, int MaxClientsPerIP, int Flags) { // zero out the whole structure mem_zero(this, sizeof(*this)); @@ -40,6 +40,8 @@ bool CNetServer::Open(NETADDR BindAddr, int MaxClients, int Flags) m_MaxClients = NET_MAX_CLIENTS; if(m_MaxClients < 1) m_MaxClients = 1; + + m_MaxClientsPerIP = MaxClientsPerIP; for(int i = 0; i < NET_MAX_CLIENTS; i++) m_aSlots[i].m_Connection.Init(m_Socket); @@ -335,6 +337,29 @@ int CNetServer::Recv(CNetChunk *pChunk) // client that wants to connect if(!Found) { + // only allow a specific number of players with the same ip + NETADDR ThisAddr = Addr, OtherAddr; + int FoundAddr = 1; + ThisAddr.port = 0; + for(int i = 0; i < MaxClients(); ++i) + { + if(m_aSlots[i].m_Connection.State() == NET_CONNSTATE_OFFLINE) + continue; + + OtherAddr = m_aSlots[i].m_Connection.PeerAddress(); + OtherAddr.port = 0; + if(!net_addr_comp(&ThisAddr, &OtherAddr)) + { + if(FoundAddr++ >= m_MaxClientsPerIP) + { + char aBuf[128]; + str_format(aBuf, sizeof(aBuf), "only %i players with same ip allowed", m_MaxClientsPerIP); + CNetBase::SendControlMsg(m_Socket, &Addr, 0, NET_CTRLMSG_CLOSE, aBuf, sizeof(aBuf)); + return 0; + } + } + } + for(int i = 0; i < MaxClients(); i++) { if(m_aSlots[i].m_Connection.State() == NET_CONNSTATE_OFFLINE) @@ -411,3 +436,13 @@ int CNetServer::Send(CNetChunk *pChunk) return 0; } +void CNetServer::SetMaxClientsPerIP(int Max) +{ + // clamp + if(Max < 1) + Max = 1; + else if(Max > NET_MAX_CLIENTS) + Max = NET_MAX_CLIENTS; + + m_MaxClientsPerIP = Max; +} diff --git a/src/game/client/components/hud.cpp b/src/game/client/components/hud.cpp index fd44af41..a3ae5a4d 100644 --- a/src/game/client/components/hud.cpp +++ b/src/game/client/components/hud.cpp @@ -56,7 +56,7 @@ void CHud::RenderSuddenDeath() if(m_pClient->m_Snap.m_pGameobj->m_SuddenDeath) { float Half = 300.0f*Graphics()->ScreenAspect()/2.0f; - const char *pText = "Sudden Death"; + const char *pText = Localize("Sudden Death"); float FontSize = 12.0f; float w = TextRender()->TextWidth(0, FontSize, pText, -1); TextRender()->Text(0, Half-w/2, 2, FontSize, pText, -1); @@ -133,8 +133,8 @@ void CHud::RenderWarmupTimer() { char Buf[256]; float FontSize = 20.0f; - float w = TextRender()->TextWidth(0, FontSize, "Warmup", -1); - TextRender()->Text(0, 150*Graphics()->ScreenAspect()+-w/2, 50, FontSize, "Warmup", -1); + float w = TextRender()->TextWidth(0, FontSize, Localize("Warmup"), -1); + TextRender()->Text(0, 150*Graphics()->ScreenAspect()+-w/2, 50, FontSize, Localize("Warmup"), -1); int Seconds = m_pClient->m_Snap.m_pGameobj->m_Warmup/SERVER_TICK_SPEED; if(Seconds < 5) @@ -171,7 +171,7 @@ void CHud::RenderConnectionWarning() { if(Client()->ConnectionProblems()) { - const char *pText = "Connection Problems..."; + const char *pText = Localize("Connection Problems..."); float w = TextRender()->TextWidth(0, 24, pText, -1); TextRender()->Text(0, 150*Graphics()->ScreenAspect()-w/2, 50, 24, pText, -1); } @@ -186,7 +186,7 @@ void CHud::RenderTeambalanceWarning() int TeamDiff = m_pClient->m_Snap.m_aTeamSize[0]-m_pClient->m_Snap.m_aTeamSize[1]; if (g_Config.m_ClWarningTeambalance && (TeamDiff >= 2 || TeamDiff <= -2)) { - const char *pText = "Please balance teams!"; + const char *pText = Localize("Please balance teams!"); if(Flash) TextRender()->TextColor(1,1,0.5f,1); else @@ -214,7 +214,7 @@ void CHud::RenderVoting() char Buf[512]; TextRender()->Text(0x0, 5, 60, 6, m_pClient->m_pVoting->VoteDescription(), -1); - str_format(Buf, sizeof(Buf), "%ds left", m_pClient->m_pVoting->SecondsLeft()); + str_format(Buf, sizeof(Buf), Localize("%ds left"), m_pClient->m_pVoting->SecondsLeft()); float tw = TextRender()->TextWidth(0x0, 6, Buf, -1); TextRender()->Text(0x0, 5+100-tw, 60, 6, Buf, -1); diff --git a/src/game/client/components/menus.cpp b/src/game/client/components/menus.cpp index 585c6d7a..b752f8cb 100644 --- a/src/game/client/components/menus.cpp +++ b/src/game/client/components/menus.cpp @@ -840,7 +840,7 @@ int CMenus::Render() } else if(m_Popup == POPUP_PASSWORD) { - pTitle = Localize("Password Incorrect"); + pTitle = Localize("Password incorrect"); pExtraText = Client()->ErrorString(); pButtonText = Localize("Try again"); } diff --git a/src/game/editor/ed_editor.cpp b/src/game/editor/ed_editor.cpp index b2b3e1ca..387ce104 100644 --- a/src/game/editor/ed_editor.cpp +++ b/src/game/editor/ed_editor.cpp @@ -1029,6 +1029,14 @@ void CEditor::DoQuadPoint(CQuad *q, int QuadIndex, int v) s_Operation = OP_CONTEXT_MENU; m_SelectedQuad = QuadIndex; UI()->SetActiveItem(pId); + if(!(m_SelectedPoints&(1<<v))) + { + if(Input()->KeyPressed(KEY_LSHIFT) || Input()->KeyPressed(KEY_RSHIFT)) + m_SelectedPoints |= 1<<v; + else + m_SelectedPoints = 1<<v; + s_Moved = true; + } } } else diff --git a/src/tools/fake_server.cpp b/src/tools/fake_server.cpp index b833c1b1..9442c7ba 100644 --- a/src/tools/fake_server.cpp +++ b/src/tools/fake_server.cpp @@ -111,7 +111,7 @@ static int Run() int64 NextHeartBeat = 0; NETADDR BindAddr = {NETTYPE_IPV4, {0},0}; - if(!pNet->Open(BindAddr, 0, 0)) + if(!pNet->Open(BindAddr, 0, 0, 0)) return 0; while(1) |