Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
116 changes: 55 additions & 61 deletions Client/game_sa/CWeatherSA.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
#include "StdInc.h"
#include "CWeatherSA.h"

static float WEATHER_FAKE_ACCUMULATOR;

unsigned char CWeatherSA::Get()
{
return *(unsigned char*)0xC81318; // CWeather::ForcedWeatherType
Expand All @@ -36,15 +38,8 @@ float CWeatherSA::GetAmountOfRain()
void CWeatherSA::SetAmountOfRain(float fAmount)
{
// Patch all the places inside of CWeather::Update that would overwrite CWeather::Rain
MemPut<BYTE>(0x72C686, 0xDD);
MemPut<BYTE>(0x72C687, 0xD8);

MemSet((void*)0x72C688, 0x90, 4);

MemPut<BYTE>(0x72BC92, 0xDD);
MemPut<BYTE>(0x72BC93, 0xD8);

MemSet((void*)0x72BC94, 0x90, 4);
MemPut<DWORD>((LPVOID)(0x72C686 + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
MemPut<DWORD>((LPVOID)(0x72BC92 + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);

MemSet((void*)0x72BC72, 0x90, 5);

Expand All @@ -55,12 +50,11 @@ void CWeatherSA::SetAmountOfRain(float fAmount)
void CWeatherSA::ResetAmountOfRain()
{
BYTE originalMov[5] = {0xA3, 0x24, 0x13, 0xC8, 0x00}; // 0x72BC72
BYTE originalFstp1[6] = {0xD9, 0x1D, 0x24, 0x13, 0xC8, 0x00}; // 0x72BC92
BYTE originalFstp2[6] = {0xD9, 0x1D, 0x24, 0x13, 0xC8, 0x00}; // 0x72C686

MemCpy((LPVOID)0x72BC72, &originalMov, 5);
MemCpy((LPVOID)0x72BC92, &originalFstp1, 6);
MemCpy((LPVOID)0x72C686, &originalFstp2, 6);

static constexpr DWORD originalAddr = 0x00C81324;
MemPut<DWORD>((LPVOID)(0x72C686 + 2), originalAddr);
MemPut<DWORD>((LPVOID)(0x72BC92 + 2), originalAddr);
}

float CWeatherSA::GetWetRoads() const
Expand All @@ -70,22 +64,22 @@ float CWeatherSA::GetWetRoads() const

bool CWeatherSA::SetWetRoads(float fAmount)
{
MemSet((LPVOID)(0x72BB9F + 2), 0x90, 3);
MemSet((LPVOID)(0x72BBB7 + 2), 0x90, 3);
MemSet((LPVOID)(0x72BBD0 + 1), 0x90, 3);
MemSet((LPVOID)(0x72BBD7 + 2), 0x90, 3);
MemPut<DWORD>((LPVOID)(0x72BB9F + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
MemPut<DWORD>((LPVOID)(0x72BBB7 + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
MemPut<DWORD>((LPVOID)(0x72BBD0 + 1), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
MemPut<DWORD>((LPVOID)(0x72BBD7 + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);

MemPutFast<float>(0xC81308, fAmount);
return true;
}

bool CWeatherSA::ResetWetRoads()
{
BYTE originalCodes[3] = {0x08, 0x13, 0xC8};
MemCpy((LPVOID)(0x72BB9F + 2), &originalCodes, 3);
MemCpy((LPVOID)(0x72BBB7 + 2), &originalCodes, 3);
MemCpy((LPVOID)(0x72BBD0 + 1), &originalCodes, 3);
MemCpy((LPVOID)(0x72BBD7 + 2), &originalCodes, 3);
static constexpr DWORD originalAddr = 0x00C81308;
MemPut<DWORD>((LPVOID)(0x72BB9F + 2), originalAddr);
MemPut<DWORD>((LPVOID)(0x72BBB7 + 2), originalAddr);
MemPut<DWORD>((LPVOID)(0x72BBD0 + 1), originalAddr);
MemPut<DWORD>((LPVOID)(0x72BBD7 + 2), originalAddr);
return true;
}

Expand All @@ -96,20 +90,20 @@ float CWeatherSA::GetFoggyness() const

bool CWeatherSA::SetFoggyness(float fAmount)
{
MemSet((LPVOID)(0x72BDF5 + 2), 0x90, 3);
MemSet((LPVOID)(0x72BDDD + 2), 0x90, 3);
MemSet((LPVOID)(0x72BE13 + 2), 0x90, 3);
MemPut<DWORD>((LPVOID)(0x72BDF5 + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
MemPut<DWORD>((LPVOID)(0x72BDDD + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
MemPut<DWORD>((LPVOID)(0x72BE13 + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);

MemPutFast<float>(0xC81300, fAmount);
return true;
}

bool CWeatherSA::ResetFoggyness()
{
BYTE originalCodes[3] = {0x00, 0x13, 0xC8};
MemCpy((LPVOID)(0x72BDF5 + 2), &originalCodes, 3);
MemCpy((LPVOID)(0x72BDDD + 2), &originalCodes, 3);
MemCpy((LPVOID)(0x72BE13 + 2), &originalCodes, 3);
static constexpr DWORD originalAddr = 0x00C81300;
MemPut<DWORD>((LPVOID)(0x72BDF5 + 2), originalAddr);
MemPut<DWORD>((LPVOID)(0x72BDDD + 2), originalAddr);
MemPut<DWORD>((LPVOID)(0x72BE13 + 2), originalAddr);
return true;
}

Expand All @@ -120,20 +114,20 @@ float CWeatherSA::GetFog() const

bool CWeatherSA::SetFog(float fAmount)
{
MemSet((LPVOID)(0x72BE37 + 2), 0x90, 3);
MemSet((LPVOID)(0x72BE1F + 2), 0x90, 3);
MemSet((LPVOID)(0x72BE4F + 2), 0x90, 3);
MemPut<DWORD>((LPVOID)(0x72BE37 + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
MemPut<DWORD>((LPVOID)(0x72BE1F + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
MemPut<DWORD>((LPVOID)(0x72BE4F + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);

MemPutFast<float>(0xC812FC, fAmount);
return true;
}

bool CWeatherSA::ResetFog()
{
BYTE originalCodes[3] = {0xFC, 0x12, 0xC8};
MemCpy((LPVOID)(0x72BE37 + 2), &originalCodes, 3);
MemCpy((LPVOID)(0x72BE1F + 2), &originalCodes, 3);
MemCpy((LPVOID)(0x72BE4F + 2), &originalCodes, 3);
static constexpr DWORD originalAddr = 0x00C812FC;
MemPut<DWORD>((LPVOID)(0x72BE37 + 2), originalAddr);
MemPut<DWORD>((LPVOID)(0x72BE1F + 2), originalAddr);
MemPut<DWORD>((LPVOID)(0x72BE4F + 2), originalAddr);
return true;
}

Expand All @@ -144,18 +138,18 @@ float CWeatherSA::GetRainFog() const

bool CWeatherSA::SetRainFog(float fAmount)
{
MemSet((LPVOID)(0x72ADD8 + 2), 0x90, 3);
MemSet((LPVOID)(0x72ADE4 + 2), 0x90, 3);
MemPut<DWORD>((LPVOID)(0x72ADD8 + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
MemPut<DWORD>((LPVOID)(0x72ADE4 + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);

MemPutFast<float>(0xC81410, fAmount);
return true;
}

bool CWeatherSA::ResetRainFog()
{
BYTE originalCodes[3] = {0x10, 0x14, 0xC8};
MemCpy((LPVOID)(0x72ADD8 + 2), &originalCodes, 3);
MemCpy((LPVOID)(0x72ADE4 + 2), &originalCodes, 3);
static constexpr DWORD originalAddr = 0x00C81410;
MemPut<DWORD>((LPVOID)(0x72ADD8 + 2), originalAddr);
MemPut<DWORD>((LPVOID)(0x72ADE4 + 2), originalAddr);
return true;
}

Expand All @@ -166,20 +160,20 @@ float CWeatherSA::GetWaterFog() const

bool CWeatherSA::SetWaterFog(float fAmount)
{
MemSet((LPVOID)(0x72C35C + 2), 0x90, 3);
MemSet((LPVOID)(0x72C38E + 2), 0x90, 3);
MemSet((LPVOID)(0x72C36F + 2), 0x90, 3);
MemPut<DWORD>((LPVOID)(0x72C35C + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
MemPut<DWORD>((LPVOID)(0x72C38E + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
MemPut<DWORD>((LPVOID)(0x72C36F + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);

MemPutFast<float>(0xC81338, fAmount);
return true;
}

bool CWeatherSA::ResetWaterFog()
{
BYTE originalCodes[3] = {0x38, 0x13, 0xC8};
MemCpy((LPVOID)(0x72C35C + 2), &originalCodes, 3);
MemCpy((LPVOID)(0x72C38E + 2), &originalCodes, 3);
MemCpy((LPVOID)(0x72C36F + 2), &originalCodes, 3);
static constexpr DWORD originalAddr = 0x00C81338;
MemPut<DWORD>((LPVOID)(0x72C35C + 2), originalAddr);
MemPut<DWORD>((LPVOID)(0x72C38E + 2), originalAddr);
MemPut<DWORD>((LPVOID)(0x72C36F + 2), originalAddr);
return true;
}

Expand All @@ -190,20 +184,20 @@ float CWeatherSA::GetSandstorm() const

bool CWeatherSA::SetSandstorm(float fAmount)
{
MemSet((LPVOID)(0x72A4B6 + 1), 0x90, 3);
MemSet((LPVOID)(0x72BCEB + 1), 0x90, 3);
MemSet((LPVOID)(0x72BD0B + 2), 0x90, 3);
MemPut<DWORD>((LPVOID)(0x72A4B6 + 1), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
MemPut<DWORD>((LPVOID)(0x72BCEB + 1), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
MemPut<DWORD>((LPVOID)(0x72BD0B + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);

MemPutFast<float>(0xC812F4, fAmount);
return true;
}

bool CWeatherSA::ResetSandstorm()
{
BYTE originalCodes[3] = {0xF4, 0x12, 0xC8};
MemCpy((LPVOID)(0x72A4B6 + 1), &originalCodes, 3);
MemCpy((LPVOID)(0x72BCEB + 1), &originalCodes, 3);
MemCpy((LPVOID)(0x72BD0B + 2), &originalCodes, 3);
static constexpr DWORD originalAddr = 0x00C812F4;
MemPut<DWORD>((LPVOID)(0x72A4B6 + 1), originalAddr);
MemPut<DWORD>((LPVOID)(0x72BCEB + 1), originalAddr);
MemPut<DWORD>((LPVOID)(0x72BD0B + 2), originalAddr);
return true;
}

Expand All @@ -214,17 +208,17 @@ float CWeatherSA::GetRainbow() const

bool CWeatherSA::SetRainbow(float fAmount)
{
MemSet((LPVOID)(0x72BF51 + 2), 0x90, 3);
MemSet((LPVOID)(0x72BF59 + 2), 0x90, 3);
MemPut<DWORD>((LPVOID)(0x72BF51 + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
MemPut<DWORD>((LPVOID)(0x72BF59 + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);

MemPutFast<float>(0xC812E4, fAmount);
return true;
}

bool CWeatherSA::ResetRainbow()
{
BYTE originalCodes[3] = {0xE4, 0x12, 0xC8};
MemCpy((LPVOID)(0x72BF51 + 2), &originalCodes, 3);
MemCpy((LPVOID)(0x72BF59 + 2), &originalCodes, 3);
static constexpr DWORD originalAddr = 0x00C812E4;
MemPut<DWORD>((LPVOID)(0x72BF51 + 2), originalAddr);
MemPut<DWORD>((LPVOID)(0x72BF59 + 2), originalAddr);
return true;
}
Loading