Skip to content

Commit dfded09

Browse files
authored
Merge branch 'master' into bugfix/fire_task
2 parents 6d32672 + 2f8b758 commit dfded09

File tree

7 files changed

+143
-71
lines changed

7 files changed

+143
-71
lines changed

Client/game_sa/CWeatherSA.cpp

Lines changed: 55 additions & 61 deletions
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
}

Client/multiplayer_sa/CMultiplayerSA.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1596,6 +1596,7 @@ void CMultiplayerSA::InitHooks()
15961596

15971597
InitHooks_Postprocess();
15981598
InitHooks_Explosions();
1599+
InitHooks_Tasks();
15991600
}
16001601

16011602
// Used to store copied pointers for explosions in the FxSystem
@@ -6442,7 +6443,12 @@ void _declspec(naked) HOOK_CWorld_Remove_CPopulation_ConvertToDummyObject()
64426443
TIMING_CHECKPOINT("+RemovePointerToBuilding");
64436444
RemovePointerToBuilding();
64446445
StorePointerToBuilding();
6445-
RemoveObjectIfNeeded();
6446+
6447+
// pLODInterface contains a dummy object's pointer
6448+
// And as follows from CPopulation::ConvertToDummyObject this pointer can be nullptr
6449+
if (pLODInterface)
6450+
RemoveObjectIfNeeded();
6451+
64466452
TIMING_CHECKPOINT("-RemovePointerToBuilding");
64476453
_asm
64486454
{

Client/multiplayer_sa/CMultiplayerSA.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ class CMultiplayerSA : public CMultiplayer
8282
void InitHooks_Postprocess();
8383
void InitHooks_DeviceSelection();
8484
void InitHooks_Explosions();
85+
void InitHooks_Tasks();
8586
CRemoteDataStorage* CreateRemoteDataStorage();
8687
void DestroyRemoteDataStorage(CRemoteDataStorage* pData);
8788
void AddRemoteDataStorage(CPlayerPed* pPed, CRemoteDataStorage* pData);

Client/multiplayer_sa/CMultiplayerSA_Explosions.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,11 @@ static void _declspec(naked) HOOK_CWorld_TriggerExplosionSectorList()
4848
{
4949
// check entity->m_nScanCode == CWorld::ms_nCurrentScanCode
5050
mov ecx, dword ptr ds:[0xB7CD78]
51-
cmp [esi+2Ch], ecx
51+
cmp [esi+2Ch], cx
5252
jz skip
5353

5454
// set entity current scan code
55-
mov [esi+2Ch], ecx
55+
mov [esi+2Ch], cx
5656

5757
mov al, [esi+36h]
5858
and al, 7
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*****************************************************************************
2+
*
3+
* PROJECT: Multi Theft Auto
4+
* LICENSE: See LICENSE in the top level directory
5+
* FILE: multiplayer_sa/CMultiplayerSA_Tasks.cpp
6+
*
7+
* Multi Theft Auto is available from https://www.multitheftauto.com/
8+
*
9+
*****************************************************************************/
10+
#include "StdInc.h"
11+
12+
//////////////////////////////////////////////////////////////////////////////////////////
13+
//
14+
// CTaskSimplePlayerOnFoot::MakeAbortable
15+
//
16+
// If ignorefirestate is enabled, we need this hook to avoid tweaking the aiming animation
17+
// and the chainsaw turning off when entering fire
18+
//
19+
//////////////////////////////////////////////////////////////////////////////////////////
20+
static bool __IsIgnoreFireStateEnabled()
21+
{
22+
return pGameInterface->IsIgnoreFireStateEnabled();
23+
}
24+
25+
#define HOOKPOS_CTaskSimplePlayerOnFoot__MakeAbortable 0x68584D
26+
#define HOOKSIZE_CTaskSimplePlayerOnFoot__MakeAbortable 6
27+
static constexpr std::uintptr_t RETURN_CTaskSimplePlayerOnFoot__MakeAbortable = 0x68585F;
28+
static constexpr std::uintptr_t SKIP_CTaskSimplePlayerOnFoot__MakeAbortable = 0x685855;
29+
static void _declspec(naked) HOOK_CTaskSimplePlayerOnFoot__MakeAbortable()
30+
{
31+
_asm
32+
{
33+
// return false and keep task alive
34+
call dword ptr [eax+8]
35+
cmp eax, 3Dh
36+
jl skip
37+
38+
// if eventPriority == 66 (EventOnFire) && IsIgnoreFireStateEnabled()
39+
cmp eax, 42h
40+
jne continue_logic
41+
42+
call __IsIgnoreFireStateEnabled
43+
test al, al
44+
jz continue_logic
45+
46+
// return true but keep task alive
47+
pop edi
48+
pop esi
49+
pop ebx
50+
mov al, 1
51+
retn 0Ch
52+
53+
continue_logic:
54+
jmp RETURN_CTaskSimplePlayerOnFoot__MakeAbortable
55+
56+
skip:
57+
jmp SKIP_CTaskSimplePlayerOnFoot__MakeAbortable
58+
}
59+
}
60+
61+
//////////////////////////////////////////////////////////////////////////////////////////
62+
//
63+
// CMultiplayerSA::InitHooks_Tasks
64+
//
65+
// Setup hooks
66+
//
67+
//////////////////////////////////////////////////////////////////////////////////////////
68+
void CMultiplayerSA::InitHooks_Tasks()
69+
{
70+
EZHookInstall(CTaskSimplePlayerOnFoot__MakeAbortable);
71+
}

Shared/data/MTA San Andreas/MTA/locale/en_US/client.pot

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ msgid ""
88
msgstr ""
99
"Project-Id-Version: MTA San Andreas 1.x\n"
1010
"Report-Msgid-Bugs-To: \n"
11-
"POT-Creation-Date: 2025-05-04 20:25+0000\n"
11+
"POT-Creation-Date: 2025-05-07 10:31+0000\n"
1212
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1313
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1414
"Language-Team: LANGUAGE <[email protected]>\n"
@@ -162,7 +162,7 @@ msgstr ""
162162
#: Client/mods/deathmatch/logic/CClientGame.cpp:1378
163163
#: Client/mods/deathmatch/logic/CClientGame.cpp:1427
164164
#: Client/mods/deathmatch/logic/CClientGame.cpp:1439
165-
#: Client/game_sa/CGameSA.cpp:261 Client/game_sa/CGameSA.cpp:272
165+
#: Client/game_sa/CGameSA.cpp:262 Client/game_sa/CGameSA.cpp:273
166166
#: Shared/mods/deathmatch/logic/CLatentTransferManager.cpp:378
167167
#: Shared/sdk/SharedUtil.Misc.hpp:137
168168
msgid "Error"
@@ -266,7 +266,7 @@ msgstr ""
266266
#: Client/loader/MainFunctions.cpp:1219
267267
#: Client/core/ServerBrowser/CServerInfo.cpp:319
268268
#: Client/core/ServerBrowser/CServerBrowser.cpp:1363
269-
#: Client/game_sa/CGameSA.cpp:268
269+
#: Client/game_sa/CGameSA.cpp:269
270270
msgid "Information"
271271
msgstr ""
272272

@@ -3393,11 +3393,11 @@ msgstr[1] ""
33933393
msgid "Disconnected"
33943394
msgstr ""
33953395

3396-
#: Client/game_sa/CGameSA.cpp:255 Client/game_sa/CGameSA.cpp:266
3396+
#: Client/game_sa/CGameSA.cpp:256 Client/game_sa/CGameSA.cpp:267
33973397
msgid "Failed initialization game_sa"
33983398
msgstr ""
33993399

3400-
#: Client/game_sa/CGameSA.cpp:257
3400+
#: Client/game_sa/CGameSA.cpp:258
34013401
msgid "Memory allocations failed"
34023402
msgstr ""
34033403

0 commit comments

Comments
 (0)