diff --git a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index 6123140f757..2d8a4bd339d 100644 --- a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -1463,7 +1463,19 @@ bool CStaticFunctionDefinitions::SetElementModel(CClientEntity& Entity, unsigned CLuaArguments Arguments; Arguments.PushNumber(usCurrentModel); Arguments.PushNumber(usModel); - Ped.CallEvent("onClientElementModelChange", Arguments, true); + bool bContinue = Ped.CallEvent("onClientElementModelChange", Arguments, true); + + // Check for another call to setElementModel + if (usModel != Ped.GetModel()) + return false; + + if (!bContinue) + { + // Change canceled + Ped.SetModel(usCurrentModel); + return false; + } + break; } case CCLIENTVEHICLE: @@ -1482,7 +1494,19 @@ bool CStaticFunctionDefinitions::SetElementModel(CClientEntity& Entity, unsigned CLuaArguments Arguments; Arguments.PushNumber(usCurrentModel); Arguments.PushNumber(usModel); - Vehicle.CallEvent("onClientElementModelChange", Arguments, true); + bool bContinue = Vehicle.CallEvent("onClientElementModelChange", Arguments, true); + + // Check for another call to setElementModel + if (usModel != Vehicle.GetModel()) + return false; + + if (!bContinue) + { + // Change canceled + Vehicle.SetModelBlocking(usCurrentModel, 255, 255); + return false; + } + break; } case CCLIENTOBJECT: @@ -1502,7 +1526,19 @@ bool CStaticFunctionDefinitions::SetElementModel(CClientEntity& Entity, unsigned CLuaArguments Arguments; Arguments.PushNumber(usCurrentModel); Arguments.PushNumber(usModel); - Object.CallEvent("onClientElementModelChange", Arguments, true); + bool bContinue = Object.CallEvent("onClientElementModelChange", Arguments, true); + + // Check for another call to setElementModel + if (usModel != Object.GetModel()) + return false; + + if (!bContinue) + { + // Change canceled + Object.SetModel(usCurrentModel); + return false; + } + break; } case CCLIENTPROJECTILE: diff --git a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index 73716819176..8a5cd530116 100644 --- a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -1699,11 +1699,22 @@ bool CStaticFunctionDefinitions::SetElementModel(CElement* pElement, unsigned sh return false; if (!CPlayerManager::IsValidPlayerModel(usModel)) return false; + unsigned short usOldModel = pPed->GetModel(); // Get the old model CLuaArguments Arguments; - Arguments.PushNumber(pPed->GetModel()); // Get the old model + Arguments.PushNumber(usOldModel); pPed->SetModel(usModel); // Set the new model Arguments.PushNumber(usModel); // Get the new model - pPed->CallEvent("onElementModelChange", Arguments); + bool bContinue = pPed->CallEvent("onElementModelChange", Arguments); + // Check for another call to setElementModel + if (usModel != pPed->GetModel()) + return false; + + if (!bContinue) + { + // Change canceled + pPed->SetModel(usOldModel); + return false; + } break; } case CElement::VEHICLE: @@ -1713,11 +1724,22 @@ bool CStaticFunctionDefinitions::SetElementModel(CElement* pElement, unsigned sh return false; if (!CVehicleManager::IsValidModel(usModel)) return false; + unsigned short usOldModel = pVehicle->GetModel(); // Get the old model CLuaArguments Arguments; - Arguments.PushNumber(pVehicle->GetModel()); // Get the old model + Arguments.PushNumber(usOldModel); pVehicle->SetModel(usModel); // Set the new model Arguments.PushNumber(usModel); // Get the new model - pVehicle->CallEvent("onElementModelChange", Arguments); + bool bContinue = pVehicle->CallEvent("onElementModelChange", Arguments); + // Check for another call to setElementModel + if (usModel != pVehicle->GetModel()) + return false; + + if (!bContinue) + { + // Change canceled + pVehicle->SetModel(usOldModel); + return false; + } // Check for any passengers above the max seat list unsigned char ucMaxPassengers = pVehicle->GetMaxPassengers(); @@ -1735,6 +1757,7 @@ bool CStaticFunctionDefinitions::SetElementModel(CElement* pElement, unsigned sh RemovePedFromVehicle(pPed); } } + break; } case CElement::OBJECT: @@ -1744,11 +1767,22 @@ bool CStaticFunctionDefinitions::SetElementModel(CElement* pElement, unsigned sh return false; if (!CObjectManager::IsValidModel(usModel)) return false; + unsigned short usOldModel = pObject->GetModel(); // Get the old model CLuaArguments Arguments; - Arguments.PushNumber(pObject->GetModel()); // Get the old model + Arguments.PushNumber(usOldModel); pObject->SetModel(usModel); // Set the new model Arguments.PushNumber(usModel); // Get the new model - pObject->CallEvent("onElementModelChange", Arguments); + bool bContinue = pObject->CallEvent("onElementModelChange", Arguments); + // Check for another call to setElementModel + if (usModel != pObject->GetModel()) + return false; + + if (!bContinue) + { + // Change canceled + pObject->SetModel(usOldModel); + return false; + } break; } default: