Skip to content

Commit

Permalink
v4.0.0.805
Browse files Browse the repository at this point in the history
+ Added options to define custom stock parts in the config files.
* Fixed dummy skin duplication in Binary step of the installer for the TPKs called TOOLKIT.
* Fixed custom heat level multipliers (FECooling) variables in the config files. (Now they are called Attachment0-9 instead of 1-10 like everything else.)
+ Added options to change the name and icons of the Custom Rims and Vinyl categories.
* Presitter now deletes the old preset data before saving new ones. It should fix the issue where the cars get parts from another one.
* Allowed randomization of Custom Gauges and their colors.
* Fixed an issue where the game crashes while loading the Customize Main screen when TestCareerCustomization is enabled.
  • Loading branch information
nlgxzef committed Jul 14, 2023
1 parent 1bb95cb commit 85a0127
Show file tree
Hide file tree
Showing 10 changed files with 557 additions and 60 deletions.
20 changes: 10 additions & 10 deletions CarCustomizeManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -341,43 +341,43 @@ void __fastcall CarCustomizeManager_UpdateHeatOnVehicle(DWORD* CarCustomizeManag
if (CustomFECoolingValue != 0.0f) FECareerRecord[3] = FECareerRecord[3] * CustomFECoolingValue * HeatAdjustMultiplier;
break;
case 52: // ATTACHMENT0
CustomFECoolingValue = GetCarFloatOption(CarINI, GeneralINI, "FECooling", "Attachment1", 0.0f);
CustomFECoolingValue = GetCarFloatOption(CarINI, GeneralINI, "FECooling", "Attachment0", 0.0f);
if (CustomFECoolingValue != 0.0f) FECareerRecord[3] = FECareerRecord[3] * CustomFECoolingValue * HeatAdjustMultiplier;
break;
case 53: // ATTACHMENT1
CustomFECoolingValue = GetCarFloatOption(CarINI, GeneralINI, "FECooling", "Attachment2", 0.0f);
CustomFECoolingValue = GetCarFloatOption(CarINI, GeneralINI, "FECooling", "Attachment1", 0.0f);
if (CustomFECoolingValue != 0.0f) FECareerRecord[3] = FECareerRecord[3] * CustomFECoolingValue * HeatAdjustMultiplier;
break;
case 54: // ATTACHMENT2
CustomFECoolingValue = GetCarFloatOption(CarINI, GeneralINI, "FECooling", "Attachment3", 0.0f);
CustomFECoolingValue = GetCarFloatOption(CarINI, GeneralINI, "FECooling", "Attachment2", 0.0f);
if (CustomFECoolingValue != 0.0f) FECareerRecord[3] = FECareerRecord[3] * CustomFECoolingValue * HeatAdjustMultiplier;
break;
case 55: // ATTACHMENT3
CustomFECoolingValue = GetCarFloatOption(CarINI, GeneralINI, "FECooling", "Attachment4", 0.0f);
CustomFECoolingValue = GetCarFloatOption(CarINI, GeneralINI, "FECooling", "Attachment3", 0.0f);
if (CustomFECoolingValue != 0.0f) FECareerRecord[3] = FECareerRecord[3] * CustomFECoolingValue * HeatAdjustMultiplier;
break;
case 56: // ATTACHMENT4
CustomFECoolingValue = GetCarFloatOption(CarINI, GeneralINI, "FECooling", "Attachment5", 0.0f);
CustomFECoolingValue = GetCarFloatOption(CarINI, GeneralINI, "FECooling", "Attachment4", 0.0f);
if (CustomFECoolingValue != 0.0f) FECareerRecord[3] = FECareerRecord[3] * CustomFECoolingValue * HeatAdjustMultiplier;
break;
case 57: // ATTACHMENT5
CustomFECoolingValue = GetCarFloatOption(CarINI, GeneralINI, "FECooling", "Attachment6", 0.0f);
CustomFECoolingValue = GetCarFloatOption(CarINI, GeneralINI, "FECooling", "Attachment5", 0.0f);
if (CustomFECoolingValue != 0.0f) FECareerRecord[3] = FECareerRecord[3] * CustomFECoolingValue * HeatAdjustMultiplier;
break;
case 58: // ATTACHMENT6
CustomFECoolingValue = GetCarFloatOption(CarINI, GeneralINI, "FECooling", "Attachment7", 0.0f);
CustomFECoolingValue = GetCarFloatOption(CarINI, GeneralINI, "FECooling", "Attachment6", 0.0f);
if (CustomFECoolingValue != 0.0f) FECareerRecord[3] = FECareerRecord[3] * CustomFECoolingValue * HeatAdjustMultiplier;
break;
case 59: // ATTACHMENT7
CustomFECoolingValue = GetCarFloatOption(CarINI, GeneralINI, "FECooling", "Attachment8", 0.0f);
CustomFECoolingValue = GetCarFloatOption(CarINI, GeneralINI, "FECooling", "Attachment7", 0.0f);
if (CustomFECoolingValue != 0.0f) FECareerRecord[3] = FECareerRecord[3] * CustomFECoolingValue * HeatAdjustMultiplier;
break;
case 60: // ATTACHMENT8
CustomFECoolingValue = GetCarFloatOption(CarINI, GeneralINI, "FECooling", "Attachment9", 0.0f);
CustomFECoolingValue = GetCarFloatOption(CarINI, GeneralINI, "FECooling", "Attachment8", 0.0f);
if (CustomFECoolingValue != 0.0f) FECareerRecord[3] = FECareerRecord[3] * CustomFECoolingValue * HeatAdjustMultiplier;
break;
case 61: // ATTACHMENT9
CustomFECoolingValue = GetCarFloatOption(CarINI, GeneralINI, "FECooling", "Attachment10", 0.0f);
CustomFECoolingValue = GetCarFloatOption(CarINI, GeneralINI, "FECooling", "Attachment9", 0.0f);
if (CustomFECoolingValue != 0.0f) FECareerRecord[3] = FECareerRecord[3] * CustomFECoolingValue * HeatAdjustMultiplier;
break;
case 43: // DRIVER
Expand Down
3 changes: 2 additions & 1 deletion CustomizePaint.h
Original file line number Diff line number Diff line change
Expand Up @@ -170,4 +170,5 @@ void __fastcall CustomizePaint_RefreshHeader(DWORD* CustomizePaint, void* EDX_Un
}
}
}
}
}

22 changes: 18 additions & 4 deletions CustomizeParts.h
Original file line number Diff line number Diff line change
Expand Up @@ -310,10 +310,24 @@ void __fastcall CustomizeParts_Setup(DWORD* _CustomizeParts, void* EDX_Unused)
CarSlotID = 77;

CIniReader VinylGroupsINI("UnlimiterData\\_VinylGroups.ini");
sprintf(VinylBrandID, "Group%d", MenuID - 0x402);
sprintf(VinylBrandIcon, VinylGroupsINI.ReadString(VinylBrandID, "Texture", GetDefaultVinylGroupTexture(MenuID - 0x402)));
sprintf(VinylBrandString, VinylGroupsINI.ReadString(VinylBrandID, "String", GetDefaultVinylGroupString(MenuID - 0x402)));
PartCategory = VinylGroupsINI.ReadInteger(VinylBrandID, "Index", GetDefaultVinylGroupIndex(MenuID - 0x402));
int i = MenuID - 0x402;

if (i == 0)
{
sprintf(VinylBrandID, "Group%d", 0);
sprintf(VinylBrandIcon, GetCarTextOption(CarINI, GeneralINI, "Icons", "VisualVinylsCustom", ""));
sprintf(VinylBrandString, GetCarTextOption(CarINI, GeneralINI, "Names", "VisualVinylsCustom", ""));

if (bStringHash(VinylBrandIcon) == -1) sprintf(VinylBrandIcon, VinylGroupsINI.ReadString(VinylBrandID, "Texture", GetDefaultVinylGroupTexture(0)));
if (bStringHash(VinylBrandString) == -1) sprintf(VinylBrandString, VinylGroupsINI.ReadString(VinylBrandID, "String", GetDefaultVinylGroupString(0)));
}
else
{
sprintf(VinylBrandID, "Group%d", i);
sprintf(VinylBrandIcon, VinylGroupsINI.ReadString(VinylBrandID, "Texture", GetDefaultVinylGroupTexture(i)));
sprintf(VinylBrandString, VinylGroupsINI.ReadString(VinylBrandID, "String", GetDefaultVinylGroupString(i)));
}
PartCategory = VinylGroupsINI.ReadInteger(VinylBrandID, "Index", GetDefaultVinylGroupIndex(i));

PartIconNormal = bStringHash(VinylBrandIcon);
_CustomizeParts[87] = bStringHash(VinylBrandString);
Expand Down
58 changes: 38 additions & 20 deletions CustomizeSub.h
Original file line number Diff line number Diff line change
Expand Up @@ -344,16 +344,25 @@ int __fastcall CustomizeSub_SetupRimBrands(DWORD* _CustomizeSub, void* EDX_Unuse
// Add the brands from ini
for (int i = 0; i <= RimBrandsCount; i++)
{
if (i == 0 && HasNoCustomRims) continue;
sprintf(RimBrandID, "Brand%d", i);
sprintf(RimBrandIcon, RimBrandsINI.ReadString(RimBrandID, "Texture", GetDefaultRimBrandTexture(i)));
sprintf(RimBrandString, RimBrandsINI.ReadString(RimBrandID, "String", GetDefaultRimBrandString(i)));
CustomizeCategoryScreen_AddCustomOption(
_CustomizeSub,
*(char**)g_pCustomizeRimsPkg,
bStringHash(RimBrandIcon),
bStringHash(RimBrandString),
0x702 + i);
if (i == 0)
{
if (HasNoCustomRims) continue;

sprintf(RimBrandID, "Brand%d", i);
sprintf(RimBrandIcon, GetCarTextOption(CarINI, GeneralINI, "Icons", "PartsRimsCustom", ""));
sprintf(RimBrandString, GetCarTextOption(CarINI, GeneralINI, "Names", "PartsRimsCustom", ""));

if (bStringHash(RimBrandIcon) == -1) sprintf(RimBrandIcon, RimBrandsINI.ReadString(RimBrandID, "Texture", GetDefaultRimBrandTexture(i)));
if (bStringHash(RimBrandString) == -1) sprintf(RimBrandString, RimBrandsINI.ReadString(RimBrandID, "String", GetDefaultRimBrandString(i)));
}
else
{
sprintf(RimBrandID, "Brand%d", i);
sprintf(RimBrandIcon, RimBrandsINI.ReadString(RimBrandID, "Texture", GetDefaultRimBrandTexture(i)));
sprintf(RimBrandString, RimBrandsINI.ReadString(RimBrandID, "String", GetDefaultRimBrandString(i)));
}

CustomizeCategoryScreen_AddCustomOption(_CustomizeSub, *(char**)g_pCustomizeRimsPkg, bStringHash(RimBrandIcon), bStringHash(RimBrandString), 0x702 + i);
}

ARimPart[0] = SelectablePart_vtable;
Expand Down Expand Up @@ -1127,16 +1136,25 @@ int __fastcall CustomizeSub_SetupVinylGroups(DWORD* _CustomizeSub, void* EDX_Unu
// Add the brands from ini
for (int i = 0; i <= VinylGroupsCount; i++)
{
if (i == 0 && HasNoCustomVinyls) continue;
sprintf(VinylBrandID, "Group%d", i);
sprintf(VinylBrandIcon, VinylGroupsINI.ReadString(VinylBrandID, "Texture", GetDefaultVinylGroupTexture(i)));
sprintf(VinylBrandString, VinylGroupsINI.ReadString(VinylBrandID, "String", GetDefaultVinylGroupString(i)));
CustomizeCategoryScreen_AddCustomOption(
_CustomizeSub,
*(char**)g_pCustomizePartsPkg,
bStringHash(VinylBrandIcon),
bStringHash(VinylBrandString),
0x402 + i);
if (i == 0)
{
if (HasNoCustomVinyls) continue;

sprintf(VinylBrandID, "Group%d", i);
sprintf(VinylBrandIcon, GetCarTextOption(CarINI, GeneralINI, "Icons", "VisualVinylsCustom", ""));
sprintf(VinylBrandString, GetCarTextOption(CarINI, GeneralINI, "Names", "VisualVinylsCustom", ""));

if (bStringHash(VinylBrandIcon) == -1) sprintf(VinylBrandIcon, VinylGroupsINI.ReadString(VinylBrandID, "Texture", GetDefaultVinylGroupTexture(i)));
if (bStringHash(VinylBrandString) == -1) sprintf(VinylBrandString, VinylGroupsINI.ReadString(VinylBrandID, "String", GetDefaultVinylGroupString(i)));
}
else
{
sprintf(VinylBrandID, "Group%d", i);
sprintf(VinylBrandIcon, VinylGroupsINI.ReadString(VinylBrandID, "Texture", GetDefaultVinylGroupTexture(i)));
sprintf(VinylBrandString, VinylGroupsINI.ReadString(VinylBrandID, "String", GetDefaultVinylGroupString(i)));
}

CustomizeCategoryScreen_AddCustomOption(_CustomizeSub, *(char**)g_pCustomizePartsPkg, bStringHash(VinylBrandIcon), bStringHash(VinylBrandString), 0x402 + i);
}

AVinylPart[0] = SelectablePart_vtable;
Expand Down
1 change: 1 addition & 0 deletions NFSMWUnlimiter.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ copy "$(TargetDir)*.pdb" "G:\Oyunlar\Need for Speed Most Wanted Dirty\scripts"
<ClInclude Include="Presitter.h" />
<ClInclude Include="PursuitBoard.h" />
<ClInclude Include="QuickRaceUnlocker.h" />
<ClInclude Include="RealmcIface_MemcardInterfaceImpl.h" />
<ClInclude Include="RideInfo.h" />
<ClInclude Include="resource.h" />
<ClInclude Include="SimConnection.h" />
Expand Down
47 changes: 47 additions & 0 deletions Presitter.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,39 @@

static injector::hook_back<HRESULT(WINAPI*)(HWND, int, HANDLE, DWORD, LPSTR)> hb_SHGetFolderPathA;

void Presitter_Delete(char const* ProfileName)
{
// Presitter: Delete preset data
char SaveProfilePath[MAX_PATH];
char PresetPath[MAX_PATH];
char CarTypeName[CarNameLength];
char PresetName[PresetNameLength];
int zero = 0;

hb_SHGetFolderPathA.fun(0, 0x8005, 0, 0, SaveProfilePath); // Get save profile folder
strcat(SaveProfilePath, "\\NFS Most Wanted");
strcat(SaveProfilePath, "\\");
strcat(SaveProfilePath, ProfileName);
strcat(SaveProfilePath, "\\Presets");

// Empty the directory
for (int i = 0; i < NumFECustomizationRecords; i++)
{
// Create file handle
sprintf(PresetPath, "%s\\%02d.bin", SaveProfilePath, i);
FILE* PresetFile = fopen(PresetPath, "rb");

if (PresetFile)
{
fclose(PresetFile); // Close the file
remove(PresetPath); // Delete the file we just opened
}
}

// Delete the directory
RemoveDirectoryA(SaveProfilePath);
}

void Presitter_Save(char const* ProfileName)
{
// Presittter: Dump preset data from customization records next to the game profile
Expand All @@ -34,6 +67,20 @@ void Presitter_Save(char const* ProfileName)
{
DWORD* FEDatabase = *(DWORD**)_FEDatabase;

// Delete all files first
for (int i = 0; i < NumFECustomizationRecords; i++)
{
// Create file handle
sprintf(PresetPath, "%s\\%02d.bin", SaveProfilePath, i);
FILE* PresetFile = fopen(PresetPath, "rb");

if (PresetFile)
{
fclose(PresetFile); // Close the file
remove(PresetPath); // Delete the file we just opened
}
}

for (int i = 0; i < NumFECarRecords; i++)
{
// Get car record
Expand Down
11 changes: 11 additions & 0 deletions RealmcIface_MemcardInterfaceImpl.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#pragma once

#include "stdio.h"
#include "InGameFunctions.h"

static injector::hook_back<unsigned int(__fastcall*)(DWORD*, void*, DWORD*)> hb_RealmcIface_MemcardInterfaceImpl_ProcessDelete;
unsigned int __fastcall RealmcIface_MemcardInterfaceImpl_ProcessDelete(DWORD* RealmcIface_MemcardInterfaceImpl, void* EDX_Unused, DWORD* Message)
{
//Presitter_Delete((char const*)RealmcIface_MemcardInterfaceImpl + 180);
return hb_RealmcIface_MemcardInterfaceImpl_ProcessDelete.fun(RealmcIface_MemcardInterfaceImpl, EDX_Unused, Message);
}

0 comments on commit 85a0127

Please sign in to comment.