about summary refs log tree commit diff
path: root/src/game/client
diff options
context:
space:
mode:
authoroy <Tom_Adams@web.de>2011-03-22 22:41:27 +0100
committeroy <Tom_Adams@web.de>2011-03-22 22:41:27 +0100
commitb64db75a6b5e6a08c356278ab73d29707579844c (patch)
treecc58c2a2def9972c8e04892b9527e08a4ef97f29 /src/game/client
parent05244d4dad5a08eb53fdd738588a29e26af72736 (diff)
downloadzcatch-b64db75a6b5e6a08c356278ab73d29707579844c.tar.gz
zcatch-b64db75a6b5e6a08c356278ab73d29707579844c.zip
added an option to ignore other players in chat
Diffstat (limited to 'src/game/client')
-rw-r--r--src/game/client/components/chat.cpp3
-rw-r--r--src/game/client/components/menus_ingame.cpp84
-rw-r--r--src/game/client/gameclient.cpp43
-rw-r--r--src/game/client/gameclient.h3
4 files changed, 96 insertions, 37 deletions
diff --git a/src/game/client/components/chat.cpp b/src/game/client/components/chat.cpp
index 4360fc02..fd08d9d0 100644
--- a/src/game/client/components/chat.cpp
+++ b/src/game/client/components/chat.cpp
@@ -199,7 +199,8 @@ void CChat::OnMessage(int MsgType, void *pRawMsg)
 
 void CChat::AddLine(int ClientID, int Team, const char *pLine)
 {
-	if(ClientID != -1 && m_pClient->m_aClients[ClientID].m_aName[0] == '\0') // unknown client
+	if(ClientID != -1 && m_pClient->m_aClients[ClientID].m_aName[0] == '\0' || // unknown client
+		m_pClient->m_aClients[ClientID].m_ChatIgnore)
 		return;
 	
 	bool Highlighted = false;
diff --git a/src/game/client/components/menus_ingame.cpp b/src/game/client/components/menus_ingame.cpp
index ef3d0236..2e7c33e8 100644
--- a/src/game/client/components/menus_ingame.cpp
+++ b/src/game/client/components/menus_ingame.cpp
@@ -10,10 +10,11 @@
 #include <game/generated/protocol.h>
 #include <game/generated/client_data.h>
 
-#include <game/client/ui.h>
-#include <game/client/gameclient.h>
-#include <game/client/animstate.h>
 #include <game/localization.h>
+#include <game/client/animstate.h>
+#include <game/client/gameclient.h>
+#include <game/client/render.h>
+#include <game/client/ui.h>
 
 #include "menus.h"
 #include "motd.h"
@@ -21,16 +22,16 @@
 
 void CMenus::RenderGame(CUIRect MainView)
 {
-	CUIRect Button;
-	//CUIRect votearea;
-	MainView.HSplitTop(45.0f, &MainView, 0);
+	CUIRect Button, ButtonBar, Options;
 	RenderTools()->DrawUIRect(&MainView, ms_ColorTabbarActive, CUI::CORNER_ALL, 10.0f);
-
-	MainView.HSplitTop(10.0f, 0, &MainView);
-	MainView.HSplitTop(25.0f, &MainView, 0);
-	MainView.VMargin(10.0f, &MainView);
 	
-	MainView.VSplitRight(120.0f, &MainView, &Button);
+	// button bar
+	MainView.HSplitTop(45.0f, &ButtonBar, &MainView);
+	ButtonBar.HSplitTop(10.0f, 0, &ButtonBar);
+	ButtonBar.HSplitTop(25.0f, &ButtonBar, 0);
+	ButtonBar.VMargin(10.0f, &ButtonBar);
+	
+	ButtonBar.VSplitRight(120.0f, &ButtonBar, &Button);
 	static int s_DisconnectButton = 0;
 	if(DoButton_Menu(&s_DisconnectButton, Localize("Disconnect"), 0, &Button))
 		Client()->Disconnect();
@@ -39,8 +40,8 @@ void CMenus::RenderGame(CUIRect MainView)
 	{
 		if(m_pClient->m_Snap.m_pLocalInfo->m_Team != TEAM_SPECTATORS)
 		{
-			MainView.VSplitLeft(10.0f, &Button, &MainView);
-			MainView.VSplitLeft(120.0f, &Button, &MainView);
+			ButtonBar.VSplitLeft(10.0f, 0, &ButtonBar);
+			ButtonBar.VSplitLeft(120.0f, &Button, &ButtonBar);
 			static int s_SpectateButton = 0;
 			if(DoButton_Menu(&s_SpectateButton, Localize("Spectate"), 0, &Button))
 			{
@@ -53,8 +54,8 @@ void CMenus::RenderGame(CUIRect MainView)
 		{
 			if(m_pClient->m_Snap.m_pLocalInfo->m_Team != TEAM_RED)
 			{
-				MainView.VSplitLeft(10.0f, &Button, &MainView);
-				MainView.VSplitLeft(120.0f, &Button, &MainView);
+				ButtonBar.VSplitLeft(10.0f, 0, &ButtonBar);
+				ButtonBar.VSplitLeft(120.0f, &Button, &ButtonBar);
 				static int s_SpectateButton = 0;
 				if(DoButton_Menu(&s_SpectateButton, Localize("Join red"), 0, &Button))
 				{
@@ -65,8 +66,8 @@ void CMenus::RenderGame(CUIRect MainView)
 
 			if(m_pClient->m_Snap.m_pLocalInfo->m_Team != TEAM_BLUE)
 			{
-				MainView.VSplitLeft(10.0f, &Button, &MainView);
-				MainView.VSplitLeft(120.0f, &Button, &MainView);
+				ButtonBar.VSplitLeft(10.0f, 0, &ButtonBar);
+				ButtonBar.VSplitLeft(120.0f, &Button, &ButtonBar);
 				static int s_SpectateButton = 0;
 				if(DoButton_Menu(&s_SpectateButton, Localize("Join blue"), 0, &Button))
 				{
@@ -79,8 +80,8 @@ void CMenus::RenderGame(CUIRect MainView)
 		{
 			if(m_pClient->m_Snap.m_pLocalInfo->m_Team != 0)
 			{
-				MainView.VSplitLeft(10.0f, &Button, &MainView);
-				MainView.VSplitLeft(120.0f, &Button, &MainView);
+				ButtonBar.VSplitLeft(10.0f, 0, &ButtonBar);
+				ButtonBar.VSplitLeft(120.0f, &Button, &ButtonBar);
 				static int s_SpectateButton = 0;
 				if(DoButton_Menu(&s_SpectateButton, Localize("Join game"), 0, &Button))
 				{
@@ -91,8 +92,8 @@ void CMenus::RenderGame(CUIRect MainView)
 		}
 	}
 
-	MainView.VSplitLeft(100.0f, &Button, &MainView);
-	MainView.VSplitLeft(150.0f, &Button, &MainView);
+	ButtonBar.VSplitLeft(100.0f, 0, &ButtonBar);
+	ButtonBar.VSplitLeft(150.0f, &Button, &ButtonBar);
 
 	static int s_DemoButton = 0;
 	bool Recording = DemoRecorder()->IsRecording();
@@ -103,6 +104,47 @@ void CMenus::RenderGame(CUIRect MainView)
 		else
 			Client()->DemoRecorder_Stop();
 	}
+
+	// player options
+	MainView.Margin(10.0f, &Options);
+	RenderTools()->DrawUIRect(&Options, vec4(1.0f, 1.0f, 1.0f, 0.25f), CUI::CORNER_ALL, 10.0f);
+	Options.Margin(10.0f, &Options);
+	Options.HSplitTop(50.0f, &Button, &Options);
+	UI()->DoLabelScaled(&Button, Localize("Player options"), 34.0f, -1);
+
+	CUIRect Player;
+	static int s_aPlayerIDs[MAX_CLIENTS] = {0};
+	for(int i = 0; i < MAX_CLIENTS; ++i)
+	{
+		if(!m_pClient->m_Snap.m_paPlayerInfos[i] || i == m_pClient->m_Snap.m_LocalClientID)
+			continue;
+
+		Options.HSplitTop(25.0f, &ButtonBar, &Options);
+		ButtonBar.VSplitRight(200.0f, &Player, &ButtonBar);
+
+		// player info
+		Player.VSplitLeft(25.0f, &Button, &Player);
+		CTeeRenderInfo Info = m_pClient->m_aClients[i].m_RenderInfo;
+		Info.m_Size = Button.h;
+		RenderTools()->RenderTee(CAnimState::GetIdle(), &Info, EMOTE_NORMAL, vec2(1.0f, 0.0f), vec2(Button.x+Button.h/2, Button.y+Button.h/2));
+
+		Player.HSplitTop(1.5f, 0, &Player);
+		Player.VSplitMid(&Player, &Button);
+		CTextCursor Cursor;
+		TextRender()->SetCursor(&Cursor, Player.x, Player.y, 14.0f, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END);
+		Cursor.m_LineWidth = Player.w;
+		TextRender()->TextEx(&Cursor, m_pClient->m_aClients[i].m_aName, -1);
+
+		TextRender()->SetCursor(&Cursor, Button.x,Button.y, 14.0f, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END);
+		Cursor.m_LineWidth = Button.w;
+		TextRender()->TextEx(&Cursor, m_pClient->m_aClients[i].m_aClan, -1);
+
+		// ignore button
+		ButtonBar.VSplitMid(&Button, &ButtonBar);
+		Button.VSplitRight(10.0f, &Button, 0);
+		if(DoButton_CheckBox(&s_aPlayerIDs[i], Localize("Ignore"), m_pClient->m_aClients[i].m_ChatIgnore, &Button))
+			m_pClient->m_aClients[i].m_ChatIgnore ^= 1;
+	}
 	
 	/*
 	CUIRect bars;
diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp
index a7e9e66f..9f0898fc 100644
--- a/src/game/client/gameclient.cpp
+++ b/src/game/client/gameclient.cpp
@@ -341,20 +341,7 @@ void CGameClient::OnReset()
 	mem_zero(&g_GameClient.m_Snap, sizeof(g_GameClient.m_Snap));
 
 	for(int i = 0; i < MAX_CLIENTS; i++)
-	{
-		m_aClients[i].m_aName[0] = 0;
-		m_aClients[i].m_aClan[0] = 0;
-		m_aClients[i].m_Country = -1;
-		m_aClients[i].m_SkinID = 0;
-		m_aClients[i].m_Team = 0;
-		m_aClients[i].m_Angle = 0;
-		m_aClients[i].m_Emoticon = 0;
-		m_aClients[i].m_EmoticonStart = -1;
-		m_aClients[i].m_SkinInfo.m_Texture = g_GameClient.m_pSkins->Get(0)->m_ColorTexture;
-		m_aClients[i].m_SkinInfo.m_ColorBody = vec4(1,1,1,1);
-		m_aClients[i].m_SkinInfo.m_ColorFeet = vec4(1,1,1,1);
-		m_aClients[i].UpdateRenderInfo();
-	}
+		m_aClients[i].Reset();
 	
 	for(int i = 0; i < m_All.m_Num; i++)
 		m_All.m_paComponents[i]->OnReset();
@@ -744,7 +731,6 @@ void CGameClient::OnNewSnapshot()
 				}
 
 				m_aClients[ClientID].UpdateRenderInfo();
-				g_GameClient.m_Snap.m_NumPlayers++;
 				
 			}
 			else if(Item.m_Type == NETOBJTYPE_PLAYERINFO)
@@ -752,7 +738,9 @@ void CGameClient::OnNewSnapshot()
 				const CNetObj_PlayerInfo *pInfo = (const CNetObj_PlayerInfo *)pData;
 				
 				m_aClients[pInfo->m_ClientID].m_Team = pInfo->m_Team;
+				m_aClients[pInfo->m_ClientID].m_Active = true;
 				m_Snap.m_paPlayerInfos[pInfo->m_ClientID] = pInfo;
+				m_Snap.m_NumPlayers++;
 				
 				if(pInfo->m_Local)
 				{
@@ -839,6 +827,13 @@ void CGameClient::OnNewSnapshot()
 			m_Snap.m_SpecInfo.m_SpectatorID = SPEC_FREEVIEW;
 	}
 
+	// clear out unneeded client data
+	for(int i = 0; i < MAX_CLIENTS; ++i)
+	{
+		if(!m_Snap.m_paPlayerInfos[i] && m_aClients[i].m_Active)
+			m_aClients[i].Reset();
+	}
+
 	// sort player infos by score
 	mem_copy(m_Snap.m_paInfoByScore, m_Snap.m_paPlayerInfos, sizeof(m_Snap.m_paInfoByScore));
 	for(int k = 0; k < MAX_CLIENTS-1; k++) // ffs, bubblesort
@@ -1017,6 +1012,24 @@ void CGameClient::CClientData::UpdateRenderInfo()
 	}		
 }
 
+void CGameClient::CClientData::Reset()
+{
+	m_aName[0] = 0;
+	m_aClan[0] = 0;
+	m_Country = -1;
+	m_SkinID = 0;
+	m_Team = 0;
+	m_Angle = 0;
+	m_Emoticon = 0;
+	m_EmoticonStart = -1;
+	m_Active = false;
+	m_ChatIgnore = false;
+	m_SkinInfo.m_Texture = g_GameClient.m_pSkins->Get(0)->m_ColorTexture;
+	m_SkinInfo.m_ColorBody = vec4(1,1,1,1);
+	m_SkinInfo.m_ColorFeet = vec4(1,1,1,1);
+	UpdateRenderInfo();
+}
+
 void CGameClient::SendSwitchTeam(int Team)
 {
 	CNetMsg_Cl_SetTeam Msg;
diff --git a/src/game/client/gameclient.h b/src/game/client/gameclient.h
index e807592f..22caa740 100644
--- a/src/game/client/gameclient.h
+++ b/src/game/client/gameclient.h
@@ -176,8 +176,11 @@ public:
 		CTeeRenderInfo m_RenderInfo; // this is what we use
 		
 		float m_Angle;
+		bool m_Active;
+		bool m_ChatIgnore;
 		
 		void UpdateRenderInfo();
+		void Reset();
 	};
 
 	CClientData m_aClients[MAX_CLIENTS];