Skip to content

Commit 3a376e4

Browse files
authored
Client freezes fix (#4207)
Fix a type of client freezes. Technical details are in PR main post (or https://i.imgur.com/66ATMHK.png)
1 parent 386014b commit 3a376e4

File tree

1 file changed

+55
-61
lines changed

1 file changed

+55
-61
lines changed

Client/game_sa/CWeatherSA.cpp

+55-61
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
#include "StdInc.h"
1313
#include "CWeatherSA.h"
1414

15+
static float WEATHER_FAKE_ACCUMULATOR;
16+
1517
unsigned char CWeatherSA::Get()
1618
{
1719
return *(unsigned char*)0xC81318; // CWeather::ForcedWeatherType
@@ -36,15 +38,8 @@ float CWeatherSA::GetAmountOfRain()
3638
void CWeatherSA::SetAmountOfRain(float fAmount)
3739
{
3840
// Patch all the places inside of CWeather::Update that would overwrite CWeather::Rain
39-
MemPut<BYTE>(0x72C686, 0xDD);
40-
MemPut<BYTE>(0x72C687, 0xD8);
41-
42-
MemSet((void*)0x72C688, 0x90, 4);
43-
44-
MemPut<BYTE>(0x72BC92, 0xDD);
45-
MemPut<BYTE>(0x72BC93, 0xD8);
46-
47-
MemSet((void*)0x72BC94, 0x90, 4);
41+
MemPut<DWORD>((LPVOID)(0x72C686 + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
42+
MemPut<DWORD>((LPVOID)(0x72BC92 + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
4843

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

@@ -55,12 +50,11 @@ void CWeatherSA::SetAmountOfRain(float fAmount)
5550
void CWeatherSA::ResetAmountOfRain()
5651
{
5752
BYTE originalMov[5] = {0xA3, 0x24, 0x13, 0xC8, 0x00}; // 0x72BC72
58-
BYTE originalFstp1[6] = {0xD9, 0x1D, 0x24, 0x13, 0xC8, 0x00}; // 0x72BC92
59-
BYTE originalFstp2[6] = {0xD9, 0x1D, 0x24, 0x13, 0xC8, 0x00}; // 0x72C686
60-
6153
MemCpy((LPVOID)0x72BC72, &originalMov, 5);
62-
MemCpy((LPVOID)0x72BC92, &originalFstp1, 6);
63-
MemCpy((LPVOID)0x72C686, &originalFstp2, 6);
54+
55+
static constexpr DWORD originalAddr = 0x00C81324;
56+
MemPut<DWORD>((LPVOID)(0x72C686 + 2), originalAddr);
57+
MemPut<DWORD>((LPVOID)(0x72BC92 + 2), originalAddr);
6458
}
6559

6660
float CWeatherSA::GetWetRoads() const
@@ -70,22 +64,22 @@ float CWeatherSA::GetWetRoads() const
7064

7165
bool CWeatherSA::SetWetRoads(float fAmount)
7266
{
73-
MemSet((LPVOID)(0x72BB9F + 2), 0x90, 3);
74-
MemSet((LPVOID)(0x72BBB7 + 2), 0x90, 3);
75-
MemSet((LPVOID)(0x72BBD0 + 1), 0x90, 3);
76-
MemSet((LPVOID)(0x72BBD7 + 2), 0x90, 3);
67+
MemPut<DWORD>((LPVOID)(0x72BB9F + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
68+
MemPut<DWORD>((LPVOID)(0x72BBB7 + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
69+
MemPut<DWORD>((LPVOID)(0x72BBD0 + 1), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
70+
MemPut<DWORD>((LPVOID)(0x72BBD7 + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
7771

7872
MemPutFast<float>(0xC81308, fAmount);
7973
return true;
8074
}
8175

8276
bool CWeatherSA::ResetWetRoads()
8377
{
84-
BYTE originalCodes[3] = {0x08, 0x13, 0xC8};
85-
MemCpy((LPVOID)(0x72BB9F + 2), &originalCodes, 3);
86-
MemCpy((LPVOID)(0x72BBB7 + 2), &originalCodes, 3);
87-
MemCpy((LPVOID)(0x72BBD0 + 1), &originalCodes, 3);
88-
MemCpy((LPVOID)(0x72BBD7 + 2), &originalCodes, 3);
78+
static constexpr DWORD originalAddr = 0x00C81308;
79+
MemPut<DWORD>((LPVOID)(0x72BB9F + 2), originalAddr);
80+
MemPut<DWORD>((LPVOID)(0x72BBB7 + 2), originalAddr);
81+
MemPut<DWORD>((LPVOID)(0x72BBD0 + 1), originalAddr);
82+
MemPut<DWORD>((LPVOID)(0x72BBD7 + 2), originalAddr);
8983
return true;
9084
}
9185

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

9791
bool CWeatherSA::SetFoggyness(float fAmount)
9892
{
99-
MemSet((LPVOID)(0x72BDF5 + 2), 0x90, 3);
100-
MemSet((LPVOID)(0x72BDDD + 2), 0x90, 3);
101-
MemSet((LPVOID)(0x72BE13 + 2), 0x90, 3);
93+
MemPut<DWORD>((LPVOID)(0x72BDF5 + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
94+
MemPut<DWORD>((LPVOID)(0x72BDDD + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
95+
MemPut<DWORD>((LPVOID)(0x72BE13 + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
10296

10397
MemPutFast<float>(0xC81300, fAmount);
10498
return true;
10599
}
106100

107101
bool CWeatherSA::ResetFoggyness()
108102
{
109-
BYTE originalCodes[3] = {0x00, 0x13, 0xC8};
110-
MemCpy((LPVOID)(0x72BDF5 + 2), &originalCodes, 3);
111-
MemCpy((LPVOID)(0x72BDDD + 2), &originalCodes, 3);
112-
MemCpy((LPVOID)(0x72BE13 + 2), &originalCodes, 3);
103+
static constexpr DWORD originalAddr = 0x00C81300;
104+
MemPut<DWORD>((LPVOID)(0x72BDF5 + 2), originalAddr);
105+
MemPut<DWORD>((LPVOID)(0x72BDDD + 2), originalAddr);
106+
MemPut<DWORD>((LPVOID)(0x72BE13 + 2), originalAddr);
113107
return true;
114108
}
115109

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

121115
bool CWeatherSA::SetFog(float fAmount)
122116
{
123-
MemSet((LPVOID)(0x72BE37 + 2), 0x90, 3);
124-
MemSet((LPVOID)(0x72BE1F + 2), 0x90, 3);
125-
MemSet((LPVOID)(0x72BE4F + 2), 0x90, 3);
117+
MemPut<DWORD>((LPVOID)(0x72BE37 + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
118+
MemPut<DWORD>((LPVOID)(0x72BE1F + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
119+
MemPut<DWORD>((LPVOID)(0x72BE4F + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
126120

127121
MemPutFast<float>(0xC812FC, fAmount);
128122
return true;
129123
}
130124

131125
bool CWeatherSA::ResetFog()
132126
{
133-
BYTE originalCodes[3] = {0xFC, 0x12, 0xC8};
134-
MemCpy((LPVOID)(0x72BE37 + 2), &originalCodes, 3);
135-
MemCpy((LPVOID)(0x72BE1F + 2), &originalCodes, 3);
136-
MemCpy((LPVOID)(0x72BE4F + 2), &originalCodes, 3);
127+
static constexpr DWORD originalAddr = 0x00C812FC;
128+
MemPut<DWORD>((LPVOID)(0x72BE37 + 2), originalAddr);
129+
MemPut<DWORD>((LPVOID)(0x72BE1F + 2), originalAddr);
130+
MemPut<DWORD>((LPVOID)(0x72BE4F + 2), originalAddr);
137131
return true;
138132
}
139133

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

145139
bool CWeatherSA::SetRainFog(float fAmount)
146140
{
147-
MemSet((LPVOID)(0x72ADD8 + 2), 0x90, 3);
148-
MemSet((LPVOID)(0x72ADE4 + 2), 0x90, 3);
141+
MemPut<DWORD>((LPVOID)(0x72ADD8 + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
142+
MemPut<DWORD>((LPVOID)(0x72ADE4 + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
149143

150144
MemPutFast<float>(0xC81410, fAmount);
151145
return true;
152146
}
153147

154148
bool CWeatherSA::ResetRainFog()
155149
{
156-
BYTE originalCodes[3] = {0x10, 0x14, 0xC8};
157-
MemCpy((LPVOID)(0x72ADD8 + 2), &originalCodes, 3);
158-
MemCpy((LPVOID)(0x72ADE4 + 2), &originalCodes, 3);
150+
static constexpr DWORD originalAddr = 0x00C81410;
151+
MemPut<DWORD>((LPVOID)(0x72ADD8 + 2), originalAddr);
152+
MemPut<DWORD>((LPVOID)(0x72ADE4 + 2), originalAddr);
159153
return true;
160154
}
161155

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

167161
bool CWeatherSA::SetWaterFog(float fAmount)
168162
{
169-
MemSet((LPVOID)(0x72C35C + 2), 0x90, 3);
170-
MemSet((LPVOID)(0x72C38E + 2), 0x90, 3);
171-
MemSet((LPVOID)(0x72C36F + 2), 0x90, 3);
163+
MemPut<DWORD>((LPVOID)(0x72C35C + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
164+
MemPut<DWORD>((LPVOID)(0x72C38E + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
165+
MemPut<DWORD>((LPVOID)(0x72C36F + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
172166

173167
MemPutFast<float>(0xC81338, fAmount);
174168
return true;
175169
}
176170

177171
bool CWeatherSA::ResetWaterFog()
178172
{
179-
BYTE originalCodes[3] = {0x38, 0x13, 0xC8};
180-
MemCpy((LPVOID)(0x72C35C + 2), &originalCodes, 3);
181-
MemCpy((LPVOID)(0x72C38E + 2), &originalCodes, 3);
182-
MemCpy((LPVOID)(0x72C36F + 2), &originalCodes, 3);
173+
static constexpr DWORD originalAddr = 0x00C81338;
174+
MemPut<DWORD>((LPVOID)(0x72C35C + 2), originalAddr);
175+
MemPut<DWORD>((LPVOID)(0x72C38E + 2), originalAddr);
176+
MemPut<DWORD>((LPVOID)(0x72C36F + 2), originalAddr);
183177
return true;
184178
}
185179

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

191185
bool CWeatherSA::SetSandstorm(float fAmount)
192186
{
193-
MemSet((LPVOID)(0x72A4B6 + 1), 0x90, 3);
194-
MemSet((LPVOID)(0x72BCEB + 1), 0x90, 3);
195-
MemSet((LPVOID)(0x72BD0B + 2), 0x90, 3);
187+
MemPut<DWORD>((LPVOID)(0x72A4B6 + 1), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
188+
MemPut<DWORD>((LPVOID)(0x72BCEB + 1), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
189+
MemPut<DWORD>((LPVOID)(0x72BD0B + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
196190

197191
MemPutFast<float>(0xC812F4, fAmount);
198192
return true;
199193
}
200194

201195
bool CWeatherSA::ResetSandstorm()
202196
{
203-
BYTE originalCodes[3] = {0xF4, 0x12, 0xC8};
204-
MemCpy((LPVOID)(0x72A4B6 + 1), &originalCodes, 3);
205-
MemCpy((LPVOID)(0x72BCEB + 1), &originalCodes, 3);
206-
MemCpy((LPVOID)(0x72BD0B + 2), &originalCodes, 3);
197+
static constexpr DWORD originalAddr = 0x00C812F4;
198+
MemPut<DWORD>((LPVOID)(0x72A4B6 + 1), originalAddr);
199+
MemPut<DWORD>((LPVOID)(0x72BCEB + 1), originalAddr);
200+
MemPut<DWORD>((LPVOID)(0x72BD0B + 2), originalAddr);
207201
return true;
208202
}
209203

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

215209
bool CWeatherSA::SetRainbow(float fAmount)
216210
{
217-
MemSet((LPVOID)(0x72BF51 + 2), 0x90, 3);
218-
MemSet((LPVOID)(0x72BF59 + 2), 0x90, 3);
211+
MemPut<DWORD>((LPVOID)(0x72BF51 + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
212+
MemPut<DWORD>((LPVOID)(0x72BF59 + 2), (DWORD)&WEATHER_FAKE_ACCUMULATOR);
219213

220214
MemPutFast<float>(0xC812E4, fAmount);
221215
return true;
222216
}
223217

224218
bool CWeatherSA::ResetRainbow()
225219
{
226-
BYTE originalCodes[3] = {0xE4, 0x12, 0xC8};
227-
MemCpy((LPVOID)(0x72BF51 + 2), &originalCodes, 3);
228-
MemCpy((LPVOID)(0x72BF59 + 2), &originalCodes, 3);
220+
static constexpr DWORD originalAddr = 0x00C812E4;
221+
MemPut<DWORD>((LPVOID)(0x72BF51 + 2), originalAddr);
222+
MemPut<DWORD>((LPVOID)(0x72BF59 + 2), originalAddr);
229223
return true;
230224
}

0 commit comments

Comments
 (0)