#include "agcrc32enforcer.h" #include "hud.h" #include "cl_util.h" static const char *szDisconnect = "disconnect\n"; struct FILES { const char* pszFile; WORD32 w32CheckSum; }; static FILES s_Files[] = { "gfx.wad", 1240178454U, // "halflife.wad", 1657905259U, "liquids.wad", 1067140096U, "models/player/hgrunt/hgrunt.mdl", 4178952236U, "models/player/scientist/scientist.mdl", 801952511U, "models/player/gordon/gordon.mdl", 1899521925U, "models/player/helmet/helmet.mdl", 413544432U, "models/player/robo/robo.mdl", 1066728661U, "models/player/barney/barney.mdl", 2342238586U, "models/player/recon/recon.mdl", 196824764U, "models/player/zombie/zombie.mdl", 2613106147U, "models/player/gman/gman.mdl", 363240166U, "models/player.mdl", 348061911U, "models/flag.mdl", 1312518787U, "models/p_crowbar.mdl", 2596481415U, "models/p_9mmhandgun.mdl", 459325257U, "models/p_9mmAR.mdl", 786579345U, "models/p_357.mdl", 96835772U, "models/p_gauss.mdl", 2413538144U, "models/p_rpg.mdl", 3201388383U, "models/p_crossbow.mdl", 1075131750U, "models/p_egon.mdl", 1795269724U, "models/p_tripmine.mdl", 2904825111U, "models/p_satchel.mdl", 1240685151U, "models/p_satchel_radio.mdl", 3737744643U, "models/p_shotgun.mdl", 2602382707U, "models/p_grenade.mdl", 3427694132U, "models/p_squeak.mdl", 472781321U, "models/p_hgun.mdl", 2327206545U, // "models/player/blue/blue.mdl", 3578029767U, // "models/player/red/red.mdl", 834545538U, }; WORD32 AgCRC32EnforceFileInternal(const 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(const 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 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); #if !_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); #if !_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); #if !_DEBUG bPassed = false; #endif } } */ if (!bPassed) { ServerCmd( "say Disconnected for using invalid file.\n" ); ClientCmd( szDisconnect ); return false; } return true; }