Skip to content

Commit ed30bfb

Browse files
committed
Don't restore default handling for server-sided vehicle changed their model on client-side
That commit won't break any backwards compatibility. Changing the model for vehicles created on the server side resets the handling only if the vehicle is created locally (client - resets client handling, server - resets server handling). The problem was caused by the client not checking if the vehicle belongs to them (if it is local) and resetting the handling without checking.
1 parent 3ecc287 commit ed30bfb

File tree

5 files changed

+28
-25
lines changed

5 files changed

+28
-25
lines changed

Client/mods/deathmatch/logic/CClientModel.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ void CClientModel::RestoreEntitiesUsingThisModel()
137137
unsigned short usParentID = g_pGame->GetModelInfo(m_iModelID)->GetParentID();
138138

139139
unloadModelsAndCallEvents(pVehicleManager->IterBegin(), pVehicleManager->IterEnd(), usParentID,
140-
[=](auto& element) { element.SetModelBlocking(usParentID, 255, 255); });
140+
[=](auto& element) { element.SetModelBlocking(usParentID, 255, 255, element.IsLocalEntity()); });
141141
break;
142142
}
143143
}

Client/mods/deathmatch/logic/CClientVehicle.cpp

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,7 +1006,7 @@ void CClientVehicle::SetTurretRotation(float fHorizontal, float fVertical)
10061006
m_fTurretVertical = fVertical;
10071007
}
10081008

1009-
void CClientVehicle::SetModelBlocking(unsigned short usModel, unsigned char ucVariant, unsigned char ucVariant2)
1009+
void CClientVehicle::SetModelBlocking(unsigned short usModel, unsigned char ucVariant, unsigned char ucVariant2, bool restoreHandling)
10101010
{
10111011
// Different vehicle ID than we have now?
10121012
if (m_usModel != usModel)
@@ -1068,32 +1068,35 @@ void CClientVehicle::SetModelBlocking(unsigned short usModel, unsigned char ucVa
10681068
m_ucMaxPassengers = CClientVehicleManager::GetMaxPassengerCount(usModel);
10691069

10701070
// Reset handling to fit the vehicle
1071-
ushort usHandlingModelID = usModel;
1072-
if (usHandlingModelID < 400 || usHandlingModelID > 611)
1073-
usHandlingModelID = m_pModelInfo->GetParentID();
1071+
if (restoreHandling)
1072+
{
1073+
ushort usHandlingModelID = usModel;
1074+
if (usHandlingModelID < 400 || usHandlingModelID > 611)
1075+
usHandlingModelID = m_pModelInfo->GetParentID();
10741076

1075-
m_pOriginalHandlingEntry = g_pGame->GetHandlingManager()->GetOriginalHandlingData((eVehicleTypes)usHandlingModelID);
1076-
m_pHandlingEntry->Assign(m_pOriginalHandlingEntry);
1077+
m_pOriginalHandlingEntry = g_pGame->GetHandlingManager()->GetOriginalHandlingData((eVehicleTypes)usHandlingModelID);
1078+
m_pHandlingEntry->Assign(m_pOriginalHandlingEntry);
10771079

1078-
m_pOriginalFlyingHandlingEntry = g_pGame->GetHandlingManager()->GetOriginalFlyingHandlingData((eVehicleTypes)usHandlingModelID);
1079-
m_pFlyingHandlingEntry->Assign(m_pOriginalFlyingHandlingEntry);
1080+
m_pOriginalFlyingHandlingEntry = g_pGame->GetHandlingManager()->GetOriginalFlyingHandlingData((eVehicleTypes)usHandlingModelID);
1081+
m_pFlyingHandlingEntry->Assign(m_pOriginalFlyingHandlingEntry);
10801082

1081-
m_pOriginalBoatHandlingEntry = g_pGame->GetHandlingManager()->GetOriginalBoatHandlingData((eVehicleTypes)usHandlingModelID);
1082-
if (m_pOriginalBoatHandlingEntry)
1083-
{
1084-
if (!m_pBoatHandlingEntry)
1085-
m_pBoatHandlingEntry = g_pGame->GetHandlingManager()->CreateBoatHandlingData();
1083+
m_pOriginalBoatHandlingEntry = g_pGame->GetHandlingManager()->GetOriginalBoatHandlingData((eVehicleTypes)usHandlingModelID);
1084+
if (m_pOriginalBoatHandlingEntry)
1085+
{
1086+
if (!m_pBoatHandlingEntry)
1087+
m_pBoatHandlingEntry = g_pGame->GetHandlingManager()->CreateBoatHandlingData();
10861088

1087-
m_pBoatHandlingEntry->Assign(m_pOriginalBoatHandlingEntry);
1088-
}
1089+
m_pBoatHandlingEntry->Assign(m_pOriginalBoatHandlingEntry);
1090+
}
10891091

1090-
m_pOriginalBikeHandlingEntry = g_pGame->GetHandlingManager()->GetOriginalBikeHandlingData((eVehicleTypes)usHandlingModelID);
1091-
if (m_pOriginalBikeHandlingEntry)
1092-
{
1093-
if (!m_pBikeHandlingEntry)
1094-
m_pBikeHandlingEntry = g_pGame->GetHandlingManager()->CreateBikeHandlingData();
1092+
m_pOriginalBikeHandlingEntry = g_pGame->GetHandlingManager()->GetOriginalBikeHandlingData((eVehicleTypes)usHandlingModelID);
1093+
if (m_pOriginalBikeHandlingEntry)
1094+
{
1095+
if (!m_pBikeHandlingEntry)
1096+
m_pBikeHandlingEntry = g_pGame->GetHandlingManager()->CreateBikeHandlingData();
10951097

1096-
m_pBikeHandlingEntry->Assign(m_pOriginalBikeHandlingEntry);
1098+
m_pBikeHandlingEntry->Assign(m_pOriginalBikeHandlingEntry);
1099+
}
10971100
}
10981101

10991102
ApplyHandling();

Client/mods/deathmatch/logic/CClientVehicle.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ class CClientVehicle : public CClientStreamElement
229229
void SetTurretRotation(float fHorizontal, float fVertical);
230230

231231
unsigned short GetModel() { return m_usModel; };
232-
void SetModelBlocking(unsigned short usModel, unsigned char ucVariant, unsigned char ucVariant2);
232+
void SetModelBlocking(unsigned short usModel, unsigned char ucVariant, unsigned char ucVariant2, bool restoreHandling);
233233

234234
unsigned char GetVariant() { return m_ucVariation; };
235235
unsigned char GetVariant2() { return m_ucVariation2; };

Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1504,7 +1504,7 @@ bool CStaticFunctionDefinitions::SetElementModel(CClientEntity& Entity, unsigned
15041504
if (!CClientVehicleManager::IsValidModel(usModel))
15051505
return false;
15061506

1507-
Vehicle.SetModelBlocking(usModel, 255, 255);
1507+
Vehicle.SetModelBlocking(usModel, 255, 255, Entity.IsLocalEntity());
15081508

15091509
CLuaArguments Arguments;
15101510
Arguments.PushNumber(usCurrentModel);

Client/mods/deathmatch/logic/rpc/CElementRPCs.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,7 @@ void CElementRPCs::SetElementModel(CClientEntity* pSource, NetBitStreamInterface
474474

475475
if (usCurrentModel != usModel)
476476
{
477-
pVehicle->SetModelBlocking(usModel, ucVariant, ucVariant2);
477+
pVehicle->SetModelBlocking(usModel, ucVariant, ucVariant2, true);
478478

479479
CLuaArguments Arguments;
480480
Arguments.PushNumber(usCurrentModel);

0 commit comments

Comments
 (0)