Portable Half-Life SDK. GoldSource and Xash3D. Crossplatform.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

525 lines
14 KiB

//++ BulliT
#include "hud.h"
#include "cl_util.h"
#include "agglobal.h"
#include <time.h>
#include "agmodelcheck.h"
cvar_t* g_phud_spectatebar = NULL;
cvar_t* g_phud_timer = NULL;
cvar_t* g_phud_playerid = NULL;
cvar_t* g_phud_settings = NULL;
cvar_t* g_phud_weapon = NULL;
cvar_t* g_phud_color = NULL;
cvar_t* g_pcl_matchreport = NULL;
cvar_t* g_pcl_playtalk = NULL;
cvar_t* g_pcl_weaponswitch = NULL;
//cvar_t* g_pcl_weaponweights = NULL;
cvar_t* g_pcl_disablespecs = NULL;
cvar_t* g_pcl_liveupdate = NULL;
cvar_t* g_pcl_scores = NULL;
cvar_t* g_pcl_scores_pos = NULL;
cvar_t* g_pcl_only_team_talk = NULL;
cvar_t* g_pcl_show_colors = NULL;
cvar_t* g_pcl_old_scoreboard = NULL;
cvar_t* g_pcl_ctf_volume = NULL;
cvar_t* g_pcl_show_local_maps = NULL;
cvar_t* g_pcl_location_keywords = NULL;
cvar_t* g_pcl_show_banner = NULL;
cvar_t* g_pirc_server = NULL;
cvar_t* g_pirc_nick = NULL;
cvar_t* g_pirc_port = NULL;
cvar_t* g_pirc_userid = NULL;
cvar_t* g_pirc_password = NULL;
cvar_t* g_pirc_fullname = NULL;
cvar_t* g_pirc_autojoin = NULL;
cvar_t* g_pirc_autocommand = NULL;
cvar_t* g_pirc_autocommand2 = NULL;
cvar_t* g_pirc_autocommand3 = NULL;
// Colors
int iNumConsoleColors = 16;
int arrConsoleColors[16][3] =
{
{ 255, 170, 0 }, // HL console (default)
{ 255, 0, 0 }, // Red
{ 0, 255, 0 }, // Green
{ 255, 255, 0 }, // Yellow
{ 0, 0, 255 }, // Blue
{ 0, 255, 255 }, // Cyan
{ 255, 0, 255 }, // Violet
{ 136, 136, 136 }, // Q
{ 255, 255, 255 }, // White
{ 0, 0, 0 }, // Black
{ 200, 90, 70 }, // Redb
{ 145, 215, 140 }, // Green
{ 225, 205, 45 }, // Yellow
{ 125, 165, 210 }, // Blue
{ 70, 70, 70 },
{ 200, 200, 200 },
};
int arrHudColor[3] =
{
255, 160, 0
};
extern int iTeamColors[5][3];
extern float g_ColorConsole[3];
//-- Martin Webrant
#ifdef _DEBUG
void AgTest();
#endif
void AgUpdateHudColor()
{
//Hud color
sscanf(CVAR_GET_STRING("hud_color"), "%i %i %i", &arrHudColor[0], &arrHudColor[1], &arrHudColor[2] );
iTeamColors[0][0] = arrHudColor[0];
iTeamColors[0][1] = arrHudColor[1];
iTeamColors[0][2] = arrHudColor[2];
//Console color
sscanf(CVAR_GET_STRING("con_color"), "%i %i %i", &arrConsoleColors[0][0], &arrConsoleColors[0][1], &arrConsoleColors[0][2] );
g_ColorConsole[0] = arrConsoleColors[0][0] / 255.0;
g_ColorConsole[1] = arrConsoleColors[0][1] / 255.0;
g_ColorConsole[2] = arrConsoleColors[0][2] / 255.0;
}
void AgGetHudColor(int &r, int &g, int &b)
{
r = arrHudColor[0];
g = arrHudColor[1];
b = arrHudColor[2];
}
//extern void COM_Log( char *pszFile, char *fmt, ...);
void AgInitClientDll()
{
g_phud_spectatebar = gEngfuncs.pfnRegisterVariable ( "hud_spectatebar", "1", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_phud_timer = gEngfuncs.pfnRegisterVariable ( "hud_timer", "1", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_phud_playerid = gEngfuncs.pfnRegisterVariable ( "hud_playerid", "1", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_phud_settings = gEngfuncs.pfnRegisterVariable ( "hud_settings", "1", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_phud_weapon = gEngfuncs.pfnRegisterVariable ( "hud_weapon", "0", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_phud_color = gEngfuncs.pfnRegisterVariable ( "hud_color", "255 160 0", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_pcl_matchreport = gEngfuncs.pfnRegisterVariable ( "cl_matchreport", "1", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_pcl_playtalk = gEngfuncs.pfnRegisterVariable ( "cl_playtalk", "0", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_pcl_weaponswitch = gEngfuncs.pfnRegisterVariable ( "cl_autowepswitch", "1", FCVAR_CLIENTDLL|FCVAR_ARCHIVE|FCVAR_USERINFO);
//g_pcl_weaponweights = gEngfuncs.pfnRegisterVariable ( "cl_weaponweights", "", FCVAR_CLIENTDLL|FCVAR_ARCHIVE|FCVAR_USERINFO); //weapon weight factors (for auto-switching) (-1 = noswitch)
g_pcl_disablespecs = gEngfuncs.pfnRegisterVariable ( "cl_disablespecs", "0", FCVAR_CLIENTDLL|FCVAR_ARCHIVE|FCVAR_USERINFO);
g_pcl_liveupdate = gEngfuncs.pfnRegisterVariable ( "cl_liveupdate", "0", FCVAR_CLIENTDLL|FCVAR_ARCHIVE); //Special for Mr. T-rex :P
g_pcl_scores = gEngfuncs.pfnRegisterVariable ( "cl_scores", "0", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_pcl_scores_pos = gEngfuncs.pfnRegisterVariable ( "cl_scores_pos", "30 50", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_pcl_only_team_talk= gEngfuncs.pfnRegisterVariable ( "cl_only_team_talk", "0", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_pcl_show_colors = gEngfuncs.pfnRegisterVariable ( "cl_show_colors", "1", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_pcl_old_scoreboard = gEngfuncs.pfnRegisterVariable ( "cl_old_scoreboard", "0", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_pcl_ctf_volume = gEngfuncs.pfnRegisterVariable ( "cl_ctf_volume", "1", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_pirc_server = gEngfuncs.pfnRegisterVariable ( "irc_server", "irc.quakenet.eu.org", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_pirc_port = gEngfuncs.pfnRegisterVariable ( "irc_port", "6667", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_pirc_nick = gEngfuncs.pfnRegisterVariable ( "irc_nick", "", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_pirc_userid = gEngfuncs.pfnRegisterVariable ( "irc_userid", "", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_pirc_password = gEngfuncs.pfnRegisterVariable ( "irc_password", "", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_pirc_fullname = gEngfuncs.pfnRegisterVariable ( "irc_fullname", "", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_pirc_autojoin = gEngfuncs.pfnRegisterVariable ( "irc_autojoin", "#pmers", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_pirc_autocommand = gEngfuncs.pfnRegisterVariable ( "irc_autocommand","", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_pirc_autocommand2 = gEngfuncs.pfnRegisterVariable ( "irc_autocommand2","", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_pirc_autocommand3 = gEngfuncs.pfnRegisterVariable ( "irc_autocommand3","", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_pcl_show_local_maps = gEngfuncs.pfnRegisterVariable ("cl_show_local_maps", "0", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_pcl_location_keywords = gEngfuncs.pfnRegisterVariable ("cl_location_keywords", "0", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
g_pcl_show_banner = gEngfuncs.pfnRegisterVariable ("cl_show_banner", "1", FCVAR_CLIENTDLL|FCVAR_ARCHIVE);
//Can use opforce stuff
gEngfuncs.COM_AddAppDirectoryToSearchPath("opforce","opforce");
//Setup colors
AgUpdateHudColor();
// COM_Log(NULL,"Modulehandle - %lx\n",GetModuleHandle("client.dll"));
}
int GetColor(char cChar)
{
int iColor = -1;
if (cChar >= '0' && cChar <= '9')
iColor = cChar - '0';
return iColor;
}
int AgDrawHudStringCentered(int xpos, int ypos, int iMaxX, const char *szIt, int r, int g, int b )
{
// calc center
int iSizeX = 0;
char* pszIt = (char*)szIt;
for ( ; *pszIt != 0 && *pszIt != '\n'; pszIt++ )
iSizeX += gHUD.m_scrinfo.charWidths[ *pszIt ]; // variable-width fonts look cool
//Subtract half sizex from xpos to center it.
xpos = xpos - iSizeX / 2;
int rx = r, gx = g, bx = b;
pszIt = (char*)szIt;
// draw the string until we hit the null character or a newline character
for ( ; *pszIt != 0 && *pszIt != '\n'; pszIt++ )
{
if (*pszIt == '^')
{
pszIt++;
int iColor = GetColor(*pszIt);
if (iColor < iNumConsoleColors && iColor >= 0)
{
if (0 >= iColor || 0 == g_pcl_show_colors->value)
{
rx = r;
gx = g;
bx = b;
}
else
{
rx = arrConsoleColors[iColor][0];
gx = arrConsoleColors[iColor][1];
bx = arrConsoleColors[iColor][2];
}
pszIt++;
if (*pszIt == 0 || *pszIt == '\n')
break;
}
else
pszIt--;
}
int next = xpos + gHUD.m_scrinfo.charWidths[ *pszIt ]; // variable-width fonts look cool
if ( next > iMaxX )
return xpos;
TextMessageDrawChar( xpos, ypos, *pszIt, rx, gx, bx );
xpos = next;
}
return xpos;
}
int AgDrawHudString(int xpos, int ypos, int iMaxX, char *szIt, int r, int g, int b )
{
int rx = r, gx = g, bx = b;
// draw the string until we hit the null character or a newline character
for ( ; *szIt != 0 && *szIt != '\n'; szIt++ )
{
if (*szIt == '^')
{
szIt++;
int iColor = GetColor(*szIt);
if (iColor < iNumConsoleColors && iColor >= 0)
{
if (0 >= iColor || 0 == g_pcl_show_colors->value)
{
rx = r;
gx = g;
bx = b;
}
else
{
rx = arrConsoleColors[iColor][0];
gx = arrConsoleColors[iColor][1];
bx = arrConsoleColors[iColor][2];
}
szIt++;
if (*szIt == 0 || *szIt == '\n')
break;
}
else
szIt--;
}
int next = xpos + gHUD.m_scrinfo.charWidths[ *szIt ]; // variable-width fonts look cool
if ( next > iMaxX )
return xpos;
TextMessageDrawChar( xpos, ypos, *szIt, rx, gx, bx );
xpos = next;
}
return xpos;
}
int AgDrawConsoleString( int x, int y, const char *string, float r, float g, float b )
{
if (0 == g_pcl_show_colors->value)
{
char* pszString = strdup(string);
AgStripColors((char*)pszString);
int iRet = gEngfuncs.pfnDrawConsoleString( x, y, (char*) pszString );
free(pszString);
return iRet;
}
char szText[512];
char* pText = szText;
*pText = '\0';
char* pszColor = (char*)string;
while (*pszColor)
{
if ('^' == *pszColor)
{
int iColor = GetColor(*(pszColor+1));
if (iColor < iNumConsoleColors && iColor >= 0)
//User wants a new color
{
//Draw first part with previous color.
*pText = '\0';
*pszColor = '\0';
int xPrev = gEngfuncs.pfnDrawConsoleString( x, y, (char*)szText);
*pszColor = '^';
pszColor++;
pszColor++;
float rx = r, gx = g, bx = b;
//Set the color.
if (iColor > 0)
{
rx = arrConsoleColors[iColor][0] / 255.0;
gx = arrConsoleColors[iColor][1] / 255.0;
bx = arrConsoleColors[iColor][2] / 255.0;
}
if (!(rx == 0 && gx == 0 && bx == 0))
gEngfuncs.pfnDrawSetTextColor(rx, gx, bx);
//Draw the rest of the string (that may contain new colors)
return AgDrawConsoleString( xPrev , y, pszColor, r, g, b);
}
}
*pText = *pszColor;
pText++;
pszColor++;
}
*pText = '\0';
if (!(r == 0 && g == 0 && b == 0))
gEngfuncs.pfnDrawSetTextColor(r, g, b);
return gEngfuncs.pfnDrawConsoleString( x, y, (char*) szText );
/*
int iLength = strlen(string);
char* pszColor = strchr(string,'^');
if (pszColor)
{
//Extract color.
++pszColor;
int iColor = GetColor(*pszColor);
++pszColor;
//Check if we got a valid color.
if (iColor < iNumConsoleColors && iColor >= 0)
{
char szTerm = *(pszColor-2);
*(pszColor-2) = '\0';
//Draw the first part with the previous color.
int xPrev = gEngfuncs.pfnDrawConsoleString( x, y, (char*)string);
*(pszColor-2) = szTerm;
float rx = r, gx = g, bx = b;
//Set the color.
if (iColor != 0)
{
rx = arrConsoleColors[iColor][0] / 255.0;
gx = arrConsoleColors[iColor][1] / 255.0;
bx = arrConsoleColors[iColor][2] / 255.0;
}
if (!(rx == 0 && gx == 0 && bx == 0))
gEngfuncs.pfnDrawSetTextColor(rx, gx, bx);
//Draw the rest of the string (that may contain new colors)
return AgDrawConsoleString( xPrev , y, pszColor, r, g, b);
}
}
if (!(r == 0 && g == 0 && b == 0))
gEngfuncs.pfnDrawSetTextColor(r, g, b);
return gEngfuncs.pfnDrawConsoleString( x, y, (char*) string );
*/
}
void AgStripColors(char* pszString)
{
char* pszIt = pszString;
while ('\0' != *pszIt)
{
if ('^' == *pszIt)
{
++pszIt;
if (*pszIt >= '0' && *pszIt <= '9')
{
--pszIt;
memmove(pszIt,pszIt+2,strlen(pszIt+2)+1);
}
}
else
++pszIt;
}
}
AgString AgMapname()
{
return gHUD.m_Location.m_szMap;
/*
AgString sMap;
sMap = gEngfuncs.pfnGetLevelName();
if (0 == sMap.size())
return sMap;
sMap = sMap.substr(sMap.find("/")+1);
sMap = sMap.substr(0,sMap.find("."));
return sMap;
*/
}
void AgTrim(AgString& sTrim)
{
if (0 == sTrim.length())
return;
int b = sTrim.find_first_not_of(" \t\r\n");
int e = sTrim.find_last_not_of(" \t\r\n");
if(b == -1) // No non-whitespaces
sTrim = "";
else
sTrim = string(sTrim, b, e - b + 1);
}
void AgLog(const char* pszLog)
{
char szFile[MAX_PATH];
sprintf(szFile,"%s/aglog.txt", AgGetDirectory());
FILE* pFile = fopen(szFile,"a+");
if (!pFile)
{
return;
}
time_t clock;
time( &clock );
fprintf(pFile,"%s : %s",pszLog,asctime(localtime(&clock)));
fflush(pFile);
fclose(pFile);
}
void AgDirList(const AgString& sDir, AgStringSet& setFiles)
{
#ifdef _WIN32
WIN32_FIND_DATA FindData;
char szSearchDirectory[_MAX_PATH];
sprintf(szSearchDirectory,"%s/*.*",sDir.c_str());
HANDLE hFind = FindFirstFile(szSearchDirectory, &FindData);
if (INVALID_HANDLE_VALUE != hFind)
{
do
{
if (!(FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
AgString sFile;
sFile = FindData.cFileName;
setFiles.insert(sFile);
}
}
while (FindNextFile(hFind, &FindData));
FindClose(hFind);
}
#else
DIR* pDirectory = opendir(sDir.c_str());
if (pDirectory)
{
struct dirent* pFile = NULL;
while (NULL != (pFile = readdir(pDirectory)))
{
AgString sFile;
sFile = pFile->d_name;
setFiles.insert(sFile);
}
closedir(pDirectory);
}
#endif
}
void AgToLower(AgString& strLower)
{
size_t i = 0;
while (i < strLower.length())
{
strLower[i] = tolower(strLower[i]);
i++;
}
}
const char* AgGetGame()
{
static char szGame[MAX_PATH];
strcpy(szGame, gEngfuncs.pfnGetGameDirectory());
char* pszGameDir = strrchr(szGame, '/');
if (pszGameDir)
return pszGameDir + 1;
return szGame;
}
const char* AgGetDirectory()
{
static char szGame[MAX_PATH];
strcpy(szGame, gEngfuncs.pfnGetGameDirectory());
char* pszGameDir = strrchr(szGame, '/');
if (pszGameDir)
{
return szGame;
}
else
{
static char szDirectory[MAX_PATH] = "";
if (strlen(szDirectory))
return szDirectory;
::GetCurrentDirectory(MAX_PATH, szDirectory);
strcat(szDirectory, "/");
strcat(szDirectory, szGame);
return szDirectory;
}
}
const char* AgGetDirectoryValve()
{
static char szDirectory[MAX_PATH] = "";
if (szDirectory[0] != '\0')
return szDirectory;
strcpy(szDirectory, AgGetDirectory());
int iStart = strlen(szDirectory)-1;
while ('/' != szDirectory[iStart])
{
szDirectory[iStart] = '\0';
iStart--;
}
szDirectory[iStart] = '\0';
return szDirectory;
}
//-- Martin Webrant