437 lines
14 KiB
C++
437 lines
14 KiB
C++
// vgui_SpectatorPanel.cpp: implementation of the SpectatorPanel class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "hud.h"
|
|
#include "cl_util.h"
|
|
#include "const.h"
|
|
#include "entity_state.h"
|
|
#include "cl_entity.h"
|
|
#include "pm_shared.h"
|
|
#include "vgui_TeamFortressViewport.h"
|
|
#include "vgui_SpectatorPanel.h"
|
|
#include "vgui_ScorePanel.h"
|
|
|
|
#include "Exports.h"
|
|
|
|
/*
|
|
==========================
|
|
HUD_ChatInputPosition
|
|
|
|
Sets the location of the input for chat text
|
|
==========================
|
|
*/
|
|
|
|
void DLLEXPORT HUD_ChatInputPosition(int* x, int* y)
|
|
{
|
|
// RecClChatInputPosition( x, y );
|
|
|
|
if (g_iUser1 != 0 || 0 != gEngfuncs.IsSpectateOnly())
|
|
{
|
|
if (gHUD.m_Spectator.m_pip->value == INSET_OFF)
|
|
{
|
|
*y = YRES_HD(PANEL_HEIGHT);
|
|
}
|
|
else
|
|
{
|
|
*y = YRES_HD(gHUD.m_Spectator.m_OverviewData.insetWindowHeight + 5);
|
|
}
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
SpectatorPanel::SpectatorPanel(int x, int y, int wide, int tall) : Panel(x, y, wide, tall)
|
|
{
|
|
}
|
|
|
|
SpectatorPanel::~SpectatorPanel()
|
|
{
|
|
}
|
|
|
|
void SpectatorPanel::ActionSignal(int cmd)
|
|
{
|
|
switch (cmd)
|
|
{
|
|
case SPECTATOR_PANEL_CMD_NONE:
|
|
break;
|
|
|
|
case SPECTATOR_PANEL_CMD_OPTIONS:
|
|
gViewPort->ShowCommandMenu(gViewPort->m_SpectatorOptionsMenu);
|
|
break;
|
|
|
|
case SPECTATOR_PANEL_CMD_NEXTPLAYER:
|
|
gHUD.m_Spectator.FindNextPlayer(true);
|
|
break;
|
|
|
|
case SPECTATOR_PANEL_CMD_PREVPLAYER:
|
|
gHUD.m_Spectator.FindNextPlayer(false);
|
|
break;
|
|
|
|
case SPECTATOR_PANEL_CMD_PLAYERS:
|
|
gViewPort->ShowCommandMenu(gViewPort->m_PlayerMenu);
|
|
break;
|
|
|
|
case SPECTATOR_PANEL_CMD_HIDEMENU:
|
|
ShowMenu(false);
|
|
break;
|
|
|
|
case SPECTATOR_PANEL_CMD_CAMERA:
|
|
gViewPort->ShowCommandMenu(gViewPort->m_SpectatorCameraMenu);
|
|
break;
|
|
|
|
case SPECTATOR_PANEL_CMD_TOGGLE_INSET:
|
|
gHUD.m_Spectator.SetModes(-1,
|
|
gHUD.m_Spectator.ToggleInset(false));
|
|
break;
|
|
|
|
|
|
default:
|
|
gEngfuncs.Con_DPrintf("Unknown SpectatorPanel ActionSingal %i.\n", cmd);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
void SpectatorPanel::Initialize()
|
|
{
|
|
int x, y, wide, tall;
|
|
|
|
getBounds(x, y, wide, tall);
|
|
|
|
CSchemeManager* pSchemes = gViewPort->GetSchemeManager();
|
|
|
|
SchemeHandle_t hSmallScheme = pSchemes->getSchemeHandle("Team Info Text");
|
|
|
|
m_TopBorder = new CTransparentPanel(64, 0, 0, ScreenWidth, YRES_HD(PANEL_HEIGHT));
|
|
m_TopBorder->setParent(this);
|
|
|
|
m_BottomBorder = new CTransparentPanel(64, 0, ScreenHeight - YRES_HD(PANEL_HEIGHT), ScreenWidth, YRES_HD(PANEL_HEIGHT));
|
|
m_BottomBorder->setParent(this);
|
|
|
|
setPaintBackgroundEnabled(false);
|
|
|
|
m_ExtraInfo = new Label("Extra Info", 0, 0, wide, YRES_HD(PANEL_HEIGHT));
|
|
m_ExtraInfo->setParent(m_TopBorder);
|
|
m_ExtraInfo->setFont(pSchemes->getFont(hSmallScheme));
|
|
|
|
m_ExtraInfo->setPaintBackgroundEnabled(false);
|
|
m_ExtraInfo->setFgColor(143, 143, 54, 0);
|
|
m_ExtraInfo->setContentAlignment(vgui::Label::a_west);
|
|
|
|
|
|
|
|
m_TimerImage = new CImageLabel("timer", 0, 0, 14, 14);
|
|
m_TimerImage->setParent(m_TopBorder);
|
|
|
|
m_TopBanner = new CImageLabel("banner", 0, 0, XRES_HD(BANNER_WIDTH), YRES_HD(BANNER_HEIGHT));
|
|
m_TopBanner->setParent(this);
|
|
|
|
m_CurrentTime = new Label("00:00", 0, 0, wide, YRES_HD(PANEL_HEIGHT));
|
|
m_CurrentTime->setParent(m_TopBorder);
|
|
m_CurrentTime->setFont(pSchemes->getFont(hSmallScheme));
|
|
m_CurrentTime->setPaintBackgroundEnabled(false);
|
|
m_CurrentTime->setFgColor(143, 143, 54, 0);
|
|
m_CurrentTime->setContentAlignment(vgui::Label::a_west);
|
|
|
|
m_Separator = new Panel(0, 0, XRES_HD(64), YRES_HD(96));
|
|
m_Separator->setParent(m_TopBorder);
|
|
m_Separator->setFgColor(59, 58, 34, 48);
|
|
m_Separator->setBgColor(59, 58, 34, 48);
|
|
|
|
for (int j = 0; j < TEAM_NUMBER; j++)
|
|
{
|
|
m_TeamScores[j] = new Label(" ", 0, 0, wide, YRES_HD(PANEL_HEIGHT));
|
|
m_TeamScores[j]->setParent(m_TopBorder);
|
|
m_TeamScores[j]->setFont(pSchemes->getFont(hSmallScheme));
|
|
m_TeamScores[j]->setPaintBackgroundEnabled(false);
|
|
m_TeamScores[j]->setFgColor(143, 143, 54, 0);
|
|
m_TeamScores[j]->setContentAlignment(vgui::Label::a_west);
|
|
m_TeamScores[j]->setVisible(false);
|
|
}
|
|
|
|
|
|
// Initialize command buttons.
|
|
// m_OptionButton = new ColorButton( CHudTextMessage::BufferedLocaliseTextString( "#SPECT_OPTIONS" ), XRES_HD(15), YRES_HD(6), XRES_HD(OPTIONS_BUTTON_X), YRES_HD(20), false, false );
|
|
m_OptionButton = new DropDownButton(CHudTextMessage::BufferedLocaliseTextString("#SPECT_OPTIONS"), XRES_HD(15), YRES_HD(6), XRES_HD(OPTIONS_BUTTON_X), YRES_HD(20), false, false);
|
|
m_OptionButton->setParent(m_BottomBorder);
|
|
m_OptionButton->setContentAlignment(vgui::Label::a_center);
|
|
m_OptionButton->setBoundKey((char)255); // special no bound to avoid leading spaces in name
|
|
m_OptionButton->addActionSignal(new CSpectatorHandler_Command(this, SPECTATOR_PANEL_CMD_OPTIONS));
|
|
m_OptionButton->setUnArmedBorderColor(59, 58, 34, 48);
|
|
m_OptionButton->setArmedBorderColor(194, 202, 54, 0);
|
|
m_OptionButton->setUnArmedColor(143, 143, 54, 0);
|
|
m_OptionButton->setArmedColor(194, 202, 54, 0);
|
|
|
|
m_CamButton = new DropDownButton(CHudTextMessage::BufferedLocaliseTextString("#CAM_OPTIONS"), ScreenWidth - XRES_HD(CAMOPTIONS_BUTTON_X + 15), YRES_HD(6), XRES_HD(CAMOPTIONS_BUTTON_X), YRES_HD(20), false, false);
|
|
m_CamButton->setParent(m_BottomBorder);
|
|
m_CamButton->setContentAlignment(vgui::Label::a_center);
|
|
m_CamButton->setBoundKey((char)255); // special no bound to avoid leading spaces in name
|
|
m_CamButton->addActionSignal(new CSpectatorHandler_Command(this, SPECTATOR_PANEL_CMD_CAMERA));
|
|
m_CamButton->setUnArmedBorderColor(59, 58, 34, 48);
|
|
m_CamButton->setArmedBorderColor(194, 202, 54, 0);
|
|
m_CamButton->setUnArmedColor(143, 143, 54, 0);
|
|
m_CamButton->setArmedColor(194, 202, 54, 0);
|
|
|
|
// m_PrevPlayerButton= new ColorButton("<", XRES_HD( 15 + OPTIONS_BUTTON_X + 15 ), YRES_HD(6), XRES_HD(24), YRES_HD(20), false, false );
|
|
m_PrevPlayerButton = new CImageButton("arrowleft", XRES_HD(15 + OPTIONS_BUTTON_X + 15), YRES_HD(6), XRES_HD(24), YRES_HD(20), false, false);
|
|
m_PrevPlayerButton->setParent(m_BottomBorder);
|
|
m_PrevPlayerButton->setContentAlignment(vgui::Label::a_center);
|
|
m_PrevPlayerButton->setBoundKey((char)255); // special no bound to avoid leading spaces in name
|
|
m_PrevPlayerButton->addActionSignal(new CSpectatorHandler_Command(this, SPECTATOR_PANEL_CMD_PREVPLAYER));
|
|
m_PrevPlayerButton->setUnArmedBorderColor(59, 58, 34, 48);
|
|
m_PrevPlayerButton->setArmedBorderColor(194, 202, 54, 0);
|
|
m_PrevPlayerButton->setUnArmedColor(143, 143, 54, 0);
|
|
m_PrevPlayerButton->setArmedColor(194, 202, 54, 0);
|
|
|
|
// m_NextPlayerButton= new ColorButton(">", (ScreenWidth - (XRES_HD ( CAMOPTIONS_BUTTON_X ) + 15)) - XRES_HD ( 24 + 15 ), YRES_HD(6), XRES_HD(24), YRES_HD(20),false, false );
|
|
m_NextPlayerButton = new CImageButton("arrowright", ScreenWidth - XRES_HD(CAMOPTIONS_BUTTON_X + 15) - XRES_HD(24 + 15), YRES_HD(6), XRES_HD(24), YRES_HD(20), false, false);
|
|
m_NextPlayerButton->setParent(m_BottomBorder);
|
|
m_NextPlayerButton->setContentAlignment(vgui::Label::a_center);
|
|
m_NextPlayerButton->setBoundKey((char)255); // special no bound to avoid leading spaces in name
|
|
m_NextPlayerButton->addActionSignal(new CSpectatorHandler_Command(this, SPECTATOR_PANEL_CMD_NEXTPLAYER));
|
|
m_NextPlayerButton->setUnArmedBorderColor(59, 58, 34, 48);
|
|
m_NextPlayerButton->setArmedBorderColor(194, 202, 54, 0);
|
|
m_NextPlayerButton->setUnArmedColor(143, 143, 54, 0);
|
|
m_NextPlayerButton->setArmedColor(194, 202, 54, 0);
|
|
|
|
// Initialize the bottom title.
|
|
|
|
float flLabelSize = ScreenWidth - XRES_HD(CAMOPTIONS_BUTTON_X + 15) - XRES_HD(24 + 15) - XRES_HD((15 + OPTIONS_BUTTON_X + 15) + 38);
|
|
|
|
m_BottomMainButton = new DropDownButton("Spectator Bottom",
|
|
XRES_HD((15 + OPTIONS_BUTTON_X + 15) + 31), YRES_HD(6), flLabelSize, YRES_HD(20),
|
|
false, false);
|
|
|
|
m_BottomMainButton->setParent(m_BottomBorder);
|
|
m_BottomMainButton->setPaintBackgroundEnabled(false);
|
|
m_BottomMainButton->setFgColor(Scheme::sc_primary1);
|
|
m_BottomMainButton->setContentAlignment(vgui::Label::a_center);
|
|
m_BottomMainButton->setBorder(new LineBorder(Color(59, 58, 34, 48)));
|
|
m_BottomMainButton->setBoundKey((char)255); // special no bound to avoid leading spaces in name
|
|
m_BottomMainButton->addActionSignal(new CSpectatorHandler_Command(this, SPECTATOR_PANEL_CMD_PLAYERS));
|
|
m_BottomMainButton->setUnArmedBorderColor(59, 58, 34, 48);
|
|
m_BottomMainButton->setArmedBorderColor(194, 202, 54, 0);
|
|
m_BottomMainButton->setUnArmedColor(143, 143, 54, 0);
|
|
m_BottomMainButton->setArmedColor(194, 202, 54, 0);
|
|
|
|
|
|
m_BottomMainLabel = new Label("Spectator Bottom",
|
|
XRES_HD((15 + OPTIONS_BUTTON_X + 15) + 31), YRES_HD(6), flLabelSize, YRES_HD(20));
|
|
|
|
m_BottomMainLabel->setParent(m_BottomBorder);
|
|
m_BottomMainLabel->setPaintBackgroundEnabled(false);
|
|
m_BottomMainLabel->setFgColor(Scheme::sc_primary1);
|
|
m_BottomMainLabel->setContentAlignment(vgui::Label::a_center);
|
|
m_BottomMainLabel->setBorder(NULL);
|
|
m_BottomMainLabel->setVisible(false);
|
|
|
|
m_InsetViewButton = new ColorButton("", XRES_HD(2), YRES_HD(2), XRES_HD(240), YRES_HD(180), false, false);
|
|
m_InsetViewButton->setParent(this);
|
|
m_InsetViewButton->setBoundKey((char)255);
|
|
m_InsetViewButton->addActionSignal(new CSpectatorHandler_Command(this, SPECTATOR_PANEL_CMD_TOGGLE_INSET));
|
|
m_InsetViewButton->setUnArmedBorderColor(59, 58, 34, 48);
|
|
m_InsetViewButton->setArmedBorderColor(194, 202, 54, 0);
|
|
m_InsetViewButton->setUnArmedColor(143, 143, 54, 0);
|
|
m_InsetViewButton->setArmedColor(194, 202, 54, 0);
|
|
|
|
|
|
m_menuVisible = false;
|
|
m_insetVisible = false;
|
|
// m_HideButton->setVisible(false);
|
|
m_CamButton->setVisible(false);
|
|
m_OptionButton->setVisible(false);
|
|
m_NextPlayerButton->setVisible(false);
|
|
m_PrevPlayerButton->setVisible(false);
|
|
m_TopBanner->setVisible(false);
|
|
m_ExtraInfo->setVisible(false);
|
|
m_Separator->setVisible(false);
|
|
m_TimerImage->setVisible(false);
|
|
}
|
|
|
|
void SpectatorPanel::ShowMenu(bool isVisible)
|
|
{
|
|
// m_HideButton->setVisible(isVisible); m_HideButton->setArmed( false );
|
|
m_OptionButton->setVisible(isVisible);
|
|
m_OptionButton->setArmed(false);
|
|
m_CamButton->setVisible(isVisible);
|
|
m_CamButton->setArmed(false);
|
|
m_NextPlayerButton->setVisible(isVisible);
|
|
m_NextPlayerButton->setArmed(false);
|
|
m_PrevPlayerButton->setVisible(isVisible);
|
|
m_PrevPlayerButton->setArmed(false);
|
|
|
|
if (!isVisible)
|
|
{
|
|
int iLabelSizeX, iLabelSizeY;
|
|
m_BottomMainLabel->setVisible(true);
|
|
m_BottomMainButton->setVisible(false);
|
|
|
|
m_BottomMainLabel->getSize(iLabelSizeX, iLabelSizeY);
|
|
m_BottomMainLabel->setPos((ScreenWidth / 2) - (iLabelSizeX / 2), YRES_HD(6));
|
|
}
|
|
else
|
|
{
|
|
m_BottomMainButton->setPos(XRES_HD((15 + OPTIONS_BUTTON_X + 15) + 31), YRES_HD(6));
|
|
m_BottomMainLabel->setVisible(false);
|
|
m_BottomMainButton->setVisible(true);
|
|
}
|
|
|
|
if (!isVisible)
|
|
{
|
|
gViewPort->HideCommandMenu();
|
|
|
|
// if switching from visible menu to invisible menu, show help text
|
|
if (m_menuVisible && this->isVisible())
|
|
{
|
|
char string[64];
|
|
|
|
snprintf(string, sizeof(string) - 1, "%c%s", HUD_PRINTCENTER, CHudTextMessage::BufferedLocaliseTextString("#Spec_Duck"));
|
|
string[sizeof(string) - 1] = '\0';
|
|
|
|
gHUD.m_TextMessage.MsgFunc_TextMsg(NULL, strlen(string) + 1, string);
|
|
}
|
|
}
|
|
|
|
m_menuVisible = isVisible;
|
|
|
|
gViewPort->UpdateCursorState();
|
|
}
|
|
|
|
|
|
const char* GetSpectatorLabel(int iMode)
|
|
{
|
|
switch (iMode)
|
|
{
|
|
case OBS_CHASE_LOCKED:
|
|
return "#OBS_CHASE_LOCKED";
|
|
|
|
case OBS_CHASE_FREE:
|
|
return "#OBS_CHASE_FREE";
|
|
|
|
case OBS_ROAMING:
|
|
return "#OBS_ROAMING";
|
|
|
|
case OBS_IN_EYE:
|
|
return "#OBS_IN_EYE";
|
|
|
|
case OBS_MAP_FREE:
|
|
return "#OBS_MAP_FREE";
|
|
|
|
case OBS_MAP_CHASE:
|
|
return "#OBS_MAP_CHASE";
|
|
|
|
case OBS_NONE:
|
|
default:
|
|
return "#OBS_NONE";
|
|
}
|
|
|
|
return "";
|
|
}
|
|
|
|
void SpectatorPanel::EnableInsetView(bool isEnabled)
|
|
{
|
|
int x = gHUD.m_Spectator.m_OverviewData.insetWindowX;
|
|
int y = gHUD.m_Spectator.m_OverviewData.insetWindowY;
|
|
int wide = gHUD.m_Spectator.m_OverviewData.insetWindowWidth;
|
|
int tall = gHUD.m_Spectator.m_OverviewData.insetWindowHeight;
|
|
int offset = x + wide + 2;
|
|
|
|
if (isEnabled)
|
|
{
|
|
// short black bar to see full inset
|
|
m_TopBorder->setBounds(XRES_HD(offset), 0, ScreenWidth - XRES_HD(offset), YRES_HD(PANEL_HEIGHT));
|
|
|
|
if (0 != gEngfuncs.IsSpectateOnly())
|
|
{
|
|
m_TopBanner->setVisible(true);
|
|
m_TopBanner->setPos(XRES_HD(offset), 0);
|
|
}
|
|
else
|
|
m_TopBanner->setVisible(false);
|
|
|
|
m_InsetViewButton->setBounds(XRES_HD(x - 1), YRES_HD(y),
|
|
XRES_HD(wide + 2), YRES_HD(tall));
|
|
m_InsetViewButton->setVisible(true);
|
|
}
|
|
else
|
|
{
|
|
// full black bar, no inset border
|
|
// show banner only in real HLTV mode
|
|
if (0 != gEngfuncs.IsSpectateOnly())
|
|
{
|
|
m_TopBanner->setVisible(true);
|
|
m_TopBanner->setPos(0, 0);
|
|
}
|
|
else
|
|
m_TopBanner->setVisible(false);
|
|
|
|
m_TopBorder->setBounds(0, 0, ScreenWidth, YRES_HD(PANEL_HEIGHT));
|
|
|
|
m_InsetViewButton->setVisible(false);
|
|
}
|
|
|
|
m_insetVisible = isEnabled;
|
|
|
|
Update();
|
|
|
|
m_CamButton->setText(CHudTextMessage::BufferedLocaliseTextString(GetSpectatorLabel(g_iUser1)));
|
|
}
|
|
|
|
|
|
|
|
|
|
void SpectatorPanel::Update()
|
|
{
|
|
int iTextWidth, iTextHeight;
|
|
int iTimeHeight, iTimeWidth;
|
|
int offset, j;
|
|
|
|
if (m_insetVisible)
|
|
offset = gHUD.m_Spectator.m_OverviewData.insetWindowX + gHUD.m_Spectator.m_OverviewData.insetWindowWidth + 2;
|
|
else
|
|
offset = 0;
|
|
|
|
bool visible = gHUD.m_Spectator.m_drawstatus->value != 0;
|
|
|
|
m_ExtraInfo->setVisible(visible);
|
|
m_TimerImage->setVisible(visible);
|
|
m_CurrentTime->setVisible(visible);
|
|
m_Separator->setVisible(visible);
|
|
|
|
for (j = 0; j < TEAM_NUMBER; j++)
|
|
m_TeamScores[j]->setVisible(visible);
|
|
|
|
if (!visible)
|
|
return;
|
|
|
|
m_ExtraInfo->getTextSize(iTextWidth, iTextHeight);
|
|
m_CurrentTime->getTextSize(iTimeWidth, iTimeHeight);
|
|
|
|
iTimeWidth += XRES_HD(SEPERATOR_WIDTH * 2 + 1); // +timer icon
|
|
iTimeWidth += (XRES_HD(SEPERATOR_WIDTH) - (iTimeWidth % (int)XRES_HD(SEPERATOR_WIDTH)));
|
|
|
|
if (iTimeWidth > iTextWidth)
|
|
iTextWidth = iTimeWidth;
|
|
|
|
int xPos = ScreenWidth - (iTextWidth + XRES_HD(SEPERATOR_WIDTH + offset));
|
|
|
|
m_ExtraInfo->setBounds(xPos, SEPERATOR_HEIGHT, iTextWidth, iTextHeight);
|
|
|
|
m_TimerImage->setBounds(xPos, SEPERATOR_HEIGHT + iTextHeight, XRES_HD(SEPERATOR_WIDTH * 2 + 1), SEPERATOR_HEIGHT + 1);
|
|
|
|
m_CurrentTime->setBounds(xPos + XRES_HD(SEPERATOR_WIDTH * 2 + 1), SEPERATOR_HEIGHT + iTextHeight, iTimeWidth, iTimeHeight);
|
|
|
|
m_Separator->setPos(ScreenWidth - (iTextWidth + XRES_HD(2 * SEPERATOR_WIDTH + SEPERATOR_WIDTH / 2 + offset)), YRES_HD(5));
|
|
m_Separator->setSize(XRES_HD(1), YRES_HD(PANEL_HEIGHT - 10));
|
|
|
|
for (j = 0; j < TEAM_NUMBER; j++)
|
|
{
|
|
int iwidth, iheight;
|
|
|
|
m_TeamScores[j]->getTextSize(iwidth, iheight);
|
|
m_TeamScores[j]->setBounds(ScreenWidth - (iTextWidth + XRES_HD(2 * SEPERATOR_WIDTH + 2 * SEPERATOR_WIDTH / 2 + offset) + iwidth), SEPERATOR_HEIGHT + (iheight * j), iwidth, iheight);
|
|
}
|
|
}
|