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.

140 lines
3.9 KiB

#include "agcrc32enforcer.h"
#include "hud.h"
#include "cl_util.h"
static char szDisconnect[] = "disconnect\n";
struct FILES
{
char* pszFile;
WORD32 w32CheckSum;
};
static FILES s_Files[] =
{
"gfx.wad", 1240178454,
// "halflife.wad", 1657905259,
"liquids.wad", 1067140096,
"models/player/hgrunt/hgrunt.mdl", 4178952236,
"models/player/scientist/scientist.mdl", 801952511,
"models/player/gordon/gordon.mdl", 1899521925,
"models/player/helmet/helmet.mdl", 413544432,
"models/player/robo/robo.mdl", 1066728661,
"models/player/barney/barney.mdl", 2342238586,
"models/player/recon/recon.mdl", 196824764,
"models/player/zombie/zombie.mdl", 2613106147,
"models/player/gman/gman.mdl", 363240166,
"models/player.mdl", 348061911,
"models/flag.mdl", 1312518787,
"models/p_crowbar.mdl", 2596481415,
"models/p_9mmhandgun.mdl", 459325257,
"models/p_9mmAR.mdl", 786579345,
"models/p_357.mdl", 96835772,
"models/p_gauss.mdl", 2413538144,
"models/p_rpg.mdl", 3201388383,
"models/p_crossbow.mdl", 1075131750,
"models/p_egon.mdl", 1795269724,
"models/p_tripmine.mdl", 2904825111,
"models/p_satchel.mdl", 1240685151,
"models/p_satchel_radio.mdl", 3737744643,
"models/p_shotgun.mdl", 2602382707,
"models/p_grenade.mdl", 3427694132,
"models/p_squeak.mdl", 472781321,
"models/p_hgun.mdl", 2327206545,
// "models/player/blue/blue.mdl", 3578029767,
// "models/player/red/red.mdl", 834545538,
};
WORD32 AgCRC32EnforceFileInternal(char* pszFile)
{
int iLength = 0;
void* pFile = gEngfuncs.COM_LoadFile(pszFile, 5, &iLength);
if (pFile)
{
WORD32 w32CheckSumFile = AgCRC32(pFile, iLength);
gEngfuncs.COM_FreeFile(pFile);
return w32CheckSumFile;
}
return -1;
}
bool AgCRC32EnforceFile(char* pszFile, WORD32 w32CheckSum)
{
if (w32CheckSum != AgCRC32EnforceFileInternal(pszFile))
{
char szMessage[256];
sprintf(szMessage,"File check enforced and %s is either damaged or changed. Run scandisk and reinstall file.\n", pszFile);
AgLog(szMessage);
ConsolePrint(szMessage);
ServerCmd( "say <AG Mod> Disconnected for using invalid file.\n" );
ClientCmd( szDisconnect );
return false;
}
return true;
}
bool AgCRC32EnforceFiles()
{
bool bPassed = true;
for (int i = 0; i < sizeof(s_Files)/sizeof(s_Files[0]); i++)
{
if (s_Files[i].w32CheckSum != AgCRC32EnforceFileInternal(s_Files[i].pszFile))
{
char szMessage[256];
sprintf(szMessage,"File check enforced and %s is either damaged or changed. Run scandisk and reinstall file.\n", s_Files[i].pszFile);
AgLog(szMessage);
ConsolePrint(szMessage);
#ifndef _DEBUG
bPassed = false;
#endif
}
}
/*
if (bPassed)
{
//Need special check for the 2 blue models...
#define OLD_BLUE 3578029767
#define NEW_BLUE 945015980
#define PLAYER 348061911
#define OLD_RED 834545538
#define NEW_RED 2809992869
#define PLAYER 348061911
WORD32 w32CheckSumBlue = AgCRC32EnforceFileInternal("models/player/blue/blue.mdl");
WORD32 w32CheckSumRed = AgCRC32EnforceFileInternal("models/player/red/red.mdl");
if (!(w32CheckSumBlue == OLD_BLUE || w32CheckSumBlue == NEW_BLUE || w32CheckSumBlue == PLAYER))
{
char szMessage[256];
sprintf(szMessage,"File check enforced and %s is either damaged or changed. Run scandisk and reinstall file.\n", "models/player/blue/blue.mdl");
AgLog(szMessage);
ConsolePrint(szMessage);
#ifndef _DEBUG
bPassed = false;
#endif
}
if (!(w32CheckSumRed == OLD_RED || w32CheckSumRed == NEW_RED || w32CheckSumRed == PLAYER))
{
char szMessage[256];
sprintf(szMessage,"File check enforced and %s is either damaged or changed. Run scandisk and reinstall file.\n", "models/player/red/red.mdl");
AgLog(szMessage);
ConsolePrint(szMessage);
#ifndef _DEBUG
bPassed = false;
#endif
}
}
*/
if (!bPassed)
{
ServerCmd( "say <AG Mod> Disconnected for using invalid file.\n" );
ClientCmd( szDisconnect );
return false;
}
return true;
}