Skip to content

Commit 5d44480

Browse files
committed
Added MergeZonesWithCities
1 parent 9e35ad6 commit 5d44480

4 files changed

Lines changed: 76 additions & 49 deletions

File tree

ModelVariations/LogUtil.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,13 @@ std::string hashFile(const char* filename)
6060
fseek(fp, 0, SEEK_SET);
6161

6262
BYTE* filebuf = (BYTE*)calloc((size_t)filesize, 1);
63+
if (filebuf == NULL)
64+
{
65+
fclose(fp);
66+
free(hash);
67+
return "";
68+
}
69+
6370
if ((int)fread(filebuf, 1, (size_t)filesize, fp) != filesize)
6471
{
6572
fclose(fp);

ModelVariations/ModelVariations.cpp

Lines changed: 57 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ std::map<unsigned short, std::array<std::vector<unsigned short>, 6>> vehGroupWan
6262

6363
std::set<unsigned short> parkedCars;
6464
std::set<unsigned short> vehUseOnlyGroups;
65+
std::set<unsigned short> pedMergeZones;
66+
std::set<unsigned short> vehMergeZones;
6567

6668
std::stack<CPed*> pedStack;
6769
std::stack<CVehicle*> vehStack;
@@ -198,11 +200,11 @@ void drugDealerFix(void)
198200
}
199201
}
200202

201-
void updateVariations(CZone *zInfo, CIniReader *iniPed, CIniReader *pIniVeh)
203+
void updateVariations(CZone* zInfo, CIniReader* iniPed)
202204
{
203205
//zInfo->m_szTextKey = BLUEB | zInfo->m_szLabel = BLUEB1
204206

205-
if (zInfo == NULL || iniPed == NULL || pIniVeh == NULL)
207+
if (zInfo == NULL || iniPed == NULL)
206208
return;
207209

208210
currentTown = (BYTE)CTheZones::m_CurrLevel;
@@ -228,54 +230,64 @@ void updateVariations(CZone *zInfo, CIniReader *iniPed, CIniReader *pIniVeh)
228230
currentTown = 15;
229231

230232

231-
for (int i = 0; i < 300; i++)
232-
{
233-
vectorUnion(pedVariations[i][4], pedVariations[i][currentTown], pedCurrentVariations[i]);
234-
CWanted* wanted = FindPlayerWanted(-1);
233+
CWanted* wanted = FindPlayerWanted(-1);
235234

236-
std::vector<unsigned short> vecPed = iniLineParser(std::to_string(i), zInfo->m_szLabel, iniPed);
237-
if (!vecPed.empty())
235+
for (auto& i : iniPed->data)
236+
if (i.first[0] >= '0' && i.first[0] <= '9')
238237
{
239-
std::vector<unsigned short> vec2;
240-
vectorUnion(pedCurrentVariations[i], vecPed, vec2);
241-
pedCurrentVariations[i] = vec2;
242-
}
238+
int modelid = std::stoi(i.first);
239+
if (modelid > 0 && modelid < 300)
240+
{
241+
vectorUnion(pedVariations[modelid][4], pedVariations[modelid][currentTown], pedCurrentVariations[modelid]);
243242

244-
vecPed = iniLineParser(std::to_string(i), currentInterior, iniPed);
245-
if (!vecPed.empty())
246-
{
247-
std::vector<unsigned short> vec2;
248-
vectorUnion(pedCurrentVariations[i], vecPed, vec2);
249-
pedCurrentVariations[i] = vec2;
250-
}
243+
std::vector<unsigned short> vec = iniLineParser(i.first, zInfo->m_szLabel, iniPed);
244+
if (!vec.empty())
245+
{
246+
if (pedMergeZones.find(modelid) != pedMergeZones.end())
247+
pedCurrentVariations[modelid] = vectorUnion(pedCurrentVariations[modelid], vec);
248+
else
249+
pedCurrentVariations[modelid] = vec;
250+
}
251251

252-
if (wanted)
253-
{
254-
unsigned int wantedLevel = (wanted->m_nWantedLevel > 0) ? (wanted->m_nWantedLevel - 1) : (wanted->m_nWantedLevel);
255-
if (!pedWantedVariations[i][wantedLevel].empty() && !pedCurrentVariations[i].empty())
256-
filterWantedVariations(pedCurrentVariations[i], pedWantedVariations[i][wantedLevel]);
252+
vec = iniLineParser(i.first, currentInterior, iniPed);
253+
if (!vec.empty())
254+
pedCurrentVariations[modelid] = vectorUnion(pedCurrentVariations[modelid], vec);
255+
256+
if (wanted)
257+
{
258+
unsigned int wantedLevel = (wanted->m_nWantedLevel > 0) ? (wanted->m_nWantedLevel - 1) : (wanted->m_nWantedLevel);
259+
if (!pedWantedVariations[modelid][wantedLevel].empty() && !pedCurrentVariations[modelid].empty())
260+
filterWantedVariations(pedCurrentVariations[modelid], pedWantedVariations[modelid][wantedLevel]);
261+
}
262+
}
257263
}
258264

259-
if (i < 212)
260-
{
261-
vectorUnion(vehVariations[i][4], vehVariations[i][currentTown], vehCurrentVariations[i]);
262265

263-
std::vector<unsigned short> vec = iniLineParser(std::to_string(i+400), zInfo->m_szLabel, pIniVeh);
264-
if (!vec.empty())
266+
for (auto& i : iniVeh.data)
267+
if (i.first[0] >= '0' && i.first[0] <= '9')
268+
{
269+
int modelid = std::stoi(i.first) - 400;
270+
if (modelid > 0 && modelid < 212)
265271
{
266-
std::vector<unsigned short> vec2;
267-
vectorUnion(vehCurrentVariations[i], vec, vec2);
268-
vehCurrentVariations[i] = vec2;
269-
}
272+
vectorUnion(vehVariations[modelid][4], vehVariations[modelid][currentTown], vehCurrentVariations[modelid]);
270273

271-
if (wanted)
272-
{
273-
unsigned int wantedLevel = (wanted->m_nWantedLevel > 0) ? (wanted->m_nWantedLevel - 1) : (wanted->m_nWantedLevel);
274-
if (!vehWantedVariations[i][wantedLevel].empty() && !vehCurrentVariations[i].empty())
275-
filterWantedVariations(vehCurrentVariations[i], vehWantedVariations[i][wantedLevel]);
274+
std::vector<unsigned short> vec = iniLineParser(i.first, zInfo->m_szLabel, &iniVeh);
275+
if (!vec.empty())
276+
{
277+
if (vehMergeZones.find(modelid) != vehMergeZones.end())
278+
vehCurrentVariations[modelid] = vectorUnion(vehCurrentVariations[modelid], vec);
279+
else
280+
vehCurrentVariations[modelid] = vec;
281+
}
282+
283+
if (wanted)
284+
{
285+
unsigned int wantedLevel = (wanted->m_nWantedLevel > 0) ? (wanted->m_nWantedLevel - 1) : (wanted->m_nWantedLevel);
286+
if (!vehWantedVariations[modelid][wantedLevel].empty() && !vehCurrentVariations[modelid].empty())
287+
filterWantedVariations(vehCurrentVariations[modelid], vehWantedVariations[modelid][wantedLevel]);
288+
}
276289
}
277290
}
278-
}
279291
}
280292

281293
void printCurrentVariations()
@@ -431,6 +443,9 @@ class ModelVariations {
431443
for (unsigned int k = 0; k < pedVariations[i][j].size(); k++)
432444
if (pedVariations[i][j][k] > 0 && pedVariations[i][j][k] < 32000 && pedVariations[i][j][k] != i)
433445
pedOriginalModels.insert({ pedVariations[i][j][k], i });
446+
447+
if (iniPed.ReadInteger(section, "MergeZonesWithCities", 0) == 1)
448+
pedMergeZones.insert(i);
434449
}
435450
}
436451

@@ -591,7 +606,7 @@ class ModelVariations {
591606
}
592607

593608
strncpy(lastInterior, currentInterior, 15);
594-
updateVariations(zInfo, &iniPed, &iniVeh);
609+
updateVariations(zInfo, &iniPed);
595610

596611
if (enableLog == 1)
597612
printCurrentVariations();
@@ -611,7 +626,7 @@ class ModelVariations {
611626
}
612627

613628
currentWanted = (int)wanted->m_nWantedLevel;
614-
updateVariations(zInfo, &iniPed, &iniVeh);
629+
updateVariations(zInfo, &iniPed);
615630

616631
if (enableLog == 1)
617632
printCurrentVariations();
@@ -631,7 +646,7 @@ class ModelVariations {
631646
}
632647

633648
strncpy(currentZone, zInfo->m_szLabel, 7);
634-
updateVariations(zInfo, &iniPed, &iniVeh);
649+
updateVariations(zInfo, &iniPed);
635650

636651
if (enableLog == 1)
637652
printCurrentVariations();

ModelVariations/Vehicles.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,8 @@ void readVehicleIni()
319319
LightPositions.insert({ modelid, {{ lightX, lightY, lightZ }, lightWidth} });
320320
}
321321

322+
if (iniVeh.ReadInteger(i.first, "MergeZonesWithCities", 0) == 1)
323+
vehMergeZones.insert(modelid);
322324

323325
BYTE numGroups = 0;
324326
for (int j = 0; j < 9; j++)
@@ -490,9 +492,10 @@ void __cdecl AddPoliceCarOccupantsHooked(CVehicle* a2, char a3)
490492
checkNumGroups(zoneGroups, it->second);
491493
if (vehGroups.find(a2->m_nModelIndex) != vehGroups.end())
492494
{
493-
std::vector<unsigned short> vec;
494-
vectorUnion(zoneGroups, vehGroups[a2->m_nModelIndex][currentTown], vec);
495-
zoneGroups = vec;
495+
if (vehMergeZones.find(a2->m_nModelIndex) != vehMergeZones.end())
496+
zoneGroups = vectorUnion(zoneGroups, vehGroups[a2->m_nModelIndex][currentTown]);
497+
else if (zoneGroups.empty())
498+
zoneGroups = vehGroups[a2->m_nModelIndex][currentTown];
496499
}
497500

498501
if (zoneGroups.empty() && !vehGroupWantedVariations[a2->m_nModelIndex][wantedLevel].empty())
@@ -800,9 +803,10 @@ void __cdecl SetUpDriverAndPassengersForVehicleHooked(CVehicle* car, int a3, int
800803
checkNumGroups(zoneGroups, it->second);
801804
if (vehGroups.find(car->m_nModelIndex) != vehGroups.end())
802805
{
803-
std::vector<unsigned short> vec;
804-
vectorUnion(zoneGroups, vehGroups[car->m_nModelIndex][currentTown], vec);
805-
zoneGroups = vec;
806+
if (vehMergeZones.find(car->m_nModelIndex) != vehMergeZones.end())
807+
zoneGroups = vectorUnion(zoneGroups, vehGroups[car->m_nModelIndex][currentTown]);
808+
else if (zoneGroups.empty())
809+
zoneGroups = vehGroups[car->m_nModelIndex][currentTown];
806810
}
807811

808812
if (zoneGroups.empty() && !vehGroupWantedVariations[car->m_nModelIndex][wantedLevel].empty())
@@ -1055,7 +1059,7 @@ void __fastcall DoSoftGroundResistanceHooked(CAutomobile* veh, void*, unsigned i
10551059
template <unsigned int address>
10561060
void __fastcall ProcessControlHooked(CAutomobile* veh)
10571061
{
1058-
if (veh && getVariationOriginalModel(veh->m_nModelIndex) == 407 || getVariationOriginalModel(veh->m_nModelIndex) == 601)
1062+
if (veh && (getVariationOriginalModel(veh->m_nModelIndex) == 407 || getVariationOriginalModel(veh->m_nModelIndex) == 601))
10591063
{
10601064
//EB 0A
10611065
*((BYTE*)0x6B1F4F) = 0xEB;

ModelVariations/Vehicles.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ extern int changeScriptedCars;
4545

4646
extern char currentZone[8];
4747
extern BYTE currentTown;
48+
extern std::set<unsigned short> vehMergeZones;
4849

4950
extern std::set<unsigned short> vehUseOnlyGroups;
5051

0 commit comments

Comments
 (0)