#include <windows.h>
#include <stdio.h>

#define ARRLEN(a) (sizeof(a)/sizeof(a[0]))

#define BOUNDMULT 10.0f

// all elements are stored in sector grid and 1 sector consist of all entities inside 50 sq units game area
// 80 * 80 sectors are in the game
DWORD dwBoundMultiplierInstRef[] = {
0x40cc9d,0x40ccd1,0x40e526,0x40e565,0x40e5a4,
0x40e5e4,0x40ea5e,0x40ea89,0x40eaba,0x40eaff,
0x40eb40,0x40eb82,0x40f141,0x40f19b,0x40f20f,
0x40f243,0x40f5ef,0x40f623,0x423c97,0x423cd8,
0x423d19,0x423d5b,0x42563c,0x42567d,0x4256be,
0x425700,0x4258fe,0x42593f,0x425980,0x4259c2,
0x42e575,0x42e5b4,0x42e5f3,0x42e631,0x47fb72,
0x47fba5,0x47fbdb,0x47fc0e,0x487555,0x487580,
0x4875b3,0x4875f8,0x487633,0x48765e,0x487d55,
0x487d80,0x487db3,0x487df8,0x487e33,0x487e5e,
0x487ff5,0x488020,0x488053,0x488098,0x4880d3,
0x4880fe,0x4baf0b,0x4baf36,0x4baf69,0x4bafae,
0x4bafe9,0x4bb014,0x4bb335,0x4bb360,0x4bb393,
0x4bb3d8,0x4bb413,0x4bb43e,0x4bd9fb,0x4bda3c,
0x4bda7d,0x4bdabf,0x4c7088,0x4c70a6,0x4c70c8,
0x4c70e2,0x4c70fc,0x4c7116,0x4c730c,0x4c734d,
0x4c738f,0x4c73d0,0x4c8a69,0x4c8a87,0x4c8aa9,
0x4c8ac3,0x4c8add,0x4c8af7,0x4c8b13,0x4c8b2d,
0x4c8b44,0x4c8b5b,0x4c8b72,0x4c8b96,0x4c8bad,
0x4c8bc4,0x4c8bdb,0x4c8bf2,0x4c8c09,0x4c8e38,
0x4c8e6f,0x4c8eb1,0x4c8ef0,0x4d28fa,0x4d2952,
0x4d2a70,0x4d2ac4,0x4d2c4d,0x4d2ca5,0x4d3245,
0x4d3286,0x4d32c7,0x4d3302,0x4d3f59,0x4d3fa0,
0x4d3fe5,0x4d4029,0x4d5227,0x4d5282,0x4d53f7,
0x4d5452,0x4d558c,0x4d55e2,0x4d580f,0x4d5857,
0x4d5896,0x4d58d7,0x4d5ba1,0x4d5bea,0x4d5c2b,
0x4d5c6d,0x4d5fbf,0x4d6007,0x4d6046,0x4d6087,
0x4d6393,0x4d63d9,0x4d641c,0x4d6460,0x4d6793,
0x4d67d9,0x4d681c,0x4d6860,0x4d6bb3,0x4d6bf9,
0x4d6c3c,0x4d6c80,0x4d82ef,0x4d8339,0x4d837c,
0x4d83c0,0x4d8b38,0x4d8b93,0x4d9434,0x4d948e,
0x4d94de,0x4d9530,0x4d9973,0x4d999e,0x4d99d1,
0x4d9a04,0x4d9a56,0x4d9c17,0x4d9f2e,0x4d9f59,
0x4d9f8c,0x4d9fbf,0x4da011,0x4da1d7,0x4da5a2,
0x4da5de,0x4da618,0x4da65b,0x4daa02,0x4dab90,
0x4dae60,0x4daff4,0x4e9af4,0x4e9b40,0x4e9b85,
0x4e9bcb,0x4e9fd4,0x4ea020,0x4ea065,0x4ea0ab,
0x4f35c3,0x4f360f,0x4f3654,0x4f369a,0x50d527,
0x50d562,0x50d59f,0x50d5eb,0x51d215,0x51d266,
0x51d2b1,0x51d2fd,0x53cfb4,0x53cffa,0x53d03b,
0x53d07d,0x552f2d,0x552f6c,0x552fab,0x552fe4,
0x56c427,0x56c468,0x56c4a9,0x56c4eb,0x56cf8a,
0x56cfcb,0x56d00c,0x56d04e,0x587747,0x587786,
0x5877c5,0x587803,0x587b87,0x587bc6,0x587c05,
0x587c43,0x5a88db,0x5a890f,0x5a8943,0x5a8977,
0x5b51a0,0x5b51ea,0x5b5232,0x5b5279,0x5bc71e,
0x5bc749};

DWORD dwCZonesBounds[] = {
0x4DE312,0x4DE31C,0x4DE32E,0x4DE338,
0x4DE364,0x4DE36E,0x4DE388,0x4DE392,
0x4DE46D,0x4DE477,0x4DE489,0x4DE493};

void updateGameBounds(void)
{
DWORD dwVp;
VirtualProtect((void*)0x401000, 0x27CE00, PAGE_EXECUTE_READWRITE, &dwVp);
static float fBoundMultiplier = 0.0020000001f;

for(int i = 0; i < ARRLEN(dwBoundMultiplierInstRef); i++)
*(dwBoundMultiplierInstRef[i]) = (DWORD)&fBoundMultiplier;

for(int i = 0; i < ARRLEN(dwCZonesBounds); i++)
*((float*)dwCZonesBounds[i]) *= BOUNDMULT;

*(float*)0x69136C = 50.0f * BOUNDMULT;

// world borders
*(float*)0x69135c *= BOUNDMULT;
*(float*)0x691360 *= BOUNDMULT;
*(float*)0x691364 *= BOUNDMULT;
*(float*)0x691368 *= BOUNDMULT;

//corona boarders
*(float*)0x69592c *= BOUNDMULT;
*(float*)0x695930 *= BOUNDMULT;
*(float*)0x695934 *= BOUNDMULT;
*(float*)0x695938 *= BOUNDMULT;

//car borders
*(float*)0x69a890 = 15950.0f;
*(float*)0x69a894 = -23950.0f;
*(float*)0x69a898 = 19950.0f;
*(float*)0x69a8a0 = -19950.0f;

// boat borders ??
*(float*)0x69afec = 15900.0f;
*(float*)0x69aff0 = -23900.0f;
*(float*)0x69aff4 = 19900.0f;
*(float*)0x69aff8 = -19900.0f;

// police chopper borders ??
*(float*)0x69c064 *= BOUNDMULT;
*(float*)0x69c068 *= BOUNDMULT;
*(float*)0x69c06c *= BOUNDMULT;
*(float*)0x69c070 *= BOUNDMULT;

// bullet boundaries ??
*(float*)0x69cf4c *= BOUNDMULT;
*(float*)0x69cf50 *= BOUNDMULT;
*(float*)0x69cf54 *= BOUNDMULT;
*(float*)0x69cf58 *= BOUNDMULT;

// projectile borders, simply destroy the projectiles
*(float*)0x69d1ac = -23990.0f;
*(float*)0x69d1b0 = 15990.0f;
*(float*)0x69d1b4 = -19990.0f;
*(float*)0x69d1b8 = 19990.0f;

DWORD dwVp2;
VirtualProtect((void*)0x401000, 0x27CE00, dwVp, &dwVp2);
}

int main()
{
updateGameBounds();
}