Skip to content
Open
Show file tree
Hide file tree
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
8 changes: 6 additions & 2 deletions Client/game_sa/CPoolsSA.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,12 @@ CVehicle* CPoolsSA::AddVehicle(CClientVehicle* pClientVehicle, std::uint16_t mod
// Note: Vehicles with custom DFFs (no embedded collision) are handled in CModelInfoSA::SetCustomModel
// where collision is reloaded after SetClump to restore pool-managed collision data

MemSetFast((void*)VAR_CVehicle_Variation1, variation, 1);
MemSetFast((void*)VAR_CVehicle_Variation2, variation2, 1);
// GTA SA's m_pExtra[] array only has 6 slots (indices 0-5). Passing a value > 5 would cause
// an out-of-bounds read in CCarCtrl::CreateCarForScript. Use 255 (no extra) for unsupported values.
const std::uint8_t safeVariation = (variation > 5 && variation != 255) ? 255 : variation;
const std::uint8_t safeVariation2 = (variation2 > 5 && variation2 != 255) ? 255 : variation2;
MemSetFast((void*)VAR_CVehicle_Variation1, safeVariation, 1);
MemSetFast((void*)VAR_CVehicle_Variation2, safeVariation2, 1);

// Valid model?
if (!CModelInfoSA::IsVehicleModel(model))
Expand Down
26 changes: 25 additions & 1 deletion Client/mods/deathmatch/logic/CClientVehicle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2940,10 +2940,34 @@ void CClientVehicle::Create()
// Make sure it's different
if ((*iter).second.m_vecOriginalComponentScale != (*iter).second.m_vecComponentScale)
{
// apple our new scale
// apply our new scale
SetComponentScale(strTemp, (*iter).second.m_vecComponentScale);
}
}
// Handle custom variation components. These are components that are named "extraX" where X is the variation number.
// We hide all of them by default and only show the ones that match the current variation.
if (strTemp.rfind("extra", 0) == 0)
{
unsigned int id = std::stoi(strTemp.substr(5));

auto& component = iter->second;

// Hide extras > 6 by default
if (id > 6)
{
component.m_bVisible = false;
}

// Show if matches variant
if (m_ucVariation > 5 && m_ucVariation < 254 && id == static_cast<unsigned int>(m_ucVariation) + 1)
{
component.m_bVisible = true;
}
if (m_ucVariation2 > 5 && m_ucVariation2 < 254 && id == static_cast<unsigned int>(m_ucVariation2) + 1)
{
component.m_bVisible = true;
}
}
// set our visibility
SetComponentVisible(strTemp, (*iter).second.m_bVisible);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2875,7 +2875,7 @@ bool CStaticFunctionDefinitions::IsTrainChainEngine(CClientVehicle& Vehicle, boo
CClientVehicle* CStaticFunctionDefinitions::CreateVehicle(CResource& Resource, unsigned short usModel, const CVector& vecPosition, const CVector& vecRotation,
const char* szRegPlate, unsigned char ucVariant, unsigned char ucVariant2)
{
if (CClientVehicleManager::IsValidModel(usModel) && (ucVariant <= 5 || ucVariant == 255) && (ucVariant2 <= 5 || ucVariant2 == 255))
if (CClientVehicleManager::IsValidModel(usModel) && (ucVariant <= 255) && (ucVariant2 <= 255))
{
unsigned char ucVariation = ucVariant;
unsigned char ucVariation2 = ucVariant2;
Expand Down
2 changes: 1 addition & 1 deletion Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4152,7 +4152,7 @@ bool CLuaVehicleDefs::SetVehicleVariant(CClientVehicle* pVehicle, std::optional<
if (ucVariant == 254 && ucVariant2 == 254)
CClientVehicleManager::GetRandomVariation(pVehicle->GetModel(), ucVariant, ucVariant2);

if ((ucVariant <= 5 || ucVariant == 255) && (ucVariant2 <= 5 || ucVariant2 == 255))
if ((ucVariant <= 255) && (ucVariant2 <= 255))
{
pVehicle->SetVariant(ucVariant, ucVariant2);
return true;
Expand Down
4 changes: 2 additions & 2 deletions Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5082,7 +5082,7 @@ CVehicle* CStaticFunctionDefinitions::CreateVehicle(CResource* pResource, unsign
if (ucVariant == 254 && ucVariant2 == 254)
CVehicleManager::GetRandomVariation(usModel, ucVariation, ucVariation2);

if (CVehicleManager::IsValidModel(usModel) && (ucVariation <= 5 || ucVariation == 255) && (ucVariation2 <= 5 || ucVariation2 == 255))
if (CVehicleManager::IsValidModel(usModel) && (ucVariation <= 255) && (ucVariation2 <= 255))
{
CVehicle* const pVehicle = m_pVehicleManager->Create(pResource->GetDynamicElementRoot(), usModel, ucVariation, ucVariation2);

Expand Down Expand Up @@ -5120,7 +5120,7 @@ bool CStaticFunctionDefinitions::SetVehicleVariant(CVehicle* pVehicle, unsigned
if (ucVariant == 254 && ucVariant2 == 254)
CVehicleManager::GetRandomVariation(pVehicle->GetModel(), ucVariation, ucVariation2);

if ((ucVariation <= 5 || ucVariation == 255) && (ucVariation2 <= 5 || ucVariation2 == 255))
if ((ucVariation <= 255) && (ucVariation2 <= 255))
{
pVehicle->SetVariants(ucVariation, ucVariation2);

Expand Down
Loading