void PatchMW2_WeaponCamos()
{
#if PRE_RELEASE_DEMO
	// before enabling: g_modelindex: overflow
	return;
#endif

	xModelTable.set_empty_key("");
	xMaterialTable.set_empty_key("");

	/*
	xModelLoadHook.initialize(xModelLoadHookLoc, XModelLoadHookFunc);
	xModelLoadHook.installHook();

	xModelLoadHook2.initialize(xModelLoadHook2Loc, XModelLoadHookFunc);
	xModelLoadHook2.installHook();

	xModelLoadHook3.initialize(xModelLoadHook3Loc, XModelLoadHookFunc);
	xModelLoadHook3.installHook();
	*/

	forEachXAssetHook.initialize(forEachXAssetHookLoc, ForEachXAssetHookStub);
	forEachXAssetHook.installHook();

	postWeaponLoadHook.initialize(postWeaponLoadHookLoc, PostWeaponLoadHookStub);
	postWeaponLoadHook.installHook();
}
void PatchMW2_SuicideMessages()
{
	srand((unsigned int)time(NULL));

	printObituaryHook.initialize(printObituaryHookLoc, PrintObituaryHookStub);
	printObituaryHook.installHook();
}
static void PatchMW2_ClientConsole_Toggle()
{
	clKeyEventToggleConsoleHook1.initialize((PBYTE)clKeyEventToggleConsoleHook1Loc);
	clKeyEventToggleConsoleHook1.installHook(Con_ToggleConsole, false);

	clKeyEventToggleConsoleHook2.initialize(5, (PBYTE)clKeyEventToggleConsoleHook2Loc);
	clKeyEventToggleConsoleHook2.installHook(Con_ToggleConsole, true, false);
}
void PatchMW2_UserAvatars()
{
	call(0x594295, SetPlayerCardInfoHook, PATCH_CALL);

	initGFXImages.initialize(initGFXImagesLoc, InitGFXImagesHook);
	initGFXImages.installHook();

	call(0x59449F, OnServerCommandStub, PATCH_JUMP);

	call(0x5910BC, DrawScoreboardRankStub, PATCH_CALL);
}
void PatchMW2_RemoteConsoleServer()
{
	// maximum size in NET_OutOfBandPrint
	*(DWORD*)0x4AEF08 = 0x1FFFC;
	*(DWORD*)0x4AEFA3 = 0x1FFFC;

	// client-side OOB handler
	*(int*)0x5AA715 = ((DWORD)SVC_RemoteCommandStub) - 0x5AA713 - 6;

	gsrCmpHook.initialize((PBYTE)gsrCmpHookLoc);
	gsrCmpHook.installHook(GsrCmpHookStub, false);
}
void PatchMW2_OOB()
{
	// maximum size in NET_OutOfBandPrint
	*(DWORD*)0x4AEF08 = 0x1FFFC;
	*(DWORD*)0x4AEFA3 = 0x1FFFC;

	// client-side OOB handler
	*(int*)0x5AA715 = ((DWORD)CL_DeployOOBStub) - 0x5AA713 - 6;

	gsrCmpHook.initialize(gsrCmpHookLoc, GsrCmpHookStub);
	gsrCmpHook.installHook();
}
Beispiel #7
0
void PatchMW2_Stats()
{
	writeStatsHook.initialize(writeStatsHookLoc, WriteStatsHookStub);
	writeStatsHook.installHook();

	loadOldStatsHook.initialize(loadOldStatsHookLoc, LoadOldStatsHookFunc);
	loadOldStatsHook.installHook();

	readStatsHook.initialize(readStatsHookLoc, ReadStatsHookStub);
	readStatsHook.installHook();

	// make statWriteNeeded ignored (kill stat saving?)
	//*(BYTE*)0x424BD0 = 0xEB;
}
Beispiel #8
0
void PatchMW2_OOB()
{
	if(version == 159)
	{
		// client-side OOB handler
		*(int*)0x65E454 = ((DWORD)CL_DeployOOBStub) - 0x65E452 - 6;
	}
	else
	{
		// client-side OOB handler
		*(int*)0x65BCE4 = ((DWORD)CL_DeployOOBStub) - 0x65BCE2 - 6;

		gsrCmpHookLoc = 0x65BCD8;
	}

	gsrCmpHook.initialize(gsrCmpHookLoc, GsrCmpHookStub);
	gsrCmpHook.installHook();
}
// patch entry point
void PatchMW2_Console()
{
	createConsoleHook.initialize(5, (PBYTE)HOOK_Sys_CreateConsole);
	createConsoleHook.installHook(Sys_CreateConsole, true, false);

	destroyConsoleHook.initialize(5, (PBYTE)HOOK_Sys_DestroyConsole);
	destroyConsoleHook.installHook(Sys_DestroyConsole, true, false);

	// TODO: get rid of weird casts
	sysPrintHook.initialize(5, (PBYTE)HOOK_Sys_Print);
	sysPrintHook.installHook((void (__cdecl *)(void))Sys_Print, true, false);

	sysErrorHook.initialize(5, (PBYTE)HOOK_Sys_Error);
	sysErrorHook.installHook((void (__cdecl *)(void))Sys_Error, true, false);

	consoleInputHook.initialize((PBYTE)HOOK_Sys_ConsoleInput);
	consoleInputHook.installHook((void (__cdecl *)(void))Sys_ConsoleInput, false);

	//PatchMW2_DebugAllocations();
}
Beispiel #10
0
void PatchMW2_Branding()
{
	cg_hideVersion = Dvar_RegisterBool("cg_hideVersion", false, DVAR_FLAG_SAVED, "Hide the version release branding text.");

	drawDevStuffHook.initialize(drawDevStuffHookLoc, DrawDevStuffHookStub);
	drawDevStuffHook.installHook();

	// createwindowexa on winconsole
	static DWORD wcCWEx = (DWORD)CreateWindowExAWrap_WC;
	static DWORD wcGEx = (DWORD)CreateWindowExAWrap_G;
	*(DWORD**)0x4289CA = &wcCWEx;
	*(DWORD**)0x5076AC = &wcGEx;

	// displayed build tag in UI code
	*(DWORD*)0x43F73B = (DWORD)"";

	// console '%s: %s> ' string
	*(DWORD*)0x5A44B4 = (DWORD)(VERSIONSTRING "> ");

	// console version string
	*(DWORD*)0x4B12BB = (DWORD)(VERSIONSTRING " (built " __DATE__ " " __TIME__ ")");

	// version string
	*(DWORD*)0x60BD56 = (DWORD)(VERSIONSTRING " (built " __DATE__ " " __TIME__ ")");

	// set fs_basegame to 'iw4lan' (will apply before fs_game, unlike the above line)
	*(DWORD*)0x6431D1 = (DWORD)"iw4lan";

	// increase font sizes for chat on higher resolutions
	static float float13 = 13.0f;
	static float float10 = 10.0f;
	*(float**)0x5814AE = &float13;
	*(float**)0x5814C8 = &float10;

#ifndef MATCHMAKING
	// use M2 playlists
	strcpy((char*)0x6EE7AC, "mp_playlists_m2");
	*(DWORD*)0x4D47FB = (DWORD)"mp_playlists_m2.ff";
#endif
}
void PatchMW2_Load()
{
	zoneLoadHook1.initialize(zoneLoadHook1Loc, ZoneLoadHook1Stub);
	zoneLoadHook1.installHook();

	zoneLoadHook2.initialize(zoneLoadHook2Loc, ZoneLoadHook2Stub);
	zoneLoadHook2.installHook();

	// zone folders -> remove absolute stuff
	zoneTestHook.initialize(zoneTestHookLoc, ZoneTestHookFunc);
	zoneTestHook.installHook();

	zoneSprintfHook.initialize(zoneSprintfHookLoc, ZoneSprintfHookFunc);
	zoneSprintfHook.installHook();
}
Beispiel #12
0
void PatchMW2_Load()
{
	// rawfile moddability
	rawFileHook1.initialize(rawFileHook1Loc, LoadModdableRawfileStub);
	rawFileHook1.installHook();

	rawFileHook2.initialize(rawFileHook2Loc, LoadModdableRawfileStub);
	rawFileHook2.installHook();

	rawFileHook3.initialize(rawFileHook3Loc, LoadModdableRawfileStub);
	rawFileHook3.installHook();

	rawFileHook4.initialize(rawFileHook4Loc, LoadModdableRawfileStub2);
	rawFileHook4.installHook();

	rawFileHook5.initialize(rawFileHook5Loc, LoadModdableRawfileStub);
	rawFileHook5.installHook();

	rawFileHook6.initialize(rawFileHook6Loc, LoadModdableRawfileStub);
	rawFileHook6.installHook();

	rawFileHook7.initialize(rawFileHook7Loc, LoadModdableRawfileStub);
	rawFileHook7.installHook();

	rawFileHook8.initialize(rawFileHook8Loc, LoadModdableRawfileStub);
	rawFileHook8.installHook();

	//rawFileHook9.initialize(rawFileHook9Loc, LoadModdableRawfileStub);
	//rawFileHook9.installHook();

	//rawFileHook10.initialize(rawFileHook10Loc, LoadModdableRawfileStub);
	//rawFileHook10.installHook();

	// fastfile loading hooks
	uiLoadHook1.initialize(uiLoadHook1Loc, UILoadHook1Stub);
	uiLoadHook1.installHook();

	ffLoadHook1.initialize(ffLoadHook1Loc, FFLoadHook1Stub);
	ffLoadHook1.installHook();

	ffLoadHook2.initialize(ffLoadHook2Loc, FFLoadHook2Stub);
	ffLoadHook2.installHook();

	zoneLoadHook1.initialize(zoneLoadHook1Loc, ZoneLoadHook1Stub);
	zoneLoadHook1.installHook();

	zoneLoadHook2.initialize(zoneLoadHook2Loc, ZoneLoadHook2Stub);
	zoneLoadHook2.installHook();

	getZoneRootHook.initialize(getZoneRootHookLoc, GetZoneRootHookFunc);
	getZoneRootHook.installHook();

	// disable 'ignoring asset' notices
	memset((void*)0x5BB902, 0x90, 5);

	// ignore 'no iwd files found in main'
	memset((void*)0x642A4B, 0x90, 5);

	if (strstr(GetCommandLine(), "fs_cdpath") != NULL)
	{
		// fs_basepath for 'players' -> fs_cdpath
		*(DWORD*)0x482408 = 0x63D0BB0;
	}

	// zone folders -> remove absolute stuff
	zoneTestHook.initialize(zoneTestHookLoc, ZoneTestHookFunc);
	zoneTestHook.installHook();

	zoneSprintfHook.initialize(zoneSprintfHookLoc, ZoneSprintfHookFunc);
	zoneSprintfHook.installHook();
}
void PatchMW2_MusicalTalent()
{
	findSoundAliasHook.initialize(findSoundAliasHookLoc, FindSoundAliasHookFunc);
	findSoundAliasHook.installHook();
}
void PatchMW2_Load()
{
	// rawfile moddability
	rawFileHook1.initialize((PBYTE)rawFileHook1Loc);
	rawFileHook1.installHook(LoadModdableRawfileStub, false);

	rawFileHook2.initialize((PBYTE)rawFileHook2Loc);
	rawFileHook2.installHook(LoadModdableRawfileStub, false);

	rawFileHook3.initialize((PBYTE)rawFileHook3Loc);
	rawFileHook3.installHook(LoadModdableRawfileStub, false);

	rawFileHook4.initialize((PBYTE)rawFileHook4Loc);
	rawFileHook4.installHook(LoadModdableRawfileStub2, false);

	// fastfile loading hooks
	uiLoadHook1.initialize((PBYTE)uiLoadHook1Loc);
	uiLoadHook1.installHook(UILoadHook1Stub, false);

	ffLoadHook1.initialize((PBYTE)ffLoadHook1Loc);
	ffLoadHook1.installHook(FFLoadHook1Stub, false);

	ffLoadHook2.initialize((PBYTE)ffLoadHook2Loc);
	ffLoadHook2.installHook(FFLoadHook2Stub, false);

	zoneLoadHook1.initialize((PBYTE)zoneLoadHook1Loc);
	zoneLoadHook1.installHook(ZoneLoadHook1Stub, false);

	zoneLoadHook2.initialize((PBYTE)zoneLoadHook2Loc);
	zoneLoadHook2.installHook(ZoneLoadHook2Stub, false);

	//ReallocateAssetPool(ASSET_TYPE_WEAPON, 1400);
	return; // TODO: change this for build 159, possibly use dynamic offsets from array start
	// reallocation of image assets
	*(DWORD*)0x799618 = 0xE00 * 2; // originally 0xE00
	*(DWORD*)0x7998D8 = (DWORD)malloc((0xE00 * 2) * 0x20);

	// reallocation of loaded_sound assets
	*(DWORD*)0x799624 = 0x546 * 2; // assetID 13
	*(DWORD*)0x7998E4 = (DWORD)malloc((0x546 * 2) * 0x2C);

	// reallocation of fx assets
	*(DWORD*)0x799668 = 600 * 2; // assetID 30
	*(DWORD*)0x799928 = (DWORD)malloc((600 * 2) * 32);

	// reallocation of localize assets
	*(DWORD*)0x79965C = 7000 * 2; // assetID 27
	*(DWORD*)0x79991C = (DWORD)malloc((7000 * 2) * 8);

	// reallocation of xanim assets
	*(DWORD*)0x7995F8 = 4096 * 2; // assetID 2
	*(DWORD*)0x7998B8 = (DWORD)malloc((4096 * 2) * 88);

	// reallocation of xmodel assets
	*(DWORD*)0x799600 = 1536 * 2; // assetID 4
	*(DWORD*)0x7998C0 = (DWORD)malloc((1536 * 2) * 304);

	// reallocation of physpreset assets
	*(DWORD*)0x7995F0 = 64 * 2; // assetID 0
	*(DWORD*)0x7998B0 = (DWORD)malloc((64 * 2) * 44);

	// set GameWorldSp pool to be a random 1024 byte buffer (GameWorldMp is just a name it seems, as such useless)
	DWORD gwSP = (DWORD)malloc(1024);

	*(DWORD*)0x7998F4 = gwSP;

	// set this bit of data loaded from the GameWorld to point to new offset in GameWorldSp (seems it got added in IW4, as such 'aww')
	//*(DWORD*)0x4137C7 = gwSP + 52;

	// try not to re/unload ui FFs
	*(BYTE*)0x60DAF0 = 0xC3;

	// allow loading of IWffu (unsigned) files
	*(BYTE*)0x414AB9 = 0xEB; // main function
	*(WORD*)0x50B3C7 = 0x9090; // DB_AuthLoad_InflateInit

	// temporary stuff to not load from maps/mp/, needs to be changed to check for mp_*
	//strcpy((char*)0x70D6CC, "maps/%s.d3dbsp");

	// ignore 'node_' entities as well
	ignoreEntityHook.initialize((PBYTE)ignoreEntityHookLoc);
	ignoreEntityHook.installHook((void(*)())IgnoreEntityHookFunc, false);

	// reallocate XAsset entries
	ReallocEntries();

	*(DWORD*)0x5BE4E0 = 789312;
}
void PatchMW2_InGameMenu()
{
	ingameMenuHook.initialize(ingameMenuHookLoc, IngameMenuHookStub);
	ingameMenuHook.installHook();
}
void PatchMW2_Extrasensory()
{
	entityWriteFieldsHook.initialize(entityWriteFieldsHookLoc, EntityWriteFieldsHookStub);
	entityWriteFieldsHook.installHook();
}
void PatchMW2_Branding()
{
	#ifdef IW4M_OLD_CODE
	// displayed build tag in UI code
	*(DWORD*)0x43F73B = (DWORD)VERSIONSTRING;

	// console '%s: %s> ' string
	*(DWORD*)0x5A44B4 = (DWORD)(VERSIONSTRING "> ");

	// console version string
	//*(DWORD*)0x4B12BB = (DWORD)(VERSIONSTRING " " BUILDHOST " (built " __DATE__ " " __TIME__ ")");

	// version string
	*(DWORD*)0x60BD56 = (DWORD)(VERSIONSTRING " (built " __DATE__ " " __TIME__ ")");

	// set fs_basegame to 'm2demo' (will apply before fs_game, unlike the above line)
	*(DWORD*)0x6431D1 = (DWORD)"m2demo";

	// increase font sizes for chat on higher resolutions
	static float float13 = 13.0f;
	static float float10 = 10.0f;
	*(float**)0x5814AE = &float13;
	*(float**)0x5814C8 = &float10;
	#endif

	#ifndef IW4M_OLD_CODE
	drawDevStuffHook.initialize(drawDevStuffHookLoc, DrawDevStuffHookStub);
	drawDevStuffHook.installHook();

	// createwindowexa on winconsole
	static DWORD wcCWEx = (DWORD)CreateWindowExAWrap_WC;
	static DWORD wcGEx = (DWORD)CreateWindowExAWrap_G;
	*(DWORD**)0x4289CA = &wcCWEx;
	*(DWORD**)0x5076AC = &wcGEx;

	// displayed build tag in UI code
	*(DWORD*)0x43F73B = (DWORD)VERSIONSTRING;

	// console '%s: %s> ' string
	*(DWORD*)0x5A44B4 = (DWORD)("W2 MP> ");

	// console version string
	*(DWORD*)0x4B12BB = (DWORD)(VERSIONSTRING " " BUILDHOST " (built " __DATE__ " " __TIME__ ")");

	// version string
	*(DWORD*)0x60BD56 = (DWORD)(VERSIONSTRING " (built " __DATE__ " " __TIME__ ")");

	// add 'm2demo' game folder
	//customSearchPathHook.initialize(5, (PBYTE)customSearchPathHookLoc);
	//customSearchPathHook.installHook(CustomSearchPathStuff, true, false);

	// set fs_basegame to 'm2demo' (will apply before fs_game, unlike the above line)
	*(DWORD*)0x6431D1 = (DWORD)"GameData/ShipFiles";

	// main to GameData/VendorPaks
	*(DWORD*)0x461A84 = (DWORD)"GameData/VendorPaks";
	*(DWORD*)0x4825A9 = (DWORD)"GameData/VendorPaks";
	*(DWORD*)0x48265A = (DWORD)"GameData/VendorPaks";
	*(DWORD*)0x4290C2 = (DWORD)"GameData/VendorPaks";

	// players -> UserData
	*(DWORD*)0x47DCB6 = (DWORD)"UserData";
	*(DWORD*)0x482410 = (DWORD)"UserData";
	*(DWORD*)0x60B1E2 = (DWORD)"UserData";
	*(DWORD*)0x5AE106 = (DWORD)"UserData";
	*(DWORD*)0x642E8F = (DWORD)"UserData";
	*(DWORD*)0x682F76 = (DWORD)"UserData";

	// devraw -> DevData/devraw, and similar
	*(DWORD*)0x4823D7 = (DWORD)"DevData/devraw";
	*(DWORD*)0x4823C4 = (DWORD)"DevData/devraw_shared";
	*(DWORD*)0x4823EA = (DWORD)"DevData/raw_shared";
	*(DWORD*)0x4823FD = (DWORD)"DevData/raw";

	// video file path
	*(DWORD*)0x51C2A4 = (DWORD)"%s\\GameData\\Videos\\%s.bik";

	// always play the intro video
	nop(0x60BECF, 2);

	*(DWORD*)0x60BED2 = (DWORD)"unskippablecinematic fdoLogo\n";

	// increase font sizes for chat on higher resolutions
	//*(BYTE*)0x5814AA = 0xEB;
	//*(BYTE*)0x5814C4 = 0xEB;
	static float float13 = 10.0f;
	static float float10 = 7.0f;

	*(float**)0x5814AE = &float13;
	*(float**)0x5814C8 = &float10;

	// safe areas; set to 1 (changing the dvar has no effect later on as the ScrPlace viewport is already made)
	static float float1 = 1.0f;
	*(float**)0x42E3A8 = &float1;
	*(float**)0x42E3D9 = &float1;

	// related to above: default cg_debugInfoCornerOffset to 0 0 instead of 0 -30
	static float float0 = 0.0f;

	*(float**)0x4F8FDB = &float0;

	// always assume a localized pak file is english
	*(BYTE*)0x4D11F3 = 0xEB;
	#endif

#ifdef PRE_RELEASE_DEMO
	// disable private parties if demo
	//*(DWORD*)0x40554E = (DWORD)CL_XStartPrivateMatch_f;
	//*(DWORD*)0x5A992E = (DWORD)CL_XStartPrivateMatch_f;
	//*(DWORD*)0x4058B9 = (DWORD)CL_XStartPrivateMatch_f; // xpartygo
	//*(DWORD*)0x4152AA = (DWORD)CL_XStartPrivateMatch_f; // map

	// use M2 playlists
	strcpy((char*)0x6EE7AC, "mp_playlists_m2");
	*(DWORD*)0x4D47FB = (DWORD)"mp_playlists_m2.ff";
#endif
}
// patches fs_game/IWD script support
void PatchMW2_Modding()
{
    // remove limit on IWD file loading
    //memset((void*)0x643B94, 0x90, 6);
    *(BYTE*)0x642BF3 = 0xEB;

    // remove convar write protection (why?)
    //*(BYTE*)0x647DD4 = 0xEB;

    // kill most of pure (unneeded in 159, 180+ messed it up)
    //memset((void*)0x45513D, 0x90, 5);
    //memset((void*)0x45515B, 0x90, 5);
    //memset((void*)0x45516C, 0x90, 5);

    //memset((void*)0x45518E, 0x90, 5);
    //memset((void*)0x45519F, 0x90, 5);

    //*(BYTE*)0x449089 = 0xEB;

    // other IWD things (pure?)
    //*(BYTE*)0x4C5E7B = 0xEB;
    //*(BYTE*)0x465107 = 0xEB;

    // default sv_pure to 0
    // TODO: implement client-side downloading/default to 1 for no-mods
    *(BYTE*)0x4D3A74 = 0;

    // disable sv_pure for .iwi/.wav/.mp3-only IWDs (for now we only want to get rid of scripts)
    /*strcpy((char*)0x6F1DBC, ".iwi");
    strcpy((char*)0x6E1B94, ".wav");
    strcpy((char*)0x71325C, ".mp3");*/

    // disable configstring checksum matching (it's unreliable at most)
    //*(BYTE*)0x4A75A7 = 0xEB; // SV_SpawnServer
    //*(BYTE*)0x5AC2CF = 0xEB; // CL_ParseGamestate
    *(BYTE*)0x5AC2C3 = 0xEB; // CL_ParseGamestate

    // steam stuff (steam authentication)
    *(DWORD*)0x414ACC = 0x90909090;
    *(WORD*)0x414AD0 = 0x9090;

    // hopefully allow alt-tab during game, used at least in alt-enter handling
    *(BYTE*)0x45ACE0 = 0xB0;
    *(BYTE*)0x45ACE1 = 0x01;
    *(BYTE*)0x45ACE2 = 0xC3;

    // set cg_scoreboardPingText to 1
    *(BYTE*)0x45888E = 1;

    // disable migration_dvarErrors
    *(BYTE*)0x60BDA7 = 0;

    // allow vid_restart even if 'connected'
    memset((void*)0x4CA1FA, 0x90, 6);

    // remove 'impure stats' checking
    *(BYTE*)0x4BB250 = 0x33;
    *(BYTE*)0x4BB251 = 0xC0;
    *(DWORD*)0x4BB252 = 0xC3909090;

    // remove fs_game profiles
    *(WORD*)0x4A5D74 = 0x9090;

    // fs_game crash fix removing some calls
    // (NOTE: CoD4 comparison shows this is related to LoadObj weaponDefs, might fix the crash we're having)
    *(BYTE*)0x452C1D = 0xEB;

    // remove fs_game check for moddable rawfiles - allows non-fs_game to modify rawfiles
    *(WORD*)0x61AB76 = 0x9090;

    // kill filesystem init default_mp.cfg check -- IW made it useless while moving .cfg files to fastfiles
    // and it makes fs_game crash

    // not nopping everything at once, there's cdecl stack cleanup in there
    memset((void*)0x461A9E, 0x90, 5);
    memset((void*)0x461AAA, 0x90, 5);
    memset((void*)0x461AB2, 0x90, 0xB1);

    // for some reason fs_game != '' makes the game load mp_defaultweapon, which does not exist in MW2 anymore as a real asset
    // kill the call and make it act like fs_game == ''
    // UPDATE 2010-09-12: this is why CoD4 had text weapon files, those are used with fs_game.
    // CLARIFY 2010-09-27: we don't have textual weapon files, as such we should load them from fastfile as usual
    // TODO: change this into a delay-loading hook for fastfile/loadobj (2011-05-20)
    *(BYTE*)0x4081FD = 0xEB;

    // exec fixing
    execIsFSHook.initialize(execIsFSHookLoc, ExecIsFSHookStub);
    execIsFSHook.installHook();

    // exec whitelist removal (YAYFINITY WARD)
    memset((void*)0x609685, 0x90, 5);
    *(WORD*)0x60968C = 0x9090;

    if (GAME_FLAG(GAME_FLAG_OFFLINE) || weWantOffline)
    {
        // allow joining 'developer 1' servers
        *(BYTE*)0x478BA2 = 0xEB;
    }

    PatchMW2_FFHash();
}
void PatchSP()
{
        // cg_fov unprotect
        *(DWORD*)0x4A3921 = DVAR_ARCHIVE;

        // small fix for infinite waiting for other players
        *(BYTE*)0x5026BC = 0x0;
        
        // function changes
        Com_Error = (Com_Error_t)0x651D90;
		Com_Printf = (Com_Printf_t)0x43BF30;

        // disable bandwidth testing / better match finding
        *(WORD*)0x693842 = 0x9090;
		
		// enable console (normally this check is !monkeytoy || blah; now it's only 'blah'
        *(BYTE*)0x58761C = 0xEB;

        // console toggling
        toggleConsoleHook1.initialize("", (PBYTE)toggleConsoleHook1Loc);
        toggleConsoleHook1.installHook((void(*)())Con_ToggleConsole, false);

        toggleConsoleHook2.initialize("", (PBYTE)toggleConsoleHook2Loc);
        toggleConsoleHook2.installHook((void(*)())Con_ToggleConsole, false);

        // player_sustainAmmo re-adding
        sustainAmmoHook.initialize("", 7, (PBYTE)sustainAmmoHookLoc);
        sustainAmmoHook.installHook(SustainAmmoHookFunc, true, false);
        
        // cg_drawVersion
        *(BYTE*)0x4A3D46 = 1; // default
        *(BYTE*)0x4A3D44 = 0x50; // flags
		
        // y 450, x 10
        *(DWORD*)0x4A3D7A = (DWORD)&drawVersionX;
        *(DWORD*)0x4A3DAF = (DWORD)&drawVersionY;

        *(DWORD*)0x9A33FC = (DWORD)customTimeBeginPeriod;

        // set port to 28960
        *(DWORD*)0x52E1D5 = 28960;

        // disable UPnP
        //*(WORD*)0x973C6B = 0x9090;

        // remove the windows hook setting function
        //*(BYTE*)0x8683D0 = 0xC3;

        // con stuff
        *(WORD*)0x79E6E5 = 0x9090; // dvar set 1

        *(BYTE*)0x5119B0 = 0xC3;   // dvar reset flag
        *(WORD*)0x4A87EB = 0x9090; // dvar exec
        *(WORD*)0x829CBE = 0x9090; // cmd  exec
        *(WORD*)0x5F5D4E = 0x9090; // dvar enum
        *(WORD*)0x610A94 = 0x9090; // cmd  enum

        windowedWindowStyleHook.initialize("aaaaa", 5, (PBYTE)windowedWindowStyleHookLoc);
        windowedWindowStyleHook.installHook(WindowedWindowStyleHookStub, false, false);

        // gethostbyname
        *(DWORD*)0x9A3470 = (DWORD)custom_gethostbyname;

        // small fix for infinite waiting for other players
        *(BYTE*)0x5026BC = 0x03;
}